update chromium-stable-with-bazel from chromium-stable branch
diff --git a/BUILD b/BUILD
index 65e0cdc..1ec2bdf 100644
--- a/BUILD
+++ b/BUILD
@@ -18,10 +18,11 @@
     "crypto_headers",
     "crypto_internal_headers",
     "crypto_sources",
+    "crypto_sources_apple_aarch64",
+    "crypto_sources_apple_x86_64",
     "crypto_sources_linux_aarch64",
     "crypto_sources_linux_ppc64le",
     "crypto_sources_linux_x86_64",
-    "crypto_sources_mac_x86_64",
     "fips_fragments",
     "ssl_headers",
     "ssl_internal_headers",
@@ -36,52 +37,42 @@
 
 config_setting(
     name = "linux_aarch64",
-    values = {"cpu": "aarch64"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:aarch64",
+    ],
 )
 
 config_setting(
     name = "linux_x86_64",
-    values = {"cpu": "k8"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:x86_64",
+    ],
 )
 
 config_setting(
     name = "linux_ppc64le",
-    values = {"cpu": "ppc"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:ppc",
+    ],
 )
 
 config_setting(
-    name = "mac_x86_64",
-    values = {"cpu": "darwin"},
+    name = "macos_aarch64",
+    constraint_values = [
+        "@platforms//os:macos",
+        "@platforms//cpu:aarch64",
+    ],
 )
 
 config_setting(
-    name = "windows_x86_64",
-    values = {"cpu": "x64_windows"},
-)
-
-config_setting(
-    name = "android_legacy",
-    values = {"crosstool_top": "//external:android/crosstool"},
-)
-
-config_setting(
-    name = "android_stlport",
-    values = {"crosstool_top": "@androidndk//:toolchain-stlport"},
-)
-
-config_setting(
-    name = "android_libcpp",
-    values = {"crosstool_top": "@androidndk//:toolchain-libcpp"},
-)
-
-config_setting(
-    name = "android_gnu_libstdcpp",
-    values = {"crosstool_top": "@androidndk//:toolchain-gnu-libstdcpp"},
-)
-
-config_setting(
-    name = "android_default",
-    values = {"crosstool_top": "@androidndk//:default_crosstool"},
+    name = "macos_x86_64",
+    constraint_values = [
+        "@platforms//os:macos",
+        "@platforms//cpu:x86_64",
+    ],
 )
 
 posix_copts = [
@@ -89,9 +80,6 @@
     # ensure that binaries can be built with non-executable stack.
     "-Wa,--noexecstack",
 
-    # This is needed on Linux systems (at least) to get rwlock in pthread.
-    "-D_XOPEN_SOURCE=700",
-
     # This list of warnings should match those in the top-level CMakeLists.txt.
     "-Wall",
     "-Werror",
@@ -101,32 +89,39 @@
     "-Wwrite-strings",
     "-Wshadow",
     "-fno-common",
+]
 
-    # Modern build environments should be able to set this to use atomic
-    # operations for reference counting rather than locks. However, it's
-    # known not to work on some Android builds.
-    # "-DOPENSSL_C11_ATOMIC",
+linux_copts = posix_copts + [
+    # This is needed on Linux systems (at least) to get rwlock in pthread, but
+    # it should not be set on Apple platforms, where it instead disables APIs
+    # we use. See compat(5) and sys/cdefs.h.
+    "-D_XOPEN_SOURCE=700",
 ]
 
 boringssl_copts = select({
-    ":linux_aarch64": posix_copts,
-    ":linux_ppc64le": posix_copts,
-    ":linux_x86_64": posix_copts,
-    ":mac_x86_64": posix_copts,
-    ":windows_x86_64": [
-        "-DWIN32_LEAN_AND_MEAN",
-        "-DOPENSSL_NO_ASM",
-    ],
-    "//conditions:default": ["-DOPENSSL_NO_ASM"],
+    "@platforms//os:linux": linux_copts,
+    "@platforms//os:macos": posix_copts,
+    "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"],
+    "//conditions:default": [],
 })
 
+# These selects must be kept in sync.
 crypto_sources_asm = select({
     ":linux_aarch64": crypto_sources_linux_aarch64,
     ":linux_ppc64le": crypto_sources_linux_ppc64le,
     ":linux_x86_64": crypto_sources_linux_x86_64,
-    ":mac_x86_64": crypto_sources_mac_x86_64,
+    ":macos_aarch64": crypto_sources_apple_aarch64,
+    ":macos_x86_64": crypto_sources_apple_x86_64,
     "//conditions:default": [],
 })
+boringssl_copts += select({
+    ":linux_aarch64": [],
+    ":linux_ppc64le": [],
+    ":linux_x86_64": [],
+    ":macos_aarch64": [],
+    ":macos_x86_64": [],
+    "//conditions:default": ["-DOPENSSL_NO_ASM"],
+})
 
 # For C targets only (not C++), compile with C11 support.
 posix_copts_c11 = [
@@ -137,24 +132,20 @@
 ]
 
 boringssl_copts_c11 = boringssl_copts + select({
-    ":linux_aarch64": posix_copts_c11,
-    ":linux_ppc64le": posix_copts_c11,
-    ":linux_x86_64": posix_copts_c11,
-    ":mac_x86_64": posix_copts_c11,
+    "@platforms//os:linux": posix_copts_c11,
+    "@platforms//os:macos": posix_copts_c11,
     "//conditions:default": [],
 })
 
-# For C++ targets only (not C), compile with C++11 support.
+# For C++ targets only (not C), compile with C++14 support.
 posix_copts_cxx = [
-    "-std=c++11",
+    "-std=c++14",
     "-Wmissing-declarations",
 ]
 
 boringssl_copts_cxx = boringssl_copts + select({
-    ":linux_aarch64": posix_copts_cxx,
-    ":linux_ppc64le": posix_copts_cxx,
-    ":linux_x86_64": posix_copts_cxx,
-    ":mac_x86_64": posix_copts_cxx,
+    "@platforms//os:linux": posix_copts_cxx,
+    "@platforms//os:macos": posix_copts_cxx,
     "//conditions:default": [],
 })
 
@@ -167,13 +158,9 @@
     linkopts = select({
         # Android supports pthreads, but does not provide a libpthread
         # to link against.
-        ":android_legacy": [],
-        ":android_stlport": [],
-        ":android_libcpp": [],
-        ":android_gnu_libstdcpp": [],
-        ":android_default": [],
-        ":mac_x86_64": [],
-        ":windows_x86_64": ["-defaultlib:advapi32.lib"],
+        "@platforms//os:android": [],
+        "@platforms//os:macos": [],
+        "@platforms//os:windows": ["-defaultlib:advapi32.lib"],
         "//conditions:default": ["-lpthread"],
     }),
     visibility = ["//visibility:public"],
diff --git a/BUILD.generated.bzl b/BUILD.generated.bzl
index 220f07f..58baa27 100644
--- a/BUILD.generated.bzl
+++ b/BUILD.generated.bzl
@@ -37,19 +37,20 @@
     "src/crypto/fipsmodule/cipher/aead.c",
     "src/crypto/fipsmodule/cipher/cipher.c",
     "src/crypto/fipsmodule/cipher/e_aes.c",
-    "src/crypto/fipsmodule/cipher/e_des.c",
-    "src/crypto/fipsmodule/des/des.c",
+    "src/crypto/fipsmodule/cipher/e_aesccm.c",
+    "src/crypto/fipsmodule/cmac/cmac.c",
     "src/crypto/fipsmodule/dh/check.c",
     "src/crypto/fipsmodule/dh/dh.c",
     "src/crypto/fipsmodule/digest/digest.c",
     "src/crypto/fipsmodule/digest/digests.c",
+    "src/crypto/fipsmodule/digestsign/digestsign.c",
     "src/crypto/fipsmodule/ec/ec.c",
     "src/crypto/fipsmodule/ec/ec_key.c",
     "src/crypto/fipsmodule/ec/ec_montgomery.c",
     "src/crypto/fipsmodule/ec/felem.c",
     "src/crypto/fipsmodule/ec/oct.c",
     "src/crypto/fipsmodule/ec/p224-64.c",
-    "src/crypto/fipsmodule/ec/p256-x86_64.c",
+    "src/crypto/fipsmodule/ec/p256-nistz.c",
     "src/crypto/fipsmodule/ec/p256.c",
     "src/crypto/fipsmodule/ec/scalar.c",
     "src/crypto/fipsmodule/ec/simple.c",
@@ -78,6 +79,7 @@
     "src/crypto/fipsmodule/rsa/rsa_impl.c",
     "src/crypto/fipsmodule/self_check/fips.c",
     "src/crypto/fipsmodule/self_check/self_check.c",
+    "src/crypto/fipsmodule/service_indicator/service_indicator.c",
     "src/crypto/fipsmodule/sha/sha1-altivec.c",
     "src/crypto/fipsmodule/sha/sha1.c",
     "src/crypto/fipsmodule/sha/sha256.c",
@@ -152,6 +154,7 @@
     "src/include/openssl/conf.h",
     "src/include/openssl/cpu.h",
     "src/include/openssl/crypto.h",
+    "src/include/openssl/ctrdrbg.h",
     "src/include/openssl/curve25519.h",
     "src/include/openssl/des.h",
     "src/include/openssl/dh.h",
@@ -172,6 +175,7 @@
     "src/include/openssl/hpke.h",
     "src/include/openssl/hrss.h",
     "src/include/openssl/is_boringssl.h",
+    "src/include/openssl/kdf.h",
     "src/include/openssl/lhash.h",
     "src/include/openssl/md4.h",
     "src/include/openssl/md5.h",
@@ -194,6 +198,7 @@
     "src/include/openssl/ripemd.h",
     "src/include/openssl/rsa.h",
     "src/include/openssl/safestack.h",
+    "src/include/openssl/service_indicator.h",
     "src/include/openssl/sha.h",
     "src/include/openssl/siphash.h",
     "src/include/openssl/span.h",
@@ -207,7 +212,6 @@
 ]
 
 crypto_internal_headers = [
-    "src/crypto/asn1/charmap.h",
     "src/crypto/asn1/internal.h",
     "src/crypto/bio/internal.h",
     "src/crypto/bytestring/internal.h",
@@ -215,9 +219,10 @@
     "src/crypto/cipher_extra/internal.h",
     "src/crypto/conf/conf_def.h",
     "src/crypto/conf/internal.h",
-    "src/crypto/cpu-arm-linux.h",
+    "src/crypto/cpu_arm_linux.h",
     "src/crypto/curve25519/curve25519_tables.h",
     "src/crypto/curve25519/internal.h",
+    "src/crypto/des/internal.h",
     "src/crypto/dsa/internal.h",
     "src/crypto/ec_extra/internal.h",
     "src/crypto/err/internal.h",
@@ -227,12 +232,12 @@
     "src/crypto/fipsmodule/bn/rsaz_exp.h",
     "src/crypto/fipsmodule/cipher/internal.h",
     "src/crypto/fipsmodule/delocate.h",
-    "src/crypto/fipsmodule/des/internal.h",
+    "src/crypto/fipsmodule/dh/internal.h",
     "src/crypto/fipsmodule/digest/internal.h",
     "src/crypto/fipsmodule/digest/md32_common.h",
     "src/crypto/fipsmodule/ec/internal.h",
-    "src/crypto/fipsmodule/ec/p256-x86_64-table.h",
-    "src/crypto/fipsmodule/ec/p256-x86_64.h",
+    "src/crypto/fipsmodule/ec/p256-nistz-table.h",
+    "src/crypto/fipsmodule/ec/p256-nistz.h",
     "src/crypto/fipsmodule/ec/p256_table.h",
     "src/crypto/fipsmodule/ecdsa/internal.h",
     "src/crypto/fipsmodule/md5/internal.h",
@@ -241,6 +246,7 @@
     "src/crypto/fipsmodule/rand/getrandom_fillin.h",
     "src/crypto/fipsmodule/rand/internal.h",
     "src/crypto/fipsmodule/rsa/internal.h",
+    "src/crypto/fipsmodule/service_indicator/internal.h",
     "src/crypto/fipsmodule/sha/internal.h",
     "src/crypto/fipsmodule/tls/internal.h",
     "src/crypto/hrss/internal.h",
@@ -267,7 +273,6 @@
     "src/crypto/asn1/a_bool.c",
     "src/crypto/asn1/a_d2i_fp.c",
     "src/crypto/asn1/a_dup.c",
-    "src/crypto/asn1/a_enum.c",
     "src/crypto/asn1/a_gentm.c",
     "src/crypto/asn1/a_i2d_fp.c",
     "src/crypto/asn1/a_int.c",
@@ -286,13 +291,13 @@
     "src/crypto/asn1/asn_pack.c",
     "src/crypto/asn1/f_int.c",
     "src/crypto/asn1/f_string.c",
+    "src/crypto/asn1/posix_time.c",
     "src/crypto/asn1/tasn_dec.c",
     "src/crypto/asn1/tasn_enc.c",
     "src/crypto/asn1/tasn_fre.c",
     "src/crypto/asn1/tasn_new.c",
     "src/crypto/asn1/tasn_typ.c",
     "src/crypto/asn1/tasn_utl.c",
-    "src/crypto/asn1/time_support.c",
     "src/crypto/base64/base64.c",
     "src/crypto/bio/bio.c",
     "src/crypto/bio/bio_mem.c",
@@ -316,27 +321,28 @@
     "src/crypto/chacha/chacha.c",
     "src/crypto/cipher_extra/cipher_extra.c",
     "src/crypto/cipher_extra/derive_key.c",
-    "src/crypto/cipher_extra/e_aesccm.c",
     "src/crypto/cipher_extra/e_aesctrhmac.c",
     "src/crypto/cipher_extra/e_aesgcmsiv.c",
     "src/crypto/cipher_extra/e_chacha20poly1305.c",
+    "src/crypto/cipher_extra/e_des.c",
     "src/crypto/cipher_extra/e_null.c",
     "src/crypto/cipher_extra/e_rc2.c",
     "src/crypto/cipher_extra/e_rc4.c",
     "src/crypto/cipher_extra/e_tls.c",
     "src/crypto/cipher_extra/tls_cbc.c",
-    "src/crypto/cmac/cmac.c",
     "src/crypto/conf/conf.c",
-    "src/crypto/cpu-aarch64-fuchsia.c",
-    "src/crypto/cpu-aarch64-linux.c",
-    "src/crypto/cpu-aarch64-win.c",
-    "src/crypto/cpu-arm-linux.c",
-    "src/crypto/cpu-arm.c",
-    "src/crypto/cpu-intel.c",
-    "src/crypto/cpu-ppc64le.c",
+    "src/crypto/cpu_aarch64_apple.c",
+    "src/crypto/cpu_aarch64_fuchsia.c",
+    "src/crypto/cpu_aarch64_linux.c",
+    "src/crypto/cpu_aarch64_win.c",
+    "src/crypto/cpu_arm.c",
+    "src/crypto/cpu_arm_linux.c",
+    "src/crypto/cpu_intel.c",
+    "src/crypto/cpu_ppc64le.c",
     "src/crypto/crypto.c",
     "src/crypto/curve25519/curve25519.c",
     "src/crypto/curve25519/spake25519.c",
+    "src/crypto/des/des.c",
     "src/crypto/dh_extra/dh_asn1.c",
     "src/crypto/dh_extra/params.c",
     "src/crypto/digest_extra/digest_extra.c",
@@ -349,7 +355,6 @@
     "src/crypto/ecdsa_extra/ecdsa_asn1.c",
     "src/crypto/engine/engine.c",
     "src/crypto/err/err.c",
-    "src/crypto/evp/digestsign.c",
     "src/crypto/evp/evp.c",
     "src/crypto/evp/evp_asn1.c",
     "src/crypto/evp/evp_ctx.c",
@@ -358,6 +363,7 @@
     "src/crypto/evp/p_ec_asn1.c",
     "src/crypto/evp/p_ed25519.c",
     "src/crypto/evp/p_ed25519_asn1.c",
+    "src/crypto/evp/p_hkdf.c",
     "src/crypto/evp/p_rsa.c",
     "src/crypto/evp/p_rsa_asn1.c",
     "src/crypto/evp/p_x25519.c",
@@ -463,7 +469,6 @@
     "src/crypto/x509/x_x509a.c",
     "src/crypto/x509v3/pcy_cache.c",
     "src/crypto/x509v3/pcy_data.c",
-    "src/crypto/x509v3/pcy_lib.c",
     "src/crypto/x509v3/pcy_map.c",
     "src/crypto/x509v3/pcy_node.c",
     "src/crypto/x509v3/pcy_tree.c",
@@ -519,39 +524,83 @@
     "src/tool/transport_common.h",
 ]
 
-crypto_sources_ios_aarch64 = [
-    "ios-aarch64/crypto/chacha/chacha-armv8.S",
-    "ios-aarch64/crypto/fipsmodule/aesv8-armx64.S",
-    "ios-aarch64/crypto/fipsmodule/armv8-mont.S",
-    "ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
-    "ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
-    "ios-aarch64/crypto/fipsmodule/sha1-armv8.S",
-    "ios-aarch64/crypto/fipsmodule/sha256-armv8.S",
-    "ios-aarch64/crypto/fipsmodule/sha512-armv8.S",
-    "ios-aarch64/crypto/fipsmodule/vpaes-armv8.S",
-    "ios-aarch64/crypto/test/trampoline-armv8.S",
+crypto_sources_apple_aarch64 = [
+    "apple-aarch64/crypto/chacha/chacha-armv8.S",
+    "apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S",
+    "apple-aarch64/crypto/fipsmodule/aesv8-armx64.S",
+    "apple-aarch64/crypto/fipsmodule/armv8-mont.S",
+    "apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
+    "apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
+    "apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S",
+    "apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S",
+    "apple-aarch64/crypto/fipsmodule/sha1-armv8.S",
+    "apple-aarch64/crypto/fipsmodule/sha256-armv8.S",
+    "apple-aarch64/crypto/fipsmodule/sha512-armv8.S",
+    "apple-aarch64/crypto/fipsmodule/vpaes-armv8.S",
+    "apple-aarch64/crypto/test/trampoline-armv8.S",
 ]
 
-crypto_sources_ios_arm = [
-    "ios-arm/crypto/chacha/chacha-armv4.S",
-    "ios-arm/crypto/fipsmodule/aesv8-armx32.S",
-    "ios-arm/crypto/fipsmodule/armv4-mont.S",
-    "ios-arm/crypto/fipsmodule/bsaes-armv7.S",
-    "ios-arm/crypto/fipsmodule/ghash-armv4.S",
-    "ios-arm/crypto/fipsmodule/ghashv8-armx32.S",
-    "ios-arm/crypto/fipsmodule/sha1-armv4-large.S",
-    "ios-arm/crypto/fipsmodule/sha256-armv4.S",
-    "ios-arm/crypto/fipsmodule/sha512-armv4.S",
-    "ios-arm/crypto/fipsmodule/vpaes-armv7.S",
-    "ios-arm/crypto/test/trampoline-armv4.S",
+crypto_sources_apple_arm = [
+    "apple-arm/crypto/chacha/chacha-armv4.S",
+    "apple-arm/crypto/fipsmodule/aesv8-armx32.S",
+    "apple-arm/crypto/fipsmodule/armv4-mont.S",
+    "apple-arm/crypto/fipsmodule/bsaes-armv7.S",
+    "apple-arm/crypto/fipsmodule/ghash-armv4.S",
+    "apple-arm/crypto/fipsmodule/ghashv8-armx32.S",
+    "apple-arm/crypto/fipsmodule/sha1-armv4-large.S",
+    "apple-arm/crypto/fipsmodule/sha256-armv4.S",
+    "apple-arm/crypto/fipsmodule/sha512-armv4.S",
+    "apple-arm/crypto/fipsmodule/vpaes-armv7.S",
+    "apple-arm/crypto/test/trampoline-armv4.S",
+]
+
+crypto_sources_apple_x86 = [
+    "apple-x86/crypto/chacha/chacha-x86.S",
+    "apple-x86/crypto/fipsmodule/aesni-x86.S",
+    "apple-x86/crypto/fipsmodule/bn-586.S",
+    "apple-x86/crypto/fipsmodule/co-586.S",
+    "apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S",
+    "apple-x86/crypto/fipsmodule/ghash-x86.S",
+    "apple-x86/crypto/fipsmodule/md5-586.S",
+    "apple-x86/crypto/fipsmodule/sha1-586.S",
+    "apple-x86/crypto/fipsmodule/sha256-586.S",
+    "apple-x86/crypto/fipsmodule/sha512-586.S",
+    "apple-x86/crypto/fipsmodule/vpaes-x86.S",
+    "apple-x86/crypto/fipsmodule/x86-mont.S",
+    "apple-x86/crypto/test/trampoline-x86.S",
+]
+
+crypto_sources_apple_x86_64 = [
+    "apple-x86_64/crypto/chacha/chacha-x86_64.S",
+    "apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S",
+    "apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/aesni-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/ghash-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/md5-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S",
+    "apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S",
+    "apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/rsaz-avx2.S",
+    "apple-x86_64/crypto/fipsmodule/sha1-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/sha256-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/sha512-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
+    "apple-x86_64/crypto/fipsmodule/x86_64-mont.S",
+    "apple-x86_64/crypto/fipsmodule/x86_64-mont5.S",
+    "apple-x86_64/crypto/test/trampoline-x86_64.S",
 ]
 
 crypto_sources_linux_aarch64 = [
     "linux-aarch64/crypto/chacha/chacha-armv8.S",
+    "linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S",
     "linux-aarch64/crypto/fipsmodule/aesv8-armx64.S",
     "linux-aarch64/crypto/fipsmodule/armv8-mont.S",
     "linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
     "linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
+    "linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S",
+    "linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S",
     "linux-aarch64/crypto/fipsmodule/sha1-armv8.S",
     "linux-aarch64/crypto/fipsmodule/sha256-armv8.S",
     "linux-aarch64/crypto/fipsmodule/sha512-armv8.S",
@@ -620,50 +669,15 @@
     "src/crypto/hrss/asm/poly_rq_mul.S",
 ]
 
-crypto_sources_mac_x86 = [
-    "mac-x86/crypto/chacha/chacha-x86.S",
-    "mac-x86/crypto/fipsmodule/aesni-x86.S",
-    "mac-x86/crypto/fipsmodule/bn-586.S",
-    "mac-x86/crypto/fipsmodule/co-586.S",
-    "mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S",
-    "mac-x86/crypto/fipsmodule/ghash-x86.S",
-    "mac-x86/crypto/fipsmodule/md5-586.S",
-    "mac-x86/crypto/fipsmodule/sha1-586.S",
-    "mac-x86/crypto/fipsmodule/sha256-586.S",
-    "mac-x86/crypto/fipsmodule/sha512-586.S",
-    "mac-x86/crypto/fipsmodule/vpaes-x86.S",
-    "mac-x86/crypto/fipsmodule/x86-mont.S",
-    "mac-x86/crypto/test/trampoline-x86.S",
-]
-
-crypto_sources_mac_x86_64 = [
-    "mac-x86_64/crypto/chacha/chacha-x86_64.S",
-    "mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S",
-    "mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/aesni-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/ghash-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/md5-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S",
-    "mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S",
-    "mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/rsaz-avx2.S",
-    "mac-x86_64/crypto/fipsmodule/sha1-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/sha256-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/sha512-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
-    "mac-x86_64/crypto/fipsmodule/x86_64-mont.S",
-    "mac-x86_64/crypto/fipsmodule/x86_64-mont5.S",
-    "mac-x86_64/crypto/test/trampoline-x86_64.S",
-]
-
 crypto_sources_win_aarch64 = [
     "win-aarch64/crypto/chacha/chacha-armv8.S",
+    "win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S",
     "win-aarch64/crypto/fipsmodule/aesv8-armx64.S",
     "win-aarch64/crypto/fipsmodule/armv8-mont.S",
     "win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S",
     "win-aarch64/crypto/fipsmodule/ghashv8-armx64.S",
+    "win-aarch64/crypto/fipsmodule/p256-armv8-asm.S",
+    "win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S",
     "win-aarch64/crypto/fipsmodule/sha1-armv8.S",
     "win-aarch64/crypto/fipsmodule/sha256-armv8.S",
     "win-aarch64/crypto/fipsmodule/sha512-armv8.S",
diff --git a/BUILD.generated_tests.bzl b/BUILD.generated_tests.bzl
index c70cdad..fc738c8 100644
--- a/BUILD.generated_tests.bzl
+++ b/BUILD.generated_tests.bzl
@@ -1,7 +1,6 @@
 # This file is created by generate_build_files.py. Do not edit manually.
 
 test_support_sources = [
-    "src/crypto/asn1/charmap.h",
     "src/crypto/asn1/internal.h",
     "src/crypto/bio/internal.h",
     "src/crypto/bytestring/internal.h",
@@ -9,9 +8,10 @@
     "src/crypto/cipher_extra/internal.h",
     "src/crypto/conf/conf_def.h",
     "src/crypto/conf/internal.h",
-    "src/crypto/cpu-arm-linux.h",
+    "src/crypto/cpu_arm_linux.h",
     "src/crypto/curve25519/curve25519_tables.h",
     "src/crypto/curve25519/internal.h",
+    "src/crypto/des/internal.h",
     "src/crypto/dsa/internal.h",
     "src/crypto/ec_extra/internal.h",
     "src/crypto/err/internal.h",
@@ -21,12 +21,12 @@
     "src/crypto/fipsmodule/bn/rsaz_exp.h",
     "src/crypto/fipsmodule/cipher/internal.h",
     "src/crypto/fipsmodule/delocate.h",
-    "src/crypto/fipsmodule/des/internal.h",
+    "src/crypto/fipsmodule/dh/internal.h",
     "src/crypto/fipsmodule/digest/internal.h",
     "src/crypto/fipsmodule/digest/md32_common.h",
     "src/crypto/fipsmodule/ec/internal.h",
-    "src/crypto/fipsmodule/ec/p256-x86_64-table.h",
-    "src/crypto/fipsmodule/ec/p256-x86_64.h",
+    "src/crypto/fipsmodule/ec/p256-nistz-table.h",
+    "src/crypto/fipsmodule/ec/p256-nistz.h",
     "src/crypto/fipsmodule/ec/p256_table.h",
     "src/crypto/fipsmodule/ecdsa/internal.h",
     "src/crypto/fipsmodule/md5/internal.h",
@@ -35,6 +35,7 @@
     "src/crypto/fipsmodule/rand/getrandom_fillin.h",
     "src/crypto/fipsmodule/rand/internal.h",
     "src/crypto/fipsmodule/rsa/internal.h",
+    "src/crypto/fipsmodule/service_indicator/internal.h",
     "src/crypto/fipsmodule/sha/internal.h",
     "src/crypto/fipsmodule/tls/internal.h",
     "src/crypto/hrss/internal.h",
@@ -85,11 +86,10 @@
     "src/crypto/chacha/chacha_test.cc",
     "src/crypto/cipher_extra/aead_test.cc",
     "src/crypto/cipher_extra/cipher_test.cc",
-    "src/crypto/cmac/cmac_test.cc",
     "src/crypto/compiler_test.cc",
     "src/crypto/conf/conf_test.cc",
     "src/crypto/constant_time_test.cc",
-    "src/crypto/cpu-arm-linux_test.cc",
+    "src/crypto/cpu_arm_linux_test.cc",
     "src/crypto/crypto_test.cc",
     "src/crypto/curve25519/ed25519_test.cc",
     "src/crypto/curve25519/spake25519_test.cc",
@@ -105,13 +105,15 @@
     "src/crypto/evp/scrypt_test.cc",
     "src/crypto/fipsmodule/aes/aes_test.cc",
     "src/crypto/fipsmodule/bn/bn_test.cc",
+    "src/crypto/fipsmodule/cmac/cmac_test.cc",
     "src/crypto/fipsmodule/ec/ec_test.cc",
-    "src/crypto/fipsmodule/ec/p256-x86_64_test.cc",
+    "src/crypto/fipsmodule/ec/p256-nistz_test.cc",
     "src/crypto/fipsmodule/ecdsa/ecdsa_test.cc",
     "src/crypto/fipsmodule/md5/md5_test.cc",
     "src/crypto/fipsmodule/modes/gcm_test.cc",
     "src/crypto/fipsmodule/rand/ctrdrbg_test.cc",
     "src/crypto/fipsmodule/rand/fork_detect_test.cc",
+    "src/crypto/fipsmodule/service_indicator/service_indicator_test.cc",
     "src/crypto/fipsmodule/sha/sha_test.cc",
     "src/crypto/hkdf/hkdf_test.cc",
     "src/crypto/hmac_extra/hmac_test.cc",
@@ -140,7 +142,6 @@
     "src/crypto/x509/x509_test.cc",
     "src/crypto/x509/x509_time_test.cc",
     "src/crypto/x509v3/tab_test.cc",
-    "src/crypto/x509v3/v3name_test.cc",
 ]
 
 ssl_test_sources = [
@@ -157,6 +158,7 @@
     "src/crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt",
     "src/crypto/cipher_extra/test/aes_128_ccm_bluetooth_8_tests.txt",
     "src/crypto/cipher_extra/test/aes_128_ccm_bluetooth_tests.txt",
+    "src/crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt",
     "src/crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt",
     "src/crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt",
     "src/crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt",
@@ -183,10 +185,6 @@
     "src/crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt",
     "src/crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt",
     "src/crypto/cipher_extra/test/xchacha20_poly1305_tests.txt",
-    "src/crypto/cmac/cavp_3des_cmac_tests.txt",
-    "src/crypto/cmac/cavp_aes128_cmac_tests.txt",
-    "src/crypto/cmac/cavp_aes192_cmac_tests.txt",
-    "src/crypto/cmac/cavp_aes256_cmac_tests.txt",
     "src/crypto/curve25519/ed25519_tests.txt",
     "src/crypto/ecdh_extra/ecdh_tests.txt",
     "src/crypto/evp/evp_tests.txt",
@@ -194,8 +192,12 @@
     "src/crypto/fipsmodule/aes/aes_tests.txt",
     "src/crypto/fipsmodule/bn/bn_tests.txt",
     "src/crypto/fipsmodule/bn/miller_rabin_tests.txt",
+    "src/crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt",
+    "src/crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt",
+    "src/crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt",
+    "src/crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt",
     "src/crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt",
-    "src/crypto/fipsmodule/ec/p256-x86_64_tests.txt",
+    "src/crypto/fipsmodule/ec/p256-nistz_tests.txt",
     "src/crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt",
     "src/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt",
     "src/crypto/fipsmodule/modes/gcm_tests.txt",
@@ -247,6 +249,21 @@
     "src/crypto/x509/test/many_names1.pem",
     "src/crypto/x509/test/many_names2.pem",
     "src/crypto/x509/test/many_names3.pem",
+    "src/crypto/x509/test/pss_sha1.pem",
+    "src/crypto/x509/test/pss_sha1_explicit.pem",
+    "src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem",
+    "src/crypto/x509/test/pss_sha224.pem",
+    "src/crypto/x509/test/pss_sha256.pem",
+    "src/crypto/x509/test/pss_sha256_explicit_trailer.pem",
+    "src/crypto/x509/test/pss_sha256_mgf1_sha384.pem",
+    "src/crypto/x509/test/pss_sha256_mgf1_syntax_error.pem",
+    "src/crypto/x509/test/pss_sha256_omit_nulls.pem",
+    "src/crypto/x509/test/pss_sha256_salt31.pem",
+    "src/crypto/x509/test/pss_sha256_salt_overflow.pem",
+    "src/crypto/x509/test/pss_sha256_unknown_mgf.pem",
+    "src/crypto/x509/test/pss_sha256_wrong_trailer.pem",
+    "src/crypto/x509/test/pss_sha384.pem",
+    "src/crypto/x509/test/pss_sha512.pem",
     "src/crypto/x509/test/some_names1.pem",
     "src/crypto/x509/test/some_names2.pem",
     "src/crypto/x509/test/some_names3.pem",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2525e21..0ded68a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,7 @@
 endif()
 
 if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
   if(APPLE)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
   endif()
@@ -126,44 +126,92 @@
 include_directories(src/include)
 
 set(
-  CRYPTO_ios_aarch64_SOURCES
+  CRYPTO_apple_aarch64_SOURCES
 
-  ios-aarch64/crypto/chacha/chacha-armv8.S
-  ios-aarch64/crypto/fipsmodule/aesv8-armx64.S
-  ios-aarch64/crypto/fipsmodule/armv8-mont.S
-  ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
-  ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S
-  ios-aarch64/crypto/fipsmodule/sha1-armv8.S
-  ios-aarch64/crypto/fipsmodule/sha256-armv8.S
-  ios-aarch64/crypto/fipsmodule/sha512-armv8.S
-  ios-aarch64/crypto/fipsmodule/vpaes-armv8.S
-  ios-aarch64/crypto/test/trampoline-armv8.S
+  apple-aarch64/crypto/chacha/chacha-armv8.S
+  apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
+  apple-aarch64/crypto/fipsmodule/aesv8-armx64.S
+  apple-aarch64/crypto/fipsmodule/armv8-mont.S
+  apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
+  apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+  apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S
+  apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
+  apple-aarch64/crypto/fipsmodule/sha1-armv8.S
+  apple-aarch64/crypto/fipsmodule/sha256-armv8.S
+  apple-aarch64/crypto/fipsmodule/sha512-armv8.S
+  apple-aarch64/crypto/fipsmodule/vpaes-armv8.S
+  apple-aarch64/crypto/test/trampoline-armv8.S
 )
 
 set(
-  CRYPTO_ios_arm_SOURCES
+  CRYPTO_apple_arm_SOURCES
 
-  ios-arm/crypto/chacha/chacha-armv4.S
-  ios-arm/crypto/fipsmodule/aesv8-armx32.S
-  ios-arm/crypto/fipsmodule/armv4-mont.S
-  ios-arm/crypto/fipsmodule/bsaes-armv7.S
-  ios-arm/crypto/fipsmodule/ghash-armv4.S
-  ios-arm/crypto/fipsmodule/ghashv8-armx32.S
-  ios-arm/crypto/fipsmodule/sha1-armv4-large.S
-  ios-arm/crypto/fipsmodule/sha256-armv4.S
-  ios-arm/crypto/fipsmodule/sha512-armv4.S
-  ios-arm/crypto/fipsmodule/vpaes-armv7.S
-  ios-arm/crypto/test/trampoline-armv4.S
+  apple-arm/crypto/chacha/chacha-armv4.S
+  apple-arm/crypto/fipsmodule/aesv8-armx32.S
+  apple-arm/crypto/fipsmodule/armv4-mont.S
+  apple-arm/crypto/fipsmodule/bsaes-armv7.S
+  apple-arm/crypto/fipsmodule/ghash-armv4.S
+  apple-arm/crypto/fipsmodule/ghashv8-armx32.S
+  apple-arm/crypto/fipsmodule/sha1-armv4-large.S
+  apple-arm/crypto/fipsmodule/sha256-armv4.S
+  apple-arm/crypto/fipsmodule/sha512-armv4.S
+  apple-arm/crypto/fipsmodule/vpaes-armv7.S
+  apple-arm/crypto/test/trampoline-armv4.S
+)
+
+set(
+  CRYPTO_apple_x86_SOURCES
+
+  apple-x86/crypto/chacha/chacha-x86.S
+  apple-x86/crypto/fipsmodule/aesni-x86.S
+  apple-x86/crypto/fipsmodule/bn-586.S
+  apple-x86/crypto/fipsmodule/co-586.S
+  apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S
+  apple-x86/crypto/fipsmodule/ghash-x86.S
+  apple-x86/crypto/fipsmodule/md5-586.S
+  apple-x86/crypto/fipsmodule/sha1-586.S
+  apple-x86/crypto/fipsmodule/sha256-586.S
+  apple-x86/crypto/fipsmodule/sha512-586.S
+  apple-x86/crypto/fipsmodule/vpaes-x86.S
+  apple-x86/crypto/fipsmodule/x86-mont.S
+  apple-x86/crypto/test/trampoline-x86.S
+)
+
+set(
+  CRYPTO_apple_x86_64_SOURCES
+
+  apple-x86_64/crypto/chacha/chacha-x86_64.S
+  apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S
+  apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S
+  apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
+  apple-x86_64/crypto/fipsmodule/aesni-x86_64.S
+  apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
+  apple-x86_64/crypto/fipsmodule/ghash-x86_64.S
+  apple-x86_64/crypto/fipsmodule/md5-x86_64.S
+  apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
+  apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
+  apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S
+  apple-x86_64/crypto/fipsmodule/rsaz-avx2.S
+  apple-x86_64/crypto/fipsmodule/sha1-x86_64.S
+  apple-x86_64/crypto/fipsmodule/sha256-x86_64.S
+  apple-x86_64/crypto/fipsmodule/sha512-x86_64.S
+  apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S
+  apple-x86_64/crypto/fipsmodule/x86_64-mont.S
+  apple-x86_64/crypto/fipsmodule/x86_64-mont5.S
+  apple-x86_64/crypto/test/trampoline-x86_64.S
 )
 
 set(
   CRYPTO_linux_aarch64_SOURCES
 
   linux-aarch64/crypto/chacha/chacha-armv8.S
+  linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
   linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
   linux-aarch64/crypto/fipsmodule/armv8-mont.S
   linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
   linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+  linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S
+  linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
   linux-aarch64/crypto/fipsmodule/sha1-armv8.S
   linux-aarch64/crypto/fipsmodule/sha256-armv8.S
   linux-aarch64/crypto/fipsmodule/sha512-armv8.S
@@ -241,55 +289,16 @@
 )
 
 set(
-  CRYPTO_mac_x86_SOURCES
-
-  mac-x86/crypto/chacha/chacha-x86.S
-  mac-x86/crypto/fipsmodule/aesni-x86.S
-  mac-x86/crypto/fipsmodule/bn-586.S
-  mac-x86/crypto/fipsmodule/co-586.S
-  mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S
-  mac-x86/crypto/fipsmodule/ghash-x86.S
-  mac-x86/crypto/fipsmodule/md5-586.S
-  mac-x86/crypto/fipsmodule/sha1-586.S
-  mac-x86/crypto/fipsmodule/sha256-586.S
-  mac-x86/crypto/fipsmodule/sha512-586.S
-  mac-x86/crypto/fipsmodule/vpaes-x86.S
-  mac-x86/crypto/fipsmodule/x86-mont.S
-  mac-x86/crypto/test/trampoline-x86.S
-)
-
-set(
-  CRYPTO_mac_x86_64_SOURCES
-
-  mac-x86_64/crypto/chacha/chacha-x86_64.S
-  mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S
-  mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S
-  mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
-  mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
-  mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
-  mac-x86_64/crypto/fipsmodule/ghash-x86_64.S
-  mac-x86_64/crypto/fipsmodule/md5-x86_64.S
-  mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
-  mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
-  mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S
-  mac-x86_64/crypto/fipsmodule/rsaz-avx2.S
-  mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
-  mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
-  mac-x86_64/crypto/fipsmodule/sha512-x86_64.S
-  mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S
-  mac-x86_64/crypto/fipsmodule/x86_64-mont.S
-  mac-x86_64/crypto/fipsmodule/x86_64-mont5.S
-  mac-x86_64/crypto/test/trampoline-x86_64.S
-)
-
-set(
   CRYPTO_win_aarch64_SOURCES
 
   win-aarch64/crypto/chacha/chacha-armv8.S
+  win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
   win-aarch64/crypto/fipsmodule/aesv8-armx64.S
   win-aarch64/crypto/fipsmodule/armv8-mont.S
   win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
   win-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+  win-aarch64/crypto/fipsmodule/p256-armv8-asm.S
+  win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
   win-aarch64/crypto/fipsmodule/sha1-armv8.S
   win-aarch64/crypto/fipsmodule/sha256-armv8.S
   win-aarch64/crypto/fipsmodule/sha512-armv8.S
@@ -339,12 +348,8 @@
   win-x86_64/crypto/test/trampoline-x86_64.asm
 )
 
-if(APPLE AND ARCH STREQUAL "aarch64")
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_aarch64_SOURCES})
-elseif(APPLE AND ARCH STREQUAL "arm")
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_arm_SOURCES})
-elseif(APPLE)
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_mac_${ARCH}_SOURCES})
+if(APPLE)
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_${ARCH}_SOURCES})
 elseif(UNIX)
   set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES})
 elseif(WIN32)
@@ -360,7 +365,6 @@
   src/crypto/asn1/a_bool.c
   src/crypto/asn1/a_d2i_fp.c
   src/crypto/asn1/a_dup.c
-  src/crypto/asn1/a_enum.c
   src/crypto/asn1/a_gentm.c
   src/crypto/asn1/a_i2d_fp.c
   src/crypto/asn1/a_int.c
@@ -379,13 +383,13 @@
   src/crypto/asn1/asn_pack.c
   src/crypto/asn1/f_int.c
   src/crypto/asn1/f_string.c
+  src/crypto/asn1/posix_time.c
   src/crypto/asn1/tasn_dec.c
   src/crypto/asn1/tasn_enc.c
   src/crypto/asn1/tasn_fre.c
   src/crypto/asn1/tasn_new.c
   src/crypto/asn1/tasn_typ.c
   src/crypto/asn1/tasn_utl.c
-  src/crypto/asn1/time_support.c
   src/crypto/base64/base64.c
   src/crypto/bio/bio.c
   src/crypto/bio/bio_mem.c
@@ -409,27 +413,28 @@
   src/crypto/chacha/chacha.c
   src/crypto/cipher_extra/cipher_extra.c
   src/crypto/cipher_extra/derive_key.c
-  src/crypto/cipher_extra/e_aesccm.c
   src/crypto/cipher_extra/e_aesctrhmac.c
   src/crypto/cipher_extra/e_aesgcmsiv.c
   src/crypto/cipher_extra/e_chacha20poly1305.c
+  src/crypto/cipher_extra/e_des.c
   src/crypto/cipher_extra/e_null.c
   src/crypto/cipher_extra/e_rc2.c
   src/crypto/cipher_extra/e_rc4.c
   src/crypto/cipher_extra/e_tls.c
   src/crypto/cipher_extra/tls_cbc.c
-  src/crypto/cmac/cmac.c
   src/crypto/conf/conf.c
-  src/crypto/cpu-aarch64-fuchsia.c
-  src/crypto/cpu-aarch64-linux.c
-  src/crypto/cpu-aarch64-win.c
-  src/crypto/cpu-arm-linux.c
-  src/crypto/cpu-arm.c
-  src/crypto/cpu-intel.c
-  src/crypto/cpu-ppc64le.c
+  src/crypto/cpu_aarch64_apple.c
+  src/crypto/cpu_aarch64_fuchsia.c
+  src/crypto/cpu_aarch64_linux.c
+  src/crypto/cpu_aarch64_win.c
+  src/crypto/cpu_arm.c
+  src/crypto/cpu_arm_linux.c
+  src/crypto/cpu_intel.c
+  src/crypto/cpu_ppc64le.c
   src/crypto/crypto.c
   src/crypto/curve25519/curve25519.c
   src/crypto/curve25519/spake25519.c
+  src/crypto/des/des.c
   src/crypto/dh_extra/dh_asn1.c
   src/crypto/dh_extra/params.c
   src/crypto/digest_extra/digest_extra.c
@@ -442,7 +447,6 @@
   src/crypto/ecdsa_extra/ecdsa_asn1.c
   src/crypto/engine/engine.c
   src/crypto/err/err.c
-  src/crypto/evp/digestsign.c
   src/crypto/evp/evp.c
   src/crypto/evp/evp_asn1.c
   src/crypto/evp/evp_ctx.c
@@ -451,6 +455,7 @@
   src/crypto/evp/p_ec_asn1.c
   src/crypto/evp/p_ed25519.c
   src/crypto/evp/p_ed25519_asn1.c
+  src/crypto/evp/p_hkdf.c
   src/crypto/evp/p_rsa.c
   src/crypto/evp/p_rsa_asn1.c
   src/crypto/evp/p_x25519.c
@@ -556,7 +561,6 @@
   src/crypto/x509/x_x509a.c
   src/crypto/x509v3/pcy_cache.c
   src/crypto/x509v3/pcy_data.c
-  src/crypto/x509v3/pcy_lib.c
   src/crypto/x509v3/pcy_map.c
   src/crypto/x509v3/pcy_node.c
   src/crypto/x509v3/pcy_tree.c
diff --git a/ios-aarch64/crypto/chacha/chacha-armv8.S b/apple-aarch64/crypto/chacha/chacha-armv8.S
similarity index 99%
rename from ios-aarch64/crypto/chacha/chacha-armv8.S
rename to apple-aarch64/crypto/chacha/chacha-armv8.S
index 31db825..dd992a2 100644
--- a/ios-aarch64/crypto/chacha/chacha-armv8.S
+++ b/apple-aarch64/crypto/chacha/chacha-armv8.S
@@ -65,7 +65,7 @@
 	ldp	x24,x25,[x3]		// load key
 	ldp	x26,x27,[x3,#16]
 	ldp	x28,x30,[x4]		// load counter
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x24,x24,#32
 	ror	x25,x25,#32
 	ror	x26,x26,#32
@@ -226,7 +226,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -283,7 +283,7 @@
 	add	x15,x15,x16,lsl#32
 	add	x17,x17,x19,lsl#32
 	add	x20,x20,x21,lsl#32
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -349,7 +349,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -647,7 +647,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -727,7 +727,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -845,7 +845,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -1358,7 +1358,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -1872,7 +1872,7 @@
 	add	x1,x1,#64
 	add	v21.4s,v21.4s,v25.4s
 
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
diff --git a/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
new file mode 100644
index 0000000..eea0722
--- /dev/null
+++ b/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
@@ -0,0 +1,3017 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include <openssl/arm_arch.h>
+.section	__TEXT,__const
+
+.align	7
+Lchacha20_consts:
+.byte	'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k'
+Linc:
+.long	1,2,3,4
+Lrol8:
+.byte	3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14
+Lclamp:
+.quad	0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC
+
+.text
+
+
+.align	6
+Lpoly_hash_ad_internal:
+.cfi_startproc
+	cbnz	x4, Lpoly_hash_intro
+	ret
+
+Lpoly_hash_intro:
+	cmp	x4, #16
+	b.lt	Lpoly_hash_ad_tail
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	Lpoly_hash_ad_internal
+
+Lpoly_hash_ad_tail:
+	cbz	x4, Lpoly_hash_ad_ret
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the AAD
+	sub	x4, x4, #1
+
+Lpoly_hash_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, x4]
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.ge	Lpoly_hash_tail_16_compose
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lpoly_hash_ad_ret:
+	ret
+.cfi_endproc
+
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_seal(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *seal_data);
+//
+.globl	_chacha20_poly1305_seal
+.private_extern	_chacha20_poly1305_seal
+
+.align	6
+_chacha20_poly1305_seal:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, Lchacha20_consts@PAGE
+	add	x11, x11, Lchacha20_consts@PAGEOFF
+
+	ld1	{v24.16b - v27.16b}, [x11] // Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	ldr	x12, [x5, #56]   // The total cipher text length includes extra_in_len
+	add	x12, x12, x2
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x12
+
+	cmp	x2, #128
+	b.le	Lseal_128 // Optimization for smaller buffers
+
+    // Initially we prepare 5 ChaCha20 blocks. Four to encrypt up to 4 blocks (256 bytes) of plaintext,
+    // and one for the Poly1305 R and S keys. The first four blocks (A0-A3..D0-D3) are computed vertically,
+    // the fifth block (A4-D4) horizontally.
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	sub	x5, x5, #32
+
+	mov	x6, #10
+
+.align	5
+Lseal_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lseal_init_rounds
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #4
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	and	v4.16b, v4.16b, v27.16b
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	mov	x16, v4.d[0] // Move the R key to GPRs
+	mov	x17, v4.d[1]
+	mov	v27.16b, v9.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+	mov	x3, x0
+	cmp	x2, #256
+	b.le	Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #256
+
+	mov	x6, #4 // In the first run of the loop we need to hash 256 bytes, therefore we hash one block for the first 4 rounds
+	mov	x7, #6 // and two blocks for the remaining 6, for a total of (1 * 4 + 2 * 6) * 16 = 256
+
+Lseal_main_loop:
+	adrp	x11, Lchacha20_consts@PAGE
+	add	x11, x11, Lchacha20_consts@PAGEOFF
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	sub	x5, x5, #32
+.align	5
+Lseal_main_loop_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.ge	Lseal_main_loop_rounds
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	subs	x7, x7, #1
+	b.gt	Lseal_main_loop_rounds
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+	cmp	x2, #320
+	b.le	Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #320
+
+	mov	x6, #0
+	mov	x7, #10 // For the remainder of the loop we always hash and encrypt 320 bytes per iteration
+
+	b	Lseal_main_loop
+
+Lseal_tail:
+    // This part of the function handles the storage and authentication of the last [0,320) bytes
+    // We assume A0-A4 ... D0-D4 hold at least inl (320 max) bytes of the stream data.
+	cmp	x2, #64
+	b.lt	Lseal_tail_64
+
+    // Store and authenticate 64B blocks per iteration
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+    // Shift the state left by 64 bytes for the next iteration of the loop
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+	mov	v1.16b, v2.16b
+	mov	v6.16b, v7.16b
+	mov	v11.16b, v12.16b
+	mov	v16.16b, v17.16b
+
+	mov	v2.16b, v3.16b
+	mov	v7.16b, v8.16b
+	mov	v12.16b, v13.16b
+	mov	v17.16b, v18.16b
+
+	mov	v3.16b, v4.16b
+	mov	v8.16b, v9.16b
+	mov	v13.16b, v14.16b
+	mov	v18.16b, v19.16b
+
+	b	Lseal_tail
+
+Lseal_tail_64:
+	ldp	x3, x4, [x5, #48] // extra_in_len and extra_in_ptr
+
+    // Here we handle the last [0,64) bytes of plaintext
+	cmp	x2, #16
+	b.lt	Lseal_tail_16
+    // Each iteration encrypt and authenticate a 16B block
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b}, [x0], #16
+
+	sub	x2, x2, #16
+
+    // Shift the state left by 16 bytes for the next iteration of the loop
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+
+	b	Lseal_tail_64
+
+Lseal_tail_16:
+    // Here we handle the last [0,16) bytes of ciphertext that require a padded block
+	cbz	x2, Lseal_hash_extra
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the plaintext/extra in
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask that will only mask the ciphertext bytes
+	not	v22.16b, v20.16b
+
+	mov	x6, x2
+	add	x1, x1, x2
+
+	cbz	x4, Lseal_tail_16_compose // No extra data to pad with, zero padding
+
+	mov	x7, #16          // We need to load some extra_in first for padding
+	sub	x7, x7, x2
+	cmp	x4, x7
+	csel	x7, x4, x7, lt // Load the minimum of extra_in_len and the amount needed to fill the register
+	mov	x12, x7
+	add	x3, x3, x7
+	sub	x4, x4, x7
+
+Lseal_tail16_compose_extra_in:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x7, x7, #1
+	b.gt	Lseal_tail16_compose_extra_in
+
+	add	x3, x3, x12
+
+Lseal_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x1, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	Lseal_tail_16_compose
+
+	and	v0.16b, v0.16b, v21.16b
+	eor	v20.16b, v20.16b, v0.16b
+	mov	v21.16b, v20.16b
+
+Lseal_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	Lseal_tail_16_store
+
+    // Hash in the final ct block concatenated with extra_in
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lseal_hash_extra:
+	cbz	x4, Lseal_finalize
+
+Lseal_hash_extra_loop:
+	cmp	x4, #16
+	b.lt	Lseal_hash_extra_tail
+	ld1	{v20.16b}, [x3], #16
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	Lseal_hash_extra_loop
+
+Lseal_hash_extra_tail:
+	cbz	x4, Lseal_finalize
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the remaining extra ciphertext
+	add	x3, x3, x4
+
+Lseal_hash_extra_load:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.gt	Lseal_hash_extra_load
+
+    // Hash in the final padded extra_in blcok
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lseal_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+Lseal_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+Lseal_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lseal_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+    // Only the first 32 bytes of the third block (counter = 0) are needed,
+    // so skip updating v12 and v17.
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+	b	Lseal_tail
+.cfi_endproc
+
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_open(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *aead_data);
+//
+.globl	_chacha20_poly1305_open
+.private_extern	_chacha20_poly1305_open
+
+.align	6
+_chacha20_poly1305_open:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, Lchacha20_consts@PAGE
+	add	x11, x11, Lchacha20_consts@PAGEOFF
+
+	ld1	{v24.16b - v27.16b}, [x11] // Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x2
+
+	cmp	x2, #128
+	b.le	Lopen_128 // Optimization for smaller buffers
+
+    // Initially we prepare a single ChaCha20 block for the Poly1305 R and S keys
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+
+	mov	x6, #10
+
+.align	5
+Lopen_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lopen_init_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+
+	and	v0.16b, v0.16b, v27.16b
+	mov	x16, v0.d[0] // Move the R key to GPRs
+	mov	x17, v0.d[1]
+	mov	v27.16b, v5.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+Lopen_ad_done:
+	mov	x3, x1
+
+// Each iteration of the loop hash 320 bytes, and prepare stream for 320 bytes
+Lopen_main_loop:
+
+	cmp	x2, #192
+	b.lt	Lopen_tail
+
+	adrp	x11, Lchacha20_consts@PAGE
+	add	x11, x11, Lchacha20_consts@PAGEOFF
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	sub	x5, x5, #32
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash, will always be at least 12
+	sub	x4, x4, #10
+
+	mov	x7, #10
+	subs	x6, x7, x4
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 320 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are full
+
+	cbz	x7, Lopen_main_loop_rounds_short
+
+.align	5
+Lopen_main_loop_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+Lopen_main_loop_rounds_short:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x7, x7, #1
+	b.gt	Lopen_main_loop_rounds
+	subs	x6, x6, #1
+	b.ge	Lopen_main_loop_rounds_short
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+    // We can always safely store 192 bytes
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #192
+
+	mov	v0.16b, v3.16b
+	mov	v5.16b, v8.16b
+	mov	v10.16b, v13.16b
+	mov	v15.16b, v18.16b
+
+	cmp	x2, #64
+	b.lt	Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v4.16b
+	mov	v5.16b, v9.16b
+	mov	v10.16b, v14.16b
+	mov	v15.16b, v19.16b
+
+	cmp	x2, #64
+	b.lt	Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+	b	Lopen_main_loop
+
+Lopen_tail:
+
+	cbz	x2, Lopen_finalize
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash
+
+	cmp	x2, #64
+	b.le	Lopen_tail_64
+	cmp	x2, #128
+	b.le	Lopen_tail_128
+
+Lopen_tail_192:
+     // We need three more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	mov	v17.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v21.16b, v21.16b, v21.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v21.d[0], x15
+
+	add	v22.4s, v23.4s, v21.4s
+	add	v21.4s, v22.4s, v21.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	mov	x7, #10
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 160 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are hashing
+	sub	x4, x4, x7
+
+	cbz	x7, Lopen_tail_192_rounds_no_hash
+
+Lopen_tail_192_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+Lopen_tail_192_rounds_no_hash:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x7, x7, #1
+	b.gt	Lopen_tail_192_rounds
+	subs	x6, x6, #1
+	b.ge	Lopen_tail_192_rounds_no_hash
+
+    // We hashed 160 bytes at most, may still have 32 bytes left
+Lopen_tail_192_hash:
+	cbz	x4, Lopen_tail_192_hash_done
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	Lopen_tail_192_hash
+
+Lopen_tail_192_hash_done:
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #128
+	b	Lopen_tail_64_store
+
+Lopen_tail_128:
+     // We need two more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v22.16b, v22.16b, v22.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v22.d[0], x15
+	add	v22.4s, v22.4s, v23.4s
+
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+Lopen_tail_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #4
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_128_rounds
+	cbz	x4, Lopen_tail_128_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	Lopen_tail_128_rounds
+
+Lopen_tail_128_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+	b	Lopen_tail_64_store
+
+Lopen_tail_64:
+    // We just need a single block
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	ins	v23.s[0], v25.s[0]
+	add	v15.4s, v15.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+Lopen_tail_64_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_64_rounds
+	cbz	x4, Lopen_tail_64_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	Lopen_tail_64_rounds
+
+Lopen_tail_64_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v15.4s, v15.4s, v23.4s
+
+Lopen_tail_64_store:
+	cmp	x2, #16
+	b.lt	Lopen_tail_16
+
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	st1	{v20.16b}, [x0], #16
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+	sub	x2, x2, #16
+	b	Lopen_tail_64_store
+
+Lopen_tail_16:
+    // Here we handle the last [0,16) bytes that require a padded block
+	cbz	x2, Lopen_finalize
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the ciphertext
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask
+	not	v22.16b, v20.16b
+
+	add	x7, x1, x2
+	mov	x6, x2
+
+Lopen_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x7, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	Lopen_tail_16_compose
+
+	and	v20.16b, v20.16b, v21.16b
+    // Hash in the final padded block
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	eor	v20.16b, v20.16b, v0.16b
+
+Lopen_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_16_store
+
+Lopen_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+Lopen_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+Lopen_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lopen_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+Lopen_128_store:
+	cmp	x2, #64
+	b.lt	Lopen_128_store_64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+Lopen_128_store_64:
+
+	lsr	x4, x2, #4
+	mov	x3, x1
+
+Lopen_128_hash_64:
+	cbz	x4, Lopen_tail_64_store
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	Lopen_128_hash_64
+.cfi_endproc
+
+#endif  // !OPENSSL_NO_ASM
diff --git a/ios-aarch64/crypto/fipsmodule/aesv8-armx64.S b/apple-aarch64/crypto/fipsmodule/aesv8-armx64.S
similarity index 99%
rename from ios-aarch64/crypto/fipsmodule/aesv8-armx64.S
rename to apple-aarch64/crypto/fipsmodule/aesv8-armx64.S
index 13950f1..50d7dea 100644
--- a/ios-aarch64/crypto/fipsmodule/aesv8-armx64.S
+++ b/apple-aarch64/crypto/fipsmodule/aesv8-armx64.S
@@ -634,7 +634,7 @@
 	//
 	// [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice
 	// [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev	w8, w8
 #endif
 	add	w10, w8, #1
diff --git a/ios-aarch64/crypto/fipsmodule/armv8-mont.S b/apple-aarch64/crypto/fipsmodule/armv8-mont.S
similarity index 100%
rename from ios-aarch64/crypto/fipsmodule/armv8-mont.S
rename to apple-aarch64/crypto/fipsmodule/armv8-mont.S
diff --git a/ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S b/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
similarity index 100%
rename from ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
rename to apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
diff --git a/ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S
similarity index 97%
rename from ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S
rename to apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S
index dcef3c5..0ba0cdd 100644
--- a/ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+++ b/apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S
@@ -119,7 +119,7 @@
 	movi	v19.16b,#0xe1
 	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
 	shl	v19.2d,v19.2d,#57
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v3.16b,v17.16b,v17.16b,#8
@@ -144,7 +144,7 @@
 	eor	v18.16b,v18.16b,v2.16b
 	eor	v0.16b,v0.16b,v18.16b
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -183,14 +183,14 @@
 	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
 	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
 	b.lo	Lodd_tail_v8		//x3 was less than 32
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v7.16b,v17.16b,v17.16b,#8
@@ -222,13 +222,13 @@
 	eor	v18.16b,v0.16b,v2.16b
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 #endif
 	eor	v1.16b,v1.16b,v18.16b
 	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ins	v2.d[0],v1.d[1]
@@ -278,7 +278,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 
 Ldone_v8:
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -297,7 +297,7 @@
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
 
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
@@ -341,7 +341,7 @@
 	eor	v16.16b,v4.16b,v0.16b
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
 	ext	v3.16b,v16.16b,v16.16b,#8
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v7.16b,v7.16b
@@ -424,7 +424,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d,v6.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v4.16b,v4.16b
@@ -476,7 +476,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v4.16b,v4.16b
 #endif
@@ -519,7 +519,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v4.16b,v4.16b
 #endif
 
@@ -559,7 +559,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 	ext	v0.16b,v0.16b,v0.16b,#8
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	st1	{v0.2d},[x0]		//write out Xi
diff --git a/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S
new file mode 100644
index 0000000..7a5202d
--- /dev/null
+++ b/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S
@@ -0,0 +1,1710 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.align	5
+Lpoly:
+.quad	0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001
+LRR:	//	2^512 mod P precomputed for NIST P256 polynomial
+.quad	0x0000000000000003,0xfffffffbffffffff,0xfffffffffffffffe,0x00000004fffffffd
+Lone_mont:
+.quad	0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe
+Lone:
+.quad	1,0,0,0
+Lord:
+.quad	0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000
+LordK:
+.quad	0xccd1c8aaee00bc4f
+.byte	69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.align	2
+
+// void	ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4],
+//					     const BN_ULONG x2[4]);
+.globl	_ecp_nistz256_mul_mont
+.private_extern	_ecp_nistz256_mul_mont
+
+.align	4
+_ecp_nistz256_mul_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_mul_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	_ecp_nistz256_sqr_mont
+.private_extern	_ecp_nistz256_sqr_mont
+
+.align	4
+_ecp_nistz256_sqr_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sqr_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_div_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	_ecp_nistz256_div_by_2
+.private_extern	_ecp_nistz256_div_by_2
+
+.align	4
+_ecp_nistz256_div_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_div_by_2
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_mul_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	_ecp_nistz256_mul_by_2
+.private_extern	_ecp_nistz256_mul_by_2
+
+.align	4
+_ecp_nistz256_mul_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_mul_by_3(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	_ecp_nistz256_mul_by_3
+.private_extern	_ecp_nistz256_mul_by_3
+
+.align	4
+_ecp_nistz256_mul_by_3:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	mov	x8,x4
+	mov	x9,x5
+	mov	x10,x6
+	mov	x11,x7
+
+	bl	__ecp_nistz256_add_to	// ret += a	// 2*a+a=3*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_sub(BN_ULONG x0[4],const BN_ULONG x1[4],
+//				        const BN_ULONG x2[4]);
+.globl	_ecp_nistz256_sub
+.private_extern	_ecp_nistz256_sub
+
+.align	4
+_ecp_nistz256_sub:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	_ecp_nistz256_neg
+.private_extern	_ecp_nistz256_neg
+
+.align	4
+_ecp_nistz256_neg:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	mov	x2,x1
+	mov	x14,xzr		// a = 0
+	mov	x15,xzr
+	mov	x16,xzr
+	mov	x17,xzr
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded
+// to x4-x7 and b[0] - to x3
+
+.align	4
+__ecp_nistz256_mul_mont:
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x11,x7,x3
+	ldr	x3,[x2,#8]		// b[1]
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adc	x19,xzr,x11
+	mov	x20,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(1+1)]	// b[1+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(2+1)]	// b[2+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	// last reduction
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adcs	x17,x19,x11
+	adc	x19,x20,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded
+// to x4-x7
+
+.align	4
+__ecp_nistz256_sqr_mont:
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x2,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	lsl	x8,x14,#32
+	adcs	x1,x1,x11
+	lsr	x9,x14,#32
+	adc	x2,x2,x7
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adc	x17,x11,xzr		// can't overflow
+
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x2
+	adc	x19,xzr,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+// Note that __ecp_nistz256_add_to expects both input vectors pre-loaded to
+// x4-x7 and x8-x11. This is done because it's used in multiple
+// contexts, e.g. in multiplication by 2 and 3...
+
+.align	4
+__ecp_nistz256_add_to:
+	adds	x14,x14,x8		// ret = a+b
+	adcs	x15,x15,x9
+	adcs	x16,x16,x10
+	adcs	x17,x17,x11
+	adc	x1,xzr,xzr		// zap x1
+
+	adds	x8,x14,#1		// subs	x8,x4,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x1,xzr		// did subtraction borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+
+.align	4
+__ecp_nistz256_sub_from:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x14,x8		// ret = a-b
+	sbcs	x15,x15,x9
+	sbcs	x16,x16,x10
+	sbcs	x17,x17,x11
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+
+.align	4
+__ecp_nistz256_sub_morf:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x8,x14		// ret = b-a
+	sbcs	x15,x9,x15
+	sbcs	x16,x10,x16
+	sbcs	x17,x11,x17
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+
+.align	4
+__ecp_nistz256_div_by_2:
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = a+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adcs	x11,x17,x13
+	adc	x1,xzr,xzr		// zap x1
+	tst	x14,#1		// is a even?
+
+	csel	x14,x14,x8,eq	// ret = even ? a : a+modulus
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	csel	x17,x17,x11,eq
+	csel	x1,xzr,x1,eq
+
+	lsr	x14,x14,#1		// ret >>= 1
+	orr	x14,x14,x15,lsl#63
+	lsr	x15,x15,#1
+	orr	x15,x15,x16,lsl#63
+	lsr	x16,x16,#1
+	orr	x16,x16,x17,lsl#63
+	lsr	x17,x17,#1
+	stp	x14,x15,[x0]
+	orr	x17,x17,x1,lsl#63
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+.globl	_ecp_nistz256_point_double
+.private_extern	_ecp_nistz256_point_double
+
+.align	5
+_ecp_nistz256_point_double:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	sub	sp,sp,#32*4
+
+Ldouble_shortcut:
+	ldp	x14,x15,[x1,#32]
+	mov	x21,x0
+	ldp	x16,x17,[x1,#48]
+	mov	x22,x1
+	ldr	x12,Lpoly+8
+	mov	x8,x14
+	ldr	x13,Lpoly+24
+	mov	x9,x15
+	ldp	x4,x5,[x22,#64]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[x22,#64+16]
+	add	x0,sp,#0
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(S, in_y);
+
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Zsqr, in_z);
+
+	ldp	x8,x9,[x22]
+	ldp	x10,x11,[x22,#16]
+	mov	x4,x14		// put Zsqr aside for p256_sub
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to	// p256_add(M, Zsqr, in_x);
+
+	add	x2,x22,#0
+	mov	x14,x4		// restore Zsqr
+	mov	x15,x5
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x16,x6
+	mov	x17,x7
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sub_morf	// p256_sub(Zsqr, in_x, Zsqr);
+
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(S, S);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[x22,#64]
+	ldp	x6,x7,[x22,#64+16]
+	add	x2,x22,#32
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(tmp0, in_z, in_y);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,x21,#64
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(res_z, tmp0);
+
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(tmp0, S);
+
+	ldr	x3,[sp,#64]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,x21,#32
+	bl	__ecp_nistz256_div_by_2	// p256_div_by_2(res_y, tmp0);
+
+	add	x2,sp,#64
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(M, M, Zsqr);
+
+	mov	x8,x14		// duplicate M
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14		// put M aside
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to
+	mov	x8,x4			// restore M
+	mov	x9,x5
+	ldr	x3,[x22]		// forward load for p256_mul_mont
+	mov	x10,x6
+	ldp	x4,x5,[sp,#0]
+	mov	x11,x7
+	ldp	x6,x7,[sp,#0+16]
+	bl	__ecp_nistz256_add_to	// p256_mul_by_3(M, M);
+
+	add	x2,x22,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, in_x);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#32]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(tmp0, S);
+
+	add	x0,x21,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(res_x, M);
+
+	add	x2,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_x, res_x, tmp0);
+
+	add	x2,sp,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(S, S, res_x);
+
+	ldr	x3,[sp,#32]
+	mov	x4,x14		// copy S
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x2,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, M);
+
+	add	x2,x21,#32
+	add	x0,x21,#32
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, S, res_y);
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.globl	_ecp_nistz256_point_add
+.private_extern	_ecp_nistz256_point_add
+
+.align	5
+_ecp_nistz256_point_add:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	sub	sp,sp,#32*12
+
+	ldp	x4,x5,[x2,#64]	// in2_z
+	ldp	x6,x7,[x2,#64+16]
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x25,x8,x10
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z2sqr, in2_z);
+
+	ldp	x4,x5,[x22,#64]	// in1_z
+	ldp	x6,x7,[x22,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x2,x23,#64
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, Z2sqr, in2_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x22,#64
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x2,x22,#32
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, S1, in1_y);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#352]
+	ldp	x6,x7,[sp,#352+16]
+	add	x2,x23,#32
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,sp,#320
+	ldr	x3,[sp,#192]	// forward load for p256_mul_mont
+	ldp	x4,x5,[x22]
+	ldp	x6,x7,[x22,#16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, S1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x26,x14,x16	// ~is_equal(S1,S2)
+
+	add	x2,sp,#192
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U1, in1_x, Z2sqr);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[x23]
+	ldp	x6,x7,[x23,#16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in2_x, Z1sqr);
+
+	add	x2,sp,#256
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, U1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x14,x14,x16	// ~is_equal(U1,U2)
+
+	mvn	x27,x24	// -1/0 -> 0/-1
+	mvn	x28,x25	// -1/0 -> 0/-1
+	orr	x14,x14,x27
+	orr	x14,x14,x28
+	orr	x14,x14,x26
+	cbnz	x14,Ladd_proceed	// if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2))
+
+Ladd_double:
+	mov	x1,x22
+	mov	x0,x21
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	add	sp,sp,#256	// #256 is from #32*(12-4). difference in stack frames
+	b	Ldouble_shortcut
+
+.align	4
+Ladd_proceed:
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#64]
+	ldp	x6,x7,[sp,#64+16]
+	add	x2,x23,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, res_z, in2_z);
+
+	ldr	x3,[sp,#96]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,sp,#96
+	add	x0,sp,#224
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, U1, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#128
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#192
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#224
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#288
+	ldr	x3,[sp,#224]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,sp,#224
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S1, Hcub);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#160
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#352
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+Ladd_done:
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.globl	_ecp_nistz256_point_add_affine
+.private_extern	_ecp_nistz256_point_add_affine
+
+.align	5
+_ecp_nistz256_point_add_affine:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-80]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	sub	sp,sp,#32*10
+
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	ldp	x4,x5,[x1,#64]	// in1_z
+	ldp	x6,x7,[x1,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+
+	ldp	x14,x15,[x2]	// in2_x
+	ldp	x16,x17,[x2,#16]
+	ldp	x8,x9,[x2,#32]	// in2_y
+	ldp	x10,x11,[x2,#48]
+	orr	x14,x14,x15
+	orr	x16,x16,x17
+	orr	x8,x8,x9
+	orr	x10,x10,x11
+	orr	x14,x14,x16
+	orr	x8,x8,x10
+	orr	x25,x14,x8
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	ldr	x3,[x23]
+	add	x2,x23,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, Z1sqr, in2_x);
+
+	add	x2,x22,#0
+	ldr	x3,[x22,#64]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, in1_x);
+
+	add	x2,x22,#64
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#160]
+	ldp	x6,x7,[sp,#160+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x23,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,x22,#32
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, in1_y);
+
+	add	x0,sp,#224
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x0,sp,#288
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,sp,#160
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[x22]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,x22,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in1_x, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#224
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#288
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#256
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#96
+	ldr	x3,[x22,#32]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,x22,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, in1_y, Hcub);
+
+	ldr	x3,[sp,#192]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#192
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#128
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	adr	x23,Lone_mont-64
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x29,x30,[sp],#80
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_mul_mont(uint64_t res[4], uint64_t a[4],
+//                                uint64_t b[4]);
+.globl	_ecp_nistz256_ord_mul_mont
+.private_extern	_ecp_nistz256_ord_mul_mont
+
+.align	4
+_ecp_nistz256_ord_mul_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,Lord
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x19,x7,x3
+
+	mul	x24,x14,x23
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adc	x19,x19,xzr
+	mov	x20,xzr
+	ldr	x3,[x2,#8*1]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*2]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*3]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	lsl	x8,x24,#32		// last reduction
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
+//                                int rep);
+.globl	_ecp_nistz256_ord_sqr_mont
+.private_extern	_ecp_nistz256_ord_sqr_mont
+
+.align	4
+_ecp_nistz256_ord_sqr_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,Lord
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+	b	Loop_ord_sqr
+
+.align	4
+Loop_ord_sqr:
+	sub	x2,x2,#1
+	////////////////////////////////////////////////////////////////
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x3,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	mul	x24,x14,x23
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	adcs	x1,x1,x11
+	adc	x3,x3,x7
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	mul	x24,x14,x23
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x3
+	adc	x19,xzr,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x4,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x5,x15,x9,lo
+	csel	x6,x16,x10,lo
+	csel	x7,x17,x11,lo
+
+	cbnz	x2,Loop_ord_sqr
+
+	stp	x4,x5,[x0]
+	stp	x6,x7,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index);
+.globl	_ecp_nistz256_select_w5
+.private_extern	_ecp_nistz256_select_w5
+
+.align	4
+_ecp_nistz256_select_w5:
+	AARCH64_VALID_CALL_TARGET
+
+    // x10 := x0
+    // w9 := 0; loop counter and incremented internal index
+	mov	x10, x0
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+	movi	v20.16b, #0
+	movi	v21.16b, #0
+
+Lselect_w5_loop:
+    // Loop 16 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v27] := Load a (3*256-bit = 6*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // continue loading ...
+	ld1	{v26.2d, v27.2d}, [x1],#32
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+	bit	v20.16b, v26.16b, v3.16b
+	bit	v21.16b, v27.16b, v3.16b
+
+    // If bit #4 is not 0 (i.e. idx_ctr < 16) loop back
+	tbz	w9, #4, Lselect_w5_loop
+
+    // Write [v16-v21] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x10],#64
+	st1	{v20.2d, v21.2d}, [x10]
+
+	ret
+
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index);
+.globl	_ecp_nistz256_select_w7
+.private_extern	_ecp_nistz256_select_w7
+
+.align	4
+_ecp_nistz256_select_w7:
+	AARCH64_VALID_CALL_TARGET
+
+    // w9 := 0; loop counter and incremented internal index
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+
+Lselect_w7_loop:
+    // Loop 64 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v25] := Load a (2*256-bit = 4*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+    // If bit #6 is not 0 (i.e. idx_ctr < 64) loop back
+	tbz	w9, #6, Lselect_w7_loop
+
+    // Write [v16-v19] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x0]
+
+	ret
+
+#endif  // !OPENSSL_NO_ASM
diff --git a/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
new file mode 100644
index 0000000..317b813
--- /dev/null
+++ b/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
@@ -0,0 +1,317 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.globl	_beeu_mod_inverse_vartime
+.private_extern	_beeu_mod_inverse_vartime
+
+.align	4
+_beeu_mod_inverse_vartime:
+    // Reserve enough space for 14 8-byte registers on the stack
+    // in the first stp call for x29, x30.
+    // Then store the remaining callee-saved registers.
+    //
+    //    | x29 | x30 | x19 | x20 | ... | x27 | x28 |  x0 |  x2 |
+    //    ^                                                     ^
+    //    sp  <------------------- 112 bytes ----------------> old sp
+    //   x29 (FP)
+    //
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-112]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	stp	x0,x2,[sp,#96]
+
+    // B = b3..b0 := a
+	ldp	x25,x26,[x1]
+	ldp	x27,x28,[x1,#16]
+
+    // n3..n0 := n
+    // Note: the value of input params are changed in the following.
+	ldp	x0,x1,[x2]
+	ldp	x2,x30,[x2,#16]
+
+    // A = a3..a0 := n
+	mov	x21, x0
+	mov	x22, x1
+	mov	x23, x2
+	mov	x24, x30
+
+    // X = x4..x0 := 1
+	mov	x3, #1
+	eor	x4, x4, x4
+	eor	x5, x5, x5
+	eor	x6, x6, x6
+	eor	x7, x7, x7
+
+    // Y = y4..y0 := 0
+	eor	x8, x8, x8
+	eor	x9, x9, x9
+	eor	x10, x10, x10
+	eor	x11, x11, x11
+	eor	x12, x12, x12
+
+Lbeeu_loop:
+    // if B == 0, jump to .Lbeeu_loop_end
+	orr	x14, x25, x26
+	orr	x14, x14, x27
+
+    // reverse the bit order of x25. This is needed for clz after this macro
+	rbit	x15, x25
+
+	orr	x14, x14, x28
+	cbz	x14,Lbeeu_loop_end
+
+
+    // 0 < B < |n|,
+    // 0 < A <= |n|,
+    // (1)      X*a  ==  B   (mod |n|),
+    // (2) (-1)*Y*a  ==  A   (mod |n|)
+
+    // Now divide B by the maximum possible power of two in the
+    // integers, and divide X by the same value mod |n|.
+    // When we're done, (1) still holds.
+
+    // shift := number of trailing 0s in x25
+    // (      = number of leading 0s in x15; see the "rbit" instruction in TEST_B_ZERO)
+	clz	x13, x15
+
+    // If there is no shift, goto shift_A_Y
+	cbz	x13, Lbeeu_shift_A_Y
+
+    // Shift B right by "x13" bits
+	neg	x14, x13
+	lsr	x25, x25, x13
+	lsl	x15, x26, x14
+
+	lsr	x26, x26, x13
+	lsl	x19, x27, x14
+
+	orr	x25, x25, x15
+
+	lsr	x27, x27, x13
+	lsl	x20, x28, x14
+
+	orr	x26, x26, x19
+
+	lsr	x28, x28, x13
+
+	orr	x27, x27, x20
+
+
+    // Shift X right by "x13" bits, adding n whenever X becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+Lbeeu_shift_loop_X:
+	tbz	x3, #0, Lshift1_0
+	adds	x3, x3, x0
+	adcs	x4, x4, x1
+	adcs	x5, x5, x2
+	adcs	x6, x6, x30
+	adc	x7, x7, x14
+Lshift1_0:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x3, x4, x3, #1
+	extr	x4, x5, x4, #1
+	extr	x5, x6, x5, #1
+	extr	x6, x7, x6, #1
+	lsr	x7, x7, #1
+
+	subs	x13, x13, #1
+	bne	Lbeeu_shift_loop_X
+
+    // Note: the steps above perform the same sequence as in p256_beeu-x86_64-asm.pl
+    // with the following differences:
+    // - "x13" is set directly to the number of trailing 0s in B
+    //   (using rbit and clz instructions)
+    // - The loop is only used to call SHIFT1(X)
+    //   and x13 is decreased while executing the X loop.
+    // - SHIFT256(B, x13) is performed before right-shifting X; they are independent
+
+Lbeeu_shift_A_Y:
+    // Same for A and Y.
+    // Afterwards, (2) still holds.
+    // Reverse the bit order of x21
+    // x13 := number of trailing 0s in x21 (= number of leading 0s in x15)
+	rbit	x15, x21
+	clz	x13, x15
+
+    // If there is no shift, goto |B-A|, X+Y update
+	cbz	x13, Lbeeu_update_B_X_or_A_Y
+
+    // Shift A right by "x13" bits
+	neg	x14, x13
+	lsr	x21, x21, x13
+	lsl	x15, x22, x14
+
+	lsr	x22, x22, x13
+	lsl	x19, x23, x14
+
+	orr	x21, x21, x15
+
+	lsr	x23, x23, x13
+	lsl	x20, x24, x14
+
+	orr	x22, x22, x19
+
+	lsr	x24, x24, x13
+
+	orr	x23, x23, x20
+
+
+    // Shift Y right by "x13" bits, adding n whenever Y becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+Lbeeu_shift_loop_Y:
+	tbz	x8, #0, Lshift1_1
+	adds	x8, x8, x0
+	adcs	x9, x9, x1
+	adcs	x10, x10, x2
+	adcs	x11, x11, x30
+	adc	x12, x12, x14
+Lshift1_1:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x8, x9, x8, #1
+	extr	x9, x10, x9, #1
+	extr	x10, x11, x10, #1
+	extr	x11, x12, x11, #1
+	lsr	x12, x12, #1
+
+	subs	x13, x13, #1
+	bne	Lbeeu_shift_loop_Y
+
+Lbeeu_update_B_X_or_A_Y:
+    // Try T := B - A; if cs, continue with B > A (cs: carry set = no borrow)
+    // Note: this is a case of unsigned arithmetic, where T fits in 4 64-bit words
+    //       without taking a sign bit if generated. The lack of a carry would
+    //       indicate a negative result. See, for example,
+    //       https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/condition-codes-1-condition-flags-and-codes
+	subs	x14, x25, x21
+	sbcs	x15, x26, x22
+	sbcs	x19, x27, x23
+	sbcs	x20, x28, x24
+	bcs	Lbeeu_B_greater_than_A
+
+    // Else A > B =>
+    // A := A - B; Y := Y + X; goto beginning of the loop
+	subs	x21, x21, x25
+	sbcs	x22, x22, x26
+	sbcs	x23, x23, x27
+	sbcs	x24, x24, x28
+
+	adds	x8, x8, x3
+	adcs	x9, x9, x4
+	adcs	x10, x10, x5
+	adcs	x11, x11, x6
+	adc	x12, x12, x7
+	b	Lbeeu_loop
+
+Lbeeu_B_greater_than_A:
+    // Continue with B > A =>
+    // B := B - A; X := X + Y; goto beginning of the loop
+	mov	x25, x14
+	mov	x26, x15
+	mov	x27, x19
+	mov	x28, x20
+
+	adds	x3, x3, x8
+	adcs	x4, x4, x9
+	adcs	x5, x5, x10
+	adcs	x6, x6, x11
+	adc	x7, x7, x12
+	b	Lbeeu_loop
+
+Lbeeu_loop_end:
+    // The Euclid's algorithm loop ends when A == gcd(a,n);
+    // this would be 1, when a and n are co-prime (i.e. do not have a common factor).
+    // Since (-1)*Y*a == A (mod |n|), Y>0
+    // then out = -Y mod n
+
+    // Verify that A = 1 ==> (-1)*Y*a = A = 1  (mod |n|)
+    // Is A-1 == 0?
+    // If not, fail.
+	sub	x14, x21, #1
+	orr	x14, x14, x22
+	orr	x14, x14, x23
+	orr	x14, x14, x24
+	cbnz	x14, Lbeeu_err
+
+    // If Y>n ==> Y:=Y-n
+Lbeeu_reduction_loop:
+    // x_i := y_i - n_i (X is no longer needed, use it as temp)
+    // (x14 = 0 from above)
+	subs	x3, x8, x0
+	sbcs	x4, x9, x1
+	sbcs	x5, x10, x2
+	sbcs	x6, x11, x30
+	sbcs	x7, x12, x14
+
+    // If result is non-negative (i.e., cs = carry set = no borrow),
+    // y_i := x_i; goto reduce again
+    // else
+    // y_i := y_i; continue
+	csel	x8, x3, x8, cs
+	csel	x9, x4, x9, cs
+	csel	x10, x5, x10, cs
+	csel	x11, x6, x11, cs
+	csel	x12, x7, x12, cs
+	bcs	Lbeeu_reduction_loop
+
+    // Now Y < n (Y cannot be equal to n, since the inverse cannot be 0)
+    // out = -Y = n-Y
+	subs	x8, x0, x8
+	sbcs	x9, x1, x9
+	sbcs	x10, x2, x10
+	sbcs	x11, x30, x11
+
+    // Save Y in output (out (x0) was saved on the stack)
+	ldr	x3, [sp,#96]
+	stp	x8, x9, [x3]
+	stp	x10, x11, [x3,#16]
+    // return 1 (success)
+	mov	x0, #1
+	b	Lbeeu_finish
+
+Lbeeu_err:
+    // return 0 (error)
+	eor	x0, x0, x0
+
+Lbeeu_finish:
+    // Restore callee-saved registers, except x0, x2
+	add	sp,x29,#0
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldp	x25,x26,[sp,#64]
+	ldp	x27,x28,[sp,#80]
+	ldp	x29,x30,[sp],#112
+
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+#endif  // !OPENSSL_NO_ASM
diff --git a/ios-aarch64/crypto/fipsmodule/sha1-armv8.S b/apple-aarch64/crypto/fipsmodule/sha1-armv8.S
similarity index 99%
rename from ios-aarch64/crypto/fipsmodule/sha1-armv8.S
rename to apple-aarch64/crypto/fipsmodule/sha1-armv8.S
index 05eb920..62ba800 100644
--- a/ios-aarch64/crypto/fipsmodule/sha1-armv8.S
+++ b/apple-aarch64/crypto/fipsmodule/sha1-armv8.S
@@ -51,7 +51,7 @@
 	movz	w28,#0x7999
 	sub	x2,x2,#1
 	movk	w28,#0x5a82,lsl#16
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x3,x3,#32
 #else
 	rev32	x3,x3
@@ -69,7 +69,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w4	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x5,x5,#32
 #else
 	rev32	x5,x5
@@ -94,7 +94,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w6	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x7,x7,#32
 #else
 	rev32	x7,x7
@@ -119,7 +119,7 @@
 	ror	w22,w22,#2
 	add	w24,w24,w8	// future e+=X[i]
 	add	w20,w20,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x9,x9,#32
 #else
 	rev32	x9,x9
@@ -144,7 +144,7 @@
 	ror	w20,w20,#2
 	add	w22,w22,w10	// future e+=X[i]
 	add	w23,w23,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x11,x11,#32
 #else
 	rev32	x11,x11
@@ -169,7 +169,7 @@
 	ror	w23,w23,#2
 	add	w20,w20,w12	// future e+=X[i]
 	add	w21,w21,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x13,x13,#32
 #else
 	rev32	x13,x13
@@ -194,7 +194,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w14	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x15,x15,#32
 #else
 	rev32	x15,x15
@@ -219,7 +219,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w16	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x17,x17,#32
 #else
 	rev32	x17,x17
diff --git a/ios-aarch64/crypto/fipsmodule/sha256-armv8.S b/apple-aarch64/crypto/fipsmodule/sha256-armv8.S
similarity index 98%
rename from ios-aarch64/crypto/fipsmodule/sha256-armv8.S
rename to apple-aarch64/crypto/fipsmodule/sha256-armv8.S
index c9b7991..b40b260 100644
--- a/ios-aarch64/crypto/fipsmodule/sha256-armv8.S
+++ b/apple-aarch64/crypto/fipsmodule/sha256-armv8.S
@@ -12,7 +12,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -40,6 +40,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -48,7 +49,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -100,7 +101,7 @@
 	ldr	w19,[x30],#4			// *K++
 	eor	w28,w21,w22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w3,w3			// 0
 #endif
 	ror	w16,w24,#6
@@ -123,7 +124,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w4,w4			// 1
 #endif
 	ldp	w5,w6,[x1],#2*4
@@ -148,7 +149,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w5,w5			// 2
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -172,7 +173,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w6,w6			// 3
 #endif
 	ldp	w7,w8,[x1],#2*4
@@ -197,7 +198,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w7,w7			// 4
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -221,7 +222,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w8,w8			// 5
 #endif
 	ldp	w9,w10,[x1],#2*4
@@ -246,7 +247,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w9,w9			// 6
 #endif
 	add	w22,w22,w17			// h+=Sigma0(a)
@@ -270,7 +271,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w10,w10			// 7
 #endif
 	ldp	w11,w12,[x1],#2*4
@@ -295,7 +296,7 @@
 	add	w20,w20,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w20,w20,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w11,w11			// 8
 #endif
 	add	w20,w20,w17			// h+=Sigma0(a)
@@ -319,7 +320,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w12,w12			// 9
 #endif
 	ldp	w13,w14,[x1],#2*4
@@ -344,7 +345,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w13,w13			// 10
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -368,7 +369,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w14,w14			// 11
 #endif
 	ldp	w15,w0,[x1],#2*4
@@ -394,7 +395,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w15,w15			// 12
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -419,7 +420,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w0,w0			// 13
 #endif
 	ldp	w1,w2,[x1]
@@ -445,7 +446,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w1,w1			// 14
 #endif
 	ldr	w6,[sp,#12]
@@ -471,7 +472,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w2,w2			// 15
 #endif
 	ldr	w7,[sp,#0]
diff --git a/ios-aarch64/crypto/fipsmodule/sha512-armv8.S b/apple-aarch64/crypto/fipsmodule/sha512-armv8.S
similarity index 61%
rename from ios-aarch64/crypto/fipsmodule/sha512-armv8.S
rename to apple-aarch64/crypto/fipsmodule/sha512-armv8.S
index 97b3230..b2d366d 100644
--- a/ios-aarch64/crypto/fipsmodule/sha512-armv8.S
+++ b/apple-aarch64/crypto/fipsmodule/sha512-armv8.S
@@ -12,7 +12,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -40,6 +40,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -48,7 +49,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -64,6 +65,17 @@
 
 .align	6
 _sha512_block_data_order:
+	AARCH64_VALID_CALL_TARGET
+#ifndef	__KERNEL__
+#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
+	adrp	x16,:pg_hi21_nc:_OPENSSL_armcap_P
+#else
+	adrp	x16,_OPENSSL_armcap_P@PAGE
+#endif
+	ldr	w16,[x16,_OPENSSL_armcap_P@PAGEOFF]
+	tst	w16,#ARMV8_SHA512
+	b.ne	Lv8_entry
+#endif
 	AARCH64_SIGN_LINK_REGISTER
 	stp	x29,x30,[sp,#-128]!
 	add	x29,sp,#0
@@ -89,7 +101,7 @@
 	ldr	x19,[x30],#8			// *K++
 	eor	x28,x21,x22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x3,x3			// 0
 #endif
 	ror	x16,x24,#14
@@ -112,7 +124,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x4,x4			// 1
 #endif
 	ldp	x5,x6,[x1],#2*8
@@ -137,7 +149,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x5,x5			// 2
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -161,7 +173,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x6,x6			// 3
 #endif
 	ldp	x7,x8,[x1],#2*8
@@ -186,7 +198,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x7,x7			// 4
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -210,7 +222,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x8,x8			// 5
 #endif
 	ldp	x9,x10,[x1],#2*8
@@ -235,7 +247,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x9,x9			// 6
 #endif
 	add	x22,x22,x17			// h+=Sigma0(a)
@@ -259,7 +271,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x10,x10			// 7
 #endif
 	ldp	x11,x12,[x1],#2*8
@@ -284,7 +296,7 @@
 	add	x20,x20,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x20,x20,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x11,x11			// 8
 #endif
 	add	x20,x20,x17			// h+=Sigma0(a)
@@ -308,7 +320,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x12,x12			// 9
 #endif
 	ldp	x13,x14,[x1],#2*8
@@ -333,7 +345,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x13,x13			// 10
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -357,7 +369,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x14,x14			// 11
 #endif
 	ldp	x15,x0,[x1],#2*8
@@ -383,7 +395,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x15,x15			// 12
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -408,7 +420,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x0,x0			// 13
 #endif
 	ldp	x1,x2,[x1]
@@ -434,7 +446,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x1,x1			// 14
 #endif
 	ldr	x6,[sp,#24]
@@ -460,7 +472,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x2,x2			// 15
 #endif
 	ldr	x7,[sp,#0]
@@ -1078,4 +1090,525 @@
 .byte	83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 .align	2
 .align	2
+.text
+#ifndef	__KERNEL__
+
+.align	6
+sha512_block_armv8:
+Lv8_entry:
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ld1	{v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64	// load input
+	ld1	{v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
+
+	ld1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// load context
+	adrp	x3,LK512@PAGE
+	add	x3,x3,LK512@PAGEOFF
+
+	rev64	v16.16b,v16.16b
+	rev64	v17.16b,v17.16b
+	rev64	v18.16b,v18.16b
+	rev64	v19.16b,v19.16b
+	rev64	v20.16b,v20.16b
+	rev64	v21.16b,v21.16b
+	rev64	v22.16b,v22.16b
+	rev64	v23.16b,v23.16b
+	b	Loop_hw
+
+.align	4
+Loop_hw:
+	ld1	{v24.2d},[x3],#16
+	subs	x2,x2,#1
+	sub	x4,x1,#128
+	orr	v26.16b,v0.16b,v0.16b			// offload
+	orr	v27.16b,v1.16b,v1.16b
+	orr	v28.16b,v2.16b,v2.16b
+	orr	v29.16b,v3.16b,v3.16b
+	csel	x1,x1,x4,ne			// conditional rewind
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v16.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v16.16b,v16.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v17.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v17.16b,v17.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v18.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v18.16b,v18.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v19.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+	rev64	v19.16b,v19.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v20.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+	rev64	v20.16b,v20.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v21.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v21.16b,v21.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v22.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v22.16b,v22.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	sub	x3,x3,#80*8	// rewind
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v23.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v23.16b,v23.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v0.2d,v0.2d,v26.2d			// accumulate
+	add	v1.2d,v1.2d,v27.2d
+	add	v2.2d,v2.2d,v28.2d
+	add	v3.2d,v3.2d,v29.2d
+
+	cbnz	x2,Loop_hw
+
+	st1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// store context
+
+	ldr	x29,[sp],#16
+	ret
+
+#endif
 #endif  // !OPENSSL_NO_ASM
diff --git a/ios-aarch64/crypto/fipsmodule/vpaes-armv8.S b/apple-aarch64/crypto/fipsmodule/vpaes-armv8.S
similarity index 100%
rename from ios-aarch64/crypto/fipsmodule/vpaes-armv8.S
rename to apple-aarch64/crypto/fipsmodule/vpaes-armv8.S
diff --git a/ios-aarch64/crypto/test/trampoline-armv8.S b/apple-aarch64/crypto/test/trampoline-armv8.S
similarity index 100%
rename from ios-aarch64/crypto/test/trampoline-armv8.S
rename to apple-aarch64/crypto/test/trampoline-armv8.S
diff --git a/ios-arm/crypto/chacha/chacha-armv4.S b/apple-arm/crypto/chacha/chacha-armv4.S
similarity index 100%
rename from ios-arm/crypto/chacha/chacha-armv4.S
rename to apple-arm/crypto/chacha/chacha-armv4.S
diff --git a/ios-arm/crypto/fipsmodule/aesv8-armx32.S b/apple-arm/crypto/fipsmodule/aesv8-armx32.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/aesv8-armx32.S
rename to apple-arm/crypto/fipsmodule/aesv8-armx32.S
diff --git a/ios-arm/crypto/fipsmodule/armv4-mont.S b/apple-arm/crypto/fipsmodule/armv4-mont.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/armv4-mont.S
rename to apple-arm/crypto/fipsmodule/armv4-mont.S
diff --git a/ios-arm/crypto/fipsmodule/bsaes-armv7.S b/apple-arm/crypto/fipsmodule/bsaes-armv7.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/bsaes-armv7.S
rename to apple-arm/crypto/fipsmodule/bsaes-armv7.S
diff --git a/ios-arm/crypto/fipsmodule/ghash-armv4.S b/apple-arm/crypto/fipsmodule/ghash-armv4.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/ghash-armv4.S
rename to apple-arm/crypto/fipsmodule/ghash-armv4.S
diff --git a/ios-arm/crypto/fipsmodule/ghashv8-armx32.S b/apple-arm/crypto/fipsmodule/ghashv8-armx32.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/ghashv8-armx32.S
rename to apple-arm/crypto/fipsmodule/ghashv8-armx32.S
diff --git a/ios-arm/crypto/fipsmodule/sha1-armv4-large.S b/apple-arm/crypto/fipsmodule/sha1-armv4-large.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/sha1-armv4-large.S
rename to apple-arm/crypto/fipsmodule/sha1-armv4-large.S
diff --git a/ios-arm/crypto/fipsmodule/sha256-armv4.S b/apple-arm/crypto/fipsmodule/sha256-armv4.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/sha256-armv4.S
rename to apple-arm/crypto/fipsmodule/sha256-armv4.S
diff --git a/ios-arm/crypto/fipsmodule/sha512-armv4.S b/apple-arm/crypto/fipsmodule/sha512-armv4.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/sha512-armv4.S
rename to apple-arm/crypto/fipsmodule/sha512-armv4.S
diff --git a/ios-arm/crypto/fipsmodule/vpaes-armv7.S b/apple-arm/crypto/fipsmodule/vpaes-armv7.S
similarity index 100%
rename from ios-arm/crypto/fipsmodule/vpaes-armv7.S
rename to apple-arm/crypto/fipsmodule/vpaes-armv7.S
diff --git a/ios-arm/crypto/test/trampoline-armv4.S b/apple-arm/crypto/test/trampoline-armv4.S
similarity index 100%
rename from ios-arm/crypto/test/trampoline-armv4.S
rename to apple-arm/crypto/test/trampoline-armv4.S
diff --git a/mac-x86/crypto/chacha/chacha-x86.S b/apple-x86/crypto/chacha/chacha-x86.S
similarity index 100%
rename from mac-x86/crypto/chacha/chacha-x86.S
rename to apple-x86/crypto/chacha/chacha-x86.S
diff --git a/mac-x86/crypto/fipsmodule/aesni-x86.S b/apple-x86/crypto/fipsmodule/aesni-x86.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/aesni-x86.S
rename to apple-x86/crypto/fipsmodule/aesni-x86.S
diff --git a/mac-x86/crypto/fipsmodule/bn-586.S b/apple-x86/crypto/fipsmodule/bn-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/bn-586.S
rename to apple-x86/crypto/fipsmodule/bn-586.S
diff --git a/mac-x86/crypto/fipsmodule/co-586.S b/apple-x86/crypto/fipsmodule/co-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/co-586.S
rename to apple-x86/crypto/fipsmodule/co-586.S
diff --git a/mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S b/apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S
rename to apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S
diff --git a/mac-x86/crypto/fipsmodule/ghash-x86.S b/apple-x86/crypto/fipsmodule/ghash-x86.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/ghash-x86.S
rename to apple-x86/crypto/fipsmodule/ghash-x86.S
diff --git a/mac-x86/crypto/fipsmodule/md5-586.S b/apple-x86/crypto/fipsmodule/md5-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/md5-586.S
rename to apple-x86/crypto/fipsmodule/md5-586.S
diff --git a/mac-x86/crypto/fipsmodule/sha1-586.S b/apple-x86/crypto/fipsmodule/sha1-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/sha1-586.S
rename to apple-x86/crypto/fipsmodule/sha1-586.S
diff --git a/mac-x86/crypto/fipsmodule/sha256-586.S b/apple-x86/crypto/fipsmodule/sha256-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/sha256-586.S
rename to apple-x86/crypto/fipsmodule/sha256-586.S
diff --git a/mac-x86/crypto/fipsmodule/sha512-586.S b/apple-x86/crypto/fipsmodule/sha512-586.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/sha512-586.S
rename to apple-x86/crypto/fipsmodule/sha512-586.S
diff --git a/mac-x86/crypto/fipsmodule/vpaes-x86.S b/apple-x86/crypto/fipsmodule/vpaes-x86.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/vpaes-x86.S
rename to apple-x86/crypto/fipsmodule/vpaes-x86.S
diff --git a/mac-x86/crypto/fipsmodule/x86-mont.S b/apple-x86/crypto/fipsmodule/x86-mont.S
similarity index 100%
rename from mac-x86/crypto/fipsmodule/x86-mont.S
rename to apple-x86/crypto/fipsmodule/x86-mont.S
diff --git a/mac-x86/crypto/test/trampoline-x86.S b/apple-x86/crypto/test/trampoline-x86.S
similarity index 100%
rename from mac-x86/crypto/test/trampoline-x86.S
rename to apple-x86/crypto/test/trampoline-x86.S
diff --git a/mac-x86_64/crypto/chacha/chacha-x86_64.S b/apple-x86_64/crypto/chacha/chacha-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/chacha/chacha-x86_64.S
rename to apple-x86_64/crypto/chacha/chacha-x86_64.S
diff --git a/mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S b/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S
rename to apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S
diff --git a/mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S b/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S
rename to apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S b/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S b/apple-x86_64/crypto/fipsmodule/aesni-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/aesni-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S b/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/ghash-x86_64.S b/apple-x86_64/crypto/fipsmodule/ghash-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/ghash-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/ghash-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/md5-x86_64.S b/apple-x86_64/crypto/fipsmodule/md5-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/md5-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/md5-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S b/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
rename to apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
diff --git a/mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S b/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
rename to apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
diff --git a/mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S b/apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/rsaz-avx2.S b/apple-x86_64/crypto/fipsmodule/rsaz-avx2.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/rsaz-avx2.S
rename to apple-x86_64/crypto/fipsmodule/rsaz-avx2.S
diff --git a/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S b/apple-x86_64/crypto/fipsmodule/sha1-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/sha1-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S b/apple-x86_64/crypto/fipsmodule/sha256-x86_64.S
similarity index 93%
rename from mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/sha256-x86_64.S
index d94268d..00dc01c 100644
--- a/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
+++ b/apple-x86_64/crypto/fipsmodule/sha256-x86_64.S
@@ -24,6 +24,8 @@
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
+	testl	$536870912,%r11d
+	jnz	L$shaext_shortcut
 	andl	$1073741824,%r9d
 	andl	$268435968,%r10d
 	orl	%r9d,%r10d
@@ -1782,6 +1784,215 @@
 .byte	83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 
 .p2align	6
+sha256_block_data_order_shaext:
+
+L$shaext_shortcut:
+	leaq	K256+128(%rip),%rcx
+	movdqu	(%rdi),%xmm1
+	movdqu	16(%rdi),%xmm2
+	movdqa	512-128(%rcx),%xmm7
+
+	pshufd	$0x1b,%xmm1,%xmm0
+	pshufd	$0xb1,%xmm1,%xmm1
+	pshufd	$0x1b,%xmm2,%xmm2
+	movdqa	%xmm7,%xmm8
+.byte	102,15,58,15,202,8
+	punpcklqdq	%xmm0,%xmm2
+	jmp	L$oop_shaext
+
+.p2align	4
+L$oop_shaext:
+	movdqu	(%rsi),%xmm3
+	movdqu	16(%rsi),%xmm4
+	movdqu	32(%rsi),%xmm5
+.byte	102,15,56,0,223
+	movdqu	48(%rsi),%xmm6
+
+	movdqa	0-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	102,15,56,0,231
+	movdqa	%xmm2,%xmm10
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	nop
+	movdqa	%xmm1,%xmm9
+.byte	15,56,203,202
+
+	movdqa	32-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	102,15,56,0,239
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	leaq	64(%rsi),%rsi
+.byte	15,56,204,220
+.byte	15,56,203,202
+
+	movdqa	64-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	102,15,56,0,247
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+
+	movdqa	96-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	128-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	160-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+	nop
+	paddd	%xmm7,%xmm6
+.byte	15,56,204,220
+.byte	15,56,203,202
+	movdqa	192-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,205,245
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+	movdqa	224-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	256-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	288-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+	nop
+	paddd	%xmm7,%xmm6
+.byte	15,56,204,220
+.byte	15,56,203,202
+	movdqa	320-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,205,245
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+	movdqa	352-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	384-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	416-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+.byte	15,56,203,202
+	paddd	%xmm7,%xmm6
+
+	movdqa	448-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+.byte	15,56,205,245
+	movdqa	%xmm8,%xmm7
+.byte	15,56,203,202
+
+	movdqa	480-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+	nop
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	decq	%rdx
+	nop
+.byte	15,56,203,202
+
+	paddd	%xmm10,%xmm2
+	paddd	%xmm9,%xmm1
+	jnz	L$oop_shaext
+
+	pshufd	$0xb1,%xmm2,%xmm2
+	pshufd	$0x1b,%xmm1,%xmm7
+	pshufd	$0xb1,%xmm1,%xmm1
+	punpckhqdq	%xmm2,%xmm1
+.byte	102,15,58,15,215,8
+
+	movdqu	%xmm1,(%rdi)
+	movdqu	%xmm2,16(%rdi)
+	.byte	0xf3,0xc3
+
+
+
+.p2align	6
 sha256_block_data_order_ssse3:
 
 L$ssse3_shortcut:
diff --git a/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S b/apple-x86_64/crypto/fipsmodule/sha512-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/sha512-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/sha512-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S b/apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S
rename to apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S
diff --git a/mac-x86_64/crypto/fipsmodule/x86_64-mont.S b/apple-x86_64/crypto/fipsmodule/x86_64-mont.S
similarity index 100%
rename from mac-x86_64/crypto/fipsmodule/x86_64-mont.S
rename to apple-x86_64/crypto/fipsmodule/x86_64-mont.S
diff --git a/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S b/apple-x86_64/crypto/fipsmodule/x86_64-mont5.S
similarity index 95%
rename from mac-x86_64/crypto/fipsmodule/x86_64-mont5.S
rename to apple-x86_64/crypto/fipsmodule/x86_64-mont5.S
index e1fd9c9..3a1768f 100644
--- a/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S
+++ b/apple-x86_64/crypto/fipsmodule/x86_64-mont5.S
@@ -2066,187 +2066,6 @@
 	.byte	0xf3,0xc3
 
 
-.globl	_bn_from_montgomery
-.private_extern _bn_from_montgomery
-
-.p2align	5
-_bn_from_montgomery:
-
-	testl	$7,%r9d
-	jz	bn_from_mont8x
-	xorl	%eax,%eax
-	.byte	0xf3,0xc3
-
-
-
-
-.p2align	5
-bn_from_mont8x:
-
-.byte	0x67
-	movq	%rsp,%rax
-
-	pushq	%rbx
-
-	pushq	%rbp
-
-	pushq	%r12
-
-	pushq	%r13
-
-	pushq	%r14
-
-	pushq	%r15
-
-L$from_prologue:
-
-	shll	$3,%r9d
-	leaq	(%r9,%r9,2),%r10
-	negq	%r9
-	movq	(%r8),%r8
-
-
-
-
-
-
-
-
-	leaq	-320(%rsp,%r9,2),%r11
-	movq	%rsp,%rbp
-	subq	%rdi,%r11
-	andq	$4095,%r11
-	cmpq	%r11,%r10
-	jb	L$from_sp_alt
-	subq	%r11,%rbp
-	leaq	-320(%rbp,%r9,2),%rbp
-	jmp	L$from_sp_done
-
-.p2align	5
-L$from_sp_alt:
-	leaq	4096-320(,%r9,2),%r10
-	leaq	-320(%rbp,%r9,2),%rbp
-	subq	%r10,%r11
-	movq	$0,%r10
-	cmovcq	%r10,%r11
-	subq	%r11,%rbp
-L$from_sp_done:
-	andq	$-64,%rbp
-	movq	%rsp,%r11
-	subq	%rbp,%r11
-	andq	$-4096,%r11
-	leaq	(%r11,%rbp,1),%rsp
-	movq	(%rsp),%r10
-	cmpq	%rbp,%rsp
-	ja	L$from_page_walk
-	jmp	L$from_page_walk_done
-
-L$from_page_walk:
-	leaq	-4096(%rsp),%rsp
-	movq	(%rsp),%r10
-	cmpq	%rbp,%rsp
-	ja	L$from_page_walk
-L$from_page_walk_done:
-
-	movq	%r9,%r10
-	negq	%r9
-
-
-
-
-
-
-
-
-
-
-	movq	%r8,32(%rsp)
-	movq	%rax,40(%rsp)
-
-L$from_body:
-	movq	%r9,%r11
-	leaq	48(%rsp),%rax
-	pxor	%xmm0,%xmm0
-	jmp	L$mul_by_1
-
-.p2align	5
-L$mul_by_1:
-	movdqu	(%rsi),%xmm1
-	movdqu	16(%rsi),%xmm2
-	movdqu	32(%rsi),%xmm3
-	movdqa	%xmm0,(%rax,%r9,1)
-	movdqu	48(%rsi),%xmm4
-	movdqa	%xmm0,16(%rax,%r9,1)
-.byte	0x48,0x8d,0xb6,0x40,0x00,0x00,0x00
-	movdqa	%xmm1,(%rax)
-	movdqa	%xmm0,32(%rax,%r9,1)
-	movdqa	%xmm2,16(%rax)
-	movdqa	%xmm0,48(%rax,%r9,1)
-	movdqa	%xmm3,32(%rax)
-	movdqa	%xmm4,48(%rax)
-	leaq	64(%rax),%rax
-	subq	$64,%r11
-	jnz	L$mul_by_1
-
-.byte	102,72,15,110,207
-.byte	102,72,15,110,209
-.byte	0x67
-	movq	%rcx,%rbp
-.byte	102,73,15,110,218
-	leaq	_OPENSSL_ia32cap_P(%rip),%r11
-	movl	8(%r11),%r11d
-	andl	$0x80108,%r11d
-	cmpl	$0x80108,%r11d
-	jne	L$from_mont_nox
-
-	leaq	(%rax,%r9,1),%rdi
-	call	__bn_sqrx8x_reduction
-	call	__bn_postx4x_internal
-
-	pxor	%xmm0,%xmm0
-	leaq	48(%rsp),%rax
-	jmp	L$from_mont_zero
-
-.p2align	5
-L$from_mont_nox:
-	call	__bn_sqr8x_reduction
-	call	__bn_post4x_internal
-
-	pxor	%xmm0,%xmm0
-	leaq	48(%rsp),%rax
-	jmp	L$from_mont_zero
-
-.p2align	5
-L$from_mont_zero:
-	movq	40(%rsp),%rsi
-
-	movdqa	%xmm0,0(%rax)
-	movdqa	%xmm0,16(%rax)
-	movdqa	%xmm0,32(%rax)
-	movdqa	%xmm0,48(%rax)
-	leaq	64(%rax),%rax
-	subq	$32,%r9
-	jnz	L$from_mont_zero
-
-	movq	$1,%rax
-	movq	-48(%rsi),%r15
-
-	movq	-40(%rsi),%r14
-
-	movq	-32(%rsi),%r13
-
-	movq	-24(%rsi),%r12
-
-	movq	-16(%rsi),%rbp
-
-	movq	-8(%rsi),%rbx
-
-	leaq	(%rsi),%rsp
-
-L$from_epilogue:
-	.byte	0xf3,0xc3
-
-
 
 .p2align	5
 bn_mulx4x_mont_gather5:
diff --git a/mac-x86_64/crypto/test/trampoline-x86_64.S b/apple-x86_64/crypto/test/trampoline-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/test/trampoline-x86_64.S
rename to apple-x86_64/crypto/test/trampoline-x86_64.S
diff --git a/crypto_test_data.cc b/crypto_test_data.cc
index b722b1e..9176469 100644
--- a/crypto_test_data.cc
+++ b/crypto_test_data.cc
@@ -19,6 +19,7 @@
  *       crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt \
  *       crypto/cipher_extra/test/aes_128_ccm_bluetooth_tests.txt \
  *       crypto/cipher_extra/test/aes_128_ccm_bluetooth_8_tests.txt \
+ *       crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt \
  *       crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt \
  *       crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt \
  *       crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt \
@@ -46,18 +47,18 @@
  *       crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt \
  *       crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt \
  *       crypto/curve25519/ed25519_tests.txt \
- *       crypto/cmac/cavp_3des_cmac_tests.txt \
- *       crypto/cmac/cavp_aes128_cmac_tests.txt \
- *       crypto/cmac/cavp_aes192_cmac_tests.txt \
- *       crypto/cmac/cavp_aes256_cmac_tests.txt \
  *       crypto/ecdh_extra/ecdh_tests.txt \
  *       crypto/evp/evp_tests.txt \
  *       crypto/evp/scrypt_tests.txt \
  *       crypto/fipsmodule/aes/aes_tests.txt \
  *       crypto/fipsmodule/bn/bn_tests.txt \
  *       crypto/fipsmodule/bn/miller_rabin_tests.txt \
+ *       crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt \
+ *       crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt \
+ *       crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt \
+ *       crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt \
  *       crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt \
- *       crypto/fipsmodule/ec/p256-x86_64_tests.txt \
+ *       crypto/fipsmodule/ec/p256-nistz_tests.txt \
  *       crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt \
  *       crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt \
  *       crypto/fipsmodule/modes/gcm_tests.txt \
@@ -109,6 +110,21 @@
  *       crypto/x509/test/many_names1.pem \
  *       crypto/x509/test/many_names2.pem \
  *       crypto/x509/test/many_names3.pem \
+ *       crypto/x509/test/pss_sha1_explicit.pem \
+ *       crypto/x509/test/pss_sha1_mgf1_syntax_error.pem \
+ *       crypto/x509/test/pss_sha1.pem \
+ *       crypto/x509/test/pss_sha224.pem \
+ *       crypto/x509/test/pss_sha256_explicit_trailer.pem \
+ *       crypto/x509/test/pss_sha256_mgf1_sha384.pem \
+ *       crypto/x509/test/pss_sha256_mgf1_syntax_error.pem \
+ *       crypto/x509/test/pss_sha256_omit_nulls.pem \
+ *       crypto/x509/test/pss_sha256_salt_overflow.pem \
+ *       crypto/x509/test/pss_sha256_salt31.pem \
+ *       crypto/x509/test/pss_sha256_unknown_mgf.pem \
+ *       crypto/x509/test/pss_sha256_wrong_trailer.pem \
+ *       crypto/x509/test/pss_sha256.pem \
+ *       crypto/x509/test/pss_sha384.pem \
+ *       crypto/x509/test/pss_sha512.pem \
  *       crypto/x509/test/some_names1.pem \
  *       crypto/x509/test/some_names2.pem \
  *       crypto/x509/test/some_names3.pem \
@@ -348,21 +364,26 @@
 static const char *kData4[] = {
     "# From the Bluetooth Mesh Profile Specification v1.0.\n#\n# The relevant AES-CCM calls are:\n#\n# KEY: EncryptionKey\n# NONCE: Network Nonce\n# IN: DST || TransportPDU\n# AD: (none)\n# CT: EncTransportPDU\n# TAG: NetMIC\n#\n# KEY: DevKey if present, otherwise AppKey\n# NONCE: Application Nonce\n# IN: Access Payload\n# AD: Label UUID, if present\n# CT: EncAccessPayload\n# TAG: TransMIC\n\n# Section 8.3.1.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00800000011201000012345678\nIN: fffd034b50057e400000010000\nAD:\nCT: b5e5bfdacbaf6cb7fb6bff871f\nTAG: 035444ce83a670df\n\n# Section 8.3.2\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00800148202345000012345678\nIN: 120104320308ba072f\nAD:\nCT: 79d7dbc0c9b4d43eeb\nTAG: ec129d20a620d01e\n\n# Section 8.3.3.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00802b38322fe3000012345678\nIN: 120104fa0205a6000a\nAD:\nCT: 53273086b8c5ee00bd\nTAG: d9cfcc62a2ddf572\n\n# Section 8.3.4.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000021201000012345678\nIN: 23450100\nAD:\nCT: b0e5d0ad\nTAG: 970d579a4e88051c\n\n# Section 8.3.5.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800148342345000012345678\nIN: 120102001234567800\nAD:\nCT: 5c39da1792b1fee9ec\nTAG: 74b786c56d3a9dee\n\n# Section 8.3.7.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 008b0148352345000012345678\nIN: 000300a6ac00000002\nAD:\nCT: 0d0d730f94d7f3509d\nTAG: f987bb417eb7c05f\n\n# Section 8.3.9.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 008b0148362345000012345678\nIN: 000300a6ac00000003\nAD:\nCT: d85d806bbed248614f\nTAG: 938067b0d983bb7b\n\n# Section 8.3.10.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000031201000012345678\nIN: 23450101\nAD:\nCT: 7777ed35\nTAG: 5afaf66d899c1e3d\n\n# Section 8.3.12.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000041201000012345678\nIN: 23450101\nAD:\nCT: ae214660\nTAG: 87599c2426ce9a35\n\n# Section 8.3.14.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000051201000012345678\nIN: 23450100\nAD:\nCT: 7d3ae62a\nTAG: 3c75dff683dce24e\n\n# Section 8.3.24.\nKEY: 63964771734fbd76e3b40519d1d94a48\nNONCE: 010007080d1234973612345677\nIN: ea0a00576f726c64\nAD: f4a002c7fb1e4ca0a469a021de0db875\nCT: de1547118463123e\nTAG: 5f6a17b99dbca387\n",
 };
-static const size_t kLen5 = 22032;
+static const size_t kLen5 = 2239;
 
 static const char *kData5[] = {
+    "# These test vectors were derived from those found in\n# the Bluetooth Mesh Profile Specification v1.0. That document doesn't use\n# 16-byte tags, so the tags have been updated here. Note that the first four or\n# eight bytes of the tag is not equal to the tag from those vectors because CCM\n# authenticates the expected tag length.\n\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00800000011201000012345678\nIN: fffd034b50057e400000010000\nAD:\nCT: b5e5bfdacbaf6cb7fb6bff871f\nTAG: b0d6dd827d35bf372fa6425dcd17d356\n\n# Section 8.3.2\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00800148202345000012345678\nIN: 120104320308ba072f\nAD:\nCT: 79d7dbc0c9b4d43eeb\nTAG: 281508e50d58dbbd27c39597800f4733\n\n# Section 8.3.3.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 00802b38322fe3000012345678\nIN: 120104fa0205a6000a\nAD:\nCT: 53273086b8c5ee00bd\nTAG: d52b87a8ce6290a772d472b8c62bdc13\n\n# Section 8.3.4.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000021201000012345678\nIN: 23450100\nAD:\nCT: b0e5d0ad\nTAG: 6078e0ddbb7cd43faea57c7051e5b4ae\n\n# Section 8.3.5.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800148342345000012345678\nIN: 120102001234567800\nAD:\nCT: 5c39da1792b1fee9ec\nTAG: a9233958aced64f2343b9d610e876440\n\n# Section 8.3.7.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 008b0148352345000012345678\nIN: 000300a6ac00000002\nAD:\nCT: 0d0d730f94d7f3509d\nTAG: dda1694adb791652fb6ae04682f19b29\n\n# Section 8.3.9.\nKEY: 0953fa93e7caac9638f58820220a398e\nNONCE: 008b0148362345000012345678\nIN: 000300a6ac00000003\nAD:\nCT: d85d806bbed248614f\nTAG: ef7f4d55e47d21522ebe3d5bc735a5c5\n\n# Section 8.3.10.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000031201000012345678\nIN: 23450101\nAD:\nCT: 7777ed35\nTAG: 35d84e18784c4bf3cb1b4c191dc555cc\n\n# Section 8.3.12.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000041201000012345678\nIN: 23450101\nAD:\nCT: ae214660\nTAG: d146b28beafe7f984f9430502d07aafe\n\n# Section 8.3.14.\nKEY: be635105434859f484fc798e043ce40e\nNONCE: 00800000051201000012345678\nIN: 23450100\nAD:\nCT: 7d3ae62a\nTAG: 52ee03ab84e1a33365e8a61275665f71\n\n# Section 8.3.24.\nKEY: 63964771734fbd76e3b40519d1d94a48\nNONCE: 010007080d1234973612345677\nIN: ea0a00576f726c64\nAD: f4a002c7fb1e4ca0a469a021de0db875\nCT: de1547118463123e\nTAG: 14604c1ddb4f5987064b1736f3923962\n",
+};
+static const size_t kLen6 = 22032;
+
+static const char *kData6[] = {
     "KEY: 067b841a2540cb467b75f2188f5da4b5aeb7e0e44582a2b668b5b1ff39e21c4e65745470fb1be1aa909c62fabcf0e6ac\nNONCE: 10e0ecb00da5345127407150\nIN: \nAD: \nCT: \nTAG: a82a891565e466957ad5a499d45b579d31acaf582f54d518f8f9c128936dac4c\n\nKEY: c9d9ef2c808c3f8b22f659c12147104b08cec2390a84f0c4b887ca4c247c8c9dd45e72f48b30b67a8545750387232344\nNONCE: 58bddf96158a3a588bf3ec05\nIN: \nAD: 5d\nCT: \nTAG: 3580c1601d1c9a5b1595d3dee35b0cd9e1b115d8b0abee557b2c207b8d0df5ee\n\nKEY: f755dc6786e21f39b595389a51d36673e1ffb94ffc066c03873eb31839be6fa319fd31c8bea29f03ff28831861e60b6e\nNONCE: bd6c80797f1f4c563b06fd3b\nIN: \nAD: 78d88005136e312639572343a2d0daf7483d8235291ee3ac002469456b075243dc03380c387030d546c2b1\nCT: \nTAG: dede80d810fc449a769c79a5ecd2c0d68e9e0fae567781e623ab2098c88d8a86\n\nKEY: 43a0a28fef8b89b8fb0f76de01d802935ad561e27ca9c9fa629347be676a6af758501b6a652f369045da5fef751b56bb\nNONCE: 0f6472f1e589c16ca5ad45b2\nIN: \nAD: 78e4eafccfc87631f0314c442ba4c07bca36f996a5b3408f9e445d6009a87ded16b33a4af9537a4619cab70d\nCT: \nTAG: 11fa62dd8374aabe728ebf7e9aa1c02cf8f2dbc29f9aaf1940313f0b7c3e0301\n\nKEY: acf8e5f1bd64e6289370650b5b3fd773320025c8b229fd335d9461768cd0a17b4bcc946919932efdc9fc84a7f50768bf\nNONCE: 1aecfc90d28bcdcc5a8e3578\nIN: \nAD: 6daedbdc69133b56f6a8f098f9f70cdb7e129e51115df385a6d86204a53412cd999cf2e69f45e168efed4742b6\nCT: \nTAG: fbe0511ba0ec5709def9966a9b05facf171cddd81ee2cd56e7afc867af465f31\n\nKEY: 2773c92e6cddc9a5e5dcaf3893080fd2153f009d807df0b175c76615645f2087539e299d8411b27badb749a9845c5e29\nNONCE: 6d04ed129299651aec0465f8\nIN: \nAD: 44219577e361a7a4681172d120a2d653a53ec74bc487ccde4954835943bca413d55c65dc665310148654d8c1e2e6bc2f06ec344473120ad1f95739b993a57f9ec0b3299cc088f385894fff876fc2ce8ce6b77ca253f177ba615101e84e17ad0e60704cff195dcd50eb48c77de409797e0b1c8c4c5b9215a4a0399954a008267b\nCT: \nTAG: 6ab61ac4493e58e48d071d994a000f1c1f498d22f83c8d2af56b03c155afc57e\n\nKEY: 23189bf23bc4b734410d1c7ae321c42e144a25347a8029bb925e3d8ac1b92f4eb97227c1dece86ae9dea7d127eb33f9b\nNONCE: 30681944cd5d78f46d36ed8a\nIN: 59\nAD: \nCT: 92\nTAG: 986aa8438da3cf4a98f478f90d24908c6a4e848f299873e649b256f5499d89d9\n\nKEY: 463d1148325c5f57af670877068a78203571b8b19f40e9f0373156b7448ab315df86c77d7c85ba6e54b9bc329399f687\nNONCE: cc9d015a4b5a888b36b14d05\nIN: 28\nAD: 6a\nCT: 05\nTAG: f66e8dc794b142944fa46d5c04a3e3fe00291668374846d763f2beeffd4ca4a0\n\nKEY: 937eaab44e7c7d2cd5bbb053c12e6255e0aaa42cbe7d83025b7a2887eff8f098d019c80af849b0ed7da54a5ba5b39200\nNONCE: 2b160d24df579836e1572ea2\nIN: 9a\nAD: 35841a33ba3a6ed3d89a1f76d06c61613d09834847e5a41f8616748e30c14335e5baa43d49fceaf85aeb22\nCT: 80\nTAG: 5e5799c147be0329dbcabf7ecdba6ac595ebc2d06b9d757426fbb31e8b39f62a\n\nKEY: 68a746f382fcc11c02af7b352b9d710c137a9f59bc5886dc374ca88cdc01b86fe5678fde16cfa846846539f67a429276\nNONCE: b94346c033ac1a3d709c4f09\nIN: ad\nAD: ad61c9168debf9974e19759088944e888346aff99f3e2e4522549c8ae332a0f41922972fb7c1d5ff24e7ae4b\nCT: 46\nTAG: 62ae92ff64710a9f260da2562e246356e9d749c3584fb9f40d9572307ccbbd31\n\nKEY: 6622579d1d6350fd5dff432b69d172cc51f99bdaff50b0a1c0f4cda8d5904581ba8657ba61c6936407243d7fb64b00da\nNONCE: a880caa7157a13540d2b724f\nIN: 2a\nAD: 95a23eafcff892deecaf093109d30290d819851ad5c91061510e54baa2b039b114c815da20f0e3ba2ba4875bdd\nCT: ce\nTAG: 33f09666f9fd1d92f137d9f3f7092b47b2bd71a7e3139dcd19a803a6b17f2a3a\n\nKEY: 91ce9dd87c7d11d2c4da41863b6851c40fba786a612e0fbf0d1956a71286dfc61fa10bf7d148cecd72b6ceeb82b68d3f\nNONCE: a50dc3d8fd63d3076cc70ff6\nIN: da\nAD: 9ce8e1a777c159ec775abbd67d85e84f3550c3296e848dec18b61bbd713a98a033805bfe6e2f2a011dd7fd754708e524168142aeee579cae19c7eab78fa7c42fa335f0c725baf556160beef9e4afd1050a2c8813be6bd14cc6982116d0229d53e9b4de923abf6ba99bdffe1d5f21748ae74caddb077d9f7488b394436222beca\nCT: 2b\nTAG: 1541cd745bc0259dd72a212474f5c7b8c121dd0289d674e5ba8d56a220d1f1d0\n\nKEY: 1ad577d3b47e3fff8528e336a43a7ffef72f811e05b5c69ccfe777b10f29061e289178e394a1c87ba483c7f98ea5431d\nNONCE: 1fcaa4757a9e48ed2cb3be62\nIN: 46d30dac550103006c292a9ac05d31\nAD: \nCT: 37616eba30c55595fa0ad5d50f91ca\nTAG: 5c3ac4010f75adf90f81e775b07ab939e7551a9b8e0486ba33766728ed498245\n\nKEY: 6df310dc1847b42c68e50b03d154b73d7f3823354b32759c5369bce1a1b4cd63ccdb911c2dc792acf84b8b8f3fdfb89d\nNONCE: 92e6759a31dd556ff9124d73\nIN: 6daba76658db642209e276ff7c8d46\nAD: 32\nCT: ce1814c03037078b6be3252460af48\nTAG: 46e61913f2a1ff6e77faade9a7cd37a82eff3ebec4276fbddff9266b9c9bd873\n\nKEY: f848c2300995f5c98dcd0db24574d7c61459ca64c084421c6ad156e80e398904417ee745245ddae91be20fb07e66bdb6\nNONCE: 3b177e11063445717f417d14\nIN: bbf225131c821a6a60817cc65bf699\nAD: 4c5ab4fdbe0018344629349feed5d8c3ae0c5b64f2b093576a2aaa1225e7a50eca01a9962c9b4f8fc5c12a\nCT: 1538957e78f3ab0fed77906153d715\nTAG: 2c7760d47407ad7b0d5b85fa4967eaa7b6c0bb6eb16619adde7a191abfdf3da3\n\nKEY: d406cac07630ce2c071732a0ec95f55123486d2677465768dc7db13f90902cf172f92e19f57f5cf7c68cd7bde7ee4b4b\nNONCE: 766aede0120b634a4be6fa12\nIN: 3804d40090a38d4c97a5fff631068c\nAD: 7707b7d0f266284e84c2ecdd5a18832650c3e27d66697616c9e9bb2f8a09a3295de0119582ca3614b9608548\nCT: 91e96462a5dfbe8b7af201158a36dc\nTAG: 56623e5813070a0e2f5184aed83b9863301ca02e3108f7afc478d48305e397f8\n\nKEY: 42bb22a317ed9f9df8119746e9a1257217e5b0144051ca56f39587021d969bc0acc02795f3bd201031e8c05af08ad079\nNONCE: 0a9f6bace71a1ab21f4917df\nIN: 013f7b8c75307158f4f300450e7a78\nAD: cd95a649ae215fe73442a6991e157232cbcabecff6042b87d41557e35b97606d606c3ded54f5d3db7aa2773f67\nCT: e588dbcecbdb7667dccf7fe34f8387\nTAG: b04461748109ed9068c7e9c0446528ef09b01613c3b3aa1ffeed6685ebb550f5\n\nKEY: e1cfcbaba3a04b5108ce2a87099a6aae936ee38acd92b7e6b7df0e3bcb9ad18fc579b5d470ef3e04c23459f509852458\nNONCE: 112dd267174bcd81e6fbd924\nIN: 288a1e44b406aebec7b418674f81e7\nAD: 7809d8011c5a963df14fb8981e874119c60b7a9d897d13a05651759db5835deffdd991fbf98b9aa71c79e48bd701b228ba248b6bed874b02da7fcf28a04c38b81c0ff628846015258af30dbf28ea4f3283f664f888fca545f5fc57dccc4ad1dd476c52fba341182ecf783706c5c458bf0ee5ec83454afba78eb8b5ca17af88ec\nCT: 80f4e1012d76f6180ca00fd32c8fec\nTAG: 6de00bf2fd3c88ab34ca9390f7e559875e43e0f938303816a3a75a35729bc453\n\nKEY: 84172547d8608bd9e788a7bb60df2982963716e45f8e63f0c5033327d85c920c5e3776e314246b1694b739c39abfa29f\nNONCE: a3f1643bb504b7ce9e5b43c2\nIN: 7e76323eb13e64da9b240a57c95c855b\nAD: \nCT: 966487c18f025d67b42a04c30d3ff4c3\nTAG: 8bb03d893f0ce8ea4a6a47245bc7f20c72acf8caa466edd01365d0f74c929463\n\nKEY: 02dee8f2e63b37fe3cbae9101fed0946e05e5090510bef3324a82e3f27456a45ab1b6cdeddb1fe515ad07aefeee6ccbc\nNONCE: 64723d21365d62926d5c2262\nIN: 4f1f132c50a01ad48882ce88655b33f7\nAD: d8\nCT: b102082e14cd9ecc0895f7a6f08ab522\nTAG: 2c09651c1a51cb8a375746236fe258a36e725936ccedbc4dfafee6c3084a4716\n\nKEY: 5db57cf6301bab815d38879b35c9db72fd40ac576d259ad5074d0828364050554e9fc08335b5f2bf066b09e50fbe6ba4\nNONCE: 36e5340d844de213c312177a\nIN: 41a6e910b14388740ea351eb1df980c9\nAD: 8316a6b9b155b2de5e724f7593ecdcee442eaef7b9ad204eda4744a5e648c2dd84f48ee81397e485953465\nCT: ee21d4d47042415ca27d2ecb11b13d79\nTAG: 5015da5a3339389d39d0fcafb56ef4005b342e69ba47930e84408d33aadf5f2a\n\nKEY: a493dd6de6fd6584599096442dd9345f6f2d8fc2d426c78eee2b992b4071aba4ce463f3ca293c84b2faf3e8644b6ec25\nNONCE: 4f9be6f788ee960adc650d86\nIN: 4de6e244251091cf13762d20685e9085\nAD: d15da312b7522c18384acdbf6348b5e105557f1790a6a203a65acd73397524681666743f3145048775ad84e3\nCT: bb1296457daa39d889c8f986938d6a39\nTAG: b93548cea90c34d03d6f5683ae2cc78814531b803d42cfe57623fd4bdc8f084c\n\nKEY: 8cc59ebe2c7375a70915c48d2978a1f720bc0aa2775ce9189ae7b3d5dda9a81e56cde0e0a29939599409b71f0b65f346\nNONCE: b0ab041f37ea1e594f1eddb3\nIN: cd0aeaf6806cb99e6bc1c8c5d830de8c\nAD: 8f4b5a9609df757826dbe7e51bb6a2c6f45f601263cf668836193513cf008ab6b36a7d5447039f1268821ec37e\nCT: 5d5375b9d9cff6d0c1dbd14221509a0d\nTAG: d8850bbc838e068b817c24d018f8f1e1cb8aac0a68392a700f48099f81b6c37c\n\nKEY: f3e9c507478d3f99dbf3e2421e45929b096ab3f3d4aa4ef9c338c5a1a2425c9936b7df602502d33cbafcf781350da77e\nNONCE: d4872a30c9d1fa9001a25afe\nIN: 25e05ea69a956b12a9be4ef03ae9d30c\nAD: 8b346c20e7c64b805d9c8d325829201753069c60b3f221f31474f55cb20315373ccd7c2a8f215e9efc407ae91b05d8b6d693a3780fdd65d7715cdded86c3d6204055812f3fce897f829d1df9ffaaf48885291701ac1765090c383162dd13d6bac88baa0cb2d748363bbb79843a1594ec6d8778854a63b7c9ffeb6d1fb17e90f1\nCT: 61325c7e0d29e9ad50b9c0fec02d7ef4\nTAG: 4b2d0caece46ce2496445883c03234e900189c22b54390b399d78ee4ebfbb7d4\n\nKEY: 3d9b651e65e9239c9e33aafb091b348161ab797901fd0468aed",
     "d014e4d5683c8f3f54f20ea6bb07bb25dd258df7bcd5e\nNONCE: 32bcf856a14437114e7814cc\nIN: 08a667c2923f87a7db6502478d32280bdc\nAD: \nCT: 5e8e02cc91c732356bb9f1fc599426a379\nTAG: 5449e878d558beff4bc7dfbb5f0195444705cfb259773b4faec524fbaca37ea0\n\nKEY: 2124cedb5f3f2558f8b9a2304a29c0df6102333cb4aa10625aa82cd76ab645c73f3b7cbf7c96cacdcb9e0b738e40c042\nNONCE: 7ae419446a3a105beb2fbcc5\nIN: a305dc4a2e50cc8e7a65a4b10b73849636\nAD: 70\nCT: fcaea620f7e9ed1337214c4b432d9869d2\nTAG: bfc739c8504a4d9033ab1915f46c1bf65c5382fe9ed1c134026ba32c63ca131e\n\nKEY: b027feb1aced8fb3af27a9fd7f531c30991ec1abd9f230a3e5d6ee9fc6a77747013f8e14dcdbd07b0083d0ce23dfa711\nNONCE: a30a6520f933ff5265e6e305\nIN: a705f842d542cb6957fbce21854755c6dc\nAD: 447bdaf34dfab9cc3dd7777ebaf80077f391093bac9817bf02ad98db9d3f271282ecaf0ff19652f92076d1\nCT: 3ddcb07c121b498f1abb73bedb527d4df4\nTAG: 55957a0e884dea22d6ace10e5936cdac891f5b54225349ede5c44715f1064b5e\n\nKEY: ffefb7770a7cf125395703985823f3e926f3722ca0764518fd2b8996577bec03648c8d542af1c6e36b51174b0ba88316\nNONCE: 4c31394b4b24f6251a839891\nIN: f026a1d352c37b204c6c1138abee9a9a75\nAD: 1e7c0f71a3aacd87ea785521ea31f93b1efd0bdf97952e0b84ecd50c706806deffc19caea312b5a9988454d2\nCT: 23c8bae37db93ed9f55f2903e04b7c6a8e\nTAG: 89d0a7e7d921dea5bb54c28e79b612688e42506aa69b141de830c8d63bdefcee\n\nKEY: 453cf5e4f48ce5a961c94af0e1639c156965970f561ac17fe08d5b75975abe3db87412640972e463290800666be80441\nNONCE: b3e3f9708a86c7cdf139e496\nIN: 53f1b11de497cc6ecb411a777dc3d60197\nAD: afe29e074dcce850ac6640230e6b9f66a64587c5fbe8679144e065d3b1700c721833ba8f918e926c9142f5f362\nCT: 15d5f597be46a19566a72c5e843b77f70c\nTAG: a561c3375c096a116a721e9404e555a2deaf3f677a8611694281663274708f58\n\nKEY: 3d497f81d0652d475bcd85cf53bda13f79ef0afeaec09dd679a6e5ea58f87ba6576269f836096d5ac034594b17073331\nNONCE: 3fb1664830821e2b524890c8\nIN: bd75c313f5c8f6007a2185bc39d0af01bb\nAD: 50744ed959e2b8ba5b5f4807e2997ea0b96ebfcdeaa1c6b33853219844592e82ad67abf6ccbb272cfdba6a3e45c07fec4d4a0ebe4235f11d916771a764d9a129d39f6b84f0b5fb4cdf789ca2f5ea306b25d047a9b1a1e2e90905b6fba472e70b2fa25c96602cfa0031f31c68954d7487507081b8e70f8aa1342cb8b4a98ce9c2\nCT: abe3869ac43fd8b429ee8b8539c970bc86\nTAG: 33fcd301c2bf624bccb92a986c2dd5f2ecafc32649ff550eb5312fc81cbce46e\n\nKEY: 353c3e9f87b40fc0281869c68d9d9bee5c95771dd79998c059bc5ceda71f139fe447cfdf340e9eac57f232b9d230e45d\nNONCE: cc7a4b46b02f4e7f96fd34e3\nIN: 44bcb61332930f606276268ddbf3287bcaedb5b25704489cbee63ec839d7a69533dbfb6e95fe5b4694eb485beb1437f0777774868ecf45c8a5b3edafa1d62a\nAD: \nCT: d038d67b8b690519fafa7467c9fb94135f9bf0bcd8247cd2c30da62ddf37a6d9a3a9bdcf8ec081fb4469c0fc2798e2e30afede7cda384438fd01e5d672dcb8\nTAG: db2c685a59cdf304c1fb57b66966a5ca1cc3536fe21eb1113c25868428640c7d\n\nKEY: 3b3786e38e110ec0c8b05fbdb3d9b6d117d1ebcdc0e7d942249fea6baafa31fe5caac227979fc833b104641e8e9ed01e\nNONCE: 53bf31912a3ededc01c91f84\nIN: 6de5890028382aafb186042864c5cca1a77ff80ba4f7f0942dcffa1579711093fb652c8d475dfca81a976be8ca77eb9c7a6b49dca1425610c945bf404ba65b\nAD: a9\nCT: 886939354fa117139f5e077baa186825ee7e2955c3a74f88af3a86b260ee9f9959a90409e7d602e36cea31e606aeaa8b9229e28f7fa58ace6fd217e5cce1e7\nTAG: 91a769003ec900dbb40ea9c9b959882d822421b510ba85ca826bc4af3b5c42e0\n\nKEY: 5a75c97f3583983bbc5eee4a882b766a6708d798a46f71e63b7509af69afd7cf86f9b42df04b626940914007078a8b9b\nNONCE: 426e8bcbcffb6b425706dae0\nIN: c24fa29a66197cad518c5a1a76abd9446a8f24c2dd81e953bfc5c00544c119d67986781a1c754224af234b0ec5e44e78610a4420eb78c283e9a56637c35c24\nAD: 6376835513967e4ccaff9a0c56b4d27a2bd0d013cd54abf95fe9a162d036af285ebc9567a16ed5abfa69aa\nCT: bc4daeef3ccdf9abdaa75591781685eee3fd7825bfe63132817a7e0f93817f22bfca30ed775a773f5bb290aac3a381a01085e861cab7b9fe4c5143138e17a5\nTAG: 79c779bfcb974ad9a8ac88dce5027df5691a3a1163a5d5893b4cdb1663b17aa1\n\nKEY: d1b301c029fe3b81e4b97e08e84dbc03b138f422161c0e74ccbda3172c034b99610f09a9e611f0e9a3ca40af4fcb3c56\nNONCE: 4032c79eb3ee4b63e44fa932\nIN: 71bcf5a5198787b85a66221c22e7bdb9d038dd3e10000555ec9271e54bfefc460ef4e71729ff7ae52859015b49f45df89ddf183fe1e19de3acb032dbaa4d57\nAD: f1cd18ff1e5ad2b65de41e083b5175966625ebebb3031e1027761e407dae4e8e193ffe7dea52ff61147f1b4e\nCT: 7c521a703b7d1cbd086bdc316d4f2ff0852c462eeaa1d7a586c561354be9ed412d9d9bd1f78cc85468750f1af09b7b17dc1ee84c926760d63504cd3a1dfa3a\nTAG: 831f3552890d997f0a8f2d832b6e92e26f6e865424699f0364a82d86ab7734d0\n\nKEY: fdd24bf37b36666a4f641115581ab4bd6b896dd3017006031b3675beed33f21a314363e3a07bbbf4359d9ac02eec847f\nNONCE: 7767cff1a096a9f7d8a9b32c\nIN: e62b7695dd41baf49d1b356e64c6d5504784380b75724b86f5f3185d1a530664aea0e5f9aeef347e1ea4754acaa7f3c233638db234c0e93db02e0bf988e7ab\nAD: 2d650f3daed2564b0df86fa23ed0343634663adfae2c422f80f9d5674bbb63e824f01ad3994834f889133bbc0e\nCT: a51f50a6ce77a22ec472bc18c37d08fb28e77efe55065b600e3edbd9ac97f0fd0eec93cd312ec7ef886cb04e1849526f0a38b14d862bcd578b99bf9a007c2e\nTAG: 89d83264364c9c84ba705e5549abcd496abed3900f65e3daa012275fed18a7da\n\nKEY: 0f88e2d00d2c4bd682f1591ea5f4c1a1090180e1195809cb363b27c863360a85b27814e6a724effa44f298430d6c9628\nNONCE: 6e2e62ecb2aa47c7e5921d25\nIN: 91efc710a57adb57017725cfa26d17d3e2993c5ee66942ca42e770a83763e9df8a455bd408dc1e2661cf301f1dd669cd6d5b4d92a886be0f54527779bae8f9\nAD: d060cbe84271e85f25a3dcb6dbf299551f0dcd5783e3df80468636e491c0100f3ec8316f24240482a88bc430a398b0ecaee5c48a274ffb2d835e200bc39ec0aa86a1c90c9e2dcb4217595d48826a81de90eb949846a33fc26bf8886ca0554e1b8f12cbeee36e65e33cbbf610c2d24264619fa93c44c88e0e3d9d368fdece461b\nCT: 10d99b98ed67d85a44fa57e706a8b028c61ef17f35f6713613d158cad90e826f90ef036a2190ba123f9b68b352ca94fbebf8ea947e569ad45f00e6a36975f8\nTAG: e345bebcc4a8ac01528bc5f317e5c378236b292c2baab6ae8654245da35d90d6\n\nKEY: 1ccec52c77239bdf6ca50e5b702943b23015d08cb1d9bac592b3dec4c96be904110713e52e114a8bc294df26530a758a\nNONCE: 38554b7c40027afe9721e14a\nIN: dac91fcdb3768df8d5ae9ddba1fe5917c084a5d9e6b14eee9a609cab2da34ec9f95cf2d10fff77108477e694c76f362e29b9a9287d8b190a748ed0a929967ff8\nAD: \nCT: e6bcb38b3bfd0b428a14bb3aca01a4a9e54b0853f10bd7750f5bb58d0e7dd18006f8929d7d862e5d6601ef63be8442334b4d51a99219cfedaa31f7ab19028459\nTAG: c4f05d9415840c2325dabbcd12dbeda31e47637437514c606dedfb8ce622edd0\n\nKEY: c82ad4c6f248bc51d3a51b958ecc2460a3c64d669f6c485c2309d26abb3fa84644a0d8c28da8091f90184b53cd556413\nNONCE: 35a29938fb7a31225b08d0e4\nIN: bb0045cec5587e50b148b140b6969612425243ed1412e812aa9f4b471ed34ced6dfa9e0acf3e31455893e4ee7e66b4661c6e1f80b7d6f1159c11387ce579b80f\nAD: 12\nCT: 5f1854fc2fb11fd721755445a1efa5a28607a725ad71cda9a3464860a6a0efe3f58727c0e0cd315f867611232abd72034dfc2b9deace8cf6cb507b1cd4032b59\nTAG: e40429ca19a88da73a7654d7ed8e0621ac2e504b0245615e262ac70bd05a3f47\n\nKEY: b01bec74fe97e5af7db2a0b1432f8b4c069447d2b56dc2668371387f753b03465412213999d2394a4b79873db06c590a\nNONCE: fec7de97d54dec8d36c9f253\nIN: 88ab078d03ffacd128edbceea7ace2e6465f4076097445a5db7f0e61ed817b6e24f22874489049bee0c58d0aa2b42b4db0bbef6ec88d032da9c82ebef57c424d\nAD: cf0ceb3e80a76d1a75f6e070f5d3fee1cd1e2699434f96e7cb3adce12d4a3148dd433b08c68b9d66962f24\nCT: 8aa3c7478b0cd86fa30870957fb5307345f89346a869d508da9d3a4fe36fb3d6a9b0c3c1bc2d44c8ea31ec028012098d6032085af0b54603dc2fa65ff091fdd6\nTAG: acb670172ec3754064b366566bdccf5056eae132e2041f1a285c5883e7eff4f3\n\nKEY: 699a94f6e6eb457b186af58c25118fcea81c8f0ad265e7c16bd6cdca15c9db64bb9a537580ca0474a4b4d54d47412d88\nNONCE: ac3fb6525f4357d831529407\nIN: a7300aa94f3d357cdb272f0a739979e08aad9551dd3bfcd0b5aca6a0972a71b502639e79e1b9e0d22db2f3220b982800d9cebbac3d10d9bf86ea25d3d417fc57\nAD: 19c3d34bb9d57d0f63f14bdd3da06a43a5afe6a8c505f038cb403515876a2765c2d61aa7e4c84e11c999b81d\nCT: 8b472f1069ace78172611369b03073f751e5206dcd2ce3b45c431095f303e70c59bfad3af8006e66e4a68f8fa2ffa534bd76bdef089d07dd38988cbf723393c6\nTAG: 8e7c3c2c41b1117928ca1cd0cd48c25c319c18e009804c007d1aab0967c0d0d4\n\nKEY: f3a7b8c2a39531d5fb3c97bc9224168aa835973f48243d6f046d00937ed428e5d672e22af26e734f0c24f989fe62621a\nNONCE: 65c61af60769672f0eeda005\nIN: 59667fceb2594e002c844a47d2b3935d2c99570b1639f0887fb082499e1d36f9699ff9ef53be3b4236136aa9e441abdc63dfe536e6fc9fa8f332baa1dad577ad\nAD: f79036742501f1ac19dbb2984e09cf5000bc4bc0424082376c307b8f1e5bf74dd29c802139d7ea93d55d336464\nCT: 9375a81f016c2dc59a8e99dc33fc0db7ef99ab2f9ade4b0ba000a614ff2bd13bfbee2d4a2338109c98c1147edca6023cea43570adc503da98379326ace89d796\nTAG: f563869420699dfa0aa84751526bd75af1473bd88311001e49230b09b8ef2797",
     "\n\nKEY: 27611a8f11cb57d08648ec816b5f3c45882dae394200cdfc803d1a52bb03f225206574ea63b63423da6972bf5a994332\nNONCE: a7f617fe7a52dd76ee443dff\nIN: d6ccb950515a4a2de7c3cf5a73b568f32fe30567bb22b3b46feb7ef07205d3215a3d689b96d4b9dbaac5a5bd6ecac6ba50314b19b37179fff2557c869950e162\nAD: 777282a98b2f262ed9456fed3610a2028bcc4433eb8f028597d3bfa220bdb0c04882de03a276d0191cd1a125270ce1630c1b94e2ec0021ce5c494d2e0bdb8745e6e94a387cbb31a0898965174bcff8bba105f94dbf080059b49dee71c3194fefe679ef6c00065154ea809293b088c0c3f2ed7824aac72319a4c4ad85ea990844\nCT: 41eacc31aa3c3a282ae7638d48fc7541d2f129e4cb3455df7e60259be9a814c8e1642ea826ac1ec7ed1fcc216a6624e79845521e7a8b16702566f27f7a7f3317\nTAG: b959992feb7005410f9ea6963525e3d9244f038731ffab8da8c4ebc72489f17a\n\nKEY: 0d9322713cd132c339c38ec7a75862860de304c70486b89b0f587095c66bfd1abe56f0b34f9ca0dac577fd4262616600\nNONCE: 3298d02dd4eb85a98cb935e3\nIN: 5dfedb1d168fe262d35f78d797560b2634f71d40f438c21cdcb8e73cf9884c11570554f55a6abd23d0e7775a9ab385ae6c9bbd67f08d1aec57347a8fad5a4b8c7b042b03c25facbffc76f0b1ce2e6c07d427eaebe71255d661ac8e8bfe8867e2d947d496ce2318a601d0beed02426311ca678d036deb3b4c65b1f89bd644a410\nAD: \nCT: ff09fe27f12a87d5208bf246378ee0740e848262442b8b9c7670c8a73fe6732192cde43c1a1246743ed49e15ec63c87dc06eb3e0c92c1f286108b2c7e0754dcf1b9c3fc87efe3683289daabf2db71d8742061f93098788c3c6f26328b86e358507a03af296d2c29009562cad3763399e0e2b89ed440f756c16214c8ab7ddfb84\nTAG: 5076c80fc76c67d6e4f9b9d470cc184db62ea7da49cae44cb3ce9e46c2f2ca9e\n\nKEY: 2695671fe86f1658d8b01ec856fb4c9d09a0c51a1b994fc87a3f72bec12052537b7429f11f7eb4aef0b128302ec8f336\nNONCE: 9739e577595418c47b9c10b7\nIN: c723c39be334a0761db795076e81e3dd85e37a57258c7e0e10fe0f48dc31bd5e683430aa70531b7c8e3a904e49bec838e760d07afa9f86b2cf78ae90f612c4560632acb7ea2d89fb1fd5396d0337111c429cdba99c6a52e863e8603aac24a83302ebf86ae69a212cb938e12085cbf73a28f75e4422995a5ec8705b12d4aa8b6d\nAD: 31\nCT: 1569b20732ee6395e605217e1cb419ce57496ba6f6e889bdfa3c93575e969eb7a0410c7930b7ea146e88577376d84f0e824b62890eb84bfe768a1513a12c2958ad1835bc1eabe602cf40f7812c7dd7da955567242cd7512090fca685fdd7306bd98a908b09464961114abbdcd610c153637400a1f81825cfdf06505947fe54ee\nTAG: d07e14a62a32ef1933abc2127cc5bfc1e43bbca663e460409c6faa3a4ccf99f3\n\nKEY: 1785ef6e7016733dd1952b3268639f231e7afa973c0a3db8780b81084c67a1783200149a1ed849ca8b5c14c7b1798b4b\nNONCE: cdf48b73c3c8d8625e52fe11\nIN: 14002f17e056d7f5524537cee6c2061e2741c01a6f9a82e2cb1747887875860d51bebf8d9b63950a051f6b228ad7567227f8a45b9fa7c4ab47eab410125303defa7e3141bd9bc5bf4ed56550801ff3bfc2dfaaf499c192b1e18879b2f59e1230778132818df8f6ad8a3dce9a1d11c98075b8b4e560edd9b5ea180f0424ab3706\nAD: a35e86e22e9a3df65e4c08e5175b4216fa9895a1be6252de911cf98349841494617eefaa007759dad7f337\nCT: 99eae989435578cb57715a7457da31b807b8078a59c2332a0a866eee9da5188baed3f517b6808095f0067e9b4b91cc1424a464f0a09fc946adbe4135a17b0e8e545d2046f81cdfdb233aa3520797319c0884ccbade8235c32d195e7b802017f88ddd86fb630de19eb97f4bf91029c001fc8f1cd2189a8ee6c120e9f1682a8703\nTAG: 1848f0b163e7b0d270e2a0ced288ea6525697170aae15038f3dcbb4ea49ef843\n\nKEY: ba9aed2bfa90eaed9b27a697bb44c715c0209cae6b2c4ddffc684bcf07ab51b0e096dbcfa26c18fc24b63408317da567\nNONCE: 4b850d6bfa64520f1aa1e79e\nIN: 5bcc2ea4d729c84340c5ceb827f239578971c595e915f0bd9d49ed51d723f8d0e8362e69fd11466230bda0dad57ad724307edcc621ebde1e57fa91fee206d81d2bb6ead94b4a804f74b6cae979f66bdfa4ad93d107ccf114c59cd3d261aa6e2fc0dfbd0df5f7c18e80d0699cc1712abbefab5029e35549d2919d0f937d444051\nAD: f80c759062e9ed0ee597406aedbcda9a14261d66a9546f1c939d20cb1d0d0974fe7a9b33d8c93287a6a8d60a\nCT: dae4fc873d302c51e55910e67482bb80ac68e9bc6ef77cb3e57a31d85fe75f9071d0b64026ba16d0b68fa9c0b7e958cf7682bcd329c4174ea0e3f3f9d2e65d82aae1350a53ea7cdcf9ab848b85cd731751f0e2917628e5066f5b1ddebc7dbda5d2d37e46a7a7ee62bb49c4431af730f9cd3da4c1d0e5f8593d8c99803f781bee\nTAG: 58b42e9117fc8cc2ba5cff74b0d92e8b381a444fa837018b15e9514fc4319fb4\n\nKEY: 37235623acb0d650f905f106dc3bfe6fd83192e53056de8795ed8d20c6e58e5efd84584007ecb17de9e76b392e12fcd7\nNONCE: dc441f1c743a92c4b975c6b6\nIN: 960ceb8d80774bd88b7c5f17042ad2e4baac71b4021c548458cffcd9a049291cb0df93076c115b54f9af878745acebc6e8f04666d053b1ed980728043c4fe7f67b2bcb0341d8a4973ed126342f9add14279f8402cbbffcecfc847379dca8a68ba4f2f26141acfca7f3ef558dbaf04629f0f46e43246b19d875be452f14e7bf56\nAD: 32579218062560f15ff966932838460f99099782e79f1f8c41cd9f6eb59b4c2c3d2dae9cd199fe66d74c7a9940\nCT: 49ad8e24a31e90ab1f8dc37dc51dff0f93f1420e79eb108f90f800274a5aa573f64e274cd52f1dbfdee363e4f86e1457bfb8f87ce57aefd34c3a5a3a93db4ebde3f73a3b4c202c993903ab378ae71042ad238e94f400c7ac1891a9890b19d445eb1db60773a3ea165f7c4b2bb2071faaf588daebac7ce09ebfc88f4d9232d9ca\nTAG: 82f908b837a5768598982f860ecea16aee84427371c4de1f1314749b70ffc173\n\nKEY: e7fc36c9fe87a38f9bb4ca67723267e80e16bf39740eb1090234a473d68aed9c96fe2f96e539795eb042276aec5d7505\nNONCE: 83d768746d40dcd695e49ff4\nIN: e61f0e02a70249b62ec9a8fdbaf6622c9c6316599daff421f1b19815707b67587d196b7e1452c7d7609f108ea946675ac5d97ed215b92a451aa6a11717ab7819f84848151007f37e2cdc8aa99969c3d5652aeeb65fc21b621865f47f44eb2c528ee1142d11f513761a6bb2d169126503db5b263a410cadd2773ff931a032a885\nAD: 59114e9f21b380ae6068609ac36688e6aa7c2533cbfe07013ad1b6663bfa42e39f20e62b45c0faa256c1d33caa9f59b1e30d8502bb7148d051451b3d0265cb9fd0d82e4f4e0489ac606956762d8e7b70abd7eca413ddb708f119c342b3d0d5df673769d8df281656d909b68b6f6438edd60339fd84ff69918b6036ad12a0a588\nCT: 4f12807736c9ab32a2be2e00c9a0236394a8bcfcec6037e7582af462a73bf10aa73bd90e2bc24b97f7001ccf653574aea294bc7b30b77540f475e0e846ab78ffcfa1fef28058e540fea43d9017d4efa05c837611b2eacf0034f26cb7903eff7874973c6da7843892bfc676170a75f839e297dc7f04c74b40f4bda20a45b2a352\nTAG: 9b05aab44ba4d1451f14e087be626232ed11c4ed04081f0d4d47ab593fc619b1\n\n",
 };
-static const size_t kLen6 = 2413;
-
-static const char *kData6[] = {
-    "# These tests are versions of the tests from the corresponding AES-GCM test\n# file, but with the nonce appended to the tag.\n\nKEY: d480429666d48b400633921c5407d1d1\nNONCE:\nIN:\nAD:\nCT:\nTAG: 7d7daf44850921a34e636b01adeb104f3388c676dc754acfa66e172a\n\nKEY: 3881e7be1bb3bbcaff20bdb78e5d1b67\nNONCE:\nIN: 0a2714aa7d\nAD: c60c64bbf7\nCT: 5626f96ecb\nTAG: ff4c4f1d92b0abb1d0820833d9eb83c7dcf5b7ae2d7552e2297fcfa9\n\nKEY: ea4f6f3c2fed2b9dd9708c2e721ae00f\nNONCE:\nIN: 8d6c08446cb10d9a2075\nAD: 5c65d4f261d2c54ffe6a\nCT: 0f51f7a83c5b5aa796b9\nTAG: 70259cddfe8f9a15a5c5eb485af578fbf975809ddb5172382745634f\n\nKEY: 31d93fd51c2d6450cf35d9edd71413f4\nNONCE:\nIN: e78eba6c58f93cc2374932fc21e54f695f2daeda3bd1e0121a77d178e3bf5c0e824a99042e8f2522df829d014e4d35a756780e8c07f53ca8fb78db6fb76754ad461665051c4572b2514804d0a9cbae1a1a013b796565eee13a7832ab8834b8406b1185332552d38754dde2344ff4f6e4823390964ba2dc43de136f2235b1d919e0f4ad60813d30f0ac1dad35abe3bee9479337c7b430841d2c722f12aeaf931cedd8a82053f697fff8d07f0af6013da7da58a5dfcf45561943e7ccdfd8d11fbe96a68a5a27982e47346500c0284caf8e6b63c6621e80503a7365d6693dc9a249093dc45221cfd88562e25910034c2c123e44e3b09d8a8a15547285d2596b98c7a0ee9d10b2cdb032d08a6caee1212420b6854181a583c15e046aa202dd\nAD: a4fdd42aad5475ffc1b122170024486406033c8640233cd9b23c286fdd40c5b69eee39cfbf965f7a10c73663f9804e6821c4f62980f8362a580bab446325b009a004b60b1dbd12566b55b42e58d8037d86c1050cd6ecaaac2fb0ef616a15bc5bcd8252fd459165795c500bbb2fb1476e5cfef9549db733be65bde391c810d099e3745a2cc7a94debe1f4ff6653b338123ef7d2f9a602bc9a4bbe757a63f932a802014f2f06c6688faf14332a355b1025f33687124399f55b6a5adb4864727ec6c5334c41d78d1463400925f6c29c0f611f35c9640045a740dad5b4f0dcb632e7f9a3478b526aa9f97cd9f8d3ad094b7922890e7b6d9c67fcc4f747d04ddcd115fba0a8f0433c6fb1bf6011a9cd153f866c76b26d427a25aebc60d10540\nCT: 8d668fb50efda82552aeb5d075ff3977c37929d73f6639289e7c6da8c89c664df80b2387e788d12398d62d3c0ed2f9f918010d41021c464d54f016c4e10e85e29ba3a45793df2ebd6cdf30045363434387bb0d20439f4986e6eb7ae9fd85fe776f7b8035025624c2413ca8491cc6e79fe901b9c40ff3a0e37a7c7e88b56de4fee65861865162821e046846d253982e4ecd17bd26214b0923a4297d4ed9423395d856940829ca5ee74488c3b4d8aa3c5ceade17d8a3f2e45d3ba91360ac1c76d6a29f8243bf49c1d75aa41ba239fa6f3b123e198ba799e3b70c674607c5371894800954eda0264b3b82606433f71371dabc5f1fb3d703232533662920a241f613c38d16b0bad24f4aa3b336af89cdcd2f371e1bed7aaa47c56d17100a01\nTAG: 594ee5c93636cfb5fde940e3d561440a28f6f0c288c9f92e80252e1e\n",
-};
-static const size_t kLen7 = 175688;
+static const size_t kLen7 = 2413;
 
 static const char *kData7[] = {
+    "# These tests are versions of the tests from the corresponding AES-GCM test\n# file, but with the nonce appended to the tag.\n\nKEY: d480429666d48b400633921c5407d1d1\nNONCE:\nIN:\nAD:\nCT:\nTAG: 7d7daf44850921a34e636b01adeb104f3388c676dc754acfa66e172a\n\nKEY: 3881e7be1bb3bbcaff20bdb78e5d1b67\nNONCE:\nIN: 0a2714aa7d\nAD: c60c64bbf7\nCT: 5626f96ecb\nTAG: ff4c4f1d92b0abb1d0820833d9eb83c7dcf5b7ae2d7552e2297fcfa9\n\nKEY: ea4f6f3c2fed2b9dd9708c2e721ae00f\nNONCE:\nIN: 8d6c08446cb10d9a2075\nAD: 5c65d4f261d2c54ffe6a\nCT: 0f51f7a83c5b5aa796b9\nTAG: 70259cddfe8f9a15a5c5eb485af578fbf975809ddb5172382745634f\n\nKEY: 31d93fd51c2d6450cf35d9edd71413f4\nNONCE:\nIN: e78eba6c58f93cc2374932fc21e54f695f2daeda3bd1e0121a77d178e3bf5c0e824a99042e8f2522df829d014e4d35a756780e8c07f53ca8fb78db6fb76754ad461665051c4572b2514804d0a9cbae1a1a013b796565eee13a7832ab8834b8406b1185332552d38754dde2344ff4f6e4823390964ba2dc43de136f2235b1d919e0f4ad60813d30f0ac1dad35abe3bee9479337c7b430841d2c722f12aeaf931cedd8a82053f697fff8d07f0af6013da7da58a5dfcf45561943e7ccdfd8d11fbe96a68a5a27982e47346500c0284caf8e6b63c6621e80503a7365d6693dc9a249093dc45221cfd88562e25910034c2c123e44e3b09d8a8a15547285d2596b98c7a0ee9d10b2cdb032d08a6caee1212420b6854181a583c15e046aa202dd\nAD: a4fdd42aad5475ffc1b122170024486406033c8640233cd9b23c286fdd40c5b69eee39cfbf965f7a10c73663f9804e6821c4f62980f8362a580bab446325b009a004b60b1dbd12566b55b42e58d8037d86c1050cd6ecaaac2fb0ef616a15bc5bcd8252fd459165795c500bbb2fb1476e5cfef9549db733be65bde391c810d099e3745a2cc7a94debe1f4ff6653b338123ef7d2f9a602bc9a4bbe757a63f932a802014f2f06c6688faf14332a355b1025f33687124399f55b6a5adb4864727ec6c5334c41d78d1463400925f6c29c0f611f35c9640045a740dad5b4f0dcb632e7f9a3478b526aa9f97cd9f8d3ad094b7922890e7b6d9c67fcc4f747d04ddcd115fba0a8f0433c6fb1bf6011a9cd153f866c76b26d427a25aebc60d10540\nCT: 8d668fb50efda82552aeb5d075ff3977c37929d73f6639289e7c6da8c89c664df80b2387e788d12398d62d3c0ed2f9f918010d41021c464d54f016c4e10e85e29ba3a45793df2ebd6cdf30045363434387bb0d20439f4986e6eb7ae9fd85fe776f7b8035025624c2413ca8491cc6e79fe901b9c40ff3a0e37a7c7e88b56de4fee65861865162821e046846d253982e4ecd17bd26214b0923a4297d4ed9423395d856940829ca5ee74488c3b4d8aa3c5ceade17d8a3f2e45d3ba91360ac1c76d6a29f8243bf49c1d75aa41ba239fa6f3b123e198ba799e3b70c674607c5371894800954eda0264b3b82606433f71371dabc5f1fb3d703232533662920a241f613c38d16b0bad24f4aa3b336af89cdcd2f371e1bed7aaa47c56d17100a01\nTAG: 594ee5c93636cfb5fde940e3d561440a28f6f0c288c9f92e80252e1e\n",
+};
+static const size_t kLen8 = 175688;
+
+static const char *kData8[] = {
     "# This is the example from\n# https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#section-8\n\nKEY: ee8e1ed9ff2540ae8f2ba9f50bc2f27c\nNONCE: 752abad3e0afb5f434dc4310\nIN: \"Hello world\"\nAD: \"example\"\nCT: 5d349ead175ef6b1def6fd\nTAG: 4fbcdeb7e4793f4a1d7e4faa70100af1\n\n# Test vectors from\n# https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#appendix-C\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: \nAD: \nCT: \nTAG: dc20e2d83f25705bb49e439eca56de25\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0100000000000000\nAD: \nCT: b5d839330ac7b786\nTAG: 578782fff6013b815b287c22493a364c\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 010000000000000000000000\nAD: \nCT: 7323ea61d05932260047d942\nTAG: a4978db357391a0bc4fdec8b0d106639\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 01000000000000000000000000000000\nAD: \nCT: 743f7c8077ab25f8624e2e948579cf77\nTAG: 303aaf90f6fe21199c6068577437a0c4\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0100000000000000000000000000000002000000000000000000000000000000\nAD: \nCT: 84e07e62ba83a6585417245d7ec413a9fe427d6315c09b57ce45f2e3936a9445\nTAG: 1a8e45dcd4578c667cd86847bf6155ff\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nAD: \nCT: 3fd24ce1f5a67b75bf2351f181a475c7b800a5b4d3dcf70106b1eea82fa1d64df42bf7226122fa92e17a40eeaac1201b\nTAG: 5e6e311dbf395d35b0fe39c2714388f8\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nAD: \nCT: 2433668f1058190f6d43e360f4f35cd8e475127cfca7028ea8ab5c20f7ab2af02516a2bdcbc08d521be37ff28c152bba36697f25b4cd169c6590d1dd39566d3f\nTAG: 8a263dd317aa88d56bdf3936dba75bb8\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0200000000000000\nAD: 01\nCT: 1e6daba35669f427\nTAG: 3b0a1a2560969cdf790d99759abd1508\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 020000000000000000000000\nAD: 01\nCT: 296c7889fd99f41917f44620\nTAG: 08299c5102745aaa3a0c469fad9e075a\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000000000000000000000000000\nAD: 01\nCT: e2b0c5da79a901c1745f700525cb335b\nTAG: 8f8936ec039e4e4bb97ebd8c4457441f\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0200000000000000000000000000000003000000000000000000000000000000\nAD: 01\nCT: 620048ef3c1e73e57e02bb8562c416a319e73e4caac8e96a1ecb2933145a1d71\nTAG: e6af6a7f87287da059a71684ed3498e1\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nAD: 01\nCT: 50c8303ea93925d64090d07bd109dfd9515a5a33431019c17d93465999a8b0053201d723120a8562b838cdff25bf9d1e\nTAG: 6a8cc3865f76897c2e4b245cf31c51f2\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nAD: 01\nCT: 2f5c64059db55ee0fb847ed513003746aca4e61c711b5de2e7a77ffd02da42feec601910d3467bb8b36ebbaebce5fba30d36c95f48a3e7980f0e7ac299332a80\nTAG: cdc46ae475563de037001ef84ae21744\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000\nAD: 010000000000000000000000\nCT: a8fe3e87\nTAG: 07eb1f84fb28f8cb73de8e99e2f48a14\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0300000000000000000000000000000004000000\nAD: 010000000000000000000000000000000200\nCT: 6bb0fecf5ded9b77f902c7d5da236a4391dd0297\nTAG: 24afc9805e976f451e6d87f6fe106514\n\nKEY: 01000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 030000000000000000000000000000000400\nAD: 0100000000000000000000000000000002000000\nCT: 44d0aaf6fb2f1f34add5e8064e83e12a2ada\nTAG: bff9b2ef00fb47920cc72a0c0f13b9fd\n\n# Random vectors generated by the reference code.\n\nKEY: e66021d5eb8e4f4066d4adb9c33560e4\nNONCE: f46e44bb3da0015c94f70887\nIN: \nAD: \nCT: \nTAG: a4194b79071b01a87d65f706e3949578\n\nKEY: 36864200e0eaf5284d884a0e77d31646\nNONCE: bae8e37fc83441b16034566b\nIN: 7a806c46bb91c3c5aedb64a6c590bc84d1\nAD: a5e269e4b47801afc0\nCT: 8092e6d6d729f5ee7e808d77f3b7a89647\nTAG: dec23ae31e3e97bb364fa18ad85cae0b\n\nKEY: 577e34699b9e671fdd4fbdc66f146545\nNONCE: fc880c94a95198874296d5cc\nIN: 1fd161320b6920ce07787f86743b275d1ab32f6d1f0434d8848c1177441f19549586\nAD: 0f046787f3ea22c127aaf195d1894728b3fe\nCT: 7520668ef1b845aabf245e66ca687ca7c5b4f00de71afea392cda124893746ddd4e6\nTAG: db5ad3b398513fe5c8d868e68becd5a8\n\nKEY: d1473c528b8426a582995929a1499e9a\nNONCE: d8780c8d63d0ab4149c09f57\nIN: 2c614b4745914474e7c7c9882e5386fd9f92ec489c8fde2be2cf97e74e932d4ed87da44102952ef94b02b805249bac80e6f614\nAD: 55bfac8308a2d40d8c8451178082355c9e940fea2f582950a70d5a\nCT: bdbec524ca37355074899f01b7247b1abc24565b997e000f231f0664be655d8cb75f18112cfaa722e1b2e261710036ff919014\nTAG: 45b9ece29df0dd93941f9454404c8d87\n\nKEY: 1db2316fd568378da107b52b0da55210\nNONCE: cc1c1b0abde3b2f204d1e9f8\nIN: b06bc47f9745b3d1ae06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb6de71860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f\nAD: f901cfe8a69615a93fdf7a98cad481796245709fb18853f68d833640e42a3c02c25b6486\nCT: d75a5a40ae0ac4343f1a52ee16108332b3563616c207c2b22be277a219e497b7e5bbd5bdecaed87a5216e3e49149ac50a7959957264c222577a07c73fc81f0e579a0fa93\nTAG: b70c26c56e34c7740824f9dfcb8ae6e4\n\nKEY: 9e146d7b233987bddfc240871d7576f7\nNONCE: 028ec6eb5ea7e298342a94d4\nIN: b202b370ef9768ec6561c4fe6b7e7296fa859c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac73c535de192eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23688089e555\nAD: 40db1872504e1cced532ce4159b035277d4dfbb7db62968b13cd4eec734320ccc9d9bbbb19cb81b2af4ecbc3e7\nCT: 23dea4fb871ab1df6cfb674d2e7efbc969033a11d694c6580aa3e780e4d1db5f1145924b974ce98ea041ecca53c36207fa644b0ae789965084d1ef845cae33aff734113b3eb4d9f1863b780b0f97fb5e3c5ea991cf\nTAG: 81da1dfc98517d4cee3ee885a266e814\n\nKEY: 2834321f7aa0f70b7282b4f33df23f16\nNONCE: 7541ac15c8417abaf17a282a\nIN: c7a57252ff224ae7911a905b8c699b20e40c1e9569a6b2aa0232d4b10bb6f20406135861c19795b95f9597f9b72c20931c41164f1b469b0901f2b5da3a956a6e278c940e82593eb58f56f6d3681fb00dedf7f612c4cb3193b73ab35f9a5a9cc8d13aa27ff1de\nAD: a3b2a7d832ed8ab959d82ee795df8e1ef530cc6fd9a1f10543b44c49383921d74fe0c71d50da4adb9e9c7e5491a488ceb5c384ebafad\nCT: 06d3e558b2f7f8e225d76a41a11122aa29eef02c226616f5264c9c1b821748a8115dd4868dfeacc5d167ceedc824f1f7136e7d7fae783bad83dec468c98747524fc2fcd7b86cbfd1c07078fd1b4b9caaae970c729ee3f2ecfebf048c5aba174fc4eab117bacf\nTAG: 5ece142ce1074a09ab8ce810222a471d\n\nKEY: f0f484fae982019a8ea22efd1358adf7\nNONCE: ad4f5fa0d2acd2f1ee095cdf\nIN: c13310241243fa53b8c2610d1924b1d55cb6d9cb6a5b98a72127255967b8ff23623c5453e61cecf9e624e5c803250c382481d3c10febfa54d03894ba8f9ed72637fcf5631f7b7312cc74e6ff63ecb240349a575f2cd817f2afbaaf21815bf08ac1e8f87520244b4a3fc492c7120296607ef64d0adb4c74\nAD: b73839e13455fd91ddf7f81d460034b9c41eaf0cc6040a84e17e6108372f1ca50656793554ea1d05181310711d0e60d4d556b2bedb24d7b622c01fe8025119\nCT: 90046c5ca4a6db850c5cddb14227b5902257e7ed8bc55f85ca24f51558f95037a0567d485b7606d2ec1802de069926e4f69e5ade9453080f84c045438d890290ed69b5e140788d07ed3d38b067900c222ad55b298e240590cb816d90a43ec52203f11ff9496b3dc32d7ac316ac8465496e41b4be5200dd\nTAG: 76ae0503f7b43b1d2db24817f2b61ee7\n\nKEY: ae0c8a20b679dc40c9908f88fecfafd6\nNONCE: 88b0ebec6a2ac13421012874\nIN: c80685c481b41323a1724ea96c1df644a595e8cc73955e6f661e0fa30737d78e7cec11629b8f1fa4bbd8e8e655f50019859514dbc4cbcf944f95084e45337d9d9d8972bd8da92b4eb5a75c0b284305601de859f8d1fac6d6b3fdd42210fdcf696119e436006a5a863859d5b70806197fdb9f0da3e4c31b0c7545809808bf7683757cd11b9d0f8621\nAD: 664df31eb95b5e17567d680b1a26980772e8ad3e9b2e2de537414368c4f97adff1408d36c1dfee65b78375c7361c91452e7d463338474a400ef9efcaa648e93f\nCT: f729ca77733cca181ba8801e001924e20a1d164cc4440a6217a1178dd6b1210837367cf84aa41f92f4123d6740910586f819389d5c750ab15768aed1b163bde5b1fe8862d1621b11485b47182d32bd304ddbf275524c4ece4cfb1361db53dd63e21ac62bb54",
     "a77bb5063c869b5f5de1f1b4356845aac79ee6f66d21ff271e02e8bbbae1372b4b8ff\nTAG: 52856b3369ecbb7201b1b0f75872e5e2\n\nKEY: 38f8784a1598bca461211195d7844de5\nNONCE: 6b91cccc96d89e6471bca6b7\nIN: 374aa5ec4b2f5fba66c17a435970411f2af3d6e33c0d094f74fcb77beb6cbbac1f3a8a19f69ca087f94a5b80d5e3692e0d10ec34aa67269c824b382d6238bcfaaed586177b852f816c31e9966744188f02647d881990d98c3eabd477557a739262bb3f682f64d2208faf98097586053a32cbf37e78413a2d89613a81966e8d654cac0aa34107947a036f403bda53e74bc524e7bc2d2c51dc42\nAD: 6b38c308cc574839129e5e6251f41dec9cff7ccf256c38e4994e15ca976d3185ae17030ad3751e56367f86886acc32e27fe04d0b89cc89b0206f281aa2d80f9be19928dabf07417e76\nCT: 350bc8baf35cad823df06eadbb0e30e1e4b5bb8171d14c330e8c488f1076d94b8cb7baa3268a5bf164e23563180b9793ed06bb80079288cd348eeaa8eb33cf31ccf89dec998408baae4c3a7b3d3bd14aa76e99d645da0fba0c29a7ea4baeed741de3a5df5ff4044d9b057c4f3ef1825dd0a47aa0b5e92cfe0321c07333479dc86bed7b7b91e6ef368401392d973404e2914b7d2cb49448c55e\nTAG: c974e989ae2b86e92c5da9b0c9b068e0\n\nKEY: 59b17f09c56d170ed1ef10d2fadf01e0\nNONCE: c78473d06a1685ef0bb112e4\nIN: ec7e6ce0cbc601fc8a2dd64045c8fada4a28c0c6f0ec98542e365279d00ffdf5e2eae3b663c4b79342f2f265db30a86d6e1b325318d7f7a622b36e746875b71165defd5ca1afc0a92db6ef4fb9e20b81018a5293899f1e0d06b18a2e65f7616638f79a0db3f2cfdcc0eac2ee1e2e454958e2e6d214a20ad13156f97d0f2cf4276b09f5945c11f6b20b7bede26d6c2f0e5cf2786eea66e18d6ece02156f9233bdfc57c75b1a8a8b1f4ab8\nAD: 5be5a4a089f0ac762060a336aa502f5a1df1e0a647fb9d5d932dc0654e0725122f6a567681a7d1cb7625ed0404d540d8b3145c911280d2a0ff9d1c53e27677be0436faeb39009fe5751c0b37c7a5f1137a26\nCT: 6b07754b096556462756de94e5941610f1bfd93e6222899516e00eb1830f557d6f629bc61abe0c247ab6aa0f4f816f79544ceb034b5d9e86ab8679ad67f6dbef521f6180a07b0bbbcf174cd9234848f18b8ebba7d6ae3d607e027cb220c7582eb6d496a980ae3883fab88a1dd9e5312842450fcf68640546b49c24a3ffc0c8c4f539e8f9a34a3bbff44b1bb4cdb339d8879fa4e0c2145954e34fbede7483d25a0494c1b9e5b1f70aee7e\nTAG: 064c9d25f8795d8151b33f9d32d3ac6d\n\nKEY: 995577faa109071bee1c87d5e6772ca5\nNONCE: 5fdec02348a625b49c3c881a\nIN: ab162f20ba0b834e8159d9bf20ee0c5d14da0221961c4fc7d9b44c7822f32298d30775cf974172ebfdb36cfb2881ccb15e5f69ed27880b920f4a092815357e03d982f75590af08b447f0f8466b031ed2409e9f5eb479affd9e18017a369486914c63a7494168d91df157f5e56fbc4ab6ee5a8f3af1fbe1bf9324338a1f4acad45fc7137676797c89620b15feb8512544771f280f322cbaac9c4d7cfb4c326824825ba5b5f5190fcde0d399ef1f52b82abb5a8b1e5f2eea2c79702d\nAD: ec4cfbee3d1f5cc11e085d2254f8b37f8030bd285d6aa1cc53868d18ecfdd963153485dce5a3e3e8cb0a3cf8074571f7a2e9e841229466463f506a2bc90f2d6413128efee043e01eccb930fbc002563510e499457161083ed7997e\nCT: 0610980d938c2f2619bb8b4408156fb53f595d857feae649a6700af296d0411cbb80a6c0b7e2447cc54c3bd3bcfae38b7bb10fa5b91e25686d4482b14a2b62d386175f9f247e48fc3b2215b2da1c065bb00f9f59e8afafc9ef205f5245d27085021f41b9e40c00abaea48286fd914e558f822659207e965855eabf52723148d84b0a2692c48d76f30f3cb530b1beb58ffc4824517cb6772e957bd56394c1d8b70c9fa2b70a670f3fe36d8802b2043905e469b558575c75012901dc\nTAG: cb51baaa4672b8ae9745ecee08784d3b\n\nKEY: 58ebf03ce7ed2f8d5487936311922884\nNONCE: bfd31cf828f3d0ce78f3c698\nIN: 1932268108a369048cdc0a75c062c0ed02e27bbd11754e621ff67c511ed98c6fadc3e95e7100644ebe1aa147a7e99f25ce5c2edb8ab6446749441027a211b8d04a6247299dfea9d75eab257a625aeb51f74e0b47b302fb5c0475ab23e99f4d93ecf07694497ff6b27c9848805af93a5615bc71486b26fc9da67cf60c8d3a396bc0164985fab2c64bbaa4dd0fdc22c9d9e433e8c70dcdeeebf230c7a3cb3e5d0d48573a64b068daf90f56b15579767ecdd420c0858fabe23abc0b313b97a9c1ceddcb59d5322e47a85cc58e75\nAD: 3f00d6f0d032d4c5110c8f22e98895279a30a86da0ef71cea6ef2738fe3e747ee54d2e96e3afb8916281f6369ab1a397ca0a18c6c0e9a0c4edeaa4190ce6422bd116ac254a12235eb66fb5cc7ef55b721d3d2db4c67c38bbbb0bcac9234ea7d733f200e6\nCT: b741fd48fa7634435db2cb05392004d0b588bc7e9ddf79526706e575415c8b3d48a606c5f155130deb77ec7aff93719396797bf6628531d9d061727bcea2b348060b64122cd1a94f999ad1f681847e57c05da0deabd2fe010212dc60ec980ed0ba78ee9160b3776ae9174c6f8b7231d6754a4143c8af129411063315c6517134ca26d5a94a2e8c6e8b7ad9b8e78b694d5251deb34dabc455dd9f2a2b3fb6f67222de61e917a645d366462d6d94cd265f919f237f06f1986fac17bfaf3a97c24b99af884d0fca5d3307caf9bd\nTAG: 35777ae50d32c572cb0cd778cbaf55e1\n\nKEY: b86fc55f4abb9b65ee1897c262533ccc\nNONCE: d118b0f493c849a7aa7f35d2\nIN: 43f9438f1858da62bdd03fd5a8c7b01d8097d7ce319a41f80104968a46599e9a3289a29a16b245877898f345f92fa70d3e613c38e6e4ebbf0bcb64c1c41f8b83ec8e9f159d4b830d9a1b79f2ad90db067856eb8621e52ab3060e8d72dfe782b62364c163fa00b49aa6fbe4210fb7208c642b7a6735b1a8b2f1dbc4b3d4952985ef207a3eb0a07b1341700762e9f9d1c3438fc6633da2fbade15844cb1813d258aa5bfa4ac129d693792a89622a0c686f05d87019a266f91387d96bf2baae0262782b9c23162f5271cfa3144265deefe2c569e82911e842e5c9ae8fb79b\nAD: ecf42c3afe389acfdc9a34bec7b45705ba68e205b83b33f50b7852fbb7f4ae5dfdfdfb3cfee8a03c96a036388aa8f7809bd47eaa073f92905d0d5f199d466cc0ebd9bceb207f4209bf9925c6109973194742dc8d813f3cb212bbd8d92d7eef645fb0f8245811876dee5f241763\nCT: 87454e6cefc24ba38f01bb791333dd0006cfce165a4247833b182efcdb484b0818aa80f70f29d0ec093455344b8f169262f17be2d1635293bdcca90e21f2c210146f90398f44b35e3f2203c7b5bfecdbd973b568d8ed8444d43cba08d44984a295f62c174ca9ca69c173bb7c43f103ff53a886284af46fde5cbe07b391f9c0b82eec218faecb43dc75372478f2ee1bb267602672a4ff5989ec7251034dd2cfb49677fc82c8b209820be1ed2c429a0491beedbe8c1fc78bd62590ba71fd5da363d6da000e8b7e5bae223c0cf8397d3b5ce7141e8b301ea5a737ae480dc9\nTAG: ad696ab700dd5b71d79f4f6f69034185\n\nKEY: edaf7d79c1b83d973f9ba3b29a9b9408\nNONCE: 418f73743ff0546f0d929001\nIN: 0cf3a665c443b85255759ec6248021e4b6eb825c398b5af7b5257efb7afc481abc20d90249bed5b30d44f725c78ad0ce2821f86838874dceb6b6207ad6fa34579126de720ce34bdfd2058d92b8bbbb3f1bec607de3f0a028d8f6e13d0d4d2d3861e1a26d79cb68d3fef68127e8458eb599915022da751e271cd047cc712fae5b0459ae7815a24f4edf806889fc462c83181111f4de5bbb7e66a701460f508eaf73798c3ca9c08cc1a046472f4b18c69b7ed249a96f9bfa05a276499a5f499c586027c64ad6a68dcb52a50aa6d1b1d4d202e6f184f01daa08fbd643523f4f73ae6b8d764a7f567087a5fec5ad1ee3\nAD: e4be5b677b87109e69eae9a635ac2ea185ba08ebce3ba4be06d53b2da081c5030f5a746fea7bbdda340e10eccd47238340b9244b9442c0efae7644cff53c7abd8445163e891cf30bc8e26eea01f0c461b4796c2106e1ffdfdd1bac29f7d3c72c8ca7f625008d8d333d2a2092c08ef83c8002ed90e2ad\nCT: 9372586624f9a52a91e7ce12f380ca13840f11fad8d9edf10c869042c29514515673b3dfcfe956e8d3550baae1815bb4cd41ed27c7485c723354e557d18119b27431d7527f0d84c6e76baf9afa35a215624c339ad888f27c338240e603b232cd247e77eb1475adcb87d0443265ac0de45b16c67fdab07a0c0dd203d97ac2e19248492c561912e9087cd5fb73445695b43b8dd8c7515f9c958dc64068e31d3cb615038f5eea84a74b5d0c3415b6b1309ea8092614f2bd944a6c3a9e002a95e524efa497c9d3cbdaa764f8cf8aa9fcc7f7d68a623930bebb74e5c234322651edda21e20eb12c16a76839f31f3b30d6\nTAG: 33a31cae0292d0185aa10ba1c2288cda\n\nKEY: 01dadfe4cc0681384b489f38d25e83c2\nNONCE: c563485fb361f81d44aea205\nIN: e5bb4c1912d00d8f99f8d7a931e55ae72f749147fbd97699ec730bfb01b8261f1f94696278fc703263cc789b283460af9d74647a8c039ad2184674e78f6a355a26eefc6fcd4cd32d96d245d583836312652fd9e6694ac5644eeb4c2bd667b52e5af14bcb108c8e277728d6d6116e8ed1981993771b8bb783bb351982f9f8c2a0e7c20a5a863c6d71b7145b73d7e6d84d47780d66847244d0b8ef559f2297f39e26501d8a2aae8c36189580292da842c4d0d06a21d21ab175e34589e3b814d8a00ac1d8a3b2eca2a91b21e36c55fc6dad8c0a1b2cc7bcb2108b2e21fafeaa26a2d4881b183b899210b474bdc43a8f0b8464075d86a2ba1e9cd195a8ecadd315\nAD: 870d5740c4e22eab0783de87d541fa834647c3fc6543c60d5df31c19c6ca38707649fa8dcfc3c0ccc16b1bb60283d7ae2778a8f83ba07b905e23cb06d5656f614f1efcb346f34e190bcc636cdca229b64af9ae4b1f05b58f1ffd1a077a51bbf9ede69ac3954de7daf569cc8de12282cac09b9a49dfb92dcc409b8c63f2ae4a\nCT: 119f74936eaffdc3e5e7e072ce81e0e1ca91054cbfca127b8c4a94ada042a2452b39cdd02ab897da765cc0f8d84089a8cc5af662c1c96aefafeead785ad042b506fc72556182566263e90009a86503595dca0924d87ea6ac61d4e931025420436a8716d0ce379c5e3437b26a12531c0a1abb3a693f3202f5770f1dd7ec1eada8c2d6c747a7161d19ffbb897710a17e7740fc232fcc244f456e962ebe71f7ded8ca73e07dd44f00fbd023b8a72f9005f9bd4d0d44135294258ec14665309e9edcc82d98227474a9202552d31f1d2e7374d49929c2885696e5e3edc1983432f1dbad351f9cae3cd56855878d9a076c6d3a27f2718e32658f2392215915c020db\nTAG: 5689d9a73d52266977bfe5c1bb1bca09\n\nKEY: 34091633f4aaf225aa02ba9c57b910a7\nNONCE: 6535f0cba67fbab0e6fa0bc8\nIN: 76217fc9a546a97dabc9be41209bd",
     "b582d8d8a62865df7398d4f7e9ac681bcd102e31bfd40cfb8e9352b1e8ff7a7b81cfe2a62849e8b77dcfb645d2046404a83442133e245bd1df35d69dba9ee097dbc867cde7b431565c72fec31719318dd27c3e47dc5f8729ea794668d8724a1d4115adcee0725e4c1e3ce16ed9e31bd5a409cd074c0277e21a0b431d3b30ddd361ecd176a8d86927c2f6693105d7d3c47d9be8bd90d0b2fb20587623b2e838624b590a5c9f0e6d519b35eb5332b16bd2c2f9534e376ba68316efdb963d63e2c87cb0716973297d986bbd885a7306e2bdca0855447b57817285801341c10baf67bb5f71b75a11856d2551eb47e60025a0021\nAD: b9948afd8818888585a6957eb59680a55a5c42458f2d0e0f39bcbada0ba0b6e72340193500e22d243e32be0e7d7bc5c632ef3dc7e79ad5acc895cbba3111d8d1faa69bfe2ce634fc0d7b12242dd8bb105c6ce54cc9718921378c906ff5e61f48fa259b25bd10fee96856a206a928b450a0098089d5cb7378c2935c4537172076\nCT: 3260de6acddb17f93ff06dc7a8955f5d363bcee255bfd40fe5e92e13c7a1c682c6385736284c5cd858ce6ed251b92f5eb10f83970525f56a1ba0b8edba790ddb015307cce877c53a831aaf56f375fb20e58199f6ddb91efdf9983f263c9a746fa2d66bd4790531f85e7ad9a07cbcc00e9c122ddba77b1cc2b37b734a0ffbc29188685227ff42bf33c2e912eb592de1a45381cf6c5c9a36af93af26168c376e8902299e810e07a8ba2e23670c5221110ad4296a581151185553fe366bb4057e61b7a788f12cdfa635d9d6b8ca47a5596a765d58bb7f877242c2e0145d47c300175d7af62a29846830922308b6b69cce8413810184b27a8184bca2d8ef16316f13\nTAG: 7dc47ef9283971e1745fa3ff698c6a04\n\nKEY: d829975798d4f24ad243e4aad474fd5e\nNONCE: 59e25a6dd133944918709e33\nIN: f84b4daf4bc6d3ba1e0b9e364dcad5834024066ab5c8e672a999bbf23a83956623943e0011e3a2883d23a767b280ad84e2d7fe5811099395edd269077162310481ff304128271d4ce5c84ea738fde318cb2528bc5cd448c67837cb7dedb632d47e8f90e351b0a8942da2f78e2065cdf827a85f510e22156bfd971ab3f123e9774bf3ff7c224af19bc79e812839eeb3f1c14f89e5666c16c44a5483efbe449237508ab2436939098640931fe3b928cb3a9378b6b9fc2a54c6bf59f34b16f06d5ef132ae2a7161034f26a6e07badc61ea51a94a20e4692a0a0525726f3de9bd1d6151fa6a0ea3acef3634847cfbc98d2e0bb9ae89e4f91a78c56558ac92b4f33fb1d96b1ade26cf4b2fec779bfbf6709e531\nAD: ce0e6219f75c4c31873d4915b1af3a51c2ef5e89218ac4060dd12be216654eff2991e8d7bce6f6a437966f80c59c527679b8983e75c617c917fa9b63bc60748f5ca179645afdfe6a126a73d3fbcd41a9df6d734e8783aff3a5134ecacbb289f93febbd8eb493693264026f8678e9fdb779038ac13199459caf9c4e86f4cf8306af6dc04d9dbb678d3c\nCT: 98bfa05d1dc27d721378bcc25af4899c9c88fcd54d56662282f9b820e540444dbdc57bdc63b60680262aaeb8387e149fc2a759c0246f771dd9a13209c4eaae9f8c7e43439535afd85c9b12fbfc10f8f9f417079857b9e061cd24b7099726528f4ef529d14097239bafdce4d9b51860ad091c8a7d1faf39d44523973cd1df0377339485a89036d62cad090ffb9d05c7c7d79b01a22b7ee5e485e76ca9be9f037a94366968003b73915b027b161ab90fbc6ab78f6ef261ec5789d668fa2b28b1b1937da1d2337507997fd0d80387495d6953b08ac0a3fcd24f1fbea3df9218a9f0f1112d7bd4bb03ffb9dc790306db5e03d67201ab904df0e4ae283ab3d62bf48a6d79a5faac2ab33aa0599c0a6de5677ca0\nTAG: 767e68b063ed300e63df9933d6e10f2e\n\nKEY: e9e41d154c4c1bca018bbc4d744655af\nNONCE: 04ee2cd524db41170f0946df\nIN: 225d156dcdca3e52139561b61c26bfc56bc90c21cffa69468863afb66c3e1524303f8f42103e435fa2fe2c2956feffe5b06ed20bdba730d675166f13118a193b06d7985d54d46e4150468df1252d7cd144afc99ce99b93ce9526ea4dec2cde1d0d72fb82f55db65ec2035e387e7923d98490cacc793046afaa2e49bed34cd7e4eaa52e75bac5e86f9e9eb81028cbe8a515870edb9a151334e1f961949855565abc51af9a1bbac0222e9bd217d3e3a642b0f3df8e7c47c2c9d5a801cc8028c425b3becbe31df39d30637c38f981d268017da818010189c93d2d135024f239407623496c5435f04f9cae86e63ef46fcf9787c946b400249d8476f82dee274cc0cd3714973f1b6e0ebc443d681af25ee26a8ed475136ed8bfaeaa8315a4cd198961518c\nAD: 7bc7b15c68437005a4973a06818738adcaa250949af910aeb807096595b3af54bacbedd966f83f784f651f7a2044461a94f1a6925e6d2064e72319dae75d3883a50afb6be1395d429f24029dc9b8cc021f15e305e5418d844aa4a89ddd299bf2e8c698a8f6a6cf0165c37bcf2e5885d73bb81ca15a33ea75da5946678dfcd546d475149dd1a2dab0e11cc8b07c0b06105a49\nCT: e3a3521e3e99ec595a3d9d0839d8d0cb4c0929e44f693df016da34e0d8a1f3f6aae28fa0ac0f38d46ef06a683adb04df301ebcd6ef0abf9ae3cc220cfdbf36ce8c023714d203ba785e9abb05095c4bf7f07a13f9409a5759428e6c97cd4a8b2e1a471676807cf76131ae471fa4e8d15225e9996ce4c7630c4b0a5ebd85db4bcbd79bdcb641a626773560b591adae5bf582f3e92299a60d081aacac117235d6d8094e97b034d120c6759394ede2a8b67e47864e1f50669e8e926ab6fc5cc696e70bb016de92707d4800b25ad14f9c457baa1e21b4bfef0dfa6d849e0951c81583a711242ba2383efc85381ec7228b8e7950a375df405f820ab5dec8b37572897c6af443667e09d48a18c9bca0322efa409e04f57741305ea7d51ed9018cb5d0f00b5d\nTAG: 8aa9505e89a01281f033e9658ddb35c1\n\nKEY: 7b1fdb1a720b9510d7d8819b6d946dd8\nNONCE: 5c73be515c6ec00a10a69661\nIN: c59fcd7a005dd08f3cad722bf3560f356c624404f3be55a02b3301ed756f557a51593ba90d18a1c13e227c8d5180fefdde4957484dcb81d08ee3331a6fa74c9c549ae13b2dc2a80ca0435710eb9f0dc2c908d896957b87325180d397c37ea7cf65db45960c4d791bf8cf798bd7626b13bc5e6b45b45be1a8ff687572ece86d1f5361abaedc1a7f9d9ff8003bca97af7dcc42b4399f9da4a0e7e829c0e12f4d41607303f60d1df5949fca0dd9ef171678e013b88789ac1f51a8160687d842c273a2dda93c5fba1eb5bed7476ba96a12e70cabba43d509b311e9d000212c81c483b7e9e7bae1d9869a125558b2c7ef8f838bdfe97af413b460bd9dc5e372afcb105832ee4c406d74781d3e9f2aa581ba4fe458989a03679744edb73ba31c7d9d37920d4d57a766104afc9c96650e5a602ba885d2\nAD: 078f1c67d44d6e86eff0c96a146bad3420c7dd0c64d800ea5ab7ff472d0f61bdf2e5634e06cb4f3c022dff8c4b46f2a47fdca2d04572b67f24125c66a551a1f150a02f635e1e99895807efa8001f46388365c48e4afe49c04f6681510f7e4cdfa02deb3e60eed745cf6d7ca6b773e1537d057a043cf517e5388dbbc44ff4bd68d2a7243587f8929ef07df5d001a6099bebedf8f26f49323209496d\nCT: db79e91f4458befa47953312aeaf6aad01c3fb6e2cfa19b0ba21ce6698896e62e7ad2cef344cd324b3f0d317d9fe7ce713d4cf1743adcbfefb65e61ab6b323c5f16762ac527882f214539e034719047f9d3c0bc80480b7f76481e2fa26262b0bf426f1599d3d0947492769ccd65433fe70340d8f74fe31540b48c053eab97984f5f670651746b68617f603ef23117e9a8df0266851ef895b58b847e911508dcdc590f6188aabf37be430bbc72746ed7f5f47f45c90e2400d5be0e323824c5b86a2a0ea7c2156f482f7e0ff42923d6f7efc7f4f2cc77915bf85091216bb0f8c35f5274c0c8469ef03ee78b82cb6a5b510e16793f38fa2582ce249370ddf480e212f1cbcd77f89810b41effc9c87b0a80e5a22059b36e1dad294cd158f03d80ef3ed31b5f3b095cacbe5782986a69d5ff7621609\nTAG: 221274b4be8a4fcc765c2ac319b5186e\n\nKEY: 50109c383071e4a61ce18f495d98b6c4\nNONCE: bcffd0fc2496b7eb0ba612e2\nIN: a4cca8eee2a3daa0c21d854d49ca73cf5b24b38940dc2b44a2a6623e8404fc30c4e3aaf759425ebff85cb1c661744adf34c6c5d538f3210dcd0270a3d12784effc48734b53c1a228db291e2e5573b6ba2aed0a7296c1bbfdd1f4a86d6057d5534675a3f4897fe3a1200c54af7e09b97b0a2ab9f25d5ed375e7bac921f28f7b6983a41580362dcf0820a2dfe82989ccf0a998286623617453722bea0b6e8fba504b93cd043c7e6c7cccfbccea43f7e87502026f94cc7035c5e84cc14a5fef9bf2be53dc379053725a9a29c4e86252369bf6dfd3cf2801af7447fd0529e94beba961ed65dcfd492398123faa55346edfc3ecff720966b74fd0ff28f443ca67f88b8f5a4a73007f79ef782bef601a0827888c4c74f7777279c625de8a4b51db94f94f846474f8563001339afb3db339ab997cd1eb1eb7b03b228162a480e129c66ad47dbd18\nAD: b4c98f6d51fee205805a50c163beb176b754366e13c57c18433228a81089be18b534ee5f9567d529c802d34bbca36807bf845a9d14dd141c5de85607a4b4c5521e5aa717f78fe78612b770a4677cacd77a425e2496ae50ab2e559526c37ea723f2b8d14bd8314e4cc3727bfb835ea4062e87870b13d94d52c25f0c631668292f184fc048dfeed7a9d1a88cc5c4662030700cd8c257784009b4da9039909f73840b600eaf\nCT: e7a4a201f58f66ddc0b8dfdf95c859879144dfa896406f43cbdc6adc148e0ea8f9a82170c5ab54c77dd0fa6dc209b623f0f5cd4ae358af96ec27c78e7245855e94ed1a1182f9d26d45e0872da3fab9fa9ee3e58aa168925d7f779feb77608067ff45b7ec7f2ef7a48a06ee22747ab96e1b485ce144bb3cf97d1e3cd28823628a2f8e3785d9af28b76c53c3d4c741d1ec56f2bd10939f6c79578c308c5e509ba8b13c820f5912d4ae169da4e04f86ff9b1cb9faa432545f7999ca1014f77c08ae9033712dbbc0e99db6eb604e774d5df8f6b928a0bb59e4c662d778d195aa95194a0cdf7688b309abe223048937691440e5a78cfe0cb75d229634aa49ee54a81fc9a6478c8fa310d524bb15ee8f54f572dee30e44eeb9603c8593f8a7007a1b0dcf2e301becf300f20d2e868b104154651446316414b5b5e9432134c0eba97b4cefb90c32\nTAG: f304266924eef673246b3c14389a82a9\n\nKEY: 670cd4d988845b1d41cfeeb1ea740db1\nNONCE: 29c12f66a74e6234ebccf4df\nIN: 706ed30fc736cb5cc0db17ed108229e87d6b039da5c4f0568a4cbef9d513dfbc0af9313f02d5129cf616487934f741a0a60bf11fdc8d29ec81eb37577726f54f3e35bb10ef98b1d15bd5726fe501a9249e409eccae128df61762447962ba2a63f30b59ea25e18895d2fd11431606caf6b45b908b08cf2e150c031e20e6cc649699fed5785cfc6a0e22bd8bd8c6d25221e9c9a8d2869d236388fdcdcff990cc940ddefd06da0524a351ae6",
@@ -386,9 +407,9 @@
     "1b96616e31be24c7a13e62b04646ce0a68791e0e1a099b862435065cf7d3203fb32d7d7d8ac4a77642d69f7c27a46973b6bedd5e840f887209d19cbe50504c0a251056c8a83100092a627f73edb421a3f1aa12edfc78d3fc474cd2583808e38d63baf1c5b4b5cb34665e10d4af806bf3abbcf4432df6c9caa76cf0e17a5e0e9af7c8868daff22d84b7b6eb4f299b750ff18b9b17d7412ccafe3e55e5b02af9ad87c03799c2282a9c6377ba42e840440d8c1b19bcd1c8fc35f02fc505a3ce97562b9e660fd488b53c30edb98b91949188903ba2078193c2de05e61c9da7bc056624104471a8231b7fcfdfda4d804b8819888a2c9bde680bae59e438d89778c5a04dff214e9b14ac5b031c378c8beee5ba9b1f91dba760d7621c24c30aee28c4b49e183632d8b450ee6895a47b96cc3c1917af685905691d1ca588db5a21674391238d76ae101c3e83d94dfee4a0656baf4d6cf277e0c7b0512e4ec13d12a5af44c7d19820fe7a74f5d5875321d528976f35a5634e15dcb35a54836370569d5609de0360ea4d2f1937dcb2d68b20cc5a04c13c04d5379a7dcbcb6b711712d7b3b20d255156b7e61e99803a4d767f0438c4fcb166920744c20a08e48dcf5de4ec325439485b51e4c0f08cd22ecf60ace34b93844c2c12bc7b46a8f6b8dbf4de311f1039504a46d9616b41fd58388f458bdb8bb9821a33379cba4f36b416c2eae02f42b736c1cb6e673b9b9dbd230b6a23d944124469bbd2c545f5ab72fa4b3a47b4d0bb0271d615de6c7f182cc92165a84032f59c14f181c093b017a1c7e5887db249b5ea2db39faf7a3cfba08538b91520fc1f3af697c5f4dea7274cd86dc073920280b488a3f66969cfea020a312be1fd111c7847296ec5f5cc91f00188c07c05e4e49cd0667ee16345f794219ed3a80602cc11940aaf9a927805a040419abd20ad8ba0a05c7ca9936997549ed5a3c7e7d9f582c735a424895c5f1aed9a3a2ad3cf7d9f32d3e\nTAG: aa69fb97b939fb73703ad4cec6c24fd6\n\nKEY: 714f39851c1fe09297c8c69dff0e62be\nNONCE: 3383bb6aceea0cbc71cc7783\nIN: cd1fac364236fecd9fd8aaf59de7680afcf90de01e9adeae58c034c25c8ed25b58e82e4fdcdcc2e69d1054dc753425e98cd50644eb74b1b6d62c769b61bf74d41a319eb35878bc837bac60af425c0a36b150655ac82f8e8fd61121790a3bb9389e121ed0fbb061cd593603a763e0b8ecb357b5c453b20239ad2e44ee0ef0e4cb717db95613c3be18aab77c708f5e91af8006e11b6ddebb8b0ef98c06dc3c97d008e058bf3e534582c24a1485f68214cdd88167814802c89d5c07a7453aff1010d6db0b778d9d8fc64b5bf3bb84cb97cef38a4b30a7deee12f0af806833c8c6d35a7f995b414eb0d9a900e3e56afaf2dd0d162063c4dd52bc6ffa56cfece2ed90bc7c9f4276459c9bd128ee40a5aa514de786ec15d04a16adddd64c7613ec9eed738fd36e24fbcbdcd0d3318fab948f47314a5400d71c5ee07a8c1fa17e4a4c08f4a467291cec1e8266342a42646d138331b08498f2dc3fda0374ef736d05c2a363fe08dc71ec799f0256ac9114743f40641ed8d9a039c57cd409bff29bde518657cb305a875cc6c0a58fe9ea3452df3e3802cf316a0c1f477179f6cdcb39c7c9424c07997500989a600887dd9f04c92226df10e9a8301818a5ec2f0b7b06b6d1443dec46f478a9271498b956b72060dd2b3021b004358b7eb6a083ff2facc3e9500278352790ccb6f9df67dccf7a03c33a34c6f33c1b4dc4ced2d5f69e5f68e79c582bf0db7751b774019d9399329f1a6692c5c527a646c9bb866e69d4f1ba4e6065cf0c5b09e941c5bb6e96d7edcb19a5cc02411507701b65987dc206ffbfaba4f06cf394976bdde1ac343e368ec1083813417cd0a325aa0e88913958974fcc911478a460b79b9978e33b21064ffdc1fc4df1e314948df71af9a6e0a40907e6b35ec6304bcaada85b456298637b6fa582ef331e2815fef135dcb66870107b2149c5aaa790f7127c0f0819b83bec46c0f6d30edb61b6fdf4f35f4b5345f1c684f41eed8088aa2f1d42c920a06092058e7c225d10fe1e5befb4dc593badee754fa12b843a6e9f67ea0e0616eaca697b22f526fb79a2ec259076971185678aaebc6449ba3bd284230ee621bc02ef1f5ff23651a6116cbb7770ec7385a44f4d54e7cb04aecd59a99660a1021eb6abb5d2cffd76e6e7380c22d0224e499e0c7b69aa0e7dd6deb47b22b1f1fb882dc35eb944a495fc3f6345b08da8f7185c3be95952bd7c982d9c8b2410a1cf1f5164961f6d1db6160d252e631f77b02d4e23dcd655e7e875b9b703fd27c57008184772c73fb5dc626ba43f54cbdc2937de7b4c470235098cb0a3e699baaa8e2adc09f8182ae1f168aa86a790688795003c3598293ca269a94494f159c5d19a22469924c5fbfd198b8add28b37cf7bc3258fb4b906f2ecd672f4fe1fd1359a433240225\nAD: 1d90b2e081fc4457b3387c1033affd15747b79dad1d6d3b69c076d4dc5c209ba1cdd383a5196fc21fbc49fc65c69b85ec299b1daa26a4bd2e5ec2559cb230b21c3bb62e2831830a2b86da2abaa289d98eb04eaf3cf8d583ffc7291c3201df2c09b7d900a4bce0972e390fc980eb67cfe654ba3b9c579f997e319496b57819b36dd2b4484b88ea3cc1ba777b10ecaf526a08afd9e2b3b32b2bc02932af5d09c2ee3fdcfa18d6261808e418c4bb80be4315a5581d405841341bf2775d8d0adc21c10b9ffdc0ea4b22e22f61b46f844d8caeda0aeb7e1c3f84d337898af24fa68d60e2f19ff815713e1587e0d6e68d64cd088ed432c45637e1767913343d899b2f8c01bdb83253219878a5b3a4e6166e02387124e711a56e49da1893b4f72198c6339943262cdfccba33428009dff70a0c8c79af248d081ca04edb2ad4f35ed1819f0846dfade107c7e9f4094c014087c719517d943e524b86047d24aef8b901a7b1ec4e839400b717e758520cfc7a2dbced0ef491eef6aa2695b2ab9a92296b6e75251f124168c36a6555c4a465cf84a7b36f3277859dd5bb0f10f84cbc944b87e37b6b8ff6958bf1f0546839effd30995853c734a11c062414fe841113d0ae62597cd12ef80dbd4dc4f72e065171c8394e45dc6f87c86154e9846c1eb58f560b8c503848eacf05107c445a6a06420e67e2297a9975d23\nCT: cc11a071e11cf36750fad572fdfefa377b8f0ed6cc47bb8015cb51f0eeb531e5779d233ed224022c5f7ff3181ad1d6a9f7564f41ee919f0435fe49b4266157a68061a1c5d06d8a8075b55efab8c9530266955c179f0a57684459835931cfb2eb1244a730797dcfcd31e7a414ed42990e9a55d439fbb803f2828f92cffb247f8d96896f9b37ce2d029aa15873bf13144cf35eb70d8e27a013513774ede1d37e4aa007a48a12f37385842cb716f60401f638efd2841db6165819eb3c2c58708d92a454344fa64c2d740cb34d4b7dbbc1d86d9e0083432e0e90c074b617402b68e3199d6fc43c454a842da725b49eabf8459b4db90e6553e17f979fc8d6bd03ac382f3a85eb40b64e21787e8e8170372eb0202fd4d78b39fb940829e11270bf6ccce0fb28adcfa8b60659e54a03c7b22491c62982e5673d66791bf6db75edf3836449e918b0c9059de644039063d78b66769d8358349acbaa7f1bef02fbfe49be375f652952f66665df26964b8b8b327683731cf825ad45118fb98f119db977828d96618a4a2fe82105eba7d1c3bca35775dc57a207b5b07c24305829d911bd7d30e3c19b030f6d34f6858593f3a0dbd928fca4b1ca21ce9ea8b63b149aa444bc696864fe2bdcbfdfca33a656db422cd007649d3a3e895b909fac7f9f0d9b15920b1d9dbcb343a2a0fd9382154430f818a9b347dda83e1c1038eb5259ca8714e2f8d3ec13c8c7a96c537fe599b30fe8780c82242f674817e815d56c92e765f3c67bb9591e27640d4880e04fc6afe5f1482422b0de4282df77df798ab7d32372f22dd3dfb0035182fdfd524dc315b0c7607639fcee3b1e12421025964a27bb5926f28c97cd7d74cdb26a779b656491f057eeb3be3eea0097b787ca5d1b1d5abf42fe76b16e565b2c1d15579e761efdcaf04fb18e7a97215e4dd53a164b336921390fed9c4fc1cd0cb0825d4b5c7061db0f4f1cdd950f13646c662bc6837ce2e455bee1758a59fec54d758eb49f040384f27ab6abfbeb7ec52a1a1b3ce63f6b4ded32a41a64b8cade579db95b7d90dcb875e83424d03e9f3bcc2dc45952860f1845632c7550802c957657c9342dc32c64c558944fbaf5f2b6a04b5d48794d140bf4f9de2fcdb1b77a0602f1c97fabb0f2b92b05b6894e665a8fad01dfb2764f673f61b9c6cae68272a5b12a9a8347782c69f5f9c3d4ff932cd713a1e2a49759114563d94261ebd7c0a723a5837a1912cbcc98b6481f6d7bebaf29276bbbd6d0a83bdefe2a0f3d4d60d88d4575e3cff73eba09aa290c2060434f85955597a3431c376f64489f50dd9d1be65b72158b1d6875649da95579b5c88e3d445c7bb95a4ed9452e18ef33bd7dbcd25c5ad6c769a651204e082026742b15b49554133e1539fc516089ce27940c89eb1a68846f13f3\nTAG: 26c14eb5587ec540185a067635e64c29\n\nKEY: a406f8b8ee46d958d10d8724d90bb26e\nNONCE: 2b38be1c0e8258de3a095418\nIN: 26486ad28af8f2fa8c7befc95510589baf81a88f3823e87eaa8e40759cf0853547301de1e87b2eeccd76967bb364278174823c1cb1963f34fab537915031cead844dbb1c614eda56e9952b1eb4cb153d06c59c8da3b10af499b1c15ab0f03559fea13b81bd35fa5eb9a5431e12ab87c3c094861154d3d8eda448af7e15017103ad3dc7e9991b10cbe61cb33d2ff90121f4e40bd5d9e9c34b89679b6e1b54e38f00b128093af3e4ca9830a1a4d7a5e9db067c9c51fa26232945fa3e1e31e28c5000e1965cc7aa11a051305e68be9d60fb92f46eb2b701b3f959819f525ebefd5339bebfb64636d680a2a4f32afce85e287f8936bf62676c37ba810754186e30b812b1196e8661e345fb5b09b8dbe5f96e0010c5e3dd0a4e983149f4a058437cd46e3b32ca04c51ae3a4a39a7e15768a8fc379563450c616a5c7d7d98c46c0b934c894727532a9e713d330d294a2753f0f46049c88eed68711e9c49632144d5cb14d76848a6f7741d36c969edecdde52cbfb57a628678d31befa7ae3198343deae760d5c92c31f3c045b3e932e9051cd201d2dae66ca0368b94445d662acd6442c39eb945c8a4b46129a8cf5bbb2b27927729406f9b081695ce148a10226bc345c648fe557b7f8db4604fd0704831e5bdef6694afe716ddc3a8d69ccad4113ebe1684346b493db264417cde9c0e48db46aed1984f72903e94b72cc2b2f151fec80b32523f96f61485f026d63734ff80015a1cad4b21ed1ba057627b387eaecdfc6d7a195b7d46e485bc137726d96c4ba51e1656c3f234174759ad922f3493077d65c149d1e871855490b6fa5924f6270cf15920838b66e3250a99ff7a55ecc9944cf3fd204081a61ce05bb989e5abeae4b2f24801e7f2223d5ce05c2b61f32344a0370c22751293bb898061ff50d6364ea0275bece795be21c9dc0b2749ff68a6d15896d4692474bd46fb256d1d012e45e7a58d880fba240ac6b89d2087da1ff7d41df44c768fee5bdf51f36b090bbf85e7ecb69f61312463eb0b4b1a04a153f593f8d43f62ac96f76e13ab5928147c5e6378",
     "8bba4f076d12eb6dd15842e2c40fc9f1ad5dcb80bd95d9d41222953776b3304badd650afc783b7342196ab551a474579d95f826f53d15b96ac98a10c2c6d50a7b9b947cda9fb8d8d7dc7def72c5283a93112d2b58487a25debc9ca06946bb0a52a1e4ed3bcf0fb8decae49fa6607c55501f01b7441671f08c814023f7d46f4bc596d709d305ce320b1b0160bf35c8f17622c65b8e5c97b3fe7327e8e22384f6c400e551dd438d6d3d0f9ba6101abd1bc2486ba249b4cc83c47982c1210328968f2b28e4a7c4880d598d5b47aca2093965622ba7b4e4062c86d81070ecaad93d5e47ece22480e24a29b2910b227930344f6a00916bb215e57e1f3155fa9437603fabc6a4c6732e0887f40b5017de\nAD: 54e46035c45b6ebf14c5088c5f15f552a4d233de7d3750d7736838a5cd4a7b41df1b71e6c5e6a7dc63519ec43bcb4fc603168352b8b8e261c15e76e73556aaffa32193c1f5641b2eab29497c80eb06543c1b0f1787bc616a4e6618f751dd0a2b28a87fcabf405e97efa91becc8ac1b036a2ca244e13dcbae589f0d6bf8e19bf91caff673f2a80de93a6fd5da1e63516e2760ca12a64c8175071de22b26ce72ff9e15e5c55fb253cae55a3f48c0b507bfd423f66ebdecd0b6227d0e67c4347f2a4819a6825dfc2651e97c1da629e92bed3827a15dec0f0c8743731baef8035fb0a790f49e5b2a7339485df313a9633496fd9e7a9904ec566bf20b8dbc0e3c1e4572411da7835b5eb5cd51313b78a1d6ed96bd9aff2fba37e86d475d95fd7e14c6fe8ab23645b15e7823b7bc9d0a02fbd9a43c05a6c660b6690891c4d055af21b50a5500d72c91695536eb1a3852caceae05803486c64535747df691ebc62e888bce8a5c820569b3d80edb4e29027e737fcdc4f49f6eae43b4bf68a5731fbd09778d6b205bd8b3ab4cf251ff31dd94f2033118ff0c4154c78af27570d12def873fcf4de7ccb6b6cc8924dc63f8104e9a3323ddd32006d8ec3aa530818e299490dfa0a9d811fb3bbb5f624f26dd7d0d7a87a7e7748af5ee4f4bbeb150ea4078b504aadaf92b8f9edfb701c6df7ca615416f61bd770d5fc6675db01394a26f585f\nCT: 4f90cb1e30d5c2c97f46ec00cd8203ca8dc808dc0e862cfdb35b1e92a24f0093fb6b68eea43f04ff1332f942b03aa2dcbe03aafd18b292cbec3cd66d7ab26af3f274a97e599f520a6bb59f5c56fbe858821eaecc297e0cca632addaa5aee071a6cf84910006f158cd1e8a38f185e95dd7f6ad09303636bb6356e400ae70338a8eeae7c22440babe6d9595b2ca008c2e7a471e70e66c49548bab632e87ed36894c6eb97c7de858382cb060277edc91e19b288870b2a472df769393accb07f34a8cd94922582ce351da199a8c5c426b2884bba07fe38da6289ee55537952d53ffced29cf053a9e1b9b37d2e0e3c219f48fe885410e6bf78fea15719f20091e654d44c786f9494e4a71b20f968bbab6f5305af7b8668867cae10eb93904a0e3ec3478fca8d6a231c9b4b84cfc3394716b366c0b1a1bbb8012a298e3a00831791e489b7a2dac6c26ca9e5ad4ab58c4cd71215cdfa2422f49a7b30698ece44972a6dc7dcf9ac40f241085599e71957bc719dc51555312fff4e963832017371980b5087d0f6373e5b52d66d7003525cabcd56bfcc00041bb9f0522a4dc86ecb444497b97d882d122dd8ca1806f1e0c8ed3b1b4810dcfee9b2803d08f43151f5a968c18266d0b956ce26005628780a1c4fe0e25b7dd55e6d4cb6b1427fc56afb278a8cf91d83b952908c295947a5cbfa183816a9fc4400db94a5990e53d99da1694de5941364e7828515544b1074de41c253a3b7bc4b72a3a0173138a025fe758f8d834c7c814f1440407cd1a98aaf15f7f8d5055aa8237c6d93beb53dc84cd4712d0535fd90c180a40ba6cf9880d5104480c18cd9734354c9321eb3ad583caa5eb05edcf288ca5793e288436c175e56c001b473c1486bf36f9d75d71461339f1e063035ded3246166644761816559ba9cc9c26f61f6d02adaa3b4b398fb80906ddbfca2fdfbe57df724adf1f76f995ef7d52468ee2f89785d59c0c8557ab45f07e0da644c0fa9b5a9e1a2280d34a0f65b463e53d09146bd629134b12262f18471eda27ebb5ace095864abe17b95f238c0823dbd11245d89c195eb9ee65f6f97819def971189e43354d4fd811fce3c430cbd4686e50e562ab1e8de214832db1a09a64f9339b8f6dcfd53280a33071e89616148914de8b456408fc18a9f46f61a782857b1e11dfb5f956a5889d60c53dc826ab92153cdad4d935ccd978516c383371352f63edb7211c3da54cf2eafb7ee65f6aa98aa7813de42ec43a4e3c91bc2eac8cbd27fd0a39f109dcc94365bb223f9be11120a9767cfc73e2c315846b675f5e1eabad4e7a970aada798993fb2b11248be37b451a6f8be3ab93dbb0b3a181c49f0b43b402f05221bc97a6c2b5ba9d1e5860a234cbd2c7dcac97ff395ea8ad34229c3b0624eef42f611f90449476d76e816fe391edb539f9adbccd9628dac1e8925\nTAG: d4c3aab4d275dca02cd7912eb71daca0\n",
 };
-static const size_t kLen8 = 67908;
+static const size_t kLen9 = 67908;
 
-static const char *kData8[] = {
+static const char *kData9[] = {
     "# The AES-128-GCM test cases from cipher_tests.txt have been merged into this\n# file.\n\nKEY: d480429666d48b400633921c5407d1d1\nNONCE: 3388c676dc754acfa66e172a\nIN: \nAD: \nCT: \nTAG: 7d7daf44850921a34e636b01adeb104f\n\nKEY: 3881e7be1bb3bbcaff20bdb78e5d1b67\nNONCE: dcf5b7ae2d7552e2297fcfa9\nIN: 0a2714aa7d\nAD: c60c64bbf7\nCT: 5626f96ecb\nTAG: ff4c4f1d92b0abb1d0820833d9eb83c7\n\nKEY: ea4f6f3c2fed2b9dd9708c2e721ae00f\nNONCE: f975809ddb5172382745634f\nIN: 8d6c08446cb10d9a2075\nAD: 5c65d4f261d2c54ffe6a\nCT: 0f51f7a83c5b5aa796b9\nTAG: 70259cddfe8f9a15a5c5eb485af578fb\n\nKEY: cdbc90e60aab7905bdffdfd8d13c0138\nNONCE: 9d987184c4b4e873d4774931\nIN: cb75a0f9134c579bebbd27fe4a3011\nAD: 7dc79f38e1df9383e5d3a1378b56ef\nCT: c6a899758b6c11208241627c8a0096\nTAG: 7525125e650d397d0e176fa21315f09a\n\nKEY: 819bc8d2f41996baca697441f982ad37\nNONCE: 08b7a15f388fafb16711ce19\nIN: 9b1ddd177d2842a701b794450e3c81f151f195a1\nAD: 277c372784559784b0e047c6f8b7e9efb6f7491e\nCT: de9b9c8fe09f705f558c62dc6d40b75e3aa625b6\nTAG: 52e2d2f153a4235eb6fac87ff6b96926\n\nKEY: 682769d52fa0bfeaebe0d0c898d3cda7\nNONCE: 6af0738b249d09547837883c\nIN: 3461523cd98a6e8bdddd01150812e6c58d5cfa25d385cdbbc4\nAD: abe8302d7d5595698d9f31011c24d4d180a637597098361354\nCT: aa3ecb46b9330554b36d0cf6f6ac4cf5e27bfd5f602da1b3c9\nTAG: 0ba547961eba5c58726c418f51d31311\n\nKEY: e2b30b9b040bce7902c54ca7eec00d09\nNONCE: 28ccf218e8de56ea91422a25\nIN: 483080d7e2fb42580dfb862d2d266fad9fdce7cdcdb1158d415f84b6e269\nAD: 9f06fbe67eb2ace15c8011032feeaf72fdf6d316e1e08ef4cc0a176588af\nCT: 67e1980ced4cd232ce893938e40b0798b17a1692476342e520b480a18570\nTAG: 9994185d4329cfa5f4bbeb170ef3a54b\n\nKEY: eaafa992ef6dbcc29cc58b6b8684f7c7\nNONCE: 1ded022dbc56e9ad733e880f\nIN: 900951f487221c7125aa140104b776ba77e7b656194933fa4b94a6d7f9722aad51b2fe\nAD: 863ceb297cb90c445dbcf2fcffe85b71db88d8c935158f697023e2cea103ec39766679\nCT: e0b3aaa890e45f1c39ad4f13ba7592f5251d6a02ca40fe3633651b35fba74a579f48c5\nTAG: 5c95fd941b272bafbd757553f394991b\n\nKEY: a43859049b2702e8807ac55b0ad27b0e\nNONCE: bbe8c571342cac7fcc5d66cd\nIN: 8673d6ee2903265c92446ce110d5bb30aa2dd1b1ac5558029f23974acb8a2fbf4c74858fc73d6104\nAD: f77c998ad3ace0839a8657e350bed15ffbd58f152a0dc04ffc227d6beb5738ad061d0f83c2a26999\nCT: 40e201a513979b093637445275b2db5ed4cb1fa050af0e20e43b21af6bc56dec654541e55b295b72\nTAG: 41bbef45727d19ee544fba5b360312f0\n\nKEY: 68fd608c8697243d30bd3f1f028c5b74\nNONCE: 319a210b33c523d8bc39fbea\nIN: 2c088f38f7a58e68bdd92632da84770303cd1ff115d6364479fb0aa706571f68d51be745f5c1d1b44fa1501cd5\nAD: 1417a65249b85a918622472a49df50bdb2766aae7bc74a6230b056549851b3c2f0cef727dc805ba2160727fbb2\nCT: 9d376b147620c2ac6a5eaa8ee44f82f179f61c9bc8acdd21680a7ff03acec953437a3cc9660c7ecb1204563944\nTAG: 05a4fb5be11e3edd89e34d0b7132d0fa\n\nKEY: 6edd3bd2aa318f78b4a51103cb08d489\nNONCE: ef0027b144691bc9716fbeca\nIN: e98f2f99680dc748fe0b57390df38a99950faaf555a888d463d005ef4e4b1c22663d3d3daa812b20ae35ac934c2e187cbba7\nAD: 97337902507391de0f15c88462aa5ffc5e4760543850719ccd8a0cfef89484d8095c23ff8c1d06eae4ff6d758c95e65cc3b5\nCT: 3c54842c2099b73daa9c3f1cb64bb913c0527955d923510f3f3046df471c1365db97333bc5a86dc7c5f23047e938fac976c0\nTAG: 375b2a25421434e5e3a021d434fb2d04\n\nKEY: f70482d53d3ef70cdc3cd3c4a37aeb2b\nNONCE: e69d3de363e225749cb1666f\nIN: 4cb68874e69125e1a6f6e68669b48317e1b361d0f7f95ec4cf613b7da2c835832010e8f95eaef4e6800b79bd86cd7cda869d2df258c267\nAD: d72975f15721bd0957f5cb1edecaad2d1ef047afb0e779035f777f94cd7ed1bdf8ca9d4f357d2a1e195f195e7483dea1476133235f7e6b\nCT: caa1e48decbda18e314057c5ec32f8733a5cf03ed0d05c3654531bf56faa70751a6c7f70fbd7d39f7e9775a772aba8fe7731cd0230beab\nTAG: 47d909cbdd1c7f8b485fc3232bb7185f\n\nKEY: 98a12fe16a02ec2a4b3a45c82138ae82\nNONCE: 4b3404684825dfcf81966e96\nIN: 899710fc8333c0d2d87f4496436349259cf57c592e98ec1e3c54c037bc7ef24d039a8c573ec7868e8ce9610b0404ea1b553ae10cc8cec26468cc975c\nAD: ea1a99cee666bf56c8c3667ef4c73c2e1e6534800d6e39a97de3bd5d39068bb3e2f74f96c03463afa18f1ee88c21209bae87f37e5d0269b68db370fe\nCT: 0431b7fc4889ae401eab5edba07a60f9682fe58419d4140cbf4f20c62d79d8a3cc1f23fabead0e96e1c8c90929756ea1efab508336e1d0ed552eafd0\nTAG: 01053ceeb4f9c797eef9426930573d23\n\nKEY: 6538e8c8753928960ffc9356d43306b6\nNONCE: eee386a2b1e310665e335746\nIN: a92eb9a93a90fdbb2c74dea91d273a48efe9582f8af7a4e3a377b114770a69ca45421959fcf36107815e53dc61b7bf018fc42965fb71d1eafce0961d7698fabbd4\nAD: c5e572e464718398374c8b45ff8749cd9f517bbd97767f77a96cd021176c49c0acec8b055ef761f49aa6d910375a45b2f572cd5420b99153971a682b377ac88f09\nCT: f36353de609d0b5246f64a519d89a4dfcd9d53325a2d2cf910e7692e68391b0357b056b944e0b53e41568f304bea8822f9ff7a0375a5a8087509799226862f707f\nTAG: f7f9b891089d02cac1181337d95b6725\n\nKEY: cabdcf541aebf917bac019f13925d267\nNONCE: 2c34c00c42dae382279d7974\nIN: 88cc1e07dfde8e08082e6766e0a88103384742af378d7b6b8a87fce036af7441c13961c25afea7f6e56193f54bee0011cb78642c3ab9e6d5b2e35833ec16cd355515af1a190f\nAD: dd10e371b22e15671c31afee552bf1dea07cbbf685e2caa0e0363716a276e120c6c0eb4acb1a4d1ba73fde6615f708aaa46bc76c7ff345a4f76bda117fe56f0dc9b939040ddd\nCT: 049453baf1578787d68ed5478726c0b8a636337a0b8a82b86836f91cde25e6e44c345940e819a0c505751e603cb8f8c4fe98719185562794a185e5dec415c81f2f162cdcd650\nTAG: dce7198728bfc1b5f949b9b5374199c6\n\nKEY: fd1dd6a237a12d7f64f68eb96890c872\nNONCE: 459ced97ebc385ab3a8da8d5\nIN: 04a9709fdc0a4edb423fe8cf61c33a40043f1a585d5458c7512ec8e4e066a0f95e2e6609abf3c95a5d3ae2c738269533855daedd92eca20bdedbbd5677cd4eee84b7a1efae0904364f1e54\nAD: d253b829a2fbc5877b0fbe92e7b79f38886a49ca889ae72b91f2c3aebe257a3ffe0d390b5d320bea22d6a5536cd9213612f5ed6e3b0ea33ac91cfee284cb25eaaf6b85b15f7ca894317182\nCT: 4a565d3ba4f2ec461c9bd8dd0f96bc00d2a561bfb56443c8cf47681bdf1c61f55854bea060c4219696cac79c09aa9400a7e5c59c6b6ca556f38c619a662905fc5f0e8437b906af6138e3fb\nTAG: be5f93201d7980af4c5bceb24ac1d238\n\nKEY: b09a4d99112e1637d7f89a058988b417\nNONCE: 74348f7126c0cac836e9de5d\nIN: 6b3c4cfd1eb139b62d91ed5d1d8b0f3b52278d5c48787ce46f12b9f026e3eed1bfbc8c6684c6662f06614c69440b3d7cff7c46b2e4aebaa4b5b89236a3cc75535bc600104f240d01de91e0fb3bcad02c\nAD: 7883ad259fa5d856ce283419f6da371b444b9b64ea0ddb371b17ec0a9ada27b0eb61b53bd3605f21a848b1e7ed91162f3d51f25481f32d61ec902a7f2cbd6938a7ce466a37e4467e4ec2b2c82b4e66ca\nCT: 5e1b783b20fd740310333eddde99a06b5740428cb1a910812219fabd394b72a22a6e3ca31df0afae0a965f0bc0ae631feeaa5ce4c9a38cd5233140b8557bde9f878e65e8932b9e3c3f6e57a73cda36cc\nTAG: 784b73ee7824adf7279c0a18e46d9a2b\n\nKEY: 284bd8c4b5d7b16aebce1b12988fa1d3\nNONCE: 7ff05007c5d018b17562f803\nIN: 903416331583dcbd31420906c64dc76e14d0c5044d728cd9b605b531ddc350fdaadeabe67d08f0b4c7179f82a1044696716cd96459506453141e9ec3130e893d8c2ff9b8b4c241b73866ca4fc1f712d17d7a88bf4a\nAD: d0a1f92f80094c1fad630ca584edd953bf44cdde404f22c8e476df8708a97a0712e7fbd8054caa7d65144d0be3b30442d0dfa5469ba720afe1d00aa6bb53c79c1c178ed42fce596eeb6c638c8a8dedf76a431976c5\nCT: 9bc3708f70a68fc16bcc33099325c821a0ae9a2fd0a6a98382fa21b42ddb3a9ac6c34a13c4805d3beb92586cdf0f4dce3885793d49abce33190685e7009a79242dd93594722a1ceaa44886371c30bcc8312fa2bf67\nTAG: 3fd8a4d760d5b878852b1ca2d34dde6e\n\nKEY: 6d76dd7dea607a5cf5c21cd44c21a315\nNONCE: c1d13e56b080a500f1cb80bd\nIN: cb959b92e777f835afc4ae4149b190638851238b7b13c9bf65343adb3130e8ad2356101037f30997d4a5fcc0a1d6415210179fdec881236a799f6e90dd43ea3817819b432611eaafd072368b9c7036c7a88c8b7774a8ed986134\nAD: 92a2bc3b6b6ca9de0cef10d8bdeaadf6f54782cdb2b09e66cce8cb5b56895636e982f7a3c7bd9d221ade62c9ecf68bde70becf683804386606ab1c48ac764c4e11620064545c5beaa5911c118856dfc5cdb8df50052b01762c6c\nCT: 522ba9bfb47efc624cd8933fc9e17784919d2b3ccfaeec46af414c1b316355f65b9f9fd7f0be6ac3064b4016e43b8fb2028459f0fa0d81fb6656be0ab8fd841d05d24682b4a57c7c59d89af384db22c2f77ce10abc4d1c352a1a\nTAG: 5ea4a77381679876e0e272b53519d533\n\nKEY: 1dbcbe45a47e527e3b6f9c5c9c89e675\nNONCE: 98f2da8ed8aa23e137148913\nIN: bb23b884c897103b7850b83f65b2fea85264784737d40f93ecf867bfdba1052f41f10d2c5607127da2c10c23b1fbd3a05ce378a9583b1a29c0efbf78a84b382698346e27469330a898b341ec1554d7bf408cf979d81807c0cc78260afdb214\nAD: 46f1bde51f6c97a9dae712e653fcac4da639d93a10b39350956681e121fb9ea969d9dc8ef6ddfb2203fad7ab7e3ef7b71eb90b5089844d60d666e8b55388d8afb261f92b6252f4d56240fe8c6c48bfde63e54bd994ff17e0bf9380ebfb653b\nCT: 0d90e869d2f4c85b511fdf85b947ba3ab75c6b1845d8191634770413d7574a6fbd9d86897cb3d3b5d3d8e6f74fac3bd2a9b783cb16cfbec55dd7d2f7fc5c39fe85d39bf186a3fdd3564bc27d86f",
     "4019ae0cb73f5f516b602331433689c1b08\nTAG: 8777f2002d5a5214a7bd8ef5a3ccfbbb\n\nKEY: fe33f47136506e5cc14114eb62d26d64\nNONCE: 9534a10af0c96d8981eaf6b3\nIN: 3ca38385513eaf1fcd03ac837e4db95c0ed1a2528b7ab3ac8e09ecc95698d52b7d90bf974bf96d8f791aa595965e2527aa466fb76da53b5743eda30bb3ebd9f6a8a7721fbfe71fe637d99a7b4b622e6da89e0824ac8aea299ea15e43250d2eccb0d4d553\nAD: 50b7bd342df76bea99b2e9118a525c0f7041c7acdf4a3b17912b5cbb9650900246ed945cfc7db2b34a988af822c763451ac2e769ec67361eded9bcab37ac41f04cdb1d2471c9520a02db9673daaf07001570f9d9f4ac38f09da03ff1c56fdefe16a855ac\nCT: 927fe3c924d914a7aae6695ddad54961142b7dd5ff4c0ba5ca3e0cf3d73bdb576afd59bd2b54d820d2a5da03286c124507a48008c571c28a0ce76f0ed68dbac3a61848e7e2162be8e0bee8147b9bf60da625cdab8601bfb37dfcd165f533e94a32c26952\nTAG: 9bd47a4a2acaf865a8a260179aabf8ad\n\nKEY: dec1b34b7b81fb19586c6ec948ecf462\nNONCE: d9faf07e72e3c39a0165fecd\nIN: f7b0bbe9f0ff4dcf162792e9ee14d1ed286114f411c834ad06b143cadbbe10a6fbc86f6664e0e07ff7c6876d4543e5b01ff5ddb629f896c30c8cefd56c15d9f24dfd2ed590304a6aae24caac5870ddafc0e672ac3aacae1867891942998c712d45efbfa4d99a8a6f03\nAD: d3c4fc4838cb3cda3937455229ddaf1cb9102e815cb9f519a5434677c68b11a0bae1280faee82f1a5bee593e669e6f81d5ece3675b8af63f1491bb298531aacc940f53678ba56ae96fc66be92b904bc35f2d5b68b3ed98569a4d04e8f8a9689ad9fa4b51db0938a9f3\nCT: 2f44ecf549077b98ba551819538097bb80304a55c48ef853e20ed8c3f808dc8cb5eb41c2463d19fed2606b59cee4b458958ea75715f7654146df4519dc63524a0569a00d7bbc4b32a372f82d955be5f190d09d35c267da1017e8b16096ae84f8a671b45aaf0d1ca59c\nTAG: bc3af80cf9388d35deadecff5455d515\n\nKEY: 021add6030bd9f3fed8b0d1f16f83783\nNONCE: 4e460f51fe6b5eb9558c4571\nIN: d9aa1d0db5de536cfbacb59bb75c592ae3f34a5f9c5ff4f22d14e8e4bd0754af19570221893797f60c89a251cd6a19c2953662dca51264afc21099ed5c80077b0e10a5295b3c4c6fe47d3c1c84fee69ebf7d8a7d9b1b338dae162e657e6cf5277ca70d47b9290aa7efe67b0ce574\nAD: 38d99cfd7578d40ffa1749d5fe83500362ceee76c5af38935806837b2f2d1b3422a5057bf617b07868dd95d8e5f4a24e74f96177d53a0275450b429a2b1f364805030765e376151ae35001d6a4872200142fdce82017f3e976ab0edac1a08d2649d297648320e7dd9143b554fa3d\nCT: 8863ad51578fd1c9dc40702e34236adee885955f0478ad9a094a6941f95f900e466882dcd5b86e1563ba89aa105f56f3ba5ed860ec3338ee1b750a2f9332acb3f0f61718de7e40fb80442d046b35f147f178bd05362f0559a20a53ebbf78e920fe14c9d80d1c9fb21bee152f8ab2\nTAG: 614539247fdcf1a2aa851102d25bb3bc\n\nKEY: 311c2045d5486bfadd698e5e14faa58a\nNONCE: f1cd8b373cec6451ae405618\nIN: bd154e428369aac5c13128d29bd3031364939abd071c34bacac6ea7292b657b794b2e717d9bcb5d7d01496d805283fffd8f7de6a3493ddd8d1dd7f58835a44d43ea22d95468d1239ca5567d6c80bdf432fce2afc544a731a2852ef733667b9f8f4f8923eaa9de3aa32addddf99b607efce966f\nAD: f70cb7e67b2842207df55fc7582013bbddff8c7f3bd9ebbaf43827aa40f8490e65397934ee6a412de6272cd568566ea172789a006a92e5920140ca5f93f292b47dc262cefc66b75543f94365c08795b7c5e9c6c29b7dc67b2532fbf8a6487d40a3eff504e75c3f2bb2cc3969621028e2112e67\nCT: f88f4ef0431d0f23911aaa38a4022e700d3a33c31e0c7bdebe00f62ca3b55d358385de25ceb0538242871eb9c24530e557d7981fa0182436e1e49272d52689541f09517fd147a8da0f0d2bb32d54911a36eded0b87bcba54d6842edf461b45839df1cab5176e2c82c871b3be4ec1bced67ec5d\nTAG: ae8d847f106e914ffadbdfe7cb57beba\n\nKEY: ceab57de6220b2c80e67f0c088e97b36\nNONCE: 8cf438aeb0cb29dd67506b9c\nIN: ce2a7a5663449cf6e0068085e3c373c5ca6f027544e327bbc09ac00f1571268bee186d51a00bbc16da7429e4d3d5235d8d54ac96b6ecb2fb7d77a6e5b9e70d431dd4dce78ceb972e9e4b63059e350efaff841c2c42bc29c139b7fd070097556b6281b58e074d5271d9f66c6744ec6dd3b9db2f4a21aeeb7d\nAD: 03e464d111ac9228d39d22a00120c6ee671fe5bbf462b1ee3fdf348b34999518998ac4e175ed48189c29b49b5527c27c43094eecbeaeacd3cdb48cd15aa82573e884a7b97bbcdad610a6955f7d8b04f6f98a13a907bc2bec4c940b77582b248f5fced1771f810977b2d0a4fa48bd4d78e4bc383bb92743fd\nCT: 1fa9c379c78b92fa3c1e478443ae38d7b4b50235448ce2a88467514bc9db95844ec1baf4dbdbd1b0720e377d05d82c3b58b52af8c9c50417b39ad225e373c7ff18ac5a6ea5d182b255f1c8a2766e31e3e4e3d55dc08dfc64b818ead40a0e824b06ab24f0dc9f4f0c383db7cd4d40016b31701bb401b126dd\nTAG: a9a885578467430504731d1a8f537e3c\n\nKEY: 585bbac0ab4508afb8b72d84167551aa\nNONCE: 774c82af194277a5506e45ba\nIN: d788112213d2b8b5b66b056e8b3e344a7876f6193b59a480c51fc04d3ec2e5166344c833187b14117276fd671a20937a4553181c29d3d85afe385dd86093708226f082a2ea4ec3288f372c772ca7ceae86b746ff428e8add17b0f34f8553e3db63f55224c39edf41f138a2c28be49d56aa8b4c93502b9794a16310f78b\nAD: a29665261a8eb58c88803bcf623dd1a14e76af49ec5db72a267f2ebcbc479385fb6b32bafcb1239515d74a8282b228e83daf282d1ab228099b315bbed0f0e6b3427e029cc28c025460a8bf0914bd584c13e7de7830ab77fb4a9258dfdc9fdaa96ca941546477f04cea19a365a27de34e23e154e7419aefb0be0e871bbe\nCT: 24f2856e4e40c0b2b8b47e43d94c1faba498884f59d2ae1cdf58c73770279c96feeee3025ec698cd8f0ae25bf0c9fbf2b350674c317e52bad50aa6ed9845e194f294eb71ff192604af50ac7192f308583a3edaf6c7aeb588990be81b801dc916ffd621dd4016e2b76e9078c89fac9da39f3a88f6548006a48b0199a732\nTAG: a5c8f9daa30b045bd3e1c1b01f438518\n\nKEY: c5d727d159dd328b4160ff45a183226b\nNONCE: 881c0802db519ce1595573ff\nIN: 88b4be77bb8a2f37bc5e84ef9da92a4b8c3777dbcccfed13b97e93c19674c8c3f13119363ace377a14e5f36501ba9a3898fc09340886d91bf0a17ef0d028f2a92ec150071623a4a5db8e56e99e764629679943ea879ec7634fad1480e8617fe834c26210276d7db208b13f9b4c2060f2867aacb1b47c8e110830beff721dd8d120de\nAD: 5f6513ad3d490f784dd68ca1df41e8c8e1ab9a240ea8e9bc22d0b1d7353da94d5d37c94f0dcd1a2dedd6d8e1c79a383e7e214cbb6ee2ccb7c6d894ffce5d01b6cf13876ae2648d36adccd88710d7d2ab6d43826d37ee0ee3b434972a2cb8f4db1c3304cee0a352bbef76f05de0e6f55a410eea5e697afb197f2483f0200d0abee224\nCT: 66bbee209eb11c675ecd3303c38cf1087b010c532e1357732c4911ca9db78c67805c95c829194cd413b635a900a08454c6eb9cfa3597ab531fc9ddfdc5b02b290be2a618df7d03b1ab465d6d03e8b87a430bf4e80d8cb9916145cf2d2342a91fc79defa151b1f3c695608e76ca2abc4c0383897f1cbb9d4bd9969b2f33813e2b5502\nTAG: 43daa08e6eac70e3238ce655adb65005\n\nKEY: 16af56326046c92afca49fe173d643ad\nNONCE: d32a935b4e56472d92d9f2ce\nIN: c49c8e5769670384d23d9af9834026395d3f3bd32d88e61ed06b2e00e52a5ae4fe3867993c2af95203cd4006470a89677864431fb9edbed17412913bad4bb3eaff0fccaa150c9b13f83b9bf06698af844841a640d6f94d845296638ac27fb5ed87c310dbbd36415161310b284b8f84b4e025267906e0a4c822b76a682d44a70f9afde9bcf48ac2\nAD: f713886f4086026779a7e479fa646cb33574e6c977d70b8da49c8fdbb395dc7c149a59e219db8e4fff053cb00e2a1df9850fce94e52fd34661fd3d4cd8ad3ffe0b4bc7ccfbbf42eeef3e30ce13cdfd77dbd067ae9f5aebfa068f6b7ae2c17ad956dc03511dfcc38eac9fa3c0c0e9a340f5c58e39d868b77dede54fea1173216c0bb8f0a6c2990f\nCT: d5d7d1ed0ae3e3481e2ccee201857ce1f427734fbb4fbe82a2b90601104008b8ad4daf74514b8ab3e42b6f6b509159ca04489b1175ce1e3fe33d36ea521e0aedff8c69fd00aa588d7a2eb9d2d551e2b8fea321f573e2a1df147535a873d540a3169d3ebc099ea6c33cefc04a2d55dc2d47237b95ad269fcdcd3c3750af426beb4edfe7837b413f\nTAG: cbe0fb9509c224bb0e8e33f7ef9b49e6\n\nKEY: b3df227e6dc2c846095e2a3b825d7645\nNONCE: 578bc24ca3845e23204df661\nIN: bf69be81cf0b340b006badc9f644d10376f4f9a7a78c997edb8729e3786447f21e97e4c1e0c0c74e01ef655d0a84ffc04ff7c6712ad65adc9a0da2e3078d4c9e796c9bcd71e7a9da26b987990d366b5e00a23a93652e10942e07a6aa01375af27080c9cbab5f554497abc48260937a6fe895361e79cd3d5e78c1a65c6723d4a4fbe9b3dcae3c05699cf6d3fb\nAD: 00898eedad307fc017917a3296bcedabaad8a505edd34e93d92f3b61797ddccf3fc31144ef70f255be3b0c165c97eb8706f14c495f4aa9b3f15d2dafd65bf6741d67fe240967efbf0e75e610db9a8f722035e039b5e9246d258084a04c12ee8ad1668032f8caec737481fd894dba2ef702d3e6089acbb0fe0bdd6daa2a5cd47fc62603499fe3ea37365072e5\nCT: cfeb249551a695ddfec5f789e7f0a9f916abc8ee01d6233c32744c10a09b5b19ff9ed15e9f10de8f93c8ca1ae3c34e26fdbbb7f3b0f5f8b064501830d3cc982da99b294ce51bd33085c98b0ac0bfe44a8f4a5a26511afa3461aa88b770f076fe119ec90f33d8c9e7777f30b8cc95864f06e04dd8e328ad7a2c7dab83b03abfdde065bcd0c7d6dd47389108c4\nTAG: 3dedd1054f1a29286a51817264317b83\n\nKEY: 58a57f04d1d5cbdd1bfbe01dd5f7e915\nNONCE: 47affabd7dbb4cce76661081\nIN: 5f82d481a6a3856c6f0be2aca54d666f16de88294a4d763134dd51ef03661bab45da94b9871d94e5b574a52214b22c92cf9690ecbffca9b108fe796abed9e608778c0b99d7bea1daec08dae89d5f7229c04fd52cc906b5f5b9fc0f0fc1e0b2272dcf4865286ee22bd9edcce1afadb579ec72cdf6038cfc75c2dbab5a1fd64b6f8e200d1ad0afcf25863293fdb7276648de\nAD: 4b662822b48005fbd85bb99e6a946eaa74403909f646d914a236eecc5f4558b60b2efb1584b1f32d936b90428dda6568515801d21d24d6fb622e6463897c70be01f81fef741d6dd5c6556d16",
     "3c3f048abe49f21817b41850ce79d7ec1fdfeba32935b58d898e964fa4b36f79c0f1f560b0afec3887ab325e1a025fa7662f9baf8e08a9ee714b8369621a2f1e6d2e96896a\nCT: 31ab08ce0aaa883628f4b33369e5f6e5a54ee4a6596f25ecd54eeea30e81b41d357cb6c671adb6acd3d4e6654feb2ab1f3259692502efb33c5121e0852cbcb2dc5d9a4c65752debe9c4bf5e995fc909a2881621d46cc220806703795e61c0fe74c99e3c1230521b1f97bcbf4e95326e2d581f0cc879a2fc06ef88226a4413f9e9985edc913c418cc198c4df13cd46afc24\nTAG: 1e54066c6cc37f35c62b47426b609457\n\nKEY: 64011470970333b7b677d4ad8ebf3ea2\nNONCE: 17031c5133a426d96de93123\nIN: 882cac1ece2d22a1db7f8339332379eb68516c8b7dcb3c089a5bfecceb49f48a169215313686eb5708135f379d89962af478cae865841e0c97ab47a57a456f634282c4e03c99abf7f7cc4e8360deb48160288f06e96cb09114877f9d91dae98828285626a1528aac87f39cfb8ad3db344fe4318aeef6f6ba14bd1edf9caab548c09f8eea091229a90dbc4b0fa34fda2bf13d300a1f9c\nAD: 0394bb920cf58806b909d90c046402c745f6876af85d8a281081e22a1908f8475126594b39a0e191a070bda7c78d30dc4867e69ea522cfc962fa5f9915daea9133e998eab22f32a18957a3cf7d91c6f3d54cea94875d60be694ee841fef01e69bf5997ba4f25e846558431eb592605265f235211c2bb2d4807278f4b9c314039d0768df24e9c098c6a01c689d6a143073fb1a29f4400\nCT: dd347d6a3d4a71b2bcae0a0c690ca311f012c6ceda4f7fc054b8f9b59bad54237b64b93331b99f1305801640a68e7d50cef581a57ff2564c90995a8dbf57fa8cff046d0b946af5f68e0aa3d73262965622fe6d35c78f949a6cf9e4f62ba71accbf403b690e31f610305faa6737a19efba1e1ee97084cff2d125bd69a5a4ff99aa399df650452daa835b3e54114b295f00d94fc60e2f8\nTAG: e5e72cda6755bfb3a44377945adb5ca1\n\nKEY: 4852e546fdea545d7dd12493a687e895\nNONCE: 7a3e136cd961191570c1b0b7\nIN: 30c10d7a63b614bcae1b79b07c252dc55f322554ac34ca664910fe4a0c9a33e30698e124d91cbb55cf34e931807cbe591a87667f2284c1c18dacd108163aa7a82e274ae659c4ea144191e3fc0f82d4cac929969a50b98ed9fbee52cdf465a1f0535d7d7df15a9a6eff3f4a14e254571cc47f82716d7a835dfa839213677c4da8c8623517244891993ad5956f65d318d9bba16f1eb54d2974a741ac\nAD: c5ded7f545d2eaccbc2cf5cbd1b38b0ec3b6bbc054ba25a16efdd448e5a47b0085974e469c1b0df22441340170d6677f5158e4ccd71446d7ac73dcf5fcfe4ad7248c4ddcfab4c8ccab0968d74d66d9c9561650eb98c088d87766440fc9967e8463febcd12ed07f7e44fef47cabf05274002d0014c4e31f230a41171868db68bf5a83c902724397ed181dd8c6768a898e0c78f6aeb886df95442e99\nCT: f798de4998683da7fa9ca030a23dbc493f36c48bb52cd1113c3ea97ef2b67433c00195000777fa3b75a3f689a66b148159524a1fe9576587948760b279cda56164a23748564ec66ea51368ba2a900c97169eb33cf1e557f46100193575737dba670175035f0d921675d45415c6591cae079698e6b1f74e82d4b9216c20e907b148a1d514b2cf653d2e4994f7f668dcfe88dc49c29c544de96d8dd0\nTAG: 3663fb2672223154981b4c580ed3d2d9\n\nKEY: a65b520a2ab67a24fb8fc669c41f2753\nNONCE: 3bd6c7e8d29242abecc4c108\nIN: 9d1559d283f7a38847088116f2156b19a8feab0731f04d0d499c6b0d21b8563a89a9c284230c1298b28a622cbdd38dbceb098ab896a7259caaabfcc7b0d9ea797178c18aaaa351c7f516342dcb9d3e91405882c8faa9a28f7c67f3db8913b31c0dcd56472d8ebbfb20cda2896a66bff2706b12ae0d9bc8c6c123c02f1f0bbaa418c1806482423eac72d718cad0dbccd208eb81663a9d9043d6ae7a52cf32b1fa\nAD: 2538529cc6eec03f70df2ab085027ce015279484981422f31e58aeee31e79703d72752af2b8822dce9b385f1530f19e692e00e20ef973d333f4bd585ecf122bd4ed9b0626cef46baff0302c71411d27e372361f36c7245096faff21f0236f3dd675646760d5687b3cf1544dbcaa863f1267bce04bca976616b890c7c6ff3448d16072c3938f9b62377609950ff7818cbdd21fba2560bf1954a93517962181b18\nCT: c3194fbb5c319a94c0f61c432a730ce7611a005cfc78266ac4e5d7c95351e71d613f06f52d9d008b9d886f4d9a57bcc232d47e0c75ab755dfccc057a9c7558d7fb696a8c29843a8b9199e2406d23cd6507d35a872fa54cb95e2cb9af45405ebc6b6ee353e8a80debc393329bb9499c61c6344a6380c118f30fcd76376a9765517652e1b21ecafa63c0d19c1875658f1eda89c15ac2daf1a6f526ca72ee792a4f\nTAG: fc16cd532c926ba01e2e6b15327bfb3a\n\nKEY: 84215d2c8f86e5b7bf93cb0620da6bb7\nNONCE: b35e99ce89dffd1ec616ed92\nIN: dfe500919f97713f6d9c4f53913175b162b8b7587d85d5b63f0cd5f51def23119e2e02c224142ecfba7f0a519aaea3c28be20b9c2a9c98eb145afd4db523b7f0b822e67dad630846b2a192bb146dcbeae00198c81b80c290d881125c24a6b01ec901b8912bad5b081ec7d97d6997b33052ec287f692489df928ce36cba1e3d6a41cf10c697a9e1f4aaf75dc5be054b98965ec3ce173be7e127c4c5387048ae6ab5a8d247f3\nAD: 6bf6222e64a46c90f83f47305554d090bc8d3838b7a856f0e5e1d92c4e7231eda6af1d9eb7ff6ce914f2256a3b0c853453b9bc75e46109cf8d7e8a9dca224e022d3d1a139d00476775622799541edf9d53eb645a40f6d98ea559e181d96e4df0141e51fe067542300581c0424f534d2c2e3b1b27153c0cd496a1c03301226beeed2b5cce0710d1f485e68b44a918b63fd8db610c7ff894514e272b6ed7ae33a38907e0698b\nCT: 6c6faa54df62ba5659d45f64a5f014684138c93bf152da8a495e9d067b13a30b9fb84847f56231b2da4d87e6cd509a3e38a9ff47589c627e5b5a1196e27fc7afaa14a8432c2d10d8fbfd5d6d394e4b947c456420708a76c2aa638df7de119c160636fc8dfba32227c5de12e5ef429da933ab04e77b489f2eb761d0c753738647ad6793cad64b8942f621ac67b13bd0cab106ffeff21f24c79de69424e50ae550f2241d4029\nTAG: 202b232472d050b9bbc68b59a0c02040\n\nKEY: 7c02b6bc3db61e23736c5f36faddd942\nNONCE: b958decc680d5f79ea7b8632\nIN: 7e5992ed0474f4224b8da1d038eeb78413fc2f9614fab7120043e75986a4bf1114a80703780a149fcc8dfd115b768f45917065c85176a3f00be40b427fe3765d3919a5b741708624e29bcae876d251fd46dd8d36a8ef66f671c25f984761cf7f75f4329de7093937cdabe32f130b77531ab1aa0a1bc38fbe2758c2664eded828b2589fc5c34d9a0d57a5a4463163736f419b65f0543f50207fff4cf1065a551bc00ffe9466538b673b2a\nAD: 76e430fce1a7d8340104e6001f1c2048d457ac335c5453e48727244b75c3c4f04f55afbb5ce55ba6f8632dbc168ed715b83968a32e5b8e91cb24abc9efee6dcb7a8bed9394a546f0b9efc5823ecaa192df061eb41c671bd863498c2130f322074a711ee43791a1cc02b5cacccf25119ecdd99233abf3b131c83ddb8c62c93a0d653e91499e7481303adc8dbac615ec464eb8640ea138f6236b0ee31cea060f97ea9145a22d15e28eaf6b\nCT: 14cfd190ae0521f94ee6b36bfcc403139782bfac3d33fe95c81f53e83c7d0c9a8fdebbddd79746b550a383ece1b5c93316b2fdf5aa36b4e97f739f78ccd2de9963ee7fb4d77b581cf676bb679b2dc4a48d977b45564f21181dc60ecee84d736f2324196c20327495d18973660ccb5dae69b79853d12e48ee0706c8ed821b7f722e46f35c8dee2b7b55ebee01dd3ea1e8ef80493cab6b27c264a67596cee06c15062e3a96b140d0d9ba38\nTAG: b6c47410e6f4a2f2b172c6a4490732f8\n\nKEY: 1f58ccb33649d0dc91c50f2aedc95cbc\nNONCE: b3a392b1fff0157e95f82a44\nIN: 738e04dc5a8188d775262c2cdaa04468844755dc912a4edf9db308efb3c229b8e46b2b34aee2c6330219bcd29d3493e3cead142cef5f192b043502b8a4cf0419f9b3f5e001a640541c84141e36d585b05a2f702356bd39bda518c42b461564326969983d22c3ac5a2aa214807ede803d57a61c9547505dd7e08402cc43e6ed1574a48366cf5b5573afcc7aa3c4d4721b362d20a58cbf251315f2b5f9e2c97c5ef6bff44beaa5004e5b7c7f28295df2\nAD: 93f7f5054605edc769efc30b35018ee6c929a83bc6454352c69ba9c72e4b4ea6f51c9ed06f314b5682be6a701c719087765d0a7022e5c9d495f28a9053bd435b8b834045c3670856149b08dae742b372a15a0184375d50eb09877bf94f63859e64228606791c516e76c5695a4e529b9dc5f76eff1d4641a22597e4460aea4eff107348077d4ed2d6262744b0a2d6610f25264d905133309ace10bb52f7138674c25e5d43ededbd87c13dc8fd9d3b1b\nCT: a002b47b18d1febaf64842fe9011484d618a2e855c4efcccc7d08f02dc9b53d0bd4fc8013e01e21fbf2d9bc7fdda69e68be0c06d32003d045dca6bd251c0bb8c2cbe3693b252265c8694295772b767f83661ecefd57353f6f1c442f9d21ed98c55cbe1db8171ef7b54fe3e3a1a253b4dd48416b5fbc7c18d73692e9fc90dc75d4b88de1fa47c9ad33ddfa4e582d3fc61ca2a8b1eab898b9992c8e56d170730454ca50cd4f28d2759388cb8e302be10\nTAG: ac502a9a52fb3a68a7e90dc639c7ad42\n\nKEY: c67510714f556ea1744af9207917eb60\nNONCE: 71b347a21653cec3d113087a\nIN: 7040fde3513cf7f1886d7be9c0f371a3b75415e94c3bdfbef485081199bec4494beeee76dcea05b6601ebd4c8fe231fa16d3b0f046eb3e9c9ed8baef25bb0ff6bc85469b2eb41b929fe904735f819b241b01230c68c0b61577899426bf0dd30e085cccb4ac290244d8c1cd7514412a3ebc51aecb6bb4be1a5a4a8d2ff3fc99191f7d7d0b44fe2cc4ec34deccf901f54e3dbe19d2dfe663855fa9d93a01ab14faed7f00c14834f63e1d153441c6fabb3cf22506e8\nAD: 6d28b410c788dba025c387f5b94c0bc392c69ef646b9cdce53dc169326359de26a721703d9a7c5017631a469da13b2d9ad9115de7d06922ed6f093792ac25ae2e27993ad6be5217dc4f6c51e18f230d4eabb01a474704b71b1407d9cff921bd98e28bb60c4fc019b4d609667c747e83eef779ee62000b6800ba2666f415dccb12d43af4f585d3185d66ba2ecf0b0fcddf762445dd1b6154591dd069f03977243b45b113b6f9b110f9fdd96f0b74e2c9843a45c6a\nCT: f2a2cdb4f890241f44e00b3373769542cc3dd24c3d07502ed162dfa10be9906871051b991f36b2d5c4240df483c2ad704be14b9efe79ca704e8eeb9dc250e75a92ebf5800c59fb9a6a32228fa1121d21e0b423b77e20010d36b9e6c68dbc000f69bddbd521a1f7bbc9d7e431e4e46e5094be96a928c6729293d2d805c468a3993fb7439f192b1142272a78585e3b7fcedd2f7cced52ab2bc42e2521603b89ba76",
@@ -399,14 +420,14 @@
     "397440f1a4a0c7c9c2773c0a0cd3b890effb010dbcc00237dbed1177b86bf60913309bfda9376b4192da59a360afc5bcfaf8be16ea8313de97b417aaddceadc63a1c3a355693616413ed4101ad68f6e6aaa99c839dd2a9ff536\nAD: 18e3195358bae4ccf43ff8daa34902fe48f99fc1371d34060aaa442a43016a1d756f795fa5c9c4a828525554571e18c27134f46094790dd1e68471ee40c17bfa02f175b2c2f7f2aef20f00e4d71926560b58f015de19c871d808acdd341675d8fc19d1e6d4028e1e8926df500c4685c14729c6a056898cf919bf3ae429fa3ca8746495716d78c9a8f2ecde596f985b1c25ad0e73aa305a86259319176b4c4f3bb231fdaa478a856f46416ddb10a14ed23c96dcb86f5bea3114568a44d8fc6ff4bb47fd0e2538b70d964842910a682e7bc7c7263249832c21b7083a1e8b143828de0f3dea8b404cbd82efb19a11e4d60aeef13abd86621ccbc3d8f220715730eabbe04a6bf0e11a4f78cd2c4369ce2447a76f4fa48ef8d322a8a28a67039c24c4bfbf\nCT: 6beeb306c71318cedabe3877ec916ce2074b2c3f1df887cc3a3e8019c10d353854b6b65c947359138d5decc62a42d50921dc8f6cf63a16062af47aa8cd50d0b2dcbc3300ba0d7d069a5e4b4fe03bbf7062c6001e276be116fdd00d15a6399d1b0db71c58f396f8bc7e51c2b1f47430d4ebd6c5d05328b29aa79bcb26927ea5a40c82715aa0e36cc83ca6d250812c1305c02ed4291a25762cd709cb3d808031b5f918ce253f622c1afcb83c43707edc493d18ec6f0dba4353a1cde7184db65654088fa13baf45f7643f0dfedf4058e6095156b791ed30827c556a7721658314356e7a3f3c62cd62fe938b008cda56ceca71442fa0ffeb78b13c5847a3ee9668bcd2a01c753bd797c240378505d1e8f2b8905428b23bf589de9af390f94f21630d1826\nTAG: df5a21a399354b2b3346a9eb6820b81f\n\nKEY: 06a4c6a8aa189134f5784a525d46ff10\nNONCE: 0f765d3893af99f5c3e6d9e1\nIN: 706b754094869313523493089e591d34868b708cbde9bd8b42cba8175d1fdb6a8769bb9ec156d44bcb8f9cbf2685a0dc18b5a802dcf7a12570bb9042a0aa53dfb19af8c0f13763f388d9626a480d6d435dd90fbdbb4292d9015a5633252aa0583498d6f7ec54460d8589c1d6a6d16a349d10ec6070e1cc52e5fb996f810d333675a7130e4f3db9f4db0e3fd3541d32e0b2efbd40ba70cd59295bc8d08481f0f137832b01bac1778ffd7450376e174067b3ec23d0495cbf936bdc176cabc3f42e2991947a4fa87dd8343c32fa3d7ac0e2d22660a0c128a00e1b51a8742fdb2aff44540e39e588c5920ea16293aaa522513c944d3b77f3a0e90bd9105319c170886202e336893d100b0a25aa609a49a8255f78233561f7b88256386d1c3c002c3ee68f2775585c65\nAD: 18e2ed6d500b176e49f7e1b5074c0b7dbfdefdf00a63d9fa2fea8c5e78a1c4ae00f17b23442933543ac864097629e112a099f3dce6d5beb1e3f3c8e19522c6b8f615cbe23444bc91a802edf8a08995a55125da805ebb073fd89863996ef708f7293069a744ad95db8c17cbcfedc331119e85020df8852d74b8092fd38ad424f3da41b4775beac19536ed801ac1069925b12303d8ad2c52c36ca5b4ec95e96f02ebc5725ee6cdc099e666d9055b789e39ded77a8fdca0fe2d94b8039be55b6a75209cbee4fc7864957402b50427db71bc75a0b1e3d2ed6ea20f12a980c5ee916067d0dde7d686570d075da4df7088fe5dccf0d440064a96998da6f318b603d513104c723f27484780bdad586ee358d821b480f9569e4dbdd1a45ab9056f8d8e5a879789a0d65338\nCT: 5f3627bd53f8da0bbe6f3c9246d6f96fe9abb91cdecf66ddd42f833d98f4d4634c2e1e1ad4088c84c22191bdb9d99ef227320e455dd112c4a9e9cca95724fcc9ae024ed12bf60a802d0b87b99d9bf22590786567c2962171d2b05bec9754c627608e9eba7bccc70540aa4da72e1e04b26d8f968b10230f707501c0091a8ac118f86e87aae1ac00257aee29c3345bd3839154977acd378fc1b2197f5c1fd8e12262f9c2974fb92dc481eeb51aadd44a8851f61b93a84ba57f2870df0423d289bfdcfe634f9ecb7d7c6110a95b49418a2dd6663377690275c205b3efa79a0a77c92567fb429d8ee437312a39df7516dc238f7b9414938223d7ec24d256d3fb3a5954a7c75dbd79486d49ba6bb38a7ccce0f58700260b71319adf98ab8684e34913abe2d9d97193e2\nTAG: e690e89af39ff367f5d40a1b7c7ccd4f\n\nKEY: 31323334353637383930313233343536\nNONCE: 31323334353637383930313233343536\nIN: 48656c6c6f2c20576f726c64\nAD:\nCT: cec189d0e8419b90fb16d555\nTAG: 32893832a8d609224d77c2e56a922282\n\n# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf\n\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: \"\"\nCT: \"\"\nAD: \"\"\nTAG: 58e2fccefa7e3061367f1d57a4e7455a\n\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 00000000000000000000000000000000\nCT: 0388dace60b6a392f328c2b971b2fe78\nAD: \"\"\nTAG: ab6e47d42cec13bdf53a67b21257bddf\n\nKEY: feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbaddecaf888\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nCT: 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985\nAD: \"\"\nTAG: 4d5c2af327cd64a62cf35abd2ba6fab4\n\nKEY: feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbaddecaf888\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 5bc94fbc3221a5db94fae95ae7121a47\n\nKEY: feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbad\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 3612d2e79e3b0785561be14aaca2fccb\n\nKEY: feffe9928665731c6d6a8f9467308308\nNONCE: 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 619cc5aefffe0bfa462af43c1699d050\n\n# local add-ons, primarily streaming ghash tests\n\n# 128 bytes AD\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: \"\"\nCT: \"\"\nAD: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad\nTAG: 5fea793a2d6f974d37e68e0cb8ff9492\n\n# 48 bytes plaintext\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCT: 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0\nAD: \"\"\nTAG: 9dd0a376b08e40eb00c35f29f9ea61a4\n\n# 80 bytes plaintext\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCT: 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d5270291\nAD: \"\"\nTAG: 98885a3a22bd4742fe7b72172193b163\n\n# 128 bytes plaintext\nKEY: 00000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCT: 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d527029195b84d1b96c690ff2f2de30bf2ec89e00253786e126504f0dab90c48a30321de3345e6b0461e7c9e6c6b7afedde83f40\nAD: \"\"\nTAG: cac45f60e31efd3b5a43b98a22ce1aa1\n\n# 192 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF\nKEY: 00000000000000000000000000000000\nNONCE: ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nIN: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCT: 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af",
     "24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606\nAD: \"\"\nTAG: 566f8ef683078bfdeeffa869d751a017\n\n# 288 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF\nKEY: 00000000000000000000000000000000\nNONCE: ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nIN: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCT: 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606872ca10dee15b3249b1a1b958f23134c4bccb7d03200bce420a2f8eb66dcf3644d1423c1b5699003c13ecef4bf38a3b60eedc34033bac1902783dc6d89e2e774188a439c7ebcc0672dbda4ddcfb2794613b0be41315ef778708a70ee7d75165c\nAD: \"\"\nTAG: 8b307f6b33286d0ab026a9ed3fe1e85f\n\n# 80 bytes plaintext, submitted by Intel\nKEY: 843ffcf5d2b72694d19ed01d01249412\nNONCE: dbcca32ebf9b804617c3aa9e\nIN: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f\nAD: 00000000000000000000000000000000101112131415161718191a1b1c1d1e1f\nCT: 6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5\nTAG: 3b629ccfbc1119b7319e1dce2cd6fd6d\n",
 };
-static const size_t kLen9 = 2196;
-
-static const char *kData9[] = {
-    "# Test vectors from NIST: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf\n\nKEY: 000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nAD:\nTAG: cd33b28ac773f74ba00ed1f312572435\nIN:\nCT:\n\nKEY: 000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nAD:\nTAG: 2ff58d80033927ab8ef4d4587514f0fb\nIN: 00000000000000000000000000000000\nCT: 98e7247c07f0fe411c267e4384b0f600\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbaddecaf888\nAD:\nTAG: 9924a7c8587336bfb118024db8674a14\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nCT: 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbaddecaf888\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 2519498e80f1478f37ba55bd6d27618c\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbad\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 65dcc57fcf623a24094fcca40d3533f8\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: dcf566ff291c25bbb8568fc3d376a6d9\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b\n",
-};
-static const size_t kLen10 = 469493;
+static const size_t kLen10 = 2196;
 
 static const char *kData10[] = {
+    "# Test vectors from NIST: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf\n\nKEY: 000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nAD:\nTAG: cd33b28ac773f74ba00ed1f312572435\nIN:\nCT:\n\nKEY: 000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nAD:\nTAG: 2ff58d80033927ab8ef4d4587514f0fb\nIN: 00000000000000000000000000000000\nCT: 98e7247c07f0fe411c267e4384b0f600\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbaddecaf888\nAD:\nTAG: 9924a7c8587336bfb118024db8674a14\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nCT: 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbaddecaf888\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 2519498e80f1478f37ba55bd6d27618c\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: cafebabefacedbad\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 65dcc57fcf623a24094fcca40d3533f8\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c\nNONCE: 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nAD:  feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: dcf566ff291c25bbb8568fc3d376a6d9\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b\n",
+};
+static const size_t kLen11 = 469493;
+
+static const char *kData11[] = {
     "# Generated by\n#   go run make_legacy_aead_tests.go -cipher aes256 -mac sha1 -implicit-iv\n#\n# Note: aead_test's input format splits the ciphertext and tag positions of the\n# sealed input. But these legacy AEADs are MAC-then-encrypt and so the 'TAG' may\n# also include padding. We write the byte length of the MAC to 'TAG_LEN' and\n# include the unencrypted MAC in the 'DIGEST' tag above # each test case.\n# each test case.\n\n# Test with non-minimal padding.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660\nNONCE: \nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: d88861dcbb\nTAG: 181ebd603365ed262b8f2faf5b86ab90a8930bfc0c55cb9f1c88defe20893b2d5eb8ee6809c2452f302315\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with bad padding values.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660\nNONCE: \nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: d88861dcbb\nTAG: 181ebd603365ed262b8f2f9292c597b813c031f09b7a7144e557dd\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with no padding.\n# DIGEST: c6105cc86e18eb8376c16ea37693db5c07b77137\nKEY: 8503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f0\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c748\nAD: 1df3f4183aa23fd8d7efd8\nCT: c90e0c2567341ea7e9d968dbde46ecb46ad78dc8be7d47672068de66d6e7eae14b500b94927f24ff6a4f7b07\nTAG: ec90d128ef465f4a3645fd0b2601fbe2b0bceae2\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with maximal padding (0 mod 64).\n# DIGEST: ceb2d295bd0efd37c6c34dab1854c80e986174fc\nKEY: 37446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d4120\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba\nAD: 2fd6773e0d0c302a5f47e0\nCT: 000893d3434c5be7cbf9daffd81f03545f735cb70d1bd16eab26e07da7ee29b4c607d9a57077d74437e5b01a89c808c7ceca0d3838e5c6ee9947f1d4ee1d5e5e\nTAG: 6d8dc4edeeea81cb503d7389da209ae335876393fdab048965c7eb1a1403d05f8ef059788d08c2e906444388fd416a87bf8706f78d35797453b242618f4a99f47c3756116ec0318d96435032225ff82b902b9b6985189ca438e466154ded91676676c645926e2cf8a5d6f3bfafbb713d646cfd35b091f68e5ac2e7ec10badf1fd80767e6953abeecdc89beb2180dc92be21631164ef801147917e0c8d7841bdcdb52ea03344ab5f2bf3d5157794f5be79f51eb1efdacc0b77b27b72e2ce03d05473203522e3c2c196390d77dc28a35951f3aebd72ee58021d55e521dd029719a7660408ed0da5ab41830102bceb514b0b172d0ee10937111edba82b47e719c3beb3ce49a665accdc1c5bf028d465b5e1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (1 mod 64).\n# DIGEST: a07054c760cc66fc704edf950201005031f3faac\nKEY: 446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2f\nAD: d6773e0d0c302a5f47e037\nCT: a1e92776d0ffcfed03d1be956169f606733755d5a7011620c7ced6a825d8e59627e75692a41a1f2a86e62fc6052873b5458616414584e36bad698cf4c44909e0a2\nTAG: 6e0b32528feac2d7f69abb480efc7aae6cd1c5f8a654bcd10ec5be08b58f5a2198bddd83439d69ba9f55408cdf087e8a7f33fca6859638c5a4e8bc6961afee7534d8ffd95249d554b02e5beb81100be5e10abf679300f4ba514c03f4fbbba3cc62bd13dc8c8b9a726a9f217446c6e3b89cadb40488b177926c88c9d22a6c4ad9deca67f0d976fe62cd24c3cbb2e51dd16ee2e7bfe91d867b77c77a9a65c387e2682d946e617d0128034f5fe436eb7fa88aca82526d71dfefbdeeeb5a2c15d57fce0cf12e6ce0b101ef92d9ca540447e0bb65bc04b6a02e4e6d9378c6eebcd6d530c4ae14243beebb18403e8bcd434c2d88cc121e2df182edc3e1f52b060b1aecc48490c6cf3260299449945c803891\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (2 mod 64).\n# DIGEST: d059c266cf6233af730b7a229b19356a4c6fcf06\nKEY: 6f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5d\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6\nAD: 773e0d0c302a5f47e03744\nCT: f414f0321370af1490839677747893befa438051fef5f02fef488d7b84dc03140b3a5dc3a57041be4c8b688633110fc07251d877de0d6242928e4d937e3cc58ed611\nTAG: 4ee98ac6f10e179314a251a9db190037c47b9fdfc66321d83a995f6dccc5259801b18c3f466f7f4939b7d2d7196e0b161aaa013721e81bb9707b974b904f670e4aa495357b562a254908417b65fa69e86c42b3efdd423838575db08465a7f4889c85201629f6350c0865b5b0cfbac4f51ea1eacc8f9768014975d780438c3bd77f7f18612080abdeac9331e1a068c8f3a345d0026c5723bdbc48643c1a733a5b7ca9078424522db9491bc38d2644dab2d75499715707cd83ed655343ca73672d480f1420754fbbfeae0fba05be3b5235a5fa48bda9f39df0b298351d8f4da3fb8a2feab8b1aca9335eb31ab03f40ab19f668bb864c798ae08de37bf848fe2e898172d26fa23f383787d7199a6990\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (3 mod 64).\n# DIGEST: 8aac0687e33041fcc18da154b41f20a6af2bfb28\nKEY: 5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd677\nAD: 3e0d0c302a5f47e037446f\nCT: b51ab2f8c4ba3e8638d454ea72da5e3cb15336c347c442b8e1ade85c5cbd0dde790dc707d60d452d5b88d72e718f13cd0e0f4c9149b72e8d6be869d817a3232513c958\nTAG: dc8feba112517f6a820ca12de43c5d64c51cca713d3702a2b4a5cdbe86a90946a7369ec26ea8b5b35df329bfc6e29ef50c2774649134bd6e3f3fb38ef13d9c7fbe066e9cac4fb88dd0c02b677472ebbb2d0679dffedcaf13fccef6a25aed3a272ec01e7680becf80a624518e1333d28c97487b06e0581cc80c94989db4e93489f3dece9eab6dbbee73aeab572d1ee7705d18b899d9c62d7a370311e64131a801400b580d3c8f7af88be485b84fbdd89f7f7dacb29afeb56658f3d8e49f27adc542e412b0fd652b9f60575bf61622d7306c54bed50b43d89cdaecf1981ede09f9ea36fd174118ac178ade5f26ba04fcbd2eb035f030e2139506456ff8d342a4e59bd55dfafebda23a66cacfe6d1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (4 mod 64).\n# DIGEST: 53658226c112b86438dd27b58a71f9e36fc73c1e\nKEY: 91d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce99\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nAD: 0d0c302a5f47e037446f58\nCT: 87bf1af7e4987cdab35bfe32adc6b1be286751426cf926217f2c699bc095bde7b6ff3d6cc96b79328ab776547c2cb756d9de8c1245d21619a51dba8364ef6914590f15f8\nTAG: 55b9a1ee198080846389dd088016acab73622b1e2f902b0776846c74d99c27e67c7bbb55b2ac0efff91af0f6cb2ddcc0b5b8bab768048bb1662bb343d2f3a164bd4ca4850fbf8111b29e9be7bb836e2a8ac50ec2cb0b1c4529e50904007372284ec9187ea27d8faa03fc9535ba744155d06c06a0a97d96c03de71c13c95f185f426615f1368be346aa5ebf80049ac6771763235f2ee44dc910a01035c53caf8f9fa6f51fe3ad094513a8db177b6a66e24d21e1e40a23aa3629fffad45f84a58a29ef9237fac5eb6f5deb3825de6f399e46b2b2b91faf64ce45d164155e4dc757f6005c7c3e7fb3d8829623fd7c6ca48b923be90c38f5209c6d94696d2b2b7ebc5dfbf2cfa1a37e8ed038e830\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (5 mod 64).\n# DIGEST: 6b7d5268b0b5037afb5be5af6a0ceb34e7656ac4\nKEY: d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d\nAD: 0c302a5f47e037446f5891\nCT: 44237c388c3d017300db0fc9827f9b575e59bd971a0fd89cde4aeb1763912b49d50e92ba19d7594ef6da27320ac2bd1db3bcfe56b68a9ea8e2347d69890fa1fdc8bed782ad\nTAG: c1068d84aa962e7b89090993378806194ffbf677e7a66524d2ebfa7bdc52d76d09b914168eec4a5fde0953d4567affd3a4e0e48190e7a84471efe8ad1ce577c21df93b9d641c865d90ea1e6069bd703c4ee372379a4ec94f7e99867179561d41e9053977cc985b98f7a9fbc675d77052809b89b8f23f993e191ed1a07f97b89d05de948107f94245f216c413288eb4e40f3cee9c00c15926657d9ef9187ab405ee8000b4bd84d",
     "5771464401d59156a97eea7b23b4a6e9f1587cd3b75826a621b699515829dfc57740ad5719c43e88d835e13ebf703a0966779d31dc26866e0e9d27e3376137c92c97af49a876eed425d3980f1904f013143faeccb4fc920185ec2325361e5b318434487f9\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (6 mod 64).\n# DIGEST: 63efe7af502231420ed5aecce9a28446b257828d\nKEY: 7df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8f\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c\nAD: 302a5f47e037446f5891d7\nCT: 2f25b5a3b01af5411466c8aa5d8ece037434d5e12b62306f2732cb063d0dcdfc2725e67118a242a5576d470fcaf9be6d811bf2789cc66f5561d0542438b5432fe713187a879f\nTAG: d80e1f4edc2137f430d36a5ac93680c973fd7c64a03f7c2ce1b7e33085fe94da70ee26f47998947310508448cc70daa595687eaa540e48f048132de108a045da6d71170e39bb45160a344a2fdb5cb56ab020b9c0842ef2a1a5c83b4d63359fb8d71506d1e611fafa29e77d0669474d135e37bd8aefc3e17f024093186ff80fef73889e887b8d6672256dd592946ea84becc08c29445c8d978e896b1dad5e2608e347e54a97f3f757d7362f95f4cedebed07ab45b05713f7119c38d15a0f22d4259893f5e2401267543b3f78b52d54dd2d608173119e2dc7fe01f66589628e95fd7528958e993b21e4db664b8cba2f776d5cc305c42553da936d580c17d6f5090ff04e106c6488b5b18dd\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (7 mod 64).\n# DIGEST: 1a555c300a1d1bd5b03cdd6bf2a678621624eb05\nKEY: f660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c30\nAD: 2a5f47e037446f5891d77d\nCT: bbf934979c5d9da5c8b27d0341a164d640f12956a392303b0f1665935b5c39de458f53e0a6f824cc56081db1615fc67ffff0d300d1564666b81bb37da59e4da30de9d6a19df74e\nTAG: 9c18b0f9ee6a167a23566325eb330660997193385214abaf945dc18fb8252fbab8330b9809a6f1b300ae5a0c9d841fdd6f77e8d65f1cd0b221fb9b94b5e5d7215e6f501f490a7fa0a754efa7f2d9f5b927a5da2bea736e73af067e5d988901032d503ef3ab89894d03e48a096e7c31fe64bbc2c13f02d878590659ee7606d9212898d4d246e52b03c5646b1c3fbd43baaeda6548156987fc8f490f5763da18198bf0754d20f16dcf7df6bd35ca4bd95cd5c95a60427fc541aaf1f6923ff150de825cff9900ac9492350770bdd13fc4d0ac858ccdf36efbaeeb572aa45ca5470a04a7fa1ce5954d58771730b7202def47b303e560e81ebba2080d044a0851043c5af1a05c30a5a448eb\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (8 mod 64).\n# DIGEST: de9156349b578f2f44945ec6a676a67a829daea1\nKEY: 60ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2ea\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a\nAD: 5f47e037446f5891d77df6\nCT: 9b9bb61ca4d5aab8d0342d2b174e8f39b8e21db0fb7146025fb298016df3bab4363bb47f5b1fa038587df98851d09d473a68c959ead8062c52b9d6de86bd6a0fc9a2daab4667c621\nTAG: 897472da6d837ec173c2ae738721306e8d3c9e5353b65d1ecb3be3d0039739de379c9b06f42af8e952aa9acb4780a6de888dc8c54fe9a2eec19ae4a864b3b9696d712153bb66c49825ec5c891e30915c4b7b66b190525195429426ad694467dab09e8c2f9f21ffae4d54b74c0c5ed9a05963651dfcb9560677693429c63f3024043385ab0a31066243d42b80d2aa9854005504d6c8b9b7f736a8731c5dea0f3fc9007aae0c6edcd0a91dd1bbc5750de12ee13d4a77379cd3b2c2bbac885fa17338011b7b81cec6711fd5d65178f20a06f5475e09c202deef57939161ca8ed3e4aa9b010277acddc4478d1afb64138b276e265182ef2dea321b4f136c5c439ef6d099621813209a43\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (9 mod 64).\n# DIGEST: 12812df3aa7f3bbc899f6f248f5590e02570c292\nKEY: ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f\nAD: 47e037446f5891d77df660\nCT: 33ac574b7962d03b7816c0199a7f661a485832b9023867a749fc4bfe8ff0485571744f801139afd8215863b23e2d68ee7a254c60d8029e0f1ee10a1b947a4984f37f98a6767f52661e\nTAG: 3ee493d8cc764880f4ae7fc3c189b95bfe11d89640e3c9ddb55b230ba0d142d53fe18be8b955cf0d0d237c3b295459fc4c723b27ba8a29ed8dd5c80fb9839e30bc92e6afbf28ef6f72d1c28e5452460f986444678e7ea982d8bae63b69788012bd43aa66e5a521840c79831ae74426fb16f0917c5d2747b9c31fe43ecee604f26afddb093a9f1f1205a4451d50080ed0a9208a88ed6dbde37a674932bca837c46dd8725982c2ef6ac54511151c4cd59e511ca3835ea9bdbbd2e0842dc9674a854b8d4b063d0685086cdf917a7b7983dcc28af2addf3bc302034e365da1a87334a68477aa34a3a878d926d4c17f50316749d917e172e47597d060403a0279ee68dcd864652f37c6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (10 mod 64).\n# DIGEST: f3c89f21c327fca4aa400fabea9e39780378e901\nKEY: 82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad40\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47\nAD: e037446f5891d77df660ed\nCT: 8517e13ca00214ebfc748efd3a233e8b64801dcce99f9fee3d271357220dff7b1678c1cd6392a6ade62146c0e783248918a7cb69dd26dea525bd9060f380dba75e502bdc19581ebc3295\nTAG: d1f1280699f5514e4a56b08a5c3146142ef8e44c18ccac74577ec0feffbc29884da82212cba95b31d8464954498340f35e9a3d84256e8628368edd166d4b429fcb76e0072d2f5276ed8dc7bd5f34e754f6577ba00ee7ad74e9c89c4f82af0a7716d6ac77c39643909dedcc9356ba42f07874031878229a076da9ac7b0e49b2d170239089ceaf84392e889e7bceb3e383d0f744e229c53e8654ef0099a11773885efc456883e4a973557852f70c0e35668f3f212260e131962087416e668c9f995f226152251f5873fb89047a9dfa65b9fd0116486092b1092c4ee33e7625772944c06a2969b162986cd46d2b4185af2658c25c69a7a599d17f37be0fe1c8250cd7df5e6cf304\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (11 mod 64).\n# DIGEST: e8e41988fad6c8b44c56544964cfe0a347b35b1e\nKEY: 933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409a\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e0\nAD: 37446f5891d77df660ed82\nCT: b1cf0005c93547664e09031d923c4ef9ad663a808189cd8aaa68fbada340d8bb13330499131ef3788cd91e9527702a2388802fdd2e91998a53ffbb466bb7e362d06677edd673cae71418a6\nTAG: 7cad97328236aee512598d1a4c7d51b2154218fddf0ef21724921c1afe61fed1b7a1d1b56b8099dafff77362c4154e4bd7089fb0908ab1de49244a053997a0d04229250e52bc1ecf4550da5753a35108b6752f907ddf7a77fefbdb5d7290b02ae231d019d04ad9a5295336639e7e6c81ea46863d2bc3c4fca7d0f3b05237306759b156ac1fd10b044730987d04a943f0f598704f2191f6c627299b92a2c01a4004111c21f650376c3f28fc9793eddaefd74a2bb3cc5dea73685c954c63b71f2924ebcf9853ff084117cc84a0785d96d8d55d02723a2082ecd8c4b49b8d4068071593aff50c2e08fe7c49f6de1d7586e299b42ec723063f2341fd9b3445cf40893cf8c2bfa5\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (12 mod 64).\n# DIGEST: d1c7b2c04dc25fe7b742a1d659aec20e1475ee4f\nKEY: 3f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae0\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037\nAD: 446f5891d77df660ed8293\nCT: 7195b9643e0f7a4293c865db36442d4fe2cf3ea2c648dc88cd5636fe5e6bcea3d1197966e800da8c78bcb8830f3fa97671aebce98549e62827adf612e70f946673b07e2f953c8fe5e0b97aa1\nTAG: 3a909a9fa57e720bea6251ebbc1a71bbae1fd894f6bbd16e11abe51bbd1293abc0ad4c152a08b4acfac7a65b723fc6bd6923db66bbf202e184e8dbba150e6021ad1310ab4752cd4ae874409688996fdf88636084db7762b9578bb0c98d77c5156a82a97a3f6989db2359d252ff7c6405bd4834708c88d4481b35eabe2f7069bf8bac374fa382f4225659b41dd2a8006c0ff8d7c77c8d157e0373f45fcc0abc804a9f8a6b816f2b729befd606dc61e7f763f18121f56255662e36d120b27adfc8e1b528bd8ced5386cdb62cc73e58cc7918d27253297e9cbb9c740c7765cb014cf7bf160cbf09e00d32d31d462f356791bcf1286bb9023254afa6c41fe3d165f1bf7e6c002ef64ecdf3b5e073fb569028032e6713\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (13 mod 64).\n",
     "# DIGEST: 116e20ff1e79e0af464d473b1e7c187f4dd66007\nKEY: 62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae021\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e03744\nAD: 6f5891d77df660ed82933f\nCT: 1d50f3eb1cd76d8e08a9f386db0cdc3eddfc694e8502ccae47ab431c2935fc461254b80386c87690b01c22f38ea9bd118d2e0ed316ac249437a3e9c30f6c1f767c150216ec90e6c8913ff3d469\nTAG: e44bfe162cbba654362d1c86088564b14120815f181932e9f111d6da5efb5f4caad61f1161d1d148cc429ad34fcad9128bab101c7cc004fb8f0b516216a809a6599b5144b4c5828cf159fcecac46a86ba0698a6e5267610bad10cd7ce9079b6c691c2ecd522dbe3563074f2ac85712e58cca41761aa94449199a8b440016e68eb8bc9db3ff2c2bd9c64d9d3c71566bfb5d234af1a144859431f16ce6d65b4cc604e9cbf4e5539c192f07a2981b55582376bedc07aa20f5a841c9f500915fef353c37446511da3affd743fc551d5c22454797b3eb957770f1ca16da138c71bf5c00ab7893ae83b3f499a2c42f55551a986555925337e0604227ebf1c65312f0b1a8cdf2d06b5daf3e5ea97ceeb2f33421d0b44b\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (14 mod 64).\n# DIGEST: c081d0d09b2c9eb39a372ef4a7b0246a0956b0f9\nKEY: be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f\nAD: 5891d77df660ed82933f62\nCT: 4d754c684658bcc89208bcd75f24dc8e18b70a28b8a2201535e60ab755fb20e1ddfa98742d257eadd02d96c6a65f880d058312311efdf67f9a106beff9f5ace0ac6af586aefbb5e8b4850e584bb7\nTAG: a9bc9bdf2c16ace8cd471c2bcfbc2cf933fc1886faeec62d4809ed5cc4dd4fcb6ca6c42f31bab300264b278dc0b10fe8a54005b590160b410dcdfa3db413dd04a72c897b262ed0fe4ad6683fc5229010f1d2bc939e61a2c9e0480ef3e03e90f74a3edd8bb523271adc45d097b197ca9034bff48677efa763e1ae7528d3f775f827b9c56ba7f042d7f9413b4c5d01972e86976ab3a398afae27faf3cd19ef1b24b5342f9d067e7702bf1ae9679540a72f7a12cdbfbac234d596856b3bfdc2190dff0b50f45b4355cfa25ebf8d1d16528fe6c4baf9b0e5a50f95c4091704e939c8ffe69183c2695ecb1f12f24fdf288a8e8bdf3fe510bae70c46d0214303d5503d21366c4eec24cc2808542a203d81789efbb6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (15 mod 64).\n# DIGEST: 6f7bb1f9e2772eb909c315e653e4737cfed78a18\nKEY: 8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae0211641\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f58\nAD: 91d77df660ed82933f62be\nCT: 25bc47e58e7d4f3a417c95768699c92240a2be0e86232a41fe02d64f66716023996772e1118be48e685042f989dcd9cdc574614c9c3989f1885b4b71dfd5b1c32c1321ca41ca1e6ff1828e677e30fe\nTAG: c96a78b9ca68054bc1ed2a150dff9f9585174f343d3df80350982002b4c95106b72813a90028f2855faef235909686607f39655ec48f4024e170c9f9574b0c81b63c8df7af6b4d0f0633853a09c334379952bbaead7415125f541a01e320c5f5d9806b71c3ba71890e3229e751f25ac82c245596b5fa688f1b13844d91169354bf0cc03cccf576c2216aeb9eeab33e2a9f8bad2145d36cf0e7585a02296a7a3b434f4efeeaa4d7ed65befda32b287d9d0946e25dbc0edc22de871184ae8c76777528b917585be784d5e0674b1e5693d0b8cbe8253f8db67c879e1d2b7ddd5df4777a15509f813eb4d0f5a935aa011daaf0cc1ba2ebba9a20a74847e9c53b648f6fce4c08b6e7babc1919e6de22210a6f05\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (16 mod 64).\n# DIGEST: 172f4992e692a88f49628e5d3937959be01aed2e\nKEY: c55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417d\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891\nAD: d77df660ed82933f62be8d\nCT: f1ab85a35a17541efb4f906e7fc85e64efec6ab40d59d3da920c4ec09797c3ad47820e9d934e51e3f4d097c4a555575939bfaeb8cfea062b64816a160d6e4d1ff02a5fded435ab9aa2daf22fa7d676fa\nTAG: 14684ce099f4f0e11e785320debb89c79c03e8bb8751860d3779b4b553f6dedabdb23119d2866ad63fc974a6c6442b734394cb6705309a4d3889e90c4a222bbd14624cd89a9c3f904367c418140375dd592107f839ca94d43d09495a8dc8273201bd8f5a447bdf57506421a975ff4db3aab7878ff18e5b73c8f072a8d092461257d0182710ee9df9f86ac5ad321eac7ee96dddb27ecf561db222ed1c7c183c2ecdf4c7f57cf295638de3c4176ea244100d51c006282e98af1a8fd540daf0ca6f2fc0b88c550b4ab638760d95f2f9d09612da198616cd13fbfa1ad12a3fd30ac9956491cb11539a1be43175fb1452393f13f8d03501c89cf5962730125a7e185dc089b41124fc1e7f69b1fad46bd661c1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (17 mod 64).\n# DIGEST: 00133da1f7c63fd5f0eec364e9a359be02c1d3da\nKEY: 5b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d7\nAD: 7df660ed82933f62be8dc5\nCT: 5d6bfe91cd2273a9b986397a38e81be5fbbcd0403ef51873c2c467a9fbadc7bf540e83c538a43dc0e0ab780a4c4b1f5b77ced74f65b61f8b8b58b26fa3e8cba568bb717dc7071bf82dd8c68b068e739706\nTAG: 2ab9e654859c35e065f763d949d43c65dc85dc5d918850809ad8efaed6569d4b3ad064bef3427ae4c3be571fb914cefe2362169bed5b4c0cb17d2106fd6993d20ab8a8b70edb5f5d59b3357c8499c36e2b0b67edf7f334ff02d599031f43252b8d30d39affbd2093a6687c771b672329e14901ad9128f063267d3ab332ea31a79d37cb24ad0fd2d07f23b13d4643d1d9c529e1dd0490c851b0009fc1192f2438a48aba5a39be2ee925b1a38647197ead5cdea3499daa5abf9f4503d3581115a6847363348d5e7933948dce867752cde69ecc401012674ad75e12245dee86d775989275a5fc635c66d42c01b7646e180d28798905a3beb210c049be35b522ad580e1ca29f81b9469448749fce961ba6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (18 mod 64).\n# DIGEST: 60a6821269be6c5b985576b245f106128eb0b325\nKEY: 436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0c\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77d\nAD: f660ed82933f62be8dc55b\nCT: 16e3c681ba1ece3bdbfb1da491f877e806ddac5f1ae96bc406bd195c9d48bcd4a9b700a8ced21d824bfb99eb057e401c3529818725b51e96c576e8009bfe4866e98f550a23ef4748ff761a4d1c44ccb5eba0\nTAG: a30286b3d06306818a268db0e5116abc2c7361c5a32d334d8ce5f4007aaeab750980018b435c79391151fdd33df2a97dc2cf62c4426ce45be43f7e4949be735bcd33f0e81cc6b5a3c2255fbac9ff5a8fd7e7b57554d7ef00640d92b605c9afb0c19dd5ca4c79c409d85c197e8f21d79e91df01a817bf68e8718bc771028c945471ae003c0a210c572b79d772560031b5d3e5495aa8d9bd6fa3f8ae9976ed7e7f8d7275030d2f12ed5ab05276ebebafcac7d0ca41f9d860583f800e4f1b9658b12fab31fd63f6a5e4b80463918f8295ae11d7b97f9b5f89b8166861aec8f1b1417163a6a8adce23ce66c9a4306acae7ca75435cbaece814d6010a3e335bd7db9783812052179d5337d1c353be6e0b\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (19 mod 64).\n# DIGEST: e2593f3b6741a9ed9fa188fc06efd057556ee624\nKEY: 6965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df6\nAD: 60ed82933f62be8dc55b43\nCT: 9b51ba0eebf72bbcd7a1b8452a49f30bf2d96bf0cde4d9e5efe7f1903eb4e09f53aec649c5a8ad7e7fc6c28a0dcf4bd3556f4377bbf8b3f9c79dffa5978692559f732c109a7a02390746f5975d5a0aac4d04ce\nTAG: 636f7bcc9b0b5320643f4b6acbecd60a0a89d2511621ab47fa4c9af610fa1ff9c6cc5cb8fb64493d6a4dca0e94a90794f31698cb1c5bb5658e8b6a63a2cc9b2f1f297240d3d6c62087e32f5d5e9f9d608eccf4b41253933c7391983db1138012a5f5caa5abde25c8a16fc33cccb0604421d985f198c48552650f5dd299bf9163c136c042c9a35cdf7120a702bf460d739ab264fe1f58453ff4990f7315379ff074e01730e7cace8d45a5d0355c0acc409db8fbc759516ad56818b37700548aca769719937103787311b6dbc8488d9e68ee439cec3075bafb725f44734326df9b10d6a4f7133ba84489a9985febc96200276a1fb513f8a3c062466cbe63e7ad668cade7ea70c3b8cd040a6162be\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with max",
@@ -466,9 +487,9 @@
     "02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c2\nAD: 7f4372480974454879c41d\nCT: fcbf4939de59426da2002fcb8e3a4d07604a168e9ffb5f13afcfbdc45325e3ecf0659ea736f9dbf61cec1dbed1024eff9e3bcb721c28d004549fd84e2cdeae36dc5e5abba4f0102835740bb877858814fa38290344addefb47ae583171a510719d9aa18c8f8a5e01396fecf1a982e162edf1047f56e8e4a839c5560473f389a4c7ea8fd5e03c7f2d31ccbc094f04e2a510aa57fe30f37cda765ddcd2bec89ab3f1f5f2ca423c68664c3303520c71439230116409dd84b4a26c1a102e521253ccd455793b0d883b1569b5013653b1c606143fcba7252a70d2a2026b989d1f67fdd594d2b33bde1bf7ee9bcb6c013ea8886e0ec1341039b8d8fbb4d865754a62d0e2a1151c917368e93fed0cb29e2d63ae176cbd95991db0a2864b27b6cf5782093bbe0ae117c7b2931f678bcb07aaae3d955b61e7ebbab8e84442295700cebf1a8f7d846fe788baa0660608bcbfa59c4bc9e5d163654aea99635f9bb63b8074478fc97b4981f5e5d35430b1e18332370dc5f4e94616b0270112dc446335d10a169e8a6923765647607ba9ad65c6f6f008cdf041af2e136b398bd1d1f67044f8360d9c1e90012e594a353d8e45aefac62173fd1b03ee5e4aa6961d83cbf1096dfa02f36ef62ceea5bf88f95301464d0046cc8ae3bfa611caa0c63d07\nTAG: 850f8608529bdc90c222092bfab0239a3b07b9cb1f\nTAG_LEN: 20\n\n# DIGEST: e654b4c78e1c0061eea2996fc126c9bfd41eb6d9\nKEY: 3b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813e8\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f43724809\nAD: 74454879c41de9ac9f9823\nCT: 3a35e98cfbeeabc993af7e952b148ceb87a110d851bf2d036e5eed8482b39b881b3180dc50ce782a8cbe2c586863c5d038fc4f37d4a96ce8732abb984ae90bbccb86f7766e9712e43d3ec40fdd7a1c88cfbf14743908c78dd4c19d449db7557e0c30127d35a49503d8dce6c9a9e6f07e1c86d7e365162ec05a8b4ed301645f8274999a6c5beafc5b27dd68608aeb2efdd9cb00c6236bb143e7d91709a3fea0e865330680a854d47ae3b6067002a01aec6bdab9e60c19ca66cc39d4a44ada1e21720bd5bd87cdfb31b8a9bfac77feeafc9f8e92c4131d73a3cfb64efae2e8d14fed99c2bc88f63f88079d30b78df18ac03db855338986c0fd1614dc6afaea71130290bf52270999f3392128bc48fb0a6d6425c383b637f4c293e177f479f6a2d6323ed545bbd564f743850a121da96256a8daf163fd80835558b21e0286cf008e7cd87bab94222fd7faa395ee2ba19aa3abf5d000e7514a35357941b97e4ef433c30972e995b0991c862cefdf79712cbd3655ceb43e1e5f5b0d3f5e275bfad98a667d997333d704e4d70acc488b6829d18d1263b841307d592f760a66761e800b4676d64546a1d8630d97218a7c5f555d4a90cf58eee4bd1e1fc0e15f8f64d336edf9ca00183169f237a924e7efd5a339f3cc1bb90b4c513bb9969ecdc9beb5c5\nTAG: b24af9f27ebc204aace6315a197550907bf6079b848eb1dca1a96192ee7c8107\nTAG_LEN: 20\n\n# DIGEST: 654b8591c7f0506261713e9ce7a6fd24a6b9357e\nKEY: 61792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813e8d454817c21\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c4\nAD: 1de9ac9f98233b5a7379a5\nCT: 7e1b59c791aeef6577c7ac69f8624352b7c2c7d1c8b14a7a0daf8240cc9d71ff1298eebf18ab6d469e1a327bbc3bb539df445ddcf7dccacb54f0a4ce6cf18bec20101bcd62bb2b30d8426a1e3ba949dcb69767aab5b8d2228267d784bde55bf887403188cd39453d32d50428bb9846212e4bbd3843161dc830646ba6e251ffad5d1b382101c7a3c87163867391fe44a58639e8a29fbd34cce657d321d004f842e0efa9d4cf03f557bf07a1201ac36258a4810dc101c427e19bb79f0800f27732094ee1dbab2abfc061fd4a1e84b2d36e560a38465cd4c8bc04bc27ffe90f1ce5999fc78d9432ed98c8dac4047a61547b6205bebe2191782ca63e50bb29c9bea553f5de0e9051cef35e3122c00e0d3a2468ecb2a898225c5f65fae573b17a15e013655a2ddc62adfe61ce5a7e352539c6d27c9726d2ca5492ee25b6d8233e32383100d131abce97b33dfe18a415156917ead8fe854c53bde97c0202e782679ac46f05afe1b9ad6b41bcb65bc8a80682ea8092bba0c47a9a03d08004a11756d9274ff83d5d468475c8a4a56f81cd1367040a3f75fd998b5fb3380cf8c1630fdb948fa2d0930fa5b009abc755f4bf70a59847969500d43e2db40ee517c9a6826e8e3746b3d40f9a6e7b35362550cabfa601a887bfabfd28476b3d7eb8917d66bbe9d21bfebb5a\nTAG: 22e74d37769a86785c57bb760e8a28de7a7ca3207fef4e80c284b4\nTAG_LEN: 20\n\n# DIGEST: 1eaad32c8d0cefaa5e2c503bb2185a73e6387fac\nKEY: 16430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813e8d454817c212d3a0063be\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98\nAD: 233b5a7379a561792c0f31\nCT: 26234359615c88fbbf5fddd43d4832a57bda2037e2177b264309e2e50c28efc28c5ed5cbf6dea046a14caa64d499352ecba0eb2d4bd376c6b1e14048033e21b9ec63f500a70c53be60099d9c9e46ea8f250d3d20c834c3c0638a9245377fe2b76b74ea14bca6b4bdc7e8d86ca59f397fe72b8c4cbb8edc3dca7f9f234529034fe5f1441210a8ad9b4694fe013f7e4a906fc400a27279f2a1a31700750e2209f6296ed808c893a42214b46f765c9d01cee46df18b02d5493c3a1da3a6258e89e47934ade4da2fa9eef7f5b1887a60585684b1c5c2ac60d94a62d79694b063444fa36674ecde12095e9203d281da3118d058f547ede5e4b67a11ab55c1b42fe01a94a601ba031c5b0b4088563344cc28d640bf2e7c81a259211b130bb9ba9ad93090c0e11cc939b99046fe7f25132672c3714f9973513af628f21942da6b459a60e31fe1bb9bf4f6259d8c9fa07d796a264f94d64122d186a0220d9f44b040396c9c187d5ad1d806ca613a4d0f5038a8b77177f39361f9107bea7700ba835dcd38cb48a6c5af0bfbb07b7a2543f1c661",
     "f1dec06acadf8860fa2220c67bbc9c97c44cb7cc58831563153149713ca2db85af46932a8de891da1d4662e52ed5b7c1c15d5557a0930c7177c2046b50aaf14874512cd9ed62efabe5704573a4f44a4ddf71202a6ea8c706842299\nTAG: 8eb60165231c67e88b0abd1d7c1c3dcab1b7006d4d3f\nTAG_LEN: 20\n\n# DIGEST: 862c0517b3658e9b9cd27db608d49e24e9b4667d\nKEY: a058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813e8d454817c212d3a0063be26e0636617\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98233b5a7379\nAD: a561792c0f3116430e8b6e\nCT: 6f2cea3b4aa1b3ae78d31e47c0c1e03df944352b9bd5483cfc09577aab2095a0a7e977e9c1c6451625d85d162c1653423609f141aac93123b2a0bd093c5bcdd9a49b27ace4dbe6acb486446f437c27e619a0f69405afc83240f087feb029fdf8f3f25a8a262b4a3efc4bc80512a96a45cca61d46e42132abd34c2821e7ff588c742062c01eacf9d1689f11648ebe326a91fe79275b5b1fb2af4d1440ff4a9ad35381daf2a2c0aa928216351c5b89ea33bf225d34efd7ec2c81c5af325b138a5f4ac50c5aca196d1b32ce8352431a8f08cb3b59d2f8de5c850e2a06d00c1d7f7027b4aa6757eb0c9fd3035063669a5ff8db2402818c88a7137ee309ef2735dd575e43b7508c81306dc50da65aa2276dbcd98537636ef06d1736f14e2babbc39457dc8d101d22e5516d652151c2092812814e9f73dd6cc805e670ca36e62799b42bc07fa1d93b9332c43a4b759e53ae138fd2b2b419b21a332ea304fb7db57e860509855b2a540cc909aff57e1433f295e8052c7609a88170feb7623cee8ee651ae1dca4b1afa427e2e43569d5b7f2ea688d2e2afb33f1dc0666c4b0df8aee281cbcbf5e964beb3851f7b929e5a4e06766746f22d4fa1a32913c0f449b4da8aac6294348f711d4d75bca509516668944d2a162a53a31229528e54e4bfbe13cef013efcd6687e890d292e42119529c92c\nTAG: 76c80a678b6cd735a2d01acc18dbd90bc3997f57efc2c5c78c22fe4dd13f06fb91\nTAG_LEN: 20\n\n",
 };
-static const size_t kLen11 = 469480;
+static const size_t kLen12 = 469480;
 
-static const char *kData11[] = {
+static const char *kData12[] = {
     "# Generated by\n#   go run make_legacy_aead_tests.go -cipher aes256 -mac sha1\n#\n# Note: aead_test's input format splits the ciphertext and tag positions of the\n# sealed input. But these legacy AEADs are MAC-then-encrypt and so the 'TAG' may\n# also include padding. We write the byte length of the MAC to 'TAG_LEN' and\n# include the unencrypted MAC in the 'DIGEST' tag above # each test case.\n# each test case.\n\n# Test with non-minimal padding.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nNONCE: 0d0c302a5f47e037446f5891d77df660\nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: d88861dcbb\nTAG: 181ebd603365ed262b8f2faf5b86ab90a8930bfc0c55cb9f1c88defe20893b2d5eb8ee6809c2452f302315\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with bad padding values.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nNONCE: 0d0c302a5f47e037446f5891d77df660\nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: d88861dcbb\nTAG: 181ebd603365ed262b8f2f9292c597b813c031f09b7a7144e557dd\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with no padding.\n# DIGEST: c6105cc86e18eb8376c16ea37693db5c07b77137\nKEY: 8503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371e\nNONCE: b8da7dac997deafd64b1fc65de39f4f0\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c748\nAD: 1df3f4183aa23fd8d7efd8\nCT: c90e0c2567341ea7e9d968dbde46ecb46ad78dc8be7d47672068de66d6e7eae14b500b94927f24ff6a4f7b07\nTAG: ec90d128ef465f4a3645fd0b2601fbe2b0bceae2\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with maximal padding (0 mod 64).\n# DIGEST: ceb2d295bd0efd37c6c34dab1854c80e986174fc\nKEY: 37446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11b\nNONCE: e112a72933c7b54ed4fad0be905d4120\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba\nAD: 2fd6773e0d0c302a5f47e0\nCT: 000893d3434c5be7cbf9daffd81f03545f735cb70d1bd16eab26e07da7ee29b4c607d9a57077d74437e5b01a89c808c7ceca0d3838e5c6ee9947f1d4ee1d5e5e\nTAG: 6d8dc4edeeea81cb503d7389da209ae335876393fdab048965c7eb1a1403d05f8ef059788d08c2e906444388fd416a87bf8706f78d35797453b242618f4a99f47c3756116ec0318d96435032225ff82b902b9b6985189ca438e466154ded91676676c645926e2cf8a5d6f3bfafbb713d646cfd35b091f68e5ac2e7ec10badf1fd80767e6953abeecdc89beb2180dc92be21631164ef801147917e0c8d7841bdcdb52ea03344ab5f2bf3d5157794f5be79f51eb1efdacc0b77b27b72e2ce03d05473203522e3c2c196390d77dc28a35951f3aebd72ee58021d55e521dd029719a7660408ed0da5ab41830102bceb514b0b172d0ee10937111edba82b47e719c3beb3ce49a665accdc1c5bf028d465b5e1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (1 mod 64).\n# DIGEST: a07054c760cc66fc704edf950201005031f3faac\nKEY: 446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be1\nNONCE: 12a72933c7b54ed4fad0be905d41203f\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2f\nAD: d6773e0d0c302a5f47e037\nCT: a1e92776d0ffcfed03d1be956169f606733755d5a7011620c7ced6a825d8e59627e75692a41a1f2a86e62fc6052873b5458616414584e36bad698cf4c44909e0a2\nTAG: 6e0b32528feac2d7f69abb480efc7aae6cd1c5f8a654bcd10ec5be08b58f5a2198bddd83439d69ba9f55408cdf087e8a7f33fca6859638c5a4e8bc6961afee7534d8ffd95249d554b02e5beb81100be5e10abf679300f4ba514c03f4fbbba3cc62bd13dc8c8b9a726a9f217446c6e3b89cadb40488b177926c88c9d22a6c4ad9deca67f0d976fe62cd24c3cbb2e51dd16ee2e7bfe91d867b77c77a9a65c387e2682d946e617d0128034f5fe436eb7fa88aca82526d71dfefbdeeeb5a2c15d57fce0cf12e6ce0b101ef92d9ca540447e0bb65bc04b6a02e4e6d9378c6eebcd6d530c4ae14243beebb18403e8bcd434c2d88cc121e2df182edc3e1f52b060b1aecc48490c6cf3260299449945c803891\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (2 mod 64).\n# DIGEST: d059c266cf6233af730b7a229b19356a4c6fcf06\nKEY: 6f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112\nNONCE: a72933c7b54ed4fad0be905d41203f5d\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6\nAD: 773e0d0c302a5f47e03744\nCT: f414f0321370af1490839677747893befa438051fef5f02fef488d7b84dc03140b3a5dc3a57041be4c8b688633110fc07251d877de0d6242928e4d937e3cc58ed611\nTAG: 4ee98ac6f10e179314a251a9db190037c47b9fdfc66321d83a995f6dccc5259801b18c3f466f7f4939b7d2d7196e0b161aaa013721e81bb9707b974b904f670e4aa495357b562a254908417b65fa69e86c42b3efdd423838575db08465a7f4889c85201629f6350c0865b5b0cfbac4f51ea1eacc8f9768014975d780438c3bd77f7f18612080abdeac9331e1a068c8f3a345d0026c5723bdbc48643c1a733a5b7ca9078424522db9491bc38d2644dab2d75499715707cd83ed655343ca73672d480f1420754fbbfeae0fba05be3b5235a5fa48bda9f39df0b298351d8f4da3fb8a2feab8b1aca9335eb31ab03f40ab19f668bb864c798ae08de37bf848fe2e898172d26fa23f383787d7199a6990\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (3 mod 64).\n# DIGEST: 8aac0687e33041fcc18da154b41f20a6af2bfb28\nKEY: 5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a7\nNONCE: 2933c7b54ed4fad0be905d41203f5dce\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd677\nAD: 3e0d0c302a5f47e037446f\nCT: b51ab2f8c4ba3e8638d454ea72da5e3cb15336c347c442b8e1ade85c5cbd0dde790dc707d60d452d5b88d72e718f13cd0e0f4c9149b72e8d6be869d817a3232513c958\nTAG: dc8feba112517f6a820ca12de43c5d64c51cca713d3702a2b4a5cdbe86a90946a7369ec26ea8b5b35df329bfc6e29ef50c2774649134bd6e3f3fb38ef13d9c7fbe066e9cac4fb88dd0c02b677472ebbb2d0679dffedcaf13fccef6a25aed3a272ec01e7680becf80a624518e1333d28c97487b06e0581cc80c94989db4e93489f3dece9eab6dbbee73aeab572d1ee7705d18b899d9c62d7a370311e64131a801400b580d3c8f7af88be485b84fbdd89f7f7dacb29afeb56658f3d8e49f27adc542e412b0fd652b9f60575bf61622d7306c54bed50b43d89cdaecf1981ede09f9ea36fd174118ac178ade5f26ba04fcbd2eb035f030e2139506456ff8d342a4e59bd55dfafebda23a66cacfe6d1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (4 mod 64).\n# DIGEST: 53658226c112b86438dd27b58a71f9e36fc73c1e\nKEY: 91d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a729\nNONCE: 33c7b54ed4fad0be905d41203f5dce99\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nAD: 0d0c302a5f47e037446f58\nCT: 87bf1af7e4987cdab35bfe32adc6b1be286751426cf926217f2c699bc095bde7b6ff3d6cc96b79328ab776547c2cb756d9de8c1245d21619a51dba8364ef6914590f15f8\nTAG: 55b9a1ee198080846389dd088016acab73622b1e2f902b0776846c74d99c27e67c7bbb55b2ac0efff91af0f6cb2ddcc0b5b8bab768048bb1662bb343d2f3a164bd4ca4850fbf8111b29e9be7bb836e2a8ac50ec2cb0b1c4529e50904007372284ec9187ea27d8faa03fc9535ba744155d06c06a0a97d96c03de71c13c95f185f426615f1368be346aa5ebf80049ac6771763235f2ee44dc910a01035c53caf8f9fa6f51fe3ad094513a8db177b6a66e24d21e1e40a23aa3629fffad45f84a58a29ef9237fac5eb6f5deb3825de6f399e46b2b2b91faf64ce45d164155e4dc757f6005c7c3e7fb3d8829623fd7c6ca48b923be90c38f5209c6d94696d2b2b7ebc5dfbf2cfa1a37e8ed038e830\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (5 mod 64).\n# DIGEST: 6b7d5268b0b5037afb5be5af6a0ceb34e7656ac4\nKEY: d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933\nNONCE: c7b54ed4fad0be905d41203f5dce998f\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d\nAD: 0c302a5f47e037446f5891\nCT: 44237c388c3d017300db0fc9827f9b575e59bd971a0fd89cde4aeb1763912b49d50e92ba19d7594ef6da27320ac2bd1db3bcfe56b68a9ea8e2347d69890fa1fdc8bed782ad\nTAG: c1068d84aa962e7b89090993378806194ffbf677e7a66524d2ebfa7bdc52d76d09b914168eec4a5fde0953d4567affd3a4e0e48190e7a84471efe8ad1ce577c21df93b9d641c865d90ea1e6069bd703c4ee372379a4ec94f7e99867179561d41e9053977cc985b98f7a9fbc675d77052809b89b8f23f993e191ed1a07f97b89d05de948107f94245f216c413288eb4e40f3cee9c00c15926657d9ef9187ab405ee8000b4bd84d5771464401d59",
     "156a97eea7b23b4a6e9f1587cd3b75826a621b699515829dfc57740ad5719c43e88d835e13ebf703a0966779d31dc26866e0e9d27e3376137c92c97af49a876eed425d3980f1904f013143faeccb4fc920185ec2325361e5b318434487f9\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (6 mod 64).\n# DIGEST: 63efe7af502231420ed5aecce9a28446b257828d\nKEY: 7df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7\nNONCE: b54ed4fad0be905d41203f5dce998f8f\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c\nAD: 302a5f47e037446f5891d7\nCT: 2f25b5a3b01af5411466c8aa5d8ece037434d5e12b62306f2732cb063d0dcdfc2725e67118a242a5576d470fcaf9be6d811bf2789cc66f5561d0542438b5432fe713187a879f\nTAG: d80e1f4edc2137f430d36a5ac93680c973fd7c64a03f7c2ce1b7e33085fe94da70ee26f47998947310508448cc70daa595687eaa540e48f048132de108a045da6d71170e39bb45160a344a2fdb5cb56ab020b9c0842ef2a1a5c83b4d63359fb8d71506d1e611fafa29e77d0669474d135e37bd8aefc3e17f024093186ff80fef73889e887b8d6672256dd592946ea84becc08c29445c8d978e896b1dad5e2608e347e54a97f3f757d7362f95f4cedebed07ab45b05713f7119c38d15a0f22d4259893f5e2401267543b3f78b52d54dd2d608173119e2dc7fe01f66589628e95fd7528958e993b21e4db664b8cba2f776d5cc305c42553da936d580c17d6f5090ff04e106c6488b5b18dd\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (7 mod 64).\n# DIGEST: 1a555c300a1d1bd5b03cdd6bf2a678621624eb05\nKEY: f660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b5\nNONCE: 4ed4fad0be905d41203f5dce998f8fb2\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c30\nAD: 2a5f47e037446f5891d77d\nCT: bbf934979c5d9da5c8b27d0341a164d640f12956a392303b0f1665935b5c39de458f53e0a6f824cc56081db1615fc67ffff0d300d1564666b81bb37da59e4da30de9d6a19df74e\nTAG: 9c18b0f9ee6a167a23566325eb330660997193385214abaf945dc18fb8252fbab8330b9809a6f1b300ae5a0c9d841fdd6f77e8d65f1cd0b221fb9b94b5e5d7215e6f501f490a7fa0a754efa7f2d9f5b927a5da2bea736e73af067e5d988901032d503ef3ab89894d03e48a096e7c31fe64bbc2c13f02d878590659ee7606d9212898d4d246e52b03c5646b1c3fbd43baaeda6548156987fc8f490f5763da18198bf0754d20f16dcf7df6bd35ca4bd95cd5c95a60427fc541aaf1f6923ff150de825cff9900ac9492350770bdd13fc4d0ac858ccdf36efbaeeb572aa45ca5470a04a7fa1ce5954d58771730b7202def47b303e560e81ebba2080d044a0851043c5af1a05c30a5a448eb\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (8 mod 64).\n# DIGEST: de9156349b578f2f44945ec6a676a67a829daea1\nKEY: 60ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54e\nNONCE: d4fad0be905d41203f5dce998f8fb2ea\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a\nAD: 5f47e037446f5891d77df6\nCT: 9b9bb61ca4d5aab8d0342d2b174e8f39b8e21db0fb7146025fb298016df3bab4363bb47f5b1fa038587df98851d09d473a68c959ead8062c52b9d6de86bd6a0fc9a2daab4667c621\nTAG: 897472da6d837ec173c2ae738721306e8d3c9e5353b65d1ecb3be3d0039739de379c9b06f42af8e952aa9acb4780a6de888dc8c54fe9a2eec19ae4a864b3b9696d712153bb66c49825ec5c891e30915c4b7b66b190525195429426ad694467dab09e8c2f9f21ffae4d54b74c0c5ed9a05963651dfcb9560677693429c63f3024043385ab0a31066243d42b80d2aa9854005504d6c8b9b7f736a8731c5dea0f3fc9007aae0c6edcd0a91dd1bbc5750de12ee13d4a77379cd3b2c2bbac885fa17338011b7b81cec6711fd5d65178f20a06f5475e09c202deef57939161ca8ed3e4aa9b010277acddc4478d1afb64138b276e265182ef2dea321b4f136c5c439ef6d099621813209a43\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (9 mod 64).\n# DIGEST: 12812df3aa7f3bbc899f6f248f5590e02570c292\nKEY: ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4\nNONCE: fad0be905d41203f5dce998f8fb2eaad\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f\nAD: 47e037446f5891d77df660\nCT: 33ac574b7962d03b7816c0199a7f661a485832b9023867a749fc4bfe8ff0485571744f801139afd8215863b23e2d68ee7a254c60d8029e0f1ee10a1b947a4984f37f98a6767f52661e\nTAG: 3ee493d8cc764880f4ae7fc3c189b95bfe11d89640e3c9ddb55b230ba0d142d53fe18be8b955cf0d0d237c3b295459fc4c723b27ba8a29ed8dd5c80fb9839e30bc92e6afbf28ef6f72d1c28e5452460f986444678e7ea982d8bae63b69788012bd43aa66e5a521840c79831ae74426fb16f0917c5d2747b9c31fe43ecee604f26afddb093a9f1f1205a4451d50080ed0a9208a88ed6dbde37a674932bca837c46dd8725982c2ef6ac54511151c4cd59e511ca3835ea9bdbbd2e0842dc9674a854b8d4b063d0685086cdf917a7b7983dcc28af2addf3bc302034e365da1a87334a68477aa34a3a878d926d4c17f50316749d917e172e47597d060403a0279ee68dcd864652f37c6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (10 mod 64).\n# DIGEST: f3c89f21c327fca4aa400fabea9e39780378e901\nKEY: 82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fa\nNONCE: d0be905d41203f5dce998f8fb2eaad40\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47\nAD: e037446f5891d77df660ed\nCT: 8517e13ca00214ebfc748efd3a233e8b64801dcce99f9fee3d271357220dff7b1678c1cd6392a6ade62146c0e783248918a7cb69dd26dea525bd9060f380dba75e502bdc19581ebc3295\nTAG: d1f1280699f5514e4a56b08a5c3146142ef8e44c18ccac74577ec0feffbc29884da82212cba95b31d8464954498340f35e9a3d84256e8628368edd166d4b429fcb76e0072d2f5276ed8dc7bd5f34e754f6577ba00ee7ad74e9c89c4f82af0a7716d6ac77c39643909dedcc9356ba42f07874031878229a076da9ac7b0e49b2d170239089ceaf84392e889e7bceb3e383d0f744e229c53e8654ef0099a11773885efc456883e4a973557852f70c0e35668f3f212260e131962087416e668c9f995f226152251f5873fb89047a9dfa65b9fd0116486092b1092c4ee33e7625772944c06a2969b162986cd46d2b4185af2658c25c69a7a599d17f37be0fe1c8250cd7df5e6cf304\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (11 mod 64).\n# DIGEST: e8e41988fad6c8b44c56544964cfe0a347b35b1e\nKEY: 933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0\nNONCE: be905d41203f5dce998f8fb2eaad409a\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e0\nAD: 37446f5891d77df660ed82\nCT: b1cf0005c93547664e09031d923c4ef9ad663a808189cd8aaa68fbada340d8bb13330499131ef3788cd91e9527702a2388802fdd2e91998a53ffbb466bb7e362d06677edd673cae71418a6\nTAG: 7cad97328236aee512598d1a4c7d51b2154218fddf0ef21724921c1afe61fed1b7a1d1b56b8099dafff77362c4154e4bd7089fb0908ab1de49244a053997a0d04229250e52bc1ecf4550da5753a35108b6752f907ddf7a77fefbdb5d7290b02ae231d019d04ad9a5295336639e7e6c81ea46863d2bc3c4fca7d0f3b05237306759b156ac1fd10b044730987d04a943f0f598704f2191f6c627299b92a2c01a4004111c21f650376c3f28fc9793eddaefd74a2bb3cc5dea73685c954c63b71f2924ebcf9853ff084117cc84a0785d96d8d55d02723a2082ecd8c4b49b8d4068071593aff50c2e08fe7c49f6de1d7586e299b42ec723063f2341fd9b3445cf40893cf8c2bfa5\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (12 mod 64).\n# DIGEST: d1c7b2c04dc25fe7b742a1d659aec20e1475ee4f\nKEY: 3f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be\nNONCE: 905d41203f5dce998f8fb2eaad409ae0\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037\nAD: 446f5891d77df660ed8293\nCT: 7195b9643e0f7a4293c865db36442d4fe2cf3ea2c648dc88cd5636fe5e6bcea3d1197966e800da8c78bcb8830f3fa97671aebce98549e62827adf612e70f946673b07e2f953c8fe5e0b97aa1\nTAG: 3a909a9fa57e720bea6251ebbc1a71bbae1fd894f6bbd16e11abe51bbd1293abc0ad4c152a08b4acfac7a65b723fc6bd6923db66bbf202e184e8dbba150e6021ad1310ab4752cd4ae874409688996fdf88636084db7762b9578bb0c98d77c5156a82a97a3f6989db2359d252ff7c6405bd4834708c88d4481b35eabe2f7069bf8bac374fa382f4225659b41dd2a8006c0ff8d7c77c8d157e0373f45fcc0abc804a9f8a6b816f2b729befd606dc61e7f763f18121f56255662e36d120b27adfc8e1b528bd8ced5386cdb62cc73e58cc7918d27253297e9cbb9c740c7765cb014cf7bf160cbf09e00d32d31d462f356791bcf1286bb9023254afa6c41fe3d165f1bf7e6c002ef64ecdf3b5e073fb569028032e6713\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (13 mod 64).\n# DIGEST: 116",
     "e20ff1e79e0af464d473b1e7c187f4dd66007\nKEY: 62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be90\nNONCE: 5d41203f5dce998f8fb2eaad409ae021\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e03744\nAD: 6f5891d77df660ed82933f\nCT: 1d50f3eb1cd76d8e08a9f386db0cdc3eddfc694e8502ccae47ab431c2935fc461254b80386c87690b01c22f38ea9bd118d2e0ed316ac249437a3e9c30f6c1f767c150216ec90e6c8913ff3d469\nTAG: e44bfe162cbba654362d1c86088564b14120815f181932e9f111d6da5efb5f4caad61f1161d1d148cc429ad34fcad9128bab101c7cc004fb8f0b516216a809a6599b5144b4c5828cf159fcecac46a86ba0698a6e5267610bad10cd7ce9079b6c691c2ecd522dbe3563074f2ac85712e58cca41761aa94449199a8b440016e68eb8bc9db3ff2c2bd9c64d9d3c71566bfb5d234af1a144859431f16ce6d65b4cc604e9cbf4e5539c192f07a2981b55582376bedc07aa20f5a841c9f500915fef353c37446511da3affd743fc551d5c22454797b3eb957770f1ca16da138c71bf5c00ab7893ae83b3f499a2c42f55551a986555925337e0604227ebf1c65312f0b1a8cdf2d06b5daf3e5ea97ceeb2f33421d0b44b\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (14 mod 64).\n# DIGEST: c081d0d09b2c9eb39a372ef4a7b0246a0956b0f9\nKEY: be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d\nNONCE: 41203f5dce998f8fb2eaad409ae02116\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f\nAD: 5891d77df660ed82933f62\nCT: 4d754c684658bcc89208bcd75f24dc8e18b70a28b8a2201535e60ab755fb20e1ddfa98742d257eadd02d96c6a65f880d058312311efdf67f9a106beff9f5ace0ac6af586aefbb5e8b4850e584bb7\nTAG: a9bc9bdf2c16ace8cd471c2bcfbc2cf933fc1886faeec62d4809ed5cc4dd4fcb6ca6c42f31bab300264b278dc0b10fe8a54005b590160b410dcdfa3db413dd04a72c897b262ed0fe4ad6683fc5229010f1d2bc939e61a2c9e0480ef3e03e90f74a3edd8bb523271adc45d097b197ca9034bff48677efa763e1ae7528d3f775f827b9c56ba7f042d7f9413b4c5d01972e86976ab3a398afae27faf3cd19ef1b24b5342f9d067e7702bf1ae9679540a72f7a12cdbfbac234d596856b3bfdc2190dff0b50f45b4355cfa25ebf8d1d16528fe6c4baf9b0e5a50f95c4091704e939c8ffe69183c2695ecb1f12f24fdf288a8e8bdf3fe510bae70c46d0214303d5503d21366c4eec24cc2808542a203d81789efbb6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (15 mod 64).\n# DIGEST: 6f7bb1f9e2772eb909c315e653e4737cfed78a18\nKEY: 8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41\nNONCE: 203f5dce998f8fb2eaad409ae0211641\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f58\nAD: 91d77df660ed82933f62be\nCT: 25bc47e58e7d4f3a417c95768699c92240a2be0e86232a41fe02d64f66716023996772e1118be48e685042f989dcd9cdc574614c9c3989f1885b4b71dfd5b1c32c1321ca41ca1e6ff1828e677e30fe\nTAG: c96a78b9ca68054bc1ed2a150dff9f9585174f343d3df80350982002b4c95106b72813a90028f2855faef235909686607f39655ec48f4024e170c9f9574b0c81b63c8df7af6b4d0f0633853a09c334379952bbaead7415125f541a01e320c5f5d9806b71c3ba71890e3229e751f25ac82c245596b5fa688f1b13844d91169354bf0cc03cccf576c2216aeb9eeab33e2a9f8bad2145d36cf0e7585a02296a7a3b434f4efeeaa4d7ed65befda32b287d9d0946e25dbc0edc22de871184ae8c76777528b917585be784d5e0674b1e5693d0b8cbe8253f8db67c879e1d2b7ddd5df4777a15509f813eb4d0f5a935aa011daaf0cc1ba2ebba9a20a74847e9c53b648f6fce4c08b6e7babc1919e6de22210a6f05\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (16 mod 64).\n# DIGEST: 172f4992e692a88f49628e5d3937959be01aed2e\nKEY: c55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d4120\nNONCE: 3f5dce998f8fb2eaad409ae02116417d\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891\nAD: d77df660ed82933f62be8d\nCT: f1ab85a35a17541efb4f906e7fc85e64efec6ab40d59d3da920c4ec09797c3ad47820e9d934e51e3f4d097c4a555575939bfaeb8cfea062b64816a160d6e4d1ff02a5fded435ab9aa2daf22fa7d676fa\nTAG: 14684ce099f4f0e11e785320debb89c79c03e8bb8751860d3779b4b553f6dedabdb23119d2866ad63fc974a6c6442b734394cb6705309a4d3889e90c4a222bbd14624cd89a9c3f904367c418140375dd592107f839ca94d43d09495a8dc8273201bd8f5a447bdf57506421a975ff4db3aab7878ff18e5b73c8f072a8d092461257d0182710ee9df9f86ac5ad321eac7ee96dddb27ecf561db222ed1c7c183c2ecdf4c7f57cf295638de3c4176ea244100d51c006282e98af1a8fd540daf0ca6f2fc0b88c550b4ab638760d95f2f9d09612da198616cd13fbfa1ad12a3fd30ac9956491cb11539a1be43175fb1452393f13f8d03501c89cf5962730125a7e185dc089b41124fc1e7f69b1fad46bd661c1\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (17 mod 64).\n# DIGEST: 00133da1f7c63fd5f0eec364e9a359be02c1d3da\nKEY: 5b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f\nNONCE: 5dce998f8fb2eaad409ae02116417dae\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d7\nAD: 7df660ed82933f62be8dc5\nCT: 5d6bfe91cd2273a9b986397a38e81be5fbbcd0403ef51873c2c467a9fbadc7bf540e83c538a43dc0e0ab780a4c4b1f5b77ced74f65b61f8b8b58b26fa3e8cba568bb717dc7071bf82dd8c68b068e739706\nTAG: 2ab9e654859c35e065f763d949d43c65dc85dc5d918850809ad8efaed6569d4b3ad064bef3427ae4c3be571fb914cefe2362169bed5b4c0cb17d2106fd6993d20ab8a8b70edb5f5d59b3357c8499c36e2b0b67edf7f334ff02d599031f43252b8d30d39affbd2093a6687c771b672329e14901ad9128f063267d3ab332ea31a79d37cb24ad0fd2d07f23b13d4643d1d9c529e1dd0490c851b0009fc1192f2438a48aba5a39be2ee925b1a38647197ead5cdea3499daa5abf9f4503d3581115a6847363348d5e7933948dce867752cde69ecc401012674ad75e12245dee86d775989275a5fc635c66d42c01b7646e180d28798905a3beb210c049be35b522ad580e1ca29f81b9469448749fce961ba6\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (18 mod 64).\n# DIGEST: 60a6821269be6c5b985576b245f106128eb0b325\nKEY: 436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5d\nNONCE: ce998f8fb2eaad409ae02116417dae0c\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77d\nAD: f660ed82933f62be8dc55b\nCT: 16e3c681ba1ece3bdbfb1da491f877e806ddac5f1ae96bc406bd195c9d48bcd4a9b700a8ced21d824bfb99eb057e401c3529818725b51e96c576e8009bfe4866e98f550a23ef4748ff761a4d1c44ccb5eba0\nTAG: a30286b3d06306818a268db0e5116abc2c7361c5a32d334d8ce5f4007aaeab750980018b435c79391151fdd33df2a97dc2cf62c4426ce45be43f7e4949be735bcd33f0e81cc6b5a3c2255fbac9ff5a8fd7e7b57554d7ef00640d92b605c9afb0c19dd5ca4c79c409d85c197e8f21d79e91df01a817bf68e8718bc771028c945471ae003c0a210c572b79d772560031b5d3e5495aa8d9bd6fa3f8ae9976ed7e7f8d7275030d2f12ed5ab05276ebebafcac7d0ca41f9d860583f800e4f1b9658b12fab31fd63f6a5e4b80463918f8295ae11d7b97f9b5f89b8166861aec8f1b1417163a6a8adce23ce66c9a4306acae7ca75435cbaece814d6010a3e335bd7db9783812052179d5337d1c353be6e0b\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (19 mod 64).\n# DIGEST: e2593f3b6741a9ed9fa188fc06efd057556ee624\nKEY: 6965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce\nNONCE: 998f8fb2eaad409ae02116417dae0cef\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df6\nAD: 60ed82933f62be8dc55b43\nCT: 9b51ba0eebf72bbcd7a1b8452a49f30bf2d96bf0cde4d9e5efe7f1903eb4e09f53aec649c5a8ad7e7fc6c28a0dcf4bd3556f4377bbf8b3f9c79dffa5978692559f732c109a7a02390746f5975d5a0aac4d04ce\nTAG: 636f7bcc9b0b5320643f4b6acbecd60a0a89d2511621ab47fa4c9af610fa1ff9c6cc5cb8fb64493d6a4dca0e94a90794f31698cb1c5bb5658e8b6a63a2cc9b2f1f297240d3d6c62087e32f5d5e9f9d608eccf4b41253933c7391983db1138012a5f5caa5abde25c8a16fc33cccb0604421d985f198c48552650f5dd299bf9163c136c042c9a35cdf7120a702bf460d739ab264fe1f58453ff4990f7315379ff074e01730e7cace8d45a5d0355c0acc409db8fbc759516ad56818b37700548aca769719937103787311b6dbc8488d9e68ee439cec3075bafb725f44734326df9b10d6a4f7133ba84489a9985febc96200276a1fb513f8a3c062466cbe63e7ad668cade7ea70c3b8cd040a6162be\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding ",
@@ -528,21 +549,21 @@
     "ef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c2\nAD: 7f4372480974454879c41d\nCT: fcbf4939de59426da2002fcb8e3a4d07604a168e9ffb5f13afcfbdc45325e3ecf0659ea736f9dbf61cec1dbed1024eff9e3bcb721c28d004549fd84e2cdeae36dc5e5abba4f0102835740bb877858814fa38290344addefb47ae583171a510719d9aa18c8f8a5e01396fecf1a982e162edf1047f56e8e4a839c5560473f389a4c7ea8fd5e03c7f2d31ccbc094f04e2a510aa57fe30f37cda765ddcd2bec89ab3f1f5f2ca423c68664c3303520c71439230116409dd84b4a26c1a102e521253ccd455793b0d883b1569b5013653b1c606143fcba7252a70d2a2026b989d1f67fdd594d2b33bde1bf7ee9bcb6c013ea8886e0ec1341039b8d8fbb4d865754a62d0e2a1151c917368e93fed0cb29e2d63ae176cbd95991db0a2864b27b6cf5782093bbe0ae117c7b2931f678bcb07aaae3d955b61e7ebbab8e84442295700cebf1a8f7d846fe788baa0660608bcbfa59c4bc9e5d163654aea99635f9bb63b8074478fc97b4981f5e5d35430b1e18332370dc5f4e94616b0270112dc446335d10a169e8a6923765647607ba9ad65c6f6f008cdf041af2e136b398bd1d1f67044f8360d9c1e90012e594a353d8e45aefac62173fd1b03ee5e4aa6961d83cbf1096dfa02f36ef62ceea5bf88f95301464d0046cc8ae3bfa611caa0c63d07\nTAG: 850f8608529bdc90c222092bfab0239a3b07b9cb1f\nTAG_LEN: 20\n\n# DIGEST: e654b4c78e1c0061eea2996fc126c9bfd41eb6d9\nKEY: 3b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b\nNONCE: 66262c0f0368fe9d0cb746bbd55813e8\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f43724809\nAD: 74454879c41de9ac9f9823\nCT: 3a35e98cfbeeabc993af7e952b148ceb87a110d851bf2d036e5eed8482b39b881b3180dc50ce782a8cbe2c586863c5d038fc4f37d4a96ce8732abb984ae90bbccb86f7766e9712e43d3ec40fdd7a1c88cfbf14743908c78dd4c19d449db7557e0c30127d35a49503d8dce6c9a9e6f07e1c86d7e365162ec05a8b4ed301645f8274999a6c5beafc5b27dd68608aeb2efdd9cb00c6236bb143e7d91709a3fea0e865330680a854d47ae3b6067002a01aec6bdab9e60c19ca66cc39d4a44ada1e21720bd5bd87cdfb31b8a9bfac77feeafc9f8e92c4131d73a3cfb64efae2e8d14fed99c2bc88f63f88079d30b78df18ac03db855338986c0fd1614dc6afaea71130290bf52270999f3392128bc48fb0a6d6425c383b637f4c293e177f479f6a2d6323ed545bbd564f743850a121da96256a8daf163fd80835558b21e0286cf008e7cd87bab94222fd7faa395ee2ba19aa3abf5d000e7514a35357941b97e4ef433c30972e995b0991c862cefdf79712cbd3655ceb43e1e5f5b0d3f5e275bfad98a667d997333d704e4d70acc488b6829d18d1263b841307d592f760a66761e800b4676d64546a1d8630d97218a7c5f555d4a90cf58eee4bd1e1fc0e15f8f64d336edf9ca00183169f237a924e7efd5a339f3cc1bb90b4c513bb9969ecdc9beb5c5\nTAG: b24af9f27ebc204aace6315a197550907bf6079b848eb1dca1a96192ee7c8107\nTAG_LEN: 20\n\n# DIGEST: 654b8591c7f0506261713e9ce7a6fd24a6b9357e\nKEY: 61792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f03\nNONCE: 68fe9d0cb746bbd55813e8d454817c21\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c4\nAD: 1de9ac9f98233b5a7379a5\nCT: 7e1b59c791aeef6577c7ac69f8624352b7c2c7d1c8b14a7a0daf8240cc9d71ff1298eebf18ab6d469e1a327bbc3bb539df445ddcf7dccacb54f0a4ce6cf18bec20101bcd62bb2b30d8426a1e3ba949dcb69767aab5b8d2228267d784bde55bf887403188cd39453d32d50428bb9846212e4bbd3843161dc830646ba6e251ffad5d1b382101c7a3c87163867391fe44a58639e8a29fbd34cce657d321d004f842e0efa9d4cf03f557bf07a1201ac36258a4810dc101c427e19bb79f0800f27732094ee1dbab2abfc061fd4a1e84b2d36e560a38465cd4c8bc04bc27ffe90f1ce5999fc78d9432ed98c8dac4047a61547b6205bebe2191782ca63e50bb29c9bea553f5de0e9051cef35e3122c00e0d3a2468ecb2a898225c5f65fae573b17a15e013655a2ddc62adfe61ce5a7e352539c6d27c9726d2ca5492ee25b6d8233e32383100d131abce97b33dfe18a415156917ead8fe854c53bde97c0202e782679ac46f05afe1b9ad6b41bcb65bc8a80682ea8092bba0c47a9a03d08004a11756d9274ff83d5d468475c8a4a56f81cd1367040a3f75fd998b5fb3380cf8c1630fdb948fa2d0930fa5b009abc755f4bf70a59847969500d43e2db40ee517c9a6826e8e3746b3d40f9a6e7b35362550cabfa601a887bfabfd28476b3d7eb8917d66bbe9d21bfebb5a\nTAG: 22e74d37769a86785c57bb760e8a28de7a7ca3207fef4e80c284b4\nTAG_LEN: 20\n\n# DIGEST: 1eaad32c8d0cefaa5e2c503bb2185a73e6387fac\nKEY: 16430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb7\nNONCE: 46bbd55813e8d454817c212d3a0063be\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98\nAD: 233b5a7379a561792c0f31\nCT: 26234359615c88fbbf5fddd43d4832a57bda2037e2177b264309e2e50c28efc28c5ed5cbf6dea046a14caa64d499352ecba0eb2d4bd376c6b1e14048033e21b9ec63f500a70c53be60099d9c9e46ea8f250d3d20c834c3c0638a9245377fe2b76b74ea14bca6b4bdc7e8d86ca59f397fe72b8c4cbb8edc3dca7f9f234529034fe5f1441210a8ad9b4694fe013f7e4a906fc400a27279f2a1a31700750e2209f6296ed808c893a42214b46f765c9d01cee46df18b02d5493c3a1da3a6258e89e47934ade4da2fa9eef7f5b1887a60585684b1c5c2ac60d94a62d79694b063444fa36674ecde12095e9203d281da3118d058f547ede5e4b67a11ab55c1b42fe01a94a601ba031c5b0b4088563344cc28d640bf2e7c81a259211b130bb9ba9ad93090c0e11cc939b99046fe7f25132672c3714f9973513af628f21942da6b459a60e31fe1bb9bf4f6259d8c9fa07d796a264f94d64122d186a0220d9f44b040396c9c187d5ad1d806ca613a4d0f5038a8b77177f39361f9107bea7700ba835dcd38cb48a6c5af0bfbb07b7a2543f1c661f1dec06acadf8",
     "860fa2220c67bbc9c97c44cb7cc58831563153149713ca2db85af46932a8de891da1d4662e52ed5b7c1c15d5557a0930c7177c2046b50aaf14874512cd9ed62efabe5704573a4f44a4ddf71202a6ea8c706842299\nTAG: 8eb60165231c67e88b0abd1d7c1c3dcab1b7006d4d3f\nTAG_LEN: 20\n\n# DIGEST: 862c0517b3658e9b9cd27db608d49e24e9b4667d\nKEY: a058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813\nNONCE: e8d454817c212d3a0063be26e0636617\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98233b5a7379\nAD: a561792c0f3116430e8b6e\nCT: 6f2cea3b4aa1b3ae78d31e47c0c1e03df944352b9bd5483cfc09577aab2095a0a7e977e9c1c6451625d85d162c1653423609f141aac93123b2a0bd093c5bcdd9a49b27ace4dbe6acb486446f437c27e619a0f69405afc83240f087feb029fdf8f3f25a8a262b4a3efc4bc80512a96a45cca61d46e42132abd34c2821e7ff588c742062c01eacf9d1689f11648ebe326a91fe79275b5b1fb2af4d1440ff4a9ad35381daf2a2c0aa928216351c5b89ea33bf225d34efd7ec2c81c5af325b138a5f4ac50c5aca196d1b32ce8352431a8f08cb3b59d2f8de5c850e2a06d00c1d7f7027b4aa6757eb0c9fd3035063669a5ff8db2402818c88a7137ee309ef2735dd575e43b7508c81306dc50da65aa2276dbcd98537636ef06d1736f14e2babbc39457dc8d101d22e5516d652151c2092812814e9f73dd6cc805e670ca36e62799b42bc07fa1d93b9332c43a4b759e53ae138fd2b2b419b21a332ea304fb7db57e860509855b2a540cc909aff57e1433f295e8052c7609a88170feb7623cee8ee651ae1dca4b1afa427e2e43569d5b7f2ea688d2e2afb33f1dc0666c4b0df8aee281cbcbf5e964beb3851f7b929e5a4e06766746f22d4fa1a32913c0f449b4da8aac6294348f711d4d75bca509516668944d2a162a53a31229528e54e4bfbe13cef013efcd6687e890d292e42119529c92c\nTAG: 76c80a678b6cd735a2d01acc18dbd90bc3997f57efc2c5c78c22fe4dd13f06fb91\nTAG_LEN: 20\n\n",
 };
-static const size_t kLen12 = 23568;
+static const size_t kLen13 = 23568;
 
-static const char *kData12[] = {
+static const char *kData13[] = {
     "KEY: a5060fecb0a738d8ff6dd50009a757c6e58db73228534d03f32c26baa1c209f402c3e03a6947c1d9421d63ce43f6df26d30ce783f5ed0d6b88edd389d9f92d8d\nNONCE: b52227e92203630a79ec7f5c\nIN: \nAD: \nCT: \nTAG: e61a28f5df7061b4236834d2034d2b62cb63c660b7de696c26b345e66b34d222\n\nKEY: d676047046bd5be9263ae39caaa0f688abb1bc67c083658894da6aeeff80b6d58ffc7ca1a1c88f49e629bf5544b2cc7669367202b158fce83fc4a4826dd90a7c\nNONCE: eabef87a00fd99ebb6ed6d25\nIN: \nAD: 83\nCT: \nTAG: 473cf728899cd5fdd54f18d6f934c3901f7ca118fc5ab2cbb837feefa7852a67\n\nKEY: 5eaef3b8e068fbb652bd37df4dfad6490095642cd49761a35476dffc2b5b5f75236d0351d96a9028660788893323a777ea8a2ac88bb5e500b334af02b1c2a648\nNONCE: 34d049342b9db5ffa039eac0\nIN: \nAD: 7578949699d44dec9188a7f7e14b0a23637cddb9107dbb1f8e2a968aad0443356d7eeceff4316ba7b2e8fe\nCT: \nTAG: 4d2612c21357638bada9290d2a272f10fb5f070337bf87bae396a1e7253633ae\n\nKEY: eb7b3d7eeb5f26010915a36837dc83da2bad07eba714566584bf1ce62fa9b61210b0ead7182bc28c8f0427699bf04786583fa32f3c3a8a6582cdc254930043bc\nNONCE: 3bee5ebcdfc72f4ab0023211\nIN: \nAD: efecb57e79a326c6b2ce0ae74d7656992a005fbb8da5a55b9595fc5348a5489ee2e69541ec0e8a727a560625\nCT: \nTAG: f457db1e274adabe5fc898fb1eb7c4a5a8e9a2b66f964d0958aa058c1f9e15ba\n\nKEY: 1c1abffa8a2667a8c1ab347860528162d316d58e3966050dc140fd360e6ff7c557520a8982aae97c5db5495d8951eaa485e1cac4cd8f448a13d071d759885474\nNONCE: 4fdce4e59bfdf5d9b57c78e9\nIN: \nAD: 55125cefc919379b3b4b2a24ee1794f44ac66fd99b8b68f98d4abd45ba50a5b76e5375d08abe3b8b8d3c576bc8\nCT: \nTAG: c021d2c73737e54ac6e7f61f9bb44818e5bdbf8d81d43842fd25a535790fafba\n\nKEY: 366cf53bc185473acf62610b74231e53aace84e9c5d6fbf71fc24db4f42956065d3eec01ecc72a6c89266565ff530075f4532c860e3192e866b41aee98c5c42a\nNONCE: 9ff54bd7b10f4fdfd8db76c7\nIN: \nAD: 853ef59ae873bf0bfe1465e9dd8c2cddfcf123d213ba4f599d984e4ea69d3c85a23508ec7941ca740a9157ca2a788e9b519291240b307d6c5a8c6860a96b4be698659d19e31ab0ac7ae6ba31dcd609c1db67ad580fe4422e42d368c3e93a56f2a087b0d587188462310c2ebe58ecfcf7178412223808eeb2eda76446168730fe\nCT: \nTAG: 12d869dc4bd4ac4ce9ed643cccda9e11a1ade65c76f7c1535fa4ec2bcc5eb4c3\n\nKEY: 147b41369bed390f0a9561586fd975474e3b3bbf7f7ebb7a35e5cc43b516c044dce93e154ac790a109709ac5299bb17b709a913d33fd57ebfef2b48ed66393b3\nNONCE: 85b81732d2863b41d2551763\nIN: 73\nAD: \nCT: bc\nTAG: 47fd81f6eed8d3c66afe06d788ffe40717847785f4b4c617d75a11171690a60c\n\nKEY: 9bf35c1194659c1da634eab6707c55b853c8f61d087187162e926adbae02f8bd4d15bae5b05865d0e2236d64715fc39f32e4e3679a0309396c37eab13d1c637b\nNONCE: 8da14a98ee741a5fce0de732\nIN: 10\nAD: 8e\nCT: 17\nTAG: b76af41002a946af4947f98f42a873b7da0871f482990a70bda8f005274ca179\n\nKEY: 0befac10caec674c9f23676d121f065dbcc8c91852dd5eb4e80c41076995a2138077592fec665954d21fd6787234d32d3d54bf9c220cf2bf018b374bde29926e\nNONCE: a96bfb49f3a136840a0e32ff\nIN: 59\nAD: 236adab55e1bb8a8db384c01bb2afd30ff35da71f955fb217b8305a45ee075e7f8d863d4c0e5dbe36e297c\nCT: ac\nTAG: 7bb634357e0835b02a0642352a834ff6598c2ded1af8e8ab60b9ef0641fe863d\n\nKEY: acc672aecf6f10119ee77070abbc2b4fade7e910efd1f93a5716161f88606469a49df05b40332b390d3ac289abfdf6bf7c37c033b1671082922d939139de0d42\nNONCE: af0f57b55f1a73794b3ce5cc\nIN: ee\nAD: f385a50ef027e532635878a4df0deb23369774be47c42f17cbd44925b668f628338ea5f8256c5ad8219c13cf\nCT: 71\nTAG: 13a5296075ef23216c2f2e83b940d24e8e1e6a01967af96599360f11499ac0a6\n\nKEY: 6195ef5ce3ee01188c48b04ce7a28b3ddd04b78711a6d1233121fc8ec3db3a7a0e496d1b6a416675b1e666b9a3df167efb8ade29e4f22fc77111f32ba8bd1ec2\nNONCE: 092070b2f8b65fcfe646f6bc\nIN: 26\nAD: 98526dba4437d88f657c0b7ce2a2be44ef4951711a40747a7d14b195e4c0eae97247256bba7dbd93d6a8f738c1\nCT: 83\nTAG: b6aad3f91a26a38245031d6a7eb97be0d386939d4536b2a27c90a2ddb891de73\n\nKEY: 40335487f9958dfc00b76ff06dfec162ae5c6be4e26918bd12e3f21760cb0bd364521a11f5bfae11dee989627525ab5295ee404bce476c280d13d238dea1bd40\nNONCE: ecf77c7c827a34efd8cdf79d\nIN: 34\nAD: f6e661254bf235c7d5b8ee330cb754087480dec5fe4c31dee65d1ab4479642101404bb563522937fb2e41d3aa8a4d269a222e6e0bcfd07ec4b29c1185f99fff7cb5bd2ca8c5b38742270e586c8db19138b446833f2ee07a11dae5b6a1a4c28657f3380e84bffe1bafeccad57d9cfea3da7f728119ec5bb18b79e002954f4379c\nCT: 5c\nTAG: f3420d4cecae2c1ad79d977abbe408045bd87525c0da2b93e0af3e6c53ba7d74\n\nKEY: bf32ef44c7ca9851f397e70df736d7e0e6243cfd875ebb81d76ad7612dbcfd084cab6b0d67c6a6e8b567c93fd0c3abb78ae121fdb3051a62ccfa045692d3453c\nNONCE: 46e0cc64d6e431c1efc2bd2d\nIN: 959348a8ad6912d7d6c8eae52f19b1\nAD: \nCT: 55e8cb6fd958f18b3c19451c5c79a7\nTAG: af09194071cb0ed4488d27e79700f938ce77386e5d772f9853b17b719f2b1ebc\n\nKEY: a6b5b8b051edf5cea0353ead88ea887fab048ef32f8303275e93d8f926da0d4b0e34b9447cf44fa70c24c9ab964380065398336bbb20be167fc6cd5e591ef50e\nNONCE: 371363612c4675a2e59ebd39\nIN: 443d16621b0cf9a12552216f9558ca\nAD: 32\nCT: b7f432eeda8e4b8a25f0445f17ca7c\nTAG: 649934922826febab4d59dfb52a7558e6d30d56e273602b98f3c55fd8e24f4da\n\nKEY: 075b75434269a3fcc57922ee8cc55b5bbe1b90516a3b71838ade73d41ed1d1f33ae1e0e86f88f6ed7e091cae3ccb05144b3ef239831554d6e79ff97c4d8f150e\nNONCE: 754d5c4ccbfb291133859de3\nIN: 62a151add825077c59459fbf82b708\nAD: c8db27487de71124a95eb6359270a8363908159200333b46ee74e2709b308878779686bd43c24e9ecabfc3\nCT: 2ffb9a9f65c9fe3daad13768ab56bf\nTAG: 4430a90fed7d4b5b2adf5a60d6854956be4feef497781ac7d864a04259e99516\n\nKEY: e787fdeca1095f2f2760a1c5e0f302e07d6b08de39ce31fe6a0db2f76e4626eb0968768ae04d37082c114573c307699707630b8c7ceef60abe3b7831d2adcd6e\nNONCE: 9dc9bcfe8b4e2ea059e349bb\nIN: 3ad57105144e544f95b82d485f80bb\nAD: 96bce5dcaf4a90f6638a7e30cfd840a1e8dbc60cb70ab9592803f8799f909cafe71a83c2d884e1e289cc61e7\nCT: e504109cdbf57b0e8a87080379e00d\nTAG: 1798a64b5261761ecd88f36eaf7f86ed3db62100aed20dc6e337bc93c459487e\n\nKEY: b43ab650bdd201cf05e0436afe89ac54867383f04c5ed2faea5db8e6784c720d905234f1f5443c550ca14edd8d697fa2d9e288aa58c9a337b30e6d41cfa56545\nNONCE: 4e3dd3efe527902b9de45a5f\nIN: e386663e249b241fb8249cfec33ac2\nAD: 3cf7a396e1bd034ea77a54ffca789f206f94263d90d98bf3e69cb42205fc5c95cfbd0481b0ec490ea447299159\nCT: 94aacf00092723e778d25ba78e9d27\nTAG: bd5fcf90b9532e7abfa858aed90d5170f08edcdd28ff2c673e0ab45b8c0a0f39\n\nKEY: b22a7c5bb38715025cd59cc0feed9ad8e51101200000168052b294fb1ead545a517dee636a7acd22b8283afb33d30adbe02c1c8557715eea7147f3d98a97cbb9\nNONCE: 3b4244c9ad9fedd3f10fdf7a\nIN: da79e1ed131856cec3250fde7bda4b\nAD: 4b77472ade3f06500169405b86a793d63cfa58f57bde0dd706f369b391142c2fa8a3e6345ccf0a9c29b2182f578e22f55c576f155a05be5e81997fbe06410034ecddd871e5ed94b5eeffc6dbd90a8e66449da01f8ef47d28a4a4bd253ffc427f868867c73b5c709b01732bd8035b1a23ff0a903def1eb136fc90d8b3c8279769\nCT: 5d8ad7abc047bfdf9d9cd0b0aaa53e\nTAG: 41d050d518d0e51ce16bc2920aa6c76eb8eabd4ed76373c59618c6354885f47a\n\nKEY: 04b3fd8126d65f851f47b3dea22cd6e32506f21effaa3e29820ac7825e01b51c5a2816f0298154f2d8addefa2fdc34c0635d4d6b80ad23eb320c4d4f2aa1de1c\nNONCE: fae1b1da40471dbdcec64d4e\nIN: 509f116ef7435b0640cf141d5b958aaf\nAD: \nCT: ecf553eba80e6dd1fae2eab24d772a89\nTAG: 11473566e80cff5d7421f65949c34301f34de378e91ad50928cf2caeadc466d4\n\nKEY: 413d154dadc7d8869e9e0f24b3320019a04b7a37620dd9e7aa40b5c08d70dea03c12ccf7faad7009e972680e81544b647650c6ff033f56e5bcdac9a35bd7f804\nNONCE: 6a4404adae3f4a7bd2bef95c\nIN: 3539fe02b75981fad4f8762772b3c11f\nAD: eb\nCT: 3f8a96905609a4ef1a95fdb87337503d\nTAG: 8ee076fd624d90e1f6336a92165e80408ca6f0e165b201547d351177c95e8d51\n\nKEY: ddc10df673e720c00f28fdfb69f1b8fba99696f23b6f29704a0114444cc0c8a6c8606e8d37fa95aabfd65b29c655678fcec50966c8758a3fb15332a1854a8eac\nNONCE: 06331613842b4af86c13f8a2\nIN: 55d74bcfc3d1cfc716c6e6b7153c6369\nAD: acc264344ae79959f9dd5130664273ba6f345c3fc7bc33c6c1ce33312bfbd5f181a3c7a24f15e7acf72ccf\nCT: 20650d9e846eb42854692d438b21d5e8\nTAG: 973857523e7ff600cf9bcfcc98403b34ab38d939a6d76716beac42678ca5f5bd\n\nKEY: be0c884db54cf761fc24ff3dd572362910dedacece5e1d93a916df277f923f78e7dcd908e60beb0043503c5b4877a9d962a7de37cacc7387a7553949b52894ec\nNONCE: 3f027a93e2716668c7634195\nIN: 1ba8f3a87ac6738167aac1491b602ddd\nAD: d06dd1b9360a68afa3de5d239b6d91d212c5c555567545a4f133bf5a3b0f26addb9379e1cc1cd690cd427c57\nCT: 3596cc50ae72db932dd83bbc8661641d\nTAG: 44a1834b1587d0f88e34137dcebbca059dfb8f65ddab18f338a8a30152167be0\n\nKEY: 2ee848726730c64332877a4f88ad7fb241a73b71fbee8eeb4d9d6485855ea32b487e03968e1a7b9e8ac8ab7fbd84257efbce0aa207aeefa67302d5847e0d9c05\nNONCE: 526b0a79b6359d133ad51011\nIN: a0c0477e8a9ebfd275b674ed33230d42\nAD: ded2f0f3f28aea28b17aa58d4b906c6a9b3078f97ffe95b7e161b0c3dbf",
     "66879bea7603a046da4945c802ac8b3\nCT: b1691c8275f12f7d9af85e71dde9dd5d\nTAG: 65a5742dcbc49295c4805387e0a15f986ae47e51add9389dfabb6468a6e83013\n\nKEY: f4a7c0e29ff510c034778e47bb30a468a92140a707936d381b1554d421af107c578e74c53ea08c7f7d93cf67612061359ae458408a9c79250f776ca4192016c0\nNONCE: 025bc10dc99346c4d0766a7d\nIN: d449a2e812429beb5c466d344f5b5eec\nAD: 304dbf9a59bfd33b777d8dec9dddce4c365e72aed851210eb964c1da18119bd13248266a67408e88ac2eadfc54def0fb57f23743d376b11293377565d253d2bffe0309f2946cb78d4e9536dde4691fe1eef9ce2dc916a773d06b42fe2b014e7974d4aeffce25a0902c9b44265e5d6d26809b5f24875e80cc13f1f8872b04a237\nCT: f366e7b66683f52586e1c363c15b7fb1\nTAG: e0e1bb733471f150ddce1b83f3fc2d88589d286ca052574b7f0735bb598362d2\n\nKEY: eb78ea626b219e12937057155884547cb7578718f569dc8f2b370c0fea80e7f0d0f5cb590f0b7341d20c775bcd6a3c818e23b6cea949cf99eb94a23a81cd2249\nNONCE: 75a10f16d429b809cf12b9ef\nIN: 6b0203316e8108ff01b12df91ba6644382\nAD: \nCT: 7ee07054f76471115be159259340c24391\nTAG: ab970669d1603767d588a93cf215673ad307244f9179f46fca56e97f64a5fbac\n\nKEY: 3221167926be262b7bd0591f56be6bf030365d45ab84a93a94ea41a5e07735b17245ad43787e8791e7ceaa0472b562ed17e3b609c66c868c9b08304c8bb328b1\nNONCE: a94d8417d2bb0323bcfd354d\nIN: cec81bac7b85c441b6261163d67921eb49\nAD: dd\nCT: ddd8860fa9e2e8087db30c9da1ec9f9487\nTAG: 26a3b9bc4d4cd802cc22e7647a19fc2a5092293c9f5b1c84bdab7245a6d8f4ab\n\nKEY: 4b16e2d62294f76cd2a6c8e0928279d9de40f0b169ef9465738cbfa064c520128ee89cf657da27e4e532d8c4709d992970bfc9daab2f31b3a67e53200d3d6710\nNONCE: e746d498b9031007332447f7\nIN: 16841e3fc1f53990d33f7ba525dab121a0\nAD: a785917bc9f3aaadfd170abe83bb30c0c5d595fc8b491d983131aeab1a7b8d8771f1a963c251976152dd63\nCT: 6bcf5eac15ef74cb8a706856f62eb5e8c7\nTAG: 9dc84b06e8ec8921be4bc7762e8cebb61a95ac5660022520f9438e8f77b45796\n\nKEY: ff2f5944111226df1d9a300533d3e871694fe15a418b2090265cd8c0111b249dfb7ee86bd9228f7ea5d89d8afcf10bf69942ee4c29bfa8409b63c00c2213629e\nNONCE: 477060f0c61555873bbeb225\nIN: f091891c43e2374c2755a88a11b04beb4a\nAD: f1323fd1ac4de9719dc5966dae45dd7b8ddbee3f8da4f4f4d5f25d06bdb8ebf57328dde76d0bdb9bdc5f6b12\nCT: e0d96f6f3ed0493a289d4c3b79238b9ed6\nTAG: 71276c05b52bab0063108dbf4e8ff57cf3e15079055a309d725f14bb86671ce1\n\nKEY: 1ce841bcf2ad8accc458a2d94774c3aa53a99e7dbec587376212101303ca2b42272a23fe28514be190b82e503e7772a3713800f4360fdb767e85ea5e1f7b8eca\nNONCE: a2f8afc5ceb5382882907630\nIN: 620fece1e843d1d0b5c5a541a6f615a81d\nAD: ded910647464d0fbb0a5d93ffb9839de3360c675179c5991ad3470285d79071436025111153628c563ad1b595e\nCT: 34431c3422e009373c50f3ee6c5b3fcc2d\nTAG: 6e4e8a3967307f47e233a36ce05a4826a698fada2ac19543bab7c9ac4f79451b\n\nKEY: 6bafd28a32690851fda667eb2d3c5993f13df52b2e97630527f26c498fd5019f26177a78f27c0c41616d2a4a73757fcaf9cd92a7da8498f90315d41e7479d90a\nNONCE: 75166c506c8e1d10da4da8b9\nIN: 697bea4d6eed5e6ed243cf01cc79bfd3a5\nAD: c0fa663961c3f7e09a8c7bc73e252a232977dd6c9483f02067b34fe695f341d05338ea2002952439ce08295ee5c12f38dafffeb5716908d3f1d4bfbf9eb0e4077bf8e534f19568ed04fca3bbff95da9088cb939f7a20cc97cc0994f9308e184219bf12c8af0d66df436c296ad39832d661b88c98cbb168c751719ac1383c9124\nCT: 8f37885b9602725385fd9a244ab2a156ea\nTAG: 7fa5cedd330887900f4a44d098e04d5eca16cf94e21f897fa54b0fc116b711b6\n\nKEY: 815786c7744d15afe1d6ab452cb6696fead8b88269ba3eb35c458f6248bad77b404acc744ebb74612c4f97deaccb99a7bcc6ad41917d61057c05b30c581dc4a0\nNONCE: 12342e4704f02336ebfc91df\nIN: 7f15e696b49ae5104ced5bebbf58a9d8ddcfaf46ddce9df88fe0d58a2f8546feeb83b975c66e4dafddb7fd9d17e80127e70af06b3b8b13c3390f1f50a227e7\nAD: \nCT: 22e7c5d54a7b622c47a9edb77cfe7c094e500b0ef9595bc346de736e0088e5934dc07160aea34f24d3ab21440878213d28059551cbfdaa418af40d344674f7\nTAG: 8c271ea5c15aa771c900388267efb2f435f001c2e83f4ec297e77c608de2d579\n\nKEY: 66d87d2b18e46257476456a1f87123424477decf196b88b09acfd3ca74bdebef4c98f1b93803098a141e0acc3ce8eede065417a0c1eda9b4614558d2383762b6\nNONCE: 1ec0ca1d3b09ef186ac4bb1a\nIN: cbb59e14098c2a8ab7e84ace913515c74e056e0fb272c7b88d0dddfb62e395afb695647d97d1071eb09cc1e1776b609fceaf4e30e92640379bb8f0e762ca9c\nAD: ec\nCT: 832804b8003b0ca1b4eff1dc4da6f6a9649e5a582854bb72cd74357476bf38d81ea3bc8ac0463f21fe37683bcbe07360d0ec2d7ab90b588adf669099303ac1\nTAG: 9fecafc768fca71ffe7d640dbb7a052d97d6c8e2fc86001d71feaf284ab609f0\n\nKEY: fbff97085351f4500e73190ac139dd3ac91e268042b5926b57e0394c750b10348b47641d195d5fb5b0846256ab229f102538b81e209db5d93b4d55f30c453d9c\nNONCE: d4868c918de2af7d3e3f57d3\nIN: 4f14aa5a680d66ae15ce0ce4739888f64d827def862572f9a6cd620badbe4ee9d75f4f9bc1f73d409f519a657f53a50d50e68e22f33a8ef5aa08b1212889e5\nAD: c41253e96696a948ce500030af27086842aacb79c04cc02a42b858a65c630065a5292bb9b2e69ea5fe5a7a\nCT: 08596ac0550574e352edc13d7e390d8fd0a57406dd61e1543066b4aa0ea06670f356e26ada0d6c61c1e41de1b4fd7a251c961fae44b23523ce227eec99a338\nTAG: 72f58de3e6697c8419ef518748fe0bb3cb930907c71b6d682c5e61068206d991\n\nKEY: c78c550aba82b571d39ce21d6ecf5e5f7c2a7bf921c6162c64ec1fdff4d0b8c41bfcea0e2486cc86b9ed9e9ceb73c4ec228a2ecbcfa0379174e76475cc21ae31\nNONCE: b5adf4de19980a71cb8ae8e6\nIN: 3d5e43ce95ff9d7f797f27b904c07291a35678fe76a9c57f0c0cba724f38acbb22c6c185db864a2a17b7ef2d67a04810ee5a45fd5a4e28a15a1ae16971451d\nAD: b5eeb9a18d436ada7bd5601944784f50fb0a989397b5c781a2cdf29337315dc7664f3c1cbf17f37fd0cc8b30\nCT: f91f1f20d06ad4480ff233480228994cfa052f9bf3038d06d997d31eb68bffa4960341b93eb5ed2260341e6816519c47bf231db2a41ad8a9719f4de6a33de5\nTAG: 6e5eabda421961e26dc17a7e1f750425235df4eaf9a97934c1e1b4439fc22791\n\nKEY: 17b90dec44546d9dbc489e55a01f2cc64452a9b0e50506a8ad7c81bc6fb21328285cafed901a7204048866ff3bd543003fdcbeb3e9e2f3d580f9062362879633\nNONCE: f0c0cb247d210031f9b233bc\nIN: 75b9b524cbfd1287259da116f536aff56112a406f069aa08f545b5372d45b66d7a5d05e02728c4bc2c779609dfe251386f78c5f48b9dad90b363d324826cd6\nAD: 8a604a9b06ad595ce0b9ad1644a596c7d3cde81490abc80840c764c40d6df08fc71d1e8196eae0802f8c8dfc24\nCT: 23ad62a668f942e613c3b5a7828142048f1f6a67f7f0e0cc8bf3fffb2d1dd967da472d080353dc9c23b900a566f20afb850e4a47688ee507faa6178fef2afd\nTAG: e9e82d3221f964d9e6c09d761afa3f05d1316d39c82618a82dafa23607bb40a3\n\nKEY: d5c09fe24201fcc3ad4c9a9c4b759345f643e930301c3714f62c8dd4974bb15a026b217ac637b4f0e8d6ef40f36be967c50aaea83b2e72df18eeb9576865f1d8\nNONCE: 9cfa0df1fe0910b33ee9849d\nIN: bfeb3d86ce3f4c5ccd0c3945e1da0e75dd057aa5b4e1f070593394f4a0227abedac0b77478e04d498506245b162e909cb711d8b875d33f9c4578e80a0e2113\nAD: b874a8523799554436a1174ab124677dc2ae2042a436c85065c50d5b5e7519623379ffed9a9c2b84b9626214b13c1806b65a432ba79066ff28ed94d17628f5ff84618593954389181e997ebd245d31f520539e250b31c86b99992983820f79e74aeaacb3a95e690e2841aba5a384d0333ebaa5d1fde06b4b8e3e1cabc6639459\nCT: afa649ea47db94936f89612ece681bb175664a97aa6faae5745f49ac9fcbfd4287b73cb58e8d8aa12eccf309182f075098f339db697fc60540481dad0cd82e\nTAG: 9909335130df0326650823de5a4f5b6f45e6941a6a72ceaf80ef32fe67363944\n\nKEY: a13c4654606f532a8df47c367dab1b214166e4f7188c20560831ac30ba5e58d316d29764e4c716ec0126657c926ba2e4541da062447228ae61340a951101b4a0\nNONCE: a2df3417ebb86bbb2f954939\nIN: f1954e59a319547d32e81f846e0c79db41c681166b43eb9c10458948606ced50a44df26fad5654a7c25d3fb52539cf25fcc1c11707c4b5aca7910a76e2374740\nAD: \nCT: 374726a4691f178a4c0a6f96108ba30c4ca8a30242c14e84380969473879d4a5de580fab4cf6ef6e465560a15028ba78a1a88f9e62322cb698b15ccce6ba83a8\nTAG: 683e5a3e61d9d9c8b170f1d4eaa4f74dcbecb1a4cb1551dc364bbb336d4e4109\n\nKEY: 0c1751677a9b7373e0c2ceab2c8e4dab50af22e2230be3187c21ed46069168d173c28a7474d8f7c3cab39401663405aebdcc474ce136e1fff9cfc520bfe17ca6\nNONCE: 38bc2efcd97998de1528b064\nIN: 8a3c6212240bdcb86da98f0e3ab3e9e78f7f61f0627ea088ab283e739a0bed5c360eeed26cea43ec09b4f3556049a1d7f8ef86abfd1118f9c0e34cc6eea4544a\nAD: 20\nCT: a1a9f7f4750be3d89fc4f25917f8ffa7dd462ce712ddf61792a01b1840bc8e428000372252f1b41055416a961db3be8fbe774f0a0a71a82e79e74927522703a0\nTAG: ae24708df0d5893a902765f6c6c2eebae0c11312936cd415bf4a74bb8498a367\n\nKEY: 154c21eb43d8d556e5f782ddd64d577ac8066fa172c2936fc2b2e875aa437f941819d9ecfaefa2e388fdeea81a0ece8dcb7647f2c68da48884aeb1315b577c09\nNONCE: e14d1bd8681373d41702a762\nIN: a2c880fcda87d9d4681a735a6790d93a1c9c68e55b87d5f7b3146665a6b2051398eb9895e1f5d522841668b9915633aa8cb40048c619baf6d63ca2da486cdeb8\nAD: b0b725cf634349ce1d3ac49d48313a09697efd9996cc5afd06b1d0817181d0374db05825dc2f08207bfb3b\nCT: 1cc0db5980863df7a40c78e323a78be6c6d556d4e3b5f930d8d0f2c6a10c6477e31c000d3f0563b4",
     "6e1a4aa566a4ef4b433e17e94c43338b51a7a3f862739b6e\nTAG: fe005424112de2a5ca6e68ada40984df1ae5ac666cf5fee19e9a0f203dd69f52\n\nKEY: c34482341724ee431b5272ee2964b245d7657778f7927cad4b5a1bc30a176b1eb88a83ac9faf58215a72855edf94f8e86fade58c5b5907994bb8381c9f21b753\nNONCE: 4934d9afc32fc7e2d8851594\nIN: aa3d32adc47b0b84d1b038ddcaeb007a7d5c96cc06a943eba5da6d0d367625330556e67da099c84086b3f46bb4b72986e076eb426913e415cd20bee34e434bd0\nAD: 076a7bc587b306f3da3ba88e66a55cb8125bbf8aa000dda266e950f381e35ac938ac86f8a15a83022a25f28b\nCT: cf017d87da8927e42c1f10fd3d73cf483bae43f4e110363159a9fbb7cba363930a0364cd42a5de2c70171edc4caf15bfc7238f7087bf1402b32c7bdb1f493393\nTAG: 3961efea656aab1b83082522b801fafdae346f7d4be70db1981283f323e5b5dd\n\nKEY: 363e10d8b3fe349014d6222761bba7af86545dcd1812fe2e5ada564c5008f8ea1850f374208e87362afa135f20f9e79dd0ad32f86448263416086d3afc5d37c0\nNONCE: cc545928edd3b21c0e8bc0f1\nIN: b68e3a54d17dab6eb41b03de2df14e792201d78a9c1cbf341da421da82b026ff471d4305ede5c6baae162a098c73da5cab93f30d6d540b4eaa0ee772448dade8\nAD: e21498edf4e25ada2dd6a382eceaf737623e501db34f5c5bd5c963f45818b146a6e45aa92db2a2069e55d46a4c\nCT: e4920c1fddb5dfed2268781fbb17e9ad2ea88bf2a0f116fbb7b309b25a5b9f989e1abc334999ab175b65f87e874d8ba80792044b458dc27d2b24c989d24385e1\nTAG: f0dcfa064cdf042e0b9a0443d634c38695dd09b99dadc647195fc2ad53dde547\n\nKEY: ae93f58aefa94e4e0622f2e962529fd2efdab840fd0bce62e163ca0fb004ec3b22e246073614203d9b63fe2842ef5903ed08b3e52abf7ea18acbe16fa8f66368\nNONCE: c9ac237c87270f2d88b91b64\nIN: a75f49778a6c03b0f8915f5d09efe99c5f4e9cd928713882e6b9b78bab3541812db41792b893c7e2259debc6c660ce708851912a5b9eaf91416d86b5de114ce1\nAD: a4b198a329e9c5bb6d9f31a6415811eb33c79422b0db130b78d788c38c0b9a5122688cbc50fea811afa20789465f9ee4362336cc3701ece701179af96eb7c86d5a00ed8582f24364393287d5dbc3e83a82b7a585cee5b152b5da40aa45ccd46dc841004778998c7efe9eb43c9762d1c8581eee64e18c5a961bda5aafdd5cfec8\nCT: 453fad9395106a703ccbfe811bf775f1827ea960c71d79242d2ea0e3e31b14baa76eb6d107dfc6e484f4e5146f8cad5b389e4c0fa18260c96a193edbc8091a36\nTAG: b67082c21557b31392a9821fbce4b93706f96856d2581c92e7fb65dd2166624f\n\nKEY: a145adafac46280e1cee8696903c5f3866540f27f17a519637373d95dca4ac5ac0bfd85ca6e1f8df8ae3fcfc9158421581669db52c20a3e19c5d251952f63218\nNONCE: 90bd43611f235ff225b23208\nIN: cbe5f3a5b7a94b8665cac1a4d173a225679e1a3926d8596b5adc0ef4fd00f7d93a432ff141cc04f877be60b6a17fff40ac845a91bcee3b483862f67d9a76ef498ce5e49c361bfc018e401aff47b397e96b2982d4fdcd043ca09905be9634e83dc22a667c955bc992ec96ca1b76f73631767f64fc7151284d5aa81c1aa42eb3aa\nAD: \nCT: 604f718dbce17dfca1fc5e0f400151cb65bea9d7d8f26d56687a76a23f89201aab01ef928006d15493f5b1501bb99c517cf123acd956ab575e687298488a88d5739c266e67ca6a20a5dbe5f5f27ac778816f04e7b1764cb716477f3aa01482cb6b25fe034ab5d942013164aa124608cacf13d6cc9487446cfba54315fc6bfc42\nTAG: 8e3e1a01945bfd9e1aa4eff1cdd0a6da6d8fdd5446e6d732a673effe8e44d76a\n\nKEY: 63ac8e2561341587bc066c87cd23f7f33e6023bdc1521a91d6ce63d3ab213825d95d674928b56da1741aad8e85a8b703239ad74e0304ad555eeadebf4ae30aa6\nNONCE: 4f3073c3b780ebb146e136c7\nIN: 7f9a05b1aead29b4d5361c2606e5db8a48122858842679cd46f8386ef9359f998cd2c6c266791429624ff634a160d08faf1523b650c30b2fcd71517da5f377000251ef23cfd2510a0630215ad45fa6d2313f9add040a07df8259b82d3f29cf1ab8477cd114c9ee579d3e2ce60c5da2f3375b68b4d6e0913d39dac9399c00bd32\nAD: 22\nCT: d4ed811c8db932348e0c311e9278ef22f22cec8af88b3ac0cef77f13bbd9b8cca037c1ea87590a0ce3f3e7b3ffe1dcc4c7cd9e721baa5f126a3e0afb26dcfa02bf44428846c0f1e07ba0e026c23a39877de1e69e16a2766ff4fa3d4e8d3a97ba28f407f459ae3520dd840e8f9e149ea582048dc6e3d0227bd86a9c26ddd59895\nTAG: 0abc9111229bcb725953d139a2dcb1aa0cb9d3d6c01ef4733482dc5edcc88958\n\nKEY: 355454fbe12f125edbc13550a7494f37efbe12b843058d29f892e1524289c2868ef0050a75a232d3083c381289e4950e352d68d64bf05f0608d694763c36641c\nNONCE: 0a344bb3da1c4260f2daf256\nIN: 362e97f8ef09f30e5db2f21d40568d347d9bc42d4c94a563484b12eb109886ccfd2c61c40dfe93eb836bb6aa4f828e77c137485da2df494cbeb6a9a0192c3777b4d7a927fba11a8eaf604b85a81ac4719ce8b595a74656286fd0b80d1ad3f3393e6038b258af97af9a77f6760d486d9caf5a451ba26dee51bda0f76d75bfc26e\nAD: c7c2e8196f37185b44515480d5d9451d79d07df4c1256bff6382f942727ce9b3a4f81ae964d8af2cd9f638\nCT: 32a67922947fd6b1c1bfaf3e1d41397173b97095e55307cae1c574daca275778d4aa4313fb1fe5b3997ff18800903ce044c7d0976abbb03b6cc1f7498d8b56d00672bd74f7cb152b677c632ef7a6f6fc13e95e82b6e35d663eb47f27c229c81174fd7c62c94c414e47216af2580fe822643e54907af77ae18e903fe856a02173\nTAG: 72d0fe5baee8090c5f8e79890b77f6d72a4213a7d1a81e0d1f1c9e6731e44d54\n\nKEY: 664478c9d30d2cbc39351ec3b3494f3edb81e32e48bd4ef05969da07e770e4181a9ada3b2f83b46f40fc2d9ad35fd8ee6864ff3d70436d6cca3f8e0563cc3b06\nNONCE: 7313df9679181ffad2972a6b\nIN: 142f073f2ce443c68822f120b5009e39bea3453017dc04c1b091adfddcb2a7e361c2b79eab1bf0818bc86e9d7964834d3775698b56a11ee07a0c9c03cb7bb895bf1a1dde3975c3662d233052824f1539f58cd6ad5cadb58fecaf2b34935ff711c45a639d642fb8fc3a52929b1296683bb13e67f2cc8ed9090126cdf28a4395c6\nAD: d0d78b94505793af546912f3780699dd72e288c775bfc75da6e306defcd868f6d40c6d6ce34fab9c11574ef5\nCT: cb913e40ea5dfe76beae612e9732d23ce352789987134822b2324db585179bf90d0ee20bee102e93a49a55fc978d19e99ba316cf8d9a10d2f2bcb75da4b135d1fcb8057edc33a180586015d8829a128f8fdc87b72497016c280f54f4d974c2c7e9d32ae137eaa1bcb670be237269fa73c3a0f273da9e70d89600ae7c231fc9d4\nTAG: dcc158c254ff7e131ad854a2158d51c643c281dfd7df342d5481384ab236a685\n\nKEY: 409d1b4e1c187c8b1c053e999f2af648583e1045d56d553cce9270d08c5643ef365eb35e3bdeaedcd164b0122ad185e71c75146a9807104d9b65b56d9bc1dc55\nNONCE: 1cce3f08a5aa5824d063a6f2\nIN: a255239e4065f3effe6aa5e88814d516236d016c51cd8eb35af7cee86418966559802f8ff7ac39c6a45acc1f1b18cc28d7cc32ae66dff43289fe44c3a2a72fbadf3a7249d76c1ba9671dfc420ddf513539f2da5f31030f2b6775c57432c2c3486621d841e80dd4894229debc12ef47d74716838f2d807e208f0fdaf733bce76e\nAD: 8f34f8b676e71844841c6a7b63fef1ad3061f2449c1044e1a281595da2d9e9fd141aea7350bd8cf9774d375e67\nCT: 969fc2c64261db415e51eee8cc5e0cf5185b8e3325dea516a70e32115a5b72233a44458c40f2daff3594d71e42ca2e3fc1c444ce171d22ef40009d798456613fa4b76beaa6d469e235997a302ac468c8bcfb8ef5de5cda58d7e554a9eab6cb568945dc37f28b0dbd674c083dfbd2e42fda1b42d0c1966e9652a21b32af71e2d5\nTAG: fa0789a83c255412501944a67bdceaff3f01d9a23b0c749be38abc956e2acae6\n\nKEY: e6fd8144cdb305bf9e62a2c901764c62902f354409d8c5b9c8cbfc0ba8ac7d0859ff8994e573e46784395d89c355a91a313f601b56e86ed3fd10ba428a5481ce\nNONCE: bae080718d3e5c5998542f15\nIN: 2258ffcd6fcf91b1723f8db0047525d61cc8ffc440acf3290690685d16384292493807312b7dfc23ac9d9c3ee1405baab21a3770a05875cfe325268b65fc877463e3208c842ea4a32cf144cc46d57afd91f6b6b5d85fb2dedb0702f0c4e7f742cf4c9b4aec02f07267ec1f7b96a5a3ef25f6c1b4c27bd829e86583e239cd854b\nAD: 51ae57749b7757718aef9b9c47da5794659516e7f98bc80e6c18c89253f8617963331f54d4f009f087d1d2bd69a083f3a4b98f2a51ce24ffc6079774f7c7b01638b6131bfccebe21fea67bc839c259a50fcc0a16a69ada3c5adee4097d9e053a03266cb9b4b39ee2a465ec1aa058e61a0b9888b93bfcfd103f91ca3a7b274a10\nCT: 5b2fe8eea3313cc04d5ec75d75d05b3242b6e3b65c6fa1761716780c9529ff8ca523096dd037c5bda27984aa93c702ce9c01c63569a90657cc6373ad5d4473028b7eef69dd79c44c38d0063e8a8b7f1aa2bf6b646711ecd4eea3fa27408e089d9c4c4aceedff29a25baa6a9069eb7eac83a53212c0b387d700547c46cdc525e3\nTAG: 60319de093aec5c0bb8d5f17e950b0f4df0dfd20ad96490f6f12db461b2a4a84\n\n",
 };
-static const size_t kLen13 = 2511;
-
-static const char *kData13[] = {
-    "# These tests are versions of the tests from the corresponding AES-GCM test\n# file, but with the nonce appended to the tag.\n\nKEY: e5ac4a32c67e425ac4b143c83c6f161312a97d88d634afdf9f4da5bd35223f01\nNONCE:\nIN:\nAD:\nCT:\nTAG: d7cba289d6d19a5af45dc13857016bac5bf11a0951f0bfc7ea5c9e58\n\nKEY: 73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e13a\nNONCE:\nIN: f0535fe211\nAD: e91428be04\nCT: e9b8a896da\nTAG: 9115ed79f26a030c14947b3e454db9e7a330a184fc245812f4820caa\n\nKEY: 80e2e561886eb2a953cf923aaac1653ed2db0111ee62e09cb20d9e2652bd3476\nNONCE:\nIN: 96669d2d3542a4d49c7c\nAD: e51e5bce7cbceb660399\nCT: 4521953e7d39497e4563\nTAG: 2083e3c0d84d663066bbe2961b08dcf75daf201589654da8884c3c68\n\nKEY: 31dbefe589b661af00a6fbad426e013f30f448c763f957bbcbaf9c09764f4a95\nNONCE:\nIN: 908bd801b70d85085dd480e1207a4a4b7ef179dac495a9befb16afe5adf7cb6f6d734882e6e96f587d38bfc080341dc8d5428a5fe3498b9d5faa497f60646bcb1155d2342f6b26381795daeb261d4ab1415f35c6c8ac9c8e90ea34823122df25c6ddae365cc66d92fc2fe2941f60895e00233b2e5968b01e2811c8c6f7a0a229f1c301a72715bd5c35234c1be81ef7d5cc2779e146314d3783a7aa72d87a8f107654b93cb66e3648c26fc9e4a2f0378fa178c586d096092f6a80e2e03708da72d6e4d7316c2384a522459a4ad369c82d192f6f695b0d90fcc47c6f86b8bbc6f2f4ea303aa64f5ce8b8710da62482147bcc29c8238116549256a7a011fd9c78bbb8c40e278740dc156c2cc99c3591fec2918cdeb5240fb428\nAD: 5a32d7044f003b2ffefffe5896933f4d8d64909fa03e321a1bdf063099b9f89752d72e877291d8da12340c5dd570d7d42984ffab5177824fc5483b4faf488504e6822e371dca9af541c6a97312b9cbf341b4198b0902cd2985ac10a8b5b5fe9691bb29a88344f863c980e4e871a72a8b74f92eef68c176e9d2ef037898ff567298e186af52ec62eb7429a8004ac46b945678b82859396d36d388ec3d67653aec35cf1da2684bbc6c78a5f9e3ce1b355af3b207f64e0fa73501c5d48a14638d0906c87eaa876debcf1a532c1475d80ed3d4b96458d2236eb9f67988863bc6d5c16b96b93d898683d248d7bc601b5035fc365481b89465e37a8f7dd64635e19a0282639cecde72c6b1638e0aa6e56f9c00d031cdadc59ce37e\nCT: aeab9db30a579ca54195e54a9e6c787f40100c6d12ceee35643f36ae45f618cc9bb66aa4c0fae0ec2686cb4101a5b23a46877460c7e020b38b0d8d1f533ecfa99df03d346bc854a578276d7d5685ad1fb03655683a64aae4159c9efa6781f053057e0811226c7c533967a94587f4025353b28cc3a2ce5763783b4c31e7818b8ad9195bc03be8f294f9f6ceac578f9d30b22b1f5a68d647d46cf6db4a9c3a8a5c06fa97c9efb4578f501ea96db1f40942e3f24c44a7e4070a6b931c39947d9692930b67767357015de51a39e46fff94b6019e4bc1ad9d216a571ba0dc88859c49d2c487ca657384e49b4d382d86a60c8d5195320909c4e82fc077a3b22bd4eccf0f067e66ec78eed642b2d16f0f304f60f1d9ba69e205c982\nTAG: 17ca09e3084504fc22e914ee28312c8e147fe99bba0f606c57242314\n",
-};
-static const size_t kLen14 = 178545;
+static const size_t kLen14 = 2511;
 
 static const char *kData14[] = {
+    "# These tests are versions of the tests from the corresponding AES-GCM test\n# file, but with the nonce appended to the tag.\n\nKEY: e5ac4a32c67e425ac4b143c83c6f161312a97d88d634afdf9f4da5bd35223f01\nNONCE:\nIN:\nAD:\nCT:\nTAG: d7cba289d6d19a5af45dc13857016bac5bf11a0951f0bfc7ea5c9e58\n\nKEY: 73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e13a\nNONCE:\nIN: f0535fe211\nAD: e91428be04\nCT: e9b8a896da\nTAG: 9115ed79f26a030c14947b3e454db9e7a330a184fc245812f4820caa\n\nKEY: 80e2e561886eb2a953cf923aaac1653ed2db0111ee62e09cb20d9e2652bd3476\nNONCE:\nIN: 96669d2d3542a4d49c7c\nAD: e51e5bce7cbceb660399\nCT: 4521953e7d39497e4563\nTAG: 2083e3c0d84d663066bbe2961b08dcf75daf201589654da8884c3c68\n\nKEY: 31dbefe589b661af00a6fbad426e013f30f448c763f957bbcbaf9c09764f4a95\nNONCE:\nIN: 908bd801b70d85085dd480e1207a4a4b7ef179dac495a9befb16afe5adf7cb6f6d734882e6e96f587d38bfc080341dc8d5428a5fe3498b9d5faa497f60646bcb1155d2342f6b26381795daeb261d4ab1415f35c6c8ac9c8e90ea34823122df25c6ddae365cc66d92fc2fe2941f60895e00233b2e5968b01e2811c8c6f7a0a229f1c301a72715bd5c35234c1be81ef7d5cc2779e146314d3783a7aa72d87a8f107654b93cb66e3648c26fc9e4a2f0378fa178c586d096092f6a80e2e03708da72d6e4d7316c2384a522459a4ad369c82d192f6f695b0d90fcc47c6f86b8bbc6f2f4ea303aa64f5ce8b8710da62482147bcc29c8238116549256a7a011fd9c78bbb8c40e278740dc156c2cc99c3591fec2918cdeb5240fb428\nAD: 5a32d7044f003b2ffefffe5896933f4d8d64909fa03e321a1bdf063099b9f89752d72e877291d8da12340c5dd570d7d42984ffab5177824fc5483b4faf488504e6822e371dca9af541c6a97312b9cbf341b4198b0902cd2985ac10a8b5b5fe9691bb29a88344f863c980e4e871a72a8b74f92eef68c176e9d2ef037898ff567298e186af52ec62eb7429a8004ac46b945678b82859396d36d388ec3d67653aec35cf1da2684bbc6c78a5f9e3ce1b355af3b207f64e0fa73501c5d48a14638d0906c87eaa876debcf1a532c1475d80ed3d4b96458d2236eb9f67988863bc6d5c16b96b93d898683d248d7bc601b5035fc365481b89465e37a8f7dd64635e19a0282639cecde72c6b1638e0aa6e56f9c00d031cdadc59ce37e\nCT: aeab9db30a579ca54195e54a9e6c787f40100c6d12ceee35643f36ae45f618cc9bb66aa4c0fae0ec2686cb4101a5b23a46877460c7e020b38b0d8d1f533ecfa99df03d346bc854a578276d7d5685ad1fb03655683a64aae4159c9efa6781f053057e0811226c7c533967a94587f4025353b28cc3a2ce5763783b4c31e7818b8ad9195bc03be8f294f9f6ceac578f9d30b22b1f5a68d647d46cf6db4a9c3a8a5c06fa97c9efb4578f501ea96db1f40942e3f24c44a7e4070a6b931c39947d9692930b67767357015de51a39e46fff94b6019e4bc1ad9d216a571ba0dc88859c49d2c487ca657384e49b4d382d86a60c8d5195320909c4e82fc077a3b22bd4eccf0f067e66ec78eed642b2d16f0f304f60f1d9ba69e205c982\nTAG: 17ca09e3084504fc22e914ee28312c8e147fe99bba0f606c57242314\n",
+};
+static const size_t kLen15 = 178545;
+
+static const char *kData15[] = {
     "# Test vectors from\n# https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#appendix-C\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: \nAD: \nCT: \nTAG: 07f5f4169bbf55a8400cd47ea6fd400f\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0100000000000000\nAD: \nCT: c2ef328e5c71c83b\nTAG: 843122130f7364b761e0b97427e3df28\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 010000000000000000000000\nAD: \nCT: 9aab2aeb3faa0a34aea8e2b1\nTAG: 8ca50da9ae6559e48fd10f6e5c9ca17e\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 01000000000000000000000000000000\nAD: \nCT: 85a01b63025ba19b7fd3ddfc033b3e76\nTAG: c9eac6fa700942702e90862383c6c366\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0100000000000000000000000000000002000000000000000000000000000000\nAD: \nCT: 4a6a9db4c8c6549201b9edb53006cba821ec9cf850948a7c86c68ac7539d027f\nTAG: e819e63abcd020b006a976397632eb5d\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nAD: \nCT: c00d121893a9fa603f48ccc1ca3c57ce7499245ea0046db16c53c7c66fe717e39cf6c748837b61f6ee3adcee17534ed5\nTAG: 790bc96880a99ba804bd12c0e6a22cc4\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nAD: \nCT: c2d5160a1f8683834910acdafc41fbb1632d4a353e8b905ec9a5499ac34f96c7e1049eb080883891a4db8caaa1f99dd004d80487540735234e3744512c6f90ce\nTAG: 112864c269fc0d9d88c61fa47e39aa08\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0200000000000000\nAD: 01\nCT: 1de22967237a8132\nTAG: 91213f267e3b452f02d01ae33e4ec854\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 020000000000000000000000\nAD: 01\nCT: 163d6f9cc1b346cd453a2e4c\nTAG: c1a4a19ae800941ccdc57cc8413c277f\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000000000000000000000000000\nAD: 01\nCT: c91545823cc24f17dbb0e9e807d5ec17\nTAG: b292d28ff61189e8e49f3875ef91aff7\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0200000000000000000000000000000003000000000000000000000000000000\nAD: 01\nCT: 07dad364bfc2b9da89116d7bef6daaaf6f255510aa654f920ac81b94e8bad365\nTAG: aea1bad12702e1965604374aab96dbbc\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nAD: 01\nCT: c67a1f0f567a5198aa1fcc8e3f21314336f7f51ca8b1af61feac35a86416fa47fbca3b5f749cdf564527f2314f42fe25\nTAG: 03332742b228c647173616cfd44c54eb\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nAD: 01\nCT: 67fd45e126bfb9a79930c43aad2d36967d3f0e4d217c1e551f59727870beefc98cb933a8fce9de887b1e40799988db1fc3f91880ed405b2dd298318858467c89\nTAG: 5bde0285037c5de81e5b570a049b62a0\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 02000000\nAD: 010000000000000000000000\nCT: 22b3f4cd\nTAG: 1835e517741dfddccfa07fa4661b74cf\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 0300000000000000000000000000000004000000\nAD: 010000000000000000000000000000000200\nCT: 43dd0163cdb48f9fe3212bf61b201976067f342b\nTAG: b879ad976d8242acc188ab59cabfe307\n\nKEY: 0100000000000000000000000000000000000000000000000000000000000000\nNONCE: 030000000000000000000000\nIN: 030000000000000000000000000000000400\nAD: 0100000000000000000000000000000002000000\nCT: 462401724b5ce6588d5a54aae5375513a075\nTAG: cfcdf5042112aa29685c912fc2056543\n\n# Random vectors generated by the reference code.\n\nKEY: e66021d5eb8e4f4066d4adb9c33560e4f46e44bb3da0015c94f7088736864200\nNONCE: e0eaf5284d884a0e77d31646\nIN: \nAD: \nCT: \nTAG: 169fbb2fbf389a995f6390af22228a62\n\nKEY: bae8e37fc83441b16034566b7a806c46bb91c3c5aedb64a6c590bc84d1a5e269\nNONCE: e4b47801afc0577e34699b9e\nIN: 671fdd4fbdc66f146545fc880c94a95198\nAD: 874296d5cc1fd16132\nCT: 9209cfae7372e0a3ec2e5d072d5e26b7b9\nTAG: f3acb73908e54cddf7be1864914e13cf\n\nKEY: 0b6920ce07787f86743b275d1ab32f6d1f0434d8848c1177441f195495860f04\nNONCE: 6787f3ea22c127aaf195d189\nIN: 4728b3fed1473c528b8426a582995929a1499e9ad8780c8d63d0ab4149c09f572c61\nAD: 4b4745914474e7c7c9882e5386fd9f92ec48\nCT: 8ad7deb4be91cdc4e75c77de1c746d816212b109c5a485c6cb79e3005d2e94355104\nTAG: d71002b6a9de0addb173f49e34edab61\n\nKEY: 9c8fde2be2cf97e74e932d4ed87da44102952ef94b02b805249bac80e6f61455\nNONCE: bfac8308a2d40d8c84511780\nIN: 82355c9e940fea2f582950a70d5a1db2316fd568378da107b52b0da55210cc1c1b0abde3b2f204d1e9f8b06bc47f9745b3d1ae\nAD: 06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb\nCT: ced477a00135f16006e100b9d7521f9e1bddbc7d339cc41333abe3cc79dd8e3a18e310dd1dd53ac664673ab9090d5dc07b4859\nTAG: fdfb01ef873060efc7c3c32adf3b46cc\n\nKEY: 6de71860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f\nNONCE: f901cfe8a69615a93fdf7a98\nIN: cad481796245709fb18853f68d833640e42a3c02c25b64869e146d7b233987bddfc240871d7576f7028ec6eb5ea7e298342a94d4b202b370ef9768ec6561c4fe6b7e7296\nAD: fa859c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac73c535de1\nCT: 01fcded8e89997d446236c8e3a77ba755b85b9b5ab8fa8f355be587a3954c4a4231a7c8c198b72525ce4304125a4dabd1574453437f6584790d8cd90d5957b0d5c804a6e\nTAG: ecb5e6b6e75d241c221a2f4dbd7d0448\n\nKEY: 92eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23688089e5\nNONCE: 5540db1872504e1cced532ce\nIN: 4159b035277d4dfbb7db62968b13cd4eec734320ccc9d9bbbb19cb81b2af4ecbc3e72834321f7aa0f70b7282b4f33df23f167541ac15c8417abaf17a282ac7a57252ff224ae7911a905b8c699b20e40c1e9569a6b2\nAD: aa0232d4b10bb6f20406135861c19795b95f9597f9b72c20931c41164f1b469b0901f2b5da3a956a6e278c940e\nCT: c49082d9a1bb49356f1a9b75b443832a56387066b617b939b60381db47711bfd174324e8d20c9713d562fb8f5c698dab02b5c00ecb652c182ac5544648599fd7fdd042009ed44961efd975972ae3c9aed8a4f58ddb\nTAG: 75639e5472bec58e96b358cbe429c4ac\n\nKEY: 82593eb58f56f6d3681fb00dedf7f612c4cb3193b73ab35f9a5a9cc8d13aa27f\nNONCE: f1dea3b2a7d832ed8ab959d8\nIN: 2ee795df8e1ef530cc6fd9a1f10543b44c49383921d74fe0c71d50da4adb9e9c7e5491a488ceb5c384ebafadf0f484fae982019a8ea22efd1358adf7ad4f5fa0d2acd2f1ee095cdfc13310241243fa53b8c2610d1924b1d55cb6d9cb6a5b98a72127255967b8\nAD: ff23623c5453e61cecf9e624e5c803250c382481d3c10febfa54d03894ba8f9ed72637fcf5631f7b7312cc74e6ff63ecb240349a575f\nCT: 6841f9ffed11d165b18917ed0aeed507bfdbea3a57beac2f2e08625e9929d3f2d84373ac3b21813f7dde1b25c93129b541fc640e09f5233cd9f0587edad70b73c423011cccae55a9deff9f29308fbdfc9a73f5fff4a7b0ad308ca9b545223adcf724d3d8b127\nTAG: 479bf5015121d25bf2346429a5c569b4\n\nKEY: 2cd817f2afbaaf21815bf08ac1e8f87520244b4a3fc492c7120296607ef64d0a\nNONCE: db4c74b73839e13455fd91dd\nIN: f7f81d460034b9c41eaf0cc6040a84e17e6108372f1ca50656793554ea1d05181310711d0e60d4d556b2bedb24d7b622c01fe8025119ae0c8a20b679dc40c9908f88fecfafd688b0ebec6a2ac13421012874c80685c481b41323a1724ea96c1df644a595e8cc73955e6f661e0fa30737d78e7cec11629b\nAD: 8f1fa4bbd8e8e655f50019859514dbc4cbcf944f95084e45337d9d9d8972bd8da92b4eb5a75c0b284305601de859f8d1fac6d6b3fdd42210fdcf696119e436\nCT: 97d729cde56ec1f95bfbc16ca5dec6a208543c3255f7a2b97fbf5fcbbb34908ace9ce13bd9e90474ed620715a5e9e43c34802b85feebc4d4a23d1bc8b4b5a6c11da7158765c40d2c863185c5551cb2b10eb0b45c61b939f8274ad84fe0a74e163bfd6afc5759946362adc74b4a7f705827323f8291ec38\nTAG: ea1c9094241c5b75ea880723ccb17ca7\n\nKEY: 006a5a863859d5b70806197fdb9f0da3e4c31b0c7545809808bf7683757cd11b\nNONCE: 9d0f8621664df31eb95b5e17\nIN: 567d680b1a26980772e8ad3e9b2e2de537414368c4f97adff1408d36c1dfee65b78375c7361",
     "c91452e7d463338474a400ef9efcaa648e93f38f8784a1598bca461211195d7844de56b91cccc96d89e6471bca6b7374aa5ec4b2f5fba66c17a435970411f2af3d6e33c0d094f74fcb77beb6cbbac1f3a8a19f69ca087f94a5b80d5e3692e0d10ec34\nAD: aa67269c824b382d6238bcfaaed586177b852f816c31e9966744188f02647d881990d98c3eabd477557a739262bb3f682f64d2208faf98097586053a32cbf37e\nCT: 85f7411a7f8ab505a7c10c5c1fb9bdabcd9a7826465de96e3b7c762830ce133b33d8956756ec29c00b429d30047040043cd5b3bd87dff60e09e4d7c3a95bcbfa2603ac964be32a82250741e19b6786638be28709ddeae496cba7558b7acbc5545b259e6a1b2ac1f5135f5719987dc547f97f68ffb7b9eac892527a4bf0ffbf59f77327ee763c54d6\nTAG: 3a8cb8fdab2c79aceaef6680daaf3ecc\n\nKEY: 78413a2d89613a81966e8d654cac0aa34107947a036f403bda53e74bc524e7bc\nNONCE: 2d2c51dc426b38c308cc5748\nIN: 39129e5e6251f41dec9cff7ccf256c38e4994e15ca976d3185ae17030ad3751e56367f86886acc32e27fe04d0b89cc89b0206f281aa2d80f9be19928dabf07417e7659b17f09c56d170ed1ef10d2fadf01e0c78473d06a1685ef0bb112e4ec7e6ce0cbc601fc8a2dd64045c8fada4a28c0c6f0ec98542e365279d00ffdf5e2eae3b663c4b79342f2f265db30a86d6e1b325318d7f7a622b36e\nAD: 746875b71165defd5ca1afc0a92db6ef4fb9e20b81018a5293899f1e0d06b18a2e65f7616638f79a0db3f2cfdcc0eac2ee1e2e454958e2e6d214a20ad13156f97d0f2cf4276b09f594\nCT: 142722bf554b8c70e8e76e52b9c0e0bb19b618f7bbc7ffbc91a66031f418d031d3c111eddb9f1ff7c2e64191be8dad4f8cd175079d2ada20c8880d0565c56afe5c9742753cbd50b93620b081f0877f045d0be91ff05a603fdc87e1940ac1e1f0c9aa96d5aaf4a58e0393ced4fad8e83171fa71c397817cd48ce6991e3b73d3356ef0448be1bd8114feff5f23db3b9cacdcfb4d25fd4dbfcae7\nTAG: e489f6c52120c8cfdc0f164b3440de99\n\nKEY: 5c11f6b20b7bede26d6c2f0e5cf2786eea66e18d6ece02156f9233bdfc57c75b\nNONCE: 1a8a8b1f4ab85be5a4a089f0\nIN: ac762060a336aa502f5a1df1e0a647fb9d5d932dc0654e0725122f6a567681a7d1cb7625ed0404d540d8b3145c911280d2a0ff9d1c53e27677be0436faeb39009fe5751c0b37c7a5f1137a26995577faa109071bee1c87d5e6772ca55fdec02348a625b49c3c881aab162f20ba0b834e8159d9bf20ee0c5d14da0221961c4fc7d9b44c7822f32298d30775cf974172ebfdb36cfb2881ccb15e5f69ed27880b920f4a092815357e03d982\nAD: f75590af08b447f0f8466b031ed2409e9f5eb479affd9e18017a369486914c63a7494168d91df157f5e56fbc4ab6ee5a8f3af1fbe1bf9324338a1f4acad45fc7137676797c89620b15feb8512544771f280f\nCT: d8355d51bcd69356ec74b9b8657cec57335731cebfe83202c1557fd208480a2c25747625bcc70533d1ef75d2bfbeb9354066a8650f59a575e836339dd45d0d8a5cac221954b77cabba5e95da7437665fe9b48257148b7e8a88cb2cc4e0912f511aba0a013aaaf09255ec13b27cd9cd05ea11fe2ff21c9ab8a3fe86090dfe13166b172ba08e76d30ad48bef0e2325da08835ecc468cc40222db0552834ae94458366f28f6ba63b3e656bf\nTAG: 0c7f16d3294d5ef185c2d06ed719ed8d\n\nKEY: 322cbaac9c4d7cfb4c326824825ba5b5f5190fcde0d399ef1f52b82abb5a8b1e\nNONCE: 5f2eea2c79702dec4cfbee3d\nIN: 1f5cc11e085d2254f8b37f8030bd285d6aa1cc53868d18ecfdd963153485dce5a3e3e8cb0a3cf8074571f7a2e9e841229466463f506a2bc90f2d6413128efee043e01eccb930fbc002563510e499457161083ed7997e58ebf03ce7ed2f8d5487936311922884bfd31cf828f3d0ce78f3c6981932268108a369048cdc0a75c062c0ed02e27bbd11754e621ff67c511ed98c6fadc3e95e7100644ebe1aa147a7e99f25ce5c2edb8ab6446749441027a211b8d04a6247299dfea9d75e\nAD: ab257a625aeb51f74e0b47b302fb5c0475ab23e99f4d93ecf07694497ff6b27c9848805af93a5615bc71486b26fc9da67cf60c8d3a396bc0164985fab2c64bbaa4dd0fdc22c9d9e433e8c70dcdeeebf230c7a3cb3e5d0d48573a64\nCT: e8d083e25f9332d30bfe60ac071f502909b26393440a848d1f81c3f5fd521de98cd9ad1fc3e806724f5b3732582853cf280f1b99cffdc6b46874d42adb8784cf9ab8e158531b4dbbd76391d48727b585fca0610777fa8ec6a2a7f070627f1ed254e430e55472622289f44089ff22f02b7f3c5e45e228b7b03a5d1e1abdc18b154124f8cdd3b2229e4720cbc1bd3cc3f86f3a6a745de0bffa2536027ee03d447b306ae69b1232e964ca27a6d252c1582422c99373ca2b9541a27081\nTAG: f6b8a72d4235589f7811ee1c6f8d2167\n\nKEY: b068daf90f56b15579767ecdd420c0858fabe23abc0b313b97a9c1ceddcb59d5\nNONCE: 322e47a85cc58e753f00d6f0\nIN: d032d4c5110c8f22e98895279a30a86da0ef71cea6ef2738fe3e747ee54d2e96e3afb8916281f6369ab1a397ca0a18c6c0e9a0c4edeaa4190ce6422bd116ac254a12235eb66fb5cc7ef55b721d3d2db4c67c38bbbb0bcac9234ea7d733f200e6b86fc55f4abb9b65ee1897c262533cccd118b0f493c849a7aa7f35d243f9438f1858da62bdd03fd5a8c7b01d8097d7ce319a41f80104968a46599e9a3289a29a16b245877898f345f92fa70d3e613c38e6e4ebbf0bcb64c1c41f8b83ec8e9f159d4b830d9a1b79f2ad90db06\nAD: 7856eb8621e52ab3060e8d72dfe782b62364c163fa00b49aa6fbe4210fb7208c642b7a6735b1a8b2f1dbc4b3d4952985ef207a3eb0a07b1341700762e9f9d1c3438fc6633da2fbade15844cb1813d258aa5bfa4ac129d693792a89622a0c686f05d87019\nCT: 00d34f899f0a8b40fdfe9fcec98a96c5995b4524b144545026aaa55f629c3befbb8ff794b726e759e18b7198bb2fd2a866379418e6dc4f9fa9e4edc84d21454a5cd212f68a7df321b18e9eb2c537e0cf2e0bf65e80218b841ae8a994ea3f6832d667430dc314567267d7f31519fd856d73eaa1d3bfca419abc5001b25cc1fdf860812b077fda4b01abbe8f8a81a16ad2ab5d9299ea9a0d81aa26e1a573504d5fbdf29e6b2098ce975f2f3c8c212939569c8ea8ed63c4847f2d0fd16f47bcb30bd7e00956ab8a9deddc54e009\nTAG: 6152a0401a33257c8148e65440601d5c\n\nKEY: a266f91387d96bf2baae0262782b9c23162f5271cfa3144265deefe2c569e829\nNONCE: 11e842e5c9ae8fb79becf42c\nIN: 3afe389acfdc9a34bec7b45705ba68e205b83b33f50b7852fbb7f4ae5dfdfdfb3cfee8a03c96a036388aa8f7809bd47eaa073f92905d0d5f199d466cc0ebd9bceb207f4209bf9925c6109973194742dc8d813f3cb212bbd8d92d7eef645fb0f8245811876dee5f241763edaf7d79c1b83d973f9ba3b29a9b9408418f73743ff0546f0d9290010cf3a665c443b85255759ec6248021e4b6eb825c398b5af7b5257efb7afc481abc20d90249bed5b30d44f725c78ad0ce2821f86838874dceb6b6207ad6fa34579126de720ce34bdfd2058d92b8bbbb3f1bec607de3f0a0\nAD: 28d8f6e13d0d4d2d3861e1a26d79cb68d3fef68127e8458eb599915022da751e271cd047cc712fae5b0459ae7815a24f4edf806889fc462c83181111f4de5bbb7e66a701460f508eaf73798c3ca9c08cc1a046472f4b18c69b7ed249a96f9bfa05a276499a5f499c586027c64a\nCT: 11bd92445b4e43dca339491c8100cf933795ef7cf4c3c4d6c42ae5b729ca22869d443505fbb49ccd29b44046569da104f7ddaf325e71e7f30487e83acd012bd492cb4e98342ac7d64843eb499744b3d17db402d51b5bf8cbcb8995fad4a81dad4221ca30ceb3590df41e124c327fd31aa53c86514a12e22c477489871bfeb38cf71cb3a959f4167402576f142bd88b1221281a94661c8d643f89fc92dffef322ce97f8c19b133e55f8020232dbdf42e4527d9f133b8a5934bf0a2df3754d6455a9d765182691ab94ec7a2e68f3ff59805c7457428ee4af8388f91e88b3\nTAG: 8f1bd0ef9d08299f494054ab9409f663\n\nKEY: d6a68dcb52a50aa6d1b1d4d202e6f184f01daa08fbd643523f4f73ae6b8d764a\nNONCE: 7f567087a5fec5ad1ee3e4be\nIN: 5b677b87109e69eae9a635ac2ea185ba08ebce3ba4be06d53b2da081c5030f5a746fea7bbdda340e10eccd47238340b9244b9442c0efae7644cff53c7abd8445163e891cf30bc8e26eea01f0c461b4796c2106e1ffdfdd1bac29f7d3c72c8ca7f625008d8d333d2a2092c08ef83c8002ed90e2ad01dadfe4cc0681384b489f38d25e83c2c563485fb361f81d44aea205e5bb4c1912d00d8f99f8d7a931e55ae72f749147fbd97699ec730bfb01b8261f1f94696278fc703263cc789b283460af9d74647a8c039ad2184674e78f6a355a26eefc6fcd4cd32d96d245d583836312652fd9e6694ac5644eeb4c2bd667\nAD: b52e5af14bcb108c8e277728d6d6116e8ed1981993771b8bb783bb351982f9f8c2a0e7c20a5a863c6d71b7145b73d7e6d84d47780d66847244d0b8ef559f2297f39e26501d8a2aae8c36189580292da842c4d0d06a21d21ab175e34589e3b814d8a00ac1d8a3b2eca2a91b21e36c55fc6dad8c0a1b2c\nCT: ddc900dd582d322c567e3fd7eb23069b9e559bb16639cc79ffc6f3deb6e92cbf71ee66c839b4115e883390646245a42480ae6c638fe7fa04b575b4a8341050e2f3de075f2f19ad9b24d9cc1c39a659b0ffc362d46354da6bee0e41319221cf7cb160017d589413e5c1f07e5f626c2a1f8ae9e8b9ba0320a2de9e1b5f7baa4d551c090521d8ee0b30c8c709fbc00f1fdce999f1f96883e3b83b363cc47665e5a21fcf25afb6aa2bbcd0a374618c3dd8b8f97f21037946dde9bfdc7e907ac39e64f1a5ec8dda60a47148bd066f907a25b9caeb3804c0423836a8d9c35bc58c57882c5b23e00c7f4e3b1743cb14f102\nTAG: 8ac7e104a0165df543c7454223a01f90\n\nKEY: c7bcb2108b2e21fafeaa26a2d4881b183b899210b474bdc43a8f0b8464075d86\nNONCE: a2ba1e9cd195a8ecadd31587\nIN: 0d5740c4e22eab0783de87d541fa834647c3fc6543c60d5df31c19c6ca38707649fa8dcfc3c0ccc16b1bb60283d7ae2778a8f83ba07b905e23cb06d5656f614f1efcb346f34e190bcc636cdca229b64af9ae4b1f05b58f1ffd1a077a51bbf9ede69ac3954de7daf569cc8de12282cac09b9a49dfb92dcc409b8c63f2ae4a34091633f4aaf225aa02ba9c57b910a76535f0cba67fbab0e6fa0bc876217fc9a546a97dabc9be41209bdb582d8d8a62865df7398d4f7e9ac681bcd102e31bfd40cfb8e9352b1e8ff7a7b81cfe2a62849e8b77dcfb645d2046404a83442133e245bd1df35d69dba9ee097dbc867cde7b431565c72fec31719318dd27c3e47dc5f8\nAD: 729ea794668d8724a1d4115adcee0725e4c1e3ce16ed9e31bd5a409cd074c0277e21a0b431d3b30ddd361ecd176a8d86927c2f6693105d7d3c47d9be8bd90d0b2fb20587623b2e838624b5",
     "90a5c9f0e6d519b35eb5332b16bd2c2f9534e376ba68316efdb963d63e2c87cb0716973297d986bbd885a7306e2bdca0855447b5\nCT: d0e58d936c8b83c253ae9bd29f45afaaba9712647b3da6c6ffd40a9390a4476a0e74a2f2d458c88056bcc0a57fb64597a7c8a5e2be39669dec53c6bf0f7b4a2bacaff9aef36b43fe37b80cccc7d42cc283ba1c1eca739167c07754edec14375d86e88668b156d04c989bcf3fdc70e8a25aa3e6052d6befe3072ec0993d6b520c722dda62b6879324eb4ae016e54d139d816be7fb1bf9c0168d8f7225bc8ed9b7509b45cdb2c8a1db4b3619120c824d0bad7deb7fd0dfdb3674ab15a712f6196a5a840ee8895670cf3b20b8a5e43caa41c5524bf47c2ed4ae7027c2b566dc3e2548244057b880da2a3f1abe5e4eff090f9358970da6568bdb5f8288f9d25829\nTAG: 057ab8d811b5c3819781752230badd5c\n\nKEY: 7817285801341c10baf67bb5f71b75a11856d2551eb47e60025a0021b9948afd\nNONCE: 8818888585a6957eb59680a5\nIN: 5a5c42458f2d0e0f39bcbada0ba0b6e72340193500e22d243e32be0e7d7bc5c632ef3dc7e79ad5acc895cbba3111d8d1faa69bfe2ce634fc0d7b12242dd8bb105c6ce54cc9718921378c906ff5e61f48fa259b25bd10fee96856a206a928b450a0098089d5cb7378c2935c4537172076d829975798d4f24ad243e4aad474fd5e59e25a6dd133944918709e33f84b4daf4bc6d3ba1e0b9e364dcad5834024066ab5c8e672a999bbf23a83956623943e0011e3a2883d23a767b280ad84e2d7fe5811099395edd269077162310481ff304128271d4ce5c84ea738fde318cb2528bc5cd448c67837cb7dedb632d47e8f90e351b0a8942da2f78e2065cdf827a85f51\nAD: 0e22156bfd971ab3f123e9774bf3ff7c224af19bc79e812839eeb3f1c14f89e5666c16c44a5483efbe449237508ab2436939098640931fe3b928cb3a9378b6b9fc2a54c6bf59f34b16f06d5ef132ae2a7161034f26a6e07badc61ea51a94a20e4692a0a0525726f3de9bd1d6151fa6a0ea3acef3634847cfbc98d2e0bb9ae89e\nCT: 5eb6120cae6df4766b40ffb4d204ade5ae08aa2cda263b39ec7b47756ed7e6b7837fdcde8d01a2bf01367e9398e25991f9da11bc9f8de8e6c1b4e922af05d20d683edb4a245e22eb6cc4fec2375e8d81f9f27af5f118a16fde654b4ceabe770fb3a00bc7a88763b670b5e3a6ca06aea1824e20b9c1a304c4bdb62643fea73030ef6d18ee2e22095b4c73abc51abc4883f2bcce14033608ff7e1ce72ab3382c29069eb75426d283a4a71348123be19f480dba1d1677055de9e82d683c2d6413a6a4e0c6d58f7f2188ca5c8b916aa49975b80630d27a89ac284b971478376ad6e55dc64098951bec2ca7d77ebe790b1ed7fe7f33fe571d8613f143e3d3ab6bc613\nTAG: 6f3f79c6231d7e45ebc1ccbe5d110a0b\n\nKEY: 4f91a78c56558ac92b4f33fb1d96b1ade26cf4b2fec779bfbf6709e531ce0e62\nNONCE: 19f75c4c31873d4915b1af3a\nIN: 51c2ef5e89218ac4060dd12be216654eff2991e8d7bce6f6a437966f80c59c527679b8983e75c617c917fa9b63bc60748f5ca179645afdfe6a126a73d3fbcd41a9df6d734e8783aff3a5134ecacbb289f93febbd8eb493693264026f8678e9fdb779038ac13199459caf9c4e86f4cf8306af6dc04d9dbb678d3ce9e41d154c4c1bca018bbc4d744655af04ee2cd524db41170f0946df225d156dcdca3e52139561b61c26bfc56bc90c21cffa69468863afb66c3e1524303f8f42103e435fa2fe2c2956feffe5b06ed20bdba730d675166f13118a193b06d7985d54d46e4150468df1252d7cd144afc99ce99b93ce9526ea4dec2cde1d0d72fb82f55db65ec2035e387e7923d98490cacc793046afaa2e49\nAD: bed34cd7e4eaa52e75bac5e86f9e9eb81028cbe8a515870edb9a151334e1f961949855565abc51af9a1bbac0222e9bd217d3e3a642b0f3df8e7c47c2c9d5a801cc8028c425b3becbe31df39d30637c38f981d268017da818010189c93d2d135024f239407623496c5435f04f9cae86e63ef46fcf9787c946b400249d8476f82dee274cc0cd3714973f\nCT: 27bf7ffbf2c9733c3da8947db11ac8801475451b0a65c96a2a3934bf45ff54fd5fb21ff0d51c83ddf0f49b005d424620b04d0c731cb214f4beb6d353a6d6b7bf1a706b070faf5146b562c9f4e6c0ba5dc9ef9ccde79cd162bcdd887dc02bc95e29dd606d22845f35d0cd6d5eb1f1b154607c0c5c2e8c7dac005eeb17c238e3d4d1e1caab72b20a9d7b2676e6491eb84e9cab903bb0c05751a33642e145de8391ca9e598ffe2e579486ce32d5d76a35d440836ede088267e8cecf4b660fc5eaf05f68872b6cd9427607b146e15fae406ae7089ae446cc2172b8ac9e42cbc27d4e5ee38c21d3fd6d4d52b2d43462756d93995b9333a079dc1f2bea9ac4248c448d932c5c0f6b76da4698d15a64f761a7380b\nTAG: 7efb02056e18e98960cc5718edd07cb2\n\nKEY: 1b6e0ebc443d681af25ee26a8ed475136ed8bfaeaa8315a4cd198961518c7bc7\nNONCE: b15c68437005a4973a068187\nIN: 38adcaa250949af910aeb807096595b3af54bacbedd966f83f784f651f7a2044461a94f1a6925e6d2064e72319dae75d3883a50afb6be1395d429f24029dc9b8cc021f15e305e5418d844aa4a89ddd299bf2e8c698a8f6a6cf0165c37bcf2e5885d73bb81ca15a33ea75da5946678dfcd546d475149dd1a2dab0e11cc8b07c0b06105a497b1fdb1a720b9510d7d8819b6d946dd85c73be515c6ec00a10a69661c59fcd7a005dd08f3cad722bf3560f356c624404f3be55a02b3301ed756f557a51593ba90d18a1c13e227c8d5180fefdde4957484dcb81d08ee3331a6fa74c9c549ae13b2dc2a80ca0435710eb9f0dc2c908d896957b87325180d397c37ea7cf65db45960c4d791bf8cf798bd7626b13bc5e6b45b45be1a8ff687572ece86d1f5361\nAD: abaedc1a7f9d9ff8003bca97af7dcc42b4399f9da4a0e7e829c0e12f4d41607303f60d1df5949fca0dd9ef171678e013b88789ac1f51a8160687d842c273a2dda93c5fba1eb5bed7476ba96a12e70cabba43d509b311e9d000212c81c483b7e9e7bae1d9869a125558b2c7ef8f838bdfe97af413b460bd9dc5e372afcb105832ee4c406d74781d3e9f2aa581ba4fe458989a\nCT: 92aa5661d04af60245f6f56153cd86c6a61d5584473979eef596d6d0c205db9e4d928ba4827dbb08d5b34946b8f3e58ff62a976461ea5639fe2ee79839f99f83cde00e3fa3258e21754fa91a17e0d1fa22cc76fbce0bebb7adad09f99bd12e70e519048d96c1f97a183d8ae66445e63a4a1f936821fa7b58f569a16e25a0d0b202231a79eca0e8a2ed21755f496d8b7a9f59f6bfcf47ee4bf35788935cfb1b5ec2af2ce11c002b2843090e2267d5fc5e26f927e8836d6a97dea2a7e508f82a4cb7df375110217f88f4376782626039af166b080e181d8a310ea7fbb4fb11d5b24367f63ae83475269281aa09b7bd259a348fca28f2e1d7938127c888c68bad2608f89a2440add0c644de2b5f08d3477641675cdb428393758317c273536942caad42\nTAG: 4a43c15d469378383e9a9a26dca7083a\n\nKEY: 03679744edb73ba31c7d9d37920d4d57a766104afc9c96650e5a602ba885d207\nNONCE: 8f1c67d44d6e86eff0c96a14\nIN: 6bad3420c7dd0c64d800ea5ab7ff472d0f61bdf2e5634e06cb4f3c022dff8c4b46f2a47fdca2d04572b67f24125c66a551a1f150a02f635e1e99895807efa8001f46388365c48e4afe49c04f6681510f7e4cdfa02deb3e60eed745cf6d7ca6b773e1537d057a043cf517e5388dbbc44ff4bd68d2a7243587f8929ef07df5d001a6099bebedf8f26f49323209496d50109c383071e4a61ce18f495d98b6c4bcffd0fc2496b7eb0ba612e2a4cca8eee2a3daa0c21d854d49ca73cf5b24b38940dc2b44a2a6623e8404fc30c4e3aaf759425ebff85cb1c661744adf34c6c5d538f3210dcd0270a3d12784effc48734b53c1a228db291e2e5573b6ba2aed0a7296c1bbfdd1f4a86d6057d5534675a3f4897fe3a1200c54af7e09b97b0a2ab9f25d5ed375e7bac921f28f7b6983a41580362dcf0820\nAD: a2dfe82989ccf0a998286623617453722bea0b6e8fba504b93cd043c7e6c7cccfbccea43f7e87502026f94cc7035c5e84cc14a5fef9bf2be53dc379053725a9a29c4e86252369bf6dfd3cf2801af7447fd0529e94beba961ed65dcfd492398123faa55346edfc3ecff720966b74fd0ff28f443ca67f88b8f5a4a73007f79ef782bef601a0827888c4c74f7777279c625de8a4b51db94f94f846474\nCT: d64a6980718a5fe833da2e6c1a119f2f16a5bf3cc5089168520603d37998d5fab07a9e18ebdc0b8417cb6a4d34357f8d598753affd51e93b451269dc24354d197885ce9a3b2f575fdc9c572b05bd7bc8df091a6675185ac15bd1c4f2cc0a8a412ff72baa6fbe95065bf2111910f4f004f6c39cd8e7ff5bab5f86abdb231406763233354734807fe0346ff6ad23a1c9c81b9942b370e02bd79eacf703ebcd53a54a5782f13ad3591801d1ece15c6deb56bb5e32d959ed1363875c57cd9d42881dc1799e652bd554059ce059a9d00a126de35f0285d5d82bfdc383b1b37d77cc1180184b2180aa35d46f816fcf125c9e8e3bbdd67c8770da26b89c7e406f02ec515edca3910de72fc76ddad8344ae36fec1d72315e1a568ee69a08154696e4545ec5ca53b3c0f5ec9cfe82792380c1b9a151a8d6\nTAG: a258557d32e1924b3eafceb7b73e43d2\n\nKEY: f8563001339afb3db339ab997cd1eb1eb7b03b228162a480e129c66ad47dbd18\nNONCE: b4c98f6d51fee205805a50c1\nIN: 63beb176b754366e13c57c18433228a81089be18b534ee5f9567d529c802d34bbca36807bf845a9d14dd141c5de85607a4b4c5521e5aa717f78fe78612b770a4677cacd77a425e2496ae50ab2e559526c37ea723f2b8d14bd8314e4cc3727bfb835ea4062e87870b13d94d52c25f0c631668292f184fc048dfeed7a9d1a88cc5c4662030700cd8c257784009b4da9039909f73840b600eaf670cd4d988845b1d41cfeeb1ea740db129c12f66a74e6234ebccf4df706ed30fc736cb5cc0db17ed108229e87d6b039da5c4f0568a4cbef9d513dfbc0af9313f02d5129cf616487934f741a0a60bf11fdc8d29ec81eb37577726f54f3e35bb10ef98b1d15bd5726fe501a9249e409eccae128df61762447962ba2a63f30b59ea25e18895d2fd11431606caf6b45b908b08cf2e150c031e20e6cc649699fed5785cfc6a0e22bd8bd8c6d25221\nAD: e9c9a8d2869d236388fdcdcff990cc940ddefd06da0524a351ae6113b29db9822adf9cb548d92f23e3951ae8522ab113579232e58578e80bd2fe3e1d06414a27ce0ae2e40d87745a8991dd5bd2e8ecbcad8b903195c15ac2eaf9bfe0104bae32f772a7d7416c5671350524419a6df6ed5e1df32b961ea39b164eb7e1353b046100998ba6853674ebd5ba011691a270c046096143daa84752f872e1ae32ac07c4f0d2a048\nCT: 2ac34bf9d0d909a32322cbfb765875297c50110ad859857c641ffba8efd60ca003b8f32d157b6fd8fcfb1c6037b13285be884ae2dbcbc9194e8757560807a14b2219b9f2dac11af7dbbb2f504e3d8ad47ff73657a4d1283c78bcd",
@@ -566,9 +587,9 @@
     "613c3be18aab77c708f5e91af8006e11b6ddebb8b0ef98c06dc3c97d008e058bf3e534582c24a1485f68214cdd88167814802c89d5c07a7453aff1010d6db0b778d9d8fc64b5bf3bb84cb97cef38a4b30a7deee12f0af806833c8c6d35a7f995b414eb0d9a900e3e56afaf2dd0d162063c4dd52bc6ffa56cfece2ed90bc7c9f4276459c9bd128ee40a5aa514de786ec15d04a16adddd64c7613ec9eed738fd36e24fbcbdcd0d3318fab948f47314a5400d71c5ee07a8c1fa17e4a4c08f4a467291cec1e8266342a42646d138331b08498f2dc3fda0374ef736d05c2a363fe08dc71ec799f0256ac9114743f40641ed8d9a039c57cd409bff29bde518657cb305a875cc6c0a58fe9ea3452df3e3802cf316a0c1f477179f6cdcb39c7c9424c07997500989a600887dd9f04c92226df10e9a8301818a5ec2f0b7b06b6d1443dec46f478a9271498b956b72060dd2b3021b004358b\nAD: 7eb6a083ff2facc3e9500278352790ccb6f9df67dccf7a03c33a34c6f33c1b4dc4ced2d5f69e5f68e79c582bf0db7751b774019d9399329f1a6692c5c527a646c9bb866e69d4f1ba4e6065cf0c5b09e941c5bb6e96d7edcb19a5cc02411507701b65987dc206ffbfaba4f06cf394976bdde1ac343e368ec1083813417cd0a325aa0e88913958974fcc911478a460b79b9978e33b21064ffdc1fc4df1e314948df71af9a6e0a40907e6b35ec6304bcaada85b456298637b6fa582ef331e2815fef135dcb66870107b2149c5aaa790f7127c0f0819b83bec46c0f6d30edb61b6fdf4f35f4b5345f1c684f41eed8088aa2f1d42c920a06092058e7c225d10fe1e5befb4dc593badee754fa12b843a6e9f67ea0e0616eaca697b22f526fb79a2ec259076971185678aaebc6449ba3bd284230ee621bc02ef1f5ff23651a6116cbb7770ec7385a44f4d54e7cb04aecd59a99660a1021eb6abb5d2cffd76e6e7380c22d0224e499e0c7b69aa0e7dd6deb47b22b1f1fb882dc35eb944a495fc3f6345b08da8f7185c3be95952bd7c982d9c8b2410a1cf1f5164961f6d1db6160d252e631f77b02d4e23dcd655e7e875b9b703fd27c57008184772c73fb5dc626ba43f54cbdc2937de7b4c470235098cb0a3e699baaa8e2adc09f8182ae1f168aa86a790688795003c3598293ca269a944\nCT: ac837bdf77bb97a1bac4cdde49ef8d6c7024f5f25a7bdcf924fa87b0c77ddd66bdb67c9b8798922f5378c0405be67d5da47f7c245c5f7330accaf74d5bec6a8667c911384d9c77e9d3ca38d88bf87deaca62b58d092bbabe64895b944fa9f6bca0aa17a55031fa19ab0c324948816c57f67adf84077b277e71a7db9a6ac537a95e54d3cd4c9517bcdb7e9e1ccc8e7dc252c27c89b9c20c9876ce7c01b17b80a05c6f75006cdd1e081ade6f9353c66f7113613a5f72d82dd28a65efb74d0d1c92793d652edf23bf7c70f6dcfd5d40b2799b60c2a6fb53beb02571c78001381fc97d4a9292a0eb7a4a0a67cdf20b4810aebe5aa4a6d20fc30e2971924a09f106d0b5b7fcf181321b6f8442f91fb7ff3b5610353500b9d6f8a36301e7cb12d94d1aab6ec0f797fdb57232c02d5fb4b2ffc7d0cd2336ff96a4a811cd1aa02248f4a48c7646591507f9e02f8f441cacee92b5bb3cfcb7a5dbb02993d0fb1818e0ec4cb719a6b43d82e15ce576f95912ebeac7a7aa377a50d1190799b00a6da2fe7cd7231c3fecfd4e6913df0b46887ae8412cd2c9de49ad7a4e8f55e7f53239649b566c4940db50e0ba9a915acbdf0ed97905b0c70930d49c5c31cb398fa4f52222d3cdbd9374ae9d7d979991fa50a2cefeee88b3943578f99b9a46e58900378ef22880c862103ab7e0c2066685571b28c3407cfef5bc0c9b176be8dacf6130bbc44389aac32cd0011aaedcb752e16a1f99838030f7364c17441de87d5ec670a25a2b55a77a57f2304233b3d9d1f4c7b145e7e145eb8607f2d9b6159e954f14b02609830fe54ce1a7dab775b49d77a0ed503773c81e3c53f50e0cb676387dec6e506494ea7843fe533aa7f09dd1d4c960dca585a1590035a9c36cc9f821b4a8aaff6548fddce5250efc4211b0ad0ad4dbc3dc5038218e58851da4848f399f8d7938da211484139000dbf8b6c6314312586311ca1d8639fcdbb20b6a6a608c23027eb46938cd6bb869ea2d3b327728f31012de124a9b57dc96d5d98154b98045943a24e4f788e48bbcf0dc20598fb91627f09495c8fd5bce762b1193fdcf9c45174005d589ba6ad971b5d7ee13e1aab89447a14f9d750621184cdf55ef4ac2f7fedd7b8fe89e0fefb4382ea18cc4feb62e9650e9ba5a12f9366584ec774f5aa09793293b558293991de7fd1793bc44341a5b59cdb45095d5b53a4b847512dd2ea621f9778b4c0f33cb7bdbee1061505f08f1f2919cafc5d6e45206cc35e89e1d366b7abfff3da64f6cfc0d0b855bf5d425a85d93ecb01186697f60a7a47870ee2a6a50cdf134a67a51565d28974dbaa9c62ffc960b70fcdadf79dc489741095ef3052df69c55b99c95a44728d30e267a02922c7a6ef2523ec379239a5148eef6\nTAG: 09a43ea9d67cec2b3f35d401141af9a8\n\nKEY: 94f159c5d19a22469924c5fbfd198b8add28b37cf7bc3258fb4b906f2ecd672f\nNONCE: 4fe1fd1359a4332402251d90\nIN: b2e081fc4457b3387c1033affd15747b79dad1d6d3b69c076d4dc5c209ba1cdd383a5196fc21fbc49fc65c69b85ec299b1daa26a4bd2e5ec2559cb230b21c3bb62e2831830a2b86da2abaa289d98eb04eaf3cf8d583ffc7291c3201df2c09b7d900a4bce0972e390fc980eb67cfe654ba3b9c579f997e319496b57819b36dd2b4484b88ea3cc1ba777b10ecaf526a08afd9e2b3b32b2bc02932af5d09c2ee3fdcfa18d6261808e418c4bb80be4315a5581d405841341bf2775d8d0adc21c10b9ffdc0ea4b22e22f61b46f844d8caeda0aeb7e1c3f84d337898af24fa68d60e2f19ff815713e1587e0d6e68d64cd088ed432c45637e1767913343d899b2f8c01bdb83253219878a5b3a4e6166e02387124e711a56e49da1893b4f72198c6339943262cdfccba33428009dff70a0c8c79af248d081ca04edb2ad4f35ed1819f0846dfade107c7e9f4094c014087c719517d943e524b86047d24aef8b901a7b1ec4e839400b717e758520cfc7a2dbced0ef491eef6aa2695b2ab9a92296b6e75251f124168c36a6555c4a465cf84a7b36f3277859dd5bb0f10f84cbc944b87e37b6b8ff6958bf1f0546839effd30995853c734a11c062414fe841113d0ae62597cd12ef80dbd4dc4f72e065171c8394e45dc6f87c86154e9846c1eb58f560b8c503848eacf05107c445a6a06420e67e2297a9975d23a406f8b8ee46d958d10d8724d90bb26e2b38be1c0e8258de3a09541826486ad28af8f2fa8c7befc95510589baf81a88f3823e87eaa8e40759cf0853547301de1e87b2eeccd76967bb364278174823c1cb1963f34fab537915031cead844dbb1c614eda56e9952b1eb4cb153d06c59c8da3b10af499b1c15ab0f03559fea13b81bd35fa5eb9a5431e12ab87c3c094861154d3d8eda448af7e15017103ad3dc7e9991b10cbe61cb33d2ff90121f4e40bd5d9e9c34b89679b6e1b54e38f00b128093af3e4ca9830a1a4d7a5e9db067c9c51fa26232945fa3e1e31e28c5000e1965cc7aa11a051305e68be9d60fb92f46eb2b701b3f959819f525ebefd5339bebfb64636d680a2a4f32afce85e287f8936bf62676c37ba810754186e30b812b1196e8661e345fb5b09b8dbe5f96e0010c5e3dd0a4e983149f4a058437cd46e3b32ca04c51ae3a4a39a7e15768a8fc379563450c616a5c7d7d98c46c0b934c894727532a9e713d330d294a2753f0f46049c88eed68711e9c49632144d5cb14d76848a6f7741d36c969edecdde52cbfb57a628678d31befa7ae3198343deae760d5c92c31f3c045b3e932e9051cd201d2dae66ca0368b94445d662acd6442c39eb945c8a4b46129a8cf5bbb2b27927729406f9b081695ce148a10226bc345c648fe557b7f8db4604fd0704831e5bdef6694afe716ddc3a8d69ccad4113\nAD: ebe1684346b493db264417cde9c0e48db46aed1984f72903e94b72cc2b2f151fec80b32523f96f61485f026d63734ff80015a1cad4b21ed1ba057627b387eaecdfc6d7a195b7d46e485bc137726d96c4ba51e1656c3f234174759ad922f3493077d65c149d1e871855490b6fa5924f6270cf15920838b66e3250a99ff7a55ecc9944cf3fd204081a61ce05bb989e5abeae4b2f24801e7f2223d5ce05c2b61f32344a0370c22751293bb898061ff50d6364ea0275bece795be21c9dc0b2749ff68a6d15896d4692474bd46fb256d1d012e45e7a58d880fba240ac6b89d2087da1ff7d41df44c768fee5bdf51f36b090bbf85e7ecb69f61312463eb0b4b1a04a153f593f8d43f62ac96f76e13ab5928147c5e63788bba4f076d12eb6dd15842e2c40fc9f1ad5dcb80bd95d9d41222953776b3304badd650afc783b7342196ab551a474579d95f826f53d15b96ac98a10c2c6d50a7b9b947cda9fb8d8d7dc7def72c5283a93112d2b58487a25debc9ca06946bb0a52a1e4ed3bcf0fb8decae49fa6607c55501f01b7441671f08c814023f7d46f4bc596d709d305ce320b1b0160bf35c8f17622c65b8e5c97b3fe7327e8e22384f6c400e551dd438d6d3d0f9ba6101abd1bc2486ba249b4cc83c47982c1210328968f2b28e4a7c4880d598d5b47aca2093965622ba7b4e4062c86d81070ecaad93d5e47ec\nCT: c5311b1a6e3d93da070ee0fc2c1007558db64bfdabdc23c832d151472513482314e7d9385918abe772970c7d8b3ae4eb0d12965e6d7f6d01f6c97d06b51d3be812dfb290592578713ed6342a690ac115c29d471826f37f7f7b46936ab9f431cc0e4029579036bc6311574205810fecd3a17ebccd0f15752152276d5169b48b0a4fa93613fde13997517956f84500edd7eac1082ab6b69bf43f56fb9046cefe8425140db5f6bd3bb201b3345b2138c7f42120a3009ccc19e2d95ddb2b4384205d2aecb47c89cb43fab6c353f781caafae280e93dff5bd213640c41cfcd81b9dfd1be05ce21758c5474c38bd24819e5d085241dd54c8d2cbb5b21a616e47c05d4c64c0f397fc16d52d008fe4e83c040a6304c41a448784fb0c54f8a66fb00b240b9d66e8db234d14534dcdd6b3ba78db0403cf0219406ca858fef6bcb259fb69c53c6f964f450bcd12997955d0190ccbb2d9ae6b3562d85dc7de2bf1bd5a8d49651fe5de73243d7f89ac8796387e0a04c74d5834e47afb6b7444df7d27592fbfdeca72428582703ae52aab48c1b587b12fad6c887e451a54ef81481e3d8b4da1e3fc09404a7c209db8c880c40b3fedc579fdf19f956bfb36d5b2d1affa0a3631681084ae4e41e3a0fed84e056bc72b6c0eb1f5449935f7c2d3de07a2a5fb65af65f91d2c1d730edb80b437cba66fea779449b68c557c5f8bc6a2581b6808a98a1acb9e6de414377f5b08fd5cfeb4806e8699e50236dc8100a88f4f55d887caaa6ae8ca09c23019126b62b5c3186b459c39ee397076c825b6e28ab62d8286743f9d07182cfc634eb4512ec3beb04ba81bc20294b16fb6d42301a74fa95f95510155a15eb953eaa51d82fc363c0c63d1cf401a3ccc0c577474f99f7c4f187316fb85e1db38dac1df4b5e7c710be5b5949dbb1925723d042944eac09dbfd74d7e876f5931f619bfba1ea9580bf4e",
     "6c2540fd68d5aa9cd21203ba207f0f62e325c1e054271933563063acb4d932eef201bf3312763dddf6992fbd128cb8fc8b7936acbe8712ad398c5a8719b9efbe0927b9f637f323c4bea80901091608ab76e483b5ef666560937705bff96d430e6e17b0b24c755de19bb88aa81077852c92a96e902d538b4e11b78a4b5d1f5669aacdfe5125d806a21c06ccf4980edee24e41b7e17672fed0ace9b19e4d55415d097f0b5874d60dbe311871abaf47220893c398d5595ee16275eecc6d15f39aa5e2181ad1448345406a4c77a34c3fac77b4c506cf393791d69e113270adf0393cad689a07056e388ea3bbd00ee5878e1120c869531a8b4745ca2debc1e008493d17bb3777992cfcaa165188b4801122af5422acfa0a1807a2a35e793ebdd95aa9e025edc065cf9ae85972a5f42da193cd9b653373a6e15d647b8d26207f3230e50bb49\nTAG: e2df8917d70683fb6e6ea67db55367b0\n\nKEY: e22480e24a29b2910b227930344f6a00916bb215e57e1f3155fa9437603fabc6\nNONCE: a4c6732e0887f40b5017de54\nIN: e46035c45b6ebf14c5088c5f15f552a4d233de7d3750d7736838a5cd4a7b41df1b71e6c5e6a7dc63519ec43bcb4fc603168352b8b8e261c15e76e73556aaffa32193c1f5641b2eab29497c80eb06543c1b0f1787bc616a4e6618f751dd0a2b28a87fcabf405e97efa91becc8ac1b036a2ca244e13dcbae589f0d6bf8e19bf91caff673f2a80de93a6fd5da1e63516e2760ca12a64c8175071de22b26ce72ff9e15e5c55fb253cae55a3f48c0b507bfd423f66ebdecd0b6227d0e67c4347f2a4819a6825dfc2651e97c1da629e92bed3827a15dec0f0c8743731baef8035fb0a790f49e5b2a7339485df313a9633496fd9e7a9904ec566bf20b8dbc0e3c1e4572411da7835b5eb5cd51313b78a1d6ed96bd9aff2fba37e86d475d95fd7e14c6fe8ab23645b15e7823b7bc9d0a02fbd9a43c05a6c660b6690891c4d055af21b50a5500d72c91695536eb1a3852caceae05803486c64535747df691ebc62e888bce8a5c820569b3d80edb4e29027e737fcdc4f49f6eae43b4bf68a5731fbd09778d6b205bd8b3ab4cf251ff31dd94f2033118ff0c4154c78af27570d12def873fcf4de7ccb6b6cc8924dc63f8104e9a3323ddd32006d8ec3aa530818e299490dfa0a9d811fb3bbb5f624f26dd7d0d7a87a7e7748af5ee4f4bbeb150ea4078b504aadaf92b8f9edfb701c6df7ca615416f61bd770d5fc6675db01394a26f585ffb8f86b254d0e08d0a0f5a499ef1b2bb0216e486229f5deb16d1e95332b8673652a86a6e3fa0e479987b2bdb1909fb772c6836d15cc57d97f29acf335ec1873c1bc6e714b689db855c8ba59289fe792d93774dd83313e3fdf11bfd6a40d6c8b57a5989e844cdf2fb38c239f6116c1c3aafb9356ad4b07ab37f7fb089cd424a8c1f19e5a13f085ec8cd74c3c9f0aefccd6fe5340eb1e419d15285b6b0d3b57a5545f6e28b75bf4795d995a20dc7a618f0f77a174e3eaafe221f8da0cb071473c507054243a7f9eee7d5c77b071602936fd5bc411e9923fc82016cf5345454285e9c1396696e05d984649a2955d7446a1d3966adda11bddbf3dbc11e093c15b7d4fa2a7a0c33fa28dd3242738d7a77775cbeb8176a6e9a4e4e58e03f631a67c3229d57302fe5967c7e3362ff926fd584edc32905a350b390391f7fc3343f22498bd198ad56cc2827926b0c4700cc352bb990876db7c17e2d32b5b0af617554a1f76c32b94cf7728e89bc208f22e986e7d2faef190f820918afa4e08cc46adf0704aab761cbb9791aa12eb31a7785d7716c3f0a46afbe2a44a52e5d0944fbe207ac78d54c407679814cc03d9c9ea28f1e518a10e0cf034d1ffa27b67c9f027d738e0a96a381571bb52afe2e983b34f9159f05d4ac9973d996c4612b7c60407a66925068fd98ba6b7742a219d8bed4ceb720a8541f4cd9eb990384f8f8698515ed3692\nAD: 8eb26d00d61388ca0f06d45cd697e36f11e25f618eaee0562dbba21d10abfd0bbfe232e6efca4947adfa7fc59de529652d11847d3cca84ad147f8905bfd0743be43cd21a9ece92d2d7397f74b1632ec2b1e398565e3f37039f1e147c061b51d59eb31bd16bf830b7824d1ec5e79441e5c5e5131062171467a037c350fd16f58854e3dfd9c1224d26fd600b006d4bcae123a7a9d4e98c47b9e9e3fdbc22abce09b3c24a5a060e371ee70110227c9a8b6049f194dc4f74cc97d01247d76b460774acf7c5d4a8fb4f01888e29ffc517839c234836cf513951435f226e635ff8b02b18225402b026566e951449023fcf7f6bc2285dac1b7dd83028697dac70927db01c22921f6a7a6304052e58c8e87819bbb75de9cbe6239cb1ae8fd4849eb4f48759aed59d5a0ec3108b3131b0b74a4f860e37d02e04b9501e5e3c306cb25820abc50cdfbb05f8e5e2d2b94c58190c5d950f804786fb2ef97eb013f6f049b38fc57561b9cdfce5ae30516050d13d0ad8c1d750b51a552520785a9dd03c68203d91e72e3bab17cd67989bd103532071676718e889b94ee12856547a6d0a6c88c236d7fc7b0d8f222592d00aad4e813f8c738bc10c0b1fbf23bdb2baa56b1047348ed172a15dffd0bab088e2b406f040ef81d3362d0f86d129fde70ffaf87ef3c4554fa43850d1816407b4d5b0459bc622414a2d9cf2809e60e467fde6ecb7f4d9\nCT: 98763c2423882eb5a1e9075920b2245f2243341f6dd2dceae7780aa738fab65c7d86f41dd4a64283752db5e86cecaed0ac1afe966171e94f2c30d63a93ff11343ce15ff3bf464d88a6912fbba42c08e6225cfaa63c6da17a6354a34362fda3d993920050dfb99c84a235726aa4cbd66260b0e5675bfe89078e33e76ef537d2071d5801758c6cf07557c0e8bfe0a49aa6e212d69617d1a22ff15a26ae28f4d724d6b537ed34af62672cc9d48836f284cbc7eaae8cd15b46b8e233c94bf3036713f2679e23e0bd829dde5b3a5d7a2d65193f55a45def3d52830cfb1ce3f8208c1425d8171a053ab076c2377f7c26b37970bc3c937db75181a47467b9735be331a0f30a7f3ae135a533153ecd0a5e0cc1568e303a6ba6065c0dca8162a33df7c5b69542938c88e2141e2aa697c48e72ec0573065e9d9a9945cfd070d45218f646e5cf0c0ba145ed1fc7b7cf96c64e3a4671eb6b51ac8eb79bf0b4abd56fffa2ad8a93c001e2baf0b65e257782d7b7e3a837cbae16d40183a8b629467f77f2c7f8640da57904ab75a642e99fe4b45ba7ee488f889b07ce7a4e74540c3e0e0e67f88d473509295a66e27d4ebda1d4d3313add2555477aebf7fb84edbfdba18afc6f04c4af6a90730518a8ce28c12ab90921c413bb822e63cae113e5254039cdcad2dbfecfd97c183679c6c4691c99ba771b1389384259b966f358f871343b4bc5f9a92d8f27588202ae1269658ed91bae33deec6a6a35b9fbc523cc11cbc15024f4dd386b8f41c3fc7097d717099e722e6243a13bc475d5f2b1b2569f14cae6710c8650bfd78520caeceb035f58adae811c0fe9857c8cec59a01123e5eb2774190943c2cc7d535af77ea1f79cdce94e23de21004c73fb8469c230e25fe245c8a5a6314736166a7fe4e1bb0f91ee8d60daa0e576b9b7c6b5957d4bd8d8b928d36aa46fbdf742dd602f9cda2ed1608255d6dc962cc6d3f270d6a42f5185b38e6f0085f39dd17260f0580b62d49cdb668e3e5f76d47dd1deaba0db5b315ed6deb62e6e4388a74ff21903d7bed3c3e87585675a608668bc031aa83e7546cee77bacf9d3f5cbcf00ca71d6f6c86751a5db0d7f7065324d33458b7fe66e2b63bf9d8b514006d14da70f0d64f171a7bc11b2fa5955b85090701260a13cb52b930681e10e9daf89bdffacb9c13b9b60319e3be0ed29f7b7d4723ac5af888375c9e23bc97d3b189ec778eaefb3e4649d1b1ea96979c8f004064abefdfb3479e924dd974ff6478beb1034124b1cf27fc739872bd24bf257df2068475f0b144e61411481a48739e2691e535b64066acce2e0fee9c239c4015014dd38570b01646bbe97a389a3604312f06bcf7ae288790b73434288ba0c90d7015bc1bbcd5a0fe84564cd6a692df04d53716bb96d769074d758bf1199f716cfe5c4c542f9852435fc9675a80b4d\nTAG: 9f62d794a54433e79c71a5a5cc8d282e\n\n# Counter wrapping tests\nKEY: 0000000000000000000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 000000000000000000000000000000004db923dc793ee6497c76dcc03a98e108\nAD:\nCT: f3f80f2cf0cb2dd9c5984fcda908456cc537703b5ba70324a6793a7bf218d3ea\nTAG: ffffffff000000000000000000000000\n\nKEY: 0000000000000000000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: eb3640277c7ffd1303c7a542d02d3e4c0000000000000000\nAD:\nCT: 18ce4f0b8cb4d0cac65fea8f79257b20888e53e72299e56d\nTAG: ffffffff000000000000000000000000\n",
 };
-static const size_t kLen15 = 64853;
+static const size_t kLen16 = 64853;
 
-static const char *kData15[] = {
+static const char *kData16[] = {
     "# The AES-256-GCM test cases from cipher_tests.txt have been merged into this\n# file.\n\nKEY: e5ac4a32c67e425ac4b143c83c6f161312a97d88d634afdf9f4da5bd35223f01\nNONCE: 5bf11a0951f0bfc7ea5c9e58\nIN: \nAD: \nCT: \nTAG: d7cba289d6d19a5af45dc13857016bac\n\nKEY: 73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e13a\nNONCE: a330a184fc245812f4820caa\nIN: f0535fe211\nAD: e91428be04\nCT: e9b8a896da\nTAG: 9115ed79f26a030c14947b3e454db9e7\n\nKEY: 80e2e561886eb2a953cf923aaac1653ed2db0111ee62e09cb20d9e2652bd3476\nNONCE: 5daf201589654da8884c3c68\nIN: 96669d2d3542a4d49c7c\nAD: e51e5bce7cbceb660399\nCT: 4521953e7d39497e4563\nTAG: 2083e3c0d84d663066bbe2961b08dcf7\n\nKEY: 881cca012ef9d6f1241b88e4364084d8c95470c6022e59b62732a1afcc02e657\nNONCE: 172ec639be736062bba5c32f\nIN: 8ed8ef4c09360ef70bb22c716554ef\nAD: 98c115f2c3bbe22e3a0c562e8e67ff\nCT: 06a761987a7eb0e57a31979043747d\nTAG: cf07239b9d40a759e0f4f8ef088f016a\n\nKEY: a6efd2e2b0056d0f955e008ca88ca59fb21a8f5fc0e9aa6d730fbfc5a28b5f90\nNONCE: f6775dca7cd8674c16fdb4ee\nIN: 5dc495d949f4b2c8a709092b120ac8078cdfd104\nAD: 86a597f5e2c398fff963fcfe126eae1bc13f097f\nCT: 04416e23586ee364b1cf3fb75405f8ef28fddbde\nTAG: e7b9d5ecb2cf30162a28c8f645f62f87\n\nKEY: 8d6ed9a6d410989e3bd37874edb5a89f9ab355fa395967dcbbfa216ec9ce3f45\nNONCE: 55debbb289b9439eb47834ab\nIN: 52939c7416220822a77435a46687f134cebc70a2f1a4c33d37\nAD: 7790af913d84a04c1b72d4484ea2e09fdaa802d8b1733b8470\nCT: d7bddae8929ed6bbc9ac077e2415d9fbafae4a0432f8f7eb6b\nTAG: e6383b16ed9c32521dcaeef3a7b9b67f\n\nKEY: 525429d45a66b9d860c83860111cc65324ab91ff77938bbc30a654220bb3e526\nNONCE: 31535d82b9b46f5ad75a1629\nIN: 677eca74660499acf2e2fd6c7800fd6da2d0273a31906a691205b5765b85\nAD: 513bc218acee89848e73ab108401bfc4f9c2aa70310a4e543644c37dd2f3\nCT: f1e6032ee3ce224b2e8f17f91055c81a480398e07fd9366ad69d84dca712\nTAG: e39da5658f1d2994a529646d692c55d8\n\nKEY: 630b506aa4b15c555cf279dc4a7ee9add213219d2c68163ceaeda903fb892c30\nNONCE: 79eca200a5cdf92b28be5a7a\nIN: b12e6f1f8160cd65278c48f68ad53c8c82fd17c2c39bbb109f077c17fdcb8a0b3a5dbf\nAD: 46cb18593b3b26ba75e4cb20a252caef31d00be31093d2369e93572a393d650c68313f\nCT: 9a9ad1f78b4d411afe450d2e46347a7df98f39daa4fd478b9ab6e6b417878bcd52743a\nTAG: 55453a003b021c8a247379cdc4fa6da6\n\nKEY: d10bb6641e9ba0a3f1b016317831ad4232f81c2137adac0940ecd7fa36de0563\nNONCE: 99c922d37c95ebeda8e81ae8\nIN: 8b9089df5bb048cebbe709cb61e178ec768515a0031288d95b7cc4dfffeb51b836e126a237ec50cc\nAD: f1cbf6c83493b2087d9f88e02121a114f45ed51817e46ffc0b66a783350eae89c6700db3f3be5f4a\nCT: 8a838c51a8ef8134481e9951033295ae686624aa4df72f869d140980347a5e69a6d7cb3d7119b303\nTAG: 9152bef766579a3e9a1e36abd7ebb64c\n\nKEY: ca665229adcc7554f1b1c8f50e7444c6d4059c525f9c0da1406ffb35d50cae97\nNONCE: 8e2df19123ce0ad41df416d4\nIN: 12365eaac86b270e9c61b3ae7702a6f3583ef4accb80a98454c56e34e2ab97d8afa23ddee34e7e3a522497f985\nAD: bf539d8e9e3a02f3e5834970e7efd40cc7cb340a075041428d6a69ed9fa5105e4bc63720be9a7040ce5b4af6e1\nCT: 96027efdcd4433df8e7f6181c05be365cdce550b09d45cfc96fe258eab6d55976a9306a0070c9589ef08cf7a42\nTAG: ec9fb5e79cdf8ad4c8a79c900975159d\n\nKEY: 5033338bf7526cca0425f4a620424662ebc58364c8d985d130e525fd1f598f3f\nNONCE: b40842b30758aa3eef7cda62\nIN: 69a62b8c5f9b81cebee3a9345f4e49ea089b0d9c1cc57b4ef707956d0287de83fcca6d8f5270a9393e00693075028189bda7\nAD: 3efe0ed6fbafa61070388abc59c0d06589309736b02418df5534c8c594d61a2afefbee17af8283d01634b6ca3e8e2aeadff8\nCT: d6184677a21978b6443d99d7de1fd01c6b6334cf01b7e7d58456267453f4de96708b62301172c8c87e970f91c5301e0ff61e\nTAG: f8ac7aef208712845d137b8b176c89f1\n\nKEY: f33c39140999a2cb69e43129cb5df18fffeb3513ec3560792e9909784daee43b\nNONCE: 70608463f1dfabb1fc4451e9\nIN: e2802c4d290468177fdb031a717345753cd7c3028ed07dea428db84e7c50c3eb7b24f7381a167b4ee31bf88dcaf5251fdb90ecbb74ac2f\nAD: 10a6f463dc59d4791b3c2b4c93cbe2dec579a154962cb2c4cc77664e8c2b106c574fe115fd43dad94b8b1bf2f74820e28435b4444b2b82\nCT: a27419a46037323c033d7cf2a716777fedc02a5ddd8bfbdbca82ffbdea3037bc1cc80df7c5e502b32276ae88ad6fd0f0cfe72604648812\nTAG: b1ae330d47fd399aaaa687e141e23fc7\n\nKEY: 2121056225a7b2316a93c4bfeb970486fa9c586c14ba8b40be5844a31e9449c0\nNONCE: b4b7d1e8fa7d0e2334c92315\nIN: 2038e2c6cdf5282f081292448f8febbb60a1520fa3771cbfef387f48c5915a1438ab709628e8d4c81623ddbc2f6f159c3c9a8922905c4994269898b8\nAD: b07f66508a39c4932b04c16172d6462d78273cd9463e52284bb73e3b8b8e7047bdf10c5ace1f903e5a5eacbf67c9351f82c74bda140df2fe0480c80a\nCT: 7b54618ae09b37ee72e51873c82cdd20b6dca37c334af89548f52f34df3a757e632cc0d453fc97270898eb50ce2f2a98c4cbd4cbb22a5b7c7564406b\nTAG: de3a9e2aab2439675c4f7f0b61216d5a\n\nKEY: efb15235bc91771aa32d51472877b0eb364de2f88766908eebc6e6b57a702099\nNONCE: 1a510b42dc20d1d0fb34fb52\nIN: 4eff604dd4bba67f143dab0728b8597e269d4e0ecb4ce80c9850afc645d96da239d9db360605bb4268d74e1fe3431a44242ae862fa2340c076db13315f615b85f0\nAD: e8dad34f727e77444a96cf06425640f1fc80fe3b01dafd1d91476140afe8204286d01b0ebdadc0270a3d218516ff5f08a69a7ba251ac325983caccbe0d9e1de359\nCT: 989fef0145e2fe93b9f99fd90123632d83d9df8f37d8e1f80dac329dbe0c214c2191009e31232538fec63a29665f0fc1c77dc86b2f5f2050b86b3ae48e85d63116\nTAG: 6816304faeb45da4e4772f5c35730f8a\n\nKEY: 998c22912d5687fc3faac262a902783fcb0c738520b5c4135a8dd2cdbd7b0dfb\nNONCE: eeb535c5bd6edfd696655b60\nIN: 1f6ae10d425923c882b7d2f556571acfc10333ec665b07bfad9f8948a3b8c5e5f163a4e99d4726da1a35359c657c848f327b7fd9b5f61987440ab12b9399db24715715a2d1c8\nAD: 9a3c76dbaeb69a6481a89318caeb6358267ef51a1a364a48387bf77526837c9c70afb6f105cd47d2b976dbda7d2b6bfea7b76b135810c53437472f7b80ffc8ce4dc95c7e5045\nCT: 87f4e2c80a4f15f92a8e94f468e70fe7f0e0f83c0a7799a1d465043d25210ac6f0f39a5e9765b4daca637864d1bcc090d2ef33ddfccded2d2dad61dab443b3cfcc683147c490\nTAG: 0744d928a5b5ec95f3087cc2623f0031\n\nKEY: e12effa8da2c90a5d35d257c07d1b467991bd5f75fecd7129aea4e26b9e27ff1\nNONCE: 4edd0b4cc349d37eb77f5576\nIN: 21dc87984edca46a629ed95ffb04471397da8806c525a781d9a71818422e344e4af577f38e7cdbc556d4766770a9a3c95bea59ad497fe0127816ec4dcecb6b999486719b0b86cdb2c9d09e\nAD: bc158e6570fb0a08d73367dba65b80a8c8e57ba6c7b99493ebdaef0424e18d8ab1f7c88670cf51c4d91b77eb9ce0f89a46ed1316141e4299ec6c3d6e712ec9e92d3db44640402aa4ac00ba\nCT: 07ab8c623d683ff83030392e2864edd4b8e3d296d60579a226a8d2aff6bc5af3c4598a18cc1e8d7db4ac8eb56a082af864ac52a324851dd29af51a0945cee4bf303ea111b9b627aabf5ff8\nTAG: 53e69b7be969c39560c016c6bc1aa4e1\n\nKEY: 3d9723c9235939df8647529b7e4a57b8536476d5b71b424e2c27ba4d0b82b0e8\nNONCE: 60163d2eb7822af7fad64c04\nIN: b44face0f45e4a8da19aa0c5cbe3aa960ed6b74fe3d3d9201f52523dfe7651756b2ce482e759c87bde4ec670a0e808fb4883e437c7cbcf2f6470352174327824200cb0897edc4def1736f51e229addaa\nAD: a4b2b7bf36a70a5246feee52c474058100bc618fb0e3d32e8c1f76153edec47fab3045dcc7eed9ca1886bb2593703c9ffb8883c45386d2f4e3fbb0b7c722d19f2eca94767174d9127450549e8993ae33\nCT: 66fa63ded066ac67bf218af7bc21169a875f4bd695f44fbdff906f0a9b8a067be721fd260571c53a8b51661c8d49fe178dcb28c31deb3fa71b096b387f9fc8f3657d280404c05d2b6443eba7e60b562e\nTAG: 59d5450872510c4bfb590d9497524331\n\nKEY: 75b0a20935c4a5e2126ac7420d632bfda8d41bc947c2402bed4759b6e617ff92\nNONCE: 0c3edf0dcd1125d7e263b897\nIN: 8edc98e70030e40bea1548f6f56b4561272be0c333f3b7ae53ff3e27c35a91b1aa42d39e6305ec4811e75931e5cae2261d88a6f7d6c5b05bfb48802264e9cac782411f1de579e29d464ba56840b126a3fad07f01c4\nAD: 7e35081ef652424da6304852243ce43ff711da17f7881d5e0433b1ad7535e755a8531b93d67ce99ffe66e59fbb24f6b42655524b39f2c84daa5cdacb5e7916266c05711a118b2128930b95de83ff1a67e53337474a\nCT: 858dc74dbec6fdbe4ef15a3596ff7201c8f4fcca765bf5452f678b1493a66ed9852a6fa174a73099acf951a35699f33289ec50625538c01eaa456dc658013a29e4d133b856eb969c1f221f99e11fadc98b0ee08243\nTAG: 3d8f17838c4fc69f04d7e2b76eebbc0b\n\nKEY: 7a3823191abcebadb7970d1b65c2a8dab8a908151737bd5400b3b6c0d59e3b08\nNONCE: e32eb00e5106097e2ef0e8ba\nIN: 220db5400dce604adee4cb698cdc02d2ca61622bbdeebe347b0bfef55cc45319b940f93773a9878725c5f55485d7a26363251b9ce0d3da1f8f6e34ad5329dc9f752ec7dc12b2d259ac89a8059085996a431a56cc2dc2400a26b4\nAD: a83b6dc78931cb7500eddcf77792e810c1edbd5f4e33f85018807a8539a3cace094fb794fa9ea058e82c830d42d5a6b3e22b7785698774aec5c73edd92731c51106a23c569c0c0fef18d13da1562a9a42aa435b243c4fbc9fe42\nCT: 5ce6ec0e1d67ced5a6aa46c909b9b8907b372be03331dd0940ceb6d87e928c14a1a1e8ef9096c9b63ab4cd93242ec7be7e38b80643f9c52e7e90ffa06b8f2d238fa63dcd97af74ae37802d124623b8a272e68ca18b3432b7c017\nTAG: e21c61d604253bc5b5d58283756b9eb3\n\nKEY: 53ff6d",
     "c0af3e89fc2de7370caa433f539d068609fcfed6400a5b9fda4c83e3aa\nNONCE: 91a824c5e023283959858062\nIN: fc23e07b4018460279f8392e86423ecfe465b25b60382f58995ef5fa1f9ca235e4bf87112554aa0e72836831d7b5f39125df11518b8aeb1809d804419beb05ae013482213012e4ce980ddd1c58e11608b775d12b450ecace83e678c69d2c5d\nAD: b3a1db2d467780480f166859e0e7aab212738b85e88237c2782496c9c503347de02f3dad6bfc671fda71a04ff1e4661767c11303daa0c36d944346d39e3e29ec63d695cdcd83b2b57181582c5ac692b13e4299ab5e86c59d09c2dc6194ebe9\nCT: 88af588ec33bdac2cc748a01ee3eec97e5bbfdf69de1d66176f42b66383bbffa8b185cdedc25b11a62237d334d68120fccfd68c2f9447b3b8e1f623f33f7f97ad8815d29bf11bc0c65641ba8fca4a087783f4694fb1d574450191825f84402\nTAG: 2c4973323e635a885f78ee106eddf19e\n\nKEY: ca2b4d335598f26d3d3607e62b9ef853d3543e741350f92f3050894721d3d450\nNONCE: 2431b5cee8c3ecec4caad278\nIN: 75e29e46350d1fa99403b1e5baa414e41a8e714910f313f8e850cf3076508ff650011af766b51283fbd5626166d775fd4b4cb7124d26d77b41eb17bf642bf67a34c1caf0fa9b43eec12103f864e56c5ccdc81b89c1a35e394362688d05dd94eda3d05dd2\nAD: 31c3ce532bc1bae65b5ced69449129b112019cc6078268b853dd17c41832ecae07f9c6b068ef6cba2b55f352904afd6096ff8432081aed408d9340c319fd8e2029c389b6e3a4bdc38853444c3f7be9385ff1ca27e59c43b542e99799bb4ce56b8e26d6c1\nCT: 90c13ec26d01b7b96bdd6816d3ee57df57efeabdb15ba602229ff71d71793fe8081eb1b462e8b2967bc4af96fd6dc72cee3d2b6495c7f04c9068b2ad0b073e11cd5999df541ad705c6315eefa8da49c5dbc258f7ba922908489c1ce672971c3bfb6e8482\nTAG: 3a7741a094be92b838850c32e4b06c6d\n\nKEY: 49fbbdb5ae21cd955be7f7603cb8563ea0b02b77a9ea14016baa5cffc55d20c9\nNONCE: c0a4463350506d2af9e35d8f\nIN: f31003aaf5d8fd6261c01c5bb1e7bf6af248e0be3cf8aac67ccaeb0b7468a40d98be526a8e4f692dd23763563e601915ebcb59ecbf03bf9c665c4c5313c318939a911888fd427d5297b9b2fd91dd33eb7ed38e2f0f6ab74ec263989cdd9915811a022d4a46ed35eef0\nAD: 17e01af2386531ce67d5bc3325d8f83b53a87b38f1c305f99c0798380a7e59d3ecddf33a5ad23a82e33f0fa34eb2438b17e958451439774ab642fafd3794f80a0ee1b9bc165f32df705a6175310670ba54af3a204e446db35170ab02670086c47a475c22d1f14cbe44\nCT: bd661836d1b74244baca62d7d1cb6717e17e2fb0bcbc8d36b3265a983d557c562b0be60708499d0e7e9626825bc049db79a0ef4d2393fef6024d849089455e55693fd4da3d910eac11496492a645e4376855732765e1b3580461a2a2533cebb482736ac928cba175bb\nTAG: 4596e3802109c899f27f6cfcbdceac5d\n\nKEY: 30d0e4f6425e38c92ac34dcaa06a815166f301289ca9cb0ed08156617d87bdf4\nNONCE: 525618ac9e317405c7d44367\nIN: 06f2204ca864dd3f7c9d0290f6fe3d0337eb9442cd5d2b586d1d5c30e58951fc2f4e99831ac7bca4356db4609a0428c482f2580b9e8cf5fd00d86d474fd88ac3b2413f44c1ff66e59e7538c090b2444396f02004ff636aca05ec40439f4e3f470a24916fa4033cb60127223addc1\nAD: 23c1a3e1083904f7226be7242027abb7af9d62f1115340cd4a57611be88303955cbcbeba44eab5488c80aed3e063c70cb7bbdd9ac289c8c8977868c3702be63d0358836838a97b31f6aee148f2b8615ad7c5dc0de7c48db7752e5f1ae8637f8c70335bbecf1313ae1b972ffb9442\nCT: afe3e71953bad46ad28113b7c8f2092fdebaeb81626bf94bd7e9dd59e000e8ba31c1ce7f728fe19dbbb42322e54aab278e3c29beb59b2d085e65cb8e54ea45d6a9fb1f561bac0bb74afe18cc8de51abf962c2fbc974c7ed54ccf2c063ff148b3e6cccdaa65cc89ab19fcd9cd0436\nTAG: e9f5edea1fdfc31cd5da693b50b72094\n\nKEY: 661309741227606892db13ab553070b456c5e421cca59087144873ae6d59e590\nNONCE: 9f07692c017e1391a981e70e\nIN: 40b5f8081b5dd173203e02e90a6c171fc41f804b2903ea18109edcf77c03dba687b47ca389c55389bd7b0ac59bfaefaf43b5f97065df6a5375c1fbb95d95cad589c2a45cd9e1e7960b1d13622440f7180aa565863b4f9dfe26ed336ff4318653e1a520bdb830e01db78a7e598f251834d0c9bb\nAD: e8540d084f24b80414af554f470048b29a5af8adb2f9d55c9759e5ff1595ca74884af67027324587131d90c77ca72b2d15b66564549ce93df7f667d0218a6e874848563a33886c6a0c5a9d00fa435dfabaa9053243b4c8c25779a4dbf79eb4b8530a7c7bf4263ea824713a90cee92dec78c449\nCT: d543f49e6cbe26f1d8a6e058769d5b16e6f8255a28b4d73ba2cbdf664bbc5ded73f9dea12a11b86b6a6acd578f685afabc232dbe9ff8431a5318ec7f0202959a310595b147353a7ca89c9d1fc2d2b92ea610cf6d9ad2716df2dfed70f5b74d498edab114058c22c96873a2a64abc254c82af46\nTAG: 31a8441886d0e4c6bfcd6d74f6a5ee5e\n\nKEY: a248b0d683973d205ef2d3f86468cf5a343d6ad7c5aaac0b9b6b2a412eed3552\nNONCE: 8f62ffac4027f4dfeacf3df2\nIN: c2d7d29256832def577392acb9fe4f249eb4859025ea55cc0c4a67806caba3e1cb81bc7f5717d94e1c91ff06607b23c238daafcb0fa96905616f02205b702508970fe3bfca87270ed1102a9ab96df57ebdcfd86ef6e9c4c4242b4febd82b0220b0d6f76d8c2d0fba33ca49279907f6bcf7e8401d1419ed58\nAD: c738cdbde6dc277ab81dae20fbbb4a50d71bcf0ac1ee0ec6a39747ccd87be40b1f0f2c37f2c6b32ea99722979fcfddd0ddc2e4ff34a2e6113b591cbfda317c6f4b021ad30325276f8d8dd78f757618b53297fec091f029f9b00850b35f3863a3801c882422b318b4a1bdd89002f928371ea05c6fabcb1792\nCT: 7a837df292ad2e58f21b89da43a74de411e1746556fe47db55a136757513bd249384bf67887a5c1f605e7f7e3057596e17039701ea351e5ccaf0fd4882559e87197144632977cf07cf9e86784a959fa7399476a4fd196d7c507fe3876d759e2b37bd37edb3c12b89716f29ddc8b64974263a1ec1b6364b0e\nTAG: 291098a2376a0faa5da6fb2606b4f2a4\n\nKEY: 80634a8baea1c4fe5dedb664c9b5d714422dd1726d642e60d15e02364195206e\nNONCE: 725ee5023ae08fece15d621a\nIN: 4d1d8855b4d155e77bd1bf34b3d049ef09b2b94f4e604306406b015a2d520e8772b084ed668b868e32c7563085f2a82e7d99219da549e507aff9515e45a045c7cd5292c0e09a3a38c769acfd0a11826b27d8bf05184971670200e79c49754debbfc57d9ebc661b25f22f241c4d143bd922f7b0981a48c6a63462cb5cfd\nAD: 12b3fa94a64454dc5b47433df1ce0a7dd5e8066d05b2433c6cbcb83087bb7d22d153a19c05aeb76141431c5f9801cb13531691655939c0c812611c6a30083ed3ec27e63e6868f186be559c48367a00b18085ffb8c7727638e833a7b907ff8465e3a01d654b52432767b18b855c05a9cfb5d4aabae19164f0dc2ca6346c\nCT: 6b01e934916823f391cd0d2829c224a12eeddc79f18351d2484ef6cb5d492ec9ec4d8c4bd3354f01d538bbd81327f6360a7d157feee64b539489bfdd1be4d7f724d2a6dfa1af91e4108dbfffd529afa71388b07e5079236644da289ae236100b2fbeda0c17bf2a01e76cd1f88081682c2d074223fb8a41d59e70a37870\nTAG: 55762e95d897a33c4c75106449112986\n\nKEY: 4f2edc967b11983f05ef5ee2a4364039ac02dbcccef3f3719913ae2719c8217c\nNONCE: 255f8209b0c67a6277bdb42e\nIN: f8217163bcaf77c1383089e396b271e22c517e8ccda244256cc39315fab7d0c291078d90e9b6e336992f015282caa1ec0ea858a179c9735b7a2f0d50f6f1eecaf3b9308772279ebb95f8aa53826e9dd60fb354de0c50c10001c98812b59d7c0f36daa1aecda6782ca36130fbb559363fe07704b0b91ea85be319ada027e47840c764\nAD: 1dc7065f1585384b88be47598ca484782716c78f49b3b6bf5d24a5b0d24fbd7831f18d77d80951d2c4fafb6f939d46362a69b558afadb3bb4d8aa27f7fcf3dd9624e1e075fce9bb239926d51ea9dff03619d64d5828103a414e360adcda8fd864fca55c21df86c76972c3765ab1d68ce89f708e7e5a3e06cd4de08573cf750c6f5f9\nCT: 6719849b7cea3f7f2a8e4de13d7a864d581b7c638f49fb06378a768d2034548179963c33f0ad099254c2edda9ef771daf5d299f58850033e2e449d7bc21ca3f7d3b7408429b596da615c8582886a6d8c1a9ba81fec4a41a38b7cbf1a80ee0ec8bd71451e727051fbf2a1d1e3c6ca98ee113e47650ba4fe80451e79b04abc8bb99a2a\nTAG: 2ac7f962553a8007de3369c7795bc876\n\nKEY: 51c5cf1f0c76ec96f4a5f9aa50a36185521f3ba259145ac6cb4da3cd12467696\nNONCE: c751e5e7e3d75874acfd2bfa\nIN: fcda42cd098b7936f4bebaa37d5850cb0fdd6526966b1b5734f23d5050ee44466627576e1144957929123198e40b64eaef74476870afecd7b70f7583208603a1b5247074c6c77e10b9bbd41a3d468ff41db89895b0e9ca95be77526ddb30d4c5eb0796ba97d7d5c56d0eece344dde3ebd7de586226c00da224b04e74d9abe832686797df067c52\nAD: 343ae5e73fd1da48dce92ba7b86d21de0a203ba8587536fbaf4646bc45051a7feb343e38916f6c4c75b65f940045e830857c7b62b34a44622a36b34268b8a397892ed3e4de5df3fa7384d4ca50202b5b0833f921349c877931f4b735cec45db6b95410c8042ba49c1a39870276e0165f09c73b14bdf7f36d19084f958695c7ad2cc56f0487eae9\nCT: 04192659d6a2f1b7be472372c8f969a7de388c97d37b4a89653593e48b630947d2160b569379698e94de49b21572ef0b4dd330487a8be814a84e959a1a8e3cf33dcc9f7464fd44814d0cd7ab85e4c01c9d015f42ce3723c8ef8c311222b0c78eb83d81696c217992be725faf27701b4922c6e6099442787ddde2b7572500a5320a4d0c787b786e\nTAG: 23c7a866574976dca8f401c4b5b58292\n\nKEY: 1cec3efc0311d623f34b6853b3dc97e470fa728cdfd65993d9d48fdc192b28e9\nNONCE: 320fe742ef171b7b8cb615cc\nIN: 722e503a97166a07974dcbf136fbaec6c03668fa52495b040383433ca59f6311103f2fc6a95ba4c925f8637167537321eff6949aa3051269fc094393a7b17d1ac8d29af052760835665b0ee89adda5dae7738656af9e8513c96e8a532a46ef34cd7430832d2be51c586a14e9aaec2458c1911bbc0f90b496737e838a12ff37d3db058bda9360d7d33e11629a\nAD: fd5ccf6b6948c3eb96543aa40f107fafe94e5206c326dd8900ea510c6b61d1bcf746151a75404e31406c8e991fbf6e660db7c18e243fd2608aa22dd7ca9de88f277037661ce6dea4ff0a86809dbfe1708cd47d3061a34657cad143e6577549c9944e08",
     "1f79c276300bb406378b26f349a91fa87de02a1405d712c516ae11b4bcf30ac9d56e677d03eb33e3be\nCT: 363c1d6b806a6d97e2fddf53b242378e1d2b818828863fbb3f856f7737d63998a84e02d6c91e1df5f5eb6cf89f7ef53e16d10ad52f82362292d3acafaa02c23be7da7616a8b8daf8ee3ae74ee1078742c4ddc3e5a110e510417b9f43fbcbb00e17af3301b2fbcb784fb0a05b66469e771fbd78114fce3c4352c42928bf5a0ecc49228a3c930b0790bde7ad7b\nTAG: 669482999be99149f9b723b60fec62d3\n\nKEY: d3465cdecaecbf25943b7bbf8084ccabc15474a4228c46cbe652a99be24a861b\nNONCE: 04fc836de3a1420b8e7136ca\nIN: 81e0e984ce0a4074a44524f93e375eabc650a847a42393f5c524c65523368d38a7e2b677fe08502dd3bc42311775016b5689c660cc0ca8cb33a09b89f3ed3d02fa0fb75ca5bf0dc3c27c546b369ab5e7731f93bc074d37ee50d6f8366f6c8a45f73ac92b05c4aa552ecc5266041dc122a0df69a36ad625a26edb57bfff43a84e527ea0d9d3cf076f8de9eda28eb09de3ff\nAD: e4adc14ac4bbf3ae7ec7d97f5c0e6090bf8127a75e8b70e9b86496a62a759dba5a4eef64a8c679c362785501260d29b58e1af647782564947950428dbf14edab8e6841c7afaf9e7949b560419c44bae30315c597f6f6e02204da7ec605a4d9a8753de1268bb0b1c84c972b4e7296da5c969781feeb35a44d2aef799ed228aa399ea04e21cf9f7d5600a2c07b047aa78388\nCT: d7995e7b610eede708526c05c584039d48b9b4356fc71b0c37ec2559309a688a7c69ac9655f94e178cd2311db58587863b0fbb990554dc9a6aa849571f945c61e5611ae7e1a96903be725a1aa75adc381b86e43fbc68a36f44e0e0cb8fe5c494caa91f758597b6ef3b80a879154cd8a7e5f570893b4f768105b24b58efb67c5f07c6db60e0f48eba9563f17d38aaf0847e\nTAG: cc3fe61642c2d7fcbd579048fdfb19ec\n\nKEY: 1a0dfe2a6bc6a69659c68942ad0858e1df905890f47dab728ab9c73f742f469f\nNONCE: f8f76b014116ba61392597de\nIN: d93eead436e835a061ca061e3a53c3f9c66c6f011b21682b8a6fed098bde2018a2462aa5ab542c69bfa2805612cf6146c9150888b9720db1dcd0f359c1fa3416df4cd225dd0b0d949e917adfb3e83bf5ba2b967d48908e6b6d8aabc545335014d951a67390d7b5c7cd7dcbcf66e4e3f02aa4e5e9cccaf73e75622bad006c63433d36cb1c6aa4aa253dd1b2eacac75c548aa6648ecf9d\nAD: 56ca2d5340629ca75de4e98921da352941559bd79f47ef0ab42d1d5857059352f96ee877f5458f090ca237e4eef5b08a53311c8dfd4c4582f18a93aaa8cf75080734cb2ea3389c9c74d2b04ead614eb54512ea93f0e3434e9a9366454b303a8129d6ce6cf96b1d6dd4f751311c736b517dcb50a6f6e0962c46637b4f5aaf0f34bff518cbd551a7aad3fa615708b17cf6d8fbc864f580\nCT: 8dc4d8483dc665b174ba32d6b6244da5f2a8fcc4b1865d662ec23057838b332a07ff073ecc893d413696f3fffc6dca5d107a5673f14abe8e0457a02e61138380d25e269686cbbd23cb7da3060f482f62bf80a40dcc2e711ecf5f7836ca14e456c4b73a48bef90749024393f5f8af01b73302e81bc37c4110dc26174702231d831cd14231905d2dd3f375cf2bef0425084d5b19f1039f\nTAG: 825e7b7e195f65c454ce9fdd637138c1\n\nKEY: 03cec87d0a947822493b5b67b918b5c6a6bbdebe45d016ec5cb6779c3ddfb35d\nNONCE: eb7d261a6b56a179c88e88ad\nIN: 2326102c58524326759ad399222c5b5a563cd01a29809d6aed4d49772a4723cfdf30c9f85f031063e838f543c201412d6f085a8f5435b0b2fe94659aaf70cf7bde99309239ed5b815b48342d4f81011f5aefe10ba105ac15601c64a91076c29c3cdafaa12bdd5706dd7305b48e923873cf06944b5027b210c59d79856f602bd6481980ea909152216756d77362c59d57673cedb91ee6f56a40061e\nAD: 4d0fbeb69c1869d2d23198ec49b3dc23149005a84aace7025293c3afb8cb2e38c167a822e25c2fdf667d3677f4e94ed6574529c987de506d26b7ffccf3b7a36d9adac48bca76084710338eeb5bfca9df1bf6b403e33e90761a0b3152afac333071a5ef4f54010b945d03b51f123865673e8877f41ca23359e60518f076cc64232b306bd858634417e92e546ede4ac6231635c9cfcf43aab1f8fc1e\nCT: 06746f993843901ce72f2fcd4af7d15e64b3102d2f9bec0fe72cdd0b97e43177a1a2238c9c1dfc3311f701196653249e767a73dbe819b660cee07a5f3bb8f25823875fb4b4d34a5a3a212d2e166311bbe11fb1d36f4e725c3b74054ed7fffb7082203ccb5e9d65873cb8a1ce28d5c6e2b6555c1a864a725e6c7d5555d37dcaf1d0884264be72d38cc4b65bc2f0d039d542c5055da56c57e084b804\nTAG: d36a4b6d2f592d4f0d347d906fc319cc\n\nKEY: 7f4b4bfa26719d9610c80ba3f474c43127f4aa3414fb070fc2f389e5219886e1\nNONCE: b144d4df961d4f1c25342d12\nIN: 638982b95d66ddb689b7b92e3adb683ac0ac19480148bac9db550be034cd18dbd10f2459c915e99c385cd8dc4dc6ec48b75f97e818030fc2d8fcdf66d66b80df64f0ca4af91bba83a74f3946b17af405bbbc6e216435641f5633ad3ee24c1a2ed1b39f649acce59ee56c282a3aebaee6e97f96b34cfc63d5b0482fec20d755f399dd5f61688fe55878713cc55d562c2d72236eb674a340d1a64932cdd8534a06\nAD: f2fe3d27bfc278cdcf16fffc541846d428b31534ec5cf51c30c8b6d988dc36cd6c0d41a4485a3f4469e92ea0fc7e694065bd8130c2854c95549630bd9cbaab2205f27a6efdc2c918c3be53f2d12f8f7cc8e6a81dc8be7cccd217be1fa2e6887cea7d637d2e2a390f50d2c5be10a32a9b380a400cddbdd40eac67f1fe9ba6033d4bfa88c563eaf57272c8a7052916cf4460f31ad026a0ac2588a45d082fbb5c0e\nCT: 0d4de3489e09c7239972b675063579e409acbb663bea76bee8fb3f7e8785158ebe1c26db9219a9b97ea29e74762999518613249c3a87fbcd0128f651e2db8e2167f10ab532eced3464b56bcaa09780e5ece18182a6e092477ad933bd8de015c80e67c6802257a97a647fe2b1e9ab6a76c1cbf7d905deeb824aba2a34095f84b276d55ff940d6ab788c16cd63d9b16e0908d718c851a3230b0a37257751df5a38\nTAG: 9f0a882d4456847f44c7287c8ff3ba04\n\nKEY: 9799ae8045d58250e4d9c3b0ccc8897a04b5b9fb164e54019dc58d7d77b65459\nNONCE: 0f20d002dbcd06528a23d5e0\nIN: 8f323018b1b636617c935791e1c8023f887da67974080af07378b533a7573424f1de9193c5d38f55e9af870f6c60ab49c80d7d1ad1f18f1a34893fd2892d49c315ee668c431f5f35e3f60ecfd534b4b09b64cc77cd16b0e1b8882872cd109a5ca377518e5b660d75052e9a4228e3935705b6bf6b4f4249346b7bf4afb891641a76621cd315cd75de391c898959be945ccca7a96073f2569f217617b08502f7d569bd2f80e0\nAD: 3f1e297bd91a276a4a4b613add617b0488414a57ede2ac75d10934e03be58ec518a418e98a4dbb39d2365889db7c5f389b2a16d8c702cf21b888a4cbf77b356df48a30298c825fb86128de45d7fa0e5f4b0b7bf82a2c4cad2470f33c231802263901fbda54a6edbf2df638716492157ec1407e7fc2eb6c663d9a215afbec3612778b8115e78a5fd68cf6ce66c12c0ca26e5c1f7ab079bc09c3bc7b673d21835671a13dd2a0\nCT: 9a5758dad7997a766db05d698b43fd491bdcec21352032cc023bcf10e136523219745a56f0360efee75a37de55da23cc7d8184a50ccebb110bcb960dcf6b25fe731e21f26290281d9c1c7715c4e6ff3dc0026cce52929163ba222f123d4f50e1d3cf67725fb4737f4010ee2b5b163ca6251c50efe05c5ab0b1ff57b97ffa24c98653f5c82690d40c791047a3d5e553a0142fa2f4346cfcd1c849a9647885c0daaac9efe222\nTAG: 5b85501a476217f100be680b2f5882cb\n\nKEY: a26c0e3864a7dd3b589d17a74a7c9c1f7e8f9adb4aafa0e75c083d10956b6bf6\nNONCE: b54a2a43ca3f84aef3824375\nIN: 6fd4ec60613646490791d82de30ded1a12e61fd270f1642d2221272dbb150ef63ef2604213e203b740dfc9c4bcdf722b3c85aa20abb1197949de710d7e8311956c8649524afc72a9bf5eddf0b284c7fc6d48a741b82c215a0dcd73bb8afd08d5532a6f7f99b5c6beb2ad793d6da53a81e6523b2240729924ddac996a723421f57125f928990daa7a55a5b6b53d7361d9728f66590d969659aacd9aa5c0ec627d991b55e9fd0bf9c3210f\nAD: d6d8b570eca29a48a4d408d5b27ec6aec291d70cfefcd02bbfe8d8ba8aeb6db770bfd723d2c3a4859f1992767d24e7b33e3e241874292af640e2bd22a5b77e0e9e1e0d5e485041cac41d4694ac929ae1fbc08e7591e1cef689028f5db26f95fc9e0868887fb9c635579fc6335757697f63b4f2b46664ae338eafdd827988c8f2ebad80ea9787871ed8d6b302d5dbf7e8019f2e139c59036cb5964a3701ec049b839e19e33e68b83539c8\nCT: 2420e09adb24098038b2750c946551a5f6a5bdf23b126947348ddb5e938b3fcb874b33fbac6407095e05ce62df999e7234cd2b4e413009c71d855b23993cd58c1e26ba0deed891dc88f099fdf852cec0aab45f488a90edd8feb6f4c837036945bd304edbf7a2737921a2f8c1b00a1daaf9e25b908a65a8f69963fc767bc975b5b7bcc215ce37009009dc90b5c7edb1a1174a10ad28f4c1d1a2241e7ffc215edef4f847ceedf7b64f2d15\nTAG: 20521b35310385ae66557740b435d204\n\nKEY: 53ef3dc7a10e435650dd20550cf3ec2b997afc8d9e79cca8f7062622afac3496\nNONCE: 257a205ed0f84016183f4613\nIN: 081e2769935f945419aa06fb5fa7d8412efd1f9b52a45863808022850836c1974d53d2b2c5c0cd420711a71e6d1a09e984366b8b677e6c61bbce8f3adf9f5a9fb5860887617a08c923171d681c4fbc6d569690f6a183d42b52a80ef0693862efd22bf83b7b4014a7008424c356b5022df1842309b3a4a2caee0fd3f4d3fc52a17d53959daccf8e0ca889578ee2905dd8c17d52e76712dc104344148e8184c82af8165ea8386f91de585b54fc8535c3\nAD: 5b73ae02bf4a70e57f5d48fbf45f85b8496ae8514c8aeb779c184f9cf823d8c1883c9e5a42b2c099d959c2298ace2d86c4479059256d6a4325e109fa4b6c4ce90f84a8228316e80aa86de9b5e111d88b2be447a29297b35ca90a8eb280d4c0fe92a1d593cb966cb0010bc06831efb0c72c1e222b031e900ef06ab8da542a5abe2870a0efbe92351d5915ab545b14900e41a27c5ca9d75d6277afafe7ae861131c2767eb314c0c3da5c264f8f2b4ac7\nCT: 20ecb6cda861b660656d692c626436227bd4ac17a9bc71f6c84a1917ef3b5a0f6ba370f00fa2e7f1bd5aa8d6c15032572090482c23e4ab7376ef1f4dfb77f79d5dc065792fe3476c9c37614e32f493e461981b519dd7d10234c2c69264ffe5be06a8e14c81022b652c8cfa24adcc7c7536a55a2fc41e9ffcd09e1c483541cba814eafd5e09e9e44477018a41b073e387c9257c07d97e40f0761fe295d015e1f2df5be65b13f34b6ef0fe1b109ad109\nTAG: c129ba4",
@@ -578,9 +599,9 @@
     "2d59740c9b9d4b97075b874015251ad55483068b00f87502b18182b140db07c70a80fd884fd79b7b5fef1d307ca4db0ff046494443e1cae83478d275c31402035f1fc24e26214b78d9a4dac78d074150012f9fee810a121d87a16d8e1eec5700e9facba350029788480a259d9f30df1c2b8df7691629314391719853c0b68614134f6028865700b1fc4e7f34ff28f449c6abc3027f38d7a7f6d84b8f27f7cc5afa09478c809eec346bb58244ab42a3bef61a14ae7640d76591343983de9fe5f1b985ce56c9fcfb2e3f6220779ca6f92a6b8aa726573b38ed7663ebe4c85066ae3f488ea3309593fa41dba8efd2b8f44b9fa8f7a427823c1228093a3\nTAG: f1832022e06228c36181856325d4eb68\n\nKEY: 3828b138f72f8fe793d46c55ad413bab31a51e7a9093cdd10fddb4739e28e678\nNONCE: a60413c0ab529ccf3de58468\nIN: fec017c1c51da5ce9dcd8e84cdc03a43145b31edfd039c7c85d8811a2f58efe7a2d7590149a98cf0b5af82d3e0a325223bc9d5585ceb1afc4cdd96024be6c8064c2abac14f68e65de49e25e3e967500ce5b4504d00a9cbad1e86bbdcf65c01a7a92de27583b7b92122b6a4923b7192994a1edf00b75d14a982f92559dbc2d5e427a75ad29715375d90193ddbb39b9a52c1a23d75629c539e0a6ce822c7c08fc77dcd3adc357893215df4694673a16d34513de21217ce86897c8f0575d213ce0c66eb1d1985fe73dd86da3ab5e89df4243e1be9dd95af94f878995d02929ee42a062100d6d4d3884730f54593d5ff7b7ae53e03d4f0e10f6f4c3077206499ab7d4de1e825d532d0918f\nAD: e2b16ff2b6c73c9374704ffb4cdfe7bad9eeee32157f2eedf427f99c2cce80c5aa4d9145e85af0cb08e6ed477cbe79ee168ded5c0895f9f4f939c21916b3dd5c9d268b3aabdefb85d953bce9b70732fc9acf6c7b727f78d8c9aaca9e022d7cf0f95583e81744227d87fa34ae19de44d202ba01e3d03993f38c9b2fb00b54dfb677d67e6f5a15f46c29eb5597ae3d5384b37bbeca3f3d825e2b7cceaaeb36a8c1273062259608956dd0c79877cc460d0268de27355e34b9d8d1188c062ac5e10a73f2d70fd0636304b3de06cffeedd246e2db19b8b66785f9f9c62b8f0198f29d37a4ab5280f4aa0320559810f89a1618844d0ad5f3a4f5a0e834ab31e56798b7158217f834d372c36f\nCT: 88ea11ef6b6ee6fb0be77bcbf227e77508922550ef0d7534bf05668ae5fcab2f4defe643747716e7e000950e36c6cb24b79987389a150382c091d39ddf841b0a5e31d763d9c59753a3ef36a23b81f38e6e715357395ce715d30c14d6ab5b7454804ecf633daa39b6107f562fae6a646efb25c1119dd17955bb9e640105a21566345408f72f2acc8f2726a0be465551f9ae566da559fc0b92c36764c5ca20a18a316c02e606030a53450e7ae1146050a48a64c600d33cb84389b0bdac7ff45d3d1f2f669a6e365ef722d76d2fe9bef2df93c58bbdd6965e18111b5de0f4a62dbb874161bf8adfa61e9cdecd97b4fff668b3efeb3e32eeb929cf58d94ad8077c0a2ca79e80877c5d9329\nTAG: 9b47afc5816b7229213cd3c9135545ed\n\nKEY: 91ea63dc27d9d6bbc279ec6cecdce6c45ff0b247cfb8e26b6ab15f9b63b031a4\nNONCE: 80a134fac73eca30459d5964\nIN: a848e41c77ac8c733370435b5b6a9960af36031e96260d5703ce15b003606875a7901cd11e4571bf88dda29a627c0b98065a8b4e6d382852dfa4f47d86fa08e48ad8f5a98e55c305900b83200d44029f304abd21e0264115192a3fd7b0eb69b9f8ca7865b3be93f4ba5a28468fd7bbb584c32ae867f5146efbeb1412d3ac36c30cb308c327a6f207e30f561d6efe0a535446c693e14176e9e714ffb5a5b1075812909a362a6c4bbe18322e15690c2c9cf5a18e0120c11551cb7055b5aee97e7a56d7c24fdf1214641c8eacb196d74f3d96a7fbecdd4fe52dc7b6ead9041cafd5a3fdf91fd3614e63189b488d4d7c1ea3c6351d112a2223b29d390ac3ab7f09a60bbd3df6e0d606d902aa44244334\nAD: 47940a0694183b2fcb5e760c9ef6dbe4cbff6ccf33208337a981138f9d35c03f8adbd810e94636acaebef6791b531a65e99b03fc78e7eb48036615874e97cf762fa6ca5d880bb2c2f644f1aed70c667880f98834d501caa277cb8ef1095ff882e79c3a92ea8982abebf63ea9ed7e9a24d32cb81d5d98e891974e3d636a59e165984e00f05a040d33f07b39eccb924fb24780a422a6b2b7bddb5b316beddcf6fad20e4cee7d0141c2f7c4e4f759db8691dc7b8525ccbc3ee6071a2ead63e750d6d92dde7eb1303d5b1194702b6c3e0c2e6f9649e60eeddec9c1f71cf309af0672cd2ffcf94ba7e6c3d7cee020a224a9a956274d1d36ba16030e215d90a165756666eff066a8e51bf7d4babe8b7d8d\nCT: b90449af99327afb1124bb24f1c8b5cb878423b0370d5f7cd297b28cc4135ee77d6f1913a221cfeee119bafa873072bfa79e303fe377bbed05add41ce3a42ca4632b98f40a36227de1a9ba84d6176c01eca9d33d954d0ebdf4e40f136e0f6a56156fbb33b344a8a433941fd6e08774bd00075aedb0e396c2bc37d1250541248dbeb899e1b5170cdfeaf7b89995b049428bb277c501354f8cd48fb58f6f04f956dfd099c48778dbdbb4c95b7c9d6797cf6d3bcd1d00e88cea885ee4a10d94356509e148990a0e10dd89103a9d5c8434a7bdbed6c0ac1271e0709eba144abf3cf075c020e9f7835d5a98fb2439b399e377ae6e19fc5f32df9ddfb9e936190d3e9c62de99835249d1f32ca3f92ecd44\nTAG: 6ccaf7c142d86b83e4d0b4289b49c4d4\n\nKEY: 1344db082889367fd48c5f06bc39f9cb9e3ad4b92fa484ccf49418dd4caa2e19\nNONCE: c04a98e7e29326b5330818d4\nIN: b0e12e3122c1ebfdcadded5a45163a6208548e9bdf95cfd18ea504e5d2e97372e58dbfe460a57b724d38f3bc0ce02a54015779bcf127343474d7d4c1402d598bee56897203b903da5b819e2218bd0d1a2af11c542544f02c46969cd2bfac683b76a8de61698ccba63361a1a0b570adf69d24e9a7e466873c8c12e25e0bcead7828386179a4d65d5bbdb800eb52fc01b67498d7b5f9864270162158a8572eccf541b07833f001848672098c57708eb479855799567c318b1aa097efa70db0d8a8d36fe0ac22ebcc2870baacac690a79e07ab286acad9f7a877939cf2989cd6200eb86dfa7a41e969a3683ceacc7c97d1cd5487f13c439a9777a67770687657d38267a347a0b6d3aa3cf64e7f31017246e4369da\nAD: c96db14dbc2aa0ce3ac63794f75c7e78037dac6763282edb307821a7938de4baa3d2e35a8cfe0c8724c2a8d870d0a462ea157e15aacc69a3c881d9c819225ea8be479872d55e655c897936c95b9ab340820264567495fc5e4e3354f42b84e191b470ca9f4d8fc25d011bf9c9e73e1590e1bb919dd2f288b26935fbfb8c93e54331dc8edad5e1cc4aec103c2f3320d59870c1770319f105ee790b704ed655be423e63ab040f1153f41e7070ae3a0f34d217c4649c180c84814463902d99a9396f8c7c85a3a4c8ae2f01737649fae478a40fc72303a108822775e9c421f945cc0eea992730790a9aa0c0d014518dab371b52d30b5a560f34946a9344cfb8a19b09ee9b123bcb8f642780697508f04983b790dd2d\nCT: ffda075dbde7b874995230e1324f17894689baaa7f1354e26100befb546ea23dc74807818e43a3cee00ec1bbb95c82180489ae5f3a1c482dec28f96ecaf5ca4655ff7f33c814197cb1973cf02a0b720a5c44068d8ddff0789fc1e7f20ef408c1a438133fce4f7a3e8c85d95a381b94e949ce47a85895c4be7cbfad468e52a160dee34b8ddeef2ab280eaaed4990ecec790ac16de3c74aac6fe2d5e28ea2b66a921c894a3971cee4a2158054c3567e0d941f867ded5ed1d21d8ab090848fb3eddfb1559bf11815db52b8eed871cfc117980f297da79da31da32de3f162a03d95090d3329da3662df29e6ec9b236e0f7c1d7d957cfd54d5efc99c694b9dece989912388254798513d881e5943ce830729a8e2ddf\nTAG: 81c55fe9aa2de0d63efe3f74a3d8096f\n\nKEY: 31dbefe589b661af00a6fbad426e013f30f448c763f957bbcbaf9c09764f4a95\nNONCE: 147fe99bba0f606c57242314\nIN: 908bd801b70d85085dd480e1207a4a4b7ef179dac495a9befb16afe5adf7cb6f6d734882e6e96f587d38bfc080341dc8d5428a5fe3498b9d5faa497f60646bcb1155d2342f6b26381795daeb261d4ab1415f35c6c8ac9c8e90ea34823122df25c6ddae365cc66d92fc2fe2941f60895e00233b2e5968b01e2811c8c6f7a0a229f1c301a72715bd5c35234c1be81ef7d5cc2779e146314d3783a7aa72d87a8f107654b93cb66e3648c26fc9e4a2f0378fa178c586d096092f6a80e2e03708da72d6e4d7316c2384a522459a4ad369c82d192f6f695b0d90fcc47c6f86b8bbc6f2f4ea303aa64f5ce8b8710da62482147bcc29c8238116549256a7a011fd9c78bbb8c40e278740dc156c2cc99c3591fec2918cdeb5240fb428\nAD: 5a32d7044f003b2ffefffe5896933f4d8d64909fa03e321a1bdf063099b9f89752d72e877291d8da12340c5dd570d7d42984ffab5177824fc5483b4faf488504e6822e371dca9af541c6a97312b9cbf341b4198b0902cd2985ac10a8b5b5fe9691bb29a88344f863c980e4e871a72a8b74f92eef68c176e9d2ef037898ff567298e186af52ec62eb7429a8004ac46b945678b82859396d36d388ec3d67653aec35cf1da2684bbc6c78a5f9e3ce1b355af3b207f64e0fa73501c5d48a14638d0906c87eaa876debcf1a532c1475d80ed3d4b96458d2236eb9f67988863bc6d5c16b96b93d898683d248d7bc601b5035fc365481b89465e37a8f7dd64635e19a0282639cecde72c6b1638e0aa6e56f9c00d031cdadc59ce37e\nCT: aeab9db30a579ca54195e54a9e6c787f40100c6d12ceee35643f36ae45f618cc9bb66aa4c0fae0ec2686cb4101a5b23a46877460c7e020b38b0d8d1f533ecfa99df03d346bc854a578276d7d5685ad1fb03655683a64aae4159c9efa6781f053057e0811226c7c533967a94587f4025353b28cc3a2ce5763783b4c31e7818b8ad9195bc03be8f294f9f6ceac578f9d30b22b1f5a68d647d46cf6db4a9c3a8a5c06fa97c9efb4578f501ea96db1f40942e3f24c44a7e4070a6b931c39947d9692930b67767357015de51a39e46fff94b6019e4bc1ad9d216a571ba0dc88859c49d2c487ca657384e49b4d382d86a60c8d5195320909c4e82fc077a3b22bd4eccf0f067e66ec78eed642b2d16f0f304f60f1d9ba69e205c982\nTAG: 17ca09e3084504fc22e914ee28312c8e\n\nKEY: 0ecc44c9036961fba57c841ace4ca3c547c51d9f126567bf41626765cfcbd53b\nNONCE: aa98b6ddff7e4b2041f29d70\nIN: e49a2a5713f507bfa00c140dfbefc0c43e37bcb932e0741db03f0055da61cd837b6e2d8f99115d70750fb23685a17121b52e98a37c87204e0207729fd9219d11a48e57970d790338793cf329f7b239512a44dd4409fe9d157f92123dfc5cba24af106442644dedda87e1d9e95fd395f2f0ad8f7d27f313e6ce1a07d9845dec5ad732e6e4749b3a161527c8ce42331f5de1d700650072fb68e9c7645a0e0e529d0563d2727e3fb38ed341f74ef1ad95a0216a440e1384d0e7ef71cde38ce",
     "cdc9e2b2d563f19014c40c1f92ea0af3b4f6da9146d433ae85f647153db326a28ef6ea2e0ebac0cc1aff157067c7dba7cc4317d56920ee9deab5764368e7e5b3ce8bebd0fa129f869b15897c09659c53188bf8efb7b6ac7d265c9b85fe96166\nAD: df41db4ef5350d4afcaa88b4a577b3370b96699bbd73e59aeebca6ea856cf22694a9399ae7f97a3bec226d82f5598f8949dfb92530dcfe77770f066f2af988fba5543b8ba7655bc43f8dca032981a34a1beff695c6908169d475c55b2119fe5578623f68a9dd85b653656881b0db4006d3336fdfc784d1805e48ff478fdc196601f044c9d33fca3ddde2db0102f90fff0b370f520e00e3786c2a9b0b4a9a7ea6f9d866f77d870c8ef0f3a8bedef17949a32598512af665679dfbe71e1c3efc3dee8f5d4499e20dc63281191751f67e51f201973a6675896484527d66bed94d6aaceff65fbc4192cec19452b8873f22d72bf2f4981fe656285cb24be5c58e77dafd3e096166b230f18d3f4197fe16f6ec84c060ce0793ae6848311a18b7\nCT: b15b2bc4b9e8ecc5d9c4a6359a805b7590bdb4bfaa9b3fc4d7676d721edc4b3b1ef71b18a3d78f1b31a477cf25e55b278eb3ed774805ae8e5a2a0204f7291d9587663c4d8b1b744154f3b7cef796e0b91590161f3bde82f1d8139cb8d017606ae6d0552ba144788fd8caf435ab09a43a1f4057776af49bad98fc35cefefb159cfebfed76f2e4d18b7be143677ff8b3d6e2b440fe68475b5a1193bcd19ab157d0d2257f33de8e50091ea3388648c3410aa68c830566a0413d92454e4eff433c3edc74e8f7516ec17b2c01cf57a2d7c48db97b706b8d7da0b68051f2d6a87c417f46cf217a48611980890f669d39b478c35d834ed2c79299df2381a1215d6db303cb63e2795fe517649874226e0a6dbfe2c86370b9fbdd8c5de349bfa25f\nTAG: 7082c7ef72c82d23e0ba524132acd208\n\nKEY: c05dc14b5def43f2e8f86c3008ef44e4dc6513768812e9218b2b216818c4cec6\nNONCE: 5cfe0dca6e599ed9aa89ba97\nIN: 8a06e2997b8e5f8040b22e07978c83c48d0f90bd2b2f8b426b43feea0b614d3b0681745ea4224cabcaa25ca45c3053a6300c47ffa4f72e838db135ae35c27939aad4cf7f75fb61daa3148d869057598e4e8b44c6fb19b0d9281e18676d8bc137489bb77a51a3a8f807a896d558f00040e8729ea9bbdc7db6102c8b99c8a1eacb0735577bc6533cd1d8147013935b6344116090a1bdef1f2e38a877a50c8fc0f394bafede31375c57476ba06d95ae734e6dae771a32e5091dff71d845c5f7385b9b9069ced12fcfea34a510880b088bb0016e94a5932c89baee038cbafbf06b3d09426afd2d5dd5e392636362e9ffa9186b5c753eb84f82f68fb1286ed06c58a5a936cad018ebc4269037b49f2ea0349373adea99f06062e5dbb0bf94f2883f5c0556\nAD: f2a3f7af8ea984bbd85953f14202c6e478f98d0bcaacd414329ec480d0c29fb4c1a052d3228c883928448f0bef12cee5b69829b4a3eb4680084131867cfc3d3af84fcc0d80c2292d3fe02405634f6cfb20b0fb90345da3a557fb30582175c32e432be66ad096f9425ff4060df54d6741fd6567a1e2fc5f6f3ed95cefc806ff64ae91ae82920b5c829ea026f83fd90d760e240da3c9ddaafe4d08507f4af1049056dc6d09657779a3dbd889d851e97d4ac60dc66df2d24979ba8947a7890a304bb301d0d42b67824e0c68fc882e90cb6deee50c2e3d9f0da59ab23c997b05635a0d56c71fc39aa0e6b19c43a7fe12d4e4145453cd7fbd8a3f33bf5451addf05052df7ef044a33513bc5f1a4cfc8b68015664bb5c8e4bf54a85efff109ee96af75d4a5\nCT: 2cf630548d6f2b449057c7861920308958199f77b123a142c6b7c89c4982f4ed0efa2fe899914ddbf4543e70865a5e683b0721d6c8443df2e697acf31e11c8809aba94196409020a7c64d396fe136826455aec973af23a6c7733cb567f5ea550e50e0b796623a97807d042855568e3c568990cfc818c31a1bf415337f43e9baed57fada2fb2ad3c3543f2b7f2777e03f84040c1c854c310ab1cc5dc7f2a5fb213af79ac068b46c7d9475bea126adf079e2100bb57904a931faf248e0f7d5832ca83ea8a283e0136979737132afb1f4ab38d307ac0774814f4d5ecdc4aad79185c05f8a706f579b78f2c1c7004cb38e6cd22c2080735b34c3f6134955ed3bc36b1ad5c8e33209c9f3c658fb07b59b6002b2526cd8d853a5c624b7108573d7df60c827\nTAG: 3dcdabcd1c82002a551cea41921570e5\n\nKEY: b33f449deccc2ef0d7616f22b4a00fcd84c51a8383782f66f1696bc6405005ee\nNONCE: 6afa8baf923f986b5779ac6a\nIN: b0af85a6deae5fcaa94778bce015ce2da7400ab768f3e114cc1b645fb2716789e2aeb96894fda6da5bc24fcf2466124720d6ba99e5475d77e5bcf2c2f8c8e5becf5eb73ad650861bbdeb51ba5ee789c227478934200fc18f36e4fe392c99d4c3fe0b38b40d2e84f831b8ef9bce9ac1362c755943521ecf5b5cf8fbcdf08f2d47ff7cd62838597dd342695a1b037bcede69500bf70bf1edbb40a17b44695bd8ff8bc8664b3211a6bbfdcbd1bffbfb1a2ea0141cfbc6ac841c803b137be5eeb2666c46c09cc1c4fa82be43bfd56e7a2b8ceeecb6efc1933a90213a0e1bc7aca2af35f2d1dad5f0d9002561064a699f1ce76c39d9c2224ae596e88a1517e19c2115370768d50107f3f2a55051838ae5897acf2ac0814ccd864eee2f6b5d7a6728c6ac6e6a57327102\nAD: 2134f74e882a44e457c38b6580cd58ce20e81267baeb4a9d50c41ababc2a91ddf300c39963643d3c0797b628c75a5fc39c058d319e7d6deb836334dbe8e1fe3cc5704b90c712e1fb60a3c8b58d474a73d65fae886394f8b2c029e420b923f2af4d54c9de3c7fa2bccaa1e96664ccf681cacbbf9845069a4bfd6c135c4392d7d6be338eca414e3a45f50510718e2a5a3e5815eafa0c50172cf5f147510645d2269929843bbbab682deb5823d4cdf42bd250bdbd20c43e2919d7a6e48973f43a4cab73454b97cdca96721ebd83b6dbaaec7e12cf0dae678a57c431b81421657037dd47dccbee73a41f56495fd7c25c75744fe8f55cbd1eac4a174d8f7dd6f6ba57b3e53449a9ce7806517e3e07cf6546a0fa62c7b1fa244d42eee64a3182461792edb628e567b23a\nCT: 0fe35823610ea698aeb5b571f3ebbaf0ac3586ecb3b24fcc7c56943d4426f7fdf4e4a53fb430751456d41551f8e5502faa0e1ac5f452b27b13c1dc63e9231c6b192f8dd2978300293298acb6293459d3204429e374881085d49ed6ad76f1d85e3f6dd5455a7a5a9d7127386a30f80658395dc8eb158e5ca052a7137feef28aa247e176cceb9c031f73fb8d48139e3bdb30e2e19627f7fc3501a6d6287e2fb89ad184cefa1774585aa663586f289c778462eee3cd88071140274770e4ed98b9b83cd4fa659fcdd2d1fde7e58333c6cf7f83fe285b97ad8f276a375fafa15f88e6167f5f2bfb95af1aefee80b0620a9bc09402ab79036e716f0c8d518ae2fa15094f6ea4c5e8b283f97cc27f2f1d0b6367b4b508c7bad16f1539325751bd785e9e08cd508bdb3b84\nTAG: 1976d7e121704ce463a8d4fe1b93d90f\n\n# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf\n\nKEY: 0000000000000000000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: \"\"\nCT: \"\"\nAD: \"\"\nTAG: 530f8afbc74536b9a963b4f1c4cb738b\n\nKEY: 0000000000000000000000000000000000000000000000000000000000000000\nNONCE: 000000000000000000000000\nIN: 00000000000000000000000000000000\nCT: cea7403d4d606b6e074ec5d3baf39d18\nAD: \"\"\nTAG: d0d1c8a799996bf0265b98b5d48ab919\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbaddecaf888\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nCT: 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad\nAD: \"\"\nTAG: b094dac5d93471bdec1a502270e3cc6c\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbaddecaf888\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 76fc6ece0f4e1768cddf8853bb2d551b\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nNONCE: cafebabefacedbad\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: 3a337dbf46a792c45e454913fe2ea8f2\n\nKEY: feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nNONCE: 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nIN: d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCT: 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f\nAD: feedfacedeadbeeffeedfacedeadbeefabaddad2\nTAG: a44a8266ee1c8eb0c8b5d4cf5ae9f19a\n",
 };
-static const size_t kLen16 = 69162;
+static const size_t kLen17 = 69162;
 
-static const char *kData16[] = {
+static const char *kData17[] = {
     "# Test vector from RFC 8439 Section 2.8.1.\n\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: 070000004041424344454647\nIN: \"Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.\"\nAD: 50515253c0c1c2c3c4c5c6c7\nCT: d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116\nTAG: 1ae10b594f09e26a7e902ecbd0600691\n\n# Test padding AD with 15 zeros in the tag calculation.\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: 070000004041424344454647\nIN: \"123456789abcdef0\"\nAD: \"1\"\nCT: ae49da6934cb77822c83ed9852e46c9e\nTAG: dac9c841c168379dcf8f2bb8e22d6da2\n\n# Test padding IN with 15 zeros in the tag calculation.\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: 070000004041424344454647\nIN: \"1\"\nAD: \"123456789abcdef0\"\nCT: ae\nTAG: 3ed2f824f901a8994052f852127c196a\n\n# Test padding AD with 1 zero in the tag calculation.\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: 070000004041424344454647\nIN: \"123456789abcdef0\"\nAD: \"123456789abcdef\"\nCT: ae49da6934cb77822c83ed9852e46c9e\nTAG: 2e9c9b1689adb5ec444002eb920efb66\n\n# Test padding IN with 1 zero in the tag calculation.\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: 070000004041424344454647\nIN: \"123456789abcdef\"\nAD: \"123456789abcdef0\"\nCT: ae49da6934cb77822c83ed9852e46c\nTAG: 05b2937f8bbc64fed21f0fb74cd7147c\n\n# Test maximal nonce value.\nKEY: 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nNONCE: ffffffffffffffffffffffff\nIN: \"123456789abcdef0\"\nAD: \"123456789abcdef0\"\nCT: e275aeb341e1fc9a70c4fd4496fc7cdb\nTAG: 41acd0560ea6843d3e5d4e5babf6e946\n\nKEY: 9a97f65b9b4c721b960a672145fca8d4e32e67f9111ea979ce9c4826806aeee6\nNONCE: 000000003de9c0da2bd7f91e\nIN: \"\"\nAD: \"\"\nCT: \"\"\nTAG: 5a6e21f4ba6dbee57380e79e79c30def\n\nKEY: bcb2639bf989c6251b29bf38d39a9bdce7c55f4b2ac12a39c8a37b5d0a5cc2b5\nNONCE: 000000001e8b4c510f5ca083\nIN: 8c8419bc27\nAD: 34ab88c265\nCT: 1a7c2f33f5\nTAG: 2a63876a887f4f080c9df418813fc1fd\n\nKEY: 4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd1100a1007\nNONCE: 00000000cd7cf67be39c794a\nIN: 86d09974840bded2a5ca\nAD: 87e229d4500845a079c0\nCT: e3e446f7ede9a19b62a4\nTAG: 356d9eda66d08016b853d87c08b5c1b3\n\nKEY: 422a5355b56dcf2b436aa8152858106a88d9ba23cdfe087b5e74e817a52388b3\nNONCE: 000000001d12d6d91848f2ea\nIN: 537a645387f22d6f6dbbea568d3feb\nAD: bef267c99aec8af56bc238612bfea6\nCT: 281a366705c5a24b94e56146681e44\nTAG: 59143dab187449060a3ec2a1681613cc\n\nKEY: ec7b864a078c3d05d970b6ea3ba6d33d6bb73dfa64c622a4727a96ede876f685\nNONCE: 000000002bca0e59e39508d3\nIN: b76733895c871edd728a45ed1a21f15a9597d49d\nAD: cc1243ea54272db602fb0853c8e7027c56338b6c\nCT: 1fb9b2958fce47a5cada9d895fbb0c00d3569858\nTAG: 219b4252deb16a43b292165aabc5d5ce\n\nKEY: 2c4c0fdb611df2d4d5e7898c6af0022795364adb8749155e2c68776a090e7d5c\nNONCE: 0000000013ce7382734c4a71\nIN: 0dc6ff21a346e1337dd0db81d8f7d9f6fd1864418b98aadcdb\nAD: 0115edcb176ab8bfa947d1f7c3a86a845d310bf6706c59a8f9\nCT: dad65e4244a1a17ce59d88b00af4f7434bd7830ffdd4c5558f\nTAG: 7ae32f186cf9ec59b41b764b34307d4f\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a84138648a5919a\n\nKEY: a8b9766f404dea8cf7d7dfaf5822f53df9ccd092e332a57f007b301b507d5e14\nNONCE: 00000000c7f2f7a233104a2d\nIN: 4d6faeaee39179a7c892faae3719656cc614c7e6ecd8fcb570a3b82c4dace969090338\nAD: c6d83b6a56408a356e68d0494d4eff150530b09551d008373d6dee2b8d6b5619d67fdb\nCT: a15443f083316eef627a371f4c9ac654d0dd75255d8a303125e9f51af4233ff4ceb7fe\nTAG: 63c2b4e0973096299488b0a66ffa54c1\n\nKEY: 5e8d0e5f1467f7a750c55144d0c670f7d91075f386795b230c9bf1c04ba250bc\nNONCE: 0000000088049f44ba61b88f\nIN: 51a1eebcc348e0582196a0bce16ed1f8ac2e91c3e8a690e04a9f4b5cf63313d7ad08d1efbff85c89\nAD: 5d09bf0be90026f9fc51f73418d6d864b6d197ea030b3de072bd2c2f5cab5860a342abbd29dba9dc\nCT: 35aa4bd4537aa611fd7578fc227df50ebcb00c692a1cf6f02e50ed9270bd93af3bc68f4c75b96638\nTAG: 4461139c4055333106cf7f7556fd4171\n\nKEY: 21a9f07ec891d488805e9b92bb1b2286f3f0410c323b07fee1dc6f7379e22e48\nNONCE: 00000000066215be6567377a\nIN: c1b0affaf2b8d7ef51cca9aacf7969f92f928c2e3cc7db2e15f47ee1f65023910d09f209d007b7436ee898133d\nAD: dfdfdf4d3a68b47ad0d48828dc17b2585da9c81c3a8d71d826b5fa8020fee002397e91fc9658e9d61d728b93eb\nCT: 8ff4ceb600e7d45696d02467f8e30df0d33864a040a41ffb9e4c2da09b92e88b6f6b850e9f7258d827b9aaf346\nTAG: b2ad07b86aca1b3ab34033c12d6a08cc\n\nKEY: 54c93db9aa0e00d10b45041c7a7e41ee9f90ab78ae4c1bba18d673c3b370abde\nNONCE: 000000003f2d44e7b352360f\nIN: 1241e7d6fbe5eef5d8af9c2fb8b516e0f1dd49aa4ebe5491205194fe5aea3704efaf30d392f44cc99e0925b84460d4873344\nAD: f1d1b08dd6fe96c46578c1d1ad38881840b10cb5eae41e5f05fe5287223fa72242aea48cb374a80be937b541f9381efa66bb\nCT: 027b86865b80b4c4da823a7d3dbcf5845bf57d58ee334eb357e82369cc628979e2947830d9d4817efd3d0bc4779f0b388943\nTAG: 6de01091d749f189c4e25aa315b31495\n\nKEY: 808e0e73e9bcd274d4c6f65df2fe957822a602f039d4752616ba29a28926ef4a\nNONCE: 000000001b9cd73d2fc3cb8e\nIN: 3436c7b5be2394af7e88320c82326a6db37887ff9de41961c7d654dd22dd1f7d40444d48f5c663b86ff41f3e15b5c8ca1337f97635858f\nAD: d57cfbe5f2538044282e53b2f0bb4e86ea2233041fb36adb8338ded092148f8c2e894ef8766a7ec2dd02c6ac5dbab0c3703c5e9119e37c\nCT: 9b950b3caf7d25eaf5fca6fa3fe12ed077d80dcd5579851233c766bb8bb613ec91d925a939bb52fb88d5eda803cfe2a8cda2e055b962fd\nTAG: 0887ec7d5e1a4e532746ec247a30825a\n\nKEY: 4adfe1a26c5636536cd7cb72aa5bded0b1aa64487ad0e4078f311e8782768e97\nNONCE: 00000000d69e54badec11560\nIN: 19b3f9411ce875fcb684cbdc07938c4c1347e164f9640d37b22f975b4b9a373c4302ae0e7dfdeba1e0d00ced446e338f4c5bc01b4becef5115825276\nAD: bda1b0f6c2f4eb8121dcbd2eebd91a03ae1d6e0523b9b6f34b6f16ceca0d086654fb0552bfd5c8e1887730e1449ea02d7f647ae835bc2dab4bbc65b9\nCT: ea765a829d961e08bacaed801237ef4067df38ad3737b7c6de4db587a102a86fc4abbaabea0ee97c95ca7f571c7bab6f38cbae60cd6e6a4ce3c7a320\nTAG: a27f18846f5a4f7fcc724656c91cf4f3\n\nKEY: eb3db86c14b7cc2e494345d0dfb4841bbd3aa1e2bc640cca0c6c405520685639\nNONCE: 0000000088b54b28d6da8c81\nIN: f75c0a357271430b1ecff07a307b6c29325c6e66935046704a19845e629f87a9e3b8aa6c1df55dd426a487d533bb333e46f0d3418464ac1bef059231f8e87e6284\nAD: 34b08bb0df821c573dcb56f5b8b4a9920465067f3b5bf3e3254ea1da1a7fc9847fd38bdfe6b30927945263a91fa288c7cf1bee0fddb0fadf5948c5d83eb4623575\nCT: 146ec84f5dc1c9fe9de3307a9182dbaa75965bf85f5e64563e68d039a5b659aa8863b89228edb93ff3d8c3323ab0d03300476aa4aca206d4626a6b269b2078912d\nTAG: 854cbb42bade86a09597482c8604681a\n\nKEY: dd5b49b5953e04d926d664da3b65ebcffbbf06abbe93a3819dfc1abbecbaab13\nNONCE: 00000000c5c8009459b9e31a\nIN: f21f6706a4dc33a361362c214defd56d353bcb29811e5819ab3c5c2c13950c7aa0000b9d1fe69bb46454514dcce88a4a5eda097c281b81e51d6a4dba47c80326ba6cea8e2bab\nAD: fe6f4cbb00794adea59e9de8b03c7fdf482e46f6c47a35f96997669c735ed5e729a49416b42468777e6a8d7aa173c18b8177418ded600124a98cbb65489f9c24a04f1e7127ce\nCT: 911ead61b2aa81d00c5eff53aeea3ab713709ed571765890d558fb59d3993b45f598a39e5eff4be844c4d4bd1ef9622e60412b21140007d54dcf31b2c0e3e98cf33a00fd27f0\nTAG: 2865d2a26f413cc92416340f9491e1be\n\nKEY: 3b319e40148a67dc0bb19271d9272b327bc5eee087173d3d134ad56c8c7dc020\nNONCE: 00000000ce5cf6fef84d0010\nIN: 27b5627b17a2de31ad00fc2ecb347da0a399bb75cc6eadd4d6ee02de8fbd6a2168d4763ba9368ba982e97a2db8126df0343cdad06d2bc7d7e12eec731d130f8b8745c1954bfd1d717b4ea2\nAD: a026b6638f2939ec9cc28d935fb7113157f3b5b7e26c12f8f25b36412b0cd560b7f11b62788a76bd171342e2ae858bcecb8266ff8482bbaed593afe818b9829e05e8e2b281ae7799580142\nCT: 368fb69892447b75778f1c5236e1e9d5d89255c3d68d565a5bba4f524d6ad27de13087f301e2ef4c08f5e2c6128b1d3e26de845c4ac4869e4c8bd8858ad0d26dec3b5d61a9e3666a3911ba\nTAG: 1414f1b91966340417c38226ccca9d3d\n\nKEY: 43bf97407a82d0f684bb85342380d66b85fcc81c3e22f1c0d972cd5bfdf407f4\nNONCE: 000000008b6ba494c540fba4\nIN: 4b4c7e292a357f56fdf567c32fc0f33608110d7ce5c69112987d7b5a0bd46d8627a721b0aed070b54ea9726084188c518cba829f3920365a",
     "fc9382c6a5eb0dd332b84612366735be2479b63c9efc7ff5\nAD: 1e0acf4070e8d6758b60d81b6d289a4ecdc30e3de4f9090c13691d5b93d5bbcef984f90956de53c5cf44be6c70440661fa58e65dec2734ff51d6d03f57bddda1f47807247e3194e2f7ddd5f3cafd250f\nCT: d0076c88ad4bc12d77eb8ae8d9b5bf3a2c5888a8d4c15297b38ece5d64f673191dc81547240a0cbe066c9c563f5c3424809971b5a07dcc70b107305561ce85aecb0b0ea0e8b4ff4d1e4f84836955a945\nTAG: c5ca34599c6a8b357c6723ee12b24da8\n\nKEY: 12fc0bc94104ed8150bde1e56856ce3c57cd1cf633954d22552140e1f4e7c65d\nNONCE: 00000000d3875d1b6c808353\nIN: 24592082d6e73eb65c409b26ceae032e57f6877514947fc45eb007b8a6034494dde5563ac586ea081dc12fa6cda32266be858e4748be40bb20f71320711bf84c3f0e2783a63ad6e25a63b44c373a99af845cdf452c\nAD: b8be08463e84a909d071f5ff87213391b7da889dc56fd2f1e3cf86a0a03e2c8eaa2f539bf73f90f5298c26f27ef4a673a12784833acb4d0861562142c974ee37b09ae7708a19f14d1ad8c402bd1ecf5ea280fab280\nCT: 9d9ae6328711fb897a88462d20b8aa1b278134cdf7b23e1f1c809fa408b68a7bfc2be61a790008edaa98823381f45ae65f71042689d88acfa5f63332f0fba737c4772c972eba266640056452903d6522cefd3f264e\nTAG: e84211b6cfd43543f8b1b4db07a494d1\n\nKEY: 7b6300f7dc21c9fddeaa71f439d53b553a7bf3e69ff515b5cb6495d652a0f99c\nNONCE: 0000000040b32e3fdc646453\nIN: 572f60d98c8becc8ba80dd6b8d2d0f7b7bbfd7e4abc235f374abd44d9035c7650a79d1dd545fa2f6fb0b5eba271779913e5c5eb450528e4128909a96d11a652bf3f7ae9d0d17adbf612ec9ca32e73ef6e87d7f4e21fe3412ce14\nAD: 9ff377545a35cf1bfb77c734ad900c703aee6c3174fdb3736664863036a3a9d09163c2992f093e2408911b8751f001e493decc41e4eeeed04f698b6daed48452a7e1a74ec3b4f3dcf2151ca249fa568aa084c8428a41f20be5fd\nCT: 229da76844426639e2fd3ef253a195e0a93f08452ba37219b6773f103134f3f87b1345f9b4bf8cfc11277c311780a2b6e19a363b6ac2efe6c4cc54a39b144e29c94b9ebbde6fd094c30f59d1b770ebf9fcad2a5c695dc003bf51\nTAG: 55e025a1eb87bc84d4be00c775c92ad2\n\nKEY: 4aeb62f024e187606ee7cc9f5865c391c43df1963f459c87ba00e44bb163a866\nNONCE: 000000009559bd08718b75af\nIN: c5d586ceece6f41812c969bcf1e727fe6ff8d1ae8c8c52367c612caa7cdf50e0662f5dffc5ea7d3cc39400dfe3dc1897905f6490fd7747b5f5f9842739c67d07ce7c339a5b3997a7fb4cd0d8e4817ff8916b251c11ef919167f858e41504b9\nAD: 51f5b503b73a5de8b96534c2a3f2d859ece0bd063ea6dfa486a7eec99f6c020983f7148cccb86202cf9685cc1cc266930f04e536ad8bc26094252baa4606d883bd2aeed6b430152202e9b6cc797ff24fc365315ed67391374c1357c9a845f2\nCT: 252ea42b6e5740306816974a4fe67b66e793ebe0914778ef485d55288eb6c9c45fa34ac853dc7a39252520514c3cb34c72b973b14b32bc257687d398f36f64cc2a668faffa7305ab240171343b5f9f49b6c2197e4fbe187b10540d7cdcfa37\nTAG: ab1d8a5a1f3eda9b5609c0028737477f\n\nKEY: 9a19e72f005cae1ae78b8e350d7aabe59fc8845999e8c52fad545b942c225eaf\nNONCE: 00000000d9dae2ea8d2ffc31\nIN: 2110378d856ded07eb2be8e8f43308e0c75bc8a3fcc7b1773b0725b7de49f6a166c4528e64120bdf7c9776615d3ce6feeb03de964a7b919206a77392f80437faceb6745845cafc166e1c13b68e70ca2a1d00c71737b8fcbbbd50902565c32159e05fcd23\nAD: 1cd73b72c4e103afbefd7c777e0480f3f5e68c60b85bd2e71ef5caebb175d7fc6535d39f38f92c24f2eb0fe97d878ed3d5967c0bb4394a5d41f7d34cda6e1523d3848f049cde554a7d31e1afeab5d3e6150f85858335cbd28c8a7f87d528058df50eea06\nCT: 5f009fbce4ec8e4ca9d8d42258b1a3e4e920b2fbad33d5e9f07557d9595e841025193b521ba440110dd83958e8ee30219d952b418e98a6c624894aa248aedc0678f2d263e7bfaf54ca379fef6c5d2f7ac422ea4b4369408b82d6225a7a2cf9a9f46fd4ef\nTAG: 1c6bdff7d8b9554dc7bf40e50b37d352\n\nKEY: ba1d0b3329ecc009f1da0fab4c854b00ad944870fdca561838e38bad364da507\nNONCE: 000000008a81c92b37221f2f\nIN: 6289944ffa3ccea4bf25cd601b271f64e6deb0eba77d65efb4d69ca93e01996e4727168b6f74f3ccf17bd44715f23ceb8fc030c0e035e77f53263db025021fd2d04b87a1b54b12229c5e860481452a80a125cb0693a2ba1b47e28ee7cbaf9e683c178232c7f6d34f97\nAD: e57883961b8d041d9b9eeaddcfd61fa9f59213f66571fadffffdd1498b9b014f1ef2e7e56c3044d7f9fa7a1403a1169e86430a2a782137093f5456e142aad03a5f7a66d38009dd01b7fc02c9cf61642dedaf7cc8d46066c281ee17780674c3a36eae66c58d2d765075\nCT: 9c44d9135db0dbf81c862c1f69bec55a279794cdd29a58e61909aa29ec4c120c9c5a508d856b9e56138095714a4bb58402a1ad06774cf4ecdf2273839c0007cb88b5444b25c76f6d2424281101d043fc6369ebb3b2ff63cdb0f11a6ea1b8a7dafc80cdaef2813fa661\nTAG: 689a141bc11159d306dad7a4ecf6ad9d\n\nKEY: 0cf8c73a6cffc1b8b2f5d320da1d859d314374e4a9468db7fd42c8d270b7613a\nNONCE: 000000003c4c6f0281841aff\nIN: 4434728d234603c916e2faa06b25d83bad3348990ecde2344368d1a7af1309bd04251bb2e0b72044948f8dea33cce2618283b6af742073a9586b26c1089335fe735141e099785a1235810a3a67ff309e2f0ce68220ba0077ad1a5dc1a4aef898a3b9ff8f5ad7fe60149bd0bd6d83\nAD: a38d09a4f1c9241623c639b7688d8d35345ea5824080c9d74e4352919db63c74d318f19e1cbb9b14eebd7c74b0ad0119247651911f3551583e749ea50ff648858dcaaa789b7419d9e93a5bf6c8167188dbac2f36804380db325201982b8b06597efeb7684546b272642941591e92\nCT: bdfbfea261b1f4c134445321db9e6e40476e2dd2f4e4dbe86e31d6a116d25830762e065b07b11a3799aab93a94b4f98c31c0faeb77ec52c02048e9579257e67f5a6bae9bc65210c25b37fc16ee93bda88fd5f30a533e470b6188c6ce5739fa3e90f77120b490fc1027964f277f40\nTAG: 780cc54bb6f1c9b78545c1562cd9d550\n\nKEY: 69f4e5788d486a75adf9207df1bd262dd2fe3dd3a0236420390d16e2a3040466\nNONCE: 000000006255bf5c71bb27d1\nIN: c15048ca2941ef9600e767a5045aa98ac615225b805a9fbda3ac6301cd5a66aef611400fa3bc04838ead9924d382bef8251a47f1e487d2f3ca4bccd3476a6ca7f13e94fd639a259ef23cc2f8b8d248a471d30ac9219631c3e6985100dc45e0b59b8fc62046309165ddb6f092da3a4f067c8a44\nAD: 0c83039504c8464b49d63b7f944802f0d39c85e9f3745e250f10119fa2c960490f75ae4dced8503b156d072a69f20400e9494ab2fa58446c255d82ff0be4b7e43046580bc1cf34060c6f076c72ea455c3687381a3b908e152b10c95c7b94155b0b4b303b7764a8a27d1db0a885f1040d5dbcc3\nCT: f0bb2b73d94f2a7cef70fe77e054f206998eacf2b86c05c4fa3f40f2b8cebf034fe17bcbee4dea821f51c18c0aa85b160f8508bd1dc455cc7f49668b1fb25557cdae147bf2399e07fcacaca18eccded741e026ef25365a6b0f44a6b3dd975ee6bb580f5fccd040b73c18b0fbf8f63199ba10fe\nTAG: 2ecccea4607d14dbb2d2475792aeb468\n\nKEY: ad7b9409147a896648a2a2fe2128f79022a70d96dc482730cd85c70db492b638\nNONCE: 00000000a28a6dedf3f2b01a\nIN: 791d293ff0a3b8510b4d494b30f50b38a01638bf130e58c7601904f12cb8900871e8cf3d50abd4d34fda122c76dfee5b7f82cd6e8590647535c915ae08714e427da52f80aef09f40040036034ca52718ea68313c534e7a045cd51745ec52f2e1b59463db07de7ca401c6f6453841d247f370341b2dbc1212\nAD: 9a6defddb9b8d5c24a26dd8096f5b8c3af7a89e1f7d886f560fabbe64f14db838d6eb9d6879f4f0b769fe1f9eebf67fcd47b6f9ceb4840b2dba7587e98dc5cae186ef2a0f8601060e8058d9dda812d91387c583da701d2ba3347f285c5d44385a2b0bf07150cbc95e7fcfa8ae07132849a023c98817c03d2\nCT: c2f109d6d94f77a7289c8a2ab33bc6a98d976554721b0c726cbf4121069473e62ba36e7090e02414f3edc25c5d83ac80b49ad528cda1e3ad815b5a8c8ae9ad0753de725319df236983abd3f69ab4465d9b806c075b1896d40bdba72d73ba84c4a530896eb94ffccf5fb67eb59119e66a1861872218f928cf\nTAG: 17ec6cf2b172f01e3c456ad047196805\n\nKEY: 48470da98228c9b53f58747673504f74ca1737d7d4bb6dbf7c0cba6ca42f80b9\nNONCE: 0000000056fb4923a97e9320\nIN: bc6626d651e2b237f22ee51608ddcffeba5f31c26df72f443f701f2b085d6f34f806e29673584cb21522179edb62a82427d946acabce065b88b2878e9eb87ed1004e55ef58f51ec46375ac542c5782725ff013136cb506fcf99496e13fcd224b8a74a971cc8ddb8b393ccc6ac910bd1906ea9f2ed8a5d066dc639c20cd\nAD: df8ab634d3dca14e2e091b15ecc78f91e229a1a13cba5edd6526d182525ec575aa45bc70fb6193ffcd59bad3c347159099c4f139c323c30a230753d070018786b2e59b758dd4a97d1a88e8f672092bef780b451fd66ba7431cbb5660ea7816cdf26e19a6ebb9aadc3088e6923f29f53f877a6758068f79a6f2a182b4bf\nCT: a62e313ecf258cc9087cbb94fcc12643eb722d255c3f98c39f130e10058a375f0809662442c7b18044feb1602d89be40facae8e89ca967015f0b7f8c2e4e4a3855dbb46a066e49abf9cef67e6036400c8ff46b241fc99ba1974ba3ba6ea20dc52ec6753f6fc7697adbccd02b0bbea1df8352629b03b43cc3d632576787\nTAG: d29a8968067aeb457ffc114c3a9efb95\n\nKEY: b62fb85c1decd0faf242ce662140ad1b82975e99a3fa01666cac2385ab91da54\nNONCE: 000000002f4a5ca096a4faf8\nIN: 03b14f13c0065e4a4421de62ab1d842bffb80f3da30bf47d115c09857f5bdd5756fd7c9ac3d9af1c9fb94f2640f7f4386cfba74db468e5288dbe4dd78bfe4f69e41480ca6138e8beacc6eaa3374157c713cfa900c07dd836eaecc8827fa3e70e052ae09e8473e2ae1a10b1bb669ef60a8dd957f6553daa8114918e17371f2ac327bd\nAD: cfe3b7ab7550b0e8e2e8235fa0dcef95647ce6814abd3dc3f5a3bd7d6d282504660c34ad8341e4d11402c7d46c83a494d7ddb105e1002979023e0e3dc2978c9ae53e10eb8567e7a02b60e51e945c7040d832ca900d132b4205a35034fed939a1b7965183c25654931a9b744401c4649c945710b0d9733b87451348b32ba81de30ea7\nCT: 8965db3d3ae4fb483208f147276e7d81b71a86e7202ffc9b1eaade009bc01683",
     "8dc09ca4bcf30887b2f4243fbd652cd90ebed1ceef8151ff17ea70518d03b0f2a24960aa7de9b30fa65c2e2d57360061aae6d9376e984e9fcd5e5dd0911a4bc8deca832ffb76f252bd7da523076593ba6b174f7d9fb0377e066ecbb6638036241e86\nTAG: 28a5284696ed82714eaa94c9ebe6e815\n\nKEY: de9c657258774d4ebc09d109a0fc79d66493ae578797cac4eb8830a6a4b547e0\nNONCE: 00000000b5e35fe3398efa34\nIN: 4d68fb683aa4f4c7a16ba1114fc0b1b8d8898610fa2763e435ded8771b3651078bef73d4dfd14e76a34cd5eb9ef4db4ead4da9e83f4ce50fe059977b2d17d687c29335a04d87389d211f8215449749969f7652dc1935a0f9a94538dc81dc9a39af63446a6517609076987920547d0098a9c6766cf5e704883ea32feaea1889b1554b5eb0ce5ecc\nAD: 436ea5a5fee8293b93e4e8488116c94d3269c19f1d5050def23d280515457b931bbed64a542b317cc5023d648330a4b7adca14dd6f3783207b94f86ccaa0a0ac39b7db00ac87a99e3cd8a764ed9c75da8454479636ab2b29e770b166a5b75cacc425c919bf1ce9ac34afe6b4425c3d9fd2e48bc81e7d15516d60e592bfcc2ebefb660f0995f2b5\nCT: 97a97b8f0f5420845ae8d57567f9bba693d30e6db916fad0b971f553ad7d993f806f27ab8b458d8046062ced4778c004b4f958a4436141637c6039963308dea2f54008b7feab79650295ed41bf9e65e1a2d75ab1c7b2a70ebb9e9f38d07a9a672d3e95ea78afe9ac02f2566b48b0251aef6eeeca8bd15bd8d43b559426aa9d15d960ee35cb3edf\nTAG: 4ef49e8a0c2ef85826d7f03e81c577f2\n\nKEY: 6885bd333c336c7672db8ebdf24c1a1b605c5a4ae279f0f698162f47e6c73401\nNONCE: 00000000f0c4a213a6168aab\nIN: fa905a2bfa5b5bad767239fb070a7bc0b303d1503ecd2b429418cc8feba843e5444ed89022fdb379c3b155a0f9ceab2979000a0f60292a631771f2fde4ef065aa746426609082969530a9c70ad145308c30ba389ea122fd766081511a031ce3a0bd9f9f583c7000b333b79ac004fbde6ec3eb2d905977ff95dcff77858e3c424fe8932a6a12139e6ec8d5e98\nAD: 8ded368f919efb522bb6a9ad009e02ffbc6a16536e34d95cdb34f1153d7cb7b0f3c2b13dd05cedae27cfe68ec3aca8047e0930a29c9d0770c1b83c234dcb0385deae7ae85da73a5f8de3dfb28612a001f4e552c4f67ae0e2ec53853289b7017a58591fd6f70b0e954876bb2f7ec33001e298856a64bb16181017ba924648c09fc63c62eff262c80d614679bd\nCT: 0cb3d6c31e0f4029eca5524f951244df042fc637c4162511fea512a52d3f7581af097eb642e79e48666cb1086edbd38c4777c535a20945fabc23e7c9277e2b960aac46865f1026eb6da82759108b9baece5da930ccfc1052b1656b0eadaa120ed0c45ad04b24ae8cdb22ceab76c5f180b46a392ab45b1b99c612546e6b947f4d5c06ad5abee92ff96345ad43\nTAG: fad7d5a5193dfb121c68529ba8c0c35d\n\nKEY: fbc978abb1240a6937ccc16735b8d6ed5411cdbc1897214165a174e16f4e699b\nNONCE: 000000007968379a8ce88117\nIN: 1a8196cd4a1389ec916ef8b7da5078a2afa8e9f1081223fa72f6524ac0a1a8019e44a09563a953615587429295052cc904b89f778ef446ed341430d7d8f747cf2db4308478524639f44457253ae5a4451c7efca8ae0b6c5c051aaa781e9c505489b381a6dcba87b157edc7f820a8fbaf2a52e484dc121f33d9d8b9ac59d4901d6ed8996ed4f62d9d4d82274c449cd74efa\nAD: 3913cd01299b8a4e507f067d887d7e9a6ded16dd9f9bb3115c5779aa14239fd33ee9f25756d45262dc3011069356425b5c81a4729594e17c9747119f81463e85625d5603d05e00f568b0c800bb181eb717be8d7a93166a504ce1bc817e15530c5bd2b3df1d4222245ea78a38bc10f66c5cf68d661503131f11af885c8a910b6dce70bc3a7448dfae00595beb707fe054d3\nCT: d152bcb4c24c3711b0fad28548dc4db605bbc89237cdbea7dbf956b8855d1161a0781f27bd56d798141e2ace339955efb98fe05d9b44cd011e645106bf47726183958cb6df34ce5766695f60bc70b6fe0fabb9afa009a8ef043dbf75f861881368fa07726625448fe608d578cdc48277f2dc53eaaf1bdc075269a42f9302a57cad387a82c6969608acacda20e1cac4596c\nTAG: 96ae06cd7c72456e5568a42317046158\n\nKEY: 77d1a857fbadfe01aba7974eea2dfb3dc7bf41de73686aece403993e5016c714\nNONCE: 00000000fdd913a321c40eb0\nIN: db8915bfe651e2ecb3ce0b27d99a6bfa7a7c507cfcb2987293018636c365a459c6a138b4428be538413db15bda69e697cbb92b154b7f4d2cbb07965225aa6865d7dcd1ba2c17c484b00b1986fed63e889f25a4966dc3ed4273f1577768f665362d7d3e824484f0dded7f82b8be8797ad951719719365e45abbf76324bc7d657799d4d4f4bb1dba67d96ab1c88519a5bee704f7214814\nAD: 3cb2c06c20cb0832bbacebfc205d77393ca1816346ea2681de4d3ab1fadb774ad273e4713290454496f5281ebc65e04cfe84ed37cd0aedc4bbe3decbd8d79d04a4e434876650e0d64309e336bfb10e924066a64acb92260b2dbd96735d03af03909aa6a80a6e89fda81037257aec21fe9be7e91a64e88e0a58fa38ecba4c4c4cffb61958f3c486cbb0b1d0b0014a2d1d3df248eec1ca\nCT: acb825e6023b44b03b2efc265603e887954e8612b2ee134bdcb61501cfb9492952bf67be597c3a005b09af74d9e421a576d2c65e98104780feab838d8cb1bd135452ea39dc8907a4c1a6a9161805e4fa3e16989e6a418a7eea2582bf895da967028eab7c95d846a6de4b9980785814cf00484baa2f6de609912fff689bce6e854261ffe866bd8e63274605c7c5ad677bd7897ade543e\nTAG: bcf523a9bcf772e157941753c6d7401e\n\nKEY: b7e9b90dc02b5cd6df5df7283ef293ed4dc07513d9e67331b606f4d42dec7d29\nNONCE: 00000000a6c191f6d1818f8e\nIN: 2ada0e3c7ca6db1f780ce8c79472af4e8e951ddc828e0d6e8a67df520638ff5f14a2f95a5e5931749ae2c4e9946ae4d5eb5de42fb5b77d2236e2e2bd817df51be40b1b8a6c21015a7c79fe06dba4a08b34013dfa02747b5f03930268404c455dc54a74d9c6e35485e10026da573cb41cd50b64cfafe4cfcdf3c9684ef877e45d84e22bd5e15fa6c8fd5be921366ff0dc6fe2df45f7252972c9b303\nAD: 0f4269ed5ef0bfff7be39946a4e86e8bf79f84b70cd0b14fecb7be3c071316ce86de3d99d6871e0ba5667d9d7bba7dcaba10cb2a36668b6c3e2fb6c102938b75008bb9c213ebf9b85b5e91a802df0d31d7f11d764b2289f6225212694ab6b7c0e3ff36e84245d9f4f43fc5f98e654dea7ba9bd918658879c5bb4a1642af0d83113e3cf935d3c0d5208318f66f654eb17d8c28a602543e77ad3e815\nCT: 22586fe7338e99cdaad9f85bd724ba4cfe6249b8a71399f9a3707b5c4323b8d96679568dfc8d230aefb453df596e13eb3e8a439249bd64bc93a58f95089a62b94f6562b821c83d91f56c55147381e9de4beb4ae81bd6fe7caef7e7e9a2078f2fba8f3e70d4910da9accc92b8e81a61b0fefbece4bd89443e66e8ddda8e47a66a62f17fd0e7d0a4852ce1a4d43d72a0b5e8914bbec698f060f2b092\nTAG: bd05336ed6426de412aac37661953052\n\nKEY: 6b2cb2678d1102f2fbbd028794a79f14585c223d405e1ae904c0361e9b241e99\nNONCE: 000000007b3ae31f8f938251\nIN: b3cb745930e05f3ab8c926c0a343a6eb14809fd21b8390a6fcc58adb5579e5432021765b2d249a0ecf6ba678634c4f53f71495865f031ee97aa159f9ead3a3fcb823ee5238bdf12706a9c6137d236e2e7110ce650c321e41daf0afd62bab2a8fe55d7018de49a14efe6d83a15b2f256d595e998d25309f23633360f5745c50c4e5af8ccc9a8a2cb47064105a023e919c7795d2dc331d3f2afb8c42e5c0bcc26d\nAD: 1c32fd3df22b3e440e2a3c7a7624990194cb16a5f74af36f87fd6ca7d410ce9064316a2d091945deef7d9b35ceec8396069307caced2b80afd7d53ec479c35cedf2dfd4c95c3dd8400f71ad34028c6e4f8681d93d0774064ba38f3fb9b0c1dfa1f5f0c7d20676a5911d999fb6a1d41367a8e99d852bf3d3b7b3f4c233249ed1ca135389a674ff48232ded3f6800a97b6d409c40e6cd70d09bf9d2ad25d9b9485\nCT: ef70c7de98ab1d4ad817024a970be463443640eb0cd7ff234bdd00e653074a77a1d5749e698bd526dc709f82df06f4c0e64046b3dc5f3c7044aef53aebb807d32239d0652dd990362c44ec25bf5aeae641e27bf716e0c4a1c9fbd37bbf602bb0d0c35b0638be20dd5d5891d446137e842f92c0ee075c68225e4dbacb63cc6fb32442b4bcda5e62cb500a4df2741a4059034d2ccb71b0b8b0112bf1c4ca6eec74\nTAG: d48657033095db3f873c33445fec8d35\n\nKEY: 4dbc80a402c9fceaa755e1105dc49ef6489016776883e06fcf3aed93bf7f6af7\nNONCE: 000000002358ae0ce3fb8e9f\nIN: 197c06403eb896d2fa6465e4d64426d24cc7476aa1ae4127cd2bd8a48ce2c99c16b1cbf3064856e84073b6cf12e7406698ef3dd1240c026cbd1ab04ee603e1e6e735c9b7551fd0d355202b4f64b482dd4a7c7d82c4fe2eb494d0d5e17788982d704c1356c41a94655530deda23118cba281d0f717e149fbeb2c59b22d0c0574c1a2e640afad1a6ceb92e1bf1dde71752a1c991e9a5517fe98688a16b073dbf6884cfde61ac\nAD: cf6ce7b899fb700a90d2a5466d54d31358ecf0562e02b330a27ba0138006b342b7ed6349d73c4c5c6d29bde75a25089b11dac5b27adea7e7640ca1a7ceb050e3aae84a47e11640a6e485bd54ae9fdb547edc7313d24a0328429fcffd8b18f39880edd616447344ebeec9eadb2dcb1fa7e67179e7f913c194ebd8f5a58aea73b0c5d1133561245b6d9c5cfd8bb0c25b38ffb37db5e2de5cdded6b57355e9d215cb095b8731f\nCT: aa87f9a83048b6919c8f2b050315db4e2adae4a9c2ca0109b81961b520e63299dcb028cec0b9d3249a945ee67dd029b40f361245c740f004f8cf0d2214fcfa65e6124a3e74b78aa94345c46fdc158d34823ed249ee550431eaae9218367321cdd6e6a477650469bb3cc137a8f48d9cf27934b16703608b383d2145659922fb83bb2e7ee2ef938a90f2ff846a4a949129b1fb74dde55c5ae013c2f285de84f7dac7d1662f23\nTAG: 298f84c8312029a7b1f38c5ea6021f57\n\nKEY: 9e4a62016dae4b3223fed1d01d0787e31d30694f79e8142224fe4c4735248a83\nNONCE: 00000000263a2fc06a2872e7\nIN: 5a46946601f93a0cee5993c69575e599cc24f51aafa2d7c28d816a5b9b4decda2e59c111075fb60a903d701ad2680bb14aeda14af2ae9c07a759d8388b30446f28b85f0a05cd150050bd2e715ff550ebbd24da3ebb1eac15aba23d448659de34be962ab3ab31cb1758db76c468b5bb8ce44b06c4e4db9bd2f0615b1e727f053f6b4ffb6358d248f022bcad6ca973044bed23d3920906a89a9a9c5d8024ec67d7f061f64529a955ce16b3\nAD: 4cd65f68f9f88c0516231f2a425c8f8a287de47d409d5ecde3ad151e906b3839fb01bb91a456f20ea9d394d4b06604ab1f9009ef29019af79",
@@ -591,16 +612,16 @@
     "16b39afee75e53602de319484db89a51e844f38c361634e474f8f1f01c340f3f3594860d671346449c6d08ee38de22d246309bc7e4a252a29c86aa6d94b5b4fa58904c70\nAD: 1c2503d5aa1aad193f0da12874074ea0432bb76a61cd43a3017061514da0759846a0f3ae3a49fdb0b6d29f713de665beacb6568f2694112ca380d13f3c1698316866a7a7f87f1d7503a92176ab84fc08977b46ba664508a858e7525753c45511b3d2f407d5e993c6ede77f13d12975707e5195704970a89f71fc30828049f92f944f3aa93d6a5297e678e08952919beb7eac5919df1919cab3c3da6aa696a1eeab6371f310f7e81143e7d240b0213ae554524b52000306160dd4877bf13ba0f13bbe867da7c7d707f31335eef4cd942938ac890a0829ec66bd30ae01a2188a6e5ea0f17cd7dc875e17f03c0ab5dd18e36db8a1fc1f72859ee046b62368f168b3bea2234e0432c07b7d8e1b9277f21e692c513b9e816e6860\nCT: 7d35cfe4be56bd6e0e09dedcd01735b915bc1891a4d1f6a541abc4bcd0ebe89dcb8e365e5813742e8ec65777b6159422fada747da99394252baf8a046fc1b60ad79755f545f4448627b7acaf403000894f5641e78d3f946dfca29ec617f0660dcd6e8d8827e67e1022a245c595d86e60fbd176bf721b171bbe5ecaf4ae671b9f3dd3920146e6ad431bd8fc431820e19454b6ca209723d80fdbee187fca9c937c979206ae97be55f6ba7366a5608770a11d537396485eb0a66586385f4d4cf3905d1fc90831c3e136d5d513fa22be285193142994a3ed477145bacdcbdd791e8b3b88b0d4f1d18b27382550a818c4fd8884bf36f677c6c3ff5677406e510911e696af75e5b3f859bef699bdd16e6215fdb98d874025eada50\nTAG: 0fa4cb2bab84336409aa4349ab99a8bd\n\nKEY: 923d4b086b9e43b986f7b65e4cea6113a3d8aabefa89323c5e4d5b6f158bb7e0\nNONCE: 00000000a0f73297b87f5deb\nIN: 21435e8d5c8edf0684f58c2cba4070c10b4801adf46b6c4d322eb3990a38a9ad338ad704b9df6597f3e68d66cd5b56290c8466db2231e56d6bcb9c44e1bd081f42ca2a894dad369df2bd0d2c63d6c881732d6ea22bb22b5bc9a62eaffa1b094d0845f6b966d2cb095e7b3b8bcbc15e707449d35c8df4aea30c3b7243e977fffd59c80f1c5c9af4bb5a54b9c786fbbe8d21b2b906a87a786caed841a34a3e0cc0ac3209d83c58afba19edd63622dd261532d2cfb0b49d527d8eaa0887a087f5129d897f665264b229f860363d71a88b7d49c8dc6360182b357b0662391bb41337f46010ac32b9fada2d60a2efcb99365d3b27b7ac396900d1c821d0df8b86cc9cc1f2673259a33efea610bf8e1d00d7e9db2afea21da8f58c55f799999d\nAD: c853a8b39c0dc597d562f123cd221e4104b65423a062a4f4ba890ba344feb84290f61817e23330c365f58c3583ce08360d3c1171982ead5496d525ac878f23a57480a6ee39d4e65afd6268245bb982a2545fa1195427cdbbcd404cdad5198f55cce2a5a028fae435f71b15921d066e8d43766c32b2f2c3f57c0674e129607dcd3703eca529414adaee79d81fed432153cceb6f3fc53404810d8ec878f7d94be5d379d0e0e1aa9bc404b4b5d396038a9d76a5ce53c9f3759b8e50fb331858ca58cee81bfc3ee58baef5d19c402a3dc8b36370ec1ace5a4aa2527fb94b4f933a4ab8ccaaf6a5af5a779eae5667c2a24ab027e781c8d4f30c377aa5885a2fdaf6507d18cd824a847c35368b4ea984d2c3c3824a5b8ba3042e1852504a21a3\nCT: f2e21052eebbb86a4f5e803360855d8632aa727dca6f5e79dd74d7aff106e442001928d113005b030f8446f8eff2ee951db663978abe43090dd5ad2c51ba97a0ecf988c607d95e486d02524f690fa3c28d5c48c1f75c1f555e7b43fe7e46f2ca2b9fdb408ec4ba18b6cdde2af673183cb7b1a3c23ae77eddd4cac75e1ea14743fc571f8d31ce2e96787524cd48aadaa474181c096a032184574ddc25a6e0ac8441c212bc36298708e33c963ae931e6c6241d1affeef7b6ef759495df44b6ab647447693cf703569e69aa72f1def9a342b8978c1edea9703a421ca75b92cac4de14b88c693200022b8a2ed22b1c4678b99f4d695e080dd1196d7168e14f0d0f8ff880d742e97b9f6d00af1f7118e10b77c5ef3ea6c52f84a20fd6ea46dc\nTAG: 9bd8b7743c056bb2334833afd6143e18\n\nKEY: df73adab2768559ea983cce85453fe81d79be3b3c57f202b31b94d6635cf2e4b\nNONCE: 00000000e7a87e6bf6b5a354\nIN: 0032a37abf661faa18c587fd2aa88885c061deeba81105dd221969bed5d59c7204b09b1a8c4c8de3b9f748c7fc70626ebeaca060233a57b102221b1bf0f3d9fdaaad3d2b1439c24d08f9c67f49f3c47128f92ee530abf4c4f4573bc60ae4b38109f55bca3ca9e1ba9f9fd6e34ba0d174892977a53356e1f5c88c614fe3ff3b3dd0818e7a2285412e3b37444bbe8a80942efcfd03958809a6966cda9430b2f0c9e552f4bced6e19eb3e85fc5758bd7b588297ccbed37ed94c3adc8c08ea8b058462aac9d57a939ec711bc4ecfec944d2b653b7cfc7b02a65d7057c9fdadd51b9da8cc4a3c68dae9da8b9c5319c1a2baa3d6c891c5ac4a39461484b5a01abc64df447ada24c04a4363e605eaccf339a9aa515e724206206da6d22bbd2f52e64cd7c895\nAD: f833e5ab4f8bc89167f80f576b1d6b22cdd0e30721f5f735799746cf645b6eff531d4c7b03584f3dfcb73cbd35ac42736216dc7f0de098a4f42c61ceb4b227ee288e47d697a0a76afc762f084e8fdbf9351c28340c324771c109a469341ab10ca10483ed2af5e878d7d3dc2bced2f72da3d1a25852b103ee9878e8158eb4309c1ce528f3a178ace153b6d3ae0af0d577cb3cb1540489e80427f792217ad8a09b84f027fca7ceb651b4264e98e94b4cb8a37b133390897233e8ba9103628d05b9609e8552c4a4b11e3f2fa8d56af36957390e88cba44656be3edace798cf8cdf7771bac338a256bc3cba6df97728f222f423ca7c6d149c9372d66163a98f79a234b00d4b75fb2ec860dcc2d1998105e4b9c01d68f079f3e0aa21cc534047fc7b858f8\nCT: b842eadfdf431c135bd6581d3eccae54e2267d8890036aa33dfe2d2d9715c44625441210a3a0d666d708d30588fe851ec36e10d8fa3584ed77b095149494b7c54379d62c8935e1d2b9a8f47e4759ad0b3437fdf2cc2fb6c5ea25ad10e0bdc9dc5b0517fc237eb783cc461c46665e2b1d1a5b8008dbf409ea2a63fea0276de23a32c99d92a498807a0f95e208fc6262321a78aafaf0cc3f833fff37bd4efa66f6023a25cdc6702cee3912799563d908a5183c9956a06aa71085d855dc7c809ed6e2889592b361ab3ab39060f8e419152187a794a19c2a1128882201900ea2cd597860674bf78d9720643df8701676718fd201baed4935a88e50558daf86edd08a9ab227ac7afae55c974b68de8dacad4a4d79b13ed6dfe74017a4cb9148e033436fb6\nTAG: ee1ec36804e1d5cdbddb52608c711fd8\n\nKEY: 55a4be2448b464c2ea52a2f2664ed6aba865c14ea1fea77f4689331fd105c8d4\nNONCE: 00000000db37c0a405b4626d\nIN: d266e66272e5d3462081b004cb42429c8b9741e9f678153754d726f6f9aa513464763c5e793b482fe512fece97585f1426120d4cefb3d0a8cc0a8db4bde93fc72c78f44d4fecca14650c660d3e285b327e7cdd813063e7e867b8a2d059a41bab70432b7f857199894da90dca3fe5272bae1ec694a1a07b60b05df275784d4975637e4673109f3ba846dfd1a048b202ed8e89973be608b91ee4743b1e759900f1443038951fe6189e806638985f3c16338c3c60695df58e621154d79bb973859c4558e9dca90470f77c73f004443ad5db0717abbe43266f90e57397b83ac34d1fef2e897e2483d5bcdcb627abd64b0d1aef525835f25e76d6e9158232cdde6dce970b59f58de8a98e653be32fb58edabbcefa5065d73afdf1c9c4fbf50c1022bd22bfcb98e4b422\nAD: fd6a3fdd879f8880843eac20ae01c1b9dc3487d270a806572088ef2ddc1f1e0de495e71d4813bf5c501ad31e5d791c4b5b3a0a71b63fdddcc8de4b056064ef467989ecccc5d0160d403bf3a025d4892b3b1de3e062bc3581d4410f273338311eb4637529e4a680a6e4a5e26e308630a5b6d49ead6d543f8f2bf9050aa94ce091318721e1d8b96e279f34b9759b65037bec4bf6ccda6929705aeeeebe49e327e4d7a916620c9faf3765120658af34c53fbb97ec07657b3f088fcbdc401aa7949ddeda34d885018c2c23f4f0bb8218bf0d4fc90643658b4d8834f4a8c08e590c2a790995baa9e77627c342d283e454f84fcc05be15e9627a2d9be340c9d72f222bbdfc47905f56616cd9f936d49e4732f319f020513340fb8b22828db251b102b6b137c9533936d6\nCT: bd11ed07b7b4b30eeaf25d6a41a549cca0a5aee71f990ac566a37265d7af2ce3c03703427ee0b2755c2bdfc29f9d826aec6ee4ad28af48079ac23db16580b97424f3a4e35cc23625d39f95699d9ff5143e9a2bc26fcfee4f125f5aa2d968ccfc2faaf9db3c28850f6757f735cbc50c94c498bcde4f23bffafa8dd5f70d1a011e35eb26e905d4e68848fedebeb197be595c085ba33f11ba8398258445051751888e9bba111f800f31b37c447074ca6dce6d54b4dfad6cee5138643d4f6ac045e8047248924e88ea4294c7878bc22c9b41924ce301f22693c33733107bf1ba85e34806c5e4366ea66fc52a5f89dd9bf213239158b3d4d2600dde696c61d76c398b9bf10de9118e812e891c8f3355c0ecc6405f79bc32a58905e37888a1d8395fbedc3ac54eca569f\nTAG: 296a397d280d026fc3627f4718971be9\n\n# Tag truncation tests.\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19",
     "ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c2\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f3\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f37465\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a84\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a8413\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a841386\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a84138648\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a84138648a5\n\nKEY: c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865\nNONCE: 000000005d9856060c54ab06\nIN: f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e\nAD: 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51\nCT: b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36\nTAG: d3f7b9c295f374651a84138648a591\n",
 };
-static const size_t kLen17 = 17493;
+static const size_t kLen18 = 17493;
 
-static const char *kData17[] = {
+static const char *kData18[] = {
     "# Test vectors generated from libsodium with this code:\n#\n# #include <stdio.h>\n# #include <sodium.h>\n# #include <stdlib.h>\n#\n# void hexdump(const uint8_t *in, size_t in_len) {\n#   for (size_t i = 0; i < in_len; i++) {\n#     printf(\"%02x\", in[i]);\n#   }\n#   printf(\"\\n\");\n# }\n#\n# int main() {\n#   uint8_t nonce[24];\n#   uint8_t key[32];\n#   uint8_t m[64], c[64];\n#   uint8_t ad[16], tag[16];\n#\n#   for (size_t ad_len = 0; ad_len < sizeof(ad); ad_len += 4) {\n#     for (size_t m_len = 0; m_len < sizeof(m); m_len += 5) {\n#       randombytes(nonce, sizeof(nonce));\n#       randombytes(key, sizeof(key));\n#       randombytes(m, m_len);\n#       randombytes(ad, ad_len);\n#\n#       unsigned long long tag_len = sizeof(tag);\n#\n#       if (crypto_aead_xchacha20poly1305_ietf_encrypt_detached(\n#               c, tag, &tag_len, m, m_len, ad, ad_len, NULL, nonce, key)) {\n#         abort();\n#       }\n#\n#       printf(\"KEY: \");\n#       hexdump(key, sizeof(key));\n#       printf(\"NONCE: \");\n#       hexdump(nonce, sizeof(nonce));\n#       printf(\"IN: \");\n#       hexdump(m, m_len);\n#       printf(\"AD: \");\n#       hexdump(ad, ad_len);\n#       printf(\"CT: \");\n#       hexdump(c, m_len);\n#       printf(\"TAG: \");\n#       hexdump(tag, sizeof(tag));\n#       printf(\"\\n\");\n#     }\n#   }\n#\n#   return 0;\n# }\n\nKEY: 1f4774fbe6324700d62dd6a104e7b3ca7160cfd958413f2afdb96695475f007e\nNONCE: 029174e5102710975a8a4a936075eb3e0f470d436884d250\nIN:\nAD:\nCT:\nTAG: f55cf0949af356f977479f1f187d7291\n\nKEY: eb27969c7abf9aff79348e1e77f1fcba7508ceb29a7471961b017aef9ceaf1c2\nNONCE: 990009311eab3459c1bee84b5b860bb5bdf93c7bec8767e2\nIN: e7ec3d4b9f\nAD:\nCT: 66bd484861\nTAG: 07e31b4dd0f51f0819a0641c86380f32\n\nKEY: 4b6d89dbd7d019c0e1683d4c2a497305c778e2089ddb0f383f2c7fa2a5a52153\nNONCE: 97525eb02a8d347fcf38c81b1be5c3ba59406241cf251ba6\nIN: 074db54ef9fbc680b41a\nAD:\nCT: 1221898afd6f516f770f\nTAG: 75e7182e7d715f5a32ee6733fd324539\n\nKEY: 766997b1dc6c3c73b1f50e8c28c0fcb90f206258e685aff320f2d4884506c8f4\nNONCE: 30e7a9454892ef304776b6dc3d2c2f767ed97041b331c173\nIN: b8250c93ac6cf28902137b4522cc67\nAD:\nCT: e2a13eeff8831a35d9336cb3b5c5d9\nTAG: 62fdf67735cad0172f9b88603b5f3c13\n\nKEY: 6585031b5649fcabd9d4971d4ac5646fc7dca22f991dfa7dac39647001004e20\nNONCE: 705ee25d03fec430e24c9c6ccaa633f5b86dd43682778278\nIN: 9a4ca0633886a742e0241f132e8f90794c34dfd4\nAD:\nCT: 0a8e6fd4cd1640be77c4c87dde4ae6222c887ed7\nTAG: edc4fbc91dfa07021e74ae0d9d1c98dc\n\nKEY: dfc6f7c86a10a319ebcb6362997e585f55b67f3434f47dc4039c2d67973e3077\nNONCE: 6097f30fd75229d928454c7d59a2d2c58bfddcb14c16438e\nIN: 74c946a7f0733377e852a23087506a28dccef86e101a4359c0\nAD:\nCT: 6e8ea0bb4c2f1323841d8e236816c61c3295866b75cefb5c25\nTAG: f16c0e9487ca7de5e7cb2a1b8bb370fc\n\nKEY: 59b8d488773767c4804d918709cfec6c69a193371145bb94f183899851aaadac\nNONCE: ad5bdf8f190ca2d2cc02a75bb62aa22274cb3c98fe2d25f2\nIN: 066b9ed10f16d3dc132b409aae02d8cac209dd9b4fb789c4d34725ab2a1f\nAD:\nCT: 2bbd4542489006df66ad1462a932524642b139ddcbf86b6b480e9e6d976c\nTAG: ca4835419ba029bc57010a8cc8bca80c\n\nKEY: 8c0cb4633cf8dc6b4b9552d1035f85517cb1ba4c36bcbc43338a8c6c7d15ce20\nNONCE: 8418b9655a0376fadefa3cdf8805815c4f7b56f467a74a95\nIN: 50c205a9c5d4088ba8e59a96fcd837f5170669854547678288199f1078ff2a81f0b19a\nAD:\nCT: 8b55a12df1a85dd3fb19c34ab047a85849d15a30225bb5360bad1f0a8f5f2bd49f5898\nTAG: bce13201df6e4a7e6d896262e45d969d\n\nKEY: b45386a75a5772e34bd193e1946f69ebfb90c37ae4581d39c9669d75e4584f50\nNONCE: 9fb763d0926585b5f726af9b8e3babdb331e9aa97f8d99ed\nIN: 64df0e341145d9e4a0d090153591a74893bc36cb9dae1e9570d8fee62e907cf004f9d8a360343483\nAD:\nCT: 3146d8a5c898edd832ec9d126e93b3a433ec97dc47dce0e1985bda88c88c6aeca46fc7d9a68e30ab\nTAG: 44fdb0d69abd8068442cb2ea6df8b2f2\n\nKEY: f2efbd358dd353639a162be39a957d27c0175d5ab72aeba4a266aeda434e4a58\nNONCE: 65a6f7ebe48de78beb183b518589a0afacf71b40a949fa59\nIN: f7473947996e6682a3b9c720f03cfaf26bbcdaf76c83342d2ad922435e227a5d1eacbd9bd6ea1727ec19fb0e42\nAD:\nCT: 778a0fb701b9d671ccfaf1454e8928158ede9bb4395119356a8133036840c1bcbb8fe5e19922fbbcf8b18596e7\nTAG: 9d195a89fdd29ca271405d3330f996f9\n\nKEY: 9dd674fb4a30a7bb85fc78050479ab0e2c3cc9f9f5b8689a7a67413aca304b21\nNONCE: ad9e8fe15940694725f232e88f79cda7c82fe1b8aae58ba4\nIN: 7272bb6609cbd1399a0b89f6ea255165f99330aeb170ac88fccdd8e226df0952407e35718fb5edc9e987faabb271cc69f7e7\nAD:\nCT: 846901650cb38974463a18c367676e1579ebdaf3e96b57224e842f5d5f678f3270b9a15f01241795662befb3db0768800e25\nTAG: 900004db3613acbeb33d65d74dd437d7\n\nKEY: 280cbe7380a0d8bb4d8dd4476012f2eeb388a37b8b71067969abb99f6a888007\nNONCE: 2e1854617c67002599e6b077a812c326deb22fe29d093cbb\nIN: d0901ec3d31ece2832685ff577f383bdff26c31341ea254acee7c5929a5df74fea2aa964524dc680b2f55fbd4fea900e956c304cc4ac3c\nAD:\nCT: 546370726cc63068d3520d67f4f57f65d03b9ecec21c2a8c7b1133089ad28b07025a7181bddeb4a49f514fac1a44f64ee3af33d778fb98\nTAG: 39084e33e42a1b05f58da65ba487d138\n\nKEY: 887564f75afa78f595cdadcea7340d20f5c5a2df169d0ad14b15fe32ce337004\nNONCE: 54c11df13d1f444da80b0964caeb59474b17b23a650a33f5\nIN: f0f008eece79ecb24b715dff8a3456dfe253924b99f98f2f1b18564cced50925fca860d1c2d4785bdf4a964c76c3079efa6b37c4ba2cacc534fb590c\nAD:\nCT: 32bb077268568d569b39e8ccdeeeb447ef424eaa2ffab565209a19b16a25952f897e5405bb0d67d8c9005d1c0b32687164d17fa4d0f412b80414c025\nTAG: 0bac7c0f8dce12917fbd4ed1738ac0cc\n\nKEY: 21c6aa88eb1a320d251f71a4b312ca75347040990d869a1dd2a1982c30fda2c7\nNONCE: 7dead2f1a3d9d45a9124a40efe8994300976991a4417ef4d\nIN:\nAD: e1bf7de4\nCT:\nTAG: 341e9d0687006f981bced2f985f953e6\n\nKEY: 0c97b9a65ffcd80b8f7c20c3904d0d6dd8809a7f97d7f46d39a12c198a85da5d\nNONCE: 1f2c1dbc5f52fc9c8f9ca7695515d01d15904b86f703fba3\nIN: ecaf65b66d\nAD: bd8a6f18\nCT: 8d1b2b0e38\nTAG: 27a7c7ac8bda627085414f0f31206a07\n\nKEY: 4ab5e3595f39c4379a924e5f8ebcf3279075c08d18daff01d9ddfa40e03faf12\nNONCE: 94e6ddc294f5f1531924ec018823343ebcc220a88ea5ee33\nIN: c91b73abe5316c3effc6\nAD: c576f6ea\nCT: abe960fbc64b339c53b1\nTAG: 7ebae48a2ff10117069324f04619ad6f\n\nKEY: a1e6146c71c2ea22300e9063455f621e15bd5bf1a3762e17f845e1aba5dd5a9c\nNONCE: 82ddb6929abff8a9ad03dfb86c0bb3e7c092d45ebfa60a1b\nIN: f011f32ccc2955158c117f53cf7b12\nAD: 5d14bc05\nCT: 44592321c665f51e9ffea052df1fea\nTAG: d556798b97f9b647729801419424affc\n\nKEY: 7a1af30362c27fd55b8c24b7fca324d350decee1d1f8fae56b66253a9dd127dd\nNONCE: 61201d6247992002e24e1a893180d4f0c19a3ae4cc74bf0c\nIN: 5c7150b6a4daa362e62f82f676fdc4c4b558df64\nAD: 00c49210\nCT: 27d9e2730b6809c08efbd4b0d24639c7b67486f3\nTAG: 5889fdee25379960038778e36b2cedb2\n\nKEY: 0b3fd9073e545ac44a7967263ead139c9547f7a54f06228fd3c8609fa2620784\nNONCE: 6450e1097d6f9ea76eb42e8e65972d501041c3a58baf8770\nIN: d679ae442b0351e5bff9906b099d45aab4f6aea5306a7a794f\nAD: 318d292b\nCT: a3f9ee45316d7b0f948a26145ee4fd0552bc6dc25e577e777a\nTAG: 0068a401a194b8417ec0e198baa81830\n\nKEY: 047c7d378fe80c02ee48df6f679a859253aed534fdcdd87023eb3d2f93fcafe3\nNONCE: ed240b0ff6f8ac585b3ea1ab2dab8080fc2f6401b010c5d0\nIN: 7288afb4e0fa5c58602090a75c10d84b5f5f1c0e03498519afe457251aa7\nAD: e4310302\nCT: 87906b14ca3e32ab01523b31ae0bb74590ce9e1df0811e743a2c7a93415a\nTAG: 3a0abeab93792b1ffe768d316da74741\n\nKEY: 1ad4e42acc5dfd07eb0a2456e9103cd0e150a36c667eb2f2b73c0d1ac1089ce3\nNONCE: 48efb52387284c5d38b4940c75f0c39a3f81f60bfebb48cb\nIN: da7edb5b3193b4484f09efa85fcf85600968ecdc537d3829a469c866ee67b0df677866\nAD: 446be8e3\nCT: b76457ca99e95b6539b12f1d6bdac55a6d5c6469b1ff274459363ec05241f7e6e5d3ce\nTAG: 06880ee508ce929da5a81f8b9de0031c\n\nKEY: 702a554c1b703d4dd69ad51234293ab787a01e15bdb3ce88bf89e18c01a67164\nNONCE: ea535d9c371241b9850b8b4a596b63db79eea60bd2cd9fbb\nIN: a97156e9b39d05c00b811552d22088d7ee090a117a7f08adac574820d592021f16207720d49fb5fd\nAD: ba5790e3\nCT: 8d0b2b04479c33287096f0c6276a73f6c037edc1a2b28f8d3b2b8e6d4c5f9dc5113309dd3ecb15e6\nTAG: 3cf303305e12924d29c223976699fb73\n\nKEY: 1bb7303fefa4d8d344bb9a215901b2314324bf1f3aeb9df5d1c1532c3a55ebf1\nNONCE: a304551e5f0dc98995ddfee6215a9995023a3696debfd302\nIN: 6cf6819ce3e7ed9d4f85f4a5699701dbcaf3161adc210c0b7825ddfd83d6d7c685db62f68b3801ccc8a786066d\nAD: 901c5feb\nCT: bc5ef09c111f76e54f897e6fce4aee1d25b6ed934f641ed5262d0c5eed45f610a6aea3b58b7771e34256d43a16\nTAG: b83f73f7995ba1b243dbf48ddfeb8e3a\n\nKEY: 24b294f6cbac10d87158d1c6aca83b337d596132afac7633f69a3b3e58823f11\nNONCE: 805772ff619cc6fcc5ec0e9965435d6f74a2290c055ec754\nIN: 65e8581286868caabcec1a9814db00b805edc660b94ee3babc6ce19a3ca868bd322105484d59b4ce02ced4071bc16642a1f2\nAD: 7ae1",
     "c561\nCT: fe1d463b1466e8e411f0b0700f90760472ee5141f3e5afef43fd729f1623dca75cd4d00576765b335f8b2b77b00527599cb3\nTAG: 111d8540fd5ec04b9ba16ed810133026\n\nKEY: 38e63e8b6402ac3f6d1641a1e3b74d2074be0fe41129975a3ff62b74ca52af05\nNONCE: 228d671b036710cbdaa72e9bf1d9ed6982b0bb3428a69fd6\nIN: 20a8d18878924d09aac32853c10e73dbd741134b7050ae6999839f2dbc727cb0052b5497c4bbd2a89e716278f15c81b871953614a49693\nAD: e9e6ac73\nCT: 80e0fe8eb26e5df229c6d939c944d440a37aa3cabf76eab5b9a420095513021ea4241ab367f6f44a20817b14631549ae6c96aa963970e1\nTAG: 1e80fbafcc7168e0494fce4cd76d692c\n\nKEY: 4325dd8406fdb8431a81f1b5db3603995256de36121019724cca2190c87a6e83\nNONCE: dcbf3077b36d5d678d668fd2d0c99284c780b55c4658ea75\nIN: 4f599ad04f79be9add10fdc649b8be53e1062ea5e9c2bed22265dc6fb30d5ab4fd4425b38ff14d8e68013405bec1eff8c9ef3069902e492aac73dcd9\nAD: 6fa0d757\nCT: 7decbdc7043495c59ecc64e720436bb0708b586a46f8745f74391477f5a2520905dfcebc3765a330999013d309dfaa997bf70bab6a0b8f4f2a2a3cdf\nTAG: 051ec4ecce208d9be0cd17f434e13be3\n\nKEY: 2d3d9ed4bc9eb9668733bafbb73e88be2cd17021c3a23be69b981d9f0df71df1\nNONCE: 84cae69639240c82b58895997511f145e474ebe1b008f391\nIN:\nAD: 64db597c26a4c3da\nCT:\nTAG: 2a22c4a962d46a719014ab7b0ffaf6d3\n\nKEY: 09ec4e79a02db53b19b54dd2d3592afc92c74ef57d1e0f51f3726a6631b1b73f\nNONCE: 2907ced16e0777fedb1e2de30df11b3fd712af41dd714a4b\nIN: b6e50cd4ea\nAD: b5488e9b7f339b7b\nCT: 0163e75330\nTAG: e29401c6d756adcc516580ae656852aa\n\nKEY: 9d5ac25a417b8a57b85332979e8a7cbad23617bb27772bbccc2acb0acae7b755\nNONCE: ff152421688dd6af7fef87817b508493a32d97a06fbda4f3\nIN: 92f4b9bc809be77e6a0d\nAD: 892b793f7a6e0727\nCT: bcc594f59de8ee8c22c6\nTAG: 1a8275816c0d32a1b6cfd41fa3889558\n\nKEY: eccf80c5f744d2ecc932f95ade0d9fe9327e19795023db1846d68d04720a2401\nNONCE: abc050fad8876589633b222d6a0f2e0bf709f73610aa23ee\nIN: 45a380e438405314510c166bac6840\nAD: c32c9a1ce6852046\nCT: 9fa452dc9ca04c16ff7bde9925e246\nTAG: 3d5e826162fa78de3fc043af26044a08\n\nKEY: b1912d6bc3cff47f0c3beccff85d7cd915b70ab88d0d3a8a59e994e1b0da8ac8\nNONCE: d8756090a42eea14ff25be890e66bfe4949fad498776ea20\nIN: e2f85df2ebcfa6045bd521abfe8af37fc88a0be1\nAD: 4576bb59b78032c8\nCT: 5eb6324aa48e0a4f72f5cb0a4917faf93af4209c\nTAG: 774f8077f039588495045fee07950e14\n\nKEY: 85162b111c9f3163f57c2cbc311a1e9aeed9dd6136b5784bc9c0b5052f8bffbd\nNONCE: 23cdb8b546bb8a5a746b24446f0ab4199f0543d915ff51f1\nIN: dc81000077d5743beef09ac91663885d984212bbccf3dbe6f3\nAD: 3084f3e9c4d0a15f\nCT: 692d17ae0b524ec6edc0cf49b69ac90c99bed44691f7ae63b7\nTAG: efe72ff84b3bccb4d83a27ddc574bc21\n\nKEY: b05ca358d8ca79f51283d83e2673bfb741c379ba271a773b8dd9c6a108e758d3\nNONCE: 9a53ad79f535c6e9da011463063c896f2ec7645e6e3548fc\nIN: 44e793742c774020e7349c996418042dc0dc30ee2bfd2654008c8929a436\nAD: 71ab5948c5e0f4c6\nCT: c5eddb7aeaa175b5f3dab68cf746f2acaf56fc62b29804629e25e2d63879\nTAG: bec3b7a8b8dad22ff3d14d26273294d2\n\nKEY: abb5136a01354c765a96e832df58bec3b088bd19dc4d6bd6674f2f02007ebdaa\nNONCE: 71267ac9f4fe5caa1d52cd85948a170a778f0141d54dbffe\nIN: afb526fe41c4e2a767ce77c4145b9d054268f5f3b279237dec97f8bc46f9d158868b86\nAD: 047baa2b04748b62\nCT: 0032d4c1e65da2266539464c5d3c2b1618454a6af0e7f1e3cfc87845c75f2f4ae8b03f\nTAG: b526a95a33f17ab61f2cdfc1e2dd486a\n\nKEY: bb826ed38008a0d7fb34c0c1a1a1149d2cad16b691d5129cc83f5eff2b3e5748\nNONCE: 4e02fe0915d81e9d5a62e5b3551b9db882e3873c0aaa230d\nIN: 20270d291a8d9791b0f5e35a64387bb4237bad61169841d7e1667c994ad49869c7d5580ffa752a2d\nAD: db852a275081e29b\nCT: d740012efb7e1bb986ce2c535134a45f658b92163c109bdecf1ce5b836879fe9e006a56be1fac8d7\nTAG: 21e931042e7df80695262198a06286c9\n\nKEY: 938d2c59f6f3e2e7316726537932372e05e8c1b5577aae0ee870bf712ff001ab\nNONCE: fb4d71cf7eb2f70df9759a64c76a36b75203f88bf64f4edb\nIN: 8910415d674a93c54c8f5e4aa88e59648d9a0a5039a66837d58ab14f0665a5f6d9af9b839f9033d0fe8bc58f19\nAD: a3fca278a63bf944\nCT: 1905c6987a702980b7f87f1ed2d3ae073abe1401b23434f3db43b5c37c979c2068ce9a92afedcdc218003848ea\nTAG: 1bd712f64777381f68be5ccc73f364a3\n\nKEY: dd0521842f498d23236692a22db0eb2f0f14fef57577e5fb194503e206b0973d\nNONCE: 519e0eee8f86c75c7a364e0905a5d10d82073e11b91083a5\nIN: 61ff13acb99c5a7fd1921ec787c8de23c1a712ff002b08cecc644a78c47341eab78e7680380c93c7d53d5e56ef050d6ff192\nAD: bb5c4e5ae8f7e461\nCT: 9bfdb0fd195fa5d37da3416b3b1e8f67bd2a456eb0317c02aabf9aac9d833a19bda299e6388e7b7119be235761477a34d49e\nTAG: 0f0c03b8423583cb8305a74f622fa1f9\n\nKEY: 189bd84be3fb02723539b29cf76d41507c8b85b7217777ee1fb8f84a24aa7fee\nNONCE: ef1bf39f22ba2edf86853505c24fafdf62c1a067963c63ba\nIN: d5f96e240b5dd77b9fb2bf11c154fcbff312a791c3eb0717684e4fd84bf943e788050b47e76c427f42f3e5344b2636091603ba3b1d7a91\nAD: 93368a8e0900c7b6\nCT: c55a8b7f587bee4f97514582c5115582abffd6312914d76c2568be6836f62ba098789ed897c9a7508a5dc214bf8c218664f29941ccdfd6\nTAG: 78f87352dcb1143038c95dc6e7352cfd\n\nKEY: 23a2dbfcd02d265805169fa86e6927c7d49c9a24d2707884e18955e32dafc542\nNONCE: 305c7851f46f23ea8d832d5ed09d266714fd14f82ba0f69c\nIN: 224de94a938d49cad46144e657e548bd86690a1b57b81558095eace59df1c552600dea389aaa609304fbc1eadf2241f2118c8bdf04522e1898efe1d4\nAD: 0075b20502bd29b2\nCT: 8e10c59369bbb0d72958100b05788498f59588795e075b8bce21d92d320206348b04010ced9b8cd3d651e825488915ce4a6e4f1af2f4d2f77b955376\nTAG: c39f0595ae8112dea6ef96df1c12458b\n\nKEY: 264e3c3f47bdf795cdde57d9a30be5a4da8b18463c0e3e05df28b7bf4e56410b\nNONCE: 3ee09b6e205c261bf48ac53a9ba0afa460a5d5c0f2d80be8\nIN:\nAD: 8eeec09d8972cb8ab0069554\nCT:\nTAG: 245a034d84edab9fa6f0decb6b984766\n\nKEY: d8ba98a272b5f91797b04b114311c3b92b7f2e3bb72edb7f78ed311b9f8ea2ad\nNONCE: 481de9a06eee76a501e3c2b9d7423d90596193ad9d8a6564\nIN: 9ee1a3134d\nAD: 928653701f6d6c8429b08c0d\nCT: 459a07898f\nTAG: 9188ec8d8e3bd91dcfda48fcc76773f7\n\nKEY: ac9afd627a745df682bb003517056f07876eb94d2f8c610c61b6ac0d34ec4ec0\nNONCE: eaae7b8704530db1e8c3dcc968a00604a333c7c27ba51b16\nIN: f7c3f6ee2e9c03394dc8\nAD: 796620b367d5f041821baf69\nCT: d4a69005790cc91d8d34\nTAG: e4c83def113afcf83a1ea8cb204a0eae\n\nKEY: ea1a07c1fd60a5421f1fb6c43b4318090e290c97aa3bfa037e6fc5ee00fd47d4\nNONCE: 37327805cce92b38a669affbca1de92e068727fcf6fbb09a\nIN: 7002ca765b91913ee719e7521ef5ac\nAD: 64e7c48fc3041eac0734737f\nCT: 9d8857a8c52a9ab3bf44b024b191b6\nTAG: d072c31714a7d0fe1596fd443a96e715\n\nKEY: b3beb34fe0229fc8f49b354e941025bde6a788f25017a60e8a49591ed5d7e7da\nNONCE: dd0e9fec76de1f6efb022b12164f7e9248b8e8c01d14ac02\nIN: acf360d7529a42be1f132f74745a940da9e823f2\nAD: 1489ca8d852f0a8547dbe8bc\nCT: 2e8718372d6e8167213cf112dc41c80377244f5a\nTAG: e4f31e8f84b9356999dc60989009e698\n\nKEY: 9357cecd10bab8d2e42ed88c0386204827c3b76e9e51150d09fd4e3b4e0e1e6f\nNONCE: 81f2106a5379e0ed861cf76b3cf95afb17515478b5cbcae9\nIN: ee51a0f25d091288b5e2b91ad11d491329e48b35a18a3a8685\nAD: b80cb677f4b409cd1537363b\nCT: f681f19fa8de1fdea3538001a46f30fa6333b76d6439337e68\nTAG: afad5e6d282d9df6d8119c32237b3e60\n\nKEY: 9f868600fbf81e40398b7dfb201fcae35d34bba10908860b0b2bf8b942b4e8fa\nNONCE: 2ddcc13c97185614095d437900b8c0a9170e0a4a50e46ba5\nIN: 133fa3ac176fee6df67472752e41c6834f13300c0064ff5b190f903b7ac7\nAD: 0d61321fbee8bb1f3f5cb454\nCT: b93abb311ec0bf018dc300c7d511b42ade72780373186e231820b44f22f0\nTAG: f8bd2f649a337783ff911e37966037bd\n\nKEY: 05affcdfce0a28539924370db8d80a78b835254778ec41acbff52bfab092fa33\nNONCE: 3edaeb185f7273b1a7cccba54f84c5f7d6583433b49d3694\nIN: 7657581faad266cc1037962a380c8aa5306f88000427d0a05397696b503790ad2643c6\nAD: d7c213e9e6f4a40f3e5b662c\nCT: 5eb19080aadc89f2329da4f5c41dc60568651c424c1b05d827f2bfb8dbff42c5a08224\nTAG: 2da20087b5674f0b967d1baa664bbd82\n\nKEY: 645ed60ec74ddfe1f02694792db4436c262d20405d8645cd9755d64876219799\nNONCE: d83665b44c1fdf567299f2b8501e9c0e7ae2dda0bb8f2c82\nIN: ceee69d32ad4667a00909964d9611bf34fd98be41ad7f0feaaaff8169060d64cf310c13bcb9394cf\nAD: 57379f8f44191ec9cf3b1a07\nCT: 4496a0666f0f895ebce224b448a04502f2ae7b354d868b7c54295bf051162e82c530c767d1ffd2cc\nTAG: 1ffc56da4fb961ffdfabe66d82ec8f29\n\nKEY: 06624c9a75bb7dbe224a3f23791281f53c40b407a14161a3f82f34924623dc02\nNONCE: e647b8b4739bf542a81d72d695e1cd6ba348fa593987ac47\nIN: 2658763f8d70e8c3303582d66ba3d736ce9d407e9507f6c6627e382d0144da157d73d0aee10ef034083cdd9013\nAD: 75536443a6c2189a57d553bb\nCT: 305cab5c2f9a6edccac307d6965febe3c86f2a1e31ac8c74e88924a10c2a29106bce980c803b7886985bba8ec5\nTAG: 8c12bb58c84175b9f601b704d0f8a25c\n\nKEY: 63aeb46083100bbcc430f4f09bcc34410df9cfd5883d629e4af8645ffabb89c2\nNONCE: b09830874dc549195a5d6da93b9dcc12aa1ec8af201c96bd\nIN: 1b3c9050e0a062f5a5cff7bec8706864c",
     "f8648142ec5cb1f9867ace384e9b2bba33aab8dc83e83b2d2fac70cd5189f2b5ab5\nAD: 7dcc05b0940198bd5c68cdf1\nCT: d8b22e5d381de08a50b163c00dbbca6c07d61c80199cebd52234c7bd4f7ed0a90d47ef05617cdb8e3f782875ae629c0f0ad6\nTAG: 194077f0e6d415bf7307d171e8484a9c\n\nKEY: 4826c1bf8b48088fece4008922173c500ff45790f945b1027f36110da4fecc92\nNONCE: 3a78fc7397944d762303b0a75974ac92a60e250bf112600a\nIN: d26e3a2b92120ff8056bb992660cc8a2364792589c16a518b8d232b8184aed05ba8d4fd0b2ad2b928cd873e11905a21ffece5f1e63c974\nAD: 904d2cd3e50f7bfb9352f142\nCT: 21f4cf679662fad36f57945fc0c0753c3791261eb58d643278dfe1f14bfb585c5a01370ba96f18dc3f6b6945a2c6997330b24f12f5219a\nTAG: 95397c54428f9d069c511b5c82e0151c\n\nKEY: ec526c03d8a08e8a63751112428a76399c399e8b83d98c9247c73164805ac8fe\nNONCE: 2cc1a6ae89c2a091415fa2964b44a0e5da629d40d77b77f1\nIN: 567377f5b6df5442e70bc9a31bc450bd4febfcf89d7ca611353c7e612d8b7e36e859f6365ec7e5e99e9e0e882532666dd7203d06f6e25439ed871237\nAD: 35575b56716868b66cd21e24\nCT: 6b738274fe974438f1f5fca8ef1ee7df664f1e72bc54ccd3fb58c4a3df67ef9a73261df41ffe9c52aeafc8be4f6524baf9efb1558d4a57defec7bee3\nTAG: 92599d4b14a795e8c375ec2a8960b4dc\n\n",
 };
-static const size_t kLen18 = 96825;
+static const size_t kLen19 = 96825;
 
-static const char *kData18[] = {
+static const char *kData19[] = {
     "# RC4 tests (from rc4test)\nCipher = RC4\nKey = 0123456789abcdef0123456789abcdef\nPlaintext = 0123456789abcdef\nCiphertext = 75b7878099e0c596\n\nCipher = RC4\nKey = 0123456789abcdef0123456789abcdef\nPlaintext = 0000000000000000\nCiphertext = 7494c2e7104b0879\n\nCipher = RC4\nKey = 00000000000000000000000000000000\nPlaintext = 0000000000000000\nCiphertext = de188941a3375d3a\n\nCipher = RC4\nKey = ef012345ef012345ef012345ef012345\nPlaintext = 0000000000000000000000000000000000000000\nCiphertext = d6a141a7ec3c38dfbd615a1162e1c7ba36b67858\n\nCipher = RC4\nKey = 0123456789abcdef0123456789abcdef\nPlaintext = 123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345678\nCiphertext = 66a0949f8af7d6891f7f832ba833c00c892ebe30143ce28740011ecf\n\nCipher = RC4\nKey = ef012345ef012345ef012345ef012345\nPlaintext = 00000000000000000000\nCiphertext = d6a141a7ec3c38dfbd61\n\nCipher = RC4\nKey = ef012345ef012345ef012345ef012345\nPlaintext =\nCiphertext =\n\n\n# DES EDE3 ECB tests\nCipher = DES-EDE3\nKey = 2eaf97304cfaeb822c04a7b7bef328c7b82fef2ae81b06b5\nPlaintext = b3ed255d4f5e2d6d9a1aa2bc03489064d28fe1431eceee183b7231fad3273140\nCiphertext = 629d608789e51dff699343d061ec01d94c0681c7698ab617ea0145f37304c8e2\n\nCipher = DES-EDE3\nKey = 72f52e1ded0a88eac6c88d2901b27c2fd6e9f3f3387432ee\nPlaintext = 60de7b5667a1ad5995f178553d695d9b0fb537562876faa9b6cc50d05a1271ac\nCiphertext = 09875b215ed2499318c2d99c48209ca5f288830cc6edb9538190fa3ca31fa175\n\nCipher = DES-EDE3\nKey = 4cd30f1e14d485dbc05c69b65ebf44e556056a2261c9e714\nPlaintext = 7ae59441bbd665d8867273386fc72a8cd62cc5bc6bb7cbd57fc1f5dcdc73adfd\nCiphertext = 004d0daad970bfee944c8779927867b964dd0afaae7a830c2b8e7fdcaeac2158\n\nCipher = DES-EDE3\nKey = 7a07ac63adfaf1b26860ce39edfc402758bc4d1edda156ab\nPlaintext = ed4f18cf10bfcbd4354710df053d3e2b776860137349471b8dcf526b8eea8b22\nCiphertext = a1fc1014abda7e198ac8e096a368f65d9b59e1eddf5d97715015a2408dd8e799\n\nCipher = DES-EDE3\nKey = 37c443ab336fed59b0efae51ea7f5d07b7040868beefcd99\nPlaintext = a10a180cc94b75fc9d6556dfc0a816b71020dc3906f9d59d9dd4c839dfc1c1d3\nCiphertext = 0a874652b621618635138a7d4b33bb624f91a39ef1422b3e0490311ac6df3602\n\nCipher = DES-EDE3\nKey = 1ff1a7f4839d484e308d9b8c2c052b126def413d5fb8e0c5\nPlaintext = 4f28ef6683d36c80556ff240b247a3967aec23f859e3afb93aefad93b1e9964b\nCiphertext = 87a8f3fb4c51b3caf19c4ac51363d92025acc053e538c1502d347a618314a4bd\n\nCipher = DES-EDE3\nKey = 5642c4d1859a85b342e3f253fd8bd835e856c451e63673e5\nPlaintext = 687af9b298db752b47982f64ad9bff52a9ae487aa5e5c08f902035b0633225bf\nCiphertext = ca2ed48392ba5d70879ac8772180c3028ef946b6ac1df0348f206ce16bc449bd\n\nCipher = DES-EDE3\nKey = 30f9d27472f9deee309dbca76ba29ca174c39d0631084735\nPlaintext = 85db2c266902932c8e46d0207459b203f90955adcd7506b49bc82e2796de764f\nCiphertext = bbb5940b45add7c587cc9fcfc40674bac7e081baf71285891c65ed9573947a07\n\nCipher = DES-EDE3\nKey = ebc5a73005b77a812c3f4f61669ba859939852580fa61cbc\nPlaintext = 808d22c60b883a986dcb0860e8d92a75441cca0a2a4b06dd78dbcbec198b38d9\nCiphertext = 75d39d30862431ab07227e22b4c8218f1fbc2a3816daebc555c1b999c86d15c9\n\nCipher = DES-EDE3\nKey = 2e8eb05dd8a2b7a5a61a6b8a3830b12da2c4b1bea1e884d5\nPlaintext = cc7569d005afd1a365f5c5836c14475fc15091199902af4a78460d56c16f91ca\nCiphertext = 64db8af7a30363051a017cc92ed67ac6c0e2e1ffda0c94bbf0eeb803ba6b3d22\n\nCipher = DES-EDE3\nKey = 2e8eb05dd8a2b7a5a61a6b8a3830b12da2c4b1bea1e884d5\nPlaintext =\nCiphertext =\n\n\n# DES EDE3 CBC tests (from destest)\nCipher = DES-EDE3-CBC\nKey = 0123456789abcdeff1e0d3c2b5a49786fedcba9876543210\nIV = fedcba9876543210\nPlaintext = 37363534333231204E6F77206973207468652074696D6520666F722000000000\nCiphertext = 3FE301C962AC01D02213763C1CBD4CDC799657C064ECF5D41C673812CFDE9675\n\nCipher = DES-EDE3-CBC\nKey = 0123456789abcdeff1e0d3c2b5a49786fedcba9876543210\nIV = fedcba9876543210\nPlaintext =\nCiphertext =\n\n\n# DES EDE CBC tests\nCipher = DES-EDE-CBC\nKey = 0123456789abcdeff1e0d3c2b5a49786\nIV = fedcba9876543210\nPlaintext = 37363534333231204E6F77206973207468652074696D6520666F722000000000\nCiphertext = 7948C0DA4FE91CD815DCA96DBC9B60A857EB954F4DEB08EB98722642AE69257B\n\nCipher = DES-EDE-CBC\nKey = 0123456789abcdeff1e0d3c2b5a49786\nIV = fedcba9876543210\nPlaintext =\nCiphertext =\n\n\n# DES EDE tests\nCipher = DES-EDE\nKey = 0123456789abcdeff1e0d3c2b5a49786\nIV = fedcba9876543210\nPlaintext = 37363534333231204E6F77206973207468652074696D6520666F722000000000\nCiphertext = 22E889402E28422F8167AD279D90A566DA75B734E12C671FC2669AECB3E4FE8F\n\nCipher = DES-EDE\nKey = 0123456789abcdeff1e0d3c2b5a49786\nIV = fedcba9876543210\nPlaintext =\nCiphertext =\n\n\n# AES 128 ECB tests (from FIPS-197 test vectors, encrypt)\nCipher = AES-128-ECB\nKey = 000102030405060708090A0B0C0D0E0F\nPlaintext = 00112233445566778899AABBCCDDEEFF\nCiphertext = 69C4E0D86A7B0430D8CDB78070B4C55A\n\nCipher = AES-128-ECB\nKey = 000102030405060708090A0B0C0D0E0F\nPlaintext =\nCiphertext =\n\n\n# AES 256 ECB tests (from FIPS-197 test vectors, encrypt)\nCipher = AES-256-ECB\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nPlaintext = 00112233445566778899AABBCCDDEEFF\nCiphertext = 8EA2B7CA516745BFEAFC49904B496089\n\nCipher = AES-256-ECB\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nPlaintext =\nCiphertext =\n\n\n# AES tests from NIST document SP800-38A\n# For all ECB encrypts and decrypts, the transformed sequence is\n#   AES-bits-ECB:key::plaintext:ciphertext:encdec\n# ECB-AES128.Encrypt and ECB-AES128.Decrypt\nCipher = AES-128-ECB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = 3AD77BB40D7A3660A89ECAF32466EF97\n\nCipher = AES-128-ECB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = F5D3D58503B9699DE785895A96FDBAAF\n\nCipher = AES-128-ECB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 43B1CD7F598ECE23881B00E3ED030688\n\nCipher = AES-128-ECB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 7B0C785E27E8AD3F8223207104725DD4\n\n\n# ECB-AES256.Encrypt and ECB-AES256.Decrypt\nCipher = AES-256-ECB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = F3EED1BDB5D2A03C064B5A7E3DB181F8\n\nCipher = AES-256-ECB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = 591CCB10D410ED26DC5BA74A31362870\n\nCipher = AES-256-ECB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = B6ED21B99CA6F4F9F153E7B1BEAFED1D\n\nCipher = AES-256-ECB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 23304B7A39F9F3FF067D8D8F9E24ECC7\n\n\n# For all CBC encrypts and decrypts, the transformed sequence is\n#   AES-bits-CBC:key:IV/ciphertext':plaintext:ciphertext:encdec\n# CBC-AES128.Encrypt and CBC-AES128.Decrypt\nCipher = AES-128-CBC\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = 7649ABAC8119B246CEE98E9B12E9197D\n\nCipher = AES-128-CBC\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 7649ABAC8119B246CEE98E9B12E9197D\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = 5086CB9B507219EE95DB113A917678B2\n\nCipher = AES-128-CBC\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 5086CB9B507219EE95DB113A917678B2\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 73BED6B8E3C1743B7116E69E22229516\n\nCipher = AES-128-CBC\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 73BED6B8E3C1743B7116E69E22229516\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 3FF1CAA1681FAC09120ECA307586E1A7\n\nCipher = AES-128-CBC\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 73BED6B8E3C1743B7116E69E22229516\nPlaintext =\nCiphertext =\n\n\n# CBC-AES256.Encrypt and CBC-AES256.Decrypt\nCipher = AES-256-CBC\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = F58C4C04D6E5F1BA779EABFB5F7BFBD6\n\nCipher = AES-256-CBC\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = F58C4C04D6E5F1BA779EABFB5F7BFBD6\nPlaintext = AE2D8A571E03AC",
     "9C9EB76FAC45AF8E51\nCiphertext = 9CFC4E967EDB808D679F777BC6702C7D\n\nCipher = AES-256-CBC\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 9CFC4E967EDB808D679F777BC6702C7D\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 39F23369A9D9BACFA530E26304231461\n\nCipher = AES-256-CBC\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 39F23369A9D9BACFA530E26304231461\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = B2EB05E2C39BE9FCDA6C19078C6A9D1B\n\nCipher = AES-256-CBC\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 39F23369A9D9BACFA530E26304231461\nPlaintext =\nCiphertext =\n\n\n# AES Counter test vectors from RFC 3686\nCipher = AES-128-CTR\nKey = AE6852F8121067CC4BF7A5765577F39E\nIV = 00000030000000000000000000000001\nPlaintext = 53696E676C6520626C6F636B206D7367\nCiphertext = E4095D4FB7A7B3792D6175A3261311B8\n\nCipher = AES-128-CTR\nKey = 7E24067817FAE0D743D6CE1F32539163\nIV = 006CB6DBC0543B59DA48D90B00000001\nPlaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nCiphertext = 5104A106168A72D9790D41EE8EDAD388EB2E1EFC46DA57C8FCE630DF9141BE28\n\nCipher = AES-128-CTR\nKey = 7691BE035E5020A8AC6E618529F9A0DC\nIV = 00E0017B27777F3F4A1786F000000001\nPlaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223\nCiphertext = C1CF48A89F2FFDD9CF4652E9EFDB72D74540A42BDE6D7836D59A5CEAAEF3105325B2072F\n\nCipher = AES-256-CTR\nKey = 776BEFF2851DB06F4C8A0542C8696F6C6A81AF1EEC96B4D37FC1D689E6C1C104\nIV = 00000060DB5672C97AA8F0B200000001\nPlaintext = 53696E676C6520626C6F636B206D7367\nCiphertext = 145AD01DBF824EC7560863DC71E3E0C0\n\nCipher = AES-256-CTR\nKey = 776BEFF2851DB06F4C8A0542C8696F6C6A81AF1EEC96B4D37FC1D689E6C1C104\nIV = 00000060DB5672C97AA8F0B200000001\nPlaintext =\nCiphertext =\n\nCipher = AES-256-CTR\nKey = F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884\nIV = 00FAAC24C1585EF15A43D87500000001\nPlaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nCiphertext = F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1C\n\nCipher = AES-256-CTR\nKey = FF7A617CE69148E4F1726E2F43581DE2AA62D9F805532EDFF1EED687FB54153D\nIV = 001CC5B751A51D70A1C1114800000001\nPlaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223\nCiphertext = EB6C52821D0BBBF7CE7594462ACA4FAAB407DF866569FD07F48CC0B583D6071F1EC0E6B8\n\nCipher = AES-256-CTR\nKey = FF7A617CE69148E4F1726E2F43581DE2AA62D9F805532EDFF1EED687FB54153D\nIV = 001CC5B751A51D70A1C1114800000001\nPlaintext =\nCiphertext =\n\n# Regression test for https://github.com/openssl/openssl/issues/1916.\nCipher = AES-128-CTR\nKey = 7E24067817FAE0D743D6CE1F32539163\nIV = 00000000000000007FFFFFFFFFFFFFFF\nPlaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nCiphertext = A2D459477E6432BD74184B1B5370D2243CDC202BC43583B2A55D288CDBBD1E03\n\n\n# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf\nCipher = AES-128-GCM\nKey = 00000000000000000000000000000000\nIV = 000000000000000000000000\nPlaintext =\nCiphertext =\nAAD =\nTag = 58e2fccefa7e3061367f1d57a4e7455a\n\nCipher = AES-128-GCM\nKey = 00000000000000000000000000000000\nIV = 000000000000000000000000\nPlaintext = 00000000000000000000000000000000\nCiphertext = 0388dace60b6a392f328c2b971b2fe78\nAAD =\nTag = ab6e47d42cec13bdf53a67b21257bddf\n\nCipher = AES-128-GCM\nKey = feffe9928665731c6d6a8f9467308308\nIV = cafebabefacedbaddecaf888\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nCiphertext = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985\nAAD =\nTag = 4d5c2af327cd64a62cf35abd2ba6fab4\n\nCipher = AES-128-GCM\nKey = feffe9928665731c6d6a8f9467308308\nIV = cafebabefacedbaddecaf888\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCiphertext = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091\nAAD = feedfacedeadbeeffeedfacedeadbeefabaddad2\nTag = 5bc94fbc3221a5db94fae95ae7121a47\n\nCipher = AES-128-GCM\nKey = feffe9928665731c6d6a8f9467308308\nIV = cafebabefacedbad\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCiphertext = 61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598\nAAD = feedfacedeadbeeffeedfacedeadbeefabaddad2\nTag = 3612d2e79e3b0785561be14aaca2fccb\n\nCipher = AES-128-GCM\nKey = feffe9928665731c6d6a8f9467308308\nIV = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nCiphertext = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5\nAAD = feedfacedeadbeeffeedfacedeadbeefabaddad2\nTag = 619cc5aefffe0bfa462af43c1699d050\n\nCipher = AES-128-GCM\nKey = 3de7b368783bd7287f2b9b731814c876\nIV = 90dedcfff100eb1f1db9d935\nPlaintext = 8d766795cadc0961c0f448c62df3827eef3a8664599b3adbaab0cfd63875bceb8f992b4f7447dca10ddd716aa0bc4fe925e1aa3e3fd1d5c430c650fe3546d6b9a24d576a857c5f04e8c0a3b149df277aa19cfa64ee235891d3b8ec0e840d268b1e70dd8a4bf97628a0c7aea38aa21eeb8fb1a8437f2abfee05e0d2c30659e312ec03d30da51b7c19073a2341c17df806e27e796d581143d39e4de8d3f8d46aa6d6fc1a98d94fa69b92dab751d930cc12de21fb1a7468af09e3c12ff6c3db3967d10cf140bc46f17a16e24b010b6cba5ebf777341c52042596ee53008389c48d9690ab9f5625795c3e588f72f7a1670b2b25a9f4eee1c8845ac90f1bf47ae4ea4b607a50aca88ed304cbb700d02d5486139b0bc81ec042e574abf986972fa008b83ef22dbfe720c2f2f6355c87c975932cec545ebed657e5e7570c503e9aa7f0b87d0b2648e421ed1d34749637c95d1e931af8925236387e50454f0ba2e22ed05f90450fad46f4eb7ddb08656511dd065c0f852a7e42f618a961a6c6bec42226c6b6043580b009ec9837cf99844cb74794a82c269ff648e0bae9ae50256a0ad98ad9f5a35057b3004ac96f469f9ee966dadc16dc47616586cf242706df96bb2f7ee43d3bd1c65d2eac7b82ef242e77ab509afb9639e5f3995380e926305729ca762c487f4411ec2a9c688b8347e5287216dbb38c3fe2281a89fcb47ee2ee7ddf79bfa3ab61cd56a00981019bbcea8aa0444eb75958e5fa56ea0036d2de4950a7db886f4a318b433bd41e00905ab158171e0ef13172293bdf70064b9dc7b243bf9dc927589bf9e99468d1cb330639dbff1850cc51929b8971b0b2ede9d06bc5f6ba39d4551b587f09bf6f8206e8f1524f55714612581d6aa45d8fb83425f84a736576deeecafdcbfbb8670d14cd2ab2a7f8b7f374c07881b7bac2605fd5ff7ff7cf43e30cf49910961a9079c0343b8601be8c3e9fe38f49fdab0b7e1a8c1536cf84e4d80d26ae5ec37570839b5cda02929221898d611525c3a88fc444167ffc532b256cdd0a8f31ff08097d75b629fab99c9e1062d1d9962b211e15ec8709934029c4934e64db8d7a2f32e23dc541be306e9a57a3419115994cbc3a8f8d5ea2a6f45b9ea9ac0e51ed0c6680fa029f4552a6c8665aab00ab77928342e7284c321e9500ad4774ef1fed0f596d5aea371fe1793271aef38cde55547f34701a525526e83a72673385a85f44db511bc87ce1f831fc6ccf8204ca4f4a20eac09897aae93684f14ede21bcaf40a09c08012b92600d6a839ebdf8bdca7b34192c6c50bad8796b3be3c375dbae6217815d2c75cc878d39b4e842d4eaa5f5df2242cf230e44a240e18e47827f089b18bf880fd41a2516eac8e6ba3fc2db64a4bc28789860d7b18d9edeae8b3059f4d945b15d0ee27b1f74842dd1df117fe83a8fdade23a47c93902eedc4d33f2dbfcd1996e6dc1458409fde2302830e8d44c58c5ae67486b9950dd938f14c38bc4c9484fdc4ded93a0f90875773453fc14d428cd6e7beb0c705d61229d2b3df09632ebb30b325fefe2aebbf2a7aa8e4ad46277ca4b8b078818b63d04e7652057f6cbbab7c43ac355537e0d3918b4a73c00dbe6b30a27ee7a6fa213d3347ae478e8edc323404b8322b9c7b0173ed61c38ed25f3576a675d527d22edd51d6dfa5767560d3a50a91226338e8c4e6436eedbcd3d2efe9dc1e686b15d2f57d553abcfda57dc316ca453a690f20148f0dfa20c1c4a58240aaf7195095fedfa56d839d0230d55ce9a8ca1b9d1acd6fe98d583148ba0f4a4e3413c76e6ec57ddb79428d3a90079f64d3321c791f60d501c3fd02c8403f0f5e6c6836bbc96430c1b48e83350c3a3cfd017f15bee3e4bb1295d821dc98b85ab3145555cce2c34a8142fe50f8db19918b514a165d12ff6301fb2296788760ac0b6d9e3a57770ad5111cde5d24b6321918cb0b0887a282b827a8749733171914b000e7d3c0edad1d42ca60da37f0698554bb2a1749f73b3120dbeaa32951f8217a781a200467d",
     "5b569d16f56fc9b7dff0ac524f03fee0617f4c692d94613b1e13b18075dc9f0d32811d4a8949a95f6b5fa46aeb83597adb409e68b2a0177c36dcc95dcb2e7dd4fb7337ff97c013364fe139e185014948fa698741d822044fa3f6978b16afd18138c845587c405ebf7a6cd1c28610ce67e992ed49e406658a0a202feed9709500d064b6f53eecfca57dd4b38363ce3aae9d59126d8ae7e140a373851188ae28c909181d0ac64770df70dd2475809350cb367825b59d521d5e457b4e36aea6dedd90a2266898b753b57fa359d43cd388e7d6c7ed90bc4c2af34ceafe88a3af6ac376fec35f1240f08af4f3eb30bc53dd68e5762e6d39e6b16f63003fbe0bee828d0d7adc58c41e857c2c44702215b202701fc696eae021af19c79e59c3e32627cd571f5db99b17f1772b5d746196befabb0b7446687827f3315b391d5dff069b1c39c00bb143218ef458e3b397e1c99640d57fc8db2e0083d3d22ed4111a8fc9e0e6f55fe6a56e946dbee43909bdd7d516fdf756ed8099ba80b1e17a5e279119345104379a36962ca9c8b2a53c414d79eb09fe79862ca749a9eabd9185ad1df57215945882f5894868a134bfc35c835e040e77ecf077d6a98a73ee022963d70b036be3fe5718280ae52c5d751211b22950c0597aaedd35af41f7dd5999e5f7ee34a37edcf97df54a46742b0252b196eaee454ff0c30685b15f8de087de208906be1d971f0fd89f7cdff2af0bdc96759d6889fba9ef092ad1c8deab0404562a7f3977d211c28dfd1573aebd5427a8773f03986101703fa19cd4ab96a381c76a747f63b63f7a9a3a08e251cdc593a024f63b443b76d17dd9e151809da3c582fbd334fa6dd0221b6d410c6a78ba95bb0154bb8999f619f2e084a6b9755ceee4ca3c7e0481a47776c8814f13054e627e37630d593bd09d5f10a049c66c9999f4b0b037e81ef70615d674c7c7975972994a053c069675fad3fae5ae3e779233b70254fb87f25d44c104afc3d5911b8b695173f9337130e39a02cf97356cb817f6cd23f55ef74dd06bd24ce5887a7001ef576262ffaa99f9bb5e3f55bda2aa0f199115909af48bb4d6b1a0a0847774515302cafebe75aad1f63362b1f38141e8721851c3ef1a247931b3b450581eb5d09027b9e3ba60ae9801d629b74991b7fd65520eac561d47115a85141d9a757bc75710bedff1630561ae05254ea541a7ff1846ed5e164834417556dd562c45543c88d8030bb56451fd5b3cbf10fb0164c5288789d2aac7e7a836e79bc3dd401a8e3e05aa6714ffb2dfddb3037c35fa1ebed62a073b2da42133f2620ae88de5e3f46cc69f2b9b3c9b88e39b8b108059ac6bd493be5f7a39f6b53ee825f4593b77ec9238f5ab804d533f48803e7d8187291ee25cfac4da5d8c9279517adfb09c422f6d704711726c73828a5082b4c7b3d85611b8f496d3e0f78c5c4f1dd1c722b1b11d55861f232beee6aaef8a00fd2eeeb45f182af191ca6de8eaa25ceda5451416fbf6d1abc0670b8c10e2815076f271044c690bdcb64856b91265bac202043a28f6bbeb807535aad4bd89e572a9427c826b170d3862f4cca70ddffb4769d6593a1cc6c42fd06cf68642835fe474a23e6f63df316f8361bab959b768d78e20c03c2a99913c162a9662bd9981eee55922f36792de0af68da04ab49dca72e3d9b0de79df828b433bcf6be073f851a36418c03a717d54d48c1014ccb793577c8393b7cb53cad6bc7060a54cc6363734f6ad388763519ca09b533078d3cfa61d7bdd4c4dd0ffe64d68d501b55903d3f4a1f310a3826ac2ca700de01d656188dcf577fd1b63e305614b8d13471f6f84a5d4b12c5e119870a63d1e3dbd39d3b5c26b09f9d80f8a59ce836b20bc933496923d278a022c00f3aac204d07d2e5075bbcef1e4820d633a3a2b35974f72a033484a91a1d6a9913239c93e5783b01833073c98f358e3465efd5087af37ad60b7285550e776d67ea7019e788776c5a456102358c32eb4e7c28096af88b9a20d8ce379ba3928a10ffd539c106f4927e7ac0f382c74017d6e4438fb128c660affd45e9bb68452de72b574eeffe3ce239d0718908c3800bc7e8ecd2fc7d9754171506017fd7868594c9373a96579fed475a28811649ce5dc8a3107bd0d8578748878ce4998684620931dc3981a2499568c2f61174c3b3fc46a7010468e8ff75c08cd43ac764d95e2ad1659f9db62e9554f811e0f43bb74779d923c8c243d12a5314d3c0c6ec84fe60e1d2b2e2b20d3e64054d62049ef9233ff55223a319c285e4e3f4c98dc95b2ca81230d7fed9bb99fd7d97430eb32c9c11647992bd85dcb47cfd58ea3e221d095bcf9374a6baa7c8333581f62b9e489282483023fdd18451f09bec764146b587209160b3d1d7a3d2e145fdb640c4bc382541e0d84255122d51a710887ebe1ccf29d41b4dd7fd7368d68ada250d3968d6f0971f0849c13c09abadb9db8b08960a18f84f0346ea0aa71227afa55b90cabc062d549b616400d36450b19adb67d7358e48c043fa1135abfca89374c906f8d1a6a845debf6b37f055d390b029c7f4524958bdf8d7e2755dde3b957f0926f9d3b8821ba96044d3cad2d637b973bfb657fcc06ff44c17965acf572ab7a0c87604c7dd1cfd136a0ad02b22e8ef320e101ea09772588e8c5b4d88f40fe1be18d27146a2b9559491949671700cebff9a709f297c2621ca9d5d1749623abc20a326ff5be55cb9435c03bf49b147b1e0a4a918bfdc3642df90b396a474f81d75c953d87b3f3b4e31fced630bd7c481c63acbb84dd31249101ac5277a36dcdfc80d8d9a2e928e9b2d65bb257bce97ccda83b187da8a7886dc96eab93d0864d88c358105f9cfe1ad0f0a8508b5b3985ff95de652e684da970b57669aa3fdfbe590a631522abe8246393639709a9a6cd549e78e3c2d1acf84643e9f554c5e076f75a5c1dce1be20a66722d0b896837b7036509ab8d473d5d2b7a8374d6a575f69d54afe3e7e18f4faf4e917be8a74e55c271b96d966e0c0b883f84b3ef2e4f278daeda2efd3ce770801d2c4bda5eb9b646deeab9fa55324e917e63e4eb6aeb4176cb4e43af3db61aea1546fbf16e76a12fcdbe726b565710e3f9866551023e5fbac0038678717e6ab4d3e92dcc53049e8cb65c00216d31a8869ff4d3539313fe2fd7ce0f53b255e3659e7dfc5f92b7627dd9ba42972f0ba72b888932d870ab97226040c4c0f4826be131fe1d2cdc21005ec2addd7796f0927501251ab26b0e5f3f9d2a1cb346a774e18bc233cc89aa69f5f70e3d5c17098eed350ec419c82837153b5c7f5813bf5918defc8df143063f3fe45125deded2b15892d5cebce589b60f2ada0f9d608983e8d107d8e6482b5f542c6650b014445e8c055aac142f16cfc59229fc9626f7aaa40cefacef777e494e13dfa93d27c201788ca9f60e572af8d65ffb513473dade5fe494cbf7377bd1ed03db2571d65af3be4b0bf27c1f069797bfb67ef0bd8a88c6286af6712c106df9c418d88054e3b46c88296a2e63894d6bee0dda8833c373d6a1b27637e1510fea3eb2fb34ae27354571369653a282a8d19f2c34f9e5ec34555b4ed24327dc5d246df13736bd41021697104f80c85bd0ae920e9aeb4e628fb8aec269d55858df149af298b06d61250b043c8a14a15f0646d0aaa18109d031c449e66dd7336044dbdec912b1bb615fae2a3df480bd64cbed74be65c8f1acac247e80bbaeb6f9dab38c6addf4f3b094d5934ef5c9749053b9159e280034e601731a12d6688ff27ee3581ae289de424d16676fb750d2ccd5b3f964dd77bdefc15bb204e2350632822384cc194cf9130f1ee81bfc3887d3366ec0b48cbbe0fe674281ae7445f03791887873659825680448f162452cef57d783821a73047078a8cf94c416850092ac772ef0b2e48517ef101ee0681b5259aa27fd56edf3c01e6dba6298ccc91b09bb304b637eccf8c673b816e74bd7f8ceffa6b17ab03df7ee9ca4098d24d044015a07df782a309cb6761528272632a6e1323c4e18284b463dfcabed708e4fc95cef133865cdbec8bfdde100621c65a92762cc3141ff37b66dea8fa6e3aad61dcbf3b512467c4773d36e58989e12a636389c1678c191137a5f7f59668c8a527dddcdd0c3fbb14cf48b8f3ea306850a5eda76c57aad06312d7bbfc18969d7b611f512358a7bdf959cc2f41de1c408133ef02b1fb2cdf8efe9973c27536434e56fc1bb4880db7fe901087b53ef3c0de18aafa47c25f1cd62c362f2e5da41c2dbff0e13adaba26c1e0829f027dc0320442e851eaed9507b70ac17180725349f6ea7b59bf39c095a9d10790e87221c7c2d24b8bca184ee95a3ef7449aad6c1d905f688498ae7a0cd1b01f76dabc342fb2be0295ca1484bece3c9b8a1b91e53de2d2587f3607a7f348f5cbefaa7a6dcf61bbbcae9444e2d25a77b016cbd1508c8cd319e9812b43b0bbca52df155d418dacb6ab1360a9e605fb53c6e20588a10bef42d884989e836b2ff16fbcdd2c1704f75dc8c1ac2cc6aeb92726f5d46e4784c70e1e249c102be6da506e5e3c2cef6a8bc4a60dac7adf3cacca8679f8f792ddc27613e44a70fd849b7617e042da46d65a3e6cf425f59b83cbae5b6e911142abd13a0a8cdf06d041435ee20e2ca417e905d2dc49c15b863ae5920ff7f9380a86bb0c86b69a000c157cd35245bf71f9dfdefbd1760af90ec3e554ebc511aebf650633221ca9157226f613f41406872765f8d7b916ff3877266f017b8d840dca0697ec3dffce7912ea9eafb62cc2f2d0a112c9bc0727444b47b62766bddf5b5f26d391f653b6894b069069979d0cf8cc7fc4143626a8420bc0a3866db3860096cc128d620ceff059d1614487004adbdf6b0c4428ac8897dcf16e6b11a692a6b465a92b40010f3480b444d4d2e24b0af8467666905c2a6233bdd6502521b621d3cdd4a5e1f268d65bf6a1879608ffd3abf635c5f0948f3cec7e087485c72b00258ba69783cfe7d611bc41c27814ef5674185791dbe626e1f276cf2c399a4eb264f19c77ee95d94252f546528f629188318e9ede65a927aafd2f2af56ff32c0ef39862d2f92268bc9400afa8ddeff591f3ef99681263a33b873bd9e01a59c8b281da30875245cbffee5268563c7f6f20b9e22d998934131dd219624d3cef6df2f3d2d6401833f72c619d6f763837141dbf93179d0f01375581ebe227185166aa7988eb9fd453d510ca6616cc013d551d23a33a4241e85aac3201284344977d496d768f5d920c5670b1d8bb608efc1b99abd261afb0a4ebe191605cc5c2e20523a13b3b94dd1fb24a27009d9a5b6329336f3516a327642386ba64c8769da1324a8a3d1f304cf0700df2b3e38215a954523e1d40ae96d0046e2929a815bf70785e94bc9b89246ab6aded60d65170eeb49b0ee0a57ee2e57db92409105c25f2d0c1a17b5556d06511bd0991a426258372c7f2b402dd533a75aa175524eb5d6b9575300b81fdb2258bd74429add8aa477bd1182db57107d411d16147defc3582861c68f5ce82e0a0316edd5d0f3cf36825a2c79a33e376cce2e63274b3b41bcbdd755845ad9ed2a3bdacb6fa3fa9484b7b60edeb1d9ef84772e78e39adca14c9fa0bb3ad1f1c17fb9449270e9b4c97b5b320839947fc73853fc58304ee9c9e86f3775f5469554d5006eb7ce9d02d5f900c771806c275ee7022e2b55d111338dd93ad51d14008df4c13d8c03fd9bb3689607e5cbdd499c3a372b487af74cb140f6300cd2dc2acda07277ea3dab57ecf0",
@@ -614,9 +635,9 @@
     "10c83224c856923e3251484a81a15cddb4d7ada8bb7968dcc8f85e39ca99ece8ce2ed7753fcee6900cc9b7b5691f2d67ef9be13f70d195bbd0047908025df01b4f4d581fd59239836578627d9d585ebe9b053d807e9d3ba25405029a148938a746636decdade02b1afb5ccbf2f0e14a27c98a1e130d9208bbf7da4bb4e572927eb348568921d4a3309a2c24f367c935c2a8e1524c3024ff350ac7da8d2849586817bc9d46a08a21aef035a6151e608ed93b1556a484e455819f9ac2fb155020738962e7255a82a0854b31fe20cdd351c10a33eb693c9be1a51a932e04d0364ced41ee1bf800d0c12ab5eb37fe52563666e52827720e856d4f24eb06e0aba446910aabbe36513f2274362fedba4c19398433029495284ccb499bb559a9cdbc94a0d1b733136969a743945a04e1d2d4e77fed21550af35f22651c7de802eab7a3942d7ec55a3a5002bde8d5cccc1d4ac4bb7f4926615fcece543fe5d9092d2c4f50d94fd9868775a072f4a5bcf2e5fd10795f7f172a3341ce33505ba68e7ebedc9c1e9165864244ed31bbe5c308dceff858cc42010ad8c281a24689cf2dee8a549b1abab9981d70a912174944b403ce664d8608b2f723150f5c12164e4caf28676e7a25c3928ca2a4dbe96355ef8f282e57888d40715df07bd8b5895549ad957e758abf868def1c1f5e260d26498616e2ac962bcaa33b879874569f198a91ce4e50fc50da77fea1df9f9ea900c834dcdd462d338efcf8e612aedebf254fac596507d175d30a90543627cfcef6852c7cda8b430e255c4d6d417de31eb5dba123e3ce9e2269867d9a94fdcd8ccac40a9451953085109f5ae0c3e04daadb4a2a47b0e176917660eb3c9f1aae0ec6b00635fa387e056623947c0621f0a12e86fac1881ed1dc1b9f523388d6b6596a152b3e732c561972879dcd3f0232ef0773a4fb195a90c3186c4688ea58967ce7f18386b80bd38e90cfd4cb899337ab27cba8db6523e979b4c449645bb2f320ccd28578bc7ec38f47225273fa61a2e5df97c4d76c556fbe2b0fd30e615f5fc82c3de7194caed9f5946c151c22b7a0c48f4a7cf78aa153414f2913c5eb95e3dbcea7ca544272cd13a1c52fa87759aeb430aab144fab418c835344605df3a044825965ca15de6ba0e59b2080f5844b2d110d71587e19acf14264cec2de5b8c77d18893215d1c1da0a940e7c2ee429a99e2633c216aecb7675a2314a09044951ca5a8eac798f8878fb5ea65f4ddccac53ee0c786e597169079fb6e8ceb37a71580b0904a97450909ca454a690821e249aebb75449e582fe1b30f1fa9f6464bdef654daa5ede6d4f223f4589ea25a25f4672cfbe974d51008bce296628556f55d26646e40b59f40e3149273760b40806ace3b5171e0b79865c6adb53513da2f24c4115de243150cec76107b48ca8da19117f00b5870e67eb8357e43c1b7b593c9875795d46ede26a109e05406b69fda988947e49ab195f22454c3c743c2ec51b91370b4df8d38653b353e51bb83215d122bcfa591009c007bbb6124bc590fed3f9c5699180b3b1424ad02f7c90a149b77d22dea5c996aba675c2a1a20e206d9c25d9446247d495a26486c0d0bfb09d0b5a1a177a09fa749dc36cee73af0116a6b779c2b827512a04ff0f60b483edbcdb33d2a18339463c498ae67ffa9da0aa3f3beb6bc99212f9e6961afde89045520b1f3f2e2761666a333d76030f443f53322f099035584a60978ef8b49f46d7d4d8c5c758ea52a04b59c1a3a1c2f9df3f3b6f5c45cf4b3547043b18c1d615a2c965c3918d090cc72946e8fd0b938e60e03464f4bc71fb719a1d173b0931930e58bf7f6d4403971d36b40f83be6b57244a7029e1d41dc908764d57a5442557218b509faeda4e9fcf31debbc54ae671ef636871233f29e0013c0e33933543f4b59df1978ec89b109c3977b0cf938b7f6166d6c93be5e87684a703c8b7b5fe1a8bfe153a179b55575ff05e599b39e32ed10d958699a1ffe07136081f0719b18c69dc74f66f211103e9c544f3c81a88ba9f66a9bc7017d9ca9e2cd97634052694a598476b99daf1cdfb6122869375ca5873d32d5c1e07d9b5b380b4f09dbe04478cfb1a13853eafacfed70c8abcd444ed095f78d07c0e8b4093be95c3aa24b2e5b6bfe3a06e9d2d9fedfcfeac4cea2490627e6da6a5cca383351952f654ce2b0ad359c0f7f4ad3f8d1d4a030a947d4a2e417bb79102729115cc8b6558c3362b1d805fb48ce4858deff97677e60375ed13e150a12ee7dcc8ccc64d9710c7f516555c1f7a1a08f0d7c6fd21f864fcf28c8f748c40494e01fc32006f977a5100577f86a484d11b82c90cfe6b4d6b1902fef486cc6f3e033904e150e67283e49a5382961dabd244412ca9657b48796e476a82443167e277d5a65c0c563a6abca77d316e5d3ab639a1ecfb1110af2d29f146508bd9874486dbb56328d6f59479e2766692821660462aa60b6bc8a710707ceeb0ea6429e5113e03c9f41ce0d69c7589deb547527673e8a9f9a9a74e9e4bbcabf2e306b35504c1da99730ae86e94cd047b2e6ea5e97e63a492430d37ec446434fb3b066adde08b17d7d903ad194a4a863d6cfe181a45c8c97b5062bf7c4e44d69c0d1a7e1f5029b805b7c21d1b5e56e697999a32557870ebaae8d87dcb5ca5eea2c5547a16b3f30ef9df8df821028c106f86e091050ff8b6ea4171e59dc2592d405073bea53f8ea62edf112dfbc7ca69809db8005783d63557d3d90d123a944be395c1dc3b5e1476dff188346327769fea65f3cf9363e88ed67335870ec8ef13eb9d9ff5317c4e24dfce9d11699e5f47b4233cc8f9d1b915e716a5730a5898ee65d30b1628b484a5e82eda95a590964a8d8bc89dd3c5cf6c4f9137b8c6ee9d6a692e0c0d1d858dd5b3c12de48badade4d01bff312c56ce3ddb34b0fdde3b0c2706fc292b9fac7e1a0dcd0b6534c968117f7de15eba84d2754e4bcb8093a5440297605598659f686075e2b1b464b6b3ec68abb13cde263b1c607545c45746338b9b207b5c381da690f653b35e363e1249551ad938b9fd7b0a944151cda07127bf9ba76958e926472f4aa1de8512ce834cfcae5414b226f23acdb1fe5cf685d2201b78167ad35fc1da282744c2a43cc49d49242f968f7e06de14455e7ef5adedc5b33184346018114e2d1fc7a5349e378da9b2af5b328c213888652aca9f1145363809eca7c1fd8e64a5cc3255418736e048a731f3053db77971f67014e6121a8e464833e5dbd02ea6caf385e43e9f378bfba657986bf852b32adb55e35a2675bfc8d70d43a902032a61f59f57dad2dd7d7963322136233200cb9a90c952074e9ba0fc0654f1b6fd6f7f0eb77c0fa6d8143213ce6e8b0c178f73e17a7c64839f9bebca2fc955ea8ae406a13b80a9045fa8d129fd859faa46fd27c48bde7b890f98ee938c0d78889f84181ae2f5711304fe554d4251bbc6437ced59d577a2a1f26da736193c3674adb13cef9f4cb4aa6585c4d6874b0309ecde300493b1642c595746f09e03977c8902f3a4a877db1153b248f295a0ca2f1e437d15fcab8fd77c5f967304efb5c4920b990674ae61b954af40be17a8559dc377c591b68067fdcaf2d27bd9a22041b981a84be3de50d5962b58f8c4a22fa05192c5ac99a0a9423284fe62a3a59f085136cec72cda2a53af106a2eb5bda28b6e02c299118cd91714c2e7d045346c78d9ed1b41c73231a21e42c298949f70122277f4134ed5c56639edbf3c3e717310e3d1f03dc5a94e64c4ce148bc5c6bde64eb80b17d5979892786a31225eb89bf9f5a582bcf65b83ff7aa361ccd9238d144f6a22a3f77dd8a01382df4ee90a2057dd310a6b0c4b81dfc92a2cc0c606d3be8b18fbe64ddfdf2004eeabea892be2f914edd1edd8e8829dc7704d71bbaaf08c41824dd0f4b34c9eedead9e10e53bfc6fc0bd37417de0c5c71cff0754d672f29c262d8e27b524427e12bc4e4705ab311d3bedcb1ddd09a3ca0c268c05c64951b7d724a9dafe4d249aaabda91d68633aaab845bf78f9a22d467c7e0c5fc70fc9a318b01d7492efea7fffd329d70692e76647ae665c62b280da0d62f870a52e4dc4cd92c9150c96aab16f8c23475e3152d4debb41b6756f000c3d8aceef18b49e295be7a71da1eeadf4eb96509d45d7cc42af4b7013d8bb445f577e8d4cff92770b8ba0e451f3e24c6d981efdb68c7f2dfafee40b8a425955796e369f0d4da3e998c1626ae0fa583334475f1fdde68ca211c3f2e9afb003f553191702e11f8b731c89ea26059ea4466f2bd0a1a5601025ca9417006bca5c9a57dfdba44c603ef9ad38922623b40feda036d84425c47fa42973e348a180a7570e1215044c375313ab08d6f521052dda415707ebb74d6c4774e039bb04cadc2799224bde1802e2ee2a018032e3a341700c0fa2aa28bf93cc479231efe7da0e9f68e572415348c08cf648117e9b6d1267fef6617f5927252c86cc087775db3e30180feb5ce7e1ac9c3761161e07a4853aa6d97e525aa88302954cf9390fde81f8e11d97a11c79e3bad261364c18890dd1f8fc71127edefe3571518a42be611a46a0426a33221aa25a0ae6514daaf96038cb59aaba898de49e3b215a4464e0af614e638c2d9b6e676ec427fc906bc516331a18121f306a5246d179e2d3d0f38ab8393f7ea5a2d24585e7cca649637b9983924a15483c167e8780f8dd7aa1154cbf731745a8d8d54a8c4f8d854371bb8172303f9ba3c8c7cfe8c378ee56bc35c6376aafe907d3294ee9a8786281b7deff78ff125761f1a31d0e8fffe04a52a7574eeb8679670ca3bfb740167a559488d4337819613d32752d8a89013622f6a8d70f3c64b84a4215f4b7bb282a2d17c36a326167e3270757b8f1d9a0137bfc5ec278e8ca35a69e49779cfc25b95a89cc18732b5b9d1986b18878c57e118506909207207ad0b4edf32fb2b35b6e70546f45d0849bd139ffff9d8ae547787e7b51403b54f110e2ac65468cd0910d80a4e321deafd46e9af19609bee1efa41b762b8ace989dd681503539e7d9948664cf7a73ffac9ce2a34b514253c4f21bbccd38057a6d68732930dcdfc9a32219b53339d100db0037a8bbd101e71f5054f3\nAAD = 7b3b9c07148fcd897f657ecfcc87e530191536b8e77f9309e8d7323888b3b21477f2ab7c885c105d9c29ac96aed23b366f9fde4177401b7038c6770c7bd2ee8b4335105cc0eab9e367f0cea90d6f1ae3fa76cd21ceb9f3500ce7fb4b2a3f9e90f900a231ec693aeced7afb6821391d1f5b1b957895777aa7a2b71d9571c00336f26d54d756392cdb74bfb67d5a621d517db20441f74d0940180baf613b09452f64224f8af7bbc864ab4a8434ff624d0c0646ee07132fd376506951899bde975df8c836ab4ed9cc084f1f6d500ad56345d2f250a0d6991b9e458c62b6023191f341c8659e8a38c878cfac12b032674503df9c9bb01c4340c709eb6dd7c74907d769a317f4dd7317843c47bdb4c5e1f07f2380d464b0c47269389cc8a43a09adba86f6aa8f44c8fe514e73b5fe8d344769c1aa20a4538ecfbf47562ca79fa497b0f02f103f75522db9ead50d56dbe86997d6085f1b5aa7a4cab9e51a1247ce4f724a14983b6bafd17369fac973c6be268e20d800de870928e100990ebb0d3bedfceda36c64be3a729b603bce677a49e8caf282c9159b6e3e1e775129bd30dc3f5c9849535d86a27474be03bb5749b4c0115e2614f8feaa7405cc69b1de479b3b57e551f876a9c8c57ab9879cc68bb2",
     "ea110b2e77e59dd6a65eaa67cc4d4b2f4d6e646b2a298d3c80fb43969275d4414734e74726145dab06124c040656c39a94846e8fd58d326f4f9eafe5b95d85254765a21993f55070fcb9e85db5d42ab6b9464ce66de3f236dd2a0a26c4e5535dbdcd6eb350209a65aee785c6647ad4103d092a8ac932470880eb314f7c98cdff34fdf35ee2d36f09bd443b5defad7a5acb9df55965421fd043def6f4771e1bb27385b30ba22c0d8972aead6b654085a7dd3b60c4004a0dae22e25100e54e0badd0cadf909799329ddff699de8066dd6c3822d80c73c52d87e6fcbdb2dbbf852e37804b1256e23e76dbe43f30be4a577bc23c7941a3d708d1e1f579e9c6eebc219c74768168f6790a41f883790e08cd1e88ad09a544eb97b3d1d5af67eea666b9c027e5c7c976921189b955a9e605f6cc9c012c1c2e197c5b02504cb9ffbcb0f3ed778d540d5194fdf5d38dba6340c93da7c5501a082689616f337d8b59c2a92c25e777515726e1d7f6cc9552693cc7c30f1294b37f97d49814250d6c1e3eb335c5d214ef3641739d508b87106eaaf367902433a148ca962ec694409acb82d7749e1c88938ad382d0ca6e6cbe8255746832fe737c3e71dae8397f260c98d4a292a126ec21935c24096d2f91ae114194af659455d8a4206197495a28474dd2809debf5f550d77ffac2b0db521559910c352f23472d7aa9f4dbbdb158f40aa36912cbd918ae4c642e76d78d57ade1075c4fe1086ddee3d554353b4693bbcef1cfa87e49890838c36156af0edf384b0413d6d7aa\nTag = 51cbcf4a2fd82f221de1bfebf86a8c24\n\n# OFB tests from OpenSSL upstream.\n\n# OFB-AES128\nCipher = AES-128-OFB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = 3B3FD92EB72DAD20333449F8E83CFB4A\n\nCipher = AES-128-OFB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = 50FE67CC996D32B6DA0937E99BAFEC60\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = 7789508D16918F03F53C52DAC54ED825\n\nCipher = AES-128-OFB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = D9A4DADA0892239F6B8B3D7680E15674\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 9740051E9C5FECF64344F7A82260EDCC\n\nCipher = AES-128-OFB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = A78819583F0308E7A6BF36B1386ABF23\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 304C6528F659C77866A510D9C1D6AE5E\n\nCipher = AES-128-OFB\nKey = 2B7E151628AED2A6ABF7158809CF4F3C\nIV = A78819583F0308E7A6BF36B1386ABF23\nPlaintext =\nCiphertext =\n\n\n# OFB-AES192\nCipher = AES-192-OFB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = CDC80D6FDDF18CAB34C25909C99A4174\n\nCipher = AES-192-OFB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = A609B38DF3B1133DDDFF2718BA09565E\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = FCC28B8D4C63837C09E81700C1100401\n\nCipher = AES-192-OFB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = 52EF01DA52602FE0975F78AC84BF8A50\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 8D9A9AEAC0F6596F559C6D4DAF59A5F2\n\nCipher = AES-192-OFB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = BD5286AC63AABD7EB067AC54B553F71D\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 6D9F200857CA6C3E9CAC524BD9ACC92A\n\nCipher = AES-192-OFB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = BD5286AC63AABD7EB067AC54B553F71D\nPlaintext =\nCiphertext =\n\n\n# OFB-AES256\nCipher = AES-256-OFB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = DC7E84BFDA79164B7ECD8486985D3860\n\nCipher = AES-256-OFB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = B7BF3A5DF43989DD97F0FA97EBCE2F4A\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = 4FEBDC6740D20B3AC88F6AD82A4FB08D\n\nCipher = AES-256-OFB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = E1C656305ED1A7A6563805746FE03EDC\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 71AB47A086E86EEDF39D1C5BBA97C408\n\nCipher = AES-256-OFB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 41635BE625B48AFC1666DD42A09D96E7\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 0126141D67F37BE8538F5A8BE740E484\n\nCipher = AES-256-OFB\nKey = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4\nIV = 41635BE625B48AFC1666DD42A09D96E7\nPlaintext =\nCiphertext =\n\n\n# AES-192 CBC-mode test from upstream OpenSSL.\nCipher = AES-192-CBC\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = 000102030405060708090A0B0C0D0E0F\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = 4F021DB243BC633D7178183A9FA071E8\n\nCipher = AES-192-CBC\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = 4F021DB243BC633D7178183A9FA071E8\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = B4D9ADA9AD7DEDF4E5E738763F69145A\n\nCipher = AES-192-CBC\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = B4D9ADA9AD7DEDF4E5E738763F69145A\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = 571B242012FB7AE07FA9BAAC3DF102E0\n\nCipher = AES-192-CBC\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nIV = 571B242012FB7AE07FA9BAAC3DF102E0\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 08B0E27988598881D920A9E64F5615CD\n\n\n# AES-192-ECB tests from FIPS-197\nCipher = AES-192-ECB\nKey = 000102030405060708090A0B0C0D0E0F1011121314151617\nPlaintext = 00112233445566778899AABBCCDDEEFF\nCiphertext = DDA97CA4864CDFE06EAF70A0EC0D7191\n\n\n# AES-192-ECB tests from NIST document SP800-38A\nCipher = AES-192-ECB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nPlaintext = 6BC1BEE22E409F96E93D7E117393172A\nCiphertext = BD334F1D6E45F25FF712A214571FA5CC\n\nCipher = AES-192-ECB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nPlaintext = AE2D8A571E03AC9C9EB76FAC45AF8E51\nCiphertext = 974104846D0AD3AD7734ECB3ECEE4EEF\n\nCipher = AES-192-ECB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nPlaintext = 30C81C46A35CE411E5FBC1191A0A52EF\nCiphertext = EF7AFD2270E2E60ADCE0BA2FACE6444E\n\nCipher = AES-192-ECB\nKey = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B\nPlaintext = F69F2445DF4F9B17AD2B417BE66C3710\nCiphertext = 9A4B41BA738D6C72FB16691603C18E0E\n\n# DES ECB tests\n\nCipher = DES-ECB\nKey = 0000000000000000\nPlaintext = 0000000000000000\nCiphertext = 8CA64DE9C1B123A7\n\nCipher = DES-ECB\nKey = FFFFFFFFFFFFFFFF\nPlaintext = FFFFFFFFFFFFFFFF\nCiphertext = 7359B2163E4EDC58\n\nCipher = DES-ECB\nKey = 3000000000000000\nPlaintext = 1000000000000001\nCiphertext = 958E6E627A05557B\n\nCipher = DES-ECB\nKey = 1111111111111111\nPlaintext = 1111111111111111\nCiphertext = F40379AB9E0EC533\n\nCipher = DES-ECB\nKey = 0123456789ABCDEF\nPlaintext = 1111111111111111\nCiphertext = 17668DFC7292532D\n\nCipher = DES-ECB\nKey = 1111111111111111\nPlaintext = 0123456789ABCDEF\nCiphertext = 8A5AE1F81AB8F2DD\n\nCipher = DES-ECB\nKey = FEDCBA9876543210\nPlaintext = 0123456789ABCDEF\nCiphertext = ED39D950FA74BCC4\n\nCipher = DES-ECB\nKey = FEDCBA9876543210\nPlaintext =\nCiphertext =\n",
 };
-static const size_t kLen19 = 455619;
+static const size_t kLen20 = 455619;
 
-static const char *kData19[] = {
+static const char *kData20[] = {
     "# Generated by\n#   go run make_legacy_aead_tests.go -cipher 3des -mac sha1 -implicit-iv\n#\n# Note: aead_test's input format splits the ciphertext and tag positions of the\n# sealed input. But these legacy AEADs are MAC-then-encrypt and so the 'TAG' may\n# also include padding. We write the byte length of the MAC to 'TAG_LEN' and\n# include the unencrypted MAC in the 'DIGEST' tag above # each test case.\n# each test case.\n\n# Test with non-minimal padding.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nNONCE: \nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: 144c98ca1f\nTAG: 4a40ffe530b338e5173a8e62c8530b0c14b15046d12f2ca3158ad71effd0f46b29b3ae\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with bad padding values.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nNONCE: \nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: 144c98ca1f\nTAG: 4a40ffe530b338e5173a8e62c8530b0c14b1508045d58f4bdae400\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with no padding.\n# DIGEST: c6105cc86e18eb8376c16ea37693db5c07b77137\nKEY: 8503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371e\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c748\nAD: 1df3f4183aa23fd8d7efd8\nCT: 17944422f667bf1356c234189f9c6cf7af52b2832b2fbaa990ccef4e7f9bc3841e59e25c00e3686d5bd5c29f\nTAG: 3ebd1b0bee840e8a6e992421c62de5a8fda3a82f\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with maximal padding (0 mod 64).\n# DIGEST: ceb2d295bd0efd37c6c34dab1854c80e986174fc\nKEY: 37446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11b\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba\nAD: 2fd6773e0d0c302a5f47e0\nCT: f2ab16ba87c52d066c0637d387b89d700a66828ef231b480f39aa08ac2447c8ddd205d1a95da37f267c06a1338532de890904f9f19c930adfb684e81cc06bdf2\nTAG: 3ff610fb9e208ff6ad58b78c5b2cf54b997eb3f24ac0171229ff7ee9cd5070de5a604f78b35b6cd25b3f2ab487847ca1e3928bf7f19bd19c9c9a1015dabd2de426fe57d342009ae4a2e67fdea378f24ec8dec1e87b62b6f70626bfd71f8d8d5e5c5b935a76527ee8a9a3094d635dc2b01a31dc4df336aa023517d7c35e142ccd6a79bc689e335f187a5358a00a7d4eb168cca3f9c6523ad4d74609a5b5c9e36db6bdf8464c4c8497c501084afa17557d070a7671c9144c86b4de9d57f033bc6b59a7f1f4e947b6a2d69c85877de731f6eb3db71d9f4c2dc086a3303bcbcd2f5b71643058b7ce08ef5879e0578ec81ced96ce907d4f32e67fd4cd269de9b60e09ff74bad6c86356ee297475ea7fe75d75\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (1 mod 64).\n# DIGEST: a07054c760cc66fc704edf950201005031f3faac\nKEY: 446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be1\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2f\nAD: d6773e0d0c302a5f47e037\nCT: d7059edbabb5cfc2cd5c459abd74e136790aad50d988c6c9271428597617db171b89ab171a68b14f9d417bb81f9f7d2e2045aa47c0b5d166c8b2622bd914c4e752\nTAG: e3d17e303776640b3ab712f6068c44e0e3b5d375203a8b01ad47e6f4681011eff04a41d03ff073e61c630b5faacb744447226a35e7496204911ddd660792be62c5f34c918a0d8514872100c4637ca12bc9c13b1580aed10a68c9187377441bcdf213bf3aa72831f3498d990a7a5960e1e6795bb11e4c7910a881d76ac81320ae61b151b8dbde093bc9e56b8204463d8ec31dc32b3cad5cd8cb48b5f20e54c17469ce97c069051c8e4b2ae5dffc0c2651d868a9909187c2732056213e41e315e94d14a84a24a676155ba86ef0b96efee3e4765dfc750953dc9a7ed739422c7d988f290432320313848a2eb7723c7c85ca3590eb35e3058d0462ddaab0cd48730107d4031a216c6c2595d1ca0b3f1815\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (2 mod 64).\n# DIGEST: d059c266cf6233af730b7a229b19356a4c6fcf06\nKEY: 6f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6\nAD: 773e0d0c302a5f47e03744\nCT: 8864e31c8b2ce1bcd1745671da5bd66e1e366b0af66b91f605574c841084a5df358483c7839e4456ae5a442930f21d4bde67578186a91c0a603468339ffbe3bfc607\nTAG: d8a0bcddd40964405ef006e0083e67a607b9f926e6508880d7784248a626d56a0673ff990920960fb307ed9cf40c2a1cc3b632b1f94aeb30efa02123e66165b77aa4be5e2aaba4c4a52372b403cae2f78a3bffc1cae8dc6f53839de7f16b8984304abc4a81ffe1ffb42799b54dc43ca0b963be6299a404fd4b3acf65939ac319966aae0a941c74135705092567e1237044c88f79b02b68ef622f9c776bbc04dbc2f58338c129f25afcd8cad7a0e91f30339457075b68df4960c003ef574e3aaae870787ae9ddab96495861388b341aa63ab2721abb176c4f2e6d5704cae123c20f1394d6a12d51fd5782dcb59d075775dfeb72df846995b87b1d374c0d0b8a003ba60f713ad777b8d6ad42c5e373\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (3 mod 64).\n# DIGEST: 8aac0687e33041fcc18da154b41f20a6af2bfb28\nKEY: 5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a7\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd677\nAD: 3e0d0c302a5f47e037446f\nCT: 1d239b3880e2261806ee770e7296d573d308d9850c8bd90a0764822faf5f65770f98f18ce4738538f03ad9b289bd5fa1367258f00d3ed91e32885bc45c30a240cad8c2\nTAG: dbeb6d1a1165a902128a27d7f55f4d928b56a3b83fa430d47bc4f935219fcc6005487f1ab14df0a07a270645d1c2fc23efc9866ec7e4427fe0382b75215c0f994f09c4ac54bf360f8ec938b02c17c4104127d2cb1eb51a11455180931b8e473838e5b1e61cf5cd05947a5b154be5df49905e6e7c049d00f065f680b0e5f3f4a7e9dad37d493f13c7ba318ca2bae086136d67b17a6ebf28b45cebcbfe115a45dfa32786a8b8354d51acf58bc126a13146e0ca509a26cc32c3e8ecf5b9d6ce76a9f76d674316c42f3140d5139304479376db2a167c65da7250e6fefc9d3b37a2072180ab3202f1fc7dd7f4598d1d976b15945fa73e1be07a91186ce7c16c4249d9f7287baafc572673925e95caba\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (4 mod 64).\n# DIGEST: 53658226c112b86438dd27b58a71f9e36fc73c1e\nKEY: 91d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a729\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nAD: 0d0c302a5f47e037446f58\nCT: 719d9de3bc86d08510354817d0fb94340ab1ddeefdb95a1cf460f7c9b185837b5320dd862b4c319619a0b18dc75f1762cf7c9bed63713c31e39a6f7069563441b9e6f106\nTAG: 8b61062c9480ffa62f7b96e9f50249426d05bf237d25e2b676e0041d40ba97101843d9ebc978949eb7ba53b8989ed0e93e5b91f13365345baefa1d7f59b694f6ef0bef0adc1d6763978e12fe354e57b90127533f3f991ce611e31e88a97962f859ebbc0e50d130c323aff35581f1f45cb5c650299025a03d99026d6f6a844ed9d5fe66e15a9fca79726afdaa54c077d148d561ca9e77e427b8f8074714aaf8b011697524e4d91bbab69bc01c8346e9055d7269cf124b503f7ad38c384abfd91ca36159d8a41e6389212167278b830ea464f7dffc3e01c9807368d3457ad5f21b33bcb1afd41ab7d805c9ed2f2c32da9bd4b510366b362dd02f50666ab8e5a72486b3c0d6b9bafb38c9375dda42daef635a0007ef\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (5 mod 64).\n# DIGEST: 6b7d5268b0b5037afb5be5af6a0ceb34e7656ac4\nKEY: d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d\nAD: 0c302a5f47e037446f5891\nCT: 9adce31c760d09ff911ed98eeb7146e82017261c8017d9a5fae1127479f6fb54d081cacc1ab7150f05d13547b992c1fe36a6e8e55ef1fa3bcc45bca495a981000a0c0b4f62\nTAG: 51d033e8003b06bf819a4f7978d75abec450c6b11a00bdf27f549f6060390ff99e0feb9509c6ac882777da699f5d5332d1b838a0436101574789ba485769ea6f4d73a10db775f06331140b218fa2ddad7fecf381fb9e3d26b06b3577bdf57e2a8435ba0e5b1e305ddf28070d1749d11ec5504cd9aa51ffe9133152ff35de21e4bbc3b109a318075d924bbaf0e267a1abd3d7afd2d3d8f4d951d4e96fa63741087a975eee8156b01fe566f7f6a309257c17a0bd9faae4c2781aae72eeab1903602b09b69026540a84b4786b8dce2a3e5ca26c65eb7b220dfad400cd236a4435d7fb1be60b9074f2f226e810d54abe7ec0cf10e7c465059720baf93915dda8a56d5a012a990d72408d2c9ab9b8dc813eb2f1caec\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (6 mod 64).\n# DIGES",
     "T: 63efe7af502231420ed5aecce9a28446b257828d\nKEY: 7df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c\nAD: 302a5f47e037446f5891d7\nCT: b81f6e678c5a08244a5f578970d64f96f50ad5b5724a9287ee7b293308db34e03456f1745f79c594ecc480fb2a9412bd685e6c0df028eda06aaa15c90afa4ec01736450e3eb8\nTAG: 63b849636c212d353918c6e3044d298da268ccf1042987617860b58eb7ec8314ccd7762ebc39b62c0f0f1c346c8f4bbcbf3bd0134c0a7374de1868b08ba013398d8e4b578bb8d7359f2cff1629ede34da00138efa4a724d892fe4ed2b28613e66e0bb4830f66c14dccbf8656e615d66f267182662fee8a3e1fcde0941793f0bf2b00d6ab6e9fcb30553b620cf8e9e0a15f122808d739e698f88aa157baba12428541e928ed556517978f6c9f29c6ae8fe5b4e9ed6f0ce49351ac2a63e74bda9288a874a7fd5327c6856596a3271039dcf54affbaf29a5556f1fe1062279d2600b920f4e26c96e9e8fa696c521f60e9418975befa58ad564e730d1de312ca1b999a5e89b813743b1512659d809078243170ab\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (7 mod 64).\n# DIGEST: 1a555c300a1d1bd5b03cdd6bf2a678621624eb05\nKEY: f660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b5\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c30\nAD: 2a5f47e037446f5891d77d\nCT: 6b6f94bc2326760d257d8156de961acac0b32d7f4d0e20363532e76ce76641ba66a1aa7945b9ee58527039cf83fcb01d8ef85254566947347463e161ec8cdec74a839637288d09\nTAG: 77b18bca8ed1d056d9c974054598216bc15bae5b7d70f3bbe32b3deb92398b0ce25a1efc5eb6782fa5fbcdbb415ef43eca090fcad4d34d53b1fd89cdd760e6424715c7703c51e08b72cb3e3b8a30bff159d5126f1473f216d5c931ae03703d3baf311a59d7ef3d6db123f3e8c0ca26fd3f8809ca63265d2fac935bec32631af43626ed1ee9785c81d7bd0cbc0c5178e1ca7de5d12c3592a7880be6590072c4728b2afa1eaaeecdf7cadd8304c2d4b614af7af14efa00dda595be92de09c74b39df05d7d023db721f86992c57061a264dead21e24fa47816f43b77b8ccccde44bfc32a015134a2cfaf04c582fb839202b08b81543ea9358d5735e7c197762a6a39936e26de58690a02dfc273e6779e77708\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (8 mod 64).\n# DIGEST: de9156349b578f2f44945ec6a676a67a829daea1\nKEY: 60ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54e\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a\nAD: 5f47e037446f5891d77df6\nCT: 8f211be563f98f493745cca0e385e5b0113027efe3b0a880805427e363014323c4f6c7e6b30d2466c70ed56d63157f2c4f6dabe14d5a22c6c708ab3fb667a6c64ce5c8de22f5261b\nTAG: e5807ffa59e0005c9dd7eef0b854ee1b2cfccef9977f8a963167cc563d844f795c4ce4f9d03da95e4cfd2fc80c9efb6424df8cd3b7875a6ca129da8f509ab09d1f0eec0211e0ffe5492913fb688796a29a8eac54f374e8948991059f6e73a68eba75a892b3e2ed5ab9680eb0b308b07337e75ad5b406c260af5d27955aa820bd0435549700e960e66c211000885e19b804579acfa8c526603f8d743491d916fd4d0e250159e485a4db2fea39a8eb9443516518e6612aae97b1d9b7ac48066d5fbe2c1be3b2e20233a2fb4d39052ef4ca3bfc47e561aaac9c57a7dbff922d6d997821f6b09bf3b4c91bc6162b150e17bfa2544f93f2bebcb4d20322bf0357fdffeec8f75679e6627b4ffbf8e0bfee63c8\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (9 mod 64).\n# DIGEST: 12812df3aa7f3bbc899f6f248f5590e02570c292\nKEY: ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f\nAD: 47e037446f5891d77df660\nCT: eeb6afcfd2626da1230067ed9938f7df35e99d2ba1c91d0e91c3db53034a3dd2ce3352b06e3d1b9e8415ef4ced9b2257eb05bc86db8204a8bd943bde51423a09459fecd528faccb646\nTAG: a69c7d8db2c021284e73b3c07620022eb6f199509e34611ed671c3558ae7c103c78024d96c00c791f3450d1e0338598a246855811af4cc9ae1a6522487a4a77b57b58ce29038ab0a2036404eae59133512b9ea40e2d7176e1b36965a27ee2c898d6514872bec952a029d9d85bfb0c99d8b348db6a3bbfedb6d1a3128664c454b9ef29f075fecc469f233e18567fe16759b378600a1d71504231e6caee5688e9858e14fe6fe850d95d7c010865781f0457a22f53add7ef57071c7153d312ca303e4884b83c9acfe86686517d80ce271c148cf3ab6464a9751b66ac7682a5f885ad9301a5602c099e89977f06b41badd1c2ea1f7027a38b749e2ca1a3ff4e4889e6dbd3674a52c8e24d2c76f64a6bc77\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (10 mod 64).\n# DIGEST: f3c89f21c327fca4aa400fabea9e39780378e901\nKEY: 82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fa\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47\nAD: e037446f5891d77df660ed\nCT: e1eb2175bfee27951357b7536e2c3a4c607bf511d1922f6cce462fdf98de9dfbbea66d38884c270e29d08c5ace1d6bb7bcd2b46eaffc67a99e225927421a9894238cefa73bdb48694abf\nTAG: fc1d8ef98aa65ba8a288ca04990bfb373071633eb1e8f30847d3c19ebef66962cce12d015b045e10c9e0aa7f275137e00cb2c9a0508c0187827a74faca4bcd015620f1cdd8f72161bebbb8231ad4b705d1982db6f9fa1d2303c429469737a3141adf729729144f55223df1fb45705fb15adb5cd03c2936674a47d7f6aa5d2a4d9a017e57a4f5dd954504abb588866457730304878ca322f776e3c8e7becb8437002bc757d5b34b16d04ae4710553a624a3fca8866fb3d20672d6f4a2f937edecd58e68b7b0a8c39819ab48788956c1f3f5f4a15e7d13350090a20c61620c9181f03b4d68d7e4f336cb7e4a1a277df5101511150dd39fb43a84cfc480fd548035c8e9ec26602dd66d250fce39dfd8\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (11 mod 64).\n# DIGEST: e8e41988fad6c8b44c56544964cfe0a347b35b1e\nKEY: 933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e0\nAD: 37446f5891d77df660ed82\nCT: a799c4a6590a4c48735d1da9746e5441cb11b664daada5d4d68d3a0110c4ad8d5e96d7331d5f7a0d1df9af5da4208065b6bf31affdfcd4944e8ed55b0ba7b7911be1a9052fbd93d5fbe292\nTAG: 6a6e5ced88748f87682759b554d9685280e094e083d297dc5fd474c4a2605612b2f8b1c31dea24d58c25bcacfbf03b8b09dc662d6e1120868ae9a0f1dbd2799756136c2a26a22e3a61a0216e76e94393534586e1a59c570d8bdb37d5ee6d0762e60c7171fc7953e59d74b0f2ff4a061d27a7baa8ed138c51264b356d9a42b0768bca1c1c458acdc82bd621031e2ae7790596594d2f6eda2c8d58d4b53cf6990434da8aa9e9eafec648d52233e9b92994ca5cbc071dceeed57b02e36f93f8d22551660cc4c1e425aa77dcda3bf6c98bff7905becc075e1707e37453de8f300be5aabc96c1051fa46c796a2c8367a00af3c4dccc58bb7dc8aa2e21e0886eceb898080bbc7259648f2be9da0f1b56\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (12 mod 64).\n# DIGEST: d1c7b2c04dc25fe7b742a1d659aec20e1475ee4f\nKEY: 3f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037\nAD: 446f5891d77df660ed8293\nCT: 2b8ac97f05a67490bf16bc64381e9c49e7f348212d0645056ca5405e9e0a248b6918568481ceca70e20ae4b7c1f62700a2954188793b34504fa86decc73f667e5fae944211059dfa94ef072e\nTAG: 5f91838f37198290b43fc04a186db6a05261ea9916a1dd6450604ed8a7d0bb59751f6637f593ef1a7e3aab6421b7a0cc6b5b47477d36bf439806dd8156e2bc2e229bcbaed9a3beedfa383d674d3b91922e6248d1aa8ad62361a4bdcfd3d86daeb6d775a521916ecefa2244aefbb0cfc0ede1b1c0e0059a4d69850160d2f4f662ea2b77fb074a6de69feab87bb56f27edc3a42037a041007f0a08d204cbad0a9047f7798dad51e5c04126519b53772ad4f3017f9d9fe91920aa7585a5f2d95e7a8fe5c7b22fc696be10e308f939c34e52b7bc2e71b06a56e3ffa5a0ed529eaf5a8c4b6857b1f144f51fc8bbc858c88ede7ca325d231b34e4ae0e7ac8fec3e8f6a9bbc6f8975fec1e877f0d05046c3fd7a0e15ebb3\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (13 mod 64).\n# DIGEST: 116e20ff1e79e0af464d473b1e7c187f4dd66007\nKEY: 62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be90\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e03744\nAD: 6f5891d77df660ed82933f\nCT: 783a362232c871213daa72d58658aee2ceb4de66198",
     "df21e227326010be056d5c4d2481ffead6c80733603b132b256d1c52d64eb8b700d614dca0adeacc0c7a05d1a64ee7b5c8163d1eae17fdd\nTAG: ba611208a3cc40e2cc638c335fd508441aaa15c612a5100c960543d2ceef9709bbb3e70904f3f2efac3112fc61bdfe7accfb5f0e9d640812a4f5b0676d95b1d5298eddc97ce3aa16ee761491e9f424af39119c9f56322b10e8575697bc93d1f6a63007ae085bd20c83fc32a5d4e59ce8840f75b8c52f6aeda4fc34f11301d64e058b39ff765e1ec9997ec51aeb43b35cba9ad4b020e7dcee79ad532b897faee018dae1231ceafa1a5fca1ff1a01f863580c9c07b13354e31b0067a2fb16477150ab6d027fe88276767ebb46b1029c7d6dcacbf418f10d932dea2ea161ff8a4f6d79e0bdbf0a67227d5c9100a45fde25e2d4e360c0c0942e9ce13b570b5ea149dfe422fea36251e226b3f7eb709ed7c7339aaff\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (14 mod 64).\n# DIGEST: c081d0d09b2c9eb39a372ef4a7b0246a0956b0f9\nKEY: be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f\nAD: 5891d77df660ed82933f62\nCT: 894d8fc70288c7b8a5d12e63ed6e6e8c74b8d9837720762ccc519a42e024ee05e8f770180e5213a7c7ceac56cab05834d49847aa1432fcfad8286e092feddd421b33212e41716b3db5358903c11e\nTAG: c00612f3ee6619c87aa5c7958da77fdac74ea2ad1af9115fd003edc7bdb36f639dc2d89668f6c2440827a1e7bdb65acd172be229f8852d4b81d1d2ee1e167ff127fed768d0a6eb822c2fd88e733a0884f06e47d5f3a7e84e7f20d8b630c8e748a03f2eb807f3d6bf67d3f93ec97f22a3bfc477143f9e34049fd9143ad5e480bf538464fa847a5302e6d9ec3710122fe6c295191906d98d69e01e81a79de0538442a76a17fea214c74bec28c01370a0aed01e1a32a629857f5d48c3275b79a25d3fe549829e5d72d9d26c2e07fe133e214e40dfba4cd19ddccb01a6887bfba26db80b40eaee435a7619415af7be271739dc339fbe4a500db56613498b34c2b1f9dfbea13aff30c84fd1380ecd821b57cb3775\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (15 mod 64).\n# DIGEST: 6f7bb1f9e2772eb909c315e653e4737cfed78a18\nKEY: 8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f58\nAD: 91d77df660ed82933f62be\nCT: e5d56aea96fb40312e288074a21691ed29f17a547529d2427e8bcd5024e617411c08999a8a514adc83a14fe27c51b0f7d44f684fc60274c009274ff9af14d4b1277cc03453e02c0ceb26c796432f0d\nTAG: 07cea5df6c6594985f9af65319e2fcb1882f6d1d66fae0ab595ee72dc4a1118a7ef8ea450209809349b41664ee21afcb053e8edfa53bb1e66d9aefde4c48c6ff5b5e411c1228cbf5c1021d605311a20bd6708aa004d7da8bf72ddce1cbc9a12100969131d596cca0fe61c82208d0848ae0d098036a07600cc4b443e344b06d3162c8ebe14850239f77d178152fee009b1bd81a68bbf632082f9a62dbe60a1ba579077842c713ab4d5619b7abb15eb8fd3b1ee1506fe8df31bc90a63eeeefc0f23ab5ec83f4a1e9fa8833f15c90d6b68615ce297b466d5d67a87ac9fb10a2ffba5a91d31d1b18aaee8c00ff1a8b8df9584a33e946e85d8c6a6c8719421b75a8a56f964725abb4a4be790acbd60efde68671\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (16 mod 64).\n# DIGEST: 172f4992e692a88f49628e5d3937959be01aed2e\nKEY: c55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d4120\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891\nAD: d77df660ed82933f62be8d\nCT: 7923c66ac88a9d3a2c9d9e714d491372caea0658b4e5692a7df8da934dce8525d0974848545ce89a44a735eedb22f18b5b8f1455c0aeedea9cb8f5c0bb51addd065a83c4e825ff3993ff58cf0af7577b\nTAG: 06b8d51726fe8d46fce9a59b084c3924c4aa9575d3b3f9b9e31a098c2c0475e460a89639863652164b724927ef13d2c52faeba797d38ddcb9274dfc6478c06626ec55954ce17df075f0b089ef155daf416980039458b7979afeefe9fa3e365ca19637b05cd17987e25f20e62031c32d441a102c22efb3660e4e3c13800acbfba0e7dc99175e35338b87ebb56d09a3b4bca72774d87e9cf92ce8e66917835c765129c8946c7f42ad8acd9afc22acc44a89dbebf6f4b2a55c139312559e2aaf6115aa617ce07cb2a63c66cbaeeeb5c95ce617928f93031f6dcbd3ee30a6fcd4cd9606695b690d95fb8d126c4962f49f11910a6e9daa2227f46a249819074a06cb5ffd449bd5744f9d9c70dc14475fd4b9a\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (17 mod 64).\n# DIGEST: 00133da1f7c63fd5f0eec364e9a359be02c1d3da\nKEY: 5b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d7\nAD: 7df660ed82933f62be8dc5\nCT: e0b671d572a26f0553cdeca68a4d023615570ed0e9414e5783691fb6d1c2bc30bb4a7590d3138972345f3a55f2f90fdc8ad46555d41968a00a6462c2bc0931a18df5480e48cfcfcc00078314cabe0e44ce\nTAG: d01f174c6f726b83162a8a0734e1b1e9e9498fa067454e3a488cee1a04703987d5ce9a219b4ba168a809a181d6a291eae84f91705fc0701166400f24775bf5816a67ea6f011829ca07ef1aec6ac3b7ba0576c26b557b00fb76e84b6e633c48b8c425678ae12c922a7af7ce0484861efccf958ed418e2658b03b5c978fe624b16428c41a2a7ee1cc07c9d730b689cf92f2041b5e68908fc93d8221821106d73363e2d53df824a82841be5bdc0668c5b8759a1e79e193dac2e55e4cc083569fa727b952a45e71840fc330977e072457de678d3f3694e429131e25efd339421094512755604e1ec84efdb52259f6e8284bb7ebdf229cd3e4f1abfd6498e3b493b21184f8a42ba31f4f22dbeacbb1d977d\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (18 mod 64).\n# DIGEST: 60a6821269be6c5b985576b245f106128eb0b325\nKEY: 436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5d\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77d\nAD: f660ed82933f62be8dc55b\nCT: aa02a8b8deeb507cd2b2ee187af85b5afa85583c258df91df9cf5307316d03b5d8aad0441bacc27c4cb26c56239423f8e46746978c0edd3c21018f6b9a1c39278f71b462c6da999a6f4d9513a47cd7986c88\nTAG: 5cea96fc3da1457f7e66f324a3c634829a6382fb75efc614bf944cafda4c9cde5bf3118838487401497849d59f895d761b8b0da9f339123aeab5b237edd48d6c1ab4120da7769a7f8510bfca3d7313f0f38dc6c34fea81f60dd3e421afef2d9a61e6b0d7be96b357f1a293fe5c21d4ee858725a4c088f49a24930d846d2c0fad98002fa66a618367425cbae16fe570f3058fcfa2544f1d085ddbc6226e35c4355c916660f7f8fef4f5ab705c93b5182269adb8a4eeff4e62ee278c0588b96043f1ad24ca39a7ad458f541101e1d6cef99d742e2e4a124e4f3a57986d0192537d956231f4e49f5a87f5b7f5a4cdae6cc647b90177dc4d81232c62bad3d99036812f84b3208ed2edb8058f4973abd7\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (19 mod 64).\n# DIGEST: e2593f3b6741a9ed9fa188fc06efd057556ee624\nKEY: 6965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df6\nAD: 60ed82933f62be8dc55b43\nCT: 8b397fb4fa218359120058dbd145f4bd99def7e5e0a88249783128801b3828909ea19d9f5fb0f3e15ebd624fc32525796ccf9ec01b1da3acc6dec2a9306c57db4eeeeef4830575fd8166c13c23664d4df4cbac\nTAG: fe141cebcd20919976fe53fa1a9e186db43122704ac5dcfd23abc2da394907a9da4011bf32a3948b0ae848d6d010024c6f37191f6fe5cdc46430b915a9c5cc80329ab5d32797fc97bf3ca270d8b35c14e3091c99ca3947492613d183845ea5b80619d20c38434261dab80d4068449a0880eadc55f0b43cc344a875adfd23020b6e63c3015c887ef52c72750c09f60c7bc0dc29ac7a6494bf9771c4aa931aa440ad400c1cdff8f3d1bc4173977128d1eb57731e4b69d3e6d4715dc5d2a9cfdc2afeabf3513b3e3c107a83ac48f511750f887f59b10f40e8f2d197832dbb1febb82c29627232e3793c8a72d7033c86cf99fb54dd2e3ce099d4fdb50a63b06d5f595d5bf59474cb190245a36095bd\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (20 mod 64).\n# DIGEST: 17450a437efe239e1858ac4062f34024305372be\nKEY: 65aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce99\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660\nAD: ed82933f62be8dc55b4369\nCT: 24e568a27d8bce547f628bfa545c4b7ccffce40f73b5abd6e1b60d5efca7cd6d5feda872e172f64d9193d3d2d3381efb52c05f98d3e1fb689fb05d7017654eb57346f1b3dee23b0f166e50531626582115af7cf0\nTAG: 4dae8797b02d7f1d8dc42b10f18973c094880a10207d9479aa825",
@@ -674,9 +695,9 @@
     "642aae9f7bc42060e\nTAG_LEN: 20\n\n# DIGEST: 6b7295febce7fba8d79d1e7ab8fdfc452191e2ba\nKEY: 454879c41de9ac9f98233b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e\nAD: 6da12dd4c27f4372480974\nCT: a1d0537c3bddc7459a37268608d30ee8e15377c922a4300d7e7f00084cb45a9ab7cfc7f89dfb68f3cf7defd102012361782e977e22c12ac1d91d1e093a21ab26bd171b426af9af7b2dec9d1f2dcf78f19748b39e9b0736e24b44dabf677296db10dc28cd37751d020e1780e5fb00142e972baffc546b9b55bd0067e22ffee4f10312a590394a296cf6fba3456b3c0a64b662d232f185a41762bbad664f977328bba56b62f489d33821d4d604265c388b5ea852968db95ab844c7cb9498bd28d4b055760f83fa94f2a35492a4dd03a1fe9f0c2947fedd44b96948447054e2da7fd3b9d95bfcd0cfe3d1c909e84c9f87ba2a50c33d588592ff3c7c7b56442d52683e222f2610b740a2187159b05f2b15afbba7a97ef2dcb30813b89393706011397f4aa3c537e91fab098ecbf3a87c2185b9001ff1a78e104fbeac85bea4ad609bf1571d83969934d483794944c2e6bea9d778d2deac2d6344106c1dc30d56251faaab3f4dda43a2ed8c3345d9773e4fa4effc5edc3a68cc423b539ed63e8b0605b58aa881906e38b38f02a4df3708e9de4333056c96a02ad6d235636da61fedc631f705e771af9f522109a4d3b34d684b3b175d28a389ea574215131aa68016ea9cf3664b0baa6491f85d3a4370f73967e4c23637fd1d\nTAG: 131597a4dd3057b4a44498ea09294f2df51a5e81adcb3318ccd5\nTAG_LEN: 20\n\n# DIGEST: 1dadffba439570155af2509a548764a93042d23a\nKEY: e9ac9f98233b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e97\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c2\nAD: 7f4372480974454879c41d\nCT: 98c951eccacf8dcba5b819312f0ed234ea1cc06abee5f70888558000c2857de7411feffdf379c187d327943c63ab697675557a62c68c13f48d3970531225d5fb6c1434a126cfd6ba80b8f6dda08b3e3629ed12f7bbb45f45148f8544f0a8eb70c849260916eb62baa1bd850e082ad69ca5817594e8f26f63a1909ff03f5696b7a52f146af246c0c6485ea5826c89471c04fd6c373e9d0fef06f4a7b01400962ebfa4ef4166dc895619864accfef9a4be874111cb333518b33a3a2565d032a2434931a16e000d01e35317338ddbc48317517367603697a225d81fc63fcc7d4b8463bbd24910b4972375a995e13baa148b644993b9a7bd706ae64da00f898599957e406c1ab15fd44b6e85b41d47ffaec8136a5dadab324cb0ce95c738a1f8d246af90d98a68b8ab7003d74aa29591b58ca7b2dc38f21f4cfbc04f2e239728e1350b0f074293a13970b264bee368ff98c6960a805346c19702983d3ddfb6306f24cc7f8224e553b0668180787e48ca8e5d851f84df71d5ce6fd7815d39d7e3941b8e0562af98e6e244216bf418d7ca2d9e29ecd3997573b2c4d92aea1a5a82f2272af1218b379ca40a28cc7ce09ad60028a5a6aac6ce145cc3936f89a5d34ba54aeec8d99f84ebf7367fa5fdc12def2294fd3fa3299ba1a59aacc0d7\nTAG: f65b77267d53b2dfc87a936ae08ef7a3f630176553\nTAG_LEN: 20\n\n# DIGEST: e654b4c78e1c0061eea2996fc126c9bfd41eb6d9\nKEY: 3b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f43724809\nAD: 74454879c41de9ac9f9823\nCT: 5a1c2b7a8d5bc74901521e1300567f30e2b7755f004ddcfd8fe64f471cbaec4bc6d445ea931bafe6ad78034d0ac1d3916f1e0405c2f2aa4b193c2cd599d34b86029840ad379b136aea5c2a74ea70e22e8c8d1e017a2f7d47f8ebac7b85087075c28d6d2846e357ce031abe09e03629a32cef0b205d631f36ec9a1c9c4e90a80900e01688c7298b99be65f204ebaf312364bfdf57d9e16b0142e879a47b9ae0e96fc62e90883624ee2dc110f3a83ab341f4558f360df399170bbae57cb2eb377a87aaed9755e8057d76609d447a33a8255450504b71439fc0d03e0fffb775019ebf921325b42ef56e1b454b5c87ba5daa1f0d0920e860eea43c913d417cd9e9b6676759a4e2c71b0180b432fe2aab4e4fcffb51b4198ffbedbfcdb4dd4e105847f5a5832e85744f34bf3b9929ffeb177ceb4c5e68585a3ff8fda6569921b3d093a2f1d77e710f78245eacd471af88da8ff8f268293845a9a8550ef34e2bbff9d6cf55b18987c71eb98803bac42b0e6c062015fafb754c6a75f927cac4a8adfcfa8ee05a3f115f1f90d734f78180aec2aa621fa7908d350b0cd8550895cf4b5c3cc75eb95fa574f9a91c1f5efa61f054bedd9267f10a08a21b19e63754de10a1bb0c4ffd8c5c08558882a2f98f1175920a71b981affffde44ae1c9281eee161c4c\nTAG: 28f3243632b13692a2f175644a0e192d8102dd9e2affc5c1\nTAG_LEN: 20\n\n# DIGEST: 654b8591c7f0506261713e9ce7a6fd24a6b9357e\nKEY: 61792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f03\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c4\nAD: 1de9ac9f98233b5a7379a5\nCT: 62d0c56ae3e695bafc3cfa3c2d8b9d17ac8ff3b84ccac28d568c1ac84e1574ea06f31605caf86d4e809e39e9c275eed4a8f27eb00dc78e1c10dae719519d949dbc22e00d8644bc3806e54e6531864ae4cb5694002e2a3d7146b39b0b38acadbf1651401805f6394831c608b0478d496cc939b24aa3d3e6d445faceb798a69ae1308a593244645e242829f64f7945d0af8af0eeb6d391c69c2d5bf7b00e42092b36c23362bdd627af43ca7336d88cc36e95ede07b83afb54c8758678d19e0ea7956d8f26776b0f4b6b637c1152853651b6c130f436ffa2d4fd0c344e7583c5e56d6262f43767a1011d8398",
     "311dd6e3d7f9ea89d3eb3f6a1a9cb98905c0761fc5be1d83005fb9ca039b877c30b402743bdf0109ee5de42eef860be676a399a206c08dca8e757f059f7d9611137039b9053430e7d6406abcbf7aed645110aae84f758fcf0d225738cc7c90ace5d83eb9fe65d1e65efa4f6c9d808060cb0f72605e3d7c70e0d13d84689aa1e44aa4dcb152f230d456eb6cf520898bb249262d30c64fde02d6894f72ddff201e4bc41c5fc1f394f2620f764d40098292b04aee45e26812f3abf9a020b5215beb7938e2c121e809ab825d22a2d560bb9bde47572ecb891dd49b38f41af9649dfbdc83ab9bceb444bacdfca2fcbefd623364d4e255e2c0f3164ad92\nTAG: 42174887a9a11a8ac5d1d13e83f8502a3cb0310bbf46b24ff42e3d\nTAG_LEN: 20\n\n# DIGEST: 1eaad32c8d0cefaa5e2c503bb2185a73e6387fac\nKEY: 16430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb7\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98\nAD: 233b5a7379a561792c0f31\nCT: cc269c9aed42c9ba90c768710fa03985372a219f391327e438b1593af29aaf2b66cf8fd60f137d8ce8438a7bcbf7c1c7010c06636f191802daa26fe12ac1c1458baefb2a51fc7361b2d98311c2eaa27e046fffbb76fc855ac01a1321672658e394043367e89478a789d662c88e91642af53824097326d991abd62d1ab818452fc152aa1bd05032027fbb691886d9269937f7f57e214a2186a191b2249ba6fe79b69a94623d85ef0db6b5c2363627ea15a614e6ee42ce0a26a90faaa3ec45451c69c7d472d98b0376a95503b16c6f17eeeb42e0ad5c8775584819aa01309e6071e6b9494da6ddcf992ec6bfc81e0031d74353afa042abfe62fae02792bb6dcae82694cb651689e4039208bf677c90ed6245606cae81732d9d32043e5435f8c40cb76b55a03593dda1271aaccdbc24f18c9a881c77e1dca0e62bfdd36208ee94370b166d66203dfb90c8602dfb48159410840c669c47e7514bf91ef603834bc213173458a87909979b3b77aaa77262e1a634fcb40241818f544f9d207e91ca1f46f77c5c4f606398938f764080dda0978c6b76ce76830a15098870e72b5c9f4975b495d2c5d969688b555773601ad8c857ca8c38565674539fa71a8acadac5415b563f55811b0c010ca1e6793ad08e6c830a0ec2b385402fb8af3b6f0ea0b70b458667953207e4d44f1959\nTAG: ecd2bdb2e683ff8bc7d20482e698ce2b608032094cc2\nTAG_LEN: 20\n\n# DIGEST: 862c0517b3658e9b9cd27db608d49e24e9b4667d\nKEY: a058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe9d0cb746bbd55813\nNONCE: \nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98233b5a7379\nAD: a561792c0f3116430e8b6e\nCT: def7eba4397065d05a7a1b742179c1d8eff65e7e4ac18bec49ed020a95497a58af4ce62679a36b77f95f72913c2a58184ea0c3b59b60784bdf63893a2a84f76ab2b6324a218361316971ebb1e2850b6c7baaf9130715580626bf298f60d862cc4b9c4f353a9e4c7536fd697ece9407eb8ad434c97e325cebd5aa0cf4a5342724f2950c8623aa3a5322f2e06a6b1d71a57b22a2f85ed1acacbeba192cb29ced37983e4231bb930c07f7266728c54e8fa9a0b7195975095fd714440e07d63aa87778061a361b4d44f0241a504089b738cdf3a6323b7a709d39637a2c61677c1f034214a4da6471a89425a5cc6040f37261b9a8e55589b2c24a01b4379dfe00ce758e9e617b6d15abcf0974be46d151c5d26e69c50d3fe68d1854b788d6a43e72a00b1602bb9e7557c4c298b99cccaa17fd950123d672978cd359e115eceb88480d59f5496a920949e09d0590283280d78df0ee068c475706701034b5b8686c60e2c4c4d4bafb2dd25c86293d472d195186f3fbaaaa000cf678295143aa290b011ec35e1eb2dcc6ad12593a934b60af7b570bc59569df2e99bf618aaa60e533265e2bfcfe3e01dd1620cd7d6df8b70726b5fa1191b0cdbe627f714744b2bf2abaddf800cc091ce5ee447f2a61ad36094743182ebbe236745bbeb27a946c8d8dba54dd3597fc4328bb3fa5f43371b531bb\nTAG: bcb4795a551fa0b1d147e2c8f70c31f20a60228963076b32bb\nTAG_LEN: 20\n\n",
 };
-static const size_t kLen20 = 455606;
+static const size_t kLen21 = 455606;
 
-static const char *kData20[] = {
+static const char *kData21[] = {
     "# Generated by\n#   go run make_legacy_aead_tests.go -cipher 3des -mac sha1\n#\n# Note: aead_test's input format splits the ciphertext and tag positions of the\n# sealed input. But these legacy AEADs are MAC-then-encrypt and so the 'TAG' may\n# also include padding. We write the byte length of the MAC to 'TAG_LEN' and\n# include the unencrypted MAC in the 'DIGEST' tag above # each test case.\n# each test case.\n\n# Test with non-minimal padding.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8e\nNONCE: d1c8e9ba2fd6773e\nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: 144c98ca1f\nTAG: 4a40ffe530b338e5173a8e62c8530b0c14b15046d12f2ca3158ad71effd0f46b29b3ae\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with bad padding values.\n# DIGEST: 7f3a0e20bde700d3c5596909282e5c3e764c99e7\nKEY: 86d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8e\nNONCE: d1c8e9ba2fd6773e\nIN: 936a91d0b5\nAD: d2c0267218cb7090c61713\nCT: 144c98ca1f\nTAG: 4a40ffe530b338e5173a8e62c8530b0c14b1508045d58f4bdae400\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with no padding.\n# DIGEST: c6105cc86e18eb8376c16ea37693db5c07b77137\nKEY: 8503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe47\nNONCE: 7e0cdd46be99371e\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c748\nAD: 1df3f4183aa23fd8d7efd8\nCT: 17944422f667bf1356c234189f9c6cf7af52b2832b2fbaa990ccef4e7f9bc3841e59e25c00e3686d5bd5c29f\nTAG: 3ebd1b0bee840e8a6e992421c62de5a8fda3a82f\nTAG_LEN: 20\nNO_SEAL: 01\nFAILS: 01\n\n# Test with maximal padding (0 mod 64).\n# DIGEST: ceb2d295bd0efd37c6c34dab1854c80e986174fc\nKEY: 37446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65\nNONCE: de39f4f03541a11b\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba\nAD: 2fd6773e0d0c302a5f47e0\nCT: f2ab16ba87c52d066c0637d387b89d700a66828ef231b480f39aa08ac2447c8ddd205d1a95da37f267c06a1338532de890904f9f19c930adfb684e81cc06bdf2\nTAG: 3ff610fb9e208ff6ad58b78c5b2cf54b997eb3f24ac0171229ff7ee9cd5070de5a604f78b35b6cd25b3f2ab487847ca1e3928bf7f19bd19c9c9a1015dabd2de426fe57d342009ae4a2e67fdea378f24ec8dec1e87b62b6f70626bfd71f8d8d5e5c5b935a76527ee8a9a3094d635dc2b01a31dc4df336aa023517d7c35e142ccd6a79bc689e335f187a5358a00a7d4eb168cca3f9c6523ad4d74609a5b5c9e36db6bdf8464c4c8497c501084afa17557d070a7671c9144c86b4de9d57f033bc6b59a7f1f4e947b6a2d69c85877de731f6eb3db71d9f4c2dc086a3303bcbcd2f5b71643058b7ce08ef5879e0578ec81ced96ce907d4f32e67fd4cd269de9b60e09ff74bad6c86356ee297475ea7fe75d75\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (1 mod 64).\n# DIGEST: a07054c760cc66fc704edf950201005031f3faac\nKEY: 446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de\nNONCE: 39f4f03541a11be1\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2f\nAD: d6773e0d0c302a5f47e037\nCT: d7059edbabb5cfc2cd5c459abd74e136790aad50d988c6c9271428597617db171b89ab171a68b14f9d417bb81f9f7d2e2045aa47c0b5d166c8b2622bd914c4e752\nTAG: e3d17e303776640b3ab712f6068c44e0e3b5d375203a8b01ad47e6f4681011eff04a41d03ff073e61c630b5faacb744447226a35e7496204911ddd660792be62c5f34c918a0d8514872100c4637ca12bc9c13b1580aed10a68c9187377441bcdf213bf3aa72831f3498d990a7a5960e1e6795bb11e4c7910a881d76ac81320ae61b151b8dbde093bc9e56b8204463d8ec31dc32b3cad5cd8cb48b5f20e54c17469ce97c069051c8e4b2ae5dffc0c2651d868a9909187c2732056213e41e315e94d14a84a24a676155ba86ef0b96efee3e4765dfc750953dc9a7ed739422c7d988f290432320313848a2eb7723c7c85ca3590eb35e3058d0462ddaab0cd48730107d4031a216c6c2595d1ca0b3f1815\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (2 mod 64).\n# DIGEST: d059c266cf6233af730b7a229b19356a4c6fcf06\nKEY: 6f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39\nNONCE: f4f03541a11be112\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6\nAD: 773e0d0c302a5f47e03744\nCT: 8864e31c8b2ce1bcd1745671da5bd66e1e366b0af66b91f605574c841084a5df358483c7839e4456ae5a442930f21d4bde67578186a91c0a603468339ffbe3bfc607\nTAG: d8a0bcddd40964405ef006e0083e67a607b9f926e6508880d7784248a626d56a0673ff990920960fb307ed9cf40c2a1cc3b632b1f94aeb30efa02123e66165b77aa4be5e2aaba4c4a52372b403cae2f78a3bffc1cae8dc6f53839de7f16b8984304abc4a81ffe1ffb42799b54dc43ca0b963be6299a404fd4b3acf65939ac319966aae0a941c74135705092567e1237044c88f79b02b68ef622f9c776bbc04dbc2f58338c129f25afcd8cad7a0e91f30339457075b68df4960c003ef574e3aaae870787ae9ddab96495861388b341aa63ab2721abb176c4f2e6d5704cae123c20f1394d6a12d51fd5782dcb59d075775dfeb72df846995b87b1d374c0d0b8a003ba60f713ad777b8d6ad42c5e373\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (3 mod 64).\n# DIGEST: 8aac0687e33041fcc18da154b41f20a6af2bfb28\nKEY: 5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4\nNONCE: f03541a11be112a7\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd677\nAD: 3e0d0c302a5f47e037446f\nCT: 1d239b3880e2261806ee770e7296d573d308d9850c8bd90a0764822faf5f65770f98f18ce4738538f03ad9b289bd5fa1367258f00d3ed91e32885bc45c30a240cad8c2\nTAG: dbeb6d1a1165a902128a27d7f55f4d928b56a3b83fa430d47bc4f935219fcc6005487f1ab14df0a07a270645d1c2fc23efc9866ec7e4427fe0382b75215c0f994f09c4ac54bf360f8ec938b02c17c4104127d2cb1eb51a11455180931b8e473838e5b1e61cf5cd05947a5b154be5df49905e6e7c049d00f065f680b0e5f3f4a7e9dad37d493f13c7ba318ca2bae086136d67b17a6ebf28b45cebcbfe115a45dfa32786a8b8354d51acf58bc126a13146e0ca509a26cc32c3e8ecf5b9d6ce76a9f76d674316c42f3140d5139304479376db2a167c65da7250e6fefc9d3b37a2072180ab3202f1fc7dd7f4598d1d976b15945fa73e1be07a91186ce7c16c4249d9f7287baafc572673925e95caba\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (4 mod 64).\n# DIGEST: 53658226c112b86438dd27b58a71f9e36fc73c1e\nKEY: 91d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f0\nNONCE: 3541a11be112a729\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e\nAD: 0d0c302a5f47e037446f58\nCT: 719d9de3bc86d08510354817d0fb94340ab1ddeefdb95a1cf460f7c9b185837b5320dd862b4c319619a0b18dc75f1762cf7c9bed63713c31e39a6f7069563441b9e6f106\nTAG: 8b61062c9480ffa62f7b96e9f50249426d05bf237d25e2b676e0041d40ba97101843d9ebc978949eb7ba53b8989ed0e93e5b91f13365345baefa1d7f59b694f6ef0bef0adc1d6763978e12fe354e57b90127533f3f991ce611e31e88a97962f859ebbc0e50d130c323aff35581f1f45cb5c650299025a03d99026d6f6a844ed9d5fe66e15a9fca79726afdaa54c077d148d561ca9e77e427b8f8074714aaf8b011697524e4d91bbab69bc01c8346e9055d7269cf124b503f7ad38c384abfd91ca36159d8a41e6389212167278b830ea464f7dffc3e01c9807368d3457ad5f21b33bcb1afd41ab7d805c9ed2f2c32da9bd4b510366b362dd02f50666ab8e5a72486b3c0d6b9bafb38c9375dda42daef635a0007ef\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (5 mod 64).\n# DIGEST: 6b7d5268b0b5037afb5be5af6a0ceb34e7656ac4\nKEY: d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f035\nNONCE: 41a11be112a72933\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d\nAD: 0c302a5f47e037446f5891\nCT: 9adce31c760d09ff911ed98eeb7146e82017261c8017d9a5fae1127479f6fb54d081cacc1ab7150f05d13547b992c1fe36a6e8e55ef1fa3bcc45bca495a981000a0c0b4f62\nTAG: 51d033e8003b06bf819a4f7978d75abec450c6b11a00bdf27f549f6060390ff99e0feb9509c6ac882777da699f5d5332d1b838a0436101574789ba485769ea6f4d73a10db775f06331140b218fa2ddad7fecf381fb9e3d26b06b3577bdf57e2a8435ba0e5b1e305ddf28070d1749d11ec5504cd9aa51ffe9133152ff35de21e4bbc3b109a318075d924bbaf0e267a1abd3d7afd2d3d8f4d951d4e96fa63741087a975eee8156b01fe566f7f6a309257c17a0bd9faae4c2781aae72eeab1903602b09b69026540a84b4786b8dce2a3e5ca26c65eb7b220dfad400cd236a4435d7fb1be60b9074f2f226e810d54abe7ec0cf10e7c465059720baf93915dda8a56d5a012a990d72408d2c9ab9b8dc813eb2f1caec\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (6 mod 64).\n# DIGEST: 63efe7af50",
     "2231420ed5aecce9a28446b257828d\nKEY: 7df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541\nNONCE: a11be112a72933c7\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c\nAD: 302a5f47e037446f5891d7\nCT: b81f6e678c5a08244a5f578970d64f96f50ad5b5724a9287ee7b293308db34e03456f1745f79c594ecc480fb2a9412bd685e6c0df028eda06aaa15c90afa4ec01736450e3eb8\nTAG: 63b849636c212d353918c6e3044d298da268ccf1042987617860b58eb7ec8314ccd7762ebc39b62c0f0f1c346c8f4bbcbf3bd0134c0a7374de1868b08ba013398d8e4b578bb8d7359f2cff1629ede34da00138efa4a724d892fe4ed2b28613e66e0bb4830f66c14dccbf8656e615d66f267182662fee8a3e1fcde0941793f0bf2b00d6ab6e9fcb30553b620cf8e9e0a15f122808d739e698f88aa157baba12428541e928ed556517978f6c9f29c6ae8fe5b4e9ed6f0ce49351ac2a63e74bda9288a874a7fd5327c6856596a3271039dcf54affbaf29a5556f1fe1062279d2600b920f4e26c96e9e8fa696c521f60e9418975befa58ad564e730d1de312ca1b999a5e89b813743b1512659d809078243170ab\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (7 mod 64).\n# DIGEST: 1a555c300a1d1bd5b03cdd6bf2a678621624eb05\nKEY: f660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a1\nNONCE: 1be112a72933c7b5\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c30\nAD: 2a5f47e037446f5891d77d\nCT: 6b6f94bc2326760d257d8156de961acac0b32d7f4d0e20363532e76ce76641ba66a1aa7945b9ee58527039cf83fcb01d8ef85254566947347463e161ec8cdec74a839637288d09\nTAG: 77b18bca8ed1d056d9c974054598216bc15bae5b7d70f3bbe32b3deb92398b0ce25a1efc5eb6782fa5fbcdbb415ef43eca090fcad4d34d53b1fd89cdd760e6424715c7703c51e08b72cb3e3b8a30bff159d5126f1473f216d5c931ae03703d3baf311a59d7ef3d6db123f3e8c0ca26fd3f8809ca63265d2fac935bec32631af43626ed1ee9785c81d7bd0cbc0c5178e1ca7de5d12c3592a7880be6590072c4728b2afa1eaaeecdf7cadd8304c2d4b614af7af14efa00dda595be92de09c74b39df05d7d023db721f86992c57061a264dead21e24fa47816f43b77b8ccccde44bfc32a015134a2cfaf04c582fb839202b08b81543ea9358d5735e7c197762a6a39936e26de58690a02dfc273e6779e77708\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (8 mod 64).\n# DIGEST: de9156349b578f2f44945ec6a676a67a829daea1\nKEY: 60ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11b\nNONCE: e112a72933c7b54e\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a\nAD: 5f47e037446f5891d77df6\nCT: 8f211be563f98f493745cca0e385e5b0113027efe3b0a880805427e363014323c4f6c7e6b30d2466c70ed56d63157f2c4f6dabe14d5a22c6c708ab3fb667a6c64ce5c8de22f5261b\nTAG: e5807ffa59e0005c9dd7eef0b854ee1b2cfccef9977f8a963167cc563d844f795c4ce4f9d03da95e4cfd2fc80c9efb6424df8cd3b7875a6ca129da8f509ab09d1f0eec0211e0ffe5492913fb688796a29a8eac54f374e8948991059f6e73a68eba75a892b3e2ed5ab9680eb0b308b07337e75ad5b406c260af5d27955aa820bd0435549700e960e66c211000885e19b804579acfa8c526603f8d743491d916fd4d0e250159e485a4db2fea39a8eb9443516518e6612aae97b1d9b7ac48066d5fbe2c1be3b2e20233a2fb4d39052ef4ca3bfc47e561aaac9c57a7dbff922d6d997821f6b09bf3b4c91bc6162b150e17bfa2544f93f2bebcb4d20322bf0357fdffeec8f75679e6627b4ffbf8e0bfee63c8\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (9 mod 64).\n# DIGEST: 12812df3aa7f3bbc899f6f248f5590e02570c292\nKEY: ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be1\nNONCE: 12a72933c7b54ed4\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f\nAD: 47e037446f5891d77df660\nCT: eeb6afcfd2626da1230067ed9938f7df35e99d2ba1c91d0e91c3db53034a3dd2ce3352b06e3d1b9e8415ef4ced9b2257eb05bc86db8204a8bd943bde51423a09459fecd528faccb646\nTAG: a69c7d8db2c021284e73b3c07620022eb6f199509e34611ed671c3558ae7c103c78024d96c00c791f3450d1e0338598a246855811af4cc9ae1a6522487a4a77b57b58ce29038ab0a2036404eae59133512b9ea40e2d7176e1b36965a27ee2c898d6514872bec952a029d9d85bfb0c99d8b348db6a3bbfedb6d1a3128664c454b9ef29f075fecc469f233e18567fe16759b378600a1d71504231e6caee5688e9858e14fe6fe850d95d7c010865781f0457a22f53add7ef57071c7153d312ca303e4884b83c9acfe86686517d80ce271c148cf3ab6464a9751b66ac7682a5f885ad9301a5602c099e89977f06b41badd1c2ea1f7027a38b749e2ca1a3ff4e4889e6dbd3674a52c8e24d2c76f64a6bc77\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (10 mod 64).\n# DIGEST: f3c89f21c327fca4aa400fabea9e39780378e901\nKEY: 82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112\nNONCE: a72933c7b54ed4fa\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47\nAD: e037446f5891d77df660ed\nCT: e1eb2175bfee27951357b7536e2c3a4c607bf511d1922f6cce462fdf98de9dfbbea66d38884c270e29d08c5ace1d6bb7bcd2b46eaffc67a99e225927421a9894238cefa73bdb48694abf\nTAG: fc1d8ef98aa65ba8a288ca04990bfb373071633eb1e8f30847d3c19ebef66962cce12d015b045e10c9e0aa7f275137e00cb2c9a0508c0187827a74faca4bcd015620f1cdd8f72161bebbb8231ad4b705d1982db6f9fa1d2303c429469737a3141adf729729144f55223df1fb45705fb15adb5cd03c2936674a47d7f6aa5d2a4d9a017e57a4f5dd954504abb588866457730304878ca322f776e3c8e7becb8437002bc757d5b34b16d04ae4710553a624a3fca8866fb3d20672d6f4a2f937edecd58e68b7b0a8c39819ab48788956c1f3f5f4a15e7d13350090a20c61620c9181f03b4d68d7e4f336cb7e4a1a277df5101511150dd39fb43a84cfc480fd548035c8e9ec26602dd66d250fce39dfd8\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (11 mod 64).\n# DIGEST: e8e41988fad6c8b44c56544964cfe0a347b35b1e\nKEY: 933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a7\nNONCE: 2933c7b54ed4fad0\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e0\nAD: 37446f5891d77df660ed82\nCT: a799c4a6590a4c48735d1da9746e5441cb11b664daada5d4d68d3a0110c4ad8d5e96d7331d5f7a0d1df9af5da4208065b6bf31affdfcd4944e8ed55b0ba7b7911be1a9052fbd93d5fbe292\nTAG: 6a6e5ced88748f87682759b554d9685280e094e083d297dc5fd474c4a2605612b2f8b1c31dea24d58c25bcacfbf03b8b09dc662d6e1120868ae9a0f1dbd2799756136c2a26a22e3a61a0216e76e94393534586e1a59c570d8bdb37d5ee6d0762e60c7171fc7953e59d74b0f2ff4a061d27a7baa8ed138c51264b356d9a42b0768bca1c1c458acdc82bd621031e2ae7790596594d2f6eda2c8d58d4b53cf6990434da8aa9e9eafec648d52233e9b92994ca5cbc071dceeed57b02e36f93f8d22551660cc4c1e425aa77dcda3bf6c98bff7905becc075e1707e37453de8f300be5aabc96c1051fa46c796a2c8367a00af3c4dccc58bb7dc8aa2e21e0886eceb898080bbc7259648f2be9da0f1b56\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (12 mod 64).\n# DIGEST: d1c7b2c04dc25fe7b742a1d659aec20e1475ee4f\nKEY: 3f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a729\nNONCE: 33c7b54ed4fad0be\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037\nAD: 446f5891d77df660ed8293\nCT: 2b8ac97f05a67490bf16bc64381e9c49e7f348212d0645056ca5405e9e0a248b6918568481ceca70e20ae4b7c1f62700a2954188793b34504fa86decc73f667e5fae944211059dfa94ef072e\nTAG: 5f91838f37198290b43fc04a186db6a05261ea9916a1dd6450604ed8a7d0bb59751f6637f593ef1a7e3aab6421b7a0cc6b5b47477d36bf439806dd8156e2bc2e229bcbaed9a3beedfa383d674d3b91922e6248d1aa8ad62361a4bdcfd3d86daeb6d775a521916ecefa2244aefbb0cfc0ede1b1c0e0059a4d69850160d2f4f662ea2b77fb074a6de69feab87bb56f27edc3a42037a041007f0a08d204cbad0a9047f7798dad51e5c04126519b53772ad4f3017f9d9fe91920aa7585a5f2d95e7a8fe5c7b22fc696be10e308f939c34e52b7bc2e71b06a56e3ffa5a0ed529eaf5a8c4b6857b1f144f51fc8bbc858c88ede7ca325d231b34e4ae0e7ac8fec3e8f6a9bbc6f8975fec1e877f0d05046c3fd7a0e15ebb3\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (13 mod 64).\n# DIGEST: 116e20ff1e79e0af464d473b1e7c187f4dd66007\nKEY: 62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933\nNONCE: c7b54ed4fad0be90\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e03744\nAD: 6f5891d77df660ed82933f\nCT: 783a362232c871213daa72d58658aee2ceb4de66198df21e22732601",
     "0be056d5c4d2481ffead6c80733603b132b256d1c52d64eb8b700d614dca0adeacc0c7a05d1a64ee7b5c8163d1eae17fdd\nTAG: ba611208a3cc40e2cc638c335fd508441aaa15c612a5100c960543d2ceef9709bbb3e70904f3f2efac3112fc61bdfe7accfb5f0e9d640812a4f5b0676d95b1d5298eddc97ce3aa16ee761491e9f424af39119c9f56322b10e8575697bc93d1f6a63007ae085bd20c83fc32a5d4e59ce8840f75b8c52f6aeda4fc34f11301d64e058b39ff765e1ec9997ec51aeb43b35cba9ad4b020e7dcee79ad532b897faee018dae1231ceafa1a5fca1ff1a01f863580c9c07b13354e31b0067a2fb16477150ab6d027fe88276767ebb46b1029c7d6dcacbf418f10d932dea2ea161ff8a4f6d79e0bdbf0a67227d5c9100a45fde25e2d4e360c0c0942e9ce13b570b5ea149dfe422fea36251e226b3f7eb709ed7c7339aaff\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (14 mod 64).\n# DIGEST: c081d0d09b2c9eb39a372ef4a7b0246a0956b0f9\nKEY: be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7\nNONCE: b54ed4fad0be905d\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f\nAD: 5891d77df660ed82933f62\nCT: 894d8fc70288c7b8a5d12e63ed6e6e8c74b8d9837720762ccc519a42e024ee05e8f770180e5213a7c7ceac56cab05834d49847aa1432fcfad8286e092feddd421b33212e41716b3db5358903c11e\nTAG: c00612f3ee6619c87aa5c7958da77fdac74ea2ad1af9115fd003edc7bdb36f639dc2d89668f6c2440827a1e7bdb65acd172be229f8852d4b81d1d2ee1e167ff127fed768d0a6eb822c2fd88e733a0884f06e47d5f3a7e84e7f20d8b630c8e748a03f2eb807f3d6bf67d3f93ec97f22a3bfc477143f9e34049fd9143ad5e480bf538464fa847a5302e6d9ec3710122fe6c295191906d98d69e01e81a79de0538442a76a17fea214c74bec28c01370a0aed01e1a32a629857f5d48c3275b79a25d3fe549829e5d72d9d26c2e07fe133e214e40dfba4cd19ddccb01a6887bfba26db80b40eaee435a7619415af7be271739dc339fbe4a500db56613498b34c2b1f9dfbea13aff30c84fd1380ecd821b57cb3775\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (15 mod 64).\n# DIGEST: 6f7bb1f9e2772eb909c315e653e4737cfed78a18\nKEY: 8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b5\nNONCE: 4ed4fad0be905d41\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f58\nAD: 91d77df660ed82933f62be\nCT: e5d56aea96fb40312e288074a21691ed29f17a547529d2427e8bcd5024e617411c08999a8a514adc83a14fe27c51b0f7d44f684fc60274c009274ff9af14d4b1277cc03453e02c0ceb26c796432f0d\nTAG: 07cea5df6c6594985f9af65319e2fcb1882f6d1d66fae0ab595ee72dc4a1118a7ef8ea450209809349b41664ee21afcb053e8edfa53bb1e66d9aefde4c48c6ff5b5e411c1228cbf5c1021d605311a20bd6708aa004d7da8bf72ddce1cbc9a12100969131d596cca0fe61c82208d0848ae0d098036a07600cc4b443e344b06d3162c8ebe14850239f77d178152fee009b1bd81a68bbf632082f9a62dbe60a1ba579077842c713ab4d5619b7abb15eb8fd3b1ee1506fe8df31bc90a63eeeefc0f23ab5ec83f4a1e9fa8833f15c90d6b68615ce297b466d5d67a87ac9fb10a2ffba5a91d31d1b18aaee8c00ff1a8b8df9584a33e946e85d8c6a6c8719421b75a8a56f964725abb4a4be790acbd60efde68671\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (16 mod 64).\n# DIGEST: 172f4992e692a88f49628e5d3937959be01aed2e\nKEY: c55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54e\nNONCE: d4fad0be905d4120\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891\nAD: d77df660ed82933f62be8d\nCT: 7923c66ac88a9d3a2c9d9e714d491372caea0658b4e5692a7df8da934dce8525d0974848545ce89a44a735eedb22f18b5b8f1455c0aeedea9cb8f5c0bb51addd065a83c4e825ff3993ff58cf0af7577b\nTAG: 06b8d51726fe8d46fce9a59b084c3924c4aa9575d3b3f9b9e31a098c2c0475e460a89639863652164b724927ef13d2c52faeba797d38ddcb9274dfc6478c06626ec55954ce17df075f0b089ef155daf416980039458b7979afeefe9fa3e365ca19637b05cd17987e25f20e62031c32d441a102c22efb3660e4e3c13800acbfba0e7dc99175e35338b87ebb56d09a3b4bca72774d87e9cf92ce8e66917835c765129c8946c7f42ad8acd9afc22acc44a89dbebf6f4b2a55c139312559e2aaf6115aa617ce07cb2a63c66cbaeeeb5c95ce617928f93031f6dcbd3ee30a6fcd4cd9606695b690d95fb8d126c4962f49f11910a6e9daa2227f46a249819074a06cb5ffd449bd5744f9d9c70dc14475fd4b9a\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (17 mod 64).\n# DIGEST: 00133da1f7c63fd5f0eec364e9a359be02c1d3da\nKEY: 5b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4\nNONCE: fad0be905d41203f\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d7\nAD: 7df660ed82933f62be8dc5\nCT: e0b671d572a26f0553cdeca68a4d023615570ed0e9414e5783691fb6d1c2bc30bb4a7590d3138972345f3a55f2f90fdc8ad46555d41968a00a6462c2bc0931a18df5480e48cfcfcc00078314cabe0e44ce\nTAG: d01f174c6f726b83162a8a0734e1b1e9e9498fa067454e3a488cee1a04703987d5ce9a219b4ba168a809a181d6a291eae84f91705fc0701166400f24775bf5816a67ea6f011829ca07ef1aec6ac3b7ba0576c26b557b00fb76e84b6e633c48b8c425678ae12c922a7af7ce0484861efccf958ed418e2658b03b5c978fe624b16428c41a2a7ee1cc07c9d730b689cf92f2041b5e68908fc93d8221821106d73363e2d53df824a82841be5bdc0668c5b8759a1e79e193dac2e55e4cc083569fa727b952a45e71840fc330977e072457de678d3f3694e429131e25efd339421094512755604e1ec84efdb52259f6e8284bb7ebdf229cd3e4f1abfd6498e3b493b21184f8a42ba31f4f22dbeacbb1d977d\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (18 mod 64).\n# DIGEST: 60a6821269be6c5b985576b245f106128eb0b325\nKEY: 436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fa\nNONCE: d0be905d41203f5d\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77d\nAD: f660ed82933f62be8dc55b\nCT: aa02a8b8deeb507cd2b2ee187af85b5afa85583c258df91df9cf5307316d03b5d8aad0441bacc27c4cb26c56239423f8e46746978c0edd3c21018f6b9a1c39278f71b462c6da999a6f4d9513a47cd7986c88\nTAG: 5cea96fc3da1457f7e66f324a3c634829a6382fb75efc614bf944cafda4c9cde5bf3118838487401497849d59f895d761b8b0da9f339123aeab5b237edd48d6c1ab4120da7769a7f8510bfca3d7313f0f38dc6c34fea81f60dd3e421afef2d9a61e6b0d7be96b357f1a293fe5c21d4ee858725a4c088f49a24930d846d2c0fad98002fa66a618367425cbae16fe570f3058fcfa2544f1d085ddbc6226e35c4355c916660f7f8fef4f5ab705c93b5182269adb8a4eeff4e62ee278c0588b96043f1ad24ca39a7ad458f541101e1d6cef99d742e2e4a124e4f3a57986d0192537d956231f4e49f5a87f5b7f5a4cdae6cc647b90177dc4d81232c62bad3d99036812f84b3208ed2edb8058f4973abd7\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (19 mod 64).\n# DIGEST: e2593f3b6741a9ed9fa188fc06efd057556ee624\nKEY: 6965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0\nNONCE: be905d41203f5dce\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df6\nAD: 60ed82933f62be8dc55b43\nCT: 8b397fb4fa218359120058dbd145f4bd99def7e5e0a88249783128801b3828909ea19d9f5fb0f3e15ebd624fc32525796ccf9ec01b1da3acc6dec2a9306c57db4eeeeef4830575fd8166c13c23664d4df4cbac\nTAG: fe141cebcd20919976fe53fa1a9e186db43122704ac5dcfd23abc2da394907a9da4011bf32a3948b0ae848d6d010024c6f37191f6fe5cdc46430b915a9c5cc80329ab5d32797fc97bf3ca270d8b35c14e3091c99ca3947492613d183845ea5b80619d20c38434261dab80d4068449a0880eadc55f0b43cc344a875adfd23020b6e63c3015c887ef52c72750c09f60c7bc0dc29ac7a6494bf9771c4aa931aa440ad400c1cdff8f3d1bc4173977128d1eb57731e4b69d3e6d4715dc5d2a9cfdc2afeabf3513b3e3c107a83ac48f511750f887f59b10f40e8f2d197832dbb1febb82c29627232e3793c8a72d7033c86cf99fb54dd2e3ce099d4fdb50a63b06d5f595d5bf59474cb190245a36095bd\nTAG_LEN: 20\nNO_SEAL: 01\n\n# Test with maximal padding (20 mod 64).\n# DIGEST: 17450a437efe239e1858ac4062f34024305372be\nKEY: 65aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be\nNONCE: 905d41203f5dce99\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660\nAD: ed82933f62be8dc55b4369\nCT: 24e568a27d8bce547f628bfa545c4b7ccffce40f73b5abd6e1b60d5efca7cd6d5feda872e172f64d9193d3d2d3381efb52c05f98d3e1fb689fb05d7017654eb57346f1b3dee23b0f166e50531626582115af7cf0\nTAG: 4dae8797b02d7f1d8dc42b10f18973c094880a10207d9479aa8252df66e855a7a4",
@@ -734,9 +755,9 @@
     "060e\nTAG_LEN: 20\n\n# DIGEST: 6b7295febce7fba8d79d1e7ab8fdfc452191e2ba\nKEY: 454879c41de9ac9f98233b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6\nNONCE: 944f44d722271233\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e\nAD: 6da12dd4c27f4372480974\nCT: a1d0537c3bddc7459a37268608d30ee8e15377c922a4300d7e7f00084cb45a9ab7cfc7f89dfb68f3cf7defd102012361782e977e22c12ac1d91d1e093a21ab26bd171b426af9af7b2dec9d1f2dcf78f19748b39e9b0736e24b44dabf677296db10dc28cd37751d020e1780e5fb00142e972baffc546b9b55bd0067e22ffee4f10312a590394a296cf6fba3456b3c0a64b662d232f185a41762bbad664f977328bba56b62f489d33821d4d604265c388b5ea852968db95ab844c7cb9498bd28d4b055760f83fa94f2a35492a4dd03a1fe9f0c2947fedd44b96948447054e2da7fd3b9d95bfcd0cfe3d1c909e84c9f87ba2a50c33d588592ff3c7c7b56442d52683e222f2610b740a2187159b05f2b15afbba7a97ef2dcb30813b89393706011397f4aa3c537e91fab098ecbf3a87c2185b9001ff1a78e104fbeac85bea4ad609bf1571d83969934d483794944c2e6bea9d778d2deac2d6344106c1dc30d56251faaab3f4dda43a2ed8c3345d9773e4fa4effc5edc3a68cc423b539ed63e8b0605b58aa881906e38b38f02a4df3708e9de4333056c96a02ad6d235636da61fedc631f705e771af9f522109a4d3b34d684b3b175d28a389ea574215131aa68016ea9cf3664b0baa6491f85d3a4370f73967e4c23637fd1d\nTAG: 131597a4dd3057b4a44498ea09294f2df51a5e81adcb3318ccd5\nTAG_LEN: 20\n\n# DIGEST: 1dadffba439570155af2509a548764a93042d23a\nKEY: e9ac9f98233b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722\nNONCE: 271233a825264e97\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c2\nAD: 7f4372480974454879c41d\nCT: 98c951eccacf8dcba5b819312f0ed234ea1cc06abee5f70888558000c2857de7411feffdf379c187d327943c63ab697675557a62c68c13f48d3970531225d5fb6c1434a126cfd6ba80b8f6dda08b3e3629ed12f7bbb45f45148f8544f0a8eb70c849260916eb62baa1bd850e082ad69ca5817594e8f26f63a1909ff03f5696b7a52f146af246c0c6485ea5826c89471c04fd6c373e9d0fef06f4a7b01400962ebfa4ef4166dc895619864accfef9a4be874111cb333518b33a3a2565d032a2434931a16e000d01e35317338ddbc48317517367603697a225d81fc63fcc7d4b8463bbd24910b4972375a995e13baa148b644993b9a7bd706ae64da00f898599957e406c1ab15fd44b6e85b41d47ffaec8136a5dadab324cb0ce95c738a1f8d246af90d98a68b8ab7003d74aa29591b58ca7b2dc38f21f4cfbc04f2e239728e1350b0f074293a13970b264bee368ff98c6960a805346c19702983d3ddfb6306f24cc7f8224e553b0668180787e48ca8e5d851f84df71d5ce6fd7815d39d7e3941b8e0562af98e6e244216bf418d7ca2d9e29ecd3997573b2c4d92aea1a5a82f2272af1218b379ca40a28cc7ce09ad60028a5a6aac6ce145cc3936f89a5d34ba54aeec8d99f84ebf7367fa5fdc12def2294fd3fa3299ba1a59aacc0d7\nTAG: f65b77267d53b2dfc87a936ae08ef7a3f630176553\nTAG_LEN: 20\n\n# DIGEST: e654b4c78e1c0061eea2996fc126c9bfd41eb6d9\nKEY: 3b5a7379a561792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825\nNONCE: 264e977045318c9b\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f43724809\nAD: 74454879c41de9ac9f9823\nCT: 5a1c2b7a8d5bc74901521e1300567f30e2b7755f004ddcfd8fe64f471cbaec4bc6d445ea931bafe6ad78034d0ac1d3916f1e0405c2f2aa4b193c2cd599d34b86029840ad379b136aea5c2a74ea70e22e8c8d1e017a2f7d47f8ebac7b85087075c28d6d2846e357ce031abe09e03629a32cef0b205d631f36ec9a1c9c4e90a80900e01688c7298b99be65f204ebaf312364bfdf57d9e16b0142e879a47b9ae0e96fc62e90883624ee2dc110f3a83ab341f4558f360df399170bbae57cb2eb377a87aaed9755e8057d76609d447a33a8255450504b71439fc0d03e0fffb775019ebf921325b42ef56e1b454b5c87ba5daa1f0d0920e860eea43c913d417cd9e9b6676759a4e2c71b0180b432fe2aab4e4fcffb51b4198ffbedbfcdb4dd4e105847f5a5832e85744f34bf3b9929ffeb177ceb4c5e68585a3ff8fda6569921b3d093a2f1d77e710f78245eacd471af88da8ff8f268293845a9a8550ef34e2bbff9d6cf55b18987c71eb98803bac42b0e6c062015fafb754c6a75f927cac4a8adfcfa8ee05a3f115f1f90d734f78180aec2aa621fa7908d350b0cd8550895cf4b5c3cc75eb95fa574f9a91c1f5efa61f054bedd9267f10a08a21b19e63754de10a1bb0c4ffd8c5c08558882a2f98f1175920a71b981affffde44ae1c9281eee161c4c\nTAG: 28f3243632b13692a2f175644a0e192d8102dd9e2affc5c1\nTAG_LEN: 20\n\n# DIGEST: 654b8591c7f0506261713e9ce7a6fd24a6b9357e\nKEY: 61792c0f3116430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045\nNONCE: 318c9b66262c0f03\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c4\nAD: 1de9ac9f98233b5a7379a5\nCT: 62d0c56ae3e695bafc3cfa3c2d8b9d17ac8ff3b84ccac28d568c1ac84e1574ea06f31605caf86d4e809e39e9c275eed4a8f27eb00dc78e1c10dae719519d949dbc22e00d8644bc3806e54e6531864ae4cb5694002e2a3d7146b39b0b38acadbf1651401805f6394831c608b0478d496cc939b24aa3d3e6d445faceb798a69ae1308a593244645e242829f64f7945d0af8af0eeb6d391c69c2d5bf7b00e42092b36c23362bdd627af43ca7336d88cc36e95ede07b83afb54c8758678d19e0ea7956d8f26776b0f4b6b637c1152853651b6c130f436ffa2d4fd0c344e7583c5e56d6262f43767a1011d8398311dd6e3d7f9e",
     "a89d3eb3f6a1a9cb98905c0761fc5be1d83005fb9ca039b877c30b402743bdf0109ee5de42eef860be676a399a206c08dca8e757f059f7d9611137039b9053430e7d6406abcbf7aed645110aae84f758fcf0d225738cc7c90ace5d83eb9fe65d1e65efa4f6c9d808060cb0f72605e3d7c70e0d13d84689aa1e44aa4dcb152f230d456eb6cf520898bb249262d30c64fde02d6894f72ddff201e4bc41c5fc1f394f2620f764d40098292b04aee45e26812f3abf9a020b5215beb7938e2c121e809ab825d22a2d560bb9bde47572ecb891dd49b38f41af9649dfbdc83ab9bceb444bacdfca2fcbefd623364d4e255e2c0f3164ad92\nTAG: 42174887a9a11a8ac5d1d13e83f8502a3cb0310bbf46b24ff42e3d\nTAG_LEN: 20\n\n# DIGEST: 1eaad32c8d0cefaa5e2c503bb2185a73e6387fac\nKEY: 16430e8b6ea058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b6626\nNONCE: 2c0f0368fe9d0cb7\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98\nAD: 233b5a7379a561792c0f31\nCT: cc269c9aed42c9ba90c768710fa03985372a219f391327e438b1593af29aaf2b66cf8fd60f137d8ce8438a7bcbf7c1c7010c06636f191802daa26fe12ac1c1458baefb2a51fc7361b2d98311c2eaa27e046fffbb76fc855ac01a1321672658e394043367e89478a789d662c88e91642af53824097326d991abd62d1ab818452fc152aa1bd05032027fbb691886d9269937f7f57e214a2186a191b2249ba6fe79b69a94623d85ef0db6b5c2363627ea15a614e6ee42ce0a26a90faaa3ec45451c69c7d472d98b0376a95503b16c6f17eeeb42e0ad5c8775584819aa01309e6071e6b9494da6ddcf992ec6bfc81e0031d74353afa042abfe62fae02792bb6dcae82694cb651689e4039208bf677c90ed6245606cae81732d9d32043e5435f8c40cb76b55a03593dda1271aaccdbc24f18c9a881c77e1dca0e62bfdd36208ee94370b166d66203dfb90c8602dfb48159410840c669c47e7514bf91ef603834bc213173458a87909979b3b77aaa77262e1a634fcb40241818f544f9d207e91ca1f46f77c5c4f606398938f764080dda0978c6b76ce76830a15098870e72b5c9f4975b495d2c5d969688b555773601ad8c857ca8c38565674539fa71a8acadac5415b563f55811b0c010ca1e6793ad08e6c830a0ec2b385402fb8af3b6f0ea0b70b458667953207e4d44f1959\nTAG: ecd2bdb2e683ff8bc7d20482e698ce2b608032094cc2\nTAG_LEN: 20\n\n# DIGEST: 862c0517b3658e9b9cd27db608d49e24e9b4667d\nKEY: a058c4799eea80abde04ee1de13e937af8f1a6944f44d722271233a825264e977045318c9b66262c0f0368fe\nNONCE: 9d0cb746bbd55813\nIN: 936a91d0b5d2c0267218cb7090c6171386d641b87797b684e0fb56f97c3961d8afa22993a340b9b3c589c7481df3f4183aa23fd8d7efd88503f78b8ed1c8e9ba2fd6773e0d0c302a5f47e037446f5891d77df660ed82933f62be8dc55b436965aabe477e0cdd46be99371eb8da7dac997deafd64b1fc65de39f4f03541a11be112a72933c7b54ed4fad0be905d41203f5dce998f8fb2eaad409ae02116417dae0cef457b9e5e16dcc5b6f25607f00d033fb95fb09e4d00d6172e780ab8b700433a957a741c9eb80f2b021b1444769da00fcfab0f5f93b511060c9c5f3aacefe61b184ad2463939ed518ce97c3fdd293d72afc09ffdd4f41963249cd299b92e55ca24d8c078c49f78c7e713710a025cb8b9d71d2989ab33e978c4451e3be585a29a2af12feef71e1063b0b4e6e899200304bd3508132a027d1ff4c047b3ef4f57a74706de4b381c692ef164101b89b476f72b27f06f520c9267cf71408a41729bacb5877e72cdfcfa76aed06707a07c3dab699719fe882eee2fee55ed8b11534c870dc695b814bdf1a87bb1052c6755a7a116bfc9095da49db3d71f4b975c5d503f478b22dc8253bee6fd1b174c307f01be95abaa9bee5857772305daa4b550d75f05d8089850fea3711265bf782610460bfd24ba022e6da12dd4c27f4372480974454879c41de9ac9f98233b5a7379\nAD: a561792c0f3116430e8b6e\nCT: def7eba4397065d05a7a1b742179c1d8eff65e7e4ac18bec49ed020a95497a58af4ce62679a36b77f95f72913c2a58184ea0c3b59b60784bdf63893a2a84f76ab2b6324a218361316971ebb1e2850b6c7baaf9130715580626bf298f60d862cc4b9c4f353a9e4c7536fd697ece9407eb8ad434c97e325cebd5aa0cf4a5342724f2950c8623aa3a5322f2e06a6b1d71a57b22a2f85ed1acacbeba192cb29ced37983e4231bb930c07f7266728c54e8fa9a0b7195975095fd714440e07d63aa87778061a361b4d44f0241a504089b738cdf3a6323b7a709d39637a2c61677c1f034214a4da6471a89425a5cc6040f37261b9a8e55589b2c24a01b4379dfe00ce758e9e617b6d15abcf0974be46d151c5d26e69c50d3fe68d1854b788d6a43e72a00b1602bb9e7557c4c298b99cccaa17fd950123d672978cd359e115eceb88480d59f5496a920949e09d0590283280d78df0ee068c475706701034b5b8686c60e2c4c4d4bafb2dd25c86293d472d195186f3fbaaaa000cf678295143aa290b011ec35e1eb2dcc6ad12593a934b60af7b570bc59569df2e99bf618aaa60e533265e2bfcfe3e01dd1620cd7d6df8b70726b5fa1191b0cdbe627f714744b2bf2abaddf800cc091ce5ee447f2a61ad36094743182ebbe236745bbeb27a946c8d8dba54dd3597fc4328bb3fa5f43371b531bb\nTAG: bcb4795a551fa0b1d147e2c8f70c31f20a60228963076b32bb\nTAG_LEN: 20\n\n",
 };
-static const size_t kLen21 = 116191;
+static const size_t kLen22 = 116191;
 
-static const char *kData21[] = {
+static const char *kData22[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-128-CBC kat_aes/CBCGFSbox128.rsp kat_aes/CBCKeySbox128.rsp kat_aes/CBCVarKey128.rsp kat_aes/CBCVarTxt128.rsp\"\n\n# File 1: kat_aes/CBCGFSbox128.rsp\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: f34481ec3cc627bacd5dc3fb08f273e6\nCiphertext: 0336763e966d92595a567cc9ce537f5e\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 9798c4640bad75c7c3227db910174e72\nCiphertext: a9a1631bf4996954ebc093957b234589\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 96ab5c2ff612d9dfaae8c31f30c42168\nCiphertext: ff4f8391a6a40ca5b25d23bedd44a597\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 6a118a874519e64e9963798a503f1d35\nCiphertext: dc43be40be0e53712f7e2bf5ca707209\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: cb9fceec81286ca3e989bd979b0cb284\nCiphertext: 92beedab1895a94faa69b632e5cc47ce\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: b26aeb1874e47ca8358ff22378f09144\nCiphertext: 459264f4798f6a78bacb89c15ed3d601\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 58c8e00b2631686d54eab84b91f0aca1\nCiphertext: 08a4e2efec8a8e3312ca7460b9040bbf\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0336763e966d92595a567cc9ce537f5e\nPlaintext: f34481ec3cc627bacd5dc3fb08f273e6\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a9a1631bf4996954ebc093957b234589\nPlaintext: 9798c4640bad75c7c3227db910174e72\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ff4f8391a6a40ca5b25d23bedd44a597\nPlaintext: 96ab5c2ff612d9dfaae8c31f30c42168\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: dc43be40be0e53712f7e2bf5ca707209\nPlaintext: 6a118a874519e64e9963798a503f1d35\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 92beedab1895a94faa69b632e5cc47ce\nPlaintext: cb9fceec81286ca3e989bd979b0cb284\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 459264f4798f6a78bacb89c15ed3d601\nPlaintext: b26aeb1874e47ca8358ff22378f09144\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 08a4e2efec8a8e3312ca7460b9040bbf\nPlaintext: 58c8e00b2631686d54eab84b91f0aca1\n\n# File 2: kat_aes/CBCKeySbox128.rsp\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 10a58869d74be5a374cf867cfb473859\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6d251e6944b051e04eaa6fb4dbf78465\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: caea65cdbb75e9169ecd22ebe6e54675\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6e29201190152df4ee058139def610bb\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: a2e2fa9baf7d20822ca9f0542f764a41\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c3b44b95d9d2f25670eee9a0de099fa3\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: b6364ac4e1de1e285eaf144a2415f7a0\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5d9b05578fc944b3cf1ccf0e746cd581\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 64cf9c7abc50b888af65f49d521944b2\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f7efc89d5dba578104016ce5ad659c05\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 47d6742eefcc0465dc96355e851b64d9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0306194f666d183624aa230a8b264ae7\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 3eb39790678c56bee34bbcdeccf6cdb5\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 858075d536d79ccee571f7d7204b1f67\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 64110a924f0743d500ccadae72c13427\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 35870c6a57e9e92314bcb8087cde72ce\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 18d8126516f8a12ab1a36d9f04d68e51\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6c68e9be5ec41e22c825b7c7affb4363\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: f530357968578480b398a3c251cd1093\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f5df39990fc688f1b07224cc03e86cea\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: da84367f325d42d601b4326964802e8e\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: bba071bcb470f8f6586e5d3add18bc66\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: e37b1c6aa2846f6fdb413f238b089f23\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 6c002b682483e0cabcc731c253be5674\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3580d19cff44f1014a7c966a69059de5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 143ae8ed6555aba96110ab58893a8ae1\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 806da864dd29d48deafbe764f8202aef\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: b69418a85332240dc82492353956ae0c\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a303d940ded8f0baff6f75414cac5243\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 71b5c08a1993e1362e4d0ce9b22b78d5\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c2dabd117f8a3ecabfbb11d12194d9d0\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: e234cdca2606b81f29408d5f6da21206\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fff60a4740086b3b9c56195b98d91a7b\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 13237c49074a3da078dc1d828bb78c6f\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8146a08e2357f0caa30ca8c94d1a0544\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 3071a2a48fe6cbd04f1a129098e308f8\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4b98e06d356deb07ebb824e5713f7be3\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 90f42ec0f68385f2ffc5dfc03a654dce\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7a20a53d460fc9ce0423a7a0764c6cf2\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: febd9a24d8b65c1c787d50a4ed3619a9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f4a70d8af877f9b02b4c40df57d45b17\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 10a58869d74be5a374cf867cfb473859\nIV: 00000000000000000000000000000000\nCiphertext: 6d251e6944b051e04eaa6fb4dbf78465\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: caea65cdbb75e9169ecd22ebe6e54675\nIV: 00000000000000000000000000000000\nCiphertext: 6e29201190152df4ee058139def610bb\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: a2e2fa9baf7d20822ca9f0542f764a41\nIV: 00000000000000000000000000000000\nCiphertext: c3b44b95d9d2f25670eee9a0de099fa3\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: b6364ac4e1de1e285eaf144a2415f7a0\nIV: 00000000000000000000000000000000\nCiphertext: 5d9b05578fc944b3cf1ccf0e746cd581\nPlaintext: 00000000000000000000000",
     "000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 64cf9c7abc50b888af65f49d521944b2\nIV: 00000000000000000000000000000000\nCiphertext: f7efc89d5dba578104016ce5ad659c05\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 47d6742eefcc0465dc96355e851b64d9\nIV: 00000000000000000000000000000000\nCiphertext: 0306194f666d183624aa230a8b264ae7\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 3eb39790678c56bee34bbcdeccf6cdb5\nIV: 00000000000000000000000000000000\nCiphertext: 858075d536d79ccee571f7d7204b1f67\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 64110a924f0743d500ccadae72c13427\nIV: 00000000000000000000000000000000\nCiphertext: 35870c6a57e9e92314bcb8087cde72ce\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 18d8126516f8a12ab1a36d9f04d68e51\nIV: 00000000000000000000000000000000\nCiphertext: 6c68e9be5ec41e22c825b7c7affb4363\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: f530357968578480b398a3c251cd1093\nIV: 00000000000000000000000000000000\nCiphertext: f5df39990fc688f1b07224cc03e86cea\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: da84367f325d42d601b4326964802e8e\nIV: 00000000000000000000000000000000\nCiphertext: bba071bcb470f8f6586e5d3add18bc66\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: e37b1c6aa2846f6fdb413f238b089f23\nIV: 00000000000000000000000000000000\nCiphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 6c002b682483e0cabcc731c253be5674\nIV: 00000000000000000000000000000000\nCiphertext: 3580d19cff44f1014a7c966a69059de5\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 143ae8ed6555aba96110ab58893a8ae1\nIV: 00000000000000000000000000000000\nCiphertext: 806da864dd29d48deafbe764f8202aef\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: b69418a85332240dc82492353956ae0c\nIV: 00000000000000000000000000000000\nCiphertext: a303d940ded8f0baff6f75414cac5243\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 71b5c08a1993e1362e4d0ce9b22b78d5\nIV: 00000000000000000000000000000000\nCiphertext: c2dabd117f8a3ecabfbb11d12194d9d0\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: e234cdca2606b81f29408d5f6da21206\nIV: 00000000000000000000000000000000\nCiphertext: fff60a4740086b3b9c56195b98d91a7b\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 13237c49074a3da078dc1d828bb78c6f\nIV: 00000000000000000000000000000000\nCiphertext: 8146a08e2357f0caa30ca8c94d1a0544\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 3071a2a48fe6cbd04f1a129098e308f8\nIV: 00000000000000000000000000000000\nCiphertext: 4b98e06d356deb07ebb824e5713f7be3\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 90f42ec0f68385f2ffc5dfc03a654dce\nIV: 00000000000000000000000000000000\nCiphertext: 7a20a53d460fc9ce0423a7a0764c6cf2\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: febd9a24d8b65c1c787d50a4ed3619a9\nIV: 00000000000000000000000000000000\nCiphertext: f4a70d8af877f9b02b4c40df57d45b17\nPlaintext: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey128.rsp\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: 80000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0edd33d3c621e546455bd8ba1418bec8\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: c0000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4bc3f883450c113c64ca42e1112a9e87\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: e0000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 72a1da770f5d7ac4c9ef94d822affd97\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: f0000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 970014d634e2b7650777e8e84d03ccd8\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: f8000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f17e79aed0db7e279e955b5f493875a7\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fc000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9ed5a75136a940d0963da379db4af26a\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fe000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c4295f83465c7755e8fa364bac6a7ea5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ff000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b1d758256b28fd850ad4944208cf1155\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ff800000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 42ffb34c743de4d88ca38011c990890b\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffc00000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9958f0ecea8b2172c0c1995f9182c0f3\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffe00000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 956d7798fac20f82a8823f984d06f7f5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fff00000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a01bf44f2d16be928ca44aaf7b9b106b\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fff80000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b5f1a33e50d40d103764c76bd4c6b6f8\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffc0000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2637050c9fc0d4817e2d69de878aee8d\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffe0000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 113ecbe4a453269a0dd26069467fb5b5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffff0000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 97d0754fe68f11b9e375d070a608c884\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffff8000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c6a0b3e998d05068a5399778405200b4\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffc000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: df556a33438db87bc41b1752c55e5e49\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffe000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 90fb128d3a1af6e548521bb962bf1f05\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffff000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 26298e9c1db517c215fadfb7d2a8d691\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffff800000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a6cb761d61f8292d0df393a279ad0380\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffc00000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 12acd89b13cd5f8726e34d44fd486108\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffe00000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 95b1703fc57ba09fe0c",
     "3580febdd7ed4\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffff00000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: de11722d893e9f9121c381becc1da59a\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffff80000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6d114ccb27bf391012e8974c546d9bf2\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffc0000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5ce37e17eb4646ecfac29b9cc38d9340\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffe0000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 18c1b6e2157122056d0243d8a165cddb\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffff0000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 99693e6a59d1366c74d823562d7e1431\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffff8000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6c7c64dc84a8bba758ed17eb025a57e3\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffc000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e17bc79f30eaab2fac2cbbe3458d687a\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffe000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1114bc2028009b923f0b01915ce5e7c4\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffff000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9c28524a16a1e1c1452971caa8d13476\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffff800000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ed62e16363638360fdd6ad62112794f0\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffc00000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5a8688f0b2a2c16224c161658ffd4044\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffe00000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 23f710842b9bb9c32f26648c786807ca\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffff00000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 44a98bf11e163f632c47ec6a49683a89\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffff80000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0f18aff94274696d9b61848bd50ac5e5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffc0000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 82408571c3e2424540207f833b6dda69\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffe0000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 303ff996947f0c7d1f43c8f3027b9b75\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffff0000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7df4daf4ad29a3615a9b6ece5c99518a\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffff8000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c72954a48d0774db0b4971c526260415\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffc000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1df9b76112dc6531e07d2cfda04411f0\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffe000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8e4d8e699119e1fc87545a647fb1d34f\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffff000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e6c4807ae11f36f091c57d9fb68548d1\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffff800000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8ebf73aad49c82007f77a5c1ccec6ab4\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffc00000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4fb288cc2040049001d2c7585ad123fc\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffe00000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 04497110efb9dceb13e2b13fb4465564\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffff00000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 75550e6cb5a88e49634c9ab69eda0430\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffff80000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b6768473ce9843ea66a81405dd50b345\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffc0000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cb2f430383f9084e03a653571e065de6\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffe0000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ff4e66c07bae3e79fb7d210847a3b0ba\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffff0000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7b90785125505fad59b13c186dd66ce3\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffff8000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8b527a6aebdaec9eaef8eda2cb7783e5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffc000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 43fdaf53ebbc9880c228617d6a9b548b\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffe000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 53786104b9744b98f052c46f1c850d0b\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffff000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b5ab3013dd1e61df06cbaf34ca2aee78\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffff800000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7470469be9723030fdcc73a8cd4fbb10\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffffc00000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a35a63f5343ebe9ef8167bcb48ad122e\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: ffffffffffffffe00000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fd8687f0757a210e9fdf181204c30863\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffff00000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7a181e84bd5457d26a88fbae96018fb0\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffff80000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 653317b9362b6f9b9e1a580e68d494b5\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffffc0000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 995c9dc0b689f03c45867b5faa5c18d1\n\nCipher: AES-128-CBC\nOperation: ENCRYPT\nKey: fffffffffffffffe0000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 77a4d96d56dda398b9aabecfc75729fd\n\nCipher: AES-128-C",
@@ -753,9 +774,9 @@
     "0000000000000000\nCiphertext: b87c921b91829ef3b13ca541ee1130a6\nPlaintext: ffffffffffffffffffff800000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2e65eb6b6ea383e109accce8326b0393\nPlaintext: ffffffffffffffffffffc00000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9ca547f7439edc3e255c0f4d49aa8990\nPlaintext: ffffffffffffffffffffe00000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a5e652614c9300f37816b1f9fd0c87f9\nPlaintext: fffffffffffffffffffff00000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 14954f0b4697776f44494fe458d814ed\nPlaintext: fffffffffffffffffffff80000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7\nPlaintext: fffffffffffffffffffffc0000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: db7e1932679fdd99742aab04aa0d5a80\nPlaintext: fffffffffffffffffffffe0000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4c6a1c83e568cd10f27c2d73ded19c28\nPlaintext: ffffffffffffffffffffff0000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 90ecbe6177e674c98de412413f7ac915\nPlaintext: ffffffffffffffffffffff8000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 90684a2ac55fe1ec2b8ebd5622520b73\nPlaintext: ffffffffffffffffffffffc000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7472f9a7988607ca79707795991035e6\nPlaintext: ffffffffffffffffffffffe000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 56aff089878bf3352f8df172a3ae47d8\nPlaintext: fffffffffffffffffffffff000000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 65c0526cbe40161b8019a2a3171abd23\nPlaintext: fffffffffffffffffffffff800000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 377be0be33b4e3e310b4aabda173f84f\nPlaintext: fffffffffffffffffffffffc00000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9402e9aa6f69de6504da8d20c4fcaa2f\nPlaintext: fffffffffffffffffffffffe00000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 123c1f4af313ad8c2ce648b2e71fb6e1\nPlaintext: ffffffffffffffffffffffff00000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1ffc626d30203dcdb0019fb80f726cf4\nPlaintext: ffffffffffffffffffffffff80000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 76da1fbe3a50728c50fd2e621b5ad885\nPlaintext: ffffffffffffffffffffffffc0000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 082eb8be35f442fb52668e16a591d1d6\nPlaintext: ffffffffffffffffffffffffe0000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e656f9ecf5fe27ec3e4a73d00c282fb3\nPlaintext: fffffffffffffffffffffffff0000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2ca8209d63274cd9a29bb74bcd77683a\nPlaintext: fffffffffffffffffffffffff8000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 79bf5dce14bb7dd73a8e3611de7ce026\nPlaintext: fffffffffffffffffffffffffc000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3c849939a5d29399f344c4a0eca8a576\nPlaintext: fffffffffffffffffffffffffe000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ed3c0a94d59bece98835da7aa4f07ca2\nPlaintext: ffffffffffffffffffffffffff000000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 63919ed4ce10196438b6ad09d99cd795\nPlaintext: ffffffffffffffffffffffffff800000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7678f3a833f19fea95f3c6029e2bc610\nPlaintext: ffffffffffffffffffffffffffc00000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3aa426831067d36b92be7c5f81c13c56\nPlaintext: ffffffffffffffffffffffffffe00000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9272e2d2cdd11050998c845077a30ea0\nPlaintext: fffffffffffffffffffffffffff00000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 088c4b53f5ec0ff814c19adae7f6246c\nPlaintext: fffffffffffffffffffffffffff80000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4010a5e401fdf0a0354ddbcc0d012b17\nPlaintext: fffffffffffffffffffffffffffc0000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a87a385736c0a6189bd6589bd8445a93\nPlaintext: fffffffffffffffffffffffffffe0000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 545f2b83d9616dccf60fa9830e9cd287\nPlaintext: ffffffffffffffffffffffffffff0000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4b706f7f92406352394037a6d4f4688d\nPlaintext: ffffffffffffffffffffffffffff8000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b7972b3941c44b90afa7b264bfba7387\nPlaintext: ffffffffffffffffffffffffffffc000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6f45732cf10881546f0fd23896d2bb60\nPlaintext: ffffffffffffffffffffffffffffe000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2e3579ca15af27f64b3c955a5bfc30ba\nPlaintext: fffffffffffffffffffffffffffff000\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 34a2c5a91ae2aec99b7d1b5fa6780447\nPlaintext: fffffffffffffffffffffffffffff800\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a4d6616bd04f87335b0e53351227a9ee\nPlaintext: fffffffffffffffffffffffffffffc00\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7f692b03945867d16179a8cefc83ea3f\nPlaintext: fffffffffffffffffffffffffffffe00\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3bd141ee84a0e6414a26e7a4f281f8a2\nPlaintext: ffffffffffffffffffffffffffffff00\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d17",
     "88f572d98b2b16ec5d5f3922b99bc\nPlaintext: ffffffffffffffffffffffffffffff80\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0833ff6f61d98a57b288e8c3586b85a6\nPlaintext: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8568261797de176bf0b43becc6285afb\nPlaintext: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07\nPlaintext: fffffffffffffffffffffffffffffff0\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8ade895913685c67c5269f8aae42983e\nPlaintext: fffffffffffffffffffffffffffffff8\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0\nPlaintext: fffffffffffffffffffffffffffffffc\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5c005e72c1418c44f569f2ea33ba54f3\nPlaintext: fffffffffffffffffffffffffffffffe\n\nCipher: AES-128-CBC\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3f5b8cc9ea855a0afa7347d23e8d664e\nPlaintext: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen22 = 116210;
+static const size_t kLen23 = 116210;
 
-static const char *kData22[] = {
+static const char *kData23[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-128-CTR -swap-iv-plaintext kat_aes/CBCGFSbox128.rsp kat_aes/CBCKeySbox128.rsp kat_aes/CBCVarKey128.rsp kat_aes/CBCVarTxt128.rsp\"\n\n# File 1: kat_aes/CBCGFSbox128.rsp\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: f34481ec3cc627bacd5dc3fb08f273e6\nCiphertext: 0336763e966d92595a567cc9ce537f5e\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 9798c4640bad75c7c3227db910174e72\nCiphertext: a9a1631bf4996954ebc093957b234589\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 96ab5c2ff612d9dfaae8c31f30c42168\nCiphertext: ff4f8391a6a40ca5b25d23bedd44a597\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 6a118a874519e64e9963798a503f1d35\nCiphertext: dc43be40be0e53712f7e2bf5ca707209\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: cb9fceec81286ca3e989bd979b0cb284\nCiphertext: 92beedab1895a94faa69b632e5cc47ce\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: b26aeb1874e47ca8358ff22378f09144\nCiphertext: 459264f4798f6a78bacb89c15ed3d601\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 58c8e00b2631686d54eab84b91f0aca1\nCiphertext: 08a4e2efec8a8e3312ca7460b9040bbf\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0336763e966d92595a567cc9ce537f5e\nIV: f34481ec3cc627bacd5dc3fb08f273e6\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a9a1631bf4996954ebc093957b234589\nIV: 9798c4640bad75c7c3227db910174e72\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ff4f8391a6a40ca5b25d23bedd44a597\nIV: 96ab5c2ff612d9dfaae8c31f30c42168\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: dc43be40be0e53712f7e2bf5ca707209\nIV: 6a118a874519e64e9963798a503f1d35\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 92beedab1895a94faa69b632e5cc47ce\nIV: cb9fceec81286ca3e989bd979b0cb284\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 459264f4798f6a78bacb89c15ed3d601\nIV: b26aeb1874e47ca8358ff22378f09144\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 08a4e2efec8a8e3312ca7460b9040bbf\nIV: 58c8e00b2631686d54eab84b91f0aca1\n\n# File 2: kat_aes/CBCKeySbox128.rsp\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 10a58869d74be5a374cf867cfb473859\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6d251e6944b051e04eaa6fb4dbf78465\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: caea65cdbb75e9169ecd22ebe6e54675\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6e29201190152df4ee058139def610bb\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: a2e2fa9baf7d20822ca9f0542f764a41\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c3b44b95d9d2f25670eee9a0de099fa3\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: b6364ac4e1de1e285eaf144a2415f7a0\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5d9b05578fc944b3cf1ccf0e746cd581\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 64cf9c7abc50b888af65f49d521944b2\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f7efc89d5dba578104016ce5ad659c05\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 47d6742eefcc0465dc96355e851b64d9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0306194f666d183624aa230a8b264ae7\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 3eb39790678c56bee34bbcdeccf6cdb5\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 858075d536d79ccee571f7d7204b1f67\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 64110a924f0743d500ccadae72c13427\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 35870c6a57e9e92314bcb8087cde72ce\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 18d8126516f8a12ab1a36d9f04d68e51\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6c68e9be5ec41e22c825b7c7affb4363\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: f530357968578480b398a3c251cd1093\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f5df39990fc688f1b07224cc03e86cea\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: da84367f325d42d601b4326964802e8e\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: bba071bcb470f8f6586e5d3add18bc66\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: e37b1c6aa2846f6fdb413f238b089f23\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 6c002b682483e0cabcc731c253be5674\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3580d19cff44f1014a7c966a69059de5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 143ae8ed6555aba96110ab58893a8ae1\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 806da864dd29d48deafbe764f8202aef\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: b69418a85332240dc82492353956ae0c\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a303d940ded8f0baff6f75414cac5243\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 71b5c08a1993e1362e4d0ce9b22b78d5\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c2dabd117f8a3ecabfbb11d12194d9d0\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: e234cdca2606b81f29408d5f6da21206\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fff60a4740086b3b9c56195b98d91a7b\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 13237c49074a3da078dc1d828bb78c6f\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8146a08e2357f0caa30ca8c94d1a0544\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 3071a2a48fe6cbd04f1a129098e308f8\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4b98e06d356deb07ebb824e5713f7be3\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 90f42ec0f68385f2ffc5dfc03a654dce\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7a20a53d460fc9ce0423a7a0764c6cf2\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: febd9a24d8b65c1c787d50a4ed3619a9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f4a70d8af877f9b02b4c40df57d45b17\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 10a58869d74be5a374cf867cfb473859\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6d251e6944b051e04eaa6fb4dbf78465\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: caea65cdbb75e9169ecd22ebe6e54675\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6e29201190152df4ee058139def610bb\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: a2e2fa9baf7d20822ca9f0542f764a41\nPlaintext: 00000000000000000000000000000000\nCiphertext: c3b44b95d9d2f25670eee9a0de099fa3\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: b6364ac4e1de1e285eaf144a2415f7a0\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5d9b05578fc944b3cf1ccf0e746cd581\nIV: 0000",
     "0000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 64cf9c7abc50b888af65f49d521944b2\nPlaintext: 00000000000000000000000000000000\nCiphertext: f7efc89d5dba578104016ce5ad659c05\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 47d6742eefcc0465dc96355e851b64d9\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0306194f666d183624aa230a8b264ae7\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 3eb39790678c56bee34bbcdeccf6cdb5\nPlaintext: 00000000000000000000000000000000\nCiphertext: 858075d536d79ccee571f7d7204b1f67\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 64110a924f0743d500ccadae72c13427\nPlaintext: 00000000000000000000000000000000\nCiphertext: 35870c6a57e9e92314bcb8087cde72ce\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 18d8126516f8a12ab1a36d9f04d68e51\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6c68e9be5ec41e22c825b7c7affb4363\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: f530357968578480b398a3c251cd1093\nPlaintext: 00000000000000000000000000000000\nCiphertext: f5df39990fc688f1b07224cc03e86cea\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: da84367f325d42d601b4326964802e8e\nPlaintext: 00000000000000000000000000000000\nCiphertext: bba071bcb470f8f6586e5d3add18bc66\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: e37b1c6aa2846f6fdb413f238b089f23\nPlaintext: 00000000000000000000000000000000\nCiphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 6c002b682483e0cabcc731c253be5674\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3580d19cff44f1014a7c966a69059de5\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 143ae8ed6555aba96110ab58893a8ae1\nPlaintext: 00000000000000000000000000000000\nCiphertext: 806da864dd29d48deafbe764f8202aef\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: b69418a85332240dc82492353956ae0c\nPlaintext: 00000000000000000000000000000000\nCiphertext: a303d940ded8f0baff6f75414cac5243\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 71b5c08a1993e1362e4d0ce9b22b78d5\nPlaintext: 00000000000000000000000000000000\nCiphertext: c2dabd117f8a3ecabfbb11d12194d9d0\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: e234cdca2606b81f29408d5f6da21206\nPlaintext: 00000000000000000000000000000000\nCiphertext: fff60a4740086b3b9c56195b98d91a7b\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 13237c49074a3da078dc1d828bb78c6f\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8146a08e2357f0caa30ca8c94d1a0544\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 3071a2a48fe6cbd04f1a129098e308f8\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4b98e06d356deb07ebb824e5713f7be3\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 90f42ec0f68385f2ffc5dfc03a654dce\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7a20a53d460fc9ce0423a7a0764c6cf2\nIV: 00000000000000000000000000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: febd9a24d8b65c1c787d50a4ed3619a9\nPlaintext: 00000000000000000000000000000000\nCiphertext: f4a70d8af877f9b02b4c40df57d45b17\nIV: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey128.rsp\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: 80000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0edd33d3c621e546455bd8ba1418bec8\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: c0000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4bc3f883450c113c64ca42e1112a9e87\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: e0000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 72a1da770f5d7ac4c9ef94d822affd97\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: f0000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 970014d634e2b7650777e8e84d03ccd8\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: f8000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f17e79aed0db7e279e955b5f493875a7\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fc000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9ed5a75136a940d0963da379db4af26a\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fe000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c4295f83465c7755e8fa364bac6a7ea5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ff000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b1d758256b28fd850ad4944208cf1155\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ff800000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 42ffb34c743de4d88ca38011c990890b\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffc00000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9958f0ecea8b2172c0c1995f9182c0f3\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffe00000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 956d7798fac20f82a8823f984d06f7f5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fff00000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a01bf44f2d16be928ca44aaf7b9b106b\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fff80000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b5f1a33e50d40d103764c76bd4c6b6f8\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffc0000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2637050c9fc0d4817e2d69de878aee8d\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffe0000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 113ecbe4a453269a0dd26069467fb5b5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffff0000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 97d0754fe68f11b9e375d070a608c884\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffff8000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c6a0b3e998d05068a5399778405200b4\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffc000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: df556a33438db87bc41b1752c55e5e49\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffe000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 90fb128d3a1af6e548521bb962bf1f05\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffff000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 26298e9c1db517c215fadfb7d2a8d691\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffff800000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a6cb761d61f8292d0df393a279ad0380\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffc00000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 12acd89b13cd5f8726e34d44fd486108\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffe00000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ",
     "95b1703fc57ba09fe0c3580febdd7ed4\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffff00000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: de11722d893e9f9121c381becc1da59a\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffff80000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6d114ccb27bf391012e8974c546d9bf2\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffc0000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5ce37e17eb4646ecfac29b9cc38d9340\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffe0000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 18c1b6e2157122056d0243d8a165cddb\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffff0000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 99693e6a59d1366c74d823562d7e1431\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffff8000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6c7c64dc84a8bba758ed17eb025a57e3\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffc000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e17bc79f30eaab2fac2cbbe3458d687a\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffe000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1114bc2028009b923f0b01915ce5e7c4\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffff000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9c28524a16a1e1c1452971caa8d13476\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffff800000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ed62e16363638360fdd6ad62112794f0\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffc00000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5a8688f0b2a2c16224c161658ffd4044\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffe00000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 23f710842b9bb9c32f26648c786807ca\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffff00000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 44a98bf11e163f632c47ec6a49683a89\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffff80000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0f18aff94274696d9b61848bd50ac5e5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffc0000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 82408571c3e2424540207f833b6dda69\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffe0000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 303ff996947f0c7d1f43c8f3027b9b75\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffff0000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7df4daf4ad29a3615a9b6ece5c99518a\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffff8000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c72954a48d0774db0b4971c526260415\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffc000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1df9b76112dc6531e07d2cfda04411f0\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffe000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8e4d8e699119e1fc87545a647fb1d34f\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffff000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e6c4807ae11f36f091c57d9fb68548d1\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffff800000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8ebf73aad49c82007f77a5c1ccec6ab4\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffc00000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4fb288cc2040049001d2c7585ad123fc\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffe00000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 04497110efb9dceb13e2b13fb4465564\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffff00000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 75550e6cb5a88e49634c9ab69eda0430\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffff80000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b6768473ce9843ea66a81405dd50b345\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffc0000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cb2f430383f9084e03a653571e065de6\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffe0000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ff4e66c07bae3e79fb7d210847a3b0ba\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffff0000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7b90785125505fad59b13c186dd66ce3\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffff8000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8b527a6aebdaec9eaef8eda2cb7783e5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffc000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 43fdaf53ebbc9880c228617d6a9b548b\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffe000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 53786104b9744b98f052c46f1c850d0b\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffff000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b5ab3013dd1e61df06cbaf34ca2aee78\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffff800000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7470469be9723030fdcc73a8cd4fbb10\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffffc00000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a35a63f5343ebe9ef8167bcb48ad122e\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: ffffffffffffffe00000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fd8687f0757a210e9fdf181204c30863\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffff00000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7a181e84bd5457d26a88fbae96018fb0\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffff80000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 653317b9362b6f9b9e1a580e68d494b5\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffffc0000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 995c9dc0b689f03c45867b5faa5c18d1\n\nCipher: AES-128-CTR\nOperation: ENCRYPT\nKey: fffffffffffffffe0000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 77a4d96d56dda398b9aabecfc75729fd",
@@ -772,9 +793,9 @@
     "laintext: 00000000000000000000000000000000\nCiphertext: b87c921b91829ef3b13ca541ee1130a6\nIV: ffffffffffffffffffff800000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2e65eb6b6ea383e109accce8326b0393\nIV: ffffffffffffffffffffc00000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9ca547f7439edc3e255c0f4d49aa8990\nIV: ffffffffffffffffffffe00000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a5e652614c9300f37816b1f9fd0c87f9\nIV: fffffffffffffffffffff00000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 14954f0b4697776f44494fe458d814ed\nIV: fffffffffffffffffffff80000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7\nIV: fffffffffffffffffffffc0000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: db7e1932679fdd99742aab04aa0d5a80\nIV: fffffffffffffffffffffe0000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4c6a1c83e568cd10f27c2d73ded19c28\nIV: ffffffffffffffffffffff0000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 90ecbe6177e674c98de412413f7ac915\nIV: ffffffffffffffffffffff8000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 90684a2ac55fe1ec2b8ebd5622520b73\nIV: ffffffffffffffffffffffc000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7472f9a7988607ca79707795991035e6\nIV: ffffffffffffffffffffffe000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 56aff089878bf3352f8df172a3ae47d8\nIV: fffffffffffffffffffffff000000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 65c0526cbe40161b8019a2a3171abd23\nIV: fffffffffffffffffffffff800000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 377be0be33b4e3e310b4aabda173f84f\nIV: fffffffffffffffffffffffc00000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9402e9aa6f69de6504da8d20c4fcaa2f\nIV: fffffffffffffffffffffffe00000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 123c1f4af313ad8c2ce648b2e71fb6e1\nIV: ffffffffffffffffffffffff00000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1ffc626d30203dcdb0019fb80f726cf4\nIV: ffffffffffffffffffffffff80000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 76da1fbe3a50728c50fd2e621b5ad885\nIV: ffffffffffffffffffffffffc0000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 082eb8be35f442fb52668e16a591d1d6\nIV: ffffffffffffffffffffffffe0000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e656f9ecf5fe27ec3e4a73d00c282fb3\nIV: fffffffffffffffffffffffff0000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2ca8209d63274cd9a29bb74bcd77683a\nIV: fffffffffffffffffffffffff8000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 79bf5dce14bb7dd73a8e3611de7ce026\nIV: fffffffffffffffffffffffffc000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3c849939a5d29399f344c4a0eca8a576\nIV: fffffffffffffffffffffffffe000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ed3c0a94d59bece98835da7aa4f07ca2\nIV: ffffffffffffffffffffffffff000000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 63919ed4ce10196438b6ad09d99cd795\nIV: ffffffffffffffffffffffffff800000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7678f3a833f19fea95f3c6029e2bc610\nIV: ffffffffffffffffffffffffffc00000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3aa426831067d36b92be7c5f81c13c56\nIV: ffffffffffffffffffffffffffe00000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9272e2d2cdd11050998c845077a30ea0\nIV: fffffffffffffffffffffffffff00000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 088c4b53f5ec0ff814c19adae7f6246c\nIV: fffffffffffffffffffffffffff80000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4010a5e401fdf0a0354ddbcc0d012b17\nIV: fffffffffffffffffffffffffffc0000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a87a385736c0a6189bd6589bd8445a93\nIV: fffffffffffffffffffffffffffe0000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 545f2b83d9616dccf60fa9830e9cd287\nIV: ffffffffffffffffffffffffffff0000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4b706f7f92406352394037a6d4f4688d\nIV: ffffffffffffffffffffffffffff8000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b7972b3941c44b90afa7b264bfba7387\nIV: ffffffffffffffffffffffffffffc000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6f45732cf10881546f0fd23896d2bb60\nIV: ffffffffffffffffffffffffffffe000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2e3579ca15af27f64b3c955a5bfc30ba\nIV: fffffffffffffffffffffffffffff000\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 34a2c5a91ae2aec99b7d1b5fa6780447\nIV: fffffffffffffffffffffffffffff800\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a4d6616bd04f87335b0e53351227a9ee\nIV: fffffffffffffffffffffffffffffc00\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7f692b03945867d16179a8cefc83ea3f\nIV: fffffffffffffffffffffffffffffe00\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3bd141ee84a0e6414a26e7a4f281f8a2\nIV: ffffffffffffffffffffffffffffff00\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 0000000000000000000000",
     "0000000000\nCiphertext: d1788f572d98b2b16ec5d5f3922b99bc\nIV: ffffffffffffffffffffffffffffff80\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0833ff6f61d98a57b288e8c3586b85a6\nIV: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8568261797de176bf0b43becc6285afb\nIV: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07\nIV: fffffffffffffffffffffffffffffff0\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8ade895913685c67c5269f8aae42983e\nIV: fffffffffffffffffffffffffffffff8\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0\nIV: fffffffffffffffffffffffffffffffc\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5c005e72c1418c44f569f2ea33ba54f3\nIV: fffffffffffffffffffffffffffffffe\n\nCipher: AES-128-CTR\nOperation: DECRYPT\nKey: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3f5b8cc9ea855a0afa7347d23e8d664e\nIV: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen23 = 5321952;
+static const size_t kLen24 = 5321952;
 
-static const char *kData23[] = {
+static const char *kData24[] = {
     "# Generated by \"make_cavp -cipher gcm kat_gcm/gcmDecrypt128.rsp kat_gcm/gcmEncryptExtIV128.rsp\"\n\n# File 1: kat_gcm/gcmDecrypt128.rsp\n\nKEY: cf063a34d4a9a76c2c86787d3f96db71\nNONCE: 113b9785971864c83b01c787\nCT: \nAD: \nTAG: 72ac8493e3a5228b5d130a69d2510e42\nIN: \n\nKEY: a49a5e26a2f8cb63d05546c2a62f5343\nNONCE: 907763b19b9b4ab6bd4f0281\nCT: \nAD: \nTAG: a2be08210d8c470a8df6e8fbd79ec5cf\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2ad0bf5aeb47a0c1a98da3dfdab4fded\nNONCE: 25f1b6091ee7040fea4ba854\nCT: \nAD: \nTAG: d7963d240317653e01cf5abe5d0966ae\nIN: \n\nKEY: d8cd400a0a73d114cd3ecf36537cab3d\nNONCE: 3c162c9f16a49b8fe6c92a81\nCT: \nAD: \nTAG: 4203aec165f9d397cf9009770a088c16\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a982a7bae2b3eae1b7832f16faf693b4\nNONCE: 78d2d2fa43850483ce933576\nCT: \nAD: \nTAG: ceabb89ee3179e25ed32d5a225006361\nIN: \n\nKEY: f9e3992196f7d7a21bd956f4b5a5ffce\nNONCE: 0794a6bdf5f198c9f193b9ba\nCT: \nAD: \nTAG: f8247fd5dc7bd6d40e96af32aa9c1889\nIN: \n\nKEY: c91aab7ebe13653a71a4232fd1beb793\nNONCE: 7799464b6de6383da0daec52\nCT: \nAD: \nTAG: 00c4f7033f3c05e9d531f3ca573dc98d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e7e4eefd0a3abd4ee1bef270d257eab7\nNONCE: f548f2a04a50a2f0342b2250\nCT: \nAD: \nTAG: 044159b8a18668167fbd28ac500c20fe\nIN: \n\nKEY: 1bd49e553457459aee1b5d83e7c216a2\nNONCE: 2b37cf40ed2685eb2a907cd0\nCT: \nAD: \nTAG: fcb41d17fdb023d4d14f84a387d3ad77\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 4d6486fa68ce5a14b9db7334ab4838cb\nNONCE: afad3f4190d56a1b8eb08e58\nCT: \nAD: \nTAG: 4bda04755b7ce9da020ce7467a5ced8f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: da5b59d5eb448fd6c08c350df9a82114\nNONCE: 15fb65d9fe2fa27f226312c0\nCT: \nAD: \nTAG: e407fccbb9f00eeb9cef4a520cff957c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 07d5a7d405b21c64d74cc0988693b784\nNONCE: 2eefd7990ea025925e9ca6f9\nCT: \nAD: \nTAG: 1439522d18c9eb129f1f776590027761\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 48760dec952010140ffc4b4078438b56\nNONCE: 930cc3ff276d7bbb74d187ef\nCT: \nAD: \nTAG: 8673dcb97934d54dc17de0037344737f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: ed7c50762dc0dc4aa5c8be4cf0a56b88\nNONCE: 50dfb73b5034cffb6709af8f\nCT: \nAD: \nTAG: cb02203ee8eccec446ed1c2cf68fd1c0\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: b5d4b3e80a56adbc780ff02c5da6a7ab\nNONCE: abc5b96c5e872502971dcc55\nCT: \nAD: \nTAG: 4e85677cc16e2b2fb50a2ca9c0ac1b9c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: eac258e99c55e6ae8ef1da26640613d7\nNONCE: 4e8df20faaf2c8eebe922902\nCT: \nAD: \nTAG: e39aeaebe86aa309a4d062d6274339\nIN: \n\nKEY: 3726cf02fcc6b8639a5497652c94350d\nNONCE: 55fef82cde693ce76efcc193\nCT: \nAD: \nTAG: 3d68111a81ed22d2ef5bccac4fc27f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f202299d5fd74f03b12d2119a6c4c038\nNONCE: eec51e7958c3f20a1bb71815\nCT: \nAD: \nTAG: a81886b3fb26e51fca87b267e1e157\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fd52925f39546b4c55ffb6b20c59898c\nNONCE: f5cf3227444afd905a5f6dba\nCT: \nAD: \nTAG: 1665b0f1a0b456e1664cfd3de08ccd\nIN: \n\nKEY: 39c070eaace1c6e30ab004bfbfa830fd\nNONCE: 6e55ff3bba561f17f338313c\nCT: \nAD: \nTAG: 4e3c2db540790f26a4704e72ef9b4f\nIN: \n\nKEY: 96b12ebb99edca96838f88caaa74abbc\nNONCE: 679feb33d6e35962518a63c1\nCT: \nAD: \nTAG: cbe9d90bb8600bb14e8ca81cde5b2e\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5b1a1ad45349cb7ec3afb613674c9381\nNONCE: 7ef3542c0ca2415f767eec7c\nCT: \nAD: \nTAG: fbc65cc7f1f4edbb746b47f950e472\nIN: \n\nKEY: b349f8d86e91144c86ed49a100358239\nNONCE: 3e3879e1a4ccf74cc442b9c5\nCT: \nAD: \nTAG: 0d935691c84813b8c1e5ba23ee621f\nIN: \n\nKEY: df4074001cf89ad0b046fceeea5a1ef2\nNONCE: 080fb68a083a219354a7cdcd\nCT: \nAD: \nTAG: eaa44ef28c446610b33dd2fdbdb8a0\nIN: \n\nKEY: 84816510accb68149ee65be220df3d9e\nNONCE: 99c41452f73f3a2dd48f2eaf\nCT: \nAD: \nTAG: 5d5f3c09d2498587c7230dbe5fd497\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 98740d9ac6cee9379253d4e6718a1de5\nNONCE: b723dd15270c767a31636117\nCT: \nAD: \nTAG: 199630b915021b98055f295d08befc\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 79b8cb97ec3e3f7536eeaffc64bdb372\nNONCE: e945122f1e4d960a2e9f9a41\nCT: \nAD: \nTAG: cb9c041f18070030399006d77954cb\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 26e7fb1c3b5448d7ad7b67aadaf360bb\nNONCE: 34bf017f9283236dee171e10\nCT: \nAD: \nTAG: 8756ca5c8aa644a852e5eb2c49bf39\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d6a515d24ef9099695b179c01bc1f4b1\nNONCE: b54a5bbbf6faae5f33b8c133\nCT: \nAD: \nTAG: 02b1243c92f6b059d00bd672dfb8e5\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9e9ec40db0a07f24c417d3c63d1b946b\nNONCE: 8605c97fa5d8f94798b845f9\nCT: \nAD: \nTAG: 10ce3c41553e7f5b413d1470ced09b\nIN: \n\nKEY: dc1b3fdce56baf77ddb22246ebb224db\nNONCE: 1394643db950ac42366cda3c\nCT: \nAD: \nTAG: 25bfdb151d21994e90b095230247\nIN: \n\nKEY: c1b668ee720eb90730d7c30e663e941b\nNONCE: b8f27f51092d65697a9740de\nCT: \nAD: \nTAG: d6acce523efdb3e7b28220896827\nIN: \n\nKEY: 7a25451203338a3a046902fc5169a9ac\nNONCE: 070a0b0fb560999c6b778aa5\nCT: \nAD: \nTAG: 51d73876b57dea6ef24e2740fc69\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8747e8b9058632721cab00c217e24fca\nNONCE: c44c7bbf8b4a48e2b64c4e41\nCT: \nAD: \nTAG: 2f7fccde59ec9e6ad2cbd6ced7c1\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 79d9e7d647dbe9926ba08f078b2c4768\nNONCE: b7fef625e03c6e97bb7988eb\nCT: \nAD: \nTAG: 8508fe578eacef69d8e1468cc905\nIN: \n\nKEY: 84ade1f350d68ceff9fe8a7ef120e7b6\nNONCE: 7617886bff63257768f54173\nCT: \nAD: \nTAG: 461ecfef2f3b746cc3a47c28a43a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f7a85574fb8be04e92d219cf3524877b\nNONCE: 9a3febc5d2bd389e0db3863c\nCT: \nAD: \nTAG: 69a1d7bbf81f830534312c641068\nIN: \n\nKEY: 18f42b8a3dca6e80777d5c681d8c4a32\nNONCE: ed425811547c5989ea6d4cb2\nCT: \nAD: \nTAG: 60b5712b52b56facc8758aec40c9\nIN: \n\nKEY: adeb972fe5160e14137c286b6e281163\nNONCE: 38e536e647b83fc429bbcabd\nCT: \nAD: \nTAG: 22e32a3c2637ac48c0deaf06435c\nIN: \n\nKEY: 0686f241ca82a590980929858c789d7a\nNONCE: c5d0737448692684c5ac1c8c\nCT: \nAD: \nTAG: 65eecbd0fe423c6e1608745ab677\nIN: \n\nKEY: f7d57c6e4699d4f242270f41781d39dc\nNONCE: a2842a9dd1b5874cb50e8707\nCT: \nAD: \nTAG: 09999cdc3dd28e818b88a6485c8d\nIN: \n\nKEY: 4df05ee5ee95c69938b4049a2be92504\nNONCE: afdefd136622128fd6c2c534\nCT: \nAD: \nTAG: 3a24e5f166d70627954b55029fc3\nIN: \n\nKEY: 0f4469766ea265d22cba4c7105bc49b0\nNONCE: 25ede41ed4c638195354713a\nCT: \nAD: \nTAG: 6dd4e9cc6ed04976f2cced5804b4\nIN: \n\nKEY: 24c7de158fcb0808b3cfda0e95706e6f\nNONCE: 88eb7f00a129040d05952d17\nCT: \nAD: \nTAG: 2d587fd20457566fed19cca36d2b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2610de38144b05876b0d0b34a1c7812e\nNONCE: 6673bf587f9f90df3a1715fd\nCT: \nAD: \nTAG: 7b13fff5e79951ebee51d12f8422\nIN: \n\nKEY: a830c905dad3a8e5aae739d7ab60a5dc\nNONCE: 54633aa565952e80fb0b9869\nCT: \nAD: \nTAG: 482d9381230cd015b2a16976b6\nIN: \n\nKEY: eb7ae9788a5dc09a7812e389c67138ea\nNONCE: 2ecd19b70ffe87cad58a0029\nCT: \nAD: \nTAG: c1ebf4e3594a722bab9f61e084\nIN: \n\nKEY: 9c247b33ffb3fe486f8f1c06b3db6563\nNONCE: 978769bc16a7dd3d90ab9d76\nCT: \nAD: \nTAG: 09acccba7e7be6b5687b478327\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 23281eec6b12fe1184e6c113788915b8\nNONCE: 78538fb690491381daa41ef5\nCT: \nAD: \nTAG: 80d9c8d781035be9f68de209ad\nIN: \n\nKEY: 443657744df4b5d5de80f27efe244b27\nNONCE: a637b48e67d1cf8f3ddf6d7c\nCT: \nAD: \nTAG: bf84664af0260e0b5b352e5cd9\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: b93ae43e8eb3e94b67b09b833e376327\nNONCE: 14ef4f357845d34ce06b170a\nCT: \nAD: \nTAG: 22c987ec9c91ce7714fbb794d8\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 6eff3644c83c75c0678cf4f6713561f7\nNONCE: e7bf04fab5909668065d2b43\nCT: \nAD: \nTAG: 2fab50a07c1a50ba8e4381dad9\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9613b9b4c70e5ab130534309059e99b7\nNONCE: 40414f80b586ecfb22860442\nCT: \nAD: \nTAG: 9cc1a298d9d57b6d4bcdf3e5b5\nIN: \n\nKEY: 400fcee6ea1b8b1fccffdbccef08a5e2\nNONCE: dc16236581a6da126550b08a\nCT: \nAD: \nTAG: 6ceeca2188cf4da42ed3f248df\nIN: \n\nKEY: d27c84466faf1a45a2435eb9293478e2\nNONCE: cdd7e1bdf60bd12885dc8fdc\nCT: \nAD: \nTAG: 5397381a8817ef557ac6c57a22\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8ed40d2b24f52dbf2fa8486c8fde62e9\nNONCE: 837f36e0f6fb34d08e8df9f9\nCT: \nAD: \nTAG: e6c787dfeae37a34dc49d52caa\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 34395d007dac4a4b83c943de4406d821\nNONCE: 4bbfe5f3276461e594b1fd2e\nCT: \nAD: \nTAG: 30daec9c07fa2e11a1acc28baa\nIN: \n\nKEY: 5a8321edf8d532d51299ecbaffc56cbc\nNONCE: c512db4e75e52950f89f458e\nCT: \nAD: \nTAG: 88fddfe667c3519963ebb6d0b7\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d9ed395776deb772a218db03abbd8606\nNONCE: 600075a6d85d86d6a3f6624a\nCT: \nAD: \nTAG: 7f486053d65559dca0a3761e00\nIN: \n\nKEY: 16b5d6282fa184deeb837c706f191079\nNONCE: ea09b0a8f65f3ac16d954c9a\nCT: \nAD: \nTAG: 6defe4a6354e1383111d96fcb3\nIN: \n\nKEY: 4c5a02440befba5820539ccf74b40355\nNONCE: 3852fd7da7a375a2a2227e9c\nCT: \nAD: \nTAG: 9f45b723d14708dad1edd831\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d4e885208426247f27428ede3b318e68\nNONCE: 5513f9ec35e2e72be3470f57\nCT: \nAD: \nTAG: 48d716f0f94ac7fbc291932e\nIN: \n\nKEY: 25954f34970b4fc834fff",
     "1552bea4896\nNONCE: b66b254e66240f0e8e262f01\nCT: \nAD: \nTAG: 5b5569b200c06bd24382ec73\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 303b5662bcf71ca82e07e10248c17629\nNONCE: 45f9c33e03f84fa88209858d\nCT: \nAD: \nTAG: e8b99255a0e953d57361db29\nIN: \n\nKEY: 8394912058620e935335f7627b18b1b3\nNONCE: 772149bd434c0b27ac45e672\nCT: \nAD: \nTAG: c7a43e2ee7e161a52583ad83\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2ca00481ac56aac664b28f29781a7e82\nNONCE: 14574966f3b12bc0502a3a55\nCT: \nAD: \nTAG: 938628eba4b72f79fd7b7396\nIN: \n\nKEY: 8ed5a13a5046d10379c75eaa3fd17bb2\nNONCE: 2b111cc8c84ff7f1c262ec1c\nCT: \nAD: \nTAG: 82e8bed016ae384ae75ac16c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 7041298fe906405905e8b4de1de3c0f0\nNONCE: e4fbdc72d00a331bfa326d59\nCT: \nAD: \nTAG: 17292560680114395372691a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: faeeee9bbaff25e221121d1122807009\nNONCE: e9e872d525c2315f49e2d94f\nCT: \nAD: \nTAG: 98146c72b9365016ff33b7e2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: df0a1dd37c0144e0bcff6e7deed857f0\nNONCE: eba039eaf7f2f48f761abc9c\nCT: \nAD: \nTAG: 973e0ff877b085ad8083d6c9\nIN: \n\nKEY: 27f19b4b2d23285d92480ca2dc3799dc\nNONCE: 335b2f88f2fc4b6188867558\nCT: \nAD: \nTAG: 8b1c43ade7a3c5af9a639e02\nIN: \n\nKEY: 6edf19775190943d196148165087ebe1\nNONCE: c2fcf9919d85407086c2be20\nCT: \nAD: \nTAG: dda2c0cfe5d922a3cfb15ab8\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9acca9099afc2ec75441587bdd96a469\nNONCE: ca178e969478e36621db60df\nCT: \nAD: \nTAG: 86a70322e57fd6cca64a6aa6\nIN: \n\nKEY: d0718716395e03f7fde7fb40f497f9cf\nNONCE: dd20e6b684a0f53d3785df71\nCT: \nAD: \nTAG: 70cfeb7a503a1869fa0dc0ee\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5fcbf7953da6781ae96852885ae01488\nNONCE: 34ca7d2a0aaf09fcb8a5b39a\nCT: \nAD: \nTAG: 142828e093e80e346008c2b6\nIN: \n\nKEY: a958dea10183955fb62b5cf0d6560efd\nNONCE: 9c6fd7fcb79ab149a2ef8416\nCT: \nAD: \nTAG: 0fa19df0ef498402\nIN: \n\nKEY: 2bd8c68da36fc74a66e8bc9c58c7b3d9\nNONCE: 0a0c9cee4e712ce526271644\nCT: \nAD: \nTAG: f94a128bb6c31902\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5f8441de9b68a525bd77a9f8db9ac1ec\nNONCE: 7b704888d905e11b3e8f6751\nCT: \nAD: \nTAG: 1920f39509e495ec\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 47a49ee87638b74b48dfc42b9892ff93\nNONCE: 927f32a1fdeed0da6c80c4c1\nCT: \nAD: \nTAG: 568ca20233ab20e1\nIN: \n\nKEY: 871616dda80c31ef677f770774f41d27\nNONCE: 94f9c4a7f7d69cfef745c085\nCT: \nAD: \nTAG: f779d3356f60d96c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e6a7ce1c109162cc24552b2de8355bd8\nNONCE: b140aa5f0f2312cf7b8696c1\nCT: \nAD: \nTAG: ea5f6c5b9224afcc\nIN: \n\nKEY: a90b62bfba34ca0cfb4d5ccd52ff7369\nNONCE: 5fd3cf7a9a1e2a15ad6a58e2\nCT: \nAD: \nTAG: 6f3dd881088a0b29\nIN: \n\nKEY: 6280067b5626d5d6bf35ab1c903c1d75\nNONCE: 99523c6f792e03276c44ba7a\nCT: \nAD: \nTAG: 3a68ccdb69008d9d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f40b500c70209092efa29a2a7e96ca64\nNONCE: 86d1047059ee2986bd96daf7\nCT: \nAD: \nTAG: c594ea04f674de69\nIN: \n\nKEY: 6cb7829e2295e60036bb967d06116601\nNONCE: 4dfb5fb2ea41fae7653e1438\nCT: \nAD: \nTAG: bb9b39fe673ffd18\nIN: \n\nKEY: 05cd9b0de53c072321ae4a1cdc2cafc3\nNONCE: c869859421df985bbc8c9c62\nCT: \nAD: \nTAG: 0f8ad033a0ae3cb2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fd025400ab17f5e35c3cae3aeed4ebc7\nNONCE: 6c3b7e178df39504d3ca2e31\nCT: \nAD: \nTAG: 5fd986d21ac0bb49\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: c7678eeb06cd24484b81a469c024c3d6\nNONCE: a1fea7d9afd9493a83b5d531\nCT: \nAD: \nTAG: 8c5828f475c4f902\nIN: \n\nKEY: 056c731555048f5831a4c7ba57f9022b\nNONCE: a8a13e93a33807811ed327f6\nCT: \nAD: \nTAG: c2d9d4fb79d675f3\nIN: \n\nKEY: c0395a8391049d30f7e0fa7afd1b0ec4\nNONCE: 381894100b3d786bfca314b7\nCT: \nAD: \nTAG: 2fef77ef639adc00\nIN: \n\nKEY: d1cb603b886e9deb62cbf5182caaeb35\nNONCE: cd23f90cfd17727ea0975ff2\nCT: \nAD: \nTAG: e319af65\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e626638a113c617077f5c4b2284921c5\nNONCE: c4a8864b4c3385a78cb8759f\nCT: \nAD: \nTAG: 039d51f8\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8f74a8b922fcf1a8eed7320df9f03fd6\nNONCE: 925ec6414e777062ac839f06\nCT: \nAD: \nTAG: bb0dc912\nIN: \n\nKEY: f59152b1d2991e7dfbd6b9cf91d2a9f1\nNONCE: 776f95b088803b537dfbe941\nCT: \nAD: \nTAG: 9163e80b\nIN: \n\nKEY: 72a9159c9f8f4953b6ab4fbad02c019a\nNONCE: 7ca4d31dba07c89b3d5cf059\nCT: \nAD: \nTAG: ee28643d\nIN: \n\nKEY: 6ca652634faee86176a8bbff37f5234c\nNONCE: 77bbe192e81594223b8869cb\nCT: \nAD: \nTAG: d054e86e\nIN: \n\nKEY: d06a1cebb4b1cf8b2f48126bffd4530b\nNONCE: ac7c4c669d5d7749d114448a\nCT: \nAD: \nTAG: c606dbcb\nIN: \n\nKEY: 42797f87d381cbbec3dddb8e7ee1b30e\nNONCE: c4be94c9b2f76132875374d0\nCT: \nAD: \nTAG: 40156799\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: accec0302ba0f854c2c5a6faf08f4972\nNONCE: 2722ce4848acc2b4cc9aafa2\nCT: \nAD: \nTAG: d90c055f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 117ecaafb5c844ceb9e505f8a33bfa79\nNONCE: cb95b76c9dbf4b6ee4fe6a46\nCT: \nAD: \nTAG: 641e2aa6\nIN: \n\nKEY: 453e89f0646d2532e3d0d019a7d7e302\nNONCE: 14732cb98fb4ad26c0ee9e1b\nCT: \nAD: \nTAG: 232f4035\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 121143f3835cb0d1f88f8f53a7abdb11\nNONCE: 601c15958cf77c0ea1c3862e\nCT: \nAD: \nTAG: 43c61d3d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: c5d7666d37ced3e4c2b9b738d4b38557\nNONCE: 012fa72716b777e0bc248f2d\nCT: \nAD: \nTAG: f4208947\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5d06c11668c4aa9899496b5d7f229b83\nNONCE: 0ca7102fff9fe056a5afa9f8\nCT: \nAD: \nTAG: d7a7af6d\nIN: \n\nKEY: b63a6afbc9906d23f1e9c0f487b6d919\nNONCE: 2b091d6b35e4f9ba5f9cfdb8\nCT: \nAD: \nTAG: d1eafd50\nIN: \n\nKEY: d1f6af919cde85661208bdce0c27cb22\nNONCE: 898c6929b435017bf031c3c5\nCT: \nAD: 7c5faa40e636bbc91107e68010c92b9f\nTAG: ae45f11777540a2caeb128be8092468a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2370e320d4344208e0ff5683f243b213\nNONCE: 04dbb82f044d30831c441228\nCT: \nAD: d43a8e5089eea0d026c03a85178b27da\nTAG: 2a049c049d25aa95969b451d93c31c6e\nIN: \n\nKEY: bc3ab28150fd4cb731d5f48ed2784173\nNONCE: 40408445c203c647312b8f01\nCT: \nAD: 53d2fc19963fc99a36a524e39cb68aa8\nTAG: 3f04dbd2f49909f73044175041fd9eff\nIN: \n\nKEY: 34537f1a0ba093aefedefe8b4b6b34e7\nNONCE: 9c5fc88eb388ef6776aa2182\nCT: \nAD: 4dd377d089c617dda1ecd42341d1878b\nTAG: c0fccde30ba354e23c05b5371c40d088\nIN: \n\nKEY: 54c3f935982de19de88d6384f9493389\nNONCE: 3d7eec1cdf3cd419511793ab\nCT: \nAD: 2ded8cbc69fa57678aadc7477f2a2173\nTAG: 74107fc192c94a7d85d0f9205f8b02c9\nIN: \n\nKEY: 790f8945b127a1a418d6d58b4378e0dc\nNONCE: f5694d77b816f2cef0ac80fc\nCT: \nAD: e5c71b82a60c97f050511a3b9a09e450\nTAG: 4c75effb688dccd0affe92c0e0391d64\nIN: \n\nKEY: f6ed6f0afea7e99ab320b525107715c9\nNONCE: 351e7dc999b9de77ce61b2f7\nCT: \nAD: c9101b64e0b6abc0e46828aec14d29cc\nTAG: 4f2ec2e1ab001443a60722671a9c9656\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2eccf9cda0e4e70f273ee8251120c768\nNONCE: 1d869f4b8497bc19d948cea6\nCT: \nAD: 1d86a6a21f23ee56ad0fa6c1de525906\nTAG: 37ffc390298c3ea8cceb382f394c2fc2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d61767f07b959e94f73c64cb5a5520b3\nNONCE: ecfa850395f8cf9348f1324f\nCT: \nAD: c3571bf1700b114bbf0c6bb2278d4d88\nTAG: 1065f86bc9e22197880ea87ac326a17f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9421cac15ce7d49ec7c088f7524a1ff5\nNONCE: b3d395bca123b265c05577cc\nCT: \nAD: eb6e06071dae4360e8347bfb72d9c188\nTAG: 1f04c228c7efc71f1706d10fd819f35e\nIN: \n\nKEY: 8580395a5d777c1690af79f6068e291b\nNONCE: cad1a0f2b76f064ca56be3cf\nCT: \nAD: 174388edf0b7f86fe634cb942c13754b\nTAG: 0067b03f2e0efc72cb08792fbe3b0267\nIN: \n\nKEY: 0c21da9c8b84d371fde59e6d1752113e\nNONCE: f8c13e58aaa329427438db8b\nCT: \nAD: b8b197789cfd085b09a47760c28c7e8a\nTAG: f8613cc5dcb4cc5c78f1f7c2d8084ec6\nIN: \n\nKEY: 162fc51e46e771222a04842f5546db8c\nNONCE: 13557e09e738eb895eca2d8d\nCT: \nAD: 691e71952c31a6b49b785f627c03e948\nTAG: 4f7ea723b1abd74e53fa356809275ca4\nIN: \n\nKEY: c46d9562d954801b8e99e4e57cbcc0ec\nNONCE: 30414c934b14e0bb0110ae44\nCT: \nAD: 41ae6a63855c1944446491e80670bf68\nTAG: 3e2366a2cf5632c1ecfde33f1f5f6d18\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2904df4dafcc6bbb8375baf6a7eede80\nNONCE: 6aae8ff4b1609f4026b47259\nCT: \nAD: c4afa7b21e5f41b892be52365a18584e\nTAG: e1810fe340207fa83815182bbad62bde\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a663a6aeac790c61e07e5f8ab843439d\nNONCE: e287d287051c82e2253e33f7\nCT: \nAD: d211a58e7d4884a26669b335c0af8d5c\nTAG: cdf52e39cced5c04ddaec8227826da\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 6dfa1a07c14f978020ace450ad663d18\nNONCE: 34edfa462a14c6969a680ec1\nCT: \nAD: 2a35c7f5f8578e919a581c60500c04f6\nTAG: 751f3098d59cf4ea1d2fb0853bde1c\nIN: \n\nKEY: 5f20eb8f6f579ec235b3403831fd58b1\nNONCE: b989444625a730876cc1a439\nCT: \nAD: 5881865ceb44bf171a7ba87d63f1fdcb\nTAG: 2d9c926c872c04bd0915f3e4ffccc5\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d1e376ecfa46321a3a4a187fc1524789\nNONCE: 7387c1af03adfffc53248ac8\nCT: \nAD: e9d8269ecf857dd6afd85fa90260a565\nTAG: 6a1da57b70e9c4fd006e4a669008d5\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f20681f4b61e72f8a6517e40b5860e0a\nNONCE: df80104736d5acba2348e5be\nCT: \nAD: e4247e85dafdabff95b6d8c27e8979a2\n",
     "TAG: 746ee686eddfac0785341bb616f90e\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 0f6ee618d0b66fa269398d5d3279931b\nNONCE: 7ac7c776a9a77aa8f7fc653b\nCT: \nAD: 2774b19121188965922c4a702c45fcfb\nTAG: 58d810fd408978d0f5eb33f06aa861\nIN: \n\nKEY: 9405240a2e0fbef7ac89f66f9188472f\nNONCE: 60718e8fb2866d27ddff8a78\nCT: \nAD: e86f19201889740743a9b95091283ab5\nTAG: 2984f343aff7e0ad84aa7134f77699\nIN: \n\nKEY: 9a5f24a325ac049169f7073b9583fa79\nNONCE: bf364dee6ac48e711aa2af2e\nCT: \nAD: 131339c8b9c785350efee37c0c37b6e5\nTAG: 69b1815c978cccdd146c51ad164429\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2b51c516898ded4dfedf1839eb09f059\nNONCE: 8080260add3b5d2182b3574a\nCT: \nAD: 303f4aa89c1ce37ff8b36940c65586e6\nTAG: 3750db28f9a09493ab60c9cb426e0b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 084877d61fd67442461c741afc4cf5f8\nNONCE: 798bce4a6b8663919dc922e0\nCT: \nAD: 056221633de809d2f48ff41c2d75d851\nTAG: a6c40f9765113e9dea6fd2f8bae96b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fe9cb0d7753d80686621fcf28705a39a\nNONCE: bd71586f2509814283ca1ec8\nCT: \nAD: 8676d9c9952340c31c9eb9e0d75c68d4\nTAG: d55ab183b959d697fb9145d37a7b27\nIN: \n\nKEY: 0ddee4104e896aae2849e8c4c5b97da4\nNONCE: 03d4bf8a036f974f92c77ed3\nCT: \nAD: 742838addd4a519d901736aa0a08d769\nTAG: cfb89c9ad51c348d65f7ce7cc4b72a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a22e58bd9a09eddaa630d499dd6d410c\nNONCE: ea9a7f75676dcc2f79b9147b\nCT: \nAD: 0a730acd7b5805ca0fbfdd5bef7690c5\nTAG: f3c63684015db6cc958bfb3ac84222\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8e5f16c84b0dd5357ad66f0540f1bf87\nNONCE: 6231ff08e050b7f7c5204842\nCT: \nAD: ab622472635a3ebae68aaaf8153df35a\nTAG: 1df90759291bfebd7cb239e75746ee\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 31c987a595a80a4c91de68805f66e5b9\nNONCE: 67edf7afbc125ecf99a804a2\nCT: \nAD: 8648a3452aaa3ff68d488de1abecef41\nTAG: 1c9199d9465ba5c9314911b4ad2057\nIN: \n\nKEY: 2d4fe4c17b1e86f0316846e642ff3a4d\nNONCE: a8b283438ad968e17fb5a755\nCT: \nAD: d0fdf6e1543d2b0f62c96c6e9c09c977\nTAG: 80149613bc962e4735acf317a3a4\nIN: \n\nKEY: aebb04a17265c4720d5a377c38efc460\nNONCE: b607be60340e557013e7adce\nCT: \nAD: 3cff96ceffa4c9a2193beeca9444e474\nTAG: a207fb626fb731c3234bad3573e8\nIN: \n\nKEY: 0807bf020df6ce3aba407e4d4f76ef6e\nNONCE: de63592624932a0805bce0a2\nCT: \nAD: 7c85c60c15301bfff6f2a4a3038b3c9f\nTAG: 5c83dce13c5bed35d8941f16627a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: efaa4666776ff4c6a87f563dd2e2794e\nNONCE: 9eb99f9741d9de6d3cbc9703\nCT: \nAD: 3addaaf513eb42606a24311ca7058846\nTAG: df02cfaace61423d45f64cec0e78\nIN: \n\nKEY: cf8d3e7cd62754bea5092409db3dc6c4\nNONCE: 5af3d5f1d144de8aca4bbda3\nCT: \nAD: 907083ee93cbf0b9b8421b8083bfcde8\nTAG: f19ebbc361dff17249251c9a7f5c\nIN: \n\nKEY: b894e7483c9f367b41af103f2860a6c8\nNONCE: 42d71d79e22740e1d1871ab5\nCT: \nAD: 8f78015bb82fbe032a6595e679198b47\nTAG: 96ce7b7f620b697f074f109c4488\nIN: \n\nKEY: 8299ee6ebdf1ea6e2561933b406de656\nNONCE: 98aade4ae4cda264b364987b\nCT: \nAD: 29a0fdb89ec5c5f969932e0aa0c170a8\nTAG: 60e0a7c2384f1d208abcfd4e4b3d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 29ac8dc4b69fb48289ceecd435ce3066\nNONCE: 2ecc8b95fae59fe59402bae5\nCT: \nAD: ec279eebc147897ea067a105c7e418c9\nTAG: d6f6127ec39852f18a7941948e41\nIN: \n\nKEY: 065bcae64ef1a982237e5977e73382ae\nNONCE: 164fed8cbe6d6cb0bbb6d608\nCT: \nAD: ed7da5abf307f9ceb18b630de9291b4a\nTAG: ac22e57ebf8ff258ffc77fa4bbb5\nIN: \n\nKEY: 1ad71eb24ea2a8055533fc1ec1b51b98\nNONCE: b27b640c3919a21da93e42c5\nCT: \nAD: 882acc108ee77afc6754089e864f0080\nTAG: dc36f18c131004e815c228a3fe9c\nIN: \n\nKEY: 54f06e8769711b40076d3cfc0239c324\nNONCE: d607633bd5336ce01c98f458\nCT: \nAD: e8f2f9edf850ade8e7cb55fba052e27a\nTAG: ff32f6d2418b2e646288bb105dcf\nIN: \n\nKEY: 8a473ce70b7694cb36efe5f5f268f1c4\nNONCE: 8236c764c7614dedabdd2dc0\nCT: \nAD: 4ea00a00b2bde6f183366b1ce8c33400\nTAG: 158bba897c1ab0cbce33355947fb\nIN: \n\nKEY: 4b42945e4361de3f6623b01872ff5f95\nNONCE: 5d7ec8f90b140049a8ef85f6\nCT: \nAD: 50feab5dce291d771df81b0124da29ed\nTAG: 90590e115ba688b50a66d59eb8b2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f2bad7d4f033b19c3b918da3021b3edb\nNONCE: 3825afbecc01cc66caddd402\nCT: \nAD: 49a6738279742410a0ce63276306c288\nTAG: 95a5980947205fe2225dbd39d098\nIN: \n\nKEY: 2c113bdd16d5f827bb84d9a9f1e2ced8\nNONCE: 97ce5737ca5305cebc3dbd0f\nCT: \nAD: 6833844c135173f2641190a5c81e2d38\nTAG: 9576596016c502bfb51adf861405\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 1dfee02fd2e411d8a95218059717e65e\nNONCE: 534f2db1833e2b95d17f4749\nCT: \nAD: 969f2d219986f9e3305b8be533ca164a\nTAG: 750e26041514a140374e857b19\nIN: \n\nKEY: 80a351296fdf716a59ce9cd3f3db1378\nNONCE: d57877a78eaea750131e1f62\nCT: \nAD: 89d5b612686f10f4523ad8721abb4a17\nTAG: 1445fe02c7eacc1968b5c2f436\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 44cdf8d44d4a85d4c718b6dfb3565f1f\nNONCE: 5fe0e438db113e46f73f0227\nCT: \nAD: 76fbc7e5d64be21cbb341b32ea61d8c6\nTAG: 98aaad6c40345751803926295d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5e86779506b46f0eabc6181b5a313222\nNONCE: ad02946f9f4e148462d14eea\nCT: \nAD: 89d777550c1c2148dbef73d7179d2bef\nTAG: dbfdb23c13eec51652128a223e\nIN: \n\nKEY: 0ea30aaa137345525472dbaa01918c86\nNONCE: 5ab6b70b7ede3b3fb08fcc39\nCT: \nAD: 64c3471c9ee1da88220ebae0a48cf98f\nTAG: cd171585c15995cedfcd148582\nIN: \n\nKEY: b0589030b2496a3b7ef823e2cc39bfd5\nNONCE: 6b9d5bc27d46fcdc6fbc39a9\nCT: \nAD: 7639433669bd4c1a1f3b1ac04fbf9cd8\nTAG: 83328a0e57afdf647e59a2d2c1\nIN: \n\nKEY: 81b27f066e5508f361cb98b3f378199c\nNONCE: 9ead7424a30cdc069b8668ed\nCT: \nAD: c19b80309e4aa34569f3058d13372b94\nTAG: a1127f3719147804e4eaeed8ca\nIN: \n\nKEY: 61a35d01df1b36fdbce2a6fc52b28305\nNONCE: 9d1708a0221d1d9bf3354a79\nCT: \nAD: 5ed9b0cd7a5e4072cce8f782a5438d1f\nTAG: 954fd6412d4b5f93d681c27baa\nIN: \n\nKEY: 15bbdcee8d262dfcf68f451e24bf26ca\nNONCE: c33f1f1eb456e6fb6d2277d3\nCT: \nAD: a3562c2071373e21cf346fee25cec4f2\nTAG: 1ce20f2935f8b8433a6820c228\nIN: \n\nKEY: eeda4ca996042630c017972b3bdaf09a\nNONCE: 0e02cd8bb87275df5287cee9\nCT: \nAD: 4ff3c0e013efca89e774b5794a8ba170\nTAG: 3b0e6daa01ad734c2eca681bf2\nIN: \n\nKEY: 75798e2e0ee570b06d4c47786336a099\nNONCE: e17c46acd0b0bbb15a5f9349\nCT: \nAD: e3779798212e7e9b4b2f387fbbbd95fe\nTAG: 1ab3d2c1cd55a89278224fc037\nIN: \n\nKEY: af2b060a94b20c9960f94fced963b2c5\nNONCE: dc8defbb5e45227e8576f45e\nCT: \nAD: 122f529fef4445f11a34111e10fd8b5d\nTAG: bb862654b76bd729ced4b4e9ad\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e1d07f1bc8f4a4b145badb96c85a82a6\nNONCE: 685e9636a2915adfc867889d\nCT: \nAD: 80c001fbf00b2bfd38ce903f0cd72db4\nTAG: ac9191dbb057b670dc76a194c2\nIN: \n\nKEY: ec4b3c2e077de7c2d62e28e3d05fe6c4\nNONCE: 704106b91d3a8f4dbee3ddbf\nCT: \nAD: f27dc1430cb30f8018cfc670eec9bb71\nTAG: d28d19fbedf2439140b0573083\nIN: \n\nKEY: 0dbbad4a54122500bb584787bfe94a86\nNONCE: dcad55f03d29103503858ff9\nCT: \nAD: 3c26ce754334b7fcc4576f4014349134\nTAG: 3251f275a3be44de87c5ff0544\nIN: \n\nKEY: d36cd8e8dd709b68433b4cef15efa4b8\nNONCE: dc859fa01cf3992fd5e74ba3\nCT: \nAD: 5983b73431118f294a4de08a4fbfbcc3\nTAG: 109412f2cd3dee2e75d9d90d\nIN: \n\nKEY: aa2717236879b0bfc29661187c0d2420\nNONCE: 1264dcda92ded29c03d846be\nCT: \nAD: 6b12dfb961f2e4d0ca2cea60666003af\nTAG: d69227a40670b13097d6f583\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 308a70f727df2e3c0f9da9f6607710b6\nNONCE: 1a790ff86fc2e6a428c9dd89\nCT: \nAD: fa18646779fa5a8ce9e271de0872f76d\nTAG: 68ffa9b8b2cc804935136712\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fb01d2721acc1c4a832232bb7ec59163\nNONCE: 6cd3cf1bc45c6f26b87b95a3\nCT: \nAD: 3fde68f37caf7e0f38c0281e3fb5e9a1\nTAG: f9da75272d67a6e180764a18\nIN: \n\nKEY: 8478e6653acf07ebb766bc941953aa23\nNONCE: 143b6fe40260052ddfc4537b\nCT: \nAD: 12f49ae610cea95e776f27f0ea433dc6\nTAG: 60aa4aefb53b800e1efd64bf\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f56ab97fbd0a2d8c6725f5a5ad117a2c\nNONCE: 266a436d9d05ee331a3ec858\nCT: \nAD: f31a01cd934b44208e9abe08c21f8be7\nTAG: b07258864aa6083fc15899e7\nIN: \n\nKEY: ba8a42bcc9d0bcbc9129d536d2364ebd\nNONCE: 6fc5c4ddb461acee4e3c2271\nCT: \nAD: 6bbb55b97c9cc3cfffa4f450b0debfee\nTAG: 3696c121fbb1def560c14182\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 827e4e3e9a4de530ae43510b94a55d54\nNONCE: d6c7fba9a73e76f6d1b015c6\nCT: \nAD: 3beff1d14cd6021b709d399d02015b05\nTAG: 2d58236b7e8113c821ddb4a0\nIN: \n\nKEY: 608ab3f94dd16b51c9afe4ba8dbdf852\nNONCE: a7b32bc6c976e8bd839f9af9\nCT: \nAD: eb212ef0a3a307024978a2c41a41d8a5\nTAG: 7aed47ba76b07717558bb87b\nIN: \n\nKEY: ef50e9ca5c53c2ddf49ccbd3c41a5a56\nNONCE: 817bee5ddedd26601cdb7cbc\nCT: \nAD: 75e26952eeaae53d83f77a3a502d3ca3\nTAG: 37245789deaada2d0dc5f2d4\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a9811b598adf0bbc34395b43829e86f6\nNONCE: c0def2f064789ad5d8f63799\nCT: \nAD: a735aab3b327ca3f575a09157b77a1c7\nTAG: 9f457e8e4757dae5cbd395bc\nIN: \n\nKEY: 3d906fa69252e00551b4a6347fe367ac\nNONCE: 067ea32f23e29d116fb0512b\nCT: \nAD: 4bf2a2096e27e75448cde7744b0209b",
@@ -1426,9 +1447,9 @@
     "45795cf2a4ea1f33cbb4e1d769231b72a590ce3dc408ec7386a265d65102833edd8dd43b718e9ccf2655ccab0a6022dd81f6697544d9e8bd69c5e6511879686dc2d936cf9e4fb23ef1273fb61eb7bd62ab2b8c49fb916368d7f4a1fa081fd9b3633c1e4cf\nIN: 15ecba6f0f8a42236d020573bbc866d29a86dbff689694e0ba3087bcaade496eacf110d903cd99b81b808c6ecb6f36cb990b63\nAD: 6e848ab8f7f4971a52cbcd42eca24d33a8ba4a43a473444fe2a5f69cac5209779939349d7a73e65db30ff0adbdbf7f99db3f4a810764e4edde1a95b6138e08c7c939549d83aecd46a84a9b897b6896ab07a6a9de663376d6197d\nCT: 9c7d13e78bacc849c76072c527abba06046075fae2a3d13079f0f66635a521e0e1e822e05e009ce3aa788052f5600c00e71031\nTAG: cf632f67bc5092e0\n\nKEY: b4166038b75dec191fc0ddf8375ff4c7\nNONCE: 7f4ab1196310affe7d2d3c165f48c4a5652dc76e0baa1497727a87c49b445d350e810e8b73f9d53590fcc041a863971bf70c715f90bc594a5b98c521b0a91907b0058583f48aa10aba51c45937dfad510b5772e4875186954a575e906e48efa26bb1cf6201fec8f13a3a477da68fb6288b3573095d7027c1fea292d0ba2f2aa0\nIN: e4f6678ac787f6b6ea1c2f04ebae8afdb8941f1ca363f5654d4822358d6041af03979e269f070ba9f03e814114bedaea88a203\nAD: b9bf722d2eae013fa11c49f3475514f9592556abfc334cf9dfba3cfe37d0de7d7c996eb6712facb376651178585d4a60844f52e2590837c35acf169817b692bfae8d08ef374bba4bb0301005b4aae16c54f848b8226a312ad6b3\nCT: b16224062ade5afd4796e658b3beef0d13683e494aa0d745d930378d4b8bd0465f4e58b8ec9c85e97779a461a426e337abe399\nTAG: 3fc244c1caca2757\n\nKEY: d16e4e7ec43a42bd7156f259b369ce93\nNONCE: 34834e81b1ed4ea895cc76788c3adb48c2884b213a46f24a2012a5d06dd6a7175b61d9d4ffdc0e00c54163280b2ed247be68788866094b5b8846e0da034940f800cf3dd0ccd44163a085cb0194461fbde7d621e029fe3effbdde9d856d70fa3398ace4216a94d530b71408bdb9d3036ec81a8a21df120965629c13b796d7d9a7\nIN: 3c6791d91654bf4069f7ccce712fcfb82dac85f2669b80dae7d23f94ebcb280ef621ed8c5cc77fc582dc4f8240061b5e269a1a\nAD: 4bfeb3935a388f15b7418182f8b37c61487865f519c5e7dfbfa4c3b74e60398d82d449ed418ee301895bcd8ddf5a9d50b74037af9a261bad3633600ba7dc79f06a5f09f350ad43c90c27f744779e82f850e23fd79136adafb555\nCT: aa546ace6bd092399bdefe0ab0985f9c380006117be38648e3a0da80cf4d32ece831c06e532b9324fd1df14a6acf8d75275fc3\nTAG: 7068e4ca6ac26998\n\nKEY: c4a8b2c99b62a2a64f8086aab1fd6c43\nNONCE: 2e6d6f434c72c71560f05b55fb7c07e310260aec112aab0e64e8f87fe738fc1b23dea859bbefbe9545fb575fc0a6d45fef42af09dccc9fde0a52ee84afe8d1339641ee5e00239e42b310d9acfd428c2075d93112bcf9ebe728707966ec29b1f72e87cccf75a2255875bf78abf0cd6534520625ac7d0df18bd6a1fd613f894198\nIN: a77ccd123128b46d9144fc5a90ec64bce6b4b5efc5646c8d4961eebe253235baeb236d8af9d1d81ad2bd4c86db78c31c1c8c90\nAD: 23463bb91dcd4716b7364e71a2ebe5e1aaef3cba8ea4214dbd6a987c9850af86518747c4869e00ce244f418ce19f0113705999aac35ad0bbda719573d69101046b34df89774d0093684ad7ec66eb509d8e7c25f552956c488095\nCT: a3632572e59a7c558d5e1ee9f5c059a5e118964c14e3d4e953b5c15d105db76bf970ed17bcccd84162feecbb3fc93d7015143a\nTAG: 27ccd8eae70c6ec9\n\nKEY: 2633d1781ce54f74ac609a5b5209a01f\nNONCE: 7d0e90b7e9f36f760d2dcbd66f352df45f3917afdbe1d0a89cc44be0bd85cf8bf75edbdd33f1d16dad02824d81389210b0f146f3df63f9232d7035eb9e8297a09474985b3e038a5fa6840155d8848fc7c53061ba0f442b84408660a997176ca5bf3473103fd3c9a1de2580b9e539af872259ecae925a8ef50f5a176a069b1fb8\nIN: ae695828625b264e0b13d3c9a539f2cf306a7501cdd35b817b699b2d7c25cf20d2dceec3fa883019db807272fddfdca8e7f672\nAD: 584c3cad3035d1427d6f5f1b261e97a5ea7d97c0b88cedf3b1aa5e21e5916805a63964eab4449d8806e7af60618465cf39f82769b7528bba9bb9c04992cd7b9e26efe9be38e1bfeeb41678c52d5ba3508fd7a2b1e8478505bfde\nCT: fbc32a56885100a36c276ff368db9236906021a8cc7500f2b3e78a6ca01546827073ff1103145f139f4d116eb47b84e33c7160\nTAG: 49589b3a\n\nKEY: 62dc8e1a98863c7de64f30b74c01d530\nNONCE: e9f658589f973895510cb34eef99b0cf34fc311c20c21464e07c4d6d34a15fcad3ea9ef51ef05513fb700cbb92aeef35e4cdda47b2c06c1104e987afa1cd6f827e7bc5a8db6d0657345945c068cabfd6e6b57533c929fe5804e121809b8b43d050a211fbee319879b1ba4cc2768df3a92014839086a377663a1d1967d7c602e9\nIN: f2c54a35286a225389e853e51f3f64b6980a79262e5545856c053d558d87d7b739eb75f27587efe219eb82e9a176fa14419dbe\nAD: 5d78b486c29131866569768d5eedb61afc48de7d1a223d0cccc647cf35408bb932293f3bc1b51a504e13c27548d083c8e8a45d4e9d4dc923c3c2bde38d6cdeaed2929b67e371356f74f635b3b1183ee0db71476f2024e1f5e13c\nCT: fe0c3ae08418ef91b478360942a84a58f8d93df7fe5bde138f59cc23432f04b9637841ccf7a5d539a36f621a7d17e026d4cc2c\nTAG: e413041a\n\nKEY: 9cb4b060870a2563d9f38b7c84f45ad0\nNONCE: 6f268f644af70b43d71c881009a29d966d4d4b13e9a22dae30c299d69d195f92d7ac45579444358acb2de20b78afa3f258eae68f7abc68a664f375efe43f8d39c69668931dd0daba24c8fb74b0a0eca13434ee9573246d342a91514a2495b6c8fce8ec9ecfc93400601d80ac9c4711777a7cc00086d31cc536c05b961c4fc5e8\nIN: 0f75400a6deb4427878b0ac3a1cc3950b39531716cab167ba2113aac383627b173ccd942858b0a3dc5bea3144f9a52179a8565\nAD: 99932f2dcd9dd63a4af30ede3b00d8e12fd24f2328fb03a3251cb1ff9b67b9bfcfe5432e444d4d60a8ce6a39fa41a391c0bccf686d9ac044f72c60ee8f3f26b8355267343b31bc0d2886c84dc6bb1c7c20388c16d04fada74915\nCT: 872ffa67cc633f74ad29cb8b0595989c0c79a5028f629b2800d1412abf1df68a10142e760ecadafba3361f2d43afe79c29c168\nTAG: 15851c9b\n\nKEY: b9587f9d7f881ec94a096b7fddfdc5ce\nNONCE: 107ab768521c30b4778ff9191934249561b8df2e803190da64de20f05979d2376ff6c048aefca35b246a888319b21306f52d1f1f1913545f532a3cf1de4cd52b926321a5a27f501bda538e1418c4b07599a9f897cd6d37320d1e08ffd4a2697bdf91fd5123038ccafd38457e061e3c48def212f94a5efe259ff276ee86c91337\nIN: 5d69699972afef8d1a7fcbb513a87dfdcbfcf01c367d5a378a649cbf92812c6da38815270a9ba0af4be351ad8b062a73a7f63b\nAD: a9d648927fce9991ae15571e1f7810536b41714506ee0197b9471e06613bcb8636203c1c67b93af6d1545baa181c2a149ac471dbd54dbae9784848a4b7ac6894a67bf40ed892df9bc720376e866e92c05c16bc58db1286d5ccb4\nCT: ee550d3368a1115d9cbb1dc37715d7e16e827eabc7d73b537c4cb6fd437e7c88e4afac6ee8807046f0da4788b3b26eb31e4a58\nTAG: dcd71cee\n\nKEY: 1e0c8c8cd53c942ca29dd3d202eb343f\nNONCE: beaf4a32b50c86f92611d7ab665ba344a12f8e5b281580f043633e9bf515d572520b23bf9e5214c38ab43fa4ef2f1a1bca05bba703c5c529943f069ea6f6053e8af0c7eb751b628a82e3ac22ada6e17a12152ae2d5d4162f70e34a8d0685af1d174db91cdc1c103678245cd9483753aca6ac240e5909c18c84f0c090dede24ee\nIN: 2dba40b971012ee4f3b443fd815726065859a28a06d22a1c35cd04529c7b805999cde4ce370b2ed3ea675428dcf5a3a99f7622\nAD: b61a1b5501326d7e67387500835f788574d21fa80df4a9fc6184259a8f0fd8180ef988e12baa645b7500ee246ea52284722051ec4c345a803714f2bc8f02dad385c575128cc6247ca3d293e2b487327f69b0304d402f97dcfa5c\nCT: ce5e806ad840e78042c2e0da0ff3af376a1f7d38adcab0226da6d34887b2b3ae17efcafeb0e32f5070d7cdb850c9ab5b0d8614\nTAG: 6d82627c\n\nKEY: 2fadbffa3eae8caba795506e9d9db0ef\nNONCE: f67d45a1d51912eed0e80d5f5ae05ce4c2c381aee2c4a391823df6b44ad123802602160cd679bdf893dc3aaa547a604e7d1e94de79523891ad32fc0943c822cfb995e5efa197f37a885aab5fd91d47c5ccf852977d7e689f663c5e933a5a72eb4417fce7f3a635cdcaffd60bfa875ad6c2f72cf284831fe640a23fdda21fcf77\nIN: 2f01fb5b9036ab22af19b326769f332b3f6adffbaa9583474bcc5499e00413f9b273a76412ce7d268f12471c078600a2f15bef\nAD: b872df430bd4400030ec5c38289a4be8d4bae608023b6f3922aab24f75bc0d29c2fc378bfdf47a99d7d3d53e1ea2e9420c2752f5b9b6e06b18b9eebd2344e190c4c1ee0f60b14ca89b5c8d3a25c9546a2d013b22ee9fbf92a247\nCT: c1d0f6f53c885b6470372f7d7468eb42fa1f4e20b540a68cac91060050f430d27c50e85403428a75de816c4747776476ae4e3d\nTAG: 8a457c98\n\nKEY: 3f3ec6bb52cc9a725abbf7b9b3f9fa4d\nNONCE: a700805e157f5fd7cec77bc556c2ad7e662c4b55b284970175d0476189822855d44fdecbe28b3fe7a73a6040e6994b8460262b5b5ac1049dbcf4a5febe21eb8574d3a679cc480958852efe787746b4b85acb86757cc855b9db99193208029ad1446631e4a101a115122a98e861c62ef1e3d6587122353b5f958420dc7c80d751\nIN: 07029e02ff512e948112d4f51d5f86d04edd2003447aba21f3976a7200f765130b8971508acbdaa6191c7691dccdde8617a86b\nAD: c6ca6cc319e5296e2ee085036193bbfc4e25a6079dfce25171ef0a2dd569355c73c69cfba69dfac17834ed3226886c07e5461bd605e83be4edd20173f395b37093bef321949d8a0797987796b30aa3387bfd3137506d6fbe5080\nCT: 3b26164ad8088f7e16ae82bd48c7c09230b05a820ea8f89cb4ca54529ccfd74addc308d00ef18f6712d3beac1946ab7da0852e\nTAG: 7e25563d\n\nKEY: 2f2f448e677da243aed2046c864db4dd\nNONCE: e0e01fea2c7c412f6365486b8859d1955075d82f68fb217047db274042d5fec731765541c2111e2ebd17894fd38b82cfadaa34c16526c1bc2efd3b8d6eacd7c4643da5288f37a0c61e8eebf6da76d641ad4c6545c0d7a7d4ae4a23373687e08b8e2d9c457ceff49947bf59e96db4f7304665584d22a0bc858a49721987afa904\nIN: 07a1024ae506ac70abb723c606eea5f6df328195c2f5a3fb629dd2813251abc7d3874deccca999",
     "44caefcb83f5bbbf36566807\nAD: be09b05e89a7e910f21607bed4e950d120e9d935c715023febdcd4639de7e440189aac53009cfbcd2acb230688abca97165943c65b1e8ed24ca72c4b57084e0610040929b918922d0f1b8a0d25c8cce46889add73b0b6d8a89bf\nCT: 15e4f0f567861361eb342ca281bf1b860f6681b33ba7c547682c4e92d48805cccce12b4be0c3b13af464fba9e79c561e3f0f00\nTAG: e7a6dfb2\n\nKEY: c35b35f68743e2e4f88bb48059f2e21b\nNONCE: 2dfae4843d58be3cc005915c357c5bdfaf7c4e7817e0164b123ec1ad08187269c323568f2bb80c50100b0de276dee9c81ba98801b848bdfdd6185a1926b3eb6adf1df193a6609932a150e0eeee08ee58d3027c712cc729abf9e7bfd3d5b328aa2887109b606704cee0455bf7135a3b4179c8aa86ac31e5e3209c04921975fb83\nIN: b1f1dd264e4f26da74f839728cf70743ef435c016a6549b17b70ac93ac37b0e97bbc3fd092dc07f2b020527b781a38f8d2687c\nAD: 65556a625bfa8b96e71ab5eca7bacb87c9140828b8605d9f3e441628d76281d5a5aca1fec44f038162977cff46d64f965bc4f94214fc63cc56c496aa9aca5adb855faef1f54123633a5d4dc367ab3cceb0c9e42eff3d981945d6\nCT: dabfba195ac7f737153810c3b6db598e2e346af941108f6535b3cbd389428280daf4d86b78148197fd6e0831434a0fdda3bf93\nTAG: c85e1c09\n\nKEY: f6e086357ed6cb07dbb463aa500ae69c\nNONCE: 15b56fb043a72881081a72bce9298e21fe60aeaf1e4b4a85bde873930adecb48d4c8f17362aef0cdf2c3bbbdbc00ce29669b633f181bfcb85c44511c5754ca07595dbdcd335b0078ebf8b09f5190096a9078259168b5a5e1b79211b62d8f0c306e5a0c4e81ea0c6c78e63f5529b633c28494c6f0a42ffe51be150df24aed1602\nIN: fe49c833bfcb93c401b3483d7c7fc9fdaaf3a2146bcc36e0ffe37ef1ac6ce855d0fad3675c9c9fe7cb908589cddf43c4c35421\nAD: b3f36b821f294d33a90c4675aba4b32f32abc3683843ad1689acf130a43a3b21b3473d3a6c7cccecd4c767a7682a26fc524eb6c9688719acfd708c304d3db201b662f48610cbb6c1ae521f00de7904d668b95b812be2b4298807\nCT: e56f27f5aea684a8421f1d559b56d80b3790cf3fbb5cd309f2866ae628c8196605edaca9be512cf6a42e53aca4478405a95d6a\nTAG: d2d608be\n\nKEY: 0dbefe872ed2ea2a964fe991541ae834\nNONCE: 82f382aee615f224677e876367268b31c89981e816c7c5a5ed1c7fa50370ce6a6e13dc2d1ffefef5d317302e22874d28fc67e0cf4d6fdbf1b5c8ff5645256378eca8426454ea600376aadf02d17bc171e40faa2e62530235063e73ac50d06c2a88d9e5e35739cffe8ac70aa2c4f4e00716052f823e0dcdd2b4b5afacbc79f4c1\nIN: 8445831a7b481e187978afbf195eb65eac1ebf3acf1fa452da79248ea484c9bc00d233c2e3b827de9b46bad3726c315080ca7f\nAD: 72caa4d008c9f7f9667fb98501c7e44972f491a8723db27e4a404d377cb4456234f9b56b9235087e25016e00cc6e6be08de7d8739a546db4a78407cc9200404332955a3c68d1f3c6bebf9c74d2e9bc54dc1c56c6b62c72bad6d0\nCT: 800fa98daa36955ab30dd4044756cccf382210a6548069d2f740094c29bdd10ba9bb0db0ca7a7db5fdaf2217c59ff5e0bce136\nTAG: fbc8e65c\n\nKEY: 92666e547ca6722278bc41f78c606014\nNONCE: 2e9733e8dc10ca3964e96b56839fbce9969f5f821fdf2f278e5465b6cf3fac8ed407d04b602209a0c97c14b710f6a3f29f65a1599869139f8061824745ad4470406956d3018eec8ff2584164db279a5a5f724030fa8478e7dacb949e473dee12332fd611bd66b06faa380b57b530a5cac30f3aacd607233c22460240edad253d\nIN: 97ce2ebd1850551b96813179b2bad2270eccf7195fe70273c9b4045e68a501781e47f808cb248326cb6425635db1d516ec760f\nAD: 20d0f02f1346ed9c8a697a5b507ed482033a177d4a71bd694b1533e94b72aaf54e48be64b6f7a30b2c6e94a00159ad60ce84d677d035790591a00e8068275e5caebe185bdb14ad24ab41e8fa3d0f4e19f57a390707efcd191cd0\nCT: 44af16eb4079f52009592436a0f1d7373a992fb5679c048466804495b9e1264e8292afe33c2661e30d3c2fedab5963bf0c63f5\nTAG: 917b6024\n\nKEY: d3f7d84e2a2f2e45e19e7dd4432f6cbb\nNONCE: bf1b1afa5c28d0f6883a12a4eb984ee8edd3c75e91d44628eb1133bad58506285961fd3d2d3f671788895a55824022c4b5a2ee0e470124c9b7cc00d6082e95991deedff69e366e9eb96a9e814e58e89c58abb224dc13d78db68797bbccdacf082f8563cc4c40137203c206476668482d51eee902c7e3344e7355ac18b61d3e1a\nIN: e02d21da508ab1157ec2aee2c18a924a34b84d7746bba79da3662402c111d686fb5f50a8831f01623e1b22f1a79b2cd014d715\nAD: 951ea13d95700d0c97e12df456280532ef86260307cf95375211b7fb44c3eb50ddeb5ef350714ac2c620ef8f66eb0da1796915400210568360d571e58de7d30e06b812112069667370376812e4e593362226997fe2947ded6371\nCT: d948b5f4f415423b656abf715c9fc756f90117f694b32961fa8f4bf003cffd463716644eef0ce5919dca38788e0df24a7d1367\nTAG: 19a23818\n\nKEY: 357e9c3ab5323ff141bdf17228b80a61\nNONCE: de8cd40a5db81e8b7083807a8a5c16d4808f48c52a56c68b77edb01b563f80513518eac2672c8f5524aa6e3850337233c693dec99a547cf6599dc33a6d89763e5f91d9a74715c9a635ed1931403b2fbec8be85f287506ed4bd7da3c6e2b25e29becf9466f4abdf3b0daa4818a7f31563fb5be7aba7cbd53c6522331fc04d4573\nIN: 995142af8870fd1c805aa9919f76485dc1fed5ead1e8366633ef09db5595c1a305bd10d945409148744d3998aba6434172087f\nAD: 863ebc2231af641f620f618567007847057146db69b1066dc1c4464d251729eb6ea3871d3e997e71a963439e9d81691a7196ddd439748e795a2cc62b8382a61e79863259cb643851f9a271130e0f9f54e15f0dc3ec8b27084c39\nCT: fc12b78280d4a9eef7d536f2f5b3b3d63cf641e07f6b91332b9200d224632c5b1ee41ee136693bf0c26d569e998d9a09ad24f8\nTAG: c0f7d0e6\n\nKEY: 0e00c76561d2bd9b40c3c15427e2b08f\nNONCE: 492cadaccd3ca3fbc9cf9f06eb3325c4e159850b0dbe98199b89b7af528806610b6f63998e1eae80c348e74cbb921d8326631631fc6a5d304f39166daf7ea15fa1977f101819adb510b50fe9932e12c5a85aa3fd1e73d8d760af218be829903a77c63359d75edd91b4f6ed5465a72662f5055999e059e7654a8edc921aa0d496\nIN: fef03c2d7fb15bf0d2df18007d99f967c878ad59359034f7bb2c19af120685d78e32f6b8b83b032019956ca9c0195721476b85\nAD: d8f1163d8c840292a2b2dacf4ac7c36aff8733f18fabb4fa5594544125e03d1e6e5d6d0fd61656c8d8f327c92839ae5539bb469c9257f109ebff85aad7bd220fdaa95c022dbd0c7bb2d878ad504122c943045d3c5eba8f1f56c0\nCT: 4f6cf471be7cbd2575cd5a1747aea8fe9dea83e51936beac3e68f66206922060c697ffa7af80ad6bb68f2cf4fc97416ee52abe\nTAG: e20b6655\n\n",
 };
-static const size_t kLen24 = 154319;
+static const size_t kLen25 = 154319;
 
-static const char *kData24[] = {
+static const char *kData25[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-192-CBC kat_aes/CBCGFSbox192.rsp kat_aes/CBCKeySbox192.rsp kat_aes/CBCVarKey192.rsp kat_aes/CBCVarTxt192.rsp\"\n\n# File 1: kat_aes/CBCGFSbox192.rsp\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 1b077a6af4b7f98229de786d7516b639\nCiphertext: 275cfc0413d8ccb70513c3859b1d0f72\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 9c2d8842e5f48f57648205d39a239af1\nCiphertext: c9b8135ff1b5adc413dfd053b21bd96d\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: bff52510095f518ecca60af4205444bb\nCiphertext: 4a3650c3371ce2eb35e389a171427440\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 51719783d3185a535bd75adc65071ce1\nCiphertext: 4f354592ff7c8847d2d0870ca9481b7c\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 26aa49dcfe7629a8901a69a9914e6dfd\nCiphertext: d5e08bf9a182e857cf40b3a36ee248cc\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 941a4773058224e1ef66d10e0a6ee782\nCiphertext: 067cd9d3749207791841562507fa9626\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 275cfc0413d8ccb70513c3859b1d0f72\nPlaintext: 1b077a6af4b7f98229de786d7516b639\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c9b8135ff1b5adc413dfd053b21bd96d\nPlaintext: 9c2d8842e5f48f57648205d39a239af1\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4a3650c3371ce2eb35e389a171427440\nPlaintext: bff52510095f518ecca60af4205444bb\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4f354592ff7c8847d2d0870ca9481b7c\nPlaintext: 51719783d3185a535bd75adc65071ce1\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d5e08bf9a182e857cf40b3a36ee248cc\nPlaintext: 26aa49dcfe7629a8901a69a9914e6dfd\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 067cd9d3749207791841562507fa9626\nPlaintext: 941a4773058224e1ef66d10e0a6ee782\n\n# File 2: kat_aes/CBCKeySbox192.rsp\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0956259c9cd5cfd0181cca53380cde06\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8e4e18424e591a3d5b6f0876f16f8594\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 93f3270cfc877ef17e106ce938979cb0\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7f6c25ff41858561bb62f36492e93c29\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8e06556dcbb00b809a025047cff2a940\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3608c344868e94555d23a120f8a5502d\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 77da2021935b840b7f5dcc39132da9e5\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 64ebf95686b353508c90ecd8b6134316\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ff558c5d27210b7929b73fc708eb4cf1\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a2c3b2a818075490a7b4c14380f02702\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cfe4d74002696ccf7d87b14a2f9cafc9\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d2eafd86f63b109b91f5dbb3a3fb7e13\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9b9fdd1c5975655f539998b306a324af\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: dd619e1cf204446112e0af2b9afa8f8c\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 19c80ec4a6deb7e5ed1033dda933498f\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3cf5e1d21a17956d1dffad6a7c41c659\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 45899367c3132849763073c435a9288a766c8b9ec2308516\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 69fd12e8505f8ded2fdcb197a121b362\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8aa584e2cc4d17417a97cb9a28ba29c8\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: abc786fb1edb504580c4d882ef29a0c7\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: d184c36cf0dddfec39e654195006022237871a47c33d3198\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2e19fb60a3e1de0166f483c97824a978\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7656709538dd5fec41e0ce6a0f8e207d\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a67cf333b314d411d3c0ae6e1cfcd8f5\n\nCipher: AES-192-CBC\nOpera",
     "tion: DECRYPT\nKey: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd\nIV: 00000000000000000000000000000000\nCiphertext: 0956259c9cd5cfd0181cca53380cde06\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29\nIV: 00000000000000000000000000000000\nCiphertext: 8e4e18424e591a3d5b6f0876f16f8594\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c\nIV: 00000000000000000000000000000000\nCiphertext: 93f3270cfc877ef17e106ce938979cb0\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300\nIV: 00000000000000000000000000000000\nCiphertext: 7f6c25ff41858561bb62f36492e93c29\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5\nIV: 00000000000000000000000000000000\nCiphertext: 8e06556dcbb00b809a025047cff2a940\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce\nIV: 00000000000000000000000000000000\nCiphertext: 3608c344868e94555d23a120f8a5502d\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53\nIV: 00000000000000000000000000000000\nCiphertext: 77da2021935b840b7f5dcc39132da9e5\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980\nIV: 00000000000000000000000000000000\nCiphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53\nIV: 00000000000000000000000000000000\nCiphertext: 64ebf95686b353508c90ecd8b6134316\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40\nIV: 00000000000000000000000000000000\nCiphertext: ff558c5d27210b7929b73fc708eb4cf1\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae\nIV: 00000000000000000000000000000000\nCiphertext: a2c3b2a818075490a7b4c14380f02702\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79\nIV: 00000000000000000000000000000000\nCiphertext: cfe4d74002696ccf7d87b14a2f9cafc9\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570\nIV: 00000000000000000000000000000000\nCiphertext: d2eafd86f63b109b91f5dbb3a3fb7e13\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6\nIV: 00000000000000000000000000000000\nCiphertext: 9b9fdd1c5975655f539998b306a324af\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3\nIV: 00000000000000000000000000000000\nCiphertext: dd619e1cf204446112e0af2b9afa8f8c\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93\nIV: 00000000000000000000000000000000\nCiphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9\nIV: 00000000000000000000000000000000\nCiphertext: 19c80ec4a6deb7e5ed1033dda933498f\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35\nIV: 00000000000000000000000000000000\nCiphertext: 3cf5e1d21a17956d1dffad6a7c41c659\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 45899367c3132849763073c435a9288a766c8b9ec2308516\nIV: 00000000000000000000000000000000\nCiphertext: 69fd12e8505f8ded2fdcb197a121b362\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e\nIV: 00000000000000000000000000000000\nCiphertext: 8aa584e2cc4d17417a97cb9a28ba29c8\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9\nIV: 00000000000000000000000000000000\nCiphertext: abc786fb1edb504580c4d882ef29a0c7\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: d184c36cf0dddfec39e654195006022237871a47c33d3198\nIV: 00000000000000000000000000000000\nCiphertext: 2e19fb60a3e1de0166f483c97824a978\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080\nIV: 00000000000000000000000000000000\nCiphertext: 7656709538dd5fec41e0ce6a0f8e207d\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72\nIV: 00000000000000000000000000000000\nCiphertext: a67cf333b314d411d3c0ae6e1cfcd8f5\nPlaintext: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey192.rsp\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: 800000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: de885dc87f5a92594082d02cc1e1b42c\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: c00000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 132b074e80f2a597bf5febd8ea5da55e\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: e00000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6eccedf8de592c22fb81347b79f2db1f\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: f00000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 180b09f267c45145db2f826c2582d35c\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: f80000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: edd807ef7652d7eb0e13c8b5e15b3bc0\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fc0000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9978bcf8dd8fd72241223ad24b31b8a4\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fe0000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5310f654343e8f27e12c83a48d24ff81\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ff0000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 833f71258d53036b02952c76c744f5a1\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ff8000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: eba83ff200cff9318a92f8691a06b09f\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffc000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ff620ccbe9f3292abdf2176b09f04eba\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffe000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7ababc4b3f516c9aafb35f4140b548f9\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fff000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: aa187824d9c4582b0916493ecbde8c57\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fff800000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1c0ad553177fd5ea1092c9d626a29dc4\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKe",
     "y: fffc00000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a5dc46c37261194124ecaebd680408ec\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffe00000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e4f2f2ae23e9b10bacfa58601531ba54\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffff00000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b7d67cf1a1e91e8ff3a57a172c7bf412\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffff80000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 26706be06967884e847d137128ce47b3\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffc0000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b2f8b409b0585909aad3a7b5a219072a\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffe0000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5e4b7bff0290c78344c54a23b722cd20\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffff0000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 07093657552d4414227ce161e9ebf7dd\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffff8000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e1af1e7d8bc225ed4dffb771ecbb9e67\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffc000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ef6555253635d8432156cfd9c11b145a\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffe000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fb4035074a5d4260c90cbd6da6c3fceb\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffff000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 446ee416f9ad1c103eb0cc96751c88e1\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffff800000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 198ae2a4637ac0a7890a8fd1485445c9\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffc00000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 562012ec8faded0825fb2fa70ab30cbd\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffe00000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cc8a64b46b5d88bf7f247d4dbaf38f05\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffff00000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a168253762e2cc81b42d1e5001762699\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffff80000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1b41f83b38ce5032c6cd7af98cf62061\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffc0000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 61a89990cd1411750d5fb0dc988447d4\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffe0000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b5accc8ed629edf8c68a539183b1ea82\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffff0000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b16fa71f846b81a13f361c43a851f290\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffff8000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4fad6efdff5975aee7692234bcd54488\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffc000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ebfdb05a783d03082dfe5fdd80a00b17\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffe000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: eb81b584766997af6ba5529d3bdd8609\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffff000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0cf4ff4f49c8a0ca060c443499e29313\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffff800000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cc4ba8a8e029f8b26d8afff9df133bb6\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffc00000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fefebf64360f38e4e63558f0ffc550c3\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffe00000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 12ad98cbf725137d6a8108c2bed99322\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffff00000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6afaa996226198b3e2610413ce1b3f78\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffff80000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2a8ce6747a7e39367828e290848502d9\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffc0000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 223736e8b8f89ca1e37b6deab40facf1\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffe0000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c0f797e50418b95fa6013333917a9480\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffff0000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a758de37c2ece2a02c73c01fedc9a132\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffff8000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3a9b87ae77bae706803966c66c73adbd\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffffc000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d365ab8df8ffd782e358121a4a4fc541\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: fffffffffffe000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c8dcd9e6f75e6c36c8daee0466f0ed74\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffff000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c79a637beb1c0304f14014c037e736dd\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffff800000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 105f0a25e84ac930d996281a5f954dd9\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffffc00000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 42e4074b2927973e8d17ffa92f7fe615\n\nCipher: AES-192-CBC\nOperation: ENCRYPT\nKey: ffffffffffffe00000000000000000000000000000000000\n",
@@ -1449,9 +1470,9 @@
     "0000\nCiphertext: 0882a16f44088d42447a29ac090ec17e\nPlaintext: fffffffffffffff00000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3a3c15bfc11a9537c130687004e136ee\nPlaintext: fffffffffffffff80000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c\nPlaintext: fffffffffffffffc0000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b46b09809d68b9a456432a79bdc2e38c\nPlaintext: fffffffffffffffe0000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 93baaffb35fbe739c17c6ac22eecf18f\nPlaintext: ffffffffffffffff0000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c8aa80a7850675bc007c46df06b49868\nPlaintext: ffffffffffffffff8000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 12c6f3877af421a918a84b775858021d\nPlaintext: ffffffffffffffffc000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 33f123282c5d633924f7d5ba3f3cab11\nPlaintext: ffffffffffffffffe000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a8f161002733e93ca4527d22c1a0c5bb\nPlaintext: fffffffffffffffff000000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b72f70ebf3e3fda23f508eec76b42c02\nPlaintext: fffffffffffffffff800000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6a9d965e6274143f25afdcfc88ffd77c\nPlaintext: fffffffffffffffffc00000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a0c74fd0b9361764ce91c5200b095357\nPlaintext: fffffffffffffffffe00000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 091d1fdc2bd2c346cd5046a8c6209146\nPlaintext: ffffffffffffffffff00000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e2a37580116cfb71856254496ab0aca8\nPlaintext: ffffffffffffffffff80000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e0b3a00785917c7efc9adba322813571\nPlaintext: ffffffffffffffffffc0000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 733d41f4727b5ef0df4af4cf3cffa0cb\nPlaintext: ffffffffffffffffffe0000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a99ebb030260826f981ad3e64490aa4f\nPlaintext: fffffffffffffffffff0000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 73f34c7d3eae5e80082c1647524308ee\nPlaintext: fffffffffffffffffff8000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 40ebd5ad082345b7a2097ccd3464da02\nPlaintext: fffffffffffffffffffc000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7cc4ae9a424b2cec90c97153c2457ec5\nPlaintext: fffffffffffffffffffe000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 54d632d03aba0bd0f91877ebdd4d09cb\nPlaintext: ffffffffffffffffffff000000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d3427be7e4d27cd54f5fe37b03cf0897\nPlaintext: ffffffffffffffffffff800000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b2099795e88cc158fd75ea133d7e7fbe\nPlaintext: ffffffffffffffffffffc00000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a6cae46fb6fadfe7a2c302a34242817b\nPlaintext: ffffffffffffffffffffe00000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 026a7024d6a902e0b3ffccbaa910cc3f\nPlaintext: fffffffffffffffffffff00000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 156f07767a85a4312321f63968338a01\nPlaintext: fffffffffffffffffffff80000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2\nPlaintext: fffffffffffffffffffffc0000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: db0d3a6fdcc13f915e2b302ceeb70fd8\nPlaintext: fffffffffffffffffffffe0000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 71dbf37e87a2e34d15b20e8f10e48924\nPlaintext: ffffffffffffffffffffff0000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c745c451e96ff3c045e4367c833e3b54\nPlaintext: ffffffffffffffffffffff8000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 340da09c2dd11c3b679d08ccd27dd595\nPlaintext: ffffffffffffffffffffffc000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8279f7c0c2a03ee660c6d392db025d18\nPlaintext: ffffffffffffffffffffffe000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a4b2c7d8eba531ff47c5041a55fbd1ec\nPlaintext: fffffffffffffffffffffff000000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f\nPlaintext: fffffffffffffffffffffff800000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3713da0c0219b63454035613b5a403dd\nPlaintext: fffffffffffffffffffffffc00000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8827551ddcc9df23fa72a3de4e9f0b07\nPlaintext: fffffffffffffffffffffffe00000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2e3febfd625bfcd0a2c06eb460da1732\nPlaintext: ffffffffffffffffffffffff00000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ee82e6ba488156f76496311da6941deb\nPl",
     "aintext: ffffffffffffffffffffffff80000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4770446f01d1f391256e85a1b30d89d3\nPlaintext: ffffffffffffffffffffffffc0000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: af04b68f104f21ef2afb4767cf74143c\nPlaintext: ffffffffffffffffffffffffe0000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cf3579a9ba38c8e43653173e14f3a4c6\nPlaintext: fffffffffffffffffffffffff0000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b3bba904f4953e09b54800af2f62e7d4\nPlaintext: fffffffffffffffffffffffff8000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fc4249656e14b29eb9c44829b4c59a46\nPlaintext: fffffffffffffffffffffffffc000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9b31568febe81cfc2e65af1c86d1a308\nPlaintext: fffffffffffffffffffffffffe000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9ca09c25f273a766db98a480ce8dfedc\nPlaintext: ffffffffffffffffffffffffff000000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b909925786f34c3c92d971883c9fbedf\nPlaintext: ffffffffffffffffffffffffff800000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 82647f1332fe570a9d4d92b2ee771d3b\nPlaintext: ffffffffffffffffffffffffffc00000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3604a7e80832b3a99954bca6f5b9f501\nPlaintext: ffffffffffffffffffffffffffe00000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 884607b128c5de3ab39a529a1ef51bef\nPlaintext: fffffffffffffffffffffffffff00000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 670cfa093d1dbdb2317041404102435e\nPlaintext: fffffffffffffffffffffffffff80000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7a867195f3ce8769cbd336502fbb5130\nPlaintext: fffffffffffffffffffffffffffc0000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 52efcf64c72b2f7ca5b3c836b1078c15\nPlaintext: fffffffffffffffffffffffffffe0000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4019250f6eefb2ac5ccbcae044e75c7e\nPlaintext: ffffffffffffffffffffffffffff0000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 022c4f6f5a017d292785627667ddef24\nPlaintext: ffffffffffffffffffffffffffff8000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e9c21078a2eb7e03250f71000fa9e3ed\nPlaintext: ffffffffffffffffffffffffffffc000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a13eaeeb9cd391da4e2b09490b3e7fad\nPlaintext: ffffffffffffffffffffffffffffe000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c958a171dca1d4ed53e1af1d380803a9\nPlaintext: fffffffffffffffffffffffffffff000\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 21442e07a110667f2583eaeeee44dc8c\nPlaintext: fffffffffffffffffffffffffffff800\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 59bbb353cf1dd867a6e33737af655e99\nPlaintext: fffffffffffffffffffffffffffffc00\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 43cd3b25375d0ce41087ff9fe2829639\nPlaintext: fffffffffffffffffffffffffffffe00\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6b98b17e80d1118e3516bd768b285a84\nPlaintext: ffffffffffffffffffffffffffffff00\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ae47ed3676ca0c08deea02d95b81db58\nPlaintext: ffffffffffffffffffffffffffffff80\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 34ec40dc20413795ed53628ea748720b\nPlaintext: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4dc68163f8e9835473253542c8a65d46\nPlaintext: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2aabb999f43693175af65c6c612c46fb\nPlaintext: fffffffffffffffffffffffffffffff0\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e01f94499dac3547515c5b1d756f0f58\nPlaintext: fffffffffffffffffffffffffffffff8\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9d12435a46480ce00ea349f71799df9a\nPlaintext: fffffffffffffffffffffffffffffffc\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cef41d16d266bdfe46938ad7884cc0cf\nPlaintext: fffffffffffffffffffffffffffffffe\n\nCipher: AES-192-CBC\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b13db4da1f718bc6904797c82bcf2d32\nPlaintext: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen25 = 154338;
+static const size_t kLen26 = 154338;
 
-static const char *kData25[] = {
+static const char *kData26[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-192-CTR -swap-iv-plaintext kat_aes/CBCGFSbox192.rsp kat_aes/CBCKeySbox192.rsp kat_aes/CBCVarKey192.rsp kat_aes/CBCVarTxt192.rsp\"\n\n# File 1: kat_aes/CBCGFSbox192.rsp\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 1b077a6af4b7f98229de786d7516b639\nCiphertext: 275cfc0413d8ccb70513c3859b1d0f72\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 9c2d8842e5f48f57648205d39a239af1\nCiphertext: c9b8135ff1b5adc413dfd053b21bd96d\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: bff52510095f518ecca60af4205444bb\nCiphertext: 4a3650c3371ce2eb35e389a171427440\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 51719783d3185a535bd75adc65071ce1\nCiphertext: 4f354592ff7c8847d2d0870ca9481b7c\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 26aa49dcfe7629a8901a69a9914e6dfd\nCiphertext: d5e08bf9a182e857cf40b3a36ee248cc\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 941a4773058224e1ef66d10e0a6ee782\nCiphertext: 067cd9d3749207791841562507fa9626\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 275cfc0413d8ccb70513c3859b1d0f72\nIV: 1b077a6af4b7f98229de786d7516b639\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c9b8135ff1b5adc413dfd053b21bd96d\nIV: 9c2d8842e5f48f57648205d39a239af1\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4a3650c3371ce2eb35e389a171427440\nIV: bff52510095f518ecca60af4205444bb\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4f354592ff7c8847d2d0870ca9481b7c\nIV: 51719783d3185a535bd75adc65071ce1\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d5e08bf9a182e857cf40b3a36ee248cc\nIV: 26aa49dcfe7629a8901a69a9914e6dfd\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 067cd9d3749207791841562507fa9626\nIV: 941a4773058224e1ef66d10e0a6ee782\n\n# File 2: kat_aes/CBCKeySbox192.rsp\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0956259c9cd5cfd0181cca53380cde06\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8e4e18424e591a3d5b6f0876f16f8594\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 93f3270cfc877ef17e106ce938979cb0\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7f6c25ff41858561bb62f36492e93c29\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8e06556dcbb00b809a025047cff2a940\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3608c344868e94555d23a120f8a5502d\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 77da2021935b840b7f5dcc39132da9e5\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 64ebf95686b353508c90ecd8b6134316\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ff558c5d27210b7929b73fc708eb4cf1\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a2c3b2a818075490a7b4c14380f02702\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cfe4d74002696ccf7d87b14a2f9cafc9\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d2eafd86f63b109b91f5dbb3a3fb7e13\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9b9fdd1c5975655f539998b306a324af\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: dd619e1cf204446112e0af2b9afa8f8c\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 19c80ec4a6deb7e5ed1033dda933498f\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3cf5e1d21a17956d1dffad6a7c41c659\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 45899367c3132849763073c435a9288a766c8b9ec2308516\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 69fd12e8505f8ded2fdcb197a121b362\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8aa584e2cc4d17417a97cb9a28ba29c8\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: abc786fb1edb504580c4d882ef29a0c7\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: d184c36cf0dddfec39e654195006022237871a47c33d3198\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2e19fb60a3e1de0166f483c97824a978\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7656709538dd5fec41e0ce6a0f8e207d\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a67cf333b314d411d3c0ae6e1cfcd8f5\n\nCipher",
     ": AES-192-CTR\nOperation: DECRYPT\nKey: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0956259c9cd5cfd0181cca53380cde06\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8e4e18424e591a3d5b6f0876f16f8594\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c\nPlaintext: 00000000000000000000000000000000\nCiphertext: 93f3270cfc877ef17e106ce938979cb0\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7f6c25ff41858561bb62f36492e93c29\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8e06556dcbb00b809a025047cff2a940\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3608c344868e94555d23a120f8a5502d\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53\nPlaintext: 00000000000000000000000000000000\nCiphertext: 77da2021935b840b7f5dcc39132da9e5\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53\nPlaintext: 00000000000000000000000000000000\nCiphertext: 64ebf95686b353508c90ecd8b6134316\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40\nPlaintext: 00000000000000000000000000000000\nCiphertext: ff558c5d27210b7929b73fc708eb4cf1\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae\nPlaintext: 00000000000000000000000000000000\nCiphertext: a2c3b2a818075490a7b4c14380f02702\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79\nPlaintext: 00000000000000000000000000000000\nCiphertext: cfe4d74002696ccf7d87b14a2f9cafc9\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570\nPlaintext: 00000000000000000000000000000000\nCiphertext: d2eafd86f63b109b91f5dbb3a3fb7e13\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9b9fdd1c5975655f539998b306a324af\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3\nPlaintext: 00000000000000000000000000000000\nCiphertext: dd619e1cf204446112e0af2b9afa8f8c\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93\nPlaintext: 00000000000000000000000000000000\nCiphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9\nPlaintext: 00000000000000000000000000000000\nCiphertext: 19c80ec4a6deb7e5ed1033dda933498f\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3cf5e1d21a17956d1dffad6a7c41c659\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 45899367c3132849763073c435a9288a766c8b9ec2308516\nPlaintext: 00000000000000000000000000000000\nCiphertext: 69fd12e8505f8ded2fdcb197a121b362\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8aa584e2cc4d17417a97cb9a28ba29c8\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9\nPlaintext: 00000000000000000000000000000000\nCiphertext: abc786fb1edb504580c4d882ef29a0c7\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: d184c36cf0dddfec39e654195006022237871a47c33d3198\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2e19fb60a3e1de0166f483c97824a978\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7656709538dd5fec41e0ce6a0f8e207d\nIV: 00000000000000000000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72\nPlaintext: 00000000000000000000000000000000\nCiphertext: a67cf333b314d411d3c0ae6e1cfcd8f5\nIV: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey192.rsp\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: 800000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: de885dc87f5a92594082d02cc1e1b42c\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: c00000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 132b074e80f2a597bf5febd8ea5da55e\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: e00000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6eccedf8de592c22fb81347b79f2db1f\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: f00000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 180b09f267c45145db2f826c2582d35c\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: f80000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: edd807ef7652d7eb0e13c8b5e15b3bc0\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fc0000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9978bcf8dd8fd72241223ad24b31b8a4\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fe0000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5310f654343e8f27e12c83a48d24ff81\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ff0000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 833f71258d53036b02952c76c744f5a1\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ff8000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: eba83ff200cff9318a92f8691a06b09f\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffc000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ff620ccbe9f3292abdf2176b09f04eba\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffe000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7ababc4b3f516c9aafb35f4140b548f9\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fff000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: aa187824d9c4582b0916493ecbde8c57\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fff800000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1c0ad553177fd5ea1092c9d626a29dc4\n\nCipher: AES-192-CTR\nOp",
     "eration: ENCRYPT\nKey: fffc00000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a5dc46c37261194124ecaebd680408ec\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffe00000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e4f2f2ae23e9b10bacfa58601531ba54\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffff00000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b7d67cf1a1e91e8ff3a57a172c7bf412\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffff80000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 26706be06967884e847d137128ce47b3\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffc0000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b2f8b409b0585909aad3a7b5a219072a\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffe0000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5e4b7bff0290c78344c54a23b722cd20\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffff0000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 07093657552d4414227ce161e9ebf7dd\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffff8000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e1af1e7d8bc225ed4dffb771ecbb9e67\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffc000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ef6555253635d8432156cfd9c11b145a\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffe000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fb4035074a5d4260c90cbd6da6c3fceb\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffff000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 446ee416f9ad1c103eb0cc96751c88e1\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffff800000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 198ae2a4637ac0a7890a8fd1485445c9\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffc00000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 562012ec8faded0825fb2fa70ab30cbd\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffe00000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cc8a64b46b5d88bf7f247d4dbaf38f05\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffff00000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a168253762e2cc81b42d1e5001762699\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffff80000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1b41f83b38ce5032c6cd7af98cf62061\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffc0000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 61a89990cd1411750d5fb0dc988447d4\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffe0000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b5accc8ed629edf8c68a539183b1ea82\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffff0000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b16fa71f846b81a13f361c43a851f290\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffff8000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4fad6efdff5975aee7692234bcd54488\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffc000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ebfdb05a783d03082dfe5fdd80a00b17\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffe000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: eb81b584766997af6ba5529d3bdd8609\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffff000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0cf4ff4f49c8a0ca060c443499e29313\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffff800000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cc4ba8a8e029f8b26d8afff9df133bb6\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffc00000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fefebf64360f38e4e63558f0ffc550c3\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffe00000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 12ad98cbf725137d6a8108c2bed99322\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffff00000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6afaa996226198b3e2610413ce1b3f78\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffff80000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2a8ce6747a7e39367828e290848502d9\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffc0000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 223736e8b8f89ca1e37b6deab40facf1\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffe0000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c0f797e50418b95fa6013333917a9480\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffff0000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a758de37c2ece2a02c73c01fedc9a132\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffff8000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3a9b87ae77bae706803966c66c73adbd\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffffc000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d365ab8df8ffd782e358121a4a4fc541\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: fffffffffffe000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c8dcd9e6f75e6c36c8daee0466f0ed74\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffff000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: c79a637beb1c0304f14014c037e736dd\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffff800000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 105f0a25e84ac930d996281a5f954dd9\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffffc00000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 42e4074b2927973e8d17ffa92f7fe615\n\nCipher: AES-192-CTR\nOperation: ENCRYPT\nKey: ffffffffffffe00000000000000000",
@@ -1472,9 +1493,9 @@
     "000000000000000000000000000000\nCiphertext: 0882a16f44088d42447a29ac090ec17e\nIV: fffffffffffffff00000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3a3c15bfc11a9537c130687004e136ee\nIV: fffffffffffffff80000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c\nIV: fffffffffffffffc0000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b46b09809d68b9a456432a79bdc2e38c\nIV: fffffffffffffffe0000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 93baaffb35fbe739c17c6ac22eecf18f\nIV: ffffffffffffffff0000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c8aa80a7850675bc007c46df06b49868\nIV: ffffffffffffffff8000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 12c6f3877af421a918a84b775858021d\nIV: ffffffffffffffffc000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 33f123282c5d633924f7d5ba3f3cab11\nIV: ffffffffffffffffe000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a8f161002733e93ca4527d22c1a0c5bb\nIV: fffffffffffffffff000000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b72f70ebf3e3fda23f508eec76b42c02\nIV: fffffffffffffffff800000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6a9d965e6274143f25afdcfc88ffd77c\nIV: fffffffffffffffffc00000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a0c74fd0b9361764ce91c5200b095357\nIV: fffffffffffffffffe00000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 091d1fdc2bd2c346cd5046a8c6209146\nIV: ffffffffffffffffff00000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e2a37580116cfb71856254496ab0aca8\nIV: ffffffffffffffffff80000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e0b3a00785917c7efc9adba322813571\nIV: ffffffffffffffffffc0000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 733d41f4727b5ef0df4af4cf3cffa0cb\nIV: ffffffffffffffffffe0000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a99ebb030260826f981ad3e64490aa4f\nIV: fffffffffffffffffff0000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 73f34c7d3eae5e80082c1647524308ee\nIV: fffffffffffffffffff8000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 40ebd5ad082345b7a2097ccd3464da02\nIV: fffffffffffffffffffc000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7cc4ae9a424b2cec90c97153c2457ec5\nIV: fffffffffffffffffffe000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 54d632d03aba0bd0f91877ebdd4d09cb\nIV: ffffffffffffffffffff000000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d3427be7e4d27cd54f5fe37b03cf0897\nIV: ffffffffffffffffffff800000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b2099795e88cc158fd75ea133d7e7fbe\nIV: ffffffffffffffffffffc00000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a6cae46fb6fadfe7a2c302a34242817b\nIV: ffffffffffffffffffffe00000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 026a7024d6a902e0b3ffccbaa910cc3f\nIV: fffffffffffffffffffff00000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 156f07767a85a4312321f63968338a01\nIV: fffffffffffffffffffff80000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2\nIV: fffffffffffffffffffffc0000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: db0d3a6fdcc13f915e2b302ceeb70fd8\nIV: fffffffffffffffffffffe0000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 71dbf37e87a2e34d15b20e8f10e48924\nIV: ffffffffffffffffffffff0000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c745c451e96ff3c045e4367c833e3b54\nIV: ffffffffffffffffffffff8000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 340da09c2dd11c3b679d08ccd27dd595\nIV: ffffffffffffffffffffffc000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8279f7c0c2a03ee660c6d392db025d18\nIV: ffffffffffffffffffffffe000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a4b2c7d8eba531ff47c5041a55fbd1ec\nIV: fffffffffffffffffffffff000000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f\nIV: fffffffffffffffffffffff800000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3713da0c0219b63454035613b5a403dd\nIV: fffffffffffffffffffffffc00000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8827551ddcc9df23fa72a3de4e9f0b07\nIV: fffffffffffffffffffffffe00000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2e3febfd625bfcd0a2c06eb460da1732\nIV: ffffffffffffffffffffffff00000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ee82e6ba4",
     "88156f76496311da6941deb\nIV: ffffffffffffffffffffffff80000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4770446f01d1f391256e85a1b30d89d3\nIV: ffffffffffffffffffffffffc0000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: af04b68f104f21ef2afb4767cf74143c\nIV: ffffffffffffffffffffffffe0000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cf3579a9ba38c8e43653173e14f3a4c6\nIV: fffffffffffffffffffffffff0000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b3bba904f4953e09b54800af2f62e7d4\nIV: fffffffffffffffffffffffff8000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fc4249656e14b29eb9c44829b4c59a46\nIV: fffffffffffffffffffffffffc000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9b31568febe81cfc2e65af1c86d1a308\nIV: fffffffffffffffffffffffffe000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9ca09c25f273a766db98a480ce8dfedc\nIV: ffffffffffffffffffffffffff000000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b909925786f34c3c92d971883c9fbedf\nIV: ffffffffffffffffffffffffff800000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 82647f1332fe570a9d4d92b2ee771d3b\nIV: ffffffffffffffffffffffffffc00000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3604a7e80832b3a99954bca6f5b9f501\nIV: ffffffffffffffffffffffffffe00000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 884607b128c5de3ab39a529a1ef51bef\nIV: fffffffffffffffffffffffffff00000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 670cfa093d1dbdb2317041404102435e\nIV: fffffffffffffffffffffffffff80000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7a867195f3ce8769cbd336502fbb5130\nIV: fffffffffffffffffffffffffffc0000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 52efcf64c72b2f7ca5b3c836b1078c15\nIV: fffffffffffffffffffffffffffe0000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4019250f6eefb2ac5ccbcae044e75c7e\nIV: ffffffffffffffffffffffffffff0000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 022c4f6f5a017d292785627667ddef24\nIV: ffffffffffffffffffffffffffff8000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e9c21078a2eb7e03250f71000fa9e3ed\nIV: ffffffffffffffffffffffffffffc000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a13eaeeb9cd391da4e2b09490b3e7fad\nIV: ffffffffffffffffffffffffffffe000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: c958a171dca1d4ed53e1af1d380803a9\nIV: fffffffffffffffffffffffffffff000\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 21442e07a110667f2583eaeeee44dc8c\nIV: fffffffffffffffffffffffffffff800\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 59bbb353cf1dd867a6e33737af655e99\nIV: fffffffffffffffffffffffffffffc00\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 43cd3b25375d0ce41087ff9fe2829639\nIV: fffffffffffffffffffffffffffffe00\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6b98b17e80d1118e3516bd768b285a84\nIV: ffffffffffffffffffffffffffffff00\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ae47ed3676ca0c08deea02d95b81db58\nIV: ffffffffffffffffffffffffffffff80\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 34ec40dc20413795ed53628ea748720b\nIV: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4dc68163f8e9835473253542c8a65d46\nIV: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2aabb999f43693175af65c6c612c46fb\nIV: fffffffffffffffffffffffffffffff0\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e01f94499dac3547515c5b1d756f0f58\nIV: fffffffffffffffffffffffffffffff8\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9d12435a46480ce00ea349f71799df9a\nIV: fffffffffffffffffffffffffffffffc\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cef41d16d266bdfe46938ad7884cc0cf\nIV: fffffffffffffffffffffffffffffffe\n\nCipher: AES-192-CTR\nOperation: DECRYPT\nKey: 000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b13db4da1f718bc6904797c82bcf2d32\nIV: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen26 = 191479;
+static const size_t kLen27 = 191479;
 
-static const char *kData26[] = {
+static const char *kData27[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-256-CBC kat_aes/CBCGFSbox256.rsp kat_aes/CBCKeySbox256.rsp kat_aes/CBCVarKey256.rsp kat_aes/CBCVarTxt256.rsp\"\n\n# File 1: kat_aes/CBCGFSbox256.rsp\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 014730f80ac625fe84f026c60bfd547d\nCiphertext: 5c9d844ed46f9885085e5d6a4f94c7d7\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 0b24af36193ce4665f2825d7b4749c98\nCiphertext: a9ff75bd7cf6613d3731c77c3b6d0c04\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 761c1fe41a18acf20d241650611d90f1\nCiphertext: 623a52fcea5d443e48d9181ab32c7421\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 8a560769d605868ad80d819bdba03771\nCiphertext: 38f2c7ae10612415d27ca190d27da8b4\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 91fbef2d15a97816060bee1feaa49afe\nCiphertext: 1bc704f1bce135ceb810341b216d7abe\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5c9d844ed46f9885085e5d6a4f94c7d7\nPlaintext: 014730f80ac625fe84f026c60bfd547d\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a9ff75bd7cf6613d3731c77c3b6d0c04\nPlaintext: 0b24af36193ce4665f2825d7b4749c98\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 623a52fcea5d443e48d9181ab32c7421\nPlaintext: 761c1fe41a18acf20d241650611d90f1\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 38f2c7ae10612415d27ca190d27da8b4\nPlaintext: 8a560769d605868ad80d819bdba03771\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1bc704f1bce135ceb810341b216d7abe\nPlaintext: 91fbef2d15a97816060bee1feaa49afe\n\n# File 2: kat_aes/CBCKeySbox256.rsp\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 46f2fb342d6f0ab477476fc501242c5f\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4bf3b0a69aeb6657794f2901b1440ad4\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 352065272169abf9856843927d0674fd\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4307456a9e67813b452e15fa8fffe398\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4663446607354989477a5c6f0f007ef4\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 531c2c38344578b84d50b3c917bbb6e1\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fc6aec906323480005c58e7e1ab004ad\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a3944b95ca0b52043584ef02151926a8\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a74289fe73a4c123ca189ea1e1b49ad5\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b91d4ea4488644b56cf0812fa7fcf5fc\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 304f81ab61a80c2e743b94d5002a126b\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 649a71545378c783e368c9ade7114f6c\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 47cb030da2ab051dfc6c4bf6910d12bb\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 798c7c005dee432b2c8ea5dfa381ecc3\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 637c31dc2591a07636f646b72daabbe7\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 179a49c712154bbffbe6e7a84a18e220\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558\nIV: 00000000000000000000000000000000\nCiphertext: 46f2fb342d6f0ab477476fc501242c5f\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64\nIV: 00000000000000000000000000000000\nCiphertext: 4bf3b0a69aeb6657794f2901b1440ad4\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c\nIV: 00000000000000000000000000000000\nCiphertext: 352065272169abf9856843927d0674fd\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627\nIV: 00000000000000000000000000000000\nCiphertext: 4307456a9e67813b452e15fa8fffe398\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f\nIV: 00000000000000000000000000000000\nCiphertext: 4663446607354989477a5c6f0f007ef4\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9\nIV: 00000000000000000000000000000000\nCiphertext: 531c2c38344578b84d50b3c917bbb6e1\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf\nIV: 00000000000000000000000000000000\nCiphertext: fc6aec906323480005c58e7e1ab004ad\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9\nIV: 00000000000000000000000000000000\nCiphertext:",
     " a3944b95ca0b52043584ef02151926a8\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e\nIV: 00000000000000000000000000000000\nCiphertext: a74289fe73a4c123ca189ea1e1b49ad5\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707\nIV: 00000000000000000000000000000000\nCiphertext: b91d4ea4488644b56cf0812fa7fcf5fc\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc\nIV: 00000000000000000000000000000000\nCiphertext: 304f81ab61a80c2e743b94d5002a126b\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887\nIV: 00000000000000000000000000000000\nCiphertext: 649a71545378c783e368c9ade7114f6c\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee\nIV: 00000000000000000000000000000000\nCiphertext: 47cb030da2ab051dfc6c4bf6910d12bb\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1\nIV: 00000000000000000000000000000000\nCiphertext: 798c7c005dee432b2c8ea5dfa381ecc3\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07\nIV: 00000000000000000000000000000000\nCiphertext: 637c31dc2591a07636f646b72daabbe7\nPlaintext: 00000000000000000000000000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e\nIV: 00000000000000000000000000000000\nCiphertext: 179a49c712154bbffbe6e7a84a18e220\nPlaintext: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey256.rsp\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: 8000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e35a6dcb19b201a01ebcfa8aa22b5759\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: c000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b29169cdcf2d83e838125a12ee6aa400\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: e000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: f000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1c777679d50037c79491a94da76a9a35\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: f800000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9cf4893ecafa0a0247a898e040691559\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fc00000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8fbb413703735326310a269bd3aa94b2\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fe00000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 60e32246bed2b0e859e55c1cc6b26502\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ff00000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ec52a212f80a09df6317021bc2a9819e\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ff80000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f23e5b600eb70dbccf6c0b1d9a68182c\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffc0000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a3f599d63a82a968c33fe26590745970\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffe0000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d1ccb9b1337002cbac42c520b5d67722\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fff0000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: cc111f6c37cf40a1159d00fb59fb0488\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fff8000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: dc43b51ab609052372989a26e9cdd714\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffc000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4dcede8da9e2578f39703d4433dc6459\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffe000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1a4c1c263bbccfafc11782894685e3a8\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffff000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 937ad84880db50613423d6d527a2823d\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffff800000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 610b71dfc688e150d8152c5b35ebc14d\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffc00000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 27ef2495dabf323885aab39c80f18d8b\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffe00000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 633cafea395bc03adae3a1e2068e4b4e\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffff00000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6e1b482b53761cf631819b749a6f3724\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffff80000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 976e6f851ab52c771998dbb2d71c75a9\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffc0000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 85f2ba84f8c307cf525e124c3e22e6cc\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffe0000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6bcca98bf6a835fa64955f72de4115fe\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffff0000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2c75e2d36eebd65411f14fd0eb1d2a06\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffff8000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: bd49295006250ffca5100b6007a0eade\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffc000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a190527d0ef7c70f459cd3940df316ec\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffe00",
     "0000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: bbd1097a62433f79449fa97d4ee80dbf\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffff000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 07058e408f5b99b0e0f061a1761b5b3b\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffff800000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5fd1f13fa0f31e37fabde328f894eac2\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffc00000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffe00000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 829fd7208fb92d44a074a677ee9861ac\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffff00000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ad9fc613a703251b54c64a0e76431711\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffff80000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 33ac9eccc4cc75e2711618f80b1548e8\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffc0000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2025c74b8ad8f4cda17ee2049c4c902d\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffe0000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f85ca05fe528f1ce9b790166e8d551e7\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffff0000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6f6238d8966048d4967154e0dad5a6c9\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffff8000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f2b21b4e7640a9b3346de8b82fb41e49\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffc000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f836f251ad1d11d49dc344628b1884e1\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffe000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 077e9470ae7abea5a9769d49182628c3\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffff000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e0dcc2d27fc9865633f85223cf0d611f\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffff800000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: be66cfea2fecd6bf0ec7b4352c99bcaa\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffc00000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: df31144f87a2ef523facdcf21a427804\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffe00000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: b5bb0f5629fb6aae5e1839a3c3625d63\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffff00000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3c9db3335306fe1ec612bdbfae6b6028\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffff80000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3dd5c34634a79d3cfcc8339760e6f5f4\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffc0000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 82bda118a3ed7af314fa2ccc5c07b761\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffe0000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2937a64f7d4f46fe6fea3b349ec78e38\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffff0000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 225f068c28476605735ad671bb8f39f3\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffff8000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ae682c5ecd71898e08942ac9aa89875c\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffc000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5e031cb9d676c3022d7f26227e85c38f\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffe000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a78463fb064db5d52bb64bfef64f2dda\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffff000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8aa9b75e784593876c53a00eae5af52b\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffff800000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3f84566df23da48af692722fe980573a\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffffc00000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 31690b5ed41c7eb42a1e83270a7ff0e6\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffffe00000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 77dd7702646d55f08365e477d3590eda\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffff00000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4c022ac62b3cb78d739cc67b3e20bb7e\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffff80000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 092fa137ce18b5dfe7906f550bb13370\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffffc0000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3e0cdadf2e68353c0027672c97144dd3\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: ffffffffffffffe0000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: d8c4b200b383fc1f2b2ea677618a1d27\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffffff0000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 11825f99b0e9bb3477c1c0713b015aac\n\nCipher: AES-256-CBC\nOperation: ENCRYPT\nKey: fffffffffffffff8000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: f8b9fffb5c187f7ddc7",
@@ -1500,9 +1521,9 @@
     "00000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4cc42fc1407b008fe350907c092e80ac\nPlaintext: ffffffffffffffffffff800000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 08b244ce7cbc8ee97fbba808cb146fda\nPlaintext: ffffffffffffffffffffc00000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 39b333e8694f21546ad1edd9d87ed95b\nPlaintext: ffffffffffffffffffffe00000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3\nPlaintext: fffffffffffffffffffff00000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9ad983f3bf651cd0393f0a73cccdea50\nPlaintext: fffffffffffffffffffff80000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8f476cbff75c1f725ce18e4bbcd19b32\nPlaintext: fffffffffffffffffffffc0000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 905b6267f1d6ab5320835a133f096f2a\nPlaintext: fffffffffffffffffffffe0000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 145b60d6d0193c23f4221848a892d61a\nPlaintext: ffffffffffffffffffffff0000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f\nPlaintext: ffffffffffffffffffffff8000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7b8e7098e357ef71237d46d8b075b0f5\nPlaintext: ffffffffffffffffffffffc000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2bf27229901eb40f2df9d8398d1505ae\nPlaintext: ffffffffffffffffffffffe000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 83a63402a77f9ad5c1e931a931ecd706\nPlaintext: fffffffffffffffffffffff000000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6f8ba6521152d31f2bada1843e26b973\nPlaintext: fffffffffffffffffffffff800000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd\nPlaintext: fffffffffffffffffffffffc00000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1ac1f7102c59933e8b2ddc3f14e94baa\nPlaintext: fffffffffffffffffffffffe00000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 21d9ba49f276b45f11af8fc71a088e3d\nPlaintext: ffffffffffffffffffffffff00000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 649f1cddc3792b4638635a392bc9bade\nPlaintext: ffffffffffffffffffffffff80000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e2775e4b59c1bc2e31a2078c11b5a08c\nPlaintext: ffffffffffffffffffffffffc0000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2be1fae5048a25582a679ca10905eb80\nPlaintext: ffffffffffffffffffffffffe0000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: da86f292c6f41ea34fb2068df75ecc29\nPlaintext: fffffffffffffffffffffffff0000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 220df19f85d69b1b562fa69a3c5beca5\nPlaintext: fffffffffffffffffffffffff8000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d\nPlaintext: fffffffffffffffffffffffffc000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 62526b78be79cb384633c91f83b4151b\nPlaintext: fffffffffffffffffffffffffe000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 90ddbcb950843592dd47bbef00fdc876\nPlaintext: ffffffffffffffffffffffffff000000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2fd0e41c5b8402277354a7391d2618e2\nPlaintext: ffffffffffffffffffffffffff800000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3cdf13e72dee4c581bafec70b85f9660\nPlaintext: ffffffffffffffffffffffffffc00000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: afa2ffc137577092e2b654fa199d2c43\nPlaintext: ffffffffffffffffffffffffffe00000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8d683ee63e60d208e343ce48dbc44cac\nPlaintext: fffffffffffffffffffffffffff00000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 705a4ef8ba2133729c20185c3d3a4763\nPlaintext: fffffffffffffffffffffffffff80000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0861a861c3db4e94194211b77ed761b9\nPlaintext: fffffffffffffffffffffffffffc0000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4b00c27e8b26da7eab9d3a88dec8b031\nPlaintext: fffffffffffffffffffffffffffe0000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5f397bf03084820cc8810d52e5b666e9\nPlaintext: ffffffffffffffffffffffffffff0000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 63fafabb72c07bfbd3ddc9b1203104b8\nPlaintext: ffffffffffffffffffffffffffff8000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 683e2140585b18452dd4ffbb93c95df9\nPlaintext: ffffffffffffffffffffffffffffc000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 286894e48e537f8763b56707d7d155c8\nPlaintext: ffffffffffffffffffffffffffffe000\n\nCiphe",
     "r: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a423deabc173dcf7e2c4c53e77d37cd1\nPlaintext: fffffffffffffffffffffffffffff000\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: eb8168313e1cfdfdb5e986d5429cf172\nPlaintext: fffffffffffffffffffffffffffff800\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 27127daafc9accd2fb334ec3eba52323\nPlaintext: fffffffffffffffffffffffffffffc00\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ee0715b96f72e3f7a22a5064fc592f4c\nPlaintext: fffffffffffffffffffffffffffffe00\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 29ee526770f2a11dcfa989d1ce88830f\nPlaintext: ffffffffffffffffffffffffffffff00\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0493370e054b09871130fe49af730a5a\nPlaintext: ffffffffffffffffffffffffffffff80\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9b7b940f6c509f9e44a4ee140448ee46\nPlaintext: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2915be4a1ecfdcbe3e023811a12bb6c7\nPlaintext: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7240e524bc51d8c4d440b1be55d1062c\nPlaintext: fffffffffffffffffffffffffffffff0\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: da63039d38cb4612b2dc36ba26684b93\nPlaintext: fffffffffffffffffffffffffffffff8\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a\nPlaintext: fffffffffffffffffffffffffffffffc\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 7bfe9d876c6d63c1d035da8fe21c409d\nPlaintext: fffffffffffffffffffffffffffffffe\n\nCipher: AES-256-CBC\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: acdace8078a32b1a182bfa4987ca1347\nPlaintext: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen27 = 191498;
+static const size_t kLen28 = 191498;
 
-static const char *kData27[] = {
+static const char *kData28[] = {
     "# Generated by \"make_cavp -cipher=aes -extra-labels=Cipher=AES-256-CTR -swap-iv-plaintext kat_aes/CBCGFSbox256.rsp kat_aes/CBCKeySbox256.rsp kat_aes/CBCVarKey256.rsp kat_aes/CBCVarTxt256.rsp\"\n\n# File 1: kat_aes/CBCGFSbox256.rsp\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 014730f80ac625fe84f026c60bfd547d\nCiphertext: 5c9d844ed46f9885085e5d6a4f94c7d7\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 0b24af36193ce4665f2825d7b4749c98\nCiphertext: a9ff75bd7cf6613d3731c77c3b6d0c04\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 761c1fe41a18acf20d241650611d90f1\nCiphertext: 623a52fcea5d443e48d9181ab32c7421\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 8a560769d605868ad80d819bdba03771\nCiphertext: 38f2c7ae10612415d27ca190d27da8b4\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 91fbef2d15a97816060bee1feaa49afe\nCiphertext: 1bc704f1bce135ceb810341b216d7abe\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5c9d844ed46f9885085e5d6a4f94c7d7\nIV: 014730f80ac625fe84f026c60bfd547d\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a9ff75bd7cf6613d3731c77c3b6d0c04\nIV: 0b24af36193ce4665f2825d7b4749c98\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 623a52fcea5d443e48d9181ab32c7421\nIV: 761c1fe41a18acf20d241650611d90f1\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 38f2c7ae10612415d27ca190d27da8b4\nIV: 8a560769d605868ad80d819bdba03771\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1bc704f1bce135ceb810341b216d7abe\nIV: 91fbef2d15a97816060bee1feaa49afe\n\n# File 2: kat_aes/CBCKeySbox256.rsp\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 46f2fb342d6f0ab477476fc501242c5f\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4bf3b0a69aeb6657794f2901b1440ad4\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 352065272169abf9856843927d0674fd\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4307456a9e67813b452e15fa8fffe398\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4663446607354989477a5c6f0f007ef4\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 531c2c38344578b84d50b3c917bbb6e1\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fc6aec906323480005c58e7e1ab004ad\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a3944b95ca0b52043584ef02151926a8\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a74289fe73a4c123ca189ea1e1b49ad5\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b91d4ea4488644b56cf0812fa7fcf5fc\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 304f81ab61a80c2e743b94d5002a126b\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 649a71545378c783e368c9ade7114f6c\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 47cb030da2ab051dfc6c4bf6910d12bb\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 798c7c005dee432b2c8ea5dfa381ecc3\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 637c31dc2591a07636f646b72daabbe7\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 179a49c712154bbffbe6e7a84a18e220\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558\nPlaintext: 00000000000000000000000000000000\nCiphertext: 46f2fb342d6f0ab477476fc501242c5f\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4bf3b0a69aeb6657794f2901b1440ad4\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c\nPlaintext: 00000000000000000000000000000000\nCiphertext: 352065272169abf9856843927d0674fd\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4307456a9e67813b452e15fa8fffe398\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4663446607354989477a5c6f0f007ef4\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9\nPlaintext: 00000000000000000000000000000000\nCiphertext: 531c2c38344578b84d50b3c917bbb6e1\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf\nPlaintext: 00000000000000000000000000000000\nCiphertext: fc6aec906323480005c58e7e1ab004ad\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9\nPlaintext: 000000000000000000",
     "00000000000000\nCiphertext: a3944b95ca0b52043584ef02151926a8\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e\nPlaintext: 00000000000000000000000000000000\nCiphertext: a74289fe73a4c123ca189ea1e1b49ad5\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707\nPlaintext: 00000000000000000000000000000000\nCiphertext: b91d4ea4488644b56cf0812fa7fcf5fc\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc\nPlaintext: 00000000000000000000000000000000\nCiphertext: 304f81ab61a80c2e743b94d5002a126b\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887\nPlaintext: 00000000000000000000000000000000\nCiphertext: 649a71545378c783e368c9ade7114f6c\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee\nPlaintext: 00000000000000000000000000000000\nCiphertext: 47cb030da2ab051dfc6c4bf6910d12bb\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1\nPlaintext: 00000000000000000000000000000000\nCiphertext: 798c7c005dee432b2c8ea5dfa381ecc3\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07\nPlaintext: 00000000000000000000000000000000\nCiphertext: 637c31dc2591a07636f646b72daabbe7\nIV: 00000000000000000000000000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e\nPlaintext: 00000000000000000000000000000000\nCiphertext: 179a49c712154bbffbe6e7a84a18e220\nIV: 00000000000000000000000000000000\n\n# File 3: kat_aes/CBCVarKey256.rsp\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: 8000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e35a6dcb19b201a01ebcfa8aa22b5759\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: c000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b29169cdcf2d83e838125a12ee6aa400\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: e000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: f000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1c777679d50037c79491a94da76a9a35\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: f800000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 9cf4893ecafa0a0247a898e040691559\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fc00000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8fbb413703735326310a269bd3aa94b2\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fe00000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 60e32246bed2b0e859e55c1cc6b26502\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ff00000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ec52a212f80a09df6317021bc2a9819e\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ff80000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f23e5b600eb70dbccf6c0b1d9a68182c\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffc0000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a3f599d63a82a968c33fe26590745970\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffe0000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d1ccb9b1337002cbac42c520b5d67722\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fff0000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: cc111f6c37cf40a1159d00fb59fb0488\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fff8000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: dc43b51ab609052372989a26e9cdd714\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffc000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4dcede8da9e2578f39703d4433dc6459\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffe000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 1a4c1c263bbccfafc11782894685e3a8\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffff000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 937ad84880db50613423d6d527a2823d\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffff800000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 610b71dfc688e150d8152c5b35ebc14d\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffc00000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 27ef2495dabf323885aab39c80f18d8b\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffe00000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 633cafea395bc03adae3a1e2068e4b4e\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffff00000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6e1b482b53761cf631819b749a6f3724\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffff80000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 976e6f851ab52c771998dbb2d71c75a9\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffc0000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 85f2ba84f8c307cf525e124c3e22e6cc\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffe0000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6bcca98bf6a835fa64955f72de4115fe\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffff0000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2c75e2d36eebd65411f14fd0eb1d2a06\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffff8000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: bd49295006250ffca5100b6007a0eade\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffc000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a190527d0ef7c70f459cd3940df316ec\n\nCipher: AES-256-CTR\nOperation: ENC",
     "RYPT\nKey: ffffffe000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: bbd1097a62433f79449fa97d4ee80dbf\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffff000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 07058e408f5b99b0e0f061a1761b5b3b\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffff800000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5fd1f13fa0f31e37fabde328f894eac2\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffc00000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffe00000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 829fd7208fb92d44a074a677ee9861ac\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffff00000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ad9fc613a703251b54c64a0e76431711\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffff80000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 33ac9eccc4cc75e2711618f80b1548e8\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffc0000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2025c74b8ad8f4cda17ee2049c4c902d\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffe0000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f85ca05fe528f1ce9b790166e8d551e7\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffff0000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 6f6238d8966048d4967154e0dad5a6c9\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffff8000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f2b21b4e7640a9b3346de8b82fb41e49\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffc000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: f836f251ad1d11d49dc344628b1884e1\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffe000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 077e9470ae7abea5a9769d49182628c3\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffff000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: e0dcc2d27fc9865633f85223cf0d611f\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffff800000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: be66cfea2fecd6bf0ec7b4352c99bcaa\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffc00000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: df31144f87a2ef523facdcf21a427804\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffe00000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: b5bb0f5629fb6aae5e1839a3c3625d63\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffff00000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3c9db3335306fe1ec612bdbfae6b6028\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffff80000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3dd5c34634a79d3cfcc8339760e6f5f4\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffc0000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 82bda118a3ed7af314fa2ccc5c07b761\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffe0000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 2937a64f7d4f46fe6fea3b349ec78e38\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffff0000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 225f068c28476605735ad671bb8f39f3\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffff8000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ae682c5ecd71898e08942ac9aa89875c\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffc000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 5e031cb9d676c3022d7f26227e85c38f\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffe000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: a78463fb064db5d52bb64bfef64f2dda\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffff000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 8aa9b75e784593876c53a00eae5af52b\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffff800000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3f84566df23da48af692722fe980573a\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffffc00000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 31690b5ed41c7eb42a1e83270a7ff0e6\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffffe00000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 77dd7702646d55f08365e477d3590eda\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffff00000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 4c022ac62b3cb78d739cc67b3e20bb7e\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffff80000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 092fa137ce18b5dfe7906f550bb13370\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffffc0000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 3e0cdadf2e68353c0027672c97144dd3\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: ffffffffffffffe0000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: d8c4b200b383fc1f2b2ea677618a1d27\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffffff0000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: 11825f99b0e9bb3477c1c0713b015aac\n\nCipher: AES-256-CTR\nOperation: ENCRYPT\nKey: fffffffffffffff8000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nIV: 00000000000000000000000000000000\nCiphertext: ",
@@ -1528,9 +1549,9 @@
     "000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4cc42fc1407b008fe350907c092e80ac\nIV: ffffffffffffffffffff800000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 08b244ce7cbc8ee97fbba808cb146fda\nIV: ffffffffffffffffffffc00000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 39b333e8694f21546ad1edd9d87ed95b\nIV: ffffffffffffffffffffe00000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3\nIV: fffffffffffffffffffff00000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9ad983f3bf651cd0393f0a73cccdea50\nIV: fffffffffffffffffffff80000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8f476cbff75c1f725ce18e4bbcd19b32\nIV: fffffffffffffffffffffc0000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 905b6267f1d6ab5320835a133f096f2a\nIV: fffffffffffffffffffffe0000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 145b60d6d0193c23f4221848a892d61a\nIV: ffffffffffffffffffffff0000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f\nIV: ffffffffffffffffffffff8000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7b8e7098e357ef71237d46d8b075b0f5\nIV: ffffffffffffffffffffffc000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2bf27229901eb40f2df9d8398d1505ae\nIV: ffffffffffffffffffffffe000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 83a63402a77f9ad5c1e931a931ecd706\nIV: fffffffffffffffffffffff000000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 6f8ba6521152d31f2bada1843e26b973\nIV: fffffffffffffffffffffff800000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd\nIV: fffffffffffffffffffffffc00000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1ac1f7102c59933e8b2ddc3f14e94baa\nIV: fffffffffffffffffffffffe00000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 21d9ba49f276b45f11af8fc71a088e3d\nIV: ffffffffffffffffffffffff00000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 649f1cddc3792b4638635a392bc9bade\nIV: ffffffffffffffffffffffff80000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: e2775e4b59c1bc2e31a2078c11b5a08c\nIV: ffffffffffffffffffffffffc0000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2be1fae5048a25582a679ca10905eb80\nIV: ffffffffffffffffffffffffe0000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: da86f292c6f41ea34fb2068df75ecc29\nIV: fffffffffffffffffffffffff0000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 220df19f85d69b1b562fa69a3c5beca5\nIV: fffffffffffffffffffffffff8000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d\nIV: fffffffffffffffffffffffffc000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 62526b78be79cb384633c91f83b4151b\nIV: fffffffffffffffffffffffffe000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 90ddbcb950843592dd47bbef00fdc876\nIV: ffffffffffffffffffffffffff000000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2fd0e41c5b8402277354a7391d2618e2\nIV: ffffffffffffffffffffffffff800000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 3cdf13e72dee4c581bafec70b85f9660\nIV: ffffffffffffffffffffffffffc00000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: afa2ffc137577092e2b654fa199d2c43\nIV: ffffffffffffffffffffffffffe00000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 8d683ee63e60d208e343ce48dbc44cac\nIV: fffffffffffffffffffffffffff00000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 705a4ef8ba2133729c20185c3d3a4763\nIV: fffffffffffffffffffffffffff80000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0861a861c3db4e94194211b77ed761b9\nIV: fffffffffffffffffffffffffffc0000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 4b00c27e8b26da7eab9d3a88dec8b031\nIV: fffffffffffffffffffffffffffe0000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 5f397bf03084820cc8810d52e5b666e9\nIV: ffffffffffffffffffffffffffff0000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 63fafabb72c07bfbd3ddc9b1203104b8\nIV: ffffffffffffffffffffffffffff8000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 683e2140585b18452dd4ffbb93c95df9\nIV: ffffffffffffffffffffffffffffc000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 286894e48e537f8763b56707d7d155c8\nIV: ffffffffffffffffffff",
     "ffffffffe000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: a423deabc173dcf7e2c4c53e77d37cd1\nIV: fffffffffffffffffffffffffffff000\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: eb8168313e1cfdfdb5e986d5429cf172\nIV: fffffffffffffffffffffffffffff800\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 27127daafc9accd2fb334ec3eba52323\nIV: fffffffffffffffffffffffffffffc00\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: ee0715b96f72e3f7a22a5064fc592f4c\nIV: fffffffffffffffffffffffffffffe00\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 29ee526770f2a11dcfa989d1ce88830f\nIV: ffffffffffffffffffffffffffffff00\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0493370e054b09871130fe49af730a5a\nIV: ffffffffffffffffffffffffffffff80\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 9b7b940f6c509f9e44a4ee140448ee46\nIV: ffffffffffffffffffffffffffffffc0\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 2915be4a1ecfdcbe3e023811a12bb6c7\nIV: ffffffffffffffffffffffffffffffe0\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7240e524bc51d8c4d440b1be55d1062c\nIV: fffffffffffffffffffffffffffffff0\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: da63039d38cb4612b2dc36ba26684b93\nIV: fffffffffffffffffffffffffffffff8\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a\nIV: fffffffffffffffffffffffffffffffc\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: 7bfe9d876c6d63c1d035da8fe21c409d\nIV: fffffffffffffffffffffffffffffffe\n\nCipher: AES-256-CTR\nOperation: DECRYPT\nKey: 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext: 00000000000000000000000000000000\nCiphertext: acdace8078a32b1a182bfa4987ca1347\nIV: ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen28 = 5825374;
+static const size_t kLen29 = 5825374;
 
-static const char *kData28[] = {
+static const char *kData29[] = {
     "# Generated by \"make_cavp -cipher gcm kat_gcm/gcmDecrypt256.rsp kat_gcm/gcmEncryptExtIV256.rsp\"\n\n# File 1: kat_gcm/gcmDecrypt256.rsp\n\nKEY: f5a2b27c74355872eb3ef6c5feafaa740e6ae990d9d48c3bd9bb8235e589f010\nNONCE: 58d2240f580a31c1d24948e9\nCT: \nAD: \nTAG: 15e051a5e4a5f5da6cea92e2ebee5bac\nIN: \n\nKEY: e5a8123f2e2e007d4e379ba114a2fb66e6613f57c72d4e4f024964053028a831\nNONCE: 51e43385bf533e168427e1ad\nCT: \nAD: \nTAG: 38fe845c66e66bdd884c2aecafd280e6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: c5ba3bf9ada560fb0301cd4e0b8b8a46a2aff2400395a72ed5804b3c755c4e59\nNONCE: de2b956e704063c000f28bbb\nCT: \nAD: \nTAG: 04eb9b20fd4548dc71594f20073a45a2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: c1d6162b585e2bac14d554d5675c6ddaa6b93be2eb07f8df86c9bb30f93ae688\nNONCE: f04dfce5c8e7713c71a70cc9\nCT: \nAD: \nTAG: 37fb4f33c82f6fce0c562896b3e10fc2\nIN: \n\nKEY: 70458edea4d95c8b3e069f14e1ad71d9186f482fe6d85088c71db58267e747ec\nNONCE: d6413ee8453a1729a658c6f4\nCT: \nAD: \nTAG: bd9e5e0c6ddc94acf65bf4e301d20a37\nIN: \n\nKEY: aa0bedc56b30418235aa94327062c34e0ddbf931e7bcb964b60678d411baf6cb\nNONCE: 8a7220c9a7e417e5da182bdb\nCT: \nAD: \nTAG: ae7e608491439940b4d1046c28361258\nIN: \n\nKEY: c11ce73ba45d5e33be3efd335c4d67d659284b3a824ae35d5982e9ea4c68145d\nNONCE: 1eeffdbab0745a757789018f\nCT: \nAD: \nTAG: d387f9e6bbbbf273746c9b5276a8618c\nIN: \n\nKEY: 639664a00278e45d18cd4ac1265a4fea39d1cd8d7907a0adb38723209c46a4bf\nNONCE: d838ba74c7ad57ee5266c5b7\nCT: \nAD: \nTAG: 3750f87de43cfa02ef882d6497da082d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: dc18f40a774ceeb930f0bb45070404783c66988a515db1a36ec0cc0d70fac2fd\nNONCE: 9c3a7dd947e6f50a6577c5ff\nCT: \nAD: \nTAG: 511924f2603d6d38920539fb10178989\nIN: \n\nKEY: 39aed23722e201752d2e53efe66c8f0f695658a63a9a8cecf4e25f02dd7da1d5\nNONCE: ce0108bc35e7ff7ba8408f3f\nCT: \nAD: \nTAG: 66acc084d5f62e639338131f5ab8f6c1\nIN: \n\nKEY: c5c19e080bbbce795754ae25e36dc7aea1589d823fe89835d0286e54de7f3153\nNONCE: 3109398abd423349b9b50adc\nCT: \nAD: \nTAG: 73c92b76997dbd9fe251436a7f61a666\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 831640f910ef709eb0ec3998ea5aa55470082de05ee20ed8b19f067d8af1308e\nNONCE: 443dcee827eb4cc49fe2b287\nCT: \nAD: \nTAG: 005ec26c2d708d5234b7937313dc7384\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 56567431c5210979a8dbb432966a81b3f1db5ec021f8aae0f0c3cce3678cc6fd\nNONCE: 45a97d48000ce1dab68de02e\nCT: \nAD: \nTAG: bbb295fd1e37c317f8130221af50496b\nIN: \n\nKEY: fdf71650d60cb7aa566cdd7ba66f462ed613a1c6c1dfdab0ba8e676fb7a8b935\nNONCE: a035553c5a9b88a67627dbcc\nCT: \nAD: \nTAG: 4a7361a05757e2cb60cc17ff8c5911b7\nIN: \n\nKEY: 3b19d8a4795b52e6dc4f8fd3c091c05a65c8f3cddc665ab473e6144011ae54a4\nNONCE: 23744265b6865b99bed99f11\nCT: \nAD: \nTAG: b7a67b6068d2b22c1b26f795ee1701be\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 31201b86ccb6cbcf289798225c55de5a1c936a18aec996b5b8dcceb33bf96b41\nNONCE: c2c6402f1f5ae89a6fa0fb65\nCT: \nAD: \nTAG: 0b0bebb86a5d60f1f1881cea155e33\nIN: \n\nKEY: 2878cdd980bd1289e2efef7f3116b0a2772d272412e1cfeaf20f90cc278820e9\nNONCE: 9ada69a2f393958cc3866bf9\nCT: \nAD: \nTAG: cff55846db838aaf5e08e88f8d7fe2\nIN: \n\nKEY: 1ee02b8c391d6559ceb1683221821e377d20fb186733d24d2becb73e4121e92b\nNONCE: 70181ecf28be85c68f4dbe86\nCT: \nAD: \nTAG: b90acb4d41e2df4c148d8837ca712b\nIN: \n\nKEY: e8cd41c3d9ee7dca4c5d66753384cd1a034f729595fbeb00042874fe704fe4a8\nNONCE: cab88d202761537e288dcd47\nCT: \nAD: \nTAG: 954296ab400209335f424eb22636a5\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 56fec15de81f78182f3f4d9cda32c3d7744568ab6e2285c7c3384bd17f0a4e22\nNONCE: 71e09145955273fd889cefda\nCT: \nAD: \nTAG: 3b2191283125d17f1f41558279630f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: f66d1d2bd210d75c555b856c5c61d9c09b035498a9896284c34d9312e35b1065\nNONCE: 10dda1bf8ebca4b0a1f3396d\nCT: \nAD: \nTAG: 6da9c30516fe1d60355a01211669dd\nIN: \n\nKEY: 421ad8416b0558e225e9e3de2ec1c7fc0ea5a3378291dfd4c43f85fb3fa63d59\nNONCE: 23a84ef01256fa90a44e502b\nCT: \nAD: \nTAG: 237b556e56c27f03ff2e893d46dc14\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5a848b232b428015fc1a86134774558bdb3180f8b853bc32be40b6e4f098a857\nNONCE: cc87b1468b8ee9a5a4e1d7e1\nCT: \nAD: \nTAG: 329be89d4cd62d3d3a755d0989f3e7\nIN: \n\nKEY: 9a865aa04969fe50bcb48b90d75ce72f1ced9337ef81acec5a633eac7544f86d\nNONCE: cf4962b18e6b8f6f4146a0e7\nCT: \nAD: \nTAG: da7e4d68f4f77271537786350f8fcc\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e106e692ae0285dad853a3232e150c1ccc602d74bf3bd91e0ffa36c33855d152\nNONCE: c4fe31cf2f36bf29080e6317\nCT: \nAD: \nTAG: 2523855a9d0bf9db28c39142aabb76\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: cfae5da8cabe9bd774713bc5b6c5a3ae42a872154636b6f976ee51e6a197a949\nNONCE: 033a03e2d701d1aafea3c399\nCT: \nAD: \nTAG: bb94014b3268e39eb71a2e3f5e65b2\nIN: \n\nKEY: 267b7087ad528cb9564c909b4fd8f9a80787ac2f85f23d10be6d0b2bfa043c09\nNONCE: cf8e3f28b1af597a76d0f538\nCT: \nAD: \nTAG: acec8a91da886b56075e5661fd5281\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 174162718b2e85482533322741309a4d3100c77e4178cd936b9881ab868b9bf9\nNONCE: 6a4abe063efd24fc960c56cb\nCT: \nAD: \nTAG: 1dc929a76cc0f4e28e65367e29002b\nIN: \n\nKEY: badd602c95d173fcb1334a32cd1437fbbfc21813bbefa8457b543a6f05c7ca80\nNONCE: c28a85678f63fd46edf03810\nCT: \nAD: \nTAG: 94f4cc2fb26c2d487b20b01441574f\nIN: \n\nKEY: 8ff59e7c71865c94b637a924132e5519137da18573ee797c981dfd41c70538e7\nNONCE: 80b277f8789d5f1165924d21\nCT: \nAD: \nTAG: fc1bd57ced8be952b9ff6017502ff6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 799c0a95a15bbe3915cd55ff2af71a437247c74092819c8f398f820b5829b4de\nNONCE: 53be11fdaa1cef09b7cbbdf7\nCT: \nAD: \nTAG: e81916926bbd1cf8d0378467dd99\nIN: \n\nKEY: d24580e7584b7fce9bce2e6a0d1d3bab184ac25171e57c9d67db832325202a96\nNONCE: 2d40c5487ea483e543238c93\nCT: \nAD: \nTAG: ed989ab0f70be34acf71f6ac6a00\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a8b15b30aa3f69190611031906cc125c98289fed2836f99b29e1d38b2c32c8ed\nNONCE: 317a4522cc374f32458142e2\nCT: \nAD: \nTAG: 4d421b1e0551f632b80f14cc433e\nIN: \n\nKEY: 8f85436046b48589390986646a5ed0e1587d431d1d10ec66d490f38c60ae9182\nNONCE: 6bbe054c533f5d659f5442fd\nCT: \nAD: \nTAG: edf25381a757cf747676fea43772\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9254c8375c3fe74b35a125a8e9f5109cf880f13ad03b7ff35ac0255efbc51a5d\nNONCE: 912705e60880ea3b9554dd69\nCT: \nAD: \nTAG: a5c899aea5e9483d9506682b6a66\nIN: \n\nKEY: 3a3908ae84d595b377fa7325374a7cf8ab6b70e62d21b8b5be75ae2e31334481\nNONCE: ec3ec0cec10bcbd3f2ea0002\nCT: \nAD: \nTAG: c122ee4d6df5f23f1e48732516e7\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 57eb6a05eb054b404f2d87623fe1340b052d20597e9331ef90ad684d4f660202\nNONCE: ee2468096c2befc44e16d351\nCT: \nAD: \nTAG: 0894132b1594df56b6114419cd4c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8704fce138b35ccf644ed70285300df5a7ddb19c3a1e244b6c6764c565812fc6\nNONCE: 8acfc17f01e8200da86009c1\nCT: \nAD: \nTAG: 914a956e661b064f91cfe779bf14\nIN: \n\nKEY: 6bdf1a1a465dc9777147de2f73527f193883ea5241d5cd209939290d73a3e149\nNONCE: c9e36c568487a78cf85269d6\nCT: \nAD: \nTAG: 34fbc5a0c2bb9bf937c4316838da\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 4da9edd0d5f7fe42bd0ff2d6342c9588625bf24ed3e3f5c1a456f2915ead961a\nNONCE: 3f1ece70c54dcc320de79733\nCT: \nAD: \nTAG: 083510a941749021d64ba5ec59d4\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 7a83b53a0b11f4477f673cad123ea5548903759e9d5d856235c59ff3af1caa8d\nNONCE: 7c3f82f7bf425398742916fc\nCT: \nAD: \nTAG: 7de106e354fe15c5111cb127335f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 4f17984fd466eede268b8ef75629cc7bac53b2dfcaf326700ac1a9841ea580fe\nNONCE: 2a9d7d283c33c953ed0fb90a\nCT: \nAD: \nTAG: 9befbbe25a1f2d7e8eb39689f39b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d7a5f32bc7ba818b26fdc03fc1a4de7d8837bcebc023b36591284a0973fde527\nNONCE: d590b0a69cea63c8c3293f2c\nCT: \nAD: \nTAG: 1080033d9a947bb879b1df5576c3\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 270b3ca4321ba7346226c89868483a6e6e679cd896f8e9d52cea9000e1939746\nNONCE: 3f29410035eeb93d03a7b2d1\nCT: \nAD: \nTAG: 7529cd4204b9a8e149034907e829\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 0bf97de28518991a5043c1b6d56d2ef87d38d195d47984fc1ccbfcb7f3860908\nNONCE: 1d76c092d2dd79a62b970403\nCT: \nAD: \nTAG: e63432142ef64756c38d693fd8fe\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 585daad086f48a3dffd89e3712f1f8033e8b168c107ddc7f3454690decc132d5\nNONCE: e2f2a83f6aaec072d8268cee\nCT: \nAD: \nTAG: d400ebadcef9ce147a3b00ea39\nIN: \n\nKEY: 42de0aed7e4b699546d351af85db208d79273393bde6318e33232850c65457e7\nNONCE: 82bd822d011e38319a76dfe2\nCT: \nAD: \nTAG: e262760567ca2ca6cbb3fa5703\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 00ae365607def9dd57d4f38f131ea9659abdd96eae6c52179b16796cf1ee53a0\nNONCE: 56d2485bb17cd4a6791ebd07\nCT: \nAD: \nTAG: 8460e8e8fbb4c8212c96fee330\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 27271e1fa38fadaae145b7fdb15c357c95cf7cbe77961561b59b0ad27df57b5b\nNONCE: 22fb1457c21627e8ddf5017c\nCT: \nAD: \nTAG: 0b6b620e9f5d1ba6e886d71e75\nIN: \n\nKEY: eb9fd8b60a524219cf09805e6aabf65ebb1730fe3b1ef0d91adf054",
     "44088d665\nNONCE: f8745cf1171199ee02607d59\nCT: \nAD: \nTAG: 65866a3b4455bd3ee58a88d7c3\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: cc72d5bdb02986acecd74dfcf20d880ae5bc14afd26db1b9f04fe08b85a4bf6e\nNONCE: b2d26145ed1be0cf782ea5fd\nCT: \nAD: \nTAG: 101f1e5c96748958462434cdd5\nIN: \n\nKEY: 4ac59235d7350ddad294fa9e0ea8e246a7c9f10689d2b0bd9e0145ecebf89885\nNONCE: cef0563a1797cc62589af02b\nCT: \nAD: \nTAG: a5299a6eaaf9b3ad82bd23b340\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 30fc4f8d634f404d1a66791d7c745d841c635320b7a1b28fbd26f3154b952d19\nNONCE: e7addadf0740e62ee32dd111\nCT: \nAD: \nTAG: 4c9a4fdecf2af9a609b67b6564\nIN: \n\nKEY: 3896ca84611b23bda4af5cc9fe0d62cf093019f1192a2c27cd7d2c1320102998\nNONCE: 0cc3ae5b56f3db71e2195e6e\nCT: \nAD: \nTAG: 0413fefe638d6613ad15ff5422\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9d4cfc649a6c146c20b17e44af835c42cafe4c8e1ebcba092c22d77fdb0a5478\nNONCE: a27cce894b2dc42f1754aae0\nCT: \nAD: \nTAG: b1259f4cae8c4708fd46e60c26\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: e7ad81d26e5a639b7e99d3b205ddb6a09598ac804b5913ee8b8e724e5b69d003\nNONCE: 08fc7f46f6f600feecefc008\nCT: \nAD: \nTAG: e51e2ed634294d73942a9aafd8\nIN: \n\nKEY: d9288c7e44440398e9c5b6156615bb0d63064cbcee22cee46e710cdf6753e2cf\nNONCE: dc37870991b27ae42dfd6c33\nCT: \nAD: \nTAG: 5408193318902ae3e92b4b6eca\nIN: \n\nKEY: 3e7c2c5dd3c9e092e45d0ee9eaa2f8c2714cf845f50be787cb6a3e65726a7a56\nNONCE: 0e39d519e9d6db4dc462f2ec\nCT: \nAD: \nTAG: bbf6cd3c840ba5347b281ccd99\nIN: \n\nKEY: 29ae533689bc22ea72580a42260b71128504ff55f4025f455fe656a7cd534c08\nNONCE: fd0a67e9cdea915eb367e069\nCT: \nAD: \nTAG: 6421e4d996407496e09231a96e\nIN: \n\nKEY: 7930342c63e26215a80eaa824ec382d452c6d71f81a7ac2667b1baf1b139cee8\nNONCE: 920cf0199c32cdcf419971ad\nCT: \nAD: \nTAG: 866e974b681af38f0a98074ec1\nIN: \n\nKEY: 96ad13bf2492f4675340e65b455bd0b884574f5b6c4fea774462496b8a0925ad\nNONCE: 2ddf6aa50c2ea9106ce0a951\nCT: \nAD: \nTAG: 10a471540cc7bae14273f2e2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: b1599e78f21b175a3038aacde9141f7198c301ff80276020c1974342baad1e55\nNONCE: abdd25c66d7821fde6ec0b76\nCT: \nAD: \nTAG: ab077a703bfb6646d5aef26b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 7c487e31244dcbf84ee6e7c03714302aa3e52ae1282f8de72c44d3777e73593c\nNONCE: 297e056784c12646ed2fa6c7\nCT: \nAD: \nTAG: 08c53ea6cc85662f0d9bb018\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: d9304fc27885ac2ac5cf871e9c5758ad66babbc50b26d1c3e32d00ebb4273525\nNONCE: c73d0831e8e23cec9ac4143c\nCT: \nAD: \nTAG: 2f19c7a022909777853ccd5a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9f6fed7d59ef1650244ee0966f647179968edb74f5d9b4ea412300979d2c9d9d\nNONCE: c0d8eafd572e76402bf2421b\nCT: \nAD: \nTAG: 157519d699f8f19b6ed0a4c9\nIN: \n\nKEY: 72eb01f911a998bd534b696b0ce99cbbe7788f1d5f3f1c07f5286daef7007ad0\nNONCE: 6930e168edf7be096aa92f77\nCT: \nAD: \nTAG: 8229b618c52079abd2d8cf96\nIN: \n\nKEY: e625dc4d57da4975c5e2bbdc3be61716c910975848f2a06a8a375c12ceff702a\nNONCE: 44925a2c8f2eaa0d02d33047\nCT: \nAD: \nTAG: 9a0f456312dce97e23d4af58\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 648914e5322383a1984b84726deeead89dd19c60556622d61ce649ba74b152b5\nNONCE: 8a070725978278d7e3e6fae4\nCT: \nAD: \nTAG: 40819c4375be0ec64543f5c2\nIN: \n\nKEY: b0a2fc05e05eb23b03f6fd073d1502fa071cfdde6e4a57f344d3b46587d44667\nNONCE: 6b05139925fca211928767ab\nCT: \nAD: \nTAG: b927b087690a7d2fdc5da1d7\nIN: \n\nKEY: 9a56a45297bf12c63db8207118c3570f05eebcc31a87ad20ac85fad9a9cfcbce\nNONCE: 2108bf02ae1b9191e5f20e06\nCT: \nAD: \nTAG: c1a03eeb46a080507fb39e33\nIN: \n\nKEY: 98f9da937717a7698eda75b5671ea209dde1b37506d2a5874b9ec57805310e73\nNONCE: 4db9d0d9cb66a80565af6c84\nCT: \nAD: \nTAG: eeef79af87fe6bc0d0476d16\nIN: \n\nKEY: b5c699b548cd0839a24eec8aee1b0a5bc42de0bec78aacaa9b18b666986891b4\nNONCE: 87e21a74da97bc02d7f9e0cc\nCT: \nAD: \nTAG: c4a584270a5b0bfe0ac979bb\nIN: \n\nKEY: cd3adadded7c7ae047ae38c93a73d029fdf4e12a8a0c2fbc6c5f354fe07b0fa9\nNONCE: acf47c06e93b5d042c8444b9\nCT: \nAD: \nTAG: f1391598e2172300fb5279dc\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: cf90a8f6731d71abaaa354076c69812a96145b4d283369b0c519ce1818c85cff\nNONCE: 718b1b2d8979f54e357bce92\nCT: \nAD: \nTAG: ea7dc6b16c9a870a560facbc\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 849ee5f331af0bbb2366033ca07c29fe8ec64b2e18f8d2af91d88c08b958763c\nNONCE: 23b34d13fa0e2c954e0a5974\nCT: \nAD: \nTAG: c4a18f7724ca968055aa0d8a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: caed02e544e9eb475360e9b3e4b6e7572605081790ec54ea39ab9bc67932e0fd\nNONCE: d2ffaa7f0b6c3c708238a1b0\nCT: \nAD: \nTAG: eb053ee206ab47cc\nIN: \n\nKEY: ddd2cc50ed30a394387adcef5dcfdb7405082d62b3a513902977301f22ccf851\nNONCE: 4dc0d75a392e1b1cd2e5b6d6\nCT: \nAD: \nTAG: 11e713078f660a45\nIN: \n\nKEY: ae166cba7907a50a2faeb8a1f835e0a21b6074f403d2fbf265ca8525663865c5\nNONCE: d70ea09bd1dc20d47625a7ce\nCT: \nAD: \nTAG: 8a0138d6b06dbee0\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 119c935ac47a3d2e2bbc2fe753c34727ea28e96c288a8b46a0c884066a85edc5\nNONCE: e04c72c0dfec84d52bcda87d\nCT: \nAD: \nTAG: 5ca9d3a5b75b519a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 166ebf390a9aa54e3c525b06497adcdc9b394ba25e65731c0004e9ff9793e0e5\nNONCE: 7e8e61d97c17a303510d581c\nCT: \nAD: \nTAG: 7c2a0b411cc8f2f5\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 7f3c7d35e06b60a0e948212da1170467a54b88a488e7edf4b7fbf9d03f645d4f\nNONCE: 3b21437bd320ffc3f90f835c\nCT: \nAD: \nTAG: 7e18457fe81b2302\nIN: \n\nKEY: 37875cda07364dae174c1b422e0daa8b949b6478332988504ef3f633d58df4ca\nNONCE: 746e59be002990d169b4a783\nCT: \nAD: \nTAG: 81be9ff1ddfb32bc\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 6e1eec50f2eb68da620a913a2a0d2250ad0541f3acf88fed2f890f840c0046ad\nNONCE: a75bf504651adadd31743464\nCT: \nAD: \nTAG: 49d75b1504d39ebb\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2864eb7a7025da05ea9ed75f07baf26d90b8eb93f2c57dec6dcc87e650f48f54\nNONCE: 98b764326898d43e443f441b\nCT: \nAD: \nTAG: 1996834986570afe\nIN: \n\nKEY: 8ef06b7a47655a6248c782291476d983d43e17cf419852868d488d2a6093f750\nNONCE: 40c3ceb10e9dddfe23569244\nCT: \nAD: \nTAG: ce828e8aa6056b7f\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 30ec395340ba1d05b9964dc932750e6bcfb3acabd1c07656ca3654128893d77c\nNONCE: 69d240b1d240c0c71cf10966\nCT: \nAD: \nTAG: 18b112b18cd0bd86\nIN: \n\nKEY: 18efa6f3395d20ddbd483924fabdbe105d70e69f4652b929207d9746b098ee11\nNONCE: 4f166cb3acc43383ec9b2bfd\nCT: \nAD: \nTAG: 4b34f4c59236dcbf\nIN: \n\nKEY: 540407922c1056e6e0df4c9a7af8360222cec57167161ad00121a5cc19bebd53\nNONCE: 6d9f32e3139a18fcd34c1e73\nCT: \nAD: \nTAG: f12553f984d4a1d0\nIN: \n\nKEY: ddd54500533cffd1af87c6f58d880d45c1d27c22ed283c110d04227658d443ac\nNONCE: 2cb369234c276e1838c9575a\nCT: \nAD: \nTAG: 7f43b5a32da7b9f2\nIN: \n\nKEY: 62450ce465840e8d49e7aab125f66817bf57ccb0553e5aa633150913406281eb\nNONCE: da552ec45463002256b07393\nCT: \nAD: \nTAG: dccb3788c2e2a66f\nIN: \n\nKEY: 5765ad16f4dbd4d4e6370dbfa18b8ef5ac37459e39556afaba9b553dea4c1b23\nNONCE: 59678f262588e4d526d9fc34\nCT: \nAD: \nTAG: a68f33ed\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: a29fa93614e9f714c73d3707d1142b2514fa8a14641f79ef14e9bf0e812f49fa\nNONCE: 68272acf71b1cdad4655dbdc\nCT: \nAD: \nTAG: b90e554a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 717d2a5396ae21560a895a7847f53c47956d155ca4dd2165137d3506ff48a7bf\nNONCE: 6ccd8086830f586fa3b0e777\nCT: \nAD: \nTAG: a618ac6a\nIN: \n\nKEY: 6ecf9a1db3e42ed91d2206646369d9eab43fab9efbf797a6b2633db3eebcff18\nNONCE: 7142907a03b12ba332d84107\nCT: \nAD: \nTAG: 57e1882b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 186361bee6c4d37b94b6c9389216db63b7cf7c5b28592c290c02c9aa0978b6e7\nNONCE: f1a7b61b6a503665049d36ae\nCT: \nAD: \nTAG: aa52f4e2\nIN: \n\nKEY: d8d3fd180da0136621d9a7ebb273bdc4ae48fa72997c7b902c2c512c2bcc11e6\nNONCE: 4f7692221b2e295220f6a1a9\nCT: \nAD: \nTAG: 7c16931d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2231071e59bbfa627f0881f04ea13290302674e05f405f75e3c62d787d07c2f3\nNONCE: 65b3758e6418f04afa2b4d9d\nCT: \nAD: \nTAG: a56259a6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fa1dc19ed84ffa40c94ffd1021208f50dffe16e9f0a53b5ee6be55163a408618\nNONCE: 09bb332baa725ca0c72a150b\nCT: \nAD: \nTAG: 76c71a63\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 0a7733e3c0e7017b17abc46e25047b3b5d5a3f95bd45e069953d08761b826e9e\nNONCE: 0257955c4f6b354ae46b5d44\nCT: \nAD: \nTAG: 04f4bffe\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 060ecdff8a7325d76017b93071797b2c299d6519d0605b565c8550c66875cdd5\nNONCE: a8f8288d9124ee73c6b89f47\nCT: \nAD: \nTAG: f493e8eb\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 9a9d85fff37716f90d4523586e99046e66cede008fd8acdb55ecefcd9228d7b8\nNONCE: 8a7296be2b691ea45bf4cf9d\nCT: \nAD: \nTAG: d63728a4\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 2344f2cb986326d931d768e8f9bf7cbf7aa0fe91fe5d7a9d8e0591e1144a064a\nNONCE: 0fd7ad08c13f0c97f5c85d75\nCT: \nAD: \nTAG: 6196202c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 17b00458ce181235bc704ea54cfed4a74d792350ea4e3e1dd4d1817b3720b4f6\nNONCE: c4ec09b35b857bea94a728a2\nCT: \nAD: \nTAG: acceb73a\nIN: \n\nKEY: 7e6c0a5cc37125408f8f11f5607054a3314924c36a7f1b1988c46cd06",
     "ebe4ffa\nNONCE: 299973ab4a56aaa8a67e6e59\nCT: \nAD: \nTAG: 1f450c0a\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 1b5b987676d7ce62c42d9103f7ee8b3964da272eaae5097a0e0b0a2678e6a382\nNONCE: 1828385a47e53ce3810c0bc0\nCT: \nAD: \nTAG: f938bdc2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 6dfdafd6703c285c01f14fd10a6012862b2af950d4733abb403b2e745b26945d\nNONCE: 3749d0b3d5bacb71be06ade6\nCT: \nAD: c0d249871992e70302ae008193d1e89f\nTAG: 4aa4cc69f84ee6ac16d9bfb4e05de500\nIN: \n\nKEY: 033360a08d0b2963ce4dcf807b772ac86ae3e8b8fabb9cd3a636f8ec54365646\nNONCE: 8dcaa63d13a2425395609914\nCT: \nAD: f9d15fc34984b8f4a7caa29a82b24c52\nTAG: 42bc9cc93a1c8592bd29c9ef9f907780\nIN: \n\nKEY: 4f1a5fc8e4689c493ef8e23a653e86e4d4c8972a2338653375b0f36a4feb91d7\nNONCE: 9b8221a631404088218fe487\nCT: \nAD: f09b0fc4e4ccb5e28dfcc0792a6800f3\nTAG: 31073f1a0050462a03c7ad0bbefaf93b\nIN: \n\nKEY: e70e4f6919b521dab68f0dff6b4aa57e443db4f8301186819d8611969af33b28\nNONCE: 63d5ff1ba0d5e69f5dc1c92f\nCT: \nAD: c29abcf1f61063c6765747da8980fde4\nTAG: 3d78ec2d237dfd57b8b125ff0912653a\nIN: \n\nKEY: 2c392a5eb1a9c705371beda3a901c7c61dca4d93b4291de1dd0dd15ec11ffc45\nNONCE: 0723fb84a08f4ea09841f32a\nCT: \nAD: 140be561b6171eab942c486a94d33d43\nTAG: aa0e1c9b57975bfc91aa137231977d2c\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 48f7b300acde77c3a00e8dcde06063761d2dc64809db5d39c7a671d2b2f7902e\nNONCE: 194e611ed5980b0e93a4a388\nCT: \nAD: 72ce59bdf0059bf33e03e5fc21f3a6df\nTAG: 7d26231fd58aea00331165c8adf912f3\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 94233d297c08899ccd69eeec3e4e258eacabee0cdc2c363c352e833200162599\nNONCE: 733fa0c7e0e692b0ea66a402\nCT: \nAD: b5bcc7ef6837b61253db277118fafc9d\nTAG: 024174b6f7fed276966d17b31cab2b47\nIN: \n\nKEY: c90ac1e868bb79467a58383f02440f9155d57dc719f0a22d0d6f088ebe7c18ae\nNONCE: 149a0b9691b35750f72e03e9\nCT: \nAD: 2426db7f430a090f5132c63d23504350\nTAG: 807b58bebd6de9752f62eec313def53b\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: efc390eb39011ec8078700f4de848298c26d750c9127fa79cb8c1089038da129\nNONCE: 13b65b7cf33db33b3d5afb1f\nCT: \nAD: 7e56ab79b176488969e51a58de554979\nTAG: 35ec21526ab815582d201582e7ddcd77\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 5c202933d7efedc1bdc4fcf72794bf448f6c22959978e1947e399d9f3386bf2b\nNONCE: fef59a2f3e7d9eae573ff06a\nCT: \nAD: 9cdab8e46ef227f113e1ce1dc7ee2733\nTAG: 76bf3a22f991625dda441975b4af8952\nIN: \n\nKEY: 577cd9f1a9f0f4b61455db0d5183536c2e5d000df5c812e140ca746ea9d05cbd\nNONCE: 7d6a93560b53453681028e45\nCT: \nAD: 7b4114eb668366fc26bc2078f04cac9a\nTAG: 294409118a4ac46ee9444464ac352cd6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 942c44274a9dabdb86328484ee933d0d632efb6a074323ab41fac267c0b25e48\nNONCE: 961645b7ec62bb4e4bda29f6\nCT: \nAD: 0e4f8509aaa009192fa04425b9d803b9\nTAG: 2fd7f29b68ec985ec564926484df7e3d\nIN: \n\nKEY: ebacc6cd567c245f37100d76f2898a471a435b07d605a3251835f450f9861da3\nNONCE: 164617867a09dd08d75b8675\nCT: \nAD: 7f5b2c707a8199c8795d7d440664e9cb\nTAG: c8881e8c4dd1d62a2cf6f8458b45c0af\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 415fbefbe947204a5a4412372922cd68ef7cab6b7f48d8da868f24c2426e755f\nNONCE: f939844564c5b26e18b907d8\nCT: \nAD: 462ef98fe991867d0888954adc772edf\nTAG: 811b9c99e66456002558c8a8392b04ff\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 8f82e4eb127be9b5a2dedf8f3f16ed46df0443eab39d604523b2a0909044426e\nNONCE: e0d06f20e17990d17abedfd3\nCT: \nAD: 81f78234cb6c9f8c8134a81e29712457\nTAG: bbde500c67c81f7d2ecb214b33f298b6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 3395a1485315c5b5e6353acb05ae9499c440a2e9f5c57494662f827235ea314c\nNONCE: 3b7e632571602456b49880f0\nCT: \nAD: f283f80226dacb69c8af089ec6b59e81\nTAG: 84c8beff4b0d160ee68ac613097f51\nIN: \n\nKEY: 737ef66d81c3c2610f77f90244b45c9fcbb3f46b41c8cfa959f1b64bf1af9a30\nNONCE: ee35b4f52756562c53f34710\nCT: \nAD: 591d20b3dad931c15958a6c08945f2c0\nTAG: 67786146498e15b97785ed29e3cf4d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 667eb074e723473425639188aeb1137645968b37fd51ac85ecf887630537e790\nNONCE: 66259c4c34952325039dae8f\nCT: \nAD: be4e71df8b90ae61fcfe2522fad707be\nTAG: 313f387ceb2fee4113a3b97a75a0cb\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 864c3c19d43a850bf696f546be59fa4939ee7a2b39fe0f3e56f6b777c4929d09\nNONCE: d53bb663a8d0aac07eddd12a\nCT: \nAD: 4ad4e048c24b370530f482a4d7a6d1ba\nTAG: fc0e69cd020693a0186da50cdc6f69\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 42b434401a46ab08b799571e8b2ff3834bf002ca910989ed86bafd5a6142d190\nNONCE: 81eb9cc03444f5d0dc3b76d9\nCT: \nAD: 82f75629976fd7ab11ef70c6f8f977f9\nTAG: bd1bb7d7cdb7f25a457b85e939c131\nIN: \n\nKEY: 7e4d9071738036cad1ddcaf8439d0f243aef78116dff67269fc3fec66b86384b\nNONCE: 3a7fbd41615e656a0ff3738a\nCT: \nAD: f4adfe43c17af941168fa4b879ebf209\nTAG: 48a7f7b1a1c05f20e9bf049bb562b2\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 345e15dfc70d4f0609cbc5724276f606ab3aa9d0ae4bcb5a6536dbfef8f5df62\nNONCE: 970bc624e62e6834b7f3fe5d\nCT: \nAD: 44a5fa62b3babf2c86064cc0a65b1cb8\nTAG: d7b83a03f18f6623bd41acc3f6f3aa\nIN: \n\nKEY: 6dcb770c7777225902bae16a6e77045ffe682a7985c265566c61c4ffb405a547\nNONCE: 1faf5b86290e23ff7411c146\nCT: \nAD: fbe8e5e071969c7baf0f4c1c2a830327\nTAG: 78a4078b4decc5e34d477e308f0cc7\nIN: \n\nKEY: ef9a0377ae02c600f6fdd5dd6f4f7a30954235539bc9b3fce0085b3b30d6c354\nNONCE: 33db5adfa43c37d002e82038\nCT: \nAD: 945b8a540c57923e7cd4ca319e40063d\nTAG: 3c0e1f73433c5d229e739fed399ff6\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 6ec5526e7cff0b75f9af20ea59e7cdbaa91a4194d51374527909a3bd6d8ba3bb\nNONCE: c23ff927bba76205628506bc\nCT: \nAD: 8ed268badda27f8fe5a16ce8a3d7fc2e\nTAG: 3079599fc1b2e66e1c9f668cf9c001\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: fdf860cfc7e769d262f1e0b0640a56e0081c75ea96376e4a51ff728dc4b11503\nNONCE: d29767af7bb47bc18fd7076b\nCT: \nAD: ee7e40f375e100fdaf39765d60429289\nTAG: 19f95691d2fc7d7724474ebb501738\nIN: \n\nKEY: b548e4934f5c64d3c0f0b78f7b4d8824aac46b3c8d2cc35ee4bfb254e4fcbaf7\nNONCE: 2eede1dc6447c7afc4415358\nCT: \nAD: 8bd50878c430718b7b3775fed76e5aeb\nTAG: a7186df4cec4bcf921ee8733359567\nIN: \n\nKEY: eb70ee93654a3ae49775d315e51c758bc0b61c1fa848089fc12c65419a00afc2\nNONCE: 87cd3cadd925b79636bf128a\nCT: \nAD: 80b04fb39d7b6096be12dec866de2d37\nTAG: 3f9902ce6dd2fefe0a9578276250f0\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: db8151b0d80c930331ed8c7ff7d8038b34ad20fbf537844f7ba9912b71213f1a\nNONCE: 32f9e46e555eeabf12bc59ce\nCT: \nAD: f2ba52d1e09c37eebdcf15250979643e\nTAG: 8817c90146b70b252c124e03ada704\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: 65b90acf1544349bfa1871163c92680139aa9a5e2b620c43b41cc59fe1cfc15c\nNONCE: 5cff688f2ba29cf9a6d94a7d\nCT: \nAD: 43d55cfde3d5832f0adbf3dc47943d00\nTAG: bb787f2450cda0c33b08579dca4e63\nIN: \n\nKEY: 34d3dd0a9cbec32dfe94c9707b48dff9e2ecdbee7ca28b3ca9dabbb3701ae493\nNONCE: f8e05f6e7a04cadca8b5c4fd\nCT: \nAD: 9e52b1a7c1fb736d659754e671caa840\nTAG: d6615a18f437f38311f5ac3a9f60\nIN: \n\nKEY: e8ad0a2b1bfceeac69ed3e075d4dc5fc03b3633919bc5edf0f1ffd9842424985\nNONCE: f8b5b6bde3fc26b7a553ecef\nCT: \nAD: ed8bc8a123b35e0e7ed3aa8f8820b0fd\nTAG: 008bb8ed513bf8d3210d1278382e\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: ac9d68e15be409d5998885b714bb51f0d5a75df29e4ed7be2c1c1e4c6db49ae4\nNONCE: 4bcd1869cdcb16adb45dfb98\nCT: \nAD: 9f81a65554c7185181fec88601051cfc\nTAG: a7ca610547cba6ec333371528c0c\nIN: \n\nKEY: e9a4f481187083070dc1956a7c34ee9b86791cd6e40353e3f868560ee77127c3\nNONCE: b7894710eb0cea0acf1838fc\nCT: \nAD: caf33a8552cd0caaf1333c9aed7eda13\nTAG: 326e875a09b9df1ada0321a005f2\nIN: \n\nKEY: 0220d839e195821944f343a71dde45006a2c3600df8883bc83a9fd60cc67771e\nNONCE: 8d22fe9571e9096c22f3fae9\nCT: \nAD: bad23a8f33857c447e89b0691b7fb03f\nTAG: 43c0cabf088b71fed4dabd63c2e8\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: b253cdbb8519abd630435f277d9d69f25c3fc7c87004e506092f05855854b9a9\nNONCE: 493bacee0dbe6edb5b77d1fd\nCT: \nAD: ccd5a9521aaa06b967316be581487a63\nTAG: 01afc617f6a2786dcf13ecc00bbe\nIN: \n\nKEY: a0cf288734824493aa3673f95e68d07e289d394a04f2e3e5881afab773f1e242\nNONCE: 2c18ee9f12c5229c0cfc3f43\nCT: \nAD: 0b89b94d636559adc46902e463514e12\nTAG: c933b5cee0de1a2cab183afe3ec5\nIN: \n\nKEY: 3271f86968b3fd49bf4ec0e572616e2b96edd4a530c519b542ca926b09a92efe\nNONCE: af184a643754b70eb60b15f1\nCT: \nAD: cd839a71cd04bac3bc3c17871b6853f0\nTAG: ee6ba4f92dcee9c20b734811318a\nIN: \n\nKEY: 31a3e5aa9da7b44c302cd716937584195adfd26f24a6c49720a50d49762df80f\nNONCE: 9a999c5f8dade4184aae1301\nCT: \nAD: 0d84dd614fc04e58a971a270bec5b8f6\nTAG: 230bc3c4cb7c46e73ce3662d1e15\nIN: \n\nKEY: 865f524ea89d3299b372c01f5c072c1fe07f78e86620fcab5e3e96cd3044962e\nNONCE: 8df4d357882c805d5a5a5d95\nCT: \nAD: f9b70b9d4bb6f9562b10cb65ba1c0a7d\nTAG: ab59a2107248e6651e3d6f3e116d\nFAILS: \nNO_SEAL: \nIN: \n\nKEY: c12c83994e125c98e588d93f968572460345c44b5f94deecd538f0e5e7b0fd66\nNONCE: b684791dd61b9d940a0dee14\nCT: \nAD: 57a128a7ac50137520ffce721271b8ca\nTAG: e322ccdcd7594",
@@ -2244,9 +2265,9 @@
     "ac4f2cd8a71f0fb078323449c5bd4e3cac8422318b06b44c49ccb701d69831\nTAG: 7347166e\n\nKEY: 36f610b6f08b020f4d3ca0faba582222016aa4ae44c619efc3aa8a3d794c4678\nNONCE: 842b957ca5f56f3b3686269f17f7e5b712593b8f37fd6079459958e31e07955f1a1861204e4c9e5a6b70205a0f45a33229b948524f7102dbaaf4e7a66900006168ec0c99e766fe89da8ae72dcda8e071f4c2fe75ce3cf903dd7b53ddf5ef95a88663c381afea00abc5e6be5c6477a9c5152312cf54af7b0c718a5985e5e8c7ec\nIN: 78a7deed4eb613cf2b3e572a3ff47e6551c7908fded855fba64247493a7360505f1a08e7ab850d00d02b970e3a2b5da9bb6c33\nAD: 6f91e23494601696841fd9dc0a0e7fdcb6b32aaaf2ee7b84270a59aaa2bb13b5bd1990a9fe3b0534751f10c2058dd3a550fbab61bdb4525fe6bd45326419a48339398f3191e7ddb0d8f65f4b00b4f5b6ca4aba9e99edcd0ad05f\nCT: aab48f5510ad845ebe79e7689dbf7ffb1dc3c6a810c1b754576576675e77fa81eace7882045220baded90ac098c6c65f26613d\nTAG: b21bccec\n\nKEY: 14644de3b6efc121077952f76c3e76ce847306a355e734e0869b51506f6bd979\nNONCE: 84a47e799c51d8052b27644399a4b807487d64c06ea037b62af6a0b0d1212f4acfd1d080518c1a9fec5b2c8ba4699ad7df155715cd049f5085e86c0601fab79ef1472fbb35065e7dfee9e4077e0e365d185f3c88564abf1fd1c3d3bf1a209a5e24a2b027895ef1524fe199c31a4bf690ea3ce209cbb9ffcbac4c06461e010fb9\nIN: ed1a2abba7e782a8f3625f5abcf613cb3d353837fb88edc5b117fc35ab553e244a60dd2ed67aa6b8a99ade1bab69cf04405957\nAD: 7e223758e23e4bb99ee7406030a2db698d5e32c69d5f19170c052bd597bbfd4bbbdcebbdcc801b1bcad869da195a8c4452bedec0fcd91fedb6fa49c38e187e8b536b69da683ce4a322b81e70c93eb66c9010ca3be5d54200d87c\nCT: 80b8c3829d991e5b1331cf229d7448988ed6271efccfe84998acc67e924c73362337da0d697f4b4613d06a88bb4ae8fa81c2cb\nTAG: 38b59916\n\nKEY: eb3fe1c8bb57d72fea9f9e9cc3cc746d41742716dd3cbf574eee95162bd93f9f\nNONCE: 1ee1a2fe7dab975fffd19230d80804b45662855c0a5bbd2802e47b2d3fe55b0c15e2383e7070404ce46670c0a2840a6e14945c5bd9ac521bad8ca7effd6dbe71f74eca082a490d15088d7bbfeb9cbb1e8ee86d77b1db35b43a259a14ab6b771ac58ce36bf99d28417a04d2d3ff2d4380a6b23ccd6e68b0ae58a6fa54c973b6a0\nIN: 0ace576340e524019888cb4900fd9b52e5382e4e36ac9a969c5f6bdddfac12c2d991ea9e2ed5f68dc4a51d62dab83df8f838af\nAD: 28d402e6e8cce27e47a0eb03b5497915c3b71399fb95f4bc6d3255cad73508eed443cd44e59cacf9177dd3ac1cdca5233bce39621227951d11f2a2012930822ee929dc791f3eaf1a97e219db04d6f178b804de60224ab120abdd\nCT: 50096632df34a1f2d8848304e20060d999a5b1eda1932774e30f36026da8c6c0baca7f6e59a7c74018c5f51075008b74424bd2\nTAG: 7d9d2417\n\nKEY: 85ee354b4675a9c5d16e3d6f4118043bd92f209f016f49efab7ce3023b78112e\nNONCE: 5c3b5a95147880f9d14373bc3886e92036a0abcb49fb6768e2811761cfcddbcac813bea95a5b76fa1ce5fc726708ddeee5d1a9196d31eb1f0c1d4992ba37a9c4179d223c460ff2b512a9d3cf3562c586d793efd94a5e93d4b1e86ae96c3aa6711a291ec710dfbd7ec46b2ed4f4085df511fabcc5e42bded5214253d235f12d14\nIN: 1b56de101a75bb9d1a5e77590be302837d3921278e480347944b92975e819e7a233339f31ecf02b874842fb5a136c810a9a9ca\nAD: d2eb4e760ed4fb687b32c6bd073bffaf9631ed3ab83101cab236352d024cf422b917a7660a484be236e4d3b3fa3343d3f9e87d86c50834a213b7ca2a3212c254564e1c59551c7bd3e01710a7d8c8419320a6d3362489aa368424\nCT: 67dec658a84468cb86268099e03ce701e9936c27b50059b5c9e8743df7df5b828364ab7025f854cb9e3cfb27ca5b717502b838\nTAG: 65a1bfa1\n\nKEY: 6f79bf94da7dde3c86009934d9258f1b3fc2f5382aca9c9cb8e216eed235f34c\nNONCE: 83e413c8e6f76b32aeb2960c11aa9e522d3994e14c18609c634c9cc1cf94f2c49a5347d3f440367f08a3322eb3560675bc4715d03abbe0da4a75208775e8bdc3ff2d33daa301f53dd75a83f74c998245c1826ad41602c3fea313098d20a65e417e7c6ff954d9c9b2458a04ab4deddf07dd22bc409211dbd121f5a95215d40094\nIN: 738516823e8f5d23f3181b297eb70be633e3b0cdd61117384e474e3223658167ad6afd83d9839bc925876e4e41a001f678a06a\nAD: 02a59b404f7fceabc06e0988bcbfbca1d08f75a83f2cb9542edf106702e2c9964d7e37ef86fb368a9890a4f2ae7f58f336cb2df990cdaa2775959c99cf1d11a59abe348cc5a47f98c447e6500b1013b38418677bd582c5fbdcd8\nCT: 183cc63f537b301e928a1efa211818a128964e5d025c7dde9ccd69e6a8dddc2b9824520e31d52cde506062d225407520a00155\nTAG: bb1df68d\n\nKEY: 0c5aa8e0b1979183b997f29362ae83700d3ba6190a210fc90541b17e45a46668\nNONCE: 96a1f2559204788f6bb0ea50bd598614a7ce518ec4dab951e9517bc46357448a6b4aed200ee21a7543fbff861ed56321195675d9225cac72547d3e4880b9517672b86206e9acffba53d66526e919587e7b284a612aec391517e907f2bf6a625a990466d66cb14c690be17b7a22085ab032a05dbc16a99437670cfa2bb8a283d6\nIN: f460e28cb67fb2b0aa5315c25f8132e5a8298ae3077ee0bd918fe1acd6312a98a3412a3198c834beb932200281fe6128a08be3\nAD: 9c410a60931ef1cb5f6fa9c7da0a96ca537daac174fd4f1bf247de1e25d3dd44a37f54d58ca48d1ecdcf2ebff8959c2db0ac82244ac76243404adf45be72aff4b19be063c088e1810f9eb4b894f405c61691e2789297b17430b8\nCT: 3e12c2a17cad65077073385c055054bc8f72f1beca59b0636384d027dc1350d39a8f3c77f5bc26eb916287dd742bcd3a819299\nTAG: 154a3b39\n\nKEY: ace49b23bebdbb36cae24809c68cd4763c000c689c77d230256f6e5206ba178c\nNONCE: 34e829796c7d186b3c83c894b3f36f3f07d66261670f4c1f74c83b074b2b7e5fabd8756d2c9676bb52e9c7a62c7c26376128d1ffda5f9ad5d7b48724d46672eabf83ab9e6cd596510bd9ab3be81089c4262a9f8a88820c6e27a49593bf91b9dbc884b4548aa9ec4bed9e1d5be57d413553459f5d8e7cbca84ac89babb45f501c\nIN: 9c85b9c441034e26c5ebf04580cf617eea19a001098c910a7eac423af2f5fb2cee0335fde1fe56bdfd31af513e99e92d5ad7cd\nAD: 419583e7bd2f698ddbbdd429a81654c37b07dd2d80f34c9ac3d0f9ef7329f39fb5c21db57bdd496fd69097736989fd0f1d3c803ebbff7d128ac31873754f881247896907574bcecfdf2eb3a5e6996050eafd68f0401d0543fd46\nCT: 9141c922cb598ae9dd3aefd9593e2788870e9ac546fb3fbf5ba0bd1479216743cb603c4cc2fad030796f9cdb5b325ee4c33d8a\nTAG: 356fdb25\n\nKEY: 69e095a9ae4cd697869b845c4e848b7fe1511d1ee334ffa63ea427eee18a6b54\nNONCE: 7ae669a8b81bbcc2b72724a14169f1e2e1c114c0ff3ef33434a82d368272525398ae1a9aabb1c50ddebfca5e853dde04b46518bc94b91b51364c82301087ca30852ec7ac52f51ecda1c2ca2e099c040929f6d1236157011ddf7e928df7fb329a012752eb66cdb725e416e7a10108b2bd4f676b5ab85b8f33438c273bddb8cffa\nIN: b2727222246b940448a24741984ab6afe5e9474e60cbb8ce714110390f1c90b33ed0ec0267b86cc305b9807e370ca146bd61c4\nAD: 74a1899056c4ef9d848cd7c8d8ca377c6810912c62e428fe5acb60908abae48c887e7460943e9d6795fa6203b994e05799ab8edb55c29fcdccc3c41b3b74346f354a214d3abf891b8058e55461d3f68c3a2897bc514212aac91d\nCT: ddeaac80cb1db067d40143a382eedb2183809153db5b23528c476ae25c9db5d28d53dbab6f59ac5c016150f8384f5b84767189\nTAG: 0936e1ff\n\nKEY: 9c8e8c0638b76c552d1ce80028b707286bf2a84568d7021179be55708e820adb\nNONCE: f414375eb3faa866349ee5a6f11db10b2d2b32719906fb25f22ac2053e9f402c4cf545ae973336ada616d99fd57e7b2fbb6bb8f167fd907efbd9983515d509cbb6966778bccfdedacd9cb58b0a8fbf0a3900128f9f47317485e2c8e30a65f68e43ff8ed0b20c83681e750214b8f004f2529f1f3fb06554a47ffb8532edecf949\nIN: 8af304c8d9ff794d784cca9bafec22868cf7cf5c038b2afa7cefbd84be5d98b50d3009bad9d69083abf47b5068d59465c10389\nAD: 913b191b128e8d021ca46d29455b8082e7013ea49e1c931fe94adf3cfde26785ad9e9828eb48bdda066eb530c5af62481eca4401fe31eb320f6c52011db38f98144a0ea5f9fa6d5c373c76eead287e67e83f9dde0f2e27a6c40e\nCT: 63a8f8e0183e5c30532dd6d5235d6418828243e4ef9aab82ad537e20fa11fe188d440a7fd5a53669422c65fed98a00e4631f44\nTAG: 33491cd4\n\nKEY: d74eb3cfdd9fd9fe176415e1973a12f0110ef55568746e99d07d91b339cee79f\nNONCE: 06b5cc871a93bf13726836392a7e134f2b122f2238b086f18ec88f16d21f1914551a63a169e97c9dadabc9f488bf54a7883e618e59472041dd74ad356e7d92f8666af1b4b2cdb35fb0d722ac0b31d2fd475052507eafb98d5c2109b5f10254957fc9b4c6dbfb3bf4692771b4ed305d7521f5842d1aeaca0ffbab8247fc3b76bd\nIN: d654f510806c9ece9c12dc749cb9a08467cac2cad1afcf3b4a41a2e0873dea9bc0cf61b7aac2ebba93eb46ae6c5f11610d0b41\nAD: 9855a05c20be9b2416fa0032d94db428c949e68262f8a084ce3762f85c3edbe6175ef48279141822c101929aecf36e8a68e8fec8524945debb54e046b3c71a44630e569ec849691c7f0f9a74e374d27732df33578c5bde492907\nCT: af6f67769f0f099e6590e97dc6d605dea986772a68966408e81d49b1e8d24fd835daed0d4bda048c47d5ef87f22752e99e1446\nTAG: d449dec7\n\nKEY: b5f849da887e3c1878b6775aff7e49f5f31ed8cdf9f79ead5b36219eea87af80\nNONCE: 63f75fd55a8bf19eadfa23eb7a3e5c8fd13d79f6bb6ba414d2027fb08283f5108c11c2d49db52f4c68c11164c8a1585bf115512cbe5f5aa478c6c0e91864f5198862a694f0c2471aacd32ba57be1a33f04a56fdc60a3dcdde73c7714c10eb67b749433b1b3027b3c4b4f29fc57c3eaad9eefd033dc4d42bc75b36e7445a383db\nIN: c1a27f693387a1c8f5fd1eed0c5cf3111897dc8797b4e63e89bcea06cb19b734e354d9f539f5af700641f0f4acf91ab52147f0\nAD: 6dc78b3a5ea409838b533ebd77cf1d1b4808fef131275a0d4dcd94ca0f55b9dd86017bd664e036c2fa756c65a7a7d246229900fa468349eb2de18b5bf1af0f7da56ed0377a65f5e650ddf081c4a29eb985456b276b4d303b7832\nCT: 837a",
     "ff99c32f665841239e0897134461fc3e8faa8f9965eca5dae67b2934e0816f39d36c45ef8a0b8066ae4f9752e65ef3a6d9\nTAG: 94b73bcf\n\nKEY: cd670a8ac109d0f0e436ee42e490d5576bb7c13230f727b150b473bde659826d\nNONCE: 719191db1dc5ae92cf75cd8ff02ff036e78d6bef59714e5d40c24301443952148c61ab2e7e15d95f8d1792ee307a27c0112ec1b28c4a0416f76290b77d89088542d13649d17af09d6c5302438895534dedbb587f543c0d76b1e3e065ce6a261473d27dab6a928ad1fc786333dac512f3b521760dd1f67907292d868423a4f64b\nIN: c94ebec7d8aa421bfa9a0203520e02570338d12359c5b16d51050cd3f802351b17cad85b52ea9b42147f528a25e52c170c6308\nAD: abdf817a7ff3f28bd0b5ef0c2ec02ccde1799d4dea806580941f63b7840b2deedd3873ad1c3186ee3c6b6fa95062fcb56e33c6737532e7c326e116f2da4cc920c8bb354e8d2e27c1920962e16a4c89521c4e1699f2145f742d36\nCT: 286b594cf9a92b2d7348f0c75619e14916f2cafb990cc2d6aa07162d0703a9f7591e40eae402edfc64cafbedfc7ec2147acd51\nTAG: 22d3ec0f\n\n",
 };
-static const size_t kLen29 = 81764;
+static const size_t kLen30 = 81764;
 
-static const char *kData29[] = {
+static const char *kData30[] = {
     "# Generated by \"make_cavp -extra-labels Cipher=DES-EDE3-CBC -cipher tdes kat_des/KAT_TDES/TCBCinvperm.rsp kat_des/KAT_TDES/TCBCpermop.rsp kat_des/KAT_TDES/TCBCsubtab.rsp kat_des/KAT_TDES/TCBCvarkey.rsp kat_des/KAT_TDES/TCBCvartext.rsp\"\n\n# File 1: kat_des/KAT_TDES/TCBCinvperm.rsp\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 95f8a5e5dd31d900\nCiphertext: 8000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: dd7f121ca5015619\nCiphertext: 4000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 2e8653104f3834ea\nCiphertext: 2000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 4bd388ff6cd81d4f\nCiphertext: 1000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 20b9e767b2fb1456\nCiphertext: 0800000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 55579380d77138ef\nCiphertext: 0400000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 6cc5defaaf04512f\nCiphertext: 0200000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0d9f279ba5d87260\nCiphertext: 0100000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: d9031b0271bd5a0a\nCiphertext: 0080000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 424250b37c3dd951\nCiphertext: 0040000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: b8061b7ecd9a21e5\nCiphertext: 0020000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: f15d0f286b65bd28\nCiphertext: 0010000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: add0cc8d6e5deba1\nCiphertext: 0008000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e6d5f82752ad63d1\nCiphertext: 0004000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: ecbfe3bd3f591a5e\nCiphertext: 0002000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: f356834379d165cd\nCiphertext: 0001000000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 2b9f982f20037fa9\nCiphertext: 0000800000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 889de068a16f0be6\nCiphertext: 0000400000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e19e275d846a1298\nCiphertext: 0000200000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 329a8ed523d71aec\nCiphertext: 0000100000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e7fce22557d23c97\nCiphertext: 0000080000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 12a9f5817ff2d65d\nCiphertext: 0000040000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: a484c3ad38dc9c19\nCiphertext: 0000020000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: fbe00a8a1ef8ad72\nCiphertext: 0000010000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 750d079407521363\nCiphertext: 0000008000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 64feed9c724c2faf\nCiphertext: 0000004000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: f02b263b328e2b60\nCiphertext: 0000002000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 9d64555a9a10b852\nCiphertext: 0000001000000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: d106ff0bed5255d7\nCiphertext: 0000000800000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e1652c6b138c64a5\nCiphertext: 0000000400000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e428581186ec8f46\nCiphertext: 0000000200000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: aeb5f5ede22d1a36\nCiphertext: 0000000100000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e943d7568aec0c5c\nCiphertext: 0000000080000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: df98c8276f54b04b\nCiphertext: 0000000040000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: b160e4680f6c696f\nCiphertext: 0000000020000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: fa0752b07d9c4ab8\nCiphertext: 0000000010000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: ca3a2b036dbc8502\nCiphertext: 0000000008000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 5e0905517bb59bcf\nCiphertext: 0000000004000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 814eeb3b91d90726\nCiphertext: 0000000002000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 4d49db1532919c9f\nCiphertext: 0000000001000000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 25eb5fc3f8cf0621\nCiphertext: 0000000000800000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: ab6a20c0620d1c6f\nCiphertext: 0000000000400000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 79e90dbc98f92cca\nCiphertext: 0000000000200000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 866ecedd8072bb0e\nCiphertext: 0000000000100000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 8b54536f2f3e64a8\nCiphertext: 0000000000080000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: ",
     "ea51d3975595b86b\nCiphertext: 0000000000040000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: caffc6ac4542de31\nCiphertext: 0000000000020000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 8dd45a2ddf90796c\nCiphertext: 0000000000010000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 1029d55e880ec2d0\nCiphertext: 0000000000008000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 5d86cb23639dbea9\nCiphertext: 0000000000004000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 1d1ca853ae7c0c5f\nCiphertext: 0000000000002000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: ce332329248f3228\nCiphertext: 0000000000001000\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 8405d1abe24fb942\nCiphertext: 0000000000000800\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e643d78090ca4207\nCiphertext: 0000000000000400\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 48221b9937748a23\nCiphertext: 0000000000000200\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: dd7c0bbd61fafd54\nCiphertext: 0000000000000100\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 2fbc291a570db5c4\nCiphertext: 0000000000000080\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: e07c30d7e4e26e12\nCiphertext: 0000000000000040\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0953e2258e8e90a1\nCiphertext: 0000000000000020\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 5b711bc4ceebf2ee\nCiphertext: 0000000000000010\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: cc083f1e6d9e85f6\nCiphertext: 0000000000000008\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: d2fd8867d50d2dfe\nCiphertext: 0000000000000004\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 06e7ea22ce92708f\nCiphertext: 0000000000000002\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 166b40b44aba4bd6\nCiphertext: 0000000000000001\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 8000000000000000\nPlaintext: 95f8a5e5dd31d900\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 4000000000000000\nPlaintext: dd7f121ca5015619\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 2000000000000000\nPlaintext: 2e8653104f3834ea\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 1000000000000000\nPlaintext: 4bd388ff6cd81d4f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0800000000000000\nPlaintext: 20b9e767b2fb1456\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0400000000000000\nPlaintext: 55579380d77138ef\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0200000000000000\nPlaintext: 6cc5defaaf04512f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0100000000000000\nPlaintext: 0d9f279ba5d87260\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0080000000000000\nPlaintext: d9031b0271bd5a0a\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0040000000000000\nPlaintext: 424250b37c3dd951\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0020000000000000\nPlaintext: b8061b7ecd9a21e5\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0010000000000000\nPlaintext: f15d0f286b65bd28\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0008000000000000\nPlaintext: add0cc8d6e5deba1\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0004000000000000\nPlaintext: e6d5f82752ad63d1\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0002000000000000\nPlaintext: ecbfe3bd3f591a5e\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0001000000000000\nPlaintext: f356834379d165cd\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000800000000000\nPlaintext: 2b9f982f20037fa9\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000400000000000\nPlaintext: 889de068a16f0be6\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000200000000000\nPlaintext: e19e275d846a1298\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000100000000000\nPlaintext: 329a8ed523d71aec\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000080000000000\nPlaintext: e7fce22557d23c97\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000040000000000\nPlaintext: 12a9f5817ff2d65d\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000020000000000\nPlaintext: a484c3ad38dc9c19\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000010000000000\nPlaintext: fbe00a8a1ef8ad72\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000008000000000\nPlaintext: 750d079407521363\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000004000000000\nPlaintext: 64feed9c724c2faf\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000002000000000\nPlaintext: f02b263b328e2b60\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000001000000000\nPlaintext: 9d64555a9a10b852\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000800000000\nPlaintext: d106ff0bed5255d7\n\nCipher: DES-ED",
     "E3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000400000000\nPlaintext: e1652c6b138c64a5\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000200000000\nPlaintext: e428581186ec8f46\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000100000000\nPlaintext: aeb5f5ede22d1a36\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000080000000\nPlaintext: e943d7568aec0c5c\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000040000000\nPlaintext: df98c8276f54b04b\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000020000000\nPlaintext: b160e4680f6c696f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000010000000\nPlaintext: fa0752b07d9c4ab8\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000008000000\nPlaintext: ca3a2b036dbc8502\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000004000000\nPlaintext: 5e0905517bb59bcf\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000002000000\nPlaintext: 814eeb3b91d90726\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000001000000\nPlaintext: 4d49db1532919c9f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000800000\nPlaintext: 25eb5fc3f8cf0621\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000400000\nPlaintext: ab6a20c0620d1c6f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000200000\nPlaintext: 79e90dbc98f92cca\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000100000\nPlaintext: 866ecedd8072bb0e\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000080000\nPlaintext: 8b54536f2f3e64a8\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000040000\nPlaintext: ea51d3975595b86b\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000020000\nPlaintext: caffc6ac4542de31\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000010000\nPlaintext: 8dd45a2ddf90796c\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000008000\nPlaintext: 1029d55e880ec2d0\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000004000\nPlaintext: 5d86cb23639dbea9\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000002000\nPlaintext: 1d1ca853ae7c0c5f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000001000\nPlaintext: ce332329248f3228\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000800\nPlaintext: 8405d1abe24fb942\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000400\nPlaintext: e643d78090ca4207\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000200\nPlaintext: 48221b9937748a23\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000100\nPlaintext: dd7c0bbd61fafd54\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000080\nPlaintext: 2fbc291a570db5c4\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000040\nPlaintext: e07c30d7e4e26e12\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000020\nPlaintext: 0953e2258e8e90a1\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000010\nPlaintext: 5b711bc4ceebf2ee\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000008\nPlaintext: cc083f1e6d9e85f6\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000004\nPlaintext: d2fd8867d50d2dfe\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000002\nPlaintext: 06e7ea22ce92708f\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0000000000000001\nPlaintext: 166b40b44aba4bd6\n\n# File 2: kat_des/KAT_TDES/TCBCpermop.rsp\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 104691348998013110469134899801311046913489980131\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 88d55e54f54c97b4\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 100710348998802010071034899880201007103489988020\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 0c0cc00c83ea48fd\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 10071034c898012010071034c898012010071034c8980120\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 83bc8ef3a6570183\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 104610348998802010461034899880201046103489988020\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: df725dcad94ea2e9\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 108691151919010110869115191901011086911519190101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: e652b53b550be8b0\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 108691151958010110869115195801011086911519580101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: af527120c485cbb0\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 5107b015195801015107b015195801015107b01519580101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 0f04ce393db926d5\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 1007b015191901011007b015191901011007b01519190101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: c9f00ffc74079067\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 310791549808010131079154980801013107915498080101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 7cfd82a593252b4e\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 310791949808010131079194980801013107919498080101\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: cb49a2f9e91363e3\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 10079115b908014010079115b908014010079115b9080140\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 00b588be70d23f56\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 310791159808014031079115980801403107911598080140\nIV: 0000000000000000\nPlaintext: 0000000000000000\nCiphertext: 406a9a6ab43399ae\n\nCipher: DES-EDE3-CBC\nOperation: ",
@@ -2258,9 +2279,9 @@
     "CRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000020000000\nCiphertext: b160e4680f6c696f\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000010000000\nCiphertext: fa0752b07d9c4ab8\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000008000000\nCiphertext: ca3a2b036dbc8502\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000004000000\nCiphertext: 5e0905517bb59bcf\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000002000000\nCiphertext: 814eeb3b91d90726\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000001000000\nCiphertext: 4d49db1532919c9f\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000800000\nCiphertext: 25eb5fc3f8cf0621\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000400000\nCiphertext: ab6a20c0620d1c6f\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000200000\nCiphertext: 79e90dbc98f92cca\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000100000\nCiphertext: 866ecedd8072bb0e\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000080000\nCiphertext: 8b54536f2f3e64a8\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000040000\nCiphertext: ea51d3975595b86b\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000020000\nCiphertext: caffc6ac4542de31\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000010000\nCiphertext: 8dd45a2ddf90796c\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000008000\nCiphertext: 1029d55e880ec2d0\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000004000\nCiphertext: 5d86cb23639dbea9\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000002000\nCiphertext: 1d1ca853ae7c0c5f\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000001000\nCiphertext: ce332329248f3228\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000800\nCiphertext: 8405d1abe24fb942\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000400\nCiphertext: e643d78090ca4207\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000200\nCiphertext: 48221b9937748a23\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000100\nCiphertext: dd7c0bbd61fafd54\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000080\nCiphertext: 2fbc291a570db5c4\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000040\nCiphertext: e07c30d7e4e26e12\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000020\nCiphertext: 0953e2258e8e90a1\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000010\nCiphertext: 5b711bc4ceebf2ee\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000008\nCiphertext: cc083f1e6d9e85f6\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000004\nCiphertext: d2fd8867d50d2dfe\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000002\nCiphertext: 06e7ea22ce92708f\n\nCipher: DES-EDE3-CBC\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nPlaintext: 0000000000000001\nCiphertext: 166b40b44aba4bd6\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 95f8a5e5dd31d900\nPlaintext: 8000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: dd7f121ca5015619\nPlaintext: 4000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 2e8653104f3834ea\nPlaintext: 2000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 4bd388ff6cd81d4f\nPlaintext: 1000000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 20b9e767b2fb1456\nPlaintext: 0800000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 55579380d77138ef\nPlaintext: 0400000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 6cc5defaaf04512f\nPlaintext: 0200000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0d9f279ba5d87260\nPlaintext: 0100000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: d9031b0271bd5a0a\nPlaintext: 0080000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 424250b37c3dd951\nPlaintext: 0040000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: b8061b7ecd9a21e5\nPlaintext: 0020000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: f15d0f286b65bd28\nPlaintext: 0010000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: add0cc8d6e5deba1\nPlaintext: 0008000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e6d5f82752ad63d1\nPlaintext: 0004000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: ecbfe3bd3f591a5e\nPlaintext: 0002000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: f356834379d165cd\nPlaintext: 0001000000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 2b9f982f20037fa9\nPlaintext: 0000800000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nI",
     "V: 0000000000000000\nCiphertext: 889de068a16f0be6\nPlaintext: 0000400000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e19e275d846a1298\nPlaintext: 0000200000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 329a8ed523d71aec\nPlaintext: 0000100000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e7fce22557d23c97\nPlaintext: 0000080000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 12a9f5817ff2d65d\nPlaintext: 0000040000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: a484c3ad38dc9c19\nPlaintext: 0000020000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: fbe00a8a1ef8ad72\nPlaintext: 0000010000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 750d079407521363\nPlaintext: 0000008000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 64feed9c724c2faf\nPlaintext: 0000004000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: f02b263b328e2b60\nPlaintext: 0000002000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 9d64555a9a10b852\nPlaintext: 0000001000000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: d106ff0bed5255d7\nPlaintext: 0000000800000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e1652c6b138c64a5\nPlaintext: 0000000400000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e428581186ec8f46\nPlaintext: 0000000200000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: aeb5f5ede22d1a36\nPlaintext: 0000000100000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e943d7568aec0c5c\nPlaintext: 0000000080000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: df98c8276f54b04b\nPlaintext: 0000000040000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: b160e4680f6c696f\nPlaintext: 0000000020000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: fa0752b07d9c4ab8\nPlaintext: 0000000010000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: ca3a2b036dbc8502\nPlaintext: 0000000008000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 5e0905517bb59bcf\nPlaintext: 0000000004000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 814eeb3b91d90726\nPlaintext: 0000000002000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 4d49db1532919c9f\nPlaintext: 0000000001000000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 25eb5fc3f8cf0621\nPlaintext: 0000000000800000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: ab6a20c0620d1c6f\nPlaintext: 0000000000400000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 79e90dbc98f92cca\nPlaintext: 0000000000200000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 866ecedd8072bb0e\nPlaintext: 0000000000100000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 8b54536f2f3e64a8\nPlaintext: 0000000000080000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: ea51d3975595b86b\nPlaintext: 0000000000040000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: caffc6ac4542de31\nPlaintext: 0000000000020000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 8dd45a2ddf90796c\nPlaintext: 0000000000010000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 1029d55e880ec2d0\nPlaintext: 0000000000008000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 5d86cb23639dbea9\nPlaintext: 0000000000004000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 1d1ca853ae7c0c5f\nPlaintext: 0000000000002000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: ce332329248f3228\nPlaintext: 0000000000001000\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 8405d1abe24fb942\nPlaintext: 0000000000000800\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e643d78090ca4207\nPlaintext: 0000000000000400\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 48221b9937748a23\nPlaintext: 0000000000000200\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: dd7c0bbd61fafd54\nPlaintext: 0000000000000100\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 2fbc291a570db5c4\nPlaintext: 0000000000000080\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: e07c30d7e4e26e12\nPlaintext: 0000000000000040\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 0953e2258e8e90a1\nPlaintext: 0000000000000020\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 5b711bc4ceebf2ee\nPlaintext: 0000000000000010\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: cc083f1e6d9e85f6\nPlaintext: 0000000000000008\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: d2fd8867d50d2dfe\nPlaintext: 0000000000000004\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 06e7ea22ce92708f\nPlaintext: 0000000000000002\n\nCipher: DES-EDE3-CBC\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nIV: 0000000000000000\nCiphertext: 166b40b44aba4bd6\nPlaintext: 0000000000000001\n\n",
 };
-static const size_t kLen30 = 70010;
+static const size_t kLen31 = 70010;
 
-static const char *kData30[] = {
+static const char *kData31[] = {
     "# Generated by \"make_cavp -extra-labels Cipher=DES-EDE3 -cipher tdes kat_des/KAT_TDES/TECBinvperm.rsp kat_des/KAT_TDES/TECBpermop.rsp kat_des/KAT_TDES/TECBsubtab.rsp kat_des/KAT_TDES/TECBvarkey.rsp kat_des/KAT_TDES/TECBvartext.rsp\"\n\n# File 1: kat_des/KAT_TDES/TECBinvperm.rsp\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 95f8a5e5dd31d900\nCiphertext: 8000000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: dd7f121ca5015619\nCiphertext: 4000000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 2e8653104f3834ea\nCiphertext: 2000000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 4bd388ff6cd81d4f\nCiphertext: 1000000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 20b9e767b2fb1456\nCiphertext: 0800000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 55579380d77138ef\nCiphertext: 0400000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 6cc5defaaf04512f\nCiphertext: 0200000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0d9f279ba5d87260\nCiphertext: 0100000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: d9031b0271bd5a0a\nCiphertext: 0080000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 424250b37c3dd951\nCiphertext: 0040000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: b8061b7ecd9a21e5\nCiphertext: 0020000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: f15d0f286b65bd28\nCiphertext: 0010000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: add0cc8d6e5deba1\nCiphertext: 0008000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e6d5f82752ad63d1\nCiphertext: 0004000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: ecbfe3bd3f591a5e\nCiphertext: 0002000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: f356834379d165cd\nCiphertext: 0001000000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 2b9f982f20037fa9\nCiphertext: 0000800000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 889de068a16f0be6\nCiphertext: 0000400000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e19e275d846a1298\nCiphertext: 0000200000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 329a8ed523d71aec\nCiphertext: 0000100000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e7fce22557d23c97\nCiphertext: 0000080000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 12a9f5817ff2d65d\nCiphertext: 0000040000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: a484c3ad38dc9c19\nCiphertext: 0000020000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: fbe00a8a1ef8ad72\nCiphertext: 0000010000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 750d079407521363\nCiphertext: 0000008000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 64feed9c724c2faf\nCiphertext: 0000004000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: f02b263b328e2b60\nCiphertext: 0000002000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 9d64555a9a10b852\nCiphertext: 0000001000000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: d106ff0bed5255d7\nCiphertext: 0000000800000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e1652c6b138c64a5\nCiphertext: 0000000400000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e428581186ec8f46\nCiphertext: 0000000200000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: aeb5f5ede22d1a36\nCiphertext: 0000000100000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e943d7568aec0c5c\nCiphertext: 0000000080000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: df98c8276f54b04b\nCiphertext: 0000000040000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: b160e4680f6c696f\nCiphertext: 0000000020000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: fa0752b07d9c4ab8\nCiphertext: 0000000010000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: ca3a2b036dbc8502\nCiphertext: 0000000008000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 5e0905517bb59bcf\nCiphertext: 0000000004000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 814eeb3b91d90726\nCiphertext: 0000000002000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 4d49db1532919c9f\nCiphertext: 0000000001000000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 25eb5fc3f8cf0621\nCiphertext: 0000000000800000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: ab6a20c0620d1c6f\nCiphertext: 0000000000400000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 79e90dbc98f92cca\nCiphertext: 0000000000200000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 866ecedd8072bb0e\nCiphertext: 0000000000100000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 8b54536f2f3e64a8\nCiphertext: 0000000000080000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: ea51d3975595b86b\nCiphertext: 0000000000040000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: caffc6ac4542de31\nCiphertext: 0000000000020000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 8dd45a2ddf90796c\nCiphertext: 0000000000010000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 1029d55e880ec2d0\nCiphertext: 0000000000008000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 5d86cb23639dbea9\nCiphertext: 0000000000004000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 1d1ca853ae7c0c5f\nCiphertext: 0000000000002000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: ce332329248f3228\nCiphertext: 0000000000001000\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 8405d1abe24fb942\nCiphertext: 0000000000000800\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101",
     "010101010101010101\nPlaintext: e643d78090ca4207\nCiphertext: 0000000000000400\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 48221b9937748a23\nCiphertext: 0000000000000200\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: dd7c0bbd61fafd54\nCiphertext: 0000000000000100\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 2fbc291a570db5c4\nCiphertext: 0000000000000080\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: e07c30d7e4e26e12\nCiphertext: 0000000000000040\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0953e2258e8e90a1\nCiphertext: 0000000000000020\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 5b711bc4ceebf2ee\nCiphertext: 0000000000000010\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: cc083f1e6d9e85f6\nCiphertext: 0000000000000008\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: d2fd8867d50d2dfe\nCiphertext: 0000000000000004\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 06e7ea22ce92708f\nCiphertext: 0000000000000002\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 166b40b44aba4bd6\nCiphertext: 0000000000000001\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 8000000000000000\nPlaintext: 95f8a5e5dd31d900\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 4000000000000000\nPlaintext: dd7f121ca5015619\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 2000000000000000\nPlaintext: 2e8653104f3834ea\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 1000000000000000\nPlaintext: 4bd388ff6cd81d4f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0800000000000000\nPlaintext: 20b9e767b2fb1456\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0400000000000000\nPlaintext: 55579380d77138ef\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0200000000000000\nPlaintext: 6cc5defaaf04512f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0100000000000000\nPlaintext: 0d9f279ba5d87260\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0080000000000000\nPlaintext: d9031b0271bd5a0a\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0040000000000000\nPlaintext: 424250b37c3dd951\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0020000000000000\nPlaintext: b8061b7ecd9a21e5\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0010000000000000\nPlaintext: f15d0f286b65bd28\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0008000000000000\nPlaintext: add0cc8d6e5deba1\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0004000000000000\nPlaintext: e6d5f82752ad63d1\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0002000000000000\nPlaintext: ecbfe3bd3f591a5e\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0001000000000000\nPlaintext: f356834379d165cd\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000800000000000\nPlaintext: 2b9f982f20037fa9\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000400000000000\nPlaintext: 889de068a16f0be6\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000200000000000\nPlaintext: e19e275d846a1298\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000100000000000\nPlaintext: 329a8ed523d71aec\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000080000000000\nPlaintext: e7fce22557d23c97\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000040000000000\nPlaintext: 12a9f5817ff2d65d\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000020000000000\nPlaintext: a484c3ad38dc9c19\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000010000000000\nPlaintext: fbe00a8a1ef8ad72\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000008000000000\nPlaintext: 750d079407521363\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000004000000000\nPlaintext: 64feed9c724c2faf\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000002000000000\nPlaintext: f02b263b328e2b60\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000001000000000\nPlaintext: 9d64555a9a10b852\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000800000000\nPlaintext: d106ff0bed5255d7\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000400000000\nPlaintext: e1652c6b138c64a5\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000200000000\nPlaintext: e428581186ec8f46\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000100000000\nPlaintext: aeb5f5ede22d1a36\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000080000000\nPlaintext: e943d7568aec0c5c\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000040000000\nPlaintext: df98c8276f54b04b\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000020000000\nPlaintext: b160e4680f6c696f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000010000000\nPlaintext: fa0752b07d9c4ab8\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000008000000\nPlaintext: ca3a2b036dbc8502\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000004000000\nPlaintext: 5e0905517bb59bcf\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000002000000\nPlaintext: 814eeb3b91d90726\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000001000000\nPlaintext: 4d49db1532919c9f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000800000\nPlaintext: 25eb5fc3f8cf0621\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000400000\nPlaintext: ab6a20c0620d1c6f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000200000\nPlaintext: 79e90dbc98f92cca\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000100000\nPlaintext: 866ecedd8072bb0e\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000080000\nPlai",
     "ntext: 8b54536f2f3e64a8\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000040000\nPlaintext: ea51d3975595b86b\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000020000\nPlaintext: caffc6ac4542de31\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000010000\nPlaintext: 8dd45a2ddf90796c\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000008000\nPlaintext: 1029d55e880ec2d0\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000004000\nPlaintext: 5d86cb23639dbea9\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000002000\nPlaintext: 1d1ca853ae7c0c5f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000001000\nPlaintext: ce332329248f3228\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000800\nPlaintext: 8405d1abe24fb942\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000400\nPlaintext: e643d78090ca4207\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000200\nPlaintext: 48221b9937748a23\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000100\nPlaintext: dd7c0bbd61fafd54\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000080\nPlaintext: 2fbc291a570db5c4\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000040\nPlaintext: e07c30d7e4e26e12\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000020\nPlaintext: 0953e2258e8e90a1\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000010\nPlaintext: 5b711bc4ceebf2ee\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000008\nPlaintext: cc083f1e6d9e85f6\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000004\nPlaintext: d2fd8867d50d2dfe\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000002\nPlaintext: 06e7ea22ce92708f\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0000000000000001\nPlaintext: 166b40b44aba4bd6\n\n# File 2: kat_des/KAT_TDES/TECBpermop.rsp\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 104691348998013110469134899801311046913489980131\nPlaintext: 0000000000000000\nCiphertext: 88d55e54f54c97b4\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100710348998802010071034899880201007103489988020\nPlaintext: 0000000000000000\nCiphertext: 0c0cc00c83ea48fd\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 10071034c898012010071034c898012010071034c8980120\nPlaintext: 0000000000000000\nCiphertext: 83bc8ef3a6570183\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 104610348998802010461034899880201046103489988020\nPlaintext: 0000000000000000\nCiphertext: df725dcad94ea2e9\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 108691151919010110869115191901011086911519190101\nPlaintext: 0000000000000000\nCiphertext: e652b53b550be8b0\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 108691151958010110869115195801011086911519580101\nPlaintext: 0000000000000000\nCiphertext: af527120c485cbb0\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 5107b015195801015107b015195801015107b01519580101\nPlaintext: 0000000000000000\nCiphertext: 0f04ce393db926d5\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 1007b015191901011007b015191901011007b01519190101\nPlaintext: 0000000000000000\nCiphertext: c9f00ffc74079067\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 310791549808010131079154980801013107915498080101\nPlaintext: 0000000000000000\nCiphertext: 7cfd82a593252b4e\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 310791949808010131079194980801013107919498080101\nPlaintext: 0000000000000000\nCiphertext: cb49a2f9e91363e3\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 10079115b908014010079115b908014010079115b9080140\nPlaintext: 0000000000000000\nCiphertext: 00b588be70d23f56\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 310791159808014031079115980801403107911598080140\nPlaintext: 0000000000000000\nCiphertext: 406a9a6ab43399ae\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 1007d015899801011007d015899801011007d01589980101\nPlaintext: 0000000000000000\nCiphertext: 6cb773611dca9ada\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 910791158998010191079115899801019107911589980101\nPlaintext: 0000000000000000\nCiphertext: 67fd21c17dbb5d70\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 9107d015891901019107d015891901019107d01589190101\nPlaintext: 0000000000000000\nCiphertext: 9592cb4110430787\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 1007d015989801201007d015989801201007d01598980120\nPlaintext: 0000000000000000\nCiphertext: a6b7ff68a318ddd3\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100794049819010110079404981901011007940498190101\nPlaintext: 0000000000000000\nCiphertext: 4d102196c914ca16\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010791049119040101079104911904010107910491190401\nPlaintext: 0000000000000000\nCiphertext: 2dfa9f4573594965\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010791049119010101079104911901010107910491190101\nPlaintext: 0000000000000000\nCiphertext: b46604816c0e0774\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010794049119040101079404911904010107940491190401\nPlaintext: 0000000000000000\nCiphertext: 6e7e6221a4f34e87\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 19079210981a010119079210981a010119079210981a0101\nPlaintext: 0000000000000000\nCiphertext: aa85e74643233199\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100791199819080110079119981908011007911998190801\nPlaintext: 0000000000000000\nCiphertext: 2e5a19db4d1962d6\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 10079119981a080110079119981a080110079119981a0801\nPlaintext: 0000000000000000\nCiphertext: 23a866a809d30894\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100792109819010110079210981901011007921098190101\nPlaintext: 0000000000000000\nCiphertext: d812d961f017d320\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100791159819010b100791159819010b100791159819010b\nPlaintext: 0000000000000000\nCiphertext: 055605816e58608f\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100480159819010110048015981901011004801598190101\nPlaintext: 0000000000000000\nCiphertext: abd88e8b1b7716f1\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100480159819010210048015981901021004801598190102\nPlaintext: 0000000000000000\nCiphertext: 537ac95be69da1e1\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100480159819010810048015981901081004801598190108\nPlaintext: 0000000000000000\nCiphertext: aed0f6ae3c25cdd8\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100291159810010410029115981001041002911598100104\nPlaintext: 0000000000000000\nCiphertext: b3e35a5ee53e7b8d\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100291159819010410029115981901041002911598190104\nPlaintext: 0000000000000000\nCiphertext: 61c79c71921a2ef8\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100291159810020110029115981002011002911598100201\nPlaintext: 0000000000000000\nCiphertext: e2f5728f0995013c\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 100291169810010110029116981001011002911698100101\nPlaintext: 0000000000000000\nCiphertext: 1aeac39a61f0a464\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 104691348998013110469134899801311046913489980131\nCiphertext: 88d55e54f54c97b4\nPlaintext: 0000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 100710348998802010071034899880201007103489988020\nCiphertext: 0c0cc00c83ea48fd\nPlaintext: 0000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 10071034c898012010071034c898012010071034c8980120\nCiphertext: 83bc8ef3a6570183\nPlaintext: 0000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 104610348998802010461034899880201046103489988020\nCiphertext: df725dcad94ea2e9\nPlaintext: 00",
@@ -2271,9 +2292,9 @@
     "101010101010101010101010101\nPlaintext: 0000000000200000\nCiphertext: 79e90dbc98f92cca\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000100000\nCiphertext: 866ecedd8072bb0e\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000080000\nCiphertext: 8b54536f2f3e64a8\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000040000\nCiphertext: ea51d3975595b86b\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000020000\nCiphertext: caffc6ac4542de31\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000010000\nCiphertext: 8dd45a2ddf90796c\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000008000\nCiphertext: 1029d55e880ec2d0\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000004000\nCiphertext: 5d86cb23639dbea9\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000002000\nCiphertext: 1d1ca853ae7c0c5f\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000001000\nCiphertext: ce332329248f3228\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000800\nCiphertext: 8405d1abe24fb942\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000400\nCiphertext: e643d78090ca4207\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000200\nCiphertext: 48221b9937748a23\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000100\nCiphertext: dd7c0bbd61fafd54\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000080\nCiphertext: 2fbc291a570db5c4\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000040\nCiphertext: e07c30d7e4e26e12\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000020\nCiphertext: 0953e2258e8e90a1\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000010\nCiphertext: 5b711bc4ceebf2ee\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000008\nCiphertext: cc083f1e6d9e85f6\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000004\nCiphertext: d2fd8867d50d2dfe\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000002\nCiphertext: 06e7ea22ce92708f\n\nCipher: DES-EDE3\nOperation: ENCRYPT\nKey: 010101010101010101010101010101010101010101010101\nPlaintext: 0000000000000001\nCiphertext: 166b40b44aba4bd6\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 95f8a5e5dd31d900\nPlaintext: 8000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: dd7f121ca5015619\nPlaintext: 4000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 2e8653104f3834ea\nPlaintext: 2000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 4bd388ff6cd81d4f\nPlaintext: 1000000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 20b9e767b2fb1456\nPlaintext: 0800000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 55579380d77138ef\nPlaintext: 0400000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 6cc5defaaf04512f\nPlaintext: 0200000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0d9f279ba5d87260\nPlaintext: 0100000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: d9031b0271bd5a0a\nPlaintext: 0080000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 424250b37c3dd951\nPlaintext: 0040000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: b8061b7ecd9a21e5\nPlaintext: 0020000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: f15d0f286b65bd28\nPlaintext: 0010000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: add0cc8d6e5deba1\nPlaintext: 0008000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e6d5f82752ad63d1\nPlaintext: 0004000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: ecbfe3bd3f591a5e\nPlaintext: 0002000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: f356834379d165cd\nPlaintext: 0001000000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 2b9f982f20037fa9\nPlaintext: 0000800000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 889de068a16f0be6\nPlaintext: 0000400000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e19e275d846a1298\nPlaintext: 0000200000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 329a8ed523d71aec\nPlaintext: 0000100000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e7fce22557d23c97\nPlaintext: 0000080000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 12a9f5817ff2d65d\nPlaintext: 0000040000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: a484c3ad38dc9c19\nPlaintext: 0000020000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: fbe00a8a1ef8ad72\nPlaintext: 0000010000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 750d079407521363\nPlaintext: 0000008000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 64feed9c724c2faf\nPlaintext: 0000004000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: f02b263b328e2b60\nPlaintext: 0000002000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 9d64555a9a10b852\nPlaintext: 0000001000000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: d106ff0bed5255d7\nPlaintext: 0000000800000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e1652c6b138c64a5\nPlaintext: 0000000400000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e428581186ec8f46\nPlaintext: 0000000200000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: aeb5f5ede22d1a36\nPlaintext: 0000000100000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e943d7568aec0c5c\nPlaintext: 0000000080000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: df98c8276f54",
     "b04b\nPlaintext: 0000000040000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: b160e4680f6c696f\nPlaintext: 0000000020000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: fa0752b07d9c4ab8\nPlaintext: 0000000010000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: ca3a2b036dbc8502\nPlaintext: 0000000008000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 5e0905517bb59bcf\nPlaintext: 0000000004000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 814eeb3b91d90726\nPlaintext: 0000000002000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 4d49db1532919c9f\nPlaintext: 0000000001000000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 25eb5fc3f8cf0621\nPlaintext: 0000000000800000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: ab6a20c0620d1c6f\nPlaintext: 0000000000400000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 79e90dbc98f92cca\nPlaintext: 0000000000200000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 866ecedd8072bb0e\nPlaintext: 0000000000100000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 8b54536f2f3e64a8\nPlaintext: 0000000000080000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: ea51d3975595b86b\nPlaintext: 0000000000040000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: caffc6ac4542de31\nPlaintext: 0000000000020000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 8dd45a2ddf90796c\nPlaintext: 0000000000010000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 1029d55e880ec2d0\nPlaintext: 0000000000008000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 5d86cb23639dbea9\nPlaintext: 0000000000004000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 1d1ca853ae7c0c5f\nPlaintext: 0000000000002000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: ce332329248f3228\nPlaintext: 0000000000001000\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 8405d1abe24fb942\nPlaintext: 0000000000000800\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e643d78090ca4207\nPlaintext: 0000000000000400\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 48221b9937748a23\nPlaintext: 0000000000000200\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: dd7c0bbd61fafd54\nPlaintext: 0000000000000100\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 2fbc291a570db5c4\nPlaintext: 0000000000000080\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: e07c30d7e4e26e12\nPlaintext: 0000000000000040\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 0953e2258e8e90a1\nPlaintext: 0000000000000020\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 5b711bc4ceebf2ee\nPlaintext: 0000000000000010\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: cc083f1e6d9e85f6\nPlaintext: 0000000000000008\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: d2fd8867d50d2dfe\nPlaintext: 0000000000000004\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 06e7ea22ce92708f\nPlaintext: 0000000000000002\n\nCipher: DES-EDE3\nOperation: DECRYPT\nKey: 010101010101010101010101010101010101010101010101\nCiphertext: 166b40b44aba4bd6\nPlaintext: 0000000000000001\n\n",
 };
-static const size_t kLen31 = 444193;
+static const size_t kLen32 = 444193;
 
-static const char *kData31[] = {
+static const char *kData32[] = {
     "# The contents of this file were generated from\n# http://ed25519.cr.yp.to/python/sign.input using the following Python script:\n#\n# import sys\n#\n# isFirst = True\n#\n# for line in sys.stdin.readlines():\n#   (private, public, message, sig_and_message, _) = line.split(':')\n#\n#   if not isFirst:\n#     print\n#   print \"PRIV:\", private\n#   print \"PUB:\", public\n#   print \"MESSAGE:\", message\n#   print \"SIG:\", sig_and_message[:128]\n#   isFirst = False\n\nPRIV: 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\nPUB: d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\nMESSAGE: \nSIG: e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\nPRIV: 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c\nPUB: 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c\nMESSAGE: 72\nSIG: 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\nPRIV: c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025\nPUB: fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025\nMESSAGE: af82\nSIG: 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\nPRIV: 0d4a05b07352a5436e180356da0ae6efa0345ff7fb1572575772e8005ed978e9e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057\nPUB: e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057\nMESSAGE: cbc77b\nSIG: d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c\n\nPRIV: 6df9340c138cc188b5fe4464ebaa3f7fc206a2d55c3434707e74c9fc04e20ebbc0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7\nPUB: c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7\nMESSAGE: 5f4c8989\nSIG: 124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07\n\nPRIV: b780381a65edf8b78f6945e8dbec7941ac049fd4c61040cf0c324357975a293ce253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01\nPUB: e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01\nMESSAGE: 18b6bec097\nSIG: b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09\n\nPRIV: 78ae9effe6f245e924a7be63041146ebc670dbd3060cba67fbc6216febc44546fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d\nPUB: fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d\nMESSAGE: 89010d855972\nSIG: 6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300\n\nPRIV: 691865bfc82a1e4b574eecde4c7519093faf0cf867380234e3664645c61c5f7998a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63\nPUB: 98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63\nMESSAGE: b4a8f381e70e7a\nSIG: 6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107\n\nPRIV: 3b26516fb3dc88eb181b9ed73f0bcd52bcd6b4c788e4bcaf46057fd078bee073f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863\nPUB: f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863\nMESSAGE: 4284abc51bb67235\nSIG: d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08\n\nPRIV: edc6f5fbdd1cee4d101c063530a30490b221be68c036f5b07d0f953b745df192c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd\nPUB: c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd\nMESSAGE: 672bf8965d04bc5146\nSIG: 2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901\n\nPRIV: 4e7d21fb3b1897571a445833be0f9fd41cd62be3aa04040f8934e1fcbdcacd4531b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff\nPUB: 31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff\nMESSAGE: 33d7a786aded8c1bf691\nSIG: 28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08\n\nPRIV: a980f892db13c99a3e8971e965b2ff3d41eafd54093bc9f34d1fd22d84115bb644b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f\nPUB: 44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f\nMESSAGE: 3486f68848a65a0eb5507d\nSIG: 77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100\n\nPRIV: 5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef96fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257\nPUB: 6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257\nMESSAGE: 5a8d9d0a22357e6655f9c785\nSIG: 0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e\n\nPRIV: 940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd\nPUB: a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd\nMESSAGE: b87d3813e03f58cf19fd0b6395\nSIG: d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c\n\nPRIV: 9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291\nPUB: cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291\nMESSAGE: 55c7fa434f5ed8cdec2b7aeac173\nSIG: 6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06\n\nPRIV: d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5\nPUB: fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5\nMESSAGE: 0a688e79be24f866286d4646b5d81c\nSIG: f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00\n\nPRIV: 0a47d10452ae2febec518a1c7c362890c3fc1a49d34b03b6467d35c904a8362d34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b\nPUB: 34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b\nMESSAGE: c942fa7ac6b23ab7ff612fdc8e68ef39\nSIG: 2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c\n\nPRIV: f8148f7506b775ef46fdc8e8c756516812d47d6cfbfa318c27c9a22641e56f170445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372\nPUB: 0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372\nMESSAGE: 7368724a5b0efb57d28d97622dbde725af\nSIG: 3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b\n\nPRIV: 77f88691c4eff23ebb7364947092951a5ff3f10785b417e918823a552dab7c7574d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b\nPUB: 74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b\nMESSAGE: bd8e05033f3a8bcdcbf4beceb70901c82e31\nSIG: fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a\n\nPRIV: ab6f7aee6a0837b334ba5eb1b2ad7fcecfab7e323cab187fe2e0a95d80eff1325b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c\nPUB: 5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c\nMESSAGE: 8171456f8b907189b1d779e26bc5afbb08c67a\nSIG: 73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09\n\nPRIV: 8d135de7c8411bbdbd1b31e5dc678f2ac7109e792b60f38cd24936e8a898c32d1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f\nPUB: 1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f\nMESSAGE: 8ba6a4c9a15a244a9c26bb2a59b1026f21348b49\nSIG: a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35f",
     "e83e6e04263937db93f105\n\nPRIV: 0e765d720e705f9366c1ab8c3fa84c9a44370c06969f803296884b2846a652a47fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8\nPUB: 7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8\nMESSAGE: 1d566a6232bbaab3e6d8804bb518a498ed0f904986\nSIG: bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f\n\nPRIV: db36e326d676c2d19cc8fe0c14b709202ecfc761d27089eb6ea4b1bb021ecfa748359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85\nPUB: 48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85\nMESSAGE: 1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4\nSIG: b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300\n\nPRIV: c89955e0f7741d905df0730b3dc2b0ce1a13134e44fef3d40d60c020ef19df77fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c\nPUB: fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c\nMESSAGE: 507c94c8820d2a5793cbf3442b3d71936f35fe3afef316\nSIG: 7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c\n\nPRIV: 4e62627fc221142478aee7f00781f817f662e3b75db29bb14ab47cf8e84104d6b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107\nPUB: b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107\nMESSAGE: d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5\nSIG: 836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a\n\nPRIV: 6b83d7da8908c3e7205b39864b56e5f3e17196a3fc9c2f5805aad0f5554c142dd0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6\nPUB: d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6\nMESSAGE: 6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c\nSIG: 16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08\n\nPRIV: 19a91fe23a4e9e33ecc474878f57c64cf154b394203487a7035e1ad9cd697b0d2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23\nPUB: 2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23\nMESSAGE: 82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c\nSIG: 881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f\n\nPRIV: 1d5b8cb6215c18141666baeefcf5d69dad5bea9a3493dddaa357a4397a13d4de94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835\nPUB: 94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835\nMESSAGE: a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0\nSIG: 3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c\n\nPRIV: 6a91b3227c472299089bdce9356e726a40efd840f11002708b7ee55b64105ac29d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e\nPUB: 9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e\nMESSAGE: 5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc\nSIG: f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101\n\nPRIV: 93eaa854d791f05372ce72b94fc6503b2ff8ae6819e6a21afe825e27ada9e4fb16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5\nPUB: 16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5\nMESSAGE: 32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5\nSIG: d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07\n\nPRIV: 941cac69fb7b1815c57bb987c4d6c2ad2c35d5f9a3182a79d4ba13eab253a8ad23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b\nPUB: 23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b\nMESSAGE: bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa\nSIG: 0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02\n\nPRIV: 1acdbb793b0384934627470d795c3d1dd4d79cea59ef983f295b9b59179cbb283f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a\nPUB: 3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a\nMESSAGE: 7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56\nSIG: be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507\n\nPRIV: 8ed7a797b9cea8a8370d419136bcdf683b759d2e3c6947f17e13e2485aa9d420b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9\nPUB: b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9\nMESSAGE: a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3\nSIG: 04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b\n\nPRIV: f2ab396fe8906e3e5633e99cabcd5b09df0859b516230b1e0450b580b65f616c8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b\nPUB: 8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b\nMESSAGE: 5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187\nSIG: a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c\n\nPRIV: 550a41c013f79bab8f06e43ad1836d51312736a9713806fafe6645219eaa1f9daf6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0\nPUB: af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0\nMESSAGE: 8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27\nSIG: 16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04\n\nPRIV: 19ac3e272438c72ddf7b881964867cb3b31ff4c793bb7ea154613c1db068cb7ef85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f\nPUB: f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f\nMESSAGE: 95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645\nSIG: ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701\n\nPRIV: ca267de96c93c238fafb1279812059ab93ac03059657fd994f8fa5a09239c821017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26\nPUB: 017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26\nMESSAGE: e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531\nSIG: ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c\n\nPRIV: 3dff5e899475e7e91dd261322fab09980c52970de1da6e2e201660cc4fce7032f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b\nPUB: f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b\nMESSAGE: 938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382\nSIG: 5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805\n\nPRIV: 9a6b847864e70cfe8ba6ab22fa0ca308c0cc8bec7141fbcaa3b81f5d1e1cfcfc34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930\nPUB: 34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930\nMESSAGE: 838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da\nSIG: 2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905\n\nPRIV: 575be07afca5d063c238cd9b8028772cc49cda34471432a2e166e096e2219efc94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0\nPUB: 94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0\nMESSAGE: 33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e\nSIG: 58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506\n\nPRIV: 15ffb45514d43444d61fcb105e30e135fd268523dda20b82758b1794231104411772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8\nPUB: 1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8\nMESSAGE: da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e\nSIG: 6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6",
     "af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08\n\nPRIV: fe0568642943b2e1afbfd1f10fe8df87a4236bea40dce742072cb21886eec1fa299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61\nPUB: 299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61\nMESSAGE: c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d\nSIG: d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404\n\nPRIV: 5ecb16c2df27c8cf58e436a9d3affbd58e9538a92659a0f97c4c4f994635a8cada768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d\nPUB: da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d\nMESSAGE: 56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9\nSIG: 1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a\n\nPRIV: d599d637b3c30a82a9984e2f758497d144de6f06b9fba04dd40fd949039d7c846791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f\nPUB: 6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f\nMESSAGE: a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e\nSIG: ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205\n\nPRIV: 30ab8232fa7018f0ce6c39bd8f782fe2e159758bb0f2f4386c7f28cfd2c85898ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37\nPUB: ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37\nMESSAGE: 63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc\nSIG: 9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c\n\nPRIV: 0ddcdc872c7b748d40efe96c2881ae189d87f56148ed8af3ebbbc80324e38bdd588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85\nPUB: 588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85\nMESSAGE: 65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12\nSIG: c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403\n\nPRIV: 89f0d68299ba0a5a83f248ae0c169f8e3849a9b47bd4549884305c9912b46603aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832\nPUB: aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832\nMESSAGE: 4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05\nSIG: 2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b\n\nPRIV: 0a3c1844e2db070fb24e3c95cb1cc6714ef84e2ccd2b9dd2f1460ebf7ecf13b172e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01\nPUB: 72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01\nMESSAGE: 4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957\nSIG: 87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05\n\nPRIV: c8d7a8818b98dfdb20839c871cb5c48e9e9470ca3ad35ba2613a5d3199c8ab2390d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f\nPUB: 90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f\nMESSAGE: 783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff\nSIG: fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b\n\nPRIV: b482703612d0c586f76cfcb21cfd2103c957251504a8c0ac4c86c9c6f3e429fffd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad\nPUB: fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad\nMESSAGE: 29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b\nSIG: 58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607\n\nPRIV: 84e50dd9a0f197e3893c38dbd91fafc344c1776d3a400e2f0f0ee7aa829eb8a22c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea\nPUB: 2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea\nMESSAGE: f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123\nSIG: 69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500\n\nPRIV: b322d46577a2a991a4d1698287832a39c487ef776b4bff037a05c7f1812bdeeceb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f\nPUB: eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f\nMESSAGE: 19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5\nSIG: c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802\n\nPRIV: 960cab5034b9838d098d2dcbf4364bec16d388f6376d73a6273b70f82bbc98c05e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a\nPUB: 5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a\nMESSAGE: f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308\nSIG: 27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01\n\nPRIV: eb77b2638f23eebc82efe45ee9e5a0326637401e663ed029699b21e6443fb48e9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc\nPUB: 9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc\nMESSAGE: 99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab\nSIG: 18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06\n\nPRIV: b625aa89d3f7308715427b6c39bbac58effd3a0fb7316f7a22b99ee5922f2dc965a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e\nPUB: 65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e\nMESSAGE: e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a\nSIG: 01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d\n\nPRIV: b1c9f8bd03fe82e78f5c0fb06450f27dacdf716434db268275df3e1dc177af427fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf\nPUB: 7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf\nMESSAGE: 331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2\nSIG: 4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701\n\nPRIV: 6d8cdb2e075f3a2f86137214cb236ceb89a6728bb4a200806bf3557fb78fac6957a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda\nPUB: 57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda\nMESSAGE: 7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf\nSIG: a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b\n\nPRIV: 47adc6d6bf571ee9570ca0f75b604ac43e303e4ab339ca9b53cacc5be45b2ccba3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be\nPUB: a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be\nMESSAGE: ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739\nSIG: 4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b\n\nPRIV: 3c19b50b0fe47961719c381d0d8da9b9869d312f13e3298b97fb22f0af29cbbe0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612\nPUB: 0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612\nMESSAGE: 8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f\nSIG: efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704\n\nPRIV: 34e1e9d539107eb86b393a5ccea1496d35bc7d5e9a8c5159d957",
@@ -2330,55 +2351,9 @@
     "28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32\nSIG: 9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e\n\nPRIV: 1126496a582ce58d3d618dd8a3933547aa7a8a30fb54063b8dfdd31671c6c73de10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22\nPUB: e10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22\nMESSAGE: 6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c\nSIG: b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f\n\nPRIV: 9c167aff3b1b788f133d422de8ca9a64316409f9e35bfe22032ec417ae9abc6defb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019\nPUB: efb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019\nMESSAGE: 68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9\nSIG: c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e\n\nPRIV: e9948805eb341b2867479c668fd3532c309941c0ad4cb2e54231756e6a1bdecb5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1\nPUB: 5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1\nMESSAGE: 91cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946\nSIG: d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f078003\n\nPRIV: b01753efa73bb3de7aa778be7afcbff66a5d3e2c2f8b5aa2b048844050996965d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158\nPUB: d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158\nMESSAGE: 684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519\nSIG: 16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e\n\nPRIV: 4f4b20d899366f2f23ee628f229b236cf80f43ba183177c97ee34829546f1742c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357\nPUB: c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357\nMESSAGE: db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb\nSIG: 0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02\n\n\n# Additional test vectors from RFC 8032\n\nPRIV: f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e\nPUB: 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e\nMESSAGE: 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc27",
     "32e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nSIG: 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03\n\nPRIV: 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf\nPUB: ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf\nMESSAGE: ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f\nSIG: dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704\n",
 };
-static const size_t kLen32 = 41961;
-
-static const char *kData32[] = {
-    "# This file has been modified to remove the 65536-byte long inputs.\r\n\r\n#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = TDES KeySize = 3 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:47 2011\r\n\r\n\r\nCount = 0\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 3bb96170d5df4cce\r\nKey2 = 25d5daa22a982f08\r\nKey3 = 52f4a110dcdc9e45\r\nMsg = 00\r\nMac = 96\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 1\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 9413d38685688f58\r\nKey2 = dc38b6b3cef125f1\r\nKey3 = 5b61f4f7a1c46ed6\r\nMsg = 00\r\nMac = fc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 2\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 101a2f13fbb69473\r\nKey2 = 76fb98f24073f4d5\r\nKey3 = 2ca2706d76d00b67\r\nMsg = 00\r\nMac = 53\r\nResult = P\r\n\r\nCount = 3\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 2f8a238552c1e367\r\nKey2 = f8131f1c26ab3289\r\nKey3 = 83d5b6ba253bea31\r\nMsg = 00\r\nMac = 95\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 4\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c1bafb5dc7100758\r\nKey2 = e9ef047a58b5ba89\r\nKey3 = 76cb4fb55ebcc1c7\r\nMsg = 00\r\nMac = f4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 5\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c82c29f1cb5851b6\r\nKey2 = 8b5b45dcbf0d8079\r\nKey3 = e6407057ae34ec0b\r\nMsg = 00\r\nMac = 03\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 6\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 6b455116f4f883d5\r\nKey2 = a81a206d25152aab\r\nKey3 = 86dc07b607202abc\r\nMsg = 00\r\nMac = 75\r\nResult = P\r\n\r\nCount = 7\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c873d5bc4598d0b0\r\nKey2 = 1c1523cb4f794c8a\r\nKey3 = cedf6797d523dcab\r\nMsg = 00\r\nMac = 2e\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 8\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 45ce943bd31fe9b5\r\nKey2 = 677cc47c13c24923\r\nKey3 = 6b2086f14934838a\r\nMsg = 00\r\nMac = 01\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 9\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 804f9ef7baf7dfc7\r\nKey2 = 9bb6494cb60b8c07\r\nKey3 = 2080fe52e0d3943d\r\nMsg = 00\r\nMac = c3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 10\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 73c10b833e1043ab\r\nKey2 = 16dcd343645d5207\r\nKey3 = 6426f7f88c3473c8\r\nMsg = 00\r\nMac = 8b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 11\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 310d54d96bc73452\r\nKey2 = bae34f158ceafb04\r\nKey3 = 4651c1b53de3da26\r\nMsg = 00\r\nMac = ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 12\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 0e3d49d0e692f20e\r\nKey2 = a9cd384a3b688c0e\r\nKey3 = 584ae5f794f8fe7f\r\nMsg = 00\r\nMac = 4b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 13\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = b0fda857ea402f0b\r\nKey2 = d567e9f48568f1e0\r\nKey3 = 0ec2ad452a547a91\r\nMsg = 00\r\nMac = 04\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 1ac1543b1591f270\r\nKey2 = dcda0e9870b9d949\r\nKey3 = 68ea9b1c4380ae9e\r\nMsg = 00\r\nMac = 43\r\nResult = P\r\n\r\nCount = 15\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = d0b008aea4454551\r\nKey2 = 9234a7731ab610b5\r\nKey3 = 2fb97a8ffbaedae6\r\nMsg = 00\r\nMac = 4c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 16\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 04793b0b0e976d0b\r\nKey2 = bf493e58fb73681f\r\nKey3 = 1f54a262d649b985\r\nMsg = 00\r\nMac = 77\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 17\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 043b759b578ae570\r\nKey2 = 5e522f19cb9de092\r\nKey3 = 2af2e90eb6dcc1fd\r\nMsg = 00\r\nMac = 77\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 18\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = e58520088910513d\r\nKey2 = 7c10196e1a310dd5\r\nKey3 = 5b043b2a1ab97f85\r\nMsg = 00\r\nMac = 1c\r\nResult = P\r\n\r\nCount = 19\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = f27fd0f189452c15\r\nKey2 = 04681651014916ab\r\nKey3 = 204046aeeffecd15\r\nMsg = 00\r\nMac = 0b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 20\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 860864a710ab0475\r\nKey2 = b9205751bfd91f7f\r\nKey3 = 3bf72abf13d97640\r\nMsg = 00\r\nMac = e890abe6ea126215\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 21\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = a7a1d57aabf1137c\r\nKey2 = fd0df2e35b8cdf2a\r\nKey3 = b386755bc2ab3d9d\r\nMsg = 00\r\nMac = f475587c2101eff2\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 22\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = c2c28a4c7698804c\r\nKey2 = ab25b53783dc0419\r\nKey3 = ab16341f4cead054\r\nMsg = 00\r\nMac = d335575aa3a4d8af\r\nResult = P\r\n\r\nCount = 23\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 7594a7aed3e986ba\r\nKey2 = 52a280e662d9e9da\r\nKey3 = 7649d3ad6838f2c2\r\nMsg = 00\r\nMac = 0e109f43557f250f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 24\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 0798d9ef158cd698\r\nKey2 = fff4ade09b169762\r\nKey3 = 5b6e6849ec2c238a\r\nMsg = 00\r\nMac = 05af623529b168a9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 25\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 254991cb4af76dc8\r\nKey2 = 2cf2e915918a025b\r\nKey3 = 2c61bfaee69b2676\r\nMsg = 00\r\nMac = 725ab7a770762894\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 26\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 9f68cbbf3bb5b3da\r\nKey2 = 31adb5a46e2cc8e3\r\nKey3 = f86ed9eaabb625da\r\nMsg = 00\r\nMac = 0422d94f874dda7e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 27\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 1fd51f70a77ac8e9\r\nKey2 = 5dd9986e974c08ec\r\nKey3 = fd61ce34a75279f7\r\nMsg = 00\r\nMac = a163a5d269b3cc3e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 28\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 078c57d6df9ba1d5\r\nKey2 = 08d94ac1b3d3c183\r\nKey3 = e90bf4fe7973c2c7\r\nMsg = 00\r\nMac = 9af3f01e20dc7c1e\r\nResult = P\r\n\r\nCount = 29\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 08df322f040e7c01\r\nKey2 = e92343e69d83eac7\r\nKey3 = fe94c1ec0da22c1a\r\nMsg = 00\r\nMac = 3d88c20a4f828c5b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 30\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = b2ecf41c8692c2b0\r\nKey2 = 8ff18c1f1f296454\r\nKey3 = 383dcbc4a28c7629\r\nMsg = 00\r\nMac = 17241dc726fa4c56\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 07d99d58f2ec1fd5\r\nKey2 = ea46c73bf4b60ed0\r\nKey3 = f20ec149c831aecb\r\nMsg = 00\r\nMac = f6a8a0b536fd97d3\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 3dfdc19426fbd56d\r\nKey2 = b03b7985b32af857\r\nKey3 = a807c7b3621ffdda\r\nMsg = 00\r\nMac = 3ef9b263ae1df460\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 33\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = fbc79bab46b97923\r\nKey2 = ece6da4c40f1e6e9\r\nKey3 = eaa76770ef517a40\r\nMsg = 00\r\nMac = b2da3efa7fc64abe\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 34\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 5ba4a1d5a80db5ef\r\nKey2 = 7ce6aeb9261cb00b\r\nKey3 = 8a5df23ea445e0c8\r\nMsg = 00\r\nMac = 51b2e75334d90889\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 35\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = e9c494e001027c86\r\nKey2 = c4649e58ea251904\r\nKey3 = 8025343dec34409e\r\nMsg = 00\r\nMac = 166123f1c59132a3\r\nResult = P\r\n\r\nCount = 36\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 6bce61e646452a46\r\nKey2 = 54ba8a020d0876fb\r\nKey3 = 34ea2f6149bad664\r\nMsg = 00\r\nMac = b0d0f625f06f2a3a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 37\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 2f38f79bc8e0ea4a\r\nKey2 = d09876f22ca43e10\r\nKey3 = 3b8fab02299d328c\r\nMsg = 00\r\nMac = b26d377a504b8985\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 38\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 51febf790815f1d0\r\nKey2 = 9152d5e32f6713fb\r\nKey3 = 4a40c2c8fdb9f2b5\r\nMsg = 00\r\nMac = a27978e62026743b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 39\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 10ba8fd6256ee9a4\r\nKey2 = fa8332a46ead52ab\r\nKey3 = b0e06e1fef04abb5\r\nMsg = 00\r\nMac = e1b0a228c142555c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 40\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = f2fbab6734769e9b\r\nKey2 = ab45910e5775ab0d\r\nKey3 = 5bd5ea0db015a89e\r\nMsg = 7efeb7d4d14b3f2b3df4b8a276b18b49\r\nMac = 5c\r\nResult = P\r\n\r\nCount = 41\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 5bc776ba64adf4ea\r\nKey2 = 195e04987c62a4f2\r\nKey3 = c1642fdc1a31705d\r\nMsg = d1fb4f35914404af9df3bf5c368c0e69\r\nMac = 4d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 42\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = b67c57f770202c6e\r\nKey2 = e91f4fb361bcae37\r\nKey3 = ada8d3df4fbcf4b9\r\nMsg = 9800db878187c87ea05bf92054b0e3e3\r\nMac = 8b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 43\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ce0bc48002fe7602\r\nKey2 = e702abe31c7a2313\r\nKey3 = d61964867f2579da\r\nMsg = 704e4e75be1623b21332c14555bf5edc\r\nMac = b0\r\nResult = F (2 - Key or Key2 changed",
-    ")\r\n\r\nCount = 44\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ad75e32cc11980f2\r\nKey2 = d0570429680e9486\r\nKey3 = c2379207f862dcfd\r\nMsg = 197de855b3962b1fdad687f9c4f1efd6\r\nMac = 44\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 45\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 9db504803d29f126\r\nKey2 = 07fe58b3da765bad\r\nKey3 = 6dc489516e9bb5f8\r\nMsg = 8f296b265fa575d146799f9e39d52965\r\nMac = 14\r\nResult = P\r\n\r\nCount = 46\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 991f0ed04079293d\r\nKey2 = 57077ff1baecd907\r\nKey3 = dcc7a719c4372967\r\nMsg = d9cfcc67520c5b2ceeb622c694a8e3fe\r\nMac = a3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 47\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = eca815d6b0371cf1\r\nKey2 = 597980cdb6c892df\r\nKey3 = 3dba0ed3ba16ae1c\r\nMsg = a03636db2fdc84722aeb9d98a6ed70d0\r\nMac = 78\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 48\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ea80a43d5886dfef\r\nKey2 = 08bf4f76a8893732\r\nKey3 = 4557a13752d6730d\r\nMsg = 0371a63ad722523ef297d8399b124593\r\nMac = be\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 49\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = e9fe73e640808c02\r\nKey2 = 9be6986446012091\r\nKey3 = 707023615462a40e\r\nMsg = 83bcb484dca73d49ac234ece3a5d2ad3\r\nMac = d6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 50\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 1fe9800ecb0dd9f1\r\nKey2 = dbbc6bc72c794c23\r\nKey3 = 899b08469b6bc8b5\r\nMsg = 95f4a41c4c64cd7310fba748aa267a14\r\nMac = 59\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 51\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 34546261a21c1c43\r\nKey2 = 0449eaeca4f29725\r\nKey3 = 4cc4e6525186802f\r\nMsg = d204de1e671d3e43670dd67fee114402\r\nMac = 6e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 52\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 048aa8701fb5fe26\r\nKey2 = d56bd53d83e60bd9\r\nKey3 = 6707d6523ebc32f4\r\nMsg = f4e9f92fd2c9313fb61a889eaa4ff283\r\nMac = d5\r\nResult = P\r\n\r\nCount = 53\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 6ec19b02976e5ba2\r\nKey2 = 13540732d997c2b6\r\nKey3 = 7f4068926183251c\r\nMsg = 963363ab7c82b634974954bd0fe2c307\r\nMac = d7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 54\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = f4ecea5d32e32c6e\r\nKey2 = 385710cd3eb0fe51\r\nKey3 = 5d4c8f7ccdf10154\r\nMsg = a298857dc60ad2f0a8fa878607b50c18\r\nMac = 4c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 55\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = b31ff49dd970f8e9\r\nKey2 = 164aefb00efb5461\r\nKey3 = 981629757f4532dc\r\nMsg = fc3957b2ed0558bce61d478be615b774\r\nMac = 90\r\nResult = P\r\n\r\nCount = 56\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 85384543d3aef157\r\nKey2 = 57ea916d9b2fd0c8\r\nKey3 = 1a85830473fbe6c4\r\nMsg = 87db0d9d69bc0cf69cabeb92570e482b\r\nMac = 53\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 57\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 9bf8fb0b464070f8\r\nKey2 = 10ea23c7e5a19bcb\r\nKey3 = 408c236e10863e2a\r\nMsg = f9c98cd8a7d27553da946427b8276349\r\nMac = 53\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 58\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 91b083e9c8e9803b\r\nKey2 = 76d0341cd54c38e5\r\nKey3 = 07bca7f44a3e76bc\r\nMsg = 7e5b64dc6bcbae6bb4496fc033947343\r\nMac = de\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = e6795b1ffe8f3e38\r\nKey2 = 4fdcea8c73c76e75\r\nKey3 = df0726ae4c079461\r\nMsg = 5265fb6a796d99a6beec6f71ba267b5d\r\nMac = e0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 60\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 375710c76202bff1\r\nKey2 = 3bb96170d5df4cce\r\nKey3 = 23d5daa22a982f08\r\nMsg = 52f5a110dddc9f44f8a534eef9df0b22\r\nMac = b1b9e11939228900\r\nResult = P\r\n\r\nCount = 61\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b59b855dce76adf4\r\nKey2 = be9bae10fe34fb1c\r\nKey3 = 0d49159bf804a4ea\r\nMsg = 869f3b62ee78bfeb5287168eacf69ccb\r\nMac = 169a389352793c8b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 62\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 615d792a7038fd89\r\nKey2 = 98ce972f016e75a8\r\nKey3 = c470255783b32f01\r\nMsg = e5aed6715aa4291f9c32baf6b8449b53\r\nMac = 73ac2da999bfdf5d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 63\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 1fb09443a1074564\r\nKey2 = 3d1aa82c086eba13\r\nKey3 = c137d0f4ea54d604\r\nMsg = 16f02efd285381d7657ca5cd99d9e25b\r\nMac = 38126d16957893ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 64\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 2e5d163461fea761\r\nKey2 = 9173bf75372fb640\r\nKey3 = 9e3d1c3dcdbfbc31\r\nMsg = b10fcb03443302ae929ff95a17b025fa\r\nMac = b70f2d761ca643c9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b9e5861c1c4013d3\r\nKey2 = d554806efd3801a1\r\nKey3 = 64d9bc3d646e76dc\r\nMsg = 0e6c9fced82669cffe7b5a6f09dceec8\r\nMac = 78ce4635e486635a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 66\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = ad2376516b974c70\r\nKey2 = cd3b5870c2312929\r\nKey3 = 1a731a7feacbf783\r\nMsg = 88eb7a0379da9d113343dc1fe0f3e6f7\r\nMac = 0c949483e7fa7d0c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 67\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 9ada194c100eeacb\r\nKey2 = da23ad9825c194d0\r\nKey3 = 3ef1f4c438dce031\r\nMsg = 0f9703a3454c25c0b1053de62b0ffc5b\r\nMac = c78a4ca3662527e5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 68\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = e375f870f4d55b02\r\nKey2 = 1b015791e3e337b3\r\nKey3 = 370dc45b15671c5b\r\nMsg = 5ad9dd3b112ea4cee1654d2dfabab01e\r\nMac = 22becbbe7bfcade5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = d61f4aeff4b5f2f8\r\nKey2 = 0486b53de3ecc297\r\nKey3 = 807fe92fc2fed376\r\nMsg = d094cf77a709c0fa5d6b4b7e9e86a2c2\r\nMac = 947d024d9d5359a8\r\nResult = P\r\n\r\nCount = 70\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c2c28a4c7698804c\r\nKey2 = ab25b53783dc0419\r\nKey3 = ab16341f4cead054\r\nMsg = 7295a7aed3e987baef19ad68c33ba5a5\r\nMac = 58de82acc10d556f\r\nResult = P\r\n\r\nCount = 71\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = f1ce4992c851e3a8\r\nKey2 = 835ec1abef97f2c8\r\nKey3 = 5b92384f20dcc2ad\r\nMsg = 9094935fcd7c389dd17b5b121cddadf9\r\nMac = 319c70370c172de3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 72\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c16ebcc1165d6892\r\nKey2 = 75268c4602f8c8bf\r\nKey3 = dab97f79544cf1cd\r\nMsg = b7ba1c66282cb6092ba601407ff9578a\r\nMac = d73c26311bd44a32\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 73\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = fe4a796720a46dbc\r\nKey2 = 98f45289e9f8b080\r\nKey3 = e05def5b25520d43\r\nMsg = 31c9eed491bb0cda9b8c0eb5afa31019\r\nMac = 8c2ce22633c62751\r\nResult = F (1 - Message changed)\r\n\r\nCount = 74\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = eefb40c715c4546d\r\nKey2 = 5b2325c8d9daa48a\r\nKey3 = d5ec4a6bc82a7a62\r\nMsg = 5a97259dfa081f040d3893da2f231ca3\r\nMac = a64113544f509be8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 75\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 0d0851311ca45db0\r\nKey2 = 3d7c458957c8c408\r\nKey3 = 98d37c9d51ab2f25\r\nMsg = 8be16380af3e2dbc6cf678c2e3331335\r\nMac = 8817baeaa909e33a\r\nResult = P\r\n\r\nCount = 76\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b7239438d61cd626\r\nKey2 = 082c6404cb3897b5\r\nKey3 = c4c732cdd5e043c2\r\nMsg = 7120f19169e7cbb913c7d1f0ceb006c0\r\nMac = 32841ad7621cc0fc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 77\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 73f449ef83df75e9\r\nKey2 = 5f3d2016bfd0703b\r\nKey3 = 31abc16b58b64af4\r\nMsg = 83ecbfcff3bc37f1305d83bc0290350c\r\nMac = 8f8ba8bfc74203fa\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 78\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 9b6ea461c7b9abe6\r\nKey2 = 4a08dcdc5b9e01fe\r\nKey3 = 6b850e9b6ebae9d6\r\nMsg = c538416fba487fac5c94449d0757f3e9\r\nMac = c13f372e9a061db8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 79\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c7aeeacb156dfbfb\r\nKey2 = ba43ef516232a7d3\r\nKey3 = 2c572aea62808c68\r\nMsg = a1bc9950759d0df4cffaf29345dfb340\r\nMac = d7dad4519b56a1eb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 80\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = cda4d34370234946\r\nKey2 = c408ea6bec07c78c\r\nKey3 = 19eff7f798fd6808\r\nMsg = d1fb0b68176269cf9fda18bf13efc054f0c24fd042b9e2ecaf75e86cb60484f6\r\nMac = d8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 81\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 02100be5627686a8\r\nKey2 = 7f0b38ec073e75ef\r\nKey3 = 373b1a64ba5416d9\r\nMsg = c60be37fb0bda4f46894690b3344643c772fbd2237db348adaa407ca2eae1654\r\nMac = fb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 82\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 7597571a6e7c6bc8\r\nKey2 = c143a2a461626b1a\r\nKey3 = 6b1307d910434cc7\r\nMsg = 49cb128641f7952dfdf34f338da268b2ef1482557b593e",
-    "c57f930164264ff83e\r\nMac = 90\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 83\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = ae89ad615201546b\r\nKey2 = ae20765745458fce\r\nKey3 = efd0867fba43dcb0\r\nMsg = e47d8659c9ad94971adedd6bce744206e1cfb65d042b942d93c4363cc73ec3e3\r\nMac = 95\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 84\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = b65886f13d6e8c4a\r\nKey2 = 0708e0b0730473a8\r\nKey3 = d04f2a86dc0b9e7a\r\nMsg = b97c12251d91512fe7b3a349a982409c7412f39494d970e77acbe9d3fac3dca7\r\nMac = 05\r\nResult = P\r\n\r\nCount = 85\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 3197a4a26261588a\r\nKey2 = 0dc4a75ec8b99b58\r\nKey3 = efb93e7620205289\r\nMsg = 65f4b3a00c1c1ef39445a69b2150b034705410140ff9dad0ce21740271cef04a\r\nMac = 57\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 86\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 62c4a16e946b4313\r\nKey2 = d09ea80e7fb33449\r\nKey3 = 164fdc04c2d5f116\r\nMsg = 898e824fdc89f21779156a9e58564c4b99004b95226c2ebb8aebd0b5365a6c6a\r\nMac = 93\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 87\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 6eeff20d3d5d5223\r\nKey2 = 258076b313611c1c\r\nKey3 = b013b957f70d9e62\r\nMsg = 2d7fec1a1e9ee85cf960e5dc4e239619ed85f4b14d32cbd42dfa79f77a27f2cd\r\nMac = 0a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 88\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 193e23e6fd8aa185\r\nKey2 = 1910cbdc549da804\r\nKey3 = 6b769b4923523425\r\nMsg = bd65798a1d02ab164e2d31b1387e505874779539046820bd429043c617854c36\r\nMac = d3\r\nResult = P\r\n\r\nCount = 89\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 150789ab37ef2ce9\r\nKey2 = 10cdf45dad9ed9e5\r\nKey3 = f475fd3e153898fe\r\nMsg = 044dd73a7d1ef37a437c09e9268708c82ebad189dc1e989ab3bd8d7ff75abc23\r\nMac = e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 90\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 48d9d08a6bdcc4f8\r\nKey2 = 1383641c08735d0e\r\nKey3 = 374a89c8cb73a7f4\r\nMsg = d62fb84f2a2442b52acf817d7f067edca031970bea092c35f29f9a931aa06dd6\r\nMac = 26\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 91\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 68f4620da8b00201\r\nKey2 = df1c8362345180d3\r\nKey3 = 26abda897f89d90d\r\nMsg = 0ac3f7f22d24b64aa584845d3a990bb69e5d2d4650640056c16c17c0b636045f\r\nMac = f9\r\nResult = P\r\n\r\nCount = 92\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 1c259df7492361b6\r\nKey2 = cd4acdb65b3e5b1c\r\nKey3 = 3b01addc2579ef64\r\nMsg = 607f4730a5ea9dabfbcd8586f680c3021c7ebc858e73354beb975d58713b0eb1\r\nMac = fa\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 93\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = f18a9dba9db5dff1\r\nKey2 = d5987013a4b69e38\r\nKey3 = dc16e0ce1351e3f4\r\nMsg = bfe99e184a7d7bf0b4ade8f402f2c49aa4948e74b2d5c905756ba5d32934dbbd\r\nMac = e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 94\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 8361bac48afb1091\r\nKey2 = da85400d107fbf8f\r\nKey3 = 31ec732cc29d7045\r\nMsg = 3a1ee70d4607325c13bff68e402e0a72742f6a63ae972c6dda74b6b2a3922f0c\r\nMac = 0e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 95\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = d0df1adf1cf72032\r\nKey2 = 1504d564ec1aea61\r\nKey3 = c42fada45d80a43e\r\nMsg = 3a53d9c7ae59e7811699fb0973e43256ed92162267c7ca4b57f5887ad5a24e02\r\nMac = 8a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 96\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 973bfe5b3be573da\r\nKey2 = 94b3ec7f343e46ab\r\nKey3 = dcaeabc8df405db6\r\nMsg = c8437dba76591a9031b3aa3b59fec0562d4eac439ca8efca57c3f2022b0ff775\r\nMac = 53\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 97\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = bc89867c43a74640\r\nKey2 = df347fb319464c80\r\nKey3 = fd92108a266bcdcd\r\nMsg = 1c9898ede16139560519e808ee9ddaf710a5bab30f54ed98230d1a44c189ea4f\r\nMac = f6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 98\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = fde925e301897f67\r\nKey2 = 54b3ab80f815df15\r\nKey3 = dc58928aa286c8e5\r\nMsg = b34f898d98a3aa0fa022b1b1d76953a5b3ecc88d60f2c79b59e1b1f636bc0d60\r\nMac = 0f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 8a704ffe43e951f8\r\nKey2 = 2346dc8501202a40\r\nKey3 = d67afed616230113\r\nMsg = b2b4cb5e90ebf4bd265093b7f5efd4d62dc60e29737aa496e14929724e40c74f\r\nMac = df\r\nResult = P\r\n\r\nCount = 100\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 8c1f29f440f7f8b5\r\nKey2 = 5b45fe8f1f688661\r\nKey3 = ba40f43d9e7cc86b\r\nMsg = 220817144a15a0a654fc1beaabce60270aa72df83591754ee7a5fbb40b7420d7\r\nMac = 80ac51c2ef7bd5d7\r\nResult = P\r\n\r\nCount = 101\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d66e76d97f94ea16\r\nKey2 = f15e3ed06dd94598\r\nKey3 = ae073d1a6e5bc819\r\nMsg = 233d547ab33790859ab0dbc7a93f3bbebb610bed9acbfbce1fff580e9a1e8ef9\r\nMac = 4cb8ce681e4bc7c8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 102\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 0437836df770e943\r\nKey2 = c96e2c43bffd5298\r\nKey3 = 8552fbc16215e0c4\r\nMsg = 4f87d730bdfc7a7c72525c6b26ee9cae9a219b30d9575fedbd913a07b615a616\r\nMac = ea79cbc28f4264db\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 103\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d849ba8570b6ef9d\r\nKey2 = f1405732aeb61f92\r\nKey3 = 73c8e51ff167f857\r\nMsg = fd03202d0bd109b6e4299c7390c1407cd21ffb110013e6381185dea8f8707de6\r\nMac = 71070b17d05dabef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 104\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 914cef7ab6d998dc\r\nKey2 = a767abc18cf485e9\r\nKey3 = a2624ff20b2a408a\r\nMsg = bc5ce4c0bf3ad1a93e5306c9d7dbb620dde8708efe84e78c2200f41a958cdef8\r\nMac = 3cf4aaf3d337c9c8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 105\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 757f52e626eabce0\r\nKey2 = 700d91f14554bcb0\r\nKey3 = 548640d0dfaec2ab\r\nMsg = 22a4cf581584346095783be0982744c6201ff040760f868ab63895058d1edb88\r\nMac = b008b1150535ef11\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d65d0e58d3133b34\r\nKey2 = 289e58704994a249\r\nKey3 = e3df20ae3d585e2f\r\nMsg = 94c8414cbbec52e2d73bb8f02ef687c91432495c0c744666317d02e6d46706d2\r\nMac = b1292e1c7074dcfc\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 107\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d77a4989f4a17f2a\r\nKey2 = 409d91d51fa4d045\r\nKey3 = 6bb652ea1526fd4f\r\nMsg = 7a08ce579ae7af8004421cff72715e0b137da81f47d8f84da34c3ed53c32c0f6\r\nMac = 8b3cb70477ca7ca8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 108\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = e670c17519d9c2f2\r\nKey2 = dcc8a132629b462f\r\nKey3 = 58c1d52543ad570d\r\nMsg = a6dbad96ad23ff61479df39b99f0673a09f2a7eaebbd34b95d05c4146fa989f2\r\nMac = c470ec40599a0a11\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 109\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 290d292a15b6268a\r\nKey2 = 2638d9ad83ad1f34\r\nKey3 = a7d9ba62735dc2d3\r\nMsg = ef995cbfc49b0ebccdbd37d9f40a431c385d33d4b8234d7f0d6211eaddfb709a\r\nMac = 67ae62fb8142bd8b\r\nResult = P\r\n\r\nCount = 110\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 4faba73bcd5b5dfe\r\nKey2 = 1c97ea85207a97a7\r\nKey3 = 19eff116100dc82f\r\nMsg = c48e53c6956432460584c7ee1577c1c38b7fae2ff288199be25bf64081154139\r\nMac = d68a4558e95a67e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 111\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d37c3dbc2f68baba\r\nKey2 = 918cb5e39237e016\r\nKey3 = f286b0739d38c4fb\r\nMsg = 2533361761ac80578fa262a50462045e3ec6e4d5d25c6e99a5c4ccf75f5affc0\r\nMac = c20f36e67732f864\r\nResult = P\r\n\r\nCount = 112\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = a0baa71c38d6d064\r\nKey2 = 8f58ba45cb494ab9\r\nKey3 = 853decc431f7b3cd\r\nMsg = 20e394c7cc90bdfa6186fc1ba6fff158dfc690e24ba4c9fbf11b68519d573a8a\r\nMac = 4ba956b98a99d7bf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 113\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = b69752407c68b6bf\r\nKey2 = 8fceb05201ec4320\r\nKey3 = 2a755e372373ef26\r\nMsg = e884d65c87411584a56956d5b27ca9725b473c205b64cff09400671f5ee0473a\r\nMac = 9f3de5e8cddc374d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 114\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 8c04e0f27f83b0ec\r\nKey2 = 042cfb6883348fe6\r\nKey3 = 404f5dfe587ab591\r\nMsg = 8a34cd562b111fe04fa0bf5e004faedaef99d0bab9344d966c8b3847486e6f40\r\nMac = 6c530215fb25015b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 115\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 429401ea49cd97b0\r\nKey2 = a8f1b6b63101cee0\r\nKey3 = 20bcd08c5d16e049\r\nMsg = 591d88123fc9a786b247e8d5ce155f136d6fe4084117c41f2056b67f9e3e1077\r\nMac = 6c414640b424cf56\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 116\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = c470255783b32f01\r\nKey2 = e3aed6705ba4291f\r\nKey3 = 7319100e54f432d3\r\nMsg = 01acc3282fe41b62f95f5dbfb7e7bfef694c5fe34ca87d31abe7e7bbf887b48c\r",
-    "\nMac = cd99df4814667454\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 117\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 73c10b833e1043ab\r\nKey2 = 18dcd343645d5207\r\nKey3 = 6426f7f88c3473c8\r\nMsg = 068e4a0b1a62dd64198f1b9ece814c2feeeee50ba814b70d7d42659952991b80\r\nMac = 1fc90834b7dd090b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 118\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 37eae98ff42afb25\r\nKey2 = f2231c028c29da9d\r\nKey3 = ef3da8d0c77fbf45\r\nMsg = f266cec01c5fc08c0bdabc9537bd1aa2df9f2b8ffbe5cc94722a3bca8de529ea\r\nMac = b3809c8b0eb9dd8d\r\nResult = P\r\n\r\nCount = 119\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 1358fb67155e0145\r\nKey2 = d02c54a1206b5d7f\r\nKey3 = 1c04ba46c74a5d49\r\nMsg = e38b4c3e7a82643beb3192426555ad9c9b2620d677373fc40c9ddbc4cd531347\r\nMac = b000e2ea1ef48a8f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 120\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f6b9a81067255b58\r\nKey2 = 927cfbc4cdec9285\r\nKey3 = dcd62345bfe03b92\r\nMsg = 246b66b10696adc45840\r\nMac = b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 121\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = fea186dc73d3807f\r\nKey2 = b8fec7387a197962\r\nKey3 = 4c91abe60db64ff1\r\nMsg = 8ba298364af144a8d5f3\r\nMac = a6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 122\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f264da8607ea439e\r\nKey2 = fdb9daa41fd34958\r\nKey3 = f85d6b859b9892bf\r\nMsg = 402006f6b18dbd11dcd1\r\nMac = 28\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 191c461adc4f7f4f\r\nKey2 = 75b932e68cb98cfd\r\nKey3 = cb2943857a1c9438\r\nMsg = 391deef3a9a41394d14a\r\nMac = 3c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 124\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = a2c2f713430ece92\r\nKey2 = df081ae9627a1351\r\nKey3 = c1ec469ba8c73b67\r\nMsg = 37a49535684637f67573\r\nMac = 40\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 7b61dac238ba3e83\r\nKey2 = d05e9ed34fc410ce\r\nKey3 = 98da194c100eeacb\r\nMsg = da22ad9825c195d1e297\r\nMac = 43\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 126\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 13aec10d13fd37c7\r\nKey2 = 89198c3bcd38b951\r\nKey3 = ecf843cdef7397cb\r\nMsg = b7625aa78d2961c0fee6\r\nMac = f1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 127\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = d94a68ec329d914a\r\nKey2 = 394a8acea420e952\r\nKey3 = ec04c8cb8602aec8\r\nMsg = e043f30a405c41938914\r\nMac = 6f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 128\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = d5cb7579582fb6a8\r\nKey2 = e67f3ba11383d61f\r\nKey3 = da370852e9b9c2a1\r\nMsg = 7d32f440151a7069fd73\r\nMac = b7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 92402f6eb54526b3\r\nKey2 = 924515d92ad5a1d0\r\nKey3 = 9ead2adfb025f81a\r\nMsg = fd44d8d0fea5cfdf3321\r\nMac = 2f\r\nResult = P\r\n\r\nCount = 130\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = a9daad97ad23fe61\r\nKey2 = 32e5988a37987a38\r\nKey3 = 31626d16a780c825\r\nMsg = d6cf17192f8ad745ab5b\r\nMac = 8f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 131\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 52c457d9d5d5ab94\r\nKey2 = 9d3875ba6d75fdba\r\nKey3 = 4fb91a863d15ce52\r\nMsg = 4effbf732e67af7203b3\r\nMac = 04\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 132\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 7304b65492fd0402\r\nKey2 = 62a4cb7c23708057\r\nKey3 = f2f7bf13839e01e5\r\nMsg = a630c0f362eef35b6a58\r\nMac = aa\r\nResult = P\r\n\r\nCount = 133\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 51b33425a1349792\r\nKey2 = dc5b8ca440eae6ad\r\nKey3 = 70adf49dd0a8f119\r\nMsg = af246a8a810cca5e657b\r\nMac = 0b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 134\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f22029ce51619e0d\r\nKey2 = 9d51bcc2089785e0\r\nKey3 = 689d62621abab3b0\r\nMsg = a9c9fb632423d367b3eb\r\nMac = 0c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 135\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 1ca226d0dc8c328a\r\nKey2 = f18a9dc176621f51\r\nKey3 = 3d765d20e03b4cea\r\nMsg = f9d9fb44919e47cdeaf8\r\nMac = b0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 136\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f3ce4992c851e3a8\r\nKey2 = 835ec1abef97f2c8\r\nKey3 = 5b92384f20dcc2ad\r\nMsg = 9094935fcd7c389dd17b\r\nMac = 3c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = bfd929cdd9c2089d\r\nKey2 = 8e49988abcfbf458\r\nKey3 = da73d986894fce4c\r\nMsg = 88018424fdb76c908bd6\r\nMac = 94\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 57bf2ca4e3629797\r\nKey2 = ef7f675443402546\r\nKey3 = 6e4f924038f8bc92\r\nMsg = dd4f0a872f4b7089d697\r\nMac = 5b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 139\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = ba86924908df08b3\r\nKey2 = 26b954ba52df2c98\r\nKey3 = bf38cb0e89b9f4cd\r\nMsg = a682e6fd64df4b9f4fe8\r\nMac = ea\r\nResult = P\r\n\r\nCount = 140\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 52859849a4b6c1d5\r\nKey2 = 380e73c7aefb0168\r\nKey3 = c479fef80eb6260d\r\nMsg = ee6857533675b5ed8d43\r\nMac = 43fd25f696cb0693\r\nResult = F (1 - Message changed)\r\n\r\nCount = 141\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 97ae01315d13ec52\r\nKey2 = c7674cc1ab0bbab3\r\nKey3 = b68fb99797b33b79\r\nMsg = ce9127f649bfff849826\r\nMac = 2dfe01d9bc07646b\r\nResult = P\r\n\r\nCount = 142\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 2b257032b0d9b0b3\r\nKey2 = 49f7c10e8a9bcd37\r\nKey3 = 20f4fb4679106ddc\r\nMsg = b2c62d03902c44253368\r\nMac = 14c5ccf5f9433a0f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 143\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 0b988c3d380e5b80\r\nKey2 = b86be99162029b54\r\nKey3 = e0bc9775838a58ea\r\nMsg = 61ababff3763183c348d\r\nMac = 28a2de26aa6b4074\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 144\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 26e9abbf201fe5b9\r\nKey2 = 7062a82f800d5183\r\nKey3 = cd45e654bf5d205e\r\nMsg = 020683e1f0392f4cac54\r\nMac = 6f1522d3c8186217\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 145\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 3443f4016dadcd86\r\nKey2 = 235dec80323e5838\r\nKey3 = fd583285e6efbc51\r\nMsg = e64eeb89828b4297601a\r\nMac = 5575a40dba5bc4c6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 76c7616785916470\r\nKey2 = 5b3d1f10e5252fda\r\nKey3 = 75a2d632a46ea18c\r\nMsg = ac7d701597f0ba879055\r\nMac = 06b98e161e6a6754\r\nResult = P\r\n\r\nCount = 147\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = f12367b568a758b5\r\nKey2 = 7b2f9770924f2c0d\r\nKey3 = 1f8ad9e9b97a088a\r\nMsg = b99de8168e8c13ea4aef\r\nMac = db534a059f930ee0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 148\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = f1adb67986923d8c\r\nKey2 = 02671957dcf75808\r\nKey3 = 52732ae970467019\r\nMsg = f759c3033d4ed34948d7\r\nMac = 2d9caabf50999ac6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 149\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 792f9770924f2c0d\r\nKey2 = 1f8ad9e9b97a088a\r\nKey3 = b99de9168f8c13ea\r\nMsg = 8bae64015d62f68565d1\r\nMac = a42f89527f5cb219\r\nResult = F (1 - Message changed)\r\n\r\nCount = 150\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 31ec790d4a8a131c\r\nKey2 = 562c8cdc07e331d3\r\nKey3 = f4a7467043924c4f\r\nMsg = 1798286c37c1504fc0d7\r\nMac = f0d6e2f7edce6349\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 151\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = adb692e376a12585\r\nKey2 = 8c8c4362ea97f810\r\nKey3 = 528f204c19f21a31\r\nMsg = 6543e675d34639a7f7eb\r\nMac = fac96e6804526535\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 152\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 62984a64ec7c4a92\r\nKey2 = feda64dfd9a24f9b\r\nKey3 = cbb04f7a1f26df31\r\nMsg = adb555fd5f5c6bdd9c4e\r\nMac = e8dee8714b285a00\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 153\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = ef0d58b55ddae95d\r\nKey2 = 80e07ca4aebcfd34\r\nKey3 = bf947ff4ab2904e5\r\nMsg = 1fe87a2f431f3718665a\r\nMac = 44a869aee76d79db\r\nResult = P\r\n\r\nCount = 154\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = aef4ceb55e3d37fe\r\nKey2 = bc0bb9d05bad972c\r\nKey3 = e0a29b2c7940ce9b\r\nMsg = 78ad5f3718acf9e8cc7c\r\nMac = dcc1d44200caf6f7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 155\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = a4403438f8fb254f\r\nKey2 = bac752cd83a170b5\r\nKey3 = 6bf71654f1854589\r\nMsg = 349566b6716e5f831d69\r\nMac = 7c08cc43ff4d8e07\r\nResult = F (1 - Message changed)\r\n\r\nCount = 156\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 2fc7f4c1ce042f73\r\nKey2 = 8346bf7a80b38640\r\nKey3 = 2ff74abfc197a732\r\nMsg = 43a32b8ab9b7ce4bbd1b\r\nMac = 8000a2612215014a\r\nResult = P\r\n\r\nCount = 157\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = c40ddc9e29ce041a\r\nKey2 = 583d6bc4c1a2abf2\r\nKey3 = 9b018fd5a4084a64\r\nMsg = 228",
-    "6a1eddd80737a724c\r\nMac = 0ff14761c982f890\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 158\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = bc327a0bcb2575df\r\nKey2 = 6b9483e6e0755d2a\r\nKey3 = 622cdc5b2916ab89\r\nMsg = e1be89af98ffd7d9257a\r\nMac = d6f4c8d96b3e2180\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 159\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 9e517cd616a48ada\r\nKey2 = 6d266192d5387a97\r\nKey3 = 8a081fda97c86b94\r\nMsg = 9e9fb0b2b77be6eeaae8\r\nMac = ba0b73fbffc0ab0b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 160\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = e0b9a826a85efe94\r\nKey2 = 4f615bce7cc1ba68\r\nKey3 = 3bb56d3d9816103e\r\nMsg = cfe9ee956cb1f5a60aa6ec79a3e454224b456879\r\nMac = 64\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 161\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 1e08a794a175b69e\r\nKey2 = f7d3ab46aeb9073e\r\nKey3 = 3e7cf8cea19d0891\r\nMsg = eb4f5b04517ee93e2c900e01948ac81ca56b2b26\r\nMac = 79\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 162\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8f26700dc140570b\r\nKey2 = 8325e3a889c823ad\r\nKey3 = 6b048aa73decf83b\r\nMsg = cefb55151933a488e2b3d421dea9720727188106\r\nMac = 85\r\nResult = P\r\n\r\nCount = 163\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 3443f4016dadcd86\r\nKey2 = 255dec80323e5838\r\nKey3 = fd583285e6efbc51\r\nMsg = e64eeb89828b4297601a5b3fcde60075fc2424ae\r\nMac = c0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 164\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 91a401cbb6460b16\r\nKey2 = 85438675f15b6e73\r\nKey3 = b09140318a767038\r\nMsg = 8c65cde13149d9d54a5bccc17747f1d5f3e807e3\r\nMac = 56\r\nResult = F (1 - Message changed)\r\n\r\nCount = 165\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = b78a16fb9b075d3b\r\nKey2 = dcabbf7a07150261\r\nKey3 = f7644a01d5dcea46\r\nMsg = abe2fd996bb6804ed3286c057df9cea6836a2dad\r\nMac = 09\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 166\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = ce8a467534cd679e\r\nKey2 = cb9ee6fb70a42f4f\r\nKey3 = 16c1e5c1459e4ac8\r\nMsg = 3c56ccfbe92023109983e740d6a53488b813ee87\r\nMac = c8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 401f0de0efd6dfa8\r\nKey2 = 16ae7c3bbc6e5b86\r\nKey3 = 4ffebf790815f1d0\r\nMsg = 9052d5e22e6712fab88e8dfaa928b6e015ca589c\r\nMac = 61\r\nResult = P\r\n\r\nCount = 168\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = d357bf5bef2cfba7\r\nKey2 = b757d3abf49b4ac2\r\nKey3 = 16388051da8a04a7\r\nMsg = b04e8f6d20924be8e4e2c6767f87b74377bdf90c\r\nMac = 72\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 169\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = f8ea68aba1bcd9e6\r\nKey2 = 4abaa4260d864573\r\nKey3 = a49840ab737af7b0\r\nMsg = 1fc99e586f87932445930a300eb28191d9c6215b\r\nMac = 19\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 170\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 94ec086d8c0110cd\r\nKey2 = 4ea11f327f70c245\r\nKey3 = c8d07adf7c7c5eb9\r\nMsg = 812dbc453a1fda59f73aceea3bc84d2c7a437dfc\r\nMac = b2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 171\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 9d575d582a9723c1\r\nKey2 = 294af47a54b051fe\r\nKey3 = 5131bff85bf12608\r\nMsg = 266e5305b96f497a956ae82b20367ebac0b14215\r\nMac = a9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 172\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 913d800ecd0dc762\r\nKey2 = 7f6ec476b6b07c15\r\nKey3 = 973262ab7c83b634\r\nMsg = 4670a266bebcdf95c62d36cda33d50e6650fcdcd\r\nMac = 4f\r\nResult = P\r\n\r\nCount = 173\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = b97ffe79d068ece5\r\nKey2 = 4a75fe2f67dae392\r\nKey3 = 45a4d9f17a9d70f8\r\nMsg = b53017500c100dea0511845597214484fc5f7f34\r\nMac = 6d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 174\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 7e1af10bcd86c283\r\nKey2 = 51cd37540e19021a\r\nKey3 = 988fd3c7250e2a6d\r\nMsg = da1919d4a2a7fcc34c88fb2065e52bf9dbc50731\r\nMac = 22\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 175\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8c0dc16eb9c80775\r\nKey2 = 6eeff20d3d5d5223\r\nKey3 = 258076b313611c1c\r\nMsg = b212b857f70c9f63d0c9d2ccd253c28d1534631f\r\nMac = 2e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 176\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 92c29eb0bf3e73a4\r\nKey2 = c6ecfbe6cd49bf4f\r\nKey3 = ef19d9d06d7a5e7f\r\nMsg = 969304e651ca62039088f8123085ac3263796b67\r\nMac = 57\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 177\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = a4432f52975e4316\r\nKey2 = 7f2086da04fddf4f\r\nKey3 = 8302139e79684329\r\nMsg = 5c9bcd197ea59e1b58b3da707b253491cc5a5ef8\r\nMac = ea\r\nResult = P\r\n\r\nCount = 178\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 5ae0b6d6c2855b7a\r\nKey2 = ec675d3e73bfd685\r\nKey3 = d3406b868fd3ae0e\r\nMsg = 89b9ecfef6f10e81f7956dbc7ca4a335047535a8\r\nMac = 70\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 179\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8f7f85649d5e08a4\r\nKey2 = ceda75687308e07a\r\nKey3 = 9215c4c19bdc0d46\r\nMsg = e53101e6eabcda32c13d7b1dd1d88e7c2ca3ddc2\r\nMac = 14\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 180\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 7061b5f46b98d394\r\nKey2 = 58c2ce3807623475\r\nKey3 = 0df8e3c432da8a37\r\nMsg = 1086953d352e94a51a6d4c59a2295e8fff5b311e\r\nMac = 554d4df88228eba3\r\nResult = P\r\n\r\nCount = 181\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 347a25a1ec433b52\r\nKey2 = ec75d97046152c10\r\nKey3 = 86b937b6ad1ccbf8\r\nMsg = 4fe6bd43c28143ea5d40919cb5330a7e674f5bd8\r\nMac = 3d0d841895fb7c65\r\nResult = F (1 - Message changed)\r\n\r\nCount = 182\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = b3701aa7da61512c\r\nKey2 = 46dacba40740e3c1\r\nKey3 = 8f79a4dcadbc315e\r\nMsg = 4612fb4586d7518d0d648894347ae7d49d043f29\r\nMac = e5dd4392afbeabe7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = b5b57acb2c7fd6cb\r\nKey2 = 70b02c9d8651c889\r\nKey3 = 07f485f7b00e45d9\r\nMsg = 9011231ec382ecaaae57f34de1ac6bbb50741014\r\nMac = d34581ad5a3e9e57\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 184\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 88985bdfd9852604\r\nKey2 = f7f829aec8a208b3\r\nKey3 = d5ba012ce6754554\r\nMsg = 6cad7f3b9f196839bbc5a7f755c09aa8e17c83d9\r\nMac = fc7c93552aa14ca2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 185\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = cd0815194319d552\r\nKey2 = 346bb634027668d9\r\nKey3 = c17f2a26257afbad\r\nMsg = e31b3d97ba6ee6f2e18f084215ca0a5ca0d816d7\r\nMac = af5772396bb63d20\r\nResult = F (1 - Message changed)\r\n\r\nCount = 186\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 236e5201dfc1081a\r\nKey2 = c81526bc85c7a2ce\r\nKey3 = ab91d0aee0d68931\r\nMsg = 1f36b9cbf3d4d4dfcc4ba7fafa7c229f0a9253f4\r\nMac = 27586cf856a41e82\r\nResult = P\r\n\r\nCount = 187\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 2e01198faeb6986e\r\nKey2 = 7cb564801f15bc5d\r\nKey3 = f2d3ef0d4fec61c1\r\nMsg = 27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb\r\nMac = eaa7b4a171e449ef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 188\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = df575b851331b016\r\nKey2 = 33ec7326e9ef31e5\r\nKey3 = 1686c1ec8a3ea16d\r\nMsg = 1e4e01d38ff65d05646d544b52a6df49b897eacc\r\nMac = 45789bd32147c0ae\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 189\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 43b68c1f29ef5b94\r\nKey2 = a7dfa1cbe9ea3df1\r\nKey3 = 83d3c286e973ada1\r\nMsg = 0ca9b0f6465db0e101f8c14b2e73859d9c355b0a\r\nMac = da439a51157ff0d5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 190\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = bf91d679268c85ce\r\nKey2 = 46b9f7bf4aa1a2c2\r\nKey3 = f7fd15fda2cd6408\r\nMsg = 0c2933e39d7e601ee6f2519eaf01294853664262\r\nMac = 455cd46d3b452a55\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 191\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 0dad9d451f890b38\r\nKey2 = 3416e3c240a16ee6\r\nKey3 = 5b80d6aefd4ab5a4\r\nMsg = b6e1de9abef7525c5dabbdc85746958781d50139\r\nMac = 3445a869cca839fb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 192\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 96858f8f2ab56df2\r\nKey2 = 5edc3b04b94ca7cd\r\nKey3 = bf10614ce0491645\r\nMsg = ec9aa18b3e7da99dcbd7de7617a79130abe3348a\r\nMac = c744a1392fc656c2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 193\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 46ad6ebad9644a67\r\nKey2 = da684aa48f23d619\r\nKey3 = 43a2316b40a46e25\r\nMsg = cf97c2abe3d0fc89e05538b50147a3f405391219\r\nMac = 7ac08967edc5730b\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 68647694efb32023\r\nKey2 = 0d2938c8fe1a4057\r\nKey3 = f479f16e7552942f\r\nMsg = 33a9c750bb532d2d37ec86fa851aeb3cad1eaad8\r\nMac = 3873ae02210eb5fc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 195\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 58d62fd92af7437f\r\nKey2 = 89dfb51fc807cd6d\r\nKey3 = 024fd04f40d5d0e3\r",
-    "\nMsg = cc293c9e1780b401d2e7fceef6f69edcf0f70b86\r\nMac = 6574bfceaf04b4e1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 196\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 4b377f98df0b7598\r\nKey2 = bf73f4c2cb074001\r\nKey3 = dc9857f47fe6101f\r\nMsg = 9ba5dbe7a8ecfbedadd7889cd7f1ae073e01ee3b\r\nMac = aaaeb7223578bbad\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 197\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 91c8851934cdecc2\r\nKey2 = 582562aef1205e32\r\nKey3 = a12a70eacbad310e\r\nMsg = aa390a0ae33751b0bd8de5723df91d999aa70358\r\nMac = 67f76912ed61eaab\r\nResult = P\r\n\r\nCount = 198\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = dcc2bacbea0dcd10\r\nKey2 = c18ca45ed57f8f97\r\nKey3 = 5d58157a677f1951\r\nMsg = a7573e5b7dd7f4ce9e4480f603c14145a27f7c7a\r\nMac = 2b6af968464ac63f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 199\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = fe6d49702f044f40\r\nKey2 = 33321613da401004\r\nKey3 = 8c3438f74cc2680d\r\nMsg = b15a118b3132c20c31e6c9d09acdee0e15fcc59d\r\nMac = 9f28413a00da00ab\r\nResult = F (2 - Key or Key2 changed)\r\n",
-};
-static const size_t kLen33 = 53587;
+static const size_t kLen33 = 58307;
 
 static const char *kData33[] = {
-    "#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 128 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:37 2011\r\n\r\n\r\nCount = 0\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 27b5686c79b3d242f96d3892c6135b26\r\nMsg = 00\r\nMac = c98d11822b9b4d7a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 1\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b4542a22baa348ee2d11ef62d44cebab\r\nMsg = 00\r\nMac = f7a2a3f519fc462f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 2\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 7256e344f68b3e7f9dd6e04c5c65135c\r\nMsg = 00\r\nMac = d4d7fcc5f979230f\r\nResult = P\r\n\r\nCount = 3\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 7a2116595c5cf6482199d3312498006d\r\nMsg = 00\r\nMac = c3c4fa28709060b0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 4\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0341551d6c7e7c57f678068f0b41d1fe\r\nMsg = 00\r\nMac = 821030d4b7889fcf\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 5\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b67ba2aa4e9ea9871c3def87e2dd77f4\r\nMsg = 00\r\nMac = ea896182698ac145\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 6\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0091d39f3478d2c59bf874b96db9ce0f\r\nMsg = 00\r\nMac = fb12c5971b0f2f18\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 7\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 46a2e6bd3fd5336abf02eace3cd1e1f6\r\nMsg = 00\r\nMac = 9c6b46ef046ae1d1\r\nResult = P\r\n\r\nCount = 8\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 4b0fbd5e6f9298e5ced5ebdc60fc18a7\r\nMsg = 00\r\nMac = 221857badcbcd2be\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 9\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = fb20547da671acd4c6df37f6568a6428\r\nMsg = 00\r\nMac = ba0c9bfd3d9c0c95\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 10\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b787def50aaf446bf15c562434844562\r\nMsg = 00\r\nMac = ba60bdae64068330\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 11\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 67d77f50727c7cd5b38e0b175a888c88\r\nMsg = 00\r\nMac = 555923e6b5fbc504\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 6f552ef7d309bb98597b91cecc21e158\r\nMsg = 00\r\nMac = c2aa402c0443dfbd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 13\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 411871267919a145532cc401e753ebff\r\nMsg = 00\r\nMac = 167a31913228f45f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = abfe32efdf0464cb2eaafca8eac30d9b\r\nMsg = 00\r\nMac = 8edbc729b1923e10\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 15\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 85504d59a12f3e17edfb0b6337d4a081\r\nMsg = 00\r\nMac = 9045fd77cb26dcb2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 16\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 55f7565826b0e2ccc1368f4de32022de\r\nMsg = 00\r\nMac = f82395416a8dc209\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 17\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 43c8f984390debb0f26c6b9c2df8518c\r\nMsg = 00\r\nMac = b5d732086bf8feab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 18\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = da288d2014616f16a2abf5923dea49ad\r\nMsg = 00\r\nMac = e03b67b53fc7863f\r\nResult = P\r\n\r\nCount = 19\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = e2f962d076df051c2d291b47a902ea0c\r\nMsg = 00\r\nMac = df1456a7edeb4e42\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 20\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 191b53e0c7d90161e5e2014e9b8aea31\r\nMsg = 00\r\nMac = 1e210cff3c90bd2e2a27a78ef7662f61\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 21\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 54666bdf6db300ee10982d14dac828bc\r\nMsg = 00\r\nMac = 9fef67209b8da28049b80efe98f85f13\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 22\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9a143c21cc6c9528b9ddd7e4405682e1\r\nMsg = 00\r\nMac = 1c3c3b6d1d86ac5787234f8f6d707acc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 23\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 802047ee1309e548ae81e93a17bff9e7\r\nMsg = 00\r\nMac = 1472aecaa0a09e45893a14090ed9a17f\r\nResult = P\r\n\r\nCount = 24\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = ab79ce74c0959aea0fd0b28ea5d0afe2\r\nMsg = 00\r\nMac = fde8a95536cc334f7fc8881a187afc61\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 25\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 644ac6fdc1e713ecb7ff1e0bd5729a57\r\nMsg = 00\r\nMac = 95a93bb50703521e6c1a8be1aab6a646\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 26\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = b4571e56f66a857daffbdc99370ceddd\r\nMsg = 00\r\nMac = d2742ea62f1d6513c4eb0e533922f251\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 27\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = abff2b097d688293701ff2c49ba48eb3\r\nMsg = 00\r\nMac = 17e724f66d4a9ef5dfc0cf903f8ff04a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 28\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9d45f6d97d1573de3cb3488befaf5b7f\r\nMsg = 00\r\nMac = 96ec3cf234d6704483a93885bd67e6dc\r\nResult = P\r\n\r\nCount = 29\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 00d385629e5df815a5300e6635351934\r\nMsg = 00\r\nMac = cb23bb449ac26e2186b02f7428fa022b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 30\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 2f9109e7eea21b2615c81c03182ce603\r\nMsg = 00\r\nMac = 4532211f48124a9eacd795ea4313adaf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9f3830f5cd40a2396b6093b358cef1e9\r\nMsg = 00\r\nMac = f5ea59ec909a8ec2d8b11f5f276201fd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 32\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 17378e17c41586b88523a6b6af738dc4\r\nMsg = 00\r\nMac = 40cc8b388be6789aca584659acc7aa06\r\nResult = P\r\n\r\nCount = 33\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 064e8c88a0a0766186d75867b5ca3acd\r\nMsg = 00\r\nMac = b2f94222a68fcf803868b00404ad170f\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 34\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 1e39f1cba97dac4e4d4f3bce7fda72e5\r\nMsg = 00\r\nMac = 60763815c1075c31078a9b44fe4b8427\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 35\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 06f0e4618e0ea8fa5443b50ea005b672\r\nMsg = 00\r\nMac = 295c6cd08b1d668d9fa85ef851b1e029\r\nResult = P\r\n\r\nCount = 36\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 648d77b57770b67ecda1ce7951eaaeea\r\nMsg = 00\r\nMac = 2f3fbc6edf5827fce440b9a7ff8535b4\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 37\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 6f3938932b5c1280311e892280d8a822\r\nMsg = 00\r\nMac = df02edfb316350c81dbee385d6e1d8e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 38\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = f909903451d1f9f45ffcb93a407ffb50\r\nMsg = 00\r\nMac = d176620722c5327270ef30956d7ac02f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 39\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 181d92c7df1ebb0924719e066e08b95e\r\nMsg = 00\r\nMac = 144f688fa0d29faf787c48cd0765eecd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 40\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0c5b763b1e97b4f4dfc7059e4896ba58\r\nMsg = a0b3c6944b35f7208dfb40b4c4ba134a14dac928b679950793b3b6751221f178\r\nMac = d922ea85b3992a67\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 41\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 461d7d629778c8b05a688bee4fc01e9f\r\nMsg = 07571a6c9bcb6f97d626796bc74e551d1c45cce38afed761706f6264b7e751d3\r\nMac = 794b224a85396a27\r\nResult = P\r\n\r\nCount = 42\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = b91c6b09bf5a0487a9b5ea2fe0c1f3d2\r\nMsg = d31fd388e97727ba0a35d34ae05d9980e5974f6b3d86e2d4dd569b70f394a159\r\nMac = 2665ff2785bcb606\r\nResult = F (1 - Message changed)\r\n\r\nCount = 43\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0737836cf771e842a70f3eeed7206799\r\nMsg = fce631a9eb130178018ca88cec966ae53ecc83a51d0a73173c8a9af10b4d04d6\r\nMac = 1eee822e37dd1e84\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 44\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 120132c315bfc9c4fb93023f5d3500d7\r\nMsg = c2576ed3189eff3205f5e01dd8fe7c64f12dc73c807c22918f607f9e43fcc5ba\r\nMac = ddca15c8b5a80cb2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 45\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 5363bd7d867a9f9f0592dd9940a791e8\r\nMsg = f34e86b8803d386573b81045df945df8319a93b613de4c41904c8e1879844cee\r\nMac = 109dd7c920ebbf41\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 46\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 3fa1c7cffaa167557b250634e8052fa0\r\nMsg = 4255f8af18df7237e0abe98421aec9634443561752d893aaffe76380e829ef32\r\nMac = 0eceab8d28dd4a2a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 47\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6583a4ff27b6e109046d11b977c8293d\r\nMsg = b63be320f92",
-    "e01260fba37312224494a2764dfc928287c75dc1cafee7b698d48\r\nMac = fa0cced22e896b40\r\nResult = F (1 - Message changed)\r\n\r\nCount = 48\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 5949378fd3135dd02ee1929014000411\r\nMsg = 65c16f4e66b10c7c153be7ba2dbe3a6d4eed3b04fec44188edc229747d52f8c8\r\nMac = 9ef023345848680b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 49\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0e80fa889b1d96a0d23d236d4d642a27\r\nMsg = f6f094e46cdb2e45fe49b18aff1427ebdac9710fa7f47f75fc9ec7140613ef3e\r\nMac = a09774009934c9d4\r\nResult = P\r\n\r\nCount = 50\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1f88dfd4f5c52c22b1db47f9f4fb6e2f\r\nMsg = de433ebd1cdabeac46b94cc00d984f172923535ca8fdfeeb860546357dd8e266\r\nMac = bb17b3983faee0db\r\nResult = P\r\n\r\nCount = 51\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = ab0ab9e79ee53a6946a31ea807258dbb\r\nMsg = 89ddbb042aa2aea5207b312c9831fb48138aca90626ef7c5ce474d5797ae1b2b\r\nMac = 72f316d5bfcfcf6f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 52\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1eb19542a0064564e096e5d7d60acaa6\r\nMsg = ca25504f3f5559aa0e88199ce1551c9240b5c76f55b83bdbf2777cded54ad3af\r\nMac = d936b1fca0a96aec\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 53\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 33f11aa36d8ab0fc53486839a576b31e\r\nMsg = a58524e37c2504468f77a9c21b0e6d1a6b5e06fa051d5b8025ef97fa69417cf2\r\nMac = fd64f7cb283adce1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 54\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = a7b81d8245129aa451dcb7229de415e5\r\nMsg = 2b2ec02aba10aee056443cf90585caa2510b3b835454a99f1324567b0dcbe682\r\nMac = f4cd48f32c9dc66b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 55\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 3c1baf0d915e5aec92bb62babad0ba2c\r\nMsg = f8f2424c2dc0d0f3821af7244038da0832c547be4ff0850b98c04d4d44a716b1\r\nMac = e17ea6862129d6b9\r\nResult = P\r\n\r\nCount = 56\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 943a49073db6ae94a88844ed895f8fd9\r\nMsg = 8a15e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d8190\r\nMac = adcce0ea2c8b11d9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 57\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = ebf8935f53dfb3bd40453c31f627c73e\r\nMsg = 7edddb03d861dc9796f8e069bde434681620f604db436f34b7a6a3beeec925b3\r\nMac = e8ea88729d49bea4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 58\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = f18e8feed77d1b80c31483fe69073d56\r\nMsg = 37c6206e23163c39a13f19de48cc25dc26e6f83cb376e8d2048ad7c141fa503d\r\nMac = 0d4f5cdb2a49b471\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = b4e41c7bfb8fcaa5236f656185c1496b\r\nMsg = 32758ae47884fcef766dd1fee1a7f55ca6f6691574e2ea097a68cd4072ef2e7d\r\nMac = bad08badb66c8e5f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 60\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 708484fba04972b815256c5dab12d5d4\r\nMsg = 97751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6\r\nMac = fa74b33267c5ffeca75e5e16978bd7b0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 61\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = d0df1bdf1df6203241722fb9c9c1cf74\r\nMsg = 0e41361ebfbe4e6580fb5751e58e98de8ee5d9849fe875026fdab15a85804c1d\r\nMac = de4992c9d33659620cc203848e42a279\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 62\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7c0b7db9811f10d00e476c7a0d92f6e0\r\nMsg = 1ee0ec466d46fd849b40c066b4fbbd22a20a4d80a008ac9af17e4fdfd106785e\r\nMac = baecdc91e9a1fc3572adf1e4232ae285\r\nResult = P\r\n\r\nCount = 63\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7b4c800f5071521119e4cc6deee8729f\r\nMsg = 775946f3014523b6ea37804585cadd35e74e9382ebc1022579fbebe407281b6e\r\nMac = 2f6697f5d067aecdb3ff5a09d9169b3b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7618d222630138cc14246e8fddcf98cf\r\nMsg = 432e3575a966958434da38dda3606f1f69adeaca536a7bf66c8b1e451edc3716\r\nMac = d7d78aac615ffc1bb32dfea41f2b8771\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = c8804fef18ef263c010c8a205e14516e\r\nMsg = f2d23bc605181e3894f61fa63d61ed4a610123ab7d3531c0b7579a58b74161ba\r\nMac = bfe5e2c10a5cecccd3de2529f340cf6b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = f98ac86ecb742c188852980b5150d100\r\nMsg = 4e6fd4fa7669ce9552154bd796644961b51067dc02303430150aacf671280031\r\nMac = 73df5f4d3ab9240d4fb2be775188adc0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 67\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 638d7d95ff5f57571261e23ffa081189\r\nMsg = 5f5bc4e32764bb00085667b7f1b15433f09c1f6fa48689f8f50dcaf5021f2864\r\nMac = 96b270629b2bfbf721f1a70eccf9abe0\r\nResult = P\r\n\r\nCount = 68\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = a5a20d8139472a4cb38993c5711ac2ca\r\nMsg = 73e1e75538f9a63e49a068189e3b0a1a1e65ca5d1295589bdafa3136deaa287c\r\nMac = 320647d53ccdf2335a9c9a3452c1cee5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 57656be54860414e8a62223381ca4405\r\nMsg = 3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df\r\nMac = 47c6b5a28d723129648aef418b74daa8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 70\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = e7b665600a2aa413e117c53816cbed34\r\nMsg = 5e4d49ab796025157add6d42258b9c506d9ce82bdd85c604360db0ff5aa4262c\r\nMac = e741166cfa2a58003dcae357d7a199b8\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 71\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 693cbb46bc8366086ec7cd7776f2c563\r\nMsg = 5a908ae85ff721ffc5096aeeda5ee83bddcf639e7be68d109394e5253c22dc9b\r\nMac = 9d56b03ef83082f601a9cc8730b0de42\r\nResult = F (1 - Message changed)\r\n\r\nCount = 72\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = b4190e3462e07fca26496adcb877724f\r\nMsg = 02097035a312cb02ea7f09fc1accc230a205e4a208e64a8f204291f581a12756\r\nMac = eb9604ec71aac0cacb63e0b369ae7664\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 73\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 4ae06c3b2940819e58eb24122a2988c9\r\nMsg = a2e7be3314238d7e4f604e134790bb15a87c09356c091b1aacb9f605b67475b5\r\nMac = 14b4507ae4b50cfe4989b544bede756c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 74\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 8d560de2e310ea69389221ce2e850625\r\nMsg = 04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e\r\nMac = 647f2874a083e82fa804b6c58c7b5c90\r\nResult = P\r\n\r\nCount = 75\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 0e1a79c5d734118c19eaba700f5da238\r\nMsg = 026470d57dad9893dc037b80978bf70c2e552fe46c8fe8c3ebf8338bda984d94\r\nMac = b936ff3bb8afb9e42351a2a3ad49d70a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 76\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = c88b1bc0050e19780ab53efbea175634\r\nMsg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098\r\nMac = c1dbd79e31c3b0bb824f16f735ccdfe6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 77\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = d87df10a53eb3ea24c003d2a65e44921\r\nMsg = fedd5813146a8c2af398d6066956829833b75e44b6e010e4f025ac0fad6f869b\r\nMac = 9dd7cbb34445bfb351d01e8cdb21d695\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 4d436a4a5c02b22ad49548b97216f277\r\nMsg = 2d73204f0b2d35806a8227206922ac9c18eff6ebddc73809179d67a702cf3e21\r\nMac = d2654d9bd6396075296cbe918d90670f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 79\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 8af7b74e35eb38f4086343bc329ab465\r\nMsg = ada1fa439c653d0cc88c0d129ba252e86c7d20a3087be93e920bf13d8e6f0391\r\nMac = 0fc9b177c874ea909b6beb1db1b802b4\r\nResult = P\r\n\r\nCount = 80\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 91ce6c87860aa84053f42e1abc16f489\r\nMsg = 4c287bc16196698d762d5fb428e801975fdaa29026b7b78dba968bfee0f534f27cfec57c6009c55c6261e0dbb14bddf76944d0c0648b910254df6c240e8a1a50\r\nMac = c1ce12f51aa823d0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 81\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = b7b774e5c9e2f6926660c48b8df52354\r\nMsg = 937273c7355e7b88a630d15be875234cacaa44e815f31997bf10b52c008cc3bb6d3724aaa0d7da0b391b252923d0eb6119575d346857d89af6af099883af5514\r\nMac = ff845eb2d77aa5a7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 82\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = d7572ed0e37261efa02f8c83e695efdc\r\nMsg = 85a327b0c7a31a4116e7fae0c0971e1578ab6fbdf90124b9ecacd0e70c909f51882cdca5a8b6b7e6b46d4660122bc9e1ae3932269f68e594075dbc293a2d4eb1\r\nMac = b8b3b7526419e069\r\nResult = P\r\n\r\nCount = 83\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 259129eb760f8a770410c160e4e13a6b\r\nMsg = 77d9c30",
-    "6aa257379053cf1f2043c388a301dac2a9e2bb89eb8bab6eb3f150fe391b7a3f628be6b4b649c5c108a108f0e0c55a0800b9954251ab07e94450a23d0\r\nMac = f9376f11cbec0ec0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 84\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6ccd61ed20f16ca7a78192f5b6ab5528\r\nMsg = 9211231ec382ecaaae57f34de1ac6bbb50741014a978160ce59c60491e64f30da0b8aa1442e42bc0f7e31973a0dd8c3c24eebeb7c329072ea7dd0b04bc163254\r\nMac = 94c275e6a4675d8a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 85\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 1cdc44c40efc3c0ed6fb84b0c2f78aec\r\nMsg = 818c636772036761af037c23aa8cb63e424f0ba0375b645de2f8f5af23d3ca3b9a5ca3951a6d02075a2c828eee326a2676ed8247164226b0267798632a519bf1\r\nMac = 74355397c7a29bb1\r\nResult = P\r\n\r\nCount = 86\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 2e523e9d8a5532127ec63b220838f11b\r\nMsg = e6d067907610109b8789e1ad00542539991677b9efc97a98d8bfcb50f3e334d0844323207fcb5a47e353e76d49dd573dbd17278dcc287b41dea8126cc7f07ab9\r\nMac = 7bd6745c6f73d92e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 87\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0eee5bc8994b723a580f67d45ccb194a\r\nMsg = 1dc4fcbc73dab4e73ed9d7606acdcd42b74972460c640fe50f028abdf255d9368fa3bc65b849ac31c8000eb47e5fade40ca167726aa927f2f043133d24ad0613\r\nMac = 486721355fff9cbc\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 88\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 388468d10bf0b770cc125f8b7d359261\r\nMsg = b9aaadfb3f60e48f1b421a9450129d75af2ce811ab0b1661680e9d5b147c38167ac7252ed40d916ae1e4519c3857d2c9dc2c538a106951b26d16433131438839\r\nMac = e13cef9392f4a80b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 89\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = edfe2e15edf0b0c28875651d4becfca5\r\nMsg = 70b1e2e4cf260b108f5a52d0d8234838ffd6ffe7b4acd78d7d6b95aa6342b598eaf402cb47396358ce61f8b4aa3a65bed0346e0036c3c5323f051f007aa58d0e\r\nMac = 7b70730219907d18\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 90\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6876df1a77e11165331a5ce2e0e6bea6\r\nMsg = 34b73ba208bbe1df06da768b0321243815df4ece555974dee2bf5732295f5ea9631939425e13c47681ae2ecb0bb85aa69be38560f5752a9d034222d91ad71044\r\nMac = 80e00df873439fe7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 91\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = e65d5fd5f446b4eab63d56b0a5eb1d29\r\nMsg = 554395f9b113c0f2a1f155de171d6c0a805c838beb90c3756e8b864dc52517c03d8cb894d1dceae092f0e8784c7775ac664ad7320afd246086b3bc9ef237171c\r\nMac = c60f8ced2efd52fe\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 92\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5bdbd06f4df6e15d644f3a635d7bb14f\r\nMsg = 4fcc7c2763a8dd5bfe74e34f512be8042af9ba1c73a944edfb616ad47a8d34cbcf192f3e8be3101bb3709b29c2dec39aee1913e3ac524ccb76ad50c2cc3a3e75\r\nMac = af33d5a2746bfa5c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 93\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 13bf2f72211cc8e16ac1986a22e19f60\r\nMsg = 8ee212ed4bd110ca6a91b37bca59e19ba842e3a1b50619bc6b07ec02a09303ca5c66ba56e870d0b627d95fe829431244fe4f9218c862418f14a92bd76b5a3a82\r\nMac = 18e8cd5bd42c75ea\r\nResult = P\r\n\r\nCount = 94\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = e9b913c2f0630562eb1c16b3b1ed8409\r\nMsg = 031105ff01daa66ff95834e47b6f5c683994084d0fcb84c140d1dfa2039a95933efe6a4f91af993d966e2e45677eb1e36159047928a38eeaeb5c9a64ea59f97d\r\nMac = f00a17da0fb9e6b6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 95\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6fa5a5991315702cba3beb33867c7bca\r\nMsg = bb0fabffbcc6935ca35755fd4bfbd192b6812cf75c4dc95bc3a175a1501be2065d7f57058cb7a5785a185dfff7e740a5551cf7c17e65051b2c6ef9509360e878\r\nMac = dcfd143f86442183\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 96\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 3f8c6d21ec05bc439bf82774f1812bd2\r\nMsg = d726deb8537bcd671ddbaff8fcc6968f951b71aa82dfc802a53aadb2bcc2ef9a35fd90064320798b311d6d32f7dd3cd90bca39d57991eddc36260d23b108aac3\r\nMac = 449e20567875d56f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 97\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 8ed1a4873bb37fafd4f8c2ee417443cf\r\nMsg = 1652c9539bff4b6e9f303f3e6b5d4b9ff7e85aa2a401ee8c2dc7b722dbaf6424f92ab9188882e2483405070e8666204f5a600b46949cdb830fd57433d63a55a1\r\nMac = 601eb06acc5a4e0a\r\nResult = P\r\n\r\nCount = 98\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 83a4669cb9961448cf418cb83a16098b\r\nMsg = 26d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f\r\nMac = 01a42494a10691ce\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = c9e6d0b3dcd8ab50ba5ff31d9c1bd95d\r\nMsg = 0d32c1cd73569ab2b10c67c167875fe22625358ed3469b424c5e052d4e49af2c97dfe1f947c972a08c938b327e01adbc48a7f57a89b49f49fa0fca5b50a57a2e\r\nMac = 476add8ee51b5e3e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 100\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 17281acb525b13653000ab45d86e7010\r\nMsg = 225750ca982e5b34fc62e277eaaa0f248532abf374933e572b0278566cc7cf980df26abefb493ef57f8477cac0bd19408a22e71f4ded84906996d8e7a846b5c0\r\nMac = 0f2aa7f2dffcf7df34c84d101aa9bab5\r\nResult = P\r\n\r\nCount = 101\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = d3624653ad0ed144667df0e0e355c29e\r\nMsg = 39dd298acc45cb597f0733572677f7102536c0dd86fcfcc44895d29af92a5b6a87c20f1b53087d4c874f4083aad32e877142d20ad87b1d8b7295587bfd235d9f\r\nMac = 795da5a50f5b7df40317616b5a470c02\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 102\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 813b3d579664cebe50a8e7050a0b4e65\r\nMsg = 78ad6517a09b99c1113d175f3129aade4d4a2516ebe054f15bc833d08ffe5e2a2d60c976e1b4b14cf8edd2c72baadb2db8001fd2b8798d39ac5ce27d592f1def\r\nMac = 20f40553bedb6496233e0b53143b6d10\r\nResult = F (1 - Message changed)\r\n\r\nCount = 103\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 21095cdbe94afa27d84bcd68276993f3\r\nMsg = 10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e\r\nMac = c0b806ce5eaceb51b53b028e6efea9c7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 104\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 6c769a4822523525bb36c02518475549\r\nMsg = 4af38908fa44b46873535b39f432d9b3e677f6d06d8719af3d15b936afe515fc13d62566481fd0108bd95f6e8dbe32b3c830b1f1127d868273610aa834ccfc70\r\nMac = c1934b9c74127cfd515521df330c0333\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 105\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 6b454930925ca09d39e1e39a2e78fbfc\r\nMsg = 2bc884394ab7050c14d66fb8901cac109c0126668d918a4419bfcc5d75fb6bc2ba07f6598d06cf8cffd62f3eb29f6a033eac7490d27aa4701f0fb9f9718d1b7f\r\nMac = db19b8ef218018e5a53abcc39b7c514a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 5df295be7c44d59c44fead3f1988356f\r\nMsg = 3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065\r\nMac = 81b3181acbc2d6d2960ec57441ff3c40\r\nResult = P\r\n\r\nCount = 107\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 387fc73be9f019913f2222d98053f95b\r\nMsg = 944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c81\r\nMac = 5de79be9ff9c3c9d64f9cce35b188648\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 108\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 7424990dee834ad05f4218861ab21eae\r\nMsg = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026\r\nMac = 38b66049ee8ed81f3f8ce2b45a4001ad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 109\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 232407986ad4a8e438990fd04ffa35bf\r\nMsg = 9d88a7970d4c58cecc20ed1811298a5b37297419ca49c74fe216679dafc938a656cb92bafb78efb31f24e71c2d5b5f994f6dfd82862adfd2faeb8c408fd22aab\r\nMac = 313d46dda3ccb75f497f9069c9478b3a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 110\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = d9bd6ac153cb0bc4e19e59c45cfe0d6f\r\nMsg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f\r\nMac = 3b17778955990ae58e03feda7fc43998\r\nResult = P\r\n\r\nCount = 111\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 857fa35c6f70f637a9a5e6f215c694fd\r\nMsg = a1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e761286\r\nMac = e1ddd63db51d3035adfd309ddc186238\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 112\r\nKlen = 16 \r\nMlen",
-    " = 64\r\nTlen = 16\r\nKey = 501f5c58355d1800f155f272dd09afee\r\nMsg = fd3564848ceb5d8cddfd50732956d18b4af433efc2e2a914ff66aba1de7b9b816d81a936f534f47038dbf1def7c11144b7e99ecec5fee6a478899cbeb6677bfa\r\nMac = d995f9bae6150996cd9b798fcbc623c2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 113\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = c1d636989dfbcb0edc9f014cc82da6b5\r\nMsg = 20ef1bbf8a719497797f1f1bc4617179ea682a24a92f0831cd215a01473bb8207e13f26dea1a467bde1ed638a51359ccd11210c4d0a2fb70c0374e8984f81f17\r\nMac = e4972a59db04f78da1728cab051faa98\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = b4bc5a4d40716fb06a359ef9537726b7\r\nMsg = 36594fae7b487798d62c2c95ccbf51c984df5ca6343465b2dd147c8b36a34028e53fae61f51b36b28529143cbd3edd0c077158a07bc490a79a06270940f7ed27\r\nMac = cfb3fce039ee2bb94b6961ff86688237\r\nResult = F (1 - Message changed)\r\n\r\nCount = 115\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = dc796e5d9b712c798922eef315cb4728\r\nMsg = d5755c40f52364343d2613420441afe9da9a5329d3c1e5a123ee49f5eb8ad47253f104f5d9776e08e9a9f74fadd5472326cc7b7c7ce61a1492474bc9de614543\r\nMac = 315f0ce76352448bbd8a5012a9907a23\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 116\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = b82fd283922e730a07f7ddb87484f66f\r\nMsg = 94e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4c\r\nMac = 86e6a8485b43f1b258eb59688af91fbb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 117\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = f6db7efdfe73dcb4a26b8448842b55e8\r\nMsg = a1fa1fcd5f095b2768e32cd733365a136a108e7493f212aaef27d86da253beb6154f103099344ee94db6304e41b4e856db0ca7fd7ab462f45a07d697b85cca1f\r\nMac = f998bba6c5d3efd78af9ef57e7a38f7b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 118\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 3c1ba92d096fba134dfb4ef412b2568d\r\nMsg = ba7725d74465f5d92454bff794e0be51c4d0af7d88f729834d57312c528d0a7d15694a7e0bdc334093173f1d2df1fd42e7891c6b192dc5ee527b2ffb92c66d22\r\nMac = cfe6022ad29a54627ae7c4f907ef4da1\r\nResult = P\r\n\r\nCount = 119\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 4a92337f017a85b136ba6766444bbe84\r\nMsg = b0a3a8aa5d4bdfbb4c5c52acdcc60405c379f752b077eed42f2d7777cc0329047b322b9837d5f655ea445b578d9dc7e990a3c6f97cccc6cad7951ee948194e62\r\nMac = 153eff3c035db2fdc752ebd22302adae\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 120\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 305ec69b23e4490e0f8a5241cb9c8c85\r\nMsg = c641cf589020b94026ae\r\nMac = 3bc054afa9771970\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 121\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 28929286bd1391468ac75f5c03689f74\r\nMsg = 3813592f268a7a863c3b\r\nMac = bf1b514d2f899620\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 122\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 1b3163e2d3a471b9823525abc7543c4c\r\nMsg = cada03e8c967f9732a81\r\nMac = 53702fa98e6f9a19\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = be1ed49e2cb0caf6b6a0940c58453b93\r\nMsg = 4a348c5ec996f7a97ef0\r\nMac = 3358d143dff4adfa\r\nResult = F (1 - Message changed)\r\n\r\nCount = 124\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = f18be18df045ba31b80f3283cee6a681\r\nMsg = 93006a06d7e6df775b19\r\nMac = f3252f061dce32f6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 125\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = b9dafe18a904ba761762ec3fe0e4120b\r\nMsg = 173887316279a47fc699\r\nMac = 884f5b21d478d60b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 126\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 31fee08df80cc1009e661230e25939fd\r\nMsg = aa54ff7466923b265fb5\r\nMac = 03dd2a9616f653a7\r\nResult = P\r\n\r\nCount = 127\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 65a28d970b2bc7afafb4069c26d264a4\r\nMsg = 1aa5a3a4e6c5e5394e50\r\nMac = e0423589b192caab\r\nResult = F (1 - Message changed)\r\n\r\nCount = 128\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 6dc38e37d1379732df4dd535db88d17a\r\nMsg = 0093c6d94aed50b398ad\r\nMac = 19b08e65d391c491\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = c5329fd99848e1cdcfa406ec09745ae2\r\nMsg = 6d83d0ad7cc7efd0d2ca\r\nMac = 8ec2709e1466f8d3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 130\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = e608914a930b9c300b677afcb8689d63\r\nMsg = 146629e70b37d8b83ee8\r\nMac = db78a639bb15c84c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 131\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 0a998d3d390f5a80ad398b2070489984\r\nMsg = a91c1a8d9d268ad153bb\r\nMac = 5643a8c99b99d944\r\nResult = P\r\n\r\nCount = 132\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 2b6f78ceace47509a43ceb6b761e7866\r\nMsg = 3c0a41a78240c9d2fc22\r\nMac = 811acef50d6c1913\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 133\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = ca481f557306f9ce386edd0cfde375a5\r\nMsg = 9f3488736ef6e2c3a51b\r\nMac = 57e8a0e5965399c0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 134\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = c0dd1cfb3add04cd67a8e59be7ac8dcf\r\nMsg = a7c559c82776f429ac31\r\nMac = 7e43a2b43d030ff4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 135\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = d3130d9e5ef516b6bf172953a37913a1\r\nMsg = cbe97e14c3100c9fc564\r\nMac = db9f674a2d0e9ed9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 136\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 9ec8661a880ebfd15fd8b04f2ae09dbd\r\nMsg = eff803e0fc809cc48587\r\nMac = febec8d41b6bdc1f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 137\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 6c2b091433833a0ed915354dcb70d982\r\nMsg = 90f1416768fca7dd48d0\r\nMac = f6ada24319e502ab\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 138\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = bc79d444dff9d9e722effab07b068cb7\r\nMsg = 07d5a925b724e2443936\r\nMac = f964302c270af24c\r\nResult = P\r\n\r\nCount = 139\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 1a15b24ba5d9648358f2c39c9da8512b\r\nMsg = 15b94910853a8f23dfb8\r\nMac = 8cdfbc13239e6aa1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 140\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 618fb69c8fb670250c306b3225687d17\r\nMsg = 7f54845a57d916866eff\r\nMac = c0d4db73891bb1efa232593407856808\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 141\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 8000aa080c127cbabfdfa5d9d9728c7b\r\nMsg = e53101e6eabcda32c13d\r\nMac = 5671badc409d4b170d4c861a0b3e1fec\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 142\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = b05b5557ab145cec2f00706dbc6a3c23\r\nMsg = 5e2f601395ec406fcf96\r\nMac = d00243508d25804548c4b4b512cb1906\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 143\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = e8b13346b61daedc1f9e3b49df8d1cd6\r\nMsg = 0593365419e0f75b6323\r\nMac = 871eb97850a776e7ad498467064484f9\r\nResult = P\r\n\r\nCount = 144\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = bc498326755503ff25d02805eb351722\r\nMsg = 9ece4c82fe9d38ef64ac\r\nMac = b5e88af50d1cff3d2b6d304edf042c43\r\nResult = F (1 - Message changed)\r\n\r\nCount = 145\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 4d248e73886a0e36b3ce7c6113477f4d\r\nMsg = 8de6fe3b24fd6c202ef0\r\nMac = c1a4f6d0ff7330171cfe570e900ce2c8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = b1b9fd78e3f8eaf4e8c91da62b2da534\r\nMsg = 482ea6f652067e8b791c\r\nMac = 63c6994c98bda91723f832020fa7d223\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 147\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 85e4e63341658144a99fbd17d94e3177\r\nMsg = 21ff834bec4ec6384522\r\nMac = 580c1e549a2ceca4743256a9cc972e84\r\nResult = P\r\n\r\nCount = 148\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 88b5448372548e6aab1b262630a28a47\r\nMsg = 36dbbff560ef04ea731b\r\nMac = 5fd17fd704baaf1ae6b3330ef2989dae\r\nResult = F (1 - Message changed)\r\n\r\nCount = 149\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 8cc76730ca47620d0b437112a2c93fd0\r\nMsg = c73be9f019913f2222d9\r\nMac = 2c73e2b5b84d8f4f3db1fc92831a03bf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 150\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 7b657c640f155f1ff461c83cd656614d\r\nMsg = be9c5e77bf1b9dcbd4f1\r\nMac = b660ec36c0c0b4d987439505f1bf57e8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 151\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = d5044e9f10bd274aad4f7e605bb828f2\r\nMsg = d0be84df789c98dd125b\r\nMac = a26e513b09f184caf8d76d76961d1466\r\nResult = F (1 - Message changed)\r\n\r\nCount = 152\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 24d6d4bdc9fc4cd05b2867e9123acf18\r\nMsg = 0f9703a3454c25c0b105\r\nMac = 41676ddadb7b960e0269c8a59a6d9b91\r\nResult = F (4 - Key or Key1 chan",
-    "ged)\r\n\r\nCount = 153\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 6aa049d06bf66d2e2b65541eaa3730d8\r\nMsg = c562ab24ae5cdb7654df\r\nMac = 0d4d1196158fec46bfa754a526ba4a25\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 154\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = cf3727509577f1932bd7a92589c11e67\r\nMsg = 831188efc5d1f6dc9bb8\r\nMac = b5d162c885d7d4f6f65f4188d6582240\r\nResult = P\r\n\r\nCount = 155\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 0bc2fdd890c19882640f8d4188b88b9d\r\nMsg = 296828cbee50f41d19b1\r\nMac = e583d77645a603d841eaafa8860bfa91\r\nResult = F (1 - Message changed)\r\n\r\nCount = 156\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 5bab8051e2520b75673068b9cda93cba\r\nMsg = f16cba03402f9924daa3\r\nMac = 97f7eab25dc3ab017a9affc0e400dcc3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 157\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 7ac46e3249ca28e1ef0531d80fd37c12\r\nMsg = 3e9ddb8121760bffb7c6\r\nMac = c6eb13d5087d05b4eba2e74b283b7fe3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 158\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 40f78f7ad3eede36e13bce222c6a4bc7\r\nMsg = 4fa8ad212ef73d37d48e\r\nMac = 3831419e62b51b7ced0d9117e48fabf6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 159\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = a1f82c9924411e98e6f93fa0d07559e2\r\nMsg = 7d4748147575bc0113ab\r\nMac = c23dbc58fe22b34f7b007590558a3080\r\nResult = P\r\n\r\nCount = 160\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 84760f98ec565d281496b1295b25150e\r\nMsg = 9ce942ec81f8226506d48788e3acf49fcab6da22\r\nMac = 606c2f459a9ce198\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 161\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 3b6dd5169350b230774b02b9b44f06bc\r\nMsg = adb1ad81dac0ebc650d48f7a9329755a83f293d0\r\nMac = d7ceaa858508c476\r\nResult = F (1 - Message changed)\r\n\r\nCount = 162\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = f98d00755bcb45e6822121fe7cb03c8e\r\nMsg = 7064a2491f716f4a2969815e4a281a54690ced9f\r\nMac = e14634c400b9f561\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 163\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 5d27cb435e7724a246f158576fdbac68\r\nMsg = ee8ed4c12b0cf7c03bf91fba31a6a7b2d64c36c4\r\nMac = c10b474c0077a39a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 098c12058a0bc5951fc092aba322e1a0\r\nMsg = a2b76835229017bd0e8167a40ea1e2e18cc5db0a\r\nMac = 1d44128c3db0f7b9\r\nResult = P\r\n\r\nCount = 165\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 74f7f6516a17d5386c289756240241ed\r\nMsg = 8eafce9ba466fd53eb87f499d7c76bd486db0e90\r\nMac = acd978e0065375b6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 166\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 013bba67d26c7e52ae48dda3b67c9c96\r\nMsg = 48c0d53b85e6fa4928d3e9953afb9b451bc91a48\r\nMac = ef41ce0d30baece9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 14cea4c46d837c9439b088fba0e9d85d\r\nMsg = 3477384c396a9e9efb3e169722cba779fef240c4\r\nMac = 902158426696c229\r\nResult = P\r\n\r\nCount = 168\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 24f7b08fc2e6af6402243e22ca0626f9\r\nMsg = 914cf55a3fc739b5f87ac7518cc4171b4499d951\r\nMac = b775a3c1dc11d074\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 169\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 35b5428d440503773f30748ff843be68\r\nMsg = a5e5804cfdded4d610d1b05b7313ece84f369ccc\r\nMac = 6dac0947366be803\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 170\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = c8afe4e5b1d019c2efdbeda65d874ba9\r\nMsg = f739e632436470b5a1db9fa9796ed384c0523f40\r\nMac = 04c8aceaa8f8c3a1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 171\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 05a7910edcd7252b37e6d3d080a9ee90\r\nMsg = 702db7761abb9b5de41a86c8659270570be9d52d\r\nMac = 889a990539cbc30a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 172\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 4c8b0850eab7b212ad96dc7a032f8855\r\nMsg = 2de32ff6ca41b4c97424b121b8ad4edb133c00ea\r\nMac = f5ce7f46d457ec37\r\nResult = P\r\n\r\nCount = 173\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 687bcb63755f2b5c7daf4a154e8525a8\r\nMsg = 02778ca34db1cb5df76cb1a7619448f67d63b26d\r\nMac = 49d48bb0a684c6f2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 174\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = f8c4e562fde4379b08e512b0132766a4\r\nMsg = 627868b46ba546252f4eaa1c25205ccff72902d7\r\nMac = 5459c0ac5bb6701a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 175\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = dd235b05c15479dfe0326ba206ac784e\r\nMsg = e044ec24ddc0605bca89925a4ebc0234811e2a0b\r\nMac = 5ed0a03da09555b3\r\nResult = P\r\n\r\nCount = 176\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 665c2d7d6e69c2ce8f0d06b41038b83c\r\nMsg = 4fcd7541000cfc223fe9da6a030c681d0fb926cf\r\nMac = 1f022feb38ae6131\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 177\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 2efb7cd914a59b6ad63b7d1812f254db\r\nMsg = 67c9fe3e163787705a20f2fc8c468c4f771991fe\r\nMac = a866d6a31c0b42e6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 178\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 74f6fd37ccb4b7702bb3a03b7322c0d5\r\nMsg = 011ecbe98c5cb7734476dedbb852e2474a5ad594\r\nMac = 707ec713b9bce5d5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 179\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = e673b3a954a00082cb7516ca9a54d9a1\r\nMsg = a6fbd41a838bdf0fab3e7b56c27a8c18dc4bf970\r\nMac = ad4dfde057b54a27\r\nResult = F (1 - Message changed)\r\n\r\nCount = 180\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = ce5bf070678cb07e963263b1562ff793\r\nMsg = 2bd10c4397a19fc79a307116a0847e0aaaefe813\r\nMac = 299e5910f128a1f091dfb6b70f6a60ea\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 181\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = bf144c9bb974729aaa1188ceefdf85e1\r\nMsg = 5e1ef2ad86ceaf5439fe87d2ec9bc41b52e5ba01\r\nMac = 58b4a32ae55966e42712721363ac9eda\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 182\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = a0cd07b684bb9e0e6692e320cec4510c\r\nMsg = 6e1e490a30f0c9e3d3b79f1c36aab742bd67c585\r\nMac = 24dd518ffffc1070f13d50d0bca42711\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 183\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = e3ceb929b52a6eec02b99b13bf30721b\r\nMsg = d2e8a3e86ae0b9edc7cc3116d929a16f13ee3643\r\nMac = 10f3d29e89e4039b85e16438b2b2a470\r\nResult = P\r\n\r\nCount = 184\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 4073251950e3331d03d67a2399576d28\r\nMsg = d5dfd0321b26e578fe987456ff061dc1cdaa4161\r\nMac = ed2823fb8fcae918064cef6211646e50\r\nResult = F (1 - Message changed)\r\n\r\nCount = 185\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = b08f47101365111133d974e8f0206507\r\nMsg = cefe484955fae117649ec158416a7439f29a596b\r\nMac = 3317717c6c0b138275090ea961c8d58f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 186\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 166fb8d0e110124c09013e05688605ee\r\nMsg = 24c65f715742da7d06046c783a35b2648180b4f2\r\nMac = d27901a86dbf0ed8bde0d69203646b7a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 187\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 20f6f56117758ba47a08dadf93a59056\r\nMsg = 7514e0f402e73d9c0b0576782011b2e6b2080a6a\r\nMac = 11cda489b6dc0ab48d111ee6cb26a829\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 7fa6ef35ad594a09cb74daf27e50a6b3\r\nMsg = ac0d616ed7dd3c3e86b3507d9f2bdc3a807d490e\r\nMac = fbad2fc6c9d0e5d21b25445f499eee10\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 189\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 815871a8300471dc325f8289d0d37211\r\nMsg = a8ff31e90556236cb4df078943c1f2528b42a7ce\r\nMac = 5544c93de980bcf653354ce08aa9dc3b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 190\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 06aa3f6fc20f867b42ec234a1bcb8665\r\nMsg = 25df5cc617e6e68be181694721a2a112a1bfb7c6\r\nMac = 2eeb7ab470caea3317a6336f5eee24a6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 191\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 860f8fdb021b1974d40e3d4bc41fa967\r\nMsg = 6c982a616510db422cc2f1beb955c3e7a88b6097\r\nMac = d2280a55cd0bcd18846b4e30db6322bb\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 192\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 15105c6285a9015d0edd414d6a806bd7\r\nMsg = f1cc55636836e67909ed3a581de20630226dd5af\r\nMac = e9cc5799a630c6f26087c1bd3b6f1791\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 193\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = b47aa890b03a8ac0dbc8f96c30fdf7db\r\nMsg = 58b06c99e0d0256cb1c556ec3b48a3bce73450a0\r\nMac = 3376cacc247686832736cea7e67e13af\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = dd057368033252d9bb2081a0b1a0229e\r\nMsg = 81de8f50fbe35f7ed95430e74d28666c885b6100\r\nMac = faa08c5a3a4ffdce81ca31873197d0",
-    "35\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 195\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = baf5afafd7d0c8ad42a44e4e0a90fd2c\r\nMsg = cc5a4209a6a60dcf12621e17150b4576b918732e\r\nMac = 5a43002d9144a1d5e48c2dc8dc167a52\r\nResult = P\r\n\r\nCount = 196\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = fa6405355bfb5065dc81e764d20277bb\r\nMsg = 5dd1febed8e94d4715e772c3295b48eaf471daee\r\nMac = 29e96ce5ba930134670b3c68b5c512f3\r\nResult = F (1 - Message changed)\r\n\r\nCount = 197\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = ad2e3d3af6195e74b3e43296b1f618d3\r\nMsg = ca776f79b8581014ae58a4d533b60483fd1fbbd0\r\nMac = b32ce1f493b126fccb9829d4dbe76382\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 198\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 04ae7190f0cabd117d30a359f80b720c\r\nMsg = b885e5e147f967032ab2552829a6e09210c44a45\r\nMac = 9386d73a01960ab399bb7d290674b21f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 199\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 51fdc65f6bb0d20a3c08ac1493ddddb2\r\nMsg = 1f0a56fb615b594d938bb8a27f4b2f5463ee9a61\r\nMac = 8506fb1b74806381e2654c8764464d8d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 200\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = cfb7e930b838dc3644f6c06f2ad0c8d1\r\nMsg = 611db4c194dbb54d80a4f4fa731cd9a6a330eaca734d3351f2cfebaba4bd541d86b3e35b4c1fa158edb0d15d610cd359a9c24878117f77f6b284f0363a576e0ef0\r\nMac = e9589a711f5d4a5a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 201\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = d179dfeead9d765d000462785459b1e2\r\nMsg = 795ee78ffdf302f3f1f2b31629ae918409cb42979afe3752dd14968d603678520e6b55884b5ebcce416248aa74b3cfe39dfedc2bb5246001503ca4d62cd7826f0a\r\nMac = f16ea84f554dfb54\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 202\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 22b7eb25e688672ab0e17206623094b0\r\nMsg = d830b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f55\r\nMac = 16229efcb7523025\r\nResult = F (1 - Message changed)\r\n\r\nCount = 203\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = a64fa98b4662d801159f61eefd1c8bc5\r\nMsg = d5982c462ad40458660cd7b120ce07fce9afe812caedcebdee536ac19b5d561d679dee8ea85d62552c86093a2ac1f8d179dbd4fc006ee4b16ebe6afd2be134498e\r\nMac = 2f9a2fbcb96461fd\r\nResult = P\r\n\r\nCount = 204\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = e4fb10325d18666c382e6cc2442381e1\r\nMsg = dc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7c\r\nMac = 8f771ffe0c8d3445\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 205\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = fdcd3459061c36c9a0daa0dcab2b967f\r\nMsg = 1cfa3342540d03ec3fcc8378c021443ba3321fbc26dad7c5b859faba004a082a21d6d7a43d2836cc3820d1adbe4c55518714d48fd9346a254f702107da8212f605\r\nMac = 6635f9e17949a14e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 206\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = fc593384e6eebc508d181fc49ee10e56\r\nMsg = a6c891c9dd1fcc982c35bc74cfe71651bae424602519672b466d80e160af51eefccc5fcf76467a25bce1a10853a0209d9beffbeb53228fea5f1e77ddc956ade207\r\nMac = 7a6fd94e3928d2a0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 207\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 4e4ff248f591ca27665960d9357a8de1\r\nMsg = 198d5c9c4aa35d12b62e8c4bf6f3f141e6ebefd8ab396c71f55e32bc82b094cde409547383bcc4c5e5cd2cfd2d616c8ae273e260f2c98e93f7267424b8c2421bf3\r\nMac = 9140f91a0cf70762\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 208\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = f20826990acdf225d9451a3d22f89747\r\nMsg = 03d340904ace1cd52d4b72a96d96afd77aee68ac3936415005ed0d56f46036915b1e5f2994ad49effe7bf3ee46170642e5a16f2eea804e68fa520fb79529d6c09a\r\nMac = f30b668f16bfe6c4\r\nResult = P\r\n\r\nCount = 209\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = c231ea8b75c65de68c49b76e7a3128de\r\nMsg = 5b50879191a6debdb96c0bfaf9086b7dc6e25594416b08d2c75fe16cc347d2e3c7410fe3dc030a6c161ea22f6b80973bc43d42d8558f83b32a1bfa3c03757a4d62\r\nMac = 65ba53ef4711e807\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 210\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 8ef18639bc8c831dc0b4aeeca25eff4f\r\nMsg = 094c4d9baead7c5acd7dc58f3b4b4f57f1406b4e6af81a034d90cfa94c01760f4cacb4d2c63671d16d9594e1116b0dc2c39319523afac10175b1a485a240f7cf3f\r\nMac = d84f89e16c3b1633\r\nResult = P\r\n\r\nCount = 211\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = bab9d79aae4a1b282d8c5aa35d5c0876\r\nMsg = 02815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d\r\nMac = a01f976031bc8140\r\nResult = F (1 - Message changed)\r\n\r\nCount = 212\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 42b97f583f64d88358885c66add5d03a\r\nMsg = 187fe16a764c0987a28088f5cfcf55a6b9591b6395d2d41043e09932cbc4b8ae073d08d39da9799b316eef2ed89851a8cfc4dc1c6d3cbed95663e0ecf25403e61d\r\nMac = 0820b1ca0cd34e5f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 213\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 4fd555bd3a5253a90b68b5d4d46bd050\r\nMsg = 1ef253c61ac8ac66734ea80eefc1dc077edd660dc3518b5ecf709f10302925a72a3938e7449f2ae707506a67022dab63113242e9dff0d027aa3d22c8462a558165\r\nMac = 3770a6cc988a28eb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 214\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = d3a8eb3f9e5fb264ff098d85c28dd763\r\nMsg = e97a0986bf75e0e821f5adda80778863d9d479bd8ac3e7fe64a053f8016c465d581487278ef6923610a1463bdedcded62aeb22fb210dde9a0949947f8c6a6e7753\r\nMac = 4947e6e28dbba216\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 215\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 3043857fc40be37fb0bda4f46894690b\r\nMsg = 14874a8b59b0178c5ec89cd7316d909371969c1a1a1bc8a29f78341d39ce085e7e2aad7c350a3e7b691d3929bc4b7b47fef56be9fe7e7520a00abad5308505f8f6\r\nMac = 1a8c82e9109a68a5\r\nResult = F (1 - Message changed)\r\n\r\nCount = 216\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = b325d425c810d22deb3209f29c5c1377\r\nMsg = e44c4202499440c12109296a35dfb1f669f97e7f415cd251a5e36943e134a548f0f2e841fa3541151b374c04665053382a24b99d731b99f3d411aa22644f66cd07\r\nMac = 84faaeb5a9756a27\r\nResult = P\r\n\r\nCount = 217\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 7cb6a84e99f5573c1eb27c0078f2127b\r\nMsg = d7fa7be9c10252d6e41bc1a08195a344ef77b81785cea6b4ba453d398bf6ffb31d80e0d6a45a4af283676422b5ca94c76bfb4334f61ae0abe884278976a5a3bd21\r\nMac = 64fa7f9284c24f14\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 218\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 00341fb81209c2abdfe3a9d607b98277\r\nMsg = 74f6fd37ccb4b7702bb3a03b7322c0d5fcc657cb2c3f1361488d853589d2d6207359b65d62d896ed66f217395000c2fa0d11f956332f2d4bdae55251adfe903b41\r\nMac = 4cf05b6e583c70f9\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 219\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 647a5be8a66c83b4b238975388e15d00\r\nMsg = 0db33eda4188a9165147e24e40f79fee1985eb68d51627287e9c4ec995a77d89b27fb2fa6a6fd3fb7563f3e710b6d20ca145a25f9ac8116d9f628395eb769f75f0\r\nMac = e8ef4f3cd7442246\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 220\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c98fc3416457d9eed0fa7ab1dc1b8a6a\r\nMsg = 190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428\r\nMac = 1bea94a457b2886e9098bf3ded932a3a\r\nResult = P\r\n\r\nCount = 221\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 87428d5a53f750abdb335f70ee13b5d1\r\nMsg = 7bb0c2ecfd141e7e93a897b259732b6153af3542eb7289b1a18dc0aefeb4d129c9e0e27d7ef25d3afc9945277e75cb87cc7d1c9cb39e7e6ab2a49bbdf65e1c6d89\r\nMac = a854d2da46afb77a787f0606a69cf467\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 222\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c725d9ef0dc6cfca84865cf5cc91d403\r\nMsg = d3208eb695e84c7a9250378e18be2f231ca3ebe72ba68e3ea4ff7bcf25206b43439bbd497e400dde738507cb542c7d6f961fb8bee99f0c8a6d9daf022368cc78a2\r\nMac = 35d57445a5f10fd567595fc668293e95\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 223\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 13e3fe7856cd680593a85cda3d6ff873\r\nMsg = b208e5a1a852caef0795150cf8313ee0cff06e3d28d438c2351484005661cbdcea6d8a3466aef0c6a460da4d7dc902ec99c073d086704112085a76dab0994fcab0\r\nMac = efb2bef5aae555463ebbeebe69791459\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 224\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 9b8112c1fb29fba2c8b0d8f16481b993\r\nMsg = f54105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d\r\nMac = 673281bc0effe92adfac4fef49477ee2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 225\r\nKlen = 16 \r",
-    "\nMlen = 65\r\nTlen = 16\r\nKey = 82e71e3ad1bc9a12a46e460a05ad9c05\r\nMsg = 41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64\r\nMac = 36f7df58abb54a053988cae066110ecb\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b46e219217ab73c34904e24c6d995b72\r\nMsg = 887d6576572a3d8f6a1649394248c4d09d15026ffa930c0659508bac4243e7360802af084f363c2bcc4c91a04c6e86f4f8b22615d7915564949ab60b8267cb91dd\r\nMac = 10c1d8054ac549ad24ae4af2d8de97e2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 227\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b66edcc59dc9d8e34bea3baf4bfc0d5e\r\nMsg = 57caadbb1a56cc5b8a5cf9584552e17e7af9542ba13e9c54695e0dc8f24eddb93d5a3678e10c8a80ff4f27b677d40bef5cb5f9b3a659cc4127970cd2c11ebf22d5\r\nMac = 0c5864eefc04a6cac4f053ab2f65f851\r\nResult = P\r\n\r\nCount = 228\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c607f631d792499ea43586b81fa3e2f2\r\nMsg = 21ed22abc7bbb62fb2d51d1fb8830ca95b16213f56291af976274934ab0d43805f71d9b906c44973f7d4b59b7a94d35c2220e7405dfcee98499c1c1dc92a89d7d9\r\nMac = 4e65b3d58492a0eebb66928a8214498f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 229\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = d9e9136339d361949242e4d8a0cd6917\r\nMsg = 419b9c9b093052577837862900e7de29273eb0678bf6238223b59176c78430b6f382f27bc8d9a95b53f26f1d12e545ccb434fa0a21b84fa7badb5872e208254fbd\r\nMac = 6c81094aded51ccd4da38d0412e7ca67\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 230\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 6f349dd8b69dd41c6f246a1685115772\r\nMsg = a5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb2\r\nMac = cbf41299c35e65fa4e2626430f95051e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 231\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c15e4e552c9197184b3eb0a74f5fffe0\r\nMsg = 7c4699a7d9e2d9f31410f20029676f3c97f5793f6732f95f6d33fd7ecc205d27b8e89eda803316a3cb9951f12111b4a6aeac606b43835a469eede86eebf63e5e8b\r\nMac = 77e77de5c5600900e5b928d4be3d5f8c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 2eda9b2c6d7ad95b644a8739580ab4a4\r\nMsg = beadccddcf392ee56a8913f057da183ab06ec538e581b52c027ff7f63574b32d8bc4116efa1c56f4a4a851695a87f5fc5f7c47b46fe67b0400f2599fc80fe68d7f\r\nMac = 948e63657b8b6e2d130f6f25369d6160\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 233\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 233088b67b741f07859d122a6a406d89\r\nMsg = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92493ff733c6e5f1c2e56805ef622a5f496049ee0ef51a0d41e9d363febb87070be558e8af61e86dc76c\r\nMac = c778152b00760fcd85bced0f58861d13\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 234\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b7471a8b2e50fb319f198a09cdaeb319\r\nMsg = 385f9fb139dbf88561b7a500b0c7b835fe57e2698c6d9f76de4fae6dcd45c47fd8a0811ebbfba35f43c17aa360f09c767c1cd9b70bb671fa638e852ace97cc73de\r\nMac = 1a8b81be875a4814e3f988c274784a63\r\nResult = P\r\n\r\nCount = 235\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = adf072ebb71e3400a2175c96fb0007a3\r\nMsg = a49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533\r\nMac = ceac74b3af8750467e3b3c51624d96d1\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 236\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 1b1d471add4e7f4fe197e3a4a44d06ab\r\nMsg = da06bd1405028d93fefa3c037b5ad551879451a28314bae86a7591b359f56e4b4e26e6fb2fe7b1af0f930cc2ae785d113e8b16546d59dbae9f41e7827be1ac89aa\r\nMac = 16d0021b1f9c00b37fefb60af3358d87\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = af5d4991c189dada2cb552c3c52d599d\r\nMsg = 1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd\r\nMac = d7056fe01f0ed1b20adbe05cbccc544b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 238\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = d149441e667b245d4640e04c53ca6f51\r\nMsg = cbb34794bc8bfdf93d3c8d9f87ec1482b516b48b1e8a89b5e3b5df70c423a243384215b4bc69c76c6b18c497cf82088af74839a8c98895869a16294dfc094360d7\r\nMac = 64f5e8dce5c3e0f9cc224e306de70b87\r\nResult = P\r\n\r\nCount = 239\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c2f5d4837f9f75fb440c3bccad7c2e69\r\nMsg = 6a84594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf18724075\r\nMac = df8c8c61e8d604e24c7e3d0115dbe898\r\nResult = F (1 - Message changed)\r\n",
-};
-static const size_t kLen34 = 69750;
-
-static const char *kData34[] = {
-    "# This file has been modified to remove the 65536-byte long inputs.\r\n\r\n#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 192 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:38 2011\r\n\r\n\r\nCount = 0\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 771887708683bcb3577fbd0e6c13cad39955eafdc226d17b\r\nMsg = 00\r\nMac = a0db9bb6e8891e92\r\nResult = P\r\n\r\nCount = 1\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 733fd349c56d1086794eb20ed59ddc89b065bb8533b968c6\r\nMsg = 00\r\nMac = c76f82937b457105\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 2\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 761d74be5fae170a1bdfa16081b44c1e49972e15ce0818df\r\nMsg = 00\r\nMac = c65feb3d5336dffa\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 3\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 40f4a2261f154280a311f5b172c7ae34243cf2c59b98d37e\r\nMsg = 00\r\nMac = 05d920e78520839e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 4\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = e27150ee958b998c8a7e8b9324ead937d15580d09d6ffc3a\r\nMsg = 00\r\nMac = cf60783b5defbe3f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 5\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = d9bf5efb694089b2de533b1a65c12ae96d8c5bd75bd67fa5\r\nMsg = 00\r\nMac = ccde2029fb26c8ff\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 6\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = bcc658b2e53d51ed00c567ded2a124f8d1f85fc72dce5f80\r\nMsg = 00\r\nMac = 35d0d9ccab5b0f41\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 7\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = e31fdf3891c9068f621430315fb1daf418c328baf5e6da97\r\nMsg = 00\r\nMac = 8802047c11abcf2a\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 8\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 16a10208e91807fc479607cbaa39fa9c7273d89ce403b796\r\nMsg = 00\r\nMac = fcedadeca37381c1\r\nResult = P\r\n\r\nCount = 9\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 50fec559910391abc23eb7f5eddbc26a1031c0abd0a29ad6\r\nMsg = 00\r\nMac = cdc41e9b491092ce\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 10\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 6e9e0ae953b1b486ecd6b766d7b961ab79bcdfe2ffe95e94\r\nMsg = 00\r\nMac = 5096b9fc700929c6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 11\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 48043c405ef221c281d1e88246b6e1dda77e072f9d10353d\r\nMsg = 00\r\nMac = cab96cfcaad5cc20\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 10c361934fd6ff77a5051879ff228b08d841660d48b4067e\r\nMsg = 00\r\nMac = 167e7227d59d65e1\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 13\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 867ab71470f2dc3f5f11f8bfa7272dfc9c888e8e03323103\r\nMsg = 00\r\nMac = 96d9e7b084448004\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 5b10c228b447968267293ede9131d9345daa18c11d71eff4\r\nMsg = 00\r\nMac = f7055fcd9e8a8fd0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 15\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 997b712cd9295dc43cc19b40679f218c27af3e8c638d2e5d\r\nMsg = 00\r\nMac = 79a13778151aaaba\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 16\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 465b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3\r\nMsg = 00\r\nMac = 945198b568ed3db3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 17\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = d233ef50e0ce1924abd315510464ce22de377026529085ce\r\nMsg = 00\r\nMac = 240698cd0183f002\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 18\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = eb6e828e01930a4b0afc8bda63160942ce32df7b2c38a8c9\r\nMsg = 00\r\nMac = c68fc388f0633ecf\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 19\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 471b8a2e5cb08c21d87e9eb7ecff1d6e6fc2335581769dc4\r\nMsg = 00\r\nMac = ab5e7c91c35a0e91\r\nResult = P\r\n\r\nCount = 20\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 8b404993b4c3f62a57e4aef272788206c8076acc32cf3a1d\r\nMsg = 00\r\nMac = 6a3beff4d1d0e84ea4d4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 21\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7cccb84fa5c1c795bc05a05ea5bc6497acd2de2d193fba72\r\nMsg = 00\r\nMac = 557b8efe4ca9c4e603f7\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 22\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f1d434dac8cefca05ba120a34840531bf1542c8fd03b1ff9\r\nMsg = 00\r\nMac = e2c299a2c5159eb777cb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 23\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7fac8beb476b470e13a404ded315db1b15a85c2783eb3017\r\nMsg = 00\r\nMac = 50faaf26afd61c5f616c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 24\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f5b4c2a9f096e13ab426dd8654fc7b8ae6a4a8d3daa16b9c\r\nMsg = 00\r\nMac = 535cde3d2c32788bf167\r\nResult = P\r\n\r\nCount = 25\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f72879cc3446de9a0a43ae1cf08935b8c83f9265b8cb2258\r\nMsg = 00\r\nMac = 4eeea4a1847f2a30010c\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 26\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7021eaab074be980543cc70c809186d93652d7674c10ddd9\r\nMsg = 00\r\nMac = d98c93f4e0228ff68cad\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 27\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7fd546397a9a0129861fb6815d419a307f90d259d55f3503\r\nMsg = 00\r\nMac = 13597bb97e38f400e686\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 28\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 563cfb49f1af034cd38d2112685a52ebce8dca93e84ca10f\r\nMsg = 00\r\nMac = 866bc21135b11ea1bc24\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 29\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 17e9555b9b4f89cb63f2e90aca95c27ead6a099bc41c4c05\r\nMsg = 00\r\nMac = b04b3bd1719d35e80e2d\r\nResult = P\r\n\r\nCount = 30\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = a65d24bd1ab92d8d294d654423412860e113c976f12ed76b\r\nMsg = 00\r\nMac = 83c1c0f3e89f6584bdd1\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 31\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 35555c801a2e7c68cd0c347e0f006be00fcce70fdd8d60ae\r\nMsg = 00\r\nMac = 7e3670cab617e79b3f57\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 138b3db9baca13bc66e893efee2b767ce6a912b172c2cda7\r\nMsg = 00\r\nMac = 4686805681afa38cb7c4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 33\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 1bc05440ee3e34d0f25e90ca1ecbb555d0fb92b311621d17\r\nMsg = 00\r\nMac = 1e9f80432b39f7318433\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 34\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 5776d94b577ed26820fb13c00ab0e2d1a1c3589bfdc45cbd\r\nMsg = 00\r\nMac = 4d5f56d3543abed97233\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 35\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 22e493c1f2e27c9be7bb07fc00fdd51089582d139b0a9f68\r\nMsg = 00\r\nMac = efe1c6493542a8412118\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 36\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = d52f030107a2becde77331fff0c24cd72ef62c0f46ae3e6b\r\nMsg = 00\r\nMac = d1b9c7f13b189cd828c7\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 37\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = be31363e5144d9ff49ee67efebeef6d9a97e22f8a3ceb209\r\nMsg = 00\r\nMac = 03228a1a80d5f3d87b56\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 38\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 6a46492ab7ae5f3dbf16ee7b8876e0b4f0449f3b4f8cd89a\r\nMsg = 00\r\nMac = f016af853140edf22d31\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 39\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 89ef2284d8245d87f88919d4d2f71a2df05ee21d85b7d689\r\nMsg = 00\r\nMac = acdbd54bfb1f20bb65cf\r\nResult = P\r\n\r\nCount = 40\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = f4e74acdeb91d0f0ab143823102d5baed1ffe168fdb5587a\r\nMsg = 00\r\nMac = 9c15bfd3c766f88190e54d395e5387\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 41\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = d9aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837f\r\nMsg = 00\r\nMac = 4a11b22e871b051ea74db3f763f140\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 42\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 13439fb32b1514d48de6002f5d12e19e1ced4caf35042602\r\nMsg = 00\r\nMac = 1412aad5e6b7f0d924700b438e0aaa\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 43\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = ffead92a4a5dc1eec6d2e441de9a9e1b7a88c607c9a79079\r\nMsg = 00\r\nMac = 6fb18d51e9a30fe6b7a6f405b3d3b4\r\nResult = P\r\n\r\nCount = 44\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 176ad1686a81992e042d6497a305038ba0cabf74c6ecd8eb\r\nMsg = 00\r\nMac = f676bdc753ffdad36628b1724b967e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 45\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = acd58261bcb2eb6345af7290b1d216c3016af6697bf5ab88\r\nMsg = 00\r\nMac = a6ae95e5a23b5f5a2dd8c8a520b9a4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 46\r\nKlen = 24 \r\n",
-    "Mlen = 0\r\nTlen = 15\r\nKey = 0b5eb52135dc6d9c1f56a2571c1389852482e7aa3edc245a\r\nMsg = 00\r\nMac = a46221058177012b073c6ebc6aff1c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 47\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 7bd398d1b9b45f7a024e70e71c1ee7132795fbaa2d63306d\r\nMsg = 00\r\nMac = 119bc07d7f3da0be3a87844b425c0d\r\nResult = P\r\n\r\nCount = 48\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 47575b64fd4797cda8d67e9cf115ae850d7998c39d2f8709\r\nMsg = 00\r\nMac = 3f2010bdcb2fd70241475db9381570\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 49\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 68627d802cfc43bb1a987e1ef4401fa84e8a7b2b43759f50\r\nMsg = 00\r\nMac = 1e0e3333ca5790a7e7df0d6d4bf860\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 50\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 7f16b90a18deec135d32c836063cde963fc4e6daa1555476\r\nMsg = 00\r\nMac = 013e1d0bfc7a7a6c838ac98ce0da2e\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 51\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f6\r\nMsg = 00\r\nMac = 7f9f1bdba93d26cc3c1f022244bff6\r\nResult = P\r\n\r\nCount = 52\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = fdcf28931c91b4b79c8f8332b4eeb3f995eb1ed2fb1e8ab9\r\nMsg = 00\r\nMac = ad7f8852f1bfd65dfbce3bb39db59b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 53\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 8f570ddd0963a80abec82caf8883eaddfd63cee9f375fa7a\r\nMsg = 00\r\nMac = 82b16380d804b8eef855afb5eb839d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 54\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = cc1d70d3050f022442093e3210f5b45f1b610dc0f12fef74\r\nMsg = 00\r\nMac = d1dc61c2ef7e2cd1a4e43dc34c0ba5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 55\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = a8a1cf9547543045fa2f00edf79bd85436bc1ae1d746790b\r\nMsg = 00\r\nMac = 48fc14782a351553ea453a3ec2538f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 56\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 123ff732cccb535ec7a1c47a6b0ead68df31094d896709a1\r\nMsg = 00\r\nMac = 8f29dcec0a5d026d6fe4dc64cd1d4a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 57\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = ed06bd049d772cb6cc5a705faa734e87321dc8f2a4ea366a\r\nMsg = 00\r\nMac = e3fcf2590fa9ffe093bbfe8d3d7b0b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 58\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = fa18c0b348aad167b7050c0ef6e7caf0436750873c7e4929\r\nMsg = 00\r\nMac = 630915919b6108770f5c3deaece1af\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = f66296bf67b6e91d8ad629c1b260cb5ca1985273925e73fb\r\nMsg = 00\r\nMac = 729f983d3b49b2ebf24eb04368a851\r\nResult = P\r\n\r\nCount = 60\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 2f4a6501d8fe7b65f607757ddff6ed87ae0681b98b53331d\r\nMsg = 2361d2ed837c14b6c231daf0acf2623779e0d952e98e14149308807f79145c30\r\nMac = 9a8ad7bb37d79321\r\nResult = P\r\n\r\nCount = 61\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = e2d592cb412e65f9044257d78e7491f9f80c8b08102c2d5d\r\nMsg = 4163b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f\r\nMac = ab85ac3a4f92ee2c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 62\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1534e69565cbc541bfde6901bd6e598e41a7a703091c2240\r\nMsg = 85b78269899a4712eaa9c3de041f5a74766ec27dd5265da8a117c6f277baaa24\r\nMac = 6b177203b17cc7c2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 63\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = f0302d9a197a285909657d611ce12458b8d24652e91ffe8c\r\nMsg = 3fd6b98961f31c7b7fff0baf1cbb5884a9290ea7b5ee49915efb4b510b6ccd8c\r\nMac = d2d84fac8ecb665d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 2081442435626f7ce377132c46385510d9febfdd90c3f104\r\nMsg = c4185eb75fc23adff60d6380006a1c20fa2ff466ffddf67e99a421bfd729188b\r\nMac = 7373df1900b7a3df\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 715fb6fb464513f3650a9d0c3687980ab9caa9876d69dfeb\r\nMsg = d60b3402ad9f5f09375862ae7a370f0c744ffaf5001c80e3fd150730ab848689\r\nMac = ba39c81c18821872\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = a4d9f94e644fbcd97e0d993cb0af507eed259fbcf8fd7083\r\nMsg = 677acb68500d6cbbf77a3f34f58840f0c16044827641dc43d6767ce98f85dd5c\r\nMac = b129c1785acf17ba\r\nResult = P\r\n\r\nCount = 67\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 94b911cdc3137a6f7f32651b788eb82975660aea52b2c03b\r\nMsg = 549aa84bb182312dd016e3107f3b1f9c5b6a89b543561a450ccf713c76e66ad5\r\nMac = 7b92156f8b36d5eb\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 68\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = d3fff7b6f08dc4256239fc112890429fa00393e84e9b294f\r\nMsg = 15d1522654bcdce344b5d9753a0a6f31c859d547edf520478a8b5ae41506d5f7\r\nMac = 2d778849023fc9e9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 77bbda69ec034d73e02b06f0af30e2dab60ac80cb7822eb1\r\nMsg = 1e6ee96598bd014c95e9540f5cadfe6885cd094e04048e81633d1d634f065f09\r\nMac = d35f3c169f67b597\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 70\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 544a757bc50658d7e73b25688e7fef86fb1f9f08ffb33a70\r\nMsg = e473fe5656713b3b0e4fd12c640e8c542950577f446b01d09cbc41b6393ef81c\r\nMac = e1dad03ab8d2f432\r\nResult = F (1 - Message changed)\r\n\r\nCount = 71\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1bebfde2d5468ba0a3031bde629b11fd4094afcb205393fa\r\nMsg = cf27b30423bd7e40d6b3aeb4b1bc01b40aec081aa00f2e3bc63ff61ac4b684dc\r\nMac = 617fdf927d0e4e42\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 72\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = ab83567833d2f3461b5fbecc0e366694bb5ea00933b2b3e7\r\nMsg = 58d43b9f1581c590daab1a5c56d6fbcff749e489acc3ed51ee6aeeac0104e6ae\r\nMac = b29232e882dcb8ef\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 73\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0e0fece7b6b659b642668e8ba3dca330523e70279155f485\r\nMsg = d8c35129ca5a84e2e6723332217f0fd2e19fd06eb27d84a93b75276270f97335\r\nMac = d7ea4755260630e2\r\nResult = P\r\n\r\nCount = 74\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = b15763294afa61bc27e0785500ab5739136f51bc78b65562\r\nMsg = 8e8271b2758964fa71520f26aab6f870fa76ea4aa220475b3b379ec4ef8e80a7\r\nMac = 6357fb64482d171c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 75\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0a\r\nMsg = d2c9c1300f5a7520614550f9d23dcba6b41be6733426616f32912f155045282c\r\nMac = a12adaf849719778\r\nResult = P\r\n\r\nCount = 76\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 35631c844313ac335aa0d590fec472d805521f0905d44ca4\r\nMsg = 766f9ac761a06f4e006f405f7b3398aecad253f5cb8653e091e17427ff0fc1f9\r\nMac = 49090265af87c220\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 77\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 35008ef5baf263ae233758ca237dec1a51d67fcd3573094c\r\nMsg = a8f1b7b73100cfe1a03003331d9d55b75fb0d2596ede723fae9240581967ba38\r\nMac = af6c2ebe004c6d71\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6f383f798df8f4b9f0a99206cff82709c367340c7b3b0401\r\nMsg = 9668a011e5a3a613ddfd149b0e529e9e66665006f98e730400adb4a8226283af\r\nMac = f97fcc39e240b547\r\nResult = F (1 - Message changed)\r\n\r\nCount = 79\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 9071be7a11dcf7a062d582dd5932f047396fd9eb71982bcd\r\nMsg = a8a6703044010f8301ea33bd9a808ca35838c9f58683ae3925ab67b9e1fe1ccf\r\nMac = 9065cbc5249ff8b3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 80\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 36ad69f192ae4dcab771aeeacf01bbd32609bcbbea8ff9df\r\nMsg = 6e60fac7c027aed4632444a95824e61e2c50aa3ecdaf09ed9cec92cec35adf63\r\nMac = b6bf70e67b315c256f41\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 81\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 0cbb1d567bce009d1dc5bdb8115607213ed9a516389f728f\r\nMsg = 634efdf89ce2a9fcbd38bdc0b4cece54dfd7532880e0b4ce6eb3a4010b7cb1e7\r\nMac = 4f0af4ff9a9c9e844fe6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 82\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = ec65afd2d72bf477c7fdd9fbe3f1694c328088cb5f39d9a2\r\nMsg = 10d0e88b0db8d515bdff3a791c830b28e4e3ff4fa63f45b31a3f73dfb457bf82\r\nMac = 7172095284694f5ccdf5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 83\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = a76b981540ce229e73064af4474a7ca4a042d03a6e6bdcbf\r\nMsg = 740d4b25ca7221d0826057701a6bfd66c50a82f010a57be8c5efa0af0f761764\r\nMac = 94b657fb57cb2fd6ed3c\r\nResult = P\r\n\r\nCount = 84\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 36bf85bf63b28093d2dae511990a0bbd75184044b033c66d\r\nMsg = c1fbbae61b81ae",
-    "bacf151f1bccfb1584f3a211fe797996938c03e806392e14c1\r\nMac = 71796cf452f61db7f540\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 85\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 67b79d9ef1a47867c7d21f19f99ed1085f17a9f092fac689\r\nMsg = d354c54151c9dcdf0d0fd8c51413c2645efafb2bf6b680b25ad76d3825a4c04f\r\nMac = e324e8d377447b40629f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 86\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = eafa8699695431ab3cfa1e87ffeae4b822a391653d2e9d78\r\nMsg = bd647990f7afec76c8f726d1de806ca0cae6f708b5024b514f11c4320913724e\r\nMac = b0da9d38a1e821ef1f39\r\nResult = P\r\n\r\nCount = 87\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 1fc4fcbc73dab4e73ed9d7606acdcd42b74972460c640fe5\r\nMsg = c86553a60da69bec1924788fc3ab985158a2d4788f33c01abead80974d26dd67\r\nMac = 992fd0b735b9fa9255c1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 88\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 618041501dfcfdd2b60d71c04d635f6357ad8b0643af77aa\r\nMsg = e7e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca79877613\r\nMac = c183b8f21cb2aac7201a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 89\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 53bcc9e9244e2fa1752c61e65aa5c592138447ef9287fdcb\r\nMsg = 92e962f0086591b6f61c2ce5af62480722ba6a640c3f53806c421de438358721\r\nMac = 105d286777da3f2a03a5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 90\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 6d2429921f90a22893cb65c4530e56068e9944d0b0f61fa7\r\nMsg = ea2ad7b7d3f80793391af0328fbb594d79898e1047210628bbc7441e135bfbe3\r\nMac = 482a75ec0ecf1ea59f5c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 91\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 3100d3c70e823fee9a1bf486ec1c56771acae35246535de1\r\nMsg = 4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b6578\r\nMac = b0deaf1bb6d0425d1810\r\nResult = P\r\n\r\nCount = 92\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 79aa6c03dde4bc5949921563264b440ebef71b3298da67b9\r\nMsg = 879954f977e945cd4db33d20e6749a6832677adbdd9c7e262e4acf632f665f45\r\nMac = 9863fe041d191777067d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 93\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 85467aa82c22ab019f9243c203b4371c95604dccee5d81ef\r\nMsg = b86edcc59dc9d8e34bea3baf4bfc0d5e117482a48e522c1b02a370e9124b379e\r\nMac = 54b2f4664eca96639f7a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 94\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = d37e7aa9215cb5c2c2fe81834f200192ada3dd0f4ccb9d69\r\nMsg = 064f85a23e049529c74c4f8267abbbe685b6a838841a9e304fdf14b835eee396\r\nMac = 536701771f51d2ec354f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 95\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 72e8c7d74cec3e248fe938a1159d8d969928e6da26b8cf96\r\nMsg = 58019989445d5ee855e0ffcf84e76f3383ae09cfad74276a3edaf05cbf8d714f\r\nMac = 182d3bf14cc391aef27b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 96\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 5f847950d2a5d44137110594d3c0afa995b36422ab36d044\r\nMsg = 70523bc397417e09d791a4976960e02636ca7144a5681cf7b116daa33eface2d\r\nMac = 5f0b325fbfaede23de5c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 97\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = b01e84220a7d514060a79088b754ac0beacb60e5b3a47020\r\nMsg = 036137cfed567fc5e234f18d6c2b8c7e9ae0f3fa526d6596e9a9ee7bf1abdf0d\r\nMac = dbe49af18c1e1bc99b73\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 98\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = d90ba47d7c9107b103cf167041dbd7b41d96016d93961917\r\nMsg = 2d53836a0437ccf27cdfe2bf2ad53f3082100a9f045cebe6b3031d21c9a6c5b6\r\nMac = 7252ee3b5eb76abeec9a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 02e5a1306f612bdec098458cff3e691d93f050ba11ba6273\r\nMsg = 4bef96da992ab9386a3463213773f3ca7164813a15e014ab819f153386fa04a3\r\nMac = 5fac9c1a1636b66e2f55\r\nResult = P\r\n\r\nCount = 100\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 4c99ce359b8b82b67ee990529a10f2ecceadad456925a57d\r\nMsg = 89ed296a3ac03fbfb71422b9211799150b9d766a8116bebd48bd0a5068132dbc\r\nMac = e0e9583d784f87e0b7dd8fd7494a81\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 101\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = f085fb257ab64013b43a59150864a31e76c9ae94913a56ef\r\nMsg = b90ef6b773f250d4dac6fb9e62babad69ab424c96a8c0625987c030a91d27d64\r\nMac = 96f1dc9a1c668bb203428181c016ec\r\nResult = P\r\n\r\nCount = 102\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 8109f3208d5cda0f12141e40c85959b72eff1a937dae7f4c\r\nMsg = 49ab30d5c01e91bf113764342cb8ad32e6af945341a9c6a0ee2319a910416fd6\r\nMac = d13777a33f9520793eb8cbcec047cd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 103\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 1eba29062320df7275a51aa090ab489571057e64f0ff6a52\r\nMsg = 754f03c2e298a699568d10c3e40390e0f8c398283ce1c35dbc4916fe479b87be\r\nMac = 87dcee48dfaa43e8223a2b338b220f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 104\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = a04b976fa01411bcc9a3863cec91f486944fdca6e8754615\r\nMsg = abf45f39904a8f5766763fe80fa189ed9c6c15bb1a7a8fa0ae3058c9e5b87c63\r\nMac = 577aa39884335a4f66dce2a612515b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 105\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = c6f0a3692c9280c48393b0dd763e5d0b90477f34ad69f192\r\nMsg = 737bab64c8a0fd6a07329bd729d2ec88685cb5404bd13a40e095a61846dbacbc\r\nMac = d61ad5f6d8aecb7b3fc1ddb1aff64d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 095eb52135dc6d9c1f56a2571c1389852482e7aa3edc245a\r\nMsg = 47c577d1a7e69828b5c3264738dd334be8d7678ec77bf1ccb5fec3843f85ffa1\r\nMac = 4fd309a62435edd9b1ac8861f904c1\r\nResult = P\r\n\r\nCount = 107\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 2f853c1ddb31694985ea5e47322bfc8567fd7a74a46b0597\r\nMsg = 5719e671686e87e931c2c0e5842e907bf584d226e040645eaebb896b53a28c7a\r\nMac = 75ed56da2db0ffa101578118e3f620\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 108\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 67f5adc0842d7e1a4f8591d678334c95ac83df95c4341c30\r\nMsg = 6c8aaf2f91ba87b61814ed689331264c7bf98c2223c426a4ebbf7b0db692a8d8\r\nMac = b7c591522e9a5a4f3af3aea24121b6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 109\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 8702cfd1ff87a749ceb0a7192f5a872740b7fc600845df4f\r\nMsg = d29b6a2d421abd00a59b756af34bd72a42f5557a2ed40f8a7ea59b2e05ff01d3\r\nMac = 33b597665d375c95464af2ad56465c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 110\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 64ec1fd6af554485856b7bb3c0ad16fcd9c4ec690914a09f\r\nMsg = 0418a0afc13d6215c7bd68b12a327587eb63c145120ea626fce59c16f7d66717\r\nMac = 80a85e77efe4f47d8938dd9c55d67e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 111\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = f2991112c2cbd3038ae37b772a5090690006009f0c1965dc\r\nMsg = 231d72c9325f8c17aef4efc94855803eb2fc1eea601c84a98e8f7053840f0591\r\nMac = 14269c545a0e3d56ac9cb195cb6197\r\nResult = F (1 - Message changed)\r\n\r\nCount = 112\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 2c6d7fb9e92d98a1dd92e96f6b4013954ce1aaa5de242e6f\r\nMsg = 87ec7423f1ebfc37ee83c85938d58259efd16e3c8e55fb871e9998baa9cac81a\r\nMac = 782b7ebbada87c3572a3918a03305f\r\nResult = P\r\n\r\nCount = 113\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = d95a1b24964bfea5dd5a65f5a1398c6f9d43b26d98b47816\r\nMsg = 92f9cf56188322d18cb41d723847e6d419cd163e2be71b78e7b8dbdd099a99b2\r\nMac = 2498787836840fe1411a17f153c546\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 62f2490ba0c658848859fcbea8cc6774e24c9de979dd29d0\r\nMsg = 0822e3e6ba982091d532cd5271fbde25305d1f6e71880f81c618f267a9f122e0\r\nMac = ffb6c2a6c73245138ce06e458cf914\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 115\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 1841161a3752de1491b2b2f519d8447636e149437478d2ff\r\nMsg = 238e36b73b474de88226d4298121393ac9162f1736040bcd717b6e8db85125ff\r\nMac = 4d1656a2c8632260aa55a097451fe7\r\nResult = P\r\n\r\nCount = 116\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = d7d9a5f750078f1a82dffe2c70e6b0016eb42d13e1a8aad1\r\nMsg = 28a107d22fcd0499e0ea5aceda6dbc288a5f1d9da003c626bfb9a6c27922e9bd\r\nMac = b67bc2e20c422f9c7c27a84ba0bcfe\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 117\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = dc3ca30782c9c0a7fe8923d4b8d31aaf21e63895f51fb2f1\r\nMsg = 8716298bc17ed51aa273711873e2c2863e7a5021e46a183e6c6c81f99c02918e\r\nMac = f41b1896a22db30dac50b6b3e5e2b8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 118\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 0b6b36339122610178c4bb72eb558abf15e5ed9ea0077a5c\r\nMsg = 52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37",
-    "663bfb65fa7\r\nMac = 665f05a489f8ad0feea290401b4bf2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 119\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = e200414db0255ca3faa7f6b17a62523f2c75d99f6ae162e0\r\nMsg = e749041b314f8719e17a8cb26162e2c910b31116dd769083149238d67792f991\r\nMac = 713fb4d0c95743ee7da970cac7f771\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 120\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = ea77165284ada4599f0bc0a41db787310f53a1588282b866\r\nMsg = f3a1a6dc2092ae7099bda65f8af32aa19796254a13fd9e0e7319d50402598faad6ccae2a028604db0d44690ba3530bfc8bad062cd96635d9654647c57bb81537\r\nMac = 9c7c379b5f8ee87f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 121\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 18e2baabdcebcd25958eb53d1bd2a95ffb9b51a3c1d92a9f\r\nMsg = 1df7392e915726847822817cb542df6b14df16d7d3d3ea8d615fe9ee651c938a0234bef059d139c350d6b01192cecfe1d821aa0b668e5d4dd8d5ef9a1eb47db5\r\nMac = db521506073b8c9e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 122\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = d39f12a9c6b63c17f116bc003f4def172943350e29d60258\r\nMsg = 75225a26d63e91281fb37ace46354f81de99dedfde8b770ea47f08503aea87d8d7b190dda9e150ecd1a2a182b06676da61667a04864ff4374838ee6899d8961b\r\nMac = 65aa057a01b390ec\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b2212ca369c611b725eccc3daa58df412787a3475f418d82\r\nMsg = 3727bac9706f482f55bda86dc052aa6810e2c1137b97fc93a65838a2724a9531199726517b6fed53b24d062eec7c22227ad9379b24da7658c0cf7ecc0368cfc5\r\nMac = b869a9e06994fb39\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 124\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 25e5fd5c39e684696e71a6f81f843a196dcd030ce2c07afc\r\nMsg = 899b48338d5ec3bb4a681f76ef37b6e25357b50e9578d85204c3753d3b6ebccf908e3de8b02dab01839ddf1a560b1ff33857a17fa4244b96612bbdeaa7d4913c\r\nMac = cfb0650c7566dc49\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 49bc9d3bcf3c22daa8cf55c1b59d4bffddc2412d60518e98\r\nMsg = 980026395d0544975dffaaa2c56db1df5816cd80cde513dc76f6f81d21f15c383c97c7233c9af2423fb28922efed2f69aa47c30de17ae1c5be17acbd0ad6cb8e\r\nMac = a7ed2a35c89130ad\r\nResult = F (1 - Message changed)\r\n\r\nCount = 126\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = c53f21f1ce3a1792a2de14277eb97664d4c561b3fd4b0e32\r\nMsg = 66e15206c23751497bc2c8d734aa1136aec08bd4e80fe3408bb3929a84efa749f379c7eb441872929b71872d761e0b448e0126e9fed86eeba611694cd2df4cf5\r\nMac = 1b86a912a0ec9f94\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 127\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6286e3e53ffb9bb143fcae724b45f86a23bbd74c42518144\r\nMsg = 62766e9acd41285eeed9b4007340dbb611699624274ad1179e327076135d907638c60f0c773c4ea8d9b8352027ee78ea4f22198f083d2f5cb920e55b9738c582\r\nMac = 3c56ff841dca9662\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 128\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 9c5d43c1a1269cde199509a1eff67cc83a1759b71c9e7a6e\r\nMsg = d576565a938782fc7e9b095db6213002bf5bbfdcd761fd6d876adb2c7947702b8930a5f71ec332bfbb4ac9b9d13d90c2d808d5459d0dfe5ddeedbe3e14038fd1\r\nMac = cc7b2038ead10d8e\r\nResult = P\r\n\r\nCount = 129\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 512a23489b8d6b62b63e9188c0ee5016f20448c082eefe82\r\nMsg = 1fdbfff7941ba22dd8e1dd13a05a3bd8f2c8096894266536c40a983929d0a6340af5233bbec1477363294519d3f3d9c6d41b20f18f76adb54495d9d43bec5afd\r\nMac = b81c76829839cd43\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 130\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 20d22c3b6ab38c5995e22b341f359be25616b2b8c7269510\r\nMsg = a1c041d1d4e7cd6a953f2e4837e3e676ed48633a2f15828f5f3551d5ad2a19c838a49caf75529bd5d5f89b3da2c2e9922ad8dc5d20325a7b3fae9dcd305f3731\r\nMac = aac4d4f4172e1f05\r\nResult = P\r\n\r\nCount = 131\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22e29aa7547e5ed3a64611e04f1d55f7a397c1619669879c\r\nMsg = 773b577b95e29d36fb30779d2ea23e2ffed9e1b46aede42bbe03a904fe22ef8f874298b5f4a6afe63f6ca9522863eb5cdb1c8d4bcd445e43e7302875e6ba3592\r\nMac = 16bf98c7a5deff18\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 132\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b320edb777d317af6c933a6530d9f5cb78d2d3104ac02120\r\nMsg = b31d3f55909bb660628de9eb95b75df776455f2f535f461edcfdf8a0cffdb096d573fedea7400f8374e62e30879a8beb259b3bffb4c3813a235b4c59853400c1\r\nMac = a0d9a7da024326ea\r\nResult = F (1 - Message changed)\r\n\r\nCount = 133\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b9bcd0ae7100f991f4365ba0683b6d461979ffe86d0ecc24\r\nMsg = 19d0077952eba12a01db1d137050bd7e9102a31242eb38a5cfb3cf51b86c86cab57f6deef8e6eb9eb29c5dcdd852ffd627641013660b31abebd40fab60514159\r\nMac = 972119a55b125e0f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 134\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 00af010f462ad40a38eefb788b648e1cc292cd4bb08ebeff\r\nMsg = 573db0961531873316e87090f79e84f040c8358f8ca78fd9ea1ebeda82c1cff67c2ebbda1da0a1b233c1539cb4c0145da2a4a05431e06dac2c2731d59581a434\r\nMac = 92a67a99c128e173\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 135\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = e12f98507d6514c3b551d240595346bc9e9b6a987033b3c5\r\nMsg = 3927bac9706f482f55bda86dc052aa6810e2c1137b97fc93a65838a2724a9531199726517b6fed53b24d062eec7c22227ad9379b24da7658c0cf7ecc0368cfc5\r\nMac = ef48edc762db1d47\r\nResult = F (1 - Message changed)\r\n\r\nCount = 136\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 66fe8076d4e8538e18b84f965255d143f1c7d377e099c1c2\r\nMsg = b3fe18cbe086955384226c11c62c1dd14e7eabda573450d005b46fd9f9eccaff24dbf5d6d8530b5e25fd9f2a629df5c20a977247cab35255d71d992d85b04c14\r\nMac = cb67f0c1819ae458\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 82233a224ed122d7306bd6717a80fa1986964f9db41bd40b\r\nMsg = 65c46382a278490b9825d4f1907f3b9f196e136906067020b6b94ee398cb2f39ed07055dd0b151d974bb8d56ae3bc8b3b31d9054221514bd45d88a5f948ccfb1\r\nMac = 27e94d22e8961f92\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = d3e3bd80f45140cfc2f857a913a89f0c7dec86790feda4f9\r\nMsg = ff26ab66c6a10ef910f5b94589b24a7b6fae8e4396faa552b014603fcb5eee921bcfb81ffae989922debf24a6947ed6b1556c02e524b247c3966a7bc636a4fe9\r\nMac = d2d326c999095b39\r\nResult = P\r\n\r\nCount = 139\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 466fa94c2158c1cd84b83fb2f15ccfce804f611ad0fbc4fd\r\nMsg = 5ea068d4f363dc7f1badf97b77ec85412a06dc8d8e3f4364265c7956d4088f014c78fad6c94be720ffb4ce4150da4a3f427f288031e0bdd241dd7daf975acabe\r\nMac = d6023f6ffd3c788f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 140\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6f5a146524457615d81a605b38a5ff03edbc5c426ec7d551\r\nMsg = 9be3a736e7e72560bea45e9c8ee8bf37c279bf5b2ef16483adcc093208c05ee51a4db04632946ba2b96cdd9d15b33c25cce2eba4ede4f97aac29ebaa4cf6bbd3\r\nMac = af8fd676ee05154b82c3\r\nResult = P\r\n\r\nCount = 141\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = c62e6eb86b8daa37936086dd2c346e3b14be5054cdc2f3a4\r\nMsg = 559407bb6930d5adbdf19a7e285ba1dee5caa03ef54e3a3fc1b8c86a02f55921de9bf7d553c22d7ad915c6384329d664e70dffaefe22ed9c4e2c233706aafa04\r\nMac = e297ad7830c79d387ac2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 142\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 225557b0faca3d6cbaedec5c39c98f0ba0723f4070f2278c\r\nMsg = eb1383e84d4bfc5a9dad25374055b81eec74316b18f6e001b0623d470c027b7023456000fc61538b663cb7c0e98d77a7fc3ee2277816bacb4d9487c6741e3134\r\nMac = f07332a3b01d0e8026ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 143\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = c36acf733d310e3b9842b3006aa637ab092faf4a580043b5\r\nMsg = 1d674eb5d85945a6c7842042adebe549d4fe515501c06c1ba72961ee5bc98d8588afd6fd64893e21220db7ea6a973a420613130dde1d7f6a26677836d65bd0d3\r\nMac = d629ef50a784db860de4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 144\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 332e30ab63b197e79b86e4da732bad9250c0a5c9976a6c67\r\nMsg = fb41304f9f5b0f696ddb0e2f0f57bb091f8a31b5324d3cdf15c3bdf256d3502d06db2df9bea24c7ae08fcd641f199610427f3ecf24b92a7e00aef55aeba71516\r\nMac = 983e453f602db30e1f85\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 145\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b311796b0519a45c176f3ff458d4d818668093e82fb871f4\r\nMsg = ec1a1e9ee85cf960e5dc4e239619ed85f4b14d32cbd42dfa79f77a27f2cd740d08730de2eaeb91d0eacb8c498336e99b9a0c57c4045ef18749251dbfa733b4f4\r\nMac = cb2be0fd09f10deac5cc\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6311e7f0a7bcc11176fb411fe719d4e0782c8935524776f3\r\nMsg = 85f647d940a6d1acb6b7851912f807063515631eaabaa019dcfb993",
-    "e86f408266cace4c24940eda0083d8569364dc1afb816c0e5b95f3bafe7745e5ddfccd6b1\r\nMac = 776b9642c47fabd7e9c8\r\nResult = P\r\n\r\nCount = 147\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6d120cbf74df2efffe98397ee303ead4e91c5e7839b82885\r\nMsg = 27ea9ff8359463a7742cd9c9c269ee678f4ab22091fdaf29b9007a92658687cbd71c4166e68c5a1ef30160191f6d926abb28f1da01da9ae8019a520edd576346\r\nMac = 5a902959d73ac97ea071\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 148\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 8e09d421e09dac1d9d966f02a3a520972c6aed2003d907dc\r\nMsg = cb32cb87ed59ee959c011211ae7cd475c3b5feb21cbafdd0b17796d47dc4d4e61da345b399c2661182485be13dcee33a9eaa8cc4b9742361f4c36f1361381f1a\r\nMac = 1b2bc5956223b8801456\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 149\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 3eeb143d4a3c08ecd9f7df8eba42789b517dfe99e07958ed\r\nMsg = 3292b8548a35fe34136457bcff52b469eafdb1b86b6cc88bed35c4cfba43785c59d6b01c1acb6870ef1e3ccf7dad20b1733f51ab1bc48cdb2fdf7d86eda17a00\r\nMac = 3a85ae8fd368cf9846bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 150\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 606452c62290b43559a588bb03356f846cecb0ccaf0bdaf6\r\nMsg = 3cfbc77b8897b6a5613f62f6b1c89b0d68f272c6c19b9e0ec6331ef616702006e64322d3460a57d3a5074c719811cb5dd78900268890da0ac177b40d48773548\r\nMac = 325aa552529e66a13904\r\nResult = P\r\n\r\nCount = 151\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = eac3a1a6eb8efe983c6b37b6c2709f5a8851ab72cb23a66e\r\nMsg = 2801a813dfc3f1c753f4f342a113c09b8e9a7ac16483c31bfd0b746b1db692f805937eec44c16bfbd132154557afb17ed01c1f4c55fe67f0343a6329441fb955\r\nMac = 5b0b383c4870af31a9a1\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 152\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = e2d592cb412e65f9044257d78e7491f9f80c8b08102c2d5d\r\nMsg = 3f63b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f1edd0e6026572ca0d8274bdaa6870749b0a727aa8c5b7e9442100e0c9b057455\r\nMac = 0380cb126c63bb48bdb7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 153\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b7b86dff6746145aa7d5bba73ed6a46da5b1200bd3520357\r\nMsg = 8e7f7e7e3ac2286bef6822ef47f5f73f2ff512e599df17c3723f7a55d4144a367c774de67e7e52ca3760c37484da7a2531d1d590b5380de11c34c3fe447edc0d\r\nMac = e7aaf6f82894d8825d80\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 154\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 70a26d985e6b99bd3a37575f011f2b84ed84bebf99a52760\r\nMsg = a2cfbcfdcd90e0962f233d7fb70668c8c36cd5e195e2ef5c043268f47187cecffdd36000f96e1f509f00283effa040443b3db15cf73d55c30c65f0fd7cf9c219\r\nMac = 96d09f0a799cb52575d0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 155\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 5d678acdb2e6cc03537411ae2e95da120161ecb6c92d5e23\r\nMsg = 91dee0cd1d17d9342f4d346cee19f5f42e0c3b0498447ec4043c15bb2ae8fb8a7a02d2da489f28932c05fa4ea9c0760e0cf3052a97ed898edffce3247386b98c\r\nMac = 4a40b4f63330413918a7\r\nResult = P\r\n\r\nCount = 156\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 795846f9dbf36415640276642cccf87e3dbdf6519c5b2db8\r\nMsg = 4fc989f327e1a1cc7b8af618ee6ae6d25f78e2b76b681455336945655f13fd5a639bec3a004a88ad0e2df8547a0d315b8ba15f5269038638df6169d960f5ab5b\r\nMac = cc5efa5ef19f6cc63f83\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 157\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 61eab54142fe7e16787fd2d54829cd3c4bbd793e72f9ef9e\r\nMsg = 13f079b004d1fdf02121564f0a96b057f120899ce920169561d5e3aaeb16bb8e4347c7cf8c86f9acdc25ac26fb5d845a68409c0d9df0e089940fb7a88a76e62e\r\nMac = 920de91f34eabfc31648\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 158\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b64d00f3a4df754fa4ee6376922fb67ccce0c6209f677397\r\nMsg = 8003586af34bdd0acae4f5547394245027c2ffcdc9d1335311acc859e9a2a7b817755a601dad14495d32f1ad811a7e751ac07cf18716e1cb193c203e7551aa83\r\nMac = 79e8a0ca036d7b0bd2c0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 159\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 98f4596970e6515b5357f6c6396aac182d126decaddf567d\r\nMsg = 65737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267\r\nMac = 05c51c2507108a3f8293\r\nResult = F (1 - Message changed)\r\n\r\nCount = 160\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f0409b050346fbd319c8630e4bc9dd6d055355fbb961f018\r\nMsg = 731db98bd990b2ea19f848fda3519b32bc1d2fcb2f4d42e13f655da8e1dc2af428c185fc01a5d55e20b49d643a254e8675d560301d2ea0c5984ecce39c655de9\r\nMac = d37deaceea7ea3b50aeb02636e5095\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 161\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f266cec01c5fc08c0bdabc9537bd1aa2df9f2b8ffbe5cc94\r\nMsg = e19cbaa489a0f65681c983cfee3a4b699339ccb096df06bc871398be9eb926d84426fd32d5d7fa4aa563a88b41afa822f761560d9897a9747cd85b3dc74b4adb\r\nMac = 8690d4f8153e56e3ab80c7e918679a\r\nResult = P\r\n\r\nCount = 162\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 6e12c112720ef346bbbe7d1c19483721b1c52c438dad40e3\r\nMsg = ab8b36f46d1749cde7dd9936df95cdc8e0b359b8963bff4e7bd59599b32408623354a15e29f287a79801866d434a0ee9cdf37f931e53a39509057c7f2b3b413c\r\nMac = be9e70fdd15f96a8b7457cb727caf6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 163\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = e9ed05813262fbe769c1104d8ba5c836dbd229a22a681de3\r\nMsg = 606452c62290b43559a588bb03356f846cecb0ccaf0bdaf67a18abd811d4315a966e2f3f87f6c2428814446563fa71864d97c8336b0e34bf9466ec95598398cd\r\nMac = 4b3ac19f4dfa04108283b0e2e3a8e6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 0c84328951c66e0f5341b741d2c2796d3524ef732c69e779\r\nMsg = 9071c45a99cb987aa79596a2014f54e6fe400a6bbd5de96e156cae87cf69762f1329d481213d213d42191312fd76911d8df4c6ad9304754909058cf477adfbaf\r\nMac = 1e1003ce7546009a3ba7f59dec236d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 165\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 3aa8ec246323db7a3953737928061c79757de2e921c27643\r\nMsg = 84e9cc9bb7f4fb62ae7396859fcf33da5ca6c80c311eb392107afeddebebe0d662a887879e4014187d2fe8feefb01e6fa0d35819d7cfbf139e99451423b62ee3\r\nMac = 4259d5f983a287fbd987e3badafb33\r\nResult = P\r\n\r\nCount = 166\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 66c07634c94dedb5d4c6f19e7cdeb954692ccf51fa242abc\r\nMsg = 4bbc9d3bcf3c22daa8cf55c1b59d4bffddc2412d60518e986899d6a3e2a781668b0c6b9b4ee0ddbbcd06bd643eb201fe7829699e4dc86e2a1b4876bf9e40494f\r\nMac = c40f872ea2f1a1b45ab5737c2e4f33\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 3b9d6b0652836457ec4f701f0dc0e5aed73d16585d61cb1b\r\nMsg = df7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e\r\nMac = 602941735206bbe57ce1c2e3b9509d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 168\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 7253ef10bbc302f01aecf315f9a4122ba805dc4048c30ac1\r\nMsg = e12f98507d6514c3b551d240595346bc9e9b6a987033b3c50940442dc385634e2a28292856b97d5a78704388b2b6d0ff2ce7a19c64574deac593b98a7ce98bd8\r\nMac = 9e62a5b8851d3a0fcddf06fe116ac2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 169\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = d718af395ba3f5f4c6d15c24475ec7f0f74f3238c81d42d7\r\nMsg = 0c0d3d7ff5d1b707be9648f263b8f013fa439978e959efef57d471cae02dc8e08d9d58d40381169afa039936f1f773c72003c1c5af03018725ab2408236ee4ea\r\nMac = 75749ed44b76d7ac16c98d8b6bc18f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 170\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = ec98ec44f5a86715014783172e667a748f162c5c26a8b34a\r\nMsg = c0947efb86d54644087247f9fd95133a94075faf6250a2cc9f20df5393edbe1a4bdee20e90e877781a370a7f00cf9eee7373fc38acc54aba23b0df3f020356c9\r\nMac = d994553290066d778369b54ae06668\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 171\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 9fab32caed6e1cb27d2115cc641779127d4aa57db0955bd6\r\nMsg = 6e3e25db29da2c787bb37755ee770e2402fb8208da23389d36030439a143f971ecc880dfda90a8231ddebd2881981ca968ed45f3763a32ec8d2fe854fc2e4b4b\r\nMac = 4d3cbf9b68da0c5b49ab3b0913a2b1\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 172\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = aae24266e5981b2ed14213a29f961cbbf7f02f63a33c987e\r\nMsg = 8244cb416b3d09521ac2fd28c29084ff3d64761d46617b59e8b221de36702c2d3dc62e61375357b702cf8d4dd0f2bf2a1f91777fec0baf2c23e3e6865bae7358\r\nMac = ab8e9df7128f4857e0a1c24fbce473\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 173\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = b9bec4e88775777ff1eb3df671fe8ac03a693a1c26ea254f\r\nMsg = 8eaed4810702df8caa",
-    "12fe7e26e7ebbca11aa2de9f3169a8262c0e3c205a708f0071401aa8de09d28a5a6e590ebeb476341880c37bfee1a501229081eb27772d\r\nMac = 273b0d874010eac97ceda34232f7ee\r\nResult = P\r\n\r\nCount = 174\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 15120ac9468fa30c92ad87e7aba41ef552814e4ecbcb9350\r\nMsg = e3de6c6119d7db471136285d10b47a450221b16978569190ef6a22b055295603c9c1ed5da3bf96bdb43a5722cf4e2ea087cdf9b23b3093d250d44047be634b3f\r\nMac = 9a166994de85e5d60b154d49a867f4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 175\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f9b9633f12967f1841161a3752de1491b2b2f519d8447636\r\nMsg = fa14d3656f7f7610f3a629bce14648a593250c6f309c02c6c552bb42984ac58db920dbc7d98f59295f37f3e9b99da55ef074ed65801b390366669b4c7aa1c483\r\nMac = 2c9f3650866b97ecc5ed66929f41dd\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 176\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = e87275bc62ad067b121b83f220d4ee2b4245541283dfadcd\r\nMsg = 6475757f30dd0a96ad64bde5c2605a9d2ca82a7223a9ba4c39b6dd3f86a0f4bd02876d0a32ef8af1071664b603862f4b9de6bfc6e7154b136e7a72e661957bf4\r\nMac = d0bd2d3d35a22f37bf113090cebecd\r\nResult = F (1 - Message changed)\r\n\r\nCount = 177\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 8b63d3c794e5ba0e09e5d5a5c56670bc0e289b30171ccfa4\r\nMsg = 44da1657e4be60d887a097e29d03bdbf5920bb0504e654bd963f58c487951a72e395237a9d32281125ed3a533c543de208c99bd063853abf79ddab4692c3a497\r\nMac = 29d04b97ac302fefa80f71ea378e7e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 178\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 17039577fa27ef5ac3bf97572d9de5f8eac0aa58ff29b990\r\nMsg = b0329a0978e5a2d1bc85bdca333e7d0d1e9950217ee9547a84e76d3f49999451bf787288e8d12d40456c8214926c14e9b076032fe315c1633d5d21d85acfb1b8\r\nMac = 51b4bc8b479dbd60e5de94ba8b9d0f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 179\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = cf6b5edc515882f8a7954a5d8517b1a85e9559858527d0db\r\nMsg = fde631afc6c042d77b579dab9298862d943be673cea59eab4a0c1b5cfddc2aef42590e6d8786d18a4646d7e338c2b984c50a50adbeff0fd64e7096f02e8385ee\r\nMac = 5ee3547a06661661c46c3778b0823d\r\nResult = P\r\n\r\nCount = 180\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7b6f4f158422f33543ca90dd0a76cbb23c0dbef26ee140aa\r\nMsg = 6704dc39a259152d2dc3f08b8799ffecf4e1bc38\r\nMac = 5c12ff63244c64bd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 181\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7a381f75058b85680061eeaa0242d3a16a64a5ca50cb61fe\r\nMsg = 18b31ed5ba1c3ac562ff3ef274424b86c0815c26\r\nMac = eb8f3d508c9edb8b\r\nResult = P\r\n\r\nCount = 182\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 3662d7b7c93211535c862ef3dc2724c492cc1e53a58f23a3\r\nMsg = 8ac860504258c134c6835d4cfaabdb316c36d99e\r\nMac = bc1b870eab5bea9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 9eac76976750b7937b3bbc6986b4c726f0d0a63310db85d7\r\nMsg = 5de2265292780222349ac793eaa17c5a22902344\r\nMac = a69594e569230df0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 184\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = ed1531500f319e09227d6bd181786b3b446f081abff2e697\r\nMsg = 7a734243e53cee654be988f5c735b19bb11f3389\r\nMac = 9f2cc2a8c3d0a34f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 185\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 85d0d04cd3fd2fb34dc18fd55e645f7492d5280657577008\r\nMsg = df899dd6b99cc28d66604ca92431fa7f442a4927\r\nMac = 18fc40b25fb9c138\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 186\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 90b0c8b542c91c1b2dfdebb589a7eced6c9b7b43a7729840\r\nMsg = 38d1a87296529595acce251cb232db8ede65581b\r\nMac = 077570fd0efa770b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 187\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = eceacd807db82378e9bd7c79054878f09dcb5087c2e1c349\r\nMsg = 09bf4f77a9883733590a3cc7ee97f3c9b70f4db2\r\nMac = 58af901fe0fb5d29\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 16227835305b7586a3106d93da8bd70aa0025df69a0e85dc\r\nMsg = 1a223362dccc99472b2cd1d712ec6dadd60ef972\r\nMac = c26f3980d17f6c36\r\nResult = F (1 - Message changed)\r\n\r\nCount = 189\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = d18cf5dbf5b2094dd6ad85d975449e2dda35b184633235ca\r\nMsg = 7f557e74f53c344daf7495526d1270dfa8fd24ad\r\nMac = 5b7cf33ec05b1576\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 190\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = f1681287bc931a0d8f296e13b3584d6efcb6ca76aa90cc02\r\nMsg = 08c62ff9bd7bcf189f530d5065f8764532d2692f\r\nMac = d646e2ec15afb14d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 191\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 116f4855121d6aa53e8b8b43a2e23d468c8568c744f49de5\r\nMsg = ab91d1aa072947d22f0dc322355a022fe7f0747f\r\nMac = 489068c07931ee9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 192\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 0a23972e036d62199ec327b25a3cf4e14c29279c6449d3b8\r\nMsg = 2df3e80fb6ddc1fcc7615330b24fbaa4981441c8\r\nMac = 7842f16a0cc7bd6d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 193\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = becfa1c96686b04153fae144c187f034dac3ee6ed70d867c\r\nMsg = a3a114679ce30c8472149da9bf3a42b1ffb07e66\r\nMac = 74fe19b5183ed3a1\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 866b43c8fe3769ec0aeefd4dd02210488a354d67e82a81d7\r\nMsg = d9bd6ac153cb0bc4e19e59c45cfe0d6f4c9d20a3\r\nMac = a3a2ef83eba2a6f3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 195\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7e00aa080c127cbabfdfa5d9d9728c7b25358aecd26f5850\r\nMsg = ce1a38cd75b9e955483ab53fe59649d087ecd1d6\r\nMac = 8375c666d09bf259\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 196\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 4bbf4c9cb6758329b2d5a53c4fbfe2d3df4fb50e57b3699b\r\nMsg = 6429ea2cc8fdaf58100347d21da64375b3ab2058\r\nMac = 77e417a60bca9a9d\r\nResult = P\r\n\r\nCount = 197\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 274b394da9402d3eafdf733994ec58ab22d71829a9839957\r\nMsg = 2b3d7949805afd73234cd327a62951b32c51df2f\r\nMac = 8f9ce09fee15516d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 198\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = d4140d988448d557454c3434fd77f8597e6420566845e316\r\nMsg = b53017500c100dea0511845597214484fc5f7f34\r\nMac = b9e85ce9178b81c7\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 199\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 43d0d326c511e3bcf4f52660fc3c706a6a95c0ab550615f6\r\nMsg = 7c880698ef372304a663f0f02944500393585d42\r\nMac = 843f71e93b22f1e4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 200\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 273cc5013785baeb5abc79c8bde73af71085d7018e7be92a\r\nMsg = 086e6e3a21787acf7293446516b5f54da95a2988\r\nMac = 658a112d7a9e7a08c024\r\nResult = F (1 - Message changed)\r\n\r\nCount = 201\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 492bf7946bce1d3c6f168f4475e5bb3a67d5df2fa01e64bc\r\nMsg = f7b577f1396b23c27eb637e53d3d92460270b001\r\nMac = f2dffabed6871cca2e41\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 202\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 8e7d8a44244daa7df2b340993e32dac50e05d7b2e103be98\r\nMsg = 2c3c3582e026a3f29ffd21a92a8e1ee70f3a4147\r\nMac = 1bb40d091dde1903ac0a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 203\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = d2069266b0f180cb319e30ded7535bbe52d24be151de4bb5\r\nMsg = 392d567f0b8045359dedd1591517ded0171fdcda\r\nMac = c1ca2813ad38fd7f0f58\r\nResult = P\r\n\r\nCount = 204\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = f35c46bca9236830ff4bb057cd5764f02720ccb03b253937\r\nMsg = d4586dbdd5655cf659891f5b6015da524548dbbe\r\nMac = 4b6dcc78f6e0e9b7e35a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 205\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 509f1e38591e03a30a7409bc7e18595848253308c15edf40\r\nMsg = fd2109cac9f42fbb093a8675e5cd962c4c31df2f\r\nMac = 35387ef3967eed5b579b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 206\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0e9cf0ec43ca3fb7fb9a2b1999ae635d5041bf42f1b0bea1\r\nMsg = 65960c7fd43891ebdc7bf862b28d4822a8488270\r\nMac = 93c33247ca546a8c3fba\r\nResult = P\r\n\r\nCount = 207\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 51597a4c68cd228371e86c179fe04492642ad9b888405067\r\nMsg = cd8799124d94064f47d7eec59aff543b81ac66f4\r\nMac = 0eed36a27b40560b89db\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 208\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = f9f049328f5db22c41a501088e5759ef4d04db0c4b4f6d3f\r\nMsg = 7bdc26b5b4df58af539d91eb2ea10263a3e58b07\r\nMac = 68c45551f1367c989a9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 209\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5343dacb05a29b3119d6f19bdfbcd6674950e710fc70180a\r\nMsg = 057c2d386fb1693b845bef585e76e0fc",
-    "4971ffb3\r\nMac = 372a801d1cd33d1059ba\r\nResult = F (1 - Message changed)\r\n\r\nCount = 210\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5987fcfe8a1ee76afaef54cb22d8b2a20b116f72bfc7117f\r\nMsg = 8abbdf380c668c6ff34a4f128567bfaf256570db\r\nMac = 5a8089b3d9f6c72fc858\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 211\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 301e0712ce74a1ad02079aeb0ce35edacc33f9a5d907cf70\r\nMsg = b2d894833daef4070b764361685fc94a780a7292\r\nMac = 57a225eca09fb227f79e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 212\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 144840494d15b2b31ad63ee05bf579a5e9fb98f534a6309c\r\nMsg = 71bf573cf63b0022d8143780fc2d9c7dbd0505ac\r\nMac = d1b2baf05cdd5fecd1cb\r\nResult = P\r\n\r\nCount = 213\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = b4bc602dc860108aaff5b3befb948a561ac495a22af9085b\r\nMsg = 3fa85ca50cc4c4817e951b5a95ac006973324c2f\r\nMac = daa1246b82d2e14e3056\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 214\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = ff48804c82414ff67f9b917a4d5d062d439454aad8eb4b0f\r\nMsg = 6def37d9b73fed0390f260491f582d2215369811\r\nMac = d7712f7d5f0da5dec6b6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 215\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0273e421ee670be6322675f26f9014c040a76f0c869698f0\r\nMsg = d9de46934cb56e58899a31fd14ca64509131dc27\r\nMac = b3e79909c16c561eb7ca\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 216\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 27eb9812d3f7816fb6a1cfe474496e80750b1ed3959ec7f5\r\nMsg = 776ba7990086731ef7504947be74b3c455bfde5f\r\nMac = fc0f2dcf4e6fa041830d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 217\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = c56f710e39deed799ffde6d10e8aebfa2bab5e5e073d78e2\r\nMsg = f6fe0f16403182d012f8b6e02539c386075b4585\r\nMac = 6bcc4c1b06099220e9c0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 218\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0236ce1fd3ef645a64b4ee7048dd35942e6a09e8099884a8\r\nMsg = dbf06366f766e2811ecd5d4384d6d08336adc37e\r\nMac = 1de717c402baf964e817\r\nResult = P\r\n\r\nCount = 219\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5cf781067bc1ef948e929b7287279c71cae5143631ca57d6\r\nMsg = a7f3fb7ed1342862247fb4b1993788837cc87041\r\nMac = ee867d4c0f910e9d9288\r\nResult = F (1 - Message changed)\r\n\r\nCount = 220\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 3e19b6f3f3fa3c2551466c9e09f0391350682495426fbb08\r\nMsg = c7496322ede893ae368884a91f80c3bac3505c0d\r\nMac = 55b25da032db8f3b4293a4865df77e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 221\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92\r\nMsg = 5e3ed45f07a6b3c225ba73d04d867f9c5b4aa703\r\nMac = 1b642dcc4fa08cbd36d109d55a8501\r\nResult = P\r\n\r\nCount = 222\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 8eca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeff\r\nMsg = e3807f6d8c6471ffe188df67d952a7d67021bf41\r\nMac = 9a37eda1e3331bf86d208b2c0338c9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 223\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 633f44dad6995a6af0302692142a47430491ae7b54f8b00c\r\nMsg = 3caa9b8b24097d29bd24b913692acf96cc78b998\r\nMac = a6665b3b158f37f587dfa0bde7f300\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 224\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 14ef8096666ddf28e0ac5f3458b52f3e0c601deae57fffc9\r\nMsg = 11d5cef384474f33c2d313e6e1050d8c7ae5b019\r\nMac = 2643bb3e1c01f406d90104c4437189\r\nResult = F (1 - Message changed)\r\n\r\nCount = 225\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 0c2e1951eeba1a9b6592202b1b8547f43fd755fbd844a874\r\nMsg = 9ad62bff38e28f75302b6527c1c107543f798817\r\nMac = f42ff7aa728c2d815ac7c701b59627\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 1ee2df7aa80e3a131e2aad9c17bcbf546d8b25e5a849db31\r\nMsg = c4e8594cd09be010b6934157e0557686310e8dbe\r\nMac = 34496d184bbdc0c9a57916ff64dc3c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 227\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 75650ce366757618af20205b69af7e5d4e82c398c00101e2\r\nMsg = 42a71eb81ad1c97ac53b88831b2d15f3c57e7cf8\r\nMac = 4c03394a98bb43e6197074abe63070\r\nResult = P\r\n\r\nCount = 228\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 386c659bc45d0a88acd54ef7eeaa3e140e1cafb1b01474a0\r\nMsg = f4fc5acff75d404849675b813cf7adcaeb8f3d56\r\nMac = 5cfb2fc8869304428fc012a14b616e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 229\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = ac192759625f4e42d1d1fa73dc0f62199142155615478f88\r\nMsg = d33f716df06e9047f8d718ab1faa06ec7b773bb7\r\nMac = bbf5b7207faa5b004216fa5caf3f93\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 230\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = efb497fb9b85d472e7c9d061aff501f7b1e3a311a86cfc69\r\nMsg = 1fd425560816aa21d6572150d1161cfb3bd61e6b\r\nMac = 2b7e14864d29437647cc1b27a8a0ad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 231\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 344fbbeaf82ede8a401df7cc121ed3da43be9bcadeeb5614\r\nMsg = 93febc9e16003cc8d6490ba5a6e64dd673a0f887\r\nMac = d34ef878392bc226f7ce1519f3bc23\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 4b6c6b6be3c04985bff49719c4e11be97d7757801dafadc3\r\nMsg = 754336f8cf27f4bcc7af5207ff02a662232d9a62\r\nMac = 5389c533cf43ca0332574802c2ace3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 233\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = fe5ddb0645387cc6535e5b7991e6428c4157a76bb41084fe\r\nMsg = 216d9eb896edc693520f99ac91f34cb54e76d719\r\nMac = b43388ba7859f803655d914b60ce90\r\nResult = P\r\n\r\nCount = 234\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = ed14373671cd8041e00874b5d098ea225eaf9c68bb51cecb\r\nMsg = 0569c6be9ddcfbb82618fdcfcab3dd60c20c49f5\r\nMac = c2c11297111a92a484868179c5931d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 235\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = f2faab6735779e9ac49716e7fcd3faac939366a7249f4f0a\r\nMsg = e7292269b07683acf5bea0b300782749074e2313\r\nMac = e10f324c19d79ed83256f15e302699\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 236\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 2bddd90daa1251a42a0e2fd2858568887f85e6d96d57daff\r\nMsg = 0f8b828c0e59effbdecc30abb6cae0d9af9c7636\r\nMac = 1aab0530749ac4c6432157730ee3ee\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 586233e492b76ade095e8f5ffc6df4bf6caad2a675953b2b\r\nMsg = 92af89c950d6221473a358dd0f280277bde7ab0c\r\nMac = 2a79121e68ea6b841e175ab5066388\r\nResult = F (1 - Message changed)\r\n\r\nCount = 238\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 5aea45c0995e950f333e29f4db82ea4c4c080ff82fe32bd6\r\nMsg = d9ff1c84bdb03114ebd5f471247a579311f4672b\r\nMac = dc58e7582cb555ea784036a8ba4b8b\r\nResult = P\r\n\r\nCount = 239\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 900c8283c7d50d6da79cc07d3dc7b76c2ef76100fa3ae2df\r\nMsg = 3f8c6d21ec05bc439bf82774f1812bd2dfe0d3c4\r\nMac = ec1fa18916f991d7276428b9c93c70\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 240\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = abbb803150cd7fdb9f3d571bc749debe72c825e45568aa5e\r\nMsg = bb5fd7f4fb020d38c13df3003a9bb852a86948f406c51624eaf81989b006\r\nMac = 799d598f32ebd9cc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 241\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 2fa619eed51bccdd2ce63580ebf85467ac9136f79256bf1b\r\nMsg = f92d1a6731f3bdd811fde1ed936de907ebbc4179670857859aafe788b91c\r\nMac = 6477feb7dd4c818a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 242\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = d0115f369d0f74073a46e3b9625660847dd7ac7571e40814\r\nMsg = 97da5d1f669dc60b6c6fe4369e01f3fbb9af30b483b23d885497c684d6ef\r\nMac = 3d7f0acc627b785b\r\nResult = P\r\n\r\nCount = 243\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 045c4b86eed865cd989f035afe8c257c400c11b1f72548c6\r\nMsg = 5a6233e492b76ade095e8f5ffc6df4bf6caad2a675953b2bdfa8513df1dd\r\nMac = b5a44479b0be31ce\r\nResult = F (1 - Message changed)\r\n\r\nCount = 244\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 4a83bf338fc0125ee1966df46d46a0d0b41e51569b3fa957\r\nMsg = 794a86f5b20d344ad86fd5523d08f1864737be57731440c29aa6b4257457\r\nMac = b45939cc01918eab\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 245\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = d9ccd93317441e9d6ccc358f31e7e2ccef8c921b23d74299\r\nMsg = 48754401bb69bed2cce8689e47210435878c7ce184d911f60d26b4aa5174\r\nMac = e0d1b6a530944550\r\nResult = P\r\n\r\nCount = 246\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 1e50fae752ac3a6e2b1755475e84441947e9f4b1d29546f4\r\nMsg = 34245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc30493\r\nMac = a0fd99f1405b027e\r\nResult = F (1 - Message changed)\r\n\r\nCount ",
-    "= 247\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 4f98838899bb47fd3b0fd5efcf55403996567a0fbe1abdda\r\nMsg = 0c8cc752ae8d487c621be129326513a5ccb4141e324d21aab399148c1a83\r\nMac = 1aef1b7bc7856c6e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 248\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = c98a22a667aafab0c94047e03837d51b11490693d5c57ea2\r\nMsg = e4fb1612e50607457dee8087ec41e57fcd7fc550497eaf1c8b0d47c773d8\r\nMac = 2c467fe37fee5342\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 249\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = bc6d4c46476ac1ea902be391b8a3f04e102aecead167f0e4\r\nMsg = 93b3314baf20e28a39e89592012c35adfaa3ee6d3d8e494051ee9944aaf4\r\nMac = 7f10757d2d36a55d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 250\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 5783548205826853ae740d35d6d69ab524c38fdfc5c51eb1\r\nMsg = 11c90809f9c53d2f77b56af0a42287ac6920e3d2921cceb824d496caf1a7\r\nMac = 07630c2fc52a24b2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 251\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9cac76976750b7937b3bbc6986b4c726f0d0a63310db85d7\r\nMsg = 5de2265292780222349ac793eaa17c5a22902344063f497aabb9dc038ce2\r\nMac = fd092bab159861c0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 252\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 616de0b0f868eec923bf9edebbbaa51d3faaa3f86b2a5687\r\nMsg = 38013d62558647bc21d293830aa3ba80ff3fb84a8e0938754c5213077771\r\nMac = b4e782780989dc11\r\nResult = F (1 - Message changed)\r\n\r\nCount = 253\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 5df77b26f3d34eba49d287addf0a38d20514e2b7e6059935\r\nMsg = 1930a8b428334df9fa1ac16890f3a6a93fcf9d6855d00b06ff831d8f6a70\r\nMac = a8ad975046cd7571\r\nResult = P\r\n\r\nCount = 254\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = c56f710e39deed799ffde6d10e8aebfa2bab5e5e073d78e2\r\nMsg = f6fe0f16403182d012f8b6e02539c386075b4585be5b18d6ae1c5f9ebdff\r\nMac = d0df47dda012655d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 255\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = fef8982f7342f1b953658453cd5ea413700eff00f1ee7d6f\r\nMsg = 269b6c1c95bc079398bb31e285a887c1832202d6ec257a2cf62468e29358\r\nMac = d2c90040bf66b2a6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 256\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = a34dfa24847c365291ce1b54bcf8d9a75d861e5133cc3a74\r\nMsg = 105d2b82676bf67ca9575ffd31d7d114e709826fccb6a5c3d3d7e26ff258\r\nMac = 5e60278f98b3135c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 257\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 520fe80cc4a3a5ad9c31f7010504923b7a7fd88292a64f98\r\nMsg = 2e1e0712ce74a1ad02079aeb0ce35edacc33f9a5d907cf70d0548d84ec3c\r\nMac = daf839ef84f1c81d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 258\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = da4775b8f7d654bc4cf2eb75ecf4831411bbc9a960ea2df0\r\nMsg = bfaccce3a9e66f45e454090ffedc348306dc2807951ce0bf100178612703\r\nMac = 3e2eb7f029e687be\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 259\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 15e3b3c5794fececd703ac58ccb22a78e15bbd55c579416b\r\nMsg = c6c3457ffcb6e66c085ecb69492deaa704e25aeeabb7b7795fdcc807b325\r\nMac = afd75cdc02222e65\r\nResult = P\r\n\r\nCount = 260\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = e0f2cdfb64bda8f02ab90620fc5a1943c4b536a99f3f8820\r\nMsg = fd0365ff6061e5f55c0e382f5861aad99c135f9511f33ace4bdcfe48c6e4\r\nMac = a1046d4b29fc50ed94a4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 261\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = c7aafe7d3b419fa4ea06143897054846ac4b25e4744b62ba\r\nMsg = f1baf3be69f69611fcd47256e43830a1b3fd8bd3952eb26ed679eda7a4e0\r\nMac = dbc419e1ddd5cfdc63a7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 262\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 58c219f2bc8ef2ed7a82cf70e4af4747e36a30809a5a6222\r\nMsg = 622642aa69b3efe14abe0a1d2ba20f3f76efddf62e6cafe2845c4dfaa501\r\nMac = 4e496c3d2d84d11923c2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 263\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = abccee975feb10f635d548a8502f7c8b6adbd2be74117257\r\nMsg = 4f37a460d180a12789779fc335326c983ad6b18295b47f1715b82b2dc704\r\nMac = 41b234e0173770c469b9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 264\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 0218eb619dbbde2e846218339aee4383792856496eb3b85c\r\nMsg = 28d3510a37d5f8481e7f22941c1fb1d6c70686fbad9747a23c9d5f18dfe2\r\nMac = 3cede44c942387d91767\r\nResult = P\r\n\r\nCount = 265\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 88b2514f368d51db283039efcde1891652a77daf68feec43\r\nMsg = 067a3a0434e92cac02710221fbb6dfcb7ef0264e2994905491317c8c3697\r\nMac = 128e652ce0a8f1a6194d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 266\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = f2a78c449621278e9e927fcd50742d042d98d5142380fd3d\r\nMsg = df899dd6b99cc28d66604ca92431fa7f442a4927d03b392e707b548b8ebf\r\nMac = 2eca3c42b5e5d0f3b9e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 267\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 01fbfbde7dfdd6f0a0c5244cf6c36eece4d6dedd8baa463b\r\nMsg = 485ef613bdab5473763bb269a0d8c7a4bf4850bba072a96f8fc39a31cbd0\r\nMac = 333eb331d6a0d46fa279\r\nResult = P\r\n\r\nCount = 268\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 6ce99c231d2ef0fd48c2375dca93f8bb0df97d4a44e835cf\r\nMsg = 32d71e59634126ac6c6156a80a0dfa0175b29e9f40a3169680b1c15830fc\r\nMac = 3e90350e115c425ba466\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 269\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = f7a93aab5707ca3d2362c5669198e0218493acc3cb7b02d3\r\nMsg = aeec40ca8964fd6a67d3dc871ebf1bfb72f52907f1d6ad441bf2cadcc6d8\r\nMac = 7381d65aa138c86713b5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 270\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 84f39f5207afcfd677a7544579f2b888a1eabdee4e835924\r\nMsg = b8d21e9c70bf63f04be311d50f84aad7e1bd2b0e517434ab978d68d01c5d\r\nMac = 4ab61c537f8b15f824cd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 271\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = d488bdda400932de56a9f105f0e74ee79c2ed869faaadc31\r\nMsg = e64949ed85de6359595f286e29014c26daa7759aee56e4194ee958774606\r\nMac = 2752bc490802b9dd8686\r\nResult = F (1 - Message changed)\r\n\r\nCount = 272\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 76ddfb075fce4be8854185c6899a88d06e24854506b31237\r\nMsg = 9d86ae7d70e839078babf7fd60480a4351690867c6a8af837d9ad465220c\r\nMac = 2522efecaa1ba11c0260\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 273\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 618041501dfcfdd2b60d71c04d635f6357ad8b0643af77aa\r\nMsg = e5e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca7987\r\nMac = d958753757a11eacc848\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 274\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = dff6b9493de80447ee18ea7311fc9b8d74f77ac1ab21ce84\r\nMsg = d70aef3532bdc5293a3ebb11589ac1f801c9f93ea0d656e1d04068facf9f\r\nMac = 9a761e0e54767e414cf2\r\nResult = P\r\n\r\nCount = 275\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = d7780ba2dc5cc584472b64bc9f6246bedb27c70aca22c0a3\r\nMsg = 14691c1b47ff1547c1d2151913c2d1862d8f54782291ea202caa3d8ef07a\r\nMac = 78a2bf3a5fc87a14e090\r\nResult = P\r\n\r\nCount = 276\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 3bc5dba883e2e3b81df06760cc32f11009cf5a5503cbe864\r\nMsg = 9d043e368b41acb5eebb99197e15adbc3d19175a0bfcc97275e3e5efcfa5\r\nMac = f457293acf683c873add\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 277\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 7b3fba25c5ef410ecec62276b105ecc01c325dc2530e8364\r\nMsg = fda4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29c\r\nMac = 0cfb78ede5f4c185c33b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 278\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 38efdbbc5645f65414b9cb81d2f9e4f190cf6e6e05eaedbe\r\nMsg = 50422c5e6a0fb8231b3bb6e2f89607019be6ad92a4dae8e0fe3f9e486476\r\nMac = 0c1acd8e8527e2663486\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 279\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 94ea5b0aa6c8b07e379122006042c920077bd61610df6b4b\r\nMsg = 1d52f401f01058356d8c4c630f64c5322caa6063d6365ebf0040ec4ee12e\r\nMac = 2dec0d3bca617209b07a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 280\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 5584994f80640233ac8eb4d2f873e8c997499095250b48b3\r\nMsg = 91febca4f1ae7e27501400c44ce8681ec90f5a5637c962db142c9284b1d1\r\nMac = f0b3135c1748e823aed10c4694fc60\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 281\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 57e99653fdcab10135a2ee3bf45c1be69e9ed57bd74dfbad\r\nMsg = 51c88fd98a7d82043a1500fc3d8a66ba7ab7760467c7fd89cfeeb22dd257\r\nMac = c588ee1d4f330e51872065c02cae61\r\nResult = F (1 - Message changed)\r\n\r\nCount = 282\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f622d736124641bb7d53706bf2a69db2fc31461fb92818be\r\nMsg = f09569906",
-    "381138cc49e3fc2384c5d33c34abd3d617c487b52ec6ee7b510\r\nMac = 610e1c1f9ab35059580061b8662a81\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 283\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 9662baae49c26e5452f3304ceed3b78326d2020a99a63f69\r\nMsg = 1d93aca4e2e31f5ebb84fad580fe74f5b6d1d86ab30cd0c8031be4090be1\r\nMac = 3c5a4eb51ec58ef3468bb00e7cae8c\r\nResult = P\r\n\r\nCount = 284\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f2100615431349aba5c4f5a7f358fe7be579f4cb9e8f33d2\r\nMsg = aaf26bff7ad4116969c15d9206de6c737b7dda87619e3575d9b6b2efd8b0\r\nMac = 7396deeb4316fc6d84d3af119656f3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 285\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = a5993acbea8c55d7eb55d60596f83e1d9f2cf636d06240da\r\nMsg = 0bc1fede6a6ed9e1deda82612fbaa6e60f0b2461fd5d131e6a7206f41a07\r\nMac = 2f6b0a9f2a972d299bfa5892f8ea83\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 286\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 775846f9dbf36415640276642cccf87e3dbdf6519c5b2db8\r\nMsg = 4fc989f327e1a1cc7b8af618ee6ae6d25f78e2b76b681455336945655f13\r\nMac = 8b3cf3171912096763a2ebe5ea9e41\r\nResult = P\r\n\r\nCount = 287\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = b214b16bbac27ccc9773d3c8dd31275da4876c039740ca8d\r\nMsg = 7786a3e30acffd6dde375bd859dd6be2c9221b979d0c66d1d5ed6e00b73f\r\nMac = 1a73acbf4e9250610b74c727b9c42c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 288\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 032b4cfce8a1acd89de5f6f78794e2813bbcdb89959dafec\r\nMsg = 3f0bf0141dd3ace0fabeace61811eac5ec801deb7ffe3b0514d43db90bf0\r\nMac = c24066cbc00cb5c28e48141b627411\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 289\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = a053255875ed4b5193bd9c5fa4172a1f660ecfd2a394c2a5\r\nMsg = 14666eb960c6b4f8b6ccc49f79a039b12c02e0972c300f1e9d0a38c0a474\r\nMac = abce3abc224772a43c058016bf25bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 290\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 0ee87b40abaa99f598fba22c3e677a85ca3ec95c3a51aca8\r\nMsg = 1bff19aacb9c7d0a44a15ce686a2469e3934d086365d36f449484498353d\r\nMac = 4d565c2e12901845e77ed8b02746ca\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 291\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3384f8563cfd0fc8019bacc9b691c9ba4ae6dc8cf4c00629\r\nMsg = d31e959cf7842db351db407266ddae0b36e37f34270576724083e9989764\r\nMac = 96d0dbf51d96b532321da593383964\r\nResult = P\r\n\r\nCount = 292\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 375904fb9fcafb7f19877b145b0284cef61ac7a3d88f537c\r\nMsg = 441bd4db5e80c7db1b575a19b7bad021a719658a2c818566291d3cdd32fd\r\nMac = 3b8dac029f6658e44e5f5bb8f8ee40\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 293\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3c1ca347a7d3d8db8f704410c493d7a65718cb7bffec2dff\r\nMsg = 555fd02fad4f44484133f9472c050f9da27390fa2a3e48cb0be0d7020171\r\nMac = 32be39d874c15a0fffc7111f76bbc4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 294\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 8bed296a3ac03fbfb71422b9211799150b9d766a8116bebd\r\nMsg = 6df3de543cdb6d1adb6ca7df6b5a4510fc8379a4f2c87497ad1c2b9a69da\r\nMac = f24ff3218e7905d81c3e99c84bfd26\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 295\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 9530bb291d38f6bed10318081dde8fd178f02eb0e8b7d022\r\nMsg = 5f48624302d1acf7750994d45f0999ecd89a3861cd0268d5a51e672124b1\r\nMac = 0afed54c577e550eba7ac94a2d82d8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 296\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f5400b86ace6e3da5f090befb96fc05d0409bf41fc77b4e0\r\nMsg = 1c79b055fded54af5ad2f3253f93a090ec003863d9458d3ff718c4c13937\r\nMac = 59f94d4b13539a5f0a8672e4599bad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 297\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = c033e4a512297caecdbead892b11a9f7007af9a74bcab89e\r\nMsg = 3ce965d58856663d54269af4791ec57ef98227ea387d525769c23ab74674\r\nMac = 0dc19e37a255dabb61957f7f89ab06\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 298\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 2459f951d1255d093b72144b83b05ea3185d5123d1ca864d\r\nMsg = 661c6ff41af91a6d828a4d5d507f8a9130abe91412070950c5fa4c75c8d7\r\nMac = ac8e75b4465a52b3a7da3746f9875a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 299\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3b63415210361822e23cccf0faae88cd7642f44cec45fe37\r\nMsg = d7f78e950d2ab520a6f1e82ec6f206b2e8c71131c85234bd80500527f131\r\nMac = 15e59760acd3dd74155d6d3739c189\r\nResult = P\r\n",
-};
-static const size_t kLen35 = 61387;
-
-static const char *kData35[] = {
-    "#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 256 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:45 2011\r\n\r\n\r\nCount = 0\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 45b74171271e1fdc19f9beadda58010d843af69dc2f4ad003dd74b9b570d5a98\r\nMsg = 00\r\nMac = dc0ee796\r\nResult = P\r\n\r\nCount = 1\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 2cb4239fffd13762fb5391f5a4760d12d96ea12666a793b4d651e9f4891c22c1\r\nMsg = 00\r\nMac = 2e19d6cf\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 2\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d88586da8b605a6fd5a45d316b89fea15e27ff4d92238397718e68b8e00ad605\r\nMsg = 00\r\nMac = 8ad78885\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 3\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 136ffda3359fee8c81e6dac131256f4bffc0d3c3e74f8aaf2f979a0fa5b8ed32\r\nMsg = 00\r\nMac = e430d0da\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 4\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = e1a7867476bee9928b7237ab7a3d502fbe3d2d45b6e4c41aa9f12b79099f019d\r\nMsg = 00\r\nMac = b6f00f90\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 5\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 5b4d945d55dea22e37821ec396476a4bfb617d2f392ad93afe67bcfda9cd9b72\r\nMsg = 00\r\nMac = 5076ef43\r\nResult = P\r\n\r\nCount = 6\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 23df62a79fd5866425427d0ccabf05b16590e8452ee22e028b51910926ad314a\r\nMsg = 00\r\nMac = 7bd29398\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 7\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = ce9da814595f76a7e52a1222c7c9a6579b3cc2e393ba51580ff6cc9b6ea2ad8a\r\nMsg = 00\r\nMac = ce872fd7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 8\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 507c4f32246d637fe08e454c638b014438109e1fca31f724d40ac6ec1aa20268\r\nMsg = 00\r\nMac = 282a7ec2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 9\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 537dfe9fc000468dde29800549b1cfaae67ad89d22c8264d7eadcd914ac54ef4\r\nMsg = 00\r\nMac = 7936b7d5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 10\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 1f57959cecbd377374477e33b34979814f260f77867392ed645998f73a3b06ae\r\nMsg = 00\r\nMac = b4b63264\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 11\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 3d272b4a1a1031369aff514e2df98d580f972b5abeacc05cb1288e6e473c0fed\r\nMsg = 00\r\nMac = 18b35edb\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 8774d1acf96362215a3d1e51e1a52a980685dec4f3afd2d438c03c00c04a79f9\r\nMsg = 00\r\nMac = 80eb7a84\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 13\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = f37155beb5eed8899d9ed4b5fa21b60b40af289f090a355d5bb1aee52957cd99\r\nMsg = 00\r\nMac = 6827f73d\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 14\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = fcb52c44379ae8083bdc7b827383df93cb1a7ecc21574730f9fe003b7302de23\r\nMsg = 00\r\nMac = ccad16d9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 15\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 83e231ecf8913ebce00e62b8f00c1abbaad710142fdb912c54664169f7af0e51\r\nMsg = 00\r\nMac = 8e393f56\r\nResult = P\r\n\r\nCount = 16\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 7d35e77450e2adf8805d5ad67de5835b2c5dccafe8440865c7e7a1501ed53a98\r\nMsg = 00\r\nMac = c6899710\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 17\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 87143071241bb65261fe7afcc102416e59b9e46ee0c9007308f0eec10e45f6d6\r\nMsg = 00\r\nMac = a1a4449e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 18\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d30d2d1670553c71ff0264ab861574dd03a103d954226d1b540f18fc47b3fc29\r\nMsg = 00\r\nMac = 217ac763\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 19\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d6983226b2c3a431abcceb77c8ec6b9bae80199115b28c5d7c56561e1b12944c\r\nMsg = 00\r\nMac = 26c717ce\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 20\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0cf53b4aae3e0a209e58385dd32d9cc6163265241332c332af4de4b99b4022fa\r\nMsg = 00\r\nMac = 1bfd19f6e1070186\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 21\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 5f988f38410d26d293ef32d74eaa81acca82545e767ab59dcc750a09849cebad\r\nMsg = 00\r\nMac = 7e52911c0d7987a2\r\nResult = P\r\n\r\nCount = 22\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = d8fd6e1dfcca8f656705aed7e356a576baf8907c8d10d54c833d62a8a6703624\r\nMsg = 00\r\nMac = 31b478b4b4adaae0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 23\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9\r\nMsg = 00\r\nMac = c8be2b36c93684f3\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 24\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = fa282e1f3276a3e0c769f2ba25ce830591e860300cc03ab57abdb14c0374d060\r\nMsg = 00\r\nMac = 27b8111c3d9f14f1\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 25\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1c6942e914218135496e0d7910abe67b9f7f29bb09029bb37021865d7543c4f6\r\nMsg = 00\r\nMac = 466b7077bec98b7b\r\nResult = P\r\n\r\nCount = 26\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 08f199a8d7e3ea821dd3106e8947cd2e9d485342b25a64713db2b8a650a49ffd\r\nMsg = 00\r\nMac = 796deae0d06b1bf4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 27\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = febacddf3448c7464297ae53166793e2ed962de0d0947c5e5e17abe3cc103b07\r\nMsg = 00\r\nMac = 5e2d21aa3351a2a0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 28\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 59b9fb83b6a85f017bde6c0ff3ced955b9f343cc71b680c6b591302f52759412\r\nMsg = 00\r\nMac = 3e5428eca10808b6\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 29\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = f07e6655424125462a96390e02bfee9d89cb271bd9bbf22a9de45f6b7e949343\r\nMsg = 00\r\nMac = eed5aed01096226b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 30\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = a04f84bd79406c138d02698f003276d0449120bef4578d78fecabe8e070e1171\r\nMsg = 00\r\nMac = 18553226e5f9788a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1673a52494e9af02472c1777232aa3813c7c162593eca7112f34b3807009af5e\r\nMsg = 00\r\nMac = c5907fff58c68ee7\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1e4ffbed2d5a7bcda5e24a66048660629d57567f83307087a846db8246ff332a\r\nMsg = 00\r\nMac = 29599bc212927246\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 33\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 8b80c24ab4a3c24ced82ca8c69924553a37a139bfa2541c59e15188ab0fa5a34\r\nMsg = 00\r\nMac = 299746d93b0b4881\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 34\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = a00ebf59768f6437b48a91923f5effcf31c745b980f79f2edde9ed18dcf2ffa0\r\nMsg = 00\r\nMac = 61950ed83db6bf74\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 35\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 319d3f58fd7257901ff364fa68b86b1ba27c11962b2c5be8e33eb95548444322\r\nMsg = 00\r\nMac = 26793e8f8d5eb7c2\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 36\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 015a9d1f2df2c31f14cfbdc0bd68725fe8113a024f2a43312d963207fd6f0d88\r\nMsg = 00\r\nMac = b19fc2680b8b82b7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 37\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 003cff344c4e1932ac628440d819eaaafcc3ebe7c525cb7abb7a6716d2b76e05\r\nMsg = 00\r\nMac = 48a98dbf16257142\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 38\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1a581f36e1816d346f7bcc6df78316aa353111e447fee6f0bd05d562f30626ab\r\nMsg = 00\r\nMac = 587155c18ebbf8b8\r\nResult = P\r\n\r\nCount = 39\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = ebab54c4a22a16f7d9546bbf682b995a6ce944e949f1920eee058db95ab9c93f\r\nMsg = 00\r\nMac = 067927f063adfaac\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 40\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 58405ef8fb69e88221edc10a92c01cc44255aa7083096adb79bec3a8cec6d050\r\nMsg = b4aaf9ad1bde60a8d7e7cb16c1cf6b713df17d1507b028973068a95963a5ad5b\r\nMac = 42ffe65f\r\nResult = P\r\n\r\nCount = 41\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = ca0f404e3389e9527135f53eb58bca7726266b8086d33fb512e8143daad7633a\r\nMsg = 8f2a6b2185f73372ccaeaa7f93d30d1ca80a451ee0e46ccbbaf98c8f3f37aaf1\r\nMac = f2b311b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 42\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 67b896b88f07962e08471634ab7e522144d716a2969bde55a05c3c931f747a8d\r\nMsg = 0218eb619dbbde2e846218339aee4383792856496eb3b85cc43fa81446fedc5d\r\nMac = 69db1949\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 43\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 422994df8766f7a6a7ebfa2ca57ed6189d9e9e8455c8715c14f3f407b75dff4a\r\nMsg =",
-    " 12f0c45d06a138a964fb11b2d450620a2977bcd2952afe371cad6e3d48b009bc\r\nMac = fc5f1ccc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 44\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 3291be3aecd2e06cd2ee61a14d723450043d450567cbb0bf88ba32972d86dca3\r\nMsg = 343d5a4ad39acf81adcf24e9807618932abcb3bc076734f179174c77c8cb89e9\r\nMac = 3593d615\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 45\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a1885ce431cedbb60f7b3d96a06cbc60a964df156ea4b4191abc5a9f60a0c361\r\nMsg = eedd0d767a25b24ee25fe747718256af51d7b4bfe900adc069381a71a2dc7aad\r\nMac = c558f768\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 46\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 039188ec58fa55acde53c337fcfd0013f0c6efa55c60ce470112159bcaada11e\r\nMsg = 009f47f180e085776be6644aeac0070be64c289f84a7ba3dece7cdc54f0db354\r\nMac = 20d3639b\r\nResult = P\r\n\r\nCount = 47\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = f7d946f66e1cc4e5a79dfb5559cbea5a128545eac38e17ee7f3bac9a806faefa\r\nMsg = f250c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a5\r\nMac = 90b4bfcb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 48\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a61f586ddbbe0219187f8f446d4b172f5e9bf855d1d5d6592ad8e03eb4d555d6\r\nMsg = 71c8eb0079559a306e236c49b7ce1b6cfe26c7888733eb7ec07690831a72c0c5\r\nMac = 78ce0135\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 49\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 7774802fd82fe96c05431acd40b49b1160d403c0db09b10f23d0bd0435022edc\r\nMsg = e75b6ca1b87e775b33536979422a1cf743f58c71b1599adb00050972c843cdf2\r\nMac = d885703e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 50\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = c4261ebb87a76aaa82a00392ee2e2318f0b52d5f2724e374847ad9ea5c8929c1\r\nMsg = a41bb1f256228302cd0548ae2148ff42774d18c2d6d3e38b36bc4938da13bac3\r\nMac = 857d8909\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 51\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 6219c19233c1b91d7785fde3b65df3bd2e1d74331ba62e4d365947a77cd243c4\r\nMsg = 68f17b9f57734784144112c79bf360ee324d37f9a7718137d954b15e796fa9db\r\nMac = 0e85de57\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 52\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 7e8cae1374d3a21bf2dd3786754668f17aa63dd5e3654cff9dd18041806d1968\r\nMsg = 2d335be62ecfed45183f5a04014c1a52afb7b918b9cc1f2be93b15c6e5240537\r\nMac = b56ee72c\r\nResult = P\r\n\r\nCount = 53\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = c2425ed20cd28fda67a2bcc0ab342a49d79d6b4eb196266cb0d116fc18895545\r\nMsg = b5f24c00cd15e377f444ae55e02b335379e7ae14e7c9bd05f0575d8981941553\r\nMac = 2e44c573\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 54\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 1f7871680bfa59a8a178604dc513b51a3d4c682cc4c421de594512e9dd062ad0\r\nMsg = fcb43224bf8989e1809d90481ba043328febaf4b6c1c05d18800ed98f4b71c52\r\nMac = bee03b92\r\nResult = F (1 - Message changed)\r\n\r\nCount = 55\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = d8a27558d070214d3f765cf969b2b8f09c0b14ebc492cb2539072b04db9f29fc\r\nMsg = fc69a1f0d0ba8eca9e7c0570cec9c76b511c74b2d8b65928444189675eb42fbc\r\nMac = fab3b2f6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 56\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 72354b455230b72a6dbfa5cf6c3726d7f8e65ca773f9d469e99d165743657b36\r\nMsg = aac60835c309d837aacc635931af95702a4784c214283ebbfb43c4e29973560b\r\nMac = 69519d9e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 57\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = ca92b095173076a40e24522297be27fd3a765c8d417f24c71a9f03b3fe3d8e20\r\nMsg = a96c4d5c89a364263c97a453308b9360bc0ed868602b9ff54fe13f162ad31ab2\r\nMac = c59a1a39\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 58\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = aa56f98e03f559eea02ad958e125f2312ff97bc3310079ce437b383f247a9b3f\r\nMsg = 01bf2aa8dc66ca44d16d4567f1adddd4461f78706ff15cf68ad937eb57aa62d5\r\nMac = 31171cfc\r\nResult = P\r\n\r\nCount = 59\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a0e317b790870e6703e6077dfb8ea327c12e29a17107284cb89d5effddb2d9a1\r\nMsg = eb4ea6b72dfc6657e835bf82054796183330c02a8db3c5b179abe37fd0a05675\r\nMac = 05d54199\r\nResult = F (1 - Message changed)\r\n\r\nCount = 60\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = e3de27949ff64066131c81bfee172b308f9bb0b31710678ec394837b79434605\r\nMsg = e41557341e8dae33568524f3f64b23426044c9db3526463ad16786af14f611b2\r\nMac = 975ad1d2fcff6a85\r\nResult = F (1 - Message changed)\r\n\r\nCount = 61\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 492dacdcb4a35fc438a6eaa35e26d2f683a1e85e92df28f213dfe1da6511161a\r\nMsg = 0515ad7b8576258645d37b7ac771745620e2e9e009cd778f34ed77a7dc5c30a6\r\nMac = 9f43dba2aad2f539\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 62\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = d71c50d55850d432cd8c8ff4ea427b3f19cbe14c785a7704202fcbcead0de5a5\r\nMsg = 7ffbc4a09583029cbb0acb6b13f08a189033da22c2ecf921f01d79ac68a9397b\r\nMac = 5d00ffc5f8cf1ddd\r\nResult = P\r\n\r\nCount = 63\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 557eb2e709d58915a8bada6433f2e5660247e0cb1588ea84a9d24028090eb396\r\nMsg = 003132645e3026f6a2b9d0644c16e5e4d1bf8b53a51f0e1b999bd45a67d19341\r\nMac = 6f3d9f50d09476ef\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 351d779277148ab4474843cc798942cacbe863eb1c1c9338dc25e251c12fda68\r\nMsg = 34bcdd3d0469c01d0d95a85ca705d887385bfde20596a90b47d902db826dbc8d\r\nMac = 79ded259f93456bc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = e1c17ce3d3c61468a7652a95128bc0f6c33d9ccc46e7490327f15f645a94040c\r\nMsg = 97829c60ca9a71c23eaf1c4b4fbd72043037ef0cd356b68e0db0d4f0f50cc54d\r\nMac = a93f0d16499f63ec\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = a9a86a4407b7ecebc89434baa65ef173e88bd2dad9899b717ca578867c2d916f\r\nMsg = 25a152850b4b80b19d8f0b504b2a8a241824b3a1fca8d85c8713b2c0c84b5e02\r\nMac = fe84ce3defe00f67\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 67\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = ed14373671cd8041e00874b5d098ea225eaf9c68bb51cecbe8083149bdda062a\r\nMsg = 38106cdc72b1ddd0fe11f23819096dd7479e95ee9730940c28f51e28eca653ed\r\nMac = 470404ed731640a7\r\nResult = P\r\n\r\nCount = 68\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 009f47f180e085776be6644aeac0070be64c289f84a7ba3dece7cdc54f0db354\r\nMsg = 2eced43c084a86f89f61e7237425137c167aac29e4cac4071afafd3f0c9dee1a\r\nMac = f67d432e5b6fc5e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 69\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = f250c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a5\r\nMsg = ce61d6d8de1b299c9b063d1e1cb1faf7a616faa7c6673d7f9c0a1ebe7ae285fa\r\nMac = e1d950593abc14e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 70\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 001150b2dd572288b6fde466ec2c2a64c75a9d516b7096f7082bec9f52c20ad8\r\nMsg = 6dc38e37d1379732df4dd535db88d17aa59d7cf9e8d60ae695b4047b90d899f7\r\nMac = 2de6700fc1562ad3\r\nResult = P\r\n\r\nCount = 71\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 68e00d394855b6697da8213a120dc2213b3a8a1e88c9b93f5edef465a809974a\r\nMsg = d21aed2073e8ae9c0560f9dc1adb961d4f959fa12c0384a44c675192bea13477\r\nMac = 9594f10d5ce5e616\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 72\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = be0f6052baf658a3607d999b81401edf7e2afac2b143e1b908c8ea0ff38193d9\r\nMsg = e502f0b4710bfe517e783c4bbb85055c8471b04e12dd6776f276367fb5d36369\r\nMac = d409a879dccca77d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 73\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 7147b3c5ffb2660c45cd8d78a6fd44bdd5ba75349642b32ec88f6688a287297f\r\nMsg = cebe84df789c98dd125bf43cd993e2f089611b98d10be04904e2468d116dd2ab\r\nMac = 21cfc1e6c1c38df8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 74\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 205e751926038ef940c6599d84a9e1b4737bc826e9fcde544d43f2a10b5de931\r\nMsg = 86ffd5bd3bd1cae10706a61d247b2257b165f37cb53ff21761077a2295a9111b\r\nMac = 73d66ea826b84fc0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 75\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 8c8a502eafcfbb813dd1ea907b1660a41fcaa3f905aa93c22320f96ebfaf632a\r\nMsg = 626aed82974ef29a1ba0a6c6fefcbf34ca982e6214835183502f6a24ea2e500f\r\nMac = ca3d007ecd99be83\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 76\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 596db502a357e102566291b916b32b8a09e99d3739f5e6543a2cd8fb0c9a1cc2\r\nMsg = 22bade59214fa4b933cb5e3dc5f096e239af4c2f44f582b095c7fea6b8914bfd\r\nMac = ff4ec21d89d4762c\r\nResult = P\r\n\r\nCount = 77\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = f51f2fb4b3fd8045b70d34b600a2697cbf7503be0d8cfb5cdc60f9312e3e269",
-    "5\r\nMsg = 4d43702be4f0530319555d7f1a3356160f6cae48051f12e22a153d7e405c1149\r\nMac = 3d615ee77043d8b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 80a4b14f951490618ce53d39abd3d786b425d4f76b26a25052d98ebdb7e9e666\r\nMsg = 0b2a77b0175ffafee40cf83bd19e785dc7ec4319786c49b3e7a741142aea901d\r\nMac = aedcaa2e26d2f5a7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 79\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 39fb57fadff7cd9e1cfdba154422b71d693d08807d86da46ba63c929417ea549\r\nMsg = 567c7400f190d06e682b3dac5f751639a9007362b1a2a8b618800fbb9f6c08df\r\nMac = e29461fe8c6b3767\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 80\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695c\r\nMsg = f7f28df82f910badc5f4b3860af28cbb6a1c7af3fafa6dae5398d8e0a14165def78be77ee6948f7a4d8a64167271ed0352203082368de1cd874bd3b2e351b281\r\nMac = 4a0fd541\r\nResult = F (1 - Message changed)\r\n\r\nCount = 81\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 713fd349c56d1086794eb20ed59ddc89b065bb8533b968c6dfa60bddd16646fd\r\nMsg = 4f3b91aeaaabfc7d4dd6821549d4eee2ea17f59aa196c67b422be2d46f3a2ec65494464c969b157985a6a30199a72dfb1c0b7be524e16ee9c43fd95e83e19192\r\nMac = bd4eab1e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 82\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 1f89d9ee93294aeaf3503d15a6dbef48708de48897a72b3545b9e3852eb7fe31\r\nMsg = ea0608b19f47676f0f342cc2742e003a6a74fa2850f41e0cf162235163887a3830dd8b13b45842b3c686ca239bdb9897e646ac9f440713a0d8c5b18532db3db2\r\nMac = 8bddd404\r\nResult = P\r\n\r\nCount = 83\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 2b50dbe8a5ed0c7cb69aa60a38d10cfa4553c73d58c0ce84b26504b0fd55038a\r\nMsg = 2586563b0102f662b5a8f9bfb0c1d107a4c27569d27bc066889213e3e830427ceafaae1ca543aecaca7f34c671fbadd518cc28d9e806bba43b2e220e5cf1aa45\r\nMac = 987514d4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 84\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 29a7ed3aa55c7eb7e5bf343ca0efbf8b2062ce67b086255551a8efa0ae16569f\r\nMsg = 2e6f2d21aa133a5061622f08ac64c6b3a3dc8154862033055c27c3a3d9e42dc885d2c9f91bd1d0212f301c3e140b2f5bfdd777be623bd162a6214ba8f60e2e49\r\nMac = 1bf45457\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 85\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = a16a2e741f1cd9717285b6d882c1fc53655e9773761ad697a7ee6410184c7982\r\nMsg = 65916ae3d88ab2add5c0c6910ea993d385cbd35c5077ea0d9db30e53f378abfcbb1e0649fe14204470d4dd53ae16650ec444cb4ef22fed86b0009b57ef71fb5e\r\nMac = 578f80b2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 86\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 47e49e5b57fbb834932fa32107697471119f1be3c3a6e71a8c474d4b1596e539\r\nMsg = b3cec7ad75e2bf6c87029a67365aa83cf797ae2f4d42e720ed4c48ba21ea08ee6aa3609f69a6909fff6222dbb45172d255146e4ce1c59b48a7895936a8646766\r\nMac = e6e64597\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 87\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f0b0aaacc25a791c236aed0e9b537fad00a15efa9c89b5068ac52c64639fb1de\r\nMsg = 9a5a9560baed3b8e0e90b92655d4e5f33889e5d7253d9f6c5aff71ea4069224cfbdd19ae3f0ecdfa65c27dc3bed721712784a09fdde243c193ab6a0ac2417e8d\r\nMac = 990bb31e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 88\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 14db1ffc1c87117fc72981706c0f90404acc98aabe950839baeb6f0b727bd6d4\r\nMsg = 3d736aeca5720f5c7bbb16df61f6d785facfa070aaa89c2d9e8af9450d62490ebd6a29c7c8e521e4a00fcca7515439f006c09056cfb7f976a1e6b98b9f799e40\r\nMac = a6786e52\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 89\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = c6f0a3692c9280c48393b0dd763e5d0b90477f34ad69f192ae4dcab771aeeacf\r\nMsg = 8439ff717e1e15161119494d368d7f3812601588265bbefbc6d48e22cc8a51688dd021500cee38fe6ec402f9aeb0762f92b2a73adece96e1c7b24be2aa9924ef\r\nMac = 70126cfa\r\nResult = P\r\n\r\nCount = 90\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 75225a26d63e91281fb37ace46354f81de99dedfde8b770ea47f08503aea87d8\r\nMsg = d729d8cd1631aacfe485b1f408a4fb60256e7a8ed6e5b53afc34be7e57f1643b549fa9ba2677779318688ece225cc149babd6259ec37fbb4adc03e8f6dd63f03\r\nMac = 5112f762\r\nResult = P\r\n\r\nCount = 91\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = ab72eef2aba30205c986e2052d6e2c67881d24ae5fceaa8fa77969539152527e\r\nMsg = 5251a0aadbc92b76705eb053d09b25b5ad38eebabfe1980d143ac90aa81f7723353059824c8d9befa5ded6f5b4973f407c7a1f4aa85d8337d82d34fd3933e9c7\r\nMac = 52f7a014\r\nResult = F (1 - Message changed)\r\n\r\nCount = 92\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 6906d6533fbc33f56e38e6a639798005daa228ebd2fc8f93803d26fef30b8e95\r\nMsg = 6341370e126097f9721a13c977eb4875cf1286e15c3adfa4e7597e0e13d93b6a8ff66c809067fd5e7f40c358ee170d4ed1657c2deb3015b886e79589678e0452\r\nMac = 1b6a021e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 93\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = cd9072aeffebbdfcce95b569c34158d0e130ef24dc99e3f98a4dd246949be269\r\nMsg = f882339f93ff114bfead78044aab1c7fe109dbf1bb2d968ad476403fdd2034cd3168ccfb0cf02f1ff7646ae3875ec349478749edf300b08be7005cc0d6bebc15\r\nMac = d16bcdc7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 94\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 3005c0100dff59e5e4b0e3b95abbbc79749dc49ba29a79b1fcf7613ecb6aa9c8\r\nMsg = 4c2c670f3ac1c4e33a8d43063c8983e20f1ce6a73299fef1e70a42a5882c061b1ebaaa8330ee1181d946541b1d84b8d57df8de1ac9013ade36d2c682b172f8f8\r\nMac = e5689100\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 95\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f32eefb301356fb1cad6dfa94864542b5f8cd8e98438bdbfbbb431f0c10f12b3\r\nMsg = dae6db62842a8a25123e50041b701ad17e2f63a0496443c3d905a9f943e6e4e2f3d369b693ddd0372ff11fe496af4b700378fc72fcc9915e7bc864b44c1d4f77\r\nMac = 280624c3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 96\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = b0212ca369c611b725eccc3daa58df412787a3475f418d820971af46773382c0\r\nMsg = 13ca022396285bf7b82a600b560208c54ee14f8496bce684895029027e6451a09f4eeb0af9b889dacfa4b7b934ae30c7d991523e23edd0528048a75bfc525335\r\nMac = 8e9759db\r\nResult = F (1 - Message changed)\r\n\r\nCount = 97\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 57a9d1ea216c69c6e360221f8c858a9d356598a8b253e2cf67f1116b5df5927f\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d381082f379b2cae385dd526b189cc10cdebbd33bf3d8db2b449ed49064d30d4b3a359110d\r\nMac = 41022947\r\nResult = P\r\n\r\nCount = 98\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 749f2fb720d321757473afc5d3a377a0eaacb425e5591026e3a1bae6a785b921\r\nMsg = 2e4f5149d67c955c409b63b04d95538808da6202e69a50ed4d3846da52fcbc76c7089a17758d9d94a63efd5ae7054dbc0bf5a28b7381f7e78debd0549bff1e11\r\nMac = 67b34b0a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 99\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f8ebad761b9e73c77faae3fd9390093fef595e77e6d7f6b35e2dfccbde925c44\r\nMsg = 18430f34d5b5fddbd228a910cab9c48e1ba2b5f57819eacbde756cc0c993b736a778c8008d37776a2915077af8ecfc76b8cd2ca621e9195bd0b27e31843d2890\r\nMac = 7a446398\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 100\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5bb9fb83b6a85f017bde6c0ff3ced955b9f343cc71b680c6b591302f52759412\r\nMsg = ee7e6655424125462a96390e02bfee9d89cb271bd9bbf22a9de45f6b7e949343def818dfc93d777528f609cd38be0a013b1eef816eb1f9593a850bb7aec5b9a7\r\nMac = 5e1fa5b9c9dcd90e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 101\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 57a9d1ea216c69c6e360221f8c858a9d356598a8b253e2cf67f1116b5df5927f\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d381082f379b2cae385dd526b189cc10cdebbd33bf3d8db2b449ed49064d30d4b3a359110d\r\nMac = 430229471a1cf1b5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 102\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 749f2fb720d321757473afc5d3a377a0eaacb425e5591026e3a1bae6a785b921\r\nMsg = 304f5149d67c955c409b63b04d95538808da6202e69a50ed4d3846da52fcbc76c7089a17758d9d94a63efd5ae7054dbc0bf5a28b7381f7e78debd0549bff1e11\r\nMac = 65b34b0ace2fc6bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 103\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f8ebad761b9e73c77faae3fd9390093fef595e77e6d7f6b35e2dfccbde925c44\r\nMsg = 18430f34d5b5fddbd228a910cab9c48e1ba2b5f57819eacbde756cc0c993b736a778c8008d37776a2915077af8ecfc76b8cd2ca621e9195bd0b27e31843d2890\r\nMac = 7a446398a5c59ec6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 104\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b228c753292acd5df351000a591bf960d8555c3f6284afe7c6846cbb6c6f5445\r\nMsg = c66d322247ebf272e6a353f9940b00847cf78e27f2bc0c81a696db411e47c0e9630137d3fa860a71158e23d80b699e8006e52345fb7273b2e084407f19394258\r\nMac = 129",
-    "e40ed97c02ff9\r\nResult = P\r\n\r\nCount = 105\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 8ea05a5033ab8b009664fa2800c24e217488ce6888cad14774ad75b2696e9470\r\nMsg = b3f09d990c2f41c8707368bba007803621ecd76540cdb8705435d74f4300eee04710a936f241c034709e625b0dd5dae1f6e86d034426819c365a05f5be420cdf\r\nMac = 08e5d5b3facd3b01\r\nResult = P\r\n\r\nCount = 106\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 016b5537198ed152670c5fcfb70ade276de97ce0cb771c5f6f66fcfe1dfd945e\r\nMsg = 7ad591e67c6a3ce3c9f871e328fc4ce3b6e7048e80691da551efdfa4c96b06a3af53bb7a88ecc32869c8f776098df4d71af91393da239c24e50436e04d35a2d9\r\nMac = 36df9931a14dca9b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 107\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22d5d4c3a3aa8d2fd5f25c08b83cea60e94058e8235ddd050646b02617f82854\r\nMsg = e86dd3216500273d0b6150227cf03adc20c8a5fed4a2799fdff759a327657a3ca554b6af16d9dc5cf3db4bf9a474bf1ef1996a06b9fe4794e634ab94a0141d44\r\nMac = f0246b4959d2fa89\r\nResult = F (1 - Message changed)\r\n\r\nCount = 108\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = c892b095173076a40e24522297be27fd3a765c8d417f24c71a9f03b3fe3d8e20\r\nMsg = a96c4d5c89a364263c97a453308b9360bc0ed868602b9ff54fe13f162ad31ab20f3fc51bd2346ae68a006afb50e846e8431dbf7bd0eb3c8f30326d26311a2eb8\r\nMac = 1d943a8b0c470221\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 109\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 2c87c0d64806fe303c5e97bccf48360f89374b6119319bfaf8defbe74adf58f1\r\nMsg = 37c6206e23163c39a13f19de48cc25dc26e6f83cb376e8d2048ad7c141fa503d594bd395f4d36c70aa1e8a5672910f735d4da49884574f833ef54760975b0790\r\nMac = 58cb614230d590f4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 110\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 028600eebf6b3eb04d8fac18399965aa8fb5f3954d3a657e188ba17f2e3bfc70\r\nMsg = 5b80d1cf745b14cb71cbc8dfe0bc7c7358f721c00099b3e250c41c2e1c9455c5ce55ce69f3f31090f9b1a1b7361e27f92d46d1e00d25f37b7b61f0b191385dd4\r\nMac = 02587102e6450de1\r\nResult = P\r\n\r\nCount = 111\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = ea1a626b623e9440e3f6f5c0b8b63b9967374ee82c1957fca5cd195ccfb2840b\r\nMsg = d082b2aad7058c3142021457d47d51d8ebaab62ab452f6039e771a1b0f3bd03355fe0656dfc7b75fade505bb05d689706867e75ec41da5c5ebd43d0844a670b1\r\nMac = c874df0a8aa87c5f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 112\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = d1155265fe296f374366dbd11f14466df1ea210cc88b0d1876509347e64815c2\r\nMsg = 3e3d3a464b2e6030be877f8db4c1c42bd2b8247adcf792ee833675a57f21594ade5be4399cc30ce373f68874f41584b4d7c8992b9082fc892307f645382c9483\r\nMac = 6bfdc96378f0c8f2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 113\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 9bcf914f787fd3cf62c6315a12feee358eaacf1f63ac802932b933c86b098a29\r\nMsg = 02c8b892b13f04d99b875b8aaa32136d19dd6b9c2a10d8871c66993a57ee91e3ebd0568e38348634ee5f5af4391f7da0356a1e7ba8424441f0db61683a002ba6\r\nMac = 365da451a2787193\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 35d5df6d714e2ba5b307c4d1908e108bc6fece682a23aa35e2de0e80d4cb3c5b\r\nMsg = 963ef1899cff6e0a6dcd80a27b63c20fdb8e9fa1ee3e14ed40ddb7c6b0dff969d29ba8f89159b82a19ac4240f402cd3b7279cd4c4ff4698c906f81edae8ff070\r\nMac = 33995a3d9c470cf4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 115\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 511ab5e28b6fda481fa5a0fb3709b249fbf29be56346378a4d3f67e1cd6f09a5\r\nMsg = e4cbbf14f27490843b0f9a17b4520d4bb2c89726f4c788cae4a3344a1a2198bc222e41907fd16a20ef5f6587f1ee3cb7850b97c633b0e0894e70a6647af53f60\r\nMac = 3b4aacb52525b58b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 116\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5e79f14d5f687ce62b82f856695af9f7dd350543ec763de75b593f1859e44c2a\r\nMsg = c0dfcb62fbc3a67ceb792b3428d040ed5e50999296702472b709a44f4c0b9bb1876f6e80866cc4d2d6ee2f0236440e029d18b2f27ea5bff14a24d53337877053\r\nMac = af30acca71feba3c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 117\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = cf8a477434cc679e52dc3f3f3520eb108239dad5bb363034bf0768c790343e70\r\nMsg = b891b1ab5a6919e0b99013e40fa7c910e55a480bd043d3d85b0b7d1342d3f777e1d2a6a4eb3ff81f5f71f99bb845217765c0708778f5be17a2294c2d5f369e0f\r\nMac = dc10e268f5f73bbc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 118\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 67d77f50727c7cd5b38e0b175a888c88687c97f2ccaa3daecc519116a7c5683c\r\nMsg = 02c5c55e7677c84a199d6e534772123c4e5c933622cfa8ef536e74cb3d745b717f53138aae9bfec54a1cb71ff04feb61d2f26aea65f37dae598f7b7fcebb978c\r\nMac = 885050ec166faef6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 119\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0091d39f3478d2c59bf874b96db9ce0f7e8b85a9b805e07dc96b219819d51663\r\nMsg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098482573c64ab24fe8007c697020353c411566bccb98b38c7784607045e61405b3\r\nMac = 96f639a86a2d698e\r\nResult = P\r\n\r\nCount = 120\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 0e6d99ee5137c8f6b9bb45a961be8a29358a91189cf9974f5bcf20d3b64c3b04\r\nMsg = 543ef4638f1322131402172d193bd304b34e3745ecedb9db16f35c0f5fa6\r\nMac = 33f10660\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 121\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 82421ddaaa5767a496f2b78f816cd1e1e6699f6e9e6576c34c909ba5f8dc06ba\r\nMsg = 4e2f0f91990b855a00d27fbb2e8db7184cd82909de361b52e7a75b16547d\r\nMac = 3f5ed151\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 122\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 134f20cb62084a98601f0e69d257fd2064beb47248caa79720a71d461ed07ce0\r\nMsg = c248fa87a6e48cdfafd1e5ac00f95fb1dfda861465747265796654dcff54\r\nMac = e7b21645\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 98505229c1927d13001b53850d0b7d56f49087afc6c2351190cc1b998e4d6883\r\nMsg = 9bee2e347f763c5c506876bb514b5ba1248abc6b3d17cd4c96537d4ea432\r\nMac = 2c212c7d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 124\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = cad710b48ea0bce4a897482a535aeeaeabebb42619578a9d1296927301b3bfa6\r\nMsg = c1db23e776272765a0fee49edcce28ff7702b9ff9b6e31a4c3ed0c497248\r\nMac = 7f27420d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 0bbf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c\r\nMsg = 7ff9ca86f820e4d57995d450611009ffaa726e6fbe4ce1558ca1e775daed\r\nMac = b2e5a268\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 126\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 6efabed650ce05ff22b67768e3bcc88c7746952106ecea92a38707af2b8a64a4\r\nMsg = 9cbce402511b890c8c9fa215b59c813b3e51b5dce01e776327f145623002\r\nMac = 03728e46\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 127\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = ca2843847a1c9539917206d344161dc40b379fd45dfa6a73ba6fa14defc40920\r\nMsg = d9365304c4363fba73feaa69d4cbb343a76eb2d29de6782ebb34d873006b\r\nMac = a94841ee\r\nResult = F (1 - Message changed)\r\n\r\nCount = 128\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = e5a1108da9cf587bcbdf051e216231bc27f0e6c1e97729b324d23768a89e0e77\r\nMsg = 536d4b6182a698d456e1fd9d522aab38cf05656f41a5e02cbd5e6f8cb85d\r\nMac = f52a4ba3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 008ee06bf9b19536190e87820af9cdddb40aac44b0c3b1e50074fc29fe5cdff2\r\nMsg = c1eb4c800c631d9f387d2e8e431677b7fc8f65235ad0cf9b118d2b0d67c8\r\nMac = ba255bd7\r\nResult = P\r\n\r\nCount = 130\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = ba0bfda3b03c736c121cf9a257db55060b621be5168619ec4182f13ef6a408c4\r\nMsg = 69be384eb107340d953753e6a860ea2710e662e8953de8eff8f465d086f3\r\nMac = 9f650d24\r\nResult = P\r\n\r\nCount = 131\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 7a88524accb59f1c6307a1719a011eff211df24645086c67710ef539f5d3f29a\r\nMsg = bebe346356681f27bc62f0b838a25268e3b04194b865bf83eef2c8928625\r\nMac = b2566e6a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 132\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 9c956d7bbe2028739d73a2f0a80af5f2f180de923d5571e65bee0b25b5dd890b\r\nMsg = e0d2ea49e3e4a5823efd1b229c705ec3bb5048a7658f10fba2671c5d2cf9\r\nMac = 480a14ab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 133\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 2090b970a71ce2cf399a0d9e1d3d72c4eb500004abcba1303b24bf9af16707cc\r\nMsg = 0e0ef2cd18533bee01f19870f2fb22176c7e04748db4dcb98f7a65cc9104\r\nMac = ddb6f30c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 134\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 66921951731e95bbd45c014af5cf623933350dd9a90d1a36465716f8239bf887\r\nMsg = 0de1e090eb47dd4fca966e5f8fa5616618701164370d8a43fae2eeaf3016\r\nMac = b91b3131\r\nResult = F (1 - Message cha",
-    "nged)\r\n\r\nCount = 135\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 43c1142877d9f450e12d7b6db47a85baca7eea7fde595393fb394c1f34369aa4\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d38108\r\nMac = b2de16cc\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 136\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = db4b6206d001af121051cec70195055fc1fd0dc06ccc74549bc440152aded5e7\r\nMsg = 94394feda0528fcc67124dd1d77f0ec0b911f08c3e01e0c0dbc40c1d57d2\r\nMac = 5f72de94\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 4d658be9cfcdb19f79abc78f4d7f986d02b43a03098b37c8ca56ebb331e62d51\r\nMsg = e28660f57b044a44a19ca40ff7b6469a41523e8d1cef22f4edaba58917ab\r\nMac = 11fa4d1e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 70b4cf3883fea8c6cd852a4293c7e5cb0586a6cd71294883b760cdbbfd07aeda\r\nMsg = 4cb9aa069475e54b25e5688a52dd4acd134169c858105f01a0a1b134c72d\r\nMac = b6b60815\r\nResult = F (1 - Message changed)\r\n\r\nCount = 139\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = f75bb63d52c35137448c58383afe47e026d536f67e3afdff87f29b10d3d6d9e0\r\nMsg = 4259e4fdf10acd8da40accd6354f4baef4859a2f5ebada0d2c5b1b26905f\r\nMac = 336ee1e8\r\nResult = P\r\n\r\nCount = 140\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = c938f6bcdeca02939fef931c969a25edcc3daf338d8286016e3c7ee78f9d52c7\r\nMsg = 47179ddaa9d7ef6b9a53c646325c80db69128c6fc4f92ccd345078383b9e\r\nMac = 5cbd65df0ca36898\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 141\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9540e4bdd8c7ab99f0b76dd9de24c340a60f7706f680448509d5dc35cb5930da\r\nMsg = 4715a9a66d10b2dc1869d90fcf9b7fa99e91b40abcb8fc356b5853c92024\r\nMac = dcbd4dae7cc60d46\r\nResult = P\r\n\r\nCount = 142\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = d5c396fc1ee960215e57cfeeea1e792fab9334f2c45dd93e74cc47023e6daa4c\r\nMsg = ce188965b4d347a6c36a6fa5a47296b32ff0fa27311266b16b1d56ebdda7\r\nMac = 1684fadaea17bc79\r\nResult = F (1 - Message changed)\r\n\r\nCount = 143\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 897193cbbccbead9957876b8b42a77b404aed32a3f63bb9ab5f08cfe4936f35a\r\nMsg = 87767f13bb4904d0df0d64eb22c9ddb65e81b5739baad86ad5e2c239ffde\r\nMac = 84ef6f59b770d42a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 144\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 86aa015253a7114e1770b6a48fdb3ef22e9d5abac25fdc145315c09f4e8b69bd\r\nMsg = 2595cb8d4d6aaa148596e8502ec80a030d82195f9e1d9a26ab0ec0101e67\r\nMac = 63e67c44ecc05dab\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 145\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = a082c12e97bddeb0c74c13aa4ba788f8a127c44fbac6682050271dbf7ad6cbc4\r\nMsg = 7fc97a698d7b0eed7d7602a5d13e956a538c71c4b45978a47439c05601ea\r\nMac = 3e1fe077fc7e903b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 146\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 18716638a2f6b4fb8dd2849fa9aab80b8dc846ee7e6b3cb0926101a814d8dd8f\r\nMsg = 6593194b9970545c5a910b2b4fcd46f0ddc7aa0bf873f0a339d5958d310c\r\nMac = c4556a75b754f6c9\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 147\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 6237aa30f1e3df239c96e7e50b69496da9305951024fb83a6fd01e96f6b2578c\r\nMsg = 0c5b7d1ba68654cd24871964f1b31ef7900dabc025baa02d37b55b35b4c4\r\nMac = 22c74fc64489ca5e\r\nResult = P\r\n\r\nCount = 148\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 32f60011bec76a79d2e837c611fad1cad486ee6f2aeeb74f1ea32a7e3899bdaa\r\nMsg = cf772bac3e767534b13efd381119b66f8a99b91aa52c8d3ab5f0a60073c9\r\nMac = 08d02ce41d4964b9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 149\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = cb6cee5ba7b799f16254a17b1870cdb85fe0ef3f42110c138742bd7734f0d504\r\nMsg = 40d3c65a00d9204b76e013975ffd729b351698105d47448da285a84de281\r\nMac = 4cc6718396dbe247\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 150\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9b8cdf91e848eeded2598ccdf084bf591ec2eb668236f555ca61a9d6b49959fd\r\nMsg = 7b3cc6f18a27047f4cdc35404e44eb8e51b1855d4bcd54ccafd1fcfaeef7\r\nMac = faf72c383b56a4ef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 151\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = e6fdbe9a1efe081bbcfeb25b844734fe60aa6b80a5b5f611982de1a331b88041\r\nMsg = 59a0f85349c3f378d56c509a0a45a1512b5072474b297f9c1a8c24890016\r\nMac = 020354f33df66723\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 152\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = da360852e8b8c3a1b65af9e8630ee5481aa91dce414166f8f3dacb75b142f12d\r\nMsg = 61d908e9663fb195afc259529fc229b14e87995f8d3591b125fcce816090\r\nMac = f8963157ef7c1ba3\r\nResult = P\r\n\r\nCount = 153\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = c9bf0e7e470d0ffc88593796c4cf9a61c6db81d343305ee06a0f0563bcc618c0\r\nMsg = 19378e17c41586b88523a6b6af738dc47e63ea64b4b83fa283f1e502add5\r\nMac = 550523c0347fbcf1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 154\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 7129ca274190400720bba27651f1ee0d5aa79116af9929418e198f9928a715b7\r\nMsg = 891e73a81d7574ce6f73e09e08cbaa0b9db242963f4469cdd2234512c061\r\nMac = 9982a14d261a4060\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 155\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = dfaa73c82a978548c99c0f1c34e1edc2c4edd42b73613511e4e6648ba364f9df\r\nMsg = 18044ac51ea97341061ae7d5bce017fd5cfb1554a384a75aa3919a74ba59\r\nMac = fd3a17e8c51a004f\r\nResult = P\r\n\r\nCount = 156\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 6f0be1905d1b5b607574ad93a1e7b4a536020fc6798acae862253916a0562707\r\nMsg = 8e502d5af4701025787e5b251121676182a0b26cdf52847f4d56d2ca0983\r\nMac = 73d76950066c77d0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 157\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = b9fe826b0138de8184a3002d8bb59d228862e4a14f8556f88282d8494d29068c\r\nMsg = c97ca1930b65064b70d12fc46af4d5e220e6009e729a28a13b0f9a11d3ca\r\nMac = b8bccd70bb90084f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 158\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 99c8f69fb91b17299461fd8d633bd516dcdb172760695ec476a5775377cdb7a4\r\nMsg = ef589e3b4ad9a7ba390574a2db5330baea64894f8f881cd67b842dd23393\r\nMac = 38e11613e67e0416\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 159\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = a86e8b43a1e81dce7b26420c0409628d145445d1c512e1c3df3270839475c668\r\nMsg = c71a0d1e20a7dc8e7adea91a408ecf3d512bcb15a6d8fc1435c6a7f915bd\r\nMac = 101c06c22819404a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 160\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = c5a850167a5bfdf56636ce9e56e2952855504e35cc4f5d24ee5e168853be82d8\r\nMsg = d4794f6f563d5f6445450b59c1ff95d24eadc9c02b68eaa5df64edf81475e5cba8d2bfab021a2fc8\r\nMac = bf99dc0b\r\nResult = P\r\n\r\nCount = 161\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 551e188cbb7c7d1ff33b4bd5bb6c60da184b18f44d68d5c30704df47d8be6fa2\r\nMsg = 2b421be47d07dcb12a0706f7490d05024fce8f433079e18ec78f4c8678f5f1551448c9a0fc70e8b9\r\nMac = 32aeb3d7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 162\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 000da8307f0e6112f0b8a8b1f927f62e8a9e5aefc0d37995088dd32e867148ac\r\nMsg = b89266f3a33e5b6883206e44f8e8e0cb01275039c304960e8630f0aa011c5c19d769443061a060d9\r\nMac = 1b5e30f0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 163\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = f4ae2113ce96435b27369fd4571ae2841a965c8ddbfe61023219eff9abd490e2\r\nMsg = 433ea4e1923267fe443e1e89d2472834b72ef97323ad6d82f3825ca9e1d06fbff8c232ed4c716ab4\r\nMac = 05b3c894\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = e7c78ef4c4b959ee00cb1a09d71221a43892ef8ad705edd27ed85d03a377907c\r\nMsg = 4da25d1e7064bc4b4903a77452952885a06ba0712544210d30c0182533182fcac90b71e9f71caf22\r\nMac = c15acf48\r\nResult = F (1 - Message changed)\r\n\r\nCount = 165\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 6f48b3bf240525adcb02985900fa29747e4b1265e5a8899abb0ee51cb0f90367\r\nMsg = 98bf67b6e342dd94c948e76aabb69e7d091d24fba54ae233e4181404768988963915a2495b42a4eb\r\nMac = 71bb5873\r\nResult = F (1 - Message changed)\r\n\r\nCount = 166\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = cb6cee5ba7b799f16254a17b1870cdb85fe0ef3f42110c138742bd7734f0d504\r\nMsg = 40d3c65a00d9204b76e013975ffd729b351698105d47448da285a84de281bc3307cfd80b39488213\r\nMac = 592e54d4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 167\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = bbab624862e268765e9e6a13df55cf7a2267520e4e66042ba0b4905dc554c3d0\r\nMsg = d43b841f174335f1347834590b0984a2cb35f7a00a0ee993157d2d4f8487489a12ceddd6ac5b69e0\r\nMac = 3480805a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 168\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 2fc9e8f409cc6c0156ccf9f00686ac7abba6cbe08982a737fa08c7035",
-    "6f54208\r\nMsg = c1cd63e24e41f69a146b448cee0a2107817c8105732745aed817541eede8ee6809e73ddbd0742d84\r\nMac = 91623558\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 169\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = c49dc812061fa4995aa7c160ed7cdf769dd1ef570d8fc9c7f8552101c5bdb711\r\nMsg = 74ec6f53d188be3bdb647f37619fa5848076c66d21bac164c381a4517b1dcd2a384a4fc44cab97e9\r\nMac = 07471b07\r\nResult = P\r\n\r\nCount = 170\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 84b6cd1c6618c42ba74e746075dc28700333578131ca6fde6971d2f0c6e31e6a\r\nMsg = dc79743d2360cc52cee202b9bde9abc7c09d9d0311d89c3722da36c7993feb42992e913744d2f74a\r\nMac = 3acba1e8\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 171\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = dd472b0bf50519020a182f122239d161d9659773b4df454eb378fedc250eb490\r\nMsg = bdf56403d5ff8df4ffca92eb40d54a79b5595abcd67b9e2ffcc5cbc621d7523be75a87a2dc360244\r\nMac = 3bb0894f\r\nResult = P\r\n\r\nCount = 172\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 00ebd245e8c0e0b60847da5c8f7a1f33604932b9cd47a845a1a44599645b62ba\r\nMsg = a238e542f1c22621aebbe331e71123ed7f2591e4192180ae378c2c24a31c42d10fcba3a3f82c65e6\r\nMac = 1d17d6ab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 173\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 2ecddb226ae668315eecf107c344926330b94077e029ac3bb67e6a077ee05361\r\nMsg = 38ee97f0dc635c7416a024e3af5c95dd1d496db8a5a5c3bcc20b9093ca906dfbcf0b9ebec3b450e4\r\nMac = 08834104\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 174\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 0a2978b5f20d3b5e5ed7ed5a78a093a51d5aa6e728077346f429c27f1c79b635\r\nMsg = 28313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b08\r\nMac = b2635d7b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 175\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 7f2286d42b4f9eefed1087f3eb3dc814145be4a110c0e74176f83e7d4068cb7e\r\nMsg = 6c1aa088d1a6086d0e72636744a6840c80ab8223409c61b733f7ef6a4199ed0ccbe96f6c3453866e\r\nMac = 10bf9789\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 176\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = bb0fabffbcc6935ca35755fd4bfbd192b6812cf75c4dc95bc3a175a1501be206\r\nMsg = 9801da81a6d9861f26900401aeaec89a74e3d5aec0a5d612a11b6bb4e03ac1db322e65afb1fb5afb\r\nMac = 9ad23631\r\nResult = P\r\n\r\nCount = 177\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = ed1d11cc4876f58feefc463b52d8d36e69c4c2c9227b32fe356d1e2a1bb88466\r\nMsg = b16e6c44f429efdc06a892cede56296e12bf185d4b3c6953f7d31b1c3d59bce136d93aa95a3af61f\r\nMac = 29b26a75\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 178\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = a6fd8382447181bd300ec1ef039d3f353446d01fde490509c3ef52a992bf6fe4\r\nMsg = d41f8fbb6f968dda0c1b2cadbec04a6c72124eb5dc40b8d2b180fd3b17af915b5a374597e036d38d\r\nMac = 2b343893\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 179\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = df0821c9ea6ab329c626d11b4bc1ba7351ca934ece6aae483e3d0bef48601f78\r\nMsg = 84b9c150a1df00ba29386197d79d29a2ceb42fe6390c9e763169f75fe15c55dbe817f5c7fe80f557\r\nMac = 3a5026ef\r\nResult = F (1 - Message changed)\r\n\r\nCount = 180\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 0f1b73e54f4571b2d42aa5ab673f3e99b44f6c37a07a5d4edc7d6b1fba349401\r\nMsg = 3918467effb5d5dc009aaefce84d8cb4fe8f80eb608f4c678f5d0de02ea11e59078d38b04f10de73\r\nMac = 1c207499e0877bb2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 181\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 25a152850b4b80b19d8f0b504b2a8a241824b3a1fca8d85c8713b2c0c84b5e02\r\nMsg = b06f6b3f197bae7d8cde9daf38530e25bc51b68f9aa23ec0e95199b14bca96c91f3db15bf8432f71\r\nMac = b860013252ae83a4\r\nResult = P\r\n\r\nCount = 182\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 849d861aa5a37c6389f7bc2fc3b4860fac9d2277fa5e1a1f9415a6aaa5106886\r\nMsg = 191b53e0c7d90161e5e2014e9b8aea315b4bddf5750aba4be69c944d71896361f210f961ee6b38f9\r\nMac = c9dc7e167c2e442b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 29dd1ee0ffa12de3a1f2cb8e4e24d2e548794a5e7e372f946bfd733f3c564764\r\nMsg = 891c806e0700f6df72befe47ff088d917cc30763866810a2fcaa9f38b45953156c860b7303e8b15f\r\nMac = 2f7355b3994f45d9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 184\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6cd7349d96feffbcf6e95a96eacbbe8ddab702ef70052b7804f78518589df3f7\r\nMsg = bbe054fbef86db3ce7ad796e6d0add15455b9cff57fb787610b4e1ba05d5bcaed98564d16157ee70\r\nMac = 8a421387c53702d3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 185\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = a32e186c29f6f1852b483a37b50c02defeb2ce81488198bc082c17fd47a741f4\r\nMsg = e687143dc4d98dcc6a2dfe6ee0f85d565d1f46bb0fafe62a17d01720d6f4ccd86754b0626c9d0af5\r\nMac = d44d78445c5ed8de\r\nResult = F (1 - Message changed)\r\n\r\nCount = 186\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 338f8054d58c26c49360c3e87af56523acf6d89d03e56ff2f868002bc3e431ed\r\nMsg = d42b10d3a688c39edf543ae7330466eeb9e3b678ef073967ff83038d40ded1c200c4f03481fc5aff\r\nMac = b25bf6993f18d503\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 187\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 96e04382027fffcaf779c984be80da16f8437db0e39a7123d9048ff71954acb7\r\nMsg = 494c8f931029a4919e2dcbc16512a8bfe275382e7d29c9abb1d14a006caec59ab9b52a3e9ce54ef7\r\nMac = 5a94a03591ee9cc7\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 682f8bc1eafd4d369df384841a88db7b7fb96c9dd9abd6dedc9290a8d8d17d22\r\nMsg = 87b937b1d36e8a9ab33a1d3eed617030923acaabc7e620dfcb3c388936030fc67f647729c19e040b\r\nMac = 89347722a73d8bf9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 189\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 954222a9cabaa5a0a91100b158a3aeb655c4473d0b00afe6a7a78e0d278a01a9\r\nMsg = b9197eb50c8168d16b8a12bd261d553ffcc521d979b26fee820376252e452213d736c21471cf0179\r\nMac = e5d175fa24cf0fd6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 190\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 18349be2894d49290339b97f4db28c92b3e112ffac77100abbf9c093935b1a46\r\nMsg = 4b02fd5a46ac681a42424ac9723911af4e389ac73829f36f60916563e51cb2ec3d7d9b55d674a59f\r\nMac = 18c98fd13595f857\r\nResult = P\r\n\r\nCount = 191\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = f1f9fdfa9ae3ba8bc6fcdb2e15ae2c47e6292c2acb091fe03e325f298ffff3bd\r\nMsg = 75965cfbf66b0ba13274fce6537fd7aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837fa06f\r\nMac = 935e4d4367aef07e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 192\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 4652bacedb47faee1be641ebf433157f416b4c7d9e8c7c6f7b17b47e70156993\r\nMsg = 17e6acda3c05c9549eadad55d8918f4870aec63a18802fa33175cf838fa2b9b17cb43270ff2a1444\r\nMac = 7ce4adc343a4498a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 193\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 200e4929c275557d9caab0ba3b0a153dd8010ff8f11ebc1f336dd0249d01dce6\r\nMsg = bd05d26ebfcb5f6e102e79976fbd038e02da6a64a6be90bb84bd092be5cb8ae447409e94afd89b8b\r\nMac = 5484fd10e83798c2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 194\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 8c6a6e77534976b4d74a0972742989dbc0f753281a5ff10a862e9048b813b4a9\r\nMsg = 869c482db2b0825cd09d295749359b99fde85240e5ddaebef642f4d249e096b77af2b59b4e37e452\r\nMac = 9e640a86d55be78d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 195\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = be3db75687360fc31c27752a5f32125cf04f8bbab694339ebcb57ff63fc7ba32\r\nMsg = 33dfb223c009001a7b3b81916bb094390c42c24a47884fc8a0410f05b2f57b67d8d9046b2ef4a8ea\r\nMac = c7666f25d2329fb6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 196\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 29e7acc4facc2618f242ec9260a8ec36c4c9dabb89bb8092f00855234b0c505a\r\nMsg = 09bf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c8b80393302ca8803\r\nMac = 424535e20d082087\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 197\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 23f0d00daef3177fbcda6e9953a5a37d5da395204d8af5fb05c74e03f71343da\r\nMsg = 2222135e545f2af53be42d7a463719447e0a6a305fbe8e43e6279a91eb8f3c5db1fdf081bcb77711\r\nMac = 52c42541e2e93f3e\r\nResult = P\r\n\r\nCount = 198\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6746d9a90e0e763679d5469a1bcffcc4f18f35f50c7714d14c7329b76ce7984e\r\nMsg = 68530f15423071410a349872c559669301096c827333adc4df9da477387c89870942d12513b7f475\r\nMac = 2bf36912e1139629\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 199\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6b1d94bc0c6e45fc905c509ea667853e4b2c5a8848dd914efcef14d95b12247d\r\nMsg = 207b649c46c1963723624d8428d4b64c08cd4091cc055175223d3758f880614149a9cf7f3725c790\r\nMac = 34f46b361bddf55c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 200\r\nKlen =",
-    " 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 5c77fe134af3fef72fcd16006097dc7dbc45ca10339ae3bc85e0993e4cdcefa1\r\nMsg = fab52c44379ae8083bdc7b827383df93cb1a7ecc21574730f9fe003b7302de237bed535d40832763e7a2cab5806de91d39aa3f38d167ae3250e48ed1f6ad45b5\r\nMac = 03f36c5a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 201\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 997c6b4b513bbdeaf701867bbe81bdee63de0d0d18c870bcc1e9ff7f627f093e\r\nMsg = 4c23d92665e88a4f6f732de384034d493d5df37b767a8260557de05688e8d60dcd0eba9cb8cc4bceb174dcbd3c0ab5a37db3b6ecfb6a3d90a4f54a9f1117e11e\r\nMac = 9e798c73\r\nResult = F (1 - Message changed)\r\n\r\nCount = 202\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 64e390edd97c0af1ba5165900828e0630606f83d4df5240e1b05c307ee9153ff\r\nMsg = 1ae71094fc1b304adfa3378c4efa8fb290526bb314714c9613beca2a709c91f7e3f6aa74561bfc7b8fcd12f910941eea3b593e85ba2fffb31e7420c6c6199868\r\nMac = 1977347f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 203\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 44e2f6d41e04b75f541e724c6f6325f27d7475b3676fa0247f28b36e58b6fdf5\r\nMsg = b9ac624288352617e4d375f33953b431cbf8f03f9ecbda9893330ff2d3c59db8705dc3ba4a6ef924309630ac48765b10b1c02ec0669126d76602c95012fa2f77\r\nMac = 2cba4713\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 204\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 8e0f75b7029d4afc2a86adb4a088b89ef9783965027c1176497ada0fdfd0cd99\r\nMsg = 21cd3ff946e2b3c1c61932205899502852b1333d1c79a3d4e5b6617996ffba17041e5b746ab967fb1632c7be62cbc2bbe60ecd5eec6ca4482424994f9a662cc6\r\nMac = b651d356\r\nResult = P\r\n\r\nCount = 205\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 35b1106d174acce103ecf5801b03d3c10d579c4ee491ebad25fb6f1f1787e0c8\r\nMsg = 960026395d0544975dffaaa2c56db1df5816cd80cde513dc76f6f81d21f15c383c97c7233c9af2423fb28922efed2f69aa47c30de17ae1c5be17acbd0ad6cb8e\r\nMac = 8a8f65a8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 206\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 71efa75961dfd60ad533082a8cfe111214eb02573adc4591c5d0e961640a3ab2\r\nMsg = 6bafbd22b75e21e1fa5444af283e69d53ac2f0412f717a2153f74eb1c195fc5127d240dbc96d2833c9957920a55c505a016a05e4a7ee549bccdbbf1095502e93\r\nMac = 88fea081\r\nResult = F (1 - Message changed)\r\n\r\nCount = 207\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 11752eb8aeffa364c9947092c1612461cc19b6c3a3ddd1817b5e6f7f3745a942\r\nMsg = 2d9109e7eea21b2615c81c03182ce6033c93783b13d698624392bd2a8a202bd0ffc860f29b31afa2f71c2bb85752c66ce8dbba244671288a4135ffe2e1a0209b\r\nMac = b5a26c1c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 208\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 279a6c226f6a48f3128626012baaa309d99065a59dc0a4c003a6e94d85e61638\r\nMsg = 9bff96ba07a52d9ea2415283321395cf57cb37c610fad7a482c74de9f5e3d7f520bf73d4a6fc8b5be023d774dd9680b6a7c68139c8a753a80d61c9978a493917\r\nMac = 5e281941\r\nResult = P\r\n\r\nCount = 209\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 0bcdcaa87ddf8bbe6db8411d14bb9064e4a121286cc8a6e97fce1844935f436b\r\nMsg = 3ec0aa8d30d5ed825b77dc7095f421b1e608158797a377ff8bed641bd387832f7c14818cabf9bd5ced6044cdc883ff7296272be693660ab234b2d870ba170131\r\nMac = 1da79d07\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 210\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 1b41d148e3c202d419ce16385139da196dede5be63987e6940a2bae86d62e567\r\nMsg = 13ecd70e2d76dd53a19b2e5fc0afe0c0793577ba8948b7d4ef3ab797a07a37927dbb33a18252b96f40e0f73a8d3298d67a6551f5854eb6a51019531a122ff8ae\r\nMac = 91bd49b2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 211\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = a1ccc9c992c8a307ad39504854456696f8eafd7c8da0c0c53b3a4485570e985e\r\nMsg = f68b0c3b4556c7f8866b3fa873ed2014418d6421d3f224512e5dae8c2d8dd92175e09508acbcc66ae62d536260cf790671ef66a1bded0343ace4117c1b8d7764\r\nMac = b9317feb\r\nResult = P\r\n\r\nCount = 212\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 4d8d0264ae6d8f7a7440dd760e0ded25a3a94cb0491fe81e7b55221ac8ed24f7\r\nMsg = 5faaf6b8ee8ed5b56bfc1a7f886f9f91a6566ceb99c39462ab675a3ae3be98f68787626fdf77e6243c2e96d1396a8a43417b1f6a51f7e5b0ffaeb889bce02c4b\r\nMac = 3f610010\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 213\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = bcf95051ae2ae84ac32a763d5477ccc4659a9ed3e25de5932939826dc90e2464\r\nMsg = fce924dd27db3e07837694c34f576c16084e5b0a254ca3af0582bf6026c73b47973ac924b02992490032cae987a887932539d3fa53cdfff711b03bd11ff464bb\r\nMac = 7b7e89ef\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 214\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 45ce953ad31ee9b53a9c948883bc86f4bbe0f0744085a9943cbad1066cd7b4f3\r\nMsg = edb1aaa7e8ac37bca99ff8eff5516464aa33fc2bebef8a727d43abf971108bc604aef019c3837aa2f3d429f22fda1f305319a70d99ed77f902663298f855316f\r\nMac = cbf4addd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 215\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = d60841cd71d7227ab56e767817760edba9ce2290f8da504b341ee2c1910b5018\r\nMsg = 365fea641559759d1e5b5581218486318b1c776de812b1aca6a9ba6b1c6e39c5cb6d5a44e3a474f709b8eac457e74f00a43ecd3d060cc7639696bd03730c70e7\r\nMac = 7406f935\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 216\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = d172f991eb697ffdefc57349dadbe51066d2744c39041cd55ca75024eead495d\r\nMsg = 6a91da64812b9bb41a026e727b4f77c384813da2948caed5a9846420c86a26b89f46b2fa6975b95d12452ca69bbfb65bc1c48a79d95c5e69ff4ab7316fe468e8\r\nMac = 6bd82bcc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 217\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 3725c7905bfaca415908c617b78f8deeeff286e0c2bba268d0de92c7664238a7\r\nMsg = fc4bbe329a86089ebe2a2f3320dad55a9bdac1133dd28ddc9ace9ed665885a2341ea9492d4cf4b7e1d0a95f308a9d613407b35b845cf515bbe7f2f35102d78a3\r\nMac = c8e11823\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 218\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = bb3087d1b5b0f6f14a532c3604c82874fb15e97a4b3883dfc50e71ffe5752d40\r\nMsg = 979a9f96112d1ea95eec2cdfdf48c55114472360aa7de24bb53761013af96b33f02b17ae470fece8aaf649d801b4040b7b5152f58a01e7852f565efc77b5dafe\r\nMac = 66466425\r\nResult = P\r\n\r\nCount = 219\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = eeb983439a03ee6a315ebf941e9368f90bb6845b03b31839d72a1946c17d2f19\r\nMsg = 6d5573c9279897d7d1602d8a95c04bb5ca3fad2dbe89a024b3651eb227e73bb559e7c0db08b215fd7efe64afcd24fb155989f2f8965d0e181389e6c4b8e244a9\r\nMac = 7f77d596\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 220\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6f0353a0ad95df6d3190a251435f62c30ed6b9cc0dd024c3c316565cad83d2e1\r\nMsg = 83011a83db0524628b55589ba0165523ce7c916465eaf185805b97ec7f00fc01b82a3e356a6bbb44f2f8deb6425239ac8e26d4d94871c5cf4fe7017c649672f4\r\nMac = 9e56e4574dd01fe8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 221\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 777a22c5fa2f864a9233587e3e9634172ce25006daacbba97b68e7429c8266a8\r\nMsg = 1f7d58d65c36142620172fda3197d3c629bc7bc584e1aaa0f8b6dd320588becaccc39ad124b515adeb941de49ac31c851c5172c4e1c322e42e13cb5ab7f8db2f\r\nMac = 498dafe2807ba34e\r\nResult = P\r\n\r\nCount = 222\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = e17736560b1a13aa8e536500ea6cdb9a6757309aadf25a6a9189055a309c3f8b\r\nMsg = 1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9\r\nMac = 52d3fbc6e5821f1d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 223\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f31f2fb4b3fd8045b70d34b600a2697cbf7503be0d8cfb5cdc60f9312e3e2695\r\nMsg = 4f43702be4f0530319555d7f1a3356160f6cae48051f12e22a153d7e405c11494c31e6098e24225eb676094755c6d7e992ec0c8c1e2608e76a72d79d173a4e07\r\nMac = 71239a4c38fa04b3\r\nResult = F (1 - Message changed)\r\n\r\nCount = 224\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 10a678f591b4d87280f42d77a91635575e2e82ef610a7c9105c3a9418f932c24\r\nMsg = f7b577f1396b23c27eb637e53d3d92460270b001cc612fd3b4d68bcdd09c2d50571ea4350636324cc2428a087e7bd8785f8202791e3c2d2bafe084a1204e34dd\r\nMac = 5b11c1407904c15e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 225\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b8728441226558fa9764824597fe254bf8c2623789541feaf6c007efeb0dd2b1\r\nMsg = 80a2be15809f12738f305be3a210ba0c933599c4b24b48257c60e8e3aae189dc6ec58ff1f9085a15405b26a3001a2ff5ff7e1932961490676c6d2cda8417979b\r\nMac = e73ed6c4f81b0ecd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22a877d974cdf4d65bbd77958b2b77fc5ddb33a221aca3ecb6d5ae76596f9db4\r\nMsg = ce2ce41f76ca7477972d38a3e8fad1122db34ee80c379fa01f884cf648d1670445a8bfab8490563438c21537ac2dbfbcd7bb24a132d6973cc62ba14089adf7e5\r\nMac = 0ff91813a56b98dd\r\nResult = F (1 - Message",
-    " changed)\r\n\r\nCount = 227\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 03fa02c4df99b8295f502e3145e2edd3ff16722b87092e708bc8d126cc1ec894\r\nMsg = ec9a9babb68e09c38617c9b16e8a2d92e711030bcda4b9e0ab35c4c2392b41692312dde30c91f32cd39cf5fe15ea0deaf3aa04a8157262acee78d7f94204d93a\r\nMac = e50d9a04f79cf9b4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 228\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0e12df1bf17e9645c5507bc2069ca4611dc0488c9996231dbcee1c73393b26c4\r\nMsg = 86814ce4a867f80ce9b618c6aecce37c89851508bbb095c8f7c055f569c47a30f79abe5ec75f12b601298718d6f96ea1c1ebbe7c0cb0b7fb973ec5e6d5c6a713\r\nMac = 05338bce9ed8f495\r\nResult = P\r\n\r\nCount = 229\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 51c88fd98a7d82043a1500fc3d8a66ba7ab7760467c7fd89cfeeb22dd25762a2\r\nMsg = 0e403cff47adee3ec5bb6b178dabfc7d53b60a04eaad33a2fedd9db705358a4c73ab2d982ddbbdc941f1c701d4cac89e5c56fbbe0f4170029ad25e931713ba63\r\nMac = 38c34175627b07e8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 230\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0feb23c7e4a19bcbd70bd300d76ec9045d696f8c9687f49ec4154400e231d2f0\r\nMsg = 0330ed97e44e8b15a49f29c72a7997d05d398a9d45dae41a6cc635258beb824362124691e86cb7fea46e4ab85bdf79e4eb30c492770bf6f0c42ea9bde37a0c01\r\nMac = 271a7c2e687d84c5\r\nResult = P\r\n\r\nCount = 231\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5d649799771f9074d18a2477ccd4d9e136e01451c1eb2e8bb370cb79e0486770\r\nMsg = d715bc0520dbb86543e76fede49dc6be2cce59d3c0db133ff31efcb63a85514fe080da88fa1e788b9e73feb0503c4142bdc67386ac0bacf9311ecada23ca7be8\r\nMac = 42de9f52567b4506\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 4c96d520d8d5a54eb73f8f558e328d1b3e5ba360161fb8444739a40a97a58a1b\r\nMsg = ee409b050346fbd319c8630e4bc9dd6d055355fbb961f018d3fda0c1eea6f61248f43709737fb18d4efc4faf34a96c2f73ece54200367292692e36870a0c94c5\r\nMac = 28610f524d88e727\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 233\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b186b9273d8cd77d68c05ec5389b2f6e2f267fe6cd6e7cb35a3233c0dfe0b1f4\r\nMsg = 0df3fc6396f851785fca9aa5ffb0cd98bdecf8bbae4c82641efcb34d319e7643ca9c5e22acbde800e0f700a95685c64ccf399173f9123438dc1181b676490cbf\r\nMac = 8d2f69b44614485a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 234\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 1b1374648d93aadb186326e4ca2b82fd37f7234712816fe4feb339a3a16880df\r\nMsg = 9a661677f1e07153e1c9c661c91901757f5b4d9938031f01a802773d6a9863b2a169c44be0d4546c4780e828ef37f3b389f84c1a41473131e9c88bcd530c7334\r\nMac = 72838b59593c011c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 235\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f70b8a4eee3518bba071af55f25f7b698a5b7dc8865cdaca6d1c7993657acc95\r\nMsg = 795ee1af7504621aac329f5081912de545fa11174f3979b14f11aa30df813a235b467fd8f3a14734fe5ac9e39105dcb25184673885cd19bc70ee5a53dd4e8149\r\nMac = 93542734d6cd43de\r\nResult = P\r\n\r\nCount = 236\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0c456d199abae4758734f506c4e9ccdb767e4fd156d5a4085726f3938a516d74\r\nMsg = 78f3bf568f1c3f2866eff8a246a70cf0faee4c3078f3fb27c4bdd53312bf50812bac2280118c0396e610b4110a22406084c18283a30ce7c0e49c769817170df9\r\nMac = c4c5be3c94fb7b9c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0a8725bd8c8eab9ed52ca47835837b9f00a6c8d834ab17105b01eb4eb30402e7\r\nMsg = d7867ff428c37836161a534d1d697fba43e86b0096c49b63d50afaf06ec772bda86eba7222796f087c5367d1547642b974d041cb496c5cf7984e8e126c9f741e\r\nMac = b5d40f8633965c33\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 238\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = ce9ea80e7fb235486b5f1d0321c68a0e44cd5f15e21f27c402754a2f7c138772\r\nMsg = c246453f5d0f4957e6418b4d17b748f5c30e7ee672b4af2e4e41e145400be94056f4e94768871849fb44c1ee65378fce32d007e0c7ee5635453d4de6b0c2aa4b\r\nMac = 33ae4c66895989ee\r\nResult = F (1 - Message changed)\r\n\r\nCount = 239\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f26fad377bf7d6b35d8ea2e0621b678dad85826fadd3ee684d9215086b77e555\r\nMsg = 63539f949990883ac4f3ef9158b382a30254023c301de9fcd3cd4faa638a0ecb241a2573a9555a5c96da2435aa02c73cfc12c10f84b565bfdea9c6274bb8d67c\r\nMac = 8cda222f03f92913\r\nResult = F (2 - Key or Key2 changed)\r\n",
-};
-static const size_t kLen36 = 58307;
-
-static const char *kData36[] = {
     "# Tests from NIST CAVP SP 800-56A ECCCDH Primitive Test Vectors.\n# http://csrc.nist.gov/groups/STM/cavp/documents/components/ecccdhtestvectors.zip\n#\n# P-521 test vectors were fixed to have the right length.\n\nCurve = P-224\nPrivate = 8346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbd\nX = 8de2e26adf72c582d6568ef638c4fd59b18da171bdf501f1d929e048\nY = 4a68a1c2b0fb22930d120555c1ece50ea98dea8407f71be36efac0de\nPeerX = af33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280\nPeerY = 882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7\nZ = 7d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8\n\nCurve = P-224\nPrivate = 043cb216f4b72cdf7629d63720a54aee0c99eb32d74477dac0c2f73d\nX = 2f90f5c8eac9c7decdbb97b6c2f715ab725e4fe40fe6d746efbf4e1b\nY = 66897351454f927a309b269c5a6d31338be4c19a5acfc32cf656f45c\nPeerX = 13bfcd4f8e9442393cab8fb46b9f0566c226b22b37076976f0617a46\nPeerY = eeb2427529b288c63c2f8963c1e473df2fca6caa90d52e2f8db56dd4\nZ = ee93ce06b89ff72009e858c68eb708e7bc79ee0300f73bed69bbca09\n\nCurve = P-224\nPrivate = 5ad0dd6dbabb4f3c2ea5fe32e561b2ca55081486df2c7c15c9622b08\nX = 005bca45d793e7fe99a843704ed838315ab14a5f6277507e9bc37531\nY = 43e9d421e1486ae5893bfd23c210e5c140d7c6b1ada59d842c9a98de\nPeerX = 756dd806b9d9c34d899691ecb45b771af468ec004486a0fdd283411e\nPeerY = 4d02c2ca617bb2c5d9613f25dd72413d229fd2901513aa29504eeefb\nZ = 3fcc01e34d4449da2a974b23fc36f9566754259d39149790cfa1ebd3\n\nCurve = P-224\nPrivate = 0aa6ff55a5d820efcb4e7d10b845ea3c9f9bc5dff86106db85318e22\nX = 2f96754131e0968198aa78fbe8c201dc5f3581c792de487340d32448\nY = 61e8a5cd79615203b6d89e9496f9e236fe3b6be8731e743d615519c6\nPeerX = 0f537bf1c1122c55656d25e8aa8417e0b44b1526ae0523144f9921c4\nPeerY = f79b26d30e491a773696cc2c79b4f0596bc5b9eebaf394d162fb8684\nZ = 49129628b23afcef48139a3f6f59ff5e9811aa746aa4ff33c24bb940\n\nCurve = P-224\nPrivate = efe6e6e25affaf54c98d002abbc6328da159405a1b752e32dc23950a\nX = 355e962920bde043695f6bffb4b355c63da6f5de665ed46f2ec817e2\nY = 748e095368f62e1d364edd461719793b404adbdaacbcadd88922ff37\nPeerX = 2b3631d2b06179b3174a100f7f57131eeea8947be0786c3dc64b2239\nPeerY = 83de29ae3dad31adc0236c6de7f14561ca2ea083c5270c78a2e6cbc0\nZ = fcdc69a40501d308a6839653a8f04309ec00233949522902ffa5eac6\n\nCurve = P-224\nPrivate = 61cb2932524001e5e9eeed6df7d9c8935ee3322029edd7aa8acbfd51\nX = d50e4adabfd989d7dbc7cf4052546cc7c447a97630436997ad4b9536\nY = 5bea503473c5eaef9552d42c40b1f2f7ca292733b255b9bbe1b12337\nPeerX = 4511403de29059f69a475c5a6a5f6cabed5d9f014436a8cb70a02338\nPeerY = 7d2d1b62aa046df9340f9c37a087a06b32cf7f08a223f992812a828b\nZ = 827e9025cb62e0e837c596063f3b9b5a0f7afd8d8783200086d61ec1\n\nCurve = P-224\nPrivate = 8c7ace347171f92def98d845475fc82e1d1496da81ee58f505b985fa\nX = b1a8dcac89aca2799320b451df1c7ff4d97567abb68141c0d95fc2aa\nY = 3524950902b1510bdc987d860afc27ad871ceaea66935abd3c0a99a8\nPeerX = 314a0b26dd31c248845d7cc17b61cad4608259bed85a58d1f1ffd378\nPeerY = 66e4b350352e119eecada382907f3619fd748ea73ae4899dfd496302\nZ = 335ba51228d94acbed851ca7821c801d5cb1c7975d7aa90a7159f8fa\n\nCurve = P-224\nPrivate = 382feb9b9ba10f189d99e71a89cdfe44cb554cec13a212840977fb68\nX = abb6f1e3773ff8fc73aea2a0b107809ce70adcefed6e41fc5cb43045\nY = a963897ae906c10a055eeadb97ffdd6f748d3e5621e5fff304e48ba7\nPeerX = abe6843beec2fd9e5fb64730d0be4d165438ce922ed75dd80b4603e5\nPeerY = 6afe8673a96c4ba9900ad85995e631e436c6cc88a2c2b47b7c4886b8\nZ = 8c2e627594206b34f7356d3426eb3d79f518ef843fbe94014cceace3\n\nCurve = P-224\nPrivate = e0d62035101ef487c485c60fb4500eebe6a32ec64dbe97dbe0232c46\nX = 88537735e9b23e3e0e076f135a82d33f9bffb465f3abce8322a62a62\nY = b4c8c123673197875c0bd14ed097606d330fba2b9200ef65a44764d3\nPeerX = 13cf9d6d2c9aae8274c27d446afd0c888ffdd52ae299a35984d4f527\nPeerY = dcbee75b515751f8ee2ae355e8afd5de21c62a939a6507b538cbc4af\nZ = 632abb662728dbc994508873d5c527ca5ef923c0d31fa6c47ef4c825\n\nCurve = P-224\nPrivate = b96ade5b73ba72aa8b6e4d74d7bf9c58e962ff78eb542287c7b44ba2\nX = 37682926a54f70a4c1748f54d50d5b00138a055f924f2c65e5b0bbe4\nY = 596afefcdd640d29635015b89bdddd1f8c2723686d332e7a06ca8799\nPeerX = 965b637c0dfbc0cf954035686d70f7ec30929e664e521dbaa2280659\nPeerY = 82a58ff61bc90019bbcbb5875d3863db0bc2a1fa34b0ad4de1a83f99\nZ = 34641141aab05ef58bd376d609345901fb8f63477c6be9097f037f1f\n\nCurve = P-224\nPrivate = a40d7e12049c71e6522c7ff2384224061c3a457058b310557655b854\nX = 399801243bfe0c2da9b0a53c8ca57f2eee87aaa94a8e4d5e029f42ca\nY = aa49e6d4b47cee7a5c4ab71d5a67da84e0b9b425ce3e70da68c889e7\nPeerX = 73cc645372ca2e71637cda943d8148f3382ab6dd0f2e1a49da94e134\nPeerY = df5c355c23e6e232ebc3bee2ab1873ee0d83e3382f8e6fe613f6343c\nZ = 4f74ac8507501a32bfc5a78d8271c200e835966e187e8d00011a8c75\n\nCurve = P-224\nPrivate = ad2519bc724d484e02a69f05149bb047714bf0f5986fac2e222cd946\nX = df9c1e0ef15e53b9f626e2be1cbe893639c06f3e0439ee95d7d4b1e3\nY = 7a52a7386adda243efdf8941085c84e31239cab92b8017336748965e\nPeerX = 546578216250354e449e21546dd11cd1c5174236739acad9ce0f4512\nPeerY = d2a22fcd66d1abedc767668327c5cb9c599043276239cf3c8516af24\nZ = ad09c9ae4d2324ea81bb555b200d3c003e22a6870ee03b52df49e4de\n\nCurve = P-224\nPrivate = 3d312a9b9d8ed09140900bbac1e095527ebc9e3c6493bcf3666e3a29\nX = b4a0198dc8810e884425b750928b0c960c31f7a99663400b01a179df\nY = 812b601bfc0738242c6f86f830f27acd632ca618a0b5280c9d5769f7\nPeerX = 1d46b1dc3a28123cb51346e67baec56404868678faf7d0e8b2afa22a\nPeerY = 0ec9e65ec97e218373e7fc115c2274d5b829a60d93f71e01d58136c3\nZ = ef029c28c68064b8abd2965a38c404fb5e944ace57e8638daba9d3cd\n\nCurve = P-224\nPrivate = 8ce0822dc24c153995755ac350737ef506641c7d752b4f9300c612ed\nX = 00dfc7ec137690cd6d12fdb2fd0b8c5314582108769c2b722ffb3958\nY = 5eef3da4ba458127346bb64023868bddb7558a2ecfc813645f4ce9fe\nPeerX = 266d038cc7a4fe21f6c976318e827b82bb5b8f7443a55298136506e0\nPeerY = df123d98a7a20bbdf3943df2e3563422f8c0cf74d53aaabdd7c973ba\nZ = f83c16661dfcbad021cc3b5a5af51d9a18db4653866b3ff90787ce3e\n\nCurve = P-224\nPrivate = 0ff9b485325ab77f29e7bc379fed74bfac859482da0dee7528c19db2\nX = 7e603e6976db83c36011508fa695d1b515249e2e54b48fcbcfb90247\nY = 0179a600ce86adfca9b1b931fa5173d618da09e841803d19b0264286\nPeerX = eb0a09f7a1c236a61f595809ec5670efd92e4598d5e613e092cdfdca\nPeerY = 50787ae2f2f15b88bc10f7b5f0aee1418373f16153aebd1fba54288d\nZ = f51258c63f232e55a66aa25ebd597b2018d1052c02eeb63866758005\n\nCurve = P-224\nPrivate = 19cf5ff6306467f28b9fe0675a43c0582552c8c12e59ce7c38f292b1\nX = fc20e906e609c112cfc2e0fea6303882c5db94e87e022373ab2c082a\nY = aecdf1daa71782bc5a26bbbd8d7e8a76490e26abc17dffc774bd7341\nPeerX = 6b2f6b18a587f562ffc61bd9b0047322286986a78f1fd139b84f7c24\nPeerY = 7096908e4615266be59a53cd655515056ff92370a6271a5d3823d704\nZ = 7fdc969a186ff18429f2a276dac43beea21182d82ce2e5a0876552b1\n\nCurve = P-224\nPrivate = 90a15368e3532c0b1e51e55d139447c2c89bc160719d697291ea7c14\nX = c6837d506e976da7db3ad1267c359dff2ea6fb0b7f7f8e77024c59e9\nY = 67eb491d2fc8a530c46525d2a8b2d7c1df5fba1ae740a4649c683ee6\nPeerX = 328101ba826acd75ff9f34d5574ce0dbc92f709bad8d7a33c47940c1\nPeerY = df39f1ea88488c55d5538160878b9ced18a887ea261dd712d14024ff\nZ = 3d60ab6db2b3ffe2d29ccff46d056e54230cf34982e241556ed2920c\n\nCurve = P-224\nPrivate = 8e0838e05e1721491067e1cabc2e8051b290e2616eec427b7121897d\nX = e9150f770075626019e18f95473b71e6828041791d3f08d3faeeaa2b\nY = 475f70735eaae52308a3b763dc88efe18ab590ebafa035f6e08b001c\nPeerX = 0081e34270871e2ebbd94183f617b4ae15f0416dd634fe6e934cf3c0\nPeerY = 3a1e9f38a7b90b7317d26b9f6311063ab58b268cf489b2e50386d5d6\nZ = 9116d72786f4db5df7a8b43078c6ab9160d423513d35ea5e2559306d\n\nCurve = P-224\nPrivate = 38106e93f16a381adb1d72cee3da66ae462ad4bbfea9ecdf35d0814e\nX = 7be6c4c917829ab657dd79e8637d7aefd2f81f0de7654d957e97658d\nY = 430d22d9e8438310f61e0d43f25fa3e34585f432baad27db3021bf0d\nPeerX = 2623632fdf0bd856805a69aa186d4133ef5904e1f655a972d66cce07\nPeerY = 2cef9728dd06fb8b50150f529b695076d4507983912585c89bd0682e\nZ = 207c53dcefac789aaa0276d9200b3a940ce5f2296f4cb2e81a185d3d\n\nCurve = P-224\nPrivate = e5d1718431cf50f6cbd1bc8019fa16762dfa12c989e5999977fb4ea2\nX = 2ea4966e7f92ed7f5cc61fde792045f63b731d6e7d0de2577f2d8ece\nY = 1c4a7b1ede6f839162292df424be78e8176fb6f942a3c02391700f31\nPeerX = 8ee4d1dcc31dee4bf6fe21ca8a587721d910acfb122c16c2a77a8152\nPeerY = 4ebf323fff04eb477069a0ac68b345f6b1ae134efc31940e513cb99f\nZ = 10e467da34f48ad7072005bccd6da1b2ba3f71eafa1c393842f91d74\n\nCurve = P-224\nPrivate = 3d635691b62a9a927c633951c9369c8862bd2119d30970c2644727d6\nX =",
     " 438bbb980517afb20be1d674e3ac2b31cef07a9b23fb8f6e38e0d6c0\nY = 0be5f1c47d58d21b6ed28423b32f5a94750da47edcef33ea79942afd\nPeerX = 97dcbe6d28335882a6d193cc54a1063dd0775dc328565300bb99e691\nPeerY = dad11dd5ece8cfd9f97c9a526e4a1506e6355969ee87826fc38bcd24\nZ = 82fd2f9c60c4f999ac00bbe64bfc11da8ff8cda2e499fced65230bb1\n\nCurve = P-224\nPrivate = acf3c85bbdc379f02f5ea36e7f0f53095a9e7046a28685a8659bf798\nX = ff7511215c71d796bd646e8474be4416b91684ce0d269ef6f422013b\nY = b7bf5e79b5a9393bb9ea42c0bdb2d3c2dc806e1a7306aa58e4fdbea5\nPeerX = ce9126dd53972dea1de1d11efef900de34b661859c4648c5c0e534f7\nPeerY = e113b6f2c1659d07f2716e64a83c18bbce344dd2121fe85168eae085\nZ = 530f7e7fc932613b29c981f261cb036cba3f1df3864e0e1cba2685a2\n\nCurve = P-224\nPrivate = cffd62cb00a0e3163fbf2c397fadc9618210f86b4f54a675287305f0\nX = 04bf4d948f4430d18b4ed6c96dbaf981fa11a403ed16887f06754981\nY = 7c1326a9cef51f79d4e78303d6064b459f612584ac2fdf593d7d5d84\nPeerX = 84419967d6cfad41e75a02b6da605a97949a183a97c306c4b46e66a5\nPeerY = 5cc9b259718b1bc8b144fde633a894616ffd59a3a6d5d8e942c7cbb7\nZ = 49f6fd0139248ef4df2db05d1319bd5b1489e249827a45a8a5f12427\n\nCurve = P-224\nPrivate = 85f903e43943d13c68932e710e80de52cbc0b8f1a1418ea4da079299\nX = 970a4a7e01d4188497ceb46955eb1b842d9085819a9b925c84529d3d\nY = dfa2526480f833ea0edbd204e4e365fef3472888fe7d9691c3ebc09f\nPeerX = 7c9cac35768063c2827f60a7f51388f2a8f4b7f8cd736bd6bc337477\nPeerY = 29ee6b849c6025d577dbcc55fbd17018f4edbc2ef105b004d6257bcd\nZ = 8f7e34e597ae8093b98270a74a8dfcdbed457f42f43df487c5487161\n\nCurve = P-224\nPrivate = cce64891a3d0129fee0d4a96cfbe7ac470b85e967529057cfa31a1d9\nX = a6b29632db94da2125dc1cf80e03702687b2acc1122022fa2174765a\nY = 61723edd73e10daed73775278f1958ba56f1fc9d085ebc2b64c84fe5\nPeerX = 085a7642ad8e59b1a3e8726a7547afbecffdac1dab7e57230c6a9df4\nPeerY = f91c36d881fe9b8047a3530713554a1af4c25c5a8e654dcdcf689f2e\nZ = 71954e2261e8510be1a060733671d2e9d0a2d012eb4e09556d697d2a\n\nCurve = P-256\nPrivate = 7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534\nX = ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b230\nY = 28af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141\nPeerX = 700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287\nPeerY = db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac\nZ = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b\n\nCurve = P-256\nPrivate = 38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5\nX = 119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d0\nY = 8f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d\nPeerX = 809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae\nPeerY = b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3\nZ = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67\n\nCurve = P-256\nPrivate = 1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8\nX = d9f2b79c172845bfdb560bbb01447ca5ecc0470a09513b6126902c6b4f8d1051\nY = f815ef5ec32128d3487834764678702e64e164ff7315185e23aff5facd96d7bc\nPeerX = a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3\nPeerY = ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536\nZ = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec\n\nCurve = P-256\nPrivate = 207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d\nX = 24277c33f450462dcb3d4801d57b9ced05188f16c28eda873258048cd1607e0d\nY = c4789753e2b1f63b32ff014ec42cd6a69fac81dfe6d0d6fd4af372ae27c46f88\nPeerX = df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed\nPeerY = 422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4\nZ = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024\n\nCurve = P-256\nPrivate = 59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf\nX = a8c5fdce8b62c5ada598f141adb3b26cf254c280b2857a63d2ad783a73115f6b\nY = 806e1aafec4af80a0d786b3de45375b517a7e5b51ffb2c356537c9e6ef227d4a\nPeerX = 41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb922\nPeerY = 1af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328\nZ = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62\n\nCurve = P-256\nPrivate = f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef\nX = 7b861dcd2844a5a8363f6b8ef8d493640f55879217189d80326aad9480dfc149\nY = c4675b45eeb306405f6c33c38bc69eb2bdec9b75ad5af4706aab84543b9cc63a\nPeerX = 33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792\nPeerY = f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f\nZ = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3\n\nCurve = P-256\nPrivate = 3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190\nX = 9fb38e2d58ea1baf7622e96720101cae3cde4ba6c1e9fa26d9b1de0899102863\nY = d5561b900406edf50802dd7d73e89395f8aed72fba0e1d1b61fe1d22302260f0\nPeerX = 6a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba7\nPeerY = 40f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05\nZ = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d\n\nCurve = P-256\nPrivate = d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8\nX = 20f07631e4a6512a89ad487c4e9d63039e579cb0d7a556cb9e661cd59c1e7fa4\nY = 6de91846b3eee8a5ec09c2ab1f41e21bd83620ccdd1bdce3ab7ea6e02dd274f5\nPeerX = a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bb\nPeerY = f6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229\nZ = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489\n\nCurve = P-256\nPrivate = 0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d\nX = abb61b423be5d6c26e21c605832c9142dc1dfe5a5fff28726737936e6fbf516d\nY = 733d2513ef58beab202090586fac91bf0fee31e80ab33473ab23a2d89e58fad6\nPeerX = 94e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9\nPeerY = d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a\nZ = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4\n\nCurve = P-256\nPrivate = 2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08\nX = 3d63e429cb5fa895a9247129bf4e48e89f35d7b11de8158efeb3e106a2a87395\nY = 0cae9e477ef41e7c8c1064379bb7b554ddcbcae79f9814281f1e50f0403c61f3\nPeerX = e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274f\nPeerY = d9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5\nZ = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b\n\nCurve = P-256\nPrivate = 77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848\nX = ad5d13c3db508ddcd38457e5991434a251bed49cf5ddcb59cdee73865f138c9f\nY = 62cec1e70588aa4fdfc7b9a09daa678081c04e1208b9d662b8a2214bf8e81a21\nPeerX = f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff01658\nPeerY = 33bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c\nZ = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3\n\nCurve = P-256\nPrivate = 42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e\nX = ab48caa61ea35f13f8ed07ffa6a13e8db224dfecfae1a7df8b1bb6ebaf0cb97d\nY = 1274530ca2c385a3218bddfbcbf0b4024c9badd5243bff834ebff24a8618dccb\nPeerX = 2db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d\nPeerY = 62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e\nZ = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a\n\nCurve = P-256\nPrivate = ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b\nX = 9a8cd9bd72e71752df91440f77c547509a84df98114e7de4f26cdb39234a625d\nY = d07cfc84c8e144fab2839f5189bb1d7c88631d579bbc58012ed9a2327da52f62\nPeerX = cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecb\nPeerY = c3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4\nZ = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307\n\nCurve = P-256\nPrivate = 43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604\nX = f989cf8ee956a82e7ebd9881cdbfb2fd946189b08db53559bc8cfdd48071eb14\nY = 5eff28f1a18a616b04b7d337868679f6dd84f9a7b3d7b6f8af276c19611a541d\nPeerX = 15b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471\nPeerY = cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77\nZ = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96\n\nCurve = P-256\nPrivate = b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903\nX = 69c627",
     "625b36a429c398b45c38677cb35d8beb1cf78a571e40e99fe4eac1cd4e\nY = 81690112b0a88f20f7136b28d7d47e5fbc2ada3c8edd87589bc19ec9590637bd\nPeerX = 49c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa1\nPeerY = 8af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924\nZ = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf\n\nCurve = P-256\nPrivate = 4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8\nX = 5fe964671315a18aa68a2a6e3dd1fde7e23b8ce7181471cfac43c99e1ae80262\nY = d5827be282e62c84de531b963884ba832db5d6b2c3a256f0e604fe7e6b8a7f72\nPeerX = 19b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c\nPeerY = 09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae\nZ = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343\n\nCurve = P-256\nPrivate = 4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147\nX = c9b2b8496f1440bd4a2d1e52752fd372835b364885e154a7dac49295f281ec7c\nY = fbe6b926a8a4de26ccc83b802b1212400754be25d9f3eeaf008b09870ae76321\nPeerX = 2c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b099954\nPeerY = 6cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0\nZ = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78\n\nCurve = P-256\nPrivate = 1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e\nX = 59e1e101521046ad9cf1d082e9d2ec7dd22530cce064991f1e55c5bcf5fcb591\nY = 482f4f673176c8fdaa0bb6e59b15a3e47454e3a04297d3863c9338d98add1f37\nPeerX = a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767\nPeerY = dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03\nZ = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f\n\nCurve = P-256\nPrivate = dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3\nX = 30b9db2e2e977bcdc98cb87dd736cbd8e78552121925cf16e1933657c2fb2314\nY = 6a45028800b81291bce5c2e1fed7ded650620ebbe6050c6f3a7f0dfb4673ab5c\nPeerX = a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644\nPeerY = 563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a\nZ = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c\n\nCurve = P-256\nPrivate = 5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76\nX = 46c9ebd1a4a3c8c0b6d572b5dcfba12467603208a9cb5d2acfbb733c40cf6391\nY = 46c913a27d044185d38b467ace011e04d4d9bbbb8cb9ae25fa92aaf15a595e86\nPeerX = ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01f\nPeerY = e9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38\nZ = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3\n\nCurve = P-256\nPrivate = b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d\nX = 7c9e950841d26c8dde8994398b8f5d475a022bc63de7773fcf8d552e01f1ba0a\nY = cc42b9885c9b3bee0f8d8c57d3a8f6355016c019c4062fa22cff2f209b5cc2e1\nPeerX = c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4e\nPeerY = bf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051\nZ = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660\n\nCurve = P-256\nPrivate = fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535\nX = 38b54db85500cb20c61056edd3d88b6a9dc26780a047f213a6e1b900f76596eb\nY = 6387e4e5781571e4eb8ae62991a33b5dc33301c5bc7e125d53794a39160d8fd0\nPeerX = 317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb6\nPeerY = 09420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae\nZ = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0\n\nCurve = P-256\nPrivate = 334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce\nX = 3f2bf1589abf3047bf3e54ac9a95379bff95f8f55405f64eca36a7eebe8ffca7\nY = 5212a94e66c5ae9a8991872f66a72723d80ec5b2e925745c456f5371943b3a06\nPeerX = 45fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb1\nPeerY = 5c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321\nZ = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c\n\nCurve = P-256\nPrivate = 2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d\nX = 29c0807f10cbc42fb45c9989da50681eead716daa7b9e91fd32e062f5eb92ca0\nY = ff1d6d1955d7376b2da24fe1163a271659136341bc2eb1195fc706dc62e7f34d\nPeerX = a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6\nPeerY = e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef\nZ = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b\n\nCurve = P-256\nPrivate = 85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0\nX = 9cf4b98581ca1779453cc816ff28b4100af56cf1bf2e5bc312d83b6b1b21d333\nY = 7a5504fcac5231a0d12d658218284868229c844a04a3450d6c7381abe080bf3b\nPeerX = 356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b\nPeerY = 57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92\nZ = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857\n\nCurve = P-384\nPrivate = 3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1\nX = 9803807f2f6d2fd966cdd0290bd410c0190352fbec7ff6247de1302df86f25d34fe4a97bef60cff548355c015dbb3e5f\nY = ba26ca69ec2f5b5d9dad20cc9da711383a9dbe34ea3fa5a2af75b46502629ad54dd8b7d73a8abb06a3a3be47d650cc99\nPeerX = a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066\nPeerY = ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a\nZ = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1\n\nCurve = P-384\nPrivate = 92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783\nX = ea4018f5a307c379180bf6a62fd2ceceebeeb7d4df063a66fb838aa35243419791f7e2c9d4803c9319aa0eb03c416b66\nY = 68835a91484f05ef028284df6436fb88ffebabcdd69ab0133e6735a1bcfb37203d10d340a8328a7b68770ca75878a1a6\nPeerX = 30f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e0\nPeerY = 25e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757\nZ = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff\n\nCurve = P-384\nPrivate = 12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853\nX = fcfcea085e8cf74d0dced1620ba8423694f903a219bbf901b0b59d6ac81baad316a242ba32bde85cb248119b852fab66\nY = 972e3c68c7ab402c5836f2a16ed451a33120a7750a6039f3ff15388ee622b7065f7122bf6d51aefbc29b37b03404581b\nPeerX = 1aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180\nPeerY = 419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3\nZ = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435\n\nCurve = P-384\nPrivate = 8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1\nX = e38c9846248123c3421861ea4d32669a7b5c3c08376ad28104399494c84ff5efa3894adb2c6cbe8c3c913ef2eec5bd3c\nY = 9fa84024a1028796df84021f7b6c9d02f0f4bd1a612a03cbf75a0beea43fef8ae84b48c60172aadf09c1ad016d0bf3ce\nPeerX = 8bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449\nPeerY = d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7\nZ = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854\n\nCurve = P-384\nPrivate = 84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f\nX = 3222063a2997b302ee60ee1961108ff4c7acf1c0ef1d5fb0d164b84bce71c431705cb9aea9a45f5d73806655a058bee3\nY = e61fa9e7fbe7cd43abf99596a3d3a039e99fa9dc93b0bdd9cad81966d17eeaf557068afa7c78466bb5b22032d1100fa6\nPeerX = eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0\nPeerY = f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1\nZ = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405\n\nCurve = P-384\nPrivate = 68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b\nX = 868be0e694841830e424d913d8e7d86b84ee1021d82b0ecf523f09fe89a76c0c95c49f2dfbcf829c1e39709d55efbb3b\nY = 9195eb183675b40fd",
@@ -2388,9 +2363,9 @@
     "fd3e0faceb636b34ed17e044a9f249dae8fc132e937e2d9349cd2ed77bb1049ceb692a2ec5b17ad61502a64c\nY = 001ec91d3058573fa6c0564a02a1a010160c313bc7c73510dc983e5461682b5be00dbce7e2c682ad73f29ca822cdc111f68fabe33a7b384a648342c3cdb9f050bcdb\nPeerX = 017200b3f16a68cbaed2bf78ba8cddfb6cffac262bba00fbc25f9dc72a07ce59372904899f364c44cb264c097b647d4412bee3e519892d534d9129f8a28f7500fee7\nPeerY = 00baba8d672a4f4a3b63de48b96f56e18df5d68f7d70d5109833f43770d6732e06b39ad60d93e5b43db8789f1ec0aba47286a39ea584235acea757dbf13d53b58364\nZ = 0101e462e9d9159968f6440e956f11dcf2227ae4aea81667122b6af9239a291eb5d6cf5a4087f358525fcacfa46bb2db01a75af1ba519b2d31da33eda87a9d565748\n\nCurve = P-521\nPrivate = 005bacfff268acf6553c3c583b464ea36a1d35e2b257a5d49eb3419d5a095087c2fb4d15cf5bf5af816d0f3ff7586490ccd3ddc1a98b39ce63749c6288ce0dbdac7d\nX = 0036e488da7581472a9d8e628c58d6ad727311b7e6a3f6ae33a8544f34b09280249020be7196916fafd90e2ec54b66b5468d2361b99b56fa00d7ac37abb8c6f16653\nY = 011edb9fb8adb6a43f4f5f5fdc1421c9fe04fc8ba46c9b66334e3af927c8befb4307104f299acec4e30f812d9345c9720d19869dbfffd4ca3e7d2713eb5fc3f42615\nPeerX = 004efd5dbd2f979e3831ce98f82355d6ca14a5757842875882990ab85ab9b7352dd6b9b2f4ea9a1e95c3880d65d1f3602f9ca653dc346fac858658d75626f4d4fb08\nPeerY = 0061cf15dbdaa7f31589c98400373da284506d70c89f074ed262a9e28140796b7236c2eef99016085e71552ff488c72b7339fefb7915c38459cb20ab85aec4e45052\nZ = 0141d6a4b719ab67eaf04a92c0a41e2dda78f4354fb90bdc35202cc7699b9b04d49616f82255debf7bbec045ae58f982a66905fcfae69d689785e38c868eb4a27e7b\n\nCurve = P-521\nPrivate = 008e2c93c5423876223a637cad367c8589da69a2d0fc68612f31923ae50219df2452e7cc92615b67f17b57ffd2f52b19154bb40d7715336420fde2e89fee244f59dc\nX = 00fa3b35118d6c422570f724a26f90b2833b19239174cea081c53133f64db60d6940ea1261299c04c1f4587cdb0c4c39616479c1bb0c146799a118032dcf98f899c0\nY = 0069f040229006151fa32b51f679c8816f7c17506b403809dc77cd58a2aec430d94d13b6c916de99f355aa45fcfbc6853d686c71be496a067d24bfaea4818fc51f75\nPeerX = 0129891de0cf3cf82e8c2cf1bf90bb296fe00ab08ca45bb7892e0e227a504fdd05d2381a4448b68adff9c4153c87eacb78330d8bd52515f9f9a0b58e85f446bb4e10\nPeerY = 009edd679696d3d1d0ef327f200383253f6413683d9e4fcc87bb35f112c2f110098d15e5701d7ceee416291ff5fed85e687f727388b9afe26a4f6feed560b218e6bb\nZ = 00345e26e0abb1aac12b75f3a9cf41efe1c336396dffa4a067a4c2cfeb878c68b2b045faa4e5b4e6fa4678f5b603c351903b14bf9a6a70c439257199a640890b61d1\n\nCurve = P-521\nPrivate = 0004d49d39d40d8111bf16d28c5936554326b197353eebbcf47545393bc8d3aaf98f14f5be7074bfb38e6cc97b989754074daddb3045f4e4ce745669fdb3ec0d5fa8\nX = 012ec226d050ce07c79b3df4d0f0891f9f7adf462e8c98dbc1a2a14f5e53a3f5ad894433587cc429a8be9ea1d84fa33b1803690dae04da7218d30026157fc995cf52\nY = 004837dfbf3426f57b5c793269130abb9a38f618532211931154db4eeb9aede88e57290f842ea0f2ea9a5f74c6203a3920fe4e305f6118f676b154e1d75b9cb5eb88\nPeerX = 01a3c20240e59f5b7a3e17c275d2314ba1741210ad58b71036f8c83cc1f6b0f409dfdd9113e94b67ec39c3291426c23ffcc447054670d2908ff8fe67dc2306034c5c\nPeerY = 01d2825bfd3af8b1e13205780c137fe938f84fde40188e61ea02cead81badfdb425c29f7d7fb0324debadc10bbb93de68f62c35069268283f5265865db57a79f7bf7\nZ = 006fe9de6fb8e672e7fd150fdc5e617fabb0d43906354ccfd224757c7276f7a1010091b17ed072074f8d10a5ec971eb35a5cb7076603b7bc38d432cbc059f80f9488\n\nCurve = P-521\nPrivate = 011a5d1cc79cd2bf73ea106f0e60a5ace220813b53e27b739864334a07c03367efda7a4619fa6eef3a9746492283b3c445610a023a9cc49bf4591140384fca5c8bb5\nX = 00eb07c7332eedb7d3036059d35f7d2288d4377d5f42337ad3964079fb120ccd4c8bd384b585621055217023acd9a94fcb3b965bfb394675e788ade41a1de73e620c\nY = 00491a835de2e6e7deb7e090f4a11f2c460c0b1f3d5e94ee8d751014dc720784fd3b54500c86ebaef18429f09e8e876d5d1538968a030d7715dde99f0d8f06e29d59\nPeerX = 007e2d138f2832e345ae8ff65957e40e5ec7163f016bdf6d24a2243daa631d878a4a16783990c722382130f9e51f0c1bd6ff5ac96780e48b68f5dec95f42e6144bb5\nPeerY = 00b0de5c896791f52886b0f09913e26e78dd0b69798fc4df6d95e3ca708ecbcbcce1c1895f5561bbabaae372e9e67e6e1a3be60e19b470cdf673ec1fc393d3426e20\nZ = 01e4e759ecedce1013baf73e6fcc0b92451d03bdd50489b78871c333114990c9ba6a9b2fc7b1a2d9a1794c1b60d9279af6f146f0bbfb0683140403bfa4ccdb524a29\n\nCurve = P-521\nPrivate = 010c908caf1be74c616b625fc8c1f514446a6aec83b5937141d6afbb0a8c7666a7746fa1f7a6664a2123e8cdf6cd8bf836c56d3c0ebdcc980e43a186f938f3a78ae7\nX = 0031890f4c7abec3f723362285d77d2636f876817db3bbc88b01e773597b969ff6f013ea470c854ab4a7739004eb8cbea69b82ddf36acadd406871798ecb2ac3aa7f\nY = 00d8b429ae3250266b9643c0c765a60dc10155bc2531cf8627296f4978b6640a9e600e19d0037d58503fa80799546a814d7478a550aa90e5ebeb052527faaeae5d08\nPeerX = 00118c36022209b1af8ebad1a12b566fc48744576e1199fe80de1cdf851cdf03e5b9091a8f7e079e83b7f827259b691d0c22ee29d6bdf73ec7bbfd746f2cd97a357d\nPeerY = 00da5ff4904548a342e2e7ba6a1f4ee5f840411a96cf63e6fe622f22c13e614e0a847c11a1ab3f1d12cc850c32e095614ca8f7e2721477b486e9ff40372977c3f65c\nZ = 0163c9191d651039a5fe985a0eea1eba018a40ab1937fcd2b61220820ee8f2302e9799f6edfc3f5174f369d672d377ea8954a8d0c8b851e81a56fda95212a6578f0e\n\nCurve = P-521\nPrivate = 01b37d6b7288de671360425d3e5ac1ccb21815079d8d73431e9b74a6f0e7ae004a357575b11ad66642ce8b775593eba9d98bf25c75ef0b4d3a2098bbc641f59a2b77\nX = 00189a5ee34de7e35aefeaeef9220c18071b4c29a4c3bd9d954458bd3e82a7a34da34cff5579b8101c065b1f2f527cf4581501e28ef5671873e65267733d003520af\nY = 01eb4bc50a7b4d4599d7e3fa773ddb9eb252c9b3422872e544bdf75c7bf60f5166ddc11eb08fa7c30822dabaee373ab468eb2d922e484e2a527fff2ebb804b7d9a37\nPeerX = 01780edff1ca1c03cfbe593edc6c049bcb2860294a92c355489d9afb2e702075ade1c953895a456230a0cde905de4a3f38573dbfcccd67ad6e7e93f0b5581e926a5d\nPeerY = 00a5481962c9162962e7f0ebdec936935d0eaa813e8226d40d7f6119bfd940602380c86721e61db1830f51e139f210000bcec0d8edd39e54d73a9a129f95cd5fa979\nZ = 015d613e267a36342e0d125cdad643d80d97ed0600afb9e6b9545c9e64a98cc6da7c5aaa3a8da0bdd9dd3b97e9788218a80abafc106ef065c8f1c4e1119ef58d298b\n\nCurve = P-521\nPrivate = 00f2661ac762f60c5fff23be5d969ccd4ec6f98e4e72618d12bdcdb9b4102162333788c0bae59f91cdfc172c7a1681ee44d96ab2135a6e5f3415ebbcd55165b1afb0\nX = 00a8e25a6902d687b4787cdc94c364ac7cecc5c495483ed363dc0aa95ee2bd739c4c4d46b17006c728b076350d7d7e54c6822f52f47162a25109aaaba690cab696ec\nY = 0168d2f08fe19e4dc9ee7a195b03c9f7fe6676f9f520b6270557504e72ca4394a2c6918625e15ac0c51b8f95cd560123653fb8e8ee6db961e2c4c62cc54e92e2a2a9\nPeerX = 016dacffa183e5303083a334f765de724ec5ec9402026d4797884a9828a0d321a8cfac74ab737fe20a7d6befcfc73b6a35c1c7b01d373e31abc192d48a4241a35803\nPeerY = 011e5327cac22d305e7156e559176e19bee7e4f2f59e86f1a9d0b6603b6a7df1069bde6387feb71587b8ffce5b266e1bae86de29378a34e5c74b6724c4d40a719923\nZ = 014d6082a3b5ced1ab8ca265a8106f302146c4acb8c30bb14a4c991e3c82a9731288bdb91e0e85bda313912d06384fc44f2153fb13506fa9cf43c9aab5750988c943\n\nCurve = P-521\nPrivate = 00f430ca1261f09681a9282e9e970a9234227b1d5e58d558c3cc6eff44d1bdf53de16ad5ee2b18b92d62fc79586116b0efc15f79340fb7eaf5ce6c44341dcf8dde27\nX = 006c1d9b5eca87de1fb871a0a32f807c725adccde9b3967453a71347d608f0c030cd09e338cdecbf4a02015bc8a6e8d3e2595fe773ffc2fc4e4a55d0b1a2cc00323b\nY = 01141b2109e7f4981c952aa818a2b9f6f5c41feccdb7a7a45b9b4b672937771b008cae5f934dfe3fed10d383ab1f38769c92ce88d9be5414817ecb073a31ab368ccb\nPeerX = 00a091421d3703e3b341e9f1e7d58f8cf7bdbd1798d001967b801d1cec27e605c580b2387c1cb464f55ce7ac80334102ab03cfb86d88af76c9f4129c01bedd3bbfc4\nPeerY = 008c9c577a8e6fc446815e9d40baa66025f15dae285f19eb668ee60ae9c98e7ecdbf2b2a68e22928059f67db188007161d3ecf397e0883f0c4eb7eaf7827a62205cc\nZ = 0020c00747cb8d492fd497e0fec54644bf027d418ab686381f109712a99cabe328b9743d2225836f9ad66e5d7fed1de247e0da92f60d5b31f9e47672e57f710598f4\n\nCurve = P-521\nPrivate = 005dc33aeda03c2eb233014ee468dff753b72f73b00991043ea353828ae69d4cd0fadeda7bb278b535d7c57406ff2e6e473a5a4ff98e90f90d6dadd25100e8d85666\nX = 00c825ba307373cec8dd2498eef82e21fd9862168dbfeb83593980ca9f82875333899fe94f137daf1c4189eb502937c3a367ea7951ed8b0f3377fcdf2922021d46a5\nY = 016b8a2540d5e65493888bc337249e67c0a68774f3e8d81e3b4574a0125165f0bd58b8af9de74b35832539f95c3cd9f1b759408560aa6851ae3ac7555347b0d3b13b\nPeerX = 004f38816681771289ce0cb83a5e29a1ab06fc91f786994b23708ff08a08a0f675b809ae99e9f9967eb1a49f196057d69e50d6dedb4dd2d9a81c02bdcc8f7f518460\nPeerY = 009efb244c8b91087de1eed766500f0e81530752d469256ef79f6b965d8a2232a0c2dbc4e8e1d09214bab38485be6e357c4200d073b52f04e4a16fc6f5247187aecb\nZ = 00c2bfafcd7fbd3e2fd1c",
     "750fdea61e70bd4787a7e68468c574ee99ebc47eedef064e8944a73bcb7913dbab5d93dca660d216c553622362794f7a2acc71022bdb16f\n\nCurve = P-521\nPrivate = 00df14b1f1432a7b0fb053965fd8643afee26b2451ecb6a8a53a655d5fbe16e4c64ce8647225eb11e7fdcb23627471dffc5c2523bd2ae89957cba3a57a23933e5a78\nX = 004e8583bbbb2ecd93f0714c332dff5ab3bc6396e62f3c560229664329baa5138c3bb1c36428abd4e23d17fcb7a2cfcc224b2e734c8941f6f121722d7b6b94154576\nY = 01cf0874f204b0363f020864672fadbf87c8811eb147758b254b74b14fae742159f0f671a018212bbf25b8519e126d4cad778cfff50d288fd39ceb0cac635b175ec0\nPeerX = 01a32099b02c0bd85371f60b0dd20890e6c7af048c8179890fda308b359dbbc2b7a832bb8c6526c4af99a7ea3f0b3cb96ae1eb7684132795c478ad6f962e4a6f446d\nPeerY = 017627357b39e9d7632a1370b3e93c1afb5c851b910eb4ead0c9d387df67cde85003e0e427552f1cd09059aad0262e235cce5fba8cedc4fdc1463da76dcd4b6d1a46\nZ = 01aaf24e5d47e4080c18c55ea35581cd8da30f1a079565045d2008d51b12d0abb4411cda7a0785b15d149ed301a3697062f42da237aa7f07e0af3fd00eb1800d9c41\n",
 };
-static const size_t kLen37 = 136462;
+static const size_t kLen34 = 136462;
 
-static const char *kData37[] = {
+static const char *kData34[] = {
     "# Public key algorithm tests\n\n# Keys used for PKEY operations.\n\n# RSA 2048 bit key.\nPrivateKey = RSA-2048\nType = RSA\nInput = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f02030100010282010060297ac7991b167a06d6b24758b8cbe208beb9b2d9ec9738bd80f90a2e35005dd7ce292d9e29ba885bd316fef1f20913bc0ac90d6b0808b2414d82104441d8624a33ce0233c8f780a48b375aff02d76712228a702484db3f9ebecccfbbee1709dba182800d949e9e4216e0bff3558388f8bd90da373a1d82743ec3fbdd1427fd16825a657a316912e8695365117ca2f845c909405fcac55f895fc15d20386c26ee78c9e99075029a178a6c1e4cf0c200e8a9cfb27e9d156f86e6c2adc22b1a84a1cd5ca5b2790875d79407c84b352395cb81cc3fed5bb043b69ede0c07204550025cee8c5f440170b6120bb48e0f747bcd8f522110850df043c428dfd187053102818100f6f961b47cbc035d3aedebc7de850a956b65ecdb9cf60764063f15aa48553c58d972fe6675056e35ddfdc37bf3b9f2f622ee271337256849c9bef2176fe8f7c3f8bb91ba374dd53baf3dec814d2bdec10c1fdc88cdd16876f26b1edfa3f094197edf4d42ff1fb2971103b898ca859c427287086a842ab410bb69cf2d35af6be302818100d47e724a7ff41048b270c2524a4101878b73159bb73d3dbc187b220e635b3534f96e243a184d93f860b6bfbb6b71c1ed9a1e1f458583023c301e96a692c1a08b53d0ec9ca910100d80451e3b7dc6a01bac4aecef8df798846bc235a08cbba2cf4c06804cc11219e95608c714e3f1430d491fadbba32a5751a04f97745834c9a502818021f2452bb9b95dfd028c914bf799f1ca77e89a95d50d3c16d384f8455f8bd7af9eb3dfa3d591d9842def235f7630a8e48c088ff6642e101794535a933e1e976fa8509fc728b2da0c4a1a08d7fcf37abaae1ff3001aca1dc1bbb05d9dffbaa1a09f7fb1eef38237d9ebccc722b9338436dde7119112798c26809c1a8dec4320610281801f7510aa62c2d8de4a3c53282781f41e02d0e8b402ae78432e449c48110161a11403f02d01880a8dcc938152d79721a4711a607ac4471ebf964810f95be47a45e60499e29f4c9773c83773404f606637728c2d0351bb03c326c8bb73a721e7fa5440ea2172bba1465fcc30dcb0d9f89930e815aa1f7f9729a857e00e0338dd590281804d1f0d756fe77e01099a652f50a88b7b685dc5bf00981d5d2376fd0c6fe29cd5b638734479305a73ad3c1599d39eae3bae035fbd6fed07c28de705933879a06e48e6a603686ed8e2560a5f6af1f2c24faf4aa960e382186f15eedce9a2491ae730680dd4cf778b70faa86826ab3223477cc91377b19a6d5a2eaea219760beed5\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The public half of the same key encoded as a SubjectPublicKeyInfo.\nPublicKey = RSA-2048-SPKI\nType = RSA\nInput = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same key but with a negative RSA modulus.\nPublicKey = RSA-2048-SPKI-Negative\nInput = 30820121300d06092a864886f70d01010105000382010e003082010902820100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001\nError = NEGATIVE_NUMBER\n\n# The same key but with missing parameters rather than a NULL.\nPublicKey = RSA-2048-SPKI-Invalid\nInput = 30820120300b06092a864886f70d0101010382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001\nError = DECODE_ERROR\n\n# The same key but with an incorrectly-encoded length prefix.\nPublicKey = RSA-2048-SPKI-Invalid2\nInput = 3083000122300d06092a864886f70d01010105000382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001\nError = DECODE_ERROR\n\n# RSA 512 bit key.\nPrivateKey = RSA-512\nType = RSA\nInput = 30820154020100300d06092a864886f70d01010105000482013e3082013a020100024100dd20403d976a38c9d79152d87b5c8e9f05033eadd7b7de709bf5b0c4a5182a97d18483526b02362b992e154a9f37faa396ca2685cdab8fec09877ebe705f4dd70203010001024055bebcca655d7e39de8a6eaa9d636db682161907064039544755c53eeb99ec618c03a210dbc61471eaba10c5c365c9726d6b7a96f54d455f7d168d49367270e1022100f21a05d9fd6817301ce49ce10448f9bdd44f5ef5b7557cd7d83155db46382ae7022100e9d1f7157783db2feab1936954ddc4e83aa365695868144cda1be6813b61d791022100d6001eb0040920860ce41fafdf23ca6dfbdf74e6e9f98cf3164cf5c16f9e727d02206f6f73f4b52b10517be6f9bc5f87fa0a3bb817e2e711636b651f9af1c85d4f21022063eff2e57f5b4ca20342cfe793e25526624e3692f192461f9e1ce7f13f2d72c8\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# RSA 515 bit key.\nPrivateKey = RSA-515\nType = RSA\nInput = 30820157020100300d06092a864886f70d0101010500048201413082013d0201000241054fa166e205e658bbe8a2dc35311c0c2b75b7e4569fd9642c8bae809279271fc824f26baa1166ea46298ca63379ea76adbada2b61e5066820a35beaec1aca227f020301000102410266c972be0d30e53ac2acb1aa13b4bd0401cccf212452a66b4615f7e943831f67b4ca48560582d0ca886044aaaaf87945252a848c1947944186e6eb83969bf91102210309e631761842cc8a2ccfd372c20a9cba21de1a199c30ab440bc6b51079f4e825022101bf715c1db432627ca7c29a293b9210f2eff1e92d12f306ebaa5334f8ee03dcd30221018ac58a765f2b8f37d434081fe5ff92b81735ead2f263f4968ccf63d61fbe3d0d0221015b247a1159a2d5a25d0db049593c6405f77f3a278c521d066e290c2a2d8fb59d0221026224aa31fd95c14d24fd03b8a195bba4cc88df7c37f5370a5ab19f882f1404d6\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# EC P-256 key\nPrivateKey = P-256\nType = EC\nInput = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same key as above with the optional public key omitted.\nPrivateKey = P-256-MissingPublic\nType = EC\nInput = 3041020100301306072a8648ce3d020106082a8648ce3d0301070427302502010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same key as above with redundant parameters.\nPrivateKey = P-256-ExtraParameters\nType = EC\nInput = 308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a00a06082a8648ce3d030107a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\n# The key re-encodes with the parameters removed.\nOutput = 308187020100301306072a8648c",
     "e3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same key, but with the redundant parameters in the ECPrivateKey mismatched.\nPrivateKey = P-256-BadInnerParameters\nInput = 308190020100301306072a8648ce3d020106082a8648ce3d0301070476307402010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a00706052b81040022a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nError = GROUP_MISMATCH\n\n# The same key, but with the curve spelled explicitly.\nPrivateKey = P-256-ExplicitParameters\nType = EC\nInput = 308201610201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nOutput = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same as above, but with the optional cofactor omitted.\nPrivateKey = P-256-ExplicitParameters-NoCofactor\nType = EC\nInput = 3082015e0201003081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nOutput = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same as above, but the cofactor is zero instead of one.\nPrivateKey = P-256-ExplicitParameters-CofactorZero\nInput = 308201610201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nError = UNKNOWN_GROUP\n\n# The same as above, but the cofactor is two instead of one.\nPrivateKey = P-256-ExplicitParameters-CofactorTwo\nInput = 308201610201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020102046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nError = UNKNOWN_GROUP\n\n# The public half of the same key encoded as a PublicKey.\nPublicKey = P-256-SPKI\nType = EC\nInput = 3059301306072a8648ce3d020106082a8648ce3d030107034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same as above, but with the curve explicitly spelled out.\nPublicKey = P-256-SPKI\nInput = 3082014b3082010306072a8648ce3d02013081f7020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff305b0420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b031500c49d360886e704936a6678e1139d26b7819f7e900441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nError = DECODE_ERROR\n\n# The same as above, but with trailing data after the curve name.\nPublicKey = P-256-SPKI\nInput = 305b301506072a8648ce3d020106082a8648ce3d0301070500034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9\nError = DECODE_ERROR\n\n# A DSA private key.\nPrivateKey = DSA-1024\nType = DSA\nInput = 308202650201003082023906072a8648ce3804013082022c02820101009e12fab3de12213501dd82aa10ca2d101d2d4ebfef4d2a3f8daa0fe0cedad8d6af85616aa2f3252c0a2b5a6db09e6f14900e0ddb8311876dd8f9669525f99ed65949e184d5064793271169a228680b95ec12f59a8e20b21f2b58eb2a2012d35bde2ee351822fe8f32d0a330565dcce5c672b7259c14b2433d0b5b2ca2b2db0ab626e8f13f47fe0345d904e7294bb038e9ce21a9e580b83356278706cfe768436c69de149ccff98b4aab8cb4f6385c9f102ce59346eaeef27e0ad222d53d6e89cc8cde5776dd00057b03f2d88ab3cedbafd7b585f0b7f7835e17a3728bbf25ea62572f245dc111f3ce39cb6ffacc31b0a2790e7bde90224ea9b09315362af3d2b022100f381dcf53ebf724f8b2e5ca82c010fb4b5eda9358d0fd88ed278589488b54fc3028201000c402a725dcc3a62e02bf4cf43cd17f4a493591220223669cf4193edab423ad08dfb552e308a6a57a5ffbc7cd0fb2087f81f8df0cb08ab2133287d2b6968714a94f633c940845a48a3e16708dde761cc6a8eab2d84db21b6ea5b07681493cc9c31fbc368b243f6ddf8c932a8b4038f44e7b15ca876344a147859f2b43b39458668ad5e0a1a9a669546dd2812e3b3617a0aef99d58e3bb4cc87fd94225e01d2dcc469a77268146c51918f18e8b4d70aa1f0c7623bcc52cf3731d38641b2d2830b7eecb2f09552ff137d046e494e7f33c3590002b16d1b97d936fda28f90c3ed3ca35338168ac16f77c3c57adc2e8f7c6c2256e41a5f65450590dbb5bcf06d66610423022100b0c768702743bc51242993a971a52889795444f7c6452203d0ce84fe6117d46e\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# A DSA public key.\nPublicKey = DSA-1024-SPKI\nType = DSA\nInput = 308201b73082012c06072a8648ce3804013082011f02818100b3429b8b128c9079f9b72e86857e98d265e5d91661ed8b5f4cc56e5eed1e571da30186983a9dd76297eab73ee13a1db841f8800d04a7cab478af6cde2ea4a2868531af169a24858c6268efa39ceb7ed0d4227eb5bbb01124a2a5a26038c7bcfb8cc827f68f5202345166e4718596799b65c9def82828ce44e62e38e41a0d24b1021500c5a56c81ddd87f47e676546c56d05706421624cf0281810094de40d27314fe929e47ff9b1ac65cfc73ef38c4d381c890be6217b15039ae18190e6b421af8c0bda35a5cfd050f58ae2644adce83e68c8e5ba11729df56bbb21e227a60b816cc033fa799a38fe1ba5b4aa1801b6f841ce3df99feb3b4fb96950c960af13fa2ce920aabc12dd24ad2044a35063ea0e25f67f560f4cfbdc55983",
     "03818400028180258c30ebbb7f34fdc873ce679f6cea373c7886d75d4421b90920db034daedd292c64d8edd8cdbdd7f3ad23d74cfa2135247d0cef6ecf2e14f99e19d22a8c1266bd8fb8719c0e5667c716c45c7adbdabe548085bdad2dfee636f8d52fd6adb2193df6c4f0520fbd171b91882e0e4f321f8250ffecf4dbea00e114427d3ef96c1a\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# The same key as above, but without the parameters.\nPublicKey = DSA-1024-SPKI-No-Params\nType = DSA\nInput = 308192300906072a8648ce38040103818400028180258c30ebbb7f34fdc873ce679f6cea373c7886d75d4421b90920db034daedd292c64d8edd8cdbdd7f3ad23d74cfa2135247d0cef6ecf2e14f99e19d22a8c1266bd8fb8719c0e5667c716c45c7adbdabe548085bdad2dfee636f8d52fd6adb2193df6c4f0520fbd171b91882e0e4f321f8250ffecf4dbea00e114427d3ef96c1a\nExpectNoRawPrivate\nExpectNoRawPublic\n\n# Private keys from RFC 8032.\nPrivateKey = Ed25519\nType = Ed25519\nInput = 302e020100300506032b6570042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60\nExpectRawPrivate = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60\nExpectRawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\n\nPrivateKey = Ed25519-2\nType = Ed25519\nInput = 302e020100300506032b6570042204204ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb\nExpectRawPrivate = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb\nExpectRawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c\n\nPrivateKey = Ed25519-3\nType = Ed25519\nInput = 302e020100300506032b657004220420c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7\nExpectRawPrivate = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7\nExpectRawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025\n\nPrivateKey = Ed25519-4\nType = Ed25519\nInput = 302e020100300506032b657004220420f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5\nExpectRawPrivate = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5\nExpectRawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e\n\nPrivateKey = Ed25519-5\nType = Ed25519\nInput = 302e020100300506032b657004220420833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42\nExpectRawPrivate = 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42\nExpectRawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf\n\n# Public keys from RFC 8032.\nPublicKey = Ed25519-SPKI\nType = Ed25519\nInput = 302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\nExpectNoRawPrivate\nExpectRawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\n\nPublicKey = Ed25519-SPKI-2\nType = Ed25519\nInput = 302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c\nExpectNoRawPrivate\nExpectRawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c\n\nPublicKey = Ed25519-SPKI-3\nType = Ed25519\nInput = 302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025\nExpectNoRawPrivate\nExpectRawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025\n\nPublicKey = Ed25519-SPKI-4\nType = Ed25519\nInput = 302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e\nExpectNoRawPrivate\nExpectRawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e\n\nPublicKey = Ed25519-SPKI-5\nType = Ed25519\nInput = 302a300506032b6570032100ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf\nExpectNoRawPrivate\nExpectRawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf\n\n# The first key, private and public, with invalid NULL parameters.\nPrivateKey = Ed25519-NULL\nInput = 3030020100300706032b65700500042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60\nError = DECODE_ERROR\n\nPublicKey = Ed25519-SPKI-NULL\nInput = 302c300706032b65700500032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a\nError = DECODE_ERROR\n\n# Sample public key from RFC 8410.\nPublicKey = Ed25519-SPKI-Spec\nType = Ed25519\nInput = 302a300506032b657003210019bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1\n\n# Sample private key from RFC 8410.\nPrivateKey = Ed25519-Spec\nType = Ed25519\nInput = 302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842\n\n\n# RSA tests\n\nSign = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF1234\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99b7638d72bb687f97661d304ae145d64a474437a4ef39d7b8059332ddeb07e92bf6e0e3acaf8afedc93795e4511737ec1e7aab6d5bc9466afc950c1c17b48ad\n\nVerify = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF1234\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99b7638d72bb687f97661d304ae145d64a474437a4ef39d7b8059332ddeb07e92bf6e0e3acaf8afedc93795e4511737ec1e7aab6d5bc9466afc950c1c17b48ad\n\nVerify = RSA-2048-SPKI\nDigest = SHA1\nInput = \"0123456789ABCDEF1234\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99b7638d72bb687f97661d304ae145d64a474437a4ef39d7b8059332ddeb07e92bf6e0e3acaf8afedc93795e4511737ec1e7aab6d5bc9466afc950c1c17b48ad\n\n# Digest too long\nSign = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF12345\"\nError = INVALID_MESSAGE_LENGTH\n\nVerify = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF12345\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99b7638d72bb687f97661d304ae145d64a474437a4ef39d7b8059332ddeb07e92bf6e0e3acaf8afedc93795e4511737ec1e7aab6d5bc9466afc950c1c17b48ad\nError = INVALID_MESSAGE_LENGTH\n\n# Digest too short\nSign = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF123\"\nError = INVALID_MESSAGE_LENGTH\n\nVerify = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF123\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99b7638d72bb687f97661d304ae145d64a474437a4ef39d7b8059332ddeb07e92bf6e0e3acaf8afedc93795e4511737ec1e7aab6d5bc9466afc950c1c17b48ad\nError = INVALID_MESSAGE_LENGTH\n\n# Digest too large for key.\nSign = RSA-512\nDigest = SHA512\nInput = \"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\"\nError = DIGEST_TOO_BIG_FOR_RSA_KEY\n\n# Mismatched digest\nVerify = RSA-2048\nDigest = SHA1\nInput = \"0123456789ABCDEF1233\"\nOutput = c09d402423cbf233d26cae21f954547bc43fe80fd41360a0336cfdbe9aedad05bef6fd2eaee6cd60089a52482d4809a238149520df3bdde4cb9e23d9307b05c0a6f327052325a29adf2cc95b66523be7024e2a585c3d4db15dfbe146efe0ecdc0402e33fe5d40324ee96c5c3edd374a15cdc0f5d84aa243c0f07e188c6518fbfceae158a9943be398e31097da81b62074f626eff738be6160741d5a26957a482b3251fd85d8df78b98148459de10aa93305dbb4a5230aa1da291a9b0e481918f99",
@@ -2409,19 +2384,19 @@
     "d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1\n\nVerifyMessage = RSA-2048-SPKI\nDigest = SHA256\nInput = \"Hello world\"\nOutput = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1\n\nVerifyMessage = P-256\nDigest = SHA256\nInput = \"Hello world\"\nOutput = 304502204c66004635c267394bd6857c1e0b53b22a2bab1ca7dff9d5c1b42143858b3ea7022100ae81228510e03cd49a8863d2ebd1c05fe0c87eacd1150433132b909994cd0dbd\n\n# Digest can't be omitted in many algorithms.\nSignMessage = RSA-2048\nInput = \"Hello world\"\nError = NO_DEFAULT_DIGEST\n\nVerifyMessage = RSA-2048\nInput = \"Hello world\"\nOutput = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1\nError = NO_DEFAULT_DIGEST\n\n# Signing test vectors from RFC 8032.\nSignMessage = Ed25519\nInput = \"\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\nSignMessage = Ed25519-2\nInput = 72\nOutput = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\nSignMessage = Ed25519-3\nInput = af82\nOutput = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\nSignMessage = Ed25519-4\nInput = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nOutput = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03\n\nSignMessage = Ed25519-5\nInput = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f\nOutput = dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704\n\n# Signing with public keys is not allowed.\nSignMessage = Ed25519-SPKI\nInput = \"\"\nError = NOT_A_PRIVATE_KEY\n\n# Verify test vectors from RFC 8032. Test verifying with both the public and\n# private key.\nVerifyMessage = Ed25519\nInput = \"\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\nVerifyMessage = Ed25519-SPKI\nInput = \"\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\nVerifyMessage = Ed25519-2\nInput = 72\nOutput = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\nVerifyMessage = Ed25519-SPKI-2\nInput = 72\nOutput = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\nVerifyMessage = Ed25519-3\nInput = af82\nOutput = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\nVerifyMessage = Ed25519-SPKI-3\nInput = af82\nOutput = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\nVerifyMessage = Ed25519-4\nInput = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nOutput = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681",
     "e30a6ac00a9704a188a03\n\nVerifyMessage = Ed25519-SPKI-4\nInput = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nOutput = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03\n\nVerifyMessage = Ed25519-5\nInput = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f\nOutput = dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704\n\nVerifyMessage = Ed25519-SPKI-5\nInput = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f\nOutput = dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704\n\n# Length is wrong.\nVerifyMessage = Ed25519-SPKI\nInput = \"\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a10\nError = INVALID_SIGNATURE\n\n# Message is wrong.\nVerifyMessage = Ed25519-SPKI\nInput = \"Hello world\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\nError = INVALID_SIGNATURE\n\n# Ed25519 does not support configuring a digest.\nSignMessage = Ed25519\nInput = \"\"\nDigest = SHA256\nError = COMMAND_NOT_SUPPORTED\n\n# Ed25519 does not support signing a pre-hashed value.\nSign = Ed25519\nInput = \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"\nError = OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE\n\nVerify = Ed25519\nInput = \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"\nOutput = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\nError = OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE\n\n\n# Derive tests.\n\nPrivateKey = ECDH-P256-Private\nType = EC\nInput = 3041020100301306072a8648ce3d020106082a8648ce3d0301070427302502010104207d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534\n\nPublicKey = ECDH-P256-Peer\nType = EC\nInput = 3059301306072a8648ce3d020106082a8648ce3d03010703420004700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac\n\nDerive = ECDH-P256-Private\nDerivePeer = ECDH-P256-Peer\nOutput = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b\nSmallBufferTruncates\n\nPrivateKey = X25519-Private\nType = X25519\nInput = 302e020100300506032b656e04220420a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4\nExpectRawPrivate = a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4\n\nPublicKey = X25519-Peer\nType = X25519\nInput = 302a300506032b656e032100e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c\nExpectRawPublic = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c\n\nPublicKey = X25519-SmallOrderPeer\nType = X25519\nExpectRawPublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800\nInput = 302a300506032b656e032100e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800\n\nDerive = X25519-Private\nDerivePeer = X25519-Peer\nOutput = c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552\n\nDerive = X25519-Private\nDerivePeer = X25519-SmallOrderPeer\nError = INVALID_PEER_KEY\n",
 };
-static const size_t kLen38 = 1262;
+static const size_t kLen35 = 1262;
 
-static const char *kData38[] = {
+static const char *kData35[] = {
     "#\n# Copyright 2001-2017 The OpenSSL Project Authors. All Rights Reserved.\n#\n# Licensed under the OpenSSL license (the \"License\").  You may not use\n# this file except in compliance with the License.  You can obtain a copy\n# in the file LICENSE in the source distribution or at\n# https://www.openssl.org/source/license.html\n\nPassword = \"\"\nSalt = \"\"\nN = 16\nr = 1\np = 1\nKey = 77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906\n\nPassword = \"password\"\nSalt = \"NaCl\"\nN = 1024\nr = 8\np = 16\nKey = fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640\n\nPassword = \"pleaseletmein\"\nSalt = \"SodiumChloride\"\nN = 16384\nr = 8\np = 1\nKey = 7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887\n\n# NB: this test requires more than 1GB of memory to run so it is disabled by\n# default. Uncomment it to run.\n# Password = \"pleaseletmein\"\n# Salt = \"SodiumChloride\"\n# N = 1048576\n# r = 8\n# p = 1\n# Key = 2101cb9b6a511aaeaddbbe09cf70f881ec568d574a2ffd4dabe5ee9820adaa478e56fd8f4ba5d09ffa1c6d927c40f4c337304049e8a952fbcbf45c6fa77a41a4\n# MaxMemory = 10000000000\n",
 };
-static const size_t kLen39 = 2270;
+static const size_t kLen36 = 2270;
 
-static const char *kData39[] = {
+static const char *kData36[] = {
     "# Test vectors from FIPS-197, Appendix C.\n\nMode = Raw\nKey = 000102030405060708090a0b0c0d0e0f\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = 69c4e0d86a7b0430d8cdb78070b4c55a\n\nMode = Raw\nKey = 000102030405060708090a0b0c0d0e0f1011121314151617\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = dda97ca4864cdfe06eaf70a0ec0d7191\n\nMode = Raw\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = 8ea2b7ca516745bfeafc49904b496089\n\n\n# Test vectors from\n# http://csrc.nist.gov/groups/ST/toolkit/documents/kms/key-wrap.pdf\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = 1fa68b0a8112b447aef34bd8fb5a7b829d3e862371d2cfe5\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f1011121314151617\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = 96778b25ae6ca435f92b5b97c050aed2468ab8a17ad84e5d\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nPlaintext = 00112233445566778899aabbccddeeff\nCiphertext = 64e8c3f9ce0f5ba263e9777905818a2a93c8191e7d6e8ae7\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f1011121314151617\nPlaintext = 00112233445566778899aabbccddeeff0001020304050607\nCiphertext = 031d33264e15d33268f24ec260743edce1c6c7ddee725a936ba814915c6762d2\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nPlaintext = 00112233445566778899aabbccddeeff0001020304050607\nCiphertext = a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1\n\nMode = KeyWrap\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nPlaintext = 00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f\nCiphertext = 28c9f404c4b810f4cbccb35cfb87f8263f5786e2d80ed326cbc7f0e71a99f43bfb988b9b7a02dd21\n\n\n# Test vectors from https://tools.ietf.org/html/rfc5649#section-6\n\nMode = KeyWrapWithPadding\nKey = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8\nPlaintext = c37b7e6492584340bed12207808941155068f738\nCiphertext = 138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a\n\nMode = KeyWrapWithPadding\nKey = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8\nPlaintext = 466f7250617369\nCiphertext = afbeb0f07dfbf5419200f2ccb50bb24f\n",
 };
-static const size_t kLen40 = 916997;
+static const size_t kLen37 = 934972;
 
-static const char *kData40[] = {
+static const char *kData37[] = {
     "# Sum tests.\n#\n# These test vectors satisfy A + B = Sum.\n\nSum = 0\nA = 0\nB = 0\n\nSum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nA = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nB = 0\n\nSum = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nA = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nB = 0\n\nSum = 0\nA = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nB = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\n\nSum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 23f85668bf4d0fa273d8c7f63c5fee57811062a674111e295a73a58e08dd0fd58eda1f473960559d5b96d1862164e96efded31f756df3f57c\n\nSum = c590e57ee64fceccd54e0bdc52476a756d32e794922dca0acc780d2c6af8852351102b40dfb97009f95e019a5bf38e5d127aa78bc34425edf96f763084a8b09f\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -4b5b16252ba2355e0b87f01baa721783c403607a4c1b5652c09a68e96926c8e314fa580bf0ad3f8f59bd70f14df86a4676661899b54c79a62\n\nSum = -c590e57ee64fcec882fef3ffd015a3fd9024d8f5f6d53eb537d6abdb0ff5e76a8fb08d5feed113fc9e74745d957adf32704a08339ba42efd5746c5d478e3f57b\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 908007a2f3c551c58958d1059427a0391d4d768f61cb802e4cb062c778354ea3eaa8f0dfbd14ca8203e07ae6d07269b58088a39f7608c5586\n\nSum = -c590e57ee64fceeb242f8a0893eaa0d2ccc3dc57ec40fe917cfde66618fba678ce0c8fffc566d4e8c7944d6443def8014fe8ee410a1b8dfd06cb0b436619e0dd\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1999301bd9877fe07ca711f308b2f1bc4a704fd194ec4dbc297355d6285340d6ad7e90cb0add1770aea19737a06750c3a7a6fa0b778ca995dc\n\nSum = c590e57ee64fcef321395bba088ca0a867e1e85a1ea77478f8783e6a6cf8f3e582bff83cb2d7d9fd549fcbb40dea22ac140351007030059500bdca81413600e9\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 219639ed8afc21e052422fff0ae5583231ebca2999404b099628093e6540b1dbc20b9c495aa7229b5965b19a5fcd653b3fa0eccab567c5b5e8\n\nSum = c590e57ee64fce834a00cc6282cb0eef49eac7a8d5b51988cb49253ed85ae261c76f2327a691fc63eceab02614807048b2816cdb9b89ca66a17b6ed1abdab580\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -4e40fea1cc899fb166dbc721a6639a28be4164ef92545307ed934796afcb9401d75c18d23352471709fbd049c50740ffeebe5590fa2d959581\n\nSum = -c590e57ee64fce1a17609c61ce02f1020c6eb6e241e3fdd01546ce7247725589de32db95f36718d410f9ce9a94fecc8fb205e876fde75ce83f4d01e1bd5d818d\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = b7739ed1cd3e67cf541943326cf76b4476f767465ee53b94c57c83de417ebee5673809b3bed1c8bac2fc4bce29a4e36d6d2083fdea1c12c974\n\nSum = -c590e57ee64fd03e2d08c3d8e5110d08e3d36557d82e0e49b408337a8c9d4298802ae5f0145a9587531a70d2f8af932b8262245428b5c549817d333f2dfaeeec\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -16ca20955a9d8a64cb2be217c089edecc02a75a1ea95fef584925742c18a234974c0a16ee7991e80bd8d4106db385eafaf421ac3373548aa3eb\n\nSum = c590e57ee64fd1bcac71b5b055e5934ba15dd7f56370063369c36e57a6b753269e085d0f4d38bfb711d5579dd1d89d07f266e727b232a497d5b0d9bfbc02d8a5\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 2eb21724781497ad2f57babeea62a20c3ec5d1559867a0968d74351a337db12c17bc8d1d5446b1115b5441530870f67da4275dfd9f3e2928da4\n\nSum = c590e57ee64fc7860b0be6ce861bc2f099db7fb623912b7b0729c019a8183c669c73efe02b195483a4cd2c78244cd59678ac4d62f6887fe686a3eed37ed460ff\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -74b7ff38760864efd658bd6699915be16cc058454b78495ade8be42c9f7470ca9b7a43655e1427ab1bc35a5693dac424a6ed92d10f85a9bea02\n\nSum = -c590e57ee64fc3126776e79d9fca06233bd2ef5570a65e4521183627bdbdbc555e9118508cf63f519bc0caedbffd5b1a913ee8c3603804820a9ce54b1207bdef\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = bbf238886916ca0ba32e9def9f9c8a8e401eb95dea96ef02df9fc25a186e52fbee9ad42b76ba6ca2c381d12cddd4292c5d355341a80c7688d12\n\nSum = -c590e57ee64fe6dfd728dfbe45aee52380b5a00cf1e05e9f09ac582e2714bb589caf2ad038111c5b1b5573a45706ab1f6fd5d5a1ee7ef4a9bf186dca8a9ede12\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -180e4c29718f394424cd5b03b6bdb8911c57fcfe435cfa66d10941f870f8c5eb1e1fd251f14af03f23ccc1841f014bb42a545f476dfeb12e9311\n\nSum = c590e57ee65004b3e18a5820de4a6d25e7c3d310003e0b8716bbfd51d5f0f3e87fdf8e00599d713397255281e66ef419a9d9bb228e8f052764f5f861ccca656f\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 35e2568ae9f1d1dfaccfc211e9c0c6eec9400a0de880a94309992528d428e77772f84e21d0287fa76cc6fb880481ebc43ad20524f895f35a1a6e\n\nSum = c590e57ee64f84896a5f11f575d34b6001f27d4b4d6e7cd9485260629f8f7f1c6ca6f6115b98d776774295dde4d59cdbbceccad097a0a054b501bfb47d81e85c\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -4a4820a05c39969774f623bf6c03ebe0c56dc45bb46e8d1e6b32ee0fc3c6168d26c4d1c0ec7b81f1ea76f164ebd00b2a2a00aacf40175bee62a5\n\nSum = -c590e57ee64edf1b2b57b4cbb92d778ea6b9d9878a0374d4ea81691b09811b105bb6dbf23a57d89264f0e6c83f8d00fe00681644feed56e15fc81103ab9b7dd6\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = efb65fa7b963533d48c77ef80fc7af4bcd72222cabb6232ccf3efeffdde537ce25a8e4129b91273a8654ade9a05ba3dd73740008eec82dd4cd2b\n\nSum = -c590e57ee650e25da7b60146e014f472bfff9809aa8f519db7943f69d9ad09ee75a3427c6127cce7bd27f224b9dec03111fb066956b4903f9f9740cce1aa4ba7\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1138c1cb69317d3aa341c9a4daeba71400f56aae62a98acff1f9f1aec88a4ef01ceac74246fcb531738de63a94fc8b3e9c5ea3fc64101083a00a6\n\nSum = c590e57ee653af8752322840ed720f628f9674c81073b58372e49ef26d4a2a9d46a0391bc170336614b27849de98709a4b321da4ddfb978e9f10df29154edb9f\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 3e0b5c732ba11e1074f0c69e48b78d724733c66368a21409c404debe97f444f4a352acbaef5f077d0e9479ce067043b30cd393f3fdf5d3bde909e\n\nSum = c590e57ee64bc13634cbd149aae35ee47bde6ea3663f74ff300cfdb2d845f902f017586c6d4f83f08c3b4f0c035055d13fc9d340b7b9ed164432aed44e8f4d7c\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -40d9b56339ce561876171a9d37aabd30fcd47dca1171e5467f14c6a9f616b04d67a4abcc8334d637731816e87e35feb10dd3f1b9e50f78ae0fd85\n\nSum = -c590e57ee6477eb692705f8da1357e71591336907a5e0a6e39715088d53b2610882765357563fd101bcf05ca545a0c718f52879fdf4f80cb9a12cf108eca60ed\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0f",
     "fcbd9704b01\nB = 8501af88f0ea16b3541e4cc9eb2bebef137d8d33cc4485772c43ed28f54a1fcc2012b2d347c8f126d7ae11eff2f00c37b4989c5be30bb4aa5ea14\n\nSum = -c590e57ee669b662e37f5abf13d00d2f0c1c9a8b99ec546361aad255f375bc2742a3487c351c5ba00efef09c77331577460a47c57125c620b643e9eaf36a146b\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -19e791587fec9007654cd8e66ab13c609d121c54fcbd84c6c7d1d7e7ec8ea4c2f65d64c5fb6e43106b8e2497b89124ce5afbcb5672ea1f19f9c96a\n\nSum = c590e57ee681dcbf1554f22c0b1ffead917dd414299cb37ce6967ffec9c333931e70358729843c8130ac95aba47fa1fa5da74000eff25eecae176f093a4effca\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 320ded8a5583fcfeb53e576bcbeac4f04d7135d9e86b2d9d154943c3b97bafb75e3e45e7a913523db81aa7af5589604d2794974e466f3d60deb4c9\n\nSum = c590e57ee5e505ae4a2e1f25a1ae9b7b4d17dd2cccc09f2416d964e55af6d0d31fe259c160f87646a72e6732d5110256b3b35425225d622b81418435c9dd8cc4\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -6ac92340d14f096abc24dad89a0c226c8ea322f5d4afebd1b7197c3ad46016112d87f4a1d51b2691b684fbfa9e627b806d6829de8f7b960f92be3d\n\nSum = -c590e57ee58c3ef1582bf7a516e36f92b60f5a587e2c8cb071d1d52ff215854e52de1519fd5204fa52292dfdc397d8d76b78005941358b63a3e6ca41b0eb09b7\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = c38fe032d37689f58750c36fa28ef6bb22b5969adc3fa13a98650107d8a4bd74d3f940f6da545ba32fae7b42d9b64761953ef1bbea358a2885414a\n\nSum = -c590e57ee80262967da4038a143f8ff2e78646108f25ff7183444ba507d76f9b05a34c8310e682c05495d0863ceff264964dbfa7c064adf6d26d2dca6e22ab13\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1b293c4f2a4955b07d4cf9cc1d45cc155d6bd2a769636d3db29854baaec92ab9ec084850b924e2cd6286b11e7fc09071d99e3a1729c2dfe94b26012\n\nSum = c590e57ee85427f08e8c89ffebfcc05c73370ad4cb77696c2b2f3878e6f6df341d4d931b5097aba49f14ac0312e7da1c843d6fd08119822e75e6e7a8c7bcb7b0\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 204591f038d1bd0df9200064d852185922827251e8123a7ba48f4e4c296d943de71ad69561129a9ac2052c9d5ebb92fde4eb7d91615e7dcee4c6caf\n\nSum = c590e57ee051ca1a363c47a4cc016c3de7f7e17985009b545528289e9fbc9086f4b42a73826eca0c278b0d1b4ef6d74b9a0bfcb7855d40fdb201fbad1074b927\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -5fe04b754c3268a406954183dba07d5b44ea6f2b785ec328cf159c866028f63efb7342f2178753e17d0b0071445b9e91d6d8957adcf041ec8fb91da\n\nSum = -c590e57edcd6e9ef06fe33f3817ba3d0c50c8122b77615c4b8fa50c5514f113d7ba53ce057d487bcbc373c4384d07b29a527b7ef785ca609474879b42a9a4c3a\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 978e4e284013a3b8aef1c8560a5682c81d92c8253b3c40bdb5ed911df117cf71a51767e8ccc4615e1f70c290929feb12a6e244c18888617aed5fec7\n\nSum = -c590e57f0436bdceb586a093522eb1630e0fc08f8790957aba1875a42b7676f9ca936e8f6f3478d6ef5cd590bf6ded0700440dcd769496822af8015f0a6ba2b6\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1de6eefd2a87326445c3f10ce85dd7404e415333ad6a60d2fec88caa6fdcb4b7fd0e7a9ba659533758a665b451f2572cd3c9cc2ccb27019330fb57b5\n\nSum = c590e57f1df3f004d5e49f49fa28603b26659f1fd35e0d8d7a2753591dbc12c51e6b588427dbe3faba2f0c1f2f0a2aea9ba1fcb2fe71c6ff40555058d23c8661\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 37a421334ae5311aedbd9fe500b3b5d09a0ecb466d793e87f10e2875c3b49eacb5b5e5bf712b89c5c842a397ed5046125ba6fca9e084508cf8cc3b60\n\nSum = c590e57e9a4abf4572fa7c4c9f73e9d3fd1227646fd6d15b51924bd7a5d417b01fe6b4273eaa6ece387422b81c8116f29702d7d66d2f6e8c3454807b3b7d413c\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -4c050f8c1804f1e26cf6d682289fc1eac97870ebbb1bc8f986d9d29f3ad005b0337b8f6d108f5fa14a467060174edeca359b5bc92b7c7f509df309c5\n\nSum = -c590e57e64216c306f17017ac9dd7085113e16c83168664dbb77c7ad3ddfc79b09f9ea0c474a0b497ca15e7fb258eed9666fd009f691a3b2d691c2c6b22ba3b3\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 822e62a11be86cb4428d4fd11473d28707e6dbf951364d23eece22b450bccfcb2adbf2f1cc6223d9b46e987947e1e696ac3926a2893f3d052744a74e\n\nSum = -c590e5806ab4d09773c4f94a4aac09f6ed7609eec1d0bafecb09e30f032f706e9adadc191ff9e6d7dccc821f7a8666a590e521749d24912c5a5ffeff246f7c85\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1846501c5e8c58b1b3e4149a0c7c4209f888178b7be5bce3dd681861f40242241add3e89c93c8ffc613bedf52e2936ad3fa59c6d6fa8eff334aff3184\n\nSum = c590e58248cbf5dd61ec57994fc862ab479dc6cda51cc17356c45cef66bbfdd12f5cc421940a561581c123fb17483beb7a1cce2596fa9ca76e722a6f4621eae9\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 3627c270bd6ece96a435da25521ebdd7e6bcd7f2c4a16481e3a0e1381d4a60a4a21e457da38bda1a1b080b498cbcb1784f42fd2520ea12aa36cb19fe8\n\nSum = c590e5771a85bdb1f26c0386ce837bec4b0af5656496efdf4f134d875f066dd6d477ca8f87ffb275da07da4dd1bed4232849a526836b47f2d69f2d53b6b3e2f1\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -7cbca111f98936aa83de74469daa6f3e9d4b85267bd9ac749cda77c78863eef47ea264bc56efba80b9508b32f8608117a1f5f82628931d27822bc6810\n\nSum = -c590e571c76afad23439f904e8a80fc28dcabb6cb732e361ed3eef471be6fa755e3fe746edbfe448c1f289ffed7dfc01fe9066d780564f57f93abbca9b9a995a\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = d1ee4d3ff56c5752a23c2b09397e72de2821c5ee51f6f258a10c6efd9fc76d290846619f28710f85979498b50afc14fc922747afd669644013dd5b1a7\n\nSum = -c590e598cd5d4a59ff5d6c97c6370fb517f1d492a7776f90063b0ddd6702e37c60fc78bb12857911cea37b7263584d7dc815676de6b8880200acea154b59b08b\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -19e70d7b88745dfe68b9cc4f5ef23feb436e282d48f98cf90c3a54f92d0645bee3a05f7ad6859ff918fc90c62b19c3b0cd43edbdaca0dbea4971e9658a\n\nSum = c590e5b5829e6fceb77830fbe999a98127b50302fd0f6a86ea4aea27b846747a07e6fcf5457676e6446137d6bdd8ff4fb7ca747b650b066d65d7dc1e172488e7\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 369c4ea0fd2c78c2ccdd2ee92b020319b3c3c0283fdd9cd5568b988a2aad30431dd35078aafb5db57d571177fd0978bddac2403c180606dc523db43de6\n\nSum = c590e52a3ab5d5c458634254e2f672a322000750741e969d2f6cd12d172480ad1455300e3a0575b068b85d50b58f9737be13073188d0f03b71494bd0fd2fea16\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -54ab99f90d329c2bda29744db303b1e1fec530aba9dd4143a4158969a2466189c93820888ae04b2508b137f01af03eaf6f19f9da19ee87b3fadc4060eb\n\nSum = -c590e4880579ef7241bde94e8c7847badc705f53828751f9975f0e66371d2ddff8740b143f32e88be8e686e2bf5a3ce03d864d7699a813b1777b9239af242c7d\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = f6e0d5df5f494184e07ff2789b494189fbb6c7f04d754f066af590bc6f6242aec332f315af601cfb76a76d4a7270cb692a0922b6a3e8556d922a4c1e84\n\nSum = -c590e6dbe54098694155509e38c61d503ab7e5237d2cdfc2b87fb57e3a8420fe37fe50a0dad4f0eae3d38fad6198e4ecaeae183a12078f53d09ac8099c715242\nA = -c590e5",
     "7ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -15cfef0c997b655e26f2c5b5cfa1505fbd443dd9d7babd1a0ad0dd636aedd4796c968aef2af9ad00d53fad15d9a005c61996f3cc4fe70c9c83dc3010741\n\nSum = c590e906254d013be2021ad591e76e26706a6815b8c484b6528fec65416e1066957002713e1183f1005f565983aad7aa031e549e6fc57094ca3e4383e7fdbc15\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 3873efd326a5702aca6857cadd04ab87ec67f75426f45e1d79414c026173ab94899cbeb85b5b75bd4001ce3505754cc9dfdccfaa63f6a6d43b80e8d7114\n\nSum = c590e0e0079190d7afd80acd6326fe93cc00903318608df31ee4493d11271dac7291bd142cca0e5dd7dda59dabd460a69b7855d9c2acb5f062de76665e07cbd7\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -49edebe3df9db276361a943c1c259b1591c20eeb453edc9cb941b86cca2e824fcc3455befdd7125dcbbbaf326ac12d960c6e01e1464fcf289657b687f2a\n\nSum = -c590d9ae456d66c1b132d844eb223867ba4560b36f53c42a616cf8cc657e6d252f813847fb9fc50127227684e5c0f5cd890eceb341d21e788e42f843e9b64080\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = bd0a0e2680fd9cc95ea214887ee6b6c889bc9fb7e1cab411c04c72f7d2a2b35818f7686393a21e10bd4810691852542e7ed60f8abdcd18e0787efba0a81\n\nSum = -c5910498291472fe1d0047d5bdd9e46deb3f26000e943fce8d83d700d9ae233ab3a28849bbb346803da142db6a471e9f79cd49571f40dbc46f7b727a4bb3016a\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1f1942c4a42c9200d9a6b16f2417c58d3cb0d544fd8780d5c22fad0038eb58ebce72498d4844f49dc082037f974ccb7b92b67c76116f0faa72ae7242b669\n\nSum = c59112d841ea109440e78563d9eefef201c81e86ae967083f8b7db80d1eaf58551d30519ca6dd79164fe69a29cf1ba22446cb2999f73292241005bf17b37528e\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 2d595b9a41c2b5e81734cd843e9bdc16353775472e3cec09c6afa53d0b35f71c4b425847d9561bfae749362a32cf961afbf8fca85ecce12f5c25a1c7078d\n\nSum = c590671f890ca06c74ac6d2c4d75aabeaaa55312e85a5e1ea9cef0e08e154e2b090eaba869e9f6e4a47ae10b9c1eb0f6ae4fb3ef12b3121d96066c6c8e592b6e\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -7e5f5d432e6516530102bef515977b0c963c50f4e42862df23f09e989c2451a80e2f083c0756a488a14dcaa8d65c000202b19017b837c9ca935f4b171f93\n\nSum = -c58ff0ae92ab03072154949a7143d45278ef77a0ba71a785d5a370e0d30a9b4b4f7e96a395d13e6afeebbd717365d471ee56ba11c472a63c0532558104bedfc5\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = f4d053a4cbca69aad9949b26ec03acc271ae7edd9ac1370aa3f059a34f040b382333dc54bfd04a17c4e7f361b2e0bffafc8ede5824195a9eaa4ad4b16b3c\n\nSum = -c5927a5fcc3b31abeca3998ad99c07626112288a6ad95b24929fed581040757fdce73881c48b02daf09986ea436a3f5ceb6833c31fa2e1691567601a26c7a6c9\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -194e0e5eb62da61a42b5bcd31470c3b603f3b318a18dd85f1d886e3928b3082307eaa5265049fa7960490dca2b80a3d167d227cd81713b596604e4d575bc8\n\nSum = c59395e94d495451e3fea153f3e4361a088004a7d5426c1b94aec44108ad6f5cecc3a80dda0cea9f51b882747258137e171bf021b4fc59f4dcf0106d4ba952fa\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 2b06a66f9858058ff3324e77975c3e2ce1b589bf329d48800af6fdbff850d920cee3667e6ec6408b5001b0b908c2b68ca398112318f9f7d1f10a1723907f9\n\nSum = c58bdb26c0fd6766f3affea389cbe7db25c06d5d56356d3d945347775bddf479ffc9e279e7d1ee88eddb239906749815ae4502fbbc6fe978a001ccdafd89cb10\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -50a582552676a974f6f8b829ed87afff17bf1e319d509785acd59d0cff5d55aecd75d8a540fb25b285ec06052ef3d000cb3a4e65ae0dcbfcf32f0dbe67ff1\n\nSum = -c581afe9b7ae86d4b7053f19649beea6cb935799a553f035f9b9a7fba6d5559e4ecdcd1637c73c8052c6cc52ee1c28d1e5aed9db7261b7356afd6e3dbc213684\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = f35952ea147fcd3fa2f15a7ced1af5a1e91b593fb521112f46cd585d894b10be8ecc13a5ec1baf63cb60678ab5e80c8a2dcc53069131ff4d3918e1d4f147d\n\nSum = -c5a19f36a65a6a8d52a53a63f99a1b957d6e376b7010ad14695d78d67b0d7c86881006188bd27bbf205c8c9c200dc8f5c08ab6b97dcd512f6cb93ed9a361ff9f\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -10b9b7c00a9bbbc7a5cc34ed2f5b3f57bc4e1c36c16acd5caf64054e5f92372d594c4119ac7d83d7590a42b94641a312390018db0286da0ce83f0dc9f1b49e\n\nSum = c5cd0e5da24b67a894402b0eee5dd586ab70e5beb0693e263a54995193663a9b770141379c1f097a49d1a889bbf0c348c6f40ed50bd7bdc11a7869c6106c6d80\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 3c28debbfb98d70940bcdfe1f3153085befc6f7719fbdf2da6848066b8504c1c4a876029f90b3f00ce263055293bf618a25834690cf36bbaa769fa36fc227f\n\nSum = c54e2c560a00226701b76cf03d5de27a8c69b38a6b85dad9f7c903d2e87f9a7d247522e72491460f6a529e5ca2aaaf690cb238b873ffb49d9fb0ecacfedd4e90\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -42b928dc4fac6a8948013ecf0cdddb994835c4cdc9676d14e510fe442e4fd2364196f04d94b82bdeb0e3fcc41cd7e9a19f7de82ecb15b7c020131eda92fc71\n\nSum = -c4bfb037f6e6e861efb090ee610c33e7568790259f747dc6e55d442aadd68c0cc93c7617f83980e8813c0fb7dd28c8aaca6ad8fdde5d2bfec9ae096faa9ef54e\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = d13546ef68e66f9b4edd40ab5e8c6ecf2a592999dac4802750d0a67ed75e42917a43bf79ec7d52c7c772a1899ebea7e3e6dda2c46d9e569622f65c2ed155b3\n\nSum = -c6aa2af8c9ae8be4aada83f66b7f31a8bce5e92c67d8938424a1405903e5502bffc4ee1e333da4bcfd0cb383b19a566372f877a8344b66dbceabc9786dd0e4f2\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1194579e35ebd131fdb15c75f1471529733ffdd2e89513d17f32b87d73765dca50e3446c117a681b409312a4ad2cf10c4a6c10791809c866edac9ac946099f1\n\nSum = c8aff66c9bdaa49eafac0f65d3ddff223b7a5471f7400431ca3a54615d600fc4a163f8fb648bddb5fd6915db1991611805040e0f86f152c8fd3333ef70d632e4\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = 31f10edb58ad5cd24aca136c7733ecc15c86b22bdf0c1eabd8c3f9030b2257546ad3f23f265df7ab4659381b2c9d9c556b2576ee42688739d6234239765e7e3\n\nSum = be1b6eb768e2cef388eebe31f9b21e51b38b351cc8175eba06d49eef04c2936f32167174dcb82297fd4180d0afb5da2c455d158c7a5bf01bdef8c295a4f20390\nA = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -77576c77d6cffde0210affd12b8a2047226b4327137e38d05d975e227eb56e028a04862956ddba34bc20188b711ad2668f4a114286eda3980d83d36347e4771\n\nSum = -ba32fca1d5cc5f31ecaf5407f376d3aef9f4abc04fd4c6893721d3e50e9141abf356eb2ff6f7a4f9b42983148670d2918e1dff7aa7ae33a6e9dadcb708b4f9dc\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = b5de8dd10836f9f9e501a2718f3eca72bbd3d8ee97a7bbdd58c40ec1e1ca8a3675fcea77b2e594194d9ff44e056b4c12033b725fb1c96ae75f62314d0bb5125\n\nSum = -e388afbf17c495f86aa7298a45f848eb57e5baaee42b1f7de8c2311bfbb8f74549712c05fd3bd11ab8874fb55abb22a37ba3512e733ecd5c472842e8e6f7b179\nA = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01\nB = -1df7ca403174c726dfa7bb5b398d88953233d15faadbdd36dc141c",
@@ -2454,97 +2429,146 @@
     "b8a29a9a10c0d6a41cf32b5bc40edd7a1d97b295c63aa62c30498f15d70e427d5612ec3f6a2c1f2997fa9283f48018435fa6092269dc2e4ad524cc6da9689302f5c398d79e2b2d19470ea8240db9df0bc0bdc911c4d53f4f24a7ce44ec76378794d16d367434b4f8b6184c7651db77fcbebb8fcc5d3a51ee9739922cf20d4a8888139fe4669a164400\nA = -e3c4a10a64b7e67d786aeb81bb7ea14655637ce963f46cce59bc0cb6b5a9cb9c92afec3d527119db97bd2605d315cf28198992b4b2206e5616d3c560bc8163f56cb1f5626a7ac6d8427520\n\nSquare = 429e4283af7f895fe732ee88e4904348ed01bf579a93cffb7aa8e135d41cb9be218f8b9a9cb4f556124105cf042de51f34c8162fdc7a981de88e005a014149c955068e87214c174daa40fbc618c536a6e507ebd313763fba197059d68c69bd39933d614b2c32f235cc955e335c4a37b9e98cd7f98c7f26ea2da932c7f82ffd95be22a7741da423123f8908cb188abc26afaf4ba6d47b56e11\nA = 20a5e2a911627544219a1639c3321bbcd6192a32129b248cf62351f85b7a719cb275a4e44368a74f4d1a307ffd27ea2cae4d8584a57070609a30fb4e365564908f3d501b53c1a54f0e37745e9\n\nSquare = 9bcc8d423c3fdfaaaabe24a910e6ac3619eaa15e23b9f317c844d39d164c952fdf5c4bd270a83f3902e54d3817fd78c96018a706c1f652025dde0b98afe35597e0d8782deaeed23337ef6b3edc9317d54e3c8a57e4e7e2695f9d2681bf82927bab193ca1f135bd0e542696772f08520faab61fb4ea6ff0d15bb91f21e68bd7f084a6b8f24a47ecc30a779ee86610387b29a1de94de517f81318001\nA = -c7b60f4c355f2ca3937ba3c124eea2cd8d3536226a44afcaa3d17abe931c09ccaabf25a1986b172fcf46fb02a0fc36f2c163b6e42cee047c54ab05e9d30f03f6943b9fbab83aa6da12d7898c001\n\nSquare = 45df25540de94883dbc182009c29fec43627d3e5758e6a07cf40064e0befa0df184528a84757b445dd079c2b0feded48b651ab18b4bede2a81796be45caad0125c3692560d19cd9a6c8c0de8383fea0bc1ab46f6aca4e9c36b26575cff88fdf1eb1e13182308295457374968fe3a9ca34c6acd24c753fb84d41246614789dfe154faf34fc684cd15035dc9c1c6b0ea171e089e0f3236840e355bd123ac4\nA = -216f8a9a3e54d4afadf368c2693743efd3eaa4cbda7a87cd07f5b1a713eefd2548343e7f091ee4d9d6ed1d4343c06a0597db0eb5194b91bf2c858210557a8288c1aa7b0e0607a24dcff9de04146d8e\n\nSquare = 5cc707d97eb107c5c40c0f19fd432cbac9855f280082802dbe4deb45bfd193ac7a9149fd12c4ae6e9282411e2f1f2ca92135424f215b800634092ed4ff2859d16ab9fb8619ece41b50f8888d3e13773d38789e19158e18396096dd57fa5470f50b391c22378d980e59b4585f013e6db52c1e24c14ad83262fd37d42f52323896f7d4cb3e38868abea8a07e7ad3f90512eea001c5147645bf00396cb0e7a553f1\nA = 9a1d1b0beea76e7f32bde9f4f2c8bcff9094db2d32c04fb7ff43624b61033646e482aa0fadb9f8b4225b47121070b4ee5d6818d3606ed775aa631e0ed42da68c2a09dab26b6a4d09ac226cc09321fed9\n\nSquare = a32fd053eb90c365e77ff47573a24add3b25b4c301f4c662dfc1fa635af8e18e7947381989b37a9c9de2713ca438b9f85890b7b160fe251933aa7dad1c3839d502debb42ddc927fa0e9b40c80dc3d408889be567699a856b1c9cf3a393b3b818432e95feea825c17d0981b942236b3779f2acaaccaf9a5817ca47bd03045fc4de454d8f1d4377e218c5f7ece369aacc35369ab57a71652dd42621491834119afbe729\nA = 33190b787a2c3327b122d1f5823bdee5c93b19b586ce1bf79d801a19b2558aafc8f6274d0908bb7a8362f7f71d3fb52b8ffc87d458249caba7af3a516ce868e8a620e3126ad43d6aeffee11866fe77677b3\n\nSquare = 74215d33fa398e21c34034af6f9c7af6a3e01982320ec8cf23074a938f1a31543f80e6aece01de247668fe67f276cb4411db27666e1dc8fb2bfa4eb68cfd3563167d1ac4efa3361f920d8dd0fbb7f06362167f5ab5ecfb72956c20db934f67ff1c75aabb594c853fa61f43d219a3f5d0d45274005e3b167cfff5493b0f26d15f85d8e906a0a6e7645eac1f40c6dc637e6d1e061e5b9071a1227469cfb2c0f17ff983684100\nA = ac6c0b9c69785f35dbe244dc85a54313ef836ac67c853531ef5db45b28835ffe61dd258c5528b0acea50f5aa5c0f5d08dcb8d82ee19bc432fa8a45badadb50693fedc1cc79a17d63aa73fe9597f1d4ce8ddf0\n\nSquare = dce5cac967c47b8a58ed6f1bb1d1e6185e849400228afa2bfa05b9c2dd327b04a86f2a4da2d02ea102868ea0c4da0f3e5a40bd02c87a08aaa5cd8d9358b3a5ebd8c9fc2dbb1268c261f46d6717b0307b993deff0adc8190d32b4f2bf695eb2cc74a6a9a712c5a621c673219ff8a24ded0997508f8f9eb1ea872008c46e71fa97f55b839950e63130c38b49c0ce3ce724a0e8faa9738d2e28ce6e7fc7eab62b3561d2981f314f751\nA = -3b735400064b15fad81b08362b8557f8318c20656839ffb4d2513512015036ab0039442032f1cf515f8c10c9933afe4206a2f309e933d1561b06bc665af2f04f4d064e073eed2280053f56cbeb137a9482c0a077\n\nSquare = 6b619bcaf632f0d8b1d715e8850c0cbbd29ac6373a9a5e93dd1bbd2b82744a8a50a7446b48c6e215911ffafcda9ed7becaf5d26b7d6df7dc8798d53239f62a482f974bdb654750def1c941c49a24fcdfcfe73881b556a7b528d88daeeaea8d62b357211a1946c81cbf0819ad8d0188f60aaaab4ea2dfef7e9012ade7abeaaa4a23d7403c1248c36aa26b43b8e7de8a5aea639a0449f50359e9b4c1b125a548383af33703f8dfbc2528e4\nA = -a5ccc69663a8712c15f96e6fc746252af89a8c2a6317caef905dd2d8a6d4fe878ac7aa66cdb3c3721ba7dd36da310753dde9801b31d759339ac919a464ab52541bb2e0dc938752bf0f1ff7a9524eb98340d62576aa\n\nSquare = 77ea5b715823045afe13d10416dfd46a511141a7d1279ebd624f1de428cc04a4f246246e65c3f84344cebfa32864de9264b2e54d4b3010c4de9d3e6a27aae8f5f9e9d8e49fe26b73ac7e65bb216aa6a42db36ac03d749b5dc04192df819631593202a58264714628686507fc5655f169483b0ffecf45995cbc12faa105895564d287a9f4b220947d6c93786c85b2ee84a0a29183483f7c241d6a67fd0b1c38c7f74421355a14c6d9ed5720e24\nA = 2bcd67e6bde3f54c4ce0ea428418fc5c97272217c6c7de90549238ee322810dcc1bb9385967673aa3f9f5a5c05d987c6445135cf1efc26b3c17e55b93cc052761a77c9dcb5c22927b09e90a92e053ec1bc799bbe7597a\n\nSquare = 40d113460ca3e70545bf3613c2ba5de5d8485641ebf531a43b6b8bb76884ff4f348727ac6606e026981d2116ef1e60d4b37b44ed7e2003410d7d636b58aed2f92e962003f28342aa5f059d23b3d58a1ddfb47833ffe1d1deee0a7e78b8f7d9d6487f22376664f1ed9ddb5ee3d17f43afda296bead11680fd17576a122c2599fa9802ddd84a2115f9fda03aba898f66e303895f452077c920a322b6aaa0965f51fbb36f01b1d412c6ccf390da050d24\nA = -80d0699a46619db033461aa6060983def7deeb976d1a71f5c6ddb85e8b46dc70b7ddb1d254971d38ca87c7ee3905e63506c6db105dd683375f4239523cbf1874069266c2c0f4b37edcdd261c51088081d25813758bdbfc6\n\nSquare = ace99f98cba0d1dc1c758dc7211aa4078a2aeb6d3fff19bdfa6981ded0982b15bac792e6b542ae48a86f9b40c6de937e402e230fcfc390b10c3e60202dee1337ab39da7a342999487b8d8b0e494f2809cd1bfdb39209da5daa590f78ded211b6bbd3fca9013300b951d8906c9ce8d1c0dd9554d5d1d352f9784f822c928dd9700ef8a5fecf3771966abb1dc6a70b301461eb6b6087d6ab80a4b624205489584224cf6578f75acd8091fd621d02306504389\nA = -349936d60c9d77a0974dc8985930d8674976db6b3cbaa067554ca6b30b1de33f2d4e1c9564ce102ac6387755aabf42916f63632a375d995913f9d45ebda54bee3fdb7cedee46ebb5c8ae7764e4de323c17c797d3b529230cbd\n\nSquare = db6c73be2a59bdd35dd312240aef18dde4231c72aa28551bb370a87dded587accec2279bea24c930236f06f24d537fcf242497aafcbf72f085fd3ecf030cd750fb382efea0f82ad9d3195680324d73fa99d48802d085c150164aec0d29fdcc3262264bbe72311f89989cc71a4afdac6ab103ab4fbb6e973a42a1f8711bee463d198f727dc7bad848ff8fa77cd3b2f612d142ba46e95bd79a86a1fe4c2b8f9181be84825d05989695842113828a83b826e7d2c8c1\nA = ed01dd49d2e5d51fd30e9c578259cf107771b4ded6bf21f8b9b632fd360e34da740e0b1af6b5a67789fda5a44025af0f1547271ca8accc7a975d98ea7ec3d41c9697018d84ffb5d49b88d884ccdb011f715a199ddc44a4109261\n\nSquare = d6e38250ab89ffe11abaf8c5d07ba11e9053f1924ee1228f834111af16ed282389d04330cb0f47dbb186dee577aed82878ecb065b759312eaf167c4698eab5ed03a8657341bf5fb14a8e28e3b443a6b657c1f4379ff2549498a33922ea84f1fb19d10866fb0ad07ce1cc44c93cd4d9ec6bbb0e61c797750c6b5d7e8d55499655dde112f4747798f0e985fc2b937a44da9b04c2dc4b0816cfc57da1f80179db653c1ce287e786ed7eff7ad6d1383fc6de8c941d4af7bd1\nA = 3aa2e696ee570160b2a869c3f21c3f223959a185cda2274feea1c829af2234c70a504c959bcc49fe0313f4f5ffd27448e28aa0fc6ce24f36943d334c626459d7e6017339e787ab074879ebf697a93ad93835d69ab09294d007a0837\n\nSquare = fc39360cc0fe040b6f8340e0728c650e5e74cf1664f7b301e79986fe066f36e8df34d38d1a06b74a1bdc76867baeb3f39a9161acd200bc7532fa4aa0ea829377659646f073db82ee044279ae5fd797edd37d3261970819589853cb320887a085c4011c23d0da9b6d6f1b5911bb3399146c2912a967ab3b3f611f0bd52e00f418e6a6f0297fcf5c4a1f71c6bb8cc8e1c76694bb7301502d1d00c8b6c05bfabbf5d350590561abf3e2b1a82e98b56583e2e4e25cf707320a0e40\nA = fe1acf3d7b54e718c901c53f365894c22c8bb4182fee8a4c2558731e01e1519bfd1bf6e353483b8c4219453fa66f06063c6c99050068c15cd13cd1648ffc42b5badfc70f6fd4a0a5552fe637e54c4f92ca45c60cf9a0163978ac08d58\n\nSquare = 9abf1324ef65c726330f64643a024c466fad37604f4dd3dfc404d31c2a430fcfaa0c78283666c15a094d494b96d3c12de6e29a34d2c99f4f8cae8217bcd2a989d59807ac68c46d60600238a86155de499eeb35642d0f581045481b40e4f0a76905f9b6bc5b9585f77f8410b99333f7ea983c3f29f3fe66ca7b793b784a5a6a4f74512aa4385dd1e996832b1f41bb3af965be58c4ac5e867cdf8dc6a4f9d20a6f1e16e153fcbb45ae5fe8a798cb06a4ffe467d6b6aca2b31f335a344\nA = -31c243593ea611dffecc65d1439db345b2e89941113f9792c",
     "91a76b4890db6e4dbaf1482ee812e295d27956e48d07a14de38357f15b5931c5cc08d1d248df7bfee1cae5b5ce98984c5043a3e1a2b449ba1671bf1cfef91011e12bab94b6e\n\nSquare = 66aee3e4f43c672e0478c76e2092bef33e7c60afee5d4c7defbcc5c0c86d8fe956c90a740cebe604224cc3f518463b1208699b8ea2316315474991d0f120ae905a67028492cf46fff2ae244869db2a02d06aac6ac6eb054fb3c14c756d8a3e7ca64f06586e3e86e4477f185ed527a8aea6a3c741f3fd4b64a2ee77ff140190260c431cc53f411fb227377c02f85d0258a75bf6d44dccbb8bd04ebdafa115dd55b176b6eff5567e5b1bedcae15110826574053681fe25a695ac4540186e90\nA = -a221dfee30286adc076673cbcebd24a41a438a0a7a6a547c75d33149cb1a094a8425feaa5a23cc234a722db4cca8d5912fe1dfb6db4e92bd87c12f0d06b6d954fdb9b172955412b2eb5c9fa3b4df2933390384fd1f929a2b1a8dac479ec94c\n\nSquare = e880f8655b51739e34393c3e6d69d63e0256b1a887f7e69f40c78d21133b17e92277a136f5e37da2533ed599efad189975d22ad0340005ef58db0b471651d749dfbd48b3f7b3b8a42d4677048a855e99dae6c729d8bd7eef86911feca9f5490dd216b06d9e8d1ab695c1081e72449baad28dfe113744853382901e6bdab5413c67c52d6cbbb2e0bea711edbb3a219a4046e8739c04729cf8c8210028dbc4087737bc6c1d7e0c15ecf16774690168342b1372d3646d4d8696384bc932144c98529\nA = 3cfe075d4525a3c780d6d05f7bb708b2fdf7277a0f9967e0a209fee9d42136a0bbf98660d8ee8cb4720a8042da09f6271c45ad13db24eaac465f8207f78629e9085c1c890675f441c78efa38e5022b1b80afde5e3fd08e55648f2817631eb6cb3\n\nSquare = 8d6cf4eaf58099b1323fc598b7554b371f4afef5ab501dd162ab8429333d46916fe15dfc4ed6a99ca7fa7fc1aaa0cec3533b41e291fb7f69b560259507226eca87aabd07b1ae2eb93bb53f98fec508f051cc04db4a172901e06b74229c4fa3f550a81626c7a63fa99d41e46c2cf792287a5cf7bb68946971bd43c7c0356312cdc25e524665dd39a24b6464bbbe64fe8e87ee313b860639728a9143c3a6118bc8b150dde6c10a13bea637fa8873c393e6338319c506aec6ee973b4b52a272a74bb62084\nA = -be46a8072aa44b3bff0f90c81474dd576756fca624c15f55a17e1d0bd2842467ae000b04f79f561690c93ca7118ce17ecf830a8da3678c15436876d2a74324d9714dc8ad8181904be657d7f1da3313b78448cc06e32299a09ed59bfc1961e8bd722\n\nSquare = fbaa4fcf9800673fbd3a132305ed3e14f4889518fb56ab82aa5e9b3529b74d7f9a467626d68f4709a2030264aaebcf05c0a0edb511e81f357d85b79d925a24605f1bcd4645915bb75d363654b676266329df532cdb39152fb360df1b9500e0c296014289650ff77faa78a604397a82b34d16484e94a8de123fe720e514c88f11ec276725111563db91477480c3245542ec6bd0bb2f4aaec02c6c4eb1769030a31b05da3798c224c9117f7c38d3e98a343fca03ab584ec2d7e6db60fdc4273c3d8e23cc1ce09\nA = -3f74b25f2a9c4d8d977e69a4e067f9fcec281136a508e365b282e5fc3b1d097bc6a0f59f7827fb90d4890b08840a0a1919032c67448f8f1a771f785a0f125a4aa4137c154fdb489dc1099d57bfcfc75f4ca5e69f93f2bb87ed09cc0dc620d3e76ecd03\n\nSquare = 5135becca97d93dd4b16a5a1105ba3a3e3fe02bd6a7c3cd182186fc63ed4351641182a2727ab6715e9672458dfbc31aded4781fa345054eb4c317872e2af6d4ed64b2ca7e8c25e1e664b5349df937118632a64e4ce439ffc625a5ad3358270dc83fdfa73c7afba03406094fa36d87517e5e2e1fee5526fd2dc00d9210a0f6c3745b3d4bceee5f8b03d976d696c57a09d1e08e4ce780972eca4f2ed6500c23bf5782c31f13059e48246180fd09db693d2fb5d48d51846ece8beee45cef7efc87c003b44d7b137a900\nA = 902fbe2127354a7df5cb7fd057f3d080a7bebbdb83c86a50560b8c287a37a841bb9c8421c63d359078d2948b6b57559f98fad8f8014f93c912cb70a6701c4dc4fc5e88aa413fcfb685c32975a8b72424742eeff8262d28cebad00c5fcf88baeafe8f6730\n\nSquare = b5976cf6a6560412aefa6704b126e0d987dfcedbb4da436c08ce17b1bf1b6e0bab9f934abb5c4186a5415fa38724fb8fa341d381319e7d768209ab108c8debd99075d31deb3e03ff7d23957d4f3204d543b7d9079cf337be3037b1cb4908fd8c104d92e52f041b4cb27c045a741f4d64009980e8d27af75d9493920ed98c7234777592d6577f2d1b3a0eec645ab4cee2f28d9e4efd3e4514db6796487ba68a462fa0e316e1420d6604db2b901de46553546cab42976fd0d459afd81196275cd88ec4dd448ff331bb35499\nA = 35e700e034950bdd7318d5b3c17e90a4772ecdacdb055b9391b31538eb823fc8a4599f029e78e4fe5299ba1a423a449dc257a431d189dd5dca275c02cc1f12417e111c73b731631d8a1741b907dd8f24de226ddf9e3044cf4064e8e51ebd55be774be7ad2bb\n\nSquare = b7de0f73397893a97928e266bc56299cc8d43b16a251992662646072b58fa578ca80f7be1e12619012b130e9514be803dc166b12ddfd26f558d36c2053ee6209b01458379e49469753300ef20f6b3dcd5383b121861c76ab25debb28c448ec33a81250d05f7eff80a5a4133d522d270fab29f739b607395a77278609aa5e1a55ef58d1d48492b71ee30a24a6505aab1a3ac22b9d143c9d6781fae14bbb980fe3a99dfa9a1a406611d7d0304493342f53faf5fd79f9c96b9583a219a1b22aad02dd58f32ee98146b3a8cf054bf9\nA = d8f4d3bcfc7eebd7068b851858c3668ce062a834927e165679b49132d4f780ca682876c65c7cf2e7ce34ed10e43696477da6301d13f92abb8c76e2424c4bc28a6565f15e59563d607b852dc946652b68fbfda1c3200ecc2976400ce7296b96e75fb059a4c8eb5\n\nSquare = 5ec02661f49fb9807bb73debc3c6eccdac1df1735e0d61fa7e0eee07471068a5809796a2af490c46a77d61f618b44a3168dde67aae1cf9e530382411056958d55bd18f0e76fe2c31c98b00f87fcb7f5691ed5b65424f82204156dc361ef6dec5d44cf690582599b3994ee47ef42850d5d2370a4169c5f73942657f85422ca24f66943877f73af493c865fbeb29574cc1cc730e9bbb097b598574f6b90257748e950bff867bcc01bf62f8df67d7aee1b6dc1d5db88826e86a3f9fcd8663e09cf8393ee71a09c43d0d38ba6ef643f4ab1\nA = -26ef9b6708a80d00f4d01e0f0a5546ed217085ff23519819ee89af430580ea1f086beb0eb51982682c6d3b922a2c92752dce63657836223a9d94964bd584bc8e37c6e30fdcaffbdb128344d51a92705e1c9f94205ca36452c15a08f7e62e0e02479ecd48085de8c7\n\nSquare = f6364409467a829abc2b13c93979dec84984caa12154b7cda2f4c8d91bf24ad7c45a968ffaac8d6722cc26e6aaf52dd29ea2f09370ba46d79684b7a06faedcd17136f35a58e5b550f3a2caef7b195d8409914fedd3c3154101bd735155098e8b10fbbb1b2e13555d2ab5d5b52b203d4efb27e498b240f37178f2e89b413f94859b0e8b2ec10b926c8c0b6f2937ee2d0355445364841c7e0539f7073b88c7d568edf1b253f3c10627e22c2ed731b7d4d199449cb0b5e7a66109932fe2c9cd741d75170deb9f98469049549c10a7a622bf6e91\nA = -fb0eec3246e99212879e51b17ea6615275818ecc5ea3058b13dbaba2576ef90e1519e3629b09fdaeb02661091c395c862b848f6326b9f536f7af45718c4412f09f19261b537bca36742d3ec66f964343516aae2ac27e249a15beb545b447e37b4062180f6c82809429\n\nSquare = bc4193ecb5dac900191e02be06297106155c6840c4908fbf6e41e9aae137d53c3d4ffb87f334f49837dc4ab7a66299994e4f5c9bf6ea03e7db663bdef066e94c610580a8896a9ae9c8f6587eb83d789683f5d6391bbac3a1dc1de60b4108428e6f5fdeaed6cd3e74fa01f85c6368023b61a413b69b14276b66f22653491e4f25790985053d075387cb13c79dcf963b6d880d01174314921afe1cc700c02efd2979dcbc59c417a6316db9ac45a2d60d2a036571bfbd75f9f5e42048ca086cfb4b818a9beca4a6e0ed51afa320ef3549151fb39e100\nA = 36e1f16043b4c9b4a304496c39dd63459d6521d2ac92916d348daca3f972835973fc8d21b07b09d8f5e3197b39a8f3fd0011168b815d67c48143c413e169ffe0f56ff2cf8b6596bd0a3b5b7a6b9a14ffb797f350b7e6aa7020d84d1d1b8006850139795abe2c74f03b8f0\n\nSquare = 4cbb5bc1dd7112326e2c94581f19efc8fb25339a299fa9c007114c3a22b395e9d39a8ffe21134e97ad1b87b97e667ba48b2a40af61afc81fb1e20e8e38c7ba666b146016af4dff3faf5de306591e5ce6eddc1173fdda6fe241a9f2fc6e054c41e56d296f8954377df0d140096b9e9d6a5a23a231db4dfab0cabfb11190c7a0d1c55ae35203836d433da96ca7339682bac0a7edb8b5b4dc267c6e83ac9b67a0d0d564717ee3c20aaf52c0a750f3aad94a12537c6971ee009d0f82ff576e984b06c7f7b357f5c049454e31326b952af17aa62104780e9ca1\nA = -8c279ebe466de3115b8740f3ff9c1f605b4eaa75512d82fdc8ca5ce84e11a68688154fd603ae1d607807dbfcbb822a8dc259098842c6a7b7ec350be29a3daa20fd5b093a56692e9d42e7a389c4ad2122a74205f835e268c9742d09ad36238c34e143f6e2ec69c0f490d29d1\n\nSquare = 4f771ade09cbd1a033d2bfc6036fe46ae6c12acc6f2b9bd52e7781693fa6358cf93089f23d1f0ee6fca476a43093b9b52446f3a7abd72ed0ce9b562dc438822ffd84bcd898ef9d092f1b0b7ff89c4fdb33d8715dd4a0d68ec49ad41338fbb62ca87867d847a4d99310641a37ea78b04c85606069d0c0950484ddbeedac8ec6f95124e7fd83da4e942d40103bc14474f5cb125fa0b06cf167f076979948003dd8dc3711923f5af5beb5f56c0a48ac0c5240b62738c1cdb06b87ac3dfa17befbe938ddc7281f6c248c41a1c7b99b93f69fac83a46eb298a9fd8b9\nA = -23a845bf2007ba8480e3ece0a1bbaf8bfccba6bf061e3fe1d8bcbcd6c761e650891c0958bac68618a1f55b27d2bc6e1e1b50afc29f58e2e034bdda8405e5378cb5bff0d84efcb458c5428fc607597d89d589d85d90f3da4b89a64c9d1623b98b10518a6f2e7d2295c37527026b\n\nSquare = ab45d12a4e15a294830741f4b9d4a14cc7dbed1c3454612047f890211c749d92ae0418f11cd44acbf1585b1f7323b33ac9a4b13c44e1a7e31b0dcc1c6dd4eaa12a655b5de08f3b948270a152db7d9e04dc54677075797bfad6a9a0e3958458d40e3df5e15028954bae99518de4dd3adfb2ec4b38897a8a4e4807849e1416aa4040c95a0e49a8d2889f6fb0537875f87516c3723e8d3b46da8da855929c67c0eb83daad62ceced52b4f52d2bf1c4e34f26bf16aa7da3afe0f5df76c0858ed98f21e1fc3d01e1572715b774bd5c2faabec5fa3fa59a7a1f32565a4f1f9\nA = d164d875e1f766b4567e9228241213e69d6b6c58620600166fac56938c5d",
     "9643932d01f1f4a2263dca4b9ad26dca1548e4b5b7e27581a63375d0e624f4e4c99b7fb9aeb25307c61142760bc4771e48c7ce38f5eb2408def632096fe40b80d488fe17a455d80edfc1c23c429775b5\n\nSquare = 5ae4e7dc5727543af39ed3d5e9ac086d1a2220421231b82f6f41caee7b9815b4049aea0d43ff499c6c9e1f226f8641351d03f37731c64686d9a9ce68e9234d6a762efcffdecd42f81044111599963d9b6873cc20bf4c8284fae03d2e4f238a14a74df4388fdc80fad0375a5d0d974da7854ede5896ed2ab25d2b49a3c39093600f73120e4fd2faf75381854f6ae80f81b977f62fc72f1fd01c278d183544052b77bd753dd88ffdf5c01745521fb8474b5c23b0b7dc709bafeb91cee0863a0c23ad7192c43cf15fc181d629853cb9b8334082c915dd3d04e3a0a81511d2e84\nA = 2622a7bf45ccd3cd567c757f4c5796b5a0fbca555bd0ac2759c24083172d82d6a887dcf93d9788fde052cb20a8963cb6db22bf5eee6151600f9d1896a7606b11a1b100cbc0925bce037bcea57e361efcc560a9abc495d7f7f45831c6429ac8f979dedc08c304f4da9c0d4d687376d5e\n\nSquare = 473cc933f5a650a4ae358c7f486d325c0e20c83b54838fc08b6ac3ff010f7c4b6a609bdf472974dfc5abda0c6b33c5ec7dc4628d85cb4276108e2b0bc4e19cba135533b3d7bb6a94332aea3165dccb230860d2353166b9905635e606185b014730e9dcf2c433e18cba83859fb2eac4aabef68c8314ef86dec2d534a184ebc4cb193643add0897341690cbe18bc2e775327fd7d71ffc7ebc49bad83cd68394eb276b2e615ec430180303010a454ef73b6a8f02bc48a1fc8a32f8150ef1b733f07da752b8e808000329f4924976bc8b8573927f18ca7c88c210845de6dcd0dee2904\nA = 870b2c4b054076d0d02877b19fe1210a8fad3422b00905a6db748239b8e807716ed9fee0d8c25496593717917edceb5db57f9960bddc1956b6652868d6ace82827bbbada5ae8c15efa26fda22657126c6300906f90e8fabfd58ddf312ce0eee760e0090fac44f00378c676115cd0639be\n\nSquare = b151124402d2f04b0e6599222d380dcf67b9716ef50d2d9ded0b21521b34a7294171f71b41762511b7cca93d9f50e9e30083ef19144882928011dbb143807d1b88c55eea6b19f0c4180023be6da63a59b6bc027aff3f5abe2f65c73b2de1e71c5f4b248bc4547040764e83a860cb3f882bb8b5f7821f92802808fa37c50f2f94d8f56daca841f42d3362762ba843aedbd03d3cdda887f75ba92423965ab4256eb842ad755aa7a2af331b488186f891065b07f5a299c807dc24fc176e085a8024bbbf12f386ef49ccc91bd4ada0936b6de78088cf5952ae6c04f6916799378bc0ede0da4\nA = -35439da9e361700152a35ebdea253378a1febec5f288e5b2bb0bdf25b84751b47e4da5aad7453b70cfd6640d5832237d2115575c738482ac6036c5fc21a981c0a7f979c8d621a92c02166b777475618aa6362a0e225dd6138ead3b2766ed9785ee01e4950a863d2fa0b7f5cb4c9a108bb626\n\nSquare = 4ed7263ae5beb0069f24318b38afe951a5a058a2e960e67f086c9680d0cc6d713f943812070bf94152f7926bdab9e5908941261244542b832f458f05ed5dc048c8b9eb84c2a85efe717e257796b4ca816948a6c8ea209c0675efb2fb5af4622b44e36066593db01b17f4dee21d7c1337ff41436cd0e5a8d01e4030dcd3d49839e59996fbbf1d39bd205343a424f2395b4d3eacdeb9ed3235d8df0dd00a2573260af63db3116a7c65d1dc69684a05caebff34e3d2cba9d4869a953a7b1fce10ebd008cba021008ac3187bba846abd7b39a1b97c9c07d8080549e313dd58b716022de3c1920329\nA = -8e1141dcebae61d5c4d81697f001d792ee2e847c589816f923f0ed42bb4de0d8f911b8ca47ffe77f80b9da6896a9b42f0030a3276218868bbe1a3fa64fb0a577704339af5dd82e66780da6f58900da3f1d75ebfcc302f78ed66ea3c7a737898a29b1f2500686b43bae1e6571addd2842cdce4d\n\nSquare = b09f5e9472cbb75070a67d025957fd5ac3be89c41e4acbcd5f75780ca459562461082c3f19c5a4a416a668b0a55f31f74cf2ec44555ddc43fde64da0ba781adfac4520dd0f78d04d9d2fd33d8b49c72663a6bc845015523e2e4e7ccc69e5b748b8b891e4089420bf0a3f6032602824c7230b5ff95f85a688dcdcfc890af3384710a9fe32ecf9ad7c6cc5761f13079b19d7b2906c7e63c14b64fc88c6f4bd7c41c0356c777d35c3626d49db8cb2d1e89ce682c7fccc3a459b08c20c4e5fc3a8eced9b37d01bed5af6ce9baff0d2b435e6e62871fcb20cf9ec10d1897a5c76e73a441e07fbcc2d9f4e4\nA = 3528e6581de547de385c93ccf1086a17614f23356a918b25bc6d73656a2302b318963bb679c9a93357f4a4f614e74f2e5e88e9c8aed8a6fdd8434630f664ed15ebb6095cbff1593f188a12f4dd6087a85b202f6c24df68ac3b137406c88c5098faf47d1eeec0743b35baaec7dae29b5a44eb09daa\n\nSquare = 5d5dc40783411475a4aac7c1a1eb760f76fcc6ec68dfebb754251cf499870654cd309422935ec841e6be4f5a15078356235c2b8cbe1ae755cd6d814e811072bdb76156b83c7d2064a202ff90af1e0f88f5889e5729a3cffa9faf33c463b74d0ad21fbb4473d4d3ebfa8a52e9c209ded5ce5131b12b69747c365146fa17ee5810e0dbab992f9da28b6c323062484d62472232721d608cdb9b5a341a677e2d7a6e5a983247d9a4001e16687b489b10b18bbf205f982b7ceee27cc3e9c6641827ab7952373f15d36e5f177b82d7eebb3f5054e12cec82c5f520a2675afdec6cbf6235d358c2fe73344002e400\nA = -9a9a19fcdf11bba84b0395088c5d187d84d69b68b77bc6418f63c88bbd8dbbccfe02917d814f9e2241fa0709817a0c85bd554fe887babae7439d96248514c12d71587c906247b3e965e954cdd57f1e51f1979f73c3237509863169efdf281c1359488daad3d9eb990a50ecf4d3fd25d4820077832a0\n\nSquare = a4d69ed4c4c9c08116ec5cc49ad458f0fb2ca00f356aeb148f18037bc49621e14820f325af39f3954bddc9cf01de7ba1e443088545883a94c04ff41a7ed5f65676109c5b711b4115775489667e00aa1b77f6dee5ac5c1789bc71c9fc797abf41c7c5ae3e2c1cf82d5b49b6c0da25190dfa9360b99b2f63444d21ec6114038b8284bf598eed24a2ab2b9802d6edd5b0fdb52f60621a87a14612844ffc71ca98180ff0915cf75f47432f73d28dfd7a932a125095655f07f50722b1673df2cc4f7566a1c6035792ff3f02356b9b9d25e905121df768dc6a1884cf5483eeb813c1c009fe4ed043febd61800ba978a40\nA = -335b12e40bfe0b847ed6ec143490df33d2e64ef4363869cb78dec008cb5cd66ea671dba964a53e48267da288ef4040e06371e1209691b81df02f2c86a79cac85fdcbb6732a1e5309fbbdbcd899fdfed18518d47258c9e63ff7f116ef4a8f5c4867aedd907ccc7d222cf8087afebc108f2a0f197c717198\n\nSquare = 74dcdacc1a4f02a99e3642f54f9d917b117d2ae8d9c392f8b6dee53fac66ebe1680c8e8cc29f5330e0eed3f63d10980060799bc37b34c93dd7b384d4ba30a5b5d42a145acc412ae838d7b9b7137637546d1118f7cf3eadf88b785f0aa01da8638f027c56faa16aba8591b64b45dae6138c9a40309b2ad29c5029a867465f9c6de8fbc5fc4b0442c8a8946272667c7622454ed6f2a236103bed7697dba20db84b5154ff3fbc6b4b9eb67ee43bcaae741d87ee2093ee67defb8eebc4a4a22d97a4e2aa7d4c31a1c88abf4a440ba4e2a5e40c4d903ba5ee4d80b4e8dffb8864bcb9806e015c1ce16490068df87282393111\nA = acf70350e554732c1972903cce269b215e985ecb8d6eeaa67fd5398d0a1b57c0db63368c0f8c2288c3a0466e2b3db081106b90920c46462faf00b5bd654f7140a689b78ef656a26b82af8dd1988f166ea04e9aa777a094d892bc7da4bc7bcf0618526f496cddea6d67df7bb0de9e99a35a0b1b210ff07497\n\nSquare = 9668b9e40a8bdde3c93943a918ca71fa0009cb05a1f592b2bb2c6c6172b2950719bfd80cddaf45d044cbb6aa99715046088f40ec6812945885679231c07f4200023548ead086b834abd8c8f8294db28b203329553242fd2f778ef5cc5ed0b48c7356d8c2d782a01809ccdb6b012896617f11d963300e7bd38ff512829514d94343476818ddf9d712bc70cffe7f767a9fc75a5630e6250ed45e6831b4660eb49d47dd1b8b6a0dddf3fb3ff0e12834337f145f741f70a2aa43769af50f099e004269ac47fab79e060800dc74da88141adbc46c15c7330931e3a2bed9b958f78b30214f81a64d121f96fbcebf7569fec0cdc6b11\nA = 310e7a40667d9d5dc29744b123cdf6a663a1b995f62fa9d4d853cbae0dd23669f4778bb2040317ebf6a06ac6299b21067aece5c5c1afbe6e789d656745ad66464991cada0eb237c6ffe991cac4670bfc90eed5f8c75073f4f846ea244bca0e9502ff56f8e9bc9b6caf275aaef38e26566fef35329ca45392069\n\nSquare = 49e677c8b052b7db97542948542449af47e14248021f8d3d3f92b9af41c803072f71050f16dd848aebb270affc47e85427a7c73f227f0d63f140d0d293157af0d972eb5b38de494fbc78ad3a4c3d1ab40197bc4427752b6102d1ced6d6cbc9d7caa0d1bcc57e708535822180055ecc9d9667e0590274b778480a3720823e931ff6daef358b1a1a9092f1f05fbb5b10ad5707a124e8be63bc696f083eb74e5b4f0e3110de8f297ecd30dfd2bcb010dcad4e387520d3d00365fc51c2a3dfe064b1ac77a9295f66beffbe5dd4333e5cd823b0f36b0b94d66507b1d9381060980f62f38a62e38e5a75203233bb8d64089bfd100f3205f1\nA = 898b5f3655de74cec3b0fde2ab03fd18cdbcfc3eeea48ba39317d26917130c2b78e05237cb0454ece268f091cab699fbcd51ce341b53d6ec0cda5d0d5388bac25c6517214a39d03450ef8502e1675bfe8e57bb6086f10ce4cf8ce65eadc865b5bd8a00dc26394f3adb2ace609149e3582cf44246184b2adc0ffd9\n\nSquare = ad00f10fed55175159b2409dc80899f9113ba7c8099d0402ec0f520ab4aeeb46d36369494a4e6fa23675adb38148fd2efa082df5094c0acfb77a9ab6ba7a299298d69b04b58011c35325f46b765e580b5c05eca721904f1fcc355dbe39faa92af5c9a6dbc4ab80e62b815b45983d9506ebd52b9efa7a6b9da352d1e4fd6ffa81d3b4596a0c14fb825297da361461ff2240e4378340d2ae529932d78f3d9f6b3c6d65d717e66122e5f590c50ce0a5d81ad8e0f24e104c0913cd8d0eb2de4c8cf62a7535bab5502df3fba08bb4dfe73d89c8b00edaa7d5f3274be9959e7ab6b6dde54f2491728a1dc11fa8e1c6a95e67eb7617e9b7471ee40\nA = -349cc2a5658fdbe9ba5c350d3b25baa38b1ede01926694bd550d36883e53d8758e8f1ebe83e2f4560605510413a7d880929e2d9cbc2730b1736dc2689cf7bbcdc68a342b6398e547a9bd67cabe298796d76b98ed4c1dd9c22e36145892e8fcf2258529aed24252a70b6ca8fd2aad8a84becf7e1bf98b1e9bb024b8a8\n\nSquare = daa3835d3189ec9ade592e6076e76d441838077a9431273bdec02379b3a6ac38aecbbd57c3755ea58d",
-    "def8105ac28f2ecc8598ec0c4bfc9c1c80222fffc776722eb0621cdd8a0d55f08767fc2922282a76e529d81e4d6e21a2542b8c9a403709ed1132e3b52786b81e684591438fdddb5df2f0b72e6b39cd2db6c0cc55c759c2dc1b6ccc20a5cfd10c6fd345fc766035c7478570d4ac534db3fdb718e2bdad3d096b137bfc09a562043800957e2afe4fdcfe292881f6189edfce52370c0438c2822ce3b14d73b3eff32f7e5ca97e989326b4e3a8fa35544193f8590bbb0ddb1f914894ab87998090771a0be1fd23917cd792be86ea0b98e6eb24\nA = -ec953f1b7ba7d561edaaa23076987daf86f50e9a66c36f0993290549a9006dd9d424885c0fa77295cfe34fc81c5edce9e2371b3039ea18d8f998d1956196284e6d81eb1c62ecaa8cf3fcaca28ca7e64342803c8dc3c139080bdd4a1ff30d7288b085a579d9e90903bd363b48f2072bb6fbfbd9ba2cab30a8a63784d246\n\nSquare = b33f4f3ae453058f4e865ec78f0844bab7af66a97dc2f265ca73ae2232777474bfdda39e10652d7386c16f145272192af728893c3d8a8e92c60d77722b924c30269ff5a399a2449ce15e50320c528c22655ad06227ac4efe5a993179ec61c2fc9115f89d75b53961fd16f7797657f6fbf55662b019608a1d30f64a2c0838e0018b7526921fdd34fd462bfcb2462b7065e2bc7abd57d71371e45dfd8fcfcc00a71f7e45430820747c9a060b72e4f6d2919cbffd00beb0c31a2bdc32afe2cc540b38dd04a2b73ae5ba481a6e535f37a757bbd6aaa972986213afadfa47cb7a15a6f1d443f93cb0ed824a10b4b7d82cae524a096b65ccb39be3c37c07f59\nA = 358da59ef65f62f633675764e292e5a68879df24a4727eca1fc4d232b3a6d936976c92eeb11456b5e8c11319838c145c6529d2f3acc828e55b8274bfe9afb5db241b102715f8e8164e454ef39f13ff1b37cf367a5a66c4f743c750896b7c3c29026e448bb36c6c06b0d9a3d048086ef0c3cd922a02e794223f388b5d646db\n\nSquare = cd4246489f6f221f920acbd8bdcdd17f47d2b77268f72254de4190685c123e8c5eab8517fded1852e8316c9e549d3fa355142d91b2921a3c94aafd8862cd2235429340da38a2af131b8d002f17662354f5805f6a7af7afb6dbd2f641036600614cea42bd8b24d86a5109eed29c0865a5f30c5291b1d1ef3223f9b9826dee773d98ce972da92daa19e843f84ca5f1cd77925a3c1117242ab0fb509b94a83f8de4fc8d21f856f37a4d025b3024bd0dbb6d8acfda4ab2993fd6eb7a7448d4f66ec725d37f0eb14eb242c0ff3f0c4572ba6b98a4ce905fe1b7ca3daca56c225171428c56af938fb66b37e99e54139157bbf41f536989ef813af738837afcd62290\nA = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1348cfd2c1c569c23c31b4c46d6c57d4a488c29ab5beb77904d4adfcd0a01ea0a26bb0cc8790441cc2c8c900f030d7315b4319f1a3cf5685a140e03abe6b94730ad79e8de1f4a0cded86a3d6cfe2db267fa7dc9b2bb32872a90cc\n\nSquare = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110\nA = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4\n\nSquare = 0\nA = 0\n\nSquare = 1\nA = 1\n\n\n# Product tests.\n#\n# These test vectors satisfy A * B = Product.\n\nProduct = 5befab3320f8f90542f3120235abd926aac3805a19e343f690\nA = b057af553afb120db6b7764f8\nB = 857734c4c27a1d17f7cf59dee\n\nProduct = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c\nA = ae7a6a87ea8981a567d0b3ecc\nB = -fb0fed5f8c737bcacef4d6cb1\n\nProduct = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475\nA = -c28dc31984d4583e9d45424c3\nB = ffc4581a5c3f885cf42767e67\n\nProduct = aa6805b5408aff7f914472756da07830dcad902834dbdd6944\nA = -ffa07ff9f503511954e5dd3f9\nB = -aaa7af472ad8957763f5a7c64\n\nProduct = 58ca2569173389df29b5ce4b784086055dee821a7243db7210\nA = af417d936f4690008811a1ae8\nB = 81b26b80b43aa65aa55ded52a\n\nProduct = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42\nA = fb5fae5edefb6997d44a1ecd6\nB = -a336e50c6f7845a1686cc88a3\n\nProduct = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce\nA = -f918faa58bb57a2ffb8b01f05\nB = bae08c3006fade695029a1df6\n\nProduct = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a\nA = -8d108d7a16f0696d4ceb24445\nB = -c9c764cae465207097ef8d2c2\n\nProduct = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0\nA = b386d08daf3fa2154e9c768d6\nB = d2557dceb2d02d04d9c578670\n\nProduct = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a\nA = e4e5f7d1311e0c5f2e404d55b\nB = -c18057a328d8c7375afdfd4ee\n\nProduct = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692\nA = -a683312f132b2320632e74ef6\nB = a0758f12791453b4af354730b\n\nProduct = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647\nA = -d70c9b93170261091f0c53f27\nB = -848c86c51a186ac4c9080d3e1\n\nProduct = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427\nA = 898b64ef09d7cf63966e1a3b5\nB = af638b12f26aa5d12e97439eb\n\nProduct = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68\nA = f6003dc83818c14fbe36c9998\nB = -9343f6cbcc81fa4c9399dce5f\n\nProduct = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8\nA = -875ff6f56ca72cbdf614bb9ca\nB = b375a68a21dfb1f159c22fa14\n\nProduct = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4\nA = -c9b8df392e76abc3eb7d5ce04\nB = -dc5ab818c70594dd917b4243d\n\nProduct = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca\nA = f8e12cf4defe388b78510f687\nB = c07ee817b4ae95c2915b88966\n\nProduct = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d\nA = bc5dc74ddf7a1363d1c2b1f25\nB = -c8f069bad7f93cbfe6df51169\n\nProduct = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755\nA = -a8048acb66a8bb88df39266e7\nB = a34e0b265d71435ae8c92a463\n\nProduct = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a\nA = -b071f1f54790c951c1dd2a1cf\nB = -9dd89bb4d9b546207e282e2d6\n\nProduct = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016\nA = b44f3f252c368096fa62747f2\nB = 83439b97dbac579fa4f7b7d23\n\nProduct = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f\nA = 937cf0643ffa53cdea24d642f\nB = -c81881f78243dd5737a7d28e1\n\nProduct = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95\nA = -b536f8d9769be6f62da941ae5\nB = dc0746fb101881ae0cacde6f1\n\nProduct = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2\nA = -ff7eacc7de1bb01d668c693aa\nB = -bfaa6627f9fc7ba68ae41bb2d\n\nProduct = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9\nA = 9e0d5a850d078890a983c0ec9\nB = c9b72c118b3e1f1023a696ce1\n\nProduct = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd\nA = b2b042a21045a74ef1a5091d9\nB = -efbf8b120b384e869692a1b15\n\nProduct = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998\nA = -e7fd5e0bb5496b9d876c27f65\nB = b6262653b2be44501af1d85b8\n\nProduct = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880\nA = -b84674832b26ded0a690a8ff0\nB = -e0b7bdf2fd05a038ed3640b78\n\nProduct = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222\nA = 80cad81ad9a66ab6a1c2e5669\nB = aa0453a77c8af1584f54750d2\n\nProduct = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab\nA = c49ad3d7c8848d4fbf913b10b\nB = -82b3dedbe3cc7cd532ad632e1\n\nProduct = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477\nA = -cab4a9c0a331a5a5e826dda1f\nB = cbfee5041c13075dfe3399aa9\n\nProduct = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad\nA = -f7d13e47f9aaac8c25f9bf75b\nB = -8f4aa95231c1e2336aa092297\n\nProduct = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3\nA = 9d8248d00defce1ad081337c3\nB = e8b479295ecd9cef7301f24b1\n\nProduct = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6\nA = b21b45e88acff48562a19729a\nB = -c1cdfebccc763beeac394b997\n\nProduct = -484ca05aefa113bdfcb1bc623f730c9f9555b462a8ab4c9606\nA = -8c12b406c02c4417163c0956b\nB = 8422b15c80c1c087b17eedd92\n\nProduct = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c\nA = -93d45bce155a23a397506d96a\nB = -a87e339c3fd5aebede5fb1b36\n\nProduct = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692\nA = f196d8fe760fdcae7eb60e2f7\nB = 9f7d88a2163ad818bf3a6377e\n\nProduct = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822\nA = d0584b2a306671e4d2c9d0c7b\nB = -bb6e7559df199c68d6df3a3c6\n\nProduct = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876\nA = -cefce1b0a1fb22862418bb597\nB = 80f614139947aea5e76cd55fa\n\nProduct = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4\nA = -d68ed1bea046c6cad057e21db\nB = -d7988b9be54f6e332d019032c\n\nProduct = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4\nA = a8208053adc20a609d5d01404\nB = a2fa927c5458c4fe662d7a3b9\n\nProdu",
-    "ct = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10\nA = e82b6410b29020c2d6810a977\nB = -90ddfe0e7f0d6b9cdc0815f70\n\nProduct = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f\nA = -f9b697d9ec774a8d1ee5ea905\nB = f7ccb46a8869cb028492bed53\n\nProduct = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88\nA = -ea8e63afa99c719897ad7f2ab\nB = -e36f11f55b6148d1b4f46e598\n\nProduct = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd\nA = e4c7af7eea3ec9cc2443b7319\nB = c457bc264c8461789931baf85\n\nProduct = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120\nA = 8fd1ff97465775d44dee58ae0\nB = -d268a7d328f44baf80e35119f\n\nProduct = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe\nA = -bc0b398bd0ec045b0cf147b7e\nB = a4050955c234e473257d0c641\n\nProduct = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0\nA = -9d7a4ebac630cc0662b816fb5\nB = -ffda517d3eb3214986b04e290\n\nProduct = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c\nA = 834bc50140d6c6ab938dc58b6\nB = fafee47793cbc533b3c66af3a\n\nProduct = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6\nA = bfd5b1ad323c79428cb2db36a\nB = -eb956a10edebdd658e6810fcf\n\nProduct = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb\nA = -a57da276998c548101f514e9f\nB = a9040c1909712e1149d295765\n\nProduct = a57da276998c548101f514e9f\nA = -a57da276998c548101f514e9f\nB = -1\n\nProduct = 14afb44ed3318a90203ea29d3e\nA = a57da276998c548101f514e9f\nB = 2\n\nProduct = -295f689da6631520407d453a7c\nA = a57da276998c548101f514e9f\nB = -4\n\nProduct = -867614005cc204a8d19720fe13\nA = -a57da276998c548101f514e9f\nB = d\n\nProduct = 12bf3b676f64e5929d38c35e803\nA = -a57da276998c548101f514e9f\nB = -1d\n\nProduct = 24d8f92c68303ed0b96f91a8167\nA = a57da276998c548101f514e9f\nB = 39\n\nProduct = -49b1f258d0607da172df23502ce\nA = a57da276998c548101f514e9f\nB = -72\n\nProduct = -6fd5e6ca25c3d51b2e529f22173\nA = -a57da276998c548101f514e9f\nB = ad\n\nProduct = 1276d4705b81b82da4c7e82559d7\nA = -a57da276998c548101f514e9f\nB = -1c9\n\nProduct = 1ddb9abfc5d4017f068a67b5f4fd\nA = a57da276998c548101f514e9f\nB = 2e3\n\nProduct = -3a8b41c914b1b4a4e341433601f7\nA = a57da276998c548101f514e9f\nB = -5a9\n\nProduct = -97c0f4ba414d6e7d4c8b7ced84d4\nA = -a57da276998c548101f514e9f\nB = eac\n\nProduct = 1198739e0c23639c176d46d13f7c8\nA = -a57da276998c548101f514e9f\nB = -1b38\n\nProduct = 159150954ee0dedf541e4dbac0ec3\nA = a57da276998c548101f514e9f\nB = 215d\n\nProduct = -441d4bc44c86f02ff12c3d91a1562\nA = a57da276998c548101f514e9f\nB = -695e\n\nProduct = -64726b76005ebee27592237ba5dde\nA = -a57da276998c548101f514e9f\nB = 9b62\n\nProduct = bbe4ec7cf7c5bbd198e0ea86bb658\nA = -a57da276998c548101f514e9f\nB = -122a8\n\nProduct = 21f717d05681fd2eb1796776a69ef7\nA = a57da276998c548101f514e9f\nB = 348a9\n\nProduct = -396ac788a1748bc6955f99be4d2c64\nA = a57da276998c548101f514e9f\nB = -58d1c\n\nProduct = -54a213eb083aed1a04f3d1b2da62e7\nA = -a57da276998c548101f514e9f\nB = 82eb9\n\nProduct = 1366fb9c20fb14b8b9a9be4b3e3dde1\nA = -a57da276998c548101f514e9f\nB = -1e037f\n\nProduct = 238d65fd26da4733e5d93ab2485d40b\nA = a57da276998c548101f514e9f\nB = 36ff15\n\nProduct = -38272a99be154d531e922be405aee9a\nA = a57da276998c548101f514e9f\nB = -56dd26\n\nProduct = -64651b62b6a454c08951632c7f2c398\nA = -a57da276998c548101f514e9f\nB = 9b4d68\n\nProduct = fb272e3597b816144f8b945ae6130e0\nA = -a57da276998c548101f514e9f\nB = -1848320\n\nProduct = 280d9f5ed7243712ecb9a7c6358bcb8b\nA = a57da276998c548101f514e9f\nB = 3df5795\n\nProduct = -2fbb6bb8e1ba78cefc47fbbc20e188ee\nA = a57da276998c548101f514e9f\nB = -49d6652\n\nProduct = -57f29c13691ffa1642d2860dab9d288e\nA = -a57da276998c548101f514e9f\nB = 880c2b2\n\nProduct = 139c19d7668e6aabf2d7206cb0723ed34\nA = -a57da276998c548101f514e9f\nB = -1e55aa4c\n\nProduct = 2950ce04bf0cf836d4fe94b88fb757d0a\nA = a57da276998c548101f514e9f\nB = 3fe968b6\n\nProduct = -5175239488dad05a58414251496d2a06c\nA = a57da276998c548101f514e9f\nB = -7e020414\n\nProduct = -945ff0ed38bc6020cf679cbd3e0758c6d\nA = -a57da276998c548101f514e9f\nB = e585e573\n\nProduct = 11c69ae98f6b27e95477986f796bc67c8c\nA = -a57da276998c548101f514e9f\nB = -1b7f653f4\n\nProduct = 209afe75e8fb5ac76d13c06b545f5d4d73\nA = a57da276998c548101f514e9f\nB = 3270154ad\n\nProduct = -386d64b215e41506514f4988ed237e4da2\nA = a57da276998c548101f514e9f\nB = -5749c891e\n\nProduct = -6c13cccdb1d140d0babd52707ea72fa278\nA = -a57da276998c548101f514e9f\nB = a72fb6288\n\nProduct = 136228a8a45540372b9b3cd7f82021f6546\nA = -a57da276998c548101f514e9f\nB = -1dfc08a2fa\n\nProduct = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01\nA = a57da276998c548101f514e9f\nB = 30050f2e5f\n\nProduct = -50d615ce183258e95af77319b766fac81e2\nA = a57da276998c548101f514e9f\nB = -7d0bf92cde\n\nProduct = -817d358293b86a56a4e881e50257c549471\nA = -a57da276998c548101f514e9f\nB = c84efb12ef\n\nProduct = f09b9e80be251de474d726b16e25a6865fc\nA = -a57da276998c548101f514e9f\nB = -1743322a484\n\nProduct = 22996cb0f9c60e35dce49f3825f8a479db26\nA = a57da276998c548101f514e9f\nB = 3585acec11a\n\nProduct = -2b307a37c91791a61c0691858f5f783e4678\nA = a57da276998c548101f514e9f\nB = -42cf6be3e88\n\nProduct = -8826698fcba6c30d755fc523de1cc25301ae\nA = -a57da276998c548101f514e9f\nB = d29cc8af592\n\nProduct = ae37fc99fd419809310782714530d7428d77\nA = -a57da276998c548101f514e9f\nB = -10d8059d4a29\n\nProduct = 1d544a20f9bc7d95ab67d1f65743979f23bba\nA = a57da276998c548101f514e9f\nB = 2d5eadef1c06\n\nProduct = -367897184e9929a0294d320f10278889fbeb7\nA = a57da276998c548101f514e9f\nB = -54431582d0e9\n\nProduct = -943a509076a00060a2e7fa1cddb7468d734a1\nA = -a57da276998c548101f514e9f\nB = e54bb102f4bf\n\nProduct = fcce6e42879af5ad13545c0bcaab85b690cea\nA = -a57da276998c548101f514e9f\nB = -18711db522cd6\n\nProduct = 258c49f86d0cbb14ae9edbd3456be8cede2022\nA = a57da276998c548101f514e9f\nB = 3a1562c7c269e\n\nProduct = -4a8bbce59ad7daa51136d557f7fa16e9a2faad\nA = a57da276998c548101f514e9f\nB = -7350e780b0f33\n\nProduct = -82f53ec9333275d5cc271876a7db936db49280\nA = -a57da276998c548101f514e9f\nB = ca94ad312dd80\n\nProduct = 11daee4fcc713db5b2806e47fa5dff3b5b770eb\nA = -a57da276998c548101f514e9f\nB = -1b9ed6758f9635\n\nProduct = 17038cac4f0c94dc24985ea108ae6682e175752\nA = a57da276998c548101f514e9f\nB = 2399b8a9b1116e\n\nProduct = -37e5f14394bf347a3ed061769fe8e6424af4348\nA = a57da276998c548101f514e9f\nB = -567840a7569fb8\n\nProduct = -9253d4a32a88d8f725984514d969012ead7cc9a\nA = -a57da276998c548101f514e9f\nB = e25b246f733f26\n\nProduct = ace3648371c16a931d29004e79f5b9678391da5\nA = -a57da276998c548101f514e9f\nB = -10b717b27b6a13b\n\nProduct = 1faa5b45d04c143c339b09d3aad94d39b94ef960\nA = a57da276998c548101f514e9f\nB = 30fbd672e106aa0\n\nProduct = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d\nA = a57da276998c548101f514e9f\nB = -62cef5f078a8253\n\nProduct = -5b792bfaeff04ee3d948cb343a249d49eb344f57\nA = -a57da276998c548101f514e9f\nB = 8d805ac65649c49\n\nProduct = c5f824406161eec321da5a58e3e00d393b55abe9\nA = -a57da276998c548101f514e9f\nB = -1323dd41d2e1e077\n\nProduct = 2226dec8a57be8e84e42559007e2d101ccbe67f8d\nA = a57da276998c548101f514e9f\nB = 34d47842b5d0be53\n\nProduct = -340f50f812c7420b502000940788a700f6769788a\nA = a57da276998c548101f514e9f\nB = -508836d8e1193d36\n\nProduct = -a00f1d96e19c590479625c5329a87774b5964cc78\nA = -a57da276998c548101f514e9f\nB = f798fc858657f888\n\nProduct = cb94f830cba8997331912a6a31c34f1bef826d121\nA = -a57da276998c548101f514e9f\nB = -13aec7a5c52a0883f\n\nProduct = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04\nA = a57da276998c548101f514e9f\nB = 231f27f3e347bd67c\n\nProduct = -2aa94179351b4e87de5849ab619d94f47450640199\nA = a57da276998c548101f514e9f\nB = -41fe3ec2189599cc7\n\nProduct = -5489401d3da93158d4284e557d74016c0a7cfd935a\nA = -a57da276998c548101f514e9f\nB = 82c5281df41bfc066\n\nProduct = ae04d5b212ecfc9a6d7df07794d565df52991fb70e\nA = -a57da276998c548101f514e9f\nB = -10d3139229f5d02432\n\nProduct = 27821bc811f45d63089790b41d307be978d4b19564c\nA = a57da276998c548101f514e9f\nB = 3d1da85cc012b3e234\n\nProduct = -3de3c9e9d7fa3020a578706339314890dccf63096c2\nA = a57da276998c548101f514e9f\nB = -5fbcfb28bfc9044bfe\n\nProduct = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7\nA = -a57da276998c548101f514e9f\nB = 985b930517b78e6ba9\n\nProduct = cc0622441497a37fddf1856d5e2c99df52b99ea4573\nA = -a57da276998c548101f514e9f\nB = -13b9b88948fb7e95cad\n\nProduct = 1a5168e1a492210591ad1ed660adde9110390e4caf32\nA = a57da276998c548101f514e9f\nB = 28b631c6e04b6ab0d8e\n\nProduct = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4\nA = a57da276998c548101f514e9f\nB = ",
-    "-77f99bdf1eb09da6dcc\n\nProduct = -55afd796db7bce822a00073fc8926d3bd0c79772f036\nA = -a57da276998c548101f514e9f\nB = 848cdd6212b9bb3620a\n\nProduct = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34\nA = -a57da276998c548101f514e9f\nB = -154c39567bd8be5f6b4c\n\nProduct = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c\nA = a57da276998c548101f514e9f\nB = 37c6e7ee89cf87674814\n\nProduct = -39002ecfd6d96661b336157ccef6536756ad2e9219be3\nA = a57da276998c548101f514e9f\nB = -582cdab09915a652203d\n\nProduct = -695f49fc891d53f396f0593efae3973082b76d4f9e944\nA = -a57da276998c548101f514e9f\nB = a30074dbce2246af043c\n\nProduct = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7\nA = -a57da276998c548101f514e9f\nB = -1224195afc7b394ae8cc9\n\nProduct = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af\nA = a57da276998c548101f514e9f\nB = 26c6701c39334169e7bf1\n\nProduct = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100\nA = a57da276998c548101f514e9f\nB = -5436e84b4a29858a68f00\n\nProduct = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871\nA = -a57da276998c548101f514e9f\nB = c56e0f44fc63bca242eef\n\nProduct = da7fe3367ce640fa5941c033ac1874312f10ba5950da75\nA = -a57da276998c548101f514e9f\nB = -15200043166ff309f0426b\n\nProduct = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57\nA = a57da276998c548101f514e9f\nB = 25d057879db26fa29a5e49\n\nProduct = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857\nA = a57da276998c548101f514e9f\nB = -5e46be70de21949df67349\n\nProduct = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63\nA = -a57da276998c548101f514e9f\nB = 9238670897685a6c9cbdbd\n\nProduct = f623344788efb857db55c924e95a437effa4dc8bb2bcd24\nA = -a57da276998c548101f514e9f\nB = -17cc0ec84c228225a7cf45c\n\nProduct = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72\nA = a57da276998c548101f514e9f\nB = 20f9f925b3ed307edbb154e\n\nProduct = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f\nA = a57da276998c548101f514e9f\nB = -6c5cbfd29f3dae1dce99221\n\nProduct = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43\nA = -a57da276998c548101f514e9f\nB = 9136aa79080defd1bcf90dd\n\nProduct = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd\nA = -a57da276998c548101f514e9f\nB = -1d03b512470dc3052779f3e3\n\nProduct = 28388a244214abf046488a8d95308d95f021eae4b994a5a52\nA = a57da276998c548101f514e9f\nB = 3e37dce784274962ff862e6e\n\nProduct = -4da476e76119deef291c0f56934a912a0877278a19a561ee0\nA = a57da276998c548101f514e9f\nB = -781b2f2dc40094a7f8fed520\n\nProduct = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82\nA = -a57da276998c548101f514e9f\nB = 87772a4fb582acafd3e4ef3e\n\nProduct = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa\nA = -a57da276998c548101f514e9f\nB = -1563841bf7851ff158a395716\n\nProduct = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752\nA = a57da276998c548101f514e9f\nB = 3918c30b5568318a58e9be16e\n\nProduct = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a\nA = a57da276998c548101f514e9f\nB = -542fb814f45924aa09a16f2a6\n\nProduct = 0\nA = 0\nB = 542fb814f45924aa09a16f2a6\n\nProduct = 0\nA = 542fb814f45924aa09a16f2a6\nB = 0\n\nProduct = 542fb814f45924aa09a16f2a6\nA = 1\nB = 542fb814f45924aa09a16f2a6\n\nProduct = 542fb814f45924aa09a16f2a6\nA = 542fb814f45924aa09a16f2a6\nB = 1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899f571f257fa81c36a868d80e7fa2bcbda68a72ca3e31db8892b94d073e006433dd7128b7bf677d2b411532e5662cdff66d657673d58e03d4a338bae1a5513296f91d4d2b5b680527a2e12318e422ec2b7f05ea4fd3ef4780576488211dad5733685a8f0e5d2ecda549a15eebb235495e70d26b194c994cf16d98d356218d08a34d1593d90bc0d3572df0e84bdb1705c6c5e64ea4895599bb21bf219abdd4329813ecc198e708cee199c22f749bdeb0c206690e8420883f6c0661e47b29969986a7a72996ef63234c31aa39b7be37995d2898063ef5c3b672c43afbc1a065dec2671ae87e17639cfcd3148145a8323e1e9dc4f9c9daf981dd6aba4e8be01344c2eda185b87\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899aa73af54a4e1825aa6714016da99d9e3d0c02eb139716db437705cd9efabf0123b0831689735f4e488f226e577d4688d30914dd50ed368939452af0a7a094c065c6718bd54f53a808585fc1728c3bd1e7c968d76c6dca32f95a8323bacad31cdd4aae544d4208262c40bcf726c2f26cf1e60341c3e1e0c8ed4542555b9bf00488680b737a245cc9b7817231f1f6f1e614cdf43ea281fb850ebbb9305b1aa441a45dfdaa1e98b9d79d9ca511be070bfa94d8cd3cc750607c93e1b451a14e32356bd48d77860b37fd2e714827e770a5648ce8579a00ba5cae034502a8b03ba754994d9e002130cfdee6bfdf078dc8f6767b927c964197664c8e32bd3d31bd461ce\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46feff82a92989bca577998c68ee619d9ea9972c6f139e97f5bdde635152830bedf302873508d2ed73badb82f9e32e1f4d12ea8c8b1059aa6d15f8e17d649bf41467903ab40d220d50570b5a263f637c0fcebc0ca29f8a81e2a01bf39bcb60cb9229dfd40618f706b941836bc5c291dec45ee9193e74d3a4cc5f73054ca56fd774a359f17a687268587393b76204a37cd48dcb09d3daed57a7e6d7d93a0ca3d6de8557fc4ddbfe9cb163fd10b7fe5f270dc57aa2fb88cdca2a3795015a17fd352d85fb688a38fa54883d0cab67aab08dbabd58d307c601f0f810014d78b101ff0bddb6d550b24807",
-    "82406a905b9201e70ef6c1cb9765e91c10c8f5d240c\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e3812764dd3ebb7489e6e66058ca6ccf9c007f8c049eda369b2889cc411bca78d4f5b0e3a9e80243e87e112072b01922b595afdef4dd562e58ce917f11e69c8fe050de54fdb2d607d05f09afd6dd140e9d195b91d85269610a1e5d5036e8c9fea2d4fa693d80ecdc819b201c0aed27dfe0b92b4b3b9ecabb3b9548f0d27dc917ffb14308c4f970863e163f375852fcd9fb115640dc40534f8f51a7b903599117dca6c80924fa9a1aeb43cf5a9a3f67ae818b484feed51d7ef60b3656720891b13a983c02c281c8a0954f13b7bfaca844d2cb66de5c11ff507e39cf774c7c93b38e296a44f04e5ecf2819b57943fb0509774ddbcfeb\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899c7bedb01951b0f4fdb2c0fb64ad74707fda20027f4cee25da9b59be288d404cbd348f27600b87015d28f03cdf411f0e8c22deb9de5b3e0094f7820d78d59c90017cbd426297f8a32fb4b55b09362cf7cfb5910085acb24dbf618752b8b74c7e87f9cac44cb3b7486c43aa9b19a64d40a74eaf1de8b5f168b43d5750236aef753278c11294efd1adaddb6addb846f45fa55d7391898e8ec1c82bcf0008d9850c4c096571e8872e975dc8af1ba01bfbe8c8c27dc30cdaddd198936e4496579741a3a20e1b8e17241fe4abe5e98794e469180b742b2e1904940381f703f512885bda0340fe74e997ab269be00a3ca29bb937db2e06d8054e26dc13a5014ba51b175\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d88997cc097fe3f7ace3ffb0fcee52b45551165bb02354b229788b59128489879b1a0373e9862a17692464a2dfc5d09185a0f1c67d2359ba70b52b03f21c7b24feb96e25e1a2dc7f4723952bf203979f7c9e38790f881e2b35006157825555d4c867fce9ea0a3cc6f1c94ee308a68e33f64f286247465ffe854033e9c64f5d79d6d66dcb38ad03535b20376bf4c3cf26e07ef445192ba2baf08bb5286695a61ff6b5dc7aa1832017198d61a324b8c244572157323c7bb3a2fee226133e1b0e0f2ff067cf71fc24bf38d0e172f459b0cdf0707c5bc586390faacf428bfdeb04e850ee0c35f6807eb6ca8d3a473dcc2239541115a8b0d33ea33295ff8c13b2a\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46fc245133c3335163cce37555d36c555182e6d9a754b9aa9305c070083d0fe806d2c5eda4a976f749d6ef40515c425e6531a7f4d11926e49907b7a8a938205e0d6fefaacb145200cbe3deec686476bcdc1f6bb3535147ecb00818f2cd666ac0dd497f0fbc087bf05c6425b7752a02e2a695655d4310f04943a6178946a74dbe4688bd1eb3f1a166aef37e39f3e1d36b6d6d422ec0db264cae8d44869f57a92952bd74a026dd7cfc672803905f029c723487d4123a7520688fc9c68b2384be32e881f64d0ed7ae555bf00e5799740dd8c6accc40f3fe573f194f4848bb05aea8a5509f2dd10fce023093f1ef20267244a990d7ffd462f4e85a4\nA = f33cad5d3876f0b6",
-    "0a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e353744d86d954c06f3b84ef271b184ac9957a5f88b08b606fa6aa97afc4983a62f1e74aa3f242e14a3f4cf5ea415d1437818663556a29d117ea7df1cf1ee32f70d6d5566e25d53f892c42d3f92e481b622455fce36e400de09e2d435099695354ceee249c793b76b3c544d70164381e0420ef8b85609502afff9130729ba7851e0775dc5d8c606ba614e7607625fbc38908c88fac43e29ff9b8728f5809e63f20289246b5128016478437550a833c60edb0df43dd9a47654f2e4ef308d4a18cea57ea4b0c6d08add07f2e7adc427cf591c29dbd1f975432922e3f2b71c75e4d2557efccf626be7a0d522b658d420ae321\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7be8e75d54e5ba9405f671d624eaf8d7a115d0479f6fb773b940525fd46b69bc43c815b6bb1798813ca95790bc68032f0b9e73fc964a9922507d8aac25f859745939b828ef5ed326b226b555e5088f13531be16272a89ad41ae82c940935b5d8fe75dc520a230cc279a887bce01bae0a79356f044af13c6f4a5e53c00b2d03cfcbb0f93b26202441a207ec91576410ac1750e257906d945bfe9204b73fc417600bd191edcf2e3eb79acbf4f84dda372405b5e98397abe85c1593543cd7a5b17cb90e299f422f0ce107d86b56474e435dbbcbb5314fb579cd68d54777aa2d0ff9b6b96de62b4676edea5b09589698ed829cad22a52aaec732b79edf6af\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7739032d1f8bb68307f4adc912f1d9b83797606874d4f2c669fe0b263565c4898a07701585237aa444234719adb869c17142126611a9cbd6e689fabb2847bb9dc5e2dc89694621a7179df1fe7371deb9bbdf5fea0b271d86bcde2796a65331c27365fb97fa3647435c47e5c854a95718fa49072cc239d046ca0ac2bf453beb31070370d59483adb42b9876776e43fccb663887f1a999f625eb8e9c4cdd0a89099c42cdff06be29ad9ea66a957002925c9425a83c3e74096ca31324134f5d4a2b7d3b8d7fd8d72192049f79c670874f65201c068c5aac2008a7df4e5eba02d88be8ec23683513a9cffe06671a7c2fa5da7a7aa571914caba1e\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a808857c1bdb914ae0fec75b02d527263093a9d9b8a42289ec74dc73e0e46568a9e8ee117659597434048308c9b66fa7a539694285b1238a13d1163fbac33db147e5431af1c7aca5b1a118db4f6650ec6340491ef7a2d203b53e43d536639f980eb6e92a37bffb2149c5eb45d6718a9496f0784370674c1d29732b944a3c3885b68f0fd2a121f556dc82d1b942e7aabba780f087b9df359d86e2055248c3aabc568e93bba67d3ccca2c4240c876506d63bb05aad6fc4c77dfafff1731a46c6711bc60c4d23976268928bc63e1d133add0633c737bb508c81fa1ff3b452b49b992ebac930432d555ab8c62ae17357b1186e80689672f5a9f472c\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be8",
-    "62f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6783ab6c7314a43e85a92955a5fbfbffcd31ef0913ba93563dab2b7f54d90fa21ca827ad15b5b1fb399a303f94837536b2813cb563f793fb780e91f8333a2de7bb9f10efdb652a504d6f242e7c15362d3a6eb6e3d1a5abb03023dfe964656979765a14fe8fc36af3d785030ce549b92a91dcb8e2aa13f5b89eb8449b31961a0f77117c8cac79af95ee69f6594e557af7bb017cd885027ff7c0cb1d2f99d1ed5eacb788f645c25150e737cf1184b546bb2d55f2014a18015ffe647580df6fe4d528ce983309baeac0347ae8739e2b1f6d1a83e12e4dbfea1cd81b11b8628837432ad1906c70323529b718c8c6e398e1dfa73\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f225bca564b7e6561b56e0edbb3a7f5934f382b916ab38423221d656357ce0e9bf1e9b04c0678b9c555e8365a0f977c95bd8dca1fb2ad2268193531ca36cbe7f40da8e1afe097e451dc2931b323ce731c03cc027a92ed8ae105c5e9c1bd385e238d989fadbf3aa54c097a8666df8a66b7e2d016e65a2a632603f2c84290ccd7346ada28dff79dd06c7f7989689aca4f494b977f984650f91327ab9936cb92675932440f135e54e4abeecf255d7061482b4c8d91769e02fc94b8acc43325d69541903c3ef7a7a8a5bd19bf886506d42bcf0efcb6197a8d178d6a60516a5aa771ae238a342dc61df8c18c6ba1ed952d4e0c3409c14639\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f2210cc134828c520a58df29ae28863a158a044937809d7d84d2940efbdddb448c64da5f1f31977e7865fd5529eac82fee3e804064a6315936295f8cb26f0de16a47373f5e8365939e280a57dacb508166a583a630c75730c2fe54971e70a35e224e7a1a21e3bd8f417a47c4796d34148cae15068e19eec637bed8f32846dc5aa7e8f50599e840903a8129206fc384e0b4085f9f1e7e3bf2fc67b62b02566ce73cb4b22d471cde35b4f0cccb74283cdded5748d62286f7ea5c184c1308d520ecc7c7f1535b1132708298bf94c0967bc8f8541bb2f2b3c81f11e50f1d8cba4ce3746ad5f85e6bacbefada657c9b386b991b2\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c36ad2daaf856508e861c7f68a2611a215a93e3a15f68f72bb80a4fe9f4cfb6c7f91639179342c633db0f70c9dd849b5b5767908b27e61b812659dcd1a0613433f2c0940be49010886bb384d4676bd523f9827c1a48c7649fbfa73e872a5160796813956979b0f3fd3af728dd48f8a7348090300e41b181c8acae08a3b3106b61f90b0421803e6eba0d68e9bc93d3b659fd6316ba2815cb4b3b6a74f1f3fd24b0c07f619d995ac2beada44188eb72d371a6894f90087eaabe148755409bbff60114bcfefbfe2182e6dc4218d0da75af80059bbb14e848c2e60790fb35bf1cb685cbb133b2baf3f2faefcc3f69e34102def4\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c0701452188",
-    "9172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef9518c8ddd2bbd782e5f8cb06be77fc8d0c29f12d4ce67bb2478369710d003f0cb6f40a1341a5a5f2509d2d189084ea4346a44368a54f44c2be4c7b90c4d22976a31985927d0379b2e5d715a7e67eb3228943a07325a29316c695867e8f4ff676e00ffca0a6dfe8fe24652aef9e7f12616e8a54e367b90942f543a01dc7c1b8000ff991228ae83fe0131cfc235ba12ab2bdb33bd4ab0ba1b356bdbc6da4a70eed9fbf2c704e14ed6230eb5478dac0b02f4def1d8c076d1c0c0e2c4cdadb248de4acf961cee51dc41e545bd5a605a0860fb343c28ebf3f8814a9d5a7e0f3e9c93e742db76bc5671258d1da7758b41efead5\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\n\n# Quotient tests.\n#\n# These test vectors satisfy Quotient = A / B, rounded towards zero, and\n# Remainder = A - B * Quotient.\n\nQuotient = 1\nRemainder = 0\nA = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c\nB = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c\n\nQuotient = -2\nRemainder = 1\nA = 107f0e6cebfe22ac11294a06fed2b994d01c9b3610d50bdd254adafd08c93be8ebdd1e85e1286fe9c9e682a90cbbd6351681b\nB = -83f873675ff11560894a5037f695cca680e4d9b086a85ee92a56d7e84649df475ee8f42f09437f4e4f34154865deb1a8b40d\n\nQuotient = -4\nRemainder = -2\nA = -3d8746ae2123c2d3f1d35910b42af1f86f5e81f8e98986cea20b2a1bdb8af6cf111f1258f112c837accdf4868463fe9eba536\nB = f61d1ab8848f0b4fc74d6442d0abc7e1bd7a07e3a6261b3a882ca86f6e2bdb3c447c4963c44b20deb337d21a118ffa7ae94d\n\nQuotient = 8\nRemainder = -3\nA = -5645d65662eaac73050de06f8f982a9b2ae680467712284be3e2b0e58ef4bf4d72b5be5e12ee1fd803b47f161759662ff5c4b\nB = -ac8bacacc5d558e60a1bc0df1f30553655cd008cee245097c7c561cb1de97e9ae56b7cbc25dc3fb00768fe2c2eb2cc5feb89\n\nQuotient = 10\nRemainder = 4\nA = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4\nB = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b\n\nQuotient = -20\nRemainder = 5\nA = 12805392c55ffa0e27e85e15f2b339872793664e9ed3074cd2600aa52459a57197130d1ea46775ef43115c9413248cc7b34805\nB = -94029c962affd0713f42f0af9599cc393c9b3274f6983a669300552922cd2b8cb89868f5233baf7a188ae4a09924663d9a40\n\nQuotient = -40\nRemainder = -6\nA = -3579fc4d6083394c691b060cf9e20318fe17da0487337f76710bd11512578830ba94ac7b587a2d5ab7cb4afe611e349cdcfb86\nB = d5e7f135820ce531a46c1833e7880c63f85f68121ccdfdd9c42f4454495e20c2ea52b1ed61e8b56adf2d2bf98478d27373ee\n\nQuotient = 80\nRemainder = -7\nA = -74ebad4b39ebaaff82cd91082408c979527907c363d8f0f75db410523f8477c074c45ff85851b6275b1ebc5279029818e78d87\nB = -e9d75a9673d755ff059b2210481192f2a4f20f86c7b1e1eebb6820a47f08ef80e988bff0b0a36c4eb63d78a4f2053031cf1b\n\nQuotient = 100\nRemainder = 8\nA = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c08\nB = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c\n\nQuotient = -200\nRemainder = 9\nA = 1bf534da2f4365c96fc5dd4928e73ac24b157b5136ead90cf6596033ec387a2c14bca828000ae1725f3a5ace8ad67a8c07a0a09\nB = -dfa9a6d17a1b2e4b7e2eea494739d61258abda89b756c867b2cb019f61c3d160a5e5414000570b92f9d2d67456b3d4603d05\n\nQuotient = -400\nRemainder = -a\nA = -3a172cc9483774544311a1366659d9e61cc9fac7dc11c68e36aa991ef4d5e96becf5bac3e0967c904d926617ea11bb9551b980a\nB = e85cb32520ddd1510c4684d9996767987327eb1f70471a38daaa647bd357a5afb3d6eb0f8259f2413649985fa846ee5546e6\n\nQuotient = 800\nRemainder = -b\nA = -5ecff3a3e47fa615b6e3ce2dedfdeefbfe1d437c394631820968a9650b59dc3a2dd1c9a0b06537e4e5c408a59e580921503580b\nB = -bd9fe747c8ff4c2b6dc79c5bdbfbddf7fc3a86f8728c630412d152ca16b3b8745ba3934160ca6fc9cb88114b3cb01242a06b\n\nQuotient = 1000\nRemainder = c\nA = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae00c\nB = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae\n\nQuotient = -2000\nRemainder = d\nA = 163956bc32325f28f48d41d32bb08d2a9c4ccbb0d818368fb13941e82b27da21d04094f7e897ce79c2d0ff8470505f1ef63fc00d\nB = -b1cab5e19192f947a46a0e995d846954e2665d86c0c1b47d89ca0f41593ed10e8204a7bf44be73ce1687fc238282f8f7b1fe\n\nQuotient = -4000\nRemainder = -e\nA = -3763f8e43bd05e6ffeec6d509bbe6ff9a9022ced8cb191c9abaf5fd0e0b75a53e2ad581455e3af09e702a77b164ed3fb54ae000e\nB = dd8fe390ef4179bffbb1b5426ef9bfe6a408b3b632c64726aebd7f4382dd694f8ab56051578ebc279c0a9dec593b4fed52b8\n\nQuotient = 8000\nRemainder = -f\nA = -531dd44dfa9e79a5aec8fa7c84bd3b753c146770d22d2c14a6d2125f7ab95e9b320e84c31cf3e0d883e1295a220f2a546550800f\nB = -a63ba89bf53cf34b5d91f4f9097a76ea7828cee1a45a58294da424bef572bd36641d098639e7c1b107c252b4441e54a8caa1\n\nQuotient = 10000\nRemainder = 10\nA = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c20010\nB = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c2\n\nQuotient = -20000\nRemainder = 11\nA = 179d7ede3db0c105525286551331d5b9e1f97a7883f0c13cf250afe9765bb5aaa527af7945c19cdd4596565cbc8532a3cfa5c0011\nB = -bcebf6f1ed86082a929432a8998eadcf0fcbd3c41f8609e792857f4bb2ddad55293d7bca2e0ce6ea2cb2b2e5e429951e7d2e\n\nQuotient = -40000\nRemainder = -12\nA = -293dc443c294c6a6c53dd49e84f58305d59a432afb6c7ea2039cd02a513231239571ae07f29b5427e869b9faa485511ca45980012\nB = a4f7110f0a531a9b14f7527a13d60c1756690cabedb1fa880e7340a944c8c48e55c6b81fca6d509fa1a6e7ea921544729166\n\nQuotient = 80000\nRemainder = -13\nA = -5b637eb8aa51ef15a18d9b144031c9756527fc0fb96c84b6df03700e5079ae1b3e96940a2c1e07f3b47ad8a9b2b8ca99171a00013\nB = -b6c6fd7154a3de2b431b3628806392eaca4ff81f72d9096dbe06e01ca0f35c367d2d2814583c0fe768f5b153657195322e34\n\nQuotient = 100000\nRemainder = 14\nA = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c19400014\nB = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c194\n\nQuotient = -200000\nRemainder = 15\nA = 11c2a4509f419aa977c3d37fa446fcf21b4b3b9f983fbaddeba4f51c285ac4032200711a54cc6edf24297b1f3d46ad020131a00015\nB = -8e152284fa0cd54bbe1e9bfd2237e790da59dcfcc1fdd6ef5d27a8e142d62019100388d2a66376f9214bd8f9ea356810098d\n\nQuotient = -400000\nRemainder = -16\nA = -39e37ae0edd92b957e84682358039f5e432c42492a44f3de01cdf74d643760260f2837946608",
-    "663e12291e9b0695449c1153800016\nB = e78deb83b764ae55fa11a08d600e7d790cb10924a913cf780737dd3590dd80983ca0de51982198f848a47a6c1a551270454e\n\nQuotient = 800000\nRemainder = -17\nA = -72f725edd5a3dd6f20b5e9ca7da08a99f8ec9214c80588182c0d42e03bcff34b488b28c03cdf41813a6193c10672a8ee68f6000017\nB = -e5ee4bdbab47bade416bd394fb411533f1d92429900b1030581a85c0779fe6969116518079be830274c327820ce551dcd1ec\n\nQuotient = 1000000\nRemainder = 18\nA = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018\nB = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd\n\nQuotient = -2000000\nRemainder = 19\nA = 190790727c1514b4ef83a1c6aa07493c0af7087fbc8a675bfd9a1e97b8ef80ef684219d6c6f1a5fb5b919f105fd7717cdd5aa000019\nB = -c83c8393e0a8a5a77c1d0e35503a49e057b843fde4533adfecd0f4bdc77c077b4210ceb6378d2fdadc8cf882febb8be6ead5\n\nQuotient = -4000000\nRemainder = -1a\nA = -22d115ab02f8663d8c009960086a0275d301d358cd3b250bb9e7c16cc6ebed4a8fbe43bbced856d93be64a17377d95f5f9c8800001a\nB = 8b4456ac0be198f63002658021a809d74c074d6334ec942ee79f05b31bafb52a3ef90eef3b615b64ef99285cddf657d7e722\n\nQuotient = 8000000\nRemainder = -1b\nA = -41f2e708ba47494a13607223b08e6d99c0b4247436632961d873804e83446dc97139ffaef3e25969950bd4b5bb4ff73b1a25000001b\nB = -83e5ce11748e929426c0e447611cdb33816848e86cc652c3b0e7009d0688db92e273ff5de7c4b2d32a17a96b769fee76344a\n\nQuotient = 10000000\nRemainder = 1c\nA = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336000001c\nB = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336\n\nQuotient = -20000000\nRemainder = 1d\nA = 10888959278661bc36089519a215bda60f9ce24ff7c0ac1f543b6e652f94dbff1f32aa40cad2b4b4d676f16948551501c29f2000001d\nB = -84444ac93c330de1b044a8cd10aded307ce7127fbe0560faa1db73297ca6dff8f99552065695a5a6b3b78b4a42a8a80e14f9\n\nQuotient = -40000000\nRemainder = -1e\nA = -3ada453530a180fda58533ab8c62beb4f693a134f512e4d23e487dac3b575e5390c0a90992400e402bb47aac93d46ded55f54000001e\nB = eb6914d4c28603f69614ceae318afad3da4e84d3d44b9348f921f6b0ed5d794e4302a42649003900aed1eab24f51b7b557d5\n\nQuotient = 80000000\nRemainder = -1f\nA = -57879eb5d92d565daac3ac5173639bfe44b6ecc69ff770af57bd79c9b93841c5677042cb362b794f3d8b24b0d3b73ed1cba58000001f\nB = -af0f3d6bb25aacbb558758a2e6c737fc896dd98d3feee15eaf7af3937270838acee085966c56f29e7b164961a76e7da3974b\n\nQuotient = 100000000\nRemainder = 20\nA = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020\nB = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d\n\nQuotient = -200000000\nRemainder = 21\nA = 1c267719338a4562e934bc57fabe6da86ca534a34244bd38c15032f01f47c2fd498c83f644b345c5c661ada0e586a096bb63000000021\nB = -e133b8c99c522b1749a5e2bfd5f36d436529a51a1225e9c60a819780fa3e17ea4c641fb2259a2e2e330d6d072c3504b5db18\n\nQuotient = -400000000\nRemainder = -22\nA = -250249f2185d4b428fa9534f03ef3cbed535bd31c56c0b273e6c3d35e0266f7777a6e59a99da5738b8e3af8ac60061d6716ac00000022\nB = 940927c861752d0a3ea54d3c0fbcf2fb54d6f4c715b02c9cf9b0f4d78099bdddde9b966a67695ce2e38ebe2b18018759c5ab\n\nQuotient = 800000000\nRemainder = -23\nA = -710b30c23c3c4e646ba90da33d2ce35af2ff181c40b02e3ffa607966730c6b6e274dd4c3c78e578e0b10f431f2d832274bf6800000023\nB = -e216618478789cc8d7521b467a59c6b5e5fe303881605c7ff4c0f2cce618d6dc4e9ba9878f1caf1c1621e863e5b0644e97ed\n\nQuotient = 1000000000\nRemainder = 24\nA = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024\nB = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719\n\nQuotient = -2000000000\nRemainder = 25\nA = 1ed1b7d9e4cf3d44ee98ef69850e61a39f54cc407c6795c07c887374441fd9ec258c21193f8a8c55802fb8f8c579cf94cb0ce000000025\nB = -f68dbecf2679ea2774c77b4c28730d1cfaa66203e33cae03e4439ba220fecf612c6108c9fc5462ac017dc7c62bce7ca65867\n\nQuotient = -4000000000\nRemainder = -26\nA = -35d324ba37d2000f960ca1c9e1ab96e341a2ae6a5ea5cef014c73a39dde000d8ad9606b817ad67e4e4593cc5894d354854898000000026\nB = d74c92e8df48003e5832872786ae5b8d068ab9a97a973bc0531ce8e777800362b6581ae05eb59f939164f3162534d5215226\n\nQuotient = 8000000000\nRemainder = -27\nA = -7039477c3e0a6f415e25e9f9b1dab1edcd8a23f984e7e3bc149c206a3b756b1be001450af4049cd4535e4243d7032afcf6790000000027\nB = -e0728ef87c14de82bc4bd3f363b563db9b1447f309cfc778293840d476ead637c0028a15e80939a8a6bc8487ae0655f9ecf2\n\nQuotient = 10000000000\nRemainder = 28\nA = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba340000000028\nB = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba34\n\nQuotient = -20000000000\nRemainder = 29\nA = 14d27a16a9cf2fdbc85b88a604dd8f0e57b5b34a27089d75d805e05fbb367dfa61c085aa98b896e3e53b85ef774a3fa52417a0000000029\nB = -a693d0b54e797ede42dc453026ec7872bdad9a513844ebaec02f02fdd9b3efd30e042d54c5c4b71f29dc2f7bba51fd2920bd\n\nQuotient = -40000000000\nRemainder = -2a\nA = -3bd0119619fbb5b260c44050d61e6b1925a49713d754ceb06bafb1d730a93f199df654b153c40e75096ebbaf5a6ce3c801820000000002a\nB = ef40465867eed6c9831101435879ac6496925c4f5d533ac1aebec75cc2a4fc6677d952c54f1039d425baeebd69b38f200608\n\nQuotient = 80000000000\nRemainder = -2b\nA = -61a283fe41d965ee770704bb453f689cb82a81089422d6d904a91776a06d32857220286e6ef6327807b724062dda143b46890000000002b\nB = -c34507fc83b2cbdcee0e09768a7ed139705502112845adb209522eed40da650ae44050dcddec64f00f6e480c5bb428768d12\n\nQuotient = 100000000000\nRemainder = 2c\nA = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c\nB = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1\n\nQuotient = -200000000000\nRemainder = 2d\nA = 1eb7cfb197d19f56ad994eca52d1af6466fd09da07d68d63067602046b2d42d3063ef5eda6b58afd69fd92b0b727a0ecde1420000000002d\nB = -f5be7d8cbe8cfab56cca7652968d7b2337e84ed03eb46b1833b01023596a169831f7af6d35ac57eb4fec9585b93d0766f0a1\n\nQuotient = -400000000000\nRemainder = -2e\nA = -3ab858b3329e5bd0469118be52a867b2febbe2894d962cedeb3a5be1738db1cea106cd0710c9f6937348c2c63b109ae623d500000000002e\nB = eae162ccca796f411a4462f94aa19ecbfaef8a253658b3b7ace96f85ce36c73a841b341c4327da4dcd230b18ec426b988f54\n\nQuotient = 800000000000\nRemainder = -2f\nA = -6137bae6cf7573afcbb6fd5c066ba37648cba8db0ecafe9dbc66959b19deabf42f3083719a2268b7602bafa2140a1ee8ce7d80000000002f\nB = -c26f75cd9eeae75f976dfab80cd746ec919751b61d95fd3b78cd2b3633bd57e85e6106e33444d16ec0575f4428143dd19cfb\n\nQuotient = 1000000000000\nRemainder = 30\nA = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030\nB = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7\n\nQuotient = -2000000000000\nRemainder = 31\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -940693131e2ba7b2af531803794983337dd526f0d84d08d58723edf002a388d55c8502d88c2a2a6e78233a2a1b1c8d339a13\n\nQuotient = -611b743a0e2acb1043bb33de50a59eaa0405b37bf6b622075dd69291fe5b53305dbfcc377d1f3082319c153d0c1ffb3b3346\nRemainder = -16e346b6a4297\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 30c77f3380ccf\n\nQuotient = b9e34073d5e6e5b9e5d2d7250150f8ad86870faeb88d5aed5029fb25c176de216e2388e0f5d33f7c3b56102873eb40b06f2\nRemainder = -16ebc86eb88339\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -197b6f6ad5b75c\n\nQuotient = 141bc8752e846cd63743e6fce4a22efc3eb5f0ce46ba81b8f578c94c516288ec3610fc9923f45d4af2b94c0b0a20b48ed0a\nRemainder = 9bab19f12d81c3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = eb90162ecae18b\n\nQuotient = -381bd85c951e1dd775b0d7fab344aadf06b1b592c643b5852fa44aa55159eedf3b3e47fe0d9f399ad92da85ab2bfd18240\nRemainder = 1e4f817a2f52b71\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf04674",
-    "5436391a673426000000000031\nB = -546c109fa8a9d7b\n\nQuotient = -5e385a83b56830626cf8306acc232f955178080e86384bbcf92eec3a8961360223c4cfc1d8d118022972e61866cbfc46b\nRemainder = -292e149300fdd1ad\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3246242094394c8c\n\nQuotient = 9af0246f4b49316df43f61ae3795a764fe9b1d071ce227982ebda7988a7a7a98129c94a76635c6913cb15e4f75ea1608\nRemainder = -dd3b3e32ddc79cb9\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1e928618913898b2f\n\nQuotient = 1fe40099811c648aa4e84e4fbb8cbc19706774a11391fc03a9667d8dc72dd0b26c4a46d0bae56ba90fe4bfac1517d241\nRemainder = 16e021603d30dde2\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 948887c1634f4b08f\n\nQuotient = -3f4fa4c179dab02ad461bbea8f890292c934496db560f72878323a4463d77ae261363f4dc8f53eab145fcc3815d3253\nRemainder = 407ccb4f0b814dc5c5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4ad17434071e1ce664\n\nQuotient = -4d17d19f7f6861189a520776339a1e425876808111c303e391118714370111151ef4ad2e6e84250f59b0fe09ab3293\nRemainder = -36f745b0f421d16db7\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3d71635bcc25183cdde\n\nQuotient = b976d544af44e711351c6618106d3a002c42ebbe22fe939a2457d24e8dcc35c95dde5c7c77af6b4545344a198be82\nRemainder = -107334ab98e5099fec5f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -198a54e35fa0cfa328a9\n\nQuotient = 1307bb8e89aaff7466bc238d32672fbbde7be19d15423bcfa14f9a23fe85af9739b72807fd4bc420ad0b0fac37a42\nRemainder = 170ebe9b83d4c43b79ab\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = f8e923a8bbc0242eafe3\n\nQuotient = -3925a167c1c4d2fae265f277302b989466e309a7211e0b7173031cbbb91ab7fac8dfe43c9d832764e222e9d8581d\nRemainder = 4d404e93edb435dbd60af\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -52e36cee22274556059ea\n\nQuotient = -4d5a6ef346a872142b999ff9a5429198b3c2a97e968f55aa2c01583efe30e9687c57e2bca2372db4d3d443052b6\nRemainder = -3a2ea5f9d204dc31f21833\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3d3c79a115d9071b573d2d\n\nQuotient = a49dee54430f1737a04543d5f549efafab25f0f28f5e304f1bbca191f99521c2c4be1b9927bde19e1ec2060bb2\nRemainder = -17d02758f8fcadca911a95f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1cc65a75211f2826c9d0811\n\nQuotient = 1808ab7c0ccac2ff8f7cb61248bf4624fb60352a356fdd1408904f8c6fb0cc52b7642ec59183bcaf5dd89ca0ac\nRemainder = 5c95323f3b8861261dc31ed\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = c516e6e3fa6e3dc52cf5933\n\nQuotient = -437e04d7076794850aada0cb4ca7a1055df103e74e00766be6a2fdb2631bf294cdbf2695d0a2f8f9eb5587aa5\nRemainder = 1fc63797594c56160536faa9\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -462ee529b488d1db2b6c60e8\n\nQuotient = -5dde5497accc4575a412e7232ce75bdf7905936e09e382d5c9f133faf82a05ad9dcc94ad858aed34cc14c714\nRemainder = -15e79293d5e055f906381a899\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 32765b0a34c88864d39bedaae\n\nQuotient = 11ac52a9287472e1d3b8577b3d50c95076e190714796761322b3ce869d96b44387e190e824849ee345d0a22b\nRemainder = -a158ccc7c055d64e7df3fbcf0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -10c061a37f6cbd11bf0c327643\n\nQuotient = 1ff5cda1551867577c5ca72c86516a82fb8fc5f59ce967b73c6bcc1b85168389872c9a747ddf044d6dba174\nRemainder = 21e766a0020ba429b330a325d5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 9435cd2dc2a92c950bb9e69b83\n\nQuotient = -2719c892fa3f4dbc9951b2095056a16159adaf32dff902e20a800a0cc2e858ccae408f2161aae25d3e1f6d\nRemainder = cafbe9caa1f83fd0dd3d5a6881\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7924e4dcf8f96da61f54bf83870\n\nQuotient = -5080dc99dba295f4a2d9a474c2ddfa3b232a82fe629fe62177514988983eff8195b37d3fee3afa343b497\nRemainder = -94ae72f78982ac1ff83f300cfe8\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3ad70d4b6b9b5f5b2eb65da67e1f\n\nQuotient = e475eebcfc53d49ffad2e0c2a4ba48fe7ce02c42ff107e01ab3fe5b26eee45c83c4f58c181d77c259155\nRemainder = -c83ac7582a02b47ee734e0f24dc5\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -14bbcff5423a260b21895327b18bc\n\nQuotient = 201308a421b85291d23465d648ad2a8d6f3393efc16fb675a42ea7bbca635ddd8c2449b1b34e5db30a03\nRemainder = 8e07efb8ae4c9df39533042362081\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 93aebb72a81ba68e8881fd1a56a90\n\nQuotient = -2584cc534f88f091fe471c652ac66a695906a7cde1fc1cde9be3ee09026b690c1a899378ff31f6acb90\nRemainder = 794801d9d5770a60e312b99d6b9f91\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7e408caf387a0ce9bbf4309c80755a\n\nQuotient = -63f7bfc0fe5a5421bc0a19fa6c87713a72eeb2a33e5eadee8c2f32c20d14f403ab8bdc424b9e8e0c68\nRemainder = -24227c242afedee2473c1a66a5cc29\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2f622c665af7f8126eabfd90df8e9c5\n\nQuotient = e557e6d2180aeeee5d2cef453fbdf38e84cc148f4608ade8836045498be2d318520ffadcea6319432\nRemainder = -dd290149e0e159f9ba6bb9f5a4b003d\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -14a7623d1d9dfc177e913d3119d0d30a\n\nQuotient = 1651d852316d472b41ba0460566e43fabb9257861859ad0fb6ea5a6433a4164299e078f4d50c58afb\nRemainder = fb60aff5fdd2a2b794b0d973ac4d92a\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d439da27b5e70342aa5cb365ece15665\n\nQuotient = -3ae357761a8ff43d3b1bc53eb336260342a39d22f8fac44eeeac96c2f6de32580dd6a688faa9c515\nRemainder = 4fa6f7ee4faf2f6be99c5ce4b65cd642f\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -50700f9c0da59482165a47a3eda2bf07a\n\nQuotient = -543b4390e4e254226683aa0b83b2ca176ec27a373969fb88f766ac72adc9125ff83b2652e46afd3\nRemainder = -12ff398d9a7d9e97a7f63a0bb293c8fb0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 383c5a4f1767e83fc382ad4f1c7c2b7ddb\n\nQuotient = ecb72c14c59d49287fb6b2cacdf04619ee617d5f3f0f1b2890fd4e79746a4fbd848613cf5eb437\nRemainder = -1035512a2717a89062d48f1bfd213333ed0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1402b751a1e5f3fc46e22b43240d6ce9b27\n\nQuotient = 1e800ddc5d5126f322298383f32fd593623eb88a91b2d68c5d9f56e20c16ffe2cefabe873570ab\nRemainder = 72935d534bed5ba557b91ea023601f50b1d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 9b4df766c608ff3efe5ea1f65cc850fa73c\n\nQuotient = -2c2dc2378abceb983904cdf6728f361d279b4c821710ae785724a7251c43fe4f705f023afa7e2\nRemainder = 249f6433af4e8e224eb570fd438197af62f3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -6b382f812816c77d65c94c0c660b31a69b8f\n\nQuotient = -5f3ced1e42fbd3c6b2c6f",
-    "1e16953e0c1bb6efb4e49566f974a968f69a1a66a3d7558f5a802a8\nRemainder = -317a7fb1af65982fe4641fbb1e5837e6ea3e1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 31bc97372d17038fd842b72eaba2abb26df62\n\nQuotient = af3fef8111c449b9e0858e7e53e1d00b764232f7a077d75043249c387ece30af351c8a40335\nRemainder = -a1493bcbf57a8480461d62796aa8f8541ece4\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1b076b2f7b78b4a0f0e24ba3a05d6c697efab9\n\nQuotient = 196734cefb08f09cb32ffefc07da8d9545d3451d5a08736757184bad94c73be71311cf1e01c\nRemainder = 273e33521f4d74840a96b3fffe169f79d32855\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = ba7746f4400f812919a3dc86b00642e1487691\n\nQuotient = -3c5989cf33145057a9c8e904435d12939db519cc6b9ca1c0a11934399cb139a73613950f2f\nRemainder = 456ebf56c636d54e37709b9e799e83b7a08cb93\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4e7d4f389423f42e980eda55b4a6a45f6f4bdc2\n\nQuotient = -8432cf3338bce1d12586f83025aea50cff3864af3eb2103a36bbb0aba10b0ba4831641633\nRemainder = -4f62c678137df301c4bef216e6aa910104e76ff\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 23d4c57b5a8162aae8d937be12efbcfd7b96ec06\n\nQuotient = 9f94c4399eef16dfc65a1e015e0786c86470299865932c4d564b71c9b1551a9c0308af38\nRemainder = -168b74a6073b4a5b54fa14aacb5c3bb7897ed0fe1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1daecf01ec633610373b79e04c22cd7499012bc66\n\nQuotient = 1d5b838dce6c0324f157ad125adefde6e1045dce9ff97cf8d1d39b79bce02128e3433ffe\nRemainder = 3aa816216d55fc3c910a030fd10fbda1e12f2ac2d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = a1598a12a84e9cba42ea0e200e88d4599c9f615fe\n\nQuotient = -3edb182b53890ca8762f3039d2d71a8a27c36cc884d0879e0635e6326af0182bc47cad7\nRemainder = 4610b2b1305220bc0de584dd3f87d90109012a8077\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4b5c2f1ba3a82047c9de61d47cbf1bec86b6ef90d6\n\nQuotient = -7571ed4c509630886483f6ca0923859e644063acb38cfb338bf3a681fe449501262516\nRemainder = -21c579846594fc3e5efc53ab01576a7b32d69faf41f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 28550e1f7c6492f4cb682c37b105f92b049c13fc03b\n\nQuotient = 9ed8fb31327a110ef4377258681c5287de8ef9dbe62aa4fe84a7f2a94bb69607cbdb2\nRemainder = -1b7bb759dd0ebc346cbe216e56be8063f063490c17c5\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1dd1e61caed1efc07d21ce05d889de1ad65808cae026\n\nQuotient = 1aa716227d1ca6af68286062b2d6dafd7ade16abbd5d6fa4ada0365832fe18f73bf35\nRemainder = 32e714b0c4ecefb38735cb88cd5e07c21c81be858cae\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b1b959a7b3262d7f4dff488315903aeaffd982b726d7\n\nQuotient = -2a9979a530046939e0b43a25edfbea6775784eb5cf346a9fc3a2d22e1aad473cdada\nRemainder = 4edeb91a2472e80068b1883cf2cc45d68ff9bbed1756b\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -6f31bbe097587a68fdf01d0bf93830bd03a23920ccc0f\n\nQuotient = -566ff76814e1c7d31ad53bfb9f3c0607ef1f7d1cf9bdee6e1cfb78b3ad7018f8bbd\nRemainder = -1eac095d6d84021c33aa9b219d191bd0637f20b5920eed\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 36ccf5bdece624b4f54c729a8cde13325d8dd764f44894\n\nQuotient = aee4f377611179d8b6315811dd94639aaaee63e99bddcfa8eee297ce1dc04daf8e\nRemainder = -59cb3ba7efa1637c46b21795872e8deaff90f13402cfaf\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1b157ad838684b45065aa77ca3238a4d8c5427f719cdfb7\n\nQuotient = 1c72d32cb83cf4a9043d3bb5002f61b03e29c34e44a9fc5cc4d613726f5e618546\nRemainder = 7312d11fb5828c7f1a0060a5152a7644fc1e6a59de28d03\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = a681444c4d47d829f7b629b561ffaa0c3be1232346c907d\n\nQuotient = -2702afc4095a0396215e3ca36e2a59725f743b30de0dd8d4ec4d943fef6c37162\nRemainder = 223dd3080ede3a64744b14df8742cedd71388b0df99073bd\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -796c9ea38ccf516a2054a1e584c18b64b996c9679960585a\n\nQuotient = -805585c6a7badc933bced6f8373ffdfe9796e963d3fc90e85b1a22c38f842062\nRemainder = -a6ebff3f651644915d5c466cc2915d104f0f85a44e08fd6f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 24e8fb7a6a3057ddcafff92916c46f7e4038b98c3104ae831\n\nQuotient = 10383ff8feeb180d4fde925b534be97ec3d5f1f1dab5d8cd9ab5d8ea646cfcdf\nRemainder = -a7efdd0401c74a69cf74442fe3da907acf92e8edc51668828\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1240a71ed8d81e86fd9b16e1d64f438b35d6f8eff672494017\n\nQuotient = 195d95a520fd22317492117dc756ff97806c48c1aac67a41ae56fe503a60cec\nRemainder = 8b8692bee56f8a1ada9ffd8b3583eae33a0df9b73a7d8585f1\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = babe02063b61cb90634ac0493174073d2419e00728d46ad2b0\n\nQuotient = -37791adae674b866e4791c107a697363847dee4a58a37806391426ea48b8c9\nRemainder = 33986fc6a5f5c4f4e31458fc7de55e08a4e9320509d90299b93\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -5563bb852e7338c65aa21c516eecf47f498e5788c608ed46cae\n\nQuotient = -68a30494eceff55e4f54a556dd9b30025ccfa22c0952fd746adfd13d31d00\nRemainder = -1b511d0ab81d528d00a1058850bef48df2e9ae9357e779bb9231\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2d44e919fd27bb3fd2093062d11830c30fa77febafe0a2082cc6\n\nQuotient = bd30999592dbeabb8871b76aa04cc1c6c3794a83f0178c2ad505d8189485\nRemainder = -b0dbce286df5faccf0bdb40ca60f508d436f9410c5e49c3f1360\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1909930e2d16fc877c15895a3ec8b2125858bfa1c5a1b8776bedd\n\nQuotient = 2171694ef4a9d57b83b09357a511d4e11cecbab5e9387928b480d686a0e9\nRemainder = 29abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 8da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b\n\nQuotient = -267d470f32911150d9944e684c14e1834734b15475bee968748dd5f6502\nRemainder = 53a2ffef61709bd7143c4c876e021f20a99ba481f2b11abcd45da3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7b117ddccee97816c2ca2f1a612cc0d94ac67f5a79ed41744c8fc7\n\nQuotient = -5a21a3bdd3a3d4f1361a978706ba1cec409c296a5b3c369e91fc8317bb\nRemainder = -2cdc818f1e445fb3772d2a56833aefb2f5565a5fca80662e6fc1845\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 348dfba3c793f0018d7d3a70c4060c3148b4a3163ba60af9d6f8b04\n\nQuotient = b301b4050fdf4ede8f9c746b26d968110e1eb119ca42cd9c9bd8d4fab\nRemainder = -17993daf81711fe59204ec82e363d2b91971129af9206ff9506d3cb1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1a76328184b9bea8770c91cfccf8ab98e75b2224d666af58022aca80\n\nQuotient = 19c401336dd43c221a61264f8b91791d250e6c99c61850efe6d1e3532\nRemainder = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067\nA = 1280d26263c574f655e",
-    "a63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d\n\nQuotient = -38a77853de88a8db14612884b515e3cd7c673175779d4ab71ba58f83\nRemainder = 51851549cfa00dbfae388cc3b46fd4824268e00e12fba288acceab339\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -539c0171f48e4160e5c308ee9e74f35d8b6d032e946dbcf748b1335a8\n\nQuotient = -79a7eab82e5b65f4f6734e8803fa7c30852ea3ae56e801c5dd11778\nRemainder = -f89592eedcbcc68d5df80663b3cdc638d9d779707d4ae5a552d97d009\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 26efac15401a945ffd37066bc5af23191292765164a0f1e4fd537fd64b\n\nQuotient = d33afb58753a21581c5b2351a74f3d220599ed56ebeacf1d43eeb2\nRemainder = -f699437f44af44b3ddc080f5b74f753d35f70baf3866040ba3c64b30f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -166cc6a3c60facfa0d8d318f26c6514c7eb9113f6b625c1de804ad379f9\n\nQuotient = 19e55bdaaa5a375c36e6869700f8677db563e5cf985be2a8d1b012\nRemainder = 7bccc3a653f29f3f45b52b8de2449c868c64d976666c01bff2dca03a8d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b6eae7a82b5dd1554795573cbf558d7cfed813eec270c326bf290adccc2\n\nQuotient = -297530094c3e4270ab5cf67e60fa5af6a32eb41b18b050fa6d46d\nRemainder = 62d8b502e172da7bce53fbb7c1ae376b6c21b3a3a47523aa0023406e353d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7241ae5f1aaee9340d437ad2dab94b70dd29fc6fff7fe31b100aa5001644\n\nQuotient = -640f3c38230962c6d6fca459afe0e46137525e8d62dd9b84da73\nRemainder = -16fcadd5155910764ecf0b4bd0afc3707e2ce49cedcbd5414f1c7d860e95c\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2f570d2da7a4e62097eb494ca43f7bde33e36525308dc864ffbaeb5d48f97\n\nQuotient = b3895ebba13c8f383ac0482be02e1f5518511420cb4513426bb\nRemainder = -21bc847fdfd48c7a4c36c778681ea20481081cbb7af6b281c8b8ebf2b2c3b\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1a6233954b3480af5f911a6bb8ad33967d5e0446c3e56f521e892c986b6b82\n\nQuotient = 243f3fbefbf842c79c5e96162fc42fe4f177a59d27681c54b3a\nRemainder = bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff\n\nQuotient = -30f7cef2948c9ebed8fa3c5ea9a9bfa96ee4e9729c9b18e9d3\nRemainder = 1feb3fd887629cca60c664e385dddf538d9bf7fff2d34ca9e0e7614946d807f\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -60bba60d69093c0134fcb90aefdb9c190e7bf037ecc13dab3cc7915d7893046\n\nQuotient = -6b6f0183c1f598a68683ba7435c05d700d74681fe472669a1\nRemainder = -1f4d58f81a8c18523918d31791a00ea9aafbbb87792d90a5392273ec4e405da2\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2c17372a5128d7c403a3b94838072ecf9aff88d164764b12bfbf6261df957e2f\n\nQuotient = c4347fe42b2a7d9d5a650b72724369c5c1f59262a7be3fc2\nRemainder = -1103ec9c4a15373949cae4e34b7b42e242da41edbf5ad8362ce5e5426d3154a1b\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1824671758069b7660bad819f06c86fc76a9344ea38412058380363e5c5b4086b\n\nQuotient = 15e8c8d6847dfe974cefeef5fee93da9e58b74d640c6c413\nRemainder = 61dac240f2b39832903d5ecad9cfda5162bf8ebb0610545f259b75c3dc6ab8771\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d83386fb9682576cc70cf84520c53169e391b414f5421cddca6e257bd77753c40\n\nQuotient = -3572711bf994e6ad48535cc4d65ac323ef1ccff530b4337\nRemainder = b5899d4cb879e37022c539962959339d055900cca16153da09b54c658753cf50e\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -58a05faf5c61f85ac5a090b6bb045c851ea17332d9bfad4309ce2b7a79ad3cc575\n\nQuotient = -6931ebfc6e34305e5d7cba5284829d088d1ec0abdde508\nRemainder = -1b09eafde481064bab3a5c7fd895edceca40b1e62a9cf953eae1061dfbe00936391\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2d0769f392ca9ec629ef1bfbdf08cd8cc9219330ffe3c05343df792dd94b1147714\n\nQuotient = 9a4800f0cb2bfbe8d234410deb510103b7da30cbac7d9\nRemainder = -971e4a529e439a1b96b942001631027ff2fbe40b8939e224adb7f2ed30faff64d1c\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1eb3d7971125a036c3a67d9f5ce580a4ef4c469a492be53a55bafd2eafd4032b5b9d\n\nQuotient = 23116704b7a1a86cfa2ee5707ee46268634db5d50dc0f\nRemainder = 467c6b64c8121e4f250492191ea36a27119a0a6d19af519bf7ccdc2436c885c99d85\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 87134e98f73470e23a96c6a9139af3d4d21574de8aa9ea1d720df8940bcbda343694\n\nQuotient = -3b7f72ecf4f55c02366c52f38a827f5773b7cdebb9ba\nRemainder = 194b334b2046a66be3ddd7c6df01c88967fcb11e97b8206d000bcf6043c6e9ccb13f5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4f9d0341cadfb1f0bc38184d93503faa196fb8170f8ba2b5d3b512c09d39b7f79a5b6\n\nQuotient = -6db1d69019dd4cb26fd65d5b88a31bb6413b30278a1\nRemainder = -2042a060391e181882dc0c8d91c3b03c1ea35e2eff01babb3ae876ba1e57a505d44856\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2b2e8f445c0c3aaef0285945e4ca37a700310e003086f34d02c891b94b117f3d3032fb\n\nQuotient = c0e5b9a5853bb21b5e2e37f469764579d5cb2bf984\nRemainder = -154669d4bce7914cdc8d79f2b8d1faa43e8cc3b20fb0767e1c9a47c9e1daed4b665cfdd\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -188e619dbb719381e701363de874fe168529c10f30d3ff184e4356991fdec1649f72235\n\nQuotient = 180054f8c36833d44cab9dd61e6d89d28605c564af\nRemainder = 59192ec5c6fbd9773b8b7dd7d8ab1800dfecc8eb01c29997d15ad75b79575d9e26e1fc9\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = c55b5eb165c63ac2794bfac21980ebacadb93f1e059309fd2b855621572e8d9b3f29018\n\nQuotient = -31412e97045c19ec38951b0e3884c66d1d7479437\nRemainder = 56f1425227bfc6eb1ecda7bfae0e5cb59e92a2cc5306b28465c8739e40893dc5c1e94cbc\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -602b8c25ded1ab3877f58cb048c733649c7dcadf87b2652e35c4e5544d2306107ebff7b3\n\nQuotient = -8da1489ccf7203ecead94c67a5750884122b6e75\nRemainder = -15162026586a1e55dda72785f31c9e6140d166a1fd34c87a7d8c78f8d8f87bbdcf8f75b1e\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2171ee4a6f7f67d5a33d0a08c367184d70ffe39da28562655e75f6b66c866b1c2ac93e467\n\nQuotient = e635f8bdbf80e99723aa5718d3fade4e573be2c\nRemainder = -ffbd73bfe05f95bc2b135f12682288c620215eac3d6d56503d93a90e06f236e597d1df975\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -149375d478a096e724b84faf795c589ef0d772c4623f5be38da99006cd833dc5b28363faed\n\nQuotient = 20f76f5c6d0c8284764a10f6936c22bfba5f851\nRemainder = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f\n\nQuotient = -382586dfe93872abbe3a504fc62a8973913f96\nRemainder = 4d407323ef56093eea2f3993334215950f4e1a85ba18cdcd77d819d92b8b292c3ec",
-    "8edea425\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -545d81ed25602b158bc79aadf98a8f655fc399fb8652ae94333bf54c8c9ffaf8c6b3f2a9d52\n\nQuotient = -7d179efc493eaceaf46572a1f3a62bdfc4a38\nRemainder = -3de3d817a9cf7d529b5229a503e8ebbbd2c53215ac3c584c010947f780198dee16ffbf47791\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 25dddb00f65d6a1ba8caf7815a8063c5da656d775eae9e0108c68ce11dc925183810888dd04c\n\nQuotient = a9f7e5f235bae0e3e29393ac5c99d510b009\nRemainder = -150478b4a0df3eb20dcd1be8da283a00636c021c5c6337e7732aae9c4b49853b95f6d2475ea7\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1bde6cae7f5ced9006c0b1a61fb50982a433e4e2050aa486298f456556d8e909e96933e2ba3ba\n\nQuotient = 16de125df5936181981b4c2d0051a8b4d211\nRemainder = 29ac7c8a11f9beb9ad649257994216146b663bf4f237c561bf315d95778fcdb1010283475ebf1\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = cf24735a60ff5906410be5c4d98e3c9247919b57e404aeabc7eaefbf07bd64762bc61b96c9040\n\nQuotient = -268a52cd10ab4814268f66d9f44f71a98eb\nRemainder = 20293699f12fbfef2e391963866fc082a7884cd13b1c9bd8d5d203558feed2b889720be936451a\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7ae7d548212830013b7d653072c33f0dd54a6ebd8792bf75809d29a8c798dbc67c3edd99a69b85\n\nQuotient = -8f051067ccb82b6a3dffedd0ff2ee97c46\nRemainder = -100dac0d3bf5aacc5fade281c071eb2399560a65349566567ce1c0c34e43f175a575ed1eeeb3b07\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 211ebb5dc59a051fdfa3b18ac491971e863f2086cdc099672c1215af4ec877e29950efa4f487be7\n\nQuotient = 9b7ee4c499386f922432fcb1a453ee2ec\nRemainder = -f410122a74386d724cdd45b2e548645ac5ee4a44cbfecb82aad34ae470526674da44ebbf557bb75\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1e76750814dec1ecbb1af0fa2281ab3185e94e47fc16a77fed312f23f261ad7709ad7c9f85862c1d\n\nQuotient = 23efb26228d7bcf281cd45f54572e2b3a\nRemainder = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413\n\nQuotient = -2cfcae0e922f2d884bfa0a3346dc9812\nRemainder = 14de2725b11a9c6784d9608c52770d29b9fbf824ecd4890bf28f3ec0dc6c52e4df9be540332b8882d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -694b057ff381badb37c7c15c81e74cbd6774e8d61c9e7d450811c36262ea834fc1287fa59708ee072\n\nQuotient = -4c0238ff3c18d4d58e543f020002802\nRemainder = -2ddef796c50817e82ea6f64a02a8c6b30ab40070ff5401c2d39ca14b9c4d99de33834bfe566a0c2efb\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3e51c9ab14f522b55e8f9d3ba995c0846a864dfa2d568ea211b0cac1463ce6a1da72d0a15746fdcc9b\n\nQuotient = d41f9102a7785ce64f76b7d7b870b0\nRemainder = -106eaafdd518c658bd371164ee43ccd915a01b513fc7d220900039ff840ba36450e16ce9987e08e7141\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -16549c5d57b531528dd4d781f03cf275b66cb94eba038b782b739c3ab30b8631c8706abac06004a942d\n\nQuotient = 1616b432b3277e774aad92b0cf544c\nRemainder = 2c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79\n\nQuotient = -320fd6a7375a42a3961362ae196d1\nRemainder = 5336711bf81237ea3449f4e9f4e6358dc250f8ebd86082cab92a8079f2c8f835bc783082efb0ed7e3f66\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -5e9e8e1d446fdd314d487cac1226088696e33161d923acb67d3c75e87e428bdbc193e02f53200610fcdb\n\nQuotient = -4bd06daed3f30345d269f51e4381\nRemainder = -1f3513bdefa40662f0f50a04b418a833aa2f85522dc6c399298b1b147662ef2164ddbfb7247ba9511b8ec\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3e7ab7ffe5f63a6c1e109b95b83af470ff820cdedbb3c90c398ec42e44a45e1ca894870a7fa51f17ad5c5\n\nQuotient = d6fd01a0c5b55fbe36e58bbe77b\nRemainder = -c51af3e8b430870388357cb366ea888bd7b4ccde09ad3a1d2ee1426af060245c6d6b5980ae87fb66c4642\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -16086df3dd5e665f2631a294563c68931faa19ee67d6a2153d262940a648ae71bb3c1745daca5ea977331d\n\nQuotient = 18bd9a8f5678d28cefd955cf99d\nRemainder = e193f2fece67b7abe16373c3f84f18dfedcf654d951bf47585fccfaf67ee04f5037354d057c9f5eaa8eef\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = bf758acacd11f3f3e6665cd740517c9ab2384266f3c7ff9afd0888cdad2f6c9401c24d6c11fc3949aabbaa\n\nQuotient = -371239db55c79521206c9e60c0\nRemainder = 93773085af7582dd298b09d7098835787978d820289ea6850f27d0d77eecce8614785e32b228f46ca4b371\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -56033fd85be464301f10177b58d895fbb6df6154da5c2a2a7cfc3a24d83a96f5295fb17a08148a4e51dde91\n\nQuotient = 696d8e378d12221e2d970c53bf63a20ef381db8566701972c22fe067cdba99c57b68706a5c6e52f21bb3de861e49ed2141b3036f07d1fd0ee\nRemainder = 9f0e50ca76031b\nA = b2668f5fbcf4170820ed3fc9b12a61862acf8e3cb17175482efe23c5cfd3556e77634d407b6d1f98a73437a8d6066319a7a860afcab2338a1b1313037e30f4d9\nB = 1b1313037e30f4d9\n\nQuotient = babe271ea266bc7bc16d193097903037819f82366c7e9ff8f2cb14157b40433c6ee327038d5dcc44140b070d823befaefbee5e13419f6f17\nRemainder = 93d7c547a9ba0a4a\nA = 74b1a591f449377836f378e05d2902b29964df59c6926e5a9182cc09ce3111783cb7021a185340b4880d56635de268d6f3855c4d9997373b9ff8df899ee3b3f1\nB = 9ff8df899ee3b3f1\n\nQuotient = 890139fef28aa3b77814e1122b9c7f26e746ee3c507e6082b508fcbe380de83b06a01f735239c6847c30eae44749fc8c5e3bd97eb40ba297\nRemainder = 6c97aace900389d0\nA = 7e89adea82b4cb6feb41297b6dc8d948e72c3d5554a987900e7fae48cfb38fb5282b13d9a1f5793cf7cbf1ef551865041c3ffe0e287714a6ec7123556af55a48\nB = ec7123556af55a48\n\nQuotient = 1fdeead441e2d7a6ce3cce2389b2a22248ddca7970ae3f7e7d8453052fd08534ff7c46f6a4537fb6f28df6c5fc8a7d384336e679b74205315\nRemainder = 2903c7cc2651bfa8\nA = 9ca66de3d83f0a747fe986464522bde5e42aeac20e8ace1ea13fa6bc9514c58517479a4281d4128c6d775489b85dfd114ad184613f308f6c4ea484a22ab0ad1e\nB = 4ea484a22ab0ad1e\n\nQuotient = 12f16c8f9f898a08853982e2ac5a906d784c5ab8d74007ba3ab311e861d7c1ac115efe694cab7583f75a4a59ceff2887dab53b2f1022aa452\nRemainder = 4bdaf1f352e87aa5\nA = 6e6a97b358b591b78db43772378dc084a11836ddc9dd4607f263ce620714e8fdf6bf67387c163b6f2999f84270802b4bd5c0f0377e949fbd5d42fe145e66ffeb\nB = 5d42fe145e66ffeb\n\nQuotient = 14e0c06c8cff1f9f5dd8afb6fa6c340f0953a18ba7d2b26b22d8e7f946ef20fd5ac277ceb59cbd4ce3e8213803c3b5b0452ed449e22bf2c29\nRemainder = 55422f1caf4a9a00\nA = bc9c054ff568af73e301e0751bc1ee055e82826cdc53449f2d9f45feda2ba227bedd6df9b74fb58a85917d60b087bef04a156a571716e9bc908ae83784ee35c0\nB = 908ae83784ee35c0\n\nQuotient = a457ea94da3237c0dd15ee30e9c13e7b4ca1dc90fcd67951b873787206babaed837a3eb17e298d74cae92d1059636f9aefe11aef9ffa31053\nRemainder = 124768541b600598\nA = ea6dc82b1906c277526ed867fe8b0fbe32feecfb935dbab860aef59a7d72799fd4e952e70b4c9304c7b2a06af8badcd6cfa12d0b6c9db38d16d2c4a24099ca14\nB = 16d2c4a24099ca14\n\nQuotient = da0a37eece8972a0e2e8817c54e67c4d9f92373340488539d5051984bce0ae3300ef6ca9d0902daa4d485dec3b4db6c8b1ffd2c5d08b18ae\nRemainder = 1ba15c46023500b9\nA = 36ca8763e20e6ebf07a55cdfdd83892bef0bab68ac092093bfdac1a49c1da015541196a24249bb2262e70f7ed53e0fbae61f02ebac4b61f740548136ce50f243\nB = 40548136ce50",
-    "f243\n\nQuotient = 3d8c433daedfbf681b528f88d610204d33bbe74d0b13978c34a617ae94177e07a757519b5a8f1a93a73d0751c7b5b72b4bdf475a9708fecac\nRemainder = 4cdfd72349c6110\nA = e0dd7e73b2a64dc017da65992176e2535c43b6fc14f2f7b0a7d894d768bbc77507eac0112b2dc3ca83d70989a1b949ccf374be6a012d80a23a74bba39671fcd0\nB = 3a74bba39671fcd0\n\nQuotient = 39d084b444e39c32f2883e9968301151802da15141f65893f37b8b834eb01c074aa1e1a978c5c99732c87ae106bf8db09e1728c8bf2aae88\nRemainder = 2950443357cd7477\nA = 16df31dc290559c3b6a3d192cf15d825cfe79f8dbd5c9848eac7fa90eea5d87f8b430cccf9baab3e8e4dc33467a4234d8551ff25e33af175654686ff1368e96f\nB = 654686ff1368e96f\n\nQuotient = bbead8f70c8e61114f22d36e97861f16037efabe1347613e78c51d7f539065421a66c907faddaed13ad2a0f0b00f8fd594e917799cd937e5\nRemainder = 3013136f5f728b68\nA = ba5e688ab4f8ab5c25592bc4334b6dc2b7a06d491d0f919b716bf1cf109b62a30d9dd59dd4bdf870dd2687894edab303277a5f3e3a537cc8fde3ee3bb61767d6\nB = fde3ee3bb61767d6\n\nQuotient = 42aefe467ff2a5614efef1edce25a1acba9c476b3abbcd680140a3aecf8f51c1ebaab8912de217451bfaca2842c0bae717b8a030b6318c0\nRemainder = 1f130dd2ead0d35e\nA = 17bd50b5322c51ac883852ad2a4446c039dbc210ca3aa0313065fc88cce6819b324e93b036bd0c71be58586cd2b243d01a4a918c10ea0cc5b22f9d795df09de\nB = 5b22f9d795df09de\n\nQuotient = 13de73dcd72a3638fe2a907fd7f6574bbb228698fa60e4ecffb082911c5f09c74bb4f50564d3d4035d07eedea38b634a3e3acc26c8e9aeff8\nRemainder = acb8702f0113e0c4\nA = e0327b2e59236a3f91ccf960490cc69b2afc854de9299ad2edff9618f9fe24251886afc65f5c581a9bc86013f356d599e98b8b10f5236a51b48a6b29025983a4\nB = b48a6b29025983a4\n\nQuotient = 27d11481f00519b786eaee96220afd45bc51700f7366fb5e7da35bbc84891aac3d9d2b709dddae371a6b78439fef810c68eef586e1d68350d\nRemainder = 3d1890c5e1555d74\nA = f3504d5d96c9e27a1527725ced337f1cd0a183531642051e166507432c01e8d44c4e8918701c2a05eb8a9d7e26bf04993f9adeef2826ae4e61c602477f849121\nB = 61c602477f849121\n\nQuotient = 10bdeac209c67b023044186704735c7291423054bcddc24b731ad601b49372f4d5ce6e9d85002f8dddf0411efce943f81a5e42cee2d0c9fe5\nRemainder = a93a0c5bd51004e4\nA = fa29e37b0d0410d19fd180149b14f94ec2edccd347da65f6832850aa06a61b7b78c96faf64dcb347893c93c560b8043466419864a382c6f2ef1412873b2d8cbf\nB = ef1412873b2d8cbf\n\nQuotient = 1c9b6cffe44241292320c0660b89f2f77aaadc8d36e33f5ac3da0f12b3c114a156870a92079f7192d237f8bf49aeee6282531c929cc56d75\nRemainder = 1ce3e5eb13ac7958\nA = 144325a641463ed6bddfcbd73e50620a44c606d71fac38efb1c9d2747b4903f7b51fdedacfb66db022aea09b43c7c2ad7b851035165ebe59b552d4f7eee617b2\nB = b552d4f7eee617b2\n\nQuotient = 1b4ad18dc0e634053beb3cf840b53e35117ea06309ea8ca22e37123fd7e1d391c96c792e5125e322c27daa73301024080d73ba3491484b659\nRemainder = 3286bdce6dc3a828\nA = e3a2b90d3ef446f6bde30d3e726cf3e78212324054b40deb0b18fe00645568fb0a6234b6bded6240977373731bb30d1349e25cefd54b7a9985735e9b78002691\nB = 85735e9b78002691\n\nQuotient = 28f5e8da6733240cc2f18e3cf4d42a50d92816062af33a9e1871fa89bdb39a0d905c49faf51cc1c1378741bea34d25ac2c8e522881a6f6087\nRemainder = 135784870eb40c68\nA = 593206f9367b72f9cc59b3e37d2eb23b2061422859162ee53656899c2471017474f500c6e23efe1f6b1e57852cd4229329dc182ba01a257122d76a26aaf9b844\nB = 22d76a26aaf9b844\n\nQuotient = 1ab276448d16c533b6e90b5b5ca266e13ec27b5a58c80b7657df963ec2d1fe4eb1c1d24873eff6408bcb3d0cf97c31e85240eedf0efcc1e5a\nRemainder = 27b105741264f875\nA = d84fde3d851b52ed3b2a1268e9b765ec6c09c5768bba709b3b799802fadac30a6c3184185e6d57249b1c34619f3c9d2b90bc0c348b22537281a39fcadf738083\nB = 81a39fcadf738083\n\nQuotient = 84a87678485b3e60ee1cae3701ebdf0a29ee44115a492c34a0c8e84090e14070eb2ad0abfe2c339f26b5099327515104fe3d1c5546feea98ed\nRemainder = 95f7434941f9d8\nA = f79a0643bcd9c28cc22cc7b4178b3340e4685dd2672792516d6fc08567d2de2d3e25d43f100a58826edb146ac94acac4213bb09bdf8a258001ddd0ab110b89fe\nB = 1ddd0ab110b89fe\n\nQuotient = 516a2ac26e5b3afa502c7f3c6f15376f7a380e5842c229443343b5b74dc3de84db3ae99a0c57043e32a504ded19943c0310cababb3e92cf8\nRemainder = 327cf78eed336523\nA = 17c0d5814e1020d5d69674bdf6b9df193a16c0c8567a589d014e8eb7f6c9c36560791f7acbbbacee7c456eb51a4cdd7ca88011e9d8d9f2d64ab08ad74f7be5cb\nB = 4ab08ad74f7be5cb\n\nQuotient = f0da0beebcfaa716f494cf3fc81fe65117c90adde3b3942e8e66986fe8050fd5c9ebe1c88c5db04cea4c4c14779555d70cafb53870671f95\nRemainder = 3b2f844440d7be00\nA = ebba8c393c2a22b094d824ed95b4acf6875719fc165f73ee6d359e1134949169fdacbb42d5deb8cea96e11e3aac985635b5bcc6c02a6778cfa8e03d9ce6fc680\nB = fa8e03d9ce6fc680\n\nQuotient = 56527f07593774f0fa642241400985d0bb9b41d3dc9e025ca069130d93afc972d75e3fe0f798e127c3e1b4e925000459a3a5a83b15186e516\nRemainder = b620b7a3b752b78\nA = 5d6cad9e26267abb480b2b9ac5ea323bc4c3c53e0de8ce40c89c85accf0499aea5b11703a04296519047585ff12f8795f98da0546c20016a115100eddabfb468\nB = 115100eddabfb468\n\nQuotient = 294dca3b56ce9529aed2c132a9bd6c0c61de7a58ac50582f396b4fadcf7873b502bb869f801a9ab1f12384631cefee72b3e6050a7f69eba4\nRemainder = 53a0fcf5486c7a6f\nA = 24aa73803f270185d23310df2cf3ef67b18d7800bc41aad2ca13f372a27ef0a9217194f3f512e79f545a903895def195a5eb9a1a1b6b3f4de340e9da9b305d3b\nB = e340e9da9b305d3b\n\nQuotient = 16bf4dab1c29bd284c9b6649de65a4ee58f21d6a8b51627ca133fa817872b1a4a9956662db0aead5898ed0eda08511be7c47449638f2fab95d\nRemainder = e7751deb047d98\nA = 77b04d93272491322ed2fe651044e28cadb2ae7825f02b55aeb0f73b8b8a8b336802416fe08c718ab681581ac04d87116323f61f50bfd2180542fcd4a46dcff6\nB = 542fcd4a46dcff6\n\nQuotient = 388ae1c243bc9111e663c0c80495c36e8767bafe188b532b7ac84b5160d902af1b638aec6e4c66955d16bd8ce94ce6027a7bf95910f705ad0\nRemainder = 7c667ea307017c2\nA = 52f357e9a57722a867d8199242e100f06e8df810ee913d6992bfd9dc03ed78bcf44d692aaa7be806df0c9e0802851d7ae8405f76114e6322177907198f85cb62\nB = 177907198f85cb62\n\nQuotient = 33dc2fcceef7dce92e3a9df58566c6e28d03b58ff6ecbbb31e43936cda6380a56788285d37b5e8f11487afd78c39cb2150cc98d9d78a0c6cb\nRemainder = 429a380c9f8eeeba\nA = d99cf9a0bfc347c9631ae8c69defe1f1509c3ecaeeee5dbc61317bb73fa5cc6e704f64c865cf4d898f8a2f63214dbd511f61aa6e09856222432376698f8d2f67\nB = 432376698f8d2f67\n\nQuotient = 18ecac9e5539a014cffd8310ceb1170577cb23aa9cb3c523d57ad83069d1609ff743cd3c275b67097a038b85afcd7105ad21672f9ecbbc7df\nRemainder = 37924fea665f5c92\nA = f87aa8b6e62b09291e0e9b832ad71d8f85d60501a8d89d2638dccd4022e89bc4932c186a198557282527dfa86dfacc2f90fe0656695b61429f8220509f5106b9\nB = 9f8220509f5106b9\n\nQuotient = 37c0649a53c8cab91a7458702870bf64cb1de9fc1c6b9a3b92444119d368501b62d3a5138af72bdb7752eab8af6bf4e3bdb9e3beb1805b88\nRemainder = de179463e3e91ad\nA = 995c04c1f24c4efe88393bab7a7545e39193662d5db7c8e557d6c554ed4367f5af82c463d0ba6bc3148620481140add5677937989e03fb52c0323980d8841d5\nB = 2c0323980d8841d5\n\nQuotient = a6d193cfe7d8983768ff29908ee6e07fee99927a4bc4ef41d01f63f3b4a2e7029630b7d925d0979458cdaa903771286af672253cd99593b3\nRemainder = 6bf69921db298b3e\nA = 55c856daa8110599cc4fde0a44acbd69a68eb177e0438f7d843ba0fb74caab2a7e0c8a6f176f5555779e65c555e9157a16a1497edf36ccb583a458f0372a57c9\nB = 83a458f0372a57c9\n\nQuotient = 63f379bef9866b59f8bfd6bb0120a75dc03506b0034e7440764afc8ec14d8d735aa6f03a568ea98d0a74ab9bbe9c6e11b288467e5f79a2539\nRemainder = 11c077beb8667d88\nA = ff1fc3ea60fb37ff23e2f2f4e207a86e055cca41eebcc5bd6376904b51fb3d233cb04666fdc92be33239b5ee552870e45717890e35fdbe3728d6ff55d5662419\nB = 28d6ff55d5662419\n\nQuotient = 285ba8cdfbf00b112e496ce65cdba2271c82a273b3d30bed82ef2d360790c5deb97f3311bd5eb9876a61e33b3a37782d00c2d5ffbeec752ca\nRemainder = 1672a8aa119c3a1d\nA = d614352268930d301aa4046cd38e2eda4dcfcc52eac984943f2c863de5c4f8a44473a8ecebf12cb8f4da4722d305e5c9c3eddc0109d416e854df334dbfcfdd4b\nB = 54df334dbfcfdd4b\n\nQuotient = 358178128648fa9ea28dcfe68b4cecc7071e129e3ce4d113f5d1e387f7e5a412e9d2dfe5ff16d9987a544004d213ade9c134cc240eeb6871\nRemainder = 44c3fdb374bc0c30\nA = 18b973dd011969e29a1f4a5b8f118313f715c2e31dfebd9fe0957cf23cf36eded89c38637a8d3512bb23324ff2a3627d5b942300200c823d764b7a6c12d1c91b\nB = 764b7a6c12d1c91b\n\nQuotient = 19ea7212f6604d423b308fe3f2f4986f31aea9d6a117a3e207e38ce5bbd8d7a866285ac60433630de547fc84e364c451457fbf864a82c6613\nRemainder = 2718de2dd0796f08\nA = 83577f755a448d5586e19486b04de7836818223ea920465c4eee979a9ce5696ad8e2fd5253b5d5dcfdf355465e8c0819658ccc5580fd29b351169b54c62b779c\nB = 51169b54c62b779c\n\nQuotient = 13e0c5b9905770b60a6f978d1c983cbc84dccfaed0f4222f534df80c7d3d129f5e8f74f19581332a7f6d383915424c71db4ca19bde2591fcd\nRemainder = abf5f6c8ab6ed4f4\nA = e2bf43c91cdbb24",
-    "4790eb165cc13feafea36f5187cc9bf8aa8cf202042efd5441e3822a1164992da5be750aaac0bb11f09375bdfbd4a39e3b682c7ee6ab5f5f1\nB = b682c7ee6ab5f5f1\n\nQuotient = 3919f31521e87f90df3a4463d0c83fa31e3f569449009d307962d26f07d854e8d3f0badbf55311c206bf34e6227949327a93b1a5ada7a930\nRemainder = 6c3802d44dd4668f\nA = 2546880cc6f97fb379afbc4a2664115ba7909414f35a5bf88be2ed5187bd1a24afaf82eeceb0b438d4999ebf9b7ec752236669425bd3cce6a71d9ad67ff2ff5f\nB = a71d9ad67ff2ff5f\n\nQuotient = 121d5ad4115c2768b962e51d09f426d61624e0f203ac6c923289b4e7964e165b34f3dc1ff938a7cf37478d407de251c64db71d3ee629c1035\nRemainder = 660a35e1c1245910\nA = a36d3250c123697adbbbdf489e6cb40be57febaff654ca951c9fa0b396b1714c55ed6e05e468153ac443dabca29de9b43cc0cc4e62cdf24690593662c86fb5ac\nB = 90593662c86fb5ac\n\nQuotient = ad81debaa02f6e60da58b46e76ce041fc4da64138634ea7b3c165b8fbda027eb64b6b5339e70babbb83430d60383c2cfe22029e617fd03a7\nRemainder = 2e4aeafa2ad76832\nA = 8992cd131757ba5cbe54aa58be115723ea3438ddc782a4d1996980b7b312fa76e4483584df744b10340e5fc9e468690cef538920a732a8f0cafb4e30846cad1d\nB = cafb4e30846cad1d\n\nQuotient = 67a71b9ebaec91121a8cf6bc2932b6be01af7954eca69c5202d771c2c2d13683cdf90ec942a3445771ccfe484f947f078de825ea88b3c05a\nRemainder = 8395953f744cfb31\nA = 4f8ada84096198175174896167405b85cbc03fe0642f6b263a70f9a22f19ad6c9aef38da8ac036d409e6fd925023c95312cebe04eb653e0ec473dc8dfed98967\nB = c473dc8dfed98967\n\nQuotient = 9416326e2347a541b777a0fa1b0c35d8fe76c940d24c6f6806d6ae8ac1e280c16e480786478bda3f780ee92f3f3c361574efc2ed5ca98e26\nRemainder = b8ff45f31bdb58d8\nA = 902f5e48b96b9b1fd16c3b21292ed495987ddac4e1d92b2ab10378f2966c4399d6a41eef622a4991ccd1f647531dcd145de4ac99b3036779f9414ed2f4ba7e08\nB = f9414ed2f4ba7e08\n\nQuotient = 403c651b4e571e8301c4158fc185396554bf61d900708d2af5c2bdf495b3cb539b0b9b5acd0d71654b3aa68024961d5a7bc9e2788e6c822b6\nRemainder = 7856ec047cec8dc\nA = bdd6d846983fbf140173a26d2b709b9f31b4fee1eac9d25fdf0ef3523be0e6afb372acab470cfe1806b36d84017ec99302eb9eb5eb2862222f4916d8b6201d14\nB = 2f4916d8b6201d14\n\nQuotient = 1b6d967173f9777cb6194c8f69289b91da731456fe5a1515a49e4463cd906c84f97381cabdf9f358d97fad5d3cb140e3a3de397e7f9f683157\nRemainder = 83649246ade8bb4\nA = e3da80658acd53ada7c2dc57178e697f2907c5b0c64f4a87a794ca7521105a0568a32874207646df3768ee60964b7d1d2e29ea6bf7fbaa7e084eabd4ea553a72\nB = 84eabd4ea553a72\n\nQuotient = 27b8f1e49e404455cc68217a20766590e749507976a3a6de25a7cf2c32593aaabb04d84deba1ec6bbe048a2959ffd747243c396dc53c9c811\nRemainder = 3daa032278ce53d0\nA = ff3ead7c7b27f607d16f1ef4ffa91b6cc28301b9256cfcb0c22b6818371ce648ae8812dc50a86e4bdc0d0b1e5b0d55c6ba07b240886a6d5766cfb3ed0937a543\nB = 66cfb3ed0937a543\n\nQuotient = bf987f58700508356fb6274f64a9f78d455e4c436fc6fcc980ec0800287ab3789b91c29a8a72b16645ecfeec926b6f8242f3c7dc3adb40cd\nRemainder = c007da44faa80584\nA = 971aa67c9af10f70977f600e10f9278b8e66d2471956da38e5f4b3fedce9a5fc7ff42b800bb4a78314c70bb59394d0880383f5182b6c1960c9e5b47ef8e63be5\nB = c9e5b47ef8e63be5\n\nQuotient = 7332104442474715d7c4cdac15fc1731240f8b4dd0e6ff3284a15a62a8f9a071dedb87f2220efcc5839cb7e6933a8f65d767819db26e134dd\nRemainder = ef65a7789f54174\nA = bcea2ae4b1edfebf905a5820f0481b6c58d76a69df9dbe84764add3f49496a5d7005d645eaee3754e0ed105c13a114e6a0eae5cc4efab6aa1a3d3a0050fa86f5\nB = 1a3d3a0050fa86f5\n\nQuotient = 3f6182804a7ff12fe7ed3c8521b55564559b1a47a78e1fd56597b9470e7e0f6e7e48c58bc8841c9d118718ccd5e0c0bf9a08d8e244ae60da5\nRemainder = 398e30aff5bd284\nA = 2b877181a960c5e29ab1b2672ee22539256a82369e8f6cb5bcfb69e5e4a41f782e89b58fc0ef6ca336469ff929729f8492b44f12199f0e1c0afd12b2c999e787\nB = afd12b2c999e787\n\nQuotient = 1a80a681d2c42edbcbde552323dac3a1c03b43251a99b5549da6cb39ec6947daa0d574f0df68512984fa8e269b0b27a5576b3aaccb76ebc23\nRemainder = 378e44fdc7a5ec4c\nA = d37e62f44de27a1418f348139eac5ab9fcc1ada21ea6d7695273daf638b4d7eee6745f54b99a9678cf742d304736ee356f66d16d874f8cc67fae9be5dfd41a3a\nB = 7fae9be5dfd41a3a\n\nQuotient = ee982a63816d56758c29d284c19b9b984908cf0a9ae3f1f926e162a2cae4f88703aa477c5c14042247635c103494d11593c2c3839baf4d93\nRemainder = 39afe3275c01aae6\nA = 9a0b0476cd33861d2fc3137df292728e1f636f6fcba5105f384533723231a3104e7c77df46f7f34a4bdc63d5c67b418cafcf106b26ad020ea547d34edac1d3a5\nB = a547d34edac1d3a5\n\nQuotient = fb3f4a39a661e5c31228a6b7b4c27e6e52d1954e8ce262b98b61650efffd762cf2a1aec228bec5d5787683cad6b2e6e49a0de91c15c81874\nRemainder = 63e5ed36ff73a42\nA = 4453712f56467328401a69d4d749a0771732734a760a74094e50a62a030cb604e735bfe0bf0641754edff94ac0e0549e8c10941255f0f21f459e52a6cfe4d9ca\nB = 459e52a6cfe4d9ca\n\nQuotient = 7af60a7c0f995178be76c070cf49eee311e6d1e3afaf50c8c93ff200c1b3fe742b23259b4fc0b9ed0947be4fc9a6c212d86de9a0f7dbb5279\nRemainder = 19657d8ce516a138\nA = c9c92a31ad0f3cfb56a294c42a26eaecb77edf33ed40a7e6797927a0c996a7c0a701b484741163df388bb082e3daebf4e1b7a99002632d6f1a41c1d517238557\nB = 1a41c1d517238557\n\nQuotient = c890c55a8e2a3105b9bf9344a57a9b9fab5fa1fd57083d52431b695553bfbe7a44a9b6cd1f83958224f351f8511b14215d1648e88e938573\nRemainder = 1bab5b03c372daee\nA = 88341550e470016c7ab600b9f6cb410071a77f907a58cb6da4ce3e955d1e859534c2c1098fcfd91b9fa66926e51896733c36a824c3a20844add94e27f30ca651\nB = add94e27f30ca651\n\nQuotient = 34c240c42da400317f66f5151630493a2f200ee418d5ca3300cab10dfb429c2acd7280bf066fe19115f86db83d8f5b93cda714533b16abfdc\nRemainder = 18cd326996ccebc1\nA = 7e96d7b90ff09b114dd4393e9bdfb13d8ff517681126c566e18dd6369d87d248734d94bd02a1f19cca90be7642822b636369c51dee441a9d2663ec896e1d6c6d\nB = 2663ec896e1d6c6d\n\nQuotient = 10d18159e75efa8204e325e6be830b4ee8d2c07419e8276edeac6cc286488fc0c888300db3ebb5f935aa82654d3b932540f0093d1880e1d6d\nRemainder = fe9b6b8ba7c30f8\nA = 731aa6e2fb2ad1e1f80d7668c7b0642203af24af382abd207a5ffb588209e8b5caf953e9a96b478f39ec03a397d1433998e3c95e382d93376d80cf0c957788e6\nB = 6d80cf0c957788e6\n\nQuotient = 450d1f4a105ff8d1a3efbb12165ca98c67ae70404472e4862db479e03313b08783ecc42104780c9d57df0ddf19c5b4547ee9ba52ea82dd0c7\nRemainder = 169e15b4d5aa180a\nA = 902bcb1904b80183656dcbd51879e2982e2b46a547c9ae3119ffc12c6a003e4321b519289b7f22fad19d16480182d1d797c3045b2d29dcc12167f9ce5e233d89\nB = 2167f9ce5e233d89\n\nQuotient = a426f71cb3d75365cd076a6c35c10765bbc3f4bd317fb83a70083b0f7dc43a4e0b95508e60dc1dedb780e9b485f4f7a8870960de669b73af2\nRemainder = da381ae5c97a506\nA = bd59dcdefcbaecd9292c4c3685fb87d3a94c0f0ed01e43e63e1f36fb65d6c5eab3b584f3d1f76d31458c9f6b4c69869d96e943c61df102771274c5b4d821469a\nB = 1274c5b4d821469a\n\nQuotient = 26ccd4b7be090af22221729b0ca51a5e66435c2d33f8d88f94405f6c0123ccbbbbc8080cd8448a977946019ccbf5d267ac3f151ebe686720\nRemainder = c41f9e7bf20b376c\nA = 212dbeff03f14b5825f0d7cf8a7501db21b60581a01a26d522ee44e7fe69545cfcaaac64dbc76c7e3027ac39ddc2d80af6f3fca1824c6ff6dae90967d9ab48ec\nB = dae90967d9ab48ec\n\nQuotient = 801df28f4fd987b4e980760f4f2625276a2a7191d453095c82aa98a2253324ad2873abae70cd98c28ef3ce102fdd53469b9f01889f3ba8b0\nRemainder = 8e435da582e59809\nA = 48341b28138dd04807e522e341f74ac46b0449fa45f96d7fc586997c056a21eb3c399752a6a6c023509f042cf9e879f397a34af9aa2ec2e8904674f2ea3ff739\nB = 904674f2ea3ff739\n\nQuotient = d3857b72b70adff9b5dec3cbc63de7c90ccd7aab6595339b2de39bd6b9789045141d224aa4e6bf9a06e017aa3edd00e716a771b3f5b97771\nRemainder = 14135c686d2e9f70\nA = c1cea45dd46409d5e24fb7ed7d849dbb079247af2d312e01083754ed07f65f090e4dd50d23a973488702ef00936c5d78af603ec0fdf03dceea8f939c922b1e7f\nB = ea8f939c922b1e7f\n\nQuotient = abe20c90896e261e7d31bf40e7f3136d36b0b78006d12225a4dbef6aaf2062b609379eefe7e5af5bcec17126286f196f1330da8477096763\nRemainder = 230307c44cd55896\nA = 19a637e4f3051be0f7c4d35513bca4a91ca9b8082fe3c73899b70b6805a7aa0458512495cb6ee1ade55ecd5851be1dba96d65202f06bc7122633a0d905017545\nB = 2633a0d905017545\n\nQuotient = 5ed3765c4a777a903e182f7c9ce39d19c01460f389b904c3ce1d3525edf25ffe7dc0f4d9e24f0bc8b7e01bef19c83e74f17884bd7bfabb2c\nRemainder = 40f5346f8775e20\nA = 546578393e914be30581e24508a33f6560a5805dfb1c675d1ff1d6f5eaa7ee638b9e0265f543413e04e3f1f3b0895dec271c9897a48d9ce9e3d7df32c15b75a0\nB = e3d7df32c15b75a0\n\nQuotient = ed73a67932746985465fb0606fb0e81595514f1647c911c303d4d31eb0306e3b2aece07320f6fea57a7071d73150591ab2a82a7d53968a81\nRemainder = 2e495a881876da00\nA = 8976445bc318921f7e12c8d4e8e50596849a1503b5efb65e939c291de136597c05a1fd16137f0bbbd7197df943cd612118d1e55a50ee097c94331c1cfb1e941c\nB = 94331c1cfb1e941c\n\nQuotient = 5dce24b7a16d847b0c43cf365ea20bee96",
-    "79fa0e8732813e827cf6ef3c9bdb7fd8846b5689ce8b80a7dc0dd05721cb06d2700aeeb7ff04d6\nRemainder = d8ead1ae3126aded\nA = 59b99e5d028e6771d27004bc19830a5fcb347f7ae04c0ba7c49130bfb198c5b16821e425c979e6d2dddc14889ae58475bb52c6cdefecf2a8f4dd6e462bbc8f47\nB = f4dd6e462bbc8f47\n\nQuotient = 170e10b399a4c5fe354b536fe59d53602102f215d5107493680ab6e181f67d75ffd45bf49ffb23cf9269b856156b5ac6b1c5def4ab1abb18a\nRemainder = 57131776937c5df9\nA = aeb35966e2a616762768b7f63ce3aee5e81561080617bbabd7846b3ca03fafaaef83dd05b8d16cef40db0a56f3b0ef6eca5e236681cb57c8793dc0907d9aa30f\nB = 793dc0907d9aa30f\n\nQuotient = 1acdb88f047f9bf679c50ed67ba01dd24dca92103f8ea2677215b6142083b64f9fd2a365499dc8f2bc61e29fa176f7d76b55557fa58e34f9\nRemainder = 5065b726dc6b3758\nA = 15a6292c9fb66c6770a8dbc6fd431d2a4b57338581f78d0860fda90182cca563eb2272a79fb4f5a6fc72c90dc23e8a95713b65988b5b3f9bcec4f0466c1c47cb\nB = cec4f0466c1c47cb\n\nQuotient = add8127c0a27c961203ea0351aed5b3c75aa816e9c2684574e55f55c7140adcbf69d2cff843e5f53c157bd60b43c45c8b6658de72062fbba\nRemainder = 67f48d3584cf4fe5\nA = 4e8938c8cc46d34e3369c5d8536b18c963dbde56020678f77cebac5f8777e0afc62ca2ba4f533cf6cf7561bdce77b6f495bc1b05f1416d1173a6a288012c7c73\nB = 73a6a288012c7c73\n\nQuotient = 688ddf883a0bcc1ff9bd582119c2fea7c059e19aded8c048390a1d8fd7d769666987418bbe0d4cf4b67009a342958928769375c1c0d558acf\nRemainder = a5356d04b64ee12\nA = e0c9e32056977aeca72e229d83f0d320fbaf5cd8bf3e033289f46101c75ef59a854982f33bcbcfd200034e8ff439d669a03fa404e7dbfea822664967d67dd5f1\nB = 22664967d67dd5f1\n\nQuotient = 39d4d94587fd1445f31457c275fd6294fcb69ba155e7da3e6cfef38ed1272d6c95755bca49007ca62cc101b038d264876f18594b8fd4c329\nRemainder = a34980d5046e2ed0\nA = 2efcb12fb55c923f5c6ca7ae076765059e15d9e75240a6e5fc3db92de184143fab1934c7450c3a380a9851846c9f43d67bc199a314e82e72cffee795d695f82e\nB = cffee795d695f82e\n\nQuotient = 145ea82eff186b7db4b11fa1514674fb9d41c698efb33227eb1abbc4eb78bdb2a280c0c4c47adaf4e010a4336cbb5650becd1ef544e223e53\nRemainder = 36052bba2867f5f4\nA = f6a6c7e33fd4c664652d696c495df387b85b132cfdfe34bbd35759477b4a3c052f610df57e49e85720489e4bb8dc923696400a4a28dd000cc1bd491446a50b96\nB = c1bd491446a50b96\n\nQuotient = 35d0c9d870348b113868282aaba22b21ec87cf421519a23b288b150604729356f924090ba038d7400c0ccd4932836c65902b4d3c46a202a0\nRemainder = dc8c7d087bf24b0\nA = 22228c8a5966ebdec64007704a373b0596ae702d62e29e468653b21a890ace2f02c27f26b043f48495687ce8c2ca8092ead21aa250ce0f6ca26129615a2432b0\nB = a26129615a2432b0\n\nQuotient = 52fc995a486c4bfd17ed9722948e9ede1c4ac2fe80e6bd7482fc47944c4337a185a506a9ca473d49073e1b813ad742f19b13d57914888d5f\nRemainder = 75c703f654ad630a\nA = 3473041ae301dd2806da30dcf06b9c09600086d6873cf3ee9d5a0be638849afb56bce2664f797de4123f6f8fe3e12acd32e33a285bb7f493a1cc13a7108327f5\nB = a1cc13a7108327f5\n\nQuotient = 1744946730b2789977620f2e7439641125dd338d1b31fc50813b34dea70b83d209330bd17fd527db9a402ad9752c26b8823082ec9971f4ae65\nRemainder = 453a3d59303ec3c\nA = c0f592d83649bcafb7e2de1a8a71fa863c1f51b595bfa638c8fe30731c6fca36da975b6f19c657e3ca29efff6febfb311c003ec68189998c084afe4979b5bb19\nB = 84afe4979b5bb19\n\nQuotient = 468f3eece20aa9d6473f3c559760793e702758a3d9cc19d7817216392c7cc7c3968778cf2fe0c3f0c1424d7512cee19ac0717952f18aa287\nRemainder = 5904e71034e3a02\nA = 1f0c99a128c757d76ae6dfcd01012f0453c8f89b00476ec46321ecb872f99a48b4da29a4abffd0bbff2b727dfa182652ca85350b4ce100fb70a6a40ab6c41d95\nB = 70a6a40ab6c41d95\n\nQuotient = 12198913ef16c1cfc7c1be13f1cc5991a61ff74935e09f0c46d26456b7cf2825403b9851d07d27e0197c1fa2ac5e32e836979a184f14cd94a\nRemainder = 33431c3df719f946\nA = fbfbf5494a9c5384c7ae3df6c02a5e1f9f32dc31cd7f437832696bba164bae1a9d95daefb8bc08e0e8e637436fb747084460697b5ef5ac9ddec06757dbe61aea\nB = dec06757dbe61aea\n\nQuotient = 376c2f902566d83c21eb7c3aa3a6fa0482ed52c253f67f00d5b915d0183c2d9a2891c2ff837fcb426a4c990c48bda4f90e0bf69d13558696\nRemainder = 31540f5e05e8b4df\nA = 2527f8cafaf7e8319ca53104229199188ab1ca5fe592bde8ecf605e17ca6446414e06898a85e177d6985b5cc6d4eeabd6b222b5f44b4fc1baba050665c090b5d\nB = aba050665c090b5d\n\nQuotient = b8fdd5cd7b2d9295258bd99e2780921cb2ea70627a79088039fc3ab1c62bcfc6307e86db4a7803f18e5339f152063f9e41d370e97b1ba2f5\nRemainder = 4ed4f2d12e4f4ba0\nA = a25bd113c5a8c67ef65aa80f1512de43c9441fec0c41250048d29c406fbdae80912eb3970457d621c552e3af7ef2d6bc1b5448e7df5be724e0adf6f71df7eef8\nB = e0adf6f71df7eef8\n\nQuotient = 5421daac8cdeb6acc2b8b0dd85b592f255ee4fedb3a9e90f2a5bedfb0f9f033d7c562c96958346bcdda4664c67848b9d9fa7d3892bc4e9af\nRemainder = 7e5661558c345eea\nA = 490aef65c81b32f5df76dd58decdec3e3f73bc1fcbdb6aee0c93cd98725056153b572509e75d2cc4b042bbeb0a77d27fbca1e39efbc765adde41a7dfc5c3576d\nB = de41a7dfc5c3576d\n\nQuotient = 156a8a24e7804c5f576cd1757dba44cb4185bc13cb56603b54ee3b70fa35cd98db1992904d4f7d99a63b3a486e6fb31141a9d39cc0301f897\nRemainder = 29e9c1627537e5a4\nA = 5e4a10e772de8dd2c96acd714f7d3880ae8ab460095a01038f3aa9b8ac8165889403b42019a1e70e0e7f32e77fb388eae3579dbcb690729c4671868b0526aeca\nB = 4671868b0526aeca\n\nQuotient = 1b0eff2ff0aeb2c02ee3cc9e0bff808f4d616eb290293b13a6b58a84127972bb417d55e1d001a9720ec72562ef3ea688e64c4f32c7e26cc87\nRemainder = 664d57c57d4952e\nA = 806b8504abfbeec4d5923f83ddc071be88e11c4394168854448df96160b95adb1fd9c288852e2f3df3e36916ba5118815ca2e83a6a7d9e074bef9c961e2958e3\nB = 4bef9c961e2958e3\n\nQuotient = 2e363b13b0457a0e9effc2d7e297df78f35e5d24d0f8ad4525b573fb2f66f374871291ee8a8ee3d15a823b560156d474c678f79ee480bbe4\nRemainder = 5ba8f49e0ca36ab4\nA = 2e1bb261d98ec405dbb068daac5efeb0a51f08149181864e9dd6bf6cfcb617b76d8facaee2ef468807e0403bc550d58e8ad9e5cc0f094b02ff6d0277fe642f44\nB = ff6d0277fe642f44\n\nQuotient = 149a5b1a81b9e47ed36be76252055bb202dc25f8fe7beaa1ce59c279b32941cfbaf8fe4555867850b2fba43b10b74534db82398320f9786d25\nRemainder = 1ef621737e81780\nA = 63de892cf5df40c98de78c755c99e94e0e76cd5dc0b49b8856fe69dd0abcdc535bb1416f0d02b4eeb54e8a939cf7ad4edfb7de4dac87523e04d8ea8637e50920\nB = 4d8ea8637e50920\n\nQuotient = dea8a9211974758752d89965eeeb93cc616f88ce757ec2809f829cbb8d99b4ffdc3f0f643779fc5e0bb53b5273a5b15965f4a364863592f\nRemainder = 9ae7de3edb6c7edc\nA = acd5cebd069f7febc38c318867ba3a562bbf8ea9b19a6b33538ba107e49439f8ac6e880c6267c29b39141dbe2273d93062464de307efdb7c6b738c0bb282c3e\nB = c6b738c0bb282c3e\n\nQuotient = e9149b347cdea84d740be70060b239af000c4336ddf36fd5159083b795c4763588c87a959df0104212a04cc928baf60b0ea72e8cccc6d477\nRemainder = 3ef5c6ee67e6f5da\nA = 6ccf1b8b406e6a106160e73ac4122a04c0814ef5a47708a6776eb52002d52772d3fce3fc05398172bba191390aba925bb23aa1eee626410877822f27d1e3cb09\nB = 77822f27d1e3cb09\n\nQuotient = 1606c2fe44cd0b780ee474a9c7daf0b2bebf62db0ba8ef5a99fe22036019890a4c7dff73e678965bb0e2a6e61d00a74a1d33dc1106842115a\nRemainder = 7cf920ba2897f714\nA = ef9a3983f26237576311a871e4a3df0538593dd0cfda58ab90b889fdb35c700f7d158abafad127605057ca0532e846992c41ec06902ce58cae0c1fe238c726cc\nB = ae0c1fe238c726cc\n\nQuotient = 8ccf17de5068451fef1c2808c62e19997c7f920d5cc0fde1f5a247cc57c6d730df553cf33094b786597a343a0ce9e4bffef568247e904343\nRemainder = 2689c40a54df34bc\nA = 8435babd279b7a3833d01988c58005d4557f7689ea9b7168ef42ce2b31a1a3c32a982aff654f271a651085335496dd826ee4b3bc27f58920f05dc6676e51c662\nB = f05dc6676e51c662\n\nQuotient = a9e78c48c779140b1d15843089765ce9ece3855537ce88cad3eb7aa7bd6ec72df65adacba2bdf6c491066406bdc3dd3dd734a70e93eed958\nRemainder = 53da0b15ac079ccd\nA = 78550cb7b58b58d6878b615dfa25a5b90a1ff631740e631c7f8829962446903c686c810c46a1551b6c1f7a89ae898435bb8e36d1bae24a80b54edbf4bbc9af85\nB = b54edbf4bbc9af85\n\nQuotient = 1e3b41304ee07f6baf1ca061e0e28a3740991c6ca2749eba70d3ea1f9cba8adec45cb69a31cbff22784a9e056e884713c0812e8c7981e49328\nRemainder = 3d051148ec43a72\nA = 76b9453d315e7a9c592e1f2640f5b6b90a65e7f2ff8ac24b9b47e35abb76fa5d303be6d501b341a882bdd9d2a1c81a9280724673f87fbe9803ed5a2e7edaeec2\nB = 3ed5a2e7edaeec2\n\nQuotient = 1921410e1a538a71d33d9c5de95593fada116200c399fa7590ebc374282570477f5f4abdd5166784ccee9671a1a23b96378df62168049f6b8\nRemainder = 1a1f4aeb882d7546\nA = e4aa84f782a65d376b10e7789a7d56695885aae274db6cb37e0a34414397a57b4a5f76dced11376af5fd11d31828203e685861a6dea239789196fe73d0e46116\nB = 9196fe73d0e46116\n\nQuotient = ed2afbd2e63617a651911017d9d02224d521e99275ab642ad1a941827983b17ef0f2067b5405b20e8e97f2ae6099150a1989df94276aadee\nRemainder = 4578107045b9cb81\nA = b547cd987638ff7e3c30fec9b728bc10c3b8cf16e7040bfe0fe9a26e44d2898c4c4d28",
-    "ef525cde2b4007b2ffb3aa80fc4514a99b9aa2e112c3acc56b72ddbe9b\nB = c3acc56b72ddbe9b\n\nQuotient = 56181509251931afca3bb9dca21eedd6ed4226be67497d8d1bd0ec052af146993e7358f132e842f9b6c4934cf1b4501f5d6c5912e65c8d3ce\nRemainder = 1b9861df51429a6\nA = 32988a4e0769a5aca200f6f6f1498512e13b4904a9a311cd8a962fdd688de0c6e50b04f42cdd2cf8bf9b0a6922657f9ad195773e1250f85509672452618da9c2\nB = 9672452618da9c2\n\nQuotient = 1fa45bb973dd1d2df0002772afba55284a1e41f6aa4b0d1a6c6a4beb8ae00b52e88a9889037b8bfa9b7ee38036c57b713b48af156c3f9e8d8\nRemainder = 2525d52ecdec8814\nA = bda657ddeabe24c82c883e85822941bf64448b7cbb368468078101289b6fca36680b3884e35edc1fce5a5cdbdfc11359a1ba8ac0785c09ba5fe5cdbd30726df4\nB = 5fe5cdbd30726df4\n\nQuotient = 63e21f5568d07976aa81a2690b9e81b76fc3291cdeb010d1693d0e80191186815c7b2f83551a5f1b172640425d4733f06f4df1b2c8a7e6ed7\nRemainder = 14781a368471ecae\nA = 9f3dad0b3b56de15ac46cde1d79aba6a2f3b34d685cc810e9fa3f2d865bea4afb480d58653630319a258e9e8ded9be93cda3bc52b80a9359198221221724cc3b\nB = 198221221724cc3b\n\nQuotient = aae37878db016dd758003b85ef52acc7288b7b74c4723e3876a710baed4751d3be2ae49123b248f2b2c55a5be702c4428b1dba9b8a6ae8a9\nRemainder = 6c754d5c167e1228\nA = 4b93a98eb7b92cea0a4f5c2223e77abdfbd332b39f295b4ac40f71625d88e4add7e482adf3010082d8dd8854cf714a54fba0887de87946e97137cf7eabda038f\nB = 7137cf7eabda038f\n\nQuotient = 9881f551c4b7e67611f37df29e77cbe4e2d9fd5e17b7da3d013d6f3d4312e53dd26dfe3a2a12525cfef1ef81e6ebeeb7ef8fb4f918bf15ee\nRemainder = b14595005716bfe3\nA = 7737f8e7337160c14cfa8411236ca0354d8aeabf389b9fc4b14bb2ec3bb68286f3d82eb394dbd8062862b955e9fc8e86eb646317d1315d09c81ef51b30288cf1\nB = c81ef51b30288cf1\n\nQuotient = 4c8519d4d85ccf845fc5b8f31c27c60f0893ffda29ba86e8a3fd5fe67de5d29cb29362679abde996039b8febda2ecf71f6b9e1c1874361464\nRemainder = 10fae644af084f8a\nA = 900f7846e927760d9986894de6489e53cbbcdd59f7707917e7581422508f2ce79b77bd2c56d964a41e60baa927ca679faedcd9cd8102dde91e1f583ae834b092\nB = 1e1f583ae834b092\n\nQuotient = 16ef17b40bb73063f3cd0929cfe2405ca0ff2d3d426ac05f8a8dfadc85659105f7f728e113baab59247c4c7936ab975c08d6f1c72c12c532\nRemainder = baff11e6961c72e3\nA = 130b212cb6f3d854e4f17524953fd8592f5e59dfe92fc7d955e2899d1dde1ae4aa20d749caa349ca8d1bda7eeec2310532a7af54660e2a1fd4929335a1623bad\nB = d4929335a1623bad\n\nQuotient = 1cdd7ee2eff733b83beda5b862673177e2f2151ee0fd9ac0bf0ec5b7e05516f1d1b59ea754b0483d0e4bfb7668bb99117907a58a8ceb78028\nRemainder = 29e33e0c2a515780\nA = b0131ec2c1ffe9a523591a9453d2fc740bf885e7efc1a0158905da1e646745ef1bbf39b406564cb3da2f842bee307b36219bdee5991c969d6199279c25d4e380\nB = 6199279c25d4e380\n\nQuotient = 20bfcd06f9c54c537ae563e33dab31047aa30a6bc4e7eb0902bfbab3bbb7e65df442c46625c39e08c88310116348e9ebca2450ab463727f90\nRemainder = 11d8f2f6d4c1f55c\nA = cefafbaa2990eaa88184162ecb118d20e5999e5a8fdd25ae7f6248650ea74a8cfb92c58efecdd5d31eceb618f1596d7a6bfd31d092cf86da651f629975faf91c\nB = 651f629975faf91c\n\nQuotient = 37204c5735e4ba5e47e845d8b652cfc2b1dc715abf21ea0ecf5b1c6c8b9e596591fd7a7f41787be1a028c147a721ebb891b0abe3bd079b589\nRemainder = 1ee700ffb0ea02d8\nA = ce22d36b3cb913b32bd0e25cc14c7270d3f7b8e600a9b6732377f846adafd7fbd8a09d12fb7011f2283d988fc29aa25948dd4a0f24512b4a3bd460ee19887d35\nB = 3bd460ee19887d35\n\nQuotient = 191051194e4362bb201f5471d4bfaf92f79b6fbd119ca3dc1afffba334869ed9f8acd14fc42a2d8f616d652610a483ad90f5140e9a5ca4172\nRemainder = 74785b6874d8fa37\nA = f3c79f9a6af1c5bec72218d969620149afe8bf068cf7a7aceda977076665bb5a2c30729ac3aa976c9be379c6a5458f1501db8802652ef69d9b9f4f097027ddd9\nB = 9b9f4f097027ddd9\n\nQuotient = 6c46c17fdb03d192f75d636e1e2ab4e858d55f0f205cffd75550c4347726b5cfe036c6c901782cbe5a04f1985d9fd1dd39d747d25a6a7a88\nRemainder = 9a836be71a24e72e\nA = 4f6cf6e357b4985442a25b5c84e2cc0a5e685e2f5ff71ceba439b81f4123e16db2296dd4333fff23eea92bdbb812daf1d27c721412fa9847bbc9a0bf08879b1e\nB = bbc9a0bf08879b1e\n\nQuotient = -4984390f93e11c9a77880cfbe157dc41d43fe901c8895ac5091c5367a77370b16d42e8cc260058adf4d3fc8ee8cc6c0099804f4c319f15561b0a2b1caa7d703db82a726c9eab569c\nRemainder = -19374dcf21822188d720d6ec892bda2c084e8af84f38012da7029a3c3660c7e813fd4f7644ca80373575ff98ab6d743e939269c51bf62e04f\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 330af318ce0ffdaa92448777ed117de9c104e0f975651322c8e01b1c470f3cfb7a78b11f7daeea57614cec37d18b89155f19babeda0016171\n\nQuotient = 1a56f7d6c06a316a9a466319cbd558a99f06843782673a54775d859768a61933de3fc410068d00d5f6ab13fafc9228fd40ad41434501f8827bd7461441140eb6977f18d102d446\nRemainder = -3c3d566cd48a909292be2ce30f88ebb68e9122a3359f52d1d7b0189c467b829a9f226c0b64845715020dee12d179913ddb7f17da2db86d854bd\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -8e770450768d07ce20ff8f5f6af464b1ee5f1d0e8faaf927a19d3ff801f6089378133e822b8e63cf29c4c9ed721adfc91d3355a3c7bbde77bdd\n\nQuotient = 42131cf8f52a6a3f189697ce402a8c9439bf05cb3dc1cf8bc49dc2f07cef15b3bf0102c941b5b3bde6440abc6eacfbf77ea8da06ce932fffb226b33dedf001e9657464b0f06\nRemainder = 4cd483574fce075404dd22072abe61200fc455c15b382c7f2962ffd82c38ec1e2c60f71267cbc35fcf77fe1f9301d6b5f884f1c416304aa9f4d4b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 38caa64e74b29a7e9bbf341edbab112a730b17103831a9ecb70ef077e9660b2dd1fbf71d7f6bb4cdae2ed7cdbe9070ec9fde996c91b9bca5b83450\n\nQuotient = -11d6883fcd705ac97cae5bb7f8a2929d6f636f4f232ae9a4af9769183dfce9a9296fa0714c3f4fa1eea467a5c96a484a59d0cdd87496b9398e7a818daf89a58add3a39e80\nRemainder = a6b7984fd80d719ffe2e6eb756e4e3bd7ab51f6088e04ac8fecdc744b0385294dd23b5007910109abf40cfca814c10addcb5330e422b6f5eab6efa2b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d25d50f53c694cddd56aadda2654ae5888603b39cdbace93d19c117af5505750aa24e615f95446862bd693f5b444e2a876eb2cf49f6c7acd007eae02\n\nQuotient = -3fa898b02c621915f44b213ba4e80b8e85c7a2f4c78df2bda7d99494bbca3eb2d9354965d83e1c9001f10aad9b3f3ed837a630b329f5a4b28935158fbd9d291a120b08\nRemainder = -320d41a3875da2e83ea9a83947f5abb1a7026c84020e983381722bf7aa87d5987ab088cb2c37fc3781c82c81bef3263fec560023e236a747030618e9d2b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3af2721aad4b18db27842b5e539d8cada9dcd7ac4c5b885065dd2496a6f76fa73c8a51b239b5c068ea6feffda22d8ea806fb488ad5a94210264597edb40\n\nQuotient = 179307c3e14de14a744d082825ed723b996a4e15f156ac473960583138c43f4275b4436c50ef8f21a7b450a969819b81c15bc355fbc5fb55cdd8e124d931d142851a\nRemainder = -9c8eabd36a25e995c1811b79a2a0357f6aeef4477cac0ffdd130046cb2a647f928a34d91d9b489d394965719cd58604b957c693a93145328e5568d33d88a9\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9f2d3da1da77914df66bc889a40847a0d705d4648a11f282e09173d170e96d84b5a45092d995318fe7a954b54b88b784423402519a38bb521e84a4f6c5485\n\nQuotient = 6c0f316406afb4cc2aebe34f7948422de0b612a02dc47f4ae59419c579fc465ceae1980a3e524fdfdbdfad4862f168a9851664688c9ba01a8bc1ac156a6276643\nRemainder = bf52a2fb6493eac22fc8b334ccd8e8fa347620539d9189d535373f94503310a027c5423197c7279bb51ab8c459e27f548d57b55740320e80b753290d077aa7f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99",
-    "c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22b9e55639ad3ff4f071a49c8bba6bd9047e162fb31882421db8ec5ce46f28fbc35040bbc74ead5a948c47c43e9c7adc32fa52046b53f12b07b5224e0d8e93e4\n\nQuotient = -1008fcb6894d8c411905136fb3e05b38ec5d8df35db06379fc2d6d3e3579bcb34fa6e021b98b899d9d082c111b1a6ac8e50418fcd5968ade6aff8828d8e4777\nRemainder = 3d7dca387b00c677d855fc4af4d86d86331fe4309929039e828765f0937990bffa964d3ffc5d4f2f4b8bea978329e7cedb847c7cc341ee52217f903ddcf9446ce4\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -ea045323f406bd7ce25b3ab4993b5f6dd92ca80e3a02607a862deb13470ccef229fad67ae958cd87fecf4f08d9609595077d0d1360d9fe48c4566e237aa877e7b1\n\nQuotient = -42a50301031962754ebf9c4b1e125e6df3dd40ffbe09c044b1cf4b62ffb4f92d298b05933a450bcef65e86398da80740a610ba45928000a5c12d26e9f6a4\nRemainder = -c5485b82cfefb3f980e0fc7c6cd89b1345a8fb942299bdc36ed4ff8916016315a0da84ca0ee2824dce3c7e5ed49d517c45173c9c8e30b224940af6cf828c73db8db7\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 384e523d5a687bd1a90101e43334894b6a27e8c6809a8bf5bffabc34d558a8309997dd6f2a3b7c1a63100dcc0b6647b444ef7e5aa4a9c52c7caba1ebd096c3fae6f95\n\nQuotient = 1054439945ccb5bc5461fed04e364c7a36d5dd2c0428872676debe07654b2ce31e435a90c81f2bac1032143acb0c49ad101398feee8426bf270bdc0229\nRemainder = -7bf919e14b2559ab82b3c1bf428d083a4c851a7a1fea44718377e9e945caa5cf48e0b1ad727e251bbb330292402a75ecd96a56db4ad07146533a3ab5a717d0a25a3a7c9\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e5cd83a644ec86b94f5e33d4dc307a2f14ee8653288145dabb2b5f894560c164470197fb9e37749656f47df343c245258627aeea17965fea10a57336bdc6b4a47443492\n\nQuotient = 62675274798218da426a54ed7158f8f737b7b3c328a9c351371f0cf61f41712f9b28741f187eb635ce45866762fb5fc5051776151d202e2556c5845\nRemainder = 1aeb5d1fde3c259917e430e6790b00484d0d9508391ba6ebab0f6299190d4b34f5f7d8ea2174974471a1e28ee2c15e05da645db971f699d5d0e80569b7eba7908ae579f5ed\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2622350611b486e6be7a7c1c073c230d604d782c2696038a3233ebcc3f01c6a711969094e47f49e294f2c5bcd04fb1b7c0934f19bf6e7aa519a8d4ec2c172ac59cc1a57b26\n\nQuotient = -12970cdd96b92c37787971cd8dd166999ff241be881eb9543ff29165a9c1a3beeb38b1910a5724ffe2b73ab95ac1ca88d3989aa531374d4ec6122\nRemainder = 627455cb555398150e5b4c1c53ee16dac8d80d9616ed1ef40031424287f8028a9cad1a10bdd8430f6f65368cfd00390c8d4355aa5ecdbd1ff0266a1ade235f33cb5309446961\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c9dac93cfb7abaa3fcde359e09a92ab0b5c06359bc09ae9bade3c6783064dba90b233b4c8d5c6236a13ef96c7a223e37bbdd931eae61e845e5a10088f75b3ff5f1158e833b15\n\nQuotient = -6742b3871dece5986d4e219bf5f43c101da8896f247521fa286fde696e0b71ffeb3b6a3e4f33710c9ab150b7a1f747cee76839c5e7f2509f62\nRemainder = -203b2d6eec9d485f7b439fe9d4c640bb31170af38418faf4daad577c30e44ca06efda55ceea4fbd959b3809fa2002b6e2cb891decb09334ed89ac66ff05502036b2155ff62f8aeb\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2457088096865cd052e9cd9349c6e5e34e46c89d6e860a36f8e2a0bb1e5d983e07d05e6f6b31edc67e4793cb4d40979c029c80a13e654b66c8acf6b894f615a3ac800bbd09ce020\n\nQuotient = 15eafc416460d757d0abbda8d094eb535262a71dd033c25e704a6df54265b6123247e5625da476e0c220ba88582a1ed94265135bf8bf1fb1\nRemainder = -64ccd9a0ae0b0abcb5507d51b2e6c8e52e67907474605c439796febda06eabd8a3185fdfc0bd088cc49fdf564b5b45890b07269c15b1aa2f993cd9872b97aa6cc37dea2f03444b3ed\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -ab34d3906d8a2b806b22c73d44948d703c1e05a9337f75cb0b5df5205c5e2d23f8a92d8381372f9398c9ac2f7b9302b83e48b26512ccd0b06e6b8ef1b930ec2678d71e2eddbf7349e\n\nQuotient = 3b22916d9fe3145fcc3b8872bebf5aee4e14235f618e0aed09199852c6bed80df39256d8407d334c06f4479f230913370b7d451fad99d\nRemainder = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d\n\nQuotient = -12ffa4b6fc369404968911c17358012b993c18c2ff34122e06f450d3d441926b5f5638b40efb012d76d8bcd3c0012d0a0ce5d55c596\nRemainder = 64548684fd5f6c816bd296234740a4eed772570bd4a48852462f9cddf14f1350ce7c7c6a58aee8f66ad7df87927458db09e3af08eb5376de08444f35e5171cfa0992fb27f70b81574f6e8f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c58383afca9e1c480ee75d3cb6b0b99ea42e827d39fc96bab6b0dddc97e3eaaaec02a74847f9f7d49937f5ade3580bfcd491990737d172d4079437067251ab403c36a9826e974b113e2d2a\n\nQuotient = -4964410c2b038573107b0151b36177cdd62495e0dbef536b59c8aacb8836bb45e7bb014e5022360621e8e82a273d0d462b8eb6fc\nRemainder = -1250c42f8c9b129a5c477be446b86356edd1b19409d362c3a5fb5d59c30f1c3fdc1424a88a0d6ce20bae885905d98c8a5a6495931f73edf4c60112ed78834e3bff6de3ed54c867fbf16a1cd53\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33212ef4a8e80daf1049ac6f639f8e1990142ac32f7ebc97675ec90f8eb1a2814dfdd295ae67317253d0187ad33f3932a3a7efb056d0a3c87d28e64e23e9f1de751ee6f0f61c6f39d08d72f0a\n\nQuotient = 17f77efddeed52ef2e423bc2c10d2ae15c97384b766f4108474964c2a44789e61249103d9f5fe00b4d612772dc6ea12a42e395\nRemainder = -1ec95323b7b95169d5ec0667f3cbf683e98c15dd0fe44df4ed9de9586e43f1f69337e41a6d11d889452665dc0b03cf8d9ef2effe0b350eeb9f6468751b8a2c42608ba2a33192b770cb62381a966\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9c91fdf2dd1827ed103a102db254630c278bf8b47bb12a342a92f081acbdd8ae5f5476ae194e24b187011ac25b19fd09e6e690777f9d3efb6b3a32c8f5905e1478a27fe4b1adf17a70abb4e7571\n\nQuotient = 4f5dec525ffc737094f40d27446ca0be5b7a2aff02d51d99609165c4cea0dbbc1d92bc0a8680782b616c149bbef7f5ca912\nRemainder = 1bc84ce56a9a0c74962681c02ac927051c81f3824d9f3f0f91465df333ecdb449473d9c26ae3abb9509add5795e89ba5eba6ec7c89b114c86e6991ca0c185b34d6e66925a14fd82809dbc",
-    "4936d273\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f47be01e6dc6a86097676fbd472c2af0c83a2f743fcaa885e44fda7e9f350e9fb7a8cd07fda59ccb7963f1e95e6a1236f5f94939decdc85afc0e523c711b24641c844cd3113c17fe35ca988ba407c\n\nQuotient = -163cafed5bcfdeda88555f30bd4cc2da2cefe2bcec9a7c19c36ccd04a45121a5a0dc28d0bf6ab7fa4b78933c47a5d5286\nRemainder = 93f856077f5b2907cefcddc4d767ffeb0acb7af64bb9dd8a15dcfdda6c244c24fb8404ff9ea2fe1dc337faa05930d33cac4f61e171d0236e222374cb3da76396ae1329a407fb4ac652fcbdc568d0fafb\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -a8bfcac452a5e48fee9132b73bc2fef771450143ab80aabd8690ce54c9b52c2b5a669076a7a35fa6d926268077bec6d90b722b5d074f28ce3843fb0147e567c45f4e91a11416c082762e71b5c6129c08\n\nQuotient = -617dbaeb8c6f9d584e8eae923c872048f9f9bf039ec6b50cf8f09c061bf79acc3311b37c2502e560848c05ab316fe8\nRemainder = -1ab4613767c4f1f7d127e848f2bb7c72a3a9e1dd6173b63198b80d3bbebce6a31494f19b53ad9e3a77248e6f9b26fc59060e2759a20dcdbe785297bbd912da9a1819527fac550d64bfd20ed1f96450c30f3\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 267d9397138fd0374a7a58593d41627ba1203a646ec2c04997acf607e9d217b8f40183d2f9304447d6f7e727a476e636ded4697a5ff30a9ae3d249baf97969658209c1b32ddc0edf920b0b278e9b5464313\n\nQuotient = 10ad85703fd51870306c5e36b51512341d6d39e0bac47a03732787b2f62e49c76666f7f49b2596de6cb5c5b2f31b\nRemainder = -846b4479713bb19ebb8c1f1b75d2be0f39fc1095a3d2ca149b5565146bc19382b86e5ab0d098ab1fca1ce701d582400190fee34b602845c3c0c498925710f0b9e3af2412ed5ead1fe03d77e9b2b407ac83823\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e0ffa4e120f2f46fd1430b6022fd03f71a22f9b120f8d40e901279be235b32d94760fb8c2403d23cdeb728ae73e2b16af7322d6ebd5f5673187668c99805e700f1e997423886bbcb851448dc1ed4cd66d6598\n\nQuotient = 41567bbf616ab41da51108d7edcb5a8a4877c5a8663b3aed7559421b1fcf4b535a54989efedfcc935b3917fcd\nRemainder = fc026e554a0821e0d36b796fe6a676fcd7383a55fd6158d78ace4edfc3d8aa87c65f0eb41baa2aafadc51218b0562ff4b5c9b17bbe84afc491d9e309217a5138ad48dd51e1b1a9aa51d69963b608ec47d63fcd3\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 396e9b45ce43d3f89386cfad8ddef4b483ecb5173234530c67447ab74629d246c18b9da09522c77f598957e3fd2a1c0c9417399912fd547fb1023ba6b90d63d223bcbf3e7ba155e51bba7e8635aa5c39d2b9dbb8\n\nQuotient = -18f1f395347ce8df530d9330c61c0e30ac9531b50a0af2ae7809db1258285c15ba7a436121287990fcdbda2\nRemainder = 51417b9e9995de34316a66a2f70c146df8e36952fe64124819607bd8691a465f4fde98e590dcd56f0faeb95d1b67751081c2393626713c27ec2a2123aec2a4ec3761e5ace4aaeb612d46e52e16d72a186d2ec8a7ff\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -966dfc779cbf9c388a84e947d1128e2392399ff45d9491259c7cb19589154f82f41e852e0c6bb5a728f6e87ff4ff95abcb9b2b57af1b6b7fc125497775ecc1338e4bbcb5315f7afde4e283347184b908545211afb6\n\nQuotient = -3fd962e88dc1d501fe9335fff8b6b2d50eea967c3035a3dcbcdc9599b81f9a445ed5a6ae7413b8865fd4\nRemainder = -97f06f6155f8d0ee6850728192e0b4fcf55fbd9ba982c5f1d598ddcbc4e1c4be0e209fefa6ab3b7eb2b4c645e4dc40217202285ab0a7270d085dd9d4fd24e5293faf6797b4c3c79bbf3ec63fd82942549f9e8f862297\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3ac566d6b2d18572360fbdc626ec488aa316a74f33d71a17a2d0e1d2bf26395623eb91dc4abebf2f944e9bc3d669fae2e4332088e9ff9d9f43927a7888b1390ef60f05efd6e63ec606ecb3e164ed6dbdc9d088586aa71\n\nQuotient = fb5ce21bcf28490afb64e6746a1a81792c90eae17407c0b4c5ebf2464eeea43e516be2c615f84901d\nRemainder = -3d255bf94c3d610c32266fd472d070c0f5e7dddb88d32723b2e1a20709aed2faf28701e0d0227c2b33ecfa9e708e5ac354a97be732b786210d86f1f05d191513386c580b1ad1f4ac6890f87fd0d4270f23cc5c2064502c6\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -eedb64a6e204ee3d6df508830704f1d5b2d2e627698d38a114c07458ea0befd593a80dfd2e08fcb1893adf57061ec4fbcd3130692de7c46f5ca51361e9b79bb7a91963618b8e5b7591392a5f0e3be954e8b9978c97f12e9\n\nQuotient = 6933a3123d0b32693351a834751345300c49324b861a663e8700bdb3b70ad996747b284a8ea5c02\nRemainder = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5\n\nQuotient = -10e67cbb33dc6e24765893a047252766c2bfad8385150689dd4fec9ef495dff63ede1fdf78bb6\nRemainder = 9dabe2cbc734b910fa1bd25616daee5657d25b6e4dbc2cd93cf8549715c87974a8336fc5070d86c11f6b670d4b3bd5ee8ae3af2bb321fbb4f8fade3f5c6c2d6c366b4d800dd13ce897f13b0d3fb79f1d9ca525b4e7286c56ff29\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -de093dba98747499f2876c8b6b7a6b9587284835ae35f0716dd594c826cdf5b9179f2c6b08d800a77a6936602ff2b64ee0b7c94493bd5009633f5bbe423454b7f018ae96c21230510ab4bf5db394ff153b0e9eda3ef90eb4c253\n\nQuotient = -521f5e35300b9ec2742ff472cf61235dfe2e449772afa638b1adb812cccf269afd164b7602\nRemainder = -2ad10e8758e1d358d4744ad344ce319617027107c0b8db195d1b58c6e6035450c9b377f026fdf9e5737750af5615cff2ac3ccee623c060d779373136d48a735b353d64bcc5f2e6ea1e46083fd799b5f57dd5ad0ff3e6df9764af977\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2db1990ba1e353a1a62de1b914ccb691380b6ea937c13621a29f0a40ecef460cea52cfbc77d98706fb3c9939ceaaf962fb8003b0cfb40535e0dee22e8e7d04b5648fce2e58803242c199421cc4b26cae776d3603f2ce410ddd1e0da\n\nQuotient = 1d45aa6fe6837a1b7ac95efd55d1690b66487202949a286fc85da7ac0b50b860215e44fb\nRemainder = -7984639b596f1d4e6efea9d8b4719215588620ac959034b303584679a44fa84a4be0c89fd2e29f54e62959f9b7a858c06b0cc051176af82d4b85e7334555ba11c39e6cfa1829995c383ba81dbc220e527e90a1d440c1d069703cc1370\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9",
-    "b8b71372b\nB = -80316fdc405bb002990d3ef7d0e98defcd1f0e370d1e51db2d21ecbd96230baf69d00b168afcb7b8da9edc3ef7f6621ae5c5a0d7797e5c92283342e42468dba1036fcb2ffef1f493ff97826477364f6b5a41dc56d6389a01b83eee041\n\nQuotient = 3c0c3f7a777e611d1bd0d17d669a1ef7920b72ea8de06d4b415a73b836e37d6cf0780\nRemainder = d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9\n\nQuotient = -178d749de2dae3a2ea4898c59aaba98ad9f340762040f5aea13cad45a793f1256ef\nRemainder = 6c5d9b19aed9f099255b6e3d251aa50d1e534e6c86d82eebe097dc8dd0748201e48ac62eec070a999c21f5c7684e5a700212e9079b5fb731321dd1e16ca82ce80c1f5c17fd1720f1353bb90997f47f5fce335a43a6f59facff0b3724423393\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9f52ead13916f9807d0cf0c6699578af52c54816828f22de62328fbd7b4fd6c3740ffc82af4e24892092c7ecac44b5e775944445e6615fce25610984030a345731f944128f5734e6e315a0ea97aafd7563105695d026880d065761687b75e8\n\nQuotient = -4fe43bfa9417839ee408b254603c3dd176653b6915a89de5b781b400162fbed6\nRemainder = -1c15816e03751a203ae23c48965c8541849b09996bc81d28e28d7871fa87d1c3b2d383c056d3084d7d01d853bebe270fe2c0839e71851e169d417c47caacab2aff8a8e05f65dfb20eb17ed8f67475702fa83087bd868246cbb885d52639797b85\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2ef8419306ebfd215d9079c7a2b959a53ca2f4553845e3cd32caab2635c0e77fee8c5c016c121e3cbedfac57f810c132486ba78df9e719a976e0112516893f14cf9b89f95a89aaabf31cce509ac8e7e62ec3833f0be4336afe6d7d73518141d39\n\nQuotient = 127e8c06e12943017f9dd57ca24dca0ead230092811d307386c81b6efe009c\nRemainder = -24f3431858d5aee412443feab243b465b849f5dc97e4de4db88c7adf774d9bdda65fa0a28cf6b18eac6078b00cbeed2ac406f8426aef868d4b59ab045825d4b0a18af6c9105e32abc72fadef55b221278d329ff6fb9019630411bec143c4156df7f\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cae6399216401dec0f8ff5eaca884ab061469082ee3a18e49e0b4d5f9cfc98a598c373249a8ad2374e0b3de71370e93a98650684fbb931aa5d8b4482cb0be142492bb71743c251346df66896806f926a4a5dd4c16ca3294f01bb998835e6583d29d\n\nQuotient = 3f180694e59df85f48ac02b6d4faa26278af9641db18d79f198da5d802f\nRemainder = 36cf82dcf8c7ec783b4de68e0627a4a4b2a508637c176de09feef62dcf382bfa5d8b88539b5ca2cab6cbbdbbd0e54c092f00ee13f4a352cb570034cb0a012cc0fbdb6ed32967f3b81d146f352139bd3d9a5c27789468b7d79b84d6a8f6085f859532f7\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3b7983bfaf565c5ca444367654a07b8bc2bf7fdc04ef12128c392bef2f6b67d9475b4d2f0ce1c380913aa98616fbe1d74dc5c9d64df15f5c9b87a8bfbcadf335a6e8f863c7a01ac175a7d79645ababa5f961fad7d1b9926f7284e254fed33765339e0c\n\nQuotient = -11f635baf7b7d613e84dc38978a21ade2f4cd741d0c4f6ae592d93af9\nRemainder = 4317c686dfd56216bc4865f8dcb6a3446e13d8b33861e74d6c4a3223c387ffb8caeea0141049898609ed1abfc2adbd21756cf64a72272aab6c0b8f2177419abcbf9086635dfbea80a7b884181f2f2ec9a402cb0505e8208909fe062d5e6dc7094d66af62\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d0ea50558197566f22704e66a70328cacd6f4b7ca9b00c16b7c4b4e7dcbd47c9b2526b3858ebb4de7a571ac570872f3b44ba1fec655c0778a8a87ca24851f6072c5c0b7591b5e67a8cdaca78fa46f201e02379fcb9a8470e4a4971acde36cf501d369751\n\nQuotient = -64a078497f85588d3402355bf3e83d25ca1f0ed2c24a395ef6de6b\nRemainder = -87fc31ac66a24ebd629a26209ccac1b2c85e52dc83c5240269ae5a27333f33d31152c9470efd41472af034e8536bbe94b0a49e892b1d23db3c13fd84b7395d7e3f19d7d4cb4a4c07dd1860826696cf7202483446452aed2b4980388e7eda0ccac792d77a33\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 254a85bf512d9159b00a70678239902ee7e15ac2790ce5747c4a4743c6a0851e6a179b64c75acf312dd37a7b82a729246f79196b8a399ff476c48a05f89c29fb106bb06ef0300c4b330a7b2bcd4ea1e82584c7a96b99ec2131c885c5851343cfa6ae4d384e8\n\nQuotient = 116a06b1d38067cef9f55875fee1254c8ce39b42c19fb232a287\nRemainder = -c15a797fed3810e4f536e9509564b2142ffbfc0c961ee5aa923d43a824765c05d2a99fef79bfcb6310c77a91d9bc6d0762bd687493865de270c99989e891fbf6da7ea5c7c7a1032449457eb73222a011bb755ff44e4bdce8e86f8aa9f687840c0832f7fd8ce48\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d77c14100d19fbaff6334ca6aa504001a1d56f274632dc89d48e1d517935503c26b60c047cab9e186a55b72439761c884f63fdd2a38ca1acc653f6ccbb4b7262e6215e6d00c8829b448b7ac8716fe0bfdbf8088c8c61eee8f8db43b7b5551f6278081ac2eb1c5\n\nQuotient = 6fc9533f6d0e6c55494cb1b319ec47bde8e621aa92d91155e\nRemainder = a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5\n\nQuotient = -1abc689fd19523d2e295f260d248041bd00ad3009cc7581\nRemainder = 1ab5af1478fe7373d012befb319b53ff9e36899c1749ea763fb74f7d24624e70ee78faf3115c2a423629528f45295e4adec7b122b993b5c29260558be4831df06468bb1c63e8afcfb1b9b533ec6acf754563d2ae25e2adb4cfe5ee3024611e03a156484a130ee01f3c\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -8c5a7b6bc8ed6ac015ec24efff607b0446c1b736dc8b409e2f433e69d0ca015d70c64b4c924175d0e0102ebc3e1dd96dd4d5bb01cccad229e699f9d8f9ad0e04339d70cd113e93d50c10c03083a81264396f5db2d979d272798ed30efa15d52289d0c72f42582ea56f\n\nQuotient = -4aa210fbc0457fa7366a8aa9a3acb3f9fce812303ec9\nRemainder = -737bc4fdd3d5496fc7f936ccf14bfc3d93f5b7caf4718c444db7a3228b41015c67aed304fec7704ea8238ba6cccb1e94cac3bcf4764a44bafb49e5fcb0339ae44c0114cc304b9c4370363657cd2bec09bf962ccb21f6091b081e71d2bff8556600576e18d4f78fc68b12\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e45",
-    "8774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 324774e49bb429553c10156e8db122670d6dcaf6ef5291f515c517d7ffaee36ec5ec5ccb4d12dff71ae7a05bdfbb03ebaf4dc6c4e8bfdc165b77cae20153c27d53bf27d92ff25643b4888cb586e773955a1c02ecbf0fa6958a8ec0b832332eab2e449be6e72c48d2f1ad1\n\nQuotient = 1c8631a18d189f1fb689f896005f2dd2098e0dae9e\nRemainder = -1a1ac9612fc3354056a5378de5b315f12591ee71f0fa9d8a6b2ea2b1c4eca9947e5c4f5ed3d4b78e69ef7a1f5a9894b9c7d85f6e2244ae76881eb06584eaa98c78b60b46084b517f4882758691f91d9e2acfd580d5e901dae14ff4a4fd6b0d7c73450e4928fc6f02fb5463\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -838df2a27bbb033fa0e581073b879d6e8747fff38539801a1870f2e52d91bc84cf10f2560e93784650fba080304244dbfe9da679f207b6920be46b0214a1e490537e56d99beef3f58b30f311a12283501ad79a5407ff209d19a6efd0421aa144e0cd427380d89bfae5d1f5c\n\nQuotient = 4213d04b9f0b30026bd355404bee887b22b2cf9\nRemainder = c2bc097d1c20f050e88912f066b658446cacc7a4d510343a8d88ed007a8c0cfd5d44fe5f067a0e81536d121b39f2d0feb8dd053bb5632e3f9c04be5f6bf4091d646860cd38c96271cdba466ef8b7e2377a51d5669117e664269fe3c08a51b10e1e019ac063d670a3c7db12563\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 38ca0c2f03a5c56676a2f95cd7a69d4aa2085343af6b1d2a71e0d1c54157ec0e8f9125df2a499cdd484c04feb23b1e0042ca908db74744584036c79f21c25c40401d551a65afed0ef35f1ea000fa1a99cb29e6307f6ca0304145f7e483d008cf9efb028ebb654115a8c6b87a08\n\nQuotient = -134e043b3b88b31f89ff4bc709cfa1bd2c1a8\nRemainder = 99c1c846cbce5e9a26c5afcc0186bb1e43b2501ab3205d13fdf01dccb9b1a935bc1cf8adf74d58f1c316381577366b6d126da49991a0d5e02acaa678085f335ff8b8e975e5bf2e52a05488ebfc21a3e0d0bc5bbe67442f77bfc3c1f0c03b7f7ce42bd0fedd8a498f018d8cbea47b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c261a6c562fcdd56e67fbd2b91027f17c95da43175eaca6e4069c16d240ebbd240582dcde953eea739a4668fbfcdc6af8ff3ab58674c95de90fdb43f64a61108b030d644a44b0319b912bb563f61e520dca9c88f411b32e99c872cf00a01f5badad584636352913b7429b99ecfbe\n\nQuotient = -448c4922b7a7d5e1efec2c3f41d0264b76\nRemainder = -2599e928027d10d3a11056eb719768e5edb1a625fc0b8a1dd4439ebd30a82bfdf89e617ac7c71622058cc64ba32dc242d96fe3ecb856f1b146f831334af562cf88139a99410dcb869b9ad6ac4826563b400b59f55d8fff262dc920fe525b12b2fa167ec237028a098c9117cb77bc3f3\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 36be11eb72832f8ae7b6bdf689f794f62cc1c885e64706d14a77a11df9761c2e9cd81d8f6a0ad0cb1696c69afd80c8bb992cda5100cf1162d600515568b9dc9c81a518da9d240888d4984df65c129ac0b4c557b4e63ee5be79a27473ff5bca58e559cb04c4ac93b61545e7351bb6514\n\nQuotient = 152474a1a76700598c18d9301866ec00\nRemainder = -274a2f9e2bc5f9d75f9897b28f840b71bb10a3e4e7a35ee1dc1150be61130b4e0e987e8742c5edb75a1ce3158eb8bdb7d657b8ba39436d7c88fbff160c7488ddff2f13b3b95ffe149a3d0d2d406b1737a7671f69c0e5d7074a151cb2776b2d13ca24bec261662f2967fd22339ed6c3f2b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b17c79a31d5085b49793b6a6d628109a6047e3b1afc947e5212d0a9ae32b1955cfd6fed07fc60634ad15f32a9e402d7d5f750fb6d1ad958211f9e8ecda8990689e5212cf72b24e9b51bd07a6e0477dd4c02381d0ab6c0ad3cac1f620f723ab004880800736804751349f6bb19d3db48da\n\nQuotient = 5665f53d5a7405c83a5ff382ec376\nRemainder = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7\n\nQuotient = -eeda035247bb13860f228d8f2c\nRemainder = 3976edf710ab42bf069e5829de7e16962d1b765f6ae6ad0ffabe723e21ab01cb9f3f5f4edb1d8c13cafc0556c0aa93d72dbcff754ae9260abd294647b71785bb049bbb865a26bba22defc458a14af019a796e942e77d03484028aac2b3798fa730ae0193d89728bf80a8728715a0807b3c497b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -fb5e55f261aa96f54983869d58b3e9f0757d363b9c43aca5580b7c0380096f396ec79d1b30037702c19be5889fc6376793cad51975100f33ebf43e0897dfabcb9adf3adf8d845aa7589ba1f6d155b25f73dae3b2f835595ad6050401fd4e6392012d06194af415b810b0c10a53bc56350bfcc4\n\nQuotient = -5b37eb0c3e3f8f8d9ac6f4e4\nRemainder = -28fde388257b9a11441c592580cd38caf2d69e2ba57d43151c77d26535226e05e08a9e6d8ed470d4354e9f46b7626e5f2b22b652a2d78f817bb51598c727a765941fba63510b58fb3dd5f30717f237da43b42d20bc260b06d488c9c912bfcea1e7808544c58960a3e1355c50c889cefe75d4d9937\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 29232a3fb059242cae6e0b419ff13c479048cfe46a9063188706c6a3842674b16a1aeaf771c5b0ef401d2dc8a57f6fb4fe1b3c7bb545c18ae763e39421e6a07c4469d234f9fc737ac21ca67a5553c7ed693eede4325dbd132dbd9889d815c02f426801eff1f46e7a52f72845234acc6c153f34065\n\nQuotient = 1c7ac058af2e7bfbda9484\nRemainder = -54d7aa6dace87e61e24d87053b9d094bd160916b720d7cf4f740a4fc5a7f03909773d0456c530ea0204427146fd44d3ecec51d8627b5768de1494bf42081a8a4fa97163b0b93b59e70e533f3257723e441cafa4aab471ec4086601021c4462e1f74bebf298ef45fec98fa8e6ea97415f84c93c12633\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -83c2cdca7577b32c20e9e20fb498a2bceb7174ea9aca09d4dd2fc7a1d3b922797b4e9640c7eb9dbdb4d93c7fb9daadd680c1c7645d8102d77e9c877a9f65b13239f9a650dceefc1fd41ea9bd2b38a622bbec99cfddbc6e88f377cd51cc29fd17a27f3d0d970403a2aeeac6ff9fd69c3bbc5c2b0fe7e\n\nQuotient = 472df5f4393f33cc382\nRemainder = 16579a289cc776a47611353e158c43dadf0a78833396f8419fcbbe47d90c7e840e2c90e73e563e6c505bfcf691120ab0f1e9ef9c31db608cade70eb8e487b1113a46e2b5c7f4a172ad99b502eacdc0f91c295fe608389e61d030607a94d09d349fe1a0cc46d1e07c8db533cedebcb4a3b89afd8b924993\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 34b7f6780620246f5a0a92a768072185f02e57a52db1d865c21c952f4386ddb7e2dc1df076316cb4f2f394397cbcde1af0197fcf33e6428e6f5d42a9ccf623f75fae5940873097d4591d9b1a4cbd00074d134272700ab06d901742da695c3ca9d4f917a808113336f883e769fa8051cdcb0cad7cabd1cc\n\nQuotient = -12b4e74d76bd306d9\nRemainder = 8768fbe8ddbf60b548938d8b4a74c4a326ef335257e5f513e65a7d2cfbe9d456425ceb719407bde3cbc74c9c978970597b5663a0ec6196",
-    "2e77eb351adaee2d2d37f1fb55b5d2ceccf282ea3a0d398be1dd1b166d55dce04a39ef434fa392893618003adcfa61401276ce4e599051ad93152e3477ff524f0c\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c898a753745f0fc178227a7004d917557cf3dcae2e85e95aee51e137b29c895755853ce2d61f214b80070174cad8ebc2795a7d070790acd335b383f9dc88c01227eeab85f1f29d76c1136ffcc7b9fdc073a3a03d8812c7c561b32d8e69754fff64acfd64994b7e9574d2a7cae6bfd5a6fd61dee7ee993bb7\n\nQuotient = -548c97fd02eca7\nRemainder = -939e90e281f97a433eb1c6510668d0fc448f03d737d92693b6362c692167add7e4442105d60ff3db29c03ed06c3121aa4a53c4625906519a4092e4821c918d2264ed0cf088b7da43a222877f3ad9a9fe8ec06fc66b9cfbb44e0fdca1dbe4e461dda9b85231b5b9733e0c78852da83bae557755de3680ab61d4\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2c61dce04200e725ab0ecc5016f66044218391bdf650bc0bd31f3749ac06c24707e79526ee459ccfd4bc22834f8d23f391f2e99135f92b5abd0b04079ab75a263c0e98e46edfb440cd865269ed7872e8c1ada312df1bfd6a5fcd2ebf548d7b7d1d75bc36f62e5e9d15262bb8652a8041e5c8f4d673eecb777d1\n\nQuotient = 14622572f311\nRemainder = -6d197a84d2ed486327790059adb5c073218c56345f48c15caf6892734fff0aa7af4782738bebf24d984bc8adb3056f67e57f9960001a67fa462afd8c57ac9d60ae6517d58ffb4773b637ebe6bf2473a5490511fcdc576a4c40ed03b3afcb2fd27c57b66a26f6d3f9b2bb101502b1117ba3ce7214c9db6302fe20b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b818674faf69bc92085b7230d9335d7bead0413f2905539a54e8d1233843ef13f07cb5538e0787097cb24f152cf54a92e62ef143e31cfbbaf3c09650b14229a4f61a783eead26430949c88a87f1618788abab9728aa52dd8419f5d568e6a109f278b2afdea91cdedca43e562d4bb8fb7f1b7aef13992fa7edc320\n\nQuotient = 5cdbb03ee\nRemainder = 1cfa68d5da7a600a7ac598b9ca1a0759f972fd9a46ba62e5e96d8f6f00fbccd0ab26ca03d14470b43793411ea9803c9409908625fd74ef8f9b2d7c2064b2e3439adcb684e6f01432a1feb0f492fcdd2b8b5a6cdbd0bf460272218bcf763974be8784e5306c219ee535baf5541b8580952e3690b585fd99f77c46d69f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2869338cd16322409d3efbd328b27e2ba53cbf71816ff5c093849b1d866b8cdecbd6bd8ffea0b7787251acb760f85c277ded21e56acef05d29bc728cf44f55be87cb4c8913408a01a1ad53461058a1cf94538f05ec14a6d3eba804264df957de7eb1a61b794a1141218966463dd42402c260c229241ec46afdb5a06a\n\nQuotient = -f16da1\nRemainder = d8b66b622b5a54963c2c84aa186bfde5b67a3562e07a23a5f6843bdb615a3c5d4f007ad8b275ad7e4c5b1436252efe35699cff2e0546e6dd8c7230d6ad560c51cd54db6d312be32ae4c708e9047c3a25c211e2566c58d6b9291de31612006d4e847c6916702be99b3f7ce40e1ac842908acb7f03dc120aa8998c60737\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f8af8fb7002a9d2218dcd0f0c139b8e3dbbd48e25a5c910f6d0b6684bca224f62768b64955580306bac6bfd45b99ad77483563fc7dbe015edc06bee3ff93b0afa8f5866c23c7a7570b366550490c97ad84062c2495cff30717aaa965a8e15e270b504dbd4fa943be4f97a7fd1f3b589bc9fcf4f907a7690d99c978a374\n\nQuotient = -71bc\nRemainder = -13316e9b053a06520526f579718c326402d2a9686d51a340375cb53d7cebba99c8d1ae93388db0a41cf55d5753dd1174014ff3305fcdbd5b02de9e90c45ec0d2900ebf6ef847c2a045eab7f80f07f01c81b9fff093a779a280ae42239df79de8d2ec4bff6723788c86786fe276ae6a4dc1472442b552258e1e5b597305187\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 20fe256859a2e4c4f77db6adef78b2aa4758b29ad0787ce7e277bc68391d5949bb4dd07a9b1a79fe890c8a760871d81adfd3858e27d1bd6de33fd31b8aa6131fef9130a50f995c3be1d615d1bfb9878804b7f6494237d8ad78ac219488f17335ae54b494532f03a3fc8e9576cab6facd90c662658878fec86db66bacda3a7\n\nQuotient = 10\nRemainder = -23e09736f469c83f280052ff01071b1bdb52b7e2b061e8a1a8c6a4e091fcd7ca0b33ade885d928a11a3375599aedfe554d1c2289795daba08f07327a19a8adfc219592bcdf9fc5aee5961a48b3b1b5fc380eff5ed2ba7d7e564462397fb6c6187254ee41c74602b141d7adba99205d2e0b35da57efa96397b3a5d112751cf7b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e849bc0bfd9560cb90e42c8e4e88df175133c14466e530716d89ad0326b660b0e617b4efe8df6b000f517d3cc24d9dd4cafa2773dafd4c6bace0aba54e43c17e8e3ff9497a97ed83e6408aa0aee0e6485dd1d89d52520d1acf4d587422b0c5cd2d5e7e81fdcf842d6331779e800f96628206e8be020ad4021789008a641f67b\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22004040a65f9b6f120bb7243c638cf3a4cf6fc58c230da932c79568f68e31af7a7b8569aae77af671f8335ae68d6dc1698baa9d6ba9cd633a662101b45bde51d55098b50fabde8546f317ecc2ae7a39521bc075942e3751a349f51ca3c371f3b8a6cbbea3e11a334d677c07612bcdca767194c07fca78ea8a06cc3b0dc6dcb8ba\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cad46f410062dc33ad4d712c3b743ae2b7613576b2bd7c346a8479ed679a08e3644c7ee4f23b95f1cc9111905714b170abc37ee1003956f64f0a7e876b38d524fbb2436ed56069479d8d2e4029770f7801a7278fff99b3dc76280f35c7d43ee594073f725554a92eaf4f785c18a7cf6669dce5adb0995233241f3294cfb5bd8f4741\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2fef69f9745646aa13e0c38d77951161a1f881a7ceef032698da3fce00764959f11140bec7d7f53d6777c3622453d4525fb068da48047609d18d463a8fbacde1d21035963b668ca11d5b9ae66db13de7a7a5b66a40608dfb56d9f9f0c8880426641083a05b5ff9e6ba0d6da3a04af1af01dc218e9b4f6ad7b1d3a4d1d26a5c906093b2c\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee",
-    "8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c50a24e5ddafb768f64677233c5cf09da1b4f06894bd68e194b23feb5c5d6844320a12a02d13ad012f13b1438eedd6313bac9c1f9bb4548fcd314988d8fe0ce6458306735307afe08a96a0c2bcd9cf126f529e48b7ff4b8266caa28c40b5c3d2a473ab8805c860d27d7ee9c032423148d96fad019490ea019d40679de7a2a3323e80979f9\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f00fb238bc9383079c7ecad9b9f6efc622d58a76f2d5d40ec7cd7c3c083c459fbcf3d128df4d20ead5f585505515aab11c36584ca622d28e0cf037419a649d598346063a07e29c61b7a8e76d1949dbce3720d45576763aa0d391b39dd6b694c7cc60a1b4f4f107d87130402985695e1847e82cce39b8d0fb5c88bcf3b37d6dbb90baf5a8553c3a\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b809f6baacecf61198856d9edbb768ca2df2abe9b7b8ce1669fd9259732c8569c0cafde2e32d253094480ed281a8db230f84e780c6e8bbf3657c0b0baaf19ea973fd8daa2870c9d79f3695d78e063f9130fe07ce806a088ca267fd2820f10dac34b5b32aebec20e4362dce26eee0c29d2fedc1e020d452bc2499234d07a2a6e54314e3fd6dd85fe5\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -90ed75629073df816ec1d6dfedd1cdbed9239661e362db706288dc4d774d806bfacfd4b32c3013ec67d8c2af133b46989f12f809fe202d33d5ba53659bd2a9a85d3fa542de4a5c656aacbbf8899aa66ba816b809f2629f37b0444cd3a6dfc99103bcf2a5ee87790b8401be806b5d7fb7064ff0a6fc8ec769d0ccbddbc3d35f7dc4d388d8d28021c95b6\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3f60052c9dfe0bac797a674ca7f11377a24c28a1396ffa0f46acab7909543086aee1995cf51852ea4a21ff4bbf6e7309cba9848a7b2e3b33dbe660bdc58d513d16bc709f1f2253648b46daa7aa037332552db1da81b4ab9850ac4ec66621648fc856a71eee3cedc6617071600ecbc5ac8636233f288ec249b7ae0bac942a5fd539d03990c4fb28a46653aa\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c12fc156d9345cdfcff94bdd324429530ad8caf8afaaa1a82297eb3a8aecf2ac021384036749e489fae05e8776da0deca7e4325436bc8f383bed579c2d67a456c4e23871489780d760d63d0bc0d1d0ab41f06a091b44f602bcdc0bd4e817202e39ca6a934c0c9405adb5a14d24da895c58a81d1c7ce52734183e00d80a414ddd8869998822364e029b3f42cc\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 205dc6227dbd3adf8ee49dffd43f835882822b1c94f92cf38f5efc62f943075d80b33588973a0e0a8ff5e800ede21d394736ba98d4eedc53a9122f8c262cd09fe9e91cedfd0237003b0124d757797ee13cd03e7a3a257bd8df756940a4d22face9287edca00ca23e7d5e629966ef710b07e54241dbace041aa6d9f82687c3ecba818203adb376ec0b201894a500\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -82c30a9ef6a83d81b77825c71ddc563939b8508f1b7e44c725ae0f61006646ba9b86507ec9a4dfd3755ecd8bfb451c2d43a61599732b8aaeedff7a304ce0a9327e2333f75e9a010556ecbc3abaed02214f25e1c8373bfafc2c288ea36b8d5f848b76295a141d8f633609a6656c07f3d98177f5fa83833476dcd111aad179001f81d6013ca3a54cddcd8dc0ce7eb24\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a1",
-    "9c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b897bc87a40211ef8f93645b1f6c981fa00ab3b12e117a89375400ab5f4c64bfbba01d265c7bc6f5e3a8e26de5de9df3b8f70f4a39c0eba577db5e4b7a68f751b4a69ff4a38915983cbf70dd7e066779405d572f5bbe0719c978b6865ea1a72d90d3ec8a8c146f20d98595036b3de88a7500d7b476644913e4b63e85c4e2632048e9600d553e560759770a902cca680b17\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 20604e080549e1c503049ebf4a56cf9447d90fe699a9773915b0a65588890e15bd58f55ad7b52bd7b7992a8b24704f1dfd5fd07c70aae4ccba5646405ff8a9cbf542dc334cc0c27a790c05420b552539fbf0a155861bec0e4d9e3fbf045720ea3aed58307d5738b64252a963f3fd5ecd0587cb4d7e159b4980dcb112e26c9c34f10a192e090ade157eac1d7a6f970871eaa69\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f11fc9682601cab97c25533b2599f50edb1ac65d46f1969bd9c3cb3717461627621c8cd401a0a0b91f3645b8804e095aecab31c1bab0c26df556adafdd7e7f4f0510e0bceefa3619e26b8c9a1bc613db03857f53e9eb5d4b8f75a8cd1429feb81edc705e5a779d5f95373d2243368ce17ef22da79a6a2672496bdf629171b7973fc4659c8eae9ae867cf38d6d7617029bf59d2e\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3cb0ffbd9ad21d0e86e4e4dab4d237e2a17d97356bdd305fda772fdd99acefcfb8309d813643c852f66e1c6c7fa41ffd44f8335ef7333b2b3e846139fa9be2c4ea762afba4e11263c0b5fab18c5efff2a18d83ee89844f5f4db2c1325f0f55e066a9e01030c07a85e2c9bbd37b5e767ebcc9b95f474ecff24df9ae52a19edeb66546a3a28980f616eb5a351cd399e5f8436f17faf6\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b8aaffe779855c6ae51807f8cba780aa64bc22e8fa5e33f7f1dcb084fc476791565bc33eb37b4f791ef5cf46d64576f48b5fadc9f096f20c798355861ce5d24a7be1450bb871f9821099f98213d74a5e5cf83b895ae65e0e0fd096698463906a112e6e169a1cc0769df7a5ba6812300fdd33611761b6339385e1a70f8f8b2be7679ca216f5b183140e69586a27aaa9f2fac118118875\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b7ee3ee34347dd89ba4a81415aa1269d0390346597b07444f0febb71d490a01b6fee174634bd88e8aa180409549b2726d044b4690353de2fb2294c8f69c612485aa066f68fdb89466760a85901cbc7312bfe5a6f656e67dfd2d4ee099ff97694b01d6d5b8626ab1650eac5267be53f5f3ced5dda1aa86bf42ae132a28fddb94902a515da40e0fd0586dc8b17a34af8eb03d06f70ab89df\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -bf8213944ba785e01b8d37a12de77b2ce1492f34bf6f67406cb51da89675b4f70f4d4f314f30ca8d65cbc48ee2fa1f0a3e4ac0de3a87d2c4c589b6812e850623d78ef2e46fbb555f6d3c69b211892c11a4a2dc3d8a9a19e96a07952602ed5ffc0232c140c3e828acf990e5425d8dd9ce0c1107ad1c6f96c8fbc90ffa457abab0d843094dca3c8a45ddad81b7850190625613a4851485f38fd\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d736bce537f47ae4797faad797af8cfeaf8a4fd42df1f7e61febf8ebf6e47dabc48252ff7948f3dbf8cc369b6952dc58f64cf09b4c53447d135c7a753c21b6052a9726a47a61e13628edf0f2bdb357f2e780ac1ae1f28f211296c8961c2955b773d7dc2904dfea96780b2877af133c9591a0dd54cb20884f014f363862478ee7ec45236bfdcf0321af0692e68f744af28fbcca827ebdc7b210da38\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2cf1708f1e675ba688c0d19eb61a05d2c8642528ea6b1512375faa732acc59ec04ea0aa55e0049144be09eae1292b6cba6db7a9823f1e912df6a5032bb9674f4f26c0c8244ea0dde7acfda566574956cdc33e4a27bcdea25fe255c19f218cc4316ae8428ea61d1bf865197a066b959c5fcbd7c95",
-    "96207997d05fc38e32322aa189ea06cf5139522571661745c0d72b740dc6d842f1dd8481e318b5792\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -a9180e44a284b5bbe72fff46e55869f749b626ac33c8cb17be1fc260d7c6f460f24a89e1367112e00d0da4d213a821d09f103f35bc4eade5605bef23c5d048b1cfb45dace8b9c637af626a85fc773cf51e6602a7a5999a030030cf114ed6a4ed7583465b9303a72e7f60824c12329517c6763b0f64abd8ba2b9b26cebe882a51f05ef8076e527d53a213db910a5f42be5fb78729a3dcd08d69a709920a2\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9fe18ae697576dd36ebdb621d14cac1cfdfd1f5cbb7cfa8962c5a7dace96f9f54fb4f4cf2e650dbec5d1ba89ba53d251ecef7dcc1cab8c2ff3d77903f5fb5f29a4e8e3a2a3c05c105d5733b5132f2f8d88f99d17de86ca1191c32ad8ed469bb649ef188306f69f183bd0fcc32759e4f855170f88c0a3f6745aa98f6225536821bfa056a42b37535a622f42b009859c974cabf2e14f75c749d0fe5a01fb3ab0c0\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33ab185854b20a8126884eed85181b14e75d4ee452958cc1043b099bc16c24b9c2f3e0b792744f230013907844496e600389800e45fd55133fff0cf19c9c152b9d031039eb90da568f9c5212a3ba283f4d1353ff8ff9dd04d292c265bdcb77c3e411716f471930bccbb8ddb819ebb0e0036dc1a18457cd97f4f5909a725baabbd15e8ce33875895aa8dce77a4dbedeb0271a2a4a17f77f5920c3776caa4a75ac650\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e7ca0c037bf8bad5f8d9c5a2737e044d9f7284c616156d142612a53eb217f57f4aa00b6daa424e6c0d9163939e1ad0510a1cd64fbd576f3e54c59d7aa6228fb3caaba7cdcc951e00ed141ac3a68abb9780bf46bf544fe0e347f677288e962fb69782741df49b27cbbe8720c6f8f2e769147d89df6e17e3c592bede2e696d384b9f01b99b31c505d67eb6193a8844f8c4cdadc9fe45dd446a0dc572c9da6e58ed303f2\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22b76d6973e37aff4a09216e57662f186c0a0748c4375d6bed370ea61d1f6fac2d9bbe04487a629118b6b0b0c8cc4179fff7bedcf048cc529498bbd9cc81ef3a103d6cac49d58bc41c83f961b6df7f00c7171fb7d9359e03c76e4364cffae5f67321ce646e9b05f9c04aa16ea65389e940022eda6dc740ddc070bfc7e589b86fd1559dc320701c39de20d54d0483fdeef6c4fd012850630b982c2e243ac1ff918377ceb4\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e6e4d69a82b83e26ef8ac0f4c3a211153ea6655b7ca12840e7b866510d114693049c5b8b22c3a097eac832bbd1986e60564298e54dba3316807ad64bd6c18903a0f22660c9e8d5dac180f57cbb90b176b842d5b58d6dd9f47499a037833a92a18f397238a8bcdc4afd129382fd6d200d3d267ca1e6bcc2cc65950831cb8e30bcc01665c8149b874c9f11168153c187341afdc43e4d8652ce4fbed9f9eac75db40d64344ade\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 319a81f052db21ee213c536db2cb8a71e0dcd0a9b2ce780a9588c38b717c5e487a337f82b5223f638fb552e92b826192e6a1c27771d1e86584bc6c7cbc5d9a6ce6edf2ea2ccf6939485959ccbf3183b40e410768c4665adf90a0ae2792fb4b5d8aaa06c6294e31893620decc3bc72fb4eb68f1e56b48e39c59abe869d07509b7564268d0b7f178ef09ef5dcde6e7dbd2a20fd1d4fcd707943dd63adf590a117ead1ad10ff85cb\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -eced809145e696ceaa0ee8f831eca67049509b31a1b15e7fc86cdd97a73a2ca05bfea5f4b283d287e49906463ef36f2f8ea23c2aa12d5534c08e9769055e04822be0f8ac85f404f5c025a6833b4115f78da9470451c852ba0f24062397d20385f58c5aca10f3f09072b2592e5672ffb989a390abf86cbce74268aef1f4ffde730b3b962df1088bf8745105a7462379ce142f819c2538d9bba99e094ffbc4478625bc54df16c5e1a\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661",
-    "a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2c1ffbbb30e71d5fa77b5473392f95297b489c85f83013262abbe948842473154e00c86b2e354278844083f960fd746a3b7cb9baecb9c66932774b3a28f678d50dd8fe52fbeead43d8c8adad7c0fcdbe5e02664b0feb0ce214c5fa007c5fa2d08c5fe96787b95639311cc4b7eb2a7217c9c38c6d93444fa60c1f52ddae9bb2ec1a49a593e210e47377d3623cd2c4994ad9343863443911062e12233176f4a65ec715b3c9731c4a0cec\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c3bf056b905c0392a7b5fa57446ed350f325eb67d59f1784c744b04c7f4d8f5397db913407aa8a7f1dd0225c1a9673828db0d8bf3d4908ef53307131bf5b5c4c6068ad73b874aab98e8db33b0a758532172acd8b2c830d0679a8226537090166317b8eea91e8ee4a7282c0ab0ab6f2b7b63d728d22b534fdc88294c376a8d036ba9a644c2489bcc84f6aec83afbac08067a7b93f3897f8dadfb68c327b751841927a728faba47dc44ec4\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 23fcf9510caa531a304eee8d0b2d49050fca83abbf287b6b6dea06501c5afc6d87d2924df1d45b1bf6c4bf77b563a3013cfb4ad9094f8ee9892d33f6ee1c70131cd5721c5af804a9da7654510e8591aa185ee723f8caa78046d9e6fbb891e6024d2ec70110ae61c3969995e35941d2c7f3779d5bb71ce5b693bc9ce4b087068adbb554acc4ab23624e060f7cea169ab512a06ff3d2a36c2b6e3bd9a75f1a9ad30a6a16b0256c42eaff2c3f4\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c32d5e643b12db6616554116299c1da672efff1eee394378c5e9e5f702ea4ad64f0dac8904bd2751d2cef91adcb283599f6c661967dbab27059e94dd50025489cf74c6897a22e95013669aa3063fcdd4b73aa6a9a1ba5cad3956bb26346e22df6741cd0ba1c0ab87fbe74035618a394383823216df47b910cae495b8fe7ac5feb3b2cf0d0ef6c75db477160b75324db8eeac48a0fce72b9abbd7079ce6f529a89025a03a3777cc7d1deaf3e4a\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -bcd2b2362aa146cd120b729e81c98ae598804006d046a7ed0f9782baa10a85e37c7c22288dc61c24830a1b42b123d63779e88d7555028292fed5ada1793264b35e961b608bdd7398e421c5474c33a65059ef13787e0cedf4f8f032beac48c4b5e5a67417109142a43b198ab617d1de1a38d6fb4922c6ef70a5aad3faf6f8d5da3af9679c94cf61ee760ba792d2972376425e2ec9c4109e969e3d9c3dd90cdbaeaeb7382cb7bd024b75a1fd6d621c13\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3940430ace4b5b87bf4baa2673582db3d27307ca4cd8e55e976ea3e10da72b6deb7de932253bc9228c85cd4ae7766cd0264004c658a66d81e60bb9bf4dd66e2afe11057b7f7b53a1ec222510748be53a93970fb056e8082631b2b77413fccb6e61cdc6f224b7903d75345afed8a4f194b4bcedfee1f16dc256c2bb9f4a129fab6a9fe752895a93937a3d087ab7ca212991ff34f1bf1c55987a574674af43986312bbc3bad3280bbddf4ab0217440f851b\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f0dc20b88450f45381791e85d080e4f2cf38837391e16e608b8cb5e0ac0ca75e9f72cc04bf2f56f130d46aff31efbabc0ab14f0c0ad680d6899797297152be85ac012644c8d0927b5b6c70dc3e5a8d79ef92a0873ec22af3d9683bb5db1ffd5ebfb698c5ea64cbe2b6a8b9f14d4c18624be1b78b19eca14942ae9542012692cd0d5289ebf75fcf5486596f92659143e9f952af3622137e633376fb95e628055e0fb1ba3a37ccdf0af69a4c0d6b0793078e0\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f2135850715f623909e41a745eaf7b37593567fa8be2d1ccf76d10b93a096e244b91d8700cca37a2ec1bff7c3d21cc3211ea8b03a3594921dec32faa185e7f3d9d17e98cbf8d881fd2abb944181659242ede21df7e5e8784f541cad678df1ef6ca4a5fa91f7856c62fe593c4d24436810cf4fbd11125bcb571f6975d82afeb81bd0c7700e053fc175fb5fc7b329c438479a863b8d5fbe6b4436b67355c51d0306e8847a27a30c9e61f0e08232673cdf0ba4e0\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb8",
-    "81617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cf429f101a2e19a65af1e238f6745215cf476ff2609c846f10289f1ef21b89af2aec53def3f4ec07ea42041f8b5862dc37fd03b2df12adaa8c9f1933cc69b526d47797b40f49545fd093b8ceddee3c55721d1fa19b336218de0cac56d410cc6cff4e620578cf820f5cdaadc367dc4d6372aab1e0ae3831a6d153c14920b1dcf09e7629b7442a06385420d79742e409677e3b82ec58bcbfa668ca072e981e20728a983d84a432605389c855a6668e0ee0d2b67449\n\nQuotient = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91\nRemainder = 0\nA = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91\nB = 1\n\nQuotient = 3b5c3007d9c49498ff8437b6f0014d146b63c20b6c5b91febee47211f42109f6081204b21a8af99e9ab2b5165d536344fec16bd691fb3883ee7335e12d69afc8bff57641ac7a4cee350209a08301553854873da153ccf056427a2415e3ce72972afb5883393806ec2388169b513674c0935f67ec79c89dfc4bdc6f9cf877a10f\nRemainder = 1\nA = 76b8600fb3892931ff086f6de0029a28d6c78416d8b723fd7dc8e423e84213ec102409643515f33d35656a2cbaa6c689fd82d7ad23f67107dce66bc25ad35f917feaec8358f499dc6a0413410602aa70a90e7b42a799e0ac84f4482bc79ce52e55f6b10672700dd847102d36a26ce98126becfd8f3913bf897b8df39f0ef421f\nB = 2\n\nQuotient = 4f54d7e1ac8816945de169e9a2c497ff240e313c2b7d58612c8175e277f032cd4ee5dd640605028c59395a1eb4aa00772a8187a0568b93919aa5b95b0462e5bd31c1e507170039306e1b2f4f75f63ab0a3add0eb01217df61a74765fc37e941dedf10fe142ae317573a4f0c8ce408c213749a12f56add5d100d0973b019350a1\nRemainder = 0\nA = edfe87a5059843bd19a43dbce84dc7fd6c2a93b482780923858461a767d09867ecb1982c120f07a50bac0e5c1dfe01657f8496e103a2bab4cff12c110d28b1379545af154500ab914a518dee61e2b011eb0972c1036479e24f5d631f4a7bbc59c9d32fa3c80a94605aeed25a6ac1a463a5dce38e040981730271c5b104b9f1e3\nB = 3\n\nQuotient = 2922aed641a12010a3099f3c03f708962e2791dd860e65440acf3b982a4041804dcbedf45deefdae5130df96902056f8b2942069fc17bfb29f46a096a36e842ecb30d0800da13b6572c5b3a095038baa3107ca28094063571b517f7cda3659b63099c57a40d7dd2893b92d60b1fe2fb4594fc3a19b7d7957921437556db0e353\nRemainder = 0\nA = a48abb59068480428c267cf00fdc2258b89e4776183995102b3cee60a9010601372fb7d177bbf6b944c37e5a40815be2ca5081a7f05efeca7d1a825a8dba10bb2cc342003684ed95cb16ce82540e2ea8c41f28a025018d5c6d45fdf368d966d8c26715e9035f74a24ee4b582c7f8bed1653f0e866df5e55e4850dd55b6c38d4c\nB = 4\n\nQuotient = 216236f9c82fe6f1c021853a21fde3e21e6de355cf193f16b403edf59a6a6ebeedb266d4c7a6683f5f6a434c7129f582d2a5a852269d66d2eda45a1e2f25286c665f6641ff8b55913603064cc7a157f755e515a426873e7bc6b9d699d1f316759c4505a67b7a025598f9d1af6ebff2ed0fe393db829f768178c1080ea004e4f4\nRemainder = 4\nA = a6eb12e0e8ef82b8c0a79a22a9f5736a982570ad0b7e3b718413a5cc041429baa47c0227e640093cdd13507e35d1cb8e1d3c499ac113021ea435c296ebb9ca1dffdcff49fdb8abd60e0f1f7fe626b7d4ad796c34c0a4386ae1a1310119bf704c0d591c4069620babfce1186d29bfbea14f71e3498d1d50875bc52849201878c8\nB = 5\n\nQuotient = b9fbd48d54b9b70374425aabe16d6a8a819944a43185c2fd07073e20358510ac3de13cff33fe6220ba952d88b2e0f3f7eddb8daf27462b476b5e127e72ea60fd56cc54bf14d2d92765d5d21652d8e16aad4423cd9789515d59aaa02d42d3e957dde50ed1c9a69e2295144a643a8104660ccaafba250854e7f28a686935738\nRemainder = b6d\nA = 8ec1cca67b888cfa26bcee98ee887c47507a253008032c2b37e50f2fb914a34c357f6351e368c2521f3781736d4dab43ce130640f1a55c3851e9b5320f34e772751fd70cab7bd7aebdaa9fc22297790661fecd7b4ed0e6f4275377f2bdcba89bf1d251e0074864618b6e1319eee807e054d193e2616ce52c09ab3d24c187332d\nB = c48\n\nQuotient = 5157f1bb35866dcaa3abb4abb73580d43d03536c3c7960aa95910db60f4d1ffada96c7d89dfcb290bd8c5bb154872e2dd6e50602fafb435193575a4cf253e4d22dbecf11f8f97408dcc83d6e591b1d5daa59825ed8cb08cf562fc50d62cd666b9720055dc11cd42278258e5bd8021aada0b39a340b6c5585bb6c9c84a9ff8\nRemainder = 3d2\nA = 469e999cc737f4d12c97d19a13ce331841f8232cb780602c18592e274ec8b503884566ffcf28a206288f1a9ab3a25bd74bd054781664a331922a96254d6155677836e7455a6690fcb1acd7550cdbca3e9124356ed7b644660092f8d2df06d22ae7f38ca8a4e7472aecce9ad73c47d3a93cc3ec9faeeacd3f59f70ae22c9614b2\nB = de4\n\nQuotient = 3566586b9f864dac5ed132d95d4ac6d1fd5ef6a2c67fee39ece89d615b4c681284b4dd5e27b90c6270b85b150fa2a63440e470b0f937b0eb83432be03eaeb37a0927a9c76b07fe40e3509c93a7b660b77ebbec9bca235d387a9a80a6432c77ddd8190c0ae8ea1d72331d5f4985467755b27573bf23109a01c02975e07daf3\nRemainder = 2a2f\nA = 9d68d0643f1d44b63aff6a83fca08c52bf800dc59260db9b7ff930eb1bc01a47966fa509abd7da21ad856f7cf536d32dc7c962afaca1c9e43bcde135e4c5b9cd9b3c8ad775e06fda06117f8cc03ffad8e5f4b456baba7eaa9c67af7a19c2f4d65120d51fa8d31d0cc1ec7502187cd784fd2d78514cbccff969123718de7cb30d\nB = 2f2a\n\nQuotient = e36f2fbcfe134fdf3137539006d6d9c03b8774883211f759b0258bb09585440d6ff440e799ffc434a2fc529773a455db9abf72d8c55903d9ae5abd5b2b5e9ccf23c015882cab8565c654532d9407a188a40d0cb026fb3bfda428d4bdfc14bec72b5cbd59540c42598f1371e9e61a86e6b4c957ea331baca764b771212495\nRemainder = 6eeb\nA = b669c646d1bbd7389fc642da6d2c440788fec53bd8409ee604222d08b1fc31b3d301e42a8168be0ac394e5f20eb51708b11e7b09d25043f19032310d6649d33eb6c9688506ebd56ebfd0d3f277511ad3caaba3642c53d27e8fb0eb991c75577f584c52b1ec44111b3a9bf5863c18d8a07b91d8ae0bdbbb3b05ec8d11380a9c3a\nB = cd53\n\nQuotient = a891f8a42093cd86d76cb11cf734a65dccd5b4d350328a7d2f2be76e2edb6b7dcf4c5e1915c65764c77ae73fd6e42eb8451253507e16f2e25ef80e5d1f27ea18dc976a9b12147ecb643b2ab060163307df818127b2e40dcea95a109d7841edc9288190587ac48ba9687ccd0d014d531bcf66ec401bbcbed777325fd1060c\nRemainder = 6e66\nA = 9077614b809f4b22707cf965a7e79217e13ca2011cf9e069babe2b4d908e318608f91da095864403b168d750d904fbfe11c9ed80ba9f60d57a8dac2754647002a0848fefb7a5aa8e04fd28dcb9c8e669de4ef794eab2abc93d68dcbf4400d86de603d199a3ee93050638fca7063ea99a9465dfb60d0568b99dfa1ed79da41522\nB = db65\n\nQuotient = 1b16f2e2ef7709fe285ede17beb7d9932caae2dd5fa0eebb541770ca1d53da4428820986cb7e79026eb8bc261eceb200b7696a4b90f675ea9af8389c60dde4d564c8adeba6b117edd05469d285670c0bc78afbc3ad047828cdc611fbcab403c0cb79665d6285b43fa04b77f0309bc7f74136778f8ec16899df040db34f4751\nRemainder = 68\nA = e91e7c26e2b562fe2568613656381d5581628e4705ede6660ca5b79b4a609748889707faf9295b57eecfbb1c0b1cb5cc2a5825b84878e8b9e3960f29b59580385a4af0aae375f8eb7fc66aa6a1fdc4a95e29048ce1e5760722c77cc1c95b1c4c16fdb3e59ed4961f8869711ff24c91ccbe2fb6e0617a5f242227e1e60b3ab673\nB = 89b\n\nQuotient = 37370826964cbd65a48598e73b519db77df6f520bcead8c0446f1288ac189403adb65603b2a68ab3cc232b667232f2e206b5bee0fd48fea8b3ff515f452b5ef0cac591b6ac8c8c509c59c6d3d4e3fa03e22578ff71f1c72ddad9d637ae0497ef0e2a4b261a72cb784f8283eb7e82b6a05aff0a2f61da4780e4e7cfcc4807\nRemainder = 3a29\nA = 16ad5614f9129c7952c5ee8057d8d12a70780144e616e3ed571b2e38a9ce482a52c436eb9ccb6e4f400321bf1f3ef4c8dc897cd91f868eb7018d084784c4840a1d078c8c6a75e950cb76cf2cd81b719ac04d2be5c9a830b1d1361f7ef6345af66a6d56c53234cd98f587b6762401674973df670addcc4a05ec0344d402453a25\nB = 6924\n\nQuotient = 9bb00032a27651eac898b8a567e19ed6448669c8514b5659c4b1103069d9289c6c00b38b44160e0efb2c635b7a64c8296c1c1b5c2cdb285b749e614eb9247c6defa06f8dac077b1e1c26059847de56a1a5ddf7fb1254662624f2ffe6edc48f3b318ffdc7ba2a81ef2d963b934120f58afba2b107a215b58f324e2d923f75\nRemainder = c03\nA = 74524695d4dc11023ff202ed2d165551ace0c126f7a51ebb3ff21ecd7c058cd4a6bda2254c55ce6ef76fd11807f92e80dad31bfd254f9a2e1ca89949f65a1fab8f6a4978c488f2dfa61df46c1faa418ff45250d82958e8f5fdd9426c44a3bcd7c4eeca276abae466787a5ff0ec482514e03434ee68fce24fc620e31265c3718c\nB = bf45\n\nQuotient = cecbbc189fb1d44c5511f742b63207bcba9c78d09342cdcd12a1b1bc3a95466e7fdd8c59329a9b18f7c793c43f08d52339a8202dfa3a9fa86a2426bf5a94e006849b45cbe9a5dd74ca43e2acdf1051be23359624e8f146b203864d03651d98165b783398a59b446314c9b01f79b1139c30df348b14ffd25b22d9d90866b\nRemainder = b265\nA = c3721776b9b5fea8608aa9d381d80ac603d27043089dac276832e7cde8d222ffe142f06c314e94c3b9f6148d029f260879b700e1d435b5f318c8c8caebe92236c9060c183783edec2845e6d4e816197196a0de3644",
-    "544093b04ac6fb4c69d7446954fbabadcc5dc3309e9a3fcf70368ba7448455cec9c3dc78512a19ebb04f6\nB = f1f3\n\nQuotient = 4090a2c78cf8711388347149926610d624543765c9667567ad86eef9f9777f53c0cc0f9a989d9195a5e0da875c03e5c74614f95b8752f9ab89fa61c264b8b5d3e02b043fd539d36dbc6782f45a555d1f36751603d5c3423c7f27b3b5dcb91ddc81bf1563dd3abb0970de6109d76da1f4f9d5208ade2b131fc407c5b169c\nRemainder = 2a87\nA = 129d32cde3c648298f8e8e8123f2e8ee9cad3f909a5647ed09e91cb99549d177575f54a7a3ebbd4ed2b89940722927a8b9565ffbc13d8df6d2616d5b1925b87bbb6aa6d39f2b11d26d071fa30e63083ed5a5357ecf0ab1028cf0a43178486679e86fe4dcb071c49832c83c9de4599d672e5ecfc7c9190f1d7275f5a0abed80f\nB = 49ce\n\nQuotient = 43340591e68e228fb03e44a5f2046afe41a3d7ca99ea9ff1a445d75f95f2ff7f55fb914791613b5db7369121d416a5f92f834b0b5e9280b49a9e66be4c682019881e6e8883d7a923d2a5d309b9d265b01d6b8a4ee07f7552934f2de002cf961fd93f33641aaaccc7c367fb6798436eecc9bb22357087a9c482131e1065eb\nRemainder = 6332\nA = 42e75e3b8c23287044593d9fa4bc5df437a0f8e876d3105334a677b5ecebf653e8bd7e55dbbf6876005196e44980bc23df491949c59aa199cc9e0a111b58f954eaff2bd270214726e5c98de502ba71b42089fba51e8763f0c11f278faf4c61589ceb674d7c7c61f62f8d18ccd619c20243a508c26b934f06ddeec0421b372326\nB = fedc\n\nQuotient = 688c7120765f8ef7363f7ae1bb65bc568b16e32c59762f59f34a57f08839d19019313dfcc9e96d7415766bc0aa032b19ecea72c249bffa0538bb1ac06401657df2fbea5c46b18d8a79cee4029e5972d8361fb7e6c2c537673aecd727dbc758a3bca1a001765a216e9985eb7eea67ae979f3803f14587507ba0f8fa29957\nRemainder = 9970\nA = 688c0894053f1897a74844a2408400f0cec058157649d5e3c3f064a63049495647a124cb8beca38aa802564a3e428116c1d085d7d6fdb0453eb5e2054941017c8d7df7605c5546d8ec446a33ba56d47ec34781c70ade74a203859c3b049f7cdc63fde35fd658ab14781751f8fee8c42ff0a064b941960af4507d59309b50019\nB = ffff\n\n\n# ModMul tests.\n#\n# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M.\n\nModMul = ae2ca2ce7addaee2e2b7752e286b2bb6a58b51cfbed5c924f00398e59ec36fe6341cd83da43a33a12410f45f6228079c4aeb3912be87e2e81fa1799151bfa0fea29873097475b2c3efa312145d0bf7e51b2a7c9bc961a4f4dcf0c883ff90b919b87c21099fba40257645be31f95a3a277\nA = 6b18497fed9befdf22a01d988d34213f6687d8a96e86c188dea4172e7c6095a0d18d3c86c0f5a1af9c6e3aaeb6baac2a510930b3ed06ec78ec2e12b\nB = 1a058d99397db0d209f01212dd4023ae01b15da04fe62d1f76f21622b2695558c67d706c535ca7f19b36f8ef2d508ffd6cf6fcf25e5\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462c7cdd79b7604246a0cd97b40ea5a9a77408f13cbb548b56ee713c690dac0507fd988bf28e77462832f4307b08564a51510d4a951c1ad7564316dbead2b53540090827a8ade8092a6133af0e5fac7310f787dc1472836178ed6992b9f71224da3e884bef8e8379a58e6d4be0fbaf59bc520f786631857213305e23fd5ca65\nA = 16c92f77c139706430f396f72ec7adb045745cd9f5899b0074d9955bd32de66f57c05c7929b575312a7f1c04f19e724d64744bff7b31ad0e6171437763\nB = -8734c4a2361fc530f60b28a5f1c7e93136c5ff6bfc7553965eaca54c61e6befb3c0f8cef4280e780cc5940d21a740debba31f863ded75\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462c7cdd79b76042469eb41a7a83115eb84103da4ba438c3e33227631dc185054ba4e607141d1e60990d8aad4e0bb0ceb645ce9ccdfe72d4738cbe1f6a73ed3e070194fa4feca6001c4a853940a227d15c1f1cc153d8c96e90e24805929fb11e0665e0c41c77d5a97fc5903a8b215360e26f6a19922d650f460f7056274ee92\nA = -6715098ab2ba3ea1e6341e89936e3ae913cdd450dc831c8534071f3c362841e47d88f2cd29c0d1239aa0949f3685f12f8519625bbf10b2c7a515e6d00942\nB = 536d4b3e4815ae5ed55bae6950f5a8a61d52439d2800ef1b5ba2285b85ed0f6ec4af9fa0e364a6b14f6f6b8bebce9200467804e787f9f3e9\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 309b3e30f74c58beca8b2c23f64fe1203830db8a7e306e1fa2e2022f0d6d422851da509d1b2936f088f0e35effe12a7463f47ca369bee2f2980bc48dd8e696b2d8c6f35cf55fb8baafc2e613b4c684de26129cf196741aab873f81e498b1e03018a539b5eadffeb5953029f31f8579df7ec0ff3f752491910\nA = -11fec955948e007b59fc50e729941ee9d43d552b9411510b73f6b4faafc0465f261f8381d96f647267f72175883172918b5c866cf1f1ffc43c55f3c96a60c01\nB = -2b3792f39499767e0a8b7a6a406e470a78f97ebb36765beab5fe52e95abf7582736db72a2ebfdb2405e3954c968b350a459ff84ef815dbc5910\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9143ec3e9f74a8eec476cab17ad8636eaa7c60e108e89ae0702dbdb2b255a217ba2530c6fd52658cd931b962054a9c20c8713976ef3b7989c40611cd25b0a9ad0635d61f6dc95dba6e0c4a7d53ff539b623b97ba3d66344fa324f905abb861c6b1e830c4b0fd5f6a4b01f09c8e1408941291b2285c4625267a108c\nA = 7713413d87f1e50840255927ff27bad79e5de5898725a876e4647913158cda9f5fa031dd7fc11d2e8130a0ba99e8706341c1a98d5fee3218763ceb1d131e9cdcc\nB = 1384e60753dd4bc20cdabf398525e7c4aa40065255c5058cae0b2ec90a3821bea8de672a712431aef5864eab719ba621cbbd8b46fe86fb31286091\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462b3b4a0432890d141c0f46a28190a2e30ebb2e4ba90ed132169cd72316b290dbf5c261984d98e63eea6525fa890bf52185ad7f164cf49f67ca91c2f35511f3bef6eb7f3da31a602a78e4752e326d79dea729f4ca6438f2aa65eff44bc60979b42e44f6a301cb5de8fb42abb47bce5633c6ae9479d39c9e8b507d96161e0fc\nA = 17d806d7c76aa8acb051fd9c0c782443f1b1b6387455f7cfb737c41658d0459bda5d13587055eafb87ad8d209bccac1fdc392aeca0774ea48799511c1fb9141cad2f\nB = -d7c9b6574354e131de4b8643d766641e98554a03238ebfce1112c3da5f049d6c410a7f05758571aa2625f7190b936a214797570539317b32fb94cfd8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 16c84ed15ec6352a8ce6d5c2bdc0d9f13b333072fc7041146e944a29391f83e346b8ac0bee6dde98a420ba4f8852801d7c5bea6f1177a6cbf799edf2146f8297013e0e796917cc967786788ff12d9c1d07d9ce4b897bd22a1b8a391d3b4ecaa5b5c85d0a03aea5145db6350c42a964a41ee5f83e7d35e14cf442e5d99ccd0ac8\nA = -6d84cdf18a2f53fe496248fafef183914d55c42267af3dd42a39515e80cf29211fd58454986f5fb6afb56170dd9865d3158249090270bb9af341c830522a4dcabfd494\nB = 6f6f3f74187b7d74dee92f79be864d0a2c56d4bca3283742e9cdf15112c8f4208e3ac8ecc98b44b4ad74b0671afa4aa9e48dc31d34224a1f66bb2b4658a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8fb782e4883ccf3aaa2d3e020b08993d580c69ec8fe66ecac152c5babc8aeffafe406736cea492450fe6adc25dfa2e12723a3f9baeb02fc0f785b3db760ed28048e1710a78a2ae0c96b67c109c5034375a512b6fc7906847253f66316baa0ef90facc9ab992235153684d49d6939ab9e91086529494d7386f604ed69aca2f53\nA = -1f745c8f0c8fe6ce3f893d77fb274c61b72b2d9f9c5a2eb2467bc00d1f496d0ad469d76bce318bd64ff1107ee5fcad4469f84d658586a5789c068b0cb9b866d8fdcbcac5f\nB = -3a2347b491813252e8ebef1bd181534b074a368d076b8c80bde2e54ec3b4ec99001f43080c7857427e069d99b1b65cff998a141ca6963aa5fad1ee632986ad\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7c0c1c05ae1d6420bd93596a01aa0153000ecce660a8a14d6fde7d4740719cc495fe6681a9a08163b2dfd51659b3ae7db0fbe09504370bfc695457d7b32665a4df53e",
-    "879ac817bf715d5bd6ca0e242b1ebacb1ffd6698ec90c442910a92b35ec103b345f9a9e5c7b005f8028da4dde80f36f6f6e5675040d19e46aef06040eb3\nA = 4c09264420a9452c6f0b55baee42c076aae5a73697cc6bbb88b7c922f236ee4c18e477f88e2c40cee03f0bbe87d3ac8dffd75f635315f856a3881c6373e8b9a286c813325d3\nB = 10474ece7ddae5c53c4df5b594439124370932dd94aa5d5b4ddaa233b1a55634fb7d72e33bf1b02965fa9d1538f97e1cdb5ec0477cec8ebaf202aff8533211169\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 481543f1556df756ae2e422ffe35aae020c9bde9e9b1f760b43043a4654de363dc67f381c0df1c3c1b90edb4343c47ffb8345a1aaf5dae56f446fee08a0b9ee8c42fff57143e10846610a9925be96418c4c957b4e92af734b96fd6f21974877dba52a0db1fec4aa97640e357434f95ba74b6b8323cbe17118dc489552844602c\nA = 11bccd165d9fa2d8b01a48c0ec549a6e600396cd2023f0240056193ad27e971c604eda8aaed6ff6be8be1001f3dbdc8655f1ae84eceb963938ae7bf428eb5c968f584798c1bd8b\nB = -cfb6629ddfc98a242e3290959f4d0726c0b1770b52393bc7488a471a90f7f0951362c03e67f443c9ecf4987f5303a789bf65e0fd59cc5eeb9f5d4f40d3e4a14080c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2a770ccfbcb2bad207d0e2dfaeed04b6e7509daef00a1df88e57509451739a8a0f15106ce8b53d280a4b4e09900420714cb6961ebb0e00e88567c5df50d2f2908b4bf8e0a9a5a8b3c6120503c14f16a99297459543c467dcb67915e0a10e19f72ed5b6891a6121b66abaa602818801d3306630bb04ea57e6b31b2c05e368d398\nA = -442c80289bfbf00db06eafbf06109b55f99786a323fc2c6db5686f99094cc24aef50475841243ec3ade2a1e0ff28b4032fd8afb8bb5e28f3b2863bdb9fc8f033adbaeb5f2ab16fe9\nB = 6d43e3c46f4a55d49e78f40d34033a7f5fcbe50873930e7c5452b6b3b176534e6e70033868c85b4d63052964093214dfd0bda6a84e893b1aae3cc72aa83d039e51c014\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = ba0e8c91a86af1001b13deb115c77609a1e7a3736a6b807255aee898e3100f469ef6222be532dedb1b8d3db4b3b55aa4b5da5629c83e9b2bde76bf2f2a4119a5378b5cde000980b3e58595d988ff776f0388fe025625ccf368e20914fa90dc771c826e4a836b2890e82ac2274471d586b4de5dab3278f0e70207562ac6e6493b\nA = -14be403d28c8451cac4dc83fbf895a9d2b74f730c39b0fcb33d7258f99211dde31a78f182ad1d27a559031d67d6f2f94a741f141bab80fc692afb452ee2d502099ebd5760ccec7f7ebf\nB = -2742dfd02134594edc6d3025aba5ca4a34dfeb43821ad84164510b43be4fb95748f8d0eed7bbcbeca14efe843fb676882784bb36c889be29bdad9270e0956286552119561\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 20c691d6544912fadfd9894cbfd42745991f39a29cbe3a1cdd302bd0487bf70c0179b9579b77f8481bee13ddbe42f32d734b6118af92884c946ea8576f6dec867c1c251c73777cad7c7c76e90da00ae07f96c8d6a751e5b18157dac4468c05d32eb86e74e0e8312bef85905af8193a3f5c799c5875badbc9eb7ead1258e56d7c\nA = 7ae9b4d5151b11bb7bd4d1569a6f4804f3b4d77948e0c6300e4f28d51c9a0afed2ae7503e53489edca5359e2b3d0c82a9cef316cd7e1c1275c31fc9c51a8c1e5fdf23935484e467d6460d\nB = 1f46f88d39fbedffa8501fa1268bdf3460aa98e12b629da59676e61852a4d3f8c59f72a2fd717fe2faa09639bc651ba516cd39297e0cac67444ec57c0db47c2a4e250033d02c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bf21b3cd55c0df8d4d568d00f757b10ef3de782ae71b289cb2b59d36df1341382bdc1825ba13199f2cf279a72968b3bbf5f7e3d13ea9adeb96d81132788231fd988eef04828119dcca21ec1fe844998909cc95a8d01720e883df27f07ef4dc3f09081015dbbdf019b96707c18b0b1db6e689e8f86466a2afea4a9cafc576e10c\nA = 1243b14aa3d16a55935f6f8ca49295e35e7f75b03de7192e1e8a479abc0a430e0d340acc05eb9a61a5dcbfe3ce3a4c5c940699f5043e924f282bd21e341edf8b7a6741c6ac72d7587a9e7a60\nB = -bcf08b2153e8ca911096189e35dbdb21b77ce89685484f574c89f1747612f39340bf1b204a23530abb36b2c5e195940b86ef1252d6729393c25d4c73dd434b6dbc3057b05d3f15\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 460539d96c07e72acba5b59c88fe904bf7f1e1648612908444b0b08172d05968b31b43456918b4287dbe01afc3cb4860d9c2fe549a580c989b6507094f6c241eadff910d2603f747f8e289e7a8176ca4a978bba89288a4cf875bf3e03939af966c54e77c28119a39d34a2b7055465f58ef2efe7c82ac547fb675653198e4b504\nA = -5a44cb669c055ba7c28d49f84bf8d12179aa30bbb9db2a48d7a6b09e44dc0e0f7471e3629cd2fb51e5a53346ae025fb49f9591ed1d71bc79daeb3f1254342d8a2b091ae07a758c1555efe59e78\nB = 646cc0f766346aaecbc5147a4488ce157a6d844045b80884eaee9d419087285fa71108b5ab4a05689aacc8d2e3dd0e6714c55eb8f77487a3fc5e56c3c2df0c4acf28a457051118560\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 79b536f4f30f9f7483f90e65e6456ef8072d9a7430405cf8c9377ceea2c676afc338837643436d55ac6af2326ebb362684bccc5092367209822581700d641cb8d331432b761e4c6e22639a27335f45a25ec019d180fc53dfb53d69216d7cfaeaa07db8288adc35b7bbccf2829631c1eebb821e4d3299015c3d462dc17aee5024\nA = -167529b1e8668938ec02a68bf4d76c22dd018c41e19be25e2f821f63c2046085d0af30d8b4212ea0f3f9943be1c14fb2d2a944551107cd2bbf8dda5bf258957325f06277036282977db4575b0deaa\nB = -378e1be10a57e03b197bc2b1287d643ba6d89da4bf6a6170816691fb6529c602eced237863ee39659be3729825f032a57eb5de0a87b0894d1a1244523e85b6f50a3d9976dbb038490e46\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 658169197ddd0bfae101c10c3e6a2b10dbb456048e81160b47b197fef439b1e0ed710399cfc80ead8e436f1c0399064f92da50afc335847515686e055fc7bcc0ca721184435955b896b0af4f4d96672ebed2f154538d49fa507b945c0a6ae926793751231980274213c80046666c28ada213a2f87509d1466b8d1b2122e93f8\nA = 49136d37ae8f3da71a6114327833e8aaf3dc8b5a9a27e9d04c953988456e525263f86ba94397321c2093803b789f8db3ed7cdba19c4b796500b979e02952e1625246f8e977e01fccc133f94cb22832c\nB = 1dca005663385fc00b4fd58c73adc7589d15ddbcb8cb2fba03a737a320c447a2b21e576ceda73811a31d8277883fd31e22f776bff3261a098ecf8f40f2855b0c723d1265eeafb43f85323e3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a49fc8084f3e780537b4038bb769b8db3653a3315298a99c2ede6739a1732a636e9787f2e8b09d0b9bea08fac43cccca71a315e6f4a7d6417d171b4693dbdbee8cd9f95be0847ffd40ff027267125d67b89737e1d0365bef6c4429504d13cd8ddc7810f456d6293c0c57c14a307b94010d79d5c13b92a907f923966fd3c5c8ea\nA = 1e7d8de2061cca59d1cc19b356a8fcdf2ccf917e0d81598f014167c5a8de027ccfc8f2cb8c37c396ebaac83ba862c146bb2d551d10ce03de9528f97725804e8a6de57b9d9da811200604c2a032462b6ac1\nB = -e38592f3acd75b575f64ced439d5ef2377d21c61bc70625639b01bf755fa2c6de803ce155744993493debcd4de40860bbfcee86d0b117d7f8c3f8ace68b67cb6fe7a81a145535553896424f7a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5a99c8a6afaa97d8e7d84f",
-    "4899803c7786b1bfd2ecabdbfbb3bbb92247ff91ac213a72f6d23c24699d60babe91a7d9cea751e686c027fa1c954474fa5680f0059118426c71299462b11de5f2817d190599cc4b352df4d2e80605f9ad1e32eb13712d3027a2b6a19d52151e37e7fa057d8fe59dfc8a943a42a1756a38f103a75c\nA = -7df29221e6a102e32757c18f87927cdc90ecb012ab0557e0ab855daba832d76ddf595b9c5a62988ca968b64fd5bba2a147a5991810c17cae7edfde38bdbb7e13a1fe5206724c05a9fc9276c8d4e503a860c7\nB = 5c586d1aff7dafea3b8ee42e0e8854712c95385374b5bd1fc8ec41a72b296e070940c4160509a4a1699a678533ff3d12299338fc441b0f01e29a48677bfc5aebc644555285756e97c74e1af6aaa8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 21fd2d881b6a52332dceea42664aeae1ca110512c13bb33e25ba4ec0f39f80eb73b1fa0834c998c23a2453dbff971eadb183c51a30ba78d593f23be9cb6b2b33a554ef31e4a36e0314fc2ec889f18debb956b89d1bf8172553271bd56d89ed0b30abb70e68abaa2c76f73cd5a3de93433747d09c845b5f8843f9fdf9f6c975c8\nA = -19fe3bdddcf08190a037768b77666de803ca4f7f0d7dbe6aaaf334a486dd0da7ca024d1b3df11e0406b0326595a171be30b04574c1a7d04f4d2ccd334663690fd20e4fd168386280510a00a70c1a11e99483048\nB = -33b2400173c057980b0e0cfabbda1a5cb5b83b7ae80708c199f28142237f04b071c6eeb63d42e80eec04b76152250c9e4d4c4f19a048cb9815dce6e66710fad1d27494db5c31d9af37d2aa779d12d7f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1c45cfacf30682a876cfe253f05b393a2cd4dc065ce73126508ce897a99a723cf5145187643ee62d746f6edf70269ddce3c348a1432316286a648ee9ac31ef87feb14f25c42f2dfc2e84bb5bdb4ec0124e249c526c55ff2cd0ae938555c5f86d856eb181572ed01dc045f1ababa52d249e56aba0ecccda905d7d1e64bf89bfe8\nA = 6a40d948eac2fe5bf6db15d7f6b89fdc0712e32d39a881c21859e8f7722391ce05973efc7c40e2c0d7f56c217d8a986bfdb08bf87bc0435873cfe4d01967c46f7d39464bec411d0369f6f5d1d83f42596fa47451d\nB = 12529775e8253ba220d890d4912fb95f91e4edb59610e889431208b6bb42b089cf2aaa12ff9ff98c2482e7f4cbf35b22d15fa28aa288217bf766e937a706fe1e600143087b0a67f668cb7b762c9b9f38c0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3b3b08e8eda8be3918bf648227eb0d569dd898729d9cd54deb32b1a1dc69cf7b2c4184c8ae9641f0f75950df263a5e236f428ca86244e617b14a04edd0f31c02bd4d84f25bacfcd4a2786825f0361251475eb6c7e99020dfee4298a1f1bc260d4e364a332bc6f651dde7ce5026dbeb0e5aa75ee98874da54c7930108ad28e3a0\nA = 149d36918fffa682cf90c4d3f3d48e6408e7ddcbeb44e78b9cc7fbb08108f65215761a61d79f37ec8f67cc51e0a9b4bcb3834b0ebcf6734985153f29a2778473b80147eddc813b4fbeb98843f5c1ae6cea68f88dbb4c\nB = -ca87f66182e271a69c0964eda92a009d438078b584c3eede28ce1a501838c5f497186d305c09922f32ba858fb55f2a0dbfc9cd0f93b789c1f800cf092726d6d33db19e4f26c7dfca69b83925db14544ebfe2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b199655160d88b6b4157ada0e5675f82b33b5592408bb57c46e2f7d8791bfccaa51436dc3b772b83e907c20ce7edc2835ce96595b78c0647d244e9bad6f4184e0003eb0899e7a47ba0be888b9bf795eba95e5073a85c4d20416fcd4a8d4e1e16b403deb38845fb8bf9e9264d68807acf02d579e8cd104cf2bd555e6cf73d0450\nA = -70ccbb73e33a7cec30ef2071f3b1f2e008e70fd6d00fe8b7aa4b9146fc6d0549c57d984cd014c7e0a4ed6d33376998b7c2c9778fb9580d8ca4ba795c88612721c153c186740c58df3fa63b6cf7a4de76e049217218c05c\nB = 6cf4168d44a8da8e8446b4420466fefbdeeaf9623a40e10b77547687b25f36916f2c18cf6060c03b3b40e0959479f6aad5e44dcff0ba799262ef53e280f4a7f667d262d472b2e573265774deb5ff8f25dc1822b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6ff91af444c61d2e2fe8ad73bdc5377d5becd55074eb60f0f98eca3d8f4be8c02f196b3afea12c36f78b78ae6a5ab677ffb7d9c0bd58987cca816affe468c7fb4b56055f5d2326532d6ed1c00ca2d052ecd103994e8929bce04e067082b4ded7e1973566f99c514b4e0d95b9a8a931ef4f6355066940990fead70208a63841f8\nA = -1c924bea12ad6f8b65abd1796e381fee2cfbec15138191bc22d57165928794bb080c83878fa5fd19a5d657b2fa91165459966f50aabf19440f7d75f027b32e999ff4d3f7a7ce878fe0f33a847d644d86ca19713ca9968d97c\nB = -3abd4b281b8f25f5957d1f2fde904457d49a3a7eeceada26b454ceb4ae0e879135d376571f08b5038b7b3d73a9a9fecbe265b72375756a715a523ba66737085e5ef7a4ad988155adc93eadd5d95a0faea56914983b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b9076229b1a1241e8b4da3fe143ac31d060785be6ac1e841c2fa9683d2bacff2e2b5dbac33f58b0b1718ad2053c37ee55ea54a9d258ddd8930d2784852844d85db24e4721762839a5c73cfe588efedc8932ccfa585e1b5975083919be9e32a86dbdf5cef84d3d4b2ccaf7a006c0cadca1e35fff2da9da7d7e779494d8f85bf4c\nA = 75eb0fe6c07559c2b0c7b2acd7d29b5798f6c4cda64a504ebabdf54bdc773ab28b218f0defc040016178958d5561796230b71edf49bbdcbd3f14494859843c8ca7a0f777cb05827f2839f3982832f4f3e3c5e50af17ecebbbc3\nB = 1b8aa718d61447003fdbaa748a9d86befdd2675a677cf34a1be7c81e4577f665d71135a8a243976a4f6ffa1636695567bde522f8fb1948033a7e0941f833d827e957781cb4349a08c6be418befc8959960fd5fc1b288c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9df82b7c34ca97a3a5d4efa28d5ed4f35484914dd73af9090c4bb31ea3496ece8ec650f4e7b07dc779c97e597e76e43cdadbfc6e72b61ea718c073be1cd204f8ad2bad0df1e530e75705f3d3dc285e9d793c8d42f04dc20773d3fcda8ef3ac1cb10d33d20a91add0358ab8658f49d2fe51d0d2d72684e31c0eef85e5695bb4b4\nA = 1fc2a171445ee6add5c2e4d29e50b91d83338f8d63c111e4d3e95f16d2a33be02bef24dcc3d6ce6bb8f1ef980dbf8fed409a0232c0566153014eef840aff58ed8c33e8d463d408f93e2f5381a26fdea63676c4e5397eba1d39f928\nB = -bdac7a177c77451104852bb99004ce8e617036906667258d85adcbe8cda21ab7d03aa7dcf62cb210a9db8fc750c7e1ad290b35473be0fd607fcdc686de0b78fd9f258f5b25e2ed43c2ad1a38859f882b9f6b293dc258659\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bd9f3d2e8a1086b177698f87a9860e3a5f030e04a0bf4ee9436ac55e005bda01ff4ac662cb85d39e98a41c723ae542a83a936c3bd0280c6801ffda080ec0aa4230b45dcd0bc5eb41cfcf272028bce3572847637a92d1543bb2b8408e880f5b776e1cf14fa28d15cfb584f025596ff10c9f091c837a3aa622d9e5c856db8ac207\nA = -7fd5357cbee7c5e31fb62ad03bd47b705b574d915200fc7f1013d836b9cb683db020b152ae9464de6aeb8baf14999ac7025dde6173fae6ade325c60ec310eff6dc4130a8efffb15ddae90d760cb7f76a27d0368175d4a44a22f7f223\nB = 5894a0223e4aafe4efd4572752fbde4952c8b09cdfc35137e7e6ed650f8fdcfce9de673853dbf73730b159b2656047e69377d7c5025a6b346fb08831e64bc8bc34b75765012460d8135a4f7a0f41d768fb85abf17f5e2f5c3f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2c61867bca70e8662c7e5435a5aec020faae86fb079b992bf49d8497fc5f96abbd38a6f04f6ca8510e0160e546b3f68b7baef4ef0f404e881771cc12ec5ed3e3787c2d2ad6bb957cc59f8d56f0afb4bea49cb671cb42f4e8a0ee1dfadb6fa14f84a5b3269dd33e20d658ea4cc39499c7a39a4b5650ad7018d32f97954610f676\nA = -1bf5ae15f24c7c14eb59605136a3f",
-    "679f303cd5b81e4a27465281d17715afdc2c231d7ccbc59f80ad176f4e0326eb757b52e3695e27c6776d7936da47e3a8a904f735b151422029535045ef489e61ec93f02e6d588491c8dad1cc311f52\nB = -3238dcafb85ce557036d19e42e7e7e473de9f9da6f920e18845dd010546868d2652decc94596cd2c36bd16b02c02559892b9f573bf21ab18c3c75591413d046b385d08aa66d849ab8adc9fbf788e837b047a7ce2b9c63f7fbd263\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c1d04b831b712d0619db462c3f3fb5973f5984e9a48493ff273a5abe17a548e185d751628899e2851e425a7d4b2c72d4d908dc813cd122b8f497e08e299dca9166f19752ff8cd9840a70155ed9e8c063a3840838b3679f96f1cd5f1cbf0e037d222029e02769dce7fdaea0bbb5417f85497d77c76a387c6b970eac15dcd128ba\nA = 7aeb60c134e84f289e419b74f99a5ce5b4aed5fc630d5d591ac7643251ad32d6ca7f052fdf8857f67138262d221de644140e9018f7b84879d74883f8f251303f65e06bb52246ec6a912772cb698b47de41c1826ddd065359f6b9f1ccb0cdf\nB = 17f81e53d9fa6201e4d3eeebb32267929cd5258d10f053e7c021c4afd17094f8ecf433b1ca752f8740f6d6bd84f801b1b9fd64bc4787b9ae5e5aba0b4318a63dfe27e92d5a3ade192af7563c74c9d6006ae7701240efdd6021a83cf6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = aef89874854ed34deae1b77286f9cb0e3017e3ae77fe050bb244acf4f30dc03504c73c1a4d44b769709bdb53811a5d0f8a76a08e6a66fc2cc4e98537ad6a8049f02494305b89a49a55e71fcc3f5fc42d6b478456ada9b19ec0a03f5ccfac5538c0040092771660312be5e51996073ff1a506d7460c57d54e10dc2991c028606a\nA = 18d3af14bbffbfcabdaabe44074b407d69abdd80a6eaa5954f0e45fac85af7ced1715c78da872f7a8fabaad3207e31f12b7195cdb25abef0a1e54d3b13349d997f207fe130d7985e2033cfec899a0af310c9827749cd22bd062eb0b1faa254de\nB = -85a7d9f08a60031e689b0e611d7f7f46e1178eaa2e6459602e738990c77f4d3783ac43fc04d53504cf67fccbeb02f9846756f8e32fa4a9316b6d3b45f644254077bef096a72bcff17ffa17070a4355121cc5daa2f782fc0d0bb48101db\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 14a85edc6297763547702c212b1a8274b8f85d53ef35cd1b01ed51039bbe030d0a1b9626ae2f571a43f1224d723847a1c6708f2238f6f6fd75db6656e6c703a5acb57f69717efe8ed58a3713ba2720d8c001d026d83de0ce5e24b67c41daacedaadfe404aaa9b672f00562e6901fbd0710c4303fec41ee3338100beb36c9b1ed\nA = -44414ec207060d105f599b9a66aafecc5b232b55214c1a5e1922f6b59439b3ff77cd3a327bce4f7406871196b90350e6dca9aae147ce03027dc4de7563c734f111d95171f489105de5ca80047cfa43f7e932917b816ba7d41fb95b4106745d700f\nB = 45f2cea1b9b75880ac3ec206740cfe0ecceb488c9155cfacf5885a8cb49be78af8cf221ff8de2328f4880479c031f830a3c9eaebfd83f7de501b7c5cde03c4720c56a676d331b2a13c4689a2e34a43fc11f62825b8776e75d31225ca7ff65\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7670c1e2e141d8f8f5466de8ae2e0ba2eb3eb7634699eab8415d3a37f8df291d00def88361e9fb64a2f116433dac3ac2764fd62f3201dce4e48a3b7019e5465f82241ffda29d5eb0462fde74dea3168f8993ccd4d090b9c31a5a6cd7e05f725bbc89479836b89379b422250ab049f31c860110df5ed69089716877fb0ad7b0dc\nA = -15b4a2f808a85a5bd466a342c4853c04ac0ab73f8e53a4a0477f73dfeb8d7a911ab2eb5d3d192b9b084d0e38db491148947c66f838aa5f460c37341b129137614259efa531c0e6ffdf163ec6851737037a5299060418d96da035e6f583e6ba79d0414\nB = -3e94fdf22004384f7881875b1d8f58019ed8afb1b6a31f5d591e77b0998f3100b34174d6f3466da44b4c7fc8b92ccc5679c26c146b704198a65a88554d24291adcf897bd758a035361f671a82972b5962002c6a828792980f86a64547165327f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 35b49beccd8d2010a8d777c1ff69e28e01a1bb78c6466e717f0a934bb62f9bbcec5ed29f9cd2c14d240a6c33b28c986eb9c8912a4927605532483dcfd31a50876e1819f3d7a0f49bd276ced5c4110470244fca52d2611ed7e31cd8b73e749aa70743b39e92810b3b52320342a65cad3180f6e2966059d15f79e5574348f5f66c\nA = 6fd078e3cbcda6a71a710e99204da640edc71a65974fc765999a74ab50a0e4b090d57ed0ee869c8da2cf694b6fab56e87c4af62fbe73eb8890bc066ec3460beba04dac3b8fae7e4f316e8f954c6e8d934e946dfdc9f4cde0f26bb3d40d5c444b03bfc65\nB = 14d8041a3b83468d2f44f150ad8d8d0a1a22035d630f2a17b70d5c3d557d3abc7e4d753e1ebfb3a3ba465520b84746073d211a67e079ec7f47c2cff9c06da69bb5cbafcb6cabe7e0018867c42e07931d6797d4499463e3cf786c6d5d6c8cbd600d8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2f6e0fed8a9720fbd83ce950d7545d2c6d5b271582194570424f90309227a51777cac974bca0ad3c1289ceb91cf75af73b0645cc20d71e7789144876b8c1bdd550328d9907accc316189e8ad81310848cddd2dbe362c9398d814a048f93f9368fdbec0f19ab87ad2a59d4066d738c3da3cb71d4716f2cd2336ad35ea1438276c\nA = 14bda9e4aac85b0ab7abece728f61450b7779d3b5fb83be813758e742d2ad76597f132aed91e20a75c554f0d61ec4dd118eb733d04942b2548b1efdb4dd22fdb543d9bc1e4bf0574ae2cb2c46fb98cc4835b6a074d6df1a3bc5443beabdc784d542e3349ad\nB = -efd765f8ffd72d041ac3244078b8dc4482233e9411b289cbc2cfc26fed2cf28e286835010438ddc9e7021ceb098b10c68bcc4732608ec1f4052df9362176ee14812bbf09ccf7c2882714ecbbf92bbff61c06e9dc35a368208a05dde949fa2cd091ce0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1f0c436379f6dff55a59093ff2a0626a9b959e3e3e59365afc33c7a7893f04bca863ec910c446957baa8de4e35a1f4e9c4a776ef41b053f03b775f327eb7e5fbe68bbb478aa4339ae703ee4b573d6931e47e09271d40239d527fe77098a7fbe519f5eda1f26dd6a7d0ee6833efe37187d8a85844690fecf9fdc3a4d80b921130\nA = -51eb34de29ba24d2b1fbeb0a1c324f4ebc69cda2dff971a315c0c2775d988b03ca29891ed0790f3dd507a1d26ead461dade9284613e45df338dd83aebfb66050465d8aee554970b43f7d4e0428e1512289fa1f9b23867b67095c455b66d536b91207b749189c\nB = 55259a1122eb7eb611a69118d3d42c2f05dd228d71c0e1e42ae3a8d3d180a95b74150d844e916ac85105805126e4b995f2ed1cd3fcdf28e1fd241dbe3125dfb3e4d90556256eb513a2f7c9b596719c83b26931d92bfd3573560e8bf054138f5d6b9cde72\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = ac321a272d2206df4dcd6ed8ca194a1049c1e3a20bf325fa44809d302170f850721c077bb5d792f86f7ab03ca259567397cc2fa1429771190bb632ac2c92d3fccf6e05e13cd33149994cda5f9c57da155439663f6a13c66f9da553f5038fb92fdba186ed9ca04b8ec87cba4c5a68c8edeedb94e38a6dbe293340dee1a4ecc768\nA = -19ac99d7d51456b00a193b3b04693c7e5436e05763f0154768db078ea5111cfe9eda3451091af213b9c8cc649d341de66c12ab2803ea39655d3d7de182a77355ca444c5d2778f791d39952a7a11839e497f5dfd8a703df49ec4d7628bfc25a992e94a6477e6be39\nB = -286d1d436f113308be594f0f43d7a05120639152b7e2f93058cf602cbdbc016512bfd23f7aa937fb358b7b602d15998ecc150f2b9224c58527c0c1267739e065e24236771e2c683957871637468181e6e896b513569bd004b9845f0f0e4c26a5ca123365e1c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3466804a1b7d1af8b6060aa93a4c325d9cadb33ebcc8bd991f9e44cc2cca8918411efeed0f005790d649382ec40278c8cff903cf3db177d24466c58cf6a56ffc14e59",
-    "5c36bfefaa2327d37f616b1466eb702f5c49170598bc361d892e18051b8233dbc5b3fd6832befd9a995bcef3b0f3beda6efaf09f7306ec203172e78264f\nA = 6710c19330d3f974fc377e28039e0c0ee0a558621fd67fe724c326537c18c66dc5eec60980e07d401ad5556a05688d2dbe7b271f9d5eda3032bf7cb7c420e7b5d65a195bc037090b6fe83064ac3731624ce2baaaa62a6eb07156ca12ee51d4321988026cff573ede9\nB = 137ca18f47a151363a3e8c52dcf024262ba525ec8852e8e406f460fffc2cf88f1999b17a5821849317fcd84d09c88ebb6eb0340120f113d7ca5fbd91c6a40cd790bce7b422552cc0cfd2a6417add2501db1667f2802e5d0f4df824adbd033a90a155cebfbe0b53\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6f248a70b2cddd9627b32fbd130f05a604866799365f94d97f1eb582b28192959692a870be7c2614536a8de84cd8c1364a75a3927ef9dddbb8c6c87dbf526f2d3a7916384f2daed96002831173fa4a51863c28b4378f99b1b201010581d5eabd66ad1e328cc4e647bf5e0588bb775e130b4a4d029eeeeb5852c5742862ddbc3e\nA = 1f014cdd87cb33ffee623cf454edf2c476e91df279b4f0879637eb6e8e5ccab305186de67585595d34ebc195fb150408c4620cf6c7a0b0d9695ba0e0e1d7552ca7d0be3dd678b1cce2beedd11939891a6804770f1c843e16dc2ea6aa8e4043940c37fd3d950caa122845\nB = -8d8d9dedc80994fc5db04d8c935301e47054250fea9020bde8d5fef01f2307cbf458d5afef5210a369c396287c5eb453637a2d721085af3de0d75a5dfb5dfd22fde3b229d438439af7b296b9e68ffc982efc6c825556c52a735f8be12a214a06c4270824d5268fb6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a35ff7e232f047e575b200b9fc4c9253de6ac04c612b8a82c275a951075eace5e7d6664fe8f78301d554cebe7b996c1f4ec3ca59d8d12d7196eb3909223de94c220f0445d24233534af1c93433b05c5924799d2c781fdb88c4537bb8d442e6bf76b2d966827bfb4f40378a3f135103513da056bc0d375b1339561700d15a0227\nA = -58346cc8a9a1e5b8babaed8e7f59415388e0db654ea7cd465d96781c57faae7a8af8e7578e46f3a8de7bd1027188e1cc32fd1c0d60be24fa3289a12cd822a6c9a77dcf8799624856c27ba88fbdb047473274e651760581b44457ed048cf76c166d38bb9b2afd3416ac7e45\nB = 61951a16dc6466a9fabae99df29b7229f1ab96b476092dca1e4f8fc8e7404e2fba56ee66486d1f27f89bb3f86f271307228d7d6cbcff943961e177300b6acec1eeb46af1c5725f745a2d2af0fd9642f57a09c9ce6742114be0aa6e939e638bd5c7a92a7c206b2d36e35\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 90b441d8277eb1ed454964acf567067925881b5db0b446a7d554dc61ae87ff979bfb0e58ca1706123453e62ce31284a5a2db1228d259e27abc7fb5cc5848dbeb9a6808fa1b4afa844ab39b652abc41423c2833e1209a1674db518b6df7ebae315dd7f416df54e73088762ef64cc2cd0a08b1cb01c49d9299d149cbe84145a55c\nA = -1ebb693ea7d18e0ff4a9a51124ebb78bfa3a4635b75a6387e9fc745a2325409f927324d1289be8a4f5cf2d5c04adc7ead20564f97e453287f03e5ab59a6133584f970446652d05a131d7d382c47b7cb97580ef6710a532dd4f5a0369dd3db500ae5a3c5efb587cf0cd2638382\nB = -3916ebc4653e7d6e0a4f1e234d765d41e9e948b5acd7ebc73cb595559c1b20b037a3c8da0a7aebfa5fd327bdcc922551cdb8db3fb0a581fa0620ca2d2559ccde3ebc44542b4d80926d061e2a35c08c09547e0cd587c396ff2959ee93ea64b1e6b7e2b624cdf445988e1f42\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3ac61c3a028f4a2df6645acbd36818a2f76a3229d229ce22471760807585a909727411e8b68bfa4e76adc459409a101a1ce83900d46918e8d0903a163de87c07bbafbd60c7f536a62c59370ea53b6cea4384345343146bbf529334b4201ebdc7585b6e5eee42696400c9be9f496406a4eb51d2fd1b40466224f1752b181774ad\nA = 5a16d5fb9047949684b80805e5d962bdb939d0d0368b48517a2a826679c37ee0ded4fa83e657192d9ae84294e450f7e2f2773d1f13395169582cbf95860891b9fdf8f3240a16aadd1198e884f22b2718219d478e2410fd4bb98ea534a3626201959af099fa55488f5390791bcc7\nB = 1f67066dd06ed4a49cb556dc2fce22814754885a7cf6c13915d974b46b0e6269c0fafd688f45ed2deeb026a7cbb772c080dfd577d21ed2c81e50e7537a70dd550eb94fcdf626500040da88c43dabce13c82a93769a9e0ef66a471661292dfd3b3af07169e2dc909e43678400b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7087dd62eed6ccffc7e1370cca9444dccc4ff160458941aa9f49dec1a2e9ecce4cf50ac2daf06994c5010cf225cc92238cd60e1aed9edb2befb0fb354ffdde94ef5e8ad0415bc95851d59095a5c4850ec52a74c78eab58309f395d3078dc481feb9d30bcd9f113af7a01611b94d085e32193dec738a64c5fe9bdfbf5dbc98cda\nA = 13596eeefbf06e9ead8d883113d8ae6cc3da8b6fa13ab66681db5a9c083ef9e49d905ec19c39b149cc09452eea0446b29cc92d4e865e6f681827336945282fa6b276ef552363229a976c503b822e6e4a9862d3fb30dd0c3627ccb97a7046a6a679050a39166388a9daad5ec5555dbf\nB = -a4e574363f2e5982cc087b38110d257019962fc166c2d6e6d396220bb308a8a0dc7d90c5cb2ab85faa19b07ed7dc11eae9bf2abde0a5fed279e77a717b43d35e70fec4e18445e37741262d0b0c20dc4375371d87d839d39934f1dc41122e815f3f37352d04d0cf514738b351f02\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8495eeee238164082240ae1db1e3c1e36fb6621e6b714c9de914f9de8a587d7106b8dc5214f7c60c0ee231d7441e03cc26462e71adf8e29772ac95d0395722d2756f9f64daa8ed41d7ce824a572d7f9fd419112ae823b5b48b8aaae09fe093e9ed05918c4ec88ab159890910837ad0691849b44be95993682b2da2b124de39ec\nA = -403f21e1a7911806747bb78a4f20c4e6572d49c6c4ce071db0c8c91ee985e68a16e60093e4628414b2673d25c9f13c4c43600633af95017e3846512197c9515aaf9953570ce5861620716b3d80eae7de0f033772fba82652484cb3ce7cc189d1fafb14e044e07a88da302547f2e623d8\nB = 689d1b4a968b7c00082ae3a29c8571f826c4630c947a7767fe4a71af43a5de84db9b5baec0980eafd0019e09de1b5c56173ede68c9a6acf260bef3d9a03f4c83a33106c94ca7e1a8615b3553088d1d05a62ddab0f1e5a126df5d960f67e3b92981022e1f0358c7970bb2fd5dce7a7c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 397df584bcd3b2e1ec7ed89de624e9d104bd6812901e38c5740755ce91bd54155c0b624c590ded199590be5d98bd1ad4acee56a62d05d6b5fdd1ade12f7db8e3eb08c4a5996450cc1204be7ba61b768af0efd563ea478033324731e24fedada1ad6e564238c891494e85ded4feb2165fda22f75bf120856034a9206511885fd5\nA = -19cc480d1e07523bac502872a971d78bb26955c5453386f5d51767150e229daad3ab2dc85e0fa0cf6e72389391fe627fd2d9f263f105508642eae5a095ec4d88545dc9d0a2c436907460e1ea7db174673000eb2e0b60d57163ced261bd0f6cd8ce54133cfa10591f1fd27996353110060cf\nB = -39c45512fc7c9620194fb7ad22abea8f6dbff4a137dc4523115ad7e262934143cf1f320892f8c097a400d4099e787ea7041d0d69b6269d191fcdc8ea28340ecacab71058cb39a9c7362c848826b35ab560c27113fe53c497ca452397891c81365b6e7f07f916d47961e50b8c7c5cab38f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 263ab04c98efac12210beb66b13fec7c260c5b1cbc20cd732a511fb3786b917a617d6622847f4eed70f25982ef5d0b0d13848c62dcf447e3a1d491f4c80e69cec03cd318f6f93134d582210bfa81c1790562053a71091333348c6624d4d793fd6ef971d284a4ebf0be0771efad302015abfaf3edba017907f10ea14a46d9fdc4\nA = 7a354753e39b9ad1c0ad6b65575fc7247487f3ea320fa82d1d333ba8dd5d0ff925331994a6961c9c603be5775ef1842159551f0bfb34920b93d90ca60e6abd514650f77ee8ffff2bac0eecd0fe8ea0fffc6ed0285c9f3c3cfaacf338043975457d62f9c8dda8cce1e99f34529435016fe2ed4\nB = 1a4384f9620567c698ced05870b4dae983d8f0df6aec888353f9",
-    "dd6ac8ad54340c3ba8346bfa47bac38897f3963fce972f6d55f3407ae03f5c7637be1a34e483e50dcc27148b76ef079f117104162beb191d146ec828ad5c5bde5ee1683a031d554c276d837bf1f2f622cd11baabce10212e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 91cf4d1899e170bf75dda0d51a6481f79eb94c333b876382c9d04681073e949191223926523f6531f0a45765d7f382221eaa080d7bd05a3c19220ebe18802b15d8009714e8e4e9872223049622ca02040eb041707c7e525f698cc361847c66fe3673a72e4d701466bc374f55fa5437216eb59375c0e2c4f7020149d0118ea72a\nA = 12f35c48024e8271e8f9a60a48b5a214bfb6595a837c041b230e6ac87a4c1d4b3f93a2d3a193c750c9857c8627d0f7c454d6c4f224dbf14a865eb83e990b1d9b8bfb729b8d3dedbbe9c95032e4d60676c2baa2aabafa698392590add3b83b521a7a5e7d6f8af207e44ebecd735374acd01ef5822\nB = -8fc18f92c0613d085cf3ee6f586b39b99ecca864bcbe60fffc63c585e5613df68f3534ad46e244916b1f9188507a3692526c9e403b8e93480b0a5a6297f65215f1a5d8e20631a9d559fa1acc15a98c9397761ce18903f393b10444ba51bc92ac44df90d4cf0852da9d75902230c6de6f26dfdb\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9af562a7b61c6c84c91bf979f32ba5d246d2ee2050f07ec2dd5cb3f9496bd37c3922ecb2b5b17085a13e93ab2dac6022077cc18c621cce3a2d2247e5e89de8692a36f596e5dc7a6969a4f3ff0d1580eed380e6550c6218c1938caa2b7ab401ae6f520063c811088504d60a19da3b5018d640ab8d340f35d1337a2ede8bc64bf0\nA = -63bc10b8fbcb391dea305fe61b404d3bebd035514a812d0e1d38daa3d67f9f1bb8f02d2979270cb9147aa51d66ca73d4b5787e472456a13fbe0d568e92b622439d33ad3c357a56dd26806ebda7b3bb592385ca5dba7e5eb5d85eed0a1746441e8d56e22decdbf8f4296e30d222da5af17c427e832b\nB = 57a602bbdefcdd00f42ed1e2cbde2ba858d171804da56b0ac87081424ad1569df1308fee7c9ed349eb496d5409c4c46921f09ff0830bc9f57e920e17df16523598fd90314141955ddb84a1522ff3ebfa812cfeb6670525123476a739f64ebe6a5f1fc805a880f8e5a71b908c483a121b38d05cc2c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b395c9f264172a3653af6637e72c4c8e564d1ce68032a5d761bf546e0c4b51b33cb026bb4256fa639ae98e54e5ff7d8921ae411497272b53d97c2c44b5b9ecc5aba43dde201f64f1d033056f19ceb0cbd04decb486a1d07ab1c64fd213d7eb6db9cd11efd743462e137f368acc4ca0b49a7f85587bbb5ede4be1616889e2699d\nA = -1e71df5f04001f6468c3a192086bda948aedd19c5da9a5286856f30524238d95b0ae71940f2af123315ab5d2fc61964d3e970d5858b7c1a78d0f2cfd10cba7ba4830a8c19a09b59794ca5d7da32cd8376b5ab06079b51cd9819c0021ea41a9e43aee147befdbb17a92cac7c7767705fdd908bcd291fbb\nB = -394c187308320ba1b14d91d75b8ff993dfd57f9c84e8185f12bf9924e046629ffcd7174879f9925bb643988259cbe9dc9277fa83a25012f91159b012f1964aefddd5a94ac6c2a55a22bbae93085dee079f84cea1d53dc4771901db9a3db5a14eb17c25aaf5377e2beaff6276cbce7cee97a9b8f32737\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6602ce0fb5002eca37e85b60cc871b7b2eed13d38c20a37a6e0886ee4814f3ce2515f8714c67ad81e8c3abf6a00464e6a51b15e55b6c11296ada43cf459e15915026d3260cce8fb796241fc2b0bdd2b65ec04bee3b7ab6626e10597f3b13b43d16c34afd5b43a219917626c88b24c6f8392bde1b2e65a50b7f1a8dc5eb096702\nA = 4855ce75a3d7dbb72a257f6291e9f6ccc158647aeb2f8beb3e8fb32f6f59af1a46617b77440798562d6f58bfe826d3ea7dd28daee8f5162d7d24ae6c24c2deb2669b15898689ca789e2005903f3a94e991e7d3c8f3ae6181029d959bb15e71d7ba94d2dfd3ddd10f6fc49a65798b5f6ffd64682c78b5d91\nB = 15b3e9992aa3f042fd58ff97a8c04aaebf46b75fdc38caa9224394a1805cc26e4311bfb498d5a04d19396e98d11c8810620979362df82b23a115fc1711b57c7a56b8408e2682a2edca36cf9311addfedd2d0889a78cc1ab170d1379245de6f1f6f4db815fea9130463dfe5283f195e6e81486a1d39634aa\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6a81ccd82f00d829bac186fb38b85097d52afa3ca83a026856bb83f94d6af6f6c6f3141d433f8fc159d11397df8d2f44c769f255cf8148249d8e9fc4f59ec3bc8e804d7d5189e71e20b8d0e540b59a2854ddd7feeebda5a95f17605e8bd5f311a63cc2e4ce23a51229d0a49ca04982c1bff79c201de6cc6150b690c98106a39c\nA = 1f1589c9b5ad9d878631cb03c23ea7e94680220856285668838452a63b726e01709588b38e578da8a4845aa5cc2e4723beafa4f81a1a2e463f67d9a3e432de7064ba8bfcb943cd9efb0e5a136649cdcf5e85a667917075804991b997f318752304f4946d69abf161625ed0c03bf9abeb4ef28034f818e2a643\nB = -909dc7fcbd27d0bf7d6a3d0e2937ce725b5cca0acf78c103d633206cb431e2e2c785aea4bfe2042df32417143de76b71d21587112f36d067f878e556b94ef63d59a07d19647593efdba7f3f5324d64c55f93a283a0dafe080167f6576053f9beb326994f4a1d53e18e3f3e770e69450bb70f276d128e48ecc\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 69139f2e10726f83300505d15dcbad5b5f284d1c06789181683b7b8caf35dff063dfa4968c35facf32a3628dcfc19b3fa4c30ba0e030b06773832a2631529fe0c0c402e05a0c4e9446a8b6c22754c70ef540f90d903d83a2e3592169ce6b5edf939ac5ff25b8bd48aa2425321602a9571661a1109e275a3b3039ff0c2f430b18\nA = -5d02cf3969bff8789850ac898c00fcb3ff1fc49a22cb243ad18703bb8fae25f83502bcdd885417fe46e8237fd0b444712c4fdb8f4972dbf9278a83eb305efc7a8210ce55167c069d1c4136a9b66d0c4dfadbf036c079d12aa082fbb42bfb0098006136a61f3da43aba3d3bcf2f5ac2d7884caddd0cfc28681d33\nB = 50b369234d993721288662d83298d99b9052a0a66336a5a31b76dfb20ec2b5be3aa76f78b2c17c63d78402a15aacb585be5c8d2e7083145e316e71e111fd34f5c79363c4591c247b1a94b20ee042d840c42a3001d6c8dc7cc1e1348e0e3ea8c6551f9d24af2dc2d0c38a54ef065ff048b148ce4f11ed2b549c50\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 87de406a6c957e85c759f8ff684023a0f98e93ad4ffcbc6fb0038c7a7ceed2486f15f36555d286338aab3283aef677118f7cc3f88a7ff0ac9fed31da6786ce895c3c08d3edb652bbc9ac2b44c4cd24ad281ca3a8e8e6e4d730f4f0c25487cfc1b2afe222934eca8b1e1572780dcc149422a88eeb1bf31065c929685a0a97ac3a\nA = -1878e0497aa1c2942a2e6956957c876dac73c4bdbf42bc92498f29a006bc92f788c24a4624b87324a7c8aedc6b2c0c8a1a442aa91557aed9bf2c02b6664979e8a9a21330dd839f4ba8f84515fa6f7db9287f7c20f31732b98fc09ee7796dc524870dc35851814bc57e1a8ac49d8935fea04bb08b8760df33a98149b\nB = -32f4e94bd073cf3f70810d9af7a873996a0510109bc6fdebb855f27dcd012c59507491152d30849d75f95dd868992c6fbbf29b1d899cfd401e9e7f4e0436732cb4cc9e6a6d6b0cb63fb0bee21e422b7f7b7b14dc5d2b6d10447fc4add390fd3c8e7b06f1d9b181adfa8d04459ed051bbdc9666623b00e3871e597be\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b456ccf9d066dcf4247a21c7f3820e324ac9cf004cecf8dd1f6c3aa40c2a33e24c423e97190fc71bb9fec21d36c5a687065a7877237a2a05e64cabfb3b20bfff0b1f5ef2e9adb7edcd7140d1047b0919a2c770579ab44a08e5ad9f63a06f90ec7d5885b91de5e524b2e187937609b4b81d40a0b33e31a48d7b9868add75286a6\nA = 6c484e3c6b530dcd3644b19fee66c41c7c2c1dbcde574d87ee13cabef9dccbe5b41e25c32c6a56df23f2e87176afd28249e5fcb918723707fca94d7e2c9623a3493d395db802a1b49d550f52c29666f785652fe81afcab00a60a5b50cbf523cd13dfa06d5a5b0809c68ff7264a2cb35b8d52284172c62ee658e8417e6\nB = 1b4fc753d0530bd07094bae09a02b1ea684fb4e8519086b1e2ed9d59af011f61d1b94ffca6f354a5b428417b328bb1e8af3f6c7ac9121d",
-    "ae58de9f1dcbaa9c73a357f408b870e62b0c7db1a72c4c440f2e6fe90b199b9dab29fc23927190d3f2bf8a7ee926a152e64474283695614ad696c85ea547f5f51d02d1b823e3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5e7c63276f350f04816a6ed9f98507a78314f1d99081fcd906affa3b8395fb58d029ec657af82e77ef45611bc988095bba9c26f25f8fd404432fecd02398e69635f3315a824d6a98b33eaf6a91f12957a5e80cb48d5b086c795eb3b1e04da5432a7e8be3d683addc586a44b6243ffbb7a979bf9664cc7ec41e75f267d58a7127\nA = 18efe267d4c62576294f4ba44c67a058cdc0bb44c48f4035682b2d6b8a63106081af43d99098ce133f8d7f9cd04d4dd7414f704e32871d43d6e5d73fa9f447873168b43b32d6ad19378d74a967f92ec7629a690d29a62a5a6e734e9ccf5b84857a00d97b9db846b057004b03d88b827dde717fc30e6a5246c752d65dd625\nB = -ebaa580d3eef5361547c692e107439c8391ac0a2d1cec0cd275d0be69133eba8a94bd186ff9a129af3f5a015d5ebd30215643554d7064635dc11ec7a8ed2200fd637b099e534237f0495d2b629abd4c8f84aa1d925d53e98490d02f9fe51bdda08b043f67f0903c0195fcb886c04397d3612e4501ab8c7b7db69f781e169\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 76fcb39f94dd2756e8266c025cebe8e801524a757b976e35ed45e3da3db720061cee9037fdb34776c704ad2059ad8920e400bfbf10eca9bb157eca7750cc31fda06473bd22d4def80189c47ba32e2824c721425f225563df2a2ea1edd090e01c0bf980677db5a5dcad37d21a68e2832d1012586f506480e929b2fd9bb4aaddf0\nA = -75f903ed9bb0b6db8e3be16e797258f6c18f6cb7b16f835f04e3045f7e4974d7a86a63f2ec351c88fadc0635b6dc83a797cdcb5cce1a1674f89e44190991e0930575b19e2aa1512bbbf2ef6f8c3e707b17516756fadb635d8c6bf9caddeba14834b5950a4d1e98bca79a4d15e5fa5fa3c1727d7a49b33d481d32fb14ae4164\nB = 4ccc582c8460f7def2d26167b68788a681c41bdf6dc805dca83127a18bff6f5ebea6db75cd959beb859637b200ccb5c7644d571f436e46a357d027edc9769da226278f7ab947963f7caed1e7e70e572980e960e9764a40c6db67bb526694b084976142471270b2331da563a10427cbbb38e76203d7da5d67487eff701d75188\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5adef30c67aefea4da3884b8a1d0ce6724492bc76b477f1053621e7d19f3cac15448e9401d34e05ac4b508b9d1db9a8d323cf43722e0af6e3c3b6d463c6007449c3bc3236d156cdf988dfc308a1b4911554ecace52938a7b10f463d14f917ec3d9fddcf6d33081745009c59b58aa22bcd7dd8c3bbd489997d4e0bff5473ab9d5\nA = -174e8e057a1d66e22eff88de26f43fde1c8efe5611f6ba4f318f027f5a5818df02ec3f014dfedcdfc8c143c5005c3c5098d409710967c93474f5854c1113fe4030e6682bd56d389ca8b9a4587b8b9262d146bc92fcd81d75c3bfa4281898f394f45d5dd11cd4c7344ee7a933ee346bdaeb6f5188967c388b919a0ce6730c0bbdb\nB = -22702bcc4f9d5bc6f803af6af8072780ff7de7a346d6b9293ca751d6ee3a81493fa86738c44cf2b7be4bf14a55a4f8179c35c09dcb1485f4c08ec5e9f9b1efa91f4b5f15a31a46e1ed71cd934ba6bd271bb22bb5703aa468d297f360ecbb48f9fd6c572683e83ebc3d432203347dc62e19fa06f93e087283347950829d4256bf5f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5c2f67b1607776c10fe2c30b112e541c4d8229f5f99f615fa02cf715d3f20556a28eff5c233c58994e9c6c1fcc37b3416b0875b9a62fa5a09a4b8f9e216487203b387ff97fad1f39f674ab19c5e34cb2f162e6b0b0b0084f0618e64928423b73b189c744e3de9fa50d66f45975f68b14866cc16c8c6c722a54420adf027880aa\nA = 67056e93b69e8a7b789f1f8b835d9c6ecb7762f844d656b26df9844a60bfbe0d55684f61debeed31a24ef4246485e8a1d43d49eaf97ed9e7b9f2d2916a8d85b8c9e8ad5575cf5a3fea42392e5d1dfb23f7ad41a7b56a4f21e2828aab38a602d560c99783a4f807120292ceae366b1fbfb4be8e5d4561bc8944e7f17ebbcb0fb6296\nB = 1f874f244ed6cff9f910ba9a58db0dc0a7435e8d99ba6412e976b8f64d4106d3c5c57ba079384fced1c261aaa538e131734451fe84fd3cc5cc8b3ab46b2031f888d95084cd3a35a61092672a9118eee4ed1a0df0409e3613b3ef45a8b16b71ec892755dc3f83c5492b67fb9a143ee6102d053078f4875636b20b536d5cf851768cf73\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7850019c6712f18eab877faa8489daba23cf34b512a3193852508185b13cd5a2e9f503fe8d61b74b5d3930021a5b8c38322aae9b9b1b4814fa4c2c5bc409b58f11fc8fd7854b17baa94a6bff5f234832f9468d90d148fa2bfed774ac03f2dab6a506a70db4ce363f932adcae202f04fdcae968f632dd674416c23d4e21345ef2\nA = 1e378a0f27e6259763890d29e112e3d8d2bdeb9994c49fb67ab680b6e71a52fa0a7db886d3baf52f36d943b5430ae8bcd82e229f4197239c35678eed254c5816722b995e9c311be942f8124e2f80c1e59658433a57f346adfcdb83202e55457308161d2f928b60efc39538a6469f90f1a868cf6077568c8241623896ddc2705cf04e4f\nB = -f4ee37e39d4cadb692bab5483ceaf0258b068f2c0354c540438803780c983469ea28324ce7e209c3bf55b91f0a2f4544bf318585e4514333eafb9b8c2f02170c620e9b5280a828ce1d8dfc64ae9c28577e15071825a85a59656c5b47d9a382af6b78a5b3dab1078dd647e0b473174b8415d401543d30a4018cc3eddbfa546d0fad9cbb2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4c8f8b671443a3af5ef5749885ce5de8e2afeadef9051bc49c0d7e72922d049b1accdb79d82288e472b07578e8b6d2176d6cbdd7f0caab593dc0fd9224a94920235410501fddd6001b62a7f7d8eceaa7a8e4c0de52029fae68656e8120972b5cc1c2e909c2742e836f2fecfa51e12e4f8a2ec7e69eab061c81785374ac607fbe\nA = -5769eae759dd6bf94468eae94189d3396886d4569b0ce264c22d39b623be3abb01bd5008b9fc86701a3373f7764118becadcc69481cbb134c20f669cefeb376dfc489dd4ee91cb333d06afa391dd322abe2b3b715d11ee372666473a473e29dd90fcc97e939049b455be52b3f288db306999019c1177ab5820d94859a9d2f050b7ee1d4a\nB = 44adcaf1e2afbfddae19b23cfc0f0ba1f940d32945d0b541db23f3a0a9d06fb1f67ade9a8e620bd96f4005ced99430c7a55eb7e93a701c829fd5b9e55dbb4d3833afbcaa0d9c946916b1a86af4a6393b1155c6439b8b82260e09ccf0ce5d1c4856f4d524983e4b0fa123267694a1c6118beb8be26113a02721a02d7b0ccb01ec6e9c0f9e19\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 51e25767b8d4d7b2b0c2652d9ca6bfdbfea06acba543b1bc8d3d25b2fe5f2998febe1a6e742abc3f482b4267854c2223a5918a9b5c84e0864278283bcb5bace0c046db1d0240443404fb62d70ebff3ccc655e5f5977958df4c878d9859a69731744f3d33978ac31551487270bb4fb56ccbf59402ef9fee42cbc329420180de08\nA = -1966812979042198f70b3f1238c93ac5c6e5749f1108c2bba869b1dac7680f910e56318c9b59be9212e713a348767ba6e75917fb599e929ea2144880d18d4fbda4f4663c7abb49b02245169f385e09098a4e01b56dadfca8c803acb7cc244f3c98bc17440ab2afce318476b80e1d0b4ed9a8d6f2a0be64633f8faad5eb48de2681a38a633ec\nB = -2e4f5eb92fc34c753c61dcc826abab6fc4f427c6ac7e73ffdf65b1037464b2a9a0b0290e713d81ab57c0e1dc30e76fdf96046fe10a34cc4511398319ee34bcaf73763a9042fcacf59a100c43d3333ffb3743048e8df0dc61fd0da3f935fadf882ffdfa9f0f42980c1af6edfdf161c4b16087e2b14277f655abe54582de79c51193e13169b55e6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 33539b5f38a9943b15801d449adabe02da6e21651d96acd9aa40e866bf65015fa40178399254e8af6bb082d021e2a05da0f45b699d193b70112e114f0d25287476dc0c733c5cf9df57667ad0d3ffc4ea2f85b43cd10459cdca9465b0974e578c00a6e275e0b97ef2a4c9886aab7b5947b78a88f84a3f1d8c5f26bd07bcc59886\nA = 531b891fe9e8db322cec59a2115574c7a304c423e6b11516906b840542b2c608785e2c18033262ab9cf68f63edb40ad4f073ce8841",
-    "db602cf8fae0a6771d741c6392976c9b333ecfcd0c8e9997da40616ae2a9e0c6be93fdc7af0dc0668ded1e42a9f729c70f74500ee76a91d3d993c075c2f645b35792a20edf17c157459e35c0a48da6c4c6f\nB = 1a6fdbfed1054a0c5758f92f72db7e5737b0740c4d8c3ae4713366ef6709b21eaecb6b74c92541a9a0c99ae18ac6ef7de79d4c84ce39ad59cea9c203734a99bbb895916275e8778cfcf7fbb7b7d081a677769e4ab96bc7bcf23303100e629fa8e07f5b8fc2e39c7b5724c72907eaad09d3088783b3118e57c9c8ad1799b43a13f73864c5602c478a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2eab6018361f557ab06725ad90f6886d4b468ab1a193f8fdcfb4ad15fff781c8681329a27aeb5f03a81d7c404b8017b12fe23165e941ea767c733513a07e921aedf20596763f6f977316e37bed70f6a617e5c2757c229c59b3d7b1fe8755b5f65f7f407f13634aca7c8a267e661ae2f77fc5a95f56cd6c8458119df587478b1b\nA = 1cc779145b2b7bf9ef4c9692845e162329940f96eb43e04db8728bfe736698082aae6b6a1b3c32867c293b08547a0941cf4059d2d567840ab6ea526e3724ad59e715a3782ca656cbb739dfdf0c113a18f0dd62423d4edb60057fcaedbb852178d38f1b5a232842b4fc645cbfd97a8cac0b094b870064302dcdf23df2c9e9f736d93409cbb8ce9ab3\nB = -cbba16086b51bd83d3460e51cf193ebc79b826e4f30978274eac3b2dcb04e9d7b56a1449b7cb128bbfeff5c4720bae45271fcc64085d3ee501f0f21fe73cb7db5f275d88be55c339f9180ea21a8cf3755a875331931b75d23f57c2030c89c6f9c1ead431cb4dbd4480564c83f8470610e5673c7eb6c0fe7351ffd7ee460df5db7872c67041aff0227f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 96fd93535728b961b4167be8b304e570cc34e787c12a9a5d76e099b336ed6b837cfc246c5bceb04b0f4744c5da7071fc01d70e342509473e5bd7c60d6046c9b4f21c5ee71c4e678447f837db3a7694fc3936ca733efdb7d387f0f6e263b3ac0b89054a826da9716691c9d580ad38d701d08ca090b6c59be466e1b9833e75d820\nA = -6791fd686f46c3773fc8d7f4753d178a93f6fa4941f4305d9689c2a305bc67840bbef80ff05c7bc6de3a595f73846609327d28540cd705f5aa94a3ae5915ef55304c37c4c43a4b46906889331ee16585629bb303673d439de9c0236f708fd19a977e6e1032e0576a921853f7dd328979ad1f1aa945905dae93a82b3af9451a541f544c18ed2546b66e\nB = 6ae062b39c77bebc2fef05743e6d35e14a31c6fe1fdc42d8de2db94ce70a6d60d66263c7414b1081ef2fa6ab511b361b8baa9c71ec628dba5bfd772c440baefc2fbed68d40897878232d9715c4b7e7c9bdd41cfe7b6986d825f68be8cc16d04afb0cf593f3028f3dcd91bc94923f3d7211aa5f0f12d3270e8df8bc191808f0e266c4fce2af97ac7ce06b0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 949ea5f645ffe5d0d03359d51a663c7dd6e6013812a47be309575e036503126f48677c68c4ef6e7b3f72d76657fa282ad5881263e649b5297da82e24298300d032af3f5e8309ac7eb597b16e257a6f7af3476a264415aa7783433e83be57ffb3fdb404a9ddc3527d6a9c297f8cb7b6674961b3af837ebb65f218147a46c39cba\nA = -10f59ba073126d92a201529a5374500612bc59a9e66322c6706b422d35a4f82d97e668b268f5527b4641c6099c80bcea504234f3c1e3fd29eba0f161da97c50aea542becba499f29d4ba5571873d4dd9eb3f48cb26fa6c929a704fe8e49791b2ca3293c2428d9cb453263935c9c90a4a2b39d23a0baa12535845f907d42b729033a0a1e74d18da30a88ed\nB = -34fdf9ae6760d4f434d09ce2a7760ca2dda14bc256015809745524dc49d841b07102aefe5a1d0182e3e09d4d45b415e46f653185742b9b8ea6960160752080e5c9577a12182ccf1a293407b534ea8ddd33ad16cd19ba537d8db5b542f86a2a292423d452bf18d82361240a7efa831518184572c5a8b73b108a81d5036b3b530d98bd47c7fb2123418f12e05e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9ab739ddae55a0d71b39974628d4601122ba6c5035c3ad0439691317f23dc33c0014f3e870a105e4dc1432ec79693bac658433b21cfc218ed411e003990b94ebfa87767f3614ec19f5bc30704adcaf85a9d3d15ea764c8f0bbd52ff388659637746d39859398c79016ace8c6f97d3a5616711a235b85f334fb889b9280ccbea1\nA = 76b15a0aa0f59ec804a5e9a627e1fed524320b29120b6789f8e71b1ac4e00a9a8c826919035b84f87d291e2f35460bee181342136dd9eaeb99ed00c6328b8e44c49ede3921d6275f6e7f03de179fb2374ae2fa6c58852fbb2649e214691daef945ead6c8bd5a53ad2b130e9eab6ad046ddd6b80874ca6515322bc171ee32749333669de0d9c883058423579\nB = 1fe2171056ed4585a143b6b2bb5f44047664f64d710dfc05c18be5840ef9426ef05b6e92e4ecb5544ee4622e9030153dd9827f2f01ef38e62b88ecd6c46b4457d16644ef6d863c226acfd6928a40de614a5853137124fe69127a7f05463eaa49bc742d8f7be300d06b302dfb0ba86801119bcdc01b516afa360aa8b22b7c6c1839cff859ca1bf26e3f7e030512d\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5631048ffdb2767aa04d59d8a5750016b38b983a2d53743ba4de5d93bcfc8ec30183a84bb1e290ef9c72c7ad357728acecfc613a6f9b3d712456d545ed54a337930937f4589fe41e66ee930db3dc10a4fe41481008c69eced65b9d1c46b8574c5ac8f7d94025d8fff00ced17a5e17508527681bf94c2dedd51502a2c4652538c\nA = 1aca12b1933f25ea081e12ff4a4f6f9ce379f96d976da2ff7b8eb8ad791fabe31c1148fdec22dfd67828e540c955a1e13f40c5b125e1c7e6bd839bfa84e5bfb58bfed76058c6db77af7a34ffd25fabd60e19f65e1faeeea6371d7785f2e5bddc8650a7492e06691d61f997483661eeff54a30656f1daacf31182486bc40647975151fc05d2f64b50e632f5d5c4\nB = -88ed894287043e7e5cd2eda3c1e5c97f85809f7a246b0c20891fa9a024f3aba4ec1f3d112580fe6ba6b0bdcaa1325ac7ec9508aa88c187af08e4f37631eb6cc97e4481b18f747ce6d35ff355e425a4833834ffb8d34a818bdb015fb818ac9f58feb87020234243aff912da5590ea3f6cba74f1a9fc3ffa2b4aeea25479c55a3b572621e75d86d8c8f6ee4f587e0f5\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6ce341aa4a571cd5bc110dd436acaa09f409661967de0bd096c77c60db58b2b0ec95cda50acd7fa20ea4266b2c579eeb6ac214a75d40abbb70845db74c4d6c93f8c545add269d45fb15d985e7e630d0425565d06dad4a3ff9835411e51fdd9780c24f466dbf29244cd1b8c3445af181d0928db399bbc8632f7ebcb9d48c0b754\nA = -52c53999b02a92d6254557203cb31a21dcb896495d1f29f3277d19129ee43e521ab9d5a297204a844a9537d63b74686eceba72ea2e7b98ee8895513395cf7c44c99348f5c4eb657874a8115f0027d6a416b8a04a1ec0e6809b7701ee7d41e99996e307bee9c295ab3df1faf674e0067d0ab3bec4da998580203e33760870ae472a3045bbd66e352b8f4d284efc00\nB = 4329d110504caeb71ce0453b0706ff675f646e70a6bd9575791a38f672eff226f4958f8b1fe4123c0001d8f8595d8030d0e9798232942725a9b9d654ecf50546adfba7103fed796b455ffbb4c153e70f941bef7953c8a210d6f2f4ddf5d9a79d9938503ae8f24d69d5d7df1c988630ed960e12dd877bb80a1ab0bcf6db67e0c0578fc0c40408f72b19052534da8d31ed\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4b9fc1e0eb4be199427c48bbe1b53948d0135bc1965b8aa5421a4ec704b13cf934c650405ba02ad611b0f29d46d82d4a1fc5a84651a29364524e37be2fc7001cbd3c792aa477802999841ff19620cf66dd2453c9b05aac349b9094d43b40e358f32805d87cea3cfa98e05240ff95ec57d88e0a12917628ebd34946eb1ad6799a\nA = -15a223b691d8b3696306b0ccdb52c1d62c7c2d1ac71e5f07cd8fba960417b42fb5ebed5eb9469be67f231b5254bb0fcfadf5ac5d2906769e8bf8292f0442986cabd88805a162c0c1f60f9ff0bcc2029ce33452d05f754375c0bd147fba745bf8a0008792d4f90d0e0f2cf391f2d7865705544f4a220ded44732321473c0ae7870394d4e625df11bd0923340cb70b995\nB = -340e5ccd644849d982bdd455ddb3b9a23ca14e168bb87256bcc370ffb6b7fe78fd062b3bcc1ad3c8c3b8cb549f2baaf1b7f0f6522aba02fd35b651f7de52b3aa2e0e40352bfd6ed0f84a2bbc3b3a396dc8512ca1db01cc69611925f1037794c82a418f10e0d994f458d1f19051e8bea32b90ce744d46718f42e711c094ad0a1ee96c88920188078f1b044ccf307e4cad7de\nM = c462c7cdd79b7604246a0cd97c017700feb25908",
-    "656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 31c090e5160faff9a136a7a482b42a43ae3c7d00c215cbdad28804be0e7b12b0b3af820c1350b1622a22c8875f24d48ff16231c826d1a946c66f70aef92d4e6582e3ce9213d907267251ac74fa3cca9f1c8fd53fe9898aec19936a2b797fc345d68f0791cc740199be39c05053d5591d874b415e62653b04a3f41e263d00f230\nA = 5419e87e50b28b6d24927934b541d8de548a8f4ec7e9b00aadb6d23f2d33406177d3fc72d29ad2c2e141ab2916adfd30ec4791c626af61d8d192276d632aaf3b54e2ffe83b44f6f1ac441e6823b6b58cc08fd7a0af945a02eabb5aebb2c7ff0622a17b38077cd0cba906ce23e71ac7f4da40ef6066565b4cb3a62ebda28f3629eaa251dbd9979b123a5447ea20331723e\nB = 184782ba4daf429cbd13ac13fe93fe5833f09915cbbc707feca3293e505ce9cf0b4b12ffc8b178e0a4617f809be53d4895a4182e7a8a65043361e654befe8b01429ba4b7420193d1d7d90930ee19cee0316f33a5795335f5fa517e1ffbc99b95101b0f936353afd3bcfec34851ebff1ef02fea991a01b587d28640c935ec91496d1aa3ab8d38a6ac75b3a4198ed27b9019bb3e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5eb9f3ca660de481968a3c7321281f22fb9273b16fc10d8eff1fe34842364dabcfaee4993c1c8ddb7c8d6e509a8d2afc005075d5fd3c4471f0622753c7797aea900e785ceef905e2606f64f34e47239c40b74f07e2ca70bd5a18cb0a88780489f3e98232221f65ac9c5ce703a256b7b75eb1dd38778d8bc05a37ac9ad8d36b35\nA = 1c73d8e3d5db127a81477a5c4c6d61ac62af446981773ca15a9a01fd5175a2826a8763f91d68df28ee606e8ffc203305875a238d2095345556f12f3b5e10c5bb6ce3f90342ac74b9ac057195c863c4b9d28ca1d958a98649c7f8897bc6abbc39becae963f61b33bab4fd20d9d0e5464f21c2cdf06d00f597dfde45dc5919f5124f26888b12d72cbd2f57de3f2de7c014f891\nB = -e406fb60e35f0abdd313b8431f4cc89fbb034daf71fae0cc727e9a93cdfde53566fc74e48f4cc2111fad158c63293bca0b21b98416381b81d2443d0e91647679481cd6b6869b37112d3b6e575eea7fbb5bdea422558d817b49ac36a829926553202cf9dcef09423c085d26176a89be741ae20a434ea461def090dbffaf2e2ef97bbd4ec779041ed69ec07d125c7b85a2d215bb0f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = acf9d363fc9b76ecf7e61c33270031340e66595e559dd1c9dd4d2243819b660183521a4124558fd4b216dcf5c52c4127fe517c48cef428b9ee0f1bebabab487c968a80b9815e82c12e807c096974ea3893a8d5597f745365c352a6bc6ce92479176092f02907538c5e784bf26dcde7672338f402753b08de8aa21b9480df6955\nA = -7c03ba6e3939ebbeabd35cca277eecaec31f326ab75f1a29e05af50c4e62e0175d4d6a57acab87cf1fa3a51791e9a2b2d4d5db570ec3941263902b0c74544c323c106557cd5139d2a25f3c3ef81ca009d4e3c16f1abf6e2b5196df1b30def46d61eccdcb3741a6dfc8e8c5e6db68ec29c82b0adf6e35ce7aacef8da806b3b58bfa489d319869b20768f8eebb604a9624d048f9\nB = 4e021959da96ebeaad17f9896ed53010d80ed3fd4c3a826a266e82b80ad81b3032303e7c0e58034a652b8aac00c08d42a530039de60d74ad349438f5ecca1256342ded6f30e3bd2aad5bf2b49124cb27f45f697e157550dbbb37f5aef0f04839aaf1ba43bf1e77a1529818d0fa91d940904eda6b748e5c86cd1b37592542c43b7b4afe2b8926fef6dc01784fa431d43900edef27f8b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 24124c69aaabec7a7b4e7a82245f6cb14b199852a8b314a7b8d9049cb66096d5ac93ac75eb58a2004de8b0fc8375638c0878fb6a45be8bfbcc292e3571df1bb8d6e346d5595fa395fef983a365e4e868154fb3e337d47771419e7f1dd5e4220900c564d7cbe8e7792ab288f99d265aeb296c5ebfdaf08b88d9b30ac660cc3ff8\nA = -167c959417e9566c93e7e05d2a410f4850e3a313e516ec958c3d2fbdecbf58072d05691c68981e176a867d7467091dfeca11f695f750c8c44ebc4d08e39e679d96c4791ceb1ea3b89fa3ce26f7ef214c5368c03ba694f7ae592bcd8ae53a66cb3eb1e0cd3c105faae6eb7e7a8fbc88248be722406f2d35e46c751b5ceabd992091eeba15191ccf6dd61a7ee0c624d43b188c42b6a\nB = -343940f3b2a5f73a51d6f609e8af306f44ce7b5c2e79edf6f4dfc07866dc5c4b2e0ba48099b5503af87762a44ae451d166f8914ba25b3cc41a766583bf73d27e40784064582fd9fe952fc00e9aa2d4e4f1ef35818978e725e69c1bcf267fda4d635d1d292d54d3ad10bae9763dc5d7f7226f371184465695f2d384d749fe07967a1bb64df22f294ed88b13600c7068d881f713cb8e3ce6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 50cac148215963e58cf6d2ebc36fa518c63a0ab8fb136ab84c9657fee459043ee9f42aafec89e8ba5fd1cc5c4495a41e80590ce197e12c087ff7e6ea88ed798735f55a1634562b82f8514488ada526e5dc10700058980885000e266cad55948d1e080f6343f84b12a3698d9ad5427fad4017d931df77ed2e45e2fb8380b7fa39\nA = 6a9833d768a22ea46aab1a1619f30283a1ec254a2de5652981d73146aabe31041ed04d271c6f2e5e2d090cd615518a06563a94ee2b12cf9f142de3f15599998a712974d0ce9b122a2aa65bf8750f54c6324f12e321a888154330f0f9e1e5b7999acd70d4e6da95c2df1da2d19544b7abd2bd3041e3228c7cdba44f7d1cbfbcf968f8fe87fab523eede0485efaf5cc9e56095cec8983\nB = 11e782e2b3f469b1e3d14ccd1b8301ffcde7e371f6e9afc99af5809110c6d70e1cca5c0bbfeb95fc3ef8352581c11ba75c0f8c445ce2aea903769a24289581c95ae5ebd9553fee61a30d155bf6011278807833eb2ce7ee2a98fececa23fabaaa259409e88e3c4f4eb1e04176d44878ad3f6961e0615ade2fe86b6eb02adeaa7c9019d63231a28f84b7dcc8bb0e71e2a717db09301e1dca20f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7cd49d72bcf5ff4fa2c686f21e1f0146c4f24b9ad2e900dca1c0a5d2fac5047509064e65ac582946b251a3f04850c9abd8b80c92af0fb11ac13debdae8b94927f1de0e4bb217e78f5d04897c6a0762667d3d883cb754dc610442c9dbd44228a7ae4f14fca145550d813655befe3bfeb52f1c76f989ea8a1dd9c10fbc7e9d6574\nA = 109fe33568598972063279b71ba0efdc2e03f770cdec331428fb8ca084c9b20d0fdb5cf9ad7ce90c8cb8f0fef10d219d7dfcc6b4599440db8cff9971da7852880bf004266886eced8763b3569720df3a1fb0dde2717ce0183f2250034871146628430f206c12f5fd87574c206b203d90c0f2c705cad3484c73da8bf4e9f7e1bd433a6f7fd27df63079d30c490aed7161bc594eefad4bc0\nB = -b95da952cabdebe0194b7fba519768e1b56149353cd12023b97397b59e0d7f4dd1d27b65b833948f58e66d3f6928cc3140cced835dbd612cc82a7e9fae1621986f71ddb6707ad57926b03e87e165d30fb145795a70627975bbf9d9ac9bce07492de5227c666663cc28b3e70b19dbaba7f16849535ce5fd61e91cd2875e0a534a10c60d21f919d566a3469d108a35ec3f023210efd5d318c7210\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 98a89cb3c9602fe503c32c44609bd4487b6c8323737b3376dafacc3eff96efcce7a31f1b61ee6799dc9561e77ac058fe5195cc013e72a2864f7e492d9f35244b321d46270a582f6f14f15fa8203d392e81b183a1d64d48b51d70e38d49c93869ffb9d7509f15ccde547d2d9c4dccd50eba49190b6e831a9f4f9000a95dc83f3c\nA = -67d7fc8f1766c40bd476cdb65d4dd161c3d4c2c5860a0c559f0e87ada213c9ed33308c36bb1c7d615fa69ec53656bbae6b57181a0134af23ea2a75f8fed3290a2f483392a3745fb57adf2121738c84f6d34325121a702c8ccac0090ea27fe9a5ebb6ba9d4f397e4a7e3151850b3d7d25643398bd3e4c1da081471389799245d986cab825a2e6ca72b38ff978a2753c835299ab4597bc65fc\nB = 676ddc4d18960817ff8fd2adffaa68c87d234d62d445d6ba3847ded849356d929d9e4ff01f517d7b1c0778bf90f475923517d855956f17ece1e032e2fd474d2133d6b8a591995454d8b587cb4f6fdd0fa29305f146d340cbe6b6efd28a926c73735621be0c5decb792083b3f063a43dd9f635e03f78c1bb56389a5cc993c8f36134d755a324d4fccc2ac3bafa270df67db0a4ee6ea4497aa33b5a8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 76c",
-    "31404854006a7d55554762094df6e11e0393f5b0451d85de2e5b104432df72023a35f44da10dbde01cebf77b8f9d3ad582373c5d32232564729af0d03c5450e439045d96a2f0a38871c922af2bd38c545d219adce0ec80fccd121d6a733bac09253604a8a0b1ecf0f24e44b818ab9e9974181cef10e9eb17684c57d72257c\nA = -134e8784878a8f3cf49ccb952075f9f9bcd24a20f8883955f262867045c11a9c566abee00638927e5de924872fb98f6376e321ebf3f567db6cfeede62e04f839617d78b7c9d3487b60a0d3897b3fa49b14c12511d04854bde4a9dbe5f31424a3d05cb75d23b46f6c0819536020880afa5a2c173f6881754b56f82a2864c99c820156f96b5cc4665d603597331d98d90a52f4a30c6215ee5eaa2\nB = -3c5c0d35de5fb21c84d2db228829f43b31132b582556b92b495f59df502a6d00584bb5bacd9b8c1a8c7eab91db0ea24b40f07e62a712842d5c2e1d208a6412a068cd5c6394d715260b67fbc03e3ae7eb4862f74f4d7484f747774fff03830c65fe022d579adb6737f6dfe297db750e6a58d1004e7e2716838befc2ea97179ecd53b7f36e3540e1c3a0f3e044bfe2d0efa9b89d2d308cbd0bd88ab3706\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5b704b3181e5d0494937b4d6aa8172eea82919fd1d884493197a6a85ff047a7bcd5dcf072bdcef0287be20d4ac49918d1df550d184f86d7220f0a84fc4da3ad05e131c443fb529df01fec9fe4fa6fa2f36e791f9e16b4092759016d2f9b1ae7c3d071c57edf26386aaead767a3109c12a5004c7b9fa595e6d592daaa2dd1df04\nA = 48a0ccd2d14e14e2aa862d306501efe5de239e8ef36ff6251c861a0aee9f739411f402491bd99aebacdc26c4f30306f9137ffe4579c2f13efa81b979ddfffcd23675ac6307c0aa3ba8ee77a2e3a3c8e241bd2ade6484e6ead32ce8d752fb3584d14688f223758c5cb8705cea9c56136b219d87f9904bb56be2ea1c9a035df33455206e6b7972cba32ca4c3db41991117d88da3521780fe65c4023\nB = 160120a35ae3edac3edbede9ff1c6f317d95481227d87785b7ee46cfb80fac9973e418244884caca3211a3f6cd3bb419cf70fbc22d82ba5ab98ad80e1f6c2cda753aaf7be78613ef25577107a47ad1ee3c3645db85c4d29bd77900e99e1f439cb23c6c68662c05322f94feffcd9e37d8665cde984387093a043447de590e7874e6acfa37ed302040df4d5c3dcdf9fed91b3d17ab5c141d4494d0f301b508\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 448c3a64958b82ccaaed3c74706ce0a48c5e059c3610cc03a6b5a03a7de5d4f1d1e4b08a31478fa8edd58401f0171697f0662146ce2b371e335d695f9e4a671255f29fc0b9b7d1b2eca4cc7f8357aa0920b5942e31bcfae84e909828fbe5d02251ddf10dbe4c15351f675e96e2eae6d044da1f0858ce8ba9b7aa146850b85d93\nA = 1b2a52aefe44170376df29d17ae2dc1501c9c296f72f271c21f53db71247e72c3eb2b780190c45343bcc8f548507559ced3bd4a6fb13f9174dbddf965b9c4a56c3d88727736d78be9db2268cd02382e50c6fa28ddaf8eab9f44ad45d5882a5100b3027c150a7f3bb36f29d24a76e40f3820ba116d645800459f06c20679321cf5be72450879462f0eac99ab6ff8d26b464cd0e6d78621c9263394c15\nB = -b7d9bd08d7d8e0e9596851b7e03c78973a502afcc7b5fe5b0db6034ebb8a11df1ef7ed0ae1371eb4111cefd61c61935d768be3e3755e481daced219874cdf0d07a76e7144be626cf1fc21c8a0e9db4389ee213193775e95d4d86741d8d8fc820c239b7a90937000dc3e89b2fcd61b44e1c38c655bb3d31aa7e422b4406c9e4a88e6a2c18ec7c048f4a6b5b270c90d9fb378f64be3b5b351621db48a6c18625\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2192157490ae044a26c23eea6da51d3a3dd08c7fb67a9beb76d37ee24ac0089863aa7f00849b81bab8259f3a0e1bc744d841e07aa413c286e4bef2ff3356bdbecee756026915894584b4fcef7e49da4012cd9fcb5dbe3f3b867cb6a7ee959a328b0fd56a9eac1f4e40a22bf0a30073cd2d48f99245ac03c373810c54eaf3306c\nA = -598eef47b40d1fa1ce260edc561bd1c1ab286a7e068af412ec2baaecd07c5b9cd596505ea1bf0370ea961c4ceeb9be76baec74e6952cb846f20e5da406bd01368b85d59569b403b7a305cd7448f331f10a34def43c738fd633df9a3eb194c32d53aeb567889927271d71d3929d43fb9338248b64f7d23cd1b053239e09cc2ccf5fe9c9ce240f1a10fb151a8583e4b4cbc70ec3082dd20a9962d564544e\nB = 559fc917de34bd7dd7a23a432142ed79e3ac4a6caa357eea21e423eb9af7fd94f1eca735d2588ec4c2ff013520c3a0e209627217cc69bd5a07ca46a43ec1f1bdbee5f09ceb1b2c18bd388d3852e51070943f16152a73da624be680c671057677356c6f281a4ba1f7c60609125d7fd9086c907ca5c191820d80e483886b70c1074e2963c49996ee92577334881edafd88270bb967da795aa4fefb739e4367390ae\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3488bf00f67b852592922fbae64fa56d2e4e7081678e789bbb3b4f48df62576d537da2e99c9bdd721c725b9a828194662bbd51ee20ba73d4ed5562482540880686d9fb1e8ae62d08e39fdbbab1d18e399ebf07b3a6559dda8b043fc25a8152858d39b10ff64776e00a839950e7a9ed5ea95b594b6e9e9d4348ceae08071ec5d9\nA = -1b135d8cec9969561be396323e2f8be0c60903ca59b6c418cb19876e9e3cdcb9ce4f5251eadea11fd6e785476c70822aebdc94617063d161ebe55584a8a774ab230b8228a2b65bd5a6c873bb6b261429eefdc7d0c64c7e78133e739efe57f835ad03ef8f84601e1a2310659db5e0ee706f23e3c5c38c9f8c36e5b15b654d1cc528f1dd392f1b08921af8be6fe4e4e6db774392441883ef867bc729338943b\nB = -34fb63435c90018e5843098e379c76ef3ba0615b6b500854b3dda3e77fc5646228fcf3a6e1cd87a506e4959ab05e24474990ad98ad0865942737734c03dc289307f1b1f424b9a8c2264350943449b3d2b0f71f989039131e23095d122ae98c0089a184dc530669e804140134e5b602861a5e61c030fc3d3b3eef0a59f8c0579fc9b0afceaf16698de3fa07c43231312254c04ab11ad7a29efc4597780c2cd1b64b43\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8ea5fcf7fd41803606c95729d2d910941e43b222f9b0c93a1a803b197fababbd653a92ee34e805906fde29b307a962a294aa4dabebf0d181c046653ad0fe6da1295eef817f3289dcc6579cee8869198c39a9f79992cf6894162d35d812df327a64470c935994aca4985d0e6a783b853ad762338dabd575ca71034e29d768d014\nA = 6858d029a62b0f75e4c59f3ec067e3990b2304c90a097daccaf554abec49a9d297ca14648471dba08f22ebbf8e238c89ea06f188203599aba56611eb3d4df09ea795a7e28f91f4a9a582c6b949c6ffc584a076de653446aff9b24e87202037974aede37aa9a121b5b70a3e9b5ca376c9056c2c91f5d5484baebb64cccb6a09b4f40529afad1ed64b4cc4aca586892693fb5f92edb6b4d5f678f7a2441e51410\nB = 197d6deff7adc30b025e7e418cca0a641e1a1b35f78fb56b9d8847f0690313475e6fbc6f73c3a718b10bf37434dd9fb1eca33a99bbba674195b20d35e3b34ba9d7c8438eede24ebb48e6d39eecd93fcd7dac44235ad32f208919f57b261da70ca378f9b03ae5e5a733f97f0b3f4102d971272015bf50b6f3e50c7b36cdaa14a8a580366c9cb0118ceec6e627827b0b8f614656292675ddb66e1c55355d5a1d78e69ed31\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a25db977e7a8fa4578fc530995335411432ced67e131fee2cd7ff56970df64a6f0f4a7d225d2f4ccec8e98273ec9a0f1aef01dc0b866e425d64e09cafb9ebe3f80bc0ad71c769f1ecd5efdb4a990ebd3a94303f52f4a97e3a1d615918f8b2df5321c4aa9339b4453d7a710a803106dd0ab49c6cd9aea431f97fea9fcae0bbd90\nA = 13f97ba15ce46ae32147a0aa4c1639b6b555f4d8a1af15ede4f1103f7a0b06b4625bf456d667720adca0c4e26e858f008b012fae63cd89322b33fe51e87714519e7dc3cceea27d968b46ebc04024d063b17901a7ae978591ca6ca41afffd81769f04b714134cfaa6700cf23bfda6ce67313988bba5fd3782bc62f76cf551d140c978dc002a779ae37400d34cbea013a5d1338b203ff267861edd88ab8ee1e4c4d8\nB = -88d8a4c8c680fb01f493f73753c70ee753951d4734627da14962e36449db5490b8c575729fafbd203a125b500b96364e6799d9cfcf0efb4ec877e86865eea5e99e2fe5e7655c1ee0eac641e73b71c66d7a72c2934d1ccfefcf59781035b2c7b89e5de3f7d1e9128cac57947d22e7577832ba374492a2f53be37e17733d8bc625fa77fa5cf093975049a5c477f792fe75e85da26cceec820c8b255df0292824b4c3a8ed455\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e03",
-    "59c99d4bdc901a4\n\nModMul = c1f2165a402fe9becea284dae60453965ce327f540bb8969562485fd1bb60372b8689d9c9c97c91bcfd699dc370117ea8b704f06cae3d972dc6e5eaac971597c69d4dc24a68b256f97229e643706aa6d2d844078a5fee2d08270820055ea58155d7bc754f09d0c6f804e55ebe53e3ec418747d4130cec68533f6f0c2f8fd2409\nA = -626a1580e52ba52a877cdcd62b34cbc7f949148671d4a61201e03e98985d704b2975b9a2d9c4557deae065becd662ce8448171ac582894bfa2c59d4ed20c6d0471fcad1d0fed1291df5e4556aba72f3645486580c8bfd0e3c8f6cb34fe17ccdd75fad4d4a2db4e00bb8c2a23ed17a31e95631320590f40416c153efdaf897e3b278a1faf1917554d9292f90c4edd5992748b58492289eecde1af34976ea8ff507fb9\nB = 44c336d7739118340048939d6c198f73f90e13030b69be286ef920902391d87a58df3632091d0ef25340eab395203e8dcf3389e95debb7432165147e145735d2e3226637b4b8cb7d85d68308be07f217f57fe439b31fddf3fd469869a20f1f852e1645b0d4903432ecd1fb6397db4c11f6b6b9c0fd25778b0ff00bab9ff576b16538a6b7da40f01fa7b987af8ead41ecb66b8940c0e8a1208d0026773e711153d99348e92303\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 98eaf476f11168bb63fddf7dbf3347e619f9b580ea6804ab893214e94ebc089cb652e307f1f37ea7ab9052a352e260ff7d1e8c17461bae68c52a8a8f1a57a84c79b2c8fcc2d504ac4f553d2534f2a776ca129ec1942d83c8ae24c772f6a8429bd61949ca1aa714cc3881ed731497b84415c88ad4b9be34197a549737edcfeac8\nA = -15897a5a986641fc2cda42d185d72aa1552eb92f788bb71cc74c0e424bd038e02c620d0686ff88ebdf0bc1632093c0d89e724e7d5b526b0ddc4c7e145aa90b36be0d8574901fdf286df84a6b52674a78cf21ae4865618b4347bd905461d878537b33cc41710ddb290964c48e44d4d2ce2ed82847de75938d23ed418bb9ff1caa03b5c1ac5d65692dd1defbc6013b3270c4314a45dc67883762fda5509b915e8277c1924\nB = -3a7141f54a0bcef68cbc3006166f7e15a5c2394892a428fa417a485981316a537cb3ec757d4a2473fdec2cd61010a9ff865852af8f43afc79a97d394bb6c58643858e2b4dc5cb958c33781b5c35aced7882e8b8d7b4e4249c2b82150adfb0c8f2bbb1cff3d2ea27ed24eae030ef468ae4d6b7462f0b072cd2a2f02426b3290b87b14d14b34e91a94c5bd69e9eda53335cdfa7df90a57f97f3d023ff85537fe0a8bc5d8fd7901722\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 34464b7a50713d17b01b5940b5acfaa7006aa6b9b083bc17e0535b08783761391eaca8703af2edbe13dd0fe9036d38aecfd9faae08c0861042ea1a25b41fa8a15b7721909783de3aca127e955e177987518dd010306a795bb66466fccd55bd9e2bde17470cbd36b1e8f8b63805229754387a5fb40f3ee9a8afb2e51e25c8bea\nA = 701ae8c5bafab7f41c999e492f04a7626b2b1054e6dce1b83002b2d3de46717225b018733b0fa8fe3f973202da8a090ae3fd14f48b27097513ecd4ceb1b9729e7783c17fee9be5221fce4ed3860275b3b36b7416594d2b65e198ff564e82301cae23756c878494e57b5ea8fd22ad800a582cae32fbc985d122cbc6e0eac77c1000d3ede45ae7aa087534adfdea8e9f924efa1b19c43dfd3b7bc83d7c40df7c6578a320a19\nB = 18e0256543619a750384d30b6a7afbbcbdcd9a2ce644dbfc97a8ff699e118032558f706502c9b956695cb25a46d7526596b3d0b67b69611009265838bec533a9488d24583e7d7f2284e23c3cc4ccc5920fc57e24f60da0d479d41f5b9c6ad9152903a4f37842176c6257fb1e3e0681d6d583e704c1d1b24cf616fe638106638fe9d79a0c74f0df67cb2df9d99185324ebb037d01ba0066ba947d5345cd3201b19769d438c43292f572\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bc57cbb3e1051d3a3035f77c2e375c7e3221dd472edb1a5ccaa7521849fc0ccc7568238aea9335a733d839e89ace6f2b66ef238267e0050c065c3d9553cf50cc5cd93d34fb43c3ea1c31b8ebf0b751f595a7e5e3e860b366229de4286b9d3f0267f78c6888ab3f208c55d9292079116ea0eb9f4ec2934c97149aa132c03336ea\nA = 1ffb0aac11f6d1d257ef7aa997a030e2a12b0615fb11ff04f344f6ecd550e8e77e9883c246e009af33a51204e4066ed4249950e022a61337848dae17c88317e15ade5b5499c0d7597a69a02b6c18db0f975c19c16d2167c583571e947676ae9c15be60e69d76e78329aed5fa57dc5e616795b5487f3d52bfe74b54bbf93ceda093c2e14104a6d2f017f0d200a9fc89deaa283e04b0bd9015ec67598425312868eeefeae9c996\nB = -9de2d82e25b449b8ca4b02b2d2fc0a023fc5804ea553aa84674a815bd74193a2e549070e2cfa0b90a53070646875282fdf855940905f834f5a07f073093c658cd1813fc5cd7092af592092d789ab5481bfb14b6683139646cff8eb1c5dcdb6a33113d1c97d4b587f15f972c06046730b7e712a8e3dd5f4bfd07cfae289047de31776f222d11510ab6b70a200ceeb6802d6c33f913c509b31b96e2b8dba9e25b0d2250c3b102d814683f1\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9f7f4e010370ec1d76fa83f73c80825c3b71521855fca5db06d7ed830c910d0430375bf319671f6a83bf6b57d9d53cfaaed5bc5d615c5690df0067b18791c33cb9f0ac9fa5f0473e4f4eb7840b0b660962097606b3de5744089ffb37d9c0df1123a91a5896d4deeab8aebec469b099a3a9a4f6d822030ec2fc4d11636706fd0d\nA = -7f56093243ec2399548ed95df79363e6ff09de211dfffc314b7cee526535def0f9a8eb9aa6f1736528ee7aae8be55c06645708d576111766ea33e0564c12103edd61ede3128a7a642f968eefd0d7f3768b1325c2dd910d459b15e54145a234225fd29932234e59d3ff5099ec4d5b5c6075f56382ade1101115c7b94e1e2a7bf075dec210fdaf2357c735416dd5d616335002d1cde6056bf7c478f810b78c661a3dbe6e54084bc9\nB = 4df1a6296428d06f51f31a1b0f66d0b77a04db3bb8e1b80d64da649899a1a55d4041bf0bb47d3e3936ee0f3740e1e8c2b235e1b8944d28c7d617d1f968abcde9dce10d6e3c27b2e3607d8df815f5a39da9b5569e95eee1fe5532c0a80011e7415800d8a9ec175fb1d13dad959becf04964b70dabde6d37072dc9f6d914309b850cda33a565515dd6c0181fc48bc7033b314ae0bd5872480e02ffc08dac4e3030d83b33488cf149e19b0021b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6da5fcea305cc6eb47fb17190889e6a39c339da1bea2d7c95e997fc538b4aeec8b0edf7c109faad7fb6c656420f4afa104ada7a0d3d14d3ef0fc6774b59aa2687c0b4efe7c3fc83194a89c832f7168346cadc2b1fa6fa9a23a67c91ad731b4cfb9943738c7f9951945b2eabb3743473d9c0444ade756291f53fc7641501597a2\nA = -19dfb98f9f7d20fd331ea749d2019d8367935fb75ecde45d6dabc815ab9e593e51178a72816f85aa678304e6ff3a2c24079a59aca253d76c4ac633fea1070753ce770765bce47428f8f5ae40c26a3ac91ddb551b3d575bad9a3b6fc7954acc93aad2131b78fd212fb0db7cca4195b41651a5311bbd4d8c64f1c93e6520eef8e6308e98caa1cd0d3c9b4041182cbfa131c4948257f1200b1c5351bee77ac8bc8e44680ce64ed0648f3\nB = -2736d5038c60553927f389c0650bb1355b0ce745a7dc5f52c9909039465344af910a5f6a9cc4ec130b9877c1cbb52fc08b20d672e42b853d26a02bc07eabb9e3f91399db8465b6a8b1c9f4a4b9eeeec6e9b6180f1a770c139c8f29ceced61cc7ba182884ae01d14dd85bc924391333e8ef039b586b6a0ae18db3570aa560c2b0226d5e23e7e753873637c25aeb19e74997da4f5d0755571785bebbc7dade57446e0df4cdb8df23c1003533f60a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c0265805aa8ab52da5aec06ef7cad2026fa0b18edb27b4903e3c068ca6464465e34d3f3bdb4bcc10a19441040deaf5569645f7e09b36c56631b3a6144d6206d39c9bcac53b54210db6d484cd6a2780bc68c07272de03a9bba7e51c9d86cc8883cd2e1864a2ed711d505930143c883c57545e9c40851c6df8b3314a8c9a0d201c\nA = 5622f906b077d243521325be82a43fce321412bdab1f15e4ff0c11a7066a288b7939afc01d30243c8a4150e74286611ac1ca4daf457aa23508a7af869d2d55f54f2746afaec477cd7df0d5711dd636802ae7f673b3f730236ac3899330f89cb71d48c2838322fe856d9d8b4053d9c1e66acdb5e43614ecff954dbe37c5269d7ffe00b34e682c0be3d7cf653ef212daa3d55dff92b329126636e440b0bab55f4810a2849f77c39ebb93e\nB = 1ebe0d1800b1fcfb67d7d54568e45dc604450c1dbe103ee21d48dda300c1d9b9415dcd9f5a56cf12c2ede3c862e895efb83621435377387b29b882b2acac78386895c7daa90810092bd3062a3a4867f92d54622d7f0b89b40fabc4709fd507d4002ca80de231596630c234fa418611ede0ae4a9616d570232c1b03329bad02220ef64e455c164aadc16190ce35b78060a6b117b4b0641fa64dd8e8",
-    "cddb5914e7657573804e63dc7b216b1a9aa175c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 606d2b6f756548568013bdaba6e811dbae88fb01f5f36d30d15dc1e099d86bdca9fc1eb3a785034ea14cb7f4776586327d57ca5a52ea1b30f26e2a76140bbb0e930c7780673770fe22c5ed443c349510e1494ebe402f2621b1e6bde39b8691edbe5c7242efaa6634553e6af146dd40666edf4a3db5d1e7f9347fa1189c1e5168\nA = 14ea5e6fd612945c71fdb17ec44d95015773edc908a85a6645a8eb823d11226545d05b81791401cefc81ce9765eacea7a619cb482f29d38988d355ce731bc9009969b7487a3acca2d2065c1faadc5d6dd8ca1dcd3f3d4ff61d0a75ef75272e62193618f6b802f70795041de26d6ce367ba996dfb91167cb1fa16c8977f982e1718de7d60275a7f66e4ad72ee55ea06267cc4e8b08f488579825cc674b0bdfd34a01bed08b62004fda15b7c\nB = -8a542280f6c8bf4d9fbc96d5bfa6ee0d16a09dffdcbfeaa2dfa1097a760dec7bc540a0b5b2020bab1eaa594117a40a9bb99c3f16fc340c262b29909608740b8e77fe4706a88dc0fc3bcd47998e88fa02f617062393978ac1bfe14235d43f3d5edbdfb9f140412f4fc2dfc05a700f47b1f0f90da7ae07ae781d9ccdbb951f19a8b8a9a7dd8a65942842cf207f3baed3a0b2f08a06ad0d9ab7ad0110346293d51ec53ff8165b925c0e7906be8b7303252\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 512220042f151479a6a8b7c743ba83366cb7733caf37164e9c823422ccbf78b0b83f426a7230f559d50bb0ed3d9486c6a6e25f4cf96c4fdcb2c861566c6a73215b6d08995a14569710cf9e54abded1d77fc7722d06fda4557a3a99862e5ce963e1be25336fb42a4629391cde3aacd47ea5f5426e7185c5df27d9136a6df26f54\nA = -4d108217b778694931088bc255d1f69cf8f5a14252156163f948ae58d58f2ed54f518177d668e795474952c930052c1bcfcae11bcd15af168ec2e881e6ddc8de257d0cff90ff3ad409bb3a080d30fdfda99078cc3ad8302a4bdd77de66ac082b40fddb3cb36c75a86bacaf60984a74a0fd575d751ed2830650d85844aba9e3f781b2dc6b515bdb8d9459b083e1aa653ef177de76282e86c99e97dae9c0b050c9e6456a051e7d99adad7be4e4\nB = 7b9079504c635655a588ac360955fceb10cdea5f3de548ca2db681da38c17a70df5798f72cf18691d14a5f400ac69fbb47e64115cf071466c54bc7077a228249209542683ba57791352ef3409f6a947865d8f234ea9d39491b5c001685487b32130bce9aeade97d9537afe3f2f87e8f3315619ef7f215a73cb724f1adca99b90912aeecdc81485c0d00a74387ea99c965118fc6a9af1163e60d1ee6a1eeb12d7c2bb9a54f747a415beb5873d616fa0eafa\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = e36899d83a143c82e19e11494ba18478c0a9497fc89fd83df38adcb6b33918645a416626409a156899c6583ab9a4426438d9c32cac54b78df579cb7b6b1feb3f39ca4a6183743a4b823082896a89f9f1722be842cb2d2ceb605f84a9f9b61cdc7e184593fc2f9ff2994fe6cc4860d255809d04ab47e154eaec9ecc807ceb298\nA = -1422272d9e91a14b38b3e81cbd9411a0cafca23addf4f33c94a1bca70603db879dd8a9c0b95f5986bcb447731219c4f9b32a1e3253b027b7963ce40279dbf4008e526adc0bd7bcb2b533392a105c6e8e1bddfdd2bde7dfa0d2e3b1c6ffa07fea07ecdb9fc828283e93b0ce4861945562478b1a56de32251b7d31f9a2309488f7cbdcc38cd6b1c951570675ef0d61e1df69fed78979dc755f160d93ab5a3e65dc2944d3333cb85aaf87a153a90fa\nB = -2424fc1e71286ce3be684a10dd885e4891b52e9009c3021d90ebcaf68b6db81130bdbb74869cbf142e0f44ae72684fc12c85abb5157987428c7812889beecfd7bb43fcac2eb6298ebf1dbcd2e70e4274841c2703b8685df18f6e5bbaa1422004797defc6ba843e77f891bbb46699a863bc1d77c5e3cab809c247e2975e8170da00fd9c8b232abc3fc6b16951ac4e6c96f9503c1ff2d6832ff9c35b2c8aa408645849c577d2b8599ef520da57fe2a9eccfcba6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4e8a59476d47ee2cd0217bae2981cf25a2c38e5f5d5c30c2d8bf95856a6e8f42429e565f1836365e550d85207246514624e7ed932d6f5802a50ff9f15d500dd84b27729c1717a3df0f2d6dfd40f0094208445193ba6500ba03fa3f4bdeaf9251aace8729b32ec3215bcfa170575e26265fe523cf44a071470e3b1547901e9227\nA = 452cfc78cb9597e67aacd4ec83e5b473ab8b7a1dcb6097fab37e25d5a6e25c69c73a6c20de0e2a744375bbfe7f612036e69c7a503255d9e17c6ec1dc6cc6f634d4c79bed4764496e5c7c026fdf9408242d3b234195e67a5681e7d7b861f58eb631ddb9aeeb0e5b3ff7a7657a7fde5975b8a9e1f643893bac47debf7918c7ef8f6d7439320dccaf63b80ec9761559078baa8e35d98fb9dc242ba83536eef7ba9901395ef02b19990d8312203df7dc1\nB = 1dc222e7a737e6d97a703fa232defc6c0a4fb2bafd247c8e547b9c474421cacb7692ec98f94be19a5e40269e1f5713d06a6d081a943dbc667bc867e481b99c55e437061cd44c4482649faf870d9347e0252ba9dbe116fb4992dc2c2a0583c1351e9e01e71e9324f5fa942322485bca93c2d95cf304028e68224fed446966073ec7326c93ae326a7a533a36e053437910418bf1761abd9c4c5ab7e6f538e9bf963903e6c80f21a0a38a683e8166e4626a8d8b743f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a4d5e9fb7f0d75ce41ffecacd2ee1e4d15f82dfd4decf5ab1bee75fb97792d0d574fee60a30b15af80bd38e6a25b1821e61628dbe456e39fea3f8a9ee6ef3d2332412be1500fada0c1728a1457656eb3e9d94c64fb2d0ac89f10f2b9ff57d73207274ae7e8c7538936cb7241615b830cc9011d4363ef88f51c7b3ed503c25179\nA = 13eeef030b3110451fcb1a258434aeb51d3dc805b38c72ef7c79d4b0e18d600e5dd28b552b59f3dda1898367ec7da5dc6d9089a585cf52002eaf8f9ec64b8d3ec50d0bef7dc3faf203c48583ec89757cfeaf888ec4a91470a6b8ec9f26a6b07f3311b4fe972cac2f2ffe47f5c11d2dca87c62680e2229120cba4de9cfce9f7f5c33af8398c07ffabac1675de1845e05a32536329647214e54e5d9216fc0cbf2730898eae19e425688bf184d16bd1d655\nB = -ea324da99252edb03f40100e528d9a5080c43be97fe4b7e03d9563ba48040d328e57d0defd4b7ffa9bef3ca0d2682aefd2a0ffca8566e755b11f2e3c6c1b707f1b9465592aba6181e583babd5c70588e7123361a8ae77d8c398e33f894ee288babea1d7eb63e2f3de469e502b5048417043c5a9a9a3eb921cea1533162e3ce9c79e6caf62bbe7e17b180b72c59b9ef5fe1a001b733d909a8278029fb4a63077ef9b3545f1159ad73dd75030aad599ea4884677e01f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2f096fb8fe2156c41ab695956f13f0fd9a084f87ea5f5b1acb6b60c62617b8d7079f4b072223ba18cde474af3942599fe070ddb0ac1a99f42b9506a2648e1b8f6106015aba0bf7a824842403bd3f4ac8b6fc4a9861bf0e8ac59be0322f0495e4b515fd579dfef273160ddf96e453f4ab663e703609c709fb1f016ca919fb26c\nA = -4212bf679cc00adb2ca502604b71dd5dab99cdfaf55ae92aee6bcf8b3b6354a384656c09eec6175a95c8cb4591ce118e783d6344525c25e5b356e45802ea3ce1fe764833132e6b7bec434e4481c9cc2986904988bd8da7dc2e31cdc481fd0e359674bbff524124bab1ba4379885a6cfc1b73d953e6d1aa1b938129d74fac9dc597c31383f2f7e02fd995f7065290a9812ba8e205316ad5bac6fc65c6c7310f1a6b033503ebfe85bf6d3851bea1b65b9c15\nB = 7ad83f97f40d5be508cb394c128764532f0aee9a108eb02840ca1c635860b6d751d5f676e8670e2f61466397e1bc68f97ea52d64b335d07aed22f20bb1ed19e3e42e4205d650e6d37714c2f80d39b111577725e3bc7ce75bd7ed5e44f8377d5fc2b97f05c3c1ed5ca1ec90ba3ff7935a25a8acbcb15fe1fc7aeaa1e444cc2f06c1e6711721d24b8969d465e4958cb87924b3e0fe99ccb371009b5b15747bf6dd5d0fb73b8fdf58d955c8773a55424a34c741406f6f904\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 909626a69c803e9acdca97c56781eb672d6fb31430a53b853f467ca26d4ae96c182d71c0212894b776c88e773acbe9602e3ca56584c39b5947724290def7dbf04c6853a108c1282def95dbd5bdc015b68daeea0ee959b35bc5af98a4ae4cc7486e627bc9432bd009b21ee9af3085f074a3ae1bca879e321018e991e7898f2897\nA = -14eb8e28dd04a159c576eb10578c24fad9eedd3d8b7560b681002a54a4bce2167de05cd061338f63c50b86327a79595a2dbfc1d3f4e76aabaf88cfedb69faf5148c61f8cfb2130511a3bf4",
-    "a17d846ededd4c08f3b635182dff1854e8c4c48007af028e06f01235fc2becdb32adcb9e2058dcf8f8655624bed9915faa06be972282cfbf8530bc0cf2de5b2057df32e4a6cbc3c772feea0a511cfe3408a6dab0e2714fc4cf15602ba0da03bf0016f1f3f5ddfe1\nB = -388da160568aef9f82fc16f48a22e8d7aeac99121cfac9b748c815e5d3a823b673ddcd20c1168f98ba204df5e52535f61b224fc0374092f8c834321949fa0a812b5e65c492fd9fe8246b74143a943bcdbeba16024e311d673357a3dd3eaef9ae3a72bb06e03e34e091cbe5b6a9eb9fa3d7f36c03baa5c3e242f2c186b58db5dddbd73f6aa54aae027529b8f8f0a536b9b283ab08247b9977a2ac2d0d9f162ad03a2fe247d2c589b1a2d14b5f90d5b9c0a95918ea956e261b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 128e8844a2f04704a4a60cd33e85cb7ad373ff683abd167894a35a1daf947f504c0abd7a614e293ce10797a5330147c88c4d5e1dad1bdbeaf74095e3f5a515f2af68b7bc11ee1f53b493133905b654318dcfe73118ef1931eac47deb6c4958406b704ce027d9b027803eb8e639b52d5983094b8ff4b54e86a7dc6ea169ff1af4\nA = 75e6b045aa44dd9b8f4b434dd4bb1346fcf558a5e96b00fef9b6cfaca72fe8b1672edc2a64beee8b959683b1861138b297629b44a0caec6bad2ac05665728379cffaf66a129f0ba40aab7c6b1c3fbdabaabc87ed3dd580ba80ec7ee765e9a8fbe845c0d207eee7a1a3a0c39650c75ccb6bcdae2e0d5149991dc3bf899ae9b7626a2baa17b168b260d82fba84a12f10e09234035e08b730cfc230f0d2651c03e34d4952fca6409b5c6ea5d8791c90466bdc4adf2\nB = 102fc193633b0e60a48dcc17aa76f3e52cbbd1012f179736a0ba7a102f8dfadaf434063b0ed1b1528a018b349eaf192fe62f868b538cddd7e8e6fd98b93147727d58561517b2836e4a373bb31fc8d5e42d16126ed80b880c1a37940c138fc1f7255ee0b7fd39b1b799c34e5178580cdc076ef3fbff65fdff7497398fb1cac75e5c09cc7df1168a20f88a16e7b3ac78091a90f1169bccd48c0d06b4707ab79b741a168deae5ced5d48bb5f5dd3f465e43c82b9db7edab24569b2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9aa9699d1e5d2c6acb21e31890c1899f30a925b834adb5b8bc8cce83a1718944a2c90faa71b34379a21340457478c0c43121dbd65d62e290eda2ba6230bce4e6f18555a1380c7c95c1700793157f7c1cbabeb09460ca28dc596bb17851ab2ba6dc6bf311ea69bdb7fa8eb78df74adf171d4677a154b8536f8104d919bdd58648\nA = 157fb9e1b38f288db78a1a0e22fdd9f48a59779487a9ada2774a094d34536b85993e7b9ab6e24f081c4cdfb64a82271100a054169e4f1c24e3957ae9aa8300e85eb2a45a6d5987eed4f0fba6fe8557cbf6128e018c5f9df028131bbba6c544b2c6312aeddc71405f0e4ce648fbab9e5d51685949408e4ccbe06fe501a36fc13ee65c31f062313135054b7679eef45964c77f5a1556ac09b11c496d0ba8c6057e283bdaebb4e6d9e5c557d975745f9f98a288d5bbe4\nB = -82cb6334479bd997c771e894cac1ead87dcbaf8f5006be5c70ad48ef94303137bdc45f261af91a201b276a17d884a56ff27af7dc06cc5b7b9c94f7c4d4a36f68f8d309c477b4969a6e7cd1b2afab9deec06555cb753d8a0eb00965359ef865a84bfa87b815a42b2050e1635d5ae5e3743c007bd79e820aa37a968702a960fafbddecebe63f022553cadd7a4d4fb27b4dcb981e8b490e80bbbf13af8c4412d158775db71f5fbc9986e7b8a8f9299574abf7bdf9ce7544e8c4e85bc\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 46e401989fbcde9d830dc6e3c42768999f153d44d270d4805c5beefb470bc1e82706aa7173b359763c5e15d146eca91a32a36f0a80802871933cc7f2ed15a5472988849a2d2f57543345b531538db57ab9bcbfbe787efb0a82e61baa505aad628df5f9e881dababb35bc2decff267eaed3d3671757ae1764ec5163b792b4db3a\nA = -590c16ea2cf7fa7f63b5cf74804333f22fd2d0e1da7d226da8425abad2b39a4672fcebcf5cc15d220b0ecfeec09665e682fff0140f16889f7a6ade9ec11aae3fa3a369b3fc133babe52e42b7a8bb9a24777521f4d9e0efe7d7977dced9e40784c24d2c6056b3b668ada7856da71af73d2dd33d2e481ddf40999d86a6e236d0d73f31a67c52cc8b38203bb2840c0b92c2612ffe5fdb6be87f9a787d70b3dd506f9a63d144db3417495f0a48523c812d14a89710d95bc6\nB = 5a2865cf2254710a1a51ee3056b0c1f6c5f77d22d7aa8f939e6f48ecec529a169e630c554bbe682a8c4de9ce4daca77a278d7e752cb678141ddefa75ba42e661885a82ab55d699414ffeb75802cb8f4e7583bec8a7ab58803b378bb60fd46f476ea490c9aaba568ec17f3a6afdd6f20ec54a512f7aaf62d2f941e35b4b72dea77095e863dcb38bcaf8777707c1dd437ef2ac6b6a8b2b832f80ad2a6d6f279c053d02058b1a657a1cf5b6b269e15d29087b0cfc0c2d4c3fbf32a167a3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1c9649f4540556ae82ffd71b2c71ea8588aeb845c50dab595db9f8faa01a26c809d30d8433b6c0add465e164cda2b6723c942ee87241eb7baf9944cae08babd8e22a0eaf35c09e9efdfb9f8bfa65d53ee6eb23fcbe1d12a66ae05e7592ed788b231b000f895d098a24febcfa4372d249575926a5faf966072f29a62a401ec51c\nA = -1bc9ae5fc2f6a3f1274584bac1e145f02c5e8c4779f4df15e98dd34344c988c1437ee4428485a09090d81b18606a6ea5c1b9136872ab5b37373fbffbb5b3fa8fbeca1e112b9f1643658c2f38b9548cd8f0f271779ce0acad403177057ea0a2af2e7435109879941fbf463488a2522b831b95c1cff21d2d816d70c25156369dbcf04a0e28e1d746afb8a77713703fefa512816fe73e203bb4c3428efe09b946b750199bd7a03d30feb90230c219a103ad4528cbe0de1e5f6\nB = -39cae179d955049f830867d4115d3bae25127c945b1fa0c16fa850e8fd77c1b3b9b7916b9983c1659b7cee77b7dc72abfff1c56681b7931c5e58cfe4f1bf0168ae32df0df8f652223885717a98f858a497b1a4be62a2215c39316c34451b0d957791f49139921d9ac8041899b8fdd5d3d443547a26ddf5748147e4c3e93f5043ede42f38a9baa628df65d3d6148ac2ce182056700f0f94029be05d3ea3a218b40f65a87b4baf097fce107c080de24880259f1046175db1297016af76d94\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c\nA = 71b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905\nB = 167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d\nA = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5\nB = -bfee56cd412318cd62e7b6cc49217345d3a94e7fbf6fa19053fa685efbc0f8b320b7e43883189396781c49371dffe7d126c032d1ae4b6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf\nA = -7bc53f6f2e78628678ebc8e35ae4905caeec61acca5c64fdf595689cf005bde2265cd43172802fc133dafd933d7b48def44256868d202727a4aa6c0cde66\nB = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a234",
-    "49e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 43c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21\nA = -1e6ce0b44105047d0da0eca7b936980267db41d41319dd5315889fe8fa2329023d7cf54f71ee179b5bfedf442cdad1920d311966f7175cbb953bb42ee105393\nB = -23a330c7e06cdef4b6b121d15a9c0bc774eb5e432e72d04c5f03a0c588e55e010b61f57c03c51edb1211685d8dfd2a35393091fd0e3ad2304fb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a\nA = 6bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152\nB = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d\nA = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e\nB = -de60cd639044e863c6a49c73213dbc2ca84e4225aefa5f880e829f2d9cb48ae92e3f2680c462ac697dc34da38f65fcdc1b4d8c3c99e8cbe29660b539\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d\nA = -50ff3e00feeb2efc6df6387d6409a622b7a8297a717b8d94d0dc41c6ec6f29a8455c3580019349660b31dea1e4f66b74147de93535e671c853b604ba06a9b62d34646c\nB = 49ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4\nA = -167ee0fa8e5d8b569d7848b068df06f6baed80f6fa6a442f9d11d9712622b512249b92c7ccb821ac751fe4ec0a7a47e04ea5571c7cb45a7985749ecdd87f0c0faea01d232\nB = -2207fd8dbf2b8e9a5e3cc515479cde241dd3671803f9fbf7859459ac66705be055fa759c85631ed2a61139657eee7eb08fd963b49e33666e60b7e75dd26b5d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761\nA = 413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a\nB = 1b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327\nA = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82\nB = -d7b7701340c5a358455ca5fa314ad83860d9f765978ff652d7f542de2e123bb976930b8fe84b9608648324450d8ed2bac4e44f2fc71711ae813cd8793af8d3796e8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010\nA = -4f1568c207a9ec970b5c26f068f3cc8019e8cb483525d251cd2919b368d072ac8f40017a19fc7437cf88e927c9e7d6f539ee84865f0af24be0d6d98fb33d74e3e0d28020c00bcd61\nB = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89\nA = -1fd1f634685eb1470dd9080529a891253a28a0b31e15c662733e20d43fc4cd71f4cfe83c3774adf8293a0fc3bd806d0b31b61c6ed0b4414ccdb91e2994e22797e5771c63defcc0887f1\nB = -3ec0478afdf54c949a097ca411be41f931acb750ef4f0ce97d0f0fc77cf15970cfbe24b170aa332de04836b7a0e6c5d456814182d27c8310d5fb662a818bc421587d95fc5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af196f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14\nA = 572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f\nB = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97",
-    "f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe\nA = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9\nB = -95ab2c47f85001aa852d6999f29644a6a55f9e4e12bf905f911f90d29cd1e4fa4fc9d1a2aa6c215bcb5c5643561499aab8f2678fdc5fa9c6ec138aeb2d62f635c45f239e46b0fa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5\nA = -78a6a6ef40e443c52036e75f0b35938d632bd45aebf45a1fff5c2e1b6f601a57382b9a82c3e8b2984e643eb1570cd83f3a6be6daac567ddf9f37bd96785662bc3cfee6f47503d239c77781a8df\nB = 4920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f\nA = -143d843e3b12431fa0d873815a757a214cf731c298db61ab13cb87fe78b0a6184bd1fdcfec0c7661b10775b4ee2c815dede0ed497977c9ec5154f7b24a8a786501ddb8dd257bea51b9fd9401ff760\nB = -25d4da7b64f439987eacbde66abadf0da7c1653c1c1c6d9b2092351fbc714a20d2d7ad8093209da371150b69b3602480595533ecc1f3c5005a8ead10732272246d8cdfbab87c49e65223\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a\nA = 402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207\nB = 1648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd\nA = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6\nB = -851a39d8b0101fdb22ea9e367286e572dd132b8a77a6a14dd0e995131467aee898230f37dc6224e35bed2eaf459aae579181a161450bd7ebe6b62ea7154a8a0ab590ca4a6c2f05531c4e24650\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde\nA = -511565611538828ff7dbc45c273fe46f4f5105d41ccf5dd343b41e9dc579429e56a9cefc54657ef0422960d1375b72411a5cc93ffa323455e006e242580358d6cfb641f46b9c36fa777a613b17dd4a187454\nB = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8\nA = -170cc62ad57094d307ce1b317ae5e825c2f2e317ad6060437afa105501caea00dc9a86af8729e2f3c3a854387dc3ba368c0a84aab1a527ab34fe27b0a69bc71c728cca87be728457c65eea7d7538ef3aa282615\nB = -3d9da1377a88f647de57ade46dc7caf71b4f42bbfaa5e77f16cfcc90f00b5d3e9e9d82355104c7cd0db4c1dac0496be3aa35706cfc0a30a1329755faa439694e8e9b41fba8f1ebb46140818c7008e27\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a\nA = 4f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013\nB = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9\nA = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d\nB = -94b683326e9de19e414f653aeb2cb4bd7b17e76a23de6a4d91c43d717a35e08f2155b444a9549dfd01a8aec4dc901ea9f629f16bafd2c84828b12d2f63dc154323eb2d54938895ec4c9efbcaaede274fd4ab\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f\nA = -469f61cbff01f0e4124ba69a860ec6dbc75cd758dd8ac7cbfed97645b16488a329adee62d1a66e90ee4212569d56d58b61676262f49dcb68296bbe5d8e23853e3fefe8a304710cea568ca65c183531a992ec5b4d82e226\nB = 4a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721\nM = 8e2ba940fc5165c6c5f7f4",
-    "cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24\nA = -122621d97f42b65b060c84df3f0c0da097b5e240731b77a37bb9471e7e398b242db6f1b5e25062a9bed702860ccf6aaf386c1d6fcf60fc31b8c190d3486949c5772b9e621b863a7cbf29449ddd68b7e0c21e669492e58e94a\nB = -33978406dd30ec2b192c416e422428683deac210017cac9e4355e8446d6969295b0fbaa8cabc92c1fc0068da70efa047f938a419bac160ed6f794a9f69f53a88648c9725610d5f309b652f5462bd3011cf68ea859b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0\nA = 7b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e\nB = 156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23\nA = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928\nB = -e08372fc766eba6e0ef55a9149d700b503e2e3f978c8a397912e2735d5bcff69c461561ac0822c44160c7c1bbf722df421b74beada57462ac54a9bdcdb42d6a27b86413036ed2282abf62800fb2518a32a4a135bc948053\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9\nA = -5d3568858c05a15bc9777af949eb01d33dfdba58439fb3f7af2ba792efe8e78b16d7fbc2a303a4c4c4be7c9d43f57405e88be54d6ab55268a4739945ef582921d2877019659dadbc76e0939f4b2cfbc91e5356ba2ed531526ed5b9b3\nB = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f\nA = -175011349a0a1ceba11756bd528f2bd631c106e709aab223032d08d52d7d6724e8c5b055b6f97b48261f4860eae297badc1214cdae9b2500a7a47b4b777dd7b8f1006757754ff1143b637d2a3adc555f38eafbd5478cde0b04e5f46d3f0\nB = -2aa7f75d6801b04ea9f690aa0c5448906595fd28b53775059c01efe54b463f1d87c9fb4b39cb038e770f99bb995a2118b86ff8d004bd964e958c2af82becf362fb0b927c671cc3bd7185990419d26a827a2d81bbc0126e1029556\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65\nA = 58e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807\nB = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308\nA = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983\nB = -87871b2058d33cb67d83b6a56ab27839c6a6c771bd94e55f200a1257f2c737e39c4a0403fa410ea64e8f442d300df1c19c2f03d07fb74d94f86d26814fca23d4cd2cd3718252cf0cd8a0e36726f6e68827a1dab6bbb1d23b884381c702\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa\nA = -4ee01518f6581c560a186fa05c6f4bc26809c4822cc74a0bb74d5a6b0a368aa9bd0108f26113443422b8c589084ad49f919a9e7821d99127bb210670e732b7cdf610e464e300a39d3dfa7c82f90cf00ce329bc6763d7b1d4224a020095112fefa7\nB = 72dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f\nA = -17b3e0c9288be15fda58c8fd228216bc466731d631218a7ddf1d2c9cc858c0219cb0757d3b680bca1b1964eb15031b5b9d761a8bcbd160db89be339067a2ea35e1ac3cfed701912a17ef9ea03999d92e3592e893183ddc05cbb98a656983b54590c72\nB = -269f96a4634eb37cf8a6608408128587ba45958405a29827d0d03d34816fcb1a2297f1319485439d3e8594532545086efbe4d21d31d30e2daf09b74fa8cb27df54e8f9f993630cd9a292c977eee70887158bd3fa3cfef321ef900a0598ac8cea\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6e",
-    "ff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173\nA = 7906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df\nB = 1479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848\nA = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40\nB = -cc5349a9c5280a933e87ca38ce458a711c71ffebb40bb1f7612b42b4684afc495e99c4a5f32eef1c9564c2b7612ea4cda7a0f5df6b3ec9026447dc565ca08563d46aec7ced9fc4cc5645960210d44cdc3944149051d569c9295dc50862f8f6d1f6cd1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146\nA = -5c3d24fdb193ed83f5f6a825c1716f98e3cde6b32e09659f253ca3fd2a39402b5bc3a6497ed7bc908838e93422559a13cf59156254bd3fe1e3b8600b2a777943cdb39b9d42c58043f1d587424425d3ef5f5538ea157112970ce3e09a87fbb5f7c96f1b5e65fa\nB = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02\nA = -1be86e7c87827922d2e8a06e3cd6b64ac9a280c525749bcdbfac4856916321a964c9346d17465378251e6eada42dadf38bc9d7d87367bec94ebdc21af6b1302e520db08a64ba6b39920683725ef02b011a3e4ba46ef0eefadb98582cb911d0cbeae9c231b5e432c\nB = -352059faf97b433089a688c702b97adefd0c91d51a0395647f822c6762fee3287693e302fc5a5584a12c048dea1a320cb96fa70b5daff7c2ea21d249467d14c6bbee15a1e94c030e908342a939fbe8ae0de58cb6d6eae7758485e392ff6d5d64465b701692c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c\nA = 65e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7\nB = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343\nA = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd\nB = -afd61df72361260484fade8b432713eb740df83a401d73492883a5139c918d5c911ff5dc00140637da1c6acfbab4b0bc8fc1f337243d90beeb1c2a083ad8069494c73a99372bd38712a5b5393c779ec1915e878600e0b48157bea44ca8e97c6099c4ab07fbda57d1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35\nA = -47c5755ca61ca8b7ea927f6fbe347f1362915548ab38c40f0418f4c9ba4ad520c3b2469d9ba3976669dec0b278461bae80eda53e9d11447512963e797f45460f74678acdd69fb9efe3897913b6568f8e03a6d90b4cb5bfb06af132bf118574b70e6bd2f6d6cb4d0089379d\nB = 5bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a\nA = -1d68bddd8c3e6b78daa0acfc63a6f39e97f19527a43f6cdec47568d57b47f4e4b7ee88e4a28d683b569e406ecd2510351dba25f10b9f7c82d6da16d848bb970cedf7675e67937921bd334eec4bc8fde83d67aca57eec804ce22bb342167602fbff452d5f0f2a7f38b576e1e50\nB = -34d219765916a4c8ec843ebee9a7aa1162974d41cb4d6b60532513608452da9993749455d9701af6b7b6c7454d7f2fd5c344cc938baa5259301d4b56ae8d25b6f6510ae6bca114cae6791fa5a9551e8a405f5b1c0bbfc27138563b2d64f9a4d7a8f42a23bfacc3f1ec9393\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff\nA = 773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a",
-    "64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a\nB = 13d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7\nA = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967\nB = -9711e5b3965654bd9427f79c89a0b3f3cdec1c857f4451eec236c1f221bb6773e5dcc30e7381a18a813ac2b03ff4a4ba679aad41e0e5d7181d4627f682ca2dc8af9a8b4f878771446fb225a979ef9c7e641cac819c307c8dc50d9c1ebadf912ec7c844e416f95b546cf09391f9f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453\nA = -75231ed37f1dfa4487c9fc79a6f7b36929fdca086e42ed41f79430b2dff521919236fe415ccce590e1d3b986e16dda866f3f0d29ac1adcf55d87fa5cb67dbf4693293188516e360bac513303769c42181483fbef7abcbc4fea1310c916396d29f37d9058a62aead94511aded7c4b8de8\nB = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c\nA = -1bc03897b02d1edb633e2c019e40c20c1d89a210b0733412aab675563fae8bd75dd7e65988cd8df4d9b343586e27f548becdde274f62dd421679554ed9eb127e527a69d69fa8b17aac0424dfa2a7692d1e63617ea45564b55f01a70325bca050862d583cdad96c4a2e123d0ed827348a745\nB = -3d5239dbe7bb3dcfd8027204eccf5e9444e68d322a0b0c535a203a1d0c054e7dc1e588bacb891388241462a5d2b43e6cce34ce46a23e6ef29670603d31001374dfa347dfcc794988e58945d0d2d17da6565cfea559203dec119fc357d396f65b296deb07686b0ad2d25a13fd4fad88d2c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149\nA = 4a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261\nB = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656\nA = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228\nB = -a7cbbb6a434e4b022d312ecd4a45fc7fc4d3aaca038cca0fc56e529fe7119ccdddc8e76d51a2fb862ad3d27a16ec8a51e5f66b9c7fdfbddcd05a0ddea14172339cee340c8c651eb653c6aab6551c99ae94f26116e15dc62f2c2e63305bbf84590fba1327ee721150d46464d7e22d45d53ffd44\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e\nA = -4df3899b40d51c83dacb442fb143835bcdb550136921df78800f0515a6cee77fe3236dadd2a0800b79ebdaaf8cf4aba5ebb60cdff3e4b4531ecd0903c1674a4559339123e9f09158080fc53c4c6ae72c961c8da2f357b7c05368157b4956e592c41b25642457651abfecb4fed5d9fc1fc3825b772d\nB = 450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e\nA = -143caf995b7783b1316b5551978727f06512fe114b419c735b3381ec351275fb7fbd6ca88b848c3e8c9faedebd6d084cb8a231636f68f6803d14bafd90534609d4a4ac0fb953417be7fee4e4cfefa452c5ee5d1e1b97ee75f83cca8691a0efeaa8bcc1f1e0f18c0c5d6c7684c9da6c9495d31a32f40a5\nB = -3025fa05c55826c40089b12741b7d406f748cabf692bb0227519a124653160142633700e3c0676000943556f97551171d231c1a35f7b7d8f96b0366eb74942466ceb4660f09aecb2fb2ac050ef699eb05bd8834a2ba959ac71550b5c026b9093c8cbbb7c5fb9390a7818db682b7c11e58996c9d0add5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb\nA = 499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99\nB = 17a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd93",
-    "30a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a\nA = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8\nB = -de3563925474e5408e245184b57f328e265b6cb62eedcaba809d8f257eccc0a457eeb82c451f93af93ce9f36dd1aab386e7c02b356f31c2d170169dbe15e70cf5bb9073b35fe0e7c7fd7faa91c5b2b0740734f12eb741a9d9ac6dcf7cff59f6e16324ea39e1e07dc5b9daea27ac674dfe5d0a5790abaebde9\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc\nA = -4fb2e3fde2a0c653104c077cc6459c9234f86cc2d7b317329b68289826d3e2b975f1a69bed1a53418a0dd86e1b2723f4c4c5a29d003161e667c2315ec24a36f8bb5f2eb0a94f261e791bb829db685cd0ec9e1e301dc140ea57cac1da228124ae029e2b8ab1fa3ab99c55a9ca94dc7b767162c0a24af851fbb984\nB = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc\nA = -1b2496ef929bc673042996ae80f27c6bbd33fa7c20580240ef8fba985d1a6117d6e746989924e34f281e7d2509175d0773dd999bde16662e88fcef52978d19cc45fbae3997fa580a66171d398f4f0e7605d9f4aa4f728902cb886e6b6dc9f0161e7cf1ebac05a09c5a1bd69a92273280758173fd2c14550ec221275\nB = -28399206ae2820d26a5aa0bddc4903776611d08fc4cb34a22a8bdc2a19e9f8cdab94217f346a8070a4145f989e1dfb49cfd100267635af0e062872cc879c534ff138fca603b5d45a6860ea85b6de37cfca000c81fcda3d14ffe81da919b2a25214209b085bab9cb511889665fc845acbcd038711533da171d8308aa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472\nA = 796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6\nB = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d\nA = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1\nB = -a31a574d105305e47f4fc00ccea0cdf854556886b524901c22e6f3b59a42915932ab209a8d5da29ab70d1472dd5378d9c79a7447d17665f9d1f1edc1e545e417cb65415cb8a368075c16264f42555d26e83adc704b5c126c6129318a8f394af8bdbb32c8114470d11b2acfe806acdc7b96e1e348a32ff96a988de76d4623\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd\nA = -5fafbd498d610e9f29c38a5c6c262b71672fe9e9c84f0f071b549390353e4fd0101a059b7c547007e27df97761767302458f1936395142ce5776b0959fc5ea039429d64ac5d50c2ae0ee45d60c0c50b7ceb4ff9853d57c6e883f588017ffcaddf5a1aa3e23ab068877a114d9a2cf742f01f5f5d611424c8ec0d082f5c165b1\nB = 552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f\nA = -1a6b046d691830d33eecf2c53953676ed3f6fdd20c2252f6e915052ec28ad1fbf7a5f264acf87ef8ecd515ed921ce6b85017f3d8a8f1d14f269f31e3307c6f935ad468cf012a912b0650a15106fb949cbae7b36c9cd496538bb0646a7a28989dfadc719424519bfa43cd8833d3a748c758f813881d83c98f7cb2a63c2a4d06b8e\nB = -34f87db0f839af6e4c4bf146789db36b3d0bcebb9bad81db690ccc3a35070d8830c9745b2fe730a1f3a252612e7026bf9889169b57b8984a5479cc4cdd6844ee3e150a2e7bf7680eebbef30e0591c895cc8b2ca488d489554f2339e2f55598717ddd8ce444a060cc95cad9eb478491ee8d3b8358c3762a970224abdc1068af0bde\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad\nA = 54ec203e2ababdb0348135c0679eca2a8e778ed46e53f195331a48d3828e5e40da804ecf95eed819ecefaeb9c5377cc1afb1fb220175990d347981353e7d90637adf8cbb16812af8a3783dd312d967a490f8efe3f23746929cf2a5a8df58e0b878367f6c5e4d3c086f947fc2bf70bfc3a0008a8bb1d7d83f002930640b6ed94c334\nB = 1311",
-    "b88a05224e15f1465c8da26784dbaeae84f818e029301ea39a982f714c64312f9f02d094c401abb6a89e8537d64c178637364bd261f4a27beeaaa901cc7b3d4e36ebcd9453cda33d47a53c6dd1d121dfb83a222cfd16158eac23482c8abbfaca59e765f6c1fe871d884d281793eb19f6409dd6bbe4083bf762ef24c24f0127613\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d\nA = 145f580c2ebc6c0354ebdfdbb1d3d7fa17f0b55493b0b9a11b71001c840a967dc77f0206c3dde161b5a773a6b5fd9471fa08b205cb6f728e3afba440b55268d6a9542e234ec313d53583c580a391d8da5943f4a900b279ec9d8933f2cfbb260b74ab714a8b9a1af3190d914b6e42212df84f933a237728a5fd5473ce2e272eb82bc83e\nB = -c67f9b9295dd5844307b8fe3cb9c1875257258e4be6229ab097e148c0175ecd0de4d84fe03c8da6e27153c709c2526092b1abc73b5fb40f1d4da9e0f3d8d2fd5f8a4e6f3c30befd80e189b73fbd77e8547b34010d2aa57072db0f00537cf3ced95eb517b23e0c854b4becce128a575a31037c3a9e106a476d8b0277d26dcee435cebedc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca\nA = -5537630b7cfb8daf76d14e617f7b69f7b75b472801a9a818179d83ef2984d0abc8ea4214ed3d3d2bd785060e9c2819e861d0df760fc1daca8340e8a2c997c9ad201d6d2f12a82ae3883cf9f5c51ff1c25277c28175859a7b8e5b6cdec7cb3875071cbe415bb698b85cb19f617162587516f93c728ba8b2cfc19f238e2cfda115b8ec0431\nB = 597296cb27080f33a24241c1e98fdec32f7a4013a7340d367e4cf2a521cd462a2803109c27fcec353a30dd20053a1f744394fed75829e8396f8de434399bafd6cdb6e0ee81343f0cb99ef3087a7c69bd43bd722745a46cdff0c2c837fd87543c3c63df3896ac101a145b478dc224644996fc72460a89beb5741b91a42f2fbaf0d62c099b32\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f\nA = -1c6ac9565d1950ae6c55025f76e0a040eed0462218e97aea87208ba879acedf413ffd5e63a92dd8658cf5f49d633ce7b126091a55701168ee4932db004dfe8c35c939887fae3a892b0b04d8eb74191bf8fdcf5566b4d3796a5d2596b1e750f64201057ae60aa705edd58aba4b48f6a2e511bf5007a6c44a27e3efd5bf2708f7046c1fff7864\nB = -244f2a90a57e5d066fe22f4d52f91b44882b8ef76d1dafc3387abcb224eda4a2100239e729bbc745237f8129d457e98eafb2ede2f3afb81e63520493da2a5730f1170b31fcac21259e90c894f8bc488c5e5dab2c2635bc7b1ff56c3685607f6fead73a09f83a7a168c4245729ce5b06e482d7d3d72eff33d14cfe2f32f72175484ffa292a9af6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d\nA = 558613de283911aea1ee21d6b926f531f778c5226e978ce329860682b5375fe5e5328ae27b00f504f2a2d24470d16c1edcb8e76b4d1a740e55538e79ac7da4b45c5299993513ec3bba7e7395dc829a00d4e228618dd348fbf838eaf0bd50f6c70253fb1c1c734a07d0813915be25d3163df13511f3675022cb85af7646c14ba5d13f615ded8e5\nB = 1f3c3c468146c29408d9207e15b25186d3b06b3fbf9556eff7ed7ef7788032d87ae1a4d2a0983902d4c70936c615d8c9ee26c89af8b58d60231ede54e859763237d5ac59af686300a3e92f456484ce77700557ddc0f93bb40e5d2e5117f2356ac7ffca26dcafb3ce7a5573e07ee97515b6b082fe75fcc9dccd76b4fd416e69a247fab2b30965d9be\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233\nA = 184845d3762ad1a9c925c51fabc7b9e15570a84a06ecef994910845d56869264273d75fbb84a31c97c27eb9779e8b39f6829638a78b266326b60546507f65128caaaf36d4e7f85939b75cfb3145e2b1bd8372531cda579f59efa0da9c95a8efc72faf326d35c660b4444627d328bedf50a919029dd164de051a4c0c924103e365cd640b9637d8244\nB = -977390f52af784b52c1d54e82131b072a1c308406e9b82587102e67c6f7145f0020952231a5f0ce9d130677bb5a7a37d5a06dc570a13a29673c8a9068f06242ac438806c37ec46136e7c1c1487ca2d330fc1f3c1f42ea51ba2805b74c44a61fb2fac109710dc3dae78a07057a753898d4e849b910f035bfd807178f0108812778345b256c7b59f8883\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e\nA = -76e575cc79d7f0c313a489b255e85d114f3933383cdfe75cfef649f639921eefb9b3b3184351fd0ad252c6e477e153ee586a0ff6da1e1b2bfd7e953e6dd778c849843fa5cc355b31f5529ca45aec81ba67a1e364d5a74a4656d266f7decdd47b2fc2d81d6c298afa2d1c39b5e8eed519a9997a14513537cdcddde0b5b41314476264d59b7d3f0e9a65\nB = 6b7faa437b4e8db8fba56c62eddb8a81e9090d1b6655a2185d656b2db0e85225992297381d653e707aa15f3017880b0f07abf3dc455cb09c4e551b3df3516c6db4ead79b88339fc33dda96bba76ff7c388363c36b67fd5dd0ee63f92f67549dd77e37e9902ae51cb58057579f03286fc48e3b7fba763fc5844c222e6a1eed9e1634d0bd034cff222bf147\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135\nA = -18ddf976fec2090f7d1f4d41b8f875e56c813c04338f595d6e591b3eabf9e105be792f45354ee9beff997e6c0e8ec3fdc714c07b3466ad1a949b9d30da0115f5484c3b9e00c7cf0c117db57c3c6cd7434371c6d9ac7a5da1a0e2d705bacfc22f62785222d59bb5bcd3e3bf2df8e845953c6ddf1b546cb75b1698dc8e20bc611294ff288056723f1e46ec9\nB = -2cbaff39103570df7d85a5673b50fb8818434bbc19ab4e33bcc8289a4047d85de1b7029a5cda3976ab12e1d891b7efe3d5576bcb3713c597771f93532853290068761bea04200fcaf9b05d8553b960ef5e28064de89d9e5097d12b26af0b64beb40b33ff82a55af7c5838b44282917fd4342e2065942c724f3cca515d9142fb8e46652242e8f0ee5ae07b6cb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680",
-    "068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c\nA = 5cb6c49efc6767cf956885690ef740337aa71b90c1d4b9b0a9e4734de0c0c50f2358fd45aeedaca6e1dd0fb510bf097bf46513ee09f3343bbd1c11f507eb61d51ada40c5d6b730561756480063f60caf05141bec9a769c241d367cb92fa8e229ba2e471fc73f48812a25bfc7553c395ca77b80443ccaa82fbb7198f8c35c3b5a2fff977d8b2a29cf9358ee1\nB = 16ff229a0e67a410555dbd4b687f1470ec854ef67db73a902f2d19953c55071c4a26dc320baa8571586f1fd54fa490b0d87dc83e5bf20b78956084275518b307ce69aa4ca1079e3aa753d97fa1cff62e0b5f3b99d96a24e411fc3a3e375ea21b7b35a578a72df68d28286fd9a324c06930905f696424780083715f77961532bad061f3901ed276a9eb6e81ad4b4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb\nA = 188785951a3befcab56128cb6fb9576bee2412e6cdd7dd1bf5643babae83c8011af99aada405e119c3be33653862440005be994bf37d3802cb6c73cc312824c56841004c8e871ffb560e93a1d222c93d63684e90a91394b9c8ba8cac27b414bf818ee0de7217bc2faf099783800485ce2e93612ce39fc7e2f1db708bf9bb032d92b66159073fecdb2e0257058f\nB = -8dddf094f30284c213577ceb7f1b2efb1e4213a548e6aa840f801cd6382fb6d4995908b7827078dc3f46fccdb9e071bb8531ea8971de0ddbb714d678bb71ba9d961e58cdd5f41b8472146ff9b814a5d1d6368bd94812f8d38f235f39aeb2421a57499fe7102c1ab167df7d33b32a6dc7c8eb8f4babdd6b6c929d1ebd9bf4774aa40cefbf136feda7b6e10ba4dbef1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511\nA = -65ff4322f8e46e03aa6c1fd10a207a5e51db6991bdca232c0dbc9d73ba77fc485d881868be7b14c25b05bb59b7f5bb6c4b2a7d53f35d2d7af282a0423285c5de656429ab7d3af7d92837e41ca701f527845e98c2bfcb51647512e6abc6675cec2a7d34ce55ea4dcfe9e7a8397d45a7a3e73bdff06e303a8f04ab6285eeb1bb78b1455931cae203078eaae826a6e5\nB = 4d936b603eba3aeec3d3f1f9acff02a0ecc28a8ec64b6bfd9b153b1bbacf4f1e186d3deda8c1c81e759237921cec53251250e3e838f5063c4a1eb6cc93637f35aca10b965533d18b713617a312e74c446d63eccee93cc97e3723ab27357ae9b3cbfcb3e2bfc589a1bd582480e776198df047c3ad85f611ca6fa480c70aeb98af02f57d56dc9659b2a6bee222dc3e0566\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79\nA = -100f2984dc1451fd7b71e5d290e4b7de2d26175a47b9bed524fae02bd5abf96faba06e955107329559bff3805689633a4a57275732bc42183acdc792cbf7b6b24dbdc8921b73c0308d0c0ce5d8aad75f7eb16352e67116e859b323deccfe5d9ffdd1f0265297bc9eede073146a06acc3c330458b07b8fd0bb652c7325cafdcfa165f69cd0de8b145d49ddd576fdde15\nB = -21ac4953e54347a56800d75f6feb6ad660b0442174cf3c5dcbcf6528e2b5da95a614d3a8399da14507df4b8eacaddcddd627b10ec2dc5fb8c43d96a38e6dff37189ba275afb9484df800587f4953e327af71dbd58780bd5885b4cdab15ea0f2864f961bbfa9bba6b2d9448443af87c0cf178990254c1ae6e19003b1621f3240a6e5d0a3be2deb5dd253f5e1f88dbb60b522\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e\nA = 56f4d397530f5c90203df1ec799f82a0096888fd370d543e33b5a2c8042108bb75a86265204c40fa5a9a44965ad2fb41896b134ea56c79699a230f38c0e3fa4e5d346cda70e0253b9993c9da5642f4e645a0d96cb732f8f04c99a83d1f1360a385c6e1a972b89915489245ce58830788ce23b9e62d6b48a7ff9a486614d6979033f7914a0735d201c6f29e512374088db\nB = 10fe818f6af7a95cfefb0ea0726f9a3e0e7c30dc9785b1fdf6e2b810515448386c7efc656479794d389e109ef3efe37fa6124c5a7db3164268da0d98538606c57bd2f7df9482860e81f272a27c727d7d81a66fc1a9bc8c385cf02b7ca6bc7ec2d8d6ba1dc992caa216d02c9bf0fba8ee754af77567c6e275ac1b6b1b36b065760761300d156e40da8445712b8fb206c0df346a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b\nA = 1017a4fdce8bf41ce804b7c9c836d85ff6ee899807e1736bf0357b015b701b9675297e5ebf588ac6c295feed3c6a367987e192be0d89523ac7d64b0b9576f311b5b2705c5398276a52f06085027480c2ca72884ad7be34967bcc6c8cb4ec4fb761e88c16866a2e284b40180eb14536810eeeb180ab701ec47ece62af65a0753f95ca657e7d04ebf3c3a7db02993da9089840\nB = -aeb03379fcd4e87cfd18957a72fce42e016951a72b673a9e81f666b3cb20d2bba81400ecc2b38601bc3270eac46a633a1a6b55c50f00e9d7fc8a20176b93e971cfaa4f41573b17b8ccc498f8a3230825afd0d7f102daee347a9d59cc0914ac8689c1d8b39ccef1f3def44054307a7cb7706535f0cf4007231ba21696424c3d5b42c8e85c278f7c2e8b7d1787effa601ad357eeff\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d\nA = -669660e75eae9930dcbdb99c477c980869417ec9c0e8c4053f0bd8ae62d496daf7539f37af96fd1cfcf3149bc02b8182a46b413e3397b49d4b4d204491440eea65505cf5d33a8e797af08f3da41f5a0804214846bd95d730260c6545d51126278181719ddd396c55f119e84da71f0683eb6db8393b098b3a0c5999862644e073b4918b5c8aff17efe860744d85bc94b582d45c\nB = 6045f903a750b69b709cfd6a1c8ec9fc0d7da9c53a9d26fdb0ce9a17c6a0ed5ba633d6fc01f004f4a48cf247d61f7df609008ca5bdc8eafe06dcfa06bb67efa6a584b5a2f02768718a908978edd475a2d2926af2a6e523549a5cbecedc78323c5c295bc0b8d3e14053078492e82e339ea2c6301412a5dd7efc20da0aad0577a37d853eed820776e672bc6d23dc821b5855eabcceb18\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec\nA = -17c1dbc1ad1d2d33dfe1af7b4cdc7b69fefec5a92656957e111aac292e44719c7c752ace33dc74a6568be38b576a5ba174bcba77a034af5fe101699c99ca39f8a3b0a20679e6d0180868a232fd8fc775089e185e5eb81585403f32619a2f4d857bb091a824a89de2e84529e5b070",
-    "2b45771a5816c5a823d81ddc89f8a70cc3d3a0c6bd6d85e9d72b69d2713b61c46161f7f4700bf\nB = -2252b54c602456c5deb86a0f249f3982c3836b70a946f636b22fe00c6e3b91b94e19200a33087fe734ce9a3f92a6099ad03a95ca523b7edb9e1ed3464d38fb96c470464e1c54790cd48769677efc5e1d22f5be4c15288bc5ea1dc184a05fddd5e576b3b4962f37437b4f9709dcec374377db44c8ba1d8611c0c3ec35f9bba213eac59a047e78195ebbbeff941c7f862e8c80eafb72b1e8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc\nA = 6b31ef80767a7693e7d0a9ecce54beaf5848120f036923d80b7a0245aa6a46135e32314f3b227268e0bfa1f45b4dce83bea890526c7ac3efdc8e485189ce2c51597c2864c2d3664584be23559c03670622a53edc2c17b3f1a92640078ec35189dd7953e55e4da0290ff1e2996d164d69f1bbe6f5285ae89209d611a7d760e413e23285066eab8e126c320bb6130a91d67ef26d4dabd\nB = 183f06828033287497322b05ac08f62dcc5fa67b7a10c6c5a319c9a1e642754230c6d9809dcfd2de4bb9e360d6e6e1180f6ec6e0d4c6185e34ed299b6171e653521d0f7b8975ed5e7d2c51d27f9784a4b6f9b5e97379fcdb42e4df981462cd5bb9d0501f93f217d954f6baf70343ec710065eacbd2b778430ddc36a7ef0515f29d5fe78d8708d8ffb6c3391c6f632cb1bacb4ec52972ce0a5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158\nA = 1e1f2e44bc7c79a00afc3b2570d5cd27ad5ec9f45aa94f63f2ec3fa6b69077480212a1cbde25ded7ab1c6cb1ec26d5905948e5c1d6d109bd5047b1e038666054606b42e880b609f6f00a219dcfb504d481d6fe709f4362940f6c4b6f2e05d243722cb32bee5508ec94eeebb53b5befa551d3ab5dff9cba3daebdbc97179e56cb778aefdda6a0c24265728ff9e59ca3c2d615398d97e66d\nB = -e018708df037aa2918850fabcad82731487fb812213b1c067d0688462a4d518e5ec7c4c84f2cb2017aa6bc960e2faabbe361ad8f66355366cae869d366f06d7cc32ea08dc51631e7f36a4c775611095d8aed06a0086d0a471749246d7157947a1eb5d5503f207723a7062382b3e45bb84c6f555e48f6d63aaa1c04fe13c0108507c0ced669a5296bcc16debf18e03c32eefd177bbc1dd2f19cd\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745\nA = -75e06b47f60edd23148c3736c9c125a617beea7c8fd47e662c9d9be883ae925b7801a0030df3f4bdd3c9fc386f18c4e002e5daf4a6f7fa27b2f71252c83d5f1695e50d62a10b99e1900987b342290decf681a064f789e11bc3fd75d64e2e78ace56e7491fbe0eddd6f9958a5f95775c920ad6c051ebe7750fa76891ab00f42c910550a42bbc1c1e5aea0ae13b7e6f916a5d228bd57e854f7\nB = 434c8e4767d0d7df2125def75a978bb1509a26bf8305cd03df748c6c12b6dc580a2c1ca9a4526eaf3936fbc4ec797d0733217a54ffc9e1d7c6ca04fb39679859d5bd3fa64cd0a09cf1a056094b9c20ddf1f00e134533ba9892c2ca7346ac8d0655250eb45df9f0b7983bbf71102c6f1a2d9497e7a45eea7b3095cac037b7aa755beeea8a6191da268780179a652d94a732a2a5c7b626c0de3145f4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950\nA = -18dcd213e9938fe4b6a64abee3b9867f65e47e5b0365d45a8dee14ddf787f34072ce32f38d4d48ccad236005a23c5fcdc02b72cf27001495663fc56f428072d3f1bf5e33ab2c5f9dd9facf122f7225ea03c2f67321530a642803f65a2e9428f32d0d974e68a25f705e4f8140568f7e4b132942b49f9ff53f04f241feaa29aa353925fcade33a0cc192fee2628c2111da1e652cace9d304d0f1d\nB = -2e5397658a5e6db9d30f09e93e67a30dc84b1e17c25786e041fca48ab710e1d0497ce615264f1abcb23d5aae8412b58430bd801775acdce06cd362438898697940712062b611c92ae6ad10da31784207c5e7b9362b20d7254da0df8caafe0736002dd466d76b1a03e91a8dbe8a71107abd5f07b00fcdca2017391c7c3263881a3d02a89b0e16a2a765a32d24ae6584cf44a88975c539402db9a301dca\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a\nA = 6576c31d48daaf7d6bc3658952c4ba18095f1a0d73726f6fe59381af45a2a6b592adc79fbc3b597e1eea711ab295cd991441fb5fc4ce5f047e571a7d949c709e0d31156184be4b8a6a49691ef93d7d3b120193f6ee82246aeb896b8b7b4c74c27c02cb39fe0335883a3f088a71ab42b947a0cd59dd2155c65a0274ec0836bb8c2fe394500724ef84d869bee40291363389e7012d672b1eab6696b\nB = 1ba2888f30be283b588cddf00eb3ae3c641e35fc0bb3a9fc85d7fac1e81052129f499afd3e8458d4cf893d51fe4a2bcddf70f28c8edef16c7bbfb791daedf1a8248faebe36953560498af652d1f1c7aa0e9a5a667d9c94f7d9525cbd5a82147d58b738dfbba5aa162858c2c66d0dd7d8db38d41a2261e6efc7d0c8b2dd2d6962be0fc796705cec8e87a13092e4a3febdda3d4dbed9d11a1d5f92d7dafcd6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82\nA = 111940235b144a42a13201a41a3f9e4ff02948f8e9127d9a3007906988a50b36d7622d1221155f2516812074a7888b1d8334a01c02ee33b3164d761d02b36729c299ce2455a462bf18471fca42e5b01615d53723c3fefa5aaf4a039a6caad35c348a0a4dd3f0204f084f35c0b93ab233c4066dc50c5fd3897a769a7c5bf309f7a9c30e905466c8394d509b79d62a69b58c73d8d3f1665ecd9a8a4dd5\nB = -e2633e43c38c0b4b8713c20bf4e2b8ccba680ecfc1139954fc42724277beadea438596942fea1094091671c2060dfccd0351b2fba8cbed35dc963cc18f8e8835052da884799d88ec1887712000a0726b17cbc4302421011d5be8d234440eecc363f09e2c04bc9cded3cbbac9a5bdf0b6d418822fdd90dead20e5bbbb3566ca94ab85f3a00d32842eee6521edd18b9aa6872340b2f47deb961f58bf231e01f9\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3\nA = -402034484e499a8efd610200790d443c5d3be35d19d8808da85954d42dca3f24177de48f55fa2efd7e4f7f624d806a8d461c3bbe0b626fa1f3cad2145746464108b367b13f3537ff395262256bfccce5f0414e1f98b59ed29940171d46ebc4bfa1a27802cc30d9221cfbceeb92abdfa6e84ab4a54965568aa10ea631e82067ae358a1a93a3a3fe3a5ed5636a0c4cb373b4d49f46f8fbbaa665a19200b7\nB = 78ec7dbfa2b28e26861",
-    "9ba6db34a23adab25e7f8690aa9464a7d8fb7c6b87d5dd9d33d4c023bb665f2d96febf2638fc087ed30796fe7517fd58e4120c0d319688e67a32bbeaf62a987a9764be75384bd499b0e00a850f27e303f615031299c631844d10abc571f9f2a0f742cc0e8df2fe3c244bd825bf1d9134b2f1059e2a1b61985ae8daf9bfbd9eb24ba268ca58553891945ff1a314a78fdebb5444677ac081\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861\nA = -1869c53f86755aa350115a9f49d6248cedd42a339506b8ff59cb878b7745956f142fc4387322c41f369773ed375b72665026771d4ed1b9ece08f84e4782d4c3b0177853cf9ac3a55f7e52f39c1b82aa42b30628a4fa6a838754ec6ff9809308f675e455bca6f44e298394888d85fee29d8a0c8e9cdb9aa08d68cd70e13a243b5804a3ec199f52ccd462ba6594d856602cf1d5efa509047633923d31f78da3\nB = -2023c544b6cdd8d971bbb345300f7a101f6dd44dede6bfb5f4e6b4eafb7a40728a3063f6d4bdd0f606ddecf062828cf889b2f632d0c9254c28f36dd974aef116b73cabeb2bba98635841c2b4d2aea833e35eb1db9fa9a9d33bf7b51c49a14907dbc6036b027a039192b47406bcc56bccf375fbdf40b82ac4b3c660a43d5a6eb656868d383cebd099d2a73506f675cf29649617fe06097a46de93c13d1e590ef2cc71\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c\nA = 5e7d4ef7d6ace6cb106e38d96085d3f3505983fd952498af3c1d9b2af61e4ba10e14961b339c6e64e11ac758d5fa18c3222138290866970d67d0a4f4e19f453503eb8dfb85b44d1050c86943e7c5d6faf7851bedf7d0cb6b13d2acee25372243591d37dd230907457fb440f83b62395f80f59a2d02b87134887406a78efd77614f3193e517f234434ab3be084f1484d3f2c1f68c67c0d6e863585a8a5ddd0be\nB = 114b6e6726433ea88a2ba965f0881beb3ff4d377526e4e099741f069abfaf29e129a1f5fd243c6599f725a389728f755f9cad767ca1d6ae5c8b3a32102e47af211e86d67574bddfa42b2cb466d968f38b47333b1b55211fd9a315acd5ef62cfd3e83c13ee9d3fa20a06b2292177961dddc7dc39abad9ea31ead1fedd3d699f651b656edceebb0bace11bebd0cfa581dad577b8b42f0a844bcd8c8227880876dd7b0aad1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce\nA = 1e6a59efe0b14fa017c32ffd0962700fa9752242b06ffd0b604b9bfd125114d4e0909534ede704cdf1c9e88a6567f4a2989df752510d087d7b7afb515ad594627ece54b8a8e539074386121c9a3e1c12eb2641ded8719e56d42ef50e2f3b5d7d59f8a6f897174cc00a7449d2b91f33e9df07902a95479731a44fc4ebe8048c449bd515ef6cffed70ae78c832cd43491203a247fcfe0a403862266777947fc2542a\nB = -8a9d3646831dcc852fecc8e2335549e8baa2e2d82fcb90846ee82bcc715c716d4a9f62be29d5e1531db73c2186a4d2f118266de33d966b78f989600d772ffc55b1364117d6750cef67f4bae851e7e3f8fbdae7b79de7eab54cc1fee56e25d0632b2929e352c882ce78fd64dd0a1473e80b6572f0d4eb67f6bd6e45c7617314219d6f7de5e505a9b395096cd36650d23e8d57d6abfa9faaf0ddbff90d32865bf5ddddcaf28\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68\nA = -73ecc8a6a1507fb5dad40677dc6ec75f0d130ea704d1e87b00d2bd56a6be21714bb30202739170b8dd3605f0553ff57439051efea2a97def70a6d2cc3fa2b9ec27a00c1338bbd588513f0f320272b8933fdf6635e585d1e79203efb5c95a454fcd7f33aa2aeac08902107e9bfb29587ce8610d50cdb7f2033c5b726742fa9f7f20b4780cf9244e6abf6b812171a64b870c3ca4c9e898d4c15e9f5b0194ae736c3783\nB = 4049ae926bb52e862606842bbcb4a5148bd1063b6a56f331cf10000c524b4aaa80b3bd914cd697ebc98d68bd3c2bd5c87fac4ec68606c264c56e25b19d118dc9f2eca19bebca07269714f2955e107b3fbf85530b1fe99c42d33031958280b8e8abea5a918a41cc7e6980149ad68fbf1c0041798d2046d7f88a395348b295858c61c2f33d8512b6fe75aa8fbad62e2f9b0b7876ef95af8a7b7338a2d6b25ec6355c276fc6ce23\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866\nA = -1e165ca7e1eabd2ad1264d5ed9c3d2b687f2db5b507a0e4d21d9e042cd46e93c2444c6aea8491b5caba2d8146bac656b7754b7b1ae0f6216029c7167fd3b1c3ba2e20469d386d8566ebbc05cb51bf1f1eb2cad9dc4fa454b07cc1bcdb9b8f5a43e354c4e0f4e62d52798f667080a0e0a15414391269fe8c92f06da74f6209a3b215adafa1eb6866f8b3e419468e2e5b4db0d0ada80514249320cecf034477977bcceb91\nB = -3f314681eaa4cb41a3feae8467f7d76b8b05939731fdfc943235aa4d67bdca30e64de541d17a8971e829bc0159384643672bdffbc93b3eaded7844d824604f46aa58b1f1b9d788106aff53438954af015a0387268266a6ba262e2fe7a4c51b5af6ff7f918674b7407ce8282f66e84fd2582edd809b465e4401c67e5faaa9e5748c06e3bb8ddb23fa649ccaf9657dbf79b937eb8959aae8d5bd9513c1e601c0e536cf60c4fc3802d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069\nA = 5137226623f4ce4dc9b80a783777ef4e53ad3c2ec648264db472c517a96383ba1173e52c2659a97ce36341a11e832f4ad293b89696f91a051c35bb1db6182260d4a276d1a9b4be848c206899f87a361d318d38b4073a7470c5743b816cbbc3bc1b20dfd7971b11ad4e20d947e352d42760104a5a3cc590b985ee3b5e98c779e38d2581413a2208d31873f9644ec979602671c9da72fa6f66c603c1bb6d8e690dba8bf4933\nB = 13b45d4105e3f5e8e0ba36c812faeafccea2f1a30e2ce8ffad57ffe0dadeae3a23e813758f270423ecda3da083b42432eead7f04842db8865f9f1e2226a3d298ec1895ae69adc55d1d338c3fb787f0676664564eefe46ca95206e81678cf1a2f173c52d809b1e06641a9b467f191ea09fcdc597271eb43da1a9a856784972ce0eeedd49ad363dee882438f09863ba5af063925871c525c6c0ffdca428054e039e149a424c6d1b5b2b4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901\nA = 16978c06a03276fa2e0bea45740a98d55fccc9d27321fd0a5b8522298a2a90d391c06c5c59e7eca85efeb9b4c91d4a1e9178adf816d597311f004ef98d209b59a2d4b901fa14c57b7297861ee58b89c9b2e931e4ce5818dd4006f3c40168bb4d3dbbd059",
-    "c1f1cc24ecdc64d37df16b8e8d0529247c06f905ca88a5d283ca1b9e6856fbe8115a326061905b369791772a47900974339722d19b3aac16a0bedd93e1e4e4289bb8\nB = -de6dad276dcc0a9e271ad523620ec570fe6e3b350b934932ebbe36dd571edcde968b6590be14326e0f6394c0a2172052ff8dbc3ff15d94fb6e36a098286333768a84fd0404dfa354173d01f98484fb20897c439c48952b7f1791209fed94e9e72bfb3df5f368d420d587ae8bf036db6700f77b130459e9de2a541ed885c69c5641defa9436a4f7a69d2848d0e5d1074f77fa688b6dcc4d4c7de25a3b1b040546ef7f418112127cff173b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b\nA = -5144d5ca834f7bbb35d3fb95818c1f89ebe08efdffd35993a7691c05aa1b67f6a28e219b27fdcb66e516097c9ef5f00e4257c561b1f94c52c577471cfcd7a55314d3b0fa308b59449a36adc884c48ef5f34753bea746bd6fab2f20b86814c9fe50e8abaab742916313a50e3c390c67fda8e3729ee3329dc5e4b7d3107083aa3a07daf7952ebbcfea15fae7338cd0b114e9ab2f81dc2e80f90abff7a7ac59e3aecf76fab87633ec\nB = 48b927a46dbc4e23d714b256084fdc7cb9d4c96a988a71c956e0bf98785ebc9bf22b9d5c6ba0c419e60afbef7b96cc0c4a13e397aa2d2dd7995875d2ccb127169423455d138131199a263151f28d232ff4ae24e316907ace1fedd02a02cb5ff9c831de33e6702010fee2232bbe3c1c193ce792eadcad0c81e7d7c17e49168377b68690bc61f22dfddb17d82a3b993804726037cfac8aabe8548befc52a3c6c6baaec89a392133cd9c45b1b5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3\nA = -1343c391be3f2b72c4b79d8d6091389c9602e97774b18eabeaae81fc0539336cd8c899341cf75fa758421c7f32eba9df474c934642003408b32db66cfa92e6e414b42b1d49c7e655ffb4c80f5bbff8d2774ee4f7198839680175e1ffec0428939653c6697eb3681d0f92634cab1cabc63f423d5a71d65fc7150aaeea74f9e0153923a1c65dee4a165e6a01a88655fbecd2db7697f4d2b49fca2508e2b8f84129785d36d88bcf59f4e\nB = -225a0a4afdde6f6450f28736c3ef6e67d67ec6206a63b11763bc6e69b03f1494b275ac504868caa6d56d684a12dc1098ab0d030583e73a2f45a42b8607c0f19031b9c5f07fb71919868911806d210d43aaaced5894e844881e89bab85a203af9ec3adb105e50b4250343ca50c26df14c46d73a22c2e4804d26d44ff0bbcc13d0dc7e326c9e4eb441f493c9743ae0eea0de045e05d19ac32d2379196a165e63ba640ca42e4861caa24c29cbfabc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf\nA = 5f1239e0b5dbfefaba906bfd9003336489ffdf634333cec2484c582dbc19b66782ba40942d047c3749597ec4d89ef61b7803d33a9842f0c903461be37c679ca213aea894d36c1e12bbcaa1c679599d2adda9bd23e712dd0d0bd3f91d146e7a04f3e7ddec8b0db7e12377ab32ba241ed1e01da070c1f3ec85efd8387a7b9421453969ecba8cbdeeeaae6ddb098084bcd250601af780960c32f0a1ad7d7e61fb19f40dff1060c5f332830\nB = 1113f145de014bb6dd6ca05de159b97e9736c45bd3bbd8477f739daf79615fe329ce948cab9787838d7daf797218af5ba7925685ea341b802690bc9588ba3e916145cd3ae9d0c4a149637b890cf50fdfa8f89a62e508eec68f9332787733aacdd57ec1f359ff7fde76138d5b33d32e64cf7d252f2bcff14be3adb1afd8da9dc930f5261e6d715ac75752b29f083bb1de7b0b89ddba633b8137f3fd299a7f77abf79781a10d897e7bf2c958a097227\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0\nA = 14f4e24627c773527ed2243c0d1947395aba5c9cf95ae62a48827ffc1477614ad9c7aaea4b4fdd97e3272d3e220601565aebf87928c301656e9edb08d6e680de845615bb3a81c61ed043adb9d708ec1447f057087211673fa6ad8977166a2b4a8079a4f29d48e7fdd6875ccad05d2c219922b814589996cd9642ea2b798197407acd274da30d3ca008fefb40a25b38cb6042a581393283d6448cc69df9a5dc2b0777052566a8608a1010d7\nB = -b4188ebc5bf3ba31cf7c5e100e79806e92ff6f863c3d68a66aeb3ae8385f596dabe6f627f3812d0f2baea319d93ae00de41ab65e42eae7d396cc8fd0a2dfd35f303117fde4db5e8438df0c2b3b680dca538b42a7c844a9bf0d3697fc89ad0a73594627578dabdc214e0f4aa06b40987aed473e7f42d318bebf7392d9c898b4b8d73a94726aef65807b2ff746d4a9aa76303ed7b4fefbab34f5c87c2df82d20457f68289f7b96dbeab581294974e322c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d\nA = -70e99398673324ee83495aa0aadfffd7bb9c94ee5251fff365124fabc50175d794fa84509f034c2b86d83607789338b0eebdbbf709a129a0ed0afd21c130d94b279c56f1c7c1eacfc6cd13f724a9352b2b37412242a47b23ec61ef0040a8855371aaf238003c45ab9d18a66cc7dab9653b93c323815e5404762d3f964d4654a6995af507bb2db2149eea59acd72af4d034217eaec0be5ba1d23890081a6a234e125572e3bcf68a6ea52d9437\nB = 661d8832671a4974b493e5d71e547cd46b36730f4017e50c5d1a7520fbb75f0314cbc2ac948744dd494d566ba580a2108106b120a797cfeb1fbfdefdab6bd6b2e073f90c77e814cafd0b7f79afeecd59778b1dfee3446fb32139b2311011576674f96f151f896b477c631237995e11e61e715dd8dd38e802af93124c66eee735c472972000cb4788b26752a630ba63b45e8ebbd979f0a4da5b359abd2905f0b7f3a21b1d381cd02ac08e284218ce41c907\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493\nA = -1896f67485a740720e23e1642ef02742ce5f10a92e51af19e112cc99c0fbddb60d7190086c942d293d076b474d056e74ec9f0c42055d745a57ba370c51ab2b761d889b766cec909811e2b2fd11d6916b753ae00622f038a4bc55b813a5d06e6ac136e81689407de721ee852cd21ea989ea7c8cbd00b64614caf0974a62097b2eb865f46fdb0c1a2e4f2d839066b797e51392e5ebd14dd92630c070acb546dc7438631fef01594878643a4cf77f6\nB = -3a8e2f3b8378a2605f5affa21c4fadcc655f2f8357a3427d2cec0118e55fc2bbc25931259e294d91bde8dcbacd39e6cbc125683da7d0dcbbc67d7c5866f08e7c4732cd4384d9366868370ea40a75beb23b81306303da4a3e26ad357c5c743d0a4ae775a472afddf8f21cb4a1a3350bb6aa71037607c334a0c79468668d3e727cf1d0610e49f27780901c68aecf1d145953e45f5b090855be714cb39aba2efb0f7db2786b331dd9bb8843de8c73c95ab13b6b1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5",
-    "dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280\nA = 75e31ab221c08b3bd73bed03f878bf7742f9b36a89bbfa7e90f9b05ec11edeb0140dcff6e9ad1d62cd7af34bb4284b3a52bf1b48a40f744b561d9ece056a9405ab15f508700b14914e4f427ea1df3093497410a0108066e9b259c1a26ea72082b3cf0e3a99ad054804da7bfa0200d93d65354b75e605b47a4e1e17ef851a37c59a95e1b5172801e6ecabf70f1e6e382740998fcfd8a297aaaba7d04b668e3d6eed40358247767323a8393ec359628\nB = 107aca18938a9cb244ad646a37a212859b3dda7518a5827aa2146b47bfb3bd08d772eb7a866e1f674aab7a1c74cfdc2bc6e9ad1a365686213655b2c7b1977855bcd42ccecb804bc01d92bd7d2667069d853f18a0f0661f028955e39f71ee82b9ce6a81dfb2951b33b123e71264e819bba4d0a8c53a1d99964ad9ffb58b7cb5cfcd3e30b1baf5aa5b3cbd20a0df7ec37563e2b32b4cba91bbf3bb6fd1cbfb2fe0f84d720efdf36e9645c7e9ec70442ea5174528bb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8\nA = 133a439cf006c753c132a8559ea13c64f598c5f8bd5043b89d04d7ecbf0ec58b225551c8df8dcb341198fb0b487774867e5b68f9058f58b3cc98168fbed0d0ffa86bf74b4fb0d4235976fa86d52b8dc7e82df176d70892954223cc484ae58b6a60459a9a0803ab856ff9699789172b163615e322e193bd758016f634c83cf50403e416ae241d9b1e44add17c2a663771ac88cf8b9dd94622d80d879ae41f0f4e7a1a32a1ab164f981900fc159aa85d82\nB = -fef33e21c07dc26a47d692c3094205bf4efae6af32f1c0f46ee579c1a22746a3663d66f2919f46f973fe558c61264157d531e66bb9ea10b4b49d9f6ad3ad8762a6ea8169a9cfe01d3dd65518c2e6e58e8c88d1b2f42d207399d7326752560cd45d0ff571309301683770793fe3765c1337d14021d39ea6980934c5fefadb93047ef07c807d0ea5625ae0cefd098988d6eb7af993c062ba313e23176e7abdebcc6e566304a5f9e03da05bc1cc58dfbbc898a67a5941\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297\nA = -534042b0811c9afca04d20d83898e7653f91a73de1e4b516f3228c6d6d9b963c7f8f4c36e05383da90f4edd072a7eda382c47b84b46b4dfa16f269c2d9ad0fc53ed2ce51cd31e4e32d0c1ee21604d3c7eed2deb35cf8df6fe1c0740a1515e4c702a2074ad6c0fcd403603b4a4e2195d19b265958ae854ccb0b41cf22480389a053f71544cf594f6833f3e4d91fd3d9091df0978d04d3922ed72a4fa3579c5fff50eee812dfb2a334148227a0f5739f8ac6\nB = 6935a3444434b0b03d27545721e253e4281884da027246e46ddefb01fa7cf7a9a030581dfe618431a68ef6d79b03b34f3ed598e7c8ac030e2b4cc887dd31664604fb8afe4e71fbc3135d6d3b4e596044d6b615de7184ebf8dae8fd58506286ae4d3b797aea911eb59ada39dac756d0e9eb6a6c767ab77b9348929a00f8e311f639d19ed88c86eb91f0d4cfddd34e98130eb520fcd2b77507c24b6804d3d65d1b21e6f6d55d1f6e92bba0544829687a096be79eaad7d88\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d\nA = -1d476cc98529efe5b926aba3160b261723b009e9b880bdea04e9b5b03f173040ffafd1627b38be8e00840e85d7acd3abbae2f7a60b305256b920c2b25a8a4373ebbf1a0c69f6e74792cb0d849872500519b6d1c190da30c572e26b44590b7ffdb464a900fc38db013feecf909b43bea549e05f1b7e70d6ad879c613293cf61f0cecdba1a6565eff1bfcdf740bf553ffd5bb7d74f7e9537897184c527b990dea20387bab0dec3e32727786bb14975b23ff09f8\nB = -2b6e12c87ad91a2fa878b9245875209cbfef400e637b557c868ccbd6e94dae65f1ef8caab61f292d739b139e384137a747210c09ee6f3b2ceb6dd212e14525852b8c54215191e116b7097f6729f6426a8bebdff86cdc16effa08d932ab512d7265cc0f57303aa5e6fd2afe0a45180557935c230558d02c3030b38ca88de5fc75c1240d25a22fe32c4e5096aad0078d50989812d7dd0cbb02c736fa563efd32d14109c44297cdb3d4fa3b93a2e15bbb6eb678e93e943979c2\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2\nA = 5b0a181f07068af6e1e4b715d92c1b8391949a1e3cf0fe0aa49f3333c826f5582615d39ec28b1367804c1ef54f15fb83b3c578ef3ae957fc89ef22a343175df3ef2fd425f724ec1c3363aa000ef624d64c6d678a4cbd90b41cf7d69a7e03dd60c5d3470dbb75228b34d35469847772ff3d74b1a89a2c492c082d3ddb45ba4df6e3f228de6c64913b79679cbbbc36a2924e722c2c640d0c5a0e90ae86b5364dfbfae80df3d75823aa58ac6c1da78e988a11831bf\nB = 19567bbcf615b777b35fa7030db7da18126cd695ca7dda67f5146c97beeb20df24ba0fda4a4f03523a0d9b9f85d9acbdb5793ecf9c1f4ceac81299a1aa34417779175a4bddc0e95ac68309da51e4f115dad6fec33a75d0c5520692a38df64e8d684c9304f9e2e6ac6a66d2e16a03c19a30efcac712aed2b9ee774ea28af4f37c45609464289de3f9be379c733d711875216bc223f2f468a0c9b4a8277bfe49c590ebce2e027102537bddbf2856c3b6e9389c4d1f5390cb0f346\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17\nA = 1dba8bd9d1e6cdc117a5a01b5046353084946fdddf2696f831a942d9db4637a5ee76b84d4ba63156b8cbc72e40559a2fe9b8e2682d8ba1db0cea042bb86f8ed71f6609df52526c42e7494f6114bb62263d36784dd55d396018b8fa47fa49ca6e5c76ebb0b00e6c764e36cb3ec75e3af6a2c14dee01fab78070239638521743d04f184dae79d49a2bf209ddeb4cc72e0c94a93a47c107f5369070ad95ffce034c554fe2a8391e67f817c6cab5b88ae9748072da5c9c\nB = -849602ea3b79b33af2bd3ef9d1250c507d332e759d428902dbee054fdbcdcdc0a357a51d00aaafdacd696a15a64cbbdb7e1fdb347be5ddb1f609a4390a6f29f79ccdb51bd1f0547d0d9a2780517f8753a906428fd236f8ee1b433e57f2810d0ad51846304a5729f53a871d8b0e14355d24d3f092e50de4f044e2b8aa14cd8a51fbb2ff36b0b37defa7be768c56fbd4f5169d9d4698fb9072cbb0a037c219552728587d7c35f27456c02020f5f9374b6c53bcf8eeaa14be51899d3\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8\nA = -6a0753edddef8b74f762bf802d7fe9b38638923ee2d81bfdda354d40df4422e6ac43724de1715c4088da2e68b63c10c90b236d7dcab39b9a0ecbce57628f4c2950c79cc88a89daa20d7a8679232c8ce5fa30525c56011570107697222e0eaee6871adced52ba01a3aea0ccc9901cb3a09eb4db2f93aba0083180bb41f3f9eaae00fb458381213dad01997e9b88f21b0a79ada1ec3837ac2b63611455fab6839363b796b105c3be6106ff284544bda2a32352bbce6ef8\nB = 542c5fde65111ec8a38d76d8c5735cee17329dc41cfd0f13bf47e6d0e0093",
-    "a129f3449db380ee9a70ec1e44640839ff18b950c8fd89346cb4701ef753e6ef49dfd9bd27d9987e572bf8e68df399cf945813582fa1d33e07be938a7729efd9a5e7d730bf61c537770a0727f6bb9ea6add5aac9267bf910eac1b7d92ab4184734ef8b1d184c292b2b4295ec1bfd17b8a2a2e4d315a8b37b8ff9bf6a1e94a4772267195c5a7ea6f0a0c267337fb97a023f1b50ad697ea31451192cebcbb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b\nA = -1cd74c052e62ee8156ba5d97f28aada75211979b1c5925ed015ea75f693a04c4dd0a705f6a723ae7b79958884c96fc07f81fca064ce2affc70768923bfbca6049952eea3ae048425b7c6ad1611ed4b8b77f7605629b9d198a77a27f25eff2f82867845cc868edee4ae31afc5d022b2ffbf43c14fa01bef8d7cd9d0e58362a0ff9abbf250e43ea5065512cd707791ea4868e95d8fd2357b3b3aec1a06888ae940751ceab01cf9e49015d42371fac30d48ef5853b6894ca83\nB = -2ac904d3632e25a4d536097d80a157791a6aca6eb10246ea21f4cae07aafe907c6e4c726694e14ce12e376c02d326f4bfc02ed539a5b4615a3cf5c838ffa52124f9b843598a3821cf9f1fe94e7206d6a525fad1ef77e7e77162e8c6d3d860d4f568e8f81153dc47f167860cd52c1ca59b15f1eaac6b9023c8b375bb63b6adf6972af8ca62b39f044378b11c4a969f3939d9fed5cbe18c06749956c7acbf963f640a1e1ceab73fc4c77463ee8d1575d018f49bf0f08161ce4f88aaab5a70\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = cbbeda9c467ca801ec66fce801c6765a20148787dc6becb199a15c58fae8d20c1d391a1d9d57e1c74bb412e1b8f271dc2cc53c3355c83f3e2f00f15eaf0df735160a48e2273fd1bd75533cf94c5175ce67e79fa6c1422996fae36ba288a658a7a5422a59d39dd81ddea50979e933efc02\nA = 7ea551efeccda23622a1a5029e5525f46d5ccb83c28ec9adb7a3e97c2b7d936238c483a4a9bc92fe0e21208d5703611e2795b91fd5019272d255eeb\nB = 19bd92c534f56dc4235dfb7efff6d941112d66acf81b079382c86fb10dc5473bb8adebfa53ea3fe6e4df8412e7807aed029694ca786\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a9cd6a0a89578ea773fbfbf642e05935a995a38bbd54480ea3ecea1751370ef95ff5ad0e3203613f0ef6833237d549676a95b720848c5e9897cda82642a2f373951d5746b559bae2d98ac00fae26e5957c61ac1de95318b1b1aa6d5c64a6ceb6575f1b807060f9e2a241e378e6ebd72ade7d2df18d5353db7737caf52f888\nA = 13c68e450e9e091ae45863f6c1faed25906dcd90a43620b1a40e7a506e7a954256bab0225f3678e7ce6c4ba6e3a83c8f04a3491d9bf097adbd98fa6e78\nB = -ddef76382342178fa6636e62887fce6e19590065c766b047073329ea15fbba96f2cf088fa5a989f6ee3f6a513fbf66f621c6ea6ef2fe8\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a9cd6a0a89578ea772021f58ce74cbdd8c44a09b3937b198adbd8e95e8e35541eca26438351bfdcd8600b4f9b71616e1f16cee707c712d40da9a440681f8c8647bc90ba4c68b08ce4cbca458bebd5110222f06b2ca980a2e9419e71064324e8c36289eff9c67f6d5d011e6db8538a54aeff8c20800b0949fa42c38fbabfa1\nA = -6d7e88715e9854b435876fc9bb2d25218a1451efb73ad9cc5f52b2bee929530e6618a858000b3f24fa5f47b5f461c84eca971e38cda6e1f475f6612ec32f\nB = 49eb76e4614ac7b0ed3f534811a4ea6da5ea24be925ffeaa38bb228fa117ed56ae976b590d6c9d9a7a8546d8a6ebe4bba771d6587ac44f09\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 44f8596fc06afdb72a6e4f876b70b8d5d734589f41089c510b0da60ade642fd79cf8e705f09910912624fa1f646da596c137f124ec1a327beccba62a44f228f3c0977fda2af631e249b2a4de17d170df07bd812c233a96d17e1e93910267682d24c5c485f99aeeddceb658a7db258a2fdf73eb0266d26b92e\nA = -122231b14c249820f0dae625342415f0c6e7f93787b4206b79e9ecaeb09623636730810c7936e17a1eece68edc7c97218efb17c069bc59bdb9681a79c910c4a\nB = -3cdaed858523fd55553ef85d018c1097d7b88f6c30060d1e77b84821ca20b5625723c7d4331ccad1a70371eacc7f7aa11220f83f1bf3595650b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6de7efcfbc1e8d2cb14cbe4465c4ef71f0d1d7e80a1d80d9ac2d0b161d45fc9d915c54e33131591e8daeaa11ce02404c9b8494added1bd83e344ad4de7c04f626315caa56fcc5ca2ddd4e1ff064a2957afeb5d280477bf1f1195c7294d89049024fe821dceb53c7d270a8b4653e2fc0a4d8a3863a854bc3794753a\nA = 47423c4fec1eb6779fd23e3d4070d0a7bf9a946f5610eb469876797a39c58577242daef8c34926f6974089fc595508d9c573d0a275cbeaf37172f10b8c849a493\nB = 18ad789cf09e9ea182eaf43b28b4f2540e533f0fccad325430b73101c00e440bb64b70ce0f2680184aa8caea2f6f6517e9b80285fea8b61887a41e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a906994d3247bf8a00f20e4b349a500159d086aa863772e71a68f91af9d19e4c021843f8bb6eeed1df708d55047dc8faf219e00d559517632dbd1cbf4bda61651b9644481d052903be1970f04bb4ee8faab9adbbf858324e6cf5aa9384ceba655a1a107210a9497552ba8a56d5e0e70b0c757baa71d1613683707357827f0\nA = 122773509ee608cd9ab3ff6763629a18eae41be64bcfb05122e0b3e112db48c64d2a5a515d96a042850c1c848ae5fd5f0ccc57b273d25bd8d68568cb00bb17b1589c\nB = -af398208c01ec9700e332f3e694894c7cc412a73bde8a79e08764ded92f0d58db8056883972c79a0c9e0ce810786cdaa3629baeb9e5c370a5a59d3ba\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 64ef5e7063a1d95226569a27218e35e93d870a19a43fba9889a2ca98ca5c573fa56ebd77f1403b3bcad17c1351803a809c245a97bbe32b45e21768f28c5b11ad542f5e687a17f7811df6c8735e1778e94d9313c19fa32a6703af7ccbd88b489c96632d10eebb580cde3b905f6345a2a2b86a871b4fab36fa4b0dab9a6c1c5096\nA = -7dbdc37a51b601417efdda2516aba15827a40ffc304c523a47c544d5c0bba6c1367a20d8a6268a5c3f723b1b68de57eceabbb00d44185ec4ba7ecdce5d80456f8cfe7e\nB = 641cf85fcb5fbacd6214be4b7b06fda1b80f4683c21c1d08311f6e23a15434b42d30a51912898a1c46b46c00aef7ab7663ecba683897825a4b07d2b7dd7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 370f20360ac844bf4275f78b7fe71ba5db6f0bbabfbac3384c04b256eddaf04725d2d57b31afa48f047aade156c34441b4a41c0b2146790a2e15d13b584021ad55965588c6e55ed3b5cf5c36b780a27c5dfb72678d57528ab17ca2ac696aed3d9abb0ca448d9d5789fe37e632fa9709f3bb924c4ce34244d239a940dcddd9c77\nA = -1a0cc5b07271098a23f01b3c0d47cab8b294794b74a8b162ff3b313fcf85ea81fc99433cdf4450970311e1d5ff81e9ba27eb867073ed250aaa7795e44ba8d4000e879bf31\nB = -308f93984acb78c5dac2426d9bccc2e3ac361143807c7d34c24ef8f8db5e68a904ac8bfed1edf3cc90d21c87ae4d224b8c46fa42eea77797f94aa848160fef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4c8f466d1d9829aaca1a22fb6ca5bdba885606b9264933ac2b4c18e3afc0c406aa71ee7ff490fcaa804f457096e44576ff8096fb1d2b3",
-    "c68450a8bc36d1a2797ab8b621ddc91d75e7d6ba01d86e959171fa428a5bb1f26766f94a553c94f6dcc2e0af90d7776ed3d9fb67e842e88f7d7342afd86e2f5d159db7304ae4d204a3f\nA = 57e894e37159cf3c161be9c97a946454e43bf09a7ae8e1437570a86c6b06f84005c1463d27d726afd2e25aebb1657eb78957a9a12c8749049d12007a81d766dbe008aad6d83\nB = 16dba5cf077403ff4af47438f5840f65fa4e058c5cab3cb730154ae0fcc982ea097c6d0e75bbd635e97314f33ec7e31f0e41cf285ecfafaf36382b33d5e83cd55\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 29d13ec304f26247a45ab6869720720fe019d6cf370b9e2df9a65828214aeb4f8b17969b8dd54339d08eb99bbc66720ed78ef79033fdce6da33501fa8588af86ec18be4c4ecfe01781f9d1379865100dbbc020b892e77027d1f04f8171ca51fb73129dd9a96568904eb44e19f56f842b223724a9ffe28826803185e4208f0ff0\nA = 135ebb133a0beb909101da896e3aad7e26ea72b23e60802e54cc6c58a07b1205e2ba1fef6eb86c420f011b70e3f725aaf9fd1873b6e1c1cc7005c7c09e55550414875cfe846357\nB = -e8cbf3feb7be7fd12b01d5bd024e47538f434b496613320ad71f48a8972f687992f97e4b69b5842d2d6a4176a5701327c40325e98b27e4c0f8fee5a457d92181e40\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4309b728306535bafa6787dd79e58324b3f86eb5409d772018cce2159f75832b87909a672b8b4b14342b352e76ec5a6dd66737cb0a20b81c5ce222133bfddfea878b132b6f9fd557133973a0b44aa41a01d54ab565d6b9c62da67378a4058255047a95923daf5f0f7adff2a3f06074ab1facd986d7d26cb475ee818199a390b6\nA = -7a63e108bc9790ab687e0fb8a1cbe1e9ff876e7b5eccfbc136ba05fed93412dbc2ffb1ec49518e9fb867429cea1d7f82e2b159b75bd40eb8370e8a54bf0e0ac0ff24aa3662774bae\nB = 51ee025b2ee8abf9dc5ebf1a4600131c00ae4b6bff966dae5c49ab5b9017e6b1abd6434736df6daabb2bde254022783764c94e66743dc752c9040563df7016a1581fe7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b9ddcb9ab858d2229cbfab87d87236e8206cf5e1a042eb5ddde201d56e2695a3d0b2a42bda6a284fbd2a5b2c2b80446ce88c024137780c277ec80bfa6e9d15397cc5bac98e58c9130756ed0fde58d475a033fd94b1fe0ecc6fd91a8b42177abf3f77e87c0847a4244b9fd4980f3b42c7c955836bc994f2babfdf9c5b43315ca\nA = -1f971ee9a7c966d1e82166503681afc280fab255665b850645321f67da8934baba1226e9efb59e0ac4483c8724f63556a213f2224b993e4e082eefff0056f7aa8a3cf5b655e0f72ddd6\nB = -39309313b04bda1103ca6f56514026538b4a29ae258a2a66424abe2c652b959f5c1dc4755ea37ebbfe404839505c2807ebe069c9abb9150205fe35bc286ca12b64ac46133\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 47555924c31f040619681d4a12064790e981db2c7853efa17e4d20f741f33c56d80862caf86bfe0730870b6c0afa9caf66e15047e60256fec29469d1760d5e9b77d79a84fcf7a1dcd0168a59f870f1635eb033e0ae0ac17bdb73da803206d48cfc1da48507cb812bea540daa2393321ccb0d88b57abdbf3a3bb765692a2c2ebe\nA = 754d78d5608fe8c7ed8e26a174fa27833a24c48d23f0e702454b7eb578cb107da537dda11027dd6b41daad329e036794de562d7623bed8d9b0e909cb3fa38d4d21a95c5f4246e0b030a32\nB = 1839baa8b8fb6575832136f1d4632f72f36cdbbdcbd00f197fff3cdb88b851cbd74910ef6d43cfae9d3248e9c85662d7fb596ae45a460feaf308823f06345bc5fae8823230af\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9b2f026b11d0674e9ec060fdb24b45fceade3070db4405b363d53df1219a02a664882819fe602f430636fc0bda935b14c55c8a0bbcc9b6683417e3ffe7f5d58fae229122ac6e42e76899254295dc5a08ed43c79120a5e5e4124b8fa6048ee90836bd2de51bbd2c6b9b53212e913cde871f11bf32f91b3a78575a006da36627f0\nA = 11402b3b1a45d67cde9730062e38aafe1d04fb1f8bb1975f25cd9098813efa2727cb229adf9490267bd437220d9ffa05bb993e45d2f889f140faed3ac3c7b53216455a830d6edceb02e8db92\nB = -d8e011f18bde068badedce8106f6602429fbcac4766334a0101b57fe94603203a4a8975fa499d8a68198aefd9e68f28e68914f920eea1083e37c67d59476bca9819a8bd628b89c\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3a74066e7eebd9b63a1dd28548be60573c95f29816f3b3ceef68a5f6bb797d7eb0b0f4ee612dca794ff82f5d7461d995b9dcc09649e2587639ea017865328bb5deef17b5283691724e8aa331d75c635d5e19ebfd268fe5471714aaca8b48aeb846f241c1675e18d35f029b132f81128f19028b0a471b3f75a530321135e35fbc\nA = -6c5dca3fb7b85573d1c8899868940794e428171e207b5f9f89fce4b7159236c0755e2959d870754e902e9c40dc1fddeeff6364f898ec0dd669283e6d26a612d9af3c3ab04468707bb8a7827756\nB = 5446269bbeb613e69286f1012ff62ea767965533624542f3b5c866cfb569d6193aa603061701992cb4873ea8b766606da1b57d7b37cf52f52bf85b58309387200b0ed36164f30d52e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2a4e727ac67451ca9dcba648050a085196460e4aa4836c5652de863c3e2a76213e0f590de3aee8639304c54a9dcd5f7d5d3592f647e3d07d322708e1e26329f4a31d66c7f2e9d482f22cd9823074dd57d14040a4f00ac2af9677a2c98d58ee1e094b1a8c40092e77eae454638bc3655e77441d4f218c637f95c147776f5bdac1\nA = -19fa688008a12cae228c6ac4982ecbc88da248d7ec785bf2289dc9103bfa3a91eb1e5fd6afe9e0cc035d3312e9ba64028fa6a229db6d0eaf8af43d8c410be7c689c3e557137ebd60d3fa04edb60cf\nB = -3e8c87fba4a41c3a84874c987acee9f560b9f027338b584a775c1fcabb766700f758c4d451077a9427257334a569037b0bd006375f71223add62eca19b1e26b86dde0cc251e48d3b60ef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 52e4a3f6892b425b935c6f9d1396d2034eb0331cbc5241e1d745a9619fa0cf0fc521585cb9d6b1034c5fbbbbecdc81c757f768c7a82f6ca291cf5afc98500c579f82ccf0be233066730f738c205c3c188f94b878c11268871ba42a5d950dc8a399887997cef2b6b68badec1ca641b88d1455e6d97a2841da49df7eeb766b7be6\nA = 67df01e34a26e8239c8edc7ddfccc3850f39864ed237d4dd67588efbeaaed1f884105508f69e20ff6a5cfae1516f6179ae6fb515a66ef0a7d633ba4218c30875287ecd0cfeb5bafafc492619942f97a\nB = 19f5076405b3c81519c0863d0c963d545b2834343e42bb3c779788cbb46d89be3f775b62f4114268a0ca0e6af6c0dd659607d40071dfe7f1ad0df9a5c53b741c04612158de396e9c96f7523\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8ac1d96abd2cbcaa8f7e3267b716f675aebd23694d24c112d202653979636d4d47e27cc36f850355cfc5ca16b78cd1848944f8759fbf6b03fbb7eb347536a9328a5cbb778a6bcd983081374a3f543b1380add14a9468358009ec2baa7ecdf13e7260968eea74083459406e8889936b2fb98c8b9a3597e5f9ca10b76e1dd0337f\nA = 1c9ab23ea37f324544280d176cc02762db7a39935f1ede9695b53a3ee2db49d0485c6a3742a3b5cfb51f3c21711bf89ed05afd0886bbf61cbd57b23439a8a165484ee8e4c0e1c0ca2b6478776aa2897d87\nB = -e30d28dd01655b7a419d939e3e7530258a667420fc759bad585802c63fe5efbb309cb502babdad0afb208aff5ce5830071c5a974604c69ee47f76fd87e2460a5b03a57ef0185881502625886f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul ",
-    "= 5df0700adbd880a5730d8c0637a362a9d42c64503c3b9784046b946c2459a619b5bf804a41c92ed6370bba730c7d39fb2e01558f7ec38511b0449d6e9db8df2cece4ed348782ff1582396ca8b3196474e7e5817f8c197c44d771923b6e286e41e7e23c33fcd8765e06793169999544a310f2e080ffe13640b85f21a18fa11928\nA = -5c01fc52e86f3a344180bac284d2376d1bd693f20a46479c77fa57077df62f83b1e81c94e577d1d6733d276f9cf70555b20e3afcb97534e4e0108a6cce87e9292d78b2d7367ff15fb33d2c3289d2a2913b58\nB = 6bbc39283be06382ea91ad6b1630b38f32385ec90019d2ded7ca6fdaa39defbe22585be0df9c0cf613f6f146c71f901adf525336f6573f7f43e661c44b7097f110d4551e8c75449da8fd39201ca0\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2a01005f1f387c4d8d24a365708e2506b044f86dfc011262d3577f7313a8f51ab943037361bed1858e021f8a46491a5c73284c666eb65cea1392a780219f13d7188721d7d4b975272293a5eef63480f30cc9618aa74bc51f4175246301a46fdbd34a6ec72d5974aa920be5f321a97b8f19c0ec56ba10eaf2e61f2b45f134b304\nA = -108bbd8824e8c16b81dfdd4dfee691e012e578cb9cc80cf050c0ec4cebf71a968732da36552979ffaccce6667e46c29144dab75132cb087681d5549dc5508f3719e129553fdc97f545d7ddb7d3a4fc575ea67c5\nB = -2ad4d4078c47a3c8f5f9b48e10d52d72349ecf0f54abc60bad63bbbf4d8efb185de90e5e1a686859e1c429e30977fca492aedbf084019e9ceb4490aa471776ed2e8a09151b37c5caed9ede66922b7ec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a1b1b2d33cb610f1b398e03f274ef39a583d13af14b79e6766859b9ca748237b481a3cfd5d490a073e82e3c53d3ff5cb6219b2b2f71927f27ab6f567547a22dd35fb5919e1ed2b6dfae4d536d6d44fa6216d94d26b33f52db06c4ecb29702588b73ebce87569639f786df4fcf569bb07d5379bf8b83743327248c2d71b5dec6a\nA = 5bc53b3895cff2bf7bf10e24fbdc43d17d277a982d5d92f17b9b5a2b9ed8b6104229292ef3997591e2e6a116fca21ad5d061ce438f33b7f7110293770f8313077152c7546cd522ef4054147edbe1878072b1043e6\nB = 1599b541c9809779df3ef40971e7a83f21564bd5d6596d51a3d96defa4dff41e83ca6247969a3dd9a746ab72ce21137f2d7ea015ac6b2ffa8a32997e8b821064d35afde3435b23e47cccafa74d5192535b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4fe8897417446c493725521c0ea5b2110f91a1b5ba236cbb6ff3f52b0036a49fc82274ca949ac2b592fa4bcc792114bf2f2a78a2cb44cb22c6fe7e4bee7981604de47f6da2ed1fc6a8eb32cd9b8aaca0f2feec76a2438126ae6f409645d897769a6d340308f82dbc6a98ac059fca6f903c5aecd668fa838b67300c654d4013e3\nA = 1717c6503d069103f10bb4b36427fbdd2371b30793e492e4161fe185b2e27469fef6a25566d6b46f6a7f97446315a22d1f1f662f912b17e71feb2c82411ed7eebb84d4f594deffee14934b75a845d83761f36141ecb7\nB = -8808f540521c20eefaa037fc5da782c891fdfc668b955eaa2e4edb592e027a964b4cfbc94c548d785d92992abe282d90dd137c4d76419926740ce138d567da7350d89f2e56772d8f5bcc9ca8d7076540fab3\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8b9311808bef497d8a5d14f7d851567a196a051610246964917a1f9d4f4449357d2411ba9fd93983f6edd76b8a8e1501146b08b6e1fcdd97b6a41cf637b6ff0cff7a2d6351aa1ded93f8fc1cedc81879eef751bebfbd1559d5d0320595c79e3eb1db0951d7c67c663bc57a672faed9e14c7da6be6b0c6bcab3d4d515e51a0b5d\nA = -511312fce1849c3d177d42088e55d534f9f7096282916e16b041f66ea90e2cccddab5cec0ba8ebf0b047ccce72da349f420cc28ab19bc156c1cccdcf5216f19ea922698127f090e97444751dd58fe7a2c90197a9ab3d35\nB = 6a5cab5e322d5f651f798aebf43a62af772fa2cc379905e72d253c49be8193a07ae6164f21cf08baff906ef800e361e1cdf1604f454483e10c8b2bfdcce77c12b0320dea63f9ac0afbb86115b656d0198aa883f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 665e16ba6cba87c646637a233ae04805a302ef4a10d79c5b65b146cbab8c9ccd491faa32937d0ee955dff7dd0ea3f79fa43c133021c8680490b91d9c1d8a8102ab709ada7508bd59042940b2bd3a4f8c195f781313e45fa8d3abda1f8e13b35811b638b2ab101d1caaa92188d2b75b2b10d596ab159583135b0d4d15fcd3d882\nA = -1375af024e9974cf8170801f4a709b4e5862ab7d18464077727bfc2581e557cada991e9484a1acf80182458158c44871e67e783f7573f214ee4ea1f1821a65068f2bbbed7575f03a4bba36b0fa8cb6dc58c73b100a6c4a6ce\nB = -2d64b6bd987d496a3c121e89f4b0c88b6ebc6e30fa9d47981b52862551f3b7251a3fc376db0f2d6daab6e6fc5ea8fa10b040d0dce334ee91d8cfa6db9648df907b199bb11b2b5c41c67d72b760c404b0451f70fccf\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 49e9709810d9f3fef159e5cb45211453e7a94878dfdece19af839b89c0e43b226d7cfd46859963c7ccc753350e74c2501131474e3b8e0edcda18583b0392ee15f1dedcb7144000fc7fa7eabcbc83d12983d2ade477b4687d75b723c1a98a951d21b2e8ed95735aaec77e00de288d16422fd259c665a08a34331cb99299ac11e2\nA = 4e550ba2fc2a44452f068860ce2a59230738a7a15f5de0aeb4d15bda8c61ee3003568dc5971e48343d402112d7a86860a7f08f5cdc0de21fb1aa064ee5df26fa23839b5ff6adaf64a4a18c07efb3582c2fc9612d2208fe99f8a\nB = 16f31365545772f276d8ac952506bf4033a884edf1ce583a63d8d9f6809e29d9cce3b3d227f839e6c09b459951465ab4570d2d36127c0f677fc0a63975801896f2fd17887ca16ff7f265e2e7adab1516ce56ee1ee9de1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 89ca20a3fa109a65b9449edcc729fe97ed45a9bd69eeb31d4a566ec1787b24cb7a2c25b3f89b36fef1cb3645b17c69ac8ae243cdba35e17f5738b35278478bcc391add0b5ec42db9ec1eeffa63a3ecd2ac0338db57cde9d2eb9ca4bb1df84f1a62245c4e585c4f20f26c98fa1957df34409a99a18bb442ac14f0bd309266a35a\nA = 1fd8a096be30e4435ce8cc604ded337a3d9d2fbc9666d1893c38546c4e155315b536d1bc323c1e7be162bb0fcd58440915b053ca0d0896e99265241f2afd46605a2a7486e1394a07b23f3382cd190e943e596c747b6529b04bdb13\nB = -a3960a51af5ecaaa70146ce55d639005e9b6b9b58592441d5876fa71470ade6d1e2cdde17bb80532551bee0dbbb71a0cb24dc8a129c1f6e28920055d87e9c66be27fc4b425737f36add7d72e39bc83aabee5534637e2e22\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 654d9c55d4a62976670a5ecac3a6165734a65f1edcc1ca81a8c444dbc98c3409ac8c4f6fbb92f122045fef8b7971a276c7dc4eaba21f7be7495394053d4f9bb14b63fc02c8a55ad8fa9bb9aa26aca5c47968ea1b7646ec606f53606d5529ded83639984683b8a020e8ded4b2d9f668ceadeaa8160245b36a819db14e58cf2bf1\nA = -67abdbc70db183b8c25b0664805ada269922556bf15aa80a47d31f215e216673b8d59edfa10a74f3f09d066055c3b9abd5434ce95eba91dd51576adcfbc7e2556df95fd6642a3b7e0486a635ed5699eb7fb285589c887c8659a2b7db\nB = 6ad3e854ea57aafb8980f1e99ab9cda24f183dbbc513e1fc92d4e239077816843f47927bac28e41d3f31c9ef134b72c09dcf14e2e9677a430d43002ae70c577d9958341243030fe58a800a068d6b01fd377e61844f0d434dfd\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 74bb23f7b0cde7924ee52e58bc0680f151e6898cc1bd4a2eaaa05faf218b419a19ebf85b0219f924a26002f9251b83506684af659e5b680e05138432ba227977f38a479ad9d1f3cf68a86ea214645fc4bd1a032f995307e9c9ee432e816fd852655ef20214e24522c17799ef41d1eebc6e097b9792757f7fc43124c609ef9696\nA = -19d3e",
-    "6fd6de9092cbea55d65154208a0c93ae409c3ee35569cf774b8c8b7b1c9dfdd52e9f408e14ea3153073ed8d92746474e524a903a45a882fe46af92b033f2c41eacdd7e3c1ff661dcc5349ed6bd1aa845eb1762f27593708aa185c7\nB = -3d466d29e8c0008ee6f402551e3d62fe044787bc9f243db9252ea97da9bb75f5be416def97f13cbb008fee77f2eeda672bccce1f36fbcd26e1f1299619535da0a3fa3ffa0c6fee82a494efd7407cc770cf46ed1b8b143f42790a2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 197eaeb8221b431d5fed3d701a175abc146a9fedf8060e8e611a54f8da2fb27d2fee4539ddce1f3481e6a64435f09a2d5012540d6069900a332461471b22192fb87b63221c7822d3f2fcc35cc38feb6b3e49b5b0fceb52b0ccbdb4e1fd7b0f3eef3d582a6ae194c249ebc52f215b568712b3e50bb8e01c64b114955ebac2da48\nA = 7bd216d0acd4ee392258a7341cd56bfb0968492fe75da0c9d935713a6ac883525a4a520b5b7940b05e3f5e0c40372cb11b7ca193e93f0d3883fe5840e66346aff0f38829322bbc1f0a0e63ce5e528ba5b13596ad7ca19d20b2a7c9bea4214\nB = 1ed4805e53630b886cd733e5281f6d2699b3c79da615f4056120165cc63858ed2ddfcfd0af0c5fc54662aad90f26c55dcf70a30d04ce05bdf61028730b900587716e690dc0c6e02419622ab8c115078b92315e7c7a5ffe38c4a404a2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 40f69f2d1660eeb6e1840164817621dc95eb930875333bc3f62a644ca5910c1080505de0d54fc9fb6404a61bb2c03b3981e558abf9e86f2047c3928599b529ef3d91c7ccd13c1d69431fb9ea3f02b001427cf519d9fd8182219ad904f47b3785fa05ed24cb0ceafd537311633a2e26c27e61be92eefb28a49d7f583cb6e072c2\nA = 155fb75044fc54a6ba6c46972e2f97531861b8d6afbc358db456bac33a44bb0545deea2fc83023c08b7be473eb68accf5b65b3c5d6af88bc6d8ce722c80d5d1527e475905226b01ab9d7b5a6557250cf8be935339db330df2dff92f2e88e80da\nB = -8c6016966a2cdea4b2d8625aa367e1d079638870f1b61e6b3c3a1e6281ece41018d2ce93684d1f0088d021107fb595390664c11435c6c0a7b93c2c6895217a89c469a37d3250dfa457b928ba6119b5c9ca5f2d47b36e60e4325bcb4383\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9b9e6e1727326fea099eeb008a36539f3d47e3882b77d6089032b99c6cd36ad79fa75b7c19d1509b3ff022ef781b6a8c16fa6881f9ee2c4e00a4dbc93a49829622f4ce6ba9c55639656102d81167ab8a5e1fcf14d71caa60be732f1fbc71250256520c7c5a4579c3fdafc39356a2bbf2c7ecc526dacc0293c7578424c939ab6e\nA = -54cc11ea9806ef27911ba721f19e2ccb111045711d301863792f0cfac798758f0a29111e3a0f84d294a79721067f50858767abf507cc10ec9ea3eb27a91f06e7f6b7b4be7001b548cb7fb734166bad6739935081bdf6d35d58ef56180d377e5fda\nB = 7263e8b9a6f5387f44c55af64b64160efe97ec8a8159e723ca8977bc17c861e22041ea227c9c9bb467faaacfe352b03cc620eceecabb6db2db108b49c69752bd0cc61a5e998ac2f404ad052a51286ccbcfaa214ea8ec14cd9a2a6db56c3d9\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a18a7498ac9194f600cea3d66615595c27a3efa7ea196ba12a80b5f608f85fa72afc366d23f5ca98452dd190b8f86031a9dc097f94a217b29fa676a6042a3aed2355cc8e767d464a8adb888491c8cb82dbec8f117f57c4a07b41e7e6f6cbd7dc25418603b1d1d865dd2140a649c9d52019ef39dbb6809d1b28b3c1ae64fc6813\nA = -1b663403c73e4a9003467ed12766f16354f79073ce89b66066857d19f3b42791eb360004d23e02874254bc6db54662717739eced153944c4776f334576746c5c4145b21a23caa2b2a137498554c7b749efcaf3393c5457b2bb87ee2ca3bef5f191107\nB = -21d12aad97a5c6e639a2ea0a82b1292aebd418567718014465a22b9ac5c8c927963a2a4530c41d5a7a6c14805e56a7092c8716e4767b54a393d8552c5d3c366b39fb3b8667c60e6075e9293bc938e407c53afdd1174843b76aed187f56bb4be5\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1983576ed73d4d87d8b94cd3f70c149c0273e966176b85fbbbb7b3202e2c843bf1f8f4546ad7a4916ea4c731a22bd337b6177fcd2da8bd301f3af9bdcad800449b57986e7cbcbc7eb313d6512b2894c0cbb6cd753a870860a49d6a682c20b5e883b8c4839b3321aede51bfc42bca163a924191feaf05e196d8dcb7fdd9941a60\nA = 576759af0f02406e8dafa330babe9473d9d970bf371ceab30d2f98f4470f669e042e1708e2677d52cb9f99deb9b53f30727d16c389bb63e71e923475314b615762c7612269b5ad7bcb5108068bb5159cb8dbb8d08de2bd4fa4d9db6cf6e3f5997b9b416\nB = 1a4e34794747cf4aa626e964b839ac497b1357090ff63088f9fd4399312df894e41b395d17b8ca1806baec6115b1476912ca9c4309f00a46d5f7a52c8f640075422af06d6d6d796359132f4955072ce90e61b40c992a155b2bc31c262e753aa7d00\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3448648ff9f7425937b6faa54551ce14dd15566e5d41b2bdb1a8db62037459235a5b9546d289cc2295b0ed584fab2e1a798bc25a0c114238f61ad3381a5b441cb67f92cbf66007c980db3351adb9cfd2cfc769b5b9b0bd1701425ce1ee8d4b9f438ce1207fa850aaa1d3d1f970aef874c2b2499a150d29c2ceb7bac375009b77\nA = 1fb54cec882c274b98913e76342a9b8e631bf1d381fd8a4f7e0eaef475642ab3f5da70ca2e38741bd0182a959e5e985f1e0e7d737beb8c725c9b5ea22f7ec25b6e564809601e8405a5b1362e7792791f55ab64a57c03a99a8518d7f65feb0e21be619a6a95\nB = -8180d172d3afe00e0423245f47591d5f750f20d2cedd8ba6ab6f9aa24f74498a96c9001a0124c4f98dbd402b63e71eaa3a7af8b0d2fa417fb1d45f64e10030232b9155169153496aa202745a432e547002954eedda7cc9c1ca76811bd902b192f1a1d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ae0fd585408a99643271eef575285a6261a4c4a92c1956b1ab436d3cacc8d4cffc07044e57b357ffa43bfa9aaea57824319579c5c3e2fe4dd48bc818178beb5fc1ed60afa08828657d00bb88894c975378b1dfb452a5b88fc3c1d81099644a998a47a497c8a2b12c444fd2a088f47576b7f4fa40f34a208fbc3348ce33e59150\nA = -7dc7dfb753c0bc3ab4d07d5aa78664a7f57d64be4d4780ea81e3efc967fbf1bd1390248bbe259da32108ad96bd8b39f2c9f118bfdc96bd06147f812af831288bb687e4e1742dcd1dbf2b7adc41afa28d07dfb8df8bb2da5359e66330f5c65964096a96b31dd8\nB = 756f3e407a3ae698f103fa37759e90554f38378a9b8eb38581e0970ec8f9c00f8392612c61aca5fd37d1063b78c19e3109f35c0684ce523c634190b3164ef06959cc42e2b77e1bb2fd50eb59c3dccdb6090beb809ecb0ca30457a5c5948328eb218e219d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a2aa4550e855623a8ed488bb63db8fa4ac374c1ae953781aac590f78a364fc33380ca2806445fca5bb9ca2fc7ec4db5819dcd5769e3b746286c49a7c80149e7fe276d095929e2cac6ae57e8102f7d4c96261ca44cb6f1601f429528495b6c3169e15f9babc5be696074d45559d5abdac42393094c450d6a4a45bbf60ed7847da\nA = -16d0aea9c752b2e6e4e13f7ab1f0a2c1776874967b0dfeeef7e00f8d9edd1e11d2aa702be45fffc284c47811c51dcee184a134b8f6d1874026eb51e2ec80c94837af4602cac3efde556ebfff578fcc56c00de99a43638ab68387ec087ee269ca64233eb5b1762ae\nB = -3c6b60b0ce4b13a5d6d9ccd67c76ec6b71b94ea7205e408eea099c7ced2f3a462954741d353d0af850b10ffede8ce0bf80b6893288413674504829793d7ae0cba53b163e3f26cd99beb0a9ad540f6d2cd5097beac604b1694a9a2f4c48b28338f9d6a63e75b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a1a8fcb68c53846b3edae33ec070ef5cdcc1346ab3a98a116344e6d2810e2e3f60f0fe435fe7ff257c7ef4c122b3c34c776f4912a962",
-    "1b6949308e2cfe2e0827536c7464371ce804bd7cac1d76c5bf8b4a6fd4ed56b65434c3fcf0ac7be543fe2d09ac01c564d7b9b463740dcdfa9068d4d8e33f29297ab452e6ec55c263de\nA = 7c4878334ccd9e20cb11a643b206626ea5d0b20973f18535cd8f0fc2f0325a67d3558e4cc9cceed0d88c6d2215c220b8d0ce230fd701502b02081e3f6548e58e02bc2e79e4991f8ef188a84b0a367758b4e534b72cd87de7f82a26de14fafd162a50b359574812cda\nB = 117d8b1d2a3e2049e6edbb9494c68a97145ac3e658aeaa05e8ecec4b090d5f467cde34e05fa7f5fbfa32f1d9dad70955f22130c358468eb371555fdf57a40e1df398c166a22a9df2e1f4e18590b00856b4f880f6629f1a4296056dc66a29b6f0f25490c6a8209b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2cd3de06953acb87b773b8bb28172b24adb283d6adada676f5f4548990827635c51506c85670767828dc5b4b91b45a7ab89a700d70bdba4e0355da32b52c173305767721d18dd2cb6c55f890611e7abc854277a453c7500efc4cd4fb8e6c9bb7a73fe5c77045e715fd35d415b3496f7463ec902cbdc18f9f6f67c33fd78c3210\nA = 1a20ad042f46330df937b879c72ef00dcf39fb85b59186b8e7a9d40723288677ff6ab2b9bce95f34f2de37887c8a9cdcaf231254bd00c7e25b6042695d7dfc05a11765120d1dbce29dc74f35aa1492ba0c5ee65114d9a246b57dcc2eb2ea4a310be98383fb934121db20\nB = -f8ec67323cff9d53499ceb3afd44b28f0538c39dae8c965ea27d645b430c2f8a4965eadc8ed864f2549eb636ec558419be71f986f4c5783d0dd5253738b876d9034735bd13b18fc670438387f84848308d9357ec2aa4f6a453bdd36ff08d54a6800bb41df416b17d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1aebe2bc35eb2e449bda63513b1bfb55988cc8e6ec8b3c8fed5ce4dcf53b95f1b438c41e3b2348412b35e1f734edba30273935b03d16efaede429960442a01849c352349e23b4af88de4d01e9ddb53ae900418d49a84b7fadd2669261a574557c4fbd782f8e8f400895f6a6c9679b72983ce01bcfdb641f5067c94694e9eb80\nA = -5f97994c39265b5389526e3847876a10aa3699e3c3762a127d1a9f892180cce68ca6139a6f71b235da26c287bd3e1aaa1436746d983c23c3105c33ed2e06baa1e880f1744d81a80b98ee1f16220940d721a92118a9b949d4da7d1477db8f5b357b3ceb7df34eb5f62078cf\nB = 4bb4f8f4f4c8e63238e8774ed61a7eeafb3fe9a6e19cffa648defe82f4846e3378c892d223957564fcce79596151658a726031a6921cdca0adf0f5325d858c048a6b94312ebfd19b803eefcb93bbfaaddef120ec3b8c366b6d978524d5c74218da77e4c3b5ebbc66cf8\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5d64678a32c163874d1c81824d628a1051bce3b55c37055acc47a8630d3fee648df5d319e50b4c56f465bbf696433409b89c07e442425d3018a059ec757d77b3a40d516ca3148010036b003721ec9c999665915a3c442d95ec3c01c232feb201be08c88fa3c6b0769e3da30f1d73b66f98e31f4306bf4e23de78e74743b224ab\nA = -178d81e419f0473c426e24428caf25d61b648bbf963f7fb753ae15e5ea3706b53b00bfc8fe917ac9fd6c7096518584566ff71e6d35197f9aa25107a235678cf9ff8ae1501c1d5a15d2a27d39d066e169745e1e8c808209bcede0d732423d0c9cfbea322ba3201ebefc5315c0d\nB = -27ed464895b65d9518923fde5caaac0c72aad0d1b38fcb7827d6ad4e0c8dc09e119b8b98183f0ef8d5d1133f3f108e951caee035bed0d48bbeee6d1ddbff5864bc192b84eb8a500cefd223972ed51c7f720d1736646825f95f2f10ce6ad47a267bdd8c80f65d644df158d7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 52dfb6bcbbc5cff46942d76ba45301cbff76e9b894703a6a7fd1af29d615336372d147c3932589affe5c6533f28d3e6a57ce2d3cd7448bbd81e09a13266ea31630cf044f654b87ec3fa3294eb65873964110fd42d86e78d128bead5f117cac98145051552cc3a86c193d738b973f866d068a8994a49df3fc7c7314fbd9805e80\nA = 797c67ebdc083f3c8b3ddf9847b7f3c2a39e35ce2119f746ec87fd5d86671d8fcf2b4f6d440c43e93f45019032e629879799eb58adea729d43d2e40ede6485143bd35979609a12faae7e4393879c40c0511c886c66a24454e4f9912bea944eaa417c9942f09ddfb227feb14e4b4\nB = 1a599d1cd0ab3614f50b71b93c999942bd3d4cbfe7900122d5083151c71d9e0c299bd927095c5c3291418424a7c12947389bd4e0a3c2fdf67b3f512094ec0ce5b52695e527de2b3804dca2edaeb1ea4b487911053272ea926cf2fb3386dc4b1dc268b808bbcf4eaedd21168ca\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 99bb9082e4537426c61f3b813f8c97675c44ba9ca418960ca6e2464cf61ad4eabb01ba00798463567ed3d829d3f14201c740f19fca623b1e9b57b534a65df0f070a2130489afae89b91003cee432fab11426c4d13b7721e6f9db1bbaf0adc0064b33e4b9f4b795511a0744b52f93e3db7bc9c0a991e4e122c463ff344fe14cba\nA = 187a8144a0045a92dcad94f0bae7285309ec8fac7dc864b08914e5a4dc3b1a6bb9212161a18c22682ace16a4bf3c03dbaef088b09844902a3255fd6adc0b7c6397dda86d6ab67204d8061c36ca20fd4bb348202037b249f6c110c31580148db46dc5b1bfffa38a683a27054c35326b\nB = -e93ff16817b725016279a32dac247961ae9bb00af890fb49c4fd8cf5e815cf98b58cfa1e3735095e6034c9a2f2b5d8030ab30e2271abb45b347d755cd9ab5ab5ce37950380cb306bbec42b6b8056793a0955bcaeb23e2d6a9548684030566eca2d34c458f224c8e337cb8e3c252\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 631f53d02c031f592b3dfaeed106160488c08e0672083ff195b22a2c0b006f11165a245acad6f35dfb15a871a9a2b45c544111f71f86c920b42fdb6551e56c55199e6173c00e27c9f47256349a80236bcfd3acd1730f823031ff9ef594725cb9429ea183a7fb2e03124ebdd98d435313e43819d995c4fe81fdd4ba718aeade94\nA = -72e20f1aa2b5f2c4218fb9e11ced3f45a218f4c83a2017d97d0cfbbf227c9082cd43f939c8909e52c8795cfaa75d80392d3649dd85ddc35bf1cc54ba389bed9e9dcf867da1c05eda080274beb6b868b54fc85e12ae127dcbfffeb043f9d59333d0ab3374c24971e1bc7269450b418c8b\nB = 61cb021a3a957703d14061c21d3b0fc19598e19a17df9d6f2418c76d4d37b3f62bd4037aeeb1eda37f83df44c440f5e49924cc72ec5b153856c6b621350ec89d98859d9d1ec7ac4f0c418c6599674322e7d618c5ca588d5a873d5af356d4771c6cd375f5dbbbc69f50b982b8c4d1ec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4654a62d9491f28599a976288cd2068d8e3228da12f645413a92f482efc66d1737495cd4a4c733f147eb5414a2ef6266a116ce264491a3463c9df1b030d83b315f76f3bef8cbccb5c538478a65092547b91e991e6be91ce4549c3a6e34aa7b466e63eb3b88054f6714083695c616a078ed54e1ae46e00f3593af845fcd0ff51a\nA = -1a342c154aad619e567fd32e7053aef8d98335a4fa0e35bf06acd7998c43d821de1076dc1fb67dfa1156d7ff30203ec736384a9aa7f5f08cfb302eb3a2a7179b2664094c2cc0df73fa05bf2af24a62b8e394fc76014dd83b434df26f8a67a624884a0b9b4f08f33e9828ae64f5d0c8cdc2b\nB = -2c57e15889c3dc9c94361c17585d506933a72fa954ce44dda9f5e33408552ebf49cae87bd0be35197f887fc6c7deca1452a4345eb67d19bd2e7d3dcf651667a8900388e4d5ec71e9433e3b01d2b3d91bb94d0fc3c51c70793f978e4b5ef93a9c6356c0b2f7accb9e4eb457a2174b50dc6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6124d9ce4de2880ae3811836235d6d89a1a4b710f1d5a517153ed7729dfb5b56b0ac10a4bbc811db9b26465f03cda355701f9f28c5257fe288743cc0789cc54a8661f46e36eec357580b00a84f1d4c8e3d689bbc18242f1cac30a87cb7a47ea06f80d7c5633cde4c8cd8a1a7e27acdc3a2aacd608cce9e2efe7864d41a56ceb8\nA = 7b48a9663d914e0225d7275e965d866ee6649d7267474d5336d28d54027ffe8572f4aa26230dc7abe9957d211e6c2c8f3185cae962b878cfdfaaf6cfe32058c299247f372ae170a1f7cf71380787f6e90995da9ca5a4be8ab1ddfa8e6e5dc65b6f168b9b8e29e0257e0eec853a6e1911b1afa\nB = 1fc4dc77f4a18d4406a4ba536e500a",
-    "ff68d133c6e7725717ae6537b527c6f40f93202a2292522fe7d04e0ef804d1a7013b04cd3d88462fba31534770b56d2e5672e8a6ec7a723186024c40b4717defd1433b9967bd692ef81d5d4e39ba10a3223d250ab6e71d5d253dd0a732ed386ad57e54\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6443de73e1c826c90aa36fd7ec5d0c3324c42058b1c35d3adeda1685470d363732d23cceb08c3f973034c24fe65506bd33dc45d7d617a53048dcc103d3d1b4fd0534586c2fb7489ff5ffb98303bb068fc14b1bb6bb43f763dca2c891095e613bb7b6920163aa6cbce8cd93d9d39f4512b6e0b28d361ae11cf76037eab4cbc819\nA = 13f739846ed2c3aa0a1923168cbb46f4f0a2f3942ba57bfa5c426cb4d4b3d80d9530405a31bda329a1814c560d54defa3e03fc4f808606a598607783d539dbb1338d5bc0c2e272a7ff6ee6f93e1665d6f5a0ade30308fa047db086646c763106cb875e014e2c18ff8837e4d4d86861b85a5b7197\nB = -ba019333046f76325fa9f258006a7c10d27e89f6d482b95c79296c07a65b8e3bff4a9c9fa7e5d0038da129390ac851f8c0651dcf655a3d4164a731cd20a701895c12a906c732906038a8e459aaeb293fda21346964a6d53fa3e370ebf43c7ec8f66229405095c6a509d0fa15dcf45de8d0e901\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = d3a6fdf4a26993edd175de9a0f012e1eb15a5a1c4dd2741dfc6d0f9177cd5645508b8ab09c7fb34066ba893c38144c7f2ecadfc2b0d15728b407e5db4fcbbaf1871580426400433f14dceac43d28f03376e791b7ad01a112981f29ff4b66102305f0ecc4fd134c2cdc79a5e9d9f085bfcb7e6c187980e68b6c7639c12e8d200\nA = -464cb16fdd395e32fdc613c63ab4768f8cf72a5b74a0a5b0cc581ee4aad1972cd97db7966d3124e30c9a1c80d85c46da2d36eecd7c3bba5866f9eab4d0fa55b2d440a311654466432c681372a80a7896c9163c12314ac51f652aad68fd9012dc63fae6c7673c5da8faafcfa1b4ed5550f2baede5cc\nB = 40389ba4d2f5fc152308c9e8a8c36258c770fb2d03e6189b96c4f8dee97ccbe426cc14595c8482e9e22486b61fc570f0e7aeddad2f4e3a480d4b75d14294a3b912928da5692043bd98ab88ece87a9bbd973ec82f990c0ae6091245318c2810187d69c38fa80e835300ed06c0723fe475f3fb22de6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a0f9eff3a210912828fd7b5f2d72479cc9ccdcfd3e8d21739e301de02dd5c257c7ce4bee2def06c9d0c90d5a86bc45fa9f31e456d353775916b3d5684759e4500f99ca1f91f6767a5e2f4b735ae4b756d56c358a06447fa2c2ccf0ce667be4ed143e9e1dc627a561d92ae53a62477270a7944482cbf671138bd2a85fce92b08\nA = -1da555639228fc6ead68049d836d60a4927ee77472fa0ffd3c787d55b6067012560f5b1c2ef8bbf6119345dc6419444c675c1c9cd50602a93ba3718a5b3e1a30bc108d796998b24474cdad19bc2960b295fee97e03f2ca7589a3daf35bd28eb37a67b5d2cb35a30998d5f8622bd7e6b7d3fddd1ae9670\nB = -291fea1ae6dd1c66c62ae3a3d22904f4b4adb2a48cb795d50074095345d661a033f67b20c5d7231236dab871892deaa9458c235c342bc81457cca3f014a75f5124ff4da005dcc1108e75527528e5cc9c051a97fc6cd202bb9166f9e72e366bdd77c965a70592e5684fcaaf2e03421a2025ca190fe158\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 50f4d25875150bab63e4162265a632109d6b4743f9d6b55306858034732a4895ffb3720286acceff287c38320ee9945dcd0a1bbe5ae1456b7f36337cb7d22b679a6821a450765471257d52b6ab7d59a763e75e9e64581a93aa54761f6a760866d6baf186cdf4ad2b1a6af26a3e76cdc261d1f07b0a7122c8ffdef595812e7208\nA = 78a1609a7f08c93c9bf9090ca7c93459aef815719b5dde5f217567a9f68ceca05594f6ab17a4666ce1c0c4434e0f4f38ca1f33e501d6958a10da47211cc011da219d4373d2bec4b7c6477b1ab3b00b6c45279212db39bcc11d1e7ba49916c4271adca7eea531adad509ae119348f374ef1203c5af8bc019\nB = 152b46095d3f8db5e6e1a9e3f35c085da00e52764b261c3aa775ecfcd38572d2e86bab2f4bf29c2de4fd2fb6f35f66e8685714634e1be980773526bdbf9c43b1335c5d59f4dffe1a1fe2495ff9b7a3fae3e53e7c3208968e1ad1dd1dc8cf2e2415cc76dfe5df9e2e1eb63f7c7687d539706502d56247728\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5a3ad8d6f1b0763b77f5d40169ff0013de638b459e401f50f4cfb505565c8a4465e28ca1bf988071701dbf52ac456e01e170788ebd2b7cccb50dbfe1a65a89a8aee18b3c11986c9d6e6571f964f376f322e10a1ddd9310bbb40f14b0680385c40975aba43153970237c535c6b0e2cbf6bec918a8fa26cb2f69e98d77215c23a6\nA = 1d5c14b0b51cf31e9d97b7c49cd26097d40454978663f8a74095fcbf9c63e533708befb1a467f94cf599a41220ce13493a273fc30c49275412c5205db712d5e1832b39e65c150c3a4b251e2aab853e4ecb4f00ee5ce6982ef9215775a33565bde3ddbd932665aae506941d3ee31b3f9e4ffc0651f1fb4a5c6d\nB = -93cae5dd84584a2a3d88028d6d4cec4146cc5e350b4d92c52ba2393ab69fc1dba96e244f98e2f93f31230904169641aff30dfbdd3dc5fb1f3489d63aae1efd29335345a79ded546e42f2ee4a70ed932699fad17a771ba65fe6e689664bdd1135219aaa905c962d39531eba3e82c3425c24041e17858cbbcf2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 61211c706730a1b98c628b3c8cb070a42e2ccf9fc6302bb1c2960fb165087f210e9d93416ad9fa21634a05dd0723cc23b8d2a846ab7c3bc402999138433725e737102094db5792249b4b5b1514a416b80c804ecfb04653c5ab18b0a34d8777f6c2955ac66fef62c9ec2819f0e3c075920f951f86b32e02bc43239d9218580067\nA = -46c8c68f492d8f7ac7834f89bc76098146432c59b3301d4eb70d9861a6e24c7c9073f910108c7b35538a79de10640291b54e5755359baf47482b97af56475211573576e9412ee017dcf961a090a6ffb5cd995992ab68e3fe60b6186f7595bd9b8acf8695c4f7359cb2ac709f032fb993d16a74822b4935536453\nB = 46953f424d988fd20700ea08880e7e09ac22d60cfc294bd4aefe637408a3cacfcd0ea6822a679b68b665d6bebed3506d25edc83cc7154b83e22953f9d91157cebd219cd5177fede28c63a15710d0f92bd9e542a7586855bbe57a94c520408fc920b3f8d65b194af2b2a580c90db1cdb27ec26ba929de4573c6eb\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 50a063fff02f2cdc68edccc23976f4b3db99641073c85709626292b9475b9a988fb8509a6223f0a517dbae0cf7cd39dcf1e8ae75196d9f5008c661d8b5153cbdb9520c71068e4719820bffda4c393032edabacf99339e0cbafddb6042ef887b8c498e87e16b62417934015172e63e7457242b864a47aa10e203f47320f03c0e5\nA = -1740e8be7b4775725516d37ba643fc64203f3a61e6b0164d112af56666ad97afb0059c2c4981fa81d72264f8669db4e50e11865907655b1f669c88f5935cacf1b12c1db63cc84507af12cf0210f990994055d04d93f148f213e3d4fdcfe9dc42117c059897697914e3e3fa8fdbf0eebbbb9c3b9fdaa7efa0c9d5c93\nB = -226308f8fbb35b5f9d129c0f6a2bd3e5c272a408bf32020905acc6d02d7e506191e76a3a2ac47cf7a63e6306b256f489ca5cdf76c7c3eede175ee4a7acedf922955e92599647b69d463cc14f2b178b88cd471b8a1c1512caa66b6d5fd8840b98b8d070e6593136e98cce9643e006b714388768920a79944be36624f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 747cba0d1cde75dfcc0b2af9072c5027986b3e3917845870c73c452858ba21d6d1615eb71ae1b5a03ca44e22845d5432b368541b52a4bb02498668e8b99dfa2eb90ec1948d90564e6ebc388ee9816e329e1d8da0d3e2b12d901d47e22e8a1fabc37408be0f89e7a4ab0f30a03f7e2ed817006809e69c21104d0efe548165f64c\nA = 5fa76e37aaf0eb3d34d4f4c590e02b6c63fc62b1d4c9e172cb0dd82409df87ecb43a1680a2764f62d13a5e919db2db08feaf98d5cb92a859dd42bca1047ff57b8fe5974fb3ac11ba2c0d8e2203750f30650db4b2cbd31d07fe18c4df84a0dfdb30f9e528932c097e89d8f8be6ff029dd970a7d2c2551529455b9131e7\nB = 111199f91b3749f8cecfe90e9b9b6951472cb701beb39d63068c064cbb2a1e1d30736026f781836a52ad0d828",
-    "be6c20303c6c0bd03ad664dbf6044a5bfb67fc20a049fd37c62ab0795d836487b883768ef7c8f427eb98e5ab6621fece77b4955822f8efd190c417ced398c221215b50e9532a869eceeb605fa1c936554\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 646cdb3ed472a7b4599f02329054846a8da173000eee7533240ade4dba82ee3d7a6a92baa3783c19dbd3f76fce6b5bdd83f1f229b1c71a6faa18602e368f1b0b9f8c62bd8c854844af85c2081924c9a153e27853b2a48147950fb614028e090e2198e613631c95e565c2b9b64a43237fd4052089f9d1dd2c00525dd35fa946ca\nA = 1c8438247c0ca376f508ccef7933724df512f9e0877596f7f4ea73dcd824809bbc472749833b537eec01ab23656e9758da22ab8a4aaca1aab3fe8d2cffa6672ca0c44ac029c2ca6c3e71780c28c31b5f154c8dee782f6ba009a69d83b1a3a03a2d6275bb8bc3932a1170470fb7e405ae081f4770b535edf49f73a12ba589\nB = -e365c8edbca8dcc4cc11986a5a901e4ed0adbe89b0ab70a53aaf5821862432a1320cf1850b515177b630e12692cb025e3aa43e9acee0d8ad5e48bb15e9a3f34cbfd39d285127b52dde58751f572ae68ad98692899ab12d35e33652c4426ec60c5029e51f7e32ec3d2031032aa7b6b2b63f84fb0023c81d031773f3652cd6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7a3e22f4a3f7ae7512ed73a07abb5ce291bc90bad507a5ccc0c17185804b9d231b0ae2e72bf270dbd60170f34b240f716529a449abea0b3d98ea2890a4ce3d9e2214819aefd070e00201e9f271de925c4ba59651e55174c97a13a30197e46997c6c2b152548111aa98df120a617c54b71f8eb8b0c8b4dbd5251f5509fdb8a1a8\nA = -78a99d206b4f095847e9a21de273aa6c47034c9afd4c081a8e93c2d75f4ae5b090921ff5108c863785c413e2f7b4a361506fb66b7561b8b1c5cd537e90274bddaa4e91ce74ad81c6dfbfe1a34a631dbe455d74ed9d041a9183da3bc469bdb214d2ffe893f89c3ae30f8ab99c3aac4d2fe864b891fbf4f537745fddcc60504e\nB = 5c41274e9590c1ea44c113ce505931758f2cef80ba3b10440941ec9aa2ac984b29868bece2922eaa225555dde84a8334f1caede99091165151a39538e5b7390e81df757f521236314239c213e9b874e396a022f04629c09bfaf929a0e9fe0b0c7386b0541446f6a2570491067f64e662d8611c4fd6d1c78a9f3ae69f34d14fc\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7fd27b6549494c9bc860146a3e8ceee785ca03faa94b0ce0a964844e7871e813414cf3f111da49fed1ede5e71e5539f34173d41f9a17ed129016bb9b04c86487f5def9fe350fd4dffc67b6e181e3cb26378ea15ff9b9ebdf1fc86c072c82ecd8bcdc241301daf1b774af5f90f37e45e6126c5da7dd3753a1e5b366038af6ae31\nA = -1930548d105661dc25a5ee303b61b559c4bc1f2e28b2c40cf3e25f98dfe01a7dcca0f3dead6463b55a5b2e0440a651cc9e08e125535e081c742bb3b2f8955ae897909cfca683a4822896d8a4a7073c29a80571445c6a0d53d2efe4a30a79d2fb5d08c0f95b735a1cab17ba40d71b054c9270ba6bc870e58591fb1bf9dc9b7ee8f\nB = -3e2a4c1509494f94406e3843c9446edaf0a6060144637234c6d9ce84d70fac54ed163d77d210bf557bbea0404922c8aebec67a0475a3c7b74bfa2f226403ce987c705c712bb8eb0934c2b390a173c3836378fe71a6939e48d187b27cc7236ac115309fbeabd9ffd0396fb7fcd6d46a1dc683606c757ddc3212f5d2ff3f2e450fc7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2078bb5c82a394c30a287aedcfdc5271eb3246be05954181ae4f86ad2880ce674640ecd55c2ee3f4e89e2762139586516a28558481303e3071cc9ccb9a538f887553bf5726f3849fc41ab027fb1c680ce7dee3982587ec71b3760e5da6956d6894ad8c4526d8de953c0e681ecd44883a21f0abef1544fe601743efd3e5eadb8e\nA = 40b4ba1e977825b7accb941fe0c0a49936a8a47429dfff53502fc0680d705b9fa0efe003eea3ff0b649998fdbae8d0831bea7f34159aa4c7add6bc7cd56fea97d25fb9a6a10f4572c26d792b76c18ada19b0ba06b6142c420dbb40d66be669b7c51d8cd2a5022fe1a8aef7b60965c0176eee69c32ca5023782c5410adc1b15dbdc7\nB = 1bb2f18d7c8d306bf80ae1901115c8dc3d286baf537b812ce06d6872b61e5bd44f3c53d7f31ca8461b3628b255f85338cc325856fda5a6248b7c476532c1bcdf9713dff9932a50e52a9441aff96092d3fb0fd76046a8d88288d0cd55741083a1bdb20fc6e9c20e82490273354bd826bfe001322dde9a15763f2c0e6ffd2cf60019aea\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ef21dcee9eadceaeab13287d6e3c9741811f6ea9d5bd111799ae05260b1de2ffbc192818fa45dd7befc3baf6840e3b9d24cecbcb2cb1c3d653c4aec6531b941d926fb6692f548cf81526acd0b6b0289d70dd11ba50ca8de6e174f502eddf47e57440142c7f74f594a9abcb48ce1873df057b132ccce8b364de3edf411089d28\nA = 19d0109e0c47ad45f57b8bb8519265a4390534d2ea07f969d84ad33556518b6234d40d1631be3c3cce6d59b7be14750aed114008458f50a6a84ff75b4ee7e4b826ddcb2d2293842ed29e4e484260a92199c5c66367c402bdff0f1a8057127c6ffe452498bb352802e0005e6cb084663bcfa82783a3d72f3a2a341b8075983892e86756\nB = -81fce71491eda139ed996f6a289dde8635a3a257ad6756e844c768e66746011fd797658184fb44b0e3f3c5600c56238ac7687b5be42529d5c9b97c3ce10f3219e1e451bb2dfbbb44cae0828ef894eff3b52b8dba4c115c3b471984441045f2c2db426cf5f86949d5bb7662cd40bb3b3172a19ca3fb6858315d688f13c17550e700cd5dc\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a5f90344071790373044193cc4fd92116248aacf05ce639b6aac4461ec3ccb0805ff9876ef44fa71088c295db14fc820f7ae2c0aeeffca055f8f7238c6c90db706d02f2cc43b4960abe3ca4b6dec8bba55327b958e75c60c5d1f43fcf9136f12481c267481a725eecc403a16aa6221346df680560ff316a63ec8b51dc37aad6\nA = -7a54e7ca04b9a22e2b986e72e634317ffa20f6f4ee90353d559db3f3c1bc6b3b92ac6b364f6c5929090373962b49b59cb5d87554387761164982955470cb45dd00c4a8982dbaae3a1ffe700e8903a4a8e4a21eff9d00fa496d475e0e1a205be267499dacecd31551f8a9d437f37dacfdf5a2754f0876a3e02509b78674e7ea2169c43f29\nB = 652001f073d63ddd526abc957bbb48ca74154c8f9698b988178b3313dcde9acbb19ea11a935184fcbcc31e0117d8d2ec695ac56b5a71614a12cf90f21c8882187428755b6a5f11c314ac8b952ced0f65db0987f0f87e20b82a811599f4160e65c7418af7f33604e7b8952b70581e3e02dafa025cecda970d04383ee552abc620dfb9c5df9a\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 67f903e0e5623258826b681506f3e94cc0b086e262bafaa1395294aefc9f6b6323410a44427010d5e8d8288993973ad9939199b85cf02ae0a09dfb69801536a3fa6af5ac373add7efd25ba5fee6d8f040e97056f9f6fbb45795c0bac94c51ffeaf496710b00bc9ddd8e445261d976168771060c9bd9d83838a84ee9428f59d6f\nA = -19c695ee3a4ada840a7e3626e61047c5081867b15843ee9a6506ce45540d23ad25ff23b72f988bf26ab8b98363d9a2997773604f43fa732f59a4b16ddf3a45acdbc7976a1fce01b3dd55559c20acfbb7501730f794bc45fc09b1f035d60413bbcf32a83fd3c41599049a674f165ac5283c42aef213d777ae47eea960f7727f5758146efe5bf\nB = -210697d47beb73f45207340a183a729a1e78d84bdde1c7d8f80bc84559c4aa4572ab0e6927ea175acc7a268d05616201cb235e610d1012500c8ba9351a37bd68b4ec42227bea55cef5ba7d12ffb180873ab9d33d09e6e969df99fca728dc12dda6903169acbad38388fa9b001edb09056a2ee2aecfab0468822bca14a4bcdd3a4122290ec5ce1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5fbaff0ffcfb2330283fe59611ef51cf045bc2690e31f2ad3265046fedaa990b5d5060b3c38f17bbe8b2696e527fd77ead8650d329c2e0c1f3b2f5bec4dd85641022f3e0ae6f66ce98cde1a785bb52eca796ae45c33142e8264621ab447cafe988de926544e1a7036710128c42fe8b574f7ad69d830894237d95a55d1bc7f5ec\nA = 482db04e35f9fc1d87b42bc5efe25a049ed924f816e1b0f9c8ebe34bc771e67e26d6057563fd5d5320681e",
-    "1207c0b0f4b7df547cd6d5be6a2e0f2bfb088f990b0303d0ef263cf45681e0e9a1147c29f2ca5251faa633ca53f6e0b109ba69bbe20c58a76a22789243d1acf128dcc936602e832a20a2bfbfedf963bc1027650f483814d7f5e6905\nB = 105aaf563d4c1d436c6a4552770a527776f40bbb844b7701313c5ada95180160e7cd4b7175ddb943e5a22c910585dfc184b52935f06b12c84b6431395f28af2eb9ccfa66b2ee8f40fd44d753c6a83d67a6f3fe3658fecc7fb2f4a8f357c5d244422e48a33d0e2971059695a59d0d39b235d5194e919facbae7623ffc92d771532b6b0cf771912c24\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a9d204c1a497f350fa1300cbaf682c947eaeba8b3aa0450c1db9120852a2edd2a0249dedef3b3746298ee42834d869e9f765ce987a2aa4712a1f35ed10d0f7ba9cdef938b073c3a526e5bf45f3510c94ff1fb84bc77b08e2aa50f5cc75e2f4da37a8a711f8aed5e92f7e486877229cb4ff2a4d0755029972323c0b51a14fd1e5\nA = 13fd3d7cc9d6d6821d2f2b1c40c8e070bfa85b994ee8f3e0baab544dc71328a1a57b7ee57392ab6d24bd85f9ea0f2a312148fc4f4b22c589e9a265d97e73c7a5b420bee180409ec179c438a67abf37eba61ac76197f3c9ea5edf2d4b8aab91e9bb1a432ef1f214c043664a51ceed1f2854880dd458ca253f09d6f6acafafec310774a672d07147b1\nB = -8c90ecd56d6c7cb129d1c9c26e94cf919c5747450542cab52281d11d8fbfcf9ea797b29588340d146cc40e77dce007b68c0c24356d4b75513b75eccbef6e22a5b88417cb6c516578d17d871e7d0957c09795f9a0f19b811db75d61c27e1827fa2773846857fec020f98444e307d3e52af501114b962ea705cb0cdf815109054abd00810dcc270d7bd3\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 57aef35a3f5388c810f576dbc30d4e4e5a39248b319b7766311157179d8bc1d7ef019cdd8c2c0175a8424abe7b33565afc0128724fa38f0900140b6f96bda2e78d7c803124cec8c2f2d6649afde4030c76cd33394fb386342d1ce97a4ecd180872134fd4e22667a687915bb4fda21f7e0bc9100ed8cd3a6668ed3a235d7b15a8\nA = -673bb11795d9d20a1e4ce8ae71d041705990463964505befce5949f895fa31c92d53f91fbc110df4e789b3f3f01f184c55df92927b8b680cc92864466ce5590ed2e98901cfb78b32ea79bf68b57a14cddb53209e08a7f430fee23f4a1475fd2640a515f8b609e98c760b4301747ecb61f1e6209b07455f1c8a7bb4e20c269e17937f39c6a2fb7b2990\nB = 46beea6005cf96a2acb16f37e357bc8975f4dad502fc3aefb4666344dde456c0ee7ea43ec493b6aecbc7aecc7d4cd107aa09e874ff564f5d59d7e12047b048c1da1faea36a7e2d02d0567bc4db41b54a75110626d13597db698fffd577a5810286ea8bf50625296ee8070419345fa269a354ca2eb47fa3108387f6a4b2c0ea3e779908a14469106eefc14\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5cdb7c451b2950c9d87638857407276959142958b06241b2010a9f93625f9106f065798f79ce5c534b9e5a31fbcbfc63cd200fc1cf10217096aa0194acb9043ccf7ced30d9f0bf66e0dfe27ee2ecc40bcd8de66fe2ed6f8cb0d874ff7b5fe71951412731fe4e19c34bee64c9312577b9e7b2ac08ed15aea753a6cd3e286192ec\nA = -1eee9d5d3854db52f9b43698e05d6a0f1d1f8df5f32884a775b25110309c46ec5c7e112eb64b2d7f948868bb9670068779b0a78bfc7e17860ee02692ec6790222b4384b9bd7db5abf29c46261c10d95f503b821a4694c45553e0dbaaa977892b916cb8990ac9ec29ab5c3d63ed77138fa1e95f395b3b233d039ab5daecb0296203166e9386d1071c61cb1\nB = -34587c2bf3473a2c5d7f3399d5ba2bb09be8105a0b9f3d8737d67b03d8b91b1c869f4e223d6246abd36d99d84052ae5894e58288a614a0da8d69f1aa57428632c2b059ba99315ea2f68ee210e65a741e94125ee4a723a7828bcc410aa2dae06ea8ed6cd23f66ccca7e85d2e071055787f230ee405e50d1519377cfe0cab4e5f97b6cb893b01134813a7c2c6c\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 95d0b209654de56bd7d6f74afaabed2cbb3247f449d80511d2d3c689f84c9b79587d78abdf0eb37f1b89f1f8dc8a83f7f9fac2c8cda1fd3fd64e16f5597b7f0a1df6da6db9e828ce7be0e876012bd52f5a74ca73ff8ca4611dd9f342bf77b485305ac28a1f8ac7538169f2bf3e4ff4dc5fdb9dedb97fa743fd8ac8791b8e288a\nA = 7821d4b65d529c30b8747e184e450cefb11b5ac5dc77905e6fcd3df64336661c82ea68d588ba616d23df485ff0658fb3376d5276027a40b392f47219edc5ecbf510cf0c5b431b02c65e5f432092f941d32ac5f71ce3496e403c7637f63a23b91e3326d01d2d32e99e0ab265108dc5e7919d3983839b3c7541848dbcd420a594e850e587f1846951852ed76d\nB = 1adf5c428f2a95c27a943637758d5dcd7ca36592fcb9d52ac0b7d27adddad5804e3edef257aa51c716801ad0c731e13c5dd000f11b5ff1b69c198f236695c1b2f99c0afffb5d084f80fdc534de3b0df4597404b50c7e784c3c55dfc9753c414d145eb0ca4d07e2f65b63f3eef8d391250a5500ef64d9bf963d7250d6906694e7670f92e3d5a7930f0f85964a21a\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 46914b197b84fa99addeaf55dd803182083a7ae34d6d4d3a55d6272af40a600563cc8d9f6b48110d0521b8b99751235bd5a340b1743497ef1cc459dccf5d6da970c4c3103c978ad2d513298f1fb3e68b24a9c7b0795f47d8f7f6ca9caaab9a9d80f15982599d764f8738217f9158517806fded5f3552fef8b7dcd2e725ee04d5\nA = 1c9f5f2a0d72806dcca92dac1450a50cba05b5dd571c2b3b988d33528d90ecc83444e3ea8df80802c30fbd5a6ec2ad9969be73aba6dd27e0dd2c842b95371d7547768916c0cb036964d041284cd323c8073095b2a8cb8797add5cd80f03595de9d18af8df7dee0d250ea7048faa47ae0131ba3f350d82864dc95e5829b88eeaf2681433dd4d58b2c6f70426af3\nB = -aa1e1b3cfd5ca0facc75e46d872584d55144620f849ab05931210b4e1526f12679bbd9cf00efdbd8863970e2abe8fc9fa7bbd21afa9e364e3c9e32f51fe66844fea4bab7f3b1bd278fd803f6bdbd0d296321e67751a0b894da338ab431871adf1514269ba05e0cea5558cd5691920fbc18237914f3dbe4b253f774e5dc1dc57023c080a3b90a004b809d237658ca1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ada55d93c533716ebd8c16e23603071950aa714deb942ebbf77206753d2676a7aaf61673c03a4db69d67faf6273828594d85e3c8cbf38460fa2af603fe9c1b6ce104854e7281757b26589f079da80685aec153fc5fd1a223004cdf30247f8398b8e92899857dd199d5d5c32412bedbf9d55f20e52895fc1dbd04c84cabfe1264\nA = -7d22392a8da1966e6cc5ef50d7409c614f8c8f8e5791778f68a00b4a056d0002707933043d05e48347bbd4d0dc1b6ca32a1aa4bab9992e7e620263283eb68d97af13b90a29c1b7dce39ec0b8a63878e8d65aebfb3bff4e67129e3b3725f999f1ec9ae92007911f2cdf738499661c5b6c9bf27712d0f29e871b17318e95c3d14b2e472cf9e466bea91fb71a493b2d\nB = 40279eefe59f954aa8c51c9c214fa07707b1d095f697ca40edb820401a45c472d1d7bb413eeddb64c14ce6144b4863fe9337ae4ae8698db92facacd6a56f3b33129c5b608eafa29e9d92dea620113051b926b80b75f320d7ca3d2ab597168c68774e68c47670458f5ef2ffd4604f20bffcc7817eb09c9057fd9989a6786a7e067ebe6724a89e7d1580f94ee4ed502cd4\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4dcae9def5467526b0ff071003e56f5537852cc0bde9d86eaed2c15e36e6429c68c061e12d321bad12e29626b5013c28f118ee59624ae2f35d2c53bfd89e6afdb6db79f0321ad5c55cab03e6a1a97ff7bd58c760d0e9fd7507de987ed2f94f9c79569fe7f03652cd53c67ebc6bd3c9e6c5672891a9d2ee11b300ed3b19753c0f\nA = -127f5ca6924851faa2340c4c8f425b1dcf41b313c5c2910e5eff8ef2faaeaa43305de2b3a65a75fe54c00fb30c0ce3e8007db1ea222521190ff1de6d0cf2e777ed61ce8211dc167bf115a77890d0bd1ca786e967a04f077c89939ce484bbb1c560f669aacf7756a4338d97cbd7f09a376d2dfd4d632bb451f52c03c05762f050ebbf112f8dc5acdd9b631292fd7073b\nB = -3bc5e9c352c46449a9155b7ce5478c771293599cd2dda58a962010f1f21d094aa6bee03f9311545e8dc6213f6aa73c08b55bcdf4d1d84fecb9eda35c83eae5fedee75b2d15a003f8a82b2b788ea19f7460fdd8f447d973c950b3b250a3022c19ff312ccdc86b6ab50c4ba627b15968c8a66d306bbdae8e88fe28c1853fdfb3fde92353f46b5bc448ae42306a4c91202f03d\nM = b18a9cd6a0a89578ea77",
-    "3fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 62a812e35f46e04b3afa7d26c8fd4eb168b6b64cdc839ebd0a46bf2a3a712af8e97380cdf0bfa8a274f7b73e887bb4cc73c6104a176d425aaf5352f14ee51ba549a6926bd8d059b8e3826b174385d4635b0c36df75a4e7da44c34e51eb82322b34ae00e8c712eb75b3882822bce5a2f2f5fd74355319ebe1973284c690bed2af\nA = 71c57b08127a956f0c17fd3c639bd1923ba19bfdb83c0cb9dd78e62b8fe4b7e0019cd0a6b73a334c622118f96fd6d91c1e06d4dcef8a3d0d6bf8f5beb6389226c50d14d3947ce9f24f7e0e6a7befad2e4e92dc9ed8fbb9811d908c03ac074b2a5c67b67831a350c4d548ac70810bb5617d261a045e53cdc48117b9fe86d35950d0a181b73c8cfd35edd31af031178523b\nB = 1cda2a51a707f8c4d2cbff6337c3f63519705614c26a489b545b1faf366b705af1d953701b568a684856fd3186c035f878788f7e5dbea16b5e7b6e767cf611452a4272abf2a9c5e72b7251a1ebea5098c60cc5bf649cb70980b97d48580967ffe2913309b6b78cc12d91025ae403928851902dcdaaa60f5b323a1302a5ce114cbe174e3eb3c2fb5eafc44076396c23d53b028d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a9213cd809d41b6bbfc2123bb84860788ce22d5b91f8e24fb616efc286a218ae9652b42912a58bf8ce596a1b48e4c72f27e52c36be1940f7d2138eb895ee36bbb917a59f73e0b6c3266bf4759ffe2ffaee3f6179492658e0778bb43c4df4bfa1a46300c9da496033142ae2c1e33333fd7e82c5a14686b255e224c51aecc2a590\nA = 1cf4e2d5924510a5fd06ff4eeb94a740e430613277149993004b8de1a2b96ada54b05365f305e896df5fdffd3d7bcb54f9a9dba9689e5ad498012f7a684d083c31d7017aaaee720bbd42382e526a35d2add21d9369f7faa41dbcfe3dae426948a402635771a977e19d5c353ec7c1abd279975f2effc0b7bc19990154b723f2f8c29e606581ab9d3966702f68d8bb8065e9d8\nB = -cdab60f9b8e1add4c54427b638ec5f76b30654d3649b500f833b2943bf6cd5d8647549657a8ff999eaffe413ed87e06267b97bfc1b77637b57f29039235548a7569fe6d4bb16ae9c6cfd38c0b8c73aa60797d0d69b03d5a98314f7f7ee25df8b896ecdfc782cf8057f038b6c3e79c99df52f839fd4eff302ddd1256e51eb31cee24585782a0439da3db2eee79a58f889d8847fe2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4dde3d63aeeee47441a7e733bcccbd4f2e495ca3c746468e9855177f7672d5d82e51da8e268ac24e8971d802e25d842a16a6b8d76b8e46a7724108c02d38a4830453408ca5ced7093676a1db4bf4c94b9b7a9531ab7c26f8de520bafe4431a55a5f5d8c7576427a0f5bf2081b998b82da2e8e959f2ec4d5141b55e40bf6ddeef\nA = -5770ea0a75ff451fc2c86d428f2569884b2c88cb6d9d407cc22b191849d389f57a5765b83adcea21c350b37bc6d750d4859f547da22ea8a3698a5cb6154b946331ae2ca18e7eaace951dcd49405bf8d8a716f7762eb242b8bf5e4c53a662c906c3be89e53ddf7a706ee2406c7d0ac17b54ff259c1bd5a092325938832763ac4caf0232e80a016cd1994441808d8db7e546de3f\nB = 7e4246ad4af268695a51912053ab6628969af4fcaf7f1e97dd977984a1604e8c9fe6b920f39a764c27d89f75986a4bbc122f92ccd1860f24677cf346474fd9441f572f769daf834e6a00cbc027e15d6aa7ec2030becad41e1068740cde82abed768de7e2cfd325848f6063e2186faa76982b9ca73ef22434a28bd2e3a5ac477af50f258140bff938d3fa02fb904a8ee0ef3c1f6fed7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3d8bde8d0625fc46dec46fc657c49c8ab12a988cec4ec1c24e6f4d8ff94514c8d8fee4a08399c6bd23fb6464a38bb5f249591456c283325e343cc289c85df0ff2c1707a6e407ff7a24383b66ab603b75e2dc3835ffe9274eafea148f20764b8ca30cbe483c1cefd51f82dfb93d7793b3ec19a57f2ba03d884f345bcc3188fe28\nA = -1680dd51d8be6069c86ae157922d55df3b58ee6f53738677bcf7332d6e7ef304ecc7ff7c5a5e1f525459d77202f3e815c68f17f9a6bf358654a92f9f9acb252ed8e9e6a849da7491f26d0e33900541ab67ce966d042607258b4382b8108729a703b429babc34496528f198a7e0f814db80fad4900fbccdfb64908febf5e09805d3a3049c0f164f0bcdaaa9bbb06df8f05309be83c\nB = -2c6c6b3c89f6e1d1cdd9abd1a9706e4f642a25738aebbc97cbd60e1f4ad79b419dd54bd14f2bd147b1d8e9bfcf92faccee61a43dbd1a2c084bf06a2ca476b3d169fa2c99794fc827b7f4dd010c0534e7cdd03d00456033ae0203b78a7ed229afcec2d1cb96892eb18898bf53584dde56b4316b3bc5186d97e3a9edcd059d7fe14561eefe4881beb8519c1cb7c3ba22cd2e13d874aab77e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5b4fbf0445807c8feec7efa3c2bf8dd86b1070638f3c87f1e173ee980412a28847b263a266506e70381aae919ae05d306d3a67a6c1e72c8ccf1c27d6296526e87f0f436c98fd1391f83440b58fadd4fb1905a484bfe8f516661e7176a268660387fe6a7266ef02e5fad91ffa69247bb11cfc1b5c3a88c76b7923a26f8a31ece4\nA = 65fe4d55bfcbba2bbfbdae831aef3dc8c8746e1d04cea174c1d336974d81d026f562225b4a297b1c3b044ccc5dc9c830a805a399bf26c0369b52ab0dd2c0ad19e723fcf9f5de2990ebe5a1266653195a2aefd9a392fd3da8c22c523a362f195babbbf5329018e3b454221b3e77cd0dee79f612f86332b1d104aeae7d8d84ad06b107715bb76bce20220d1340ecfc666b2bfce812814\nB = 12f775dbabf1c112523feab443f6e95d773e8220d66fd87bb7fc702588136a048e17ab6845a9c784dca275cfa445d007e8d8383740b156df7048650f89c5ef1a84148488fc405898f9e326cb8052f626c8881abeb70f3a0f52dd83e3ae0cb82d178cbfe8c393449caa2a87e7c8e2901a87e276b49b6d012f3cbb65641add3694fed3e3177777e78fe375f3a3b378091bb8d2998286562faef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4f0af7cb0c4e82d0e6589b24b55528818bf2164d41f58505a2b302a8f677df146f8077945dad3790c323e19b37e3379eb95de8abdadfbe4417f8bf8da643768a622ad4898513fdbc72d3b1d2791ec9ff40634678faf0e17d6e0851f08c39405907db85b74937ac403a9a3a1004013c7bd95a585728010689fcaf63b2031bc8c0\nA = 156dcadeca94985ea8bc0d1378daf1e85ecc4c7f8b6d6c7a5cb9f9ac368a97c07e381004023bc575691c082b5e9e13a02fe813a55e76196e4ad4b0f9b1e089bb71a0d5c94254b66e3e645fea25d69bbc5af266e730482a60105306d664f0ddecbd76d54e7235979aa2d806b809b3468078b5d90aa22cbd2c441198d4a52f6259972cf3d02003dc39dafdf3581638e56d08c5181d36e9e4\nB = -9a54586072d093939ad86df11fcd3337ad7e9e478dcbefb2b89d7555883fe8565abcd5b0a9c88ab135ce5327b2a326db645bc7c0e3ce24f902544675ff9d946abf30302f123aeed0f4e28edc72758ffa760277caaf4817a3ae8615784c81896d2404e2cf47c06b09085cd0ad1ec46cfc1f04d0272eac29e774b30f19939d08c036b185983c93ba15d1d27aebe4a357b9f6a298acca3940d2730\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7c3ac09486a6fb518b98a9bc8a8b382bf2293e2c1154470ff7961212430fe2dd28697e49256b1ad8add082ee27b6ecc016b120e971665be801b720069d30c0a8c6ea4795613017e8883e5c0d0e68f982c328379d7a0afb7825c553e087b33e9d78f90e0b95a6597076b8ec2c1d375e2143bb778c318ca0680a64072cf9a4fc08\nA = -71d8e7ef13d63b4f417c01ec1241020a8ff4c9b2db531500984fd3e45d22b2bd581894c8a248ed7cc345e70a5698407df8f0e4ac71ed2c0d42122a4f92279346f463aed899253206786928a0eb7c37f2e51e1cde7f97cf9288d85c3ed7f49e62af0bf9abf062d2c6544d83b9d3438b3881e0d07b1fa0f2a4446fd43ab3b4f81fa2cdaff199c87965e298943c68cc15f2f3f3225efad68b73\nB = 64d52de221f102af62ab1e9526935b005c81658f8fefa019bc58e641023fa785798ed0dff8f7f999dbcc2ecfa47d5314ac6676c82170d6f2b18122c17c1e1ec1b9b54e333a184a46ad35b2150c8165f0de19a24b98327715e5a641c1b6d3ff9d247c89c8749e775e6fcf5f967c6eb5e73523d4f1ec12db7321b14398f26201a364e1371f0ac922781ee252c6d2b3c657ef259ab73cb7992a370598\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e",
-    "971d48\n\nModMul = cd08b388ffd41d0aa29a3dbde74106c57b18d325be8f446a2d9ae95fa4144037dbd41eccd50fa34096984cb11bce555c117c5568d76a8f79d308ce11043fe2413d37d6aa60c366af6c1da93d525e4b2d79fc82c0a53ed62fbf72c919db8a3ae11f5ff8057d7501f5f6dfc9ae461c308d21919d0de9e31b759d1d8e3526fee58\nA = -12e58708c30c93383cfe6e99ee3c5caf1900a7e610605706e77d8f428fd59db2884f5021d7a382cb18b75ed22528961cf43be1c700c581ceac3877e83eabd860583e6e94f3f2989c179ee5047c82b53d37054c9cb7ae08be60a91b10d49510e9f0b90ddf89f93790c3e18cccad5a9d223c605a6c567550e2b4950e184fd97dd68bf30681d3f9c585365de2cadf36a43f5a5305dae555396dd50\nB = -26ea5079ba7ed137a14d00d413d6f818e911cc183c88764de4d91d7a9b4cc7af3fad703142dc7905992eb8bf489f6d8231bdb25603ddf3c31fda8bd9bc4d78835f9ddc1e6445037f05125cb1ccd92eea2e927297e5eb915d5d965a25e5d58feb8d79a890e6036c80ee91e7469d9eb672d7a8db68905d06f5981fc40bf486575a067d35cf14ceee3ccb79b72871bf8f52b92e4910ab17e5e59ab3ae6f9\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 34714506322dccb91308c403c267f1ec75f80faf3cc4272dff4a84c13eb1e6133af6681387006c61e7e087046b64e7ae74eea8a3c0564a7c1f381e1c940d92b2c766fffdaa7318d07dbeb877943a73b50517b49e5117778b8a60212284fb92f29a9f5304f8f537e88acf8afaf01fdf64773f988cfa9551d6884baa70587ab76a\nA = 638b7c549ed14256956bad532945ef9e11a50313172965386635a2fc7db79deb0cb5c157e9854117c17f1509d505d01a0e138d2e510dfcca45b4f7ec968b5214a6699b61b8ac68adf64d5394f50d577a154c013612090e2045462160d1f552592197d7da78e03491ae284dc9faf643805f2674af8652bae93ff230fc3eaa833dc62781e5f74d0f0b90290d51d481b0a94ae6e972197c6e84ad7ae\nB = 141f62297ee88ad527fd1e0e09d9ab5dd80e17b32f34a674a27b00d719839701664ccca1b00da2613396cf633b0bdc4482ad3a0c3e209eaea7c22f33706ae44155f527c9ca4e341e651760d1c39f65d5e99e649d013730d2502b6b65adb8a73e6bc734b7d879b430798dcd53fa6c0badd57896cb566d9f1e0a7b3a9161e9808e762ca819330ce9319dbe7f49bd663a9f57ac53d65c6851dc7bc4ee66e08f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7adf54c77eaea2a1743bc5011ace45b7651846e77f90402297f117d8b1c0377f93f49e92a2457f3d3debec3022a96c74c166d01b2279553ef518ec0e612bd7b382529184640c55b89255b2679da9cf370913351592de39f804f1724de36db90c045fa644e8ff20627f67d6afd4546f00d7af093f668629f9a06c07fab5654ac8\nA = 19c491d5b55aa25f2e18cfb7fda18ed4b020e3f63244eb9f6c4dfa86eb8a70875cc898e305a7acdd3eee081300edb3e4c837940bbc1927f5ed9f651e46581639e133515457464e9c451390828e5e7e00a688daaea74620363706cb69e02717489ba9ad05774c424c18e295278caf4df4ced80b4cbd20cd631df43f2e16ec0334564d9dc03dfbc7111e4252504fb449d5a25cb13630b7c0c565a82ea9\nB = -c3f765349639beb80f888d9c8b7b335ab46b55064ce2a88180c80ad280c6b7314df52b7e73095dfd82896e24604854a48121353aa1de663eff07882771803010005905896357cd5a56a59f0db0045f1aa2c0b5626e132c169abc64b9893f95932f54c1d8cc25f215a9ef6e4cfdd6dba85f6faefeca81793b2258ae1d1427e81e458482aab87f6563abf435be69a05b195d1eda90146a8cc92748ca6f798b10\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 32ba5fc81a7747c3d812cf036bc0edc49f08824d53b91a65a6d41edfb1651d99c11ccb4c074d7f04e652276ae3fdc8d6eedb72c6e46cbb1f7f4070dc9d179ce3e21a3826f7dd2c27943a8d26b192d7f5c4aee9ba0647e406133e3e89c262d37cf468aa3ab8c5dd1b8900dd06cd600abc6d372d9408497d9e20c86a9a6a4ad9d1\nA = -73958019a5a52357b9c1d954c9b14f51ddaced32a4d7b7c95730697cf90029564118ea168d23a54381f7bbd6718a6b662e4c87410e48ac53b7767148582b0bd6a3d35f488e7fcf2b128e0a58b5d468dedabde4d624f4a82e808dd7b175af0d3658c6df1ac0da6495bc9a8dc012f8de55c2003da9b2d478e1a089fab776d99026684026968fc309dae46a6ef2412039a8207c3084f96b4e38e4fa01d131\nB = 4330fdf00bc6d13ffc267073b68aea7419ebef257d63f8f244accb9ee46edd04fe5481292de69d377ba6b6304804ba7ec0a063b42339e6e37867261b9945ec705d3a0029c6f499420e02a773476546993b3c5e1efc2417f51afcec7145a9c2625496865c11636e285d4c8b053ffe66887333c51a712fe9c8ea57606103fd689dc88f1fe37dbc33ae4e92067c5bf51b53e2f8205164c800e5abd677c73949b00ef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 69b850a99b471003a56931f7856da357a2254ac50ed81dfae019c9b722b95af16047a0d5422cf7ab66ccd898e85caf0e03e74cc8a5a413661e5da483b3f0363e63a7031bb30626c8f73d6e99e290071094b7fe5bbaf4d303192e59acb5e53fc7cdee78576b51595d9f7a25ccf3c7f8889de68b9deec167778ca27ac9d4c71c3e\nA = -1976b3bbbf92acbfddbc05b5d9e7b62a7666b239c1e6270db7ec6dc2929bad1024e745b897840853d14cd815aabb01aed580e1cc66ce37f9d1cc4c9bef8ddd35d28285faa29f2003d2a4623ead7d73302ea9f380f16b3fc06b7c2b8bb4ce4c8b03bfb6056a61c620e4decc6048cdda5e2d3ed8a13b779b8829e2bbab91e9f6b0304b1c08bf8fd85e0f3cd7ee72255e5342e077ababdbb545d7f809bdf8145\nB = -2cab554f7a5d21c499a1025f61e6c81ab0fc68a874bf60470cfac57425a451365be62c380ddd31f6e202f29769e2b6106868da7c81522e03fa6f0704522a5f8bfadbd007bac65595e149f6c585d7fc022db016bab32819049e7547bf85d4232a7fe19084907c528e7eb0434f2e5a375ad9b7d463821bef2f6a721a635252576c176ba42519bfa5d97d0e47facb4426aea0d755507dac81ccf1537b1003ddbb0727f6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2ce33adf34f2249f8a2d2e073976cb4c78b71414e027657fcefd56fceb022a06c1969dfafd519eb9e2542662c7647102f5c528734dd005fca666be57b46234123bc3db286cfce07bcbb399eb6764daf2b9aafbc2898a5ff43ddfae849c7549289640edc4ab7c4b9fcf5e159623e5497f509ad6f0270a41fd864c9437302ce380\nA = 509f5d5b160e923b4fdd72f4d522a713d780daa4bfd10ddbd62b26497a2e7925c495afc2abf0ecfcb7980e588f96c4078bde51c7b2c19d86d15bbdad5de72fec2e0a284dd693ce0902b40e54af87ac5a5df38ae6d1d882ea6299fbe6910121ebfebd06b454ec5f855bf3e7cd544a4b0d9a764428662e824e2a6185723534f5e6ad829734347d240c48c2c0f8bd6be6ae8a495a9e383fbc7402a4096b8c2c214\nB = 1a3b7f55307031609afc974857a6cc75821e73a1a9535bd6b8e141437c3fd4a6871c904e22c5d9289df7525ac69a0341d3620bcfc5f04b38ae540e26beadbce0002a8a8bfd0f6a270007e4c52aec2fab11fb2a831b9886997256e4b7e7ad3b0ec64c0f31fb0d637869143712291f5073a5756466d7c82c31e08e09683478229bccdedc2cabb7e426af9025185d8dd5124e08afa4e981236180e0a390004adb7918de6ba\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a81fcf9a18ce476a839c896cc5d9b639fb1d74610e2f618c25310147b57cd77806c2aab90be7be4ed10f0122baf9b862b141ee8e4be5e0c23ea776267f14c31e50b119bdd33f2b41f6a4c43d35bf6f095864593e0d8c0f1fd4656d8371af844d197308bbff14e5a28b7181eb6e6a2b31ead7361e287f3b4550ab0484bf7baaac\nA = 19f1ce60ca50bfdf8e02313f1c9a45496720a2ce467f1e8bdedbb32525d762878b61476989c7f6ae8dd29c983ea596e521bd4cbf74dba4d505dd9ea5df423474fa9725d5b65f1575d26ead95725e2a59a6c8a5397ebd6b54123e42bca44781b84c014b8e5d2c1a86cf34d764b242baaad5be285cec72ba8ace808058a0226c04f95eb2b53a828d0ac41e6b40e5a4c4092788d9f7e988752f175f075d545f421205\nB = -b115a1101d97664759538d22154de4b000c008e551e2ab10ad05f12274b10a4cbfee762d232df5188fa1161f37ba61d146e8b95fa715d98e016da8beb0600de65216cecf8b8816f6e7e73e2a2bfa7d0bac74b517b906bbc43357fca69de9cb5507bd95205515b97b3a4d6842f3d7b09606cce1c7436c462f49dd05e915d04ab6fe2748ccaf025bd5d19749cc468d228ba43452ccc479c146ac6d781717bb9966bf3835dec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c5419211",
-    "2fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1473f092540ae30de595666beb33e430cbec42d7a28d4f7982e62f58025cdb617cfc33f1e5ab93d2ebefd7345561b81271bdc50bfbb0db6381dc0ea023ff7c72605da26dc7da2b5664d2ad7967426ca97b3745f82528964bb68e70087e14dcf2d71d30fa0d1f7b3f10b19b357e7053fdf22bccc5188c6919eff1e5c402b750a4\nA = -68f280cecc512d51ae534f30aa198cf7b170c346c1159fa9cf158d0127d43e50a8d4704ec54b8b4295dd7f51c6771cb5767fe0c975414cbe6d2bb58ae66a095e8832d5f443498b1ade1f5bf249da58595ebd878677b34e3b4c99ba6124e2b71d86a8d99727a16746469de51b0a61d9d981459a6cebe206cd36a09f00ffce7f532e2c31999847ba000b9e01a4b84f454544b6362a5c093b9abe9d583716f4534f2de4\nB = 5b79684387f18d7de6eec3a63d737490dc2a46c0616ec16388dca2be60adcda11ae13063ede3fec177171a51dbef430f8c4b3f6d297b9d6c020fc44e3ffab891d0d751d033fda813861bc067c181118dc613335ce89c5960f952e5fd28bc72c41b7b6e374ec29b837f1e00271cab646c794579d315260921dbc3b984b86d98b8f8816aca4f16de50657e4102f34d9e29ec3a03e0da06e70f69952339bf2ec4a7e74daca82239\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5e4b3f4aea7115d592bde9bf7c6594fee77372ffb19f7745b4de878a4024f81e8290c77d2915424df20004a7abb64c214104a3123e7c8f230c159ccb99bd937521b433dcfb065b186a685fc40f9166bad9380a02e297ffd6a307ce8d2c8f2f1330447a9c06c327b74f3cfc2e98f3351a8b385bae855941228969d1c29e9da3e4\nA = -11c1d396693139df5bd91825c119d1241c3f57b7ce95b46472dd82081738cdeb0868d18eb7c8ee7808016b3311f982adebd5a2e5f4e201ec4a34f3037d260fe580e771222de5a1a67947a4552cc03c5c59f9e60e25063a702ad3c3aa43f061a22567f938a91f1dd697c3e3978fa11ab1d65030bf327f8049bda745658bdd4ba8f3e34b060c6a2c6c5a8be54c7cb5f6b106f54a37d2be9f674f7747744d4350b3acdf373\nB = -25a65b6acda692ba3330d70dbc3ea4dfe208c0df358c50b7872245a909c5ac19ec568b1a1340e1a094f5b8e7d1e3b7e04bb4df002558aefd4540135d62d75bd5ce959128c1300b9d98429d7369610866d98b22c345e531f2beb80b042b6ad48da077043401a82e223e9e529e7407bfa466dd2680973006d047d837c26a60cabc36a7ef538f603ba19f8e923f168ebfc3834df8f77a559c9e0342e33df245f551bb242e5a66e5904\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 47872b544fa0425981ae17bb450ea346135e6ed7a9de0572ae14a6e85e8319f27cfab778cdd8cb5f93b417d9c66ae0fb7bcc6652620f7f3f74acc2bc9f2c090129fa8315aeec9ca7adc5356484474ee803883ba4695d7bc47c87eec508d16a15150cf3f757c4713de71366e958d6af045b2d282b6ce96976692c80b1e0b6f846\nA = 7e8f55c040862f12d8cc6e506608eeca65ce38e9e8ab18ef7007e3cf0f1c9a0696795bd10f8e1e1f55bb4f4f3a35c2e0ad18289e250571ccc26a961f730346efb1e29fb143ed97cf72deaab19834fa2e98e9c12ae4cd23b9c5ecef4a04c439f7d42e110b30caedc4334372ca24cfe4171ef1430528f7b57bbc823fd606fbd30915c5817e6c57c967c4c404a0847b1455da17effeebbec3f9357358e00001239aae209228f\nB = 1cc00b95f6bd3abfa697400c98110725a7e109aa9b8cbbe9ae16327c4fc8e5bc93afc7a94da32e98e85e4fd5eb545192c73007d97a4e84ba64fe187ef61d17f0941e165c9fe64c7b8054e24dad30f92b50d1f526b4bb031e6b1b9058be24884b170a145212273c51692b71bc57ee53176d8702b975bb6ba96284b462da2ce38e12d86b342c7f4d3cd489fbce88a309c7df1121d7bbbaab6814cd1e54953e5cc46813ead98f02360372\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5d193b085e57c3f1e825cf3b36c8bdc936c603136bb782a244b04a79fa713dc7b08436b85ca3b483d2e100a012d6430679b30c8e4101c8f08ca0f9010dc0f27fb37be842054dfdd99362e03a7f55ae58db7b47f694bd35d91a58975ae1f255c41617e773f91c2640f768bc702a213f073682dc761e056b34c57edd85585fe04\nA = 1bb1c759ea94b61a1721ef5680f42af30fa31444b27591a03b7c9bf5b90845ab965339f463a78bddedcd62fa21197c32d6850c61bae195f86e1c7a23e7a20dc618c59ce3a1c6ea6306c0b01b11a36d0fadf8214c36a133d689438021ce7c78b20c85256ec607360cce14f139513d9f3ea6eab067b1ffd0935d7c43419b93ecfadf2c5a902b7c39a69bdc023173bdad574adc77706c1a666d66f69578a5bffdc7cd6eee28ad8a\nB = -e8072c49cea603d48f20276df188fd2fb28f8721d578220cef7db1e56379c04a6b372e56a047cbe59ea84ad026adc5d0aa930011db63bf4959f15781e060e0240dfac0e2a2c26be12a21e5650d12140bb49a2a8e0f6a86e4b1eb79d9b8aab3202bfd339096529170cfe3e0c18263128686bd9305e92a3c43e1523f97d8a6a2707773e3d441da162a79089c9ea1e094cd5a23474121188013c8c287965a5e77599f6a7d64174b06cc165e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = aa79c899c2b9518857c9e4f96523a44607c3f6a97d1f40d6474ec79deb2feadd955fe92d789df4d362c828084559fab56b5e33a971abc5449208d31671c7e220c5945886e33ed1d804c059a8e439a92524a785076f9730732bc5a152aeffb5b9ecf3a7e4b55983016355c4c29827496fd4d7e6532c270cb9ef263573e4c63074\nA = -41b326c2b86e7ac14a2050bff67bb5bf9697f02594789c4a2b3e8455df4522546278d0620f28a680f6a88ab545de5829305485422f4e70a5ebf0ad15508dfe3f16ac556436d8fe8a8cde83ead549d88e0bb24dee52ebbb49159ae71589d918d3fac8011cfc3afad613ea09173856b7b79b55a2e43e0f7cd21eb9122d5f6a1fc5408414f5aafcff863b870c67b740256d317a0c58af9a81d8025a086a1f3d79f7408d4bfa06b9dc\nB = 4730f03c389f9bdd92fd864177e06140c9dcc02d01fe7d37b51d44de140696f116d11bb67adf7db797edeb7c304386a7f5e37bfac46a5462a6d4c49b1bc034c2e0dfa56f14bbd2a4bfaf86bbad4f6d0dfa13c782fe680847d4b43373d7137f5c2ebe4ad58c695a7d4c407bfd888ce04abaaec60a3fd33db10eaba6b6acf0e16cb61d1beb9212c2b07921bfb5595ef1eb389200b356eafe8b5288d8f0e2cf252b38301de65190d56bfadf57f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 23f9850dccd2af799f18268c3a2918a69019513c55268faf2477c50677fce277d8ce58a0cc06dfe389170faf5f0ae13ffc4954c746eebae66efc14eaef2c2ac9001f3c7ef7e32fdc31dd725b6a8093e33daa6d19808908e0c2d3e7c1c58e0fe9ed92f4d7cf3cc222393ca4f95feab5d34fe29116410a1882dff7cd92acb87590\nA = -10a75953e5fb9903411869a2949f8f04144d6e2d61f95704ff55a02f40c4f283add405353a68bf7d6acc1b8cce738f0c6f9271a538b4c688dbeface58eef0a0a1d491a9e66958750db97bd01466edfd245cef03bb6a3acb81acc63c38538e7f15deefd15afc422a8641c357c31a069258dc0ebb63f06094ed8fe7d4d420246b40302361967c81f0a9ca542fd1de01967514ff2565de7ae3b4a200d63feaa22fb99a251cad66624df4\nB = -351242b6e6d0122f7120deb8357c3bcf25d221a15f83579883bfb4dc2e6099e6b7b95fd08f6e573d93354b0676f7bc9fad563d6eb0f3567ef43efe3d874b9c7733e4fe1ef491043e1f80aab6094cc9b9c236570972233ea74e8779a6eecda23a65d08d878850cab6005159265893dc0f66920a12c26dfb421ec326a1ac09e9ab8085825c31aba488af02cd51f96b205c50e692dbf2d844ff0a989c3ba9f1c2bc7f2e7dd9458a72d310eb28d490\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 69c7fa326630d7de69249807cd8bc55c9315acac26fed3caa3c8a9c6b51ee96a7dd0b3bacd5cc13c15f199e268c5eb91d1ec36c085f83b437b9906caa6e39ed7bf09778610b621426cc8d36d96f541d0bfcc7693525d33e0c2ecd77ccfe80289a11155b37c7ea7791b5c2be3f9b954e230c19d746575afe9a1a3a9677d23c5bb\nA = 7cb78ca8e5d903096630744c85975719c16333e2e44931956d8c45b001d35ed4e184dec88c9e2167d2f338fe6f25540a144cc419590a4ac7caedea3bbbc565365d3357baa62fdccef2c5ea616614e0bff60e81916eb4abde0c9725b1bf6869e8b1e11f6d0d08fd712bc68003e55ed462ad4946f7f982e663f65d45c07c659d9620d5139d2b3332a68d33aec36e21716a3b75f44272a19f860e6ab3864f06def9a5ddeed340ac0733353\nB = 16d5b074e008fdd30e73ea95cb5fb87de806319388b3a44f33c94d38be0e6f1a92103dbdfb3d23b6e1d19bdb29ac14833003e9482cb7524d0d7b4c377f4911e3372f2cea6f84c938d84e3994e80f0d68e7e385ca29e02f70294c921dce7cd3829c5854ce51d1f4fcf7dba910b51b48a3f53cb1f187182435f21f6981cf8440f9c8287a9749c92c0304cc2bc91eef32d8e65",
-    "26be802de8aa16684e8854cb0b67d9f7ea00f6f0145d14e3c251f70881\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 72192604b2f3f68b9ed3e261120ea52b06a05869f6abd21828ce8abadb3a71c360a14947bc738e5d1d530b9636d796f785bb44508477eefa80c4b77d4e8e35463e15ea2a48c682d3288c5abeb66181e4bed7d5b4e0db20fdf5ed68513aa5ae7e0978ec1c4646368f206636ec90e808817bd1d03acf9adb9ba57dc153873fec11\nA = 1112d291463b28ef45e879412e6607a3e20d50dba5044e71883bb3cdfe9bc694a577fd7d896dfb836a171f3a4d8fd025d3a979b43e41baafaf7b535d9050e47f4880828640e952435648960bbb74a3c25dd90bccb3fedd254dfc0f031d0e8a468e93bb69f771ed35f1653cffea1a763491fdf6efa21aefc287cb611f5ea0085f64cc3705c784f87ce00846901833d01a3c45ce047d822ba390b538f0a24720155409f60ca0d90e13991aa1\nB = -d553fa2dff0265cd9d083ad097af87a99af3d8d93a9f4c07440a28a427082004ae5c81d22bda1dd2429f540de8df175c1b4d0d50f0227489ba570b28baa35055df951d05b584ae6b051a135d7eb2a501b2441f82c135a8ec0eb81d379b96ef8f2fd526ee62293bcb934c76ef8083727a4b28bbfc9f515ebcc2bb7ed9594a106e137ce94e9105b2e2f4776aa9c6abdf426a181181fece3251c3ef4f8eecb634e6bd47c5878663fd51c74a66b92713fb7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 459e19faf105ab17ff794927aff86196b3cc3461e69cada53ab8c8c81e2b1820408421ea1af6ae10257e8cd9dc16386906410761fed62cf9ddcf0da2a92800d99563fbb9cb1ab0ba46a17cb9dee3f2b68992c2b832a5932e4533fbd5c4487d870f3fb5d7a1c358f4aef02993360915a9e9cfde234df5f51c761d84568400b618\nA = -7a964c62e38e4124cd2bad727138dd12a086a2bf01c095b078ce2f81288d3c8435ccce0c8e00229184091130989434bcd107a3a0787a2f5f4b0e8c23b1cee9a8f39ea279fb6081efb6c3df1704fae9e87d63ac6eac4c6687b3551ab7ddac5ca0541e12047d04c2fc760fda0916cd2b585a90d25880fcc1bde8f0a1a413969938d42e8b3b5f73118798e85b901c2e15860e29e2ee8b1c95336b97dc10a21f5300e0352adb60b40a8a99333380\nB = 743ff4d91ea3e0f9c4f72e5daecb4fb00b15b86e30bacebbe4384324523d14e22abe29b00573733f594d652a88d98c987f8db08b27b4dc68577784fde02dd410ebdbfaad9e9afc6a22a8cbb13a780222bd212fc61e38faf409e940fba35ed909e6938e83b0fdf5b5e3ce138604823e788efc3aa0df924554fb70fd2faf8249e17a827c5d85942005b328bed97e5ea1f1810219d77f2fe121ce66518e37c84d64aebda3c397684212384deebd520a776b95\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 183950095d9424b0ed09985aafbbd2e5d64bf541a56b68b42ea8cf9b2c051615ee7bb6c0687ca6fb0036888fbc927cb7aeb303750871442ff2c0087a95f4efad568f48b03bd2b9a9ac26af8c259a3fa97cd2af7e3d8f36148c26785489cda6c00a21e7eca219d1f41b2e82ba8e2c1cd752eb08a2fd50c6f9077f3096e2eba05e\nA = -1d2fc778cf44c6992d1f3a056860eeb12f969358cadb087dcaebf5f96bec42bc0aa98672260adf1732da057e9e0d22081e33f5fa71f248cf89dd361036ad58692637cdfff584a191279f178242ec0ad397efc52e99462f496caa0f3133c4238aaa877fa7094662f080eb284c4cbeb992a368c2d157ac5c8c9160c167716406190fa39ce0abcdac52c8020969b87a4f84bc09a51f7b2ca288c93b1aac64e19623a7d9e69976a31074f637e4c82aa\nB = -2f188f1245b75cd21d052ec76edeb5881944a143fee31c67370fab0420a748f3f1957bb8332ffefdeabd0ca806169629f130c86c99bab490a9668fd8200f4a9b1704c589e75b5c8c855f133d50b2ce06191875e2872b36c78438d6032d53004c047f49e4cb81e19fa84da16d053e6cbc7c8eec0b9129a8831eba690e0542ca3fefd204258624e92844c8b7bcdccab986475a47c8b22e89079ea6580ef8f496099cc24dc2911dcb1921d1451e2163b55bbb7db\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a02c38d5df9ff7055ff84122342ccdf6ed7f7d54fe8227af091371f5ae62844645586adaae99c11f4ccd828103a81471bac72dc20625962e41d603e760591bb3569a21f45bf062b86b5fd1c617a4769a4d767a0ee14d104084c12ae875316a8f2be7adec0104381dc02c20b5851efdf7d4bef0d68076975e0ada3e58e101e8b4\nA = 5daf37d616da184acb278a75fda4e4fa49e544eadcf373c054b203a309ba198233f2285a1b55dc92e05d0213b26c82e261d8383a845813077b2e1b5f4553400f09410987c8dd21d4383e0f05747d0482d1a89f160a5220b22c78393873564fc5b1e4d5627ef3d4a05612709f301381df35606e99560fba07a917d7ea7413110fb5a8290e114d5200cfecb00b6c53b2ee29911bcb2fb2930eadba0ab9dfaf46443370307d9c3b61a329f0b8b8cbe7d\nB = 1d9539fdb1afabeb9be6e774dc7c7cc4bb4fd63af7abb557a5fc80a3fd23a4600de3c7fae89b91f3d441b61d3e24b2fd3d7803cd71620e7313917b4afb89ef5171a3d8a68c3c74aa3dfc8058d555eac429dfb6db40a9e0c25aacd2050418d6f32bf21cbb76981269dcd5883178d4b69a931a0338b93022a2ed0f78f3d8877989cc406f19d6d082ea344309318c56be7946412ea0867c78418ec32b9fa3a61017c10939c9345021133116933a3d1eb86a3ef16424\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5fca287abf1f487e0ec18c230860eed4a2e550228b1500b1e33bcd6675646b5afe505b55073129f22352dc2b113c584ea1b98808214b6916933e90e036b129b61657cdea9026e1fa087ee300e055ae8f94ffca933a2d70453ed220468a5a3cf1a65d81eca11cf570d7d038722397f487af60531f24a5f069671354882c8bd2c1\nA = 1d9fe15171dce97475f4ad329fc8fb5469fb2b8086e4b01eddb6ceffe5324cfbd28d791705848569739b6758ca7e7d7d49adf0c11d891b0a5879ca870d1ca5ff475513322ff218cd26024f97623bb8a53084594e1fd64154e1db702522883fcf4c0d677a7fe90096fc76dc3800816996308d8f0be2dbf3b879f8a000c0ac534511437e2ce2d7ebcf42fd1698a829eb846b3afa581c24d5bf97abc6e247f110f4e872a2474e3acca6c8c0d518104c3375\nB = -dc0da8f7adb8e9f7b0e3f293cf623528dc8e9668317910417e52301c50c62e7d30e77ec7e38d6817d1f5a93e851f8560f642f23a0b9f836812d27b1b41c0867088a3108332b8711047560052ea30c8840f03a25c65b227a175d8f340095823788adb5bdf2b7ebb801e20f6b6435e154f78d17b8fc4373aecee56ec7b8f5686a7d22c8571797fde85cec884d45ddc4b1f2cc47ebf56a879bf286f349a0edfb531168b733d43de3b86b49eacb10b06a432c96c63440b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6222c1a14c6390d73944cead58eae5e7a6c19d19e4563c36cf624f5b61d99991bed7dbf6a0723abc56469eedfb1f7982987c2c7af6191178cf0933ed5f191b8117c9d726cdfa8b82a2fb25ca5436023f5860aff5fd482c611f134569ae87395dd99e5e9d400b5ab1e3064210ded096411654518110ea45899f4be2516e35a229\nA = -7f6766be6c6ca9bd1fd7ea1f80bfe68693f7ee4b5ba2946846839060d6028eabbb9079a165c1a07eb6a01239f3f14095225b8617753a1cc3d9c1e69b516d8705cfda396f4f0d05b0944a0f08b478d261e968c06918914ba87c8e7b7adef5cc2a875917d00585571542af219bd726e502b7f3f0bdf0cb1dfc6796be2e22e8ffb5b8bfac7e15e991022974e75d3a5eba214ab8a1aab2fcfcdbc6ded2abf834d1899d2e3ff94bad9c696aece045212531773f\nB = 49c6f869745983cae44d33cb7ba141234905441ca53172abd1a2dd8bfeeac4b236605cd2dc5b04ff9aa13de84872145b935b85479136065d2d57fd15fbd97480c25c6354636c17ffbca33c9319d65e82523e39fab49321380a130fc160857a451a69b1d0509d5718a9cff8b49c2d677c1f66bf77333d2511f58d3eb2fb47b3c162cc9be8b012d8df70278f0e21123a69724a1f126369a236d54da026ebe222c513f24b577707b5ab4b90ab0e22b4e38ceb4181d4ca101\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9e9cc8c5342dc6d6daf55fc9aa9f79ec18592e8b9724a66881c379245c91f06a7df50a6ba0964603a6dac97e77a55d06efff17c93d5faf107fe65788d0f56483915f6ea0f1ccbda7656eb58fc032b5771600beafdc12c2076110a9b9670bd0754ff6a72c5d6e1a9e4e42c688e1cc96d7aecd815bdf5dcb16fcd1be1275ce7282\nA = -11635fe16dafce21efb1c599305e9a16eb5651187cbf054cd9d911c13e8eafbb738013e212f9c2b3662ea15ac9bd82b5751d43a38e4475d2310945a8122623090",
-    "94ae9cf59e0e9f3d02c92d8ab01f5733a20f051054a240bcbe3a7b6bb3f7c434229f631c4af239d33bd3ce30a372a480fdb49b2716091d26071aef372b8bd8ee8eb7f2965a372a836000b3737d2a833a39230e721e4844e16031ad69cd45ced60a64510c1248fd776611934d8d2a913d965e\nB = -3bb2cde9d3fda96fd7e6b24645f8e00b43affb223f2b5c3f4b7cfee905ddd6703a9d6c01f1f099ad1174da215a645ca4707d8156e762e2a253d7cfddd05ca19823ada9d33924013f677cfe4d86bde025391e0aaf91c6b776a9cf8a09dcad7cea59ee7aea1cf5f5bfe67c9d4456332d1f98e5310db9a0230381e1867a8f75b8757283f911f1a5e0d4afe5d544afa8d86637f9c9d87428fdcf8b4eb8f477e617960948253b24565b2f23081c47e211cd3c788a92732a49077f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 30dc89bad4b449d1df9ea9b8f9d40b323c71d7e1133bc44d33bdb87c38cddedf83bb849e83436e4c92a06546fcf3e24ce6cc89d2e97a48aff2c7e3703da1b167a112f662a89742355e11e131e41052f1b379753cfa32cb0efa3a07465a258c585cd68c86bc9a473f5262c86c50992aeccbb9725b69ea8b3a7ebd2b6a24db52dc\nA = 60463fae1e9354559160d55a453c12d75775a53d1606d1fd16bef7e4ad1c78f9568954112f9280c46781180951534c5372dd5aaff3f33ac9c2e0ce4934d7009aad2ab5d6a5e5a141a36846e8925c7a28d116c68fb78aa9a687ec9bef173c1b69e0d7261f96eacacf237e1fe5874e5d553985b0fe7692ce8f2a5feab9ad9a2ad9c4bbf050b73b8030ebc36b94af8c6ecb67f8c94607d80cf600efd4ce4aa006f9b1832da8a1fdf8a564be0b4369149e8639e1714\nB = 15bfc50290b771ad147695a4c6701c47f2e8aec0657a4ef999eb45685200981b0ab5f8abc143d64878b85e9548651a1afd0913e3b14d11d3a26ab9793596801662a67b0062fdc8888feb029266f71d170518b6a4a040f59996bd4f257f221e830d0faaa9688aaa6afbc1f9b40d25097eab9d71d80aabc085f3a07e48bcfb37119aa00de60be55fd07d5b1281adf7b98bb589cdf2026252edf2f075ee176e23afa6b1f924c9fcf3c34c76752e833278a2e6b62017b88b77eece5\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8b506c9bfb75ab7ab420ae6c9b371ef035fab512188d9df76f0b31831573b44cb08266186a04d20cc761d61b6df3e33ecb86c269205c2c79ae6aa4d3ebacac8ec71d9bce1d7ab146530b131c9038041c6ce8152a6f1c09b9bec8eea4462dda0f08d75edf296eacbcefd62a0c197ed30f799343268bf6edfee4995958db7e0420\nA = 11c16713fbf8bc9696782cb5a88174cddbe68a04e8fe93dd074aab33dcd85f92baa178b2f3b8817be0cecb802cfd3ebb06734c9d399a1f090e3a8a2110aebbba0e920427bcda74bf11700b945985bd532286d44a1a615cf7c501412e454edd647f8371cb8149474557a0d47cbb782f460de7a3cc28991491ea0fc510286711b882987b09341c079565414f2c930e7c3c3a3e3e0f1d786260a7f45c70e0fa20dfc63849906af61707cfdf5a9b7a4291a1c1586d16b8\nB = -cf5638af39c6da3757a09a92e0bd54f852742682dc91c71dcdc6e72f7825a0979a1ead2e158479ce5565d22472dc3853e6bf7ba43296a5e0e0a355f0703cecc02ec79da83e3e9de10a6eccb858dedf7d4c400c27486a5b8cb34d787cde6a5fd271e83a6cf66057838fe30db1f30663cdfc22ef5d002b0b5a05831228ea200f95382a58d0d8aba36523d9b5cb7506f193131916f3ab66ac9552c26cd0c2ab1c449eaeb8fde752f4f3c3f9b060cc1f8a1e37c4fe5ec306674b66158\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 347706abeb168205cef9b0b8c6b9d6449ac501af7dfbdfbd41a20a6a47872cbd7d4cd32f7b0805ecf1573d534418b7cce98181e079d5061b02639fdf0161cea5314dbbb2ef39ec841f695281f3c7de45f33664e0dd1658f645adc1dd225f781a3fb1634517c556403587b2aecd56dceca9ec19b930cead2b1d303aa056d28bc7\nA = -5e1c869e5dbcc684c245d5c69093bfeaadf388cbf928d33a8ae2148a2b5145937e4f654c5f6a36de1124bad1de8bcc9067fe1f9a44fc6ffe55ce7ed5cd0dbb6337b0e1e96bac1eb2a3606dd97b0bdb975ea59448be50191cc7ea36481ca9fc85c1c3e1c97378dbcd6b355622046888df2ab3d18d805f4d31d464f62a8e630e955beeeb5e00c70242b8f8df708705abbeb95dea3561756298b5f3f7fe16e965294eeeea4546f5e8bacf9d6b4f2136d2e206a87dad1f47\nB = 70225f0cadd328be36ece2172c836405db3fe80ef99ec74fca25406b73a537adf5073f2b550abfc4c0fcc2c2850dace0da9a266768cb4d5ff7fc6c1c248ad74f47592101b61ef96c1302924381abbd96cf49f50c44bf7e0551721a8ae85abdf9925548d13b8c5d1a27be8a40d0f43eec3136bc3035057b75aea779b4262cc66e6bc68da93c218f1920979291105d4b02117d66deb92c3e511aa588b27130202acc9f69521957f79c7e731bbd5461552b9b6b24240dd71ac449be9777\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a2cb238f326d47f95869e2dcb295eba819a443dcc7c2785461389b58327742702f4c86e47af129f1fd4611cda93631f9333c358a29121d58286333083d13e66f30a9533b77ba3e26089e7eff7baf19bef8054af4e24735525908864ea9c4756b42a69c897003cab7b63cfd9a5927ed562e29845308eb2a55e7f8f03c87a5b7ce\nA = -1aa7ae6f56c38b654b281525b9da953ef366c2b9cffd3042105ed428dc7e5f2f2d53ef90b468bb471753606cc7a3775d86bcd2f4d5119cdde3c487cd39bf31752c5ba297e529c1b8121487e0e1de702156d0166ccaf51888a24fe7b48624eefaec855e2200929c21858676ec9bf4ceed0a832b69efd5065af544e49a3d209b85a77b0953652cbf0aa897527c52c9a98de9ae4c827f762e251478c88d410123625ea52b3478b52f6b9987d42009ae427763357ab53195772\nB = -226630b6fcdb5e274a25066ae2ca2c803549dbb935a97c0d7f6ab2c971d74cf6acd265c9d6815a6b2dd23dcb3c23b390fe8b1bed92b8c64c76c0ce62d5e7ddd7ce445bab0ca905dcfd0f128e5f4ffe966f3903d7ff1c61fe174e373cfe35a6d83249ec40b4a354d46fa1c90682efe468e895ea3da710838c262e8a47752dc6e7a79fe20051f51180173b58e0aa37b22eb8efee5b6dc264459ce4d135f430cb15afbf8c53f0de894bd2aca1f7ea32b4209a22a075f7b3b18e86f778a9e47\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9ea62ef634\nA = 55cc58c9d8\nB = 6b49179821\nM = f753311ac9\n\nModMul = e9ab3a2aa60edd30108\nA = 5134a36c2bad180dd5bf\nB = 2ba6485656d041690666\nM = 9b9cc4409e86c8b0fbbf\n\nModMul = 621f9b797e866028b7bd1ff828bf29\nA = a202338dffe171c99434d84f3\nB = fb71eee7045b3e3ab5dd809dd\nM = b3e6e8d53b7249df670e3c59c55d33\n\nModMul = 808d463d06b7b7f98e3cb2783e2196c349d62672\nA = c669426a92d3cb5b316e2b5b9\nB = ccaea3874008dcc92450d8b2f\nM = b04dd2bb325baed1940cd000e8cb2d786009ccd5\n\nModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0\nA = c3255cb24a813e27c3dc410f0\nB = b144f39e7c2d33605ba7bee16\nM = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077\n\nModMul = 6124d7d171\nA = 235b938139\nB = 3a56a22a28\nM = 83eb4af4e5\n\nModMul = 9c006f56095d442ba98c\nA = 207e14237c42e3764e5e\nB = 8a495a26872432fa8e33\nM = d0cf2b8ae5c67d6736b9\n\nModMul = 97387cfaef652932a230c82de59cac\nA = 82ae0fc5e943af5bb8c4adebb\nB = db1279be12d59ba3a9c036a61\nM = aa36dc1d13390169cd54d711eb511b\n\nModMul = 32ee73c98da657464c6fed4274df20b099689e00\nA = 9baf08248ee24bcb17714e420\nB = a7f0428147bfe098666180749\nM = ce0bc198331c9ed1d21f0d498326e8185d3d602d\n\nModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34\nA = b36249e259b303e453757721c\nB = f0c1db50670d92abd93bdc84b\nM = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9\n\nModMul = 2663b741ff\nA = 58c8e7f7f6\nB = c84681fc87\nM = e0a50dcb45\n\nModMul = 21af3c0b42328f41b81e\nA = 1f79f5b5bf78c9700d\nB = 5bd1734ba0f0e59c2a25\nM = 9ff3fdfb5c089244f327\n\nModMul = cbc280b5106c2c36cb31ad7e7c986c\nA = cadf6482b769e83ce7f7277dd\nB = f9862a06da1a9c89547b76c61\nM = cc36144c88139ce921d2fd1740bc4b\n\nModMul = 3813f2fabe016e19fd8e70687ff473651a5fbb4b\nA = 9c51a5bacb5d9f055a9ac2962\nB = bfed5625b21b4e82d1f105a0b\nM = a47977acad7c5deeb683ccd265cb30cb193f22a9\n\nModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478\nA = 997c4a7b537d9500d73a205a4\nB = c679ce666af284a459ae5a26e\nM = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9\n\nModMul = 1a90c92fdb\nA = 94fa7bb475\nB = 564b0a3339\nM = a1501bdc75\n\nModMul = 5e7ae5470686bad7996a\nA = c725797912c6c5f30d94\nB = 3a7f4c99ee3f5fa9582c\nM = cc50c8b7408f09a74973\n\nModMul = 72a15b13bcd1b63747342a6be8f0f2\nA = c33357af48a2df569e3c11ce6\nB = a4b4c5c14d7796adab54b6cae\nM = e22a0fdca62a37f4c8a61c96a42",
-    "9b9\n\nModMul = 31e179bfbf65b0695dde36a4fb72d131830dcdd6\nA = ce8d3adab8cbf15c332c0b289\nB = 9333f94eeb7d7a86b82becc51\nM = a532a76bd5cff409b580d54d12ef75ad8179b381\n\nModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14\nA = 9a2b56a54bd0727ab4be57ff2\nB = edf1781b4296567990773005a\nM = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1\n\nModMul = 917bcdb402\nA = 55c7dbd314\nB = 997b29ef79\nM = af5b4cbd0f\n\nModMul = 660c4bb2b771f523a4fd\nA = 43fe52461d5139620a11\nB = 1f8ec4b67de1db54ddda\nM = d0458e215b7e6903d96f\n\nModMul = 7aeff02c143e4426fcbcf32bd1277b\nA = a2671586369a990dde7829f36\nB = c7ff67937c900daccc0ab1d8c\nM = 8ad9c1d4d3cce681d1ae27c27982df\n\nModMul = 4b153d57433f0f7276674d3484e9bd0d25227d07\nA = aea36cf51dd2ce06c66b7a407\nB = 80c9fe5bb0afd2bf8b3644f96\nM = 8cc22a67ed7e5a7a2322aaa09ec2be94998494f9\n\nModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0\nA = f67636b03821c8f13f21217a5\nB = 8473a29f4ae33f36a0d2c6dc0\nM = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5\n\nModMul = 17fe4644a2\nA = 912611576f\nB = 7a10d36b80\nM = c5fa605133\n\nModMul = 8159b23d4fd697b4fd35\nA = be2d646e76494439e60\nB = 60fa770d05ebc69772b2\nM = a6e7c940cd749925a85b\n\nModMul = 7c412dad5c9fff91357bf181caf2bf\nA = 80f476ed5acae75b34ed54c52\nB = fb818e2bdab3b5f4bd84db3d0\nM = d0339f7ee41337d8462d1a9c207d1d\n\nModMul = 70432c749da4ade2c38237545ebfe6c4c6a92f6b\nA = ee9c92de52210e61adaa6eb4a\nB = 8ab55a85b1abab62d33e75fe3\nM = cd3faa6de4cb62fece4c3f94492d457834a6a041\n\nModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28\nA = bd162c90bed25e84dd5b6b77c\nB = d887ee03020c5df356f091db6\nM = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f\n\nModMul = 958951bd0f\nA = 12bd0d3375\nB = 668bb65b4e\nM = 9c617dfaad\n\nModMul = 8a109ebc9cbf86613e43\nA = a3e7019f1bbc35689a77\nB = 3189ecd3fd4ffd0229ef\nM = ddadc50600dff2abc1af\n\nModMul = 2b4d9f85a398c852b3a0cc82524619\nA = c244fd157267f707319ba6c6d\nB = 8a07018a748992429bbdbf326\nM = bf3813fb54f749ea5627f59ce30e07\n\nModMul = 28cab7d574e6dc56a6a622f8a7523cbb8dcc5e0f\nA = c9909dcfd3a59a3cfa538b267\nB = 8bbf89cd5a4e24adc2d8c646b\nM = c8f02682b9d480ea98faaca53b747ced33ed0419\n\nModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a\nA = 8019266c548982a520ab48eff\nB = d33c3e3b13576dcdb3ffaa796\nM = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1\n\nModMul = 3eaa4c99fd\nA = 6fc42faa85\nB = dd0b4e318e\nM = fd7f22301b\n\nModMul = 56b6b811ced3433755cb\nA = 145573d17cb0c996c69\nB = 9d3297d5ccc184896822\nM = dcfb3b383506239e83e1\n\nModMul = 34315b6bc6d3690c28060485ae331f\nA = b963a26973894cfb42fcb2d22\nB = e8523304bbcdff1a0ed4141bb\nM = d7a379aeac7d8cf94f19e7924d35d1\n\nModMul = 2ec9466e8b3357496f07e37ba24d36a237883846\nA = a75f3904e564997695b6707eb\nB = f9f47bd779834dc1f5fba0654\nM = b3ae5abed45d09c4dc5abcadc3ac9abebe1949ed\n\nModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044\nA = a38eceb9c551f0e69a544072c\nB = d5f8e7c2d534b2b8985bfd213\nM = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7\n\nModMul = 172f2e2e22\nA = 1584ff1055\nB = 2e0aee014d\nM = b904cb0bc9\n\nModMul = 122c10d3200270b9eaa1\nA = 86fd189e62a6dc1e4ba0\nB = 5235635f7b0336f5f235\nM = c93da97d0e95fb63dc4d\n\nModMul = 3e461e10ac4eb749512097fbf76616\nA = cf4ce10cbca07164f3812f89c\nB = b7e4639c233fbb0f923fb5104\nM = 949647857e1406871593fad5c30101\n\nModMul = 88117b59d9fed79dd6aaf083ee938215a995a221\nA = 94c888795567d434123d441a7\nB = c60ca79e61a352e34e0f78bee\nM = d2553a7c5dccd639a3927697a2e1af03845f2f25\n\nModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c\nA = c170eaddca5295d6ec6272dc2\nB = f94a5685ced7661df2efbd34e\nM = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd\n\nModMul = 1110cdbe5b\nA = 5db02b38f3\nB = 3369537903\nM = a8863f7979\n\nModMul = 90fcc5f3a346d3d4ea4c\nA = b93373680ea0feeb31d8\nB = 37f9dfaf0e180be64bd5\nM = d595cc29237d1c19e2db\n\nModMul = 8623a9997e514cf3c1d06c33c14053\nA = b396f5ede6212f1fdfc7e7b77\nB = 81a1ddc18306f2d2e84030148\nM = a6be32a91b34857842255ef8b1aafd\n\nModMul = 63f8f0254df06356f5cab8941b77619ad58025ed\nA = 806b2627b08d987438f920bae\nB = 83297039f4aa8efc1a185fea3\nM = bb8a7e7c19be02c25cf5682a0eee655fcd5b69a5\n\nModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438\nA = 930b04224bc097ac1d8bae8be\nB = b79496a80e45212c4663e5b64\nM = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1\n\nModMul = cd93b5b8b1\nA = 47a51b2d5a\nB = 86d6ba5155\nM = efb0ad3643\n\nModMul = 2037821ea789118bde0a\nA = a92215dcae19be637ff\nB = 93b9a3664a406737958f\nM = 9df360b69ed26f610253\n\nModMul = 3bf11785d28ceb668dc55b870faf7b\nA = bc8758854dc48e057cb6210de\nB = f03ca689620a77ecd8a6f0de3\nM = f3ff0747d6e5f34a0ba4200f579259\n\nModMul = 7b30b44f75ed12f54136858ce4fe77d00e0952cf\nA = 993cd09f3e46423a8ba2053df\nB = feabee384158032dd013dc08d\nM = cd0b21388cb2033b1e792ec4078334df70b6c8f9\n\nModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650\nA = 90e5d18b017118177ffb080da\nB = f8e7e09032574f6c66e623ec8\nM = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11\n\nModMul = 8fcd412054\nA = 2e7f9b1a\nB = 6283de2c9a\nM = 9bff560ae7\n\nModMul = 57d0d3b79f1e2f3632fc\nA = 2f8cc403de5af54cfa39\nB = 3b798c3ead52878dfb2f\nM = 805e6cbde400d4b4bc9b\n\nModMul = 23331614e88633af879201f568c359\nA = f21f19da4b20980979a645dac\nB = ea752050b79883dcd69222536\nM = aed3faf4c88f7c4afe257c5ed90599\n\nModMul = 56dcf9ae1c787e773774df3c8762babb4675a212\nA = 9accf901fa599da05fa6ab5ff\nB = f7f6b9b1d7bae06237532e39f\nM = b5bcd776bb2eb0805ade3c8b47e883962d3cbdf5\n\nModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0\nA = 8e57680f213d088ff1a1e7db3\nB = afebecc9943b0093f87022940\nM = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb\n\nModMul = 143ae78a29\nA = 334abb952a\nB = 74203e7a50\nM = c9535a9505\n\nModMul = 897a2b57e69f5a1469ea\nA = 1ec8ca0ea4fed52bdbbf\nB = 3a6273cab05e478a57b8\nM = dcb33163a8ea42c1ae6d\n\nModMul = 4a2c10e90e2d37111db79a44d3e31b\nA = a90e7bbd63fc4af6de83029ee\nB = cf09c3dd50b41afc7045e057b\nM = 8ab85d47e4270116a64f97dc4f0f15\n\nModMul = 70f94276c9d85fd3f71edfaad6051456f754da85\nA = fa3e9ff6e1aa1fb78e51711cb\nB = b115ed197c50b7ec4040ca255\nM = ad63f69ef1346e7549ba71c13b24b279f53bc9bd\n\nModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac\nA = fc41a9ce06e882942f751be7a\nB = 881c05a51d1ba8134d126a48e\nM = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f\n\nModMul = 4e0051898a\nA = 2a06523f70\nB = 651b5044f0\nM = 9da4eb09b5\n\nModMul = cc8274c88d6affc3742f\nA = 9ccf0133f9628532f4f6\nB = c1d80907057be7a67b01\nM = d6e76e362da831f32685\n\nModMul = 568f15bed5c4405be9dd04673a9c46\nA = dd6029c3196feb6da7f0f4a48\nB = a5f6745f2cb64913d1d3236d8\nM = f62f02c9b9ca8993e3be9a02b444bf\n\nModMul = a629452d5ed19df040eca26eaca37d82c0fb1d8f\nA = 963c51a9415b03e85ccb09f25\nB = b1cffe333afe44311cb968ffe\nM = ab2128698d498e8d75455033cfbbf4487535773f\n\nModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf\nA = c3b33f391e78bee97ceddf313\nB = a9136f3af450fdeb245eff425\nM = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35\n\nModMul = 8735bd486d\nA = 563e15c52a\nB = 31293264e1\nM = 92f4b193df\n\nModMul = a541f69ca163b288dd0e\nA = a608b48c1dcaa18424b2\nB = 891b0b296e911068b00c\nM = d4140921f4b2c84f1eb1\n\nModMul = adc1b7cf65967b013d046866b4ed9d\nA = e97941448f65060cf63ecd486\nB = ca68936f76cb87a8fbdd37311\nM = ebbca2482fb82eeca2866057cf1179\n\nModMul = 44aa9f0dd58d4510a7364e130698b34eda23a632\nA = c11f83f01bb964ffac93a2e30\nB = e05ee40eea39f4538d735193d\nM = b5e8b511738979dc740a6a1f7291cf4561787be7\n\nModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a\nA = acff8da571e1c96810bf95707\nB = cdd23e5504cc26d0c34a62b06\nM = f38902a99190ae0b5ef26849a6e943d651925666fea271fee7\n\nModMul = 193f453197\nA = 8cb3078675\nB = a8fb003a87\nM = b60ff22f4b\n\nModMul = 849c26c8cf5cae426a80\nA = 5d1e3d2b4d038a0a34be\nB = 34f70325565bf0523314\nM = cbc189f9a732cad8f425\n\nModMul = 9a4e64ff530c53a4c6c5b6b5021920\nA = f53b81723cf74f520a61e614e\nB = 9d8ac2e6b839143fdd079a2ff\nM = a115375435151798f3644bede9d863\n\nModMul = aac303a4623e80158af1cb3331965cc8e3184edd\nA = cce0a88606ff962fdc37e72c9\nB = 9840a500a2051625c517104db\nM = b99dafdbd91ec3c05791031df5e193c03d6a441d\n\nModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf\nA = e6f48c027284856aaf3b96425\nB = b4c326f72a6a22fd4b93ba5b3\nM = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab\n\nModMul = 8b0929adbf\nA = 61fdf77ac0\nB = 8892f05400\nM = f12b3766eb\n\nModMul = 91b57f353307b173679d\nA = 33f8e73752072b4b5cfa\nB = b4c730f79f4f2c07945d\nM = d41be1d8d2e5753e3ae9\n\nModMul =",
-    " af04c564adfeb120bc4770bc8c650c\nA = af151333b3d4cd1d29fd801db\nB = 9ccaac44ff91be11b30bdcdd0\nM = e0bd6e70d5f5ce08fbbfd48d43101f\n\nModMul = 1b8d623796a5065d9e993a53a9587a0fdbea1bbd\nA = a2fd08df2d4eab0cd6d29e213\nB = 92c9d26ae7c215b52199ee28b\nM = cd529f4cfa46f3bd3e7fadf167fdc02f6f881da3\n\nModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd\nA = 855f941d085305725da617f5d\nB = 8f09b7d2c36e0340523da5421\nM = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b\n\nModMul = 2d278e089\nA = 59d20a1716\nB = 8e2a58bc75\nM = b3d61ef699\n\nModMul = 2f937ce359d0f6cedd1\nA = 1019d11d26040ffd5b1d\nB = 7cdb6252087423d43e08\nM = e8f537323004447e669f\n\nModMul = 6567332e25af83089f7458786ab0ca\nA = bf9565e9f8a098894447b58fb\nB = fc867626f268c24cc0ab7bf8b\nM = 930f39183353363dcd822933a438ef\n\nModMul = 3692e73ad1d91ddc19cad3808eba2c5fc88e2bf9\nA = d0a42ce512629f0ffd233a9aa\nB = 97f6d3c4c655c7353a62d6ac4\nM = eac2ea84851f880214b8f40f881a2e56a6ba6f2d\n\nModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58\nA = c237eb242c40960861c938c08\nB = ab2f481f0d768eebd90d2574b\nM = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f\n\nModMul = c952f9aef\nA = 81973bbcb3\nB = 28ddee3bf7\nM = c4a40993c9\n\nModMul = 241dd53d93f7bdbbb2ee\nA = 2136eda4495c45c9f96c\nB = e74c4baa8ca3f6b7cd5b\nM = fff4594e7a5f0a1d3e15\n\nModMul = 5f861ed8b0aa835761613e6c869cfd\nA = bfc5c1572086079f5f5d18d1b\nB = 95902e14923c8010b7e905178\nM = a819c6c109d623f9b845aa23712c9b\n\nModMul = 5b8ab089c4e4c6804e48a2bc1d218718b3a32598\nA = fbe65d3852224a812c432672a\nB = d57a3f38da966d2471d70a048\nM = b9e6a626d3ad026d14248fc90c882bedd64a1f13\n\nModMul = 761438baf5b02dc095b7040e082da7b167c2b9ace956284ed\nA = fd91701ed2151f8e994bf4ee1\nB = 88b66e735b76972bccd9db182\nM = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55\n\nModMul = cb743c97a1\nA = 9c69ca9b60\nB = 7488f48f5\nM = d67040ed0d\n\nModMul = 931b2bee1bc30725a31\nA = 650f567b544ce02303d4\nB = 5858da30dd1fae88a675\nM = 91ce30234bb29fb9e833\n\nModMul = 5b4f262cec958a20390b5e568ccdaf\nA = f7e240e8a077e8e87506db2f1\nB = f8653fe64e3bd414782f51634\nM = fdb8225eefc1620648737d31dfe1f7\n\nModMul = 4c011d1ddfa30c901793cc6ce74db47584cebbd1\nA = eda8e9a9ea3cdae17bd50b1b4\nB = 992e8ef4a45593e4ceff67876\nM = 95e2f120cfcefbada1058af6c8853cbebedd5763\n\nModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466\nA = ca6c51ba2f410d09bf71d60fe\nB = 8bdfa8fe5ef3b2ad02bc63c4d\nM = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb\n\nModMul = 536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d\nA = 9b474b6f7d7f11dfbeb7a0724694f2daf9ccbaf2ec13269b5ae3329e8df95f7833baa68324509dcddfb5afa1d14f2dafc55e2c225475f16fb396beecc7a66dee\nB = d74a5081f00af2361c3537642c06cd47aae7e366741c9b4785e185af8b328acf3e2ed71e3b9a4b6fd49d956eef76740b3c6ec5850a90e7e444dfeaa7214c5eca\nM = 5efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb\n\nModMul = 6161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634\nA = e7d6b74a1af0834aaf93e09a6488340b661449ba2bbc73d775e7d828163813ddbcd82719351879a6d67ab6b518011e1db43a3d620d1f24403917691d15ed6f90\nB = 3ecc8fd3103fe52a7e73ec4be4e60b69584bd886a030f017b482bde9d4b0b964ba8471cb32b3e9bd49864d9028a22d6b6b46be0451bb4222c3987b74a509f8fc\nM = 7c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59\n\nModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76\nA = c221d1f0d1b7efe7e078dd01bed773f8876fa324b3fe91985d47d343e7f3878b457dae2f9ae68971245278a1d23cb541c56b94dd9ac43a9fbe28a46efc627651\nB = 49f94c19ff7ce990637c3d2019ed66f7e6dbb1442b04a4593cc480521b991cb1b878f8c31903240f89e34336d9e6785433617e729b71adcbef622a683357e035\nM = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb\n\nModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540\nA = 3fbabe2d65f443e7db0a6f332330ecc4d1d40e14fcb510499552020405cafcf10a50a5ee47cf60fd8c22a22b3f753b4167c213851f32109babe4b5c298d6c4cf\nB = 62e5b0f887dcb1f1794bae7dad46a066f810cf5f82a1eea99207b5f0fb0ae9084c5e62cc97b2672b1cf4cc1400a19bdcb093c97404876b584a6482931e7ba9b7\nM = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7\n\nModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db\nA = 7e1fd0bd9ab0aa75b264475604aea09f24239f94847ce2549d43b71890c0549938d167adebc7890d3c492b5874da7bf18d895ccaf1803b9776820598928b407c\nB = 5e54e5185bc86f16177f1354a57d36ac2980def141b389e4bfda134fae7c158009ccc61ef66281905128b6297f876662104ead2315024f129c56eaa387f80b4d\nM = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401\n\nModMul = 145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4\nA = a195e4315caa8cc0707063c7359c28139d4dfffb57eb726156336e13227ad9766ea1fc99152893ebb194fecfc153d47cb927a633217328f05e4d8782aeb89d04\nB = a97ae97dc7e9a224cab94ecedc08d0cbf7a012dc5209b1e1e8b5b843fcf61e65db3457d6085545a633be47b742e8237cc716357ff5bce9b00e23671ec1d049a8\nM = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1\n\nModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658\nA = e6b97c11ad44fd451d168d65d1691d2220db8c3b6c8436d59f4c1366aac52558d0d6b61f5d6966460a4a31085fac711e5a09af5563d938963555d4730982eb0\nB = 6805eab5a4da534f07def6d2c320a6cbdfe4831fc2163dfcef740607b3181d8647bfae8f8c16237c1c1c5d14b9e3417132f81b3a7db4b7fc11927aab30dca590\nM = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227\n\nModMul = dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764\nA = 7fd3310af09a67e0684dcd8e3b4b651c7c13c2f6a0a47b59a7f5cd8bd80854d1d4fe02eaa61843d6bb2b87f99d8ec4842864681eaf056538ffff610c231e1d\nB = 15f1661c59ee9f93400073e18a91503a93d47537d2da5cf5e4bc69ccc87b07bed171a95f1c5eaa9c7d7ab207ab3f1f7634c5d16e706969e869364207f61d84bf\nM = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab\n\nModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2\nA = 8e3abb1f24e1f91496db99be9409f57f67cfb6e0e33d603a2a31e1309f1d0bbdc413c3e4fbb5e3d923f683afa9942b9b9fad6a6e558b2297889fff47ccef7d23\nB = dbdf5940dcd68127d476badbd5a2f3018aa4d8db79f81337ddfcb108637110b934e946d3284ec09d5255605ad72424f1894238ee4f7964dffc27fad838532321\nM = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93\n\nModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764\nA = 5137697bf48982edd869e4a42f3cb858bf65ad5b25d1c0e8b75d054460d0944ecb5a6924721c5728964d84231c7ae808f556837aefb23fe3ad36aec9f5f60f20\nB = c79554304620f8116b9a8bb56f6a23620e9fd504f7163f732e1e6367d25c6ff98cb01d16faf3e018dec6a067d1204a6aa95470598ce757bcfbc3ab4f5d8ec88\nM = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735\n\nModMul = 985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233\nA = 908bff40440aaeee6c90b6312dc017c3bdae884a9074e02b26f01be1f018390e01f0d111f99a06c16e20538df8000d4066cd4bb3628da88a3a5cc240cfac719f\nB = 6ebfe9fe53909876784f9d6e5dcca4cfa9463fbd8426c5bb8890ae84c2fad119615fe1e1f2ee5fa544a5ac713ed1da8c1e04f282f1f1b9fba4b4c4bd9db20538\nM = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793\n\nModMul = 133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4\nA = afb695e3e40347f60a500e01fba4df1c1f2fd4ed79e3f65913d82369f79d80db6b3978e6351c70c148f572b9c0c2b1efeefa605251b3156d9b66d240467e550f\nB = 8855046dcf50f80f278227d5260b9be53ca2e4a1cfe1afce4d35b11d0fa17a36a8bee8126e13bbb318d476becad5a935e9d160fa481e1437b292bdc169dc7d45\nM = 3eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47\n\nModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41dee9\nA = bc2baf0153a4598f6b5f488c43b2546cadfaca2c1931b919f98ba71835a8fe78886da1fea25b194e60ed6f9e0ad23c988b64af9278155c1722dcf4983a1566c2\nB = d8374d91fd3c523ecdd6bdd265c9a8958dd222f9f0e25454fd683bd86d7900a273b56f1f47e033c46527e32c721094ce6bc927d25fac05d7fa6db4d7a6773c94\nM = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3\n\nModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9\nA = efed8e442154b1eb6c75775cc23e01fa65c9c361e222da123d07daad3039f305e7102edff23b65c333f0caae4f7929857c3169f4ae47c9f0fd920c38eb42bf2f\nB = db05415ea90269a74b0919ff772c148c0eeb2ff9dea76a6e73e82eb86bc76fb42308b55ef83a769a91d23b7840d5d2f5129f15279dfab7cd8d63778acf202f26\nM = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479\n\nModMul = 40b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d\nA = 6500f3cf686eec",
-    "4e1f243616ac0ea8e8d11ddbade490b86baf231e7b2fd55968ee14b6bb7badf8c898874099831976af46bcbfbfaea10d49aa803c6e51238e2\nB = 1fac744fa1e26e789639e049679d0e2eb57336279f09555e10210e7143199a3df5fbf5294edc386ac762fa3a3b0b4bc28945adf21a8af747a29018bf76d3710a\nM = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1\n\nModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113\nA = c4a5737a9496129a136753f8c2e52bbd2660f2d3fafe4ed702900b01c14e506d13e3bbeab19b357e5ba9fce8a4fc3dcc469406a16248d6fb53862781fd9d55e4\nB = 444e5a673eeb37fd3b4f6b6f5133b0f46c2ea532e1953da4a0e144407a8e2534c5ff40cc9af7756e5aff9df57d938fcedaffb868dcf4e458b36f506ed7fe0ce5\nM = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817\n\nModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855\nA = 4351965a421c75c5b4c251861e53316a300ed7983e27e17f9308420f0d2cb11e9c476294fcd9042a525bc1a044bb442d1d9f853c9e07245170e0e2711010cd1c\nB = 4e1046647c362c8f9c414be54075b4e9d151c6fa0c3da40d90e6042625947ca2c9f20cfbcfdab8666dac5a15f6cda9d47b09f654131fc5addc07e382c9639323\nM = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7\n\nModMul = 4452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6\nA = 9fd1cc81981bff977244c044146918057ad06d3cc26edfb8fb4118ee02b959d45555f9507ffeb23c3688e29ccdfe5f583fa3761f6727573542bee8ab5f5b600d\nB = 856e6a03b5c93fc19deea51b3bfe42c810c5bcf9ffbd08e2625eb209baf6a4e24943a3c090d89c1f70aea9f0128e511fe92e03715d917168c1e1ca77a3a8731f\nM = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b\n\nModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2\nA = add40f1dd6d4a2414b17f0c628eed9a8f082f3ad1f34ec41935fa86b34d4505b22ea80c062386a9ed63f95c67e55c686f837bddf8f4da791f98b08c02f32d4b2\nB = dab1caaa11d5a208b7a6b7a1d6482a4859daaba5e3a77b1b1020e8ae62a664953dfddd0b47d40526e7a3c6a5363c6d41dd9f529fd8b58d5d31bb67e745cb71b3\nM = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955\n\nModMul = 36fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df\nA = 52ee1498bd6a1677db801ae2eab4951345a1fcf8fe7d38e3f28dbc27fae508d87c9958e02a375ff4891b88ee916b96331e7cc082615faa028f6d541b5ce37876\nB = 9343cfa074f50c20e8472f8f7c4a7d330aa30ee417ed8027a4c956e84cc5cb31d5411c14796d9325fceef79a51b5d8a4c89182ca273ab633e6a7b22a27352300\nM = 9d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9\n\nModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad\nA = 19616a82b75b08499d4b1f869df2db8f71398672f3f97ffc6177a4a5aa913605ce8a6ab5f778cac508f0b3f2aa680b01ccdc57c0fdd6cd678a2ff2dcd7f01f3c\nB = a5643a9a9fe3be4134082daae4ee7dfd85d9452beee856fd939d3be9788b6bebcf3571c67ec481ff9b20f70d23e82e2171b1d0ddf0a9435b40115d32aedb6811\nM = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937\n\nModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6\nA = 8e6cd7639b7c134b53e6ae6ac5f51268da83ed09e8e96d65e4bb130dcdbbab9e48226ddba6efe93faa510bde8ee92f2a641774c4272b5a2f88024b77a2cfa110\nB = fe4e8109a49b16b96871e384564cc096277dad4e1bbca8e5feb33f140a4fb800c8f3096b1bc7042bccf249aede88e6055c0db609f94e214b1251eda494be724b\nM = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025\n\nModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d\nA = b0fd7a936b0908ba6fa797e4b855d673ff85d665ef3a345e560e2c0049becf5c25b6c0068dd617ab47a8fd151939ea0631f86806ddd40e557933c0e880fcdd0b\nB = 105c87fe2b1bf0be5405ca0d530beda1780f0045e892d7810f8a8abbe890f0a19de66497cba55bf38e190c52992467c22a320c38a4bd167f774ed812f1271d5a\nM = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335\n\nModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66\nA = 2aa4a0a73df11f4e60956619d0b35eaef45730d619f9b920298e6d369b9861f6411de28a34af038f288d7a3d6a35b10c8082b8ad0fb275a8f67c6832ac46ba9\nB = fae1d50b72feb25da2581829409391bf289cd9f730c99d265b5b2d63889381cde4adbf85c3998c2478f2866526b8f64605d75765edd09b78ea45337207d173\nM = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1\n\nModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995\nA = b0a0f9d05d144d2ef257c1e63a7127a3b8e0d8b64ff8f6447618560593574b5c5da6258b274efc28da0defd988bef1efca0f481f809665a78954b36741d668bd\nB = 10901b9dbf0016cbcc671da75a75b7a6ec6a66dd17b53a97344864b08f037098537380bfb0137b6becfc36a75206686d16bc4eb8fd54299494374e3f383d9b10\nM = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9\n\nModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c\nA = a7714b249eb0f0cbe3e6fa0b04e895fcf14c404876197defafc6b57026ae7e5e993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b\nB = b7278ecd154ef5243ad973ead291ea186acb63e09977e644a6a9fde195d1a33993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b\nM = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09\n\nModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688\nA = 2b65f491caf0b5cd9c66c859fbcadaec7213e6b848884638791b1620d6e4bc9dde087af0e7329d3b15a45df2d43ebde61b053ad7f63917aa922d58b4f3222620\nB = c1bfcdb34b0766be980540dc3256b9ee4158310fad2c43cf24bfafca08ee185647043f5842a9d9eda224449259341b7c50998086434528d47661bf5762a7ab5f\nM = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9\n\nModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15\nA = a3d8b12a2c8f4021ca045a4e4903687dea63ee7e88893b1911aea77efbff00f8f5c7884cbafc71f59fa2636195c2ebee61edbf642923f34d87ba5eb49b06a7ee\nB = 3231829c81b26dcac432b502ce22e126ab564922b1e9818cd3da46edc5ce7df026d0e515809c97bcfdb9666581efbfd364437ba9959dfad099f90472f97c69ec\nM = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9\n\nModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244\nA = e4ba620125f58a63fe12fbd3eccdea477d56b120c76d5d1421bebd74e8686b4093f8169070453ccc04b63b173568385313a1d9c841a4aa82a61cb84d4286a941\nB = e87aaa990307855f8e5f2e5509d2ce31dd4b13bb7199cf5fa0593e350326e222efc33a26c69245565d6ebb5a484cfef7d2558f22dea8054d07831d536803d0dd\nM = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897\n\nModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6\nA = bd64b1db27fa7da4c92a4ee092f58a2a53ed0f12d009fe13b36d5fd585defe778fafea4a60e8fe567d03e9ba3b72b189e22504ae8ca6aad7c2ac0f44abca2f6\nB = b487d8116198560d6c5b08c7ce63b0acc0c98e6f2a8d709cf4e3a409edd55f64d72fc27a70dc341e280ff5a1b09fe131773d466cb31991d2db23a2a86d225c80\nM = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923\n\nModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385\nA = 4181ee3bf9a98bcd49eaea243a179cddbf160981efc720685c7be1dfeb5aa552685a2cd46f340e1e1da893b3b460692fa2eaf6c100f24a14f239e45123242d53\nB = 77cd04d86dd5da322af78be54246dd6b7af490d903db1db03cbccde535570b81c6053a84110c07f097540ffe7510320024b7bafb77e9e239761def76092e1d59\nM = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5\n\nModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f\nA = 1c08cec52d96136fbd9078b7b8db36ab63b86e19dd3dba7b2e3190ff566180e89dfee9423fa4e99be2187eda6aedfa86b9a45eb1e4655257315ae6a280f0a6ee\nB = a8b4bc9647d8df9b7c76cc6d0f2248cdbc41f5da9c061f9864aa8415c9557582cada456cf23cc32d47d1fc1caf19d36b398019aac4734e10f55ce3cad419e5e7\nM = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed\n\n# Regression tests for CVE-2016-7055.\n\nModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9\nA = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nB = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81\nM = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4e",
-    "b4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf\n\nModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9\nA = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81\nB = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nM = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf\n\n\n# ModSquare tests.\n#\n# These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M.\n\n# Regression test for CVE-2017-3732.\nModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001\nA = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff\n\n# Regression test for CVE-2017-3736.\nModSquare = fe06fe0b06160c09\nA = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc\n# A in Montgomery form is fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffeadbcfc4dae7fff908e92820306b9544d954000000006c000000000000000000000000000000000000000000000000000000000000000000ff030202fffff8ffebdbcfc4dae7fff908e92820306b9544d954000000006c000000ff0302030000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fc00ff02ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fcfdfcffffffffff000000000000000000ff0302030000000000ffffffffffffffffff00fcfdfdff030202ff00000000ffffffffffffffffff00fcfdfcffffffffff\nM = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff\n\n\n# ModExp tests.\n#\n# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M.\n\nModExp = 00\nA = -01\nE = 01\nM = 01\n\nModExp = 01\nA = -02\nE = 01\nM = 03\n\nModExp = 01\nA = -01\nE = 02\nM = 03\n\nModExp = 01\nA = -02\nE = 02\nM = 03\n\nModExp = 00\nA = -03\nE = 02\nM = 03\n\nModExp = 02\nA = -04\nE = 01\nM = 03\n\nModExp = 01\nA = -04\nE = 02\nM = 03\n\n# Regression test for carry propagation bug in sqr8x_reduction.\nModExp = 19324b647d967d644b3219\nA = 050505050505\nE = 02\nM = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# Cover the E = 0 case for small numbers.\nModExp = 01\nA = 86b49\nE = 00\nM = 30d26ecb\n\nModExp = 00\nA = 00\nE = 00\nM = 01\n\nModExp = 208f8aa0\nA = 86b49\nE = 2\nM = 30d26ecb\n\nModExp = 27308229\nA = 17591bb\nE = 6\nM = 30d26ecb\n\nModExp = 2bdf498f\nA = 21292626\nE = d\nM = 30d26ecb\n\nModExp = 11317167\nA = 4a655df24\nE = 10\nM = 30d26ecb\n\nModExp = 2e1b88e\nA = da6b761a86\nE = 35\nM = 30d26ecb\n\nModExp = 20a12ec3\nA = ea811\nE = 2\nM = 23bc042f\n\nModExp = c42ced\nA = 1011a6a\nE = 4\nM = 23bc042f\n\nModExp = 4637d79\nA = 28d9a601\nE = 8\nM = 23bc042f\n\nModExp = 20e5669b\nA = 72fe6bc20\nE = 11\nM = 23bc042f\n\nModExp = 142ab9e3\nA = 9a07b9363c\nE = 29\nM = 23bc042f\n\nModExp = 14c64646\nA = 822df\nE = 3\nM = 30915765\n\nModExp = 160e35a2\nA = 15ea542\nE = 5\nM = 30915765\n\nModExp = 2f23a488\nA = 34d2e02e\nE = e\nM = 30915765\n\nModExp = 28e67f93\nA = 636a32703\nE = 14\nM = 30915765\n\nModExp = 29bfeaa5\nA = c8646998e6\nE = 2c\nM = 30915765\n\nModExp = 30959e22\nA = 81dad\nE = 3\nM = 326dd68d\n\nModE",
-    "xp = 1a1da4fa\nA = 116adb9\nE = 5\nM = 326dd68d\n\nModExp = 272bf0d8\nA = 2d21ef08\nE = 8\nM = 326dd68d\n\nModExp = 29f5054b\nA = 76989850a\nE = 16\nM = 326dd68d\n\nModExp = e6c7b77\nA = b88ee70d2a\nE = 3e\nM = 326dd68d\n\nModExp = 369605e1\nA = cf26f\nE = 2\nM = 3ce082eb\n\nModExp = 168a3c5d\nA = 1f82caf\nE = 5\nM = 3ce082eb\n\nModExp = 125c4bb8\nA = 2e9c4c07\nE = 9\nM = 3ce082eb\n\nModExp = 1c5fe761\nA = 523ab37f1\nE = 14\nM = 3ce082eb\n\nModExp = 21703009\nA = dc832165e8\nE = 20\nM = 3ce082eb\n\nModExp = 1228d1e\nA = a5555\nE = 3\nM = 24665b27\n\nModExp = 5226af4\nA = 1077bd6\nE = 4\nM = 24665b27\n\nModExp = 1b14eac1\nA = 2db3a834\nE = f\nM = 24665b27\n\nModExp = 161727bc\nA = 6bd962cb6\nE = 19\nM = 24665b27\n\nModExp = 10d61d0d\nA = c10caed407\nE = 28\nM = 24665b27\n\nModExp = 233da406\nA = b125f\nE = 3\nM = 33509981\n\nModExp = 24032799\nA = 1656b7c\nE = 6\nM = 33509981\n\nModExp = 129ecebe\nA = 2e671504\nE = a\nM = 33509981\n\nModExp = 20c20bac\nA = 4d7a2de44\nE = 1f\nM = 33509981\n\nModExp = 2e3ce9d3\nA = c53b3def4d\nE = 31\nM = 33509981\n\nModExp = 12fadfd6\nA = b4cf8\nE = 2\nM = 36e9d4ae\n\nModExp = 457ac85\nA = 1b1c7e9\nE = 7\nM = 36e9d4ae\n\nModExp = 31debef4\nA = 3a973028\nE = d\nM = 36e9d4ae\n\nModExp = 2333ad93\nA = 552b97c45\nE = 11\nM = 36e9d4ae\n\nModExp = 99ba1fb\nA = 8bfb949cbb\nE = 28\nM = 36e9d4ae\n\nModExp = 27b691de\nA = 93492\nE = 3\nM = 298fdb16\n\nModExp = 3c2b70f\nA = 14e7b0d\nE = 4\nM = 298fdb16\n\nModExp = 1486cda7\nA = 29acff81\nE = c\nM = 298fdb16\n\nModExp = 11725275\nA = 507489205\nE = 13\nM = 298fdb16\n\nModExp = 24d14627\nA = e71c55606d\nE = 35\nM = 298fdb16\n\nModExp = 222b8d14\nA = 9b1a0\nE = 3\nM = 3db59d12\n\nModExp = 3b8bd47d\nA = 13f4e8d\nE = 7\nM = 3db59d12\n\nModExp = 17e72356\nA = 334774ce\nE = a\nM = 3db59d12\n\nModExp = 306447ca\nA = 47079ddd2\nE = 12\nM = 3db59d12\n\nModExp = 90bef3b\nA = a75d62616d\nE = 37\nM = 3db59d12\n\nModExp = 1\nA = cddd44f47e84b3276cc36a5c0d742cc703e61c4756168601fbb1b6eb598c161019562344dd56ab6f603d920a12c360b285e6496a3605a2f8d691c3598233ee9366b5f2692554893bdeb67b7bdaf35ab7273ac593145e26bed82c70ba5793bf4bc5cac4c80b01785d1496beede493806e4f4aa89fd8d41de80dd6d0a3e2742678\nE = 0\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 0\nA = 0\nE = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 5150fb769d5c5d341aaf56639a7bcc77c415fe46439938a2190283409692f29cd080bfe3433005d98d24718a03a3553c8560c5e9c8ed0f53b8945eb18290e1c1a83d919302510f66dd89b58acc2de79ad54b8a30d3e1019d4d222556beefca0821b094ecf104b5e4cfce69d2d520d2abf54f3e393d25ed3d27e8c2e3ca2e5ff9\nA = ead8c5a451541c50cab74de530c89376d9a55c723e0cac3c84b25f0093c08a2961e49ab48966361c42c9f99111587252d98395b76788400d75c66ef208ea2767a28d6f8dc3a859f39c95765d57f139e7fc14f47c908c62df051e7216d379f52028843b4d82ef49133cce8fe671ae179423ac8da5be43b01caaf425cd969300cd\nE = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 1\nA = 935561297d1d90255aef891e2e30aa09935409de3d4a5abc340ac9a9b7dce33e9f5ce407f3a67ec30e0dc30481070823f8542463e46828d9cafb672a506d6753688cbad3d2761079f770c726c0b957071a30876c4d448e884b647833befbcd6b582787bf769d63cf55e68c7b869a0b86374f8920516cf5d528f348b6057450a1\nE = 0\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = 0\nA = 0\nE = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0\nA = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d\nE = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = 1\nA = 9d92629c1ab181c50c31619e8acd0d235a1f5fc7a0bef4d4fd54b4f1968d45921f8522efe88e69c6c14c576c564592b9feb00d1554b88b038934eaf4a8ce81a2582732387490181ef158360c8b2d9ccb326ffe043f776a50cb8202837f08ca743b562eefa007150ab7012c341b16248478d4775c02ad71ea13d5e82b71e2d600\nE = 0\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 0\nA = 0\nE = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff\nA = a31618b4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839\nE = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 1\nA = a8558e7f455b27c0c46d7d0862eb409cdefbeca945e0284b5bf425",
-    "b7ac0f3d316bc365594cc1639decffc621214d61479bc75135120d4ac09ea8b742ad7ec1822091b62b1c6f564fe5e2f4f5b7def92cbaaa9a898549207ab01b91c2324fbd306a87f7d6379b6fb6493c5fca76729767f136120da9c90bdc7d364f7d242d5acc\nE = 0\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 0\nA = 0\nE = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 292f0b39ca0f1c850b1a00cffd2d54924fcd5fc7e7504c9d593e6c0ff74760b1f4bdd81679fe06c50248336f3108c593fa111072ee87d0fcc89a63243a1dc89044503663eee9bc18f51c3e0193d9108303e12ac90ff78f6ec752a4386af09c42db524a7cbe9a3d4fcccd56c34d283bcc9debc17158b5fe8df0c1888a9841bf8f\nA = b4fde2908745ff92cc5826a27dcfdda09e8fffee681844fa4c7f1354d946d5d84e0e0c7a4a4cb20943d9c73dd707ca47d796945d6f6b55933b615e2c522f5dfc33e0652917b4809bab86f4fa56b32b746c177764895492d0a6a699812b2827fe701d40ef7effd78ea8efe1cac15ff74a295a09614bf04cae1a5017872ba22efe\nE = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 1\nA = e2845c572b46496ac158a731f612fd40ef626fa7134755c25b1b7614f4d7b29164e6142ddb7985e4c7ebc575855ff901e95927fe98a5aea2ad3a4720c75782323bea1518b2c57790f44efd9411be4e95b3896bad1e73c59658290b309e5a7eb5ef8be08125063e57336b80f17eacee88966d12bbaaa15a25929c82e027cf696f\nE = 0\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = 0\nA = 0\nE = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = c90e4c69df92e26549b016950b59080947f5403430698e128477782480dd70be96bed2b9042dd8c708eb432e02710555b97af11ce6fa9b53395022851c32d1f53f04237fb0763563b440ca6e81a50d909d907d9c26b7d3c420dbf88f7dadd488666848135f8cdc608dcfb0691989289fb54379c2e84c262f9765f68c012ca1b9\nA = 882ea1b9b6c79a3b1bdfd284658cb6227ad825e0178cab713c7413c2ec34f03cfaec470c4f5c521f5e9899a2123878ff0f5b36a4196c08ad1b04d03746c4bfb5d126f5eefbfe172627d6732710a8ac8890cedbd4fdef69a19f2b3253a5aa0e5dd5484f72d59b17bdd1dad3db209a3ab839368ed3975069685911d7b35e41a9e6\nE = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = 1\nA = d7a99e65b8af86b1c51d851f0447e43cd4f343cb0ada7236283e69aa7ebd383826acc9809e5dbc4002d0f2430022cb026458189db3805ce2de1142a31ba71a6c064ab51f0059eb4b931b8bcbaef023c38d57aa5f3e14f5df77e547fc028702071b58bd57338be1e1e4f98d3553484e4de359cefa29c5f58d3fa5d823f389dbef\nE = 0\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 0\nA = 0\nE = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 186c50ae259aa0fd31859cbcfea534e626a254de33956d5d719334bb32e7cf37cf199a21f079a5b90497228994d05efe19ccd8c769cd81f896286e8ae557cacd1630a928c629ecdfece29ab3697794aa707734e007318fa7029b050bb09ebbe6986187c6ca843f55266d275620b3f0fec0ad5f847ce8b314d929d128b33a249e\nA = 9d5e345793faddca9867f23eeddf6816c1e837f7a2cf96fa077212514acb6be87ac01a237d8f2f1d07d27a8ddd1b0ae0d97e1bda4f205a89435017284cdedea3e407b1b940d6f52112b6359b3e86e4c83074b17c210ae2c8856b42b169b4a7a6dfa65b368a7959496cf9bb1ee93d019dbd79101830e3f5ed08604ab90890b914\nE = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 1\nA = e6a079bdf7b0638d50b183475e9ddfd5cbdebfb29f5fae8e9be402a0bd36085737b556492ea7fb4b1000ae9ce59db66098129b757cfb29224275fdaa46b8b7eb18a93ca7d3e446dc38c734b683d7ba7927b008d993aab01f44239d3c76be76d1503908e9b5e73b36c43ae0771368b01f39c042693bd92c4fc50810f059e1b332\nE = 0\nM = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 0\nA = 0\nE = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929\nM = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 60719701a2dc0bcde281a93ce0b8421d1a718adee43c1b5d9fe9e697a48ab3db4f9f33c73cff305ab6b6c300c149b05c6b289dce4580860dc56bc59de81ac074ecebdc65aa3ca040b44e5b3c80ddba1658d78b9abbc4c77e5f171f5582e70ab4438a8e1e2f062d618c4ad09c70c73b5b5fbc9f8f0bbdf1d530a933b705f85af8\nA = e1b400cd3b1f2f1c6b437adfdb970d2c8108f1b39bdbb13582179552011c6c97cba6bff2c463212b7f62776aa3e3aff9f175990e79395e819c144350b0a23d61638d500ecc97726b098e1af334aece23a851c718612442c04eb7b3805a24cc8f5b90042145eb5e5d6a408092832b6bbeb8a621419a9282fb5c075f41c7f1fdc1\nE = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929\nM =",
-    " 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 1\nA = 9dd1e6f2d3ff24096b54e0ebf0f10e283e484a1cbafc0431adda1296ed97692f3ba99440fd4f67c96dd8bab850e1123361c99362df9ea205ff8e90d1b329459f54730992d5a360e46fcc5f5a909e691abb9a06613d6991bd7c2aa609f0d7b441d7ded0c07b8c394327672d38a905efb2d76aa3be5bb14d0c002aa37e287aee79\nE = 0\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 0\nA = 0\nE = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 86fb0b8dc161c41de2adb0f3ddcc8ad49c1efd729a52793a3ac987d4011c9c1dadb18657dca718df75c8ddcc49d60f152c46ab85ae9076ee7bfd405679a7da3a5195a1bbfd7d2b998c7b135ea91f8c445cbafe1276fa502c2a85477716829a2e0d24ba02623405a3654bed8f355bc7ccdb67c3f9a01e249e358b60d7699498a9\nA = 816610e6018ca47074d55750dd16a281019dbf95dc752605794cbb8ea8d75775317ce685737859728320b529fb3b4414b40bf3a93d08d8994a21ae54682cc1c357eb529837a7b0129a0843eebd9341c9bee3a8ae30475bdbff517e885a0c9f2b6a680643bd981efb53bf9dd49f3dc3cb757e117895fb34b1b4336d9bf8384558\nE = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 1\nA = 9edfce4691f46eadaa2043c7b1092b831ed50f3429f0bca02f985c0b77c686d951be84d772ae4b55f08935bed6e3206c8441574f215736b5c1c1b7595b3b789b55cf56db83741b10144d6767ba2b97b23a5e83504c60e06ab22834b0145655aa0463108317a379cbfc8a93de8a66925a999b8b02bf88dd85fb9898cefe9c95c8\nE = 0\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 0\nA = 0\nE = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 442866609915aa6f1bae9dfb59e721e1b63f42c0f75fbf0a88344120fbbd7aacf15208fb7c9d8bb8477d553cbd826d7e685ad764a8423e81c2131c040ee83a03cab8d5ce50866a941b48c78e9f1330794d908562d4141cfbf26e8c80c69551339eec41e37e2b37b54330f7bd75748f8d26d56ab9eb3b0c127540484c6445a7fa\nA = 8ff65e2cbcbcd8697cc3ce9a26855d6422ac7eb4e66500648c08be697e005cc3c854a54cfab91d43489cd60be8b516a9b3c9688e5e009a1689c6b164a133859a5464ef422c86344fef42cc477c9df27768377c126a066d1b62f593b7f6d6e906feaee16addb7cfbfc043d741b7dc81a87c17f167b7b8ef1b1fb3dfd1eb14102d\nE = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 1\nA = fe9f77f7d0475e00ec964c0effb9b8e079c32e376ce77a9c40ce4018c3df44a77b4f294d9565502b2b79accb30cb58dda6d15e1543b6d4a53296543ed11c7f51baab60283ef03fae37dfeacb431392487ec2839551a933895c4dbf18844f7b375d3e6f558d3c39993cea1bbf7fb743a6a07bd3753c03eb7298811476d7f3ff1d\nE = 0\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\nModExp = 0\nA = 0\nE = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\nModExp = 91fd879d02f95a9f40fcd1037726f73892caf84e9b43b4aa4126d9062a0d22c464e7af2fbd91aa849612d99d9519b724a7fb1cb018fffdcff321d883ab2519953c9f174f09dd8f13ac87339887385966eb4a94842276637b2c36c0a5036b1d3bbea438bc6efd4b4851c7ec06879d60694df894717569bcd31c4b13d80df6cbca\nA = cdec5edc1cb3ea974342b85aabc0f9385cf877ca328747d40dd4d297623ad69ab6582653faeed5aef225208305135cfbee32e066cb43e18afacea3a32acc8aabbc49617ac33e741651924ae56dd6aa044a12a1ea50fef573b5befb2f4b21b9cf83ab2aaa6fd153580a0761666ade8fb94f202a3c3dc4f33297eabb4564374168\nE = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\n# Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in\n# order to test the const time precomputation scattering/gathering.\n\nModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b\nA = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898\nE = a2c56ea1362511cac0301918e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f\nM = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d\n\nModExp = a7f5844fa9e7202d4b70ee252c9846e63d3d091b0387768ded872cec53458e19df0d9b4960226e269b8ca5dd4c4eda423a67b6dbb48235c08c12c6c7c78db47287756d3ed9cecb9232f7d18d5d80b9676cb68ba4a290c97e220beb1a069976b5e6022a4c1e5ddbeec86b62dda24ffea1deda37695c9f61a8817218e6370c0679\nA = 7d6d0cc947ceb949cdc4e9e1044f5deca5bb05a491041e0d85bc4b92a0944a57c72845fad91e",
-    "59010c61ad1712bd2f612d53a846a044632262a9f2e3373b062fde2484e0c165ff947f2469f743ab6e2e5e13c640fc4029b1c9213eb8473c674e7f9e95a4a5c5636d4656c1e696962340d77b322daba47d6fc894f2a2cd9e0afc\nE = b78012afe806e2344d004c739c97324256850980ac97d88c4ed9a838517639ca112e235978d21a176c33f5a68703aba0f2a05501bbe3fc8d49a000fbf530cdb431581dfaf8683cb15a2aee5e239cbc542827100da3b47babf4a16ca7c588aff9912e674abb449e0b767a15e415f4e7f2bbd6380d7131da3df8d49b13bfd35ce3\nM = b72d5c55bd2998472f1965e75a51be6155c1ba04656da8f66bcb34db36a7b1db66a89d1d05b1bde10206acf85be7b474ab689220faf1bb52ab39d8dc00512dd4e26df1179c11b973e1274db85a88c7cc2a17113abdffe58cb930ddc5f3ccc4d68b4e65c913730509f7ce5656e8bbaba9b1be177ab9f766678f018fea05da9cdf\n\nModExp = 465ff295786a88496828fdc763e9292d557957544e9322b7996807b87fdbfa7a11614bffeec557ca831c4824c8e4ca3b1a1c7f3f4f95ec3fd6a86b73bb13d78b73af2b3c7e76954d0cc03bcb0cd606867ebb3765a8b3d0108cbe4f343a14016be9c33f6d200f0dc547e7d6b02bfab1e79dcdf9c9835a814cc6c855a12ebeb66d\nA = 89ad02bea3e9ab839a6e23f20122409daba52c68e1e893034b30d321c0305434a6af940015e3fa5ca9c35230da34beeb1ed4fbce6c1da3a8bfe3f3ae172276c1d1723b47ee61e6f8fcfdafad102d6f7ee2a79f510c7edb93096205a40a6c9e665b88b18f39a979e2e61286d939952a6f02fe8148b7515bb25f4252337cb6e60d\nE = cbd6ac628cc7afa3c61bee9c22a06a395087ec1811fe9681b55216700c435996c815e7cec8aaa90016dd2382d0306a5414630124e14f3d396a4ba02ee17851bf720f1607ff813e4bbddf01338983db12f59bd6371a738eee3eeb716f21051d6174d2d6c77602942b9edaac18d4b3a723096c0d00dd23a8a605c585022f311560\nM = fa7a3e40364c8a8d0f14f0213a3f3e035222ca0ea19d46d10ba41580e5dd2805c8a133f3856d7d5d97f922ea540e5eb0d10ad04dfdbb74f518f58da0099a6fc2b3f3def92985176e07fc78aff2faebccca10a429794e5f15ff92f75fe90f527c60ddea8093a9078c703c372ca09f7aeb27ade02f3595308c61dd9c44e62fd101\n\nModExp = cf08bf00261402102e9fe03f3074471dcf0e9b3c96d4d1503f099f24ec85e1901b023e9e048c1ad042244f5f70b38b25a99f4c0a7b57d5844bb0d0137367f45f4ce2cc7746105b77414768cb97648dc5721149aed2d4c682408cc0d50d26dd0bd77e848911f8625c727cac5f32e63bcb548f41a57d718d772f23983a42f603bd\nA = a419646a6631c2c69b18f7aa65011825eb31692eecaee9d74f92d92203811b68e9764bda31a1585bdf69b6273fc6f9f508c395ac081336506525dad88473512f08a205621ac8b16e9864c7a7c5a4f17435de00d0b32badec6ce4897e3e1076c562b6d9523f63d0b2079eaa416cb090471657763f24931d955d1fa2720c80a9c9\nE = d5a6f4a1842aaee39805356dc8d0d678ee03b2c81277345beccb2742f899132feb43271f95968a01ae68aa8277201851992dc0aa7a71c90aae71b124d873ee264ea400fb131be0fc6c4ce8c04c45f6bdaca89ac743635caf6158983d257e21cef6800d7f990e912ba21bbfb8fb779afa4abd19e07e7e07eee9908493d1ca502c\nM = e739689b6cc6def1d45fb1a2ab551643beeb303f4aaa4da47ee5e4948510f8445b4c40e99ae8354dede60b2ba6694e93bc4d573b7e8adf871b7a9a9636eb7d70f2e49328e2d7978143b177cee8374ef01bd1ee2d95862765883f5e7971668b53ef0ff41b6539faf63c397522b0bdce916388e72e26c8d3d2e58dadeb9eb5d479\n\nModExp = 827e6312ec3b14600203bb83f5b277ded197b2967363630ef673240df05edd3ba8ab2b11c86251a612206569c6c33952b31e264f129909bfe723bd0ee1624b36cfcfaa893a6ec8b5a1f7de79f83e79b459a3350f89f412ad1cfd6bc4c2a7a29272c783d6ecceeb1398fa17041835643f4debef9b5e87b098d104bb8912dddf7c\nA = b8e49c637829021d32db3a39a0c1e58cdd4c6e4eda7e8e9293be379e9c2e2d184f929d278598a81ae231cfedcf69cce4a6e31cda3c8ac14d753a7311f2436e29795f0dfb60259a0f61a997918ff984aa2284b43a9d64c974059e9682adfffd018305835f74eda8c75fe4877d811c1620f654ec9f7f32d1af5ce59115e2f41785\nE = 80e0febf369d234bf1aaad4f82df2e2ff02882c3184781f6ccdf4f7cd93b6887af86830077c84dfb02109ada05b40970b1c65228b0c19030bd6361c3537fee22a8155c03b4e7007ca006c6daa3659518d05bb81ea0079456d0ef6116df248dffdb0c935f321f5a1034deefd5a9414a0652aa6548de33325b474b9e5a8507a082\nM = d5eb1d14af842a9973274f7463d90cf0ccff19c47d710edbae184478d4f29b02693ed7958bd487054327b9e6d8879e24c9af7730b92f323eeac05558da6c1b952e5dbf13de236050a77628bb5325fe0d14cc5773bf73338759d5ab43c212b414581280f1cee250007e53791b800b61c90de0328acd7bc43fbdda48158939392d\n\nModExp = 4a1efd29c7e78549f5cd4deed1454b37462c7810ee6a8a2493b764dfa479be13b314cf9ff98259517d61865567ef499a511630c0038c97914625df181c6fe07892f329f98b344a78d751e9471483eebaa7977371bf97bb25187ae7e93a9227d6c124ccb4644423c961a11ae59c4354f89d5a95164c23d9aa256e289e9cc0858e\nA = bd86c9211fa6a47a06e5016c46cb8a99e34a043a29e22f8c3196fa7197c26b38927b8d9bc0ddc11a5fa4bcc44deb69dbf37cbe7ebc9a2fad6c74e09ab5a9dd929fa04ab4319b6caad1035739be78ba631fb0748d9e53944836d37ccda6e6a62823c696d8f31139ccd7f2f86b22fa026ecf433cfb1271a3539ac4f1c83aaac059\nE = c40b9972006d28a84c2769a86e526a2b274f73afc7c5c6a2742166757f61b5f5fdbb228afa157af62af989ffe966f232bba9e6beef5403d1690ade31a6410f7f349a35bc4267a129afd647993df7d45cc0e1a1ba4678d7f1b6e8a344d8ff7037679e1f4db25a454e4246f6b55c416567fcfa188e8a3865115851d9edf0aa8902\nM = cf424d7af75ce7eef90cad75ae55ca8810cc7b4703fdb5bce701e7bac07e0c371cae06df2aa8facb55a0faa6793e4d2bd9d7969703743b9be170be82792aeea55e2bc0f7ab7617b276486bf474dee2f4556aab595ff3ef115139cfe5e21ccd4ee05c0e1cf901bd85df86cc17195a783b0be836d00bee82ce064077f9191188f9\n\nModExp = 3137a3049fd4ad2e26d870f5c998cf11bfe82101884a82e85e43facd0928cd7434a2e346ca124619769fa141bbe92ad6f36b99231032ddaec3b349a410f82b5ca36f45e56e5fb85dc63d32053dc90805d3f1854ab385281a71a57726bf97158494e7476057214ca7379ab8b70f5bdc15f70bdad3adf33c3a1f9cd1b6bbbad556\nA = 39a1dc6a4c3f14d9c350ee968d5ce139ef725952c967a2d1bedf48ace22091283525be03807e2e263d2640be77f0525247bcd07149bba50568cec5a082c87d72962cf9e43bcb5cdb1e7e9a650fb53e0ec2fad37f09a9f036c0d7dfa528fef846769f80a9a60854910ca1b4ee05dba82ed2ee018348d6b3e52a764b8ffae61e0\nE = deaee3a3f80c9f684ed7110c0653847ccc7be5ff6d982fd4b49f59b5dd35f7210b1077babbcedbc127df35cd469dc6e569a0f84e58149b5605c94b09fd7f0b098d02b4a04631328b3fae39e6c2fce25334225cab71829abdb9507cb903701559660f2c08c3b743336119d1260a0db27054cad3f28bc1b04b2289baa58fb33965\nM = 938388927d06ed3bb1286c0f06d3054cb0ee16dc7a0bbbf13a45293c09a5f40f1d611b2e1a1b0ec2ef109b508e27af4274954905cae52034f8740a744153b4d22059f0dd262ea51785522098ecacced6da07709ee6b5acc8c4e99331379a7c3de7f4e2d1431e43b19570140955b7bcba118dfbaa552cbfa2be531e8f781166ed\n\nModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510\nA = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83\nE = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693\nM = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11\n\nModExp = 75c3f79ab7c991b98e65505342a8a563cfb08b5d3ccf8664c7db1de50256b1d17ebf7096dc98c7bb5d7f027a894ae5cbb14dee04d5d445e775ad7e239acc82673b0ac2d819a69c83864f34e73d9a636f05de8279619a067b4c90ad038db5910447e03841d2034635018f08cbcd21efa00994247763a249082594128112f95232\nA = 34def7d76f6f158a359fd12759fb889cdf6af0a24830dc3e84283a1ab4e9b2647a6a36b86482f829b2cdf3e3d6028f9a884b1f64f7262315446bea8b0231828e2f3d990fb103c17f820b39e4b8427c85643ceeca8f5dc8f191d1255768300e859bd7d88c770319ef38269660d221cb3bc061389b6fc0783485ef042b1c7d6fef\nE = c6c46453dd5aac6b37277a446b1d0c69cbe476eeff55b3ac35edb89ba97116b0e7783660f2c7b31b2a2d6c4709d0ab45d01a838100694b0777c9c9c14c959b07c437c73a5eabb7402f1001e802d797a2e7707285834fb6440a1c2f727f7bb84ddb2a49312d32fa0ce620c43872655cb5c394749c9e75d7fa25be00efe50d47d6\nM = fbbab6698a9142095c46b38a732592e4366c1838b84bf40f8c8fc7b630f73380a0d09765562365798f8c8030ed1b6728329d8bb06e882c35a1d59bfe84146a9db2afe42a414014e247390281c782fce806d62adb54778d2bcb49555459429d6ed446af5359657667f6aa19e8e3e0e24ab2bc312b2d90b5cb1ce6f2f15af15d9d\n\nModExp = ba16d7f3f6e162ce248490d164a13c00e7720d8a667e2d3ebeb13f1663e15ef5408d5b56cbc7bc793a8ca787cc50f8e15e0e9d4ee764531d04a9114eea556bb3e2",
-    "06ed7d85267151a056b6e68fbf35e03f2cf829708ffe1de13e95ecfe365aff1eea36340ffcd3892dee659fb1ecbe50f5080e54737c10f9c1ba638b14ef537e\nA = 9025e6183706105e948b1b0edf922f9011b9e11887d70adb00b26f272b9e76a38f3099084d9cccf12d04b1a99c0f654f8b9ed90c6dff9478c60bf05d58d734ab60eaefa14a22230ec60c90dc1f0704b61eef0bef345785ae0e6a9af7db069cf6bd2b4e0fe58a0ade83c7e46a04b9fe1d24cb9b65c6f80de713e61d70eae5b286\nE = d7e6df5d755284929b986cd9b61c9c2c8843f24c711fbdbae1a468edcae159400943725570726cdc92b3ea94f9f206729516fdda83e31d815b0c7720e7598a91d992273e3bd8ac413b441d8f1dfe5aa7c3bf3ef573adc38292676217467731e6cf440a59611b8110af88d3e62f60209b513b01fbb69a097458ad02096b5e38f0\nM = e4e784aa1fa88625a43ba0185a153a929663920be7fe674a4d33c943d3b898cff051482e7050a070cede53be5e89f31515772c7aea637576f99f82708f89d9e244f6ad3a24a02cbe5c0ff7bcf2dad5491f53db7c3f2698a7c41b44f086652f17bb05fe4c5c0a92433c34086b49d7e1825b28bab6c5a9bd0bc95b53d659afa0d7\n\n\n# RSAZ 512-bit.\n#\n# These are regression tests for code which historically reached the RSAZ-512\n# code. That has since been removed, but the test vectors remain. Note that the\n# lengths of the inputs, especially the *bit* length of |M|, matter a lot.\n\n# Control: No relationship between A and M except that A < M and they're the same number of limbs.\nModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4\nA = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# Same as above except A is negative.\nModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd\nA = -8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A.\nModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nA = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# Same inputs as above except A is negative. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 1\nA = -f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 0\nA = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A is negative, and A (mod M) is the right length for RSAZ.\nModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25\nA = -80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n\n# RSAZ 1024-bit.\n# Note that the lengths of the inputs, especially the *bit* length of |M|, matter a lot.\n\n# Control: No relationship between A and M except that A < M and they're the same number of limbs.\nModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7\nA = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8\nE = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575\nM = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7\n\n# Same as above except A is negative.\nModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10\nA = -21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8\nE = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575\nM = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7\n\n# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A.\nModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nA =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# Same inputs as above except A is negative. Note that A mod ",
-    "M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 1\nA =  -b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 0\nA =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# A is negative, and A (mod M) is the right length for RSAZ.\nModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d\nA =  -8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# Regression test for CVE-2017-3738.\nModExp = d360792bd8210786607817c3dda64cc38c8d0f25569597cb1f363c7919a0c3587baff01a2283edaeb04fc288ac0ab3f279b2a89ffcb452d8bdf72422a9f9780f4aa702dc964cf033149d3a339883062cab8564aebdbfac0bf68985e522c6fe545b346044690c525ca85d3f4eb3e3c25cdf541545afc84a309e9b1d7807003461\nA = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020df\nE = 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020FF2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020ff\n\n# Test vectors for CVE-2019-1551. (We do not carry the assembly file with the\n# bug, but we use the test vectors anyway.)\n\n# Original test vectors by OSS-Fuzz.\nModExp = 9d675d188a07e9bd1b32638cc8cfd5002ef89bd1a9648f806567b87939140a67977dc8da17323b8e4c6bc53875cda8b656df8f54cc32e44fd9c21d122ea3c0d6\nA = dea9b3e0b44ae67b2ac9b7c2b18eeb4dab206b014981a46ac409f195eeb6896f132cf8497c87d1188008ee511054ebb426203355b7d515dce9501cb759ac1373\nE = b01ae745b101e9e45ec05dcff72e7f8fc04c79ffe324301fda0b4f7be81d85c4e875c73fc6c5cb40000000000000000000000000000000000\nM = ffffffff01ffffffffffffffffffffffffffe2000000000000000000000000000010fab8d960706cd4c21818115650cad61d4f10da325dffffffff00ffff00ff\n\nModExp = 651f811b62ee8770e3598c340864dd6b0be9bb6376b6f933ab216fd55538e6ad1000cb2b3c64f54d554e004b6eec8138e6ecff00452d443a42041b72e6cd9ead\nA = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e\nE = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e09003e3e3e3e3e3e3e3e3e3e3e3e3e3e010900230a01230a2100ffffff0000adf300a58700000000ffffff00\nM = ffffff0b00000000000000000000000000ffffffff0000ffffffff00000a0000000a00000000000000000000ffffffff000000000000ffffffffffff000000ff\n\n# Test vectors for rsaz_512_sqr bug, with rcx/rbx=1\n\n# between first and second iteration\nModExp = 1\nA = 624e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d973b6\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between second and third iteration\nModExp = 1\nA = 11024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000f\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between third and fourth iteration\nModExp = 1\nA = 4171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d9736080000000000000000000000000000039\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fourth and fifth iteration\nModExp = 1\nA = 6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000006\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fifth and sixth iteration\nModExp = 1\nA = 44e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000000000000000000003c\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between sixth and seventh iteration\nModExp = 1\nA = 1024e6a171024e6a14ce297f2873536f959d8c3390d973608000000000000000000000000000000000000000000000000000000000000000000000000000000e\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between seventh and eighth iteration\nModExp = 1\nA = 626eee5e3c8653be47ed15e84b97cc7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187\nE = c0000000000000000000000000000000000000000000000000000000000000000000000000000",
-    "0000000000000000000000000000000000000000000000002f8\nM = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9\n\n# Test vectors for rsaz_512_srq bug, with rcx/rbx=2\n\n# between first and second iteration\nModExp = 1\nA = 3c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf7c\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between second and third iteration\nModExp = 1\nA = 485c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000003f\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between third and forth iteration\nModExp = 1\nA = 59a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000004e\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between forth and fifth iteration\nModExp = 1\nA = 2939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000000000000000000000000000000000000024\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fifth and sixth iteration\nModExp = 1\nA = 640939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000000000000000000000000000000000000057\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between sixth and seventh iteration\nModExp = 1\nA = 25c40939a85c4093995e8efdb195e8efd8caf477ed8caf4780000000000000000000000000000000000000000000000000000000000000000000000000000021\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between seventh and eighth iteration\nModExp = 1\nA = 7b4919849931b28a14fcace213f2b3884fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b6e67b66ce4d9c\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004c\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004d\n\n\n# Exp tests.\n#\n# These test vectors satisfy A ^ E = Exp.\n\nExp = aa6d7ac431\nA = d0e07\nE = 2\n\nExp = 12d416b110dbb4e467ff0c89a22122f4da8240\nA = 1a18cf6\nE = 6\n\nExp = 49a3b33e23d84f1ce0d5d83f5dcb651d50cf3920f0143da2310d0512a90a06cd8f38977df8a756c30883de38df092000\nA = 2a3acbd2\nE = d\n\nExp = 5b4a0d5a956f885f275712b194459980f24708bfb6393d71bd37dce852ce455724f5ee5030775fb86b4295edc98afaafc097e4d82a97c0078ec0eac763db16549c5145c4cf2d3124f88cf9a5c71da0625afb99b26801786fe49a778415dc025954021753d08691947a208b613f0be5c1\nA = 54b3ae461\nE = 1a\n\nExp = a0ea5f6a4de49beb8fb7f0dab280d6a32c5a3814c9a5153a7944cec0a9028497846a8a89044348721a0bb5f0c3ded3e980574ea321b0cdb0ead4f4e93841ea7478a7f15d9729b646a8165813a0750e8124f5465dda9b105e1bbeff18fd09c09a2e26610d9176d253b877c3a8908a6be521cbe1e472a7a1b7820e4e890f8f28aacd34609c686e76e15b01bd9324a71290812724ea564d11c874a6765b262c3e57d479da0287a76026a1e8fe53da0b02405da1d379eaa30fc65f\nA = fccec0f6df\nE = 25\n\n\n# ModSqrt tests.\n#\n# These test vectors satisfy ModSqrt * ModSqrt = A (mod P) with P a prime.\n# ModSqrt is in [0, (P-1)/2].\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = -1\nP = 2\n\nModSqrt = 1\nA = -1\nP = 2\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = -3\nP = 3\n\nModSqrt = 0\nA = -3\nP = 3\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = 0\nP = 5\n\nModSqrt = 1\nA = -4\nP = 5\n\nModSqrt = 0\nA = -5\nP = 5\n\nModSqrt = 2\nA = 4\nP = 5\n\nModSqrt = 0\nA = -5\nP = 5\n\nModSqrt = 3\nA = -5\nP = 7\n\nModSqrt = 0\nA = 0\nP = 7\n\nModSqrt = 0\nA = 0\nP = 7\n\nModSqrt = 2\nA = 4\nP = 7\n\nModSqrt = 3\nA = -5\nP = 7\n\nModSqrt = 4\nA = 10\nP = b\n\nModSqrt = 0\nA = 0\nP = b\n\nModSqrt = 3\nA = -2\nP = b\n\nModSqrt = 3\nA = -2\nP = b\n\nModSqrt = 2\nA = 4\nP = b\n\nModSqrt = 2\nA = 1e\nP = d\n\nModSqrt = 2\nA = 1e\nP = d\n\nModSqrt = 0\nA = -d\nP = d\n\nModSqrt = 0\nA = -d\nP = d\n\nModSqrt = 3\nA = 9\nP = d\n\nModSqrt = 8\nA = d\nP = 11\n\nModSqrt = 6\nA = df\nP = 11\n\nModSqrt = 4\nA = 10\nP = 11\n\nModSqrt = 5\nA = 90\nP = 11\n\nModSqrt = 3\nA = 80\nP = 11\n\nModSqrt = 9\nA = -e\nP = 13\n\nModSqrt = 7\nA = 7d\nP = 13\n\nModSqrt = 6\nA = 37\nP = 13\n\nModSqrt = 1\nA = 1\nP = 13\n\nModSqrt = 8\nA = 1a\nP = 13\n\nModSqrt = 54d4cf0fafe265056a29016778cea6b712bc66a132fb5e6b6865e9b49e4c97ec\nA = 599c10484b22d0b5a115268c7538ca99b3253a311a4ab1ca11c3665b0bec393a1167d1ad94fb84cb2c7ad7e2c933e8f613bdd08fe1f1aa4a9b0b9de0c8a7c9d4\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 38a7365a15365e911286c1be2a7afe76ef390234d76269e04dee17313f6ea54d\nA = 1c4aabb4d8369710131c664ecf2849e963c1bc31d66e0b939bacf99a870c71f24ed71bdddcf566f3908271fee43fc1ebb51eac7e3153efae641b49d2e796a12a\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 35ab18a560dece04725667f640ca61d1d59f14d191f94c79f58531acd097d444\nA = 685168ae855d60eba220d803f5296459b30a289580668db9ed51bca51cc2d453a937e13819ae34f7a9a143ac96d17420c53919167e46279b562b550be1cd9abc\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 288370029e87024175e5bec0eab0929179f42e16995e7f6194eefc61061e54f4\nA = 2a14ab77c045bdc48220ba9c463e1a4b4049cb01edb53be0937767eb2ec19b7d719855052281250a36a0b76d9a5d967d0756e1ded7a052f7056191ad66bcfc9\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 32255cf01dc943577ec2bcb221b98491d7a1130d046d6c68e95fedff643ce3a4\nA = e26f6dd46a513a1dd3fb14b71be1d4c9e9d79eda1cde10ea4d1eb8abfd4d5857572205e247184dd0cbefa37b5c0bf680ba2bd28c5741f725cfe2aae37419baf\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 5172345e801ada63fbc4782e32583cc3b4fea88b9e6dfd542f3542f8538ade66\nA = 40dafa8342b302bb04b1f3ddb3b9015a8fc1b597857c115b40631c7be9e22de89358fca23b331596ee5ff304dad7811e6d8e8822f7aa533c9e7c882634ea550\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 4dcf63c423bf0e39aca2293d57f6792d023db649d6719fe936446904b9f7e60d\nA = 5bcdb514bbe84261e169203e8017909b60c9bb330400c766ee01b0189378e70e61867a164a12643ddc9e94b61e09e5b158cbe85be228a3cc48f95a552958b8f2\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = cf77c5c2d12a500b75cbfb1f3e66ee75d886b9365cf4f8b4d1bd18a6be0f387\nA = 4652ddc2ea7b460d8ec3c9059b8f9b5dae6cac55b51f2ad86fcb336b25235737965cc515e2ff0b54835015b7ebeeda6fadd986471d8cb424d309fc353d1e269\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 1e0549e4c5a26023e9d24fd8c67419960746f82b1ecd113bdac66f570a475d87\nA = 5f4a6d450ab1390d96ab1deaa0ba18f897cb63daf0c9e1ef6c08e804c26b5e842f6c08f13db5d4a6e88f07af2a3cb04fa06fc3e59c410b9356f025ed81acc74\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 144481a781d831c1ca046ca9e322d79ad4d2c6dd9f780bea9d1ced9cd20b7b23\nA = 4c254fabca441017132b9eacd4ca40a336db3e5c09715773fa07af095989a91cc968ff07a9ff56ed06b0ce0c5269f7b2ab68564ecab9f4467a7e96b6cc6b21b7\nP = a6813d316f9aca30",
-    "f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 216fecc7667f488a3d2d102a38b46b4860ab858300b8638af4f34e1103fd73ba\nA = 17878f8048227573a9d70f53c0e76ff13fe9f56e9c984c92514d3d13dec23c816661f0618d21371b80dfd885cb59551bdf80046f65f22ea9b89c78645a6e455a\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 458e5e789ccd2417174f7e30bb31914b9656bd8cf2b9f5a9752a8737a67707bc\nA = 5c7d39a4bb04e69201aa519f80ee7e62ea14ca55e13656d1da3f45367e2fb2d061aa2940708d02ac67d35cd2ccf54a1bf95bcbc759779e692cfdcbb3aa1a05b\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 543125a16c2bb8b8f8a2c39c497e5224ec77533602d7dbe24002e32dcbd2ef1a\nA = 3413afae333b2ad9ff45c7f3c7e5934b3127e8b1a55225958ee6ccf42423e81559bf070ad3f3353b78c0ffd41475af49f59d268ef78bdae879f5155e8d1cc07\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 10e16859c67bdb2eaab52a7c847dbf37162eda258a9f6262ebacfe4cbbbc1080\nA = 21ce7905894faf220bdf4a82a2d855994ca2dc9feaecaa53c7f146e1f49934215695e9bb46ba370b7005a90c399674caa8969eb442e7914d90f749774d7fd194\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 32a00586adc6f6cc2b1a04e1be0ab569fde235e1436c38b6af92bc5ebd60bc1c\nA = 350da4fd8cf03c12f7dd6ac6d3ab801a3413964083e374662aaf878d6838b97d4feb9e52cd307a25b113e101661a865463ee2480c626aa4e2ec437d72e7bae4c\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 971f75bc7afa8b4b50f1d4b05e52deac7d4836a08d30546f29649bf1ca6a247\nA = 655ed4c5d8d0afb4f9360372ee1ef1303898d2423e585108a3303faedb55064d2ef25666ed4c4d71fe6063fea1f3142b435714b0e30b339dd791d347c884654\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 48fa882b7cb6a29de9e3769f72eb67f1efd4d2af56f0c7e410c610efcbce2065\nA = 14f3503f33b243800eac1defaab33e04c01e80163fb3efd03860970cc016832431ca4fc6d1b760f4f40166b0b8b3c40dbebc81460cc10890172243770338f090\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 236fd7e397ea7f8bc2a288eb7236ca41936fa702b7dccca56c8852e147511f7d\nA = 1bbd0980feac854782813bcde4da85e8a054549a1b515e065da4236528035e756882e29e762cf60453e375cca9dc6ff637f9558bf86646e3b928f68f82af7efe\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 693f0cbe8c81b0afde0cd2f83e53795dcae6b0cc4ba930ab5c752400d787f14\nA = 7b20f9664b23907e152ab8c9a907f72e8670c1c38ab4cd1411ea7c2159c09aa131afe068929b8e6ad1409b74c04975180d1cd0a9fa74e923c3fd451e8da2c34\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 4a086c50b0bad576501ddb6280743b2c9d247841eb7f14d90561432ff7dca6f0\nA = 4367431ec0cd0d7626538b93a090c30fe0c97c18ca03b97ddae304b619112b5b4d02bf0f041fa3fd673f9ef2ceb07eb2079d11c56dd903b1a87e8252a97b8079\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 18f8433fa468d8065157708f1f1e53b8e31d39c6011fbc2bad93de1b5548e19c\nA = 739c032bb4139c199c40f548d37234298772e4ccb9d3ba28412b60ad23b4c465b0787e2382f1c5a4a87af2d20eb978b7dcbe73f2112249477d15c8a85e54a79\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 49e3c8eef5e067cabd51a7c01384ce05ab8f4342f655559d8a689eb7b20e0106\nA = 18400c2cc3e06b99b4e39c77b9af5ff0e9c683f1708321afa4cd5b6988d13b36b1d9eb4379b7902d9ceb40c03f814b2b6a01b90509bbb4532f13ab1571c4d04a\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 35548c530745f440329325cc8a5fbd90c16a7f0788879a4869bc4d4f73acda0e\nA = 181a3c5ab02566e7166c4d6d2f2bd4a8ecc25991a98d270bde80cf4332766a7068b14240bf5f5dcd45e90ef252596da3eb05b11d68b2063f7b3a825742593ca9\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 1ab7046e6af061ade5f9719008fa4d989007e2a579a134a5b9f19ec410984096\nA = 1008a03e211fab0d45856377079bc96b0776c2d4c0175661f3493246cea2ab0a02a706c85314fb707ad9906bedb2cfd577d62092ae08ff21d7b949373ea954c7\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 2be9e3e7515960d90f115b89f60dedc173a73ce163b4036e85b7b6a76fd90852\nA = 392053a9f0100540a8e1a0c353e922068a84dad3a4a8e8962fbc0bee2b6a06e20d08ade16eb1409a16acfcac3db5c43c421505e07035ca308b15c4a6db0864c0\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 5b301bb93bdcf050183107e36258b53b4805918114ea1c2227b0911d5b4dc077\nA = 55e55e5f94dc3d7aabc921f6469d85fa2e1e92a87347c57afad5872306ae69f9fb99297d1e3e793dd9e8632244208154de5da7114fd876383bf1422f7ece024\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 2df9609e2f5a5156c3260461b2ee52eacdef00bd8b091479813143a6c5283f71\nA = 2099325b7f12fe77353ddf3f2b2c5ef77b49671b150af954cf84e9675e3ecde3e057084641a633d19533b4712ab49924c8b5c31d591abcc88291f51253fa2a7\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = dfab751710e9008e25e422d1199d6fbec4dc7fba35b4da9d225a746eb4126a0\nA = c006af53d4737fb293584df6ffe2e4cb3fd8dc77fb7c1f13b97bb9c249e3ee5fb9feff7488265b3093906c08a4946f142ac7b491937d24bfba6413366ce371d\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 26bc030008d6c60a09fb0e16093a649fcb40c6c21a8e2da2353ba4b07c4f85d5\nA = 1eaabcfad2ed349ac9356e6f4da0b301266ddde811cb0f817aba8f5c10fb8b8ba9d0ef2dd386b668f16eac296118fdb8cb7afe1b865648c81c2fa3cf21f2711b\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 35051b1482ec2578f3dc0000a422cb5111e43c37f1ac20b1844d3de2128c4556\nA = 315ff9de178681116f2a5fa78eebf4818e1d680435eacdfaf9d0e5c4fc01fc034b352c82fd52c81ca30d68864952dacc99d08269c9dd7ca99ccf22da98c3840\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = a5474252885cacf004c460a7793ff0b0a2187bb1a9ed700ae3470199faef71f\nA = 19856fc1351c4b02abf573bb2fc6ff92355fa369d62bb8f2260fa772fb1693f509a56cad661930abcac049dd70f4b16bed4a4c172e73e772504c9990ce7f92f\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 12daf4722387ecf47de1b0b6b110a062dc5ea2685bc9dbde66b8d15622985029\nA = fb8479787069116abc42abfd7dc0c24d2ad04fe0c04b42a6dff714af715d17e0fd77855f950f264542b06d48e8818de813ddb7975798b7debefcdaa5ff86beb\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 397996ed5c0ac6ad32e43c337e9de421b87774cc162bf7ac7bbedf4a9029255e\nA = 5aa04353321bd2de92481be740357f979da464b53aa39111fdbb734cf7af6b3857d1baa08d3a126a3dd34a2fbae2bf2b84e900686c1d31505b390185acef5fe5\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 2cf4b844a54ba359dc592ef1b49f43fcfeae84d1087edfefdd0b9174b43c0a3c\nA = 365a8650510bcfd8fa87432f167cf487234c215857403b9270b5eebeafa48cd6da47fd60dc311b94d1d72baad0447c31f0b212d755f46c256e16e5e015e6546e\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 9277c73043ff767c3fa606f0cd66b9d854a600c8c18287f191ce277758c3f31\nA = 62cec3901626d03e8df66299a87c54b1f7a55cafc99f0b6bba1b5d51a3d2b7d2171c9135a9d8a5346d436e0136b12e515e703e3cd84ecfe154eb94c6772a6d72\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 4189e5a90c1b1abdc1c7c05b3587e6f362e06f927b6cf5f0d271aab3d6f90765\nA = 336b8d0f9dac842c696bc020f49c6aa023842c16f2052eb02f17959006554ca0012042c80c72590f21c6bf5a3714c9cb552aa69730e33db93a56a909b273f39\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 36ccd38cb5a6bd8a73bca55936a2227c503664422c2296faf7e2b1c6a375a43a\nA = fecfd60a376befbe48d2c4f6d070d716d2f403cd5daefbce62b720df44deb605162c8f20f49fd7ec30d4f8e70d803d45b3a44b5d912baa3410d991165d7c507\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 198fc8569be172dc9b71023ed3d42d2ba94bae4099643f6517ab03f540527fdb\nA = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ec\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 21b7f74c30ded681d6138cf8e6fd798f32a049e94138e982f1845df3dc9e686f\nA = 9a30b791c1ba4f394b4e3dcd5837e474237f4fe8987b255c098a47b2c14c598ec69d2beae444dd4fe9c4ede8173d2b187677cc706a3c28f3b81627d8a5fb6fd\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186\nA = 2eee37cf06228a387788188",
-    "e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\n\n# NotModSquare tests.\n#\n# These test vectors are such that NotModSquare is not a square modulo P.\n\nNotModSquare = 03\nP = 07\n\nNotModSquare = 05\nP = 07\n\nNotModSquare = 06\nP = 07\n\nNotModSquare = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951e\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\n\n# ModInv tests.\n#\n# These test vectors satisfy ModInv * A = 1 (mod M) and 0 <= ModInv < M.\n\nModInv = 00\nA = 00\nM = 01\n\nModInv = 00\nA = 01\nM = 01\n\nModInv = 00\nA = 02\nM = 01\n\nModInv = 00\nA = 03\nM = 01\n\nModInv = 64\nA = 54\nM = e3\n\nModInv = 13\nA = 2b\nM = 30\n\nModInv = 2f\nA = 30\nM = 37\n\nModInv = 4\nA = 13\nM = 4b\n\nModInv = 1c47\nA = cd4\nM = 6a21\n\nModInv = 2b97\nA = 8e7\nM = 49c0\n\nModInv = 29b9\nA = fcb\nM = 3092\n\nModInv = a83\nA = 14bf\nM = 41ae\n\nModInv = 18f15fe1\nA = 11b5d53e\nM = 322e92a1\n\nModInv = 32f9453b\nA = 8af6df6\nM = 33d45eb7\n\nModInv = d696369\nA = c5f89dd5\nM = fc09c17c\n\nModInv = 622839d8\nA = 60c2526\nM = 74200493\n\nModInv = fb5a8aee7bbc4ef\nA = 24ebd835a70be4e2\nM = 9c7256574e0c5e93\n\nModInv = 846bc225402419c\nA = 23026003ab1fbdb\nM = 1683cbe32779c59b\n\nModInv = 5ff84f63a78982f9\nA = 4a2420dc733e1a0f\nM = a73c6bfabefa09e6\n\nModInv = 133e74d28ef42b43\nA = 2e9511ae29cdd41\nM = 15234df99f19fcda\n\nModInv = 46ae1fabe9521e4b99b198fc8439609023aa69be2247c0d1e27c2a0ea332f9c5\nA = 6331fec5f01014046788c919ed50dc86ac7a80c085f1b6f645dd179c0f0dc9cd\nM = 8ef409de82318259a8655a39293b1e762fa2cc7e0aeb4c59713a1e1fff6af640\n\nModInv = 444ccea3a7b21677dd294d34de53cc8a5b51e69b37782310a00fc6bcc975709b\nA = 679280bd880994c08322143a4ea8a0825d0466fda1bb6b3eb86fc8e90747512b\nM = e4fecab84b365c63a0dab4244ce3f921a9c87ec64d69a2031939f55782e99a2e\n\nModInv = 1ac7d7a03ceec5f690f567c9d61bf3469c078285bcc5cf00ac944596e887ca17\nA = 1593ef32d9c784f5091bdff952f5c5f592a3aed6ba8ea865efa6d7df87be1805\nM = 1e276882f90c95e0c1976eb079f97af075445b1361c02018d6bd7191162e67b2\n\nModInv = 639108b90dfe946f498be21303058413bbb0e59d0bd6a6115788705abd0666d6\nA = 9258d6238e4923d120b2d1033573ffcac691526ad0842a3b174dccdbb79887bd\nM = ce62909c39371d463aaba3d4b72ea6da49cb9b529e39e1972ef3ccd9a66fe08f\n\nModInv = aebde7654cb17833a106231c4b9e2f519140e85faee1bfb4192830f03f385e773c0f4767e93e874ffdc3b7a6b7e6a710e5619901c739ee8760a26128e8c91ef8cf761d0e505d8b28ae078d17e6071c372893bb7b72538e518ebc57efa70b7615e406756c49729b7c6e74f84aed7a316b6fa748ff4b9f143129d29dad1bff98bb\nA = a29dacaf5487d354280fdd2745b9ace4cd50f2bde41d0ee529bf26a1913244f708085452ff32feab19a7418897990da46a0633f7c8375d583367319091bbbe069b0052c5e48a7daac9fb650db5af768cd2508ec3e2cda7456d4b9ce1c39459627a8b77e038b826cd7e326d0685b0cd0cb50f026f18300dae9f5fd42aa150ee8b\nM = d686f9b86697313251685e995c09b9f1e337ddfaa050bd2df15bf4ca1dc46c5565021314765299c434ea1a6ec42bf92a29a7d1ffff599f4e50b79a82243fb24813060580c770d4c1140aeb2ab2685007e948b6f1f62e8001a0545619477d498132c907774479f6d95899e6251e7136f79ab6d3b7c82e4aca421e7d22fe7db19c\n\nModInv = 1ec872f4f20439e203597ca4de9d1296743f95781b2fe85d5def808558bbadef02a46b8955f47c83e1625f8bb40228eab09cad2a35c9ad62ab77a30e3932872959c5898674162da244a0ec1f68c0ed89f4b0f3572bfdc658ad15bf1b1c6e1176b0784c9935bd3ff1f49bb43753eacee1d8ca1c0b652d39ec727da83984fe3a0f\nA = 2e527b0a1dc32460b2dd94ec446c692989f7b3c7451a5cbeebf69fc0ea9c4871fbe78682d5dc5b66689f7ed889b52161cd9830b589a93d21ab26dbede6c33959f5a0f0d107169e2daaac78bac8cf2d41a1eb1369cb6dc9e865e73bb2e51b886f4e896082db199175e3dde0c4ed826468f238a77bd894245d0918efc9ca84f945\nM = b13133a9ebe0645f987d170c077eea2aa44e85c9ab10386d02867419a590cb182d9826a882306c212dbe75225adde23f80f5b37ca75ed09df20fc277cc7fbbfac8d9ef37a50f6b68ea158f5447283618e64e1426406d26ea85232afb22bf546c75018c1c55cb84c374d58d9d44c0a13ba88ac2e387765cb4c3269e3a983250fa\n\nModInv = 30ffa1876313a69de1e4e6ee132ea1d3a3da32f3b56f5cfb11402b0ad517dce605cf8e91d69fa375dd887fa8507bd8a28b2d5ce745799126e86f416047709f93f07fbd88918a047f13100ea71b1d48f6fc6d12e5c917646df3041b302187af641eaedf4908abc36f12c204e1526a7d80e96e302fb0779c28d7da607243732f26\nA = 31157208bde6b85ebecaa63735947b3b36fa351b5c47e9e1c40c947339b78bf96066e5dbe21bb42629e6fcdb81f5f88db590bfdd5f4c0a6a0c3fc6377e5c1fd8235e46e291c688b6d6ecfb36604891c2a7c9cbcc58c26e44b43beecb9c5044b58bb58e35de3cf1128f3c116534fe4e421a33f83603c3df1ae36ec88092f67f2a\nM = 53408b23d6cb733e6c9bc3d1e2ea2286a5c83cc4e3e7470f8af3a1d9f28727f5b1f8ae348c1678f5d1105dc3edf2de64e65b9c99545c47e64b770b17c8b4ef5cf194b43a0538053e87a6b95ade1439cebf3d34c6aa72a11c1497f58f76011e16c5be087936d88aba7a740113120e939e27bd3ddcb6580c2841aa406566e33c35\n\nModInv = 87355002f305c81ba0dc97ca2234a2bc02528cefde38b94ac5bd95efc7bf4c140899107fff47f0df9e3c6aa70017ebc90610a750f112cd4f475b9c76b204a953444b4e7196ccf17e93fdaed160b7345ca9b397eddf9446e8ea8ee3676102ce70eaafbe9038a34639789e6f2f1e3f352638f2e8a8f5fc56aaea7ec705ee068dd5\nA = 42a25d0bc96f71750f5ac8a51a1605a41b506cca51c9a7ecf80cad713e56f70f1b4b6fa51cbb101f55fd74f318adefb3af04e0c8a7e281055d5a40dd40913c0e1211767c5be915972c73886106dc49325df6c2df49e9eea4536f0343a8e7d332c6159e4f5bdb20d89f90e67597c4a2a632c31b2ef2534080a9ac61f52303990d\nM = d3d3f95d50570351528a76ab1e806bae1968bd420899bdb3d87c823fac439a4354c31f6c888c939784f18fe10a95e6d203b1901caa18937ba6f8be033af10c35fc869cf3d16bef479f280f53b3499e645d0387554623207ca4989e5de00bfeaa5e9ab56474fc60dd4967b100e0832eaaf2fcb2ef82a181567057b880b3afef62\n\n\n# GCD tests.\n#\n# These test vectors satisfy gcd(A, B) = GCD and lcm(A, B) = LCM.\n\nGCD = 0\nA = 0\nB = 0\n# Just to appease the syntax-checker.\nLCM = 0\n\nGCD = 1\nA = 92ff140ac8a659b31dd904161f9213706a08a817ae845e522c3af0c9096699e059b47c8c2f16434b1c5766ebb384b79190f2b2a62c2378f45e116890e7bb407a\nB = 2f532c9e5902b0d68cd2ed69b2083bc226e8b04c549212c425a5287bb171c6a47fcb926c70cc0d34b8d6201c617aee66af865d31fdc8a2eeb986c19da8bb0897\nLCM = 1b2c97003e520b0bdd59d8c35a180b4aa36bce14211590435b990ad8f4c034ce3c77899581cb4ee1a022874203459b6d53859ab1d99ff755efa253fc0e5d8487bb000c13c566e8937f0fe90b95b68bc278610d4f232770b08d1f31bee55a03da47f2d0ebb9e7861c4f16cc22168b68593e9efcde00f54104b4c3e1a0b294d7f6\n\nGCD = a\nA = faaffa431343074f5c5d6f5788500d7bc68b86eb37edf166f699b4d75b76dae2cb7c8f6eccae8f18f6d510ef72f0b9633d5740c0bebb934d3be796bd9a53808e\nB = 2f48ec5aa5511283c2935b15725d30f62244185573203b48c7eb135b2e6db5c115c9446ac78b020574665b06a75eb287e0dbeb5da7c193294699b4c2129d2ac4\nLCM = 4a15f305e9622aa19bd8f39e968bfc16d527a47f7a5219d7b02c242c77ef8b608a4a6141f643ca97cedf07c0f1f3e8879d2568b056718aa15c0756899a08ccbe0a658bae67face96fa110edb91757bfa4828e8ff7c5d71b204f36238b12dd26f17be8ba9771f7068d63e41d423671f898f054b1187605754bc5546f2b02c5ac\n\nGCD = 16\nA = cf0b21bde98b41b479ac8071086687a6707e9efaacd4e5299668ce1be8b13290f27fd32ae68df87c292e8583a09d73ec8e8a04a65a487380dcd7dacca3b6e692\nB = 3be3f563f81d5ad5c1211db7eff430aa345e830ce07b4bde7d4d32dba3ac618d2034351e5435fd6c7f077971fb4a1e83a7396a74fdff7fce1267112851db2582\nLCM = 233a2188de2c017235024b182286f17562b2ee5ab9fdfe4efa2f61c4ff99fa44e1ead5bf6cde05bd7502ce78373c83e3f9dbab0c9bb8620a87c2640bce5d12c685af656df789bb3d0ba1edbaa98cf4f0166d422ab17aa6706f8132264d45b72827d6671a00a9186e723379e3a3bb7902d08865f357c74100059f83800241976\n\nGCD = 1\nA = dd7b7597d7c1eb399b1cea9b3042c14bd6022d31b1d2642a8f82fc32de6eadaf012fbbf349eaec4922a8468740ca73c6090833d6a69a380ed947b39c2f9b0b76\nB = 8e0dc8654e70eec55496038a8d3fff3c2086bc6dbfc0e2dbdf5bd7de03c5aef01a3982556ac3fc34fd5f13368be6cdc252c82367b7462e210f940f847d382dd9\nLCM = 7ae667df4bd4dd35bbec28719a9f1b5e1f396a9ab386c086742a6ab3014a3386d39f35b50624d0c5b4e6b206c2635c7de5ea69e2faa85dd616a7e36622962a07632839857aa49332942feccff2aee1c962e2f4e8ccfd738a5da5bf528b4c5a2440409350f5a17a39d234403e8482ccf838e0d2758ccfb8018198a51dbb407506\n\nGCD = 1\nA = 0\nB = 1\nLCM = 0\n\nGCD = 1\nA = 1\nB = 0\nLCM = 0\n\nGCD = 1\nA = 1\nB = 1\nLCM = 1\n\nGCD = 2b2\nA = dfccaa3549c1b59ab3e114fe87dc5d187719abad58c51724e972741eb895ab79a49f385f61d531ec5c88dbb505ae375093fa848165f71a5ed65e7832a42ade191a\nB = fa58a81f43088da45e659fc1117d0f1cd015aa096c8e5377cf1832191baf7cc28b5c24998b93b64f8900a0973faedb9babaaf1854345f011739da8f1175d9684c\nLCM = 5132f7ab7a982b9dc55114bd96800b7637f9742cf8a7a00a0d69d5e4574fc85792c89a1c52bcfc74b9d7f3f6164819466c46b2d622e280ced7ad121160",
-    "4084a15dc1fd1951a05c8ce37122c0ec15891d818a70d3763670ea3195098de9b1ca50ea89893a9753fb9ea801541058f44801f7f50967124abfc864a2b01c41f94193c\n\nGCD = 8e\nA = 248d96a8a4cab0a1b194e08c1146868b094597cadbc35531f0ed2d77cba9f15cb5cc7c10e64ce054bf93396d25259d750b3de3aba65073db1fd2b852a6454ac1a\nB = 4c7bad8e1844901fd6a2ce2edc82e698d28ec95d6672ca148d85b49ecc78dd0a8b870e202244210bc98592b99ff6abbd20630f9eee7d46b15ccfae8d08b86799de\nLCM = 13b01f9d9c6c13e90c97e3d95bbce5a835c631b3de3bd4ff5df13ad850f5223dbdf71c53912275d0397df9335ef3a3ba8e4684c6b25962bb7b18bc74144cb5edf0196f79863a7ff032619a71646a92281f7baace7f223d254cb4d05ec19bf8d4c8ce4455a9d770daec89c0d3cf338cbdae39cf982b3c4568f5c9def4e1133d28a\n\nGCD = 3e55\nA = 2fa97382f46676b7a4cc2b8153f17b58792d24660e187d33ce55c81cc193ccb6e1e2b89feea1d5fd8faa36e13bf947fb48635e450a4d1488d0978324194a1f43c6\nB = ab08ad074139963bc18e5d87ba68db64ca6f4c279616c64039b02c55f2375b3bc04114e8e05e1ba92fb6470768f61d123845aea36774c18612736a220934561faf\nLCM = 82c7c377ecda2cb9228604cd287df5eff94edd4a539c3eb3b3fdd4b4a79d2f4eaf2b22f8286272d3dad2e370cfcd9ea4d93ebb3f049c52b8fa23b68a5bf79af989822e2cfb978f68c6a5058f47319dffcb455b089b06ae6db9e5c8a2b6e951d6e118bd2b4cd08b6e5733476a446a57387d940d1289ec00e24315821ed3a5daf2\n\nGCD = a7a\nA = 923706dfed67834a1e7e6c8e8e9f93bfbc0b43ca1f324886cf1f1380fb9b77109275d4b50af1b7689802fe9b3623ac46c7ba0e17e908c20278127b07a5c12d86ec\nB = 64473e878a29021fac1c1ce34a63eae1f4f83ee6851333b67213278b9a4a16f005cba0e8cdb410035bb580062f0e486c1a3a01f4a4edf782495f1dc3ebfa837d86\nLCM = 57785ca45b8873032f1709331436995525eed815c55140582ce57fd852116835deac7ca9d95ce9f280e246ea4d4f1b7140ab7e0dd6dc869de87f1b27372098b155ad0a1828fd387dff514acc92eae708609285edaab900583a786caf95153f71e6e6092c8c5ee727346567e6f58d60a5e01c2fa8ebcf86da9ea46876ecc58e914\n\nGCD = 42\nA = 0\nB = 42\nLCM = 0\n\nGCD = 42\nA = 42\nB = 0\nLCM = 0\n\nGCD = 42\nA = 42\nB = 42\nLCM = 42\n\nGCD = f60d\nA = ef7886c3391407529d5cf2e75ed53e5c3f74439ad2e2dc48a79bc1a5322789b4ced2914b97f8ff4b9910d212243b54001eb8b375365b9a87bd022dd3772c78a9fd63\nB = d1d3ec32fa3103911830d4ec9f629c5f75af7039e307e05bc2977d01446cd2cbeeb8a8435b2170cf4d9197d83948c7b8999d901fe47d3ce7e4d30dc1b2de8af0c6e4\nLCM = cc376ed2dc362c38a45a719b2ed48201dab3e5506e3f1314e57af229dc7f3a6a0dad3d21cfb148c23a0bbb0092d667051aa0b35cff5b5cc61a7c52dec4ed72f6783edf181b3bf0500b79f87bb95abc66e4055f259791e4e5eb897d82de0e128ecf8a091119475351d65b7f320272db190898a02d33f45f03e27c36cb1c45208037dc\n\nGCD = 9370\nA = 1ee02fb1c02100d1937f9749f628c65384ff822e638fdb0f42e27b10ee36e380564d6e861fcad0518f4da0f8636c1b9f5124c0bc2beb3ca891004a14cd7b118ddfe0\nB = 67432fd1482d19c4a1c2a4997eab5dbf9c5421977d1de60b739af94c41a5ad384cd339ebfaa43e5ad6441d5b9aaed5a9f7485025f4b4d5014e1e406d5bd838a44e50\nLCM = 159ff177bdb0ffbd09e2aa7d86de266c5de910c12a48cbe61f6fa446f63a2151194777555cd59903d24cb30965973571fb1f89c26f2b760526f73ded7ee8a34ebcecd1a3374a7559bcdb9ac6e78be17a62b830d6bb3982afdf10cf83d61fd0d588eab17d6abef8e6a7a5763fcb766d9a4d86adf5bb904f2dd6b528b9faec603987a0\n\nGCD = c5f\nA = 5a3a2088b5c759420ed0fb9c4c7685da3725b659c132a710ef01e79435e63d009d2931ea0a9ed9432f3d6b8851730c323efb9db686486614332c6e6ba54d597cf98\nB = 1b1eb33b006a98178bb35bbcf09c5bebd92d9ace79fa34c1567efa8d6cf6361547807cd3f8e7b8cd3ddb6209dccbae4b4c16c8c1ec19741a3a57f61571882b7aed7\nLCM = c5cbbbe9532d30d2a7dd7c1c8a6e69fd4fa4828a844d6afb44f3747fef584f7f1f3b835b006f8747d84f7699e88f6267b634e7aef78d6c7584829537d79514eec7d11219721f91015f5cefdc296261d85dba388729438991a8027de4827cd9eb575622e2912b28c9ce26d441e97880d18db025812cef5de01adeaec1322a9c9858\n\nGCD = e052\nA = 67429f79b2ec3847cfc7e662880ab1d94acdf04284260fcfffd67c2862d59704ed45bcc53700c88a5eea023bc09029e9fd114fc94c227fd47a1faa1a5ef117b09bd2\nB = 39faa7cbdeb78f9028c1d50ab34fbe6924c83a1262596f6b85865d4e19cc258b3c3af1ee2898e39e5bee5839e92eac6753bbbb0253bd576d1839a59748b778846a86\nLCM = 1ab071fb733ef142e94def10b26d69982128561669e58b20b80d39cf7c2759d26b4a65d73b7f940c6e8fc417180ef62d7e52ac24678137bd927cd8d004ad52b02affe176a1ecde903dbc26dcc705678f76dd8cd874c0c3fe737474309767507bbe70dd7fb671bbb3694cedf0dcdaa0c716250ddd6dfec525261572fa3e1387f7b906\n\nGCD = 3523\nA = 0\nB = 3523\nLCM = 0\n\nGCD = 3523\nA = 3523\nB = 0\nLCM = 0\n\nGCD = 3523\nA = 3523\nB = 3523\nLCM = 3523\n\nGCD = f035a941\nA = 16cd5745464dfc426726359312398f3c4486ed8aaeea6386a67598b10f744f336c89cdafcb18e643d55c3a62f4ab2c658a0d19ea3967ea1af3aee22e11f12c6df6e886f7\nB = 74df09f309541d26b4b39e0c01152b8ad05ad2dfe9dd2b6706240e9d9f0c530bfb9e4b1cad3d4a94342aab309e66dd42d9df01b47a45173b507e41826f24eb1e8bcc4459\nLCM = b181771d0e9d6b36fdfcbf01d349c7de6b7e305e1485ea2aa32938aa919a3eee9811e1c3c649068a7572f5d251b424308da31400d81ac4078463f9f71d7efd2e681f92b13a6ab3ca5c9063032dcbdf3d3a9940ce65e54786463bbc06544e1280f25bc7579d264f6f1590cf09d1badbf542ce435a14ab04d25d88ddbac7d22e8cae1c91f\n\nGCD = 33ad1b8f\nA = 1af010429a74e1b612c2fc4d7127436f2a5dafda99015ad15385783bd3af8d81798a57d85038bcf09a2a9e99df713b4d6fc1e3926910fbbf1f006133cb27dc5ebb9cca85\nB = 92a4f45a90965a4ef454f1cdd883d20f0f3be34d43588b5914677c39d577a052d1b25a522be1a656860a540970f99cbc8a3adf3e2139770f664b4b7b9379e13daf7d26c\nLCM = 4c715520ed920718c3b2f62821bc75e3ff9fd184f76c60faf2906ef68d28cd540d3d6c071fa8704edd519709c3b09dfaee12cb02ab01ad0f3af4f5923d5705ce6d18bcab705a97e21896bb5dd8acb36ee8ec98c254a4ddc744297827a33c241f09016a5f109248c83dd41e4cea73ce3eabb28d76678b7e15545b96d22da83c111b6b624\n\nGCD = dc0429aa\nA = ccb423cfb78d7150201a97114b6644e8e0bbbb33cadb0ef5da5d3c521a244ec96e6d1538c64c10c85b2089bdd702d74c505adce9235aa4195068c9077217c0d431de7f96\nB = 710786f3d9022fc3acbf47ac901f62debcfda684a39234644bac630ab2d211111df71c0844b02c969fc5b4c5a15b785c96efd1e403514235dc9356f7faf75a0888de5e5a\nLCM = 6929af911850c55450e2f2c4c9a72adf284fe271cf26e41c66e1a2ee19e30d928ae824f13d4e2a6d7bb12d10411573e04011725d3b6089c28d87738749107d990162b485805f5eedc8f788345bcbb5963641f73c303b2d92f80529902d3c2d7899623958499c8a9133aae49a616c96a2c5482a37947f23af18c3247203ac2d0e760340e6\n\nGCD = 743166058\nA = 16cd476e8031d4624716238a3f85badd97f274cdfd9d53e0bd74de2a6c46d1827cc83057f3889588b6b7ca0640e7d743ed4a6eaf6f9b8df130011ecc72f56ef0af79680\nB = 86eba1fc8d761f22e0f596a03fcb6fe53ad15a03f5b4e37999f60b20966f78ba3280f02d3853f9ace40438ccfaf8faed7ace2f2bf089b2cdd4713f3f293bf602666c39f8\nLCM = 1a7a1b38727324d6ba0290f259b8e2b89c339b2445cada38a5a00ded1468ab069f40678ce76f7f78c7c6f97783cc8a49ef7e2a0c73abbac3abc66d1ce99566ce7f874a8949ca3442051e71967695dc65361184748c1908e1b587dc02ed899a524b34eb30b6f8db302432cfa1a8fbf2c46591e0ab3db7fd32c01b1f86c39832ee9f0c80\n\nGCD = 6612ba2c\nA = 0\nB = 6612ba2c\nLCM = 0\n\nGCD = 6612ba2c\nA = 6612ba2c\nB = 0\nLCM = 0\n\nGCD = 6612ba2c\nA = 6612ba2c\nB = 6612ba2c\nLCM = 6612ba2c\n\nGCD = 2272525aa08ccb20\nA = 11b9e23001e7446f6483fc9977140d91c3d82568dabb1f043a5620544fc3dda233b51009274cdb004fdff3f5c4267d34181d543d913553b6bdb11ce2a9392365fec8f9a3797e1200\nB = 11295529342bfb795f0611d03afb873c70bd16322b2cf9483f357f723b5b19f796a6206cf3ae3982daaeafcd9a68f0ce3355a7eba3fe4e743683709a2dd4b2ff46158bd99ff4d5a0\nLCM = 8d4cbf00d02f6adbaa70484bcd42ea932000843dcb667c69b75142426255f79b6c3b6bf22572597100c06c3277e40bf60c14c1f4a6822d86167812038cf1eefec2b0b19981ad99ad3125ff4a455a4a8344cbc609e1b3a173533db432bd717c72be25e05ed488d3970e7ed17a46353c5e0d91c8428d2fec7a93210759589df042cab028f545e3a00\n\nGCD = 3480bf145713d56f9\nA = 8cf8ef1d4f216c6bcec673208fd93b7561b0eb8303af57113edc5c6ff4e1eeae9ddc3112b943d947653ba2179b7f63505465126d88ad0a0a15b682f5c89aa4a2a51c768cd9fdeaa9\nB = a6fd114023e7d79017c552a9051ca827f3ffa9f31e2ee9d78f8408967064fcdc9466e95cc8fac9a4fa88248987caf7cf57af58400d27abd60d9b79d2fe03fad76b879eceb504d7f\nLCM = 1c05eee73a4f0db210a9007f94a5af88c1cdd2cba456061fd41de1e746d836fa4e0e972812842e0f44f10a61505f5d55760c48ba0d06af78bb6bde7da8b0080b29f82b1161e9c0b5458e05ac090b00f4d78b1cc10cf065124ba610e3acab092a36fe408525e21c0ddc7c9696ed4e48bd2f70423deecfe62cecc865c6088f265da0e5961d3f3a84f\n\nGCD = 917e74ae941fcaae\nA = 652f8a92d96cbf0a309629011d0fbaceb1266bc2e8243d9e494eead4cf7100c661b537a8bea93dec88cfc68597d88a976c125c3b4de19aba38d4ea9578202e59848d42652518348a\nB = 32e07b71979d57e8344e97c39680a61e07d692d824ae26b682156890792d8a766ee29a4968f461aaced5bf049044fba2f4120b1c1f05985676f975d4582e9e82750d73c532cd07b2\nLCM = 23620c7b897dc26c7717e32f3517ac70bf09fbe08f7255ab010cf4cf946f4e96304c",
-    "425043452c5d5a0e841d3a3cfd9c2d84d9256f3b5974fe3ebfa9255fe20a710d3e6511606c0d85970381101c7f4986d65ad6a73a71507f146b11f903043cfa805cc0b14d4f3072da98bf22282f7762040406c02d5b3ef9e7587f63bab8b29c61d8e30911aa96\n\nGCD = 2b9adc82005b2697\nA = 19764a84f46045ef1bca571d3cbf49b4545998e64d2e564cc343a53bc7a0bcfbe0baa5383f2b346e224eb9ce1137d9a4f79e8e19f946a493ff08c9b423574d56cbe053155177c37\nB = 1bbd489ad2ab825885cdac571a95ab4924e7446ce06c0f77cf29666a1e20ed5d9bc65e4102e11131d824acad1592075e13024e11f12f8210d86ab52aa60deb250b3930aabd960e5a\nLCM = 1032a0c5fffc0425e6478185db0e5985c645dd929c7ebfeb5c1ee12ee3d7b842cfab8c9aa7ff3131ac41d4988fb928c0073103cea6bb2cc39808f1b0ad79a6d080eac5a0fc6e3853d43f903729549e03dba0a4405500e0096b9c8e00510c1852982baec441ed94efb80a78ed28ed526d055ad34751b831b8749b7c19728bf229357cc5e17eb8e1a\n\nGCD = 8d9d4f30773c4edf\nA = 0\nB = 8d9d4f30773c4edf\nLCM = 0\n\nGCD = 8d9d4f30773c4edf\nA = 8d9d4f30773c4edf\nB = 0\nLCM = 0\n\nGCD = 8d9d4f30773c4edf\nA = 8d9d4f30773c4edf\nB = 8d9d4f30773c4edf\nLCM = 8d9d4f30773c4edf\n\nGCD = 6ebd8eafb9a957a6c3d3d5016be604f9624b0debf04d19cdabccf3612bbd59e00\nA = 34dc66a0ffd5b8b5e0ffc858dfc4655753e59247c4f82a4d2543b1f7bb7be0e24d2bbf27bb0b2b7e56ee22b29bbde7baf0d7bfb96331e27ba029de9ffdff7bdb7dc4da836d0e58a0829367ec84ea256833fd4fe1456ad4dd920557a345e12000\nB = 1f3406a20e20ebf96ccb765f898889a19b7636608fd7dc7c212607b641399543f71111d60e42989de01eaa6ff19a86ea8fbde1a3d368c0d86dc899e8e250fc764090f337958ca493119cbb4ad70cbfae7097d06d4f90ec62fbdd3f0a4496e600\nLCM = ee502c50e3667946e9089d0a9a0382e7fd0b75a17db23b56a0eec997a112c4dbd56d188808f76fe90451e5605550c9559ef14a95014c6eb97e9c1c659b98515c41470142843de60f72fb4c235faa55b0a97d943221003d44e2c28928f0b84bf071256254897ed31a7fd8d174fc962bc1311f67900ac3abcad83a28e259812f1ee229511ab1d82d41f5add34693ba7519babd52eb4ec9de31581f5f2e40a000\n\nGCD = ef7399b217fc6a62b90461e58a44b22e5280d480b148ec4e3b4d106583f8e428\nA = 7025e2fe5f00aec73d90f5ad80d99ca873f71997d58e59937423a5e6ddeb5e1925ed2fd2c36a5a9fc560c9023d6332c5d8a4b333d3315ed419d60b2f98ccf28bbf5bf539284fd070d2690aeaac747a3d6384ee6450903a64c3017de33c969c98\nB = df0ac41dbabce1deeb0bceb1b65b1079850052ecf6534d0cff84a5a7fb5e63baee028d240f4419925154b96eaa69e8fbb1aae5102db7916234f290aa60c5d7e69406f02aeea9fe9384afbff7d878c9ac87cd31f7c35dff243b1441e09baff478\nLCM = 687669343f5208a6b2bb2e2efcac41ec467a438fde288cc5ef7157d130139ba65db9eb53e86a30c870bd769c0e0ab15a50f656cd9626621ae68d85eaff491b98da3ea5812062e4145af11ea5e1da457084911961ef2cd2ac45715f885ba94b4082aa76ffd1f32461f47c845b229d350bf36514c5ce3a7c782418746be342eca2721346ade73a59475f178c4f2448e1326110f5d26a0fef1a7a0c9288489e4dc8\n\nGCD = 84b917557acf24dff70cb282a07fc52548b6fbbe96ca8c46d0397c8e44d30573\nA = 81dbb771713342b33912b03f08649fb2506874b96125a1ac712bc94bfd09b679db7327a824f0a5837046f58af3a8365c89e06ff4d48784f60086a99816e0065a5f6f0f49066b0ff4c972a6b837b63373ca4bb04dcc21e5effb6dfe38271cb0fa\nB = 1da91553c0a2217442f1c502a437bb14d8c385aa595db47b23a97b53927b4493dd19f1bc8baf145bc10052394243089a7b88d19b6f106e64a5ab34acad94538ab504d1c8ebf22ac42048bbd1d4b0294a2e12c09fe2a3bd92756ba7578cb34b39\nLCM = 1d0530f8142754d1ee0249b0c3968d0ae7570e37dadbe4824ab966d655abf04cd6de5eb700eba89d8352dec3ae51f2a10267c32fbd39b788c7c5047fe69da3d7ad505435a6212f44899ba7e983bb780f62bcdee6f94b7dba8af7070a4cc008f351ae8be4579bc4a2e5c659ce000ad9c8cdc83723b32c96aeb0f5f4127f6347353d05525f559a8543cd389ad0af6f9d08a75b8c0b32419c097e6efe8746aee92e\n\nGCD = 66091477ea3b37f115038095814605896e845b20259a772f09405a8818f644aa\nA = cedac27069a68edfd49bd5a859173c8e318ba8be65673d9d2ba13c717568754ed9cbc10bb6c32da3b7238cff8c1352d6325668fd21b4e82620c2e75ee0c4b1aff6fb1e9b948bbdb1af83cecdf356299b50543b72f801b6a58444b176e4369e0\nB = 5f64ca1ba481f42c4c9cf1ffa0e515b52aa9d69ceb97c4a2897f2e9fa87f72bae56ee6c5227f354304994c6a5cc742d9f09b2c058521975f69ca5835bce898cf22b28457cd7e28870df14e663bb46c9be8f6662f4ff34d5c4ae17a888eba504e\nLCM = c163cb28642e19a40aa77887c63180c2c49fc10cda98f6f929c8131752ea30b5283a814a81681b69b9d1762e6c1a9db85f480bc17f998d235fd7e64c1caa70ef170c9e816d3e80f516b29f2c80cfb68bf208b4d5082ef078da4314b3f20c7d6c54b0aeb378096b029a7b61c0a4cd14aeddc01004c53915a4f692d2291752e5af46b23d7fa6dd61f2d56c6f4bf8e6119688abac8fd7aba80e846a7764bb3fca0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = 0\nB = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nLCM = 0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nB = 0\nLCM = 0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nB = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nLCM = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\n\nGCD = 120451d8307219aa0c96f328ad653ccd462e92423ca93ed8a3dde45bf5cb9b13cdaf9800e4d05dd71c4db6a129fb3280ee4ec96ec5297d881c1a8b5efccbd91fef21f5c5bf5fba42a4c8eaa358f620a074b7a17054527bdaa58d5acaa0dfdc48ecba1a10ebf4d57bb4215de406e6be13fed3fe493b1cd1e2d11a8d4ac03c47756\nA = 3f8179a8e1f0b342475a855c3e1bae402dd41424cf24a0b4d2e263c8efb08bde7d92eae8607fb5e88b1378f0f1bd0733f229a35be6b1383a48d32749d5d6b32427d26323b7ab05bb5781289e96bfbc21971439319b15f6c0fe93fdb35d0b67ec41443c59a081dd3cef047ac797fccb45bece84c0bb0bb7e1797259526d8ec9cc63ba4d32cfc692ccd3d243cb2b53ac216312f3a8e8c0daa09d21b6150d697639a5e52059414a417c607be8ec0eee2e708219cadbaf37a369c4485b01ed87bbc2\nB = 2c474e396a2dd9cd10b9d7313f69d3b4ca123e9fd853edd488339236d14c56453a1381958864a04d2624e81995dabcdd0ccf60db9917813f887de68da075d0ea4440001e18f470e43b38ee3440b49be651d709fbdef980e3e4149913f4ae2681124f54523f4881376ddb533b5219e804cc26f4c2e577be4e02613c4da80ba1215775b0a5178a965ad47bd2befb32493943ded1004ef66347b4983f8d1ba990d4a943505dfce6debcfb322842ed88106cd6dee9aa592ff0d2274bc727a6e1f14c\nLCM = 9c129cf649555bfd2d3d9c64dc6d6f022295e53bca5d2f218adaa66aa60eb4694429b7e83bf81b6df4459c5104023ab9a33f006ffcd8114507baa17e2ef6fe23ebdd4740f66879033da2041f2cb7ba517ad3526ffe75614ea9432c085f71b2d65a736bac7ba42b639e330b82733372083843dcb78b6a273ab20e0d4b7c8998a14048aa15bb20a0a0bd997917107274c89b4cec175fb98043d52e6c555bd9e0036566d052a6d4e7e276d1e8835e1f06e3ca46d47747ba586e95fb1a790d992834b7c3e136141eb8a434e6c12067246ac3c0a81c69e03b1ed28aa0b3173d6eff83d278c2f461a47a416f3f9a5dae3bb410fd18817bd4115e7f1e84b936cc02364\n\nGCD = 95aa569a2c76854300d7660847dd20fe0b8c445fdbcaa98465cee61aee76ad6a438e75a8c573198570ffb62bc07ec3a2be0ae0a1f631670fa88d6f75f3161e8b9a4d44b6801ffc884c7f469c5ed1f27b1edecce9f2977f9e92d1a3b230492fea7e6f2af739dc158a7fbd29856cbedb57b4119e64b27ab09eb1c2df01507d6e7fd\nA = 4c653b5bfec44e9be100c064dffe5d8cd59b0cf4cc56b03eabb4ef87cfda6506c9a756b811907fe9d8b783eb7a0b9e129773bf1da365ddb488d27b16fb983e89345d1ccdb4f06a67a11925c3f266373be5d7b0075189c6f3c2157e2da197058fe0a7bcc50adc34e99e254a29abbe2d5948d3157e1b0c3fca3d641760f7b9862843b63abef0b3d83fd486f4526b30382fda355575da30e9a106718a3921774c4d69f5311f8d737fe618f5236b4763fe1b2ee7f13184db67367d3903c535ff6d7b\nB = 2dcca83c99a28e9fd2f84e78973699baf2f04fd454094730948b22477834a0064817b86e0835e6d7b26e5b0b1dcf4ad91a07ac0780d6522df1fcac758cf5db6c2a5623d7c0f1afefd5718f7b6de639867d07a9ec525991304e9355d1635104bea837f74758d6aa2aab4e4afbb606af1d98de7417505e4710cd0589bdff9a0bf38a857cc59a5f1781043e694fc2337fd84bdeb28b13a222bb09328a81ec409ad586e74236393d27398cc24d412135e34247c589149e134b97f4bd538ac9a3424b\nLCM = 1760c0b0066aa0695767099e87e9388729ea89b8e8c36bddcd04d257591e741613c07b0e69447c0a468c33a745084171e06523d987d8db40a1433bf435325e8a724a0876503b34495170ff3671d42117a2e4f3a75b1d9dd809a34fa0fb26fe50d84f80a9b02e40190e5efb927a5a61a03f13edbce2e666af6c3a2a9bcb84e47e3090008753ff27c4b8cf06480f471379a93f5230923623a83b286b71a555cd5e5347282f664ed90b14b2c4de84a70375e488211a7b3931119ef3bbe029b712389fe784818a0bf29d80733ce9cc940c547aa1eb3f06d492eb676bf37802283c82ce76156dfaab5c2d5107e08062681b5fa169f6eb68e1ab8bd9b2005e90bd4fd\n\nGCD = 244b9b1290cf5b4ba2f810574c050651489f2d3a2b03e702b76ebfaf4e33de9bbe5da24c919e68d3a72eadd35982b3a89c6b18b38ff7082ac65263e52b6ec75a5717b971c98257b194c828bff0216a99536603b41a396ea2fb50f5ea7cf3edf10bb0d039123e78593ae9ffcbbba02e51e038533e83b6bc73c70551d6467f39809\nA = 41a0b1310669500681cdf888836f6c",
-    "556758750f562d743ac780dd4c0d161856380e44fdbb1f8a2786bf45be6b0e7f1cb2cd85f6b9e50acc72793d92383c7d7fb796fc74d32e8fac8225bdc19ae47546d9c9c75f5f06ca684f07daccaf89ccf2cddeb7ec255d530c7dd1e71daf44cafdc9d30fbcb1cbaefae3480585f79f4177e3834a5bc91845e2e8cd8aeb27f484e5e5b2c3c076dbb6c23e91303f0a0fdde83cd33a8ea6ed1549e727b4d766c1017c169710fd98e1585d60f66e121f9180b3\nB = 251f5aeaa60b3959285f49540cdaf8e21451110bbddb9933bbbcaea3112f4eb45e435a3ba37c52d2ab79ce997a8f6c829b3aa561f2852924b8effb52396d09d2bf257ebb4fb56c7aa25648f69b06d2cd01e876c9f9c0679de9e6fffa79eb7e603723e5af7de46ee405a5a079229577b5b6fffb8d43e391fe6f4eb89638e64d6eff8026249aaa355a91625eb0bfd14caa81e4c3586aaa2e94fde143a44f223a91e226661d12f55dfcdb4215e5a64e14e968005733be6a71c465de312ca109b34a\nLCM = 431f918b274f3e43f446e4e85567883d6536a0332db662cef088f5a36b0f4b68372048174ba10fee94b9f8f1c2e189c974be2e6e8ae8e2ae108445326d40f63e38d8d4e2e46174589a3cbc9583e0036dc8146e79eee9e96f4436313b3f143dd0f5aceab05243def7f915169c360f55ef123977cf623c5ba432c3259c62fb5e37d5adab0f24b825aa4ada99ec4e83e9ca4698399e1ed633091ce5f9844c540a642cd264201116ed4168aa2105a5159f5df064f845830c469140f766c7319052ce59bd1ad7c3f2d8c30e54f147f6aeb5586c70c984302ba18d854a60aec01b394c7d66fa33fe18fe4a8cfb3238df219294e6e42190a30d28b10049a1b75853a4e\n\nGCD = 206695d52bc391a4db61bf8cb6ea96188333a9c78f477ee76976c2346dad682cf56ca6f176d86ef67d41ff5921b6162b0eca52359975872430dd14c45643eacdf028d830770714c033fd150669705851b2f02de932322d271d565d26768530c3f6cb84f0b3356f970b9070b26c050ead0417152c324c8ffe266d4e8b5b7bef3a\nA = 1114eb9f1a9d5947eb1399e57f5c980833489685023ed2fe537fe1276c1e026b9a19e6fff55aa889d6c4e977b6e6f3111e2ad463138637b50f42cf32e57d83f282de9e72f813e5969195159a666d74dcd689bd527c60199ae327f7bd548ac36868fea5fdf6f35d19b921e7c10b6448ca480de6826478cd0642d72f05af3f8e65ce42409fbd49f56e81946e89c8e83962c4edc0ed54600600a305e52d081aed3c351e450e11f8fb0ce5754c92cf765b71393b2b7a89c95df79b9ea1b3cb600862\nB = 1d8f3179ca7b5cc7119360c10de939ffa57c9043da2f2b0ca3009c9bdad9f19ed16e3c2c197bef4b527fa1bf2bbab98b77e26c329911db68bd63d3d0fbfc727a977395b9ad067106de3094d68e097830858c5ccfa505fc25e972bdee6f347e7d1163efacd3d29a791ec2a94ffeed467884ae04896efc5e7e5f43d8d76c147e3c9951a1999173bc4e5767d51268b92cc68487ba1295372143b538711e0a62bf0ac111cc750ca4dd6c318c9cbe106d7fc492261404b86a1ba728e2d25b1976dc42\nLCM = f9570211f694141bfb096560551080cbe02a80271b4505591aaea9e3b99ea1d5ac1c1f2378fd72799e117ac2a73381b1ad26314e39972164d93971479ee3ba21a4d98cef0bd299d540ce5826995dcee0de420dff73d30b23cbf3188c625c7696df517535bc5675d71faa00807efbebdca547933f4a37849d1c014484a77da6df0670c4974bcc91eb5f5fe5faf9dd095ef195ec32ad9eeebf0e63288b4032ed9e70b888afc642f4ff96f0b4c0a68787301c12e4527fe79bdfe72dd3844ab5e094a9295df6616f24d1b9eeebc2116177dacf91969dda73667bc421ef3ccd8d5c23dddc283f5d36568d31f2654926be67f78e181075bdc148f2b39c630b141ae8a\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 0\nB = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nLCM = 0\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nB = 0\nLCM = 0\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nB = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nLCM = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\n\nGCD = 2\nA = 14e95a85e59ade9ef39e2f400c65db18702fa5fc485b9bba479a5282b2206129160e54f73ef4917983c17b4c5ebff7be112a886de069706eee29ba902515cb038\nB = ddcfff1d39c90c599f55495bf71c1e7597c6b08b7430707f360c6a6e5137bbc7b403c6d9e2c34f3d2f29d5d32b869346853c2de239cc35381bdfb4a01569211a\nLCM = 90f38564ee72e55d362c04599e7d74f068c75f541b84e97abba2841f1a9f66b06b5c9009f6a4c2e319fced85270588de03ccebddbd9279aaecb13bdc1dbea7f42acaee751cb7da83779b8785cc86f41b94b13b54964208ca287d981634778d1096f20e76ca636c0717fd27e0800c43f599a5eded807421b502eaf9990a8c8ed8\n\nGCD = 4\nA = 3c719c1c363cdeb7b57c2aabb71f425da4c3e6d3e447204d555e7cf0f3d372bdda906f36078045044978dafc20171767c8b1464d52dfdf3e2ba8a4906da033a8\nB = 30fe0ef151ac51404e128c064d836b191921769dc02d9b09889ed40eb68d15bfdd2edea33580a1a4d7dcee918fefd5c776cbe80ca6131aa080d3989b5e77e1b24\nLCM = 2e4526157bbd765b0486d90bcd4728f890bc6dbd9a855c67ca5cb2d6b48f8e74e1d99485999e04b193afca58dbf282610185d6c0272007744ff26e00dbdc813929b47940b137dc56ba974da07d54a1c50ec4a5c2b26e83f47cf17f4ccce8c3687e8d1e91d7c491a599f3d057c73473723ce9eee52c20fe8ae1595447552a7ee8\n\nGCD = 10\nA = 44e04071d09119ea9783a53df35de4a989200133bb20280fdca6003d3ca63fdd9350ad1a1673d444d2f7c7be639824681643ec4f77535c626bd3ee8fa100e0bb0\nB = ca927a5a3124ce89accd6ac41a8441d352a5d42feb7f62687a5ebc0e181cc2679888ecc2d38516bdc3b3443550efccac81e53044ae9341ecace2598fe5ce67780\nLCM = 36805ba9b2412a0cb3fe4ed9bdabfa55515c9d615a3d0af268c45c5f6098d2de4a583f3791f1e3883c55d51ce23c5658fd0e8faa9a3709a1cfbd6a61dbab861690f27c86664f084c86cfd4a183b24aaadf59a6f8cbec04f1b0ded8a59b188cb46ae920052e3e099a570540dbc00f7d4a571eef08aa70d2d189a1804bf04e94a80\n\nGCD = 100\nA = 73725032b214a677687c811031555b0c51c1703f10d59b97a4d732b7feaec5726cb3882193419d3f057583b2bc02b297d76bb689977936febaae92638fdfc46a00\nB = 979f4c10f4dc60ad15068cedd62ff0ab293aeaa1d6935763aed41fe3e445de2e366e8661eadf345201529310f4b805c5800b99f351fddab95d7f313e3bb429d900\nLCM = 4460439b4be72f533e9c7232f7e99c48328b457969364c951868ceab56cb2cbbeda8be2e8e3cae45c0758048468b841fdb246b2086d19b59d17b389333166ab82ed785860620d53c44f7aaaff4625ee70fb8072df10fb4d1acb142eadc02978ff2bb07cea9f434e35424b3323a7bda3a1a57aa60c75e49ebb2f59fb653aa77da00\n\nGCD = 100000000\nA = f8b4f19e09f5862d79fb2931c4d616a1b8e0dd44781ca52902c8035166c8fca52d33a56ff484c365ec1257de7fa8ed2786163cfc051d5223b4aad859a049e8ba00000000\nB = 6e54cb41b454b080e68a2c3dd0fa79f516eb80239af2be8250ca9cd377ba501aabafc09146fad4402bdc7a49f2c3eec815e25f4c0a223f58e36709eefd92410500000000\nLCM = 6b3020a880ddeff9d17d3dc234da8771962de3322cd15ba7b1e4b1dd4a6a2a802a16c49653865c6fdf6c207cbe0940f8d81ef4cb0e159385fd709d515ee99d109ad9ad680031cbae4eab2ed62944babdade4e3036426b18920022f737897c7d751dce98d626cdda761fec48ad87a377fb70f97a0a15aa3d10d865785719cc5a200000000\n",
+    "def8105ac28f2ecc8598ec0c4bfc9c1c80222fffc776722eb0621cdd8a0d55f08767fc2922282a76e529d81e4d6e21a2542b8c9a403709ed1132e3b52786b81e684591438fdddb5df2f0b72e6b39cd2db6c0cc55c759c2dc1b6ccc20a5cfd10c6fd345fc766035c7478570d4ac534db3fdb718e2bdad3d096b137bfc09a562043800957e2afe4fdcfe292881f6189edfce52370c0438c2822ce3b14d73b3eff32f7e5ca97e989326b4e3a8fa35544193f8590bbb0ddb1f914894ab87998090771a0be1fd23917cd792be86ea0b98e6eb24\nA = -ec953f1b7ba7d561edaaa23076987daf86f50e9a66c36f0993290549a9006dd9d424885c0fa77295cfe34fc81c5edce9e2371b3039ea18d8f998d1956196284e6d81eb1c62ecaa8cf3fcaca28ca7e64342803c8dc3c139080bdd4a1ff30d7288b085a579d9e90903bd363b48f2072bb6fbfbd9ba2cab30a8a63784d246\n\nSquare = b33f4f3ae453058f4e865ec78f0844bab7af66a97dc2f265ca73ae2232777474bfdda39e10652d7386c16f145272192af728893c3d8a8e92c60d77722b924c30269ff5a399a2449ce15e50320c528c22655ad06227ac4efe5a993179ec61c2fc9115f89d75b53961fd16f7797657f6fbf55662b019608a1d30f64a2c0838e0018b7526921fdd34fd462bfcb2462b7065e2bc7abd57d71371e45dfd8fcfcc00a71f7e45430820747c9a060b72e4f6d2919cbffd00beb0c31a2bdc32afe2cc540b38dd04a2b73ae5ba481a6e535f37a757bbd6aaa972986213afadfa47cb7a15a6f1d443f93cb0ed824a10b4b7d82cae524a096b65ccb39be3c37c07f59\nA = 358da59ef65f62f633675764e292e5a68879df24a4727eca1fc4d232b3a6d936976c92eeb11456b5e8c11319838c145c6529d2f3acc828e55b8274bfe9afb5db241b102715f8e8164e454ef39f13ff1b37cf367a5a66c4f743c750896b7c3c29026e448bb36c6c06b0d9a3d048086ef0c3cd922a02e794223f388b5d646db\n\nSquare = cd4246489f6f221f920acbd8bdcdd17f47d2b77268f72254de4190685c123e8c5eab8517fded1852e8316c9e549d3fa355142d91b2921a3c94aafd8862cd2235429340da38a2af131b8d002f17662354f5805f6a7af7afb6dbd2f641036600614cea42bd8b24d86a5109eed29c0865a5f30c5291b1d1ef3223f9b9826dee773d98ce972da92daa19e843f84ca5f1cd77925a3c1117242ab0fb509b94a83f8de4fc8d21f856f37a4d025b3024bd0dbb6d8acfda4ab2993fd6eb7a7448d4f66ec725d37f0eb14eb242c0ff3f0c4572ba6b98a4ce905fe1b7ca3daca56c225171428c56af938fb66b37e99e54139157bbf41f536989ef813af738837afcd62290\nA = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1348cfd2c1c569c23c31b4c46d6c57d4a488c29ab5beb77904d4adfcd0a01ea0a26bb0cc8790441cc2c8c900f030d7315b4319f1a3cf5685a140e03abe6b94730ad79e8de1f4a0cded86a3d6cfe2db267fa7dc9b2bb32872a90cc\n\nSquare = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110\nA = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4\n\nSquare = 0\nA = 0\n\nSquare = 1\nA = 1\n\n# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb\n# Test vectors from commit message.\n\nSquare = 15c72e32605a3061d11b10123c1874836df96999bd0c22bad3e7d4374724a82f912c5e616a187efe8f7c47fcf6945fe575be8e3d97ed17d47950b4653cb32899\nA = 4aaac91962056c84fba7334e1a6be678022181bafd3aa878899b2346ee210f45\n\nSquare = 48a699fe82f8b62bd2ed18878133575be8e3d97ed17d47950b4653cb32899\nA = 22181bafd3aa878899b2346ee210f45\n\nSquare = 15c72e32272c4471392debf018c679c8b85496496bf8254cd0204f36611e2be10cdb3db8f3c081d8c94ba0e1bacc5061191b83d47ff929f65be0aebfc13ae68d3eea7a7fdf2f575842f7ec656cab3cb56a28095be34756f264f24687bf37de062822309cd1d292f96fa698c972372f09771e97d3a868cda0dc421e8a00000001\nA = 4aaac9190000000062056c8400000000fba7334e000000001a6be67800000000022181ba00000000fd3aa87800000000899b234635dad283ee210f4500000001\n\n\n# Product tests.\n#\n# These test vectors satisfy A * B = Product.\n\nProduct = 5befab3320f8f90542f3120235abd926aac3805a19e343f690\nA = b057af553afb120db6b7764f8\nB = 857734c4c27a1d17f7cf59dee\n\nProduct = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c\nA = ae7a6a87ea8981a567d0b3ecc\nB = -fb0fed5f8c737bcacef4d6cb1\n\nProduct = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475\nA = -c28dc31984d4583e9d45424c3\nB = ffc4581a5c3f885cf42767e67\n\nProduct = aa6805b5408aff7f914472756da07830dcad902834dbdd6944\nA = -ffa07ff9f503511954e5dd3f9\nB = -aaa7af472ad8957763f5a7c64\n\nProduct = 58ca2569173389df29b5ce4b784086055dee821a7243db7210\nA = af417d936f4690008811a1ae8\nB = 81b26b80b43aa65aa55ded52a\n\nProduct = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42\nA = fb5fae5edefb6997d44a1ecd6\nB = -a336e50c6f7845a1686cc88a3\n\nProduct = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce\nA = -f918faa58bb57a2ffb8b01f05\nB = bae08c3006fade695029a1df6\n\nProduct = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a\nA = -8d108d7a16f0696d4ceb24445\nB = -c9c764cae465207097ef8d2c2\n\nProduct = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0\nA = b386d08daf3fa2154e9c768d6\nB = d2557dceb2d02d04d9c578670\n\nProduct = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a\nA = e4e5f7d1311e0c5f2e404d55b\nB = -c18057a328d8c7375afdfd4ee\n\nProduct = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692\nA = -a683312f132b2320632e74ef6\nB = a0758f12791453b4af354730b\n\nProduct = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647\nA = -d70c9b93170261091f0c53f27\nB = -848c86c51a186ac4c9080d3e1\n\nProduct = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427\nA = 898b64ef09d7cf63966e1a3b5\nB = af638b12f26aa5d12e97439eb\n\nProduct = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68\nA = f6003dc83818c14fbe36c9998\nB = -9343f6cbcc81fa4c9399dce5f\n\nProduct = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8\nA = -875ff6f56ca72cbdf614bb9ca\nB = b375a68a21dfb1f159c22fa14\n\nProduct = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4\nA = -c9b8df392e76abc3eb7d5ce04\nB = -dc5ab818c70594dd917b4243d\n\nProduct = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca\nA = f8e12cf4defe388b78510f687\nB = c07ee817b4ae95c2915b88966\n\nProduct = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d\nA = bc5dc74ddf7a1363d1c2b1f25\nB = -c8f069bad7f93cbfe6df51169\n\nProduct = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755\nA = -a8048acb66a8bb88df39266e7\nB = a34e0b265d71435ae8c92a463\n\nProduct = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a\nA = -b071f1f54790c951c1dd2a1cf\nB = -9dd89bb4d9b546207e282e2d6\n\nProduct = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016\nA = b44f3f252c368096fa62747f2\nB = 83439b97dbac579fa4f7b7d23\n\nProduct = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f\nA = 937cf0643ffa53cdea24d642f\nB = -c81881f78243dd5737a7d28e1\n\nProduct = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95\nA = -b536f8d9769be6f62da941ae5\nB = dc0746fb101881ae0cacde6f1\n\nProduct = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2\nA = -ff7eacc7de1bb01d668c693aa\nB = -bfaa6627f9fc7ba68ae41bb2d\n\nProduct = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9\nA = 9e0d5a850d078890a983c0ec9\nB = c9b72c118b3e1f1023a696ce1\n\nProduct = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd\nA = b2b042a21045a74ef1a5091d9\nB = -efbf8b120b384e869692a1b15\n\nProduct = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998\nA = -e7fd5e0bb5496b9d876c27f65\nB = b6262653b2be44501af1d85b8\n\nProduct = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880\nA = -b84674832b26ded0a690a8ff0\nB = -e0b7bdf2fd05a038ed3640b78\n\nProduct = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222\nA = 80cad81ad9a66ab6a1c2e5669\nB = aa0453a77c8af1584f54750d2\n\nProduct = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab\nA = c49ad3d7c8848d4fbf913b10b\nB = -82b3dedbe3cc7cd532ad632e1\n\nProduct = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477\nA = -cab4a9c0a331a5a5e826dda1f\nB = cbfee5041c13075dfe3399aa9\n\nProduct = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad\nA = -f7d13e47f9aaac8c25f9bf75b\nB = -8f4aa95231c1e2336aa092297\n\nProduct = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3\nA = 9d8248d00defce1ad081337c3\nB = e8b479295ecd9cef7301f24b1\n\nProduct = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6\nA = b21b45e88acff48562a19729a\nB = -c1cdfebccc763beeac394b997\n\nProduct = -484ca05aefa113bd",
+    "fcb1bc623f730c9f9555b462a8ab4c9606\nA = -8c12b406c02c4417163c0956b\nB = 8422b15c80c1c087b17eedd92\n\nProduct = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c\nA = -93d45bce155a23a397506d96a\nB = -a87e339c3fd5aebede5fb1b36\n\nProduct = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692\nA = f196d8fe760fdcae7eb60e2f7\nB = 9f7d88a2163ad818bf3a6377e\n\nProduct = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822\nA = d0584b2a306671e4d2c9d0c7b\nB = -bb6e7559df199c68d6df3a3c6\n\nProduct = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876\nA = -cefce1b0a1fb22862418bb597\nB = 80f614139947aea5e76cd55fa\n\nProduct = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4\nA = -d68ed1bea046c6cad057e21db\nB = -d7988b9be54f6e332d019032c\n\nProduct = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4\nA = a8208053adc20a609d5d01404\nB = a2fa927c5458c4fe662d7a3b9\n\nProduct = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10\nA = e82b6410b29020c2d6810a977\nB = -90ddfe0e7f0d6b9cdc0815f70\n\nProduct = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f\nA = -f9b697d9ec774a8d1ee5ea905\nB = f7ccb46a8869cb028492bed53\n\nProduct = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88\nA = -ea8e63afa99c719897ad7f2ab\nB = -e36f11f55b6148d1b4f46e598\n\nProduct = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd\nA = e4c7af7eea3ec9cc2443b7319\nB = c457bc264c8461789931baf85\n\nProduct = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120\nA = 8fd1ff97465775d44dee58ae0\nB = -d268a7d328f44baf80e35119f\n\nProduct = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe\nA = -bc0b398bd0ec045b0cf147b7e\nB = a4050955c234e473257d0c641\n\nProduct = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0\nA = -9d7a4ebac630cc0662b816fb5\nB = -ffda517d3eb3214986b04e290\n\nProduct = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c\nA = 834bc50140d6c6ab938dc58b6\nB = fafee47793cbc533b3c66af3a\n\nProduct = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6\nA = bfd5b1ad323c79428cb2db36a\nB = -eb956a10edebdd658e6810fcf\n\nProduct = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb\nA = -a57da276998c548101f514e9f\nB = a9040c1909712e1149d295765\n\nProduct = a57da276998c548101f514e9f\nA = -a57da276998c548101f514e9f\nB = -1\n\nProduct = 14afb44ed3318a90203ea29d3e\nA = a57da276998c548101f514e9f\nB = 2\n\nProduct = -295f689da6631520407d453a7c\nA = a57da276998c548101f514e9f\nB = -4\n\nProduct = -867614005cc204a8d19720fe13\nA = -a57da276998c548101f514e9f\nB = d\n\nProduct = 12bf3b676f64e5929d38c35e803\nA = -a57da276998c548101f514e9f\nB = -1d\n\nProduct = 24d8f92c68303ed0b96f91a8167\nA = a57da276998c548101f514e9f\nB = 39\n\nProduct = -49b1f258d0607da172df23502ce\nA = a57da276998c548101f514e9f\nB = -72\n\nProduct = -6fd5e6ca25c3d51b2e529f22173\nA = -a57da276998c548101f514e9f\nB = ad\n\nProduct = 1276d4705b81b82da4c7e82559d7\nA = -a57da276998c548101f514e9f\nB = -1c9\n\nProduct = 1ddb9abfc5d4017f068a67b5f4fd\nA = a57da276998c548101f514e9f\nB = 2e3\n\nProduct = -3a8b41c914b1b4a4e341433601f7\nA = a57da276998c548101f514e9f\nB = -5a9\n\nProduct = -97c0f4ba414d6e7d4c8b7ced84d4\nA = -a57da276998c548101f514e9f\nB = eac\n\nProduct = 1198739e0c23639c176d46d13f7c8\nA = -a57da276998c548101f514e9f\nB = -1b38\n\nProduct = 159150954ee0dedf541e4dbac0ec3\nA = a57da276998c548101f514e9f\nB = 215d\n\nProduct = -441d4bc44c86f02ff12c3d91a1562\nA = a57da276998c548101f514e9f\nB = -695e\n\nProduct = -64726b76005ebee27592237ba5dde\nA = -a57da276998c548101f514e9f\nB = 9b62\n\nProduct = bbe4ec7cf7c5bbd198e0ea86bb658\nA = -a57da276998c548101f514e9f\nB = -122a8\n\nProduct = 21f717d05681fd2eb1796776a69ef7\nA = a57da276998c548101f514e9f\nB = 348a9\n\nProduct = -396ac788a1748bc6955f99be4d2c64\nA = a57da276998c548101f514e9f\nB = -58d1c\n\nProduct = -54a213eb083aed1a04f3d1b2da62e7\nA = -a57da276998c548101f514e9f\nB = 82eb9\n\nProduct = 1366fb9c20fb14b8b9a9be4b3e3dde1\nA = -a57da276998c548101f514e9f\nB = -1e037f\n\nProduct = 238d65fd26da4733e5d93ab2485d40b\nA = a57da276998c548101f514e9f\nB = 36ff15\n\nProduct = -38272a99be154d531e922be405aee9a\nA = a57da276998c548101f514e9f\nB = -56dd26\n\nProduct = -64651b62b6a454c08951632c7f2c398\nA = -a57da276998c548101f514e9f\nB = 9b4d68\n\nProduct = fb272e3597b816144f8b945ae6130e0\nA = -a57da276998c548101f514e9f\nB = -1848320\n\nProduct = 280d9f5ed7243712ecb9a7c6358bcb8b\nA = a57da276998c548101f514e9f\nB = 3df5795\n\nProduct = -2fbb6bb8e1ba78cefc47fbbc20e188ee\nA = a57da276998c548101f514e9f\nB = -49d6652\n\nProduct = -57f29c13691ffa1642d2860dab9d288e\nA = -a57da276998c548101f514e9f\nB = 880c2b2\n\nProduct = 139c19d7668e6aabf2d7206cb0723ed34\nA = -a57da276998c548101f514e9f\nB = -1e55aa4c\n\nProduct = 2950ce04bf0cf836d4fe94b88fb757d0a\nA = a57da276998c548101f514e9f\nB = 3fe968b6\n\nProduct = -5175239488dad05a58414251496d2a06c\nA = a57da276998c548101f514e9f\nB = -7e020414\n\nProduct = -945ff0ed38bc6020cf679cbd3e0758c6d\nA = -a57da276998c548101f514e9f\nB = e585e573\n\nProduct = 11c69ae98f6b27e95477986f796bc67c8c\nA = -a57da276998c548101f514e9f\nB = -1b7f653f4\n\nProduct = 209afe75e8fb5ac76d13c06b545f5d4d73\nA = a57da276998c548101f514e9f\nB = 3270154ad\n\nProduct = -386d64b215e41506514f4988ed237e4da2\nA = a57da276998c548101f514e9f\nB = -5749c891e\n\nProduct = -6c13cccdb1d140d0babd52707ea72fa278\nA = -a57da276998c548101f514e9f\nB = a72fb6288\n\nProduct = 136228a8a45540372b9b3cd7f82021f6546\nA = -a57da276998c548101f514e9f\nB = -1dfc08a2fa\n\nProduct = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01\nA = a57da276998c548101f514e9f\nB = 30050f2e5f\n\nProduct = -50d615ce183258e95af77319b766fac81e2\nA = a57da276998c548101f514e9f\nB = -7d0bf92cde\n\nProduct = -817d358293b86a56a4e881e50257c549471\nA = -a57da276998c548101f514e9f\nB = c84efb12ef\n\nProduct = f09b9e80be251de474d726b16e25a6865fc\nA = -a57da276998c548101f514e9f\nB = -1743322a484\n\nProduct = 22996cb0f9c60e35dce49f3825f8a479db26\nA = a57da276998c548101f514e9f\nB = 3585acec11a\n\nProduct = -2b307a37c91791a61c0691858f5f783e4678\nA = a57da276998c548101f514e9f\nB = -42cf6be3e88\n\nProduct = -8826698fcba6c30d755fc523de1cc25301ae\nA = -a57da276998c548101f514e9f\nB = d29cc8af592\n\nProduct = ae37fc99fd419809310782714530d7428d77\nA = -a57da276998c548101f514e9f\nB = -10d8059d4a29\n\nProduct = 1d544a20f9bc7d95ab67d1f65743979f23bba\nA = a57da276998c548101f514e9f\nB = 2d5eadef1c06\n\nProduct = -367897184e9929a0294d320f10278889fbeb7\nA = a57da276998c548101f514e9f\nB = -54431582d0e9\n\nProduct = -943a509076a00060a2e7fa1cddb7468d734a1\nA = -a57da276998c548101f514e9f\nB = e54bb102f4bf\n\nProduct = fcce6e42879af5ad13545c0bcaab85b690cea\nA = -a57da276998c548101f514e9f\nB = -18711db522cd6\n\nProduct = 258c49f86d0cbb14ae9edbd3456be8cede2022\nA = a57da276998c548101f514e9f\nB = 3a1562c7c269e\n\nProduct = -4a8bbce59ad7daa51136d557f7fa16e9a2faad\nA = a57da276998c548101f514e9f\nB = -7350e780b0f33\n\nProduct = -82f53ec9333275d5cc271876a7db936db49280\nA = -a57da276998c548101f514e9f\nB = ca94ad312dd80\n\nProduct = 11daee4fcc713db5b2806e47fa5dff3b5b770eb\nA = -a57da276998c548101f514e9f\nB = -1b9ed6758f9635\n\nProduct = 17038cac4f0c94dc24985ea108ae6682e175752\nA = a57da276998c548101f514e9f\nB = 2399b8a9b1116e\n\nProduct = -37e5f14394bf347a3ed061769fe8e6424af4348\nA = a57da276998c548101f514e9f\nB = -567840a7569fb8\n\nProduct = -9253d4a32a88d8f725984514d969012ead7cc9a\nA = -a57da276998c548101f514e9f\nB = e25b246f733f26\n\nProduct = ace3648371c16a931d29004e79f5b9678391da5\nA = -a57da276998c548101f514e9f\nB = -10b717b27b6a13b\n\nProduct = 1faa5b45d04c143c339b09d3aad94d39b94ef960\nA = a57da276998c548101f514e9f\nB = 30fbd672e106aa0\n\nProduct = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d\nA = a57da276998c548101f514e9f\nB = -62cef5f078a8253\n\nProduct = -5b792bfaeff04ee3d948cb343a249d49eb344f57\nA = -a57da276998c548101f514e9f\nB = 8d805ac65649c49\n\nProduct = c5f824406161eec321da5a58e3e00d393b55abe9\nA = -a57da276998c548101f514e9f\nB = -1323dd41d2e1e077\n\nProduct = 2226dec8a57be8e84e42559007e2d101ccbe67f8d\nA = a57da276998c548101f514e9f\nB = 34d47842b5d0be53\n\nProduct = -340f50f812c7420b502000940788a700f6769788a\nA = a57da276998c548101f514e9f\nB = -508836d8e1193d36\n\nProduct = -a00f1d96e19c590479625c5329a87774b5964cc78\nA = -a57da276998c548101f514e9f\nB = f798fc858657f888\n\nProduct = cb94f830cba8997331912a6a31c34f1bef826d121\nA = -a57da276998c548101f514e9f\nB = -13aec7a5c52a0883f\n\nProduct = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04\nA = a57da276998c548101f514e9f\nB = 231f27f3e347bd67c\n\nProduct = -2aa94179351b4e87de5849ab619d94f47450640199\nA = a57da276998c548101f514e9f\nB = -41fe3ec2189599cc7\n\nProduct = -548",
+    "9401d3da93158d4284e557d74016c0a7cfd935a\nA = -a57da276998c548101f514e9f\nB = 82c5281df41bfc066\n\nProduct = ae04d5b212ecfc9a6d7df07794d565df52991fb70e\nA = -a57da276998c548101f514e9f\nB = -10d3139229f5d02432\n\nProduct = 27821bc811f45d63089790b41d307be978d4b19564c\nA = a57da276998c548101f514e9f\nB = 3d1da85cc012b3e234\n\nProduct = -3de3c9e9d7fa3020a578706339314890dccf63096c2\nA = a57da276998c548101f514e9f\nB = -5fbcfb28bfc9044bfe\n\nProduct = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7\nA = -a57da276998c548101f514e9f\nB = 985b930517b78e6ba9\n\nProduct = cc0622441497a37fddf1856d5e2c99df52b99ea4573\nA = -a57da276998c548101f514e9f\nB = -13b9b88948fb7e95cad\n\nProduct = 1a5168e1a492210591ad1ed660adde9110390e4caf32\nA = a57da276998c548101f514e9f\nB = 28b631c6e04b6ab0d8e\n\nProduct = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4\nA = a57da276998c548101f514e9f\nB = -77f99bdf1eb09da6dcc\n\nProduct = -55afd796db7bce822a00073fc8926d3bd0c79772f036\nA = -a57da276998c548101f514e9f\nB = 848cdd6212b9bb3620a\n\nProduct = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34\nA = -a57da276998c548101f514e9f\nB = -154c39567bd8be5f6b4c\n\nProduct = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c\nA = a57da276998c548101f514e9f\nB = 37c6e7ee89cf87674814\n\nProduct = -39002ecfd6d96661b336157ccef6536756ad2e9219be3\nA = a57da276998c548101f514e9f\nB = -582cdab09915a652203d\n\nProduct = -695f49fc891d53f396f0593efae3973082b76d4f9e944\nA = -a57da276998c548101f514e9f\nB = a30074dbce2246af043c\n\nProduct = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7\nA = -a57da276998c548101f514e9f\nB = -1224195afc7b394ae8cc9\n\nProduct = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af\nA = a57da276998c548101f514e9f\nB = 26c6701c39334169e7bf1\n\nProduct = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100\nA = a57da276998c548101f514e9f\nB = -5436e84b4a29858a68f00\n\nProduct = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871\nA = -a57da276998c548101f514e9f\nB = c56e0f44fc63bca242eef\n\nProduct = da7fe3367ce640fa5941c033ac1874312f10ba5950da75\nA = -a57da276998c548101f514e9f\nB = -15200043166ff309f0426b\n\nProduct = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57\nA = a57da276998c548101f514e9f\nB = 25d057879db26fa29a5e49\n\nProduct = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857\nA = a57da276998c548101f514e9f\nB = -5e46be70de21949df67349\n\nProduct = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63\nA = -a57da276998c548101f514e9f\nB = 9238670897685a6c9cbdbd\n\nProduct = f623344788efb857db55c924e95a437effa4dc8bb2bcd24\nA = -a57da276998c548101f514e9f\nB = -17cc0ec84c228225a7cf45c\n\nProduct = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72\nA = a57da276998c548101f514e9f\nB = 20f9f925b3ed307edbb154e\n\nProduct = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f\nA = a57da276998c548101f514e9f\nB = -6c5cbfd29f3dae1dce99221\n\nProduct = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43\nA = -a57da276998c548101f514e9f\nB = 9136aa79080defd1bcf90dd\n\nProduct = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd\nA = -a57da276998c548101f514e9f\nB = -1d03b512470dc3052779f3e3\n\nProduct = 28388a244214abf046488a8d95308d95f021eae4b994a5a52\nA = a57da276998c548101f514e9f\nB = 3e37dce784274962ff862e6e\n\nProduct = -4da476e76119deef291c0f56934a912a0877278a19a561ee0\nA = a57da276998c548101f514e9f\nB = -781b2f2dc40094a7f8fed520\n\nProduct = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82\nA = -a57da276998c548101f514e9f\nB = 87772a4fb582acafd3e4ef3e\n\nProduct = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa\nA = -a57da276998c548101f514e9f\nB = -1563841bf7851ff158a395716\n\nProduct = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752\nA = a57da276998c548101f514e9f\nB = 3918c30b5568318a58e9be16e\n\nProduct = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a\nA = a57da276998c548101f514e9f\nB = -542fb814f45924aa09a16f2a6\n\nProduct = 0\nA = 0\nB = 542fb814f45924aa09a16f2a6\n\nProduct = 0\nA = 542fb814f45924aa09a16f2a6\nB = 0\n\nProduct = 542fb814f45924aa09a16f2a6\nA = 1\nB = 542fb814f45924aa09a16f2a6\n\nProduct = 542fb814f45924aa09a16f2a6\nA = 542fb814f45924aa09a16f2a6\nB = 1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899f571f257fa81c36a868d80e7fa2bcbda68a72ca3e31db8892b94d073e006433dd7128b7bf677d2b411532e5662cdff66d657673d58e03d4a338bae1a5513296f91d4d2b5b680527a2e12318e422ec2b7f05ea4fd3ef4780576488211dad5733685a8f0e5d2ecda549a15eebb235495e70d26b194c994cf16d98d356218d08a34d1593d90bc0d3572df0e84bdb1705c6c5e64ea4895599bb21bf219abdd4329813ecc198e708cee199c22f749bdeb0c206690e8420883f6c0661e47b29969986a7a72996ef63234c31aa39b7be37995d2898063ef5c3b672c43afbc1a065dec2671ae87e17639cfcd3148145a8323e1e9dc4f9c9daf981dd6aba4e8be01344c2eda185b87\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899aa73af54a4e1825aa6714016da99d9e3d0c02eb139716db437705cd9efabf0123b0831689735f4e488f226e577d4688d30914dd50ed368939452af0a7a094c065c6718bd54f53a808585fc1728c3bd1e7c968d76c6dca32f95a8323bacad31cdd4aae544d4208262c40bcf726c2f26cf1e60341c3e1e0c8ed4542555b9bf00488680b737a245cc9b7817231f1f6f1e614cdf43ea281fb850ebbb9305b1aa441a45dfdaa1e98b9d79d9ca511be070bfa94d8cd3cc750607c93e1b451a14e32356bd48d77860b37fd2e714827e770a5648ce8579a00ba5cae034502a8b03ba754994d9e002130cfdee6bfdf078dc8f6767b927c964197664c8e32bd3d31bd461ce\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8",
+    "668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46feff82a92989bca577998c68ee619d9ea9972c6f139e97f5bdde635152830bedf302873508d2ed73badb82f9e32e1f4d12ea8c8b1059aa6d15f8e17d649bf41467903ab40d220d50570b5a263f637c0fcebc0ca29f8a81e2a01bf39bcb60cb9229dfd40618f706b941836bc5c291dec45ee9193e74d3a4cc5f73054ca56fd774a359f17a687268587393b76204a37cd48dcb09d3daed57a7e6d7d93a0ca3d6de8557fc4ddbfe9cb163fd10b7fe5f270dc57aa2fb88cdca2a3795015a17fd352d85fb688a38fa54883d0cab67aab08dbabd58d307c601f0f810014d78b101ff0bddb6d550b2480782406a905b9201e70ef6c1cb9765e91c10c8f5d240c\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e3812764dd3ebb7489e6e66058ca6ccf9c007f8c049eda369b2889cc411bca78d4f5b0e3a9e80243e87e112072b01922b595afdef4dd562e58ce917f11e69c8fe050de54fdb2d607d05f09afd6dd140e9d195b91d85269610a1e5d5036e8c9fea2d4fa693d80ecdc819b201c0aed27dfe0b92b4b3b9ecabb3b9548f0d27dc917ffb14308c4f970863e163f375852fcd9fb115640dc40534f8f51a7b903599117dca6c80924fa9a1aeb43cf5a9a3f67ae818b484feed51d7ef60b3656720891b13a983c02c281c8a0954f13b7bfaca844d2cb66de5c11ff507e39cf774c7c93b38e296a44f04e5ecf2819b57943fb0509774ddbcfeb\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899c7bedb01951b0f4fdb2c0fb64ad74707fda20027f4cee25da9b59be288d404cbd348f27600b87015d28f03cdf411f0e8c22deb9de5b3e0094f7820d78d59c90017cbd426297f8a32fb4b55b09362cf7cfb5910085acb24dbf618752b8b74c7e87f9cac44cb3b7486c43aa9b19a64d40a74eaf1de8b5f168b43d5750236aef753278c11294efd1adaddb6addb846f45fa55d7391898e8ec1c82bcf0008d9850c4c096571e8872e975dc8af1ba01bfbe8c8c27dc30cdaddd198936e4496579741a3a20e1b8e17241fe4abe5e98794e469180b742b2e1904940381f703f512885bda0340fe74e997ab269be00a3ca29bb937db2e06d8054e26dc13a5014ba51b175\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d88997cc097fe3f7ace3ffb0fcee52b45551165bb02354b229788b59128489879b1a0373e9862a17692464a2dfc5d09185a0f1c67d2359ba70b52b03f21c7b24feb96e25e1a2dc7f4723952bf203979f7c9e38790f881e2b35006157825555d4c867fce9ea0a3cc6f1c94ee308a68e33f64f286247465ffe854033e9c64f5d79d6d66dcb38ad03535b20376bf4c3cf26e07ef445192ba2baf08bb5286695a61ff6b5dc7aa1832017198d61a324b8c244572157323c7bb3a2fee226133e1b0e0f2ff067cf71fc24bf38d0e172f459b0cdf0707c5bc586390faacf428bfdeb04e850ee0c35f6807eb6ca8d3a473dcc2239541115a8b0d33ea33295ff8c13b2a\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e424579",
+    "63abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46fc245133c3335163cce37555d36c555182e6d9a754b9aa9305c070083d0fe806d2c5eda4a976f749d6ef40515c425e6531a7f4d11926e49907b7a8a938205e0d6fefaacb145200cbe3deec686476bcdc1f6bb3535147ecb00818f2cd666ac0dd497f0fbc087bf05c6425b7752a02e2a695655d4310f04943a6178946a74dbe4688bd1eb3f1a166aef37e39f3e1d36b6d6d422ec0db264cae8d44869f57a92952bd74a026dd7cfc672803905f029c723487d4123a7520688fc9c68b2384be32e881f64d0ed7ae555bf00e5799740dd8c6accc40f3fe573f194f4848bb05aea8a5509f2dd10fce023093f1ef20267244a990d7ffd462f4e85a4\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e353744d86d954c06f3b84ef271b184ac9957a5f88b08b606fa6aa97afc4983a62f1e74aa3f242e14a3f4cf5ea415d1437818663556a29d117ea7df1cf1ee32f70d6d5566e25d53f892c42d3f92e481b622455fce36e400de09e2d435099695354ceee249c793b76b3c544d70164381e0420ef8b85609502afff9130729ba7851e0775dc5d8c606ba614e7607625fbc38908c88fac43e29ff9b8728f5809e63f20289246b5128016478437550a833c60edb0df43dd9a47654f2e4ef308d4a18cea57ea4b0c6d08add07f2e7adc427cf591c29dbd1f975432922e3f2b71c75e4d2557efccf626be7a0d522b658d420ae321\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7be8e75d54e5ba9405f671d624eaf8d7a115d0479f6fb773b940525fd46b69bc43c815b6bb1798813ca95790bc68032f0b9e73fc964a9922507d8aac25f859745939b828ef5ed326b226b555e5088f13531be16272a89ad41ae82c940935b5d8fe75dc520a230cc279a887bce01bae0a79356f044af13c6f4a5e53c00b2d03cfcbb0f93b26202441a207ec91576410ac1750e257906d945bfe9204b73fc417600bd191edcf2e3eb79acbf4f84dda372405b5e98397abe85c1593543cd7a5b17cb90e299f422f0ce107d86b56474e435dbbcbb5314fb579cd68d54777aa2d0ff9b6b96de62b4676edea5b09589698ed829cad22a52aaec732b79edf6af\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7739032d1f8bb68307f4adc912f1d9b83797606874d4f2c669fe0b263565c4898a07701585237aa444234719adb869c17142126611a9cbd6e689fabb2847bb9dc5e2dc89694621a7179df1fe7371deb9bbdf5fea0b271d86bcde2796a65331c27365fb97fa3647435c47e5c854a95718fa49072cc239d046ca0ac2bf453beb31070370d59483adb42b9876776e43fccb663887f1a999f625eb8e9c4cdd0a89099c42cdff06be29ad9ea66a957002925c9425a83c3e74096ca31324134f5d4a2b7d3b8d7fd8d72192049f79c670874f65201c068c5aac2008a7df4e5eba02d88be8ec23683513a9cffe06671a7c2fa5da7a7aa571914caba1e\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434",
+    "b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a808857c1bdb914ae0fec75b02d527263093a9d9b8a42289ec74dc73e0e46568a9e8ee117659597434048308c9b66fa7a539694285b1238a13d1163fbac33db147e5431af1c7aca5b1a118db4f6650ec6340491ef7a2d203b53e43d536639f980eb6e92a37bffb2149c5eb45d6718a9496f0784370674c1d29732b944a3c3885b68f0fd2a121f556dc82d1b942e7aabba780f087b9df359d86e2055248c3aabc568e93bba67d3ccca2c4240c876506d63bb05aad6fc4c77dfafff1731a46c6711bc60c4d23976268928bc63e1d133add0633c737bb508c81fa1ff3b452b49b992ebac930432d555ab8c62ae17357b1186e80689672f5a9f472c\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6783ab6c7314a43e85a92955a5fbfbffcd31ef0913ba93563dab2b7f54d90fa21ca827ad15b5b1fb399a303f94837536b2813cb563f793fb780e91f8333a2de7bb9f10efdb652a504d6f242e7c15362d3a6eb6e3d1a5abb03023dfe964656979765a14fe8fc36af3d785030ce549b92a91dcb8e2aa13f5b89eb8449b31961a0f77117c8cac79af95ee69f6594e557af7bb017cd885027ff7c0cb1d2f99d1ed5eacb788f645c25150e737cf1184b546bb2d55f2014a18015ffe647580df6fe4d528ce983309baeac0347ae8739e2b1f6d1a83e12e4dbfea1cd81b11b8628837432ad1906c70323529b718c8c6e398e1dfa73\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f225bca564b7e6561b56e0edbb3a7f5934f382b916ab38423221d656357ce0e9bf1e9b04c0678b9c555e8365a0f977c95bd8dca1fb2ad2268193531ca36cbe7f40da8e1afe097e451dc2931b323ce731c03cc027a92ed8ae105c5e9c1bd385e238d989fadbf3aa54c097a8666df8a66b7e2d016e65a2a632603f2c84290ccd7346ada28dff79dd06c7f7989689aca4f494b977f984650f91327ab9936cb92675932440f135e54e4abeecf255d7061482b4c8d91769e02fc94b8acc43325d69541903c3ef7a7a8a5bd19bf886506d42bcf0efcb6197a8d178d6a60516a5aa771ae238a342dc61df8c18c6ba1ed952d4e0c3409c14639\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f2210cc134828c520a58df29ae28863a158a044937809d7d84d2940efbdddb448c64da5f1f31977e7865fd5529eac82fee3e804064a6315936295f8cb26f0de16a47373f5e8365939e280a57dacb508166a583a630c75730c2fe54971e70a35e224e7a1a21e3bd8f417a47c4796d34148cae15068e19eec637bed8f32846dc5aa7e8f50599e840903a8129206fc384e0b4085f9f1e7e3bf2fc67b62b02566ce73cb4b22d471cde35b4f0cccb74283cdded5748d62286f7ea5c184c1308d520ecc7c7f1535b1132708298bf94c0967bc8f8541bb2f2b3c81f11e50f1d8cba4ce3746ad5f85e6bacbefada657c9b386b991b2\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c36ad2daaf856508e861c7",
+    "f68a2611a215a93e3a15f68f72bb80a4fe9f4cfb6c7f91639179342c633db0f70c9dd849b5b5767908b27e61b812659dcd1a0613433f2c0940be49010886bb384d4676bd523f9827c1a48c7649fbfa73e872a5160796813956979b0f3fd3af728dd48f8a7348090300e41b181c8acae08a3b3106b61f90b0421803e6eba0d68e9bc93d3b659fd6316ba2815cb4b3b6a74f1f3fd24b0c07f619d995ac2beada44188eb72d371a6894f90087eaabe148755409bbff60114bcfefbfe2182e6dc4218d0da75af80059bbb14e848c2e60790fb35bf1cb685cbb133b2baf3f2faefcc3f69e34102def4\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954\n\nProduct = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef9518c8ddd2bbd782e5f8cb06be77fc8d0c29f12d4ce67bb2478369710d003f0cb6f40a1341a5a5f2509d2d189084ea4346a44368a54f44c2be4c7b90c4d22976a31985927d0379b2e5d715a7e67eb3228943a07325a29316c695867e8f4ff676e00ffca0a6dfe8fe24652aef9e7f12616e8a54e367b90942f543a01dc7c1b8000ff991228ae83fe0131cfc235ba12ab2bdb33bd4ab0ba1b356bdbc6da4a70eed9fbf2c704e14ed6230eb5478dac0b02f4def1d8c076d1c0c0e2c4cdadb248de4acf961cee51dc41e545bd5a605a0860fb343c28ebf3f8814a9d5a7e0f3e9c93e742db76bc5671258d1da7758b41efead5\nA = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9\nB = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad\n\n\n# Quotient tests.\n#\n# These test vectors satisfy Quotient = A / B, rounded towards zero, and\n# Remainder = A - B * Quotient.\n\nQuotient = 1\nRemainder = 0\nA = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c\nB = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c\n\nQuotient = -2\nRemainder = 1\nA = 107f0e6cebfe22ac11294a06fed2b994d01c9b3610d50bdd254adafd08c93be8ebdd1e85e1286fe9c9e682a90cbbd6351681b\nB = -83f873675ff11560894a5037f695cca680e4d9b086a85ee92a56d7e84649df475ee8f42f09437f4e4f34154865deb1a8b40d\n\nQuotient = -4\nRemainder = -2\nA = -3d8746ae2123c2d3f1d35910b42af1f86f5e81f8e98986cea20b2a1bdb8af6cf111f1258f112c837accdf4868463fe9eba536\nB = f61d1ab8848f0b4fc74d6442d0abc7e1bd7a07e3a6261b3a882ca86f6e2bdb3c447c4963c44b20deb337d21a118ffa7ae94d\n\nQuotient = 8\nRemainder = -3\nA = -5645d65662eaac73050de06f8f982a9b2ae680467712284be3e2b0e58ef4bf4d72b5be5e12ee1fd803b47f161759662ff5c4b\nB = -ac8bacacc5d558e60a1bc0df1f30553655cd008cee245097c7c561cb1de97e9ae56b7cbc25dc3fb00768fe2c2eb2cc5feb89\n\nQuotient = 10\nRemainder = 4\nA = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4\nB = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b\n\nQuotient = -20\nRemainder = 5\nA = 12805392c55ffa0e27e85e15f2b339872793664e9ed3074cd2600aa52459a57197130d1ea46775ef43115c9413248cc7b34805\nB = -94029c962affd0713f42f0af9599cc393c9b3274f6983a669300552922cd2b8cb89868f5233baf7a188ae4a09924663d9a40\n\nQuotient = -40\nRemainder = -6\nA = -3579fc4d6083394c691b060cf9e20318fe17da0487337f76710bd11512578830ba94ac7b587a2d5ab7cb4afe611e349cdcfb86\nB = d5e7f135820ce531a46c1833e7880c63f85f68121ccdfdd9c42f4454495e20c2ea52b1ed61e8b56adf2d2bf98478d27373ee\n\nQuotient = 80\nRemainder = -7\nA = -74ebad4b39ebaaff82cd91082408c979527907c363d8f0f75db410523f8477c074c45ff85851b6275b1ebc5279029818e78d87\nB = -e9d75a9673d755ff059b2210481192f2a4f20f86c7b1e1eebb6820a47f08ef80e988bff0b0a36c4eb63d78a4f2053031cf1b\n\nQuotient = 100\nRemainder = 8\nA = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c08\nB = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c\n\nQuotient = -200\nRemainder = 9\nA = 1bf534da2f4365c96fc5dd4928e73ac24b157b5136ead90cf6596033ec387a2c14bca828000ae1725f3a5ace8ad67a8c07a0a09\nB = -dfa9a6d17a1b2e4b7e2eea494739d61258abda89b756c867b2cb019f61c3d160a5e5414000570b92f9d2d67456b3d4603d05\n\nQuotient = -400\nRemainder = -a\nA = -3a172cc9483774544311a1366659d9e61cc9fac7dc11c68e36aa991ef4d5e96becf5bac3e0967c904d926617ea11bb9551b980a\nB = e85cb32520ddd1510c4684d9996767987327eb1f70471a38daaa647bd357a5afb3d6eb0f8259f2413649985fa846ee5546e6\n\nQuotient = 800\nRemainder = -b\nA = -5ecff3a3e47fa615b6e3ce2dedfdeefbfe1d437c394631820968a9650b59dc3a2dd1c9a0b06537e4e5c408a59e580921503580b\nB = -bd9fe747c8ff4c2b6dc79c5bdbfbddf7fc3a86f8728c630412d152ca16b3b8745ba3934160ca6fc9cb88114b3cb01242a06b\n\nQuotient = 1000\nRemainder = c\nA = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae00c\nB = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae\n\nQuotient = -2000\nRemainder = d\nA = 163956bc32325f28f48d41d32bb08d2a9c4ccbb0d818368fb13941e82b27da21d04094f7e897ce79c2d0ff8470505f1ef63fc00d\nB = -b1cab5e19192f947a46a0e995d846954e2665d86c0c1b47d89ca0f41593ed10e8204a7bf44be73ce1687fc238282f8f7b1fe\n\nQuotient = -4000\nRemainder = -e\nA = -3763f8e43bd05e6ffeec6d509bbe6ff9a9022ced8cb191c9abaf5fd0e0b75a53e2ad581455e3af09e702a77b164ed3fb54ae000e\nB = dd8fe390ef4179bffbb1b5426ef9bfe6a408b3b632c64726aebd7f4382dd694f8ab56051578ebc279c0a9dec593b4fed52b8\n\nQuotient = 8000\nRemainder = -f\nA = -531dd44dfa9e79a5aec8fa7c84bd3b753c146770d22d2c14a6d2125f7ab95e9b320e84c31cf3e0d883e1295a220f2a546550800f\nB = -a63ba89bf53cf34b5d91f4f9097a76ea7828cee1a45a58294da424bef572bd36641d098639e7c1b107c252b4441e54a8caa1\n\nQuotient = 10000\nRemainder = 10\nA = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c20010\nB = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c2\n\nQuotient = -20000\nRemainder = 11\nA = 179d7ede3db0c105525286551331d5b9e1f97a7883f0c13cf250afe9765bb5aaa527af7945c19cdd4596565cbc8532a3cfa5c0011\nB = -bcebf6f1ed86082a929432a8998eadcf0fcbd3c41f8609e792857f4bb2ddad55293d7bca2e0ce6ea2cb2b2e5e429951e7d2e\n\nQuotient = -40000\nRemainder = -12\nA = -293dc443c294c6a6c53dd49e84f58305d59a432afb6c7ea2039cd02a513231239571ae07f29b5427e869b9faa485511ca45980012\nB = a4f7110f0a531a9b14f7527a13d60c1756690cabedb1fa880e7340a944c8c48e55c6b81fca6d509fa1a6e7ea921544729166\n\nQuotient = 80000\nRemainder",
+    " = -13\nA = -5b637eb8aa51ef15a18d9b144031c9756527fc0fb96c84b6df03700e5079ae1b3e96940a2c1e07f3b47ad8a9b2b8ca99171a00013\nB = -b6c6fd7154a3de2b431b3628806392eaca4ff81f72d9096dbe06e01ca0f35c367d2d2814583c0fe768f5b153657195322e34\n\nQuotient = 100000\nRemainder = 14\nA = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c19400014\nB = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c194\n\nQuotient = -200000\nRemainder = 15\nA = 11c2a4509f419aa977c3d37fa446fcf21b4b3b9f983fbaddeba4f51c285ac4032200711a54cc6edf24297b1f3d46ad020131a00015\nB = -8e152284fa0cd54bbe1e9bfd2237e790da59dcfcc1fdd6ef5d27a8e142d62019100388d2a66376f9214bd8f9ea356810098d\n\nQuotient = -400000\nRemainder = -16\nA = -39e37ae0edd92b957e84682358039f5e432c42492a44f3de01cdf74d643760260f2837946608663e12291e9b0695449c1153800016\nB = e78deb83b764ae55fa11a08d600e7d790cb10924a913cf780737dd3590dd80983ca0de51982198f848a47a6c1a551270454e\n\nQuotient = 800000\nRemainder = -17\nA = -72f725edd5a3dd6f20b5e9ca7da08a99f8ec9214c80588182c0d42e03bcff34b488b28c03cdf41813a6193c10672a8ee68f6000017\nB = -e5ee4bdbab47bade416bd394fb411533f1d92429900b1030581a85c0779fe6969116518079be830274c327820ce551dcd1ec\n\nQuotient = 1000000\nRemainder = 18\nA = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018\nB = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd\n\nQuotient = -2000000\nRemainder = 19\nA = 190790727c1514b4ef83a1c6aa07493c0af7087fbc8a675bfd9a1e97b8ef80ef684219d6c6f1a5fb5b919f105fd7717cdd5aa000019\nB = -c83c8393e0a8a5a77c1d0e35503a49e057b843fde4533adfecd0f4bdc77c077b4210ceb6378d2fdadc8cf882febb8be6ead5\n\nQuotient = -4000000\nRemainder = -1a\nA = -22d115ab02f8663d8c009960086a0275d301d358cd3b250bb9e7c16cc6ebed4a8fbe43bbced856d93be64a17377d95f5f9c8800001a\nB = 8b4456ac0be198f63002658021a809d74c074d6334ec942ee79f05b31bafb52a3ef90eef3b615b64ef99285cddf657d7e722\n\nQuotient = 8000000\nRemainder = -1b\nA = -41f2e708ba47494a13607223b08e6d99c0b4247436632961d873804e83446dc97139ffaef3e25969950bd4b5bb4ff73b1a25000001b\nB = -83e5ce11748e929426c0e447611cdb33816848e86cc652c3b0e7009d0688db92e273ff5de7c4b2d32a17a96b769fee76344a\n\nQuotient = 10000000\nRemainder = 1c\nA = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336000001c\nB = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336\n\nQuotient = -20000000\nRemainder = 1d\nA = 10888959278661bc36089519a215bda60f9ce24ff7c0ac1f543b6e652f94dbff1f32aa40cad2b4b4d676f16948551501c29f2000001d\nB = -84444ac93c330de1b044a8cd10aded307ce7127fbe0560faa1db73297ca6dff8f99552065695a5a6b3b78b4a42a8a80e14f9\n\nQuotient = -40000000\nRemainder = -1e\nA = -3ada453530a180fda58533ab8c62beb4f693a134f512e4d23e487dac3b575e5390c0a90992400e402bb47aac93d46ded55f54000001e\nB = eb6914d4c28603f69614ceae318afad3da4e84d3d44b9348f921f6b0ed5d794e4302a42649003900aed1eab24f51b7b557d5\n\nQuotient = 80000000\nRemainder = -1f\nA = -57879eb5d92d565daac3ac5173639bfe44b6ecc69ff770af57bd79c9b93841c5677042cb362b794f3d8b24b0d3b73ed1cba58000001f\nB = -af0f3d6bb25aacbb558758a2e6c737fc896dd98d3feee15eaf7af3937270838acee085966c56f29e7b164961a76e7da3974b\n\nQuotient = 100000000\nRemainder = 20\nA = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020\nB = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d\n\nQuotient = -200000000\nRemainder = 21\nA = 1c267719338a4562e934bc57fabe6da86ca534a34244bd38c15032f01f47c2fd498c83f644b345c5c661ada0e586a096bb63000000021\nB = -e133b8c99c522b1749a5e2bfd5f36d436529a51a1225e9c60a819780fa3e17ea4c641fb2259a2e2e330d6d072c3504b5db18\n\nQuotient = -400000000\nRemainder = -22\nA = -250249f2185d4b428fa9534f03ef3cbed535bd31c56c0b273e6c3d35e0266f7777a6e59a99da5738b8e3af8ac60061d6716ac00000022\nB = 940927c861752d0a3ea54d3c0fbcf2fb54d6f4c715b02c9cf9b0f4d78099bdddde9b966a67695ce2e38ebe2b18018759c5ab\n\nQuotient = 800000000\nRemainder = -23\nA = -710b30c23c3c4e646ba90da33d2ce35af2ff181c40b02e3ffa607966730c6b6e274dd4c3c78e578e0b10f431f2d832274bf6800000023\nB = -e216618478789cc8d7521b467a59c6b5e5fe303881605c7ff4c0f2cce618d6dc4e9ba9878f1caf1c1621e863e5b0644e97ed\n\nQuotient = 1000000000\nRemainder = 24\nA = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024\nB = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719\n\nQuotient = -2000000000\nRemainder = 25\nA = 1ed1b7d9e4cf3d44ee98ef69850e61a39f54cc407c6795c07c887374441fd9ec258c21193f8a8c55802fb8f8c579cf94cb0ce000000025\nB = -f68dbecf2679ea2774c77b4c28730d1cfaa66203e33cae03e4439ba220fecf612c6108c9fc5462ac017dc7c62bce7ca65867\n\nQuotient = -4000000000\nRemainder = -26\nA = -35d324ba37d2000f960ca1c9e1ab96e341a2ae6a5ea5cef014c73a39dde000d8ad9606b817ad67e4e4593cc5894d354854898000000026\nB = d74c92e8df48003e5832872786ae5b8d068ab9a97a973bc0531ce8e777800362b6581ae05eb59f939164f3162534d5215226\n\nQuotient = 8000000000\nRemainder = -27\nA = -7039477c3e0a6f415e25e9f9b1dab1edcd8a23f984e7e3bc149c206a3b756b1be001450af4049cd4535e4243d7032afcf6790000000027\nB = -e0728ef87c14de82bc4bd3f363b563db9b1447f309cfc778293840d476ead637c0028a15e80939a8a6bc8487ae0655f9ecf2\n\nQuotient = 10000000000\nRemainder = 28\nA = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba340000000028\nB = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba34\n\nQuotient = -20000000000\nRemainder = 29\nA = 14d27a16a9cf2fdbc85b88a604dd8f0e57b5b34a27089d75d805e05fbb367dfa61c085aa98b896e3e53b85ef774a3fa52417a0000000029\nB = -a693d0b54e797ede42dc453026ec7872bdad9a513844ebaec02f02fdd9b3efd30e042d54c5c4b71f29dc2f7bba51fd2920bd\n\nQuotient = -40000000000\nRemainder = -2a\nA = -3bd0119619fbb5b260c44050d61e6b1925a49713d754ceb06bafb1d730a93f199df654b153c40e75096ebbaf5a6ce3c801820000000002a\nB = ef40465867eed6c9831101435879ac6496925c4f5d533ac1aebec75cc2a4fc6677d952c54f1039d425baeebd69b38f200608\n\nQuotient = 80000000000\nRemainder = -2b\nA = -61a283fe41d965ee770704bb453f689cb82a81089422d6d904a91776a06d32857220286e6ef6327807b724062dda143b46890000000002b\nB = -c34507fc83b2cbdcee0e09768a7ed139705502112845adb209522eed40da650ae44050dcddec64f00f6e480c5bb428768d12\n\nQuotient = 100000000000\nRemainder = 2c\nA = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c\nB = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1\n\nQuotient = -200000000000\nRemainder = 2d\nA = 1eb7cfb197d19f56ad994eca52d1af6466fd09da07d68d63067602046b2d42d3063ef5eda6b58afd69fd92b0b727a0ecde1420000000002d\nB = -f5be7d8cbe8cfab56cca7652968d7b2337e84ed03eb46b1833b01023596a169831f7af6d35ac57eb4fec9585b93d0766f0a1\n\nQuotient = -400000000000\nRemainder = -2e\nA = -3ab858b3329e5bd0469118be52a867b2febbe2894d962cedeb3a5be1738db1cea106cd0710c9f6937348c2c63b109ae623d500000000002e\nB = eae162ccca796f411a4462f94aa19ecbfaef8a253658b3b7ace96f85ce36c73a841b341c4327da4dcd230b18ec426b988f54\n\nQuotient = 800000000000\nRemainder = -2f\nA = -6137bae6cf7573afcbb6fd5c066ba37648cba8db0ecafe9dbc66959b19deabf42f3083719a2268b7602bafa2140a1ee8ce7d80000000002f\nB = -c26f75cd9eeae75f976dfab80cd746ec919751b61d95fd3b78cd2b3633bd57e85e6106e33444d16ec0575f4428143dd19cfb\n\nQuotient = 1000000000000\nRemainder = 30\nA = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030\nB = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7\n\nQuotient = -2000000000000\nRemainder = 31\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -940693131e2ba7b2af531803794983337dd526f0d84d08d58723edf002a388d55c8502d88c2a2a6e78233a2a1b1c8d339a13\n\nQuotient = -611b743a0e2acb1043bb33de50a59eaa0405b37bf6b622075dd69291fe5b53305dbfcc377d1f3082319c153d0c1ffb3b3346\nRemainder = -16e346b6a4297\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185",
+    "454dcf046745436391a673426000000000031\nB = 30c77f3380ccf\n\nQuotient = b9e34073d5e6e5b9e5d2d7250150f8ad86870faeb88d5aed5029fb25c176de216e2388e0f5d33f7c3b56102873eb40b06f2\nRemainder = -16ebc86eb88339\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -197b6f6ad5b75c\n\nQuotient = 141bc8752e846cd63743e6fce4a22efc3eb5f0ce46ba81b8f578c94c516288ec3610fc9923f45d4af2b94c0b0a20b48ed0a\nRemainder = 9bab19f12d81c3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = eb90162ecae18b\n\nQuotient = -381bd85c951e1dd775b0d7fab344aadf06b1b592c643b5852fa44aa55159eedf3b3e47fe0d9f399ad92da85ab2bfd18240\nRemainder = 1e4f817a2f52b71\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -546c109fa8a9d7b\n\nQuotient = -5e385a83b56830626cf8306acc232f955178080e86384bbcf92eec3a8961360223c4cfc1d8d118022972e61866cbfc46b\nRemainder = -292e149300fdd1ad\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3246242094394c8c\n\nQuotient = 9af0246f4b49316df43f61ae3795a764fe9b1d071ce227982ebda7988a7a7a98129c94a76635c6913cb15e4f75ea1608\nRemainder = -dd3b3e32ddc79cb9\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1e928618913898b2f\n\nQuotient = 1fe40099811c648aa4e84e4fbb8cbc19706774a11391fc03a9667d8dc72dd0b26c4a46d0bae56ba90fe4bfac1517d241\nRemainder = 16e021603d30dde2\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 948887c1634f4b08f\n\nQuotient = -3f4fa4c179dab02ad461bbea8f890292c934496db560f72878323a4463d77ae261363f4dc8f53eab145fcc3815d3253\nRemainder = 407ccb4f0b814dc5c5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4ad17434071e1ce664\n\nQuotient = -4d17d19f7f6861189a520776339a1e425876808111c303e391118714370111151ef4ad2e6e84250f59b0fe09ab3293\nRemainder = -36f745b0f421d16db7\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3d71635bcc25183cdde\n\nQuotient = b976d544af44e711351c6618106d3a002c42ebbe22fe939a2457d24e8dcc35c95dde5c7c77af6b4545344a198be82\nRemainder = -107334ab98e5099fec5f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -198a54e35fa0cfa328a9\n\nQuotient = 1307bb8e89aaff7466bc238d32672fbbde7be19d15423bcfa14f9a23fe85af9739b72807fd4bc420ad0b0fac37a42\nRemainder = 170ebe9b83d4c43b79ab\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = f8e923a8bbc0242eafe3\n\nQuotient = -3925a167c1c4d2fae265f277302b989466e309a7211e0b7173031cbbb91ab7fac8dfe43c9d832764e222e9d8581d\nRemainder = 4d404e93edb435dbd60af\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -52e36cee22274556059ea\n\nQuotient = -4d5a6ef346a872142b999ff9a5429198b3c2a97e968f55aa2c01583efe30e9687c57e2bca2372db4d3d443052b6\nRemainder = -3a2ea5f9d204dc31f21833\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3d3c79a115d9071b573d2d\n\nQuotient = a49dee54430f1737a04543d5f549efafab25f0f28f5e304f1bbca191f99521c2c4be1b9927bde19e1ec2060bb2\nRemainder = -17d02758f8fcadca911a95f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1cc65a75211f2826c9d0811\n\nQuotient = 1808ab7c0ccac2ff8f7cb61248bf4624fb60352a356fdd1408904f8c6fb0cc52b7642ec59183bcaf5dd89ca0ac\nRemainder = 5c95323f3b8861261dc31ed\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = c516e6e3fa6e3dc52cf5933\n\nQuotient = -437e04d7076794850aada0cb4ca7a1055df103e74e00766be6a2fdb2631bf294cdbf2695d0a2f8f9eb5587aa5\nRemainder = 1fc63797594c56160536faa9\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -462ee529b488d1db2b6c60e8\n\nQuotient = -5dde5497accc4575a412e7232ce75bdf7905936e09e382d5c9f133faf82a05ad9dcc94ad858aed34cc14c714\nRemainder = -15e79293d5e055f906381a899\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 32765b0a34c88864d39bedaae\n\nQuotient = 11ac52a9287472e1d3b8577b3d50c95076e190714796761322b3ce869d96b44387e190e824849ee345d0a22b\nRemainder = -a158ccc7c055d64e7df3fbcf0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -10c061a37f6cbd11bf0c327643\n\nQuotient = 1ff5cda1551867577c5ca72c86516a82fb8fc5f59ce967b73c6bcc1b85168389872c9a747ddf044d6dba174\nRemainder = 21e766a0020ba429b330a325d5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 9435cd2dc2a92c950bb9e69b83\n\nQuotient = -2719c892fa3f4dbc9951b2095056a16159adaf32dff902e20a800a0cc2e858ccae408f2161aae25d3e1f6d\nRemainder = cafbe9caa1f83fd0dd3d5a6881\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7924e4dcf8f96da61f54bf83870\n\nQuotient = -5080dc99dba295f4a2d9a474c2ddfa3b232a82fe629fe62177514988983eff8195b37d3fee3afa343b497\nRemainder = -94ae72f78982ac1ff83f300cfe8\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3ad70d4b6b9b5f5b2eb65da67e1f\n\nQuotient = e475eebcfc53d49ffad2e0c2a4ba48fe7ce02c42ff107e01ab3fe5b26eee45c83c4f58c181d77c259155\nRemainder = -c83ac7582a02b47ee734e0f24dc5\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -14bbcff5423a260b21895327b18bc\n\nQuotient = 201308a421b85291d23465d648ad2a8d6f3393efc16fb675a42ea7bbca635ddd8c2449b1b34e5db30a03\nRemainder = 8e07efb8ae4c9df39533042362081\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 93aebb72a81ba68e8881fd1a56a90\n\nQuotient = -2584cc534f88f091fe471c652ac66a695906a7cde1fc1cde9be3ee09026b690c1a899378ff31f6acb90\nRemainder = 794801d9d5770a60e312b99d6b9f91\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7e408caf387a0ce9bbf4309c80755a\n\nQuotient = -63f7bfc0fe5a5421bc0a19fa6c87713a72eeb2a33e5eadee8c2f32c20d14f403ab8bdc424b9e8e0c68\nRemainder = -24227c242afedee2473c1a66a5cc29\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2f622c665af7f8126eabfd90df8e9c5\n\nQuotient = e557e6d2180aeeee5d2cef453fbdf38e84cc148f4608ade8836045498be2d318520ffadcea6319432\nRemainder = -dd290149e0e159f9ba6bb9f5a4b003d\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -14a7623d1d9dfc177e913d3119d0d30a\n\nQuotient = 1651d852316d472b41ba0460566e43fabb9257861859ad0fb6ea5a6433a4164299e078f4d50c58afb\nRemainder = fb60aff5fdd2a2b794b0d973ac4d92a\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d439da27b5e70342aa5cb365ece15665\n\nQuotient = -3ae357761a8ff43d3b1bc53eb336260342a39d22f8fac44eeeac96c2f6de32580dd6a688faa9c515\nRemainder = 4fa6f7ee4faf2f6be99c5ce4b65cd642f\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -50700f9c0da59482165a47a3eda2bf07a\n\nQuotient = -543b4390e4e254226683aa0b83b2ca176ec27a373969fb88f766ac72adc9125ff83b2652e46afd3\nRemainder = -12ff398d9a7d9e97a7f63a0bb293c8fb0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 383c5a4f1767e83fc382ad4f1c7c2b7ddb\n\nQuotient = ecb72c14c59d49287fb6b2cacdf04619ee617d5f3f0f1b2890fd4e79746a4fbd848613cf5eb43",
+    "7\nRemainder = -1035512a2717a89062d48f1bfd213333ed0\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1402b751a1e5f3fc46e22b43240d6ce9b27\n\nQuotient = 1e800ddc5d5126f322298383f32fd593623eb88a91b2d68c5d9f56e20c16ffe2cefabe873570ab\nRemainder = 72935d534bed5ba557b91ea023601f50b1d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 9b4df766c608ff3efe5ea1f65cc850fa73c\n\nQuotient = -2c2dc2378abceb983904cdf6728f361d279b4c821710ae785724a7251c43fe4f705f023afa7e2\nRemainder = 249f6433af4e8e224eb570fd438197af62f3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -6b382f812816c77d65c94c0c660b31a69b8f\n\nQuotient = -5f3ced1e42fbd3c6b2c6f1e16953e0c1bb6efb4e49566f974a968f69a1a66a3d7558f5a802a8\nRemainder = -317a7fb1af65982fe4641fbb1e5837e6ea3e1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 31bc97372d17038fd842b72eaba2abb26df62\n\nQuotient = af3fef8111c449b9e0858e7e53e1d00b764232f7a077d75043249c387ece30af351c8a40335\nRemainder = -a1493bcbf57a8480461d62796aa8f8541ece4\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1b076b2f7b78b4a0f0e24ba3a05d6c697efab9\n\nQuotient = 196734cefb08f09cb32ffefc07da8d9545d3451d5a08736757184bad94c73be71311cf1e01c\nRemainder = 273e33521f4d74840a96b3fffe169f79d32855\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = ba7746f4400f812919a3dc86b00642e1487691\n\nQuotient = -3c5989cf33145057a9c8e904435d12939db519cc6b9ca1c0a11934399cb139a73613950f2f\nRemainder = 456ebf56c636d54e37709b9e799e83b7a08cb93\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4e7d4f389423f42e980eda55b4a6a45f6f4bdc2\n\nQuotient = -8432cf3338bce1d12586f83025aea50cff3864af3eb2103a36bbb0aba10b0ba4831641633\nRemainder = -4f62c678137df301c4bef216e6aa910104e76ff\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 23d4c57b5a8162aae8d937be12efbcfd7b96ec06\n\nQuotient = 9f94c4399eef16dfc65a1e015e0786c86470299865932c4d564b71c9b1551a9c0308af38\nRemainder = -168b74a6073b4a5b54fa14aacb5c3bb7897ed0fe1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1daecf01ec633610373b79e04c22cd7499012bc66\n\nQuotient = 1d5b838dce6c0324f157ad125adefde6e1045dce9ff97cf8d1d39b79bce02128e3433ffe\nRemainder = 3aa816216d55fc3c910a030fd10fbda1e12f2ac2d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = a1598a12a84e9cba42ea0e200e88d4599c9f615fe\n\nQuotient = -3edb182b53890ca8762f3039d2d71a8a27c36cc884d0879e0635e6326af0182bc47cad7\nRemainder = 4610b2b1305220bc0de584dd3f87d90109012a8077\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4b5c2f1ba3a82047c9de61d47cbf1bec86b6ef90d6\n\nQuotient = -7571ed4c509630886483f6ca0923859e644063acb38cfb338bf3a681fe449501262516\nRemainder = -21c579846594fc3e5efc53ab01576a7b32d69faf41f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 28550e1f7c6492f4cb682c37b105f92b049c13fc03b\n\nQuotient = 9ed8fb31327a110ef4377258681c5287de8ef9dbe62aa4fe84a7f2a94bb69607cbdb2\nRemainder = -1b7bb759dd0ebc346cbe216e56be8063f063490c17c5\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1dd1e61caed1efc07d21ce05d889de1ad65808cae026\n\nQuotient = 1aa716227d1ca6af68286062b2d6dafd7ade16abbd5d6fa4ada0365832fe18f73bf35\nRemainder = 32e714b0c4ecefb38735cb88cd5e07c21c81be858cae\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b1b959a7b3262d7f4dff488315903aeaffd982b726d7\n\nQuotient = -2a9979a530046939e0b43a25edfbea6775784eb5cf346a9fc3a2d22e1aad473cdada\nRemainder = 4edeb91a2472e80068b1883cf2cc45d68ff9bbed1756b\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -6f31bbe097587a68fdf01d0bf93830bd03a23920ccc0f\n\nQuotient = -566ff76814e1c7d31ad53bfb9f3c0607ef1f7d1cf9bdee6e1cfb78b3ad7018f8bbd\nRemainder = -1eac095d6d84021c33aa9b219d191bd0637f20b5920eed\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 36ccf5bdece624b4f54c729a8cde13325d8dd764f44894\n\nQuotient = aee4f377611179d8b6315811dd94639aaaee63e99bddcfa8eee297ce1dc04daf8e\nRemainder = -59cb3ba7efa1637c46b21795872e8deaff90f13402cfaf\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1b157ad838684b45065aa77ca3238a4d8c5427f719cdfb7\n\nQuotient = 1c72d32cb83cf4a9043d3bb5002f61b03e29c34e44a9fc5cc4d613726f5e618546\nRemainder = 7312d11fb5828c7f1a0060a5152a7644fc1e6a59de28d03\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = a681444c4d47d829f7b629b561ffaa0c3be1232346c907d\n\nQuotient = -2702afc4095a0396215e3ca36e2a59725f743b30de0dd8d4ec4d943fef6c37162\nRemainder = 223dd3080ede3a64744b14df8742cedd71388b0df99073bd\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -796c9ea38ccf516a2054a1e584c18b64b996c9679960585a\n\nQuotient = -805585c6a7badc933bced6f8373ffdfe9796e963d3fc90e85b1a22c38f842062\nRemainder = -a6ebff3f651644915d5c466cc2915d104f0f85a44e08fd6f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 24e8fb7a6a3057ddcafff92916c46f7e4038b98c3104ae831\n\nQuotient = 10383ff8feeb180d4fde925b534be97ec3d5f1f1dab5d8cd9ab5d8ea646cfcdf\nRemainder = -a7efdd0401c74a69cf74442fe3da907acf92e8edc51668828\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1240a71ed8d81e86fd9b16e1d64f438b35d6f8eff672494017\n\nQuotient = 195d95a520fd22317492117dc756ff97806c48c1aac67a41ae56fe503a60cec\nRemainder = 8b8692bee56f8a1ada9ffd8b3583eae33a0df9b73a7d8585f1\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = babe02063b61cb90634ac0493174073d2419e00728d46ad2b0\n\nQuotient = -37791adae674b866e4791c107a697363847dee4a58a37806391426ea48b8c9\nRemainder = 33986fc6a5f5c4f4e31458fc7de55e08a4e9320509d90299b93\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -5563bb852e7338c65aa21c516eecf47f498e5788c608ed46cae\n\nQuotient = -68a30494eceff55e4f54a556dd9b30025ccfa22c0952fd746adfd13d31d00\nRemainder = -1b511d0ab81d528d00a1058850bef48df2e9ae9357e779bb9231\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2d44e919fd27bb3fd2093062d11830c30fa77febafe0a2082cc6\n\nQuotient = bd30999592dbeabb8871b76aa04cc1c6c3794a83f0178c2ad505d8189485\nRemainder = -b0dbce286df5faccf0bdb40ca60f508d436f9410c5e49c3f1360\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1909930e2d16fc877c15895a3ec8b2125858bfa1c5a1b8776bedd\n\nQuotient = 2171694ef4a9d57b83b09357a511d4e11cecbab5e9387928b480d686a0e9\nRemainder = 29abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 8da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b\n\nQuotient = -267d470f32911150d9944e684c14e1834734b15475bee968748dd5f6502\nRemainder = 53a2ffef61709bd7143c4c876e021f20a99ba481f2b11abcd45da3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7b117ddccee97816",
+    "c2ca2f1a612cc0d94ac67f5a79ed41744c8fc7\n\nQuotient = -5a21a3bdd3a3d4f1361a978706ba1cec409c296a5b3c369e91fc8317bb\nRemainder = -2cdc818f1e445fb3772d2a56833aefb2f5565a5fca80662e6fc1845\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 348dfba3c793f0018d7d3a70c4060c3148b4a3163ba60af9d6f8b04\n\nQuotient = b301b4050fdf4ede8f9c746b26d968110e1eb119ca42cd9c9bd8d4fab\nRemainder = -17993daf81711fe59204ec82e363d2b91971129af9206ff9506d3cb1\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1a76328184b9bea8770c91cfccf8ab98e75b2224d666af58022aca80\n\nQuotient = 19c401336dd43c221a61264f8b91791d250e6c99c61850efe6d1e3532\nRemainder = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d\n\nQuotient = -38a77853de88a8db14612884b515e3cd7c673175779d4ab71ba58f83\nRemainder = 51851549cfa00dbfae388cc3b46fd4824268e00e12fba288acceab339\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -539c0171f48e4160e5c308ee9e74f35d8b6d032e946dbcf748b1335a8\n\nQuotient = -79a7eab82e5b65f4f6734e8803fa7c30852ea3ae56e801c5dd11778\nRemainder = -f89592eedcbcc68d5df80663b3cdc638d9d779707d4ae5a552d97d009\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 26efac15401a945ffd37066bc5af23191292765164a0f1e4fd537fd64b\n\nQuotient = d33afb58753a21581c5b2351a74f3d220599ed56ebeacf1d43eeb2\nRemainder = -f699437f44af44b3ddc080f5b74f753d35f70baf3866040ba3c64b30f\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -166cc6a3c60facfa0d8d318f26c6514c7eb9113f6b625c1de804ad379f9\n\nQuotient = 19e55bdaaa5a375c36e6869700f8677db563e5cf985be2a8d1b012\nRemainder = 7bccc3a653f29f3f45b52b8de2449c868c64d976666c01bff2dca03a8d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = b6eae7a82b5dd1554795573cbf558d7cfed813eec270c326bf290adccc2\n\nQuotient = -297530094c3e4270ab5cf67e60fa5af6a32eb41b18b050fa6d46d\nRemainder = 62d8b502e172da7bce53fbb7c1ae376b6c21b3a3a47523aa0023406e353d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7241ae5f1aaee9340d437ad2dab94b70dd29fc6fff7fe31b100aa5001644\n\nQuotient = -640f3c38230962c6d6fca459afe0e46137525e8d62dd9b84da73\nRemainder = -16fcadd5155910764ecf0b4bd0afc3707e2ce49cedcbd5414f1c7d860e95c\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2f570d2da7a4e62097eb494ca43f7bde33e36525308dc864ffbaeb5d48f97\n\nQuotient = b3895ebba13c8f383ac0482be02e1f5518511420cb4513426bb\nRemainder = -21bc847fdfd48c7a4c36c778681ea20481081cbb7af6b281c8b8ebf2b2c3b\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1a6233954b3480af5f911a6bb8ad33967d5e0446c3e56f521e892c986b6b82\n\nQuotient = 243f3fbefbf842c79c5e96162fc42fe4f177a59d27681c54b3a\nRemainder = bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff\n\nQuotient = -30f7cef2948c9ebed8fa3c5ea9a9bfa96ee4e9729c9b18e9d3\nRemainder = 1feb3fd887629cca60c664e385dddf538d9bf7fff2d34ca9e0e7614946d807f\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -60bba60d69093c0134fcb90aefdb9c190e7bf037ecc13dab3cc7915d7893046\n\nQuotient = -6b6f0183c1f598a68683ba7435c05d700d74681fe472669a1\nRemainder = -1f4d58f81a8c18523918d31791a00ea9aafbbb87792d90a5392273ec4e405da2\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2c17372a5128d7c403a3b94838072ecf9aff88d164764b12bfbf6261df957e2f\n\nQuotient = c4347fe42b2a7d9d5a650b72724369c5c1f59262a7be3fc2\nRemainder = -1103ec9c4a15373949cae4e34b7b42e242da41edbf5ad8362ce5e5426d3154a1b\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1824671758069b7660bad819f06c86fc76a9344ea38412058380363e5c5b4086b\n\nQuotient = 15e8c8d6847dfe974cefeef5fee93da9e58b74d640c6c413\nRemainder = 61dac240f2b39832903d5ecad9cfda5162bf8ebb0610545f259b75c3dc6ab8771\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d83386fb9682576cc70cf84520c53169e391b414f5421cddca6e257bd77753c40\n\nQuotient = -3572711bf994e6ad48535cc4d65ac323ef1ccff530b4337\nRemainder = b5899d4cb879e37022c539962959339d055900cca16153da09b54c658753cf50e\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -58a05faf5c61f85ac5a090b6bb045c851ea17332d9bfad4309ce2b7a79ad3cc575\n\nQuotient = -6931ebfc6e34305e5d7cba5284829d088d1ec0abdde508\nRemainder = -1b09eafde481064bab3a5c7fd895edceca40b1e62a9cf953eae1061dfbe00936391\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2d0769f392ca9ec629ef1bfbdf08cd8cc9219330ffe3c05343df792dd94b1147714\n\nQuotient = 9a4800f0cb2bfbe8d234410deb510103b7da30cbac7d9\nRemainder = -971e4a529e439a1b96b942001631027ff2fbe40b8939e224adb7f2ed30faff64d1c\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1eb3d7971125a036c3a67d9f5ce580a4ef4c469a492be53a55bafd2eafd4032b5b9d\n\nQuotient = 23116704b7a1a86cfa2ee5707ee46268634db5d50dc0f\nRemainder = 467c6b64c8121e4f250492191ea36a27119a0a6d19af519bf7ccdc2436c885c99d85\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 87134e98f73470e23a96c6a9139af3d4d21574de8aa9ea1d720df8940bcbda343694\n\nQuotient = -3b7f72ecf4f55c02366c52f38a827f5773b7cdebb9ba\nRemainder = 194b334b2046a66be3ddd7c6df01c88967fcb11e97b8206d000bcf6043c6e9ccb13f5\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -4f9d0341cadfb1f0bc38184d93503faa196fb8170f8ba2b5d3b512c09d39b7f79a5b6\n\nQuotient = -6db1d69019dd4cb26fd65d5b88a31bb6413b30278a1\nRemainder = -2042a060391e181882dc0c8d91c3b03c1ea35e2eff01babb3ae876ba1e57a505d44856\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2b2e8f445c0c3aaef0285945e4ca37a700310e003086f34d02c891b94b117f3d3032fb\n\nQuotient = c0e5b9a5853bb21b5e2e37f469764579d5cb2bf984\nRemainder = -154669d4bce7914cdc8d79f2b8d1faa43e8cc3b20fb0767e1c9a47c9e1daed4b665cfdd\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -188e619dbb719381e701363de874fe168529c10f30d3ff184e4356991fdec1649f72235\n\nQuotient = 180054f8c36833d44cab9dd61e6d89d28605c564af\nRemainder = 59192ec5c6fbd9773b8b7dd7d8ab1800dfecc8eb01c29997d15ad75b79575d9e26e1fc9\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = c55b5eb165c63ac2794bfac21980ebacadb93f1e059309fd2b855621572e8d9b3f29018\n\nQuotient = -31412e97045c19ec38951b0e3884c66d1d7479437\nRemainder = 56f1425227bfc6eb1ecda7bfae0e5cb59e92a2cc5306b28465c8739e40893dc5c1e94cbc\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -602b8c25ded1ab3877f58cb048c733649c7dcadf87b2652e35c4e5544d2306107ebff7b3\n\nQuotient = -8da1489ccf7203ecead94c67a5750884122b6e75\nRemainder = -15162026586a1e55dda72785f31c9e6140d166a1fd34c87a7d8c78f8d8f87bbdcf8f75b1e\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 2171ee4a6f7f67d5a33d0a08c367184d70ffe",
+    "39da28562655e75f6b66c866b1c2ac93e467\n\nQuotient = e635f8bdbf80e99723aa5718d3fade4e573be2c\nRemainder = -ffbd73bfe05f95bc2b135f12682288c620215eac3d6d56503d93a90e06f236e597d1df975\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -149375d478a096e724b84faf795c589ef0d772c4623f5be38da99006cd833dc5b28363faed\n\nQuotient = 20f76f5c6d0c8284764a10f6936c22bfba5f851\nRemainder = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f\n\nQuotient = -382586dfe93872abbe3a504fc62a8973913f96\nRemainder = 4d407323ef56093eea2f3993334215950f4e1a85ba18cdcd77d819d92b8b292c3ec8edea425\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -545d81ed25602b158bc79aadf98a8f655fc399fb8652ae94333bf54c8c9ffaf8c6b3f2a9d52\n\nQuotient = -7d179efc493eaceaf46572a1f3a62bdfc4a38\nRemainder = -3de3d817a9cf7d529b5229a503e8ebbbd2c53215ac3c584c010947f780198dee16ffbf47791\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 25dddb00f65d6a1ba8caf7815a8063c5da656d775eae9e0108c68ce11dc925183810888dd04c\n\nQuotient = a9f7e5f235bae0e3e29393ac5c99d510b009\nRemainder = -150478b4a0df3eb20dcd1be8da283a00636c021c5c6337e7732aae9c4b49853b95f6d2475ea7\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1bde6cae7f5ced9006c0b1a61fb50982a433e4e2050aa486298f456556d8e909e96933e2ba3ba\n\nQuotient = 16de125df5936181981b4c2d0051a8b4d211\nRemainder = 29ac7c8a11f9beb9ad649257994216146b663bf4f237c561bf315d95778fcdb1010283475ebf1\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = cf24735a60ff5906410be5c4d98e3c9247919b57e404aeabc7eaefbf07bd64762bc61b96c9040\n\nQuotient = -268a52cd10ab4814268f66d9f44f71a98eb\nRemainder = 20293699f12fbfef2e391963866fc082a7884cd13b1c9bd8d5d203558feed2b889720be936451a\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -7ae7d548212830013b7d653072c33f0dd54a6ebd8792bf75809d29a8c798dbc67c3edd99a69b85\n\nQuotient = -8f051067ccb82b6a3dffedd0ff2ee97c46\nRemainder = -100dac0d3bf5aacc5fade281c071eb2399560a65349566567ce1c0c34e43f175a575ed1eeeb3b07\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 211ebb5dc59a051fdfa3b18ac491971e863f2086cdc099672c1215af4ec877e29950efa4f487be7\n\nQuotient = 9b7ee4c499386f922432fcb1a453ee2ec\nRemainder = -f410122a74386d724cdd45b2e548645ac5ee4a44cbfecb82aad34ae470526674da44ebbf557bb75\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -1e76750814dec1ecbb1af0fa2281ab3185e94e47fc16a77fed312f23f261ad7709ad7c9f85862c1d\n\nQuotient = 23efb26228d7bcf281cd45f54572e2b3a\nRemainder = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413\n\nQuotient = -2cfcae0e922f2d884bfa0a3346dc9812\nRemainder = 14de2725b11a9c6784d9608c52770d29b9fbf824ecd4890bf28f3ec0dc6c52e4df9be540332b8882d\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -694b057ff381badb37c7c15c81e74cbd6774e8d61c9e7d450811c36262ea834fc1287fa59708ee072\n\nQuotient = -4c0238ff3c18d4d58e543f020002802\nRemainder = -2ddef796c50817e82ea6f64a02a8c6b30ab40070ff5401c2d39ca14b9c4d99de33834bfe566a0c2efb\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3e51c9ab14f522b55e8f9d3ba995c0846a864dfa2d568ea211b0cac1463ce6a1da72d0a15746fdcc9b\n\nQuotient = d41f9102a7785ce64f76b7d7b870b0\nRemainder = -106eaafdd518c658bd371164ee43ccd915a01b513fc7d220900039ff840ba36450e16ce9987e08e7141\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -16549c5d57b531528dd4d781f03cf275b66cb94eba038b782b739c3ab30b8631c8706abac06004a942d\n\nQuotient = 1616b432b3277e774aad92b0cf544c\nRemainder = 2c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79\n\nQuotient = -320fd6a7375a42a3961362ae196d1\nRemainder = 5336711bf81237ea3449f4e9f4e6358dc250f8ebd86082cab92a8079f2c8f835bc783082efb0ed7e3f66\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -5e9e8e1d446fdd314d487cac1226088696e33161d923acb67d3c75e87e428bdbc193e02f53200610fcdb\n\nQuotient = -4bd06daed3f30345d269f51e4381\nRemainder = -1f3513bdefa40662f0f50a04b418a833aa2f85522dc6c399298b1b147662ef2164ddbfb7247ba9511b8ec\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = 3e7ab7ffe5f63a6c1e109b95b83af470ff820cdedbb3c90c398ec42e44a45e1ca894870a7fa51f17ad5c5\n\nQuotient = d6fd01a0c5b55fbe36e58bbe77b\nRemainder = -c51af3e8b430870388357cb366ea888bd7b4ccde09ad3a1d2ee1426af060245c6d6b5980ae87fb66c4642\nA = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -16086df3dd5e665f2631a294563c68931faa19ee67d6a2153d262940a648ae71bb3c1745daca5ea977331d\n\nQuotient = 18bd9a8f5678d28cefd955cf99d\nRemainder = e193f2fece67b7abe16373c3f84f18dfedcf654d951bf47585fccfaf67ee04f5037354d057c9f5eaa8eef\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = bf758acacd11f3f3e6665cd740517c9ab2384266f3c7ff9afd0888cdad2f6c9401c24d6c11fc3949aabbaa\n\nQuotient = -371239db55c79521206c9e60c0\nRemainder = 93773085af7582dd298b09d7098835787978d820289ea6850f27d0d77eecce8614785e32b228f46ca4b371\nA = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031\nB = -56033fd85be464301f10177b58d895fbb6df6154da5c2a2a7cfc3a24d83a96f5295fb17a08148a4e51dde91\n\nQuotient = 696d8e378d12221e2d970c53bf63a20ef381db8566701972c22fe067cdba99c57b68706a5c6e52f21bb3de861e49ed2141b3036f07d1fd0ee\nRemainder = 9f0e50ca76031b\nA = b2668f5fbcf4170820ed3fc9b12a61862acf8e3cb17175482efe23c5cfd3556e77634d407b6d1f98a73437a8d6066319a7a860afcab2338a1b1313037e30f4d9\nB = 1b1313037e30f4d9\n\nQuotient = babe271ea266bc7bc16d193097903037819f82366c7e9ff8f2cb14157b40433c6ee327038d5dcc44140b070d823befaefbee5e13419f6f17\nRemainder = 93d7c547a9ba0a4a\nA = 74b1a591f449377836f378e05d2902b29964df59c6926e5a9182cc09ce3111783cb7021a185340b4880d56635de268d6f3855c4d9997373b9ff8df899ee3b3f1\nB = 9ff8df899ee3b3f1\n\nQuotient = 890139fef28aa3b77814e1122b9c7f26e746ee3c507e6082b508fcbe380de83b06a01f735239c6847c30eae44749fc8c5e3bd97eb40ba297\nRemainder = 6c97aace900389d0\nA = 7e89adea82b4cb6feb41297b6dc8d948e72c3d5554a987900e7fae48cfb38fb5282b13d9a1f5793cf7cbf1ef551865041c3ffe0e287714a6ec7123556af55a48\nB = ec7123556af55a48\n\nQuotient = 1fdeead441e2d7a6ce3cce2389b2a22248ddca7970ae3f7e7d8453052fd08534ff7c46f6a4537fb6f28df6c5fc8a7d384336e679b74205315\nRemainder = 2903c7cc2651bfa8\nA = 9ca66de3d83f0a747fe986464522bde5e42aeac20e8ace1ea13fa6bc9514c58517479a4281d4128c6d775489b85dfd114ad184613f308f6c4ea484a22ab0ad1e\nB = 4ea484a22ab0ad1e\n\nQuotient = 12f16c8f9f898a08853982e2ac5a906d784c5ab8d74007ba3ab311e861d7c1ac115efe694cab7583f75a4a59ceff2887dab53b2f1022aa452\nRemainder = 4bdaf1f352e87aa5\nA = 6e6a97b358b591b78db43772378dc084a11836ddc9dd4607f263ce620714e8fdf6bf67387c163b6f2999f84270802b4bd5c0f0377e949fbd5d42fe145e66ffeb\nB = 5d42fe145e66ffeb\n\nQuotient = 14e0c06c8cff1f9f5dd8afb6fa6c340f0953a18ba7d2b26b22d8e7f946ef20fd5ac",
+    "277ceb59cbd4ce3e8213803c3b5b0452ed449e22bf2c29\nRemainder = 55422f1caf4a9a00\nA = bc9c054ff568af73e301e0751bc1ee055e82826cdc53449f2d9f45feda2ba227bedd6df9b74fb58a85917d60b087bef04a156a571716e9bc908ae83784ee35c0\nB = 908ae83784ee35c0\n\nQuotient = a457ea94da3237c0dd15ee30e9c13e7b4ca1dc90fcd67951b873787206babaed837a3eb17e298d74cae92d1059636f9aefe11aef9ffa31053\nRemainder = 124768541b600598\nA = ea6dc82b1906c277526ed867fe8b0fbe32feecfb935dbab860aef59a7d72799fd4e952e70b4c9304c7b2a06af8badcd6cfa12d0b6c9db38d16d2c4a24099ca14\nB = 16d2c4a24099ca14\n\nQuotient = da0a37eece8972a0e2e8817c54e67c4d9f92373340488539d5051984bce0ae3300ef6ca9d0902daa4d485dec3b4db6c8b1ffd2c5d08b18ae\nRemainder = 1ba15c46023500b9\nA = 36ca8763e20e6ebf07a55cdfdd83892bef0bab68ac092093bfdac1a49c1da015541196a24249bb2262e70f7ed53e0fbae61f02ebac4b61f740548136ce50f243\nB = 40548136ce50f243\n\nQuotient = 3d8c433daedfbf681b528f88d610204d33bbe74d0b13978c34a617ae94177e07a757519b5a8f1a93a73d0751c7b5b72b4bdf475a9708fecac\nRemainder = 4cdfd72349c6110\nA = e0dd7e73b2a64dc017da65992176e2535c43b6fc14f2f7b0a7d894d768bbc77507eac0112b2dc3ca83d70989a1b949ccf374be6a012d80a23a74bba39671fcd0\nB = 3a74bba39671fcd0\n\nQuotient = 39d084b444e39c32f2883e9968301151802da15141f65893f37b8b834eb01c074aa1e1a978c5c99732c87ae106bf8db09e1728c8bf2aae88\nRemainder = 2950443357cd7477\nA = 16df31dc290559c3b6a3d192cf15d825cfe79f8dbd5c9848eac7fa90eea5d87f8b430cccf9baab3e8e4dc33467a4234d8551ff25e33af175654686ff1368e96f\nB = 654686ff1368e96f\n\nQuotient = bbead8f70c8e61114f22d36e97861f16037efabe1347613e78c51d7f539065421a66c907faddaed13ad2a0f0b00f8fd594e917799cd937e5\nRemainder = 3013136f5f728b68\nA = ba5e688ab4f8ab5c25592bc4334b6dc2b7a06d491d0f919b716bf1cf109b62a30d9dd59dd4bdf870dd2687894edab303277a5f3e3a537cc8fde3ee3bb61767d6\nB = fde3ee3bb61767d6\n\nQuotient = 42aefe467ff2a5614efef1edce25a1acba9c476b3abbcd680140a3aecf8f51c1ebaab8912de217451bfaca2842c0bae717b8a030b6318c0\nRemainder = 1f130dd2ead0d35e\nA = 17bd50b5322c51ac883852ad2a4446c039dbc210ca3aa0313065fc88cce6819b324e93b036bd0c71be58586cd2b243d01a4a918c10ea0cc5b22f9d795df09de\nB = 5b22f9d795df09de\n\nQuotient = 13de73dcd72a3638fe2a907fd7f6574bbb228698fa60e4ecffb082911c5f09c74bb4f50564d3d4035d07eedea38b634a3e3acc26c8e9aeff8\nRemainder = acb8702f0113e0c4\nA = e0327b2e59236a3f91ccf960490cc69b2afc854de9299ad2edff9618f9fe24251886afc65f5c581a9bc86013f356d599e98b8b10f5236a51b48a6b29025983a4\nB = b48a6b29025983a4\n\nQuotient = 27d11481f00519b786eaee96220afd45bc51700f7366fb5e7da35bbc84891aac3d9d2b709dddae371a6b78439fef810c68eef586e1d68350d\nRemainder = 3d1890c5e1555d74\nA = f3504d5d96c9e27a1527725ced337f1cd0a183531642051e166507432c01e8d44c4e8918701c2a05eb8a9d7e26bf04993f9adeef2826ae4e61c602477f849121\nB = 61c602477f849121\n\nQuotient = 10bdeac209c67b023044186704735c7291423054bcddc24b731ad601b49372f4d5ce6e9d85002f8dddf0411efce943f81a5e42cee2d0c9fe5\nRemainder = a93a0c5bd51004e4\nA = fa29e37b0d0410d19fd180149b14f94ec2edccd347da65f6832850aa06a61b7b78c96faf64dcb347893c93c560b8043466419864a382c6f2ef1412873b2d8cbf\nB = ef1412873b2d8cbf\n\nQuotient = 1c9b6cffe44241292320c0660b89f2f77aaadc8d36e33f5ac3da0f12b3c114a156870a92079f7192d237f8bf49aeee6282531c929cc56d75\nRemainder = 1ce3e5eb13ac7958\nA = 144325a641463ed6bddfcbd73e50620a44c606d71fac38efb1c9d2747b4903f7b51fdedacfb66db022aea09b43c7c2ad7b851035165ebe59b552d4f7eee617b2\nB = b552d4f7eee617b2\n\nQuotient = 1b4ad18dc0e634053beb3cf840b53e35117ea06309ea8ca22e37123fd7e1d391c96c792e5125e322c27daa73301024080d73ba3491484b659\nRemainder = 3286bdce6dc3a828\nA = e3a2b90d3ef446f6bde30d3e726cf3e78212324054b40deb0b18fe00645568fb0a6234b6bded6240977373731bb30d1349e25cefd54b7a9985735e9b78002691\nB = 85735e9b78002691\n\nQuotient = 28f5e8da6733240cc2f18e3cf4d42a50d92816062af33a9e1871fa89bdb39a0d905c49faf51cc1c1378741bea34d25ac2c8e522881a6f6087\nRemainder = 135784870eb40c68\nA = 593206f9367b72f9cc59b3e37d2eb23b2061422859162ee53656899c2471017474f500c6e23efe1f6b1e57852cd4229329dc182ba01a257122d76a26aaf9b844\nB = 22d76a26aaf9b844\n\nQuotient = 1ab276448d16c533b6e90b5b5ca266e13ec27b5a58c80b7657df963ec2d1fe4eb1c1d24873eff6408bcb3d0cf97c31e85240eedf0efcc1e5a\nRemainder = 27b105741264f875\nA = d84fde3d851b52ed3b2a1268e9b765ec6c09c5768bba709b3b799802fadac30a6c3184185e6d57249b1c34619f3c9d2b90bc0c348b22537281a39fcadf738083\nB = 81a39fcadf738083\n\nQuotient = 84a87678485b3e60ee1cae3701ebdf0a29ee44115a492c34a0c8e84090e14070eb2ad0abfe2c339f26b5099327515104fe3d1c5546feea98ed\nRemainder = 95f7434941f9d8\nA = f79a0643bcd9c28cc22cc7b4178b3340e4685dd2672792516d6fc08567d2de2d3e25d43f100a58826edb146ac94acac4213bb09bdf8a258001ddd0ab110b89fe\nB = 1ddd0ab110b89fe\n\nQuotient = 516a2ac26e5b3afa502c7f3c6f15376f7a380e5842c229443343b5b74dc3de84db3ae99a0c57043e32a504ded19943c0310cababb3e92cf8\nRemainder = 327cf78eed336523\nA = 17c0d5814e1020d5d69674bdf6b9df193a16c0c8567a589d014e8eb7f6c9c36560791f7acbbbacee7c456eb51a4cdd7ca88011e9d8d9f2d64ab08ad74f7be5cb\nB = 4ab08ad74f7be5cb\n\nQuotient = f0da0beebcfaa716f494cf3fc81fe65117c90adde3b3942e8e66986fe8050fd5c9ebe1c88c5db04cea4c4c14779555d70cafb53870671f95\nRemainder = 3b2f844440d7be00\nA = ebba8c393c2a22b094d824ed95b4acf6875719fc165f73ee6d359e1134949169fdacbb42d5deb8cea96e11e3aac985635b5bcc6c02a6778cfa8e03d9ce6fc680\nB = fa8e03d9ce6fc680\n\nQuotient = 56527f07593774f0fa642241400985d0bb9b41d3dc9e025ca069130d93afc972d75e3fe0f798e127c3e1b4e925000459a3a5a83b15186e516\nRemainder = b620b7a3b752b78\nA = 5d6cad9e26267abb480b2b9ac5ea323bc4c3c53e0de8ce40c89c85accf0499aea5b11703a04296519047585ff12f8795f98da0546c20016a115100eddabfb468\nB = 115100eddabfb468\n\nQuotient = 294dca3b56ce9529aed2c132a9bd6c0c61de7a58ac50582f396b4fadcf7873b502bb869f801a9ab1f12384631cefee72b3e6050a7f69eba4\nRemainder = 53a0fcf5486c7a6f\nA = 24aa73803f270185d23310df2cf3ef67b18d7800bc41aad2ca13f372a27ef0a9217194f3f512e79f545a903895def195a5eb9a1a1b6b3f4de340e9da9b305d3b\nB = e340e9da9b305d3b\n\nQuotient = 16bf4dab1c29bd284c9b6649de65a4ee58f21d6a8b51627ca133fa817872b1a4a9956662db0aead5898ed0eda08511be7c47449638f2fab95d\nRemainder = e7751deb047d98\nA = 77b04d93272491322ed2fe651044e28cadb2ae7825f02b55aeb0f73b8b8a8b336802416fe08c718ab681581ac04d87116323f61f50bfd2180542fcd4a46dcff6\nB = 542fcd4a46dcff6\n\nQuotient = 388ae1c243bc9111e663c0c80495c36e8767bafe188b532b7ac84b5160d902af1b638aec6e4c66955d16bd8ce94ce6027a7bf95910f705ad0\nRemainder = 7c667ea307017c2\nA = 52f357e9a57722a867d8199242e100f06e8df810ee913d6992bfd9dc03ed78bcf44d692aaa7be806df0c9e0802851d7ae8405f76114e6322177907198f85cb62\nB = 177907198f85cb62\n\nQuotient = 33dc2fcceef7dce92e3a9df58566c6e28d03b58ff6ecbbb31e43936cda6380a56788285d37b5e8f11487afd78c39cb2150cc98d9d78a0c6cb\nRemainder = 429a380c9f8eeeba\nA = d99cf9a0bfc347c9631ae8c69defe1f1509c3ecaeeee5dbc61317bb73fa5cc6e704f64c865cf4d898f8a2f63214dbd511f61aa6e09856222432376698f8d2f67\nB = 432376698f8d2f67\n\nQuotient = 18ecac9e5539a014cffd8310ceb1170577cb23aa9cb3c523d57ad83069d1609ff743cd3c275b67097a038b85afcd7105ad21672f9ecbbc7df\nRemainder = 37924fea665f5c92\nA = f87aa8b6e62b09291e0e9b832ad71d8f85d60501a8d89d2638dccd4022e89bc4932c186a198557282527dfa86dfacc2f90fe0656695b61429f8220509f5106b9\nB = 9f8220509f5106b9\n\nQuotient = 37c0649a53c8cab91a7458702870bf64cb1de9fc1c6b9a3b92444119d368501b62d3a5138af72bdb7752eab8af6bf4e3bdb9e3beb1805b88\nRemainder = de179463e3e91ad\nA = 995c04c1f24c4efe88393bab7a7545e39193662d5db7c8e557d6c554ed4367f5af82c463d0ba6bc3148620481140add5677937989e03fb52c0323980d8841d5\nB = 2c0323980d8841d5\n\nQuotient = a6d193cfe7d8983768ff29908ee6e07fee99927a4bc4ef41d01f63f3b4a2e7029630b7d925d0979458cdaa903771286af672253cd99593b3\nRemainder = 6bf69921db298b3e\nA = 55c856daa8110599cc4fde0a44acbd69a68eb177e0438f7d843ba0fb74caab2a7e0c8a6f176f5555779e65c555e9157a16a1497edf36ccb583a458f0372a57c9\nB = 83a458f0372a57c9\n\nQuotient = 63f379bef9866b59f8bfd6bb0120a75dc03506b0034e7440764afc8ec14d8d735aa6f03a568ea98d0a74ab9bbe9c6e11b288467e5f79a2539\nRemainder = 11c077beb8667d88\nA = ff1fc3ea60fb37ff23e2f2f4e207a86e055cca41eebcc5bd6376904b51fb3d233cb04666fdc92be33239b5ee552870e45717890e35fdbe3728d6ff55d5662419\nB = 28d6ff55d5662419\n\nQuotient = 285ba8cdfbf00b112e496ce65cdba2271c82a273b3d30bed82ef2d360790c5deb97f3311bd5eb9876a61e33b3a37782d00c2d5ffbeec752ca\nRemainder = 1672a8aa119c3a1d\nA = d614352268930d301aa4046cd38e2eda4dcfcc52eac984943f2c863de5c4f8a44473a8ecebf12cb8f4da4722d305e5c9c3e",
+    "ddc0109d416e854df334dbfcfdd4b\nB = 54df334dbfcfdd4b\n\nQuotient = 358178128648fa9ea28dcfe68b4cecc7071e129e3ce4d113f5d1e387f7e5a412e9d2dfe5ff16d9987a544004d213ade9c134cc240eeb6871\nRemainder = 44c3fdb374bc0c30\nA = 18b973dd011969e29a1f4a5b8f118313f715c2e31dfebd9fe0957cf23cf36eded89c38637a8d3512bb23324ff2a3627d5b942300200c823d764b7a6c12d1c91b\nB = 764b7a6c12d1c91b\n\nQuotient = 19ea7212f6604d423b308fe3f2f4986f31aea9d6a117a3e207e38ce5bbd8d7a866285ac60433630de547fc84e364c451457fbf864a82c6613\nRemainder = 2718de2dd0796f08\nA = 83577f755a448d5586e19486b04de7836818223ea920465c4eee979a9ce5696ad8e2fd5253b5d5dcfdf355465e8c0819658ccc5580fd29b351169b54c62b779c\nB = 51169b54c62b779c\n\nQuotient = 13e0c5b9905770b60a6f978d1c983cbc84dccfaed0f4222f534df80c7d3d129f5e8f74f19581332a7f6d383915424c71db4ca19bde2591fcd\nRemainder = abf5f6c8ab6ed4f4\nA = e2bf43c91cdbb244790eb165cc13feafea36f5187cc9bf8aa8cf202042efd5441e3822a1164992da5be750aaac0bb11f09375bdfbd4a39e3b682c7ee6ab5f5f1\nB = b682c7ee6ab5f5f1\n\nQuotient = 3919f31521e87f90df3a4463d0c83fa31e3f569449009d307962d26f07d854e8d3f0badbf55311c206bf34e6227949327a93b1a5ada7a930\nRemainder = 6c3802d44dd4668f\nA = 2546880cc6f97fb379afbc4a2664115ba7909414f35a5bf88be2ed5187bd1a24afaf82eeceb0b438d4999ebf9b7ec752236669425bd3cce6a71d9ad67ff2ff5f\nB = a71d9ad67ff2ff5f\n\nQuotient = 121d5ad4115c2768b962e51d09f426d61624e0f203ac6c923289b4e7964e165b34f3dc1ff938a7cf37478d407de251c64db71d3ee629c1035\nRemainder = 660a35e1c1245910\nA = a36d3250c123697adbbbdf489e6cb40be57febaff654ca951c9fa0b396b1714c55ed6e05e468153ac443dabca29de9b43cc0cc4e62cdf24690593662c86fb5ac\nB = 90593662c86fb5ac\n\nQuotient = ad81debaa02f6e60da58b46e76ce041fc4da64138634ea7b3c165b8fbda027eb64b6b5339e70babbb83430d60383c2cfe22029e617fd03a7\nRemainder = 2e4aeafa2ad76832\nA = 8992cd131757ba5cbe54aa58be115723ea3438ddc782a4d1996980b7b312fa76e4483584df744b10340e5fc9e468690cef538920a732a8f0cafb4e30846cad1d\nB = cafb4e30846cad1d\n\nQuotient = 67a71b9ebaec91121a8cf6bc2932b6be01af7954eca69c5202d771c2c2d13683cdf90ec942a3445771ccfe484f947f078de825ea88b3c05a\nRemainder = 8395953f744cfb31\nA = 4f8ada84096198175174896167405b85cbc03fe0642f6b263a70f9a22f19ad6c9aef38da8ac036d409e6fd925023c95312cebe04eb653e0ec473dc8dfed98967\nB = c473dc8dfed98967\n\nQuotient = 9416326e2347a541b777a0fa1b0c35d8fe76c940d24c6f6806d6ae8ac1e280c16e480786478bda3f780ee92f3f3c361574efc2ed5ca98e26\nRemainder = b8ff45f31bdb58d8\nA = 902f5e48b96b9b1fd16c3b21292ed495987ddac4e1d92b2ab10378f2966c4399d6a41eef622a4991ccd1f647531dcd145de4ac99b3036779f9414ed2f4ba7e08\nB = f9414ed2f4ba7e08\n\nQuotient = 403c651b4e571e8301c4158fc185396554bf61d900708d2af5c2bdf495b3cb539b0b9b5acd0d71654b3aa68024961d5a7bc9e2788e6c822b6\nRemainder = 7856ec047cec8dc\nA = bdd6d846983fbf140173a26d2b709b9f31b4fee1eac9d25fdf0ef3523be0e6afb372acab470cfe1806b36d84017ec99302eb9eb5eb2862222f4916d8b6201d14\nB = 2f4916d8b6201d14\n\nQuotient = 1b6d967173f9777cb6194c8f69289b91da731456fe5a1515a49e4463cd906c84f97381cabdf9f358d97fad5d3cb140e3a3de397e7f9f683157\nRemainder = 83649246ade8bb4\nA = e3da80658acd53ada7c2dc57178e697f2907c5b0c64f4a87a794ca7521105a0568a32874207646df3768ee60964b7d1d2e29ea6bf7fbaa7e084eabd4ea553a72\nB = 84eabd4ea553a72\n\nQuotient = 27b8f1e49e404455cc68217a20766590e749507976a3a6de25a7cf2c32593aaabb04d84deba1ec6bbe048a2959ffd747243c396dc53c9c811\nRemainder = 3daa032278ce53d0\nA = ff3ead7c7b27f607d16f1ef4ffa91b6cc28301b9256cfcb0c22b6818371ce648ae8812dc50a86e4bdc0d0b1e5b0d55c6ba07b240886a6d5766cfb3ed0937a543\nB = 66cfb3ed0937a543\n\nQuotient = bf987f58700508356fb6274f64a9f78d455e4c436fc6fcc980ec0800287ab3789b91c29a8a72b16645ecfeec926b6f8242f3c7dc3adb40cd\nRemainder = c007da44faa80584\nA = 971aa67c9af10f70977f600e10f9278b8e66d2471956da38e5f4b3fedce9a5fc7ff42b800bb4a78314c70bb59394d0880383f5182b6c1960c9e5b47ef8e63be5\nB = c9e5b47ef8e63be5\n\nQuotient = 7332104442474715d7c4cdac15fc1731240f8b4dd0e6ff3284a15a62a8f9a071dedb87f2220efcc5839cb7e6933a8f65d767819db26e134dd\nRemainder = ef65a7789f54174\nA = bcea2ae4b1edfebf905a5820f0481b6c58d76a69df9dbe84764add3f49496a5d7005d645eaee3754e0ed105c13a114e6a0eae5cc4efab6aa1a3d3a0050fa86f5\nB = 1a3d3a0050fa86f5\n\nQuotient = 3f6182804a7ff12fe7ed3c8521b55564559b1a47a78e1fd56597b9470e7e0f6e7e48c58bc8841c9d118718ccd5e0c0bf9a08d8e244ae60da5\nRemainder = 398e30aff5bd284\nA = 2b877181a960c5e29ab1b2672ee22539256a82369e8f6cb5bcfb69e5e4a41f782e89b58fc0ef6ca336469ff929729f8492b44f12199f0e1c0afd12b2c999e787\nB = afd12b2c999e787\n\nQuotient = 1a80a681d2c42edbcbde552323dac3a1c03b43251a99b5549da6cb39ec6947daa0d574f0df68512984fa8e269b0b27a5576b3aaccb76ebc23\nRemainder = 378e44fdc7a5ec4c\nA = d37e62f44de27a1418f348139eac5ab9fcc1ada21ea6d7695273daf638b4d7eee6745f54b99a9678cf742d304736ee356f66d16d874f8cc67fae9be5dfd41a3a\nB = 7fae9be5dfd41a3a\n\nQuotient = ee982a63816d56758c29d284c19b9b984908cf0a9ae3f1f926e162a2cae4f88703aa477c5c14042247635c103494d11593c2c3839baf4d93\nRemainder = 39afe3275c01aae6\nA = 9a0b0476cd33861d2fc3137df292728e1f636f6fcba5105f384533723231a3104e7c77df46f7f34a4bdc63d5c67b418cafcf106b26ad020ea547d34edac1d3a5\nB = a547d34edac1d3a5\n\nQuotient = fb3f4a39a661e5c31228a6b7b4c27e6e52d1954e8ce262b98b61650efffd762cf2a1aec228bec5d5787683cad6b2e6e49a0de91c15c81874\nRemainder = 63e5ed36ff73a42\nA = 4453712f56467328401a69d4d749a0771732734a760a74094e50a62a030cb604e735bfe0bf0641754edff94ac0e0549e8c10941255f0f21f459e52a6cfe4d9ca\nB = 459e52a6cfe4d9ca\n\nQuotient = 7af60a7c0f995178be76c070cf49eee311e6d1e3afaf50c8c93ff200c1b3fe742b23259b4fc0b9ed0947be4fc9a6c212d86de9a0f7dbb5279\nRemainder = 19657d8ce516a138\nA = c9c92a31ad0f3cfb56a294c42a26eaecb77edf33ed40a7e6797927a0c996a7c0a701b484741163df388bb082e3daebf4e1b7a99002632d6f1a41c1d517238557\nB = 1a41c1d517238557\n\nQuotient = c890c55a8e2a3105b9bf9344a57a9b9fab5fa1fd57083d52431b695553bfbe7a44a9b6cd1f83958224f351f8511b14215d1648e88e938573\nRemainder = 1bab5b03c372daee\nA = 88341550e470016c7ab600b9f6cb410071a77f907a58cb6da4ce3e955d1e859534c2c1098fcfd91b9fa66926e51896733c36a824c3a20844add94e27f30ca651\nB = add94e27f30ca651\n\nQuotient = 34c240c42da400317f66f5151630493a2f200ee418d5ca3300cab10dfb429c2acd7280bf066fe19115f86db83d8f5b93cda714533b16abfdc\nRemainder = 18cd326996ccebc1\nA = 7e96d7b90ff09b114dd4393e9bdfb13d8ff517681126c566e18dd6369d87d248734d94bd02a1f19cca90be7642822b636369c51dee441a9d2663ec896e1d6c6d\nB = 2663ec896e1d6c6d\n\nQuotient = 10d18159e75efa8204e325e6be830b4ee8d2c07419e8276edeac6cc286488fc0c888300db3ebb5f935aa82654d3b932540f0093d1880e1d6d\nRemainder = fe9b6b8ba7c30f8\nA = 731aa6e2fb2ad1e1f80d7668c7b0642203af24af382abd207a5ffb588209e8b5caf953e9a96b478f39ec03a397d1433998e3c95e382d93376d80cf0c957788e6\nB = 6d80cf0c957788e6\n\nQuotient = 450d1f4a105ff8d1a3efbb12165ca98c67ae70404472e4862db479e03313b08783ecc42104780c9d57df0ddf19c5b4547ee9ba52ea82dd0c7\nRemainder = 169e15b4d5aa180a\nA = 902bcb1904b80183656dcbd51879e2982e2b46a547c9ae3119ffc12c6a003e4321b519289b7f22fad19d16480182d1d797c3045b2d29dcc12167f9ce5e233d89\nB = 2167f9ce5e233d89\n\nQuotient = a426f71cb3d75365cd076a6c35c10765bbc3f4bd317fb83a70083b0f7dc43a4e0b95508e60dc1dedb780e9b485f4f7a8870960de669b73af2\nRemainder = da381ae5c97a506\nA = bd59dcdefcbaecd9292c4c3685fb87d3a94c0f0ed01e43e63e1f36fb65d6c5eab3b584f3d1f76d31458c9f6b4c69869d96e943c61df102771274c5b4d821469a\nB = 1274c5b4d821469a\n\nQuotient = 26ccd4b7be090af22221729b0ca51a5e66435c2d33f8d88f94405f6c0123ccbbbbc8080cd8448a977946019ccbf5d267ac3f151ebe686720\nRemainder = c41f9e7bf20b376c\nA = 212dbeff03f14b5825f0d7cf8a7501db21b60581a01a26d522ee44e7fe69545cfcaaac64dbc76c7e3027ac39ddc2d80af6f3fca1824c6ff6dae90967d9ab48ec\nB = dae90967d9ab48ec\n\nQuotient = 801df28f4fd987b4e980760f4f2625276a2a7191d453095c82aa98a2253324ad2873abae70cd98c28ef3ce102fdd53469b9f01889f3ba8b0\nRemainder = 8e435da582e59809\nA = 48341b28138dd04807e522e341f74ac46b0449fa45f96d7fc586997c056a21eb3c399752a6a6c023509f042cf9e879f397a34af9aa2ec2e8904674f2ea3ff739\nB = 904674f2ea3ff739\n\nQuotient = d3857b72b70adff9b5dec3cbc63de7c90ccd7aab6595339b2de39bd6b9789045141d224aa4e6bf9a06e017aa3edd00e716a771b3f5b97771\nRemainder = 14135c686d2e9f70\nA = c1cea45dd46409d5e24fb7ed7d849dbb079247af2d312e01083754ed07f65f090e4dd50d23a973488702ef00936c5d78af603ec0fdf03dceea8f939c922b1e7f\nB = ea8f939c922b1e7f\n\nQuotient = abe20c90896e261e7d31bf40e7f3136d36b0b78006d12225a4dbef6aaf2062b609379eefe7e5af5bcec17126286f196f1330da8477096763\nRe",
+    "mainder = 230307c44cd55896\nA = 19a637e4f3051be0f7c4d35513bca4a91ca9b8082fe3c73899b70b6805a7aa0458512495cb6ee1ade55ecd5851be1dba96d65202f06bc7122633a0d905017545\nB = 2633a0d905017545\n\nQuotient = 5ed3765c4a777a903e182f7c9ce39d19c01460f389b904c3ce1d3525edf25ffe7dc0f4d9e24f0bc8b7e01bef19c83e74f17884bd7bfabb2c\nRemainder = 40f5346f8775e20\nA = 546578393e914be30581e24508a33f6560a5805dfb1c675d1ff1d6f5eaa7ee638b9e0265f543413e04e3f1f3b0895dec271c9897a48d9ce9e3d7df32c15b75a0\nB = e3d7df32c15b75a0\n\nQuotient = ed73a67932746985465fb0606fb0e81595514f1647c911c303d4d31eb0306e3b2aece07320f6fea57a7071d73150591ab2a82a7d53968a81\nRemainder = 2e495a881876da00\nA = 8976445bc318921f7e12c8d4e8e50596849a1503b5efb65e939c291de136597c05a1fd16137f0bbbd7197df943cd612118d1e55a50ee097c94331c1cfb1e941c\nB = 94331c1cfb1e941c\n\nQuotient = 5dce24b7a16d847b0c43cf365ea20bee9679fa0e8732813e827cf6ef3c9bdb7fd8846b5689ce8b80a7dc0dd05721cb06d2700aeeb7ff04d6\nRemainder = d8ead1ae3126aded\nA = 59b99e5d028e6771d27004bc19830a5fcb347f7ae04c0ba7c49130bfb198c5b16821e425c979e6d2dddc14889ae58475bb52c6cdefecf2a8f4dd6e462bbc8f47\nB = f4dd6e462bbc8f47\n\nQuotient = 170e10b399a4c5fe354b536fe59d53602102f215d5107493680ab6e181f67d75ffd45bf49ffb23cf9269b856156b5ac6b1c5def4ab1abb18a\nRemainder = 57131776937c5df9\nA = aeb35966e2a616762768b7f63ce3aee5e81561080617bbabd7846b3ca03fafaaef83dd05b8d16cef40db0a56f3b0ef6eca5e236681cb57c8793dc0907d9aa30f\nB = 793dc0907d9aa30f\n\nQuotient = 1acdb88f047f9bf679c50ed67ba01dd24dca92103f8ea2677215b6142083b64f9fd2a365499dc8f2bc61e29fa176f7d76b55557fa58e34f9\nRemainder = 5065b726dc6b3758\nA = 15a6292c9fb66c6770a8dbc6fd431d2a4b57338581f78d0860fda90182cca563eb2272a79fb4f5a6fc72c90dc23e8a95713b65988b5b3f9bcec4f0466c1c47cb\nB = cec4f0466c1c47cb\n\nQuotient = add8127c0a27c961203ea0351aed5b3c75aa816e9c2684574e55f55c7140adcbf69d2cff843e5f53c157bd60b43c45c8b6658de72062fbba\nRemainder = 67f48d3584cf4fe5\nA = 4e8938c8cc46d34e3369c5d8536b18c963dbde56020678f77cebac5f8777e0afc62ca2ba4f533cf6cf7561bdce77b6f495bc1b05f1416d1173a6a288012c7c73\nB = 73a6a288012c7c73\n\nQuotient = 688ddf883a0bcc1ff9bd582119c2fea7c059e19aded8c048390a1d8fd7d769666987418bbe0d4cf4b67009a342958928769375c1c0d558acf\nRemainder = a5356d04b64ee12\nA = e0c9e32056977aeca72e229d83f0d320fbaf5cd8bf3e033289f46101c75ef59a854982f33bcbcfd200034e8ff439d669a03fa404e7dbfea822664967d67dd5f1\nB = 22664967d67dd5f1\n\nQuotient = 39d4d94587fd1445f31457c275fd6294fcb69ba155e7da3e6cfef38ed1272d6c95755bca49007ca62cc101b038d264876f18594b8fd4c329\nRemainder = a34980d5046e2ed0\nA = 2efcb12fb55c923f5c6ca7ae076765059e15d9e75240a6e5fc3db92de184143fab1934c7450c3a380a9851846c9f43d67bc199a314e82e72cffee795d695f82e\nB = cffee795d695f82e\n\nQuotient = 145ea82eff186b7db4b11fa1514674fb9d41c698efb33227eb1abbc4eb78bdb2a280c0c4c47adaf4e010a4336cbb5650becd1ef544e223e53\nRemainder = 36052bba2867f5f4\nA = f6a6c7e33fd4c664652d696c495df387b85b132cfdfe34bbd35759477b4a3c052f610df57e49e85720489e4bb8dc923696400a4a28dd000cc1bd491446a50b96\nB = c1bd491446a50b96\n\nQuotient = 35d0c9d870348b113868282aaba22b21ec87cf421519a23b288b150604729356f924090ba038d7400c0ccd4932836c65902b4d3c46a202a0\nRemainder = dc8c7d087bf24b0\nA = 22228c8a5966ebdec64007704a373b0596ae702d62e29e468653b21a890ace2f02c27f26b043f48495687ce8c2ca8092ead21aa250ce0f6ca26129615a2432b0\nB = a26129615a2432b0\n\nQuotient = 52fc995a486c4bfd17ed9722948e9ede1c4ac2fe80e6bd7482fc47944c4337a185a506a9ca473d49073e1b813ad742f19b13d57914888d5f\nRemainder = 75c703f654ad630a\nA = 3473041ae301dd2806da30dcf06b9c09600086d6873cf3ee9d5a0be638849afb56bce2664f797de4123f6f8fe3e12acd32e33a285bb7f493a1cc13a7108327f5\nB = a1cc13a7108327f5\n\nQuotient = 1744946730b2789977620f2e7439641125dd338d1b31fc50813b34dea70b83d209330bd17fd527db9a402ad9752c26b8823082ec9971f4ae65\nRemainder = 453a3d59303ec3c\nA = c0f592d83649bcafb7e2de1a8a71fa863c1f51b595bfa638c8fe30731c6fca36da975b6f19c657e3ca29efff6febfb311c003ec68189998c084afe4979b5bb19\nB = 84afe4979b5bb19\n\nQuotient = 468f3eece20aa9d6473f3c559760793e702758a3d9cc19d7817216392c7cc7c3968778cf2fe0c3f0c1424d7512cee19ac0717952f18aa287\nRemainder = 5904e71034e3a02\nA = 1f0c99a128c757d76ae6dfcd01012f0453c8f89b00476ec46321ecb872f99a48b4da29a4abffd0bbff2b727dfa182652ca85350b4ce100fb70a6a40ab6c41d95\nB = 70a6a40ab6c41d95\n\nQuotient = 12198913ef16c1cfc7c1be13f1cc5991a61ff74935e09f0c46d26456b7cf2825403b9851d07d27e0197c1fa2ac5e32e836979a184f14cd94a\nRemainder = 33431c3df719f946\nA = fbfbf5494a9c5384c7ae3df6c02a5e1f9f32dc31cd7f437832696bba164bae1a9d95daefb8bc08e0e8e637436fb747084460697b5ef5ac9ddec06757dbe61aea\nB = dec06757dbe61aea\n\nQuotient = 376c2f902566d83c21eb7c3aa3a6fa0482ed52c253f67f00d5b915d0183c2d9a2891c2ff837fcb426a4c990c48bda4f90e0bf69d13558696\nRemainder = 31540f5e05e8b4df\nA = 2527f8cafaf7e8319ca53104229199188ab1ca5fe592bde8ecf605e17ca6446414e06898a85e177d6985b5cc6d4eeabd6b222b5f44b4fc1baba050665c090b5d\nB = aba050665c090b5d\n\nQuotient = b8fdd5cd7b2d9295258bd99e2780921cb2ea70627a79088039fc3ab1c62bcfc6307e86db4a7803f18e5339f152063f9e41d370e97b1ba2f5\nRemainder = 4ed4f2d12e4f4ba0\nA = a25bd113c5a8c67ef65aa80f1512de43c9441fec0c41250048d29c406fbdae80912eb3970457d621c552e3af7ef2d6bc1b5448e7df5be724e0adf6f71df7eef8\nB = e0adf6f71df7eef8\n\nQuotient = 5421daac8cdeb6acc2b8b0dd85b592f255ee4fedb3a9e90f2a5bedfb0f9f033d7c562c96958346bcdda4664c67848b9d9fa7d3892bc4e9af\nRemainder = 7e5661558c345eea\nA = 490aef65c81b32f5df76dd58decdec3e3f73bc1fcbdb6aee0c93cd98725056153b572509e75d2cc4b042bbeb0a77d27fbca1e39efbc765adde41a7dfc5c3576d\nB = de41a7dfc5c3576d\n\nQuotient = 156a8a24e7804c5f576cd1757dba44cb4185bc13cb56603b54ee3b70fa35cd98db1992904d4f7d99a63b3a486e6fb31141a9d39cc0301f897\nRemainder = 29e9c1627537e5a4\nA = 5e4a10e772de8dd2c96acd714f7d3880ae8ab460095a01038f3aa9b8ac8165889403b42019a1e70e0e7f32e77fb388eae3579dbcb690729c4671868b0526aeca\nB = 4671868b0526aeca\n\nQuotient = 1b0eff2ff0aeb2c02ee3cc9e0bff808f4d616eb290293b13a6b58a84127972bb417d55e1d001a9720ec72562ef3ea688e64c4f32c7e26cc87\nRemainder = 664d57c57d4952e\nA = 806b8504abfbeec4d5923f83ddc071be88e11c4394168854448df96160b95adb1fd9c288852e2f3df3e36916ba5118815ca2e83a6a7d9e074bef9c961e2958e3\nB = 4bef9c961e2958e3\n\nQuotient = 2e363b13b0457a0e9effc2d7e297df78f35e5d24d0f8ad4525b573fb2f66f374871291ee8a8ee3d15a823b560156d474c678f79ee480bbe4\nRemainder = 5ba8f49e0ca36ab4\nA = 2e1bb261d98ec405dbb068daac5efeb0a51f08149181864e9dd6bf6cfcb617b76d8facaee2ef468807e0403bc550d58e8ad9e5cc0f094b02ff6d0277fe642f44\nB = ff6d0277fe642f44\n\nQuotient = 149a5b1a81b9e47ed36be76252055bb202dc25f8fe7beaa1ce59c279b32941cfbaf8fe4555867850b2fba43b10b74534db82398320f9786d25\nRemainder = 1ef621737e81780\nA = 63de892cf5df40c98de78c755c99e94e0e76cd5dc0b49b8856fe69dd0abcdc535bb1416f0d02b4eeb54e8a939cf7ad4edfb7de4dac87523e04d8ea8637e50920\nB = 4d8ea8637e50920\n\nQuotient = dea8a9211974758752d89965eeeb93cc616f88ce757ec2809f829cbb8d99b4ffdc3f0f643779fc5e0bb53b5273a5b15965f4a364863592f\nRemainder = 9ae7de3edb6c7edc\nA = acd5cebd069f7febc38c318867ba3a562bbf8ea9b19a6b33538ba107e49439f8ac6e880c6267c29b39141dbe2273d93062464de307efdb7c6b738c0bb282c3e\nB = c6b738c0bb282c3e\n\nQuotient = e9149b347cdea84d740be70060b239af000c4336ddf36fd5159083b795c4763588c87a959df0104212a04cc928baf60b0ea72e8cccc6d477\nRemainder = 3ef5c6ee67e6f5da\nA = 6ccf1b8b406e6a106160e73ac4122a04c0814ef5a47708a6776eb52002d52772d3fce3fc05398172bba191390aba925bb23aa1eee626410877822f27d1e3cb09\nB = 77822f27d1e3cb09\n\nQuotient = 1606c2fe44cd0b780ee474a9c7daf0b2bebf62db0ba8ef5a99fe22036019890a4c7dff73e678965bb0e2a6e61d00a74a1d33dc1106842115a\nRemainder = 7cf920ba2897f714\nA = ef9a3983f26237576311a871e4a3df0538593dd0cfda58ab90b889fdb35c700f7d158abafad127605057ca0532e846992c41ec06902ce58cae0c1fe238c726cc\nB = ae0c1fe238c726cc\n\nQuotient = 8ccf17de5068451fef1c2808c62e19997c7f920d5cc0fde1f5a247cc57c6d730df553cf33094b786597a343a0ce9e4bffef568247e904343\nRemainder = 2689c40a54df34bc\nA = 8435babd279b7a3833d01988c58005d4557f7689ea9b7168ef42ce2b31a1a3c32a982aff654f271a651085335496dd826ee4b3bc27f58920f05dc6676e51c662\nB = f05dc6676e51c662\n\nQuotient = a9e78c48c779140b1d15843089765ce9ece3855537ce88cad3eb7aa7bd6ec72df65adacba2bdf6c491066406bdc3dd3dd734a70e93eed958\nRemainder = 53da0b15ac079ccd\nA = 78550cb7b58b58d6878b615dfa25a5b90a1ff631740e631c7f8829962446903c686c810c46a1551b6c1f7a89ae898435bb8e36d1bae24a80b54edbf4bbc9af85\nB = b54edbf4bbc9af85\n\nQu",
+    "otient = 1e3b41304ee07f6baf1ca061e0e28a3740991c6ca2749eba70d3ea1f9cba8adec45cb69a31cbff22784a9e056e884713c0812e8c7981e49328\nRemainder = 3d051148ec43a72\nA = 76b9453d315e7a9c592e1f2640f5b6b90a65e7f2ff8ac24b9b47e35abb76fa5d303be6d501b341a882bdd9d2a1c81a9280724673f87fbe9803ed5a2e7edaeec2\nB = 3ed5a2e7edaeec2\n\nQuotient = 1921410e1a538a71d33d9c5de95593fada116200c399fa7590ebc374282570477f5f4abdd5166784ccee9671a1a23b96378df62168049f6b8\nRemainder = 1a1f4aeb882d7546\nA = e4aa84f782a65d376b10e7789a7d56695885aae274db6cb37e0a34414397a57b4a5f76dced11376af5fd11d31828203e685861a6dea239789196fe73d0e46116\nB = 9196fe73d0e46116\n\nQuotient = ed2afbd2e63617a651911017d9d02224d521e99275ab642ad1a941827983b17ef0f2067b5405b20e8e97f2ae6099150a1989df94276aadee\nRemainder = 4578107045b9cb81\nA = b547cd987638ff7e3c30fec9b728bc10c3b8cf16e7040bfe0fe9a26e44d2898c4c4d28ef525cde2b4007b2ffb3aa80fc4514a99b9aa2e112c3acc56b72ddbe9b\nB = c3acc56b72ddbe9b\n\nQuotient = 56181509251931afca3bb9dca21eedd6ed4226be67497d8d1bd0ec052af146993e7358f132e842f9b6c4934cf1b4501f5d6c5912e65c8d3ce\nRemainder = 1b9861df51429a6\nA = 32988a4e0769a5aca200f6f6f1498512e13b4904a9a311cd8a962fdd688de0c6e50b04f42cdd2cf8bf9b0a6922657f9ad195773e1250f85509672452618da9c2\nB = 9672452618da9c2\n\nQuotient = 1fa45bb973dd1d2df0002772afba55284a1e41f6aa4b0d1a6c6a4beb8ae00b52e88a9889037b8bfa9b7ee38036c57b713b48af156c3f9e8d8\nRemainder = 2525d52ecdec8814\nA = bda657ddeabe24c82c883e85822941bf64448b7cbb368468078101289b6fca36680b3884e35edc1fce5a5cdbdfc11359a1ba8ac0785c09ba5fe5cdbd30726df4\nB = 5fe5cdbd30726df4\n\nQuotient = 63e21f5568d07976aa81a2690b9e81b76fc3291cdeb010d1693d0e80191186815c7b2f83551a5f1b172640425d4733f06f4df1b2c8a7e6ed7\nRemainder = 14781a368471ecae\nA = 9f3dad0b3b56de15ac46cde1d79aba6a2f3b34d685cc810e9fa3f2d865bea4afb480d58653630319a258e9e8ded9be93cda3bc52b80a9359198221221724cc3b\nB = 198221221724cc3b\n\nQuotient = aae37878db016dd758003b85ef52acc7288b7b74c4723e3876a710baed4751d3be2ae49123b248f2b2c55a5be702c4428b1dba9b8a6ae8a9\nRemainder = 6c754d5c167e1228\nA = 4b93a98eb7b92cea0a4f5c2223e77abdfbd332b39f295b4ac40f71625d88e4add7e482adf3010082d8dd8854cf714a54fba0887de87946e97137cf7eabda038f\nB = 7137cf7eabda038f\n\nQuotient = 9881f551c4b7e67611f37df29e77cbe4e2d9fd5e17b7da3d013d6f3d4312e53dd26dfe3a2a12525cfef1ef81e6ebeeb7ef8fb4f918bf15ee\nRemainder = b14595005716bfe3\nA = 7737f8e7337160c14cfa8411236ca0354d8aeabf389b9fc4b14bb2ec3bb68286f3d82eb394dbd8062862b955e9fc8e86eb646317d1315d09c81ef51b30288cf1\nB = c81ef51b30288cf1\n\nQuotient = 4c8519d4d85ccf845fc5b8f31c27c60f0893ffda29ba86e8a3fd5fe67de5d29cb29362679abde996039b8febda2ecf71f6b9e1c1874361464\nRemainder = 10fae644af084f8a\nA = 900f7846e927760d9986894de6489e53cbbcdd59f7707917e7581422508f2ce79b77bd2c56d964a41e60baa927ca679faedcd9cd8102dde91e1f583ae834b092\nB = 1e1f583ae834b092\n\nQuotient = 16ef17b40bb73063f3cd0929cfe2405ca0ff2d3d426ac05f8a8dfadc85659105f7f728e113baab59247c4c7936ab975c08d6f1c72c12c532\nRemainder = baff11e6961c72e3\nA = 130b212cb6f3d854e4f17524953fd8592f5e59dfe92fc7d955e2899d1dde1ae4aa20d749caa349ca8d1bda7eeec2310532a7af54660e2a1fd4929335a1623bad\nB = d4929335a1623bad\n\nQuotient = 1cdd7ee2eff733b83beda5b862673177e2f2151ee0fd9ac0bf0ec5b7e05516f1d1b59ea754b0483d0e4bfb7668bb99117907a58a8ceb78028\nRemainder = 29e33e0c2a515780\nA = b0131ec2c1ffe9a523591a9453d2fc740bf885e7efc1a0158905da1e646745ef1bbf39b406564cb3da2f842bee307b36219bdee5991c969d6199279c25d4e380\nB = 6199279c25d4e380\n\nQuotient = 20bfcd06f9c54c537ae563e33dab31047aa30a6bc4e7eb0902bfbab3bbb7e65df442c46625c39e08c88310116348e9ebca2450ab463727f90\nRemainder = 11d8f2f6d4c1f55c\nA = cefafbaa2990eaa88184162ecb118d20e5999e5a8fdd25ae7f6248650ea74a8cfb92c58efecdd5d31eceb618f1596d7a6bfd31d092cf86da651f629975faf91c\nB = 651f629975faf91c\n\nQuotient = 37204c5735e4ba5e47e845d8b652cfc2b1dc715abf21ea0ecf5b1c6c8b9e596591fd7a7f41787be1a028c147a721ebb891b0abe3bd079b589\nRemainder = 1ee700ffb0ea02d8\nA = ce22d36b3cb913b32bd0e25cc14c7270d3f7b8e600a9b6732377f846adafd7fbd8a09d12fb7011f2283d988fc29aa25948dd4a0f24512b4a3bd460ee19887d35\nB = 3bd460ee19887d35\n\nQuotient = 191051194e4362bb201f5471d4bfaf92f79b6fbd119ca3dc1afffba334869ed9f8acd14fc42a2d8f616d652610a483ad90f5140e9a5ca4172\nRemainder = 74785b6874d8fa37\nA = f3c79f9a6af1c5bec72218d969620149afe8bf068cf7a7aceda977076665bb5a2c30729ac3aa976c9be379c6a5458f1501db8802652ef69d9b9f4f097027ddd9\nB = 9b9f4f097027ddd9\n\nQuotient = 6c46c17fdb03d192f75d636e1e2ab4e858d55f0f205cffd75550c4347726b5cfe036c6c901782cbe5a04f1985d9fd1dd39d747d25a6a7a88\nRemainder = 9a836be71a24e72e\nA = 4f6cf6e357b4985442a25b5c84e2cc0a5e685e2f5ff71ceba439b81f4123e16db2296dd4333fff23eea92bdbb812daf1d27c721412fa9847bbc9a0bf08879b1e\nB = bbc9a0bf08879b1e\n\nQuotient = -4984390f93e11c9a77880cfbe157dc41d43fe901c8895ac5091c5367a77370b16d42e8cc260058adf4d3fc8ee8cc6c0099804f4c319f15561b0a2b1caa7d703db82a726c9eab569c\nRemainder = -19374dcf21822188d720d6ec892bda2c084e8af84f38012da7029a3c3660c7e813fd4f7644ca80373575ff98ab6d743e939269c51bf62e04f\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 330af318ce0ffdaa92448777ed117de9c104e0f975651322c8e01b1c470f3cfb7a78b11f7daeea57614cec37d18b89155f19babeda0016171\n\nQuotient = 1a56f7d6c06a316a9a466319cbd558a99f06843782673a54775d859768a61933de3fc410068d00d5f6ab13fafc9228fd40ad41434501f8827bd7461441140eb6977f18d102d446\nRemainder = -3c3d566cd48a909292be2ce30f88ebb68e9122a3359f52d1d7b0189c467b829a9f226c0b64845715020dee12d179913ddb7f17da2db86d854bd\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -8e770450768d07ce20ff8f5f6af464b1ee5f1d0e8faaf927a19d3ff801f6089378133e822b8e63cf29c4c9ed721adfc91d3355a3c7bbde77bdd\n\nQuotient = 42131cf8f52a6a3f189697ce402a8c9439bf05cb3dc1cf8bc49dc2f07cef15b3bf0102c941b5b3bde6440abc6eacfbf77ea8da06ce932fffb226b33dedf001e9657464b0f06\nRemainder = 4cd483574fce075404dd22072abe61200fc455c15b382c7f2962ffd82c38ec1e2c60f71267cbc35fcf77fe1f9301d6b5f884f1c416304aa9f4d4b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 38caa64e74b29a7e9bbf341edbab112a730b17103831a9ecb70ef077e9660b2dd1fbf71d7f6bb4cdae2ed7cdbe9070ec9fde996c91b9bca5b83450\n\nQuotient = -11d6883fcd705ac97cae5bb7f8a2929d6f636f4f232ae9a4af9769183dfce9a9296fa0714c3f4fa1eea467a5c96a484a59d0cdd87496b9398e7a818daf89a58add3a39e80\nRemainder = a6b7984fd80d719ffe2e6eb756e4e3bd7ab51f6088e04ac8fecdc744b0385294dd23b5007910109abf40cfca814c10addcb5330e422b6f5eab6efa2b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d25d50f53c694cddd56aadda2654ae5888603b39cdbace93d19c117af5505750aa24e615f95446862bd693f5b444e2a876eb2cf49f6c7acd007eae02\n\nQuotient = -3fa898b02c621915f44b213ba4e80b8e85c7a2f4c78df2bda7d99494bbca3eb2d9354965d83e1c9001f10aad9b3f3ed837a630b329f5a4b28935158fbd9d291a120b08\nRemainder = -320d41a3875da2e83ea9a83947f5abb1a7026c84020e983381722bf7aa87d5987ab088cb2c37fc3781c82c81bef3263fec560023e236a747030618e9d2b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3af2721aad4b18db27842b5e539d8cada9dcd7ac4c5b885065dd2496a6f76fa73c8a51b239b5c068ea6feffda22d8ea806fb488ad5a94210264597edb40\n\nQuotient = 179307c3e14de14a744d082825ed723b996a4e15f156ac473960583138c43f4275b4436c50ef8f21a7b450a969819b81c15bc355fbc5fb55cdd8e124d931d142851a\nRemainder = -9c8eabd36a25e995c1811b79a2a0357f6aeef4477cac0ffdd130046cb2a647f928",
+    "a34d91d9b489d394965719cd58604b957c693a93145328e5568d33d88a9\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9f2d3da1da77914df66bc889a40847a0d705d4648a11f282e09173d170e96d84b5a45092d995318fe7a954b54b88b784423402519a38bb521e84a4f6c5485\n\nQuotient = 6c0f316406afb4cc2aebe34f7948422de0b612a02dc47f4ae59419c579fc465ceae1980a3e524fdfdbdfad4862f168a9851664688c9ba01a8bc1ac156a6276643\nRemainder = bf52a2fb6493eac22fc8b334ccd8e8fa347620539d9189d535373f94503310a027c5423197c7279bb51ab8c459e27f548d57b55740320e80b753290d077aa7f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22b9e55639ad3ff4f071a49c8bba6bd9047e162fb31882421db8ec5ce46f28fbc35040bbc74ead5a948c47c43e9c7adc32fa52046b53f12b07b5224e0d8e93e4\n\nQuotient = -1008fcb6894d8c411905136fb3e05b38ec5d8df35db06379fc2d6d3e3579bcb34fa6e021b98b899d9d082c111b1a6ac8e50418fcd5968ade6aff8828d8e4777\nRemainder = 3d7dca387b00c677d855fc4af4d86d86331fe4309929039e828765f0937990bffa964d3ffc5d4f2f4b8bea978329e7cedb847c7cc341ee52217f903ddcf9446ce4\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -ea045323f406bd7ce25b3ab4993b5f6dd92ca80e3a02607a862deb13470ccef229fad67ae958cd87fecf4f08d9609595077d0d1360d9fe48c4566e237aa877e7b1\n\nQuotient = -42a50301031962754ebf9c4b1e125e6df3dd40ffbe09c044b1cf4b62ffb4f92d298b05933a450bcef65e86398da80740a610ba45928000a5c12d26e9f6a4\nRemainder = -c5485b82cfefb3f980e0fc7c6cd89b1345a8fb942299bdc36ed4ff8916016315a0da84ca0ee2824dce3c7e5ed49d517c45173c9c8e30b224940af6cf828c73db8db7\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 384e523d5a687bd1a90101e43334894b6a27e8c6809a8bf5bffabc34d558a8309997dd6f2a3b7c1a63100dcc0b6647b444ef7e5aa4a9c52c7caba1ebd096c3fae6f95\n\nQuotient = 1054439945ccb5bc5461fed04e364c7a36d5dd2c0428872676debe07654b2ce31e435a90c81f2bac1032143acb0c49ad101398feee8426bf270bdc0229\nRemainder = -7bf919e14b2559ab82b3c1bf428d083a4c851a7a1fea44718377e9e945caa5cf48e0b1ad727e251bbb330292402a75ecd96a56db4ad07146533a3ab5a717d0a25a3a7c9\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e5cd83a644ec86b94f5e33d4dc307a2f14ee8653288145dabb2b5f894560c164470197fb9e37749656f47df343c245258627aeea17965fea10a57336bdc6b4a47443492\n\nQuotient = 62675274798218da426a54ed7158f8f737b7b3c328a9c351371f0cf61f41712f9b28741f187eb635ce45866762fb5fc5051776151d202e2556c5845\nRemainder = 1aeb5d1fde3c259917e430e6790b00484d0d9508391ba6ebab0f6299190d4b34f5f7d8ea2174974471a1e28ee2c15e05da645db971f699d5d0e80569b7eba7908ae579f5ed\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2622350611b486e6be7a7c1c073c230d604d782c2696038a3233ebcc3f01c6a711969094e47f49e294f2c5bcd04fb1b7c0934f19bf6e7aa519a8d4ec2c172ac59cc1a57b26\n\nQuotient = -12970cdd96b92c37787971cd8dd166999ff241be881eb9543ff29165a9c1a3beeb38b1910a5724ffe2b73ab95ac1ca88d3989aa531374d4ec6122\nRemainder = 627455cb555398150e5b4c1c53ee16dac8d80d9616ed1ef40031424287f8028a9cad1a10bdd8430f6f65368cfd00390c8d4355aa5ecdbd1ff0266a1ade235f33cb5309446961\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c9dac93cfb7abaa3fcde359e09a92ab0b5c06359bc09ae9bade3c6783064dba90b233b4c8d5c6236a13ef96c7a223e37bbdd931eae61e845e5a10088f75b3ff5f1158e833b15\n\nQuotient = -6742b3871dece5986d4e219bf5f43c101da8896f247521fa286fde696e0b71ffeb3b6a3e4f33710c9ab150b7a1f747cee76839c5e7f2509f62\nRemainder = -203b2d6eec9d485f7b439fe9d4c640bb31170af38418faf4daad577c30e44ca06efda55ceea4fbd959b3809fa2002b6e2cb891decb09334ed89ac66ff05502036b2155ff62f8aeb\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2457088096865cd052e9cd9349c6e5e34e46c89d6e860a36f8e2a0bb1e5d983e07d05e6f6b31edc67e4793cb4d40979c029c80a13e654b66c8acf6b894f615a3ac800bbd09ce020\n\nQuotient = 15eafc416460d757d0abbda8d094eb535262a71dd033c25e704a6df54265b6123247e5625da476e0c220ba88582a1ed94265135bf8bf1fb1\nRemainder = -64ccd9a0ae0b0abcb5507d51b2e6c8e52e67907474605c439796febda06eabd8a3185fdfc0bd088cc49fdf564b5b45890b07269c15b1aa2f993cd9872b97aa6cc37dea2f03444b3ed\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -ab34d3906d8a2b806b22c73d44948d703c1e05a9337f75cb0b5df5205c5e2d23f8a92d8381372f9398c9ac2f7b9302b83e48b26512ccd0b06e6b8ef1b930ec2678d71e2eddbf7349e\n\nQuotient = 3b22916d9fe3145fcc3b8872bebf5aee4e14235f618e0aed09199852c6bed80df39256d8407d334c06f4479f230913370b7d451fad99d\nRemainder = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d\n\nQuotient = -12ffa4b6fc369404968911c17358012b993c18c2ff34122e06f450d3d441926b5f5638b40efb012d76d8bcd3c0012d0a0ce5d55c596\nRemainder = 64548684fd5f6c816bd296234740a4eed772570bd4a48852462f9cddf14f1350ce7c7c6a58aee8f66ad7df87927458db09e3af08eb5376de08444f35e5171cfa0992fb27f70b81574f6e8f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c58383afca9e1c480ee75d3cb6b0b99ea42e827d39fc96bab6b0dddc97e3eaaaec02a74847f9f7d49937f5ade3580bfcd491990737d172d4079437067251ab403c36a9826e974b113e2d2a\n\nQuotient = -4964410c2b038573107b0151b36177cdd62495e0dbef536b59c8aacb8836bb45e7bb014e5022360621e8e82a273d0d462b8eb6fc\nRemainder = -1250c42f8c9b129a5c477be446b86356edd1b19409d362c3a5fb5d59c30f1c3fdc1424a88a0d6ce20bae885905d98c8a5a6495931f73edf4c60112ed78834e3bff6de3ed54c867fbf16a1cd53\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33212ef4a8e80daf1049ac6f639f8e1990142ac32f7ebc97675ec90f8eb1a2814dfdd295ae67317253d0187ad33f3932a3a7efb056d0a3c87d28e64e23e9f1de751ee6f0f61c6f39d08d72f0a\n\nQuotient = 17f77efddeed52ef2e423bc2c10d2ae15c97384b766f4108474964c2a44789e61249103d9f5fe00b4d612772dc6ea12a42e395\nRemainder = -1ec95323b7",
+    "b95169d5ec0667f3cbf683e98c15dd0fe44df4ed9de9586e43f1f69337e41a6d11d889452665dc0b03cf8d9ef2effe0b350eeb9f6468751b8a2c42608ba2a33192b770cb62381a966\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9c91fdf2dd1827ed103a102db254630c278bf8b47bb12a342a92f081acbdd8ae5f5476ae194e24b187011ac25b19fd09e6e690777f9d3efb6b3a32c8f5905e1478a27fe4b1adf17a70abb4e7571\n\nQuotient = 4f5dec525ffc737094f40d27446ca0be5b7a2aff02d51d99609165c4cea0dbbc1d92bc0a8680782b616c149bbef7f5ca912\nRemainder = 1bc84ce56a9a0c74962681c02ac927051c81f3824d9f3f0f91465df333ecdb449473d9c26ae3abb9509add5795e89ba5eba6ec7c89b114c86e6991ca0c185b34d6e66925a14fd82809dbc4936d273\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f47be01e6dc6a86097676fbd472c2af0c83a2f743fcaa885e44fda7e9f350e9fb7a8cd07fda59ccb7963f1e95e6a1236f5f94939decdc85afc0e523c711b24641c844cd3113c17fe35ca988ba407c\n\nQuotient = -163cafed5bcfdeda88555f30bd4cc2da2cefe2bcec9a7c19c36ccd04a45121a5a0dc28d0bf6ab7fa4b78933c47a5d5286\nRemainder = 93f856077f5b2907cefcddc4d767ffeb0acb7af64bb9dd8a15dcfdda6c244c24fb8404ff9ea2fe1dc337faa05930d33cac4f61e171d0236e222374cb3da76396ae1329a407fb4ac652fcbdc568d0fafb\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -a8bfcac452a5e48fee9132b73bc2fef771450143ab80aabd8690ce54c9b52c2b5a669076a7a35fa6d926268077bec6d90b722b5d074f28ce3843fb0147e567c45f4e91a11416c082762e71b5c6129c08\n\nQuotient = -617dbaeb8c6f9d584e8eae923c872048f9f9bf039ec6b50cf8f09c061bf79acc3311b37c2502e560848c05ab316fe8\nRemainder = -1ab4613767c4f1f7d127e848f2bb7c72a3a9e1dd6173b63198b80d3bbebce6a31494f19b53ad9e3a77248e6f9b26fc59060e2759a20dcdbe785297bbd912da9a1819527fac550d64bfd20ed1f96450c30f3\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 267d9397138fd0374a7a58593d41627ba1203a646ec2c04997acf607e9d217b8f40183d2f9304447d6f7e727a476e636ded4697a5ff30a9ae3d249baf97969658209c1b32ddc0edf920b0b278e9b5464313\n\nQuotient = 10ad85703fd51870306c5e36b51512341d6d39e0bac47a03732787b2f62e49c76666f7f49b2596de6cb5c5b2f31b\nRemainder = -846b4479713bb19ebb8c1f1b75d2be0f39fc1095a3d2ca149b5565146bc19382b86e5ab0d098ab1fca1ce701d582400190fee34b602845c3c0c498925710f0b9e3af2412ed5ead1fe03d77e9b2b407ac83823\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e0ffa4e120f2f46fd1430b6022fd03f71a22f9b120f8d40e901279be235b32d94760fb8c2403d23cdeb728ae73e2b16af7322d6ebd5f5673187668c99805e700f1e997423886bbcb851448dc1ed4cd66d6598\n\nQuotient = 41567bbf616ab41da51108d7edcb5a8a4877c5a8663b3aed7559421b1fcf4b535a54989efedfcc935b3917fcd\nRemainder = fc026e554a0821e0d36b796fe6a676fcd7383a55fd6158d78ace4edfc3d8aa87c65f0eb41baa2aafadc51218b0562ff4b5c9b17bbe84afc491d9e309217a5138ad48dd51e1b1a9aa51d69963b608ec47d63fcd3\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 396e9b45ce43d3f89386cfad8ddef4b483ecb5173234530c67447ab74629d246c18b9da09522c77f598957e3fd2a1c0c9417399912fd547fb1023ba6b90d63d223bcbf3e7ba155e51bba7e8635aa5c39d2b9dbb8\n\nQuotient = -18f1f395347ce8df530d9330c61c0e30ac9531b50a0af2ae7809db1258285c15ba7a436121287990fcdbda2\nRemainder = 51417b9e9995de34316a66a2f70c146df8e36952fe64124819607bd8691a465f4fde98e590dcd56f0faeb95d1b67751081c2393626713c27ec2a2123aec2a4ec3761e5ace4aaeb612d46e52e16d72a186d2ec8a7ff\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -966dfc779cbf9c388a84e947d1128e2392399ff45d9491259c7cb19589154f82f41e852e0c6bb5a728f6e87ff4ff95abcb9b2b57af1b6b7fc125497775ecc1338e4bbcb5315f7afde4e283347184b908545211afb6\n\nQuotient = -3fd962e88dc1d501fe9335fff8b6b2d50eea967c3035a3dcbcdc9599b81f9a445ed5a6ae7413b8865fd4\nRemainder = -97f06f6155f8d0ee6850728192e0b4fcf55fbd9ba982c5f1d598ddcbc4e1c4be0e209fefa6ab3b7eb2b4c645e4dc40217202285ab0a7270d085dd9d4fd24e5293faf6797b4c3c79bbf3ec63fd82942549f9e8f862297\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3ac566d6b2d18572360fbdc626ec488aa316a74f33d71a17a2d0e1d2bf26395623eb91dc4abebf2f944e9bc3d669fae2e4332088e9ff9d9f43927a7888b1390ef60f05efd6e63ec606ecb3e164ed6dbdc9d088586aa71\n\nQuotient = fb5ce21bcf28490afb64e6746a1a81792c90eae17407c0b4c5ebf2464eeea43e516be2c615f84901d\nRemainder = -3d255bf94c3d610c32266fd472d070c0f5e7dddb88d32723b2e1a20709aed2faf28701e0d0227c2b33ecfa9e708e5ac354a97be732b786210d86f1f05d191513386c580b1ad1f4ac6890f87fd0d4270f23cc5c2064502c6\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -eedb64a6e204ee3d6df508830704f1d5b2d2e627698d38a114c07458ea0befd593a80dfd2e08fcb1893adf57061ec4fbcd3130692de7c46f5ca51361e9b79bb7a91963618b8e5b7591392a5f0e3be954e8b9978c97f12e9\n\nQuotient = 6933a3123d0b32693351a834751345300c49324b861a663e8700bdb3b70ad996747b284a8ea5c02\nRemainder = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5\n\nQuotient = -10e67cbb33dc6e24765893a047252766c2bfad8385150689dd4fec9ef495dff63ede1fdf78bb6\nRemainder = 9dabe2cbc734b910fa1bd25616daee5657d25b6e4dbc2cd93cf8549715c87974a8336fc5070d86c11f6b670d4b3bd5ee8ae3af2bb321fbb4f8fade3f5c6c2d6c366b4d800dd13ce897f13b0d3fb79f1d9ca525b4e7286c56ff29\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -de093dba98747499f2876c8b6b7a6b9587284835ae35f0716dd594c826cdf5b9179f2c6b08d800a77a6936602ff2b64ee0b7c94493bd5009633f5bbe423454b7f018ae96c21230510ab4bf5db394ff153b0e9eda3ef90eb4c253\n\nQuotient = -521f5e35300b9ec2742ff472cf61235dfe2e449772afa638b1adb812cccf269afd164b7602\nRemainder = -2ad10e8758e1d358d4744ad344ce319617027107c0b8db195d1b58c6e6035450c9b377f026fdf9e5737750af5615cff2ac3ccee623c060d779373136d48a735b353d64bcc5f2e6ea1e46083fd799b5f57dd5ad0ff3e6df9764af977\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e50595275489",
+    "1e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2db1990ba1e353a1a62de1b914ccb691380b6ea937c13621a29f0a40ecef460cea52cfbc77d98706fb3c9939ceaaf962fb8003b0cfb40535e0dee22e8e7d04b5648fce2e58803242c199421cc4b26cae776d3603f2ce410ddd1e0da\n\nQuotient = 1d45aa6fe6837a1b7ac95efd55d1690b66487202949a286fc85da7ac0b50b860215e44fb\nRemainder = -7984639b596f1d4e6efea9d8b4719215588620ac959034b303584679a44fa84a4be0c89fd2e29f54e62959f9b7a858c06b0cc051176af82d4b85e7334555ba11c39e6cfa1829995c383ba81dbc220e527e90a1d440c1d069703cc1370\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -80316fdc405bb002990d3ef7d0e98defcd1f0e370d1e51db2d21ecbd96230baf69d00b168afcb7b8da9edc3ef7f6621ae5c5a0d7797e5c92283342e42468dba1036fcb2ffef1f493ff97826477364f6b5a41dc56d6389a01b83eee041\n\nQuotient = 3c0c3f7a777e611d1bd0d17d669a1ef7920b72ea8de06d4b415a73b836e37d6cf0780\nRemainder = d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9\n\nQuotient = -178d749de2dae3a2ea4898c59aaba98ad9f340762040f5aea13cad45a793f1256ef\nRemainder = 6c5d9b19aed9f099255b6e3d251aa50d1e534e6c86d82eebe097dc8dd0748201e48ac62eec070a999c21f5c7684e5a700212e9079b5fb731321dd1e16ca82ce80c1f5c17fd1720f1353bb90997f47f5fce335a43a6f59facff0b3724423393\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9f52ead13916f9807d0cf0c6699578af52c54816828f22de62328fbd7b4fd6c3740ffc82af4e24892092c7ecac44b5e775944445e6615fce25610984030a345731f944128f5734e6e315a0ea97aafd7563105695d026880d065761687b75e8\n\nQuotient = -4fe43bfa9417839ee408b254603c3dd176653b6915a89de5b781b400162fbed6\nRemainder = -1c15816e03751a203ae23c48965c8541849b09996bc81d28e28d7871fa87d1c3b2d383c056d3084d7d01d853bebe270fe2c0839e71851e169d417c47caacab2aff8a8e05f65dfb20eb17ed8f67475702fa83087bd868246cbb885d52639797b85\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2ef8419306ebfd215d9079c7a2b959a53ca2f4553845e3cd32caab2635c0e77fee8c5c016c121e3cbedfac57f810c132486ba78df9e719a976e0112516893f14cf9b89f95a89aaabf31cce509ac8e7e62ec3833f0be4336afe6d7d73518141d39\n\nQuotient = 127e8c06e12943017f9dd57ca24dca0ead230092811d307386c81b6efe009c\nRemainder = -24f3431858d5aee412443feab243b465b849f5dc97e4de4db88c7adf774d9bdda65fa0a28cf6b18eac6078b00cbeed2ac406f8426aef868d4b59ab045825d4b0a18af6c9105e32abc72fadef55b221278d329ff6fb9019630411bec143c4156df7f\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cae6399216401dec0f8ff5eaca884ab061469082ee3a18e49e0b4d5f9cfc98a598c373249a8ad2374e0b3de71370e93a98650684fbb931aa5d8b4482cb0be142492bb71743c251346df66896806f926a4a5dd4c16ca3294f01bb998835e6583d29d\n\nQuotient = 3f180694e59df85f48ac02b6d4faa26278af9641db18d79f198da5d802f\nRemainder = 36cf82dcf8c7ec783b4de68e0627a4a4b2a508637c176de09feef62dcf382bfa5d8b88539b5ca2cab6cbbdbbd0e54c092f00ee13f4a352cb570034cb0a012cc0fbdb6ed32967f3b81d146f352139bd3d9a5c27789468b7d79b84d6a8f6085f859532f7\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3b7983bfaf565c5ca444367654a07b8bc2bf7fdc04ef12128c392bef2f6b67d9475b4d2f0ce1c380913aa98616fbe1d74dc5c9d64df15f5c9b87a8bfbcadf335a6e8f863c7a01ac175a7d79645ababa5f961fad7d1b9926f7284e254fed33765339e0c\n\nQuotient = -11f635baf7b7d613e84dc38978a21ade2f4cd741d0c4f6ae592d93af9\nRemainder = 4317c686dfd56216bc4865f8dcb6a3446e13d8b33861e74d6c4a3223c387ffb8caeea0141049898609ed1abfc2adbd21756cf64a72272aab6c0b8f2177419abcbf9086635dfbea80a7b884181f2f2ec9a402cb0505e8208909fe062d5e6dc7094d66af62\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d0ea50558197566f22704e66a70328cacd6f4b7ca9b00c16b7c4b4e7dcbd47c9b2526b3858ebb4de7a571ac570872f3b44ba1fec655c0778a8a87ca24851f6072c5c0b7591b5e67a8cdaca78fa46f201e02379fcb9a8470e4a4971acde36cf501d369751\n\nQuotient = -64a078497f85588d3402355bf3e83d25ca1f0ed2c24a395ef6de6b\nRemainder = -87fc31ac66a24ebd629a26209ccac1b2c85e52dc83c5240269ae5a27333f33d31152c9470efd41472af034e8536bbe94b0a49e892b1d23db3c13fd84b7395d7e3f19d7d4cb4a4c07dd1860826696cf7202483446452aed2b4980388e7eda0ccac792d77a33\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 254a85bf512d9159b00a70678239902ee7e15ac2790ce5747c4a4743c6a0851e6a179b64c75acf312dd37a7b82a729246f79196b8a399ff476c48a05f89c29fb106bb06ef0300c4b330a7b2bcd4ea1e82584c7a96b99ec2131c885c5851343cfa6ae4d384e8\n\nQuotient = 116a06b1d38067cef9f55875fee1254c8ce39b42c19fb232a287\nRemainder = -c15a797fed3810e4f536e9509564b2142ffbfc0c961ee5aa923d43a824765c05d2a99fef79bfcb6310c77a91d9bc6d0762bd687493865de270c99989e891fbf6da7ea5c7c7a1032449457eb73222a011bb755ff44e4bdce8e86f8aa9f687840c0832f7fd8ce48\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d77c14100d19fbaff6334ca6aa504001a1d56f274632dc89d48e1d517935503c26b60c047cab9e186a55b72439761c884f63fdd2a38ca1acc653f6ccbb4b7262e6215e6d00c8829b448b7ac8716fe0bfdbf8088c8c61eee8f8db43b7b5551f6278081ac2eb1c5\n\nQuotient = 6fc9533f6d0e6c55494cb1b319ec47bde8e621aa92d91155e\nRemainder = a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5\n\nQuotient = -1abc689fd19523d2e295f260d248041bd00ad3009cc7581\nRemainder = 1ab5af1478fe7373d012befb319b53ff9e36899c1749ea763fb74f7d24624e70ee78faf3115c2a423629528f45295e4adec7b122b993b5c29260558be4831df06468bb1c63e8afcfb1b9b533ec6acf754563d2ae25e2adb4cfe5ee3024611e03a156484a130ee01f3c\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5",
+    "e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -8c5a7b6bc8ed6ac015ec24efff607b0446c1b736dc8b409e2f433e69d0ca015d70c64b4c924175d0e0102ebc3e1dd96dd4d5bb01cccad229e699f9d8f9ad0e04339d70cd113e93d50c10c03083a81264396f5db2d979d272798ed30efa15d52289d0c72f42582ea56f\n\nQuotient = -4aa210fbc0457fa7366a8aa9a3acb3f9fce812303ec9\nRemainder = -737bc4fdd3d5496fc7f936ccf14bfc3d93f5b7caf4718c444db7a3228b41015c67aed304fec7704ea8238ba6cccb1e94cac3bcf4764a44bafb49e5fcb0339ae44c0114cc304b9c4370363657cd2bec09bf962ccb21f6091b081e71d2bff8556600576e18d4f78fc68b12\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 324774e49bb429553c10156e8db122670d6dcaf6ef5291f515c517d7ffaee36ec5ec5ccb4d12dff71ae7a05bdfbb03ebaf4dc6c4e8bfdc165b77cae20153c27d53bf27d92ff25643b4888cb586e773955a1c02ecbf0fa6958a8ec0b832332eab2e449be6e72c48d2f1ad1\n\nQuotient = 1c8631a18d189f1fb689f896005f2dd2098e0dae9e\nRemainder = -1a1ac9612fc3354056a5378de5b315f12591ee71f0fa9d8a6b2ea2b1c4eca9947e5c4f5ed3d4b78e69ef7a1f5a9894b9c7d85f6e2244ae76881eb06584eaa98c78b60b46084b517f4882758691f91d9e2acfd580d5e901dae14ff4a4fd6b0d7c73450e4928fc6f02fb5463\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -838df2a27bbb033fa0e581073b879d6e8747fff38539801a1870f2e52d91bc84cf10f2560e93784650fba080304244dbfe9da679f207b6920be46b0214a1e490537e56d99beef3f58b30f311a12283501ad79a5407ff209d19a6efd0421aa144e0cd427380d89bfae5d1f5c\n\nQuotient = 4213d04b9f0b30026bd355404bee887b22b2cf9\nRemainder = c2bc097d1c20f050e88912f066b658446cacc7a4d510343a8d88ed007a8c0cfd5d44fe5f067a0e81536d121b39f2d0feb8dd053bb5632e3f9c04be5f6bf4091d646860cd38c96271cdba466ef8b7e2377a51d5669117e664269fe3c08a51b10e1e019ac063d670a3c7db12563\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 38ca0c2f03a5c56676a2f95cd7a69d4aa2085343af6b1d2a71e0d1c54157ec0e8f9125df2a499cdd484c04feb23b1e0042ca908db74744584036c79f21c25c40401d551a65afed0ef35f1ea000fa1a99cb29e6307f6ca0304145f7e483d008cf9efb028ebb654115a8c6b87a08\n\nQuotient = -134e043b3b88b31f89ff4bc709cfa1bd2c1a8\nRemainder = 99c1c846cbce5e9a26c5afcc0186bb1e43b2501ab3205d13fdf01dccb9b1a935bc1cf8adf74d58f1c316381577366b6d126da49991a0d5e02acaa678085f335ff8b8e975e5bf2e52a05488ebfc21a3e0d0bc5bbe67442f77bfc3c1f0c03b7f7ce42bd0fedd8a498f018d8cbea47b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c261a6c562fcdd56e67fbd2b91027f17c95da43175eaca6e4069c16d240ebbd240582dcde953eea739a4668fbfcdc6af8ff3ab58674c95de90fdb43f64a61108b030d644a44b0319b912bb563f61e520dca9c88f411b32e99c872cf00a01f5badad584636352913b7429b99ecfbe\n\nQuotient = -448c4922b7a7d5e1efec2c3f41d0264b76\nRemainder = -2599e928027d10d3a11056eb719768e5edb1a625fc0b8a1dd4439ebd30a82bfdf89e617ac7c71622058cc64ba32dc242d96fe3ecb856f1b146f831334af562cf88139a99410dcb869b9ad6ac4826563b400b59f55d8fff262dc920fe525b12b2fa167ec237028a098c9117cb77bc3f3\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 36be11eb72832f8ae7b6bdf689f794f62cc1c885e64706d14a77a11df9761c2e9cd81d8f6a0ad0cb1696c69afd80c8bb992cda5100cf1162d600515568b9dc9c81a518da9d240888d4984df65c129ac0b4c557b4e63ee5be79a27473ff5bca58e559cb04c4ac93b61545e7351bb6514\n\nQuotient = 152474a1a76700598c18d9301866ec00\nRemainder = -274a2f9e2bc5f9d75f9897b28f840b71bb10a3e4e7a35ee1dc1150be61130b4e0e987e8742c5edb75a1ce3158eb8bdb7d657b8ba39436d7c88fbff160c7488ddff2f13b3b95ffe149a3d0d2d406b1737a7671f69c0e5d7074a151cb2776b2d13ca24bec261662f2967fd22339ed6c3f2b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b17c79a31d5085b49793b6a6d628109a6047e3b1afc947e5212d0a9ae32b1955cfd6fed07fc60634ad15f32a9e402d7d5f750fb6d1ad958211f9e8ecda8990689e5212cf72b24e9b51bd07a6e0477dd4c02381d0ab6c0ad3cac1f620f723ab004880800736804751349f6bb19d3db48da\n\nQuotient = 5665f53d5a7405c83a5ff382ec376\nRemainder = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7\n\nQuotient = -eeda035247bb13860f228d8f2c\nRemainder = 3976edf710ab42bf069e5829de7e16962d1b765f6ae6ad0ffabe723e21ab01cb9f3f5f4edb1d8c13cafc0556c0aa93d72dbcff754ae9260abd294647b71785bb049bbb865a26bba22defc458a14af019a796e942e77d03484028aac2b3798fa730ae0193d89728bf80a8728715a0807b3c497b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -fb5e55f261aa96f54983869d58b3e9f0757d363b9c43aca5580b7c0380096f396ec79d1b30037702c19be5889fc6376793cad51975100f33ebf43e0897dfabcb9adf3adf8d845aa7589ba1f6d155b25f73dae3b2f835595ad6050401fd4e6392012d06194af415b810b0c10a53bc56350bfcc4\n\nQuotient = -5b37eb0c3e3f8f8d9ac6f4e4\nRemainder = -28fde388257b9a11441c592580cd38caf2d69e2ba57d43151c77d26535226e05e08a9e6d8ed470d4354e9f46b7626e5f2b22b652a2d78f817bb51598c727a765941fba63510b58fb3dd5f30717f237da43b42d20bc260b06d488c9c912bfcea1e7808544c58960a3e1355c50c889cefe75d4d9937\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 29232a3fb059242cae6e0b419ff13c479048cfe46a9063188706c6a3842674b16a1aeaf771c5b0ef401d2dc8a57f6fb4fe1b3c7bb545c18ae763e39421e6a07c4469d234f9fc737ac21ca67a5553c7ed693eede4325dbd132dbd9889d815c02f426801eff1f46e7a52f72845234acc6c153f34065\n\nQuotient = 1c7ac058af2e7bfbda9484\nRemainder = -54d7aa6dace87e61e24d87053b9d094bd160916b720d7cf4f740a4fc5a7f03909773d0456c530ea0204427146fd44d3ecec51d8627b5768de1494bf42081a8a4fa97163b0b93b59e70e533f3257723e441cafa4aab471ec4086601021c4462e1f74bebf298ef45fec98fa8e6ea97415f84c93c12633\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -83c2cdca7577b32c20e9e20fb498a2bceb7174ea9aca09d4dd2fc7a1d3b922797b4e9640c7eb9dbdb4d93c7fb9daadd680c1c7645d8102d77e9c877a9f65b13239f9a650dceefc1fd41ea9bd2b38a622bbec99cfddbc6e88f377cd51cc29fd17a27f3d0d970403a2aeeac6ff9fd69c3bbc5c2b0fe7e\n\nQuotient = 472df5f4393f33cc382\nRemainder = 16579a289cc776a47611353e158c43dadf0a78833396f8419fcbbe",
+    "47d90c7e840e2c90e73e563e6c505bfcf691120ab0f1e9ef9c31db608cade70eb8e487b1113a46e2b5c7f4a172ad99b502eacdc0f91c295fe608389e61d030607a94d09d349fe1a0cc46d1e07c8db533cedebcb4a3b89afd8b924993\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 34b7f6780620246f5a0a92a768072185f02e57a52db1d865c21c952f4386ddb7e2dc1df076316cb4f2f394397cbcde1af0197fcf33e6428e6f5d42a9ccf623f75fae5940873097d4591d9b1a4cbd00074d134272700ab06d901742da695c3ca9d4f917a808113336f883e769fa8051cdcb0cad7cabd1cc\n\nQuotient = -12b4e74d76bd306d9\nRemainder = 8768fbe8ddbf60b548938d8b4a74c4a326ef335257e5f513e65a7d2cfbe9d456425ceb719407bde3cbc74c9c978970597b5663a0ec61962e77eb351adaee2d2d37f1fb55b5d2ceccf282ea3a0d398be1dd1b166d55dce04a39ef434fa392893618003adcfa61401276ce4e599051ad93152e3477ff524f0c\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c898a753745f0fc178227a7004d917557cf3dcae2e85e95aee51e137b29c895755853ce2d61f214b80070174cad8ebc2795a7d070790acd335b383f9dc88c01227eeab85f1f29d76c1136ffcc7b9fdc073a3a03d8812c7c561b32d8e69754fff64acfd64994b7e9574d2a7cae6bfd5a6fd61dee7ee993bb7\n\nQuotient = -548c97fd02eca7\nRemainder = -939e90e281f97a433eb1c6510668d0fc448f03d737d92693b6362c692167add7e4442105d60ff3db29c03ed06c3121aa4a53c4625906519a4092e4821c918d2264ed0cf088b7da43a222877f3ad9a9fe8ec06fc66b9cfbb44e0fdca1dbe4e461dda9b85231b5b9733e0c78852da83bae557755de3680ab61d4\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2c61dce04200e725ab0ecc5016f66044218391bdf650bc0bd31f3749ac06c24707e79526ee459ccfd4bc22834f8d23f391f2e99135f92b5abd0b04079ab75a263c0e98e46edfb440cd865269ed7872e8c1ada312df1bfd6a5fcd2ebf548d7b7d1d75bc36f62e5e9d15262bb8652a8041e5c8f4d673eecb777d1\n\nQuotient = 14622572f311\nRemainder = -6d197a84d2ed486327790059adb5c073218c56345f48c15caf6892734fff0aa7af4782738bebf24d984bc8adb3056f67e57f9960001a67fa462afd8c57ac9d60ae6517d58ffb4773b637ebe6bf2473a5490511fcdc576a4c40ed03b3afcb2fd27c57b66a26f6d3f9b2bb101502b1117ba3ce7214c9db6302fe20b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b818674faf69bc92085b7230d9335d7bead0413f2905539a54e8d1233843ef13f07cb5538e0787097cb24f152cf54a92e62ef143e31cfbbaf3c09650b14229a4f61a783eead26430949c88a87f1618788abab9728aa52dd8419f5d568e6a109f278b2afdea91cdedca43e562d4bb8fb7f1b7aef13992fa7edc320\n\nQuotient = 5cdbb03ee\nRemainder = 1cfa68d5da7a600a7ac598b9ca1a0759f972fd9a46ba62e5e96d8f6f00fbccd0ab26ca03d14470b43793411ea9803c9409908625fd74ef8f9b2d7c2064b2e3439adcb684e6f01432a1feb0f492fcdd2b8b5a6cdbd0bf460272218bcf763974be8784e5306c219ee535baf5541b8580952e3690b585fd99f77c46d69f\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2869338cd16322409d3efbd328b27e2ba53cbf71816ff5c093849b1d866b8cdecbd6bd8ffea0b7787251acb760f85c277ded21e56acef05d29bc728cf44f55be87cb4c8913408a01a1ad53461058a1cf94538f05ec14a6d3eba804264df957de7eb1a61b794a1141218966463dd42402c260c229241ec46afdb5a06a\n\nQuotient = -f16da1\nRemainder = d8b66b622b5a54963c2c84aa186bfde5b67a3562e07a23a5f6843bdb615a3c5d4f007ad8b275ad7e4c5b1436252efe35699cff2e0546e6dd8c7230d6ad560c51cd54db6d312be32ae4c708e9047c3a25c211e2566c58d6b9291de31612006d4e847c6916702be99b3f7ce40e1ac842908acb7f03dc120aa8998c60737\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f8af8fb7002a9d2218dcd0f0c139b8e3dbbd48e25a5c910f6d0b6684bca224f62768b64955580306bac6bfd45b99ad77483563fc7dbe015edc06bee3ff93b0afa8f5866c23c7a7570b366550490c97ad84062c2495cff30717aaa965a8e15e270b504dbd4fa943be4f97a7fd1f3b589bc9fcf4f907a7690d99c978a374\n\nQuotient = -71bc\nRemainder = -13316e9b053a06520526f579718c326402d2a9686d51a340375cb53d7cebba99c8d1ae93388db0a41cf55d5753dd1174014ff3305fcdbd5b02de9e90c45ec0d2900ebf6ef847c2a045eab7f80f07f01c81b9fff093a779a280ae42239df79de8d2ec4bff6723788c86786fe276ae6a4dc1472442b552258e1e5b597305187\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 20fe256859a2e4c4f77db6adef78b2aa4758b29ad0787ce7e277bc68391d5949bb4dd07a9b1a79fe890c8a760871d81adfd3858e27d1bd6de33fd31b8aa6131fef9130a50f995c3be1d615d1bfb9878804b7f6494237d8ad78ac219488f17335ae54b494532f03a3fc8e9576cab6facd90c662658878fec86db66bacda3a7\n\nQuotient = 10\nRemainder = -23e09736f469c83f280052ff01071b1bdb52b7e2b061e8a1a8c6a4e091fcd7ca0b33ade885d928a11a3375599aedfe554d1c2289795daba08f07327a19a8adfc219592bcdf9fc5aee5961a48b3b1b5fc380eff5ed2ba7d7e564462397fb6c6187254ee41c74602b141d7adba99205d2e0b35da57efa96397b3a5d112751cf7b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e849bc0bfd9560cb90e42c8e4e88df175133c14466e530716d89ad0326b660b0e617b4efe8df6b000f517d3cc24d9dd4cafa2773dafd4c6bace0aba54e43c17e8e3ff9497a97ed83e6408aa0aee0e6485dd1d89d52520d1acf4d587422b0c5cd2d5e7e81fdcf842d6331779e800f96628206e8be020ad4021789008a641f67b\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22004040a65f9b6f120bb7243c638cf3a4cf6fc58c230da932c79568f68e31af7a7b8569aae77af671f8335ae68d6dc1698baa9d6ba9cd633a662101b45bde51d55098b50fabde8546f317ecc2ae7a39521bc075942e3751a349f51ca3c371f3b8a6cbbea3e11a334d677c07612bcdca767194c07fca78ea8a06cc3b0dc6dcb8ba\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cad46f410062dc33ad4d712c3b743ae2b7613576b2bd7c346a8479ed679a08e3644c7ee4f23b95f1cc9111905714b170abc37ee1003956f64f0a7e876b38d524fbb2436ed56069479d8d2e4029770f7801a7278fff99b3dc76280f35c7d43ee594073f725554a92eaf4f785c18a7cf6669dce5adb0995233241f3294cfb5bd8f4741\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57",
+    "f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2fef69f9745646aa13e0c38d77951161a1f881a7ceef032698da3fce00764959f11140bec7d7f53d6777c3622453d4525fb068da48047609d18d463a8fbacde1d21035963b668ca11d5b9ae66db13de7a7a5b66a40608dfb56d9f9f0c8880426641083a05b5ff9e6ba0d6da3a04af1af01dc218e9b4f6ad7b1d3a4d1d26a5c906093b2c\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c50a24e5ddafb768f64677233c5cf09da1b4f06894bd68e194b23feb5c5d6844320a12a02d13ad012f13b1438eedd6313bac9c1f9bb4548fcd314988d8fe0ce6458306735307afe08a96a0c2bcd9cf126f529e48b7ff4b8266caa28c40b5c3d2a473ab8805c860d27d7ee9c032423148d96fad019490ea019d40679de7a2a3323e80979f9\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f00fb238bc9383079c7ecad9b9f6efc622d58a76f2d5d40ec7cd7c3c083c459fbcf3d128df4d20ead5f585505515aab11c36584ca622d28e0cf037419a649d598346063a07e29c61b7a8e76d1949dbce3720d45576763aa0d391b39dd6b694c7cc60a1b4f4f107d87130402985695e1847e82cce39b8d0fb5c88bcf3b37d6dbb90baf5a8553c3a\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b809f6baacecf61198856d9edbb768ca2df2abe9b7b8ce1669fd9259732c8569c0cafde2e32d253094480ed281a8db230f84e780c6e8bbf3657c0b0baaf19ea973fd8daa2870c9d79f3695d78e063f9130fe07ce806a088ca267fd2820f10dac34b5b32aebec20e4362dce26eee0c29d2fedc1e020d452bc2499234d07a2a6e54314e3fd6dd85fe5\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -90ed75629073df816ec1d6dfedd1cdbed9239661e362db706288dc4d774d806bfacfd4b32c3013ec67d8c2af133b46989f12f809fe202d33d5ba53659bd2a9a85d3fa542de4a5c656aacbbf8899aa66ba816b809f2629f37b0444cd3a6dfc99103bcf2a5ee87790b8401be806b5d7fb7064ff0a6fc8ec769d0ccbddbc3d35f7dc4d388d8d28021c95b6\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3f60052c9dfe0bac797a674ca7f11377a24c28a1396ffa0f46acab7909543086aee1995cf51852ea4a21ff4bbf6e7309cba9848a7b2e3b33dbe660bdc58d513d16bc709f1f2253648b46daa7aa037332552db1da81b4ab9850ac4ec66621648fc856a71eee3cedc6617071600ecbc5ac8636233f288ec249b7ae0bac942a5fd539d03990c4fb28a46653aa\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c12fc156d9345cdfcff94bdd324429530ad8caf8afaaa1a82297eb3a8aecf2ac021384036749e489fae05e8776da0deca7e4325436bc8f383bed579c2d67a456c4e23871489780d760d63d0bc0d1d0ab41f06a091b44f602bcdc0bd4e817202e39ca6a934c0c9405adb5a14d24da895c58a81d1c7ce52734183e00d80a414ddd8869998822364e029b3f42cc\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 205dc6227dbd3adf8ee49dffd43f835882822b1c94f92cf38f5efc62f943075d80b33588973a0e0a8ff5e800ede21d394736ba98d4eedc53a9122f8c262cd09fe9e91cedfd0237003b0124d757797ee13cd03e7a3a257bd8df756940a4d22face9287edca00ca23e7d5e629966ef710b07e54241dbace041aa6d9f82687c3ecba818203adb376ec0b201894a500\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -82c30a9ef6a83d81b77825c71ddc563939b8508f1b7e44c725ae0f61006646ba9b86507ec9a4dfd3755ecd8bfb451c2d43a61599732b8aaeedff7a304ce0a9327e2333f75e9a010556ecbc3abaed02214f25e1c8373bfafc2c288ea36b8d5f848b76295a141d8f633609a6656c07f3d98177f5fa83833476dcd111aad179001f81d6013ca3a54cddcd8dc0ce7eb24\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27",
+    "a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b897bc87a40211ef8f93645b1f6c981fa00ab3b12e117a89375400ab5f4c64bfbba01d265c7bc6f5e3a8e26de5de9df3b8f70f4a39c0eba577db5e4b7a68f751b4a69ff4a38915983cbf70dd7e066779405d572f5bbe0719c978b6865ea1a72d90d3ec8a8c146f20d98595036b3de88a7500d7b476644913e4b63e85c4e2632048e9600d553e560759770a902cca680b17\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 20604e080549e1c503049ebf4a56cf9447d90fe699a9773915b0a65588890e15bd58f55ad7b52bd7b7992a8b24704f1dfd5fd07c70aae4ccba5646405ff8a9cbf542dc334cc0c27a790c05420b552539fbf0a155861bec0e4d9e3fbf045720ea3aed58307d5738b64252a963f3fd5ecd0587cb4d7e159b4980dcb112e26c9c34f10a192e090ade157eac1d7a6f970871eaa69\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f11fc9682601cab97c25533b2599f50edb1ac65d46f1969bd9c3cb3717461627621c8cd401a0a0b91f3645b8804e095aecab31c1bab0c26df556adafdd7e7f4f0510e0bceefa3619e26b8c9a1bc613db03857f53e9eb5d4b8f75a8cd1429feb81edc705e5a779d5f95373d2243368ce17ef22da79a6a2672496bdf629171b7973fc4659c8eae9ae867cf38d6d7617029bf59d2e\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3cb0ffbd9ad21d0e86e4e4dab4d237e2a17d97356bdd305fda772fdd99acefcfb8309d813643c852f66e1c6c7fa41ffd44f8335ef7333b2b3e846139fa9be2c4ea762afba4e11263c0b5fab18c5efff2a18d83ee89844f5f4db2c1325f0f55e066a9e01030c07a85e2c9bbd37b5e767ebcc9b95f474ecff24df9ae52a19edeb66546a3a28980f616eb5a351cd399e5f8436f17faf6\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -b8aaffe779855c6ae51807f8cba780aa64bc22e8fa5e33f7f1dcb084fc476791565bc33eb37b4f791ef5cf46d64576f48b5fadc9f096f20c798355861ce5d24a7be1450bb871f9821099f98213d74a5e5cf83b895ae65e0e0fd096698463906a112e6e169a1cc0769df7a5ba6812300fdd33611761b6339385e1a70f8f8b2be7679ca216f5b183140e69586a27aaa9f2fac118118875\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2b7ee3ee34347dd89ba4a81415aa1269d0390346597b07444f0febb71d490a01b6fee174634bd88e8aa180409549b2726d044b4690353de2fb2294c8f69c612485aa066f68fdb89466760a85901cbc7312bfe5a6f656e67dfd2d4ee099ff97694b01d6d5b8626ab1650eac5267be53f5f3ced5dda1aa86bf42ae132a28fddb94902a515da40e0fd0586dc8b17a34af8eb03d06f70ab89df\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -bf8213944ba785e01b8d37a12de77b2ce1492f34bf6f67406cb51da89675b4f70f4d4f314f30ca8d65cbc48ee2fa1f0a3e4ac0de3a87d2c4c589b6812e850623d78ef2e46fbb555f6d3c69b211892c11a4a2dc3d8a9a19e96a07952602ed5ffc0232c140c3e828acf990e5425d8dd9ce0c1107ad1c6f96c8fbc90ffa457abab0d843094dca3c8a45ddad81b7850190625613a4851485f38fd\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -d736bce537f47ae4797faad797af8cfeaf8a4fd42df1f7e61febf8ebf6e47dabc48252ff7948f3dbf8cc369b6952dc58f64cf09b4c53447d135c7a753c21b6052a9726a47a61e13628edf0f2bdb357f2e780ac1ae1f28f211296c8961c2955b773d7dc2904dfea96780b2877af133c9591a0dd54cb20884f014f3638624",
+    "78ee7ec45236bfdcf0321af0692e68f744af28fbcca827ebdc7b210da38\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2cf1708f1e675ba688c0d19eb61a05d2c8642528ea6b1512375faa732acc59ec04ea0aa55e0049144be09eae1292b6cba6db7a9823f1e912df6a5032bb9674f4f26c0c8244ea0dde7acfda566574956cdc33e4a27bcdea25fe255c19f218cc4316ae8428ea61d1bf865197a066b959c5fcbd7c9596207997d05fc38e32322aa189ea06cf5139522571661745c0d72b740dc6d842f1dd8481e318b5792\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -a9180e44a284b5bbe72fff46e55869f749b626ac33c8cb17be1fc260d7c6f460f24a89e1367112e00d0da4d213a821d09f103f35bc4eade5605bef23c5d048b1cfb45dace8b9c637af626a85fc773cf51e6602a7a5999a030030cf114ed6a4ed7583465b9303a72e7f60824c12329517c6763b0f64abd8ba2b9b26cebe882a51f05ef8076e527d53a213db910a5f42be5fb78729a3dcd08d69a709920a2\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -9fe18ae697576dd36ebdb621d14cac1cfdfd1f5cbb7cfa8962c5a7dace96f9f54fb4f4cf2e650dbec5d1ba89ba53d251ecef7dcc1cab8c2ff3d77903f5fb5f29a4e8e3a2a3c05c105d5733b5132f2f8d88f99d17de86ca1191c32ad8ed469bb649ef188306f69f183bd0fcc32759e4f855170f88c0a3f6745aa98f6225536821bfa056a42b37535a622f42b009859c974cabf2e14f75c749d0fe5a01fb3ab0c0\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 33ab185854b20a8126884eed85181b14e75d4ee452958cc1043b099bc16c24b9c2f3e0b792744f230013907844496e600389800e45fd55133fff0cf19c9c152b9d031039eb90da568f9c5212a3ba283f4d1353ff8ff9dd04d292c265bdcb77c3e411716f471930bccbb8ddb819ebb0e0036dc1a18457cd97f4f5909a725baabbd15e8ce33875895aa8dce77a4dbedeb0271a2a4a17f77f5920c3776caa4a75ac650\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e7ca0c037bf8bad5f8d9c5a2737e044d9f7284c616156d142612a53eb217f57f4aa00b6daa424e6c0d9163939e1ad0510a1cd64fbd576f3e54c59d7aa6228fb3caaba7cdcc951e00ed141ac3a68abb9780bf46bf544fe0e347f677288e962fb69782741df49b27cbbe8720c6f8f2e769147d89df6e17e3c592bede2e696d384b9f01b99b31c505d67eb6193a8844f8c4cdadc9fe45dd446a0dc572c9da6e58ed303f2\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 22b76d6973e37aff4a09216e57662f186c0a0748c4375d6bed370ea61d1f6fac2d9bbe04487a629118b6b0b0c8cc4179fff7bedcf048cc529498bbd9cc81ef3a103d6cac49d58bc41c83f961b6df7f00c7171fb7d9359e03c76e4364cffae5f67321ce646e9b05f9c04aa16ea65389e940022eda6dc740ddc070bfc7e589b86fd1559dc320701c39de20d54d0483fdeef6c4fd012850630b982c2e243ac1ff918377ceb4\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -e6e4d69a82b83e26ef8ac0f4c3a211153ea6655b7ca12840e7b866510d114693049c5b8b22c3a097eac832bbd1986e60564298e54dba3316807ad64bd6c18903a0f22660c9e8d5dac180f57cbb90b176b842d5b58d6dd9f47499a037833a92a18f397238a8bcdc4afd129382fd6d200d3d267ca1e6bcc2cc65950831cb8e30bcc01665c8149b874c9f11168153c187341afdc43e4d8652ce4fbed9f9eac75db40d64344ade\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 319a81f052db21ee213c536db2cb8a71e0dcd0a9b2ce780a9588c38b717c5e487a337f82b5223f638fb552e92b826192e6a1c27771d1e86584bc6c7cbc5d9a6ce6edf2ea2ccf6939485959ccbf3183b40e410768c4665adf90a0ae2792fb4b5d8aaa06c6294e31893620decc3bc72fb4eb68f1e56b48e39c59abe869d07509b7564268d0b7f178ef09ef5dcde6e7dbd2a20fd1d4fcd707943dd63adf590a117ead1ad10ff85cb\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35",
+    "d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -eced809145e696ceaa0ee8f831eca67049509b31a1b15e7fc86cdd97a73a2ca05bfea5f4b283d287e49906463ef36f2f8ea23c2aa12d5534c08e9769055e04822be0f8ac85f404f5c025a6833b4115f78da9470451c852ba0f24062397d20385f58c5aca10f3f09072b2592e5672ffb989a390abf86cbce74268aef1f4ffde730b3b962df1088bf8745105a7462379ce142f819c2538d9bba99e094ffbc4478625bc54df16c5e1a\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2c1ffbbb30e71d5fa77b5473392f95297b489c85f83013262abbe948842473154e00c86b2e354278844083f960fd746a3b7cb9baecb9c66932774b3a28f678d50dd8fe52fbeead43d8c8adad7c0fcdbe5e02664b0feb0ce214c5fa007c5fa2d08c5fe96787b95639311cc4b7eb2a7217c9c38c6d93444fa60c1f52ddae9bb2ec1a49a593e210e47377d3623cd2c4994ad9343863443911062e12233176f4a65ec715b3c9731c4a0cec\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c3bf056b905c0392a7b5fa57446ed350f325eb67d59f1784c744b04c7f4d8f5397db913407aa8a7f1dd0225c1a9673828db0d8bf3d4908ef53307131bf5b5c4c6068ad73b874aab98e8db33b0a758532172acd8b2c830d0679a8226537090166317b8eea91e8ee4a7282c0ab0ab6f2b7b63d728d22b534fdc88294c376a8d036ba9a644c2489bcc84f6aec83afbac08067a7b93f3897f8dadfb68c327b751841927a728faba47dc44ec4\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 23fcf9510caa531a304eee8d0b2d49050fca83abbf287b6b6dea06501c5afc6d87d2924df1d45b1bf6c4bf77b563a3013cfb4ad9094f8ee9892d33f6ee1c70131cd5721c5af804a9da7654510e8591aa185ee723f8caa78046d9e6fbb891e6024d2ec70110ae61c3969995e35941d2c7f3779d5bb71ce5b693bc9ce4b087068adbb554acc4ab23624e060f7cea169ab512a06ff3d2a36c2b6e3bd9a75f1a9ad30a6a16b0256c42eaff2c3f4\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -c32d5e643b12db6616554116299c1da672efff1eee394378c5e9e5f702ea4ad64f0dac8904bd2751d2cef91adcb283599f6c661967dbab27059e94dd50025489cf74c6897a22e95013669aa3063fcdd4b73aa6a9a1ba5cad3956bb26346e22df6741cd0ba1c0ab87fbe74035618a394383823216df47b910cae495b8fe7ac5feb3b2cf0d0ef6c75db477160b75324db8eeac48a0fce72b9abbd7079ce6f529a89025a03a3777cc7d1deaf3e4a\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -bcd2b2362aa146cd120b729e81c98ae598804006d046a7ed0f9782baa10a85e37c7c22288dc61c24830a1b42b123d63779e88d7555028292fed5ada1793264b35e961b608bdd7398e421c5474c33a65059ef13787e0cedf4f8f032beac48c4b5e5a67417109142a43b198ab617d1de1a38d6fb4922c6ef70a5aad3faf6f8d5da3af9679c94cf61ee760ba792d2972376425e2ec9c4109e969e3d9c3dd90cdbaeaeb7382cb7bd024b75a1fd6d621c13\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 3940430ace4b5b87bf4baa2673582db3d27307ca4cd8e55e976ea3e10da72b6deb7de932253bc9228c85cd4ae7766cd0264004c658a66d81e60bb9bf4dd66e2afe11057b7f7b53a1ec222510748be53a93970fb056e8082631b2b77413fccb6e61cdc6f224b7903d75345afed8a4f194b4bcedfee1f16dc256c2bb9f4a129fab6a9fe752895a93937a3d087ab7ca212991ff34f1bf1c55987a574674af43986312bbc3bad3280bbddf4ab0217440f851b\n\nQuotient = 0\nRemainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -f0dc20b88450f45381791e85d080e4f2cf38837391e16e608b8cb5e0ac0ca75e9f72cc04bf2f56f130d46aff31efbabc0ab14f0c0ad680d6899797297152be85ac012644c8d0927b5b6c70dc3e5a8d79ef92a0873ec22af3d9683bb5db1ffd5ebfb698c5ea64cbe2b6a8b9f14d4c18624be1b78b19eca14942ae9542012692cd0d5289ebf75fcf5486596f92659143e9f952af3622137e633376fb95e628055e0fb1ba3a37ccdf0af69a4c0d6b0793078e0\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5",
+    "d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = 2f2135850715f623909e41a745eaf7b37593567fa8be2d1ccf76d10b93a096e244b91d8700cca37a2ec1bff7c3d21cc3211ea8b03a3594921dec32faa185e7f3d9d17e98cbf8d881fd2abb944181659242ede21df7e5e8784f541cad678df1ef6ca4a5fa91f7856c62fe593c4d24436810cf4fbd11125bcb571f6975d82afeb81bd0c7700e053fc175fb5fc7b329c438479a863b8d5fbe6b4436b67355c51d0306e8847a27a30c9e61f0e08232673cdf0ba4e0\n\nQuotient = 0\nRemainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nA = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b\nB = -cf429f101a2e19a65af1e238f6745215cf476ff2609c846f10289f1ef21b89af2aec53def3f4ec07ea42041f8b5862dc37fd03b2df12adaa8c9f1933cc69b526d47797b40f49545fd093b8ceddee3c55721d1fa19b336218de0cac56d410cc6cff4e620578cf820f5cdaadc367dc4d6372aab1e0ae3831a6d153c14920b1dcf09e7629b7442a06385420d79742e409677e3b82ec58bcbfa668ca072e981e20728a983d84a432605389c855a6668e0ee0d2b67449\n\nQuotient = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91\nRemainder = 0\nA = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91\nB = 1\n\nQuotient = 3b5c3007d9c49498ff8437b6f0014d146b63c20b6c5b91febee47211f42109f6081204b21a8af99e9ab2b5165d536344fec16bd691fb3883ee7335e12d69afc8bff57641ac7a4cee350209a08301553854873da153ccf056427a2415e3ce72972afb5883393806ec2388169b513674c0935f67ec79c89dfc4bdc6f9cf877a10f\nRemainder = 1\nA = 76b8600fb3892931ff086f6de0029a28d6c78416d8b723fd7dc8e423e84213ec102409643515f33d35656a2cbaa6c689fd82d7ad23f67107dce66bc25ad35f917feaec8358f499dc6a0413410602aa70a90e7b42a799e0ac84f4482bc79ce52e55f6b10672700dd847102d36a26ce98126becfd8f3913bf897b8df39f0ef421f\nB = 2\n\nQuotient = 4f54d7e1ac8816945de169e9a2c497ff240e313c2b7d58612c8175e277f032cd4ee5dd640605028c59395a1eb4aa00772a8187a0568b93919aa5b95b0462e5bd31c1e507170039306e1b2f4f75f63ab0a3add0eb01217df61a74765fc37e941dedf10fe142ae317573a4f0c8ce408c213749a12f56add5d100d0973b019350a1\nRemainder = 0\nA = edfe87a5059843bd19a43dbce84dc7fd6c2a93b482780923858461a767d09867ecb1982c120f07a50bac0e5c1dfe01657f8496e103a2bab4cff12c110d28b1379545af154500ab914a518dee61e2b011eb0972c1036479e24f5d631f4a7bbc59c9d32fa3c80a94605aeed25a6ac1a463a5dce38e040981730271c5b104b9f1e3\nB = 3\n\nQuotient = 2922aed641a12010a3099f3c03f708962e2791dd860e65440acf3b982a4041804dcbedf45deefdae5130df96902056f8b2942069fc17bfb29f46a096a36e842ecb30d0800da13b6572c5b3a095038baa3107ca28094063571b517f7cda3659b63099c57a40d7dd2893b92d60b1fe2fb4594fc3a19b7d7957921437556db0e353\nRemainder = 0\nA = a48abb59068480428c267cf00fdc2258b89e4776183995102b3cee60a9010601372fb7d177bbf6b944c37e5a40815be2ca5081a7f05efeca7d1a825a8dba10bb2cc342003684ed95cb16ce82540e2ea8c41f28a025018d5c6d45fdf368d966d8c26715e9035f74a24ee4b582c7f8bed1653f0e866df5e55e4850dd55b6c38d4c\nB = 4\n\nQuotient = 216236f9c82fe6f1c021853a21fde3e21e6de355cf193f16b403edf59a6a6ebeedb266d4c7a6683f5f6a434c7129f582d2a5a852269d66d2eda45a1e2f25286c665f6641ff8b55913603064cc7a157f755e515a426873e7bc6b9d699d1f316759c4505a67b7a025598f9d1af6ebff2ed0fe393db829f768178c1080ea004e4f4\nRemainder = 4\nA = a6eb12e0e8ef82b8c0a79a22a9f5736a982570ad0b7e3b718413a5cc041429baa47c0227e640093cdd13507e35d1cb8e1d3c499ac113021ea435c296ebb9ca1dffdcff49fdb8abd60e0f1f7fe626b7d4ad796c34c0a4386ae1a1310119bf704c0d591c4069620babfce1186d29bfbea14f71e3498d1d50875bc52849201878c8\nB = 5\n\nQuotient = b9fbd48d54b9b70374425aabe16d6a8a819944a43185c2fd07073e20358510ac3de13cff33fe6220ba952d88b2e0f3f7eddb8daf27462b476b5e127e72ea60fd56cc54bf14d2d92765d5d21652d8e16aad4423cd9789515d59aaa02d42d3e957dde50ed1c9a69e2295144a643a8104660ccaafba250854e7f28a686935738\nRemainder = b6d\nA = 8ec1cca67b888cfa26bcee98ee887c47507a253008032c2b37e50f2fb914a34c357f6351e368c2521f3781736d4dab43ce130640f1a55c3851e9b5320f34e772751fd70cab7bd7aebdaa9fc22297790661fecd7b4ed0e6f4275377f2bdcba89bf1d251e0074864618b6e1319eee807e054d193e2616ce52c09ab3d24c187332d\nB = c48\n\nQuotient = 5157f1bb35866dcaa3abb4abb73580d43d03536c3c7960aa95910db60f4d1ffada96c7d89dfcb290bd8c5bb154872e2dd6e50602fafb435193575a4cf253e4d22dbecf11f8f97408dcc83d6e591b1d5daa59825ed8cb08cf562fc50d62cd666b9720055dc11cd42278258e5bd8021aada0b39a340b6c5585bb6c9c84a9ff8\nRemainder = 3d2\nA = 469e999cc737f4d12c97d19a13ce331841f8232cb780602c18592e274ec8b503884566ffcf28a206288f1a9ab3a25bd74bd054781664a331922a96254d6155677836e7455a6690fcb1acd7550cdbca3e9124356ed7b644660092f8d2df06d22ae7f38ca8a4e7472aecce9ad73c47d3a93cc3ec9faeeacd3f59f70ae22c9614b2\nB = de4\n\nQuotient = 3566586b9f864dac5ed132d95d4ac6d1fd5ef6a2c67fee39ece89d615b4c681284b4dd5e27b90c6270b85b150fa2a63440e470b0f937b0eb83432be03eaeb37a0927a9c76b07fe40e3509c93a7b660b77ebbec9bca235d387a9a80a6432c77ddd8190c0ae8ea1d72331d5f4985467755b27573bf23109a01c02975e07daf3\nRemainder = 2a2f\nA = 9d68d0643f1d44b63aff6a83fca08c52bf800dc59260db9b7ff930eb1bc01a47966fa509abd7da21ad856f7cf536d32dc7c962afaca1c9e43bcde135e4c5b9cd9b3c8ad775e06fda06117f8cc03ffad8e5f4b456baba7eaa9c67af7a19c2f4d65120d51fa8d31d0cc1ec7502187cd784fd2d78514cbccff969123718de7cb30d\nB = 2f2a\n\nQuotient = e36f2fbcfe134fdf3137539006d6d9c03b8774883211f759b0258bb09585440d6ff440e799ffc434a2fc529773a455db9abf72d8c55903d9ae5abd5b2b5e9ccf23c015882cab8565c654532d9407a188a40d0cb026fb3bfda428d4bdfc14bec72b5cbd59540c42598f1371e9e61a86e6b4c957ea331baca764b771212495\nRemainder = 6eeb\nA = b669c646d1bbd7389fc642da6d2c440788fec53bd8409ee604222d08b1fc31b3d301e42a8168be0ac394e5f20eb51708b11e7b09d25043f19032310d6649d33eb6c9688506ebd56ebfd0d3f277511ad3caaba3642c53d27e8fb0eb991c75577f584c52b1ec44111b3a9bf5863c18d8a07b91d8ae0bdbbb3b05ec8d11380a9c3a\nB = cd53\n\nQuotient = a891f8a42093cd86d76cb11cf734a65dccd5b4d350328a7d2f2be76e2edb6b7dcf4c5e1915c65764c77ae73fd6e42eb8451253507e16f2e25ef80e5d1f27ea18dc976a9b12147ecb643b2ab060163307df818127b2e40dcea95a109d7841edc9288190587ac48ba9687ccd0d014d531bcf66ec401bbcbed777325fd1060c\nRemainder = 6e66\nA = 9077614b809f4b22707cf965a7e79217e13ca2011cf9e069babe2b4d908e318608f91da095864403b168d750d904fbfe11c9ed80ba9f60d57a8dac2754647002a0848fefb7a5aa8e04fd28dcb9c8e669de4ef794eab2abc93d68dcbf4400d86de603d199a3ee93050638fca7063ea99a9465dfb60d0568b99dfa1ed79da41522\nB = db65\n\nQuotient = 1b16f2e2ef7709fe285ede17beb7d9932caae2dd5fa0eebb541770ca1d53da4428820986cb7e79026eb8bc261eceb200b7696a4b90f675ea9af8389c60dde4d564c8adeba6b117edd05469d285670c0bc78afbc3ad047828cdc611fbcab403c0cb79665d6285b43fa04b77f0309bc7f74136778f8ec16899df040db34f4751\nRemainder = 68\nA = e91e7c26e2b562fe2568613656381d5581628e4705ede6660ca5b79b4a609748889707faf9295b57eecfbb1c0b1cb5cc2a5825b84878e8b9e3960f29b59580385a4af0aae375f8eb7fc66aa6a1fdc4a95e29048ce1e5760722c77cc1c95b1c4c16fdb3e59ed4961f8869711ff24c91ccbe2fb6e0617a5f242227e1e60b3ab673\nB = 89b\n\nQuotient = 37370826964cbd65a48598e73b519db77df6f520bcead8c0446f1288ac189403adb65603b2a68ab3cc232b667232f2e206b5bee0fd48fea8b3ff515f452b5ef0cac591b6ac8c8c509c59c6d3d4e3fa03e22578ff71f1c72ddad9d637ae0497ef0e2a4b261a72cb784f8283eb7e82b6a05aff0a2f61da4780e4e7cfcc4807\nRemainder = 3a29\nA = 16ad5614f9129c7952c5ee8057d8d12a70780144e616e3ed571b2e38a9ce482a52c436eb9ccb6e4f400321bf1f3ef4c8dc897cd91f868eb7018d084784c4840a1d078c8c6a75e950cb76cf2cd81b719ac04d2be5c9a830b1d1361f7ef6345af66a6d56c53234cd98f587b6762401674973df670addcc4a05ec0344d402453a25\nB = 6924\n\nQuotient = 9bb00032a27651eac898b8a567e19ed6448669c8514b5659c4b1103069d9289c6c00b38b44160e0efb2c635b7a64c8296c1c1b5c2cdb285b749e614eb9247c6defa06f8dac077b1e1c260598",
+    "47de56a1a5ddf7fb1254662624f2ffe6edc48f3b318ffdc7ba2a81ef2d963b934120f58afba2b107a215b58f324e2d923f75\nRemainder = c03\nA = 74524695d4dc11023ff202ed2d165551ace0c126f7a51ebb3ff21ecd7c058cd4a6bda2254c55ce6ef76fd11807f92e80dad31bfd254f9a2e1ca89949f65a1fab8f6a4978c488f2dfa61df46c1faa418ff45250d82958e8f5fdd9426c44a3bcd7c4eeca276abae466787a5ff0ec482514e03434ee68fce24fc620e31265c3718c\nB = bf45\n\nQuotient = cecbbc189fb1d44c5511f742b63207bcba9c78d09342cdcd12a1b1bc3a95466e7fdd8c59329a9b18f7c793c43f08d52339a8202dfa3a9fa86a2426bf5a94e006849b45cbe9a5dd74ca43e2acdf1051be23359624e8f146b203864d03651d98165b783398a59b446314c9b01f79b1139c30df348b14ffd25b22d9d90866b\nRemainder = b265\nA = c3721776b9b5fea8608aa9d381d80ac603d27043089dac276832e7cde8d222ffe142f06c314e94c3b9f6148d029f260879b700e1d435b5f318c8c8caebe92236c9060c183783edec2845e6d4e816197196a0de3644544093b04ac6fb4c69d7446954fbabadcc5dc3309e9a3fcf70368ba7448455cec9c3dc78512a19ebb04f6\nB = f1f3\n\nQuotient = 4090a2c78cf8711388347149926610d624543765c9667567ad86eef9f9777f53c0cc0f9a989d9195a5e0da875c03e5c74614f95b8752f9ab89fa61c264b8b5d3e02b043fd539d36dbc6782f45a555d1f36751603d5c3423c7f27b3b5dcb91ddc81bf1563dd3abb0970de6109d76da1f4f9d5208ade2b131fc407c5b169c\nRemainder = 2a87\nA = 129d32cde3c648298f8e8e8123f2e8ee9cad3f909a5647ed09e91cb99549d177575f54a7a3ebbd4ed2b89940722927a8b9565ffbc13d8df6d2616d5b1925b87bbb6aa6d39f2b11d26d071fa30e63083ed5a5357ecf0ab1028cf0a43178486679e86fe4dcb071c49832c83c9de4599d672e5ecfc7c9190f1d7275f5a0abed80f\nB = 49ce\n\nQuotient = 43340591e68e228fb03e44a5f2046afe41a3d7ca99ea9ff1a445d75f95f2ff7f55fb914791613b5db7369121d416a5f92f834b0b5e9280b49a9e66be4c682019881e6e8883d7a923d2a5d309b9d265b01d6b8a4ee07f7552934f2de002cf961fd93f33641aaaccc7c367fb6798436eecc9bb22357087a9c482131e1065eb\nRemainder = 6332\nA = 42e75e3b8c23287044593d9fa4bc5df437a0f8e876d3105334a677b5ecebf653e8bd7e55dbbf6876005196e44980bc23df491949c59aa199cc9e0a111b58f954eaff2bd270214726e5c98de502ba71b42089fba51e8763f0c11f278faf4c61589ceb674d7c7c61f62f8d18ccd619c20243a508c26b934f06ddeec0421b372326\nB = fedc\n\nQuotient = 688c7120765f8ef7363f7ae1bb65bc568b16e32c59762f59f34a57f08839d19019313dfcc9e96d7415766bc0aa032b19ecea72c249bffa0538bb1ac06401657df2fbea5c46b18d8a79cee4029e5972d8361fb7e6c2c537673aecd727dbc758a3bca1a001765a216e9985eb7eea67ae979f3803f14587507ba0f8fa29957\nRemainder = 9970\nA = 688c0894053f1897a74844a2408400f0cec058157649d5e3c3f064a63049495647a124cb8beca38aa802564a3e428116c1d085d7d6fdb0453eb5e2054941017c8d7df7605c5546d8ec446a33ba56d47ec34781c70ade74a203859c3b049f7cdc63fde35fd658ab14781751f8fee8c42ff0a064b941960af4507d59309b50019\nB = ffff\n\n\n# ModMul tests.\n#\n# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M.\n\nModMul = ae2ca2ce7addaee2e2b7752e286b2bb6a58b51cfbed5c924f00398e59ec36fe6341cd83da43a33a12410f45f6228079c4aeb3912be87e2e81fa1799151bfa0fea29873097475b2c3efa312145d0bf7e51b2a7c9bc961a4f4dcf0c883ff90b919b87c21099fba40257645be31f95a3a277\nA = 6b18497fed9befdf22a01d988d34213f6687d8a96e86c188dea4172e7c6095a0d18d3c86c0f5a1af9c6e3aaeb6baac2a510930b3ed06ec78ec2e12b\nB = 1a058d99397db0d209f01212dd4023ae01b15da04fe62d1f76f21622b2695558c67d706c535ca7f19b36f8ef2d508ffd6cf6fcf25e5\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462c7cdd79b7604246a0cd97b40ea5a9a77408f13cbb548b56ee713c690dac0507fd988bf28e77462832f4307b08564a51510d4a951c1ad7564316dbead2b53540090827a8ade8092a6133af0e5fac7310f787dc1472836178ed6992b9f71224da3e884bef8e8379a58e6d4be0fbaf59bc520f786631857213305e23fd5ca65\nA = 16c92f77c139706430f396f72ec7adb045745cd9f5899b0074d9955bd32de66f57c05c7929b575312a7f1c04f19e724d64744bff7b31ad0e6171437763\nB = -8734c4a2361fc530f60b28a5f1c7e93136c5ff6bfc7553965eaca54c61e6befb3c0f8cef4280e780cc5940d21a740debba31f863ded75\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462c7cdd79b76042469eb41a7a83115eb84103da4ba438c3e33227631dc185054ba4e607141d1e60990d8aad4e0bb0ceb645ce9ccdfe72d4738cbe1f6a73ed3e070194fa4feca6001c4a853940a227d15c1f1cc153d8c96e90e24805929fb11e0665e0c41c77d5a97fc5903a8b215360e26f6a19922d650f460f7056274ee92\nA = -6715098ab2ba3ea1e6341e89936e3ae913cdd450dc831c8534071f3c362841e47d88f2cd29c0d1239aa0949f3685f12f8519625bbf10b2c7a515e6d00942\nB = 536d4b3e4815ae5ed55bae6950f5a8a61d52439d2800ef1b5ba2285b85ed0f6ec4af9fa0e364a6b14f6f6b8bebce9200467804e787f9f3e9\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 309b3e30f74c58beca8b2c23f64fe1203830db8a7e306e1fa2e2022f0d6d422851da509d1b2936f088f0e35effe12a7463f47ca369bee2f2980bc48dd8e696b2d8c6f35cf55fb8baafc2e613b4c684de26129cf196741aab873f81e498b1e03018a539b5eadffeb5953029f31f8579df7ec0ff3f752491910\nA = -11fec955948e007b59fc50e729941ee9d43d552b9411510b73f6b4faafc0465f261f8381d96f647267f72175883172918b5c866cf1f1ffc43c55f3c96a60c01\nB = -2b3792f39499767e0a8b7a6a406e470a78f97ebb36765beab5fe52e95abf7582736db72a2ebfdb2405e3954c968b350a459ff84ef815dbc5910\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9143ec3e9f74a8eec476cab17ad8636eaa7c60e108e89ae0702dbdb2b255a217ba2530c6fd52658cd931b962054a9c20c8713976ef3b7989c40611cd25b0a9ad0635d61f6dc95dba6e0c4a7d53ff539b623b97ba3d66344fa324f905abb861c6b1e830c4b0fd5f6a4b01f09c8e1408941291b2285c4625267a108c\nA = 7713413d87f1e50840255927ff27bad79e5de5898725a876e4647913158cda9f5fa031dd7fc11d2e8130a0ba99e8706341c1a98d5fee3218763ceb1d131e9cdcc\nB = 1384e60753dd4bc20cdabf398525e7c4aa40065255c5058cae0b2ec90a3821bea8de672a712431aef5864eab719ba621cbbd8b46fe86fb31286091\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c462b3b4a0432890d141c0f46a28190a2e30ebb2e4ba90ed132169cd72316b290dbf5c261984d98e63eea6525fa890bf52185ad7f164cf49f67ca91c2f35511f3bef6eb7f3da31a602a78e4752e326d79dea729f4ca6438f2aa65eff44bc60979b42e44f6a301cb5de8fb42abb47bce5633c6ae9479d39c9e8b507d96161e0fc\nA = 17d806d7c76aa8acb051fd9c0c782443f1b1b6387455f7cfb737c41658d0459bda5d13587055eafb87ad8d209bccac1fdc392aeca0774ea48799511c1fb9141cad2f\nB = -d7c9b6574354e131de4b8643d766641e98554a03238ebfce1112c3da5f049d6c410a7f05758571aa2625f7190b936a214797570539317b32fb94cfd8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 16c84ed15ec6352a8ce6d5c2bdc0d9f13b333072fc7041146e944a29391f83e346b8ac0bee6dde98a420ba4f8852801d7c5bea6f1177a6cbf799edf2146f8297013e0e796917cc967786788ff12d9c1d07d9ce4b897bd22a1b8a391d3b4ecaa5b5c85d0a03aea5145db6350c42a964a41ee5f83e7d35e14cf442e5d99ccd0ac8\nA = -6d84cdf18a2f53fe496248fafef183914d55c42267af3dd42a39515e80cf29211fd58454986f5fb6afb56170dd9865d3158249090270bb9af341c830522a4dcabfd494\nB = 6f6f3f74187b7d74dee92f79be864d0a2c56d4bca3283742e9cdf15112c8f4208e3ac8ecc98b44b4ad74b0671afa4aa9e48dc31d34224a1f66bb2b4658a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8fb782e4883ccf3aaa2d3e020b08993d580c69ec8fe66ecac152c5babc8aeffafe406736cea492450fe6adc25dfa2",
+    "e12723a3f9baeb02fc0f785b3db760ed28048e1710a78a2ae0c96b67c109c5034375a512b6fc7906847253f66316baa0ef90facc9ab992235153684d49d6939ab9e91086529494d7386f604ed69aca2f53\nA = -1f745c8f0c8fe6ce3f893d77fb274c61b72b2d9f9c5a2eb2467bc00d1f496d0ad469d76bce318bd64ff1107ee5fcad4469f84d658586a5789c068b0cb9b866d8fdcbcac5f\nB = -3a2347b491813252e8ebef1bd181534b074a368d076b8c80bde2e54ec3b4ec99001f43080c7857427e069d99b1b65cff998a141ca6963aa5fad1ee632986ad\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7c0c1c05ae1d6420bd93596a01aa0153000ecce660a8a14d6fde7d4740719cc495fe6681a9a08163b2dfd51659b3ae7db0fbe09504370bfc695457d7b32665a4df53e879ac817bf715d5bd6ca0e242b1ebacb1ffd6698ec90c442910a92b35ec103b345f9a9e5c7b005f8028da4dde80f36f6f6e5675040d19e46aef06040eb3\nA = 4c09264420a9452c6f0b55baee42c076aae5a73697cc6bbb88b7c922f236ee4c18e477f88e2c40cee03f0bbe87d3ac8dffd75f635315f856a3881c6373e8b9a286c813325d3\nB = 10474ece7ddae5c53c4df5b594439124370932dd94aa5d5b4ddaa233b1a55634fb7d72e33bf1b02965fa9d1538f97e1cdb5ec0477cec8ebaf202aff8533211169\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 481543f1556df756ae2e422ffe35aae020c9bde9e9b1f760b43043a4654de363dc67f381c0df1c3c1b90edb4343c47ffb8345a1aaf5dae56f446fee08a0b9ee8c42fff57143e10846610a9925be96418c4c957b4e92af734b96fd6f21974877dba52a0db1fec4aa97640e357434f95ba74b6b8323cbe17118dc489552844602c\nA = 11bccd165d9fa2d8b01a48c0ec549a6e600396cd2023f0240056193ad27e971c604eda8aaed6ff6be8be1001f3dbdc8655f1ae84eceb963938ae7bf428eb5c968f584798c1bd8b\nB = -cfb6629ddfc98a242e3290959f4d0726c0b1770b52393bc7488a471a90f7f0951362c03e67f443c9ecf4987f5303a789bf65e0fd59cc5eeb9f5d4f40d3e4a14080c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2a770ccfbcb2bad207d0e2dfaeed04b6e7509daef00a1df88e57509451739a8a0f15106ce8b53d280a4b4e09900420714cb6961ebb0e00e88567c5df50d2f2908b4bf8e0a9a5a8b3c6120503c14f16a99297459543c467dcb67915e0a10e19f72ed5b6891a6121b66abaa602818801d3306630bb04ea57e6b31b2c05e368d398\nA = -442c80289bfbf00db06eafbf06109b55f99786a323fc2c6db5686f99094cc24aef50475841243ec3ade2a1e0ff28b4032fd8afb8bb5e28f3b2863bdb9fc8f033adbaeb5f2ab16fe9\nB = 6d43e3c46f4a55d49e78f40d34033a7f5fcbe50873930e7c5452b6b3b176534e6e70033868c85b4d63052964093214dfd0bda6a84e893b1aae3cc72aa83d039e51c014\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = ba0e8c91a86af1001b13deb115c77609a1e7a3736a6b807255aee898e3100f469ef6222be532dedb1b8d3db4b3b55aa4b5da5629c83e9b2bde76bf2f2a4119a5378b5cde000980b3e58595d988ff776f0388fe025625ccf368e20914fa90dc771c826e4a836b2890e82ac2274471d586b4de5dab3278f0e70207562ac6e6493b\nA = -14be403d28c8451cac4dc83fbf895a9d2b74f730c39b0fcb33d7258f99211dde31a78f182ad1d27a559031d67d6f2f94a741f141bab80fc692afb452ee2d502099ebd5760ccec7f7ebf\nB = -2742dfd02134594edc6d3025aba5ca4a34dfeb43821ad84164510b43be4fb95748f8d0eed7bbcbeca14efe843fb676882784bb36c889be29bdad9270e0956286552119561\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 20c691d6544912fadfd9894cbfd42745991f39a29cbe3a1cdd302bd0487bf70c0179b9579b77f8481bee13ddbe42f32d734b6118af92884c946ea8576f6dec867c1c251c73777cad7c7c76e90da00ae07f96c8d6a751e5b18157dac4468c05d32eb86e74e0e8312bef85905af8193a3f5c799c5875badbc9eb7ead1258e56d7c\nA = 7ae9b4d5151b11bb7bd4d1569a6f4804f3b4d77948e0c6300e4f28d51c9a0afed2ae7503e53489edca5359e2b3d0c82a9cef316cd7e1c1275c31fc9c51a8c1e5fdf23935484e467d6460d\nB = 1f46f88d39fbedffa8501fa1268bdf3460aa98e12b629da59676e61852a4d3f8c59f72a2fd717fe2faa09639bc651ba516cd39297e0cac67444ec57c0db47c2a4e250033d02c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bf21b3cd55c0df8d4d568d00f757b10ef3de782ae71b289cb2b59d36df1341382bdc1825ba13199f2cf279a72968b3bbf5f7e3d13ea9adeb96d81132788231fd988eef04828119dcca21ec1fe844998909cc95a8d01720e883df27f07ef4dc3f09081015dbbdf019b96707c18b0b1db6e689e8f86466a2afea4a9cafc576e10c\nA = 1243b14aa3d16a55935f6f8ca49295e35e7f75b03de7192e1e8a479abc0a430e0d340acc05eb9a61a5dcbfe3ce3a4c5c940699f5043e924f282bd21e341edf8b7a6741c6ac72d7587a9e7a60\nB = -bcf08b2153e8ca911096189e35dbdb21b77ce89685484f574c89f1747612f39340bf1b204a23530abb36b2c5e195940b86ef1252d6729393c25d4c73dd434b6dbc3057b05d3f15\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 460539d96c07e72acba5b59c88fe904bf7f1e1648612908444b0b08172d05968b31b43456918b4287dbe01afc3cb4860d9c2fe549a580c989b6507094f6c241eadff910d2603f747f8e289e7a8176ca4a978bba89288a4cf875bf3e03939af966c54e77c28119a39d34a2b7055465f58ef2efe7c82ac547fb675653198e4b504\nA = -5a44cb669c055ba7c28d49f84bf8d12179aa30bbb9db2a48d7a6b09e44dc0e0f7471e3629cd2fb51e5a53346ae025fb49f9591ed1d71bc79daeb3f1254342d8a2b091ae07a758c1555efe59e78\nB = 646cc0f766346aaecbc5147a4488ce157a6d844045b80884eaee9d419087285fa71108b5ab4a05689aacc8d2e3dd0e6714c55eb8f77487a3fc5e56c3c2df0c4acf28a457051118560\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 79b536f4f30f9f7483f90e65e6456ef8072d9a7430405cf8c9377ceea2c676afc338837643436d55ac6af2326ebb362684bccc5092367209822581700d641cb8d331432b761e4c6e22639a27335f45a25ec019d180fc53dfb53d69216d7cfaeaa07db8288adc35b7bbccf2829631c1eebb821e4d3299015c3d462dc17aee5024\nA = -167529b1e8668938ec02a68bf4d76c22dd018c41e19be25e2f821f63c2046085d0af30d8b4212ea0f3f9943be1c14fb2d2a944551107cd2bbf8dda5bf258957325f06277036282977db4575b0deaa\nB = -378e1be10a57e03b197bc2b1287d643ba6d89da4bf6a6170816691fb6529c602eced237863ee39659be3729825f032a57eb5de0a87b0894d1a1244523e85b6f50a3d9976dbb038490e46\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 658169197ddd0bfae101c10c3e6a2b10dbb456048e81160b47b197fef439b1e0ed710399cfc80ead8e436f1c0399064f92da50afc335847515686e055fc7bcc0ca721184435955b896b0af4f4d96672ebed2f154538d49fa507b945c0a6ae926793751231980274213c80046666c28ada213a2f87509d1466b8d1b2122e93f8\nA = 49136d37ae8f3da71a6114327833e8aaf3dc8b5a9a27e9d04c953988456e525263f86ba94397321c2093803b789f8db3ed7cdba19c4b796500b979e02952e1625246f8e977e01fccc133f94cb22832c\nB = 1dca005663385fc00b4fd58c73adc7589d15ddbcb8cb2fba03a737a320c447a2b21e576ceda73811a31d8277883fd31e22f776bff3261a098ecf8f40f2855b0c723d1265eeafb43f85323e3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a49fc8084f3e780537b4038bb769b8db36",
+    "53a3315298a99c2ede6739a1732a636e9787f2e8b09d0b9bea08fac43cccca71a315e6f4a7d6417d171b4693dbdbee8cd9f95be0847ffd40ff027267125d67b89737e1d0365bef6c4429504d13cd8ddc7810f456d6293c0c57c14a307b94010d79d5c13b92a907f923966fd3c5c8ea\nA = 1e7d8de2061cca59d1cc19b356a8fcdf2ccf917e0d81598f014167c5a8de027ccfc8f2cb8c37c396ebaac83ba862c146bb2d551d10ce03de9528f97725804e8a6de57b9d9da811200604c2a032462b6ac1\nB = -e38592f3acd75b575f64ced439d5ef2377d21c61bc70625639b01bf755fa2c6de803ce155744993493debcd4de40860bbfcee86d0b117d7f8c3f8ace68b67cb6fe7a81a145535553896424f7a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5a99c8a6afaa97d8e7d84f4899803c7786b1bfd2ecabdbfbb3bbb92247ff91ac213a72f6d23c24699d60babe91a7d9cea751e686c027fa1c954474fa5680f0059118426c71299462b11de5f2817d190599cc4b352df4d2e80605f9ad1e32eb13712d3027a2b6a19d52151e37e7fa057d8fe59dfc8a943a42a1756a38f103a75c\nA = -7df29221e6a102e32757c18f87927cdc90ecb012ab0557e0ab855daba832d76ddf595b9c5a62988ca968b64fd5bba2a147a5991810c17cae7edfde38bdbb7e13a1fe5206724c05a9fc9276c8d4e503a860c7\nB = 5c586d1aff7dafea3b8ee42e0e8854712c95385374b5bd1fc8ec41a72b296e070940c4160509a4a1699a678533ff3d12299338fc441b0f01e29a48677bfc5aebc644555285756e97c74e1af6aaa8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 21fd2d881b6a52332dceea42664aeae1ca110512c13bb33e25ba4ec0f39f80eb73b1fa0834c998c23a2453dbff971eadb183c51a30ba78d593f23be9cb6b2b33a554ef31e4a36e0314fc2ec889f18debb956b89d1bf8172553271bd56d89ed0b30abb70e68abaa2c76f73cd5a3de93433747d09c845b5f8843f9fdf9f6c975c8\nA = -19fe3bdddcf08190a037768b77666de803ca4f7f0d7dbe6aaaf334a486dd0da7ca024d1b3df11e0406b0326595a171be30b04574c1a7d04f4d2ccd334663690fd20e4fd168386280510a00a70c1a11e99483048\nB = -33b2400173c057980b0e0cfabbda1a5cb5b83b7ae80708c199f28142237f04b071c6eeb63d42e80eec04b76152250c9e4d4c4f19a048cb9815dce6e66710fad1d27494db5c31d9af37d2aa779d12d7f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1c45cfacf30682a876cfe253f05b393a2cd4dc065ce73126508ce897a99a723cf5145187643ee62d746f6edf70269ddce3c348a1432316286a648ee9ac31ef87feb14f25c42f2dfc2e84bb5bdb4ec0124e249c526c55ff2cd0ae938555c5f86d856eb181572ed01dc045f1ababa52d249e56aba0ecccda905d7d1e64bf89bfe8\nA = 6a40d948eac2fe5bf6db15d7f6b89fdc0712e32d39a881c21859e8f7722391ce05973efc7c40e2c0d7f56c217d8a986bfdb08bf87bc0435873cfe4d01967c46f7d39464bec411d0369f6f5d1d83f42596fa47451d\nB = 12529775e8253ba220d890d4912fb95f91e4edb59610e889431208b6bb42b089cf2aaa12ff9ff98c2482e7f4cbf35b22d15fa28aa288217bf766e937a706fe1e600143087b0a67f668cb7b762c9b9f38c0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3b3b08e8eda8be3918bf648227eb0d569dd898729d9cd54deb32b1a1dc69cf7b2c4184c8ae9641f0f75950df263a5e236f428ca86244e617b14a04edd0f31c02bd4d84f25bacfcd4a2786825f0361251475eb6c7e99020dfee4298a1f1bc260d4e364a332bc6f651dde7ce5026dbeb0e5aa75ee98874da54c7930108ad28e3a0\nA = 149d36918fffa682cf90c4d3f3d48e6408e7ddcbeb44e78b9cc7fbb08108f65215761a61d79f37ec8f67cc51e0a9b4bcb3834b0ebcf6734985153f29a2778473b80147eddc813b4fbeb98843f5c1ae6cea68f88dbb4c\nB = -ca87f66182e271a69c0964eda92a009d438078b584c3eede28ce1a501838c5f497186d305c09922f32ba858fb55f2a0dbfc9cd0f93b789c1f800cf092726d6d33db19e4f26c7dfca69b83925db14544ebfe2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b199655160d88b6b4157ada0e5675f82b33b5592408bb57c46e2f7d8791bfccaa51436dc3b772b83e907c20ce7edc2835ce96595b78c0647d244e9bad6f4184e0003eb0899e7a47ba0be888b9bf795eba95e5073a85c4d20416fcd4a8d4e1e16b403deb38845fb8bf9e9264d68807acf02d579e8cd104cf2bd555e6cf73d0450\nA = -70ccbb73e33a7cec30ef2071f3b1f2e008e70fd6d00fe8b7aa4b9146fc6d0549c57d984cd014c7e0a4ed6d33376998b7c2c9778fb9580d8ca4ba795c88612721c153c186740c58df3fa63b6cf7a4de76e049217218c05c\nB = 6cf4168d44a8da8e8446b4420466fefbdeeaf9623a40e10b77547687b25f36916f2c18cf6060c03b3b40e0959479f6aad5e44dcff0ba799262ef53e280f4a7f667d262d472b2e573265774deb5ff8f25dc1822b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6ff91af444c61d2e2fe8ad73bdc5377d5becd55074eb60f0f98eca3d8f4be8c02f196b3afea12c36f78b78ae6a5ab677ffb7d9c0bd58987cca816affe468c7fb4b56055f5d2326532d6ed1c00ca2d052ecd103994e8929bce04e067082b4ded7e1973566f99c514b4e0d95b9a8a931ef4f6355066940990fead70208a63841f8\nA = -1c924bea12ad6f8b65abd1796e381fee2cfbec15138191bc22d57165928794bb080c83878fa5fd19a5d657b2fa91165459966f50aabf19440f7d75f027b32e999ff4d3f7a7ce878fe0f33a847d644d86ca19713ca9968d97c\nB = -3abd4b281b8f25f5957d1f2fde904457d49a3a7eeceada26b454ceb4ae0e879135d376571f08b5038b7b3d73a9a9fecbe265b72375756a715a523ba66737085e5ef7a4ad988155adc93eadd5d95a0faea56914983b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b9076229b1a1241e8b4da3fe143ac31d060785be6ac1e841c2fa9683d2bacff2e2b5dbac33f58b0b1718ad2053c37ee55ea54a9d258ddd8930d2784852844d85db24e4721762839a5c73cfe588efedc8932ccfa585e1b5975083919be9e32a86dbdf5cef84d3d4b2ccaf7a006c0cadca1e35fff2da9da7d7e779494d8f85bf4c\nA = 75eb0fe6c07559c2b0c7b2acd7d29b5798f6c4cda64a504ebabdf54bdc773ab28b218f0defc040016178958d5561796230b71edf49bbdcbd3f14494859843c8ca7a0f777cb05827f2839f3982832f4f3e3c5e50af17ecebbbc3\nB = 1b8aa718d61447003fdbaa748a9d86befdd2675a677cf34a1be7c81e4577f665d71135a8a243976a4f6ffa1636695567bde522f8fb1948033a7e0941f833d827e957781cb4349a08c6be418befc8959960fd5fc1b288c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9df82b7c34ca97a3a5d4efa28d5ed4f35484914dd73af9090c4bb31ea3496ece8ec650f4e7b07dc779c97e597e76e43cdadbfc6e72b61ea718c073be1cd204f8ad2bad0df1e530e75705f3d3dc285e9d793c8d42f04dc20773d3fcda8ef3ac1cb10d33d20a91add0358ab8658f49d2fe51d0d2d72684e31c0eef85e5695bb4b4\nA = 1fc2a171445ee6add5c2e4d29e50b91d83338f8d63c111e4d3e95f16d2a33be02bef24dcc3d6ce6bb8f1ef980dbf8fed409a0232c0566153014eef840aff58ed8c33e8d463d408f93e2f5381a26fdea63676c4e5397eba1d39f928\nB = -bdac7a177c77451104852bb99004ce8e617036906667258d85adcbe8cda21ab7d03aa7dcf62cb210a9db8fc750c7e1ad290b35473be0fd607fcdc686de0b78fd9f258f5b25e2ed43c2ad1a38859f882b9f6b293dc258659\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bd9f3d2e8a1086b177698f87a9860e3a5f030e04a0bf4ee9436ac55e005bda01ff4ac662cb85d39e98a41c723ae542a83a936c3bd0280c6801ffda080ec0aa4230b45dcd0bc5eb41cfcf272028bce3572847637a92d1543bb2b8408e880f5b776e1cf14fa28d15cfb584f025596ff10c9f091c837a3aa622d9e5c856db8ac207\nA = -7fd5357cbee7c5e31fb62ad03bd47b705b574d915200fc7f1013d836b9cb683db020b152ae9464de6aeb8baf",
+    "14999ac7025dde6173fae6ade325c60ec310eff6dc4130a8efffb15ddae90d760cb7f76a27d0368175d4a44a22f7f223\nB = 5894a0223e4aafe4efd4572752fbde4952c8b09cdfc35137e7e6ed650f8fdcfce9de673853dbf73730b159b2656047e69377d7c5025a6b346fb08831e64bc8bc34b75765012460d8135a4f7a0f41d768fb85abf17f5e2f5c3f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2c61867bca70e8662c7e5435a5aec020faae86fb079b992bf49d8497fc5f96abbd38a6f04f6ca8510e0160e546b3f68b7baef4ef0f404e881771cc12ec5ed3e3787c2d2ad6bb957cc59f8d56f0afb4bea49cb671cb42f4e8a0ee1dfadb6fa14f84a5b3269dd33e20d658ea4cc39499c7a39a4b5650ad7018d32f97954610f676\nA = -1bf5ae15f24c7c14eb59605136a3f679f303cd5b81e4a27465281d17715afdc2c231d7ccbc59f80ad176f4e0326eb757b52e3695e27c6776d7936da47e3a8a904f735b151422029535045ef489e61ec93f02e6d588491c8dad1cc311f52\nB = -3238dcafb85ce557036d19e42e7e7e473de9f9da6f920e18845dd010546868d2652decc94596cd2c36bd16b02c02559892b9f573bf21ab18c3c75591413d046b385d08aa66d849ab8adc9fbf788e837b047a7ce2b9c63f7fbd263\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c1d04b831b712d0619db462c3f3fb5973f5984e9a48493ff273a5abe17a548e185d751628899e2851e425a7d4b2c72d4d908dc813cd122b8f497e08e299dca9166f19752ff8cd9840a70155ed9e8c063a3840838b3679f96f1cd5f1cbf0e037d222029e02769dce7fdaea0bbb5417f85497d77c76a387c6b970eac15dcd128ba\nA = 7aeb60c134e84f289e419b74f99a5ce5b4aed5fc630d5d591ac7643251ad32d6ca7f052fdf8857f67138262d221de644140e9018f7b84879d74883f8f251303f65e06bb52246ec6a912772cb698b47de41c1826ddd065359f6b9f1ccb0cdf\nB = 17f81e53d9fa6201e4d3eeebb32267929cd5258d10f053e7c021c4afd17094f8ecf433b1ca752f8740f6d6bd84f801b1b9fd64bc4787b9ae5e5aba0b4318a63dfe27e92d5a3ade192af7563c74c9d6006ae7701240efdd6021a83cf6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = aef89874854ed34deae1b77286f9cb0e3017e3ae77fe050bb244acf4f30dc03504c73c1a4d44b769709bdb53811a5d0f8a76a08e6a66fc2cc4e98537ad6a8049f02494305b89a49a55e71fcc3f5fc42d6b478456ada9b19ec0a03f5ccfac5538c0040092771660312be5e51996073ff1a506d7460c57d54e10dc2991c028606a\nA = 18d3af14bbffbfcabdaabe44074b407d69abdd80a6eaa5954f0e45fac85af7ced1715c78da872f7a8fabaad3207e31f12b7195cdb25abef0a1e54d3b13349d997f207fe130d7985e2033cfec899a0af310c9827749cd22bd062eb0b1faa254de\nB = -85a7d9f08a60031e689b0e611d7f7f46e1178eaa2e6459602e738990c77f4d3783ac43fc04d53504cf67fccbeb02f9846756f8e32fa4a9316b6d3b45f644254077bef096a72bcff17ffa17070a4355121cc5daa2f782fc0d0bb48101db\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 14a85edc6297763547702c212b1a8274b8f85d53ef35cd1b01ed51039bbe030d0a1b9626ae2f571a43f1224d723847a1c6708f2238f6f6fd75db6656e6c703a5acb57f69717efe8ed58a3713ba2720d8c001d026d83de0ce5e24b67c41daacedaadfe404aaa9b672f00562e6901fbd0710c4303fec41ee3338100beb36c9b1ed\nA = -44414ec207060d105f599b9a66aafecc5b232b55214c1a5e1922f6b59439b3ff77cd3a327bce4f7406871196b90350e6dca9aae147ce03027dc4de7563c734f111d95171f489105de5ca80047cfa43f7e932917b816ba7d41fb95b4106745d700f\nB = 45f2cea1b9b75880ac3ec206740cfe0ecceb488c9155cfacf5885a8cb49be78af8cf221ff8de2328f4880479c031f830a3c9eaebfd83f7de501b7c5cde03c4720c56a676d331b2a13c4689a2e34a43fc11f62825b8776e75d31225ca7ff65\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7670c1e2e141d8f8f5466de8ae2e0ba2eb3eb7634699eab8415d3a37f8df291d00def88361e9fb64a2f116433dac3ac2764fd62f3201dce4e48a3b7019e5465f82241ffda29d5eb0462fde74dea3168f8993ccd4d090b9c31a5a6cd7e05f725bbc89479836b89379b422250ab049f31c860110df5ed69089716877fb0ad7b0dc\nA = -15b4a2f808a85a5bd466a342c4853c04ac0ab73f8e53a4a0477f73dfeb8d7a911ab2eb5d3d192b9b084d0e38db491148947c66f838aa5f460c37341b129137614259efa531c0e6ffdf163ec6851737037a5299060418d96da035e6f583e6ba79d0414\nB = -3e94fdf22004384f7881875b1d8f58019ed8afb1b6a31f5d591e77b0998f3100b34174d6f3466da44b4c7fc8b92ccc5679c26c146b704198a65a88554d24291adcf897bd758a035361f671a82972b5962002c6a828792980f86a64547165327f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 35b49beccd8d2010a8d777c1ff69e28e01a1bb78c6466e717f0a934bb62f9bbcec5ed29f9cd2c14d240a6c33b28c986eb9c8912a4927605532483dcfd31a50876e1819f3d7a0f49bd276ced5c4110470244fca52d2611ed7e31cd8b73e749aa70743b39e92810b3b52320342a65cad3180f6e2966059d15f79e5574348f5f66c\nA = 6fd078e3cbcda6a71a710e99204da640edc71a65974fc765999a74ab50a0e4b090d57ed0ee869c8da2cf694b6fab56e87c4af62fbe73eb8890bc066ec3460beba04dac3b8fae7e4f316e8f954c6e8d934e946dfdc9f4cde0f26bb3d40d5c444b03bfc65\nB = 14d8041a3b83468d2f44f150ad8d8d0a1a22035d630f2a17b70d5c3d557d3abc7e4d753e1ebfb3a3ba465520b84746073d211a67e079ec7f47c2cff9c06da69bb5cbafcb6cabe7e0018867c42e07931d6797d4499463e3cf786c6d5d6c8cbd600d8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2f6e0fed8a9720fbd83ce950d7545d2c6d5b271582194570424f90309227a51777cac974bca0ad3c1289ceb91cf75af73b0645cc20d71e7789144876b8c1bdd550328d9907accc316189e8ad81310848cddd2dbe362c9398d814a048f93f9368fdbec0f19ab87ad2a59d4066d738c3da3cb71d4716f2cd2336ad35ea1438276c\nA = 14bda9e4aac85b0ab7abece728f61450b7779d3b5fb83be813758e742d2ad76597f132aed91e20a75c554f0d61ec4dd118eb733d04942b2548b1efdb4dd22fdb543d9bc1e4bf0574ae2cb2c46fb98cc4835b6a074d6df1a3bc5443beabdc784d542e3349ad\nB = -efd765f8ffd72d041ac3244078b8dc4482233e9411b289cbc2cfc26fed2cf28e286835010438ddc9e7021ceb098b10c68bcc4732608ec1f4052df9362176ee14812bbf09ccf7c2882714ecbbf92bbff61c06e9dc35a368208a05dde949fa2cd091ce0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1f0c436379f6dff55a59093ff2a0626a9b959e3e3e59365afc33c7a7893f04bca863ec910c446957baa8de4e35a1f4e9c4a776ef41b053f03b775f327eb7e5fbe68bbb478aa4339ae703ee4b573d6931e47e09271d40239d527fe77098a7fbe519f5eda1f26dd6a7d0ee6833efe37187d8a85844690fecf9fdc3a4d80b921130\nA = -51eb34de29ba24d2b1fbeb0a1c324f4ebc69cda2dff971a315c0c2775d988b03ca29891ed0790f3dd507a1d26ead461dade9284613e45df338dd83aebfb66050465d8aee554970b43f7d4e0428e1512289fa1f9b23867b67095c455b66d536b91207b749189c\nB = 55259a1122eb7eb611a69118d3d42c2f05dd228d71c0e1e42ae3a8d3d180a95b74150d844e916ac85105805126e4b995f2ed1cd3fcdf28e1fd241dbe3125dfb3e4d90556256eb513a2f7c9b596719c83b26931d92bfd3573560e8bf054138f5d6b9cde72\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = ac321a272d2206df4dcd6ed8ca194a1049c1e3a20bf325fa44809d302170f850721c077bb5d792f86f7ab03ca259567397cc2fa1429771190bb632ac2c92d3fccf6e05e13cd33149994cda5f9c57da155439663f6a13c66f9da553f5038fb92fdba186ed9ca04b8ec87cba4c5a68c8edeedb94e38a6dbe293",
+    "340dee1a4ecc768\nA = -19ac99d7d51456b00a193b3b04693c7e5436e05763f0154768db078ea5111cfe9eda3451091af213b9c8cc649d341de66c12ab2803ea39655d3d7de182a77355ca444c5d2778f791d39952a7a11839e497f5dfd8a703df49ec4d7628bfc25a992e94a6477e6be39\nB = -286d1d436f113308be594f0f43d7a05120639152b7e2f93058cf602cbdbc016512bfd23f7aa937fb358b7b602d15998ecc150f2b9224c58527c0c1267739e065e24236771e2c683957871637468181e6e896b513569bd004b9845f0f0e4c26a5ca123365e1c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3466804a1b7d1af8b6060aa93a4c325d9cadb33ebcc8bd991f9e44cc2cca8918411efeed0f005790d649382ec40278c8cff903cf3db177d24466c58cf6a56ffc14e595c36bfefaa2327d37f616b1466eb702f5c49170598bc361d892e18051b8233dbc5b3fd6832befd9a995bcef3b0f3beda6efaf09f7306ec203172e78264f\nA = 6710c19330d3f974fc377e28039e0c0ee0a558621fd67fe724c326537c18c66dc5eec60980e07d401ad5556a05688d2dbe7b271f9d5eda3032bf7cb7c420e7b5d65a195bc037090b6fe83064ac3731624ce2baaaa62a6eb07156ca12ee51d4321988026cff573ede9\nB = 137ca18f47a151363a3e8c52dcf024262ba525ec8852e8e406f460fffc2cf88f1999b17a5821849317fcd84d09c88ebb6eb0340120f113d7ca5fbd91c6a40cd790bce7b422552cc0cfd2a6417add2501db1667f2802e5d0f4df824adbd033a90a155cebfbe0b53\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6f248a70b2cddd9627b32fbd130f05a604866799365f94d97f1eb582b28192959692a870be7c2614536a8de84cd8c1364a75a3927ef9dddbb8c6c87dbf526f2d3a7916384f2daed96002831173fa4a51863c28b4378f99b1b201010581d5eabd66ad1e328cc4e647bf5e0588bb775e130b4a4d029eeeeb5852c5742862ddbc3e\nA = 1f014cdd87cb33ffee623cf454edf2c476e91df279b4f0879637eb6e8e5ccab305186de67585595d34ebc195fb150408c4620cf6c7a0b0d9695ba0e0e1d7552ca7d0be3dd678b1cce2beedd11939891a6804770f1c843e16dc2ea6aa8e4043940c37fd3d950caa122845\nB = -8d8d9dedc80994fc5db04d8c935301e47054250fea9020bde8d5fef01f2307cbf458d5afef5210a369c396287c5eb453637a2d721085af3de0d75a5dfb5dfd22fde3b229d438439af7b296b9e68ffc982efc6c825556c52a735f8be12a214a06c4270824d5268fb6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a35ff7e232f047e575b200b9fc4c9253de6ac04c612b8a82c275a951075eace5e7d6664fe8f78301d554cebe7b996c1f4ec3ca59d8d12d7196eb3909223de94c220f0445d24233534af1c93433b05c5924799d2c781fdb88c4537bb8d442e6bf76b2d966827bfb4f40378a3f135103513da056bc0d375b1339561700d15a0227\nA = -58346cc8a9a1e5b8babaed8e7f59415388e0db654ea7cd465d96781c57faae7a8af8e7578e46f3a8de7bd1027188e1cc32fd1c0d60be24fa3289a12cd822a6c9a77dcf8799624856c27ba88fbdb047473274e651760581b44457ed048cf76c166d38bb9b2afd3416ac7e45\nB = 61951a16dc6466a9fabae99df29b7229f1ab96b476092dca1e4f8fc8e7404e2fba56ee66486d1f27f89bb3f86f271307228d7d6cbcff943961e177300b6acec1eeb46af1c5725f745a2d2af0fd9642f57a09c9ce6742114be0aa6e939e638bd5c7a92a7c206b2d36e35\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 90b441d8277eb1ed454964acf567067925881b5db0b446a7d554dc61ae87ff979bfb0e58ca1706123453e62ce31284a5a2db1228d259e27abc7fb5cc5848dbeb9a6808fa1b4afa844ab39b652abc41423c2833e1209a1674db518b6df7ebae315dd7f416df54e73088762ef64cc2cd0a08b1cb01c49d9299d149cbe84145a55c\nA = -1ebb693ea7d18e0ff4a9a51124ebb78bfa3a4635b75a6387e9fc745a2325409f927324d1289be8a4f5cf2d5c04adc7ead20564f97e453287f03e5ab59a6133584f970446652d05a131d7d382c47b7cb97580ef6710a532dd4f5a0369dd3db500ae5a3c5efb587cf0cd2638382\nB = -3916ebc4653e7d6e0a4f1e234d765d41e9e948b5acd7ebc73cb595559c1b20b037a3c8da0a7aebfa5fd327bdcc922551cdb8db3fb0a581fa0620ca2d2559ccde3ebc44542b4d80926d061e2a35c08c09547e0cd587c396ff2959ee93ea64b1e6b7e2b624cdf445988e1f42\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3ac61c3a028f4a2df6645acbd36818a2f76a3229d229ce22471760807585a909727411e8b68bfa4e76adc459409a101a1ce83900d46918e8d0903a163de87c07bbafbd60c7f536a62c59370ea53b6cea4384345343146bbf529334b4201ebdc7585b6e5eee42696400c9be9f496406a4eb51d2fd1b40466224f1752b181774ad\nA = 5a16d5fb9047949684b80805e5d962bdb939d0d0368b48517a2a826679c37ee0ded4fa83e657192d9ae84294e450f7e2f2773d1f13395169582cbf95860891b9fdf8f3240a16aadd1198e884f22b2718219d478e2410fd4bb98ea534a3626201959af099fa55488f5390791bcc7\nB = 1f67066dd06ed4a49cb556dc2fce22814754885a7cf6c13915d974b46b0e6269c0fafd688f45ed2deeb026a7cbb772c080dfd577d21ed2c81e50e7537a70dd550eb94fcdf626500040da88c43dabce13c82a93769a9e0ef66a471661292dfd3b3af07169e2dc909e43678400b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7087dd62eed6ccffc7e1370cca9444dccc4ff160458941aa9f49dec1a2e9ecce4cf50ac2daf06994c5010cf225cc92238cd60e1aed9edb2befb0fb354ffdde94ef5e8ad0415bc95851d59095a5c4850ec52a74c78eab58309f395d3078dc481feb9d30bcd9f113af7a01611b94d085e32193dec738a64c5fe9bdfbf5dbc98cda\nA = 13596eeefbf06e9ead8d883113d8ae6cc3da8b6fa13ab66681db5a9c083ef9e49d905ec19c39b149cc09452eea0446b29cc92d4e865e6f681827336945282fa6b276ef552363229a976c503b822e6e4a9862d3fb30dd0c3627ccb97a7046a6a679050a39166388a9daad5ec5555dbf\nB = -a4e574363f2e5982cc087b38110d257019962fc166c2d6e6d396220bb308a8a0dc7d90c5cb2ab85faa19b07ed7dc11eae9bf2abde0a5fed279e77a717b43d35e70fec4e18445e37741262d0b0c20dc4375371d87d839d39934f1dc41122e815f3f37352d04d0cf514738b351f02\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8495eeee238164082240ae1db1e3c1e36fb6621e6b714c9de914f9de8a587d7106b8dc5214f7c60c0ee231d7441e03cc26462e71adf8e29772ac95d0395722d2756f9f64daa8ed41d7ce824a572d7f9fd419112ae823b5b48b8aaae09fe093e9ed05918c4ec88ab159890910837ad0691849b44be95993682b2da2b124de39ec\nA = -403f21e1a7911806747bb78a4f20c4e6572d49c6c4ce071db0c8c91ee985e68a16e60093e4628414b2673d25c9f13c4c43600633af95017e3846512197c9515aaf9953570ce5861620716b3d80eae7de0f033772fba82652484cb3ce7cc189d1fafb14e044e07a88da302547f2e623d8\nB = 689d1b4a968b7c00082ae3a29c8571f826c4630c947a7767fe4a71af43a5de84db9b5baec0980eafd0019e09de1b5c56173ede68c9a6acf260bef3d9a03f4c83a33106c94ca7e1a8615b3553088d1d05a62ddab0f1e5a126df5d960f67e3b92981022e1f0358c7970bb2fd5dce7a7c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 397df584bcd3b2e1ec7ed89de624e9d104bd6812901e38c5740755ce91bd54155c0b624c590ded199590be5d98bd1ad4acee56a62d05d6b5fdd1ade12f7db8e3eb08c4a5996450cc1204be7ba61b768af0efd563ea478033324731e24fedada1ad6e564238c891494e85ded4feb2165fda22f75bf120856034a9206511885fd5\nA = -19cc480d1e07523bac502872a971d78bb26955c5453386f5d51767150e229daad3ab2dc85e0fa0cf6e72389391fe627fd2d9f263f105508642eae5a095ec4d88545dc9d0a2c436907460e1ea7db174673000eb2e0b60d57163ced261bd0f6cd8ce54133cfa10591f1fd27996353110060cf\nB = -39c45512fc7c9620194fb7ad22abea8f6dbff4a137dc4523115ad7e262934143cf1f320892f8c097a400d4099e787ea7041d0d69b6269d191fcdc8ea28340ecacab71058cb39a9c7362c848826b35ab560c27113fe53c497ca452397891c81365b6e7f07f9",
+    "16d47961e50b8c7c5cab38f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 263ab04c98efac12210beb66b13fec7c260c5b1cbc20cd732a511fb3786b917a617d6622847f4eed70f25982ef5d0b0d13848c62dcf447e3a1d491f4c80e69cec03cd318f6f93134d582210bfa81c1790562053a71091333348c6624d4d793fd6ef971d284a4ebf0be0771efad302015abfaf3edba017907f10ea14a46d9fdc4\nA = 7a354753e39b9ad1c0ad6b65575fc7247487f3ea320fa82d1d333ba8dd5d0ff925331994a6961c9c603be5775ef1842159551f0bfb34920b93d90ca60e6abd514650f77ee8ffff2bac0eecd0fe8ea0fffc6ed0285c9f3c3cfaacf338043975457d62f9c8dda8cce1e99f34529435016fe2ed4\nB = 1a4384f9620567c698ced05870b4dae983d8f0df6aec888353f9dd6ac8ad54340c3ba8346bfa47bac38897f3963fce972f6d55f3407ae03f5c7637be1a34e483e50dcc27148b76ef079f117104162beb191d146ec828ad5c5bde5ee1683a031d554c276d837bf1f2f622cd11baabce10212e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 91cf4d1899e170bf75dda0d51a6481f79eb94c333b876382c9d04681073e949191223926523f6531f0a45765d7f382221eaa080d7bd05a3c19220ebe18802b15d8009714e8e4e9872223049622ca02040eb041707c7e525f698cc361847c66fe3673a72e4d701466bc374f55fa5437216eb59375c0e2c4f7020149d0118ea72a\nA = 12f35c48024e8271e8f9a60a48b5a214bfb6595a837c041b230e6ac87a4c1d4b3f93a2d3a193c750c9857c8627d0f7c454d6c4f224dbf14a865eb83e990b1d9b8bfb729b8d3dedbbe9c95032e4d60676c2baa2aabafa698392590add3b83b521a7a5e7d6f8af207e44ebecd735374acd01ef5822\nB = -8fc18f92c0613d085cf3ee6f586b39b99ecca864bcbe60fffc63c585e5613df68f3534ad46e244916b1f9188507a3692526c9e403b8e93480b0a5a6297f65215f1a5d8e20631a9d559fa1acc15a98c9397761ce18903f393b10444ba51bc92ac44df90d4cf0852da9d75902230c6de6f26dfdb\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9af562a7b61c6c84c91bf979f32ba5d246d2ee2050f07ec2dd5cb3f9496bd37c3922ecb2b5b17085a13e93ab2dac6022077cc18c621cce3a2d2247e5e89de8692a36f596e5dc7a6969a4f3ff0d1580eed380e6550c6218c1938caa2b7ab401ae6f520063c811088504d60a19da3b5018d640ab8d340f35d1337a2ede8bc64bf0\nA = -63bc10b8fbcb391dea305fe61b404d3bebd035514a812d0e1d38daa3d67f9f1bb8f02d2979270cb9147aa51d66ca73d4b5787e472456a13fbe0d568e92b622439d33ad3c357a56dd26806ebda7b3bb592385ca5dba7e5eb5d85eed0a1746441e8d56e22decdbf8f4296e30d222da5af17c427e832b\nB = 57a602bbdefcdd00f42ed1e2cbde2ba858d171804da56b0ac87081424ad1569df1308fee7c9ed349eb496d5409c4c46921f09ff0830bc9f57e920e17df16523598fd90314141955ddb84a1522ff3ebfa812cfeb6670525123476a739f64ebe6a5f1fc805a880f8e5a71b908c483a121b38d05cc2c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b395c9f264172a3653af6637e72c4c8e564d1ce68032a5d761bf546e0c4b51b33cb026bb4256fa639ae98e54e5ff7d8921ae411497272b53d97c2c44b5b9ecc5aba43dde201f64f1d033056f19ceb0cbd04decb486a1d07ab1c64fd213d7eb6db9cd11efd743462e137f368acc4ca0b49a7f85587bbb5ede4be1616889e2699d\nA = -1e71df5f04001f6468c3a192086bda948aedd19c5da9a5286856f30524238d95b0ae71940f2af123315ab5d2fc61964d3e970d5858b7c1a78d0f2cfd10cba7ba4830a8c19a09b59794ca5d7da32cd8376b5ab06079b51cd9819c0021ea41a9e43aee147befdbb17a92cac7c7767705fdd908bcd291fbb\nB = -394c187308320ba1b14d91d75b8ff993dfd57f9c84e8185f12bf9924e046629ffcd7174879f9925bb643988259cbe9dc9277fa83a25012f91159b012f1964aefddd5a94ac6c2a55a22bbae93085dee079f84cea1d53dc4771901db9a3db5a14eb17c25aaf5377e2beaff6276cbce7cee97a9b8f32737\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6602ce0fb5002eca37e85b60cc871b7b2eed13d38c20a37a6e0886ee4814f3ce2515f8714c67ad81e8c3abf6a00464e6a51b15e55b6c11296ada43cf459e15915026d3260cce8fb796241fc2b0bdd2b65ec04bee3b7ab6626e10597f3b13b43d16c34afd5b43a219917626c88b24c6f8392bde1b2e65a50b7f1a8dc5eb096702\nA = 4855ce75a3d7dbb72a257f6291e9f6ccc158647aeb2f8beb3e8fb32f6f59af1a46617b77440798562d6f58bfe826d3ea7dd28daee8f5162d7d24ae6c24c2deb2669b15898689ca789e2005903f3a94e991e7d3c8f3ae6181029d959bb15e71d7ba94d2dfd3ddd10f6fc49a65798b5f6ffd64682c78b5d91\nB = 15b3e9992aa3f042fd58ff97a8c04aaebf46b75fdc38caa9224394a1805cc26e4311bfb498d5a04d19396e98d11c8810620979362df82b23a115fc1711b57c7a56b8408e2682a2edca36cf9311addfedd2d0889a78cc1ab170d1379245de6f1f6f4db815fea9130463dfe5283f195e6e81486a1d39634aa\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6a81ccd82f00d829bac186fb38b85097d52afa3ca83a026856bb83f94d6af6f6c6f3141d433f8fc159d11397df8d2f44c769f255cf8148249d8e9fc4f59ec3bc8e804d7d5189e71e20b8d0e540b59a2854ddd7feeebda5a95f17605e8bd5f311a63cc2e4ce23a51229d0a49ca04982c1bff79c201de6cc6150b690c98106a39c\nA = 1f1589c9b5ad9d878631cb03c23ea7e94680220856285668838452a63b726e01709588b38e578da8a4845aa5cc2e4723beafa4f81a1a2e463f67d9a3e432de7064ba8bfcb943cd9efb0e5a136649cdcf5e85a667917075804991b997f318752304f4946d69abf161625ed0c03bf9abeb4ef28034f818e2a643\nB = -909dc7fcbd27d0bf7d6a3d0e2937ce725b5cca0acf78c103d633206cb431e2e2c785aea4bfe2042df32417143de76b71d21587112f36d067f878e556b94ef63d59a07d19647593efdba7f3f5324d64c55f93a283a0dafe080167f6576053f9beb326994f4a1d53e18e3f3e770e69450bb70f276d128e48ecc\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 69139f2e10726f83300505d15dcbad5b5f284d1c06789181683b7b8caf35dff063dfa4968c35facf32a3628dcfc19b3fa4c30ba0e030b06773832a2631529fe0c0c402e05a0c4e9446a8b6c22754c70ef540f90d903d83a2e3592169ce6b5edf939ac5ff25b8bd48aa2425321602a9571661a1109e275a3b3039ff0c2f430b18\nA = -5d02cf3969bff8789850ac898c00fcb3ff1fc49a22cb243ad18703bb8fae25f83502bcdd885417fe46e8237fd0b444712c4fdb8f4972dbf9278a83eb305efc7a8210ce55167c069d1c4136a9b66d0c4dfadbf036c079d12aa082fbb42bfb0098006136a61f3da43aba3d3bcf2f5ac2d7884caddd0cfc28681d33\nB = 50b369234d993721288662d83298d99b9052a0a66336a5a31b76dfb20ec2b5be3aa76f78b2c17c63d78402a15aacb585be5c8d2e7083145e316e71e111fd34f5c79363c4591c247b1a94b20ee042d840c42a3001d6c8dc7cc1e1348e0e3ea8c6551f9d24af2dc2d0c38a54ef065ff048b148ce4f11ed2b549c50\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 87de406a6c957e85c759f8ff684023a0f98e93ad4ffcbc6fb0038c7a7ceed2486f15f36555d286338aab3283aef677118f7cc3f88a7ff0ac9fed31da6786ce895c3c08d3edb652bbc9ac2b44c4cd24ad281ca3a8e8e6e4d730f4f0c25487cfc1b2afe222934eca8b1e1572780dcc149422a88eeb1bf31065c929685a0a97ac3a\nA = -1878e0497aa1c2942a2e6956957c876dac73c4bdbf42bc92498f29a006bc92f788c24a4624b87324a7c8aedc6b2c0c8a1a442aa91557aed9bf2c02b6664979e8a9a21330dd839f4ba8f84515fa6f7db9287f7c20f31732b98fc09ee7796dc524870dc35851814bc57e1a8ac49d8935fea04bb08b8760df33a98149b\nB = -32f4e94bd073cf3f70810d9af7a873996a0510109bc6fdebb855f27dcd012c59507491152d30849d75f95dd868992c6fbbf29b1d899cfd401e9e7f4e0436732cb4cc9e6a6d6b0cb63fb0bee21e422b7f7b7b14dc5d2b6d10447fc4add390fd3c8e7b06f1d9b181adfa8d04459ed051bbdc9666623b00e3871e597be\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b473335",
+    "3af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = b456ccf9d066dcf4247a21c7f3820e324ac9cf004cecf8dd1f6c3aa40c2a33e24c423e97190fc71bb9fec21d36c5a687065a7877237a2a05e64cabfb3b20bfff0b1f5ef2e9adb7edcd7140d1047b0919a2c770579ab44a08e5ad9f63a06f90ec7d5885b91de5e524b2e187937609b4b81d40a0b33e31a48d7b9868add75286a6\nA = 6c484e3c6b530dcd3644b19fee66c41c7c2c1dbcde574d87ee13cabef9dccbe5b41e25c32c6a56df23f2e87176afd28249e5fcb918723707fca94d7e2c9623a3493d395db802a1b49d550f52c29666f785652fe81afcab00a60a5b50cbf523cd13dfa06d5a5b0809c68ff7264a2cb35b8d52284172c62ee658e8417e6\nB = 1b4fc753d0530bd07094bae09a02b1ea684fb4e8519086b1e2ed9d59af011f61d1b94ffca6f354a5b428417b328bb1e8af3f6c7ac9121dae58de9f1dcbaa9c73a357f408b870e62b0c7db1a72c4c440f2e6fe90b199b9dab29fc23927190d3f2bf8a7ee926a152e64474283695614ad696c85ea547f5f51d02d1b823e3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5e7c63276f350f04816a6ed9f98507a78314f1d99081fcd906affa3b8395fb58d029ec657af82e77ef45611bc988095bba9c26f25f8fd404432fecd02398e69635f3315a824d6a98b33eaf6a91f12957a5e80cb48d5b086c795eb3b1e04da5432a7e8be3d683addc586a44b6243ffbb7a979bf9664cc7ec41e75f267d58a7127\nA = 18efe267d4c62576294f4ba44c67a058cdc0bb44c48f4035682b2d6b8a63106081af43d99098ce133f8d7f9cd04d4dd7414f704e32871d43d6e5d73fa9f447873168b43b32d6ad19378d74a967f92ec7629a690d29a62a5a6e734e9ccf5b84857a00d97b9db846b057004b03d88b827dde717fc30e6a5246c752d65dd625\nB = -ebaa580d3eef5361547c692e107439c8391ac0a2d1cec0cd275d0be69133eba8a94bd186ff9a129af3f5a015d5ebd30215643554d7064635dc11ec7a8ed2200fd637b099e534237f0495d2b629abd4c8f84aa1d925d53e98490d02f9fe51bdda08b043f67f0903c0195fcb886c04397d3612e4501ab8c7b7db69f781e169\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 76fcb39f94dd2756e8266c025cebe8e801524a757b976e35ed45e3da3db720061cee9037fdb34776c704ad2059ad8920e400bfbf10eca9bb157eca7750cc31fda06473bd22d4def80189c47ba32e2824c721425f225563df2a2ea1edd090e01c0bf980677db5a5dcad37d21a68e2832d1012586f506480e929b2fd9bb4aaddf0\nA = -75f903ed9bb0b6db8e3be16e797258f6c18f6cb7b16f835f04e3045f7e4974d7a86a63f2ec351c88fadc0635b6dc83a797cdcb5cce1a1674f89e44190991e0930575b19e2aa1512bbbf2ef6f8c3e707b17516756fadb635d8c6bf9caddeba14834b5950a4d1e98bca79a4d15e5fa5fa3c1727d7a49b33d481d32fb14ae4164\nB = 4ccc582c8460f7def2d26167b68788a681c41bdf6dc805dca83127a18bff6f5ebea6db75cd959beb859637b200ccb5c7644d571f436e46a357d027edc9769da226278f7ab947963f7caed1e7e70e572980e960e9764a40c6db67bb526694b084976142471270b2331da563a10427cbbb38e76203d7da5d67487eff701d75188\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5adef30c67aefea4da3884b8a1d0ce6724492bc76b477f1053621e7d19f3cac15448e9401d34e05ac4b508b9d1db9a8d323cf43722e0af6e3c3b6d463c6007449c3bc3236d156cdf988dfc308a1b4911554ecace52938a7b10f463d14f917ec3d9fddcf6d33081745009c59b58aa22bcd7dd8c3bbd489997d4e0bff5473ab9d5\nA = -174e8e057a1d66e22eff88de26f43fde1c8efe5611f6ba4f318f027f5a5818df02ec3f014dfedcdfc8c143c5005c3c5098d409710967c93474f5854c1113fe4030e6682bd56d389ca8b9a4587b8b9262d146bc92fcd81d75c3bfa4281898f394f45d5dd11cd4c7344ee7a933ee346bdaeb6f5188967c388b919a0ce6730c0bbdb\nB = -22702bcc4f9d5bc6f803af6af8072780ff7de7a346d6b9293ca751d6ee3a81493fa86738c44cf2b7be4bf14a55a4f8179c35c09dcb1485f4c08ec5e9f9b1efa91f4b5f15a31a46e1ed71cd934ba6bd271bb22bb5703aa468d297f360ecbb48f9fd6c572683e83ebc3d432203347dc62e19fa06f93e087283347950829d4256bf5f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5c2f67b1607776c10fe2c30b112e541c4d8229f5f99f615fa02cf715d3f20556a28eff5c233c58994e9c6c1fcc37b3416b0875b9a62fa5a09a4b8f9e216487203b387ff97fad1f39f674ab19c5e34cb2f162e6b0b0b0084f0618e64928423b73b189c744e3de9fa50d66f45975f68b14866cc16c8c6c722a54420adf027880aa\nA = 67056e93b69e8a7b789f1f8b835d9c6ecb7762f844d656b26df9844a60bfbe0d55684f61debeed31a24ef4246485e8a1d43d49eaf97ed9e7b9f2d2916a8d85b8c9e8ad5575cf5a3fea42392e5d1dfb23f7ad41a7b56a4f21e2828aab38a602d560c99783a4f807120292ceae366b1fbfb4be8e5d4561bc8944e7f17ebbcb0fb6296\nB = 1f874f244ed6cff9f910ba9a58db0dc0a7435e8d99ba6412e976b8f64d4106d3c5c57ba079384fced1c261aaa538e131734451fe84fd3cc5cc8b3ab46b2031f888d95084cd3a35a61092672a9118eee4ed1a0df0409e3613b3ef45a8b16b71ec892755dc3f83c5492b67fb9a143ee6102d053078f4875636b20b536d5cf851768cf73\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7850019c6712f18eab877faa8489daba23cf34b512a3193852508185b13cd5a2e9f503fe8d61b74b5d3930021a5b8c38322aae9b9b1b4814fa4c2c5bc409b58f11fc8fd7854b17baa94a6bff5f234832f9468d90d148fa2bfed774ac03f2dab6a506a70db4ce363f932adcae202f04fdcae968f632dd674416c23d4e21345ef2\nA = 1e378a0f27e6259763890d29e112e3d8d2bdeb9994c49fb67ab680b6e71a52fa0a7db886d3baf52f36d943b5430ae8bcd82e229f4197239c35678eed254c5816722b995e9c311be942f8124e2f80c1e59658433a57f346adfcdb83202e55457308161d2f928b60efc39538a6469f90f1a868cf6077568c8241623896ddc2705cf04e4f\nB = -f4ee37e39d4cadb692bab5483ceaf0258b068f2c0354c540438803780c983469ea28324ce7e209c3bf55b91f0a2f4544bf318585e4514333eafb9b8c2f02170c620e9b5280a828ce1d8dfc64ae9c28577e15071825a85a59656c5b47d9a382af6b78a5b3dab1078dd647e0b473174b8415d401543d30a4018cc3eddbfa546d0fad9cbb2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4c8f8b671443a3af5ef5749885ce5de8e2afeadef9051bc49c0d7e72922d049b1accdb79d82288e472b07578e8b6d2176d6cbdd7f0caab593dc0fd9224a94920235410501fddd6001b62a7f7d8eceaa7a8e4c0de52029fae68656e8120972b5cc1c2e909c2742e836f2fecfa51e12e4f8a2ec7e69eab061c81785374ac607fbe\nA = -5769eae759dd6bf94468eae94189d3396886d4569b0ce264c22d39b623be3abb01bd5008b9fc86701a3373f7764118becadcc69481cbb134c20f669cefeb376dfc489dd4ee91cb333d06afa391dd322abe2b3b715d11ee372666473a473e29dd90fcc97e939049b455be52b3f288db306999019c1177ab5820d94859a9d2f050b7ee1d4a\nB = 44adcaf1e2afbfddae19b23cfc0f0ba1f940d32945d0b541db23f3a0a9d06fb1f67ade9a8e620bd96f4005ced99430c7a55eb7e93a701c829fd5b9e55dbb4d3833afbcaa0d9c946916b1a86af4a6393b1155c6439b8b82260e09ccf0ce5d1c4856f4d524983e4b0fa123267694a1c6118beb8be26113a02721a02d7b0ccb01ec6e9c0f9e19\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 51e25767b8d4d7b2b0c2652d9ca6bfdbfea06acba543b1bc8d3d25b2fe5f2998febe1a6e742abc3f482b4267854c2223a5918a9b5c84e0864278283bcb5bace0c046db1d0240443404fb62d70ebff3ccc655e5f5977958df4c878d9859a69731744f3d33978ac31551487270bb4fb56ccbf59402ef9fee42cbc329420180de08\nA = -1966812979042198f70b3f1238c93ac5c6e5749f1108c2bba869b1dac7680f910e56318c9b59be9212e713a348767ba6e75917fb599e929ea2144880d18d4fbda4f4663c7abb49b02245169f385e09098a4e01b56dadfca8c803acb7cc244f3c98bc17440ab2afce318476b80e1d0b4ed9a8d6f2a0be64633f8faad5eb48de2681a38a633ec\nB = -2e4f5eb92fc34c753c61dcc826abab6fc4f427c6ac7e73ffdf65b1037464b2a9a0",
+    "b0290e713d81ab57c0e1dc30e76fdf96046fe10a34cc4511398319ee34bcaf73763a9042fcacf59a100c43d3333ffb3743048e8df0dc61fd0da3f935fadf882ffdfa9f0f42980c1af6edfdf161c4b16087e2b14277f655abe54582de79c51193e13169b55e6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 33539b5f38a9943b15801d449adabe02da6e21651d96acd9aa40e866bf65015fa40178399254e8af6bb082d021e2a05da0f45b699d193b70112e114f0d25287476dc0c733c5cf9df57667ad0d3ffc4ea2f85b43cd10459cdca9465b0974e578c00a6e275e0b97ef2a4c9886aab7b5947b78a88f84a3f1d8c5f26bd07bcc59886\nA = 531b891fe9e8db322cec59a2115574c7a304c423e6b11516906b840542b2c608785e2c18033262ab9cf68f63edb40ad4f073ce8841db602cf8fae0a6771d741c6392976c9b333ecfcd0c8e9997da40616ae2a9e0c6be93fdc7af0dc0668ded1e42a9f729c70f74500ee76a91d3d993c075c2f645b35792a20edf17c157459e35c0a48da6c4c6f\nB = 1a6fdbfed1054a0c5758f92f72db7e5737b0740c4d8c3ae4713366ef6709b21eaecb6b74c92541a9a0c99ae18ac6ef7de79d4c84ce39ad59cea9c203734a99bbb895916275e8778cfcf7fbb7b7d081a677769e4ab96bc7bcf23303100e629fa8e07f5b8fc2e39c7b5724c72907eaad09d3088783b3118e57c9c8ad1799b43a13f73864c5602c478a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2eab6018361f557ab06725ad90f6886d4b468ab1a193f8fdcfb4ad15fff781c8681329a27aeb5f03a81d7c404b8017b12fe23165e941ea767c733513a07e921aedf20596763f6f977316e37bed70f6a617e5c2757c229c59b3d7b1fe8755b5f65f7f407f13634aca7c8a267e661ae2f77fc5a95f56cd6c8458119df587478b1b\nA = 1cc779145b2b7bf9ef4c9692845e162329940f96eb43e04db8728bfe736698082aae6b6a1b3c32867c293b08547a0941cf4059d2d567840ab6ea526e3724ad59e715a3782ca656cbb739dfdf0c113a18f0dd62423d4edb60057fcaedbb852178d38f1b5a232842b4fc645cbfd97a8cac0b094b870064302dcdf23df2c9e9f736d93409cbb8ce9ab3\nB = -cbba16086b51bd83d3460e51cf193ebc79b826e4f30978274eac3b2dcb04e9d7b56a1449b7cb128bbfeff5c4720bae45271fcc64085d3ee501f0f21fe73cb7db5f275d88be55c339f9180ea21a8cf3755a875331931b75d23f57c2030c89c6f9c1ead431cb4dbd4480564c83f8470610e5673c7eb6c0fe7351ffd7ee460df5db7872c67041aff0227f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 96fd93535728b961b4167be8b304e570cc34e787c12a9a5d76e099b336ed6b837cfc246c5bceb04b0f4744c5da7071fc01d70e342509473e5bd7c60d6046c9b4f21c5ee71c4e678447f837db3a7694fc3936ca733efdb7d387f0f6e263b3ac0b89054a826da9716691c9d580ad38d701d08ca090b6c59be466e1b9833e75d820\nA = -6791fd686f46c3773fc8d7f4753d178a93f6fa4941f4305d9689c2a305bc67840bbef80ff05c7bc6de3a595f73846609327d28540cd705f5aa94a3ae5915ef55304c37c4c43a4b46906889331ee16585629bb303673d439de9c0236f708fd19a977e6e1032e0576a921853f7dd328979ad1f1aa945905dae93a82b3af9451a541f544c18ed2546b66e\nB = 6ae062b39c77bebc2fef05743e6d35e14a31c6fe1fdc42d8de2db94ce70a6d60d66263c7414b1081ef2fa6ab511b361b8baa9c71ec628dba5bfd772c440baefc2fbed68d40897878232d9715c4b7e7c9bdd41cfe7b6986d825f68be8cc16d04afb0cf593f3028f3dcd91bc94923f3d7211aa5f0f12d3270e8df8bc191808f0e266c4fce2af97ac7ce06b0\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 949ea5f645ffe5d0d03359d51a663c7dd6e6013812a47be309575e036503126f48677c68c4ef6e7b3f72d76657fa282ad5881263e649b5297da82e24298300d032af3f5e8309ac7eb597b16e257a6f7af3476a264415aa7783433e83be57ffb3fdb404a9ddc3527d6a9c297f8cb7b6674961b3af837ebb65f218147a46c39cba\nA = -10f59ba073126d92a201529a5374500612bc59a9e66322c6706b422d35a4f82d97e668b268f5527b4641c6099c80bcea504234f3c1e3fd29eba0f161da97c50aea542becba499f29d4ba5571873d4dd9eb3f48cb26fa6c929a704fe8e49791b2ca3293c2428d9cb453263935c9c90a4a2b39d23a0baa12535845f907d42b729033a0a1e74d18da30a88ed\nB = -34fdf9ae6760d4f434d09ce2a7760ca2dda14bc256015809745524dc49d841b07102aefe5a1d0182e3e09d4d45b415e46f653185742b9b8ea6960160752080e5c9577a12182ccf1a293407b534ea8ddd33ad16cd19ba537d8db5b542f86a2a292423d452bf18d82361240a7efa831518184572c5a8b73b108a81d5036b3b530d98bd47c7fb2123418f12e05e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9ab739ddae55a0d71b39974628d4601122ba6c5035c3ad0439691317f23dc33c0014f3e870a105e4dc1432ec79693bac658433b21cfc218ed411e003990b94ebfa87767f3614ec19f5bc30704adcaf85a9d3d15ea764c8f0bbd52ff388659637746d39859398c79016ace8c6f97d3a5616711a235b85f334fb889b9280ccbea1\nA = 76b15a0aa0f59ec804a5e9a627e1fed524320b29120b6789f8e71b1ac4e00a9a8c826919035b84f87d291e2f35460bee181342136dd9eaeb99ed00c6328b8e44c49ede3921d6275f6e7f03de179fb2374ae2fa6c58852fbb2649e214691daef945ead6c8bd5a53ad2b130e9eab6ad046ddd6b80874ca6515322bc171ee32749333669de0d9c883058423579\nB = 1fe2171056ed4585a143b6b2bb5f44047664f64d710dfc05c18be5840ef9426ef05b6e92e4ecb5544ee4622e9030153dd9827f2f01ef38e62b88ecd6c46b4457d16644ef6d863c226acfd6928a40de614a5853137124fe69127a7f05463eaa49bc742d8f7be300d06b302dfb0ba86801119bcdc01b516afa360aa8b22b7c6c1839cff859ca1bf26e3f7e030512d\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5631048ffdb2767aa04d59d8a5750016b38b983a2d53743ba4de5d93bcfc8ec30183a84bb1e290ef9c72c7ad357728acecfc613a6f9b3d712456d545ed54a337930937f4589fe41e66ee930db3dc10a4fe41481008c69eced65b9d1c46b8574c5ac8f7d94025d8fff00ced17a5e17508527681bf94c2dedd51502a2c4652538c\nA = 1aca12b1933f25ea081e12ff4a4f6f9ce379f96d976da2ff7b8eb8ad791fabe31c1148fdec22dfd67828e540c955a1e13f40c5b125e1c7e6bd839bfa84e5bfb58bfed76058c6db77af7a34ffd25fabd60e19f65e1faeeea6371d7785f2e5bddc8650a7492e06691d61f997483661eeff54a30656f1daacf31182486bc40647975151fc05d2f64b50e632f5d5c4\nB = -88ed894287043e7e5cd2eda3c1e5c97f85809f7a246b0c20891fa9a024f3aba4ec1f3d112580fe6ba6b0bdcaa1325ac7ec9508aa88c187af08e4f37631eb6cc97e4481b18f747ce6d35ff355e425a4833834ffb8d34a818bdb015fb818ac9f58feb87020234243aff912da5590ea3f6cba74f1a9fc3ffa2b4aeea25479c55a3b572621e75d86d8c8f6ee4f587e0f5\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6ce341aa4a571cd5bc110dd436acaa09f409661967de0bd096c77c60db58b2b0ec95cda50acd7fa20ea4266b2c579eeb6ac214a75d40abbb70845db74c4d6c93f8c545add269d45fb15d985e7e630d0425565d06dad4a3ff9835411e51fdd9780c24f466dbf29244cd1b8c3445af181d0928db399bbc8632f7ebcb9d48c0b754\nA = -52c53999b02a92d6254557203cb31a21dcb896495d1f29f3277d19129ee43e521ab9d5a297204a844a9537d63b74686eceba72ea2e7b98ee8895513395cf7c44c99348f5c4eb657874a8115f0027d6a416b8a04a1ec0e6809b7701ee7d41e99996e307bee9c295ab3df1faf674e0067d0ab3bec4da998580203e33760870ae472a3045bbd66e352b8f4d284efc00\nB = 4329d110504caeb71ce0453b0706ff675f646e70a6bd9575791a38f672eff226f4958f8b1fe4123c0001d8f8595d8030d0e9798232942725a9b9d654ecf50546adfba7103fed796b455ffbb4c153e70f941bef7953c8a210d6f2f4ddf5d9a79d9938503ae8f24d69d5d7df1c988630ed960e12dd877bb80a1ab0bcf6db67e0c0578fc0c40408f72b19052534da8d31ed\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4b9fc1e0eb4be199427c48bbe1b53948d0135bc1965b8aa54",
+    "21a4ec704b13cf934c650405ba02ad611b0f29d46d82d4a1fc5a84651a29364524e37be2fc7001cbd3c792aa477802999841ff19620cf66dd2453c9b05aac349b9094d43b40e358f32805d87cea3cfa98e05240ff95ec57d88e0a12917628ebd34946eb1ad6799a\nA = -15a223b691d8b3696306b0ccdb52c1d62c7c2d1ac71e5f07cd8fba960417b42fb5ebed5eb9469be67f231b5254bb0fcfadf5ac5d2906769e8bf8292f0442986cabd88805a162c0c1f60f9ff0bcc2029ce33452d05f754375c0bd147fba745bf8a0008792d4f90d0e0f2cf391f2d7865705544f4a220ded44732321473c0ae7870394d4e625df11bd0923340cb70b995\nB = -340e5ccd644849d982bdd455ddb3b9a23ca14e168bb87256bcc370ffb6b7fe78fd062b3bcc1ad3c8c3b8cb549f2baaf1b7f0f6522aba02fd35b651f7de52b3aa2e0e40352bfd6ed0f84a2bbc3b3a396dc8512ca1db01cc69611925f1037794c82a418f10e0d994f458d1f19051e8bea32b90ce744d46718f42e711c094ad0a1ee96c88920188078f1b044ccf307e4cad7de\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 31c090e5160faff9a136a7a482b42a43ae3c7d00c215cbdad28804be0e7b12b0b3af820c1350b1622a22c8875f24d48ff16231c826d1a946c66f70aef92d4e6582e3ce9213d907267251ac74fa3cca9f1c8fd53fe9898aec19936a2b797fc345d68f0791cc740199be39c05053d5591d874b415e62653b04a3f41e263d00f230\nA = 5419e87e50b28b6d24927934b541d8de548a8f4ec7e9b00aadb6d23f2d33406177d3fc72d29ad2c2e141ab2916adfd30ec4791c626af61d8d192276d632aaf3b54e2ffe83b44f6f1ac441e6823b6b58cc08fd7a0af945a02eabb5aebb2c7ff0622a17b38077cd0cba906ce23e71ac7f4da40ef6066565b4cb3a62ebda28f3629eaa251dbd9979b123a5447ea20331723e\nB = 184782ba4daf429cbd13ac13fe93fe5833f09915cbbc707feca3293e505ce9cf0b4b12ffc8b178e0a4617f809be53d4895a4182e7a8a65043361e654befe8b01429ba4b7420193d1d7d90930ee19cee0316f33a5795335f5fa517e1ffbc99b95101b0f936353afd3bcfec34851ebff1ef02fea991a01b587d28640c935ec91496d1aa3ab8d38a6ac75b3a4198ed27b9019bb3e\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5eb9f3ca660de481968a3c7321281f22fb9273b16fc10d8eff1fe34842364dabcfaee4993c1c8ddb7c8d6e509a8d2afc005075d5fd3c4471f0622753c7797aea900e785ceef905e2606f64f34e47239c40b74f07e2ca70bd5a18cb0a88780489f3e98232221f65ac9c5ce703a256b7b75eb1dd38778d8bc05a37ac9ad8d36b35\nA = 1c73d8e3d5db127a81477a5c4c6d61ac62af446981773ca15a9a01fd5175a2826a8763f91d68df28ee606e8ffc203305875a238d2095345556f12f3b5e10c5bb6ce3f90342ac74b9ac057195c863c4b9d28ca1d958a98649c7f8897bc6abbc39becae963f61b33bab4fd20d9d0e5464f21c2cdf06d00f597dfde45dc5919f5124f26888b12d72cbd2f57de3f2de7c014f891\nB = -e406fb60e35f0abdd313b8431f4cc89fbb034daf71fae0cc727e9a93cdfde53566fc74e48f4cc2111fad158c63293bca0b21b98416381b81d2443d0e91647679481cd6b6869b37112d3b6e575eea7fbb5bdea422558d817b49ac36a829926553202cf9dcef09423c085d26176a89be741ae20a434ea461def090dbffaf2e2ef97bbd4ec779041ed69ec07d125c7b85a2d215bb0f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = acf9d363fc9b76ecf7e61c33270031340e66595e559dd1c9dd4d2243819b660183521a4124558fd4b216dcf5c52c4127fe517c48cef428b9ee0f1bebabab487c968a80b9815e82c12e807c096974ea3893a8d5597f745365c352a6bc6ce92479176092f02907538c5e784bf26dcde7672338f402753b08de8aa21b9480df6955\nA = -7c03ba6e3939ebbeabd35cca277eecaec31f326ab75f1a29e05af50c4e62e0175d4d6a57acab87cf1fa3a51791e9a2b2d4d5db570ec3941263902b0c74544c323c106557cd5139d2a25f3c3ef81ca009d4e3c16f1abf6e2b5196df1b30def46d61eccdcb3741a6dfc8e8c5e6db68ec29c82b0adf6e35ce7aacef8da806b3b58bfa489d319869b20768f8eebb604a9624d048f9\nB = 4e021959da96ebeaad17f9896ed53010d80ed3fd4c3a826a266e82b80ad81b3032303e7c0e58034a652b8aac00c08d42a530039de60d74ad349438f5ecca1256342ded6f30e3bd2aad5bf2b49124cb27f45f697e157550dbbb37f5aef0f04839aaf1ba43bf1e77a1529818d0fa91d940904eda6b748e5c86cd1b37592542c43b7b4afe2b8926fef6dc01784fa431d43900edef27f8b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 24124c69aaabec7a7b4e7a82245f6cb14b199852a8b314a7b8d9049cb66096d5ac93ac75eb58a2004de8b0fc8375638c0878fb6a45be8bfbcc292e3571df1bb8d6e346d5595fa395fef983a365e4e868154fb3e337d47771419e7f1dd5e4220900c564d7cbe8e7792ab288f99d265aeb296c5ebfdaf08b88d9b30ac660cc3ff8\nA = -167c959417e9566c93e7e05d2a410f4850e3a313e516ec958c3d2fbdecbf58072d05691c68981e176a867d7467091dfeca11f695f750c8c44ebc4d08e39e679d96c4791ceb1ea3b89fa3ce26f7ef214c5368c03ba694f7ae592bcd8ae53a66cb3eb1e0cd3c105faae6eb7e7a8fbc88248be722406f2d35e46c751b5ceabd992091eeba15191ccf6dd61a7ee0c624d43b188c42b6a\nB = -343940f3b2a5f73a51d6f609e8af306f44ce7b5c2e79edf6f4dfc07866dc5c4b2e0ba48099b5503af87762a44ae451d166f8914ba25b3cc41a766583bf73d27e40784064582fd9fe952fc00e9aa2d4e4f1ef35818978e725e69c1bcf267fda4d635d1d292d54d3ad10bae9763dc5d7f7226f371184465695f2d384d749fe07967a1bb64df22f294ed88b13600c7068d881f713cb8e3ce6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 50cac148215963e58cf6d2ebc36fa518c63a0ab8fb136ab84c9657fee459043ee9f42aafec89e8ba5fd1cc5c4495a41e80590ce197e12c087ff7e6ea88ed798735f55a1634562b82f8514488ada526e5dc10700058980885000e266cad55948d1e080f6343f84b12a3698d9ad5427fad4017d931df77ed2e45e2fb8380b7fa39\nA = 6a9833d768a22ea46aab1a1619f30283a1ec254a2de5652981d73146aabe31041ed04d271c6f2e5e2d090cd615518a06563a94ee2b12cf9f142de3f15599998a712974d0ce9b122a2aa65bf8750f54c6324f12e321a888154330f0f9e1e5b7999acd70d4e6da95c2df1da2d19544b7abd2bd3041e3228c7cdba44f7d1cbfbcf968f8fe87fab523eede0485efaf5cc9e56095cec8983\nB = 11e782e2b3f469b1e3d14ccd1b8301ffcde7e371f6e9afc99af5809110c6d70e1cca5c0bbfeb95fc3ef8352581c11ba75c0f8c445ce2aea903769a24289581c95ae5ebd9553fee61a30d155bf6011278807833eb2ce7ee2a98fececa23fabaaa259409e88e3c4f4eb1e04176d44878ad3f6961e0615ade2fe86b6eb02adeaa7c9019d63231a28f84b7dcc8bb0e71e2a717db09301e1dca20f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 7cd49d72bcf5ff4fa2c686f21e1f0146c4f24b9ad2e900dca1c0a5d2fac5047509064e65ac582946b251a3f04850c9abd8b80c92af0fb11ac13debdae8b94927f1de0e4bb217e78f5d04897c6a0762667d3d883cb754dc610442c9dbd44228a7ae4f14fca145550d813655befe3bfeb52f1c76f989ea8a1dd9c10fbc7e9d6574\nA = 109fe33568598972063279b71ba0efdc2e03f770cdec331428fb8ca084c9b20d0fdb5cf9ad7ce90c8cb8f0fef10d219d7dfcc6b4599440db8cff9971da7852880bf004266886eced8763b3569720df3a1fb0dde2717ce0183f2250034871146628430f206c12f5fd87574c206b203d90c0f2c705cad3484c73da8bf4e9f7e1bd433a6f7fd27df63079d30c490aed7161bc594eefad4bc0\nB = -b95da952cabdebe0194b7fba519768e1b56149353cd12023b97397b59e0d7f4dd1d27b65b833948f58e66d3f6928cc3140cced835dbd612cc82a7e9fae1621986f71ddb6707ad57926b03e87e165d30fb145795a70627975bbf9d9ac9bce07492de5227c666663cc28b3e70b19dbaba7f16849535ce5fd61e91cd2875e0a534a10c60d21f919d566a3469d108a35ec3f023210efd5d318c7210\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 98a89cb3c9602fe503c32c44609bd4487b6c8323737b3376dafacc3eff96efcce7a31f1b61ee6799dc9561e77ac058fe5195cc013e72a2864f7e492d9f35244b321d46270a582f6f14f15fa8203d392e81b183a1d64d48b51d70e38d49c93869ffb9d7509f15ccde547d2d9c4dccd50eba49190b6e831a9f4f9000a95dc83f3c\nA = -67d7fc8f1766c40bd476cdb65d4dd161c3d4c2c5860a0c559f0e",
+    "87ada213c9ed33308c36bb1c7d615fa69ec53656bbae6b57181a0134af23ea2a75f8fed3290a2f483392a3745fb57adf2121738c84f6d34325121a702c8ccac0090ea27fe9a5ebb6ba9d4f397e4a7e3151850b3d7d25643398bd3e4c1da081471389799245d986cab825a2e6ca72b38ff978a2753c835299ab4597bc65fc\nB = 676ddc4d18960817ff8fd2adffaa68c87d234d62d445d6ba3847ded849356d929d9e4ff01f517d7b1c0778bf90f475923517d855956f17ece1e032e2fd474d2133d6b8a591995454d8b587cb4f6fdd0fa29305f146d340cbe6b6efd28a926c73735621be0c5decb792083b3f063a43dd9f635e03f78c1bb56389a5cc993c8f36134d755a324d4fccc2ac3bafa270df67db0a4ee6ea4497aa33b5a8\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 76c31404854006a7d55554762094df6e11e0393f5b0451d85de2e5b104432df72023a35f44da10dbde01cebf77b8f9d3ad582373c5d32232564729af0d03c5450e439045d96a2f0a38871c922af2bd38c545d219adce0ec80fccd121d6a733bac09253604a8a0b1ecf0f24e44b818ab9e9974181cef10e9eb17684c57d72257c\nA = -134e8784878a8f3cf49ccb952075f9f9bcd24a20f8883955f262867045c11a9c566abee00638927e5de924872fb98f6376e321ebf3f567db6cfeede62e04f839617d78b7c9d3487b60a0d3897b3fa49b14c12511d04854bde4a9dbe5f31424a3d05cb75d23b46f6c0819536020880afa5a2c173f6881754b56f82a2864c99c820156f96b5cc4665d603597331d98d90a52f4a30c6215ee5eaa2\nB = -3c5c0d35de5fb21c84d2db228829f43b31132b582556b92b495f59df502a6d00584bb5bacd9b8c1a8c7eab91db0ea24b40f07e62a712842d5c2e1d208a6412a068cd5c6394d715260b67fbc03e3ae7eb4862f74f4d7484f747774fff03830c65fe022d579adb6737f6dfe297db750e6a58d1004e7e2716838befc2ea97179ecd53b7f36e3540e1c3a0f3e044bfe2d0efa9b89d2d308cbd0bd88ab3706\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 5b704b3181e5d0494937b4d6aa8172eea82919fd1d884493197a6a85ff047a7bcd5dcf072bdcef0287be20d4ac49918d1df550d184f86d7220f0a84fc4da3ad05e131c443fb529df01fec9fe4fa6fa2f36e791f9e16b4092759016d2f9b1ae7c3d071c57edf26386aaead767a3109c12a5004c7b9fa595e6d592daaa2dd1df04\nA = 48a0ccd2d14e14e2aa862d306501efe5de239e8ef36ff6251c861a0aee9f739411f402491bd99aebacdc26c4f30306f9137ffe4579c2f13efa81b979ddfffcd23675ac6307c0aa3ba8ee77a2e3a3c8e241bd2ade6484e6ead32ce8d752fb3584d14688f223758c5cb8705cea9c56136b219d87f9904bb56be2ea1c9a035df33455206e6b7972cba32ca4c3db41991117d88da3521780fe65c4023\nB = 160120a35ae3edac3edbede9ff1c6f317d95481227d87785b7ee46cfb80fac9973e418244884caca3211a3f6cd3bb419cf70fbc22d82ba5ab98ad80e1f6c2cda753aaf7be78613ef25577107a47ad1ee3c3645db85c4d29bd77900e99e1f439cb23c6c68662c05322f94feffcd9e37d8665cde984387093a043447de590e7874e6acfa37ed302040df4d5c3dcdf9fed91b3d17ab5c141d4494d0f301b508\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 448c3a64958b82ccaaed3c74706ce0a48c5e059c3610cc03a6b5a03a7de5d4f1d1e4b08a31478fa8edd58401f0171697f0662146ce2b371e335d695f9e4a671255f29fc0b9b7d1b2eca4cc7f8357aa0920b5942e31bcfae84e909828fbe5d02251ddf10dbe4c15351f675e96e2eae6d044da1f0858ce8ba9b7aa146850b85d93\nA = 1b2a52aefe44170376df29d17ae2dc1501c9c296f72f271c21f53db71247e72c3eb2b780190c45343bcc8f548507559ced3bd4a6fb13f9174dbddf965b9c4a56c3d88727736d78be9db2268cd02382e50c6fa28ddaf8eab9f44ad45d5882a5100b3027c150a7f3bb36f29d24a76e40f3820ba116d645800459f06c20679321cf5be72450879462f0eac99ab6ff8d26b464cd0e6d78621c9263394c15\nB = -b7d9bd08d7d8e0e9596851b7e03c78973a502afcc7b5fe5b0db6034ebb8a11df1ef7ed0ae1371eb4111cefd61c61935d768be3e3755e481daced219874cdf0d07a76e7144be626cf1fc21c8a0e9db4389ee213193775e95d4d86741d8d8fc820c239b7a90937000dc3e89b2fcd61b44e1c38c655bb3d31aa7e422b4406c9e4a88e6a2c18ec7c048f4a6b5b270c90d9fb378f64be3b5b351621db48a6c18625\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2192157490ae044a26c23eea6da51d3a3dd08c7fb67a9beb76d37ee24ac0089863aa7f00849b81bab8259f3a0e1bc744d841e07aa413c286e4bef2ff3356bdbecee756026915894584b4fcef7e49da4012cd9fcb5dbe3f3b867cb6a7ee959a328b0fd56a9eac1f4e40a22bf0a30073cd2d48f99245ac03c373810c54eaf3306c\nA = -598eef47b40d1fa1ce260edc561bd1c1ab286a7e068af412ec2baaecd07c5b9cd596505ea1bf0370ea961c4ceeb9be76baec74e6952cb846f20e5da406bd01368b85d59569b403b7a305cd7448f331f10a34def43c738fd633df9a3eb194c32d53aeb567889927271d71d3929d43fb9338248b64f7d23cd1b053239e09cc2ccf5fe9c9ce240f1a10fb151a8583e4b4cbc70ec3082dd20a9962d564544e\nB = 559fc917de34bd7dd7a23a432142ed79e3ac4a6caa357eea21e423eb9af7fd94f1eca735d2588ec4c2ff013520c3a0e209627217cc69bd5a07ca46a43ec1f1bdbee5f09ceb1b2c18bd388d3852e51070943f16152a73da624be680c671057677356c6f281a4ba1f7c60609125d7fd9086c907ca5c191820d80e483886b70c1074e2963c49996ee92577334881edafd88270bb967da795aa4fefb739e4367390ae\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 3488bf00f67b852592922fbae64fa56d2e4e7081678e789bbb3b4f48df62576d537da2e99c9bdd721c725b9a828194662bbd51ee20ba73d4ed5562482540880686d9fb1e8ae62d08e39fdbbab1d18e399ebf07b3a6559dda8b043fc25a8152858d39b10ff64776e00a839950e7a9ed5ea95b594b6e9e9d4348ceae08071ec5d9\nA = -1b135d8cec9969561be396323e2f8be0c60903ca59b6c418cb19876e9e3cdcb9ce4f5251eadea11fd6e785476c70822aebdc94617063d161ebe55584a8a774ab230b8228a2b65bd5a6c873bb6b261429eefdc7d0c64c7e78133e739efe57f835ad03ef8f84601e1a2310659db5e0ee706f23e3c5c38c9f8c36e5b15b654d1cc528f1dd392f1b08921af8be6fe4e4e6db774392441883ef867bc729338943b\nB = -34fb63435c90018e5843098e379c76ef3ba0615b6b500854b3dda3e77fc5646228fcf3a6e1cd87a506e4959ab05e24474990ad98ad0865942737734c03dc289307f1b1f424b9a8c2264350943449b3d2b0f71f989039131e23095d122ae98c0089a184dc530669e804140134e5b602861a5e61c030fc3d3b3eef0a59f8c0579fc9b0afceaf16698de3fa07c43231312254c04ab11ad7a29efc4597780c2cd1b64b43\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 8ea5fcf7fd41803606c95729d2d910941e43b222f9b0c93a1a803b197fababbd653a92ee34e805906fde29b307a962a294aa4dabebf0d181c046653ad0fe6da1295eef817f3289dcc6579cee8869198c39a9f79992cf6894162d35d812df327a64470c935994aca4985d0e6a783b853ad762338dabd575ca71034e29d768d014\nA = 6858d029a62b0f75e4c59f3ec067e3990b2304c90a097daccaf554abec49a9d297ca14648471dba08f22ebbf8e238c89ea06f188203599aba56611eb3d4df09ea795a7e28f91f4a9a582c6b949c6ffc584a076de653446aff9b24e87202037974aede37aa9a121b5b70a3e9b5ca376c9056c2c91f5d5484baebb64cccb6a09b4f40529afad1ed64b4cc4aca586892693fb5f92edb6b4d5f678f7a2441e51410\nB = 197d6deff7adc30b025e7e418cca0a641e1a1b35f78fb56b9d8847f0690313475e6fbc6f73c3a718b10bf37434dd9fb1eca33a99bbba674195b20d35e3b34ba9d7c8438eede24ebb48e6d39eecd93fcd7dac44235ad32f208919f57b261da70ca378f9b03ae5e5a733f97f0b3f4102d971272015bf50b6f3e50c7b36cdaa14a8a580366c9cb0118ceec6e627827b0b8f614656292675ddb66e1c55355d5a1d78e69ed31\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a25db977e7a8fa4578fc530995335411432ced67e131fee2cd7ff56970df64a6f0f4a7d225d2f4ccec8e98273ec9a0f1aef01dc0b866e425d64e09cafb9ebe3f80bc0ad71c769f1ecd5efdb4a990ebd3a94303f52f4a97e3a1d615918f8b2df5321c4aa9339b4453d7a710a803106dd0ab49c6cd9aea431f97fea9fcae0bbd90\nA = 13f97ba15ce46ae32147a0aa4c1639b6b555f4d8a1af15ede4f1103f7a0b0",
+    "6b4625bf456d667720adca0c4e26e858f008b012fae63cd89322b33fe51e87714519e7dc3cceea27d968b46ebc04024d063b17901a7ae978591ca6ca41afffd81769f04b714134cfaa6700cf23bfda6ce67313988bba5fd3782bc62f76cf551d140c978dc002a779ae37400d34cbea013a5d1338b203ff267861edd88ab8ee1e4c4d8\nB = -88d8a4c8c680fb01f493f73753c70ee753951d4734627da14962e36449db5490b8c575729fafbd203a125b500b96364e6799d9cfcf0efb4ec877e86865eea5e99e2fe5e7655c1ee0eac641e73b71c66d7a72c2934d1ccfefcf59781035b2c7b89e5de3f7d1e9128cac57947d22e7577832ba374492a2f53be37e17733d8bc625fa77fa5cf093975049a5c477f792fe75e85da26cceec820c8b255df0292824b4c3a8ed455\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c1f2165a402fe9becea284dae60453965ce327f540bb8969562485fd1bb60372b8689d9c9c97c91bcfd699dc370117ea8b704f06cae3d972dc6e5eaac971597c69d4dc24a68b256f97229e643706aa6d2d844078a5fee2d08270820055ea58155d7bc754f09d0c6f804e55ebe53e3ec418747d4130cec68533f6f0c2f8fd2409\nA = -626a1580e52ba52a877cdcd62b34cbc7f949148671d4a61201e03e98985d704b2975b9a2d9c4557deae065becd662ce8448171ac582894bfa2c59d4ed20c6d0471fcad1d0fed1291df5e4556aba72f3645486580c8bfd0e3c8f6cb34fe17ccdd75fad4d4a2db4e00bb8c2a23ed17a31e95631320590f40416c153efdaf897e3b278a1faf1917554d9292f90c4edd5992748b58492289eecde1af34976ea8ff507fb9\nB = 44c336d7739118340048939d6c198f73f90e13030b69be286ef920902391d87a58df3632091d0ef25340eab395203e8dcf3389e95debb7432165147e145735d2e3226637b4b8cb7d85d68308be07f217f57fe439b31fddf3fd469869a20f1f852e1645b0d4903432ecd1fb6397db4c11f6b6b9c0fd25778b0ff00bab9ff576b16538a6b7da40f01fa7b987af8ead41ecb66b8940c0e8a1208d0026773e711153d99348e92303\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 98eaf476f11168bb63fddf7dbf3347e619f9b580ea6804ab893214e94ebc089cb652e307f1f37ea7ab9052a352e260ff7d1e8c17461bae68c52a8a8f1a57a84c79b2c8fcc2d504ac4f553d2534f2a776ca129ec1942d83c8ae24c772f6a8429bd61949ca1aa714cc3881ed731497b84415c88ad4b9be34197a549737edcfeac8\nA = -15897a5a986641fc2cda42d185d72aa1552eb92f788bb71cc74c0e424bd038e02c620d0686ff88ebdf0bc1632093c0d89e724e7d5b526b0ddc4c7e145aa90b36be0d8574901fdf286df84a6b52674a78cf21ae4865618b4347bd905461d878537b33cc41710ddb290964c48e44d4d2ce2ed82847de75938d23ed418bb9ff1caa03b5c1ac5d65692dd1defbc6013b3270c4314a45dc67883762fda5509b915e8277c1924\nB = -3a7141f54a0bcef68cbc3006166f7e15a5c2394892a428fa417a485981316a537cb3ec757d4a2473fdec2cd61010a9ff865852af8f43afc79a97d394bb6c58643858e2b4dc5cb958c33781b5c35aced7882e8b8d7b4e4249c2b82150adfb0c8f2bbb1cff3d2ea27ed24eae030ef468ae4d6b7462f0b072cd2a2f02426b3290b87b14d14b34e91a94c5bd69e9eda53335cdfa7df90a57f97f3d023ff85537fe0a8bc5d8fd7901722\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 34464b7a50713d17b01b5940b5acfaa7006aa6b9b083bc17e0535b08783761391eaca8703af2edbe13dd0fe9036d38aecfd9faae08c0861042ea1a25b41fa8a15b7721909783de3aca127e955e177987518dd010306a795bb66466fccd55bd9e2bde17470cbd36b1e8f8b63805229754387a5fb40f3ee9a8afb2e51e25c8bea\nA = 701ae8c5bafab7f41c999e492f04a7626b2b1054e6dce1b83002b2d3de46717225b018733b0fa8fe3f973202da8a090ae3fd14f48b27097513ecd4ceb1b9729e7783c17fee9be5221fce4ed3860275b3b36b7416594d2b65e198ff564e82301cae23756c878494e57b5ea8fd22ad800a582cae32fbc985d122cbc6e0eac77c1000d3ede45ae7aa087534adfdea8e9f924efa1b19c43dfd3b7bc83d7c40df7c6578a320a19\nB = 18e0256543619a750384d30b6a7afbbcbdcd9a2ce644dbfc97a8ff699e118032558f706502c9b956695cb25a46d7526596b3d0b67b69611009265838bec533a9488d24583e7d7f2284e23c3cc4ccc5920fc57e24f60da0d479d41f5b9c6ad9152903a4f37842176c6257fb1e3e0681d6d583e704c1d1b24cf616fe638106638fe9d79a0c74f0df67cb2df9d99185324ebb037d01ba0066ba947d5345cd3201b19769d438c43292f572\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = bc57cbb3e1051d3a3035f77c2e375c7e3221dd472edb1a5ccaa7521849fc0ccc7568238aea9335a733d839e89ace6f2b66ef238267e0050c065c3d9553cf50cc5cd93d34fb43c3ea1c31b8ebf0b751f595a7e5e3e860b366229de4286b9d3f0267f78c6888ab3f208c55d9292079116ea0eb9f4ec2934c97149aa132c03336ea\nA = 1ffb0aac11f6d1d257ef7aa997a030e2a12b0615fb11ff04f344f6ecd550e8e77e9883c246e009af33a51204e4066ed4249950e022a61337848dae17c88317e15ade5b5499c0d7597a69a02b6c18db0f975c19c16d2167c583571e947676ae9c15be60e69d76e78329aed5fa57dc5e616795b5487f3d52bfe74b54bbf93ceda093c2e14104a6d2f017f0d200a9fc89deaa283e04b0bd9015ec67598425312868eeefeae9c996\nB = -9de2d82e25b449b8ca4b02b2d2fc0a023fc5804ea553aa84674a815bd74193a2e549070e2cfa0b90a53070646875282fdf855940905f834f5a07f073093c658cd1813fc5cd7092af592092d789ab5481bfb14b6683139646cff8eb1c5dcdb6a33113d1c97d4b587f15f972c06046730b7e712a8e3dd5f4bfd07cfae289047de31776f222d11510ab6b70a200ceeb6802d6c33f913c509b31b96e2b8dba9e25b0d2250c3b102d814683f1\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9f7f4e010370ec1d76fa83f73c80825c3b71521855fca5db06d7ed830c910d0430375bf319671f6a83bf6b57d9d53cfaaed5bc5d615c5690df0067b18791c33cb9f0ac9fa5f0473e4f4eb7840b0b660962097606b3de5744089ffb37d9c0df1123a91a5896d4deeab8aebec469b099a3a9a4f6d822030ec2fc4d11636706fd0d\nA = -7f56093243ec2399548ed95df79363e6ff09de211dfffc314b7cee526535def0f9a8eb9aa6f1736528ee7aae8be55c06645708d576111766ea33e0564c12103edd61ede3128a7a642f968eefd0d7f3768b1325c2dd910d459b15e54145a234225fd29932234e59d3ff5099ec4d5b5c6075f56382ade1101115c7b94e1e2a7bf075dec210fdaf2357c735416dd5d616335002d1cde6056bf7c478f810b78c661a3dbe6e54084bc9\nB = 4df1a6296428d06f51f31a1b0f66d0b77a04db3bb8e1b80d64da649899a1a55d4041bf0bb47d3e3936ee0f3740e1e8c2b235e1b8944d28c7d617d1f968abcde9dce10d6e3c27b2e3607d8df815f5a39da9b5569e95eee1fe5532c0a80011e7415800d8a9ec175fb1d13dad959becf04964b70dabde6d37072dc9f6d914309b850cda33a565515dd6c0181fc48bc7033b314ae0bd5872480e02ffc08dac4e3030d83b33488cf149e19b0021b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 6da5fcea305cc6eb47fb17190889e6a39c339da1bea2d7c95e997fc538b4aeec8b0edf7c109faad7fb6c656420f4afa104ada7a0d3d14d3ef0fc6774b59aa2687c0b4efe7c3fc83194a89c832f7168346cadc2b1fa6fa9a23a67c91ad731b4cfb9943738c7f9951945b2eabb3743473d9c0444ade756291f53fc7641501597a2\nA = -19dfb98f9f7d20fd331ea749d2019d8367935fb75ecde45d6dabc815ab9e593e51178a72816f85aa678304e6ff3a2c24079a59aca253d76c4ac633fea1070753ce770765bce47428f8f5ae40c26a3ac91ddb551b3d575bad9a3b6fc7954acc93aad2131b78fd212fb0db7cca4195b41651a5311bbd4d8c64f1c93e6520eef8e6308e98caa1cd0d3c9b4041182cbfa131c4948257f1200b1c5351bee77ac8bc8e44680ce64ed0648f3\nB = -2736d5038c60553927f389c0650bb1355b0ce745a7dc5f52c9909039465344af910a5f6a9cc4ec130b9877c1cbb52fc08b20d672e42b853d26a02bc07eabb9e3f91399db8465b6a8b1c9f4a4b9eeeec6e9b6180f1a770c139c8f29ceced61cc7ba182884ae01d14dd85bc924391333e8ef039b586b6a0ae18db3570aa560c2b0226d5e23e7e753873637c25aeb19e74997da4f5d0755571785bebbc7dade57446e0df4cdb8df23c1003533f60a\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = c0265805aa8ab52da5aec06ef7cad2026fa0b18edb27b4903e3c068ca6464465e34d3f3bd",
+    "b4bcc10a19441040deaf5569645f7e09b36c56631b3a6144d6206d39c9bcac53b54210db6d484cd6a2780bc68c07272de03a9bba7e51c9d86cc8883cd2e1864a2ed711d505930143c883c57545e9c40851c6df8b3314a8c9a0d201c\nA = 5622f906b077d243521325be82a43fce321412bdab1f15e4ff0c11a7066a288b7939afc01d30243c8a4150e74286611ac1ca4daf457aa23508a7af869d2d55f54f2746afaec477cd7df0d5711dd636802ae7f673b3f730236ac3899330f89cb71d48c2838322fe856d9d8b4053d9c1e66acdb5e43614ecff954dbe37c5269d7ffe00b34e682c0be3d7cf653ef212daa3d55dff92b329126636e440b0bab55f4810a2849f77c39ebb93e\nB = 1ebe0d1800b1fcfb67d7d54568e45dc604450c1dbe103ee21d48dda300c1d9b9415dcd9f5a56cf12c2ede3c862e895efb83621435377387b29b882b2acac78386895c7daa90810092bd3062a3a4867f92d54622d7f0b89b40fabc4709fd507d4002ca80de231596630c234fa418611ede0ae4a9616d570232c1b03329bad02220ef64e455c164aadc16190ce35b78060a6b117b4b0641fa64dd8e8cddb5914e7657573804e63dc7b216b1a9aa175c\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 606d2b6f756548568013bdaba6e811dbae88fb01f5f36d30d15dc1e099d86bdca9fc1eb3a785034ea14cb7f4776586327d57ca5a52ea1b30f26e2a76140bbb0e930c7780673770fe22c5ed443c349510e1494ebe402f2621b1e6bde39b8691edbe5c7242efaa6634553e6af146dd40666edf4a3db5d1e7f9347fa1189c1e5168\nA = 14ea5e6fd612945c71fdb17ec44d95015773edc908a85a6645a8eb823d11226545d05b81791401cefc81ce9765eacea7a619cb482f29d38988d355ce731bc9009969b7487a3acca2d2065c1faadc5d6dd8ca1dcd3f3d4ff61d0a75ef75272e62193618f6b802f70795041de26d6ce367ba996dfb91167cb1fa16c8977f982e1718de7d60275a7f66e4ad72ee55ea06267cc4e8b08f488579825cc674b0bdfd34a01bed08b62004fda15b7c\nB = -8a542280f6c8bf4d9fbc96d5bfa6ee0d16a09dffdcbfeaa2dfa1097a760dec7bc540a0b5b2020bab1eaa594117a40a9bb99c3f16fc340c262b29909608740b8e77fe4706a88dc0fc3bcd47998e88fa02f617062393978ac1bfe14235d43f3d5edbdfb9f140412f4fc2dfc05a700f47b1f0f90da7ae07ae781d9ccdbb951f19a8b8a9a7dd8a65942842cf207f3baed3a0b2f08a06ad0d9ab7ad0110346293d51ec53ff8165b925c0e7906be8b7303252\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 512220042f151479a6a8b7c743ba83366cb7733caf37164e9c823422ccbf78b0b83f426a7230f559d50bb0ed3d9486c6a6e25f4cf96c4fdcb2c861566c6a73215b6d08995a14569710cf9e54abded1d77fc7722d06fda4557a3a99862e5ce963e1be25336fb42a4629391cde3aacd47ea5f5426e7185c5df27d9136a6df26f54\nA = -4d108217b778694931088bc255d1f69cf8f5a14252156163f948ae58d58f2ed54f518177d668e795474952c930052c1bcfcae11bcd15af168ec2e881e6ddc8de257d0cff90ff3ad409bb3a080d30fdfda99078cc3ad8302a4bdd77de66ac082b40fddb3cb36c75a86bacaf60984a74a0fd575d751ed2830650d85844aba9e3f781b2dc6b515bdb8d9459b083e1aa653ef177de76282e86c99e97dae9c0b050c9e6456a051e7d99adad7be4e4\nB = 7b9079504c635655a588ac360955fceb10cdea5f3de548ca2db681da38c17a70df5798f72cf18691d14a5f400ac69fbb47e64115cf071466c54bc7077a228249209542683ba57791352ef3409f6a947865d8f234ea9d39491b5c001685487b32130bce9aeade97d9537afe3f2f87e8f3315619ef7f215a73cb724f1adca99b90912aeecdc81485c0d00a74387ea99c965118fc6a9af1163e60d1ee6a1eeb12d7c2bb9a54f747a415beb5873d616fa0eafa\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = e36899d83a143c82e19e11494ba18478c0a9497fc89fd83df38adcb6b33918645a416626409a156899c6583ab9a4426438d9c32cac54b78df579cb7b6b1feb3f39ca4a6183743a4b823082896a89f9f1722be842cb2d2ceb605f84a9f9b61cdc7e184593fc2f9ff2994fe6cc4860d255809d04ab47e154eaec9ecc807ceb298\nA = -1422272d9e91a14b38b3e81cbd9411a0cafca23addf4f33c94a1bca70603db879dd8a9c0b95f5986bcb447731219c4f9b32a1e3253b027b7963ce40279dbf4008e526adc0bd7bcb2b533392a105c6e8e1bddfdd2bde7dfa0d2e3b1c6ffa07fea07ecdb9fc828283e93b0ce4861945562478b1a56de32251b7d31f9a2309488f7cbdcc38cd6b1c951570675ef0d61e1df69fed78979dc755f160d93ab5a3e65dc2944d3333cb85aaf87a153a90fa\nB = -2424fc1e71286ce3be684a10dd885e4891b52e9009c3021d90ebcaf68b6db81130bdbb74869cbf142e0f44ae72684fc12c85abb5157987428c7812889beecfd7bb43fcac2eb6298ebf1dbcd2e70e4274841c2703b8685df18f6e5bbaa1422004797defc6ba843e77f891bbb46699a863bc1d77c5e3cab809c247e2975e8170da00fd9c8b232abc3fc6b16951ac4e6c96f9503c1ff2d6832ff9c35b2c8aa408645849c577d2b8599ef520da57fe2a9eccfcba6\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 4e8a59476d47ee2cd0217bae2981cf25a2c38e5f5d5c30c2d8bf95856a6e8f42429e565f1836365e550d85207246514624e7ed932d6f5802a50ff9f15d500dd84b27729c1717a3df0f2d6dfd40f0094208445193ba6500ba03fa3f4bdeaf9251aace8729b32ec3215bcfa170575e26265fe523cf44a071470e3b1547901e9227\nA = 452cfc78cb9597e67aacd4ec83e5b473ab8b7a1dcb6097fab37e25d5a6e25c69c73a6c20de0e2a744375bbfe7f612036e69c7a503255d9e17c6ec1dc6cc6f634d4c79bed4764496e5c7c026fdf9408242d3b234195e67a5681e7d7b861f58eb631ddb9aeeb0e5b3ff7a7657a7fde5975b8a9e1f643893bac47debf7918c7ef8f6d7439320dccaf63b80ec9761559078baa8e35d98fb9dc242ba83536eef7ba9901395ef02b19990d8312203df7dc1\nB = 1dc222e7a737e6d97a703fa232defc6c0a4fb2bafd247c8e547b9c474421cacb7692ec98f94be19a5e40269e1f5713d06a6d081a943dbc667bc867e481b99c55e437061cd44c4482649faf870d9347e0252ba9dbe116fb4992dc2c2a0583c1351e9e01e71e9324f5fa942322485bca93c2d95cf304028e68224fed446966073ec7326c93ae326a7a533a36e053437910418bf1761abd9c4c5ab7e6f538e9bf963903e6c80f21a0a38a683e8166e4626a8d8b743f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = a4d5e9fb7f0d75ce41ffecacd2ee1e4d15f82dfd4decf5ab1bee75fb97792d0d574fee60a30b15af80bd38e6a25b1821e61628dbe456e39fea3f8a9ee6ef3d2332412be1500fada0c1728a1457656eb3e9d94c64fb2d0ac89f10f2b9ff57d73207274ae7e8c7538936cb7241615b830cc9011d4363ef88f51c7b3ed503c25179\nA = 13eeef030b3110451fcb1a258434aeb51d3dc805b38c72ef7c79d4b0e18d600e5dd28b552b59f3dda1898367ec7da5dc6d9089a585cf52002eaf8f9ec64b8d3ec50d0bef7dc3faf203c48583ec89757cfeaf888ec4a91470a6b8ec9f26a6b07f3311b4fe972cac2f2ffe47f5c11d2dca87c62680e2229120cba4de9cfce9f7f5c33af8398c07ffabac1675de1845e05a32536329647214e54e5d9216fc0cbf2730898eae19e425688bf184d16bd1d655\nB = -ea324da99252edb03f40100e528d9a5080c43be97fe4b7e03d9563ba48040d328e57d0defd4b7ffa9bef3ca0d2682aefd2a0ffca8566e755b11f2e3c6c1b707f1b9465592aba6181e583babd5c70588e7123361a8ae77d8c398e33f894ee288babea1d7eb63e2f3de469e502b5048417043c5a9a9a3eb921cea1533162e3ce9c79e6caf62bbe7e17b180b72c59b9ef5fe1a001b733d909a8278029fb4a63077ef9b3545f1159ad73dd75030aad599ea4884677e01f\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 2f096fb8fe2156c41ab695956f13f0fd9a084f87ea5f5b1acb6b60c62617b8d7079f4b072223ba18cde474af3942599fe070ddb0ac1a99f42b9506a2648e1b8f6106015aba0bf7a824842403bd3f4ac8b6fc4a9861bf0e8ac59be0322f0495e4b515fd579dfef273160ddf96e453f4ab663e703609c709fb1f016ca919fb26c\nA = -4212bf679cc00adb2ca502604b71dd5dab99cdfaf55ae92aee6bcf8b3b6354a384656c09eec6175a95c8cb4591ce118e783d6344525c25e5b356e45802ea3ce1fe764833132e6b7bec434e4481c9cc2986904988bd8da7dc2e31cdc481fd0e359674bbff524124bab1ba4379885a6cfc1b73d953e6d1aa1b938129d74fac9dc597c31383f2f7e02fd995f7065290a9812ba8e205316ad5bac6fc65c6c7310f1a6b033503ebfe85bf6d3851bea1b65b9c15\nB = 7ad83f97f40d5be508cb394c128764532f0aee9a108eb02840ca1c635860b6d751d5f676e8670e2f61466397e1bc68f97ea52d64b335d07aed22f20bb1ed19e3e42e4205d650e6d37714c2f80d39b111577725e3bc7ce75bd7ed5e44f8377d5fc2b97f05c3c1ed5",
+    "ca1ec90ba3ff7935a25a8acbcb15fe1fc7aeaa1e444cc2f06c1e6711721d24b8969d465e4958cb87924b3e0fe99ccb371009b5b15747bf6dd5d0fb73b8fdf58d955c8773a55424a34c741406f6f904\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 909626a69c803e9acdca97c56781eb672d6fb31430a53b853f467ca26d4ae96c182d71c0212894b776c88e773acbe9602e3ca56584c39b5947724290def7dbf04c6853a108c1282def95dbd5bdc015b68daeea0ee959b35bc5af98a4ae4cc7486e627bc9432bd009b21ee9af3085f074a3ae1bca879e321018e991e7898f2897\nA = -14eb8e28dd04a159c576eb10578c24fad9eedd3d8b7560b681002a54a4bce2167de05cd061338f63c50b86327a79595a2dbfc1d3f4e76aabaf88cfedb69faf5148c61f8cfb2130511a3bf4a17d846ededd4c08f3b635182dff1854e8c4c48007af028e06f01235fc2becdb32adcb9e2058dcf8f8655624bed9915faa06be972282cfbf8530bc0cf2de5b2057df32e4a6cbc3c772feea0a511cfe3408a6dab0e2714fc4cf15602ba0da03bf0016f1f3f5ddfe1\nB = -388da160568aef9f82fc16f48a22e8d7aeac99121cfac9b748c815e5d3a823b673ddcd20c1168f98ba204df5e52535f61b224fc0374092f8c834321949fa0a812b5e65c492fd9fe8246b74143a943bcdbeba16024e311d673357a3dd3eaef9ae3a72bb06e03e34e091cbe5b6a9eb9fa3d7f36c03baa5c3e242f2c186b58db5dddbd73f6aa54aae027529b8f8f0a536b9b283ab08247b9977a2ac2d0d9f162ad03a2fe247d2c589b1a2d14b5f90d5b9c0a95918ea956e261b\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 128e8844a2f04704a4a60cd33e85cb7ad373ff683abd167894a35a1daf947f504c0abd7a614e293ce10797a5330147c88c4d5e1dad1bdbeaf74095e3f5a515f2af68b7bc11ee1f53b493133905b654318dcfe73118ef1931eac47deb6c4958406b704ce027d9b027803eb8e639b52d5983094b8ff4b54e86a7dc6ea169ff1af4\nA = 75e6b045aa44dd9b8f4b434dd4bb1346fcf558a5e96b00fef9b6cfaca72fe8b1672edc2a64beee8b959683b1861138b297629b44a0caec6bad2ac05665728379cffaf66a129f0ba40aab7c6b1c3fbdabaabc87ed3dd580ba80ec7ee765e9a8fbe845c0d207eee7a1a3a0c39650c75ccb6bcdae2e0d5149991dc3bf899ae9b7626a2baa17b168b260d82fba84a12f10e09234035e08b730cfc230f0d2651c03e34d4952fca6409b5c6ea5d8791c90466bdc4adf2\nB = 102fc193633b0e60a48dcc17aa76f3e52cbbd1012f179736a0ba7a102f8dfadaf434063b0ed1b1528a018b349eaf192fe62f868b538cddd7e8e6fd98b93147727d58561517b2836e4a373bb31fc8d5e42d16126ed80b880c1a37940c138fc1f7255ee0b7fd39b1b799c34e5178580cdc076ef3fbff65fdff7497398fb1cac75e5c09cc7df1168a20f88a16e7b3ac78091a90f1169bccd48c0d06b4707ab79b741a168deae5ced5d48bb5f5dd3f465e43c82b9db7edab24569b2\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9aa9699d1e5d2c6acb21e31890c1899f30a925b834adb5b8bc8cce83a1718944a2c90faa71b34379a21340457478c0c43121dbd65d62e290eda2ba6230bce4e6f18555a1380c7c95c1700793157f7c1cbabeb09460ca28dc596bb17851ab2ba6dc6bf311ea69bdb7fa8eb78df74adf171d4677a154b8536f8104d919bdd58648\nA = 157fb9e1b38f288db78a1a0e22fdd9f48a59779487a9ada2774a094d34536b85993e7b9ab6e24f081c4cdfb64a82271100a054169e4f1c24e3957ae9aa8300e85eb2a45a6d5987eed4f0fba6fe8557cbf6128e018c5f9df028131bbba6c544b2c6312aeddc71405f0e4ce648fbab9e5d51685949408e4ccbe06fe501a36fc13ee65c31f062313135054b7679eef45964c77f5a1556ac09b11c496d0ba8c6057e283bdaebb4e6d9e5c557d975745f9f98a288d5bbe4\nB = -82cb6334479bd997c771e894cac1ead87dcbaf8f5006be5c70ad48ef94303137bdc45f261af91a201b276a17d884a56ff27af7dc06cc5b7b9c94f7c4d4a36f68f8d309c477b4969a6e7cd1b2afab9deec06555cb753d8a0eb00965359ef865a84bfa87b815a42b2050e1635d5ae5e3743c007bd79e820aa37a968702a960fafbddecebe63f022553cadd7a4d4fb27b4dcb981e8b490e80bbbf13af8c4412d158775db71f5fbc9986e7b8a8f9299574abf7bdf9ce7544e8c4e85bc\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 46e401989fbcde9d830dc6e3c42768999f153d44d270d4805c5beefb470bc1e82706aa7173b359763c5e15d146eca91a32a36f0a80802871933cc7f2ed15a5472988849a2d2f57543345b531538db57ab9bcbfbe787efb0a82e61baa505aad628df5f9e881dababb35bc2decff267eaed3d3671757ae1764ec5163b792b4db3a\nA = -590c16ea2cf7fa7f63b5cf74804333f22fd2d0e1da7d226da8425abad2b39a4672fcebcf5cc15d220b0ecfeec09665e682fff0140f16889f7a6ade9ec11aae3fa3a369b3fc133babe52e42b7a8bb9a24777521f4d9e0efe7d7977dced9e40784c24d2c6056b3b668ada7856da71af73d2dd33d2e481ddf40999d86a6e236d0d73f31a67c52cc8b38203bb2840c0b92c2612ffe5fdb6be87f9a787d70b3dd506f9a63d144db3417495f0a48523c812d14a89710d95bc6\nB = 5a2865cf2254710a1a51ee3056b0c1f6c5f77d22d7aa8f939e6f48ecec529a169e630c554bbe682a8c4de9ce4daca77a278d7e752cb678141ddefa75ba42e661885a82ab55d699414ffeb75802cb8f4e7583bec8a7ab58803b378bb60fd46f476ea490c9aaba568ec17f3a6afdd6f20ec54a512f7aaf62d2f941e35b4b72dea77095e863dcb38bcaf8777707c1dd437ef2ac6b6a8b2b832f80ad2a6d6f279c053d02058b1a657a1cf5b6b269e15d29087b0cfc0c2d4c3fbf32a167a3\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 1c9649f4540556ae82ffd71b2c71ea8588aeb845c50dab595db9f8faa01a26c809d30d8433b6c0add465e164cda2b6723c942ee87241eb7baf9944cae08babd8e22a0eaf35c09e9efdfb9f8bfa65d53ee6eb23fcbe1d12a66ae05e7592ed788b231b000f895d098a24febcfa4372d249575926a5faf966072f29a62a401ec51c\nA = -1bc9ae5fc2f6a3f1274584bac1e145f02c5e8c4779f4df15e98dd34344c988c1437ee4428485a09090d81b18606a6ea5c1b9136872ab5b37373fbffbb5b3fa8fbeca1e112b9f1643658c2f38b9548cd8f0f271779ce0acad403177057ea0a2af2e7435109879941fbf463488a2522b831b95c1cff21d2d816d70c25156369dbcf04a0e28e1d746afb8a77713703fefa512816fe73e203bb4c3428efe09b946b750199bd7a03d30feb90230c219a103ad4528cbe0de1e5f6\nB = -39cae179d955049f830867d4115d3bae25127c945b1fa0c16fa850e8fd77c1b3b9b7916b9983c1659b7cee77b7dc72abfff1c56681b7931c5e58cfe4f1bf0168ae32df0df8f652223885717a98f858a497b1a4be62a2215c39316c34451b0d957791f49139921d9ac8041899b8fdd5d3d443547a26ddf5748147e4c3e93f5043ede42f38a9baa628df65d3d6148ac2ce182056700f0f94029be05d3ea3a218b40f65a87b4baf097fce107c080de24880259f1046175db1297016af76d94\nM = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4\n\nModMul = 9fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c\nA = 71b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905\nB = 167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d\nA = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5\nB = -bfee56cd412318cd62e7b6cc49217345d3a94e7fbf6fa19053fa685efbc0f8b320b7e43883189396781c49371dffe7d126c032d1ae4b6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032",
+    "ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf\nA = -7bc53f6f2e78628678ebc8e35ae4905caeec61acca5c64fdf595689cf005bde2265cd43172802fc133dafd933d7b48def44256868d202727a4aa6c0cde66\nB = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 43c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21\nA = -1e6ce0b44105047d0da0eca7b936980267db41d41319dd5315889fe8fa2329023d7cf54f71ee179b5bfedf442cdad1920d311966f7175cbb953bb42ee105393\nB = -23a330c7e06cdef4b6b121d15a9c0bc774eb5e432e72d04c5f03a0c588e55e010b61f57c03c51edb1211685d8dfd2a35393091fd0e3ad2304fb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a\nA = 6bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152\nB = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d\nA = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e\nB = -de60cd639044e863c6a49c73213dbc2ca84e4225aefa5f880e829f2d9cb48ae92e3f2680c462ac697dc34da38f65fcdc1b4d8c3c99e8cbe29660b539\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d\nA = -50ff3e00feeb2efc6df6387d6409a622b7a8297a717b8d94d0dc41c6ec6f29a8455c3580019349660b31dea1e4f66b74147de93535e671c853b604ba06a9b62d34646c\nB = 49ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4\nA = -167ee0fa8e5d8b569d7848b068df06f6baed80f6fa6a442f9d11d9712622b512249b92c7ccb821ac751fe4ec0a7a47e04ea5571c7cb45a7985749ecdd87f0c0faea01d232\nB = -2207fd8dbf2b8e9a5e3cc515479cde241dd3671803f9fbf7859459ac66705be055fa759c85631ed2a61139657eee7eb08fd963b49e33666e60b7e75dd26b5d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761\nA = 413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a\nB = 1b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327\nA = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82\nB = -d7b7701340c5a358455ca5fa314ad83860d9f765978ff652d7f542de2e123bb976930b8fe84b9608648324450d8ed2bac4e44f2fc71711ae813cd8793af8d3796e8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010\nA = -4f1568c207a9ec970b5c26f068f3cc8019e8cb483525d251cd2919b368d072ac8f40017a19fc7437cf88e927c9e7d6f539ee84865f0af24be0d6d98fb33d74e3e0d28020c00bcd61\nB = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89\nA = -1fd1f634685eb1470dd9080529a891253a28a0b31e15c662733e20d43fc4cd71f4cfe83c3774adf8293a0fc3bd806d0b31b61c6ed0b4414ccdb91e2994e22797e5771c63defcc0887f1\nB = -3ec0478afdf54c949a097ca411be41f931acb750ef4f0ce97d0f0fc77cf15970cfbe24b170aa332de04836b7a0e6c5d456814182d27c8310d5fb662a818bc421587d95fc5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af19",
+    "6f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14\nA = 572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f\nB = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe\nA = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9\nB = -95ab2c47f85001aa852d6999f29644a6a55f9e4e12bf905f911f90d29cd1e4fa4fc9d1a2aa6c215bcb5c5643561499aab8f2678fdc5fa9c6ec138aeb2d62f635c45f239e46b0fa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5\nA = -78a6a6ef40e443c52036e75f0b35938d632bd45aebf45a1fff5c2e1b6f601a57382b9a82c3e8b2984e643eb1570cd83f3a6be6daac567ddf9f37bd96785662bc3cfee6f47503d239c77781a8df\nB = 4920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f\nA = -143d843e3b12431fa0d873815a757a214cf731c298db61ab13cb87fe78b0a6184bd1fdcfec0c7661b10775b4ee2c815dede0ed497977c9ec5154f7b24a8a786501ddb8dd257bea51b9fd9401ff760\nB = -25d4da7b64f439987eacbde66abadf0da7c1653c1c1c6d9b2092351fbc714a20d2d7ad8093209da371150b69b3602480595533ecc1f3c5005a8ead10732272246d8cdfbab87c49e65223\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a\nA = 402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207\nB = 1648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd\nA = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6\nB = -851a39d8b0101fdb22ea9e367286e572dd132b8a77a6a14dd0e995131467aee898230f37dc6224e35bed2eaf459aae579181a161450bd7ebe6b62ea7154a8a0ab590ca4a6c2f05531c4e24650\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde\nA = -511565611538828ff7dbc45c273fe46f4f5105d41ccf5dd343b41e9dc579429e56a9cefc54657ef0422960d1375b72411a5cc93ffa323455e006e242580358d6cfb641f46b9c36fa777a613b17dd4a187454\nB = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8\nA = -170cc62ad57094d307ce1b317ae5e825c2f2e317ad6060437afa105501caea00dc9a86af8729e2f3c3a854387dc3ba368c0a84aab1a527ab34fe27b0a69bc71c728cca87be728457c65eea7d7538ef3aa282615\nB = -3d9da1377a88f647de57ade46dc7caf71b4f42bbfaa5e77f16cfcc90f00b5d3e9e9d82355104c7cd0db4c1dac0496be3aa35706cfc0a30a1329755faa439694e8e9b41fba8f1ebb46140818c7008e27\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a\nA = 4f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013\nB = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9\nA = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d\nB = -94b683326e9de19e414f653aeb2cb4bd7b17e76a23de6a4d91c43d717a35e08f2155b444a9549dfd01a8aec4dc901ea9f629f16bafd2c84828b12d2f63dc154323eb2d54938895ec4c9efbcaaede274fd4ab\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889",
+    "f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f\nA = -469f61cbff01f0e4124ba69a860ec6dbc75cd758dd8ac7cbfed97645b16488a329adee62d1a66e90ee4212569d56d58b61676262f49dcb68296bbe5d8e23853e3fefe8a304710cea568ca65c183531a992ec5b4d82e226\nB = 4a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24\nA = -122621d97f42b65b060c84df3f0c0da097b5e240731b77a37bb9471e7e398b242db6f1b5e25062a9bed702860ccf6aaf386c1d6fcf60fc31b8c190d3486949c5772b9e621b863a7cbf29449ddd68b7e0c21e669492e58e94a\nB = -33978406dd30ec2b192c416e422428683deac210017cac9e4355e8446d6969295b0fbaa8cabc92c1fc0068da70efa047f938a419bac160ed6f794a9f69f53a88648c9725610d5f309b652f5462bd3011cf68ea859b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0\nA = 7b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e\nB = 156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23\nA = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928\nB = -e08372fc766eba6e0ef55a9149d700b503e2e3f978c8a397912e2735d5bcff69c461561ac0822c44160c7c1bbf722df421b74beada57462ac54a9bdcdb42d6a27b86413036ed2282abf62800fb2518a32a4a135bc948053\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9\nA = -5d3568858c05a15bc9777af949eb01d33dfdba58439fb3f7af2ba792efe8e78b16d7fbc2a303a4c4c4be7c9d43f57405e88be54d6ab55268a4739945ef582921d2877019659dadbc76e0939f4b2cfbc91e5356ba2ed531526ed5b9b3\nB = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f\nA = -175011349a0a1ceba11756bd528f2bd631c106e709aab223032d08d52d7d6724e8c5b055b6f97b48261f4860eae297badc1214cdae9b2500a7a47b4b777dd7b8f1006757754ff1143b637d2a3adc555f38eafbd5478cde0b04e5f46d3f0\nB = -2aa7f75d6801b04ea9f690aa0c5448906595fd28b53775059c01efe54b463f1d87c9fb4b39cb038e770f99bb995a2118b86ff8d004bd964e958c2af82becf362fb0b927c671cc3bd7185990419d26a827a2d81bbc0126e1029556\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65\nA = 58e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807\nB = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308\nA = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983\nB = -87871b2058d33cb67d83b6a56ab27839c6a6c771bd94e55f200a1257f2c737e39c4a0403fa410ea64e8f442d300df1c19c2f03d07fb74d94f86d26814fca23d4cd2cd3718252cf0cd8a0e36726f6e68827a1dab6bbb1d23b884381c702\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa\nA = -4ee01518f6581c560a186fa05c6f4bc26809c4822cc74a0bb74d5a6b0a368aa9bd0108f26113443422b8c589084ad49f919a9e7821d99127bb210670e732b7cdf610e464e300a39d3dfa7c82f90cf00ce329bc6763d7b1d4224a020095112fefa7\nB = 72dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c62",
+    "5fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f\nA = -17b3e0c9288be15fda58c8fd228216bc466731d631218a7ddf1d2c9cc858c0219cb0757d3b680bca1b1964eb15031b5b9d761a8bcbd160db89be339067a2ea35e1ac3cfed701912a17ef9ea03999d92e3592e893183ddc05cbb98a656983b54590c72\nB = -269f96a4634eb37cf8a6608408128587ba45958405a29827d0d03d34816fcb1a2297f1319485439d3e8594532545086efbe4d21d31d30e2daf09b74fa8cb27df54e8f9f993630cd9a292c977eee70887158bd3fa3cfef321ef900a0598ac8cea\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173\nA = 7906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df\nB = 1479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848\nA = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40\nB = -cc5349a9c5280a933e87ca38ce458a711c71ffebb40bb1f7612b42b4684afc495e99c4a5f32eef1c9564c2b7612ea4cda7a0f5df6b3ec9026447dc565ca08563d46aec7ced9fc4cc5645960210d44cdc3944149051d569c9295dc50862f8f6d1f6cd1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146\nA = -5c3d24fdb193ed83f5f6a825c1716f98e3cde6b32e09659f253ca3fd2a39402b5bc3a6497ed7bc908838e93422559a13cf59156254bd3fe1e3b8600b2a777943cdb39b9d42c58043f1d587424425d3ef5f5538ea157112970ce3e09a87fbb5f7c96f1b5e65fa\nB = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02\nA = -1be86e7c87827922d2e8a06e3cd6b64ac9a280c525749bcdbfac4856916321a964c9346d17465378251e6eada42dadf38bc9d7d87367bec94ebdc21af6b1302e520db08a64ba6b39920683725ef02b011a3e4ba46ef0eefadb98582cb911d0cbeae9c231b5e432c\nB = -352059faf97b433089a688c702b97adefd0c91d51a0395647f822c6762fee3287693e302fc5a5584a12c048dea1a320cb96fa70b5daff7c2ea21d249467d14c6bbee15a1e94c030e908342a939fbe8ae0de58cb6d6eae7758485e392ff6d5d64465b701692c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c\nA = 65e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7\nB = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343\nA = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd\nB = -afd61df72361260484fade8b432713eb740df83a401d73492883a5139c918d5c911ff5dc00140637da1c6acfbab4b0bc8fc1f337243d90beeb1c2a083ad8069494c73a99372bd38712a5b5393c779ec1915e878600e0b48157bea44ca8e97c6099c4ab07fbda57d1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35\nA = -47c5755ca61ca8b7ea927f6fbe347f1362915548ab38c40f0418f4c9ba4ad520c3b2469d9ba3976669dec0b278461bae80eda53e9d11447512963e797f45460f74678acdd69fb9efe3897913b6568f8e03a6d90b4cb5bfb06af132bf118574b70e6bd2f6d6cb4d0089379d\nB = 5bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a\nA = -1d68bddd8c3e6b78daa0acfc63a6f39e97f19527a43f6cdec47568d57b47f4e4b7ee88e4a28d683b569e406ecd2510351dba25f10b9f7c82d6da16d848bb970cedf7675e67937921bd334eec4bc8fde83d67aca57eec804ce22bb342167602fbff452d5f0f2a7f38b576e1e50\nB = -34d219765916a4",
+    "c8ec843ebee9a7aa1162974d41cb4d6b60532513608452da9993749455d9701af6b7b6c7454d7f2fd5c344cc938baa5259301d4b56ae8d25b6f6510ae6bca114cae6791fa5a9551e8a405f5b1c0bbfc27138563b2d64f9a4d7a8f42a23bfacc3f1ec9393\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff\nA = 773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a\nB = 13d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7\nA = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967\nB = -9711e5b3965654bd9427f79c89a0b3f3cdec1c857f4451eec236c1f221bb6773e5dcc30e7381a18a813ac2b03ff4a4ba679aad41e0e5d7181d4627f682ca2dc8af9a8b4f878771446fb225a979ef9c7e641cac819c307c8dc50d9c1ebadf912ec7c844e416f95b546cf09391f9f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453\nA = -75231ed37f1dfa4487c9fc79a6f7b36929fdca086e42ed41f79430b2dff521919236fe415ccce590e1d3b986e16dda866f3f0d29ac1adcf55d87fa5cb67dbf4693293188516e360bac513303769c42181483fbef7abcbc4fea1310c916396d29f37d9058a62aead94511aded7c4b8de8\nB = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c\nA = -1bc03897b02d1edb633e2c019e40c20c1d89a210b0733412aab675563fae8bd75dd7e65988cd8df4d9b343586e27f548becdde274f62dd421679554ed9eb127e527a69d69fa8b17aac0424dfa2a7692d1e63617ea45564b55f01a70325bca050862d583cdad96c4a2e123d0ed827348a745\nB = -3d5239dbe7bb3dcfd8027204eccf5e9444e68d322a0b0c535a203a1d0c054e7dc1e588bacb891388241462a5d2b43e6cce34ce46a23e6ef29670603d31001374dfa347dfcc794988e58945d0d2d17da6565cfea559203dec119fc357d396f65b296deb07686b0ad2d25a13fd4fad88d2c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149\nA = 4a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261\nB = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656\nA = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228\nB = -a7cbbb6a434e4b022d312ecd4a45fc7fc4d3aaca038cca0fc56e529fe7119ccdddc8e76d51a2fb862ad3d27a16ec8a51e5f66b9c7fdfbddcd05a0ddea14172339cee340c8c651eb653c6aab6551c99ae94f26116e15dc62f2c2e63305bbf84590fba1327ee721150d46464d7e22d45d53ffd44\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e\nA = -4df3899b40d51c83dacb442fb143835bcdb550136921df78800f0515a6cee77fe3236dadd2a0800b79ebdaaf8cf4aba5ebb60cdff3e4b4531ecd0903c1674a4559339123e9f09158080fc53c4c6ae72c961c8da2f357b7c05368157b4956e592c41b25642457651abfecb4fed5d9fc1fc3825b772d\nB = 450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e\nA = -143caf995b7783b1316b5551978727f06512fe114b419c735b3381ec351275fb7fbd6ca88b848c3e8c9faedebd6d084cb8a231636f68f6803d14bafd90534609d4a4ac0fb953417be7fee4e4cfefa452c5ee5d1e1b97ee75f83cca8691a0efeaa8bcc1f1e0f18c0c5d6c7684c9da6c9495d31a32f40a5\nB = -3025fa05c55826c40089b12741b7d406f748cabf692bb0227519a124653160142633700e3c0676000943556f97551171d231c1a35f7b7d8f96b0366eb74942466ceb4660f09aecb2fb2ac050ef699eb05bd8834a2ba959ac71550b5c026b9093c8cbbb7c5fb9390a7818db682b7c11e58996c9d0add5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab6876510",
+    "99c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb\nA = 499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99\nB = 17a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd9330a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a\nA = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8\nB = -de3563925474e5408e245184b57f328e265b6cb62eedcaba809d8f257eccc0a457eeb82c451f93af93ce9f36dd1aab386e7c02b356f31c2d170169dbe15e70cf5bb9073b35fe0e7c7fd7faa91c5b2b0740734f12eb741a9d9ac6dcf7cff59f6e16324ea39e1e07dc5b9daea27ac674dfe5d0a5790abaebde9\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 1aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc\nA = -4fb2e3fde2a0c653104c077cc6459c9234f86cc2d7b317329b68289826d3e2b975f1a69bed1a53418a0dd86e1b2723f4c4c5a29d003161e667c2315ec24a36f8bb5f2eb0a94f261e791bb829db685cd0ec9e1e301dc140ea57cac1da228124ae029e2b8ab1fa3ab99c55a9ca94dc7b767162c0a24af851fbb984\nB = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc\nA = -1b2496ef929bc673042996ae80f27c6bbd33fa7c20580240ef8fba985d1a6117d6e746989924e34f281e7d2509175d0773dd999bde16662e88fcef52978d19cc45fbae3997fa580a66171d398f4f0e7605d9f4aa4f728902cb886e6b6dc9f0161e7cf1ebac05a09c5a1bd69a92273280758173fd2c14550ec221275\nB = -28399206ae2820d26a5aa0bddc4903776611d08fc4cb34a22a8bdc2a19e9f8cdab94217f346a8070a4145f989e1dfb49cfd100267635af0e062872cc879c534ff138fca603b5d45a6860ea85b6de37cfca000c81fcda3d14ffe81da919b2a25214209b085bab9cb511889665fc845acbcd038711533da171d8308aa\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472\nA = 796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6\nB = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d\nA = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1\nB = -a31a574d105305e47f4fc00ccea0cdf854556886b524901c22e6f3b59a42915932ab209a8d5da29ab70d1472dd5378d9c79a7447d17665f9d1f1edc1e545e417cb65415cb8a368075c16264f42555d26e83adc704b5c126c6129318a8f394af8bdbb32c8114470d11b2acfe806acdc7b96e1e348a32ff96a988de76d4623\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd\nA = -5fafbd498d610e9f29c38a5c6c262b71672fe9e9c84f0f071b549390353e4fd0101a059b7c547007e27df97761767302458f1936395142ce5776b0959fc5ea039429d64ac5d50c2ae0ee45d60c0c50b7ceb4ff9853d57c6e883f588017ffcaddf5a1aa3e23ab068877a114d9a2cf742f01f5f5d611424c8ec0d082f5c165b1\nB = 552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f\nA = -1a6b046d691830d33eecf2c53953676ed3f6fdd20c2252f6e915052ec28ad1fbf7a5f264acf87ef8ecd515ed921ce6b85017f3d8a8f1d14f269f31e3307c6f935ad468cf012a912b0650a15106fb949cbae7b36c9cd496538bb0646a7a28989dfadc719424519bfa43cd8833d3a748c758f813881d83c98f7cb2a63c2a4d06b8e\nB = -34f87db0f839af6e4c4bf146789db36b3d0bcebb9bad81db690ccc3a35070d8830c9745b2fe730a1f3a252612e7026bf9889169b57b8984a5479cc4cdd6844ee3e150a2e7bf7680eebbef30e0591c895cc8b2ca488d489554f2339e2f55598717ddd8ce444a060cc95cad9eb4",
+    "78491ee8d3b8358c3762a970224abdc1068af0bde\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad\nA = 54ec203e2ababdb0348135c0679eca2a8e778ed46e53f195331a48d3828e5e40da804ecf95eed819ecefaeb9c5377cc1afb1fb220175990d347981353e7d90637adf8cbb16812af8a3783dd312d967a490f8efe3f23746929cf2a5a8df58e0b878367f6c5e4d3c086f947fc2bf70bfc3a0008a8bb1d7d83f002930640b6ed94c334\nB = 1311b88a05224e15f1465c8da26784dbaeae84f818e029301ea39a982f714c64312f9f02d094c401abb6a89e8537d64c178637364bd261f4a27beeaaa901cc7b3d4e36ebcd9453cda33d47a53c6dd1d121dfb83a222cfd16158eac23482c8abbfaca59e765f6c1fe871d884d281793eb19f6409dd6bbe4083bf762ef24c24f0127613\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d\nA = 145f580c2ebc6c0354ebdfdbb1d3d7fa17f0b55493b0b9a11b71001c840a967dc77f0206c3dde161b5a773a6b5fd9471fa08b205cb6f728e3afba440b55268d6a9542e234ec313d53583c580a391d8da5943f4a900b279ec9d8933f2cfbb260b74ab714a8b9a1af3190d914b6e42212df84f933a237728a5fd5473ce2e272eb82bc83e\nB = -c67f9b9295dd5844307b8fe3cb9c1875257258e4be6229ab097e148c0175ecd0de4d84fe03c8da6e27153c709c2526092b1abc73b5fb40f1d4da9e0f3d8d2fd5f8a4e6f3c30befd80e189b73fbd77e8547b34010d2aa57072db0f00537cf3ced95eb517b23e0c854b4becce128a575a31037c3a9e106a476d8b0277d26dcee435cebedc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca\nA = -5537630b7cfb8daf76d14e617f7b69f7b75b472801a9a818179d83ef2984d0abc8ea4214ed3d3d2bd785060e9c2819e861d0df760fc1daca8340e8a2c997c9ad201d6d2f12a82ae3883cf9f5c51ff1c25277c28175859a7b8e5b6cdec7cb3875071cbe415bb698b85cb19f617162587516f93c728ba8b2cfc19f238e2cfda115b8ec0431\nB = 597296cb27080f33a24241c1e98fdec32f7a4013a7340d367e4cf2a521cd462a2803109c27fcec353a30dd20053a1f744394fed75829e8396f8de434399bafd6cdb6e0ee81343f0cb99ef3087a7c69bd43bd722745a46cdff0c2c837fd87543c3c63df3896ac101a145b478dc224644996fc72460a89beb5741b91a42f2fbaf0d62c099b32\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f\nA = -1c6ac9565d1950ae6c55025f76e0a040eed0462218e97aea87208ba879acedf413ffd5e63a92dd8658cf5f49d633ce7b126091a55701168ee4932db004dfe8c35c939887fae3a892b0b04d8eb74191bf8fdcf5566b4d3796a5d2596b1e750f64201057ae60aa705edd58aba4b48f6a2e511bf5007a6c44a27e3efd5bf2708f7046c1fff7864\nB = -244f2a90a57e5d066fe22f4d52f91b44882b8ef76d1dafc3387abcb224eda4a2100239e729bbc745237f8129d457e98eafb2ede2f3afb81e63520493da2a5730f1170b31fcac21259e90c894f8bc488c5e5dab2c2635bc7b1ff56c3685607f6fead73a09f83a7a168c4245729ce5b06e482d7d3d72eff33d14cfe2f32f72175484ffa292a9af6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d\nA = 558613de283911aea1ee21d6b926f531f778c5226e978ce329860682b5375fe5e5328ae27b00f504f2a2d24470d16c1edcb8e76b4d1a740e55538e79ac7da4b45c5299993513ec3bba7e7395dc829a00d4e228618dd348fbf838eaf0bd50f6c70253fb1c1c734a07d0813915be25d3163df13511f3675022cb85af7646c14ba5d13f615ded8e5\nB = 1f3c3c468146c29408d9207e15b25186d3b06b3fbf9556eff7ed7ef7788032d87ae1a4d2a0983902d4c70936c615d8c9ee26c89af8b58d60231ede54e859763237d5ac59af686300a3e92f456484ce77700557ddc0f93bb40e5d2e5117f2356ac7ffca26dcafb3ce7a5573e07ee97515b6b082fe75fcc9dccd76b4fd416e69a247fab2b30965d9be\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233\nA = 184845d3762ad1a9c925c51fabc7b9e15570a84a06ecef994910845d56869264273d75fbb84a31c97c27eb9779e8b39f6829638a78b266326b60546507f65128caaaf36d4e7f85939b75cfb3145e2b1bd8372531cda579f59efa0da9c95a8efc72faf326d35c660b4444627d328bedf50a919029dd164de051a4c0c924103e365cd640b9637d8244\nB = -977390f52af784b52c1d54e82131b072a1c308406e9b82587102e67c6f7145f0020952231a5f0ce9d130677bb5a7a37d5a06dc570a13a29673c8a9068f06242ac438806c37ec46136e7c1c1487ca2d330fc1f3c1f42ea51ba2805b74c44a61fb2fac109710dc3dae78a07057a753898d4e849b910f035bfd807178f0108812778345b256c7b59f8883\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e\nA = -76e575cc79d7f0c313a489b255e85d114f3933383cdfe75cfef649f639921eefb9b3b3184351fd0ad252c6e477e153ee586a0ff6da1e1b2bfd7e953e6dd778c849843fa5cc355b31f5529ca45aec81ba67a1e364d5a74a4656d266f7decdd47b2fc2d81d6c298afa2d1c39b5e8eed519a9997a14513537cdcddde0b5b41314476264d59b7d3f0e9a65\nB = 6b7faa437b4e8db8fba56c62eddb8a81e9090d1b6655a2185d656b2db0e85225992297381d653e707aa15f3017880b0f07abf3dc455cb09c4e551b3df3516c6db4ead79b88339fc33dda96bba76ff7c388363c36b67fd5dd0ee63f92f67549dd77e37e9902ae51cb58057579f03286fc48e3b7fba763fc5844c222e6a1eed9e1634d0bd034cff222bf147\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135\nA = -18ddf976fec2090f7d1f4d41b8f875e56c813c04338f595d6e591b3eabf9e105be792f45354ee9beff997e6c0e8ec3fd",
+    "c714c07b3466ad1a949b9d30da0115f5484c3b9e00c7cf0c117db57c3c6cd7434371c6d9ac7a5da1a0e2d705bacfc22f62785222d59bb5bcd3e3bf2df8e845953c6ddf1b546cb75b1698dc8e20bc611294ff288056723f1e46ec9\nB = -2cbaff39103570df7d85a5673b50fb8818434bbc19ab4e33bcc8289a4047d85de1b7029a5cda3976ab12e1d891b7efe3d5576bcb3713c597771f93532853290068761bea04200fcaf9b05d8553b960ef5e28064de89d9e5097d12b26af0b64beb40b33ff82a55af7c5838b44282917fd4342e2065942c724f3cca515d9142fb8e46652242e8f0ee5ae07b6cb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c\nA = 5cb6c49efc6767cf956885690ef740337aa71b90c1d4b9b0a9e4734de0c0c50f2358fd45aeedaca6e1dd0fb510bf097bf46513ee09f3343bbd1c11f507eb61d51ada40c5d6b730561756480063f60caf05141bec9a769c241d367cb92fa8e229ba2e471fc73f48812a25bfc7553c395ca77b80443ccaa82fbb7198f8c35c3b5a2fff977d8b2a29cf9358ee1\nB = 16ff229a0e67a410555dbd4b687f1470ec854ef67db73a902f2d19953c55071c4a26dc320baa8571586f1fd54fa490b0d87dc83e5bf20b78956084275518b307ce69aa4ca1079e3aa753d97fa1cff62e0b5f3b99d96a24e411fc3a3e375ea21b7b35a578a72df68d28286fd9a324c06930905f696424780083715f77961532bad061f3901ed276a9eb6e81ad4b4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb\nA = 188785951a3befcab56128cb6fb9576bee2412e6cdd7dd1bf5643babae83c8011af99aada405e119c3be33653862440005be994bf37d3802cb6c73cc312824c56841004c8e871ffb560e93a1d222c93d63684e90a91394b9c8ba8cac27b414bf818ee0de7217bc2faf099783800485ce2e93612ce39fc7e2f1db708bf9bb032d92b66159073fecdb2e0257058f\nB = -8dddf094f30284c213577ceb7f1b2efb1e4213a548e6aa840f801cd6382fb6d4995908b7827078dc3f46fccdb9e071bb8531ea8971de0ddbb714d678bb71ba9d961e58cdd5f41b8472146ff9b814a5d1d6368bd94812f8d38f235f39aeb2421a57499fe7102c1ab167df7d33b32a6dc7c8eb8f4babdd6b6c929d1ebd9bf4774aa40cefbf136feda7b6e10ba4dbef1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511\nA = -65ff4322f8e46e03aa6c1fd10a207a5e51db6991bdca232c0dbc9d73ba77fc485d881868be7b14c25b05bb59b7f5bb6c4b2a7d53f35d2d7af282a0423285c5de656429ab7d3af7d92837e41ca701f527845e98c2bfcb51647512e6abc6675cec2a7d34ce55ea4dcfe9e7a8397d45a7a3e73bdff06e303a8f04ab6285eeb1bb78b1455931cae203078eaae826a6e5\nB = 4d936b603eba3aeec3d3f1f9acff02a0ecc28a8ec64b6bfd9b153b1bbacf4f1e186d3deda8c1c81e759237921cec53251250e3e838f5063c4a1eb6cc93637f35aca10b965533d18b713617a312e74c446d63eccee93cc97e3723ab27357ae9b3cbfcb3e2bfc589a1bd582480e776198df047c3ad85f611ca6fa480c70aeb98af02f57d56dc9659b2a6bee222dc3e0566\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79\nA = -100f2984dc1451fd7b71e5d290e4b7de2d26175a47b9bed524fae02bd5abf96faba06e955107329559bff3805689633a4a57275732bc42183acdc792cbf7b6b24dbdc8921b73c0308d0c0ce5d8aad75f7eb16352e67116e859b323deccfe5d9ffdd1f0265297bc9eede073146a06acc3c330458b07b8fd0bb652c7325cafdcfa165f69cd0de8b145d49ddd576fdde15\nB = -21ac4953e54347a56800d75f6feb6ad660b0442174cf3c5dcbcf6528e2b5da95a614d3a8399da14507df4b8eacaddcddd627b10ec2dc5fb8c43d96a38e6dff37189ba275afb9484df800587f4953e327af71dbd58780bd5885b4cdab15ea0f2864f961bbfa9bba6b2d9448443af87c0cf178990254c1ae6e19003b1621f3240a6e5d0a3be2deb5dd253f5e1f88dbb60b522\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e\nA = 56f4d397530f5c90203df1ec799f82a0096888fd370d543e33b5a2c8042108bb75a86265204c40fa5a9a44965ad2fb41896b134ea56c79699a230f38c0e3fa4e5d346cda70e0253b9993c9da5642f4e645a0d96cb732f8f04c99a83d1f1360a385c6e1a972b89915489245ce58830788ce23b9e62d6b48a7ff9a486614d6979033f7914a0735d201c6f29e512374088db\nB = 10fe818f6af7a95cfefb0ea0726f9a3e0e7c30dc9785b1fdf6e2b810515448386c7efc656479794d389e109ef3efe37fa6124c5a7db3164268da0d98538606c57bd2f7df9482860e81f272a27c727d7d81a66fc1a9bc8c385cf02b7ca6bc7ec2d8d6ba1dc992caa216d02c9bf0fba8ee754af77567c6e275ac1b6b1b36b065760761300d156e40da8445712b8fb206c0df346a\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b\nA = 1017a4fdce8bf41ce804b7c9c836d85ff6ee899807e1736bf0357b015b701b9675297e5ebf588ac6c295feed3c6a367987e192be0d89523ac7d64b0b9576f311b5b2705c5398276a52f06085027480c2ca72884ad7be34967bcc6c8cb4ec4fb761e88c16866a2e284b40180eb14536810eeeb180ab701ec47ece62af65a0753f95ca657e7d04ebf3c3a7db02993da9089840\nB = -aeb03379fcd4e87cfd18957a72fce42e016951a72b673a9e81f666b3cb20d2bba81400ecc2b38601bc3270eac46a633a1a6b55c50f00e9d7fc8a20176b93e971cfaa4f41573b17b8ccc498f8a3230825afd0d7f102daee347a9d59cc0914ac8689c1d8b39ccef1f3def44054307a7cb7706535f0cf4007231ba21696424c3d5b42c8e85c278f7c2e8b7d1787effa601ad357eeff\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d\nA = -669660e75eae9930dcbdb99c477c980869417ec9c0e8c4053f0bd8ae62d496daf7539f37af96fd1cfcf3149bc02b8182a46b413e3397b49d4b4d204491440eea65505cf5d33a8e797af08f3da41f5a0804214846bd95d730260c6545d51126278181719ddd396c55f119e84da71f0683eb6db8393b098b3a0c5999862644e073b4918b5c8aff17efe860744d85bc94b582d45c\nB = 6045f903a750b69b709cfd6a1c8ec9fc0d7da9c53a9d26fdb0ce9a17c6a0ed5ba633d6fc01f004f4a48cf247d61f7df609008ca5bdc8eafe06dcfa06bb67efa6a584b5a2f02768718a908978edd475a2d2926af2a6e523549a5cbecedc78323c5c295bc0b8d3e140530",
+    "78492e82e339ea2c6301412a5dd7efc20da0aad0577a37d853eed820776e672bc6d23dc821b5855eabcceb18\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec\nA = -17c1dbc1ad1d2d33dfe1af7b4cdc7b69fefec5a92656957e111aac292e44719c7c752ace33dc74a6568be38b576a5ba174bcba77a034af5fe101699c99ca39f8a3b0a20679e6d0180868a232fd8fc775089e185e5eb81585403f32619a2f4d857bb091a824a89de2e84529e5b0702b45771a5816c5a823d81ddc89f8a70cc3d3a0c6bd6d85e9d72b69d2713b61c46161f7f4700bf\nB = -2252b54c602456c5deb86a0f249f3982c3836b70a946f636b22fe00c6e3b91b94e19200a33087fe734ce9a3f92a6099ad03a95ca523b7edb9e1ed3464d38fb96c470464e1c54790cd48769677efc5e1d22f5be4c15288bc5ea1dc184a05fddd5e576b3b4962f37437b4f9709dcec374377db44c8ba1d8611c0c3ec35f9bba213eac59a047e78195ebbbeff941c7f862e8c80eafb72b1e8\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc\nA = 6b31ef80767a7693e7d0a9ecce54beaf5848120f036923d80b7a0245aa6a46135e32314f3b227268e0bfa1f45b4dce83bea890526c7ac3efdc8e485189ce2c51597c2864c2d3664584be23559c03670622a53edc2c17b3f1a92640078ec35189dd7953e55e4da0290ff1e2996d164d69f1bbe6f5285ae89209d611a7d760e413e23285066eab8e126c320bb6130a91d67ef26d4dabd\nB = 183f06828033287497322b05ac08f62dcc5fa67b7a10c6c5a319c9a1e642754230c6d9809dcfd2de4bb9e360d6e6e1180f6ec6e0d4c6185e34ed299b6171e653521d0f7b8975ed5e7d2c51d27f9784a4b6f9b5e97379fcdb42e4df981462cd5bb9d0501f93f217d954f6baf70343ec710065eacbd2b778430ddc36a7ef0515f29d5fe78d8708d8ffb6c3391c6f632cb1bacb4ec52972ce0a5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158\nA = 1e1f2e44bc7c79a00afc3b2570d5cd27ad5ec9f45aa94f63f2ec3fa6b69077480212a1cbde25ded7ab1c6cb1ec26d5905948e5c1d6d109bd5047b1e038666054606b42e880b609f6f00a219dcfb504d481d6fe709f4362940f6c4b6f2e05d243722cb32bee5508ec94eeebb53b5befa551d3ab5dff9cba3daebdbc97179e56cb778aefdda6a0c24265728ff9e59ca3c2d615398d97e66d\nB = -e018708df037aa2918850fabcad82731487fb812213b1c067d0688462a4d518e5ec7c4c84f2cb2017aa6bc960e2faabbe361ad8f66355366cae869d366f06d7cc32ea08dc51631e7f36a4c775611095d8aed06a0086d0a471749246d7157947a1eb5d5503f207723a7062382b3e45bb84c6f555e48f6d63aaa1c04fe13c0108507c0ced669a5296bcc16debf18e03c32eefd177bbc1dd2f19cd\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745\nA = -75e06b47f60edd23148c3736c9c125a617beea7c8fd47e662c9d9be883ae925b7801a0030df3f4bdd3c9fc386f18c4e002e5daf4a6f7fa27b2f71252c83d5f1695e50d62a10b99e1900987b342290decf681a064f789e11bc3fd75d64e2e78ace56e7491fbe0eddd6f9958a5f95775c920ad6c051ebe7750fa76891ab00f42c910550a42bbc1c1e5aea0ae13b7e6f916a5d228bd57e854f7\nB = 434c8e4767d0d7df2125def75a978bb1509a26bf8305cd03df748c6c12b6dc580a2c1ca9a4526eaf3936fbc4ec797d0733217a54ffc9e1d7c6ca04fb39679859d5bd3fa64cd0a09cf1a056094b9c20ddf1f00e134533ba9892c2ca7346ac8d0655250eb45df9f0b7983bbf71102c6f1a2d9497e7a45eea7b3095cac037b7aa755beeea8a6191da268780179a652d94a732a2a5c7b626c0de3145f4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950\nA = -18dcd213e9938fe4b6a64abee3b9867f65e47e5b0365d45a8dee14ddf787f34072ce32f38d4d48ccad236005a23c5fcdc02b72cf27001495663fc56f428072d3f1bf5e33ab2c5f9dd9facf122f7225ea03c2f67321530a642803f65a2e9428f32d0d974e68a25f705e4f8140568f7e4b132942b49f9ff53f04f241feaa29aa353925fcade33a0cc192fee2628c2111da1e652cace9d304d0f1d\nB = -2e5397658a5e6db9d30f09e93e67a30dc84b1e17c25786e041fca48ab710e1d0497ce615264f1abcb23d5aae8412b58430bd801775acdce06cd362438898697940712062b611c92ae6ad10da31784207c5e7b9362b20d7254da0df8caafe0736002dd466d76b1a03e91a8dbe8a71107abd5f07b00fcdca2017391c7c3263881a3d02a89b0e16a2a765a32d24ae6584cf44a88975c539402db9a301dca\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a\nA = 6576c31d48daaf7d6bc3658952c4ba18095f1a0d73726f6fe59381af45a2a6b592adc79fbc3b597e1eea711ab295cd991441fb5fc4ce5f047e571a7d949c709e0d31156184be4b8a6a49691ef93d7d3b120193f6ee82246aeb896b8b7b4c74c27c02cb39fe0335883a3f088a71ab42b947a0cd59dd2155c65a0274ec0836bb8c2fe394500724ef84d869bee40291363389e7012d672b1eab6696b\nB = 1ba2888f30be283b588cddf00eb3ae3c641e35fc0bb3a9fc85d7fac1e81052129f499afd3e8458d4cf893d51fe4a2bcddf70f28c8edef16c7bbfb791daedf1a8248faebe36953560498af652d1f1c7aa0e9a5a667d9c94f7d9525cbd5a82147d58b738dfbba5aa162858c2c66d0dd7d8db38d41a2261e6efc7d0c8b2dd2d6962be0fc796705cec8e87a13092e4a3febdda3d4dbed9d11a1d5f92d7dafcd6\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82\nA = 111940235b144a42a13201a41a3f9e4ff02948f8e9127d9a3007906988a50b36d7622d1221155f2516812074a7888b1d8334a01c02ee33b3164d761d02b36729c299ce2455a462bf18471fca42e5b01615d53723c3fefa5aaf4a039a6caad35c348a0a4dd3f0204f084f35c0b93ab233c4066dc50c5fd3897a769a7c5bf309f7a9c30e905466c8394d509b79d62a69b58c73d8d3f1665ecd9a8a4dd5\nB = -e2633e43c38c0b4b8713c20bf4e2b8ccba680ecfc1139954fc42724277beadea438596942fea1094091671c2060dfccd0351b2fba8cbed35dc963cc18f8e8835052da884799d88ec1887712000a0726b17cbc4302421011d5be8d234440eecc363f09e2c04bc9cded3cbbac9a5bdf0b6d418822fdd90dead20e5bbbb3566ca94ab85f3a00d32842eee6521edd18b9aa6872340b2f47deb961f58bf231e01f9\nM = 8e2ba940fc5165c6c5f7f4cb5",
+    "6a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3\nA = -402034484e499a8efd610200790d443c5d3be35d19d8808da85954d42dca3f24177de48f55fa2efd7e4f7f624d806a8d461c3bbe0b626fa1f3cad2145746464108b367b13f3537ff395262256bfccce5f0414e1f98b59ed29940171d46ebc4bfa1a27802cc30d9221cfbceeb92abdfa6e84ab4a54965568aa10ea631e82067ae358a1a93a3a3fe3a5ed5636a0c4cb373b4d49f46f8fbbaa665a19200b7\nB = 78ec7dbfa2b28e268619ba6db34a23adab25e7f8690aa9464a7d8fb7c6b87d5dd9d33d4c023bb665f2d96febf2638fc087ed30796fe7517fd58e4120c0d319688e67a32bbeaf62a987a9764be75384bd499b0e00a850f27e303f615031299c631844d10abc571f9f2a0f742cc0e8df2fe3c244bd825bf1d9134b2f1059e2a1b61985ae8daf9bfbd9eb24ba268ca58553891945ff1a314a78fdebb5444677ac081\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861\nA = -1869c53f86755aa350115a9f49d6248cedd42a339506b8ff59cb878b7745956f142fc4387322c41f369773ed375b72665026771d4ed1b9ece08f84e4782d4c3b0177853cf9ac3a55f7e52f39c1b82aa42b30628a4fa6a838754ec6ff9809308f675e455bca6f44e298394888d85fee29d8a0c8e9cdb9aa08d68cd70e13a243b5804a3ec199f52ccd462ba6594d856602cf1d5efa509047633923d31f78da3\nB = -2023c544b6cdd8d971bbb345300f7a101f6dd44dede6bfb5f4e6b4eafb7a40728a3063f6d4bdd0f606ddecf062828cf889b2f632d0c9254c28f36dd974aef116b73cabeb2bba98635841c2b4d2aea833e35eb1db9fa9a9d33bf7b51c49a14907dbc6036b027a039192b47406bcc56bccf375fbdf40b82ac4b3c660a43d5a6eb656868d383cebd099d2a73506f675cf29649617fe06097a46de93c13d1e590ef2cc71\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c\nA = 5e7d4ef7d6ace6cb106e38d96085d3f3505983fd952498af3c1d9b2af61e4ba10e14961b339c6e64e11ac758d5fa18c3222138290866970d67d0a4f4e19f453503eb8dfb85b44d1050c86943e7c5d6faf7851bedf7d0cb6b13d2acee25372243591d37dd230907457fb440f83b62395f80f59a2d02b87134887406a78efd77614f3193e517f234434ab3be084f1484d3f2c1f68c67c0d6e863585a8a5ddd0be\nB = 114b6e6726433ea88a2ba965f0881beb3ff4d377526e4e099741f069abfaf29e129a1f5fd243c6599f725a389728f755f9cad767ca1d6ae5c8b3a32102e47af211e86d67574bddfa42b2cb466d968f38b47333b1b55211fd9a315acd5ef62cfd3e83c13ee9d3fa20a06b2292177961dddc7dc39abad9ea31ead1fedd3d699f651b656edceebb0bace11bebd0cfa581dad577b8b42f0a844bcd8c8227880876dd7b0aad1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce\nA = 1e6a59efe0b14fa017c32ffd0962700fa9752242b06ffd0b604b9bfd125114d4e0909534ede704cdf1c9e88a6567f4a2989df752510d087d7b7afb515ad594627ece54b8a8e539074386121c9a3e1c12eb2641ded8719e56d42ef50e2f3b5d7d59f8a6f897174cc00a7449d2b91f33e9df07902a95479731a44fc4ebe8048c449bd515ef6cffed70ae78c832cd43491203a247fcfe0a403862266777947fc2542a\nB = -8a9d3646831dcc852fecc8e2335549e8baa2e2d82fcb90846ee82bcc715c716d4a9f62be29d5e1531db73c2186a4d2f118266de33d966b78f989600d772ffc55b1364117d6750cef67f4bae851e7e3f8fbdae7b79de7eab54cc1fee56e25d0632b2929e352c882ce78fd64dd0a1473e80b6572f0d4eb67f6bd6e45c7617314219d6f7de5e505a9b395096cd36650d23e8d57d6abfa9faaf0ddbff90d32865bf5ddddcaf28\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68\nA = -73ecc8a6a1507fb5dad40677dc6ec75f0d130ea704d1e87b00d2bd56a6be21714bb30202739170b8dd3605f0553ff57439051efea2a97def70a6d2cc3fa2b9ec27a00c1338bbd588513f0f320272b8933fdf6635e585d1e79203efb5c95a454fcd7f33aa2aeac08902107e9bfb29587ce8610d50cdb7f2033c5b726742fa9f7f20b4780cf9244e6abf6b812171a64b870c3ca4c9e898d4c15e9f5b0194ae736c3783\nB = 4049ae926bb52e862606842bbcb4a5148bd1063b6a56f331cf10000c524b4aaa80b3bd914cd697ebc98d68bd3c2bd5c87fac4ec68606c264c56e25b19d118dc9f2eca19bebca07269714f2955e107b3fbf85530b1fe99c42d33031958280b8e8abea5a918a41cc7e6980149ad68fbf1c0041798d2046d7f88a395348b295858c61c2f33d8512b6fe75aa8fbad62e2f9b0b7876ef95af8a7b7338a2d6b25ec6355c276fc6ce23\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866\nA = -1e165ca7e1eabd2ad1264d5ed9c3d2b687f2db5b507a0e4d21d9e042cd46e93c2444c6aea8491b5caba2d8146bac656b7754b7b1ae0f6216029c7167fd3b1c3ba2e20469d386d8566ebbc05cb51bf1f1eb2cad9dc4fa454b07cc1bcdb9b8f5a43e354c4e0f4e62d52798f667080a0e0a15414391269fe8c92f06da74f6209a3b215adafa1eb6866f8b3e419468e2e5b4db0d0ada80514249320cecf034477977bcceb91\nB = -3f314681eaa4cb41a3feae8467f7d76b8b05939731fdfc943235aa4d67bdca30e64de541d17a8971e829bc0159384643672bdffbc93b3eaded7844d824604f46aa58b1f1b9d788106aff53438954af015a0387268266a6ba262e2fe7a4c51b5af6ff7f918674b7407ce8282f66e84fd2582edd809b465e4401c67e5faaa9e5748c06e3bb8ddb23fa649ccaf9657dbf79b937eb8959aae8d5bd9513c1e601c0e536cf60c4fc3802d\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069\nA = 5137226623f4ce4dc9b80a783777ef4e53ad3c2ec648264db472c517a96383ba1173e52c2659a97ce36341a11e832f4ad293b89696f91a051c35bb1db6182260d4a276d1a9b4be848c206899f87a361d318d38b4073a7470c5743b816cbbc3bc1b20dfd7971b11ad4e20d947e352d42760104a5a3cc590b985ee3b5e98c779e38d2581413a2208d31873f9644ec979602671c9da72fa6f66c603c1bb6d8e690dba8bf4933\nB = 13b45d4105e3f5e8e0ba36c812faeafccea2f1a30e2ce8ffad57ffe0dadeae3a23e813758f270423ecda3da083b42432eead7f04842db8865f9f1e2226a3d298ec1895ae69adc55d1d338c3fb787f0676664564eefe46ca95206e81678cf1a2f173c52d809b1e06641a9b467f191ea09fcdc5",
+    "97271eb43da1a9a856784972ce0eeedd49ad363dee882438f09863ba5af063925871c525c6c0ffdca428054e039e149a424c6d1b5b2b4\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901\nA = 16978c06a03276fa2e0bea45740a98d55fccc9d27321fd0a5b8522298a2a90d391c06c5c59e7eca85efeb9b4c91d4a1e9178adf816d597311f004ef98d209b59a2d4b901fa14c57b7297861ee58b89c9b2e931e4ce5818dd4006f3c40168bb4d3dbbd059c1f1cc24ecdc64d37df16b8e8d0529247c06f905ca88a5d283ca1b9e6856fbe8115a326061905b369791772a47900974339722d19b3aac16a0bedd93e1e4e4289bb8\nB = -de6dad276dcc0a9e271ad523620ec570fe6e3b350b934932ebbe36dd571edcde968b6590be14326e0f6394c0a2172052ff8dbc3ff15d94fb6e36a098286333768a84fd0404dfa354173d01f98484fb20897c439c48952b7f1791209fed94e9e72bfb3df5f368d420d587ae8bf036db6700f77b130459e9de2a541ed885c69c5641defa9436a4f7a69d2848d0e5d1074f77fa688b6dcc4d4c7de25a3b1b040546ef7f418112127cff173b\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b\nA = -5144d5ca834f7bbb35d3fb95818c1f89ebe08efdffd35993a7691c05aa1b67f6a28e219b27fdcb66e516097c9ef5f00e4257c561b1f94c52c577471cfcd7a55314d3b0fa308b59449a36adc884c48ef5f34753bea746bd6fab2f20b86814c9fe50e8abaab742916313a50e3c390c67fda8e3729ee3329dc5e4b7d3107083aa3a07daf7952ebbcfea15fae7338cd0b114e9ab2f81dc2e80f90abff7a7ac59e3aecf76fab87633ec\nB = 48b927a46dbc4e23d714b256084fdc7cb9d4c96a988a71c956e0bf98785ebc9bf22b9d5c6ba0c419e60afbef7b96cc0c4a13e397aa2d2dd7995875d2ccb127169423455d138131199a263151f28d232ff4ae24e316907ace1fedd02a02cb5ff9c831de33e6702010fee2232bbe3c1c193ce792eadcad0c81e7d7c17e49168377b68690bc61f22dfddb17d82a3b993804726037cfac8aabe8548befc52a3c6c6baaec89a392133cd9c45b1b5\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3\nA = -1343c391be3f2b72c4b79d8d6091389c9602e97774b18eabeaae81fc0539336cd8c899341cf75fa758421c7f32eba9df474c934642003408b32db66cfa92e6e414b42b1d49c7e655ffb4c80f5bbff8d2774ee4f7198839680175e1ffec0428939653c6697eb3681d0f92634cab1cabc63f423d5a71d65fc7150aaeea74f9e0153923a1c65dee4a165e6a01a88655fbecd2db7697f4d2b49fca2508e2b8f84129785d36d88bcf59f4e\nB = -225a0a4afdde6f6450f28736c3ef6e67d67ec6206a63b11763bc6e69b03f1494b275ac504868caa6d56d684a12dc1098ab0d030583e73a2f45a42b8607c0f19031b9c5f07fb71919868911806d210d43aaaced5894e844881e89bab85a203af9ec3adb105e50b4250343ca50c26df14c46d73a22c2e4804d26d44ff0bbcc13d0dc7e326c9e4eb441f493c9743ae0eea0de045e05d19ac32d2379196a165e63ba640ca42e4861caa24c29cbfabc\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf\nA = 5f1239e0b5dbfefaba906bfd9003336489ffdf634333cec2484c582dbc19b66782ba40942d047c3749597ec4d89ef61b7803d33a9842f0c903461be37c679ca213aea894d36c1e12bbcaa1c679599d2adda9bd23e712dd0d0bd3f91d146e7a04f3e7ddec8b0db7e12377ab32ba241ed1e01da070c1f3ec85efd8387a7b9421453969ecba8cbdeeeaae6ddb098084bcd250601af780960c32f0a1ad7d7e61fb19f40dff1060c5f332830\nB = 1113f145de014bb6dd6ca05de159b97e9736c45bd3bbd8477f739daf79615fe329ce948cab9787838d7daf797218af5ba7925685ea341b802690bc9588ba3e916145cd3ae9d0c4a149637b890cf50fdfa8f89a62e508eec68f9332787733aacdd57ec1f359ff7fde76138d5b33d32e64cf7d252f2bcff14be3adb1afd8da9dc930f5261e6d715ac75752b29f083bb1de7b0b89ddba633b8137f3fd299a7f77abf79781a10d897e7bf2c958a097227\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0\nA = 14f4e24627c773527ed2243c0d1947395aba5c9cf95ae62a48827ffc1477614ad9c7aaea4b4fdd97e3272d3e220601565aebf87928c301656e9edb08d6e680de845615bb3a81c61ed043adb9d708ec1447f057087211673fa6ad8977166a2b4a8079a4f29d48e7fdd6875ccad05d2c219922b814589996cd9642ea2b798197407acd274da30d3ca008fefb40a25b38cb6042a581393283d6448cc69df9a5dc2b0777052566a8608a1010d7\nB = -b4188ebc5bf3ba31cf7c5e100e79806e92ff6f863c3d68a66aeb3ae8385f596dabe6f627f3812d0f2baea319d93ae00de41ab65e42eae7d396cc8fd0a2dfd35f303117fde4db5e8438df0c2b3b680dca538b42a7c844a9bf0d3697fc89ad0a73594627578dabdc214e0f4aa06b40987aed473e7f42d318bebf7392d9c898b4b8d73a94726aef65807b2ff746d4a9aa76303ed7b4fefbab34f5c87c2df82d20457f68289f7b96dbeab581294974e322c\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d\nA = -70e99398673324ee83495aa0aadfffd7bb9c94ee5251fff365124fabc50175d794fa84509f034c2b86d83607789338b0eebdbbf709a129a0ed0afd21c130d94b279c56f1c7c1eacfc6cd13f724a9352b2b37412242a47b23ec61ef0040a8855371aaf238003c45ab9d18a66cc7dab9653b93c323815e5404762d3f964d4654a6995af507bb2db2149eea59acd72af4d034217eaec0be5ba1d23890081a6a234e125572e3bcf68a6ea52d9437\nB = 661d8832671a4974b493e5d71e547cd46b36730f4017e50c5d1a7520fbb75f0314cbc2ac948744dd494d566ba580a2108106b120a797cfeb1fbfdefdab6bd6b2e073f90c77e814cafd0b7f79afeecd59778b1dfee3446fb32139b2311011576674f96f151f896b477c631237995e11e61e715dd8dd38e802af93124c66eee735c472972000cb4788b26752a630ba63b45e8ebbd979f0a4da5b359abd2905f0b7f3a21b1d381cd02ac08e284218ce41c907\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493\nA = -1896f67485a740720e23e1642ef02742ce5f10a92e51af19e112cc99c0fbddb60d7190086c942d293d076b474d056e74ec9f0c42055d745a57ba370c51ab2b761d889b766cec909811e2b2fd11d6916b753ae00622f038a4bc55b813a5d06e6ac136e8168940",
+    "7de721ee852cd21ea989ea7c8cbd00b64614caf0974a62097b2eb865f46fdb0c1a2e4f2d839066b797e51392e5ebd14dd92630c070acb546dc7438631fef01594878643a4cf77f6\nB = -3a8e2f3b8378a2605f5affa21c4fadcc655f2f8357a3427d2cec0118e55fc2bbc25931259e294d91bde8dcbacd39e6cbc125683da7d0dcbbc67d7c5866f08e7c4732cd4384d9366868370ea40a75beb23b81306303da4a3e26ad357c5c743d0a4ae775a472afddf8f21cb4a1a3350bb6aa71037607c334a0c79468668d3e727cf1d0610e49f27780901c68aecf1d145953e45f5b090855be714cb39aba2efb0f7db2786b331dd9bb8843de8c73c95ab13b6b1\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280\nA = 75e31ab221c08b3bd73bed03f878bf7742f9b36a89bbfa7e90f9b05ec11edeb0140dcff6e9ad1d62cd7af34bb4284b3a52bf1b48a40f744b561d9ece056a9405ab15f508700b14914e4f427ea1df3093497410a0108066e9b259c1a26ea72082b3cf0e3a99ad054804da7bfa0200d93d65354b75e605b47a4e1e17ef851a37c59a95e1b5172801e6ecabf70f1e6e382740998fcfd8a297aaaba7d04b668e3d6eed40358247767323a8393ec359628\nB = 107aca18938a9cb244ad646a37a212859b3dda7518a5827aa2146b47bfb3bd08d772eb7a866e1f674aab7a1c74cfdc2bc6e9ad1a365686213655b2c7b1977855bcd42ccecb804bc01d92bd7d2667069d853f18a0f0661f028955e39f71ee82b9ce6a81dfb2951b33b123e71264e819bba4d0a8c53a1d99964ad9ffb58b7cb5cfcd3e30b1baf5aa5b3cbd20a0df7ec37563e2b32b4cba91bbf3bb6fd1cbfb2fe0f84d720efdf36e9645c7e9ec70442ea5174528bb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8\nA = 133a439cf006c753c132a8559ea13c64f598c5f8bd5043b89d04d7ecbf0ec58b225551c8df8dcb341198fb0b487774867e5b68f9058f58b3cc98168fbed0d0ffa86bf74b4fb0d4235976fa86d52b8dc7e82df176d70892954223cc484ae58b6a60459a9a0803ab856ff9699789172b163615e322e193bd758016f634c83cf50403e416ae241d9b1e44add17c2a663771ac88cf8b9dd94622d80d879ae41f0f4e7a1a32a1ab164f981900fc159aa85d82\nB = -fef33e21c07dc26a47d692c3094205bf4efae6af32f1c0f46ee579c1a22746a3663d66f2919f46f973fe558c61264157d531e66bb9ea10b4b49d9f6ad3ad8762a6ea8169a9cfe01d3dd65518c2e6e58e8c88d1b2f42d207399d7326752560cd45d0ff571309301683770793fe3765c1337d14021d39ea6980934c5fefadb93047ef07c807d0ea5625ae0cefd098988d6eb7af993c062ba313e23176e7abdebcc6e566304a5f9e03da05bc1cc58dfbbc898a67a5941\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297\nA = -534042b0811c9afca04d20d83898e7653f91a73de1e4b516f3228c6d6d9b963c7f8f4c36e05383da90f4edd072a7eda382c47b84b46b4dfa16f269c2d9ad0fc53ed2ce51cd31e4e32d0c1ee21604d3c7eed2deb35cf8df6fe1c0740a1515e4c702a2074ad6c0fcd403603b4a4e2195d19b265958ae854ccb0b41cf22480389a053f71544cf594f6833f3e4d91fd3d9091df0978d04d3922ed72a4fa3579c5fff50eee812dfb2a334148227a0f5739f8ac6\nB = 6935a3444434b0b03d27545721e253e4281884da027246e46ddefb01fa7cf7a9a030581dfe618431a68ef6d79b03b34f3ed598e7c8ac030e2b4cc887dd31664604fb8afe4e71fbc3135d6d3b4e596044d6b615de7184ebf8dae8fd58506286ae4d3b797aea911eb59ada39dac756d0e9eb6a6c767ab77b9348929a00f8e311f639d19ed88c86eb91f0d4cfddd34e98130eb520fcd2b77507c24b6804d3d65d1b21e6f6d55d1f6e92bba0544829687a096be79eaad7d88\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d\nA = -1d476cc98529efe5b926aba3160b261723b009e9b880bdea04e9b5b03f173040ffafd1627b38be8e00840e85d7acd3abbae2f7a60b305256b920c2b25a8a4373ebbf1a0c69f6e74792cb0d849872500519b6d1c190da30c572e26b44590b7ffdb464a900fc38db013feecf909b43bea549e05f1b7e70d6ad879c613293cf61f0cecdba1a6565eff1bfcdf740bf553ffd5bb7d74f7e9537897184c527b990dea20387bab0dec3e32727786bb14975b23ff09f8\nB = -2b6e12c87ad91a2fa878b9245875209cbfef400e637b557c868ccbd6e94dae65f1ef8caab61f292d739b139e384137a747210c09ee6f3b2ceb6dd212e14525852b8c54215191e116b7097f6729f6426a8bebdff86cdc16effa08d932ab512d7265cc0f57303aa5e6fd2afe0a45180557935c230558d02c3030b38ca88de5fc75c1240d25a22fe32c4e5096aad0078d50989812d7dd0cbb02c736fa563efd32d14109c44297cdb3d4fa3b93a2e15bbb6eb678e93e943979c2\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 2c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2\nA = 5b0a181f07068af6e1e4b715d92c1b8391949a1e3cf0fe0aa49f3333c826f5582615d39ec28b1367804c1ef54f15fb83b3c578ef3ae957fc89ef22a343175df3ef2fd425f724ec1c3363aa000ef624d64c6d678a4cbd90b41cf7d69a7e03dd60c5d3470dbb75228b34d35469847772ff3d74b1a89a2c492c082d3ddb45ba4df6e3f228de6c64913b79679cbbbc36a2924e722c2c640d0c5a0e90ae86b5364dfbfae80df3d75823aa58ac6c1da78e988a11831bf\nB = 19567bbcf615b777b35fa7030db7da18126cd695ca7dda67f5146c97beeb20df24ba0fda4a4f03523a0d9b9f85d9acbdb5793ecf9c1f4ceac81299a1aa34417779175a4bddc0e95ac68309da51e4f115dad6fec33a75d0c5520692a38df64e8d684c9304f9e2e6ac6a66d2e16a03c19a30efcac712aed2b9ee774ea28af4f37c45609464289de3f9be379c733d711875216bc223f2f468a0c9b4a8277bfe49c590ebce2e027102537bddbf2856c3b6e9389c4d1f5390cb0f346\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17\nA = 1dba8bd9d1e6cdc117a5a01b5046353084946fdddf2696f831a942d9db4637a5ee76b84d4ba63156b8cbc72e40559a2fe9b8e2682d8ba1db0cea042bb86f8ed71f6609df52526c42e7494f6114bb62263d36784dd55d396018b8fa47fa49ca6e5c76ebb0b00e6c764e36cb3ec75e3af6a2c14dee01fab78070239638521743d04f184dae79d49a2bf209ddeb4cc72e0c94a93a47c107f5369070ad95ffce034c554fe2a8391e67f817c6cab5b88ae9748072da5c9c\nB = -849602ea3b79b33af2bd3ef9d1250c507d332e759d428902dbee054fdbcdcdc0a357a51d00aaafdacd696a15a64cbbdb7e1fdb347be5ddb1f609a4390a6f29f79ccdb51bd1f0547d0d9a2780517f8753a906428fd236f8ee1b433e57f2810d0ad51846304a5729f53a871d8b0e14355d24d3f092e50de4f044e2b8aa14cd8a51fbb2ff36b0b37defa7be768c56fbd4f5169d9d4698fb9072cbb0a037c219552728587d7c35f27456c02020f5f9374b6c53bcf8eeaa14be51899d3\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65",
+    "a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8\nA = -6a0753edddef8b74f762bf802d7fe9b38638923ee2d81bfdda354d40df4422e6ac43724de1715c4088da2e68b63c10c90b236d7dcab39b9a0ecbce57628f4c2950c79cc88a89daa20d7a8679232c8ce5fa30525c56011570107697222e0eaee6871adced52ba01a3aea0ccc9901cb3a09eb4db2f93aba0083180bb41f3f9eaae00fb458381213dad01997e9b88f21b0a79ada1ec3837ac2b63611455fab6839363b796b105c3be6106ff284544bda2a32352bbce6ef8\nB = 542c5fde65111ec8a38d76d8c5735cee17329dc41cfd0f13bf47e6d0e0093a129f3449db380ee9a70ec1e44640839ff18b950c8fd89346cb4701ef753e6ef49dfd9bd27d9987e572bf8e68df399cf945813582fa1d33e07be938a7729efd9a5e7d730bf61c537770a0727f6bb9ea6add5aac9267bf910eac1b7d92ab4184734ef8b1d184c292b2b4295ec1bfd17b8a2a2e4d315a8b37b8ff9bf6a1e94a4772267195c5a7ea6f0a0c267337fb97a023f1b50ad697ea31451192cebcbb\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b\nA = -1cd74c052e62ee8156ba5d97f28aada75211979b1c5925ed015ea75f693a04c4dd0a705f6a723ae7b79958884c96fc07f81fca064ce2affc70768923bfbca6049952eea3ae048425b7c6ad1611ed4b8b77f7605629b9d198a77a27f25eff2f82867845cc868edee4ae31afc5d022b2ffbf43c14fa01bef8d7cd9d0e58362a0ff9abbf250e43ea5065512cd707791ea4868e95d8fd2357b3b3aec1a06888ae940751ceab01cf9e49015d42371fac30d48ef5853b6894ca83\nB = -2ac904d3632e25a4d536097d80a157791a6aca6eb10246ea21f4cae07aafe907c6e4c726694e14ce12e376c02d326f4bfc02ed539a5b4615a3cf5c838ffa52124f9b843598a3821cf9f1fe94e7206d6a525fad1ef77e7e77162e8c6d3d860d4f568e8f81153dc47f167860cd52c1ca59b15f1eaac6b9023c8b375bb63b6adf6972af8ca62b39f044378b11c4a969f3939d9fed5cbe18c06749956c7acbf963f640a1e1ceab73fc4c77463ee8d1575d018f49bf0f08161ce4f88aaab5a70\nM = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb\n\nModMul = cbbeda9c467ca801ec66fce801c6765a20148787dc6becb199a15c58fae8d20c1d391a1d9d57e1c74bb412e1b8f271dc2cc53c3355c83f3e2f00f15eaf0df735160a48e2273fd1bd75533cf94c5175ce67e79fa6c1422996fae36ba288a658a7a5422a59d39dd81ddea50979e933efc02\nA = 7ea551efeccda23622a1a5029e5525f46d5ccb83c28ec9adb7a3e97c2b7d936238c483a4a9bc92fe0e21208d5703611e2795b91fd5019272d255eeb\nB = 19bd92c534f56dc4235dfb7efff6d941112d66acf81b079382c86fb10dc5473bb8adebfa53ea3fe6e4df8412e7807aed029694ca786\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a9cd6a0a89578ea773fbfbf642e05935a995a38bbd54480ea3ecea1751370ef95ff5ad0e3203613f0ef6833237d549676a95b720848c5e9897cda82642a2f373951d5746b559bae2d98ac00fae26e5957c61ac1de95318b1b1aa6d5c64a6ceb6575f1b807060f9e2a241e378e6ebd72ade7d2df18d5353db7737caf52f888\nA = 13c68e450e9e091ae45863f6c1faed25906dcd90a43620b1a40e7a506e7a954256bab0225f3678e7ce6c4ba6e3a83c8f04a3491d9bf097adbd98fa6e78\nB = -ddef76382342178fa6636e62887fce6e19590065c766b047073329ea15fbba96f2cf088fa5a989f6ee3f6a513fbf66f621c6ea6ef2fe8\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a9cd6a0a89578ea772021f58ce74cbdd8c44a09b3937b198adbd8e95e8e35541eca26438351bfdcd8600b4f9b71616e1f16cee707c712d40da9a440681f8c8647bc90ba4c68b08ce4cbca458bebd5110222f06b2ca980a2e9419e71064324e8c36289eff9c67f6d5d011e6db8538a54aeff8c20800b0949fa42c38fbabfa1\nA = -6d7e88715e9854b435876fc9bb2d25218a1451efb73ad9cc5f52b2bee929530e6618a858000b3f24fa5f47b5f461c84eca971e38cda6e1f475f6612ec32f\nB = 49eb76e4614ac7b0ed3f534811a4ea6da5ea24be925ffeaa38bb228fa117ed56ae976b590d6c9d9a7a8546d8a6ebe4bba771d6587ac44f09\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 44f8596fc06afdb72a6e4f876b70b8d5d734589f41089c510b0da60ade642fd79cf8e705f09910912624fa1f646da596c137f124ec1a327beccba62a44f228f3c0977fda2af631e249b2a4de17d170df07bd812c233a96d17e1e93910267682d24c5c485f99aeeddceb658a7db258a2fdf73eb0266d26b92e\nA = -122231b14c249820f0dae625342415f0c6e7f93787b4206b79e9ecaeb09623636730810c7936e17a1eece68edc7c97218efb17c069bc59bdb9681a79c910c4a\nB = -3cdaed858523fd55553ef85d018c1097d7b88f6c30060d1e77b84821ca20b5625723c7d4331ccad1a70371eacc7f7aa11220f83f1bf3595650b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6de7efcfbc1e8d2cb14cbe4465c4ef71f0d1d7e80a1d80d9ac2d0b161d45fc9d915c54e33131591e8daeaa11ce02404c9b8494added1bd83e344ad4de7c04f626315caa56fcc5ca2ddd4e1ff064a2957afeb5d280477bf1f1195c7294d89049024fe821dceb53c7d270a8b4653e2fc0a4d8a3863a854bc3794753a\nA = 47423c4fec1eb6779fd23e3d4070d0a7bf9a946f5610eb469876797a39c58577242daef8c34926f6974089fc595508d9c573d0a275cbeaf37172f10b8c849a493\nB = 18ad789cf09e9ea182eaf43b28b4f2540e533f0fccad325430b73101c00e440bb64b70ce0f2680184aa8caea2f6f6517e9b80285fea8b61887a41e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b18a906994d3247bf8a00f20e4b349a500159d086aa863772e71a68f91af9d19e4c021843f8bb6eeed1df708d55047dc8faf219e00d559517632dbd1cbf4bda61651b9644481d052903be1970f04bb4ee8faab9adbbf858324e6cf5aa9384ceba655a1a107210a9497552ba8a56d5e0e70b0c757baa71d1613683707357827f0\nA = 122773509ee608cd9ab3ff6763629a18eae41be64bcfb05122e0b3e112db48c64d2a5a515d96a042850c1c848ae5fd5f0ccc57b273d25bd8d68568cb00bb17b1589c\nB = -af398208c01ec9700e332f3e694894c7cc412a73bde8a79e08764ded92f0d58db8056883972c79a0c9e0ce810786cdaa3629baeb9e5c370a5a59d3ba\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 64ef5e7063a1d95226569a27218e35e93d870a19a43fba9889a2ca98ca5c573fa56ebd77f1403b3bcad17c1351803a809c245a97bbe32b45e21768f28c5b11ad542f5e687a17f7811df6c8735e1778e94d9313c19fa32a6703af7ccbd88b489c96632d10eebb580cde3b905f6345a2a2b86a871b4fab36fa4b0dab9a6c1c5096\nA = -7dbdc37a51b601417efdda2516aba15827a40ffc304c523a47c544d5c0bba6c1367a20d8a6268a5c3f723b1b68de57eceabbb00d44185ec4ba7ecdce5d80456f8cfe7e\nB = 641cf85fcb5fbacd6214be4b7b06fda1b80f4683c21c1d08311f6e23a15434b42d30a51912898a1c46b46c00aef7ab7663ecba683897825a4b07d2b7dd7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 370f20360ac844bf4275f78b7fe71ba5db6f0bbabfbac3384c04b256eddaf04725d2d5",
+    "7b31afa48f047aade156c34441b4a41c0b2146790a2e15d13b584021ad55965588c6e55ed3b5cf5c36b780a27c5dfb72678d57528ab17ca2ac696aed3d9abb0ca448d9d5789fe37e632fa9709f3bb924c4ce34244d239a940dcddd9c77\nA = -1a0cc5b07271098a23f01b3c0d47cab8b294794b74a8b162ff3b313fcf85ea81fc99433cdf4450970311e1d5ff81e9ba27eb867073ed250aaa7795e44ba8d4000e879bf31\nB = -308f93984acb78c5dac2426d9bccc2e3ac361143807c7d34c24ef8f8db5e68a904ac8bfed1edf3cc90d21c87ae4d224b8c46fa42eea77797f94aa848160fef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4c8f466d1d9829aaca1a22fb6ca5bdba885606b9264933ac2b4c18e3afc0c406aa71ee7ff490fcaa804f457096e44576ff8096fb1d2b3c68450a8bc36d1a2797ab8b621ddc91d75e7d6ba01d86e959171fa428a5bb1f26766f94a553c94f6dcc2e0af90d7776ed3d9fb67e842e88f7d7342afd86e2f5d159db7304ae4d204a3f\nA = 57e894e37159cf3c161be9c97a946454e43bf09a7ae8e1437570a86c6b06f84005c1463d27d726afd2e25aebb1657eb78957a9a12c8749049d12007a81d766dbe008aad6d83\nB = 16dba5cf077403ff4af47438f5840f65fa4e058c5cab3cb730154ae0fcc982ea097c6d0e75bbd635e97314f33ec7e31f0e41cf285ecfafaf36382b33d5e83cd55\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 29d13ec304f26247a45ab6869720720fe019d6cf370b9e2df9a65828214aeb4f8b17969b8dd54339d08eb99bbc66720ed78ef79033fdce6da33501fa8588af86ec18be4c4ecfe01781f9d1379865100dbbc020b892e77027d1f04f8171ca51fb73129dd9a96568904eb44e19f56f842b223724a9ffe28826803185e4208f0ff0\nA = 135ebb133a0beb909101da896e3aad7e26ea72b23e60802e54cc6c58a07b1205e2ba1fef6eb86c420f011b70e3f725aaf9fd1873b6e1c1cc7005c7c09e55550414875cfe846357\nB = -e8cbf3feb7be7fd12b01d5bd024e47538f434b496613320ad71f48a8972f687992f97e4b69b5842d2d6a4176a5701327c40325e98b27e4c0f8fee5a457d92181e40\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4309b728306535bafa6787dd79e58324b3f86eb5409d772018cce2159f75832b87909a672b8b4b14342b352e76ec5a6dd66737cb0a20b81c5ce222133bfddfea878b132b6f9fd557133973a0b44aa41a01d54ab565d6b9c62da67378a4058255047a95923daf5f0f7adff2a3f06074ab1facd986d7d26cb475ee818199a390b6\nA = -7a63e108bc9790ab687e0fb8a1cbe1e9ff876e7b5eccfbc136ba05fed93412dbc2ffb1ec49518e9fb867429cea1d7f82e2b159b75bd40eb8370e8a54bf0e0ac0ff24aa3662774bae\nB = 51ee025b2ee8abf9dc5ebf1a4600131c00ae4b6bff966dae5c49ab5b9017e6b1abd6434736df6daabb2bde254022783764c94e66743dc752c9040563df7016a1581fe7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = b9ddcb9ab858d2229cbfab87d87236e8206cf5e1a042eb5ddde201d56e2695a3d0b2a42bda6a284fbd2a5b2c2b80446ce88c024137780c277ec80bfa6e9d15397cc5bac98e58c9130756ed0fde58d475a033fd94b1fe0ecc6fd91a8b42177abf3f77e87c0847a4244b9fd4980f3b42c7c955836bc994f2babfdf9c5b43315ca\nA = -1f971ee9a7c966d1e82166503681afc280fab255665b850645321f67da8934baba1226e9efb59e0ac4483c8724f63556a213f2224b993e4e082eefff0056f7aa8a3cf5b655e0f72ddd6\nB = -39309313b04bda1103ca6f56514026538b4a29ae258a2a66424abe2c652b959f5c1dc4755ea37ebbfe404839505c2807ebe069c9abb9150205fe35bc286ca12b64ac46133\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 47555924c31f040619681d4a12064790e981db2c7853efa17e4d20f741f33c56d80862caf86bfe0730870b6c0afa9caf66e15047e60256fec29469d1760d5e9b77d79a84fcf7a1dcd0168a59f870f1635eb033e0ae0ac17bdb73da803206d48cfc1da48507cb812bea540daa2393321ccb0d88b57abdbf3a3bb765692a2c2ebe\nA = 754d78d5608fe8c7ed8e26a174fa27833a24c48d23f0e702454b7eb578cb107da537dda11027dd6b41daad329e036794de562d7623bed8d9b0e909cb3fa38d4d21a95c5f4246e0b030a32\nB = 1839baa8b8fb6575832136f1d4632f72f36cdbbdcbd00f197fff3cdb88b851cbd74910ef6d43cfae9d3248e9c85662d7fb596ae45a460feaf308823f06345bc5fae8823230af\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9b2f026b11d0674e9ec060fdb24b45fceade3070db4405b363d53df1219a02a664882819fe602f430636fc0bda935b14c55c8a0bbcc9b6683417e3ffe7f5d58fae229122ac6e42e76899254295dc5a08ed43c79120a5e5e4124b8fa6048ee90836bd2de51bbd2c6b9b53212e913cde871f11bf32f91b3a78575a006da36627f0\nA = 11402b3b1a45d67cde9730062e38aafe1d04fb1f8bb1975f25cd9098813efa2727cb229adf9490267bd437220d9ffa05bb993e45d2f889f140faed3ac3c7b53216455a830d6edceb02e8db92\nB = -d8e011f18bde068badedce8106f6602429fbcac4766334a0101b57fe94603203a4a8975fa499d8a68198aefd9e68f28e68914f920eea1083e37c67d59476bca9819a8bd628b89c\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3a74066e7eebd9b63a1dd28548be60573c95f29816f3b3ceef68a5f6bb797d7eb0b0f4ee612dca794ff82f5d7461d995b9dcc09649e2587639ea017865328bb5deef17b5283691724e8aa331d75c635d5e19ebfd268fe5471714aaca8b48aeb846f241c1675e18d35f029b132f81128f19028b0a471b3f75a530321135e35fbc\nA = -6c5dca3fb7b85573d1c8899868940794e428171e207b5f9f89fce4b7159236c0755e2959d870754e902e9c40dc1fddeeff6364f898ec0dd669283e6d26a612d9af3c3ab04468707bb8a7827756\nB = 5446269bbeb613e69286f1012ff62ea767965533624542f3b5c866cfb569d6193aa603061701992cb4873ea8b766606da1b57d7b37cf52f52bf85b58309387200b0ed36164f30d52e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2a4e727ac67451ca9dcba648050a085196460e4aa4836c5652de863c3e2a76213e0f590de3aee8639304c54a9dcd5f7d5d3592f647e3d07d322708e1e26329f4a31d66c7f2e9d482f22cd9823074dd57d14040a4f00ac2af9677a2c98d58ee1e094b1a8c40092e77eae454638bc3655e77441d4f218c637f95c147776f5bdac1\nA = -19fa688008a12cae228c6ac4982ecbc88da248d7ec785bf2289dc9103bfa3a91eb1e5fd6afe9e0cc035d3312e9ba64028fa6a229db6d0eaf8af43d8c410be7c689c3e557137ebd60d3fa04edb60cf\nB = -3e8c87fba4a41c3a84874c987acee9f560b9f027338b584a775c1fcabb766700f758c4d451077a9427257334a569037b0bd006375f71223add62eca19b1e26b86dde0cc251e48d3b60ef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 52e4a3f6892b425b935c6f9d1396d2034eb0331cbc5241e1d745a9619fa0cf0fc521585cb9d6b1034c5fbbbbecdc81c757f768c7a82f6ca291cf5afc98500c579f82ccf0be233066730f738c205c3c188f94b878c11268871ba42a5d950dc8a399887997cef2b6b68badec1ca641b88d1455e6d97a2841da49df7eeb766b7be6\nA = 67df01e34a26e8239c8edc7ddfccc3850f39864ed237d4dd67588efbeaaed1f884105508f69e20ff6a5cfae1516f6179ae6fb515a66ef0a7d633ba4218c30875287ecd0cfeb5bafafc492619942f97a\nB = 19f5076405b3c81519c0863d0c963d545b2834343e42bb3c779788cbb46d89be3f775b62f4114268a0ca0e6af6c0dd659607d40071dfe7f1ad0df9a5c53b741c04612158de396e9c96f7523\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8ac1d96abd",
+    "2cbcaa8f7e3267b716f675aebd23694d24c112d202653979636d4d47e27cc36f850355cfc5ca16b78cd1848944f8759fbf6b03fbb7eb347536a9328a5cbb778a6bcd983081374a3f543b1380add14a9468358009ec2baa7ecdf13e7260968eea74083459406e8889936b2fb98c8b9a3597e5f9ca10b76e1dd0337f\nA = 1c9ab23ea37f324544280d176cc02762db7a39935f1ede9695b53a3ee2db49d0485c6a3742a3b5cfb51f3c21711bf89ed05afd0886bbf61cbd57b23439a8a165484ee8e4c0e1c0ca2b6478776aa2897d87\nB = -e30d28dd01655b7a419d939e3e7530258a667420fc759bad585802c63fe5efbb309cb502babdad0afb208aff5ce5830071c5a974604c69ee47f76fd87e2460a5b03a57ef0185881502625886f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5df0700adbd880a5730d8c0637a362a9d42c64503c3b9784046b946c2459a619b5bf804a41c92ed6370bba730c7d39fb2e01558f7ec38511b0449d6e9db8df2cece4ed348782ff1582396ca8b3196474e7e5817f8c197c44d771923b6e286e41e7e23c33fcd8765e06793169999544a310f2e080ffe13640b85f21a18fa11928\nA = -5c01fc52e86f3a344180bac284d2376d1bd693f20a46479c77fa57077df62f83b1e81c94e577d1d6733d276f9cf70555b20e3afcb97534e4e0108a6cce87e9292d78b2d7367ff15fb33d2c3289d2a2913b58\nB = 6bbc39283be06382ea91ad6b1630b38f32385ec90019d2ded7ca6fdaa39defbe22585be0df9c0cf613f6f146c71f901adf525336f6573f7f43e661c44b7097f110d4551e8c75449da8fd39201ca0\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2a01005f1f387c4d8d24a365708e2506b044f86dfc011262d3577f7313a8f51ab943037361bed1858e021f8a46491a5c73284c666eb65cea1392a780219f13d7188721d7d4b975272293a5eef63480f30cc9618aa74bc51f4175246301a46fdbd34a6ec72d5974aa920be5f321a97b8f19c0ec56ba10eaf2e61f2b45f134b304\nA = -108bbd8824e8c16b81dfdd4dfee691e012e578cb9cc80cf050c0ec4cebf71a968732da36552979ffaccce6667e46c29144dab75132cb087681d5549dc5508f3719e129553fdc97f545d7ddb7d3a4fc575ea67c5\nB = -2ad4d4078c47a3c8f5f9b48e10d52d72349ecf0f54abc60bad63bbbf4d8efb185de90e5e1a686859e1c429e30977fca492aedbf084019e9ceb4490aa471776ed2e8a09151b37c5caed9ede66922b7ec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a1b1b2d33cb610f1b398e03f274ef39a583d13af14b79e6766859b9ca748237b481a3cfd5d490a073e82e3c53d3ff5cb6219b2b2f71927f27ab6f567547a22dd35fb5919e1ed2b6dfae4d536d6d44fa6216d94d26b33f52db06c4ecb29702588b73ebce87569639f786df4fcf569bb07d5379bf8b83743327248c2d71b5dec6a\nA = 5bc53b3895cff2bf7bf10e24fbdc43d17d277a982d5d92f17b9b5a2b9ed8b6104229292ef3997591e2e6a116fca21ad5d061ce438f33b7f7110293770f8313077152c7546cd522ef4054147edbe1878072b1043e6\nB = 1599b541c9809779df3ef40971e7a83f21564bd5d6596d51a3d96defa4dff41e83ca6247969a3dd9a746ab72ce21137f2d7ea015ac6b2ffa8a32997e8b821064d35afde3435b23e47cccafa74d5192535b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4fe8897417446c493725521c0ea5b2110f91a1b5ba236cbb6ff3f52b0036a49fc82274ca949ac2b592fa4bcc792114bf2f2a78a2cb44cb22c6fe7e4bee7981604de47f6da2ed1fc6a8eb32cd9b8aaca0f2feec76a2438126ae6f409645d897769a6d340308f82dbc6a98ac059fca6f903c5aecd668fa838b67300c654d4013e3\nA = 1717c6503d069103f10bb4b36427fbdd2371b30793e492e4161fe185b2e27469fef6a25566d6b46f6a7f97446315a22d1f1f662f912b17e71feb2c82411ed7eebb84d4f594deffee14934b75a845d83761f36141ecb7\nB = -8808f540521c20eefaa037fc5da782c891fdfc668b955eaa2e4edb592e027a964b4cfbc94c548d785d92992abe282d90dd137c4d76419926740ce138d567da7350d89f2e56772d8f5bcc9ca8d7076540fab3\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8b9311808bef497d8a5d14f7d851567a196a051610246964917a1f9d4f4449357d2411ba9fd93983f6edd76b8a8e1501146b08b6e1fcdd97b6a41cf637b6ff0cff7a2d6351aa1ded93f8fc1cedc81879eef751bebfbd1559d5d0320595c79e3eb1db0951d7c67c663bc57a672faed9e14c7da6be6b0c6bcab3d4d515e51a0b5d\nA = -511312fce1849c3d177d42088e55d534f9f7096282916e16b041f66ea90e2cccddab5cec0ba8ebf0b047ccce72da349f420cc28ab19bc156c1cccdcf5216f19ea922698127f090e97444751dd58fe7a2c90197a9ab3d35\nB = 6a5cab5e322d5f651f798aebf43a62af772fa2cc379905e72d253c49be8193a07ae6164f21cf08baff906ef800e361e1cdf1604f454483e10c8b2bfdcce77c12b0320dea63f9ac0afbb86115b656d0198aa883f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 665e16ba6cba87c646637a233ae04805a302ef4a10d79c5b65b146cbab8c9ccd491faa32937d0ee955dff7dd0ea3f79fa43c133021c8680490b91d9c1d8a8102ab709ada7508bd59042940b2bd3a4f8c195f781313e45fa8d3abda1f8e13b35811b638b2ab101d1caaa92188d2b75b2b10d596ab159583135b0d4d15fcd3d882\nA = -1375af024e9974cf8170801f4a709b4e5862ab7d18464077727bfc2581e557cada991e9484a1acf80182458158c44871e67e783f7573f214ee4ea1f1821a65068f2bbbed7575f03a4bba36b0fa8cb6dc58c73b100a6c4a6ce\nB = -2d64b6bd987d496a3c121e89f4b0c88b6ebc6e30fa9d47981b52862551f3b7251a3fc376db0f2d6daab6e6fc5ea8fa10b040d0dce334ee91d8cfa6db9648df907b199bb11b2b5c41c67d72b760c404b0451f70fccf\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 49e9709810d9f3fef159e5cb45211453e7a94878dfdece19af839b89c0e43b226d7cfd46859963c7ccc753350e74c2501131474e3b8e0edcda18583b0392ee15f1dedcb7144000fc7fa7eabcbc83d12983d2ade477b4687d75b723c1a98a951d21b2e8ed95735aaec77e00de288d16422fd259c665a08a34331cb99299ac11e2\nA = 4e550ba2fc2a44452f068860ce2a59230738a7a15f5de0aeb4d15bda8c61ee3003568dc5971e48343d402112d7a86860a7f08f5cdc0de21fb1aa064ee5df26fa23839b5ff6adaf64a4a18c07efb3582c2fc9612d2208fe99f8a\nB = 16f31365545772f276d8ac952506bf4033a884edf1ce583a63d8d9f6809e29d9cce3b3d227f839e6c09b459951465ab4570d2d36127c0f677fc0a63975801896f2fd17887ca16ff7f265e2e7adab1516ce56ee1ee9de1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 89ca20a3fa109a65b9449edcc729fe97ed45a9bd69eeb31d4a566ec1787b24cb7a2c25b3f89b36fef1cb3645b17c69ac8ae243cdba35e17f5738b35278478bcc391add0b5ec42db9ec1eeffa63a3ecd2ac0338db57cde9d2eb9ca4bb1df84f1a62245c4e585c4f20f26c98fa1957df34409a99a18bb442ac14f0bd309266a35a\nA = 1fd8a096be30e4435ce8cc604ded337a3d9d2fbc9666d1893c38546c4e155315b536d1bc323c1e7be162bb0fcd58440915b053ca0d0896e99265241f2afd46605a2a7486e1394a07b23f3382cd190e943e596c747b6529b04bdb13\nB = -a3960a51af5ecaaa70146ce55d639005e9b6b9b58592441d5876fa71470ade6d1e2cdde17bb80532551bee0dbbb71a0cb24dc8a129c1f6e28920055d87e9c66be27fc4b425737f36add7d72e39bc83aabee5534637e2e22\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 654d9c55d4a62976670a5ecac3a6165734a65f1edcc1ca81a8c444dbc98c3409ac8c4f6fbb92f122045fef8b7971a276c7dc4eaba21f7be7495394053d4f9bb14b63fc02c8a55ad8fa9bb9aa26aca5c47968ea1b7646ec606f53606d5529ded83639984683b8a020e8ded4b2d9f668ceadeaa8160245b36a819db14e58cf2bf1\nA = -67abdbc70db183b8c25b0664805ada269922556bf15aa80a47d31f215e216673",
+    "b8d59edfa10a74f3f09d066055c3b9abd5434ce95eba91dd51576adcfbc7e2556df95fd6642a3b7e0486a635ed5699eb7fb285589c887c8659a2b7db\nB = 6ad3e854ea57aafb8980f1e99ab9cda24f183dbbc513e1fc92d4e239077816843f47927bac28e41d3f31c9ef134b72c09dcf14e2e9677a430d43002ae70c577d9958341243030fe58a800a068d6b01fd377e61844f0d434dfd\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 74bb23f7b0cde7924ee52e58bc0680f151e6898cc1bd4a2eaaa05faf218b419a19ebf85b0219f924a26002f9251b83506684af659e5b680e05138432ba227977f38a479ad9d1f3cf68a86ea214645fc4bd1a032f995307e9c9ee432e816fd852655ef20214e24522c17799ef41d1eebc6e097b9792757f7fc43124c609ef9696\nA = -19d3e6fd6de9092cbea55d65154208a0c93ae409c3ee35569cf774b8c8b7b1c9dfdd52e9f408e14ea3153073ed8d92746474e524a903a45a882fe46af92b033f2c41eacdd7e3c1ff661dcc5349ed6bd1aa845eb1762f27593708aa185c7\nB = -3d466d29e8c0008ee6f402551e3d62fe044787bc9f243db9252ea97da9bb75f5be416def97f13cbb008fee77f2eeda672bccce1f36fbcd26e1f1299619535da0a3fa3ffa0c6fee82a494efd7407cc770cf46ed1b8b143f42790a2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 197eaeb8221b431d5fed3d701a175abc146a9fedf8060e8e611a54f8da2fb27d2fee4539ddce1f3481e6a64435f09a2d5012540d6069900a332461471b22192fb87b63221c7822d3f2fcc35cc38feb6b3e49b5b0fceb52b0ccbdb4e1fd7b0f3eef3d582a6ae194c249ebc52f215b568712b3e50bb8e01c64b114955ebac2da48\nA = 7bd216d0acd4ee392258a7341cd56bfb0968492fe75da0c9d935713a6ac883525a4a520b5b7940b05e3f5e0c40372cb11b7ca193e93f0d3883fe5840e66346aff0f38829322bbc1f0a0e63ce5e528ba5b13596ad7ca19d20b2a7c9bea4214\nB = 1ed4805e53630b886cd733e5281f6d2699b3c79da615f4056120165cc63858ed2ddfcfd0af0c5fc54662aad90f26c55dcf70a30d04ce05bdf61028730b900587716e690dc0c6e02419622ab8c115078b92315e7c7a5ffe38c4a404a2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 40f69f2d1660eeb6e1840164817621dc95eb930875333bc3f62a644ca5910c1080505de0d54fc9fb6404a61bb2c03b3981e558abf9e86f2047c3928599b529ef3d91c7ccd13c1d69431fb9ea3f02b001427cf519d9fd8182219ad904f47b3785fa05ed24cb0ceafd537311633a2e26c27e61be92eefb28a49d7f583cb6e072c2\nA = 155fb75044fc54a6ba6c46972e2f97531861b8d6afbc358db456bac33a44bb0545deea2fc83023c08b7be473eb68accf5b65b3c5d6af88bc6d8ce722c80d5d1527e475905226b01ab9d7b5a6557250cf8be935339db330df2dff92f2e88e80da\nB = -8c6016966a2cdea4b2d8625aa367e1d079638870f1b61e6b3c3a1e6281ece41018d2ce93684d1f0088d021107fb595390664c11435c6c0a7b93c2c6895217a89c469a37d3250dfa457b928ba6119b5c9ca5f2d47b36e60e4325bcb4383\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9b9e6e1727326fea099eeb008a36539f3d47e3882b77d6089032b99c6cd36ad79fa75b7c19d1509b3ff022ef781b6a8c16fa6881f9ee2c4e00a4dbc93a49829622f4ce6ba9c55639656102d81167ab8a5e1fcf14d71caa60be732f1fbc71250256520c7c5a4579c3fdafc39356a2bbf2c7ecc526dacc0293c7578424c939ab6e\nA = -54cc11ea9806ef27911ba721f19e2ccb111045711d301863792f0cfac798758f0a29111e3a0f84d294a79721067f50858767abf507cc10ec9ea3eb27a91f06e7f6b7b4be7001b548cb7fb734166bad6739935081bdf6d35d58ef56180d377e5fda\nB = 7263e8b9a6f5387f44c55af64b64160efe97ec8a8159e723ca8977bc17c861e22041ea227c9c9bb467faaacfe352b03cc620eceecabb6db2db108b49c69752bd0cc61a5e998ac2f404ad052a51286ccbcfaa214ea8ec14cd9a2a6db56c3d9\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a18a7498ac9194f600cea3d66615595c27a3efa7ea196ba12a80b5f608f85fa72afc366d23f5ca98452dd190b8f86031a9dc097f94a217b29fa676a6042a3aed2355cc8e767d464a8adb888491c8cb82dbec8f117f57c4a07b41e7e6f6cbd7dc25418603b1d1d865dd2140a649c9d52019ef39dbb6809d1b28b3c1ae64fc6813\nA = -1b663403c73e4a9003467ed12766f16354f79073ce89b66066857d19f3b42791eb360004d23e02874254bc6db54662717739eced153944c4776f334576746c5c4145b21a23caa2b2a137498554c7b749efcaf3393c5457b2bb87ee2ca3bef5f191107\nB = -21d12aad97a5c6e639a2ea0a82b1292aebd418567718014465a22b9ac5c8c927963a2a4530c41d5a7a6c14805e56a7092c8716e4767b54a393d8552c5d3c366b39fb3b8667c60e6075e9293bc938e407c53afdd1174843b76aed187f56bb4be5\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1983576ed73d4d87d8b94cd3f70c149c0273e966176b85fbbbb7b3202e2c843bf1f8f4546ad7a4916ea4c731a22bd337b6177fcd2da8bd301f3af9bdcad800449b57986e7cbcbc7eb313d6512b2894c0cbb6cd753a870860a49d6a682c20b5e883b8c4839b3321aede51bfc42bca163a924191feaf05e196d8dcb7fdd9941a60\nA = 576759af0f02406e8dafa330babe9473d9d970bf371ceab30d2f98f4470f669e042e1708e2677d52cb9f99deb9b53f30727d16c389bb63e71e923475314b615762c7612269b5ad7bcb5108068bb5159cb8dbb8d08de2bd4fa4d9db6cf6e3f5997b9b416\nB = 1a4e34794747cf4aa626e964b839ac497b1357090ff63088f9fd4399312df894e41b395d17b8ca1806baec6115b1476912ca9c4309f00a46d5f7a52c8f640075422af06d6d6d796359132f4955072ce90e61b40c992a155b2bc31c262e753aa7d00\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3448648ff9f7425937b6faa54551ce14dd15566e5d41b2bdb1a8db62037459235a5b9546d289cc2295b0ed584fab2e1a798bc25a0c114238f61ad3381a5b441cb67f92cbf66007c980db3351adb9cfd2cfc769b5b9b0bd1701425ce1ee8d4b9f438ce1207fa850aaa1d3d1f970aef874c2b2499a150d29c2ceb7bac375009b77\nA = 1fb54cec882c274b98913e76342a9b8e631bf1d381fd8a4f7e0eaef475642ab3f5da70ca2e38741bd0182a959e5e985f1e0e7d737beb8c725c9b5ea22f7ec25b6e564809601e8405a5b1362e7792791f55ab64a57c03a99a8518d7f65feb0e21be619a6a95\nB = -8180d172d3afe00e0423245f47591d5f750f20d2cedd8ba6ab6f9aa24f74498a96c9001a0124c4f98dbd402b63e71eaa3a7af8b0d2fa417fb1d45f64e10030232b9155169153496aa202745a432e547002954eedda7cc9c1ca76811bd902b192f1a1d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ae0fd585408a99643271eef575285a6261a4c4a92c1956b1ab436d3cacc8d4cffc07044e57b357ffa43bfa9aaea57824319579c5c3e2fe4dd48bc818178beb5fc1ed60afa08828657d00bb88894c975378b1dfb452a5b88fc3c1d81099644a998a47a497c8a2b12c444fd2a088f47576b7f4fa40f34a208fbc3348ce33e59150\nA = -7dc7dfb753c0bc3ab4d07d5aa78664a7f57d64be4d4780ea81e3efc967fbf1bd1390248bbe259da32108ad96bd8b39f2c9f118bfdc96bd06147f812af831288bb687e4e1742dcd1dbf2b7adc41afa28d07dfb8df8bb2da5359e66330f5c65964096a96b31dd8\nB = 756f3e407a3ae698f103fa37759e90554f38378a9b8eb38581e0970ec8f9c00f8392612c61aca5fd37d1063b78c19e3109f35c0684ce523c634190b3164ef06959cc42e2b77e1bb2fd50eb59c3dccdb6090beb809ecb0ca30457a5c5948328eb218e219d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a2aa4550e855623a8ed488bb63db8fa4ac374c1ae953781aac590f78a364fc33380ca2806445fca5bb9ca2fc7ec4db5819dcd5769e3b746286c49a7c80149e7fe276d095929e2cac6ae57e8102f7d4c96261ca44cb6f1601f429528495b6c3169e15f9babc5be696074d45559",
+    "d5abdac42393094c450d6a4a45bbf60ed7847da\nA = -16d0aea9c752b2e6e4e13f7ab1f0a2c1776874967b0dfeeef7e00f8d9edd1e11d2aa702be45fffc284c47811c51dcee184a134b8f6d1874026eb51e2ec80c94837af4602cac3efde556ebfff578fcc56c00de99a43638ab68387ec087ee269ca64233eb5b1762ae\nB = -3c6b60b0ce4b13a5d6d9ccd67c76ec6b71b94ea7205e408eea099c7ced2f3a462954741d353d0af850b10ffede8ce0bf80b6893288413674504829793d7ae0cba53b163e3f26cd99beb0a9ad540f6d2cd5097beac604b1694a9a2f4c48b28338f9d6a63e75b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a1a8fcb68c53846b3edae33ec070ef5cdcc1346ab3a98a116344e6d2810e2e3f60f0fe435fe7ff257c7ef4c122b3c34c776f4912a9621b6949308e2cfe2e0827536c7464371ce804bd7cac1d76c5bf8b4a6fd4ed56b65434c3fcf0ac7be543fe2d09ac01c564d7b9b463740dcdfa9068d4d8e33f29297ab452e6ec55c263de\nA = 7c4878334ccd9e20cb11a643b206626ea5d0b20973f18535cd8f0fc2f0325a67d3558e4cc9cceed0d88c6d2215c220b8d0ce230fd701502b02081e3f6548e58e02bc2e79e4991f8ef188a84b0a367758b4e534b72cd87de7f82a26de14fafd162a50b359574812cda\nB = 117d8b1d2a3e2049e6edbb9494c68a97145ac3e658aeaa05e8ecec4b090d5f467cde34e05fa7f5fbfa32f1d9dad70955f22130c358468eb371555fdf57a40e1df398c166a22a9df2e1f4e18590b00856b4f880f6629f1a4296056dc66a29b6f0f25490c6a8209b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2cd3de06953acb87b773b8bb28172b24adb283d6adada676f5f4548990827635c51506c85670767828dc5b4b91b45a7ab89a700d70bdba4e0355da32b52c173305767721d18dd2cb6c55f890611e7abc854277a453c7500efc4cd4fb8e6c9bb7a73fe5c77045e715fd35d415b3496f7463ec902cbdc18f9f6f67c33fd78c3210\nA = 1a20ad042f46330df937b879c72ef00dcf39fb85b59186b8e7a9d40723288677ff6ab2b9bce95f34f2de37887c8a9cdcaf231254bd00c7e25b6042695d7dfc05a11765120d1dbce29dc74f35aa1492ba0c5ee65114d9a246b57dcc2eb2ea4a310be98383fb934121db20\nB = -f8ec67323cff9d53499ceb3afd44b28f0538c39dae8c965ea27d645b430c2f8a4965eadc8ed864f2549eb636ec558419be71f986f4c5783d0dd5253738b876d9034735bd13b18fc670438387f84848308d9357ec2aa4f6a453bdd36ff08d54a6800bb41df416b17d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1aebe2bc35eb2e449bda63513b1bfb55988cc8e6ec8b3c8fed5ce4dcf53b95f1b438c41e3b2348412b35e1f734edba30273935b03d16efaede429960442a01849c352349e23b4af88de4d01e9ddb53ae900418d49a84b7fadd2669261a574557c4fbd782f8e8f400895f6a6c9679b72983ce01bcfdb641f5067c94694e9eb80\nA = -5f97994c39265b5389526e3847876a10aa3699e3c3762a127d1a9f892180cce68ca6139a6f71b235da26c287bd3e1aaa1436746d983c23c3105c33ed2e06baa1e880f1744d81a80b98ee1f16220940d721a92118a9b949d4da7d1477db8f5b357b3ceb7df34eb5f62078cf\nB = 4bb4f8f4f4c8e63238e8774ed61a7eeafb3fe9a6e19cffa648defe82f4846e3378c892d223957564fcce79596151658a726031a6921cdca0adf0f5325d858c048a6b94312ebfd19b803eefcb93bbfaaddef120ec3b8c366b6d978524d5c74218da77e4c3b5ebbc66cf8\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5d64678a32c163874d1c81824d628a1051bce3b55c37055acc47a8630d3fee648df5d319e50b4c56f465bbf696433409b89c07e442425d3018a059ec757d77b3a40d516ca3148010036b003721ec9c999665915a3c442d95ec3c01c232feb201be08c88fa3c6b0769e3da30f1d73b66f98e31f4306bf4e23de78e74743b224ab\nA = -178d81e419f0473c426e24428caf25d61b648bbf963f7fb753ae15e5ea3706b53b00bfc8fe917ac9fd6c7096518584566ff71e6d35197f9aa25107a235678cf9ff8ae1501c1d5a15d2a27d39d066e169745e1e8c808209bcede0d732423d0c9cfbea322ba3201ebefc5315c0d\nB = -27ed464895b65d9518923fde5caaac0c72aad0d1b38fcb7827d6ad4e0c8dc09e119b8b98183f0ef8d5d1133f3f108e951caee035bed0d48bbeee6d1ddbff5864bc192b84eb8a500cefd223972ed51c7f720d1736646825f95f2f10ce6ad47a267bdd8c80f65d644df158d7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 52dfb6bcbbc5cff46942d76ba45301cbff76e9b894703a6a7fd1af29d615336372d147c3932589affe5c6533f28d3e6a57ce2d3cd7448bbd81e09a13266ea31630cf044f654b87ec3fa3294eb65873964110fd42d86e78d128bead5f117cac98145051552cc3a86c193d738b973f866d068a8994a49df3fc7c7314fbd9805e80\nA = 797c67ebdc083f3c8b3ddf9847b7f3c2a39e35ce2119f746ec87fd5d86671d8fcf2b4f6d440c43e93f45019032e629879799eb58adea729d43d2e40ede6485143bd35979609a12faae7e4393879c40c0511c886c66a24454e4f9912bea944eaa417c9942f09ddfb227feb14e4b4\nB = 1a599d1cd0ab3614f50b71b93c999942bd3d4cbfe7900122d5083151c71d9e0c299bd927095c5c3291418424a7c12947389bd4e0a3c2fdf67b3f512094ec0ce5b52695e527de2b3804dca2edaeb1ea4b487911053272ea926cf2fb3386dc4b1dc268b808bbcf4eaedd21168ca\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 99bb9082e4537426c61f3b813f8c97675c44ba9ca418960ca6e2464cf61ad4eabb01ba00798463567ed3d829d3f14201c740f19fca623b1e9b57b534a65df0f070a2130489afae89b91003cee432fab11426c4d13b7721e6f9db1bbaf0adc0064b33e4b9f4b795511a0744b52f93e3db7bc9c0a991e4e122c463ff344fe14cba\nA = 187a8144a0045a92dcad94f0bae7285309ec8fac7dc864b08914e5a4dc3b1a6bb9212161a18c22682ace16a4bf3c03dbaef088b09844902a3255fd6adc0b7c6397dda86d6ab67204d8061c36ca20fd4bb348202037b249f6c110c31580148db46dc5b1bfffa38a683a27054c35326b\nB = -e93ff16817b725016279a32dac247961ae9bb00af890fb49c4fd8cf5e815cf98b58cfa1e3735095e6034c9a2f2b5d8030ab30e2271abb45b347d755cd9ab5ab5ce37950380cb306bbec42b6b8056793a0955bcaeb23e2d6a9548684030566eca2d34c458f224c8e337cb8e3c252\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 631f53d02c031f592b3dfaeed106160488c08e0672083ff195b22a2c0b006f11165a245acad6f35dfb15a871a9a2b45c544111f71f86c920b42fdb6551e56c55199e6173c00e27c9f47256349a80236bcfd3acd1730f823031ff9ef594725cb9429ea183a7fb2e03124ebdd98d435313e43819d995c4fe81fdd4ba718aeade94\nA = -72e20f1aa2b5f2c4218fb9e11ced3f45a218f4c83a2017d97d0cfbbf227c9082cd43f939c8909e52c8795cfaa75d80392d3649dd85ddc35bf1cc54ba389bed9e9dcf867da1c05eda080274beb6b868b54fc85e12ae127dcbfffeb043f9d59333d0ab3374c24971e1bc7269450b418c8b\nB = 61cb021a3a957703d14061c21d3b0fc19598e19a17df9d6f2418c76d4d37b3f62bd4037aeeb1eda37f83df44c440f5e49924cc72ec5b153856c6b621350ec89d98859d9d1ec7ac4f0c418c6599674322e7d618c5ca588d5a873d5af356d4771c6cd375f5dbbbc69f50b982b8c4d1ec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4654a62d9491f28599a976288cd2068d8e3228da12f645413a92f482efc66d1737495cd4a4c733f147eb5414a2ef6266a116ce264491a3463c9df1b030d83b315f76f3bef8cbccb5c538478a65092547b91e991e6be91ce4549c3a6e34aa7b466e63eb3b88054f6714083695c616a078ed54e1ae46e00f3593af845fcd0ff51a\nA = -1a342c154aad619e567fd32e7053aef8d98335a4fa0e35bf06acd7998c43d821de1076dc1fb67dfa1156d7ff30203ec736384a9aa7f5f08cfb302eb3a2a7179b2664094c2cc0df73fa05bf2af24a62b8e394fc76014dd83b434df26f8a67a624884a0b9b4f08f33e9828ae64f5d0c8cdc2b\nB = -2c57e15889c3dc9c94361c17585d506933a72fa954ce44dda9f5e33408552ebf49cae87bd0be35197f887fc6c7deca1452a4345eb67d19bd2e7d3dcf651667a8900388e4d5ec71e9433e3b01d2b3d91bb94d0fc3c51c70793f97",
+    "8e4b5ef93a9c6356c0b2f7accb9e4eb457a2174b50dc6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6124d9ce4de2880ae3811836235d6d89a1a4b710f1d5a517153ed7729dfb5b56b0ac10a4bbc811db9b26465f03cda355701f9f28c5257fe288743cc0789cc54a8661f46e36eec357580b00a84f1d4c8e3d689bbc18242f1cac30a87cb7a47ea06f80d7c5633cde4c8cd8a1a7e27acdc3a2aacd608cce9e2efe7864d41a56ceb8\nA = 7b48a9663d914e0225d7275e965d866ee6649d7267474d5336d28d54027ffe8572f4aa26230dc7abe9957d211e6c2c8f3185cae962b878cfdfaaf6cfe32058c299247f372ae170a1f7cf71380787f6e90995da9ca5a4be8ab1ddfa8e6e5dc65b6f168b9b8e29e0257e0eec853a6e1911b1afa\nB = 1fc4dc77f4a18d4406a4ba536e500aff68d133c6e7725717ae6537b527c6f40f93202a2292522fe7d04e0ef804d1a7013b04cd3d88462fba31534770b56d2e5672e8a6ec7a723186024c40b4717defd1433b9967bd692ef81d5d4e39ba10a3223d250ab6e71d5d253dd0a732ed386ad57e54\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6443de73e1c826c90aa36fd7ec5d0c3324c42058b1c35d3adeda1685470d363732d23cceb08c3f973034c24fe65506bd33dc45d7d617a53048dcc103d3d1b4fd0534586c2fb7489ff5ffb98303bb068fc14b1bb6bb43f763dca2c891095e613bb7b6920163aa6cbce8cd93d9d39f4512b6e0b28d361ae11cf76037eab4cbc819\nA = 13f739846ed2c3aa0a1923168cbb46f4f0a2f3942ba57bfa5c426cb4d4b3d80d9530405a31bda329a1814c560d54defa3e03fc4f808606a598607783d539dbb1338d5bc0c2e272a7ff6ee6f93e1665d6f5a0ade30308fa047db086646c763106cb875e014e2c18ff8837e4d4d86861b85a5b7197\nB = -ba019333046f76325fa9f258006a7c10d27e89f6d482b95c79296c07a65b8e3bff4a9c9fa7e5d0038da129390ac851f8c0651dcf655a3d4164a731cd20a701895c12a906c732906038a8e459aaeb293fda21346964a6d53fa3e370ebf43c7ec8f66229405095c6a509d0fa15dcf45de8d0e901\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = d3a6fdf4a26993edd175de9a0f012e1eb15a5a1c4dd2741dfc6d0f9177cd5645508b8ab09c7fb34066ba893c38144c7f2ecadfc2b0d15728b407e5db4fcbbaf1871580426400433f14dceac43d28f03376e791b7ad01a112981f29ff4b66102305f0ecc4fd134c2cdc79a5e9d9f085bfcb7e6c187980e68b6c7639c12e8d200\nA = -464cb16fdd395e32fdc613c63ab4768f8cf72a5b74a0a5b0cc581ee4aad1972cd97db7966d3124e30c9a1c80d85c46da2d36eecd7c3bba5866f9eab4d0fa55b2d440a311654466432c681372a80a7896c9163c12314ac51f652aad68fd9012dc63fae6c7673c5da8faafcfa1b4ed5550f2baede5cc\nB = 40389ba4d2f5fc152308c9e8a8c36258c770fb2d03e6189b96c4f8dee97ccbe426cc14595c8482e9e22486b61fc570f0e7aeddad2f4e3a480d4b75d14294a3b912928da5692043bd98ab88ece87a9bbd973ec82f990c0ae6091245318c2810187d69c38fa80e835300ed06c0723fe475f3fb22de6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a0f9eff3a210912828fd7b5f2d72479cc9ccdcfd3e8d21739e301de02dd5c257c7ce4bee2def06c9d0c90d5a86bc45fa9f31e456d353775916b3d5684759e4500f99ca1f91f6767a5e2f4b735ae4b756d56c358a06447fa2c2ccf0ce667be4ed143e9e1dc627a561d92ae53a62477270a7944482cbf671138bd2a85fce92b08\nA = -1da555639228fc6ead68049d836d60a4927ee77472fa0ffd3c787d55b6067012560f5b1c2ef8bbf6119345dc6419444c675c1c9cd50602a93ba3718a5b3e1a30bc108d796998b24474cdad19bc2960b295fee97e03f2ca7589a3daf35bd28eb37a67b5d2cb35a30998d5f8622bd7e6b7d3fddd1ae9670\nB = -291fea1ae6dd1c66c62ae3a3d22904f4b4adb2a48cb795d50074095345d661a033f67b20c5d7231236dab871892deaa9458c235c342bc81457cca3f014a75f5124ff4da005dcc1108e75527528e5cc9c051a97fc6cd202bb9166f9e72e366bdd77c965a70592e5684fcaaf2e03421a2025ca190fe158\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 50f4d25875150bab63e4162265a632109d6b4743f9d6b55306858034732a4895ffb3720286acceff287c38320ee9945dcd0a1bbe5ae1456b7f36337cb7d22b679a6821a450765471257d52b6ab7d59a763e75e9e64581a93aa54761f6a760866d6baf186cdf4ad2b1a6af26a3e76cdc261d1f07b0a7122c8ffdef595812e7208\nA = 78a1609a7f08c93c9bf9090ca7c93459aef815719b5dde5f217567a9f68ceca05594f6ab17a4666ce1c0c4434e0f4f38ca1f33e501d6958a10da47211cc011da219d4373d2bec4b7c6477b1ab3b00b6c45279212db39bcc11d1e7ba49916c4271adca7eea531adad509ae119348f374ef1203c5af8bc019\nB = 152b46095d3f8db5e6e1a9e3f35c085da00e52764b261c3aa775ecfcd38572d2e86bab2f4bf29c2de4fd2fb6f35f66e8685714634e1be980773526bdbf9c43b1335c5d59f4dffe1a1fe2495ff9b7a3fae3e53e7c3208968e1ad1dd1dc8cf2e2415cc76dfe5df9e2e1eb63f7c7687d539706502d56247728\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5a3ad8d6f1b0763b77f5d40169ff0013de638b459e401f50f4cfb505565c8a4465e28ca1bf988071701dbf52ac456e01e170788ebd2b7cccb50dbfe1a65a89a8aee18b3c11986c9d6e6571f964f376f322e10a1ddd9310bbb40f14b0680385c40975aba43153970237c535c6b0e2cbf6bec918a8fa26cb2f69e98d77215c23a6\nA = 1d5c14b0b51cf31e9d97b7c49cd26097d40454978663f8a74095fcbf9c63e533708befb1a467f94cf599a41220ce13493a273fc30c49275412c5205db712d5e1832b39e65c150c3a4b251e2aab853e4ecb4f00ee5ce6982ef9215775a33565bde3ddbd932665aae506941d3ee31b3f9e4ffc0651f1fb4a5c6d\nB = -93cae5dd84584a2a3d88028d6d4cec4146cc5e350b4d92c52ba2393ab69fc1dba96e244f98e2f93f31230904169641aff30dfbdd3dc5fb1f3489d63aae1efd29335345a79ded546e42f2ee4a70ed932699fad17a771ba65fe6e689664bdd1135219aaa905c962d39531eba3e82c3425c24041e17858cbbcf2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 61211c706730a1b98c628b3c8cb070a42e2ccf9fc6302bb1c2960fb165087f210e9d93416ad9fa21634a05dd0723cc23b8d2a846ab7c3bc402999138433725e737102094db5792249b4b5b1514a416b80c804ecfb04653c5ab18b0a34d8777f6c2955ac66fef62c9ec2819f0e3c075920f951f86b32e02bc43239d9218580067\nA = -46c8c68f492d8f7ac7834f89bc76098146432c59b3301d4eb70d9861a6e24c7c9073f910108c7b35538a79de10640291b54e5755359baf47482b97af56475211573576e9412ee017dcf961a090a6ffb5cd995992ab68e3fe60b6186f7595bd9b8acf8695c4f7359cb2ac709f032fb993d16a74822b4935536453\nB = 46953f424d988fd20700ea08880e7e09ac22d60cfc294bd4aefe637408a3cacfcd0ea6822a679b68b665d6bebed3506d25edc83cc7154b83e22953f9d91157cebd219cd5177fede28c63a15710d0f92bd9e542a7586855bbe57a94c520408fc920b3f8d65b194af2b2a580c90db1cdb27ec26ba929de4573c6eb\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 50a063fff02f2cdc68edccc23976f4b3db99641073c85709626292b9475b9a988fb8509a6223f0a517dbae0cf7cd39dcf1e8ae75196d9f5008c661d8b5153cbdb9520c71068e4719820bffda4c393032edabacf99339e0cbafddb6042ef887b8c498e87e16b62417934015172e63e7457242b864a47aa10e203f47320f03c0e5\nA = -1740e8be7b4775725516d37ba643fc64203f3a61e6b0164d112af56666ad97afb0059c2c4981fa81d72264f8669db4e50e11865907655b1f669c88f5935cacf1b12c1db63cc84507af12cf0210f990994055d04d93f148f213e3d4fdcfe9dc42117c059897697914e3e3fa8fdbf0eebbbb9c3b9fdaa7efa0c9d5c93\nB = -226308f8fbb35b5f9d129c0f6a2bd3e5c272a408bf32020905acc6d02d7e506191e76a3a2ac47cf7a63e6306b256f489ca5cdf76c7c3eede175ee4a7acedf922955e92599647b69d463cc14f2b178b88cd471b8a1c1512caa66b6d5fd8840b98b8d070e6593136e98cce9643e006b714388768920a79944be36624f\nM = b18a9cd6a0a89578ea773fbfc0767",
+    "c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 747cba0d1cde75dfcc0b2af9072c5027986b3e3917845870c73c452858ba21d6d1615eb71ae1b5a03ca44e22845d5432b368541b52a4bb02498668e8b99dfa2eb90ec1948d90564e6ebc388ee9816e329e1d8da0d3e2b12d901d47e22e8a1fabc37408be0f89e7a4ab0f30a03f7e2ed817006809e69c21104d0efe548165f64c\nA = 5fa76e37aaf0eb3d34d4f4c590e02b6c63fc62b1d4c9e172cb0dd82409df87ecb43a1680a2764f62d13a5e919db2db08feaf98d5cb92a859dd42bca1047ff57b8fe5974fb3ac11ba2c0d8e2203750f30650db4b2cbd31d07fe18c4df84a0dfdb30f9e528932c097e89d8f8be6ff029dd970a7d2c2551529455b9131e7\nB = 111199f91b3749f8cecfe90e9b9b6951472cb701beb39d63068c064cbb2a1e1d30736026f781836a52ad0d828be6c20303c6c0bd03ad664dbf6044a5bfb67fc20a049fd37c62ab0795d836487b883768ef7c8f427eb98e5ab6621fece77b4955822f8efd190c417ced398c221215b50e9532a869eceeb605fa1c936554\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 646cdb3ed472a7b4599f02329054846a8da173000eee7533240ade4dba82ee3d7a6a92baa3783c19dbd3f76fce6b5bdd83f1f229b1c71a6faa18602e368f1b0b9f8c62bd8c854844af85c2081924c9a153e27853b2a48147950fb614028e090e2198e613631c95e565c2b9b64a43237fd4052089f9d1dd2c00525dd35fa946ca\nA = 1c8438247c0ca376f508ccef7933724df512f9e0877596f7f4ea73dcd824809bbc472749833b537eec01ab23656e9758da22ab8a4aaca1aab3fe8d2cffa6672ca0c44ac029c2ca6c3e71780c28c31b5f154c8dee782f6ba009a69d83b1a3a03a2d6275bb8bc3932a1170470fb7e405ae081f4770b535edf49f73a12ba589\nB = -e365c8edbca8dcc4cc11986a5a901e4ed0adbe89b0ab70a53aaf5821862432a1320cf1850b515177b630e12692cb025e3aa43e9acee0d8ad5e48bb15e9a3f34cbfd39d285127b52dde58751f572ae68ad98692899ab12d35e33652c4426ec60c5029e51f7e32ec3d2031032aa7b6b2b63f84fb0023c81d031773f3652cd6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7a3e22f4a3f7ae7512ed73a07abb5ce291bc90bad507a5ccc0c17185804b9d231b0ae2e72bf270dbd60170f34b240f716529a449abea0b3d98ea2890a4ce3d9e2214819aefd070e00201e9f271de925c4ba59651e55174c97a13a30197e46997c6c2b152548111aa98df120a617c54b71f8eb8b0c8b4dbd5251f5509fdb8a1a8\nA = -78a99d206b4f095847e9a21de273aa6c47034c9afd4c081a8e93c2d75f4ae5b090921ff5108c863785c413e2f7b4a361506fb66b7561b8b1c5cd537e90274bddaa4e91ce74ad81c6dfbfe1a34a631dbe455d74ed9d041a9183da3bc469bdb214d2ffe893f89c3ae30f8ab99c3aac4d2fe864b891fbf4f537745fddcc60504e\nB = 5c41274e9590c1ea44c113ce505931758f2cef80ba3b10440941ec9aa2ac984b29868bece2922eaa225555dde84a8334f1caede99091165151a39538e5b7390e81df757f521236314239c213e9b874e396a022f04629c09bfaf929a0e9fe0b0c7386b0541446f6a2570491067f64e662d8611c4fd6d1c78a9f3ae69f34d14fc\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7fd27b6549494c9bc860146a3e8ceee785ca03faa94b0ce0a964844e7871e813414cf3f111da49fed1ede5e71e5539f34173d41f9a17ed129016bb9b04c86487f5def9fe350fd4dffc67b6e181e3cb26378ea15ff9b9ebdf1fc86c072c82ecd8bcdc241301daf1b774af5f90f37e45e6126c5da7dd3753a1e5b366038af6ae31\nA = -1930548d105661dc25a5ee303b61b559c4bc1f2e28b2c40cf3e25f98dfe01a7dcca0f3dead6463b55a5b2e0440a651cc9e08e125535e081c742bb3b2f8955ae897909cfca683a4822896d8a4a7073c29a80571445c6a0d53d2efe4a30a79d2fb5d08c0f95b735a1cab17ba40d71b054c9270ba6bc870e58591fb1bf9dc9b7ee8f\nB = -3e2a4c1509494f94406e3843c9446edaf0a6060144637234c6d9ce84d70fac54ed163d77d210bf557bbea0404922c8aebec67a0475a3c7b74bfa2f226403ce987c705c712bb8eb0934c2b390a173c3836378fe71a6939e48d187b27cc7236ac115309fbeabd9ffd0396fb7fcd6d46a1dc683606c757ddc3212f5d2ff3f2e450fc7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2078bb5c82a394c30a287aedcfdc5271eb3246be05954181ae4f86ad2880ce674640ecd55c2ee3f4e89e2762139586516a28558481303e3071cc9ccb9a538f887553bf5726f3849fc41ab027fb1c680ce7dee3982587ec71b3760e5da6956d6894ad8c4526d8de953c0e681ecd44883a21f0abef1544fe601743efd3e5eadb8e\nA = 40b4ba1e977825b7accb941fe0c0a49936a8a47429dfff53502fc0680d705b9fa0efe003eea3ff0b649998fdbae8d0831bea7f34159aa4c7add6bc7cd56fea97d25fb9a6a10f4572c26d792b76c18ada19b0ba06b6142c420dbb40d66be669b7c51d8cd2a5022fe1a8aef7b60965c0176eee69c32ca5023782c5410adc1b15dbdc7\nB = 1bb2f18d7c8d306bf80ae1901115c8dc3d286baf537b812ce06d6872b61e5bd44f3c53d7f31ca8461b3628b255f85338cc325856fda5a6248b7c476532c1bcdf9713dff9932a50e52a9441aff96092d3fb0fd76046a8d88288d0cd55741083a1bdb20fc6e9c20e82490273354bd826bfe001322dde9a15763f2c0e6ffd2cf60019aea\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ef21dcee9eadceaeab13287d6e3c9741811f6ea9d5bd111799ae05260b1de2ffbc192818fa45dd7befc3baf6840e3b9d24cecbcb2cb1c3d653c4aec6531b941d926fb6692f548cf81526acd0b6b0289d70dd11ba50ca8de6e174f502eddf47e57440142c7f74f594a9abcb48ce1873df057b132ccce8b364de3edf411089d28\nA = 19d0109e0c47ad45f57b8bb8519265a4390534d2ea07f969d84ad33556518b6234d40d1631be3c3cce6d59b7be14750aed114008458f50a6a84ff75b4ee7e4b826ddcb2d2293842ed29e4e484260a92199c5c66367c402bdff0f1a8057127c6ffe452498bb352802e0005e6cb084663bcfa82783a3d72f3a2a341b8075983892e86756\nB = -81fce71491eda139ed996f6a289dde8635a3a257ad6756e844c768e66746011fd797658184fb44b0e3f3c5600c56238ac7687b5be42529d5c9b97c3ce10f3219e1e451bb2dfbbb44cae0828ef894eff3b52b8dba4c115c3b471984441045f2c2db426cf5f86949d5bb7662cd40bb3b3172a19ca3fb6858315d688f13c17550e700cd5dc\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8a5f90344071790373044193cc4fd92116248aacf05ce639b6aac4461ec3ccb0805ff9876ef44fa71088c295db14fc820f7ae2c0aeeffca055f8f7238c6c90db706d02f2cc43b4960abe3ca4b6dec8bba55327b958e75c60c5d1f43fcf9136f12481c267481a725eecc403a16aa6221346df680560ff316a63ec8b51dc37aad6\nA = -7a54e7ca04b9a22e2b986e72e634317ffa20f6f4ee90353d559db3f3c1bc6b3b92ac6b364f6c5929090373962b49b59cb5d87554387761164982955470cb45dd00c4a8982dbaae3a1ffe700e8903a4a8e4a21eff9d00fa496d475e0e1a205be267499dacecd31551f8a9d437f37dacfdf5a2754f0876a3e02509b78674e7ea2169c43f29\nB = 652001f073d63ddd526abc957bbb48ca74154c8f9698b988178b3313dcde9acbb19ea11a935184fcbcc31e0117d8d2ec695ac56b5a71614a12cf90f21c8882187428755b6a5f11c314ac8b952ced0f65db0987f0f87e20b82a811599f4160e65c7418af7f33604e7b8952b70581e3e02dafa025cecda970d04383ee552abc620dfb9c5df9a\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 67f903e0e5623258826b681506f3e94cc0b086e262bafaa1395294aefc9f6b6323410a44427010d5e8d8288993973ad9939199b85cf02ae0a09dfb69801536a3fa6af5ac373add7efd25ba5fee6d8f040e97056f9f6fbb45795c0bac94c51ffeaf496710b00bc9ddd8e445261d976168771060c9bd9d83838a84ee9428f59d6f\nA = -19c695ee3a4ada840a7e3626e61047c5081867b15843ee9a6506ce45540d23ad25ff23b72f988bf26ab8b98363d9a2997773604f43fa732f59a4b16ddf3a45acdbc7976a1fce01b3dd55559c20acfbb7501730f794bc45fc09b1f035d60413bbcf32a83fd3c41599049a674f165ac5283c42aef213d777ae47eea960f7727f5758146efe5bf\nB = -210697d47beb73f45207340a183a729a1e78d84bdde1c7",
+    "d8f80bc84559c4aa4572ab0e6927ea175acc7a268d05616201cb235e610d1012500c8ba9351a37bd68b4ec42227bea55cef5ba7d12ffb180873ab9d33d09e6e969df99fca728dc12dda6903169acbad38388fa9b001edb09056a2ee2aecfab0468822bca14a4bcdd3a4122290ec5ce1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5fbaff0ffcfb2330283fe59611ef51cf045bc2690e31f2ad3265046fedaa990b5d5060b3c38f17bbe8b2696e527fd77ead8650d329c2e0c1f3b2f5bec4dd85641022f3e0ae6f66ce98cde1a785bb52eca796ae45c33142e8264621ab447cafe988de926544e1a7036710128c42fe8b574f7ad69d830894237d95a55d1bc7f5ec\nA = 482db04e35f9fc1d87b42bc5efe25a049ed924f816e1b0f9c8ebe34bc771e67e26d6057563fd5d5320681e1207c0b0f4b7df547cd6d5be6a2e0f2bfb088f990b0303d0ef263cf45681e0e9a1147c29f2ca5251faa633ca53f6e0b109ba69bbe20c58a76a22789243d1acf128dcc936602e832a20a2bfbfedf963bc1027650f483814d7f5e6905\nB = 105aaf563d4c1d436c6a4552770a527776f40bbb844b7701313c5ada95180160e7cd4b7175ddb943e5a22c910585dfc184b52935f06b12c84b6431395f28af2eb9ccfa66b2ee8f40fd44d753c6a83d67a6f3fe3658fecc7fb2f4a8f357c5d244422e48a33d0e2971059695a59d0d39b235d5194e919facbae7623ffc92d771532b6b0cf771912c24\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a9d204c1a497f350fa1300cbaf682c947eaeba8b3aa0450c1db9120852a2edd2a0249dedef3b3746298ee42834d869e9f765ce987a2aa4712a1f35ed10d0f7ba9cdef938b073c3a526e5bf45f3510c94ff1fb84bc77b08e2aa50f5cc75e2f4da37a8a711f8aed5e92f7e486877229cb4ff2a4d0755029972323c0b51a14fd1e5\nA = 13fd3d7cc9d6d6821d2f2b1c40c8e070bfa85b994ee8f3e0baab544dc71328a1a57b7ee57392ab6d24bd85f9ea0f2a312148fc4f4b22c589e9a265d97e73c7a5b420bee180409ec179c438a67abf37eba61ac76197f3c9ea5edf2d4b8aab91e9bb1a432ef1f214c043664a51ceed1f2854880dd458ca253f09d6f6acafafec310774a672d07147b1\nB = -8c90ecd56d6c7cb129d1c9c26e94cf919c5747450542cab52281d11d8fbfcf9ea797b29588340d146cc40e77dce007b68c0c24356d4b75513b75eccbef6e22a5b88417cb6c516578d17d871e7d0957c09795f9a0f19b811db75d61c27e1827fa2773846857fec020f98444e307d3e52af501114b962ea705cb0cdf815109054abd00810dcc270d7bd3\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 57aef35a3f5388c810f576dbc30d4e4e5a39248b319b7766311157179d8bc1d7ef019cdd8c2c0175a8424abe7b33565afc0128724fa38f0900140b6f96bda2e78d7c803124cec8c2f2d6649afde4030c76cd33394fb386342d1ce97a4ecd180872134fd4e22667a687915bb4fda21f7e0bc9100ed8cd3a6668ed3a235d7b15a8\nA = -673bb11795d9d20a1e4ce8ae71d041705990463964505befce5949f895fa31c92d53f91fbc110df4e789b3f3f01f184c55df92927b8b680cc92864466ce5590ed2e98901cfb78b32ea79bf68b57a14cddb53209e08a7f430fee23f4a1475fd2640a515f8b609e98c760b4301747ecb61f1e6209b07455f1c8a7bb4e20c269e17937f39c6a2fb7b2990\nB = 46beea6005cf96a2acb16f37e357bc8975f4dad502fc3aefb4666344dde456c0ee7ea43ec493b6aecbc7aecc7d4cd107aa09e874ff564f5d59d7e12047b048c1da1faea36a7e2d02d0567bc4db41b54a75110626d13597db698fffd577a5810286ea8bf50625296ee8070419345fa269a354ca2eb47fa3108387f6a4b2c0ea3e779908a14469106eefc14\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5cdb7c451b2950c9d87638857407276959142958b06241b2010a9f93625f9106f065798f79ce5c534b9e5a31fbcbfc63cd200fc1cf10217096aa0194acb9043ccf7ced30d9f0bf66e0dfe27ee2ecc40bcd8de66fe2ed6f8cb0d874ff7b5fe71951412731fe4e19c34bee64c9312577b9e7b2ac08ed15aea753a6cd3e286192ec\nA = -1eee9d5d3854db52f9b43698e05d6a0f1d1f8df5f32884a775b25110309c46ec5c7e112eb64b2d7f948868bb9670068779b0a78bfc7e17860ee02692ec6790222b4384b9bd7db5abf29c46261c10d95f503b821a4694c45553e0dbaaa977892b916cb8990ac9ec29ab5c3d63ed77138fa1e95f395b3b233d039ab5daecb0296203166e9386d1071c61cb1\nB = -34587c2bf3473a2c5d7f3399d5ba2bb09be8105a0b9f3d8737d67b03d8b91b1c869f4e223d6246abd36d99d84052ae5894e58288a614a0da8d69f1aa57428632c2b059ba99315ea2f68ee210e65a741e94125ee4a723a7828bcc410aa2dae06ea8ed6cd23f66ccca7e85d2e071055787f230ee405e50d1519377cfe0cab4e5f97b6cb893b01134813a7c2c6c\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 95d0b209654de56bd7d6f74afaabed2cbb3247f449d80511d2d3c689f84c9b79587d78abdf0eb37f1b89f1f8dc8a83f7f9fac2c8cda1fd3fd64e16f5597b7f0a1df6da6db9e828ce7be0e876012bd52f5a74ca73ff8ca4611dd9f342bf77b485305ac28a1f8ac7538169f2bf3e4ff4dc5fdb9dedb97fa743fd8ac8791b8e288a\nA = 7821d4b65d529c30b8747e184e450cefb11b5ac5dc77905e6fcd3df64336661c82ea68d588ba616d23df485ff0658fb3376d5276027a40b392f47219edc5ecbf510cf0c5b431b02c65e5f432092f941d32ac5f71ce3496e403c7637f63a23b91e3326d01d2d32e99e0ab265108dc5e7919d3983839b3c7541848dbcd420a594e850e587f1846951852ed76d\nB = 1adf5c428f2a95c27a943637758d5dcd7ca36592fcb9d52ac0b7d27adddad5804e3edef257aa51c716801ad0c731e13c5dd000f11b5ff1b69c198f236695c1b2f99c0afffb5d084f80fdc534de3b0df4597404b50c7e784c3c55dfc9753c414d145eb0ca4d07e2f65b63f3eef8d391250a5500ef64d9bf963d7250d6906694e7670f92e3d5a7930f0f85964a21a\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 46914b197b84fa99addeaf55dd803182083a7ae34d6d4d3a55d6272af40a600563cc8d9f6b48110d0521b8b99751235bd5a340b1743497ef1cc459dccf5d6da970c4c3103c978ad2d513298f1fb3e68b24a9c7b0795f47d8f7f6ca9caaab9a9d80f15982599d764f8738217f9158517806fded5f3552fef8b7dcd2e725ee04d5\nA = 1c9f5f2a0d72806dcca92dac1450a50cba05b5dd571c2b3b988d33528d90ecc83444e3ea8df80802c30fbd5a6ec2ad9969be73aba6dd27e0dd2c842b95371d7547768916c0cb036964d041284cd323c8073095b2a8cb8797add5cd80f03595de9d18af8df7dee0d250ea7048faa47ae0131ba3f350d82864dc95e5829b88eeaf2681433dd4d58b2c6f70426af3\nB = -aa1e1b3cfd5ca0facc75e46d872584d55144620f849ab05931210b4e1526f12679bbd9cf00efdbd8863970e2abe8fc9fa7bbd21afa9e364e3c9e32f51fe66844fea4bab7f3b1bd278fd803f6bdbd0d296321e67751a0b894da338ab431871adf1514269ba05e0cea5558cd5691920fbc18237914f3dbe4b253f774e5dc1dc57023c080a3b90a004b809d237658ca1\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = ada55d93c533716ebd8c16e23603071950aa714deb942ebbf77206753d2676a7aaf61673c03a4db69d67faf6273828594d85e3c8cbf38460fa2af603fe9c1b6ce104854e7281757b26589f079da80685aec153fc5fd1a223004cdf30247f8398b8e92899857dd199d5d5c32412bedbf9d55f20e52895fc1dbd04c84cabfe1264\nA = -7d22392a8da1966e6cc5ef50d7409c614f8c8f8e5791778f68a00b4a056d0002707933043d05e48347bbd4d0dc1b6ca32a1aa4bab9992e7e620263283eb68d97af13b90a29c1b7dce39ec0b8a63878e8d65aebfb3bff4e67129e3b3725f999f1ec9ae92007911f2cdf738499661c5b6c9bf27712d0f29e871b17318e95c3d14b2e472cf9e466bea91fb71a493b2d\nB = 40279eefe59f954aa8c51c9c214fa07707b1d095f697ca40edb820401a45c472d1d7bb413eeddb64c14ce6144b4863fe9337ae4ae8698db92facacd6a56f3b33129c5b608eafa29e9d92dea620113051b926b80b75f320d7ca3d2ab597168c68774e68c47670458f5ef2ffd4604f20bffcc7817eb09c9057fd9989a6786a7e067ebe6724a89e7d1580f94ee4ed502cd4\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4dcae9def5467526b0ff071003e56",
+    "f5537852cc0bde9d86eaed2c15e36e6429c68c061e12d321bad12e29626b5013c28f118ee59624ae2f35d2c53bfd89e6afdb6db79f0321ad5c55cab03e6a1a97ff7bd58c760d0e9fd7507de987ed2f94f9c79569fe7f03652cd53c67ebc6bd3c9e6c5672891a9d2ee11b300ed3b19753c0f\nA = -127f5ca6924851faa2340c4c8f425b1dcf41b313c5c2910e5eff8ef2faaeaa43305de2b3a65a75fe54c00fb30c0ce3e8007db1ea222521190ff1de6d0cf2e777ed61ce8211dc167bf115a77890d0bd1ca786e967a04f077c89939ce484bbb1c560f669aacf7756a4338d97cbd7f09a376d2dfd4d632bb451f52c03c05762f050ebbf112f8dc5acdd9b631292fd7073b\nB = -3bc5e9c352c46449a9155b7ce5478c771293599cd2dda58a962010f1f21d094aa6bee03f9311545e8dc6213f6aa73c08b55bcdf4d1d84fecb9eda35c83eae5fedee75b2d15a003f8a82b2b788ea19f7460fdd8f447d973c950b3b250a3022c19ff312ccdc86b6ab50c4ba627b15968c8a66d306bbdae8e88fe28c1853fdfb3fde92353f46b5bc448ae42306a4c91202f03d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 62a812e35f46e04b3afa7d26c8fd4eb168b6b64cdc839ebd0a46bf2a3a712af8e97380cdf0bfa8a274f7b73e887bb4cc73c6104a176d425aaf5352f14ee51ba549a6926bd8d059b8e3826b174385d4635b0c36df75a4e7da44c34e51eb82322b34ae00e8c712eb75b3882822bce5a2f2f5fd74355319ebe1973284c690bed2af\nA = 71c57b08127a956f0c17fd3c639bd1923ba19bfdb83c0cb9dd78e62b8fe4b7e0019cd0a6b73a334c622118f96fd6d91c1e06d4dcef8a3d0d6bf8f5beb6389226c50d14d3947ce9f24f7e0e6a7befad2e4e92dc9ed8fbb9811d908c03ac074b2a5c67b67831a350c4d548ac70810bb5617d261a045e53cdc48117b9fe86d35950d0a181b73c8cfd35edd31af031178523b\nB = 1cda2a51a707f8c4d2cbff6337c3f63519705614c26a489b545b1faf366b705af1d953701b568a684856fd3186c035f878788f7e5dbea16b5e7b6e767cf611452a4272abf2a9c5e72b7251a1ebea5098c60cc5bf649cb70980b97d48580967ffe2913309b6b78cc12d91025ae403928851902dcdaaa60f5b323a1302a5ce114cbe174e3eb3c2fb5eafc44076396c23d53b028d\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a9213cd809d41b6bbfc2123bb84860788ce22d5b91f8e24fb616efc286a218ae9652b42912a58bf8ce596a1b48e4c72f27e52c36be1940f7d2138eb895ee36bbb917a59f73e0b6c3266bf4759ffe2ffaee3f6179492658e0778bb43c4df4bfa1a46300c9da496033142ae2c1e33333fd7e82c5a14686b255e224c51aecc2a590\nA = 1cf4e2d5924510a5fd06ff4eeb94a740e430613277149993004b8de1a2b96ada54b05365f305e896df5fdffd3d7bcb54f9a9dba9689e5ad498012f7a684d083c31d7017aaaee720bbd42382e526a35d2add21d9369f7faa41dbcfe3dae426948a402635771a977e19d5c353ec7c1abd279975f2effc0b7bc19990154b723f2f8c29e606581ab9d3966702f68d8bb8065e9d8\nB = -cdab60f9b8e1add4c54427b638ec5f76b30654d3649b500f833b2943bf6cd5d8647549657a8ff999eaffe413ed87e06267b97bfc1b77637b57f29039235548a7569fe6d4bb16ae9c6cfd38c0b8c73aa60797d0d69b03d5a98314f7f7ee25df8b896ecdfc782cf8057f038b6c3e79c99df52f839fd4eff302ddd1256e51eb31cee24585782a0439da3db2eee79a58f889d8847fe2\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4dde3d63aeeee47441a7e733bcccbd4f2e495ca3c746468e9855177f7672d5d82e51da8e268ac24e8971d802e25d842a16a6b8d76b8e46a7724108c02d38a4830453408ca5ced7093676a1db4bf4c94b9b7a9531ab7c26f8de520bafe4431a55a5f5d8c7576427a0f5bf2081b998b82da2e8e959f2ec4d5141b55e40bf6ddeef\nA = -5770ea0a75ff451fc2c86d428f2569884b2c88cb6d9d407cc22b191849d389f57a5765b83adcea21c350b37bc6d750d4859f547da22ea8a3698a5cb6154b946331ae2ca18e7eaace951dcd49405bf8d8a716f7762eb242b8bf5e4c53a662c906c3be89e53ddf7a706ee2406c7d0ac17b54ff259c1bd5a092325938832763ac4caf0232e80a016cd1994441808d8db7e546de3f\nB = 7e4246ad4af268695a51912053ab6628969af4fcaf7f1e97dd977984a1604e8c9fe6b920f39a764c27d89f75986a4bbc122f92ccd1860f24677cf346474fd9441f572f769daf834e6a00cbc027e15d6aa7ec2030becad41e1068740cde82abed768de7e2cfd325848f6063e2186faa76982b9ca73ef22434a28bd2e3a5ac477af50f258140bff938d3fa02fb904a8ee0ef3c1f6fed7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 3d8bde8d0625fc46dec46fc657c49c8ab12a988cec4ec1c24e6f4d8ff94514c8d8fee4a08399c6bd23fb6464a38bb5f249591456c283325e343cc289c85df0ff2c1707a6e407ff7a24383b66ab603b75e2dc3835ffe9274eafea148f20764b8ca30cbe483c1cefd51f82dfb93d7793b3ec19a57f2ba03d884f345bcc3188fe28\nA = -1680dd51d8be6069c86ae157922d55df3b58ee6f53738677bcf7332d6e7ef304ecc7ff7c5a5e1f525459d77202f3e815c68f17f9a6bf358654a92f9f9acb252ed8e9e6a849da7491f26d0e33900541ab67ce966d042607258b4382b8108729a703b429babc34496528f198a7e0f814db80fad4900fbccdfb64908febf5e09805d3a3049c0f164f0bcdaaa9bbb06df8f05309be83c\nB = -2c6c6b3c89f6e1d1cdd9abd1a9706e4f642a25738aebbc97cbd60e1f4ad79b419dd54bd14f2bd147b1d8e9bfcf92faccee61a43dbd1a2c084bf06a2ca476b3d169fa2c99794fc827b7f4dd010c0534e7cdd03d00456033ae0203b78a7ed229afcec2d1cb96892eb18898bf53584dde56b4316b3bc5186d97e3a9edcd059d7fe14561eefe4881beb8519c1cb7c3ba22cd2e13d874aab77e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5b4fbf0445807c8feec7efa3c2bf8dd86b1070638f3c87f1e173ee980412a28847b263a266506e70381aae919ae05d306d3a67a6c1e72c8ccf1c27d6296526e87f0f436c98fd1391f83440b58fadd4fb1905a484bfe8f516661e7176a268660387fe6a7266ef02e5fad91ffa69247bb11cfc1b5c3a88c76b7923a26f8a31ece4\nA = 65fe4d55bfcbba2bbfbdae831aef3dc8c8746e1d04cea174c1d336974d81d026f562225b4a297b1c3b044ccc5dc9c830a805a399bf26c0369b52ab0dd2c0ad19e723fcf9f5de2990ebe5a1266653195a2aefd9a392fd3da8c22c523a362f195babbbf5329018e3b454221b3e77cd0dee79f612f86332b1d104aeae7d8d84ad06b107715bb76bce20220d1340ecfc666b2bfce812814\nB = 12f775dbabf1c112523feab443f6e95d773e8220d66fd87bb7fc702588136a048e17ab6845a9c784dca275cfa445d007e8d8383740b156df7048650f89c5ef1a84148488fc405898f9e326cb8052f626c8881abeb70f3a0f52dd83e3ae0cb82d178cbfe8c393449caa2a87e7c8e2901a87e276b49b6d012f3cbb65641add3694fed3e3177777e78fe375f3a3b378091bb8d2998286562faef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 4f0af7cb0c4e82d0e6589b24b55528818bf2164d41f58505a2b302a8f677df146f8077945dad3790c323e19b37e3379eb95de8abdadfbe4417f8bf8da643768a622ad4898513fdbc72d3b1d2791ec9ff40634678faf0e17d6e0851f08c39405907db85b74937ac403a9a3a1004013c7bd95a585728010689fcaf63b2031bc8c0\nA = 156dcadeca94985ea8bc0d1378daf1e85ecc4c7f8b6d6c7a5cb9f9ac368a97c07e381004023bc575691c082b5e9e13a02fe813a55e76196e4ad4b0f9b1e089bb71a0d5c94254b66e3e645fea25d69bbc5af266e730482a60105306d664f0ddecbd76d54e7235979aa2d806b809b3468078b5d90aa22cbd2c441198d4a52f6259972cf3d02003dc39dafdf3581638e56d08c5181d36e9e4\nB = -9a54586072d093939ad86df11fcd3337ad7e9e478dcbefb2b89d7555883fe8565abcd5b0a9c88ab135ce5327b2a326db645bc7c0e3ce24f902544675ff9d946abf30302f123aeed0f4e28edc72758ffa760277caaf4817a3ae8615784c81896d2404e2cf47c06b09085cd0ad1ec46cfc1f04d0272eac29e774b30f19939d08c036b185983c93ba15d1d27aebe4a357b9f6a298acca3940d2730\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7c3ac09486a6fb518b98a9bc8a8b382bf2293e2c1154470ff7961212430fe2dd28697e49256b1ad8add082ee27b6ecc016b120e971665be801b720069d30c0a8c6ea4795613017e8883e5c0d0e68f982c328379d7a0afb7825c553e087b33e9d78f90e0b95a6597076b8ec2c1d375e2143bb778c318ca0680a64072cf9a4fc08\nA = -71d8e7ef13d63b4f417c01ec1241020a",
+    "8ff4c9b2db531500984fd3e45d22b2bd581894c8a248ed7cc345e70a5698407df8f0e4ac71ed2c0d42122a4f92279346f463aed899253206786928a0eb7c37f2e51e1cde7f97cf9288d85c3ed7f49e62af0bf9abf062d2c6544d83b9d3438b3881e0d07b1fa0f2a4446fd43ab3b4f81fa2cdaff199c87965e298943c68cc15f2f3f3225efad68b73\nB = 64d52de221f102af62ab1e9526935b005c81658f8fefa019bc58e641023fa785798ed0dff8f7f999dbcc2ecfa47d5314ac6676c82170d6f2b18122c17c1e1ec1b9b54e333a184a46ad35b2150c8165f0de19a24b98327715e5a641c1b6d3ff9d247c89c8749e775e6fcf5f967c6eb5e73523d4f1ec12db7321b14398f26201a364e1371f0ac922781ee252c6d2b3c657ef259ab73cb7992a370598\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = cd08b388ffd41d0aa29a3dbde74106c57b18d325be8f446a2d9ae95fa4144037dbd41eccd50fa34096984cb11bce555c117c5568d76a8f79d308ce11043fe2413d37d6aa60c366af6c1da93d525e4b2d79fc82c0a53ed62fbf72c919db8a3ae11f5ff8057d7501f5f6dfc9ae461c308d21919d0de9e31b759d1d8e3526fee58\nA = -12e58708c30c93383cfe6e99ee3c5caf1900a7e610605706e77d8f428fd59db2884f5021d7a382cb18b75ed22528961cf43be1c700c581ceac3877e83eabd860583e6e94f3f2989c179ee5047c82b53d37054c9cb7ae08be60a91b10d49510e9f0b90ddf89f93790c3e18cccad5a9d223c605a6c567550e2b4950e184fd97dd68bf30681d3f9c585365de2cadf36a43f5a5305dae555396dd50\nB = -26ea5079ba7ed137a14d00d413d6f818e911cc183c88764de4d91d7a9b4cc7af3fad703142dc7905992eb8bf489f6d8231bdb25603ddf3c31fda8bd9bc4d78835f9ddc1e6445037f05125cb1ccd92eea2e927297e5eb915d5d965a25e5d58feb8d79a890e6036c80ee91e7469d9eb672d7a8db68905d06f5981fc40bf486575a067d35cf14ceee3ccb79b72871bf8f52b92e4910ab17e5e59ab3ae6f9\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 34714506322dccb91308c403c267f1ec75f80faf3cc4272dff4a84c13eb1e6133af6681387006c61e7e087046b64e7ae74eea8a3c0564a7c1f381e1c940d92b2c766fffdaa7318d07dbeb877943a73b50517b49e5117778b8a60212284fb92f29a9f5304f8f537e88acf8afaf01fdf64773f988cfa9551d6884baa70587ab76a\nA = 638b7c549ed14256956bad532945ef9e11a50313172965386635a2fc7db79deb0cb5c157e9854117c17f1509d505d01a0e138d2e510dfcca45b4f7ec968b5214a6699b61b8ac68adf64d5394f50d577a154c013612090e2045462160d1f552592197d7da78e03491ae284dc9faf643805f2674af8652bae93ff230fc3eaa833dc62781e5f74d0f0b90290d51d481b0a94ae6e972197c6e84ad7ae\nB = 141f62297ee88ad527fd1e0e09d9ab5dd80e17b32f34a674a27b00d719839701664ccca1b00da2613396cf633b0bdc4482ad3a0c3e209eaea7c22f33706ae44155f527c9ca4e341e651760d1c39f65d5e99e649d013730d2502b6b65adb8a73e6bc734b7d879b430798dcd53fa6c0badd57896cb566d9f1e0a7b3a9161e9808e762ca819330ce9319dbe7f49bd663a9f57ac53d65c6851dc7bc4ee66e08f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 7adf54c77eaea2a1743bc5011ace45b7651846e77f90402297f117d8b1c0377f93f49e92a2457f3d3debec3022a96c74c166d01b2279553ef518ec0e612bd7b382529184640c55b89255b2679da9cf370913351592de39f804f1724de36db90c045fa644e8ff20627f67d6afd4546f00d7af093f668629f9a06c07fab5654ac8\nA = 19c491d5b55aa25f2e18cfb7fda18ed4b020e3f63244eb9f6c4dfa86eb8a70875cc898e305a7acdd3eee081300edb3e4c837940bbc1927f5ed9f651e46581639e133515457464e9c451390828e5e7e00a688daaea74620363706cb69e02717489ba9ad05774c424c18e295278caf4df4ced80b4cbd20cd631df43f2e16ec0334564d9dc03dfbc7111e4252504fb449d5a25cb13630b7c0c565a82ea9\nB = -c3f765349639beb80f888d9c8b7b335ab46b55064ce2a88180c80ad280c6b7314df52b7e73095dfd82896e24604854a48121353aa1de663eff07882771803010005905896357cd5a56a59f0db0045f1aa2c0b5626e132c169abc64b9893f95932f54c1d8cc25f215a9ef6e4cfdd6dba85f6faefeca81793b2258ae1d1427e81e458482aab87f6563abf435be69a05b195d1eda90146a8cc92748ca6f798b10\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 32ba5fc81a7747c3d812cf036bc0edc49f08824d53b91a65a6d41edfb1651d99c11ccb4c074d7f04e652276ae3fdc8d6eedb72c6e46cbb1f7f4070dc9d179ce3e21a3826f7dd2c27943a8d26b192d7f5c4aee9ba0647e406133e3e89c262d37cf468aa3ab8c5dd1b8900dd06cd600abc6d372d9408497d9e20c86a9a6a4ad9d1\nA = -73958019a5a52357b9c1d954c9b14f51ddaced32a4d7b7c95730697cf90029564118ea168d23a54381f7bbd6718a6b662e4c87410e48ac53b7767148582b0bd6a3d35f488e7fcf2b128e0a58b5d468dedabde4d624f4a82e808dd7b175af0d3658c6df1ac0da6495bc9a8dc012f8de55c2003da9b2d478e1a089fab776d99026684026968fc309dae46a6ef2412039a8207c3084f96b4e38e4fa01d131\nB = 4330fdf00bc6d13ffc267073b68aea7419ebef257d63f8f244accb9ee46edd04fe5481292de69d377ba6b6304804ba7ec0a063b42339e6e37867261b9945ec705d3a0029c6f499420e02a773476546993b3c5e1efc2417f51afcec7145a9c2625496865c11636e285d4c8b053ffe66887333c51a712fe9c8ea57606103fd689dc88f1fe37dbc33ae4e92067c5bf51b53e2f8205164c800e5abd677c73949b00ef\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 69b850a99b471003a56931f7856da357a2254ac50ed81dfae019c9b722b95af16047a0d5422cf7ab66ccd898e85caf0e03e74cc8a5a413661e5da483b3f0363e63a7031bb30626c8f73d6e99e290071094b7fe5bbaf4d303192e59acb5e53fc7cdee78576b51595d9f7a25ccf3c7f8889de68b9deec167778ca27ac9d4c71c3e\nA = -1976b3bbbf92acbfddbc05b5d9e7b62a7666b239c1e6270db7ec6dc2929bad1024e745b897840853d14cd815aabb01aed580e1cc66ce37f9d1cc4c9bef8ddd35d28285faa29f2003d2a4623ead7d73302ea9f380f16b3fc06b7c2b8bb4ce4c8b03bfb6056a61c620e4decc6048cdda5e2d3ed8a13b779b8829e2bbab91e9f6b0304b1c08bf8fd85e0f3cd7ee72255e5342e077ababdbb545d7f809bdf8145\nB = -2cab554f7a5d21c499a1025f61e6c81ab0fc68a874bf60470cfac57425a451365be62c380ddd31f6e202f29769e2b6106868da7c81522e03fa6f0704522a5f8bfadbd007bac65595e149f6c585d7fc022db016bab32819049e7547bf85d4232a7fe19084907c528e7eb0434f2e5a375ad9b7d463821bef2f6a721a635252576c176ba42519bfa5d97d0e47facb4426aea0d755507dac81ccf1537b1003ddbb0727f6\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 2ce33adf34f2249f8a2d2e073976cb4c78b71414e027657fcefd56fceb022a06c1969dfafd519eb9e2542662c7647102f5c528734dd005fca666be57b46234123bc3db286cfce07bcbb399eb6764daf2b9aafbc2898a5ff43ddfae849c7549289640edc4ab7c4b9fcf5e159623e5497f509ad6f0270a41fd864c9437302ce380\nA = 509f5d5b160e923b4fdd72f4d522a713d780daa4bfd10ddbd62b26497a2e7925c495afc2abf0ecfcb7980e588f96c4078bde51c7b2c19d86d15bbdad5de72fec2e0a284dd693ce0902b40e54af87ac5a5df38ae6d1d882ea6299fbe6910121ebfebd06b454ec5f855bf3e7cd544a4b0d9a764428662e824e2a6185723534f5e6ad829734347d240c48c2c0f8bd6be6ae8a495a9e383fbc7402a4096b8c2c214\nB = 1a3b7f55307031609afc974857a6cc75821e73a1a9535bd6b8e141437c3fd4a6871c904e22c5d9289df7525ac69a0341d3620bcfc5f04b38ae540e26beadbce0002a8a8bfd0f6a270007e4c52aec2fab11fb2a831b9886997256e4b7e7ad3b0ec64c0f31fb0d637869143712291f5073a5756466d7c82c31e08e09683478229bccdedc2cabb7e426af9025185d8dd5124e08afa4e981236180e0a390004adb7918de6ba\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a81fcf9a18ce476a839c896cc5d9b639fb1d74610e2f618c25310147b57cd77806c2aab90be7be4ed10f0122baf9b862b141ee8e4be5e0c23ea776267f14c31e50b119bdd33f2b41f6a4c43d35bf6f095864593e0d8c0f1fd4656d8371af844d197308bbff14e5a28b7181eb6e6a2b31ead7361e287f3b4550ab0484bf7baaac\nA = 19f1ce60ca50bfdf8e02313f1c9a45496720a2ce46",
+    "7f1e8bdedbb32525d762878b61476989c7f6ae8dd29c983ea596e521bd4cbf74dba4d505dd9ea5df423474fa9725d5b65f1575d26ead95725e2a59a6c8a5397ebd6b54123e42bca44781b84c014b8e5d2c1a86cf34d764b242baaad5be285cec72ba8ace808058a0226c04f95eb2b53a828d0ac41e6b40e5a4c4092788d9f7e988752f175f075d545f421205\nB = -b115a1101d97664759538d22154de4b000c008e551e2ab10ad05f12274b10a4cbfee762d232df5188fa1161f37ba61d146e8b95fa715d98e016da8beb0600de65216cecf8b8816f6e7e73e2a2bfa7d0bac74b517b906bbc43357fca69de9cb5507bd95205515b97b3a4d6842f3d7b09606cce1c7436c462f49dd05e915d04ab6fe2748ccaf025bd5d19749cc468d228ba43452ccc479c146ac6d781717bb9966bf3835dec\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 1473f092540ae30de595666beb33e430cbec42d7a28d4f7982e62f58025cdb617cfc33f1e5ab93d2ebefd7345561b81271bdc50bfbb0db6381dc0ea023ff7c72605da26dc7da2b5664d2ad7967426ca97b3745f82528964bb68e70087e14dcf2d71d30fa0d1f7b3f10b19b357e7053fdf22bccc5188c6919eff1e5c402b750a4\nA = -68f280cecc512d51ae534f30aa198cf7b170c346c1159fa9cf158d0127d43e50a8d4704ec54b8b4295dd7f51c6771cb5767fe0c975414cbe6d2bb58ae66a095e8832d5f443498b1ade1f5bf249da58595ebd878677b34e3b4c99ba6124e2b71d86a8d99727a16746469de51b0a61d9d981459a6cebe206cd36a09f00ffce7f532e2c31999847ba000b9e01a4b84f454544b6362a5c093b9abe9d583716f4534f2de4\nB = 5b79684387f18d7de6eec3a63d737490dc2a46c0616ec16388dca2be60adcda11ae13063ede3fec177171a51dbef430f8c4b3f6d297b9d6c020fc44e3ffab891d0d751d033fda813861bc067c181118dc613335ce89c5960f952e5fd28bc72c41b7b6e374ec29b837f1e00271cab646c794579d315260921dbc3b984b86d98b8f8816aca4f16de50657e4102f34d9e29ec3a03e0da06e70f69952339bf2ec4a7e74daca82239\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5e4b3f4aea7115d592bde9bf7c6594fee77372ffb19f7745b4de878a4024f81e8290c77d2915424df20004a7abb64c214104a3123e7c8f230c159ccb99bd937521b433dcfb065b186a685fc40f9166bad9380a02e297ffd6a307ce8d2c8f2f1330447a9c06c327b74f3cfc2e98f3351a8b385bae855941228969d1c29e9da3e4\nA = -11c1d396693139df5bd91825c119d1241c3f57b7ce95b46472dd82081738cdeb0868d18eb7c8ee7808016b3311f982adebd5a2e5f4e201ec4a34f3037d260fe580e771222de5a1a67947a4552cc03c5c59f9e60e25063a702ad3c3aa43f061a22567f938a91f1dd697c3e3978fa11ab1d65030bf327f8049bda745658bdd4ba8f3e34b060c6a2c6c5a8be54c7cb5f6b106f54a37d2be9f674f7747744d4350b3acdf373\nB = -25a65b6acda692ba3330d70dbc3ea4dfe208c0df358c50b7872245a909c5ac19ec568b1a1340e1a094f5b8e7d1e3b7e04bb4df002558aefd4540135d62d75bd5ce959128c1300b9d98429d7369610866d98b22c345e531f2beb80b042b6ad48da077043401a82e223e9e529e7407bfa466dd2680973006d047d837c26a60cabc36a7ef538f603ba19f8e923f168ebfc3834df8f77a559c9e0342e33df245f551bb242e5a66e5904\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 47872b544fa0425981ae17bb450ea346135e6ed7a9de0572ae14a6e85e8319f27cfab778cdd8cb5f93b417d9c66ae0fb7bcc6652620f7f3f74acc2bc9f2c090129fa8315aeec9ca7adc5356484474ee803883ba4695d7bc47c87eec508d16a15150cf3f757c4713de71366e958d6af045b2d282b6ce96976692c80b1e0b6f846\nA = 7e8f55c040862f12d8cc6e506608eeca65ce38e9e8ab18ef7007e3cf0f1c9a0696795bd10f8e1e1f55bb4f4f3a35c2e0ad18289e250571ccc26a961f730346efb1e29fb143ed97cf72deaab19834fa2e98e9c12ae4cd23b9c5ecef4a04c439f7d42e110b30caedc4334372ca24cfe4171ef1430528f7b57bbc823fd606fbd30915c5817e6c57c967c4c404a0847b1455da17effeebbec3f9357358e00001239aae209228f\nB = 1cc00b95f6bd3abfa697400c98110725a7e109aa9b8cbbe9ae16327c4fc8e5bc93afc7a94da32e98e85e4fd5eb545192c73007d97a4e84ba64fe187ef61d17f0941e165c9fe64c7b8054e24dad30f92b50d1f526b4bb031e6b1b9058be24884b170a145212273c51692b71bc57ee53176d8702b975bb6ba96284b462da2ce38e12d86b342c7f4d3cd489fbce88a309c7df1121d7bbbaab6814cd1e54953e5cc46813ead98f02360372\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5d193b085e57c3f1e825cf3b36c8bdc936c603136bb782a244b04a79fa713dc7b08436b85ca3b483d2e100a012d6430679b30c8e4101c8f08ca0f9010dc0f27fb37be842054dfdd99362e03a7f55ae58db7b47f694bd35d91a58975ae1f255c41617e773f91c2640f768bc702a213f073682dc761e056b34c57edd85585fe04\nA = 1bb1c759ea94b61a1721ef5680f42af30fa31444b27591a03b7c9bf5b90845ab965339f463a78bddedcd62fa21197c32d6850c61bae195f86e1c7a23e7a20dc618c59ce3a1c6ea6306c0b01b11a36d0fadf8214c36a133d689438021ce7c78b20c85256ec607360cce14f139513d9f3ea6eab067b1ffd0935d7c43419b93ecfadf2c5a902b7c39a69bdc023173bdad574adc77706c1a666d66f69578a5bffdc7cd6eee28ad8a\nB = -e8072c49cea603d48f20276df188fd2fb28f8721d578220cef7db1e56379c04a6b372e56a047cbe59ea84ad026adc5d0aa930011db63bf4959f15781e060e0240dfac0e2a2c26be12a21e5650d12140bb49a2a8e0f6a86e4b1eb79d9b8aab3202bfd339096529170cfe3e0c18263128686bd9305e92a3c43e1523f97d8a6a2707773e3d441da162a79089c9ea1e094cd5a23474121188013c8c287965a5e77599f6a7d64174b06cc165e\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = aa79c899c2b9518857c9e4f96523a44607c3f6a97d1f40d6474ec79deb2feadd955fe92d789df4d362c828084559fab56b5e33a971abc5449208d31671c7e220c5945886e33ed1d804c059a8e439a92524a785076f9730732bc5a152aeffb5b9ecf3a7e4b55983016355c4c29827496fd4d7e6532c270cb9ef263573e4c63074\nA = -41b326c2b86e7ac14a2050bff67bb5bf9697f02594789c4a2b3e8455df4522546278d0620f28a680f6a88ab545de5829305485422f4e70a5ebf0ad15508dfe3f16ac556436d8fe8a8cde83ead549d88e0bb24dee52ebbb49159ae71589d918d3fac8011cfc3afad613ea09173856b7b79b55a2e43e0f7cd21eb9122d5f6a1fc5408414f5aafcff863b870c67b740256d317a0c58af9a81d8025a086a1f3d79f7408d4bfa06b9dc\nB = 4730f03c389f9bdd92fd864177e06140c9dcc02d01fe7d37b51d44de140696f116d11bb67adf7db797edeb7c304386a7f5e37bfac46a5462a6d4c49b1bc034c2e0dfa56f14bbd2a4bfaf86bbad4f6d0dfa13c782fe680847d4b43373d7137f5c2ebe4ad58c695a7d4c407bfd888ce04abaaec60a3fd33db10eaba6b6acf0e16cb61d1beb9212c2b07921bfb5595ef1eb389200b356eafe8b5288d8f0e2cf252b38301de65190d56bfadf57f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 23f9850dccd2af799f18268c3a2918a69019513c55268faf2477c50677fce277d8ce58a0cc06dfe389170faf5f0ae13ffc4954c746eebae66efc14eaef2c2ac9001f3c7ef7e32fdc31dd725b6a8093e33daa6d19808908e0c2d3e7c1c58e0fe9ed92f4d7cf3cc222393ca4f95feab5d34fe29116410a1882dff7cd92acb87590\nA = -10a75953e5fb9903411869a2949f8f04144d6e2d61f95704ff55a02f40c4f283add405353a68bf7d6acc1b8cce738f0c6f9271a538b4c688dbeface58eef0a0a1d491a9e66958750db97bd01466edfd245cef03bb6a3acb81acc63c38538e7f15deefd15afc422a8641c357c31a069258dc0ebb63f06094ed8fe7d4d420246b40302361967c81f0a9ca542fd1de01967514ff2565de7ae3b4a200d63feaa22fb99a251cad66624df4\nB = -351242b6e6d0122f7120deb8357c3bcf25d221a15f83579883bfb4dc2e6099e6b7b95fd08f6e573d93354b0676f7bc9fad563d6eb0f3567ef43efe3d874b9c7733e4fe1ef491043e1f80aab6094cc9b9c236570972233ea74e8779a6eecda23a65d08d878850cab6005159265893dc0f66920a12c26dfb421ec326a1ac09e9ab8085825c31aba488af02cd51f96b205c50e692dbf2d844ff0a989c3ba9f1c2bc7f2e7dd9458a72d310eb28d490\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 69c7fa326630d7de69249807cd8bc55c9315acac26fed3caa3c8a9",
+    "c6b51ee96a7dd0b3bacd5cc13c15f199e268c5eb91d1ec36c085f83b437b9906caa6e39ed7bf09778610b621426cc8d36d96f541d0bfcc7693525d33e0c2ecd77ccfe80289a11155b37c7ea7791b5c2be3f9b954e230c19d746575afe9a1a3a9677d23c5bb\nA = 7cb78ca8e5d903096630744c85975719c16333e2e44931956d8c45b001d35ed4e184dec88c9e2167d2f338fe6f25540a144cc419590a4ac7caedea3bbbc565365d3357baa62fdccef2c5ea616614e0bff60e81916eb4abde0c9725b1bf6869e8b1e11f6d0d08fd712bc68003e55ed462ad4946f7f982e663f65d45c07c659d9620d5139d2b3332a68d33aec36e21716a3b75f44272a19f860e6ab3864f06def9a5ddeed340ac0733353\nB = 16d5b074e008fdd30e73ea95cb5fb87de806319388b3a44f33c94d38be0e6f1a92103dbdfb3d23b6e1d19bdb29ac14833003e9482cb7524d0d7b4c377f4911e3372f2cea6f84c938d84e3994e80f0d68e7e385ca29e02f70294c921dce7cd3829c5854ce51d1f4fcf7dba910b51b48a3f53cb1f187182435f21f6981cf8440f9c8287a9749c92c0304cc2bc91eef32d8e6526be802de8aa16684e8854cb0b67d9f7ea00f6f0145d14e3c251f70881\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 72192604b2f3f68b9ed3e261120ea52b06a05869f6abd21828ce8abadb3a71c360a14947bc738e5d1d530b9636d796f785bb44508477eefa80c4b77d4e8e35463e15ea2a48c682d3288c5abeb66181e4bed7d5b4e0db20fdf5ed68513aa5ae7e0978ec1c4646368f206636ec90e808817bd1d03acf9adb9ba57dc153873fec11\nA = 1112d291463b28ef45e879412e6607a3e20d50dba5044e71883bb3cdfe9bc694a577fd7d896dfb836a171f3a4d8fd025d3a979b43e41baafaf7b535d9050e47f4880828640e952435648960bbb74a3c25dd90bccb3fedd254dfc0f031d0e8a468e93bb69f771ed35f1653cffea1a763491fdf6efa21aefc287cb611f5ea0085f64cc3705c784f87ce00846901833d01a3c45ce047d822ba390b538f0a24720155409f60ca0d90e13991aa1\nB = -d553fa2dff0265cd9d083ad097af87a99af3d8d93a9f4c07440a28a427082004ae5c81d22bda1dd2429f540de8df175c1b4d0d50f0227489ba570b28baa35055df951d05b584ae6b051a135d7eb2a501b2441f82c135a8ec0eb81d379b96ef8f2fd526ee62293bcb934c76ef8083727a4b28bbfc9f515ebcc2bb7ed9594a106e137ce94e9105b2e2f4776aa9c6abdf426a181181fece3251c3ef4f8eecb634e6bd47c5878663fd51c74a66b92713fb7\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 459e19faf105ab17ff794927aff86196b3cc3461e69cada53ab8c8c81e2b1820408421ea1af6ae10257e8cd9dc16386906410761fed62cf9ddcf0da2a92800d99563fbb9cb1ab0ba46a17cb9dee3f2b68992c2b832a5932e4533fbd5c4487d870f3fb5d7a1c358f4aef02993360915a9e9cfde234df5f51c761d84568400b618\nA = -7a964c62e38e4124cd2bad727138dd12a086a2bf01c095b078ce2f81288d3c8435ccce0c8e00229184091130989434bcd107a3a0787a2f5f4b0e8c23b1cee9a8f39ea279fb6081efb6c3df1704fae9e87d63ac6eac4c6687b3551ab7ddac5ca0541e12047d04c2fc760fda0916cd2b585a90d25880fcc1bde8f0a1a413969938d42e8b3b5f73118798e85b901c2e15860e29e2ee8b1c95336b97dc10a21f5300e0352adb60b40a8a99333380\nB = 743ff4d91ea3e0f9c4f72e5daecb4fb00b15b86e30bacebbe4384324523d14e22abe29b00573733f594d652a88d98c987f8db08b27b4dc68577784fde02dd410ebdbfaad9e9afc6a22a8cbb13a780222bd212fc61e38faf409e940fba35ed909e6938e83b0fdf5b5e3ce138604823e788efc3aa0df924554fb70fd2faf8249e17a827c5d85942005b328bed97e5ea1f1810219d77f2fe121ce66518e37c84d64aebda3c397684212384deebd520a776b95\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 183950095d9424b0ed09985aafbbd2e5d64bf541a56b68b42ea8cf9b2c051615ee7bb6c0687ca6fb0036888fbc927cb7aeb303750871442ff2c0087a95f4efad568f48b03bd2b9a9ac26af8c259a3fa97cd2af7e3d8f36148c26785489cda6c00a21e7eca219d1f41b2e82ba8e2c1cd752eb08a2fd50c6f9077f3096e2eba05e\nA = -1d2fc778cf44c6992d1f3a056860eeb12f969358cadb087dcaebf5f96bec42bc0aa98672260adf1732da057e9e0d22081e33f5fa71f248cf89dd361036ad58692637cdfff584a191279f178242ec0ad397efc52e99462f496caa0f3133c4238aaa877fa7094662f080eb284c4cbeb992a368c2d157ac5c8c9160c167716406190fa39ce0abcdac52c8020969b87a4f84bc09a51f7b2ca288c93b1aac64e19623a7d9e69976a31074f637e4c82aa\nB = -2f188f1245b75cd21d052ec76edeb5881944a143fee31c67370fab0420a748f3f1957bb8332ffefdeabd0ca806169629f130c86c99bab490a9668fd8200f4a9b1704c589e75b5c8c855f133d50b2ce06191875e2872b36c78438d6032d53004c047f49e4cb81e19fa84da16d053e6cbc7c8eec0b9129a8831eba690e0542ca3fefd204258624e92844c8b7bcdccab986475a47c8b22e89079ea6580ef8f496099cc24dc2911dcb1921d1451e2163b55bbb7db\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a02c38d5df9ff7055ff84122342ccdf6ed7f7d54fe8227af091371f5ae62844645586adaae99c11f4ccd828103a81471bac72dc20625962e41d603e760591bb3569a21f45bf062b86b5fd1c617a4769a4d767a0ee14d104084c12ae875316a8f2be7adec0104381dc02c20b5851efdf7d4bef0d68076975e0ada3e58e101e8b4\nA = 5daf37d616da184acb278a75fda4e4fa49e544eadcf373c054b203a309ba198233f2285a1b55dc92e05d0213b26c82e261d8383a845813077b2e1b5f4553400f09410987c8dd21d4383e0f05747d0482d1a89f160a5220b22c78393873564fc5b1e4d5627ef3d4a05612709f301381df35606e99560fba07a917d7ea7413110fb5a8290e114d5200cfecb00b6c53b2ee29911bcb2fb2930eadba0ab9dfaf46443370307d9c3b61a329f0b8b8cbe7d\nB = 1d9539fdb1afabeb9be6e774dc7c7cc4bb4fd63af7abb557a5fc80a3fd23a4600de3c7fae89b91f3d441b61d3e24b2fd3d7803cd71620e7313917b4afb89ef5171a3d8a68c3c74aa3dfc8058d555eac429dfb6db40a9e0c25aacd2050418d6f32bf21cbb76981269dcd5883178d4b69a931a0338b93022a2ed0f78f3d8877989cc406f19d6d082ea344309318c56be7946412ea0867c78418ec32b9fa3a61017c10939c9345021133116933a3d1eb86a3ef16424\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 5fca287abf1f487e0ec18c230860eed4a2e550228b1500b1e33bcd6675646b5afe505b55073129f22352dc2b113c584ea1b98808214b6916933e90e036b129b61657cdea9026e1fa087ee300e055ae8f94ffca933a2d70453ed220468a5a3cf1a65d81eca11cf570d7d038722397f487af60531f24a5f069671354882c8bd2c1\nA = 1d9fe15171dce97475f4ad329fc8fb5469fb2b8086e4b01eddb6ceffe5324cfbd28d791705848569739b6758ca7e7d7d49adf0c11d891b0a5879ca870d1ca5ff475513322ff218cd26024f97623bb8a53084594e1fd64154e1db702522883fcf4c0d677a7fe90096fc76dc3800816996308d8f0be2dbf3b879f8a000c0ac534511437e2ce2d7ebcf42fd1698a829eb846b3afa581c24d5bf97abc6e247f110f4e872a2474e3acca6c8c0d518104c3375\nB = -dc0da8f7adb8e9f7b0e3f293cf623528dc8e9668317910417e52301c50c62e7d30e77ec7e38d6817d1f5a93e851f8560f642f23a0b9f836812d27b1b41c0867088a3108332b8711047560052ea30c8840f03a25c65b227a175d8f340095823788adb5bdf2b7ebb801e20f6b6435e154f78d17b8fc4373aecee56ec7b8f5686a7d22c8571797fde85cec884d45ddc4b1f2cc47ebf56a879bf286f349a0edfb531168b733d43de3b86b49eacb10b06a432c96c63440b\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 6222c1a14c6390d73944cead58eae5e7a6c19d19e4563c36cf624f5b61d99991bed7dbf6a0723abc56469eedfb1f7982987c2c7af6191178cf0933ed5f191b8117c9d726cdfa8b82a2fb25ca5436023f5860aff5fd482c611f134569ae87395dd99e5e9d400b5ab1e3064210ded096411654518110ea45899f4be2516e35a229\nA = -7f6766be6c6ca9bd1fd7ea1f80bfe68693f7ee4b5ba2946846839060d6028eabbb9079a165c1a07eb6a01239f3f14095225b8617753a1cc3d9c1e69b516d8705cfda396f4f0d05b0944a0f08b478d261e968c06918914ba87c8e7b7adef5cc2a875917d00585571542af219bd726e502b7f3f0bdf0cb1dfc6796be2e22e8ffb5b8bfac7e15e991022974e75d3a5eba214ab8a1aab2fcfcdbc6ded2abf834d1899d2e3ff94bad9c696aece045212531773f\nB = 49c6f869745983cae44d33cb7ba141234905441ca53172abd1a2dd8bfeeac4b236605cd2dc5b04ff9aa13de84872145b935b85479136065d2d57fd15fbd97480c25c6354636c17ffbca33c9319d65e82523e39fab49321380a130fc160",
+    "857a451a69b1d0509d5718a9cff8b49c2d677c1f66bf77333d2511f58d3eb2fb47b3c162cc9be8b012d8df70278f0e21123a69724a1f126369a236d54da026ebe222c513f24b577707b5ab4b90ab0e22b4e38ceb4181d4ca101\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9e9cc8c5342dc6d6daf55fc9aa9f79ec18592e8b9724a66881c379245c91f06a7df50a6ba0964603a6dac97e77a55d06efff17c93d5faf107fe65788d0f56483915f6ea0f1ccbda7656eb58fc032b5771600beafdc12c2076110a9b9670bd0754ff6a72c5d6e1a9e4e42c688e1cc96d7aecd815bdf5dcb16fcd1be1275ce7282\nA = -11635fe16dafce21efb1c599305e9a16eb5651187cbf054cd9d911c13e8eafbb738013e212f9c2b3662ea15ac9bd82b5751d43a38e4475d2310945a812262309094ae9cf59e0e9f3d02c92d8ab01f5733a20f051054a240bcbe3a7b6bb3f7c434229f631c4af239d33bd3ce30a372a480fdb49b2716091d26071aef372b8bd8ee8eb7f2965a372a836000b3737d2a833a39230e721e4844e16031ad69cd45ced60a64510c1248fd776611934d8d2a913d965e\nB = -3bb2cde9d3fda96fd7e6b24645f8e00b43affb223f2b5c3f4b7cfee905ddd6703a9d6c01f1f099ad1174da215a645ca4707d8156e762e2a253d7cfddd05ca19823ada9d33924013f677cfe4d86bde025391e0aaf91c6b776a9cf8a09dcad7cea59ee7aea1cf5f5bfe67c9d4456332d1f98e5310db9a0230381e1867a8f75b8757283f911f1a5e0d4afe5d544afa8d86637f9c9d87428fdcf8b4eb8f477e617960948253b24565b2f23081c47e211cd3c788a92732a49077f\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 30dc89bad4b449d1df9ea9b8f9d40b323c71d7e1133bc44d33bdb87c38cddedf83bb849e83436e4c92a06546fcf3e24ce6cc89d2e97a48aff2c7e3703da1b167a112f662a89742355e11e131e41052f1b379753cfa32cb0efa3a07465a258c585cd68c86bc9a473f5262c86c50992aeccbb9725b69ea8b3a7ebd2b6a24db52dc\nA = 60463fae1e9354559160d55a453c12d75775a53d1606d1fd16bef7e4ad1c78f9568954112f9280c46781180951534c5372dd5aaff3f33ac9c2e0ce4934d7009aad2ab5d6a5e5a141a36846e8925c7a28d116c68fb78aa9a687ec9bef173c1b69e0d7261f96eacacf237e1fe5874e5d553985b0fe7692ce8f2a5feab9ad9a2ad9c4bbf050b73b8030ebc36b94af8c6ecb67f8c94607d80cf600efd4ce4aa006f9b1832da8a1fdf8a564be0b4369149e8639e1714\nB = 15bfc50290b771ad147695a4c6701c47f2e8aec0657a4ef999eb45685200981b0ab5f8abc143d64878b85e9548651a1afd0913e3b14d11d3a26ab9793596801662a67b0062fdc8888feb029266f71d170518b6a4a040f59996bd4f257f221e830d0faaa9688aaa6afbc1f9b40d25097eab9d71d80aabc085f3a07e48bcfb37119aa00de60be55fd07d5b1281adf7b98bb589cdf2026252edf2f075ee176e23afa6b1f924c9fcf3c34c76752e833278a2e6b62017b88b77eece5\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 8b506c9bfb75ab7ab420ae6c9b371ef035fab512188d9df76f0b31831573b44cb08266186a04d20cc761d61b6df3e33ecb86c269205c2c79ae6aa4d3ebacac8ec71d9bce1d7ab146530b131c9038041c6ce8152a6f1c09b9bec8eea4462dda0f08d75edf296eacbcefd62a0c197ed30f799343268bf6edfee4995958db7e0420\nA = 11c16713fbf8bc9696782cb5a88174cddbe68a04e8fe93dd074aab33dcd85f92baa178b2f3b8817be0cecb802cfd3ebb06734c9d399a1f090e3a8a2110aebbba0e920427bcda74bf11700b945985bd532286d44a1a615cf7c501412e454edd647f8371cb8149474557a0d47cbb782f460de7a3cc28991491ea0fc510286711b882987b09341c079565414f2c930e7c3c3a3e3e0f1d786260a7f45c70e0fa20dfc63849906af61707cfdf5a9b7a4291a1c1586d16b8\nB = -cf5638af39c6da3757a09a92e0bd54f852742682dc91c71dcdc6e72f7825a0979a1ead2e158479ce5565d22472dc3853e6bf7ba43296a5e0e0a355f0703cecc02ec79da83e3e9de10a6eccb858dedf7d4c400c27486a5b8cb34d787cde6a5fd271e83a6cf66057838fe30db1f30663cdfc22ef5d002b0b5a05831228ea200f95382a58d0d8aba36523d9b5cb7506f193131916f3ab66ac9552c26cd0c2ab1c449eaeb8fde752f4f3c3f9b060cc1f8a1e37c4fe5ec306674b66158\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 347706abeb168205cef9b0b8c6b9d6449ac501af7dfbdfbd41a20a6a47872cbd7d4cd32f7b0805ecf1573d534418b7cce98181e079d5061b02639fdf0161cea5314dbbb2ef39ec841f695281f3c7de45f33664e0dd1658f645adc1dd225f781a3fb1634517c556403587b2aecd56dceca9ec19b930cead2b1d303aa056d28bc7\nA = -5e1c869e5dbcc684c245d5c69093bfeaadf388cbf928d33a8ae2148a2b5145937e4f654c5f6a36de1124bad1de8bcc9067fe1f9a44fc6ffe55ce7ed5cd0dbb6337b0e1e96bac1eb2a3606dd97b0bdb975ea59448be50191cc7ea36481ca9fc85c1c3e1c97378dbcd6b355622046888df2ab3d18d805f4d31d464f62a8e630e955beeeb5e00c70242b8f8df708705abbeb95dea3561756298b5f3f7fe16e965294eeeea4546f5e8bacf9d6b4f2136d2e206a87dad1f47\nB = 70225f0cadd328be36ece2172c836405db3fe80ef99ec74fca25406b73a537adf5073f2b550abfc4c0fcc2c2850dace0da9a266768cb4d5ff7fc6c1c248ad74f47592101b61ef96c1302924381abbd96cf49f50c44bf7e0551721a8ae85abdf9925548d13b8c5d1a27be8a40d0f43eec3136bc3035057b75aea779b4262cc66e6bc68da93c218f1920979291105d4b02117d66deb92c3e511aa588b27130202acc9f69521957f79c7e731bbd5461552b9b6b24240dd71ac449be9777\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = a2cb238f326d47f95869e2dcb295eba819a443dcc7c2785461389b58327742702f4c86e47af129f1fd4611cda93631f9333c358a29121d58286333083d13e66f30a9533b77ba3e26089e7eff7baf19bef8054af4e24735525908864ea9c4756b42a69c897003cab7b63cfd9a5927ed562e29845308eb2a55e7f8f03c87a5b7ce\nA = -1aa7ae6f56c38b654b281525b9da953ef366c2b9cffd3042105ed428dc7e5f2f2d53ef90b468bb471753606cc7a3775d86bcd2f4d5119cdde3c487cd39bf31752c5ba297e529c1b8121487e0e1de702156d0166ccaf51888a24fe7b48624eefaec855e2200929c21858676ec9bf4ceed0a832b69efd5065af544e49a3d209b85a77b0953652cbf0aa897527c52c9a98de9ae4c827f762e251478c88d410123625ea52b3478b52f6b9987d42009ae427763357ab53195772\nB = -226630b6fcdb5e274a25066ae2ca2c803549dbb935a97c0d7f6ab2c971d74cf6acd265c9d6815a6b2dd23dcb3c23b390fe8b1bed92b8c64c76c0ce62d5e7ddd7ce445bab0ca905dcfd0f128e5f4ffe966f3903d7ff1c61fe174e373cfe35a6d83249ec40b4a354d46fa1c90682efe468e895ea3da710838c262e8a47752dc6e7a79fe20051f51180173b58e0aa37b22eb8efee5b6dc264459ce4d135f430cb15afbf8c53f0de894bd2aca1f7ea32b4209a22a075f7b3b18e86f778a9e47\nM = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48\n\nModMul = 9ea62ef634\nA = 55cc58c9d8\nB = 6b49179821\nM = f753311ac9\n\nModMul = e9ab3a2aa60edd30108\nA = 5134a36c2bad180dd5bf\nB = 2ba6485656d041690666\nM = 9b9cc4409e86c8b0fbbf\n\nModMul = 621f9b797e866028b7bd1ff828bf29\nA = a202338dffe171c99434d84f3\nB = fb71eee7045b3e3ab5dd809dd\nM = b3e6e8d53b7249df670e3c59c55d33\n\nModMul = 808d463d06b7b7f98e3cb2783e2196c349d62672\nA = c669426a92d3cb5b316e2b5b9\nB = ccaea3874008dcc92450d8b2f\nM = b04dd2bb325baed1940cd000e8cb2d786009ccd5\n\nModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0\nA = c3255cb24a813e27c3dc410f0\nB = b144f39e7c2d33605ba7bee16\nM = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077\n\nModMul = 6124d7d171\nA = 235b938139\nB = 3a56a22a28\nM = 83eb4af4e5\n\nModMul = 9c006f56095d442ba98c\nA = 207e14237c42e3764e5e\nB = 8a495a26872432fa8e33\nM = d0cf2b8ae5c67d6736b9\n\nModMul = 97387cfaef652932a230c82de59cac\nA = 82ae0fc5e943af5bb8c4adebb\nB = db1279be12d59ba3a9c036a61\nM = aa36dc1d13390169cd54d711eb511b\n\nModMul = 32ee73c98da657464c6fed4274df20b099689e00\nA = 9baf08248ee24bcb17714e420\nB = a7f0428147bfe098666180749\nM = ce0bc198331c9ed1d21f0d498326e8185d3d602d\n\nModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34\nA = b36249e259b303e453757721c\nB = f0c1db50670d92abd93bdc84b\nM = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9\n\nModMul = 2663b741ff\nA = 58c8e7f7f6\nB = c84681fc87\nM = e0a50dcb45\n\nModMul = 21af3c0b42328f41b81e\nA =",
+    " 1f79f5b5bf78c9700d\nB = 5bd1734ba0f0e59c2a25\nM = 9ff3fdfb5c089244f327\n\nModMul = cbc280b5106c2c36cb31ad7e7c986c\nA = cadf6482b769e83ce7f7277dd\nB = f9862a06da1a9c89547b76c61\nM = cc36144c88139ce921d2fd1740bc4b\n\nModMul = 3813f2fabe016e19fd8e70687ff473651a5fbb4b\nA = 9c51a5bacb5d9f055a9ac2962\nB = bfed5625b21b4e82d1f105a0b\nM = a47977acad7c5deeb683ccd265cb30cb193f22a9\n\nModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478\nA = 997c4a7b537d9500d73a205a4\nB = c679ce666af284a459ae5a26e\nM = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9\n\nModMul = 1a90c92fdb\nA = 94fa7bb475\nB = 564b0a3339\nM = a1501bdc75\n\nModMul = 5e7ae5470686bad7996a\nA = c725797912c6c5f30d94\nB = 3a7f4c99ee3f5fa9582c\nM = cc50c8b7408f09a74973\n\nModMul = 72a15b13bcd1b63747342a6be8f0f2\nA = c33357af48a2df569e3c11ce6\nB = a4b4c5c14d7796adab54b6cae\nM = e22a0fdca62a37f4c8a61c96a429b9\n\nModMul = 31e179bfbf65b0695dde36a4fb72d131830dcdd6\nA = ce8d3adab8cbf15c332c0b289\nB = 9333f94eeb7d7a86b82becc51\nM = a532a76bd5cff409b580d54d12ef75ad8179b381\n\nModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14\nA = 9a2b56a54bd0727ab4be57ff2\nB = edf1781b4296567990773005a\nM = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1\n\nModMul = 917bcdb402\nA = 55c7dbd314\nB = 997b29ef79\nM = af5b4cbd0f\n\nModMul = 660c4bb2b771f523a4fd\nA = 43fe52461d5139620a11\nB = 1f8ec4b67de1db54ddda\nM = d0458e215b7e6903d96f\n\nModMul = 7aeff02c143e4426fcbcf32bd1277b\nA = a2671586369a990dde7829f36\nB = c7ff67937c900daccc0ab1d8c\nM = 8ad9c1d4d3cce681d1ae27c27982df\n\nModMul = 4b153d57433f0f7276674d3484e9bd0d25227d07\nA = aea36cf51dd2ce06c66b7a407\nB = 80c9fe5bb0afd2bf8b3644f96\nM = 8cc22a67ed7e5a7a2322aaa09ec2be94998494f9\n\nModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0\nA = f67636b03821c8f13f21217a5\nB = 8473a29f4ae33f36a0d2c6dc0\nM = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5\n\nModMul = 17fe4644a2\nA = 912611576f\nB = 7a10d36b80\nM = c5fa605133\n\nModMul = 8159b23d4fd697b4fd35\nA = be2d646e76494439e60\nB = 60fa770d05ebc69772b2\nM = a6e7c940cd749925a85b\n\nModMul = 7c412dad5c9fff91357bf181caf2bf\nA = 80f476ed5acae75b34ed54c52\nB = fb818e2bdab3b5f4bd84db3d0\nM = d0339f7ee41337d8462d1a9c207d1d\n\nModMul = 70432c749da4ade2c38237545ebfe6c4c6a92f6b\nA = ee9c92de52210e61adaa6eb4a\nB = 8ab55a85b1abab62d33e75fe3\nM = cd3faa6de4cb62fece4c3f94492d457834a6a041\n\nModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28\nA = bd162c90bed25e84dd5b6b77c\nB = d887ee03020c5df356f091db6\nM = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f\n\nModMul = 958951bd0f\nA = 12bd0d3375\nB = 668bb65b4e\nM = 9c617dfaad\n\nModMul = 8a109ebc9cbf86613e43\nA = a3e7019f1bbc35689a77\nB = 3189ecd3fd4ffd0229ef\nM = ddadc50600dff2abc1af\n\nModMul = 2b4d9f85a398c852b3a0cc82524619\nA = c244fd157267f707319ba6c6d\nB = 8a07018a748992429bbdbf326\nM = bf3813fb54f749ea5627f59ce30e07\n\nModMul = 28cab7d574e6dc56a6a622f8a7523cbb8dcc5e0f\nA = c9909dcfd3a59a3cfa538b267\nB = 8bbf89cd5a4e24adc2d8c646b\nM = c8f02682b9d480ea98faaca53b747ced33ed0419\n\nModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a\nA = 8019266c548982a520ab48eff\nB = d33c3e3b13576dcdb3ffaa796\nM = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1\n\nModMul = 3eaa4c99fd\nA = 6fc42faa85\nB = dd0b4e318e\nM = fd7f22301b\n\nModMul = 56b6b811ced3433755cb\nA = 145573d17cb0c996c69\nB = 9d3297d5ccc184896822\nM = dcfb3b383506239e83e1\n\nModMul = 34315b6bc6d3690c28060485ae331f\nA = b963a26973894cfb42fcb2d22\nB = e8523304bbcdff1a0ed4141bb\nM = d7a379aeac7d8cf94f19e7924d35d1\n\nModMul = 2ec9466e8b3357496f07e37ba24d36a237883846\nA = a75f3904e564997695b6707eb\nB = f9f47bd779834dc1f5fba0654\nM = b3ae5abed45d09c4dc5abcadc3ac9abebe1949ed\n\nModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044\nA = a38eceb9c551f0e69a544072c\nB = d5f8e7c2d534b2b8985bfd213\nM = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7\n\nModMul = 172f2e2e22\nA = 1584ff1055\nB = 2e0aee014d\nM = b904cb0bc9\n\nModMul = 122c10d3200270b9eaa1\nA = 86fd189e62a6dc1e4ba0\nB = 5235635f7b0336f5f235\nM = c93da97d0e95fb63dc4d\n\nModMul = 3e461e10ac4eb749512097fbf76616\nA = cf4ce10cbca07164f3812f89c\nB = b7e4639c233fbb0f923fb5104\nM = 949647857e1406871593fad5c30101\n\nModMul = 88117b59d9fed79dd6aaf083ee938215a995a221\nA = 94c888795567d434123d441a7\nB = c60ca79e61a352e34e0f78bee\nM = d2553a7c5dccd639a3927697a2e1af03845f2f25\n\nModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c\nA = c170eaddca5295d6ec6272dc2\nB = f94a5685ced7661df2efbd34e\nM = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd\n\nModMul = 1110cdbe5b\nA = 5db02b38f3\nB = 3369537903\nM = a8863f7979\n\nModMul = 90fcc5f3a346d3d4ea4c\nA = b93373680ea0feeb31d8\nB = 37f9dfaf0e180be64bd5\nM = d595cc29237d1c19e2db\n\nModMul = 8623a9997e514cf3c1d06c33c14053\nA = b396f5ede6212f1fdfc7e7b77\nB = 81a1ddc18306f2d2e84030148\nM = a6be32a91b34857842255ef8b1aafd\n\nModMul = 63f8f0254df06356f5cab8941b77619ad58025ed\nA = 806b2627b08d987438f920bae\nB = 83297039f4aa8efc1a185fea3\nM = bb8a7e7c19be02c25cf5682a0eee655fcd5b69a5\n\nModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438\nA = 930b04224bc097ac1d8bae8be\nB = b79496a80e45212c4663e5b64\nM = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1\n\nModMul = cd93b5b8b1\nA = 47a51b2d5a\nB = 86d6ba5155\nM = efb0ad3643\n\nModMul = 2037821ea789118bde0a\nA = a92215dcae19be637ff\nB = 93b9a3664a406737958f\nM = 9df360b69ed26f610253\n\nModMul = 3bf11785d28ceb668dc55b870faf7b\nA = bc8758854dc48e057cb6210de\nB = f03ca689620a77ecd8a6f0de3\nM = f3ff0747d6e5f34a0ba4200f579259\n\nModMul = 7b30b44f75ed12f54136858ce4fe77d00e0952cf\nA = 993cd09f3e46423a8ba2053df\nB = feabee384158032dd013dc08d\nM = cd0b21388cb2033b1e792ec4078334df70b6c8f9\n\nModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650\nA = 90e5d18b017118177ffb080da\nB = f8e7e09032574f6c66e623ec8\nM = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11\n\nModMul = 8fcd412054\nA = 2e7f9b1a\nB = 6283de2c9a\nM = 9bff560ae7\n\nModMul = 57d0d3b79f1e2f3632fc\nA = 2f8cc403de5af54cfa39\nB = 3b798c3ead52878dfb2f\nM = 805e6cbde400d4b4bc9b\n\nModMul = 23331614e88633af879201f568c359\nA = f21f19da4b20980979a645dac\nB = ea752050b79883dcd69222536\nM = aed3faf4c88f7c4afe257c5ed90599\n\nModMul = 56dcf9ae1c787e773774df3c8762babb4675a212\nA = 9accf901fa599da05fa6ab5ff\nB = f7f6b9b1d7bae06237532e39f\nM = b5bcd776bb2eb0805ade3c8b47e883962d3cbdf5\n\nModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0\nA = 8e57680f213d088ff1a1e7db3\nB = afebecc9943b0093f87022940\nM = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb\n\nModMul = 143ae78a29\nA = 334abb952a\nB = 74203e7a50\nM = c9535a9505\n\nModMul = 897a2b57e69f5a1469ea\nA = 1ec8ca0ea4fed52bdbbf\nB = 3a6273cab05e478a57b8\nM = dcb33163a8ea42c1ae6d\n\nModMul = 4a2c10e90e2d37111db79a44d3e31b\nA = a90e7bbd63fc4af6de83029ee\nB = cf09c3dd50b41afc7045e057b\nM = 8ab85d47e4270116a64f97dc4f0f15\n\nModMul = 70f94276c9d85fd3f71edfaad6051456f754da85\nA = fa3e9ff6e1aa1fb78e51711cb\nB = b115ed197c50b7ec4040ca255\nM = ad63f69ef1346e7549ba71c13b24b279f53bc9bd\n\nModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac\nA = fc41a9ce06e882942f751be7a\nB = 881c05a51d1ba8134d126a48e\nM = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f\n\nModMul = 4e0051898a\nA = 2a06523f70\nB = 651b5044f0\nM = 9da4eb09b5\n\nModMul = cc8274c88d6affc3742f\nA = 9ccf0133f9628532f4f6\nB = c1d80907057be7a67b01\nM = d6e76e362da831f32685\n\nModMul = 568f15bed5c4405be9dd04673a9c46\nA = dd6029c3196feb6da7f0f4a48\nB = a5f6745f2cb64913d1d3236d8\nM = f62f02c9b9ca8993e3be9a02b444bf\n\nModMul = a629452d5ed19df040eca26eaca37d82c0fb1d8f\nA = 963c51a9415b03e85ccb09f25\nB = b1cffe333afe44311cb968ffe\nM = ab2128698d498e8d75455033cfbbf4487535773f\n\nModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf\nA = c3b33f391e78bee97ceddf313\nB = a9136f3af450fdeb245eff425\nM = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35\n\nModMul = 8735bd486d\nA = 563e15c52a\nB = 31293264e1\nM = 92f4b193df\n\nModMul = a541f69ca163b288dd0e\nA = a608b48c1dcaa18424b2\nB = 891b0b296e911068b00c\nM = d4140921f4b2c84f1eb1\n\nModMul = adc1b7cf65967b013d046866b4ed9d\nA = e97941448f65060cf63ecd486\nB = ca68936f76cb87a8fbdd37311\nM = ebbca2482fb82eeca2866057cf1179\n\nModMul = 44aa9f0dd58d4510a7364e130698b34eda23a632\nA = c11f83f01bb964ffac93a2e30\nB = e05ee40eea39f4538d735193d\nM = b5e8b511738979dc740a6a1f7291cf4561787be7\n\nModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a\nA = acff8da571e1c96810bf95707\nB = cdd23e5504cc26d0c34a62b06\nM = f38902a99190ae0b5ef26849a6e943",
+    "d651925666fea271fee7\n\nModMul = 193f453197\nA = 8cb3078675\nB = a8fb003a87\nM = b60ff22f4b\n\nModMul = 849c26c8cf5cae426a80\nA = 5d1e3d2b4d038a0a34be\nB = 34f70325565bf0523314\nM = cbc189f9a732cad8f425\n\nModMul = 9a4e64ff530c53a4c6c5b6b5021920\nA = f53b81723cf74f520a61e614e\nB = 9d8ac2e6b839143fdd079a2ff\nM = a115375435151798f3644bede9d863\n\nModMul = aac303a4623e80158af1cb3331965cc8e3184edd\nA = cce0a88606ff962fdc37e72c9\nB = 9840a500a2051625c517104db\nM = b99dafdbd91ec3c05791031df5e193c03d6a441d\n\nModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf\nA = e6f48c027284856aaf3b96425\nB = b4c326f72a6a22fd4b93ba5b3\nM = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab\n\nModMul = 8b0929adbf\nA = 61fdf77ac0\nB = 8892f05400\nM = f12b3766eb\n\nModMul = 91b57f353307b173679d\nA = 33f8e73752072b4b5cfa\nB = b4c730f79f4f2c07945d\nM = d41be1d8d2e5753e3ae9\n\nModMul = af04c564adfeb120bc4770bc8c650c\nA = af151333b3d4cd1d29fd801db\nB = 9ccaac44ff91be11b30bdcdd0\nM = e0bd6e70d5f5ce08fbbfd48d43101f\n\nModMul = 1b8d623796a5065d9e993a53a9587a0fdbea1bbd\nA = a2fd08df2d4eab0cd6d29e213\nB = 92c9d26ae7c215b52199ee28b\nM = cd529f4cfa46f3bd3e7fadf167fdc02f6f881da3\n\nModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd\nA = 855f941d085305725da617f5d\nB = 8f09b7d2c36e0340523da5421\nM = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b\n\nModMul = 2d278e089\nA = 59d20a1716\nB = 8e2a58bc75\nM = b3d61ef699\n\nModMul = 2f937ce359d0f6cedd1\nA = 1019d11d26040ffd5b1d\nB = 7cdb6252087423d43e08\nM = e8f537323004447e669f\n\nModMul = 6567332e25af83089f7458786ab0ca\nA = bf9565e9f8a098894447b58fb\nB = fc867626f268c24cc0ab7bf8b\nM = 930f39183353363dcd822933a438ef\n\nModMul = 3692e73ad1d91ddc19cad3808eba2c5fc88e2bf9\nA = d0a42ce512629f0ffd233a9aa\nB = 97f6d3c4c655c7353a62d6ac4\nM = eac2ea84851f880214b8f40f881a2e56a6ba6f2d\n\nModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58\nA = c237eb242c40960861c938c08\nB = ab2f481f0d768eebd90d2574b\nM = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f\n\nModMul = c952f9aef\nA = 81973bbcb3\nB = 28ddee3bf7\nM = c4a40993c9\n\nModMul = 241dd53d93f7bdbbb2ee\nA = 2136eda4495c45c9f96c\nB = e74c4baa8ca3f6b7cd5b\nM = fff4594e7a5f0a1d3e15\n\nModMul = 5f861ed8b0aa835761613e6c869cfd\nA = bfc5c1572086079f5f5d18d1b\nB = 95902e14923c8010b7e905178\nM = a819c6c109d623f9b845aa23712c9b\n\nModMul = 5b8ab089c4e4c6804e48a2bc1d218718b3a32598\nA = fbe65d3852224a812c432672a\nB = d57a3f38da966d2471d70a048\nM = b9e6a626d3ad026d14248fc90c882bedd64a1f13\n\nModMul = 761438baf5b02dc095b7040e082da7b167c2b9ace956284ed\nA = fd91701ed2151f8e994bf4ee1\nB = 88b66e735b76972bccd9db182\nM = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55\n\nModMul = cb743c97a1\nA = 9c69ca9b60\nB = 7488f48f5\nM = d67040ed0d\n\nModMul = 931b2bee1bc30725a31\nA = 650f567b544ce02303d4\nB = 5858da30dd1fae88a675\nM = 91ce30234bb29fb9e833\n\nModMul = 5b4f262cec958a20390b5e568ccdaf\nA = f7e240e8a077e8e87506db2f1\nB = f8653fe64e3bd414782f51634\nM = fdb8225eefc1620648737d31dfe1f7\n\nModMul = 4c011d1ddfa30c901793cc6ce74db47584cebbd1\nA = eda8e9a9ea3cdae17bd50b1b4\nB = 992e8ef4a45593e4ceff67876\nM = 95e2f120cfcefbada1058af6c8853cbebedd5763\n\nModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466\nA = ca6c51ba2f410d09bf71d60fe\nB = 8bdfa8fe5ef3b2ad02bc63c4d\nM = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb\n\nModMul = 536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d\nA = 9b474b6f7d7f11dfbeb7a0724694f2daf9ccbaf2ec13269b5ae3329e8df95f7833baa68324509dcddfb5afa1d14f2dafc55e2c225475f16fb396beecc7a66dee\nB = d74a5081f00af2361c3537642c06cd47aae7e366741c9b4785e185af8b328acf3e2ed71e3b9a4b6fd49d956eef76740b3c6ec5850a90e7e444dfeaa7214c5eca\nM = 5efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb\n\nModMul = 6161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634\nA = e7d6b74a1af0834aaf93e09a6488340b661449ba2bbc73d775e7d828163813ddbcd82719351879a6d67ab6b518011e1db43a3d620d1f24403917691d15ed6f90\nB = 3ecc8fd3103fe52a7e73ec4be4e60b69584bd886a030f017b482bde9d4b0b964ba8471cb32b3e9bd49864d9028a22d6b6b46be0451bb4222c3987b74a509f8fc\nM = 7c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59\n\nModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76\nA = c221d1f0d1b7efe7e078dd01bed773f8876fa324b3fe91985d47d343e7f3878b457dae2f9ae68971245278a1d23cb541c56b94dd9ac43a9fbe28a46efc627651\nB = 49f94c19ff7ce990637c3d2019ed66f7e6dbb1442b04a4593cc480521b991cb1b878f8c31903240f89e34336d9e6785433617e729b71adcbef622a683357e035\nM = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb\n\nModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540\nA = 3fbabe2d65f443e7db0a6f332330ecc4d1d40e14fcb510499552020405cafcf10a50a5ee47cf60fd8c22a22b3f753b4167c213851f32109babe4b5c298d6c4cf\nB = 62e5b0f887dcb1f1794bae7dad46a066f810cf5f82a1eea99207b5f0fb0ae9084c5e62cc97b2672b1cf4cc1400a19bdcb093c97404876b584a6482931e7ba9b7\nM = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7\n\nModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db\nA = 7e1fd0bd9ab0aa75b264475604aea09f24239f94847ce2549d43b71890c0549938d167adebc7890d3c492b5874da7bf18d895ccaf1803b9776820598928b407c\nB = 5e54e5185bc86f16177f1354a57d36ac2980def141b389e4bfda134fae7c158009ccc61ef66281905128b6297f876662104ead2315024f129c56eaa387f80b4d\nM = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401\n\nModMul = 145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4\nA = a195e4315caa8cc0707063c7359c28139d4dfffb57eb726156336e13227ad9766ea1fc99152893ebb194fecfc153d47cb927a633217328f05e4d8782aeb89d04\nB = a97ae97dc7e9a224cab94ecedc08d0cbf7a012dc5209b1e1e8b5b843fcf61e65db3457d6085545a633be47b742e8237cc716357ff5bce9b00e23671ec1d049a8\nM = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1\n\nModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658\nA = e6b97c11ad44fd451d168d65d1691d2220db8c3b6c8436d59f4c1366aac52558d0d6b61f5d6966460a4a31085fac711e5a09af5563d938963555d4730982eb0\nB = 6805eab5a4da534f07def6d2c320a6cbdfe4831fc2163dfcef740607b3181d8647bfae8f8c16237c1c1c5d14b9e3417132f81b3a7db4b7fc11927aab30dca590\nM = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227\n\nModMul = dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764\nA = 7fd3310af09a67e0684dcd8e3b4b651c7c13c2f6a0a47b59a7f5cd8bd80854d1d4fe02eaa61843d6bb2b87f99d8ec4842864681eaf056538ffff610c231e1d\nB = 15f1661c59ee9f93400073e18a91503a93d47537d2da5cf5e4bc69ccc87b07bed171a95f1c5eaa9c7d7ab207ab3f1f7634c5d16e706969e869364207f61d84bf\nM = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab\n\nModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2\nA = 8e3abb1f24e1f91496db99be9409f57f67cfb6e0e33d603a2a31e1309f1d0bbdc413c3e4fbb5e3d923f683afa9942b9b9fad6a6e558b2297889fff47ccef7d23\nB = dbdf5940dcd68127d476badbd5a2f3018aa4d8db79f81337ddfcb108637110b934e946d3284ec09d5255605ad72424f1894238ee4f7964dffc27fad838532321\nM = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93\n\nModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764\nA = 5137697bf48982edd869e4a42f3cb858bf65ad5b25d1c0e8b75d054460d0944ecb5a6924721c5728964d84231c7ae808f556837aefb23fe3ad36aec9f5f60f20\nB = c79554304620f8116b9a8bb56f6a23620e9fd504f7163f732e1e6367d25c6ff98cb01d16faf3e018dec6a067d1204a6aa95470598ce757bcfbc3ab4f5d8ec88\nM = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735\n\nModMul = 985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233\nA = 908bff40440aaeee6c90b6312dc017c3bdae884a9074e02b26f01be1f018390e01f0d111f99a06c16e20538df8000d4066cd4bb3628da88a3a5cc240cfac719f\nB = 6ebfe9fe53909876784f9d6e5dcca4cfa9463fbd8426c5bb8890ae84c2fad119615fe1e1f2ee5fa544a5ac713ed1da8c1e04f282f1f1b9fba4b4c4bd9db20538\nM = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793\n\nModMul = 133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4\nA = afb695e3e40347f60a500e01fba4df1c1f2fd4ed79e3f65913d82369f79d80db6b3978e6351c70c148f572b9c0c2b1efeefa605251b3156d9b66d240467e550f\nB = 8855046dcf50f80f278227d5260b9be53ca2e4a1cfe1afce4d35b11d0fa17a36a8bee8126e13bbb318d476becad5a935e9d160fa481e1437b292bdc169dc7d45\nM = 3eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47\n\nModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41",
+    "dee9\nA = bc2baf0153a4598f6b5f488c43b2546cadfaca2c1931b919f98ba71835a8fe78886da1fea25b194e60ed6f9e0ad23c988b64af9278155c1722dcf4983a1566c2\nB = d8374d91fd3c523ecdd6bdd265c9a8958dd222f9f0e25454fd683bd86d7900a273b56f1f47e033c46527e32c721094ce6bc927d25fac05d7fa6db4d7a6773c94\nM = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3\n\nModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9\nA = efed8e442154b1eb6c75775cc23e01fa65c9c361e222da123d07daad3039f305e7102edff23b65c333f0caae4f7929857c3169f4ae47c9f0fd920c38eb42bf2f\nB = db05415ea90269a74b0919ff772c148c0eeb2ff9dea76a6e73e82eb86bc76fb42308b55ef83a769a91d23b7840d5d2f5129f15279dfab7cd8d63778acf202f26\nM = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479\n\nModMul = 40b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d\nA = 6500f3cf686eec4e1f243616ac0ea8e8d11ddbade490b86baf231e7b2fd55968ee14b6bb7badf8c898874099831976af46bcbfbfaea10d49aa803c6e51238e2\nB = 1fac744fa1e26e789639e049679d0e2eb57336279f09555e10210e7143199a3df5fbf5294edc386ac762fa3a3b0b4bc28945adf21a8af747a29018bf76d3710a\nM = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1\n\nModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113\nA = c4a5737a9496129a136753f8c2e52bbd2660f2d3fafe4ed702900b01c14e506d13e3bbeab19b357e5ba9fce8a4fc3dcc469406a16248d6fb53862781fd9d55e4\nB = 444e5a673eeb37fd3b4f6b6f5133b0f46c2ea532e1953da4a0e144407a8e2534c5ff40cc9af7756e5aff9df57d938fcedaffb868dcf4e458b36f506ed7fe0ce5\nM = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817\n\nModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855\nA = 4351965a421c75c5b4c251861e53316a300ed7983e27e17f9308420f0d2cb11e9c476294fcd9042a525bc1a044bb442d1d9f853c9e07245170e0e2711010cd1c\nB = 4e1046647c362c8f9c414be54075b4e9d151c6fa0c3da40d90e6042625947ca2c9f20cfbcfdab8666dac5a15f6cda9d47b09f654131fc5addc07e382c9639323\nM = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7\n\nModMul = 4452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6\nA = 9fd1cc81981bff977244c044146918057ad06d3cc26edfb8fb4118ee02b959d45555f9507ffeb23c3688e29ccdfe5f583fa3761f6727573542bee8ab5f5b600d\nB = 856e6a03b5c93fc19deea51b3bfe42c810c5bcf9ffbd08e2625eb209baf6a4e24943a3c090d89c1f70aea9f0128e511fe92e03715d917168c1e1ca77a3a8731f\nM = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b\n\nModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2\nA = add40f1dd6d4a2414b17f0c628eed9a8f082f3ad1f34ec41935fa86b34d4505b22ea80c062386a9ed63f95c67e55c686f837bddf8f4da791f98b08c02f32d4b2\nB = dab1caaa11d5a208b7a6b7a1d6482a4859daaba5e3a77b1b1020e8ae62a664953dfddd0b47d40526e7a3c6a5363c6d41dd9f529fd8b58d5d31bb67e745cb71b3\nM = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955\n\nModMul = 36fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df\nA = 52ee1498bd6a1677db801ae2eab4951345a1fcf8fe7d38e3f28dbc27fae508d87c9958e02a375ff4891b88ee916b96331e7cc082615faa028f6d541b5ce37876\nB = 9343cfa074f50c20e8472f8f7c4a7d330aa30ee417ed8027a4c956e84cc5cb31d5411c14796d9325fceef79a51b5d8a4c89182ca273ab633e6a7b22a27352300\nM = 9d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9\n\nModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad\nA = 19616a82b75b08499d4b1f869df2db8f71398672f3f97ffc6177a4a5aa913605ce8a6ab5f778cac508f0b3f2aa680b01ccdc57c0fdd6cd678a2ff2dcd7f01f3c\nB = a5643a9a9fe3be4134082daae4ee7dfd85d9452beee856fd939d3be9788b6bebcf3571c67ec481ff9b20f70d23e82e2171b1d0ddf0a9435b40115d32aedb6811\nM = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937\n\nModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6\nA = 8e6cd7639b7c134b53e6ae6ac5f51268da83ed09e8e96d65e4bb130dcdbbab9e48226ddba6efe93faa510bde8ee92f2a641774c4272b5a2f88024b77a2cfa110\nB = fe4e8109a49b16b96871e384564cc096277dad4e1bbca8e5feb33f140a4fb800c8f3096b1bc7042bccf249aede88e6055c0db609f94e214b1251eda494be724b\nM = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025\n\nModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d\nA = b0fd7a936b0908ba6fa797e4b855d673ff85d665ef3a345e560e2c0049becf5c25b6c0068dd617ab47a8fd151939ea0631f86806ddd40e557933c0e880fcdd0b\nB = 105c87fe2b1bf0be5405ca0d530beda1780f0045e892d7810f8a8abbe890f0a19de66497cba55bf38e190c52992467c22a320c38a4bd167f774ed812f1271d5a\nM = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335\n\nModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66\nA = 2aa4a0a73df11f4e60956619d0b35eaef45730d619f9b920298e6d369b9861f6411de28a34af038f288d7a3d6a35b10c8082b8ad0fb275a8f67c6832ac46ba9\nB = fae1d50b72feb25da2581829409391bf289cd9f730c99d265b5b2d63889381cde4adbf85c3998c2478f2866526b8f64605d75765edd09b78ea45337207d173\nM = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1\n\nModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995\nA = b0a0f9d05d144d2ef257c1e63a7127a3b8e0d8b64ff8f6447618560593574b5c5da6258b274efc28da0defd988bef1efca0f481f809665a78954b36741d668bd\nB = 10901b9dbf0016cbcc671da75a75b7a6ec6a66dd17b53a97344864b08f037098537380bfb0137b6becfc36a75206686d16bc4eb8fd54299494374e3f383d9b10\nM = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9\n\nModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c\nA = a7714b249eb0f0cbe3e6fa0b04e895fcf14c404876197defafc6b57026ae7e5e993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b\nB = b7278ecd154ef5243ad973ead291ea186acb63e09977e644a6a9fde195d1a33993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b\nM = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09\n\nModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688\nA = 2b65f491caf0b5cd9c66c859fbcadaec7213e6b848884638791b1620d6e4bc9dde087af0e7329d3b15a45df2d43ebde61b053ad7f63917aa922d58b4f3222620\nB = c1bfcdb34b0766be980540dc3256b9ee4158310fad2c43cf24bfafca08ee185647043f5842a9d9eda224449259341b7c50998086434528d47661bf5762a7ab5f\nM = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9\n\nModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15\nA = a3d8b12a2c8f4021ca045a4e4903687dea63ee7e88893b1911aea77efbff00f8f5c7884cbafc71f59fa2636195c2ebee61edbf642923f34d87ba5eb49b06a7ee\nB = 3231829c81b26dcac432b502ce22e126ab564922b1e9818cd3da46edc5ce7df026d0e515809c97bcfdb9666581efbfd364437ba9959dfad099f90472f97c69ec\nM = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9\n\nModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244\nA = e4ba620125f58a63fe12fbd3eccdea477d56b120c76d5d1421bebd74e8686b4093f8169070453ccc04b63b173568385313a1d9c841a4aa82a61cb84d4286a941\nB = e87aaa990307855f8e5f2e5509d2ce31dd4b13bb7199cf5fa0593e350326e222efc33a26c69245565d6ebb5a484cfef7d2558f22dea8054d07831d536803d0dd\nM = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897\n\nModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6\nA = bd64b1db27fa7da4c92a4ee092f58a2a53ed0f12d009fe13b36d5fd585defe778fafea4a60e8fe567d03e9ba3b72b189e22504ae8ca6aad7c2ac0f44abca2f6\nB = b487d8116198560d6c5b08c7ce63b0acc0c98e6f2a8d709cf4e3a409edd55f64d72fc27a70dc341e280ff5a1b09fe131773d466cb31991d2db23a2a86d225c80\nM = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923\n\nModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385\nA = 4181ee3bf9a98bcd49eaea243a179cddbf160981efc720685c7be1dfeb5aa552685a2cd46f340e1e1da893b3b460692fa2eaf6c100f24a14f239e45123242d53\nB = 77cd04d86dd5da322af78be54246dd6b7af490d903db1db03cbccde535570b81c6053a84110c07f097540ffe7510320024b7bafb77e9e239761def76092e1d59\nM = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5\n\nModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f\nA = 1c08cec52d96136fbd9078b7b8db36ab63b86e19dd3dba7b2e3190ff566180e89dfee9423fa4e99be2187eda6aedfa86b9a45eb1e4655257315ae6a280f0a6ee\nB = a8b4bc9647d8df9b7c76cc6d0f2248cdbc41f5da9c061f9864aa8415c9557582cada456cf23cc32d47d1fc1caf19d36b398019aac4734e10f55ce3cad419e5e7\nM = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed\n\n# Regression tests for CVE-2016-7055.\n\nModMul = ccd6f75b5f24b7c5ce2ce75",
+    "5fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9\nA = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nB = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81\nM = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf\n\nModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9\nA = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81\nB = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nM = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf\n\n\n# ModSquare tests.\n#\n# These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M.\n\n# Regression test for CVE-2017-3732.\nModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001\nA = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff\n\n# Regression test for CVE-2017-3736.\nModSquare = fe06fe0b06160c09\nA = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc\n# A in Montgomery form is fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffeadbcfc4dae7fff908e92820306b9544d954000000006c000000000000000000000000000000000000000000000000000000000000000000ff030202fffff8ffebdbcfc4dae7fff908e92820306b9544d954000000006c000000ff0302030000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fc00ff02ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fcfdfcffffffffff000000000000000000ff0302030000000000ffffffffffffffffff00fcfdfdff030202ff00000000ffffffffffffffffff00fcfdfcffffffffff\nM = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff\n\n\n# ModExp tests.\n#\n# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M.\n\nModExp = 00\nA = -01\nE = 01\nM = 01\n\nModExp = 01\nA = -02\nE = 01\nM = 03\n\nModExp = 01\nA = -01\nE = 02\nM = 03\n\nModExp = 01\nA = -02\nE = 02\nM = 03\n\nModExp = 00\nA = -03\nE = 02\nM = 03\n\nModExp = 02\nA = -04\nE = 01\nM = 03\n\nModExp = 01\nA = -04\nE = 02\nM = 03\n\n# Regression test for carry propagation bug in sqr8x_reduction.\nModExp = 19324b647d967d644b3219\nA = 050505050505\nE = 02\nM = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# Cover the E = 0 case for small numbers.\nModExp = 01\nA = 86b49\nE = 00\nM = 30d26ecb\n\nModExp =",
+    " 00\nA = 00\nE = 00\nM = 01\n\nModExp = 208f8aa0\nA = 86b49\nE = 2\nM = 30d26ecb\n\nModExp = 27308229\nA = 17591bb\nE = 6\nM = 30d26ecb\n\nModExp = 2bdf498f\nA = 21292626\nE = d\nM = 30d26ecb\n\nModExp = 11317167\nA = 4a655df24\nE = 10\nM = 30d26ecb\n\nModExp = 2e1b88e\nA = da6b761a86\nE = 35\nM = 30d26ecb\n\nModExp = 20a12ec3\nA = ea811\nE = 2\nM = 23bc042f\n\nModExp = c42ced\nA = 1011a6a\nE = 4\nM = 23bc042f\n\nModExp = 4637d79\nA = 28d9a601\nE = 8\nM = 23bc042f\n\nModExp = 20e5669b\nA = 72fe6bc20\nE = 11\nM = 23bc042f\n\nModExp = 142ab9e3\nA = 9a07b9363c\nE = 29\nM = 23bc042f\n\nModExp = 14c64646\nA = 822df\nE = 3\nM = 30915765\n\nModExp = 160e35a2\nA = 15ea542\nE = 5\nM = 30915765\n\nModExp = 2f23a488\nA = 34d2e02e\nE = e\nM = 30915765\n\nModExp = 28e67f93\nA = 636a32703\nE = 14\nM = 30915765\n\nModExp = 29bfeaa5\nA = c8646998e6\nE = 2c\nM = 30915765\n\nModExp = 30959e22\nA = 81dad\nE = 3\nM = 326dd68d\n\nModExp = 1a1da4fa\nA = 116adb9\nE = 5\nM = 326dd68d\n\nModExp = 272bf0d8\nA = 2d21ef08\nE = 8\nM = 326dd68d\n\nModExp = 29f5054b\nA = 76989850a\nE = 16\nM = 326dd68d\n\nModExp = e6c7b77\nA = b88ee70d2a\nE = 3e\nM = 326dd68d\n\nModExp = 369605e1\nA = cf26f\nE = 2\nM = 3ce082eb\n\nModExp = 168a3c5d\nA = 1f82caf\nE = 5\nM = 3ce082eb\n\nModExp = 125c4bb8\nA = 2e9c4c07\nE = 9\nM = 3ce082eb\n\nModExp = 1c5fe761\nA = 523ab37f1\nE = 14\nM = 3ce082eb\n\nModExp = 21703009\nA = dc832165e8\nE = 20\nM = 3ce082eb\n\nModExp = 1228d1e\nA = a5555\nE = 3\nM = 24665b27\n\nModExp = 5226af4\nA = 1077bd6\nE = 4\nM = 24665b27\n\nModExp = 1b14eac1\nA = 2db3a834\nE = f\nM = 24665b27\n\nModExp = 161727bc\nA = 6bd962cb6\nE = 19\nM = 24665b27\n\nModExp = 10d61d0d\nA = c10caed407\nE = 28\nM = 24665b27\n\nModExp = 233da406\nA = b125f\nE = 3\nM = 33509981\n\nModExp = 24032799\nA = 1656b7c\nE = 6\nM = 33509981\n\nModExp = 129ecebe\nA = 2e671504\nE = a\nM = 33509981\n\nModExp = 20c20bac\nA = 4d7a2de44\nE = 1f\nM = 33509981\n\nModExp = 2e3ce9d3\nA = c53b3def4d\nE = 31\nM = 33509981\n\nModExp = 12fadfd6\nA = b4cf8\nE = 2\nM = 36e9d4ae\n\nModExp = 457ac85\nA = 1b1c7e9\nE = 7\nM = 36e9d4ae\n\nModExp = 31debef4\nA = 3a973028\nE = d\nM = 36e9d4ae\n\nModExp = 2333ad93\nA = 552b97c45\nE = 11\nM = 36e9d4ae\n\nModExp = 99ba1fb\nA = 8bfb949cbb\nE = 28\nM = 36e9d4ae\n\nModExp = 27b691de\nA = 93492\nE = 3\nM = 298fdb16\n\nModExp = 3c2b70f\nA = 14e7b0d\nE = 4\nM = 298fdb16\n\nModExp = 1486cda7\nA = 29acff81\nE = c\nM = 298fdb16\n\nModExp = 11725275\nA = 507489205\nE = 13\nM = 298fdb16\n\nModExp = 24d14627\nA = e71c55606d\nE = 35\nM = 298fdb16\n\nModExp = 222b8d14\nA = 9b1a0\nE = 3\nM = 3db59d12\n\nModExp = 3b8bd47d\nA = 13f4e8d\nE = 7\nM = 3db59d12\n\nModExp = 17e72356\nA = 334774ce\nE = a\nM = 3db59d12\n\nModExp = 306447ca\nA = 47079ddd2\nE = 12\nM = 3db59d12\n\nModExp = 90bef3b\nA = a75d62616d\nE = 37\nM = 3db59d12\n\nModExp = 1\nA = cddd44f47e84b3276cc36a5c0d742cc703e61c4756168601fbb1b6eb598c161019562344dd56ab6f603d920a12c360b285e6496a3605a2f8d691c3598233ee9366b5f2692554893bdeb67b7bdaf35ab7273ac593145e26bed82c70ba5793bf4bc5cac4c80b01785d1496beede493806e4f4aa89fd8d41de80dd6d0a3e2742678\nE = 0\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 0\nA = 0\nE = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 5150fb769d5c5d341aaf56639a7bcc77c415fe46439938a2190283409692f29cd080bfe3433005d98d24718a03a3553c8560c5e9c8ed0f53b8945eb18290e1c1a83d919302510f66dd89b58acc2de79ad54b8a30d3e1019d4d222556beefca0821b094ecf104b5e4cfce69d2d520d2abf54f3e393d25ed3d27e8c2e3ca2e5ff9\nA = ead8c5a451541c50cab74de530c89376d9a55c723e0cac3c84b25f0093c08a2961e49ab48966361c42c9f99111587252d98395b76788400d75c66ef208ea2767a28d6f8dc3a859f39c95765d57f139e7fc14f47c908c62df051e7216d379f52028843b4d82ef49133cce8fe671ae179423ac8da5be43b01caaf425cd969300cd\nE = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e\nM = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb\n\nModExp = 1\nA = 935561297d1d90255aef891e2e30aa09935409de3d4a5abc340ac9a9b7dce33e9f5ce407f3a67ec30e0dc30481070823f8542463e46828d9cafb672a506d6753688cbad3d2761079f770c726c0b957071a30876c4d448e884b647833befbcd6b582787bf769d63cf55e68c7b869a0b86374f8920516cf5d528f348b6057450a1\nE = 0\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = 0\nA = 0\nE = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0\nA = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d\nE = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d\nM = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061\n\nModExp = 1\nA = 9d92629c1ab181c50c31619e8acd0d235a1f5fc7a0bef4d4fd54b4f1968d45921f8522efe88e69c6c14c576c564592b9feb00d1554b88b038934eaf4a8ce81a2582732387490181ef158360c8b2d9ccb326ffe043f776a50cb8202837f08ca743b562eefa007150ab7012c341b16248478d4775c02ad71ea13d5e82b71e2d600\nE = 0\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 0\nA = 0\nE = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff\nA = a31618b",
+    "4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839\nE = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b\nM = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b\n\nModExp = 1\nA = a8558e7f455b27c0c46d7d0862eb409cdefbeca945e0284b5bf425b7ac0f3d316bc365594cc1639decffc621214d61479bc75135120d4ac09ea8b742ad7ec1822091b62b1c6f564fe5e2f4f5b7def92cbaaa9a898549207ab01b91c2324fbd306a87f7d6379b6fb6493c5fca76729767f136120da9c90bdc7d364f7d242d5acc\nE = 0\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 0\nA = 0\nE = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 292f0b39ca0f1c850b1a00cffd2d54924fcd5fc7e7504c9d593e6c0ff74760b1f4bdd81679fe06c50248336f3108c593fa111072ee87d0fcc89a63243a1dc89044503663eee9bc18f51c3e0193d9108303e12ac90ff78f6ec752a4386af09c42db524a7cbe9a3d4fcccd56c34d283bcc9debc17158b5fe8df0c1888a9841bf8f\nA = b4fde2908745ff92cc5826a27dcfdda09e8fffee681844fa4c7f1354d946d5d84e0e0c7a4a4cb20943d9c73dd707ca47d796945d6f6b55933b615e2c522f5dfc33e0652917b4809bab86f4fa56b32b746c177764895492d0a6a699812b2827fe701d40ef7effd78ea8efe1cac15ff74a295a09614bf04cae1a5017872ba22efe\nE = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f\nM = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f\n\nModExp = 1\nA = e2845c572b46496ac158a731f612fd40ef626fa7134755c25b1b7614f4d7b29164e6142ddb7985e4c7ebc575855ff901e95927fe98a5aea2ad3a4720c75782323bea1518b2c57790f44efd9411be4e95b3896bad1e73c59658290b309e5a7eb5ef8be08125063e57336b80f17eacee88966d12bbaaa15a25929c82e027cf696f\nE = 0\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = 0\nA = 0\nE = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = c90e4c69df92e26549b016950b59080947f5403430698e128477782480dd70be96bed2b9042dd8c708eb432e02710555b97af11ce6fa9b53395022851c32d1f53f04237fb0763563b440ca6e81a50d909d907d9c26b7d3c420dbf88f7dadd488666848135f8cdc608dcfb0691989289fb54379c2e84c262f9765f68c012ca1b9\nA = 882ea1b9b6c79a3b1bdfd284658cb6227ad825e0178cab713c7413c2ec34f03cfaec470c4f5c521f5e9899a2123878ff0f5b36a4196c08ad1b04d03746c4bfb5d126f5eefbfe172627d6732710a8ac8890cedbd4fdef69a19f2b3253a5aa0e5dd5484f72d59b17bdd1dad3db209a3ab839368ed3975069685911d7b35e41a9e6\nE = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4\nM = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d\n\nModExp = 1\nA = d7a99e65b8af86b1c51d851f0447e43cd4f343cb0ada7236283e69aa7ebd383826acc9809e5dbc4002d0f2430022cb026458189db3805ce2de1142a31ba71a6c064ab51f0059eb4b931b8bcbaef023c38d57aa5f3e14f5df77e547fc028702071b58bd57338be1e1e4f98d3553484e4de359cefa29c5f58d3fa5d823f389dbef\nE = 0\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 0\nA = 0\nE = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 186c50ae259aa0fd31859cbcfea534e626a254de33956d5d719334bb32e7cf37cf199a21f079a5b90497228994d05efe19ccd8c769cd81f896286e8ae557cacd1630a928c629ecdfece29ab3697794aa707734e007318fa7029b050bb09ebbe6986187c6ca843f55266d275620b3f0fec0ad5f847ce8b314d929d128b33a249e\nA = 9d5e345793faddca9867f23eeddf6816c1e837f7a2cf96fa077212514acb6be87ac01a237d8f2f1d07d27a8ddd1b0ae0d97e1bda4f205a89435017284cdedea3e407b1b940d6f52112b6359b3e86e4c83074b17c210ae2c8856b42b169b4a7a6dfa65b368a7959496cf9bb1ee93d019dbd79101830e3f5ed08604ab90890b914\nE = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e\nM = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d\n\nModExp = 1\nA = e6a079bdf7b0638d50b183475e9ddfd5cbdebfb29f5fae8e9be402a0bd36085737b556492ea7fb4b1000ae9ce59db66098129b757cfb29224275fdaa46b8b7eb18a93ca7d3e446dc38c734b683d7ba7927b008d993aab01f44239d3c76be76d1503908e9b5e73b36c43ae0771368b01f39c042693bd92c4fc50810f059e1b332\nE = 0\nM = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 0\nA = 0\nE = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929\nM = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec2",
+    "58c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 60719701a2dc0bcde281a93ce0b8421d1a718adee43c1b5d9fe9e697a48ab3db4f9f33c73cff305ab6b6c300c149b05c6b289dce4580860dc56bc59de81ac074ecebdc65aa3ca040b44e5b3c80ddba1658d78b9abbc4c77e5f171f5582e70ab4438a8e1e2f062d618c4ad09c70c73b5b5fbc9f8f0bbdf1d530a933b705f85af8\nA = e1b400cd3b1f2f1c6b437adfdb970d2c8108f1b39bdbb13582179552011c6c97cba6bff2c463212b7f62776aa3e3aff9f175990e79395e819c144350b0a23d61638d500ecc97726b098e1af334aece23a851c718612442c04eb7b3805a24cc8f5b90042145eb5e5d6a408092832b6bbeb8a621419a9282fb5c075f41c7f1fdc1\nE = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929\nM = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247\n\nModExp = 1\nA = 9dd1e6f2d3ff24096b54e0ebf0f10e283e484a1cbafc0431adda1296ed97692f3ba99440fd4f67c96dd8bab850e1123361c99362df9ea205ff8e90d1b329459f54730992d5a360e46fcc5f5a909e691abb9a06613d6991bd7c2aa609f0d7b441d7ded0c07b8c394327672d38a905efb2d76aa3be5bb14d0c002aa37e287aee79\nE = 0\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 0\nA = 0\nE = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 86fb0b8dc161c41de2adb0f3ddcc8ad49c1efd729a52793a3ac987d4011c9c1dadb18657dca718df75c8ddcc49d60f152c46ab85ae9076ee7bfd405679a7da3a5195a1bbfd7d2b998c7b135ea91f8c445cbafe1276fa502c2a85477716829a2e0d24ba02623405a3654bed8f355bc7ccdb67c3f9a01e249e358b60d7699498a9\nA = 816610e6018ca47074d55750dd16a281019dbf95dc752605794cbb8ea8d75775317ce685737859728320b529fb3b4414b40bf3a93d08d8994a21ae54682cc1c357eb529837a7b0129a0843eebd9341c9bee3a8ae30475bdbff517e885a0c9f2b6a680643bd981efb53bf9dd49f3dc3cb757e117895fb34b1b4336d9bf8384558\nE = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436\nM = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f\n\nModExp = 1\nA = 9edfce4691f46eadaa2043c7b1092b831ed50f3429f0bca02f985c0b77c686d951be84d772ae4b55f08935bed6e3206c8441574f215736b5c1c1b7595b3b789b55cf56db83741b10144d6767ba2b97b23a5e83504c60e06ab22834b0145655aa0463108317a379cbfc8a93de8a66925a999b8b02bf88dd85fb9898cefe9c95c8\nE = 0\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 0\nA = 0\nE = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 442866609915aa6f1bae9dfb59e721e1b63f42c0f75fbf0a88344120fbbd7aacf15208fb7c9d8bb8477d553cbd826d7e685ad764a8423e81c2131c040ee83a03cab8d5ce50866a941b48c78e9f1330794d908562d4141cfbf26e8c80c69551339eec41e37e2b37b54330f7bd75748f8d26d56ab9eb3b0c127540484c6445a7fa\nA = 8ff65e2cbcbcd8697cc3ce9a26855d6422ac7eb4e66500648c08be697e005cc3c854a54cfab91d43489cd60be8b516a9b3c9688e5e009a1689c6b164a133859a5464ef422c86344fef42cc477c9df27768377c126a066d1b62f593b7f6d6e906feaee16addb7cfbfc043d741b7dc81a87c17f167b7b8ef1b1fb3dfd1eb14102d\nE = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648\nM = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745\n\nModExp = 1\nA = fe9f77f7d0475e00ec964c0effb9b8e079c32e376ce77a9c40ce4018c3df44a77b4f294d9565502b2b79accb30cb58dda6d15e1543b6d4a53296543ed11c7f51baab60283ef03fae37dfeacb431392487ec2839551a933895c4dbf18844f7b375d3e6f558d3c39993cea1bbf7fb743a6a07bd3753c03eb7298811476d7f3ff1d\nE = 0\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\nModExp = 0\nA = 0\nE = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\nModExp = 91fd879d02f95a9f40fcd1037726f73892caf84e9b43b4aa4126d9062a0d22c464e7af2fbd91aa849612d99d9519b724a7fb1cb018fffdcff321d883ab2519953c9f174f09dd8f13ac87339887385966eb4a94842276637b2c36c0a5036b1d3bbea438bc6efd4b4851c7ec06879d60694df894717569bcd31c4b13d80df6cbca\nA = cdec5edc1cb3ea974342b85aabc0f9385cf877ca328747d40dd4d297623ad69ab6582653faeed5aef225208305135cfbee32e066cb43e18afacea3a32acc8aabbc49617ac33e741651924ae56dd6aa044a12a1ea50fef573b5befb2f4b21b9cf83ab2aaa6fd153580a0761666ade8fb94f202a3c3dc4f33297eabb4564374168\nE = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836\nM = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511\n\n# Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in\n# order to test the const time precomputation scattering/gathering.\n\nModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b\nA = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898\nE = a2c56ea1362511cac030191",
+    "8e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f\nM = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d\n\nModExp = a7f5844fa9e7202d4b70ee252c9846e63d3d091b0387768ded872cec53458e19df0d9b4960226e269b8ca5dd4c4eda423a67b6dbb48235c08c12c6c7c78db47287756d3ed9cecb9232f7d18d5d80b9676cb68ba4a290c97e220beb1a069976b5e6022a4c1e5ddbeec86b62dda24ffea1deda37695c9f61a8817218e6370c0679\nA = 7d6d0cc947ceb949cdc4e9e1044f5deca5bb05a491041e0d85bc4b92a0944a57c72845fad91e59010c61ad1712bd2f612d53a846a044632262a9f2e3373b062fde2484e0c165ff947f2469f743ab6e2e5e13c640fc4029b1c9213eb8473c674e7f9e95a4a5c5636d4656c1e696962340d77b322daba47d6fc894f2a2cd9e0afc\nE = b78012afe806e2344d004c739c97324256850980ac97d88c4ed9a838517639ca112e235978d21a176c33f5a68703aba0f2a05501bbe3fc8d49a000fbf530cdb431581dfaf8683cb15a2aee5e239cbc542827100da3b47babf4a16ca7c588aff9912e674abb449e0b767a15e415f4e7f2bbd6380d7131da3df8d49b13bfd35ce3\nM = b72d5c55bd2998472f1965e75a51be6155c1ba04656da8f66bcb34db36a7b1db66a89d1d05b1bde10206acf85be7b474ab689220faf1bb52ab39d8dc00512dd4e26df1179c11b973e1274db85a88c7cc2a17113abdffe58cb930ddc5f3ccc4d68b4e65c913730509f7ce5656e8bbaba9b1be177ab9f766678f018fea05da9cdf\n\nModExp = 465ff295786a88496828fdc763e9292d557957544e9322b7996807b87fdbfa7a11614bffeec557ca831c4824c8e4ca3b1a1c7f3f4f95ec3fd6a86b73bb13d78b73af2b3c7e76954d0cc03bcb0cd606867ebb3765a8b3d0108cbe4f343a14016be9c33f6d200f0dc547e7d6b02bfab1e79dcdf9c9835a814cc6c855a12ebeb66d\nA = 89ad02bea3e9ab839a6e23f20122409daba52c68e1e893034b30d321c0305434a6af940015e3fa5ca9c35230da34beeb1ed4fbce6c1da3a8bfe3f3ae172276c1d1723b47ee61e6f8fcfdafad102d6f7ee2a79f510c7edb93096205a40a6c9e665b88b18f39a979e2e61286d939952a6f02fe8148b7515bb25f4252337cb6e60d\nE = cbd6ac628cc7afa3c61bee9c22a06a395087ec1811fe9681b55216700c435996c815e7cec8aaa90016dd2382d0306a5414630124e14f3d396a4ba02ee17851bf720f1607ff813e4bbddf01338983db12f59bd6371a738eee3eeb716f21051d6174d2d6c77602942b9edaac18d4b3a723096c0d00dd23a8a605c585022f311560\nM = fa7a3e40364c8a8d0f14f0213a3f3e035222ca0ea19d46d10ba41580e5dd2805c8a133f3856d7d5d97f922ea540e5eb0d10ad04dfdbb74f518f58da0099a6fc2b3f3def92985176e07fc78aff2faebccca10a429794e5f15ff92f75fe90f527c60ddea8093a9078c703c372ca09f7aeb27ade02f3595308c61dd9c44e62fd101\n\nModExp = cf08bf00261402102e9fe03f3074471dcf0e9b3c96d4d1503f099f24ec85e1901b023e9e048c1ad042244f5f70b38b25a99f4c0a7b57d5844bb0d0137367f45f4ce2cc7746105b77414768cb97648dc5721149aed2d4c682408cc0d50d26dd0bd77e848911f8625c727cac5f32e63bcb548f41a57d718d772f23983a42f603bd\nA = a419646a6631c2c69b18f7aa65011825eb31692eecaee9d74f92d92203811b68e9764bda31a1585bdf69b6273fc6f9f508c395ac081336506525dad88473512f08a205621ac8b16e9864c7a7c5a4f17435de00d0b32badec6ce4897e3e1076c562b6d9523f63d0b2079eaa416cb090471657763f24931d955d1fa2720c80a9c9\nE = d5a6f4a1842aaee39805356dc8d0d678ee03b2c81277345beccb2742f899132feb43271f95968a01ae68aa8277201851992dc0aa7a71c90aae71b124d873ee264ea400fb131be0fc6c4ce8c04c45f6bdaca89ac743635caf6158983d257e21cef6800d7f990e912ba21bbfb8fb779afa4abd19e07e7e07eee9908493d1ca502c\nM = e739689b6cc6def1d45fb1a2ab551643beeb303f4aaa4da47ee5e4948510f8445b4c40e99ae8354dede60b2ba6694e93bc4d573b7e8adf871b7a9a9636eb7d70f2e49328e2d7978143b177cee8374ef01bd1ee2d95862765883f5e7971668b53ef0ff41b6539faf63c397522b0bdce916388e72e26c8d3d2e58dadeb9eb5d479\n\nModExp = 827e6312ec3b14600203bb83f5b277ded197b2967363630ef673240df05edd3ba8ab2b11c86251a612206569c6c33952b31e264f129909bfe723bd0ee1624b36cfcfaa893a6ec8b5a1f7de79f83e79b459a3350f89f412ad1cfd6bc4c2a7a29272c783d6ecceeb1398fa17041835643f4debef9b5e87b098d104bb8912dddf7c\nA = b8e49c637829021d32db3a39a0c1e58cdd4c6e4eda7e8e9293be379e9c2e2d184f929d278598a81ae231cfedcf69cce4a6e31cda3c8ac14d753a7311f2436e29795f0dfb60259a0f61a997918ff984aa2284b43a9d64c974059e9682adfffd018305835f74eda8c75fe4877d811c1620f654ec9f7f32d1af5ce59115e2f41785\nE = 80e0febf369d234bf1aaad4f82df2e2ff02882c3184781f6ccdf4f7cd93b6887af86830077c84dfb02109ada05b40970b1c65228b0c19030bd6361c3537fee22a8155c03b4e7007ca006c6daa3659518d05bb81ea0079456d0ef6116df248dffdb0c935f321f5a1034deefd5a9414a0652aa6548de33325b474b9e5a8507a082\nM = d5eb1d14af842a9973274f7463d90cf0ccff19c47d710edbae184478d4f29b02693ed7958bd487054327b9e6d8879e24c9af7730b92f323eeac05558da6c1b952e5dbf13de236050a77628bb5325fe0d14cc5773bf73338759d5ab43c212b414581280f1cee250007e53791b800b61c90de0328acd7bc43fbdda48158939392d\n\nModExp = 4a1efd29c7e78549f5cd4deed1454b37462c7810ee6a8a2493b764dfa479be13b314cf9ff98259517d61865567ef499a511630c0038c97914625df181c6fe07892f329f98b344a78d751e9471483eebaa7977371bf97bb25187ae7e93a9227d6c124ccb4644423c961a11ae59c4354f89d5a95164c23d9aa256e289e9cc0858e\nA = bd86c9211fa6a47a06e5016c46cb8a99e34a043a29e22f8c3196fa7197c26b38927b8d9bc0ddc11a5fa4bcc44deb69dbf37cbe7ebc9a2fad6c74e09ab5a9dd929fa04ab4319b6caad1035739be78ba631fb0748d9e53944836d37ccda6e6a62823c696d8f31139ccd7f2f86b22fa026ecf433cfb1271a3539ac4f1c83aaac059\nE = c40b9972006d28a84c2769a86e526a2b274f73afc7c5c6a2742166757f61b5f5fdbb228afa157af62af989ffe966f232bba9e6beef5403d1690ade31a6410f7f349a35bc4267a129afd647993df7d45cc0e1a1ba4678d7f1b6e8a344d8ff7037679e1f4db25a454e4246f6b55c416567fcfa188e8a3865115851d9edf0aa8902\nM = cf424d7af75ce7eef90cad75ae55ca8810cc7b4703fdb5bce701e7bac07e0c371cae06df2aa8facb55a0faa6793e4d2bd9d7969703743b9be170be82792aeea55e2bc0f7ab7617b276486bf474dee2f4556aab595ff3ef115139cfe5e21ccd4ee05c0e1cf901bd85df86cc17195a783b0be836d00bee82ce064077f9191188f9\n\nModExp = 3137a3049fd4ad2e26d870f5c998cf11bfe82101884a82e85e43facd0928cd7434a2e346ca124619769fa141bbe92ad6f36b99231032ddaec3b349a410f82b5ca36f45e56e5fb85dc63d32053dc90805d3f1854ab385281a71a57726bf97158494e7476057214ca7379ab8b70f5bdc15f70bdad3adf33c3a1f9cd1b6bbbad556\nA = 39a1dc6a4c3f14d9c350ee968d5ce139ef725952c967a2d1bedf48ace22091283525be03807e2e263d2640be77f0525247bcd07149bba50568cec5a082c87d72962cf9e43bcb5cdb1e7e9a650fb53e0ec2fad37f09a9f036c0d7dfa528fef846769f80a9a60854910ca1b4ee05dba82ed2ee018348d6b3e52a764b8ffae61e0\nE = deaee3a3f80c9f684ed7110c0653847ccc7be5ff6d982fd4b49f59b5dd35f7210b1077babbcedbc127df35cd469dc6e569a0f84e58149b5605c94b09fd7f0b098d02b4a04631328b3fae39e6c2fce25334225cab71829abdb9507cb903701559660f2c08c3b743336119d1260a0db27054cad3f28bc1b04b2289baa58fb33965\nM = 938388927d06ed3bb1286c0f06d3054cb0ee16dc7a0bbbf13a45293c09a5f40f1d611b2e1a1b0ec2ef109b508e27af4274954905cae52034f8740a744153b4d22059f0dd262ea51785522098ecacced6da07709ee6b5acc8c4e99331379a7c3de7f4e2d1431e43b19570140955b7bcba118dfbaa552cbfa2be531e8f781166ed\n\nModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510\nA = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83\nE = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693\nM = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11\n\nModExp = 75c3f79ab7c991b98e65505342a8a563cfb08b5d3ccf8664c7db1de50256b1d17ebf7096dc98c7bb5d7f027a894ae5cbb14dee04d5d445e775ad7e239acc82673b0ac2d819a69c83864f34e73d9a636f05de8279619a067b4c90ad038db5910447e03841d2034635018f08cbcd21efa00994247763a249082594128112f95232\nA = 34def7d76f6f158a359fd12759fb889cdf6af0a24830dc3e84283a1ab4e9b2647a6a36b86482f",
+    "829b2cdf3e3d6028f9a884b1f64f7262315446bea8b0231828e2f3d990fb103c17f820b39e4b8427c85643ceeca8f5dc8f191d1255768300e859bd7d88c770319ef38269660d221cb3bc061389b6fc0783485ef042b1c7d6fef\nE = c6c46453dd5aac6b37277a446b1d0c69cbe476eeff55b3ac35edb89ba97116b0e7783660f2c7b31b2a2d6c4709d0ab45d01a838100694b0777c9c9c14c959b07c437c73a5eabb7402f1001e802d797a2e7707285834fb6440a1c2f727f7bb84ddb2a49312d32fa0ce620c43872655cb5c394749c9e75d7fa25be00efe50d47d6\nM = fbbab6698a9142095c46b38a732592e4366c1838b84bf40f8c8fc7b630f73380a0d09765562365798f8c8030ed1b6728329d8bb06e882c35a1d59bfe84146a9db2afe42a414014e247390281c782fce806d62adb54778d2bcb49555459429d6ed446af5359657667f6aa19e8e3e0e24ab2bc312b2d90b5cb1ce6f2f15af15d9d\n\nModExp = ba16d7f3f6e162ce248490d164a13c00e7720d8a667e2d3ebeb13f1663e15ef5408d5b56cbc7bc793a8ca787cc50f8e15e0e9d4ee764531d04a9114eea556bb3e206ed7d85267151a056b6e68fbf35e03f2cf829708ffe1de13e95ecfe365aff1eea36340ffcd3892dee659fb1ecbe50f5080e54737c10f9c1ba638b14ef537e\nA = 9025e6183706105e948b1b0edf922f9011b9e11887d70adb00b26f272b9e76a38f3099084d9cccf12d04b1a99c0f654f8b9ed90c6dff9478c60bf05d58d734ab60eaefa14a22230ec60c90dc1f0704b61eef0bef345785ae0e6a9af7db069cf6bd2b4e0fe58a0ade83c7e46a04b9fe1d24cb9b65c6f80de713e61d70eae5b286\nE = d7e6df5d755284929b986cd9b61c9c2c8843f24c711fbdbae1a468edcae159400943725570726cdc92b3ea94f9f206729516fdda83e31d815b0c7720e7598a91d992273e3bd8ac413b441d8f1dfe5aa7c3bf3ef573adc38292676217467731e6cf440a59611b8110af88d3e62f60209b513b01fbb69a097458ad02096b5e38f0\nM = e4e784aa1fa88625a43ba0185a153a929663920be7fe674a4d33c943d3b898cff051482e7050a070cede53be5e89f31515772c7aea637576f99f82708f89d9e244f6ad3a24a02cbe5c0ff7bcf2dad5491f53db7c3f2698a7c41b44f086652f17bb05fe4c5c0a92433c34086b49d7e1825b28bab6c5a9bd0bc95b53d659afa0d7\n\n# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb.\n# OpenSSL's test vectors do not include the expected value, so ModExp was\n# computed with Python 3.\nModExp = ccb051a34f9e26e381e50445632cbbd4abe56bc912020f3edd2db144aedb470095c4c33e3342d1dc4bb4056ba3078366af4cee507e85bb1b2e499ef25a933810f14faa8b1a9ce5e8d58f2789e27c887a4ff87fa59ff682727a3912a99aae6db8b3b8947d76c8454cffc6fb3f2422dca106c3845b0db68a06e5e9d7b90e552506579d812e7d96bfc6324feec90ea0800463346148f120e7caf403788539f5d87ee45aa5b313c340e0a323029f3a0bdb675510aefec171c01e2a94960cd507e461214028c86ed4e9fce31e7dbdf1a75fd6f973e2aed4a039e53a60a7aa62be8ee1f80a113833ab402d07e17151021cec29fa5b2e628ef9f2d7aa4bc86b6eec8faf\nA = 95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b58f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad9852d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300eda021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465\nE = f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d312cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a55df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a47bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5\nM = fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f19009503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bcc633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280cb7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b\n\n# The following inputs trigger an edge case between Montgomery reduction and the\n# \"almost\" reduction variant from https://eprint.iacr.org/2011/239\n\nModExp = 00\nA = 19c7bc9b97c6083cd7b8d1cd001452c9b67983247169c6532047eb7fc8933014dbf69fee7a358769f1429802c8ea89d4f9ca6ba6f368fbdb1fa5717b4a00\nE = bbc7e09147408571050e8d0c634682c5863b7e8a573626648902cff12e590c74f5a23ecce39732266bc15b8afbd6c48a48c83fbdc33947515cc0b6e4fb98ae2cd730e58f951fec8be7e2e3c74f4506c7fd7e29bdb28675fe8a59789ab1148e931a2ebd2d36f78bc241682a3d8083d8ff538858cd240c5a693936e5a391dc9d77118062a3f868c058440a4192267faaaba91112f45eee5842060febbf9353a6d3e7f7996573209136a5506062ea23d74067f08c613f3ff74bade25f8c3368e6dba84eae672eac11be1137fc514924fcab8c82e46d092bd047dcbadaa48c67a096ec1a04f392a8511e6acbad9954949b703e71ff837337b594055ae6f3c0fc154447a687c9ac8a2cdfd64a2e680c6ff21254735af7f5eb6b43f0bce86bda55a04143a991711081435ed4f4a89b23fc3a588022b7a8543db4bf5c8ac93603367c750ff2191f59a716340fab49bb7544759c8d846465eec1438e76395f73e7b5e945f31f1b87fefa854a0d208846eaab5fa27144fd039911608bab0eaee80f1d3553dfa2d9ba95268479b97a059613660df5ad79796e0b272244aca90ccc13449ec15c206eeed7b60405a4c5cfdf5da5d136c27fa9385d810ad198dfe794ffce9955e10520efea1e2eb794e379401b9affd863b9566ce941c4726755574a1b1946acf0090bfb93f37dd55f524485bbba7fa84b53addfde01ae1de9c57fe50d4b708dd0fa45d02af398b3d05c6d17f84c11e9aacdbe0b146cad6ddbd877731e26a17f3ebed459560d12ed7a6abc2ea6fe922e69d2622ef11b6b245b9ba8f0940faaa671a4beb727be5393a94dafaeff7221b29183e7418f4c5bb95a6a586c93dbc8ce0236d9dbe26c40513611b4141fed66599adbfb20fc30e09a4815e4159f65a6708f34584a7a77b3843941cd61a6917dcc3d07a3dfb5a2cb108bacea7e782f2111b4d22ecaaeff469ecd0da371df1ac5e9bf6df6ccba2d3a9f393d597499eaca2c206bfb81c3426c5fe45bcf16e38aecd246a319a1f37041c638b75a4839517e43a6d01bee7d85eaeedbce13cd15699d3ee42c7414cfed576590e4fb6ddb6edd3e1957efaf039bfe8b9dc75869b1f93abff15cae8b234161070fa3542303c2ed35ca66083d0ac299b81182317a2a3985269602b1fa1e822fcbda48e686d80b273f06b0a702ca7f42cbbbd2fc2b3601422c8bff6302eda3c61b293049636002649b16f3c1f0be2b6599d66493a4497cd795b10a2ab8220fafad24fa90e1bfcf39ecce337e705695c7a224bf9f445a287d6aab221341659ca4be7861f6ac4c9d33dac811e6\nM = 519b6e57781d40d897ec0c1b648d195526726b295438c9a70928ac25979563d72db91c8c42298a33b572edecdf40904c68a23337aa5341b56e92b0da5041\n\n# To fully exercise BN_mod_exp_mont_consttime codepaths, we generate inputs at\n# different bitwidths. rsaz-avx2.pl only runs at 1024-bit moduli, and\n# x86_64-mont5.pl unrolls 8 64-bit words at a time, so we want to capture both\n# multiples of 512- and non-multiples. Also include moduli that are not quite a\n# full word.\n\n# 512-bit\nModExp = 00\nA = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 8f42c9e9e351ba9b32ab0cf69da43f4acf7028d19cff6e5059ea0e3fcc97c97f36a31470044737d4c0c933ac441ecb29e32c81401523afdac7de9c3fd8493c97\n\n# 1024-bit\nModExp = 00\nA = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 9da8dc26fdf4d2e49833b240ee552beb7a6e251caa91bfb5d6cafaf8ed9461877fda8f6ac299036d35806bc1ae7872e54eaac1ec6bee6d02c6621a9cf8883b3abc33c49b3e601203e0e86ef8f0562412cc689ee2670704583909ca6d7774c9f9f9f4d77d37fedef9cb51d207cb629ec02fa03b526fd6594bfa8f2da71238a0b7\n\n# 1025-bit\nModExp = 00\nA = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011\nE = fffffffffffffffffffffffffffffffffffffffffffffff",
+    "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 010223abfdda02e84e11cec8ee7fc784fa135733935f7b9054bb70f1f06d234d76dcf3beed55c7f39e955dc1fef2b65009240fd02f7a1b27a78fc2867144bf666efb929856db9f671c356c4c67a068a70fe83c52eebda03668872fd270d0794f0771d217fb6b93b12529a944f7f0496a9158757c55b8ee14f803f1d2d887e2f561\n\n# 1088-bit\nModExp = 00\nA = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = e91f6d748773cb212a23aa348125615123b1800c9ea222c9374c757702ae4140fa333790ed8f6bf60a1d7dda65c2767cc5f33e32e333d19fbfb5a2b85795757c9ca070268763a618e9d33873d28a89bf88acd209efbb15b80cd33b92a6b3a682e1c91782fc24fb86ddff4f809219c977b54b99359094bbcc51dfe17b992ab24b74a17950ad754281\n\n# 1472-bit\nModExp = 00\nA = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = a8770362f4bfe4fc1ab0e52705c11a9b6ba235d5a5f22197c2d68e27ed18426ede3316af706aa79bcf943dbd51459eb15ae1f9386216b3f3a847f94440a65b97659bc5ba2adb67173714ecaa886c0b926d7a64ea45576f9d2171784ce7e801724d5b0abfd93357d538ea7ad3ad89a74f4660bdb66dfb5f684dcf00402e3cdf0ab58afd867c943c8f47b80268a789456aa7c50a619dd2f9f5e3f74b5d810f0f8dadbf4ad5b917cdcb156c4c132611c8b3b035118a9e03551f\n\n# 1536-bit\nModExp = 00\nA = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 878cd000778f927b2f1a4b8bac86efd282079a7ac0d25e09ffd2f72fbc282e65e233929d2457c7b1d63c56fb706cdfa04fb87e654c578c98d7cf59c2293dc5641086b68db4867105981daaf147a0ee91f6932ef064deae4142c19e58d50c0686f0eaf778be72450f89a98b4680bbc5ffab942195e44dd20616150fd1deca058068ca31ab2f861e99082588f17a2025bf5e536150142fca3187a259c791fc721430f24d7e338f8dc02e693a7e694d42775e80f7f7c03600b6ae86b4aba2b0e991\n\n# 2048-bit\nModExp = 00\nA = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 9f40a7535c561208ecb38e17c9336d9bc8484d335901b2cd42759cf03689227f6992f10cb6b586d767fbcdf30e9d82a0eda60d2694ccd0194fa96b50b56e0cdeec1951ea9e58b07e334a7f108841a0ab28256917fecea561388807ed124a17386a7a7b501f9cbf3404247a76948d0561e48137d3f9669e36f175731796aeaf78851f7d866917f661422186a4814aa35c066b5a90b9cfc918af769a9f0bb30c12581027df64ac328a0f07dbd20adb704479f6d0f233a131828c71bab19c3c34795ea4fb68aa632c6f688e5b3b84413c9031d8dc251003a590dec0dd09bfa6109ed4570701439b6f265b84ac2170c317357b5fbe5535e2bbdd93c1aacfdaa28c85\n\n# 3072-bit\nModExp = 00\nA = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = c23dfd244a58a668d514498a705c8f8f548311b24f0f98b023d2d33632534c2ae948d6641d41fd7a29fbbd594bfc7fdd6e8162cbb3056af3075347b6fc8876458d33a9d0ffdbcdf482de0c73d1310fd8fa8f9f92dd0dbb0e2034e98a30f6c11b482f7476c5b593f673a322b1130daa4314e9074270dce1076436f0d56cf196afcbb235a9a7b3ac85b9062e85fc0e63a12c468c787019f6805f9faab64fc6a0babc80785d88740243f11366bffb40ccbe8b2bb7a99a2c8238a6f656bb0117d7b2602aa400f4d77de5f93c673f13264ca70de949454e3e3f261993c1aa427e8ef4f507af744f71f3b4aaf3c981d44cc1bfb1eb1151168762b242b740573df698e500d99612e17dc760f7b3bf7c235e39e81ad7edbe6c07dbb8b139745bb394d61cb799bcafec5de074932b0b2d74797e779ac8d81f63a2b2e9baa229dfaa7f90f34ffade1d2ad022a3407d35eb2d7477c6ae8ad100f6e95c05b4f947c1fabfb11a17add384e6b4cd3a02fd9b43f46805c6c74e366b74aa3b766be7a5fbbd67fa81\n\n# 4096-bit\nModExp = 00\nA = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+    "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nM = 8030411ecbddcb0fe4e76fd6b5bf542e8b015d1610cf96130ded12ba2cda0641bd9692080f218ea8b0d751845b519d95b843542ec8d2a07f1f93afe3189b69a4f35c983011c7f7928c3df458cc3eae85c36e6934a4b1bc0a67c8a521de336642c49e10a7ffa8d0af911aacc19e3900449161940f139220e099a150dcaf0ff96ffff6e726c1ac139969103cf6a828ac3adf0301506aa02787b4f570d5dde53a34acab8fec6fa94760abf16ee99954371ad65a6e899daab87b95811d069404991de9abe064ebbddf886e970f10d260c899dda940191a82d4c8bd36651363aff5493f4f59e700007dcadf37ebea7fcfd7600d16617ffea0d9ae659446d851d93c564e50e558f734c894d735fa273770703dab62844d9f01badf632f3d14a00f739c022c9be95f54e9cea46ec6da7cb11f4602e06962951c48204726b7f120ddbd0eb3566dc8d1e6f195a9196e96db33322d088b43aecffe9b4df182dd016aca0bd14f1c56cd1a18b89165c027029862b09ffd78e92ab614349c4fd67f49cb12cd33d0728930d0538bda57acef1365a73cc8fbac7d463b9e3c3bae0bb6224b080cdb8b5cd47d546d53111fdc22b7ff679bcfe27192920ee163b2be337d8cccc93b4de7d2d31934b9c0e97af291dcc1135b4a473bd37114eec3ba75c411887b57799d3188e7353f33a4d31735ebfc9fcfc044985148dd96da3876a5ab7ea7a404b411\n\n\n# RSAZ 512-bit.\n#\n# These are regression tests for code which historically reached the RSAZ-512\n# code. That has since been removed, but the test vectors remain. Note that the\n# lengths of the inputs, especially the *bit* length of |M|, matter a lot.\n\n# Control: No relationship between A and M except that A < M and they're the same number of limbs.\nModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4\nA = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# Same as above except A is negative.\nModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd\nA = -8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A.\nModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nA = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# Same inputs as above except A is negative. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 1\nA = -f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 0\nA = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\nE =  be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n# A is negative, and A (mod M) is the right length for RSAZ.\nModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25\nA = -80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nE =   be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1\nM =  f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491\n\n\n# RSAZ 1024-bit.\n# Note that the lengths of the inputs, especially the *bit* length of |M|, matter a lot.\n\n# Control: No relationship between A and M except that A < M and they're the same number of limbs.\nModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7\nA = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8\nE = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575\nM = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7\n\n# Same as above except A is negative.\nModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10\nA = -21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8\nE = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6",
+    "ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575\nM = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7\n\n# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A.\nModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nA =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# Same inputs as above except A is negative. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 1\nA =  -b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a \"correct top\" isn't the right length for RSAZ.\nModExp = 0\nA =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# A is negative, and A (mod M) is the right length for RSAZ.\nModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d\nA =  -8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nE = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103\nM =  b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965\n\n# Regression test for CVE-2017-3738.\nModExp = d360792bd8210786607817c3dda64cc38c8d0f25569597cb1f363c7919a0c3587baff01a2283edaeb04fc288ac0ab3f279b2a89ffcb452d8bdf72422a9f9780f4aa702dc964cf033149d3a339883062cab8564aebdbfac0bf68985e522c6fe545b346044690c525ca85d3f4eb3e3c25cdf541545afc84a309e9b1d7807003461\nA = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020df\nE = 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020FF2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020ff\n\n# Test vectors for CVE-2019-1551. (We do not carry the assembly file with the\n# bug, but we use the test vectors anyway.)\n\n# Original test vectors by OSS-Fuzz.\nModExp = 9d675d188a07e9bd1b32638cc8cfd5002ef89bd1a9648f806567b87939140a67977dc8da17323b8e4c6bc53875cda8b656df8f54cc32e44fd9c21d122ea3c0d6\nA = dea9b3e0b44ae67b2ac9b7c2b18eeb4dab206b014981a46ac409f195eeb6896f132cf8497c87d1188008ee511054ebb426203355b7d515dce9501cb759ac1373\nE = b01ae745b101e9e45ec05dcff72e7f8fc04c79ffe324301fda0b4f7be81d85c4e875c73fc6c5cb40000000000000000000000000000000000\nM = ffffffff01ffffffffffffffffffffffffffe2000000000000000000000000000010fab8d960706cd4c21818115650cad61d4f10da325dffffffff00ffff00ff\n\nModExp = 651f811b62ee8770e3598c340864dd6b0be9bb6376b6f933ab216fd55538e6ad1000cb2b3c64f54d554e004b6eec8138e6ecff00452d443a42041b72e6cd9ead\nA = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e\nE = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e09003e3e3e3e3e3e3e3e3e3e3e3e3e3e010900230a01230a2100ffffff0000adf300a58700000000ffffff00\nM = ffffff0b00000000000000000000000000ffffffff0000ffffffff00000a0000000a00000000000000000000ffffffff000000000000ffffffffffff000000ff\n\n# Test vectors for rsaz_512_sqr bug, with rcx/rbx=1\n\n# between first and second iteration\nModExp = 1\nA = 624e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d973b6\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between second and third iteration\nModExp = 1\nA = 11024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000f\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between third and fourth iteration\nModExp = 1\nA = 4171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d9736080000000000000000000000000000039\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fourth",
+    " and fifth iteration\nModExp = 1\nA = 6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000006\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fifth and sixth iteration\nModExp = 1\nA = 44e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000000000000000000003c\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between sixth and seventh iteration\nModExp = 1\nA = 1024e6a171024e6a14ce297f2873536f959d8c3390d973608000000000000000000000000000000000000000000000000000000000000000000000000000000e\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between seventh and eighth iteration\nModExp = 1\nA = 626eee5e3c8653be47ed15e84b97cc7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187\nE = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8\nM = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9\n\n# Test vectors for rsaz_512_srq bug, with rcx/rbx=2\n\n# between first and second iteration\nModExp = 1\nA = 3c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf7c\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between second and third iteration\nModExp = 1\nA = 485c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000003f\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between third and forth iteration\nModExp = 1\nA = 59a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000004e\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between forth and fifth iteration\nModExp = 1\nA = 2939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000000000000000000000000000000000000024\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between fifth and sixth iteration\nModExp = 1\nA = 640939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000000000000000000000000000000000000057\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between sixth and seventh iteration\nModExp = 1\nA = 25c40939a85c4093995e8efdb195e8efd8caf477ed8caf4780000000000000000000000000000000000000000000000000000000000000000000000000000021\nE = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e\nM = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f\n\n# between seventh and eighth iteration\nModExp = 1\nA = 7b4919849931b28a14fcace213f2b3884fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b6e67b66ce4d9c\nE = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004c\nM = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004d\n\n\n# Exp tests.\n#\n# These test vectors satisfy A ^ E = Exp.\n\nExp = aa6d7ac431\nA = d0e07\nE = 2\n\nExp = 12d416b110dbb4e467ff0c89a22122f4da8240\nA = 1a18cf6\nE = 6\n\nExp = 49a3b33e23d84f1ce0d5d83f5dcb651d50cf3920f0143da2310d0512a90a06cd8f38977df8a756c30883de38df092000\nA = 2a3acbd2\nE = d\n\nExp = 5b4a0d5a956f885f275712b194459980f24708bfb6393d71bd37dce852ce455724f5ee5030775fb86b4295edc98afaafc097e4d82a97c0078ec0eac763db16549c5145c4cf2d3124f88cf9a5c71da0625afb99b26801786fe49a778415dc025954021753d08691947a208b613f0be5c1\nA = 54b3ae461\nE = 1a\n\nExp = a0ea5f6a4de49beb8fb7f0dab280d6a32c5a3814c9a5153a7944cec0a9028497846a8a89044348721a0bb5f0c3ded3e980574ea321b0cdb0ead4f4e93841ea7478a7f15d9729b646a8165813a0750e8124f5465dda9b105e1bbeff18fd09c09a2e26610d9176d253b877c3a8908a6be521cbe1e472a7a1b7820e4e890f8f28aacd34609c686e76e15b01bd9324a71290812724ea564d11c874a6765b262c3e57d479da0287a76026a1e8fe53da0b02405da1d379eaa30fc65f\nA = fccec0f6df\nE = 25\n\n\n# ModSqrt tests.\n#\n# These test vectors satisfy ModSqrt * ModSqrt = A (mod P) with P a prime.\n# ModSqrt is in [0, (P-1)/2].\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = 1\nP = 2\n\nModSqrt = 1\nA = -1\nP = 2\n\nModSqrt = 1\nA = -1\nP = 2\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = -3\nP = 3\n\nModSqrt = 0\nA = -3\nP = 3\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = 0\nP = 3\n\nModSqrt = 0\nA = 0\nP = 5\n\nModSqrt = 1\nA = -4\nP = 5\n\nModSqrt = 0\nA = -5\nP = 5\n\nModSqrt = 2\nA = 4\nP = 5\n\nModSqrt = 0\nA = -5\nP = 5\n\nModSqrt = 3\nA = -5\nP = 7\n\nModSqrt = 0\nA = 0\nP = 7\n\nModSqrt = 0\nA = 0\nP = 7\n\nModSqrt = 2\nA = 4\nP = 7\n\nModSqrt = 3\nA = -5\nP = 7\n\nModSqrt = 4\nA = 10\nP = b\n\nModSqrt = 0\nA = 0\nP = b\n\nModSqrt = 3\nA = -2\nP = b\n\nModSqrt = 3\nA = -2\nP = b\n\nModSqrt = 2\nA = 4\nP = b\n\nModSqrt = 2\nA = 1e\nP = d\n\nModSqrt = 2\nA = 1e\nP = d\n\nModSqrt = 0\nA = -d\nP = d\n\nModSqrt = 0\nA = -d\nP = d\n\nModSqrt = 3\nA = 9\nP = d\n\nModSqrt = 8\nA = d\nP = 11\n\nModSqrt = 6\nA = df\nP = 11\n\nModSqrt = 4\nA = 10\nP = 11\n\nModSqrt = 5\nA = 90\nP = 11\n\nModSqrt = 3\nA = 80\nP = 11\n\nModSqrt = 9\nA = -e\nP = 13\n\nModSqrt = 7\nA = 7d\nP = 13\n\nModSqrt = 6\nA = 37\nP = 13\n\nModSqrt = 1\nA = 1\nP = 13\n\nModSqrt = 8\nA = 1a\nP = 13\n\nModSqrt = 54d4cf0fafe265056a29016778cea6b712bc66a132fb5e6b6865e9b49e4c97ec\nA = 599c10484b22d0b5a115268c7538ca99b3253a311a4ab1ca11c3665b0bec393a1167d1ad94fb84cb2c7ad7e2c933e8f613bdd08fe1f1aa4a9b0b9de0c8a7c9d4\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 38a7365a15365e911286c1be2a7afe76ef390234d76269e04dee17313f6ea54d\nA = 1c4aabb4d8369710131c664ecf2849e963c1bc31d66e0b939bacf99a870c71f24ed71bdddcf566f3908271fee43fc1ebb51eac7e3153efae641b49d2e796a12a\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 35ab18a560dece04725667f640ca61d1d59f14d191f94c79f58531acd097d444\nA = 685168ae855d60eba220d803f5296459b30a289580668db9ed51bca51cc2d453a937e13819ae34f7a9a143ac96d17420c53919167e46279b562b550be1cd9abc\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 288370029e87024175e5bec0eab0929179f42e16995e7f6194eefc61061e54f4\nA = 2a14ab77c045bdc48220ba9c463e1a4b4049cb01edb53be0937767eb2ec19b7d719855052281250a36a0b76d9a5d967d0756e1ded7a052f7056191ad66bcfc9\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 32255cf01dc9",
+    "43577ec2bcb221b98491d7a1130d046d6c68e95fedff643ce3a4\nA = e26f6dd46a513a1dd3fb14b71be1d4c9e9d79eda1cde10ea4d1eb8abfd4d5857572205e247184dd0cbefa37b5c0bf680ba2bd28c5741f725cfe2aae37419baf\nP = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1\n\nModSqrt = 5172345e801ada63fbc4782e32583cc3b4fea88b9e6dfd542f3542f8538ade66\nA = 40dafa8342b302bb04b1f3ddb3b9015a8fc1b597857c115b40631c7be9e22de89358fca23b331596ee5ff304dad7811e6d8e8822f7aa533c9e7c882634ea550\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 4dcf63c423bf0e39aca2293d57f6792d023db649d6719fe936446904b9f7e60d\nA = 5bcdb514bbe84261e169203e8017909b60c9bb330400c766ee01b0189378e70e61867a164a12643ddc9e94b61e09e5b158cbe85be228a3cc48f95a552958b8f2\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = cf77c5c2d12a500b75cbfb1f3e66ee75d886b9365cf4f8b4d1bd18a6be0f387\nA = 4652ddc2ea7b460d8ec3c9059b8f9b5dae6cac55b51f2ad86fcb336b25235737965cc515e2ff0b54835015b7ebeeda6fadd986471d8cb424d309fc353d1e269\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 1e0549e4c5a26023e9d24fd8c67419960746f82b1ecd113bdac66f570a475d87\nA = 5f4a6d450ab1390d96ab1deaa0ba18f897cb63daf0c9e1ef6c08e804c26b5e842f6c08f13db5d4a6e88f07af2a3cb04fa06fc3e59c410b9356f025ed81acc74\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 144481a781d831c1ca046ca9e322d79ad4d2c6dd9f780bea9d1ced9cd20b7b23\nA = 4c254fabca441017132b9eacd4ca40a336db3e5c09715773fa07af095989a91cc968ff07a9ff56ed06b0ce0c5269f7b2ab68564ecab9f4467a7e96b6cc6b21b7\nP = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3\n\nModSqrt = 216fecc7667f488a3d2d102a38b46b4860ab858300b8638af4f34e1103fd73ba\nA = 17878f8048227573a9d70f53c0e76ff13fe9f56e9c984c92514d3d13dec23c816661f0618d21371b80dfd885cb59551bdf80046f65f22ea9b89c78645a6e455a\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 458e5e789ccd2417174f7e30bb31914b9656bd8cf2b9f5a9752a8737a67707bc\nA = 5c7d39a4bb04e69201aa519f80ee7e62ea14ca55e13656d1da3f45367e2fb2d061aa2940708d02ac67d35cd2ccf54a1bf95bcbc759779e692cfdcbb3aa1a05b\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 543125a16c2bb8b8f8a2c39c497e5224ec77533602d7dbe24002e32dcbd2ef1a\nA = 3413afae333b2ad9ff45c7f3c7e5934b3127e8b1a55225958ee6ccf42423e81559bf070ad3f3353b78c0ffd41475af49f59d268ef78bdae879f5155e8d1cc07\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 10e16859c67bdb2eaab52a7c847dbf37162eda258a9f6262ebacfe4cbbbc1080\nA = 21ce7905894faf220bdf4a82a2d855994ca2dc9feaecaa53c7f146e1f49934215695e9bb46ba370b7005a90c399674caa8969eb442e7914d90f749774d7fd194\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 32a00586adc6f6cc2b1a04e1be0ab569fde235e1436c38b6af92bc5ebd60bc1c\nA = 350da4fd8cf03c12f7dd6ac6d3ab801a3413964083e374662aaf878d6838b97d4feb9e52cd307a25b113e101661a865463ee2480c626aa4e2ec437d72e7bae4c\nP = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95\n\nModSqrt = 971f75bc7afa8b4b50f1d4b05e52deac7d4836a08d30546f29649bf1ca6a247\nA = 655ed4c5d8d0afb4f9360372ee1ef1303898d2423e585108a3303faedb55064d2ef25666ed4c4d71fe6063fea1f3142b435714b0e30b339dd791d347c884654\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 48fa882b7cb6a29de9e3769f72eb67f1efd4d2af56f0c7e410c610efcbce2065\nA = 14f3503f33b243800eac1defaab33e04c01e80163fb3efd03860970cc016832431ca4fc6d1b760f4f40166b0b8b3c40dbebc81460cc10890172243770338f090\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 236fd7e397ea7f8bc2a288eb7236ca41936fa702b7dccca56c8852e147511f7d\nA = 1bbd0980feac854782813bcde4da85e8a054549a1b515e065da4236528035e756882e29e762cf60453e375cca9dc6ff637f9558bf86646e3b928f68f82af7efe\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 693f0cbe8c81b0afde0cd2f83e53795dcae6b0cc4ba930ab5c752400d787f14\nA = 7b20f9664b23907e152ab8c9a907f72e8670c1c38ab4cd1411ea7c2159c09aa131afe068929b8e6ad1409b74c04975180d1cd0a9fa74e923c3fd451e8da2c34\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 4a086c50b0bad576501ddb6280743b2c9d247841eb7f14d90561432ff7dca6f0\nA = 4367431ec0cd0d7626538b93a090c30fe0c97c18ca03b97ddae304b619112b5b4d02bf0f041fa3fd673f9ef2ceb07eb2079d11c56dd903b1a87e8252a97b8079\nP = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7\n\nModSqrt = 18f8433fa468d8065157708f1f1e53b8e31d39c6011fbc2bad93de1b5548e19c\nA = 739c032bb4139c199c40f548d37234298772e4ccb9d3ba28412b60ad23b4c465b0787e2382f1c5a4a87af2d20eb978b7dcbe73f2112249477d15c8a85e54a79\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 49e3c8eef5e067cabd51a7c01384ce05ab8f4342f655559d8a689eb7b20e0106\nA = 18400c2cc3e06b99b4e39c77b9af5ff0e9c683f1708321afa4cd5b6988d13b36b1d9eb4379b7902d9ceb40c03f814b2b6a01b90509bbb4532f13ab1571c4d04a\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 35548c530745f440329325cc8a5fbd90c16a7f0788879a4869bc4d4f73acda0e\nA = 181a3c5ab02566e7166c4d6d2f2bd4a8ecc25991a98d270bde80cf4332766a7068b14240bf5f5dcd45e90ef252596da3eb05b11d68b2063f7b3a825742593ca9\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 1ab7046e6af061ade5f9719008fa4d989007e2a579a134a5b9f19ec410984096\nA = 1008a03e211fab0d45856377079bc96b0776c2d4c0175661f3493246cea2ab0a02a706c85314fb707ad9906bedb2cfd577d62092ae08ff21d7b949373ea954c7\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 2be9e3e7515960d90f115b89f60dedc173a73ce163b4036e85b7b6a76fd90852\nA = 392053a9f0100540a8e1a0c353e922068a84dad3a4a8e8962fbc0bee2b6a06e20d08ade16eb1409a16acfcac3db5c43c421505e07035ca308b15c4a6db0864c0\nP = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659\n\nModSqrt = 5b301bb93bdcf050183107e36258b53b4805918114ea1c2227b0911d5b4dc077\nA = 55e55e5f94dc3d7aabc921f6469d85fa2e1e92a87347c57afad5872306ae69f9fb99297d1e3e793dd9e8632244208154de5da7114fd876383bf1422f7ece024\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 2df9609e2f5a5156c3260461b2ee52eacdef00bd8b091479813143a6c5283f71\nA = 2099325b7f12fe77353ddf3f2b2c5ef77b49671b150af954cf84e9675e3ecde3e057084641a633d19533b4712ab49924c8b5c31d591abcc88291f51253fa2a7\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = dfab751710e9008e25e422d1199d6fbec4dc7fba35b4da9d225a746eb4126a0\nA = c006af53d4737fb293584df6ffe2e4cb3fd8dc77fb7c1f13b97bb9c249e3ee5fb9feff7488265b3093906c08a4946f142ac7b491937d24bfba6413366ce371d\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 26bc030008d6c60a09fb0e16093a649fcb40c6c21a8e2da2353ba4b07c4f85d5\nA = 1eaabcfad2ed349ac9356e6f4da0b301266ddde811cb0f817aba8f5c10fb8b8ba9d0ef2dd386b668f16eac296118fdb8cb7afe1b865648c81c2fa3cf21f2711b\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = 35051b1482ec2578f3dc0000a422cb5111e43c37f1ac20b1844d3de2128c4556\nA = 315ff9de178681116f2a5fa78eebf4818e1d680435eacdfaf9d0e5c4fc01fc034b352c82fd52c81ca30d68864952dacc99d08269c9dd7ca99ccf22da98c3840\nP = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb\n\nModSqrt = a5474252885cacf004c460a7793ff0b0a2187bb1a9ed700ae3470199faef71f\nA = 19856fc1351c4b02abf573bb2fc6ff92355fa369d62bb8f2260fa772fb1693f509a56cad661930abcac049dd70f4b16bed4a4c172e73e772504c9990ce7f92f\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 12daf4722387ecf47de1b0b6b110a062dc5ea2685bc9dbde66b8d15622985029\nA = fb8479787069116abc42abfd7dc0c24d2ad04fe0c04b42a6dff714af715d17e0fd77855f950f264542b06d48e8818de813ddb7975798b7debefcdaa5ff86beb\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 397996ed5c0ac6ad32e43c337e9de421b87774cc162bf7ac7bbedf4a9029255e\nA = 5aa04353321bd2de92481be740357f979da464b53aa39111fdbb734cf7af6b3857d1baa08d3a126a3dd34a2fbae2bf2b84e900686c1d31505b390185acef5fe5\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 2cf4b844a54ba359dc592ef1b49f43fcfeae84d1087edfefdd0b9174b43c0a3c\nA = 365a8650510bcfd8fa87432f167cf487234c215857403b9270b5eebeafa48cd6da47fd60dc311b94d1d72baad0447",
+    "c31f0b212d755f46c256e16e5e015e6546e\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 9277c73043ff767c3fa606f0cd66b9d854a600c8c18287f191ce277758c3f31\nA = 62cec3901626d03e8df66299a87c54b1f7a55cafc99f0b6bba1b5d51a3d2b7d2171c9135a9d8a5346d436e0136b12e515e703e3cd84ecfe154eb94c6772a6d72\nP = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d\n\nModSqrt = 4189e5a90c1b1abdc1c7c05b3587e6f362e06f927b6cf5f0d271aab3d6f90765\nA = 336b8d0f9dac842c696bc020f49c6aa023842c16f2052eb02f17959006554ca0012042c80c72590f21c6bf5a3714c9cb552aa69730e33db93a56a909b273f39\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 36ccd38cb5a6bd8a73bca55936a2227c503664422c2296faf7e2b1c6a375a43a\nA = fecfd60a376befbe48d2c4f6d070d716d2f403cd5daefbce62b720df44deb605162c8f20f49fd7ec30d4f8e70d803d45b3a44b5d912baa3410d991165d7c507\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 198fc8569be172dc9b71023ed3d42d2ba94bae4099643f6517ab03f540527fdb\nA = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ec\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = 21b7f74c30ded681d6138cf8e6fd798f32a049e94138e982f1845df3dc9e686f\nA = 9a30b791c1ba4f394b4e3dcd5837e474237f4fe8987b255c098a47b2c14c598ec69d2beae444dd4fe9c4ede8173d2b187677cc706a3c28f3b81627d8a5fb6fd\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\nModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186\nA = 2eee37cf06228a387788188e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\n\n# NotModSquare tests.\n#\n# These test vectors are such that NotModSquare is not a square modulo P.\n\nNotModSquare = 03\nP = 07\n\nNotModSquare = 05\nP = 07\n\nNotModSquare = 06\nP = 07\n\nNotModSquare = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951e\nP = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f\n\n\n# ModInv tests.\n#\n# These test vectors satisfy ModInv * A = 1 (mod M) and 0 <= ModInv < M.\n\nModInv = 00\nA = 00\nM = 01\n\nModInv = 00\nA = 01\nM = 01\n\nModInv = 00\nA = 02\nM = 01\n\nModInv = 00\nA = 03\nM = 01\n\nModInv = 64\nA = 54\nM = e3\n\nModInv = 13\nA = 2b\nM = 30\n\nModInv = 2f\nA = 30\nM = 37\n\nModInv = 4\nA = 13\nM = 4b\n\nModInv = 1c47\nA = cd4\nM = 6a21\n\nModInv = 2b97\nA = 8e7\nM = 49c0\n\nModInv = 29b9\nA = fcb\nM = 3092\n\nModInv = a83\nA = 14bf\nM = 41ae\n\nModInv = 18f15fe1\nA = 11b5d53e\nM = 322e92a1\n\nModInv = 32f9453b\nA = 8af6df6\nM = 33d45eb7\n\nModInv = d696369\nA = c5f89dd5\nM = fc09c17c\n\nModInv = 622839d8\nA = 60c2526\nM = 74200493\n\nModInv = fb5a8aee7bbc4ef\nA = 24ebd835a70be4e2\nM = 9c7256574e0c5e93\n\nModInv = 846bc225402419c\nA = 23026003ab1fbdb\nM = 1683cbe32779c59b\n\nModInv = 5ff84f63a78982f9\nA = 4a2420dc733e1a0f\nM = a73c6bfabefa09e6\n\nModInv = 133e74d28ef42b43\nA = 2e9511ae29cdd41\nM = 15234df99f19fcda\n\nModInv = 46ae1fabe9521e4b99b198fc8439609023aa69be2247c0d1e27c2a0ea332f9c5\nA = 6331fec5f01014046788c919ed50dc86ac7a80c085f1b6f645dd179c0f0dc9cd\nM = 8ef409de82318259a8655a39293b1e762fa2cc7e0aeb4c59713a1e1fff6af640\n\nModInv = 444ccea3a7b21677dd294d34de53cc8a5b51e69b37782310a00fc6bcc975709b\nA = 679280bd880994c08322143a4ea8a0825d0466fda1bb6b3eb86fc8e90747512b\nM = e4fecab84b365c63a0dab4244ce3f921a9c87ec64d69a2031939f55782e99a2e\n\nModInv = 1ac7d7a03ceec5f690f567c9d61bf3469c078285bcc5cf00ac944596e887ca17\nA = 1593ef32d9c784f5091bdff952f5c5f592a3aed6ba8ea865efa6d7df87be1805\nM = 1e276882f90c95e0c1976eb079f97af075445b1361c02018d6bd7191162e67b2\n\nModInv = 639108b90dfe946f498be21303058413bbb0e59d0bd6a6115788705abd0666d6\nA = 9258d6238e4923d120b2d1033573ffcac691526ad0842a3b174dccdbb79887bd\nM = ce62909c39371d463aaba3d4b72ea6da49cb9b529e39e1972ef3ccd9a66fe08f\n\nModInv = aebde7654cb17833a106231c4b9e2f519140e85faee1bfb4192830f03f385e773c0f4767e93e874ffdc3b7a6b7e6a710e5619901c739ee8760a26128e8c91ef8cf761d0e505d8b28ae078d17e6071c372893bb7b72538e518ebc57efa70b7615e406756c49729b7c6e74f84aed7a316b6fa748ff4b9f143129d29dad1bff98bb\nA = a29dacaf5487d354280fdd2745b9ace4cd50f2bde41d0ee529bf26a1913244f708085452ff32feab19a7418897990da46a0633f7c8375d583367319091bbbe069b0052c5e48a7daac9fb650db5af768cd2508ec3e2cda7456d4b9ce1c39459627a8b77e038b826cd7e326d0685b0cd0cb50f026f18300dae9f5fd42aa150ee8b\nM = d686f9b86697313251685e995c09b9f1e337ddfaa050bd2df15bf4ca1dc46c5565021314765299c434ea1a6ec42bf92a29a7d1ffff599f4e50b79a82243fb24813060580c770d4c1140aeb2ab2685007e948b6f1f62e8001a0545619477d498132c907774479f6d95899e6251e7136f79ab6d3b7c82e4aca421e7d22fe7db19c\n\nModInv = 1ec872f4f20439e203597ca4de9d1296743f95781b2fe85d5def808558bbadef02a46b8955f47c83e1625f8bb40228eab09cad2a35c9ad62ab77a30e3932872959c5898674162da244a0ec1f68c0ed89f4b0f3572bfdc658ad15bf1b1c6e1176b0784c9935bd3ff1f49bb43753eacee1d8ca1c0b652d39ec727da83984fe3a0f\nA = 2e527b0a1dc32460b2dd94ec446c692989f7b3c7451a5cbeebf69fc0ea9c4871fbe78682d5dc5b66689f7ed889b52161cd9830b589a93d21ab26dbede6c33959f5a0f0d107169e2daaac78bac8cf2d41a1eb1369cb6dc9e865e73bb2e51b886f4e896082db199175e3dde0c4ed826468f238a77bd894245d0918efc9ca84f945\nM = b13133a9ebe0645f987d170c077eea2aa44e85c9ab10386d02867419a590cb182d9826a882306c212dbe75225adde23f80f5b37ca75ed09df20fc277cc7fbbfac8d9ef37a50f6b68ea158f5447283618e64e1426406d26ea85232afb22bf546c75018c1c55cb84c374d58d9d44c0a13ba88ac2e387765cb4c3269e3a983250fa\n\nModInv = 30ffa1876313a69de1e4e6ee132ea1d3a3da32f3b56f5cfb11402b0ad517dce605cf8e91d69fa375dd887fa8507bd8a28b2d5ce745799126e86f416047709f93f07fbd88918a047f13100ea71b1d48f6fc6d12e5c917646df3041b302187af641eaedf4908abc36f12c204e1526a7d80e96e302fb0779c28d7da607243732f26\nA = 31157208bde6b85ebecaa63735947b3b36fa351b5c47e9e1c40c947339b78bf96066e5dbe21bb42629e6fcdb81f5f88db590bfdd5f4c0a6a0c3fc6377e5c1fd8235e46e291c688b6d6ecfb36604891c2a7c9cbcc58c26e44b43beecb9c5044b58bb58e35de3cf1128f3c116534fe4e421a33f83603c3df1ae36ec88092f67f2a\nM = 53408b23d6cb733e6c9bc3d1e2ea2286a5c83cc4e3e7470f8af3a1d9f28727f5b1f8ae348c1678f5d1105dc3edf2de64e65b9c99545c47e64b770b17c8b4ef5cf194b43a0538053e87a6b95ade1439cebf3d34c6aa72a11c1497f58f76011e16c5be087936d88aba7a740113120e939e27bd3ddcb6580c2841aa406566e33c35\n\nModInv = 87355002f305c81ba0dc97ca2234a2bc02528cefde38b94ac5bd95efc7bf4c140899107fff47f0df9e3c6aa70017ebc90610a750f112cd4f475b9c76b204a953444b4e7196ccf17e93fdaed160b7345ca9b397eddf9446e8ea8ee3676102ce70eaafbe9038a34639789e6f2f1e3f352638f2e8a8f5fc56aaea7ec705ee068dd5\nA = 42a25d0bc96f71750f5ac8a51a1605a41b506cca51c9a7ecf80cad713e56f70f1b4b6fa51cbb101f55fd74f318adefb3af04e0c8a7e281055d5a40dd40913c0e1211767c5be915972c73886106dc49325df6c2df49e9eea4536f0343a8e7d332c6159e4f5bdb20d89f90e67597c4a2a632c31b2ef2534080a9ac61f52303990d\nM = d3d3f95d50570351528a76ab1e806bae1968bd420899bdb3d87c823fac439a4354c31f6c888c939784f18fe10a95e6d203b1901caa18937ba6f8be033af10c35fc869cf3d16bef479f280f53b3499e645d0387554623207ca4989e5de00bfeaa5e9ab56474fc60dd4967b100e0832eaaf2fcb2ef82a181567057b880b3afef62\n\n\n# GCD tests.\n#\n# These test vectors satisfy gcd(A, B) = GCD and lcm(A, B) = LCM.\n\nGCD = 0\nA = 0\nB = 0\n# Just to appease the syntax-checker.\nLCM = 0\n\nGCD = 1\nA = 92ff140ac8a659b31dd904161f9213706a08a817ae845e522c3af0c9096699e059b47c8c2f16434b1c5766ebb384b79190f2b2a62c2378f45e116890e7bb407a\nB = 2f532c9e5902b0d68cd2ed69b2083bc226e8b04c549212c425a5287bb171c6a47fcb926c70cc0d34b8d6201c617aee66af865d31fdc8a2eeb986c19da8bb0897\nLCM = 1b2c97003e520b0bdd59d8c35a180b4aa36bce14211590435b990ad8f4c034ce3c77899581cb4ee1a022874203459b6d53859ab1d99ff755efa253fc0e5d8487bb000c13c566e8937f0fe90b95b68bc278610d4f232770b08d1f31bee55a03da47f2d0ebb9e7861c4f16cc22168b68593e9efcde00f54104b4c3e1a0b294d7f6\n\nGCD = a\nA = faaffa431343074f5c5d6f5788500d7bc68b86eb37edf166f699b4d75b76dae2cb7c8f6eccae8f18f6d510ef72f0b9633d5740c0bebb934d3be796bd9a53808e\nB = 2f48ec5aa5511283c2935b15725d30f62244185573203b48c7eb135b2e6db5c115c9446ac78b020574665b06a75eb287e0dbeb5da7c193294699b4c2129d2ac4\nLCM = 4a15f305e9622aa19bd8f39e968bfc16d527a47f7a5219d7b02c242c77ef8b608a4a6141f643ca97cedf07c0f1f3e8879d2568b056718aa15c0756899a08ccbe0a658bae67face96fa110edb91757bfa4828e8ff7c5d71b204f36238b12dd26f17be8ba9771f7068d63e41d423671f898f054b118760",
+    "5754bc5546f2b02c5ac\n\nGCD = 16\nA = cf0b21bde98b41b479ac8071086687a6707e9efaacd4e5299668ce1be8b13290f27fd32ae68df87c292e8583a09d73ec8e8a04a65a487380dcd7dacca3b6e692\nB = 3be3f563f81d5ad5c1211db7eff430aa345e830ce07b4bde7d4d32dba3ac618d2034351e5435fd6c7f077971fb4a1e83a7396a74fdff7fce1267112851db2582\nLCM = 233a2188de2c017235024b182286f17562b2ee5ab9fdfe4efa2f61c4ff99fa44e1ead5bf6cde05bd7502ce78373c83e3f9dbab0c9bb8620a87c2640bce5d12c685af656df789bb3d0ba1edbaa98cf4f0166d422ab17aa6706f8132264d45b72827d6671a00a9186e723379e3a3bb7902d08865f357c74100059f83800241976\n\nGCD = 1\nA = dd7b7597d7c1eb399b1cea9b3042c14bd6022d31b1d2642a8f82fc32de6eadaf012fbbf349eaec4922a8468740ca73c6090833d6a69a380ed947b39c2f9b0b76\nB = 8e0dc8654e70eec55496038a8d3fff3c2086bc6dbfc0e2dbdf5bd7de03c5aef01a3982556ac3fc34fd5f13368be6cdc252c82367b7462e210f940f847d382dd9\nLCM = 7ae667df4bd4dd35bbec28719a9f1b5e1f396a9ab386c086742a6ab3014a3386d39f35b50624d0c5b4e6b206c2635c7de5ea69e2faa85dd616a7e36622962a07632839857aa49332942feccff2aee1c962e2f4e8ccfd738a5da5bf528b4c5a2440409350f5a17a39d234403e8482ccf838e0d2758ccfb8018198a51dbb407506\n\nGCD = 1\nA = 0\nB = 1\nLCM = 0\n\nGCD = 1\nA = 1\nB = 0\nLCM = 0\n\nGCD = 1\nA = 1\nB = 1\nLCM = 1\n\nGCD = 2b2\nA = dfccaa3549c1b59ab3e114fe87dc5d187719abad58c51724e972741eb895ab79a49f385f61d531ec5c88dbb505ae375093fa848165f71a5ed65e7832a42ade191a\nB = fa58a81f43088da45e659fc1117d0f1cd015aa096c8e5377cf1832191baf7cc28b5c24998b93b64f8900a0973faedb9babaaf1854345f011739da8f1175d9684c\nLCM = 5132f7ab7a982b9dc55114bd96800b7637f9742cf8a7a00a0d69d5e4574fc85792c89a1c52bcfc74b9d7f3f6164819466c46b2d622e280ced7ad1211604084a15dc1fd1951a05c8ce37122c0ec15891d818a70d3763670ea3195098de9b1ca50ea89893a9753fb9ea801541058f44801f7f50967124abfc864a2b01c41f94193c\n\nGCD = 8e\nA = 248d96a8a4cab0a1b194e08c1146868b094597cadbc35531f0ed2d77cba9f15cb5cc7c10e64ce054bf93396d25259d750b3de3aba65073db1fd2b852a6454ac1a\nB = 4c7bad8e1844901fd6a2ce2edc82e698d28ec95d6672ca148d85b49ecc78dd0a8b870e202244210bc98592b99ff6abbd20630f9eee7d46b15ccfae8d08b86799de\nLCM = 13b01f9d9c6c13e90c97e3d95bbce5a835c631b3de3bd4ff5df13ad850f5223dbdf71c53912275d0397df9335ef3a3ba8e4684c6b25962bb7b18bc74144cb5edf0196f79863a7ff032619a71646a92281f7baace7f223d254cb4d05ec19bf8d4c8ce4455a9d770daec89c0d3cf338cbdae39cf982b3c4568f5c9def4e1133d28a\n\nGCD = 3e55\nA = 2fa97382f46676b7a4cc2b8153f17b58792d24660e187d33ce55c81cc193ccb6e1e2b89feea1d5fd8faa36e13bf947fb48635e450a4d1488d0978324194a1f43c6\nB = ab08ad074139963bc18e5d87ba68db64ca6f4c279616c64039b02c55f2375b3bc04114e8e05e1ba92fb6470768f61d123845aea36774c18612736a220934561faf\nLCM = 82c7c377ecda2cb9228604cd287df5eff94edd4a539c3eb3b3fdd4b4a79d2f4eaf2b22f8286272d3dad2e370cfcd9ea4d93ebb3f049c52b8fa23b68a5bf79af989822e2cfb978f68c6a5058f47319dffcb455b089b06ae6db9e5c8a2b6e951d6e118bd2b4cd08b6e5733476a446a57387d940d1289ec00e24315821ed3a5daf2\n\nGCD = a7a\nA = 923706dfed67834a1e7e6c8e8e9f93bfbc0b43ca1f324886cf1f1380fb9b77109275d4b50af1b7689802fe9b3623ac46c7ba0e17e908c20278127b07a5c12d86ec\nB = 64473e878a29021fac1c1ce34a63eae1f4f83ee6851333b67213278b9a4a16f005cba0e8cdb410035bb580062f0e486c1a3a01f4a4edf782495f1dc3ebfa837d86\nLCM = 57785ca45b8873032f1709331436995525eed815c55140582ce57fd852116835deac7ca9d95ce9f280e246ea4d4f1b7140ab7e0dd6dc869de87f1b27372098b155ad0a1828fd387dff514acc92eae708609285edaab900583a786caf95153f71e6e6092c8c5ee727346567e6f58d60a5e01c2fa8ebcf86da9ea46876ecc58e914\n\nGCD = 42\nA = 0\nB = 42\nLCM = 0\n\nGCD = 42\nA = 42\nB = 0\nLCM = 0\n\nGCD = 42\nA = 42\nB = 42\nLCM = 42\n\nGCD = f60d\nA = ef7886c3391407529d5cf2e75ed53e5c3f74439ad2e2dc48a79bc1a5322789b4ced2914b97f8ff4b9910d212243b54001eb8b375365b9a87bd022dd3772c78a9fd63\nB = d1d3ec32fa3103911830d4ec9f629c5f75af7039e307e05bc2977d01446cd2cbeeb8a8435b2170cf4d9197d83948c7b8999d901fe47d3ce7e4d30dc1b2de8af0c6e4\nLCM = cc376ed2dc362c38a45a719b2ed48201dab3e5506e3f1314e57af229dc7f3a6a0dad3d21cfb148c23a0bbb0092d667051aa0b35cff5b5cc61a7c52dec4ed72f6783edf181b3bf0500b79f87bb95abc66e4055f259791e4e5eb897d82de0e128ecf8a091119475351d65b7f320272db190898a02d33f45f03e27c36cb1c45208037dc\n\nGCD = 9370\nA = 1ee02fb1c02100d1937f9749f628c65384ff822e638fdb0f42e27b10ee36e380564d6e861fcad0518f4da0f8636c1b9f5124c0bc2beb3ca891004a14cd7b118ddfe0\nB = 67432fd1482d19c4a1c2a4997eab5dbf9c5421977d1de60b739af94c41a5ad384cd339ebfaa43e5ad6441d5b9aaed5a9f7485025f4b4d5014e1e406d5bd838a44e50\nLCM = 159ff177bdb0ffbd09e2aa7d86de266c5de910c12a48cbe61f6fa446f63a2151194777555cd59903d24cb30965973571fb1f89c26f2b760526f73ded7ee8a34ebcecd1a3374a7559bcdb9ac6e78be17a62b830d6bb3982afdf10cf83d61fd0d588eab17d6abef8e6a7a5763fcb766d9a4d86adf5bb904f2dd6b528b9faec603987a0\n\nGCD = c5f\nA = 5a3a2088b5c759420ed0fb9c4c7685da3725b659c132a710ef01e79435e63d009d2931ea0a9ed9432f3d6b8851730c323efb9db686486614332c6e6ba54d597cf98\nB = 1b1eb33b006a98178bb35bbcf09c5bebd92d9ace79fa34c1567efa8d6cf6361547807cd3f8e7b8cd3ddb6209dccbae4b4c16c8c1ec19741a3a57f61571882b7aed7\nLCM = c5cbbbe9532d30d2a7dd7c1c8a6e69fd4fa4828a844d6afb44f3747fef584f7f1f3b835b006f8747d84f7699e88f6267b634e7aef78d6c7584829537d79514eec7d11219721f91015f5cefdc296261d85dba388729438991a8027de4827cd9eb575622e2912b28c9ce26d441e97880d18db025812cef5de01adeaec1322a9c9858\n\nGCD = e052\nA = 67429f79b2ec3847cfc7e662880ab1d94acdf04284260fcfffd67c2862d59704ed45bcc53700c88a5eea023bc09029e9fd114fc94c227fd47a1faa1a5ef117b09bd2\nB = 39faa7cbdeb78f9028c1d50ab34fbe6924c83a1262596f6b85865d4e19cc258b3c3af1ee2898e39e5bee5839e92eac6753bbbb0253bd576d1839a59748b778846a86\nLCM = 1ab071fb733ef142e94def10b26d69982128561669e58b20b80d39cf7c2759d26b4a65d73b7f940c6e8fc417180ef62d7e52ac24678137bd927cd8d004ad52b02affe176a1ecde903dbc26dcc705678f76dd8cd874c0c3fe737474309767507bbe70dd7fb671bbb3694cedf0dcdaa0c716250ddd6dfec525261572fa3e1387f7b906\n\nGCD = 3523\nA = 0\nB = 3523\nLCM = 0\n\nGCD = 3523\nA = 3523\nB = 0\nLCM = 0\n\nGCD = 3523\nA = 3523\nB = 3523\nLCM = 3523\n\nGCD = f035a941\nA = 16cd5745464dfc426726359312398f3c4486ed8aaeea6386a67598b10f744f336c89cdafcb18e643d55c3a62f4ab2c658a0d19ea3967ea1af3aee22e11f12c6df6e886f7\nB = 74df09f309541d26b4b39e0c01152b8ad05ad2dfe9dd2b6706240e9d9f0c530bfb9e4b1cad3d4a94342aab309e66dd42d9df01b47a45173b507e41826f24eb1e8bcc4459\nLCM = b181771d0e9d6b36fdfcbf01d349c7de6b7e305e1485ea2aa32938aa919a3eee9811e1c3c649068a7572f5d251b424308da31400d81ac4078463f9f71d7efd2e681f92b13a6ab3ca5c9063032dcbdf3d3a9940ce65e54786463bbc06544e1280f25bc7579d264f6f1590cf09d1badbf542ce435a14ab04d25d88ddbac7d22e8cae1c91f\n\nGCD = 33ad1b8f\nA = 1af010429a74e1b612c2fc4d7127436f2a5dafda99015ad15385783bd3af8d81798a57d85038bcf09a2a9e99df713b4d6fc1e3926910fbbf1f006133cb27dc5ebb9cca85\nB = 92a4f45a90965a4ef454f1cdd883d20f0f3be34d43588b5914677c39d577a052d1b25a522be1a656860a540970f99cbc8a3adf3e2139770f664b4b7b9379e13daf7d26c\nLCM = 4c715520ed920718c3b2f62821bc75e3ff9fd184f76c60faf2906ef68d28cd540d3d6c071fa8704edd519709c3b09dfaee12cb02ab01ad0f3af4f5923d5705ce6d18bcab705a97e21896bb5dd8acb36ee8ec98c254a4ddc744297827a33c241f09016a5f109248c83dd41e4cea73ce3eabb28d76678b7e15545b96d22da83c111b6b624\n\nGCD = dc0429aa\nA = ccb423cfb78d7150201a97114b6644e8e0bbbb33cadb0ef5da5d3c521a244ec96e6d1538c64c10c85b2089bdd702d74c505adce9235aa4195068c9077217c0d431de7f96\nB = 710786f3d9022fc3acbf47ac901f62debcfda684a39234644bac630ab2d211111df71c0844b02c969fc5b4c5a15b785c96efd1e403514235dc9356f7faf75a0888de5e5a\nLCM = 6929af911850c55450e2f2c4c9a72adf284fe271cf26e41c66e1a2ee19e30d928ae824f13d4e2a6d7bb12d10411573e04011725d3b6089c28d87738749107d990162b485805f5eedc8f788345bcbb5963641f73c303b2d92f80529902d3c2d7899623958499c8a9133aae49a616c96a2c5482a37947f23af18c3247203ac2d0e760340e6\n\nGCD = 743166058\nA = 16cd476e8031d4624716238a3f85badd97f274cdfd9d53e0bd74de2a6c46d1827cc83057f3889588b6b7ca0640e7d743ed4a6eaf6f9b8df130011ecc72f56ef0af79680\nB = 86eba1fc8d761f22e0f596a03fcb6fe53ad15a03f5b4e37999f60b20966f78ba3280f02d3853f9ace40438ccfaf8faed7ace2f2bf089b2cdd4713f3f293bf602666c39f8\nLCM = 1a7a1b38727324d6ba0290f259b8e2b89c339b2445cada38a5a00ded1468ab069f40678ce76f7f78c7c6f97783cc8a49ef7e2a0c73abbac3abc66d1ce99566ce7f874a8949ca3442051e71967695dc65361184748c1908e1b587dc02ed899a524b34eb30b6f8db302432cfa1a8fbf2c46591e0ab3db7fd32c01b1f86c39832ee9f0c80\n\nGCD = 6612ba2c\nA = 0\nB = 6612ba2c\nLCM = 0\n\nGCD = 6612ba2c\nA = 6612ba2c\nB = 0\nLCM = 0\n\nGCD = 6612ba2c\nA = 6612ba2c\nB = 6612ba2c\nLCM = 6612ba2c\n\nGCD ",
+    "= 2272525aa08ccb20\nA = 11b9e23001e7446f6483fc9977140d91c3d82568dabb1f043a5620544fc3dda233b51009274cdb004fdff3f5c4267d34181d543d913553b6bdb11ce2a9392365fec8f9a3797e1200\nB = 11295529342bfb795f0611d03afb873c70bd16322b2cf9483f357f723b5b19f796a6206cf3ae3982daaeafcd9a68f0ce3355a7eba3fe4e743683709a2dd4b2ff46158bd99ff4d5a0\nLCM = 8d4cbf00d02f6adbaa70484bcd42ea932000843dcb667c69b75142426255f79b6c3b6bf22572597100c06c3277e40bf60c14c1f4a6822d86167812038cf1eefec2b0b19981ad99ad3125ff4a455a4a8344cbc609e1b3a173533db432bd717c72be25e05ed488d3970e7ed17a46353c5e0d91c8428d2fec7a93210759589df042cab028f545e3a00\n\nGCD = 3480bf145713d56f9\nA = 8cf8ef1d4f216c6bcec673208fd93b7561b0eb8303af57113edc5c6ff4e1eeae9ddc3112b943d947653ba2179b7f63505465126d88ad0a0a15b682f5c89aa4a2a51c768cd9fdeaa9\nB = a6fd114023e7d79017c552a9051ca827f3ffa9f31e2ee9d78f8408967064fcdc9466e95cc8fac9a4fa88248987caf7cf57af58400d27abd60d9b79d2fe03fad76b879eceb504d7f\nLCM = 1c05eee73a4f0db210a9007f94a5af88c1cdd2cba456061fd41de1e746d836fa4e0e972812842e0f44f10a61505f5d55760c48ba0d06af78bb6bde7da8b0080b29f82b1161e9c0b5458e05ac090b00f4d78b1cc10cf065124ba610e3acab092a36fe408525e21c0ddc7c9696ed4e48bd2f70423deecfe62cecc865c6088f265da0e5961d3f3a84f\n\nGCD = 917e74ae941fcaae\nA = 652f8a92d96cbf0a309629011d0fbaceb1266bc2e8243d9e494eead4cf7100c661b537a8bea93dec88cfc68597d88a976c125c3b4de19aba38d4ea9578202e59848d42652518348a\nB = 32e07b71979d57e8344e97c39680a61e07d692d824ae26b682156890792d8a766ee29a4968f461aaced5bf049044fba2f4120b1c1f05985676f975d4582e9e82750d73c532cd07b2\nLCM = 23620c7b897dc26c7717e32f3517ac70bf09fbe08f7255ab010cf4cf946f4e96304c425043452c5d5a0e841d3a3cfd9c2d84d9256f3b5974fe3ebfa9255fe20a710d3e6511606c0d85970381101c7f4986d65ad6a73a71507f146b11f903043cfa805cc0b14d4f3072da98bf22282f7762040406c02d5b3ef9e7587f63bab8b29c61d8e30911aa96\n\nGCD = 2b9adc82005b2697\nA = 19764a84f46045ef1bca571d3cbf49b4545998e64d2e564cc343a53bc7a0bcfbe0baa5383f2b346e224eb9ce1137d9a4f79e8e19f946a493ff08c9b423574d56cbe053155177c37\nB = 1bbd489ad2ab825885cdac571a95ab4924e7446ce06c0f77cf29666a1e20ed5d9bc65e4102e11131d824acad1592075e13024e11f12f8210d86ab52aa60deb250b3930aabd960e5a\nLCM = 1032a0c5fffc0425e6478185db0e5985c645dd929c7ebfeb5c1ee12ee3d7b842cfab8c9aa7ff3131ac41d4988fb928c0073103cea6bb2cc39808f1b0ad79a6d080eac5a0fc6e3853d43f903729549e03dba0a4405500e0096b9c8e00510c1852982baec441ed94efb80a78ed28ed526d055ad34751b831b8749b7c19728bf229357cc5e17eb8e1a\n\nGCD = 8d9d4f30773c4edf\nA = 0\nB = 8d9d4f30773c4edf\nLCM = 0\n\nGCD = 8d9d4f30773c4edf\nA = 8d9d4f30773c4edf\nB = 0\nLCM = 0\n\nGCD = 8d9d4f30773c4edf\nA = 8d9d4f30773c4edf\nB = 8d9d4f30773c4edf\nLCM = 8d9d4f30773c4edf\n\nGCD = 6ebd8eafb9a957a6c3d3d5016be604f9624b0debf04d19cdabccf3612bbd59e00\nA = 34dc66a0ffd5b8b5e0ffc858dfc4655753e59247c4f82a4d2543b1f7bb7be0e24d2bbf27bb0b2b7e56ee22b29bbde7baf0d7bfb96331e27ba029de9ffdff7bdb7dc4da836d0e58a0829367ec84ea256833fd4fe1456ad4dd920557a345e12000\nB = 1f3406a20e20ebf96ccb765f898889a19b7636608fd7dc7c212607b641399543f71111d60e42989de01eaa6ff19a86ea8fbde1a3d368c0d86dc899e8e250fc764090f337958ca493119cbb4ad70cbfae7097d06d4f90ec62fbdd3f0a4496e600\nLCM = ee502c50e3667946e9089d0a9a0382e7fd0b75a17db23b56a0eec997a112c4dbd56d188808f76fe90451e5605550c9559ef14a95014c6eb97e9c1c659b98515c41470142843de60f72fb4c235faa55b0a97d943221003d44e2c28928f0b84bf071256254897ed31a7fd8d174fc962bc1311f67900ac3abcad83a28e259812f1ee229511ab1d82d41f5add34693ba7519babd52eb4ec9de31581f5f2e40a000\n\nGCD = ef7399b217fc6a62b90461e58a44b22e5280d480b148ec4e3b4d106583f8e428\nA = 7025e2fe5f00aec73d90f5ad80d99ca873f71997d58e59937423a5e6ddeb5e1925ed2fd2c36a5a9fc560c9023d6332c5d8a4b333d3315ed419d60b2f98ccf28bbf5bf539284fd070d2690aeaac747a3d6384ee6450903a64c3017de33c969c98\nB = df0ac41dbabce1deeb0bceb1b65b1079850052ecf6534d0cff84a5a7fb5e63baee028d240f4419925154b96eaa69e8fbb1aae5102db7916234f290aa60c5d7e69406f02aeea9fe9384afbff7d878c9ac87cd31f7c35dff243b1441e09baff478\nLCM = 687669343f5208a6b2bb2e2efcac41ec467a438fde288cc5ef7157d130139ba65db9eb53e86a30c870bd769c0e0ab15a50f656cd9626621ae68d85eaff491b98da3ea5812062e4145af11ea5e1da457084911961ef2cd2ac45715f885ba94b4082aa76ffd1f32461f47c845b229d350bf36514c5ce3a7c782418746be342eca2721346ade73a59475f178c4f2448e1326110f5d26a0fef1a7a0c9288489e4dc8\n\nGCD = 84b917557acf24dff70cb282a07fc52548b6fbbe96ca8c46d0397c8e44d30573\nA = 81dbb771713342b33912b03f08649fb2506874b96125a1ac712bc94bfd09b679db7327a824f0a5837046f58af3a8365c89e06ff4d48784f60086a99816e0065a5f6f0f49066b0ff4c972a6b837b63373ca4bb04dcc21e5effb6dfe38271cb0fa\nB = 1da91553c0a2217442f1c502a437bb14d8c385aa595db47b23a97b53927b4493dd19f1bc8baf145bc10052394243089a7b88d19b6f106e64a5ab34acad94538ab504d1c8ebf22ac42048bbd1d4b0294a2e12c09fe2a3bd92756ba7578cb34b39\nLCM = 1d0530f8142754d1ee0249b0c3968d0ae7570e37dadbe4824ab966d655abf04cd6de5eb700eba89d8352dec3ae51f2a10267c32fbd39b788c7c5047fe69da3d7ad505435a6212f44899ba7e983bb780f62bcdee6f94b7dba8af7070a4cc008f351ae8be4579bc4a2e5c659ce000ad9c8cdc83723b32c96aeb0f5f4127f6347353d05525f559a8543cd389ad0af6f9d08a75b8c0b32419c097e6efe8746aee92e\n\nGCD = 66091477ea3b37f115038095814605896e845b20259a772f09405a8818f644aa\nA = cedac27069a68edfd49bd5a859173c8e318ba8be65673d9d2ba13c717568754ed9cbc10bb6c32da3b7238cff8c1352d6325668fd21b4e82620c2e75ee0c4b1aff6fb1e9b948bbdb1af83cecdf356299b50543b72f801b6a58444b176e4369e0\nB = 5f64ca1ba481f42c4c9cf1ffa0e515b52aa9d69ceb97c4a2897f2e9fa87f72bae56ee6c5227f354304994c6a5cc742d9f09b2c058521975f69ca5835bce898cf22b28457cd7e28870df14e663bb46c9be8f6662f4ff34d5c4ae17a888eba504e\nLCM = c163cb28642e19a40aa77887c63180c2c49fc10cda98f6f929c8131752ea30b5283a814a81681b69b9d1762e6c1a9db85f480bc17f998d235fd7e64c1caa70ef170c9e816d3e80f516b29f2c80cfb68bf208b4d5082ef078da4314b3f20c7d6c54b0aeb378096b029a7b61c0a4cd14aeddc01004c53915a4f692d2291752e5af46b23d7fa6dd61f2d56c6f4bf8e6119688abac8fd7aba80e846a7764bb3fca0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = 0\nB = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nLCM = 0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nB = 0\nLCM = 0\n\nGCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nA = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nB = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\nLCM = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182\n\nGCD = 120451d8307219aa0c96f328ad653ccd462e92423ca93ed8a3dde45bf5cb9b13cdaf9800e4d05dd71c4db6a129fb3280ee4ec96ec5297d881c1a8b5efccbd91fef21f5c5bf5fba42a4c8eaa358f620a074b7a17054527bdaa58d5acaa0dfdc48ecba1a10ebf4d57bb4215de406e6be13fed3fe493b1cd1e2d11a8d4ac03c47756\nA = 3f8179a8e1f0b342475a855c3e1bae402dd41424cf24a0b4d2e263c8efb08bde7d92eae8607fb5e88b1378f0f1bd0733f229a35be6b1383a48d32749d5d6b32427d26323b7ab05bb5781289e96bfbc21971439319b15f6c0fe93fdb35d0b67ec41443c59a081dd3cef047ac797fccb45bece84c0bb0bb7e1797259526d8ec9cc63ba4d32cfc692ccd3d243cb2b53ac216312f3a8e8c0daa09d21b6150d697639a5e52059414a417c607be8ec0eee2e708219cadbaf37a369c4485b01ed87bbc2\nB = 2c474e396a2dd9cd10b9d7313f69d3b4ca123e9fd853edd488339236d14c56453a1381958864a04d2624e81995dabcdd0ccf60db9917813f887de68da075d0ea4440001e18f470e43b38ee3440b49be651d709fbdef980e3e4149913f4ae2681124f54523f4881376ddb533b5219e804cc26f4c2e577be4e02613c4da80ba1215775b0a5178a965ad47bd2befb32493943ded1004ef66347b4983f8d1ba990d4a943505dfce6debcfb322842ed88106cd6dee9aa592ff0d2274bc727a6e1f14c\nLCM = 9c129cf649555bfd2d3d9c64dc6d6f022295e53bca5d2f218adaa66aa60eb4694429b7e83bf81b6df4459c5104023ab9a33f006ffcd8114507baa17e2ef6fe23ebdd4740f66879033da2041f2cb7ba517ad3526ffe75614ea9432c085f71b2d65a736bac7ba42b639e330b82733372083843dcb78b6a273ab20e0d4b7c8998a14048aa15bb20a0a0bd997917107274c89b4cec175fb98043d52e6c555bd9e0036566d052a6d4e7e276d1e8835e1f06e3ca46d47747ba586e95fb1a790d992834b7c3e136141eb8a434e6c12067246ac3c0a81c69e03b1ed28aa0b3173d6eff83d278c2f461a47a416f3f9a5dae3bb410fd18817bd4115e7f1e84b936cc02364\n\nGCD = 95aa569a2c76854300d7660847dd20fe0b8c445fdbcaa98465cee61aee76ad6a438e75a8c573198570ffb62bc07ec3a2be0ae0a1f631670fa88d6f75f3161e8b9a4d44b6801ffc884c7f469c5ed1f27b1edecce9f2977f9e92d1a3b230492fea7e6f2af739dc158a7fbd29856cbedb57b4119e64b27ab09eb1c2df01507d6e7fd\nA = ",
+    "4c653b5bfec44e9be100c064dffe5d8cd59b0cf4cc56b03eabb4ef87cfda6506c9a756b811907fe9d8b783eb7a0b9e129773bf1da365ddb488d27b16fb983e89345d1ccdb4f06a67a11925c3f266373be5d7b0075189c6f3c2157e2da197058fe0a7bcc50adc34e99e254a29abbe2d5948d3157e1b0c3fca3d641760f7b9862843b63abef0b3d83fd486f4526b30382fda355575da30e9a106718a3921774c4d69f5311f8d737fe618f5236b4763fe1b2ee7f13184db67367d3903c535ff6d7b\nB = 2dcca83c99a28e9fd2f84e78973699baf2f04fd454094730948b22477834a0064817b86e0835e6d7b26e5b0b1dcf4ad91a07ac0780d6522df1fcac758cf5db6c2a5623d7c0f1afefd5718f7b6de639867d07a9ec525991304e9355d1635104bea837f74758d6aa2aab4e4afbb606af1d98de7417505e4710cd0589bdff9a0bf38a857cc59a5f1781043e694fc2337fd84bdeb28b13a222bb09328a81ec409ad586e74236393d27398cc24d412135e34247c589149e134b97f4bd538ac9a3424b\nLCM = 1760c0b0066aa0695767099e87e9388729ea89b8e8c36bddcd04d257591e741613c07b0e69447c0a468c33a745084171e06523d987d8db40a1433bf435325e8a724a0876503b34495170ff3671d42117a2e4f3a75b1d9dd809a34fa0fb26fe50d84f80a9b02e40190e5efb927a5a61a03f13edbce2e666af6c3a2a9bcb84e47e3090008753ff27c4b8cf06480f471379a93f5230923623a83b286b71a555cd5e5347282f664ed90b14b2c4de84a70375e488211a7b3931119ef3bbe029b712389fe784818a0bf29d80733ce9cc940c547aa1eb3f06d492eb676bf37802283c82ce76156dfaab5c2d5107e08062681b5fa169f6eb68e1ab8bd9b2005e90bd4fd\n\nGCD = 244b9b1290cf5b4ba2f810574c050651489f2d3a2b03e702b76ebfaf4e33de9bbe5da24c919e68d3a72eadd35982b3a89c6b18b38ff7082ac65263e52b6ec75a5717b971c98257b194c828bff0216a99536603b41a396ea2fb50f5ea7cf3edf10bb0d039123e78593ae9ffcbbba02e51e038533e83b6bc73c70551d6467f39809\nA = 41a0b1310669500681cdf888836f6c556758750f562d743ac780dd4c0d161856380e44fdbb1f8a2786bf45be6b0e7f1cb2cd85f6b9e50acc72793d92383c7d7fb796fc74d32e8fac8225bdc19ae47546d9c9c75f5f06ca684f07daccaf89ccf2cddeb7ec255d530c7dd1e71daf44cafdc9d30fbcb1cbaefae3480585f79f4177e3834a5bc91845e2e8cd8aeb27f484e5e5b2c3c076dbb6c23e91303f0a0fdde83cd33a8ea6ed1549e727b4d766c1017c169710fd98e1585d60f66e121f9180b3\nB = 251f5aeaa60b3959285f49540cdaf8e21451110bbddb9933bbbcaea3112f4eb45e435a3ba37c52d2ab79ce997a8f6c829b3aa561f2852924b8effb52396d09d2bf257ebb4fb56c7aa25648f69b06d2cd01e876c9f9c0679de9e6fffa79eb7e603723e5af7de46ee405a5a079229577b5b6fffb8d43e391fe6f4eb89638e64d6eff8026249aaa355a91625eb0bfd14caa81e4c3586aaa2e94fde143a44f223a91e226661d12f55dfcdb4215e5a64e14e968005733be6a71c465de312ca109b34a\nLCM = 431f918b274f3e43f446e4e85567883d6536a0332db662cef088f5a36b0f4b68372048174ba10fee94b9f8f1c2e189c974be2e6e8ae8e2ae108445326d40f63e38d8d4e2e46174589a3cbc9583e0036dc8146e79eee9e96f4436313b3f143dd0f5aceab05243def7f915169c360f55ef123977cf623c5ba432c3259c62fb5e37d5adab0f24b825aa4ada99ec4e83e9ca4698399e1ed633091ce5f9844c540a642cd264201116ed4168aa2105a5159f5df064f845830c469140f766c7319052ce59bd1ad7c3f2d8c30e54f147f6aeb5586c70c984302ba18d854a60aec01b394c7d66fa33fe18fe4a8cfb3238df219294e6e42190a30d28b10049a1b75853a4e\n\nGCD = 206695d52bc391a4db61bf8cb6ea96188333a9c78f477ee76976c2346dad682cf56ca6f176d86ef67d41ff5921b6162b0eca52359975872430dd14c45643eacdf028d830770714c033fd150669705851b2f02de932322d271d565d26768530c3f6cb84f0b3356f970b9070b26c050ead0417152c324c8ffe266d4e8b5b7bef3a\nA = 1114eb9f1a9d5947eb1399e57f5c980833489685023ed2fe537fe1276c1e026b9a19e6fff55aa889d6c4e977b6e6f3111e2ad463138637b50f42cf32e57d83f282de9e72f813e5969195159a666d74dcd689bd527c60199ae327f7bd548ac36868fea5fdf6f35d19b921e7c10b6448ca480de6826478cd0642d72f05af3f8e65ce42409fbd49f56e81946e89c8e83962c4edc0ed54600600a305e52d081aed3c351e450e11f8fb0ce5754c92cf765b71393b2b7a89c95df79b9ea1b3cb600862\nB = 1d8f3179ca7b5cc7119360c10de939ffa57c9043da2f2b0ca3009c9bdad9f19ed16e3c2c197bef4b527fa1bf2bbab98b77e26c329911db68bd63d3d0fbfc727a977395b9ad067106de3094d68e097830858c5ccfa505fc25e972bdee6f347e7d1163efacd3d29a791ec2a94ffeed467884ae04896efc5e7e5f43d8d76c147e3c9951a1999173bc4e5767d51268b92cc68487ba1295372143b538711e0a62bf0ac111cc750ca4dd6c318c9cbe106d7fc492261404b86a1ba728e2d25b1976dc42\nLCM = f9570211f694141bfb096560551080cbe02a80271b4505591aaea9e3b99ea1d5ac1c1f2378fd72799e117ac2a73381b1ad26314e39972164d93971479ee3ba21a4d98cef0bd299d540ce5826995dcee0de420dff73d30b23cbf3188c625c7696df517535bc5675d71faa00807efbebdca547933f4a37849d1c014484a77da6df0670c4974bcc91eb5f5fe5faf9dd095ef195ec32ad9eeebf0e63288b4032ed9e70b888afc642f4ff96f0b4c0a68787301c12e4527fe79bdfe72dd3844ab5e094a9295df6616f24d1b9eeebc2116177dacf91969dda73667bc421ef3ccd8d5c23dddc283f5d36568d31f2654926be67f78e181075bdc148f2b39c630b141ae8a\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 0\nB = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nLCM = 0\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nB = 0\nLCM = 0\n\nGCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nA = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nB = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\nLCM = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423\n\nGCD = 2\nA = 14e95a85e59ade9ef39e2f400c65db18702fa5fc485b9bba479a5282b2206129160e54f73ef4917983c17b4c5ebff7be112a886de069706eee29ba902515cb038\nB = ddcfff1d39c90c599f55495bf71c1e7597c6b08b7430707f360c6a6e5137bbc7b403c6d9e2c34f3d2f29d5d32b869346853c2de239cc35381bdfb4a01569211a\nLCM = 90f38564ee72e55d362c04599e7d74f068c75f541b84e97abba2841f1a9f66b06b5c9009f6a4c2e319fced85270588de03ccebddbd9279aaecb13bdc1dbea7f42acaee751cb7da83779b8785cc86f41b94b13b54964208ca287d981634778d1096f20e76ca636c0717fd27e0800c43f599a5eded807421b502eaf9990a8c8ed8\n\nGCD = 4\nA = 3c719c1c363cdeb7b57c2aabb71f425da4c3e6d3e447204d555e7cf0f3d372bdda906f36078045044978dafc20171767c8b1464d52dfdf3e2ba8a4906da033a8\nB = 30fe0ef151ac51404e128c064d836b191921769dc02d9b09889ed40eb68d15bfdd2edea33580a1a4d7dcee918fefd5c776cbe80ca6131aa080d3989b5e77e1b24\nLCM = 2e4526157bbd765b0486d90bcd4728f890bc6dbd9a855c67ca5cb2d6b48f8e74e1d99485999e04b193afca58dbf282610185d6c0272007744ff26e00dbdc813929b47940b137dc56ba974da07d54a1c50ec4a5c2b26e83f47cf17f4ccce8c3687e8d1e91d7c491a599f3d057c73473723ce9eee52c20fe8ae1595447552a7ee8\n\nGCD = 10\nA = 44e04071d09119ea9783a53df35de4a989200133bb20280fdca6003d3ca63fdd9350ad1a1673d444d2f7c7be639824681643ec4f77535c626bd3ee8fa100e0bb0\nB = ca927a5a3124ce89accd6ac41a8441d352a5d42feb7f62687a5ebc0e181cc2679888ecc2d38516bdc3b3443550efccac81e53044ae9341ecace2598fe5ce67780\nLCM = 36805ba9b2412a0cb3fe4ed9bdabfa55515c9d615a3d0af268c45c5f6098d2de4a583f3791f1e3883c55d51ce23c5658fd0e8faa9a3709a1cfbd6a61dbab861690f27c86664f084c86cfd4a183b24aaadf59a6f8cbec04f1b0ded8a59b188cb46ae920052e3e099a570540dbc00f7d4a571eef08aa70d2d189a1804bf04e94a80\n\nGCD = 100\nA = 73725032b214a6776",
+    "87c811031555b0c51c1703f10d59b97a4d732b7feaec5726cb3882193419d3f057583b2bc02b297d76bb689977936febaae92638fdfc46a00\nB = 979f4c10f4dc60ad15068cedd62ff0ab293aeaa1d6935763aed41fe3e445de2e366e8661eadf345201529310f4b805c5800b99f351fddab95d7f313e3bb429d900\nLCM = 4460439b4be72f533e9c7232f7e99c48328b457969364c951868ceab56cb2cbbeda8be2e8e3cae45c0758048468b841fdb246b2086d19b59d17b389333166ab82ed785860620d53c44f7aaaff4625ee70fb8072df10fb4d1acb142eadc02978ff2bb07cea9f434e35424b3323a7bda3a1a57aa60c75e49ebb2f59fb653aa77da00\n\nGCD = 100000000\nA = f8b4f19e09f5862d79fb2931c4d616a1b8e0dd44781ca52902c8035166c8fca52d33a56ff484c365ec1257de7fa8ed2786163cfc051d5223b4aad859a049e8ba00000000\nB = 6e54cb41b454b080e68a2c3dd0fa79f516eb80239af2be8250ca9cd377ba501aabafc09146fad4402bdc7a49f2c3eec815e25f4c0a223f58e36709eefd92410500000000\nLCM = 6b3020a880ddeff9d17d3dc234da8771962de3322cd15ba7b1e4b1dd4a6a2a802a16c49653865c6fdf6c207cbe0940f8d81ef4cb0e159385fd709d515ee99d109ad9ad680031cbae4eab2ed62944babdade4e3036426b18920022f737897c7d751dce98d626cdda761fec48ad87a377fb70f97a0a15aa3d10d865785719cc5a200000000\n",
 };
-static const size_t kLen41 = 18795;
+static const size_t kLen38 = 18795;
 
-static const char *kData41[] = {
+static const char *kData38[] = {
     "# This file contains test vectors for whether B is a Miller-Rabin composite\n# witness for W. W must be odd and B must satisfy 1 <= B <= W-1.\n#\n# The following Python function may be used to check values.\n#\n#  def is_miller_rabin_witness(w, b):\n#      # Variable names taken from FIPS 186-4 C.3.1 but the algorithm skips a\n#      # couple of optimizations in the FIPS formulation.\n#      m = w - 1\n#      a = 0\n#      while m&1 == 0:\n#          a += 1\n#          m //= 2\n#      # b is a composite witness for w iff the following are true:\n#      # - b^m != 1 (mod w)\n#      # - b^(m*2^j) != -1 (mod w), for 0 <= j < a\n#      z = pow(b, m, w)\n#      if z == 1:\n#         # b^m = 1 (mod w)\n#         return False\n#      for j in range(a):\n#         if z == w-1:\n#             # b^(m*2^j) = -1 (mod w)\n#             return False\n#         z = (z * z) % w\n#      # At this point, z is b^(w-1) (mod w). If z is not 1, w has failed the\n#      # Fermat test and is composite. If z is 1, the value of z immediately\n#      # before it became 1 is a non-trivial root of unity and w is composite.\n#      return True\n\n# Exhaustively test a small prime.\n\nResult = PossiblyPrime\nW = 7\nB = 1\n\nResult = PossiblyPrime\nW = 7\nB = 2\n\nResult = PossiblyPrime\nW = 7\nB = 3\n\nResult = PossiblyPrime\nW = 7\nB = 4\n\nResult = PossiblyPrime\nW = 7\nB = 5\n\nResult = PossiblyPrime\nW = 7\nB = 6\n\n\n# Random large inputs which try to cover a few cases. The nontrivial square root\n# case appears to be difficult to hit randomly.\n\n# b^m = w-1\nResult = PossiblyPrime\nW = d6b4ffc7cf70b2a2fc5d6023015875504d40e3dcce7c2e6b762c3de7bb806a5074144e7054198dabf53d23108679ccc541d5a99efeb1d1abaf89e0dbcead2a8b\nB = fabbafdbec6494ddb5ea4bf458536e87082369b0e53a200ed413f3e64b2fddc7c57c565710fbe73fae5b188fce97d8dcca74c2b5d90906c96d3c2c358a735cd\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 52cc61c42b341ad56dc11495e7cb2fe31e506b9e99522efbf44cd7c28468d3833c5e360f3c77b0aa43c0495c4e14665ab0d7cee9294c722f0de47d4401828401\nB = 3bdc9639c0fc2e77ab48d46e0b4ac6529c11c900e8fe4d82d75767c0556feb23d3f42d4924d16876a743feb386b7b84c7fd16a6c252f662faf0024d19972e62f\n\n# b^m = w-1\nResult = PossiblyPrime\nW = cff9897aa7dce0f2afad262b2de57d301305de717f3539c537c4ce062f8cb70df13fbc1eb4a3b9f0958a8810d1ca9042b4f23334b285a15fee3fc66498761d4b\nB = 9ceb43132fddf9ee4104ea1cb3eb2253c1d7f803f05f0305de9e31a17dd75832f47b8bf189a9b7ca0905f2a7470d9c6349080f481ff1708696fa12d972e7d7ba\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 67d1825dad5344170e65247a87aef1634a1b32bdc22f2f04d9d2959767bb5a27610fba55cd607e0f9fdd9fbb0f7f98e40d5e1eb2f52318fb5be4dbfd30d38861\nB = 260fb14724ff80984736859d8755ee98b25bcb56db9fde1db001a1e1273374034c5b75fd60b3710c7a08ce7d390776f010f384d4e32943cf0c477497d53e9e05\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = ad0bc85b58aaa204177aa9431a40929beb1cbea2dd6f66a25cc54600013213b225ba881805661df43f4208965ada7aacc8095d07d3cbef1a7bbfaae8b745f731\nB = 3d9310f20e9c80269fa6830c7e1a6f02fc5c58646001a9ef6b8b3e496602ff22c3dcb2ddb6a221723fc1722ce237fb46f7a7bb2945e415c8839b15a972f076c9\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = b25c917f55f6c7b596921daba919f35039e5d805119c1587e99849dd7104460c86214f162a6f17aea847bc7f3859e59f2991d457059511972ef373d4bc75e309\nB = a1f10b261dee84619b0423201d46af19eef9ec0612cf947c4d5c36c0c4b28207f75967e69452eabad0a5dcd28f27f7a8a7ed9c8b3e5026c6e0ba5634d94c2d44\n\n# b^m = 1\nResult = PossiblyPrime\nW = d3eeb0eff05b6992e9fa61b02755e155f4aae28c6e45ddb874edd86acdd2d83d18a20e0e00d8b8bc94b92d14fc3f41ced6ababe8ac98c7730c075dbe0f699369\nB = 6b7717269c6225203681a1cacec87cacd83003ec6e9e3f04effcc4f86634770c0860e1f2770b8f303719a44949664a1094205a99d95a0856758fed66d690105e\n\n# b^m = 1\nResult = PossiblyPrime\nW = 64561b8d9aa50340c3a01ccb3e6e17f5023513661c012be288f3900a3ca76890e67290b9560fa1d480f9d2aacccca581b5690636665f243fa13aff5d0bff12d3\nB = 1f5ff70d3d60671ebc5fbfca731898a04438053dbc3c841e6335f487e457d92d9efb5d506d5bef6872d58d12b9a41c950bfc38d12ed977c90eacdd6535b811a0\n\n# b^m = 1\nResult = PossiblyPrime\nW = 69c63fbf44df21b0ed0ee929a740c12d1f3f064da0dcd9d509f31fa45fa27d1a759ab5a9f6f1040d7ee90a0b1e68f779273c41ea1c1198fd547ff6bd70c7e787\nB = 5f7996a9bbfd8fd88e472220b70077bfdacdd63d88885134431f024c2acb7126827b174eb093eb5313f07bb5461de9b0feb7d77ca2c39c2a323a150f33ea525f\n\n# End of iteration\nResult = Composite\nW = 28cc3e08c44571c6dcb98a9ab8b4f3e2b16e1f884997d94a3188bcbb7f1b7cdaecdae8329c013ec8f75dc00004da0039943e4262cd080b16a42910102e00dddb\nB = 512061ab1c69931c2fa0bb89d8d09f3c9209230bf927ddd6fb6a72075f967ed3c4dbb5f437bf4d31ca7344782b22011ad56609dc19aed65319bababfc13dd7\n\n# End of iteration\nResult = Composite\nW = 4eeb7b4d371c45fe8586fee3b1efd792176b70f6cc2698dfa1dd028366626febe0199c3c5f77a5c3cad0057a04767383051d41965255d03681b2a37edad34a9b\nB = 4afc2e85f84017b3fd6967a227eb74c8297b40ea02733d9513bff9b3f01081963f25872f4254afc4e9321eea35b2a1e42eadb186fcc84f2f30f4a994350b93b8\n\n# End of iteration\nResult = Composite\nW = 8e35a959555dd2eb66c65cee3c264071d20671f159e1f9896f1d0ceb041905fcf053eacc189de317c3ee6f93901223cbf30d5b7ddbbdab981790e2f6397e6803\nB = 44c0153759309ec4e5b1e59d57c1b126545ef7ea302b6e43561df4d16068b922389d6924f01c945d9080d1f93a0732599bdedae72d6d590839dc0884dd860441\n\n\n# 0x6c1 = 1729 = 7 * 13 * 19 is a Fermat pseudoprime.\n\n# Found non-trivial square root\nResult = Composite\nW = 6c1\nB = b8\n\n# End of iteration\nResult = Composite\nW = 6c1\nB = 111\n\n# End of iteration\nResult = Composite\nW = 6c1\nB = 11d\n\n# Found non-trivial square root\nResult = Composite\nW = 6c1\nB = 19c\n\n# Found non-trivial square root\nResult = Composite\nW = 6c1\nB = 223\n\n# End of iteration\nResult = Composite\nW = 6c1\nB = 3aa\n\n# Found non-trivial square root\nResult = Composite\nW = 6c1\nB = 653\n\n\n# 1729 has a number of false witnesses.\n\n# b^m = 1\nResult = PossiblyPrime\nW = 6c1\nB = 78\n\n# b^m = 1\nResult = PossiblyPrime\nW = 6c1\nB = eb\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 6c1\nB = 178\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 6c1\nB = 178\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 6c1\nB = 1aa\n\n# b^m = 1\nResult = PossiblyPrime\nW = 6c1\nB = 271\n\n# b^m = 1\nResult = PossiblyPrime\nW = 6c1\nB = 2b2\n\n\n# 1 and W-1 are always nonwitnesses.\nResult = PossiblyPrime\nW = 6c1\nB = 1\n\nResult = PossiblyPrime\nW = 6c1\nB = 6c0\n\n\n# https://kconrad.math.uconn.edu/blurbs/ugradnumthy/millerrabin.pdf, examples\n# 3.1 and 3.2 has a complete list of false witnesses for 65 = 0x41 and\n# 85 = 0x55.\n\n# b^m = 1\nResult = PossiblyPrime\nW = 41\nB = 1\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 41\nB = 8\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 41\nB = 12\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 41\nB = 2f\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 41\nB = 39\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 41\nB = 40\n\n# b^m = 1\nResult = PossiblyPrime\nW = 55\nB = 1\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 55\nB = d\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 55\nB = 26\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 55\nB = 2f\n\n# Some b^(m*2^j) = w-1\nResult = PossiblyPrime\nW = 55\nB = 48\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 55\nB = 54\n\n# Other witnesses for 65 and 85 will report composite:\n\n# Found non-trivial square root\nResult = Composite\nW = 41\nB = 2c\n\n# End of iteration\nResult = Composite\nW = 41\nB = 16\n\n# End of iteration\nResult = Composite\nW = 41\nB = 14\n\n# End of iteration\nResult = Composite\nW = 41\nB = 2\n\n# End of iteration\nResult = Composite\nW = 41\nB = 3a\n\n# End of iteration\nResult = Composite\nW = 55\nB = 40\n\n# End of iteration\nResult = Composite\nW = 55\nB = 7\n\n# End of iteration\nResult = Composite\nW = 55\nB = 23\n\n# End of iteration\nResult = Composite\nW = 55\nB = 2e\n\n# End of iteration\nResult = Composite\nW = 55\nB = 2a\n\n# W below is composite, but it is one of the worst case scenarios for\n# Miller-Rabin, from Wycheproof tests. 1/4 of witnesses report the value is\n# prime. Test that we correctly classify false and true witnesses.\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 379c6027f818b5164bc13dff",
     "5e996ec7210976f33570d5c60275918b8988d97a63bb6582af85682c45667a8b94b7acab4d919ede00f5bd2ba7abc8634d66f8875fd930f35ec8013d37b958e65f07de015c0574e64198d73aab5466f3a971b74830b7f1671cb9277fbc95c1ba8c29dc903d8cea1b74c22ab9164f9c438ab9ba7d9919f832e40c3e36faca7343e2314669b0104d9c4f2e1b011cdbd9c686baef0\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 3cc4b644965b2133caffc2bb6258b1ecd5b586b900a09b010382fcef709e4cd37ee3e3182bf8d393c1ab6f9a933d46338b3d960923d8c9607c2b2763d5680230a2bc0c91138e9d0ecb35e7154a06aaa902d34b9b14964b81f4d8232641492d83b22cd805a115e75ddd8e63b864c00e4c90ba36a41e7966e97e063a60a6a6cfd53e1f62a57852c7443e88dcf6245557a4b65494c3e88e466ad75316aaa9727def\n\n# b^m = 1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 40c03b6ba22bd62c0379b1c36dfccd34d61e3d15f7af1d5f6a60ab972a9d0e956e2bb9e275294e0f1c879eb7a4555443429c99a8d74f7bd359a1046ac30072c04b0e2cbd005be15ff4ce0c93276de2c513fbc5771b5059904a87f180530f6773498114b5aaf70da01967d8294742e451df6377dd5e64b2a8968f4ba61b51a154317d63958ff3788defbeeebee21af5027c2291e8c5df8c0b66770d91b683cffe\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 3c7c71b84f0c6c3817f57511946315cec7d0120a9c30ceabda801fbaec329a8f10c7b9f0ae90a3dada9885bf73a3cabed86784af9682f3dea50a7817f65cfc9190cf997f12784223c4965ed6e52a1be26d4dde31741cd3d1a2e2f3a74040d0f3868eef849727aa855f66c94791194ad5d360298364e2de9ca9288e6423f644b01d52e1bd66a9f7f00bd7995a9ca2ed16f40e902852c6250a3b52bbbf5bfd33e8\n\n# b^m = w-1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 36e6aa9acb399a50f52be0324dcef05f3cff3117f94538f6d0952b7d7be88ba4dc75d843ff7ff775e11f55c86ba6b2a6ddebd8850c33424b4d35c66321af426662e7074f0a2409a9ccf1c66ef7d823efc8240b8f3c7e9e8dd65a64e8a3ca5b26695ef17171ffe136c0593b179414c5b5ad0d66f2a25146c38b2f97e60b0472ed72de34bff1b6ac186f23645a1bbe909cdfc2b2d861eb44931568f1bb117d8a0c\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 278f2215d3ab836043fbfa472216bbdcedb775a6a0ed711754d05aa75089a9e5d8201e113d68656f37381e44483cd365f5d383bdca5ae8d1f2e6575d7873851cfff0e12b1cfe100a04cb300cbd924353fcbd3307d01242cf6a5e86e752c6f4586bcabf48b018bb97e65c3ed409fd6f67f98987517356d88344b3c8945ccd753148a37b648dd2db44d19522a69a9ad8eb23edc55340e85a198abf179ad731db41\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = afa1478bebbfe1157568f4ae53549b4c3a6a8771b816970bfac6ce5c8b962231db7a41da4d5f1d8bf504dcfe440325b54e1888bdae344eb969436a35e5c6ce5300d46313cb2fcb57fc83305f65f53d392de400e9231cbbc2ac8243defcaf7063c632b9601a81d83138274702ff336d727d3e82ccacce069843ac9c1c590c772c8c586b65c7085a1df5a47fc960d4098a22418b41f0062c77b5d55d17149d167\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 10f7030590b629e0313a61bdf46936a1f25db91b2b421f7ebb671f7844c22561b44b2f7699db61e5228ebb5817afad416325f9439eff7a82d8a630c504de12eaa44d97c79ee56e726ae74ee0b472f0d5fa8f20aee426e689cd33dd084f96bf4d928a21e815f7e8aaca4a5752f39c4a76bdfaa8227dc05d0dfa885d8b26d46fbcbf0d2e0d999d2c31ad84c306c9126539dbdf447f8dc707d29c7fa8021a767668\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 97dbb6a55c039ec926aaa5ff15a2917a2b4cafc3ca07c4c6b05f931d86c9bf60ee05cbbace194e5ca97682ec67c36394018d68c3536fbf13b50f8a7e31eaed87307759a0a48c6c58d21bc7c38b878c53db5d7a8e1fdd81abefc50470a3800852e74d76fdd1933e45f39ee97b8efb68837721890d867b32a894dd0ceb4c5844a05d384145865c10973ce748ccdd8fee73f1bf8611ce0535430b6b98fb36cad7a\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 225f58add44ed2b0a64a1d8452866d0f3c0cd45c8375e1bb33c188915c77fa11b81250b920245dda7f6126e5e0c79e6f98f89dc15db86394cf81b44f0d801e613fa4d5c6fef66fa31f26cfe6153f2e8159aad6b0351dcc0e93f9a68f649b2a77cff747b605b542d22419166befebec6cde3201e3c0cacaa2bc9d87073b8d1f1aa2b114d61de45ac8b0ad2141b43434a629ef284cd999fd82b310db7c57cf5c81\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 2780926c9cf7c1eb2aaa935d90b6d4dea44eeefdfcf9ccd4a33feb215e3a1cb2d358136a490fed18403947f3d98807819737c66e12d42c3cc8c0e246b96b3c3b0795ab875fbaf668b81b5b05bf23e258ea00a0a140a790f76e04ab619800b7597f614ffc1a1c94be2f3f1a71d64eb47d98e4653d76eabedacff3a97ecf590e6a1fd55096b7bc9314629f698d0fbe9b01a1f2bc0bf3a2c097f99f1fd222b52ed2\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 129cc5b0d9f8001b3895f1fcb4833779763636aeeeb3f980e63ea506202e6bde868444b6a58ff1dca08625f025a7e95a5eaaf1a8899eee640e3f05fbdb2867e2483bdc27c87b58684416e521c107f3667ed8dd23f0381edab767c5205a4378118bc011947cb6bdfe3fa4af50b8de876b555c9a0b2b0dae01261847f63e1e0cac2d032530bf19d5da60a04dfe22ce6343f60defbb94ccf0bdf010f89a4029720\n\n# b^m = 1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d",
     "9a6cdcf912a2dd0a12ba7e87\nB = 4e2a47cf67c3331b1e9976f583f6339cf76a8d48682d01355c25b2aed90c5544e737ecfa849c17d27a64fad7e659ef48df9a3ac0410e5c7ca8d087fc3a3ba23e5a3f000be009fcc8227ead28158c5b5d66f2efb47111638ef61cea4984de42fbd476bc2236ad02154d3ce85805c45e49d16b496e313a4052a37d4b88a3b13e598d2074a3e36a37e90278601f2b2305e034f9bf3aea8e939c3ba274e8ff4d8a14\n\n# b^m = 1\nResult = PossiblyPrime\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 2455c4ab826e2ae72708a8ff51348ce4821cb86fa89e298c751c1754211c63b2e9a712d40f0235f310606fcf296726a86973f19f890d571f5b90f026e8d24d07bc0478a3c1333171587387f1f7fe4a770b593216f2743318aabacb3320c40a4e52b9f409e1176fe8db099e93a7991eb8568168e2e486fa5aa228bb1dce9df3290ef13fd21c331479bb0f8b7a7e7f03c5211ae8cc46fa4d0f46e86b2dadeddd5b\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 9951c2c02dd7deedce29bd0c78dd80066b1d69c0e6fe4a17f7d03c6a640d866d01fc8214bafb6737efd93d80a35b8993f5367ce287459b07954e9771ffbc72ccdd812d26a9bf4be0292a24eb5c3b56f09619b1c1b481f7566f7e50e65f69f5feb591bd107fec72a783429dbde6e2607f3db2c58d4b070a45b4d6b43537e19942ce890b04ae1e91069c04a96ed03ddb2f4fc456f136b98102c70a15700dbd911\n\n# End of iteration\nResult = Composite\nW = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nB = 4cb8217d229d5f95f6d94807a99363823655d6bba6bdafa4f0dbfe7a5c538aa79c918710aad4f55caaee5ab405ebdcef29dfb76cae99fca8d5a955b6315f71a3cb2d69a217ff45aed66ba87cdc5c0de5d512c6dd12e641e9fe6a2557dd2f03bf3a18650ff139efa179f0fbe69cbb4b54e50d13177bfe7bb90de36b548d5ccfef74b05d3c08a7e2a3bb4dc8d7eb338a7a1b068c433ea204d171eda5e7c6b6722c\n",
 };
-static const size_t kLen42 = 155170;
+static const size_t kLen39 = 41961;
+
+static const char *kData39[] = {
+    "# This file has been modified to remove the 65536-byte long inputs.\r\n\r\n#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = TDES KeySize = 3 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:47 2011\r\n\r\n\r\nCount = 0\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 3bb96170d5df4cce\r\nKey2 = 25d5daa22a982f08\r\nKey3 = 52f4a110dcdc9e45\r\nMsg = 00\r\nMac = 96\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 1\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 9413d38685688f58\r\nKey2 = dc38b6b3cef125f1\r\nKey3 = 5b61f4f7a1c46ed6\r\nMsg = 00\r\nMac = fc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 2\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 101a2f13fbb69473\r\nKey2 = 76fb98f24073f4d5\r\nKey3 = 2ca2706d76d00b67\r\nMsg = 00\r\nMac = 53\r\nResult = P\r\n\r\nCount = 3\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 2f8a238552c1e367\r\nKey2 = f8131f1c26ab3289\r\nKey3 = 83d5b6ba253bea31\r\nMsg = 00\r\nMac = 95\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 4\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c1bafb5dc7100758\r\nKey2 = e9ef047a58b5ba89\r\nKey3 = 76cb4fb55ebcc1c7\r\nMsg = 00\r\nMac = f4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 5\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c82c29f1cb5851b6\r\nKey2 = 8b5b45dcbf0d8079\r\nKey3 = e6407057ae34ec0b\r\nMsg = 00\r\nMac = 03\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 6\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 6b455116f4f883d5\r\nKey2 = a81a206d25152aab\r\nKey3 = 86dc07b607202abc\r\nMsg = 00\r\nMac = 75\r\nResult = P\r\n\r\nCount = 7\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = c873d5bc4598d0b0\r\nKey2 = 1c1523cb4f794c8a\r\nKey3 = cedf6797d523dcab\r\nMsg = 00\r\nMac = 2e\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 8\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 45ce943bd31fe9b5\r\nKey2 = 677cc47c13c24923\r\nKey3 = 6b2086f14934838a\r\nMsg = 00\r\nMac = 01\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 9\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 804f9ef7baf7dfc7\r\nKey2 = 9bb6494cb60b8c07\r\nKey3 = 2080fe52e0d3943d\r\nMsg = 00\r\nMac = c3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 10\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 73c10b833e1043ab\r\nKey2 = 16dcd343645d5207\r\nKey3 = 6426f7f88c3473c8\r\nMsg = 00\r\nMac = 8b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 11\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 310d54d96bc73452\r\nKey2 = bae34f158ceafb04\r\nKey3 = 4651c1b53de3da26\r\nMsg = 00\r\nMac = ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 12\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 0e3d49d0e692f20e\r\nKey2 = a9cd384a3b688c0e\r\nKey3 = 584ae5f794f8fe7f\r\nMsg = 00\r\nMac = 4b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 13\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = b0fda857ea402f0b\r\nKey2 = d567e9f48568f1e0\r\nKey3 = 0ec2ad452a547a91\r\nMsg = 00\r\nMac = 04\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 1ac1543b1591f270\r\nKey2 = dcda0e9870b9d949\r\nKey3 = 68ea9b1c4380ae9e\r\nMsg = 00\r\nMac = 43\r\nResult = P\r\n\r\nCount = 15\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = d0b008aea4454551\r\nKey2 = 9234a7731ab610b5\r\nKey3 = 2fb97a8ffbaedae6\r\nMsg = 00\r\nMac = 4c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 16\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 04793b0b0e976d0b\r\nKey2 = bf493e58fb73681f\r\nKey3 = 1f54a262d649b985\r\nMsg = 00\r\nMac = 77\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 17\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = 043b759b578ae570\r\nKey2 = 5e522f19cb9de092\r\nKey3 = 2af2e90eb6dcc1fd\r\nMsg = 00\r\nMac = 77\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 18\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = e58520088910513d\r\nKey2 = 7c10196e1a310dd5\r\nKey3 = 5b043b2a1ab97f85\r\nMsg = 00\r\nMac = 1c\r\nResult = P\r\n\r\nCount = 19\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 1\r\nKey1 = f27fd0f189452c15\r\nKey2 = 04681651014916ab\r\nKey3 = 204046aeeffecd15\r\nMsg = 00\r\nMac = 0b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 20\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 860864a710ab0475\r\nKey2 = b9205751bfd91f7f\r\nKey3 = 3bf72abf13d97640\r\nMsg = 00\r\nMac = e890abe6ea126215\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 21\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = a7a1d57aabf1137c\r\nKey2 = fd0df2e35b8cdf2a\r\nKey3 = b386755bc2ab3d9d\r\nMsg = 00\r\nMac = f475587c2101eff2\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 22\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = c2c28a4c7698804c\r\nKey2 = ab25b53783dc0419\r\nKey3 = ab16341f4cead054\r\nMsg = 00\r\nMac = d335575aa3a4d8af\r\nResult = P\r\n\r\nCount = 23\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 7594a7aed3e986ba\r\nKey2 = 52a280e662d9e9da\r\nKey3 = 7649d3ad6838f2c2\r\nMsg = 00\r\nMac = 0e109f43557f250f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 24\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 0798d9ef158cd698\r\nKey2 = fff4ade09b169762\r\nKey3 = 5b6e6849ec2c238a\r\nMsg = 00\r\nMac = 05af623529b168a9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 25\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 254991cb4af76dc8\r\nKey2 = 2cf2e915918a025b\r\nKey3 = 2c61bfaee69b2676\r\nMsg = 00\r\nMac = 725ab7a770762894\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 26\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 9f68cbbf3bb5b3da\r\nKey2 = 31adb5a46e2cc8e3\r\nKey3 = f86ed9eaabb625da\r\nMsg = 00\r\nMac = 0422d94f874dda7e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 27\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 1fd51f70a77ac8e9\r\nKey2 = 5dd9986e974c08ec\r\nKey3 = fd61ce34a75279f7\r\nMsg = 00\r\nMac = a163a5d269b3cc3e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 28\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 078c57d6df9ba1d5\r\nKey2 = 08d94ac1b3d3c183\r\nKey3 = e90bf4fe7973c2c7\r\nMsg = 00\r\nMac = 9af3f01e20dc7c1e\r\nResult = P\r\n\r\nCount = 29\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 08df322f040e7c01\r\nKey2 = e92343e69d83eac7\r\nKey3 = fe94c1ec0da22c1a\r\nMsg = 00\r\nMac = 3d88c20a4f828c5b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 30\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = b2ecf41c8692c2b0\r\nKey2 = 8ff18c1f1f296454\r\nKey3 = 383dcbc4a28c7629\r\nMsg = 00\r\nMac = 17241dc726fa4c56\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 07d99d58f2ec1fd5\r\nKey2 = ea46c73bf4b60ed0\r\nKey3 = f20ec149c831aecb\r\nMsg = 00\r\nMac = f6a8a0b536fd97d3\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 3dfdc19426fbd56d\r\nKey2 = b03b7985b32af857\r\nKey3 = a807c7b3621ffdda\r\nMsg = 00\r\nMac = 3ef9b263ae1df460\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 33\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = fbc79bab46b97923\r\nKey2 = ece6da4c40f1e6e9\r\nKey3 = eaa76770ef517a40\r\nMsg = 00\r\nMac = b2da3efa7fc64abe\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 34\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 5ba4a1d5a80db5ef\r\nKey2 = 7ce6aeb9261cb00b\r\nKey3 = 8a5df23ea445e0c8\r\nMsg = 00\r\nMac = 51b2e75334d90889\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 35\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = e9c494e001027c86\r\nKey2 = c4649e58ea251904\r\nKey3 = 8025343dec34409e\r\nMsg = 00\r\nMac = 166123f1c59132a3\r\nResult = P\r\n\r\nCount = 36\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 6bce61e646452a46\r\nKey2 = 54ba8a020d0876fb\r\nKey3 = 34ea2f6149bad664\r\nMsg = 00\r\nMac = b0d0f625f06f2a3a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 37\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 2f38f79bc8e0ea4a\r\nKey2 = d09876f22ca43e10\r\nKey3 = 3b8fab02299d328c\r\nMsg = 00\r\nMac = b26d377a504b8985\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 38\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 51febf790815f1d0\r\nKey2 = 9152d5e32f6713fb\r\nKey3 = 4a40c2c8fdb9f2b5\r\nMsg = 00\r\nMac = a27978e62026743b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 39\r\nKlen = 3 \r\nMlen = 0\r\nTlen = 8\r\nKey1 = 10ba8fd6256ee9a4\r\nKey2 = fa8332a46ead52ab\r\nKey3 = b0e06e1fef04abb5\r\nMsg = 00\r\nMac = e1b0a228c142555c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 40\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = f2fbab6734769e9b\r\nKey2 = ab45910e5775ab0d\r\nKey3 = 5bd5ea0db015a89e\r\nMsg = 7efeb7d4d14b3f2b3df4b8a276b18b49\r\nMac = 5c\r\nResult = P\r\n\r\nCount = 41\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 5bc776ba64adf4ea\r\nKey2 = 195e04987c62a4f2\r\nKey3 = c1642fdc1a31705d\r\nMsg = d1fb4f35914404af9df3bf5c368c0e69\r\nMac = 4d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 42\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = b67c57f770202c6e\r\nKey2 = e91f4fb361bcae37\r\nKey3 = ada8d3df4fbcf4b9\r\nMsg = 9800db878187c87ea05bf92054b0e3e3\r\nMac = 8b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 43\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ce0bc48002fe7602\r\nKey2 = e702abe31c7a2313\r\nKey3 = d61964867f2579da\r\nMsg = 704e4e75be1623b21332c14555bf5edc\r\nMac = b0\r\nResult = F (2 - Key or Key2 changed",
+    ")\r\n\r\nCount = 44\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ad75e32cc11980f2\r\nKey2 = d0570429680e9486\r\nKey3 = c2379207f862dcfd\r\nMsg = 197de855b3962b1fdad687f9c4f1efd6\r\nMac = 44\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 45\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 9db504803d29f126\r\nKey2 = 07fe58b3da765bad\r\nKey3 = 6dc489516e9bb5f8\r\nMsg = 8f296b265fa575d146799f9e39d52965\r\nMac = 14\r\nResult = P\r\n\r\nCount = 46\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 991f0ed04079293d\r\nKey2 = 57077ff1baecd907\r\nKey3 = dcc7a719c4372967\r\nMsg = d9cfcc67520c5b2ceeb622c694a8e3fe\r\nMac = a3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 47\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = eca815d6b0371cf1\r\nKey2 = 597980cdb6c892df\r\nKey3 = 3dba0ed3ba16ae1c\r\nMsg = a03636db2fdc84722aeb9d98a6ed70d0\r\nMac = 78\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 48\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = ea80a43d5886dfef\r\nKey2 = 08bf4f76a8893732\r\nKey3 = 4557a13752d6730d\r\nMsg = 0371a63ad722523ef297d8399b124593\r\nMac = be\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 49\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = e9fe73e640808c02\r\nKey2 = 9be6986446012091\r\nKey3 = 707023615462a40e\r\nMsg = 83bcb484dca73d49ac234ece3a5d2ad3\r\nMac = d6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 50\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 1fe9800ecb0dd9f1\r\nKey2 = dbbc6bc72c794c23\r\nKey3 = 899b08469b6bc8b5\r\nMsg = 95f4a41c4c64cd7310fba748aa267a14\r\nMac = 59\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 51\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 34546261a21c1c43\r\nKey2 = 0449eaeca4f29725\r\nKey3 = 4cc4e6525186802f\r\nMsg = d204de1e671d3e43670dd67fee114402\r\nMac = 6e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 52\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 048aa8701fb5fe26\r\nKey2 = d56bd53d83e60bd9\r\nKey3 = 6707d6523ebc32f4\r\nMsg = f4e9f92fd2c9313fb61a889eaa4ff283\r\nMac = d5\r\nResult = P\r\n\r\nCount = 53\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 6ec19b02976e5ba2\r\nKey2 = 13540732d997c2b6\r\nKey3 = 7f4068926183251c\r\nMsg = 963363ab7c82b634974954bd0fe2c307\r\nMac = d7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 54\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = f4ecea5d32e32c6e\r\nKey2 = 385710cd3eb0fe51\r\nKey3 = 5d4c8f7ccdf10154\r\nMsg = a298857dc60ad2f0a8fa878607b50c18\r\nMac = 4c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 55\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = b31ff49dd970f8e9\r\nKey2 = 164aefb00efb5461\r\nKey3 = 981629757f4532dc\r\nMsg = fc3957b2ed0558bce61d478be615b774\r\nMac = 90\r\nResult = P\r\n\r\nCount = 56\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 85384543d3aef157\r\nKey2 = 57ea916d9b2fd0c8\r\nKey3 = 1a85830473fbe6c4\r\nMsg = 87db0d9d69bc0cf69cabeb92570e482b\r\nMac = 53\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 57\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 9bf8fb0b464070f8\r\nKey2 = 10ea23c7e5a19bcb\r\nKey3 = 408c236e10863e2a\r\nMsg = f9c98cd8a7d27553da946427b8276349\r\nMac = 53\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 58\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = 91b083e9c8e9803b\r\nKey2 = 76d0341cd54c38e5\r\nKey3 = 07bca7f44a3e76bc\r\nMsg = 7e5b64dc6bcbae6bb4496fc033947343\r\nMac = de\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 1\r\nKey1 = e6795b1ffe8f3e38\r\nKey2 = 4fdcea8c73c76e75\r\nKey3 = df0726ae4c079461\r\nMsg = 5265fb6a796d99a6beec6f71ba267b5d\r\nMac = e0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 60\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 375710c76202bff1\r\nKey2 = 3bb96170d5df4cce\r\nKey3 = 23d5daa22a982f08\r\nMsg = 52f5a110dddc9f44f8a534eef9df0b22\r\nMac = b1b9e11939228900\r\nResult = P\r\n\r\nCount = 61\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b59b855dce76adf4\r\nKey2 = be9bae10fe34fb1c\r\nKey3 = 0d49159bf804a4ea\r\nMsg = 869f3b62ee78bfeb5287168eacf69ccb\r\nMac = 169a389352793c8b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 62\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 615d792a7038fd89\r\nKey2 = 98ce972f016e75a8\r\nKey3 = c470255783b32f01\r\nMsg = e5aed6715aa4291f9c32baf6b8449b53\r\nMac = 73ac2da999bfdf5d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 63\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 1fb09443a1074564\r\nKey2 = 3d1aa82c086eba13\r\nKey3 = c137d0f4ea54d604\r\nMsg = 16f02efd285381d7657ca5cd99d9e25b\r\nMac = 38126d16957893ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 64\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 2e5d163461fea761\r\nKey2 = 9173bf75372fb640\r\nKey3 = 9e3d1c3dcdbfbc31\r\nMsg = b10fcb03443302ae929ff95a17b025fa\r\nMac = b70f2d761ca643c9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b9e5861c1c4013d3\r\nKey2 = d554806efd3801a1\r\nKey3 = 64d9bc3d646e76dc\r\nMsg = 0e6c9fced82669cffe7b5a6f09dceec8\r\nMac = 78ce4635e486635a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 66\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = ad2376516b974c70\r\nKey2 = cd3b5870c2312929\r\nKey3 = 1a731a7feacbf783\r\nMsg = 88eb7a0379da9d113343dc1fe0f3e6f7\r\nMac = 0c949483e7fa7d0c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 67\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 9ada194c100eeacb\r\nKey2 = da23ad9825c194d0\r\nKey3 = 3ef1f4c438dce031\r\nMsg = 0f9703a3454c25c0b1053de62b0ffc5b\r\nMac = c78a4ca3662527e5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 68\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = e375f870f4d55b02\r\nKey2 = 1b015791e3e337b3\r\nKey3 = 370dc45b15671c5b\r\nMsg = 5ad9dd3b112ea4cee1654d2dfabab01e\r\nMac = 22becbbe7bfcade5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = d61f4aeff4b5f2f8\r\nKey2 = 0486b53de3ecc297\r\nKey3 = 807fe92fc2fed376\r\nMsg = d094cf77a709c0fa5d6b4b7e9e86a2c2\r\nMac = 947d024d9d5359a8\r\nResult = P\r\n\r\nCount = 70\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c2c28a4c7698804c\r\nKey2 = ab25b53783dc0419\r\nKey3 = ab16341f4cead054\r\nMsg = 7295a7aed3e987baef19ad68c33ba5a5\r\nMac = 58de82acc10d556f\r\nResult = P\r\n\r\nCount = 71\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = f1ce4992c851e3a8\r\nKey2 = 835ec1abef97f2c8\r\nKey3 = 5b92384f20dcc2ad\r\nMsg = 9094935fcd7c389dd17b5b121cddadf9\r\nMac = 319c70370c172de3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 72\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c16ebcc1165d6892\r\nKey2 = 75268c4602f8c8bf\r\nKey3 = dab97f79544cf1cd\r\nMsg = b7ba1c66282cb6092ba601407ff9578a\r\nMac = d73c26311bd44a32\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 73\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = fe4a796720a46dbc\r\nKey2 = 98f45289e9f8b080\r\nKey3 = e05def5b25520d43\r\nMsg = 31c9eed491bb0cda9b8c0eb5afa31019\r\nMac = 8c2ce22633c62751\r\nResult = F (1 - Message changed)\r\n\r\nCount = 74\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = eefb40c715c4546d\r\nKey2 = 5b2325c8d9daa48a\r\nKey3 = d5ec4a6bc82a7a62\r\nMsg = 5a97259dfa081f040d3893da2f231ca3\r\nMac = a64113544f509be8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 75\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 0d0851311ca45db0\r\nKey2 = 3d7c458957c8c408\r\nKey3 = 98d37c9d51ab2f25\r\nMsg = 8be16380af3e2dbc6cf678c2e3331335\r\nMac = 8817baeaa909e33a\r\nResult = P\r\n\r\nCount = 76\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = b7239438d61cd626\r\nKey2 = 082c6404cb3897b5\r\nKey3 = c4c732cdd5e043c2\r\nMsg = 7120f19169e7cbb913c7d1f0ceb006c0\r\nMac = 32841ad7621cc0fc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 77\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 73f449ef83df75e9\r\nKey2 = 5f3d2016bfd0703b\r\nKey3 = 31abc16b58b64af4\r\nMsg = 83ecbfcff3bc37f1305d83bc0290350c\r\nMac = 8f8ba8bfc74203fa\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 78\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = 9b6ea461c7b9abe6\r\nKey2 = 4a08dcdc5b9e01fe\r\nKey3 = 6b850e9b6ebae9d6\r\nMsg = c538416fba487fac5c94449d0757f3e9\r\nMac = c13f372e9a061db8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 79\r\nKlen = 3 \r\nMlen = 16\r\nTlen = 8\r\nKey1 = c7aeeacb156dfbfb\r\nKey2 = ba43ef516232a7d3\r\nKey3 = 2c572aea62808c68\r\nMsg = a1bc9950759d0df4cffaf29345dfb340\r\nMac = d7dad4519b56a1eb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 80\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = cda4d34370234946\r\nKey2 = c408ea6bec07c78c\r\nKey3 = 19eff7f798fd6808\r\nMsg = d1fb0b68176269cf9fda18bf13efc054f0c24fd042b9e2ecaf75e86cb60484f6\r\nMac = d8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 81\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 02100be5627686a8\r\nKey2 = 7f0b38ec073e75ef\r\nKey3 = 373b1a64ba5416d9\r\nMsg = c60be37fb0bda4f46894690b3344643c772fbd2237db348adaa407ca2eae1654\r\nMac = fb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 82\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 7597571a6e7c6bc8\r\nKey2 = c143a2a461626b1a\r\nKey3 = 6b1307d910434cc7\r\nMsg = 49cb128641f7952dfdf34f338da268b2ef1482557b593e",
+    "c57f930164264ff83e\r\nMac = 90\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 83\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = ae89ad615201546b\r\nKey2 = ae20765745458fce\r\nKey3 = efd0867fba43dcb0\r\nMsg = e47d8659c9ad94971adedd6bce744206e1cfb65d042b942d93c4363cc73ec3e3\r\nMac = 95\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 84\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = b65886f13d6e8c4a\r\nKey2 = 0708e0b0730473a8\r\nKey3 = d04f2a86dc0b9e7a\r\nMsg = b97c12251d91512fe7b3a349a982409c7412f39494d970e77acbe9d3fac3dca7\r\nMac = 05\r\nResult = P\r\n\r\nCount = 85\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 3197a4a26261588a\r\nKey2 = 0dc4a75ec8b99b58\r\nKey3 = efb93e7620205289\r\nMsg = 65f4b3a00c1c1ef39445a69b2150b034705410140ff9dad0ce21740271cef04a\r\nMac = 57\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 86\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 62c4a16e946b4313\r\nKey2 = d09ea80e7fb33449\r\nKey3 = 164fdc04c2d5f116\r\nMsg = 898e824fdc89f21779156a9e58564c4b99004b95226c2ebb8aebd0b5365a6c6a\r\nMac = 93\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 87\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 6eeff20d3d5d5223\r\nKey2 = 258076b313611c1c\r\nKey3 = b013b957f70d9e62\r\nMsg = 2d7fec1a1e9ee85cf960e5dc4e239619ed85f4b14d32cbd42dfa79f77a27f2cd\r\nMac = 0a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 88\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 193e23e6fd8aa185\r\nKey2 = 1910cbdc549da804\r\nKey3 = 6b769b4923523425\r\nMsg = bd65798a1d02ab164e2d31b1387e505874779539046820bd429043c617854c36\r\nMac = d3\r\nResult = P\r\n\r\nCount = 89\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 150789ab37ef2ce9\r\nKey2 = 10cdf45dad9ed9e5\r\nKey3 = f475fd3e153898fe\r\nMsg = 044dd73a7d1ef37a437c09e9268708c82ebad189dc1e989ab3bd8d7ff75abc23\r\nMac = e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 90\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 48d9d08a6bdcc4f8\r\nKey2 = 1383641c08735d0e\r\nKey3 = 374a89c8cb73a7f4\r\nMsg = d62fb84f2a2442b52acf817d7f067edca031970bea092c35f29f9a931aa06dd6\r\nMac = 26\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 91\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 68f4620da8b00201\r\nKey2 = df1c8362345180d3\r\nKey3 = 26abda897f89d90d\r\nMsg = 0ac3f7f22d24b64aa584845d3a990bb69e5d2d4650640056c16c17c0b636045f\r\nMac = f9\r\nResult = P\r\n\r\nCount = 92\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 1c259df7492361b6\r\nKey2 = cd4acdb65b3e5b1c\r\nKey3 = 3b01addc2579ef64\r\nMsg = 607f4730a5ea9dabfbcd8586f680c3021c7ebc858e73354beb975d58713b0eb1\r\nMac = fa\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 93\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = f18a9dba9db5dff1\r\nKey2 = d5987013a4b69e38\r\nKey3 = dc16e0ce1351e3f4\r\nMsg = bfe99e184a7d7bf0b4ade8f402f2c49aa4948e74b2d5c905756ba5d32934dbbd\r\nMac = e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 94\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 8361bac48afb1091\r\nKey2 = da85400d107fbf8f\r\nKey3 = 31ec732cc29d7045\r\nMsg = 3a1ee70d4607325c13bff68e402e0a72742f6a63ae972c6dda74b6b2a3922f0c\r\nMac = 0e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 95\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = d0df1adf1cf72032\r\nKey2 = 1504d564ec1aea61\r\nKey3 = c42fada45d80a43e\r\nMsg = 3a53d9c7ae59e7811699fb0973e43256ed92162267c7ca4b57f5887ad5a24e02\r\nMac = 8a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 96\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 973bfe5b3be573da\r\nKey2 = 94b3ec7f343e46ab\r\nKey3 = dcaeabc8df405db6\r\nMsg = c8437dba76591a9031b3aa3b59fec0562d4eac439ca8efca57c3f2022b0ff775\r\nMac = 53\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 97\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = bc89867c43a74640\r\nKey2 = df347fb319464c80\r\nKey3 = fd92108a266bcdcd\r\nMsg = 1c9898ede16139560519e808ee9ddaf710a5bab30f54ed98230d1a44c189ea4f\r\nMac = f6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 98\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = fde925e301897f67\r\nKey2 = 54b3ab80f815df15\r\nKey3 = dc58928aa286c8e5\r\nMsg = b34f898d98a3aa0fa022b1b1d76953a5b3ecc88d60f2c79b59e1b1f636bc0d60\r\nMac = 0f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 1\r\nKey1 = 8a704ffe43e951f8\r\nKey2 = 2346dc8501202a40\r\nKey3 = d67afed616230113\r\nMsg = b2b4cb5e90ebf4bd265093b7f5efd4d62dc60e29737aa496e14929724e40c74f\r\nMac = df\r\nResult = P\r\n\r\nCount = 100\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 8c1f29f440f7f8b5\r\nKey2 = 5b45fe8f1f688661\r\nKey3 = ba40f43d9e7cc86b\r\nMsg = 220817144a15a0a654fc1beaabce60270aa72df83591754ee7a5fbb40b7420d7\r\nMac = 80ac51c2ef7bd5d7\r\nResult = P\r\n\r\nCount = 101\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d66e76d97f94ea16\r\nKey2 = f15e3ed06dd94598\r\nKey3 = ae073d1a6e5bc819\r\nMsg = 233d547ab33790859ab0dbc7a93f3bbebb610bed9acbfbce1fff580e9a1e8ef9\r\nMac = 4cb8ce681e4bc7c8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 102\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 0437836df770e943\r\nKey2 = c96e2c43bffd5298\r\nKey3 = 8552fbc16215e0c4\r\nMsg = 4f87d730bdfc7a7c72525c6b26ee9cae9a219b30d9575fedbd913a07b615a616\r\nMac = ea79cbc28f4264db\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 103\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d849ba8570b6ef9d\r\nKey2 = f1405732aeb61f92\r\nKey3 = 73c8e51ff167f857\r\nMsg = fd03202d0bd109b6e4299c7390c1407cd21ffb110013e6381185dea8f8707de6\r\nMac = 71070b17d05dabef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 104\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 914cef7ab6d998dc\r\nKey2 = a767abc18cf485e9\r\nKey3 = a2624ff20b2a408a\r\nMsg = bc5ce4c0bf3ad1a93e5306c9d7dbb620dde8708efe84e78c2200f41a958cdef8\r\nMac = 3cf4aaf3d337c9c8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 105\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 757f52e626eabce0\r\nKey2 = 700d91f14554bcb0\r\nKey3 = 548640d0dfaec2ab\r\nMsg = 22a4cf581584346095783be0982744c6201ff040760f868ab63895058d1edb88\r\nMac = b008b1150535ef11\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d65d0e58d3133b34\r\nKey2 = 289e58704994a249\r\nKey3 = e3df20ae3d585e2f\r\nMsg = 94c8414cbbec52e2d73bb8f02ef687c91432495c0c744666317d02e6d46706d2\r\nMac = b1292e1c7074dcfc\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 107\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d77a4989f4a17f2a\r\nKey2 = 409d91d51fa4d045\r\nKey3 = 6bb652ea1526fd4f\r\nMsg = 7a08ce579ae7af8004421cff72715e0b137da81f47d8f84da34c3ed53c32c0f6\r\nMac = 8b3cb70477ca7ca8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 108\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = e670c17519d9c2f2\r\nKey2 = dcc8a132629b462f\r\nKey3 = 58c1d52543ad570d\r\nMsg = a6dbad96ad23ff61479df39b99f0673a09f2a7eaebbd34b95d05c4146fa989f2\r\nMac = c470ec40599a0a11\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 109\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 290d292a15b6268a\r\nKey2 = 2638d9ad83ad1f34\r\nKey3 = a7d9ba62735dc2d3\r\nMsg = ef995cbfc49b0ebccdbd37d9f40a431c385d33d4b8234d7f0d6211eaddfb709a\r\nMac = 67ae62fb8142bd8b\r\nResult = P\r\n\r\nCount = 110\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 4faba73bcd5b5dfe\r\nKey2 = 1c97ea85207a97a7\r\nKey3 = 19eff116100dc82f\r\nMsg = c48e53c6956432460584c7ee1577c1c38b7fae2ff288199be25bf64081154139\r\nMac = d68a4558e95a67e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 111\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = d37c3dbc2f68baba\r\nKey2 = 918cb5e39237e016\r\nKey3 = f286b0739d38c4fb\r\nMsg = 2533361761ac80578fa262a50462045e3ec6e4d5d25c6e99a5c4ccf75f5affc0\r\nMac = c20f36e67732f864\r\nResult = P\r\n\r\nCount = 112\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = a0baa71c38d6d064\r\nKey2 = 8f58ba45cb494ab9\r\nKey3 = 853decc431f7b3cd\r\nMsg = 20e394c7cc90bdfa6186fc1ba6fff158dfc690e24ba4c9fbf11b68519d573a8a\r\nMac = 4ba956b98a99d7bf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 113\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = b69752407c68b6bf\r\nKey2 = 8fceb05201ec4320\r\nKey3 = 2a755e372373ef26\r\nMsg = e884d65c87411584a56956d5b27ca9725b473c205b64cff09400671f5ee0473a\r\nMac = 9f3de5e8cddc374d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 114\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 8c04e0f27f83b0ec\r\nKey2 = 042cfb6883348fe6\r\nKey3 = 404f5dfe587ab591\r\nMsg = 8a34cd562b111fe04fa0bf5e004faedaef99d0bab9344d966c8b3847486e6f40\r\nMac = 6c530215fb25015b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 115\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 429401ea49cd97b0\r\nKey2 = a8f1b6b63101cee0\r\nKey3 = 20bcd08c5d16e049\r\nMsg = 591d88123fc9a786b247e8d5ce155f136d6fe4084117c41f2056b67f9e3e1077\r\nMac = 6c414640b424cf56\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 116\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = c470255783b32f01\r\nKey2 = e3aed6705ba4291f\r\nKey3 = 7319100e54f432d3\r\nMsg = 01acc3282fe41b62f95f5dbfb7e7bfef694c5fe34ca87d31abe7e7bbf887b48c\r",
+    "\nMac = cd99df4814667454\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 117\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 73c10b833e1043ab\r\nKey2 = 18dcd343645d5207\r\nKey3 = 6426f7f88c3473c8\r\nMsg = 068e4a0b1a62dd64198f1b9ece814c2feeeee50ba814b70d7d42659952991b80\r\nMac = 1fc90834b7dd090b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 118\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 37eae98ff42afb25\r\nKey2 = f2231c028c29da9d\r\nKey3 = ef3da8d0c77fbf45\r\nMsg = f266cec01c5fc08c0bdabc9537bd1aa2df9f2b8ffbe5cc94722a3bca8de529ea\r\nMac = b3809c8b0eb9dd8d\r\nResult = P\r\n\r\nCount = 119\r\nKlen = 3 \r\nMlen = 32\r\nTlen = 8\r\nKey1 = 1358fb67155e0145\r\nKey2 = d02c54a1206b5d7f\r\nKey3 = 1c04ba46c74a5d49\r\nMsg = e38b4c3e7a82643beb3192426555ad9c9b2620d677373fc40c9ddbc4cd531347\r\nMac = b000e2ea1ef48a8f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 120\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f6b9a81067255b58\r\nKey2 = 927cfbc4cdec9285\r\nKey3 = dcd62345bfe03b92\r\nMsg = 246b66b10696adc45840\r\nMac = b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 121\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = fea186dc73d3807f\r\nKey2 = b8fec7387a197962\r\nKey3 = 4c91abe60db64ff1\r\nMsg = 8ba298364af144a8d5f3\r\nMac = a6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 122\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f264da8607ea439e\r\nKey2 = fdb9daa41fd34958\r\nKey3 = f85d6b859b9892bf\r\nMsg = 402006f6b18dbd11dcd1\r\nMac = 28\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 191c461adc4f7f4f\r\nKey2 = 75b932e68cb98cfd\r\nKey3 = cb2943857a1c9438\r\nMsg = 391deef3a9a41394d14a\r\nMac = 3c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 124\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = a2c2f713430ece92\r\nKey2 = df081ae9627a1351\r\nKey3 = c1ec469ba8c73b67\r\nMsg = 37a49535684637f67573\r\nMac = 40\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 7b61dac238ba3e83\r\nKey2 = d05e9ed34fc410ce\r\nKey3 = 98da194c100eeacb\r\nMsg = da22ad9825c195d1e297\r\nMac = 43\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 126\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 13aec10d13fd37c7\r\nKey2 = 89198c3bcd38b951\r\nKey3 = ecf843cdef7397cb\r\nMsg = b7625aa78d2961c0fee6\r\nMac = f1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 127\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = d94a68ec329d914a\r\nKey2 = 394a8acea420e952\r\nKey3 = ec04c8cb8602aec8\r\nMsg = e043f30a405c41938914\r\nMac = 6f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 128\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = d5cb7579582fb6a8\r\nKey2 = e67f3ba11383d61f\r\nKey3 = da370852e9b9c2a1\r\nMsg = 7d32f440151a7069fd73\r\nMac = b7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 92402f6eb54526b3\r\nKey2 = 924515d92ad5a1d0\r\nKey3 = 9ead2adfb025f81a\r\nMsg = fd44d8d0fea5cfdf3321\r\nMac = 2f\r\nResult = P\r\n\r\nCount = 130\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = a9daad97ad23fe61\r\nKey2 = 32e5988a37987a38\r\nKey3 = 31626d16a780c825\r\nMsg = d6cf17192f8ad745ab5b\r\nMac = 8f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 131\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 52c457d9d5d5ab94\r\nKey2 = 9d3875ba6d75fdba\r\nKey3 = 4fb91a863d15ce52\r\nMsg = 4effbf732e67af7203b3\r\nMac = 04\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 132\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 7304b65492fd0402\r\nKey2 = 62a4cb7c23708057\r\nKey3 = f2f7bf13839e01e5\r\nMsg = a630c0f362eef35b6a58\r\nMac = aa\r\nResult = P\r\n\r\nCount = 133\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 51b33425a1349792\r\nKey2 = dc5b8ca440eae6ad\r\nKey3 = 70adf49dd0a8f119\r\nMsg = af246a8a810cca5e657b\r\nMac = 0b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 134\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f22029ce51619e0d\r\nKey2 = 9d51bcc2089785e0\r\nKey3 = 689d62621abab3b0\r\nMsg = a9c9fb632423d367b3eb\r\nMac = 0c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 135\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 1ca226d0dc8c328a\r\nKey2 = f18a9dc176621f51\r\nKey3 = 3d765d20e03b4cea\r\nMsg = f9d9fb44919e47cdeaf8\r\nMac = b0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 136\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = f3ce4992c851e3a8\r\nKey2 = 835ec1abef97f2c8\r\nKey3 = 5b92384f20dcc2ad\r\nMsg = 9094935fcd7c389dd17b\r\nMac = 3c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = bfd929cdd9c2089d\r\nKey2 = 8e49988abcfbf458\r\nKey3 = da73d986894fce4c\r\nMsg = 88018424fdb76c908bd6\r\nMac = 94\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = 57bf2ca4e3629797\r\nKey2 = ef7f675443402546\r\nKey3 = 6e4f924038f8bc92\r\nMsg = dd4f0a872f4b7089d697\r\nMac = 5b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 139\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 1\r\nKey1 = ba86924908df08b3\r\nKey2 = 26b954ba52df2c98\r\nKey3 = bf38cb0e89b9f4cd\r\nMsg = a682e6fd64df4b9f4fe8\r\nMac = ea\r\nResult = P\r\n\r\nCount = 140\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 52859849a4b6c1d5\r\nKey2 = 380e73c7aefb0168\r\nKey3 = c479fef80eb6260d\r\nMsg = ee6857533675b5ed8d43\r\nMac = 43fd25f696cb0693\r\nResult = F (1 - Message changed)\r\n\r\nCount = 141\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 97ae01315d13ec52\r\nKey2 = c7674cc1ab0bbab3\r\nKey3 = b68fb99797b33b79\r\nMsg = ce9127f649bfff849826\r\nMac = 2dfe01d9bc07646b\r\nResult = P\r\n\r\nCount = 142\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 2b257032b0d9b0b3\r\nKey2 = 49f7c10e8a9bcd37\r\nKey3 = 20f4fb4679106ddc\r\nMsg = b2c62d03902c44253368\r\nMac = 14c5ccf5f9433a0f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 143\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 0b988c3d380e5b80\r\nKey2 = b86be99162029b54\r\nKey3 = e0bc9775838a58ea\r\nMsg = 61ababff3763183c348d\r\nMac = 28a2de26aa6b4074\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 144\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 26e9abbf201fe5b9\r\nKey2 = 7062a82f800d5183\r\nKey3 = cd45e654bf5d205e\r\nMsg = 020683e1f0392f4cac54\r\nMac = 6f1522d3c8186217\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 145\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 3443f4016dadcd86\r\nKey2 = 235dec80323e5838\r\nKey3 = fd583285e6efbc51\r\nMsg = e64eeb89828b4297601a\r\nMac = 5575a40dba5bc4c6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 76c7616785916470\r\nKey2 = 5b3d1f10e5252fda\r\nKey3 = 75a2d632a46ea18c\r\nMsg = ac7d701597f0ba879055\r\nMac = 06b98e161e6a6754\r\nResult = P\r\n\r\nCount = 147\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = f12367b568a758b5\r\nKey2 = 7b2f9770924f2c0d\r\nKey3 = 1f8ad9e9b97a088a\r\nMsg = b99de8168e8c13ea4aef\r\nMac = db534a059f930ee0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 148\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = f1adb67986923d8c\r\nKey2 = 02671957dcf75808\r\nKey3 = 52732ae970467019\r\nMsg = f759c3033d4ed34948d7\r\nMac = 2d9caabf50999ac6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 149\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 792f9770924f2c0d\r\nKey2 = 1f8ad9e9b97a088a\r\nKey3 = b99de9168f8c13ea\r\nMsg = 8bae64015d62f68565d1\r\nMac = a42f89527f5cb219\r\nResult = F (1 - Message changed)\r\n\r\nCount = 150\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 31ec790d4a8a131c\r\nKey2 = 562c8cdc07e331d3\r\nKey3 = f4a7467043924c4f\r\nMsg = 1798286c37c1504fc0d7\r\nMac = f0d6e2f7edce6349\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 151\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = adb692e376a12585\r\nKey2 = 8c8c4362ea97f810\r\nKey3 = 528f204c19f21a31\r\nMsg = 6543e675d34639a7f7eb\r\nMac = fac96e6804526535\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 152\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 62984a64ec7c4a92\r\nKey2 = feda64dfd9a24f9b\r\nKey3 = cbb04f7a1f26df31\r\nMsg = adb555fd5f5c6bdd9c4e\r\nMac = e8dee8714b285a00\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 153\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = ef0d58b55ddae95d\r\nKey2 = 80e07ca4aebcfd34\r\nKey3 = bf947ff4ab2904e5\r\nMsg = 1fe87a2f431f3718665a\r\nMac = 44a869aee76d79db\r\nResult = P\r\n\r\nCount = 154\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = aef4ceb55e3d37fe\r\nKey2 = bc0bb9d05bad972c\r\nKey3 = e0a29b2c7940ce9b\r\nMsg = 78ad5f3718acf9e8cc7c\r\nMac = dcc1d44200caf6f7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 155\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = a4403438f8fb254f\r\nKey2 = bac752cd83a170b5\r\nKey3 = 6bf71654f1854589\r\nMsg = 349566b6716e5f831d69\r\nMac = 7c08cc43ff4d8e07\r\nResult = F (1 - Message changed)\r\n\r\nCount = 156\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 2fc7f4c1ce042f73\r\nKey2 = 8346bf7a80b38640\r\nKey3 = 2ff74abfc197a732\r\nMsg = 43a32b8ab9b7ce4bbd1b\r\nMac = 8000a2612215014a\r\nResult = P\r\n\r\nCount = 157\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = c40ddc9e29ce041a\r\nKey2 = 583d6bc4c1a2abf2\r\nKey3 = 9b018fd5a4084a64\r\nMsg = 228",
+    "6a1eddd80737a724c\r\nMac = 0ff14761c982f890\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 158\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = bc327a0bcb2575df\r\nKey2 = 6b9483e6e0755d2a\r\nKey3 = 622cdc5b2916ab89\r\nMsg = e1be89af98ffd7d9257a\r\nMac = d6f4c8d96b3e2180\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 159\r\nKlen = 3 \r\nMlen = 10\r\nTlen = 8\r\nKey1 = 9e517cd616a48ada\r\nKey2 = 6d266192d5387a97\r\nKey3 = 8a081fda97c86b94\r\nMsg = 9e9fb0b2b77be6eeaae8\r\nMac = ba0b73fbffc0ab0b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 160\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = e0b9a826a85efe94\r\nKey2 = 4f615bce7cc1ba68\r\nKey3 = 3bb56d3d9816103e\r\nMsg = cfe9ee956cb1f5a60aa6ec79a3e454224b456879\r\nMac = 64\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 161\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 1e08a794a175b69e\r\nKey2 = f7d3ab46aeb9073e\r\nKey3 = 3e7cf8cea19d0891\r\nMsg = eb4f5b04517ee93e2c900e01948ac81ca56b2b26\r\nMac = 79\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 162\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8f26700dc140570b\r\nKey2 = 8325e3a889c823ad\r\nKey3 = 6b048aa73decf83b\r\nMsg = cefb55151933a488e2b3d421dea9720727188106\r\nMac = 85\r\nResult = P\r\n\r\nCount = 163\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 3443f4016dadcd86\r\nKey2 = 255dec80323e5838\r\nKey3 = fd583285e6efbc51\r\nMsg = e64eeb89828b4297601a5b3fcde60075fc2424ae\r\nMac = c0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 164\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 91a401cbb6460b16\r\nKey2 = 85438675f15b6e73\r\nKey3 = b09140318a767038\r\nMsg = 8c65cde13149d9d54a5bccc17747f1d5f3e807e3\r\nMac = 56\r\nResult = F (1 - Message changed)\r\n\r\nCount = 165\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = b78a16fb9b075d3b\r\nKey2 = dcabbf7a07150261\r\nKey3 = f7644a01d5dcea46\r\nMsg = abe2fd996bb6804ed3286c057df9cea6836a2dad\r\nMac = 09\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 166\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = ce8a467534cd679e\r\nKey2 = cb9ee6fb70a42f4f\r\nKey3 = 16c1e5c1459e4ac8\r\nMsg = 3c56ccfbe92023109983e740d6a53488b813ee87\r\nMac = c8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 401f0de0efd6dfa8\r\nKey2 = 16ae7c3bbc6e5b86\r\nKey3 = 4ffebf790815f1d0\r\nMsg = 9052d5e22e6712fab88e8dfaa928b6e015ca589c\r\nMac = 61\r\nResult = P\r\n\r\nCount = 168\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = d357bf5bef2cfba7\r\nKey2 = b757d3abf49b4ac2\r\nKey3 = 16388051da8a04a7\r\nMsg = b04e8f6d20924be8e4e2c6767f87b74377bdf90c\r\nMac = 72\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 169\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = f8ea68aba1bcd9e6\r\nKey2 = 4abaa4260d864573\r\nKey3 = a49840ab737af7b0\r\nMsg = 1fc99e586f87932445930a300eb28191d9c6215b\r\nMac = 19\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 170\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 94ec086d8c0110cd\r\nKey2 = 4ea11f327f70c245\r\nKey3 = c8d07adf7c7c5eb9\r\nMsg = 812dbc453a1fda59f73aceea3bc84d2c7a437dfc\r\nMac = b2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 171\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 9d575d582a9723c1\r\nKey2 = 294af47a54b051fe\r\nKey3 = 5131bff85bf12608\r\nMsg = 266e5305b96f497a956ae82b20367ebac0b14215\r\nMac = a9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 172\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 913d800ecd0dc762\r\nKey2 = 7f6ec476b6b07c15\r\nKey3 = 973262ab7c83b634\r\nMsg = 4670a266bebcdf95c62d36cda33d50e6650fcdcd\r\nMac = 4f\r\nResult = P\r\n\r\nCount = 173\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = b97ffe79d068ece5\r\nKey2 = 4a75fe2f67dae392\r\nKey3 = 45a4d9f17a9d70f8\r\nMsg = b53017500c100dea0511845597214484fc5f7f34\r\nMac = 6d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 174\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 7e1af10bcd86c283\r\nKey2 = 51cd37540e19021a\r\nKey3 = 988fd3c7250e2a6d\r\nMsg = da1919d4a2a7fcc34c88fb2065e52bf9dbc50731\r\nMac = 22\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 175\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8c0dc16eb9c80775\r\nKey2 = 6eeff20d3d5d5223\r\nKey3 = 258076b313611c1c\r\nMsg = b212b857f70c9f63d0c9d2ccd253c28d1534631f\r\nMac = 2e\r\nResult = F (1 - Message changed)\r\n\r\nCount = 176\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 92c29eb0bf3e73a4\r\nKey2 = c6ecfbe6cd49bf4f\r\nKey3 = ef19d9d06d7a5e7f\r\nMsg = 969304e651ca62039088f8123085ac3263796b67\r\nMac = 57\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 177\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = a4432f52975e4316\r\nKey2 = 7f2086da04fddf4f\r\nKey3 = 8302139e79684329\r\nMsg = 5c9bcd197ea59e1b58b3da707b253491cc5a5ef8\r\nMac = ea\r\nResult = P\r\n\r\nCount = 178\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 5ae0b6d6c2855b7a\r\nKey2 = ec675d3e73bfd685\r\nKey3 = d3406b868fd3ae0e\r\nMsg = 89b9ecfef6f10e81f7956dbc7ca4a335047535a8\r\nMac = 70\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 179\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 1\r\nKey1 = 8f7f85649d5e08a4\r\nKey2 = ceda75687308e07a\r\nKey3 = 9215c4c19bdc0d46\r\nMsg = e53101e6eabcda32c13d7b1dd1d88e7c2ca3ddc2\r\nMac = 14\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 180\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 7061b5f46b98d394\r\nKey2 = 58c2ce3807623475\r\nKey3 = 0df8e3c432da8a37\r\nMsg = 1086953d352e94a51a6d4c59a2295e8fff5b311e\r\nMac = 554d4df88228eba3\r\nResult = P\r\n\r\nCount = 181\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 347a25a1ec433b52\r\nKey2 = ec75d97046152c10\r\nKey3 = 86b937b6ad1ccbf8\r\nMsg = 4fe6bd43c28143ea5d40919cb5330a7e674f5bd8\r\nMac = 3d0d841895fb7c65\r\nResult = F (1 - Message changed)\r\n\r\nCount = 182\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = b3701aa7da61512c\r\nKey2 = 46dacba40740e3c1\r\nKey3 = 8f79a4dcadbc315e\r\nMsg = 4612fb4586d7518d0d648894347ae7d49d043f29\r\nMac = e5dd4392afbeabe7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = b5b57acb2c7fd6cb\r\nKey2 = 70b02c9d8651c889\r\nKey3 = 07f485f7b00e45d9\r\nMsg = 9011231ec382ecaaae57f34de1ac6bbb50741014\r\nMac = d34581ad5a3e9e57\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 184\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 88985bdfd9852604\r\nKey2 = f7f829aec8a208b3\r\nKey3 = d5ba012ce6754554\r\nMsg = 6cad7f3b9f196839bbc5a7f755c09aa8e17c83d9\r\nMac = fc7c93552aa14ca2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 185\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = cd0815194319d552\r\nKey2 = 346bb634027668d9\r\nKey3 = c17f2a26257afbad\r\nMsg = e31b3d97ba6ee6f2e18f084215ca0a5ca0d816d7\r\nMac = af5772396bb63d20\r\nResult = F (1 - Message changed)\r\n\r\nCount = 186\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 236e5201dfc1081a\r\nKey2 = c81526bc85c7a2ce\r\nKey3 = ab91d0aee0d68931\r\nMsg = 1f36b9cbf3d4d4dfcc4ba7fafa7c229f0a9253f4\r\nMac = 27586cf856a41e82\r\nResult = P\r\n\r\nCount = 187\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 2e01198faeb6986e\r\nKey2 = 7cb564801f15bc5d\r\nKey3 = f2d3ef0d4fec61c1\r\nMsg = 27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb\r\nMac = eaa7b4a171e449ef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 188\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = df575b851331b016\r\nKey2 = 33ec7326e9ef31e5\r\nKey3 = 1686c1ec8a3ea16d\r\nMsg = 1e4e01d38ff65d05646d544b52a6df49b897eacc\r\nMac = 45789bd32147c0ae\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 189\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 43b68c1f29ef5b94\r\nKey2 = a7dfa1cbe9ea3df1\r\nKey3 = 83d3c286e973ada1\r\nMsg = 0ca9b0f6465db0e101f8c14b2e73859d9c355b0a\r\nMac = da439a51157ff0d5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 190\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = bf91d679268c85ce\r\nKey2 = 46b9f7bf4aa1a2c2\r\nKey3 = f7fd15fda2cd6408\r\nMsg = 0c2933e39d7e601ee6f2519eaf01294853664262\r\nMac = 455cd46d3b452a55\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 191\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 0dad9d451f890b38\r\nKey2 = 3416e3c240a16ee6\r\nKey3 = 5b80d6aefd4ab5a4\r\nMsg = b6e1de9abef7525c5dabbdc85746958781d50139\r\nMac = 3445a869cca839fb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 192\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 96858f8f2ab56df2\r\nKey2 = 5edc3b04b94ca7cd\r\nKey3 = bf10614ce0491645\r\nMsg = ec9aa18b3e7da99dcbd7de7617a79130abe3348a\r\nMac = c744a1392fc656c2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 193\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 46ad6ebad9644a67\r\nKey2 = da684aa48f23d619\r\nKey3 = 43a2316b40a46e25\r\nMsg = cf97c2abe3d0fc89e05538b50147a3f405391219\r\nMac = 7ac08967edc5730b\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 68647694efb32023\r\nKey2 = 0d2938c8fe1a4057\r\nKey3 = f479f16e7552942f\r\nMsg = 33a9c750bb532d2d37ec86fa851aeb3cad1eaad8\r\nMac = 3873ae02210eb5fc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 195\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 58d62fd92af7437f\r\nKey2 = 89dfb51fc807cd6d\r\nKey3 = 024fd04f40d5d0e3\r",
+    "\nMsg = cc293c9e1780b401d2e7fceef6f69edcf0f70b86\r\nMac = 6574bfceaf04b4e1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 196\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 4b377f98df0b7598\r\nKey2 = bf73f4c2cb074001\r\nKey3 = dc9857f47fe6101f\r\nMsg = 9ba5dbe7a8ecfbedadd7889cd7f1ae073e01ee3b\r\nMac = aaaeb7223578bbad\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 197\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = 91c8851934cdecc2\r\nKey2 = 582562aef1205e32\r\nKey3 = a12a70eacbad310e\r\nMsg = aa390a0ae33751b0bd8de5723df91d999aa70358\r\nMac = 67f76912ed61eaab\r\nResult = P\r\n\r\nCount = 198\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = dcc2bacbea0dcd10\r\nKey2 = c18ca45ed57f8f97\r\nKey3 = 5d58157a677f1951\r\nMsg = a7573e5b7dd7f4ce9e4480f603c14145a27f7c7a\r\nMac = 2b6af968464ac63f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 199\r\nKlen = 3 \r\nMlen = 20\r\nTlen = 8\r\nKey1 = fe6d49702f044f40\r\nKey2 = 33321613da401004\r\nKey3 = 8c3438f74cc2680d\r\nMsg = b15a118b3132c20c31e6c9d09acdee0e15fcc59d\r\nMac = 9f28413a00da00ab\r\nResult = F (2 - Key or Key2 changed)\r\n",
+};
+static const size_t kLen40 = 53587;
+
+static const char *kData40[] = {
+    "#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 128 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:37 2011\r\n\r\n\r\nCount = 0\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 27b5686c79b3d242f96d3892c6135b26\r\nMsg = 00\r\nMac = c98d11822b9b4d7a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 1\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b4542a22baa348ee2d11ef62d44cebab\r\nMsg = 00\r\nMac = f7a2a3f519fc462f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 2\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 7256e344f68b3e7f9dd6e04c5c65135c\r\nMsg = 00\r\nMac = d4d7fcc5f979230f\r\nResult = P\r\n\r\nCount = 3\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 7a2116595c5cf6482199d3312498006d\r\nMsg = 00\r\nMac = c3c4fa28709060b0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 4\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0341551d6c7e7c57f678068f0b41d1fe\r\nMsg = 00\r\nMac = 821030d4b7889fcf\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 5\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b67ba2aa4e9ea9871c3def87e2dd77f4\r\nMsg = 00\r\nMac = ea896182698ac145\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 6\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0091d39f3478d2c59bf874b96db9ce0f\r\nMsg = 00\r\nMac = fb12c5971b0f2f18\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 7\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 46a2e6bd3fd5336abf02eace3cd1e1f6\r\nMsg = 00\r\nMac = 9c6b46ef046ae1d1\r\nResult = P\r\n\r\nCount = 8\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 4b0fbd5e6f9298e5ced5ebdc60fc18a7\r\nMsg = 00\r\nMac = 221857badcbcd2be\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 9\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = fb20547da671acd4c6df37f6568a6428\r\nMsg = 00\r\nMac = ba0c9bfd3d9c0c95\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 10\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = b787def50aaf446bf15c562434844562\r\nMsg = 00\r\nMac = ba60bdae64068330\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 11\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 67d77f50727c7cd5b38e0b175a888c88\r\nMsg = 00\r\nMac = 555923e6b5fbc504\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 6f552ef7d309bb98597b91cecc21e158\r\nMsg = 00\r\nMac = c2aa402c0443dfbd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 13\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 411871267919a145532cc401e753ebff\r\nMsg = 00\r\nMac = 167a31913228f45f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = abfe32efdf0464cb2eaafca8eac30d9b\r\nMsg = 00\r\nMac = 8edbc729b1923e10\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 15\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 85504d59a12f3e17edfb0b6337d4a081\r\nMsg = 00\r\nMac = 9045fd77cb26dcb2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 16\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 55f7565826b0e2ccc1368f4de32022de\r\nMsg = 00\r\nMac = f82395416a8dc209\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 17\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = 43c8f984390debb0f26c6b9c2df8518c\r\nMsg = 00\r\nMac = b5d732086bf8feab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 18\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = da288d2014616f16a2abf5923dea49ad\r\nMsg = 00\r\nMac = e03b67b53fc7863f\r\nResult = P\r\n\r\nCount = 19\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 8\r\nKey = e2f962d076df051c2d291b47a902ea0c\r\nMsg = 00\r\nMac = df1456a7edeb4e42\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 20\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 191b53e0c7d90161e5e2014e9b8aea31\r\nMsg = 00\r\nMac = 1e210cff3c90bd2e2a27a78ef7662f61\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 21\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 54666bdf6db300ee10982d14dac828bc\r\nMsg = 00\r\nMac = 9fef67209b8da28049b80efe98f85f13\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 22\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9a143c21cc6c9528b9ddd7e4405682e1\r\nMsg = 00\r\nMac = 1c3c3b6d1d86ac5787234f8f6d707acc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 23\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 802047ee1309e548ae81e93a17bff9e7\r\nMsg = 00\r\nMac = 1472aecaa0a09e45893a14090ed9a17f\r\nResult = P\r\n\r\nCount = 24\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = ab79ce74c0959aea0fd0b28ea5d0afe2\r\nMsg = 00\r\nMac = fde8a95536cc334f7fc8881a187afc61\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 25\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 644ac6fdc1e713ecb7ff1e0bd5729a57\r\nMsg = 00\r\nMac = 95a93bb50703521e6c1a8be1aab6a646\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 26\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = b4571e56f66a857daffbdc99370ceddd\r\nMsg = 00\r\nMac = d2742ea62f1d6513c4eb0e533922f251\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 27\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = abff2b097d688293701ff2c49ba48eb3\r\nMsg = 00\r\nMac = 17e724f66d4a9ef5dfc0cf903f8ff04a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 28\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9d45f6d97d1573de3cb3488befaf5b7f\r\nMsg = 00\r\nMac = 96ec3cf234d6704483a93885bd67e6dc\r\nResult = P\r\n\r\nCount = 29\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 00d385629e5df815a5300e6635351934\r\nMsg = 00\r\nMac = cb23bb449ac26e2186b02f7428fa022b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 30\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 2f9109e7eea21b2615c81c03182ce603\r\nMsg = 00\r\nMac = 4532211f48124a9eacd795ea4313adaf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 9f3830f5cd40a2396b6093b358cef1e9\r\nMsg = 00\r\nMac = f5ea59ec909a8ec2d8b11f5f276201fd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 32\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 17378e17c41586b88523a6b6af738dc4\r\nMsg = 00\r\nMac = 40cc8b388be6789aca584659acc7aa06\r\nResult = P\r\n\r\nCount = 33\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 064e8c88a0a0766186d75867b5ca3acd\r\nMsg = 00\r\nMac = b2f94222a68fcf803868b00404ad170f\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 34\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 1e39f1cba97dac4e4d4f3bce7fda72e5\r\nMsg = 00\r\nMac = 60763815c1075c31078a9b44fe4b8427\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 35\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 06f0e4618e0ea8fa5443b50ea005b672\r\nMsg = 00\r\nMac = 295c6cd08b1d668d9fa85ef851b1e029\r\nResult = P\r\n\r\nCount = 36\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 648d77b57770b67ecda1ce7951eaaeea\r\nMsg = 00\r\nMac = 2f3fbc6edf5827fce440b9a7ff8535b4\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 37\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 6f3938932b5c1280311e892280d8a822\r\nMsg = 00\r\nMac = df02edfb316350c81dbee385d6e1d8e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 38\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = f909903451d1f9f45ffcb93a407ffb50\r\nMsg = 00\r\nMac = d176620722c5327270ef30956d7ac02f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 39\r\nKlen = 16 \r\nMlen = 0\r\nTlen = 16\r\nKey = 181d92c7df1ebb0924719e066e08b95e\r\nMsg = 00\r\nMac = 144f688fa0d29faf787c48cd0765eecd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 40\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0c5b763b1e97b4f4dfc7059e4896ba58\r\nMsg = a0b3c6944b35f7208dfb40b4c4ba134a14dac928b679950793b3b6751221f178\r\nMac = d922ea85b3992a67\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 41\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 461d7d629778c8b05a688bee4fc01e9f\r\nMsg = 07571a6c9bcb6f97d626796bc74e551d1c45cce38afed761706f6264b7e751d3\r\nMac = 794b224a85396a27\r\nResult = P\r\n\r\nCount = 42\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = b91c6b09bf5a0487a9b5ea2fe0c1f3d2\r\nMsg = d31fd388e97727ba0a35d34ae05d9980e5974f6b3d86e2d4dd569b70f394a159\r\nMac = 2665ff2785bcb606\r\nResult = F (1 - Message changed)\r\n\r\nCount = 43\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0737836cf771e842a70f3eeed7206799\r\nMsg = fce631a9eb130178018ca88cec966ae53ecc83a51d0a73173c8a9af10b4d04d6\r\nMac = 1eee822e37dd1e84\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 44\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 120132c315bfc9c4fb93023f5d3500d7\r\nMsg = c2576ed3189eff3205f5e01dd8fe7c64f12dc73c807c22918f607f9e43fcc5ba\r\nMac = ddca15c8b5a80cb2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 45\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 5363bd7d867a9f9f0592dd9940a791e8\r\nMsg = f34e86b8803d386573b81045df945df8319a93b613de4c41904c8e1879844cee\r\nMac = 109dd7c920ebbf41\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 46\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 3fa1c7cffaa167557b250634e8052fa0\r\nMsg = 4255f8af18df7237e0abe98421aec9634443561752d893aaffe76380e829ef32\r\nMac = 0eceab8d28dd4a2a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 47\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6583a4ff27b6e109046d11b977c8293d\r\nMsg = b63be320f92",
+    "e01260fba37312224494a2764dfc928287c75dc1cafee7b698d48\r\nMac = fa0cced22e896b40\r\nResult = F (1 - Message changed)\r\n\r\nCount = 48\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 5949378fd3135dd02ee1929014000411\r\nMsg = 65c16f4e66b10c7c153be7ba2dbe3a6d4eed3b04fec44188edc229747d52f8c8\r\nMac = 9ef023345848680b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 49\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0e80fa889b1d96a0d23d236d4d642a27\r\nMsg = f6f094e46cdb2e45fe49b18aff1427ebdac9710fa7f47f75fc9ec7140613ef3e\r\nMac = a09774009934c9d4\r\nResult = P\r\n\r\nCount = 50\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1f88dfd4f5c52c22b1db47f9f4fb6e2f\r\nMsg = de433ebd1cdabeac46b94cc00d984f172923535ca8fdfeeb860546357dd8e266\r\nMac = bb17b3983faee0db\r\nResult = P\r\n\r\nCount = 51\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = ab0ab9e79ee53a6946a31ea807258dbb\r\nMsg = 89ddbb042aa2aea5207b312c9831fb48138aca90626ef7c5ce474d5797ae1b2b\r\nMac = 72f316d5bfcfcf6f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 52\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1eb19542a0064564e096e5d7d60acaa6\r\nMsg = ca25504f3f5559aa0e88199ce1551c9240b5c76f55b83bdbf2777cded54ad3af\r\nMac = d936b1fca0a96aec\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 53\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 33f11aa36d8ab0fc53486839a576b31e\r\nMsg = a58524e37c2504468f77a9c21b0e6d1a6b5e06fa051d5b8025ef97fa69417cf2\r\nMac = fd64f7cb283adce1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 54\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = a7b81d8245129aa451dcb7229de415e5\r\nMsg = 2b2ec02aba10aee056443cf90585caa2510b3b835454a99f1324567b0dcbe682\r\nMac = f4cd48f32c9dc66b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 55\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 3c1baf0d915e5aec92bb62babad0ba2c\r\nMsg = f8f2424c2dc0d0f3821af7244038da0832c547be4ff0850b98c04d4d44a716b1\r\nMac = e17ea6862129d6b9\r\nResult = P\r\n\r\nCount = 56\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = 943a49073db6ae94a88844ed895f8fd9\r\nMsg = 8a15e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d8190\r\nMac = adcce0ea2c8b11d9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 57\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = ebf8935f53dfb3bd40453c31f627c73e\r\nMsg = 7edddb03d861dc9796f8e069bde434681620f604db436f34b7a6a3beeec925b3\r\nMac = e8ea88729d49bea4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 58\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = f18e8feed77d1b80c31483fe69073d56\r\nMsg = 37c6206e23163c39a13f19de48cc25dc26e6f83cb376e8d2048ad7c141fa503d\r\nMac = 0d4f5cdb2a49b471\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 8\r\nKey = b4e41c7bfb8fcaa5236f656185c1496b\r\nMsg = 32758ae47884fcef766dd1fee1a7f55ca6f6691574e2ea097a68cd4072ef2e7d\r\nMac = bad08badb66c8e5f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 60\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 708484fba04972b815256c5dab12d5d4\r\nMsg = 97751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6\r\nMac = fa74b33267c5ffeca75e5e16978bd7b0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 61\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = d0df1bdf1df6203241722fb9c9c1cf74\r\nMsg = 0e41361ebfbe4e6580fb5751e58e98de8ee5d9849fe875026fdab15a85804c1d\r\nMac = de4992c9d33659620cc203848e42a279\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 62\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7c0b7db9811f10d00e476c7a0d92f6e0\r\nMsg = 1ee0ec466d46fd849b40c066b4fbbd22a20a4d80a008ac9af17e4fdfd106785e\r\nMac = baecdc91e9a1fc3572adf1e4232ae285\r\nResult = P\r\n\r\nCount = 63\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7b4c800f5071521119e4cc6deee8729f\r\nMsg = 775946f3014523b6ea37804585cadd35e74e9382ebc1022579fbebe407281b6e\r\nMac = 2f6697f5d067aecdb3ff5a09d9169b3b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 7618d222630138cc14246e8fddcf98cf\r\nMsg = 432e3575a966958434da38dda3606f1f69adeaca536a7bf66c8b1e451edc3716\r\nMac = d7d78aac615ffc1bb32dfea41f2b8771\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = c8804fef18ef263c010c8a205e14516e\r\nMsg = f2d23bc605181e3894f61fa63d61ed4a610123ab7d3531c0b7579a58b74161ba\r\nMac = bfe5e2c10a5cecccd3de2529f340cf6b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = f98ac86ecb742c188852980b5150d100\r\nMsg = 4e6fd4fa7669ce9552154bd796644961b51067dc02303430150aacf671280031\r\nMac = 73df5f4d3ab9240d4fb2be775188adc0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 67\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 638d7d95ff5f57571261e23ffa081189\r\nMsg = 5f5bc4e32764bb00085667b7f1b15433f09c1f6fa48689f8f50dcaf5021f2864\r\nMac = 96b270629b2bfbf721f1a70eccf9abe0\r\nResult = P\r\n\r\nCount = 68\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = a5a20d8139472a4cb38993c5711ac2ca\r\nMsg = 73e1e75538f9a63e49a068189e3b0a1a1e65ca5d1295589bdafa3136deaa287c\r\nMac = 320647d53ccdf2335a9c9a3452c1cee5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 57656be54860414e8a62223381ca4405\r\nMsg = 3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df\r\nMac = 47c6b5a28d723129648aef418b74daa8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 70\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = e7b665600a2aa413e117c53816cbed34\r\nMsg = 5e4d49ab796025157add6d42258b9c506d9ce82bdd85c604360db0ff5aa4262c\r\nMac = e741166cfa2a58003dcae357d7a199b8\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 71\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 693cbb46bc8366086ec7cd7776f2c563\r\nMsg = 5a908ae85ff721ffc5096aeeda5ee83bddcf639e7be68d109394e5253c22dc9b\r\nMac = 9d56b03ef83082f601a9cc8730b0de42\r\nResult = F (1 - Message changed)\r\n\r\nCount = 72\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = b4190e3462e07fca26496adcb877724f\r\nMsg = 02097035a312cb02ea7f09fc1accc230a205e4a208e64a8f204291f581a12756\r\nMac = eb9604ec71aac0cacb63e0b369ae7664\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 73\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 4ae06c3b2940819e58eb24122a2988c9\r\nMsg = a2e7be3314238d7e4f604e134790bb15a87c09356c091b1aacb9f605b67475b5\r\nMac = 14b4507ae4b50cfe4989b544bede756c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 74\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 8d560de2e310ea69389221ce2e850625\r\nMsg = 04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e\r\nMac = 647f2874a083e82fa804b6c58c7b5c90\r\nResult = P\r\n\r\nCount = 75\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 0e1a79c5d734118c19eaba700f5da238\r\nMsg = 026470d57dad9893dc037b80978bf70c2e552fe46c8fe8c3ebf8338bda984d94\r\nMac = b936ff3bb8afb9e42351a2a3ad49d70a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 76\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = c88b1bc0050e19780ab53efbea175634\r\nMsg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098\r\nMac = c1dbd79e31c3b0bb824f16f735ccdfe6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 77\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = d87df10a53eb3ea24c003d2a65e44921\r\nMsg = fedd5813146a8c2af398d6066956829833b75e44b6e010e4f025ac0fad6f869b\r\nMac = 9dd7cbb34445bfb351d01e8cdb21d695\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 4d436a4a5c02b22ad49548b97216f277\r\nMsg = 2d73204f0b2d35806a8227206922ac9c18eff6ebddc73809179d67a702cf3e21\r\nMac = d2654d9bd6396075296cbe918d90670f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 79\r\nKlen = 16 \r\nMlen = 32\r\nTlen = 16\r\nKey = 8af7b74e35eb38f4086343bc329ab465\r\nMsg = ada1fa439c653d0cc88c0d129ba252e86c7d20a3087be93e920bf13d8e6f0391\r\nMac = 0fc9b177c874ea909b6beb1db1b802b4\r\nResult = P\r\n\r\nCount = 80\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 91ce6c87860aa84053f42e1abc16f489\r\nMsg = 4c287bc16196698d762d5fb428e801975fdaa29026b7b78dba968bfee0f534f27cfec57c6009c55c6261e0dbb14bddf76944d0c0648b910254df6c240e8a1a50\r\nMac = c1ce12f51aa823d0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 81\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = b7b774e5c9e2f6926660c48b8df52354\r\nMsg = 937273c7355e7b88a630d15be875234cacaa44e815f31997bf10b52c008cc3bb6d3724aaa0d7da0b391b252923d0eb6119575d346857d89af6af099883af5514\r\nMac = ff845eb2d77aa5a7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 82\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = d7572ed0e37261efa02f8c83e695efdc\r\nMsg = 85a327b0c7a31a4116e7fae0c0971e1578ab6fbdf90124b9ecacd0e70c909f51882cdca5a8b6b7e6b46d4660122bc9e1ae3932269f68e594075dbc293a2d4eb1\r\nMac = b8b3b7526419e069\r\nResult = P\r\n\r\nCount = 83\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 259129eb760f8a770410c160e4e13a6b\r\nMsg = 77d9c30",
+    "6aa257379053cf1f2043c388a301dac2a9e2bb89eb8bab6eb3f150fe391b7a3f628be6b4b649c5c108a108f0e0c55a0800b9954251ab07e94450a23d0\r\nMac = f9376f11cbec0ec0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 84\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6ccd61ed20f16ca7a78192f5b6ab5528\r\nMsg = 9211231ec382ecaaae57f34de1ac6bbb50741014a978160ce59c60491e64f30da0b8aa1442e42bc0f7e31973a0dd8c3c24eebeb7c329072ea7dd0b04bc163254\r\nMac = 94c275e6a4675d8a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 85\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 1cdc44c40efc3c0ed6fb84b0c2f78aec\r\nMsg = 818c636772036761af037c23aa8cb63e424f0ba0375b645de2f8f5af23d3ca3b9a5ca3951a6d02075a2c828eee326a2676ed8247164226b0267798632a519bf1\r\nMac = 74355397c7a29bb1\r\nResult = P\r\n\r\nCount = 86\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 2e523e9d8a5532127ec63b220838f11b\r\nMsg = e6d067907610109b8789e1ad00542539991677b9efc97a98d8bfcb50f3e334d0844323207fcb5a47e353e76d49dd573dbd17278dcc287b41dea8126cc7f07ab9\r\nMac = 7bd6745c6f73d92e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 87\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0eee5bc8994b723a580f67d45ccb194a\r\nMsg = 1dc4fcbc73dab4e73ed9d7606acdcd42b74972460c640fe50f028abdf255d9368fa3bc65b849ac31c8000eb47e5fade40ca167726aa927f2f043133d24ad0613\r\nMac = 486721355fff9cbc\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 88\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 388468d10bf0b770cc125f8b7d359261\r\nMsg = b9aaadfb3f60e48f1b421a9450129d75af2ce811ab0b1661680e9d5b147c38167ac7252ed40d916ae1e4519c3857d2c9dc2c538a106951b26d16433131438839\r\nMac = e13cef9392f4a80b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 89\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = edfe2e15edf0b0c28875651d4becfca5\r\nMsg = 70b1e2e4cf260b108f5a52d0d8234838ffd6ffe7b4acd78d7d6b95aa6342b598eaf402cb47396358ce61f8b4aa3a65bed0346e0036c3c5323f051f007aa58d0e\r\nMac = 7b70730219907d18\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 90\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6876df1a77e11165331a5ce2e0e6bea6\r\nMsg = 34b73ba208bbe1df06da768b0321243815df4ece555974dee2bf5732295f5ea9631939425e13c47681ae2ecb0bb85aa69be38560f5752a9d034222d91ad71044\r\nMac = 80e00df873439fe7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 91\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = e65d5fd5f446b4eab63d56b0a5eb1d29\r\nMsg = 554395f9b113c0f2a1f155de171d6c0a805c838beb90c3756e8b864dc52517c03d8cb894d1dceae092f0e8784c7775ac664ad7320afd246086b3bc9ef237171c\r\nMac = c60f8ced2efd52fe\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 92\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5bdbd06f4df6e15d644f3a635d7bb14f\r\nMsg = 4fcc7c2763a8dd5bfe74e34f512be8042af9ba1c73a944edfb616ad47a8d34cbcf192f3e8be3101bb3709b29c2dec39aee1913e3ac524ccb76ad50c2cc3a3e75\r\nMac = af33d5a2746bfa5c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 93\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 13bf2f72211cc8e16ac1986a22e19f60\r\nMsg = 8ee212ed4bd110ca6a91b37bca59e19ba842e3a1b50619bc6b07ec02a09303ca5c66ba56e870d0b627d95fe829431244fe4f9218c862418f14a92bd76b5a3a82\r\nMac = 18e8cd5bd42c75ea\r\nResult = P\r\n\r\nCount = 94\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = e9b913c2f0630562eb1c16b3b1ed8409\r\nMsg = 031105ff01daa66ff95834e47b6f5c683994084d0fcb84c140d1dfa2039a95933efe6a4f91af993d966e2e45677eb1e36159047928a38eeaeb5c9a64ea59f97d\r\nMac = f00a17da0fb9e6b6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 95\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6fa5a5991315702cba3beb33867c7bca\r\nMsg = bb0fabffbcc6935ca35755fd4bfbd192b6812cf75c4dc95bc3a175a1501be2065d7f57058cb7a5785a185dfff7e740a5551cf7c17e65051b2c6ef9509360e878\r\nMac = dcfd143f86442183\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 96\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 3f8c6d21ec05bc439bf82774f1812bd2\r\nMsg = d726deb8537bcd671ddbaff8fcc6968f951b71aa82dfc802a53aadb2bcc2ef9a35fd90064320798b311d6d32f7dd3cd90bca39d57991eddc36260d23b108aac3\r\nMac = 449e20567875d56f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 97\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 8ed1a4873bb37fafd4f8c2ee417443cf\r\nMsg = 1652c9539bff4b6e9f303f3e6b5d4b9ff7e85aa2a401ee8c2dc7b722dbaf6424f92ab9188882e2483405070e8666204f5a600b46949cdb830fd57433d63a55a1\r\nMac = 601eb06acc5a4e0a\r\nResult = P\r\n\r\nCount = 98\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = 83a4669cb9961448cf418cb83a16098b\r\nMsg = 26d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f\r\nMac = 01a42494a10691ce\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 8\r\nKey = c9e6d0b3dcd8ab50ba5ff31d9c1bd95d\r\nMsg = 0d32c1cd73569ab2b10c67c167875fe22625358ed3469b424c5e052d4e49af2c97dfe1f947c972a08c938b327e01adbc48a7f57a89b49f49fa0fca5b50a57a2e\r\nMac = 476add8ee51b5e3e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 100\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 17281acb525b13653000ab45d86e7010\r\nMsg = 225750ca982e5b34fc62e277eaaa0f248532abf374933e572b0278566cc7cf980df26abefb493ef57f8477cac0bd19408a22e71f4ded84906996d8e7a846b5c0\r\nMac = 0f2aa7f2dffcf7df34c84d101aa9bab5\r\nResult = P\r\n\r\nCount = 101\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = d3624653ad0ed144667df0e0e355c29e\r\nMsg = 39dd298acc45cb597f0733572677f7102536c0dd86fcfcc44895d29af92a5b6a87c20f1b53087d4c874f4083aad32e877142d20ad87b1d8b7295587bfd235d9f\r\nMac = 795da5a50f5b7df40317616b5a470c02\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 102\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 813b3d579664cebe50a8e7050a0b4e65\r\nMsg = 78ad6517a09b99c1113d175f3129aade4d4a2516ebe054f15bc833d08ffe5e2a2d60c976e1b4b14cf8edd2c72baadb2db8001fd2b8798d39ac5ce27d592f1def\r\nMac = 20f40553bedb6496233e0b53143b6d10\r\nResult = F (1 - Message changed)\r\n\r\nCount = 103\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 21095cdbe94afa27d84bcd68276993f3\r\nMsg = 10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e\r\nMac = c0b806ce5eaceb51b53b028e6efea9c7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 104\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 6c769a4822523525bb36c02518475549\r\nMsg = 4af38908fa44b46873535b39f432d9b3e677f6d06d8719af3d15b936afe515fc13d62566481fd0108bd95f6e8dbe32b3c830b1f1127d868273610aa834ccfc70\r\nMac = c1934b9c74127cfd515521df330c0333\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 105\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 6b454930925ca09d39e1e39a2e78fbfc\r\nMsg = 2bc884394ab7050c14d66fb8901cac109c0126668d918a4419bfcc5d75fb6bc2ba07f6598d06cf8cffd62f3eb29f6a033eac7490d27aa4701f0fb9f9718d1b7f\r\nMac = db19b8ef218018e5a53abcc39b7c514a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 5df295be7c44d59c44fead3f1988356f\r\nMsg = 3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065\r\nMac = 81b3181acbc2d6d2960ec57441ff3c40\r\nResult = P\r\n\r\nCount = 107\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 387fc73be9f019913f2222d98053f95b\r\nMsg = 944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c81\r\nMac = 5de79be9ff9c3c9d64f9cce35b188648\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 108\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 7424990dee834ad05f4218861ab21eae\r\nMsg = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026\r\nMac = 38b66049ee8ed81f3f8ce2b45a4001ad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 109\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 232407986ad4a8e438990fd04ffa35bf\r\nMsg = 9d88a7970d4c58cecc20ed1811298a5b37297419ca49c74fe216679dafc938a656cb92bafb78efb31f24e71c2d5b5f994f6dfd82862adfd2faeb8c408fd22aab\r\nMac = 313d46dda3ccb75f497f9069c9478b3a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 110\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = d9bd6ac153cb0bc4e19e59c45cfe0d6f\r\nMsg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f\r\nMac = 3b17778955990ae58e03feda7fc43998\r\nResult = P\r\n\r\nCount = 111\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 857fa35c6f70f637a9a5e6f215c694fd\r\nMsg = a1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e761286\r\nMac = e1ddd63db51d3035adfd309ddc186238\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 112\r\nKlen = 16 \r\nMlen",
+    " = 64\r\nTlen = 16\r\nKey = 501f5c58355d1800f155f272dd09afee\r\nMsg = fd3564848ceb5d8cddfd50732956d18b4af433efc2e2a914ff66aba1de7b9b816d81a936f534f47038dbf1def7c11144b7e99ecec5fee6a478899cbeb6677bfa\r\nMac = d995f9bae6150996cd9b798fcbc623c2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 113\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = c1d636989dfbcb0edc9f014cc82da6b5\r\nMsg = 20ef1bbf8a719497797f1f1bc4617179ea682a24a92f0831cd215a01473bb8207e13f26dea1a467bde1ed638a51359ccd11210c4d0a2fb70c0374e8984f81f17\r\nMac = e4972a59db04f78da1728cab051faa98\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = b4bc5a4d40716fb06a359ef9537726b7\r\nMsg = 36594fae7b487798d62c2c95ccbf51c984df5ca6343465b2dd147c8b36a34028e53fae61f51b36b28529143cbd3edd0c077158a07bc490a79a06270940f7ed27\r\nMac = cfb3fce039ee2bb94b6961ff86688237\r\nResult = F (1 - Message changed)\r\n\r\nCount = 115\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = dc796e5d9b712c798922eef315cb4728\r\nMsg = d5755c40f52364343d2613420441afe9da9a5329d3c1e5a123ee49f5eb8ad47253f104f5d9776e08e9a9f74fadd5472326cc7b7c7ce61a1492474bc9de614543\r\nMac = 315f0ce76352448bbd8a5012a9907a23\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 116\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = b82fd283922e730a07f7ddb87484f66f\r\nMsg = 94e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4c\r\nMac = 86e6a8485b43f1b258eb59688af91fbb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 117\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = f6db7efdfe73dcb4a26b8448842b55e8\r\nMsg = a1fa1fcd5f095b2768e32cd733365a136a108e7493f212aaef27d86da253beb6154f103099344ee94db6304e41b4e856db0ca7fd7ab462f45a07d697b85cca1f\r\nMac = f998bba6c5d3efd78af9ef57e7a38f7b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 118\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 3c1ba92d096fba134dfb4ef412b2568d\r\nMsg = ba7725d74465f5d92454bff794e0be51c4d0af7d88f729834d57312c528d0a7d15694a7e0bdc334093173f1d2df1fd42e7891c6b192dc5ee527b2ffb92c66d22\r\nMac = cfe6022ad29a54627ae7c4f907ef4da1\r\nResult = P\r\n\r\nCount = 119\r\nKlen = 16 \r\nMlen = 64\r\nTlen = 16\r\nKey = 4a92337f017a85b136ba6766444bbe84\r\nMsg = b0a3a8aa5d4bdfbb4c5c52acdcc60405c379f752b077eed42f2d7777cc0329047b322b9837d5f655ea445b578d9dc7e990a3c6f97cccc6cad7951ee948194e62\r\nMac = 153eff3c035db2fdc752ebd22302adae\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 120\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 305ec69b23e4490e0f8a5241cb9c8c85\r\nMsg = c641cf589020b94026ae\r\nMac = 3bc054afa9771970\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 121\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 28929286bd1391468ac75f5c03689f74\r\nMsg = 3813592f268a7a863c3b\r\nMac = bf1b514d2f899620\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 122\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 1b3163e2d3a471b9823525abc7543c4c\r\nMsg = cada03e8c967f9732a81\r\nMac = 53702fa98e6f9a19\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = be1ed49e2cb0caf6b6a0940c58453b93\r\nMsg = 4a348c5ec996f7a97ef0\r\nMac = 3358d143dff4adfa\r\nResult = F (1 - Message changed)\r\n\r\nCount = 124\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = f18be18df045ba31b80f3283cee6a681\r\nMsg = 93006a06d7e6df775b19\r\nMac = f3252f061dce32f6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 125\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = b9dafe18a904ba761762ec3fe0e4120b\r\nMsg = 173887316279a47fc699\r\nMac = 884f5b21d478d60b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 126\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 31fee08df80cc1009e661230e25939fd\r\nMsg = aa54ff7466923b265fb5\r\nMac = 03dd2a9616f653a7\r\nResult = P\r\n\r\nCount = 127\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 65a28d970b2bc7afafb4069c26d264a4\r\nMsg = 1aa5a3a4e6c5e5394e50\r\nMac = e0423589b192caab\r\nResult = F (1 - Message changed)\r\n\r\nCount = 128\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 6dc38e37d1379732df4dd535db88d17a\r\nMsg = 0093c6d94aed50b398ad\r\nMac = 19b08e65d391c491\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = c5329fd99848e1cdcfa406ec09745ae2\r\nMsg = 6d83d0ad7cc7efd0d2ca\r\nMac = 8ec2709e1466f8d3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 130\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = e608914a930b9c300b677afcb8689d63\r\nMsg = 146629e70b37d8b83ee8\r\nMac = db78a639bb15c84c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 131\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 0a998d3d390f5a80ad398b2070489984\r\nMsg = a91c1a8d9d268ad153bb\r\nMac = 5643a8c99b99d944\r\nResult = P\r\n\r\nCount = 132\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 2b6f78ceace47509a43ceb6b761e7866\r\nMsg = 3c0a41a78240c9d2fc22\r\nMac = 811acef50d6c1913\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 133\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = ca481f557306f9ce386edd0cfde375a5\r\nMsg = 9f3488736ef6e2c3a51b\r\nMac = 57e8a0e5965399c0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 134\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = c0dd1cfb3add04cd67a8e59be7ac8dcf\r\nMsg = a7c559c82776f429ac31\r\nMac = 7e43a2b43d030ff4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 135\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = d3130d9e5ef516b6bf172953a37913a1\r\nMsg = cbe97e14c3100c9fc564\r\nMac = db9f674a2d0e9ed9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 136\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 9ec8661a880ebfd15fd8b04f2ae09dbd\r\nMsg = eff803e0fc809cc48587\r\nMac = febec8d41b6bdc1f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 137\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 6c2b091433833a0ed915354dcb70d982\r\nMsg = 90f1416768fca7dd48d0\r\nMac = f6ada24319e502ab\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 138\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = bc79d444dff9d9e722effab07b068cb7\r\nMsg = 07d5a925b724e2443936\r\nMac = f964302c270af24c\r\nResult = P\r\n\r\nCount = 139\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 8\r\nKey = 1a15b24ba5d9648358f2c39c9da8512b\r\nMsg = 15b94910853a8f23dfb8\r\nMac = 8cdfbc13239e6aa1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 140\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 618fb69c8fb670250c306b3225687d17\r\nMsg = 7f54845a57d916866eff\r\nMac = c0d4db73891bb1efa232593407856808\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 141\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 8000aa080c127cbabfdfa5d9d9728c7b\r\nMsg = e53101e6eabcda32c13d\r\nMac = 5671badc409d4b170d4c861a0b3e1fec\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 142\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = b05b5557ab145cec2f00706dbc6a3c23\r\nMsg = 5e2f601395ec406fcf96\r\nMac = d00243508d25804548c4b4b512cb1906\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 143\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = e8b13346b61daedc1f9e3b49df8d1cd6\r\nMsg = 0593365419e0f75b6323\r\nMac = 871eb97850a776e7ad498467064484f9\r\nResult = P\r\n\r\nCount = 144\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = bc498326755503ff25d02805eb351722\r\nMsg = 9ece4c82fe9d38ef64ac\r\nMac = b5e88af50d1cff3d2b6d304edf042c43\r\nResult = F (1 - Message changed)\r\n\r\nCount = 145\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 4d248e73886a0e36b3ce7c6113477f4d\r\nMsg = 8de6fe3b24fd6c202ef0\r\nMac = c1a4f6d0ff7330171cfe570e900ce2c8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = b1b9fd78e3f8eaf4e8c91da62b2da534\r\nMsg = 482ea6f652067e8b791c\r\nMac = 63c6994c98bda91723f832020fa7d223\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 147\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 85e4e63341658144a99fbd17d94e3177\r\nMsg = 21ff834bec4ec6384522\r\nMac = 580c1e549a2ceca4743256a9cc972e84\r\nResult = P\r\n\r\nCount = 148\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 88b5448372548e6aab1b262630a28a47\r\nMsg = 36dbbff560ef04ea731b\r\nMac = 5fd17fd704baaf1ae6b3330ef2989dae\r\nResult = F (1 - Message changed)\r\n\r\nCount = 149\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 8cc76730ca47620d0b437112a2c93fd0\r\nMsg = c73be9f019913f2222d9\r\nMac = 2c73e2b5b84d8f4f3db1fc92831a03bf\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 150\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 7b657c640f155f1ff461c83cd656614d\r\nMsg = be9c5e77bf1b9dcbd4f1\r\nMac = b660ec36c0c0b4d987439505f1bf57e8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 151\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = d5044e9f10bd274aad4f7e605bb828f2\r\nMsg = d0be84df789c98dd125b\r\nMac = a26e513b09f184caf8d76d76961d1466\r\nResult = F (1 - Message changed)\r\n\r\nCount = 152\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 24d6d4bdc9fc4cd05b2867e9123acf18\r\nMsg = 0f9703a3454c25c0b105\r\nMac = 41676ddadb7b960e0269c8a59a6d9b91\r\nResult = F (4 - Key or Key1 chan",
+    "ged)\r\n\r\nCount = 153\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 6aa049d06bf66d2e2b65541eaa3730d8\r\nMsg = c562ab24ae5cdb7654df\r\nMac = 0d4d1196158fec46bfa754a526ba4a25\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 154\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = cf3727509577f1932bd7a92589c11e67\r\nMsg = 831188efc5d1f6dc9bb8\r\nMac = b5d162c885d7d4f6f65f4188d6582240\r\nResult = P\r\n\r\nCount = 155\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 0bc2fdd890c19882640f8d4188b88b9d\r\nMsg = 296828cbee50f41d19b1\r\nMac = e583d77645a603d841eaafa8860bfa91\r\nResult = F (1 - Message changed)\r\n\r\nCount = 156\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 5bab8051e2520b75673068b9cda93cba\r\nMsg = f16cba03402f9924daa3\r\nMac = 97f7eab25dc3ab017a9affc0e400dcc3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 157\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 7ac46e3249ca28e1ef0531d80fd37c12\r\nMsg = 3e9ddb8121760bffb7c6\r\nMac = c6eb13d5087d05b4eba2e74b283b7fe3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 158\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = 40f78f7ad3eede36e13bce222c6a4bc7\r\nMsg = 4fa8ad212ef73d37d48e\r\nMac = 3831419e62b51b7ced0d9117e48fabf6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 159\r\nKlen = 16 \r\nMlen = 10\r\nTlen = 16\r\nKey = a1f82c9924411e98e6f93fa0d07559e2\r\nMsg = 7d4748147575bc0113ab\r\nMac = c23dbc58fe22b34f7b007590558a3080\r\nResult = P\r\n\r\nCount = 160\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 84760f98ec565d281496b1295b25150e\r\nMsg = 9ce942ec81f8226506d48788e3acf49fcab6da22\r\nMac = 606c2f459a9ce198\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 161\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 3b6dd5169350b230774b02b9b44f06bc\r\nMsg = adb1ad81dac0ebc650d48f7a9329755a83f293d0\r\nMac = d7ceaa858508c476\r\nResult = F (1 - Message changed)\r\n\r\nCount = 162\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = f98d00755bcb45e6822121fe7cb03c8e\r\nMsg = 7064a2491f716f4a2969815e4a281a54690ced9f\r\nMac = e14634c400b9f561\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 163\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 5d27cb435e7724a246f158576fdbac68\r\nMsg = ee8ed4c12b0cf7c03bf91fba31a6a7b2d64c36c4\r\nMac = c10b474c0077a39a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 098c12058a0bc5951fc092aba322e1a0\r\nMsg = a2b76835229017bd0e8167a40ea1e2e18cc5db0a\r\nMac = 1d44128c3db0f7b9\r\nResult = P\r\n\r\nCount = 165\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 74f7f6516a17d5386c289756240241ed\r\nMsg = 8eafce9ba466fd53eb87f499d7c76bd486db0e90\r\nMac = acd978e0065375b6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 166\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 013bba67d26c7e52ae48dda3b67c9c96\r\nMsg = 48c0d53b85e6fa4928d3e9953afb9b451bc91a48\r\nMac = ef41ce0d30baece9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 14cea4c46d837c9439b088fba0e9d85d\r\nMsg = 3477384c396a9e9efb3e169722cba779fef240c4\r\nMac = 902158426696c229\r\nResult = P\r\n\r\nCount = 168\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 24f7b08fc2e6af6402243e22ca0626f9\r\nMsg = 914cf55a3fc739b5f87ac7518cc4171b4499d951\r\nMac = b775a3c1dc11d074\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 169\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 35b5428d440503773f30748ff843be68\r\nMsg = a5e5804cfdded4d610d1b05b7313ece84f369ccc\r\nMac = 6dac0947366be803\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 170\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = c8afe4e5b1d019c2efdbeda65d874ba9\r\nMsg = f739e632436470b5a1db9fa9796ed384c0523f40\r\nMac = 04c8aceaa8f8c3a1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 171\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 05a7910edcd7252b37e6d3d080a9ee90\r\nMsg = 702db7761abb9b5de41a86c8659270570be9d52d\r\nMac = 889a990539cbc30a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 172\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 4c8b0850eab7b212ad96dc7a032f8855\r\nMsg = 2de32ff6ca41b4c97424b121b8ad4edb133c00ea\r\nMac = f5ce7f46d457ec37\r\nResult = P\r\n\r\nCount = 173\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 687bcb63755f2b5c7daf4a154e8525a8\r\nMsg = 02778ca34db1cb5df76cb1a7619448f67d63b26d\r\nMac = 49d48bb0a684c6f2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 174\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = f8c4e562fde4379b08e512b0132766a4\r\nMsg = 627868b46ba546252f4eaa1c25205ccff72902d7\r\nMac = 5459c0ac5bb6701a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 175\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = dd235b05c15479dfe0326ba206ac784e\r\nMsg = e044ec24ddc0605bca89925a4ebc0234811e2a0b\r\nMac = 5ed0a03da09555b3\r\nResult = P\r\n\r\nCount = 176\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 665c2d7d6e69c2ce8f0d06b41038b83c\r\nMsg = 4fcd7541000cfc223fe9da6a030c681d0fb926cf\r\nMac = 1f022feb38ae6131\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 177\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 2efb7cd914a59b6ad63b7d1812f254db\r\nMsg = 67c9fe3e163787705a20f2fc8c468c4f771991fe\r\nMac = a866d6a31c0b42e6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 178\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = 74f6fd37ccb4b7702bb3a03b7322c0d5\r\nMsg = 011ecbe98c5cb7734476dedbb852e2474a5ad594\r\nMac = 707ec713b9bce5d5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 179\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 8\r\nKey = e673b3a954a00082cb7516ca9a54d9a1\r\nMsg = a6fbd41a838bdf0fab3e7b56c27a8c18dc4bf970\r\nMac = ad4dfde057b54a27\r\nResult = F (1 - Message changed)\r\n\r\nCount = 180\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = ce5bf070678cb07e963263b1562ff793\r\nMsg = 2bd10c4397a19fc79a307116a0847e0aaaefe813\r\nMac = 299e5910f128a1f091dfb6b70f6a60ea\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 181\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = bf144c9bb974729aaa1188ceefdf85e1\r\nMsg = 5e1ef2ad86ceaf5439fe87d2ec9bc41b52e5ba01\r\nMac = 58b4a32ae55966e42712721363ac9eda\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 182\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = a0cd07b684bb9e0e6692e320cec4510c\r\nMsg = 6e1e490a30f0c9e3d3b79f1c36aab742bd67c585\r\nMac = 24dd518ffffc1070f13d50d0bca42711\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 183\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = e3ceb929b52a6eec02b99b13bf30721b\r\nMsg = d2e8a3e86ae0b9edc7cc3116d929a16f13ee3643\r\nMac = 10f3d29e89e4039b85e16438b2b2a470\r\nResult = P\r\n\r\nCount = 184\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 4073251950e3331d03d67a2399576d28\r\nMsg = d5dfd0321b26e578fe987456ff061dc1cdaa4161\r\nMac = ed2823fb8fcae918064cef6211646e50\r\nResult = F (1 - Message changed)\r\n\r\nCount = 185\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = b08f47101365111133d974e8f0206507\r\nMsg = cefe484955fae117649ec158416a7439f29a596b\r\nMac = 3317717c6c0b138275090ea961c8d58f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 186\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 166fb8d0e110124c09013e05688605ee\r\nMsg = 24c65f715742da7d06046c783a35b2648180b4f2\r\nMac = d27901a86dbf0ed8bde0d69203646b7a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 187\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 20f6f56117758ba47a08dadf93a59056\r\nMsg = 7514e0f402e73d9c0b0576782011b2e6b2080a6a\r\nMac = 11cda489b6dc0ab48d111ee6cb26a829\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 7fa6ef35ad594a09cb74daf27e50a6b3\r\nMsg = ac0d616ed7dd3c3e86b3507d9f2bdc3a807d490e\r\nMac = fbad2fc6c9d0e5d21b25445f499eee10\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 189\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 815871a8300471dc325f8289d0d37211\r\nMsg = a8ff31e90556236cb4df078943c1f2528b42a7ce\r\nMac = 5544c93de980bcf653354ce08aa9dc3b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 190\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 06aa3f6fc20f867b42ec234a1bcb8665\r\nMsg = 25df5cc617e6e68be181694721a2a112a1bfb7c6\r\nMac = 2eeb7ab470caea3317a6336f5eee24a6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 191\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 860f8fdb021b1974d40e3d4bc41fa967\r\nMsg = 6c982a616510db422cc2f1beb955c3e7a88b6097\r\nMac = d2280a55cd0bcd18846b4e30db6322bb\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 192\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 15105c6285a9015d0edd414d6a806bd7\r\nMsg = f1cc55636836e67909ed3a581de20630226dd5af\r\nMac = e9cc5799a630c6f26087c1bd3b6f1791\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 193\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = b47aa890b03a8ac0dbc8f96c30fdf7db\r\nMsg = 58b06c99e0d0256cb1c556ec3b48a3bce73450a0\r\nMac = 3376cacc247686832736cea7e67e13af\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = dd057368033252d9bb2081a0b1a0229e\r\nMsg = 81de8f50fbe35f7ed95430e74d28666c885b6100\r\nMac = faa08c5a3a4ffdce81ca31873197d0",
+    "35\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 195\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = baf5afafd7d0c8ad42a44e4e0a90fd2c\r\nMsg = cc5a4209a6a60dcf12621e17150b4576b918732e\r\nMac = 5a43002d9144a1d5e48c2dc8dc167a52\r\nResult = P\r\n\r\nCount = 196\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = fa6405355bfb5065dc81e764d20277bb\r\nMsg = 5dd1febed8e94d4715e772c3295b48eaf471daee\r\nMac = 29e96ce5ba930134670b3c68b5c512f3\r\nResult = F (1 - Message changed)\r\n\r\nCount = 197\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = ad2e3d3af6195e74b3e43296b1f618d3\r\nMsg = ca776f79b8581014ae58a4d533b60483fd1fbbd0\r\nMac = b32ce1f493b126fccb9829d4dbe76382\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 198\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 04ae7190f0cabd117d30a359f80b720c\r\nMsg = b885e5e147f967032ab2552829a6e09210c44a45\r\nMac = 9386d73a01960ab399bb7d290674b21f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 199\r\nKlen = 16 \r\nMlen = 20\r\nTlen = 16\r\nKey = 51fdc65f6bb0d20a3c08ac1493ddddb2\r\nMsg = 1f0a56fb615b594d938bb8a27f4b2f5463ee9a61\r\nMac = 8506fb1b74806381e2654c8764464d8d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 200\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = cfb7e930b838dc3644f6c06f2ad0c8d1\r\nMsg = 611db4c194dbb54d80a4f4fa731cd9a6a330eaca734d3351f2cfebaba4bd541d86b3e35b4c1fa158edb0d15d610cd359a9c24878117f77f6b284f0363a576e0ef0\r\nMac = e9589a711f5d4a5a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 201\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = d179dfeead9d765d000462785459b1e2\r\nMsg = 795ee78ffdf302f3f1f2b31629ae918409cb42979afe3752dd14968d603678520e6b55884b5ebcce416248aa74b3cfe39dfedc2bb5246001503ca4d62cd7826f0a\r\nMac = f16ea84f554dfb54\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 202\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 22b7eb25e688672ab0e17206623094b0\r\nMsg = d830b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f55\r\nMac = 16229efcb7523025\r\nResult = F (1 - Message changed)\r\n\r\nCount = 203\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = a64fa98b4662d801159f61eefd1c8bc5\r\nMsg = d5982c462ad40458660cd7b120ce07fce9afe812caedcebdee536ac19b5d561d679dee8ea85d62552c86093a2ac1f8d179dbd4fc006ee4b16ebe6afd2be134498e\r\nMac = 2f9a2fbcb96461fd\r\nResult = P\r\n\r\nCount = 204\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = e4fb10325d18666c382e6cc2442381e1\r\nMsg = dc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7c\r\nMac = 8f771ffe0c8d3445\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 205\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = fdcd3459061c36c9a0daa0dcab2b967f\r\nMsg = 1cfa3342540d03ec3fcc8378c021443ba3321fbc26dad7c5b859faba004a082a21d6d7a43d2836cc3820d1adbe4c55518714d48fd9346a254f702107da8212f605\r\nMac = 6635f9e17949a14e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 206\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = fc593384e6eebc508d181fc49ee10e56\r\nMsg = a6c891c9dd1fcc982c35bc74cfe71651bae424602519672b466d80e160af51eefccc5fcf76467a25bce1a10853a0209d9beffbeb53228fea5f1e77ddc956ade207\r\nMac = 7a6fd94e3928d2a0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 207\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 4e4ff248f591ca27665960d9357a8de1\r\nMsg = 198d5c9c4aa35d12b62e8c4bf6f3f141e6ebefd8ab396c71f55e32bc82b094cde409547383bcc4c5e5cd2cfd2d616c8ae273e260f2c98e93f7267424b8c2421bf3\r\nMac = 9140f91a0cf70762\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 208\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = f20826990acdf225d9451a3d22f89747\r\nMsg = 03d340904ace1cd52d4b72a96d96afd77aee68ac3936415005ed0d56f46036915b1e5f2994ad49effe7bf3ee46170642e5a16f2eea804e68fa520fb79529d6c09a\r\nMac = f30b668f16bfe6c4\r\nResult = P\r\n\r\nCount = 209\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = c231ea8b75c65de68c49b76e7a3128de\r\nMsg = 5b50879191a6debdb96c0bfaf9086b7dc6e25594416b08d2c75fe16cc347d2e3c7410fe3dc030a6c161ea22f6b80973bc43d42d8558f83b32a1bfa3c03757a4d62\r\nMac = 65ba53ef4711e807\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 210\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 8ef18639bc8c831dc0b4aeeca25eff4f\r\nMsg = 094c4d9baead7c5acd7dc58f3b4b4f57f1406b4e6af81a034d90cfa94c01760f4cacb4d2c63671d16d9594e1116b0dc2c39319523afac10175b1a485a240f7cf3f\r\nMac = d84f89e16c3b1633\r\nResult = P\r\n\r\nCount = 211\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = bab9d79aae4a1b282d8c5aa35d5c0876\r\nMsg = 02815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d\r\nMac = a01f976031bc8140\r\nResult = F (1 - Message changed)\r\n\r\nCount = 212\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 42b97f583f64d88358885c66add5d03a\r\nMsg = 187fe16a764c0987a28088f5cfcf55a6b9591b6395d2d41043e09932cbc4b8ae073d08d39da9799b316eef2ed89851a8cfc4dc1c6d3cbed95663e0ecf25403e61d\r\nMac = 0820b1ca0cd34e5f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 213\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 4fd555bd3a5253a90b68b5d4d46bd050\r\nMsg = 1ef253c61ac8ac66734ea80eefc1dc077edd660dc3518b5ecf709f10302925a72a3938e7449f2ae707506a67022dab63113242e9dff0d027aa3d22c8462a558165\r\nMac = 3770a6cc988a28eb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 214\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = d3a8eb3f9e5fb264ff098d85c28dd763\r\nMsg = e97a0986bf75e0e821f5adda80778863d9d479bd8ac3e7fe64a053f8016c465d581487278ef6923610a1463bdedcded62aeb22fb210dde9a0949947f8c6a6e7753\r\nMac = 4947e6e28dbba216\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 215\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 3043857fc40be37fb0bda4f46894690b\r\nMsg = 14874a8b59b0178c5ec89cd7316d909371969c1a1a1bc8a29f78341d39ce085e7e2aad7c350a3e7b691d3929bc4b7b47fef56be9fe7e7520a00abad5308505f8f6\r\nMac = 1a8c82e9109a68a5\r\nResult = F (1 - Message changed)\r\n\r\nCount = 216\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = b325d425c810d22deb3209f29c5c1377\r\nMsg = e44c4202499440c12109296a35dfb1f669f97e7f415cd251a5e36943e134a548f0f2e841fa3541151b374c04665053382a24b99d731b99f3d411aa22644f66cd07\r\nMac = 84faaeb5a9756a27\r\nResult = P\r\n\r\nCount = 217\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 7cb6a84e99f5573c1eb27c0078f2127b\r\nMsg = d7fa7be9c10252d6e41bc1a08195a344ef77b81785cea6b4ba453d398bf6ffb31d80e0d6a45a4af283676422b5ca94c76bfb4334f61ae0abe884278976a5a3bd21\r\nMac = 64fa7f9284c24f14\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 218\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 00341fb81209c2abdfe3a9d607b98277\r\nMsg = 74f6fd37ccb4b7702bb3a03b7322c0d5fcc657cb2c3f1361488d853589d2d6207359b65d62d896ed66f217395000c2fa0d11f956332f2d4bdae55251adfe903b41\r\nMac = 4cf05b6e583c70f9\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 219\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 8\r\nKey = 647a5be8a66c83b4b238975388e15d00\r\nMsg = 0db33eda4188a9165147e24e40f79fee1985eb68d51627287e9c4ec995a77d89b27fb2fa6a6fd3fb7563f3e710b6d20ca145a25f9ac8116d9f628395eb769f75f0\r\nMac = e8ef4f3cd7442246\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 220\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c98fc3416457d9eed0fa7ab1dc1b8a6a\r\nMsg = 190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428\r\nMac = 1bea94a457b2886e9098bf3ded932a3a\r\nResult = P\r\n\r\nCount = 221\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 87428d5a53f750abdb335f70ee13b5d1\r\nMsg = 7bb0c2ecfd141e7e93a897b259732b6153af3542eb7289b1a18dc0aefeb4d129c9e0e27d7ef25d3afc9945277e75cb87cc7d1c9cb39e7e6ab2a49bbdf65e1c6d89\r\nMac = a854d2da46afb77a787f0606a69cf467\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 222\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c725d9ef0dc6cfca84865cf5cc91d403\r\nMsg = d3208eb695e84c7a9250378e18be2f231ca3ebe72ba68e3ea4ff7bcf25206b43439bbd497e400dde738507cb542c7d6f961fb8bee99f0c8a6d9daf022368cc78a2\r\nMac = 35d57445a5f10fd567595fc668293e95\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 223\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 13e3fe7856cd680593a85cda3d6ff873\r\nMsg = b208e5a1a852caef0795150cf8313ee0cff06e3d28d438c2351484005661cbdcea6d8a3466aef0c6a460da4d7dc902ec99c073d086704112085a76dab0994fcab0\r\nMac = efb2bef5aae555463ebbeebe69791459\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 224\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 9b8112c1fb29fba2c8b0d8f16481b993\r\nMsg = f54105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d\r\nMac = 673281bc0effe92adfac4fef49477ee2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 225\r\nKlen = 16 \r",
+    "\nMlen = 65\r\nTlen = 16\r\nKey = 82e71e3ad1bc9a12a46e460a05ad9c05\r\nMsg = 41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64\r\nMac = 36f7df58abb54a053988cae066110ecb\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b46e219217ab73c34904e24c6d995b72\r\nMsg = 887d6576572a3d8f6a1649394248c4d09d15026ffa930c0659508bac4243e7360802af084f363c2bcc4c91a04c6e86f4f8b22615d7915564949ab60b8267cb91dd\r\nMac = 10c1d8054ac549ad24ae4af2d8de97e2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 227\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b66edcc59dc9d8e34bea3baf4bfc0d5e\r\nMsg = 57caadbb1a56cc5b8a5cf9584552e17e7af9542ba13e9c54695e0dc8f24eddb93d5a3678e10c8a80ff4f27b677d40bef5cb5f9b3a659cc4127970cd2c11ebf22d5\r\nMac = 0c5864eefc04a6cac4f053ab2f65f851\r\nResult = P\r\n\r\nCount = 228\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c607f631d792499ea43586b81fa3e2f2\r\nMsg = 21ed22abc7bbb62fb2d51d1fb8830ca95b16213f56291af976274934ab0d43805f71d9b906c44973f7d4b59b7a94d35c2220e7405dfcee98499c1c1dc92a89d7d9\r\nMac = 4e65b3d58492a0eebb66928a8214498f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 229\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = d9e9136339d361949242e4d8a0cd6917\r\nMsg = 419b9c9b093052577837862900e7de29273eb0678bf6238223b59176c78430b6f382f27bc8d9a95b53f26f1d12e545ccb434fa0a21b84fa7badb5872e208254fbd\r\nMac = 6c81094aded51ccd4da38d0412e7ca67\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 230\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 6f349dd8b69dd41c6f246a1685115772\r\nMsg = a5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb2\r\nMac = cbf41299c35e65fa4e2626430f95051e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 231\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c15e4e552c9197184b3eb0a74f5fffe0\r\nMsg = 7c4699a7d9e2d9f31410f20029676f3c97f5793f6732f95f6d33fd7ecc205d27b8e89eda803316a3cb9951f12111b4a6aeac606b43835a469eede86eebf63e5e8b\r\nMac = 77e77de5c5600900e5b928d4be3d5f8c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 2eda9b2c6d7ad95b644a8739580ab4a4\r\nMsg = beadccddcf392ee56a8913f057da183ab06ec538e581b52c027ff7f63574b32d8bc4116efa1c56f4a4a851695a87f5fc5f7c47b46fe67b0400f2599fc80fe68d7f\r\nMac = 948e63657b8b6e2d130f6f25369d6160\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 233\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 233088b67b741f07859d122a6a406d89\r\nMsg = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92493ff733c6e5f1c2e56805ef622a5f496049ee0ef51a0d41e9d363febb87070be558e8af61e86dc76c\r\nMac = c778152b00760fcd85bced0f58861d13\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 234\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = b7471a8b2e50fb319f198a09cdaeb319\r\nMsg = 385f9fb139dbf88561b7a500b0c7b835fe57e2698c6d9f76de4fae6dcd45c47fd8a0811ebbfba35f43c17aa360f09c767c1cd9b70bb671fa638e852ace97cc73de\r\nMac = 1a8b81be875a4814e3f988c274784a63\r\nResult = P\r\n\r\nCount = 235\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = adf072ebb71e3400a2175c96fb0007a3\r\nMsg = a49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533\r\nMac = ceac74b3af8750467e3b3c51624d96d1\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 236\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = 1b1d471add4e7f4fe197e3a4a44d06ab\r\nMsg = da06bd1405028d93fefa3c037b5ad551879451a28314bae86a7591b359f56e4b4e26e6fb2fe7b1af0f930cc2ae785d113e8b16546d59dbae9f41e7827be1ac89aa\r\nMac = 16d0021b1f9c00b37fefb60af3358d87\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = af5d4991c189dada2cb552c3c52d599d\r\nMsg = 1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd\r\nMac = d7056fe01f0ed1b20adbe05cbccc544b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 238\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = d149441e667b245d4640e04c53ca6f51\r\nMsg = cbb34794bc8bfdf93d3c8d9f87ec1482b516b48b1e8a89b5e3b5df70c423a243384215b4bc69c76c6b18c497cf82088af74839a8c98895869a16294dfc094360d7\r\nMac = 64f5e8dce5c3e0f9cc224e306de70b87\r\nResult = P\r\n\r\nCount = 239\r\nKlen = 16 \r\nMlen = 65\r\nTlen = 16\r\nKey = c2f5d4837f9f75fb440c3bccad7c2e69\r\nMsg = 6a84594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf18724075\r\nMac = df8c8c61e8d604e24c7e3d0115dbe898\r\nResult = F (1 - Message changed)\r\n",
+};
+static const size_t kLen41 = 69750;
+
+static const char *kData41[] = {
+    "# This file has been modified to remove the 65536-byte long inputs.\r\n\r\n#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 192 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:38 2011\r\n\r\n\r\nCount = 0\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 771887708683bcb3577fbd0e6c13cad39955eafdc226d17b\r\nMsg = 00\r\nMac = a0db9bb6e8891e92\r\nResult = P\r\n\r\nCount = 1\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 733fd349c56d1086794eb20ed59ddc89b065bb8533b968c6\r\nMsg = 00\r\nMac = c76f82937b457105\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 2\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 761d74be5fae170a1bdfa16081b44c1e49972e15ce0818df\r\nMsg = 00\r\nMac = c65feb3d5336dffa\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 3\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 40f4a2261f154280a311f5b172c7ae34243cf2c59b98d37e\r\nMsg = 00\r\nMac = 05d920e78520839e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 4\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = e27150ee958b998c8a7e8b9324ead937d15580d09d6ffc3a\r\nMsg = 00\r\nMac = cf60783b5defbe3f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 5\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = d9bf5efb694089b2de533b1a65c12ae96d8c5bd75bd67fa5\r\nMsg = 00\r\nMac = ccde2029fb26c8ff\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 6\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = bcc658b2e53d51ed00c567ded2a124f8d1f85fc72dce5f80\r\nMsg = 00\r\nMac = 35d0d9ccab5b0f41\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 7\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = e31fdf3891c9068f621430315fb1daf418c328baf5e6da97\r\nMsg = 00\r\nMac = 8802047c11abcf2a\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 8\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 16a10208e91807fc479607cbaa39fa9c7273d89ce403b796\r\nMsg = 00\r\nMac = fcedadeca37381c1\r\nResult = P\r\n\r\nCount = 9\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 50fec559910391abc23eb7f5eddbc26a1031c0abd0a29ad6\r\nMsg = 00\r\nMac = cdc41e9b491092ce\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 10\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 6e9e0ae953b1b486ecd6b766d7b961ab79bcdfe2ffe95e94\r\nMsg = 00\r\nMac = 5096b9fc700929c6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 11\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 48043c405ef221c281d1e88246b6e1dda77e072f9d10353d\r\nMsg = 00\r\nMac = cab96cfcaad5cc20\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 10c361934fd6ff77a5051879ff228b08d841660d48b4067e\r\nMsg = 00\r\nMac = 167e7227d59d65e1\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 13\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 867ab71470f2dc3f5f11f8bfa7272dfc9c888e8e03323103\r\nMsg = 00\r\nMac = 96d9e7b084448004\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 14\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 5b10c228b447968267293ede9131d9345daa18c11d71eff4\r\nMsg = 00\r\nMac = f7055fcd9e8a8fd0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 15\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 997b712cd9295dc43cc19b40679f218c27af3e8c638d2e5d\r\nMsg = 00\r\nMac = 79a13778151aaaba\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 16\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 465b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3\r\nMsg = 00\r\nMac = 945198b568ed3db3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 17\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = d233ef50e0ce1924abd315510464ce22de377026529085ce\r\nMsg = 00\r\nMac = 240698cd0183f002\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 18\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = eb6e828e01930a4b0afc8bda63160942ce32df7b2c38a8c9\r\nMsg = 00\r\nMac = c68fc388f0633ecf\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 19\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 8\r\nKey = 471b8a2e5cb08c21d87e9eb7ecff1d6e6fc2335581769dc4\r\nMsg = 00\r\nMac = ab5e7c91c35a0e91\r\nResult = P\r\n\r\nCount = 20\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 8b404993b4c3f62a57e4aef272788206c8076acc32cf3a1d\r\nMsg = 00\r\nMac = 6a3beff4d1d0e84ea4d4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 21\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7cccb84fa5c1c795bc05a05ea5bc6497acd2de2d193fba72\r\nMsg = 00\r\nMac = 557b8efe4ca9c4e603f7\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 22\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f1d434dac8cefca05ba120a34840531bf1542c8fd03b1ff9\r\nMsg = 00\r\nMac = e2c299a2c5159eb777cb\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 23\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7fac8beb476b470e13a404ded315db1b15a85c2783eb3017\r\nMsg = 00\r\nMac = 50faaf26afd61c5f616c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 24\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f5b4c2a9f096e13ab426dd8654fc7b8ae6a4a8d3daa16b9c\r\nMsg = 00\r\nMac = 535cde3d2c32788bf167\r\nResult = P\r\n\r\nCount = 25\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = f72879cc3446de9a0a43ae1cf08935b8c83f9265b8cb2258\r\nMsg = 00\r\nMac = 4eeea4a1847f2a30010c\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 26\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7021eaab074be980543cc70c809186d93652d7674c10ddd9\r\nMsg = 00\r\nMac = d98c93f4e0228ff68cad\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 27\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 7fd546397a9a0129861fb6815d419a307f90d259d55f3503\r\nMsg = 00\r\nMac = 13597bb97e38f400e686\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 28\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 563cfb49f1af034cd38d2112685a52ebce8dca93e84ca10f\r\nMsg = 00\r\nMac = 866bc21135b11ea1bc24\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 29\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 17e9555b9b4f89cb63f2e90aca95c27ead6a099bc41c4c05\r\nMsg = 00\r\nMac = b04b3bd1719d35e80e2d\r\nResult = P\r\n\r\nCount = 30\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = a65d24bd1ab92d8d294d654423412860e113c976f12ed76b\r\nMsg = 00\r\nMac = 83c1c0f3e89f6584bdd1\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 31\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 35555c801a2e7c68cd0c347e0f006be00fcce70fdd8d60ae\r\nMsg = 00\r\nMac = 7e3670cab617e79b3f57\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 138b3db9baca13bc66e893efee2b767ce6a912b172c2cda7\r\nMsg = 00\r\nMac = 4686805681afa38cb7c4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 33\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 1bc05440ee3e34d0f25e90ca1ecbb555d0fb92b311621d17\r\nMsg = 00\r\nMac = 1e9f80432b39f7318433\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 34\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 5776d94b577ed26820fb13c00ab0e2d1a1c3589bfdc45cbd\r\nMsg = 00\r\nMac = 4d5f56d3543abed97233\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 35\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 22e493c1f2e27c9be7bb07fc00fdd51089582d139b0a9f68\r\nMsg = 00\r\nMac = efe1c6493542a8412118\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 36\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = d52f030107a2becde77331fff0c24cd72ef62c0f46ae3e6b\r\nMsg = 00\r\nMac = d1b9c7f13b189cd828c7\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 37\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = be31363e5144d9ff49ee67efebeef6d9a97e22f8a3ceb209\r\nMsg = 00\r\nMac = 03228a1a80d5f3d87b56\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 38\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 6a46492ab7ae5f3dbf16ee7b8876e0b4f0449f3b4f8cd89a\r\nMsg = 00\r\nMac = f016af853140edf22d31\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 39\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 10\r\nKey = 89ef2284d8245d87f88919d4d2f71a2df05ee21d85b7d689\r\nMsg = 00\r\nMac = acdbd54bfb1f20bb65cf\r\nResult = P\r\n\r\nCount = 40\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = f4e74acdeb91d0f0ab143823102d5baed1ffe168fdb5587a\r\nMsg = 00\r\nMac = 9c15bfd3c766f88190e54d395e5387\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 41\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = d9aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837f\r\nMsg = 00\r\nMac = 4a11b22e871b051ea74db3f763f140\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 42\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 13439fb32b1514d48de6002f5d12e19e1ced4caf35042602\r\nMsg = 00\r\nMac = 1412aad5e6b7f0d924700b438e0aaa\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 43\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = ffead92a4a5dc1eec6d2e441de9a9e1b7a88c607c9a79079\r\nMsg = 00\r\nMac = 6fb18d51e9a30fe6b7a6f405b3d3b4\r\nResult = P\r\n\r\nCount = 44\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 176ad1686a81992e042d6497a305038ba0cabf74c6ecd8eb\r\nMsg = 00\r\nMac = f676bdc753ffdad36628b1724b967e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 45\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = acd58261bcb2eb6345af7290b1d216c3016af6697bf5ab88\r\nMsg = 00\r\nMac = a6ae95e5a23b5f5a2dd8c8a520b9a4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 46\r\nKlen = 24 \r\n",
+    "Mlen = 0\r\nTlen = 15\r\nKey = 0b5eb52135dc6d9c1f56a2571c1389852482e7aa3edc245a\r\nMsg = 00\r\nMac = a46221058177012b073c6ebc6aff1c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 47\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 7bd398d1b9b45f7a024e70e71c1ee7132795fbaa2d63306d\r\nMsg = 00\r\nMac = 119bc07d7f3da0be3a87844b425c0d\r\nResult = P\r\n\r\nCount = 48\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 47575b64fd4797cda8d67e9cf115ae850d7998c39d2f8709\r\nMsg = 00\r\nMac = 3f2010bdcb2fd70241475db9381570\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 49\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 68627d802cfc43bb1a987e1ef4401fa84e8a7b2b43759f50\r\nMsg = 00\r\nMac = 1e0e3333ca5790a7e7df0d6d4bf860\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 50\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 7f16b90a18deec135d32c836063cde963fc4e6daa1555476\r\nMsg = 00\r\nMac = 013e1d0bfc7a7a6c838ac98ce0da2e\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 51\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f6\r\nMsg = 00\r\nMac = 7f9f1bdba93d26cc3c1f022244bff6\r\nResult = P\r\n\r\nCount = 52\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = fdcf28931c91b4b79c8f8332b4eeb3f995eb1ed2fb1e8ab9\r\nMsg = 00\r\nMac = ad7f8852f1bfd65dfbce3bb39db59b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 53\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 8f570ddd0963a80abec82caf8883eaddfd63cee9f375fa7a\r\nMsg = 00\r\nMac = 82b16380d804b8eef855afb5eb839d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 54\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = cc1d70d3050f022442093e3210f5b45f1b610dc0f12fef74\r\nMsg = 00\r\nMac = d1dc61c2ef7e2cd1a4e43dc34c0ba5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 55\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = a8a1cf9547543045fa2f00edf79bd85436bc1ae1d746790b\r\nMsg = 00\r\nMac = 48fc14782a351553ea453a3ec2538f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 56\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = 123ff732cccb535ec7a1c47a6b0ead68df31094d896709a1\r\nMsg = 00\r\nMac = 8f29dcec0a5d026d6fe4dc64cd1d4a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 57\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = ed06bd049d772cb6cc5a705faa734e87321dc8f2a4ea366a\r\nMsg = 00\r\nMac = e3fcf2590fa9ffe093bbfe8d3d7b0b\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 58\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = fa18c0b348aad167b7050c0ef6e7caf0436750873c7e4929\r\nMsg = 00\r\nMac = 630915919b6108770f5c3deaece1af\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 59\r\nKlen = 24 \r\nMlen = 0\r\nTlen = 15\r\nKey = f66296bf67b6e91d8ad629c1b260cb5ca1985273925e73fb\r\nMsg = 00\r\nMac = 729f983d3b49b2ebf24eb04368a851\r\nResult = P\r\n\r\nCount = 60\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 2f4a6501d8fe7b65f607757ddff6ed87ae0681b98b53331d\r\nMsg = 2361d2ed837c14b6c231daf0acf2623779e0d952e98e14149308807f79145c30\r\nMac = 9a8ad7bb37d79321\r\nResult = P\r\n\r\nCount = 61\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = e2d592cb412e65f9044257d78e7491f9f80c8b08102c2d5d\r\nMsg = 4163b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f\r\nMac = ab85ac3a4f92ee2c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 62\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1534e69565cbc541bfde6901bd6e598e41a7a703091c2240\r\nMsg = 85b78269899a4712eaa9c3de041f5a74766ec27dd5265da8a117c6f277baaa24\r\nMac = 6b177203b17cc7c2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 63\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = f0302d9a197a285909657d611ce12458b8d24652e91ffe8c\r\nMsg = 3fd6b98961f31c7b7fff0baf1cbb5884a9290ea7b5ee49915efb4b510b6ccd8c\r\nMac = d2d84fac8ecb665d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 2081442435626f7ce377132c46385510d9febfdd90c3f104\r\nMsg = c4185eb75fc23adff60d6380006a1c20fa2ff466ffddf67e99a421bfd729188b\r\nMac = 7373df1900b7a3df\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 715fb6fb464513f3650a9d0c3687980ab9caa9876d69dfeb\r\nMsg = d60b3402ad9f5f09375862ae7a370f0c744ffaf5001c80e3fd150730ab848689\r\nMac = ba39c81c18821872\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = a4d9f94e644fbcd97e0d993cb0af507eed259fbcf8fd7083\r\nMsg = 677acb68500d6cbbf77a3f34f58840f0c16044827641dc43d6767ce98f85dd5c\r\nMac = b129c1785acf17ba\r\nResult = P\r\n\r\nCount = 67\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 94b911cdc3137a6f7f32651b788eb82975660aea52b2c03b\r\nMsg = 549aa84bb182312dd016e3107f3b1f9c5b6a89b543561a450ccf713c76e66ad5\r\nMac = 7b92156f8b36d5eb\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 68\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = d3fff7b6f08dc4256239fc112890429fa00393e84e9b294f\r\nMsg = 15d1522654bcdce344b5d9753a0a6f31c859d547edf520478a8b5ae41506d5f7\r\nMac = 2d778849023fc9e9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 69\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 77bbda69ec034d73e02b06f0af30e2dab60ac80cb7822eb1\r\nMsg = 1e6ee96598bd014c95e9540f5cadfe6885cd094e04048e81633d1d634f065f09\r\nMac = d35f3c169f67b597\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 70\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 544a757bc50658d7e73b25688e7fef86fb1f9f08ffb33a70\r\nMsg = e473fe5656713b3b0e4fd12c640e8c542950577f446b01d09cbc41b6393ef81c\r\nMac = e1dad03ab8d2f432\r\nResult = F (1 - Message changed)\r\n\r\nCount = 71\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 1bebfde2d5468ba0a3031bde629b11fd4094afcb205393fa\r\nMsg = cf27b30423bd7e40d6b3aeb4b1bc01b40aec081aa00f2e3bc63ff61ac4b684dc\r\nMac = 617fdf927d0e4e42\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 72\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = ab83567833d2f3461b5fbecc0e366694bb5ea00933b2b3e7\r\nMsg = 58d43b9f1581c590daab1a5c56d6fbcff749e489acc3ed51ee6aeeac0104e6ae\r\nMac = b29232e882dcb8ef\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 73\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 0e0fece7b6b659b642668e8ba3dca330523e70279155f485\r\nMsg = d8c35129ca5a84e2e6723332217f0fd2e19fd06eb27d84a93b75276270f97335\r\nMac = d7ea4755260630e2\r\nResult = P\r\n\r\nCount = 74\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = b15763294afa61bc27e0785500ab5739136f51bc78b65562\r\nMsg = 8e8271b2758964fa71520f26aab6f870fa76ea4aa220475b3b379ec4ef8e80a7\r\nMac = 6357fb64482d171c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 75\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0a\r\nMsg = d2c9c1300f5a7520614550f9d23dcba6b41be6733426616f32912f155045282c\r\nMac = a12adaf849719778\r\nResult = P\r\n\r\nCount = 76\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 35631c844313ac335aa0d590fec472d805521f0905d44ca4\r\nMsg = 766f9ac761a06f4e006f405f7b3398aecad253f5cb8653e091e17427ff0fc1f9\r\nMac = 49090265af87c220\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 77\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 35008ef5baf263ae233758ca237dec1a51d67fcd3573094c\r\nMsg = a8f1b7b73100cfe1a03003331d9d55b75fb0d2596ede723fae9240581967ba38\r\nMac = af6c2ebe004c6d71\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 6f383f798df8f4b9f0a99206cff82709c367340c7b3b0401\r\nMsg = 9668a011e5a3a613ddfd149b0e529e9e66665006f98e730400adb4a8226283af\r\nMac = f97fcc39e240b547\r\nResult = F (1 - Message changed)\r\n\r\nCount = 79\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 8\r\nKey = 9071be7a11dcf7a062d582dd5932f047396fd9eb71982bcd\r\nMsg = a8a6703044010f8301ea33bd9a808ca35838c9f58683ae3925ab67b9e1fe1ccf\r\nMac = 9065cbc5249ff8b3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 80\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 36ad69f192ae4dcab771aeeacf01bbd32609bcbbea8ff9df\r\nMsg = 6e60fac7c027aed4632444a95824e61e2c50aa3ecdaf09ed9cec92cec35adf63\r\nMac = b6bf70e67b315c256f41\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 81\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 0cbb1d567bce009d1dc5bdb8115607213ed9a516389f728f\r\nMsg = 634efdf89ce2a9fcbd38bdc0b4cece54dfd7532880e0b4ce6eb3a4010b7cb1e7\r\nMac = 4f0af4ff9a9c9e844fe6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 82\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = ec65afd2d72bf477c7fdd9fbe3f1694c328088cb5f39d9a2\r\nMsg = 10d0e88b0db8d515bdff3a791c830b28e4e3ff4fa63f45b31a3f73dfb457bf82\r\nMac = 7172095284694f5ccdf5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 83\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = a76b981540ce229e73064af4474a7ca4a042d03a6e6bdcbf\r\nMsg = 740d4b25ca7221d0826057701a6bfd66c50a82f010a57be8c5efa0af0f761764\r\nMac = 94b657fb57cb2fd6ed3c\r\nResult = P\r\n\r\nCount = 84\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 36bf85bf63b28093d2dae511990a0bbd75184044b033c66d\r\nMsg = c1fbbae61b81ae",
+    "bacf151f1bccfb1584f3a211fe797996938c03e806392e14c1\r\nMac = 71796cf452f61db7f540\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 85\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 67b79d9ef1a47867c7d21f19f99ed1085f17a9f092fac689\r\nMsg = d354c54151c9dcdf0d0fd8c51413c2645efafb2bf6b680b25ad76d3825a4c04f\r\nMac = e324e8d377447b40629f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 86\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = eafa8699695431ab3cfa1e87ffeae4b822a391653d2e9d78\r\nMsg = bd647990f7afec76c8f726d1de806ca0cae6f708b5024b514f11c4320913724e\r\nMac = b0da9d38a1e821ef1f39\r\nResult = P\r\n\r\nCount = 87\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 1fc4fcbc73dab4e73ed9d7606acdcd42b74972460c640fe5\r\nMsg = c86553a60da69bec1924788fc3ab985158a2d4788f33c01abead80974d26dd67\r\nMac = 992fd0b735b9fa9255c1\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 88\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 618041501dfcfdd2b60d71c04d635f6357ad8b0643af77aa\r\nMsg = e7e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca79877613\r\nMac = c183b8f21cb2aac7201a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 89\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 53bcc9e9244e2fa1752c61e65aa5c592138447ef9287fdcb\r\nMsg = 92e962f0086591b6f61c2ce5af62480722ba6a640c3f53806c421de438358721\r\nMac = 105d286777da3f2a03a5\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 90\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 6d2429921f90a22893cb65c4530e56068e9944d0b0f61fa7\r\nMsg = ea2ad7b7d3f80793391af0328fbb594d79898e1047210628bbc7441e135bfbe3\r\nMac = 482a75ec0ecf1ea59f5c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 91\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 3100d3c70e823fee9a1bf486ec1c56771acae35246535de1\r\nMsg = 4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b6578\r\nMac = b0deaf1bb6d0425d1810\r\nResult = P\r\n\r\nCount = 92\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 79aa6c03dde4bc5949921563264b440ebef71b3298da67b9\r\nMsg = 879954f977e945cd4db33d20e6749a6832677adbdd9c7e262e4acf632f665f45\r\nMac = 9863fe041d191777067d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 93\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 85467aa82c22ab019f9243c203b4371c95604dccee5d81ef\r\nMsg = b86edcc59dc9d8e34bea3baf4bfc0d5e117482a48e522c1b02a370e9124b379e\r\nMac = 54b2f4664eca96639f7a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 94\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = d37e7aa9215cb5c2c2fe81834f200192ada3dd0f4ccb9d69\r\nMsg = 064f85a23e049529c74c4f8267abbbe685b6a838841a9e304fdf14b835eee396\r\nMac = 536701771f51d2ec354f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 95\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 72e8c7d74cec3e248fe938a1159d8d969928e6da26b8cf96\r\nMsg = 58019989445d5ee855e0ffcf84e76f3383ae09cfad74276a3edaf05cbf8d714f\r\nMac = 182d3bf14cc391aef27b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 96\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 5f847950d2a5d44137110594d3c0afa995b36422ab36d044\r\nMsg = 70523bc397417e09d791a4976960e02636ca7144a5681cf7b116daa33eface2d\r\nMac = 5f0b325fbfaede23de5c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 97\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = b01e84220a7d514060a79088b754ac0beacb60e5b3a47020\r\nMsg = 036137cfed567fc5e234f18d6c2b8c7e9ae0f3fa526d6596e9a9ee7bf1abdf0d\r\nMac = dbe49af18c1e1bc99b73\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 98\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = d90ba47d7c9107b103cf167041dbd7b41d96016d93961917\r\nMsg = 2d53836a0437ccf27cdfe2bf2ad53f3082100a9f045cebe6b3031d21c9a6c5b6\r\nMac = 7252ee3b5eb76abeec9a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 99\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 10\r\nKey = 02e5a1306f612bdec098458cff3e691d93f050ba11ba6273\r\nMsg = 4bef96da992ab9386a3463213773f3ca7164813a15e014ab819f153386fa04a3\r\nMac = 5fac9c1a1636b66e2f55\r\nResult = P\r\n\r\nCount = 100\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 4c99ce359b8b82b67ee990529a10f2ecceadad456925a57d\r\nMsg = 89ed296a3ac03fbfb71422b9211799150b9d766a8116bebd48bd0a5068132dbc\r\nMac = e0e9583d784f87e0b7dd8fd7494a81\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 101\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = f085fb257ab64013b43a59150864a31e76c9ae94913a56ef\r\nMsg = b90ef6b773f250d4dac6fb9e62babad69ab424c96a8c0625987c030a91d27d64\r\nMac = 96f1dc9a1c668bb203428181c016ec\r\nResult = P\r\n\r\nCount = 102\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 8109f3208d5cda0f12141e40c85959b72eff1a937dae7f4c\r\nMsg = 49ab30d5c01e91bf113764342cb8ad32e6af945341a9c6a0ee2319a910416fd6\r\nMac = d13777a33f9520793eb8cbcec047cd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 103\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 1eba29062320df7275a51aa090ab489571057e64f0ff6a52\r\nMsg = 754f03c2e298a699568d10c3e40390e0f8c398283ce1c35dbc4916fe479b87be\r\nMac = 87dcee48dfaa43e8223a2b338b220f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 104\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = a04b976fa01411bcc9a3863cec91f486944fdca6e8754615\r\nMsg = abf45f39904a8f5766763fe80fa189ed9c6c15bb1a7a8fa0ae3058c9e5b87c63\r\nMac = 577aa39884335a4f66dce2a612515b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 105\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = c6f0a3692c9280c48393b0dd763e5d0b90477f34ad69f192\r\nMsg = 737bab64c8a0fd6a07329bd729d2ec88685cb5404bd13a40e095a61846dbacbc\r\nMac = d61ad5f6d8aecb7b3fc1ddb1aff64d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 106\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 095eb52135dc6d9c1f56a2571c1389852482e7aa3edc245a\r\nMsg = 47c577d1a7e69828b5c3264738dd334be8d7678ec77bf1ccb5fec3843f85ffa1\r\nMac = 4fd309a62435edd9b1ac8861f904c1\r\nResult = P\r\n\r\nCount = 107\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 2f853c1ddb31694985ea5e47322bfc8567fd7a74a46b0597\r\nMsg = 5719e671686e87e931c2c0e5842e907bf584d226e040645eaebb896b53a28c7a\r\nMac = 75ed56da2db0ffa101578118e3f620\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 108\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 67f5adc0842d7e1a4f8591d678334c95ac83df95c4341c30\r\nMsg = 6c8aaf2f91ba87b61814ed689331264c7bf98c2223c426a4ebbf7b0db692a8d8\r\nMac = b7c591522e9a5a4f3af3aea24121b6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 109\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 8702cfd1ff87a749ceb0a7192f5a872740b7fc600845df4f\r\nMsg = d29b6a2d421abd00a59b756af34bd72a42f5557a2ed40f8a7ea59b2e05ff01d3\r\nMac = 33b597665d375c95464af2ad56465c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 110\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 64ec1fd6af554485856b7bb3c0ad16fcd9c4ec690914a09f\r\nMsg = 0418a0afc13d6215c7bd68b12a327587eb63c145120ea626fce59c16f7d66717\r\nMac = 80a85e77efe4f47d8938dd9c55d67e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 111\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = f2991112c2cbd3038ae37b772a5090690006009f0c1965dc\r\nMsg = 231d72c9325f8c17aef4efc94855803eb2fc1eea601c84a98e8f7053840f0591\r\nMac = 14269c545a0e3d56ac9cb195cb6197\r\nResult = F (1 - Message changed)\r\n\r\nCount = 112\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 2c6d7fb9e92d98a1dd92e96f6b4013954ce1aaa5de242e6f\r\nMsg = 87ec7423f1ebfc37ee83c85938d58259efd16e3c8e55fb871e9998baa9cac81a\r\nMac = 782b7ebbada87c3572a3918a03305f\r\nResult = P\r\n\r\nCount = 113\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = d95a1b24964bfea5dd5a65f5a1398c6f9d43b26d98b47816\r\nMsg = 92f9cf56188322d18cb41d723847e6d419cd163e2be71b78e7b8dbdd099a99b2\r\nMac = 2498787836840fe1411a17f153c546\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 62f2490ba0c658848859fcbea8cc6774e24c9de979dd29d0\r\nMsg = 0822e3e6ba982091d532cd5271fbde25305d1f6e71880f81c618f267a9f122e0\r\nMac = ffb6c2a6c73245138ce06e458cf914\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 115\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 1841161a3752de1491b2b2f519d8447636e149437478d2ff\r\nMsg = 238e36b73b474de88226d4298121393ac9162f1736040bcd717b6e8db85125ff\r\nMac = 4d1656a2c8632260aa55a097451fe7\r\nResult = P\r\n\r\nCount = 116\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = d7d9a5f750078f1a82dffe2c70e6b0016eb42d13e1a8aad1\r\nMsg = 28a107d22fcd0499e0ea5aceda6dbc288a5f1d9da003c626bfb9a6c27922e9bd\r\nMac = b67bc2e20c422f9c7c27a84ba0bcfe\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 117\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = dc3ca30782c9c0a7fe8923d4b8d31aaf21e63895f51fb2f1\r\nMsg = 8716298bc17ed51aa273711873e2c2863e7a5021e46a183e6c6c81f99c02918e\r\nMac = f41b1896a22db30dac50b6b3e5e2b8\r\nResult = F (1 - Message changed)\r\n\r\nCount = 118\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = 0b6b36339122610178c4bb72eb558abf15e5ed9ea0077a5c\r\nMsg = 52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37",
+    "663bfb65fa7\r\nMac = 665f05a489f8ad0feea290401b4bf2\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 119\r\nKlen = 24 \r\nMlen = 32\r\nTlen = 15\r\nKey = e200414db0255ca3faa7f6b17a62523f2c75d99f6ae162e0\r\nMsg = e749041b314f8719e17a8cb26162e2c910b31116dd769083149238d67792f991\r\nMac = 713fb4d0c95743ee7da970cac7f771\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 120\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = ea77165284ada4599f0bc0a41db787310f53a1588282b866\r\nMsg = f3a1a6dc2092ae7099bda65f8af32aa19796254a13fd9e0e7319d50402598faad6ccae2a028604db0d44690ba3530bfc8bad062cd96635d9654647c57bb81537\r\nMac = 9c7c379b5f8ee87f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 121\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 18e2baabdcebcd25958eb53d1bd2a95ffb9b51a3c1d92a9f\r\nMsg = 1df7392e915726847822817cb542df6b14df16d7d3d3ea8d615fe9ee651c938a0234bef059d139c350d6b01192cecfe1d821aa0b668e5d4dd8d5ef9a1eb47db5\r\nMac = db521506073b8c9e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 122\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = d39f12a9c6b63c17f116bc003f4def172943350e29d60258\r\nMsg = 75225a26d63e91281fb37ace46354f81de99dedfde8b770ea47f08503aea87d8d7b190dda9e150ecd1a2a182b06676da61667a04864ff4374838ee6899d8961b\r\nMac = 65aa057a01b390ec\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b2212ca369c611b725eccc3daa58df412787a3475f418d82\r\nMsg = 3727bac9706f482f55bda86dc052aa6810e2c1137b97fc93a65838a2724a9531199726517b6fed53b24d062eec7c22227ad9379b24da7658c0cf7ecc0368cfc5\r\nMac = b869a9e06994fb39\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 124\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 25e5fd5c39e684696e71a6f81f843a196dcd030ce2c07afc\r\nMsg = 899b48338d5ec3bb4a681f76ef37b6e25357b50e9578d85204c3753d3b6ebccf908e3de8b02dab01839ddf1a560b1ff33857a17fa4244b96612bbdeaa7d4913c\r\nMac = cfb0650c7566dc49\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 49bc9d3bcf3c22daa8cf55c1b59d4bffddc2412d60518e98\r\nMsg = 980026395d0544975dffaaa2c56db1df5816cd80cde513dc76f6f81d21f15c383c97c7233c9af2423fb28922efed2f69aa47c30de17ae1c5be17acbd0ad6cb8e\r\nMac = a7ed2a35c89130ad\r\nResult = F (1 - Message changed)\r\n\r\nCount = 126\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = c53f21f1ce3a1792a2de14277eb97664d4c561b3fd4b0e32\r\nMsg = 66e15206c23751497bc2c8d734aa1136aec08bd4e80fe3408bb3929a84efa749f379c7eb441872929b71872d761e0b448e0126e9fed86eeba611694cd2df4cf5\r\nMac = 1b86a912a0ec9f94\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 127\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6286e3e53ffb9bb143fcae724b45f86a23bbd74c42518144\r\nMsg = 62766e9acd41285eeed9b4007340dbb611699624274ad1179e327076135d907638c60f0c773c4ea8d9b8352027ee78ea4f22198f083d2f5cb920e55b9738c582\r\nMac = 3c56ff841dca9662\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 128\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 9c5d43c1a1269cde199509a1eff67cc83a1759b71c9e7a6e\r\nMsg = d576565a938782fc7e9b095db6213002bf5bbfdcd761fd6d876adb2c7947702b8930a5f71ec332bfbb4ac9b9d13d90c2d808d5459d0dfe5ddeedbe3e14038fd1\r\nMac = cc7b2038ead10d8e\r\nResult = P\r\n\r\nCount = 129\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 512a23489b8d6b62b63e9188c0ee5016f20448c082eefe82\r\nMsg = 1fdbfff7941ba22dd8e1dd13a05a3bd8f2c8096894266536c40a983929d0a6340af5233bbec1477363294519d3f3d9c6d41b20f18f76adb54495d9d43bec5afd\r\nMac = b81c76829839cd43\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 130\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 20d22c3b6ab38c5995e22b341f359be25616b2b8c7269510\r\nMsg = a1c041d1d4e7cd6a953f2e4837e3e676ed48633a2f15828f5f3551d5ad2a19c838a49caf75529bd5d5f89b3da2c2e9922ad8dc5d20325a7b3fae9dcd305f3731\r\nMac = aac4d4f4172e1f05\r\nResult = P\r\n\r\nCount = 131\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22e29aa7547e5ed3a64611e04f1d55f7a397c1619669879c\r\nMsg = 773b577b95e29d36fb30779d2ea23e2ffed9e1b46aede42bbe03a904fe22ef8f874298b5f4a6afe63f6ca9522863eb5cdb1c8d4bcd445e43e7302875e6ba3592\r\nMac = 16bf98c7a5deff18\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 132\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b320edb777d317af6c933a6530d9f5cb78d2d3104ac02120\r\nMsg = b31d3f55909bb660628de9eb95b75df776455f2f535f461edcfdf8a0cffdb096d573fedea7400f8374e62e30879a8beb259b3bffb4c3813a235b4c59853400c1\r\nMac = a0d9a7da024326ea\r\nResult = F (1 - Message changed)\r\n\r\nCount = 133\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = b9bcd0ae7100f991f4365ba0683b6d461979ffe86d0ecc24\r\nMsg = 19d0077952eba12a01db1d137050bd7e9102a31242eb38a5cfb3cf51b86c86cab57f6deef8e6eb9eb29c5dcdd852ffd627641013660b31abebd40fab60514159\r\nMac = 972119a55b125e0f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 134\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 00af010f462ad40a38eefb788b648e1cc292cd4bb08ebeff\r\nMsg = 573db0961531873316e87090f79e84f040c8358f8ca78fd9ea1ebeda82c1cff67c2ebbda1da0a1b233c1539cb4c0145da2a4a05431e06dac2c2731d59581a434\r\nMac = 92a67a99c128e173\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 135\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = e12f98507d6514c3b551d240595346bc9e9b6a987033b3c5\r\nMsg = 3927bac9706f482f55bda86dc052aa6810e2c1137b97fc93a65838a2724a9531199726517b6fed53b24d062eec7c22227ad9379b24da7658c0cf7ecc0368cfc5\r\nMac = ef48edc762db1d47\r\nResult = F (1 - Message changed)\r\n\r\nCount = 136\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 66fe8076d4e8538e18b84f965255d143f1c7d377e099c1c2\r\nMsg = b3fe18cbe086955384226c11c62c1dd14e7eabda573450d005b46fd9f9eccaff24dbf5d6d8530b5e25fd9f2a629df5c20a977247cab35255d71d992d85b04c14\r\nMac = cb67f0c1819ae458\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 82233a224ed122d7306bd6717a80fa1986964f9db41bd40b\r\nMsg = 65c46382a278490b9825d4f1907f3b9f196e136906067020b6b94ee398cb2f39ed07055dd0b151d974bb8d56ae3bc8b3b31d9054221514bd45d88a5f948ccfb1\r\nMac = 27e94d22e8961f92\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = d3e3bd80f45140cfc2f857a913a89f0c7dec86790feda4f9\r\nMsg = ff26ab66c6a10ef910f5b94589b24a7b6fae8e4396faa552b014603fcb5eee921bcfb81ffae989922debf24a6947ed6b1556c02e524b247c3966a7bc636a4fe9\r\nMac = d2d326c999095b39\r\nResult = P\r\n\r\nCount = 139\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 8\r\nKey = 466fa94c2158c1cd84b83fb2f15ccfce804f611ad0fbc4fd\r\nMsg = 5ea068d4f363dc7f1badf97b77ec85412a06dc8d8e3f4364265c7956d4088f014c78fad6c94be720ffb4ce4150da4a3f427f288031e0bdd241dd7daf975acabe\r\nMac = d6023f6ffd3c788f\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 140\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6f5a146524457615d81a605b38a5ff03edbc5c426ec7d551\r\nMsg = 9be3a736e7e72560bea45e9c8ee8bf37c279bf5b2ef16483adcc093208c05ee51a4db04632946ba2b96cdd9d15b33c25cce2eba4ede4f97aac29ebaa4cf6bbd3\r\nMac = af8fd676ee05154b82c3\r\nResult = P\r\n\r\nCount = 141\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = c62e6eb86b8daa37936086dd2c346e3b14be5054cdc2f3a4\r\nMsg = 559407bb6930d5adbdf19a7e285ba1dee5caa03ef54e3a3fc1b8c86a02f55921de9bf7d553c22d7ad915c6384329d664e70dffaefe22ed9c4e2c233706aafa04\r\nMac = e297ad7830c79d387ac2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 142\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 225557b0faca3d6cbaedec5c39c98f0ba0723f4070f2278c\r\nMsg = eb1383e84d4bfc5a9dad25374055b81eec74316b18f6e001b0623d470c027b7023456000fc61538b663cb7c0e98d77a7fc3ee2277816bacb4d9487c6741e3134\r\nMac = f07332a3b01d0e8026ce\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 143\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = c36acf733d310e3b9842b3006aa637ab092faf4a580043b5\r\nMsg = 1d674eb5d85945a6c7842042adebe549d4fe515501c06c1ba72961ee5bc98d8588afd6fd64893e21220db7ea6a973a420613130dde1d7f6a26677836d65bd0d3\r\nMac = d629ef50a784db860de4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 144\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 332e30ab63b197e79b86e4da732bad9250c0a5c9976a6c67\r\nMsg = fb41304f9f5b0f696ddb0e2f0f57bb091f8a31b5324d3cdf15c3bdf256d3502d06db2df9bea24c7ae08fcd641f199610427f3ecf24b92a7e00aef55aeba71516\r\nMac = 983e453f602db30e1f85\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 145\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b311796b0519a45c176f3ff458d4d818668093e82fb871f4\r\nMsg = ec1a1e9ee85cf960e5dc4e239619ed85f4b14d32cbd42dfa79f77a27f2cd740d08730de2eaeb91d0eacb8c498336e99b9a0c57c4045ef18749251dbfa733b4f4\r\nMac = cb2be0fd09f10deac5cc\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 146\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6311e7f0a7bcc11176fb411fe719d4e0782c8935524776f3\r\nMsg = 85f647d940a6d1acb6b7851912f807063515631eaabaa019dcfb993",
+    "e86f408266cace4c24940eda0083d8569364dc1afb816c0e5b95f3bafe7745e5ddfccd6b1\r\nMac = 776b9642c47fabd7e9c8\r\nResult = P\r\n\r\nCount = 147\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 6d120cbf74df2efffe98397ee303ead4e91c5e7839b82885\r\nMsg = 27ea9ff8359463a7742cd9c9c269ee678f4ab22091fdaf29b9007a92658687cbd71c4166e68c5a1ef30160191f6d926abb28f1da01da9ae8019a520edd576346\r\nMac = 5a902959d73ac97ea071\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 148\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 8e09d421e09dac1d9d966f02a3a520972c6aed2003d907dc\r\nMsg = cb32cb87ed59ee959c011211ae7cd475c3b5feb21cbafdd0b17796d47dc4d4e61da345b399c2661182485be13dcee33a9eaa8cc4b9742361f4c36f1361381f1a\r\nMac = 1b2bc5956223b8801456\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 149\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 3eeb143d4a3c08ecd9f7df8eba42789b517dfe99e07958ed\r\nMsg = 3292b8548a35fe34136457bcff52b469eafdb1b86b6cc88bed35c4cfba43785c59d6b01c1acb6870ef1e3ccf7dad20b1733f51ab1bc48cdb2fdf7d86eda17a00\r\nMac = 3a85ae8fd368cf9846bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 150\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 606452c62290b43559a588bb03356f846cecb0ccaf0bdaf6\r\nMsg = 3cfbc77b8897b6a5613f62f6b1c89b0d68f272c6c19b9e0ec6331ef616702006e64322d3460a57d3a5074c719811cb5dd78900268890da0ac177b40d48773548\r\nMac = 325aa552529e66a13904\r\nResult = P\r\n\r\nCount = 151\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = eac3a1a6eb8efe983c6b37b6c2709f5a8851ab72cb23a66e\r\nMsg = 2801a813dfc3f1c753f4f342a113c09b8e9a7ac16483c31bfd0b746b1db692f805937eec44c16bfbd132154557afb17ed01c1f4c55fe67f0343a6329441fb955\r\nMac = 5b0b383c4870af31a9a1\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 152\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = e2d592cb412e65f9044257d78e7491f9f80c8b08102c2d5d\r\nMsg = 3f63b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f1edd0e6026572ca0d8274bdaa6870749b0a727aa8c5b7e9442100e0c9b057455\r\nMac = 0380cb126c63bb48bdb7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 153\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b7b86dff6746145aa7d5bba73ed6a46da5b1200bd3520357\r\nMsg = 8e7f7e7e3ac2286bef6822ef47f5f73f2ff512e599df17c3723f7a55d4144a367c774de67e7e52ca3760c37484da7a2531d1d590b5380de11c34c3fe447edc0d\r\nMac = e7aaf6f82894d8825d80\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 154\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 70a26d985e6b99bd3a37575f011f2b84ed84bebf99a52760\r\nMsg = a2cfbcfdcd90e0962f233d7fb70668c8c36cd5e195e2ef5c043268f47187cecffdd36000f96e1f509f00283effa040443b3db15cf73d55c30c65f0fd7cf9c219\r\nMac = 96d09f0a799cb52575d0\r\nResult = F (1 - Message changed)\r\n\r\nCount = 155\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 5d678acdb2e6cc03537411ae2e95da120161ecb6c92d5e23\r\nMsg = 91dee0cd1d17d9342f4d346cee19f5f42e0c3b0498447ec4043c15bb2ae8fb8a7a02d2da489f28932c05fa4ea9c0760e0cf3052a97ed898edffce3247386b98c\r\nMac = 4a40b4f63330413918a7\r\nResult = P\r\n\r\nCount = 156\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 795846f9dbf36415640276642cccf87e3dbdf6519c5b2db8\r\nMsg = 4fc989f327e1a1cc7b8af618ee6ae6d25f78e2b76b681455336945655f13fd5a639bec3a004a88ad0e2df8547a0d315b8ba15f5269038638df6169d960f5ab5b\r\nMac = cc5efa5ef19f6cc63f83\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 157\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 61eab54142fe7e16787fd2d54829cd3c4bbd793e72f9ef9e\r\nMsg = 13f079b004d1fdf02121564f0a96b057f120899ce920169561d5e3aaeb16bb8e4347c7cf8c86f9acdc25ac26fb5d845a68409c0d9df0e089940fb7a88a76e62e\r\nMac = 920de91f34eabfc31648\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 158\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = b64d00f3a4df754fa4ee6376922fb67ccce0c6209f677397\r\nMsg = 8003586af34bdd0acae4f5547394245027c2ffcdc9d1335311acc859e9a2a7b817755a601dad14495d32f1ad811a7e751ac07cf18716e1cb193c203e7551aa83\r\nMac = 79e8a0ca036d7b0bd2c0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 159\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 10\r\nKey = 98f4596970e6515b5357f6c6396aac182d126decaddf567d\r\nMsg = 65737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267\r\nMac = 05c51c2507108a3f8293\r\nResult = F (1 - Message changed)\r\n\r\nCount = 160\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f0409b050346fbd319c8630e4bc9dd6d055355fbb961f018\r\nMsg = 731db98bd990b2ea19f848fda3519b32bc1d2fcb2f4d42e13f655da8e1dc2af428c185fc01a5d55e20b49d643a254e8675d560301d2ea0c5984ecce39c655de9\r\nMac = d37deaceea7ea3b50aeb02636e5095\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 161\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f266cec01c5fc08c0bdabc9537bd1aa2df9f2b8ffbe5cc94\r\nMsg = e19cbaa489a0f65681c983cfee3a4b699339ccb096df06bc871398be9eb926d84426fd32d5d7fa4aa563a88b41afa822f761560d9897a9747cd85b3dc74b4adb\r\nMac = 8690d4f8153e56e3ab80c7e918679a\r\nResult = P\r\n\r\nCount = 162\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 6e12c112720ef346bbbe7d1c19483721b1c52c438dad40e3\r\nMsg = ab8b36f46d1749cde7dd9936df95cdc8e0b359b8963bff4e7bd59599b32408623354a15e29f287a79801866d434a0ee9cdf37f931e53a39509057c7f2b3b413c\r\nMac = be9e70fdd15f96a8b7457cb727caf6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 163\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = e9ed05813262fbe769c1104d8ba5c836dbd229a22a681de3\r\nMsg = 606452c62290b43559a588bb03356f846cecb0ccaf0bdaf67a18abd811d4315a966e2f3f87f6c2428814446563fa71864d97c8336b0e34bf9466ec95598398cd\r\nMac = 4b3ac19f4dfa04108283b0e2e3a8e6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 0c84328951c66e0f5341b741d2c2796d3524ef732c69e779\r\nMsg = 9071c45a99cb987aa79596a2014f54e6fe400a6bbd5de96e156cae87cf69762f1329d481213d213d42191312fd76911d8df4c6ad9304754909058cf477adfbaf\r\nMac = 1e1003ce7546009a3ba7f59dec236d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 165\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 3aa8ec246323db7a3953737928061c79757de2e921c27643\r\nMsg = 84e9cc9bb7f4fb62ae7396859fcf33da5ca6c80c311eb392107afeddebebe0d662a887879e4014187d2fe8feefb01e6fa0d35819d7cfbf139e99451423b62ee3\r\nMac = 4259d5f983a287fbd987e3badafb33\r\nResult = P\r\n\r\nCount = 166\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 66c07634c94dedb5d4c6f19e7cdeb954692ccf51fa242abc\r\nMsg = 4bbc9d3bcf3c22daa8cf55c1b59d4bffddc2412d60518e986899d6a3e2a781668b0c6b9b4ee0ddbbcd06bd643eb201fe7829699e4dc86e2a1b4876bf9e40494f\r\nMac = c40f872ea2f1a1b45ab5737c2e4f33\r\nResult = F (1 - Message changed)\r\n\r\nCount = 167\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 3b9d6b0652836457ec4f701f0dc0e5aed73d16585d61cb1b\r\nMsg = df7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e\r\nMac = 602941735206bbe57ce1c2e3b9509d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 168\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 7253ef10bbc302f01aecf315f9a4122ba805dc4048c30ac1\r\nMsg = e12f98507d6514c3b551d240595346bc9e9b6a987033b3c50940442dc385634e2a28292856b97d5a78704388b2b6d0ff2ce7a19c64574deac593b98a7ce98bd8\r\nMac = 9e62a5b8851d3a0fcddf06fe116ac2\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 169\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = d718af395ba3f5f4c6d15c24475ec7f0f74f3238c81d42d7\r\nMsg = 0c0d3d7ff5d1b707be9648f263b8f013fa439978e959efef57d471cae02dc8e08d9d58d40381169afa039936f1f773c72003c1c5af03018725ab2408236ee4ea\r\nMac = 75749ed44b76d7ac16c98d8b6bc18f\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 170\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = ec98ec44f5a86715014783172e667a748f162c5c26a8b34a\r\nMsg = c0947efb86d54644087247f9fd95133a94075faf6250a2cc9f20df5393edbe1a4bdee20e90e877781a370a7f00cf9eee7373fc38acc54aba23b0df3f020356c9\r\nMac = d994553290066d778369b54ae06668\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 171\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 9fab32caed6e1cb27d2115cc641779127d4aa57db0955bd6\r\nMsg = 6e3e25db29da2c787bb37755ee770e2402fb8208da23389d36030439a143f971ecc880dfda90a8231ddebd2881981ca968ed45f3763a32ec8d2fe854fc2e4b4b\r\nMac = 4d3cbf9b68da0c5b49ab3b0913a2b1\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 172\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = aae24266e5981b2ed14213a29f961cbbf7f02f63a33c987e\r\nMsg = 8244cb416b3d09521ac2fd28c29084ff3d64761d46617b59e8b221de36702c2d3dc62e61375357b702cf8d4dd0f2bf2a1f91777fec0baf2c23e3e6865bae7358\r\nMac = ab8e9df7128f4857e0a1c24fbce473\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 173\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = b9bec4e88775777ff1eb3df671fe8ac03a693a1c26ea254f\r\nMsg = 8eaed4810702df8caa",
+    "12fe7e26e7ebbca11aa2de9f3169a8262c0e3c205a708f0071401aa8de09d28a5a6e590ebeb476341880c37bfee1a501229081eb27772d\r\nMac = 273b0d874010eac97ceda34232f7ee\r\nResult = P\r\n\r\nCount = 174\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 15120ac9468fa30c92ad87e7aba41ef552814e4ecbcb9350\r\nMsg = e3de6c6119d7db471136285d10b47a450221b16978569190ef6a22b055295603c9c1ed5da3bf96bdb43a5722cf4e2ea087cdf9b23b3093d250d44047be634b3f\r\nMac = 9a166994de85e5d60b154d49a867f4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 175\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = f9b9633f12967f1841161a3752de1491b2b2f519d8447636\r\nMsg = fa14d3656f7f7610f3a629bce14648a593250c6f309c02c6c552bb42984ac58db920dbc7d98f59295f37f3e9b99da55ef074ed65801b390366669b4c7aa1c483\r\nMac = 2c9f3650866b97ecc5ed66929f41dd\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 176\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = e87275bc62ad067b121b83f220d4ee2b4245541283dfadcd\r\nMsg = 6475757f30dd0a96ad64bde5c2605a9d2ca82a7223a9ba4c39b6dd3f86a0f4bd02876d0a32ef8af1071664b603862f4b9de6bfc6e7154b136e7a72e661957bf4\r\nMac = d0bd2d3d35a22f37bf113090cebecd\r\nResult = F (1 - Message changed)\r\n\r\nCount = 177\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 8b63d3c794e5ba0e09e5d5a5c56670bc0e289b30171ccfa4\r\nMsg = 44da1657e4be60d887a097e29d03bdbf5920bb0504e654bd963f58c487951a72e395237a9d32281125ed3a533c543de208c99bd063853abf79ddab4692c3a497\r\nMac = 29d04b97ac302fefa80f71ea378e7e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 178\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = 17039577fa27ef5ac3bf97572d9de5f8eac0aa58ff29b990\r\nMsg = b0329a0978e5a2d1bc85bdca333e7d0d1e9950217ee9547a84e76d3f49999451bf787288e8d12d40456c8214926c14e9b076032fe315c1633d5d21d85acfb1b8\r\nMac = 51b4bc8b479dbd60e5de94ba8b9d0f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 179\r\nKlen = 24 \r\nMlen = 64\r\nTlen = 15\r\nKey = cf6b5edc515882f8a7954a5d8517b1a85e9559858527d0db\r\nMsg = fde631afc6c042d77b579dab9298862d943be673cea59eab4a0c1b5cfddc2aef42590e6d8786d18a4646d7e338c2b984c50a50adbeff0fd64e7096f02e8385ee\r\nMac = 5ee3547a06661661c46c3778b0823d\r\nResult = P\r\n\r\nCount = 180\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7b6f4f158422f33543ca90dd0a76cbb23c0dbef26ee140aa\r\nMsg = 6704dc39a259152d2dc3f08b8799ffecf4e1bc38\r\nMac = 5c12ff63244c64bd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 181\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7a381f75058b85680061eeaa0242d3a16a64a5ca50cb61fe\r\nMsg = 18b31ed5ba1c3ac562ff3ef274424b86c0815c26\r\nMac = eb8f3d508c9edb8b\r\nResult = P\r\n\r\nCount = 182\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 3662d7b7c93211535c862ef3dc2724c492cc1e53a58f23a3\r\nMsg = 8ac860504258c134c6835d4cfaabdb316c36d99e\r\nMac = bc1b870eab5bea9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 9eac76976750b7937b3bbc6986b4c726f0d0a63310db85d7\r\nMsg = 5de2265292780222349ac793eaa17c5a22902344\r\nMac = a69594e569230df0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 184\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = ed1531500f319e09227d6bd181786b3b446f081abff2e697\r\nMsg = 7a734243e53cee654be988f5c735b19bb11f3389\r\nMac = 9f2cc2a8c3d0a34f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 185\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 85d0d04cd3fd2fb34dc18fd55e645f7492d5280657577008\r\nMsg = df899dd6b99cc28d66604ca92431fa7f442a4927\r\nMac = 18fc40b25fb9c138\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 186\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 90b0c8b542c91c1b2dfdebb589a7eced6c9b7b43a7729840\r\nMsg = 38d1a87296529595acce251cb232db8ede65581b\r\nMac = 077570fd0efa770b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 187\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = eceacd807db82378e9bd7c79054878f09dcb5087c2e1c349\r\nMsg = 09bf4f77a9883733590a3cc7ee97f3c9b70f4db2\r\nMac = 58af901fe0fb5d29\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 16227835305b7586a3106d93da8bd70aa0025df69a0e85dc\r\nMsg = 1a223362dccc99472b2cd1d712ec6dadd60ef972\r\nMac = c26f3980d17f6c36\r\nResult = F (1 - Message changed)\r\n\r\nCount = 189\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = d18cf5dbf5b2094dd6ad85d975449e2dda35b184633235ca\r\nMsg = 7f557e74f53c344daf7495526d1270dfa8fd24ad\r\nMac = 5b7cf33ec05b1576\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 190\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = f1681287bc931a0d8f296e13b3584d6efcb6ca76aa90cc02\r\nMsg = 08c62ff9bd7bcf189f530d5065f8764532d2692f\r\nMac = d646e2ec15afb14d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 191\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 116f4855121d6aa53e8b8b43a2e23d468c8568c744f49de5\r\nMsg = ab91d1aa072947d22f0dc322355a022fe7f0747f\r\nMac = 489068c07931ee9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 192\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 0a23972e036d62199ec327b25a3cf4e14c29279c6449d3b8\r\nMsg = 2df3e80fb6ddc1fcc7615330b24fbaa4981441c8\r\nMac = 7842f16a0cc7bd6d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 193\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = becfa1c96686b04153fae144c187f034dac3ee6ed70d867c\r\nMsg = a3a114679ce30c8472149da9bf3a42b1ffb07e66\r\nMac = 74fe19b5183ed3a1\r\nResult = P\r\n\r\nCount = 194\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 866b43c8fe3769ec0aeefd4dd02210488a354d67e82a81d7\r\nMsg = d9bd6ac153cb0bc4e19e59c45cfe0d6f4c9d20a3\r\nMac = a3a2ef83eba2a6f3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 195\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 7e00aa080c127cbabfdfa5d9d9728c7b25358aecd26f5850\r\nMsg = ce1a38cd75b9e955483ab53fe59649d087ecd1d6\r\nMac = 8375c666d09bf259\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 196\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 4bbf4c9cb6758329b2d5a53c4fbfe2d3df4fb50e57b3699b\r\nMsg = 6429ea2cc8fdaf58100347d21da64375b3ab2058\r\nMac = 77e417a60bca9a9d\r\nResult = P\r\n\r\nCount = 197\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 274b394da9402d3eafdf733994ec58ab22d71829a9839957\r\nMsg = 2b3d7949805afd73234cd327a62951b32c51df2f\r\nMac = 8f9ce09fee15516d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 198\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = d4140d988448d557454c3434fd77f8597e6420566845e316\r\nMsg = b53017500c100dea0511845597214484fc5f7f34\r\nMac = b9e85ce9178b81c7\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 199\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 8\r\nKey = 43d0d326c511e3bcf4f52660fc3c706a6a95c0ab550615f6\r\nMsg = 7c880698ef372304a663f0f02944500393585d42\r\nMac = 843f71e93b22f1e4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 200\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 273cc5013785baeb5abc79c8bde73af71085d7018e7be92a\r\nMsg = 086e6e3a21787acf7293446516b5f54da95a2988\r\nMac = 658a112d7a9e7a08c024\r\nResult = F (1 - Message changed)\r\n\r\nCount = 201\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 492bf7946bce1d3c6f168f4475e5bb3a67d5df2fa01e64bc\r\nMsg = f7b577f1396b23c27eb637e53d3d92460270b001\r\nMac = f2dffabed6871cca2e41\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 202\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 8e7d8a44244daa7df2b340993e32dac50e05d7b2e103be98\r\nMsg = 2c3c3582e026a3f29ffd21a92a8e1ee70f3a4147\r\nMac = 1bb40d091dde1903ac0a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 203\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = d2069266b0f180cb319e30ded7535bbe52d24be151de4bb5\r\nMsg = 392d567f0b8045359dedd1591517ded0171fdcda\r\nMac = c1ca2813ad38fd7f0f58\r\nResult = P\r\n\r\nCount = 204\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = f35c46bca9236830ff4bb057cd5764f02720ccb03b253937\r\nMsg = d4586dbdd5655cf659891f5b6015da524548dbbe\r\nMac = 4b6dcc78f6e0e9b7e35a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 205\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 509f1e38591e03a30a7409bc7e18595848253308c15edf40\r\nMsg = fd2109cac9f42fbb093a8675e5cd962c4c31df2f\r\nMac = 35387ef3967eed5b579b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 206\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0e9cf0ec43ca3fb7fb9a2b1999ae635d5041bf42f1b0bea1\r\nMsg = 65960c7fd43891ebdc7bf862b28d4822a8488270\r\nMac = 93c33247ca546a8c3fba\r\nResult = P\r\n\r\nCount = 207\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 51597a4c68cd228371e86c179fe04492642ad9b888405067\r\nMsg = cd8799124d94064f47d7eec59aff543b81ac66f4\r\nMac = 0eed36a27b40560b89db\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 208\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = f9f049328f5db22c41a501088e5759ef4d04db0c4b4f6d3f\r\nMsg = 7bdc26b5b4df58af539d91eb2ea10263a3e58b07\r\nMac = 68c45551f1367c989a9d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 209\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5343dacb05a29b3119d6f19bdfbcd6674950e710fc70180a\r\nMsg = 057c2d386fb1693b845bef585e76e0fc",
+    "4971ffb3\r\nMac = 372a801d1cd33d1059ba\r\nResult = F (1 - Message changed)\r\n\r\nCount = 210\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5987fcfe8a1ee76afaef54cb22d8b2a20b116f72bfc7117f\r\nMsg = 8abbdf380c668c6ff34a4f128567bfaf256570db\r\nMac = 5a8089b3d9f6c72fc858\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 211\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 301e0712ce74a1ad02079aeb0ce35edacc33f9a5d907cf70\r\nMsg = b2d894833daef4070b764361685fc94a780a7292\r\nMac = 57a225eca09fb227f79e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 212\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 144840494d15b2b31ad63ee05bf579a5e9fb98f534a6309c\r\nMsg = 71bf573cf63b0022d8143780fc2d9c7dbd0505ac\r\nMac = d1b2baf05cdd5fecd1cb\r\nResult = P\r\n\r\nCount = 213\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = b4bc602dc860108aaff5b3befb948a561ac495a22af9085b\r\nMsg = 3fa85ca50cc4c4817e951b5a95ac006973324c2f\r\nMac = daa1246b82d2e14e3056\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 214\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = ff48804c82414ff67f9b917a4d5d062d439454aad8eb4b0f\r\nMsg = 6def37d9b73fed0390f260491f582d2215369811\r\nMac = d7712f7d5f0da5dec6b6\r\nResult = F (1 - Message changed)\r\n\r\nCount = 215\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0273e421ee670be6322675f26f9014c040a76f0c869698f0\r\nMsg = d9de46934cb56e58899a31fd14ca64509131dc27\r\nMac = b3e79909c16c561eb7ca\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 216\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 27eb9812d3f7816fb6a1cfe474496e80750b1ed3959ec7f5\r\nMsg = 776ba7990086731ef7504947be74b3c455bfde5f\r\nMac = fc0f2dcf4e6fa041830d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 217\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = c56f710e39deed799ffde6d10e8aebfa2bab5e5e073d78e2\r\nMsg = f6fe0f16403182d012f8b6e02539c386075b4585\r\nMac = 6bcc4c1b06099220e9c0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 218\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 0236ce1fd3ef645a64b4ee7048dd35942e6a09e8099884a8\r\nMsg = dbf06366f766e2811ecd5d4384d6d08336adc37e\r\nMac = 1de717c402baf964e817\r\nResult = P\r\n\r\nCount = 219\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 10\r\nKey = 5cf781067bc1ef948e929b7287279c71cae5143631ca57d6\r\nMsg = a7f3fb7ed1342862247fb4b1993788837cc87041\r\nMac = ee867d4c0f910e9d9288\r\nResult = F (1 - Message changed)\r\n\r\nCount = 220\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 3e19b6f3f3fa3c2551466c9e09f0391350682495426fbb08\r\nMsg = c7496322ede893ae368884a91f80c3bac3505c0d\r\nMac = 55b25da032db8f3b4293a4865df77e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 221\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92\r\nMsg = 5e3ed45f07a6b3c225ba73d04d867f9c5b4aa703\r\nMac = 1b642dcc4fa08cbd36d109d55a8501\r\nResult = P\r\n\r\nCount = 222\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 8eca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeff\r\nMsg = e3807f6d8c6471ffe188df67d952a7d67021bf41\r\nMac = 9a37eda1e3331bf86d208b2c0338c9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 223\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 633f44dad6995a6af0302692142a47430491ae7b54f8b00c\r\nMsg = 3caa9b8b24097d29bd24b913692acf96cc78b998\r\nMac = a6665b3b158f37f587dfa0bde7f300\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 224\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 14ef8096666ddf28e0ac5f3458b52f3e0c601deae57fffc9\r\nMsg = 11d5cef384474f33c2d313e6e1050d8c7ae5b019\r\nMac = 2643bb3e1c01f406d90104c4437189\r\nResult = F (1 - Message changed)\r\n\r\nCount = 225\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 0c2e1951eeba1a9b6592202b1b8547f43fd755fbd844a874\r\nMsg = 9ad62bff38e28f75302b6527c1c107543f798817\r\nMac = f42ff7aa728c2d815ac7c701b59627\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 1ee2df7aa80e3a131e2aad9c17bcbf546d8b25e5a849db31\r\nMsg = c4e8594cd09be010b6934157e0557686310e8dbe\r\nMac = 34496d184bbdc0c9a57916ff64dc3c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 227\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 75650ce366757618af20205b69af7e5d4e82c398c00101e2\r\nMsg = 42a71eb81ad1c97ac53b88831b2d15f3c57e7cf8\r\nMac = 4c03394a98bb43e6197074abe63070\r\nResult = P\r\n\r\nCount = 228\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 386c659bc45d0a88acd54ef7eeaa3e140e1cafb1b01474a0\r\nMsg = f4fc5acff75d404849675b813cf7adcaeb8f3d56\r\nMac = 5cfb2fc8869304428fc012a14b616e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 229\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = ac192759625f4e42d1d1fa73dc0f62199142155615478f88\r\nMsg = d33f716df06e9047f8d718ab1faa06ec7b773bb7\r\nMac = bbf5b7207faa5b004216fa5caf3f93\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 230\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = efb497fb9b85d472e7c9d061aff501f7b1e3a311a86cfc69\r\nMsg = 1fd425560816aa21d6572150d1161cfb3bd61e6b\r\nMac = 2b7e14864d29437647cc1b27a8a0ad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 231\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 344fbbeaf82ede8a401df7cc121ed3da43be9bcadeeb5614\r\nMsg = 93febc9e16003cc8d6490ba5a6e64dd673a0f887\r\nMac = d34ef878392bc226f7ce1519f3bc23\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 4b6c6b6be3c04985bff49719c4e11be97d7757801dafadc3\r\nMsg = 754336f8cf27f4bcc7af5207ff02a662232d9a62\r\nMac = 5389c533cf43ca0332574802c2ace3\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 233\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = fe5ddb0645387cc6535e5b7991e6428c4157a76bb41084fe\r\nMsg = 216d9eb896edc693520f99ac91f34cb54e76d719\r\nMac = b43388ba7859f803655d914b60ce90\r\nResult = P\r\n\r\nCount = 234\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = ed14373671cd8041e00874b5d098ea225eaf9c68bb51cecb\r\nMsg = 0569c6be9ddcfbb82618fdcfcab3dd60c20c49f5\r\nMac = c2c11297111a92a484868179c5931d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 235\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = f2faab6735779e9ac49716e7fcd3faac939366a7249f4f0a\r\nMsg = e7292269b07683acf5bea0b300782749074e2313\r\nMac = e10f324c19d79ed83256f15e302699\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 236\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 2bddd90daa1251a42a0e2fd2858568887f85e6d96d57daff\r\nMsg = 0f8b828c0e59effbdecc30abb6cae0d9af9c7636\r\nMac = 1aab0530749ac4c6432157730ee3ee\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 586233e492b76ade095e8f5ffc6df4bf6caad2a675953b2b\r\nMsg = 92af89c950d6221473a358dd0f280277bde7ab0c\r\nMac = 2a79121e68ea6b841e175ab5066388\r\nResult = F (1 - Message changed)\r\n\r\nCount = 238\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 5aea45c0995e950f333e29f4db82ea4c4c080ff82fe32bd6\r\nMsg = d9ff1c84bdb03114ebd5f471247a579311f4672b\r\nMac = dc58e7582cb555ea784036a8ba4b8b\r\nResult = P\r\n\r\nCount = 239\r\nKlen = 24 \r\nMlen = 20\r\nTlen = 15\r\nKey = 900c8283c7d50d6da79cc07d3dc7b76c2ef76100fa3ae2df\r\nMsg = 3f8c6d21ec05bc439bf82774f1812bd2dfe0d3c4\r\nMac = ec1fa18916f991d7276428b9c93c70\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 240\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = abbb803150cd7fdb9f3d571bc749debe72c825e45568aa5e\r\nMsg = bb5fd7f4fb020d38c13df3003a9bb852a86948f406c51624eaf81989b006\r\nMac = 799d598f32ebd9cc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 241\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 2fa619eed51bccdd2ce63580ebf85467ac9136f79256bf1b\r\nMsg = f92d1a6731f3bdd811fde1ed936de907ebbc4179670857859aafe788b91c\r\nMac = 6477feb7dd4c818a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 242\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = d0115f369d0f74073a46e3b9625660847dd7ac7571e40814\r\nMsg = 97da5d1f669dc60b6c6fe4369e01f3fbb9af30b483b23d885497c684d6ef\r\nMac = 3d7f0acc627b785b\r\nResult = P\r\n\r\nCount = 243\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 045c4b86eed865cd989f035afe8c257c400c11b1f72548c6\r\nMsg = 5a6233e492b76ade095e8f5ffc6df4bf6caad2a675953b2bdfa8513df1dd\r\nMac = b5a44479b0be31ce\r\nResult = F (1 - Message changed)\r\n\r\nCount = 244\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 4a83bf338fc0125ee1966df46d46a0d0b41e51569b3fa957\r\nMsg = 794a86f5b20d344ad86fd5523d08f1864737be57731440c29aa6b4257457\r\nMac = b45939cc01918eab\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 245\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = d9ccd93317441e9d6ccc358f31e7e2ccef8c921b23d74299\r\nMsg = 48754401bb69bed2cce8689e47210435878c7ce184d911f60d26b4aa5174\r\nMac = e0d1b6a530944550\r\nResult = P\r\n\r\nCount = 246\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 1e50fae752ac3a6e2b1755475e84441947e9f4b1d29546f4\r\nMsg = 34245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc30493\r\nMac = a0fd99f1405b027e\r\nResult = F (1 - Message changed)\r\n\r\nCount ",
+    "= 247\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 4f98838899bb47fd3b0fd5efcf55403996567a0fbe1abdda\r\nMsg = 0c8cc752ae8d487c621be129326513a5ccb4141e324d21aab399148c1a83\r\nMac = 1aef1b7bc7856c6e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 248\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = c98a22a667aafab0c94047e03837d51b11490693d5c57ea2\r\nMsg = e4fb1612e50607457dee8087ec41e57fcd7fc550497eaf1c8b0d47c773d8\r\nMac = 2c467fe37fee5342\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 249\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = bc6d4c46476ac1ea902be391b8a3f04e102aecead167f0e4\r\nMsg = 93b3314baf20e28a39e89592012c35adfaa3ee6d3d8e494051ee9944aaf4\r\nMac = 7f10757d2d36a55d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 250\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 5783548205826853ae740d35d6d69ab524c38fdfc5c51eb1\r\nMsg = 11c90809f9c53d2f77b56af0a42287ac6920e3d2921cceb824d496caf1a7\r\nMac = 07630c2fc52a24b2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 251\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9cac76976750b7937b3bbc6986b4c726f0d0a63310db85d7\r\nMsg = 5de2265292780222349ac793eaa17c5a22902344063f497aabb9dc038ce2\r\nMac = fd092bab159861c0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 252\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 616de0b0f868eec923bf9edebbbaa51d3faaa3f86b2a5687\r\nMsg = 38013d62558647bc21d293830aa3ba80ff3fb84a8e0938754c5213077771\r\nMac = b4e782780989dc11\r\nResult = F (1 - Message changed)\r\n\r\nCount = 253\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 5df77b26f3d34eba49d287addf0a38d20514e2b7e6059935\r\nMsg = 1930a8b428334df9fa1ac16890f3a6a93fcf9d6855d00b06ff831d8f6a70\r\nMac = a8ad975046cd7571\r\nResult = P\r\n\r\nCount = 254\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = c56f710e39deed799ffde6d10e8aebfa2bab5e5e073d78e2\r\nMsg = f6fe0f16403182d012f8b6e02539c386075b4585be5b18d6ae1c5f9ebdff\r\nMac = d0df47dda012655d\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 255\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = fef8982f7342f1b953658453cd5ea413700eff00f1ee7d6f\r\nMsg = 269b6c1c95bc079398bb31e285a887c1832202d6ec257a2cf62468e29358\r\nMac = d2c90040bf66b2a6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 256\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = a34dfa24847c365291ce1b54bcf8d9a75d861e5133cc3a74\r\nMsg = 105d2b82676bf67ca9575ffd31d7d114e709826fccb6a5c3d3d7e26ff258\r\nMac = 5e60278f98b3135c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 257\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 520fe80cc4a3a5ad9c31f7010504923b7a7fd88292a64f98\r\nMsg = 2e1e0712ce74a1ad02079aeb0ce35edacc33f9a5d907cf70d0548d84ec3c\r\nMac = daf839ef84f1c81d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 258\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = da4775b8f7d654bc4cf2eb75ecf4831411bbc9a960ea2df0\r\nMsg = bfaccce3a9e66f45e454090ffedc348306dc2807951ce0bf100178612703\r\nMac = 3e2eb7f029e687be\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 259\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 8\r\nKey = 15e3b3c5794fececd703ac58ccb22a78e15bbd55c579416b\r\nMsg = c6c3457ffcb6e66c085ecb69492deaa704e25aeeabb7b7795fdcc807b325\r\nMac = afd75cdc02222e65\r\nResult = P\r\n\r\nCount = 260\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = e0f2cdfb64bda8f02ab90620fc5a1943c4b536a99f3f8820\r\nMsg = fd0365ff6061e5f55c0e382f5861aad99c135f9511f33ace4bdcfe48c6e4\r\nMac = a1046d4b29fc50ed94a4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 261\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = c7aafe7d3b419fa4ea06143897054846ac4b25e4744b62ba\r\nMsg = f1baf3be69f69611fcd47256e43830a1b3fd8bd3952eb26ed679eda7a4e0\r\nMac = dbc419e1ddd5cfdc63a7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 262\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 58c219f2bc8ef2ed7a82cf70e4af4747e36a30809a5a6222\r\nMsg = 622642aa69b3efe14abe0a1d2ba20f3f76efddf62e6cafe2845c4dfaa501\r\nMac = 4e496c3d2d84d11923c2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 263\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = abccee975feb10f635d548a8502f7c8b6adbd2be74117257\r\nMsg = 4f37a460d180a12789779fc335326c983ad6b18295b47f1715b82b2dc704\r\nMac = 41b234e0173770c469b9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 264\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 0218eb619dbbde2e846218339aee4383792856496eb3b85c\r\nMsg = 28d3510a37d5f8481e7f22941c1fb1d6c70686fbad9747a23c9d5f18dfe2\r\nMac = 3cede44c942387d91767\r\nResult = P\r\n\r\nCount = 265\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 88b2514f368d51db283039efcde1891652a77daf68feec43\r\nMsg = 067a3a0434e92cac02710221fbb6dfcb7ef0264e2994905491317c8c3697\r\nMac = 128e652ce0a8f1a6194d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 266\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = f2a78c449621278e9e927fcd50742d042d98d5142380fd3d\r\nMsg = df899dd6b99cc28d66604ca92431fa7f442a4927d03b392e707b548b8ebf\r\nMac = 2eca3c42b5e5d0f3b9e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 267\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 01fbfbde7dfdd6f0a0c5244cf6c36eece4d6dedd8baa463b\r\nMsg = 485ef613bdab5473763bb269a0d8c7a4bf4850bba072a96f8fc39a31cbd0\r\nMac = 333eb331d6a0d46fa279\r\nResult = P\r\n\r\nCount = 268\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 6ce99c231d2ef0fd48c2375dca93f8bb0df97d4a44e835cf\r\nMsg = 32d71e59634126ac6c6156a80a0dfa0175b29e9f40a3169680b1c15830fc\r\nMac = 3e90350e115c425ba466\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 269\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = f7a93aab5707ca3d2362c5669198e0218493acc3cb7b02d3\r\nMsg = aeec40ca8964fd6a67d3dc871ebf1bfb72f52907f1d6ad441bf2cadcc6d8\r\nMac = 7381d65aa138c86713b5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 270\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 84f39f5207afcfd677a7544579f2b888a1eabdee4e835924\r\nMsg = b8d21e9c70bf63f04be311d50f84aad7e1bd2b0e517434ab978d68d01c5d\r\nMac = 4ab61c537f8b15f824cd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 271\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = d488bdda400932de56a9f105f0e74ee79c2ed869faaadc31\r\nMsg = e64949ed85de6359595f286e29014c26daa7759aee56e4194ee958774606\r\nMac = 2752bc490802b9dd8686\r\nResult = F (1 - Message changed)\r\n\r\nCount = 272\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 76ddfb075fce4be8854185c6899a88d06e24854506b31237\r\nMsg = 9d86ae7d70e839078babf7fd60480a4351690867c6a8af837d9ad465220c\r\nMac = 2522efecaa1ba11c0260\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 273\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 618041501dfcfdd2b60d71c04d635f6357ad8b0643af77aa\r\nMsg = e5e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca7987\r\nMac = d958753757a11eacc848\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 274\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = dff6b9493de80447ee18ea7311fc9b8d74f77ac1ab21ce84\r\nMsg = d70aef3532bdc5293a3ebb11589ac1f801c9f93ea0d656e1d04068facf9f\r\nMac = 9a761e0e54767e414cf2\r\nResult = P\r\n\r\nCount = 275\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = d7780ba2dc5cc584472b64bc9f6246bedb27c70aca22c0a3\r\nMsg = 14691c1b47ff1547c1d2151913c2d1862d8f54782291ea202caa3d8ef07a\r\nMac = 78a2bf3a5fc87a14e090\r\nResult = P\r\n\r\nCount = 276\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 3bc5dba883e2e3b81df06760cc32f11009cf5a5503cbe864\r\nMsg = 9d043e368b41acb5eebb99197e15adbc3d19175a0bfcc97275e3e5efcfa5\r\nMac = f457293acf683c873add\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 277\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 7b3fba25c5ef410ecec62276b105ecc01c325dc2530e8364\r\nMsg = fda4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29c\r\nMac = 0cfb78ede5f4c185c33b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 278\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 38efdbbc5645f65414b9cb81d2f9e4f190cf6e6e05eaedbe\r\nMsg = 50422c5e6a0fb8231b3bb6e2f89607019be6ad92a4dae8e0fe3f9e486476\r\nMac = 0c1acd8e8527e2663486\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 279\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 10\r\nKey = 94ea5b0aa6c8b07e379122006042c920077bd61610df6b4b\r\nMsg = 1d52f401f01058356d8c4c630f64c5322caa6063d6365ebf0040ec4ee12e\r\nMac = 2dec0d3bca617209b07a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 280\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 5584994f80640233ac8eb4d2f873e8c997499095250b48b3\r\nMsg = 91febca4f1ae7e27501400c44ce8681ec90f5a5637c962db142c9284b1d1\r\nMac = f0b3135c1748e823aed10c4694fc60\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 281\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 57e99653fdcab10135a2ee3bf45c1be69e9ed57bd74dfbad\r\nMsg = 51c88fd98a7d82043a1500fc3d8a66ba7ab7760467c7fd89cfeeb22dd257\r\nMac = c588ee1d4f330e51872065c02cae61\r\nResult = F (1 - Message changed)\r\n\r\nCount = 282\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f622d736124641bb7d53706bf2a69db2fc31461fb92818be\r\nMsg = f09569906",
+    "381138cc49e3fc2384c5d33c34abd3d617c487b52ec6ee7b510\r\nMac = 610e1c1f9ab35059580061b8662a81\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 283\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 9662baae49c26e5452f3304ceed3b78326d2020a99a63f69\r\nMsg = 1d93aca4e2e31f5ebb84fad580fe74f5b6d1d86ab30cd0c8031be4090be1\r\nMac = 3c5a4eb51ec58ef3468bb00e7cae8c\r\nResult = P\r\n\r\nCount = 284\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f2100615431349aba5c4f5a7f358fe7be579f4cb9e8f33d2\r\nMsg = aaf26bff7ad4116969c15d9206de6c737b7dda87619e3575d9b6b2efd8b0\r\nMac = 7396deeb4316fc6d84d3af119656f3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 285\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = a5993acbea8c55d7eb55d60596f83e1d9f2cf636d06240da\r\nMsg = 0bc1fede6a6ed9e1deda82612fbaa6e60f0b2461fd5d131e6a7206f41a07\r\nMac = 2f6b0a9f2a972d299bfa5892f8ea83\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 286\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 775846f9dbf36415640276642cccf87e3dbdf6519c5b2db8\r\nMsg = 4fc989f327e1a1cc7b8af618ee6ae6d25f78e2b76b681455336945655f13\r\nMac = 8b3cf3171912096763a2ebe5ea9e41\r\nResult = P\r\n\r\nCount = 287\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = b214b16bbac27ccc9773d3c8dd31275da4876c039740ca8d\r\nMsg = 7786a3e30acffd6dde375bd859dd6be2c9221b979d0c66d1d5ed6e00b73f\r\nMac = 1a73acbf4e9250610b74c727b9c42c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 288\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 032b4cfce8a1acd89de5f6f78794e2813bbcdb89959dafec\r\nMsg = 3f0bf0141dd3ace0fabeace61811eac5ec801deb7ffe3b0514d43db90bf0\r\nMac = c24066cbc00cb5c28e48141b627411\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 289\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = a053255875ed4b5193bd9c5fa4172a1f660ecfd2a394c2a5\r\nMsg = 14666eb960c6b4f8b6ccc49f79a039b12c02e0972c300f1e9d0a38c0a474\r\nMac = abce3abc224772a43c058016bf25bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 290\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 0ee87b40abaa99f598fba22c3e677a85ca3ec95c3a51aca8\r\nMsg = 1bff19aacb9c7d0a44a15ce686a2469e3934d086365d36f449484498353d\r\nMac = 4d565c2e12901845e77ed8b02746ca\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 291\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3384f8563cfd0fc8019bacc9b691c9ba4ae6dc8cf4c00629\r\nMsg = d31e959cf7842db351db407266ddae0b36e37f34270576724083e9989764\r\nMac = 96d0dbf51d96b532321da593383964\r\nResult = P\r\n\r\nCount = 292\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 375904fb9fcafb7f19877b145b0284cef61ac7a3d88f537c\r\nMsg = 441bd4db5e80c7db1b575a19b7bad021a719658a2c818566291d3cdd32fd\r\nMac = 3b8dac029f6658e44e5f5bb8f8ee40\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 293\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3c1ca347a7d3d8db8f704410c493d7a65718cb7bffec2dff\r\nMsg = 555fd02fad4f44484133f9472c050f9da27390fa2a3e48cb0be0d7020171\r\nMac = 32be39d874c15a0fffc7111f76bbc4\r\nResult = F (1 - Message changed)\r\n\r\nCount = 294\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 8bed296a3ac03fbfb71422b9211799150b9d766a8116bebd\r\nMsg = 6df3de543cdb6d1adb6ca7df6b5a4510fc8379a4f2c87497ad1c2b9a69da\r\nMac = f24ff3218e7905d81c3e99c84bfd26\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 295\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 9530bb291d38f6bed10318081dde8fd178f02eb0e8b7d022\r\nMsg = 5f48624302d1acf7750994d45f0999ecd89a3861cd0268d5a51e672124b1\r\nMac = 0afed54c577e550eba7ac94a2d82d8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 296\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = f5400b86ace6e3da5f090befb96fc05d0409bf41fc77b4e0\r\nMsg = 1c79b055fded54af5ad2f3253f93a090ec003863d9458d3ff718c4c13937\r\nMac = 59f94d4b13539a5f0a8672e4599bad\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 297\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = c033e4a512297caecdbead892b11a9f7007af9a74bcab89e\r\nMsg = 3ce965d58856663d54269af4791ec57ef98227ea387d525769c23ab74674\r\nMac = 0dc19e37a255dabb61957f7f89ab06\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 298\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 2459f951d1255d093b72144b83b05ea3185d5123d1ca864d\r\nMsg = 661c6ff41af91a6d828a4d5d507f8a9130abe91412070950c5fa4c75c8d7\r\nMac = ac8e75b4465a52b3a7da3746f9875a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 299\r\nKlen = 24 \r\nMlen = 30\r\nTlen = 15\r\nKey = 3b63415210361822e23cccf0faae88cd7642f44cec45fe37\r\nMsg = d7f78e950d2ab520a6f1e82ec6f206b2e8c71131c85234bd80500527f131\r\nMac = 15e59760acd3dd74155d6d3739c189\r\nResult = P\r\n",
+};
+static const size_t kLen42 = 61387;
 
 static const char *kData42[] = {
+    "#  CAVS 11.0\r\n#  CMACVer information \r\n#  Algorithms tested:Alg = AES KeySize = 256 Mode = Verify  \r\n#  Generated on Tue Mar 15 08:40:45 2011\r\n\r\n\r\nCount = 0\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 45b74171271e1fdc19f9beadda58010d843af69dc2f4ad003dd74b9b570d5a98\r\nMsg = 00\r\nMac = dc0ee796\r\nResult = P\r\n\r\nCount = 1\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 2cb4239fffd13762fb5391f5a4760d12d96ea12666a793b4d651e9f4891c22c1\r\nMsg = 00\r\nMac = 2e19d6cf\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 2\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d88586da8b605a6fd5a45d316b89fea15e27ff4d92238397718e68b8e00ad605\r\nMsg = 00\r\nMac = 8ad78885\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 3\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 136ffda3359fee8c81e6dac131256f4bffc0d3c3e74f8aaf2f979a0fa5b8ed32\r\nMsg = 00\r\nMac = e430d0da\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 4\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = e1a7867476bee9928b7237ab7a3d502fbe3d2d45b6e4c41aa9f12b79099f019d\r\nMsg = 00\r\nMac = b6f00f90\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 5\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 5b4d945d55dea22e37821ec396476a4bfb617d2f392ad93afe67bcfda9cd9b72\r\nMsg = 00\r\nMac = 5076ef43\r\nResult = P\r\n\r\nCount = 6\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 23df62a79fd5866425427d0ccabf05b16590e8452ee22e028b51910926ad314a\r\nMsg = 00\r\nMac = 7bd29398\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 7\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = ce9da814595f76a7e52a1222c7c9a6579b3cc2e393ba51580ff6cc9b6ea2ad8a\r\nMsg = 00\r\nMac = ce872fd7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 8\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 507c4f32246d637fe08e454c638b014438109e1fca31f724d40ac6ec1aa20268\r\nMsg = 00\r\nMac = 282a7ec2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 9\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 537dfe9fc000468dde29800549b1cfaae67ad89d22c8264d7eadcd914ac54ef4\r\nMsg = 00\r\nMac = 7936b7d5\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 10\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 1f57959cecbd377374477e33b34979814f260f77867392ed645998f73a3b06ae\r\nMsg = 00\r\nMac = b4b63264\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 11\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 3d272b4a1a1031369aff514e2df98d580f972b5abeacc05cb1288e6e473c0fed\r\nMsg = 00\r\nMac = 18b35edb\r\nResult = P\r\n\r\nCount = 12\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 8774d1acf96362215a3d1e51e1a52a980685dec4f3afd2d438c03c00c04a79f9\r\nMsg = 00\r\nMac = 80eb7a84\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 13\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = f37155beb5eed8899d9ed4b5fa21b60b40af289f090a355d5bb1aee52957cd99\r\nMsg = 00\r\nMac = 6827f73d\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 14\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = fcb52c44379ae8083bdc7b827383df93cb1a7ecc21574730f9fe003b7302de23\r\nMsg = 00\r\nMac = ccad16d9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 15\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 83e231ecf8913ebce00e62b8f00c1abbaad710142fdb912c54664169f7af0e51\r\nMsg = 00\r\nMac = 8e393f56\r\nResult = P\r\n\r\nCount = 16\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 7d35e77450e2adf8805d5ad67de5835b2c5dccafe8440865c7e7a1501ed53a98\r\nMsg = 00\r\nMac = c6899710\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 17\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = 87143071241bb65261fe7afcc102416e59b9e46ee0c9007308f0eec10e45f6d6\r\nMsg = 00\r\nMac = a1a4449e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 18\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d30d2d1670553c71ff0264ab861574dd03a103d954226d1b540f18fc47b3fc29\r\nMsg = 00\r\nMac = 217ac763\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 19\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 4\r\nKey = d6983226b2c3a431abcceb77c8ec6b9bae80199115b28c5d7c56561e1b12944c\r\nMsg = 00\r\nMac = 26c717ce\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 20\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 0cf53b4aae3e0a209e58385dd32d9cc6163265241332c332af4de4b99b4022fa\r\nMsg = 00\r\nMac = 1bfd19f6e1070186\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 21\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 5f988f38410d26d293ef32d74eaa81acca82545e767ab59dcc750a09849cebad\r\nMsg = 00\r\nMac = 7e52911c0d7987a2\r\nResult = P\r\n\r\nCount = 22\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = d8fd6e1dfcca8f656705aed7e356a576baf8907c8d10d54c833d62a8a6703624\r\nMsg = 00\r\nMac = 31b478b4b4adaae0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 23\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9\r\nMsg = 00\r\nMac = c8be2b36c93684f3\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 24\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = fa282e1f3276a3e0c769f2ba25ce830591e860300cc03ab57abdb14c0374d060\r\nMsg = 00\r\nMac = 27b8111c3d9f14f1\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 25\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1c6942e914218135496e0d7910abe67b9f7f29bb09029bb37021865d7543c4f6\r\nMsg = 00\r\nMac = 466b7077bec98b7b\r\nResult = P\r\n\r\nCount = 26\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 08f199a8d7e3ea821dd3106e8947cd2e9d485342b25a64713db2b8a650a49ffd\r\nMsg = 00\r\nMac = 796deae0d06b1bf4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 27\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = febacddf3448c7464297ae53166793e2ed962de0d0947c5e5e17abe3cc103b07\r\nMsg = 00\r\nMac = 5e2d21aa3351a2a0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 28\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 59b9fb83b6a85f017bde6c0ff3ced955b9f343cc71b680c6b591302f52759412\r\nMsg = 00\r\nMac = 3e5428eca10808b6\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 29\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = f07e6655424125462a96390e02bfee9d89cb271bd9bbf22a9de45f6b7e949343\r\nMsg = 00\r\nMac = eed5aed01096226b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 30\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = a04f84bd79406c138d02698f003276d0449120bef4578d78fecabe8e070e1171\r\nMsg = 00\r\nMac = 18553226e5f9788a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 31\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1673a52494e9af02472c1777232aa3813c7c162593eca7112f34b3807009af5e\r\nMsg = 00\r\nMac = c5907fff58c68ee7\r\nResult = P\r\n\r\nCount = 32\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1e4ffbed2d5a7bcda5e24a66048660629d57567f83307087a846db8246ff332a\r\nMsg = 00\r\nMac = 29599bc212927246\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 33\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 8b80c24ab4a3c24ced82ca8c69924553a37a139bfa2541c59e15188ab0fa5a34\r\nMsg = 00\r\nMac = 299746d93b0b4881\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 34\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = a00ebf59768f6437b48a91923f5effcf31c745b980f79f2edde9ed18dcf2ffa0\r\nMsg = 00\r\nMac = 61950ed83db6bf74\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 35\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 319d3f58fd7257901ff364fa68b86b1ba27c11962b2c5be8e33eb95548444322\r\nMsg = 00\r\nMac = 26793e8f8d5eb7c2\r\nResult = F (1 - MAC changed - for 0-len msg)\r\n\r\nCount = 36\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 015a9d1f2df2c31f14cfbdc0bd68725fe8113a024f2a43312d963207fd6f0d88\r\nMsg = 00\r\nMac = b19fc2680b8b82b7\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 37\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 003cff344c4e1932ac628440d819eaaafcc3ebe7c525cb7abb7a6716d2b76e05\r\nMsg = 00\r\nMac = 48a98dbf16257142\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 38\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = 1a581f36e1816d346f7bcc6df78316aa353111e447fee6f0bd05d562f30626ab\r\nMsg = 00\r\nMac = 587155c18ebbf8b8\r\nResult = P\r\n\r\nCount = 39\r\nKlen = 32 \r\nMlen = 0\r\nTlen = 8\r\nKey = ebab54c4a22a16f7d9546bbf682b995a6ce944e949f1920eee058db95ab9c93f\r\nMsg = 00\r\nMac = 067927f063adfaac\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 40\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 58405ef8fb69e88221edc10a92c01cc44255aa7083096adb79bec3a8cec6d050\r\nMsg = b4aaf9ad1bde60a8d7e7cb16c1cf6b713df17d1507b028973068a95963a5ad5b\r\nMac = 42ffe65f\r\nResult = P\r\n\r\nCount = 41\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = ca0f404e3389e9527135f53eb58bca7726266b8086d33fb512e8143daad7633a\r\nMsg = 8f2a6b2185f73372ccaeaa7f93d30d1ca80a451ee0e46ccbbaf98c8f3f37aaf1\r\nMac = f2b311b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 42\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 67b896b88f07962e08471634ab7e522144d716a2969bde55a05c3c931f747a8d\r\nMsg = 0218eb619dbbde2e846218339aee4383792856496eb3b85cc43fa81446fedc5d\r\nMac = 69db1949\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 43\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 422994df8766f7a6a7ebfa2ca57ed6189d9e9e8455c8715c14f3f407b75dff4a\r\nMsg =",
+    " 12f0c45d06a138a964fb11b2d450620a2977bcd2952afe371cad6e3d48b009bc\r\nMac = fc5f1ccc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 44\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 3291be3aecd2e06cd2ee61a14d723450043d450567cbb0bf88ba32972d86dca3\r\nMsg = 343d5a4ad39acf81adcf24e9807618932abcb3bc076734f179174c77c8cb89e9\r\nMac = 3593d615\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 45\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a1885ce431cedbb60f7b3d96a06cbc60a964df156ea4b4191abc5a9f60a0c361\r\nMsg = eedd0d767a25b24ee25fe747718256af51d7b4bfe900adc069381a71a2dc7aad\r\nMac = c558f768\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 46\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 039188ec58fa55acde53c337fcfd0013f0c6efa55c60ce470112159bcaada11e\r\nMsg = 009f47f180e085776be6644aeac0070be64c289f84a7ba3dece7cdc54f0db354\r\nMac = 20d3639b\r\nResult = P\r\n\r\nCount = 47\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = f7d946f66e1cc4e5a79dfb5559cbea5a128545eac38e17ee7f3bac9a806faefa\r\nMsg = f250c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a5\r\nMac = 90b4bfcb\r\nResult = F (1 - Message changed)\r\n\r\nCount = 48\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a61f586ddbbe0219187f8f446d4b172f5e9bf855d1d5d6592ad8e03eb4d555d6\r\nMsg = 71c8eb0079559a306e236c49b7ce1b6cfe26c7888733eb7ec07690831a72c0c5\r\nMac = 78ce0135\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 49\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 7774802fd82fe96c05431acd40b49b1160d403c0db09b10f23d0bd0435022edc\r\nMsg = e75b6ca1b87e775b33536979422a1cf743f58c71b1599adb00050972c843cdf2\r\nMac = d885703e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 50\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = c4261ebb87a76aaa82a00392ee2e2318f0b52d5f2724e374847ad9ea5c8929c1\r\nMsg = a41bb1f256228302cd0548ae2148ff42774d18c2d6d3e38b36bc4938da13bac3\r\nMac = 857d8909\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 51\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 6219c19233c1b91d7785fde3b65df3bd2e1d74331ba62e4d365947a77cd243c4\r\nMsg = 68f17b9f57734784144112c79bf360ee324d37f9a7718137d954b15e796fa9db\r\nMac = 0e85de57\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 52\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 7e8cae1374d3a21bf2dd3786754668f17aa63dd5e3654cff9dd18041806d1968\r\nMsg = 2d335be62ecfed45183f5a04014c1a52afb7b918b9cc1f2be93b15c6e5240537\r\nMac = b56ee72c\r\nResult = P\r\n\r\nCount = 53\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = c2425ed20cd28fda67a2bcc0ab342a49d79d6b4eb196266cb0d116fc18895545\r\nMsg = b5f24c00cd15e377f444ae55e02b335379e7ae14e7c9bd05f0575d8981941553\r\nMac = 2e44c573\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 54\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 1f7871680bfa59a8a178604dc513b51a3d4c682cc4c421de594512e9dd062ad0\r\nMsg = fcb43224bf8989e1809d90481ba043328febaf4b6c1c05d18800ed98f4b71c52\r\nMac = bee03b92\r\nResult = F (1 - Message changed)\r\n\r\nCount = 55\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = d8a27558d070214d3f765cf969b2b8f09c0b14ebc492cb2539072b04db9f29fc\r\nMsg = fc69a1f0d0ba8eca9e7c0570cec9c76b511c74b2d8b65928444189675eb42fbc\r\nMac = fab3b2f6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 56\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = 72354b455230b72a6dbfa5cf6c3726d7f8e65ca773f9d469e99d165743657b36\r\nMsg = aac60835c309d837aacc635931af95702a4784c214283ebbfb43c4e29973560b\r\nMac = 69519d9e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 57\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = ca92b095173076a40e24522297be27fd3a765c8d417f24c71a9f03b3fe3d8e20\r\nMsg = a96c4d5c89a364263c97a453308b9360bc0ed868602b9ff54fe13f162ad31ab2\r\nMac = c59a1a39\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 58\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = aa56f98e03f559eea02ad958e125f2312ff97bc3310079ce437b383f247a9b3f\r\nMsg = 01bf2aa8dc66ca44d16d4567f1adddd4461f78706ff15cf68ad937eb57aa62d5\r\nMac = 31171cfc\r\nResult = P\r\n\r\nCount = 59\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 4\r\nKey = a0e317b790870e6703e6077dfb8ea327c12e29a17107284cb89d5effddb2d9a1\r\nMsg = eb4ea6b72dfc6657e835bf82054796183330c02a8db3c5b179abe37fd0a05675\r\nMac = 05d54199\r\nResult = F (1 - Message changed)\r\n\r\nCount = 60\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = e3de27949ff64066131c81bfee172b308f9bb0b31710678ec394837b79434605\r\nMsg = e41557341e8dae33568524f3f64b23426044c9db3526463ad16786af14f611b2\r\nMac = 975ad1d2fcff6a85\r\nResult = F (1 - Message changed)\r\n\r\nCount = 61\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 492dacdcb4a35fc438a6eaa35e26d2f683a1e85e92df28f213dfe1da6511161a\r\nMsg = 0515ad7b8576258645d37b7ac771745620e2e9e009cd778f34ed77a7dc5c30a6\r\nMac = 9f43dba2aad2f539\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 62\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = d71c50d55850d432cd8c8ff4ea427b3f19cbe14c785a7704202fcbcead0de5a5\r\nMsg = 7ffbc4a09583029cbb0acb6b13f08a189033da22c2ecf921f01d79ac68a9397b\r\nMac = 5d00ffc5f8cf1ddd\r\nResult = P\r\n\r\nCount = 63\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 557eb2e709d58915a8bada6433f2e5660247e0cb1588ea84a9d24028090eb396\r\nMsg = 003132645e3026f6a2b9d0644c16e5e4d1bf8b53a51f0e1b999bd45a67d19341\r\nMac = 6f3d9f50d09476ef\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 64\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 351d779277148ab4474843cc798942cacbe863eb1c1c9338dc25e251c12fda68\r\nMsg = 34bcdd3d0469c01d0d95a85ca705d887385bfde20596a90b47d902db826dbc8d\r\nMac = 79ded259f93456bc\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 65\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = e1c17ce3d3c61468a7652a95128bc0f6c33d9ccc46e7490327f15f645a94040c\r\nMsg = 97829c60ca9a71c23eaf1c4b4fbd72043037ef0cd356b68e0db0d4f0f50cc54d\r\nMac = a93f0d16499f63ec\r\nResult = F (1 - Message changed)\r\n\r\nCount = 66\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = a9a86a4407b7ecebc89434baa65ef173e88bd2dad9899b717ca578867c2d916f\r\nMsg = 25a152850b4b80b19d8f0b504b2a8a241824b3a1fca8d85c8713b2c0c84b5e02\r\nMac = fe84ce3defe00f67\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 67\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = ed14373671cd8041e00874b5d098ea225eaf9c68bb51cecbe8083149bdda062a\r\nMsg = 38106cdc72b1ddd0fe11f23819096dd7479e95ee9730940c28f51e28eca653ed\r\nMac = 470404ed731640a7\r\nResult = P\r\n\r\nCount = 68\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 009f47f180e085776be6644aeac0070be64c289f84a7ba3dece7cdc54f0db354\r\nMsg = 2eced43c084a86f89f61e7237425137c167aac29e4cac4071afafd3f0c9dee1a\r\nMac = f67d432e5b6fc5e4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 69\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = f250c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a5\r\nMsg = ce61d6d8de1b299c9b063d1e1cb1faf7a616faa7c6673d7f9c0a1ebe7ae285fa\r\nMac = e1d950593abc14e4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 70\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 001150b2dd572288b6fde466ec2c2a64c75a9d516b7096f7082bec9f52c20ad8\r\nMsg = 6dc38e37d1379732df4dd535db88d17aa59d7cf9e8d60ae695b4047b90d899f7\r\nMac = 2de6700fc1562ad3\r\nResult = P\r\n\r\nCount = 71\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 68e00d394855b6697da8213a120dc2213b3a8a1e88c9b93f5edef465a809974a\r\nMsg = d21aed2073e8ae9c0560f9dc1adb961d4f959fa12c0384a44c675192bea13477\r\nMac = 9594f10d5ce5e616\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 72\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = be0f6052baf658a3607d999b81401edf7e2afac2b143e1b908c8ea0ff38193d9\r\nMsg = e502f0b4710bfe517e783c4bbb85055c8471b04e12dd6776f276367fb5d36369\r\nMac = d409a879dccca77d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 73\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 7147b3c5ffb2660c45cd8d78a6fd44bdd5ba75349642b32ec88f6688a287297f\r\nMsg = cebe84df789c98dd125bf43cd993e2f089611b98d10be04904e2468d116dd2ab\r\nMac = 21cfc1e6c1c38df8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 74\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 205e751926038ef940c6599d84a9e1b4737bc826e9fcde544d43f2a10b5de931\r\nMsg = 86ffd5bd3bd1cae10706a61d247b2257b165f37cb53ff21761077a2295a9111b\r\nMac = 73d66ea826b84fc0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 75\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 8c8a502eafcfbb813dd1ea907b1660a41fcaa3f905aa93c22320f96ebfaf632a\r\nMsg = 626aed82974ef29a1ba0a6c6fefcbf34ca982e6214835183502f6a24ea2e500f\r\nMac = ca3d007ecd99be83\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 76\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 596db502a357e102566291b916b32b8a09e99d3739f5e6543a2cd8fb0c9a1cc2\r\nMsg = 22bade59214fa4b933cb5e3dc5f096e239af4c2f44f582b095c7fea6b8914bfd\r\nMac = ff4ec21d89d4762c\r\nResult = P\r\n\r\nCount = 77\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = f51f2fb4b3fd8045b70d34b600a2697cbf7503be0d8cfb5cdc60f9312e3e269",
+    "5\r\nMsg = 4d43702be4f0530319555d7f1a3356160f6cae48051f12e22a153d7e405c1149\r\nMac = 3d615ee77043d8b4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 78\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 80a4b14f951490618ce53d39abd3d786b425d4f76b26a25052d98ebdb7e9e666\r\nMsg = 0b2a77b0175ffafee40cf83bd19e785dc7ec4319786c49b3e7a741142aea901d\r\nMac = aedcaa2e26d2f5a7\r\nResult = F (1 - Message changed)\r\n\r\nCount = 79\r\nKlen = 32 \r\nMlen = 32\r\nTlen = 8\r\nKey = 39fb57fadff7cd9e1cfdba154422b71d693d08807d86da46ba63c929417ea549\r\nMsg = 567c7400f190d06e682b3dac5f751639a9007362b1a2a8b618800fbb9f6c08df\r\nMac = e29461fe8c6b3767\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 80\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695c\r\nMsg = f7f28df82f910badc5f4b3860af28cbb6a1c7af3fafa6dae5398d8e0a14165def78be77ee6948f7a4d8a64167271ed0352203082368de1cd874bd3b2e351b281\r\nMac = 4a0fd541\r\nResult = F (1 - Message changed)\r\n\r\nCount = 81\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 713fd349c56d1086794eb20ed59ddc89b065bb8533b968c6dfa60bddd16646fd\r\nMsg = 4f3b91aeaaabfc7d4dd6821549d4eee2ea17f59aa196c67b422be2d46f3a2ec65494464c969b157985a6a30199a72dfb1c0b7be524e16ee9c43fd95e83e19192\r\nMac = bd4eab1e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 82\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 1f89d9ee93294aeaf3503d15a6dbef48708de48897a72b3545b9e3852eb7fe31\r\nMsg = ea0608b19f47676f0f342cc2742e003a6a74fa2850f41e0cf162235163887a3830dd8b13b45842b3c686ca239bdb9897e646ac9f440713a0d8c5b18532db3db2\r\nMac = 8bddd404\r\nResult = P\r\n\r\nCount = 83\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 2b50dbe8a5ed0c7cb69aa60a38d10cfa4553c73d58c0ce84b26504b0fd55038a\r\nMsg = 2586563b0102f662b5a8f9bfb0c1d107a4c27569d27bc066889213e3e830427ceafaae1ca543aecaca7f34c671fbadd518cc28d9e806bba43b2e220e5cf1aa45\r\nMac = 987514d4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 84\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 29a7ed3aa55c7eb7e5bf343ca0efbf8b2062ce67b086255551a8efa0ae16569f\r\nMsg = 2e6f2d21aa133a5061622f08ac64c6b3a3dc8154862033055c27c3a3d9e42dc885d2c9f91bd1d0212f301c3e140b2f5bfdd777be623bd162a6214ba8f60e2e49\r\nMac = 1bf45457\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 85\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = a16a2e741f1cd9717285b6d882c1fc53655e9773761ad697a7ee6410184c7982\r\nMsg = 65916ae3d88ab2add5c0c6910ea993d385cbd35c5077ea0d9db30e53f378abfcbb1e0649fe14204470d4dd53ae16650ec444cb4ef22fed86b0009b57ef71fb5e\r\nMac = 578f80b2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 86\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 47e49e5b57fbb834932fa32107697471119f1be3c3a6e71a8c474d4b1596e539\r\nMsg = b3cec7ad75e2bf6c87029a67365aa83cf797ae2f4d42e720ed4c48ba21ea08ee6aa3609f69a6909fff6222dbb45172d255146e4ce1c59b48a7895936a8646766\r\nMac = e6e64597\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 87\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f0b0aaacc25a791c236aed0e9b537fad00a15efa9c89b5068ac52c64639fb1de\r\nMsg = 9a5a9560baed3b8e0e90b92655d4e5f33889e5d7253d9f6c5aff71ea4069224cfbdd19ae3f0ecdfa65c27dc3bed721712784a09fdde243c193ab6a0ac2417e8d\r\nMac = 990bb31e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 88\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 14db1ffc1c87117fc72981706c0f90404acc98aabe950839baeb6f0b727bd6d4\r\nMsg = 3d736aeca5720f5c7bbb16df61f6d785facfa070aaa89c2d9e8af9450d62490ebd6a29c7c8e521e4a00fcca7515439f006c09056cfb7f976a1e6b98b9f799e40\r\nMac = a6786e52\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 89\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = c6f0a3692c9280c48393b0dd763e5d0b90477f34ad69f192ae4dcab771aeeacf\r\nMsg = 8439ff717e1e15161119494d368d7f3812601588265bbefbc6d48e22cc8a51688dd021500cee38fe6ec402f9aeb0762f92b2a73adece96e1c7b24be2aa9924ef\r\nMac = 70126cfa\r\nResult = P\r\n\r\nCount = 90\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 75225a26d63e91281fb37ace46354f81de99dedfde8b770ea47f08503aea87d8\r\nMsg = d729d8cd1631aacfe485b1f408a4fb60256e7a8ed6e5b53afc34be7e57f1643b549fa9ba2677779318688ece225cc149babd6259ec37fbb4adc03e8f6dd63f03\r\nMac = 5112f762\r\nResult = P\r\n\r\nCount = 91\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = ab72eef2aba30205c986e2052d6e2c67881d24ae5fceaa8fa77969539152527e\r\nMsg = 5251a0aadbc92b76705eb053d09b25b5ad38eebabfe1980d143ac90aa81f7723353059824c8d9befa5ded6f5b4973f407c7a1f4aa85d8337d82d34fd3933e9c7\r\nMac = 52f7a014\r\nResult = F (1 - Message changed)\r\n\r\nCount = 92\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 6906d6533fbc33f56e38e6a639798005daa228ebd2fc8f93803d26fef30b8e95\r\nMsg = 6341370e126097f9721a13c977eb4875cf1286e15c3adfa4e7597e0e13d93b6a8ff66c809067fd5e7f40c358ee170d4ed1657c2deb3015b886e79589678e0452\r\nMac = 1b6a021e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 93\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = cd9072aeffebbdfcce95b569c34158d0e130ef24dc99e3f98a4dd246949be269\r\nMsg = f882339f93ff114bfead78044aab1c7fe109dbf1bb2d968ad476403fdd2034cd3168ccfb0cf02f1ff7646ae3875ec349478749edf300b08be7005cc0d6bebc15\r\nMac = d16bcdc7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 94\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 3005c0100dff59e5e4b0e3b95abbbc79749dc49ba29a79b1fcf7613ecb6aa9c8\r\nMsg = 4c2c670f3ac1c4e33a8d43063c8983e20f1ce6a73299fef1e70a42a5882c061b1ebaaa8330ee1181d946541b1d84b8d57df8de1ac9013ade36d2c682b172f8f8\r\nMac = e5689100\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 95\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f32eefb301356fb1cad6dfa94864542b5f8cd8e98438bdbfbbb431f0c10f12b3\r\nMsg = dae6db62842a8a25123e50041b701ad17e2f63a0496443c3d905a9f943e6e4e2f3d369b693ddd0372ff11fe496af4b700378fc72fcc9915e7bc864b44c1d4f77\r\nMac = 280624c3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 96\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = b0212ca369c611b725eccc3daa58df412787a3475f418d820971af46773382c0\r\nMsg = 13ca022396285bf7b82a600b560208c54ee14f8496bce684895029027e6451a09f4eeb0af9b889dacfa4b7b934ae30c7d991523e23edd0528048a75bfc525335\r\nMac = 8e9759db\r\nResult = F (1 - Message changed)\r\n\r\nCount = 97\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 57a9d1ea216c69c6e360221f8c858a9d356598a8b253e2cf67f1116b5df5927f\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d381082f379b2cae385dd526b189cc10cdebbd33bf3d8db2b449ed49064d30d4b3a359110d\r\nMac = 41022947\r\nResult = P\r\n\r\nCount = 98\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 749f2fb720d321757473afc5d3a377a0eaacb425e5591026e3a1bae6a785b921\r\nMsg = 2e4f5149d67c955c409b63b04d95538808da6202e69a50ed4d3846da52fcbc76c7089a17758d9d94a63efd5ae7054dbc0bf5a28b7381f7e78debd0549bff1e11\r\nMac = 67b34b0a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 99\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = f8ebad761b9e73c77faae3fd9390093fef595e77e6d7f6b35e2dfccbde925c44\r\nMsg = 18430f34d5b5fddbd228a910cab9c48e1ba2b5f57819eacbde756cc0c993b736a778c8008d37776a2915077af8ecfc76b8cd2ca621e9195bd0b27e31843d2890\r\nMac = 7a446398\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 100\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5bb9fb83b6a85f017bde6c0ff3ced955b9f343cc71b680c6b591302f52759412\r\nMsg = ee7e6655424125462a96390e02bfee9d89cb271bd9bbf22a9de45f6b7e949343def818dfc93d777528f609cd38be0a013b1eef816eb1f9593a850bb7aec5b9a7\r\nMac = 5e1fa5b9c9dcd90e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 101\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 57a9d1ea216c69c6e360221f8c858a9d356598a8b253e2cf67f1116b5df5927f\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d381082f379b2cae385dd526b189cc10cdebbd33bf3d8db2b449ed49064d30d4b3a359110d\r\nMac = 430229471a1cf1b5\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 102\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 749f2fb720d321757473afc5d3a377a0eaacb425e5591026e3a1bae6a785b921\r\nMsg = 304f5149d67c955c409b63b04d95538808da6202e69a50ed4d3846da52fcbc76c7089a17758d9d94a63efd5ae7054dbc0bf5a28b7381f7e78debd0549bff1e11\r\nMac = 65b34b0ace2fc6bc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 103\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f8ebad761b9e73c77faae3fd9390093fef595e77e6d7f6b35e2dfccbde925c44\r\nMsg = 18430f34d5b5fddbd228a910cab9c48e1ba2b5f57819eacbde756cc0c993b736a778c8008d37776a2915077af8ecfc76b8cd2ca621e9195bd0b27e31843d2890\r\nMac = 7a446398a5c59ec6\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 104\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b228c753292acd5df351000a591bf960d8555c3f6284afe7c6846cbb6c6f5445\r\nMsg = c66d322247ebf272e6a353f9940b00847cf78e27f2bc0c81a696db411e47c0e9630137d3fa860a71158e23d80b699e8006e52345fb7273b2e084407f19394258\r\nMac = 129",
+    "e40ed97c02ff9\r\nResult = P\r\n\r\nCount = 105\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 8ea05a5033ab8b009664fa2800c24e217488ce6888cad14774ad75b2696e9470\r\nMsg = b3f09d990c2f41c8707368bba007803621ecd76540cdb8705435d74f4300eee04710a936f241c034709e625b0dd5dae1f6e86d034426819c365a05f5be420cdf\r\nMac = 08e5d5b3facd3b01\r\nResult = P\r\n\r\nCount = 106\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 016b5537198ed152670c5fcfb70ade276de97ce0cb771c5f6f66fcfe1dfd945e\r\nMsg = 7ad591e67c6a3ce3c9f871e328fc4ce3b6e7048e80691da551efdfa4c96b06a3af53bb7a88ecc32869c8f776098df4d71af91393da239c24e50436e04d35a2d9\r\nMac = 36df9931a14dca9b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 107\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22d5d4c3a3aa8d2fd5f25c08b83cea60e94058e8235ddd050646b02617f82854\r\nMsg = e86dd3216500273d0b6150227cf03adc20c8a5fed4a2799fdff759a327657a3ca554b6af16d9dc5cf3db4bf9a474bf1ef1996a06b9fe4794e634ab94a0141d44\r\nMac = f0246b4959d2fa89\r\nResult = F (1 - Message changed)\r\n\r\nCount = 108\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = c892b095173076a40e24522297be27fd3a765c8d417f24c71a9f03b3fe3d8e20\r\nMsg = a96c4d5c89a364263c97a453308b9360bc0ed868602b9ff54fe13f162ad31ab20f3fc51bd2346ae68a006afb50e846e8431dbf7bd0eb3c8f30326d26311a2eb8\r\nMac = 1d943a8b0c470221\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 109\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 2c87c0d64806fe303c5e97bccf48360f89374b6119319bfaf8defbe74adf58f1\r\nMsg = 37c6206e23163c39a13f19de48cc25dc26e6f83cb376e8d2048ad7c141fa503d594bd395f4d36c70aa1e8a5672910f735d4da49884574f833ef54760975b0790\r\nMac = 58cb614230d590f4\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 110\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 028600eebf6b3eb04d8fac18399965aa8fb5f3954d3a657e188ba17f2e3bfc70\r\nMsg = 5b80d1cf745b14cb71cbc8dfe0bc7c7358f721c00099b3e250c41c2e1c9455c5ce55ce69f3f31090f9b1a1b7361e27f92d46d1e00d25f37b7b61f0b191385dd4\r\nMac = 02587102e6450de1\r\nResult = P\r\n\r\nCount = 111\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = ea1a626b623e9440e3f6f5c0b8b63b9967374ee82c1957fca5cd195ccfb2840b\r\nMsg = d082b2aad7058c3142021457d47d51d8ebaab62ab452f6039e771a1b0f3bd03355fe0656dfc7b75fade505bb05d689706867e75ec41da5c5ebd43d0844a670b1\r\nMac = c874df0a8aa87c5f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 112\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = d1155265fe296f374366dbd11f14466df1ea210cc88b0d1876509347e64815c2\r\nMsg = 3e3d3a464b2e6030be877f8db4c1c42bd2b8247adcf792ee833675a57f21594ade5be4399cc30ce373f68874f41584b4d7c8992b9082fc892307f645382c9483\r\nMac = 6bfdc96378f0c8f2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 113\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 9bcf914f787fd3cf62c6315a12feee358eaacf1f63ac802932b933c86b098a29\r\nMsg = 02c8b892b13f04d99b875b8aaa32136d19dd6b9c2a10d8871c66993a57ee91e3ebd0568e38348634ee5f5af4391f7da0356a1e7ba8424441f0db61683a002ba6\r\nMac = 365da451a2787193\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 114\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 35d5df6d714e2ba5b307c4d1908e108bc6fece682a23aa35e2de0e80d4cb3c5b\r\nMsg = 963ef1899cff6e0a6dcd80a27b63c20fdb8e9fa1ee3e14ed40ddb7c6b0dff969d29ba8f89159b82a19ac4240f402cd3b7279cd4c4ff4698c906f81edae8ff070\r\nMac = 33995a3d9c470cf4\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 115\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 511ab5e28b6fda481fa5a0fb3709b249fbf29be56346378a4d3f67e1cd6f09a5\r\nMsg = e4cbbf14f27490843b0f9a17b4520d4bb2c89726f4c788cae4a3344a1a2198bc222e41907fd16a20ef5f6587f1ee3cb7850b97c633b0e0894e70a6647af53f60\r\nMac = 3b4aacb52525b58b\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 116\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5e79f14d5f687ce62b82f856695af9f7dd350543ec763de75b593f1859e44c2a\r\nMsg = c0dfcb62fbc3a67ceb792b3428d040ed5e50999296702472b709a44f4c0b9bb1876f6e80866cc4d2d6ee2f0236440e029d18b2f27ea5bff14a24d53337877053\r\nMac = af30acca71feba3c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 117\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = cf8a477434cc679e52dc3f3f3520eb108239dad5bb363034bf0768c790343e70\r\nMsg = b891b1ab5a6919e0b99013e40fa7c910e55a480bd043d3d85b0b7d1342d3f777e1d2a6a4eb3ff81f5f71f99bb845217765c0708778f5be17a2294c2d5f369e0f\r\nMac = dc10e268f5f73bbc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 118\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 67d77f50727c7cd5b38e0b175a888c88687c97f2ccaa3daecc519116a7c5683c\r\nMsg = 02c5c55e7677c84a199d6e534772123c4e5c933622cfa8ef536e74cb3d745b717f53138aae9bfec54a1cb71ff04feb61d2f26aea65f37dae598f7b7fcebb978c\r\nMac = 885050ec166faef6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 119\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0091d39f3478d2c59bf874b96db9ce0f7e8b85a9b805e07dc96b219819d51663\r\nMsg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098482573c64ab24fe8007c697020353c411566bccb98b38c7784607045e61405b3\r\nMac = 96f639a86a2d698e\r\nResult = P\r\n\r\nCount = 120\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 0e6d99ee5137c8f6b9bb45a961be8a29358a91189cf9974f5bcf20d3b64c3b04\r\nMsg = 543ef4638f1322131402172d193bd304b34e3745ecedb9db16f35c0f5fa6\r\nMac = 33f10660\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 121\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 82421ddaaa5767a496f2b78f816cd1e1e6699f6e9e6576c34c909ba5f8dc06ba\r\nMsg = 4e2f0f91990b855a00d27fbb2e8db7184cd82909de361b52e7a75b16547d\r\nMac = 3f5ed151\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 122\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 134f20cb62084a98601f0e69d257fd2064beb47248caa79720a71d461ed07ce0\r\nMsg = c248fa87a6e48cdfafd1e5ac00f95fb1dfda861465747265796654dcff54\r\nMac = e7b21645\r\nResult = P\r\n\r\nCount = 123\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 98505229c1927d13001b53850d0b7d56f49087afc6c2351190cc1b998e4d6883\r\nMsg = 9bee2e347f763c5c506876bb514b5ba1248abc6b3d17cd4c96537d4ea432\r\nMac = 2c212c7d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 124\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = cad710b48ea0bce4a897482a535aeeaeabebb42619578a9d1296927301b3bfa6\r\nMsg = c1db23e776272765a0fee49edcce28ff7702b9ff9b6e31a4c3ed0c497248\r\nMac = 7f27420d\r\nResult = F (1 - Message changed)\r\n\r\nCount = 125\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 0bbf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c\r\nMsg = 7ff9ca86f820e4d57995d450611009ffaa726e6fbe4ce1558ca1e775daed\r\nMac = b2e5a268\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 126\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 6efabed650ce05ff22b67768e3bcc88c7746952106ecea92a38707af2b8a64a4\r\nMsg = 9cbce402511b890c8c9fa215b59c813b3e51b5dce01e776327f145623002\r\nMac = 03728e46\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 127\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = ca2843847a1c9539917206d344161dc40b379fd45dfa6a73ba6fa14defc40920\r\nMsg = d9365304c4363fba73feaa69d4cbb343a76eb2d29de6782ebb34d873006b\r\nMac = a94841ee\r\nResult = F (1 - Message changed)\r\n\r\nCount = 128\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = e5a1108da9cf587bcbdf051e216231bc27f0e6c1e97729b324d23768a89e0e77\r\nMsg = 536d4b6182a698d456e1fd9d522aab38cf05656f41a5e02cbd5e6f8cb85d\r\nMac = f52a4ba3\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 129\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 008ee06bf9b19536190e87820af9cdddb40aac44b0c3b1e50074fc29fe5cdff2\r\nMsg = c1eb4c800c631d9f387d2e8e431677b7fc8f65235ad0cf9b118d2b0d67c8\r\nMac = ba255bd7\r\nResult = P\r\n\r\nCount = 130\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = ba0bfda3b03c736c121cf9a257db55060b621be5168619ec4182f13ef6a408c4\r\nMsg = 69be384eb107340d953753e6a860ea2710e662e8953de8eff8f465d086f3\r\nMac = 9f650d24\r\nResult = P\r\n\r\nCount = 131\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 7a88524accb59f1c6307a1719a011eff211df24645086c67710ef539f5d3f29a\r\nMsg = bebe346356681f27bc62f0b838a25268e3b04194b865bf83eef2c8928625\r\nMac = b2566e6a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 132\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 9c956d7bbe2028739d73a2f0a80af5f2f180de923d5571e65bee0b25b5dd890b\r\nMsg = e0d2ea49e3e4a5823efd1b229c705ec3bb5048a7658f10fba2671c5d2cf9\r\nMac = 480a14ab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 133\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 2090b970a71ce2cf399a0d9e1d3d72c4eb500004abcba1303b24bf9af16707cc\r\nMsg = 0e0ef2cd18533bee01f19870f2fb22176c7e04748db4dcb98f7a65cc9104\r\nMac = ddb6f30c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 134\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 66921951731e95bbd45c014af5cf623933350dd9a90d1a36465716f8239bf887\r\nMsg = 0de1e090eb47dd4fca966e5f8fa5616618701164370d8a43fae2eeaf3016\r\nMac = b91b3131\r\nResult = F (1 - Message cha",
+    "nged)\r\n\r\nCount = 135\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 43c1142877d9f450e12d7b6db47a85baca7eea7fde595393fb394c1f34369aa4\r\nMsg = 77772e91be674abb0f496b47dbd632e5616177a0d16a8c11b271c2d38108\r\nMac = b2de16cc\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 136\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = db4b6206d001af121051cec70195055fc1fd0dc06ccc74549bc440152aded5e7\r\nMsg = 94394feda0528fcc67124dd1d77f0ec0b911f08c3e01e0c0dbc40c1d57d2\r\nMac = 5f72de94\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 137\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 4d658be9cfcdb19f79abc78f4d7f986d02b43a03098b37c8ca56ebb331e62d51\r\nMsg = e28660f57b044a44a19ca40ff7b6469a41523e8d1cef22f4edaba58917ab\r\nMac = 11fa4d1e\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 138\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = 70b4cf3883fea8c6cd852a4293c7e5cb0586a6cd71294883b760cdbbfd07aeda\r\nMsg = 4cb9aa069475e54b25e5688a52dd4acd134169c858105f01a0a1b134c72d\r\nMac = b6b60815\r\nResult = F (1 - Message changed)\r\n\r\nCount = 139\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 4\r\nKey = f75bb63d52c35137448c58383afe47e026d536f67e3afdff87f29b10d3d6d9e0\r\nMsg = 4259e4fdf10acd8da40accd6354f4baef4859a2f5ebada0d2c5b1b26905f\r\nMac = 336ee1e8\r\nResult = P\r\n\r\nCount = 140\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = c938f6bcdeca02939fef931c969a25edcc3daf338d8286016e3c7ee78f9d52c7\r\nMsg = 47179ddaa9d7ef6b9a53c646325c80db69128c6fc4f92ccd345078383b9e\r\nMac = 5cbd65df0ca36898\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 141\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9540e4bdd8c7ab99f0b76dd9de24c340a60f7706f680448509d5dc35cb5930da\r\nMsg = 4715a9a66d10b2dc1869d90fcf9b7fa99e91b40abcb8fc356b5853c92024\r\nMac = dcbd4dae7cc60d46\r\nResult = P\r\n\r\nCount = 142\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = d5c396fc1ee960215e57cfeeea1e792fab9334f2c45dd93e74cc47023e6daa4c\r\nMsg = ce188965b4d347a6c36a6fa5a47296b32ff0fa27311266b16b1d56ebdda7\r\nMac = 1684fadaea17bc79\r\nResult = F (1 - Message changed)\r\n\r\nCount = 143\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 897193cbbccbead9957876b8b42a77b404aed32a3f63bb9ab5f08cfe4936f35a\r\nMsg = 87767f13bb4904d0df0d64eb22c9ddb65e81b5739baad86ad5e2c239ffde\r\nMac = 84ef6f59b770d42a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 144\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 86aa015253a7114e1770b6a48fdb3ef22e9d5abac25fdc145315c09f4e8b69bd\r\nMsg = 2595cb8d4d6aaa148596e8502ec80a030d82195f9e1d9a26ab0ec0101e67\r\nMac = 63e67c44ecc05dab\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 145\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = a082c12e97bddeb0c74c13aa4ba788f8a127c44fbac6682050271dbf7ad6cbc4\r\nMsg = 7fc97a698d7b0eed7d7602a5d13e956a538c71c4b45978a47439c05601ea\r\nMac = 3e1fe077fc7e903b\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 146\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 18716638a2f6b4fb8dd2849fa9aab80b8dc846ee7e6b3cb0926101a814d8dd8f\r\nMsg = 6593194b9970545c5a910b2b4fcd46f0ddc7aa0bf873f0a339d5958d310c\r\nMac = c4556a75b754f6c9\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 147\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 6237aa30f1e3df239c96e7e50b69496da9305951024fb83a6fd01e96f6b2578c\r\nMsg = 0c5b7d1ba68654cd24871964f1b31ef7900dabc025baa02d37b55b35b4c4\r\nMac = 22c74fc64489ca5e\r\nResult = P\r\n\r\nCount = 148\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 32f60011bec76a79d2e837c611fad1cad486ee6f2aeeb74f1ea32a7e3899bdaa\r\nMsg = cf772bac3e767534b13efd381119b66f8a99b91aa52c8d3ab5f0a60073c9\r\nMac = 08d02ce41d4964b9\r\nResult = F (1 - Message changed)\r\n\r\nCount = 149\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = cb6cee5ba7b799f16254a17b1870cdb85fe0ef3f42110c138742bd7734f0d504\r\nMsg = 40d3c65a00d9204b76e013975ffd729b351698105d47448da285a84de281\r\nMac = 4cc6718396dbe247\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 150\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 9b8cdf91e848eeded2598ccdf084bf591ec2eb668236f555ca61a9d6b49959fd\r\nMsg = 7b3cc6f18a27047f4cdc35404e44eb8e51b1855d4bcd54ccafd1fcfaeef7\r\nMac = faf72c383b56a4ef\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 151\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = e6fdbe9a1efe081bbcfeb25b844734fe60aa6b80a5b5f611982de1a331b88041\r\nMsg = 59a0f85349c3f378d56c509a0a45a1512b5072474b297f9c1a8c24890016\r\nMac = 020354f33df66723\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 152\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = da360852e8b8c3a1b65af9e8630ee5481aa91dce414166f8f3dacb75b142f12d\r\nMsg = 61d908e9663fb195afc259529fc229b14e87995f8d3591b125fcce816090\r\nMac = f8963157ef7c1ba3\r\nResult = P\r\n\r\nCount = 153\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = c9bf0e7e470d0ffc88593796c4cf9a61c6db81d343305ee06a0f0563bcc618c0\r\nMsg = 19378e17c41586b88523a6b6af738dc47e63ea64b4b83fa283f1e502add5\r\nMac = 550523c0347fbcf1\r\nResult = F (1 - Message changed)\r\n\r\nCount = 154\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 7129ca274190400720bba27651f1ee0d5aa79116af9929418e198f9928a715b7\r\nMsg = 891e73a81d7574ce6f73e09e08cbaa0b9db242963f4469cdd2234512c061\r\nMac = 9982a14d261a4060\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 155\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = dfaa73c82a978548c99c0f1c34e1edc2c4edd42b73613511e4e6648ba364f9df\r\nMsg = 18044ac51ea97341061ae7d5bce017fd5cfb1554a384a75aa3919a74ba59\r\nMac = fd3a17e8c51a004f\r\nResult = P\r\n\r\nCount = 156\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 6f0be1905d1b5b607574ad93a1e7b4a536020fc6798acae862253916a0562707\r\nMsg = 8e502d5af4701025787e5b251121676182a0b26cdf52847f4d56d2ca0983\r\nMac = 73d76950066c77d0\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 157\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = b9fe826b0138de8184a3002d8bb59d228862e4a14f8556f88282d8494d29068c\r\nMsg = c97ca1930b65064b70d12fc46af4d5e220e6009e729a28a13b0f9a11d3ca\r\nMac = b8bccd70bb90084f\r\nResult = F (1 - Message changed)\r\n\r\nCount = 158\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = 99c8f69fb91b17299461fd8d633bd516dcdb172760695ec476a5775377cdb7a4\r\nMsg = ef589e3b4ad9a7ba390574a2db5330baea64894f8f881cd67b842dd23393\r\nMac = 38e11613e67e0416\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 159\r\nKlen = 32 \r\nMlen = 30\r\nTlen = 8\r\nKey = a86e8b43a1e81dce7b26420c0409628d145445d1c512e1c3df3270839475c668\r\nMsg = c71a0d1e20a7dc8e7adea91a408ecf3d512bcb15a6d8fc1435c6a7f915bd\r\nMac = 101c06c22819404a\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 160\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = c5a850167a5bfdf56636ce9e56e2952855504e35cc4f5d24ee5e168853be82d8\r\nMsg = d4794f6f563d5f6445450b59c1ff95d24eadc9c02b68eaa5df64edf81475e5cba8d2bfab021a2fc8\r\nMac = bf99dc0b\r\nResult = P\r\n\r\nCount = 161\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 551e188cbb7c7d1ff33b4bd5bb6c60da184b18f44d68d5c30704df47d8be6fa2\r\nMsg = 2b421be47d07dcb12a0706f7490d05024fce8f433079e18ec78f4c8678f5f1551448c9a0fc70e8b9\r\nMac = 32aeb3d7\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 162\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 000da8307f0e6112f0b8a8b1f927f62e8a9e5aefc0d37995088dd32e867148ac\r\nMsg = b89266f3a33e5b6883206e44f8e8e0cb01275039c304960e8630f0aa011c5c19d769443061a060d9\r\nMac = 1b5e30f0\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 163\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = f4ae2113ce96435b27369fd4571ae2841a965c8ddbfe61023219eff9abd490e2\r\nMsg = 433ea4e1923267fe443e1e89d2472834b72ef97323ad6d82f3825ca9e1d06fbff8c232ed4c716ab4\r\nMac = 05b3c894\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 164\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = e7c78ef4c4b959ee00cb1a09d71221a43892ef8ad705edd27ed85d03a377907c\r\nMsg = 4da25d1e7064bc4b4903a77452952885a06ba0712544210d30c0182533182fcac90b71e9f71caf22\r\nMac = c15acf48\r\nResult = F (1 - Message changed)\r\n\r\nCount = 165\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 6f48b3bf240525adcb02985900fa29747e4b1265e5a8899abb0ee51cb0f90367\r\nMsg = 98bf67b6e342dd94c948e76aabb69e7d091d24fba54ae233e4181404768988963915a2495b42a4eb\r\nMac = 71bb5873\r\nResult = F (1 - Message changed)\r\n\r\nCount = 166\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = cb6cee5ba7b799f16254a17b1870cdb85fe0ef3f42110c138742bd7734f0d504\r\nMsg = 40d3c65a00d9204b76e013975ffd729b351698105d47448da285a84de281bc3307cfd80b39488213\r\nMac = 592e54d4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 167\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = bbab624862e268765e9e6a13df55cf7a2267520e4e66042ba0b4905dc554c3d0\r\nMsg = d43b841f174335f1347834590b0984a2cb35f7a00a0ee993157d2d4f8487489a12ceddd6ac5b69e0\r\nMac = 3480805a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 168\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 2fc9e8f409cc6c0156ccf9f00686ac7abba6cbe08982a737fa08c7035",
+    "6f54208\r\nMsg = c1cd63e24e41f69a146b448cee0a2107817c8105732745aed817541eede8ee6809e73ddbd0742d84\r\nMac = 91623558\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 169\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = c49dc812061fa4995aa7c160ed7cdf769dd1ef570d8fc9c7f8552101c5bdb711\r\nMsg = 74ec6f53d188be3bdb647f37619fa5848076c66d21bac164c381a4517b1dcd2a384a4fc44cab97e9\r\nMac = 07471b07\r\nResult = P\r\n\r\nCount = 170\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 84b6cd1c6618c42ba74e746075dc28700333578131ca6fde6971d2f0c6e31e6a\r\nMsg = dc79743d2360cc52cee202b9bde9abc7c09d9d0311d89c3722da36c7993feb42992e913744d2f74a\r\nMac = 3acba1e8\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 171\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = dd472b0bf50519020a182f122239d161d9659773b4df454eb378fedc250eb490\r\nMsg = bdf56403d5ff8df4ffca92eb40d54a79b5595abcd67b9e2ffcc5cbc621d7523be75a87a2dc360244\r\nMac = 3bb0894f\r\nResult = P\r\n\r\nCount = 172\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 00ebd245e8c0e0b60847da5c8f7a1f33604932b9cd47a845a1a44599645b62ba\r\nMsg = a238e542f1c22621aebbe331e71123ed7f2591e4192180ae378c2c24a31c42d10fcba3a3f82c65e6\r\nMac = 1d17d6ab\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 173\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 2ecddb226ae668315eecf107c344926330b94077e029ac3bb67e6a077ee05361\r\nMsg = 38ee97f0dc635c7416a024e3af5c95dd1d496db8a5a5c3bcc20b9093ca906dfbcf0b9ebec3b450e4\r\nMac = 08834104\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 174\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 0a2978b5f20d3b5e5ed7ed5a78a093a51d5aa6e728077346f429c27f1c79b635\r\nMsg = 28313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b08\r\nMac = b2635d7b\r\nResult = F (1 - Message changed)\r\n\r\nCount = 175\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = 7f2286d42b4f9eefed1087f3eb3dc814145be4a110c0e74176f83e7d4068cb7e\r\nMsg = 6c1aa088d1a6086d0e72636744a6840c80ab8223409c61b733f7ef6a4199ed0ccbe96f6c3453866e\r\nMac = 10bf9789\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 176\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = bb0fabffbcc6935ca35755fd4bfbd192b6812cf75c4dc95bc3a175a1501be206\r\nMsg = 9801da81a6d9861f26900401aeaec89a74e3d5aec0a5d612a11b6bb4e03ac1db322e65afb1fb5afb\r\nMac = 9ad23631\r\nResult = P\r\n\r\nCount = 177\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = ed1d11cc4876f58feefc463b52d8d36e69c4c2c9227b32fe356d1e2a1bb88466\r\nMsg = b16e6c44f429efdc06a892cede56296e12bf185d4b3c6953f7d31b1c3d59bce136d93aa95a3af61f\r\nMac = 29b26a75\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 178\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = a6fd8382447181bd300ec1ef039d3f353446d01fde490509c3ef52a992bf6fe4\r\nMsg = d41f8fbb6f968dda0c1b2cadbec04a6c72124eb5dc40b8d2b180fd3b17af915b5a374597e036d38d\r\nMac = 2b343893\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 179\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 4\r\nKey = df0821c9ea6ab329c626d11b4bc1ba7351ca934ece6aae483e3d0bef48601f78\r\nMsg = 84b9c150a1df00ba29386197d79d29a2ceb42fe6390c9e763169f75fe15c55dbe817f5c7fe80f557\r\nMac = 3a5026ef\r\nResult = F (1 - Message changed)\r\n\r\nCount = 180\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 0f1b73e54f4571b2d42aa5ab673f3e99b44f6c37a07a5d4edc7d6b1fba349401\r\nMsg = 3918467effb5d5dc009aaefce84d8cb4fe8f80eb608f4c678f5d0de02ea11e59078d38b04f10de73\r\nMac = 1c207499e0877bb2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 181\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 25a152850b4b80b19d8f0b504b2a8a241824b3a1fca8d85c8713b2c0c84b5e02\r\nMsg = b06f6b3f197bae7d8cde9daf38530e25bc51b68f9aa23ec0e95199b14bca96c91f3db15bf8432f71\r\nMac = b860013252ae83a4\r\nResult = P\r\n\r\nCount = 182\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 849d861aa5a37c6389f7bc2fc3b4860fac9d2277fa5e1a1f9415a6aaa5106886\r\nMsg = 191b53e0c7d90161e5e2014e9b8aea315b4bddf5750aba4be69c944d71896361f210f961ee6b38f9\r\nMac = c9dc7e167c2e442b\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 183\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 29dd1ee0ffa12de3a1f2cb8e4e24d2e548794a5e7e372f946bfd733f3c564764\r\nMsg = 891c806e0700f6df72befe47ff088d917cc30763866810a2fcaa9f38b45953156c860b7303e8b15f\r\nMac = 2f7355b3994f45d9\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 184\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6cd7349d96feffbcf6e95a96eacbbe8ddab702ef70052b7804f78518589df3f7\r\nMsg = bbe054fbef86db3ce7ad796e6d0add15455b9cff57fb787610b4e1ba05d5bcaed98564d16157ee70\r\nMac = 8a421387c53702d3\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 185\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = a32e186c29f6f1852b483a37b50c02defeb2ce81488198bc082c17fd47a741f4\r\nMsg = e687143dc4d98dcc6a2dfe6ee0f85d565d1f46bb0fafe62a17d01720d6f4ccd86754b0626c9d0af5\r\nMac = d44d78445c5ed8de\r\nResult = F (1 - Message changed)\r\n\r\nCount = 186\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 338f8054d58c26c49360c3e87af56523acf6d89d03e56ff2f868002bc3e431ed\r\nMsg = d42b10d3a688c39edf543ae7330466eeb9e3b678ef073967ff83038d40ded1c200c4f03481fc5aff\r\nMac = b25bf6993f18d503\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 187\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 96e04382027fffcaf779c984be80da16f8437db0e39a7123d9048ff71954acb7\r\nMsg = 494c8f931029a4919e2dcbc16512a8bfe275382e7d29c9abb1d14a006caec59ab9b52a3e9ce54ef7\r\nMac = 5a94a03591ee9cc7\r\nResult = P\r\n\r\nCount = 188\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 682f8bc1eafd4d369df384841a88db7b7fb96c9dd9abd6dedc9290a8d8d17d22\r\nMsg = 87b937b1d36e8a9ab33a1d3eed617030923acaabc7e620dfcb3c388936030fc67f647729c19e040b\r\nMac = 89347722a73d8bf9\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 189\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 954222a9cabaa5a0a91100b158a3aeb655c4473d0b00afe6a7a78e0d278a01a9\r\nMsg = b9197eb50c8168d16b8a12bd261d553ffcc521d979b26fee820376252e452213d736c21471cf0179\r\nMac = e5d175fa24cf0fd6\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 190\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 18349be2894d49290339b97f4db28c92b3e112ffac77100abbf9c093935b1a46\r\nMsg = 4b02fd5a46ac681a42424ac9723911af4e389ac73829f36f60916563e51cb2ec3d7d9b55d674a59f\r\nMac = 18c98fd13595f857\r\nResult = P\r\n\r\nCount = 191\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = f1f9fdfa9ae3ba8bc6fcdb2e15ae2c47e6292c2acb091fe03e325f298ffff3bd\r\nMsg = 75965cfbf66b0ba13274fce6537fd7aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837fa06f\r\nMac = 935e4d4367aef07e\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 192\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 4652bacedb47faee1be641ebf433157f416b4c7d9e8c7c6f7b17b47e70156993\r\nMsg = 17e6acda3c05c9549eadad55d8918f4870aec63a18802fa33175cf838fa2b9b17cb43270ff2a1444\r\nMac = 7ce4adc343a4498a\r\nResult = F (1 - Message changed)\r\n\r\nCount = 193\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 200e4929c275557d9caab0ba3b0a153dd8010ff8f11ebc1f336dd0249d01dce6\r\nMsg = bd05d26ebfcb5f6e102e79976fbd038e02da6a64a6be90bb84bd092be5cb8ae447409e94afd89b8b\r\nMac = 5484fd10e83798c2\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 194\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 8c6a6e77534976b4d74a0972742989dbc0f753281a5ff10a862e9048b813b4a9\r\nMsg = 869c482db2b0825cd09d295749359b99fde85240e5ddaebef642f4d249e096b77af2b59b4e37e452\r\nMac = 9e640a86d55be78d\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 195\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = be3db75687360fc31c27752a5f32125cf04f8bbab694339ebcb57ff63fc7ba32\r\nMsg = 33dfb223c009001a7b3b81916bb094390c42c24a47884fc8a0410f05b2f57b67d8d9046b2ef4a8ea\r\nMac = c7666f25d2329fb6\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 196\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 29e7acc4facc2618f242ec9260a8ec36c4c9dabb89bb8092f00855234b0c505a\r\nMsg = 09bf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c8b80393302ca8803\r\nMac = 424535e20d082087\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 197\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 23f0d00daef3177fbcda6e9953a5a37d5da395204d8af5fb05c74e03f71343da\r\nMsg = 2222135e545f2af53be42d7a463719447e0a6a305fbe8e43e6279a91eb8f3c5db1fdf081bcb77711\r\nMac = 52c42541e2e93f3e\r\nResult = P\r\n\r\nCount = 198\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6746d9a90e0e763679d5469a1bcffcc4f18f35f50c7714d14c7329b76ce7984e\r\nMsg = 68530f15423071410a349872c559669301096c827333adc4df9da477387c89870942d12513b7f475\r\nMac = 2bf36912e1139629\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 199\r\nKlen = 32 \r\nMlen = 40\r\nTlen = 8\r\nKey = 6b1d94bc0c6e45fc905c509ea667853e4b2c5a8848dd914efcef14d95b12247d\r\nMsg = 207b649c46c1963723624d8428d4b64c08cd4091cc055175223d3758f880614149a9cf7f3725c790\r\nMac = 34f46b361bddf55c\r\nResult = F (1 - Message changed)\r\n\r\nCount = 200\r\nKlen =",
+    " 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 5c77fe134af3fef72fcd16006097dc7dbc45ca10339ae3bc85e0993e4cdcefa1\r\nMsg = fab52c44379ae8083bdc7b827383df93cb1a7ecc21574730f9fe003b7302de237bed535d40832763e7a2cab5806de91d39aa3f38d167ae3250e48ed1f6ad45b5\r\nMac = 03f36c5a\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 201\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 997c6b4b513bbdeaf701867bbe81bdee63de0d0d18c870bcc1e9ff7f627f093e\r\nMsg = 4c23d92665e88a4f6f732de384034d493d5df37b767a8260557de05688e8d60dcd0eba9cb8cc4bceb174dcbd3c0ab5a37db3b6ecfb6a3d90a4f54a9f1117e11e\r\nMac = 9e798c73\r\nResult = F (1 - Message changed)\r\n\r\nCount = 202\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 64e390edd97c0af1ba5165900828e0630606f83d4df5240e1b05c307ee9153ff\r\nMsg = 1ae71094fc1b304adfa3378c4efa8fb290526bb314714c9613beca2a709c91f7e3f6aa74561bfc7b8fcd12f910941eea3b593e85ba2fffb31e7420c6c6199868\r\nMac = 1977347f\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 203\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 44e2f6d41e04b75f541e724c6f6325f27d7475b3676fa0247f28b36e58b6fdf5\r\nMsg = b9ac624288352617e4d375f33953b431cbf8f03f9ecbda9893330ff2d3c59db8705dc3ba4a6ef924309630ac48765b10b1c02ec0669126d76602c95012fa2f77\r\nMac = 2cba4713\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 204\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 8e0f75b7029d4afc2a86adb4a088b89ef9783965027c1176497ada0fdfd0cd99\r\nMsg = 21cd3ff946e2b3c1c61932205899502852b1333d1c79a3d4e5b6617996ffba17041e5b746ab967fb1632c7be62cbc2bbe60ecd5eec6ca4482424994f9a662cc6\r\nMac = b651d356\r\nResult = P\r\n\r\nCount = 205\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 35b1106d174acce103ecf5801b03d3c10d579c4ee491ebad25fb6f1f1787e0c8\r\nMsg = 960026395d0544975dffaaa2c56db1df5816cd80cde513dc76f6f81d21f15c383c97c7233c9af2423fb28922efed2f69aa47c30de17ae1c5be17acbd0ad6cb8e\r\nMac = 8a8f65a8\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 206\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 71efa75961dfd60ad533082a8cfe111214eb02573adc4591c5d0e961640a3ab2\r\nMsg = 6bafbd22b75e21e1fa5444af283e69d53ac2f0412f717a2153f74eb1c195fc5127d240dbc96d2833c9957920a55c505a016a05e4a7ee549bccdbbf1095502e93\r\nMac = 88fea081\r\nResult = F (1 - Message changed)\r\n\r\nCount = 207\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 11752eb8aeffa364c9947092c1612461cc19b6c3a3ddd1817b5e6f7f3745a942\r\nMsg = 2d9109e7eea21b2615c81c03182ce6033c93783b13d698624392bd2a8a202bd0ffc860f29b31afa2f71c2bb85752c66ce8dbba244671288a4135ffe2e1a0209b\r\nMac = b5a26c1c\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 208\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 279a6c226f6a48f3128626012baaa309d99065a59dc0a4c003a6e94d85e61638\r\nMsg = 9bff96ba07a52d9ea2415283321395cf57cb37c610fad7a482c74de9f5e3d7f520bf73d4a6fc8b5be023d774dd9680b6a7c68139c8a753a80d61c9978a493917\r\nMac = 5e281941\r\nResult = P\r\n\r\nCount = 209\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 0bcdcaa87ddf8bbe6db8411d14bb9064e4a121286cc8a6e97fce1844935f436b\r\nMsg = 3ec0aa8d30d5ed825b77dc7095f421b1e608158797a377ff8bed641bd387832f7c14818cabf9bd5ced6044cdc883ff7296272be693660ab234b2d870ba170131\r\nMac = 1da79d07\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 210\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 1b41d148e3c202d419ce16385139da196dede5be63987e6940a2bae86d62e567\r\nMsg = 13ecd70e2d76dd53a19b2e5fc0afe0c0793577ba8948b7d4ef3ab797a07a37927dbb33a18252b96f40e0f73a8d3298d67a6551f5854eb6a51019531a122ff8ae\r\nMac = 91bd49b2\r\nResult = F (1 - Message changed)\r\n\r\nCount = 211\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = a1ccc9c992c8a307ad39504854456696f8eafd7c8da0c0c53b3a4485570e985e\r\nMsg = f68b0c3b4556c7f8866b3fa873ed2014418d6421d3f224512e5dae8c2d8dd92175e09508acbcc66ae62d536260cf790671ef66a1bded0343ace4117c1b8d7764\r\nMac = b9317feb\r\nResult = P\r\n\r\nCount = 212\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 4d8d0264ae6d8f7a7440dd760e0ded25a3a94cb0491fe81e7b55221ac8ed24f7\r\nMsg = 5faaf6b8ee8ed5b56bfc1a7f886f9f91a6566ceb99c39462ab675a3ae3be98f68787626fdf77e6243c2e96d1396a8a43417b1f6a51f7e5b0ffaeb889bce02c4b\r\nMac = 3f610010\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 213\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = bcf95051ae2ae84ac32a763d5477ccc4659a9ed3e25de5932939826dc90e2464\r\nMsg = fce924dd27db3e07837694c34f576c16084e5b0a254ca3af0582bf6026c73b47973ac924b02992490032cae987a887932539d3fa53cdfff711b03bd11ff464bb\r\nMac = 7b7e89ef\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 214\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 45ce953ad31ee9b53a9c948883bc86f4bbe0f0744085a9943cbad1066cd7b4f3\r\nMsg = edb1aaa7e8ac37bca99ff8eff5516464aa33fc2bebef8a727d43abf971108bc604aef019c3837aa2f3d429f22fda1f305319a70d99ed77f902663298f855316f\r\nMac = cbf4addd\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 215\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = d60841cd71d7227ab56e767817760edba9ce2290f8da504b341ee2c1910b5018\r\nMsg = 365fea641559759d1e5b5581218486318b1c776de812b1aca6a9ba6b1c6e39c5cb6d5a44e3a474f709b8eac457e74f00a43ecd3d060cc7639696bd03730c70e7\r\nMac = 7406f935\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 216\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = d172f991eb697ffdefc57349dadbe51066d2744c39041cd55ca75024eead495d\r\nMsg = 6a91da64812b9bb41a026e727b4f77c384813da2948caed5a9846420c86a26b89f46b2fa6975b95d12452ca69bbfb65bc1c48a79d95c5e69ff4ab7316fe468e8\r\nMac = 6bd82bcc\r\nResult = F (1 - Message changed)\r\n\r\nCount = 217\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = 3725c7905bfaca415908c617b78f8deeeff286e0c2bba268d0de92c7664238a7\r\nMsg = fc4bbe329a86089ebe2a2f3320dad55a9bdac1133dd28ddc9ace9ed665885a2341ea9492d4cf4b7e1d0a95f308a9d613407b35b845cf515bbe7f2f35102d78a3\r\nMac = c8e11823\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 218\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = bb3087d1b5b0f6f14a532c3604c82874fb15e97a4b3883dfc50e71ffe5752d40\r\nMsg = 979a9f96112d1ea95eec2cdfdf48c55114472360aa7de24bb53761013af96b33f02b17ae470fece8aaf649d801b4040b7b5152f58a01e7852f565efc77b5dafe\r\nMac = 66466425\r\nResult = P\r\n\r\nCount = 219\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 4\r\nKey = eeb983439a03ee6a315ebf941e9368f90bb6845b03b31839d72a1946c17d2f19\r\nMsg = 6d5573c9279897d7d1602d8a95c04bb5ca3fad2dbe89a024b3651eb227e73bb559e7c0db08b215fd7efe64afcd24fb155989f2f8965d0e181389e6c4b8e244a9\r\nMac = 7f77d596\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 220\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 6f0353a0ad95df6d3190a251435f62c30ed6b9cc0dd024c3c316565cad83d2e1\r\nMsg = 83011a83db0524628b55589ba0165523ce7c916465eaf185805b97ec7f00fc01b82a3e356a6bbb44f2f8deb6425239ac8e26d4d94871c5cf4fe7017c649672f4\r\nMac = 9e56e4574dd01fe8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 221\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 777a22c5fa2f864a9233587e3e9634172ce25006daacbba97b68e7429c8266a8\r\nMsg = 1f7d58d65c36142620172fda3197d3c629bc7bc584e1aaa0f8b6dd320588becaccc39ad124b515adeb941de49ac31c851c5172c4e1c322e42e13cb5ab7f8db2f\r\nMac = 498dafe2807ba34e\r\nResult = P\r\n\r\nCount = 222\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = e17736560b1a13aa8e536500ea6cdb9a6757309aadf25a6a9189055a309c3f8b\r\nMsg = 1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9\r\nMac = 52d3fbc6e5821f1d\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 223\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f31f2fb4b3fd8045b70d34b600a2697cbf7503be0d8cfb5cdc60f9312e3e2695\r\nMsg = 4f43702be4f0530319555d7f1a3356160f6cae48051f12e22a153d7e405c11494c31e6098e24225eb676094755c6d7e992ec0c8c1e2608e76a72d79d173a4e07\r\nMac = 71239a4c38fa04b3\r\nResult = F (1 - Message changed)\r\n\r\nCount = 224\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 10a678f591b4d87280f42d77a91635575e2e82ef610a7c9105c3a9418f932c24\r\nMsg = f7b577f1396b23c27eb637e53d3d92460270b001cc612fd3b4d68bcdd09c2d50571ea4350636324cc2428a087e7bd8785f8202791e3c2d2bafe084a1204e34dd\r\nMac = 5b11c1407904c15e\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 225\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b8728441226558fa9764824597fe254bf8c2623789541feaf6c007efeb0dd2b1\r\nMsg = 80a2be15809f12738f305be3a210ba0c933599c4b24b48257c60e8e3aae189dc6ec58ff1f9085a15405b26a3001a2ff5ff7e1932961490676c6d2cda8417979b\r\nMac = e73ed6c4f81b0ecd\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 226\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 22a877d974cdf4d65bbd77958b2b77fc5ddb33a221aca3ecb6d5ae76596f9db4\r\nMsg = ce2ce41f76ca7477972d38a3e8fad1122db34ee80c379fa01f884cf648d1670445a8bfab8490563438c21537ac2dbfbcd7bb24a132d6973cc62ba14089adf7e5\r\nMac = 0ff91813a56b98dd\r\nResult = F (1 - Message",
+    " changed)\r\n\r\nCount = 227\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 03fa02c4df99b8295f502e3145e2edd3ff16722b87092e708bc8d126cc1ec894\r\nMsg = ec9a9babb68e09c38617c9b16e8a2d92e711030bcda4b9e0ab35c4c2392b41692312dde30c91f32cd39cf5fe15ea0deaf3aa04a8157262acee78d7f94204d93a\r\nMac = e50d9a04f79cf9b4\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 228\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0e12df1bf17e9645c5507bc2069ca4611dc0488c9996231dbcee1c73393b26c4\r\nMsg = 86814ce4a867f80ce9b618c6aecce37c89851508bbb095c8f7c055f569c47a30f79abe5ec75f12b601298718d6f96ea1c1ebbe7c0cb0b7fb973ec5e6d5c6a713\r\nMac = 05338bce9ed8f495\r\nResult = P\r\n\r\nCount = 229\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 51c88fd98a7d82043a1500fc3d8a66ba7ab7760467c7fd89cfeeb22dd25762a2\r\nMsg = 0e403cff47adee3ec5bb6b178dabfc7d53b60a04eaad33a2fedd9db705358a4c73ab2d982ddbbdc941f1c701d4cac89e5c56fbbe0f4170029ad25e931713ba63\r\nMac = 38c34175627b07e8\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 230\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0feb23c7e4a19bcbd70bd300d76ec9045d696f8c9687f49ec4154400e231d2f0\r\nMsg = 0330ed97e44e8b15a49f29c72a7997d05d398a9d45dae41a6cc635258beb824362124691e86cb7fea46e4ab85bdf79e4eb30c492770bf6f0c42ea9bde37a0c01\r\nMac = 271a7c2e687d84c5\r\nResult = P\r\n\r\nCount = 231\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 5d649799771f9074d18a2477ccd4d9e136e01451c1eb2e8bb370cb79e0486770\r\nMsg = d715bc0520dbb86543e76fede49dc6be2cce59d3c0db133ff31efcb63a85514fe080da88fa1e788b9e73feb0503c4142bdc67386ac0bacf9311ecada23ca7be8\r\nMac = 42de9f52567b4506\r\nResult = F (1 - Message changed)\r\n\r\nCount = 232\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 4c96d520d8d5a54eb73f8f558e328d1b3e5ba360161fb8444739a40a97a58a1b\r\nMsg = ee409b050346fbd319c8630e4bc9dd6d055355fbb961f018d3fda0c1eea6f61248f43709737fb18d4efc4faf34a96c2f73ece54200367292692e36870a0c94c5\r\nMac = 28610f524d88e727\r\nResult = F (2 - Key or Key2 changed)\r\n\r\nCount = 233\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = b186b9273d8cd77d68c05ec5389b2f6e2f267fe6cd6e7cb35a3233c0dfe0b1f4\r\nMsg = 0df3fc6396f851785fca9aa5ffb0cd98bdecf8bbae4c82641efcb34d319e7643ca9c5e22acbde800e0f700a95685c64ccf399173f9123438dc1181b676490cbf\r\nMac = 8d2f69b44614485a\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 234\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 1b1374648d93aadb186326e4ca2b82fd37f7234712816fe4feb339a3a16880df\r\nMsg = 9a661677f1e07153e1c9c661c91901757f5b4d9938031f01a802773d6a9863b2a169c44be0d4546c4780e828ef37f3b389f84c1a41473131e9c88bcd530c7334\r\nMac = 72838b59593c011c\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 235\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f70b8a4eee3518bba071af55f25f7b698a5b7dc8865cdaca6d1c7993657acc95\r\nMsg = 795ee1af7504621aac329f5081912de545fa11174f3979b14f11aa30df813a235b467fd8f3a14734fe5ac9e39105dcb25184673885cd19bc70ee5a53dd4e8149\r\nMac = 93542734d6cd43de\r\nResult = P\r\n\r\nCount = 236\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0c456d199abae4758734f506c4e9ccdb767e4fd156d5a4085726f3938a516d74\r\nMsg = 78f3bf568f1c3f2866eff8a246a70cf0faee4c3078f3fb27c4bdd53312bf50812bac2280118c0396e610b4110a22406084c18283a30ce7c0e49c769817170df9\r\nMac = c4c5be3c94fb7b9c\r\nResult = F (4 - Key or Key1 changed)\r\n\r\nCount = 237\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = 0a8725bd8c8eab9ed52ca47835837b9f00a6c8d834ab17105b01eb4eb30402e7\r\nMsg = d7867ff428c37836161a534d1d697fba43e86b0096c49b63d50afaf06ec772bda86eba7222796f087c5367d1547642b974d041cb496c5cf7984e8e126c9f741e\r\nMac = b5d40f8633965c33\r\nResult = F (3 - MAC changed)\r\n\r\nCount = 238\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = ce9ea80e7fb235486b5f1d0321c68a0e44cd5f15e21f27c402754a2f7c138772\r\nMsg = c246453f5d0f4957e6418b4d17b748f5c30e7ee672b4af2e4e41e145400be94056f4e94768871849fb44c1ee65378fce32d007e0c7ee5635453d4de6b0c2aa4b\r\nMac = 33ae4c66895989ee\r\nResult = F (1 - Message changed)\r\n\r\nCount = 239\r\nKlen = 32 \r\nMlen = 64\r\nTlen = 8\r\nKey = f26fad377bf7d6b35d8ea2e0621b678dad85826fadd3ee684d9215086b77e555\r\nMsg = 63539f949990883ac4f3ef9158b382a30254023c301de9fcd3cd4faa638a0ecb241a2573a9555a5c96da2435aa02c73cfc12c10f84b565bfdea9c6274bb8d67c\r\nMac = 8cda222f03f92913\r\nResult = F (2 - Key or Key2 changed)\r\n",
+};
+static const size_t kLen43 = 155170;
+
+static const char *kData43[] = {
     "# This file contains multiples of the base point for various curves. The point\n# at infinity is represented as X = 0, Y = 0.\n#\n# This file is generated by make_ec_scalar_base_mult_tests.go\n\nCurve = P-224\n# N = -64\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29fd\nX = d9174b3ca6b093dee706b10e1d90309aa58aebf6c9006a37f3716fde\nY = 5091be99fda790ff9e6ecd2ac66b734f157f46402bf194d3bd8c194d\n\nCurve = P-224\n# N = -63\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29fe\nX = 2e74dd665404a8900c8e3d4f822b7a9b6dcb64940ef5f5671caba7ef\nY = f58bc45165c62d4c2c2ad7a8fb7e8f03322ce8ea5dc9c29f77625b14\n\nCurve = P-224\n# N = -62\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29ff\nX = c671c49a40fdb37ee1afb59c55915461d0c4b2a67cbe4f1f0c747c97\nY = 467fdfe495f8d2f97b00b4f8b83abdf40dc6c1b666fc5edc29225ed6\n\nCurve = P-224\n# N = -61\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a00\nX = 2396b9ee84e06252585475f54b390553185c05702db27913a80911b8\nY = 5bb2feab11a9448a5a11ae2b51e4132f0da82d7866b1b971dd85edd2\n\nCurve = P-224\n# N = -60\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a01\nX = 8c64ebb538c109bbd60fd54cf7ff47216d30ecefbac0824c6e50b291\nY = bfd6736f43c5ebb33959c9ec4444f5ea6c86e645b03dbed955ae402b\n\nCurve = P-224\n# N = -59\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a02\nX = 79fb86be63eed9cf12d44df82123ac91042f888b91b1b916bd3c107e\nY = 4bac5537dc8a32199840b52e4c4002733b7941c69c711c8248e8e33e\n\nCurve = P-224\n# N = -58\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a03\nX = eb81ac109e13fe579100edba2dd5389945b3fdf247b4036b018acf60\nY = 778b905f5bd3254728b9105ad7e4c53794201298b40d5fd166a75467\n\nCurve = P-224\n# N = -57\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a04\nX = 868ef00d187fef3010c81e77e214a828b4f9227cf5761d7eed89d916\nY = dae0eef456786c9592faebd46cf44d711fe16fa66b63bf7e8f70d911\n\nCurve = P-224\n# N = -56\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a05\nX = 7cdfaa27e1972788b9891be32d4491c5a9f7187a05c7d40107b7f0fc\nY = 46bb23e1eed098c6ac43e6c7e6a48c9e1e9c8169ef82488581f3782a\n\nCurve = P-224\n# N = -55\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a06\nX = a3168f507cc5ca03ec9507ff1fbe5ca00f3a1410948250749639b32a\nY = 7d83b007949ca192bbd2a691c208fe5e0adacbee0d5bc807cfc44a9e\n\nCurve = P-224\n# N = -54\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a07\nX = e095d7363877c57e22ad1a708b7775ae804cceacecf2e2df16618035\nY = b58fa951b3d1ce053b38a7cb072e69f64d281efc8cc9f1f42bbfde5e\n\nCurve = P-224\n# N = -53\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a08\nX = df5d3ed85b75fb433d057198debdd036cd9f11f339a4d607eb424932\nY = a61a1c0ab289b7658439375678b7a2e99b0c292297dbedf22eb912e9\n\nCurve = P-224\n# N = -52\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a09\nX = 6e53e26a8b7b28a7c7a61dd4d53d509514edad71188245929589c788\nY = f85f23a7c85fd7efc006d3eb13480eb0f6f647fdea5b59d06366d558\n\nCurve = P-224\n# N = -51\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0a\nX = 5b4ce687825f6a00f83cd3bbc77c67dc14d91bd78d4e47f7e2ce7b0f\nY = 6a86b2451d4be8409dec03799f680c806bc355e798591857fb8eddd6\n\nCurve = P-224\n# N = -50\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0b\nX = bce605150a1d4d750c5a043fb4136726f99b4a41f35d3b3832ea583f\nY = 768e2427050ad575667f8784b7fe8c6b2ae7873a7ff11ded64a13b0c\n\nCurve = P-224\n# N = -49\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0c\nX = f18721e462d2340c4a88e00130d86691386ba2a83d1fb1dc8b927cca\nY = b31f4d99a118d1c2c19f0815a89a921305d8d52005b64dd249b6a8e9\n\nCurve = P-224\n# N = -48\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0d\nX = f087c8764bb082e669a8afbc5db571971898ccc2c5d4baf73cd35e9d\nY = 72edb9b8154237917e7a05581d1cb2048d4d31c4ab90d005c9b67e4a\n\nCurve = P-224\n# N = -47\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0e\nX = eca965fd046c7fd242e29ba1a178b71b1ec6e7af6a5b88232a285c92\nY = 3e526a6b5ecbd24f9308de03fdb757a51a564ebc5872dbef7886cc7c\n\nCurve = P-224\n# N = -46\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a0f\nX = 71f8a2cdf405c7ee499dbd7216a07e5aa61b8faa4fd20b516d2761d4\nY = 7a3008d5e50050b0ab427b36d15de75c0c190f7eb0b6a130106354f7\n\nCurve = P-224\n# N = -45\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a10\nX = cc96733b052b2f04f1cebb4cb8afb448a21c09821d6288b86cb8a17a\nY = 159e86c0c38e8f7fc210036054941444c90054fd2047a4eb0dbdbc6e\n\nCurve = P-224\n# N = -44\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a11\nX = d20981b43d053ca0ca30994a5586e7f2342c479b07c6c367d0025900\nY = 572b87044e041001d988793e9ae35378f7b9121a0d7abc1941b7cf8d\n\nCurve = P-224\n# N = -43\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a12\nX = 2f9a6dce655ee5d9f00b398e756defe1499b98df1e2edac8a784ad75\nY = bd851fc17271dca923b803a4a4554a949bfc20f14f26feacc2649762\n\nCurve = P-224\n# N = -42\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a13\nX = 0a8b3acff07b4e49ed1d6cd0e8cebbb0ac9f5bc5ec7d65e0adf7b21c\nY = 6aea047a1d6c9ea9df67e58538a8c88be591728e6c0d1443063199a4\n\nCurve = P-224\n# N = -41\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a14\nX = c772baaa90a968d497e0adbf116453e4f8c21c0acbea0ee34502317c\nY = de20e75207355906ed957ac40260148fda74b9acf699fa06caf08a62\n\nCurve = P-224\n# N = -40\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a15\nX = 5e4cdfc6fc36ea0cd69a38a7485a317a0aeded6b5f6cd80072826385\nY = 14afef7672ca22afe13292524ab55dfeef828e7e1e6abd8aadb9f27f\n\nCurve = P-224\n# N = -39\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a16\nX = 9a89bcce6f9b400618997c1184c5099a154a07954cb15d5c9f4492ca\nY = f48eba6a110031e81a8e50a0c3e5c141e3a66d12ef040e2cd36c4fcd\n\nCurve = P-224\n# N = -38\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a17\nX = 68eee585a12332d41aef6f91a587bc3ca57329508fcc9f5bb3907516\nY = df09fa68ba98511870b892e5f59c02792aed884376ecc9b081641901\n\nCurve = P-224\n# N = -37\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a18\nX = 9810b8218ec461154d317a954df66f5f81e51dc07ed7421b17d0b8aa\nY = e166fda56ccb98bbfa8423bcacbcacc05ddac7e88ff0ce13c805a10a\n\nCurve = P-224\n# N = -36\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a19\nX = 6116976ec4511b1b9ee2b839378ff122c2bdb3f58823a82a68aef8e1\nY = 99b4990881ca11762f616528685fbf94eb1708fa1ae25f010d070beb\n\nCurve = P-224\n# N = -35\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1a\nX = da200dcda742573ca097e34bb87b356b84541f765cf38d2bf07471b0\nY = ef05917f8f13fc686a8a0b6b544b0a1ed3488f1dff476a9a9c7cc19e\n\nCurve = P-224\n# N = -34\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1b\nX = f8188c7623f76642286b8e9e4d4c5d58b8eaf7265b3b0e816076e7e4\nY = bc6fc80b788a058da4873e54acc733db09105a6775bfb3faa6c549af\n\nCurve = P-224\n# N = -33\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1c\nX = 224c4a62c8b1028606603cce1d451409b23d680bb063a8e6875d3b5c\nY = ca97069c235efeb00a05729df91171d17605320950a1cea2e49fd119\n\nCurve = P-224\n# N = -32\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1d\nX = b700a5c3bb6379de6caea37ff7a47ca909bec01a603c5ec5e1d1e794\nY = 39e4c2c2e0968ef8a7cd7cabbfd37d0d2335579e72145109b23ce46a\n\nCurve = P-224\n# N = -31\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1e\nX = 0ecf1b60836e92b7af968bccd69ff8300d55a42b0e855a4ff3546eab\nY = 4bd76a3b0d1e95b063d22f890c68ebfd2327e3af12611c8f66bc1d21\n\nCurve = P-224\n# N = -30\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a1f\nX = 599b7e7e639bc335eb891295f0d8f4d8d8c76e588f0767741ab07558\nY = a5aa7d10418290c0f35d3e4fccd02e4b3bc48ac8a87ad052e4cdcc14\n\nCurve = P-224\n# N = -29\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a20\nX = f63f9d855262e9b691f9bb848c78859508a8c1e6fb3246212e146e5c\nY = f75d5db787bfb5cb199828b1040e7ccd9a20d198d9f82a81001cf9e4\n\nCurve = P-224\n# N = -28\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a21\nX = 1243a602d84f3ea7cf4a56f86ccb93395c1d609af98d6474d8e7afb1\nY = 42c598ef4d24cb1f640cafc463a244dc4a26c694bf7b4737c8c6ec7c\n\nCurve = P-224\n# N = -27\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a22\nX = 1989153b5f6636b610854bcc50afc929e914c03da51a4a8239f4865b\nY = 46c7e1923864a71fbbc324ff6e9b7c842baf5973e6e6d0ed9abd8695\n\nCurve = P-224\n# N = -26\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a23\nX = 263ed2217",
     "b1f0a813156e647e87e6cf618b9635c3f910f9d92153b04\nY = ba1722401bfc9e41088cac3974d5ec7ad91fa0cd95b0a3555a23194a\n\nCurve = P-224\n# N = -25\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a24\nX = f1a7ae364dba054b51dff5d5ce16fb28965fb3777dca1ce3c1ad6ad0\nY = b15ffa68153924545b397331387cee02f86c97f51fb4d28a172db95d\n\nCurve = P-224\n# N = -24\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a25\nX = affdfabc0525468041b2baf73874ec60762a670562c0248e474456a1\nY = 00828bfdac88b772536123340be2bf21ccec9cda4e9ba00d50db9e30\n\nCurve = P-224\n# N = -23\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a26\nX = 2da9b6b6ec26e646ceef802c560782026da04bf2f2d196f4bca2d074\nY = 58d6f33f99ff23e92c8a043b47b66ae89f7d30289b35b16aea963966\n\nCurve = P-224\n# N = -22\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a27\nX = c9bdd86f5fb7fe1e54c6ff9026f20add6c1984f1ef22b80a887af62c\nY = eec590de16f168bde8d375e5dcc22402db091965c0a5bf7f95cf88f5\n\nCurve = P-224\n# N = -21\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a28\nX = a3d482c3e7eec18c534d4ceb1c9b8cefecb369a68a85a4e826165174\nY = 9b11ffa67c105561b349cb872408dfdc8daf9071a39d9c38fee98408\n\nCurve = P-224\n# N = -20\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a29\nX = fcc7f2b45df1cd5a3c0c0731ca47a8af75cfb0347e8354eefe782455\nY = f2a28eefd8b345832116f1e574f2c6b2c895aa8c24941f40d8b80ad1\n\nCurve = P-224\n# N = -19\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2a\nX = a1e81c04f30ce201c7c9ace785ed44cc33b455a022f2acdbc6cae83c\nY = 230e093c24f638f533dac6e2b6d01da3b5e7f45429315ca93fb8e634\n\nCurve = P-224\n# N = -18\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2b\nX = c9ff61b040874c0568479216824a15eab1a838a797d189746226e4cc\nY = 156729f1a003647030666054e208180f8f7b0df2249e44fba5931fff\n\nCurve = P-224\n# N = -17\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2c\nX = b8357c3a6ceef288310e17b8bfeff9200846ca8c1942497c484403bc\nY = 00eb610599f95942df1082e4f9426d086fb9c6231ae8b24933aab5db\n\nCurve = P-224\n# N = -16\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2d\nX = 0b6ec4fe1777382404ef679997ba8d1cc5cd8e85349259f590c4c66d\nY = cc662b9bcba6f94ee4ff1c9c10bd6ddd0d138df2d099a282152a4b7f\n\nCurve = P-224\n# N = -15\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2e\nX = baa4d8635511a7d288aebeedd12ce529ff102c91f97f867e21916bf9\nY = 6865a0b8a607f0b04b13d1cb0aa992a5a97f5ee8ca1849efb9ed8678\n\nCurve = P-224\n# N = -14\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a2f\nX = a53640c83dc208603ded83e4ecf758f24c357d7cf48088b2ce01e9fa\nY = 2a7eb328dbe663b5a468b5bc97a040a3745396ba636b964370dc3352\n\nCurve = P-224\n# N = -13\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a30\nX = 34e8e17a430e43289793c383fac9774247b40e9ebd3366981fcfaeca\nY = dad7e608e380480434ea641cc82c82cbc92801469c8db0204f13489a\n\nCurve = P-224\n# N = -12\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a31\nX = 6e31ee1dc137f81b056752e4deab1443a481033e9b4c93a3044f4f7a\nY = df82220fc7a4021549165325725f94c3410ddb56c54e161fc9ef62ee\n\nCurve = P-224\n# N = -11\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a32\nX = ef53b6294aca431f0f3c22dc82eb9050324f1d88d377e716448e507c\nY = df4aefffbf6d1699c930481cd102127c9a3d992048ab05929b6e5927\n\nCurve = P-224\n# N = -10\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a33\nX = aea9e17a306517eb89152aa7096d2c381ec813c51aa880e7bee2c0fd\nY = c644cf154cc81f5ade49345e541b4d4b5c1adb3eb5c01c14ee949aa2\n\nCurve = P-224\n# N = -9\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a34\nX = 2fdcccfee720a77ef6cb3bfbb447f9383117e3daa4a07e36ed15f78d\nY = c8e8cd1b0be40b0877cfca1958603122f1e6914f84b7e8e968ae8b9e\n\nCurve = P-224\n# N = -8\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a35\nX = 858e6f9cc6c12c31f5df124aa77767b05c8bc021bd683d2b55571550\nY = fb9232c15a3bc7673a3a03b0253824c53d0fd1411b1cabe2e187fb87\n\nCurve = P-224\n# N = -7\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a36\nX = db2f6be630e246a5cf7d99b85194b123d487e2d466b94b24a03c3e28\nY = f0c5cff7ab680d09ee11dae84e9c1072ac48ea2e744b1b7f72fd469e\n\nCurve = P-224\n# N = -6\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a37\nX = 1f2483f82572251fca975fea40db821df8ad82a3c002ee6c57112408\nY = 76050f3348af2664aac3a8b05281304ebc7a7914c6ad50a4b4eac383\n\nCurve = P-224\n# N = -5\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a38\nX = 31c49ae75bce7807cdff22055d94ee9021fedbb5ab51c57526f011aa\nY = d817400e8ba9ca13a45f360e3d121eaaeb39af82d6001c8186f5f866\n\nCurve = P-224\n# N = -4\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a39\nX = ae99feebb5d26945b54892092a8aee02912930fa41cd114e40447301\nY = fb7da7f5f13a43b81774373c879cd32d6934c05fa758eeb14fcfab38\n\nCurve = P-224\n# N = -3\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\nX = df1b1d66a551d0d31eff822558b9d2cc75c2180279fe0d08fd896d04\nY = 5c080fc3522f41bbb3f55a97cfecf21f882ce8cbb1e50ca6e67e56dc\n\nCurve = P-224\n# N = -2\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b\nX = 706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6\nY = e3d4895843da188fd58fb0567976d7b50359d6b78530c8f62d1b1746\n\nCurve = P-224\n# N = -1\nN = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\nX = b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21\nY = 42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd\n\nCurve = P-224\n# N = 0\nN = 00000000000000000000000000000000000000000000000000000000\nX = 00000000000000000000000000000000000000000000000000000000\nY = 00000000000000000000000000000000000000000000000000000000\n\nCurve = P-224\n# N = 1\nN = 00000000000000000000000000000000000000000000000000000001\nX = b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21\nY = bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34\n\nCurve = P-224\n# N = 2\nN = 00000000000000000000000000000000000000000000000000000002\nX = 706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6\nY = 1c2b76a7bc25e7702a704fa986892849fca629487acf3709d2e4e8bb\n\nCurve = P-224\n# N = 3\nN = 00000000000000000000000000000000000000000000000000000003\nX = df1b1d66a551d0d31eff822558b9d2cc75c2180279fe0d08fd896d04\nY = a3f7f03cadd0be444c0aa56830130ddf77d317344e1af3591981a925\n\nCurve = P-224\n# N = 4\nN = 00000000000000000000000000000000000000000000000000000004\nX = ae99feebb5d26945b54892092a8aee02912930fa41cd114e40447301\nY = 0482580a0ec5bc47e88bc8c378632cd196cb3fa058a7114eb03054c9\n\nCurve = P-224\n# N = 5\nN = 00000000000000000000000000000000000000000000000000000005\nX = 31c49ae75bce7807cdff22055d94ee9021fedbb5ab51c57526f011aa\nY = 27e8bff1745635ec5ba0c9f1c2ede15414c6507d29ffe37e790a079b\n\nCurve = P-224\n# N = 6\nN = 00000000000000000000000000000000000000000000000000000006\nX = 1f2483f82572251fca975fea40db821df8ad82a3c002ee6c57112408\nY = 89faf0ccb750d99b553c574fad7ecfb0438586eb3952af5b4b153c7e\n\nCurve = P-224\n# N = 7\nN = 00000000000000000000000000000000000000000000000000000007\nX = db2f6be630e246a5cf7d99b85194b123d487e2d466b94b24a03c3e28\nY = 0f3a30085497f2f611ee2517b163ef8c53b715d18bb4e4808d02b963\n\nCurve = P-224\n# N = 8\nN = 00000000000000000000000000000000000000000000000000000008\nX = 858e6f9cc6c12c31f5df124aa77767b05c8bc021bd683d2b55571550\nY = 046dcd3ea5c43898c5c5fc4fdac7db39c2f02ebee4e3541d1e78047a\n\nCurve = P-224\n# N = 9\nN = 00000000000000000000000000000000000000000000000000000009\nX = 2fdcccfee720a77ef6cb3bfbb447f9383117e3daa4a07e36ed15f78d\nY = 371732e4f41bf4f7883035e6a79fcedc0e196eb07b48171697517463\n\nCurve = P-224\n# N = 10\nN = 0000000000000000000000000000000000000000000000000000000a\nX = aea9e17a306517eb89152aa7096d2c381ec813c51aa880e7bee2c0fd\nY = 39bb30eab337e0a521b6cba1abe4b2b3a3e524c14a3fe3eb116b655f\n\nCurve = P-224\n# N = 11\nN = 0000000000000000000000000000000000000000000000000000000b\nX = ef53b6294aca431f0f3c22dc82eb9050324f1d88d377e716448e507c\nY = 20b510004092e96636cfb7e32efded8265c266dfb754fa6d6491a6da\n\nCurve = P-224\n# N = 12\nN = 0000000000000000000000000000000000000000000000000000000c\nX = 6e31ee1dc137f81b056752e4deab1443a481033e9b4c93a3044f4f7a\nY = 207dddf0385bfdeab6e9acda8da06b3bbef224a93ab1e9e036109d13\n\nCurve = P-224\n# N = 13\nN = 0000000000000000000000000000000000000000000000000000000d\nX = 34e8e17a430e43289793c383fac9774247b40e9ebd3366981fcfaeca\nY = 252819f71c7fb7fbcb159be337d37d3336d7feb963724fdfb0ecb767\n\nCur",
     "ve = P-224\n# N = 14\nN = 0000000000000000000000000000000000000000000000000000000e\nX = a53640c83dc208603ded83e4ecf758f24c357d7cf48088b2ce01e9fa\nY = d5814cd724199c4a5b974a43685fbf5b8bac69459c9469bc8f23ccaf\n\nCurve = P-224\n# N = 15\nN = 0000000000000000000000000000000000000000000000000000000f\nX = baa4d8635511a7d288aebeedd12ce529ff102c91f97f867e21916bf9\nY = 979a5f4759f80f4fb4ec2e34f5566d595680a11735e7b61046127989\n\nCurve = P-224\n# N = 16\nN = 00000000000000000000000000000000000000000000000000000010\nX = 0b6ec4fe1777382404ef679997ba8d1cc5cd8e85349259f590c4c66d\nY = 3399d464345906b11b00e363ef429221f2ec720d2f665d7dead5b482\n\nCurve = P-224\n# N = 17\nN = 00000000000000000000000000000000000000000000000000000011\nX = b8357c3a6ceef288310e17b8bfeff9200846ca8c1942497c484403bc\nY = ff149efa6606a6bd20ef7d1b06bd92f6904639dce5174db6cc554a26\n\nCurve = P-224\n# N = 18\nN = 00000000000000000000000000000000000000000000000000000012\nX = c9ff61b040874c0568479216824a15eab1a838a797d189746226e4cc\nY = ea98d60e5ffc9b8fcf999fab1df7e7ef7084f20ddb61bb045a6ce002\n\nCurve = P-224\n# N = 19\nN = 00000000000000000000000000000000000000000000000000000013\nX = a1e81c04f30ce201c7c9ace785ed44cc33b455a022f2acdbc6cae83c\nY = dcf1f6c3db09c70acc25391d492fe25b4a180babd6cea356c04719cd\n\nCurve = P-224\n# N = 20\nN = 00000000000000000000000000000000000000000000000000000014\nX = fcc7f2b45df1cd5a3c0c0731ca47a8af75cfb0347e8354eefe782455\nY = 0d5d7110274cba7cdee90e1a8b0d394c376a5573db6be0bf2747f530\n\nCurve = P-224\n# N = 21\nN = 00000000000000000000000000000000000000000000000000000015\nX = a3d482c3e7eec18c534d4ceb1c9b8cefecb369a68a85a4e826165174\nY = 64ee005983efaa9e4cb63478dbf7202272506f8e5c6263c701167bf9\n\nCurve = P-224\n# N = 22\nN = 00000000000000000000000000000000000000000000000000000016\nX = c9bdd86f5fb7fe1e54c6ff9026f20add6c1984f1ef22b80a887af62c\nY = 113a6f21e90e9742172c8a1a233ddbfc24f6e69a3f5a40806a30770c\n\nCurve = P-224\n# N = 23\nN = 00000000000000000000000000000000000000000000000000000017\nX = 2da9b6b6ec26e646ceef802c560782026da04bf2f2d196f4bca2d074\nY = a7290cc06600dc16d375fbc4b84995166082cfd764ca4e951569c69b\n\nCurve = P-224\n# N = 24\nN = 00000000000000000000000000000000000000000000000000000018\nX = affdfabc0525468041b2baf73874ec60762a670562c0248e474456a1\nY = ff7d74025377488dac9edccbf41d40dd33136325b1645ff2af2461d1\n\nCurve = P-224\n# N = 25\nN = 00000000000000000000000000000000000000000000000000000019\nX = f1a7ae364dba054b51dff5d5ce16fb28965fb3777dca1ce3c1ad6ad0\nY = 4ea00597eac6dbaba4c68ccec78311fc0793680ae04b2d75e8d246a4\n\nCurve = P-224\n# N = 26\nN = 0000000000000000000000000000000000000000000000000000001a\nX = 263ed2217b1f0a813156e647e87e6cf618b9635c3f910f9d92153b04\nY = 45e8ddbfe40361bef77353c68b2a138426e05f326a4f5caaa5dce6b7\n\nCurve = P-224\n# N = 27\nN = 0000000000000000000000000000000000000000000000000000001b\nX = 1989153b5f6636b610854bcc50afc929e914c03da51a4a8239f4865b\nY = b9381e6dc79b58e0443cdb009164837ad450a68c19192f126542796c\n\nCurve = P-224\n# N = 28\nN = 0000000000000000000000000000000000000000000000000000001c\nX = 1243a602d84f3ea7cf4a56f86ccb93395c1d609af98d6474d8e7afb1\nY = bd3a6710b2db34e09bf3503b9c5dbb22b5d9396b4084b8c837391385\n\nCurve = P-224\n# N = 29\nN = 0000000000000000000000000000000000000000000000000000001d\nX = f63f9d855262e9b691f9bb848c78859508a8c1e6fb3246212e146e5c\nY = 08a2a24878404a34e667d74efbf1833165df2e672607d57effe3061d\n\nCurve = P-224\n# N = 30\nN = 0000000000000000000000000000000000000000000000000000001e\nX = 599b7e7e639bc335eb891295f0d8f4d8d8c76e588f0767741ab07558\nY = 5a5582efbe7d6f3f0ca2c1b0332fd1b3c43b753757852fad1b3233ed\n\nCurve = P-224\n# N = 31\nN = 0000000000000000000000000000000000000000000000000000001f\nX = 0ecf1b60836e92b7af968bccd69ff8300d55a42b0e855a4ff3546eab\nY = b42895c4f2e16a4f9c2dd076f3971401dcd81c50ed9ee3709943e2e0\n\nCurve = P-224\n# N = 32\nN = 00000000000000000000000000000000000000000000000000000020\nX = b700a5c3bb6379de6caea37ff7a47ca909bec01a603c5ec5e1d1e794\nY = c61b3d3d1f69710758328354402c82f1dccaa8618debaef64dc31b97\n\nCurve = P-224\n# N = 33\nN = 00000000000000000000000000000000000000000000000000000021\nX = 224c4a62c8b1028606603cce1d451409b23d680bb063a8e6875d3b5c\nY = 3568f963dca1014ff5fa8d6206ee8e2d89facdf6af5e315d1b602ee8\n\nCurve = P-224\n# N = 34\nN = 00000000000000000000000000000000000000000000000000000022\nX = f8188c7623f76642286b8e9e4d4c5d58b8eaf7265b3b0e816076e7e4\nY = 439037f48775fa725b78c1ab5338cc23f6efa5988a404c05593ab652\n\nCurve = P-224\n# N = 35\nN = 00000000000000000000000000000000000000000000000000000023\nX = da200dcda742573ca097e34bb87b356b84541f765cf38d2bf07471b0\nY = 10fa6e8070ec03979575f494abb4f5e02cb770e200b8956563833e63\n\nCurve = P-224\n# N = 36\nN = 00000000000000000000000000000000000000000000000000000024\nX = 6116976ec4511b1b9ee2b839378ff122c2bdb3f58823a82a68aef8e1\nY = 664b66f77e35ee89d09e9ad797a0406a14e8f705e51da0fef2f8f416\n\nCurve = P-224\n# N = 37\nN = 00000000000000000000000000000000000000000000000000000025\nX = 9810b8218ec461154d317a954df66f5f81e51dc07ed7421b17d0b8aa\nY = 1e99025a93346744057bdc435343533ea2253817700f31ec37fa5ef7\n\nCurve = P-224\n# N = 38\nN = 00000000000000000000000000000000000000000000000000000026\nX = 68eee585a12332d41aef6f91a587bc3ca57329508fcc9f5bb3907516\nY = 20f605974567aee78f476d1a0a63fd85d51277bc8913364f7e9be700\n\nCurve = P-224\n# N = 39\nN = 00000000000000000000000000000000000000000000000000000027\nX = 9a89bcce6f9b400618997c1184c5099a154a07954cb15d5c9f4492ca\nY = 0b714595eeffce17e571af5f3c1a3ebd1c5992ed10fbf1d32c93b034\n\nCurve = P-224\n# N = 40\nN = 00000000000000000000000000000000000000000000000000000028\nX = 5e4cdfc6fc36ea0cd69a38a7485a317a0aeded6b5f6cd80072826385\nY = eb5010898d35dd501ecd6dadb54aa200107d7181e195427552460d82\n\nCurve = P-224\n# N = 41\nN = 00000000000000000000000000000000000000000000000000000029\nX = c772baaa90a968d497e0adbf116453e4f8c21c0acbea0ee34502317c\nY = 21df18adf8caa6f9126a853bfd9feb6f258b4653096605f9350f759f\n\nCurve = P-224\n# N = 42\nN = 0000000000000000000000000000000000000000000000000000002a\nX = 0a8b3acff07b4e49ed1d6cd0e8cebbb0ac9f5bc5ec7d65e0adf7b21c\nY = 9515fb85e293615620981a7ac75737731a6e8d7193f2ebbcf9ce665d\n\nCurve = P-224\n# N = 43\nN = 0000000000000000000000000000000000000000000000000000002b\nX = 2f9a6dce655ee5d9f00b398e756defe1499b98df1e2edac8a784ad75\nY = 427ae03e8d8e2356dc47fc5b5baab56a6403df0eb0d901533d9b689f\n\nCurve = P-224\n# N = 44\nN = 0000000000000000000000000000000000000000000000000000002c\nX = d20981b43d053ca0ca30994a5586e7f2342c479b07c6c367d0025900\nY = a8d478fbb1fbeffe267786c1651cac860846ede5f28543e6be483074\n\nCurve = P-224\n# N = 45\nN = 0000000000000000000000000000000000000000000000000000002d\nX = cc96733b052b2f04f1cebb4cb8afb448a21c09821d6288b86cb8a17a\nY = ea61793f3c7170803deffc9fab6bebba36ffab02dfb85b14f2424393\n\nCurve = P-224\n# N = 46\nN = 0000000000000000000000000000000000000000000000000000002e\nX = 71f8a2cdf405c7ee499dbd7216a07e5aa61b8faa4fd20b516d2761d4\nY = 85cff72a1affaf4f54bd84c92ea218a2f3e6f0814f495ecfef9cab0a\n\nCurve = P-224\n# N = 47\nN = 0000000000000000000000000000000000000000000000000000002f\nX = eca965fd046c7fd242e29ba1a178b71b1ec6e7af6a5b88232a285c92\nY = c1ad9594a1342db06cf721fc0248a859e5a9b143a78d241087793385\n\nCurve = P-224\n# N = 48\nN = 00000000000000000000000000000000000000000000000000000030\nX = f087c8764bb082e669a8afbc5db571971898ccc2c5d4baf73cd35e9d\nY = 8d124647eabdc86e8185faa7e2e34dfa72b2ce3b546f2ffa364981b7\n\nCurve = P-224\n# N = 49\nN = 00000000000000000000000000000000000000000000000000000031\nX = f18721e462d2340c4a88e00130d86691386ba2a83d1fb1dc8b927cca\nY = 4ce0b2665ee72e3d3e60f7ea57656debfa272adffa49b22db6495718\n\nCurve = P-224\n# N = 50\nN = 00000000000000000000000000000000000000000000000000000032\nX = bce605150a1d4d750c5a043fb4136726f99b4a41f35d3b3832ea583f\nY = 8971dbd8faf52a8a9980787b48017393d51878c5800ee2129b5ec4f5\n\nCurve = P-224\n# N = 51\nN = 00000000000000000000000000000000000000000000000000000033\nX = 5b4ce687825f6a00f83cd3bbc77c67dc14d91bd78d4e47f7e2ce7b0f\nY = 95794dbae2b417bf6213fc866097f37e943caa1867a6e7a80471222b\n\nCurve = P-224\n# N = 52\nN = 00000000000000000000000000000000000000000000000000000034\nX = 6e53e26a8b7b28a7c7a61dd4d53d509514edad71188245929589c788\nY = 07a0dc5837a028103ff92c14ecb7f14e0909b80215a4a62f9c992aa9\n\nCurve = P-224\n# N = 53\nN = 00000000000000000000000000000000000000000000000000000035\nX = df5d3ed85b75fb433d057198debdd036cd",
@@ -2565,9 +2589,9 @@
     "9642dd68d1a988bb828d895ed5d116d7f87032133e2949da6c395738534b93220fe2ad07f0b291adc92433ee2dee160709ed9985b0c\nY = 0177acd53b00c9f29f3ece28b4724f834f49606d3f34656a52ef5443c5d9216ae388b345b828c8b09a2b2e495cf2adcdd6b5886f4ded1741425ac31c832ba74eed38\n\nCurve = P-521\n# N = 29\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d\nX = 0174c644d6c94b68287db3c1fbfcb65a085ff9f45131e86265ec28bef38f7664a1305ca9bc06876d72914003ab8e847ffb9ef33d8595d51f6d962c3927618eda25dc\nY = 011af3a7c2f87f419e6805acc95b41b7b7820233ef8fcb6441fcb5cf5eb795ad34b7be0e21952ce0d90b50c2732d706d303f0679927c26ebbfbd187bbbc4821a0c30\n\nCurve = P-521\n# N = 30\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e\nX = 00d087d70d11074b36bb0b6913261570a6b33cf015e1f913a610ea52dbcbae2a3e4435573f35d14754c6352756cc169eac6bf7d9b10f1b0af5956117fab72ec4b081\nY = 00c4d07f8c3cafdc1636811d7b95a6ac2dcebcde1cd94afbdbd3e47015660d29f15354d5b99d1d7d4adaf279efee5d860be9069edd46ff01cfc7b64d6af6579dbed3\n\nCurve = P-521\n# N = 31\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f\nX = 00d8e9920cf30f0c6615006a58cdb7307b7db574589657c2a6617260a83ca5e7726cd65543a904c9d429fc14c1ac09cd6b220dcfb5e488e248122257d0e0c16a8803\nY = 0127b023b5454a663987df09c13a214a30ec8b5406328f10c8060aefb72cbed1aa30f76b8c3244d14790139a868cae4cc263aa1bd97c7b54318aca4677c739792d19\n\nCurve = P-521\n# N = 32\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020\nX = 0166ba3596d20a3a469443707af94ba15b343e3e16654e068038dba7ecefb9e5ebd6ea04a35dc73596ec67d69bd6ba5d1f949cf7475cd6c5c78247915ab876e56a9e\nY = 00477b0ff4d1940ab8111635e75ff3e08268ff7bd8bf5ff01967c1df01c65c2dd77de204cdb818cdd6b9b74de1c7ea0f36dfcd98c965ab96163695ca9a9914a156aa\n\nCurve = P-521\n# N = 33\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021\nX = 00284195f0978fb969e68c76eb4e3c76f58e52086d482be92613f381421a74236df0abdbea7e2b77ef1ae9a519a57aa53ac2a5ec59186b2ed12d5ea2e1fc649f308d\nY = 007e43eb08c656dc636b7b7a3bc869056d3a24d513abe063c6639e016769614ac5f2e7656ecbf3d138bf00bd7216c16deb3a88effd5c228b58f36be95a3dd3e11c4d\n\nCurve = P-521\n# N = 34\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022\nX = 0122f66451d0843fb59448c58962f5b7c130eb8db26b14dbf8bf0e7d84e588581cdea866a98b697d432cc1f1f8993db2173b55ac0435b8317a8ddfeab253d54e4d87\nY = 01bed137b942249932f3c1f12141aee1538aa373f5aee0a89a48d357d7c04965b0515097293e4f87a6a413184d9be8ea91406baa5223db7571bcda9dba82fd9a06dc\n\nCurve = P-521\n# N = 35\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023\nX = 00ddc300757549630a78398b62069e0ba392a267a642b593e0bfc4a780b56f97392bb4806c84fda74023ee4a618608f6b2cea92ff614b5dcc8d8dc1039c9ccd7d718\nY = 00c1bd2d07f6ac7fc5cc1b83431f0c30dbbfa510936cb5d85bcf462796591a31db509ab1178bd2c701425c212522ee69e797deba4db422640a4d3eb1d3ef241e07f4\n\nCurve = P-521\n# N = 36\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024\nX = 01ad81c98659bd21e082514d5e71894c417b2a25afe471eb8ad9e81a91dac8198aa9f385da9cc679bb96e724672821b585e05323bdc821e585edae56cbf798bd6ef0\nY = 01217026e6cf8e6fc4e761aeda5705b3c0f8ca7f475441227b9761285bc6dc8f01af1af50b0bb140013a75db963d8698121dd2c4ba1759a98b43ac7712f8455c99ef\n\nCurve = P-521\n# N = 37\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025\nX = 00944f64a6c21832b67139e798352ded5867c35c5d56c1d59e4229ed0ae6af9d5749bd445763a28856040e58e26ee0980df28c64e76ae4780273f1ac4d59b557a36f\nY = 0150b7ee1b02028ab7410c4b9624f26cb192fe4e6ff21865f85926317da6b7991305dcbdbc2471c83f81b85c564995a057c331a4be4056988296312bf98394fb2a03\n\nCurve = P-521\n# N = 38\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026\nX = 0195aeb1530c7d932a18922563d71ef6e7449078207b610c2c77690815bcef8f312718413823ed8d4ba112ac2ecc9d4e688346f120cb19ae965d853028d72a5f4a8b\nY = 00e0c42d3cc093242000c0ec0975884bb0308611d8bd49b6090a06c5bdf7d0e1544851f9ba596291ef1ee3e3c9a002b7985ba29e51d193b701e0c87e1acd797bd130\n\nCurve = P-521\n# N = 39\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027\nX = 0124a0b8f411fbad60755264126356a499029e9661a49b5b907238d9fd62359c6ea7256b0cc58626a1e2ac0bf434e5fa31795b4fa1d48083af670b704119ee33b77c\nY = 001029616edc7335dce3602a9a406bbd399c68937baa8796154cdc0b1240c690db4818dc59feb96825aaa3caf2415944e762f212e74b698e40abd8dcdc61228b61a6\n\nCurve = P-521\n# N = 40\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028\nX = 002efdef97e46cd544553a0c67f41886ad969f67883679409022c4ad6090a169b596f85d832dc9767b2bb513eb4d0d01e18f067fffb5ac53dbcfaf456a57824c9d93\nY = 00d88e2e3fdd283592d6c4c2a4687e65a6a823ffc6106dff96f75bb3141d0df516fe46a5357b21dc22404f4ef79e44aa97b22c101fec75d81e09b591f36738ae8e5c\n\nCurve = P-521\n# N = 41\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029\nX = 0175a140ed79e85e24a763ebfd9d2883082552a523e4b28998a685b85f23864a60c816b931eaf495ccce4c08c3ddc8297bfaddfda1a522cc2af68e00ce952624381e\nY = 01b09696d71855e2d4ed36f21343ca399be7ab59e580e9ee563223de821b22c82111b39e0e11ecf327da052a6e551fa28ebdf75dd758e7f3a3ecebeb760ec1028ecf\n\nCurve = P-521\n# N = 42\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a\nX = 0161960dcd7bd7263ed37a0a1c0aa146f918874f472a2a5de6f2f5633364979e0bda2868fa8595d78243ea20d4e83c72305e420bebfa3767dcd4b7902612a9491855\nY = 016ac1cfdd433815668a5c6ae0d1031bc121a00e6a6b58d1eec42da602f01cc43b7ef728d67c4e39de86324cba6a2c4cce08414fdd6ad7d0722338a50e352ad521ef\n\nCurve = P-521\n# N = 43\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b\nX = 018c0148a165ec58e4fed55022d90544d8a070678aa2ec1419af8ef0f94438fea396fc66ad7aed7d37dda3a74e7a9b3d85ca51f0b62fdee07d20713e3083224f497e\nY = 010abbaa1f099e78869aebf7a83c7aa3bf242677e91db1d144cd7a3037819f1a0bec67fd6098879b1cf1932d602b547ce17a94edb92f76b688d2895829067683adbf\n\nCurve = P-521\n# N = 44\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c\nX = 013fdb51df11f0b29b485f0c48a04cca16cfe1cecbe9fd57f6507c3cfcbef88c88cf761e3e73e6509ec7e77fffe912d2b367b25aa02cb1d33a5378f253cdcde738d2\nY = 01d14c8c184a7228a7034e4f65b3d0338f667aac908b39acf39c9ebedc0452b7c2f2a4460186aa2271d357733ea23d7284a8a123424f99a20b5242343b5cbafa661a\n\nCurve = P-521\n# N = 45\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d\nX = 004969d186aca09e53b879596b8fff2bc0207a58f7f28c147cc07b2df5e3f197286779189b7df8a1f2d9dc8ea1ace5703f0fc2954607b66b70c4a32dec600fc95c1a\nY = 01e81ec9b50cd8d3847d4d6ac21f3149fc7b15862a423270884135584a1bbcdb40a9b8d5b2802eadae85e6ed9e879be328e13463f5d90b37564f9498a7cd000903a9\n\nCurve = P-521\n# N = 46\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e\nX = 00bbdb162d8284a910021998e2d14f33a8c51a9cfb9a69a8fc5709f753aaf1c4d248a6ddb5626540f81d07c09231d2ec1549f672b6d2bd57d22f64f2ae8093e738a5\nY = 013b86f0d5921216efe01fe9c7cabc10b00ab81c9fbd9674149d2ece424b786f6c372a1831112f54132d7d3af42dc8cd7e17b7ec80b09fa59f0e42c142895961259a\n\nCurve = P-521\n# N = 47\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000000002f\nX = 00afe31f8907048afd5f9cf5083ecc35882ce4e4fe2714033ff897233106c71dd0b2381864a0b9e922ac9cee75a3a9c4dd660a56a130d1ecbb672fda63c9abd59d11\nY = 0012f95dc8657275fe9db4290cbbb54ff69a605f079349209f88ecea7f3276f064979276080b904982a6ebb760f478d825e711ca41599f10673bd3065d2f1d90e1d6\n\nCurve = P-521\n# N = 48\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030\nX = 01fb35de3b21557462ac8158e5caec62c8ccae7d6d6672102c334b3cc8a5803e72f42da0980f3f6fbfacdedc21b10ff08ee6641752bd214aea2c87027d612ad879ad\nY = 018d34a5ac1587992deda855b9ec4bb3f5c176f27fc94d09e2cc871294f66cc2e1bae6214d64a1d97e37b7c142e0fb0e3c28596f24804841cae7b1958193d256d46b\n\nCurve = P-521\n# N = 49\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031\nX = 00a5cb98fa3c0b8c1d57cba40a63bbaba0d39d45c347ae499839f581b8b111dea9eb6bc2a2df52f6284291d8c84e2e345fa87258dab1ac4c04ca0c8cb45049efc0ad\nY = 0015dc95654090d77b971409b01bf72e151b749ee467877e5b7eb072c39d9da8bf835dd9775543d575c20c10f2ceebb72bb44b963fbfb0b88b1d0b9bf46a2c8884b4\n\nCurve = P-521\n# N = 50\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032\nX = 017176204957627b7a120baf0dbb1aa3f9ca5312b292e34a0cfbd8384cf1be365bc684804ab26d84fe02250a859beaced3f356b6ddab593aebf35386773de84d4766\nY = 01ac713d5c2ffb0e111983e07ea5f688b03dd3032d3a9450b50c5def1db4859b504caf8c1321bb6c8d5fad93d2e5b9d0e75336298e21939f704f3f16ac6addc84f8f\n\nCurve = P-521\n# N = 51\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033\nX = 0168395ba51e278415a2025d93b68145f3ccfdf9f5bde34fe9ba3ba316cbf9beea26c2edfe6af07390df1321ae1b1054cbc0fba689ef1d7be2dda8d916fffbcc9504\nY = 0071cc10f3ca041a245639d9531942d3f57952dd878f21c480ce24e5b174adeb9b3c97bc2b68badb600c849c36096e3aeba50600aabed3a89e188eb9c45edd5c087b\n\nCurve = P-521\n# N = 52\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034\nX = 001f32e875ce65d1e6d4c39a55b518749158a4dae03e0c1b4b4a58aef6be769f0693b9259354dcee33a4f00784311b6e5993955114f2afcab7a186177e368b29f6f3\nY = 005a3c8e76fb7849180b895ea8b22ee1a6fc2cbf93bbae0f4ad4a0c126d318c397911e73a061b8098a91112577769cd77ef2bd6b45f989f292da9301992d481b07f8\n\nCurve = P-521\n# N = 53\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035\nX = 0143f6e249195ee693f77b3d0ffd310306dff8688be916895fb727e82f6f948100c44e210e637209a78ed3af581fba4fe12b08153da9c98808166285684cccb69906\nY = 01053e8fcc9618eb2a74c5611a02575109877dc73fdde42c216935437e8053d10cb14fdf64f503cf3bb30f6a7a9de3b4cf8c040a3dfbc4abee6afd6ddaddd40c7861\n\nCurve = P-521\n# N = 54\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036\nX = 01938e65f2a40e6899c6414997e998e0e3e1cb09728861ea138fc6d866fdc6c98505393cf55982451c97dac4214e4dbf052bf707cab63228fdfcf5ae2048a0ce100c\nY = 0163d556dd0941ce794e9c2868a692e89dbf943485186e2074e8222e0ed99fea4bd0c6069fa8017db8bec972b99ee0d7fcbc0f607d677492659bfa47b98bb8d1b411\n\nCurve = P-521\n# N = 55\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037\nX = 004b52fc4b6d310ce7c4b551e4155c6daca97cb03e9fd9d0a79d6472d4028e8da1a18cca93917cad27e6be17486b1e0b549a7fe9ab4bda96ac4e84ad7ccebd470f5e\nY = 003585e54fe81461ae21385ea7907a1a7b2e619f44311a16a0b600fb114a7dbae15510aa85895c5a084cd69609e345b53586fa03a23006a096ea7a196cd230a36ef2\n\nCurve = P-521\n# N = 56\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038\nX = 003cd775038527f32baf7e9056e95b0cbef7638c12398e4b8b019cc29b3435be97f601378e253fef51d25730e56267acca241df04ea2e96c1840b3f739d5ae2df998\nY = 00789bf7cf42095c5b1770e1a3561fc3e1232b0430e114f67a397c1e5b54987f4a28b52a737cbaa0ffa2c431863c1a8cbf15eba60fb5d8b4723dc10d9706f4083cba\n\nCurve = P-521\n# N = 57\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039\nX = 00dc53c3e7fcf3c902e04463da75efb25ffa5a8defe72e6dbf85ef3c6d77a521b9f84af300bbde9118b2f66fd5bc64b8a5208372c8fff95c84503475330a4e9a13e2\nY = 0074e88fccd4fdbd992b68073ee6c4d4f8f7b13d0dd2caf9d989b62e7eb390dff3ea3482530d0d3bd86a4a3f82056a929f73a9493190c62a553233ad7f7fd9c4248f\n\nCurve = P-521\n# N = 58\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a\nX = 008bc46df1c09851ab92d53b6ad821b5026be61385c801f5277c9871b54c6764d3fdb96a728ad56c650d342a03e174a3106a5479d3ccb04647ad0f583210d81ab70d\nY = 01d948ff92784e9946a27a4c58d40bfb0e0b765073f1f9a731aa52b53e4fe686134fee784bec8fca81a73b8ac3a45ca1b766cdec69190bf94d71fa08b29292c1205f\n\nCurve = P-521\n# N = 59\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b\nX = 0035aeb454ad31876773063c60342df29eadc7223c5d98901999aae5c2934c222920055693c9b1344c691a90342d64373a8acba8524ec347208863be8a26eb16686b\nY = 00187ecbec147e7e43b4db0b0ca0aff1ba7f15a48db3660903f4e22f2ef3cb6efd45b8cf8c44bc83d0b8c9fd5fddd64ffec3fd82c38cfaffe51acf4aa03c5381fa2e\n\nCurve = P-521\n# N = 60\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c\nX = 00038a508e954435eff6ccb82b562ed32ff236f33caef52de9fdf79836e37bbe118392681661adc786c57fb6bf92d04b42fc051c3f6061c252749fd17ffbfca45bdc\nY = 008dbd87d8b1e7bd4d2adb7a7399b931e7169b0ecf8e37baa0e9997df1a529560a5a5edb1e7a605abfd04b1ccdfa683285b4d748f73799f3e5d4f8464ad3910e9522\n\nCurve = P-521\n# N = 61\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d\nX = 0115544c4a011407425c92ca7c732a1c7d8f8b6cd17d5b660d1a4cd724b1be8b17177193c11a77dc0b39a5e7fce59a7b32d7952bad1671543c41cb53d8cfcfc376a1\nY = 01153df9c6c0ac6485b307996d2a399c872c79af485fef422cbfec097a3aed58c6a003f78d54b7f553a8a834ff603afa032b56f22ee9c3fe5e24b8eff8cd4a17604b\n\nCurve = P-521\n# N = 62\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e\nX = 01f605dada534c5c8ae020f6ed49f27734e2378b0b7bc177aeaf943ae59581dd5885a38bf246fec516fd213f3fe32bfd4e19f0a8c971ef2a16969627fe31114dc85e\nY = 014ff96d82698b78d305a2252c7a4be38a37f2b0afd6935f4aaa50e685ccd164a2206284a831f6b296eacb156b6e7671eb7adda2d7e072a578a319f1002224aa57b5\n\nCurve = P-521\n# N = 63\nN = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f\nX = 01c132753b64640c457fe82f799acb0a6e8e1ca21b5affa0ddc1e7f54fe4d51b08453ae99661308e125ec63996847586265e75af7d025770ac8d0f5beb6fce8888e5\nY = 015347e184197a0538176d81ac89b205d7961a9e093286414006595e8c353aa2238005d3dbdcec1896bc13f78f82f0071283af657b5bf664a2ace9d15ad2a03dba15\n\nCurve = P-521\n# N = 64\nN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040\nX = 01ab9aa17dce1112ecd14f3d7c0392fec2a67ebdbba81860bbacb614b9ccf8872d271bebd3c5efda3773a7c02c1603e7001df5aab8029a04fd41b53dc38ce320f742\nY = 00748d70eb848e920573aa10217c57b9586d9bb1cc8b2fb1dc1d0c63ba369e87ab8bac165ba1508d4b10f4a7b9e3af958043c1c1a5dba0653dd45af17058a5f8df5b\n\n",
 };
-static const size_t kLen43 = 65077;
+static const size_t kLen44 = 65077;
 
-static const char *kData43[] = {
+static const char *kData44[] = {
     "# Negation tests.\n#\n# The following tests satisfy A = -B (mod P).\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000000000\nB = 0000000000000000000000000000000000000000000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000000001\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000000003\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffffc\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000000007\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffff8\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000000000f\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffff0\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000000001f\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffffe0\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000000003f\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffffc0\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000000007f\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffff80\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000000000ff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffff00\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000000001ff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffe00\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000000003ff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffffc00\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000000007ff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffff800\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000000fff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffff000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000001fff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffe000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000003fff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffffc000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000007fff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffff8000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000000ffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffff0000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000001ffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffe0000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000003ffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffffc0000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000007ffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffff80000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000000fffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffff00000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000001fffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffe00000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000003fffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffffc00000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000007fffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffff800000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000000ffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffff000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000001ffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffe000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000003ffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffffc000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000007ffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffff8000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000000fffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffff0000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000001fffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffe0000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000003fffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffffc0000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000007fffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffff80000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000000ffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffff00000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000001ffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffe00000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000003ffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffffc00000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000007ffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffff800000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000000fffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffff000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000001fffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffe000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000003fffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffffc000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000007fffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffff8000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000000ffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffff0000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000001ffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffe0000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000003ffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffffc0000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000007ffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffff80000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000000fffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffff00000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000001fffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffe00000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000003fffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffffc00000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000007fffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffff800000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000000ffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffff000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000001ffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffe000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000003ffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffffc000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000007ffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffff8000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000000fffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffff0000000000000\n\nTest = Negate\nA ",
     "= 000000000000000000000000000000000000000000000000001fffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffe0000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000003fffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffffc0000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000007fffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffff80000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000000ffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffff00000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000001ffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffe00000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000003ffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffffc00000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000007ffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffff800000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000000fffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffff000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000001fffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffe000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000003fffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffffc000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000007fffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffff8000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000000ffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffff0000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000001ffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffe0000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000003ffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffffc0000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000007ffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffff80000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000000fffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffff00000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000001fffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffe00000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000003fffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffffc00000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000007fffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffff800000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000000ffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffff000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000001ffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffe000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000003ffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffffc000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000007ffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffff8000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000000fffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffff0000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000001fffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffe0000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000003fffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffffc0000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000007fffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffff80000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000000ffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffff00000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000001ffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffe00000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000003ffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fffc00000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000007ffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fff800000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000000fffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fff000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000001fffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffe000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000003fffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ffc000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000007fffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ff8000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000000ffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000ff0000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000001ffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fe0000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000003ffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000fc0000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000007ffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000f80000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000000fffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000f00000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000001fffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000e00000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000003fffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000c00000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000007fffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000800000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000000ffffffffffffffffffffffff\nB = ffffffff00000001000000000000000000000000000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000001ffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffffff000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000003ffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffffffd000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000007ffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffffff9000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000000fffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffffff1000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000001fffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffffe1000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000003fffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffffc1000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000007fffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffff81000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000000ffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffff01000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000001ffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffffe01000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000003ffffffffffffffffffffffffff\nB = ffffffff0000",
     "0000fffffffffffffffffffffc01000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000007ffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffff801000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000000fffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffff001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000001fffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffe001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000003fffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffffc001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000007fffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffff8001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000000ffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffff0001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000001ffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffe0001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000003ffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffffc0001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000007ffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffff80001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000000fffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffff00001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000001fffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffe00001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000003fffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffffc00001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000007fffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffff800001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000000ffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffff000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000001ffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffe000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000003ffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffffc000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000007ffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffff8000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000000fffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffff0000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000001fffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffe0000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000003fffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffffc0000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000007fffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffff80000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000000ffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffff00000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000001ffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffe00000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000003ffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffffc00000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000007ffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffff800000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000000fffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffff000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000001fffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffe000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000003fffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffffc000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000007fffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffff8000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000000ffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffff0000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000001ffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffe0000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000003ffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffffc0000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000007ffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffff80000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000000fffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffff00000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000001fffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffe00000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000003fffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffffc00000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000007fffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffff800000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000000ffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffff000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000001ffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffe000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000003ffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffffc000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000007ffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffff8000000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000000fffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffff0000000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000001fffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffe0000000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000003fffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffffc0000000000001000000000000000000000000\n\nTest = Negate\nA = 000000000000000000000000007fffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffff80000000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000000ffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffff00000000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000001ffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffe00000000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000003ffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffffc00000000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000000000000000007ffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffff800000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000000fffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000fffffffff000000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000001fffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffe000000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000003fffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffffc000000000000001000000000000000000000000\n\nTest = Negate\nA = 0000000000000000000000007fffffffffffffffffffffffffffffffffffffff\nB = ffffffff00000000ffffffff8000000000000001000000000000000000000000\n\nTest = Negate\nA = 00000000000",
@@ -2577,9 +2601,9 @@
     "0000000000000000000000000\nResult.Y = 0000000000000000000000000000000000000000000000000000000000000000\n\n# Test some random Jacobian sums.\nTest = PointAdd\nA.X = cb8dea3327057fe69b5159e0323e60486cda3400545f7e2c60559ac7c8d0d89d\nA.Y = 553de89b31719830c3c3300aa8ad50ea81f40762a4f33ccf81a2d3bcc93a2d53\nA.Z = 4589e40df2efc546b2572c1f45eda26fc191b8d56376f2063fd9470fb277d181\nB.X = 32ad56497c6c6e8399de6814efd21b3eb949bb80dab578073cf0b0aa92054341\nB.Y = 57b33b7acfeee75ef6a31eb7ca0244b375f2d0962a3ce65c06afaa02688399e0\nB.Z = 337d5e1ec2fc711b12fd6c7a51a2f474a922cb107f592b657617d2e0b4f1d35f\nResult.X = 120c6ddd6f8ebc798c5740005bad5a2586575202df9cc3dd07401fe84d8cfdd4\nResult.Y = 966bc89126349ce41738be691f32c1a068e54a654ab2cb0eac39ef15ee17f0df\n\nTest = PointAdd\nA.X = a858b5249026ccc4d25fbd85db17826afa3c5963c26815cbf8511d84dce62a25\nA.Y = bd753e125579388da968036d50067fe0e8eccb531c4d6f1a69c61bc8259c6d76\nA.Z = 82f9cdd9abf991ac27f0caa494b7b7b2851cc6591c6362ef02d1bd2c33fd116c\nB.X = 3e5790fd7ff28a376586c8ef5625b906f2d5d7e6656191f5a530154eecd4c988\nB.Y = 6e6c91011cc5996a7db4e5539eee635ce84780a85a17778da06353048fdf6bd3\nB.Z = a9ef3402e9f15e7a91aef4a53431b2b2068914e4a09ebdafc8aa654351f32331\nResult.X = de9d6bb4dfdee64193d3eaebb9208a86e764b80e1459fd10a2e01c202e33c5e2\nResult.Y = 370e67dbb7cfa6b79adaeec48b1535f0c329856401102d546c695d0dfe1d0db5\n\nTest = PointAdd\nA.X = a2d85e21bf520691b397ac9e0c1360218cef96a8a6f4c2b24d21791360ce4d9e\nA.Y = 0cc1c5493edf586cd24f7a9f40185c1ceefa727369ed159a9fc09b700ba64f78\nA.Z = ad3083a5bd23ee1fdbd3a25abdee815052209bb1a8b22d3f7d8600442b760a61\nB.X = 7d8850dafe2c48d86b6c3f3f44453670aa7169712238d024dbd08cb4e95b9cc1\nB.Y = 6a2698c143609306fe2c402acdf26e3b42874f5ae3ea2e95898c305e791984b8\nB.Z = c81bc8988c6edabf4a03fcc456ce0c445e225c33b76a79552af0b818350ad6b0\nResult.X = 67c5f8af069b5a5636647eee50da847dff8f5f6ef71780a5d1330453db5c8a04\nResult.Y = cec9200fa541b602d94c694f1289d1d073e64f47054baa40a9921c20ca090643\n\nTest = PointAdd\nA.X = 4f9a035ffeddcc36846906cacc812ffae7f3110fe46bf7da12d0b19ec54c3873\nA.Y = 73539ed620938543f94c358dba87319dca40ae4d13d0a888527f007d26d73d74\nA.Z = 922e97056fbf12d89984346368087375560990c3fb2f337d9f46429f2022d634\nB.X = de6fa333804b1da9f046896634e498d5f456288f8f03cc41fc7ba4b1e978429a\nB.Y = fd45f1d5e905c448b947fd65bc2897928d6014425c8c502a1b2838ba882f5813\nB.Z = 50bb4c98bce36b8aad5662b8db35428bb5c1f298e17347caa5d4f542f278a1d9\nResult.X = 5c3cb05b52ec59f3cbb666b0059163afae885676cf81d64cadc943a1c0bb3a86\nResult.Y = 2871d088271faa9258e60ff28115f72294b938ef3d7b927e59177f9b41d5747e\n\n# Test some random Jacobian doublings.\nTest = PointAdd\nA.X = 75da62f76d1887e18a06483bb6b53c3ec42879ed73b7851ed4748e307653714c\nA.Y = a6f0d0d3bb492bf488d99d549aff3f0c3a48f0c35a5931578fe697b8c5f486f7\nA.Z = 6d6a50229164869f24865148a19a24d57d94ebd09dc06b5e4fc3946a95f9124f\nB.X = 3b225af8c7b6155d66061c75a03d23d94e01a2167fa7f44c5bd1e9d9c48c7421\nB.Y = af58b0e38531d1e08187c61a36b33693ef534ecae23dca4542667d93f1844d75\nB.Z = 86ed2be859c4af1d5cf99041840f3bcb7c9b8e8986811393c96e8bf57fcad872\nResult.X = ab0f931fb86a621102e67336eadcf01afe3127aeaf5b4f89e8f34628c8e1afd9\nResult.Y = 52c50e2783d69dde29d6bc75fa359ffe72e7115c2fc89a9699a499cac25e3383\n\nTest = PointAdd\nA.X = f0d499f2e3775de88ed997feeb4589506f061f93766abb0c1251d25630c4c24d\nA.Y = e8de27c3369ba718adbab5597fbaad9581f5b59ae3b758e7d664bae81d895be4\nA.Z = c62dc820a597f75518734f12b2d3c076e5b872303e37b3663636912ade79c058\nB.X = c2845b3faaa995eb88e13a44b08d8a6fdb37103f7bbcc585302c9d090be3fc5b\nB.Y = 733e5ef1b0314754b70b5b98da63cbb7475918ddb85a715e21aade0c2f2e5611\nB.Z = b8505e4a057d108b49f5d0b20884674be18bba48bbc37f765c2c32c5cc4aba5d\nResult.X = 266f2961b9352b44e61902a235b33f766f82f8199c176920dae25ad2cbad5cc9\nResult.Y = 8560e62047908b13c4247b7e4d2657f2bdecab41e73c846ba18523e5f2918a9b\n\nTest = PointAdd\nA.X = f0ca07297738d8687bffcd3f1433966241f437fa1c3381cf2d13f0fc714bc83a\nA.Y = 1181b9d61c6982e743f1c32de5d14da745290ecaf27297c36ff3ef20a7526a55\nA.Z = 93159618ca5a9f9240df7016ddc983e046126d1290e14478dfcc6a4bae9090bd\nB.X = 3a2d75803ccad665f6b785c828eaa96821cb0e81979641b9e59b5fd488fcc755\nB.Y = 99e7f820abdbcdda23d90a88788e30d67303dac86987816dbbed447431e33f3f\nB.Z = a870186c8137cdbd247d16f3aa18782de1e4c5848f49da3437223eb13d7a9ae2\nResult.X = 36a104368d39214d5a3a1a348a1de1389d1aa23009aee37464b5b3256ed4b28c\nResult.Y = da5b14dbd75f6c333929bdff88e53af7253c27e166e15ead6d778631036b7d38\n\nTest = PointAdd\nA.X = a6256508926caca56a31414aba2d5f5b04dcabdb065352a572e215b043df6e01\nA.Y = e6567d330ffb11a86ec29b406b8e3d5cce8ca46f55f38515d842dd856d6852dd\nA.Z = ec172618c8cdbfc0f4fd6dffb77858bb292f229e6d10b5c70d0d9ba75fa3ab44\nB.X = 0251f6715dbba02e6072c12ab1f89a562d35ed0ff68e021b3b5276b9faf57c52\nB.Y = d2d74ff4740ad968fa7e816bc2178458efee797669bef2e634e2857de1658e62\nB.Z = abbecea633d31f569297a4a9ec28f708c7a097cb2423ebaca66ac0e42b1c8ee4\nResult.X = d2a071d4dd72ad7e63834b58b23c4a034ed7950f5c80fad51bf96959b535d55b\nResult.Y = 3cb8dcbe25f49099b9d8dd1a9cb6073368bf6556130f2aa02637dfcff430e869\n\n# Test some random affine sums.\nTest = PointAdd\nA.X = fabada657e477f088883b2987042e595559d669de3a047b27e3ad339fb3fa5f0\nA.Y = 0551992531a68d55a8409d8466034f02808637610ce6d6bcd9cfceb8da1c3e85\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = 3a831cf2b316ce371994a5622e31749407fdf59660dc88322d14c37ebb2d68d2\nB.Y = 849c511908abdfa2bcadc43f9beae88052fdb00573c783fbb1b34b99687b9a6b\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = d5dc9241b457d33b9bda849fb7aba8baaff8b6eea92974a8adf4b95fbfa849f0\nResult.Y = 089a66780811a8ce455c139c4bea6c5c16234c095a41b9e31c617689bdc6bd0f\n\nTest = PointAdd\nA.X = 9dfe6299e62453bb943356b6f7d90c8b6c646728ba3550bb7c1548f2ba5920cb\nA.Y = 60a4e342a89837c0e7d61c0e3e88a943633028f5260eff6af5ae8a6063f7a5da\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = 924d7305f867afecd3cc550f4c05c83a2b4c981ba0e7ff20fd2035fabe2ccc92\nB.Y = 73934620746c23be03a40edb0662c09ef1776506bd50d6397c2654d340629bf5\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = 7384f658ccbe08afcf6b423bfdd092a8a95b03d81254a519b31517b9b9670155\nResult.Y = e922a56146b94776f805a0fbdee9084dd87be1df54f76145bf83e07cd31a083a\n\nTest = PointAdd\nA.X = 9b6642b661f06c5b3ef2a0950b3c03d35f42d3d0dcbe105a895f40132c40bd9e\nA.Y = 90cbe0ed40e47923257f064886f1e309a310cb82fc21282f8e8fa4f6c975aed6\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = 587f6b4c4bb3ab3d59ba8d31457615b3df9f9f9466df3563f4419db731f494ea\nB.Y = 38135b314572346439c8d4535b892a26e5da650ae1dc9ac2d5aeb85ade24174f\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = 97e94b6d485f8de6779e4ad19cc7bede6d70ff4853a56eb6d5fd4e5caac60858\nResult.Y = 303bf4d62cf569370ae5393fac46b64efe98ee8222b9982bc3dc61b8e32411c5\n\nTest = PointAdd\nA.X = da49658b6c64fc7a7441b177987abbbdbfcfc3c2c569ed97696d706f7af91ca0\nA.Y = 9a66906a6e313603e9d78f99fbbda837e521e75bbbad9455ffd43f51f5e30ee5\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = fe32e5885d0005fa1962166142d2aea201af9c4ca41cdddc5446dc2472f71f42\nB.Y = a2f9b4d35ea19303a101034e96870a7caed371a980965bf86291b03b5c85af60\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = 5375c5ea3e33c1862ca5f09322ce2012c2b4fbee9a299b66e4882e016908cc2a\nResult.Y = 936e4f12ed144cf6fcd0ab085a4929e5e3e7c28641692b1fc2ad9a3b3d447b31\n\n# Test some random affine doublings.\nTest = PointAdd\nA.X = b148cad109d4b24342eb3a03ccaa10dfd6101edf9548b1d1442b61982a4e332c\nA.Y = 7daac293162a8ee2592529630f5bd1eae96659d27c045898d33833999cd076ba\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = b148cad109d4b24342eb3a03ccaa10dfd6101edf9548b1d1442b61982a4e332c\nB.Y = 7daac293162a8ee2592529630f5bd1eae96659d27c045898d33833999cd076ba\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = ad00fae6ab0898f7d5eeeffe8c94b302060fba2b191a2d342a8a302998ebe566\nResult.Y = 9ee46ba864901cad75169cdea023d7e64da39315e2fec1703fad6b613eb24006\n\nTest = PointAdd\nA.X = f21318618205f4967c4f47c9bc3cea41e144dc01830d087414da8dcb16d37cb3\nA.Y = 76cebf81ecc696024fe949191dc49b245ef8cc0d55ada88abf481ddad9eb6129\nA.Z = 00000000fffffffeffffffffffffffffffffffff00000000",
     "0000000000000001\nB.X = f21318618205f4967c4f47c9bc3cea41e144dc01830d087414da8dcb16d37cb3\nB.Y = 76cebf81ecc696024fe949191dc49b245ef8cc0d55ada88abf481ddad9eb6129\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = ad8e13b721bcbfc0fe629465cda5fee3494785d51dbe65f1e13429f52c83f03e\nResult.Y = 85722e168d89543dce293428e75d52765d0935bde2ef5c45a088222db0dbbeb5\n\nTest = PointAdd\nA.X = 8797ff95334b238dadf0cb3d4dc9350678f4c7fc520089ecb70ab419510f2331\nA.Y = 326c7583d54dde377fa9193c8588912c4db2219e1bb383ab13902187e5ef76ce\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = 8797ff95334b238dadf0cb3d4dc9350678f4c7fc520089ecb70ab419510f2331\nB.Y = 326c7583d54dde377fa9193c8588912c4db2219e1bb383ab13902187e5ef76ce\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = e91c8ec9611de8e44e0d882df59f4fae8d15e3867858fb155256a4a2f154bbc4\nResult.Y = c12be21033c6dcea7e7d7262c47876d099aead75d8b025e45ce7986193fc6f8a\n\nTest = PointAdd\nA.X = 2f4cba9543c9537e393f126e31bedb521dc0a74a940e731800e5e39cdece355d\nA.Y = 1a0957898b746b7dbc9245acd0c6df9e6adca4d8537454c9f318a8ce7c3875c4\nA.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nB.X = 2f4cba9543c9537e393f126e31bedb521dc0a74a940e731800e5e39cdece355d\nB.Y = 1a0957898b746b7dbc9245acd0c6df9e6adca4d8537454c9f318a8ce7c3875c4\nB.Z = 00000000fffffffeffffffffffffffffffffffff000000000000000000000001\nResult.X = 5cdc40808120b68e3131bd6ed70a5ce6618f960e4d540baa582afc71be97c65d\nResult.Y = 1926a2c9f5b2d3d1dff784623fe6efe2ac629395101d38db0eff5e540bfeacb0\n\n\n# Scalar montgomery multiplication tests.\n#\n# The following tests satisfy A * B * 2^-256 = Result (mod N).\n\nTest = OrdMulMont\nA = 0000000000000000000000000000000000000000000000000000000000000000\nB = b4e9b0aea84aa5ed86964a22881a4d0e58f88e9225f30990c18751e7d4b9ec95\nResult = 0000000000000000000000000000000000000000000000000000000000000000\n\nTest = OrdMulMont\nA = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf\nB = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323\nResult = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323\n\nTest = OrdMulMont\nA = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\nB = abafdc695e4c2c850f8fc60f1efdbf7406a3cd2c6c59bb7e608985723896c187\nResult = 917b1214c7b31a7ee7e53be0b41a139e435ff576b51ec6af1e1a944412bea38b\n\nTest = OrdMulMont\nA = cf0f01b83670a1c79154ea16f3574ca2d4c688a3c3b6017795cbe54854418904\nB = c5ec4d3b00fb2e11fb3b1aa09e60f7d187f7c515977d1343dab9745961fcbb43\nResult = 7aaddcee32e3b340af5ad06f854284cbbce5a1ab919e9b7771c3b0e937093438\n\nTest = OrdMulMont\nA = 50023f9913879ac4020bc45a89a0ea89082db6265b96b851af29969dd8a9661c\nB = 7c165b1cba80808db114441563aa0fbfba41b9e8acff77312a2dd2138b74ef89\nResult = 3d2ca1705d8d38cbc76a5409c6535044733cafcb95d12654af1d14de177978b5\n\nTest = OrdMulMont\nA = 4d5341ea735e53d2e4f2934755642adee209bd0e5a1506206513227f3c48b270\nB = 6e48f2b60eb8fb86760134abaf3d61692557862924069c599ceb31309ea18704\nResult = 37cde3e35c814d4287bd345b910d687983929907b7a08afa2acd8596832ea86c\n\nTest = OrdMulMont\nA = 33d06c3f5a595a41a6f9c4356f8ab2b8c550d4c64b806eab5560af247c5fa9ed\nB = 0e52f34adf5754343bcf3529d652620da3c05b5dd9cdcddfb08b674a1ad21a09\nResult = 9dc64d7b4c1bc33b930e0daee2a24fc41f770378659ee71b846d2239b0fea8ea\n\nTest = OrdMulMont\nA = 8f211780cce4f93b7193b9378e6f83e1147fb3602b052eef782de8cc833e54ab\nB = e1e4f7f1feb15be64292cff86b47cd9730bcb15b133340022b824d591a660cdf\nResult = dfa2b683b1ae23027c7c109e0abb40a1366eda027ad2cad1a09061a57bee391f\n\nTest = OrdMulMont\nA = 803c279c7e4c11a5568290c0a5789ceab6860f51a942bf646501a45e1ec0a6bf\nB = c0a1145a12037129c571f5f939bf16ea0b8b480f08ec774c045d059841f7d5ed\nResult = ab48fa3b4aa692a7c077cc55ee3c3fff895118a23728c2fa5f361b30730d955a\n\nTest = OrdMulMont\nA = 0e5c95158297d75dbf0b02c3090730f65bf14704495b14837dd907af569407f1\nB = 5a03e3787c8772b2fb7ab07d7fe7fe653a58bdae7fde3174c6ed305e524f5728\nResult = 71296d305dcf9ce39010ea4f4bbf9f7c1064a413597bdc7574c13dea3fa514dc\n\nTest = OrdMulMont\nA = 366299be07886f7846fc74231db624b169360e3c8f60196a1afc9f2101e03922\nB = d6d7c830a6edb6861868b964519a6b68f6f24f7c09d66003f3f88eadd1e00158\nResult = 0b89596bf5054ebe95a39dab6e975b58190160610b09b2a4f93331ecc0e79fd3\n\nTest = OrdMulMont\nA = 8f36f0ef275a72192c3b7388e84df2b8acf66fc53aaf556e3be05c76b3f782c0\nB = 704e519363d44e8df8d91f5f347eb61e8d3e85c8fc1b82980c370a379b2bc81c\nResult = b70a392e3ce5e85b5efbbded9b8c16a3068ba9b93b4cbed9a9a71dffaad6b58a\n\nTest = OrdMulMont\nA = bf4466ef4dea9f06f0f3b4f14e01140a774262c7e0706584f4d7dac19be46d58\nB = 4af12d528b2cef0f6714961bca2ab682f8abaa97600ea8181f71563d56f8a9f5\nResult = 7b6827c0881b9846e32499e13277efb07917cf4b8c8c72bfb3daa8c1786a8e15\n\n\n# Test cases where A == B to test squaring.\n\nTest = OrdMulMont\nA = 0000000000000000000000000000000000000000000000000000000000000000\nB = 0000000000000000000000000000000000000000000000000000000000000000\nResult = 0000000000000000000000000000000000000000000000000000000000000000\n\nTest = OrdMulMont\nA = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf\nB = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf\nResult = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf\n\nTest = OrdMulMont\nA = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\nB = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\nResult = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79\n\nTest = OrdMulMont\nA = da43b8dd7fe8830a4fe8980ec585ccbe903a2965a695cdff398200b74b2ede41\nB = da43b8dd7fe8830a4fe8980ec585ccbe903a2965a695cdff398200b74b2ede41\nResult = 5ec68604412205b380e26ee4e4081eccc10ac7d1417b09cd534f8517b0de81ec\n\nTest = OrdMulMont\nA = a82a2b8bdbf8a37dc7cb5799691494a8c9fbf649686a4d250dc30697feb0fa47\nB = a82a2b8bdbf8a37dc7cb5799691494a8c9fbf649686a4d250dc30697feb0fa47\nResult = 552c094a8841621d6cc26b3b54ce5da5664283888445196a6433d3cfdcad3aee\n\nTest = OrdMulMont\nA = d785006e250410d9dcc6d7740795a7374c25b00b9c9a37b8285694a07307eacd\nB = d785006e250410d9dcc6d7740795a7374c25b00b9c9a37b8285694a07307eacd\nResult = 971aaa9e70ad082cf43725f2e65bc73f4bf762459cee13167545072ec7bdcaf8\n\nTest = OrdMulMont\nA = 69d6d9f5417e87d603a3fb6acafa0d1f974abf94ca57ce58d718a0ad5d02a496\nB = 69d6d9f5417e87d603a3fb6acafa0d1f974abf94ca57ce58d718a0ad5d02a496\nResult = eb3284e5799fbe93171f08e6de9f792cd17f036b3a17671b0310e49b48e589b3\n\nTest = OrdMulMont\nA = 1c28f742c3e26e74901d0425f2eb4d5272524668d2405875b32cf6433f212900\nB = 1c28f742c3e26e74901d0425f2eb4d5272524668d2405875b32cf6433f212900\nResult = 74f70a95399b7ad061a2200fa50528d68eee4654341c8158101e1e3f8f16e642\n\nTest = OrdMulMont\nA = 026b2f69f0259d221920b2f358b378a79826f0332ee36afa257765043e3d6732\nB = 026b2f69f0259d221920b2f358b378a79826f0332ee36afa257765043e3d6732\nResult = e1e9cfa4724995bb50971ca22f3c028cd31cb51fbef8a37c31f10fd1d468f13b\n\nTest = OrdMulMont\nA = 376ed4fadcc1c6c4160a0c9c2ab7c62260367968b08d304d47c65f25625d7d60\nB = 376ed4fadcc1c6c4160a0c9c2ab7c62260367968b08d304d47c65f25625d7d60\nResult = b9ccb67f377e1278f1d2eeda26e5eed76f32406c9deed9764fc0aa346d91e02b\n\nTest = OrdMulMont\nA = 50f66867d0a4ef389678d760d2a4db886583b4c068d0e240f7ddf3472c871304\nB = 50f66867d0a4ef389678d760d2a4db886583b4c068d0e240f7ddf3472c871304\nResult = 82c3467bc5f7ca8b45f4ee61546745e2f53755a02e87f65f572418d60e471c8b\n\nTest = OrdMulMont\nA = 5b8bd82b37206d2b727f19ad2d02f63773470074dde7d43d2a77c448ddf2f978\nB = 5b8bd82b37206d2b727f19ad2d02f63773470074dde7d43d2a77c448ddf2f978\nResult = dbf3c2fc67a0688c3b5ff12cab1739d50b6093c5d98943d388652b1207e4a0f2\n\nTest = OrdMulMont\nA = bed7b3a4dada0e16984eb59ee239005ab212e5b1772cdd5d240c8ee268f65c81\nB = bed7b3a4dada0e16984eb59ee239005ab212e5b1772cdd5d240c8ee268f65c81\nResult = 9232aa2759ca9c5efbaefb0cf45cc6bc9c89def8c25e5c169fe623f30787df36\n",
 };
-static const size_t kLen44 = 169648;
+static const size_t kLen45 = 169648;
 
-static const char *kData44[] = {
+static const char *kData45[] = {
     "# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Generation Test\n# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip\n#\n# NIST's files provide message and digest pairs. Since this is a low-level test,\n# the digests have been extracted. P-521 test vectors were fixed to have the\n# right number of leading zeros.\n\nCurve = P-224\nPrivate = 16797b5c0c7ed5461e2ff1b88e6eafa03c0f46bf072000dfc830d615\nX = 605495756e6e88f1d07ae5f98787af9b4da8a641d1a9492a12174eab\nY = f5cc733b17decc806ef1df861a42505d0af9ef7c3df3959b8dfc6669\nDigest = 07eb2a50bf70eee87467600614a490e7600437d077ec651a27e65e67\nK = d9a5a7328117f48b4b8dd8c17dae722e756b3ff64bd29a527137eec0\nR = 2fc2cff8cdd4866b1d74e45b07d333af46b7af0888049d0fdbc7b0d6\nS = 8d9cc4c8ea93e0fd9d6431b9a1fd99b88f281793396321b11dac41eb\n\nCurve = P-224\nPrivate = cf020a1ff36c28511191482ed1e5259c60d383606c581948c3fbe2c5\nX = fa21f85b99d3dc18c6d53351fbcb1e2d029c00fa7d1663a3dd94695e\nY = e9e79578f8988b168edff1a8b34a5ed9598cc20acd1f0aed36715d88\nDigest = bde0fbb390fb05d0b75df5bd0d0a4ea29516125f19830e3b0c93b641\nK = c780d047454824af98677cf310117e5f9e99627d02414f136aed8e83\nR = 45145f06b566ec9fd0fee1b6c6551a4535c7a3bbfc0fede45f4f5038\nS = 7302dff12545b069cf27df49b26e4781270585463656f2834917c3ca\n\nCurve = P-224\nPrivate = dde6f173fa9f307d206ce46b4f02851ebce9638a989330249fd30b73\nX = fc21a99b060afb0d9dbf3250ea3c4da10be94ce627a65874d8e4a630\nY = e8373ab7190890326aac4aacca3eba89e15d1086a05434dd033fd3f3\nDigest = c2c03fe07e10538f6a38d5831b5dda9ce7478b3ed31323d60617dc95\nK = 6629366a156840477df4875cfba4f8faa809e394893e1f5525326d07\nR = 41f8e2b1ae5add7c24da8725a067585a3ad6d5a9ed9580beb226f23a\nS = a5d71bff02dce997305dd337128046f36714398f4ef6647599712fae\n\nCurve = P-224\nPrivate = aeee9071248f077590ac647794b678ad371f8e0f1e14e9fbff49671e\nX = fad0a34991bbf89982ad9cf89337b4bd2565f84d5bdd004289fc1cc3\nY = 5d8b6764f28c8163a12855a5c266efeb9388df4994b85a8b4f1bd3bc\nDigest = 5d52747226f37a5afcd94d1b95867c0111bcb34402dad12bee76c1b7\nK = 1d35d027cd5a569e25c5768c48ed0c2b127c0f99cb4e52ea094fe689\nR = 2258184ef9f0fa698735379972ce9adf034af76017668bfcdab978de\nS = 866fb8e505dea6c909c2c9143ec869d1bac2282cf12366130ff2146c\n\nCurve = P-224\nPrivate = 29c204b2954e1406a015020f9d6b3d7c00658298feb2d17440b2c1a4\nX = 0e0fc15e775a75d45f872e5021b554cc0579da19125e1a49299c7630\nY = cb64fe462d025ae2a1394746bdbf8251f7ca5a1d6bb13e0edf6b7b09\nDigest = a1ab56bd011b7e6c7e066f25333d08cf81ac0d9c1abfa09f004ab52f\nK = 39547c10bb947d69f6c3af701f2528e011a1e80a6d04cc5a37466c02\nR = 86622c376d326cdf679bcabf8eb034bf49f0c188f3fc3afd0006325d\nS = 26613d3b33c70e635d7a998f254a5b15d2a3642bf321e8cff08f1e84\n\nCurve = P-224\nPrivate = 8986a97b24be042a1547642f19678de4e281a68f1e794e343dabb131\nX = 2c070e68e8478341938f3d5026a1fe01e778cdffbebbdd7a4cd29209\nY = cde21c9c7c6590ba300715a7adac278385a5175b6b4ea749c4b6a681\nDigest = 8ef4d8a368fad480bac518d625e97206adcafa87c52aef3d179cbfa9\nK = 509712f9c0f3370f6a09154159975945f0107dd1cee7327c68eaa90b\nR = 57afda5139b180de96373c3d649700682e37efd56ae182335f081013\nS = eb6cd58650cfb26dfdf21de32fa17464a6efc46830eedc16977342e6\n\nCurve = P-224\nPrivate = d9aa95e14cb34980cfddadddfa92bde1310acaff249f73ff5b09a974\nX = 3a0d4b8e5fad1ea1abb8d3fb742cd45cd0b76d136e5bbb33206ad120\nY = c90ac83276b2fa3757b0f226cd7360a313bc96fd8329c76a7306cc7d\nDigest = 28fabbac167f3d6a20c2f5a4bcee527c96be04bdd2c596f09d8fbab7\nK = 1f1739af68a3cee7c5f09e9e09d6485d9cd64cc4085bc2bc89795aaf\nR = 09bbdd003532d025d7c3204c00747cd52ecdfbc7ce3dde8ffbea23e1\nS = 1e745e80948779a5cc8dc5cb193beebb550ec9c2647f4948bf58ba7d\n\nCurve = P-224\nPrivate = 380fb6154ad3d2e755a17df1f047f84712d4ec9e47d34d4054ea29a8\nX = 4772c27cca3348b1801ae87b01cb564c8cf9b81c23cc74468a907927\nY = de9d253935b09617a1655c42d385bf48504e06fa386f5fa533a21dcb\nDigest = 50dd74b5af40978e809cee3eb41195402ebb5056e4437f753f9a9d0d\nK = 14dbdffa326ba2f3d64f79ff966d9ee6c1aba0d51e9a8e59f5686dc1\nR = ff6d52a09ca4c3b82da0440864d6717e1be0b50b6dcf5e1d74c0ff56\nS = 09490be77bc834c1efaa23410dcbf800e6fae40d62a737214c5a4418\n\nCurve = P-224\nPrivate = 6b98ec50d6b7f7ebc3a2183ff9388f75e924243827ddded8721186e2\nX = 1f249911b125348e6e0a473479105cc4b8cfb4fa32d897810fc69ffe\nY = a17db03b9877d1b6328329061ea67aec5a38a884362e9e5b7d7642dc\nDigest = 9fee01807ab6c43a794abf6dcd6118915252ca7d3a31a1ff96b88a8d\nK = ab3a41fedc77d1f96f3103cc7dce215bf45054a755cf101735fef503\nR = 70ccc0824542e296d17a79320d422f1edcf9253840dafe4427033f40\nS = e3823699c355b61ab1894be3371765fae2b720405a7ce5e790ca8c00\n\nCurve = P-224\nPrivate = 8dda0ef4170bf73077d685e7709f6f747ced08eb4cde98ef06ab7bd7\nX = 7df67b960ee7a2cb62b22932457360ab1e046c1ec84b91ae65642003\nY = c764ca9fc1b0cc2233fa57bdcfedaab0131fb7b5f557d6ca57f4afe0\nDigest = c349032f84384b913bd5d19b9211ddce221d66a45e8a051878254117\nK = 9ef6ebd178a76402968bc8ec8b257174a04fb5e2d65c1ab34ab039b9\nR = eef9e8428105704133e0f19636c89e570485e577786df2b09f99602a\nS = 8c01f0162891e4b9536243cb86a6e5c177323cca09777366caf2693c\n\nCurve = P-224\nPrivate = 3dbe18cd88fa49febfcb60f0369a67b2379a466d906ac46a8b8d522b\nX = b10150fd797eb870d377f1dbfa197f7d0f0ad29965af573ec13cc42a\nY = 17b63ccefbe27fb2a1139e5757b1082aeaa564f478c23a8f631eed5c\nDigest = 63fe0d82cf5edf972e97316666a0914432e420f80b4f78ceb92afd1d\nK = 385803b262ee2ee875838b3a645a745d2e199ae112ef73a25d68d15f\nR = 1d293b697f297af77872582eb7f543dc250ec79ad453300d264a3b70\nS = 517a91b89c4859fcc10834242e710c5f0fed90ac938aa5ccdb7c66de\n\nCurve = P-224\nPrivate = c906b667f38c5135ea96c95722c713dbd125d61156a546f49ddaadc6\nX = 3c9b4ef1748a1925578658d3af51995b989ad760790157b25fe09826\nY = 55648f4ff4edfb899e9a13bd8d20f5c24b35dc6a6a4e42ed5983b4a0\nDigest = 9b44ee16e576c50c0b6b37ac1437bf8f013a745615012451e54a12f2\nK = b04d78d8ac40fefadb99f389a06d93f6b5b72198c1be02dbff6195f0\nR = 4bdd3c84647bad93dcaffd1b54eb87fc61a5704b19d7e6d756d11ad0\nS = fdd81e5dca54158514f44ba2330271eff4c618330328451e2d93b9fb\n\nCurve = P-224\nPrivate = 3456745fbd51eac9b8095cd687b112f93d1b58352dbe02c66bb9b0cc\nX = f0acdfbc75a748a4a0ac55281754b5c4a364b7d61c5390b334daae10\nY = 86587a6768f235bf523fbfc6e062c7401ac2b0242cfe4e5fb34f4057\nDigest = 3c89c15dee194b3223e7b53a8a5845d4873a12a2f1581d5413359828\nK = 854b20c61bcdf7a89959dbf0985880bb14b628f01c65ef4f6446f1c1\nR = a2601fbb9fe89f39814735febb349143baa934170ffb91c6448a7823\nS = bf90f9305616020a0e34ef30803fc15fa97dffc0948452bbf6cb5f66\n\nCurve = P-224\nPrivate = 2c522af64baaca7b7a08044312f5e265ec6e09b2272f462cc705e4c3\nX = 5fad3c047074b5de1960247d0cc216b4e3fb7f3b9cd960575c8479fc\nY = e4fc9c7f05ff0b040eb171fdd2a1dfe2572c564c2003a08c3179a422\nDigest = 2b7faf36fdf0e393ddeb9fc875dd99f670e3d538fd0462395ea06c8f\nK = 9267763383f8db55eed5b1ca8f4937dc2e0ca6175066dc3d4a4586af\nR = 422e2e9fe535eb62f11f5f8ce87cf2e9ec65e61c06737cf6a0019ae6\nS = 116cfcf0965b7bc63aecade71d189d7e98a0434b124f2afbe3ccf0a9\n\nCurve = P-224\nPrivate = 3eff7d07edda14e8beba397accfee060dbe2a41587a703bbe0a0b912\nX = 6dd84f4d66f362844e41a7913c40b4aad5fa9ba56bb44c2d2ed9efac\nY = 15f65ebcdf2fd9f8035385a330bdabec0f1cd9cc7bc31d2fadbe7cda\nDigest = 5b24b6157c0d1edf3a40c22a0745d23bdb59379e5e5e776ed040288d\nK = 7bb48839d7717bab1fdde89bf4f7b4509d1c2c12510925e13655dead\nR = 127051d85326049115f307af2bc426f6c2d08f4774a0b496fb6982b1\nS = 6857e84418c1d1179333b4e5307e92abade0b74f7521ad78044bf597\n\nCurve = P-224\nPrivate = 888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa\nX = 4c741e4d20103670b7161ae72271082155838418084335338ac38fa4\nY = db7919151ac28587b72bad7ab180ec8e95ab9e2c8d81d9b9d7e2e383\nDigest = 00c6fc53c1986d19a8a8b580ee553dc1240745d760647d1c0adf442c133c7f56\nK = 06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90\nR = 0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772\nS = 298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0\n\nCurve = P-224\nPrivate = 5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972\nX = 897089f4ef05b943eeac06589f0e09ccc571a6add3eb1610a2fc830f\nY = 62ba3f6b3e6f0f062058b93e6f25b6041246c5be13584a41cae7e244\nDigest = fb5dd3b8d280fe7c4838f01b2a5c28493ed3084f46b40642600ba39e43fbff7b\nK = 5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676\nR = f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce31\nS = 12fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae\n\nCurve = P-224\nPrivate = f60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170\nX = 40a4ab1e6a9f84b4dedb81795e6a7124d1cfdfd",
     "7ec64c5d4b9e32666\nY = 83aa32a3c2fc068e62626f2dafce5d7f050e826e5c145cd2d13d1b27\nDigest = f4083aebe08c9bdb8c08ff844ffc207f80fa4406fb73bdbc1c6020f71281bdae\nK = c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395\nR = bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12\nS = cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7\n\nCurve = P-224\nPrivate = c8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85\nX = 66f49457ed15f67ed4042195856f052fe774077f61cebcb9efddc365\nY = 3a6e3f3423eec7308a69eb1b0416d67cc3b84d24f251d7cbdb45c079\nDigest = cb017b280093879c4b114b52ea670f14e97b661074abccc8539a23280fe136b4\nK = 5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9\nR = 7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf38618\nS = 93d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6\n\nCurve = P-224\nPrivate = 04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6\nX = 8d642868e4d0f55ee62a2052e6b806b566d2ac79dbde7939fe725773\nY = 79505a57cd56904d2523b3e1281e9021167657d38aeb7d42fc8ec849\nDigest = 5f1d77f456d7ed30acad33795b50733d54226e57df4281a43d3821d0762f12fe\nK = ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22\nR = 2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6\nS = 550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0\n\nCurve = P-224\nPrivate = 35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39\nX = 7924b1d7f5920cce98e25094e40f2eb3eb80d70b17e14b3d36c3671c\nY = 26c5af35f71e61858582b7cc2b41790597c53ee514ffdf7a289d108c\nDigest = cce0671ca07521fdaa81eced1dc37282bd9a6dbbaeb8cd00d13d4cf75cef044c\nK = 751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796\nR = 26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64\nS = 836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb\n\nCurve = P-224\nPrivate = 2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6\nX = 18cb5826ad60e6696bf07655032a3749f6577ca36da3ccd6e66a137c\nY = 194e14820fe02d784fd1363ff7a30399518309765bd3f4412d646da2\nDigest = 4ee903b828f54f35adab0bfec06eb064abde530d8ed0384730aa23e8e9664801\nK = e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd\nR = 00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceab\nS = f250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7\n\nCurve = P-224\nPrivate = 831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b\nX = 076518e393940d42dfd09819409d66966d8c9189c83d554a9cc8a082\nY = 44d0ceaf4c0f50e46bea4a52e30423ce3ada19edd363ac5694c65cb8\nDigest = 215e9817eccaa125e0c053fed373f4605de292d27a692bd4f744e63215fd8705\nK = 6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c\nR = ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b1\nS = 6029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a\n\nCurve = P-224\nPrivate = 70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b\nX = 279649e2a2918e683520cde3fc98b0ae58a7100e8de35e7c9cc797b6\nY = aa4de6be34be61f02880139787b9038f4554a8ef1c994b887c2974b5\nDigest = 6571a344765c0512d3911a7724509b649a6ce4106823be76726f117f109ec0fa\nK = 8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b\nR = 3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c\nS = 2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60\n\nCurve = P-224\nPrivate = 026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8\nX = 3fa617c50b177da1a2bdb98b780ad21ad1195c4bd24465f6187de3c9\nY = e3fd8d8876dfd03a4a4e31a1acad3a08d983826d286c250c4e5620c1\nDigest = 95914b17ff0362e12305d71657bbc9d919ae4aa746bf4ebe95b2d2fe7ca3f022\nK = 0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77\nR = 3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca\nS = 63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119\n\nCurve = P-224\nPrivate = e79c18d935c2839644762867aa793201f96a3cde080c5968412ce784\nX = b7ae1e992b1c7fde1141f40bd913358538ca0f07f62b729f13cea327\nY = 811252d12120e04805fc171a439d382c43b68a21e1a0bdf5e4ec1da4\nDigest = 2dd97b10b2ac90709062989f57873e30696bf8376957e68f7de95aa333a67685\nK = 7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361\nR = d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710\nS = d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e\n\nCurve = P-224\nPrivate = 0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c\nX = cd95cf8fb1cd21690f40d647f2353672a1076cc6c46bddaad2d0fc56\nY = 934262f74d9ee0f8a2754f64cb7415923d64bf00c94a39b52803f577\nDigest = 7c74a2e71f7bb3101787517394a67d03f977c95519526b47854e417b95bf8d1b\nK = 557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f\nR = 56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5\nS = f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc\n\nCurve = P-224\nPrivate = 0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583\nX = b88652020e083ccc1c43dc83d1881884dd4c7e3b4e3460b344b1ea64\nY = 22b69b517f86d7c26dc37c0f8feb4bb07fe876149fbcc3334fd2805b\nDigest = ccc04666744685c57d2256f21cee0f53857a0528a96d59bb13cdeb92fd786d4f\nK = e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2\nR = b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f2707\nS = 3dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11\n\nCurve = P-224\nPrivate = 2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2\nX = ce1a06f82df874dded37cca03b56c0648e4e8917ecd40ee73ee61588\nY = ceb6177b8f1ac7c5c6e6e1f7737cc3026952ee392badd2cd7af32f9d\nDigest = 9e7d5f30677692b669e21cf5461fa7f2e887dfcbbeb2db88d666bd591a944e00\nK = e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d\nR = 28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078a\nS = a5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76\n\nCurve = P-224\nPrivate = f4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc\nX = 0dc2cdddb990341adb1de73f02d87fc3822485a659a15145f4251d5f\nY = cf78b2a83c7352eda1af2c74e1804ea04b35f76c04e89d90281dc2bb\nDigest = d8978f697bef71b062d4b3211e8ab5b993c09920af803614dbb9437f6e261b70\nK = 5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40\nR = 82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b\nS = 8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b\n\nCurve = P-224\nPrivate = 62c572ee0d6f81b27e591d788bfc2f42b5105d2663078dfb58069ebd\nX = bd6ba605639b98fa8113a16a3bb004ddfaec901c98a931206165f4a5\nY = a3190b10ef39e88abd60b2293b4707512b45c6c5ed5794cc11454427\nDigest = 1a9fc0195bf0f53cebba8aa7ccc8567c680d75187392d6d8201854ec4a6e6abd349037d831809e9f3add2fc09d27e4a4\nK = 0f0bb1e428bcdebf4dc62a5278068efc0f8ce75f89e89b3630f102b2\nR = aac0ea27e129f544abcc77f110e70bbdd5aa3e425dc39d5e8887025d\nS = 10e5dd06aee6b8419a04aa33d9d5678b0039c3acc3c4b61fe106bfdc\n\nCurve = P-224\nPrivate = e2f86bf73ba9336fa023343060f038e9ad41e5fe868e9f80574619a3\nX = f5d5346f17898ea6bbdfff19c216a8757a5dc37b95315f5481628381\nY = ae61fd172ac8b7a4f13870a932dece465834cbd4f50bbcfb802c824e\nDigest = 0f236d9a43edd55dacf5ff9f93ee805395e130ca2c8ad2eaea0fdd68e2ee2fadae9f41aa46f881485db208bd9cdc463b\nK = 35724ac043e3b44b73b5a7919cf675190306d26aa67c27c28c873534\nR = 535147c265af138eec50c7fb570bcc8d2e6f675597b0fcc034e536bc\nS = 743812c188a1dddf9fb34b90738f8b2e58760d6cd20ccceb1bb9c516\n\nCurve = P-224\nPrivate = b0a203438e2586d7575bc417a4a798e47abc22aa3955b58fc2789f17\nX = dc5d217862a1e5b00c95affa9d8b925a72b9beaeb7a86dc397e788d8\nY = 5f05f8e976ae1eb1036eca6d683a82850795bf9127dee5f8b2859445\nDigest = 525b6241eb2a6dd00b55b172708aafd0775e959b7c601903f44ffcfc17ee979f34f204680f8a71044a6d7e3679a50576\nK = 408e9c8b1f33136d6ddb93ff3a498bc09d4eee99bf69cdd5af0aa5a2\nR = 1b5a964c8b1fc634c6e2b82322499df1d7f0c12a4d2a77723c816ab8\nS = cf54599a36ca064fae0aa936de5266f87704409d22a15d28c01b7f2a\n\nCurve = P-224\nPrivate = efcfa50fad6fb2065f9a55f28c0c42fa24c809ccb19b6fc6d8ffb085\nX = 61521a0cfb72be77ba33cb3b8e022743cd9130ff49e97093b71aa178\nY = ce0819aedaf6fce639d0e593f8ab0147eeb6058f5f2b448231584ea9\nDigest = 88c4b7ca396f17e82c92596c301e41d7f01810bfeb33173cc0d1fedf3fd5ace6892ba9a788de13417f0ef00ff87344fb\nK = d1eea821f286eae6ebc1f61b08f9ad4323a3787e94af4c32cd31351b\nR = b37caaa71103752ac559f9eb4943324409ebfa8b585f684dcaa5c411\nS = 7c28e7619e2944ab4b7be022878c8052ebdf2cae5dff4f976c49686a\n\nCurve = P-224\nPrivate = 61a17816937987764cdc064dc7b5b4f5b16db1023acdfe25902957dd\nX = a7e975c0a8f87c683bb8e31bc160843a7b69c945f4850bd60e1c08c0\nY = 8930a454dcc2aa13bed7ea89368b2c9d689d816b2acf4e52585ee9c4\nDigest = 3babfaba30f3300171e6adcf4f62a12287031ac40078c96b2c2c063849e9a42ef3be953dc11fb319c18bf22fe511bf37\nK = 44b1fdec2629f9075f89c134ac28ff19bfddaa",
     "9db02a5d7f853582b4\nR = b0f5635d8bc9c53a1d54a3ec63de59ed66e6b2358d4ab79755414326\nS = 67c68fe265c7e5aba4232deeafb88545a2aa266fb9f2c2bb3f3ae8d2\n\nCurve = P-224\nPrivate = 79d5367314ec664aa0f6ca36f95549502a05bf8400bf532d669fab8d\nX = 3191f0237102dac159032ab2dde53cf56c9ec827b5caddfe9e83c02a\nY = b496b1bdcca4434ac0d0d91ea38ff3bc33f9f54095bfe17796d5a9e2\nDigest = 9f36da1a5653469a52f85e7e3b2a21ac3497cc00ff37e03235bbdf951695f182312ad5c8fb8a5fbd0295dc8c5acda068\nK = da529c52f5cc1f435d873109cd991d6cd7e1631d9ff1dd9521dd5db6\nR = 8e0ac63903f4921755430572c3f08bc272790639bdf1009fe2a9a714\nS = 6278c841a2d0a270791fe54b36c49d426d67907aa4e4f59c8638ad97\n\nCurve = P-224\nPrivate = 1320eedad4745121793a7eaf732b0b4498f7cb456cac8cf45a1f66f0\nX = 9fdd99906ab77fd29e9021bde947d05a7a9eb153612269bfb0899bc9\nY = 681b65b9ac8e4c2899bb622dafb253b7bf5a6e38e5f6595f997c291a\nDigest = 12532cbcfd4e80373bc235ac0bfa2a70b1044786d29f9384d555030f5df3cb5ab9f973df638b6835cb756792d1fe1a4e\nK = 66ed8d8934633f4125f593cf1b1d3745c4db1f15dde60cf46ca1c7f2\nR = 80199485a3a96447b39f7679cd47412a78675ba17dcbd10465dc5b48\nS = a251fd9f136a3cb0dd0bc80659ae032e4a761ba7045da0034553fb8c\n\nCurve = P-224\nPrivate = e18821329447d3f65ba7279e96bd4624ffa1b32b90f6e8331b1e876d\nX = 46c9ed837232c47022df2f1a1578fbe65ac9f2e81c98a74cc22ea31a\nY = 6fc5e9568ae62b31412a0b0b367242e9fd7e518c83aa06a069e1d90d\nDigest = 89030408e06cc06d3dbfb51f6725c710a2bc9db9e07ff1ec8a32a827d93d2dc951834cdb01a7afa1fe4cf4e9186ee424\nK = a4c1eb402a2fb3af26e0e14a3d2fc8ed3bc1a8b2475270356a79fdd3\nR = d478b68733d8ad44be46766e7b66af782fbdc7ff7ed0b191176da98a\nS = 5eae9160ccf71fd1d359d89cecce72ef8afaeee2365f6ba828aa450a\n\nCurve = P-224\nPrivate = f73e030d5a696b358986d3efaca121cf71f775f8835a21e6135145d7\nX = 9ca2c6ea87ac8dd3a23a5b4010841a7c8af309038882ae44634bcf55\nY = b0a347dbd5ded3b8702ac5a457e8b32bd4de06fd315095fa1b7d5fe1\nDigest = eda24262a9e64be110a6c96763e8a4b5edb38af2a084695e294593583b462c56b0db50bc014eb19278e3f3d675eb5f22\nK = e3cc786c1288ea567836c51d6d69dd0cab5c015987d936ccc3a4beb3\nR = f1234da71761b7a0f49e661a419d2a739bdc4544bf87690e3d2f96db\nS = 096d16bf8020c3d3c233894ad8eb81206010e62c6e692a215e088fd4\n\nCurve = P-224\nPrivate = 7a0789323f8741c157a1753ae165ecaf8e8b03a60561f8b80cee467c\nX = 101271a9addd4bd1f19d00bf116c8524f52cefd598e85dc381597acb\nY = 2f17d14f4d8ccb28b216553718152ba7c104646d8eca986dd9ddea39\nDigest = 983a5d16b009cc65bdf3c3badc2f21280e04f44244b70a583c2e9732534497373f51b226c3ab7bd69c6940e46bc41fa1\nK = d169f04f05b60c625cda864d187938863964dab7bb3b9dfc04b05519\nR = e4a51be686a764b709da23ab48b1985e153c6ee238d945e743907afc\nS = 118a8f1ffe3cd556ce6345bd1a398dd9cc3729b7fd6d8af9bfd82f40\n\nCurve = P-224\nPrivate = 78e795d0edb11fd9e28dc26b21e751aa89bea0d87932ef11c95c0e18\nX = 9edd544107977134bf6360d43ccabb3c94d627c03963c0a04b439627\nY = ece4c61d319a0e41f3de7863e7c355bac94395aaa74cdb5f74a87a5b\nDigest = ae7b5fde427af9c450368b11f66f49bf8c3b6e1f5abed6bb25683001924dfb005738637e1c1b7855566330d202ecc763\nK = 36f7c0f76808b826a0a974a1fd6e155e00a73f1d34674a8f88be405a\nR = 3e319444438bc2cc92f323ea842cb402b3c3c2448c89869ef7998edb\nS = 3420cc38f058f41c31e71f4b1ad488f801111c73541de69fcee60695\n\nCurve = P-224\nPrivate = bee02d8bc5bffb3fd3b4c9d6f686409f02662d10150d1e58d689966a\nX = 8848f964c847fe9dddc774618d4588c9cd56bbe588d7b1fb369c8bfa\nY = ebbb699fbd0dc08859fe9132285fe20dff3b9d561c0640b6e0717607\nDigest = 63ef787f467ff0cd6e5012b09414c00ef56dba959c4b62bf7e76a4205078d436c45591752c8d55abe728a2d28b5b0643\nK = 59f1450d857b40e5552a4b8cd4ab0df2f01716635d172c1106840f21\nR = a206d8398a16a991bc217f77f23c6f648384f254f255a8a876404444\nS = eb1169cb5b1423dc0bfaffe565ae57f986e00de06405e3e7b605862e\n\nCurve = P-224\nPrivate = dc0ddf6e501418bb8eafc5d7ccc143369e2aa441df8fc57d5f94a738\nX = 063a5d632f4144376e14cfb03ad8ccf1489b613acd184d20dff66545\nY = e77727f057b043d8a0f7458196b72e92d11f85b0891c6aaa9d915f58\nDigest = 11f0d587e82e7490af4737c272877d9d37c1e7ae7f2fd3b00d8fa0d4f2bcb3a41d5185e65604b8c411a407eb6c558954\nK = ff0e5cae2671db7a1b90e22c63e7570bdd27352d45bac31e338debe0\nR = 5bc0b4998481ecbd3b6609184a84ca41d69b08c37138097f559259f8\nS = 0df8828eb1ca85e46405b94e1a2972c34c5e620a54e2f640f04aecc5\n\nCurve = P-224\nPrivate = 229d89b2fcf8441ffc95ebb2ac2ef156e25825782044b2b8bd6a3e01\nX = de616848d8044a44789ef1ba3a6dd66fe9257ddc57f7534e59a701be\nY = 26cbf74a6d25e5b34b96d30f327abd574cff7f7dbe6686573a7d6c5c\nDigest = 537d6d3d4be3e3beaf31014dae59ca7186c1c1a32c88068ff343180a138ceb6d7c38e0ae1e9b51003b71c1a2f3a3741b\nK = 3b18ca6ec8e8e255ac88f64302745ca0b73ff94b2b2d48be95b4aaee\nR = fa94fd8b827c06115c1eefd50afc02ce5926ee0e789667783c01c34b\nS = edf766a66973cfc33e4159966c07321a7f6549c3c60e8586ef41402b\n\nCurve = P-224\nPrivate = 97d747068147c0393a0bb5c159e2c9f1bd538f6204823294883abe28\nX = 3858a576eef2ce24d01766997fb81b3f3f78b6104cd188610be221d7\nY = 95ffc677ac7bfe3e0bb4cffb17355a964c8356a807151b3cba5d1f4e\nDigest = 7e16034a71ebf52a7a6cd00fe469c6edc121b2882462176298c9443aca2a0ad6ebe2eb9e145097409873170f40d503dd\nK = c1a2ec1ef16cfd5107c892790daefbed061be78bd8576696b60f64d5\nR = 18c908541843fcdac99b9ff6bb397f3f8094d16b42670216e4eaa2d7\nS = c107a8a508ff57c5d4f78f86cc37e129c864d1c44ed5e73909613b74\n\nCurve = P-224\nPrivate = ba5374541c13597bded6880849184a593d69d3d4f0b1cb4d0919cbd6\nX = ac635fe00e8b7a3c8ef5655bdfb7f83e8532e59c0cc0b6534d810ffa\nY = 1d067aebeba66e79b28ecfe59ac6fdf5e1970dc3a84499c9d90cd8e2\nDigest = 3edbb59a32b2464291d0a96023a798c1fc6cb5ff4fcecfadcfac2be00c26fa27181aef76c96d8269aeaf2275eeacbb777abbd9571de9279edc5695a3345cad9b\nK = 187ed1f45c466cbafcd4b9577fb222408c011225dcccfd20f08b8d89\nR = f83d54945997584c923c09662c34cf9ad1e987da8bfd9be600e7a098\nS = 4ff2dba9dba992c98a095b1144a539310e1a570e20c88b7d0aa1955c\n\nCurve = P-224\nPrivate = 1e27187134d0a63542adf4665fba22f00cfc7b0a1e02effe913ceedc\nX = ecaea8ceea55c3bd418fd34a4ff2499e25e66a104eed846bc00c31d2\nY = 3933a356ab1f2dabc303ff0a5d076131e77032e6f502336883bf78a7\nDigest = 825ab979af5c263d9f074a2d771d1d1cdfa435e7938245a3c9ee30cb77ee8c1475051d2f09d7d11d920a6c754bfd253903131c491994679cafdb8cfbf32b763d\nK = 34cb597deae9a3b1cada937abcd247161b19b2b336b20e2e42ae01f1\nR = 58177ba46fb291490b39368774accf72736412c1fb5ee0f27b9b1e02\nS = 58337d78b95a080bfcabb5809bee012501b4da84b8ef310a4628f11c\n\nCurve = P-224\nPrivate = 0905b40e6c29bfcbf55e04266f68f10ca8d3905001d68bb61a27749b\nX = d656b73b131aa4c6336a57849ce0d3682b6ab2113d013711e8c29762\nY = 6328335ffc2029afbfe2a15cc5636978778c3f9dab84840b05f2e705\nDigest = d0db7c20c201cd8c63ca777293543750d7f6a9e375b056e74cfe9fb2c95b2cc9807d8a9607a5b0fad6eeda86e4f73ace139e77a5356181b8cbef3f88173253b6\nK = dc82840d147f893497a82f023d7d2cbf0a3a5b2ac6cc1b9b23e504be\nR = 583af080e0ec7c1ba5a491a84889b7b7b11ccfe18927c7c219b11757\nS = b23700035349df25d839f0973bef78a7515287de6c83707907074fa6\n\nCurve = P-224\nPrivate = afbaede5d75e4f241dd5b53220f3f5b9c1aa1d5d298e2d43236452dc\nX = fe83e59fc8ea8b939355d3258fe53a64d45f63031a0716b7cc416173\nY = f151d23060f1c856eb7f1f58be72a7228c3af89e43b56e9695b558c7\nDigest = 37d9091eddc6fc34b45cf97140e956a42ab659f6bd442e81b57c4ecfbdab45f7380a7efdbac5400ceb1bf683194232cd086c1b4e09fc9313f1bc38af731f1a98\nK = 0fbbe7b40136c81a8fb894498d5502157a1cf5a89d0643de92cd38f6\nR = 24f3f457c7b72b7e759d5a8afbf330e31c5d8d2e36f92c0e79c5d87d\nS = 36fd1193def34f12a960740fd79fb38bf2b480726ccad540eb42cdf8\n\nCurve = P-224\nPrivate = 950b07b0c2b7539a21b5135bfede214733f2e009647d38d8b21d760c\nX = f43d13bbfcee3b724063b3910fea49fd591b81e86fdb813b1a492d0c\nY = 6b4c8d6fa5dc661889e3cf5ec64997a78222837885f85d2fe9b684fb\nDigest = 8ddf64c9c67289a76c2f5b44a30b8365f4adf487b4edadada5749cad9e5765c57a348a750817a53e5c2ff551e003747ca1e3438b2aa1952c6876fda8fd8f4de2\nK = 83e110d0d1e700d2f36543028737d2a2f1474aa3b4b28998a39e4793\nR = 2685265bc878e85d10ab13293dec190881a57c4a467f8fc2170432ea\nS = 80a347bb49036522369339bd6485a967cdda818915d8eb947302fcf9\n\nCurve = P-224\nPrivate = 015bd9f5dfef393b431c3c7fced24385d861ccb563542574a5d2a9bc\nX = e868690641e2cda13b289a6c5d2fb175940396044d9cf27b4f2240af\nY = 4c78c9abdf2b7fc67ed4497001d7bcf1daca1739dc14a661f91d7c40\nDigest = 7c22f34d5897ccdf7d807f68a7f16e3093a4413625e7853401a4e0384d26893f1997c84557515f2ea66afe7629f62415e6b98e18e97dcb4fb2dec97cf2dd68d9\nK = e2374350f47c08f3c1359d4edf87e61d1ba4e7dd1540d8d9062efa79\nR = e12dc088d2bc032bb214c77d0e0fb749fc8e61ebe1ed72996f1084b6\nS = 0ab58aa31e0bba5fbc76855e6549",
@@ -2602,9 +2626,9 @@
     "a0cdf2910c42c9f1954a4572d8e659733d5e26cbd35e3260be40017b2f5d38ec42315f5c0b056c596d\nR = 00d732ba8b3e9c9e0a495249e152e5bee69d94e9ff012d001b140d4b5d082aa9df77e10b65f115a594a50114722db42fa5fbe457c5bd05e7ac7ee510aa68fe7b1e7f\nS = 0134ac5e1ee339727df80c35ff5b2891596dd14d6cfd137bafd50ab98e2c1ab4008a0bd03552618d217912a9ec502a902f2353e757c3b5776309f7f2cfebf913e9cd\n\nCurve = P-521\nPrivate = 013c3852a6bc8825b45fd7da1754078913d77f4e586216a6eb08b6f03adce7464f5dbc2bea0eb7b12d103870ef045f53d67e3600d7eba07aac5db03f71b64db1cceb\nX = 00c97a4ebcbbe701c9f7be127e87079edf479b76d3c14bfbee693e1638e5bff8d4705ac0c14597529dbe13356ca85eb03a418edfe144ce6cbf3533016d4efc29dbd4\nY = 011c75b7a8894ef64109ac2dea972e7fd5f79b75dab1bf9441a5b8b86f1dc1324426fa6cf4e7b973b44e3d0576c52e5c9edf8ce2fc18cb3c28742d44419f044667f8\nDigest = d209f43006e29ada2b9fe840afdf5fe6b0abeeef5662acf3fbca7e6d1bf4538f7e860332ef6122020e70104b541c30c3c0581e2b1daa0d767271769d0f073133\nK = 01e25b86db041f21c2503d547e2b1b655f0b99d5b6c0e1cf2bdbd8a8c6a053f5d79d78c55b4ef75bff764a74edc920b35536e3c470b6f6b8fd53898f3bbc467539ef\nR = 01dce45ea592b34d016497882c48dc0c7afb1c8e0f81a051800d7ab8da9d237efd892207bc9401f1d30650f66af8d5349fc5b19727756270722d5a8adb0a49b72d0a\nS = 00b79ffcdc33e028b1ab894cb751ec792a69e3011b201a76f3b878655bc31efd1c0bf3b98aea2b14f262c19d142e008b98e890ebbf464d3b025764dd2f73c4251b1a\n\nCurve = P-521\nPrivate = 01654eaa1f6eec7159ee2d36fb24d15d6d33a128f36c52e2437f7d1b5a44ea4fa965c0a26d0066f92c8b82bd136491e929686c8bde61b7c704daab54ed1e1bdf6b77\nX = 01f269692c47a55242bb08731ff920f4915bfcecf4d4431a8b487c90d08565272c52ca90c47397f7604bc643982e34d05178e979c2cff7ea1b9eaec18d69ca7382de\nY = 00750bdd866fba3e92c29599c002ac6f9e2bf39af8521b7b133f70510e9918a94d3c279edec97ab75ecda95e3dd7861af84c543371c055dc74eeeff7061726818327\nDigest = c992314e8d282d10554b2e6e8769e8b10f85686cccafb30e7db62beaad080e0da6b5cf7cd1fc5614df56705fb1a841987cb950101e2f66d55f3a285fc75829ff\nK = 01b7519becd00d750459d63a72f13318b6ac61b8c8e7077cf9415c9b4b924f35514c9c28a0fae43d06e31c670a873716156aa7bc744577d62476e038b116576a9e53\nR = 0183bddb46c249e868ef231a1ebd85d0773bf8105a092ab7d884d677a1e9b7d6014d6358c09538a99d9dca8f36f163ac1827df420c3f9360cc66900a9737a7f756f3\nS = 00d05ee3e64bac4e56d9d8bd511c8a43941e953cba4e5d83c0553acb87091ff54f3aad4d69d9f15e520a2551cc14f2c86bb45513fef0295e381a7635486bd3917b50\n\nCurve = P-521\nPrivate = 01cba5d561bf18656991eba9a1dde8bde547885ea1f0abe7f2837e569ca52f53df5e64e4a547c4f26458b5d9626ed6d702e5ab1dd585cf36a0c84f768fac946cfd4c\nX = 012857c2244fa04db3b73db4847927db63cce2fa6cb22724466d3e20bc950a9250a15eafd99f236a801e5271e8f90d9e8a97f37c12f7da65bce8a2c93bcd25526205\nY = 00f394e37c17d5b8e35b488fa05a607dbc74264965043a1fb60e92edc212296ae72d7d6fe2e3457e67be853664e1da64f57e44bd259076b3bb2b06a2c604fea1be9d\nDigest = 6e14c91db5309a075fe69f6fe8ecd663a5ba7fab14770f96b05c22e1f631cde9e086c44335a25f63d5a43ddf57da899fcedbc4a3a4350ad2edd6f70c01bb051e\nK = 00e790238796fee7b5885dc0784c7041a4cc7ca4ba757d9f7906ad1fcbab5667e3734bc2309a48047442535ff89144b518f730ff55c0c67eeb4c880c2dfd2fb60d69\nR = 01d7ce382295a2a109064ea03f0ad8761dd60eefb9c207a20e3c5551e82ac6d2ee5922b3e9655a65ba6c359dcbf8fa843fbe87239a5c3e3eaecec0407d2fcdb687c2\nS = 0161963a6237b8955a8a756d8df5dbd303140bb90143b1da5f07b32f9cb64733dc6316080924733f1e2c81ade9d0be71b5b95b55666026a035a93ab3004d0bc0b19f\n\nCurve = P-521\nPrivate = 00972e7ff25adf8a032535e5b19463cfe306b90803bf27fabc6046ae0807d2312fbab85d1da61b80b2d5d48f4e5886f27fca050b84563aee1926ae6b2564cd756d63\nX = 01d7f1e9e610619daa9d2efa563610a371677fe8b58048fdc55a98a49970f6afa6649c516f9c72085ca3722aa595f45f2803402b01c832d28aac63d9941f1a25dfea\nY = 01571facce3fcfe733a8eef4e8305dfe99103a370f82b3f8d75085414f2592ad44969a2ef8196c8b9809f0eca2f7ddc71c47879e3f37a40b9fecf97992b97af29721\nDigest = 26b4f562053f7aed8b7268e95eff336ac80a448fae52329d2771b138c9c7f70de936ef54158446afa72b0a27c2a73ca45dfa38a2ba2bf323d31aba499651128f\nK = 00517f6e4002479dc89e8cbb55b7c426d128776ca82cf81be8c1da9557178783f40e3d047db7e77867f1af030a51de470ee3128c22e9c2d642d71e4904ab5a76edfa\nR = 01c3262a3a3fb74fa5124b71a6c7f7b7e6d56738eabaf7666b372b299b0c99ee8a16be3df88dd955de093fc8c049f76ee83a4138cee41e5fe94755d27a52ee44032f\nS = 0072fd88bb1684c4ca9531748dfce4c161037fcd6ae5c2803b7117fb60d3db5df7df380591aaf3073a3031306b76f062dcc547ded23f6690293c34a710e7e9a226c3\n\nCurve = P-521\nPrivate = 01f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da\nX = 009ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4\nY = 00bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e\nDigest = ea13b25b80ec89ffa649a00ce85a494892f9fb7389df56eed084d670efb020c05508ac3f04872843c92a67ee5ea02e0445dad8495cd823ca16f5510d5863002b\nK = 00ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8\nR = 00cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94\nS = 00097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f\n\n# The following tests exercise the bit-shifting case of ECDSA digest\n# truncation. The digests are larger than even SHA-512, but P-521 is the only\n# common prime-field curve. (This case typically comes up with curves over\n# GF(2^m).)\n\nCurve = P-521\nPrivate = 01f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da\nX = 009ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4\nY = 00bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e\nDigest = 007509d92dc07644ffd324d006742d24a4497cfdb9c4efab7768426b3877d810602a84561f82439421e49533f72f50170222ed6c24ae6c11e50b7aa886ac31801580\nK = 00ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8\nR = 00cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94\nS = 00097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f\n\nCurve = P-521\nPrivate = 01f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da\nX = 009ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4\nY = 00bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e\nDigest = 007509d92dc07644ffd324d006742d24a4497cfdb9c4efab7768426b3877d810602a84561f82439421e49533f72f50170222ed6c24ae6c11e50b7aa886ac318015ff\nK = 00ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8\nR = 00cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94\nS = 00097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f\n\nCurve = P-521\nPrivate = 01f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da\nX = 009ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4\nY = 00bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e\nDigest = 007509d92dc07644ffd324d006742d24a4497cfdb9c4efab7768426b3877d810602a84561f82439421e49533f72f50170222ed6c24ae6c11e50b7aa886ac318015ffffffffffff\nK = 00ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8\nR = ",
     "00cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94\nS = 00097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f\n\n\n# The following tests use digests equal to the order and 2^n - 1, where n is\n# the number of bits in the order. This is to test the truncated digest not\n# being fully reduced.\n\nCurve = P-224\nPrivate = a80489eee3b15dedbc2d8ca4134f18b7d1a541fc212718f21a04692c\nX = bd283d0c18d90b69d9ee3e0f1e8e62f53822f5593fc94343666495b5\nY = b3177709b8dc4b62928f9dc561c2b4be42c7df52d4e90e7e885b4021\nDigest = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\nK = 90fbb04276d112cbb6ecd2053e2a870f02350ac7e2881c89851a4640\nR = 7d0642a2cb98b56ff91837bd23e20bd90b60613b60eabfbc078cfbfa\nS = 0209a75bbd6c2310fa55fe2c0c3ddf35be53fef6e1cccf0537f3e7be\n\nCurve = P-224\nPrivate = 72a2e505634a669d492d28b1b43974cca3aac7b5eaffa1719a551d3e\nX = 42bafdd82b5bd766a727211e4af8bf46015705b878772b296791cca3\nY = f5db26e760f4b2ec586222d3cecb525fed32a841fa0ae547f5c435db\nDigest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nK = d6abc49b0e60f1e2e7a5736aa8e93a5de9777f4b9e6c96692fcb662b\nR = 42232b212356d9adbb5e43e96e23c376fa5d21c9ad6a50137d2e3bd2\nS = 020596ef40a9dbea4d6779ff02c9cb853b520093113a968a32309118\n\nCurve = P-256\nPrivate = fb801b1a1161c143578358dc6edf8357167c12636e5b588e171d8bffcca78d7a\nX = e57231383637c82c1ac801724cf7e03e67198f467a9beb60ac13cb582d13afa8\nY = 8f190e090155fcf63810b858bc88e259dc49afef8bdef6fd06d93dddb1991aed\nDigest = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\nK = 3d1df8b364fc045d8c6517f7a4b99c91643a2bca351b3a74fe36268c97198c3e\nR = 05cc6037bb021f4910ea2e489fab2bae6bb6a2769a97f42ba5736994102b7f10\nS = 5db54832ceabf8bccdb8be99b1a49cecff8feee045cb697dec43118e2695b1da\n\nCurve = P-256\nPrivate = df1ae1f7a1043d03811c61695dba0350bbe58d36a670da66d58c69e5bc9ce1fd\nX = 6e0e2897b9a554ee287cdaf43bfbe25ca8404373971575a0e4b61c61aff5a2fe\nY = 23ea7823a411eb1b39f81bbde24c2cd6ac68be2c7eec3a0671c8676131b8905c\nDigest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nK = 6b6e0cf93ce4482a4c23821125186f39656ccc993e4f080ac8750c32927a515f\nR = 16831feeceab2fab1c575e073e944d73ce7e6f3e9b06312088f06159c530ff50\nS = 870cb824692638538b1569c6093fcb693c054e8e3b9a919e3bb26798910f66e9\n\nCurve = P-384\nPrivate = 2218a70d35d5a9eb16442eee8e74a8b992d9475edadd6b814ae6c8779b32df164553546bf3405bd5242b85092e2f0098\nX = f4a961c19f9cc4ebe4f43081110955f3cede085a08c1415d726e80b2eb774028c5fc96f092ba3ea7d1288dd57fe1db08\nY = 981398eed0895e09b3b582a0616f3024e51cca7b1ecc347dbf0d24a5f6a222b0c31912f8f5e427d4dde5c6c45212bb10\nDigest = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\nK = 118f1682e0dc4602fc6f142f98d48e36adf32566f34be311ca55ccbe00fec28e52d72857e02f139578316a5dbe1ed9b4\nR = 0b77eaff05bbd922dd80525d2ab301cc119318f5a920a12c71c4b5ff5bb77d25a538983df9bdd5984b0d159daf21f1a2\nS = 73af85ad03a34b6b3993082bf719018d25d1555717b2d2f2535d0601af06a71ad020eff8232d065ab9d7fc4cd0c0ee42\n\nCurve = P-384\nPrivate = fae6a843fcef48d15685766d189fe1f597cd85d4e07172c8e19589e1aa2e8e8c4b75731e9afccb7b585926934583829b\nX = 54dd8d7cbf2ccdf1a42f5bbc615a372803b094f6040e3c7b651a61bc6912432c836cf2410ab7d67f543236751d81066f\nY = 2219d6257b1c80bf327c96786f2b5d0b5a9b9bf7eee9c853bf66a3bf09520494cb1f7823e4c566d79a617b7e201ead96\nDigest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nK = b7db03d70db5cdcce3c708e55ad88eba80e90f6bb0be3713686bf298709a8b326619c1d47318f9af60039ff051f33a1e\nR = 9d923e199d98272e44b8fba382bf3c19660ecb4a9aae3513ff6802a73fef510c15c202807c3f9334b0bce7d6c6a80839\nS = 520784e6290d04d9b61993ee5ebc6fa8ff527fb0777c43cdefc7586701e60edb399005a5648ff852de80208232849fbd\n\nCurve = P-521\nPrivate = 015a5274c44e51b3cce4b1d657186871a851747e086934cb132559d83e07b3b2544c5d62b26385272101e20f963d2df6e029d6a6818cc4839c3f28a4c384dff4befa\nX = 00056cc489982829b728978193d047596325a91ee2e2c9110f7da605fd2d1b78424e87d85500f391fe9f54209c42e582ca3284484afc6edfe2acdc69c3591f6c47cf\nY = 010e91be6632da7afd03caedebdb572fd41cb1a7221e9c2d984016bac4693b3d10c5b1d76ba32b89f5fadd157df122be9cd85151977b99176998cfccbd3f9a03ba3f\nDigest = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\nK = 001441599703e14eca10a787dd421c334bdd4c91ad33d05fe2929100a5eb343df47fb28236423323e769ad1cbaffc6e9ad01a06b2e401d647511ad2e920c2145262d\nR = 00bd5e59a9bc97de61588d143990ad7fd5405ac53aa8e6332a085a301138b23beaba126b41549db1167df47362a9de77c73b1bfaa14b31114644b4db8d35179f706a\nS = 000cbb560f68b7240e309301ed4e6dc20d329f7e2098bcae26a07dd364e6177bb408eb5d0b47a3fcf36def98b951af9a55a47d24d95cd66cc11973269694e2f6f8d1\n\nCurve = P-521\nPrivate = 00cfac6f8a1906241d873da27b4166e0d0bd76c511177835d0978117056db44750eb0648e6899f215e6c0dd6902c114a802ed5935df8c54290fbfe184ff8ccae444e\nX = 002aca58eeac43152b292f42a6a677d327386337409ba7de17acae1978e097f21e49d47f707c6ed6045c66551c93df9ef9bcc442db804e62fcac9f0574876d6d7fea\nY = 01862ed4f9d235afcc4e6b45e491da363104d4db7b97f12d869c40ab09a3c8c72519a9712ca733ddf046ad039842e8caed2425ecaf42d5171b3e236c11fee8699684\nDigest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nK = 00938d2f6550a46fb07b058e6287f428f0ff12aa6732a666d4a6cf2dd7cd8023ca76d0ce4e16b62830d0ff9e2fab9987261f3f3ffe0749ff70950d91b897d57007b2\nR = 00ec0b91fa4386a8acdc0e46dd9c1d1775abbe0da8ead424aa4ace58e284a5be00e2c1ef95b6f4d861615564e1e7305656567f95275ce63b534420eae77ec37492c2\nS = 01e1099fb389db498ab4cf23b4f06a74b9326878ae3c76ea13832e50702b30fe8303093a59cc9a0995f1dfc15e6f7dabca8a2acaf03ec005447d29fb429a252064ec\n",
 };
-static const size_t kLen45 = 170210;
+static const size_t kLen46 = 170210;
 
-static const char *kData45[] = {
+static const char *kData46[] = {
     "# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Verification Test\n# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip\n#\n# NIST's files provide message and digest pairs. Since this is a low-level test,\n# the digests have been extracted. P-521 test vectors were fixed to have the\n# right number of leading zeros.\n\nCurve = P-224\nX = a100d410ce497e991070285c439cd361a1a9c6c973fd6f5e1ba9ec66\nY = 0a8c3a2f909f212c84441b8c0030529cbd731304d86f771d89d7cc29\nDigest = 6a02c84186eb132d8e91ab6fea2e066f6f8de1a5\nR = 1bfcaab01e47addd4733369320364ad208169ffb15e6aac33c2d7c06\nS = 07fb33465e7b7b373feda2ea35ab7cc9477156a1335ecad942f99627\n\nCurve = P-224\nX = a6cd3d14cd5eb188a9f59d9c32e93d890558de382f6fba5ff5c6e395\nY = 7a76734a0afead9e5e4aba65f1ae353d6445b1689b5ea402de5f9af9\nDigest = ab1205b7f9f591a013c70cb645435b38689644c1\nR = f0f670963c3d2a3281d639f850f3781c6402d99a1bf07cd9f35b2975\nS = 758e84920c1b744502cd787cdd64ec58364ccc6917258a2580097492\nInvalid =\n\nCurve = P-224\nX = f5fe7875a517207f1336ec2bb4fe5cc7eb80ee2b0f8ebeff4c56e620\nY = 0b7ac24ea9092d03b28904d89714b517be023235abc9cffa297cf4ad\nDigest = d62c7a42fcf3738276a6e0d27160328e9f27e5aa\nR = 88617e694e361d2cfef6b0658d444607fba030ad31fe8dead14db22e\nS = 5b0bf37c4a583dd75d99aec20943ea02617cecdbcd295d35ed01cc32\nInvalid =\n\nCurve = P-224\nX = 8a6a77179ffc0ff5d412cf859cc82aa19cd18e5224ab997e9c2e46b0\nY = 3d67c177ca7cc12c7b05a3bf55fb78549ef5400a566efe8ae3580c9f\nDigest = 0b5a025a4038b6f9f995001c0b8d7a660e6766c2\nR = 107b7442e6569ddde54b5da55a9dac9bd348079358047a19a3de0b91\nS = 92359be39353cb263946294fb728eecf1880f50a43637f391d3e7824\n\nCurve = P-224\nX = f9f23388d573562f29e7e7c9a98f27e7a1ff02d2d66e177c6506466f\nY = 4545937caf1878fbacc34ca38a0e5e1f6ad2b25ddd796d06c8d12351\nDigest = cf670c7589b91dac6a131fe2e863e86ee790ca75\nR = bc1db32e437c67439c27db1dc607e3c505210c984bf707a8e87abb70\nS = b760f4943a2397311e54e888a1ad379ad9c45d1fd09b5389ce1a00ee\nInvalid =\n\nCurve = P-224\nX = 8781e5a98950092570d685964e9ed27760fb7dcff8d3b6f3c8f77151\nY = 9207cef64b7c2ed181c57337001f45f1e800e0d1bc8adac296e454b5\nDigest = e5e5e8c8b3f7146c72ef86ca1b75f422181b5729\nR = 79826ae5b0297b9404829df0f02bbb7b8acb35459e13a4045c40f242\nS = 2a629dab19c9e5cd0a551a43851fe6d8409469f86cbcf6204b41e5b5\nInvalid =\n\nCurve = P-224\nX = 03c78c532b8767784fd45e75027abce3371181f8f54914811588cbb2\nY = 166c7b70e98fa11ac361d827557676ec07e553370a462b4fe502dedb\nDigest = 270606c9c9b136ffada9588f15f9786455369422\nR = ff18b493b166d832c9c25ee491525e4c188ff2b804e38b5964941c48\nS = bbf4291db484b4e4143c01a284c03543bbdaa2db1f1c571f1e5a5e2e\nInvalid =\n\nCurve = P-224\nX = 99fab11464484cee96d72dfcf0327d671787a2f6ee32f9b184c48fec\nY = fe8ec3d660cfa3f3e09e5cfc2c3298d4de2f464416deb5b4a27ac062\nDigest = 9c77c796ba619aedef68b2d30b4ba00c4972488b\nR = 714c48c143cb259408c04f77a38d6484e788cb268fc9789d5e871491\nS = 542793d5dbcabcebc83a809cca02b8e95189c93fa4e330d66d5a62ef\nInvalid =\n\nCurve = P-224\nX = 014e8e57388eba32ebdce80df60c481e5c7758374f90a92e0a82f1b9\nY = d1aa8418f992283c5b6bb0461f05dc9103050dc55e0265e1c99b935d\nDigest = 82b45d1fb3bb502c7c20ee1e2d63f2aaa9f492ab\nR = a159b83e80e656f54f614e8437821bd87f6f13264ac8eca1b3ddde29\nS = b77b7bc8cf374f012ee15f9f9224a46a560a5b689cfc92ca4fa03459\nInvalid =\n\nCurve = P-224\nX = e0b9e3cadca81311923d6d6adcfc326b62fac9c4b8d61c5f960c88fa\nY = be505338108f8d3f0ee80aefa304d51dd4a4035477934a98a6111403\nDigest = f4da99fee346e572906e6dc8083a3d0c2e09b773\nR = 8dba585dc3312056a7be61161c7af8ba8b538f0c125c80cf9af2682e\nS = 1b5b1adac4d66c7045f3f79c3aa154a0274c4a994ac7a093e2482eeb\nInvalid =\n\nCurve = P-224\nX = 29197e94a3617e62d9999c859640871a4537a073ca4f12a4c324dcad\nY = fe198969ac7cbe49df2c61c4cc6fa502c2207a7da10acdccec7b1cad\nDigest = 58fab970cb7c1f0dac21b7c7fd67d0ad169688a1\nR = 261670b09afaeee71c590c5658e3f57d859b18a887f70fdeb90e57ea\nS = d1d12c11cf7f4a9dd015ead4bd245793cb37ffee1f4cf109b7b68394\nInvalid =\n\nCurve = P-224\nX = 0fac352c1c444435e6aeb1d60f28ac773b0170ae902afb0944ef0a12\nY = ac3ca693a7c5347a074808b43edea94059e2b1d0571d935fde3f5841\nDigest = 4b69dbfac12f1b974566d8170d1672d0f5fc0506\nR = c33c7a4de313ff856d2f51cd9e3d173bd10668c296f0e6b208c036ef\nS = e562d30822b5cc69713a57ce8c70f83827add85a06c88109505ebf7a\nInvalid =\n\nCurve = P-224\nX = b0d4298e998b7d9d4509322a1ac974c6180956533debafd3d9e7f2fc\nY = 185a64ca840d4b6a2800e72433f26dd523f97daadc18d6d01533f0ad\nDigest = b84805c37e76e530729ddcb59a68ad69d40c82f9\nR = a5155ce53050cbfe84b67d62ce118c6004564087f2fe1cdf44e9c945\nS = b6894b050d77a3ff4d191ddc0c9fc7009a7472e31739949193d7cceb\nInvalid =\n\nCurve = P-224\nX = 59996a4a06658e553fc2993f0f55e3fc8ca2cb52d30f882a37729be4\nY = a5f68f26ea6608fd1f350d8da7c187c7e70f23363177a5aa41508fce\nDigest = ef0a69578d8a1dc930803a7ad2a92c3c19ab6513\nR = 704ef49e0a43c61ef5b325899acb9d12287883a849976c8b9c950634\nS = 73da6e3a26d5c512405fc09fcfdf650dd8da748e6c3dfc05032d7a9f\n\nCurve = P-224\nX = a0cfdfc5a096b0b23ba6748ebaad17e60228b204aebdc01057a7154b\nY = 9f6bd5369d21d88d7b5c3ce221af530fb9a8fb91e751cdb855ff32a6\nDigest = b05f0232e6d44151e249e7b75c7c9ab05c14d44b\nR = d68aa9048e84b8653b8ff3ab31bc73884c6ac7df1fd1bd3c38c16b0d\nS = 38ce58afe5fbc6af892e06a4ddd978c745d5ec700cab825c11dd8fd1\nInvalid =\n\nCurve = P-224\nX = f1eb36b3e1c96a18d87878d5fa8b79d77afce9d2ce40d26199f33482\nY = ae819af474f3efbd62401a407036505c5a2d60449274593865de3374\nDigest = 1dd27c95dd6fb3f080afebdf5a1ad906502e12ab8f64e5f38f67c386\nR = 003122e976bac378c06ec95fd73290b067e7ff022d23493c40663ec9\nS = b99eb4220146a282c7a34f98a9a4fa38ed3f48ca2c7983cde2d3235f\n\nCurve = P-224\nX = 3bdcc7c6112cde3c0522f1a4863f1d7b6727c5bff67598ba2f1bafc1\nY = 47acb6b254e0e8747e0039de471d0dda443cb09a592c678717d83200\nDigest = 19b39292f4e862ed3ee90c35e709587231191632dc8b35611dd24abe\nR = a5aab7768f549f8fe3c7e650154c865b71ea5089bd6303bfdfd19316\nS = ee4989c4b96bcc802464fe44b2adeb1b3506755a3f4fb3f9252bf21b\nInvalid =\n\nCurve = P-224\nX = 6d5bacf458cee3ded627d0ff14fd2aeb54fe1455d6daaf7bb43faeea\nY = caecc8d3967ca1c8889607e9ed975b8a335a17c0acbcfbfed721ee1c\nDigest = 328ab7d2a7c56d09cb72cedaacc23a6da46d5cf984dfdfd16af60964\nR = 80e7024bf30ecddf7a658785ae51cd6e5a23963c89ee96a82346d889\nS = 561252dc8d9280fc54da0046da494fa5e4b7aed213923e8b894a1ae3\nInvalid =\n\nCurve = P-224\nX = 7f9789c729355516588a5c75cb2cbcf85a14c35e14a5d03b4ef920d7\nY = 49e95c49e62dd20f02ed16594f35ebf3415ed50e6efdc0c548101a9d\nDigest = c5bb2d7ca9b37af1f4bb572ae6b6e69e8fcab9ac1cc5a6e1b6d1f8de\nR = 3c7b664413c2a0e4682a9d1c88243a96196fbd03f72cb873b9bee8b9\nS = 8f7f81ee9d3a2660ab1d666bac6cc434143ca9b04ff638ca7b4aa1ea\n\nCurve = P-224\nX = fd3efc7108edbe155adcd8686d8605e811fa79756c7e2dc8c1c04212\nY = 59edea73a4e5f91541fb4cabce539afffa85b6b0113289f049ce60a0\nDigest = 562d1a8fa642dd8bbb4f4801f2d9fc8cf3452be916c0ecd6c8ddc4fc\nR = 4907884b8b7d0eb9a7b24420f69c58e3a17314e101da0280c0ceb130\nS = f7629bed92e5c40f35d7731912fb45a3cee06eab3d409a62997f2282\nInvalid =\n\nCurve = P-224\nX = 8b3f3e31d9c8408a39997455ffe0240fe128a5f1be9b3a33a97b0910\nY = d74ac6ad8de2407887c335bd66f684454dee175a2af713bb334cb3fe\nDigest = b57ffce01c72221c6714e4a38c76746c45a8cc685f37c55a69f6773f\nR = d28ae763c22f50ae9ee9fbe5bab682fd8d820b99ab70677cc46624f7\nS = d9fa54d0300a6ac74936e7a47fbacadcbb4b25ae3a5b550aaf53991f\nInvalid =\n\nCurve = P-224\nX = f4fd02f3d224727e156a2cd7543483f3e35eb65219e32c7923f93ecf\nY = e7aa734828ef326259f98e0e8c3f30b62bd3295c6d1af2c429a087f6\nDigest = 8e70efc206d69d1bd1dce263a29a56030ad5602046bc61848899474d\nR = 9f57e28f69d2ebd96f6d98903156a4e795730e09fb67963771b0a851\nS = 8cfe716488479e04500c8eccdc86fdd54ff00258639f7177169e2030\nInvalid =\n\nCurve = P-224\nX = 0fdb8faf52d8f46229cca1e0f22e869a91bd56eb6dccc547151f9c68\nY = 96c8d1946528bdd2c14c3a0a9c17a088d3f0599752d095ba9de9ffa6\nDigest = db452771046d4b64ba673771b49df905881df9c4b6a1292a11f87515\nR = c53c0ce7d408278552a5fe5854c05641cbe93b1dc18eff1c68af53c1\nS = be7453a12693ce7812fe58746323882bc14eff972480b49431cb10b3\nInvalid =\n\nCurve = P-224\nX = 240431da69703b32ba2ae501d2458b355b66170725806b45996db195\nY = 13beb5198ee00abdcfb2cc5454416d4f7c795e97a14bd93cec3f0a56\nDigest = 3598d7d7b2cd9e482fd3bbebb9ae4549a4b452c81b89f3da6f6f2e85\nR = ad03bdf64e3450407a2a977e1985853d6ea41568c3a394d696de6739\nS = 7b55db9abf2045e2dc7ccfa2e8fb501883c494662d400590c74d100f\nInvalid =\n\nCurve = P-224\nX = 8c80c86f91b1e330f86f5177fdba839e625a27e8531f232efb10a484\nY = a24deab897",
     "8dfe7398f7a1da0633ff7cf5aa7b7365ce2d840ce81c80\nDigest = 44603667b2251cf051cd67b927714d67a25295679d884c4b79099a80\nR = 0c422b292308f31af78b1261d12765cced1cf96a83a6bc3bd90330fc\nS = db34f4462d0bb1927cc99273dc92d3fe654c85a3b53c6d74ed900621\nInvalid =\n\nCurve = P-224\nX = 3a5d1b7ee6749630c9619789b256f6bad5bc4b09950cd53b78d5ef30\nY = e85c7ee707df680eeb5fd78451f7302ae653f96721443826096f62a3\nDigest = 2ed9e7077df2ca2f8a96dfea2127b1b34147fcf963f9d73e8aff9df6\nR = 671ad280609364b0e26c92b13891f677db7c83499d0a3d7b6d80affa\nS = 7c4b9c5a3937d540ed8bd59e340c13f02313445e06b2bf7525f5726a\nInvalid =\n\nCurve = P-224\nX = 350f59509abc9f7f9b35a8b80065258727a8ffc27e6dac635ed68900\nY = 634fceae493b200cc7680297fd940dd86a5111da14bed68c797ef254\nDigest = 012a6edb0064f2b734b0297ab924efcb0e653be9e6ae97c371d59680\nR = 13a302b200555a0e80584e6ede32c0f9c5a199125b219c3e8d0fbf96\nS = 13f1d7b0c87acea6290cd9d36f1820f546f83dd8d7d9abe9da5812a9\nInvalid =\n\nCurve = P-224\nX = 1fdb820003a2fe61deef2b68b92ac711abc76200c534ec3abc99a187\nY = 32f87d0554b6b5e389311fd3c86825fcd42654a0b6f5d4d5ba73031b\nDigest = 2afe40d5042eb4020b14053e9ead6774d566e0b536912b7de4450090\nR = c03e551abcb12eadbc291b2d5fdd53bf725b785933e0766969f0355e\nS = 94826a8753cb949e0199be3220b4f90318f1c835cdd67efc50df7fbd\n\nCurve = P-224\nX = 208dcc6c87e7c38bd914bc9b350602ff62ac62fa4fd633c1af5b8cd7\nY = 0263587c7692c8be1f78de88ed6dc99ce1198ecc53a77ae6cf98a323\nDigest = 3f95e73294defecfc125a2dbbf322d31f323c030adf244c07a7c8746\nR = c12d3b396e1a894dfe4a28971ce4983547596879956504e1a3aed75c\nS = 067b729ca23be6cd520fbe9b972b9bb3d00c9ee96832a5c35e20e0e0\nInvalid =\n\nCurve = P-224\nX = a66a652fa36413dccd72c83febedda051182dc5758a1466366197f5f\nY = dc813a79e0fc647d8892dcf4f2132c90914a520cbbad65f458ee0fae\nDigest = 8a8942761ccd4ac7c88c4afcb6bc69d431cc3d10e6ad7a2b8610892f\nR = 809d1b4557eaf36b6eab3449dad56e61d572bd8b63d51b63af1b0bc6\nS = 8bf88226a463606ab57c27ed78f1b71ccd61732fa58b62ee845fd3dd\nInvalid =\n\nCurve = P-224\nX = 8856fb8b81a4eacd971a954560018f33cbb71cc1fc243d03f63cabcb\nY = 28afa26baf31b4d89de1dadd2289006f836f23a11383817ec7e4e799\nDigest = d8454640ad1f4632cc667823418ae56c62028825d727adfc84afdb0842b0c9a4\nR = efccef331805e71bbf876cbbc2342a6bc4508aea7c691029c8396aef\nS = bed544d09e28dbf01a30b2cfb61b98ad6201a9818f22b4f543f3e7f5\nInvalid =\n\nCurve = P-224\nX = 34c5ff3de565b85bfdd9f0a8b3fb0d46f924c57b276bcc830a1ed580\nY = 609d22200ef38b410da77f7a8ff2f58448188042978fd9ae1b2b4477\nDigest = 831979405db4eb9dadf01249fa15f68d4846e0ece70a320d3022f75f3dc281cc\nR = f0138024fe0516738f3bd0e0fec10defaca8c3b89c161a77489cf2b7\nS = 4ae0934266d9e3d64c2a12f546b132ba0f33ef50abc90e7ef5974805\n\nCurve = P-224\nX = 465afb14f4bf85022ac1f635f46c0b2f6548bace9352d32f74eab012\nY = 036371a3246dbf1069d2d268ca431553d1f2bf0181225145881b7be0\nDigest = 489cd3c10d94f7f284bc4ea472634a5d7f0d280d5abbf139c110ef80c8bf463f\nR = 9bcd57a2fec2518903e4b13dc0a7b84bafed5c4908546e94ffae87ed\nS = a337e06582f6b3973df38b93a0fb2a63f7774b62db50dba557e5cfcc\nInvalid =\n\nCurve = P-224\nX = b8b7f923c05ec95ebd484db7c58d219cfd26ee6b66149631f25ffe4c\nY = 6bda5f4f988784555a80b5494eca51ad2c7f88ce94d2090ee0c76fba\nDigest = b100feed0121d9d0471e5bd94a659510c2f84e313f476431deac17ca6d87bd79\nR = ce4d86bf5a7543d1cba8e4470a297e9a48d0096d7788c6284b1c0af3\nS = 229eb0636ee62508ce3719396d7577ed892cec70a66857fdee0d1fa0\nInvalid =\n\nCurve = P-224\nX = 13e84ec2eb993818d7d78330855ee2fbe8ddb548a5e4198e2087b3b2\nY = c95dff249e10c506fb547a92ade53c61ddbb667c760e4127a1a7f806\nDigest = 21a9f65d4cdcc287e0bf330e4f76f1168d16d0cea796dd6c0e13cd2837decaf1\nR = ed26f00ed696e114305c546ed04db5fc35efa43059c0d8bbcd418d0c\nS = 6e16efbe9501e3055d74966a49232cd76b5d1241468788b4cc7378b4\nInvalid =\n\nCurve = P-224\nX = 16c23c93699cf665a5da8b2d4baa72c36158d3433b1b945e47204b0d\nY = 12023703e1b59ec9054ff22d15567b9f74058b47cc13f2ca08ab77c1\nDigest = d62496d0ee0453e7f13f8d9c57adcd33442a5365f626381ed665f95f528aa198\nR = ada849b673a1bd2949a8b4d8fdfc239ec53524a356d37da3c9d17ae2\nS = 698de3a3d8697c2e8e5b2c85fceb8796750c5b44154f01ce86d99e24\nInvalid =\n\nCurve = P-224\nX = a580f9a0cd15abff8e1e712f16b0fd4142d0d773af3c657abc06c2a6\nY = 22c6286340dc072e64274209eda60503047700571caee64b4a2306c2\nDigest = 25ef291dd6a2047ea193f8aedd3f4692f2c135cb519922a17cba3e969423b030\nR = c6fae06274dc052e482102520b49d4ccc4cb7eb8a3ea41bd3680ddad\nS = 50d66b75a2bbd0468be1f9e61bfda85b6329505b0134d60846cbe4b7\n\nCurve = P-224\nX = 0b4fb6fe5f6cf6adc7d28683628d4b9c569d21d2397533f5bd121a23\nY = b44d60a3414b9b7b6e4ad735ce2f9cb05593b0874ada5e65acdead4c\nDigest = 7d53ebba0424c4b6731806407f97af4af863a5a87c759626830c9e8753ca50fe\nR = ab5ac2039b49690c6436793decb1a6a58ac34833a8091005312a93a7\nS = 98fe955cd836501cef78c7a05fa27edf2fb3afea80990028ff64e984\nInvalid =\n\nCurve = P-224\nX = bae2b3634c7854c932551ece8dced2139a51705059503881a9239c78\nY = 094d5e455bc9296202618d7022512b0f9ce53d796c7294e6eb076a29\nDigest = bb5c0917ec5376b2c685f3a530a9f8ef1ef1c1b398ab66f479d936cd662efc1b\nR = 2fbdc7e9e98aed5dbbcc5b034e17a95209e2fe1b01515426b8b372c3\nS = f2b19226528f10be6ef0d27ec3703db690261206b7e42f93a691192e\nInvalid =\n\nCurve = P-224\nX = 49d9ff4f4bbd4320b6806a7fbaaedd962283c766a6c130e4b62139dc\nY = 06dbe8e7fb8fccf9758101ae46939c6fd4d3afc526ba6c8156c6b013\nDigest = 9a113d3d73543e17faba847981e0b7fbc5647e547bfc989921ddc987133692d1\nR = 2d83aa59bcfc8a0237884826e08dbd78a56733598e379f2a9d51e9e2\nS = 485036c74618d0e665775fbe2d614a313c550f9826b955d3e5636fd1\nInvalid =\n\nCurve = P-224\nX = 78451cca49655978b65d8ddd45ff367c47f321f5d55ddac7969ab82b\nY = 25b77f820aa9ec93ec89d7fc84285f3f3deed496e0cd3fb9ee4a5c99\nDigest = 352afd36279bee1ef5727c55c7428bb79db949a9f1953eb98cfd38c4a4a458af\nR = 998789490e008ed11febdfe2981a55c733eb9739d7f37fd5c2a7ec96\nS = c3ec8afade81860ff23cc1e7d759d32d9a5775886ef17bfb719df4aa\nInvalid =\n\nCurve = P-224\nX = 18ced60b7fd9ebf76c3aa5976dcbdef40bd3e36033c013553043dd84\nY = 30398582dbd2004064f8055e7fe0fe8df11b2c9d9e2931ad12d09628\nDigest = a1e3668af6307f6a2b7414079e73308ee0836b588b92a48bd5baa9a62f45b0f8\nR = f880143960e812464810c175001b5d39592fe63aab544deb9ca301a0\nS = 1e0657df071a25dd791264b411c8964688f4fe17ce024e659836ebe1\nInvalid =\n\nCurve = P-224\nX = 5d67c1fca848ba7f3d9de5b1894d3993ac4ebe68cdb0b49553b3b0e9\nY = 07c219a8323273c81f5694306d0dd1d133a49efce5003bc90f05578f\nDigest = e8f714f901cd2390c66f9fa9cb81ecc5f17a82bd934cf19c5ce2bcbd3a985de9\nR = 767cb6b2efa7a40739830659b0cc24fe3de771d00104b3dcc0f640bc\nS = f2e7268bc011d79d33f3551d2edd3c95f324955479b8e29e8aba629b\n\nCurve = P-224\nX = eac72b399cb791b3ed25cb0a49eb157e69603197e0327eac5448680d\nY = bdab3a2270066e74e8210eed7b5d43fba1e26845b6c037a8a7e2a13b\nDigest = 74aa7c8f25644514582fa904cea1ea88a0b262ffca43cdf6536ad97d8550616e\nR = 55485947e9e3c194a29c8ecaddb18eefd16fb6919aeb0bbbd8c12369\nS = 6309a2cc7fdd9eccb32b86d5577aa54ada79899a9645f2e299630d31\nInvalid =\n\nCurve = P-224\nX = 17f741267bf3e8143046707d41eafc9555953fe5f57d6c035452b232\nY = c667554d9a55fc8ab1062203dcbcd2bf9769c696a295350cb28aa01a\nDigest = 3b997a1c220593cab4301e07886db745436911b8abfd9d1b03cc12e1c7fa4510\nR = 57408bfcc68e60ad000eddbfe6eccbe5f87b98c95de0e0a2e065da92\nS = 51249bddc149f0942be001b2f3d6f6d17a0cc36fefce147058944667\nInvalid =\n\nCurve = P-224\nX = 3297edac34cb802df263f8d366f62a8b746c316adfb1c84a1c79c58c\nY = 79fe82e87ef5879c12eda6adda198a662fd77afa6a1fb5696cb7da9d\nDigest = e71dc3ab7ce73995d053bc6361bbb3f20e39ec2f295d97fa2bd229ed31a56dde6bf2c9cf6b0a9cc7e65962c57f3662a3\nR = 9993defdcf83965723c03e04ce6c33b3972cef3c449cdf1bc69990db\nS = 553b22a4164549f16aa1a928eee74548fc141fd3c16f213318965974\n\nCurve = P-224\nX = 2bc010527ea7427cedd213aeccf0c62dc513785888c6373740139d8b\nY = 2e9eb7ddf027ff7678ca880511be147098b34d8e77acb4389fbc6e50\nDigest = 781195b6396344146fe8b73a2526b4b1c981d26b9adcce0123176be1239f798c847495fd714661d1ba8e41f2ccfd052b\nR = 70a7cb04295a53b4a3a695ccb5d87856fe9152fce11987d4c43207bd\nS = 49f4094368f2de9327ca2913ef940e17c5801e8f589413838831083f\nInvalid =\n\nCurve = P-224\nX = 55c6217adbefff6e21bfb5d1b75213ce7b20c900d514ee094f27ad0d\nY = a68ae9f86eb9c10de3e7d9b03868518f33f571f85c3529d2902575d3\nDigest = a318b24bbb5ba46e6656f8ad68201c024e7b3b3849d6a70f3abce8c20f5b98ae43a326f5f48994045f0ff27098837b5b\nR = c073fba87267b45853e693910c1de791908ca7a25c1716ec2d3cec71\nS = 6138c86daf1021ae4af0faaf0abd5958f93944d5b0d82c40214bacca\nInvalid =\n\nCurve = P-224\nX = 4d0cab0dae88fa0cf53a2a6562934e0cf",
     "0271cc7fe54a30109a232be\nY = 70835833cf9e1f989a18d419e7bee9eb5cef1fd145cf62c4411c372c\nDigest = 6abbf2557f2e9b4e020126f4a87fb0262a1ec59bd3b569581048c5692f8a1cd381ee9c3cf195fa1a362a87ab604d79b3\nR = 3b8548eab4dc123e236133d826f2badbde96f92249f456e33ccc9739\nS = c82b2e41b9e2b21594cc03b1c0de216f183403c6025e18bb29bff421\n\nCurve = P-224\nX = f55a53b818b3ec4b4402a2c63429c1d78f2cd0d8d202e33812878a03\nY = 5a2b1a00615c56b4313828bd70526b12f402df1d40fa4900c994af8b\nDigest = da8d2571bea9840494a41f03c6c357410de030a7b5c023a0487020bb5b7c45fb6c5ed0e3dc66e4c0ab8460d9bda68c94\nR = fa934f9fdb765fabb5693ccb1de4177f172a8de108805a48f4bb989c\nS = 12994f2a26252742667044a01b509b0f315e8141629f760267b850e1\nInvalid =\n\nCurve = P-224\nX = 40a5c52dda7de858a2c17d12856c552ab820023336b9b4fc196bcd67\nY = 301e5368f59c00f15e6f3a91510444fb75a4ead8efb0778b4419e7db\nDigest = 0f88ea2d9dd40c19cd31c7a7cff71379431c9dc0a3092041a5fcbd2c20a05a8cb6e5a8aa143f1dfa169d2eaf87d01e26\nR = 0fd8773fac425a2761b954c946020615336d3e350ae40743641917fe\nS = d59f2b806ccecc444f9387f511c7f9926fe7f045c0ea633a51b7db47\nInvalid =\n\nCurve = P-224\nX = 372a134eec0dae3322de8836b89dde11a69e0379a60b10343abd478c\nY = 65921970ca8cf5a75f044db0e29802afe1726d18b3e07b61c768c242\nDigest = 1547d49d33566f8c05f68b9a980e113f919bbdef8d6d53046456a2c2ebe27ad86eaa52d05677fadd5ccc3e84b04c0f94\nR = be6474845a42fd4e85b91238f1e3ba11cc88e216d295c1b07d855987\nS = 2724242ffb5775f614ee06eaa4c985358f64869ce4ae4bfb16b5271d\nInvalid =\n\nCurve = P-224\nX = 9ad2cee0d92b00b11157a18fcd752f43e772ede7a46475a50e7ad8d2\nY = a6edfae6c5589dc0db6353b8655fe3b0f7dab2aa8400cbbd72d1a572\nDigest = 60942be3ff8d2370481b04fa07743482e08a61d3724010d7edd49bcf12e1463ae059696c825ac0505f079625b95310a1\nR = c31a40b6c245572457a19efac0da0db22b2a0818de716b6fdc5bdb32\nS = ed8204de94f1d92ae3fa6e10c727eea38d0e12b58133fda1a15559bb\nInvalid =\n\nCurve = P-224\nX = ed071a20d76f81c776875f8d3307841d33b70523ea40abd691d55d21\nY = 34ca47d8ba0a984d0d728c4d8c6b9aacdded03c6070616680aac162c\nDigest = e0776a80c616b8e596bacb0391a19956b2f0e2c566c50dd2ba99f9e59ff3dfa6197622c2a64cb4d02780a39c68d249e0\nR = c7a5dce4733a81bd738e0a6e0667dc1fade86db119e7f3cde57d6dc6\nS = dfb7f43343941cce331be27047b131617910f68393630fa53d137df4\nInvalid =\n\nCurve = P-224\nX = f51097e1e4b4f3b32e92fded0b4c8b7240a62731292e615a4cae0dcf\nY = 0549003f18e67076bc68110a75252072fc29b6d4a336d152dac2c3d1\nDigest = 48803bce00fe101650dcc83b290c49a524b21422f1f6a3aaa6e2f201863ffc355346d167dcb0ac552007a46cf8d6e4ad\nR = 6875a118dbf586a51af2212d5f32908c9f31110e9e9a7e4cdf7494c5\nS = 1542ab4260459e82070bbad405193a1894ce717af158daf1d096bc01\nInvalid =\n\nCurve = P-224\nX = 5255e4fdc816044389e9c6f5e09b85aedbe1c85b1cf9b7190ef7c2cc\nY = 683c8cb6f31e4cc1e2a5361eb47e305d5d8bfeaf94e261a341aedde6\nDigest = 995229c018cd0ea061672c46ec30c99693fff1cad491b13b4093df0154872adf946644dee6192657b436931c30b7af9d\nR = f1b0f8a3fbf7d4de19cc1d3b4c525c31bd97c2e2a94eb8a27c7c197d\nS = 936d3f49a9aa58935cfe227b22db83314ffadcc4751c8e26853d8cd0\nInvalid =\n\nCurve = P-224\nX = 7cdaf519f6b1254cb8da4668a2dd2015857ceec17f838c15d7d34b27\nY = e29f80fa4f830af7737126d4454b6498905e2c633fa61ad6acb30823\nDigest = c7d8d1f060287ec402092be54ca6e06895e91f9d0c29010124c0d9bd54007d8039b7328ec7b3a29e1d5d4d8fb78807e4\nR = e640f3e676a11007e73efd00b23087adefc9b9407ae8b79b47c397f3\nS = 66b7860a0ca35c2f1c65d50f99def9f2bfc0a6cad2008dcc38d6b3d7\nInvalid =\n\nCurve = P-224\nX = ca1a04f08708ae714b7dfb3db509970d30b7e01be7fd6181613894a7\nY = 1d90a2fcda7dd6ce8b207eef48340e58cd439a3ce17658f6f82be778\nDigest = 1f710f925826bc33c0da91798cb7d7d0700883da685a1fb9503179f0a06b589bf92eb4b67496faf21cd74c8e3d560d77\nR = 9e810ec2a0bc205df6a75bd6410e0c8ea1c738e71af060e2eb271aa6\nS = 9d05eeb46258c468b0398cb6e421149bbea5ed936be3fde3380111cb\nInvalid =\n\nCurve = P-224\nX = 558c323d8259e055a025fbbe6ba8b525b02f32caddfd31e5b08219d4\nY = e1d6398b1c47132632cd3f3fae14fc3ee3092faa619074fd951a5870\nDigest = 4b662138833a976051b20ddfb02e67339715b77046bedeb1e30b9dccbcd84204e76da722bb3bd020fbbe33a182792e0f\nR = 05d8b0bcedf287a4740bfc548570b1c1fff71058e0a9d88476bbb6a1\nS = 769321d50e34939e622a727855501e25a7ad44ec979985e7389aa3f9\nInvalid =\n\nCurve = P-224\nX = 9237e61ad9ffafc61cc1c72b6d2f96d69b588c8feee4074359f694f7\nY = db25a18f1eee72734c640313f5c6c0441358611406cc62619113b4ba\nDigest = 4e7bbf78843a767536977b240e9d1516c73c0fa19bc91448280fd85361b06fdd11ee413f956ca4ea3d67c0e325a1d53a\nR = a58225b10080dab26644f10d8a817ffc4ed4535011729491b6ad5d00\nS = ddbc010e295882e0731ff240f15ed82fa3e81b7552c690cc5b40be03\n\nCurve = P-224\nX = ea7efb9a7e7bf693dc0249504ead70dd422ec86806cd649ed57a7ffe\nY = 33dfb17b1cb244279990019286ab477a2aff2b55c08959deed0b1a28\nDigest = 330f78db9f217f95d99cbcb5414a32523025b85c87ed5aaa3a5e6b006c53cecbbd446166bb9b98e944626332c3266e82356e72110bdbf7df2431b8e7faf59e45\nR = deab574de1f971419b7ba9e169866c3a6233fc627c13dc6a8cb88bdc\nS = 8d4c542bb0046da1b3912652a2c84542668cd89920808785d04e4352\nInvalid =\n\nCurve = P-224\nX = 6fce4d789b1240f2ab1c23051aa03e219da99943a18864e7876d4d11\nY = 3e84a6bddea4a28cf8151ae73aa7b1964c37e654241353a9fa723f67\nDigest = 0088e4cbf3eddb6eaf108fd3937c439684ff8fe5595f2032948423a2a15811b34b0def245bed3b4b4ca90d3f497f3aaa2577a7154d22d7254dfc4755eb9b7b17\nR = 2d1b4f1ccaebc0a929598b650ee364abfd6091a542ba426886d75f38\nS = 44f3d7afe84ae33ab5f9426dfc85248ebc7e0df434d35980ddec75e0\nInvalid =\n\nCurve = P-224\nX = 72013dd6f5b1eb709b3b7da234987f9a36c6f0b095620b8c31f02381\nY = 319d54c719b59d91900b3c20d963ddf1a10d80d6601ac155094b075a\nDigest = 3cba2980faf5579c7ddbeb31c3318a162a882129a1efe1fc9acc3219a617c460701f22fd7a5c46b017bd9ec9c40587127319ea14b148d2be4df9875d5bef6e4e\nR = eb38db9b757b3cf04020f09188c789bf0258cd0467cf7d67368e8703\nS = 7664e85f01e67881712b24083f89e838c8b818de4d665494e7016833\nInvalid =\n\nCurve = P-224\nX = c6a65011926eb64e02bf472d5ba37841d49cfb7f17a20fb9f59355de\nY = 386ccb33d944fd7be6b8531863d2b6200cd602d300d7e7681537e53f\nDigest = eaa81b1236121db12f2036611eb6d3e5386f5733125fb26844cb4188109aae402525fc63bcd73494c36c170d1934b108739d79b0c4f184bd85ffce93b1beecde\nR = 9e7c637a699dd52512faea847079f0ad41b20cd7a5461c36d01e857e\nS = dec6e9ef361de3f6ec7d87de3129eaac5fd0b43b5f7f58ce46c29173\n\nCurve = P-224\nX = 5bcdbaeb2f6c57e8a9dffe94804e74daaf9db8452d13c6a8bc2a4966\nY = a564072356c5d86200e979291a19d5e73d8bcb701cf84d9012824bf6\nDigest = 4a5de84f304f0c83365ae4213fee71c0944d8580f9d8e7455fc961e9f98bf3d51b7fc20aa44e36c0bdaa09e365767742e9bd8bc868d5c6cd8e1cd2ce2968e3dc\nR = c58436fb77aaa4468dee284e1220141ce9ff4426f75daadf5a898a6f\nS = 87aeee1229a50921d8e77e7e3478061f5c051097defb104a0455ed81\nInvalid =\n\nCurve = P-224\nX = 6c6a7deef8b3dee2eaa98d8ec877dddb460365968e63ffe5c249a421\nY = 1ad1715797b5e47c4be24d7ecb8141f1772344a2f643cc66fbcf3f9d\nDigest = f59946dd73887a1fb945ae3e5b44b574512e36dd7d35925b0bdc3a3f69a88e50dc6ebaaac86092679961a99d7ba5724363c5886e7c2cd566433c5a9d59e2515d\nR = f778faa2dc2cee7de2af0bbc4339239dc240907e59ac034464ce986b\nS = 2ac929588a8dc8785808c9d4366bd7b1a81e0fc5be0c63e62344c251\nInvalid =\n\nCurve = P-224\nX = 0ee33a134feae6ee1488bf10edf7cf7c318a2d709080a24818619b91\nY = d7d39536e42652baf55159847f475ded075385a3c1af5c3dcb17ee6a\nDigest = 00fc4992514c1053eee7facc5199161a2b0f69dad2770326371ba42c2c12ffdb4ff6bd86fc440dc8dc1354dad42ff0c2a055b61137532a62521b0f3508ebe611\nR = 34bd0407f80cb6fc759036e6d4522eb6da94874c92ce0f02d8f5f2ad\nS = 3a2dd970050ff990162e5702b06905d03e3c7bb2771050de6d84eece\nInvalid =\n\nCurve = P-224\nX = 31d3c62a4305c37a15e9102072e287a8e0ac027f9189cb9d87ecbea2\nY = 26449ca391af6a2a9f8daaa036f2c9044b336773ee48bcbd9cad59f0\nDigest = dfafbf96b70ead7e91dbf48b8efd062bf2bc0aac6d3e90a7fdf61aac13a74b304bcd0d0c23c88df269d45bdd31d50f0fccfc0324698af4dbcffef04ca05a119e\nR = dc33e8f7b52f584aa3f091aba10c2a9a23be6835e1551092652e1bbc\nS = ae84a6d19f6bad3f9886930c0a1406016fae813673db1516b31b638c\nInvalid =\n\nCurve = P-224\nX = a6e4470712df583d0c795237ff46c9df5718ba2aa24139a2d99721b4\nY = 9edb403a8c10807e8736af665dbcf6052bd4b43bcdc8b9eb8d4394fd\nDigest = 36cd6716cbb8b7f96df4617143be7b74f42bc94e468e79e6658d00b092e24d6de82f207693427fb439dd13bcf49665cac343ea35a79b5963cb21273094ce28fd\nR = 4e9ba5bc4f4fc4e507c1e5cbd0d688da4237385b16ff06601436d8ab\nS = 4e0450a57d802d0ea7b0fb57eb162267195bc4248a831a0ee8b0380d\nInvalid =\n\nCurve = P-224\nX = 350fa782e1cf7254b18cde30683e54edf2c1b4782525fd081bed5920\nY = a77de5b4139ff63e108b6fbd3a7e6c0",
@@ -2627,15 +2651,15 @@
     "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\nS = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\nInvalid =\n\n# r = 3, x = n+3 is the smallest x with a reduction.\nCurve = P-256\nX = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e\nY = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 0000000000000000000000000000000000000000000000000000000000000003\nS = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\n\n# r = 4, x = n+3 is incorrect.\nCurve = P-256\nX = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e\nY = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 0000000000000000000000000000000000000000000000000000000000000004\nS = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\nInvalid =\n\n# r = p-3-n, x = p-3 is the largest valid x.\nCurve = P-256\nX = 768a0d300a595005a520130e50927d403395c8e1e40be997b48fc048410f7cdb\nY = 16f217d8e1c02bd887e5de388a17783b182e61b5d534152dc2c4be8d75fdd706\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 000000000000000000000000000000004319055358e8617b0c46353d039cdaab\nS = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\n\n# r = p-n+5, x = 5 is incorrect. r is too large to compare r+n with x.\nCurve = P-256\nX = 0ec505bc19b14a43e05678cccf07a443d3e871a2e19b68a4da91859a0650f324\nY = 77300e4f64e9982d94dff5d294428bb37cc9be66117cae9c389d2d495f68b987\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 000000000000000000000000000000004319055358e8617b0c46353d039cdab3\nS = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\nInvalid =\n\n# r = 2, x = 2 is valid.\nCurve = P-384\nX = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f\nY = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# r = 2 + n, x = 2 is invalid. r must already be reduced.\nCurve = P-384\nX = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f\nY = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\nInvalid =\n\n# r = n-1, x = n-1 is the largest x without a reduction.\nCurve = P-384\nX = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811\nY = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# r = n-2, x = n-1 is incorrect.\nCurve = P-384\nX = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811\nY = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\nInvalid =\n\n# r = 2, x = n+2 is the smallest x with a reduction.\nCurve = P-384\nX = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c\nY = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# r = 3, x = n+2 is incorrect.\nCurve = P-384\nX = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c\nY = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\nInvalid =\n\n# r = p-1-n, x = p-1 is the largest valid x.\nCurve = P-384\nX = c4fd8e68006b83f7b7b20b731ae405813aa05f6e57374589b36ae1cecd1d49cae1418c22f398188bcf4ef02e89fe7394\nY = dd1164b3707f59e05129fa228b8448031db159985f035d93470dc42b3ab4129f0760c46cf201d42e73a7e33ba7402ea6\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# r = p-n+2, x = 2 is incorrect. r is too large to compare r+n with x.\nCurve = P-384\nX = 4e5e4f1a6e97059a6cf2f4e8129e5c7c64cb84f9994a41ff5bf30b29c1bf5ba6898627c91a23c73e05cd1a43c8f908c0\nY = 06a0aed7f1e63a728f87dbd5360a67571a076ab0b4cde81b10d499959814ddb3a8c7854b0bbfa87cc272f90bca2a2254\nDigest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e\nR = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e\nS = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\nInvalid =\n\n# r = 1, x = 1 is valid.\nCurve = P-521\nX = 00f07e0b593332d09ec4fd0bae93f648a3da04dd224faae3f64cc490ec8fce3a6fe53d1b2c9e326be076cafb921b7e3f8b2288db491819522d65472870668c3808c9\nY = 018e42509aca542a8de421589c38ba653e8cfd69322336217042a9dc0f67f6d7ae2cd4e385f480ffaf8981f715c7ca3765d9867dfd5a02947b0895f82eaf8b257e88\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n# r = 1 + n, x = 1 is invalid. r must already be reduced.\nCurve = P-521\nX = 00f07e0b593332d09ec4fd0bae93f648a3da04dd224faae3f64cc490ec8fce3a6fe53d1b2c9e326be076cafb921b7e3f8b2288db491819522d65472870668c3808c9\nY = 018e42509aca542a8de421589c38ba653e8cfd69322336217042a9dc0f67f6d7ae2cd4e385f480ffaf8981f715c7ca3765d9867dfd5a02947b0895f82eaf8b257e88\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\nInvalid =\n\n# r = n-2, x = n-2 is the largest x without a reduction.\nCurve = P-521\nX = 002a61afb982e49f030dd4e6ba0e495703abe0442b1283ee693fffc1b558f49f0a4cb4f138ea0604e667958495b86c61f358dce7e7f170da47372be3e4168408a260\nY = 01baa19e8929fc8e7208e854e706a3d7f21479d1f6922a6",
     "5ae3490fd5f52ae6580513b1fdd5bee927d002a9608abbb925b6727bdc110a3145fc8622d1fa8154c82d8\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n# r = n-3, x = n-2 is incorrect.\nCurve = P-521\nX = 002a61afb982e49f030dd4e6ba0e495703abe0442b1283ee693fffc1b558f49f0a4cb4f138ea0604e667958495b86c61f358dce7e7f170da47372be3e4168408a260\nY = 01baa19e8929fc8e7208e854e706a3d7f21479d1f6922a65ae3490fd5f52ae6580513b1fdd5bee927d002a9608abbb925b6727bdc110a3145fc8622d1fa8154c82d8\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\nInvalid =\n\n# r = 1, x = n+1 is the smallest x with a reduction.\nCurve = P-521\nX = 0049bbb2d3267a6eab2c59fac5b138b9e9c383db6637fcfe5d9f430e4c4c2ba0332340975448bd86c92a55c1a8288adf7f774096022419aa8c497499dafee7b93257\nY = 00bb52fd444ec497ce228135f2498d40fb84eb6f674df1245d3aaac3c75b55ff5fff8e90b6f0189a3132cb9fd8d6e74fda5866fe2b9fc7484c628fde97e0b00f2b67\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n# r = 2, x = n+1 is incorrect.\nCurve = P-521\nX = 0049bbb2d3267a6eab2c59fac5b138b9e9c383db6637fcfe5d9f430e4c4c2ba0332340975448bd86c92a55c1a8288adf7f774096022419aa8c497499dafee7b93257\nY = 00bb52fd444ec497ce228135f2498d40fb84eb6f674df1245d3aaac3c75b55ff5fff8e90b6f0189a3132cb9fd8d6e74fda5866fe2b9fc7484c628fde97e0b00f2b67\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\nInvalid =\n\n# r = p-1-n, x = p-1 is the largest valid x.\nCurve = P-521\nX = 00f651d53d45bf6fd55a5f184e580d11259bc65200387dbc1bf7fb867d2d12a207d2962204ccf38e9d37d23ed95bd01ec576c457127766ecb8ad00342a476ea82078\nY = 0196caedf64fbaa9a12c16836e0564e36f733957375706edb5f32911991a994c2d6a1ea5db2ee764835a9d6aff379e195f722b48e8d2b60fc50de2a5160c77c3f06c\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n# r = p-n+1, x = 1 is incorrect. r is too large to compare r+n with x.\nCurve = P-521\nX = 009eeb7f956230c3744ca5b683f413009363107aad18a027fa7af6ac07a699911e94143d3ef00c0062d4187c2ea74dc9322c05431a6b7fed51ee71b047ce3a0e967c\nY = 007d2c089a6720f7c7886ce8aa6aeb9b821adde0eb025ef63c62d37c32b2d6823c857ce7743b8181c35c8f34e6aeb4487dd693e01d69dfe883c07c25ebe89bdc4d56\nDigest = 8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9\nR = 00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7\nS = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\nInvalid =\n\n# Although we do not support secp160r1, all our built-in curves have p > n,\n# while n > p is reachable from custom curve logic. Moreover, p and n have\n# different word widths on 32-bit machines. We include some test vectors to\n# cover these cases.\n#\n# When n > p, the reduction mod n never occurs, but an optimized implementation,\n# working mod p, may incorrectly accept, e.g., r = p+4 instead of r = 4.\n\n# r = 4, x = 4 is valid.\nCurve = secp160r1\nX = 39891bd61138e775cd012518ff00f59ae01c4733\nY = 25026b77b1c44affb1592dcf711b4290e9404c9f\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 000000000000000000000000000000000000000004\nS = 0100000000000000000001f4c8f927aed3ca752254\n\n# r = 4 + n, x = 4 is invalid. r must already be reduced.\nCurve = secp160r1\nX = 39891bd61138e775cd012518ff00f59ae01c4733\nY = 25026b77b1c44affb1592dcf711b4290e9404c9f\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 0100000000000000000001f4c8f927aed3ca75225b\nS = 0100000000000000000001f4c8f927aed3ca752254\nInvalid =\n\n# r = p-3, x = p-3 are the largest valid values of x and r.\nCurve = secp160r1\nX = d88d902a0d8d942333c7b846a933d4794fcb5807\nY = d24c4f405689b86cd5c61fe104e6365d254d5222\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 00ffffffffffffffffffffffffffffffff7ffffffc\nS = 0100000000000000000001f4c8f927aed3ca752254\n\n# r = p-4, x = p-3 is incorrect.\nCurve = secp160r1\nX = d88d902a0d8d942333c7b846a933d4794fcb5807\nY = d24c4f405689b86cd5c61fe104e6365d254d5222\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 00ffffffffffffffffffffffffffffffff7ffffffb\nS = 0100000000000000000001f4c8f927aed3ca752254\nInvalid =\n\n# r = p+4, x = 4 is incorrect. They should be compared modulo the order, not p,\n# so r >= p is never valid.\nCurve = secp160r1\nX = d8add22064027856c162243ab09ea96642975297\nY = 8822a506712385ab3ebe5c61737c3bbb722b06b9\nDigest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b\nR = 00ffffffffffffffffffffffffffffffff80000003\nS = 0100000000000000000001f4c8f927aed3ca752254\nInvalid =\n",
 };
-static const size_t kLen46 = 9174;
+static const size_t kLen47 = 9174;
 
-static const char *kData46[] = {
+static const char *kData47[] = {
     "Key = 00000000000000000000000000000000\nPlaintext = \nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = \nTag = 58e2fccefa7e3061367f1d57a4e7455a\n\nKey = 00000000000000000000000000000000\nPlaintext = 00000000000000000000000000000000\nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = 0388dace60b6a392f328c2b971b2fe78\nTag = ab6e47d42cec13bdf53a67b21257bddf\n\nKey = feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nAdditionalData = \nNonce = cafebabefacedbaddecaf888\nCiphertext = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985\nTag = 4d5c2af327cd64a62cf35abd2ba6fab4\n\nKey = feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbaddecaf888\nCiphertext = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091\nTag = 5bc94fbc3221a5db94fae95ae7121a47\n\nKey = feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbad\nCiphertext = 61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598\nTag = 3612d2e79e3b0785561be14aaca2fccb\n\nKey = feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nCiphertext = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5\nTag = 619cc5aefffe0bfa462af43c1699d050\n\nKey = 000000000000000000000000000000000000000000000000\nPlaintext = \nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = \nTag = cd33b28ac773f74ba00ed1f312572435\n\nKey = 000000000000000000000000000000000000000000000000\nPlaintext = 00000000000000000000000000000000\nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = 98e7247c07f0fe411c267e4384b0f600\nTag = 2ff58d80033927ab8ef4d4587514f0fb\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nAdditionalData = \nNonce = cafebabefacedbaddecaf888\nCiphertext = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256\nTag = 9924a7c8587336bfb118024db8674a14\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbaddecaf888\nCiphertext = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710\nTag = 2519498e80f1478f37ba55bd6d27618c\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbad\nCiphertext = 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7\nTag = 65dcc57fcf623a24094fcca40d3533f8\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbad\nCiphertext = 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7\nTag = 65dcc57fcf623a24094fcca40d3533f8\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nCiphertext = d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b\nTag = dcf566ff291c25bbb8568fc3d376a6d9\n\nKey = 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext = \nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = \nTag = 530f8afbc74536b9a963b4f1c4cb738b\n\nKey = 0000000000000000000000000000000000000000000000000000000000000000\nPlaintext = 00000000000000000000000000000000\nAdditionalData = \nNonce = 000000000000000000000000\nCiphertext = cea7403d4d606b6e074ec5d3baf39d18\nTag = d0d1c8a799996bf0265b98b5d48ab919\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255\nAdditionalData = \nNonce = cafebabefacedbaddecaf888\nCiphertext = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad\nTag = b094dac5d93471bdec1a502270e3cc6c\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbaddecaf888\nCiphertext = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662\nTag = 76fc6ece0f4e1768cddf8853bb2d551b\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = cafebabefacedbad\nCiphertext = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f\nTag = 3a337dbf46a792c45e454913fe2ea8f2\n\nKey = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308\nPlaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39\nAdditionalData = feedfacedeadbeeffeedfacedeadbeefabaddad2\nNonce = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b\nCiphertext = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f\nTag = a44a8266ee1c8eb0c8b5d4cf5ae9f19a\n\nKey = 00000000000000000000000000000000\nPlaintext = \nAdditionalData = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad\nNonce = 000000000000000000000000\nCiphertext = \nTag = 5fea793a2d6f974d37e68e0cb8ff9492\n\nKey = 00000000000000000000000000000000\nPlaintext = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nAdditionalData = \n# This nonce results in 0xfff in counter LSB.\nNonce = ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nCiphertext = 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606872ca10dee15b3249b1a1b958f23134c4bccb7d03200bce420a2f8eb66dcf3644d1423c1b5699003c13ecef4bf38a3b60eedc34033bac1902783dc6d89e2e774188a439c7ebcc0672dbda4ddcfb2794613b0be41315ef778708a70ee7d75165c\nTag = 8b307f6b33286d0ab026a9ed3fe1e85f\n",
 };
-static const size_t kLen47 = 157331;
+static const size_t kLen48 = 157331;
 
-static const char *kData47[] = {
+static const char *kData48[] = {
     "# These test vectors were taken from NIST's CAVP tests for CTR-DRBG.\n# Specifically those for AES-256 with no derivation function.\n\nEntropyInput = e4bc23c5089a19d86f4119cb3fa08c0a4991e0a1def17e101e4c14d9c323460a7c2fb58e0b086c6c57b55f56cae25bad\nPersonalizationString =\nEntropyInputReseed = fd85a836bba85019881e8c6bad23c9061adc75477659acaea8e4a01dfe07a1832dad1c136f59d70f8653a5dc118663d6\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = b2cb8905c05e5950ca31895096be29ea3d5a3b82b269495554eb80fe07de43e193b9e7c3ece73b80e062b1c1f68202fbb1c52a040ea2478864295282234aaada\n\nEntropyInput = edfdb55e77d418a63e4414dfd42225ed257cf74e99325fba26e8f3a4524a71bc80a731af23256908cb4675a9c253ea6f\nPersonalizationString =\nEntropyInputReseed = a9372fea93d607fbbc75a97b7f65f2d4ae8c06bd184981572e888a35c5794d2bb380a4ae04bba27f2efcc9e7914b96dc\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 11b1a0f0bb935ec0c54e089e0cd20832d1f00e7069f30e9ea2e35b7f15ecf0577d0e90035bf0f91ffd9e8a1fa8a507503739afbec19393e02c9b7c230cdea36f\n\nEntropyInput = f253fd442b105434c0f47ba9b6798bc20c8832a142a2a6d965678485a3ac52393528a5e092341d60ad74429f4005f8bb\nPersonalizationString =\nEntropyInputReseed = 600c822b198dbdcd9d13ee25bd4b846e5d8665725eac5347b4cfe7512c1f3fbdc4c51c85d977ca58e9e6485a17c533bb\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 076419bdd354d6a1f1415a0a71bed94db29cad22f0205d983c841874497875a4857404e573545366850fe6eb5286e0deb87ddd63bb3317b4556a82920412aeef\n\nEntropyInput = 8dbf2c37dbbf3862f05af4b32e98edd3d8cd7bd34d8a23daa2d15200daed6e9d238387ba85ddfd35a2986bdf5790e1a7\nPersonalizationString =\nEntropyInputReseed = f67aed05dea08baa16cbb669ae310a0b8e019da0a7fe2762abf684121292186a50bc13d568576ce5d7aeb080e4604a1e\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 69666e65c5623140da35927ec39189fcfda0891674efdcd2a7d6f2628921a37bd49a164590413c04f6090a50336f040b015dd8c45452991bcdd96994c5ecc6bd\n\nEntropyInput = 2fac25dcea5274a7dbd6af112d757b59a4447f5dcbda972666af071c5d8f71583ec6914a1e685f610b8a43ffada0b411\nPersonalizationString =\nEntropyInputReseed = 52f5b1f927c0873ae375d6a6e140fe594fd474a63bcdcd6a98109e32ad980ce534714ec626dad7acd43101415e5817d2\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 3096cf20137eb6f94d9d26a4871eddf10285c6984776847105ca9294aafc68925ad8bd7f36bb68fe371476114649ead11b926f9f0fc1d21c744342ff5c44c8e3\n\nEntropyInput = 4133a0e6ce837125f46f2a44e05c4f64d76879156ea16a1d16db1d3ec460cc53609fa9e4b3081f9dde0b79f00c93ac5a\nPersonalizationString =\nEntropyInputReseed = 4613b2327dc9054f34faf933d62bf7b12ec8b34626c07ef7512cecd8aedcbd4023f26b859a941c5af77ec1e2e02a1d9c\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = be02e94fd18c488741fd90b6980118dffba1cda5bd25aa23d44414392201c5a78c3ea68252f92afaaf540b298d3f80a94818f1d1ca84c2be5f66a46191a7548b\n\nEntropyInput = e312fd67b5009ab1c896ba8f85d53fb29517ed2a26d20a4b9d09505ec004bef5739cc94e7f368989c675eee1f40501a2\nPersonalizationString =\nEntropyInputReseed = 176ec11c0d4462ea26b1bdee41208e3ff3b430de11f12567ebe982c16d709f681fcd9f5bd5309f3f2a9d80b3a426929a\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 07cb9f51e34be38fe1d1c18858ee44db227c1e6a6c2f7d09e9143e87e9e09df0af9a5cb7a183e5d26359509fe619e52e59e3333d3620373d3ae5a008b51ef786\n\nEntropyInput = 3eaf30117135d9167c829e35bd8da227a6302471b649381858085e67c65496058ded0ab176a38b3888f4e3c2e65269dd\nPersonalizationString =\nEntropyInputReseed = df60a1b9fb2f8501756edd09e489fc98a60ed08646f5a2e018f55b71c76b9b7718ac4ae61b41241593829108ddeb0ef0\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 29c4d540354e97f50f3fb1de84eef471192cd76a670de34176c6465523ff249ed5eafe2c09f091f5ed101cf8a971d782f150a2642ed291e850906e29328d6b8a\n\nEntropyInput = 99d5543c192c6a1069bf548d80d678bc42c1f020f0b29a0ceeba424c03f8a8aa38df1c0fe100ee4c1b0bc870b4afa3d2\nPersonalizationString =\nEntropyInputReseed = a0fddd29c792f6f411b5d532fff2564d492ca15ac8b7fe1b4575e9b59806823665ad7ac4e2adcd2803ccaabe87ab75ed\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 3d58e98a1f4beda50f84f773c405d106b28f4be6da2a2942098403843bffa3323c53661a7f072a020c68f55ea2b3a9cf9157b7c4cdff5e642ee9be1f436f9c18\n\nEntropyInput = 2151ba6cf2ed6a7366991e516443162b6ed4e7f8ef2d6c81ec5e5feb0061e20ced65da27847956194dc6177b5e0befa9\nPersonalizationString =\nEntropyInputReseed = 73418efab1c6039145dc6ce09b84abde4ef4f8eaccbac250213bdd75e2a5e8b42ffb1367bd8d1281e3b0051651f78a05\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 5b219cb285c820f3bce52b9eff15afa042de3036f1a52896eab34e4476c28c60127cf8daddce0809efafab03c9269cd220a49f79220e14db9d208311d2a22a1b\n\nEntropyInput = 7c7321b69fdefdece32c45e47cce07a0d599e83ea8ee5781e2f2ff341f292c0bdb848e5ab379771639e811fed45f63d7\nPersonalizationString =\nEntropyInputReseed = 4b04652d3d0515b305f4da346754c0d398c8cfefe8e5c1edacb79cb8396018bda12ad7d42bf86e801159bb62c34fff68\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 379c12dc2c8a884c6f40df5353047d74efbd9c626795b86256abec4a6f42ba26529f19e4b043f53776180c7ab16a3817b4a50c09bb3355234786e714edb9e2b4\n\nEntropyInput = 3a56329b07dffb8bc7761c0c2b4ec4ec3b7ed2513f0cc3d9be3eb9a153e8e1605d9392dbb951e4b0989ef473301f6f57\nPersonalizationString =\nEntropyInputReseed = ff6efb9b946748af0992bdc38eeb15d4991bb610692e1fe53ff828405924a544ee0e4da70aa1d0ae55e7925a58cf5597\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 9f32e40391217833176ca768beedd2839892c6fc17dec5c250f0820c576e4ed615729653515ae13292a2e4aedaa2df74c6535d8c625dd1cab479d3c5ae7bf955\n\nEntropyInput = d550f48af436ae42ea48a8cb0cd615be8db51691b365ef20ed826b28561fbacc9deb28cd3d83655033068948c55683da\nPersonalizationString =\nEntropyInputReseed = 76ea2e732f77b337ddd402e367c158dacc3433feb40d7b4376fb8dc449891336b00841580ea189583ada95cef783d540\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 8433b2ac45da6fdcbeaf3e6f76e66beb5b90a89a9cb197cfbe405ed53b1dd51a42cfc9aec5fe7cf778f88031fb7b15b0874d4d1ea87ef3895848721b34fb1a35\n\nEntropyInput = ce6137f720affd106396d9b66540580ae216d5d7dab48ed2729cdb3e587c7d8da13ce39ea8d9d8c22220a96b74e7ee9d\nPersonalizationString =\nEntropyInputReseed = af9f12fddeef001b08a5993f62da5e7c3aff23f882ae874b9f66f28eca1106e6386dd82f07ae1fb6868f186e2ec4f449\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 219fc160dbc136cdc9a7c3407eafde4639602cc58101c512dfbd85cc26b61fc9a94cdf76f15a1de7a46e36ab64aca3eeae36acd6e3d0b3fe59b75958b3eddd24\n\nEntropyInput = 1accff5a19861164c5d2cf542cf41a789f143c7956518ae158d4449ff0c257a00966faa862ccbb363bcf4aeb31089134\nPersonalizationString =\nEntropyInputReseed = f2fa58209759d84bf38a1656bae655669767a902ade22a830df56b32ef9e1c992335eb4cb27eeb142bfd21b5d31451de\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = f214b4055d182cb258d9e9b61251bebc9bf090db662c4e36023cc156964fbbe1cedf691cd0c3d7db4262fb65a5d34b942f909b0f31fc18009766413523dcaf40\n\nEntropyInput = 99903165903fea49c2db26ed675e44cc14cb2c1f28b836b203240b02771e831146ffc4335373bb344688c5c950670291\nPersonalizationString =\nEntropyInputReseed = b4ee99fa9e0eddaf4a3612013cd636c4af69177b43eebb3c58a305b9979b68b5cc820504f6c029aad78a5d29c66e84a0\nAdditionalInputReseed = 2d8c5c28b05696e74774eb69a10f01c5fabc62691ddf7848a8004bb5eeb4d2c5febe1aa01f4d557b23d7e9a0e4e90655\nAdditionalInput1 = 0dc9cde42ac6e856f01a55f219c614de90c659260948db5053d414bab0ec2e13e995120c3eb5aafc25dc4bdcef8ace24\nAdditionalInput2 = 711be6c035013189f362211889248ca8a3268e63a7eb26836d915810a680ac4a33cd1180811a31a0f44f08db3dd64f91\nReturnedBits = 11c7a0326ea737baa7a993d510fafee5374e7bbe17ef0e3e29f50fa68aac2124b017d449768491cac06d136d691a4e80785739f9aaedf311bba752a3268cc531\n\nEntropyInput = f963096540d0023d6703e18248755ad16aea91852a2db0dd0f6a414d2a5822f3224ac8b1d47b01aaecc93ae299081d7d\nPersonalizationString =\nEntropyInputReseed = 399ed54bd846de00d42fb1f92d1ade93e81e32cd6ce73825f0bf86179dd46fd79bc8cbbd3b8834e58cc86619e19b08b4\nAdditionalInputReseed = ee073f9f6145d0a7c09a5e4a12d65baeba360bc9b5d7cadf93e7d2454dfde507af37e49782cf8550dd3a548e8cf98563\nAdditionalInput1 =",
     " 6a42ffe56dac0b4dc5d84b49698859b3645c920151565bf29f56b6322244bcaa7cd1ebb8ee9936d8ee1d280f547ae245\nAdditionalInput2 = d057c418a758d99a8ee855093da9bc1734a5168a6df9d9c9924e8bb472b5945563d86350dcf3e11aebcbd06a22b9ef78\nReturnedBits = a0cd72e63f49ce4c1d64e21e92546afced2af268549ef48d3ca88afe4d4097f91a52ecd0e7ad12ec0a1f67dd8c5325b78ee507c0a63cf90d64e9c47862acedf3\n\nEntropyInput = 333a0269eb0fb1d9d1e92f55de9e13cd7e24de64f5f276382d3eb2ff356a66679a9a75d2da31d39a940a09cc85d9d531\nPersonalizationString =\nEntropyInputReseed = cbf504cc473c9a6e66493b71b9684e8df458e65d2cc676e4e6ad43eb59172932c0956d0623134a6a3bba23906ec9da0a\nAdditionalInputReseed = abc86c71ae0585827ffe0d19a9fe97f23cdc4afd67978e553e0669d4635ca1df30250843fefd4d1288f6fbc3bfe04a72\nAdditionalInput1 = 15d15fbe7c060e6811bf47c21e93639c00cdcc562f4e02c88f7e347ec14a2c8410fdb2ddc3dfa62ba9ed1758f12017df\nAdditionalInput2 = fff311ea4c5cbd8ce53c45fe8d8106c28eb06d01ec9d8245c29f95b50b13085a0ec28803d733bd0d8a75193e63e21d5d\nReturnedBits = fcdb52bb6e2ba8d896973b9284b32af6364a34a2b80b3e3c7684c200c9e0a02f7bc6c3cd32b159df9b98da07a17baab9b0b07eab214544d5c562e454ec643de1\n\nEntropyInput = 86e4c30c5a7dfcca86eda7723930ab3272635f0ad9e2fd70a2d7a69b6a07dc0cddeabffa9c411198e3cb7589cb29d3f2\nPersonalizationString =\nEntropyInputReseed = e1af1c42cd29dd002e10e5839e8b679d3c5192da5e1b655123132ff1ade22b35651ac6df66fa14f36e1832be7a176895\nAdditionalInputReseed = 5f619073fa2e98b9f06bb4676bb972379ceb727e1e8768ef09e532cf3d8fed5ce92a7528eb55ae552959d74f75dd0324\nAdditionalInput1 = 330e316bec4955d907d7d7bf2b7149f0aaf4285ed1a2b7e387376ea1a4e0858c114ec3ddddf7a1edd7c8a29b1f12b998\nAdditionalInput2 = 405911cf7c6779e02e4740fa9737f189370292494c80621cfaa9f7d16d68219e72d474f8d5a54aa8ea8020dff9c36650\nReturnedBits = e359c3e23315c9c1d69ab2ec96ec3c6c5aad868e58709e101b0fa08c4041248e4d538d038993250d395d9651513514fca5760dcb9970dce53d2d1c2712bc56d0\n\nEntropyInput = d8cc5d13badedbdc2fd41852247a9f2879b0103b4a8186f0a08da7d55453b7484f642a9e5a5182340584d2ca7cd5ed10\nPersonalizationString =\nEntropyInputReseed = 35788b8369fdc3dfd206efb873b5c5215f5b8ecb0541fc0a0e027e868a91053b5d58cc8ca0751e0c0893c868e2322471\nAdditionalInputReseed = 6afcdc760fe62b080f141886b516623971f8014ede86e50d62d307a90cf3512da5fefd37b3932d3d9d86ad0c03447be4\nAdditionalInput1 = 72105702fbf1da4c10ff087b02db764804963fd986de933b757b8fe5a6016e0f2700573925aced85c09e2ad9f9f7b2c2\nAdditionalInput2 = 65f9a3fe4e1953b7d538f6d6ca3c0a73bda2276fe8f80860c07b7ed139d748c3c45db5d96598f77ff863a43977ba390c\nReturnedBits = 7c2b600c3f550671215b03ad7aebf71086ec59aa4f45cf6b3bac9bba2e108f801f6478b098fcc4e063454cd3f64a951ed70f619866c1a4e70b5c47458c09e083\n\nEntropyInput = 07d14a0d9fbc76a155047a93bc0bb2b578fa7dd75cfe9a44bb8709fe3cc2302fdcc06a9c6751f4602a3a4955c0f38c7e\nPersonalizationString =\nEntropyInputReseed = 8babab6b9f8429f554156da3905122cb48c0b901fb6eaad8df771e8d583ba885dfbad02e47524b1981768593bde88260\nAdditionalInputReseed = c185c45cb07e8c8ba8eb31d3bd48a7c864137c689214c2fb3b1d6d6abcda84f2922a862a0955e67695391d60d6f2d1bf\nAdditionalInput1 = 326a5c9c4a1a2b6fdc369fe2a171bf625dc26e23d1a34faacf59bd33be98ff7ac7f16e485b6da3145ea4db37ee4ffefa\nAdditionalInput2 = de096ad13dcc1ee1449c3a0661edee028603590f087474161a7ab8fcfac896a924e14b0a57aeac17fed676f4b9c7168c\nReturnedBits = 60911e6e6455bf4d85a4f76378390f6cd537d7cce88228cf34e4a4889adf62a9cc1070dfc39c254e81a8557bb2c350fe3f462199e377d3796ed139117b6b0f45\n\nEntropyInput = b3458c6b38ca70c44fc6c601e088863fafc953c6b5d3ee57fb1a07f3f65dd5e6dc19aed17aa5530913aca598b26a40c0\nPersonalizationString =\nEntropyInputReseed = faa8d3feabf972e482e5a0b3821c23ba067c45267e3715a4c10f65716a348030d7fa5637e9f000b3e47d786c013fc035\nAdditionalInputReseed = 901ef89ea38203b83249a34a1a8cbd0da4773ccd503d60a395be3a3db113613e6c571a49960a4e99d302b6f237f64d54\nAdditionalInput1 = f2f87693d1f28f95b0a6459c538e82be99a8cefe8a2c7ca037822072e63670dd141873f3dc9e309c6ead40783f46794e\nAdditionalInput2 = 93cfefbb7624a137cbd7b177918823893e77251fc5660a76ab0cfaa3b340ae822a8a75365056f06b0a7e76afc39f6819\nReturnedBits = 5bbcdeb5d7d1ae19e4ef7878abd1ca4f2641d42c765b94a7689172a4e90baae46ebcfa5427a882c1614cab36f186a98dd3a15febc4b23add955f69dbfd5e5d2e\n\nEntropyInput = 6dbcf6f2f3997ed55471f779039982bc84a1c052fbf5883d6f62c0a61db108386e74759d7237bb0efca030aac76bc7e6\nPersonalizationString =\nEntropyInputReseed = 1a16753c195fed27a1abbe067b2b22aff4c49ae7832d18d01cef5ea5c7d5833008036f71e9c77c1629b6f61370b57f7b\nAdditionalInputReseed = ec54395931ac0aea2a8739d4c51e33c8425906005c341db373247e73b968c2c79257cf7ac74353c00fd81a80f4c95b8c\nAdditionalInput1 = dbd6bb5579a10e395b534431f3ab7c8025527bf99e4f7c162d681f8d35a56f6a03729f07ab43897ad0e80146044b1614\nAdditionalInput2 = 5d35742c25620bb795eae41178d7fc86d9cbe050ea702573ae6adb61e16c411b7445548dc535d57371bb11e2cdd59597\nReturnedBits = ba3905bfddcabf6dae311d1fc19fff1f6fc1ce779e38f864b7ccd2aeb1b3d6ec1845305c29d39b8736b3977277ecaf5735d0e4acefccf7778ac3542af815fd41\n\nEntropyInput = 3a9e8099007c67f6e5f98525cc4295a68c5d5135d01f5f66305c7048ca02525caa3f790b2d12a8520e9963a9cdd597a8\nPersonalizationString =\nEntropyInputReseed = 15993dba9775db8a5bf79778a316f2910d4dc0be59c3b21c650e3aa89c8c89b33fc69e9e5d642e7fee16d61b691de2bf\nAdditionalInputReseed = 946121bae27e5804daeba0d7dc7ae0c1c397bfab106e13b8b7c5462b540d147119af5b7c4f9c198161e5aa9be34e2d28\nAdditionalInput1 = e9799421e75bae7086731a21242dc101c93b768fc747734a357454fc0f7c082cfdb79b8bbcea2d1122d89316a7bfbd3d\nAdditionalInput2 = caa04f94b4b9d694e2c4bfa1e8e708b9c00d9c3d645243acfcb879d2e2ba723d9e48908738114eab7d15f8cf36b043ae\nReturnedBits = 9bd50f3c5384eb28d931f03a64eb97ef140e1e81f4c1d9c910cd7d79a40494e1fcc53d82cd32df35d53b05a450e54b7ec71e28359c1273848e5ab117d5ded88f\n\nEntropyInput = 7f2a0213de6738ec62bedab769a5f01732dad2d35dd4cad7a765dbbb6f9101f57b65ec8fc4e23fb3479ce6211ca3d84e\nPersonalizationString =\nEntropyInputReseed = aeb097e9ddc4dfe87874ddb1a856ec3d00fff1b38c8f954681c11e61bac8b6b2e2d8d010e6820f9c4d807b295acb8ab0\nAdditionalInputReseed = b33ad3dec7d529b71e39d59147f79b4884039d1112804fe8c70e174fdd9828c06a4d44d20aa5fc1918c3ee8082a2bf93\nAdditionalInput1 = 8632d221757132bb7b883b7dc26755f62ec2ffab0876168d11ea7b92774c15c553b11320393d64a2262133608ca92a18\nAdditionalInput2 = ccaf3bc3ae9cdbfa885aa8414c1f823c6a3ecc020b619201a52ce0b7516ba1f49755c450c532bfe11c06b9d0e049ccae\nReturnedBits = 4b1c065a288e5eec56b67fb341e25fc7521b794b52b94f9570bdb16583bb6f7a780aea5297496355ffb4bf5a444c277c96394619cc33cbb5a3b2a9f49b00f9df\n\nEntropyInput = 80773d0272ff48ba84b98c817365b097f21258624d0de8529381977950a5e49ff2b79d0f2522269970ea6d484198922c\nPersonalizationString =\nEntropyInputReseed = 9b101ac018be88da3611a236dfb1300c0049947e9f6ebef7a3ad6e1499efeca0b142826fa06f427e271865232a18dd29\nAdditionalInputReseed = a67ee22453dcaa5e4726e3084872145ab60489bcb6e83346c108f3efcce5b3d988b84d58786658d87c2dc3b9035e9d88\nAdditionalInput1 = 546515bf86e48dfb2b4dd21c2b46f10c1e797ab799b51822e8e7cd99ccebcca00b8899ef6af5cb395168aada9056a6c9\nAdditionalInput2 = 57bedda63fc5f792a608be111141a12e522496c086194515909bddcd868be997e718e7c5899e28dd6b123cbcc3f2a8f2\nReturnedBits = 4075461e459f15cd32030551be47528223693c2f44e32443cbe9271eefe74fa0a6e1ec04f4b8f41d7ed6c5f455281a3cba56d952b08b7753f6a3d7da3517317a\n\nEntropyInput = dc132c15af0e214d1b56eb88849e96b81dc17f238eb3d1bb9a659219dbd77eba38ca2796a8011e29cfad76f8cbbf099d\nPersonalizationString =\nEntropyInputReseed = cba23d4fdbb6c11e38012b71ca264bff9d1264bb20a39bb27d86dcdf7d72ce7a4f5c124cdf2aca6aaee20832495181e6\nAdditionalInputReseed = 07e043add7cc14612a82926c09934dea092f4618cce25674972b1f50b2907c7e3d40a25722ea49b0c7ceb6b57ff2d870\nAdditionalInput1 = 0017ff834967cff8827598ff6c00a9c97f0347c34f2523a85dd7d18ff5575756c1f5383de50338d0ab0505841d70a193\nAdditionalInput2 = c404dbc3cb0851b08530f96500f5a2c10d8985c82dec2ba31d4199fd07687ccf124382fbee3fa119938f0c72ac586102\nReturnedBits = 1935cce86bde7087fcab30b5dce0e072ad741c2f281902e1801e56c08ae8b256d27514de92dd48a838ca426820002c1206f86cad37cfd99d3a935e05f56a7507\n\nEntropyInput = e48495930a7fc86ecbfad807d40ca84ba35e346c812090def8f44d9e48b0a40704ac67ec80ae15b12e858ae85a7ed9cf\nPersonalizationString =\nEntropyInputReseed = f4735954d17e99077061c9604e8f1734d61dd662e54e37256c0f8bf276e025d59d21cacc0869ededb44a2aac9fcf2ccc\nAdditionalInputReseed = e796322fc0ef503251f6d4bd72dc5ea8100",
     "c5a59f1a4fe4837fa8eb2623bc650a0cd48c306f139e0ecd169a51deb2cd0\nAdditionalInput1 = 1c844d24b7cd9512e5035bc457612ebf6d3df6867aa909038bcbc1f474f7d0783ed474e34525a817bea1fbc883961e31\nAdditionalInput2 = 5c5671ba79bd0b83f74d0ed98e9c8b369a2de34188d8b7cada20b3363738d1252ece1e6a26d007acdfc5b6108412766a\nReturnedBits = 40f17e2bf6084a6447f2c40d601e16a43098dadd9f9614d518874623e8e684438c02e127e582b000dfd46df03dd5435edc4f0f47098320fd311afdbb8542c4db\n\nEntropyInput = df4a888ec7363fadd99ce2223ed39577a41bc220d20b253f98dbfc617aff8fe4ac66e5da1b5097228422cf8242baaf53\nPersonalizationString =\nEntropyInputReseed = e16dca80b2061706e8180dce8f59e888f150836a0bbceac179a4b8d882eead78709ed9951102728abbbbf9226a2d913e\nAdditionalInputReseed = febc9f6b9f2b90b4320d5d41e5c5506fa32b164d86d5e7f91d4a360fe179c127bd2bdeb78fe760174e856a5e04ed898b\nAdditionalInput1 = 0aba74cd299e75886c9e7e5293e5915d720da2c8c1cca7f0e1d6f2b672b4014eb4582e97a877121c87956185736ba0e9\nAdditionalInput2 = e451eac802660ac843fc72b66d59f1e1ca831f22d6a361929043f7626f1d82133f512fb1f2d8ca51004f80ed600609e4\nReturnedBits = 968b708ed6b54d2e5a66d46f22998748dfb5cf47e817732a40938bf3593fb251ccf8f2076837715d14b316bfb52560135602ff98338593696bf80a462b214c4b\n\nEntropyInput = 43bc561c4dd1b904a5333a092a670d0d1b61128a13be2e538a329094574819284e414b938dc8b1860b385c293c03010d\nPersonalizationString =\nEntropyInputReseed = eb362136f4ccc9e302505d525befbfa99d8c3336187d5902b03ed75641913ce973743757f97dae9366874ba62bd87013\nAdditionalInputReseed = a901f4daaa638804177a0b263e8cbc81688df3beb218b02316da83b729230a9e5112fb3896b727298755bb9ac6b6250a\nAdditionalInput1 = e33d181f3159fb0874eff5ef8ddd2b51a60b13ccf046f7e637ed27bed81bb604277f7345e6b8f0e09f925793ce417fff\nAdditionalInput2 = 3ecf6233820e6cceddac7b024c490c5ee14c73d5b598c92cda30940471b6ed450019120689aaf157fd87b71b13afea25\nReturnedBits = 9d793dd96b870dfa0267623bd1c2d8bd3e2c63e9f211340f630fea01358011394154145a10659c4d98274a525c48a90da0126a99b85ed5b4b903195f0dddc762\n\nEntropyInput = ffad10100025a879672ff50374b286712f457dd01441d76ac1a1cd15c7390dd93179a2f5920d198bf34a1b76fbc21289\nPersonalizationString = 1d2be6f25e88fa30c4ef42e4d54efd957dec231fa00143ca47580be666a8c143a916c90b3819a0a7ea914e3c9a2e7a3f\nEntropyInputReseed = 6c1a089cae313363bc76a780139eb4f2f2048b1f6b07896c5c412bff0385440fc43b73facbb79e3a252fa01fe17ab391\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = e053c7d4bd9099ef6a99f190a5fd80219437d642006672338da6e0fe73ca4d24ffa51151bfbdac78d8a2f6255046edf57a04626e9977139c6933274299f3bdff\n\nEntropyInput = f1e0d7b1ac7e4e155bb588500f57d0c59969267ea5427e2d7fde1f9c54e67b7f6562bfc1019b8b5799d2a833fdccac79\nPersonalizationString = 86da37245d9bd1fb59a4bc7abd289ea2999258042c5fa696f2da7344bb6ebc5b770ca284bfe642570b52ef47b780d5c9\nEntropyInputReseed = 9c2c9c07cab12cf50f8846148034a416c83366c1e20776073751553cae69da8d1f6bce6bde27087659d69a62e2ba7c3c\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = e0ac06d7eae89469b6c14a31e7f0464ee21f7b30d2264c2de3e435cb40d0e5043ee13dfbc0342156750880b2d5dddb3bebb43b162a8478235c8b87f96d0284fd\n\nEntropyInput = 1dbee767e9916ab322ba461fbf9f7515cfbcb45944a7b471577da087690d94d967018b631e0c1f64da3c805d049f449a\nPersonalizationString = 966b5cd94019d4d90b48ea7f540a698cfe30d7eb25f5f7e5fe42d9f53ebed6e94e733b0794fc6bf30627911e20cc18e8\nEntropyInputReseed = 96e828128f183c76c90ec8341a43561368b77114048ccb05db66128d54c9539d1adc1d72f7fb0950e41b1343a9e4df76\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = c4d3f5c55d3979b174020650ad7a46b423ec446dff2a9e9fe0a782bf65a72d5fcb1896bc1092a8c73f41295e2e7044434f88aa0aca78f7eac40e322cb7c25563\n\nEntropyInput = df588bff3a1fc97a908067da6a7fef08c889ac29ad7d639bd047157bacab4dbdee3dffe575f37d071af94cbd7628d398\nPersonalizationString = 548715cfb28c1bc56453b8c39e24cfd64077c0f6e9d959d51b9f0667b97d3c4e1a179d1a554df845b24c26daec85845a\nEntropyInputReseed = f8c165b5ebd8347a2ffef2218f993877027e977598b4fdac2f65d8d994c7432900f8407ab5aed1885dee5aa2458f5998\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = deed18220bd8f72a34559924f3cad925ee717690f76bc223d5ffeebbb554b61b9d9eb6ac5697b06331e236672677e2e01d6e3fd581a4fa1ebad289797b68955f\n\nEntropyInput = 98555093e443fe8e2bc8d2eb4d3a7abb8eba00b25683a6b31191fff7c043665ec2cad3e99e55bbc241b8edc699dbc9ed\nPersonalizationString = 5627a0a55457db05e3903d4b69ce15f55f933168d6eb374c044e8f1040f61ed7eb24f87f91c68cde050f504b8965dd81\nEntropyInputReseed = 18d17e1b68378801f83e7aa9a6d4b84d3960022c740e6c845869a5db553d2e02479cd92f3c0d8abd3e92fc9c9fbc6a3f\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 7a7f0ab07a540b4e9a3eda3f8bd1262015d8ea6d512dbea05942421f5a73242ac236009ef083bf2e51b19c40d1a019367a6b96fb52d254e4d881550aef0549ed\n\nEntropyInput = 07793bac6461f23e5eb0d1bc60b5f735515458d1530540df1c8e6fc5c3ebfb06b9db60a8947eb629ff7a375fe680d696\nPersonalizationString = c1e2132b77b6c15742e06e856c1549c4ccebd1b2eda93e2c43391b52cad51490fe34157f57be9eb4eff463b059986680\nEntropyInputReseed = 23e47e0c41462f7c619bbcd5b73f9ab1c68c7cdf1ec92c4c37126402958e110e329107742e70db611b93974c393936a6\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = e6dab4a887f48ec33cb293ffdab5fc69595f94c72c5a9bb43f468f75490190b7e0f14f5c04550cb62a6d0ee0c3d834be3434c8229c124087bb985a06b9a37267\n\nEntropyInput = 25cefa0512921fd4a3a4e5e7c48c6201185a6968419ae5bcc6667bb74c35de4f91988a33f25ea88a8443c65643cc73dd\nPersonalizationString = 07ddf125960c346680b4b361c0a9c6dc1008a85ce1861b45ff18907e6e7db41b046e5f016617e6c5b0ceb5575ac278a8\nEntropyInputReseed = 8cf41e5413b0c8ffacbc4dfc119f10b47569359b911448f45c7ad63dd58e872410c25176b986fee8b83966d0098d996a\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = ab58ec5c35600566dd2ee187a5b67dfa65bebe13333670d2a198fa5af0c20294c6cb69d37564d2b2587ea5587e12341e77f47f173d6cc9f9b9e5dedf0ee1a8d0\n\nEntropyInput = 929f1dec0a6d14de483a2fe114a430796d0b449fca56a4ddbbe661bdc26a8df85cafad7b677ccbf1fe4cb0d5e8cb57a9\nPersonalizationString = 0bf8c590a66653c0494750d10274b583d86e540b517bfc23bb3b0c9fde373e456558468603c2115c97d3662e6825f4f2\nEntropyInputReseed = 84030628534b7525dbd4023aed1ab08c4f2b86a7c2fa3bc9559b425cce07c34fac14e963256aea03f74f1122a7a30483\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 199f2dce5bbe32c693151a216fb36ccea7996c313f6b78fa30ad812a0e603965023fc29706a71b753d79244cb9e8fdaff467e0f963426b10ad89a98e987af316\n\nEntropyInput = 7bc5d970186b9e1b0052b7564dbabf61c89cb3d64ff42f9a62d625112aca0486cdf0336c3612254b40cbfba83ab65b42\nPersonalizationString = a25326fef30f9c94423d99759a1ee575536a9715df9526de9a0b8dbcc3a2234cd835615f5dfe7823927355f569ec6f02\nEntropyInputReseed = ef8a0137013be212402e42b28c03ed6420881aa38b3a3e6e90a861116516df1ef732a19e8935ffcd9be7a2fc236783b7\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 29f81ecf3f41d278c01bba9af9bc0fe6009539682f46723ce5b0ff75fed217ad71580b5dac46289e324d824094c332c3955c528257701a14ec2bfecce4f62a6c\n\nEntropyInput = 0c841a245a19295281163b07541590376d31d86a9be99e66cc22352dabb29f95e113ee233d74d3f2b7f2f608830525f0\nPersonalizationString = 28d3581054d87f153aee12edca47bad80bfc9b066ad1e8b9d96c851dc7b8ed768cad007b891d1c9447d43065b483d085\nEntropyInputReseed = 587a1dae75c2a1f2dea7fb42ef7bf38646b76a964ecd7043d8b62fdd9e6a5c007882f02f78fd040561d15a337e59f257\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = ba7bce080963fe2b4e8f0e1aa700e92b3908e18dc78728666904b0220e4077fef2cd18bbea29a2755a3499798cca445bb75269a5adca2f291dd3875457c69a89\n\nEntropyInput = f4afddabe515ca3e776730e7d44461b27e8f72407ca398d3fb578365e09ea8c24d6c4b09724907a610d755407d38667f\nPersonalizationString = 846bcbc7014ca8c6fb042a80d4a8c3aa50b6c5eff15e4b12f966ab17e6514cbb22fb2eed628ee5c2a8acde821a956078\nEntropyInputReseed = b2aeab1165b150908c9bb52c2b7167c149ea4fb4710edc8acfbc63f7652bb552d636a7e6fc3d1e74d3f65461baaac087\nAdditionalInputReseed =\nAdditionalInput1 =\nAdditionalInput2 =\nReturnedBits = 2a0335c3caeeec7c797f99fbc145654d3985c3c71025c8e4bd4b098801f15d21c272420417d805b0ad1ce68f904502a46130246315957bc07a5db4f3447a84e7\n\nEntropyInput = 6942413e05ac487cf539bc61aa6866ef8cbd9d0f15e1385f37bba5a951a29fc956d46f8740603af7c71800048c8312ad",
@@ -2657,14 +2681,14 @@
     "887d92419e3c839b8b1dc43c6507026f1f851e\nAdditionalInputReseed = 857848c62203307b39728acf11ac8462302d3a41d186778b3f112a86270252f058fbe5767496e47662186b8d0817de02\nAdditionalInput1 = 9a08df0de742fd2e2d55121a58b700dfbff250a4881b02fc3b8952b48ecd4d034d6e7c757cdf91bf7c31dfaf70b1da22\nAdditionalInput2 = 3bf0e4f1291a8bc272cc985878335882c75831510f27963c7c01a879c60c5b67a9a14a656a746a80a091adf6ffb1adf6\nReturnedBits = 69361d61f4cf5ed489888934f320a9acc5383e719f09a1e30b6029bf71d4b4cb54859798ace2d8ee5e681d4acb223b9c119dab2dd07e6db3f7f844c2b46b9c47\n\nEntropyInput = 6f45b55ac62d5ffd452d36b1e4b18cc6abd6ad93e87558b79fbe99b4f4a962b74bad00821019bd126d6f9dd73912acf7\nPersonalizationString = 913a783046baefe428346085fd640caa1874d4aa6974832cacc5b51e78514bcfedd174606bef1721df7a1194a0ccd1e3\nEntropyInputReseed = d9e19ce3197004ab3a4bf995a481149b6d8e59a3970161cb0d3917374c0c86bb5e9bc509bd01b6796fa1e77e5fdddb16\nAdditionalInputReseed = fd31068c90614e04463acdf856b034293a079a816f1c5f3de63b870a9876f7397d2f93bd3f6776b56a78f7178e1fbb87\nAdditionalInput1 = 068e3791b91adb820b27c45a5d8544eed3133486a7d2d0bc503d8abad8b7093f3df214f1e0ac4ff2d347c760b2a605d5\nAdditionalInput2 = 6c55927a349d321d1a2141aeccc3543e9726ffcf3d8fdfe1aed63c61972a213c12ea65d648e476268611e9b08486a648\nReturnedBits = 552b4c4035d964b5eb26e3036445793df67b7321d36e8d2362fe284503b587c961a33b816b40b93d4b006769177c6593c553b6e669076f25a3e2a7214156c249\n\nEntropyInput = 8d492df46257a62e717302992682e28494f84d0f3237c16439efbbd16a94b3356eb7f7c2a0206892045a0d7d36d69f03\nPersonalizationString = b915f3311feadf6676df2389baacccdafc74cf200ed7b99167b33dafa875ce4aac1a61ce54972ec54f9b0901a3b050ee\nEntropyInputReseed = 2e345fe3a471c5066b20f4aaeaaf73921426ac1bc0509e93671535a8fbc016f5967403d6d13b4760491bf973c47a8ed5\nAdditionalInputReseed = 2e8f1f01a7664890feef93152f7b7f05032b4c70c58b5f261ef0a9c2aef23f2a14ee57c3d3465af24289b1c850e52ef8\nAdditionalInput1 = f8c218c996284f757c491cba025fd84cc701f9f83a16f03c314712c2354fee39214ed5994ab24641826bc15ed1bb5f61\nAdditionalInput2 = 146c53dc4af90f26d8c85822810d9bde2949495c23ca2c7c13ceee8221cbe8105491d560e0044c8d50d7e365da41890b\nReturnedBits = b19dd18494235abdcb3b4e99c9355d19d543c7fb7e1048d63d9e25abcc12dcb31549cec2818667713ad1dc35142072ca8daa511927aca71303493e500503be8b\n\nEntropyInput = 2a595f08947d0056ed19ecc8a547867834c125cf1740230a1325b93bf29951cbedcaa6a8f5cbe69801fb9a197ad576c6\nPersonalizationString = c0fb9dbea13863dfbfdb2c0dd864887413794a07a4dd228836f0f6afab901496486a2d508a3f4b784d83382629cddbc1\nEntropyInputReseed = a3ddfc3aefc94dcaf656f4d8eef0065a6d233a76e0a4c26e2d8bbb86459c9e4a173ff8cbec85ebc14712640741427668\nAdditionalInputReseed = d4eb9b12fc2a6fc75a69701c8b5ece02e47f813effb705dbdef0294e38907f5aadf40bdbcc067d0ebc0bf3661a2e0990\nAdditionalInput1 = d3c4bf4f8a3f61413fe1953523ba83bc02ae6d7eea1c8ba288f8e06f0d0276e61667a410f90548d283c4f1ae79483961\nAdditionalInput2 = e6fc29680eef141e1372e17729c9f4407b3f7a57057be1081ce46c78693334bf56867791072d9d18a7b4835bf251712d\nReturnedBits = 08475bfb8e621e12e212f4960e737023f7a3de3b204b6ffeeb929f424ca78c6ae2e0d726237915e5e244616713e88a39df302208e3a324f5444213b70b2e9c09\n\nEntropyInput = 3d5332b91dcaad893df504c7c675b69890b28055dfd3ec7d0ba56990dcda175096ff8f8f9f9ecd6dddeb96b829b98c3e\nPersonalizationString = 34753432b3c6bedc4d2296dffce8a66591b400867f7edf10cee447046f5f767036da9f3f4a02f7b8cba7bdd4365c1fef\nEntropyInputReseed = 1a69af0ff696f9a2fe0fddd26ccf6fae215faf91804461928c884eec13b1dd1501862a738373454e1b449c6026cebceb\nAdditionalInputReseed = dc47e104175f3c9812feed9e143da5cd7e553e3423db5bc8be3b652f577100267ff795804aaf42c3991589e7688a977b\nAdditionalInput1 = e64c0cad3dfc0bf0eba3317cf37b7779b91bf3de3e0ba36d3e16feb0014286596edd364c197847e8732925f971294dfa\nAdditionalInput2 = 1ff3a6bdb7e319a86b35d062cf017ed270c6b5511bc3d63083272e76bf4db9d90e836f18d98f1f79c2e91eeb0bc635e2\nReturnedBits = fdef7e67c3d19f5f74784bdc64d2c23d0a3f027846da2b2afba940fdc2f066d89b63d27e55d3d0a88bddb97e29676894ec8a18268e4bc27d181a867c5a80fe2c\n\nEntropyInput = 156c8c0f44f4a8f17044957b572ed16d54b73a9510d2b260a036ad6ef223f45e124c4ae9dae0fdf5684792da0ff5ea0a\nPersonalizationString = 1472f56d5498564a5b53d2eae27103f41f565d7873b37c37c30472075f1d84d69a8d68c92636ae06aa61678358cc47d4\nEntropyInputReseed = 6bc2bfd44f72982b23b6d22c85f7d601d5941ebe6e9ee9d06a8efe652539ec00b1136adbc4e43aaab76c3ad6a57a267e\nAdditionalInputReseed = a83b1547fadb97e491ef0bdb8b0d006ab16638fdb211613051f0f57586c146882f1062b7f71a8c15bb27200fa83ffcaf\nAdditionalInput1 = ac188da8a895e0807bab61b1ebd73acbe43f99f375c7d29174f675e1667237cedf1d41fc50da277a0db21ee2891a5abf\nAdditionalInput2 = adf9a30b6cd9dac23f193f66df9d606a5765b96cc42c099530c53c26a6d6bcf0779ae060d188e1cc5bdab6c312892267\nReturnedBits = fcc79828bf2c9d3d799d7a0e83583c70aeb156e25df0b2fde030c2775c9986c8054e848128ba38ff5e5b0b1e5b72f9e41726b960008408f5152b1a47072fbdf7\n\nEntropyInput = 5e0dd8e37aa23d0fe79efcb8e5538ee90ffb5733decc83f7677488c4f64c2e0d2a918968a5c7351de9360f23fe606a4a\nPersonalizationString = 5161b794e4a13371b320ae4b2b6b698e4df507402a7582555598089dd9484358d37f891294948512e4198a79de8ca3d9\nEntropyInputReseed = 850ffb89bc23562f3ea03947c1afa7309a0ccdc0b714bc94ff45d66884b74fba0bffce97887f2efc178388f36f0ea95e\nAdditionalInputReseed = 50f605cb940f573c4ef3ddff8caa9a3f544f40fdf583b82cd79338523d896f72f86be1f9bb37d9aca02a2856f713c812\nAdditionalInput1 = da7bcf6810a6b3820548065edbec0fa2fd4bc03e5d50666f98a8bea6b744e04aafa0714582f11b6608852c45ee51df6b\nAdditionalInput2 = 4e9c0c770699656217a0b2dbb466a0fcb0cdb5d4a4a05da40fa2eb546f2f0f28aea575a0bdf6e89352d519db44f47dc5\nReturnedBits = 40ec0e8e3e54cd4fd78f5e006bf3134c378ba619ccf9e7530c79217da631458b5f9135bc8b0d6f2e742c53b58d0ebc18263f9d2ef37a2fa0fb086d2193857863\n\nEntropyInput = 219a364ad362fd8a1d69c1284fd64cc9ec05e6bfbdd133ac9170594b5d95946d3dda2ebcc58deeace86f9dca5ad99c18\nPersonalizationString = b0b27b03fc65effe4610e61916f2e9bd252d47efcc08b84aa505b1befd3a7e9295ca764ac88f099bbecc28301f0f298e\nEntropyInputReseed = 1bccdb4b2ce863fbee104d7a56f2cd88a44a088392883a6db30e6fc7bf5611759c71d53a61fe62b6314d7426e510a722\nAdditionalInputReseed = a06eab3b05eb3649a01be82a356030effdbf45fd71f49b1862ecf33fdb28a7191a34f104b9eda1da4ba48daf9da381b6\nAdditionalInput1 = 88b17e13e02a7e9a3f8263946fae0b6a9052692c3c5cbe858369c4d0b198b9c6a8f4c87ff5e6b2835a7944b911266aa9\nAdditionalInput2 = 828222c8a275427a5f8a963d0d65e92f6170d5089c9a162429c093a28dd69f71135342f16b3baea9a4764e2cc3762267\nReturnedBits = a739f9fee9a40049e42b00b381a1f663877abb776ec655e3a7870bd94bea1a25d3c6d380eced435e498044daf78b349bc1868e4bff6257cf2711ed08e2357201\n\nEntropyInput = f8513c2f6e46f75fce3671ccb3c69158583a873b0dda83d8b1cd548f4e5efd75642f2c23cf8792d51023f31d795f6f5b\nPersonalizationString = e94f7212257885511b15a873d0158fa5ea648846afbcf9d62a7abc4e6909dd43c671fa18bc289f47e2301e9aa69c3e88\nEntropyInputReseed = 487b9c1866ffdaaf6760cdee3df5a930196d30b0ac8db780656577ddfc1ff3508c451ef2b0b478a2cf0c73027597b2ae\nAdditionalInputReseed = 7387b59f8c78e79d36edacbb428fd515ef9e58086059bf7fd642053b0f5706cfe86eb3c35ca0b6f02e5d1304e476e3cf\nAdditionalInput1 = bafc59ef40e59d8c28851212e1c357cce0d06f02c69d14585170ca8eb18396a331d635cf0651319842cee2f7c87285c2\nAdditionalInput2 = 82d905ba69b6c45ca28107beb6698a152631ab48614235f6a9f12e019f66bf326151d9ee84e0cd42b6566dbffb46ec35\nReturnedBits = 163f48d09f3e9ebf9f8647766a0b2e189a2f3a21a5a4e31c8a4f3bd138cc50030ac8bea1c4d9e9aa0b67f34926239fbcedfd1992da165b941cf03b56737737b2\n\nEntropyInput = 0a8f092764d473d48215e947ea8a32b5da8ea86d8ed0d83bce31b1b5a21e7c5f1af2186a39caf9afa61644caef02ef9b\nPersonalizationString = 84637faba756917b0f44ba2e0e26546f5239782e4d9f952ee251367081629e71c20a7459995a7563810daeab74220664\nEntropyInputReseed = eacaded3d89a63b94a5c14c3087306e670fc4ee7d56cafef4c5aa7d553ca89ed34418056a44f5447e2b07dd541ac4645\nAdditionalInputReseed = 104a1541313fc4be9d34bced288c1c1b6fa793e9096f8be5673a2c6825dabef91fd88e45a061b2d897f9b5e8a8ae0ad3\nAdditionalInput1 = e30c9d8aba0bd5dc63d911897e4dcadbeacc3ed9392d8e361b356e02a81d65bdab91f7e9f8dd2b2bf9af0da5100e77d4\nAdditionalInput2 = 2bed42b8c05461ba2756a5f38393d5538d20eb9cf1c06775e7fef7284341f61ccd34b0148d1e870c1992dfd065560ed6\nReturnedBits = 855a6af3e6dddf194ceaafcef6f7ee91f489a61a73b759d41be4d5298510b9902f5b78b1162cba417684519634b578afda9802bd782f04b3a25106f3586ad8a4\n\nEntropyInput =",
     " ed63e3b88a2f0d6a40b7b36a06cd8d40ec10158ab6c4f8dabdb879e45d22db573320d2641bfd7db31eb6bbf4c6330b9f\nPersonalizationString = f82a5ee81f349a69dfa6a6e53b406bb560cb0339f61b3886237023ae4582b9725b8774a8044ec5134ebd4d7606f18188\nEntropyInputReseed = 7104522c2a69bec7e010d9670d7ab92dd817ac7ff05d63ab0e12d431d4c9aef4d715421c1fb5d05d3aecba36859a6038\nAdditionalInputReseed = 3b83034ea440604d0b7d04857623e9adc0eb9aad4a45b2079863eed3d72e65abf67d255673e769a2e2584eea59f1ebaa\nAdditionalInput1 = 8678e4f831887e96a27c3a8ce0963f4b34bbca25791b06526cb6c55624c33d98a0356be624238cecacba3535e872c4c7\nAdditionalInput2 = ec3452ea2722984bbe6a5b7c22ad58df37a854abc8630b9e21bcd0469eb207e5f44e044f5f666920dd55e81a393500de\nReturnedBits = c340765fe7a3479bef2d7d59e321066f8ad0db53aed4c517bf8339566bf877d53921e6de2650d0080529004a5fd32124ce8e58a040e2d55656b37d9ea827cb91\n\nEntropyInput = 882ed05487dce4b4f9e58ec4f2da1fa5d8ebb4ef9fcbf7b0a0e15c4dccb8e19788f86dcf2885e71a20cbd9ac10a6648e\nPersonalizationString = 05f5bc41687ea1e4c34a69944fbae283cfee4c42b1bbd78fddb0973d0fca948539b6843658b67c30b73191b9a0bf2921\nEntropyInputReseed = ca1603d4c8711404c7bdc12c7c75b2943a4b042ea1d2eb54506a6876952157caf3b152dc75f27f2213645a141577e8ba\nAdditionalInputReseed = 83cda53380888d53515e58154f89d5528ab69f31fbcfca34988cf03c4cae5f60aa6291f32d99ab2a726b6e08d2502cf5\nAdditionalInput1 = 5bf5ca9f964edd91e8ef491fd3cd32faf9cb9d1993d8221914d1751fb0d4252a5ca950e213f088050900b2bd74f5e336\nAdditionalInput2 = dba28dc1d8d615651547867d4ef42519045ee16378143685101da47a27b55498078e8a8f4854052f7cc6f5b02e571ae8\nReturnedBits = 01f11971835819c1148aa079eea09fd5b1aa3ac6ba557ae3317b1a33f4505174cf9d7e940821c9b0e5527a1d3e186a7a83f187c62d3223cf5964ff9526d8484c\n",
 };
-static const size_t kLen48 = 6637;
-
-static const char *kData48[] = {
-    "HMAC = MD5\n# Note: The empty key results in passing NULL to HMAC_Init_ex, so this tests\n# that HMAC_CTX and HMAC treat NULL as the empty key initially.\nKey =\nInput = \"More text test vectors to stuff up EBCDIC machines :-)\"\nOutput = e9139d1e6ee064ef8cf514fc7dc83e86\n\n# HMAC tests from RFC 2104\nHMAC = MD5\nKey = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\nInput = \"Hi There\"\nOutput = 9294727a3638bb1c13f48ef8158bfc9d\n\nHMAC = MD5\nKey = \"Jefe\"\nInput = \"what do ya want for nothing?\"\nOutput = 750c783e6ab0b503eaa86e310a5db738\n\nHMAC = MD5\nKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nInput = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\nOutput = 56be34521d144c88dbb8c733f0e8b3f6\n\n# HMAC tests from NIST test data\n\nHMAC = SHA1\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = 5FD596EE78D5553C8FF4E72D266DFD192366DA29\n\nHMAC = SHA1\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F10111213\nOutput = 4C99FF0CB1B31BD33F8431DBAF4D17FCD356A807\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA1\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = 2D51B2F7750E410584662E38F133435F4C4FD42A\n\nHMAC = SHA224\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = C7405E3AE058E8CD30B08B4140248581ED174CB34E1224BCC1EFC81B\n\nHMAC = SHA224\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B\nOutput = E3D249A8CFB67EF8B7A169E9A0A599714A2CECBA65999A51BEB8FBBE\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA224\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = 91C52509E5AF8531601AE6230099D90BEF88AAEFB961F4080ABC014D\n\nHMAC = SHA256\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = 8BB9A1DB9806F20DF7F77B82138C7914D174D59E13DC4D0169C9057B133E1D62\n\nHMAC = SHA256\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nOutput = A28CF43130EE696A98F14A37678B56BCFCBDD9E5CF69717FECF5480F0EBDF790\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA256\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = BDCCB6C72DDEADB500AE768386CB38CC41C63DBB0878DDB9C7A38A431B78378D\n\nHMAC = SHA384\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\nOutput = 63C5DAA5E651847CA897C95814AB830BEDEDC7D25E83EEF9195CD45857A37F448947858F5AF50CC2B1B730DDF29671A9\n\nHMAC = SHA384\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F\nOutput = 6EB242BDBB582CA17BEBFA481B1E23211464D2B7F8C20B9FF2201637B93646AF5AE9AC316E98DB45D9CAE773675EEED0\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA384\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7\nOutput = 5B664436DF69B0CA22551231A3F0A3D5B4F97991713CFA84BFF4D0792EFF96C27DCCBBB6F79B65D548B40E8564CEF594\n\nHMAC = SHA512\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\nOutput = FC25E240658CA785B7A811A8D3F7B4CA48CFA26A8A366BF2CD1F836B05FCB024BD36853081811D6CEA4216EBAD79DA1CFCB95EA4586B8A0CE356596A55FB1347\n\nHMAC = SHA512\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = FD44C18BDA0BB0A6CE0E82B031BF2818F6539BD56EC00BDC10A8A2D730B3634DE2545D639B0F2CF710D0692C72A1896F1F211C2B922D1A96C392E07E7EA9FEDC\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA512\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7\nOutput = D93EC8D2DE1AD2A9957CB9B83F14E76AD6B5E0CCE285079A127D3B14BCCB7AA7286D4AC0D4CE64215F2BC9E6870B33D97438BE4AAA20CDA5C5A912B48B8E27F3\n\n# Additional HMAC tests from OpenSSL.\nHMAC = SHA1\nInput = \"My test data\"\nKey =\nOutput = 61afdecb95429ef494d61fdee15990cabf0826fc\n\nHMAC = SHA256\nInput = \"My test data\"\nKey =\nOutput = 2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776\n\nHMAC = SHA256\nInput = \"My test data\"\nKey = \"123456\"\nOutput = bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd\n\nHMAC = SHA1\nInput = \"My test data\"\nKey = \"12345\"\nOutput = 7dbe8c764c068e3bcd6e6b0fbcd5e6fc197b15bb\n",
-};
-static const size_t kLen49 = 158570;
+static const size_t kLen49 = 6637;
 
 static const char *kData49[] = {
+    "HMAC = MD5\n# Note: The empty key results in passing NULL to HMAC_Init_ex, so this tests\n# that HMAC_CTX and HMAC treat NULL as the empty key initially.\nKey =\nInput = \"More text test vectors to stuff up EBCDIC machines :-)\"\nOutput = e9139d1e6ee064ef8cf514fc7dc83e86\n\n# HMAC tests from RFC 2104\nHMAC = MD5\nKey = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\nInput = \"Hi There\"\nOutput = 9294727a3638bb1c13f48ef8158bfc9d\n\nHMAC = MD5\nKey = \"Jefe\"\nInput = \"what do ya want for nothing?\"\nOutput = 750c783e6ab0b503eaa86e310a5db738\n\nHMAC = MD5\nKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nInput = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\nOutput = 56be34521d144c88dbb8c733f0e8b3f6\n\n# HMAC tests from NIST test data\n\nHMAC = SHA1\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = 5FD596EE78D5553C8FF4E72D266DFD192366DA29\n\nHMAC = SHA1\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F10111213\nOutput = 4C99FF0CB1B31BD33F8431DBAF4D17FCD356A807\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA1\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = 2D51B2F7750E410584662E38F133435F4C4FD42A\n\nHMAC = SHA224\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = C7405E3AE058E8CD30B08B4140248581ED174CB34E1224BCC1EFC81B\n\nHMAC = SHA224\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B\nOutput = E3D249A8CFB67EF8B7A169E9A0A599714A2CECBA65999A51BEB8FBBE\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA224\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = 91C52509E5AF8531601AE6230099D90BEF88AAEFB961F4080ABC014D\n\nHMAC = SHA256\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = 8BB9A1DB9806F20DF7F77B82138C7914D174D59E13DC4D0169C9057B133E1D62\n\nHMAC = SHA256\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\nOutput = A28CF43130EE696A98F14A37678B56BCFCBDD9E5CF69717FECF5480F0EBDF790\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA256\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263\nOutput = BDCCB6C72DDEADB500AE768386CB38CC41C63DBB0878DDB9C7A38A431B78378D\n\nHMAC = SHA384\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\nOutput = 63C5DAA5E651847CA897C95814AB830BEDEDC7D25E83EEF9195CD45857A37F448947858F5AF50CC2B1B730DDF29671A9\n\nHMAC = SHA384\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F\nOutput = 6EB242BDBB582CA17BEBFA481B1E23211464D2B7F8C20B9FF2201637B93646AF5AE9AC316E98DB45D9CAE773675EEED0\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA384\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7\nOutput = 5B664436DF69B0CA22551231A3F0A3D5B4F97991713CFA84BFF4D0792EFF96C27DCCBBB6F79B65D548B40E8564CEF594\n\nHMAC = SHA512\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F\nOutput = FC25E240658CA785B7A811A8D3F7B4CA48CFA26A8A366BF2CD1F836B05FCB024BD36853081811D6CEA4216EBAD79DA1CFCB95EA4586B8A0CE356596A55FB1347\n\nHMAC = SHA512\nInput = \"Sample message for keylen<blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F\nOutput = FD44C18BDA0BB0A6CE0E82B031BF2818F6539BD56EC00BDC10A8A2D730B3634DE2545D639B0F2CF710D0692C72A1896F1F211C2B922D1A96C392E07E7EA9FEDC\n\n# This is actually keylen>blocklen, but the NIST test vectors have a misleading input.\nHMAC = SHA512\nInput = \"Sample message for keylen=blocklen\"\nKey = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7\nOutput = D93EC8D2DE1AD2A9957CB9B83F14E76AD6B5E0CCE285079A127D3B14BCCB7AA7286D4AC0D4CE64215F2BC9E6870B33D97438BE4AAA20CDA5C5A912B48B8E27F3\n\n# Additional HMAC tests from OpenSSL.\nHMAC = SHA1\nInput = \"My test data\"\nKey =\nOutput = 61afdecb95429ef494d61fdee15990cabf0826fc\n\nHMAC = SHA256\nInput = \"My test data\"\nKey =\nOutput = 2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776\n\nHMAC = SHA256\nInput = \"My test data\"\nKey = \"123456\"\nOutput = bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd\n\nHMAC = SHA1\nInput = \"My test data\"\nKey = \"12345\"\nOutput = 7dbe8c764c068e3bcd6e6b0fbcd5e6fc197b15bb\n",
+};
+static const size_t kLen50 = 158570;
+
+static const char *kData50[] = {
     "mode = 0\nkdf_id = 1\naead_id = 1\ninfo = 4f6465206f6e2061204772656369616e2055726e\nskRm = 4612c550263fc8ad58375df3f557aac531d26850903e55a9f23f21d8534e8ac8\nskEm = 52c4a758a802cd8b936eceea314432798d5baf2d7e9235dc084ab1b9cfa2f736\npkRm = 3948cfe0ad1ddb695d780e59077195da6c56506b027329794ab02bca80815c4d\npkEm = 37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431\n# encryptions[0]\naad = 436f756e742d30\nct = f938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218a355a96d8770ac83d07bea87e13c512a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[1]\naad = 436f756e742d31\nct = af2d7e9ac9ae7e270f46ba1f975be53c09f8d875bdc8535458c2494e8a6eab251c03d0c22a56b8ca42c2063b84\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[2]\naad = 436f756e742d32\nct = 498dfcabd92e8acedc281e85af1cb4e3e31c7dc394a1ca20e173cb72516491588d96a19ad4a683518973dcc180\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[3]\naad = 436f756e742d33\nct = 6b0f4cd351730cd25993d8ad0f11bff1ef2c3a957cb4d8694bb06c60a2937385da1b47a11595dd7a9a28f76c26\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[4]\naad = 436f756e742d34\nct = 583bd32bc67a5994bb8ceaca813d369bca7b2a42408cddef5e22f880b631215a09fc0012bc69fccaa251c0246d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[5]\naad = 436f756e742d35\nct = 23aff4f784452e70b6c2adc5c84237dae34a91246460f497b753822086fc8ae5fdd770f3c1637086e860535864\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[6]\naad = 436f756e742d36\nct = b101f7842383ab460f22dcf919e4bcc3f1004246db7b64a40e7add713838bda69c601c4287d351fc075de3f965\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[7]\naad = 436f756e742d37\nct = b46b92359b09f5b77efad33bd96c0068212a7652bb3db182c0e40cac71fdbae0ff213047384c969df46100c3ce\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[8]\naad = 436f756e742d38\nct = 49d450f5d0bdb3d8850cc9fe1ca5ffece5075280d3aea7b1a309d0ef2dbc71f7a3a4e32205e5c53a14ffbd7524\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[9]\naad = 436f756e742d39\nct = 2f8a3cbe444213a1fad01ad1b328e464f03edee81243bfdd5f1e67ca41ce14fbb0c00ae9a3f5c4dfe20e1a7bf9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[10]\naad = 436f756e742d3130\nct = f5575c1560c23ba23ea1d919776cbe6e42829097d918dbff28583ecd2bcbbb7fb2a035ea1038eb435812e8bece\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[11]\naad = 436f756e742d3131\nct = 7809bff8c8f0122f1ac5f179443983ad0486ec3a3420353a6d91eae9ae3dd67f871c99a46054e04b96dd220fe2\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[12]\naad = 436f756e742d3132\nct = a5dadd95ac76b59aa9d2cfcace5c19eefa20ea4f9ae98f86bd1373fe19c930c2a9c31ee7fa7f96ff92885dfecf\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[13]\naad = 436f756e742d3133\nct = eecfbd7cc0ff49800c25b9dc9f0881893b275b7654c8560048a2a982663ced5860aeecde40e7e99c5512947ec5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[14]\naad = 436f756e742d3134\nct = 9325ba3d4ae25b7494432993a1feec051f20d60afe19953c7f41463774b154be00e52fb29e25566a32358fd9d9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[15]\naad = 436f756e742d3135\nct = cb93b418d2070cb290a01565c413fff6f206d70c7e85512c35d109486f8e28950b1951f8d420ff1c58464afbce\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[16]\naad = 436f756e742d3136\nct = 1d565b4c9b6fae2b7513a5a8ebb5285a8865734ce3f02cd7691449c60b1157c9a5b0d1c4b3ab8bf252a764a4f3\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[17]\naad = 436f756e742d3137\nct = a376dd08d1fcfc7d2fcc1bcb519cf9e10b6249fa9c02662e3d5f6cdda5e192034f19477a07f37adf6612c863f9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[18]\naad = 436f756e742d3138\nct = a6d0fef032c38a97a76c95698270f779368cdefe837ebd39120bb867e34e3ff0e07112d48cf82624fb4996e5a6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[19]\naad = 436f756e742d3139\nct = 75494cf44a66b3930ae98865028c415329c326da8d0370d404c5f36da228a08754e67584bd07aa3a4a625a751d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[20]\naad = 436f756e742d3230\nct = 0f24fad490d9a581a635516006ad7ff4ffa196ceebd6509ba6e172aa1b59da60bd2b3fcc374f956672377c4b40\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[21]\naad = 436f756e742d3231\nct = b4f5b4147bbf66407d19fe5947c91d0b7eeb80dd3d97f8d10bd248126e92468dceeb8d75c0c4f90a5c9d04e538\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[22]\naad = 436f756e742d3232\nct = b95636af74f15ef84a35b7a15b5d674bf2732c95e24f5cba6621dae03087778cdbaa3ce526000c18471044ef2d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[23]\naad = 436f756e742d3233\nct = 80893e132d80f878575a5823b5a0f53cefb909350faba8b2be46a700f254f8dc8b627f39287b5e7dff4685b5e6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[24]\naad = 436f756e742d3234\nct = 3027f6ded51e5d1dc08055162c5ea4391ae78144a1bfcea76e78665e23b665351e5d294d785718b58bbf0cef20\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[25]\naad = 436f756e742d3235\nct = 115013b0e9571fe5adbd2e6c8f2fb342413b45fa8774112def20afd37c837657bee0561ce5958cc62bc996c0bb\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[26]\naad = 436f756e742d3236\nct = 8a261c7bf47ad9955f14ed7d23e3af4a3c49207fd3bb861714c9562e01df89f67f5b4c204a3f9981ab81c215fa\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[27]\naad = 436f756e742d3237\nct = 1c4813e184dc263c495b6944bab183585c24d3f68c719580a51e6e2bd78c219f9e01f7db082a3a41a33c19b4d0\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[28]\naad = 436f756e742d3238\nct = fa873313a5d313bae4724d007072e1294a066994efc2a68c28318f750806cb98c0b58c8eee565ce3d2bfcabccc\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[29]\naad = 436f756e742d3239\nct = a586d2e92499b32199a31a252fd5323c0b7483b0fe5568bbfd88d845d36396027f238b9a9a7a51a6921bd8786d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[30]\naad = 436f756e742d3330\nct = f4edb9b76d8c3152bb52f8d58940bab09919f7d5b53d776c57d7b7decb0aeaf94f34ef0b7a5f1ee9ef0ee94b00\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[31]\naad = 436f756e742d3331\nct = ac143d5f263851dbfb7f6332664f7bdb8d944bb519e2f9bd1d01340400563847e24b78edb0f833b50102857f28\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[32]\naad = 436f756e742d3332\nct = 01b0bf550b7b39f6ba0a3f5bd39b8e35fe1721fa08b32ec7adcf7da3d8a605027b456a88da073077c567aa9c23\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[33]\naad = 436f756e742d3333\nct = 7712235314485e61455a897b7b7965c656a4cf0ed9bbb7f156983a24d4520bcdd5b65afaeededb3296ec3cc9d8\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[34]\naad = 436f756e742d3334\nct = b7b5beccc1a1672179065992d1d4de75bf435509e0fd1a3ee6a4ea865de64f7387e54850ec463b878cd7808087\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[35]\naad = 436f756e742d3335\nct = 1a6d8d50001d875e31f0c6a491359605369b18aad9e94bba37fc12de53a96e84bfd3bad47b98519b5de9936c10\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[36]\naad = 436f756e742d3336\nct = f58d2816634c7cd43a4dc5c904817a0fcef4ae72e75f38d5b7376e7397998be48e10691e105bf259c33a01d8c5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[37]\naad = 436f756e742d3337\nct = 86edfe5fac0a7d0c91abd96b29be8617881c8dd60964628f93537e0d11f09bc4fa13abc4e57c1bc0df4f7b0600\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[38]\naad = 436f756e742d3338\nct = 922aa471310d038de267d919867fae99d54715563ae9f755ebd2ab48e9d45b8375fcf77e6ac8074f92d8b25546\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[3",
     "9]\naad = 436f756e742d3339\nct = 79897532bbdf8cbbf3a1fc4aafe1fe12011810d25981ac2c1930a575cf3fe32324385c2898f7720a8764de677c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[40]\naad = 436f756e742d3430\nct = b8ba5849c031f8089eb724c65d5eecba4a02fb03f26c9e185a2cd76cd8a6de803338b22b8fe8799ad6ad8ed62c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[41]\naad = 436f756e742d3431\nct = 0b64fb8a7eaf3be9e2d9e5e1ca87ffc34e812108303f6c983109acdb1a2b71ffcffd35e66ca16ebffcdde07db4\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[42]\naad = 436f756e742d3432\nct = cc83e8120748d0c2bf7a37a24265047817c54892231dfc105bc87c7e05704a1102e1b6cba77e59438eb8da18f0\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[43]\naad = 436f756e742d3433\nct = f2975c7f7ad4289936993a728334957160a716ec854d41df436a0f7ffd30134a3978d5161c86b3b72bfc667544\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[44]\naad = 436f756e742d3434\nct = 2901f92e3749d8d4827a69bbb002769ac17995f9dab380de0e8f9e082137dc30e289893d18a8f21834a7a5d54b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[45]\naad = 436f756e742d3435\nct = d1816064467cc47210eb25cab7ddc47cfb1a9aa5a3421f461e6266fa85c6de96afd430ee8e0fb29febbe947338\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[46]\naad = 436f756e742d3436\nct = 007fedbbfb53b8bed063e3dd5d0d0faf3cdaa8638c68259cc68e601ceebc3fa0d7aabf8eef6f6e2d356e8adcf8\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[47]\naad = 436f756e742d3437\nct = 0451a985fd7ae7a22d7fb2e93f7fb4ad5bd8a49dc723b438feafc4650c02f3764668e728a95c89276dcdfc1ad5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[48]\naad = 436f756e742d3438\nct = 999cb87e121a9adb7b6179b9a1f70434a9110ca25b72eea89c56481f83757e1b013ea0c3a17eb771e9ca641179\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[49]\naad = 436f756e742d3439\nct = f6f8c9ea5029d30937571b85a750e5ca372f437f02ded4e4ccebb8f9a69c1cbde753e4000f272268254b0ee05b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[50]\naad = 436f756e742d3530\nct = 1497f44ec6d1396377a5f905fd779a4fc47779a5cc91f7471c52fa8d7e2355b779780919c762118b6d0ff4e197\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[51]\naad = 436f756e742d3531\nct = 302a216277bf30fd9907044192a2ed68c9f5bad7cc80f4a43b08d46199c21251eabf7f0a72349445d5553953b5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[52]\naad = 436f756e742d3532\nct = 85fca2a350545edbdbc9dbae4ea0d53cf0c5c59e0c5ba3e0c78bc4191b83b775b7767a63175db8fa5d2b092ba9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[53]\naad = 436f756e742d3533\nct = 54219f225567f98df7fa6c0843e08c382a352300c5f933b0eea585c97c83b8130f4fa006ea6f7d6c752f56f24d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[54]\naad = 436f756e742d3534\nct = 1c63c110d2bd3382f2d01869e7cb0c9c3cefce54a80d4652cf8b4013538d9a517586587edb01bd4436f844c8e9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[55]\naad = 436f756e742d3535\nct = 57150b1d36af3605fc66764ce07d5dafda5420d09c875a176945a43a1f718f1d868bea8b10ee8970bad900585a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[56]\naad = 436f756e742d3536\nct = ae7431872eb110de13baf39a3cdc7aaa19f0dcd8e4a7a36590562f155600d421beed065b99bd5dafb60501aa84\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[57]\naad = 436f756e742d3537\nct = 9158e15fe9608e89913c13117fb78d61aef4ae6e4e1cf2e00214ac84ceb0da7ee0175e9a903a23d2d3be06e8da\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[58]\naad = 436f756e742d3538\nct = b1a6c9dffcc0ad109862cb1733e680bde703e726179f1df4dafbf832ac9b37a2cee9c997b522791ac1e166d175\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[59]\naad = 436f756e742d3539\nct = 8e12c961da22502ee54caf4ff7ef49a7197761a77ddba9f980077a0e7e5f025091e9762a79f4f6e06d793e6e8c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[60]\naad = 436f756e742d3630\nct = a9662af8b1c5c322f54bf9016e1418595f267918cd6efef045bce86feb3a5b9fcae884dd21bbd44fe45543188f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[61]\naad = 436f756e742d3631\nct = dedd1bae324ceb12428043686c4cde519e6f6e3b50977b6257a927f5cefea7c07fc2978f6aa3cc420e24a33ca6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[62]\naad = 436f756e742d3632\nct = c20e3b06f604743449534e3f590b4398e8101098571b4971e07dba987869d5f75e30106efba025e31d543a333e\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[63]\naad = 436f756e742d3633\nct = aae857fa33d40cea2d5a7d7fc213013037709e86ed22d29bb7617dcb52c136a461d017d48d02006ff264cf8594\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[64]\naad = 436f756e742d3634\nct = 3404b8a603fafa37ce6377a2b65cdd6c53e566750ffe0e95d4f7243cba3d044507c6792400a91a551e03076299\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[65]\naad = 436f756e742d3635\nct = 4c2ed41a49485b292346afd28a798f2639f9078f9c5b0c318582e1cdf4cd84e723fd1b790f69828d4fb953ac1d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[66]\naad = 436f756e742d3636\nct = 26fd94cefb27a210d6669802c7cd439ea940a83fbf290eb0b9b7d166d8a0d31bdd623e4d2c3aaec44db15e4bcf\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[67]\naad = 436f756e742d3637\nct = 0707c98968bfee0343e9fabc86fc6b3a6910a4d2272feb3654b6f6f1c19c3251bbe1349519e8b720eec2b027f2\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[68]\naad = 436f756e742d3638\nct = 27efcf37b480d38abb0e721e9c9e27c48c5c55f8d9298e2d532fd3bbdb94d9ae0bc93c9f30e23292d50ce9bcae\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[69]\naad = 436f756e742d3639\nct = 8c7a06799181970e5e37afc7ba7b9c363e46670ea907047ba1b2020600a9f19fd3b497551602d287a7ddd04da8\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[70]\naad = 436f756e742d3730\nct = 01ef6860434c054d0d1bf7325c9cbd4e929b0da00b1fb486321da6aa59428b3dbeaecc653ff1f0a8c4e81d1fad\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[71]\naad = 436f756e742d3731\nct = 5cb605f39231386b8d8566c1ccb7630475dbc2b9c98d63682e99102c63f8aa53e597a7ba0021d04d20c45ebf08\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[72]\naad = 436f756e742d3732\nct = 2f4be39a792de469e90417c537b00adb7dde3c5824126cb4d7173fce5f42ecf1d60e9ef94e7d46d2962aded25e\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[73]\naad = 436f756e742d3733\nct = 1ac5d5a0282b8feda589a0b23b47563beb031b985e7beb21a20e2fcf05e952ed2e6bf6a5728e78d1a0ac44b3ef\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[74]\naad = 436f756e742d3734\nct = a612cbfcde1f6cc45960ca6487a99603cef7c6048b244702ecee87bd9fb4918ee1d9907c3cb2cb94f98aecb38c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[75]\naad = 436f756e742d3735\nct = a67d7a21299f8ae24fa49eac42136378b37430577e251b1a4e10c5d0536627eb552499dad55a02f31c423d4959\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[76]\naad = 436f756e742d3736\nct = 55e2a69619637bb660194b78e8abab23940be918de9c328d11fe8718fbf716d4b20aa5f5af03c04625ee1097e2\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[77]\naad = 436f756e742d3737\nct = 1e444851dbd27918d0b613584b57dba343db268fe3839e659400499c57e84dd07bdeb17241c0a63efaa5bff7eb\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[78]\naad = 436f756e742d3738\nct = 5076032b4803292150299121c39ca9dbf6f7e63a397140c3c735c9c1a7b7c903bb4f1181b913f4602e5298b06c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[79]\naad = 436f756e742d3739\nct = a3dafa222c1984f1a739c5438f64b5bcfeb237b18143e3fea787c01de8a06d07d148d9c89856643b65c850423c\npt = 4265617574792069732074727",
     "574682c20747275746820626561757479\n# encryptions[80]\naad = 436f756e742d3830\nct = 86f3e8f09a8b6ffd31199a3a6589003158f7a264f74fdd90d9bbc1b5d1aa4d9832248f09499ed34332f37998ea\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[81]\naad = 436f756e742d3831\nct = 1ccda8e30aee17fe4420d55a6895316308b083beaa0bb4846044e842f70057f87813867a50ebf3c46a2a621e2d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[82]\naad = 436f756e742d3832\nct = 9a8d9bef87933a6e6719f2d4b455898804d1f6b4f9b164d6782165ba190cf350c4513941d90bc1ef3fcff5f42f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[83]\naad = 436f756e742d3833\nct = 72b9fb04b16ba1e4bf415508a10de5602dd220c70e2213698dde2093d976c14dd29d71f85165bc625764275a7a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[84]\naad = 436f756e742d3834\nct = c1e4550971e20406c6a4df36d82916b7ff21a623980efcb08f1bf3555b8a46ec6709088403dfec93bccb28082d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[85]\naad = 436f756e742d3835\nct = d1734abd432ad375c7d07575723e1f62db2222cc6587a763d75273a65be3f2114537c2a15286b232b4b755609f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[86]\naad = 436f756e742d3836\nct = fdb23db80f5b3f4cf7ca8372300d64dc22df49047f7ac08f2c87d61e565014064b9389af0b1b8ab192062cc0fa\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[87]\naad = 436f756e742d3837\nct = 9f7c1ae175825557a6bd4831c69b5c1b230310c5c148300b5063cf8a694dd68875ab99d9655881cf048ebc0f8f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[88]\naad = 436f756e742d3838\nct = fac0b84ca769e8127647616fe2c1bc9b82e6ea7e30dca140bb8d9f51c15c46a19a07a9a6b4c3ed2c8f861c1ab9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[89]\naad = 436f756e742d3839\nct = f8132abfbe8ceb59eb95e81d3fa2edf29a4edbdd1484fac75d234a4e337bb44c7c746df46dd7fc291368c91b0c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[90]\naad = 436f756e742d3930\nct = 4b6b3757d40d0aabfdb386ca7dc035aff0db22792c4ed143c6c8974418dfb3b06716a757e7d57559e9e5bce53b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[91]\naad = 436f756e742d3931\nct = 7441092041f5daa0ccc3039c69b5b632bb940249b7f78570b603d07004d72de0f6fb99fa9c571981d795d84d9b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[92]\naad = 436f756e742d3932\nct = aa32e2b8842f29b25f12ade4c13127c6fd35a54836ef41dbe60ef5c3a707940e5a965d1c3983aa2cafbb6b1953\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[93]\naad = 436f756e742d3933\nct = 19b5e18fed35df03ec9666383f175a0feeb992b793262a3931a39cea5952a9240957280e763756e8e42bbb3282\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[94]\naad = 436f756e742d3934\nct = 9e0e04a1169d08d1476b875ff38f08a0eecc92ae0594395cd7f23bc6639c5fb3954e2b9129775d21951f099b12\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[95]\naad = 436f756e742d3935\nct = 0ad315c17cd383eb41f9c0939327a6eb7cdfcd827a2941f2d3d8d1768eb031b7796a40570d2230616bb331e09a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[96]\naad = 436f756e742d3936\nct = 111d003e82c2b867f7989fa420dead7e2d41ec416cdae69d65d7864733f2d7b7dacd7a17512780c1119505bacf\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[97]\naad = 436f756e742d3937\nct = cc8e6220ebca8ab1053b893fb2460ec66ff28337b158c9efc5631af4fffe49cbc3b72a6524485bca11994dd0ed\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[98]\naad = 436f756e742d3938\nct = 94d7bf876d568146f05b2bf9bbb05a9debc2f64c1d285a4555a0de65b154d383c302b072eca2f65d12ce826148\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[99]\naad = 436f756e742d3939\nct = 8050d2ae9762a4c19bd422d6b94064bf8fabcdc87d98c8b048ab5ca03454201ec055488da7795cf06893c9a89a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[100]\naad = 436f756e742d313030\nct = f85a67e67e44d24b009872fdcb3084225c2805df1ae029793d3320d5e4ce97c756b08b9f0f829b5b37cc07d6f0\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[101]\naad = 436f756e742d313031\nct = 39c90a0c218625591ff0c8dbf7f6e8e0ebf92279b1199b58b55e0a278d7f24051b6c733ce74a0b806d16c59eed\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[102]\naad = 436f756e742d313032\nct = db08e7fe6e307ae61042b2da2c46ead96171914f3b5668afa0aa55ecd00fa760b74bcad66ef8dce4e3f29ca2c3\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[103]\naad = 436f756e742d313033\nct = 309d3e5fb0c51342033b438002d6e846555952921017177434444683a95d225e7ec4a3c14ad6e6ad6411facaec\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[104]\naad = 436f756e742d313034\nct = f27179ad35d2d96181dde3b6569a1ebcbf1fc151c5dbf14ce747fc109fb95e5732e99b08f91df32cc38be09a58\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[105]\naad = 436f756e742d313035\nct = 246386a4bd5d7fe9a386a0b76269baba96b16378a07825c72f676bc76a4fb5d525786ed10da6baeffb897848a3\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[106]\naad = 436f756e742d313036\nct = d977676edf9981c83672c3e062a3251e2e07b6fbdfdc139f678afe90832009102f28fe4b63be25374c4dc20db1\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[107]\naad = 436f756e742d313037\nct = ea17beb33f417dace9dadc51702e2baf43dcdce364abc1f70e9c73e134a102413e10916bd2d128b7f64ff24698\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[108]\naad = 436f756e742d313038\nct = 931cd288f6a18fcb9b836176bc49918d8c6b8d24fce3b26782ba6323e0d01f0ed542c666d69a5e1adf8e28f88d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[109]\naad = 436f756e742d313039\nct = d5dd7cc956759e1b2eb99cf049e8eea9d754de9617f308f9f215a3c1d7cc76b88c7b45eb66a1ea414f10f8bfa8\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[110]\naad = 436f756e742d313130\nct = bb407a18faa9f580fc417725f6d8f3a3f5d7972711f7adcdb7a79d5e2db9668ca444d6045891590a384c3cc57d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[111]\naad = 436f756e742d313131\nct = 8e7949a490d9e1893766586fa30ab84ad1de6379a1fcc5c73700b748576a3726da32036e08b166227257409393\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[112]\naad = 436f756e742d313132\nct = d81c4ce027db2322d6f450736279d5954502a7b4a4a60e58a4454443ed9243de2b805cd6a44de1e815377fd917\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[113]\naad = 436f756e742d313133\nct = d50c4ec8148090f231ed8c5beb042c01f12923fb8ac6043325434fcbf5075b1e629e23d7ffb50c38c61974527f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[114]\naad = 436f756e742d313134\nct = 059f89e9d8c1a2a81fcb9fc08328396b83339ec2583d6582161af67944819283a2c8216ac717fe3c52564b6c4a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[115]\naad = 436f756e742d313135\nct = 48f4723289cded2b3186dc81adec430dc462f3dff6a1fe76c113a105f15efdfcb61618456b4ea514b0f94ac049\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[116]\naad = 436f756e742d313136\nct = 36914027bc50597d58312645d452b4956d51730831d4087494bf55d243b682e706baf4af30fc140d4c7e8760b0\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[117]\naad = 436f756e742d313137\nct = 5bf15badff51ad5902e80fb019bf22c7de3828ac70717b0e093ce03d0d5e31f807923cf2adbed8d148a95e20c2\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[118]\naad = 436f756e742d313138\nct = 0afd4ae86b1006d622cfebc369ab16db3fdb6f5a35613016a015d1e99ba3e3c978df4d0d35d0a2f9f06fafaee5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[119]\naad = 436f756e742d313139\nct = 961fe5dbee9b80900d894136c48d9b2f72f333d33c9e3dd6f7b6e220831805859fe70fef5c8d2e0779c035ff02\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[120]\naad = 436f756e742d313230\nct = ea658fd7a",
@@ -2686,54 +2710,54 @@
     "78b74268d7a50c994653cd3443efd4fb50adb13a6d6c79ca9ce\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[205]\naad = 436f756e742d323035\nct = 8860128148e7fa751e2176bdd0989f81699f4a6f8db8b9bb9a740878bb98c1da926b34e7f10326527ba27dfbb3\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[206]\naad = 436f756e742d323036\nct = d79816873a6e24b3738576e66ee2a3cd2faca1a8e6300e0bdd7932f7bbc2908f02af2bce13ebdd6cc108f4c9aa\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[207]\naad = 436f756e742d323037\nct = 6925df0f28576eff6d3a575e8917bd1b94d3f656299e6d7f10b6cef87d0a228051c21e8c4adb6202396cc4502c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[208]\naad = 436f756e742d323038\nct = 45465e087d0b390d3a13351a12ddc2c20b3055d2868be79465bec9a5eeb114a034dc04964928d973313b3a9f61\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[209]\naad = 436f756e742d323039\nct = 92d94f52220fb8908a226599d67f101d8803a6b38a59ca1cd439cd42fb3e9dc3cbcb4449e36449e5f9823476fd\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[210]\naad = 436f756e742d323130\nct = e95cf8938a01158d09ff66c37a5436d6118db2aedc449951126ebf4184da493803a7cb6a71dc0e09cc46d42a22\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[211]\naad = 436f756e742d323131\nct = 95ea0e88e2cb4b88c1669d9567de88a8f403849af9a74254e906ef595586b2e168eb0cfa2d6d258dc7b75e1ee2\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[212]\naad = 436f756e742d323132\nct = e5c938d2605a5eb68fd5dc37a3ee20a83633ed5e5dfad218bcb2d8962eec2346ed040b4eab2a95b44fd98220fd\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[213]\naad = 436f756e742d323133\nct = 9f75c8ad1becb7a32fcb307c5b29a91c53c7e6a745ae7664071d4aa3bd23c8e99859f1c4731473948a01655e57\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[214]\naad = 436f756e742d323134\nct = 5b1e23823276f8ad3a202ae5403efd60eec67238703767f85e2f7d2191670491db06e109a0a23c47cea7ea7f0a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[215]\naad = 436f756e742d323135\nct = a954766abb4da6228599061eff24e6e488dd28e645044cd2ff194114dcf8676da441f5d3d6f6a95156edc01d58\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[216]\naad = 436f756e742d323136\nct = 08388a64ac543cf748ec47e7e6080a38ca18d40eb3ddf1efdbebcd57d3f357aaf7ce57f7433601175bbc2a97e9\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[217]\naad = 436f756e742d323137\nct = 41d792afa8a74fd0d9bf4d9cefb406d9208b3364dd9a4059234ec9c3d5ecc08d5dda0e8df119467663f8b770c5\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[218]\naad = 436f756e742d323138\nct = a765697054b7d1bcf82d5a3869f01ad632fa412e23f8b517ac4745e2f34954c422f108256d36b7c12ac942a9d1\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[219]\naad = 436f756e742d323139\nct = 164e696bd9a10e227fe9a3582e40574fe59d225661c5cf09a7c75423f8ddc370337292bada80e48b9f7d88628a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[220]\naad = 436f756e742d323230\nct = fb6d6c347a61f7279767a92897ebfff446e929562315ab50adf47cea14d7f03b0d86939c0b0dacb245fe4314f1\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[221]\naad = 436f756e742d323231\nct = 61625bab2d94464510430ff6f74793cfb64bd87a5ca4193c5b80401058d082e351a36cac8881aa083018f9443d\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[222]\naad = 436f756e742d323232\nct = 6c04a3f61cc9bfc10a6e67e2adcb7818a61a0709bd49285c5bd069808799a4b888292a4a802c15dd38d75925bc\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[223]\naad = 436f756e742d323233\nct = f4f8b3ba316bc1109069dceadb7809b2864c7857f8d9ed3f8523fee84e4033ea681bd941868e1190d40ae96b18\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[224]\naad = 436f756e742d323234\nct = 1ecd688ce744a684f660547887d910f0445b5b7167ea29ad646f2668bb064d83160205b5e977e7487bb4d06523\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[225]\naad = 436f756e742d323235\nct = 38e766640dce7ce1edf30aa96c4324763036633bb4d881fcf26225e3c021e333ca8aed8288c565fa74e9238333\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[226]\naad = 436f756e742d323236\nct = 8bb09de244855723d0b697b02a967bc98d064bd529819046640c1bb009f27c9bc85f68aebc1da97791701e4e53\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[227]\naad = 436f756e742d323237\nct = 5364e964cca737d51bd327276a0bb9340c4efaf3630b6086b4b0e20205a418d4fdc8855962da8b682eccfd53c6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[228]\naad = 436f756e742d323238\nct = fb7a049058fade2c1653b3dccbae8c4ce3c5d50cafdefc618695c8a8955a8b8d48cd792c97b9c7599ecaa08456\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[229]\naad = 436f756e742d323239\nct = 72ee72219b3239f96a902837a653fbea4a652f76e765ea4009e97f647fd0441f23abc6e6fd4af79c91bd206307\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[230]\naad = 436f756e742d323330\nct = 54215a6653acd4e6976d5230607127f898aaae52addddebe170515d8cd6551eafc0e653d3f91e714dcc2cd0504\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[231]\naad = 436f756e742d323331\nct = 1375489e8fa717c36d15cd26c9519c7c798af560b41e354fa86fc242760cbc448fe81de05044f1e8671e3a29d4\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[232]\naad = 436f756e742d323332\nct = 025b901c822275bbe1d6f72358f9919d76ae4062f9cb29f0e8c4c034e2c8791f198ed837c5a78c01ace2a74e89\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[233]\naad = 436f756e742d323333\nct = 7a7d9406e7bf753493cdc3167253e53b21ab34b5fb906c13255fc63001566aee76f1f2ba9dbe2de613e4178195\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[234]\naad = 436f756e742d323334\nct = b192c5443cd1b4434c3d5f031f56fba802c965eab7803371c9702dd15927d1f842981c633b28e93f3bb9254df1\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[235]\naad = 436f756e742d323335\nct = 1ba5f39d42dc02590901b8b2b755e528ca59085feda6c37318baeebdf6604cafd79a26369a5d55e58c45d90645\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[236]\naad = 436f756e742d323336\nct = 699225fa0b0a7cd2350d4e6100ceaf21945bde25084b031bf2c83bdcaac73ae9563b5e3f60366d4f152ebb156b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[237]\naad = 436f756e742d323337\nct = 03a5d97ce6e8ddf07a3c2c33dd4d401eedbd09fc85ce68a5e52b1a2d63de672f9ed62e5e4e3a843560b4363937\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[238]\naad = 436f756e742d323338\nct = 177a9525be60073909a731825a3622cc60dbdd7540e7fa6b706a45beff03f8d3c65220d439832a42660caf3beb\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[239]\naad = 436f756e742d323339\nct = dc3ca9a852da948fcb4659fdd6e3b8fa307ba56e8face0f3d723582fc06c090a7d817a82df0cecf86335b82e31\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[240]\naad = 436f756e742d323430\nct = 6ca9b591de5234579a0aa90bea2f016d60cf50e77bc2a06d729579cb8b7b4c68e5dc6d483d337c5151d2989180\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[241]\naad = 436f756e742d323431\nct = 02e644e2e21b35f8868e786ab534c31a485b6e69097d10df2a25f24993c4d4d407f067796af1ca127de2f325fa\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[242]\naad = 436f756e742d323432\nct = cc9ea8088634939f2e757726833e70ca2b00d7e617b1e525bc147fbfa9c6b3d29621d38a73e954944ff4e9ce5a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[243]\naad = 436f756e742d323433\nct = 180bec2fc3e686d2f37f2b18a3b0a195a2277c28ffb49d85bcdecbba92f7cfd3d1832a310baaf01ca9396c3d8a\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[244]\naad = 436f756e742d323434\nct = b067fc48293520ce29f528b1bad11c0d38dbbe942f0c27c0ca953469dcc88bb1fe4a6b1",
     "56134ec7803a8f6d367\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[245]\naad = 436f756e742d323435\nct = 42bb52ae652c21e3a16821c1a7dddb127e42b56c1985cf3800090a9accd8eb8080861e00f69f22bd09af42e19f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[246]\naad = 436f756e742d323436\nct = 6bb1ca4dceb6137e525632def5bb056f7ce6f5dd452edb7a69449e43e947706e970978d47554fc50707c30567f\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[247]\naad = 436f756e742d323437\nct = a37b7d0abd040300937b12ec5b6c3c43e594295f2b1d0f3292fdb0c38205d6ba925d0a11d3d1274b10a45c1d29\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[248]\naad = 436f756e742d323438\nct = 729c0bae1bb680320852f4ab084062a0b143d535eff67da55999088f9f751fa7fcee704f524a9f6b8a94aa280c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[249]\naad = 436f756e742d323439\nct = dcbe1ab062cafc3bd1c189007316e09bba8df92eb0dd9ece681a62e1d5bb9ab9ce4e5055257c96d70b43b62092\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[250]\naad = 436f756e742d323530\nct = b08f5a570d41d21d0aa528c9da0b68bc2006e2579a956616f40f46caa5c24f5bf2e6bd8bd5ebf4bce2b79fa282\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[251]\naad = 436f756e742d323531\nct = 985991414c213e093e8ca144c4ac5c6d90e2f136810c934831e8623a64349dfe77ca188acd973551b5241754b6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[252]\naad = 436f756e742d323532\nct = 67c3d85876339d04e89d76bde220151c85f88b83718d50973ed5712373545ede91492b1f22b3c2da20d6e6d7f7\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[253]\naad = 436f756e742d323533\nct = 7552addfff71040acd9740a8deda98cf23dbe410a9af5fefffb7d0a21d60cff55d0ef91eb295fc2e0ef51516e6\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[254]\naad = 436f756e742d323534\nct = 8f531f2137e6b9d7b8f07af2f3fbd425c5ed60cdcd642c035f4354432d6f5d41870cf1d6bc18bb192489982866\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[255]\naad = 436f756e742d323535\nct = 18ab939d63ddec9f6ac2b60d61d36a7375d2070c9b683861110757062c52b8880a5f6b3936da9cd6c23ef2a95c\npt = 4265617574792069732074727574682c20747275746820626561757479\n# encryptions[256]\naad = 436f756e742d323536\nct = 7a4a13e9ef23978e2c520fd4d2e757514ae160cd0cd05e556ef692370ca53076214c0c40d4c728d6ed9e727a5b\npt = 4265617574792069732074727574682c20747275746820626561757479\n# exports[0]\nexporter_context = \nL = 32\nexported_value = 4bbd6243b8bb54cec311fac9df81841b6fd61f56538a775e7c80a9f40160606e\n# exports[1]\nexporter_context = 00\nL = 32\nexported_value = 8c1df14732580e5501b00f82b10a1647b40713191b7c1240ac80e2b68808ba69\n# exports[2]\nexporter_context = 54657374436f6e74657874\nL = 32\nexported_value = 5acb09211139c43b3090489a9da433e8a30ee7188ba8b0a9a1ccf0c229283e53\n",
 };
-static const size_t kLen50 = 982;
-
-static const char *kData50[] = {
-    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b\xe2\xb3\x39\xd2\xbdZ\x8c\x0e\x02\x02\b\x00\x80\x82\x02\x30x\"\x01\x8c\x16\xcd\x11\x86\xa1\xc7n\xc4w\xa1\x8d\xb4\x85\xc3\xb2\x02\x63p\x8b\xfb\xb0\\\x8f\x1c\xec\x0f\xc7}\xb6\n\x03_ \x00\x32-.\x12NZ`Ho\xd0\xe9\x8c\x15Y\\b\xe6$L\xfd\x1f\x30\xa1\"\x8b\x0f\xe5\x37\x82k\x19\r\xcc\x85M\xce\x64\x9b\x82)\xfeJ\xe4\x11\xd2\xe6\x01\xce\xdbTdk\ai\xb5\x19\xfb\xf1r\x84<N\x8d\x64\xfd\xa9\x33\xaa\x1dY\x1a<\xcd\x1e\xee:>\x8a\x9c\xf1!$\xebR\xd1\x7f\x32Wh\xa0\xac-\x94\xe8LY\xa3\x43\xfb\x18yL\xbe\xc2\x84=n\xb3/\xc8r\xbc)\xec\x06\x87\xc3\x9aH@\x0e\xe6\x34\xc1J\xf7*n\xe0\f\x9c\xa2\x32U\xd6\x43,\x9dtK\xf0\\\xaa/k\xb4\xa3\xb6\x10\xe1 \xad\xa2\xb7\x31T\x1c\x92U\xb1G\x9bV\xe7\x89\x90@\xa4\x87q8\x95\xec\x43&KY\xadm\xf0\xc2\xf7o\xa0\x9a\xbb#PD\xbf\x8fI7\xc9O\xd5#~\xf6]\xfb\xd8\ad\xe0\xa8\xa3:>\xc7\x8fW\x8a\xb2[\xc9\xfc'%-\xcd\xcc\x9b\\D\a}\xf4\xad\x42\x12%H\x14V\"f\xe5\xec\xe8v2\xe3\x18\xb1\xac+\x0f\xd2\x92\x82\xe2\xd4\x42\r\r1\xb3\x8eS\x17\xc4\x8a\n\xf9o9\xd1\tU\x04\xe5\t\x15\xe7?*\xf0\x89\xff\xb1\xa8\xe3\x8a\xf8\x9b\xa4\x34\x93\xea\x46&\xcf#s\x82\x87|\xe3\xd2\x9bIS[\x99\xa9\xd4\x87\xa4\xf0\xd0\x82@\xb0\v\x8c\xb2r\xca,\xb1WTe\xf6\x88\xbb\r\x93\xac\xcbs\x90\xa8{\x16Us~~\xe3\xe1\xc5\xc4\f6^3\x91I\x9cq\x11\xf5\xd3[8\xbd\xe6\xb5\x0fr\x8c\x34\xc6\x18l\xc9\xe5@\x9c\xbe\xd8>MB\xd3\x96\x98\x14Q)\xba\xedLO\tPG\xf1\x84\x14\x65\a\x85\x82\xadr4T[\x0e\x44]\xb8,qgU s \xb9VziF\xca$GC\xd9G\xe7x~\xc6\xfcY\xe5\xd9u\xe7\x65.\xd8\xa3nX\xdd\x96k\xf4\x30\xd2<B\xce*\x9c\x7f\xa7i\xdf\xf5x\xc1\x83\x1e!Z\xad*j\n\x8b\x93\xa0\v\x96m\xd9\xaaW\xa9\xd2\x31!R\x11QK\x85\xe5\a/\x9bP\xff\xa7\x93\x93\xa7\xf6\x9e\x39\xc8\xfdSMmd+\xdd\xc6~\xe8\xfe\x04\xa8 \xf8\xb3\xa2[\xa0\v'\x8a%p\x95\x30\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b;\xa5\xb3ntK\xef\f\x02\x02\b\x00\x04\x81\x90\x36TG\a\xf6\xa4_\xb1(\xd7\xcb\x92\xe1\xbd\x43\xa9\xf0\xa2\a\x97)\r\xecJ\xea\xd1\x14\xe9\xa5\x10\xcbR&.\x18\xf8\xc8s\xf4\xee\x91\x8ex\xc1\x38\xd7|\x9b]\xb9\x64I_#k\xe4\xf1\xe1rq\xb9\xad\xdf\x31\x9a\xab\xd0\xad\x17\xb9-K\x8e\xbe\xe0\xb1\x94\xd6\xc0\x37\xee\x38\x65\xc0\xc5N\tz\x02\x17\xd8O\x83O\xa2.b\xb6\x97>6\xbd\x15\b@P\xc1\x8b~\x9b\xc6y\xe1\x1e\xaf\xd9S\x82\x61\xb2R\x8a\xf2Vp\xc3r\xcd\xa9\xb5\xf0j\xc0K\x89\xe5|\x93\xb9\x1eh\xb4:\xc3\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x7f\xd4[\x84\x34\xb7\xf9\x87\x88|Rzy\x02\x96X\xcc\xdb\x9d\xf2\x04\bb\xf5}\x8f\x84\xe5\x64%\x02\x02\b\x00",
-};
-static const size_t kLen51 = 882;
+static const size_t kLen51 = 982;
 
 static const char *kData51[] = {
-    "0\x82\x03n\x02\x01\x03\x30\x82\x03\x34\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03%\x04\x82\x03!0\x82\x03\x1d\x30\x82\x02>\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x02/\x04\x82\x02+0\x82\x02'0\x82\x02#\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x03\xa0\x82\x01\xeb\x30\x82\x01\xe7\x06\n*\x86H\x86\xf7\r\x01\t\x16\x01\xa0\x82\x01\xd7\x04\x82\x01\xd3\x30\x82\x01\xcf\x30\x82\x01v\xa0\x03\x02\x01\x02\x02\t\x00\xd9L\x04\xdaI}\xbf\xeb\x30\t\x06\a*\x86H\xce=\x04\x01\x30\x45\x31\v0\t\x06\x03U\x04\x06\x13\x02\x41U1\x13\x30\x11\x06\x03U\x04\b\f\nSome-State1!0\x1f\x06\x03U\x04\n\f\x18Internet Widgits Pty Ltd0\x1e\x17\r140423232157Z\x17\r140523232157Z0E1\v0\t\x06\x03U\x04\x06\x13\x02\x41U1\x13\x30\x11\x06\x03U\x04\b\f\nSome-State1!0\x1f\x06\x03U\x04\n\f\x18Internet Widgits Pty Ltd0Y0\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x03\x42\x00\x04\xe6+i\xe2\xbf\x65\x9f\x97\xbe/\x1e\r\x94\x8aL\xd5\x97k\xb7\xa9\x1e\rF\xfb\xdd\xa9\xa9\x1e\x9d\xdc\xbaZ\x01\xe7\xd6\x97\xa8\n\x18\xf9\xc3\xc4\xa3\x1eV\xe2|\x83H\xdb\x16\x1a\x1c\xf5\x1d~\xf1\x94-K\xcfr\"\xc1\xa3P0N0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xab\x84\xd2\xac\xab\x95\xf0\x82N\x16x\aUW_\xe4&\x8d\x82\xd1\x30\x1f\x06\x03U\x1d#\x04\x18\x30\x16\x80\x14\xab\x84\xd2\xac\xab\x95\xf0\x82N\x16x\aUW_\xe4&\x8d\x82\xd1\x30\f\x06\x03U\x1d\x13\x04\x05\x30\x03\x01\x01\xff\x30\t\x06\a*\x86H\xce=\x04\x01\x03H\x00\x30\x45\x02!\x00\xf2\xa0\x35^Q:6\xc3\x82y\x9b\xee'P\x85\x8ep\x06t\x95W\xd2)t\x00\xf4\xbe\x15\x87]\xc4\a\x02 |\x1ey\x14j!\x83\xf0zthy_\x14\x99\x9ah\xb4\xf1\xcb\x9e\x15^\xe6\x1f\x32Ra^u\xc9\x14\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x81\xd8\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xca\x04\x81\xc7\x30\x81\xc4\x30\x81\xc1\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x01\xa0\x81\x8a\x30\x81\x87\x02\x01\x00\x30\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x04m0k\x02\x01\x01\x04 \a\x0f\brz\xd4\xa0J\x9c\xddY\xc9M\x89hw\b\xb5o\xc9]0w\x0e\xe8\xd1\xc9\xce\n\x8b\xb4j\xa1\x44\x03\x42\x00\x04\xe6+i\xe2\xbf\x65\x9f\x97\xbe/\x1e\r\x94\x8aL\xd5\x97k\xb7\xa9\x1e\rF\xfb\xdd\xa9\xa9\x1e\x9d\xdc\xbaZ\x01\xe7\xd6\x97\xa8\n\x18\xf9\xc3\xc4\xa3\x1eV\xe2|\x83H\xdb\x16\x1a\x1c\xf5\x1d~\xf1\x94-K\xcfr\"\xc1\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xd0\xb4\x17\x1a\xdb\xa3'\xd8\x9e\xd3\xf2\xb3>\x96\a:\xf2j\xc2\x1c\x04\b\xb5\xa8\xb9\xdb/\xf1\xa4\xcd\x02\x02\b\x00",
+    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b\xe2\xb3\x39\xd2\xbdZ\x8c\x0e\x02\x02\b\x00\x80\x82\x02\x30x\"\x01\x8c\x16\xcd\x11\x86\xa1\xc7n\xc4w\xa1\x8d\xb4\x85\xc3\xb2\x02\x63p\x8b\xfb\xb0\\\x8f\x1c\xec\x0f\xc7}\xb6\n\x03_ \x00\x32-.\x12NZ`Ho\xd0\xe9\x8c\x15Y\\b\xe6$L\xfd\x1f\x30\xa1\"\x8b\x0f\xe5\x37\x82k\x19\r\xcc\x85M\xce\x64\x9b\x82)\xfeJ\xe4\x11\xd2\xe6\x01\xce\xdbTdk\ai\xb5\x19\xfb\xf1r\x84<N\x8d\x64\xfd\xa9\x33\xaa\x1dY\x1a<\xcd\x1e\xee:>\x8a\x9c\xf1!$\xebR\xd1\x7f\x32Wh\xa0\xac-\x94\xe8LY\xa3\x43\xfb\x18yL\xbe\xc2\x84=n\xb3/\xc8r\xbc)\xec\x06\x87\xc3\x9aH@\x0e\xe6\x34\xc1J\xf7*n\xe0\f\x9c\xa2\x32U\xd6\x43,\x9dtK\xf0\\\xaa/k\xb4\xa3\xb6\x10\xe1 \xad\xa2\xb7\x31T\x1c\x92U\xb1G\x9bV\xe7\x89\x90@\xa4\x87q8\x95\xec\x43&KY\xadm\xf0\xc2\xf7o\xa0\x9a\xbb#PD\xbf\x8fI7\xc9O\xd5#~\xf6]\xfb\xd8\ad\xe0\xa8\xa3:>\xc7\x8fW\x8a\xb2[\xc9\xfc'%-\xcd\xcc\x9b\\D\a}\xf4\xad\x42\x12%H\x14V\"f\xe5\xec\xe8v2\xe3\x18\xb1\xac+\x0f\xd2\x92\x82\xe2\xd4\x42\r\r1\xb3\x8eS\x17\xc4\x8a\n\xf9o9\xd1\tU\x04\xe5\t\x15\xe7?*\xf0\x89\xff\xb1\xa8\xe3\x8a\xf8\x9b\xa4\x34\x93\xea\x46&\xcf#s\x82\x87|\xe3\xd2\x9bIS[\x99\xa9\xd4\x87\xa4\xf0\xd0\x82@\xb0\v\x8c\xb2r\xca,\xb1WTe\xf6\x88\xbb\r\x93\xac\xcbs\x90\xa8{\x16Us~~\xe3\xe1\xc5\xc4\f6^3\x91I\x9cq\x11\xf5\xd3[8\xbd\xe6\xb5\x0fr\x8c\x34\xc6\x18l\xc9\xe5@\x9c\xbe\xd8>MB\xd3\x96\x98\x14Q)\xba\xedLO\tPG\xf1\x84\x14\x65\a\x85\x82\xadr4T[\x0e\x44]\xb8,qgU s \xb9VziF\xca$GC\xd9G\xe7x~\xc6\xfcY\xe5\xd9u\xe7\x65.\xd8\xa3nX\xdd\x96k\xf4\x30\xd2<B\xce*\x9c\x7f\xa7i\xdf\xf5x\xc1\x83\x1e!Z\xad*j\n\x8b\x93\xa0\v\x96m\xd9\xaaW\xa9\xd2\x31!R\x11QK\x85\xe5\a/\x9bP\xff\xa7\x93\x93\xa7\xf6\x9e\x39\xc8\xfdSMmd+\xdd\xc6~\xe8\xfe\x04\xa8 \xf8\xb3\xa2[\xa0\v'\x8a%p\x95\x30\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b;\xa5\xb3ntK\xef\f\x02\x02\b\x00\x04\x81\x90\x36TG\a\xf6\xa4_\xb1(\xd7\xcb\x92\xe1\xbd\x43\xa9\xf0\xa2\a\x97)\r\xecJ\xea\xd1\x14\xe9\xa5\x10\xcbR&.\x18\xf8\xc8s\xf4\xee\x91\x8ex\xc1\x38\xd7|\x9b]\xb9\x64I_#k\xe4\xf1\xe1rq\xb9\xad\xdf\x31\x9a\xab\xd0\xad\x17\xb9-K\x8e\xbe\xe0\xb1\x94\xd6\xc0\x37\xee\x38\x65\xc0\xc5N\tz\x02\x17\xd8O\x83O\xa2.b\xb6\x97>6\xbd\x15\b@P\xc1\x8b~\x9b\xc6y\xe1\x1e\xaf\xd9S\x82\x61\xb2R\x8a\xf2Vp\xc3r\xcd\xa9\xb5\xf0j\xc0K\x89\xe5|\x93\xb9\x1eh\xb4:\xc3\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x7f\xd4[\x84\x34\xb7\xf9\x87\x88|Rzy\x02\x96X\xcc\xdb\x9d\xf2\x04\bb\xf5}\x8f\x84\xe5\x64%\x02\x02\b\x00",
 };
-static const size_t kLen52 = 2636;
+static const size_t kLen52 = 882;
 
 static const char *kData52[] = {
-    "0\x80\x02\x01\x03\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x80$\x80\x04\x82\t\xef\x30\x80\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x80$\x80\x04\x82\x05w0\x82\x05s0\x82\x05o\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xf6\x30\x82\x04\xf2\x30$\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x16\x04\x10\xacq\x8a|\x89\xcf\xa8\xb0\xd6\xd1\a\xf0\x83Oz\xd0\x02\x02\a\xd0\x04\x82\x04\xc8\xeaQ,a\xaa\x9d\xf3\x90\xe1\x38\x45\xb0_\xfd\xe2\x04\x65\xe6\xff\x87\xb6xi\xb0\xcb\x14\xe9\x99\x39\xe3\xe5p\x84Wh\xf7(\xb9u\xa6\xfb\x16r\xe1\x34\xb8;aQ\x89\x18\x94@\xefs\xda\xdb\xd7\xb7\x44s\x8f\x16\x84\xa2\x99\xa6\x05^t\xae\xe2\xcf>\x99\xca\xcdv6wY\xec%Y=KE\xa5N{z\xc9\x8b\xdeOpm\xb1\xa8\xf3\xb6\xb5\xe7g?\xe9\x64\xb8I\xf4\x11\x94\x9d\x1c\xb0\xa5\xfb\xb3\x61\xd4\xf3\xa7hf\xd7\xa4\xf0\xcd\xc8@O>\xa7&@vd\xa1N\xf1\x91\xc2\xa3\xef\xbc\xcd\x42\xe5\xd2o\xff\xfeM3\x01\xb4\x99\x63\x1b\xd3\x01U\x00\xa6#\x9b\xa9\x17\t82\x18\x36\xbc \x02\xfe{\xec\xd3L}\xc9\xc9\xce\x66;4n\xea\xf9\xb1\x1a\x83\xa3<\x8d\xc7y\xc9\xffk\x1d\x35\xf6*=;\x83\x16\x64\xcf\x9f|1\x02\xda\x37\x1a\x16I\xdc\xd9p\xae\x99,\xc7\x01\xba\x42\xab\xe9M\xa4x,\xbd\xa0\xf1\xb7\xcf\xdd\xc1\xdb\x8f\x04\x87\vGO\xd5\xd5\xe7\xfcnB\xd5\x91M{\x1b\\<\x02p\xdb\x05\x91\xaf\x35\x43\x05\xc2m\xcfY#\xfc\xc4\xf6g\xf1\x84\x61J\xb6L\x15\x15\xa3\xea\x8f\x13\x15\xe3\xd2\xb5P\xc8\xae\xc8\\\x03\xb5\x63\x93\xaa\x10\xd7V\rn\x13\x45\x8f\xec\x17\\\\s\x91_l\xaf\x11\x13\x32^\x14\xf9\xaf\xaf\x43\x04`\x93\x42\x30\xa6u\xc0\x83\xd2L\xa5\n\x16\x39\xef?\xf7\x9d#\x19\xb9\xcd\xd8|n\xeem.\xffZ\xf3\xb9\xab\xe5\x64\xdc\xc2g0s\x19-\xea\xd2\x19\x1f\x1f\xe0\xd9\xac\xc9\xdb\x38t^1G.\x9e+\xcc\xb9\xe4)\xf8\xb2\xbf\x1b\xbch\x96y\xcf\xaf\xf2\x1fW?t\xc4qc\xb4\xe8\xbeX\xdb(b\xb5y\x8b\xe4\xd0\x96\xd0\xda\x0f\xd2p\x93/q\xe0\x9f(\xb7R8\x9c\xcb\x8b*\x8e\xbf\x0e=`\x05\n\x91[\xb5x\x10\x31\x00\x80\x31-\xd7\xb0\x88\xc7\xd9X\xc6\xfc;\xf4\xee\xec\xba\x05\xae\xae\xff\xcf\xd0q\xc6\xe7\xf3\x8b\x64Pz\t\x93\x0f\x34Y-\xdeK\x1d\x86I\xff\x63v(kR\x1b\x46\x06\x18\x90\x1c-\xc5\x03\xcc\x00M\xb7\xb2\x12\xc5\xf9\xb4\xa4j6bF4*\xf0\x11\xa3\xd6\x80!\xbf;\xfd\xc5%\xa0M\xc0.\xc0\xf1{\x96\x11\x64\x8e\xb9\xdb\x89N3\x89\xf5\xc6\xfc+\x99\xf5\xc2\x04\x83\x15G\xa8\xa5\xc1J\xe4v\xab>\xf0\x9b\xb7\x8d\x46\xd3R\x9b\xbd\xfd+\xbas]#gh\xe1voV+\x17\xe4~\x9a\xfd\x05H9\xc9\xcf\xa5\x83\xf7\x90\x9c\xa4(W@\xe9\xd4K\x1aKoe\x14\xca\x43\xc1?|\xec\x82G\x0e\x64\x8bo\x8c\xb2\xf0m\xeboq\x8f\xcc-`+\xc3\x9f\x13\x94\xc7#\x02\xf5\xe6\xdf-\xa9\xdb\xa9\xf3\xee\xe9?*i$kx\xffj\xd7\xe4i\x8c\x17\xd5\xc1\x36\x1a\xcaw\xb0\xb5k\x96J\xb5\x0eM\v\xd6\xd9x\xc5\xbf\xe3Y\xfe\x63\xe3\xd3<\x9a\xfa\xd7i[\xef\xd3\xa4\xa3\xb9\x1f\\@ \x95\x38-\xf5\x04\f,yw\xc1\xb6\xcct<f\xf1\xc6\x65\xabMhA\x16qQ\xb9\x1b\xcb\xa7m\xe0p\xa9\xfa\x65k{\x1e\xc5\xdf\xe2L\x96\x44k$\xa1\x15\x8e\xe7\x9b\x1fQ\xef\xd7\x65_\xcdt\x7f-\\\xba\xba 2\x8d\x1c\xf1Z\xed!\xadx{YX\xe4\xf6\xa7\x10\x35\xca]\x86\x1ah\xba\x1c<\x1c#y\x8b\x9f\xda\\\xd1Z\xa9\xc8\xf6\xc9\xdf!Z\x98\xdc\xf4\xb9\x02\x97,\x10`\xc9\xb5\xeau\v\xd9\x8a\xa4\x86\x92\xbe\xf5\xd8\xc7k\x13\x8b\xbb\xca_\xe4\x8b\xce\xb5'\xaeS\xed\xef\x37\xa6\x81\x8fp%\x18\x93\x06\x8c\x18\xcdz\x1a\x8d\xfc\xdeo0\xdb\x41\xb6\x42\x14T\xf8\xcd\xc6\xf8\x0f\x82\x17\xfa\x8d\xba\x80\x81j\xf7\x02\x97\x00x\xd6[\xc9\xba\xd1\x99\xef\x8eHl5\x10[\xf1\x9b\x93O\xbd}'\x9e\xc7\x86\xb2\x8fj\x91Y-\x14\xab\x1b\x34n\xfa%^\x14\xc7\xef=\x0f\x13\xf9\x45K\x90\xbc\xd8QB\x95%\x9b\x1b|\xaf;`!L_|cKE\xa6\xdc\xfd\x32\xf3\x06\x61\x11-'\xde\x19\x38\x63\xf9p\xd1\x82\x8e\xc7\x99\xe1\x96\x9bT\x93\x64_\xd1\x62\x9c\x37\x10\x1a\x8a\x82\x8d*\x93\x95\"\xc9!\xf5\xce!\xbb|\x17\xee \xa0s\xaaixN\r,,\x96#\xdc\a\x16\xbd\xe7\xd5I\xcc\x44\xd1\x9d\xd7\xa3\x01`\xa0\xe0\x41\x63(\x8a\x43\xdbO%['RJ\xee\x42\x43\x9a\xef\x33\x43p\xda\x64WI\f\x7f\xfd\xc7\x88&\x94\x10\xcc\x05\x1dT\x95\xeaNe(\x03\xbc\xa2\x62\xd2\xce`4\xf9\xdb&\xb5\xe6\x9bU,\x8f\x30:\x94\x9a\x15y\"uM\x1b\x91\xe0[\xdb\xd1\x15\x7f\xcc\xc6\x88\xb5\x00?]\x84.h\xdeoA[N\xe7\xdf\xe6;~\xf2\xdd\xfc\x01\xf2\x1bR\xba\xc4Q\xae\x8f\xa0U\x12\x81W\xe0X^\xea\xd7\x85\xfb\x19\x8b\xb7$)\x94\xa7\xfc\xed\x17\xaa\x32P\x11\xb3zC:\xc0+\x82\x9c\x85\xd9\xd0\xdb!q\x83\xb4\x30\x14\xec\xfc\x8d\x32\xd6\xa2\x36^;\xe9\x12\f\x95\xd6\f\f1f0?\x06\t*\x86H\x86\xf7\r\x01\t\x14\x31\x32\x1e\x30\x00I\x00n\x00t\x00\x65\x00r\x00n\x00\x65\x00t\x00 \x00W\x00i\x00\x64\x00g\x00i\x00t\x00s\x00 \x00P\x00t\x00y\x00 \x00L\x00t\x00\x64\x30#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au\x00\x00\x00\x00\x00\x00\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x80\x30\x80\x02\x01\x00\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30$\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x16\x04\x10\x9d\x1bh\x8e\x11\xc2\xb2\xd6\xd0\xe9Z\x9e\x96\xc1\x8c\xa6\x02\x02\a\xd0\xa0\x80\x04\x82\x03\xf8\x1d\xce\x13pzk\n\x12-\x01\x84\x63\\\a\x82#\xf8\x8a^S\x8f\xc8\xb4\x87\x1a\xa2\x98\xdb\xc6&\xca\xbb $\xad\xac\xdf\xbesm\x97Kn[E\xd2\x84\xd4\xa4\x82\xd0\xce@\x13LmM.\xc1\x96\x95\x01\x64\xf3\xf0_\x06\x06\xea\xf7\x84\x8f\xb3\xb0n|\x9bqs\xb9\xcd\xacr\xf6\xa0#\xda\x9b\x9f\xec\x16\xef\x33\xd4\xd0M \xf0u\xa9s\xf4\x31\xc7W\xb8\r\x9d\x85|\xee:${t\xa0\\\xad\xde^\x05\x1e\xeb\x02x\x12\xb4\xb9\xc6\xe5\xc5\x99\xbc\x05\x62[\x10R\b\x00\x9es\xac\xe4\x1d\xdb\xb8\xbfH\x03(\x05<a\x1a\x8bL\xd7_\x8c\xb4\xcd\x91\x1c\v\xf4U\xd4\x1c\x42J\xd4\xf5\x15\x38\xd9\x06\xfcI\xf6\xe5\xa7\t]\x01\xbd\xc3\xd1\t\x9f]\f\x19\x43\xd0\xfa%\x17\xad*\xbf\x89\x63\x06\xa8\x02\x03\xe4\xfe\x19\bp\xa1tt\xb6\xb6\x0f\x19MT\xa5\xb2\xd7\x37;\x17\xc0]\xc2\x8a\xf1\xcc\xed\xef\x65\xc8\xca\xbe\x02\xd4\x9b\x1e\xef\xc9\xe0\x91\x82\xb0\xe0P\xc7\xa0\xcc\x01mU\xe5g\x99\x65\x13\xe4\xd2\x90\x91\xf3v\vj-\x19\xaf\x61\xb3\x7fL\x04\xfeh\xf6\xb3V\xd8\xf3\x34\xd7\x04\n1\xc8\x37\xdf\xac\xd8\x91\x80\x8a\x30\x12\"\x80\xd7$\xcfp\xafV\xaf\x81\xfe\x63\xf1\xeaWL\xf2\xdb\x30P\x92\xc1\xeb\x04\x9a\xdf\xf5tW[X\xc2Nk\x11\xf3\xe1\xb3\x0fV5\x04\xf8P\x1d~\xe6\x99\xa2H\xdb\xea\x62O\x98\xc2\xef\xbf\x7f\x94\xc0\x36\xc0\xf3'\xfe\xe2\x17\x1e\x91}\x96\xa9+qQ\xc3Y-\x11P\x1e\xcb\xce\xff\x04M\x16\xf5\xc2\xd4\x1f\xdd\x7fZ\xfd\x1d\xe9\x63RDv_\x91\xfd\xe8\xdf\ni\r\xd3\x64\x91\xea\xdd\x03OB\xa5\xe9\xa1p\x05\xf3\"\x8e\xadp\x1a>\x94\x42\x06\xe7G7=\xf5\xda>*:\xc0#\xd9J&i\x13\xa6\x93|\xf2\xaf\x04^\x9b\x88\xc7w\xd0\x93\xab\x1b\xbd=i\x90\xab\x41\xa9\xbc\x84\x18M)\x02\xc1\xf8\xff\x63\x18$t\x8f~D3\xaf\x88\x8b\x93[\x9a\xaek\b\xa2\x82]\xf3\xbe\x61\xc3\xf0-1L\xb5\xb5\x91\x0f\xfa\x81\x61\xad\xfc\xba\x91\xeb;\x9d\"AE\x0e\x8e$\xc7\x1c\x81\x95\xa8{d\xed\xa5\xecZh<\x85\x8d\x92\xb7$\x0f\xed\xf5\xc6\x31\x61\xdc\xef\xa7\xcb\x8f\xda\x43\x05\x42\xf6\x9e\xbc\x1b\x9a\xa1\xe8\x1d\x8d\x42\xdb\x80\x83UR+\x95\x00\x05\x82\x84\xc3T#\x8e\x1d\x00\xa2\x16>\xce=\xcc\x9e\xb8LY\xb2\x12\xa2#\xc1\x46P\x86\xaeu~I8w\x94\xf0'\xd8\x17\x38\x8c\xe0s\x00\xfb\xaf\xbf\xe8\xed\x85X>\xb4\x88\x04\xc8\"\x1b\xb4u\xa2\xc4\xdd\x06\xd2\x83\x42!W\xfc\xd8\xae\x9c\x0e\xd8jp\xd1\xeb\x44\x9c\xb7\x37\x04\x05\xf5\x17\xbe\xf3V\x1b\x06\x36\x1cY{e\x8d\xbb\xbe\"\x9ap\xa3\xe9`\x1a\xc9\xdd\x81<-N\xc0\x8a\xe5\x91\xa7\xc1\x80\aGztO>J\xdc\xb2\xcc\xff\x37\x66\x05\xcb\xd6\xe9\x90\xf5\xef+~\xa7\x66Q\xcbH\xb3\x8ao\x06\xba\x8b=56\xdf\x0e@\xe5\xa1\xe3\xdd\x89\xab\x64\x9c\x01\x15\x9e\x93\xea\xf9O\x9e\xf5\x8b\xf2\xc2\xbb\xe5\xc3\xa3\xe3\x13\x63O} \xe4\x66\x96\x84\x8d\xd4\xcarR\xdc\xb8\x93\xd4\xa5>nBV\x80\x46w\x86I\xfe\xf3\xb4[7\xfc\xb8\f\xd7\x63\xac<o\xf0\xbe\xbe\xb4\x13\xe7\x34\xe5\x06\xbf\x17Hn\xc0&\x94\xdd\xed\xf4\xda\x97%\xab\xd6\x9b\xc3\x8c\xeb\x17\t\xfc\x03Z/\x19\x85P\xc4\xe6\x35q\x94\xad\xc5\xcf\b\xcfi;\xc3\x31\xec\xf1\xfa\x80\x66\x8f\x14\xdeV!\x12\x9b\f\xdf\x92H\x06\xce\xdb\xeb(T'\x8b\xa9\xef\f\xf4\xa0\xcc\x84Y`\xed\x18\x65\xcag\f\xd1\x1f\xcfYK\xce\a'\bj\xeaS\xdcG\xb3N\xe4\v\xff\x9a}k\r/-`\xd7\x8b\"\xf5\x30\x43\t\xe6\xdf\x01\x03'-\xb5tR]\b\xc7ZD%\x0f,\x14\x8fH\xea\x18\x99\xd1\xcc\xc5\xdc\x65\xa5=%\x94\xa9\xc7\xad>\xa4\xf6\xe6\xbd\xa7p\xd4\xdc\x9b&\xcb\x31p\xaf>\xa4\xb6\x8d!1g55\x86g\xd1\x02l6v\xc9 \xf6\x0f\x30\x41\x83\x19\xf5\xe1\x33\x90\xbc{\x8c\x9b\x8ah0\x9e\xed\xf4\x88\xc9\x04\b+\xb0\x0f\xae\xc7\xe0nR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x39\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xe0\xf7\xa1\x1b\xf6?\x05\xadUj Lq\xca\x62G\x13(\xd5\x05\x04\x10>\x87-\x96\xea\x80K\xab:\xb9\xee\te(\xbc\x8d\x02\x02\a\xd0\x00\x00",
+    "0\x82\x03n\x02\x01\x03\x30\x82\x03\x34\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03%\x04\x82\x03!0\x82\x03\x1d\x30\x82\x02>\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x02/\x04\x82\x02+0\x82\x02'0\x82\x02#\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x03\xa0\x82\x01\xeb\x30\x82\x01\xe7\x06\n*\x86H\x86\xf7\r\x01\t\x16\x01\xa0\x82\x01\xd7\x04\x82\x01\xd3\x30\x82\x01\xcf\x30\x82\x01v\xa0\x03\x02\x01\x02\x02\t\x00\xd9L\x04\xdaI}\xbf\xeb\x30\t\x06\a*\x86H\xce=\x04\x01\x30\x45\x31\v0\t\x06\x03U\x04\x06\x13\x02\x41U1\x13\x30\x11\x06\x03U\x04\b\f\nSome-State1!0\x1f\x06\x03U\x04\n\f\x18Internet Widgits Pty Ltd0\x1e\x17\r140423232157Z\x17\r140523232157Z0E1\v0\t\x06\x03U\x04\x06\x13\x02\x41U1\x13\x30\x11\x06\x03U\x04\b\f\nSome-State1!0\x1f\x06\x03U\x04\n\f\x18Internet Widgits Pty Ltd0Y0\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x03\x42\x00\x04\xe6+i\xe2\xbf\x65\x9f\x97\xbe/\x1e\r\x94\x8aL\xd5\x97k\xb7\xa9\x1e\rF\xfb\xdd\xa9\xa9\x1e\x9d\xdc\xbaZ\x01\xe7\xd6\x97\xa8\n\x18\xf9\xc3\xc4\xa3\x1eV\xe2|\x83H\xdb\x16\x1a\x1c\xf5\x1d~\xf1\x94-K\xcfr\"\xc1\xa3P0N0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xab\x84\xd2\xac\xab\x95\xf0\x82N\x16x\aUW_\xe4&\x8d\x82\xd1\x30\x1f\x06\x03U\x1d#\x04\x18\x30\x16\x80\x14\xab\x84\xd2\xac\xab\x95\xf0\x82N\x16x\aUW_\xe4&\x8d\x82\xd1\x30\f\x06\x03U\x1d\x13\x04\x05\x30\x03\x01\x01\xff\x30\t\x06\a*\x86H\xce=\x04\x01\x03H\x00\x30\x45\x02!\x00\xf2\xa0\x35^Q:6\xc3\x82y\x9b\xee'P\x85\x8ep\x06t\x95W\xd2)t\x00\xf4\xbe\x15\x87]\xc4\a\x02 |\x1ey\x14j!\x83\xf0zthy_\x14\x99\x9ah\xb4\xf1\xcb\x9e\x15^\xe6\x1f\x32Ra^u\xc9\x14\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x81\xd8\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xca\x04\x81\xc7\x30\x81\xc4\x30\x81\xc1\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x01\xa0\x81\x8a\x30\x81\x87\x02\x01\x00\x30\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x04m0k\x02\x01\x01\x04 \a\x0f\brz\xd4\xa0J\x9c\xddY\xc9M\x89hw\b\xb5o\xc9]0w\x0e\xe8\xd1\xc9\xce\n\x8b\xb4j\xa1\x44\x03\x42\x00\x04\xe6+i\xe2\xbf\x65\x9f\x97\xbe/\x1e\r\x94\x8aL\xd5\x97k\xb7\xa9\x1e\rF\xfb\xdd\xa9\xa9\x1e\x9d\xdc\xbaZ\x01\xe7\xd6\x97\xa8\n\x18\xf9\xc3\xc4\xa3\x1eV\xe2|\x83H\xdb\x16\x1a\x1c\xf5\x1d~\xf1\x94-K\xcfr\"\xc1\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xd0\xb4\x17\x1a\xdb\xa3'\xd8\x9e\xd3\xf2\xb3>\x96\a:\xf2j\xc2\x1c\x04\b\xb5\xa8\xb9\xdb/\xf1\xa4\xcd\x02\x02\b\x00",
 };
-static const size_t kLen53 = 982;
+static const size_t kLen53 = 2636;
 
 static const char *kData53[] = {
-    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\br\xdc\x9c\xcd\xe8i\xd5\xcc\x02\x02\b\x00\x80\x82\x02\x30\x35\xfd\xeexGq\x12\x87\xc2\xcf\x1c\x12\xc4zhj\xb5!\xd6\xa4\x1a\r\xd3Gk\xad\xf0\xe0\xfcXk\xd1\xf1\x1a\xce\xf5U\xca;\x85\x18~\r\x1e\x33\xcd\xf0\xd1\f&ggD\xbaq\x93\xf8\xa4\xe0\x18\xe2\x1a#\x8e\xb5\xc7\xdc\xe1s\xa9\xa6\x03\xb1::\xbd!Q\x04\x30\xf0\x9e\xb5\xc9\xee]|\xf4\xaeU\xd7\x15\f\xb3P\xa4RIt\x1a\xb3\xe9\xe8\x95MW\x11Z\x8b\xf2\xdb,+y\xb0\xee\x1f\xd2\x02\xa4LD\x1c{\xea\x81\x8d\\\x1dR\xbeh\xf1V\x96\xf1\x14\x62,4\x12\xbc~\xa4YFm\x9e\x97\xd5*3C\x85\x93\x06\xf7\x8a\xc9\xd1\xb5\x91JR\xba\xde\xca\x34\x65K\n\xc8\x8a\xb1\xf1r!@\xc6o#\xf7\x42\xb9\xec\xbb\xf1\x43\x1b\x98n\xba\xe4\xee\x33\xc3Q\xcb\fg~\x19\xb3N \xabZ'\x81\xbbt\xd0,\xa6\x16\x18W\xdd\xcf\xf9\xdc=mS,\x91\xb6\xf1\xe6\xe2\xee\xc3\xc4\x06\x62\x98\x83*\xe8\xc7\xdd\"\xbc\xd1\xeb\x1f\xd5\x33IRr\x01\x84:\x9e\xbd\x98\x9b\x44\xffXfn\x03\x9a\x96R\x9e\x1d\xa2Y\xc5[2\xe1\x9e\xb0\xe0\x8c\xfbLA\x04:NA=|\x01P\x8f\xe9!\xaa\xfc\x8bVd\xe2kHt\x9fW!>\x7fy\x12\t\x84H\xa2\xcd\xdb\xb0'4\xf1\xef<\xe5\xef\xe4\xe2\x1f\x04\x85\xc6\x00P\x19\x65\x1b}\v`\t\xe5\xe1\xd1q\xdc/^\xfa\x86\xf0\x8c\xf0\xf0\xf0\x46\xc5\xff\xc7\xcbo7\x94\xc5\xb7\x62\xcb\xbc\x44,\v\x96\xb7\x1dO\xd6\xb0XP/\xd6\xef\xe6\xfbuL\xcf\xa6#y\xd1\x94|\xaf\xffN a_\x1dyY\\x\xd2\xad\xda\x87\xb9 [gP\x82\x8b_\xb0X\x99\x62\xa6\xd2\x03\x82\xbc\x8e\x89\xba\x9c\xe5 \x9a\x42\x37_[{\xf0\x64\xf2\xc5T\"\x9e\x15\xec\xca\xf7'\xad:\xfb<\xc0\x11\x9eK_A\xf1\xcd\x0e\xca\x9b\xb5\r\xab)vg\x04\x1b\xffR\xc7,\x14\xd6\x04#\xc9\xcf\xf4;q\x93\xb7\xe2/\xe6\x1a\x32\x19\xba\x1c\x93\x87s}Q\x1dku\xbd\x17\xff\xef\xd0\x8f\x65\x37\xa0Hg\x94\xfdjq\xb3?Ni\xa9\xc4\xae\xd1\x9bx\xdd\xeb\x06\t\xca\x38\x13;*\xed\xea\f\xdf\xfe\x1f\x15\x86k\xec \r\x19\xd1\x32\xd6h\xc8&\x04\x91\x46jgR\xba\x30\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b2\xe5t\x9b\r\xcf\xa3\x05\x02\x02\b\x00\x04\x81\x90\x7f\xa7n[s9\x15\x93\x42|\xda\xc0\x16\xa0u\x96=\x95\xc8Rke2\xe5\xce\x62\x9b\xd5\xac\x38\xd7\xaai\"\xcc\xa9\x8dt\x15\x87\x06\xbd%\xd4\xd5\xa5\xda\x12\xd9\xd9GB\x05\xf3\xb7\x17LT\xdb^\x1c\xb9\x1dk\xe2\xa8\x95\b \tq5h\xb7\x1cjl\xfd\x99\xf9+o\xb3SU\xd9\xbe\x8c\xb1&\x12\xab\x8aXh\x84\x9f\xa1\xa6\xebp3\x14\x0e\xf6\xb7\x31\x81y5\xb2\xab\x10M\xe3\x16\xbd\x7f~r\x12\xd5\x04\xd8#\x97\xca&8b,\xb7\t\x00?\x01\xe0\xf7\xff\x12%&\x99\xdc\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xd1\x96\xa3)\xa9\x45\x1d\xad\xa1x\xa7\x1e\x30\xb8v\xd0\x87#K\x02\x04\b\x9c\xff\x9a\xa3\xf5p\xa8\xd9\x02\x02\b\x00",
+    "0\x80\x02\x01\x03\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x80$\x80\x04\x82\t\xef\x30\x80\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x80$\x80\x04\x82\x05w0\x82\x05s0\x82\x05o\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xf6\x30\x82\x04\xf2\x30$\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x16\x04\x10\xacq\x8a|\x89\xcf\xa8\xb0\xd6\xd1\a\xf0\x83Oz\xd0\x02\x02\a\xd0\x04\x82\x04\xc8\xeaQ,a\xaa\x9d\xf3\x90\xe1\x38\x45\xb0_\xfd\xe2\x04\x65\xe6\xff\x87\xb6xi\xb0\xcb\x14\xe9\x99\x39\xe3\xe5p\x84Wh\xf7(\xb9u\xa6\xfb\x16r\xe1\x34\xb8;aQ\x89\x18\x94@\xefs\xda\xdb\xd7\xb7\x44s\x8f\x16\x84\xa2\x99\xa6\x05^t\xae\xe2\xcf>\x99\xca\xcdv6wY\xec%Y=KE\xa5N{z\xc9\x8b\xdeOpm\xb1\xa8\xf3\xb6\xb5\xe7g?\xe9\x64\xb8I\xf4\x11\x94\x9d\x1c\xb0\xa5\xfb\xb3\x61\xd4\xf3\xa7hf\xd7\xa4\xf0\xcd\xc8@O>\xa7&@vd\xa1N\xf1\x91\xc2\xa3\xef\xbc\xcd\x42\xe5\xd2o\xff\xfeM3\x01\xb4\x99\x63\x1b\xd3\x01U\x00\xa6#\x9b\xa9\x17\t82\x18\x36\xbc \x02\xfe{\xec\xd3L}\xc9\xc9\xce\x66;4n\xea\xf9\xb1\x1a\x83\xa3<\x8d\xc7y\xc9\xffk\x1d\x35\xf6*=;\x83\x16\x64\xcf\x9f|1\x02\xda\x37\x1a\x16I\xdc\xd9p\xae\x99,\xc7\x01\xba\x42\xab\xe9M\xa4x,\xbd\xa0\xf1\xb7\xcf\xdd\xc1\xdb\x8f\x04\x87\vGO\xd5\xd5\xe7\xfcnB\xd5\x91M{\x1b\\<\x02p\xdb\x05\x91\xaf\x35\x43\x05\xc2m\xcfY#\xfc\xc4\xf6g\xf1\x84\x61J\xb6L\x15\x15\xa3\xea\x8f\x13\x15\xe3\xd2\xb5P\xc8\xae\xc8\\\x03\xb5\x63\x93\xaa\x10\xd7V\rn\x13\x45\x8f\xec\x17\\\\s\x91_l\xaf\x11\x13\x32^\x14\xf9\xaf\xaf\x43\x04`\x93\x42\x30\xa6u\xc0\x83\xd2L\xa5\n\x16\x39\xef?\xf7\x9d#\x19\xb9\xcd\xd8|n\xeem.\xffZ\xf3\xb9\xab\xe5\x64\xdc\xc2g0s\x19-\xea\xd2\x19\x1f\x1f\xe0\xd9\xac\xc9\xdb\x38t^1G.\x9e+\xcc\xb9\xe4)\xf8\xb2\xbf\x1b\xbch\x96y\xcf\xaf\xf2\x1fW?t\xc4qc\xb4\xe8\xbeX\xdb(b\xb5y\x8b\xe4\xd0\x96\xd0\xda\x0f\xd2p\x93/q\xe0\x9f(\xb7R8\x9c\xcb\x8b*\x8e\xbf\x0e=`\x05\n\x91[\xb5x\x10\x31\x00\x80\x31-\xd7\xb0\x88\xc7\xd9X\xc6\xfc;\xf4\xee\xec\xba\x05\xae\xae\xff\xcf\xd0q\xc6\xe7\xf3\x8b\x64Pz\t\x93\x0f\x34Y-\xdeK\x1d\x86I\xff\x63v(kR\x1b\x46\x06\x18\x90\x1c-\xc5\x03\xcc\x00M\xb7\xb2\x12\xc5\xf9\xb4\xa4j6bF4*\xf0\x11\xa3\xd6\x80!\xbf;\xfd\xc5%\xa0M\xc0.\xc0\xf1{\x96\x11\x64\x8e\xb9\xdb\x89N3\x89\xf5\xc6\xfc+\x99\xf5\xc2\x04\x83\x15G\xa8\xa5\xc1J\xe4v\xab>\xf0\x9b\xb7\x8d\x46\xd3R\x9b\xbd\xfd+\xbas]#gh\xe1voV+\x17\xe4~\x9a\xfd\x05H9\xc9\xcf\xa5\x83\xf7\x90\x9c\xa4(W@\xe9\xd4K\x1aKoe\x14\xca\x43\xc1?|\xec\x82G\x0e\x64\x8bo\x8c\xb2\xf0m\xeboq\x8f\xcc-`+\xc3\x9f\x13\x94\xc7#\x02\xf5\xe6\xdf-\xa9\xdb\xa9\xf3\xee\xe9?*i$kx\xffj\xd7\xe4i\x8c\x17\xd5\xc1\x36\x1a\xcaw\xb0\xb5k\x96J\xb5\x0eM\v\xd6\xd9x\xc5\xbf\xe3Y\xfe\x63\xe3\xd3<\x9a\xfa\xd7i[\xef\xd3\xa4\xa3\xb9\x1f\\@ \x95\x38-\xf5\x04\f,yw\xc1\xb6\xcct<f\xf1\xc6\x65\xabMhA\x16qQ\xb9\x1b\xcb\xa7m\xe0p\xa9\xfa\x65k{\x1e\xc5\xdf\xe2L\x96\x44k$\xa1\x15\x8e\xe7\x9b\x1fQ\xef\xd7\x65_\xcdt\x7f-\\\xba\xba 2\x8d\x1c\xf1Z\xed!\xadx{YX\xe4\xf6\xa7\x10\x35\xca]\x86\x1ah\xba\x1c<\x1c#y\x8b\x9f\xda\\\xd1Z\xa9\xc8\xf6\xc9\xdf!Z\x98\xdc\xf4\xb9\x02\x97,\x10`\xc9\xb5\xeau\v\xd9\x8a\xa4\x86\x92\xbe\xf5\xd8\xc7k\x13\x8b\xbb\xca_\xe4\x8b\xce\xb5'\xaeS\xed\xef\x37\xa6\x81\x8fp%\x18\x93\x06\x8c\x18\xcdz\x1a\x8d\xfc\xdeo0\xdb\x41\xb6\x42\x14T\xf8\xcd\xc6\xf8\x0f\x82\x17\xfa\x8d\xba\x80\x81j\xf7\x02\x97\x00x\xd6[\xc9\xba\xd1\x99\xef\x8eHl5\x10[\xf1\x9b\x93O\xbd}'\x9e\xc7\x86\xb2\x8fj\x91Y-\x14\xab\x1b\x34n\xfa%^\x14\xc7\xef=\x0f\x13\xf9\x45K\x90\xbc\xd8QB\x95%\x9b\x1b|\xaf;`!L_|cKE\xa6\xdc\xfd\x32\xf3\x06\x61\x11-'\xde\x19\x38\x63\xf9p\xd1\x82\x8e\xc7\x99\xe1\x96\x9bT\x93\x64_\xd1\x62\x9c\x37\x10\x1a\x8a\x82\x8d*\x93\x95\"\xc9!\xf5\xce!\xbb|\x17\xee \xa0s\xaaixN\r,,\x96#\xdc\a\x16\xbd\xe7\xd5I\xcc\x44\xd1\x9d\xd7\xa3\x01`\xa0\xe0\x41\x63(\x8a\x43\xdbO%['RJ\xee\x42\x43\x9a\xef\x33\x43p\xda\x64WI\f\x7f\xfd\xc7\x88&\x94\x10\xcc\x05\x1dT\x95\xeaNe(\x03\xbc\xa2\x62\xd2\xce`4\xf9\xdb&\xb5\xe6\x9bU,\x8f\x30:\x94\x9a\x15y\"uM\x1b\x91\xe0[\xdb\xd1\x15\x7f\xcc\xc6\x88\xb5\x00?]\x84.h\xdeoA[N\xe7\xdf\xe6;~\xf2\xdd\xfc\x01\xf2\x1bR\xba\xc4Q\xae\x8f\xa0U\x12\x81W\xe0X^\xea\xd7\x85\xfb\x19\x8b\xb7$)\x94\xa7\xfc\xed\x17\xaa\x32P\x11\xb3zC:\xc0+\x82\x9c\x85\xd9\xd0\xdb!q\x83\xb4\x30\x14\xec\xfc\x8d\x32\xd6\xa2\x36^;\xe9\x12\f\x95\xd6\f\f1f0?\x06\t*\x86H\x86\xf7\r\x01\t\x14\x31\x32\x1e\x30\x00I\x00n\x00t\x00\x65\x00r\x00n\x00\x65\x00t\x00 \x00W\x00i\x00\x64\x00g\x00i\x00t\x00s\x00 \x00P\x00t\x00y\x00 \x00L\x00t\x00\x64\x30#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au\x00\x00\x00\x00\x00\x00\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x80\x30\x80\x02\x01\x00\x30\x80\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30$\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x16\x04\x10\x9d\x1bh\x8e\x11\xc2\xb2\xd6\xd0\xe9Z\x9e\x96\xc1\x8c\xa6\x02\x02\a\xd0\xa0\x80\x04\x82\x03\xf8\x1d\xce\x13pzk\n\x12-\x01\x84\x63\\\a\x82#\xf8\x8a^S\x8f\xc8\xb4\x87\x1a\xa2\x98\xdb\xc6&\xca\xbb $\xad\xac\xdf\xbesm\x97Kn[E\xd2\x84\xd4\xa4\x82\xd0\xce@\x13LmM.\xc1\x96\x95\x01\x64\xf3\xf0_\x06\x06\xea\xf7\x84\x8f\xb3\xb0n|\x9bqs\xb9\xcd\xacr\xf6\xa0#\xda\x9b\x9f\xec\x16\xef\x33\xd4\xd0M \xf0u\xa9s\xf4\x31\xc7W\xb8\r\x9d\x85|\xee:${t\xa0\\\xad\xde^\x05\x1e\xeb\x02x\x12\xb4\xb9\xc6\xe5\xc5\x99\xbc\x05\x62[\x10R\b\x00\x9es\xac\xe4\x1d\xdb\xb8\xbfH\x03(\x05<a\x1a\x8bL\xd7_\x8c\xb4\xcd\x91\x1c\v\xf4U\xd4\x1c\x42J\xd4\xf5\x15\x38\xd9\x06\xfcI\xf6\xe5\xa7\t]\x01\xbd\xc3\xd1\t\x9f]\f\x19\x43\xd0\xfa%\x17\xad*\xbf\x89\x63\x06\xa8\x02\x03\xe4\xfe\x19\bp\xa1tt\xb6\xb6\x0f\x19MT\xa5\xb2\xd7\x37;\x17\xc0]\xc2\x8a\xf1\xcc\xed\xef\x65\xc8\xca\xbe\x02\xd4\x9b\x1e\xef\xc9\xe0\x91\x82\xb0\xe0P\xc7\xa0\xcc\x01mU\xe5g\x99\x65\x13\xe4\xd2\x90\x91\xf3v\vj-\x19\xaf\x61\xb3\x7fL\x04\xfeh\xf6\xb3V\xd8\xf3\x34\xd7\x04\n1\xc8\x37\xdf\xac\xd8\x91\x80\x8a\x30\x12\"\x80\xd7$\xcfp\xafV\xaf\x81\xfe\x63\xf1\xeaWL\xf2\xdb\x30P\x92\xc1\xeb\x04\x9a\xdf\xf5tW[X\xc2Nk\x11\xf3\xe1\xb3\x0fV5\x04\xf8P\x1d~\xe6\x99\xa2H\xdb\xea\x62O\x98\xc2\xef\xbf\x7f\x94\xc0\x36\xc0\xf3'\xfe\xe2\x17\x1e\x91}\x96\xa9+qQ\xc3Y-\x11P\x1e\xcb\xce\xff\x04M\x16\xf5\xc2\xd4\x1f\xdd\x7fZ\xfd\x1d\xe9\x63RDv_\x91\xfd\xe8\xdf\ni\r\xd3\x64\x91\xea\xdd\x03OB\xa5\xe9\xa1p\x05\xf3\"\x8e\xadp\x1a>\x94\x42\x06\xe7G7=\xf5\xda>*:\xc0#\xd9J&i\x13\xa6\x93|\xf2\xaf\x04^\x9b\x88\xc7w\xd0\x93\xab\x1b\xbd=i\x90\xab\x41\xa9\xbc\x84\x18M)\x02\xc1\xf8\xff\x63\x18$t\x8f~D3\xaf\x88\x8b\x93[\x9a\xaek\b\xa2\x82]\xf3\xbe\x61\xc3\xf0-1L\xb5\xb5\x91\x0f\xfa\x81\x61\xad\xfc\xba\x91\xeb;\x9d\"AE\x0e\x8e$\xc7\x1c\x81\x95\xa8{d\xed\xa5\xecZh<\x85\x8d\x92\xb7$\x0f\xed\xf5\xc6\x31\x61\xdc\xef\xa7\xcb\x8f\xda\x43\x05\x42\xf6\x9e\xbc\x1b\x9a\xa1\xe8\x1d\x8d\x42\xdb\x80\x83UR+\x95\x00\x05\x82\x84\xc3T#\x8e\x1d\x00\xa2\x16>\xce=\xcc\x9e\xb8LY\xb2\x12\xa2#\xc1\x46P\x86\xaeu~I8w\x94\xf0'\xd8\x17\x38\x8c\xe0s\x00\xfb\xaf\xbf\xe8\xed\x85X>\xb4\x88\x04\xc8\"\x1b\xb4u\xa2\xc4\xdd\x06\xd2\x83\x42!W\xfc\xd8\xae\x9c\x0e\xd8jp\xd1\xeb\x44\x9c\xb7\x37\x04\x05\xf5\x17\xbe\xf3V\x1b\x06\x36\x1cY{e\x8d\xbb\xbe\"\x9ap\xa3\xe9`\x1a\xc9\xdd\x81<-N\xc0\x8a\xe5\x91\xa7\xc1\x80\aGztO>J\xdc\xb2\xcc\xff\x37\x66\x05\xcb\xd6\xe9\x90\xf5\xef+~\xa7\x66Q\xcbH\xb3\x8ao\x06\xba\x8b=56\xdf\x0e@\xe5\xa1\xe3\xdd\x89\xab\x64\x9c\x01\x15\x9e\x93\xea\xf9O\x9e\xf5\x8b\xf2\xc2\xbb\xe5\xc3\xa3\xe3\x13\x63O} \xe4\x66\x96\x84\x8d\xd4\xcarR\xdc\xb8\x93\xd4\xa5>nBV\x80\x46w\x86I\xfe\xf3\xb4[7\xfc\xb8\f\xd7\x63\xac<o\xf0\xbe\xbe\xb4\x13\xe7\x34\xe5\x06\xbf\x17Hn\xc0&\x94\xdd\xed\xf4\xda\x97%\xab\xd6\x9b\xc3\x8c\xeb\x17\t\xfc\x03Z/\x19\x85P\xc4\xe6\x35q\x94\xad\xc5\xcf\b\xcfi;\xc3\x31\xec\xf1\xfa\x80\x66\x8f\x14\xdeV!\x12\x9b\f\xdf\x92H\x06\xce\xdb\xeb(T'\x8b\xa9\xef\f\xf4\xa0\xcc\x84Y`\xed\x18\x65\xcag\f\xd1\x1f\xcfYK\xce\a'\bj\xeaS\xdcG\xb3N\xe4\v\xff\x9a}k\r/-`\xd7\x8b\"\xf5\x30\x43\t\xe6\xdf\x01\x03'-\xb5tR]\b\xc7ZD%\x0f,\x14\x8fH\xea\x18\x99\xd1\xcc\xc5\xdc\x65\xa5=%\x94\xa9\xc7\xad>\xa4\xf6\xe6\xbd\xa7p\xd4\xdc\x9b&\xcb\x31p\xaf>\xa4\xb6\x8d!1g55\x86g\xd1\x02l6v\xc9 \xf6\x0f\x30\x41\x83\x19\xf5\xe1\x33\x90\xbc{\x8c\x9b\x8ah0\x9e\xed\xf4\x88\xc9\x04\b+\xb0\x0f\xae\xc7\xe0nR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x39\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xe0\xf7\xa1\x1b\xf6?\x05\xadUj Lq\xca\x62G\x13(\xd5\x05\x04\x10>\x87-\x96\xea\x80K\xab:\xb9\xee\te(\xbc\x8d\x02\x02\a\xd0\x00\x00",
 };
-static const size_t kLen54 = 2469;
+static const size_t kLen54 = 982;
 
 static const char *kData54[] = {
-    "0\x82\t\xa1\x02\x01\x03\x30\x82\tg\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\tX\x04\x82\tT0\x82\tP0\x82\x04\a\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x03\xf8\x30\x82\x03\xf4\x02\x01\x00\x30\x82\x03\xed\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b1$\xca}\xc3%>\xdc\x02\x02\b\x00\x80\x82\x03\xc0U\xe7\x7f\x9c\xd6\f\xd2i\x1dn\x8b\xb8\a\xecJ\xe7\x06g\xd1$\x1b\xd5h\x13=\xd7V^\x15@\xdb\xda\x88\x36\xc9\x02\x96\xb5\xb5\xf7\x81\xef\x88\x1d\x66\x62\xa8\x83\xf7\x91\xb1&\x1f\x9b%x\n\x04\xb1\xc0\x93H\xa2\xf0QO+\xf8\x03ga\x1b\xed)\xfe?\xdd\x83\xa3\x93u\xa7\xd9\x37[\xa7\xc9\xf4R\x86\xd2?\xca\x61\\\x1e\xf9\a}\xbd\xdav\x8a\x03\x8e\x12N\x8fhnrn\xf0\xbe\"\xc7\x9d\x97|E\xc0\xaa\x31\xe1U\x81\xb3\xec\x98\x94\xac\xf7\x15\x9b\x42I\x8c*)z%\x92\x64\x92\xbdN\\\xec\xff\x61\xbb\x8e\\\xc8\xdb\xba\x97\x30\xf4U\x9e\x1b\xfa\xbe*\x90\xcf\xe8\xc0\x9d\xb0\x0e$a\xe7:\xb7\x7f\xda\x63\xaa*J\xa6\x91R\xa6v\xc9\xbe\x9f\x1b\x1d\xa4\t[\x0f\xd1\x64N\xdf\fDY:\xef\x9a\xd8\"\xa2_\x80\xb5O\xbe\x84#\xe3tw<\x9e'd\xac\x65\xf4\xbb\x34\xb7\xa4\xfe\x02\x1a\x88\x05;K\xb8\xd8\xb9&i\"\x97=\x93\x9b\xe8r\xaaM\x8fvQ\x12YX\xf1\x1a\xa3\xdb]\xbc\xea\x84\x19UO\x00\xfb\xe2WG\xca\xea\xbe\x8f\x85\x8b\x1c'\x8d\x81p\x7f\xf1VX\xe1&\x94\xd8/\xde\xac\xc8\xac\xbf\xc3\xc6g\xa6\xf4l\xec <\xbc\x9d\xd9\xd0\xa1N\x8c\x11\x19+\xb3\xa1\xdfj\x8f\xa2\xc3\xcc\xf6\xbd\tz\x96\x61 \xd4\x06\x99Lo#\x9bL\xccs\x8b\x42H\x99\x45\x8f\xcb\xc8\x46\x1a\xfbQ\x03j\xf2\"\x85\x88\x9d\x61\x8b\x16\x33\xf4\xf7\x9b\xc8!O\xb1\xcd\x30\xfc)\x88\x12\xdc\xd4\x30L\xb9\xad\x34\xde\x01\xf8\xc1\x12\xa7M\xc7\x31\x99+E\x88\x06\x34inm4\xd8\xdd\n=Yt61j\xed\x91;[\x88\x43\x46?gf\xe4\xdeR\xb4\xbf{=Ty\xaf\x8d\xf5\n\x80\xfd\xeb\x31$\xbc$\xd7!\x9f\x87\xab\xbdu,\x13\x13\x96\xabv\xfb\xb2\x44\xd0\xd2\x19\xf1\x95\x9a\x91\xbfz{v\x95r\xa9\x16\xfc>\xa9N\x01\x15=Cs\xa3\x8b\xefH\xad\x11\xbdS\xd3\f\x15\x15\x1a\xb4:\xe0\x7f\x9a\xa1\x36Gr\x92\xf0\xdf\xb0\xe2\xbc\x35\xd4\x32k7iOG\x9a\xe2\x35\x8a\x31`\xed\x80W\xe2\x9dX\x9c\x7f\x46\xd2T\x0e(S\x8b\x1f\x46\x34\"\xacq\xc7\xca\x0f\xb4\xb7z\xfc\x34W\xa5\x86\x8d\x66\\\xc7:\xdb\xf8y:\x8a\xf6\xa2\x1e\t\xc9\x10\xe9\x93:\xc5\xed\xb2\xca\xbb\x66\xf1\x9d\xc9\x9c\x42ud>\xe4\x12+g\xf8\xbf+\x98]\xb6\xa0\xbay\x98\xe0G\\w\x85N&q\xfe\xab\\\xa8\x32\x93\xec\xd0&\x90\xe4\xda/4\x8aP\xb8;{L_\xa9>\x8a\xa8\xf3\xc0\xb7P\vwN\x8c\xa0\xaf\xdbY\xe7\xac\xd1\x34NbG.\x1e^\xb4\xc9\x64\xf8\x0f\xf4\xf8\xb6\x9a\xe3~\xcf\xb7\xee\x11\x14R\x89;'\x98\xfc\x95\xa7\xad\xbf\x61\x34\xad\x1a$*Hfeu\x9cY\xc0O_=Z\x8c\xee\xd0\xb1\x17m4F7\xa0\xbaq\xacws)\xa3\x37O\x02\xd3\x7f\x0e\xe8\xce\xff\x80\x11\x45\x42\x03Z\x87\xaa\xff%\x12\x1f\x43\x19>\xa9\x62\x96\fo3\x88\\\xaa\xf9\xe2\xb4\xb9\xf7U\xae\xb5vWG\x83\xe3\xfa\x05\xda\x86\x02\x97\xb4`\xaeY\xd5l\xc1\x33\xe1\x36\x36\x94y\x9e\xad\xa3-\xbc\xb5\xa2\xeb\xdd\xcd\xcbHB\x15\xb8\xe6\x0ev[Wt$\xe6\x89\xc4\xe8\b\xa9\xfe\xb3#\xa6\xcar\xe2\xe4\xcb\xc1J\xd1\x1d\xb9^6\x97\x19|\x15H\xf1-\xeb\xec\xadRo/\xe1\x19\xcf\xcf\x98\x13\r\xcc\xb2\xa6\x8a\xda\x93$=]\x83\xfe\x8d\x9eG\xd8n\x8d\x06R}F\x84\x04i4a\x04P\x1f\x86\x92\x94\xe9\v\x13[\xf6\x16\x81\xeb\xfa\xf1\xbb\x04h\x17\xca\x35o\xbaNL3\xce\xf4&\xb7t\xab\xa5\xd0\xaa\r\x85\x11\x30Xb\xdfH\xc7\xdf\xc9\x38\x9eo\x96#/\xc1\xd4\x8d\x65\x9b\x46_\x9c\xea&`\xb5\x95\x85q\x18\xc3\xf4Ta\xca\xfeU;\xbe\x81\xaf\xd9:'\xe9\x1c\x30\x82\x05\x41\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05\x32\x04\x82\x05.0\x82\x05*0\x82\x05&\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xee\x30\x82\x04\xea\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b\xd9h\xcb\b\x16\xc8\x93W\x02\x02\b\x00\x04\x82\x04\xc8|\xdb\xa6\x1e\x33\xa4\xc6N\x13\"z\x1f\xc6\x82\xab\x93_\xf0\xa4\xe4@\xac\xdf\x16\xec\x8d\x1f\xd9\xe4\x03\xd6\xc9\xc4\x1d\xfd\xa3\xe3\xba\xfc\xcb\xd0Ge\fn]\xfc\xd2\xd4\x63\xa7\x93\xf6\x8a\x44\x8c\xfe\x84\xd8\r\xa6\x16\"\xe1\x65\x10^\x18\x44X/\xc7\x64t_\xcfs4\xe1K\xe4\xb3[\xdb\x81K\x1c\x38r\xa6\xc5\xebV\x9b\xc7\xe3=Tn\x05,\xd3W\xc9O\x80\x1e\xd7\xd8&j\xcbyFp\xfc\x45\xa7y\xab\x01\x03\xb6\xb1\x44\x41\xd9s7\xaa\xd7\xf9\x44\x93\xaf\xbb\xb5w\xeb+ .\xbd\xea/\xde\xa6/\xd6\xact\xa5\x34\xfb\xdf\xf7\x02\xa2 \x15\xc8\x61r\xbb\x7f\x04\xf6\x0f\xf8~\xc3\xe6\xab*\xe6\xd8\xe1\rZ<\xc0X\xae\xf8\x1b\x15<{\x7f\xf5\x9f\xec\xf7?0O=lD\xdd\x0eL,\x93hC1\xa8\x97K\xf6\x66q*R>:\xe6r\x8a\xe6\xe3\xc8\xff\x65h\x1a\x46!\xb3\xf0\x46|\fe\xd1\x8e\xa4\x91\x11\\\x93\xeb\xeb\xae\x46\xf4\xbb\xf8\xf3~ 0\xf8\xcd\x19\xcdT\n\x7fO\xe8\xac\xa9\xacr\x96\x80\x45*Jc\x90\x01\x19\xd0~&S-\xc4 \xa5\x1f\x89g\x0f\xd9uQ\n\xf1\xd4\xfd.\xbe\xe6\x94;l\x8c\xe3\x0f_\xceXH\xde\x8d\xeb\xd3\xe1\n\xcd\xdf\x34M\xd1[\xab\x41\x41k\xeb\xa1/\x01Jr.\xf4^Dv\xc7\xe6\x16\xb9\xfb\x10\x37\x00-\xc6;\x17r!\xdb\xac\x86{\xf5p?s\xa3\xce\x0e \xbbYL#\xc2\xe8\"\"\xe0\x02\r\xe4\xa2?U\x9d\xc0\xeb\x9a\xc4\xf3\xaa\xb8\xf1s\xecG\xe8-k\xa1@\x94\xf6\a\xb9o\x03Zx\xe5YA\x1a\xc7\xcd\x43\x10 (\x95\xe0*o\xf2\xf8\x12\xd6\x13\x7f\x37=8\xa7\"\x91\xc6\xe3R\xde\xd8\xbfx\x9a\xa4\xf7\xc0\x8c\xbf\x81( \xb8\x01\xde\xb5k\nV\x12\\b\x1d\xaf\xb7\xf2tf\nz\xc4\x9f\x1e\xc2\xa8L\xd6vmt57\x12\\\x95\xee\x98\x1d\xe2\x91\xde\x13\b\xd0YMb\x92i\x1b\xf7!E\xaf\x83\xf8\x64\xf0\xfb\x92\x9d\xa1\xd9\x61^\x00\xc8\x1anj-\xad\xa8\x1b\x0e\xaf\xea\xb2\xae\x1c\x89\xc7M,\x0fM\x8dx\x8d\x15\x9dL\x90R\xa1\xa9\xd8\xb2\x66\xb9\xb1\x46\ni\x86+\x0f\xb2\x41\xce\xe8\x8eI\x97\b\vp\x97\xcb\xa4\x33?\x83kl\x17\xce\xd8\xd5\x9b\xd4U\x9b\x99\xe1\xba\x61\x31\x36y1_\xa1\x8c\xa9wB\xaa\x8c\x45n\xb6\x90\b\xe8.\xc4riB\xca\xa2\xd4\x8a,7\xe1\xde\xb8\x98\x36\xeb\xccX\f$\xad\xab\x62\x44m\x80\xd5\xce.J>\xa5\xc5\x34\xf8\x32&*V\xa4\xdd\xe9\x92\x06\xad\xe8\x85wk\xf1\x1b\xeb\xacw\x19\x1cj\xb7\xef(p\x87\x92\x33\xdd\xaa\x30\xc1\xa0\x93\x64\x18\xa2\x91\x7f\xf7\xc4\xa5\x16\x93\xb3[\xd8S(\xc5^\xb1\xce\x97\xbc\xb6\x65\xa8S\xcd\xf4Mk\xeaoo\xa5\x1c\xf1\x0f\xcb\x04%J\xfe}\xfc\xa3\xbd\x41\xd3\x96j\x8b\xad\xd4\xaa\nv\xea;\xab\x39U\xa3\x89\x9f\xf6\xf5\x9b\x9c\x83\xf8(P\xdf\x31t\x83\xdb\xf1\x0fL5j\xe5\x64.\xb9w=\xdd\xff\xa3\xa7\x90y\xc6[\x01\x16\x38\xa8\"\xa3\x14\x13\xed\xd0\x89\r\x1f:ALWy\xfc\x1d\xdf\xad\x1a\x11\x15\x31~\xdb\x99:l\xde\x94\x9a\x45L\xfb\xa5\xa5\x31\xee\xe3\t\x13m\xfd\x19\x37?\xf6\xed\x8f\f\xceK\xd1\xe1=\xfb\x85\x00\x84\x19\xeb\xa2\x63\x1d+-!\xee\bZm\xb0\xb1\xd6\x81\x00\xb6\xd0\t\x90\xb4\x84\x17\xd9*<\x1dS\xc6\xc1\x8b\xda\xae\f\n>\x1c\x8a\xc4\xd6\x97]H\xe7y\x80x\xaa\xde\x17`](\x15:B\xb7\x85\xc8`\x93(\xb0N\xc9\xf7\x46\xe7\xfcN\x9f\x9f\x12\xdf\xcbn\f\xafq\xda\xb7\xec=F\xf3\x35\x41\x42\xd8'\x92\x99\x1cM\xc9<\xe9\x0e\xcb?Wew\r\xdd\xff\xeap5\xcc\xf5\x38\x1bW\xdfm\xcb\xfd\x13\x39\xd6\x04\xe2\xf1\xc2\xd9\xea\x8c\x9f\xfb\xb5\xfc\xe6\xa9\xaa\x0f\x43\xc9\x9c\x91\xe4!\xaf\x37\x14xF\xe1)A\fN\xf5\x93\x1d\xf8\x33Go\x9d\x8b\xf3'\xd4\xbb\xf6\xae\xfa\xa5\x8b\x41\x8f\xb4\xd7/\xc1'\xeapU\x1d\xe2\xd8\fJ^|\x87\xa4\x0e\x84\a\xd3\x38g,U\x11\xfd\x1e\xdaMf\x01\x12\f\x1b||\\\x82!5e\\z\xd2\x66\xc2+^\xb8\xb1\xcb\xdfY\xc9\x31\xb7\x17&\x96^o\x1c\x62=\x8d\x88\xf1\xd1\x01>\xf9o\xb9w\xdc\xee\xeexY\xef\xcf:\x87\x88\xa2\xea\xfd\n\xa9\xa9>\f\xf8\x7f\x97\x32\x17\xc2\x97\xcb\xa4\x9b\xae]\xe7\x39++\xa8\xe6{Qu\x1fST7\xf4\x00\xa4\xb0\xa0\x93\xb4\x33\xe7\xae(\xc0-:\xb3\xaa\xd7<vDK\xbbjg\x98\xce\xf8\x15\x13gy<\x15\t\xb7\"\xc0\xec\a\x8a\xfd\x44\xcb\x99\xbd\xdc\xd5SL\x97\x1b\x46\xaf\xc0l\x06\x01\x93\x8aPQj\xe4\\\nR\x81;u\xed\xa2\x97\xa6\\Uc\xee\xfb\x33\x82\x10\xa8!\x1a\x8d\xc8\xe1Rh8\x88/\xae+\"z\x9b\f\x19so\x91\xc7\xfa\x95\x61(tsp1%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\"\x8e\xffZx\xec,!\xa2H\xb7\x63\x88\x10G\x1c\xc0\xd3\xecZ\x04\b\xb3.!\xfd\x82\x14\xd8\\\x02\x02\b\x00",
+    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\br\xdc\x9c\xcd\xe8i\xd5\xcc\x02\x02\b\x00\x80\x82\x02\x30\x35\xfd\xeexGq\x12\x87\xc2\xcf\x1c\x12\xc4zhj\xb5!\xd6\xa4\x1a\r\xd3Gk\xad\xf0\xe0\xfcXk\xd1\xf1\x1a\xce\xf5U\xca;\x85\x18~\r\x1e\x33\xcd\xf0\xd1\f&ggD\xbaq\x93\xf8\xa4\xe0\x18\xe2\x1a#\x8e\xb5\xc7\xdc\xe1s\xa9\xa6\x03\xb1::\xbd!Q\x04\x30\xf0\x9e\xb5\xc9\xee]|\xf4\xaeU\xd7\x15\f\xb3P\xa4RIt\x1a\xb3\xe9\xe8\x95MW\x11Z\x8b\xf2\xdb,+y\xb0\xee\x1f\xd2\x02\xa4LD\x1c{\xea\x81\x8d\\\x1dR\xbeh\xf1V\x96\xf1\x14\x62,4\x12\xbc~\xa4YFm\x9e\x97\xd5*3C\x85\x93\x06\xf7\x8a\xc9\xd1\xb5\x91JR\xba\xde\xca\x34\x65K\n\xc8\x8a\xb1\xf1r!@\xc6o#\xf7\x42\xb9\xec\xbb\xf1\x43\x1b\x98n\xba\xe4\xee\x33\xc3Q\xcb\fg~\x19\xb3N \xabZ'\x81\xbbt\xd0,\xa6\x16\x18W\xdd\xcf\xf9\xdc=mS,\x91\xb6\xf1\xe6\xe2\xee\xc3\xc4\x06\x62\x98\x83*\xe8\xc7\xdd\"\xbc\xd1\xeb\x1f\xd5\x33IRr\x01\x84:\x9e\xbd\x98\x9b\x44\xffXfn\x03\x9a\x96R\x9e\x1d\xa2Y\xc5[2\xe1\x9e\xb0\xe0\x8c\xfbLA\x04:NA=|\x01P\x8f\xe9!\xaa\xfc\x8bVd\xe2kHt\x9fW!>\x7fy\x12\t\x84H\xa2\xcd\xdb\xb0'4\xf1\xef<\xe5\xef\xe4\xe2\x1f\x04\x85\xc6\x00P\x19\x65\x1b}\v`\t\xe5\xe1\xd1q\xdc/^\xfa\x86\xf0\x8c\xf0\xf0\xf0\x46\xc5\xff\xc7\xcbo7\x94\xc5\xb7\x62\xcb\xbc\x44,\v\x96\xb7\x1dO\xd6\xb0XP/\xd6\xef\xe6\xfbuL\xcf\xa6#y\xd1\x94|\xaf\xffN a_\x1dyY\\x\xd2\xad\xda\x87\xb9 [gP\x82\x8b_\xb0X\x99\x62\xa6\xd2\x03\x82\xbc\x8e\x89\xba\x9c\xe5 \x9a\x42\x37_[{\xf0\x64\xf2\xc5T\"\x9e\x15\xec\xca\xf7'\xad:\xfb<\xc0\x11\x9eK_A\xf1\xcd\x0e\xca\x9b\xb5\r\xab)vg\x04\x1b\xffR\xc7,\x14\xd6\x04#\xc9\xcf\xf4;q\x93\xb7\xe2/\xe6\x1a\x32\x19\xba\x1c\x93\x87s}Q\x1dku\xbd\x17\xff\xef\xd0\x8f\x65\x37\xa0Hg\x94\xfdjq\xb3?Ni\xa9\xc4\xae\xd1\x9bx\xdd\xeb\x06\t\xca\x38\x13;*\xed\xea\f\xdf\xfe\x1f\x15\x86k\xec \r\x19\xd1\x32\xd6h\xc8&\x04\x91\x46jgR\xba\x30\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b2\xe5t\x9b\r\xcf\xa3\x05\x02\x02\b\x00\x04\x81\x90\x7f\xa7n[s9\x15\x93\x42|\xda\xc0\x16\xa0u\x96=\x95\xc8Rke2\xe5\xce\x62\x9b\xd5\xac\x38\xd7\xaai\"\xcc\xa9\x8dt\x15\x87\x06\xbd%\xd4\xd5\xa5\xda\x12\xd9\xd9GB\x05\xf3\xb7\x17LT\xdb^\x1c\xb9\x1dk\xe2\xa8\x95\b \tq5h\xb7\x1cjl\xfd\x99\xf9+o\xb3SU\xd9\xbe\x8c\xb1&\x12\xab\x8aXh\x84\x9f\xa1\xa6\xebp3\x14\x0e\xf6\xb7\x31\x81y5\xb2\xab\x10M\xe3\x16\xbd\x7f~r\x12\xd5\x04\xd8#\x97\xca&8b,\xb7\t\x00?\x01\xe0\xf7\xff\x12%&\x99\xdc\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xd1\x96\xa3)\xa9\x45\x1d\xad\xa1x\xa7\x1e\x30\xb8v\xd0\x87#K\x02\x04\b\x9c\xff\x9a\xa3\xf5p\xa8\xd9\x02\x02\b\x00",
 };
-static const size_t kLen55 = 2567;
+static const size_t kLen55 = 2469;
 
 static const char *kData55[] = {
-    "0\x82\n\x03\x02\x01\x03\x30\x82\t\xc9\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\t\xba\x04\x82\t\xb6\x30\x82\t\xb2\x30\x82\x04\x34\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x04%0\x82\x04!\x02\x01\x00\x30\x82\x04\x1a\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30I\x06\t*\x86H\x86\xf7\r\x01\x05\r0<0\x1b\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x0e\x04\b\xdbH\xe6\x98\t\x8fn-\x02\x02\b\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\xee\xb3\x10\xe5!\x85\x03>i\xad\xdfx\xa7\xd8\xac\xf1\x80\x82\x03\xc0\xcbX\x11(\x1d\xbc<\x8c\xe7{\x15g0\xf3+\x94\x10\x8c\xbe\xfd\xaa\x11\xd7\x99\xee!\xb6\x1bOS\xcb\x44\xffO\xbf\xf6\x43=\x12\xe6\t\xe8\x05\xdd/\xc5\x39\xde\f\x88\xe8N\x89\x8f_\xdf#P\xe6\xb7\xba\x1a\xdd\x1c\x63Q\x0eq\xb7\xf7\x39<\xd4\xe7RP\xc5\xd7\xbf\x65\x94r\x97*\xb9h\xc2\xbd\f\x97\x02t#\x7f\x11k\xea\xb4\xe4/\xf0\x8b\x91\\\xdb\xae\x10\xbf\x89\xbc\x62\xef\x99\xbf\aYX\x12\xef\xaf\xe6\xcd\x30'\xe4\xab\x44\xf7\xf9\x14\xb2]\xfa\x97\xe6\x9a\xed\x85`\x86\xd9\xb0\xd7\xa4\xe4\x00\xa8\xee\xbb\xfc\r\xe8Xz\xca\x02\x1d\x02\xab\xbd\x16PO\xfc`\xdeH\xb1\x7f\xea\xba\x45{)\xfe\x8e\xedH\xd2\x31\x64\xda\x89\x84o\xd1\xd2\xb1{\x97\x19\x38\x16\xd9?\xd6\xdbo\xabV4\xca\x34\x9cWAn\x87\x85*\xa8\xfb\xe9\xf6=\xb6\x83{\x02\xc9\xbe\xf1\xbb\x8e\xe5h\xae\xaa\xe1%\x8d\x1f\x1fRE>\xef\x33\xd8X\xd9H\xd4\xb5\xe1S!\xb5\xbd\xd4\x63\x1f\xbf\xe4\x30^\xc3\x63\xce\xdc\x12\x8c\xc7\f\xea;\xf3\v8\x8d\xcc\x9b\xe7\xa0\x14^H\x9ct\x86\x8e+w\x80\xbb\x85\xa6\xd4%nu\aY\xd6\x88\x00\x35\x03Z\xb0\x86~\x01\xa7wt\x13\xfa\x9f-\xe3\x90\xdah#6\vb!v\xdal\x05\x35\x80\xfc\xee_<\xac`*\x9cnL\xaa\xa3\xd1\xdf,~\x0e\xc0\xa0\x84\xe4\xb2\x33\x1f\x8c\xcbt1\x18[\v\x18\x41\xc6\x87\x13\xa2\xad\x1d\x43^g\xd0\x31\xf5\x61|=\x16U\x01\x94\x45\xa4P\x0f\xb1\x1b\x81Q\xa7\x92\xae\xa3mNUF7\x98\xe1\xe4\\)y\xc9v\n\xb5\x9d\x1b\x8a\xf6\xab\xebin\x17\x88\xeb\x82\xfax/\x8c\x30\xfd\xf1t\xcdSx'C\x82\x05\x37\a\xb3L\x89\x9d\x00\x1ds\xad\x0f\xcd\x63\xbe\x9b\xa9P\xa5\x43t\x86\x87\xbc\xd9\x97\x66\x84\x35>g\xce\x92,x\xc7\x88\x19j\x1c\xa8\x93\vy!\xe5\x39\x1b\x00h*\v\xacj/\xc1\x9c\x90\x18\x86\x63Sr4\xd9\xa8\x92\xce\x64:\xeb\xba\xd8\x31\xf3\xfb*\xac\xc6\xe7\xd1\v|\xfc\xbbiW\xc8\x97=\xdb\x81w*\x9f\a,yi\xbcQ\x0eh\x11\x00\x10\xed\x9f\xb8\x8d\xa0% \xd3=\b F\xfa\x89\xefiL`3\x80\xb9S\xb4{\xab\x38\xf1\xcd\xb8u\xc4\x85\n\xda\xab\x19@\xd3\x88\xd5\xf7_\x8e\xcd\x8e\xa4\x1c\x9c\"m\xce\x66)\xfa\x62o\x01\xdc\x46\x45\x38\x64\xf7\xc4\x94\xfdHDpM\xef\xf0K\x95\xf8h\x8d\xb7\x35}\xc6\xf5\x97\xce]\xad\xe8\\\xebO\x9b[\x03\xce\x33`\xf5\xce\xcc\xfe\xfbw@\xc4\xf4\x9d\xf3,\xdb\x83\xc2\x1a\xf2\xb6\xbe\xfc,\x7f) 5P\x00`\x03\xd2\xb3\x03\x18\x64\xb9\x64\x98\x33\xdbGC\xe2\xa1\x85y\x9b\xb1\v\x0e\xbb\x14_\xb9\x16\xb6\xc3\xf6\\\x01\xe3\xaa?\x03\xad\x18\xeb\x0e=\xa3\x1f\xccMHD~\xda\xb9\x9d\x17\xe8\x92\x46\xea\xf5>\x05N\xa7\xb5\x94m\x95\x42\xa7q\xfb\xc2\x45\xd6\xd2\x86\xd0y\x99\x1f\x96x\"\xeb\x05&\xf2\xa1gg+\xae\x1d(B\xd6\xbe\b\xf6\xb7T\xc8\x82\xbf\x92\x0f,\xbaG\xe2\x01s,\xd7\x34\x84/\xb6\x41\x84\xebz\xb2\xf9\xdd\x31\xbe\a\xb4\x88\x05\xd8\xe1yU\xe6K\x8c\xdc\xd1vXrB(\xb3\x9f\xd0\x05\x37ket\xce\r\x01\xa9I\xc5\x90\xab\x90\x16,\x9c\xba\xcb\x94\xc7\xfa\xe0\x39\x82\xa2\x88\xd6\f\xc4M\xfe\xb4\xbc\x87\xe5\x63;k\xf0\xd1\t9\x8fQO2\xae\xed\f\xffyR\x19\xa9NE\x11\xc3_\xd6+f\xe3\x9c\xbe\xbc\xda\x65%\xcd\xf5sE\t\xf5]k\x83\x45(\x98,XD\xca\x37\xeb\xc3\xc2\x10w\x14y\x9b\xd8\xb2\xbf\x45\xd5\x63\xe4\x37\x42{-\xe2I\xb3\x18\x8e\x86s\xf1Y\x8a\xf2<I\x12{\xb1@\x8c\x8c\xac\x05P\xbd\x9b;\x84\x81h&\x88\x1b\xbf\xa0(\xc2\x06\xa9\xe4\xd9\x1f]\xca\x96O\xfe\xd8\x64\xees0\x82\x05v\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05g\x04\x82\x05\x63\x30\x82\x05_0\x82\x05[\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x05#0\x82\x05\x1f\x30I\x06\t*\x86H\x86\xf7\r\x01\x05\r0<0\x1b\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x0e\x04\b\xe3>\xd3\x8d\xd6\xb5\x8a\x05\x02\x02\b\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\x61\xa0/\x8d\f\xa1\x03\xc9\xdf.\x81\x65\xe0\x63pU\x04\x82\x04\xd0$\x1e\xf9\x1d\xc4\xe9\xbfI<\x1eUJ\xd4\xb0\f\xdd[\x92\xb2\xed\x18\xac\x66\x90\x1b)=\x10\xad\x02\xe7\x17\x83\x44g\xba\x11o\x05\xf5\xf7\x37\xcbZ\xe9\x0e\xc3K\x1b\x62\xee\xb2\xb7\x14\x85\a-\x95\x83\xa9\xdc=K3\xadh\xbfT\xf8\xef%\x05@\xcd\x61\xbe\x12\xebxu6\b\x8cZW\xa1\x98\xd5\x42\x01\x1bL%\xc2\x18\x9f\x91\xfex\x88\x99GZ ,71\x05\x98\xef\x91n\xeb.\x86\x90\x61\xb1W\x1a\x05\x82\x14\f\xa8\x94\xaeV{\xd6/\x8b.\x91\xa6\x12h\x1f\x06\t/\xa6\xed\x33\x99rV\xe5\xf7\xea\xcc\xcf'\xa5\xadIZ\xbc{\xe3\x62\x63\x8f\x00+\x96\xc5?\xaf$\xba\xf6\x8d\xe2\xef\x18P\xd6\xd8O\xb2]\xb7\x96o\x02\xf7}\xf2\xa2{\x9b\x13\x98\xde\xddn\xb5HR\x8e\x44\xad\xe0\xcf@\x9f\xfd\x88\x33\x66\xcejI_\xe7K6\x93\x7fIb\xc9Z\xae\xa1\xca\xf7Z\xbe\x85w\x9a\x8f\xceM\x84\x81\xd0\xa2\xee`\x92\x86\x16*\xd5\b\xb6Xc\a|A\xac\x97O\xf0\xcf\xd8\xd2\xb1\xd7\x1d\xe5\xb8|\x04+\xd9\xee\xf7\"\x88\xa1S\xdb^[GI\xeb\xcf\x04xi\xd1\xfc\x8a\xa9\x61\x92\xbf\\\x7f\xdeIB\xfc\r\xc2\xa2\x8f\xba\xdf\x12\xa4\x62\xfb\x8d\xd3\xc5\xf9\x85L\x17p\xb7\xf7\x99)R\x92\x36\xc5K1#\\\t'<\xa0v]\x92\x99\x63\x88\xca\xad\xed\xd7\x85\x98/\xbe\xaa\xa5\xf3\nv\x13\x01\x90\x8a\xe7Z-+\x1a\x80\x33\x86\xab\xd8\xa7\xae\v}\xcd\x64\x8d\xa6\xb6\xfb\x83\x9f\x91#\xcb\xda\x63\xd0\xde\xf4\xdd\xaa#IlD\xfao\x12\x13\x90\x37\xde\xa3rE\x1a\xa7\xab\x01m\xd6\x34\xe7Q\x0e\x33\xbc\t\xbf\xb6\x16\xf8\xd3\x11\x11\xd1_\xaa\x32\xb6[\xe7\xbc\xdd\xaa\xe4\xed\x42=.\xf7\xa1\x06\x39\xd4\x00\xc6\xc8\xed\xb5\x96\xc1\xbfL\xf1\xf6\xc6Y\xf4\x99\x9c\x10\"\xa1:\xcd\x94\xac\v\xc8~)\xbc\xf0\xae'z\xb8\\\xa0\x13\x36\xb5\x19K,\xc1\xceIW\x1d\x36\xf0\xc2L\xdfm\xc9\x64h\xcb\xea\"2\xd7\x11,w\xbe\x01\xa3\x82-\xa1K\x13\x93\x87=\x01t\xc6\xc6\xf9\xae.\xa1\x44]Glo\xc6\xce\xef\x32\xf8\x8dSM\xa5\xf0\xa0Q~\xd8\x35U*\x04\xb9\x42\xa7Q\xba\xad\xce\x88{\x93%\x9d\x03\b\xfau8cx\x13\x11\x9d\xf6\xcc\x18\xe3\x99\xa9]\x90k\xbf\x9ci\x99\x63'5\x8a&\ag\xd1\xaeW\xec\xc0\x45n*BF\x8f\xe4\x84\xc7g\x06\f\xa7~\\ \x80\xdc\xc1\xe4ztv\x8f\x41x\xcej\xf9\xcb\x7f\xe9\x17pE\x01\x9a\xc3\x9c\xa2h\xa0y\xfd\x44L\xc8\xa0\xaf\xa5\xba\x0f\x03\x30\x43J\x1d>\xd4\x8e\x1fm\t\xf9\x63\xde\xd2\x9ew\xe7\xde\x61Rv\x0fm7\xf7\xc2i\x96\x9d\xc5\xd9\x15\x10\xf2\"\x1f;\x83\xb3\xb4,%6\xc3:$\x17\xed\xad\x11\x1f\x46\x31\fj<\xd2\x1a\xe7\x41\xb3u\xd8\x80\xb3\xf8+\xab\xb5\x81\xc6^@\x9aw\xaay1\x1fy\xfe\x0f\x0f\xb0\x36\xb7\xdc\xca\xf6\xbf\x80\xebx\xc6sj\xb3qi\x9c\x1d\xdd\x90\xd9s\aC7\x19\x7f\"\xa4\x9aM\x98\x66\x10[\bb\xb3\xd8/Vh\"\xdf\xd1\xa2ZE\xf9\xb4\xb9\xf2HN8\x1a#6mBV\xbb\x32\xe3\x00\x84\xa9\xe2\xba\xb6\x86\xc9\xa6\x64\x8a\xd6\xa6\xc4\xd7>\x8b\x34\x1bke\xfe\xb1\xc9\x93\xe1\xeb\x8a;\xf1\x0f\xdb\x84\xe2-\xf8i\x04\xee\xafX/\xc7\x96pM\xd9L\x1dR8\xc6&'A8\v\xa5\x1c\x16\xd0\x1d\x32\x99\xb9\x1f\x35\xaf\x02\xb0\x13\x0f\x95\xd3\x9b\xd6\t\xcc)F\xe8\xf1TM\xb8\x96\xa6\rYa\x1f\xee\xaf\xbc#X\xff\xcf\x96\x91\x1f\x00\x80N\x9a\xa2\xe0\x00\xf7>\xb1\x91l)X^\xe7\xc7#\xfa\x88\xf7\xfb\v\x0eJ\x04\x46\xe0g\x10\t\xea\xc0\xa9\xbe\x83\x11\x33\x8e\xfb\xd6\xd5g\xef\xb4\x13M\x17\xa1\x44\xb7\x98w\xd0\x63\xe7\x9c\xa7\x96)\xe5\xferL\xa9\x85\x9b\xc9\xf3\xf6\x05\n(h\x99\x31\xe8\x64\x30\x9c*\x90H\x84\x00\x1a\x66\x0e>\xf7\xaa\xc9l[W{\xa9\x17\x91\x1ek\xe8\x12\xa1\xd4\xde\x1e\x38\x14{\xe0\x9a\x15\xaeZ&\x93z\xd6\x8d&a(\xf2@q\xc7\x8a-ir\x04[\xb9\xc1{\x17\xde,\xfc\xa9\xf2\xf8\x34\x33\t\x87\x91\xdf\xeb\xf7W[2\xe2\xd4\xe4Gx\xe8\x9b\x1a\xab\x44U(\x98 \xa7\x16\x8bNB\xf1\x91\xbe\x00\x87:\x91\x63\x9a\xc2\x8d\x13\x34\x8b\x33\x02\x88\x1e\xb1\xa8\am\xb1\xf5\xb3z=\x17?\xbd\xa1\xdb\x04\x0f){\x0e\x98\x18\x63\v`\xcd\xa5\r_\x1eS\xcd\xfa\xc0\xc7\x99S_\xb7\xe5J0\xde\x14\xc9IF1\xb6\x92\xf3K\xc1\xb0\xdd\xecH\xff-RSd'Lx\x96\x80\x90\xa3\xd7\xfdz#6\xa0v\x9e\x96\xfc\xcd\xecX\xf8vK/\x8d\xb9\xd6\x89\xa1W\xe1\xc6\xed\x9a\x1e\xde\xc7h\x93+.\x84\x1a\xf9\x8cX\xb8\xf0)\xfe{\x03\x84\xe8R\x1c\x01\xbb\xcc]\x88\xcd\x37\x8b\xe2-0\xd1\xbe\xf7\xc1\x95\xb7\x01\x43\xab\x30?\x96GmR)\x87\x10\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14/\\\xc6\xaf\xa7\xcc\xb5w@\xcaq\xc3\x8c\xc6i\xdc\xc6\x7fT\xef\x04\b\xf8\x9c\x8b\x12'\xe8\xec\x65\x02\x02\b\x00",
+    "0\x82\t\xa1\x02\x01\x03\x30\x82\tg\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\tX\x04\x82\tT0\x82\tP0\x82\x04\a\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x03\xf8\x30\x82\x03\xf4\x02\x01\x00\x30\x82\x03\xed\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b1$\xca}\xc3%>\xdc\x02\x02\b\x00\x80\x82\x03\xc0U\xe7\x7f\x9c\xd6\f\xd2i\x1dn\x8b\xb8\a\xecJ\xe7\x06g\xd1$\x1b\xd5h\x13=\xd7V^\x15@\xdb\xda\x88\x36\xc9\x02\x96\xb5\xb5\xf7\x81\xef\x88\x1d\x66\x62\xa8\x83\xf7\x91\xb1&\x1f\x9b%x\n\x04\xb1\xc0\x93H\xa2\xf0QO+\xf8\x03ga\x1b\xed)\xfe?\xdd\x83\xa3\x93u\xa7\xd9\x37[\xa7\xc9\xf4R\x86\xd2?\xca\x61\\\x1e\xf9\a}\xbd\xdav\x8a\x03\x8e\x12N\x8fhnrn\xf0\xbe\"\xc7\x9d\x97|E\xc0\xaa\x31\xe1U\x81\xb3\xec\x98\x94\xac\xf7\x15\x9b\x42I\x8c*)z%\x92\x64\x92\xbdN\\\xec\xff\x61\xbb\x8e\\\xc8\xdb\xba\x97\x30\xf4U\x9e\x1b\xfa\xbe*\x90\xcf\xe8\xc0\x9d\xb0\x0e$a\xe7:\xb7\x7f\xda\x63\xaa*J\xa6\x91R\xa6v\xc9\xbe\x9f\x1b\x1d\xa4\t[\x0f\xd1\x64N\xdf\fDY:\xef\x9a\xd8\"\xa2_\x80\xb5O\xbe\x84#\xe3tw<\x9e'd\xac\x65\xf4\xbb\x34\xb7\xa4\xfe\x02\x1a\x88\x05;K\xb8\xd8\xb9&i\"\x97=\x93\x9b\xe8r\xaaM\x8fvQ\x12YX\xf1\x1a\xa3\xdb]\xbc\xea\x84\x19UO\x00\xfb\xe2WG\xca\xea\xbe\x8f\x85\x8b\x1c'\x8d\x81p\x7f\xf1VX\xe1&\x94\xd8/\xde\xac\xc8\xac\xbf\xc3\xc6g\xa6\xf4l\xec <\xbc\x9d\xd9\xd0\xa1N\x8c\x11\x19+\xb3\xa1\xdfj\x8f\xa2\xc3\xcc\xf6\xbd\tz\x96\x61 \xd4\x06\x99Lo#\x9bL\xccs\x8b\x42H\x99\x45\x8f\xcb\xc8\x46\x1a\xfbQ\x03j\xf2\"\x85\x88\x9d\x61\x8b\x16\x33\xf4\xf7\x9b\xc8!O\xb1\xcd\x30\xfc)\x88\x12\xdc\xd4\x30L\xb9\xad\x34\xde\x01\xf8\xc1\x12\xa7M\xc7\x31\x99+E\x88\x06\x34inm4\xd8\xdd\n=Yt61j\xed\x91;[\x88\x43\x46?gf\xe4\xdeR\xb4\xbf{=Ty\xaf\x8d\xf5\n\x80\xfd\xeb\x31$\xbc$\xd7!\x9f\x87\xab\xbdu,\x13\x13\x96\xabv\xfb\xb2\x44\xd0\xd2\x19\xf1\x95\x9a\x91\xbfz{v\x95r\xa9\x16\xfc>\xa9N\x01\x15=Cs\xa3\x8b\xefH\xad\x11\xbdS\xd3\f\x15\x15\x1a\xb4:\xe0\x7f\x9a\xa1\x36Gr\x92\xf0\xdf\xb0\xe2\xbc\x35\xd4\x32k7iOG\x9a\xe2\x35\x8a\x31`\xed\x80W\xe2\x9dX\x9c\x7f\x46\xd2T\x0e(S\x8b\x1f\x46\x34\"\xacq\xc7\xca\x0f\xb4\xb7z\xfc\x34W\xa5\x86\x8d\x66\\\xc7:\xdb\xf8y:\x8a\xf6\xa2\x1e\t\xc9\x10\xe9\x93:\xc5\xed\xb2\xca\xbb\x66\xf1\x9d\xc9\x9c\x42ud>\xe4\x12+g\xf8\xbf+\x98]\xb6\xa0\xbay\x98\xe0G\\w\x85N&q\xfe\xab\\\xa8\x32\x93\xec\xd0&\x90\xe4\xda/4\x8aP\xb8;{L_\xa9>\x8a\xa8\xf3\xc0\xb7P\vwN\x8c\xa0\xaf\xdbY\xe7\xac\xd1\x34NbG.\x1e^\xb4\xc9\x64\xf8\x0f\xf4\xf8\xb6\x9a\xe3~\xcf\xb7\xee\x11\x14R\x89;'\x98\xfc\x95\xa7\xad\xbf\x61\x34\xad\x1a$*Hfeu\x9cY\xc0O_=Z\x8c\xee\xd0\xb1\x17m4F7\xa0\xbaq\xacws)\xa3\x37O\x02\xd3\x7f\x0e\xe8\xce\xff\x80\x11\x45\x42\x03Z\x87\xaa\xff%\x12\x1f\x43\x19>\xa9\x62\x96\fo3\x88\\\xaa\xf9\xe2\xb4\xb9\xf7U\xae\xb5vWG\x83\xe3\xfa\x05\xda\x86\x02\x97\xb4`\xaeY\xd5l\xc1\x33\xe1\x36\x36\x94y\x9e\xad\xa3-\xbc\xb5\xa2\xeb\xdd\xcd\xcbHB\x15\xb8\xe6\x0ev[Wt$\xe6\x89\xc4\xe8\b\xa9\xfe\xb3#\xa6\xcar\xe2\xe4\xcb\xc1J\xd1\x1d\xb9^6\x97\x19|\x15H\xf1-\xeb\xec\xadRo/\xe1\x19\xcf\xcf\x98\x13\r\xcc\xb2\xa6\x8a\xda\x93$=]\x83\xfe\x8d\x9eG\xd8n\x8d\x06R}F\x84\x04i4a\x04P\x1f\x86\x92\x94\xe9\v\x13[\xf6\x16\x81\xeb\xfa\xf1\xbb\x04h\x17\xca\x35o\xbaNL3\xce\xf4&\xb7t\xab\xa5\xd0\xaa\r\x85\x11\x30Xb\xdfH\xc7\xdf\xc9\x38\x9eo\x96#/\xc1\xd4\x8d\x65\x9b\x46_\x9c\xea&`\xb5\x95\x85q\x18\xc3\xf4Ta\xca\xfeU;\xbe\x81\xaf\xd9:'\xe9\x1c\x30\x82\x05\x41\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05\x32\x04\x82\x05.0\x82\x05*0\x82\x05&\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xee\x30\x82\x04\xea\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b\xd9h\xcb\b\x16\xc8\x93W\x02\x02\b\x00\x04\x82\x04\xc8|\xdb\xa6\x1e\x33\xa4\xc6N\x13\"z\x1f\xc6\x82\xab\x93_\xf0\xa4\xe4@\xac\xdf\x16\xec\x8d\x1f\xd9\xe4\x03\xd6\xc9\xc4\x1d\xfd\xa3\xe3\xba\xfc\xcb\xd0Ge\fn]\xfc\xd2\xd4\x63\xa7\x93\xf6\x8a\x44\x8c\xfe\x84\xd8\r\xa6\x16\"\xe1\x65\x10^\x18\x44X/\xc7\x64t_\xcfs4\xe1K\xe4\xb3[\xdb\x81K\x1c\x38r\xa6\xc5\xebV\x9b\xc7\xe3=Tn\x05,\xd3W\xc9O\x80\x1e\xd7\xd8&j\xcbyFp\xfc\x45\xa7y\xab\x01\x03\xb6\xb1\x44\x41\xd9s7\xaa\xd7\xf9\x44\x93\xaf\xbb\xb5w\xeb+ .\xbd\xea/\xde\xa6/\xd6\xact\xa5\x34\xfb\xdf\xf7\x02\xa2 \x15\xc8\x61r\xbb\x7f\x04\xf6\x0f\xf8~\xc3\xe6\xab*\xe6\xd8\xe1\rZ<\xc0X\xae\xf8\x1b\x15<{\x7f\xf5\x9f\xec\xf7?0O=lD\xdd\x0eL,\x93hC1\xa8\x97K\xf6\x66q*R>:\xe6r\x8a\xe6\xe3\xc8\xff\x65h\x1a\x46!\xb3\xf0\x46|\fe\xd1\x8e\xa4\x91\x11\\\x93\xeb\xeb\xae\x46\xf4\xbb\xf8\xf3~ 0\xf8\xcd\x19\xcdT\n\x7fO\xe8\xac\xa9\xacr\x96\x80\x45*Jc\x90\x01\x19\xd0~&S-\xc4 \xa5\x1f\x89g\x0f\xd9uQ\n\xf1\xd4\xfd.\xbe\xe6\x94;l\x8c\xe3\x0f_\xceXH\xde\x8d\xeb\xd3\xe1\n\xcd\xdf\x34M\xd1[\xab\x41\x41k\xeb\xa1/\x01Jr.\xf4^Dv\xc7\xe6\x16\xb9\xfb\x10\x37\x00-\xc6;\x17r!\xdb\xac\x86{\xf5p?s\xa3\xce\x0e \xbbYL#\xc2\xe8\"\"\xe0\x02\r\xe4\xa2?U\x9d\xc0\xeb\x9a\xc4\xf3\xaa\xb8\xf1s\xecG\xe8-k\xa1@\x94\xf6\a\xb9o\x03Zx\xe5YA\x1a\xc7\xcd\x43\x10 (\x95\xe0*o\xf2\xf8\x12\xd6\x13\x7f\x37=8\xa7\"\x91\xc6\xe3R\xde\xd8\xbfx\x9a\xa4\xf7\xc0\x8c\xbf\x81( \xb8\x01\xde\xb5k\nV\x12\\b\x1d\xaf\xb7\xf2tf\nz\xc4\x9f\x1e\xc2\xa8L\xd6vmt57\x12\\\x95\xee\x98\x1d\xe2\x91\xde\x13\b\xd0YMb\x92i\x1b\xf7!E\xaf\x83\xf8\x64\xf0\xfb\x92\x9d\xa1\xd9\x61^\x00\xc8\x1anj-\xad\xa8\x1b\x0e\xaf\xea\xb2\xae\x1c\x89\xc7M,\x0fM\x8dx\x8d\x15\x9dL\x90R\xa1\xa9\xd8\xb2\x66\xb9\xb1\x46\ni\x86+\x0f\xb2\x41\xce\xe8\x8eI\x97\b\vp\x97\xcb\xa4\x33?\x83kl\x17\xce\xd8\xd5\x9b\xd4U\x9b\x99\xe1\xba\x61\x31\x36y1_\xa1\x8c\xa9wB\xaa\x8c\x45n\xb6\x90\b\xe8.\xc4riB\xca\xa2\xd4\x8a,7\xe1\xde\xb8\x98\x36\xeb\xccX\f$\xad\xab\x62\x44m\x80\xd5\xce.J>\xa5\xc5\x34\xf8\x32&*V\xa4\xdd\xe9\x92\x06\xad\xe8\x85wk\xf1\x1b\xeb\xacw\x19\x1cj\xb7\xef(p\x87\x92\x33\xdd\xaa\x30\xc1\xa0\x93\x64\x18\xa2\x91\x7f\xf7\xc4\xa5\x16\x93\xb3[\xd8S(\xc5^\xb1\xce\x97\xbc\xb6\x65\xa8S\xcd\xf4Mk\xeaoo\xa5\x1c\xf1\x0f\xcb\x04%J\xfe}\xfc\xa3\xbd\x41\xd3\x96j\x8b\xad\xd4\xaa\nv\xea;\xab\x39U\xa3\x89\x9f\xf6\xf5\x9b\x9c\x83\xf8(P\xdf\x31t\x83\xdb\xf1\x0fL5j\xe5\x64.\xb9w=\xdd\xff\xa3\xa7\x90y\xc6[\x01\x16\x38\xa8\"\xa3\x14\x13\xed\xd0\x89\r\x1f:ALWy\xfc\x1d\xdf\xad\x1a\x11\x15\x31~\xdb\x99:l\xde\x94\x9a\x45L\xfb\xa5\xa5\x31\xee\xe3\t\x13m\xfd\x19\x37?\xf6\xed\x8f\f\xceK\xd1\xe1=\xfb\x85\x00\x84\x19\xeb\xa2\x63\x1d+-!\xee\bZm\xb0\xb1\xd6\x81\x00\xb6\xd0\t\x90\xb4\x84\x17\xd9*<\x1dS\xc6\xc1\x8b\xda\xae\f\n>\x1c\x8a\xc4\xd6\x97]H\xe7y\x80x\xaa\xde\x17`](\x15:B\xb7\x85\xc8`\x93(\xb0N\xc9\xf7\x46\xe7\xfcN\x9f\x9f\x12\xdf\xcbn\f\xafq\xda\xb7\xec=F\xf3\x35\x41\x42\xd8'\x92\x99\x1cM\xc9<\xe9\x0e\xcb?Wew\r\xdd\xff\xeap5\xcc\xf5\x38\x1bW\xdfm\xcb\xfd\x13\x39\xd6\x04\xe2\xf1\xc2\xd9\xea\x8c\x9f\xfb\xb5\xfc\xe6\xa9\xaa\x0f\x43\xc9\x9c\x91\xe4!\xaf\x37\x14xF\xe1)A\fN\xf5\x93\x1d\xf8\x33Go\x9d\x8b\xf3'\xd4\xbb\xf6\xae\xfa\xa5\x8b\x41\x8f\xb4\xd7/\xc1'\xeapU\x1d\xe2\xd8\fJ^|\x87\xa4\x0e\x84\a\xd3\x38g,U\x11\xfd\x1e\xdaMf\x01\x12\f\x1b||\\\x82!5e\\z\xd2\x66\xc2+^\xb8\xb1\xcb\xdfY\xc9\x31\xb7\x17&\x96^o\x1c\x62=\x8d\x88\xf1\xd1\x01>\xf9o\xb9w\xdc\xee\xeexY\xef\xcf:\x87\x88\xa2\xea\xfd\n\xa9\xa9>\f\xf8\x7f\x97\x32\x17\xc2\x97\xcb\xa4\x9b\xae]\xe7\x39++\xa8\xe6{Qu\x1fST7\xf4\x00\xa4\xb0\xa0\x93\xb4\x33\xe7\xae(\xc0-:\xb3\xaa\xd7<vDK\xbbjg\x98\xce\xf8\x15\x13gy<\x15\t\xb7\"\xc0\xec\a\x8a\xfd\x44\xcb\x99\xbd\xdc\xd5SL\x97\x1b\x46\xaf\xc0l\x06\x01\x93\x8aPQj\xe4\\\nR\x81;u\xed\xa2\x97\xa6\\Uc\xee\xfb\x33\x82\x10\xa8!\x1a\x8d\xc8\xe1Rh8\x88/\xae+\"z\x9b\f\x19so\x91\xc7\xfa\x95\x61(tsp1%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\"\x8e\xffZx\xec,!\xa2H\xb7\x63\x88\x10G\x1c\xc0\xd3\xecZ\x04\b\xb3.!\xfd\x82\x14\xd8\\\x02\x02\b\x00",
 };
-static const size_t kLen56 = 2691;
+static const size_t kLen56 = 2567;
 
 static const char *kData56[] = {
-    "0\x82\n\x7f\x02\x01\x03\x30\x82\nE\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\n6\x04\x82\n20\x82\n.0\x82\x04\xa2\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x04\x93\x30\x82\x04\x8f\x02\x01\x00\x30\x82\x04\x88\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30W\x06\t*\x86H\x86\xf7\r\x01\x05\r0J0)\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x1c\x04\b\xb2^\rm\xda\xaa/\xbe\x02\x02\b\x00\x30\f\x06\b*\x86H\x86\xf7\r\x02\t\x05\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10<\x04x7\xb3\xb2$\xd3\xb5\x46 \xb7\xd2\xdd].\x80\x82\x04 :\x01\xe4\xf4W\xd3\xed\x14\xd0\x42?\xd3\x61\xee\x84\xcd+\b`0\xbdr\xa7\xd5\xa4\xf2\x13\xe9\xf0\x44\x66&4\xe7,]\xc9\xb0K\xabG\x16\xab\xe6\x06\xa6;yA\fy\xd5\x9b\x02g\xd8\x7f\xc8\x36\x37'\xb4\x44\xa2^\r8\xb8\x41\x8e:\xf1\xe9\xab\xe0\x19\xd0\xe1\xc7\x92\xd4[5\xf3yH;\xfc%\xfc\xc6\x9f\xed\x35([\xfa\xeePB\xa3\xc3\x96\xee\xe0\x87\x33^\xa7\xc7\n\xfe\xda\xe5\xd5)jW\b\x7fV7*\x1a\xa0m\xe9\x84\xac\xed\x0e\xd8\xc0\xd8\xc6w\xb1\xdd\x1b\xa1\xed\xa7y\x13.[\x9b\x80\x44\x9e\xff\nn\x99\x33\xcf\xf1G$\xaaH\xe7,\xb3\xe6\xdc\xd4\x1e\xe4\xb8^r\xaf?\xd3%J\xac{5\xb1\x82\xa5\xd9\xf8\x01\x12\x92IL\x17\a\xb2\xb1>\xcb\xfd\xd1\x17\xb5\x65=\f++\xc0\x37\x9c\xe7\x04\x9bqZ\x10\xc0\xba;1\xde\rfl\rL\x99\"v*u\x7f\x84\xd1\a\x1fW\xf0\vqA\xea\x38\xe2\xe7\xbe\x11<\x92\x8c{\x0e\xb4~v\xc4\x80\x41\xaeL\xe2\x38\x36\xcb\x82\x39\x38:U\xb4\xe2\x35\x94\xc3\xae=\xd1\x03\xf3\xdb\x00\xd9\xfa\x96\x62%\x97Q\xc5\xcf\x84\xe8\xf7\x8b/1\xeb\xa7\n\"o\xad\xf5(%\xaa\x99\x0e\xb1\x83\x9fpy\xaf\x10|,U\xfe$}\xea\x85H\x8ez\xf7G\xd8\fd\x97\xe0\x8f\x62^\xd0O!\xa4\x46\x8e(\xb0\xb1\x90\xec\x01}\xc4\xc8o\xf2\xe2\xb7\xc4\x35l\xa9\xf6\xaf\xc2\xb6\xa9\x02m\xb2\x8b\x43kA\x80\x9d^Q\xa7\x31\x00\x1b\xb5$\xed@\x99\x33\xde\x87\xd1KvxWL3y\x89\xd3\xfap\x0f/1B\x8c\xce\xe9\xc0X\xe1\x30\x30\xf1\xe9\xab\xc8`|\xe0j\x99\xe7\xd3!\x1a\xcc\x98`D\xaa\xff\xee\xec\x34 \x19\xba\x03;go\xee\xd5\xb3\xa7!W\xd6I\xaf\x91\x8f\xecp\xd0Y\x1ay\xe2\xd2\x94\x82S\xfb\xea\xd6\x83IJo\xd6\xed\x15\xc3q\b:\xbf\xde\xa8-T\xafJ@\xbc\xe5S\xaeK=p\xfe\x1c\x03\x1e\xb2\x9d\x1c\x35\xbd\x9a\xf8\xc5\xd1\xa5Jc\x18\x02\xd4\xff\xdd\xcd\xb3l8\xd1\x9a\xad\x16q\xf1\xc6\x1d\x8fl0\xfa.\x13\x9d\vN\xe6\xd3\x37\x80X&\r\x04\x97\xe6\x8d\xcc\x63<98/zs\x01\x0f\"iGT\x9e\x42\xc8Y\xb5\x35\x43\xb4\x37\x45Y\x85\xf2G\xc3\xfb#\x13\x18\xef\xd8\x11pt\xce\x97\xcf\xbf\xd5-\x99\x00\x86V\x9b\xdf\x05g\xf4I\x1e\xb5\x12#F\x04\x83\xf3\xc1Y\xc7{\xc3\"\f,\x1b}\x18\xb6\xd2\xfa(6\x8bQmX\xf4\xd6\xdf\x38\x94\xcflPO\n\xf3\xc3\x91\x39\xa5\xc9\xbc\xa8\xeb$\x1a\xddX\x9e\xdc\xb2\xee\xe1\xa5\x16h\xc2\x63\x8c\xc9\xa7\xbe\x1e\x30\x84\xa6(\xebP\xd9\xdd\x15\xea\x64\x34\xf0zVj\xdd\xb2p.\xearf9T\xaa\x36\xfah\xaa\x06]H\xca\xadN\xfeK@\xdf\x43\x46\xd6\xdf?\xa1\x9eL\xdc\xfeL\x01\t\x7f\xd8\x00\x84\x94)\x17g\x00\xd3\x46\xd2\xba\xb9\x62\x66P\xcd|zpFJ2b\xc2n\xe7^\x04$\xc5\xfd\x9d\xf4\x9b\xc8\xe9\xebs\xf9\xaa\xa4\xcc\x63\xa3\xdc\x63\xe0\x30\xecp@\x9e|cy\xae\xba\xfd\x95LF\xf1\xc4\xae\xb9\x03\xe8\xd4\xe4\x90):\xbb\xdb\xd8\x8f@\xc3\x39\x9aLpT\x9f\xc9\n\x04#\x98k\x9c\xc2\xe0\xad\xae\x30\xef\xff\x44[s.\x8f\xd7+\x12\xf0\x31\b\xfb\xb9U\xf0\xc3\x62\xbb_m\xa7\x1d\x61\xc2&\xce\xab\xb6\x88%\xce\x8b\x02\xb6\xc5\xa2\xcc\xd4\xa3t[v\xf7\xb4\xd9\x9c\x93\x86~\xac\x82\xe0\r\x83\xe1\xc9\x7f*\x86\xbb\xaa\xfe\xdc\x17\x9c(w\xe1X\x18\x15\t\xe3\xda\xdb\x8d\xeeU\xf6\xda\xad\xe5R\x84\xb4\xf0$\xce\xa1TK\x9f\xea]M\x7fS\vy\x1d\x87\xcb\v\xa8\xef\x03\xfaXW\xf6\x02p\xdbzd\x89\x1f\xc7\xca\x87\x02'3\xc5[*P\xc5\xb5{-=\xa9\xbc!{\xf2\xbe\x9cV5\x83\xba\xce\x34\x8d\xec{\xaa\xe4\xcb\xd1OJ1\x00\xd1\xb8\x30\x38\xaf\xe8\xe3\xd7\xc2\x8c\xe3\xb4#\xb3'\a\xc6\x88\xecX\xe9Y\xfb\xa9\x11\xa2\xc8w\"j[\x86\xde\xdc\xedvnsy\\\xb4\xcf\x19v\\k\x1cK\x03\xcb\x35\b\x94\x37\x01\x98R\xd8\x31\x42=\x7f\xa1\x11\x06\a\x88\xb8\x31\x35\xb2I(\xc6,DC\xb6\xbcXvlO\xc8\xb6\x30\x82\x05\x84\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05u\x04\x82\x05q0\x82\x05m0\x82\x05i\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x05\x31\x30\x82\x05-0W\x06\t*\x86H\x86\xf7\r\x01\x05\r0J0)\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x1c\x04\by1\xf9\xe2\x42\x33\xf1\xaa\x02\x02\b\x00\x30\f\x06\b*\x86H\x86\xf7\r\x02\t\x05\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\xc9\xda_\x96\xc8,\x85]\xa0\x30\x82\x16k\xf4\xfd\x91\x04\x82\x04\xd0\xc3\x89jVj\x84Xv\xd7#\xd5\xa8\xc1/C8\x99\xf8\x64\x97\xe7\xe8\xd2\xcf\x36\x9b~\x04\xe5\x87\x80\xff\xd5XPZ\xb3\xc0\x15\xc9\xd5\x61\xd6;\x7f/;\x98PU\t\xcf\xc3\xdd\xbd\x8b\xcd\xdf \x90\xe1\xd2\xcd\"\x9f\xa7>\x10\xd3\xb7&Te\xfb\x18\x12X\x81\xd8\xe6\x97\xdf\x32\xd1\x04J\xdb\x05\xb4\x13\xa9\x86\x62 \x94\xdc\xaf\x98S\x16\xc7\xb2\x9c\x44\x30\xc5\xaa\x14z-\x93 \xffm\x8dGio9\xd4\x15\x81k\x85\x36\xf9Y\xa5\x8e\\@b\xf8\xfe\xf7\xe6u\xf7\x37\xfe]S\xa6\x66\xe5\x0eJ#\xa9\x80K\x04\x11\x0eP\xef\x9e\x88\xed\x39\xd1_\xfa\x90\"\xa3p\f\x8b \x9c\x80,\x90.,\xe0\xe6&\x84\xd8j\xe4 \x1e\xbc\x96\xba\a\x9d\x1d=l\xd1\x04\xc8\xd1y,\x96\x0f\xe8\xa5k\x03\x06Q\xfd{D\xab\x66JA\x04\x02\x64Z@}k\x1a\xbcn\xeehp<\x10\x32sv(H\xd9\xa4\xe1!\xf6\xe4\x03\x94\x10\xef\x82\xe0v|\x99\x30&\x9a\x95\xa2\xc5\xb9\xa7\xae\x9f\x85\xcb\xf1\x82\xcd=\x06\xec\xafr\xc1\x33\t\xf9Q\x94\x42\xf0i\xb9\xc6\x04\xe6z\xfb\x1c\xee\xac\x95\x9b\x88g\x19\xa8yg\xc7\x1b\xccr\xe9\x18\xd2\x96\xcf=\xf8\x98 S\xc9\x37\x0f\x92\xb1\xbc\xaf\xc6\xecO%\xda\x95\x14\xed\xb8>\xaf\xd1RL(;\x84\x8cI4c+\xd4\xf4x\xb1\x8f\xb0\x35{\xd5\x44\xc3\x98\x9e\x85\x86\xae\xee\x05\xdd\xa1oS\xe4\xdco\xf5|~\xd8z\x9b\x18\x43?{*\xf3\xb5\x39Z\x1cr;\xdd\x01y\x97\xff\xdbX\xe5Ma\xde\xcf/\x13{\xafk\xa4\xf2Y\n\x13V\x1c\x05\x00\x0f\x18\x66\x33r\xbd\x62\x8d\x11\xf7 R)B\x83\x33\xc1\x0f\a\x80\xd4X\xe2\"\x94\xad\xec\xbf\x01\xb6q}\x92\xb1u\x14\xf2\xfbw9\r\x82\xb5Q\xba\x1f\x65W\xaahj\x17\x41\x13\x38\xc0\xe5\xeb\xcc\x8c\xdd\xb7\x00N\x01\x06%\xab\x87\x1c\x30i\xc4\x15\x0e\xf8\xf0r\xb6\x1d\x92~\xe2\xe6w\xed\xb8?\xcfW\x8d\x90\xe4\xa3yI\x9a\xe0\x1fJ\xde\xe9\x44\x8d\xd5#;\ac\x92\x9f\xde\xba~g\xb0\x82\x41*\xcd\xe1\xbb@\xf1\x8a\x66pt\xf1\x99}\xb0\vj\xa2^~\xc0\x8c\xb2q\xda\xcf\xbc\xfb\x9c\x03\x0e\x33^\x13\xb2\x34\x38\xc1\x83\x95\xdf\x46\xfc\xe0\xe0\xaf\x93\xe0p\xd5\x15\x8c/\xaeK\xa6\xeb\x13\x8f\xaf\x1b\xf5q\xc4\x62q\b\x97\x10R\xfe\xbd`\xd7\x9f\xdf=\xc5\xdd\xcd\xe7\x8e\x85`\xdf\x61y[\x90\xd9\xaaV0m\x0f\xfb'\x84\xdd=\x04j\xe0p~\xbbY\xf4\xeb\xe8\xc0\x62\xaa\xf6\xed\xca\xae\xb2+\x0f\xc1VE\xe7$k\xaf\xeb\x15&\xb2\xcd\xae\x1f\xe7\x11\xc0\x1c\x19J\xc7Q*)\xdf\x14\x82\x43\xfeR9\xba\xe6l\xa5v\x8b\xb1!\x9c \xb0\x10\fD\xf2\xd4nA\x1b\x8f\x90#\xe3\x87\xfc\xf1\x46\xc6[\xae\xd0*+x\xf5+\xb9\x9f\x46K0\xf8IW~\xb4\xff\xca\xadM\xf3\xc1{B\xe0\xa4\x37/\xe2\xb2`\xe8\xaf\xd7\x39#LgD\xe5m\xb3%\x11\x9f+\xea#\xfb\x1e\xce\xbf\xa4/\x88\xec\x18@\x16\x43\x9fq\x9c\x8d\xbd]U;\x92N#<\x87\xed_.\x8f\xde\x83\xad\x30\x42~\x1a^\xf5\xc5u\xbb\x99n\xf1\x87\xe0\xf3Q\x1e}\xe8\xfc\xc6\x88\xf2\x39m\xaes\x9f\xad\x9b{g\x99\xdb\x90\x0e\xa0\xfc\xaf\xcc\xdb\x8b\xaa\xc2T\xd5-\xb3_\xa3\n>\xd6\x8d@M;\xe5-1\xd8\xb2\x12\a\xca\x36V\xd9/U\x82\xdc\x8e\x92\xa9l\x91\x9e\"\xe4\xc6'\x8b\x1a\xa2xV,Z\x19\xdf@\xf9\xfb\x44![\xdf/\x99\x84I\xcf\x1a\x15\xa5Y:f\tM\xc1\xf2\xb1$3\xbd\x86\x41\xdc\x33\x9b\x03\xc0\xa8\xf8\x94x.\x16\x97\xef#\xee\xa4\xac:\x90\xb6\xd9\xc0\xda^&4&\xce\xc9\xf8\x45\x37\x83|\xbd\x9c`@a(\xcd\x9c\xb4\xe4\xe6\\O\xd1yB\x13\xa9o&#\xc2l\x8e\x8d~?\xee+M\xd2[\x80\xdct\xda\x1f\xbc&T\xc5\xfe\xee\xa9O\xce\x46\xaf\x90\xb0\x12\x9a\x18\x0e\x06\x05\xc7\x98\xef\xccm\xa3\x46\x91\xa5\x0e\xe7\x35\x1a\x7f\x9d\xae\xa0\xb4\n2;\xe4\xcdK>\x89s\xc9\x97\x38\xe5\x86O$\xedJC\x04\x02\xc1)\x8d\x85\xa2\xdd\xb2\x61<\xce\x8bG.\xedK$\x94\xb7\xbf\x9dUB\x95\xc2'\xe5\t\xd4 \x03 !:\xd8\xd2\xa2\xb3G\x93OZ9\xca\xd8t\xa9\x19\xa6\x9a#\xb1!\xa3\xb3\x14\xcc\xe2\x12\x91\x30\xdbP\xf8\x44t\xd6p\xdd}&\x7f\xbf\x32\x93\x1f=@\xbf.\xec(\xf5\xb1\xaf\x11\xc7Nd\x13<\xbf.\x19\x81\xfe\x35\xba\xecn\xb6\xa9\xfe\xc6\x85\x33\x41X\xab\x06\xae+\x96\x62\x1f,l\xad\xec\x1aYUZo\xe0\xebq\x8d\xb5\f\x81*9\xbdg9H\xfb\x91\x64\xad\x01LJ\x0f\x30)\xa0\xcf\x30\x96\x43\xe9\xfc\"K\xf3O\xab\xec\xbcZ\xfb\x7f \xd9\xd5\xc7\xce\x93\xa3.\x82\xd1\xa0\xc6\x16\xd5\x64-?i\x15\xfd\xf3(=Na\x01,\xd4+@Qn\x95\x00\xa4\x34\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14G\xf4\x18\xa5K\x85\xb7\x02\xc1\x97\xffW\xb6o!E4=\x92\"010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x17\x45\f\xdfSv\x9b\xce;\x12\xddG\x05m\x16\x90\x9d)\x9b\xe1\x04\b\xa1\xf2\x82\x1c\xd1\xd1{\\\x02\x02\b\x00",
+    "0\x82\n\x03\x02\x01\x03\x30\x82\t\xc9\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\t\xba\x04\x82\t\xb6\x30\x82\t\xb2\x30\x82\x04\x34\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x04%0\x82\x04!\x02\x01\x00\x30\x82\x04\x1a\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30I\x06\t*\x86H\x86\xf7\r\x01\x05\r0<0\x1b\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x0e\x04\b\xdbH\xe6\x98\t\x8fn-\x02\x02\b\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\xee\xb3\x10\xe5!\x85\x03>i\xad\xdfx\xa7\xd8\xac\xf1\x80\x82\x03\xc0\xcbX\x11(\x1d\xbc<\x8c\xe7{\x15g0\xf3+\x94\x10\x8c\xbe\xfd\xaa\x11\xd7\x99\xee!\xb6\x1bOS\xcb\x44\xffO\xbf\xf6\x43=\x12\xe6\t\xe8\x05\xdd/\xc5\x39\xde\f\x88\xe8N\x89\x8f_\xdf#P\xe6\xb7\xba\x1a\xdd\x1c\x63Q\x0eq\xb7\xf7\x39<\xd4\xe7RP\xc5\xd7\xbf\x65\x94r\x97*\xb9h\xc2\xbd\f\x97\x02t#\x7f\x11k\xea\xb4\xe4/\xf0\x8b\x91\\\xdb\xae\x10\xbf\x89\xbc\x62\xef\x99\xbf\aYX\x12\xef\xaf\xe6\xcd\x30'\xe4\xab\x44\xf7\xf9\x14\xb2]\xfa\x97\xe6\x9a\xed\x85`\x86\xd9\xb0\xd7\xa4\xe4\x00\xa8\xee\xbb\xfc\r\xe8Xz\xca\x02\x1d\x02\xab\xbd\x16PO\xfc`\xdeH\xb1\x7f\xea\xba\x45{)\xfe\x8e\xedH\xd2\x31\x64\xda\x89\x84o\xd1\xd2\xb1{\x97\x19\x38\x16\xd9?\xd6\xdbo\xabV4\xca\x34\x9cWAn\x87\x85*\xa8\xfb\xe9\xf6=\xb6\x83{\x02\xc9\xbe\xf1\xbb\x8e\xe5h\xae\xaa\xe1%\x8d\x1f\x1fRE>\xef\x33\xd8X\xd9H\xd4\xb5\xe1S!\xb5\xbd\xd4\x63\x1f\xbf\xe4\x30^\xc3\x63\xce\xdc\x12\x8c\xc7\f\xea;\xf3\v8\x8d\xcc\x9b\xe7\xa0\x14^H\x9ct\x86\x8e+w\x80\xbb\x85\xa6\xd4%nu\aY\xd6\x88\x00\x35\x03Z\xb0\x86~\x01\xa7wt\x13\xfa\x9f-\xe3\x90\xdah#6\vb!v\xdal\x05\x35\x80\xfc\xee_<\xac`*\x9cnL\xaa\xa3\xd1\xdf,~\x0e\xc0\xa0\x84\xe4\xb2\x33\x1f\x8c\xcbt1\x18[\v\x18\x41\xc6\x87\x13\xa2\xad\x1d\x43^g\xd0\x31\xf5\x61|=\x16U\x01\x94\x45\xa4P\x0f\xb1\x1b\x81Q\xa7\x92\xae\xa3mNUF7\x98\xe1\xe4\\)y\xc9v\n\xb5\x9d\x1b\x8a\xf6\xab\xebin\x17\x88\xeb\x82\xfax/\x8c\x30\xfd\xf1t\xcdSx'C\x82\x05\x37\a\xb3L\x89\x9d\x00\x1ds\xad\x0f\xcd\x63\xbe\x9b\xa9P\xa5\x43t\x86\x87\xbc\xd9\x97\x66\x84\x35>g\xce\x92,x\xc7\x88\x19j\x1c\xa8\x93\vy!\xe5\x39\x1b\x00h*\v\xacj/\xc1\x9c\x90\x18\x86\x63Sr4\xd9\xa8\x92\xce\x64:\xeb\xba\xd8\x31\xf3\xfb*\xac\xc6\xe7\xd1\v|\xfc\xbbiW\xc8\x97=\xdb\x81w*\x9f\a,yi\xbcQ\x0eh\x11\x00\x10\xed\x9f\xb8\x8d\xa0% \xd3=\b F\xfa\x89\xefiL`3\x80\xb9S\xb4{\xab\x38\xf1\xcd\xb8u\xc4\x85\n\xda\xab\x19@\xd3\x88\xd5\xf7_\x8e\xcd\x8e\xa4\x1c\x9c\"m\xce\x66)\xfa\x62o\x01\xdc\x46\x45\x38\x64\xf7\xc4\x94\xfdHDpM\xef\xf0K\x95\xf8h\x8d\xb7\x35}\xc6\xf5\x97\xce]\xad\xe8\\\xebO\x9b[\x03\xce\x33`\xf5\xce\xcc\xfe\xfbw@\xc4\xf4\x9d\xf3,\xdb\x83\xc2\x1a\xf2\xb6\xbe\xfc,\x7f) 5P\x00`\x03\xd2\xb3\x03\x18\x64\xb9\x64\x98\x33\xdbGC\xe2\xa1\x85y\x9b\xb1\v\x0e\xbb\x14_\xb9\x16\xb6\xc3\xf6\\\x01\xe3\xaa?\x03\xad\x18\xeb\x0e=\xa3\x1f\xccMHD~\xda\xb9\x9d\x17\xe8\x92\x46\xea\xf5>\x05N\xa7\xb5\x94m\x95\x42\xa7q\xfb\xc2\x45\xd6\xd2\x86\xd0y\x99\x1f\x96x\"\xeb\x05&\xf2\xa1gg+\xae\x1d(B\xd6\xbe\b\xf6\xb7T\xc8\x82\xbf\x92\x0f,\xbaG\xe2\x01s,\xd7\x34\x84/\xb6\x41\x84\xebz\xb2\xf9\xdd\x31\xbe\a\xb4\x88\x05\xd8\xe1yU\xe6K\x8c\xdc\xd1vXrB(\xb3\x9f\xd0\x05\x37ket\xce\r\x01\xa9I\xc5\x90\xab\x90\x16,\x9c\xba\xcb\x94\xc7\xfa\xe0\x39\x82\xa2\x88\xd6\f\xc4M\xfe\xb4\xbc\x87\xe5\x63;k\xf0\xd1\t9\x8fQO2\xae\xed\f\xffyR\x19\xa9NE\x11\xc3_\xd6+f\xe3\x9c\xbe\xbc\xda\x65%\xcd\xf5sE\t\xf5]k\x83\x45(\x98,XD\xca\x37\xeb\xc3\xc2\x10w\x14y\x9b\xd8\xb2\xbf\x45\xd5\x63\xe4\x37\x42{-\xe2I\xb3\x18\x8e\x86s\xf1Y\x8a\xf2<I\x12{\xb1@\x8c\x8c\xac\x05P\xbd\x9b;\x84\x81h&\x88\x1b\xbf\xa0(\xc2\x06\xa9\xe4\xd9\x1f]\xca\x96O\xfe\xd8\x64\xees0\x82\x05v\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05g\x04\x82\x05\x63\x30\x82\x05_0\x82\x05[\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x05#0\x82\x05\x1f\x30I\x06\t*\x86H\x86\xf7\r\x01\x05\r0<0\x1b\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x0e\x04\b\xe3>\xd3\x8d\xd6\xb5\x8a\x05\x02\x02\b\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\x61\xa0/\x8d\f\xa1\x03\xc9\xdf.\x81\x65\xe0\x63pU\x04\x82\x04\xd0$\x1e\xf9\x1d\xc4\xe9\xbfI<\x1eUJ\xd4\xb0\f\xdd[\x92\xb2\xed\x18\xac\x66\x90\x1b)=\x10\xad\x02\xe7\x17\x83\x44g\xba\x11o\x05\xf5\xf7\x37\xcbZ\xe9\x0e\xc3K\x1b\x62\xee\xb2\xb7\x14\x85\a-\x95\x83\xa9\xdc=K3\xadh\xbfT\xf8\xef%\x05@\xcd\x61\xbe\x12\xebxu6\b\x8cZW\xa1\x98\xd5\x42\x01\x1bL%\xc2\x18\x9f\x91\xfex\x88\x99GZ ,71\x05\x98\xef\x91n\xeb.\x86\x90\x61\xb1W\x1a\x05\x82\x14\f\xa8\x94\xaeV{\xd6/\x8b.\x91\xa6\x12h\x1f\x06\t/\xa6\xed\x33\x99rV\xe5\xf7\xea\xcc\xcf'\xa5\xadIZ\xbc{\xe3\x62\x63\x8f\x00+\x96\xc5?\xaf$\xba\xf6\x8d\xe2\xef\x18P\xd6\xd8O\xb2]\xb7\x96o\x02\xf7}\xf2\xa2{\x9b\x13\x98\xde\xddn\xb5HR\x8e\x44\xad\xe0\xcf@\x9f\xfd\x88\x33\x66\xcejI_\xe7K6\x93\x7fIb\xc9Z\xae\xa1\xca\xf7Z\xbe\x85w\x9a\x8f\xceM\x84\x81\xd0\xa2\xee`\x92\x86\x16*\xd5\b\xb6Xc\a|A\xac\x97O\xf0\xcf\xd8\xd2\xb1\xd7\x1d\xe5\xb8|\x04+\xd9\xee\xf7\"\x88\xa1S\xdb^[GI\xeb\xcf\x04xi\xd1\xfc\x8a\xa9\x61\x92\xbf\\\x7f\xdeIB\xfc\r\xc2\xa2\x8f\xba\xdf\x12\xa4\x62\xfb\x8d\xd3\xc5\xf9\x85L\x17p\xb7\xf7\x99)R\x92\x36\xc5K1#\\\t'<\xa0v]\x92\x99\x63\x88\xca\xad\xed\xd7\x85\x98/\xbe\xaa\xa5\xf3\nv\x13\x01\x90\x8a\xe7Z-+\x1a\x80\x33\x86\xab\xd8\xa7\xae\v}\xcd\x64\x8d\xa6\xb6\xfb\x83\x9f\x91#\xcb\xda\x63\xd0\xde\xf4\xdd\xaa#IlD\xfao\x12\x13\x90\x37\xde\xa3rE\x1a\xa7\xab\x01m\xd6\x34\xe7Q\x0e\x33\xbc\t\xbf\xb6\x16\xf8\xd3\x11\x11\xd1_\xaa\x32\xb6[\xe7\xbc\xdd\xaa\xe4\xed\x42=.\xf7\xa1\x06\x39\xd4\x00\xc6\xc8\xed\xb5\x96\xc1\xbfL\xf1\xf6\xc6Y\xf4\x99\x9c\x10\"\xa1:\xcd\x94\xac\v\xc8~)\xbc\xf0\xae'z\xb8\\\xa0\x13\x36\xb5\x19K,\xc1\xceIW\x1d\x36\xf0\xc2L\xdfm\xc9\x64h\xcb\xea\"2\xd7\x11,w\xbe\x01\xa3\x82-\xa1K\x13\x93\x87=\x01t\xc6\xc6\xf9\xae.\xa1\x44]Glo\xc6\xce\xef\x32\xf8\x8dSM\xa5\xf0\xa0Q~\xd8\x35U*\x04\xb9\x42\xa7Q\xba\xad\xce\x88{\x93%\x9d\x03\b\xfau8cx\x13\x11\x9d\xf6\xcc\x18\xe3\x99\xa9]\x90k\xbf\x9ci\x99\x63'5\x8a&\ag\xd1\xaeW\xec\xc0\x45n*BF\x8f\xe4\x84\xc7g\x06\f\xa7~\\ \x80\xdc\xc1\xe4ztv\x8f\x41x\xcej\xf9\xcb\x7f\xe9\x17pE\x01\x9a\xc3\x9c\xa2h\xa0y\xfd\x44L\xc8\xa0\xaf\xa5\xba\x0f\x03\x30\x43J\x1d>\xd4\x8e\x1fm\t\xf9\x63\xde\xd2\x9ew\xe7\xde\x61Rv\x0fm7\xf7\xc2i\x96\x9d\xc5\xd9\x15\x10\xf2\"\x1f;\x83\xb3\xb4,%6\xc3:$\x17\xed\xad\x11\x1f\x46\x31\fj<\xd2\x1a\xe7\x41\xb3u\xd8\x80\xb3\xf8+\xab\xb5\x81\xc6^@\x9aw\xaay1\x1fy\xfe\x0f\x0f\xb0\x36\xb7\xdc\xca\xf6\xbf\x80\xebx\xc6sj\xb3qi\x9c\x1d\xdd\x90\xd9s\aC7\x19\x7f\"\xa4\x9aM\x98\x66\x10[\bb\xb3\xd8/Vh\"\xdf\xd1\xa2ZE\xf9\xb4\xb9\xf2HN8\x1a#6mBV\xbb\x32\xe3\x00\x84\xa9\xe2\xba\xb6\x86\xc9\xa6\x64\x8a\xd6\xa6\xc4\xd7>\x8b\x34\x1bke\xfe\xb1\xc9\x93\xe1\xeb\x8a;\xf1\x0f\xdb\x84\xe2-\xf8i\x04\xee\xafX/\xc7\x96pM\xd9L\x1dR8\xc6&'A8\v\xa5\x1c\x16\xd0\x1d\x32\x99\xb9\x1f\x35\xaf\x02\xb0\x13\x0f\x95\xd3\x9b\xd6\t\xcc)F\xe8\xf1TM\xb8\x96\xa6\rYa\x1f\xee\xaf\xbc#X\xff\xcf\x96\x91\x1f\x00\x80N\x9a\xa2\xe0\x00\xf7>\xb1\x91l)X^\xe7\xc7#\xfa\x88\xf7\xfb\v\x0eJ\x04\x46\xe0g\x10\t\xea\xc0\xa9\xbe\x83\x11\x33\x8e\xfb\xd6\xd5g\xef\xb4\x13M\x17\xa1\x44\xb7\x98w\xd0\x63\xe7\x9c\xa7\x96)\xe5\xferL\xa9\x85\x9b\xc9\xf3\xf6\x05\n(h\x99\x31\xe8\x64\x30\x9c*\x90H\x84\x00\x1a\x66\x0e>\xf7\xaa\xc9l[W{\xa9\x17\x91\x1ek\xe8\x12\xa1\xd4\xde\x1e\x38\x14{\xe0\x9a\x15\xaeZ&\x93z\xd6\x8d&a(\xf2@q\xc7\x8a-ir\x04[\xb9\xc1{\x17\xde,\xfc\xa9\xf2\xf8\x34\x33\t\x87\x91\xdf\xeb\xf7W[2\xe2\xd4\xe4Gx\xe8\x9b\x1a\xab\x44U(\x98 \xa7\x16\x8bNB\xf1\x91\xbe\x00\x87:\x91\x63\x9a\xc2\x8d\x13\x34\x8b\x33\x02\x88\x1e\xb1\xa8\am\xb1\xf5\xb3z=\x17?\xbd\xa1\xdb\x04\x0f){\x0e\x98\x18\x63\v`\xcd\xa5\r_\x1eS\xcd\xfa\xc0\xc7\x99S_\xb7\xe5J0\xde\x14\xc9IF1\xb6\x92\xf3K\xc1\xb0\xdd\xecH\xff-RSd'Lx\x96\x80\x90\xa3\xd7\xfdz#6\xa0v\x9e\x96\xfc\xcd\xecX\xf8vK/\x8d\xb9\xd6\x89\xa1W\xe1\xc6\xed\x9a\x1e\xde\xc7h\x93+.\x84\x1a\xf9\x8cX\xb8\xf0)\xfe{\x03\x84\xe8R\x1c\x01\xbb\xcc]\x88\xcd\x37\x8b\xe2-0\xd1\xbe\xf7\xc1\x95\xb7\x01\x43\xab\x30?\x96GmR)\x87\x10\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14\x14t-R\x8e\r\f\x06l2d\xd3~31h\x8b(\x1au010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14/\\\xc6\xaf\xa7\xcc\xb5w@\xcaq\xc3\x8c\xc6i\xdc\xc6\x7fT\xef\x04\b\xf8\x9c\x8b\x12'\xe8\xec\x65\x02\x02\b\x00",
 };
-static const size_t kLen57 = 982;
+static const size_t kLen57 = 2691;
 
 static const char *kData57[] = {
-    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\bAF\"\xac\xe7\xd6~a\x02\x02\b\x00\x80\x82\x02\x30\x9a\x05UZ\xa0\xf6\xd4\x8c^\x1c'\x91\x11\xfd\x1d\xe8\xfd\xae\xf2\xe6\x9f(\xb8\x1e\xfa\xce\x88\xb4#\xd6\xfan\a\xe9\x33\x81p\x1d\xd0^\x94\x04\xf1`\x8e\xbf\xe1\xef\xf4\xd7\xb2/\r\xe9p+\xe8\x62\xfc\xd3*I\xf3\xf1\x06o*\x94\x8c\x42\xff\xc6\x80\xa8j\xbf\xa3\n\xd3\x8eYR\xea`\xe8Zd#\xac\x8d@-\xc9\xfe\v\xf3\x93R\xc3>\xea\x34\x9a\xea\x42j\xe4\t%D]^\xb4;\xfb\xe0\xc2\xdf\xd8\xaf\xae Y\xb0\x8c\xdd\xb3J_\xcal/\xe3\xb4\x99\xc6\x8fu\xc5r1\x0eLF\xe6\xe1\xbf?\xdf\x02}\xde\x35\xad\xd9\x9d\xcbt\xa7\\R;\xc2\x9cv\xbd\xf7\x96\xfc\xc5\x9d\xc7\xa7y0\xa0\x89\xd6\xd3\xa8\xe8\x63\xd2:?\x88\xc1\"\x8c \x9c\xa0#\a\xc3\xe4\f6\x19\xa8\xa3\xc4\xbc\xbc\xd6=\x80\xcbT\x91\xc4\xab\x02\xd2\x43\x30\xe5\x01\xbd%\xcd\xe4)U\x0fn\x83\xb8\xfbp\xf2\x34\x9a\x15\xc6\x16\xdf\x89\xe4\xd4\x83&\bb\x05\xa6\xea\xf3\x63\xc3\xb5ib\xf8`\\(!Q\xa4\x43v\xdd\x41m\xbdm\x8e<cD\xb6\xea:*\x1c\x9dK\x84\xed\xbd.;\x97\x89\xc3\x88\xca_\x84\x0f\xbdP\xeb\x94g\x83\xa7\x83\xdf\xd7\x9d\x81@:{\xcf\x8b\x1d\x19\x9b\xe1N\xb4K\x1d[\x98\xa8\xe3\x89\xed\xf3H\xfc\r8\xd5\x42\x31\xe3y:\xea\xa3KX\xa3u|\xd4\xc4\x38'\x9e\x97N\xc1p\xa8\xee\x85\xe2\xb8SW\x15\x05\xbb\xf1\xb4\xfd\xe8$\x99\x64\xa7\xf3j\xccK\xe9\x8d\x66\x38\x9a\x45\xe2s^f\x18\xd9\x64\x46\xd7\xd1#0\xbe\xa2K\\\x0eL\x8aG\x88\xb4z.\x0f\xb6\xab-V v\xf4\xa1\x37\xb6k\x98*\xb4\xdag\xcbg\\\xc7-A\xf6\x14\rk\x16\x05\xe6\n\xa2\xf7\x03^\xf8\x9c\x85X\xa5\x82\xa4\xaf\xd1\xf0:H\xa1h\x10\xa4\xa5\xc5\x87\xf5\xc3\xf8\x94\x9d\x13\xcb\bB\x14\xb3hh\x18\xec\xa9W\x9c\xeb\xc9\xe9\xaf}\xcc\xb9MX\x8d\xbf\x04\xb7\x1c?\xfa\xd3\xb9\xb9\xad\x0e\xd2_\x8b\x41\xfa\xdc\x85>\n\xbaI\x1b\xe2\f\xb6\x85\x9b$<\xdf&\x9d\x05Pd\x12\x96$\xdbMy\a\xa7\xb2<\xf9\x42\xca\xdag\xc0m\xf2~\xbc\x1e\\+K\xf6\xf4\x35\x82pk\x81\x16\xfc\xf1\xa9_\a,\xe9\x1e?0\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\bo\xb9\x01\x93l\rM\xe1\x02\x02\b\x00\x04\x81\x90\aBjZLAA8\xe4\x15\xc2\x85N\x88\xc6\xd3o\x9f%\xd8\x66\x86\xf3\x65]QC\xd6\x03\x91L\xeb\xbbu\xce\x8b\xf4GCL\x1aKH\x92\xf4\xaf\n_I\x96\xea\xaf\x31){\xa3\xb5\xd3\xe4g\f \x0eR\x9e\xcf\xcfj-E8Ra\xbf\x10+\xc1\xc5\xde\x04\x1d\nR\x88\a9\xc2\xc1\xd0\x44\x39\x9f\x46\xf2i\xa4\x30[\xe4`hi\xb0\x95x\x05\xef\xe1\x81\xc2\xd2N)R9Q\xfc=(\xe1{Xv\xcf\x35\x33/\xef\x95v\fR\x11i\x17<V6\xc6\xe1\x9c\x1c\xd4#1%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14R\x8c?r\x8c\xcf:\xeb\xc8\xff\xc2\x8cHB\xa6\x1c\x42n\x18\x43\x04\b\xea\xec\xdc\xf6\xc4\xdf\xda\xd6\x02\x02\b\x00",
+    "0\x82\n\x7f\x02\x01\x03\x30\x82\nE\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\n6\x04\x82\n20\x82\n.0\x82\x04\xa2\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x04\x93\x30\x82\x04\x8f\x02\x01\x00\x30\x82\x04\x88\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30W\x06\t*\x86H\x86\xf7\r\x01\x05\r0J0)\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x1c\x04\b\xb2^\rm\xda\xaa/\xbe\x02\x02\b\x00\x30\f\x06\b*\x86H\x86\xf7\r\x02\t\x05\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10<\x04x7\xb3\xb2$\xd3\xb5\x46 \xb7\xd2\xdd].\x80\x82\x04 :\x01\xe4\xf4W\xd3\xed\x14\xd0\x42?\xd3\x61\xee\x84\xcd+\b`0\xbdr\xa7\xd5\xa4\xf2\x13\xe9\xf0\x44\x66&4\xe7,]\xc9\xb0K\xabG\x16\xab\xe6\x06\xa6;yA\fy\xd5\x9b\x02g\xd8\x7f\xc8\x36\x37'\xb4\x44\xa2^\r8\xb8\x41\x8e:\xf1\xe9\xab\xe0\x19\xd0\xe1\xc7\x92\xd4[5\xf3yH;\xfc%\xfc\xc6\x9f\xed\x35([\xfa\xeePB\xa3\xc3\x96\xee\xe0\x87\x33^\xa7\xc7\n\xfe\xda\xe5\xd5)jW\b\x7fV7*\x1a\xa0m\xe9\x84\xac\xed\x0e\xd8\xc0\xd8\xc6w\xb1\xdd\x1b\xa1\xed\xa7y\x13.[\x9b\x80\x44\x9e\xff\nn\x99\x33\xcf\xf1G$\xaaH\xe7,\xb3\xe6\xdc\xd4\x1e\xe4\xb8^r\xaf?\xd3%J\xac{5\xb1\x82\xa5\xd9\xf8\x01\x12\x92IL\x17\a\xb2\xb1>\xcb\xfd\xd1\x17\xb5\x65=\f++\xc0\x37\x9c\xe7\x04\x9bqZ\x10\xc0\xba;1\xde\rfl\rL\x99\"v*u\x7f\x84\xd1\a\x1fW\xf0\vqA\xea\x38\xe2\xe7\xbe\x11<\x92\x8c{\x0e\xb4~v\xc4\x80\x41\xaeL\xe2\x38\x36\xcb\x82\x39\x38:U\xb4\xe2\x35\x94\xc3\xae=\xd1\x03\xf3\xdb\x00\xd9\xfa\x96\x62%\x97Q\xc5\xcf\x84\xe8\xf7\x8b/1\xeb\xa7\n\"o\xad\xf5(%\xaa\x99\x0e\xb1\x83\x9fpy\xaf\x10|,U\xfe$}\xea\x85H\x8ez\xf7G\xd8\fd\x97\xe0\x8f\x62^\xd0O!\xa4\x46\x8e(\xb0\xb1\x90\xec\x01}\xc4\xc8o\xf2\xe2\xb7\xc4\x35l\xa9\xf6\xaf\xc2\xb6\xa9\x02m\xb2\x8b\x43kA\x80\x9d^Q\xa7\x31\x00\x1b\xb5$\xed@\x99\x33\xde\x87\xd1KvxWL3y\x89\xd3\xfap\x0f/1B\x8c\xce\xe9\xc0X\xe1\x30\x30\xf1\xe9\xab\xc8`|\xe0j\x99\xe7\xd3!\x1a\xcc\x98`D\xaa\xff\xee\xec\x34 \x19\xba\x03;go\xee\xd5\xb3\xa7!W\xd6I\xaf\x91\x8f\xecp\xd0Y\x1ay\xe2\xd2\x94\x82S\xfb\xea\xd6\x83IJo\xd6\xed\x15\xc3q\b:\xbf\xde\xa8-T\xafJ@\xbc\xe5S\xaeK=p\xfe\x1c\x03\x1e\xb2\x9d\x1c\x35\xbd\x9a\xf8\xc5\xd1\xa5Jc\x18\x02\xd4\xff\xdd\xcd\xb3l8\xd1\x9a\xad\x16q\xf1\xc6\x1d\x8fl0\xfa.\x13\x9d\vN\xe6\xd3\x37\x80X&\r\x04\x97\xe6\x8d\xcc\x63<98/zs\x01\x0f\"iGT\x9e\x42\xc8Y\xb5\x35\x43\xb4\x37\x45Y\x85\xf2G\xc3\xfb#\x13\x18\xef\xd8\x11pt\xce\x97\xcf\xbf\xd5-\x99\x00\x86V\x9b\xdf\x05g\xf4I\x1e\xb5\x12#F\x04\x83\xf3\xc1Y\xc7{\xc3\"\f,\x1b}\x18\xb6\xd2\xfa(6\x8bQmX\xf4\xd6\xdf\x38\x94\xcflPO\n\xf3\xc3\x91\x39\xa5\xc9\xbc\xa8\xeb$\x1a\xddX\x9e\xdc\xb2\xee\xe1\xa5\x16h\xc2\x63\x8c\xc9\xa7\xbe\x1e\x30\x84\xa6(\xebP\xd9\xdd\x15\xea\x64\x34\xf0zVj\xdd\xb2p.\xearf9T\xaa\x36\xfah\xaa\x06]H\xca\xadN\xfeK@\xdf\x43\x46\xd6\xdf?\xa1\x9eL\xdc\xfeL\x01\t\x7f\xd8\x00\x84\x94)\x17g\x00\xd3\x46\xd2\xba\xb9\x62\x66P\xcd|zpFJ2b\xc2n\xe7^\x04$\xc5\xfd\x9d\xf4\x9b\xc8\xe9\xebs\xf9\xaa\xa4\xcc\x63\xa3\xdc\x63\xe0\x30\xecp@\x9e|cy\xae\xba\xfd\x95LF\xf1\xc4\xae\xb9\x03\xe8\xd4\xe4\x90):\xbb\xdb\xd8\x8f@\xc3\x39\x9aLpT\x9f\xc9\n\x04#\x98k\x9c\xc2\xe0\xad\xae\x30\xef\xff\x44[s.\x8f\xd7+\x12\xf0\x31\b\xfb\xb9U\xf0\xc3\x62\xbb_m\xa7\x1d\x61\xc2&\xce\xab\xb6\x88%\xce\x8b\x02\xb6\xc5\xa2\xcc\xd4\xa3t[v\xf7\xb4\xd9\x9c\x93\x86~\xac\x82\xe0\r\x83\xe1\xc9\x7f*\x86\xbb\xaa\xfe\xdc\x17\x9c(w\xe1X\x18\x15\t\xe3\xda\xdb\x8d\xeeU\xf6\xda\xad\xe5R\x84\xb4\xf0$\xce\xa1TK\x9f\xea]M\x7fS\vy\x1d\x87\xcb\v\xa8\xef\x03\xfaXW\xf6\x02p\xdbzd\x89\x1f\xc7\xca\x87\x02'3\xc5[*P\xc5\xb5{-=\xa9\xbc!{\xf2\xbe\x9cV5\x83\xba\xce\x34\x8d\xec{\xaa\xe4\xcb\xd1OJ1\x00\xd1\xb8\x30\x38\xaf\xe8\xe3\xd7\xc2\x8c\xe3\xb4#\xb3'\a\xc6\x88\xecX\xe9Y\xfb\xa9\x11\xa2\xc8w\"j[\x86\xde\xdc\xedvnsy\\\xb4\xcf\x19v\\k\x1cK\x03\xcb\x35\b\x94\x37\x01\x98R\xd8\x31\x42=\x7f\xa1\x11\x06\a\x88\xb8\x31\x35\xb2I(\xc6,DC\xb6\xbcXvlO\xc8\xb6\x30\x82\x05\x84\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05u\x04\x82\x05q0\x82\x05m0\x82\x05i\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x05\x31\x30\x82\x05-0W\x06\t*\x86H\x86\xf7\r\x01\x05\r0J0)\x06\t*\x86H\x86\xf7\r\x01\x05\f0\x1c\x04\by1\xf9\xe2\x42\x33\xf1\xaa\x02\x02\b\x00\x30\f\x06\b*\x86H\x86\xf7\r\x02\t\x05\x00\x30\x1d\x06\t`\x86H\x01\x65\x03\x04\x01\x02\x04\x10\xc9\xda_\x96\xc8,\x85]\xa0\x30\x82\x16k\xf4\xfd\x91\x04\x82\x04\xd0\xc3\x89jVj\x84Xv\xd7#\xd5\xa8\xc1/C8\x99\xf8\x64\x97\xe7\xe8\xd2\xcf\x36\x9b~\x04\xe5\x87\x80\xff\xd5XPZ\xb3\xc0\x15\xc9\xd5\x61\xd6;\x7f/;\x98PU\t\xcf\xc3\xdd\xbd\x8b\xcd\xdf \x90\xe1\xd2\xcd\"\x9f\xa7>\x10\xd3\xb7&Te\xfb\x18\x12X\x81\xd8\xe6\x97\xdf\x32\xd1\x04J\xdb\x05\xb4\x13\xa9\x86\x62 \x94\xdc\xaf\x98S\x16\xc7\xb2\x9c\x44\x30\xc5\xaa\x14z-\x93 \xffm\x8dGio9\xd4\x15\x81k\x85\x36\xf9Y\xa5\x8e\\@b\xf8\xfe\xf7\xe6u\xf7\x37\xfe]S\xa6\x66\xe5\x0eJ#\xa9\x80K\x04\x11\x0eP\xef\x9e\x88\xed\x39\xd1_\xfa\x90\"\xa3p\f\x8b \x9c\x80,\x90.,\xe0\xe6&\x84\xd8j\xe4 \x1e\xbc\x96\xba\a\x9d\x1d=l\xd1\x04\xc8\xd1y,\x96\x0f\xe8\xa5k\x03\x06Q\xfd{D\xab\x66JA\x04\x02\x64Z@}k\x1a\xbcn\xeehp<\x10\x32sv(H\xd9\xa4\xe1!\xf6\xe4\x03\x94\x10\xef\x82\xe0v|\x99\x30&\x9a\x95\xa2\xc5\xb9\xa7\xae\x9f\x85\xcb\xf1\x82\xcd=\x06\xec\xafr\xc1\x33\t\xf9Q\x94\x42\xf0i\xb9\xc6\x04\xe6z\xfb\x1c\xee\xac\x95\x9b\x88g\x19\xa8yg\xc7\x1b\xccr\xe9\x18\xd2\x96\xcf=\xf8\x98 S\xc9\x37\x0f\x92\xb1\xbc\xaf\xc6\xecO%\xda\x95\x14\xed\xb8>\xaf\xd1RL(;\x84\x8cI4c+\xd4\xf4x\xb1\x8f\xb0\x35{\xd5\x44\xc3\x98\x9e\x85\x86\xae\xee\x05\xdd\xa1oS\xe4\xdco\xf5|~\xd8z\x9b\x18\x43?{*\xf3\xb5\x39Z\x1cr;\xdd\x01y\x97\xff\xdbX\xe5Ma\xde\xcf/\x13{\xafk\xa4\xf2Y\n\x13V\x1c\x05\x00\x0f\x18\x66\x33r\xbd\x62\x8d\x11\xf7 R)B\x83\x33\xc1\x0f\a\x80\xd4X\xe2\"\x94\xad\xec\xbf\x01\xb6q}\x92\xb1u\x14\xf2\xfbw9\r\x82\xb5Q\xba\x1f\x65W\xaahj\x17\x41\x13\x38\xc0\xe5\xeb\xcc\x8c\xdd\xb7\x00N\x01\x06%\xab\x87\x1c\x30i\xc4\x15\x0e\xf8\xf0r\xb6\x1d\x92~\xe2\xe6w\xed\xb8?\xcfW\x8d\x90\xe4\xa3yI\x9a\xe0\x1fJ\xde\xe9\x44\x8d\xd5#;\ac\x92\x9f\xde\xba~g\xb0\x82\x41*\xcd\xe1\xbb@\xf1\x8a\x66pt\xf1\x99}\xb0\vj\xa2^~\xc0\x8c\xb2q\xda\xcf\xbc\xfb\x9c\x03\x0e\x33^\x13\xb2\x34\x38\xc1\x83\x95\xdf\x46\xfc\xe0\xe0\xaf\x93\xe0p\xd5\x15\x8c/\xaeK\xa6\xeb\x13\x8f\xaf\x1b\xf5q\xc4\x62q\b\x97\x10R\xfe\xbd`\xd7\x9f\xdf=\xc5\xdd\xcd\xe7\x8e\x85`\xdf\x61y[\x90\xd9\xaaV0m\x0f\xfb'\x84\xdd=\x04j\xe0p~\xbbY\xf4\xeb\xe8\xc0\x62\xaa\xf6\xed\xca\xae\xb2+\x0f\xc1VE\xe7$k\xaf\xeb\x15&\xb2\xcd\xae\x1f\xe7\x11\xc0\x1c\x19J\xc7Q*)\xdf\x14\x82\x43\xfeR9\xba\xe6l\xa5v\x8b\xb1!\x9c \xb0\x10\fD\xf2\xd4nA\x1b\x8f\x90#\xe3\x87\xfc\xf1\x46\xc6[\xae\xd0*+x\xf5+\xb9\x9f\x46K0\xf8IW~\xb4\xff\xca\xadM\xf3\xc1{B\xe0\xa4\x37/\xe2\xb2`\xe8\xaf\xd7\x39#LgD\xe5m\xb3%\x11\x9f+\xea#\xfb\x1e\xce\xbf\xa4/\x88\xec\x18@\x16\x43\x9fq\x9c\x8d\xbd]U;\x92N#<\x87\xed_.\x8f\xde\x83\xad\x30\x42~\x1a^\xf5\xc5u\xbb\x99n\xf1\x87\xe0\xf3Q\x1e}\xe8\xfc\xc6\x88\xf2\x39m\xaes\x9f\xad\x9b{g\x99\xdb\x90\x0e\xa0\xfc\xaf\xcc\xdb\x8b\xaa\xc2T\xd5-\xb3_\xa3\n>\xd6\x8d@M;\xe5-1\xd8\xb2\x12\a\xca\x36V\xd9/U\x82\xdc\x8e\x92\xa9l\x91\x9e\"\xe4\xc6'\x8b\x1a\xa2xV,Z\x19\xdf@\xf9\xfb\x44![\xdf/\x99\x84I\xcf\x1a\x15\xa5Y:f\tM\xc1\xf2\xb1$3\xbd\x86\x41\xdc\x33\x9b\x03\xc0\xa8\xf8\x94x.\x16\x97\xef#\xee\xa4\xac:\x90\xb6\xd9\xc0\xda^&4&\xce\xc9\xf8\x45\x37\x83|\xbd\x9c`@a(\xcd\x9c\xb4\xe4\xe6\\O\xd1yB\x13\xa9o&#\xc2l\x8e\x8d~?\xee+M\xd2[\x80\xdct\xda\x1f\xbc&T\xc5\xfe\xee\xa9O\xce\x46\xaf\x90\xb0\x12\x9a\x18\x0e\x06\x05\xc7\x98\xef\xccm\xa3\x46\x91\xa5\x0e\xe7\x35\x1a\x7f\x9d\xae\xa0\xb4\n2;\xe4\xcdK>\x89s\xc9\x97\x38\xe5\x86O$\xedJC\x04\x02\xc1)\x8d\x85\xa2\xdd\xb2\x61<\xce\x8bG.\xedK$\x94\xb7\xbf\x9dUB\x95\xc2'\xe5\t\xd4 \x03 !:\xd8\xd2\xa2\xb3G\x93OZ9\xca\xd8t\xa9\x19\xa6\x9a#\xb1!\xa3\xb3\x14\xcc\xe2\x12\x91\x30\xdbP\xf8\x44t\xd6p\xdd}&\x7f\xbf\x32\x93\x1f=@\xbf.\xec(\xf5\xb1\xaf\x11\xc7Nd\x13<\xbf.\x19\x81\xfe\x35\xba\xecn\xb6\xa9\xfe\xc6\x85\x33\x41X\xab\x06\xae+\x96\x62\x1f,l\xad\xec\x1aYUZo\xe0\xebq\x8d\xb5\f\x81*9\xbdg9H\xfb\x91\x64\xad\x01LJ\x0f\x30)\xa0\xcf\x30\x96\x43\xe9\xfc\"K\xf3O\xab\xec\xbcZ\xfb\x7f \xd9\xd5\xc7\xce\x93\xa3.\x82\xd1\xa0\xc6\x16\xd5\x64-?i\x15\xfd\xf3(=Na\x01,\xd4+@Qn\x95\x00\xa4\x34\x31%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14G\xf4\x18\xa5K\x85\xb7\x02\xc1\x97\xffW\xb6o!E4=\x92\"010!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x17\x45\f\xdfSv\x9b\xce;\x12\xddG\x05m\x16\x90\x9d)\x9b\xe1\x04\b\xa1\xf2\x82\x1c\xd1\xd1{\\\x02\x02\b\x00",
 };
-static const size_t kLen58 = 2566;
+static const size_t kLen58 = 982;
 
 static const char *kData58[] = {
-    "0\x82\n\x02\x02\x01\x03\x30\x82\t\xbe\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\t\xaf\x04\x82\t\xab\x30\x82\t\xa7\x30\x82\x06\b\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05\xf9\x04\x82\x05\xf5\x30\x82\x05\xf1\x30\x82\x05\xed\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xfe\x30\x82\x04\xfa\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b\xb7 UZM?\x0e\x89\x02\x02\a\xd0\x04\x82\x04\xd8:\xcc\xd6\xcbMT\xc0\x04V\x10\xccI\xe4\xe0\x10s\xfb\x1a\xdd\x1dOnU\xe3\xa4\xab\xf9&\xaa\x42T\xa0\xd1\xf0\x8d\xbfq}\x18\x00\x17\xb3\xb7\x63P\x8d,\xeb/\xe3\xc3\xbf\x93\xc8\x46H\x99G\xe2;\x8dq\x01_Y[a~\x1f\fn>\xc4t\x99\x98\x30\xff\x37{0\x19\xb5\xfci\x94_yi4\xda\xb5!\xcf\xfer\x87\xe8})~'%\x90\x80\x98\xdd\x8d\xbf\x42\xb0\x10\xd8}m\xfeo\ra\t\xfd\xb2\x9b\xeb\xbf\x1c\xca\x33\xbcN\x19RUS\xb4\xa5\x98l\xa3;\xf8\xa4\x8dy\xcf@\xf2\x89\t<8\xab\xae\xf4\t;\xb6\xcb\xdd\xd7\xad\xe0Zqd\xc9\x0f\x18\xac<\x12\xd4\"T$\x1a\xa5\x35x\x99\tJ\x18\x95#\xb9\xf7\x89?\x13\x43\x1f\x8dvk\x04\xdb\x64\xf4\x8e\xf5P\xa0\xae\x1c\x8c\xc8\xf3\xde\xf3\x11-\xfev\xf0\xac\x46T#\x03I\xfas\xcd\xe0\xa1lfM\x1b\x99W=aa\xeb\x61@\xc7\xd6\x41\xbe\x63!\x1e~\xb5\x0e\x94\x93\x37\x41\xe8\x91\x06\xd7\xa3\x33x\x17\x17Yx\x8f\xaf\xed\xf9\x90\xfb\xb6\xc8\xa9\v\x10\x1a\xf1\xab\x10\x11\xbc\x7f\xa5-4}{\xaf\xc8\xb2\x00k\xd4\xbb%\x9b\xc7\x14\x8bP\n\xd5,\x1f\xa0_\a\x1d^\x1a\xa4K\x85\xb2\xa6\xe2\xdd\xb7\xda\x11%Q\xbfrPS\xa1=\xfa\x1d\x34u\xddz\xe0\x90V\x14\xc3\xe8\v\xea\x32_\x92\xfc.M\x0e\xfe\xba\x1a\x00m\x8fu\xacILy\x03.\xf2\xcc\x8e\x96'<Y(\x7fR\x8d\xc3;$h\xff\xbb\xd0N\xdf\xc4\x91\x32\x14^Cs\xd8Ve\xe1H\x89\xe4\x33\xefKQP\xf2S\xe7\xae}\xb6\x8c\x80\xee\x8d\x9e$\x1a\xdd\x95}\"Xv\xf8\xbb\x63\x36\x17\xdc\xc6>\xb8\xe9\x1f\xd8\xe0\x06\x18\x1b<E\xcb\xe1ZA\xe5\x32\xa3\x85\x1b\xff\xe0^(\xee\xe9\x05\xc7\xc8G\x85\xe8\x13\x7f\x1b\xda\xd7>\x8e\xb8\xa3\x96\x34\x19;\f\x88&8\xe7\x65\xf6\x03O\xc8\x37n/^]\xcd\xa3)7\xe8\x86\x84\x66\x37\x84\xa0IN\x8f;\x1a\x42\x9f\x62\x1f+\x97\xc9\x18!\xd2\xa5\xcd\x8f\xa4\x03\xf8\x82\x1e\xb8>kT)u_\x80\xe6\x8f/e\xb0k\xbb\x18n\r2b\x8c\x97H\xd3\xaa\xf2^\xb8%\xbc\xb5\"J\xac\xcf\xdc\x8bH\xfc\x95\xf2\x17!\x1e\xda\x13\xd3\x1b\xe2\x37\xd5\xbf\x92\xe4\x81\xf5\x98WQ\x14\xda\x80}Jj\xce\x17\xaf\xdb\xc3.\x84;\x1e\x02QJ\xc1%\x8cZ V\xee\xecY\xcf\xd7>_9\x9f\xbfMN\x94\xb1\x1d\x83p\xc0\xab\xff\xfa|.[\xfbW?`\xb8\xf3\x36_\xbfj\x8co\xe0\x34\xe8u&\xc2\x1e\"d\x0e\x43\xc1\x93\xe6\x8a.\xe9\xd9\xe0\x9fVP\x8a\xbdh\xf6WcU\xbb\xe7\xfe\"\xca\xdc\x85\x38\x39\xc8\x66\x02(\x0f\xe0\x1c\xd6\x0f]j\v\xd8\xe5j\xebT\xb2\xe0\x02o\xe2\x42\x89\x66\xc2\xd5\xc6\xe2\xb2\x04m\x8a+H\xc2Q\a\x8e\xf3\x91\v\xb7Un\xbb\xbf\x11Z\xcb,\xb3\x1e\x61\xd3\xdb\x90\xad\xba\x10\x96\xe2\x16\xf4\fG\xbd\x64\x66z\x17\x63\xb9\x02\xcbSz5\x92t\xc3*}\xc5\x11\x18/\xa3\x62,\xc0\x87\xd3\xd3\xba\xcb\xe0\x86\x9bK\xc5Y\x98~2\x96U\xc1=Z\xcd\x90-\xf8\xb7\xa8\xba\xce\x89\x64\xa6\xf3\x1b\x11.\x12\x99M4E\x13\x66\xb7i{\xc5y\xf5k\xc2\x1d\xc8?\t\x18\n\xfc\xf7\xaf\x98\xc2\xc7\xcc\x85)\xc6\"zw\xab\xb5\xac\xf7\x9ep\x8e\x7f<\xf1\xbd\xd9z\x92\x84\xc5\xb8V\xc3\xcb\xf7%\xad\xda\x0e\x1c\xe4hf\x83\x91x\xf1\xe7\x8c\xaa\x45\xb6\x85t\x9b\b\xff\xac\x38U\xa5j\xea.uq\xd3\xa2\xdc\x1c\xc0\xc7\v\xa9\xd5~\xf9\x63\x82\x87\xb7\x81\x01\xb9\x31\xdf\x41\x35\x0e\xe2\x1fH\xbf`\xce\xb0\xb4\x38\xa5\xb4v\xa3\x80\x1f\x93W\xf2\x05\x81\x42\xd1\xaeVm\xc5L\xab\xa6$*\x02;\xb1\xc4u\xcf\x15\x90\xb5\xf2\xe7\x10i\xa0\xe3\xc4\xe6Rc\x14\xb4\x15\x91\x8e\xbaz\xad-\x9b$t61\xca\xcbKZ\xbf\xd3N\xb4\xc1HDt/\x83\xe4\x39=\x90-2\x12\xf7\xfa\xd3\xe3\xdbO\xe6\xe7 ,W\xc0\xf9\x80\xe1\xdc\x1c\xf2\x05T5\xf6\xbd\xfb\xbd\xc5\xb2\x82\x32\x63\x32\xca\xf4\xf7\x14\x92\x87\x8a\x45\x37V\x93\xdaO\x04Y\x03$\x93\x1a\vN\xdbX\xbf\xda*\x0e~\x98l\f\xeb!\xf9\xbf\x9b\x1f\xc0\xef\xd3\xea\xcb\x99^\x14>\x10\xfa\xad\x38\xf7h\x9f\xa3\xcc\xdf\xe5\x31\x91\x98\xdet_{\xce\xe4T\xd9Q\xec\xf5K\x17_\x99L\xf8\x00\xe0\x10\t\ad\xae\x61;`\xa3\x89\x38\xc4\x80\xf2\x1e\x11&xr\x05\x97'\xba\x83\x33\x1b\x14K\xc0\xc8\xb0\xcc\n\x9b>L\xde\x12\a\x11\xd5\xf0\xc0\xddp=\xd8z\xf7\xa2\xf2p\xadT\xcegA\x12)\x1f\xe1I_LwA|t%\x9c\x91\xd1\r\xa5\x9a\xb8VL\x01\xc0wQ\x14\xc8\x92@\x9a\xbd\x7f;\x9b\x17\xbb\x80nPd1\xed\xe2\"\x9f\x96\x8e\xe2NTn65\xfc\xf2\xed\xfcVc\xdb\x89\x19\x99\xf8G\xff\xce\x35\xd2\x86\x63\xbc\xe4\x8c]\x12\x94\x31\x81\xdb\x30\x13\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x06\x04\x04\x01\x00\x00\x00\x30W\x06\t*\x86H\x86\xf7\r\x01\t\x14\x31J\x1eH\x00\x65\x00\x65\x00\x36\x00\x64\x00\x38\x00\x38\x00\x30\x00\x35\x00-\x00\x30\x00\x36\x00\x64\x00\x39\x00-\x00\x34\x00\x32\x00\x65\x00\x32\x00-\x00\x38\x00\x62\x00\x36\x00\x38\x00-\x00\x66\x00\x65\x00\x61\x00\x62\x00\x35\x00\x65\x00\x66\x00\x32\x00\x38\x00\x32\x00\x37\x00\x30\x30k\x06\t+\x06\x01\x04\x01\x82\x37\x11\x01\x31^\x1e\\\x00M\x00i\x00\x63\x00r\x00o\x00s\x00o\x00\x66\x00t\x00 \x00\x45\x00n\x00h\x00\x61\x00n\x00\x63\x00\x65\x00\x64\x00 \x00\x43\x00r\x00y\x00p\x00t\x00o\x00g\x00r\x00\x61\x00p\x00h\x00i\x00\x63\x00 \x00P\x00r\x00o\x00v\x00i\x00\x64\x00\x65\x00r\x00 \x00v\x00\x31\x00.\x00\x30\x30\x82\x03\x97\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x03\x88\x30\x82\x03\x84\x02\x01\x00\x30\x82\x03}\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b\x92\x16mmh\xd3\xb0\xc1\x02\x02\a\xd0\x80\x82\x03P\xeev\xe8`\xbf\xca<-\xe5)\"\xf6\x33\xc3Pj\xdb\xf3X<\xd9|\xd8\xf9\x83\x89\x17\xa8\x1bk\t\xc1\x99I\xb0\x43\x06\xc6\x42K|\x85K\xe6i8\x91\xce=<\x97\xd5\x14O\x15Z\x81Mw@\xe0\xe1\x1ci?\x1d\x65h\xb3\x98\x95\x30l\xb0p\x93\f\xce\xec\xafW\xc6\x9c\x34\xb4+\xaf\xc3^p\x87\x17\xe8\xc9T\x06\xb5\xb7\x83\xff\x46+\xb6jf/m\x0f\x96Sfe\xb8{HU\x83\xd3\xc4\x16\x93\xderY\xf1\x9a\xab\xd5\xd5\xcb$\xa6JNW\xf3n\xca\xb1\xeb}\xdb\x02\xd2y\x89\xef\xa2\x8b\xeeo\xdc^e\xa5\t3Q\xb5!\xc8\xc6\xab\xed\xd5P\x93\x39q\x97\xd3,\xdd\xaf\xb1\xc6\x9bKi\x98\xae\xaf!\xa0\x8a\x90%\xe0\xf4\x8c\xf2\xc3Od\xb6\xc6\x64\x90\xff\x95\n\xcc\x8c\xf4\x86\x80S\x8dQ\v\xcd\x45O\xcf|\xc6\xdf\b^\xa7\xdfO\xcf\x84\xde\xb8Ms@\x06\xbe\x33\x82\xe8\x41\x1b\x9a\xc3[\xb6\xf3\xfc\x32\x98\xcc\xcc^\xd5\xb7\x86\x0f\xc8Yr\xcb\x9a\xc5<P\xb8%\xb8\x87>I\xd4-/P5\xeb\xb8\x10\xa7\xea\xb1\xe2\fj\x84,\xe2z&\xef~k\x1eGn\x98\xc0?\x92$\xe7\x88\xf9\x18x7\x8aT\xa6+[\xf0\xc7\xe2\x98\xa4\xa6.\xc3jufQ\xe8\r\x90\xfd\xa7\xec\"\xb3}\x9d\f\xfer\x7f\x98\xf6\x86\x30\xd3|\xee\xa5\xc5 \x89y\x04\x8e\xa8\xb6\x94pNu\xe5\xa0\xae\x8c\x7frL\xd5\x9f\xd2V\r\xb2(E\x99\xf8@\xd4?BJ\f\x92#\xe1\x17\xafh\xa6\x0f\x1d\x32\r\xf8\b\x8e\xdcyh\xf0\xfe\v\xda\x94-\xa6\xa7v~\xd6\xca\xec|7ROw\xcf\xa3\xcf\x8a\xfe\x89\xd9>\xbc\xb5\x06\xa0!\x91\x89w\x84\x85\x43*e\xecuM\r\x1cy\x0f\x61\xca>b\xbb\x41\xf9L\\;\xde\x33\x8e\xdfQr\x93\xca\xa6\xc7\x16\xe5\xb3\"\xb6.\xbf\xae\x1d\x91\x1dI\x96\xa3%\xd4\xceo\xf0\xfb\xb7\xf5J$\x03TK\x7f\v\xb4\x31\xb4\x33\xb7@\xf0\xd5L\xee\xe3K\x12\x8c\xc9\xa7\x06\xb1\x02Z\x14o\xe2;h\x9b=\xfc\x83J\xcc\xb5w\xe7\xf0\x1bR\xce`\x89\xe2\x45v\xaavp\xc2\xfd!\x8f\x1dg\x1aL\xe8\x81+.\xa9V\n'\x0f\x81\xba\\O\xfan~3}x\xed\xd2\xe3$\xae$\xb2\x1b\x62q\x0es\xfe\x8a;\x98\r\x82\x8e\x8d\x0f\xb3\xe2\x65\x87\xeb\x36\x91M\x8a\xfb\"z#,\xe1\xb6\x94\xb6\x90\x94\xcc\f}\x02\x36V\xda\x45 \x90H\xdb\xa4\xf5'\xac\"I%\xaa\xd8\xa7y8\x80\xc0\x95\xc7\xd1\\\x17|\xa7\xec\xd2\x63\xc6\xc6U\xfex\x99\x06,nO\xfe\xd1[\x8c/\xa1\x42\x03&Z^\xda\xef\x43\xd2\x0e\xf9_\xdb\x1d\x9c\xd1\xcb\x65\x84&\xed\x91\x8f\x16\xb4\x1c\xc0\xb3\x8dy\xae\x9b\xcb\x36m\xcdg\x1f\x87\x11*|\xb1\x8c\xfb\x06\xab\xd2\xd6*\xe3\x45l\xa5\xc0\x19k\xfc\xc3\xb7T5\xda\xdf\x12\x97\\\xacY\xb4\x42%\xef\x04\xf7L\xdbt\xb9h\x8f\xee\x37\n\xc6!\x86\x0fo\x8e\xab\xd5{8^_}\xb9Z\xcb\xce\xa0V7\x13qK\xba\x43|\xc0\xb7\x7f\x32\xd7\x46'X\xfc\xdb\xb5\x64 ; \x85y\xa8\x9a\"\xaf)\x86\xc5\x9d#\x96R\xca\xc7\x9d\x92&\xe5:`\xd6\xad\x8dZ\xd9)\xbe\xd5\\:w\xda\x34\xe2v\xcb\x98\xa4\xf3\x33\xf1h \x83\x95\v\x8d\x93Y\x02\f\x8f\xe4\xc4\xb0\xe7\x61\r\xf9\x80 X@\xea\xb7\v\x1b\xad\xe3\x30;0\x1f\x30\a\x06\x05+\x0e\x03\x02\x1a\x04\x14-wyy\x90\x41u\xf4J\x7f\xf7\x15\x94(b\xf7i\xd4\x44'\x04\x14+/\xd9$\xc3\x8a\x34\xbbRR{\xf6\x0e{\xfe:fG@I\x02\x02\a\xd0",
+    "0\x82\x03\xd2\x02\x01\x03\x30\x82\x03\x98\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x03\x89\x04\x82\x03\x85\x30\x82\x03\x81\x30\x82\x02w\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x02h0\x82\x02\x64\x02\x01\x00\x30\x82\x02]\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\bAF\"\xac\xe7\xd6~a\x02\x02\b\x00\x80\x82\x02\x30\x9a\x05UZ\xa0\xf6\xd4\x8c^\x1c'\x91\x11\xfd\x1d\xe8\xfd\xae\xf2\xe6\x9f(\xb8\x1e\xfa\xce\x88\xb4#\xd6\xfan\a\xe9\x33\x81p\x1d\xd0^\x94\x04\xf1`\x8e\xbf\xe1\xef\xf4\xd7\xb2/\r\xe9p+\xe8\x62\xfc\xd3*I\xf3\xf1\x06o*\x94\x8c\x42\xff\xc6\x80\xa8j\xbf\xa3\n\xd3\x8eYR\xea`\xe8Zd#\xac\x8d@-\xc9\xfe\v\xf3\x93R\xc3>\xea\x34\x9a\xea\x42j\xe4\t%D]^\xb4;\xfb\xe0\xc2\xdf\xd8\xaf\xae Y\xb0\x8c\xdd\xb3J_\xcal/\xe3\xb4\x99\xc6\x8fu\xc5r1\x0eLF\xe6\xe1\xbf?\xdf\x02}\xde\x35\xad\xd9\x9d\xcbt\xa7\\R;\xc2\x9cv\xbd\xf7\x96\xfc\xc5\x9d\xc7\xa7y0\xa0\x89\xd6\xd3\xa8\xe8\x63\xd2:?\x88\xc1\"\x8c \x9c\xa0#\a\xc3\xe4\f6\x19\xa8\xa3\xc4\xbc\xbc\xd6=\x80\xcbT\x91\xc4\xab\x02\xd2\x43\x30\xe5\x01\xbd%\xcd\xe4)U\x0fn\x83\xb8\xfbp\xf2\x34\x9a\x15\xc6\x16\xdf\x89\xe4\xd4\x83&\bb\x05\xa6\xea\xf3\x63\xc3\xb5ib\xf8`\\(!Q\xa4\x43v\xdd\x41m\xbdm\x8e<cD\xb6\xea:*\x1c\x9dK\x84\xed\xbd.;\x97\x89\xc3\x88\xca_\x84\x0f\xbdP\xeb\x94g\x83\xa7\x83\xdf\xd7\x9d\x81@:{\xcf\x8b\x1d\x19\x9b\xe1N\xb4K\x1d[\x98\xa8\xe3\x89\xed\xf3H\xfc\r8\xd5\x42\x31\xe3y:\xea\xa3KX\xa3u|\xd4\xc4\x38'\x9e\x97N\xc1p\xa8\xee\x85\xe2\xb8SW\x15\x05\xbb\xf1\xb4\xfd\xe8$\x99\x64\xa7\xf3j\xccK\xe9\x8d\x66\x38\x9a\x45\xe2s^f\x18\xd9\x64\x46\xd7\xd1#0\xbe\xa2K\\\x0eL\x8aG\x88\xb4z.\x0f\xb6\xab-V v\xf4\xa1\x37\xb6k\x98*\xb4\xdag\xcbg\\\xc7-A\xf6\x14\rk\x16\x05\xe6\n\xa2\xf7\x03^\xf8\x9c\x85X\xa5\x82\xa4\xaf\xd1\xf0:H\xa1h\x10\xa4\xa5\xc5\x87\xf5\xc3\xf8\x94\x9d\x13\xcb\bB\x14\xb3hh\x18\xec\xa9W\x9c\xeb\xc9\xe9\xaf}\xcc\xb9MX\x8d\xbf\x04\xb7\x1c?\xfa\xd3\xb9\xb9\xad\x0e\xd2_\x8b\x41\xfa\xdc\x85>\n\xbaI\x1b\xe2\f\xb6\x85\x9b$<\xdf&\x9d\x05Pd\x12\x96$\xdbMy\a\xa7\xb2<\xf9\x42\xca\xdag\xc0m\xf2~\xbc\x1e\\+K\xf6\xf4\x35\x82pk\x81\x16\xfc\xf1\xa9_\a,\xe9\x1e?0\x82\x01\x02\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x81\xf4\x04\x81\xf1\x30\x81\xee\x30\x81\xeb\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x81\xb4\x30\x81\xb1\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\bo\xb9\x01\x93l\rM\xe1\x02\x02\b\x00\x04\x81\x90\aBjZLAA8\xe4\x15\xc2\x85N\x88\xc6\xd3o\x9f%\xd8\x66\x86\xf3\x65]QC\xd6\x03\x91L\xeb\xbbu\xce\x8b\xf4GCL\x1aKH\x92\xf4\xaf\n_I\x96\xea\xaf\x31){\xa3\xb5\xd3\xe4g\f \x0eR\x9e\xcf\xcfj-E8Ra\xbf\x10+\xc1\xc5\xde\x04\x1d\nR\x88\a9\xc2\xc1\xd0\x44\x39\x9f\x46\xf2i\xa4\x30[\xe4`hi\xb0\x95x\x05\xef\xe1\x81\xc2\xd2N)R9Q\xfc=(\xe1{Xv\xcf\x35\x33/\xef\x95v\fR\x11i\x17<V6\xc6\xe1\x9c\x1c\xd4#1%0#\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x16\x04\x14?18\xec\xb9\xf1\x45\xe1>\x90q\r\xc1(\xbaNo\xa0\x9c\xed\x30\x31\x30!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14R\x8c?r\x8c\xcf:\xeb\xc8\xff\xc2\x8cHB\xa6\x1c\x42n\x18\x43\x04\b\xea\xec\xdc\xf6\xc4\xdf\xda\xd6\x02\x02\b\x00",
 };
-static const size_t kLen59 = 74392;
+static const size_t kLen59 = 2566;
 
 static const char *kData59[] = {
+    "0\x82\n\x02\x02\x01\x03\x30\x82\t\xbe\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\t\xaf\x04\x82\t\xab\x30\x82\t\xa7\x30\x82\x06\b\x06\t*\x86H\x86\xf7\r\x01\a\x01\xa0\x82\x05\xf9\x04\x82\x05\xf5\x30\x82\x05\xf1\x30\x82\x05\xed\x06\v*\x86H\x86\xf7\r\x01\f\n\x01\x02\xa0\x82\x04\xfe\x30\x82\x04\xfa\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x03\x30\x0e\x04\b\xb7 UZM?\x0e\x89\x02\x02\a\xd0\x04\x82\x04\xd8:\xcc\xd6\xcbMT\xc0\x04V\x10\xccI\xe4\xe0\x10s\xfb\x1a\xdd\x1dOnU\xe3\xa4\xab\xf9&\xaa\x42T\xa0\xd1\xf0\x8d\xbfq}\x18\x00\x17\xb3\xb7\x63P\x8d,\xeb/\xe3\xc3\xbf\x93\xc8\x46H\x99G\xe2;\x8dq\x01_Y[a~\x1f\fn>\xc4t\x99\x98\x30\xff\x37{0\x19\xb5\xfci\x94_yi4\xda\xb5!\xcf\xfer\x87\xe8})~'%\x90\x80\x98\xdd\x8d\xbf\x42\xb0\x10\xd8}m\xfeo\ra\t\xfd\xb2\x9b\xeb\xbf\x1c\xca\x33\xbcN\x19RUS\xb4\xa5\x98l\xa3;\xf8\xa4\x8dy\xcf@\xf2\x89\t<8\xab\xae\xf4\t;\xb6\xcb\xdd\xd7\xad\xe0Zqd\xc9\x0f\x18\xac<\x12\xd4\"T$\x1a\xa5\x35x\x99\tJ\x18\x95#\xb9\xf7\x89?\x13\x43\x1f\x8dvk\x04\xdb\x64\xf4\x8e\xf5P\xa0\xae\x1c\x8c\xc8\xf3\xde\xf3\x11-\xfev\xf0\xac\x46T#\x03I\xfas\xcd\xe0\xa1lfM\x1b\x99W=aa\xeb\x61@\xc7\xd6\x41\xbe\x63!\x1e~\xb5\x0e\x94\x93\x37\x41\xe8\x91\x06\xd7\xa3\x33x\x17\x17Yx\x8f\xaf\xed\xf9\x90\xfb\xb6\xc8\xa9\v\x10\x1a\xf1\xab\x10\x11\xbc\x7f\xa5-4}{\xaf\xc8\xb2\x00k\xd4\xbb%\x9b\xc7\x14\x8bP\n\xd5,\x1f\xa0_\a\x1d^\x1a\xa4K\x85\xb2\xa6\xe2\xdd\xb7\xda\x11%Q\xbfrPS\xa1=\xfa\x1d\x34u\xddz\xe0\x90V\x14\xc3\xe8\v\xea\x32_\x92\xfc.M\x0e\xfe\xba\x1a\x00m\x8fu\xacILy\x03.\xf2\xcc\x8e\x96'<Y(\x7fR\x8d\xc3;$h\xff\xbb\xd0N\xdf\xc4\x91\x32\x14^Cs\xd8Ve\xe1H\x89\xe4\x33\xefKQP\xf2S\xe7\xae}\xb6\x8c\x80\xee\x8d\x9e$\x1a\xdd\x95}\"Xv\xf8\xbb\x63\x36\x17\xdc\xc6>\xb8\xe9\x1f\xd8\xe0\x06\x18\x1b<E\xcb\xe1ZA\xe5\x32\xa3\x85\x1b\xff\xe0^(\xee\xe9\x05\xc7\xc8G\x85\xe8\x13\x7f\x1b\xda\xd7>\x8e\xb8\xa3\x96\x34\x19;\f\x88&8\xe7\x65\xf6\x03O\xc8\x37n/^]\xcd\xa3)7\xe8\x86\x84\x66\x37\x84\xa0IN\x8f;\x1a\x42\x9f\x62\x1f+\x97\xc9\x18!\xd2\xa5\xcd\x8f\xa4\x03\xf8\x82\x1e\xb8>kT)u_\x80\xe6\x8f/e\xb0k\xbb\x18n\r2b\x8c\x97H\xd3\xaa\xf2^\xb8%\xbc\xb5\"J\xac\xcf\xdc\x8bH\xfc\x95\xf2\x17!\x1e\xda\x13\xd3\x1b\xe2\x37\xd5\xbf\x92\xe4\x81\xf5\x98WQ\x14\xda\x80}Jj\xce\x17\xaf\xdb\xc3.\x84;\x1e\x02QJ\xc1%\x8cZ V\xee\xecY\xcf\xd7>_9\x9f\xbfMN\x94\xb1\x1d\x83p\xc0\xab\xff\xfa|.[\xfbW?`\xb8\xf3\x36_\xbfj\x8co\xe0\x34\xe8u&\xc2\x1e\"d\x0e\x43\xc1\x93\xe6\x8a.\xe9\xd9\xe0\x9fVP\x8a\xbdh\xf6WcU\xbb\xe7\xfe\"\xca\xdc\x85\x38\x39\xc8\x66\x02(\x0f\xe0\x1c\xd6\x0f]j\v\xd8\xe5j\xebT\xb2\xe0\x02o\xe2\x42\x89\x66\xc2\xd5\xc6\xe2\xb2\x04m\x8a+H\xc2Q\a\x8e\xf3\x91\v\xb7Un\xbb\xbf\x11Z\xcb,\xb3\x1e\x61\xd3\xdb\x90\xad\xba\x10\x96\xe2\x16\xf4\fG\xbd\x64\x66z\x17\x63\xb9\x02\xcbSz5\x92t\xc3*}\xc5\x11\x18/\xa3\x62,\xc0\x87\xd3\xd3\xba\xcb\xe0\x86\x9bK\xc5Y\x98~2\x96U\xc1=Z\xcd\x90-\xf8\xb7\xa8\xba\xce\x89\x64\xa6\xf3\x1b\x11.\x12\x99M4E\x13\x66\xb7i{\xc5y\xf5k\xc2\x1d\xc8?\t\x18\n\xfc\xf7\xaf\x98\xc2\xc7\xcc\x85)\xc6\"zw\xab\xb5\xac\xf7\x9ep\x8e\x7f<\xf1\xbd\xd9z\x92\x84\xc5\xb8V\xc3\xcb\xf7%\xad\xda\x0e\x1c\xe4hf\x83\x91x\xf1\xe7\x8c\xaa\x45\xb6\x85t\x9b\b\xff\xac\x38U\xa5j\xea.uq\xd3\xa2\xdc\x1c\xc0\xc7\v\xa9\xd5~\xf9\x63\x82\x87\xb7\x81\x01\xb9\x31\xdf\x41\x35\x0e\xe2\x1fH\xbf`\xce\xb0\xb4\x38\xa5\xb4v\xa3\x80\x1f\x93W\xf2\x05\x81\x42\xd1\xaeVm\xc5L\xab\xa6$*\x02;\xb1\xc4u\xcf\x15\x90\xb5\xf2\xe7\x10i\xa0\xe3\xc4\xe6Rc\x14\xb4\x15\x91\x8e\xbaz\xad-\x9b$t61\xca\xcbKZ\xbf\xd3N\xb4\xc1HDt/\x83\xe4\x39=\x90-2\x12\xf7\xfa\xd3\xe3\xdbO\xe6\xe7 ,W\xc0\xf9\x80\xe1\xdc\x1c\xf2\x05T5\xf6\xbd\xfb\xbd\xc5\xb2\x82\x32\x63\x32\xca\xf4\xf7\x14\x92\x87\x8a\x45\x37V\x93\xdaO\x04Y\x03$\x93\x1a\vN\xdbX\xbf\xda*\x0e~\x98l\f\xeb!\xf9\xbf\x9b\x1f\xc0\xef\xd3\xea\xcb\x99^\x14>\x10\xfa\xad\x38\xf7h\x9f\xa3\xcc\xdf\xe5\x31\x91\x98\xdet_{\xce\xe4T\xd9Q\xec\xf5K\x17_\x99L\xf8\x00\xe0\x10\t\ad\xae\x61;`\xa3\x89\x38\xc4\x80\xf2\x1e\x11&xr\x05\x97'\xba\x83\x33\x1b\x14K\xc0\xc8\xb0\xcc\n\x9b>L\xde\x12\a\x11\xd5\xf0\xc0\xddp=\xd8z\xf7\xa2\xf2p\xadT\xcegA\x12)\x1f\xe1I_LwA|t%\x9c\x91\xd1\r\xa5\x9a\xb8VL\x01\xc0wQ\x14\xc8\x92@\x9a\xbd\x7f;\x9b\x17\xbb\x80nPd1\xed\xe2\"\x9f\x96\x8e\xe2NTn65\xfc\xf2\xed\xfcVc\xdb\x89\x19\x99\xf8G\xff\xce\x35\xd2\x86\x63\xbc\xe4\x8c]\x12\x94\x31\x81\xdb\x30\x13\x06\t*\x86H\x86\xf7\r\x01\t\x15\x31\x06\x04\x04\x01\x00\x00\x00\x30W\x06\t*\x86H\x86\xf7\r\x01\t\x14\x31J\x1eH\x00\x65\x00\x65\x00\x36\x00\x64\x00\x38\x00\x38\x00\x30\x00\x35\x00-\x00\x30\x00\x36\x00\x64\x00\x39\x00-\x00\x34\x00\x32\x00\x65\x00\x32\x00-\x00\x38\x00\x62\x00\x36\x00\x38\x00-\x00\x66\x00\x65\x00\x61\x00\x62\x00\x35\x00\x65\x00\x66\x00\x32\x00\x38\x00\x32\x00\x37\x00\x30\x30k\x06\t+\x06\x01\x04\x01\x82\x37\x11\x01\x31^\x1e\\\x00M\x00i\x00\x63\x00r\x00o\x00s\x00o\x00\x66\x00t\x00 \x00\x45\x00n\x00h\x00\x61\x00n\x00\x63\x00\x65\x00\x64\x00 \x00\x43\x00r\x00y\x00p\x00t\x00o\x00g\x00r\x00\x61\x00p\x00h\x00i\x00\x63\x00 \x00P\x00r\x00o\x00v\x00i\x00\x64\x00\x65\x00r\x00 \x00v\x00\x31\x00.\x00\x30\x30\x82\x03\x97\x06\t*\x86H\x86\xf7\r\x01\a\x06\xa0\x82\x03\x88\x30\x82\x03\x84\x02\x01\x00\x30\x82\x03}\x06\t*\x86H\x86\xf7\r\x01\a\x01\x30\x1c\x06\n*\x86H\x86\xf7\r\x01\f\x01\x06\x30\x0e\x04\b\x92\x16mmh\xd3\xb0\xc1\x02\x02\a\xd0\x80\x82\x03P\xeev\xe8`\xbf\xca<-\xe5)\"\xf6\x33\xc3Pj\xdb\xf3X<\xd9|\xd8\xf9\x83\x89\x17\xa8\x1bk\t\xc1\x99I\xb0\x43\x06\xc6\x42K|\x85K\xe6i8\x91\xce=<\x97\xd5\x14O\x15Z\x81Mw@\xe0\xe1\x1ci?\x1d\x65h\xb3\x98\x95\x30l\xb0p\x93\f\xce\xec\xafW\xc6\x9c\x34\xb4+\xaf\xc3^p\x87\x17\xe8\xc9T\x06\xb5\xb7\x83\xff\x46+\xb6jf/m\x0f\x96Sfe\xb8{HU\x83\xd3\xc4\x16\x93\xderY\xf1\x9a\xab\xd5\xd5\xcb$\xa6JNW\xf3n\xca\xb1\xeb}\xdb\x02\xd2y\x89\xef\xa2\x8b\xeeo\xdc^e\xa5\t3Q\xb5!\xc8\xc6\xab\xed\xd5P\x93\x39q\x97\xd3,\xdd\xaf\xb1\xc6\x9bKi\x98\xae\xaf!\xa0\x8a\x90%\xe0\xf4\x8c\xf2\xc3Od\xb6\xc6\x64\x90\xff\x95\n\xcc\x8c\xf4\x86\x80S\x8dQ\v\xcd\x45O\xcf|\xc6\xdf\b^\xa7\xdfO\xcf\x84\xde\xb8Ms@\x06\xbe\x33\x82\xe8\x41\x1b\x9a\xc3[\xb6\xf3\xfc\x32\x98\xcc\xcc^\xd5\xb7\x86\x0f\xc8Yr\xcb\x9a\xc5<P\xb8%\xb8\x87>I\xd4-/P5\xeb\xb8\x10\xa7\xea\xb1\xe2\fj\x84,\xe2z&\xef~k\x1eGn\x98\xc0?\x92$\xe7\x88\xf9\x18x7\x8aT\xa6+[\xf0\xc7\xe2\x98\xa4\xa6.\xc3jufQ\xe8\r\x90\xfd\xa7\xec\"\xb3}\x9d\f\xfer\x7f\x98\xf6\x86\x30\xd3|\xee\xa5\xc5 \x89y\x04\x8e\xa8\xb6\x94pNu\xe5\xa0\xae\x8c\x7frL\xd5\x9f\xd2V\r\xb2(E\x99\xf8@\xd4?BJ\f\x92#\xe1\x17\xafh\xa6\x0f\x1d\x32\r\xf8\b\x8e\xdcyh\xf0\xfe\v\xda\x94-\xa6\xa7v~\xd6\xca\xec|7ROw\xcf\xa3\xcf\x8a\xfe\x89\xd9>\xbc\xb5\x06\xa0!\x91\x89w\x84\x85\x43*e\xecuM\r\x1cy\x0f\x61\xca>b\xbb\x41\xf9L\\;\xde\x33\x8e\xdfQr\x93\xca\xa6\xc7\x16\xe5\xb3\"\xb6.\xbf\xae\x1d\x91\x1dI\x96\xa3%\xd4\xceo\xf0\xfb\xb7\xf5J$\x03TK\x7f\v\xb4\x31\xb4\x33\xb7@\xf0\xd5L\xee\xe3K\x12\x8c\xc9\xa7\x06\xb1\x02Z\x14o\xe2;h\x9b=\xfc\x83J\xcc\xb5w\xe7\xf0\x1bR\xce`\x89\xe2\x45v\xaavp\xc2\xfd!\x8f\x1dg\x1aL\xe8\x81+.\xa9V\n'\x0f\x81\xba\\O\xfan~3}x\xed\xd2\xe3$\xae$\xb2\x1b\x62q\x0es\xfe\x8a;\x98\r\x82\x8e\x8d\x0f\xb3\xe2\x65\x87\xeb\x36\x91M\x8a\xfb\"z#,\xe1\xb6\x94\xb6\x90\x94\xcc\f}\x02\x36V\xda\x45 \x90H\xdb\xa4\xf5'\xac\"I%\xaa\xd8\xa7y8\x80\xc0\x95\xc7\xd1\\\x17|\xa7\xec\xd2\x63\xc6\xc6U\xfex\x99\x06,nO\xfe\xd1[\x8c/\xa1\x42\x03&Z^\xda\xef\x43\xd2\x0e\xf9_\xdb\x1d\x9c\xd1\xcb\x65\x84&\xed\x91\x8f\x16\xb4\x1c\xc0\xb3\x8dy\xae\x9b\xcb\x36m\xcdg\x1f\x87\x11*|\xb1\x8c\xfb\x06\xab\xd2\xd6*\xe3\x45l\xa5\xc0\x19k\xfc\xc3\xb7T5\xda\xdf\x12\x97\\\xacY\xb4\x42%\xef\x04\xf7L\xdbt\xb9h\x8f\xee\x37\n\xc6!\x86\x0fo\x8e\xab\xd5{8^_}\xb9Z\xcb\xce\xa0V7\x13qK\xba\x43|\xc0\xb7\x7f\x32\xd7\x46'X\xfc\xdb\xb5\x64 ; \x85y\xa8\x9a\"\xaf)\x86\xc5\x9d#\x96R\xca\xc7\x9d\x92&\xe5:`\xd6\xad\x8dZ\xd9)\xbe\xd5\\:w\xda\x34\xe2v\xcb\x98\xa4\xf3\x33\xf1h \x83\x95\v\x8d\x93Y\x02\f\x8f\xe4\xc4\xb0\xe7\x61\r\xf9\x80 X@\xea\xb7\v\x1b\xad\xe3\x30;0\x1f\x30\a\x06\x05+\x0e\x03\x02\x1a\x04\x14-wyy\x90\x41u\xf4J\x7f\xf7\x15\x94(b\xf7i\xd4\x44'\x04\x14+/\xd9$\xc3\x8a\x34\xbbRR{\xf6\x0e{\xfe:fG@I\x02\x02\a\xd0",
+};
+static const size_t kLen60 = 74392;
+
+static const char *kData60[] = {
     "# RFC 8439, section 2.5.2.\n\nKey = 85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b\nInput = \"Cryptographic Forum Research Group\"\nMAC = a8061dc1305136c6c22b8baf0c0127a9\n\n\n# RFC 8439, section A.3.\n\nKey = 0000000000000000000000000000000000000000000000000000000000000000\nInput = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nMAC = 00000000000000000000000000000000\n\nKey = 0000000000000000000000000000000036e5f6b5c5e06070f0efca96227a863e\nInput = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f\nMAC = 36e5f6b5c5e06070f0efca96227a863e\n\nKey = 36e5f6b5c5e06070f0efca96227a863e00000000000000000000000000000000\nInput = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f\nMAC = f3477e7cd95417af89a6b8794c310cf0\n\nKey = 1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0\nInput = 2754776173206272696c6c69672c20616e642074686520736c6974687920746f7665730a446964206779726520616e642067696d626c6520696e2074686520776162653a0a416c6c206d696d737920776572652074686520626f726f676f7665732c0a416e6420746865206d6f6d65207261746873206f757467726162652e\nMAC = 4541669a7eaaee61e708dc7cbcc5eb62\n\nKey = 0200000000000000000000000000000000000000000000000000000000000000\nInput = ffffffffffffffffffffffffffffffff\nMAC = 03000000000000000000000000000000\n\nKey = 02000000000000000000000000000000ffffffffffffffffffffffffffffffff\nInput = 02000000000000000000000000000000\nMAC = 03000000000000000000000000000000\n\nKey = 0100000000000000000000000000000000000000000000000000000000000000\nInput = fffffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffff11000000000000000000000000000000\nMAC = 05000000000000000000000000000000\n\nKey = 0100000000000000000000000000000000000000000000000000000000000000\nInput = fffffffffffffffffffffffffffffffffbfefefefefefefefefefefefefefefe01010101010101010101010101010101\nMAC = 00000000000000000000000000000000\n\nKey = 0200000000000000000000000000000000000000000000000000000000000000\nInput = fdffffffffffffffffffffffffffffff\nMAC = faffffffffffffffffffffffffffffff\n\nKey = 0100000000000000040000000000000000000000000000000000000000000000\nInput = e33594d7505e43b900000000000000003394d7505e4379cd01000000000000000000000000000000000000000000000001000000000000000000000000000000\nMAC = 14000000000000005500000000000000\n\nKey = 0100000000000000040000000000000000000000000000000000000000000000\nInput = e33594d7505e43b900000000000000003394d7505e4379cd010000000000000000000000000000000000000000000000\nMAC = 13000000000000000000000000000000\n\n\n# Additional test vectors that are long enough to ensure OpenSSL's SIMD\n# assembly is fully tested.\n\n# Length 2048.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72",
     "c924bba2a8b4e8354188ebfed\nMAC = 69d28f73dd09d39a92aa179da354b7ea\n\n# Length 2049.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc8\nMAC = d6a26654b88572e875d9661c83471c1b\n\n# Length 2050.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe",
     "23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852\nMAC = 9fbbb7f7adcd0cd5b46a4a520b22499a\n\n# Length 2051.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f5\nMAC = eb7cdceb97ade2a07622f8f5a4b1ce15\n\n# Length 2052.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f9",
@@ -2745,9 +2769,9 @@
     "90485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21\nMAC = c6e5d1810fd878ac6b844c66cef36a22\n\n# Length 2063.\nKey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nInput = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21df\nMAC = f6eaae369c3cb5c05748e8d919178e00\n\n# Regression test for https://rt.openssl.org/Ticket/Display.html?id=4439\nKey = 2d773be37adb1e4d683bf0075e79c4ee037918535a7f99ccb7040fb5f5f43aea\nInput = 89dab80b7717c1db5db437860a3f70218e93e1b8f461fb677f16f35f6f87e2a91c99bc3a47ace47640cc95c345be5ecca5a3523c35cc01893af0b64a620334270372ec12482d1b1e363561698a578b359803495bb4e2ef1930b17a5190b580f141300df30adbeca28f6427a8bc1a999fd51c554a017d095d8c3e3127daf9f595\nMAC = c85d15ed44c378d6b00e23064c7bcd51\n\n# Regression tests for https://rt.openssl.org/Ticket/Display.html?id=4483\n\nKey = 7f1b02640000000000000000000000000000000000000000cccccccccccccccc\nInput = cccccccccccccccccccccccccccccccccccccccccccccccccc80ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccceccccccccccccccccccccccccccccccccccccc5cccccccccccccccccccccccccccccccccccccccccce3ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaccccccccccccccccccccce6cccccccccc000000afccccccccccccccccccfffffff5000000000000000000000000000000000000000000000000000000ffffffe70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719205a8521dfc\nMAC = 8559b876eceed66eb37798c0457baff9\n\nKey = e00016000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaa\nInput = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000800264\nMAC = 00bd1258978e205444c9aaaa82006fed\n\nKey = 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c\nInput = 02fc\nMAC = 06120c0c0c0c0c0c0c0c0c0c0c0c0c0c\n\nKey = 00ff000000000000000000000000000000000000001e00000000000000007b7b\nInput = 7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b",
     "7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b007b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff0009000000000000000000000000100000000009000000640000000000000000000000001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff00090000000000000000007a000010000000000900000064000000000000000000000000000000000000000000000000fc\nMAC = 33205bbf9e9f8f7212ab9e2ab9b7e4a5\n",
 };
-static const size_t kLen60 = 90795;
+static const size_t kLen61 = 90795;
 
-static const char *kData60[] = {
+static const char *kData61[] = {
     "# Random test vectors generated from another implementation of SipHash-2-4.\n\nKEY: 5a174c22c487d0c5c1161e570d10d145\nIN:\nHASH: 9f06a76d8ae7ff05\n\nKEY: d56745469ae42734c2ad87e7c13ea101\nIN: 3c\nHASH: 9698cd8e2620362f\n\nKEY: cc7c78ae24ca106c5d771742b530cbce\nIN: 6cfb\nHASH: a94c8f359a6034d0\n\nKEY: c8de6d120462739b29b25913f75f8be4\nIN: 8bff10\nHASH: 5f12329867deb530\n\nKEY: c435d95c06085dc26060e488f0691013\nIN: f575791b\nHASH: 38824fa193583e1c\n\nKEY: 5d5853675bbe37b0034e019c8703bbea\nIN: 20be54d583\nHASH: 5586f5ed0a52d560\n\nKEY: 77fdc2467cb5cfadba4dcb02f08d5de0\nIN: 58ff9d2af71e\nHASH: acc2bf8eb5308b5b\n\nKEY: 3f1abc8a74470e697aade7bb409d8c36\nIN: 2a0d12d99b8c10\nHASH: 2349992cbb601e73\n\nKEY: ad977640b6902db5fb05c35bde85e221\nIN: 336ddbba25fc15fd\nHASH: c7a610c0743b7f8c\n\nKEY: 9eeb5f0ce1545597c93fcd236e022df9\nIN: 123569d0a53d5399cf\nHASH: 7f25736f962974ce\n\nKEY: 56d9ecda6345127adbf79e4ec0871116\nIN: b472f565c1370a620c66\nHASH: 3f3acf72be80cb20\n\nKEY: 4b5a67fad0b4c6dd41656e79e47e4ccc\nIN: 317e7ef64c39cf111212cd\nHASH: 4c8ee337c7103c0b\n\nKEY: e0e04322fb57cf43fb6809a33d392565\nIN: a783aca573cb07e82829eb47\nHASH: 3d5ca090c68d3a94\n\nKEY: 2895c38788e064541584f222900a45fb\nIN: 6381894b7947f3cdb6eca1e8c5\nHASH: 8ee7682323bbf06b\n\nKEY: c3a0b4ea71d4e824459acac0aa2caa9d\nIN: 6a9257065f991f36ba175ec177b8\nHASH: 078b76ac3dc840e2\n\nKEY: 56e7c5dc7ba9c37095117d3b78b6be0c\nIN: d9a8402bc9303b5a67c3aa0f1975ac\nHASH: f5fc32c55915e9ff\n\nKEY: ffcd0ca31dbb4c0a64bce83d4a876e2f\nIN: 4c50fca688dcc34a62bf77554af22fca\nHASH: 9e266efdc2b55efa\n\nKEY: a358acb475fe3a545aba172e6a2e606b\nIN: e2e6007adac976736a222ad2a607d4d15d\nHASH: c4bb7312a7d39486\n\nKEY: cc611d043067a99cb5572bb0121beac8\nIN: 7428cfc5fd76f0ffc59a216b142576d9ee5d\nHASH: 67dc4aa8a52069df\n\nKEY: 19c44128e61c992e625a1187036566b5\nIN: f6b8f9422f6eda5c70999737573142bd0d503f\nHASH: 35d6199bb8b26627\n\nKEY: cc690d64cbbd6766af28d5e8809804e2\nIN: 80b9e15766ecf0fd988658701328a266220528f9\nHASH: 8da47f7d2c8a24b9\n\nKEY: d097c32707d111358a8f6470c4bbd3bb\nIN: 4a174edf086a5406f36aa20f1dc5f854df264ec159\nHASH: 8dab02709978b647\n\nKEY: 79a047071edd76cc634f9510dd0113c7\nIN: 247ba72455b9a97dabab6905b0a1227635f79f3e530e\nHASH: 1364c8043fb9baac\n\nKEY: b3092acdd6023215701aa9c99ae4e218\nIN: ce36b755300273c22805eebdfe7dadb59fff0bf8167fba\nHASH: c8e50f39c0605ecb\n\nKEY: db6c7ce746a0431f8269407f8c35a4cd\nIN: 40dbedc0f4c351a6ffc058a2ff63794419b1c2ecb4759f6d\nHASH: 9f46bd8f53a03217\n\nKEY: 110301071f6676fc2ae41a5cea83b10f\nIN: 7947c7e55c5fe0fd584ade5a30f8af69cfbcc4825ca4e45fd8\nHASH: 7305e77b0e3dd8bb\n\nKEY: 976c2ee47783766ea8235001f65d256b\nIN: 912be0ef8e0e7becfa176ed4006ee8f2e77107f022e42351cc20\nHASH: 2f05ddca521adcf1\n\nKEY: 58b1de6e33ffea228e144b4f25e5762e\nIN: 02e8b89312479f1b0a6da0f7f35e6ccb50ade322e70ba2f5b0a354\nHASH: dd0547e80e8505e1\n\nKEY: bc57f28c8f461d9714b48c087164a695\nIN: 990ceb64628bbafa3c0c4bdabf465a19d075fb66918dd240ebef176f\nHASH: 7ce492853fc22eb8\n\nKEY: 16c2ffc4e03d5f17064f22fe0512eebc\nIN: 42e78f029eaaa1474268d534d1542e6019af7c311b70a3b80d89fc8394\nHASH: 5830bdb3f6cdbf80\n\nKEY: 546cec4ec1ccdd1dec16ffd684fba160\nIN: 36fa97e2d20f91a56389c84d3c2670c25afd2d551de8930c735f30dc0f8e\nHASH: cc29ae6a40051fa9\n\nKEY: dc04255c1214077c60ed57c00719c4ae\nIN: f6eddb62225c75e47636587d992abb31fb1429cf0e4bdf7ca7610833c6c145\nHASH: 8959c817d89057b1\n\nKEY: 66fa7b74c5d112044e6e26a8f056672e\nIN: 9c303c5097358b4671f2b282d2286ccb9925e22717f3e1bb16a2a7f088c89efb\nHASH: ef44eb07b3dabf20\n\nKEY: e68c0b8b0fc194402a074069fa79bcc9\nIN: 68740dd32b54ab57313b7aba7212eeaeedcd00fc34b5a295c3742361acb450c331\nHASH: 31c38d85506f95e2\n\nKEY: 5a9bda075c2c3756bb03637b833a2c7c\nIN: 0a20ae05077a2775accf3e93197c2cbe58ec0c8cb2d666a6d1c5ab8f6a88921b33a6\nHASH: 83ac7417ef2f78cc\n\nKEY: bddb529beb2c89ee5f3e6b91c786f7be\nIN: a963b7e8a6ab9ebce913d39af035540d1172488c29b85217edf02143c23183da52a3ba\nHASH: 87bfacf3844aa239\n\nKEY: 65bf6deca182d55e94ebbf8fe0df1e01\nIN: 7c95a702ffec11b19ddafcb53feb2571214b06219feae9b8a058509fde4b54e1f16cb89b\nHASH: 170b6b574e480859\n\nKEY: 7ef0aa07183687c13f800f268a00ea86\nIN: 8c2b513a5facec6f5a34f49eedcdcda7bccf99fd9de0526ceff7c81ee11797d451d62cb689\nHASH: 5d0f521bc4b1c1e1\n\nKEY: 490cc83d84a0102cd83c11f8123733d2\nIN: 1f7312100fe65f082abecc08f276ff81164b21ad7ea83d7729dfd1ef622b5c39c884b3f82e49\nHASH: 2b72bb41af9f002a\n\nKEY: 81e1981c81e5c3010ca4b048eea1cc72\nIN: 012273854b89fb3c66e4427d460e8493927d71f44ba7ed7dc2b3cd3178faeb6f0471bc31436a85\nHASH: 6d67485ebe1e15ad\n\nKEY: b47f522fa34143dbccffc3b1f4093b09\nIN: ba235ce1ad78f2566f78270021fe9f31417c3f65f1533c43ef71d6d281d17722ae4bc8eb87636c2c\nHASH: 390e3fe50119cac3\n\nKEY: 9a3fedb06d1e550dbbb4c4c6c42c7b58\nIN: 95f641d66e88414ee49060d1b7bbb2d62f326eaf6cc3c77a359ea2dbcb0526f737b4a1797e7026d813\nHASH: a58b6f3f1df212fb\n\nKEY: 9111abb078f38c77eed9ff96e25ec5ea\nIN: e1476ccebc8fd7a5f5d1b944bd488bafa08caa713795f87e0364227b473b1cd5d83d0c72ce4ebab3e187\nHASH: 30527d54ef667563\n\nKEY: 42808b700fca9f85fddfb5d590807f0a\nIN: 5f81bd275320d97416e5e50d5d185d5542a157778b2d05521f27805b925e4f187d06829a2efd407ba11691\nHASH: e58617ceafeab62f\n\nKEY: b609075989500f06abed2bfc45c83d13\nIN: dfedfc41d8a98c617adab43f94b8d55a4fb1c02bd9c4939f8517e7207d3b8227d2bb8af086dc37e2ac24f437\nHASH: 0037588ae129b9e4\n\nKEY: c9afb75085e1759dc2bb6790ae29ff1d\nIN: 01a06ae550215331ad34fc87c2e9597d2a369753009c5a5fa2044481c6126bbbeab1a9f3d49f6198565fc6db9b\nHASH: 236763204e7ce6be\n\nKEY: ca4a9f84ef63e8b62514d34f2d74b4b6\nIN: 5f670e9e199c590700b7a7fd6b777f325ceb90f05b611ab77a970dda67db8636ba82bfc8770f742a22e66d39a59c\nHASH: bb3bd93cf471803a\n\nKEY: bbb3452a0a57a75460a77f238bdde048\nIN: 6279c2ee80f83cfc3074f24e5026a3fdbbc29e95f46a4e2862af2dda8e0c49b896f8186e0a3aa527dc4fad02a7c21b\nHASH: 823931f402c9d3ae\n\nKEY: c1f2268a501653c08ce64a34b1eda186\nIN: 2b55a854ed9125c148e97ed0fd128ab7a48bd0abf150aa86f60292feb3cb02da159698a01adc48bea1bd38a8f0339496\nHASH: 050afb47067c73d4\n\nKEY: b4a12074ce0969ae5de1cbd25e4f6f5d\nIN: a1543098dc8e85c7319269c590513eafae8bc5bec292b7718ea49018e3a0ce80843ce1aa644732eb083cfdb418582a4a7f\nHASH: 7c0fb55d3f5e8363\n\nKEY: 598233eb95280098c909e3dd3f93dcc7\nIN: af6e57e39dbfe09b91e57c212977b9b5ef48d30bf8bc8764e3796b5aa82680fb590d7ec73f4ef2357c34aaf2e12b45dd1f47\nHASH: 78ab42112974448c\n\nKEY: a91a39cfbfd3a01ba163294d96d99477\nIN: 092c683817c7484996b32e6c1fb46f3754b829b1b46120bfe1bb9123d139d46f5565c8dbc11a60273bf6b8e1bc38bc9a6f1995\nHASH: 7fa74c95642f9644\n\nKEY: 0b564ed2eee9e3649ccf53fe50d8b1c6\nIN: 05f42bd7cc89c80fb6eb8d09d4f4968fc47aabc0db6ebdbdf70a416815622d6e92de69cc675671db24d021be0b6c7545aab0becd\nHASH: 708bebc79de07dc6\n\nKEY: bae7c48ecb04834a577ad26c87022cd3\nIN: 9f5af8c66983938b16fe3a2de4d59faef425ca769d3a31c62330aafa1aba57e53bfc3d61357b618f1ae01bba3efecc65a70edcc8b8\nHASH: e9d43d98f790f1e9\n\nKEY: ac86394cf9e8668900fc3e731e5573d2\nIN: b832f6c610c6f3bc5ae50b656709f26777a9cfa6266faa80d788376d7a4b0af3c84e2f14a4b538bcde23e45f0554e7a333a95224b474\nHASH: 689de641675e6b3c\n\nKEY: dd60e6ec34522428fe517767fd94a5cf\nIN: 3ed67357449c3b24b6d8a381d92a443d333532aafd1c90411a29b80ffb6566cb13762c5c8c8ef87741023ffafe8ca473f77934acbd25c6\nHASH: 30ff83beb6a4eb30\n\nKEY: 9f5c48c10551808854f2c5965f2b8402\nIN: 9b160f17162a71a9aebbca3a32939cf09ea4aaaeb98c75aa5fe0c15a8a94cdbfb7716ea37b7f0aaa9e058d93ef5800e9ec863a5df85d51ff\nHASH: 987b4b16546765bc\n\nKEY: df955ec1e84432fec581bc446b10ba8a\nIN: 44ae821f9ddb1e1bfbec2259fad2042558fb216dee7c56af074d24b94a61074f37a011a46fc7542907af3a5c03ad64b34f1940219e3c129b8f\nHASH: ed3e957005bf498a\n\nKEY: 5a901ece66329a9488bd17ad3f350ec9\nIN: 3e404145993bf0c296c97729f9f2e6eb3bf22010fe642312c8136c0da176ed4c314eaee878047cfe0705a835a8a22e7d2b29c9328370032d4824\nHASH: b5e479243d036ead\n\nKEY: 6835a439c331ce630ef771f866f045a5\nIN: 5f2d95f898406fce05b36d1cfe21c57541bcbbb9293c3dd56e6fa8519e1ee76b40c2db8097ed008e84dd47b8aaae3c2b33037f9f7af38f3f41c9c4\nHASH: 7ce56ef8daac6676\n\nKEY: 84b224c92018a348dba300d4e17cd139\nIN: 9c520b111bb008086c5815f450a6b7b6daec0925c4b0c8cf99f9f9ddb6198000a379fcb62527d7c361ccbda2597deecdd055850abc6a17251c08577b\nHASH: 3e5ab339d1f90e72\n\nKEY: b3af10ef15d3e728b36171cd7e0bfc54\nIN: b0c30990fa7d8451403c84c7cbd650847dab3e087fdf2985eda79c48deda583bc9c4957e24b0502ab6004a85bbaaba74efe9bdf2377043d008ae14e169\nHASH: 0821d1f9e241ca1d\n\nKEY: 3f0dfe713054af061ab05dec911b8895\nIN: 0d3ee8fcd134e9814641fdff20b22ddf17ffcf3f23af7327e203cf1971329f92e99622d1b8329f9a8f9244c5efbd4ce3e07f1b9779f1d84927e8fb16c030\nHASH: 0a5fe88",
     "9f9475d8e\n\nKEY: 62663e655ae3a122b869b11182f16a11\nIN: 82696187d910792ac92d50900677a1a0238d91cee3cd72ad949b50c53a0613add3bf0ab02c78e87f96847d5bda2bb31e4e19d92c933b1637aa00be18eec696\nHASH: a2c05353cb689240\n\nKEY: 1d3f1977fc1aaa27f459cb4de22a736e\nIN: 935e1cd9a08b1d0b57dbbc640915c6de3eec62f481cc64a27cda6a08db9e7dfa58d13dedad1ce2abfa967f059185b41f2b72114a4ba51a9a5d279f067ed9fba6\nHASH: f64a0fe86b7dffa1\n\nKEY: 96bf9034f02772a5150b0f2dfdd49c88\nIN: 2315e242205287d3e9dc5cbe317ddf3f286ad02fc4385c82bfdbd43ff6d5f425347e229faf0521acf9bbf3eb6f3abc2029c7af2506972444425e1b92aa1d6601ea\nHASH: 2ceb3eded2754829\n\nKEY: 5e2d0b77b3478b1d041b9b6784bd4e0c\nIN: f10b956532deea1838bebcb192cf256817525cb95242e5295830db8cee586e5cf3fdd0d9a5277d5a50a8dc6e4878d2cc6a549eb52bdc5beeb89ce870e65a87702eee\nHASH: 8fc78a2ca1ba1f7f\n\nKEY: b2c34273ff91123facb2e3f4ac03952d\nIN: a43e581d35caf54ece5b668df2f4a77e29bee3e1fe26add027b07e814991bc538da16f1649886e42be0a5be8b221ad155eb7489e81330ee91b194904086f91e9e71a78\nHASH: 36ea4accc3181075\n\nKEY: 828238257380186239aad56fda379060\nIN: 46f7fce30d03f04bee6559ace020e6ce72379001c20e5fb30bc7a500ce91262e0d7af70d8be30c61fee623e67a5e46db55d1dec64bd4be6af45bfff65050800194ba175c\nHASH: 7a1a36cfdd778b12\n\nKEY: aa751839cf5a43613a3b686bb22f9e02\nIN: e0848a835142871c489c772d01ca0115f226d39f94efde92178a38f87fbb371d4791f13954feb4f493bc0707c4dca732e24642cc6effa26da527ee7472c1c34c4b0b4834a2\nHASH: e144d10851a7e0da\n\nKEY: e3d027fcfc629cc735fdb70912799363\nIN: 08a51183fb0396a1633bf7a2c6ce4abd1e44d9153d7bc2a269f478269181df5ff29346366cea689a8301efca949693e1836d27d9cff181099e878b2bd53da75866f4abe0b64f\nHASH: 4a935a091f380fbe\n\nKEY: c9852a9cdd185cb16fd88ef793bdf598\nIN: 49cb5ab1bbb45afb32878b059685a40016f3add53623e23859c9384641c537e13aff631d814deed607bb6abc375c855f98744e455e937ee1c9e478c4878854166c30d0b686328b\nHASH: f2df3a49621a40ad\n\nKEY: a713bd5752e392d99947a0a0fef98da9\nIN: 15064ba012aa36887257f3f84261ac66134c36dc02d4d8688e2fb10ea36974c4fd3963144f8ff01e3132d2c69e5b57cdba82f98453238a51653facc718467ca781e73044aa368879\nHASH: f187bacabe914603\n\nKEY: 5292ed7c7317c2aa71831d03b905d0c2\nIN: e3eea270140e52ee204c78b9a4d86c0be9c74127acb4f3957b1fd380417dbd57f91fe69509126e531a62144cf7ec147b36aee7931b883a028f93993bb8068552e1ac9736775038c8cf\nHASH: a9a8c0bc50104e8d\n\nKEY: c3117a19ed788199add874b10f62190c\nIN: 112a91dad631502ec6d9a569d14cc009779bcf2ffa489ea4df85c275ec37148b25a133dcb6d4c3dbea8ed4375e7cf26885b991f96ad984880bff76a62568fc115d3762dccb4522f1a27c\nHASH: 4fc2a87b168477a8\n\nKEY: 45862eabc24e2b62acfd8833595b329c\nIN: 921a7d233720992b5d767b61f86b4d6857caa99d39e18656de8c5571f2a7295af7e0d703467e4c0b83f6f7079c63b55657776d3020424443756388ea217c2407284fc8657d3935a9b34573\nHASH: c1cc6da484446857\n\nKEY: d185262e194717d27be06c1297b8f27b\nIN: 7804f030a6d67847f53cc93052953516f66c915affba735df79df7da6d70bd511e4edb33fd712b58bfdff47d98b8acfaff064bd4e1f64828d61a82a5e72ad97573f4631fcec0ebfcbd16e67e\nHASH: f9d37ca5a7750584\n\nKEY: 53ea30bf7b1aeba84ae8e0b434a8657e\nIN: 65ffe0a087ce955a6170462711dd53fc057aeee9fb5e7a8cd866527fdce70aa4b8acc65ee4a366cdae649cb5342120cd7cbb9d536b1697cc45326a44494aedefb4f7d96fa5d0ddd104bdc6a84c\nHASH: 965ba9830abddee5\n\nKEY: 79bad8d7ff51922ef1d540b7d8d7663d\nIN: ed536d02d21049bfe6c1428ebb6a8faa481321a4977a685409b0fb2ca39d72c92d3db0ac406d56e2f15d6b6b62c73246807215bae613d283b8a35678df263fdbb6d3172c16909deb8e97d78694f3\nHASH: 4841b9dd5502f605\n\nKEY: 104104e76e645e83c7b40c6674906d55\nIN: a7546cb4e6b1b1c112aa28563028e910915c6b44b668bb57bd6623b941af4c3e22c7cf6eff2f6c474657fc5ee293db60a84944bafed2acabdbe6a6e7f0804ebed61786c2cf29cdfb0c62e8d41df81b\nHASH: d21db84542deb383\n\nKEY: 8d3c174a295a9d859e009f73e113403e\nIN: 16ed05c2b7b0c54df274bb67804c5d7671b915d899e15b2e166c3f1e4d9e990ab5be59c5e9fd70e1967a8021797ed8b2e40182f860dab2d0208dcc7c9fdb7bdcaabbc81f5b9b8751c558c5418dd654b2\nHASH: 0c4d09f8827c0c37\n\nKEY: 55bc19da3d5e60a3308379d5900165d9\nIN: d18ece72cd2f5fafe52fd55def2e6af0370e420d7aff7968f9cb5efc44ebb161a6bdd22132aad0aa9685e9168ebb9578209e51865625a4cc86c8f7898ad629b64e400a7d4687a5c3c000ad724a281440f2\nHASH: 7c47369a6d8387ff\n\nKEY: 58a3165308ef3c5e2a7c05070085455e\nIN: d9382554d5b633afa16065e6dbc0d472ee26629e6217a293b63af73cbd4a5dc3cf61ef7ebd5b6900a34bf4ade833c0dab9afe9d2d97369bf2814d03349d6e917adb5e0e1388772fad1a4baf64d7836fe3ffc\nHASH: 2ba3e3082bdd312b\n\nKEY: b636290e491b0ac22476c91c958ab313\nIN: 3d27f5c20db62e3abe1068c018fe8e09e4823b8c1209b74a50dbc19302e190350dba1c5ad616007c72be04bc21d7ef0a82804f266ba95fb3047a6a05de3f0d7ca3cc7c4633a02dda4f367051685535d8e1a155\nHASH: d14da7a2dc3b015c\n\nKEY: 667094c06354337178e646e23e453403\nIN: 215f856c43336295b5e4d625d8cf5b37c4a5b07a39eff2b42427d5df683982ae78ec85ba085740a28446c7928bce24be1b66a087898634a3f6260a3926c9a8f953e235e469c4de23fd32dde181168525b716a2cb\nHASH: 2f7cb69c5e4f942d\n\nKEY: 52eebf5170c603985982122bd8eeb1d6\nIN: da1ac8ccb4c66979633092524e42ca05df667ecc3921849a24c8fbf6aee70a01504ee2a80a000ffbc7b7629843f15270982a59ff9f3f081963a109ae8eee0a1d59baac5207f44071e51c64535b6920bc07bbc9048b\nHASH: d3a5fe4ac656bef1\n\nKEY: 1c1515cae3eba8cc9ed94c10f8a1c211\nIN: 4348d387039f7fe59a1d94a9e6d894241d62eb3ee91c19ebb09064792abb126710a619073fd293b59fecae7d90655d651e542be56a01ae5d419f14b1cee06cd90ee68e0106cd48130dd6e0d73db8fedbad3b00ada87e\nHASH: 57a4daa6abfb5a2d\n\nKEY: 8a8680122ba96ad89992741a8802f79e\nIN: 6ae10dfa31e5d06aeed3bf640591b9810245ccc175a8ff9f36893ad6e10c6dd9347d001f37c41123e4ea16b86b08aa3498c75bf5b8702228fb654595fb930cea2bb9ec97ffe1fba10fdbb7e8b16a2495df30abdfe1fc4f\nHASH: fc353ccf54b8c294\n\nKEY: 40d3e4941056b2585e1ed3bbd3196b24\nIN: e1764c110b024e2c406a18d6a6cb1b2d8dc05f8cbf635d9c6b59f8c54f7cfa1c9022f719d28979dfd75f6a221687690a046404fb1204cb27ab6502f6f24ac6d9c272852acfccb2d51948ddb427950c95ae4045699ec002c1\nHASH: 47108a5f3f664b98\n\nKEY: aa377b72cf2c282946fb87e6f3f16fbe\nIN: 4bf7833eb1e828df6fc190ecb568e3e175307408c4f851532afe731986d05c2e0a6d21c40b0228af69a0cf4f30293ba119462f3f95200386c70a4c49ad7251bc797be0b504efd50c98c3099b1119772deb764ba799bed28d35\nHASH: 6afdff80d074b585\n\nKEY: 304b7a8d2825ab0b4c78a82b202b1942\nIN: 43094418f2f65b85acacf5b3190711332fd3fa7c1e471a49a7d5134ab7f22def6fa973cb135a0add46fa482e7e29976abff74c3bc33af797b46540c85eecca45b848b55d3e412970c8937fb97d2b61af68ff3f2876bf8cb72dc3\nHASH: 8f89c9b9a3b9bf62\n\nKEY: 1b54ae53fbea3567a9678350ae934303\nIN: 8d02b02800d9605227fa73cc920962339645c72b560ba8c266b0b9e94eb8be0c9748718ba9cc48f1afd12e8b458d745596b763c7e65cb8a0fcc3d937c56e04a6873ceeefd3a77f3c545eb957a9a7bfbefabd47dca867ea92203c9a\nHASH: 86f09b1edb5f7934\n\nKEY: ada9526398c0ffe64b200ec1823a0d16\nIN: f6fcdf72c13acae3886dbf6a842806fc9ad021d0329e595748a8cf82f375fd357e1cc37a7d995d869373cad1dd8ecb8dbf0e5333767470378fd7e5b0d1fefedc18fcf045cfac7d883e67a8a32efbccc1a87a8e089f34186f7ea4ac41\nHASH: 64e098ae04f9e06b\n\nKEY: 30f08a4322a8c71e1e1a6353b371fd4d\nIN: 80df14c6bb51846621cd95b57c02e34afe6a96eeba8bc29002b2514f26c3ce53dc81330ebdfe8bce32d4e789f5bc354b03b4d10a64a10248dd1626726ff607529386f7becf9d716664bed65656629cef7fc7482e9046af09aa7ed60072\nHASH: 746b10b00aafaf2c\n\nKEY: 9bfa27a589f425dd70390c6ca1e1760b\nIN: 79fc7caea4cf78001a8d601de3438584517972e81d55c8e00b5c8ffd1e1aa5896058a56e636a4e66842d31f5287e01587601a9f79488db6f28f0a5644b34de163831cf462493ec579ee0c7631adda09f5e135cd70e6a4504e52823c1cbc5\nHASH: 1899998766305ccb\n\nKEY: fab33b56c2b97f9899438d8c4448a721\nIN: fb7e625072c6dedcf31d0fbdaaac81585465f6227d1a37d60befeb9662823d2bfb70f0dca67af4c1c60f72a524fef0c243a758f8b2883f17f2b113277fd71d28378c027cc9aa8c79d5dadcd65c2ff275f29a428437f424ab2171c33f819df4\nHASH: 208be5482e6ebba2\n\nKEY: 6ede0e899a0dacffa8c8ae3cf7552310\nIN: 9865e6577b8811c937447194caf30ca9db318f3949a0a095a148fa0fe0fe7a0ef4efd7c04c7f0ac13206841ab8b30b6b1a55b1555da37a40d5abf1543d59f1331309c1ce5f2adb39259c152628dfbe10c0c5e81ab172c025f9b84abc2d996834\nHASH: e46838d2cbfe6c33\n\nKEY: 2f0b8714a8f0454f62db8dc4fa506a6b\nIN: 6c45eb8e88bf9e63db9d1558e381f4a6f831727d866daaff9d402ba1c3ec6911aa4c62dff1bfac2fb00a50be2c2d945b4c1cd10d1ab0d96d201a5e38d80a5ac2cbee6b2945091e91aa40ccff6f37656392758bbb7da5ce2ef3c933b1bf83f82201\nHASH: 433657c53e5fa081\n\nKEY: 85cf9b7e4bd9af87f8fff9d854fb894a\nIN: 0e808570f9bfa7fde488e3fedfd61905b232a2e6c512ff4659b6b03722d4d1a8ab0b757de0eb114c52620054364d51d6087417f2ecc73bfc78caa8dc5c3063722b8c7387f5cf1eea7369baf108092b1736f34f3c85a1a64caaf188753cc348ac09",
     "34\nHASH: 25272780593c358a\n\nKEY: 903764f0b9bcab23a0d1e7b0d8248711\nIN: e63b264edf7a3ab19e8f38ae22fb9e00ed7c80d25e3a9d76def3c3cc7975ed5a19aeb552a559da1cc6d6f4d7ad5ade44bd7bb57ad1910a469fc7082267ce9644e9d4e24f1ce5afe6cb3886172485df77b3e47dce36e549c62129788648c3738f836caf\nHASH: e995824b960f3012\n\nKEY: 902dea339b29a5a4c54c71ac3486b509\nIN: e33910d372dedb9a154cd8b1ffd4d98c58c4b8c93b5d7ff59a87a40730547ffb145a820aea56bca4f7c043c40aa2f5e0099b9a91683d2d2927febca53c727ecfd8dca77830012c0d33135a2d1a5665c013c4126acec9073cee84f429c2a1d57abff643aa\nHASH: 7a6d533f1d13f598\n\nKEY: d760372d5a2224bdd096ca9c317b315d\nIN: 868257422e5898c7de261682a088bf97a19bddba87650eaef967e4085d5145787dd8a2236859c67b1d96e64a81934210b63ee44adeb5cedae03cf3598496f7b77caa7f2a2f123778e3720229ee7eeef87837a0d5de7ced3baf40114d663bc0e576ce6cec70\nHASH: 05eeed619f335b0b\n\nKEY: d443db5067af5681f8b61a489400d3b3\nIN: 2f69ba36de9d7f2489ad092263f06e04b87179dbbdc3725a8478abf6930f19ebfd1a23823d41f851618f6d533ca56273e602918c27926cd77e7380de5af322bfa2704ec669ef402971bf606da799b85c8d51ea8e2f8b8df3e9e4ecd9cb03f9c1bc387fb69a02\nHASH: 3b54dfef0537f65a\n\nKEY: ff85c309dd953710c4c450015a92db7d\nIN: 3b4cc08fb998a83c0bcfda112957646e708a5e7f457c33a4e31fcfeba9fb5bc37be521bf351eb5ac1bf11144c3fd4837cf9d9728b02b75c51fef0342140e3a0d199fe0a67710a3a7131c6d3c33e0ca00259cab1b7cd1d6de7ef81e97dee7ecaba9e2073c08096f\nHASH: 0880d53fcd40525d\n\nKEY: 50703fdb1e055a0f72353a13de243741\nIN: e94047f4276abc898fa1e268b53ba5effecad744a315d93f1218a47725ac6512bbf0e418681cb15e6a98c3a82bb3fff9f64583ba39268a70a45d91f432baabf3f38335b1e9f52a4141bfaa1c55570ab0ecdfccd5d7cee5bbf692277849891625deb64a8850a477bc\nHASH: 758c1f2f92b68e49\n\nKEY: 2b022fdf4bb13146ba014e1f2abd73d3\nIN: af723b77807c45b4aaea43e9d79a9149fcd1fdc59849b1bffa88abf27c6a779fd8172f325909ae43e49c2a44d3991350a377d58643e5f6ca9d8743c7842d58cb8706814d783e2c7855b8d63e55164cbc1fd7a13bb963d6c5bf4be737a0159c1347a72b88c0c5115a4f\nHASH: 2275a762396e6942\n\nKEY: d6c230457b3494e373c113c4fbfc8fef\nIN: 7820e1b5f75780ae7e6360c6708ec8bb5f82f948e656deb214a29d7887162c67aa1dc547b9b1b878f870cb44b22c61f804c6a9bfefd38588253360532a558c4176c98b63872df3741a718d8487e9bf17d5da3ca9145cb76a9ace837fc9b1f3065b8a777e10fa95dcfbb3\nHASH: 53b8f6e69f5a89d7\n\nKEY: 17f7716d7d49fbabdf1583287dda7802\nIN: 96ab47e1979e30b418b98f8b0f86ee5f5a773b3ab1d062274a4335f2f8cec6a0586aeaae7dc4d0da82e52c3b4b670b0ccd724b0100af58ddc74899995bf000fc626490b19b8bbf4f6352879a0530e97f9bd2418104a1a27e7252df3a6b996b27f54503ef8a718a8123d580\nHASH: 8aedf4fc510a8fe7\n\nKEY: b12168e2e46319863bc595aa421cb4ba\nIN: 0ce0a170319192d56484fc847a8285abe28b3ba3f8aef58702df5bf50e4d0ad2320946d8256dbf2338c8c0a6a1da48496adf9941a4d38d74e0c8aa52dbb5c757e28fe3756421964a3e4eeb9fdecf2529d70216b00515d5869087b611ed0ca1607a650ed6a3707ec6bdfa4d5b\nHASH: 4d85e666f836edcd\n\nKEY: b05bd753656eae367d8f37b4907e4fa7\nIN: fa2a52f77554506d25e8847bfe613139565cedbce07110a7a5af53d024204af9e0bb08c8266616dfc1e21bd5c651de626e1303b08c0c90ab709613caf2713848ff1ba3310852a575d07e12c7691cb081157147a413e80d53a55248240eb5dc566b8dd67d616c5d4dd8199d5d69\nHASH: 885116def6316c20\n\nKEY: 0bb368a25169217504ce1bbce5820394\nIN: 34b4df9ec90072e91548fb40a35128349986b7e50e425d894664a270f919456abc031284b29b6bebd734e53d5241919a8dccb05c38c633fcbad53979d92eb7cfe111584155a4c352f06c29242178ed4d904ed739a04d4ebedd27b7043d79afa9b740df4ad58c5640da67eb121997\nHASH: fd965ec9c1ef4449\n\nKEY: fdaec5633f8d54859574792bcda87468\nIN: ed96b9cd567f55d1d9e087bd63abccd07baaacca8a6d375d2576f00b1e09b5d920200a74cb12e8721e550c80b8c61ac7a8e733e1a14ad0311c30afc83f5aa7a8cd9fca47aafa84babbef5f93a86eacb5d50f696b7a60f0ac48f9b57dcab2168ce26f6390ce3c091a947397db050ce5\nHASH: e92615340f232b12\n\nKEY: d529ce056cb054580b538c81752d63b5\nIN: 75677757aa8eec8e44411d238aac77fbf1158c1c9c3174b78eab4a70034c325e52cd1a275fc0a24c432f82a10b5920a922981dac43571500263c0bbfb95d08bf20acb526bc6a180e6519499cd571414f7bf69d704b476d62083d53049674c46fb616b028bd269e1b822daae40ae4ec31\nHASH: 9d6ee722d9af0ac1\n\nKEY: 28b413218335bcc2f9031dc3554b0585\nIN: e4ac05d0860d28f45b7dde35028dfa67c25c8364545bf27a016228c4f1b5cbdacc418806d229d1fd2d30570fdb1304e38c7443c02d2e55ddd20718dd09d0b3a667df71c2040f079c9798a7f5ca7b09186df6c44edf4740433ec17873180038f7c5e0d4220d3755e264b0543ad5a5c1d537\nHASH: 7d6d8be4026abd19\n\nKEY: ab31c8820d2d02f63dc3ac5acac3828b\nIN: dae9931233787d476b472cb8e7ca4f86c2f8b9cdc38f49a50857f99e4e64b89d451e1bc8e5afacae36579d51b8bf67a4be36a65f9b464a150c1fc012c115bec08e45bea214b80ad39e1a705cb9b0b759901133d6619812ded8abf7848a67758f483aacd11297315dc190746a44e9ed56708b\nHASH: c9cd54ada0139758\n\nKEY: 145d3281341d26c75cbffbaab06d783a\nIN: 9859eb836c49cb41beb29eb493988b459f5d0b22a4dac9e64c34f93a71a700612cd568f76b84cf71966edfebaf6b27ef52524208e4905b83f8d52e879618180101c1ea0e326a44bb4d59539f779a0157af835c5bd7009882f16bb2aa2c87d49b6db49e996390a3ace578794c4d0f1802dc0a82\nHASH: 219b0dfe6c21ff2a\n\nKEY: db21409aca53c06e34752eaf651ae7ec\nIN: 962ec5dbe61976d91eca580b50d3b21c478bb8139da94be0a90e68f89b26b8b28d3484cb938791cf729a269c54af470e528a72ac9122ea10c08e836f8f32f1c1bbcf10716ef243d2abbe31bbf52dfd6c6884b81d6c48f18f087842b055432e5f67de978a2e7bdcd645dec43feb33f2be7fc8bb5d\nHASH: b31faaa12c80d2b3\n\nKEY: 0a92a6dce6418f53cd3823b9a40c5183\nIN: d1f4d53bd0409a3127ef19482d47964197bc061bc779b32ca5ca6f546c18180dfabd32b5a8519f868ac3ab67cd72c3bfea3ad96f5e40fc09a64046ff818928ef87ed043d0a0994c1adb8b0bdf446188b98b20dc65ada689654c5fcf8fe26d66baba8c02d8b39ee2be9217c09a62a4fce8236eda6f7\nHASH: 3e9be4b24cd3f47f\n\nKEY: 868dfe7c81ff02bded7c42a242d4c1bd\nIN: dea44a7466a4910b89fe6abcd824e65603a17ac436890fecbf4f6bc6809be8b13c0a6d593840d48ac59de059787dab1c1ca09a6834114cbf7ff2686a71ec12921aff5e13e9cd80c77ba7adbd361e72429c2b46eccbe27b25068cf457f865bd0149da14383317bcf8fbf949e36eabc7f8dde08c5483a4\nHASH: a0b3afbcb9412ad0\n\nKEY: bc662a2870b8baf74a1153e5d24b4832\nIN: 503401e821133e2ec69942d28503993e0337ac43502466f788fde4821e5bb2be6b0aa80a6886eb10dceec3225762a1357992b740d5ada6f6acb26761c57532599c66c9b55812ced61bc0293781f600fa1b2d211a7556702f41203b7824654207894feb9e2f744e03f5d79682ba4570756050e42eecb3e0\nHASH: 285affa883d1597e\n\nKEY: a51217e323aaa13dc0debaa2d26a7141\nIN: 52c40d6b8dfd5fc99158481dd889643452c533643534298382d2f3d159a7c0f019cb614d8773299451ff87520d9680e5f283e9e9a2fe9a8a7b5e4bda6b94e578b97948eb9bd868ac3c33ba79df325c141eb83ad6be7c1b5c9001d59f88a4bb2208ac62dace5922b6df16f09092b48d432bcdd79b4eb484cc\nHASH: 5aae64a7fcaf3072\n\nKEY: 89c8b8541be48278ee4cafed6616a581\nIN: 86a7c752d913e379429724ff0358994fb8ccc6605573437ed5742fd1b2934c6943259c2eefc5000f5292901a154e856df3c8b7fdf370bc72ffae5957f104fb3b07ed448def575680bc637e3804ce9cca9ce1d85fb79b33e8e4c45f1f974d0613d40c63734b9c927fd0e6e16bb4d288204bb759b199269fa7cf\nHASH: 339b0843b05f2652\n\nKEY: e8b664ce32d35f060e5a015caa287b7f\nIN: c9d496f2e1c2141154bfeb0c4a4347fa7fa002ab2573c634b2c2a376fd270c7d45d2fd6078e4d997aed34bd4dbfb308e2c1a14d07f58e1363c3fc4bf32adf4af4a6d1bcb79e4c5c3db2ed2c68fd2229b6b5fc831d7a2cce989d2ef8dce13f9e076aeabb5a30c7ae72f4e98874f885cdb52518e71a020e0bfb7c9\nHASH: 254a78254aa531f7\n\nKEY: 1ce06b6d7f0c15734448e53a4fa52fb3\nIN: fda649ace37b9fe4f4d572d8b1b74e28ba13db46f6b0f42ba9ac940d379d6d50623fc1ef7545763651818347ce38a3d86828148b14ef090dea626c5c3d1379341704f719ffbb234e423b0024ee635ccd2ee50c501d8689f84c929d689745a05bba54f99a23fb248366ab05e31bfbc18be87110d419ac43834476f2\nHASH: e5d2f7f9315945d9\n\nKEY: 84c2f71ddfa145332dabe73460c7e03d\nIN: a8a162a8b39975a998568ede08dac2c98a7da7021711e159356c13cd39f5080fbfe7f9f2ffd75174ed6bcd82fe0cb158a83d10bd64639f0c6a10335635c4aab34bc0986b898b9b4dbc013fa456a34374aee1a0d437f1de697f5fd2b87c9ad39017434d66761c0f26e81e9c99a9dd57f390f2488ebbfe7d1666cfda65\nHASH: 7c416c3bb889ff8b\n\nKEY: 63ab163cdeda549ba268896b9a677d89\nIN: 64be9cb0aadb6544d4401ba45a3d2b7d766d7d67e09bb2f141e743fa72b8dd14d7427fa2ec37ca6dc5c32861962c7744b1afeea8f28f878420cf67268281ab9ad6dcf0aacdbb52a6983cb91ebfafd294aefce90c6f3628376d7afaf4fd5818602328e215cf1aa3c9510ce53f42dc04288accde985e90224260e318d589\nHASH: 21cb18940175042b\n\nKEY: 2f8057e7a18f356d187ac98e43127515\nIN: f5c76f7b6d6cf30342c1f4673ac063091c9c02862238549255bfc2530f743c69cf4943a9d4035fa1912826673b3c9892a489e0afc011abc45bb5a251f2c80ec97962f366376841939e9997637ee1a2dc0655e9e8a1d262b046cc4c0eccb981ffb46d494d5537cdb202b840601380212f67e728cf9c3867cbc53c0a825f61\nHASH: 843747a",
@@ -2761,243 +2785,318 @@
     "739b90eb2\n\nKEY: a96ec37c773d908b5cc732eabb877b24\nIN: 6baf8f4a20f45bf086c0003c0c6e3837cbdbee6f861d27417547d06e21feb53703fa0f896dde73cb97671e4af7b27fb175d802bf3d941e13172ef158aa6f19e27a504e46c1f1b1dac741bc3ce66b73f46941821561be24448e37a64af54c9beb16da91ee8705d13b2882b9c80fdbe249e1d3b6e5c671ee524d76f543dac473bf83cddcd95c07e82d70ed4f0d86615e6d3776e6db7f740ff7db55a949193734b2b9caa48dfafd8bb40bd8cf2eac7bb6462e92f2a0fc101c7b1fef491f6a16c1c555df9a57a1f7a8e70eeceee14bc6e81882a8fecc48ff9b171b9e8915882f281925282a479b8239bfb48d8cdcc56c22294210a484702c5a8e4d4fdee2f6223e\nHASH: d10db578e9b44fc3\n\nKEY: d5f074017db58f6e68d210b58e091d7b\nIN: 319a1100ad4e268dcc7f3ce71fac847336fbedb9046c1b1b433c373385326fcde6824b3b1ff34f86a0a27b9216afe3145945eb5f7aa37875fac08cc62abf01e2591f8d8109f102214457193412c58a393c4819812ec9fc2079df042a3f57d172d76a8f2709b942e79b3ef839f2f51dab93d225e6eaef30b2a67324481d60a9c5a215ada44eca05470337379dd01eb0dea2cd14bcfd0991d0bb11a6b0fce97b4e51492fa665ee7e29cbba50a5ce0d50c663b16ec8260edce17d548c6d8566cc76ea7270e406f9c888849d15197b37d30c64eac4eb90f3101ef65b3c1493370f8758e7d954b41a543e520394f2da5229efd6f06ca947bfff71b11425a67229120f\nHASH: 1b460b968867e42d\n\nKEY: 338962444ff46d8d1c4ef2d14849202c\nIN: bdfc2290fb71a50aa63595c3f11ffc426539678601b31bae30b1771435e3199668980adb627c738ea28ba458c0179e48a802d81afe0b2d09b5c3efb06808a22d73173049781c0822d780e360e442619dd82cfca21291eb0b793eaef44202b7a5e6c30505ce4e026bbf724ce76a05e827c526ea99bef552460abff8058142e11e1c223aa0cc31bfa2e5f9184d9a0fb9533facadfa08b5da0a7b65ea1758675bbeb1ce2faa11ce20ade70ad5fcf88fd253c75e5a2d0ec79f3468e5056309b4d46e1e96ec811a14cf6e64fdb91a044979a86b571a9d701b6663d8f24ad77c4a514576fa942f45970993dc703dbc68a06eb688b9f7e87fbae04019d54320a26a5b7b84\nHASH: 2529cebc7a6002d2\n\nKEY: 94f80db0bb92d9f844c8fcc43ce0d94b\nIN: 3d09d5fadd1e79e648ed155dde5646d2b9b90c9103d4d7b4d53d5ff184033fb17db63516b70d4407aaf3be325d66d7196d08e310851c7a9f6ecb6d3a73b7ebc9bd604db7bf93879e17c2e1d7654247295ea02b97a60a3b85261119d021ed1f040f27e456f011cb46dad312b65c1927765cad2c56227d6aed2a5d7754a57de58c11f185aee88e38ae5c8fdbfe6242eb3dfc7981592556cdaf21351648abc64667998c4003cfb8376417ff98b506c0fa51dd2a152d00f34f6ab58c883362b08c986041724d360f68b94d8d071e327ff536023c98313f09df4ecdf11e16ecfaf3970ad682086ffc7e43d571a96b7103e9eb80acdb6fb8f78107a8042b2c8893b1d2f19f\nHASH: c4746b2d19941e56\n\nKEY: 995882b99f51c4a67f5b55f90e2a9aa2\nIN: f640e51da483aadfa88812d5851ea3a0d9e605b144013ffb7f74df26cae9317fd90233e2893575d5e470df2d80a2e9f4e8f6f5e5f885498bdad37d1489ab823dab96832d48c7617b255d40716d54dc45e9bb3d88f908d573172486d88c698496faf792696ac1f446419f6459866cd4ccfac5359ad9fc8a7bf85f755d08fa5e44f4b0def68513a39ddb97698180592baa03e37220eb955c636baef003040d753d5b2c307edd1b7a24ba1df13b9bcdd72cfbea7b17aeea59c604e509f511855e3784328479de46457d1ce706cd2f9e937d71192ff215733c62a205a6f08b901e2521e1935ee33d524c3d10c73c0a593acced88f73bf6624b15de138076569945cf2b6b11\nHASH: b24f340cc0fb1d2d\n\nKEY: 8da14614383bf855cdc281b5225515ce\nIN: e17c973f19eb796bfbc57ddb9601806998a5e97f18a3eca6a1d20c3cdcd109815cd8ee13981858324ab89e8b30214e3251e6f308648552034545f7d24ca74aa6de5bc1513c20d869a310ad1a44e462666d2817c0cc225a28efa78b1435c80adca1e07683e1792152267649aeb7ee19efade02dbc631b1fc58ac59671ea5982234da90dad42430fbd85fe6527991ccea11bb805815fdd0c8a920dc9e818a5fcf8fbf680a06999c42c33c7cc712dac8badf82059d142c6c3f80a8d09c881182cf336cce2e0e088d0af39fcdf6dc29c1ef496968455e2fa149a65cc57df06fe6830895e2daf352e922bff8cc3fc757161f3c61b2ec9e7d787e1ad976595d27f0f5fc5a04da5\nHASH: 36bd2cce6ed21122\n\nKEY: 70e11b8cda2ab4a0abcb736625145d90\nIN: 7f4fa8fc41f72c8fdcce996949b74560ea9fc7a3c57e502628487144472bee4300671cc1617fa7c76850df408b92020e7f5d377f4c8f410288ff60aca90516d0f1d13969c9e5af7e348ea7f8f9a36b8c69d0645432103f5b93ab560f3113e2d86b35fd6e704116ae5e7bfdf1c29b6d5a4570e2b1082a3e6023f14e666a76af86e4661e140eb836f262dbd5d388c166215ac4f39dd9fccbe3a3a8c58a2236304e8fc0fa1fc535e860e888a0d640277426e2e2a05d855c5ffd0876ee0306cc0c394d064fc45e974d1c19094a1e83d59057bf269f581637f343a9fac376ed41f4d193aa5e3c30141d31391c02390afd81bd32b6865ddd8974a44724217eaadd7ef316e0b4c2a5\nHASH: f6624d4d13833699\n\nKEY: e974c2247093c75ef6ed70632f16924e\nIN: 71f2e0508d7d36b373e8ee0fabf49dfd69638c5a6c79be9c89bbd0043b3bc66abb3618c67299c0afc4e24af8440185ce8d7d8b1d45732f123aa8243a9a0a0bb27b3d6bf59b39e389c15211b92c93bc5aa8582c98fb1523427c84969a65e99775e9d97f382b9ab47ccfdaddac3e7201f917bb64843f2b804801a018c71bb6f632f4521c1a4e9a375d7bbc8a42e561843dd65ae3e7ec0da1db8751960a656876983986bb2be2dadca5bb312cb004eb10f1c608af4afa599d946bdf8bd52102c257871810f5c8a899580287074686738a5823f33e96d3c2a7c77b68e4a21a5ac50e06664944d0cd6bd40ae95a2e21236e671bdaef79f08da52e2a6f65131a2e80c6263ddbeb9759\nHASH: 00ab496891593584\n\nKEY: c6f1ee0aada0c076cb20cad883bbcf52\nIN: 912f5b270fe4f445134d1caad3cd04cebc9c377fd03d3e26b82d4449d4ce1914ea718a6fa8c179dcdce1d117e99f4e8cad2cc0f0c059fd94cd8b3149a38a6b271c7fe1c90943c7a8d40774817c272a9139a05e1c0aa74cfb5a7c3c93aed9303b9579200022527a0911908875e23b1d8bacd42a123fac2342723a77942523b4aa858ff284821e1ecdb82ab2858580227bdb2e297ba3680a1f1cb0d31cb8e6f6c45235dc64f4c3f986c24f9ae3a6cb9d3710d58125f20d8e8c4cf4f89adc091649bd7a33ecb58cd163baed98e7e4f4dc16955f7f09bee1a51e0f76e9575cbc2733bf58bb4be4a4e2a2b1285c1b928aae6d8d9becdbc3723b408fc01acccb95861d23a3940df799bd\nHASH: 792ff12185fc3326\n\nKEY: 5cad21c8c3805f62248b1e1758c9c392\nIN: ec943f6a3d3681cd718f532bea0e5e2839c9425d0381dc5808cbfb273f6730efd52496b0331a711fce232991dd0847b5b6fd58330f54c19f571346d1e100e2304ebf5fff1b1047ddbbbc4dae02ffa3a21f8655b8972f683a33676352908e007ae3d12ce62e77acb2ca8278161d7c6964d6b97332c19c1d1d7288542eec4743731144a0e8a0abd58d0df0664eeacd5e97e272d672e110734c84c075b9ca5ecc279010f22236063a8ed1a7ef31bd84637832ce375944eb672b51edd7b4b248dca106295d83f14f160b63f84a49cb6a0ab143494ccdf5444c464ede3ee7936f821857cb2f3cd7d29da414c10ab7db05e4d0817c1556804b1d3d9c771adafae48541f930464549cd2635\nHASH: e428c0fa3cf4f1cf\n\nKEY: f6f49ac81cbafda6579b81c9d34de602\nIN: b5e3e21c2b2104c50bdd9a96667d460c3a4c0a5975df60369ebfc0f6ace585d727292f1d37107ef0bdd7ef16fe8740e0453501405c2a863289773a4d121b37f01e1672b0339f57fb445f132262f6337f64e9df4ed7fa79ed1c722171cf350f1c1d78e7427904ff3b90bffa1eea64181c4e69440af712e37b7dea95953ebd4ef5efa7bb3b14f3f452e204f9a26fcfa104b80deb56e16e16af88fc710f68df3da7f162e3de3aa9f31a2485169411d6009014578cace09aacebda2e965cd8c4841df7e31704584aafc459e02afc978b812f8ba22e2887728243658b4adcc46a471aa357567505b17fa51fdbc4c5ddc67827cc86f66ce3a55257d00683ed2b67ea19ce1ba0eaaed8c4c1a7\nHASH: 1b44de49c45e9bc3\n\nKEY: 05f5a594c805575eca581fd6e8b16051\nIN: aefef8817ca1ec2ce86d04184ee9f5da020497d3296395cecec10af22696deb65dcf3cfa4a3b808eb1826ff421de79aeebfca796306eb3b39165ad11d8733cee89f30229f75c06dea935045439d5a69ac118c5ca26bf59a9cade2e6b80b0fcff911eaf7f4097f87751570362dc5aa42a379c5ad313fb403b15c9c6c517be4ec28a22039bafd618284b16e12bc38c39e8525b930f5a630d4d595980becae425229bee4c63706fc172f5f9ba6cd5fd36ab474112169c2ef52b2bd72b2ef3bceb8a82ca53a42abcb044b712cc1a6b37a8ca8894b9904076452ddaae641f9137a72987fe928c20b67c2ccaf9fd601fa10c5e4c968727357c4547fc68b0e11b35f4fcbdcc3784c2722eeebefb\nHASH: cd45d7070e5ecb55\n\nKEY: 0546eaf96bc197e372139dac59c9ca1f\nIN: 1e0622e2d160fe532cc789b76e99a5fc7e90078dfa0d3d9342ca8c625192afeacf6935e930bca3e7bb2d7a4db23371b6ee3e645b9c6939bc3d414ddbff363d4ecb2967962bbb1d3b86a476bedd5820d17b86747c886efb34692b87db843588d0db53c3d91f2c305e5d58cb7ab98d6387ac45400d2ad1f2435bdb0c4a76c6fd491c3f2bc049fe70426767cadb0fa897e29cfda1bcf4f18d0b15795de39ca05fd2318dcc8b9afb7a278e986521ad971a236745bb62a680b47707a7dd1ffeb98e8e61edaa038e7c2a568c4a0060c38752eae915e4f99c91d6de11574b3dee5f85209acb8a38a02d0f59f5192a3151ba8073682d191ddd26b01913e98b403a4ce771e5e020ffed080d2dcb7082\nHASH: 079a62a92c61d7ad\n\nKEY: bb1780c25e2afb8c9bc58a3dbec8867a\nIN: ed5287df6db34449db95528d55e64ff486f178d68135dcc996593592a40655c88dfbef41fecbbc09066adca3b3ceca2c9f7be48ba61587ac3c69bb5589fb257bb96c000ab5e5843e9e7257095ae087d084aa7e62e9e3f74079d1c4c10443c9d9bcbcae47c74e72c024e5cd13280f058a772afc379d2dee0e39ec0cfc219cbb2af7698162a3b84be52c90617760e84d3743909bdd5cf21bd3ea3e3e37c3734dda57a06db25ab81ff02823f6d39cf9e068698e1f597458d08a29aefef218b40e191dc3d05f089f133f5f337d98d1c0161f490849782248e915ebcf700d80667b2d0ba3fda022faeeb23ca87add7664666f46",
     "37571964d613bf76a22061c9f746f9fb00ff0f5c2d90f648717e1f\nHASH: fcda80db378102b4\n\nKEY: ea7247b6addced42c51c827dbb2cb66c\nIN: 0ec554948d3af7cbc2306d249861f6291d44ab2be6bb26ab629347ac0e892cc902b3c5bf9688e39d826e32609834b34644a8b39c9a91f47a0f24e73a13edeec9e224756f6cff77e1d07fac03c1d803649279e33b2f16dd2d100bd82e9806afadb022700d55f5fc9688193da02dcc9dce974b60ccc2caad064acaa0f1b9e4f24e9074ac7877b91b19c7abbe5bb7f889775cd72ab9334475dddba19d008fdb01ab9cbfb1038a486c76f3c542bac704cf795be628cb83a5d9d128c2b401cf23ce494584cfe5b4ed58d9c906ded22090ffed4894238c6d02835e6180ce662b24ea18fd84d5fcbed49790322260fcf3f193081ccdb60d8f768b6dbfa61867bf90fbb1f27e1a6cb83daad6243079904a\nHASH: f8181640a08f1343\n",
 };
-static const size_t kLen61 = 489;
-
-static const char *kData61[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBOzCB4qADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejEzARMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZI\nzj0EAwIDSAAwRQIgTNs2aQPDZs+Pal5LA1fAKyC4AKTNN+JE/vEYndKhFxYCIQDf\nb7IjDoXx/3GBnsrht14NUmzUBdqkQafJvC+eHIdtQA==\n-----END CERTIFICATE-----\n",
-};
-static const size_t kLen62 = 493;
+static const size_t kLen62 = 489;
 
 static const char *kData62[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQAwCgYI\nKoZIzj0EAwIDSAAwRQIgHdMalNLi3hzz58PdNQPAqiA5KAa/dfQWuNNjzE6iDIcC\nIQCda6js7OKQvdqCFb/POHPriXX1YXIJ3N95+SE7qFJ9Gg==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBOzCB4qADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejEzARMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZI\nzj0EAwIDSAAwRQIgTNs2aQPDZs+Pal5LA1fAKyC4AKTNN+JE/vEYndKhFxYCIQDf\nb7IjDoXx/3GBnsrht14NUmzUBdqkQafJvC+eHIdtQA==\n-----END CERTIFICATE-----\n",
 };
 static const size_t kLen63 = 493;
 
 static const char *kData63[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgZx7fIDI65CU7Lck0t7ep/GtBkpELR0gKkUJrI09/JJoC\nIQDFPukkJgYA7RpFsAsEq77S+i9gf/S/IreobhvQm/401w==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQAwCgYI\nKoZIzj0EAwIDSAAwRQIgHdMalNLi3hzz58PdNQPAqiA5KAa/dfQWuNNjzE6iDIcC\nIQCda6js7OKQvdqCFb/POHPriXX1YXIJ3N95+SE7qFJ9Gg==\n-----END CERTIFICATE-----\n",
 };
 static const size_t kLen64 = 493;
 
 static const char *kData64[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQowCgYI\nKoZIzj0EAwIDSAAwRQIhALj37ijrYfommrWjrXMXjJyILvGNH7KxViKU1cWjX5dF\nAiA6WjePmZdKilZebpZ++MTPs5cbpdcShWYuJ45sANCKgw==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgZx7fIDI65CU7Lck0t7ep/GtBkpELR0gKkUJrI09/JJoC\nIQDFPukkJgYA7RpFsAsEq77S+i9gf/S/IreobhvQm/401w==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen65 = 485;
+static const size_t kLen65 = 493;
 
 static const char *kData65[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBOTCB36ADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejEDAOMAwGA1UdEwEB/wQCMAAwCgYIKoZIzj0E\nAwIDSQAwRgIhAIc3Cbr1SRZZ8ZusjOQjA/9Ro5ijEZbMaD1ClW62/GqSAiEAy1tU\nNo3zRwTUcuyAnav+XbXkS1a5Fm2/rFBoWN8ZAxA=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBPjCB5aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQowCgYI\nKoZIzj0EAwIDSAAwRQIhALj37ijrYfommrWjrXMXjJyILvGNH7KxViKU1cWjX5dF\nAiA6WjePmZdKilZebpZ++MTPs5cbpdcShWYuJ45sANCKgw==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen66 = 465;
+static const size_t kLen66 = 485;
 
 static const char *kData66[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBKjCB0aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejAjAAMAoGCCqGSM49BAMCA0gAMEUCIQCQ1/Ca\nRanCM+PIUqVkCpfumEeLKawHMYIA2ZM3Yy2wngIgZg10Sd25/POZKIXlMAiwlDrM\nUQcfzZiBh8T5JEWKeRc=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBOTCB36ADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejEDAOMAwGA1UdEwEB/wQCMAAwCgYIKoZIzj0E\nAwIDSQAwRgIhAIc3Cbr1SRZZ8ZusjOQjA/9Ro5ijEZbMaD1ClW62/GqSAiEAy1tU\nNo3zRwTUcuyAnav+XbXkS1a5Fm2/rFBoWN8ZAxA=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen67 = 623;
+static const size_t kLen67 = 465;
 
 static const char *kData67[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBnjCCAUOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjYDBeMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAKBggq\nhkjOPQQDAgNJADBGAiEA0XamFS9fNIkvjN4muFP3EYEuO3/y+WiNhewBtusrhD0C\nIQCmTHE7J6c+Pvtv4Ro2S/I3Pypr8sJNWdezoE5Okhf4Gw==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBKjCB0aADAgECAgEBMAoGCCqGSM49BAMCMBwxGjAYBgNVBAMTEUJhc2ljIENv\nbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAcMRow\nGAYDVQQDExFCYXNpYyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABJEq2LxVbZGSZr4q32NCQw2K2UKzSXnDy7dJLCbsdlES+ZwEIkGNUhERpxGo\njS6aHNHZXk0vMEE/3I8P8D4KHlejAjAAMAoGCCqGSM49BAMCA0gAMEUCIQCQ1/Ca\nRanCM+PIUqVkCpfumEeLKawHMYIA2ZM3Yy2wngIgZg10Sd25/POZKIXlMAiwlDrM\nUQcfzZiBh8T5JEWKeRc=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen68 = 619;
+static const size_t kLen68 = 623;
 
 static const char *kData68[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBnTCCAUKgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjXzBdMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDgYDVR0jBAdJTlZBTElEMAoGCCqG\nSM49BAMCA0kAMEYCIQDKVSKO0wAESfYL/ZRzKj3rBxolJ9+GHKxNTXnmf7w6sAIh\nAM0mSwKy1M+w7th5s0XhfImVfpi+V4Xxbtz8AWN6Grfm\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBnjCCAUOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjYDBeMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAKBggq\nhkjOPQQDAgNJADBGAiEA0XamFS9fNIkvjN4muFP3EYEuO3/y+WiNhewBtusrhD0C\nIQCmTHE7J6c+Pvtv4Ro2S/I3Pypr8sJNWdezoE5Okhf4Gw==\n-----END CERTIFICATE-----\n",
 };
 static const size_t kLen69 = 619;
 
 static const char *kData69[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBnDCCAUKgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjXzBdMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAVBgNVHQ4EDgQMaW50\nZXJtZWRpYXRlMA8GA1UdIwQIMAaABHJvb3QwDgYDVR0TBAdJTlZBTElEMAoGCCqG\nSM49BAMCA0gAMEUCIARJW0WA3S/H8amVP7H8BLJj6AnNocXOC4FkQY1YNNdSAiEA\n/Y4tQ2nvQhDuBGxdkDfR5wyYLOuS+t/CWIiV3A63VsM=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBnTCCAUKgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjXzBdMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDgYDVR0jBAdJTlZBTElEMAoGCCqG\nSM49BAMCA0kAMEYCIQDKVSKO0wAESfYL/ZRzKj3rBxolJ9+GHKxNTXnmf7w6sAIh\nAM0mSwKy1M+w7th5s0XhfImVfpi+V4Xxbtz8AWN6Grfm\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen70 = 615;
+static const size_t kLen70 = 619;
 
 static const char *kData70[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBmTCCAT6gAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjWzBZMA4G\nA1UdDwEB/wQEAwICBDAPBgNVHRMBAf8EBTADAQH/MBUGA1UdDgQOBAxpbnRlcm1l\nZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNVHSUEB0lOVkFMSUQwCgYIKoZIzj0E\nAwIDSQAwRgIhALzNOt3jZR7ZP0DWt0hw3SRu5l8dcKYy49xVNIY3D8OuAiEA4KHg\nSfy+XLtLvVG9Tnbbh3XS+iLHiDUsYCGivpTAb44=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBnDCCAUKgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjXzBdMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAVBgNVHQ4EDgQMaW50\nZXJtZWRpYXRlMA8GA1UdIwQIMAaABHJvb3QwDgYDVR0TBAdJTlZBTElEMAoGCCqG\nSM49BAMCA0gAMEUCIARJW0WA3S/H8amVP7H8BLJj6AnNocXOC4FkQY1YNNdSAiEA\n/Y4tQ2nvQhDuBGxdkDfR5wyYLOuS+t/CWIiV3A63VsM=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen71 = 619;
+static const size_t kLen71 = 615;
 
 static const char *kData71[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBnTCCAUOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjYDBeMBMG\nA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wFQYDVR0OBA4EDGlu\ndGVybWVkaWF0ZTAPBgNVHSMECDAGgARyb290MA4GA1UdDwQHSU5WQUxJRDAKBggq\nhkjOPQQDAgNIADBFAiEAtoKHHh57yauGrcGren78p+jqfq41XmuwaF6vQ7BfmxQC\nIHCPCJcys8DqJOXId0F6fyk/Dk7jixFnmwW8S5E8N+Ee\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBmTCCAT6gAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjWzBZMA4G\nA1UdDwEB/wQEAwICBDAPBgNVHRMBAf8EBTADAQH/MBUGA1UdDgQOBAxpbnRlcm1l\nZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNVHSUEB0lOVkFMSUQwCgYIKoZIzj0E\nAwIDSQAwRgIhALzNOt3jZR7ZP0DWt0hw3SRu5l8dcKYy49xVNIY3D8OuAiEA4KHg\nSfy+XLtLvVG9Tnbbh3XS+iLHiDUsYCGivpTAb44=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen72 = 639;
+static const size_t kLen72 = 619;
 
 static const char *kData72[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBrDCCAVOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjcDBuMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNV\nHR4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDRwAwRAIgFTYJwndHsZh13cYj4EfDZFNe\nckt9rkRJjEP7nDGyD44CIAE6M7HDjbJRjJbYsAfc45ax00i9htFjb88t6AJyDU9M\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBnTCCAUOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjYDBeMBMG\nA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wFQYDVR0OBA4EDGlu\ndGVybWVkaWF0ZTAPBgNVHSMECDAGgARyb290MA4GA1UdDwQHSU5WQUxJRDAKBggq\nhkjOPQQDAgNIADBFAiEAtoKHHh57yauGrcGren78p+jqfq41XmuwaF6vQ7BfmxQC\nIHCPCJcys8DqJOXId0F6fyk/Dk7jixFnmwW8S5E8N+Ee\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen73 = 644;
+static const size_t kLen73 = 639;
 
 static const char *kData73[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBrjCCAVOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjcDBuMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNV\nHREEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSQAwRgIhAI49whD5azejKejI1xowdbu7\nLHeT2wNanCCU+KCOoBFPAiEAoog5xR90Z2lWsLJEPWiw7WLJMNuZBDINLNVDCA5d\nD0k=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBrDCCAVOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjcDBuMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNV\nHR4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDRwAwRAIgFTYJwndHsZh13cYj4EfDZFNe\nckt9rkRJjEP7nDGyD44CIAE6M7HDjbJRjJbYsAfc45ax00i9htFjb88t6AJyDU9M\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen74 = 611;
+static const size_t kLen74 = 644;
 
 static const char *kData74[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBljCCATygAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjWTBXMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MA8GA1UdIwQIMAaABHJvb3QwDgYDVR0OBAdJTlZBTElEMAoGCCqGSM49BAMC\nA0gAMEUCIDsbBMbAWuJq9VnfrSjLBTK6TSfskt3i0ns2y/9FEW04AiEAkjyacdGb\nsk1wvjrVc5ny6O96NvUGkdO1/GNdPNKPYWQ=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBrjCCAVOgAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjcDBuMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MBUGA1UdDgQOBAxpbnRlcm1lZGlhdGUwDwYDVR0jBAgwBoAEcm9vdDAOBgNV\nHREEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSQAwRgIhAI49whD5azejKejI1xowdbu7\nLHeT2wNanCCU+KCOoBFPAiEAoog5xR90Z2lWsLJEPWiw7WLJMNuZBDINLNVDCA5d\nD0k=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen75 = 688;
+static const size_t kLen75 = 611;
 
 static const char *kData75[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBzzCCAXagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GaMIGXMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93\nd3cuZXhhbXBsZS5jb20wHgYDVR0eBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAK\nBggqhkjOPQQDAgNHADBEAiAJtROn4TOAvfttoQJ6RsqnsaR1WaP+CKzWXjARJxtQ\nLwIgGmbRenVTFx8ho17JY8ncV5qaJqc0EXN56twt9SccKqE=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBljCCATygAwIBAgIBAjAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowKjEoMCYGA1UEAxMfSW52YWxpZCBFeHRlbnNpb25zIEludGVybWVkaWF0ZTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOI6fKiM3jFLkLyAn88cvlw4SwxuygRj\nopP3FFBKHyUQvh3VVvfqSpSCSmp50QiajQ6Dg7CTpVZVVH+bguT7JTCjWTBXMA4G\nA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MA8GA1UdIwQIMAaABHJvb3QwDgYDVR0OBAdJTlZBTElEMAoGCCqGSM49BAMC\nA0gAMEUCIDsbBMbAWuJq9VnfrSjLBTK6TSfskt3i0ns2y/9FEW04AiEAkjyacdGb\nsk1wvjrVc5ny6O96NvUGkdO1/GNdPNKPYWQ=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen76 = 680;
+static const size_t kLen76 = 688;
 
 static const char *kData76[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIByDCCAW2gAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GRMIGOMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAeBgNVHR4EFzAV\noBMwEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdIwQHSU5WQUxJRDAKBggqhkjOPQQD\nAgNJADBGAiEAj6hhgnfiI0zt38N98eQsfJCJ8ZGkLfH+69OOUISls2QCIQDtyWhN\nL/7L787+zkUazG4HvZ/YHO7hbWQAfMQVbk/iRA==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBzzCCAXagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GaMIGXMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93\nd3cuZXhhbXBsZS5jb20wHgYDVR0eBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAK\nBggqhkjOPQQDAgNHADBEAiAJtROn4TOAvfttoQJ6RsqnsaR1WaP+CKzWXjARJxtQ\nLwIgGmbRenVTFx8ho17JY8ncV5qaJqc0EXN56twt9SccKqE=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen77 = 692;
+static const size_t kLen77 = 680;
 
 static const char *kData77[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIB0zCCAXigAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GcMIGZMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATANBgNVHQ4EBgQEbGVhZjAXBgNV\nHSMEEDAOgAxpbnRlcm1lZGlhdGUwGgYDVR0RBBMwEYIPd3d3LmV4YW1wbGUuY29t\nMB4GA1UdHgQXMBWgEzARgg93d3cuZXhhbXBsZS5jb20wDgYDVR0TBAdJTlZBTElE\nMAoGCCqGSM49BAMCA0kAMEYCIQDo/XMevx8IdL+LOl55riE3otGDWKDDPgaZKA43\nsnAJAwIhAJtgm2YNclXG1i8PzrSqZ5Y5mvBMgtjTfW/7ld7ED3pK\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIByDCCAW2gAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GRMIGOMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAeBgNVHR4EFzAV\noBMwEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdIwQHSU5WQUxJRDAKBggqhkjOPQQD\nAgNJADBGAiEAj6hhgnfiI0zt38N98eQsfJCJ8ZGkLfH+69OOUISls2QCIQDtyWhN\nL/7L787+zkUazG4HvZ/YHO7hbWQAfMQVbk/iRA==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen78 = 684;
+static const size_t kLen78 = 692;
 
 static const char *kData78[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIByzCCAXGgAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GVMIGSMA4GA1UdDwEB\n/wQEAwICBDAMBgNVHRMBAf8EAjAAMA0GA1UdDgQGBARsZWFmMBcGA1UdIwQQMA6A\nDGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20wHgYDVR0e\nBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAOBgNVHSUEB0lOVkFMSUQwCgYIKoZI\nzj0EAwIDSAAwRQIhAJwe+EZy9v2fW6bYAE8T2NEJjc0SDLoHshJOae3yOYMoAiB1\nkTrY4iuQKBwbbAokFgnHr+Ev1aXcmjRn0sJFDesUAw==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIB0zCCAXigAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GcMIGZMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATANBgNVHQ4EBgQEbGVhZjAXBgNV\nHSMEEDAOgAxpbnRlcm1lZGlhdGUwGgYDVR0RBBMwEYIPd3d3LmV4YW1wbGUuY29t\nMB4GA1UdHgQXMBWgEzARgg93d3cuZXhhbXBsZS5jb20wDgYDVR0TBAdJTlZBTElE\nMAoGCCqGSM49BAMCA0kAMEYCIQDo/XMevx8IdL+LOl55riE3otGDWKDDPgaZKA43\nsnAJAwIhAJtgm2YNclXG1i8PzrSqZ5Y5mvBMgtjTfW/7ld7ED3pK\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen79 = 688;
+static const size_t kLen79 = 684;
 
 static const char *kData79[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBzzCCAXagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GaMIGXMBMGA1UdJQQM\nMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYDVR0OBAYEBGxlYWYwFwYDVR0j\nBBAwDoAMaW50ZXJtZWRpYXRlMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAe\nBgNVHR4EFzAVoBMwEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdDwQHSU5WQUxJRDAK\nBggqhkjOPQQDAgNHADBEAiAoWszkhUlrT+vn0BqkA8yuuyCQ7HvK8KQOJsvzFYkS\nqwIgbzwpATgcK7hhRG+GIO8v/MWqomOLExlQYcGIPPODHH0=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIByzCCAXGgAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GVMIGSMA4GA1UdDwEB\n/wQEAwICBDAMBgNVHRMBAf8EAjAAMA0GA1UdDgQGBARsZWFmMBcGA1UdIwQQMA6A\nDGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20wHgYDVR0e\nBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAOBgNVHSUEB0lOVkFMSUQwCgYIKoZI\nzj0EAwIDSAAwRQIhAJwe+EZy9v2fW6bYAE8T2NEJjc0SDLoHshJOae3yOYMoAiB1\nkTrY4iuQKBwbbAokFgnHr+Ev1aXcmjRn0sJFDesUAw==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen80 = 668;
+static const size_t kLen80 = 688;
 
 static const char *kData80[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBvzCCAWagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GKMIGHMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93\nd3cuZXhhbXBsZS5jb20wDgYDVR0eBAdJTlZBTElEMAoGCCqGSM49BAMCA0cAMEQC\nIDBcHYVfj62g5y2gP/TTvH3VQr4XG/QNZLL6N8H/A8arAiB95102dlC8zVt4beDe\nejD7/YA0FNMSgEnAZ1VgzPejxA==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBzzCCAXagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GaMIGXMBMGA1UdJQQM\nMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYDVR0OBAYEBGxlYWYwFwYDVR0j\nBBAwDoAMaW50ZXJtZWRpYXRlMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAe\nBgNVHR4EFzAVoBMwEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdDwQHSU5WQUxJRDAK\nBggqhkjOPQQDAgNHADBEAiAoWszkhUlrT+vn0BqkA8yuuyCQ7HvK8KQOJsvzFYkS\nqwIgbzwpATgcK7hhRG+GIO8v/MWqomOLExlQYcGIPPODHH0=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen81 = 676;
+static const size_t kLen81 = 668;
 
 static const char *kData81[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBxTCCAWqgAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GOMIGLMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAeBgNVHR4EFzAVoBMw\nEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdEQQHSU5WQUxJRDAKBggqhkjOPQQDAgNJ\nADBGAiEAurYkjuxVgkxbmI1D+qM5RGXPPs7V74okqeQdURcL7HACIQDGNT6gcPDw\nAx2Hm5GK3H5UrNEmD1K4IOxfKl9zguiffQ==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBvzCCAWagAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GKMIGHMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93\nd3cuZXhhbXBsZS5jb20wDgYDVR0eBAdJTlZBTElEMAoGCCqGSM49BAMCA0cAMEQC\nIDBcHYVfj62g5y2gP/TTvH3VQr4XG/QNZLL6N8H/A8arAiB95102dlC8zVt4beDe\nejD7/YA0FNMSgEnAZ1VgzPejxA==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen82 = 692;
+static const size_t kLen82 = 676;
 
 static const char *kData82[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIB0jCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBcGA1Ud\nIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20w\nHgYDVR0eBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAOBgNVHQ4EB0lOVkFMSUQw\nCgYIKoZIzj0EAwIDSQAwRgIhAOgBejpWnjlxO/K8FMTGO7J+sHS6PAQohwvEgLmT\nKWhMAiEAuc5uRycxN44gGka2Of9zw09o50sKgS1Ckv+VhkDqgbg=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBxTCCAWqgAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GOMIGLMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAeBgNVHR4EFzAVoBMw\nEYIPd3d3LmV4YW1wbGUuY29tMA4GA1UdEQQHSU5WQUxJRDAKBggqhkjOPQQDAgNJ\nADBGAiEAurYkjuxVgkxbmI1D+qM5RGXPPs7V74okqeQdURcL7HACIQDGNT6gcPDw\nAx2Hm5GK3H5UrNEmD1K4IOxfKl9zguiffQ==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen83 = 574;
+static const size_t kLen83 = 692;
 
 static const char *kData83[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBfDCCASKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0cwRTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAKBggqhkjOPQQDAgNIADBFAiBd9AxKvRMSY7ll42h5jjYh5QtK\nYu3fxeME1IeivVNzQAIhAPov0l/2FYwZmMGI9ihR3iD/8petRfp4E9JLQQd3TgL5\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIB0jCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBcGA1Ud\nIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20w\nHgYDVR0eBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAOBgNVHQ4EB0lOVkFMSUQw\nCgYIKoZIzj0EAwIDSQAwRgIhAOgBejpWnjlxO/K8FMTGO7J+sHS6PAQohwvEgLmT\nKWhMAiEAuc5uRycxN44gGka2Of9zw09o50sKgS1Ckv+VhkDqgbg=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen84 = 599;
+static const size_t kLen84 = 574;
 
 static const char *kData84[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBjDCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHSMEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIhAMVD\nOFcNzmPEdD2dJ3KWRGR15vQbXEXvimZgJdKtXdbLAiBfJOocLiQfPU7Nk3Qo0Ti1\nEn0QfUATxx8DNR15cfcupQ==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBfDCCASKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0cwRTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAKBggqhkjOPQQDAgNIADBFAiBd9AxKvRMSY7ll42h5jjYh5QtK\nYu3fxeME1IeivVNzQAIhAPov0l/2FYwZmMGI9ihR3iD/8petRfp4E9JLQQd3TgL5\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen85 = 574;
+static const size_t kLen85 = 599;
 
 static const char *kData85[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBejCCASGgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0YwRDAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYDVR0OBAYEBHJvb3QwDgYDVR0T\nBAdJTlZBTElEMAoGCCqGSM49BAMCA0cAMEQCIB2OGsfTIUGaJ3iTXv2oung5pLKH\nVExVqc+KbnIyDbnaAiBwgxjlX+01/ERfGguz+W+00m4IZlzbyAp4dEs4rW9AXw==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBjDCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHSMEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIhAMVD\nOFcNzmPEdD2dJ3KWRGR15vQbXEXvimZgJdKtXdbLAiBfJOocLiQfPU7Nk3Qo0Ti1\nEn0QfUATxx8DNR15cfcupQ==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen86 = 570;
+static const size_t kLen86 = 574;
 
 static const char *kData86[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR2gAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0IwQDAOBgNVHQ8BAf8E\nBAMCAgQwDwYDVR0TAQH/BAUwAwEB/zANBgNVHQ4EBgQEcm9vdDAOBgNVHSUEB0lO\nVkFMSUQwCgYIKoZIzj0EAwIDSQAwRgIhAIY8RxbluUZ2M2PPy5IHnvdXRaQdIq3Z\nDFg9LwkxXl8NAiEAzdE/F19Upl4E7LmdnmGXz8BxhNB6e5CxiJJEdeexCn8=\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBejCCASGgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0YwRDAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYDVR0OBAYEBHJvb3QwDgYDVR0T\nBAdJTlZBTElEMAoGCCqGSM49BAMCA0cAMEQCIB2OGsfTIUGaJ3iTXv2oung5pLKH\nVExVqc+KbnIyDbnaAiBwgxjlX+01/ERfGguz+W+00m4IZlzbyAp4dEs4rW9AXw==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen87 = 574;
+static const size_t kLen87 = 570;
 
 static const char *kData87[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBfDCCASKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0cwRTATBgNVHSUEDDAK\nBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MA0GA1UdDgQGBARyb290MA4GA1Ud\nDwQHSU5WQUxJRDAKBggqhkjOPQQDAgNIADBFAiEAt0anuhA0pecFMnlB4+M9lcy6\nVZsopjCniyHxfaaf1jQCICPaxHg+ztBFtOjCsr8nbgSy/JWYejF1uTjLYZKj5z6I\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR2gAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0IwQDAOBgNVHQ8BAf8E\nBAMCAgQwDwYDVR0TAQH/BAUwAwEB/zANBgNVHQ4EBgQEcm9vdDAOBgNVHSUEB0lO\nVkFMSUQwCgYIKoZIzj0EAwIDSQAwRgIhAIY8RxbluUZ2M2PPy5IHnvdXRaQdIq3Z\nDFg9LwkxXl8NAiEAzdE/F19Upl4E7LmdnmGXz8BxhNB6e5CxiJJEdeexCn8=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen88 = 595;
+static const size_t kLen88 = 574;
 
 static const char *kData88[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBizCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHR4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDRwAwRAIgHa/R\ni3/yXzHD61xU8mVWSnH39FP5V0mzcHqxKvGSlk4CICsg1HCVLPvYIVUd0Kc8bv6h\nuu6UUup8MlUdFrRJaOus\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBfDCCASKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0cwRTATBgNVHSUEDDAK\nBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MA0GA1UdDgQGBARyb290MA4GA1Ud\nDwQHSU5WQUxJRDAKBggqhkjOPQQDAgNIADBFAiEAt0anuhA0pecFMnlB4+M9lcy6\nVZsopjCniyHxfaaf1jQCICPaxHg+ztBFtOjCsr8nbgSy/JWYejF1uTjLYZKj5z6I\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen89 = 599;
+static const size_t kLen89 = 595;
 
 static const char *kData89[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBjDCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHREEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIgZ12y\n9EulwmfqICXtykhGr9Pjfcdg6SacCreLx7454cYCIQCQkP5Ji2SW1Huzp6hE1oHw\nXwNwxFXV6XMJ+NylMYoJ3w==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBizCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHR4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDRwAwRAIgHa/R\ni3/yXzHD61xU8mVWSnH39FP5V0mzcHqxKvGSlk4CICsg1HCVLPvYIVUd0Kc8bv6h\nuu6UUup8MlUdFrRJaOus\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen90 = 579;
+static const size_t kLen90 = 599;
 
 static const char *kData90[] = {
-    "-----BEGIN CERTIFICATE-----\nMIIBfTCCASOgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0gwRjAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\nHQ4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIhAOOhlyJ15KAUZlokr35Y51mJ\nIc8V3490rloGXldPJajUAiADevilj44K19daaJCFDSIRByO23doY7AmoeLt6YgNJ\nDQ==\n-----END CERTIFICATE-----\n",
+    "-----BEGIN CERTIFICATE-----\nMIIBjDCCATKgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto1cwVTAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zANBgNV\nHQ4EBgQEcm9vdDAOBgNVHREEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIgZ12y\n9EulwmfqICXtykhGr9Pjfcdg6SacCreLx7454cYCIQCQkP5Ji2SW1Huzp6hE1oHw\nXwNwxFXV6XMJ+NylMYoJ3w==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen91 = 18852;
+static const size_t kLen91 = 579;
 
 static const char *kData91[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIBfTCCASOgAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYDVQQDExdJbnZhbGlk\nIEV4dGVuc2lvbnMgUm9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAw\nMFowIjEgMB4GA1UEAxMXSW52YWxpZCBFeHRlbnNpb25zIFJvb3QwWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44TqChRYI6IeV9tI\nB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolto0gwRjAOBgNVHQ8BAf8E\nBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\nHQ4EB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIhAOOhlyJ15KAUZlokr35Y51mJ\nIc8V3490rloGXldPJajUAiADevilj44K19daaJCFDSIRByO23doY7AmoeLt6YgNJ\nDQ==\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen92 = 18852;
+
+static const char *kData92[] = {
     "-----BEGIN CERTIFICATE-----\nMII2MzCCNRugAwIBAgIBATANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDTELMAkGA1UEAxMCQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6C9qEGRIBQXV8Lj29vVu+\nU+tyXzSSinWIumK5ijPhCm3DLnv4RayxkFwemtnkGRZ/o94ZnsXkBfU/IlsYdkuq\n8wK9WI/ql3gwWjH+KARIhIQcSLGiJcLN6kGuG2nlRBKMcPgPiEq2B0yBXFf4tG3C\nBbeae7+8G7uvOmv8NLyKj32neWpnUCTL5o2VwyPoxjLxT5gUR69v9XSVFj2irCZb\nsEedeKSb++LqyMhLfnRTzNv+ZHNh4izZHrktR25MvnT5QyBq32hx7AjZ2/xo70Om\nH7w10a2DwsVjJNMdxTEmgyvU9M6CeYRPX1Ykfg+sXCTtkTVAlBDUviIqY95CKy25\nAgMBAAGjgjOaMIIzljAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUH\nAwEwDwYDVR0TAQH/BAUwAwEB/zCCM1wGA1UdHgSCM1MwgjNPoIIZqDAJggd0MC50\nZXN0MAmCB3QxLnRlc3QwCYIHdDIudGVzdDAJggd0My50ZXN0MAmCB3Q0LnRlc3Qw\nCYIHdDUudGVzdDAJggd0Ni50ZXN0MAmCB3Q3LnRlc3QwCYIHdDgudGVzdDAJggd0\nOS50ZXN0MAqCCHQxMC50ZXN0MAqCCHQxMS50ZXN0MAqCCHQxMi50ZXN0MAqCCHQx\nMy50ZXN0MAqCCHQxNC50ZXN0MAqCCHQxNS50ZXN0MAqCCHQxNi50ZXN0MAqCCHQx\nNy50ZXN0MAqCCHQxOC50ZXN0MAqCCHQxOS50ZXN0MAqCCHQyMC50ZXN0MAqCCHQy\nMS50ZXN0MAqCCHQyMi50ZXN0MAqCCHQyMy50ZXN0MAqCCHQyNC50ZXN0MAqCCHQy\nNS50ZXN0MAqCCHQyNi50ZXN0MAqCCHQyNy50ZXN0MAqCCHQyOC50ZXN0MAqCCHQy\nOS50ZXN0MAqCCHQzMC50ZXN0MAqCCHQzMS50ZXN0MAqCCHQzMi50ZXN0MAqCCHQz\nMy50ZXN0MAqCCHQzNC50ZXN0MAqCCHQzNS50ZXN0MAqCCHQzNi50ZXN0MAqCCHQz\nNy50ZXN0MAqCCHQzOC50ZXN0MAqCCHQzOS50ZXN0MAqCCHQ0MC50ZXN0MAqCCHQ0\nMS50ZXN0MAqCCHQ0Mi50ZXN0MAqCCHQ0My50ZXN0MAqCCHQ0NC50ZXN0MAqCCHQ0\nNS50ZXN0MAqCCHQ0Ni50ZXN0MAqCCHQ0Ny50ZXN0MAqCCHQ0OC50ZXN0MAqCCHQ0\nOS50ZXN0MAqCCHQ1MC50ZXN0MAqCCHQ1MS50ZXN0MAqCCHQ1Mi50ZXN0MAqCCHQ1\nMy50ZXN0MAqCCHQ1NC50ZXN0MAqCCHQ1NS50ZXN0MAqCCHQ1Ni50ZXN0MAqCCHQ1\nNy50ZXN0MAqCCHQ1OC50ZXN0MAqCCHQ1OS50ZXN0MAqCCHQ2MC50ZXN0MAqCCHQ2\nMS50ZXN0MAqCCHQ2Mi50ZXN0MAqCCHQ2My50ZXN0MAqCCHQ2NC50ZXN0MAqCCHQ2\nNS50ZXN0MAqCCHQ2Ni50ZXN0MAqCCHQ2Ny50ZXN0MAqCCHQ2OC50ZXN0MAqCCHQ2\nOS50ZXN0MAqCCHQ3MC50ZXN0MAqCCHQ3MS50ZXN0MAqCCHQ3Mi50ZXN0MAqCCHQ3\nMy50ZXN0MAqCCHQ3NC50ZXN0MAqCCHQ3NS50ZXN0MAqCCHQ3Ni50ZXN0MAqCCHQ3\nNy50ZXN0MAqCCHQ3OC50ZXN0MAqCCHQ3OS50ZXN0MAqCCHQ4MC50ZXN0MAqCCHQ4\nMS50ZXN0MAqCCHQ4Mi50ZXN0MAqCCHQ4My50ZXN0MAqCCHQ4NC50ZXN0MAqCCHQ4\nNS50ZXN0MAqCCHQ4Ni50ZXN0MAqCCHQ4Ny50ZXN0MAqCCHQ4OC50ZXN0MAqCCHQ4\nOS50ZXN0MAqCCHQ5MC50ZXN0MAqCCHQ5MS50ZXN0MAqCCHQ5Mi50ZXN0MAqCCHQ5\nMy50ZXN0MAqCCHQ5NC50ZXN0MAqCCHQ5NS50ZXN0MAqCCHQ5Ni50ZXN0MAqCCHQ5\nNy50ZXN0MAqCCHQ5OC50ZXN0MAqCCHQ5OS50ZXN0MAuCCXQxMDAudGVzdDALggl0\nMTAxLnRlc3QwC4IJdDEwMi50ZXN0MAuCCXQxMDMudGVzdDALggl0MTA0LnRlc3Qw\nC4IJdDEwNS50ZXN0MAuCCXQxMDYudGVzdDALggl0MTA3LnRlc3QwC4IJdDEwOC50\nZXN0MAuCCXQxMDkudGVzdDALggl0MTEwLnRlc3QwC4IJdDExMS50ZXN0MAuCCXQx\nMTIudGVzdDALggl0MTEzLnRlc3QwC4IJdDExNC50ZXN0MAuCCXQxMTUudGVzdDAL\nggl0MTE2LnRlc3QwC4IJdDExNy50ZXN0MAuCCXQxMTgudGVzdDALggl0MTE5LnRl\nc3QwC4IJdDEyMC50ZXN0MAuCCXQxMjEudGVzdDALggl0MTIyLnRlc3QwC4IJdDEy\nMy50ZXN0MAuCCXQxMjQudGVzdDALggl0MTI1LnRlc3QwC4IJdDEyNi50ZXN0MAuC\nCXQxMjcudGVzdDALggl0MTI4LnRlc3QwC4IJdDEyOS50ZXN0MAuCCXQxMzAudGVz\ndDALggl0MTMxLnRlc3QwC4IJdDEzMi50ZXN0MAuCCXQxMzMudGVzdDALggl0MTM0\nLnRlc3QwC4IJdDEzNS50ZXN0MAuCCXQxMzYudGVzdDALggl0MTM3LnRlc3QwC4IJ\ndDEzOC50ZXN0MAuCCXQxMzkudGVzdDALggl0MTQwLnRlc3QwC4IJdDE0MS50ZXN0\nMAuCCXQxNDIudGVzdDALggl0MTQzLnRlc3QwC4IJdDE0NC50ZXN0MAuCCXQxNDUu\ndGVzdDALggl0MTQ2LnRlc3QwC4IJdDE0Ny50ZXN0MAuCCXQxNDgudGVzdDALggl0\nMTQ5LnRlc3QwC4IJdDE1MC50ZXN0MAuCCXQxNTEudGVzdDALggl0MTUyLnRlc3Qw\nC4IJdDE1My50ZXN0MAuCCXQxNTQudGVzdDALggl0MTU1LnRlc3QwC4IJdDE1Ni50\nZXN0MAuCCXQxNTcudGVzdDALggl0MTU4LnRlc3QwC4IJdDE1OS50ZXN0MAuCCXQx\nNjAudGVzdDALggl0MTYxLnRlc3QwC4IJdDE2Mi50ZXN0MAuCCXQxNjMudGVzdDAL\nggl0MTY0LnRlc3QwC4IJdDE2NS50ZXN0MAuCCXQxNjYudGVzdDALggl0MTY3LnRl\nc3QwC4IJdDE2OC50ZXN0MAuCCXQxNjkudGVzdDALggl0MTcwLnRlc3QwC4IJdDE3\nMS50ZXN0MAuCCXQxNzIudGVzdDALggl0MTczLnRlc3QwC4IJdDE3NC50ZXN0MAuC\nCXQxNzUudGVzdDALggl0MTc2LnRlc3QwC4IJdDE3Ny50ZXN0MAuCCXQxNzgudGVz\ndDALggl0MTc5LnRlc3QwC4IJdDE4MC50ZXN0MAuCCXQxODEudGVzdDALggl0MTgy\nLnRlc3QwC4IJdDE4My50ZXN0MAuCCXQxODQudGVzdDALggl0MTg1LnRlc3QwC4IJ\ndDE4Ni50ZXN0MAuCCXQxODcudGVzdDALggl0MTg4LnRlc3QwC4IJdDE4OS50ZXN0\nMAuCCXQxOTAudGVzdDALggl0MTkxLnRlc3QwC4IJdDE5Mi50ZXN0MAuCCXQxOTMu\ndGVzdDALggl0MTk0LnRlc3QwC4IJdDE5NS50ZXN0MAuCCXQxOTYudGVzdDALggl0\nMTk3LnRlc3QwC4IJdDE5OC50ZXN0MAuCCXQxOTkudGVzdDALggl0MjAwLnRlc3Qw\nC4IJdDIwMS50ZXN0MAuCCXQyMDIudGVzdDALggl0MjAzLnRlc3QwC4IJdDIwNC50\nZXN0MAuCCXQyMDUudGVzdDALggl0MjA2LnRlc3QwC4IJdDIwNy50ZXN0MAuCCXQy\nMDgudGVzdDALggl0MjA5LnRlc3QwC4IJdDIxMC50ZXN0MAuCCXQyMTEudGVzdDAL\nggl0MjEyLnRlc3QwC4IJdDIxMy50ZXN0MAuCCXQyMTQudGVzdDALggl0MjE1LnRl\nc3QwC4IJdDIxNi50ZXN0MAuCCXQyMTcudGVzdDALggl0MjE4LnRlc3QwC4IJdDIx\nOS50ZXN0MAuCCXQyMjAudGVzdDALggl0MjIxLnRlc3QwC4IJdDIyMi50ZXN0MAuC\nCXQyMjMudGVzdDALggl0MjI0LnRlc3QwC4IJdDIyNS50ZXN0MAuCCXQyMjYudGVz\ndDALggl0MjI3LnRlc3QwC4IJdDIyOC50ZXN0MAuCCXQyMjkudGVzdDALggl0MjMw\nLnRlc3QwC4IJdDIzMS50ZXN0MAuCCXQyMzIudGVzdDALggl0MjMzLnRlc3QwC4IJ\ndDIzNC50ZXN0MAuCCXQyMzUudGVzdDALggl0MjM2LnRlc3QwC4IJdDIzNy50ZXN0\nMAuCCXQyMzgudGVzdDALggl0MjM5LnRlc3QwC4IJdDI0MC50ZXN0MAuCCXQyNDEu\ndGVzdDALggl0MjQyLnRlc3QwC4IJdDI0My50ZXN0MAuCCXQyNDQudGVzdDALggl0\nMjQ1LnRlc3QwC4IJdDI0Ni50ZXN0MAuCCXQyNDcudGVzdDALggl0MjQ4LnRlc3Qw\nC4IJdDI0OS50ZXN0MAuCCXQyNTAudGVzdDALggl0MjUxLnRlc3QwC4IJdDI1Mi50\nZXN0MAuCCXQyNTMudGVzdDALggl0MjU0LnRlc3QwC4IJdDI1NS50ZXN0MAuCCXQy\nNTYudGVzdDALggl0MjU3LnRlc3QwC4IJdDI1OC50ZXN0MAuCCXQyNTkudGVzdDAL\nggl0MjYwLnRlc3QwC4IJdDI2MS50ZXN0MAuCCXQyNjIudGVzdDALggl0MjYzLnRl\nc3QwC4IJdDI2NC50ZXN0MAuCCXQyNjUudGVzdDALggl0MjY2LnRlc3QwC4IJdDI2\nNy50ZXN0MAuCCXQyNjgudGVzdDALggl0MjY5LnRlc3QwC4IJdDI3MC50ZXN0MAuC\nCXQyNzEudGVzdDALggl0MjcyLnRlc3QwC4IJdDI3My50ZXN0MAuCCXQyNzQudGVz\ndDALggl0Mjc1LnRlc3QwC4IJdDI3Ni50ZXN0MAuCCXQyNzcudGVzdDALggl0Mjc4\nLnRlc3QwC4IJdDI3OS50ZXN0MAuCCXQyODAudGVzdDALggl0MjgxLnRlc3QwC4IJ\ndDI4Mi50ZXN0MAuCCXQyODMudGVzdDALggl0Mjg0LnRlc3QwC4IJdDI4NS50ZXN0\nMAuCCXQyODYudGVzdDALggl0Mjg3LnRlc3QwC4IJdDI4OC50ZXN0MAuCCXQyODku\ndGVzdDALggl0MjkwLnRlc3QwC4IJdDI5MS50ZXN0MAuCCXQyOTIudGVzdDALggl0\nMjkzLnRlc3QwC4IJdDI5NC50ZXN0MAuCCXQyOTUudGVzdDALggl0Mjk2LnRlc3Qw\nC4IJdDI5Ny50ZXN0MAuCCXQyOTgudGVzdDALggl0Mjk5LnRlc3QwC4IJdDMwMC50\nZXN0MAuCCXQzMDEudGVzdDALggl0MzAyLnRlc3QwC4IJdDMwMy50ZXN0MAuCCXQz\nMDQudGVzdDALggl0MzA1LnRlc3QwC4IJdDMwNi50ZXN0MAuCCXQzMDcudGVzdDAL\nggl0MzA4LnRlc3QwC4IJdDMwOS50ZXN0MAuCCXQzMTAudGVzdDALggl0MzExLnRl\nc3QwC4IJdDMxMi50ZXN0MAuCCXQzMTMudGVzdDALggl0MzE0LnRlc3QwC4IJdDMx\nNS50ZXN0MAuCCXQzMTYudGVzdDALggl0MzE3LnRlc3QwC4IJdDMxOC50ZXN0MAuC\nCXQzMTkudGVzdDALggl0MzIwLnRlc3QwC4IJdDMyMS50ZXN0MAuCCXQzMjIudGVz\ndDALggl0MzIzLnRlc3QwC4IJdDMyNC50ZXN0MAuCCXQzMjUudGVzdDALggl0MzI2\nLnRlc3QwC4IJdDMyNy50ZXN0MAuCCXQzMjgudGVzdDALggl0MzI5LnRlc3QwC4IJ\ndDMzMC50ZXN0MAuCCXQzMzEudGVzdDALggl0MzMyLnRlc3QwC4IJdDMzMy50ZXN0\nMAuCCXQzMzQudGVzdDALggl0MzM1LnRlc3QwC4IJdDMzNi50ZXN0MAuCCXQzMzcu\ndGVzdDALggl0MzM4LnRlc3QwC4IJdDMzOS50ZXN0MAuCCXQzNDAudGVzdDALggl0\nMzQxLnRlc3QwC4IJdDM0Mi50ZXN0MAuCCXQzNDMudGVzdDALggl0MzQ0LnRlc3Qw\nC4IJdDM0NS50ZXN0MAuCCXQzNDYudGVzdDALggl0MzQ3LnRlc3QwC4IJdDM0OC50\nZXN0MAuCCXQzNDkudGVzdDALggl0MzUwLnRlc3QwC4IJdDM1MS50ZXN0MAuCCXQz\nNTIudGVzdDALggl0MzUzLnRlc3QwC4IJdDM1NC50ZXN0MAuCCXQzNTUudGVzdDAL\nggl0MzU2LnRlc3QwC4IJdDM1Ny50ZXN0MAuCCXQzNTgudGVzdDALggl0MzU5LnRl\nc3QwC4IJdDM2MC50ZXN0MAuCCXQzNjEudGVzdDALggl0MzYyLnRlc3QwC4IJdDM2\nMy50ZXN0MAuCCXQzNjQudGVzdDALggl0MzY1LnRlc3QwC4IJdDM2Ni50ZXN0MAuC\nCXQzNjcudGVzdDALggl0MzY4LnRlc3QwC4IJdDM2OS50ZXN0MAuCCXQzNzAudGVz\ndDALggl0MzcxLnRlc3QwC4IJdDM3Mi50ZXN0MAuCCXQzNzMudGVzdDALggl0Mzc0\nLnRlc3QwC4IJdDM3NS50ZXN0MAuCCXQzNzYudGVzdDALggl0Mzc3LnRlc3QwC4IJ\ndDM3OC50ZXN0MAuCCXQzNzkudGVzdDALggl0MzgwLnRlc3QwC4IJdDM4MS50ZXN0\nMAuCCXQzODIudGVzdDALggl0MzgzLnRlc3QwC4IJdDM4NC50ZXN0MAuCCXQzODUu\ndGVzdDALggl0Mzg2LnRlc3QwC4IJdDM4Ny50ZXN0MAuCCXQzODgudGVzdDALggl0\nMzg5LnRlc3QwC4IJdDM5MC50ZXN0MAuCCXQzOTEudGVzdDALggl0MzkyLnRlc3Qw\nC4IJdDM5My50ZXN0MAuCCXQzOTQudGVzdDALggl0Mzk1LnRlc3QwC4IJdDM5Ni50\nZXN0MAuCCXQzOTcudGVzdDALggl0Mzk4LnRlc3QwC4IJdDM5OS50ZXN0MAuCCXQ0\nMDAudGVzdDALggl0NDAxLnRlc3QwC4IJdDQwMi50ZXN0MAuCCXQ0MDMudGVzdDAL\nggl0NDA0LnRlc3QwC4IJdDQwNS50ZXN0MAuCCXQ0MDYudGVzdDALggl0NDA3LnRl\nc3QwC4IJdDQwOC50ZXN0MAuCCXQ0MDkudGVzdDALggl0NDEwLnRlc3QwC4IJdDQx\nMS50ZXN0MAuCCXQ0MTIudGVzdDALggl0NDEzLnRlc3QwC4IJdDQxNC50ZXN0MAuC\nCXQ0MTUudGVzdDALggl0NDE2LnRlc3QwC4IJdDQxNy50ZXN0MAuCCXQ0MTgudGVz\ndDALggl0NDE5LnRlc3QwC4IJdDQyMC50ZXN0MAuCCXQ0MjEudGVzdDALggl0NDIy\nLnRlc3QwC4IJdDQyMy50ZXN0MAuCCXQ0MjQudGVzdDALggl0NDI1LnRlc3QwC4IJ\ndDQyNi50ZXN0MAuCCXQ0MjcudGVzdDALggl0NDI4LnRlc3QwC4IJdDQyOS50ZXN0\nMAuCCXQ0MzAudGVzdDALggl0NDMxLnRlc3QwC4IJdDQzMi50ZXN0MAuCCXQ0MzMu\ndGVzdDALggl0NDM0LnRlc3QwC4IJdDQzNS50ZXN",
     "0MAuCCXQ0MzYudGVzdDALggl0\nNDM3LnRlc3QwC4IJdDQzOC50ZXN0MAuCCXQ0MzkudGVzdDALggl0NDQwLnRlc3Qw\nC4IJdDQ0MS50ZXN0MAuCCXQ0NDIudGVzdDALggl0NDQzLnRlc3QwC4IJdDQ0NC50\nZXN0MAuCCXQ0NDUudGVzdDALggl0NDQ2LnRlc3QwC4IJdDQ0Ny50ZXN0MAuCCXQ0\nNDgudGVzdDALggl0NDQ5LnRlc3QwC4IJdDQ1MC50ZXN0MAuCCXQ0NTEudGVzdDAL\nggl0NDUyLnRlc3QwC4IJdDQ1My50ZXN0MAuCCXQ0NTQudGVzdDALggl0NDU1LnRl\nc3QwC4IJdDQ1Ni50ZXN0MAuCCXQ0NTcudGVzdDALggl0NDU4LnRlc3QwC4IJdDQ1\nOS50ZXN0MAuCCXQ0NjAudGVzdDALggl0NDYxLnRlc3QwC4IJdDQ2Mi50ZXN0MAuC\nCXQ0NjMudGVzdDALggl0NDY0LnRlc3QwC4IJdDQ2NS50ZXN0MAuCCXQ0NjYudGVz\ndDALggl0NDY3LnRlc3QwC4IJdDQ2OC50ZXN0MAuCCXQ0NjkudGVzdDALggl0NDcw\nLnRlc3QwC4IJdDQ3MS50ZXN0MAuCCXQ0NzIudGVzdDALggl0NDczLnRlc3QwC4IJ\ndDQ3NC50ZXN0MAuCCXQ0NzUudGVzdDALggl0NDc2LnRlc3QwC4IJdDQ3Ny50ZXN0\nMAuCCXQ0NzgudGVzdDALggl0NDc5LnRlc3QwC4IJdDQ4MC50ZXN0MAuCCXQ0ODEu\ndGVzdDALggl0NDgyLnRlc3QwC4IJdDQ4My50ZXN0MAuCCXQ0ODQudGVzdDALggl0\nNDg1LnRlc3QwC4IJdDQ4Ni50ZXN0MAuCCXQ0ODcudGVzdDALggl0NDg4LnRlc3Qw\nC4IJdDQ4OS50ZXN0MAuCCXQ0OTAudGVzdDALggl0NDkxLnRlc3QwC4IJdDQ5Mi50\nZXN0MAuCCXQ0OTMudGVzdDALggl0NDk0LnRlc3QwC4IJdDQ5NS50ZXN0MAuCCXQ0\nOTYudGVzdDALggl0NDk3LnRlc3QwC4IJdDQ5OC50ZXN0MAuCCXQ0OTkudGVzdDAL\nggl0NTAwLnRlc3QwC4IJdDUwMS50ZXN0MAuCCXQ1MDIudGVzdDALggl0NTAzLnRl\nc3QwC4IJdDUwNC50ZXN0MAuCCXQ1MDUudGVzdDALggl0NTA2LnRlc3QwC4IJdDUw\nNy50ZXN0MAuCCXQ1MDgudGVzdDALggl0NTA5LnRlc3QwC4IJdDUxMC50ZXN0MAuC\nCXQ1MTEudGVzdDALggl0NTEyLnRlc3QwB4IFLnRlc3ShghmfMAmCB3gwLnRlc3Qw\nCYIHeDEudGVzdDAJggd4Mi50ZXN0MAmCB3gzLnRlc3QwCYIHeDQudGVzdDAJggd4\nNS50ZXN0MAmCB3g2LnRlc3QwCYIHeDcudGVzdDAJggd4OC50ZXN0MAmCB3g5LnRl\nc3QwCoIIeDEwLnRlc3QwCoIIeDExLnRlc3QwCoIIeDEyLnRlc3QwCoIIeDEzLnRl\nc3QwCoIIeDE0LnRlc3QwCoIIeDE1LnRlc3QwCoIIeDE2LnRlc3QwCoIIeDE3LnRl\nc3QwCoIIeDE4LnRlc3QwCoIIeDE5LnRlc3QwCoIIeDIwLnRlc3QwCoIIeDIxLnRl\nc3QwCoIIeDIyLnRlc3QwCoIIeDIzLnRlc3QwCoIIeDI0LnRlc3QwCoIIeDI1LnRl\nc3QwCoIIeDI2LnRlc3QwCoIIeDI3LnRlc3QwCoIIeDI4LnRlc3QwCoIIeDI5LnRl\nc3QwCoIIeDMwLnRlc3QwCoIIeDMxLnRlc3QwCoIIeDMyLnRlc3QwCoIIeDMzLnRl\nc3QwCoIIeDM0LnRlc3QwCoIIeDM1LnRlc3QwCoIIeDM2LnRlc3QwCoIIeDM3LnRl\nc3QwCoIIeDM4LnRlc3QwCoIIeDM5LnRlc3QwCoIIeDQwLnRlc3QwCoIIeDQxLnRl\nc3QwCoIIeDQyLnRlc3QwCoIIeDQzLnRlc3QwCoIIeDQ0LnRlc3QwCoIIeDQ1LnRl\nc3QwCoIIeDQ2LnRlc3QwCoIIeDQ3LnRlc3QwCoIIeDQ4LnRlc3QwCoIIeDQ5LnRl\nc3QwCoIIeDUwLnRlc3QwCoIIeDUxLnRlc3QwCoIIeDUyLnRlc3QwCoIIeDUzLnRl\nc3QwCoIIeDU0LnRlc3QwCoIIeDU1LnRlc3QwCoIIeDU2LnRlc3QwCoIIeDU3LnRl\nc3QwCoIIeDU4LnRlc3QwCoIIeDU5LnRlc3QwCoIIeDYwLnRlc3QwCoIIeDYxLnRl\nc3QwCoIIeDYyLnRlc3QwCoIIeDYzLnRlc3QwCoIIeDY0LnRlc3QwCoIIeDY1LnRl\nc3QwCoIIeDY2LnRlc3QwCoIIeDY3LnRlc3QwCoIIeDY4LnRlc3QwCoIIeDY5LnRl\nc3QwCoIIeDcwLnRlc3QwCoIIeDcxLnRlc3QwCoIIeDcyLnRlc3QwCoIIeDczLnRl\nc3QwCoIIeDc0LnRlc3QwCoIIeDc1LnRlc3QwCoIIeDc2LnRlc3QwCoIIeDc3LnRl\nc3QwCoIIeDc4LnRlc3QwCoIIeDc5LnRlc3QwCoIIeDgwLnRlc3QwCoIIeDgxLnRl\nc3QwCoIIeDgyLnRlc3QwCoIIeDgzLnRlc3QwCoIIeDg0LnRlc3QwCoIIeDg1LnRl\nc3QwCoIIeDg2LnRlc3QwCoIIeDg3LnRlc3QwCoIIeDg4LnRlc3QwCoIIeDg5LnRl\nc3QwCoIIeDkwLnRlc3QwCoIIeDkxLnRlc3QwCoIIeDkyLnRlc3QwCoIIeDkzLnRl\nc3QwCoIIeDk0LnRlc3QwCoIIeDk1LnRlc3QwCoIIeDk2LnRlc3QwCoIIeDk3LnRl\nc3QwCoIIeDk4LnRlc3QwCoIIeDk5LnRlc3QwC4IJeDEwMC50ZXN0MAuCCXgxMDEu\ndGVzdDALggl4MTAyLnRlc3QwC4IJeDEwMy50ZXN0MAuCCXgxMDQudGVzdDALggl4\nMTA1LnRlc3QwC4IJeDEwNi50ZXN0MAuCCXgxMDcudGVzdDALggl4MTA4LnRlc3Qw\nC4IJeDEwOS50ZXN0MAuCCXgxMTAudGVzdDALggl4MTExLnRlc3QwC4IJeDExMi50\nZXN0MAuCCXgxMTMudGVzdDALggl4MTE0LnRlc3QwC4IJeDExNS50ZXN0MAuCCXgx\nMTYudGVzdDALggl4MTE3LnRlc3QwC4IJeDExOC50ZXN0MAuCCXgxMTkudGVzdDAL\nggl4MTIwLnRlc3QwC4IJeDEyMS50ZXN0MAuCCXgxMjIudGVzdDALggl4MTIzLnRl\nc3QwC4IJeDEyNC50ZXN0MAuCCXgxMjUudGVzdDALggl4MTI2LnRlc3QwC4IJeDEy\nNy50ZXN0MAuCCXgxMjgudGVzdDALggl4MTI5LnRlc3QwC4IJeDEzMC50ZXN0MAuC\nCXgxMzEudGVzdDALggl4MTMyLnRlc3QwC4IJeDEzMy50ZXN0MAuCCXgxMzQudGVz\ndDALggl4MTM1LnRlc3QwC4IJeDEzNi50ZXN0MAuCCXgxMzcudGVzdDALggl4MTM4\nLnRlc3QwC4IJeDEzOS50ZXN0MAuCCXgxNDAudGVzdDALggl4MTQxLnRlc3QwC4IJ\neDE0Mi50ZXN0MAuCCXgxNDMudGVzdDALggl4MTQ0LnRlc3QwC4IJeDE0NS50ZXN0\nMAuCCXgxNDYudGVzdDALggl4MTQ3LnRlc3QwC4IJeDE0OC50ZXN0MAuCCXgxNDku\ndGVzdDALggl4MTUwLnRlc3QwC4IJeDE1MS50ZXN0MAuCCXgxNTIudGVzdDALggl4\nMTUzLnRlc3QwC4IJeDE1NC50ZXN0MAuCCXgxNTUudGVzdDALggl4MTU2LnRlc3Qw\nC4IJeDE1Ny50ZXN0MAuCCXgxNTgudGVzdDALggl4MTU5LnRlc3QwC4IJeDE2MC50\nZXN0MAuCCXgxNjEudGVzdDALggl4MTYyLnRlc3QwC4IJeDE2My50ZXN0MAuCCXgx\nNjQudGVzdDALggl4MTY1LnRlc3QwC4IJeDE2Ni50ZXN0MAuCCXgxNjcudGVzdDAL\nggl4MTY4LnRlc3QwC4IJeDE2OS50ZXN0MAuCCXgxNzAudGVzdDALggl4MTcxLnRl\nc3QwC4IJeDE3Mi50ZXN0MAuCCXgxNzMudGVzdDALggl4MTc0LnRlc3QwC4IJeDE3\nNS50ZXN0MAuCCXgxNzYudGVzdDALggl4MTc3LnRlc3QwC4IJeDE3OC50ZXN0MAuC\nCXgxNzkudGVzdDALggl4MTgwLnRlc3QwC4IJeDE4MS50ZXN0MAuCCXgxODIudGVz\ndDALggl4MTgzLnRlc3QwC4IJeDE4NC50ZXN0MAuCCXgxODUudGVzdDALggl4MTg2\nLnRlc3QwC4IJeDE4Ny50ZXN0MAuCCXgxODgudGVzdDALggl4MTg5LnRlc3QwC4IJ\neDE5MC50ZXN0MAuCCXgxOTEudGVzdDALggl4MTkyLnRlc3QwC4IJeDE5My50ZXN0\nMAuCCXgxOTQudGVzdDALggl4MTk1LnRlc3QwC4IJeDE5Ni50ZXN0MAuCCXgxOTcu\ndGVzdDALggl4MTk4LnRlc3QwC4IJeDE5OS50ZXN0MAuCCXgyMDAudGVzdDALggl4\nMjAxLnRlc3QwC4IJeDIwMi50ZXN0MAuCCXgyMDMudGVzdDALggl4MjA0LnRlc3Qw\nC4IJeDIwNS50ZXN0MAuCCXgyMDYudGVzdDALggl4MjA3LnRlc3QwC4IJeDIwOC50\nZXN0MAuCCXgyMDkudGVzdDALggl4MjEwLnRlc3QwC4IJeDIxMS50ZXN0MAuCCXgy\nMTIudGVzdDALggl4MjEzLnRlc3QwC4IJeDIxNC50ZXN0MAuCCXgyMTUudGVzdDAL\nggl4MjE2LnRlc3QwC4IJeDIxNy50ZXN0MAuCCXgyMTgudGVzdDALggl4MjE5LnRl\nc3QwC4IJeDIyMC50ZXN0MAuCCXgyMjEudGVzdDALggl4MjIyLnRlc3QwC4IJeDIy\nMy50ZXN0MAuCCXgyMjQudGVzdDALggl4MjI1LnRlc3QwC4IJeDIyNi50ZXN0MAuC\nCXgyMjcudGVzdDALggl4MjI4LnRlc3QwC4IJeDIyOS50ZXN0MAuCCXgyMzAudGVz\ndDALggl4MjMxLnRlc3QwC4IJeDIzMi50ZXN0MAuCCXgyMzMudGVzdDALggl4MjM0\nLnRlc3QwC4IJeDIzNS50ZXN0MAuCCXgyMzYudGVzdDALggl4MjM3LnRlc3QwC4IJ\neDIzOC50ZXN0MAuCCXgyMzkudGVzdDALggl4MjQwLnRlc3QwC4IJeDI0MS50ZXN0\nMAuCCXgyNDIudGVzdDALggl4MjQzLnRlc3QwC4IJeDI0NC50ZXN0MAuCCXgyNDUu\ndGVzdDALggl4MjQ2LnRlc3QwC4IJeDI0Ny50ZXN0MAuCCXgyNDgudGVzdDALggl4\nMjQ5LnRlc3QwC4IJeDI1MC50ZXN0MAuCCXgyNTEudGVzdDALggl4MjUyLnRlc3Qw\nC4IJeDI1My50ZXN0MAuCCXgyNTQudGVzdDALggl4MjU1LnRlc3QwC4IJeDI1Ni50\nZXN0MAuCCXgyNTcudGVzdDALggl4MjU4LnRlc3QwC4IJeDI1OS50ZXN0MAuCCXgy\nNjAudGVzdDALggl4MjYxLnRlc3QwC4IJeDI2Mi50ZXN0MAuCCXgyNjMudGVzdDAL\nggl4MjY0LnRlc3QwC4IJeDI2NS50ZXN0MAuCCXgyNjYudGVzdDALggl4MjY3LnRl\nc3QwC4IJeDI2OC50ZXN0MAuCCXgyNjkudGVzdDALggl4MjcwLnRlc3QwC4IJeDI3\nMS50ZXN0MAuCCXgyNzIudGVzdDALggl4MjczLnRlc3QwC4IJeDI3NC50ZXN0MAuC\nCXgyNzUudGVzdDALggl4Mjc2LnRlc3QwC4IJeDI3Ny50ZXN0MAuCCXgyNzgudGVz\ndDALggl4Mjc5LnRlc3QwC4IJeDI4MC50ZXN0MAuCCXgyODEudGVzdDALggl4Mjgy\nLnRlc3QwC4IJeDI4My50ZXN0MAuCCXgyODQudGVzdDALggl4Mjg1LnRlc3QwC4IJ\neDI4Ni50ZXN0MAuCCXgyODcudGVzdDALggl4Mjg4LnRlc3QwC4IJeDI4OS50ZXN0\nMAuCCXgyOTAudGVzdDALggl4MjkxLnRlc3QwC4IJeDI5Mi50ZXN0MAuCCXgyOTMu\ndGVzdDALggl4Mjk0LnRlc3QwC4IJeDI5NS50ZXN0MAuCCXgyOTYudGVzdDALggl4\nMjk3LnRlc3QwC4IJeDI5OC50ZXN0MAuCCXgyOTkudGVzdDALggl4MzAwLnRlc3Qw\nC4IJeDMwMS50ZXN0MAuCCXgzMDIudGVzdDALggl4MzAzLnRlc3QwC4IJeDMwNC50\nZXN0MAuCCXgzMDUudGVzdDALggl4MzA2LnRlc3QwC4IJeDMwNy50ZXN0MAuCCXgz\nMDgudGVzdDALggl4MzA5LnRlc3QwC4IJeDMxMC50ZXN0MAuCCXgzMTEudGVzdDAL\nggl4MzEyLnRlc3QwC4IJeDMxMy50ZXN0MAuCCXgzMTQudGVzdDALggl4MzE1LnRl\nc3QwC4IJeDMxNi50ZXN0MAuCCXgzMTcudGVzdDALggl4MzE4LnRlc3QwC4IJeDMx\nOS50ZXN0MAuCCXgzMjAudGVzdDALggl4MzIxLnRlc3QwC4IJeDMyMi50ZXN0MAuC\nCXgzMjMudGVzdDALggl4MzI0LnRlc3QwC4IJeDMyNS50ZXN0MAuCCXgzMjYudGVz\ndDALggl4MzI3LnRlc3QwC4IJeDMyOC50ZXN0MAuCCXgzMjkudGVzdDALggl4MzMw\nLnRlc3QwC4IJeDMzMS50ZXN0MAuCCXgzMzIudGVzdDALggl4MzMzLnRlc3QwC4IJ\neDMzNC50ZXN0MAuCCXgzMzUudGVzdDALggl4MzM2LnRlc3QwC4IJeDMzNy50ZXN0\nMAuCCXgzMzgudGVzdDALggl4MzM5LnRlc3QwC4IJeDM0MC50ZXN0MAuCCXgzNDEu\ndGVzdDALggl4MzQyLnRlc3QwC4IJeDM0My50ZXN0MAuCCXgzNDQudGVzdDALggl4\nMzQ1LnRlc3QwC4IJeDM0Ni50ZXN0MAuCCXgzNDcudGVzdDALggl4MzQ4LnRlc3Qw\nC4IJeDM0OS50ZXN0MAuCCXgzNTAudGVzdDALggl4MzUxLnRlc3QwC4IJeDM1Mi50\nZXN0MAuCCXgzNTMudGVzdDALggl4MzU0LnRlc3QwC4IJeDM1NS50ZXN0MAuCCXgz\nNTYudGVzdDALggl4MzU3LnRlc3QwC4IJeDM1OC50ZXN0MAuCCXgzNTkudGVzdDAL\nggl4MzYwLnRlc3QwC4IJeDM2MS50ZXN0MAuCCXgzNjIudGVzdDALggl4MzYzLnRl\nc3QwC4IJeDM2NC50ZXN0MAuCCXgzNjUudGVzdDALggl4MzY2LnRlc3QwC4IJeDM2\nNy50ZXN0MAuCCXgzNjgudGVzdDALggl4MzY5LnRlc3QwC4IJeDM3MC50ZXN0MAuC\nCXgzNzEudGVzdDALggl4MzcyLnRlc3QwC4IJeDM3My50ZXN0MAuCCXgzNzQudGVz\ndDALggl4Mzc1LnRlc3QwC4IJeDM3Ni50ZXN0MAuCCXgzNzcudGVzdDALggl4Mzc4\nLnRlc3QwC4IJeDM3OS50ZXN0MAuCCXgzODAudGVzdDALggl4MzgxLnRlc3QwC4IJ\neDM4Mi50ZXN0MAuCCXgzODMudGVzdDALggl4Mzg0LnRlc3QwC4IJeDM4NS50ZXN0\nMAuCCXgzODYudGVzdDALggl4Mzg3LnRlc3QwC4IJeDM4OC50ZXN0MAuCCXgzODku\ndGVzdDALggl4MzkwLnRlc3QwC4IJeDM5MS50ZXN0MAuCCXgzOTIudGVzdDALggl4\nMzkzLnRlc3QwC4IJeDM5NC50ZXN0MAuCCXgzOTUud",
     "GVzdDALggl4Mzk2LnRlc3Qw\nC4IJeDM5Ny50ZXN0MAuCCXgzOTgudGVzdDALggl4Mzk5LnRlc3QwC4IJeDQwMC50\nZXN0MAuCCXg0MDEudGVzdDALggl4NDAyLnRlc3QwC4IJeDQwMy50ZXN0MAuCCXg0\nMDQudGVzdDALggl4NDA1LnRlc3QwC4IJeDQwNi50ZXN0MAuCCXg0MDcudGVzdDAL\nggl4NDA4LnRlc3QwC4IJeDQwOS50ZXN0MAuCCXg0MTAudGVzdDALggl4NDExLnRl\nc3QwC4IJeDQxMi50ZXN0MAuCCXg0MTMudGVzdDALggl4NDE0LnRlc3QwC4IJeDQx\nNS50ZXN0MAuCCXg0MTYudGVzdDALggl4NDE3LnRlc3QwC4IJeDQxOC50ZXN0MAuC\nCXg0MTkudGVzdDALggl4NDIwLnRlc3QwC4IJeDQyMS50ZXN0MAuCCXg0MjIudGVz\ndDALggl4NDIzLnRlc3QwC4IJeDQyNC50ZXN0MAuCCXg0MjUudGVzdDALggl4NDI2\nLnRlc3QwC4IJeDQyNy50ZXN0MAuCCXg0MjgudGVzdDALggl4NDI5LnRlc3QwC4IJ\neDQzMC50ZXN0MAuCCXg0MzEudGVzdDALggl4NDMyLnRlc3QwC4IJeDQzMy50ZXN0\nMAuCCXg0MzQudGVzdDALggl4NDM1LnRlc3QwC4IJeDQzNi50ZXN0MAuCCXg0Mzcu\ndGVzdDALggl4NDM4LnRlc3QwC4IJeDQzOS50ZXN0MAuCCXg0NDAudGVzdDALggl4\nNDQxLnRlc3QwC4IJeDQ0Mi50ZXN0MAuCCXg0NDMudGVzdDALggl4NDQ0LnRlc3Qw\nC4IJeDQ0NS50ZXN0MAuCCXg0NDYudGVzdDALggl4NDQ3LnRlc3QwC4IJeDQ0OC50\nZXN0MAuCCXg0NDkudGVzdDALggl4NDUwLnRlc3QwC4IJeDQ1MS50ZXN0MAuCCXg0\nNTIudGVzdDALggl4NDUzLnRlc3QwC4IJeDQ1NC50ZXN0MAuCCXg0NTUudGVzdDAL\nggl4NDU2LnRlc3QwC4IJeDQ1Ny50ZXN0MAuCCXg0NTgudGVzdDALggl4NDU5LnRl\nc3QwC4IJeDQ2MC50ZXN0MAuCCXg0NjEudGVzdDALggl4NDYyLnRlc3QwC4IJeDQ2\nMy50ZXN0MAuCCXg0NjQudGVzdDALggl4NDY1LnRlc3QwC4IJeDQ2Ni50ZXN0MAuC\nCXg0NjcudGVzdDALggl4NDY4LnRlc3QwC4IJeDQ2OS50ZXN0MAuCCXg0NzAudGVz\ndDALggl4NDcxLnRlc3QwC4IJeDQ3Mi50ZXN0MAuCCXg0NzMudGVzdDALggl4NDc0\nLnRlc3QwC4IJeDQ3NS50ZXN0MAuCCXg0NzYudGVzdDALggl4NDc3LnRlc3QwC4IJ\neDQ3OC50ZXN0MAuCCXg0NzkudGVzdDALggl4NDgwLnRlc3QwC4IJeDQ4MS50ZXN0\nMAuCCXg0ODIudGVzdDALggl4NDgzLnRlc3QwC4IJeDQ4NC50ZXN0MAuCCXg0ODUu\ndGVzdDALggl4NDg2LnRlc3QwC4IJeDQ4Ny50ZXN0MAuCCXg0ODgudGVzdDALggl4\nNDg5LnRlc3QwC4IJeDQ5MC50ZXN0MAuCCXg0OTEudGVzdDALggl4NDkyLnRlc3Qw\nC4IJeDQ5My50ZXN0MAuCCXg0OTQudGVzdDALggl4NDk1LnRlc3QwC4IJeDQ5Ni50\nZXN0MAuCCXg0OTcudGVzdDALggl4NDk4LnRlc3QwC4IJeDQ5OS50ZXN0MAuCCXg1\nMDAudGVzdDALggl4NTAxLnRlc3QwC4IJeDUwMi50ZXN0MAuCCXg1MDMudGVzdDAL\nggl4NTA0LnRlc3QwC4IJeDUwNS50ZXN0MAuCCXg1MDYudGVzdDALggl4NTA3LnRl\nc3QwC4IJeDUwOC50ZXN0MAuCCXg1MDkudGVzdDALggl4NTEwLnRlc3QwC4IJeDUx\nMS50ZXN0MAuCCXg1MTIudGVzdDANBgkqhkiG9w0BAQsFAAOCAQEAL2zj4W3+BzBa\nUA0pBD3K5mXq5H94uVT3YFiS1Yrrv1aGJjnb9iabNjdPNRFq7eBm1OajFTv8UtE/\nWJR0JDvBTs7yvpOgTy+JY9RY8NP72gdOOvpZ3DbJ0bbSUFqBVQlM8771Mz9RVQX9\ni9oCqVkakKI/9guAU2XHx9ztTB6N3mULB3QkeFmlyrqeeVK/2lFErArRxyKQXjxb\ncfD76JGADWpp6p1/QUGYmPNYGxHMtWzAhzX1zs/OdGwVVX7g6xxfFdOw0z2PVSPL\notKS5E3GWvqe43Edz3D6AI7jp6ibtH32HX/D4lLLd9nSiQURvJJ0nrMYZI+7p1DE\n6BsnsA2jNg==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen92 = 26473;
+static const size_t kLen93 = 26473;
 
-static const char *kData92[] = {
+static const char *kData93[] = {
     "-----BEGIN CERTIFICATE-----\nMIJMMTCCSxmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowgjO+MRAwDgYDVQQDEwd0\nMC50ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nMUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nM0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nNUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nN0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0OEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nOUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTBAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDExQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxMkB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0MTNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDE0QHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQxNUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTZAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDE3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxOEB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0MTlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDIwQHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQyMUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjJAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDIzQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQyNEB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0MjVAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDI2QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQyN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjhAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDI5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzMEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDMy\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzM0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nMzRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDM1QHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQzNkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzdAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDM4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzOUB0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0NDBAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQxQHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ0MkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDNAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDQ0QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ0NUB0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0NDZAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQ3QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ0OEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDlAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDUwQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1MUB0ZXN0\nMRcwFQYJKoZIhvcNAQkBFgh0NTJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDUzQHRl\nc3QxFzAVBgkqhkiG9w0BCQEWCHQ1NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NTVA\ndGVzdDEXMBUGCSqGSIb3DQEJARYIdDU2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1\nN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NThAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDU5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2MEB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0NjFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDYyQHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQ2M0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NjRAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDY1QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2NkB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0NjdAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDY4QHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQ2OUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzBAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDcxQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3MkB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0NzNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDc0QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQ3NUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzZAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDc3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3OEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgw\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4MUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nODJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgzQHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQ4NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0ODVAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDg2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4N0B0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0ODhAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDg5QHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ5MEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTFAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDkyQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5M0B0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0OTRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDk1QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ5NkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTdAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDk4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTAwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTAzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEwNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTA2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTA5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDExMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTEyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEx\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTE1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxMTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDExN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTE4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDEyMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTIxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxMjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTI0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTI3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEyOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTMwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEzMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTMzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDEzNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEz\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTQyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE0NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTQ1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTQ4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTUxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE1M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTU0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTU3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE1OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTY2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE2OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTY5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTcyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTc1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE3N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTc4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTgxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxODJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE4M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxODVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxODhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTkwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE5MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTkzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxOTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTk2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTk5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIwMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjAyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIwNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjA1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIwN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjA4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIx\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjExQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjE0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDIxNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjE3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyMThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjIwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjIzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIyNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjI2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjI5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIzMUB0ZXN0MRgwFgY",
     "JKoZIhvcNAQkBFgl0MjMyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIz\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjM1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIzN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjM4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI0MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjQxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjQ0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI0OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjUwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjUzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI1NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyNjBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjYyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI2NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjY1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNjZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjY4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjcxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI3M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjc0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNzVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mjc3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzhAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI3OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyODFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyODRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0Mjg2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyODdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI4OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjg5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyOTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjkyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjk1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI5N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjk4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyOTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzAxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMwM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMw\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMDhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzEwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMxMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzEzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzE2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzE5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDMyMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzIyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzMjNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMyNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzI1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMyN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzI4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMz\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzMxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMzJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzM0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMzVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMzNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzM3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMzhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzQwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzQzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM0NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzQ2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzQ5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM1MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzUyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzU1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzNTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzU4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM2MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzYxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzNjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzY0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzY3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM2OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzcwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzczQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM3NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzODBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzgyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM4NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzg1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzODZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0Mzg4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzkxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM5M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzk0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzOTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mzk3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM5OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQw\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MDRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQwNUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDA2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQwOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDA5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxMUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDEyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDE1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQxN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDE4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0MTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDIxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQyM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQy\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MjhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDMwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQzMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDMzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MzRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDM2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDM5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ0MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ0NEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDQ1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ0N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQ4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDUxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1M0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDU0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ1NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDU3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0NThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDYwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDYzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjRAd",
     "GVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ2NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDY2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDY5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ3MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDcyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDc1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDc4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ4MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDgxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0ODJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDg0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDg3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ4OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDkwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0OTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDkzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ5NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1MDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwMUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTAyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDUwNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTA1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1MDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwN0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTA4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDUxMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTExQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MTJAdGVzdDCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmK\nM+EKbcMue/hFrLGQXB6a2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4o\nBEiEhBxIsaIlws3qQa4baeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0\nvIqPfad5amdQJMvmjZXDI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+\ndFPM2/5kc2HiLNkeuS1Hbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3F\nMSaDK9T0zoJ5hE9fViR+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAAaOCFeUwghXh\nMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8E\nAjAAMIIVqgYDVR0RBIIVoTCCFZ2CB3QwLnRlc3SCB3QxLnRlc3SCB3QyLnRlc3SC\nB3QzLnRlc3SCB3Q0LnRlc3SCB3Q1LnRlc3SCB3Q2LnRlc3SCB3Q3LnRlc3SCB3Q4\nLnRlc3SCB3Q5LnRlc3SCCHQxMC50ZXN0ggh0MTEudGVzdIIIdDEyLnRlc3SCCHQx\nMy50ZXN0ggh0MTQudGVzdIIIdDE1LnRlc3SCCHQxNi50ZXN0ggh0MTcudGVzdIII\ndDE4LnRlc3SCCHQxOS50ZXN0ggh0MjAudGVzdIIIdDIxLnRlc3SCCHQyMi50ZXN0\nggh0MjMudGVzdIIIdDI0LnRlc3SCCHQyNS50ZXN0ggh0MjYudGVzdIIIdDI3LnRl\nc3SCCHQyOC50ZXN0ggh0MjkudGVzdIIIdDMwLnRlc3SCCHQzMS50ZXN0ggh0MzIu\ndGVzdIIIdDMzLnRlc3SCCHQzNC50ZXN0ggh0MzUudGVzdIIIdDM2LnRlc3SCCHQz\nNy50ZXN0ggh0MzgudGVzdIIIdDM5LnRlc3SCCHQ0MC50ZXN0ggh0NDEudGVzdIII\ndDQyLnRlc3SCCHQ0My50ZXN0ggh0NDQudGVzdIIIdDQ1LnRlc3SCCHQ0Ni50ZXN0\nggh0NDcudGVzdIIIdDQ4LnRlc3SCCHQ0OS50ZXN0ggh0NTAudGVzdIIIdDUxLnRl\nc3SCCHQ1Mi50ZXN0ggh0NTMudGVzdIIIdDU0LnRlc3SCCHQ1NS50ZXN0ggh0NTYu\ndGVzdIIIdDU3LnRlc3SCCHQ1OC50ZXN0ggh0NTkudGVzdIIIdDYwLnRlc3SCCHQ2\nMS50ZXN0ggh0NjIudGVzdIIIdDYzLnRlc3SCCHQ2NC50ZXN0ggh0NjUudGVzdIII\ndDY2LnRlc3SCCHQ2Ny50ZXN0ggh0NjgudGVzdIIIdDY5LnRlc3SCCHQ3MC50ZXN0\nggh0NzEudGVzdIIIdDcyLnRlc3SCCHQ3My50ZXN0ggh0NzQudGVzdIIIdDc1LnRl\nc3SCCHQ3Ni50ZXN0ggh0NzcudGVzdIIIdDc4LnRlc3SCCHQ3OS50ZXN0ggh0ODAu\ndGVzdIIIdDgxLnRlc3SCCHQ4Mi50ZXN0ggh0ODMudGVzdIIIdDg0LnRlc3SCCHQ4\nNS50ZXN0ggh0ODYudGVzdIIIdDg3LnRlc3SCCHQ4OC50ZXN0ggh0ODkudGVzdIII\ndDkwLnRlc3SCCHQ5MS50ZXN0ggh0OTIudGVzdIIIdDkzLnRlc3SCCHQ5NC50ZXN0\nggh0OTUudGVzdIIIdDk2LnRlc3SCCHQ5Ny50ZXN0ggh0OTgudGVzdIIIdDk5LnRl\nc3SCCXQxMDAudGVzdIIJdDEwMS50ZXN0ggl0MTAyLnRlc3SCCXQxMDMudGVzdIIJ\ndDEwNC50ZXN0ggl0MTA1LnRlc3SCCXQxMDYudGVzdIIJdDEwNy50ZXN0ggl0MTA4\nLnRlc3SCCXQxMDkudGVzdIIJdDExMC50ZXN0ggl0MTExLnRlc3SCCXQxMTIudGVz\ndIIJdDExMy50ZXN0ggl0MTE0LnRlc3SCCXQxMTUudGVzdIIJdDExNi50ZXN0ggl0\nMTE3LnRlc3SCCXQxMTgudGVzdIIJdDExOS50ZXN0ggl0MTIwLnRlc3SCCXQxMjEu\ndGVzdIIJdDEyMi50ZXN0ggl0MTIzLnRlc3SCCXQxMjQudGVzdIIJdDEyNS50ZXN0\nggl0MTI2LnRlc3SCCXQxMjcudGVzdIIJdDEyOC50ZXN0ggl0MTI5LnRlc3SCCXQx\nMzAudGVzdIIJdDEzMS50ZXN0ggl0MTMyLnRlc3SCCXQxMzMudGVzdIIJdDEzNC50\nZXN0ggl0MTM1LnRlc3SCCXQxMzYudGVzdIIJdDEzNy50ZXN0ggl0MTM4LnRlc3SC\nCXQxMzkudGVzdIIJdDE0MC50ZXN0ggl0MTQxLnRlc3SCCXQxNDIudGVzdIIJdDE0\nMy50ZXN0ggl0MTQ0LnRlc3SCCXQxNDUudGVzdIIJdDE0Ni50ZXN0ggl0MTQ3LnRl\nc3SCCXQxNDgudGVzdIIJdDE0OS50ZXN0ggl0MTUwLnRlc3SCCXQxNTEudGVzdIIJ\ndDE1Mi50ZXN0ggl0MTUzLnRlc3SCCXQxNTQudGVzdIIJdDE1NS50ZXN0ggl0MTU2\nLnRlc3SCCXQxNTcudGVzdIIJdDE1OC50ZXN0ggl0MTU5LnRlc3SCCXQxNjAudGVz\ndIIJdDE2MS50ZXN0ggl0MTYyLnRlc3SCCXQxNjMudGVzdIIJdDE2NC50ZXN0ggl0\nMTY1LnRlc3SCCXQxNjYudGVzdIIJdDE2Ny50ZXN0ggl0MTY4LnRlc3SCCXQxNjku\ndGVzdIIJdDE3MC50ZXN0ggl0MTcxLnRlc3SCCXQxNzIudGVzdIIJdDE3My50ZXN0\nggl0MTc0LnRlc3SCCXQxNzUudGVzdIIJdDE3Ni50ZXN0ggl0MTc3LnRlc3SCCXQx\nNzgudGVzdIIJdDE3OS50ZXN0ggl0MTgwLnRlc3SCCXQxODEudGVzdIIJdDE4Mi50\nZXN0ggl0MTgzLnRlc3SCCXQxODQudGVzdIIJdDE4NS50ZXN0ggl0MTg2LnRlc3SC\nCXQxODcudGVzdIIJdDE4OC50ZXN0ggl0MTg5LnRlc3SCCXQxOTAudGVzdIIJdDE5\nMS50ZXN0ggl0MTkyLnRlc3SCCXQxOTMudGVzdIIJdDE5NC50ZXN0ggl0MTk1LnRl\nc3SCCXQxOTYudGVzdIIJdDE5Ny50ZXN0ggl0MTk4LnRlc3SCCXQxOTkudGVzdIIJ\ndDIwMC50ZXN0ggl0MjAxLnRlc3SCCXQyMDIudGVzdIIJdDIwMy50ZXN0ggl0MjA0\nLnRlc3SCCXQyMDUudGVzdIIJdDIwNi50ZXN0ggl0MjA3LnRlc3SCCXQyMDgudGVz\ndIIJdDIwOS50ZXN0ggl0MjEwLnRlc3SCCXQyMTEudGVzdIIJdDIxMi50ZXN0ggl0\nMjEzLnRlc3SCCXQyMTQudGVzdIIJdDIxNS50ZXN0ggl0MjE2LnRlc3SCCXQyMTcu\ndGVzdIIJdDIxOC50ZXN0ggl0MjE5LnRlc3SCCXQyMjAudGVzdIIJdDIyMS50ZXN0\nggl0MjIyLnRlc3SCCXQyMjMudGVzdIIJdDIyNC50ZXN0ggl0MjI1LnRlc3SCCXQy\nMjYudGVzdIIJdDIyNy50ZXN0ggl0MjI4LnRlc3SCCXQyMjkudGVzdIIJdDIzMC50\nZXN0ggl0MjMxLnRlc3SCCXQyMzIudGVzdIIJdDIzMy50ZXN0ggl0MjM0LnRlc3SC\nCXQyMzUudGVzdIIJdDIzNi50ZXN0ggl0MjM3LnRlc3SCCXQyMzgudGVzdIIJdDIz\nOS50ZXN0ggl0MjQwLnRlc3SCCXQyNDEudGVzdIIJdDI0Mi50ZXN0ggl0MjQzLnRl\nc3SCCXQyNDQudGVzdIIJdDI0NS50ZXN0ggl0MjQ2LnRlc3SCCXQyNDcudGVzdIIJ\ndDI0OC50ZXN0ggl0MjQ5LnRlc3SCCXQyNTAudGVzdIIJdDI1MS50ZXN0ggl0MjUy\nLnRlc3SCCXQyNTMudGVzdIIJdDI1NC50ZXN0ggl0MjU1LnRlc3SCCXQyNTYudGVz\ndIIJdDI1Ny50ZXN0ggl0MjU4LnRlc3SCCXQyNTkudGVzdIIJdDI2MC50ZXN0ggl0\nMjYxLnRlc3SCCXQyNjIudGVzdIIJdDI2My50ZXN0ggl0MjY0LnRlc3SCCXQyNjUu\ndGVzdIIJdDI2Ni50ZXN0ggl0MjY3LnRlc3SCCXQyNjgudGVzdIIJdDI2OS50ZXN0\nggl0MjcwLnRlc3SCCXQyNzEudGVzdIIJdDI3Mi50ZXN0ggl0MjczLnRlc3SCCXQy\nNzQudGVzdIIJdDI3NS50ZXN0ggl0Mjc2LnRlc3SCCXQyNzcudGVzdIIJdDI3OC50\nZXN0ggl0Mjc5LnRlc3SCCXQyODAudGVzdIIJdDI4MS50ZXN0ggl0MjgyLnRlc3SC\nCXQyODMudGVzdIIJdDI4NC50ZXN0ggl0Mjg1LnRlc3SCCXQyODYudGVzdIIJdDI4\nNy50ZXN0ggl0Mjg4LnRlc3SCCXQyODkudGVzdIIJdDI5MC50ZXN0ggl0MjkxLnRl\nc3SCCXQyOTIudGVzdIIJdDI5My50ZXN0ggl0Mjk0LnRlc3SCCXQyOTUudGVzdIIJ\ndDI5Ni50ZXN0ggl0Mjk3LnRlc3SCCXQyOTgudGVzdIIJdDI5OS50ZXN0ggl0MzAw\nLnRlc3SCCXQzMDEudGVzdIIJdDMwMi50ZXN0ggl0MzAzLnRlc3SCCXQzMDQudGVz\ndIIJdDMwNS50ZXN0ggl0MzA2LnRlc3SCCXQzMDcudGVzdIIJdDMwOC50ZXN0ggl0\nMzA5LnRlc3SCCXQzMTAudGVzdIIJdDMxMS50ZXN0ggl0MzEyLnRlc3SCCXQzMTMu\ndGVzdIIJdDMxNC50ZXN0ggl0MzE1LnRlc3SCCXQzMTYudGVzdIIJdDMxNy50ZXN0\nggl0MzE4LnRlc3SCCXQzMTkudGVzdIIJdDMyMC50ZXN0ggl0MzIxLnRlc3SCCXQz\nMjIudGVzdIIJdDMyMy50ZXN0ggl0MzI0LnRlc3SCCXQzMjUudGVzdIIJdDMyNi50\nZXN0ggl0MzI3LnRlc3SCCXQzMjgudGVzdIIJdDMyOS50ZXN0ggl0MzMwLnRlc3SC\nCXQzMzEudGVzdIIJdDMzMi50ZXN0ggl0MzMzLnRlc3SCCXQzMzQudGVzdIIJdDMz\nNS50ZXN0ggl0MzM2LnRlc3SCCXQzMzcudGVzdIIJdDMzOC50ZXN0ggl0MzM5LnRl\nc3SCCXQzNDAudGVzdIIJdDM0MS50ZXN0ggl0MzQyLnRlc3SCCXQzNDMudGVzdIIJ\ndDM0NC50ZXN0ggl0MzQ1LnRlc3SCCXQzNDYudGVzdIIJdDM0Ny50ZXN0ggl0MzQ4\nLnRlc3SCCXQzNDkudGVzdIIJdDM1MC50ZXN0ggl0MzUxLnRlc3SCCXQzNTIudGVz\ndIIJdDM1My50ZXN0ggl0MzU0LnRlc3SCCXQzNTUudGVzdIIJdDM1Ni50ZXN0ggl0\nMzU3LnRlc3SCCXQzNTgudGVzdIIJdDM1OS50ZXN0ggl0MzYwLnRlc3SCCXQzNjEu\ndGVzdIIJdDM2Mi50ZXN0ggl0MzYzLnRlc3SCCXQzNjQudGVzdIIJdDM2NS50ZXN0\nggl0MzY2LnRlc3SCCXQzNjcudGVzdIIJdDM2OC50ZXN0ggl0MzY5LnRlc3SCCXQz\nNzAudGVzdIIJdDM3MS50ZXN0ggl0MzcyLnRlc3SCCXQzNzMudGVzdIIJdDM3NC50\nZXN0ggl0Mzc1LnRlc3SCCXQzNzYudGVzdIIJdDM3Ny50ZXN0ggl0Mzc4LnRlc3SC\nCXQzNzkudGVzdIIJdDM4MC50ZXN0ggl0MzgxLnRlc3SCCXQzODIudGVzdIIJdDM4\nMy50ZXN0ggl0Mzg0LnRlc3SCCXQzODUudGVzdIIJdDM4Ni50ZXN0ggl0Mzg3LnRl\nc3SCCXQzODgudGVzdIIJdDM4OS50ZXN0ggl0MzkwLnRlc3SCCXQzOTEudGVzdIIJ\ndDM5Mi50ZXN0ggl0MzkzLnRlc3SCCXQzOTQudGVzdIIJdDM5NS50ZXN0ggl0Mzk2\nLnRlc3SCCXQzOTcudGVzdIIJdDM5OC50ZXN0ggl0Mzk5LnRlc3SCCXQ0MDAudGVz\ndIIJdDQwMS50ZXN0ggl0NDAyLnRlc3SCCXQ0MDMudGVzdIIJdDQwNC50ZXN0ggl0\nNDA1LnRlc3SCCXQ0MDYudGVzdIIJdDQwNy50ZXN0ggl0NDA4LnRlc3SCCXQ0MDku\ndGVzdIIJdDQxMC50ZXN0ggl0NDExLnRlc3SCCXQ0MTI",
     "udGVzdIIJdDQxMy50ZXN0\nggl0NDE0LnRlc3SCCXQ0MTUudGVzdIIJdDQxNi50ZXN0ggl0NDE3LnRlc3SCCXQ0\nMTgudGVzdIIJdDQxOS50ZXN0ggl0NDIwLnRlc3SCCXQ0MjEudGVzdIIJdDQyMi50\nZXN0ggl0NDIzLnRlc3SCCXQ0MjQudGVzdIIJdDQyNS50ZXN0ggl0NDI2LnRlc3SC\nCXQ0MjcudGVzdIIJdDQyOC50ZXN0ggl0NDI5LnRlc3SCCXQ0MzAudGVzdIIJdDQz\nMS50ZXN0ggl0NDMyLnRlc3SCCXQ0MzMudGVzdIIJdDQzNC50ZXN0ggl0NDM1LnRl\nc3SCCXQ0MzYudGVzdIIJdDQzNy50ZXN0ggl0NDM4LnRlc3SCCXQ0MzkudGVzdIIJ\ndDQ0MC50ZXN0ggl0NDQxLnRlc3SCCXQ0NDIudGVzdIIJdDQ0My50ZXN0ggl0NDQ0\nLnRlc3SCCXQ0NDUudGVzdIIJdDQ0Ni50ZXN0ggl0NDQ3LnRlc3SCCXQ0NDgudGVz\ndIIJdDQ0OS50ZXN0ggl0NDUwLnRlc3SCCXQ0NTEudGVzdIIJdDQ1Mi50ZXN0ggl0\nNDUzLnRlc3SCCXQ0NTQudGVzdIIJdDQ1NS50ZXN0ggl0NDU2LnRlc3SCCXQ0NTcu\ndGVzdIIJdDQ1OC50ZXN0ggl0NDU5LnRlc3SCCXQ0NjAudGVzdIIJdDQ2MS50ZXN0\nggl0NDYyLnRlc3SCCXQ0NjMudGVzdIIJdDQ2NC50ZXN0ggl0NDY1LnRlc3SCCXQ0\nNjYudGVzdIIJdDQ2Ny50ZXN0ggl0NDY4LnRlc3SCCXQ0NjkudGVzdIIJdDQ3MC50\nZXN0ggl0NDcxLnRlc3SCCXQ0NzIudGVzdIIJdDQ3My50ZXN0ggl0NDc0LnRlc3SC\nCXQ0NzUudGVzdIIJdDQ3Ni50ZXN0ggl0NDc3LnRlc3SCCXQ0NzgudGVzdIIJdDQ3\nOS50ZXN0ggl0NDgwLnRlc3SCCXQ0ODEudGVzdIIJdDQ4Mi50ZXN0ggl0NDgzLnRl\nc3SCCXQ0ODQudGVzdIIJdDQ4NS50ZXN0ggl0NDg2LnRlc3SCCXQ0ODcudGVzdIIJ\ndDQ4OC50ZXN0ggl0NDg5LnRlc3SCCXQ0OTAudGVzdIIJdDQ5MS50ZXN0ggl0NDky\nLnRlc3SCCXQ0OTMudGVzdIIJdDQ5NC50ZXN0ggl0NDk1LnRlc3SCCXQ0OTYudGVz\ndIIJdDQ5Ny50ZXN0ggl0NDk4LnRlc3SCCXQ0OTkudGVzdIIJdDUwMC50ZXN0ggl0\nNTAxLnRlc3SCCXQ1MDIudGVzdIIJdDUwMy50ZXN0ggl0NTA0LnRlc3SCCXQ1MDUu\ndGVzdIIJdDUwNi50ZXN0ggl0NTA3LnRlc3SCCXQ1MDgudGVzdIIJdDUwOS50ZXN0\nggl0NTEwLnRlc3SCCXQ1MTEudGVzdIIJdDUxMi50ZXN0MA0GCSqGSIb3DQEBCwUA\nA4IBAQCp6JcB0NWRQJSgjsI0ycv1gpuoo2k/NjPlkYCcsLwmTPRVdpBHi9MJNS2i\nMKPk7Wek2y9wJw6QPq9fMi/XSmEqRcFC8uBZ9evyTwmVbzzRsEN3qGHCrVdOnVLa\nD7x7NjoTLApVNelYTxMPEennTd9+we8cl0T2TqosTnbxyvP+pnwtpazjDAFKlt8e\nJpLRlRtWR/aScZ+P8CGj4b3prp12NJIAPG9W2ZqiHNLNMhTQG4Bz+O5+zMnIbC+e\nAhc4co+A/7qzselNZL1pcFFyRtTeLAcREuZVTTRa/EXmlLqzMe+UEEinEtdktnPL\nKO0ED3qPXggpBbFaa4/PVubBS4QU\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen93 = 16219;
+static const size_t kLen94 = 16219;
 
-static const char *kData93[] = {
+static const char *kData94[] = {
     "-----BEGIN CERTIFICATE-----\nMIIunDCCLYSgAwIBAgIBAzANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowEjEQMA4GA1UEAxMHdDAu\ndGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALoL2oQZEgFBdXwu\nPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a2eQZFn+j3hmexeQF9T8i\nWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4baeVEEoxw+A+ISrYHTIFc\nV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXDI+jGMvFPmBRHr2/1dJUW\nPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1Hbky+dPlDIGrfaHHsCNnb\n/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+D6xcJO2RNUCUENS+Iipj\n3kIrLbkCAwEAAaOCK/4wgiv6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr\nBgEFBQcDATAMBgNVHRMBAf8EAjAAMIIrwwYDVR0RBIIrujCCK7aCB3QwLnRlc3SC\nB3QxLnRlc3SCB3QyLnRlc3SCB3QzLnRlc3SCB3Q0LnRlc3SCB3Q1LnRlc3SCB3Q2\nLnRlc3SCB3Q3LnRlc3SCB3Q4LnRlc3SCB3Q5LnRlc3SCCHQxMC50ZXN0ggh0MTEu\ndGVzdIIIdDEyLnRlc3SCCHQxMy50ZXN0ggh0MTQudGVzdIIIdDE1LnRlc3SCCHQx\nNi50ZXN0ggh0MTcudGVzdIIIdDE4LnRlc3SCCHQxOS50ZXN0ggh0MjAudGVzdIII\ndDIxLnRlc3SCCHQyMi50ZXN0ggh0MjMudGVzdIIIdDI0LnRlc3SCCHQyNS50ZXN0\nggh0MjYudGVzdIIIdDI3LnRlc3SCCHQyOC50ZXN0ggh0MjkudGVzdIIIdDMwLnRl\nc3SCCHQzMS50ZXN0ggh0MzIudGVzdIIIdDMzLnRlc3SCCHQzNC50ZXN0ggh0MzUu\ndGVzdIIIdDM2LnRlc3SCCHQzNy50ZXN0ggh0MzgudGVzdIIIdDM5LnRlc3SCCHQ0\nMC50ZXN0ggh0NDEudGVzdIIIdDQyLnRlc3SCCHQ0My50ZXN0ggh0NDQudGVzdIII\ndDQ1LnRlc3SCCHQ0Ni50ZXN0ggh0NDcudGVzdIIIdDQ4LnRlc3SCCHQ0OS50ZXN0\nggh0NTAudGVzdIIIdDUxLnRlc3SCCHQ1Mi50ZXN0ggh0NTMudGVzdIIIdDU0LnRl\nc3SCCHQ1NS50ZXN0ggh0NTYudGVzdIIIdDU3LnRlc3SCCHQ1OC50ZXN0ggh0NTku\ndGVzdIIIdDYwLnRlc3SCCHQ2MS50ZXN0ggh0NjIudGVzdIIIdDYzLnRlc3SCCHQ2\nNC50ZXN0ggh0NjUudGVzdIIIdDY2LnRlc3SCCHQ2Ny50ZXN0ggh0NjgudGVzdIII\ndDY5LnRlc3SCCHQ3MC50ZXN0ggh0NzEudGVzdIIIdDcyLnRlc3SCCHQ3My50ZXN0\nggh0NzQudGVzdIIIdDc1LnRlc3SCCHQ3Ni50ZXN0ggh0NzcudGVzdIIIdDc4LnRl\nc3SCCHQ3OS50ZXN0ggh0ODAudGVzdIIIdDgxLnRlc3SCCHQ4Mi50ZXN0ggh0ODMu\ndGVzdIIIdDg0LnRlc3SCCHQ4NS50ZXN0ggh0ODYudGVzdIIIdDg3LnRlc3SCCHQ4\nOC50ZXN0ggh0ODkudGVzdIIIdDkwLnRlc3SCCHQ5MS50ZXN0ggh0OTIudGVzdIII\ndDkzLnRlc3SCCHQ5NC50ZXN0ggh0OTUudGVzdIIIdDk2LnRlc3SCCHQ5Ny50ZXN0\nggh0OTgudGVzdIIIdDk5LnRlc3SCCXQxMDAudGVzdIIJdDEwMS50ZXN0ggl0MTAy\nLnRlc3SCCXQxMDMudGVzdIIJdDEwNC50ZXN0ggl0MTA1LnRlc3SCCXQxMDYudGVz\ndIIJdDEwNy50ZXN0ggl0MTA4LnRlc3SCCXQxMDkudGVzdIIJdDExMC50ZXN0ggl0\nMTExLnRlc3SCCXQxMTIudGVzdIIJdDExMy50ZXN0ggl0MTE0LnRlc3SCCXQxMTUu\ndGVzdIIJdDExNi50ZXN0ggl0MTE3LnRlc3SCCXQxMTgudGVzdIIJdDExOS50ZXN0\nggl0MTIwLnRlc3SCCXQxMjEudGVzdIIJdDEyMi50ZXN0ggl0MTIzLnRlc3SCCXQx\nMjQudGVzdIIJdDEyNS50ZXN0ggl0MTI2LnRlc3SCCXQxMjcudGVzdIIJdDEyOC50\nZXN0ggl0MTI5LnRlc3SCCXQxMzAudGVzdIIJdDEzMS50ZXN0ggl0MTMyLnRlc3SC\nCXQxMzMudGVzdIIJdDEzNC50ZXN0ggl0MTM1LnRlc3SCCXQxMzYudGVzdIIJdDEz\nNy50ZXN0ggl0MTM4LnRlc3SCCXQxMzkudGVzdIIJdDE0MC50ZXN0ggl0MTQxLnRl\nc3SCCXQxNDIudGVzdIIJdDE0My50ZXN0ggl0MTQ0LnRlc3SCCXQxNDUudGVzdIIJ\ndDE0Ni50ZXN0ggl0MTQ3LnRlc3SCCXQxNDgudGVzdIIJdDE0OS50ZXN0ggl0MTUw\nLnRlc3SCCXQxNTEudGVzdIIJdDE1Mi50ZXN0ggl0MTUzLnRlc3SCCXQxNTQudGVz\ndIIJdDE1NS50ZXN0ggl0MTU2LnRlc3SCCXQxNTcudGVzdIIJdDE1OC50ZXN0ggl0\nMTU5LnRlc3SCCXQxNjAudGVzdIIJdDE2MS50ZXN0ggl0MTYyLnRlc3SCCXQxNjMu\ndGVzdIIJdDE2NC50ZXN0ggl0MTY1LnRlc3SCCXQxNjYudGVzdIIJdDE2Ny50ZXN0\nggl0MTY4LnRlc3SCCXQxNjkudGVzdIIJdDE3MC50ZXN0ggl0MTcxLnRlc3SCCXQx\nNzIudGVzdIIJdDE3My50ZXN0ggl0MTc0LnRlc3SCCXQxNzUudGVzdIIJdDE3Ni50\nZXN0ggl0MTc3LnRlc3SCCXQxNzgudGVzdIIJdDE3OS50ZXN0ggl0MTgwLnRlc3SC\nCXQxODEudGVzdIIJdDE4Mi50ZXN0ggl0MTgzLnRlc3SCCXQxODQudGVzdIIJdDE4\nNS50ZXN0ggl0MTg2LnRlc3SCCXQxODcudGVzdIIJdDE4OC50ZXN0ggl0MTg5LnRl\nc3SCCXQxOTAudGVzdIIJdDE5MS50ZXN0ggl0MTkyLnRlc3SCCXQxOTMudGVzdIIJ\ndDE5NC50ZXN0ggl0MTk1LnRlc3SCCXQxOTYudGVzdIIJdDE5Ny50ZXN0ggl0MTk4\nLnRlc3SCCXQxOTkudGVzdIIJdDIwMC50ZXN0ggl0MjAxLnRlc3SCCXQyMDIudGVz\ndIIJdDIwMy50ZXN0ggl0MjA0LnRlc3SCCXQyMDUudGVzdIIJdDIwNi50ZXN0ggl0\nMjA3LnRlc3SCCXQyMDgudGVzdIIJdDIwOS50ZXN0ggl0MjEwLnRlc3SCCXQyMTEu\ndGVzdIIJdDIxMi50ZXN0ggl0MjEzLnRlc3SCCXQyMTQudGVzdIIJdDIxNS50ZXN0\nggl0MjE2LnRlc3SCCXQyMTcudGVzdIIJdDIxOC50ZXN0ggl0MjE5LnRlc3SCCXQy\nMjAudGVzdIIJdDIyMS50ZXN0ggl0MjIyLnRlc3SCCXQyMjMudGVzdIIJdDIyNC50\nZXN0ggl0MjI1LnRlc3SCCXQyMjYudGVzdIIJdDIyNy50ZXN0ggl0MjI4LnRlc3SC\nCXQyMjkudGVzdIIJdDIzMC50ZXN0ggl0MjMxLnRlc3SCCXQyMzIudGVzdIIJdDIz\nMy50ZXN0ggl0MjM0LnRlc3SCCXQyMzUudGVzdIIJdDIzNi50ZXN0ggl0MjM3LnRl\nc3SCCXQyMzgudGVzdIIJdDIzOS50ZXN0ggl0MjQwLnRlc3SCCXQyNDEudGVzdIIJ\ndDI0Mi50ZXN0ggl0MjQzLnRlc3SCCXQyNDQudGVzdIIJdDI0NS50ZXN0ggl0MjQ2\nLnRlc3SCCXQyNDcudGVzdIIJdDI0OC50ZXN0ggl0MjQ5LnRlc3SCCXQyNTAudGVz\ndIIJdDI1MS50ZXN0ggl0MjUyLnRlc3SCCXQyNTMudGVzdIIJdDI1NC50ZXN0ggl0\nMjU1LnRlc3SCCXQyNTYudGVzdIIJdDI1Ny50ZXN0ggl0MjU4LnRlc3SCCXQyNTku\ndGVzdIIJdDI2MC50ZXN0ggl0MjYxLnRlc3SCCXQyNjIudGVzdIIJdDI2My50ZXN0\nggl0MjY0LnRlc3SCCXQyNjUudGVzdIIJdDI2Ni50ZXN0ggl0MjY3LnRlc3SCCXQy\nNjgudGVzdIIJdDI2OS50ZXN0ggl0MjcwLnRlc3SCCXQyNzEudGVzdIIJdDI3Mi50\nZXN0ggl0MjczLnRlc3SCCXQyNzQudGVzdIIJdDI3NS50ZXN0ggl0Mjc2LnRlc3SC\nCXQyNzcudGVzdIIJdDI3OC50ZXN0ggl0Mjc5LnRlc3SCCXQyODAudGVzdIIJdDI4\nMS50ZXN0ggl0MjgyLnRlc3SCCXQyODMudGVzdIIJdDI4NC50ZXN0ggl0Mjg1LnRl\nc3SCCXQyODYudGVzdIIJdDI4Ny50ZXN0ggl0Mjg4LnRlc3SCCXQyODkudGVzdIIJ\ndDI5MC50ZXN0ggl0MjkxLnRlc3SCCXQyOTIudGVzdIIJdDI5My50ZXN0ggl0Mjk0\nLnRlc3SCCXQyOTUudGVzdIIJdDI5Ni50ZXN0ggl0Mjk3LnRlc3SCCXQyOTgudGVz\ndIIJdDI5OS50ZXN0ggl0MzAwLnRlc3SCCXQzMDEudGVzdIIJdDMwMi50ZXN0ggl0\nMzAzLnRlc3SCCXQzMDQudGVzdIIJdDMwNS50ZXN0ggl0MzA2LnRlc3SCCXQzMDcu\ndGVzdIIJdDMwOC50ZXN0ggl0MzA5LnRlc3SCCXQzMTAudGVzdIIJdDMxMS50ZXN0\nggl0MzEyLnRlc3SCCXQzMTMudGVzdIIJdDMxNC50ZXN0ggl0MzE1LnRlc3SCCXQz\nMTYudGVzdIIJdDMxNy50ZXN0ggl0MzE4LnRlc3SCCXQzMTkudGVzdIIJdDMyMC50\nZXN0ggl0MzIxLnRlc3SCCXQzMjIudGVzdIIJdDMyMy50ZXN0ggl0MzI0LnRlc3SC\nCXQzMjUudGVzdIIJdDMyNi50ZXN0ggl0MzI3LnRlc3SCCXQzMjgudGVzdIIJdDMy\nOS50ZXN0ggl0MzMwLnRlc3SCCXQzMzEudGVzdIIJdDMzMi50ZXN0ggl0MzMzLnRl\nc3SCCXQzMzQudGVzdIIJdDMzNS50ZXN0ggl0MzM2LnRlc3SCCXQzMzcudGVzdIIJ\ndDMzOC50ZXN0ggl0MzM5LnRlc3SCCXQzNDAudGVzdIIJdDM0MS50ZXN0ggl0MzQy\nLnRlc3SCCXQzNDMudGVzdIIJdDM0NC50ZXN0ggl0MzQ1LnRlc3SCCXQzNDYudGVz\ndIIJdDM0Ny50ZXN0ggl0MzQ4LnRlc3SCCXQzNDkudGVzdIIJdDM1MC50ZXN0ggl0\nMzUxLnRlc3SCCXQzNTIudGVzdIIJdDM1My50ZXN0ggl0MzU0LnRlc3SCCXQzNTUu\ndGVzdIIJdDM1Ni50ZXN0ggl0MzU3LnRlc3SCCXQzNTgudGVzdIIJdDM1OS50ZXN0\nggl0MzYwLnRlc3SCCXQzNjEudGVzdIIJdDM2Mi50ZXN0ggl0MzYzLnRlc3SCCXQz\nNjQudGVzdIIJdDM2NS50ZXN0ggl0MzY2LnRlc3SCCXQzNjcudGVzdIIJdDM2OC50\nZXN0ggl0MzY5LnRlc3SCCXQzNzAudGVzdIIJdDM3MS50ZXN0ggl0MzcyLnRlc3SC\nCXQzNzMudGVzdIIJdDM3NC50ZXN0ggl0Mzc1LnRlc3SCCXQzNzYudGVzdIIJdDM3\nNy50ZXN0ggl0Mzc4LnRlc3SCCXQzNzkudGVzdIIJdDM4MC50ZXN0ggl0MzgxLnRl\nc3SCCXQzODIudGVzdIIJdDM4My50ZXN0ggl0Mzg0LnRlc3SCCXQzODUudGVzdIIJ\ndDM4Ni50ZXN0ggl0Mzg3LnRlc3SCCXQzODgudGVzdIIJdDM4OS50ZXN0ggl0Mzkw\nLnRlc3SCCXQzOTEudGVzdIIJdDM5Mi50ZXN0ggl0MzkzLnRlc3SCCXQzOTQudGVz\ndIIJdDM5NS50ZXN0ggl0Mzk2LnRlc3SCCXQzOTcudGVzdIIJdDM5OC50ZXN0ggl0\nMzk5LnRlc3SCCXQ0MDAudGVzdIIJdDQwMS50ZXN0ggl0NDAyLnRlc3SCCXQ0MDMu\ndGVzdIIJdDQwNC50ZXN0ggl0NDA1LnRlc3SCCXQ0MDYudGVzdIIJdDQwNy50ZXN0\nggl0NDA4LnRlc3SCCXQ0MDkudGVzdIIJdDQxMC50ZXN0ggl0NDExLnRlc3SCCXQ0\nMTIudGVzdIIJdDQxMy50ZXN0ggl0NDE0LnRlc3SCCXQ0MTUudGVzdIIJdDQxNi50\nZXN0ggl0NDE3LnRlc3SCCXQ0MTgudGVzdIIJdDQxOS50ZXN0ggl0NDIwLnRlc3SC\nCXQ0MjEudGVzdIIJdDQyMi50ZXN0ggl0NDIzLnRlc3SCCXQ0MjQudGVzdIIJdDQy\nNS50ZXN0ggl0NDI2LnRlc3SCCXQ0MjcudGVzdIIJdDQyOC50ZXN0ggl0NDI5LnRl\nc3SCCXQ0MzAudGVzdIIJdDQzMS50ZXN0ggl0NDMyLnRlc3SCCXQ0MzMudGVzdIIJ\ndDQzNC50ZXN0ggl0NDM1LnRlc3SCCXQ0MzYudGVzdIIJdDQzNy50ZXN0ggl0NDM4\nLnRlc3SCCXQ0MzkudGVzdIIJdDQ0MC50ZXN0ggl0NDQxLnRlc3SCCXQ0NDIudGVz\ndIIJdDQ0My50ZXN0ggl0NDQ0LnRlc3SCCXQ0NDUudGVzdIIJdDQ0Ni50ZXN0ggl0\nNDQ3LnRlc3SCCXQ0NDgudGVzdIIJdDQ0OS50ZXN0ggl0NDUwLnRlc3SCCXQ0NTEu\ndGVzdIIJdDQ1Mi50ZXN0ggl0NDUzLnRlc3SCCXQ0NTQudGVzdIIJdDQ1NS50ZXN0\nggl0NDU2LnRlc3SCCXQ0NTcudGVzdIIJdDQ1OC50ZXN0ggl0NDU5LnRlc3SCCXQ0\nNjAudGVzdIIJdDQ2MS50ZXN0ggl0NDYyLnRlc3SCCXQ0NjMudGVzdIIJdDQ2NC50\nZXN0ggl0NDY1LnRlc3SCCXQ0NjYudGVzdIIJdDQ2Ny50ZXN0ggl0NDY4LnRlc3SC\nCXQ0NjkudGVzdIIJdDQ3MC50ZXN0ggl0NDcxLnRlc3SCCXQ0NzIudGVzdIIJdDQ3\nMy50ZXN0ggl0NDc0LnRlc3SCCXQ0NzUudGVzdIIJdDQ3Ni50ZXN0ggl0NDc3LnRl\nc3SCCXQ0NzgudGVzdIIJdDQ3OS50ZXN0ggl0NDgwLnRlc3SCCXQ0ODEudGVzdIIJ\ndDQ4Mi50ZXN0ggl0NDgzLnRlc3SCCXQ0ODQudGVzdIIJdDQ4NS50ZXN0ggl0NDg2\nLnRlc3SCCXQ0ODcudGVzdIIJdDQ4OC50ZXN0ggl0NDg5LnRlc3SCCXQ0OTAudGVz\ndIIJdDQ5MS50ZXN0ggl0NDkyLnRlc3SCCXQ0OTMudGVzdIIJdDQ5NC50ZXN0ggl0\nNDk1LnRlc3SCCXQ0OTYudGVzdIIJdDQ5Ny50ZXN0ggl0NDk4LnRlc3SCCXQ0OTku\ndGVzdIIJdDUwMC50ZXN0ggl0NTAxLnRlc3SCCXQ1MDIudGVzdIIJdDUwMy50ZXN0\nggl0NTA0LnRlc3SCCXQ1MDUudGVzdIIJdDUwNi50ZXN0ggl0NTA3LnRlc3SCCXQ1\nMDgudGVzdIIJdDUwOS50ZXN0ggl0NTEwLnRlc3SCCXQ1MTEudGVzdIIJdDUxMi50\nZXN0ggl0NTEzLnRlc3SCCXQ1MTQudGVzdIIJdDU",
     "xNS50ZXN0ggl0NTE2LnRlc3SC\nCXQ1MTcudGVzdIIJdDUxOC50ZXN0ggl0NTE5LnRlc3SCCXQ1MjAudGVzdIIJdDUy\nMS50ZXN0ggl0NTIyLnRlc3SCCXQ1MjMudGVzdIIJdDUyNC50ZXN0ggl0NTI1LnRl\nc3SCCXQ1MjYudGVzdIIJdDUyNy50ZXN0ggl0NTI4LnRlc3SCCXQ1MjkudGVzdIIJ\ndDUzMC50ZXN0ggl0NTMxLnRlc3SCCXQ1MzIudGVzdIIJdDUzMy50ZXN0ggl0NTM0\nLnRlc3SCCXQ1MzUudGVzdIIJdDUzNi50ZXN0ggl0NTM3LnRlc3SCCXQ1MzgudGVz\ndIIJdDUzOS50ZXN0ggl0NTQwLnRlc3SCCXQ1NDEudGVzdIIJdDU0Mi50ZXN0ggl0\nNTQzLnRlc3SCCXQ1NDQudGVzdIIJdDU0NS50ZXN0ggl0NTQ2LnRlc3SCCXQ1NDcu\ndGVzdIIJdDU0OC50ZXN0ggl0NTQ5LnRlc3SCCXQ1NTAudGVzdIIJdDU1MS50ZXN0\nggl0NTUyLnRlc3SCCXQ1NTMudGVzdIIJdDU1NC50ZXN0ggl0NTU1LnRlc3SCCXQ1\nNTYudGVzdIIJdDU1Ny50ZXN0ggl0NTU4LnRlc3SCCXQ1NTkudGVzdIIJdDU2MC50\nZXN0ggl0NTYxLnRlc3SCCXQ1NjIudGVzdIIJdDU2My50ZXN0ggl0NTY0LnRlc3SC\nCXQ1NjUudGVzdIIJdDU2Ni50ZXN0ggl0NTY3LnRlc3SCCXQ1NjgudGVzdIIJdDU2\nOS50ZXN0ggl0NTcwLnRlc3SCCXQ1NzEudGVzdIIJdDU3Mi50ZXN0ggl0NTczLnRl\nc3SCCXQ1NzQudGVzdIIJdDU3NS50ZXN0ggl0NTc2LnRlc3SCCXQ1NzcudGVzdIIJ\ndDU3OC50ZXN0ggl0NTc5LnRlc3SCCXQ1ODAudGVzdIIJdDU4MS50ZXN0ggl0NTgy\nLnRlc3SCCXQ1ODMudGVzdIIJdDU4NC50ZXN0ggl0NTg1LnRlc3SCCXQ1ODYudGVz\ndIIJdDU4Ny50ZXN0ggl0NTg4LnRlc3SCCXQ1ODkudGVzdIIJdDU5MC50ZXN0ggl0\nNTkxLnRlc3SCCXQ1OTIudGVzdIIJdDU5My50ZXN0ggl0NTk0LnRlc3SCCXQ1OTUu\ndGVzdIIJdDU5Ni50ZXN0ggl0NTk3LnRlc3SCCXQ1OTgudGVzdIIJdDU5OS50ZXN0\nggl0NjAwLnRlc3SCCXQ2MDEudGVzdIIJdDYwMi50ZXN0ggl0NjAzLnRlc3SCCXQ2\nMDQudGVzdIIJdDYwNS50ZXN0ggl0NjA2LnRlc3SCCXQ2MDcudGVzdIIJdDYwOC50\nZXN0ggl0NjA5LnRlc3SCCXQ2MTAudGVzdIIJdDYxMS50ZXN0ggl0NjEyLnRlc3SC\nCXQ2MTMudGVzdIIJdDYxNC50ZXN0ggl0NjE1LnRlc3SCCXQ2MTYudGVzdIIJdDYx\nNy50ZXN0ggl0NjE4LnRlc3SCCXQ2MTkudGVzdIIJdDYyMC50ZXN0ggl0NjIxLnRl\nc3SCCXQ2MjIudGVzdIIJdDYyMy50ZXN0ggl0NjI0LnRlc3SCCXQ2MjUudGVzdIIJ\ndDYyNi50ZXN0ggl0NjI3LnRlc3SCCXQ2MjgudGVzdIIJdDYyOS50ZXN0ggl0NjMw\nLnRlc3SCCXQ2MzEudGVzdIIJdDYzMi50ZXN0ggl0NjMzLnRlc3SCCXQ2MzQudGVz\ndIIJdDYzNS50ZXN0ggl0NjM2LnRlc3SCCXQ2MzcudGVzdIIJdDYzOC50ZXN0ggl0\nNjM5LnRlc3SCCXQ2NDAudGVzdIIJdDY0MS50ZXN0ggl0NjQyLnRlc3SCCXQ2NDMu\ndGVzdIIJdDY0NC50ZXN0ggl0NjQ1LnRlc3SCCXQ2NDYudGVzdIIJdDY0Ny50ZXN0\nggl0NjQ4LnRlc3SCCXQ2NDkudGVzdIIJdDY1MC50ZXN0ggl0NjUxLnRlc3SCCXQ2\nNTIudGVzdIIJdDY1My50ZXN0ggl0NjU0LnRlc3SCCXQ2NTUudGVzdIIJdDY1Ni50\nZXN0ggl0NjU3LnRlc3SCCXQ2NTgudGVzdIIJdDY1OS50ZXN0ggl0NjYwLnRlc3SC\nCXQ2NjEudGVzdIIJdDY2Mi50ZXN0ggl0NjYzLnRlc3SCCXQ2NjQudGVzdIIJdDY2\nNS50ZXN0ggl0NjY2LnRlc3SCCXQ2NjcudGVzdIIJdDY2OC50ZXN0ggl0NjY5LnRl\nc3SCCXQ2NzAudGVzdIIJdDY3MS50ZXN0ggl0NjcyLnRlc3SCCXQ2NzMudGVzdIIJ\ndDY3NC50ZXN0ggl0Njc1LnRlc3SCCXQ2NzYudGVzdIIJdDY3Ny50ZXN0ggl0Njc4\nLnRlc3SCCXQ2NzkudGVzdIIJdDY4MC50ZXN0ggl0NjgxLnRlc3SCCXQ2ODIudGVz\ndIIJdDY4My50ZXN0ggl0Njg0LnRlc3SCCXQ2ODUudGVzdIIJdDY4Ni50ZXN0ggl0\nNjg3LnRlc3SCCXQ2ODgudGVzdIIJdDY4OS50ZXN0ggl0NjkwLnRlc3SCCXQ2OTEu\ndGVzdIIJdDY5Mi50ZXN0ggl0NjkzLnRlc3SCCXQ2OTQudGVzdIIJdDY5NS50ZXN0\nggl0Njk2LnRlc3SCCXQ2OTcudGVzdIIJdDY5OC50ZXN0ggl0Njk5LnRlc3SCCXQ3\nMDAudGVzdIIJdDcwMS50ZXN0ggl0NzAyLnRlc3SCCXQ3MDMudGVzdIIJdDcwNC50\nZXN0ggl0NzA1LnRlc3SCCXQ3MDYudGVzdIIJdDcwNy50ZXN0ggl0NzA4LnRlc3SC\nCXQ3MDkudGVzdIIJdDcxMC50ZXN0ggl0NzExLnRlc3SCCXQ3MTIudGVzdIIJdDcx\nMy50ZXN0ggl0NzE0LnRlc3SCCXQ3MTUudGVzdIIJdDcxNi50ZXN0ggl0NzE3LnRl\nc3SCCXQ3MTgudGVzdIIJdDcxOS50ZXN0ggl0NzIwLnRlc3SCCXQ3MjEudGVzdIIJ\ndDcyMi50ZXN0ggl0NzIzLnRlc3SCCXQ3MjQudGVzdIIJdDcyNS50ZXN0ggl0NzI2\nLnRlc3SCCXQ3MjcudGVzdIIJdDcyOC50ZXN0ggl0NzI5LnRlc3SCCXQ3MzAudGVz\ndIIJdDczMS50ZXN0ggl0NzMyLnRlc3SCCXQ3MzMudGVzdIIJdDczNC50ZXN0ggl0\nNzM1LnRlc3SCCXQ3MzYudGVzdIIJdDczNy50ZXN0ggl0NzM4LnRlc3SCCXQ3Mzku\ndGVzdIIJdDc0MC50ZXN0ggl0NzQxLnRlc3SCCXQ3NDIudGVzdIIJdDc0My50ZXN0\nggl0NzQ0LnRlc3SCCXQ3NDUudGVzdIIJdDc0Ni50ZXN0ggl0NzQ3LnRlc3SCCXQ3\nNDgudGVzdIIJdDc0OS50ZXN0ggl0NzUwLnRlc3SCCXQ3NTEudGVzdIIJdDc1Mi50\nZXN0ggl0NzUzLnRlc3SCCXQ3NTQudGVzdIIJdDc1NS50ZXN0ggl0NzU2LnRlc3SC\nCXQ3NTcudGVzdIIJdDc1OC50ZXN0ggl0NzU5LnRlc3SCCXQ3NjAudGVzdIIJdDc2\nMS50ZXN0ggl0NzYyLnRlc3SCCXQ3NjMudGVzdIIJdDc2NC50ZXN0ggl0NzY1LnRl\nc3SCCXQ3NjYudGVzdIIJdDc2Ny50ZXN0ggl0NzY4LnRlc3SCCXQ3NjkudGVzdIIJ\ndDc3MC50ZXN0ggl0NzcxLnRlc3SCCXQ3NzIudGVzdIIJdDc3My50ZXN0ggl0Nzc0\nLnRlc3SCCXQ3NzUudGVzdIIJdDc3Ni50ZXN0ggl0Nzc3LnRlc3SCCXQ3NzgudGVz\ndIIJdDc3OS50ZXN0ggl0NzgwLnRlc3SCCXQ3ODEudGVzdIIJdDc4Mi50ZXN0ggl0\nNzgzLnRlc3SCCXQ3ODQudGVzdIIJdDc4NS50ZXN0ggl0Nzg2LnRlc3SCCXQ3ODcu\ndGVzdIIJdDc4OC50ZXN0ggl0Nzg5LnRlc3SCCXQ3OTAudGVzdIIJdDc5MS50ZXN0\nggl0NzkyLnRlc3SCCXQ3OTMudGVzdIIJdDc5NC50ZXN0ggl0Nzk1LnRlc3SCCXQ3\nOTYudGVzdIIJdDc5Ny50ZXN0ggl0Nzk4LnRlc3SCCXQ3OTkudGVzdIIJdDgwMC50\nZXN0ggl0ODAxLnRlc3SCCXQ4MDIudGVzdIIJdDgwMy50ZXN0ggl0ODA0LnRlc3SC\nCXQ4MDUudGVzdIIJdDgwNi50ZXN0ggl0ODA3LnRlc3SCCXQ4MDgudGVzdIIJdDgw\nOS50ZXN0ggl0ODEwLnRlc3SCCXQ4MTEudGVzdIIJdDgxMi50ZXN0ggl0ODEzLnRl\nc3SCCXQ4MTQudGVzdIIJdDgxNS50ZXN0ggl0ODE2LnRlc3SCCXQ4MTcudGVzdIIJ\ndDgxOC50ZXN0ggl0ODE5LnRlc3SCCXQ4MjAudGVzdIIJdDgyMS50ZXN0ggl0ODIy\nLnRlc3SCCXQ4MjMudGVzdIIJdDgyNC50ZXN0ggl0ODI1LnRlc3SCCXQ4MjYudGVz\ndIIJdDgyNy50ZXN0ggl0ODI4LnRlc3SCCXQ4MjkudGVzdIIJdDgzMC50ZXN0ggl0\nODMxLnRlc3SCCXQ4MzIudGVzdIIJdDgzMy50ZXN0ggl0ODM0LnRlc3SCCXQ4MzUu\ndGVzdIIJdDgzNi50ZXN0ggl0ODM3LnRlc3SCCXQ4MzgudGVzdIIJdDgzOS50ZXN0\nggl0ODQwLnRlc3SCCXQ4NDEudGVzdIIJdDg0Mi50ZXN0ggl0ODQzLnRlc3SCCXQ4\nNDQudGVzdIIJdDg0NS50ZXN0ggl0ODQ2LnRlc3SCCXQ4NDcudGVzdIIJdDg0OC50\nZXN0ggl0ODQ5LnRlc3SCCXQ4NTAudGVzdIIJdDg1MS50ZXN0ggl0ODUyLnRlc3SC\nCXQ4NTMudGVzdIIJdDg1NC50ZXN0ggl0ODU1LnRlc3SCCXQ4NTYudGVzdIIJdDg1\nNy50ZXN0ggl0ODU4LnRlc3SCCXQ4NTkudGVzdIIJdDg2MC50ZXN0ggl0ODYxLnRl\nc3SCCXQ4NjIudGVzdIIJdDg2My50ZXN0ggl0ODY0LnRlc3SCCXQ4NjUudGVzdIIJ\ndDg2Ni50ZXN0ggl0ODY3LnRlc3SCCXQ4NjgudGVzdIIJdDg2OS50ZXN0ggl0ODcw\nLnRlc3SCCXQ4NzEudGVzdIIJdDg3Mi50ZXN0ggl0ODczLnRlc3SCCXQ4NzQudGVz\ndIIJdDg3NS50ZXN0ggl0ODc2LnRlc3SCCXQ4NzcudGVzdIIJdDg3OC50ZXN0ggl0\nODc5LnRlc3SCCXQ4ODAudGVzdIIJdDg4MS50ZXN0ggl0ODgyLnRlc3SCCXQ4ODMu\ndGVzdIIJdDg4NC50ZXN0ggl0ODg1LnRlc3SCCXQ4ODYudGVzdIIJdDg4Ny50ZXN0\nggl0ODg4LnRlc3SCCXQ4ODkudGVzdIIJdDg5MC50ZXN0ggl0ODkxLnRlc3SCCXQ4\nOTIudGVzdIIJdDg5My50ZXN0ggl0ODk0LnRlc3SCCXQ4OTUudGVzdIIJdDg5Ni50\nZXN0ggl0ODk3LnRlc3SCCXQ4OTgudGVzdIIJdDg5OS50ZXN0ggl0OTAwLnRlc3SC\nCXQ5MDEudGVzdIIJdDkwMi50ZXN0ggl0OTAzLnRlc3SCCXQ5MDQudGVzdIIJdDkw\nNS50ZXN0ggl0OTA2LnRlc3SCCXQ5MDcudGVzdIIJdDkwOC50ZXN0ggl0OTA5LnRl\nc3SCCXQ5MTAudGVzdIIJdDkxMS50ZXN0ggl0OTEyLnRlc3SCCXQ5MTMudGVzdIIJ\ndDkxNC50ZXN0ggl0OTE1LnRlc3SCCXQ5MTYudGVzdIIJdDkxNy50ZXN0ggl0OTE4\nLnRlc3SCCXQ5MTkudGVzdIIJdDkyMC50ZXN0ggl0OTIxLnRlc3SCCXQ5MjIudGVz\ndIIJdDkyMy50ZXN0ggl0OTI0LnRlc3SCCXQ5MjUudGVzdIIJdDkyNi50ZXN0ggl0\nOTI3LnRlc3SCCXQ5MjgudGVzdIIJdDkyOS50ZXN0ggl0OTMwLnRlc3SCCXQ5MzEu\ndGVzdIIJdDkzMi50ZXN0ggl0OTMzLnRlc3SCCXQ5MzQudGVzdIIJdDkzNS50ZXN0\nggl0OTM2LnRlc3SCCXQ5MzcudGVzdIIJdDkzOC50ZXN0ggl0OTM5LnRlc3SCCXQ5\nNDAudGVzdIIJdDk0MS50ZXN0ggl0OTQyLnRlc3SCCXQ5NDMudGVzdIIJdDk0NC50\nZXN0ggl0OTQ1LnRlc3SCCXQ5NDYudGVzdIIJdDk0Ny50ZXN0ggl0OTQ4LnRlc3SC\nCXQ5NDkudGVzdIIJdDk1MC50ZXN0ggl0OTUxLnRlc3SCCXQ5NTIudGVzdIIJdDk1\nMy50ZXN0ggl0OTU0LnRlc3SCCXQ5NTUudGVzdIIJdDk1Ni50ZXN0ggl0OTU3LnRl\nc3SCCXQ5NTgudGVzdIIJdDk1OS50ZXN0ggl0OTYwLnRlc3SCCXQ5NjEudGVzdIIJ\ndDk2Mi50ZXN0ggl0OTYzLnRlc3SCCXQ5NjQudGVzdIIJdDk2NS50ZXN0ggl0OTY2\nLnRlc3SCCXQ5NjcudGVzdIIJdDk2OC50ZXN0ggl0OTY5LnRlc3SCCXQ5NzAudGVz\ndIIJdDk3MS50ZXN0ggl0OTcyLnRlc3SCCXQ5NzMudGVzdIIJdDk3NC50ZXN0ggl0\nOTc1LnRlc3SCCXQ5NzYudGVzdIIJdDk3Ny50ZXN0ggl0OTc4LnRlc3SCCXQ5Nzku\ndGVzdIIJdDk4MC50ZXN0ggl0OTgxLnRlc3SCCXQ5ODIudGVzdIIJdDk4My50ZXN0\nggl0OTg0LnRlc3SCCXQ5ODUudGVzdIIJdDk4Ni50ZXN0ggl0OTg3LnRlc3SCCXQ5\nODgudGVzdIIJdDk4OS50ZXN0ggl0OTkwLnRlc3SCCXQ5OTEudGVzdIIJdDk5Mi50\nZXN0ggl0OTkzLnRlc3SCCXQ5OTQudGVzdIIJdDk5NS50ZXN0ggl0OTk2LnRlc3SC\nCXQ5OTcudGVzdIIJdDk5OC50ZXN0ggl0OTk5LnRlc3SCCnQxMDAwLnRlc3SCCnQx\nMDAxLnRlc3SCCnQxMDAyLnRlc3SCCnQxMDAzLnRlc3SCCnQxMDA0LnRlc3SCCnQx\nMDA1LnRlc3SCCnQxMDA2LnRlc3SCCnQxMDA3LnRlc3SCCnQxMDA4LnRlc3SCCnQx\nMDA5LnRlc3SCCnQxMDEwLnRlc3SCCnQxMDExLnRlc3SCCnQxMDEyLnRlc3SCCnQx\nMDEzLnRlc3SCCnQxMDE0LnRlc3SCCnQxMDE1LnRlc3SCCnQxMDE2LnRlc3SCCnQx\nMDE3LnRlc3SCCnQxMDE4LnRlc3SCCnQxMDE5LnRlc3SCCnQxMDIwLnRlc3SCCnQx\nMDIxLnRlc3SCCnQxMDIyLnRlc3SCCnQxMDIzLnRlc3SCCnQxMDI0LnRlc3QwDQYJ\nKoZIhvcNAQELBQADggEBAGfZxjrjcjFw5FnJMzq7SIad+JpmvMar7VnzXj84hjoV\nFuUqiclqjg1KRD7aIh5M1VEQv+AAk8UP6jMrvLJpoi5OD8ljivNA8zycj1N/LhNq\n8MjZauCTS+tuXIoh5hOE/TQqY6cUxY4LRBLIFIcbH0FGF22amCtowMVbRoaUpPvr\nGR5OXPAS3yRiEWrp703c21o3hw9QckB82z7Lxnt3oOFPg62EFPXiqE07Wkw/1xH4\nJ9yy45XW5A77kfel22hVs873QVHI+GkKoTPe/q6eQVgesR2vpDRytKDP9K4tK4KS\n6hqVxj6a8Eqund0izSV+UXkskc9iN6EPXvVTELo3hD8=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen94 = 37039;
+static const size_t kLen95 = 37039;
 
-static const char *kData94[] = {
+static const char *kData95[] = {
     "-----BEGIN CERTIFICATE-----\nMIJqrDCCaZSgAwIBAgIBBDANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowgmfXMRAwDgYDVQQDEwd0\nMC50ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nMUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nM0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nNUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nN0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0OEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nOUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTBAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDExQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxMkB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0MTNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDE0QHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQxNUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTZAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDE3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxOEB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0MTlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDIwQHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQyMUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjJAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDIzQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQyNEB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0MjVAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDI2QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQyN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjhAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDI5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzMEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDMy\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzM0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nMzRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDM1QHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQzNkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzdAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDM4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzOUB0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0NDBAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQxQHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ0MkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDNAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDQ0QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ0NUB0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0NDZAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQ3QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ0OEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDlAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDUwQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1MUB0ZXN0\nMRcwFQYJKoZIhvcNAQkBFgh0NTJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDUzQHRl\nc3QxFzAVBgkqhkiG9w0BCQEWCHQ1NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NTVA\ndGVzdDEXMBUGCSqGSIb3DQEJARYIdDU2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1\nN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NThAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDU5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2MEB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0NjFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDYyQHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQ2M0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NjRAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDY1QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2NkB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0NjdAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDY4QHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQ2OUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzBAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDcxQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3MkB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0NzNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDc0QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQ3NUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzZAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDc3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3OEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgw\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4MUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nODJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgzQHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQ4NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0ODVAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDg2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4N0B0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0ODhAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDg5QHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ5MEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTFAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDkyQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5M0B0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0OTRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDk1QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ5NkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTdAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDk4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTAwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTAzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEwNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTA2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTA5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDExMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTEyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEx\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTE1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxMTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDExN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTE4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDEyMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTIxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxMjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTI0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTI3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEyOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTMwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEzMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTMzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDEzNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEz\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTQyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE0NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTQ1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTQ4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTUxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE1M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTU0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTU3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE1OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTY2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE2OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTY5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTcyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTc1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE3N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTc4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTgxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxODJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE4M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxODVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxODhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTkwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE5MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTkzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxOTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTk2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTk5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIwMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjAyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIwNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjA1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIwN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjA4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIx\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjExQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjE0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDIxNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjE3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyMThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjIwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjIzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIyNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjI2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjI5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIzMUB0ZXN0MRgwFgY",
     "JKoZIhvcNAQkBFgl0MjMyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIz\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjM1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIzN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjM4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI0MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjQxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjQ0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI0OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjUwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjUzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI1NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyNjBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjYyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI2NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjY1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNjZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjY4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjcxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI3M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjc0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNzVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mjc3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzhAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI3OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyODFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyODRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0Mjg2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyODdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI4OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjg5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyOTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjkyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjk1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI5N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjk4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyOTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzAxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMwM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMw\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMDhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzEwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMxMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzEzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzE2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzE5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDMyMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzIyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzMjNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMyNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzI1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMyN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzI4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMz\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzMxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMzJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzM0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMzVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMzNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzM3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMzhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzQwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzQzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM0NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzQ2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzQ5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM1MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzUyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzU1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzNTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzU4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM2MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzYxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzNjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzY0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzY3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM2OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzcwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzczQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM3NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzODBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzgyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM4NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzg1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzODZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0Mzg4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzkxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM5M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzk0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzOTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mzk3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM5OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQw\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MDRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQwNUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDA2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQwOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDA5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxMUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDEyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDE1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQxN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDE4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0MTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDIxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQyM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQy\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MjhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDMwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQzMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDMzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MzRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDM2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDM5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ0MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ0NEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDQ1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ0N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQ4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDUxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1M0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDU0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ1NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDU3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0NThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDYwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDYzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjRAd",
     "GVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ2NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDY2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDY5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ3MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDcyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDc1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDc4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ4MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDgxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0ODJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDg0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDg3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ4OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDkwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0OTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDkzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ5NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1MDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwMUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTAyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDUwNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTA1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1MDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwN0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTA4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDUxMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTExQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDUxM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTE0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ1MTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUxNkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NTE3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDUxOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTIwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUy\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTIzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1MjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUyNUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTI2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDUyOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTI5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1MzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUzMUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTMyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDUzNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTM1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDUzN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTM4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ1MzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU0MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NTQxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NDJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDU0M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTQ0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NDVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU0\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1NDhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU0OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTUwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDU1MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTUzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1NTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU1NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTU2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDU1OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTU5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NjBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDU2MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTYyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ1NjNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU2NEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NTY1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NjZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDU2N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTY4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NjlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU3\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTcxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1NzJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU3M0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTc0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1NzVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDU3NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTc3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1NzhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU3OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTgwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1ODFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDU4MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTgzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1ODRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDU4NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTg2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ1ODdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU4OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NTg5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1OTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDU5MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTkyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ1OTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU5\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTk1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1OTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDU5N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTk4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1OTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDYwMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjAxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ2MDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYwM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NjA0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDYwNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNjA3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDYwOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjEwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ2MTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYxMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NjEzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDYxNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjE2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYx\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjE5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ2MjBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYyMUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NjIyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MjNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDYyNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjI1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ2MjZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYyN0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NjI4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MjlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDYzMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNjMxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MzJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDYzM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjM0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ2MzVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDYzNkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NjM3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2MzhAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDYzOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjQwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NDFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY0\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjQzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ2NDRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY0NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NjQ2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NDdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDY0OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjQ5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ2NTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY1MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NjUyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDY1NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNjU1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDY1N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjU4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ2NTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY2MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NjYxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NjJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDY2M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjY0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NjVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY2\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjY3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ2NjhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY2OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NjcwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NzFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDY3MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjczQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ2NzRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY3NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0Njc2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2NzdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDY3OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNjc5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2ODBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDY4MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjgyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ2ODNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY4NEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Njg1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2ODZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDY4N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Njg4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ2ODlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY5\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NjkxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ2OTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY5M0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0Njk0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ2OTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDY5NkB0ZXN0MRgwFgYJKoZIhvcNAQk",
     "BFgl0Njk3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ2OThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDY5OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NzAwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDcwMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNzAzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDcwNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzA2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ3MDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDcwOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NzA5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDcxMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzEyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDcx\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzE1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ3MTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDcxN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NzE4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDcyMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzIxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ3MjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDcyM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NzI0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDcyNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNzI3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDcyOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzMwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ3MzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDczMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NzMzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDczNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzM2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ3MzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDcz\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzM5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ3NDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc0MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NzQyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDc0NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzQ1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ3NDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc0N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NzQ4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDc1MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNzUxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDc1M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzU0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ3NTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc1NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NzU3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDc1OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzYwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc2\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzYzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ3NjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc2NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NzY2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDc2OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzY5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ3NzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc3MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NzcyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDc3NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNzc1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3NzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDc3N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Nzc4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ3NzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc4MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NzgxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3ODJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDc4M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Nzg0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ3ODVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc4\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Nzg3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ3ODhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc4OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NzkwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3OTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDc5MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NzkzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ3OTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDc5NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0Nzk2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ3OTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDc5OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNzk5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDgwMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODAyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ4MDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgwNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0ODA1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDgwN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODA4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgx\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODExQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ4MTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgxM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0ODE0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDgxNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODE3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ4MThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgxOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0ODIwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDgyMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nODIzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MjRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDgyNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODI2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ4MjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgyOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0ODI5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDgzMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODMyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgz\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODM1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ4MzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDgzN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0ODM4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4MzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDg0MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODQxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ4NDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg0M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0ODQ0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDg0NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nODQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDg0OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODUwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ4NTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg1MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0ODUzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDg1NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODU2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg1\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODU5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ4NjBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg2MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0ODYyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NjNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDg2NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODY1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ4NjZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg2N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0ODY4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NjlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDg3MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nODcxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NzJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDg3M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODc0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ4NzVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg3NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0ODc3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4NzhAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDg3OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODgwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ4ODFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg4\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODgzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ4ODRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg4NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0ODg2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4ODdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDg4OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODg5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ4OTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDg5MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0ODkyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4OTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDg5NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nODk1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ4OTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDg5N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0ODk4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ4OTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkwMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0OTAxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MDJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDkwM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTA0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MDVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkw\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTA3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ5MDhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkwOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0OTEwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDkxMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTEzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ5MTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkxNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0OTE2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDkxOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nOTE5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MjBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDkyMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTIyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ5MjNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkyNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0OTI1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MjZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDkyN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTI4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MjlAdGVzdDEYMBYGC",
     "SqGSIb3DQEJARYJdDkz\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTMxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ5MzJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkzM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0OTM0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5MzVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDkzNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTM3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ5MzhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDkzOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0OTQwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDk0MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nOTQzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDk0NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTQ2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ5NDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk0OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0OTQ5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDk1MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTUyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk1\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTU1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ5NTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk1N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0OTU4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDk2MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTYxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ5NjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk2M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0OTY0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDk2NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nOTY3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDk2OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTcwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ5NzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk3MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0OTczQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDk3NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTc2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ5NzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk3\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTc5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ5ODBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk4MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0OTgyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5ODNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDk4NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTg1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ5ODZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk4N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0OTg4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5ODlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDk5MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nOTkxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5OTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDk5M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0OTk0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ5OTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDk5NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0OTk3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ5OThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDk5OUB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAwMEB0\nZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAwMUB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0\nMTAwMkB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAwM0B0ZXN0MRkwFwYJKoZIhvcN\nAQkBFgp0MTAwNEB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAwNUB0ZXN0MRkwFwYJ\nKoZIhvcNAQkBFgp0MTAwNkB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAwN0B0ZXN0\nMRkwFwYJKoZIhvcNAQkBFgp0MTAwOEB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAw\nOUB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxMEB0ZXN0MRkwFwYJKoZIhvcNAQkB\nFgp0MTAxMUB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxMkB0ZXN0MRkwFwYJKoZI\nhvcNAQkBFgp0MTAxM0B0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxNEB0ZXN0MRkw\nFwYJKoZIhvcNAQkBFgp0MTAxNUB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxNkB0\nZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxN0B0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0\nMTAxOEB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAxOUB0ZXN0MRkwFwYJKoZIhvcN\nAQkBFgp0MTAyMEB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAyMUB0ZXN0MRkwFwYJ\nKoZIhvcNAQkBFgp0MTAyMkB0ZXN0MRkwFwYJKoZIhvcNAQkBFgp0MTAyM0B0ZXN0\nMRkwFwYJKoZIhvcNAQkBFgp0MTAyNEB0ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57\n+EWssZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEix\noiXCzepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lq\nZ1Aky+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRz\nYeIs2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTO\ngnmET19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABo0kwRzAOBgNVHQ8BAf8E\nBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADASBgNVHREE\nCzAJggd0MC50ZXN0MA0GCSqGSIb3DQEBCwUAA4IBAQAi7LIMyX5Ec514hvjROZ8b\n7i4UR3xd5IbniVSej+PKZhG2inN6aX9bksdda0ddYZeRSHAkNJuoabeankQJ/x5x\nsxBntWSVLCxz6S8NRrLAPKKPBvFb/W5ns57LP9SrLIij9l/NSd+K/CQNTlfcdorg\n4ltPVNwSMp/XXjH6rQYJSbo9MhDoxeqPpv73e4jY0DfGn1a8uwyCXalLjh4EkUyS\nYe0N7MoUKV0IucrXKdgj2sHgBFqNKJ/GVQ422xZRbYqsyIJ0bPD6Fc8VcqfVrvYg\nlCYJfu7Xij5n3mjQaSYcbVxH71X8fYhhNq1tk+WtQOXirz2EkSuh1rNGU/LT8Q6r\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen95 = 13599;
+static const size_t kLen96 = 1099;
 
-static const char *kData95[] = {
+static const char *kData96[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIC/TCCAbmgAwIBAgIBADA5BgkqhkiG9w0BAQowLKALMAkGBSsOAwIaBQChGDAW\nBgkqhkiG9w0BAQgwCQYFKw4DAhoFAKIDAgEUMBQxEjAQBgNVBAMMCUJvcmluZ1NT\nTDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkxMjMxMjM1OTU5WjAUMRIwEAYDVQQD\nDAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6C9qE\nGRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPhCm3DLnv4RayxkFwemtnkGRZ/o94Z\nnsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARIhIQcSLGiJcLN6kGuG2nlRBKMcPgP\niEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyKj32neWpnUCTL5o2VwyPoxjLxT5gU\nR69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRTzNv+ZHNh4izZHrktR25MvnT5QyBq\n32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEmgyvU9M6CeYRPX1Ykfg+sXCTtkTVA\nlBDUviIqY95CKy25AgMBAAEwOQYJKoZIhvcNAQEKMCygCzAJBgUrDgMCGgUAoRgw\nFgYJKoZIhvcNAQEIMAkGBSsOAwIaBQCiAwIBFAOCAQEATo0Z3YqPt4fzBXz22vyH\n7Ckr1cicKTeE3lV8LYHII4easVkueN7HrfrpTPu04kn4Y8pjprh0gRj9vcf6i6Sj\nkhPnfmXTTbeFxHs763BQVAOoutgteyUhBZ5UjqaXnnF7PYhyG/0ykxWryvius+dz\nujhW9T0aPo95GWITtj1NHzGmCjQYqUSrfkJynC8c/juTo3MLWrMnirDsAYizTg4W\nCWBfeMKRfAH6aOybSBNZh7/KU+ZiFPKJi+NKPPaZNZa0l1JZ46LL1NWVq6bybZH8\nncNZpooQKTfCaK221pbqxx4YIJT0NoICU8291LSNLz8/5uBkjUo744cF4tuNFZ4k\nsg==\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen97 = 1025;
+
+static const char *kData97[] = {
+    "-----BEGIN CERTIFICATE-----\nMIICxzCCAZ6gAwIBAgIBADAeBgkqhkiG9w0BAQowEaEPMA0GCSqGSIb3DQEBCDAA\nMBQxEjAQBgNVBAMMCUJvcmluZ1NTTDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkx\nMjMxMjM1OTU5WjAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQC6C9qEGRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPh\nCm3DLnv4RayxkFwemtnkGRZ/o94ZnsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARI\nhIQcSLGiJcLN6kGuG2nlRBKMcPgPiEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyK\nj32neWpnUCTL5o2VwyPoxjLxT5gUR69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRT\nzNv+ZHNh4izZHrktR25MvnT5QyBq32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEm\ngyvU9M6CeYRPX1Ykfg+sXCTtkTVAlBDUviIqY95CKy25AgMBAAEwHgYJKoZIhvcN\nAQEKMBGhDzANBgkqhkiG9w0BAQgwAAOCAQEANdpvRLqZLsYfruBHXjviZaKoHeoQ\n1ixqeSLzcP0KzWRT3H3tX46KuYABaMurK0yPMDfW6oLCfJa3fUFt0FYJYnf/w7mp\nMsmOf+7aaY8oYqI6wRwtAB0JQcC2tKsio+UEiI6hZq2ghhGa5c+YLXhN4Dt+/cK9\nUkisKL4O61jKulfaErOsUSaYTo9/PJpPcUhE/zVtsfAGJH0ojSCrSpEYv4TNO9Qm\nWOJ4hMreEOLVxw4xC65wRmOWl4JpGxle1mNzjsL4kOcDwsnepEOcpAqJronQ+HnI\n1RCR04oEnOOWYAtFxuWzTds3BjszGPRSu3srGZpaI1j/kB+a3g/7hXufOA==\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen98 = 977;
+
+static const char *kData98[] = {
+    "-----BEGIN CERTIFICATE-----\nMIICpTCCAY2gAwIBAgIBADANBgkqhkiG9w0BAQowADAUMRIwEAYDVQQDDAlCb3Jp\nbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAG\nA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkW\nf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQS\njHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy\n8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50\n+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk\n7ZE1QJQQ1L4iKmPeQistuQIDAQABMA0GCSqGSIb3DQEBCjAAA4IBAQAQvYDcDDNx\nQPctGNiZTH9N2I2wdVXHmsybRW7tXWVYm+yE8IzfVUUBkCL5WvbLxlujMAbQpHp8\nEnKECVsNAklHAAQ6KFDTngyDAjdyGiNKKMm37UW/I7BkdFZE+jBYKoVU5xeLSPm1\njNKQWqjGnaZ+wV7Fl8Zy+QOr7Z35zrDNbCF/EkzoE6+i/bbqXIgu5x14rj9c4JAs\naKPpTtpDI1zt9BfGMPsBxsxeckqnG8OlNc6YI8svAK849naTAPx93jDWmDBYqfsb\nMeZOo9+AfUP7pjoDZHsQCmPdmlDgAtMvi8K1oFbw4BBTu+CaCzhNS5xEbITef09i\ntjiySH0Q5r01\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen99 = 1119;
+
+static const char *kData99[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCBAUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCBAUAogMCARwwFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCBAUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCBAUAogMCARwDggEB\nAHttVo+XfLdlRXHc59yGAr7wQgqIbWOD6QSo4Tb4XbAh4nc9MQhccfT4YOMyHa9I\ni1VyE9e2dna8gt9VfIyCeTnNS1RYbKagaUzo2dt/G0lQjfXRVkB1yobJEaAzZ8kg\ncbknjlrlMEtHW+ET2vTHKvOjHjHXy3GYt8ynSldnotikqVobW5Kd/nYR7s9SR1Yz\nVhweDRcWeb3IYSAx953t1voky/7pTltcyb5FfJLIPmj2AsoFSRnXrj1Sx0K+S68m\nE0TdKwOTr2QN9nmHrIbCIeiAVeBlIOY6jH8TjobwFV2Y3RlqC+8S+Vgje/Hg/jrV\nQ9fS9+RIVSOFZiOgW/1hjAA=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen100 = 1131;
+
+static const char *kData100[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDFzCCAcagAwIBAgIBADBGBgkqhkiG9w0BAQowOaAPMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASCjAwIBATAUMRIwEAYD\nVQQDDAlCb3JpbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1\nOVowFDESMBAGA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWs\nsZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXC\nzepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Ak\ny+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs\n2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmE\nT19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABMEYGCSqGSIb3DQEBCjA5oA8w\nDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIB\nIKMDAgEBA4IBAQA6p/W2ZA06aYzRXL1v/VnU11udk5+UIbGAuhSVv9a+zJ4/79UX\nXk4/otg74fq/Ayy3hPm9lcOTGbXYHSgY4eFR8J1VS/P2ZPRCyypXwLSYg+Yt5Fdc\nSaA2JVF2jrgMbIAzBsyz4CCOzajcF/he8+NmH7pDZhLGv4pIWaFqAPrGntIpPwVW\nQib62z9qzeexXIm+1Jp3nh21sXLbWdBM5tt5NNqST+cgzzrRnPtwQTbdcKk9i4Jh\n3/BairkWclVHxibtNPoLvhU91tJw61rES29x3vG//7WwEoT2aLCkp9/ZHrM5ukpe\nRxWXU+JZXiO59WWDCdK0YAuoteozepn4Cwei\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen101 = 1119;
+
+static const char *kData101[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCASAwFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCASADggEB\nAFMuNrMzLKfCvjDw35e5aoOPsTHKmkreUl4yHjUxX3i0heSkvy3FFcXhGjOscySF\nhBoAZU1DJaIHGzq2/k9Z3pk+NFhLg6tlHvLgcySHl4kR4sqTceJeOgy4RHJU04Gv\nwFAfRXx8QTJr1d00EPBoSnj7afDtvcRkzDSsgQ+YiQ9zjvt+uzuhZ25CUw8KY+Xy\nCZqQYE5yIMMRoKZExPcXuWTD8Ho5pVxjeLv2+nEO73NaAP0FwisCuY98ng0ffTgG\n5biORaDLzoTQv0QXtHS5TRUd6ycQ7nW28M4U1ZP9s9gj1zl+emvmi1UjNs3bcRW3\nJk0lRwKo8awDUhfWJ/YPIns=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen102 = 1082;
+
+static const char *kData102[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIC8zCCAbSgAwIBAgIBADA0BgkqhkiG9w0BAQowJ6APMA0GCWCGSAFlAwQCAQUA\noQ8wDQYJKoZIhvcNAQEIMACiAwIBIDAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwIhgP\nMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAGA1UEAwwJQm9y\naW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAugvahBkSAUF1\nfC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkWf6PeGZ7F5AX1\nPyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQSjHD4D4hKtgdM\ngVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy8U+YFEevb/V0\nlRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50+UMgat9ocewI\n2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk7ZE1QJQQ1L4i\nKmPeQistuQIDAQABMDQGCSqGSIb3DQEBCjAnoA8wDQYJYIZIAWUDBAIBBQChDzAN\nBgkqhkiG9w0BAQgwAKIDAgEgA4IBAQAJ0RuKq+OgFlcm2EMk+VXH8hSo87N3wcyK\n9SzLwONh2uVYR3W1ig+/EwqK0M9w5UwvSVNdFa3m2qVXApprUm7eCJ2c7rWiBkQy\nsVCHwWVCseItZ8ipJHHz0uC5k3EFBSVbsbRdTJ8FPbRDBXXn2iSz6OzUJVZ5PfV1\nXRC81Aoi8DbhFwNga7/mJ80Ru4UGEePT6SsyUU5sgZ0w37r+5VPQgL4oOMO2NKz+\nO060CbcDcOXrCm1x0BXIOc7gZEao5mriJTFQTq4PsuMnJ9a7aU+PYPfTxptr/VxB\nyJJSi0sjTpqmWKStBjeZlEYq57nWZLmueA9xf8T1Ah6WRDRFo8m1\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen103 = 1107;
+
+static const char *kData103[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDBTCCAb2gAwIBAgIBADA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa\nMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDAUMRIwEAYDVQQDDAlCb3Jp\nbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAG\nA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkW\nf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQS\njHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy\n8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50\n+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk\n7ZE1QJQQ1L4iKmPeQistuQIDAQABMD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUD\nBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIDAgEgA4IBAQAss/sOR0J5\nrAmctg1qnUYeUKr3RN2MTAb58ZsbE9Gvjr4lgdRo4ADIwqfKYcEe3Xms0WO8gAle\nefbzrcqM1wZ6wjdcZEI9xz2L5moX0lD40Jd18OFe4wrmt7eMCaz+gTdHx+5uQy53\n4H+Vw6IUeO9m1K1wqDkwsiPWv22FqKghD07wKiNR7bkPnQDERRRN6UliCFfMEXOx\nh9IbYJQUIVvBFqkI9C/lKbrmxdS7fv3wFnu61knkh7JNIXXWNdYHHRDqNDZOhakn\n0wf3qY359CofKk+9kg/9cj1lP8HwgATxL69pBmSvM7O6ybDRhp4+/oySQCbcOIfs\nIOo8AoyPo4u2\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen104 = 1139;
+
+static const char *kData104[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDGzCCAcigAwIBAgIBADBIBgkqhkiG9w0BAQowO6APMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogoCCEAAAAAAAAAgMBQxEjAQ\nBgNVBAMMCUJvcmluZ1NTTDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkxMjMxMjM1\nOTU5WjAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQC6C9qEGRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPhCm3DLnv4\nRayxkFwemtnkGRZ/o94ZnsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARIhIQcSLGi\nJcLN6kGuG2nlRBKMcPgPiEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyKj32neWpn\nUCTL5o2VwyPoxjLxT5gUR69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRTzNv+ZHNh\n4izZHrktR25MvnT5QyBq32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEmgyvU9M6C\neYRPX1Ykfg+sXCTtkTVAlBDUviIqY95CKy25AgMBAAEwSAYJKoZIhvcNAQEKMDug\nDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIK\nAghAAAAAAAAAIAOCAQEAn7ufGUhwZUfP13AEXFZGo7tpWYKbiDpVnHTtj/21/SWd\nTXP1LJWIJuo8pGs/ZsXI+XoXJMk01G1wVPPUny/D7T9WXLW191UFzIGO0bJZIfv2\nM9YbRkTsCiAYUuyFUlwwSLMqMXrZjRXlgulv3DjWrDHrAqfst847Ety24P1uYG7C\nm4JV8Sa0SIKRntd00YYmk6oUZNgEzUps7moLsOEox3U2s6wTipl/++9H5CI5mQTS\nfdGMRzEsuJRfXkgMccEfDw2wvNfmNzILGDsvxjCilkEisuMPxlRptSk5agYFujAW\nD3QjJGCgGlSXhN3JuH9S2/0N5gRQpN/98beTTXpxvg==\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen105 = 1119;
+
+static const char *kData105[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCAR8wFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCAR8DggEB\nACRCt8NtcKkDg86ub1PiWSws4b/5v9ujPbatTrocCOXnob3Z4dnHKpjeUC0et/ex\ns4hlluZ9WHb+WgR5LP7I1eIE5C1RIL5aVLguSBi8/qQICNVgeMvZSgv/mDJ0eiv2\nxztcYlDwANPIh2RDpVyD6qUphvH8W6vrd6mo3aYgegigaDr/8d01MZh5s4120iWn\n+8XKXNep8YqLhYemn3WeXtvK4vEEdFln6WeRRlGKevX9LqOegshs8HgKjjYRH++I\nc5HtwRZFkkMnXOV0XyG5zPrsx0qDcJCGHrC20bM+ZZz60QOtb1BSMIS5KjMy5OPQ\nbueM0YwX72tPKox+3lJgXAk=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen106 = 1127;
+
+static const char *kData106[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDEzCCAcSgAwIBAgIBADBEBgkqhkiG9w0BAQowN6APMA0GCWCGSAFlAwQCAQUA\noR8wHQYMKoZIhvcSBAGEtwkAMA0GCWCGSAFlAwQCAQUAogMCASAwFDESMBAGA1UE\nAwwJQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTla\nMBQxEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQ\nXB6a2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3q\nQa4baeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvm\njZXDI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNke\nuS1Hbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9f\nViR+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBEBgkqhkiG9w0BAQowN6APMA0G\nCWCGSAFlAwQCAQUAoR8wHQYMKoZIhvcSBAGEtwkAMA0GCWCGSAFlAwQCAQUAogMC\nASADggEBACdP7ToiiM+6TqeAbKRqsPuFX9Q0qJtjX8mGVyzOEy402hEhglMeL9il\nFFFKCgo/wux4VIbw7BVLFDfYPcj8E7snj+J0mITIFt5oCwXG+MrJUnfklBEEyelF\nkVyr1ZVIwsk/lWSaOcQocbx8/szRRhwwVTT7BySnMV4e/y7Z9beye6tl7lg4373K\nE4akVubalnkoTHP5fZ6f0AfOXJEnLw2Mn0zjwrZmasMyXxLH8ApUVruPBQHY7IQB\nsMAURzkRtcCyzhQniJFcu7oMmkj+v8FVG02792DOWP+Y/yC0ccmHcvDbdzJW5SDm\nrBvNkmnPt6sYs7/RLRaVky7cRMAQrFs=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen107 = 1243;
+
+static const char *kData107[] = {
+    "This certificate has a trailerField of 2, but the signature was still\ngenerated with the standard 0xbc suffix.\n\n-----BEGIN CERTIFICATE-----\nMIIDFzCCAcagAwIBAgIBADBGBgkqhkiG9w0BAQowOaAPMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASCjAwIBAjAUMRIwEAYD\nVQQDDAlCb3JpbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1\nOVowFDESMBAGA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWs\nsZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXC\nzepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Ak\ny+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs\n2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmE\nT19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABMEYGCSqGSIb3DQEBCjA5oA8w\nDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIB\nIKMDAgECA4IBAQCVtDpbDRnbn7UQd8sPq+XSHk2nwvlhwSKZ0XZ0vwBGkNuhO/SY\nBhVUez+uGxXnJE+MkVAAh3NOdEQV6apEX5tymCyB0vqwLQB86gANOt82kF/tOW4M\nSv5f6L8GJbYtpTd/cyAMEs7U/X9O5W1G9sLINWeukUYHPVKjj/tE3NfLCE8SWlw4\nSCnbuhs5WXnEgUP/9JgL8xyI6bxn9E2OUvqD+U24k0PbtAdk09697gUYUDQlmxi6\nMRoQYKTezNJt4DXRhqUlokWiF5D42MaMz5WXtLQaBfbqQB6n1Ln+hTaGwWP6xNSm\nMip0TYOwAQdcTvr8UoQUJR/90SX+S4m6cu4d\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen108 = 1119;
+
+static const char *kData108[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggEB\nALVhRTv78XF2RjMusWAuTknDWkju6uvtq+iTpwCWaJO2QA2L3spEiUw52PsW9gQW\nAIOttLlgQFPD3dt3OL0FBK5y79Rh/h/mrOpwbVoMOHSsgikVZhbQ0D30Y8LQYMTD\ncxDYgPbnI4Q1VatdcCR8aavSDfV4JGPpJPkz8QX6HaFAoCUAz5UhiiS3MT8IzucO\nnNOV7AH9yfWDfvCWDGyuIYphjFZ761VjZFFIGJuXZ9uDXDDjNxlLwO7sci/pwO89\nOiRM40RxkS9vl8MjIsFSMGXOR+mf+FNtQ2vF1ZqCVxPWFuHHwmXycqrLuY3fOboF\ntF5Q3O1V7sh5Bs47h29KbQU=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen109 = 1119;
+
+static const char *kData109[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAgUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCAgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATADggEB\nAASUWBIEjb0TkXJKhj3RNRRe0D+KWFpyAn/kdBgDce/LEQVywj8IeS+s9z9TcGEK\niKr8tPIsNUM1agj3gd1zWuM5rbUABQyGzeWcfjmhmhK5mnCSOu/OD+DJjWqyHpQq\n/Qf2djrpXJXKVNoSBzci4KUpFIfKMT4KjnUKY9L8lxfl9zaPeIaFeXgtyhHYnpjX\nvyomoLaL3cXeeKIffgPa9s9QZGx2fKOnFmcS3eKL9pIcj4Z6K8+Nchg6Z2qYKWtM\nhH1ZFlNDC3VOPgNkHoBrU6gE5fQv6lO64egL9pM0bpaOi7drhHKjkw2URi4C9KGK\nP9GfRmqV9Y9UlJsLSGIghxs=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen110 = 1119;
+
+static const char *kData110[] = {
+    "-----BEGIN CERTIFICATE-----\nMIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwFDESMBAGA1UEAwwJ\nQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx\nEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a\n2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b\naeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD\nI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H\nbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+\nD6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG\nSAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEB\nADwQHPC6MMvgBBfgYHRvcdQqfzPb3I9HJa+Y01BAIAeICadmyB389cjhv9X1mFi9\nxJOhsuek71D4YrOghExMbGXIAlalAq/rQHTzXV6cqiSrbUmmvsLmlilOeODIjuUC\nz3Ldc5LvwU8nima46jP/ryMYaIjCpbNsH/MzAbYO/CNm8osjeJoKhGyozkj9tr2T\nJaSFe5icta2WHfjfLP7wSkIf3NdfXNkBIBKMdHCuiEgeUeSColpgAFfngFKIJ3EG\nEbgptjPoePJ0T6VOdwzSX+QhGLabaOiX0ptrhAwuCNHVAKuf5wCWKvl6mYgBaDfB\nYFmL46BAX2ghB+WM/FSizPs=\n-----END CERTIFICATE-----\n",
+};
+static const size_t kLen111 = 13599;
+
+static const char *kData111[] = {
     "-----BEGIN CERTIFICATE-----\nMIInDDCCJfSgAwIBAgIBBTANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowghmkMRAwDgYDVQQDEwd0\nMC50ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nMUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nM0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nNUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nN0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0OEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nOUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTBAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDExQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxMkB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0MTNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDE0QHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQxNUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTZAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDE3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxOEB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0MTlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDIwQHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQyMUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjJAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDIzQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQyNEB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0MjVAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDI2QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQyN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjhAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDI5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzMEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDMy\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzM0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nMzRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDM1QHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQzNkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzdAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDM4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzOUB0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0NDBAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQxQHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ0MkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDNAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDQ0QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ0NUB0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0NDZAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQ3QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ0OEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDlAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDUwQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1MUB0ZXN0\nMRcwFQYJKoZIhvcNAQkBFgh0NTJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDUzQHRl\nc3QxFzAVBgkqhkiG9w0BCQEWCHQ1NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NTVA\ndGVzdDEXMBUGCSqGSIb3DQEJARYIdDU2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1\nN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NThAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDU5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2MEB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0NjFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDYyQHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQ2M0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NjRAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDY1QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2NkB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0NjdAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDY4QHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQ2OUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzBAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDcxQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3MkB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0NzNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDc0QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQ3NUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzZAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDc3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3OEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgw\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4MUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nODJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgzQHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQ4NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0ODVAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDg2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4N0B0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0ODhAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDg5QHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ5MEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTFAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDkyQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5M0B0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0OTRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDk1QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ5NkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTdAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDk4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTAwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTAzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEwNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTA2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTA5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDExMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTEyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEx\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTE1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxMTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDExN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTE4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDEyMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTIxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxMjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTI0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTI3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEyOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTMwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEzMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTMzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDEzNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEz\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTQyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE0NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTQ1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTQ4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTUxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE1M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTU0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTU3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE1OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTY2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE2OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTY5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTcyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTc1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE3N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTc4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTgxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxODJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE4M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxODVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxODhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTkwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE5MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTkzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxOTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTk2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTk5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIwMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjAyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIwNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjA1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIwN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjA4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIx\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjExQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjE0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDIxNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjE3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyMThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjIwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjIzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIyNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjI2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjI5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIzMUB0ZXN0MRgwFgY",
     "JKoZIhvcNAQkBFgl0MjMyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIz\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjM1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIzN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjM4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI0MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjQxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjQ0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI0OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjUwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjUzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI1NUB0ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWs\nsZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXC\nzepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Ak\ny+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs\n2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmE\nT19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABo4IK2jCCCtYwDgYDVR0PAQH/\nBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwggqfBgNV\nHREEggqWMIIKkoIHdDAudGVzdIIHdDEudGVzdIIHdDIudGVzdIIHdDMudGVzdIIH\ndDQudGVzdIIHdDUudGVzdIIHdDYudGVzdIIHdDcudGVzdIIHdDgudGVzdIIHdDku\ndGVzdIIIdDEwLnRlc3SCCHQxMS50ZXN0ggh0MTIudGVzdIIIdDEzLnRlc3SCCHQx\nNC50ZXN0ggh0MTUudGVzdIIIdDE2LnRlc3SCCHQxNy50ZXN0ggh0MTgudGVzdIII\ndDE5LnRlc3SCCHQyMC50ZXN0ggh0MjEudGVzdIIIdDIyLnRlc3SCCHQyMy50ZXN0\nggh0MjQudGVzdIIIdDI1LnRlc3SCCHQyNi50ZXN0ggh0MjcudGVzdIIIdDI4LnRl\nc3SCCHQyOS50ZXN0ggh0MzAudGVzdIIIdDMxLnRlc3SCCHQzMi50ZXN0ggh0MzMu\ndGVzdIIIdDM0LnRlc3SCCHQzNS50ZXN0ggh0MzYudGVzdIIIdDM3LnRlc3SCCHQz\nOC50ZXN0ggh0MzkudGVzdIIIdDQwLnRlc3SCCHQ0MS50ZXN0ggh0NDIudGVzdIII\ndDQzLnRlc3SCCHQ0NC50ZXN0ggh0NDUudGVzdIIIdDQ2LnRlc3SCCHQ0Ny50ZXN0\nggh0NDgudGVzdIIIdDQ5LnRlc3SCCHQ1MC50ZXN0ggh0NTEudGVzdIIIdDUyLnRl\nc3SCCHQ1My50ZXN0ggh0NTQudGVzdIIIdDU1LnRlc3SCCHQ1Ni50ZXN0ggh0NTcu\ndGVzdIIIdDU4LnRlc3SCCHQ1OS50ZXN0ggh0NjAudGVzdIIIdDYxLnRlc3SCCHQ2\nMi50ZXN0ggh0NjMudGVzdIIIdDY0LnRlc3SCCHQ2NS50ZXN0ggh0NjYudGVzdIII\ndDY3LnRlc3SCCHQ2OC50ZXN0ggh0NjkudGVzdIIIdDcwLnRlc3SCCHQ3MS50ZXN0\nggh0NzIudGVzdIIIdDczLnRlc3SCCHQ3NC50ZXN0ggh0NzUudGVzdIIIdDc2LnRl\nc3SCCHQ3Ny50ZXN0ggh0NzgudGVzdIIIdDc5LnRlc3SCCHQ4MC50ZXN0ggh0ODEu\ndGVzdIIIdDgyLnRlc3SCCHQ4My50ZXN0ggh0ODQudGVzdIIIdDg1LnRlc3SCCHQ4\nNi50ZXN0ggh0ODcudGVzdIIIdDg4LnRlc3SCCHQ4OS50ZXN0ggh0OTAudGVzdIII\ndDkxLnRlc3SCCHQ5Mi50ZXN0ggh0OTMudGVzdIIIdDk0LnRlc3SCCHQ5NS50ZXN0\nggh0OTYudGVzdIIIdDk3LnRlc3SCCHQ5OC50ZXN0ggh0OTkudGVzdIIJdDEwMC50\nZXN0ggl0MTAxLnRlc3SCCXQxMDIudGVzdIIJdDEwMy50ZXN0ggl0MTA0LnRlc3SC\nCXQxMDUudGVzdIIJdDEwNi50ZXN0ggl0MTA3LnRlc3SCCXQxMDgudGVzdIIJdDEw\nOS50ZXN0ggl0MTEwLnRlc3SCCXQxMTEudGVzdIIJdDExMi50ZXN0ggl0MTEzLnRl\nc3SCCXQxMTQudGVzdIIJdDExNS50ZXN0ggl0MTE2LnRlc3SCCXQxMTcudGVzdIIJ\ndDExOC50ZXN0ggl0MTE5LnRlc3SCCXQxMjAudGVzdIIJdDEyMS50ZXN0ggl0MTIy\nLnRlc3SCCXQxMjMudGVzdIIJdDEyNC50ZXN0ggl0MTI1LnRlc3SCCXQxMjYudGVz\ndIIJdDEyNy50ZXN0ggl0MTI4LnRlc3SCCXQxMjkudGVzdIIJdDEzMC50ZXN0ggl0\nMTMxLnRlc3SCCXQxMzIudGVzdIIJdDEzMy50ZXN0ggl0MTM0LnRlc3SCCXQxMzUu\ndGVzdIIJdDEzNi50ZXN0ggl0MTM3LnRlc3SCCXQxMzgudGVzdIIJdDEzOS50ZXN0\nggl0MTQwLnRlc3SCCXQxNDEudGVzdIIJdDE0Mi50ZXN0ggl0MTQzLnRlc3SCCXQx\nNDQudGVzdIIJdDE0NS50ZXN0ggl0MTQ2LnRlc3SCCXQxNDcudGVzdIIJdDE0OC50\nZXN0ggl0MTQ5LnRlc3SCCXQxNTAudGVzdIIJdDE1MS50ZXN0ggl0MTUyLnRlc3SC\nCXQxNTMudGVzdIIJdDE1NC50ZXN0ggl0MTU1LnRlc3SCCXQxNTYudGVzdIIJdDE1\nNy50ZXN0ggl0MTU4LnRlc3SCCXQxNTkudGVzdIIJdDE2MC50ZXN0ggl0MTYxLnRl\nc3SCCXQxNjIudGVzdIIJdDE2My50ZXN0ggl0MTY0LnRlc3SCCXQxNjUudGVzdIIJ\ndDE2Ni50ZXN0ggl0MTY3LnRlc3SCCXQxNjgudGVzdIIJdDE2OS50ZXN0ggl0MTcw\nLnRlc3SCCXQxNzEudGVzdIIJdDE3Mi50ZXN0ggl0MTczLnRlc3SCCXQxNzQudGVz\ndIIJdDE3NS50ZXN0ggl0MTc2LnRlc3SCCXQxNzcudGVzdIIJdDE3OC50ZXN0ggl0\nMTc5LnRlc3SCCXQxODAudGVzdIIJdDE4MS50ZXN0ggl0MTgyLnRlc3SCCXQxODMu\ndGVzdIIJdDE4NC50ZXN0ggl0MTg1LnRlc3SCCXQxODYudGVzdIIJdDE4Ny50ZXN0\nggl0MTg4LnRlc3SCCXQxODkudGVzdIIJdDE5MC50ZXN0ggl0MTkxLnRlc3SCCXQx\nOTIudGVzdIIJdDE5My50ZXN0ggl0MTk0LnRlc3SCCXQxOTUudGVzdIIJdDE5Ni50\nZXN0ggl0MTk3LnRlc3SCCXQxOTgudGVzdIIJdDE5OS50ZXN0ggl0MjAwLnRlc3SC\nCXQyMDEudGVzdIIJdDIwMi50ZXN0ggl0MjAzLnRlc3SCCXQyMDQudGVzdIIJdDIw\nNS50ZXN0ggl0MjA2LnRlc3SCCXQyMDcudGVzdIIJdDIwOC50ZXN0ggl0MjA5LnRl\nc3SCCXQyMTAudGVzdIIJdDIxMS50ZXN0ggl0MjEyLnRlc3SCCXQyMTMudGVzdIIJ\ndDIxNC50ZXN0ggl0MjE1LnRlc3SCCXQyMTYudGVzdIIJdDIxNy50ZXN0ggl0MjE4\nLnRlc3SCCXQyMTkudGVzdIIJdDIyMC50ZXN0ggl0MjIxLnRlc3SCCXQyMjIudGVz\ndIIJdDIyMy50ZXN0ggl0MjI0LnRlc3SCCXQyMjUudGVzdIIJdDIyNi50ZXN0ggl0\nMjI3LnRlc3SCCXQyMjgudGVzdIIJdDIyOS50ZXN0ggl0MjMwLnRlc3SCCXQyMzEu\ndGVzdIIJdDIzMi50ZXN0ggl0MjMzLnRlc3SCCXQyMzQudGVzdIIJdDIzNS50ZXN0\nggl0MjM2LnRlc3SCCXQyMzcudGVzdIIJdDIzOC50ZXN0ggl0MjM5LnRlc3SCCXQy\nNDAudGVzdIIJdDI0MS50ZXN0ggl0MjQyLnRlc3SCCXQyNDMudGVzdIIJdDI0NC50\nZXN0ggl0MjQ1LnRlc3SCCXQyNDYudGVzdIIJdDI0Ny50ZXN0ggl0MjQ4LnRlc3SC\nCXQyNDkudGVzdIIJdDI1MC50ZXN0ggl0MjUxLnRlc3SCCXQyNTIudGVzdIIJdDI1\nMy50ZXN0ggl0MjU0LnRlc3SCCXQyNTUudGVzdDANBgkqhkiG9w0BAQsFAAOCAQEA\nJIFn5ymMVnj0DOFldXQzAjaosat0Z1dAca0BFO/4bf+IfvpaLvZCiSucInV0ejgR\ndP3UsoiXV8qXBax1nr5t4k+yOGYbhgj3imHFtKhFaqJ45AqEJOmzCHWIN0LkN+YL\nME6JBJr86EB+diLPBS7iljmtvN7avvmJ8AbGFI6eB5BwSjewavWpv55u52zMWti7\nCa2WpKffH74zhnGqkbMzEiiRa1L1+H/uQBJ0BEeAZbr+pSkJZJvzY/eH8a7fLHra\nLfBqD4epDm6RI6gSNeJ+G7qSfpVSk7l9bsVh7rUTSSCKBxhcImudqBuLfswoa0Ub\nZoA33vstMRAur0m/blHQHA==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen96 = 8557;
+static const size_t kLen112 = 8557;
 
-static const char *kData96[] = {
+static const char *kData112[] = {
     "-----BEGIN CERTIFICATE-----\nMIIYgzCCF2ugAwIBAgIBBjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowEjEQMA4GA1UEAxMHdDAu\ndGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALoL2oQZEgFBdXwu\nPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a2eQZFn+j3hmexeQF9T8i\nWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4baeVEEoxw+A+ISrYHTIFc\nV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXDI+jGMvFPmBRHr2/1dJUW\nPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1Hbky+dPlDIGrfaHHsCNnb\n/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+D6xcJO2RNUCUENS+Iipj\n3kIrLbkCAwEAAaOCFeUwghXhMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr\nBgEFBQcDATAMBgNVHRMBAf8EAjAAMIIVqgYDVR0RBIIVoTCCFZ2CB3QwLnRlc3SC\nB3QxLnRlc3SCB3QyLnRlc3SCB3QzLnRlc3SCB3Q0LnRlc3SCB3Q1LnRlc3SCB3Q2\nLnRlc3SCB3Q3LnRlc3SCB3Q4LnRlc3SCB3Q5LnRlc3SCCHQxMC50ZXN0ggh0MTEu\ndGVzdIIIdDEyLnRlc3SCCHQxMy50ZXN0ggh0MTQudGVzdIIIdDE1LnRlc3SCCHQx\nNi50ZXN0ggh0MTcudGVzdIIIdDE4LnRlc3SCCHQxOS50ZXN0ggh0MjAudGVzdIII\ndDIxLnRlc3SCCHQyMi50ZXN0ggh0MjMudGVzdIIIdDI0LnRlc3SCCHQyNS50ZXN0\nggh0MjYudGVzdIIIdDI3LnRlc3SCCHQyOC50ZXN0ggh0MjkudGVzdIIIdDMwLnRl\nc3SCCHQzMS50ZXN0ggh0MzIudGVzdIIIdDMzLnRlc3SCCHQzNC50ZXN0ggh0MzUu\ndGVzdIIIdDM2LnRlc3SCCHQzNy50ZXN0ggh0MzgudGVzdIIIdDM5LnRlc3SCCHQ0\nMC50ZXN0ggh0NDEudGVzdIIIdDQyLnRlc3SCCHQ0My50ZXN0ggh0NDQudGVzdIII\ndDQ1LnRlc3SCCHQ0Ni50ZXN0ggh0NDcudGVzdIIIdDQ4LnRlc3SCCHQ0OS50ZXN0\nggh0NTAudGVzdIIIdDUxLnRlc3SCCHQ1Mi50ZXN0ggh0NTMudGVzdIIIdDU0LnRl\nc3SCCHQ1NS50ZXN0ggh0NTYudGVzdIIIdDU3LnRlc3SCCHQ1OC50ZXN0ggh0NTku\ndGVzdIIIdDYwLnRlc3SCCHQ2MS50ZXN0ggh0NjIudGVzdIIIdDYzLnRlc3SCCHQ2\nNC50ZXN0ggh0NjUudGVzdIIIdDY2LnRlc3SCCHQ2Ny50ZXN0ggh0NjgudGVzdIII\ndDY5LnRlc3SCCHQ3MC50ZXN0ggh0NzEudGVzdIIIdDcyLnRlc3SCCHQ3My50ZXN0\nggh0NzQudGVzdIIIdDc1LnRlc3SCCHQ3Ni50ZXN0ggh0NzcudGVzdIIIdDc4LnRl\nc3SCCHQ3OS50ZXN0ggh0ODAudGVzdIIIdDgxLnRlc3SCCHQ4Mi50ZXN0ggh0ODMu\ndGVzdIIIdDg0LnRlc3SCCHQ4NS50ZXN0ggh0ODYudGVzdIIIdDg3LnRlc3SCCHQ4\nOC50ZXN0ggh0ODkudGVzdIIIdDkwLnRlc3SCCHQ5MS50ZXN0ggh0OTIudGVzdIII\ndDkzLnRlc3SCCHQ5NC50ZXN0ggh0OTUudGVzdIIIdDk2LnRlc3SCCHQ5Ny50ZXN0\nggh0OTgudGVzdIIIdDk5LnRlc3SCCXQxMDAudGVzdIIJdDEwMS50ZXN0ggl0MTAy\nLnRlc3SCCXQxMDMudGVzdIIJdDEwNC50ZXN0ggl0MTA1LnRlc3SCCXQxMDYudGVz\ndIIJdDEwNy50ZXN0ggl0MTA4LnRlc3SCCXQxMDkudGVzdIIJdDExMC50ZXN0ggl0\nMTExLnRlc3SCCXQxMTIudGVzdIIJdDExMy50ZXN0ggl0MTE0LnRlc3SCCXQxMTUu\ndGVzdIIJdDExNi50ZXN0ggl0MTE3LnRlc3SCCXQxMTgudGVzdIIJdDExOS50ZXN0\nggl0MTIwLnRlc3SCCXQxMjEudGVzdIIJdDEyMi50ZXN0ggl0MTIzLnRlc3SCCXQx\nMjQudGVzdIIJdDEyNS50ZXN0ggl0MTI2LnRlc3SCCXQxMjcudGVzdIIJdDEyOC50\nZXN0ggl0MTI5LnRlc3SCCXQxMzAudGVzdIIJdDEzMS50ZXN0ggl0MTMyLnRlc3SC\nCXQxMzMudGVzdIIJdDEzNC50ZXN0ggl0MTM1LnRlc3SCCXQxMzYudGVzdIIJdDEz\nNy50ZXN0ggl0MTM4LnRlc3SCCXQxMzkudGVzdIIJdDE0MC50ZXN0ggl0MTQxLnRl\nc3SCCXQxNDIudGVzdIIJdDE0My50ZXN0ggl0MTQ0LnRlc3SCCXQxNDUudGVzdIIJ\ndDE0Ni50ZXN0ggl0MTQ3LnRlc3SCCXQxNDgudGVzdIIJdDE0OS50ZXN0ggl0MTUw\nLnRlc3SCCXQxNTEudGVzdIIJdDE1Mi50ZXN0ggl0MTUzLnRlc3SCCXQxNTQudGVz\ndIIJdDE1NS50ZXN0ggl0MTU2LnRlc3SCCXQxNTcudGVzdIIJdDE1OC50ZXN0ggl0\nMTU5LnRlc3SCCXQxNjAudGVzdIIJdDE2MS50ZXN0ggl0MTYyLnRlc3SCCXQxNjMu\ndGVzdIIJdDE2NC50ZXN0ggl0MTY1LnRlc3SCCXQxNjYudGVzdIIJdDE2Ny50ZXN0\nggl0MTY4LnRlc3SCCXQxNjkudGVzdIIJdDE3MC50ZXN0ggl0MTcxLnRlc3SCCXQx\nNzIudGVzdIIJdDE3My50ZXN0ggl0MTc0LnRlc3SCCXQxNzUudGVzdIIJdDE3Ni50\nZXN0ggl0MTc3LnRlc3SCCXQxNzgudGVzdIIJdDE3OS50ZXN0ggl0MTgwLnRlc3SC\nCXQxODEudGVzdIIJdDE4Mi50ZXN0ggl0MTgzLnRlc3SCCXQxODQudGVzdIIJdDE4\nNS50ZXN0ggl0MTg2LnRlc3SCCXQxODcudGVzdIIJdDE4OC50ZXN0ggl0MTg5LnRl\nc3SCCXQxOTAudGVzdIIJdDE5MS50ZXN0ggl0MTkyLnRlc3SCCXQxOTMudGVzdIIJ\ndDE5NC50ZXN0ggl0MTk1LnRlc3SCCXQxOTYudGVzdIIJdDE5Ny50ZXN0ggl0MTk4\nLnRlc3SCCXQxOTkudGVzdIIJdDIwMC50ZXN0ggl0MjAxLnRlc3SCCXQyMDIudGVz\ndIIJdDIwMy50ZXN0ggl0MjA0LnRlc3SCCXQyMDUudGVzdIIJdDIwNi50ZXN0ggl0\nMjA3LnRlc3SCCXQyMDgudGVzdIIJdDIwOS50ZXN0ggl0MjEwLnRlc3SCCXQyMTEu\ndGVzdIIJdDIxMi50ZXN0ggl0MjEzLnRlc3SCCXQyMTQudGVzdIIJdDIxNS50ZXN0\nggl0MjE2LnRlc3SCCXQyMTcudGVzdIIJdDIxOC50ZXN0ggl0MjE5LnRlc3SCCXQy\nMjAudGVzdIIJdDIyMS50ZXN0ggl0MjIyLnRlc3SCCXQyMjMudGVzdIIJdDIyNC50\nZXN0ggl0MjI1LnRlc3SCCXQyMjYudGVzdIIJdDIyNy50ZXN0ggl0MjI4LnRlc3SC\nCXQyMjkudGVzdIIJdDIzMC50ZXN0ggl0MjMxLnRlc3SCCXQyMzIudGVzdIIJdDIz\nMy50ZXN0ggl0MjM0LnRlc3SCCXQyMzUudGVzdIIJdDIzNi50ZXN0ggl0MjM3LnRl\nc3SCCXQyMzgudGVzdIIJdDIzOS50ZXN0ggl0MjQwLnRlc3SCCXQyNDEudGVzdIIJ\ndDI0Mi50ZXN0ggl0MjQzLnRlc3SCCXQyNDQudGVzdIIJdDI0NS50ZXN0ggl0MjQ2\nLnRlc3SCCXQyNDcudGVzdIIJdDI0OC50ZXN0ggl0MjQ5LnRlc3SCCXQyNTAudGVz\ndIIJdDI1MS50ZXN0ggl0MjUyLnRlc3SCCXQyNTMudGVzdIIJdDI1NC50ZXN0ggl0\nMjU1LnRlc3SCCXQyNTYudGVzdIIJdDI1Ny50ZXN0ggl0MjU4LnRlc3SCCXQyNTku\ndGVzdIIJdDI2MC50ZXN0ggl0MjYxLnRlc3SCCXQyNjIudGVzdIIJdDI2My50ZXN0\nggl0MjY0LnRlc3SCCXQyNjUudGVzdIIJdDI2Ni50ZXN0ggl0MjY3LnRlc3SCCXQy\nNjgudGVzdIIJdDI2OS50ZXN0ggl0MjcwLnRlc3SCCXQyNzEudGVzdIIJdDI3Mi50\nZXN0ggl0MjczLnRlc3SCCXQyNzQudGVzdIIJdDI3NS50ZXN0ggl0Mjc2LnRlc3SC\nCXQyNzcudGVzdIIJdDI3OC50ZXN0ggl0Mjc5LnRlc3SCCXQyODAudGVzdIIJdDI4\nMS50ZXN0ggl0MjgyLnRlc3SCCXQyODMudGVzdIIJdDI4NC50ZXN0ggl0Mjg1LnRl\nc3SCCXQyODYudGVzdIIJdDI4Ny50ZXN0ggl0Mjg4LnRlc3SCCXQyODkudGVzdIIJ\ndDI5MC50ZXN0ggl0MjkxLnRlc3SCCXQyOTIudGVzdIIJdDI5My50ZXN0ggl0Mjk0\nLnRlc3SCCXQyOTUudGVzdIIJdDI5Ni50ZXN0ggl0Mjk3LnRlc3SCCXQyOTgudGVz\ndIIJdDI5OS50ZXN0ggl0MzAwLnRlc3SCCXQzMDEudGVzdIIJdDMwMi50ZXN0ggl0\nMzAzLnRlc3SCCXQzMDQudGVzdIIJdDMwNS50ZXN0ggl0MzA2LnRlc3SCCXQzMDcu\ndGVzdIIJdDMwOC50ZXN0ggl0MzA5LnRlc3SCCXQzMTAudGVzdIIJdDMxMS50ZXN0\nggl0MzEyLnRlc3SCCXQzMTMudGVzdIIJdDMxNC50ZXN0ggl0MzE1LnRlc3SCCXQz\nMTYudGVzdIIJdDMxNy50ZXN0ggl0MzE4LnRlc3SCCXQzMTkudGVzdIIJdDMyMC50\nZXN0ggl0MzIxLnRlc3SCCXQzMjIudGVzdIIJdDMyMy50ZXN0ggl0MzI0LnRlc3SC\nCXQzMjUudGVzdIIJdDMyNi50ZXN0ggl0MzI3LnRlc3SCCXQzMjgudGVzdIIJdDMy\nOS50ZXN0ggl0MzMwLnRlc3SCCXQzMzEudGVzdIIJdDMzMi50ZXN0ggl0MzMzLnRl\nc3SCCXQzMzQudGVzdIIJdDMzNS50ZXN0ggl0MzM2LnRlc3SCCXQzMzcudGVzdIIJ\ndDMzOC50ZXN0ggl0MzM5LnRlc3SCCXQzNDAudGVzdIIJdDM0MS50ZXN0ggl0MzQy\nLnRlc3SCCXQzNDMudGVzdIIJdDM0NC50ZXN0ggl0MzQ1LnRlc3SCCXQzNDYudGVz\ndIIJdDM0Ny50ZXN0ggl0MzQ4LnRlc3SCCXQzNDkudGVzdIIJdDM1MC50ZXN0ggl0\nMzUxLnRlc3SCCXQzNTIudGVzdIIJdDM1My50ZXN0ggl0MzU0LnRlc3SCCXQzNTUu\ndGVzdIIJdDM1Ni50ZXN0ggl0MzU3LnRlc3SCCXQzNTgudGVzdIIJdDM1OS50ZXN0\nggl0MzYwLnRlc3SCCXQzNjEudGVzdIIJdDM2Mi50ZXN0ggl0MzYzLnRlc3SCCXQz\nNjQudGVzdIIJdDM2NS50ZXN0ggl0MzY2LnRlc3SCCXQzNjcudGVzdIIJdDM2OC50\nZXN0ggl0MzY5LnRlc3SCCXQzNzAudGVzdIIJdDM3MS50ZXN0ggl0MzcyLnRlc3SC\nCXQzNzMudGVzdIIJdDM3NC50ZXN0ggl0Mzc1LnRlc3SCCXQzNzYudGVzdIIJdDM3\nNy50ZXN0ggl0Mzc4LnRlc3SCCXQzNzkudGVzdIIJdDM4MC50ZXN0ggl0MzgxLnRl\nc3SCCXQzODIudGVzdIIJdDM4My50ZXN0ggl0Mzg0LnRlc3SCCXQzODUudGVzdIIJ\ndDM4Ni50ZXN0ggl0Mzg3LnRlc3SCCXQzODgudGVzdIIJdDM4OS50ZXN0ggl0Mzkw\nLnRlc3SCCXQzOTEudGVzdIIJdDM5Mi50ZXN0ggl0MzkzLnRlc3SCCXQzOTQudGVz\ndIIJdDM5NS50ZXN0ggl0Mzk2LnRlc3SCCXQzOTcudGVzdIIJdDM5OC50ZXN0ggl0\nMzk5LnRlc3SCCXQ0MDAudGVzdIIJdDQwMS50ZXN0ggl0NDAyLnRlc3SCCXQ0MDMu\ndGVzdIIJdDQwNC50ZXN0ggl0NDA1LnRlc3SCCXQ0MDYudGVzdIIJdDQwNy50ZXN0\nggl0NDA4LnRlc3SCCXQ0MDkudGVzdIIJdDQxMC50ZXN0ggl0NDExLnRlc3SCCXQ0\nMTIudGVzdIIJdDQxMy50ZXN0ggl0NDE0LnRlc3SCCXQ0MTUudGVzdIIJdDQxNi50\nZXN0ggl0NDE3LnRlc3SCCXQ0MTgudGVzdIIJdDQxOS50ZXN0ggl0NDIwLnRlc3SC\nCXQ0MjEudGVzdIIJdDQyMi50ZXN0ggl0NDIzLnRlc3SCCXQ0MjQudGVzdIIJdDQy\nNS50ZXN0ggl0NDI2LnRlc3SCCXQ0MjcudGVzdIIJdDQyOC50ZXN0ggl0NDI5LnRl\nc3SCCXQ0MzAudGVzdIIJdDQzMS50ZXN0ggl0NDMyLnRlc3SCCXQ0MzMudGVzdIIJ\ndDQzNC50ZXN0ggl0NDM1LnRlc3SCCXQ0MzYudGVzdIIJdDQzNy50ZXN0ggl0NDM4\nLnRlc3SCCXQ0MzkudGVzdIIJdDQ0MC50ZXN0ggl0NDQxLnRlc3SCCXQ0NDIudGVz\ndIIJdDQ0My50ZXN0ggl0NDQ0LnRlc3SCCXQ0NDUudGVzdIIJdDQ0Ni50ZXN0ggl0\nNDQ3LnRlc3SCCXQ0NDgudGVzdIIJdDQ0OS50ZXN0ggl0NDUwLnRlc3SCCXQ0NTEu\ndGVzdIIJdDQ1Mi50ZXN0ggl0NDUzLnRlc3SCCXQ0NTQudGVzdIIJdDQ1NS50ZXN0\nggl0NDU2LnRlc3SCCXQ0NTcudGVzdIIJdDQ1OC50ZXN0ggl0NDU5LnRlc3SCCXQ0\nNjAudGVzdIIJdDQ2MS50ZXN0ggl0NDYyLnRlc3SCCXQ0NjMudGVzdIIJdDQ2NC50\nZXN0ggl0NDY1LnRlc3SCCXQ0NjYudGVzdIIJdDQ2Ny50ZXN0ggl0NDY4LnRlc3SC\nCXQ0NjkudGVzdIIJdDQ3MC50ZXN0ggl0NDcxLnRlc3SCCXQ0NzIudGVzdIIJdDQ3\nMy50ZXN0ggl0NDc0LnRlc3SCCXQ0NzUudGVzdIIJdDQ3Ni50ZXN0ggl0NDc3LnRl\nc3SCCXQ0NzgudGVzdIIJdDQ3OS50ZXN0ggl0NDgwLnRlc3SCCXQ0ODEudGVzdIIJ\ndDQ4Mi50ZXN0ggl0NDgzLnRlc3SCCXQ0ODQudGVzdIIJdDQ4NS50ZXN0ggl0NDg2\nLnRlc3SCCXQ0ODcudGVzdIIJdDQ4OC50ZXN0ggl0NDg5LnRlc3SCCXQ0OTAudGVz\ndIIJdDQ5MS50ZXN0ggl0NDkyLnRlc3SCCXQ0OTMudGVzdIIJdDQ5NC50ZXN0ggl0\nNDk1LnRlc3SCCXQ0OTYudGVzdIIJdDQ5Ny50ZXN0ggl0NDk4LnRlc3SCCXQ0OTku\ndGVzdIIJdDUwMC50ZXN0ggl0NTAxLnRlc3SCCXQ1MDIudGVzdIIJdDUwMy50ZXN0\nggl0NTA0LnRlc3SCCXQ1MDUudGVzdIIJdDUwNi50ZXN0ggl0NTA3LnRlc3SCCXQ1\nMDgudGVzdIIJdDUwOS50ZXN0ggl0NTEwLnRlc3SCCXQ1MTEudGVzdIIJdDUxMi50\nZXN0MA0GCSqGSIb3DQEBCwUAA4IBAQBjxDfYTob",
     "CREWVHPrt1T9iT2t0gieS7hVw\nlQaezO1n+m0MerQ92DHhMXBROBiMXIWyvTa341xClpYAwPqqAIUEdS0L5r4Jq/Ep\n4uglb+eZXMvTAm89KH3L8xTugc8UtHMqbfyo92v96wgFXBrcDDXIkGdPkLyz2s2J\nQjpNVG/La/EYTQdHPgv6Rg0g+t6RNN1JJ0p1wQ5ItDc8d/bfWdlG/EViWVRsiSBh\n7YRbkGWdnHnorCe0yIg0jKCk3UhgXaYY66/alpmE/QVXSaLgNvdmJ5m9mixY0ZaB\n0niy+KzIgBczvDcxVdL5/fsxGvA4nI8Gi7Z+EJDKXeED+FwcTDJD\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen97 = 18982;
+static const size_t kLen113 = 18982;
 
-static const char *kData97[] = {
+static const char *kData113[] = {
     "-----BEGIN CERTIFICATE-----\nMII2kzCCNXugAwIBAgIBBzANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDEwJDQTAg\nFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowgjO+MRAwDgYDVQQDEwd0\nMC50ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nMUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0MkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nM0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nNUB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0NkB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nN0B0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0OEB0ZXN0MRYwFAYJKoZIhvcNAQkBFgd0\nOUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTBAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDExQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxMkB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0MTNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDE0QHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQxNUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MTZAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDE3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQxOEB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0MTlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDIwQHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQyMUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjJAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDIzQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQyNEB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0MjVAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDI2QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQyN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MjhAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDI5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzMEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDMy\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzM0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nMzRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDM1QHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQzNkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0MzdAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDM4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQzOUB0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0NDBAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQxQHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ0MkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDNAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDQ0QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ0NUB0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0NDZAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDQ3QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ0OEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NDlAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDUwQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1MUB0ZXN0\nMRcwFQYJKoZIhvcNAQkBFgh0NTJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDUzQHRl\nc3QxFzAVBgkqhkiG9w0BCQEWCHQ1NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NTVA\ndGVzdDEXMBUGCSqGSIb3DQEJARYIdDU2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ1\nN0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NThAdGVzdDEXMBUGCSqGSIb3DQEJARYI\ndDU5QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2MEB0ZXN0MRcwFQYJKoZIhvcNAQkB\nFgh0NjFAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDYyQHRlc3QxFzAVBgkqhkiG9w0B\nCQEWCHQ2M0B0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NjRAdGVzdDEXMBUGCSqGSIb3\nDQEJARYIdDY1QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ2NkB0ZXN0MRcwFQYJKoZI\nhvcNAQkBFgh0NjdAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDY4QHRlc3QxFzAVBgkq\nhkiG9w0BCQEWCHQ2OUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzBAdGVzdDEXMBUG\nCSqGSIb3DQEJARYIdDcxQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3MkB0ZXN0MRcw\nFQYJKoZIhvcNAQkBFgh0NzNAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDc0QHRlc3Qx\nFzAVBgkqhkiG9w0BCQEWCHQ3NUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzZAdGVz\ndDEXMBUGCSqGSIb3DQEJARYIdDc3QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ3OEB0\nZXN0MRcwFQYJKoZIhvcNAQkBFgh0NzlAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgw\nQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4MUB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0\nODJAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDgzQHRlc3QxFzAVBgkqhkiG9w0BCQEW\nCHQ4NEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0ODVAdGVzdDEXMBUGCSqGSIb3DQEJ\nARYIdDg2QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ4N0B0ZXN0MRcwFQYJKoZIhvcN\nAQkBFgh0ODhAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDg5QHRlc3QxFzAVBgkqhkiG\n9w0BCQEWCHQ5MEB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTFAdGVzdDEXMBUGCSqG\nSIb3DQEJARYIdDkyQHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5M0B0ZXN0MRcwFQYJ\nKoZIhvcNAQkBFgh0OTRAdGVzdDEXMBUGCSqGSIb3DQEJARYIdDk1QHRlc3QxFzAV\nBgkqhkiG9w0BCQEWCHQ5NkB0ZXN0MRcwFQYJKoZIhvcNAQkBFgh0OTdAdGVzdDEX\nMBUGCSqGSIb3DQEJARYIdDk4QHRlc3QxFzAVBgkqhkiG9w0BCQEWCHQ5OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTAwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTAzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEwNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTA2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEwOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTA5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDExMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTEyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEx\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTE1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxMTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDExN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTE4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDEyMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTIxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxMjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyM0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTI0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDEyNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTI3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDEyOUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTMwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxMzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEzMkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTMzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDEzNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxMzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDEz\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTM5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTQyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE0NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTQ1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE0N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTQ4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTUxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE1M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTU0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE1NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTU3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE1OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTYzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxNjRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE2NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTY2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNjdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE2OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTY5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxNzBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTcyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE3NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTc1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxNzZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDE3N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTc4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQxNzlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4MEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MTgxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxODJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDE4M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQxODVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTg3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQxODhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE4OUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MTkwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDE5MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MTkzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQxOTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5NUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MTk2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQxOTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDE5OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMTk5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIwMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjAyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIwNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjA1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIwN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjA4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIx\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjExQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjE0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDIxNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjE3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyMThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIxOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjIwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjIzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMjRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDIyNUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjI2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyMjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIyOEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjI5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDIzMUB0ZXN0MRgwFgY",
     "JKoZIhvcNAQkBFgl0MjMyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIz\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjM1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyMzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDIzN0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjM4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyMzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI0MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjQxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNDJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjQ0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI0NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjQ3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNDhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI0OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjUwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MjUzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI1NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyNTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI1\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjU5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyNjBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MjYyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI2NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjY1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyNjZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI2N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjY4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNjlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjcxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI3M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjc0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyNzVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI3NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mjc3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyNzhAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDI3OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQyODFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MjgzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQyODRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI4NUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0Mjg2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyODdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDI4OEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjg5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQyOTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5MUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MjkyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDI5NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMjk1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQyOTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDI5N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mjk4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQyOTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzAxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMwM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMDVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMw\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzA3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMDhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMwOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzEwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMxMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzEzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMTRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzE2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMTdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDMxOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzE5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDMyMUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzIyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzMjNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMyNEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzI1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDMyN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzI4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzMjlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMz\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzMxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzMzJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzM0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzM0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzMzVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDMzNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzM3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzMzhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDMzOUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzQwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzQzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNDRAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM0NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzQ2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNDdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM0OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzQ5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM1MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzUyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzU1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzNTZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM1N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzU4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNTlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM2MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzYxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzNjJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0MzY0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM2NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzY3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNjhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM2OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0MzcwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzNzFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0MzczQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM3NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQzNzdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM3\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzc5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQzODBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4MUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0MzgyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDM4NEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzg1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQzODZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM4N0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0Mzg4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzODlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nMzkxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOTJAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDM5M0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0Mzk0QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQzOTVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDM5NkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0Mzk3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQzOThAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDM5OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAwQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQw\nMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDAzQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MDRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQwNUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDA2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MDdAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQwOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDA5QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MTBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxMUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDEyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTNA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQxNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDE1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MTZAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQxN0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDE4QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0MTlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyMEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDIxQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjJAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQyM0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI0QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MjVAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQy\nNkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDI3QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0MjhAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQyOUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDMwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzFAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQzMkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDMzQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0MzRAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzNUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDM2QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0MzdA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQzOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDM5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDBAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ0MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQyQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NDNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ0NEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDQ1QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDZAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ0N0B0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDQ4QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NDlAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1\nMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDUxQHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NTJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1M0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDU0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NTVAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ1NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDU3QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0NThAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ1OUB0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDYwQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjFA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2MkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDYzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NjRAd",
     "GVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ2NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDY2QHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0NjdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ2OEB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDY5QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzBAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ3MUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDcyQHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzNAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3\nNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDc1QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ0NzZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ3N0B0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NDc4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0NzlAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDQ4MEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDgxQHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ0ODJAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4M0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NDg0QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODVA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ4NkB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNDg3QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0ODhAdGVzdDEYMBYGCSqGSIb3DQEJ\nARYJdDQ4OUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDkwQHRlc3QxGDAWBgkqhkiG\n9w0BCQEWCXQ0OTFAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5MkB0ZXN0MRgwFgYJ\nKoZIhvcNAQkBFgl0NDkzQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTRAdGVzdDEY\nMBYGCSqGSIb3DQEJARYJdDQ5NUB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk2QHRl\nc3QxGDAWBgkqhkiG9w0BCQEWCXQ0OTdAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDQ5\nOEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NDk5QHRlc3QxGDAWBgkqhkiG9w0BCQEW\nCXQ1MDBAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwMUB0ZXN0MRgwFgYJKoZIhvcN\nAQkBFgl0NTAyQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDNAdGVzdDEYMBYGCSqG\nSIb3DQEJARYJdDUwNEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0NTA1QHRlc3QxGDAW\nBgkqhkiG9w0BCQEWCXQ1MDZAdGVzdDEYMBYGCSqGSIb3DQEJARYJdDUwN0B0ZXN0\nMRgwFgYJKoZIhvcNAQkBFgl0NTA4QHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MDlA\ndGVzdDEYMBYGCSqGSIb3DQEJARYJdDUxMEB0ZXN0MRgwFgYJKoZIhvcNAQkBFgl0\nNTExQHRlc3QxGDAWBgkqhkiG9w0BCQEWCXQ1MTJAdGVzdDCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmK\nM+EKbcMue/hFrLGQXB6a2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4o\nBEiEhBxIsaIlws3qQa4baeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0\nvIqPfad5amdQJMvmjZXDI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+\ndFPM2/5kc2HiLNkeuS1Hbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3F\nMSaDK9T0zoJ5hE9fViR+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAAaNJMEcwDgYD\nVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAw\nEgYDVR0RBAswCYIHdDAudGVzdDANBgkqhkiG9w0BAQsFAAOCAQEAQA/0vvY1gLA2\n0jrPkBVWte7OHzWVkwq7mqgQPR4L9qLLu7Vhelp4dW8n95s1wCbca5j5SJEGv4Uv\n0fI1OOK7XQeYdNlHBmvMVW47GoBSo6tuYNPI/y4xnM6ypEZiPKkdj9Ar9qNgURfV\nz3s1czip915dyTWgwBy7CTxOlG8NW0uiFgEc9iiDDfQsPwVXiVtxOPtjhPeI3F0J\njh3wctFxBnAvLV9SsDxpWujM1dd/1SSQ25jKQhbKNtiDAC8v+Q043r8ZGHjRdxe8\nW2tVWH/iz9c+ze0P0ao7LKv8eGzoIsrBqICS86X4Zv5lGeTGaD2osF1oNvmmoSlh\n536yFa415g==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen98 = 692;
+static const size_t kLen114 = 692;
 
-static const char *kData98[] = {
+static const char *kData114[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0jCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAeBgNVHR4EFzAV\noBMwEYIPd3d3LmV4YW1wbGUuY29tMBgGA1UdIwQRMA6ADGludGVybWVkaWF0ZQAw\nCgYIKoZIzj0EAwIDSQAwRgIhAJepDBm/DoCSSUe2wqmNTjSJxbdQ2I9abl66G7Fs\n6mguAiEAnlJysXppr3jMa5yOFEXRNGRVoBKr6GS/MvCwbeuIXvg=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen99 = 692;
+static const size_t kLen115 = 692;
 
-static const char *kData99[] = {
+static const char *kData115[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0TCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATANBgNVHQ4EBgQEbGVhZjAXBgNV\nHSMEEDAOgAxpbnRlcm1lZGlhdGUwGgYDVR0RBBMwEYIPd3d3LmV4YW1wbGUuY29t\nMB4GA1UdHgQXMBWgEzARgg93d3cuZXhhbXBsZS5jb20wDQYDVR0TAQH/BAMwAAAw\nCgYIKoZIzj0EAwIDSAAwRQIgB1c3+kIZdUX0w3ULyHU4ybkbnlpvhNZDEpqWueYU\n8C4CIQCdJv6LWwvdGNQ9FJxQhHpmZUaB7k/rqih3BYxR50m54A==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen100 = 692;
+static const size_t kLen116 = 692;
 
-static const char *kData100[] = {
+static const char *kData116[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0TCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDAMBgNVHRMBAf8EAjAAMA0GA1UdDgQGBARsZWFmMBcGA1UdIwQQMA6A\nDGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20wHgYDVR0e\nBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAUBgNVHSUEDTAKBggrBgEFBQcDAQAw\nCgYIKoZIzj0EAwIDSAAwRQIgORtSwqcycbej93AjlQp5UNCkHVIfvRcekoqAyX8d\nG9sCIQCQHEk/0/BK/KCigzr8UyCyjniemH99Ka0O9nGF8xoBmQ==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen101 = 692;
+static const size_t kLen117 = 692;
 
-static const char *kData101[] = {
+static const char *kData117[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0jCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMBMGA1UdJQQM\nMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDQYDVR0OBAYEBGxlYWYwFwYDVR0j\nBBAwDoAMaW50ZXJtZWRpYXRlMBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTAe\nBgNVHR4EFzAVoBMwEYIPd3d3LmV4YW1wbGUuY29tMA8GA1UdDwEB/wQFAwICBAAw\nCgYIKoZIzj0EAwIDSQAwRgIhAPlqfHIXlF4u9YZclOy8GQAAyE/lVQTSvZT9psfe\nKA7wAiEAt4/kRnYsDJLmJC2g4YwQlVVzIdmaII4GvsDqtPFtcBw=\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen102 = 692;
+static const size_t kLen118 = 692;
 
-static const char *kData102[] = {
+static const char *kData118[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0TCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93\nd3cuZXhhbXBsZS5jb20wHwYDVR0eBBgwFaATMBGCD3d3dy5leGFtcGxlLmNvbQAw\nCgYIKoZIzj0EAwIDSAAwRQIgTevxULZ+ge4Vb3FHa0xFQD1pdiXxHrwkCU81GHgd\nkhMCIQCTahPY69HhJNemXhCKX6cNU9ciRqo5ZIijleHXafLOnQ==\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen103 = 688;
+static const size_t kLen119 = 688;
 
-static const char *kData103[] = {
+static const char *kData119[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0DCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMA0GA1Ud\nDgQGBARsZWFmMBcGA1UdIwQQMA6ADGludGVybWVkaWF0ZTAeBgNVHR4EFzAVoBMw\nEYIPd3d3LmV4YW1wbGUuY29tMBsGA1UdEQQUMBGCD3d3dy5leGFtcGxlLmNvbQAw\nCgYIKoZIzj0EAwIDRwAwRAIgB5sQf45OpqWJqqKgPHMwB0tOcOv9K6FLdEQM3rLl\ntkcCIAFMvtwlvfIzbw1V6leaXucRfKrI6I2gqq9jyC+RdiMZ\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen104 = 688;
+static const size_t kLen120 = 688;
 
-static const char *kData104[] = {
+static const char *kData120[] = {
     "-----BEGIN CERTIFICATE-----\nMIIB0DCCAXegAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9JbnZhbGlk\nIEV4dGVuc2lvbnMgSW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAw\nMTAxMDAwMDAwWjAaMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjO\nPQIBBggqhkjOPQMBBwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZR\nEvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GbMIGYMA4GA1UdDwEB\n/wQEAwICBDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBcGA1Ud\nIwQQMA6ADGludGVybWVkaWF0ZTAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5jb20w\nHgYDVR0eBBcwFaATMBGCD3d3dy5leGFtcGxlLmNvbTAOBgNVHQ4EBwQEbGVhZgAw\nCgYIKoZIzj0EAwIDRwAwRAIgZX4OegSkMvAY822XIS91eOzMhwt8jMS5aAp+jPwh\nS/sCICiNfc8gZkH72TTz8NYdKPJ20R9l4k42tDSz5DLabc78\n-----END CERTIFICATE-----\n",
 };
-static const size_t kLen105 = 45577;
+static const size_t kLen121 = 45577;
 
-static const char *kData105[] = {
+static const char *kData121[] = {
     "# Imported from Wycheproof's aes_cbc_pkcs5_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-CBC-PKCS5\n# Generator version: 0.8r12\n\n[ivSize = 128]\n[keySize = 128]\n\n# tcId = 1\n# empty message\nct = b10ab60153276941361000414aed0a9d\niv = da9520f7d3520277035173299388bee2\nkey = e34f15c7bd819930fe9d66e0c166e61c\nmsg = \nresult = valid\n\n# tcId = 2\n# message size divisible by block size\nct = d1fa697f3e2e04d64f1a0da203813ca5bc226a0b1d42287b2a5b994a66eaf14a\niv = c9ee3cd746bf208c65ca9e72a266d54f\nkey = e09eaa5a3f5e56d279d5e7a03373f6ea\nmsg = ef4eab37181f98423e53e947e7050fd0\nresult = valid\n\n# tcId = 3\n# message size divisible by block size\nct = 514cbc69aced506926deacdeb0cc0a5a07d540f65d825b65c7db0075cf930a06e0124ae598461cab0b3251baa853e377\niv = 8b2e86a9a185cfa6f51c7cc595b822bc\nkey = 9bd3902ed0996c869b572272e76f3889\nmsg = a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e\nresult = valid\n\n# tcId = 4\n# message size divisible by block size\nct = 137c824d7f7dc36f24216dde37c2e1c10cee533f6453de92e44b898fc3037d2e9e19d67a96387136dd9717a56e28614a5c177158f402ce2936fd98d1feb6a817\niv = 2717d10eb2eea3b39ec257e43307a260\nkey = 75ce184447cada672e02290310d224f7\nmsg = c774810a31a6421ad8eaafd5c22fa2455e2c167fee4a0b73ff927b2d96c69da1e939407b86b1c19bcfc69c434c3cf8a2\nresult = valid\n\n# tcId = 5\n# small plaintext size\nct = 599d77aca16910b42d8b4ac9560efe1b\niv = 155fd397579b0b5d991d42607f2cc9ad\nkey = e1e726677f4893890f8c027f9d8ef80d\nmsg = 3f\nresult = valid\n\n# tcId = 6\n# small plaintext size\nct = 74e20bf03a0ad4b49edc86a1b19c3d1d\niv = 4eb836be6808db264cb1111a3283b394\nkey = b151f491c4c006d1f28214aa3da9a985\nmsg = 27d9\nresult = valid\n\n# tcId = 7\n# small plaintext size\nct = 3f7a26558ba51cf352219d34c46907ae\niv = a8446c27ea9068d8d924d5c4eac91157\nkey = c36ff15f72777ee21deec07b63c1a0cd\nmsg = 50b428\nresult = valid\n\n# tcId = 8\n# small plaintext size\nct = c29d1463baccc558fd720c897da5bb98\niv = ef026d27da3702d7bb72e5e364a8f8f2\nkey = 32b9c5c78c3a0689a86052420fa1e8fc\nmsg = 0b9262ec\nresult = valid\n\n# tcId = 9\n# small plaintext size\nct = e24a717914f9cc8eaa1dc96f7840d6af\niv = c9defd3929dcd6c355c144e9750dd869\nkey = 43151bbaef367277ebfc97509d0aa49c\nmsg = eaa91273e7\nresult = valid\n\n# tcId = 10\n# small plaintext size\nct = f080e487f4e5b7aed793ea95ffe4bb30\niv = ce91e0454b0123f1ead0f158826459e9\nkey = 481440298525cc261f8159159aedf62d\nmsg = 6123c556c5cc\nresult = valid\n\n# tcId = 11\n# small plaintext size\nct = 27cadee413ed901f51c9366d731d95f6\niv = 1cb7bc8fe00523e7743d3cd9f483d6fe\nkey = 9ca26eb88731efbf7f810d5d95e196ac\nmsg = 7e48f06183aa40\nresult = valid\n\n# tcId = 12\n# small plaintext size\nct = 59bf12427b51a3aee0c9d3c540d04d24\niv = a345f084229dbfe0ceab6c6939571532\nkey = 48f0d03e41cc55c4b58f737b5acdea32\nmsg = f4a133aa6d5985a0\nresult = valid\n\n# tcId = 13\n# small plaintext size\nct = 1a0a18355f8ca4e6e2cf31da18d070da\niv = e5b6f73f132355b7be7d977bea068dfc\nkey = 1c958849f31996b28939ce513087d1be\nmsg = b0d2fee11b8e2f86b7\nresult = valid\n\n# tcId = 14\n# small plaintext size\nct = cef498ea61715a27f400418d1d5bfbf0\niv = c7cd10ca949ea03e7d4ba204b69e09b8\nkey = 39de0ebea97c09b2301a90009a423253\nmsg = 81e5c33b4c620852f044\nresult = valid\n\n# tcId = 15\n# small plaintext size\nct = 7ab43ddc45835ce40d2280bcea6a63f2\niv = bb8c9af30821dfeb7124392a554d9f01\nkey = 91656d8fc0aced60ddb1c4006d0dde53\nmsg = 7b3e440fe566790064b2ec\nresult = valid\n\n# tcId = 16\n# small plaintext size\nct = c70b457c945ad40895cf4c8be3ce7c66\niv = 54c3b90ca6e933f9094334d0263d3775\nkey = af7d5134720b5386158d51ea126e7cf9\nmsg = 7cc6fcc925c20f3c83b5567c\nresult = valid\n\n# tcId = 17\n# small plaintext size\nct = f9900afee2acfe63f8f15d81bbf64c39\niv = 9a2c5e91d4f0b9b9da64b46c5c2c8cb2\nkey = 4ed56753de6f75a032ebabca3ce27971\nmsg = 0c8c0f5619d9f8da5339281285\nresult = valid\n\n# tcId = 18\n# small plaintext size\nct = da4137bd8ac78e75a700b3de806f2d6f\niv = cf7951501104e1434309e6b936ec1742\nkey = beba50c936b696c15e25046dffb23a64\nmsg = 821ea8532fbabffb6e3d212e9b46\nresult = valid\n\n# tcId = 19\n# small plaintext size\nct = fed05321d11d978e2ec32527ecfce06c\niv = 90f5cf4fbfd2e2a1ab8eef402617bd5c\nkey = 501d81ebf912ddb87fbe3b7aac1437bc\nmsg = 2368e3c3636b5e8e94d2081adbf798\nresult = valid\n\n# tcId = 20\n# plaintext size > 16\nct = 8d55dc10584e243f55d2bdbb5758b7fabcd58c8d3785f01c7e3640b2a1dadcd9\niv = 54f2459e40e002763144f4752cde2fb5\nkey = 831e664c9e3f0c3094c0b27b9d908eb2\nmsg = 26603bb76dd0a0180791c4ed4d3b058807\nresult = valid\n\n# tcId = 21\n# plaintext size > 16\nct = e9199842355ea0c3dbf1b2a94fef1c802a95d024df9e407883cf5bf1f02c3cdc\niv = 088e01c2c65b26e7ad6af7b92ea09d73\nkey = cbffc6c8c7f76f46349c32d666f4efb0\nmsg = 6df067add738195fd55ac2e76b476971b9a0e6d8\nresult = valid\n\n# tcId = 22\n# plaintext size > 16\nct = 19beb4db2be0f3aff0083583038b2281a77c85b5f345ba4d2bc7f742a14f9247\niv = d9c9468796a2f5741b84d2d41430c5d3\nkey = fda6a01194beb462953d7e6c49b32dac\nmsg = f60ae3b036abcab78c98fc1d4b67970c0955cb6fe24483f8907fd73319679b\nresult = valid\n\n# tcId = 23\n# plaintext size > 16\nct = 84904fc92bd2e7590aa268e667370327b9446f41067dd40d3e5091a63a0d5687e4926e00cc3cb461c3b85d80ee2da818\niv = c98b47808add45c0c891983ec4b09846\nkey = efd9caa8ac68e9e29acdae57e93bcea8\nmsg = 3e1d2001f1e475b972738936443a5f51eedaf802a66fadf2406cfaadb0549149fcb9f485e534dc2d\nresult = valid\n\n# tcId = 24\n# plaintext size > 16\nct = 1d1391593a336be4b207295ad0542bc4ef2f39053066e12c38f71603f377fd42f4f0b2b5a42cdfeaee2af039f06fcf347abe171af3157ff07f3cdd3b33e11a60caecf9890325c132eeb66ab847278d165c26bca7c30486bb2fd83b63c5ff7ae0\niv = 08e9410de244d3f40607ebae38fa74e7\nkey = 37e4dbdc436258d5a9adb9f205c77cf3\nmsg = 24a874aec067116ad22eb55846ded3f5e86919a135585c929a86d92b2958fed110e52e33804887243584a6a94402cc9a105e0c940ec335bd2890f16dcce3fc8bd02873c80ade6f1ac08683130bcca454\nresult = valid\n\n# tcId = 25\n# zero padding\nct = aa62606a287476777b92d8e4c4e53028\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 26\n# zero padding\nct = ada437b682c92384b6c23ec10a21b3d8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 27\n# zero padding\nct = 26c5b3e540ee3dd6b52d14afd01a44f8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 28\n# zero padding\nct = fbcbdfdaaf17980be939c0b243266ecbc0deb417e98aba3ee12fea2921f8ae51\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 29\n# zero padding\nct = fbcbdfdaaf17980be939c0b243266ecb1188ff22f6563f6173440547d1e0dfd8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 30\n# padding with 0xff\nct = 726570a34cea08139d9f836579102a0e\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 31\n# padding with 0xff\nct = c8ef7ac3fd659ce7157d72a25f0a5048\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 32\n# padding with 0xff\nct = 6123c889bbc766acd4bca4cb982f9978\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 33\n# padding with 0xff\nct = fbcbdfdaaf17980be939c0b243266ecb442cd16f7410fca70924b573f7967e84\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 34\n# padding with 0xff\nct = fbcbdfdaaf17980be939c0b243266ecbb20f899b0e7c1d65b931af94b5c44c25\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 35\n# bit padding\nct = 50aeed98a820c5a037a5aa4d4ef3090b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 36\n# bit padding\nct = 25ee339006f948f42713543c",
     "62467ef9\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 37\n# bit padding\nct = 97914574676ed5b8db0b6f3931195b3f\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 38\n# bit padding\nct = fbcbdfdaaf17980be939c0b243266ecb2874a1e2d28dd18e5573df9fd59fd789\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 39\n# bit padding\nct = fbcbdfdaaf17980be939c0b243266ecbb547c4fddbdcd3e02f438a2e48587594\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 40\n# padding longer than 1 block\nct = d17ccbb26f0aa95f397b20063547349bac24c5429cbea591e96595cccc11451b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 41\n# padding longer than 1 block\nct = fc07025e81d43efa85f92afdf8781b1e88598e12d6812df43733e93414b9e901\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 42\n# padding longer than 1 block\nct = deb1746f4e9e0be4a21825b071b6e93303031651e0c59091e2ae0fbcce11b987\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 43\n# padding longer than 1 block\nct = fbcbdfdaaf17980be939c0b243266ecb563d35096fde10ccb6f768438c9eb4ec90f399b76924c716e9f94143263306c6\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 44\n# padding longer than 1 block\nct = fbcbdfdaaf17980be939c0b243266ecbc8fd2e2c5362acf5212bd47859aa827d8469b87b0e6adafe3dba98c1885b6345\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 45\n# ANSI X.923 padding\nct = ca5dd2d09bd56eec9e8acaeca20af68e\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 46\n# ANSI X.923 padding\nct = 01e53a5ec9b0957c45f79ed0f4b2b982\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 47\n# ANSI X.923 padding\nct = fbcbdfdaaf17980be939c0b243266ecbd3909bb3457e5b946ff709be9a2ed84d\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 48\n# ANSI X.923 padding\nct = fbcbdfdaaf17980be939c0b243266ecbc5ab3ab637166a6a067b82b5672c08f8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 49\n# ISO 10126 padding\nct = ba0726bd6dea11382b19c842e2ddead2\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 50\n# ISO 10126 padding\nct = 22f18b85c729903744fb8db5ed2840d4\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 51\n# ISO 10126 padding\nct = fbcbdfdaaf17980be939c0b243266ecb6b103fbe43519a18880b7e6d9153e1c2\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 52\n# ISO 10126 padding\nct = fbcbdfdaaf17980be939c0b243266ecbe00bdb15b8a61285447498700d35e0c6\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 53\n# padding longer than message\nct = d17ccbb26f0aa95f397b20063547349b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 54\n# padding longer than message\nct = 2056dfa339fa00be6836999411a98c76\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 55\n# padding longer than message\nct = f92628f6418d8d9c9afac233861b3835\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 56\n# padding longer than message\nct = fbcbdfdaaf17980be939c0b243266ecbc0c41093b495a7d5a080d976493fd0e7\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 57\n# padding longer than message\nct = fbcbdfdaaf17980be939c0b243266ecb6770446a5ccaa26f7d4f970cc5834eba\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 58\n#  invalid padding\nct = 4ff3e623fdd432608c183f40864177af\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 59\n#  invalid padding\nct = 6a1ef1e6ae6a788777aabd9ccf3cf43a\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 60\n#  invalid padding\nct = fbcbdfdaaf17980be939c0b243266ecbee1345cd513161b241f4ae2799b0327f\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 61\n#  invalid padding\nct = fbcbdfdaaf17980be939c0b243266ecbe0d539beef6f2d4f7cda4fd9f4f05570\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n[ivSize = 128]\n[keySize = 192]\n\n# tcId = 62\n# empty message\nct = ff0c315873b4b1872abef2353b792ef0\niv = db20f9a6f4d6b4e478f1a4b9d4051d34\nkey = 3d6bf9edae6d881eade0ff8c7076a4835b71320c1f36b631\nmsg = \nresult = valid\n\n# tcId = 63\n# message size divisible by block size\nct = 7dbd573e4db58a318edfe29f199d8cda538a49f36486337c2711163e55fd5d0b\niv = 69a76dc4da64d89c580eb75ae975ec39\nkey = f4bfa5aa4f0f4d62cf736cd2969c43d580fdb92f2753bedb\nmsg = 0e239f239705b282ce2200fe20de1165\nresult = valid\n\n# tcId = 64\n# message size divisible by block size\nct = bd0258909e5b72438d95ca4b29c8a79c6228fd06a3b2fa06f7659654c7b24610f23f2fb16313b7d3614cb0cd16fabb8e\niv = 6525667350930fb945dd1895a3abfcd1\nkey = 9d11abc1fcb248a436598e695be12c3c2ed90a18ba09d62c\nmsg = aa5182cae2a8fb068c0b3fb2be3e57ae523d13dffd1a944587707c2b67447f3f\nresult = valid\n\n# tcId = 65\n# message size divisible by block size\nct = 6cbeacf8de25d7dd9dcdc087bf2f80873b1eb335400589076f8d2bf81e294c5d72b85eb8ac9558b0de9e9fbee4b18716e5220c507fbb9d319a08f67816765ca6\niv = 3943d8fddd5bb2a59772df31a31a8fff\nkey = 7e41d83181659a2c38da5ead353cdb04c2b4d4a3cfe58e25\nmsg = 8a32d11c7a11aa72e13381632b1310f4fd90fc209a6a350e61c069a561871214f9c04fc1df7354cbe4d8d639c525d324\nresult = valid\n\n# tcId = 66\n# small plaintext size\nct = 519925956d32e4fa350b1144f088e4e8\niv = 1379d48493f743e6a149deb3b9bab31e\nkey = 915429743435c28997a33b33b6574a953d81dae0e7032e6a\nmsg = 58\nresult = valid\n\n# tcId = 67\n# small plaintext size\nct = bfb90aa7de1bdeed5bdc5703bdfd9630\niv = 48c7f44b43a1279d820733e6cb30617a\nkey = f0c288ba26b284f9fb321b444a6517b3cdda1a799d55fdff\nmsg = 0f7e\nresult = valid\n\n# tcId = 68\n# small plaintext size\nct = b1a25816908c086f26037d10b7be9ad9\niv = 2c287b38cc30c8c351b087b91a6a97ba\nkey = 6b55e4d4fd6847a80a6bfb0dcc0aa93f9fd797fc5c50292e\nmsg = 33f530\nresult = valid\n\n# tcId = 69\n# small plaintext size\nct = 74dbdecbfa94b71d2d6ef03200c7d095\niv = 61f6060919c9c09ef06be28f39c344aa\nkey = 1eb21a9e995a8e45c9e71ecbd6fe615b3e0318007c64b644\nmsg = 3aa73c48\nresult = valid\n\n# tcId = 70\n# small plaintext size\nct = 10c860aaee23c3c3c1b9306b189dd80d\niv = 7682005907bf",
     "ef3ce00196a17ad2246d\nkey = 710e2d5d4a9f0bc7e50796655e046a18cc5769d7764355da\nmsg = 7e4c690a88\nresult = valid\n\n# tcId = 71\n# small plaintext size\nct = 673dcd444386930a0cc577fab4501e5c\niv = 1f6c912997ce007701e5fdf407c6b421\nkey = d8c09ea400779b63e774bdacd0cb7b5dd6f736ca23d52acf\nmsg = e9520280973b\nresult = valid\n\n# tcId = 72\n# small plaintext size\nct = 059e5f72a81d8820add8eae8fabcdd42\niv = 5854033ae50de090678432781a168b6c\nkey = 8e67e9a0863b55bed408866f1cbc05357abe3f9d79f406f2\nmsg = 4880b412287a0b\nresult = valid\n\n# tcId = 73\n# small plaintext size\nct = c412159fd5ae20d771b7d2e734124d6a\niv = 003b2d86d8b636c58cf664565572d5e6\nkey = 28d8da67806410e5565bcc5a9d7ab9fb357413fa0158378c\nmsg = 004e3f4a4e6db955\nresult = valid\n\n# tcId = 74\n# small plaintext size\nct = 4aba571c2c5ab9a6140f16efc68c8ec1\niv = 3f22b50f888ab9424ba871d15aac55b7\nkey = dc968dd89fd602bb7eca6f3a8a13e4f59c08d02a514b1934\nmsg = 41a25354efeb1bc3b8\nresult = valid\n\n# tcId = 75\n# small plaintext size\nct = 66d1b9152a8cd1a88eab341c775070b4\niv = e4b8dde04b49fa6b88bfccd8d70c21d1\nkey = 7658951c0f620d82afd92756cc2d7983b79da3e56fdd1b78\nmsg = f0e82fb5c5666f4af49f\nresult = valid\n\n# tcId = 76\n# small plaintext size\nct = d9377788e2881a48f9347786db7df51f\niv = 7753f616cd8796c9b8a3bbfbe6cb1e7f\nkey = d9574c3a221b986690931faac5258d9d3c52362b2cb9b054\nmsg = 178ea8404ba54ee4e4522c\nresult = valid\n\n# tcId = 77\n# small plaintext size\nct = db825f4434ea3bb53576fa7385fb7dfe\niv = eae9ee19ccb7f8b087675709c4d35f73\nkey = 704409bab28085c44981f28f75dd143a4f747106f63f262e\nmsg = cda5709e7f115624e74ab031\nresult = valid\n\n# tcId = 78\n# small plaintext size\nct = 3e7287df2a5ed9de4d817e352bd47ea7\niv = a6aaff339a729d30a7ec1328db36d23e\nkey = d8d06ef6a53bbff5c8f12d791b8f4c67e574bf440736d1cc\nmsg = a1171eae1979f48345dd9485a0\nresult = valid\n\n# tcId = 79\n# small plaintext size\nct = 17c3ade4b469ae614760039a8fa6250e\niv = 92fda71e88c70d18ed71b992735a2150\nkey = 71129e781613f39d9ac39fbde2628b44c250c14deb5ef9e2\nmsg = 967593cc64bcbf7f3c58d04cb82b\nresult = valid\n\n# tcId = 80\n# small plaintext size\nct = 9cafecff2a28d02f732573f65a2cadca\niv = ed6596c86b98123ad2f3c573e974d051\nkey = 850fc859e9f7b89a367611dee6698f33962d8245ca8dc331\nmsg = 586f4f171af116519061a8e0e77940\nresult = valid\n\n# tcId = 81\n# plaintext size > 16\nct = 401ad889bdb9d38816c782e00b168ccccde9bf75f4be868ceb91237e8b37b750\niv = c45b52a240eba3bdde5dfd57f3d474fb\nkey = cfd3f68873d81a27d2bfce876c79f6e609074dec39e34614\nmsg = b1973cb25aa87ef9d1a8888b0a0f5c04c6\nresult = valid\n\n# tcId = 82\n# plaintext size > 16\nct = 455d516e87851e6c894578a0f7126e0acbc7cfbb1d80296647ab89a79dfa6f71\niv = 07ece5fe02266e073499fd4d66929034\nkey = b7f165bced1613da5e747fdf9255832d30c07f2deeb5a326\nmsg = 289647ea8d0ff31375a82aa1c620903048bb1d0e\nresult = valid\n\n# tcId = 83\n# plaintext size > 16\nct = cbf541330a5a9bda24984976b0cf96ba08ef521fa2cdb3df839128570e222ac4\niv = d799157bc1f77c182027be918b30783a\nkey = 9bbe6e004fb260dadb02b68b78954f1da5e6a2d02e0aeefe\nmsg = 665423092ce95b927e98b8082030f58e33f3ec1b0c29532c2f421855f00f97\nresult = valid\n\n# tcId = 84\n# plaintext size > 16\nct = 03225f08592efca14ad8ecf822465e8be4157465d0be150dd3d645b6fef1b19ca7bbaa5940b2a7895fa2b0ee55b0d4ec\niv = fdf97645e4192ba84728bbf6683f79de\nkey = 1381fbd5e79045d40f29790fc1a436c95b040a046ebf0b0f\nmsg = d575dce596dd0a2cd1c18dab7eb0948fafb8669969a48b6314493bfb8daf8acacd51382f9bb5b357\nresult = valid\n\n# tcId = 85\n# plaintext size > 16\nct = 27ad00313f328f0d3e6c3238ab560cb7243a9f54f7dff79b5a7a879439993d458017f09e8d3f694098bc19e61fe54085138664abb51a5b328cf2c9ce5d59726fff5e1b7553c143d9e0493c51cab23ff2ecdad91bd72bb12b32f3b611f9a4225d\niv = 059685f59247eea5d3f2a1532cb9d6b2\nkey = 1bb4ed0e8435e20729f48c1b7e3af6e69e4cebf0731131cf\nmsg = 6d29dab6a0568c961ab3c825e0d89940cef06c63ade7e557cd3e92792eaf23c8cd5a0f029c63b1cdce4754ccfad7a73c7c9e50ffe081e9136f5e9a424077339de12ea43572afe1b034e833e5887763aa\nresult = valid\n\n# tcId = 86\n# zero padding\nct = 2c010faa25c68c3b30b8c1491c316d5f\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 87\n# zero padding\nct = 818454d433154a8e00e8f590b8a1c38c\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 88\n# zero padding\nct = 0a7423fae3f4c8d4633f839d36f2e9ff\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 89\n# zero padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432e83f6e522c371e6e71bde539595b70b7\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 90\n# zero padding\nct = a7cfcdabcc5a2736a2708c1cb0b6143254d15f47701fa54f5957828f386e1d97\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 91\n# padding with 0xff\nct = 6ded36cc7603e514014dfb7199900676\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 92\n# padding with 0xff\nct = 839f772f8e5f50afdc02f954094869fe\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 93\n# padding with 0xff\nct = eefe3553c099c187929b287e54f95726\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 94\n# padding with 0xff\nct = a7cfcdabcc5a2736a2708c1cb0b61432d0531a2641d40467353542d79ce20ea8\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 95\n# padding with 0xff\nct = a7cfcdabcc5a2736a2708c1cb0b61432aaf08a090ecf66167ba5958100be7950\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 96\n# bit padding\nct = c0e402c8bbdda18c8ddd86470bd4b244\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 97\n# bit padding\nct = dc185d4572565e01131e471ec4c48125\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 98\n# bit padding\nct = 3ad1ddf3c3b320398785e6ec6544e9a2\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 99\n# bit padding\nct = a7cfcdabcc5a2736a2708c1cb0b614325876f90cfbbdbcd85e8252d37c44c638\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 100\n# bit padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432d18f57216b0e6426d911998a0e44156b\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 101\n# padding longer than 1 block\nct = f1605abb4e6628347c616da350fe243043a8d7b6aea244ca013f45241d802213\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 102\n# padding longer than 1 block\nct = a5f027fb9514ec8844534d452c940feb2c1807f57ed628156cf753f2ab698356\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 103\n# padding longer than 1 block\nct = f346fbc9744d723c42bbb2a4c934cdd4f1019e58c226cb2491fed621271a38f3\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = ",
@@ -3005,9 +3104,9 @@
     "99\nkey = 64be162b39c6e5f1fed9c32d9f674d9a8cde6eaa2443214d86bd4a1fb53b81b4\nmsg = 195a3b292f93baff0a2c\nresult = valid\n\n# tcId = 137\n# small plaintext size\nct = 4ed0eac75b05868078303875f82fb4f0\niv = 2d4cead3f1120a2b4b59419d04951e20\nkey = b259a555d44b8a20c5489e2f38392ddaa6be9e35b9833b67e1b5fdf6cb3e4c6c\nmsg = afd73117330c6e8528a6e4\nresult = valid\n\n# tcId = 138\n# small plaintext size\nct = f4d298caea7c390fc8c7f558f584f852\niv = a10392634143c2a3332fa0fb3f72200a\nkey = 2c6fc62daa77ba8c6881b3dd6989898fef646663cc7b0a3db8228a707b85f2dc\nmsg = 0ff54d6b6759120c2e8a51e3\nresult = valid\n\n# tcId = 139\n# small plaintext size\nct = 5e1c00e2ec829f92b87c6adf5c25262d\niv = 38b916a7ad3a9251ae3bd8865ca3a688\nkey = abab815d51df29f740e4e2079fb798e0152836e6ab57d1536ae8929e52c06eb8\nmsg = f0058d412a104e53d820b95a7f\nresult = valid\n\n# tcId = 140\n# small plaintext size\nct = bf3a04ddb2dbfe7c6dc9e15aa67be25d\niv = bfcc3ac44d12e42d780c1188ac64b57f\nkey = 3d5da1af83f7287458bff7a7651ea5d8db72259401333f6b82096996dd7eaf19\nmsg = aacc36972f183057919ff57b49e1\nresult = valid\n\n# tcId = 141\n# small plaintext size\nct = fdcfa77f5bd09326b4c11f9281b72474\niv = 35bc82e3503b95044c6406a8b2c2ecff\nkey = c19bdf314c6cf64381425467f42aefa17c1cc9358be16ce31b1d214859ce86aa\nmsg = 5d066a92c300e9b6ddd63a7c13ae33\nresult = valid\n\n# tcId = 142\n# plaintext size > 16\nct = fbea776fb1653635f88e2937ed2450ba4e9063e96d7cdba04928f01cb85492fe\niv = 4b74bd981ea9d074757c3e2ef515e5fb\nkey = 73216fafd0022d0d6ee27198b2272578fa8f04dd9f44467fbb6437aa45641bf7\nmsg = d5247b8f6c3edcbfb1d591d13ece23d2f5\nresult = valid\n\n# tcId = 143\n# plaintext size > 16\nct = 3a79bb6084c7116b58afe52d7181a0aacee1caa11df959090e2e7b0073d74817\niv = 9a1d8ccc24c5e4d3995480af236be103\nkey = c2039f0d05951aa8d9fbdf68be58a37cf99bd1afcedda286a9db470c3729ca92\nmsg = ed5b5e28e9703bdf5c7b3b080f2690a605fcd0d9\nresult = valid\n\n# tcId = 144\n# plaintext size > 16\nct = 642b11efb79b49e5d038bc7aa29b8c6c3ce0bf11c3a69670eb565799908be66d\niv = 400aab92803bcbb44a96ef789655b34e\nkey = 4f097858a1aec62cf18f0966b2b120783aa4ae9149d3213109740506ae47adfe\nmsg = ee53d8e5039e82d9fcca114e375a014febfea117a7e709d9008d43858e3660\nresult = valid\n\n# tcId = 145\n# plaintext size > 16\nct = a9b051354f0cf61f11921b330e60f996de796aeb68140a0f9c5962e1f48e4805262fb6f53b26d9bb2fa0e359efe14734\niv = 6eedf45753ffe38f2407fbc28ab5959c\nkey = 5f99f7d60653d79f088dd07ef306b65e057d36e053fa1c9f6854425c019fd4df\nmsg = fcc9212c23675c5d69a1266c77389bc955e453daba20034aabbcd502a1b73e05af30f8b7622abdbc\nresult = valid\n\n# tcId = 146\n# plaintext size > 16\nct = 5074f46f1a6d0eeff070d623172eb15bbfc83e7d16466a00c9da5f4545eecf44adbf60cf9ac9aa1a3ec5eca22d4a34a7b21ca44d214c9d04ab1cb0b2c07001de9adb46f3c12f8f48436b516a409bf6cbdf1871dee3115d5cbb7943558b68867e\niv = f88551c6aa197f9ad80251c2e32d7663\nkey = 95aaa5df4ccb529e9b2dc929e770c1f419f8e8933bfb36f632f532b3dcad2ba6\nmsg = f5735567b7c8312f116517788b091cc6cb1d474b010a77910154fd11c3b2f0cd19f713b63d66492e8cc7ee8ad714783f46c305a26416e11ff4b99ec5ce2550593cc5ec1b86ba6a66d10f82bdff827055\nresult = valid\n\n# tcId = 147\n# zero padding\nct = e07558d746574528fb813f34e3fb7719\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 148\n# zero padding\nct = c01af61276368818a8295f7d4b5bb2fd\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 149\n# zero padding\nct = 97dd9716f06be49160399a5b212250ae\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 150\n# zero padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce783bb4b4e18d7c646f38e0bb8ff92896\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 151\n# zero padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce64679a46621b792f643542a735f0bbbf\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 152\n# padding with 0xff\nct = c007ddffb76b95208505fe7f3be96172\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 153\n# padding with 0xff\nct = e9b7719c4c2b9fa6b94cb50e87b28156\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 154\n# padding with 0xff\nct = 77b31f474c4bd489dbadd532643d1fa5\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 155\n# padding with 0xff\nct = 8881e9e02fa9e3037b397957ba1fb7cea0166e9e1c0122cb2e2983fc0fac7176\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 156\n# padding with 0xff\nct = 8881e9e02fa9e3037b397957ba1fb7ce6f0effa789cbb0b875cc53cc8f7b3caf\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 157\n# bit padding\nct = 4dd5f910c94700235c9ed239160e34e2\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 158\n# bit padding\nct = 94d18b5923f8f3608ae7ad494fbb517e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 159\n# bit padding\nct = 0c92886dbcb030b873123a25d224da42\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 160\n# bit padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce851be67798a2937cd6681165da6dce03\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 161\n# bit padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce45658a37aaebc51098866b0894007e8e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 162\n# padding longer than 1 block\nct = 524236e25956e950713bec0d3d579068f34e4d18c4ccab081317dae526fe7fca\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 163\n# padding longer than 1 block\nct = d29eb845640c3a8878f51bc50e290aa4a65a34a93728fe8f82fdb8d3d2b7c648\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 164\n# padding longer than 1 block\nct = c34563be2952277c0f5c67ae1d6f847118730dd7f6a502ceef3c4bce5999f7aa\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 165\n# padding longer than 1 block\nct = 8881e9e02fa9e3037b397957ba1fb7cec0f74a1aa92fd9c96f9d15d193d1695c1eb33486e269277612f90f509f0535c2\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 166\n# padding longer than 1 block\nct = 8881e9e02fa9e3037b397957ba1fb7ce151ade309ec5200bacdd83b57ce794cd2b3bf9f8957def829e8465f7db266f9e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey ",
     "= 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 167\n# ANSI X.923 padding\nct = fb38cbef13f1d5be9c0ac7ed9cbe023c\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 168\n# ANSI X.923 padding\nct = 18cf8988abe9a2463a3a75db1fac8bcc\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 169\n# ANSI X.923 padding\nct = 8881e9e02fa9e3037b397957ba1fb7cee16d6fc4b4d3cdf6f915996e437fd4cc\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 170\n# ANSI X.923 padding\nct = 8881e9e02fa9e3037b397957ba1fb7cea8f41f61ead6e9936cbe7ee5a1163b9b\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 171\n# ISO 10126 padding\nct = a05c14da0109093c195b4998812fe150\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 172\n# ISO 10126 padding\nct = c477877250c8e4ca2869f35c4757cdb4\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 173\n# ISO 10126 padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce69f57c6e99c7b9df7d4879ccd15caf3d\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 174\n# ISO 10126 padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce77f89a247c928f147748ce6bc8fc4b67\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 175\n# padding longer than message\nct = 524236e25956e950713bec0d3d579068\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 176\n# padding longer than message\nct = e03b6f2ae1c963b6dfa40b42d34314b7\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 177\n# padding longer than message\nct = df14f4cbbccca57b9727d68270a1b6c1\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\nflags = BadPadding\n\n# tcId = 178\n# padding longer than message\nct = 8881e9e02fa9e3037b397957ba1fb7ceea228bf1edd41c390e2eef140142bc00\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 179\n# padding longer than message\nct = 8881e9e02fa9e3037b397957ba1fb7ce3937e0e9abf7f672a34a500ba8e9099a\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n# tcId = 180\n#  invalid padding\nct = 32ac6057df2a5d1e2e5131348c6ebc4e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\nflags = BadPadding\n\n# tcId = 181\n#  invalid padding\nct = df4a7c3b9f4756d30fca0d18e9b28960\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\nflags = BadPadding\n\n# tcId = 182\n#  invalid padding\nct = 8881e9e02fa9e3037b397957ba1fb7ceae2855c47c7988873d57f901e049494b\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\nflags = BadPadding\n\n# tcId = 183\n#  invalid padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce0714c8de200b27ac91d9257fc93c13be\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\nflags = BadPadding\n\n",
 };
-static const size_t kLen106 = 52732;
+static const size_t kLen122 = 52732;
 
-static const char *kData106[] = {
+static const char *kData122[] = {
     "# Imported from Wycheproof's aes_cmac_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-CMAC\n# Generator version: 0.8r12\n\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 1\n# empty message\nkey = e34f15c7bd819930fe9d66e0c166e61c\nmsg = \nresult = valid\ntag = d47afca1d857a5933405b1eb7a5cb7af\n\n# tcId = 2\n# short message\nkey = e1e726677f4893890f8c027f9d8ef80d\nmsg = 3f\nresult = valid\ntag = 15f856bbed3b321952a584b3c4437a63\n\n# tcId = 3\n# short message\nkey = b151f491c4c006d1f28214aa3da9a985\nmsg = 27d9\nresult = valid\ntag = bdbbebac982dd62b9f682618a6a604e9\n\n# tcId = 4\n# short message\nkey = c36ff15f72777ee21deec07b63c1a0cd\nmsg = 50b428\nresult = valid\ntag = be0c3ede157568af394023eb9a7cc983\n\n# tcId = 5\n# short message\nkey = 32b9c5c78c3a0689a86052420fa1e8fc\nmsg = 0b9262ec\nresult = valid\ntag = 57e1506856c55dd32cd9ca821adb6c81\n\n# tcId = 6\n# short message\nkey = 43151bbaef367277ebfc97509d0aa49c\nmsg = eaa91273e7\nresult = valid\ntag = e01adc3be6a7621824232c4285dd35b9\n\n# tcId = 7\n# short message\nkey = 481440298525cc261f8159159aedf62d\nmsg = 6123c556c5cc\nresult = valid\ntag = a281e0d2d5378dfdcc1310fd9782ca56\n\n# tcId = 8\n# short message\nkey = 9ca26eb88731efbf7f810d5d95e196ac\nmsg = 7e48f06183aa40\nresult = valid\ntag = fc81761f2f7b4ce13b53d36e32677332\n\n# tcId = 9\n# short message\nkey = 48f0d03e41cc55c4b58f737b5acdea32\nmsg = f4a133aa6d5985a0\nresult = valid\ntag = 1f1cd0327c02e6d00086915937dd61d9\n\n# tcId = 10\n# short message\nkey = 1c958849f31996b28939ce513087d1be\nmsg = b0d2fee11b8e2f86b7\nresult = valid\ntag = 555f462151f7dd16de698d639fb26760\n\n# tcId = 11\n# short message\nkey = 39de0ebea97c09b2301a90009a423253\nmsg = 81e5c33b4c620852f044\nresult = valid\ntag = 9b004f15b7f6f366374954e64bc58f5f\n\n# tcId = 12\n# short message\nkey = 91656d8fc0aced60ddb1c4006d0dde53\nmsg = 7b3e440fe566790064b2ec\nresult = valid\ntag = 76672ed16c29be449e0c80785cc38e89\n\n# tcId = 13\n# short message\nkey = af7d5134720b5386158d51ea126e7cf9\nmsg = 7cc6fcc925c20f3c83b5567c\nresult = valid\ntag = 2dc5c88cf3b80ab6c0199f40be904abc\n\n# tcId = 14\n# short message\nkey = 4ed56753de6f75a032ebabca3ce27971\nmsg = 0c8c0f5619d9f8da5339281285\nresult = valid\ntag = eab4366d97e99a0850f077329ad058c0\n\n# tcId = 15\n# short message\nkey = beba50c936b696c15e25046dffb23a64\nmsg = 821ea8532fbabffb6e3d212e9b46\nresult = valid\ntag = 22f33cab09c173f75d3401fe44efeead\n\n# tcId = 16\n# short message\nkey = 501d81ebf912ddb87fbe3b7aac1437bc\nmsg = 2368e3c3636b5e8e94d2081adbf798\nresult = valid\ntag = aeb784a3825168ddd61f72d0202125e6\n\n# tcId = 17\nkey = e09eaa5a3f5e56d279d5e7a03373f6ea\nmsg = ef4eab37181f98423e53e947e7050fd0\nresult = valid\ntag = 40facf0e2fb51b73a7472681b033d6dc\n\n# tcId = 18\nkey = 831e664c9e3f0c3094c0b27b9d908eb2\nmsg = 26603bb76dd0a0180791c4ed4d3b058807\nresult = valid\ntag = a8144c8b24f2aa47d9c160cff4ab1716\n\n# tcId = 19\nkey = 549bd282ee21b4d7c3b1d02e3ee20ef7\nmsg = d84bf73c5eecbd38444f1a73556e2fa3253f4c54d6916545\nresult = valid\ntag = 7ed458afe02f4a513f59715b664b1bbe\n\n# tcId = 20\nkey = 9bd3902ed0996c869b572272e76f3889\nmsg = a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e\nresult = valid\ntag = 45082218c2d05eef32247feb1133d0a3\n\n# tcId = 21\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 96dd6e5a882cbd564c39ae7d1c5a31aa\n\n# tcId = 22\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 43802eb1931f0032afe984443738cd31\n\n# tcId = 23\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7acfbbca7a2ea68b966fc5399f74809e\n\n# tcId = 24\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 95dd6e5a882cbd564c39ae7d1c5a31aa\n\n# tcId = 25\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 40802eb1931f0032afe984443738cd31\n\n# tcId = 26\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 79cfbbca7a2ea68b966fc5399f74809e\n\n# tcId = 27\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 17dd6e5a882cbd564c39ae7d1c5a31aa\n\n# tcId = 28\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = c2802eb1931f0032afe984443738cd31\n\n# tcId = 29\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = fbcfbbca7a2ea68b966fc5399f74809e\n\n# tcId = 30\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dc6e5a882cbd564c39ae7d1c5a31aa\n\n# tcId = 31\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42812eb1931f0032afe984443738cd31\n\n# tcId = 32\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcebbca7a2ea68b966fc5399f74809e\n\n# tcId = 33\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6eda882cbd564c39ae7d1c5a31aa\n\n# tcId = 34\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802e31931f0032afe984443738cd31\n\n# tcId = 35\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbb4a7a2ea68b966fc5399f74809e\n\n# tcId = 36\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a892cbd564c39ae7d1c5a31aa\n\n# tcId = 37\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1921f0032afe984443738cd31\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7b2ea68b966fc5399f74809e\n\n# tcId = 39\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a8a2cbd564c39ae7d1c5a31aa\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1911f0032afe984443738cd31\n\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca782ea68b966fc5399f74809e\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbdd64c39ae7d1c5a31aa\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f00b2afe984443738cd31\n\n# tcId = 44\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea60b966fc5399f74809e\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564d39ae7d1c5a31aa\n\n# tcId = 46\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032aee984443738cd31\n\n# tcId = 47\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b976fc5399f74809e\n\n# tcId = 48\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd56cc39ae7d1c5a31aa\n\n# tcId = 49\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f00322fe984443738cd31\n\n# tcId = 50\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b166fc5399f74809e\n\n# tcId = 51\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c19ae7d1c5a31aa\n\n# tcId = 52\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afc984443738cd31\n\n# tcId = 53\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = inval",
     "id\ntag = 7bcfbbca7a2ea68b964fc5399f74809e\n\n# tcId = 54\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39af7d1c5a31aa\n\n# tcId = 55\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe985443738cd31\n\n# tcId = 56\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc4399f74809e\n\n# tcId = 57\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1d5a31aa\n\n# tcId = 58\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443638cd31\n\n# tcId = 59\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399e74809e\n\n# tcId = 60\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1e5a31aa\n\n# tcId = 61\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443538cd31\n\n# tcId = 62\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399d74809e\n\n# tcId = 63\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d9c5a31aa\n\n# tcId = 64\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe98444b738cd31\n\n# tcId = 65\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5391f74809e\n\n# tcId = 66\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1c5a31ab\n\n# tcId = 67\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443738cd30\n\n# tcId = 68\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399f74809f\n\n# tcId = 69\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1c5a31a8\n\n# tcId = 70\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443738cd33\n\n# tcId = 71\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399f74809c\n\n# tcId = 72\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1c5a31ea\n\n# tcId = 73\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443738cd71\n\n# tcId = 74\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399f7480de\n\n# tcId = 75\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbd564c39ae7d1c5a312a\n\n# tcId = 76\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f0032afe984443738cdb1\n\n# tcId = 77\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea68b966fc5399f74801e\n\n# tcId = 78\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 96dd6e5a882cbd564d39ae7d1c5a31aa\n\n# tcId = 79\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 43802eb1931f0032aee984443738cd31\n\n# tcId = 80\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7acfbbca7a2ea68b976fc5399f74809e\n\n# tcId = 81\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6eda882cbdd64c39ae7d1c5a31aa\n\n# tcId = 82\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802e31931f00b2afe984443738cd31\n\n# tcId = 83\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbb4a7a2ea60b966fc5399f74809e\n\n# tcId = 84\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 97dd6e5a882cbdd64c39ae7d1c5a312a\n\n# tcId = 85\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 42802eb1931f00b2afe984443738cdb1\n\n# tcId = 86\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7bcfbbca7a2ea60b966fc5399f74801e\n\n# tcId = 87\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 682291a577d342a9b3c65182e3a5ce55\n\n# tcId = 88\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = bd7fd14e6ce0ffcd50167bbbc8c732ce\n\n# tcId = 89\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 8430443585d1597469903ac6608b7f61\n\n# tcId = 90\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 91\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 92\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 93\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 94\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 95\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 96\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 175deeda08ac3dd6ccb92efd9cdab12a\n\n# tcId = 97\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = c200ae31139f80b22f6904c4b7b84db1\n\n# tcId = 98\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = fb4f3b4afaae260b16ef45b91ff4001e\n\n# tcId = 99\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = \nresult = invalid\ntag = 96dc6f5b892dbc574d38af7c1d5b30ab\n\n# tcId = 100\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 0001020304050607\nresult = invalid\ntag = 43812fb0921e0133aee885453639cc30\n\n# tcId = 101\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 7acebacb7b2fa78a976ec4389e75819f\n\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 102\n# empty message\nkey = 3d6bf9edae6d881eade0ff8c7076a4835b71320c1f36b631\nmsg = \nresult = valid\ntag = a8dd15fe2ce3495ec5b666744ec29220\n\n# tcId = 103\n# short message\nkey = 915429743435c28997a33b33b6574a953d81dae0e7032e6a\nmsg = 58\nresult = valid\ntag = e13b3f7f7f510c3a059df7a68c7e2ad5\n\n# tcId = 104\n# short message\nkey = f0c288ba26b284f9fb321b444a6517b3cdda1a799d55fdff\nmsg = 0f7e\nresult = valid\ntag = 06ef847f5f9dbf03a4f283da8c400220\n\n# tcId = 105\n# short message\nkey = 6b55e4d4fd6847a80a6bfb0dcc0aa93f9fd797fc5c50292e\nmsg = 33f530\nresult = valid\ntag = dd135053a47ca8f282c299e83b8c",
     "57c4\n\n# tcId = 106\n# short message\nkey = 1eb21a9e995a8e45c9e71ecbd6fe615b3e0318007c64b644\nmsg = 3aa73c48\nresult = valid\ntag = 1e93fff846934a6eea0575eecb0f0e1f\n\n# tcId = 107\n# short message\nkey = 710e2d5d4a9f0bc7e50796655e046a18cc5769d7764355da\nmsg = 7e4c690a88\nresult = valid\ntag = 016d4df06c68a6a788a9ea052e1b550d\n\n# tcId = 108\n# short message\nkey = d8c09ea400779b63e774bdacd0cb7b5dd6f736ca23d52acf\nmsg = e9520280973b\nresult = valid\ntag = 8030ae9f98f5d20c6089f6b1bd87c29e\n\n# tcId = 109\n# short message\nkey = 8e67e9a0863b55bed408866f1cbc05357abe3f9d79f406f2\nmsg = 4880b412287a0b\nresult = valid\ntag = bcaf50785f062a8fb8dd3c2c4cead2e1\n\n# tcId = 110\n# short message\nkey = 28d8da67806410e5565bcc5a9d7ab9fb357413fa0158378c\nmsg = 004e3f4a4e6db955\nresult = valid\ntag = c4c2c0876be9eabeb5a956da53846b08\n\n# tcId = 111\n# short message\nkey = dc968dd89fd602bb7eca6f3a8a13e4f59c08d02a514b1934\nmsg = 41a25354efeb1bc3b8\nresult = valid\ntag = f33a62caf397f9aff71fe42941ba41d8\n\n# tcId = 112\n# short message\nkey = 7658951c0f620d82afd92756cc2d7983b79da3e56fdd1b78\nmsg = f0e82fb5c5666f4af49f\nresult = valid\ntag = 4d724d05f3402967eb65ae1e32d5469e\n\n# tcId = 113\n# short message\nkey = d9574c3a221b986690931faac5258d9d3c52362b2cb9b054\nmsg = 178ea8404ba54ee4e4522c\nresult = valid\ntag = 64a0e0b6757309ab58d74f72c310e473\n\n# tcId = 114\n# short message\nkey = 704409bab28085c44981f28f75dd143a4f747106f63f262e\nmsg = cda5709e7f115624e74ab031\nresult = valid\ntag = 6ab2074334be14a95b6a241f897a43de\n\n# tcId = 115\n# short message\nkey = d8d06ef6a53bbff5c8f12d791b8f4c67e574bf440736d1cc\nmsg = a1171eae1979f48345dd9485a0\nresult = valid\ntag = 7aa57cf98b24897cc9230e3316758e61\n\n# tcId = 116\n# short message\nkey = 71129e781613f39d9ac39fbde2628b44c250c14deb5ef9e2\nmsg = 967593cc64bcbf7f3c58d04cb82b\nresult = valid\ntag = 6cc488b0a40eadbe4bcee2623239d126\n\n# tcId = 117\n# short message\nkey = 850fc859e9f7b89a367611dee6698f33962d8245ca8dc331\nmsg = 586f4f171af116519061a8e0e77940\nresult = valid\ntag = fb11a360c9776991d73d6e41d07710a2\n\n# tcId = 118\nkey = f4bfa5aa4f0f4d62cf736cd2969c43d580fdb92f2753bedb\nmsg = 0e239f239705b282ce2200fe20de1165\nresult = valid\ntag = ab20a6cf60873665b1d6999b05c7f9c6\n\n# tcId = 119\nkey = cfd3f68873d81a27d2bfce876c79f6e609074dec39e34614\nmsg = b1973cb25aa87ef9d1a8888b0a0f5c04c6\nresult = valid\ntag = b95a016b83a0ae4194023333c8a7345a\n\n# tcId = 120\nkey = 648a44468d67bb6744b235ee7a3fcd6ed4bdc29ec5b5fa1a\nmsg = c59d0d6981cca1be1d5519fc7881e6d230f39f6c12a9e827\nresult = valid\ntag = a1b96272ae7f9aef567271795f21d1d3\n\n# tcId = 121\nkey = 9d11abc1fcb248a436598e695be12c3c2ed90a18ba09d62c\nmsg = aa5182cae2a8fb068c0b3fb2be3e57ae523d13dffd1a944587707c2b67447f3f\nresult = valid\ntag = 8597d9a04d1c271d61d42f007b435175\n\n# tcId = 122\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ed12390ea0a7ed15d9d37a6eca1fc990\n\n# tcId = 123\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c81307df60859acb911c7be61be7ca90\n\n# tcId = 124\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f91bde0069a6e389573bf04e7cde688c\n\n# tcId = 125\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ee12390ea0a7ed15d9d37a6eca1fc990\n\n# tcId = 126\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = cb1307df60859acb911c7be61be7ca90\n\n# tcId = 127\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = fa1bde0069a6e389573bf04e7cde688c\n\n# tcId = 128\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = 6c12390ea0a7ed15d9d37a6eca1fc990\n\n# tcId = 129\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = 491307df60859acb911c7be61be7ca90\n\n# tcId = 130\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 781bde0069a6e389573bf04e7cde688c\n\n# tcId = 131\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec13390ea0a7ed15d9d37a6eca1fc990\n\n# tcId = 132\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91207df60859acb911c7be61be7ca90\n\n# tcId = 133\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81ade0069a6e389573bf04e7cde688c\n\n# tcId = 134\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12398ea0a7ed15d9d37a6eca1fc990\n\n# tcId = 135\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c913075f60859acb911c7be61be7ca90\n\n# tcId = 136\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde8069a6e389573bf04e7cde688c\n\n# tcId = 137\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea1a7ed15d9d37a6eca1fc990\n\n# tcId = 138\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df61859acb911c7be61be7ca90\n\n# tcId = 139\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde0068a6e389573bf04e7cde688c\n\n# tcId = 140\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea2a7ed15d9d37a6eca1fc990\n\n# tcId = 141\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df62859acb911c7be61be7ca90\n\n# tcId = 142\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde006ba6e389573bf04e7cde688c\n\n# tcId = 143\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea0a7ed95d9d37a6eca1fc990\n\n# tcId = 144\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df60859a4b911c7be61be7ca90\n\n# tcId = 145\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde0069a6e309573bf04e7cde688c\n\n# tcId = 146\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea0a7ed15d8d37a6eca1fc990\n\n# tcId = 147\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df60859acb901c7be61be7ca90\n\n# tcId = 148\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde0069a6e389563bf04e7cde688c\n\n# tcId = 149\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea0a7ed1559d37a6eca1fc990\n\n# tcId = 150\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df60859acb111c7be61be7ca90\n\n# tcId = 151\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f81bde0069a6e389d73bf04e7cde688c\n\n# tcId = 152\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = \nresult = invalid\ntag = ec12390ea0a7ed15d9f37a6eca1fc990\n\n# tcId = 153\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 0001020304050607\nresult = invalid\ntag = c91307df60859acb913c7be61be7ca90\n\n# tcId = 154\n# Flipped bit 77 in",
@@ -3016,9 +3115,9 @@
     " d609717c3a4ef822ea200b297d2accec\n\n# tcId = 246\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e210cae26dad29bba32d\n\n# tcId = 247\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101e0089727691b7fb\n\n# tcId = 248\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2eb200b297d2accec\n\n# tcId = 249\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cbe26dad29bba32d\n\n# tcId = 250\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0109f0089727691b7fb\n\n# tcId = 251\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a26a200b297d2accec\n\n# tcId = 252\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e2904ae26dad29bba32d\n\n# tcId = 253\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f2089727691b7fb\n\n# tcId = 254\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea000b297d2accec\n\n# tcId = 255\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cac26dad29bba32d\n\n# tcId = 256\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0088727691b7fb\n\n# tcId = 257\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200a297d2accec\n\n# tcId = 258\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26cad29bba32d\n\n# tcId = 259\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727791b7fb\n\n# tcId = 260\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297c2accec\n\n# tcId = 261\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad28bba32d\n\n# tcId = 262\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727491b7fb\n\n# tcId = 263\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297f2accec\n\n# tcId = 264\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad2bbba32d\n\n# tcId = 265\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f008972f691b7fb\n\n# tcId = 266\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b29fd2accec\n\n# tcId = 267\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dada9bba32d\n\n# tcId = 268\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727691b7fa\n\n# tcId = 269\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297d2acced\n\n# tcId = 270\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad29bba32c\n\n# tcId = 271\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727691b7f9\n\n# tcId = 272\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297d2accee\n\n# tcId = 273\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad29bba32f\n\n# tcId = 274\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727691b7bb\n\n# tcId = 275\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297d2accac\n\n# tcId = 276\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad29bba36d\n\n# tcId = 277\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0101f0089727691b77b\n\n# tcId = 278\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef8a2ea200b297d2acc6c\n\n# tcId = 279\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3f3b5f83e290cae26dad29bba3ad\n\n# tcId = 280\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6af0a293d8cba0101e0089727691b7fb\n\n# tcId = 281\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d709717c3a4ef8a2eb200b297d2accec\n\n# tcId = 282\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58ee3f3b5f83e290cbe26dad29bba32d\n\n# tcId = 283\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a213d8cba0901f0089727691b7fb\n\n# tcId = 284\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d60971fc3a4ef822ea200b297d2accec\n\n# tcId = 285\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee3fbb5f83e210cae26dad29bba32d\n\n# tcId = 286\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6bf0a293d8cba0901f0089727691b77b\n\n# tcId = 287\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d609717c3a4ef822ea200b297d2acc6c\n\n# tcId = 288\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 59ee",
     "3f3b5f83e210cae26dad29bba3ad\n\n# tcId = 289\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 940f5d6c27345fefe0ff768d896e4804\n\n# tcId = 290\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = 29f68e83c5b1075d15dff4d682d53313\n\n# tcId = 291\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a611c0c4a07c1d6f351d9252d6445cd2\n\n# tcId = 292\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 293\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 294\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 295\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 296\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 297\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 298\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = eb702213584b20909f8009f2f611377b\n\n# tcId = 299\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = 5689f1fcbace78226aa08ba9fdaa4c6c\n\n# tcId = 300\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d96ebfbbdf0362104a62ed2da93b23ad\n\n# tcId = 301\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 6af1a392d9caa1111e0188737790b6fa\n\n# tcId = 302\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 0001020304050607\nresult = invalid\ntag = d708707d3b4ff9a3eb210a287c2bcded\n\n# tcId = 303\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58ef3e3a5e82e391cbe36cac28baa22c\n\n[keySize = 0]\n[tagSize = 128]\n\n# tcId = 304\n# invalid key size\nkey = \nmsg = 00b9449326d39416\nresult = invalid\ntag = \n\n[keySize = 8]\n[tagSize = 128]\n\n# tcId = 305\n# invalid key size\nkey = 0f\nmsg = 4538b79a1397e2aa\nresult = invalid\ntag = \n\n[keySize = 64]\n[tagSize = 128]\n\n# tcId = 306\n# invalid key size\nkey = a88e385af7185148\nmsg = dc63b7ef08096e4f\nresult = invalid\ntag = \n\n[keySize = 160]\n[tagSize = 128]\n\n# tcId = 307\n# invalid key size\nkey = 003a228008d390b645929df73a2b2bdd8298918d\nmsg = ad1d3c3122ab7ac6\nresult = invalid\ntag = \n\n[keySize = 320]\n[tagSize = 128]\n\n# tcId = 308\n# invalid key size\nkey = 94baaac150e2645ae1ec1939c7bcefb73f6edb146fae02289b6c6326ff39bc265d612bef2727fa72\nmsg = e3f75a886c4a5591\nresult = invalid\ntag = \n\n",
 };
-static const size_t kLen107 = 44166;
+static const size_t kLen123 = 44166;
 
-static const char *kData107[] = {
+static const char *kData123[] = {
     "# Imported from Wycheproof's aes_gcm_siv_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-GCM-SIV\n# Generator version: 0.8r12\n\n[ivSize = 96]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 1\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = \niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = \nresult = valid\ntag = dc20e2d83f25705bb49e439eca56de25\n\n# tcId = 2\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = b5d839330ac7b786\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0100000000000000\nresult = valid\ntag = 578782fff6013b815b287c22493a364c\n\n# tcId = 3\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 7323ea61d05932260047d942\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 010000000000000000000000\nresult = valid\ntag = a4978db357391a0bc4fdec8b0d106639\n\n# tcId = 4\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 743f7c8077ab25f8624e2e948579cf77\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 01000000000000000000000000000000\nresult = valid\ntag = 303aaf90f6fe21199c6068577437a0c4\n\n# tcId = 5\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 84e07e62ba83a6585417245d7ec413a9fe427d6315c09b57ce45f2e3936a9445\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0100000000000000000000000000000002000000000000000000000000000000\nresult = valid\ntag = 1a8e45dcd4578c667cd86847bf6155ff\n\n# tcId = 6\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 3fd24ce1f5a67b75bf2351f181a475c7b800a5b4d3dcf70106b1eea82fa1d64df42bf7226122fa92e17a40eeaac1201b\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = 5e6e311dbf395d35b0fe39c2714388f8\n\n# tcId = 7\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 2433668f1058190f6d43e360f4f35cd8e475127cfca7028ea8ab5c20f7ab2af02516a2bdcbc08d521be37ff28c152bba36697f25b4cd169c6590d1dd39566d3f\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 8a263dd317aa88d56bdf3936dba75bb8\n\n# tcId = 8\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 1e6daba35669f427\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0200000000000000\nresult = valid\ntag = 3b0a1a2560969cdf790d99759abd1508\n\n# tcId = 9\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 296c7889fd99f41917f44620\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 020000000000000000000000\nresult = valid\ntag = 08299c5102745aaa3a0c469fad9e075a\n\n# tcId = 10\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = e2b0c5da79a901c1745f700525cb335b\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000000000000000000000000000\nresult = valid\ntag = 8f8936ec039e4e4bb97ebd8c4457441f\n\n# tcId = 11\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 620048ef3c1e73e57e02bb8562c416a319e73e4caac8e96a1ecb2933145a1d71\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = e6af6a7f87287da059a71684ed3498e1\n\n# tcId = 12\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 50c8303ea93925d64090d07bd109dfd9515a5a33431019c17d93465999a8b0053201d723120a8562b838cdff25bf9d1e\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 6a8cc3865f76897c2e4b245cf31c51f2\n\n# tcId = 13\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 2f5c64059db55ee0fb847ed513003746aca4e61c711b5de2e7a77ffd02da42feec601910d3467bb8b36ebbaebce5fba30d36c95f48a3e7980f0e7ac299332a80\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nresult = valid\ntag = cdc46ae475563de037001ef84ae21744\n\n# tcId = 14\n# draft-irtf-cfrg-gcmsiv-09\naad = 010000000000000000000000\nct = a8fe3e87\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000\nresult = valid\ntag = 07eb1f84fb28f8cb73de8e99e2f48a14\n\n# tcId = 15\n# draft-irtf-cfrg-gcmsiv-09\naad = 010000000000000000000000000000000200\nct = 6bb0fecf5ded9b77f902c7d5da236a4391dd0297\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0300000000000000000000000000000004000000\nresult = valid\ntag = 24afc9805e976f451e6d87f6fe106514\n\n# tcId = 16\n# draft-irtf-cfrg-gcmsiv-09\naad = 0100000000000000000000000000000002000000\nct = 44d0aaf6fb2f1f34add5e8064e83e12a2ada\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 030000000000000000000000000000000400\nresult = valid\ntag = bff9b2ef00fb47920cc72a0c0f13b9fd\n\n# tcId = 17\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = \niv = f46e44bb3da0015c94f70887\nkey = e66021d5eb8e4f4066d4adb9c33560e4\nmsg = \nresult = valid\ntag = a4194b79071b01a87d65f706e3949578\n\n# tcId = 18\n# draft-irtf-cfrg-gcmsiv-09\naad = 46bb91c3c5\nct = af60eb\niv = bae8e37fc83441b16034566b\nkey = 36864200e0eaf5284d884a0e77d31646\nmsg = 7a806c\nresult = valid\ntag = 711bd85bc1e4d3e0a462e074eea428a8\n\n# tcId = 19\n# draft-irtf-cfrg-gcmsiv-09\naad = fc880c94a95198874296\nct = bb93a3e34d3c\niv = afc0577e34699b9e671fdd4f\nkey = aedb64a6c590bc84d1a5e269e4b47801\nmsg = bdc66f146545\nresult = valid\ntag = d6a9c45545cfc11f03ad743dba20f966\n\n# tcId = 20\n# draft-irtf-cfrg-gcmsiv-09\naad = 046787f3ea22c127aaf195d1894728\nct = 4f37281f7ad12949d0\niv = 275d1ab32f6d1f0434d8848c\nkey = d5cc1fd161320b6920ce07787f86743b\nmsg = 1177441f195495860f\nresult = valid\ntag = 1d02fd0cd174c84fc5dae2f60f52fd2b\n\n# tcId = 21\n# draft-irtf-cfrg-gcmsiv-09\naad = c9882e5386fd9f92ec489c8fde2be2cf97e74e93\nct = f54673c5ddf710c745641c8b\niv = 9e9ad8780c8d63d0ab4149c0\nkey = b3fed1473c528b8426a582995929a149\nmsg = 9f572c614b4745914474e7c7\nresult = valid\ntag = c1dc2f871fb7561da1286e655e24b7b0\n\n# tcId = 22\n# draft-irtf-cfrg-gcmsiv-09\naad = 2950a70d5a1db2316fd568378da107b52b0da55210cc1c1b0a\nct = c9ff545e07b88a015f05b274540aa1\niv = ac80e6f61455bfac8308a2d4\nkey = 2d4ed87da44102952ef94b02b805249b\nmsg = 0d8c8451178082355c9e940fea2f58\nresult = valid\ntag = 83b3449b9f39552de99dc214a1190b0b\n\n# tcId = 23\n# draft-irtf-cfrg-gcmsiv-09\naad = 1860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f\nct = 6298b296e24e8cc35dce0bed484b7f30d580\niv = ae06556fb6aa7890bebc18fe\nkey = bde3b2f204d1e9f8b06bc47f9745b3d1\nmsg = 6b3db4da3d57aa94842b9803a96e07fb6de7\nresult = valid\ntag = 3e377094f04709f64d7b985310a4db84\n\n# tcId = 24\n# draft-irtf-cfrg-gcmsiv-09\naad = 7576f7028ec6eb5ea7e298342a94d4b202b370ef9768ec6561c4fe6b7e7296fa859c21\nct = 391cc328d484a4f46406181bcd62efd9b3ee197d05\niv = 6245709fb18853f68d833640\nkey = f901cfe8a69615a93fdf7a98cad48179\nmsg = e42a3c02c25b64869e146d7b233987bddfc240871d\nresult = valid\ntag = 2d15506c84a9edd65e13e9d24a2a6e70\n\n# tcId = 25\naad = \nct = \niv = 438a547a94ea88dce46c6c85\nkey = bedcfb5a011ebc84600fcb296c15af0d\nmsg = \nresult = valid\ntag = 596d0538e48526be1c991e40cc031073\n\n# tcId = 26\naad = \nct = 4f\niv = b30c084727ad1c592ac21d12\nkey = 384ea416ac3c2f51a76e7d8226346d4e\nmsg = 35\nresult = valid\ntag = 8b2b805fc0885e2b470d9dbe6cb15ed3\n\n# tcId = 27\naad = \nct = 04c7a55f97846e54\niv = b5e006ded553110e6dc56529\nkey = cae31cd9f55526eb038241fc44cac1e5\nmsg = d10989f2c52e94ad\nresult = valid\ntag = 48168ff846356c33032c719b518f18a8\n\n# tcId = 28\naad = \nct = fd9521041b0397a15b0070b93f48a9\niv = ecb0c42f7000ef0e6f95f24d\nkey = dd6197cd63c963919cf0c273ef6b28bf\nmsg = 4dcc1485365866e25ac3f2ca6aba97\nresult = valid\ntag = 09df91414578f7faf757d04ee26ab901\n\n# tcId = 29\naad = \nct = 6eb905287ddfafc32f6b1c10046c089f\niv = 0e1666f2dc652f7708fb8f0d\nkey = ffdf4228361ea1f8165852136b3480f7\nmsg = 25b12e28ac0ef6ead0226a3b2288c800\nresult = valid\ntag = 4ff9f939a77c34b0cb1ee75fcb0dd29a\n\n# tcId = 30\naad = \nct = 6f62bd09d4f36f73e289ab6dd114727fe3\niv = 965ff6643116ac1443a2dec7\nkey = c15ed227dd2e237ecd087eaaaad19ea4\nmsg = fee62fde973fe025ad6b322dcdf3c63fc7\nresult = valid\ntag = ea727c084db2bc948de0928edddd7fcf\n\n# tcId = 31\naad = \nct = 80133a4bea7311f0d3c9835144c37c4ef0",
     "ef20c8f2e36be1\niv = fbbc04fd6e025b7193eb57f6\nkey = a8ee11b26d7ceb7f17eaa1e4b83a2cf6\nmsg = c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf\nresult = valid\ntag = b92f47c1af6713e14fbdf60efebb50c6\n\n# tcId = 32\naad = \nct = 778b308e4ca17607df36c0b94695bc64603173b814701a9f69147b42478a0b1f\niv = a2dbe708db51c68ef02994a6\nkey = 7519588f30f7f08ff98e1beee6a2a783\nmsg = 1851956319256ebb0f9ccaf325a24abfc5c3e90b055e57cdc0c7ab2165ae03b1\nresult = valid\ntag = b75c98952c0aa11958a55c9c2ecf33f5\n\n# tcId = 33\naad = 30\nct = 173ba6370171be47dbb6163a63a3b725\niv = 4bad10c6d84fd43fd13ad36f\nkey = a5b5b6bae45b741fe4663890098f326a\nmsg = 127b150080ec0bc7704e26f4ab11abb6\nresult = valid\ntag = 53aefed6e971d5a1f435f0730a6dd0fd\n\n# tcId = 34\naad = 743e\nct = 959f0ff12481dedc4302ad7a904f9486\niv = 2186a3091237adae83540e24\nkey = 0cecb9f512932d68e2c7c0bc4bd621c8\nmsg = 437aeb94d842283ba57bb758e3d229f0\nresult = valid\ntag = 0215be2ab9b0672a7b82893891057c9c\n\n# tcId = 35\naad = 25591707c004f506f4b51e85e29f6a\nct = 8ae3a16a237f1358ac8cfeb5f4cc2818\niv = 0c908e58cddad69dea1a32c3\nkey = 55e04c122780be52ed9328928039008c\nmsg = 26eb70672eef03667b34cc7d0df05872\nresult = valid\ntag = 28f5aa8a34a9f7c01c17759d142b1bae\n\n# tcId = 36\naad = c07092d799dac2b4c05fbddd04743c34\nct = d5220f6a49d1e4c10d38c77c8156ebd0\niv = c30968c967e53505621628db\nkey = 5f0a1b5f8f8673d566ec7f54e7dca4f2\nmsg = f6538476daf04524cf134309dd84e187\nresult = valid\ntag = 80b50f526286dad22d40984636f0e9ce\n\n# tcId = 37\naad = 3ea12d80f40f34f812479d2ecc13d2d6df\nct = 3e771b9376e1d1cde3d9b73349c958bc\niv = a51c37f467893c1608e56274\nkey = 671a70e883fb0611dffd0b1dd9b8cca2\nmsg = 3baf3edf04dc0c97aae081cdeb08021d\nresult = valid\ntag = ebd3ea678a1e87839a4356584ea89bac\n\n# tcId = 38\naad = 5189ea6f39b2a78c0202fdff146c5cc6bdc7491d4786f80c6c6aef65634c05da\nct = 05b568a589d0a77a8ee9c6f06415c6b6\niv = 52c20979cdaaade573dba650\nkey = 63f03172505d90e94900125cb8a4b0dd\nmsg = 602c98997ee03fd11ce00e92de193977\nresult = valid\ntag = 91ba5089dffb7538199c441728d5f84a\n\n# tcId = 39\n# Testing for ctr overflow\naad = 395f4091b410c373073bcdc79e02d3af\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 00112233445566778899aabbccddeeff\nmsg = 43488548d88e6f774bcd2d52c18fbcc933a4e9a9613ff3edbe959ec59522adc098b3133b8d17b9e9dad631ad33752c95\nresult = valid\ntag = 00000000000000000000000000000000\nflags = ConstructedIv\n\n# tcId = 40\n# Testing for ctr overflow\naad = 616b2dff4d665e5f7ab890723dd981b1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = f012c6a7eb0e8af5bc45e015e7680a693dc709b95383f6a94babec1bc36e4be3cf4f55a31a94f11c6c3f90eed99682bc\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\nflags = ConstructedIv\n\n# tcId = 41\n# Testing for ctr overflow\naad = 387a8997605fd04ae8951c4759087864\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 030303030303030303030303\nkey = 00112233445566778899aabbccddeeff\nmsg = 71ceee58179d6fb968521e9594dbf98cc0040f6aa38fe873c32a9b122d6cbfd51aa4778b3f4f37be7348690d97e2468b\nresult = valid\ntag = fefffffffefffffffefffffffeffffff\nflags = ConstructedIv\n\n# tcId = 42\n# Testing for ctr overflow\naad = 6783b0d5e9d8a2a7274065797097d1ae\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 060606060606060606060606\nkey = 00112233445566778899aabbccddeeff\nmsg = 2e14f9e9a09ea204557367898a80dcad117af3666bea25762b70633a9f3614fbe631ba617c371fd5566d5e613496e69f\nresult = valid\ntag = ffffff7f00112233445566778899aabb\nflags = ConstructedIv\n\n# tcId = 43\n# Testing for ctr overflow\naad = 2933810c146f4f7dd146dd43f35199c6\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 00112233445566778899aabbccddeeff\nmsg = 27fac75879c9d87cd52a0793137ba792f6f145148158eb538f2081e09cd0315986a7025045ecbb2ca1bb18a17bfcd567\nresult = valid\ntag = ffffffffffffff7f0011223344556677\nflags = ConstructedIv\n\n# tcId = 44\n# Flipped bit 0 in tag\naad = 27dd62060507dae87c4f93f391ba15f9\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 45\n# Flipped bit 0 in tag\naad = 9ea3371e258288d5a01b15384e2c99ee\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 46\n# Flipped bit 0 in tag\naad = ce24e3ec0fe7b8550d621b71fdb5d0eb\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 47\n# Flipped bit 7 in tag\naad = 1471f354b359c235117febba854a823b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 48\n# Flipped bit 7 in tag\naad = 11f820294fc9d13f1895d2fb5509913b\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 49\n# Flipped bit 8 in tag\naad = 45e7257b814f09de44177b27b914822f\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 50\n# Flipped bit 8 in tag\naad = 4c49780b5438c4a7ea9795b9856fdae1\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 51\n# Flipped bit 8 in tag\naad = ecc2f2f4142837a34f9cd1fa030a5d7f\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 52\n# Flipped bit 31 in tag\naad = 69c7f5605da8e0684990b087411f8cf5\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 53\n# Flipped bit 31 in tag\naad = 20b346be60e7e97588bf504ce707ce0b\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 54\n# Flipped bit 56 in tag\naad = 3955107da2e9938c6b19bb19ae9fc09f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 55\n# Flipped bit 56 in tag\naad = b1385d46a8accd7022c142442a0b13e9\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 56\n# Flipped bit 63 in tag\naad = 19b298f3a061a73cb774da927ce11ca2\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 57\n# Flipped bit 63 in tag\naad = bff8c631e61c18a050a523ad4a750a20\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 58\n# Flipped bit 64 in tag\naad = 7b6171302b689c926852163e310f08d4\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 59\n# Flipped bit 88 in tag\naad = 4e79aa30003226402245893e91f2024c\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 60\n# Flipped bit 88 in tag\naad = 9312e1813a05b8682",
     "555061b05edcef1\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 61\n# Flipped bit 96 in tag\naad = 643684185211af58061022efa360d54b\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 62\n# Flipped bit 96 in tag\naad = 786d8056e26150918e3cbe520cafeb50\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 63\n# Flipped bit 97 in tag\naad = 555036128fa18ecadd090cb772ac0bf3\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 64\n# Flipped bit 97 in tag\naad = a5b43b8e1dbb2bfbda1b625fee4064a7\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 65\n# Flipped bit 120 in tag\naad = ae47cc5d7681dd480c23469c5519b647\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 66\n# Flipped bit 120 in tag\naad = d53dd677184702eaa660f1349195fc04\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 67\n# Flipped bit 120 in tag\naad = dc78584e4599dd4b2fb333db2f9ccb95\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 68\n# Flipped bit 121 in tag\naad = 0bfd9271e79153a8afdb7f3d96fe446f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 69\n# Flipped bit 121 in tag\naad = 1e0537a95b7200134d0b440657d50fd1\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 70\n# Flipped bit 121 in tag\naad = 7633155df35857258d23b0651d60847c\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 71\n# Flipped bit 126 in tag\naad = ab0a064b473de43598adf81ee297d856\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 72\n# Flipped bit 127 in tag\naad = f62bdc3f4fcb699ee12f6e87dcc704cb\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 73\n# Flipped bit 127 in tag\naad = 1320051031807b8f44e9d2cb1ec6aa92\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 74\n# Flipped bit 127 in tag\naad = 329b813d3ae2225d3e15f97a28037bcc\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 75\n# Flipped bit 0..127 in tag\naad = edc723bedd0078696acdea005c74b841\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 76\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = \niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = \nresult = valid\ntag = 07f5f4169bbf55a8400cd47ea6fd400f\n\n# tcId = 77\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = c2ef328e5c71c83b\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0100000000000000\nresult = valid\ntag = 843122130f7364b761e0b97427e3df28\n\n# tcId = 78\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 9aab2aeb3faa0a34aea8e2b1\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 010000000000000000000000\nresult = valid\ntag = 8ca50da9ae6559e48fd10f6e5c9ca17e\n\n# tcId = 79\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 85a01b63025ba19b7fd3ddfc033b3e76\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 01000000000000000000000000000000\nresult = valid\ntag = c9eac6fa700942702e90862383c6c366\n\n# tcId = 80\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = 4a6a9db4c8c6549201b9edb53006cba821ec9cf850948a7c86c68ac7539d027f\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0100000000000000000000000000000002000000000000000000000000000000\nresult = valid\ntag = e819e63abcd020b006a976397632eb5d\n\n# tcId = 81\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = c00d121893a9fa603f48ccc1ca3c57ce7499245ea0046db16c53c7c66fe717e39cf6c748837b61f6ee3adcee17534ed5\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = 790bc96880a99ba804bd12c0e6a22cc4\n\n# tcId = 82\n# draft-irtf-cfrg-gcmsiv-09\naad = \nct = c2d5160a1f8683834910acdafc41fbb1632d4a353e8b905ec9a5499ac34f96c7e1049eb080883891a4db8caaa1f99dd004d80487540735234e3744512c6f90ce\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 112864c269fc0d9d88c61fa47e39aa08\n\n# tcId = 83\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 1de22967237a8132\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0200000000000000\nresult = valid\ntag = 91213f267e3b452f02d01ae33e4ec854\n\n# tcId = 84\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 163d6f9cc1b346cd453a2e4c\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 020000000000000000000000\nresult = valid\ntag = c1a4a19ae800941ccdc57cc8413c277f\n\n# tcId = 85\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = c91545823cc24f17dbb0e9e807d5ec17\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 02000000000000000000000000000000\nresult = valid\ntag = b292d28ff61189e8e49f3875ef91aff7\n\n# tcId = 86\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 07dad364bfc2b9da89116d7bef6daaaf6f255510aa654f920ac81b94e8bad365\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = aea1bad12702e1965604374aab96dbbc\n\n# tcId = 87\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = c67a1f0f567a5198aa1fcc8e3f21314336f7f51ca8b1af61feac35a86416fa47fbca3b5f749cdf564527f2314f42fe25\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 03332742b228c647173616cfd44c54eb\n\n# tcId = 88\n# draft-irtf-cfrg-gcmsiv-09\naad = 01\nct = 67fd45e126bfb9a79930c43aad2d36967d3f0e4d217c1e551f59727870beefc98cb933a8fce9de887b1e40799988db1fc3f91880ed405b2dd298318858467c89\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nresult = valid\ntag = 5bde0285037c5de81e5b570a049b62a0\n\n# tcId = 89\n# draft-irtf-cfrg-gcmsiv-09\naad = 010000000000",
@@ -3026,9 +3125,9 @@
     "2030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = d04846a01f472262e60a1cb4cfcbdcb05c3f819628a3a49395c5dae96c434b2417ce071699afa74a60c32c0bafd9c01a\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\nflags = ConstructedIv\n\n# tcId = 118\n# Testing for ctr overflow\naad = 2e34d12622a441b557eeb1d647c6cb73\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 79637cee9decf33e3080de3d2c55bd21cd529ba8080b583edb6cfe13cda04bd00debe58b8cd48d6e02a1ecfc4d87923a\nresult = valid\ntag = fefffffffefffffffefffffffeffffff\nflags = ConstructedIv\n\n# tcId = 119\n# Testing for ctr overflow\naad = 0814a95481bf915a4097949e3525c7e7\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000000000000\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 6492a73880dac7f36743715b0fc7063d3e46a25044310bba5849ed88bfcb54b0adbe3978040bda849906e1aa09d1a8e3\nresult = valid\ntag = ffffff7f00112233445566778899aabb\nflags = ConstructedIv\n\n# tcId = 120\n# Testing for ctr overflow\naad = b691ef42f2ab8d1b4a581bb08394b13a\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 7848d9e872f40bca1b82a4e7185fb75193b3496cc1dc2a72b86ed156ab8389e71687ed25eb6485e66561fa8c39853368\nresult = valid\ntag = ffffffffffffff7f0011223344556677\nflags = ConstructedIv\n\n# tcId = 121\n# Flipped bit 0 in tag\naad = e144878b0bbbf01b75231277e1e0d114\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 122\n# Flipped bit 0 in tag\naad = 0289eaa93eb084107d2088435ef2a0cd\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 123\n# Flipped bit 1 in tag\naad = f3bd6013669b7d9371727fcb1aafea75\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 124\n# Flipped bit 7 in tag\naad = 922e91b2c5016e4303c737d1608ca25f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 125\n# Flipped bit 7 in tag\naad = 7195dd0addce5dd7014bfddb2f23206f\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 126\n# Flipped bit 7 in tag\naad = 32fc2a53e9678f1fc6d63081c36c6f2c\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 127\n# Flipped bit 8 in tag\naad = c55ba71ee250216f8ecfe822d712dd38\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 128\n# Flipped bit 8 in tag\naad = 5546acf865fc305fbd7ff1092cb9c2c3\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 129\n# Flipped bit 31 in tag\naad = 6b060eebe1843b409a4dfd0be8f86a2b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 130\n# Flipped bit 31 in tag\naad = c4adb92f1a60eb2faff88675f62a7276\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 131\n# Flipped bit 32 in tag\naad = 70c5a8591f52f869c6415a6d7000e253\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 132\n# Flipped bit 56 in tag\naad = 46c788111083d8913153a6e37e5506a3\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 133\n# Flipped bit 56 in tag\naad = 1ed7665962378cec4039c793a8f744d0\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 134\n# Flipped bit 56 in tag\naad = a0f7587c5862609c6dc983780bcda180\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 135\n# Flipped bit 63 in tag\naad = b5fe79f182cb9f2945208e29513928d1\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 136\n# Flipped bit 63 in tag\naad = c1dbf87e4a586b040c53f6dd9063b4cd\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 137\n# Flipped bit 64 in tag\naad = 845466e603ca85a224693d150ae13ba3\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 138\n# Flipped bit 88 in tag\naad = 90a992a8443d65870b4d8bca85e4a698\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 139\n# Flipped bit 88 in tag\naad = e1737a834410e5fba6cdc1d1f7d12c12\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 140\n# Flipped bit 96 in tag\naad = 445c8fffa3d960e39ca86260c66418d8\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 141\n# Flipped bit 97 in tag\naad = 18cb9f5eede6224fa3fcd525cf9f958b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 142\n# Flipped bit 97 in tag\naad = 8c4fbca37d2e361856b9f80adf455fa0\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 143\n# Flipped bit 97 in tag\naad = bc517fe140abf2b42eb1cafe8c0715a9\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 144\n# Flipped bit 120 in tag\naad = 617e1c5ef62ed35cf678e670f116ff2f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff001122",
     "33445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 145\n# Flipped bit 120 in tag\naad = e71802b7a37e8ef1f001ef0c52c636f2\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 146\n# Flipped bit 120 in tag\naad = be647e37f154d4a8edca5a29ca221cc5\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 147\n# Flipped bit 121 in tag\naad = b3caa01f49c7cbc56c7c92547257957e\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 148\n# Flipped bit 121 in tag\naad = ab0347a2aec4cc4c366583062442ba07\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 149\n# Flipped bit 126 in tag\naad = 62573ef39a27f77b37fb7bfc84e46cee\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 150\n# Flipped bit 126 in tag\naad = 28e3cadfb16834e824642e965588c200\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 151\n# Flipped bit 126 in tag\naad = 7edd2fc15bed224a46dc8608e1766080\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 152\n# Flipped bit 127 in tag\naad = 7e0e03104e2c0ff20ba4c35742180c5b\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 153\n# Flipped bit 127 in tag\naad = 9a24dc75c5ddd3bab57ff532eb86d224\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 154\n# Flipped bit 127 in tag\naad = 3196aec499c15bc043b6866ba0df6e6b\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 155\n# Flipped bit 0..127 in tag\naad = 55a2987aa94bf46ad1b6d253a44c1622\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n",
 };
-static const size_t kLen108 = 81097;
+static const size_t kLen124 = 81097;
 
-static const char *kData108[] = {
+static const char *kData124[] = {
     "# Imported from Wycheproof's aes_gcm_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-GCM\n# Generator version: 0.8r12\n\n[ivSize = 96]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 1\naad = \nct = 26073cc1d851beff176384dc9896d5ff\niv = 028318abc1824029138141a2\nkey = 5b9604fe14eadba931b0ccf34843dab9\nmsg = 001d0c231287c1182784554ca3a21908\nresult = valid\ntag = 0a3ea7a5487cb5f7d70fb6c58d038554\n\n# tcId = 2\naad = 00112233445566778899aabbccddeeff\nct = 49d8b9783e911913d87094d1f63cc765\niv = 921d2507fa8007b7bd067d34\nkey = 5b9604fe14eadba931b0ccf34843dab9\nmsg = 001d0c231287c1182784554ca3a21908\nresult = valid\ntag = 1e348ba07cca2cf04c618cb4d43a5b92\n\n# tcId = 3\naad = aac39231129872a2\nct = eea945f3d0f98cc0fbab472a0cf24e87\niv = 0432bc49ac34412081288127\nkey = aa023d0478dcb2b2312498293d9a9129\nmsg = 2035af313d1346ab00154fea78322105\nresult = valid\ntag = 4bb9b4812519dadf9e1232016d068133\n\n# tcId = 4\naad = \nct = \niv = 438a547a94ea88dce46c6c85\nkey = bedcfb5a011ebc84600fcb296c15af0d\nmsg = \nresult = valid\ntag = 960247ba5cde02e41a313c4c0136edc3\n\n# tcId = 5\naad = \nct = 54\niv = b30c084727ad1c592ac21d12\nkey = 384ea416ac3c2f51a76e7d8226346d4e\nmsg = 35\nresult = valid\ntag = 7c1e4ae88bb27e5638343cb9fd3f6337\n\n# tcId = 6\naad = \nct = a036ead03193903f\niv = b5e006ded553110e6dc56529\nkey = cae31cd9f55526eb038241fc44cac1e5\nmsg = d10989f2c52e94ad\nresult = valid\ntag = 3b626940e0e9f0cbea8e18c437fd6011\n\n# tcId = 7\naad = \nct = 8a9992388e735f80ee18f4a63c10ad\niv = ecb0c42f7000ef0e6f95f24d\nkey = dd6197cd63c963919cf0c273ef6b28bf\nmsg = 4dcc1485365866e25ac3f2ca6aba97\nresult = valid\ntag = 1486a91cccf92c9a5b00f7b0e034891c\n\n# tcId = 8\naad = \nct = f7bd379d130477176b8bb3cb23dbbbaa\niv = 0e1666f2dc652f7708fb8f0d\nkey = ffdf4228361ea1f8165852136b3480f7\nmsg = 25b12e28ac0ef6ead0226a3b2288c800\nresult = valid\ntag = 1ee6513ce30c7873f59dd4350a588f42\n\n# tcId = 9\naad = \nct = 0de51fe4f7f2d1f0f917569f5c6d1b009c\niv = 965ff6643116ac1443a2dec7\nkey = c15ed227dd2e237ecd087eaaaad19ea4\nmsg = fee62fde973fe025ad6b322dcdf3c63fc7\nresult = valid\ntag = 6cd8521422c0177e83ef1b7a845d97db\n\n# tcId = 10\naad = \nct = 7cd9f4e4f365704fff3b9900aa93ba54b672bac554275650\niv = fbbc04fd6e025b7193eb57f6\nkey = a8ee11b26d7ceb7f17eaa1e4b83a2cf6\nmsg = c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf\nresult = valid\ntag = f4eb193241226db017b32ec38ca47217\n\n# tcId = 11\naad = c3\nct = f58d453212c2c8a436e9283672f579f119122978\niv = 32bcb9b569e3b852d37c766a\nkey = 28ff3def08179311e2734c6d1c4e2871\nmsg = dfc61a20df8505b53e3cd59f25770d5018add3d6\nresult = valid\ntag = 5901131d0760c8715901d881fdfd3bc0\n\n# tcId = 12\naad = 834afdc5c737186b\nct = bf864616c2347509ca9b10446379b9bdbb3b8f64\niv = 9c3a4263d983456658aad4b1\nkey = e63a43216c08867210e248859eb5e99c\nmsg = b14da56b0462dc05b871fc815273ff4810f92f4b\nresult = valid\ntag = a97d25b490390b53c5db91f6ee2a15b8\n\n# tcId = 13\naad = 4020855c66ac4595058395f367201c4c\nct = a6f2ef3c7ef74a126dd2d5f6673964e27d5b34b6\niv = 33e90658416e7c1a7c005f11\nkey = 38449890234eb8afab0bbf82e2385454\nmsg = f762776bf83163b323ca63a6b3adeac1e1357262\nresult = valid\ntag = b8bbdc4f5014bc752c8b4e9b87f650a3\n\n# tcId = 14\naad = 76eb5f147250fa3c12bff0a6e3934a0b16860cf11646773b\nct = bd64802cfebaeb487d3a8f76ce943a37b3472dd5\niv = 9f0d85b605711f34cd2a35ba\nkey = 6a68671dfe323d419894381f85eb63fd\nmsg = 0fc67899c3f1bbe196d90f1eca3797389230aa37\nresult = valid\ntag = fce9a5b530c7d7af718be1ec0ae9ed4d\n\n# tcId = 15\naad = \nct = d33bf6722fc29384fad75f990248b9528e0959aa67ec66869dc3996c67a2d559e7d77ce5955f8cad2a4df5fdc3acccafa7bc0def53d848111256903e5add0420\niv = 5dfc37366f5688275147d3f9\nkey = e12260fcd355a51a0d01bb1f6fa538c2\nmsg = d902deeab175c008329a33bfaccd5c0eb3a6a152a1510e7db04fa0aff7ce4288530db6a80fa7fea582aa7d46d7d56e708d2bb0c5edd3d26648d336c3620ea55e\nresult = valid\ntag = 8bc833de510863b4b432c3cbf45aa7cc\n\n# tcId = 16\naad = \nct = 17d72d90bd23e076d8364a87ecb9ac58acc5de4629bfd590409b8bf1fcd3a2f602731b4614cec15e773ea65a65e7210994256bf5450a25acb527269c065f2e2f2279d1fe8b3eda98dcf87b348f1528377bbdd258355d46e035330483d8097e80c7de9bbb606ddf723f2909217ffdd18e8bdbd7b08062f1dcba960e5c0d290f5f\niv = d767c48d2037b4bd2c231bbd\nkey = 3c55f88e9faa0d68ab50d02b47161276\nmsg = 5d6add48e7a5704e54f9c2829a9b4283dce0d3a65b133eba3793c4fbfa1d8e3a2539d0d4f3de381598ce5b2360173fbd149476c31692c5d6e872fce40219378949c2e70b5f1b9f0a1d5f38352ad814b2a035bb3f3f26425d831a2f7a5e65c5dfcd91a315c2b24f53a662605ea40857dd980e9be5cdad000c569f2d204d4bd3b0\nresult = valid\ntag = 090b8c2ec98e4116186d0e5fbefeb9c2\n\n# tcId = 17\naad = \nct = 5bc6dbafc401101c7a08c81d6c2791aa147ce093aad172be18379c747384a54a41a747ba955cade8fdfb8967aa808b43fee3d757cc80f11163b800e5e59df932757f76c40b3d9cba449aaf11e4f80e003b1f384eafa4f76e81b13c09ec1ad88e7650c750d442fe46d225a373e8a1b564b4915a5c6c513cfdfa22d929d5741ca5ebefaedcba636c7c3bbef18863fdc126b4b451611049c35d814fc2eb7e4b8f1a8995ecb4a3c86652a068c0b2a3e1c5941d59c210b458d5d5d3b06420ec2053465ccceca7c20f67404985460379e2ee806a46e8409dfab2e0dd67ea3cf46d5ad4eb78756827358c3ef1fdbd07c33834f3d9eca3ff13b744a01059a6c17a315a8fd4\niv = dfe20d1c4350e6235d987af1\nkey = a294e70fa2ac10a1fb00c588b888b673\nmsg = 6ed1d7d618d158741f52078006f28494ba72a2454f27160ae8722793fcebc538ebc2f67c3ace3e0fe7c47b9e74e081182b47c930144e3fc80d0ad50611c3afcfe2dbc5279edbbba087c0e390355f3daffcd25ad4dea007c284ad92e7fcbecb438fb60623ff89a599dca2aac141b26651386ca55b739b94901ef6db609c344d8acf4544568e31bb09361112754b1c0c6a3c875bd9453b0ee0081412151398a294ecad75add521611db5288b60ac3c0128f6e94366b69e659e6aa66f058a3a3571064edbb0f05c11e5dde938fb46c3935dd5193a4e5664688f0ae67c29b7cc49a7963140f82e311a20c98cd34fbcab7b4b515ae86557e62099e3fc37b9595c85a75c\nresult = valid\ntag = c7587e7da41bed682c37377ea4324029\n\n# tcId = 18\naad = 75fc9078b488e9503dcb568c882c9eec24d80b04f0958c82aac8484f025c90434148db8e9bfe29c7e071b797457cb1695a5e5a6317b83690ba0538fb11e325ca\nct = b6786812574a254eb43b1cb1d1753564c6b520e9\niv = 5046e7e08f0747e1efccb09e\nkey = c4b03435b91fc52e09eff27e4dc3fb42\nmsg = 8e887b224e8b89c82e9a641cf579e6879e1111c7\nresult = valid\ntag = ad8c09610d508f3d0f03cc523c0d5fcc\n\n# tcId = 19\naad = 8ed8a9be4c3d32a5098434ee5c0c4fc20f78ef5e25ed8b72a840a463e36b67b881e048b5e49f515b2541ad5ce4ebb3a917c16bcdc0dc3cb52bb4ed5a1dffcf1e1866544e8db103b2ad99c6fa6e7de1d8b45bff57ec872f1cfc78b0e4870f6f200ff1291cae033defc3327ba82792ba438e35c4bfbb684fec5ce5e3ae167d01d7\nct = cfb631790767d0645d8ec6f23bf7fa8b19ce79ee\niv = 517c55c2ec9bfea90addc2bd\nkey = 7e37d56e6b1d0172d40d64d6111dd424\nmsg = 6a7dea03c1bba70be8c73da47d5ee06d72a27430\nresult = valid\ntag = c5767ddaa747158446231766bd20490c\n\n# tcId = 20\naad = 18526e4efd995a0bf6405d9f906725c290278958d49554974d8fe025e7860daa225c1285b0573916a4b6741f7cc2e29ce4e525e12f436cb7ce0ad47df3d0f5bd80fb27e47635a4985fdaedf0e821f1c8959985cac49c97a4a02438d92b4afd4c855dcc7ef41ecfc36866334fcc05b2bb93ef13f00c5ea9b921e8a519d77f648e0efe9b5a62305a2ecf7d4999663a6ddfca517f1f36f0899b0bdef9f433c4bb2663c0cc1bb616e7d1949e522bec85485d371d1134c90eede75e865dc7be405b54c33f0acbace6cf780c78035b8035b6ea3f562a8d30a156c199fdafd25be06ee895581195ef125cb4e629e4f18e0bee979d31513896db8466e448e6b4600a316757\nct = e4d3f4898cb3d9732641d1f8d9d889b2c98af930\niv = a2712eac5e06d3cc2864aa8b\nkey = 3076741408f734ce25d48f982e8b844b\nmsg = 414ec6b149e54735302dada888b98b7fdb4c127c\nresult = valid\ntag = 76d4fbb69d529b64175b328be00b1068\n\n# tcId = 21\n# special case\naad = \nct = f62d84d649e56bc8cfedc5d74a51e2f7\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = ebd4a3e10cf6d41c50aeae007563b072\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 22\n# special case\naad = \nct = 431f31e6840931fd95f94bf88296ff69\niv = ffffffffffffffffffffffff\nkey = 00112233445566778899aabbccddeeff\nmsg = d593c4d8224f1b100c35e4f6c4006543\nresult = valid\ntag = 00000000000000000000000000000000\n\n# tcId = 23\n# Flipped bit 0 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d9847dbc326a06e988c77ad3863e6083\n\n# tcId = 24\n# Flipped bit 1 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = da847dbc326a06e988c7",
     "7ad3863e6083\n\n# tcId = 25\n# Flipped bit 7 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = 58847dbc326a06e988c77ad3863e6083\n\n# tcId = 26\n# Flipped bit 8 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8857dbc326a06e988c77ad3863e6083\n\n# tcId = 27\n# Flipped bit 31 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847d3c326a06e988c77ad3863e6083\n\n# tcId = 28\n# Flipped bit 32 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc336a06e988c77ad3863e6083\n\n# tcId = 29\n# Flipped bit 33 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc306a06e988c77ad3863e6083\n\n# tcId = 30\n# Flipped bit 63 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a066988c77ad3863e6083\n\n# tcId = 31\n# Flipped bit 64 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e989c77ad3863e6083\n\n# tcId = 32\n# Flipped bit 71 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e908c77ad3863e6083\n\n# tcId = 33\n# Flipped bit 77 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988e77ad3863e6083\n\n# tcId = 34\n# Flipped bit 80 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77bd3863e6083\n\n# tcId = 35\n# Flipped bit 96 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3873e6083\n\n# tcId = 36\n# Flipped bit 97 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3843e6083\n\n# tcId = 37\n# Flipped bit 103 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3063e6083\n\n# tcId = 38\n# Flipped bit 120 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3863e6082\n\n# tcId = 39\n# Flipped bit 121 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3863e6081\n\n# tcId = 40\n# Flipped bit 126 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3863e60c3\n\n# tcId = 41\n# Flipped bit 127 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a06e988c77ad3863e6003\n\n# tcId = 42\n# Flipped bits 0 and 64 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d9847dbc326a06e989c77ad3863e6083\n\n# tcId = 43\n# Flipped bits 31 and 63 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847d3c326a066988c77ad3863e6083\n\n# tcId = 44\n# Flipped bits 63 and 127 in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d8847dbc326a066988c77ad3863e6003\n\n# tcId = 45\n# all bits of tag flipped\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = 277b8243cd95f9167738852c79c19f7c\n\n# tcId = 46\n# Tag changed to all zero\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 47\n# tag changed to all 1\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 48\n# msbs changed in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = 5804fd3cb2ea86690847fa5306bee003\n\n# tcId = 49\n# lsbs changed in tag\naad = \nct = eb156d081ed6b6b55f4612f021d87b39\niv = 505152535455565758595a5b\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 202122232425262728292a2b2c2d2e2f\nresult = invalid\ntag = d9857cbd336b07e889c67bd2873f6182\n\n[ivSize = 64]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 50\naad = aac39231129872a2\nct = 64c36bb3b732034e3a7d04efc5197785\niv = 0432bc49ac344120\nkey = aa023d0478dcb2b2312498293d9a9129\nmsg = 2035af313d1346ab00154fea78322105\nresult = valid\ntag = b7d0dd70b00d65b97cfd080ff4b819d1\n\n# tcId = 51\n# small IV sizes\naad = \nct = \niv = 28e9b7851724bae3\nkey = f3434725c82a7f8bb07df1f8122fb6c9\nmsg = \nresult = acceptable\ntag = 44aca00f42e4199b829a55e69b073d9e\nflags = SmallIv\n\n# tcId = 52\n# small IV sizes\naad = \nct = 03e1a168a7e377a913879b296a1b5f9c\niv = d084547de55bbc15\nkey = deb62233559b57476602b5adac57c77f\nmsg = d8986df0241ed3297582c0c239c724cb\nresult = acceptable\ntag = 3290aa95af505a742f517fabcc9b2094\nflags = SmallIv\n\n[ivSize = 128]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 53\naad = 1a0293d8f90219058902139013908190bc490890d3ff12a3\nct = 64069c2d58690561f27ee199e6b479b6369eec688672bde9\niv = 3254202d854734812398127a3d134421\nkey = 2034a82547276c83dd3212a813572bce\nmsg = 02efd2e5782312827ed5d230189a2a342b277ce048462193\nresult = valid\ntag = 9b7abadd6e69c1d9ec925786534f5075\n\n# tcId = 54\naad = \nct = \niv = fa294b129972f7fc5bbd5b96bba837c9\nkey = b67b1a6efdd40d37080fbe8f8047aeb9\nmsg = \nresult = valid\ntag = a2cf26481517ec25085c5b17d0786183\n\n# tcId = 55\naad = \nct = fd\niv = 9477849d6ccdfca112d92e53fae4a7ca\nkey = 209e6dbf2ad26a105445fc0207cd9e9a\nmsg = 01\nresult = valid\ntag = 032df7bba5d8ea1a14f16f70bd0e14ec\n\n# tcId = 56\naad = \nct = 2f333087bdca58219f9bfc273e45cc\niv = 5171524568e81d97e8c4de4ba56c10a0\nkey = a549442e35154032d07c8666006aa6a2\nmsg = 1182e93596cac5608946400bc73f3a\nresult = valid\ntag = e06d1ef473132957ad37eaef29733ca0\n\n# tcId = 57\naad = \nct = a780bd01c80885156c88a973264c8ee5\niv = 1275115499ae722268515bf0c164b49c\nkey = cfb4c26f126f6a0acb8e4e220f6c56cd\nmsg = 09dfd7f080275257cf97e76f966b1ad9\nresult = valid\ntag = 2adeffa682c8d8a81fada7d9fcdd2ee2\n\n# tcId = 58\naad = \nct = 7e47e10fe3c6fbfa381770eaf5d48d1482e71e0c44dff1e30ca6f95d92052084\niv = 95c1dd8c0f1705ece68937901f7add7b\nkey = 0b11ef3a08c02970f7",
     "4281c860691c75\nmsg = f693d4edd825dbb0618d91113128880dbebb23e25d00ed1f077d870be9cc7536\nresult = valid\ntag = d01444fa5d9c499629d174ff3927a1ac\n\n# tcId = 59\n# J0:000102030405060708090a0b0c0d0e0f\naad = \nct = 00078d109d92143fcd5df56721b884fac64ac7762cc09eea2a3c68e92a17bdb575f87bda18be564e\niv = f95fde4a751913202aeeee32a0b55753\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 152a65045fe674f97627427af5be22da\nflags = ConstructedIv\n\n# tcId = 60\n# J0:00000000000000000000000000000000\naad = \nct = 84d4c9c08b4f482861e3a9c6c35bc4d91df927374513bfd49f436bd73f325285daef4ff7e13d46a6\niv = 7b95b8c356810a84711d68150a1b7750\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 213a3cb93855d18e69337eee66aeec07\nflags = ConstructedIv\n\n# tcId = 61\n# J0:ffffffffffffffffffffffffffffffff\naad = \nct = 948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc3c60ad5a949886de968cf53ea6462aed\niv = 1a552e67cdc4dc1a33b824874ebf0bed\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 99b381bfa2af9751c39d1b6e86d1be6a\nflags = ConstructedIv\n\n# tcId = 62\n# J0:fffffffffffffffffffffffffffffffe\naad = \nct = 64b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc\niv = dd9d0b4a0c3d681524bffca31d907661\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 5281efc7f13ac8e14ccf5dca7bfbfdd1\nflags = ConstructedIv\n\n# tcId = 63\n# J0:fffffffffffffffffffffffffffffffd\naad = \nct = 2bb69c3e5d1f91815c6b87a0d5bbea7164b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e8\niv = 57c5643c4e37b4041db794cfe8e1f0f4\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = a3ea2c09ee4f8c8a12f45cddf9aeff81\nflags = ConstructedIv\n\n# tcId = 64\n# J0:000102030405060708090a0bffffffff\naad = \nct = 127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4af37d0fe9af033052bd537c4ae978f60\niv = 99821c2dd5daecded07300f577f7aff1\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 07eb2fe4a958f8434d40684899507c7c\nflags = ConstructedIv\n\n# tcId = 65\n# J0:000102030405060708090a0bfffffffe\naad = \nct = 0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4\niv = 5e4a3900142358d1c774d8d124d8d27d\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = f145c2dcaf339eede427be934357eac0\nflags = ConstructedIv\n\n# tcId = 66\n# J0:000102030405060708090a0bfffffffd\naad = \nct = f0c6ffc18bd46df5569185a9afd169eb0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57\niv = d4125676562984c0fe7cb0bdd1a954e8\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = facd0bfe8701b7b4a2ba96d98af52bd9\nflags = ConstructedIv\n\n# tcId = 67\n# J0:000102030405060708090a0b7fffffff\naad = \nct = d6928e094c06e0a7c4db42184cf7529e95de88b767edebe9b343000be3dab47ea08b744293eed698\niv = b97ec62a5e5900ccf9e4be332e336091\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = a03e729dcfd7a03155655fece8affd7e\nflags = ConstructedIv\n\n# tcId = 68\n# J0:000102030405060708090a0b7ffffffe\naad = \nct = d82ce58771bf6487116bf8e96421877ed6928e094c06e0a7c4db42184cf7529e95de88b767edebe9\niv = 7eb6e3079fa0b4c3eee366177d1c1d1d\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 1e43926828bc9a1614c7b1639096c195\nflags = ConstructedIv\n\n# tcId = 69\n# J0:000102030405060708090a0bffff7fff\naad = \nct = a197a37a5d79697078536bc27fe46cd8d475526d9044aa94f088a054f8e380c64f79414795c61480\niv = 0314fcd10fdd675d3c612962c931f635\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = f08baddf0b5285c91fc06a67fe4708ca\nflags = ConstructedIv\n\n# tcId = 70\n# J0:000102030405060708090a0bffff7ffe\naad = \nct = 149fde9abbd3a43c2548575e0db9fb84a197a37a5d79697078536bc27fe46cd8d475526d9044aa94\niv = c4dcd9fcce24d3522b66f1469a1e8bb9\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 62a4b6875c288345d6a454399eac1afa\nflags = ConstructedIv\n\n# tcId = 71\n# special case\naad = \nct = 45a3f89d02918bfd0c8161658ccc9795\niv = 00000000000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = bec6fa05c1718b9b84c47345bbed7dcb\nresult = valid\ntag = 00000000000000000000000000000000\n\n# tcId = 72\n# special case\naad = \nct = 1cd5a06214235ceb044d4bad7b047312\niv = ffffffffffffffffffffffffffffffff\nkey = 00112233445566778899aabbccddeeff\nmsg = 4d82639c39d3f3490ee903dd0be7afcf\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 73\naad = 00000000ffffffff\nct = e27abdd2d2a53d2f136b\niv = 00112233445566778899aabb\nkey = 92ace3e348cd821092cd921aa3546374299ab46209691bc28b8752d17f123c20\nmsg = 00010203040506070809\nresult = valid\ntag = 9a4a2579529301bcfb71c78d4060f52c\n\n# tcId = 74\naad = aabbccddeeff\nct = \niv = 00112233445566778899aabb\nkey = 29d3a44f8723dc640239100c365423a312934ac80239212ac3df3421a2098123\nmsg = \nresult = valid\ntag = 2a7d77fa526b8250cb296078926b5020\n\n# tcId = 75\naad = \nct = \niv = 4da5bf8dfd5852c1ea12379d\nkey = 80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0\nmsg = \nresult = valid\ntag = 4771a7c404a472966cea8f73c8bfe17a\n\n# tcId = 76\naad = \nct = 06\niv = 99e23ec48985bccdeeab60f1\nkey = cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273\nmsg = 2a\nresult = valid\ntag = 633c1e9703ef744ffffb40edf9d14355\n\n# tcId = 77\naad = \nct = cf332a12fdee800b\niv = 4f07afedfdc3b6c2361823d3\nkey = 51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152\nmsg = be3308f72a2c6aed\nresult = valid\ntag = 602e8d7c4799d62c140c9bb834876b09\n\n# tcId = 78\naad = \nct = 43fc101bff4b32bfadd3daf57a590e\niv = 68ab7fdbf61901dad461d23c\nkey = 67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb\nmsg = 51f8c1f731ea14acdb210a6d973e07\nresult = valid\ntag = ec04aacb7148a8b8be44cb7eaf4efa69\n\n# tcId = 79\naad = \nct = f58c16690122d75356907fd96b570fca\niv = 2fcb1b38a99e71b84740ad9b\nkey = 59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a\nmsg = 549b365af913f3b081131ccb6b825588\nresult = valid\ntag = 28752c20153092818faba2a334640d6e\n\n# tcId = 80\naad = \nct = 73a6b6f45f6ccc5131e07f2caa1f2e2f56\niv = 45aaa3e5d16d2d42dc03445d\nkey = 3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011\nmsg = 3ff1514b1c503915918f0c0c31094a6e1f\nresult = valid\ntag = 2d7379ec1db5952d4e95d30c340b1b1d\n\n# tcId = 81\naad = \nct = 0843fff52d934fc7a071ea62c0bd351ce85678cde3ea2c9e\niv = e6b1adf2fd58a8762c65f31b\nkey = 0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7\nmsg = 10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111\nresult = valid\ntag = 7355fde599006715053813ce696237a8\n\n# tcId = 82\naad = c0\nct = eb5500e3825952866d911253f8de860c00831c81\niv = 98bc2c7438d5cd7665d76f6e\nkey = b279f57e19c8f53f2f963f5f2519fdb7c1779be2ca2b3ae8e1128b7d6c627fc4\nmsg = fcc515b294408c8645c9183e3f4ecee5127846d1\nresult = valid\ntag = ecb660e1fb0541ec41e8d68a64141b3a\n\n# tcId = 83\naad = 956846a209e087ed\nct = feca44952447015b5df1f456df8ca4bb4eee2ce2\niv = 376187894605a8d45e30de51\nkey = cdccfe3f46d782ef47df4e72f0c02d9c7f774def970d23486f11a57f54247f17\nmsg = e28e0e9f9d22463ac0e42639b530f42102fded75\nresult = valid\ntag = 082e91924deeb77880e1b1c84f9b8d30\n\n# tcId = 84\naad = ab2ac7c44c60bdf8228c7884adb20184\nct = 43dda832e942e286da314daa99bef5071d9d2c78\niv = 5a86a50a0e8a179c734b996d\nkey = f32364b1d339d82e4f132d8f4a0ec1ff7e746517fa07ef1a7f422f4e25a48194\nmsg = 43891bccb522b1e72a6b53cf31c074e9d6c2df8e\nresult = valid\ntag = c39225",
@@ -3040,9 +3139,9 @@
     "e5563f8f826\nresult = valid\ntag = 20529bff3c59222ec33353af337b1d40\n\n[ivSize = 160]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 208\n# unusual IV size\naad = \nct = 073a5291b11df379f31b4f16\niv = 130c14c839e35b7d56b3350b194b0da342e6b65d\nkey = ef2e299dd4ecd7e3b9cc62780922cc2c89f78840564d1276\nmsg = 03f59579b14437199583270e\nresult = valid\ntag = 17205999491bd4c1d6c7ec3e56779c32\n\n[ivSize = 120]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 209\n# unusual IV size\naad = \nct = fc213602aa423b87d7c2a874\niv = 17ca250fb733877556263223eadde1\nkey = e98b0669a645eb14cd06df6968fc5f10edc9f54feed264e3d410cdc61b72ef51\nmsg = f384b3ed7b274641f5db60cf\nresult = valid\ntag = 36b15bab6923b17218fe1c24048e2391\n\n[ivSize = 160]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 210\n# unusual IV size\naad = \nct = c1d76233e8c5042e92bf8d32\niv = 0f9d6ed7eef362dfa4a7dfa5c0f74c5b27bd4ebf\nkey = 849b3e6b8cdd85bdcfb8eb701aa5522ae2340fbe5214e389622cef76979225c4\nmsg = 8c5564e53051c0de273199b4\nresult = valid\ntag = 7cf036d235d3b2dd349a8c804b65144a\n\n[ivSize = 256]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 211\n# long IV size\naad = \nct = 5348af57fafe2485b43f2bc4\niv = 365e0b96932b13306f92e9bb23847165bcbf5d35e45a83d75c86ecca70131f4c\nkey = 5927bae748bb69d81b5a724e0a165652\nmsg = 316bf99bfafc76f1bfc0b03c\nresult = valid\ntag = 019a96c5373c031626b6c0300d4cf78b\n\n[ivSize = 512]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 212\n# long IV size\naad = \nct = f559b70fe1149cb34406a2c7\niv = 967fa7c990eb2becbd450835e28ea3a9000c7216285cfa7696e8c3dac3ce952a1fe638d7c8c73e1d708dce01b5a20fcc9aa011949d2a835f777423c172fa3aa0\nkey = dbd3676f293409273f27b375e03793a3\nmsg = 625efedb8b7f1aa62238a8f2\nresult = valid\ntag = 94180ddb7bb1995abe0219eab5ce232f\n\n[ivSize = 1024]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 213\n# long IV size\naad = \nct = 5291dd4da91ccc2e77306d83\niv = 494356c3459d60e3a83433c9bcf2c0454a763e496e4ec99bfbe4bbb83a4fda76b542213899dcf5521cd9bbbe5d11545bda44a3f4a681ce2843acea730d83d3930ea30991ee1a68ebf6d1a5a40f9b02a1aab091298df8dd689dc7613bcbff94d35f2ca43377d81618562bcf6573411ec9bc97c5a6276b554054c0fa787073d067\nkey = 7e5a39dcda7e066988f19adf4de4d501\nmsg = b04729b4adbaac63c2aaf8d8\nresult = valid\ntag = a7f7b21a3b7ece509e922647fd905f06\n\n[ivSize = 2056]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 214\n# long IV size\naad = \nct = e3be947153a26a3a54e3015c\niv = 6fd260bba87339539c37dc68fdc3656f63c83028cb8adcb531085e98bd570c6b735d0cc4b4b924696000a2d893621ae64dcce992b562b89a5285643a08febccbc52243cbfc8d45212e047b00c87c6b6bf175f8bb678ec55c1091315cbecb8b85700f4a4653623fb78e63cfff7d6235e48e9832c9f0716d10992fc5b0ad4e6972bbeeb1ad670cd7ec8fac82e07ea5a64f9761a39714aaa73affd2cb190a7ac2df5e5dcea6812ae2c872c7ac70453c5e7ec4d0b5b18c6ff3bfb9ae15fea44cf392615b80034edae596b8821f97fca58d167fb44a093b0c009a0bd5631355b0cb25d93ba9b79b006301d99db657e801933fc2764a0ce650eaf5a1299efe60cb53b634\nkey = eac3f28cd937ff29eb6158a3721b5145\nmsg = 098912a302773377b9c26ac3\nresult = valid\ntag = fd042bdde22f67c4fd298d5dc0867606\n\n[ivSize = 256]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 215\n# long IV size\naad = \nct = 8c2a9823a3b3d413be696387\niv = 36e4b381574d171c7769a788cbc147224fabd8b773f16b8ae84d8f2603aaa440\nkey = 8f9ebc67a9a6430c2b0ceeaf983e1356964bb928635b9ca4\nmsg = a3a96ee94f94caa81ebcd66d\nresult = valid\ntag = faaf01ceb40a7e145e8fe65aa9af58c0\n\n[ivSize = 512]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 216\n# long IV size\naad = \nct = a660ea5bf07a78fea0120173\niv = 90743bd5d794d52ac848b7e2384545a25846acf143be84c0ead0432fcf3172631cf58d0ca78571c03053c1e1b85ed79cb5303d0e3a98ff4f56c4f0a5eb4f0eac\nkey = f4bbdfd06f7fb1434880e4166d38d56e02a3f0df0d5301ce\nmsg = 39d2abe6697f17ec27f2a39c\nresult = valid\ntag = 7404fc7b7354694428236f203c130244\n\n[ivSize = 1024]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 217\n# long IV size\naad = \nct = f400132ff38c04ed747dde34\niv = fbb3eab379c9b8689dc30b0713690e55d51c956ca36fbcc73eeeee16a46d7c41a7a9626e68e25d685c008c19d3b2b1792bdc99c35441a6fcac35e0d6446dd914f543abd9ecd6b0cb5201c243026c4f13641d67c8d8cd5114b6e11ebbc6b1dee2a18db2150a5a575dcd21648e0337dadbccd3deffd6d979e03e6b9ddfee0abdc2\nkey = 1761c77798ef9cdfa40553f34614fe7402212087f0509411\nmsg = 35ca4eb463a2000138210b4d\nresult = valid\ntag = ca1534e7dd0336bbb32a79830c71a447\n\n[ivSize = 2056]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 218\n# long IV size\naad = \nct = 13a95a06c1bed4845af9c701\niv = 3569fca7c9d06e2a03fed1aac2484fd4416ca07d55ecbb333ec674f0ea5c6e75a10dfb9c738b69dab2eda10ada721a61c7f02b7e7f79e8a9e2dc36b3fdf609e436054c82a774ec617dceec84a577037ff1a3f120d9818d042063acb36c9584e81ec94f11f1ee240f2e45e944694a9c8e535acbb01d93958411cff68e3d32f8931746a4a0cece65e93c51c70b3111034b6867b407e0147f97c576d3ed8cec7e8ec26e95643e46e97ea3595c9c3172b4856f2d2b6dc8564666ddac92c794ffb2d4dc7f461761f0e326650f48d327604e095bd8754072116c96360d09f010ac2f39eb96b227f3d738deb756c8699460d88cf716170ae15267b14f4a89164720f1c602\nkey = f795ece7de1881fbc6843eb740f812e41e3fc49ff6c7b940\nmsg = 22dbd8037aa05b14cf81dd23\nresult = valid\ntag = 03379836b0c82f64a1bccdcd763acbbc\n\n[ivSize = 256]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 219\n# long IV size\naad = \nct = a295c2cb27ce23d26874ade1\niv = e826a79361f9d582b64450e3edc82589487853d5b22feaa0c889875bd0d87cd4\nkey = ee4171917d2337496812a2784d6a71300e6b8c1ac3b1ef58cee77c229aeaf2c5\nmsg = 94d2f8697facaaa191ba617a\nresult = valid\ntag = 04650a78bbb61db337c9c32aa3e7b6fa\n\n[ivSize = 512]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 220\n# long IV size\naad = \nct = 9cdcfc3aaa8d466f25588e4b\niv = ec51ee18cfb46897d3666c7df35c29ca5d898241c4a34f893eb1db5d5c6b76e24617459d1153868154437a0e95aa3c26e956b494a52dd5ac3b9331116c7c775f\nkey = 132c59b4bcb8afb31637734a81105bb2c9878f320ace9076d5fd7c5d216c8d12\nmsg = 12c7be00facda49596e19134\nresult = valid\ntag = 7e80f51e7180f1cd3ba84349888fcd5c\n\n[ivSize = 1024]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 221\n# long IV size\naad = \nct = 3f3c151e984d059462f9e5a0\niv = 7d08b226b4a5d03f6f8cb3a3cb8d1ce31b059dc5112385275e38a15c97e0f24022b249a5f7019ea577198cb26ac64e82b2b04681537c4198775a523b0e6494b84febaef3399b35c27b0969fa43572bf5827a763aac1af69526f37e38acb5d354f2b68487f275f4361ed39073f7dd6653ac17c0794118a0cf143293ac0be66229\nkey = 7b0b12491901d62d097fa26dc71e15cfacafa3226719e47126d99c79d98ec222\nmsg = c80312590700c3bbfacd1a40\nresult = valid\ntag = e559f5f755aa292171cc35fbf911a64f\n\n[ivSize = 2056]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 222\n# long IV size\naad = \nct = 5496ae94c3322ebf959ea9a9\niv = 92c2cee7e9138b186da51f146fb21fd5b491f1a19eef61d4ed14ce6b21b04fdb6ff8ebb60fddc55926e7bda2a8f35c610bb795232412739d6c2d74458ef5a1a1cde9bf17e47e3b00db0b0504d56dc8b8d3de23f7c3a5d52e8d0aab1e64405aaa852ec2dd667ed9c1fd8dc1fdbbc8712c7a38f30faeab594f33897b41b1720f3c2f954ed91ca450d82c3dcd35858c608ad42f36832e56b04821a132f72e0da7b62cbd3925250f64fbb3f5c4783495893097adc09a32d776e04bf72558d37830b372341f6536d8ee9df4a82e4074e7774ab6917a04fa8c499eb4b46a92def365da8b5eb1e0b438779507d1f5272a6e8629a3f9c7bd4862c5691ee8b56bfe292deb4e\nkey = 3bc3bf39d0d5ffd94cca2b45c678a2d049151ed2babc713be53cb66f54a16337\nmsg = 8125ee7637d7d0e03bbacf35\nresult = valid\ntag = 70717cc00fd1ffa59bb04329226a0c0a\n\n[ivSize = 0]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 223\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 8f3f52e3c75c58f5cb261f518f4ad30a\nmsg = \nresult = invalid\ntag = cf71978ffcc778f3c85ac9c31b6fe191\nflags = ZeroLengthIv\n\n# tcId = 224\n# 0 size IV is not valid\naad = \nct = 00a29f0a5e2e7490279d1faf8b881c7b\niv = \nkey = 2a4bf90e56b70fdd8649d775c089de3b\nmsg = 324ced6cd15ecc5b3741541e22c18ad9\nresult = invalid\ntag = a2c7e8d7a19b884f742dfec3e76c75ee\nflags = ZeroLengthIv\n\n[ivSize = 0]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 225\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 0b18d21337035c7baa08211b702fa780ac7c09be8f9ed11f\nmsg = \nresult = invalid\ntag = ca69a2eb3a096ea36b1015d5dffff532\nflags = ZeroLengthIv\n\n# tcId = 226\n# 0 size IV is not valid\naad = \nct = 509b0658d09f7a5bb9db43b70c8387f7\niv = \nkey = ba76d594a6df915bb7ab7e6d1a8d024b2796336c1b8328a9\nmsg = d62f302742d61d823ea991b93430d589\nresult = invalid\ntag = 2c9488d53a0b2b5308c2757dfac7219f\nflags = ZeroLengthIv\n\n[ivSize = 0]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 227\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 3f8ca47b9a940582644e8ecf9c2d44e8138377a8379c5c11aafe7fec19856cf1\nmsg = \nresult = invalid\ntag = 17",
     "26aa695fbaa21a1db88455c670a4b0\nflags = ZeroLengthIv\n\n# tcId = 228\n# 0 size IV is not valid\naad = \nct = 7772ea358901f571d3d35c19497639d9\niv = \nkey = 7660d10966c6503903a552dde2a809ede9da490e5e5cc3e349da999671809883\nmsg = c314235341debfafa1526bb61044a7f1\nresult = invalid\ntag = 8fe0520ad744a11f0ccfd228454363fa\nflags = ZeroLengthIv\n\n[ivSize = 8]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 229\n# small IV sizes\naad = \nct = \niv = 80\nkey = 59a284f50aedd8d3e2a91637d3815579\nmsg = \nresult = acceptable\ntag = af498f701d2470695f6e7c8327a2398b\nflags = SmallIv\n\n# tcId = 230\n# small IV sizes\naad = \nct = 0a24612a9d1cbe967dbfe804bf8440e5\niv = 9d\nkey = fec58aa8cf06bfe05de829f27ec77693\nmsg = f2d99a9f893378e0757d27c2e3a3101b\nresult = acceptable\ntag = 96e6fd2cdc707e3ee0a1c90d34c9c36c\nflags = SmallIv\n\n[ivSize = 16]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 231\n# small IV sizes\naad = \nct = \niv = 0f2f\nkey = 88a972cce9eaf5a7813ce8149d0c1d0e\nmsg = \nresult = acceptable\ntag = 4ccf1efb4da05b4ae4452aea42f5424b\nflags = SmallIv\n\n# tcId = 232\n# small IV sizes\naad = \nct = ba3e7f8b2999995c7fc4006ca4f475ff\niv = 8760\nkey = b43967ee933e4632bd6562ba1201bf83\nmsg = 5a6ad6db70591d1e520b0122f05021a0\nresult = acceptable\ntag = 98f47a5279cebbcac214515710f6cd8a\nflags = SmallIv\n\n[ivSize = 32]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 233\n# small IV sizes\naad = \nct = \niv = cc851957\nkey = 4e9a97d3ed54c7b54610793ab05052e1\nmsg = \nresult = acceptable\ntag = e574b355bda2980e047e584feb1676ca\nflags = SmallIv\n\n# tcId = 234\n# small IV sizes\naad = \nct = 1b84baea9df1e65bee7b49e4a8cda1ec\niv = 7b5faeb2\nkey = d83c1d7a97c43f182409a4aa5609c1b1\nmsg = c8f07ba1d65554a9bd40390c30c5529c\nresult = acceptable\ntag = 5c0bb79d8240041edce0f94bd4bb384f\nflags = SmallIv\n\n[ivSize = 48]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 235\n# small IV sizes\naad = \nct = \niv = 4ad80c2854fb\nkey = c6a705677affb49e276d9511caa46145\nmsg = \nresult = acceptable\ntag = 1e2ed72af590cafb8647d185865f5463\nflags = SmallIv\n\n# tcId = 236\n# small IV sizes\naad = \nct = 18291aa8dc7b07448aa8f71bb8e380bf\niv = d1dafc8de3e3\nkey = eba7699b56cc0aa2f66a2a5be9944413\nmsg = d021e53d9098a2df3d6b903cdad0cd9c\nresult = acceptable\ntag = 9c0e22e5c41b1039ff5661ffaefa8e0f\nflags = SmallIv\n\n[ivSize = 8]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 237\n# small IV sizes\naad = \nct = \niv = cb\nkey = c70ce38e84e5f53ed41c3f0d2ca493412ad32cb04c6e2efa\nmsg = \nresult = acceptable\ntag = 08d96edb5e22874cd10cb2256ca04bc6\nflags = SmallIv\n\n# tcId = 238\n# small IV sizes\naad = \nct = 6c5e796ba9a3ddc64f401e68d135101d\niv = 0f\nkey = 74c816b83dfd287210a3e2c6da8d3053bbfbd9b156d3fdd8\nmsg = f2b7b2c9b312cf2af78f003df15c8e19\nresult = acceptable\ntag = 96a132ed43924e98feb888ff682bdaef\nflags = SmallIv\n\n[ivSize = 16]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 239\n# small IV sizes\naad = \nct = \niv = 75e5\nkey = cbf45ba488932aea1a10e5862f92e4a7e277bda9f34af6d0\nmsg = \nresult = acceptable\ntag = 1f0d23070fcd748e25bf6454f5c9136e\nflags = SmallIv\n\n# tcId = 240\n# small IV sizes\naad = \nct = 550b48a43e821fd76f49f0f1a897aead\niv = 8989\nkey = e1c0446f11ae6aa4fa254f9a846fc6e13e45e537e47f2042\nmsg = 3a2f5ad0eb216e546e0bcaa377b6cbc7\nresult = acceptable\ntag = f6e0a979481f9957ddad0f21a777a73a\nflags = SmallIv\n\n[ivSize = 32]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 241\n# small IV sizes\naad = \nct = \niv = 68d7fc38\nkey = 567563bf4cf154902275a53bc57cd6dd7b370d27011bdac8\nmsg = \nresult = acceptable\ntag = 1475563e3212f3b5e40062569afd71e3\nflags = SmallIv\n\n# tcId = 242\n# small IV sizes\naad = \nct = 309133e76159fe8a41b20843486511ab\niv = bb9d2aa3\nkey = 834d0bb601170865a78139428a1503695a6a291ebd747cd1\nmsg = 6f79e18b4acd5a03d3a5f7e1a8d0f183\nresult = acceptable\ntag = 03ab26993b701910a2e8ecccd2ba9e52\nflags = SmallIv\n\n[ivSize = 48]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 243\n# small IV sizes\naad = \nct = \niv = a984bdcdcae2\nkey = 99fb18f5ba430bb9ea942968ecb799b43406e1af4b6425a1\nmsg = \nresult = acceptable\ntag = d7b9a6b58a97982916e83219fbf71b1e\nflags = SmallIv\n\n# tcId = 244\n# small IV sizes\naad = \nct = e08261e46eaf90d978ea8f7889bccd4f\niv = 52aa01e0d0d6\nkey = b77b242aa0d51c92fda013e0cb0ef2437399ace5d3f507e4\nmsg = 4ba541a9914729216153801340ab1779\nresult = acceptable\ntag = c052a55df3926a50990a532efe3d80ec\nflags = SmallIv\n\n[ivSize = 64]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 245\n# small IV sizes\naad = \nct = \niv = d1c61cf8532531b5\nkey = d74599b3d2db81653de43b52fc994c50d0be759fab87c33a\nmsg = \nresult = acceptable\ntag = f94f2049a6560c470b3a7ca7bbc31a3d\nflags = SmallIv\n\n# tcId = 246\n# small IV sizes\naad = \nct = 3c6ec0ab1b827bf238a5384fb7e212ce\niv = 8f075cbcda9831c3\nkey = 0b177198c8b419bf74acc3bc65b5fb3d09a915ff71add754\nmsg = c4b1e05ca3d591f9543e64de3fc682ac\nresult = acceptable\ntag = 7db7402224fd583e312bc0e61cf11366\nflags = SmallIv\n\n[ivSize = 8]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 247\n# small IV sizes\naad = \nct = \niv = a9\nkey = 8f9a38c1014966e4d9ae736139c5e79b99345874f42d4c7d2c81aa6797c417c0\nmsg = \nresult = acceptable\ntag = 2a268bf3a75fd7b00ba230b904bbb014\nflags = SmallIv\n\n# tcId = 248\n# small IV sizes\naad = \nct = 7bea30ecc2f73f8e121263b37966954c\niv = b3\nkey = 144cd8279229e8bb2de99d24e615306663913fe9177fcd270fafec493d43bca1\nmsg = 976229f5538f9636476d69f0c328e29d\nresult = acceptable\ntag = 8bbad4adc54b37a2b2f0f6e8617548c9\nflags = SmallIv\n\n[ivSize = 16]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 249\n# small IV sizes\naad = \nct = \niv = c332\nkey = 7d31861f9d3536e14016a3216b1042e0d2f7d4614314268b6f834ec7f38bbb65\nmsg = \nresult = acceptable\ntag = 1d978a693120c11f6d51a3ed88cd4ace\nflags = SmallIv\n\n# tcId = 250\n# small IV sizes\naad = \nct = 9c39f5b110361e9a770cc5e8b0f444bb\niv = da6c\nkey = 22b35fe9623ee11f8b60b6d22db3765b666ed972fa7ccd92b45f22deee02cab1\nmsg = 5341c78e4ce5bf8fbc3e077d1990dd5d\nresult = acceptable\ntag = b63ff43c12073ec5572b1be70f17e231\nflags = SmallIv\n\n[ivSize = 32]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 251\n# small IV sizes\naad = \nct = \niv = 6b30145e\nkey = c224e0bba3d7a99165f7996b67a0fce3e12f2c01179b197b69b7e628bca92096\nmsg = \nresult = acceptable\ntag = ae6f7c9a29f0d8204ca50b14a1e0dcf2\nflags = SmallIv\n\n# tcId = 252\n# small IV sizes\naad = \nct = f73f72f976a296ba3ca94bc6eb08cd46\niv = 5110604c\nkey = 093eb12343537ee8e91c1f715b862603f8daf9d4e1d7d67212a9d68e5aac9358\nmsg = 33efb58c91e8c70271870ec00fe2e202\nresult = acceptable\ntag = b824c33c13f289429659aa017c632f71\nflags = SmallIv\n\n[ivSize = 48]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 253\n# small IV sizes\naad = \nct = \niv = d4d857510888\nkey = 98e6f8ab673e804e865e32403a6551bf807a959343c60d34559360bc295ecb5b\nmsg = \nresult = acceptable\ntag = 3db16725fafc828d414ab61c16a6c38f\nflags = SmallIv\n\n# tcId = 254\n# small IV sizes\naad = \nct = ed463f4f43336af3f4d7e08770201145\niv = 1bdcd44b663e\nkey = 0bd0e8e7781166e1d876dec8fad34ba95b032a27cac0551595116091005947b7\nmsg = 91222263b12cf5616a049cbe29ab9b5b\nresult = acceptable\ntag = c8fc39906aca0c64e14a43ff750abd8a\nflags = SmallIv\n\n[ivSize = 64]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 255\n# small IV sizes\naad = \nct = \niv = 0d10c5c84b88d688\nkey = 61ba694897925d1b4174d40401469c3ef267cdb9f829edb1a10618c16d666059\nmsg = \nresult = acceptable\ntag = 1311f9f830d729c189b74ec4f9080fa1\nflags = SmallIv\n\n# tcId = 256\n# small IV sizes\naad = \nct = 7e0dd6c72aec49f89cc6a80060c0b170\niv = 04102199ef21e1df\nkey = 115884f693b155563e9bfb3b07cacb2f7f7caa9bfe51f89e23feb5a9468bfdd0\nmsg = 82e3e604d2be8fcab74f638d1e70f24c\nresult = acceptable\ntag = af68a37cfefecc4ab99ba50a5353edca\nflags = SmallIv\n\n",
 };
-static const size_t kLen109 = 140567;
+static const size_t kLen125 = 140567;
 
-static const char *kData109[] = {
+static const char *kData125[] = {
     "# Imported from Wycheproof's chacha20_poly1305_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: CHACHA20-POLY1305\n# Generator version: 0.8r12\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 1\n# RFC 7539\naad = 50515253c0c1c2c3c4c5c6c7\nct = d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116\niv = 070000004041424344454647\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e\nresult = valid\ntag = 1ae10b594f09e26a7e902ecbd0600691\n\n# tcId = 2\naad = \nct = \niv = 4da5bf8dfd5852c1ea12379d\nkey = 80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0\nmsg = \nresult = valid\ntag = 76acb342cf3166a5b63c0c0ea1383c8d\n\n# tcId = 3\naad = bd506764f2d2c410\nct = \niv = a92ef0ac991dd516a3c6f689\nkey = 7a4cd759172e02eb204db2c3f5c746227df584fc1345196391dbb9577a250742\nmsg = \nresult = valid\ntag = 906fa6284b52f87b7359cbaa7563c709\n\n# tcId = 4\naad = \nct = 3a\niv = 99e23ec48985bccdeeab60f1\nkey = cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273\nmsg = 2a\nresult = valid\ntag = cac27dec0968801e9f6eded69d807522\n\n# tcId = 5\naad = 91ca6c592cbcca53\nct = c4\niv = ab0dca716ee051d2782f4403\nkey = 46f0254965f769d52bdb4a70b443199f8ef207520d1220c55e4b70f0fda620ee\nmsg = 51\nresult = valid\ntag = 168310ca45b1f7c66cad4e99e43f72b9\n\n# tcId = 6\naad = \nct = 4d13\niv = 461af122e9f2e0347e03f2db\nkey = 2f7f7e4f592bb389194989743507bf3ee9cbde1786b6695fe6c025fd9ba4c100\nmsg = 5c60\nresult = valid\ntag = 91e8b61efb39c122195453077b22e5e2\n\n# tcId = 7\naad = 88364fc8060518bf\nct = b60d\niv = 61546ba5f1720590b6040ac6\nkey = c8833dce5ea9f248aa2030eacfe72bffe69a620caf793344e5718fe0d7ab1a58\nmsg = ddf2\nresult = valid\ntag = ead0fd4697ec2e5558237719d02437a2\n\n# tcId = 8\naad = \nct = 3cf470\niv = d2ab0abb50a8e9fba25429e1\nkey = bd8ed7fb0d607522f04d0b12d42c92570bccc5ba2486953d70ba2e8193f6225a\nmsg = 201221\nresult = valid\ntag = a27a69c9d7ee84586f11388c6884e63a\n\n# tcId = 9\naad = 6c8cf2ab3820b695\nct = 610925\niv = 94f32a6dff588f2b5a2ead45\nkey = 1c8b59b17a5ceced31bde97d4cefd9aaaa63362e096e863ec1c89580bca79b7a\nmsg = 453f95\nresult = valid\ntag = a8a7883eb7e40bc40e2e5922ae95ddc3\n\n# tcId = 10\naad = \nct = fe6849aa\niv = 7aa5ad8bf5254762171ec869\nkey = e4912cb75a1174345f1a457366f18885fe8460b06478e04be2f7fb4ec9c113e5\nmsg = 9e4c1d03\nresult = valid\ntag = 99ad07871b25c27defc31a541bd5c418\n\n# tcId = 11\naad = 15d93a96d0e6c5a9\nct = f4710e51\niv = b7f526e3fd71cf5720961aec\nkey = e05777ef3d989ace7d2abfba452bfded54801dbd5c66e91c0c2ef00479d85572\nmsg = 17bfda03\nresult = valid\ntag = b957c6a37b6a4c94996c002186d63b2b\n\n# tcId = 12\naad = \nct = f711647ff1\niv = 9447bf85d5b97d8aee0f8e51\nkey = 1a4c4f39abe890e62345c947bcf7de7c2e33bd5ceeda0a0abf0e7ef935ddf3ee\nmsg = c15a593bd0\nresult = valid\ntag = 22b12dc38cb79629f84cdbdc2425c09d\n\n# tcId = 13\naad = 96224835610b782b\nct = d171f046ea\niv = 3dbe876bd880ec8ea2017043\nkey = 800e9a24791700c9609736695ba2a8b99b2d57f1c3bfb61ed49db1c6c5219583\nmsg = a7bfd041e3\nresult = valid\ntag = d179b1b9c4184378df009019dbb8c249\n\n# tcId = 14\naad = \nct = 9351b1b1b082\niv = 27fb58ec6a21e84696cb8830\nkey = 208c2c376c9430433db20e1a6b7ba817f8ffbfa6827f26759ccede42e591d3ec\nmsg = af104b5ccd0e\nresult = valid\ntag = 560785509f60f26b681933d9cdbfd29f\n\n# tcId = 15\naad = 6d52feb2509f7fbf\nct = 41abff7b71cc\niv = b5965470c383fd29fe7eaee7\nkey = 2eb168e53b07ab04355ea792fe11a6be2ce9c39cfe15a997076b1e38c17ad620\nmsg = 6fdf2927e169\nresult = valid\ntag = 9b5174297c03cf8902d1f706fd008902\n\n# tcId = 16\naad = \nct = 5dfe3440dbb3c3\niv = 3c4e654d663fa4596dc55bb7\nkey = 55568158d3a6483f1f7021eab69b703f614251cadc1af5d34a374fdbfc5adac7\nmsg = ab85e9c1571731\nresult = valid\ntag = ed7a434e2602d394281e0afa9fb7aa42\n\n# tcId = 17\naad = 84e46be8c0919053\nct = 4bd47212941ce3\niv = 58389375c69ee398de948396\nkey = e3c09e7fab1aefb516da6a33022a1dd4eb272c80d540c5da52a730f34d840d7f\nmsg = 4ee5cda20d4290\nresult = valid\ntag = 185f1408ee7fbf18f5abad6e2253a1ba\n\n# tcId = 18\naad = \nct = 8e9439a56eeec817\niv = 4f07afedfdc3b6c2361823d3\nkey = 51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152\nmsg = be3308f72a2c6aed\nresult = valid\ntag = fbe8a6ed8fabb1937539dd6c00e90021\n\n# tcId = 19\naad = 66c0ae70076cb14d\nct = b9b910433af052b0\niv = b4ea666ee119563366484a78\nkey = 1131c1418577a054de7a4ac551950f1a053f9ae46e5b75fe4abd5608d7cddadd\nmsg = a4c9c2801b71f7df\nresult = valid\ntag = 4530f51aeee024e0a445a6328fa67a18\n\n# tcId = 20\naad = \nct = d9d897a9c1c5bb9f01\niv = 8092fc245b3326cddbd1424c\nkey = e1094967f86d893cdfe2e2e6d5c7ee4dfef67da3c9c5d64e6ad7c1577dcb38c5\nmsg = c37aa791ddd6accf91\nresult = valid\ntag = 085a430373058f1a12a0d589fd5be68b\n\n# tcId = 21\naad = 8c32f47a386152ec\nct = 8fdb429d47761cbf8e\niv = f1ca81338629587acf9372bf\nkey = 236f9baee4f9da15beeca40ff4af7c760f254a64bc3a3d7f4fad557e61b68586\nmsg = d7f26d5252e1765f5b\nresult = valid\ntag = 8ef647ed334fdebbc2bef80be02884e0\n\n# tcId = 22\naad = \nct = 700d35adf5100a22a1de\niv = 4c15a71dc6791a8c005ad502\nkey = 4de207a3b70c51e5f23048eed5a5da9bb65e917a69aa93e7c8b4a815cd9724de\nmsg = f2c54b6b5e490da18659\nresult = valid\ntag = 102d992ffaff599b5bddddeb2dfb399b\n\n# tcId = 23\naad = e1e27ccddb3cb407\nct = 04aad66c60e0bf8ebba9\niv = 6220527aba88e27f766658b2\nkey = 6d667fd79e5fb725f50343dccc4863227c75ee3f7a578476e3e9f32598d81559\nmsg = 0c8c5a252681f2b5b4c0\nresult = valid\ntag = c15f69a4d2aef97d7748756ff49d894b\n\n# tcId = 24\naad = \nct = 1c3d53baaa36eaa1d8ec4d\niv = ec1e2967f0f6979e5f5b07fb\nkey = 8f4bd94ef73e75d1e068c30b37ead576c5344e093ece1330e9101c82f793cf05\nmsg = b89812b34d9bced4a0ba07\nresult = valid\ntag = 4d94ebf960f12433bec43aa86d7e6e6d\n\n# tcId = 25\naad = a9bc350eaf2e6e3d\nct = 1c8578f8e75203d0336a52\niv = 28cce57a5db2cd206321e340\nkey = 2aa3bc7033351cac51364cdaf6ffac2c20f64046e1550a7b1c65f41800599019\nmsg = 83016823123484b56095b0\nresult = valid\ntag = 5910f7a9d5e4df05d7248bd7a8d65e63\n\n# tcId = 26\naad = \nct = ff7dc203b26c467a6b50db33\niv = 9a59fce26df0005e07538656\nkey = 99b62bd5afbe3fb015bde93f0abf483957a1c3eb3ca59cb50b39f7f8a9cc51be\nmsg = 42baae5978feaf5c368d14e0\nresult = valid\ntag = 578c0f2758c2e14e36d4fc106dcb29b4\n\n# tcId = 27\naad = a506e1a5c69093f9\nct = 9f8816de0994e938d9e53f95\niv = 58dbd4ad2c4ad35dd906e9ce\nkey = 85f35b6282cff440bc1020c8136ff27031110fa63ec16f1e825118b006b91257\nmsg = fdc85b94a4b2a6b759b1a0da\nresult = valid\ntag = d086fc6c9d8fa915fd8423a7cf05072f\n\n# tcId = 28\naad = \nct = e6b33a74a4ac443bd93f9c1b94\niv = b776c3fddba7c81362ce6e1b\nkey = faf4bfe8019a891c74901b17f4f48cee5cd065d55fdea60118aaf6c4319a0ea5\nmsg = 8dadff8d60c8e88f604f274833\nresult = valid\ntag = 0c115172bdb02bbad3130fff22790d60\n\n# tcId = 29\naad = 5a8e1c7aa39810d5\nct = b0a7500aca45bb15f01ece4389\niv = 6d62f159731b140eb18ce074\nkey = 841020d1606edcfc536abfb1a638a7b958e21efc10c386ac45a18493450afd5f\nmsg = d6af138f701b801e60c85ffd5c\nresult = valid\ntag = 0160e83adbec7f6a2ee2ff0215f9ef00\n\n# tcId = 30\naad = \nct = d3017e0bb1705b380b34cc333450\niv = a9ea4d619fe405d04cba7d7a\nkey = 470f9ce3d2250bd60cbbefdb2e6a1178c012299b5590639c7797b6024fa703d8\nmsg = 6ca67dd023fba6507b9f9a1f667e\nresult = valid\ntag = 5708e72ca2bd354f487f82f67fbc3acb\n\n# tcId = 31\naad = eaaaeab26957f9a1\nct = 52e9672b416d84d97033796072d0\niv = 0e23c942a0c9fb526586eead\nkey = e4b97e91e4c8e85eb7ce0a7f30bf8a0abf4468251e4c6386c0e7aacb8e879aa8\nmsg = b84b3f74cd23064bb426fe2ced2b\nresult = valid\ntag = e83839dc1fd9b8b9d1444c40e488d493\n\n# tcId = 32\naad = \nct = 0b29638e1fbdd6df53970be2210042\niv = 68ab7fdbf61901dad461d23c\nkey = 67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb\nmsg = 51f8c1f731ea14acdb210a6d973e07\nresult = valid\ntag = 2a9134087d67a46e79178d0a93f5e1d2\n\n# tcId = 33\naad = 6453a53384632212\nct = 32db66c4a3819d81557455e5980fed\niv = d95b3243afaef714c5035b6a\nkey = e6f1118d41e4b43fb58221b7ed79673834e0d8ac5c4fa60bbc8bc4893a58894d\nmsg = 97469da667d6110f9cbda1d1a20673\nresult = valid\ntag = feae30dec94e6ad3a9eea06a0d703917\n\n# tcId = 34\naad = \nct = e9110e9f56ab3ca483500ceabab",
     "67a13\niv = 2fcb1b38a99e71b84740ad9b\nkey = 59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a\nmsg = 549b365af913f3b081131ccb6b825588\nresult = valid\ntag = 836ccabf15a6a22a51c1071cfa68fa0c\n\n# tcId = 35\naad = 034585621af8d7ff\nct = e4b113cb775945f3d3a8ae9ec141c00c\niv = 118a6964c2d3e380071f5266\nkey = b907a45075513fe8a8019edee3f2591487b2a030b03c6e1d771c862571d2ea1e\nmsg = 55a465644f5b650928cbee7c063214d6\nresult = valid\ntag = 7c43f16ce096d0dc27c95849dc383b7d\n\n# tcId = 36\naad = \nct = 02cc3acb5ee1fcdd12a03bb857976474d3\niv = 45aaa3e5d16d2d42dc03445d\nkey = 3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011\nmsg = 3ff1514b1c503915918f0c0c31094a6e1f\nresult = valid\ntag = d83b7463a2c3800fe958c28eaa290813\n\n# tcId = 37\naad = 9aaf299eeea78f79\nct = 35766488d2bc7c2b8d17cbbb9abfad9e6d\niv = f0384fb876121410633d993d\nkey = f60c6a1b625725f76c7037b48fe3577fa7f7b87b1bd5a982176d182306ffb870\nmsg = 63858ca3e2ce69887b578a3c167b421c9c\nresult = valid\ntag = 1f391e657b2738dda08448cba2811ceb\n\n# tcId = 38\naad = \nct = b621d76a8dacff00b3f840cdf26c894cc5d1\niv = 37270b368f6b1e3e2ca51744\nkey = 37ceb574ccb0b701dd11369388ca27101732339f49d8d908ace4b23af0b7ce89\nmsg = f26991537257378151f4776aad28ae8bd16b\nresult = valid\ntag = e0a21716ed94c0382fa9b0903d15bb68\n\n# tcId = 39\naad = b8373438ddb2d6c3\nct = e0a745186c1a7b147f74faff2a715df5c19d\niv = bfd6ff40f2df8ca7845980cc\nkey = 68888361919bc10622f45df168e5f6a03bd8e884c0611bea2f34c1882ed9832b\nmsg = ff97f2eefb3401ac31fc8dc1590d1a92cbc1\nresult = valid\ntag = 917baf703e355d4d950e6c05fe8f349f\n\n# tcId = 40\naad = \nct = d6e0ed54fccef30bd605d72da3320e249a9cb5\niv = 2343de88be6c7196d33b8694\nkey = 1b35b856b5a86d3403d28fc2103a631d42deca5175cdb0669a5e5d90b2caafc5\nmsg = 21ef185c3ae9a96fa5eb473878f4d0b242781d\nresult = valid\ntag = c68bc6724ec803c43984ce42f6bd09ff\n\n# tcId = 41\naad = cc4efd8364fb114a\nct = 29e54d608237c3c3609dba16e6edf43842d72f\niv = 1af1d90e877e11a496efa3df\nkey = d6484e3973f6be8c83ed3208d5be5cfa06fda72fbfdc5b19d09be3f4e4eba29d\nmsg = 7335ab04b03e706109ec3ee835db9a246ea0ad\nresult = valid\ntag = d3365fdcd506aaaa5368661e80e9d99b\n\n# tcId = 42\naad = \nct = 7fe606652d858f595ec2e706754fa3d933fcc834\niv = 1e7e67be948de7352ffdb727\nkey = 422add37849d6e4c3dfd8020dc6a07e8a249788f3d6a83b9cb4d802362c97542\nmsg = d7f5e611dd3a2750fb843fc1b6b93087310dc87d\nresult = valid\ntag = 78d59235aa5d03a4c32590e590c04d22\n\n# tcId = 43\naad = 956846a209e087ed\nct = 14f707c446988a4903775ec7acec6da114d43112\niv = 376187894605a8d45e30de51\nkey = cdccfe3f46d782ef47df4e72f0c02d9c7f774def970d23486f11a57f54247f17\nmsg = e28e0e9f9d22463ac0e42639b530f42102fded75\nresult = valid\ntag = 987d4b147c490d43d376a198cab383f0\n\n# tcId = 44\naad = \nct = 1003f13ea1329cbb187316f64c3ff3a87cf5b96661\niv = f9d6320d7ce51d8ed0677d3a\nkey = e79dfc6d2fc465b8439e1c5baccb5d8ef2853899fc19753b397e6c25b35e977e\nmsg = 4f543e7938d1b878dacaeec81dce4899974816813b\nresult = valid\ntag = d2323ad625094bec84790d7958d5583f\n\n# tcId = 45\naad = 093053e20261daab\nct = 2d48b0834e9ffe3046103ef7a214f02e8e4d33360e\niv = 50ba1962cdc32a5a2d36e640\nkey = 1d7b8f1d96a1424923aef8a984869d4a777a110990ba465627acf80396c7f376\nmsg = 5d3efd5767f3c12efd08af9a44e028ae68c9eff843\nresult = valid\ntag = d533ad089be229ea606ec0f3fa22eb33\n\n# tcId = 46\naad = \nct = e9917ff3e64bbe1783579375e75ea823976b35539949\niv = c9cc0a1afc38ec6c30c38c68\nkey = dd433e28cfbcb5de4ab36a02bf38686d83208771a0e63dcd08b4df1a07ac47a1\nmsg = 8a3e17aba9606dd49e3b1a4d9e5e42f1742373632489\nresult = valid\ntag = 074a890669b25105434c75beed3248db\n\n# tcId = 47\naad = b2a4e12a19a61c75\nct = db4c700513818972b0dc0e531b1c281ca03e40c60dea\niv = 8ba77644b08d65d5e9f31942\nkey = a60924101b42ac24154a88de42142b2334cf599176caf4d1226f712dd9172930\nmsg = c949957e66439deee4b2ac1d4a6c98a6c527b90f52ab\nresult = valid\ntag = 63f4478bba2af469a7a4dc3b4f141360\n\n# tcId = 48\naad = \nct = b5f14617491fc923b683e2cc9562d043dd5986b97dbdbd\niv = 4b3dca84ecc407f424f281a9\nkey = 1aa42027836965b1e6086fa137f9cf7f1ff48676696829bd281ff81c8ea0a4a9\nmsg = 37252a3eb5c8960f0567e503a9035783b3d0a19a4b9a47\nresult = valid\ntag = 972ce54713c05c4bb4d088c0a30cacd3\n\n# tcId = 49\naad = 413036411af75745\nct = b7ca3879f95140bf6a97b3212218b7bf864a51e5bb0b3e\niv = acad618039b317470d21621b\nkey = 5d40db0cc18ef2e42815d3b6245a466a0b30a0f93e318ac10edde3bf8ad98160\nmsg = 959dde1ef3129b27702c558849e466f2baca1a45bdf4b2\nresult = valid\ntag = fe558fb570145470ea693eb76eb73171\n\n# tcId = 50\naad = \nct = 42f26c56cb4be21d9d8d0c80fc99dde00d75f38074bfe764\niv = e6b1adf2fd58a8762c65f31b\nkey = 0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7\nmsg = 10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111\nresult = valid\ntag = 54aa7e13d48fff7d7557039457040a3a\n\n# tcId = 51\naad = 3e8bc5ade182ff08\nct = 123032437b4bfd6920e8f7e7e0087ae4889ebe7a0ad0e900\niv = 6b282ebecc541bcd7834ed55\nkey = c5bc09565646e7edda954f1f739223dada20b95c44ab033d0fae4b0283d18be3\nmsg = 9222f9018e54fd6de1200806a9ee8e4cc904d29f25cba193\nresult = valid\ntag = 3cf68f179550da63d3b96c2d55411865\n\n# tcId = 52\naad = \nct = 1d218c9f1f9f02f248a6f976a7557057f37d9393d9f213c1f3\niv = abfaf42e0dba884efcf07823\nkey = 9460b3c44ed86e70f3bda66385e1ca10b0c1677ef4f1360532830d17535f996f\nmsg = 5c5cce881b93fb7a1b7939af1ffc5f84d3280ada778cca0953\nresult = valid\ntag = bc88344c6fdc898feed394fb28511316\n\n# tcId = 53\naad = 84cdff939391c022\nct = 9715d344e8d3f3a3eaa98a9cea57c0cd717c6ef5076027c9ec\niv = 85f18ad8ff72cafee2452ab8\nkey = c111d6d5d78a071b15ab37cc8c3819199387ab7c1933aa97b1489f6584ba8e2a\nmsg = 6989c646a10b7c76f4d9f7d574da40e152013cf0dd78f5aa8a\nresult = valid\ntag = 3056ff5ee0aa8636bb639984edb5236b\n\n# tcId = 54\naad = \nct = 9089bbdb8bcfd124e227bf75c4bfe1cba2004a274fc31aa32358\niv = a6f9a8d335fa84c3b27dcd2a\nkey = 8a1b1e699a0c4a3e610b10902daedab1bf1ea0d505c47d7842cbcee0d3b1b6e6\nmsg = ee6a15fc183108f0877e7f2b8a9615f4b3fc36e1c83440f66aad\nresult = valid\ntag = fd2e21c64a019621c68594826cd7b1cd\n\n# tcId = 55\naad = 85073f2edc13d3a1\nct = 796ffb70ab43e7fa79f95583e384524727bb3e47fc45b969f714\niv = ebc19fc9ecb2339908ea3836\nkey = 74b384e6e013ec4172ed7a28a10fb9bb79b4be2a24f6999e3d3caa28e64a8656\nmsg = 3aa9f7372f056e5a0729752d9a37132d6dd07c56792e1c7582a9\nresult = valid\ntag = c3322b4445de5f3c9f18dcc847cc94c3\n\n# tcId = 56\naad = \nct = 49c81d17d67d7ba9954f497d0b0ddc21f3f839c9d2cc198d30bc2c\niv = f3307430f492d2b8a72d3a81\nkey = 77d824795d2029f0eb0e0baab5cfeb32f7e93474913a7f95c737a667a3c33314\nmsg = 0c4179a497d8fdd72796fb725692b805d63b7c718359cf10518aee\nresult = valid\ntag = 50009899e5b2a9726c8f3556cadfbe84\n\n# tcId = 57\naad = 73365f6d80edb1d8\nct = 4c129fc13cbdd9d3fe81ac755bf4fbea2fdd7e0aca0505a6ee9637\niv = 342ada4f0c115124b222df80\nkey = bec5eac68f893951cbd7d1ecd3ee6611130dd9c3f80cddf95111d07d5edd76d1\nmsg = 481433d8b1cd38af4a750e13a64b7a4e8507682b3517595938a20e\nresult = valid\ntag = 9cede1d30a03db5d55265d3648bc40d4\n\n# tcId = 58\naad = \nct = a6fa8f57ddc81d6099f667dd62402b6a5d5b7d05a329298029113169\niv = 9544d41ece0c92ef01cfac2d\nkey = a59c1e13064df8f2b8df77a492b0ca2eae921b52a84b305a3a9a51408a9ecb69\nmsg = 1c35b898821ba55c2617c25df9e6df2a8002b384902186cd69dfd20e\nresult = valid\ntag = bb24e38b31dbbc3e575b9e3ee076af2a\n\n# tcId = 59\naad = 770f6e6e89a3fe8e\nct = fd42cb5cf894f879e3cf751662aaa58a2288cc53548802becaf42359\niv = 829f005e980f0a6e2f983eaa\nkey = 084b5d7365f1a8fec6365939ed741e6ea5893e0318d82ab47500a97d77aaa041\nmsg = 7510016efadc385a71ed689ceb590c8ea9cc1e81b793338bddf5f10c\nresult = valid\ntag = 188329438afe1cd7225d0478aa90c773\n\n# tcId = 60\naad = \nct = 402302b56140c4dcc39774732c55883de124ce4bf0a0261cfa1569e2cf\niv = 4946a0d6adea93b82d4332e5\nkey = 5a7f850a1d9aafa77d59ae1b731965e8aaec6352280fc76a7b5e23ef3610cfe4\nmsg = 3c161d791f624fb0388e808f0f69ed790dbe4cbd089ebac46627bcf01d\nresult = valid\ntag = e830bfe933a96786cff2dd72b82c4bd5\n\n# tcId = 61\naad = f2415377ad283fd8\nct = d052932bad6e6c4f835f02019e52d7ff807dc2a5aac2040883c79dd3d5\niv = 2f90a65e9e48725de6ffc727\nkey = e6d5a4246f6f05618b59c8f9ec3ac8068cc0d3f351c571aa52b09cb251f9c2f6\nmsg = 964fc9e0e8355947aa1c2caadd7b3dbef82a1024e623606fac436ef573\nresult = valid\ntag = 655f93396b4d755dc4475721665fed91\n\n# tcId = 62\naad = \nct = 83f5c77396cabd28dfcc002cba0756d4ea5455e0261d847d5708aac21e8d\niv = a797205a6cacdd7e47a4789d\nkey = 09e822123adbb1ed89b79a58619c64853992f8371d46338712f6c91ab11a68bb\nmsg = 80b71bbe833629841bd3aeaeb9db6123e51d367b436",
     "fe9d2d3454b62cfad\nresult = valid\ntag = 705a05820a21f381d244d40e58d2f16b\n\n# tcId = 63\naad = 200a9c95946ff05c\nct = 209b7539385c8b19ecd0fd8b5011b2996e316f1942064e68edfa363acbcd\niv = 9d8cdf289dddd09afdc1b02f\nkey = 625735fe7f8fc81b0c1edc3d08a78b41268f87a3c68488b674222630c1d587a5\nmsg = 67ae1882d0b1c1b2485bec98115ecf53b9b438deb1d0400531705038873a\nresult = valid\ntag = fa2f454b9fa2608f780f7c6f9b780fe1\n\n# tcId = 64\naad = \nct = 45c7d6b53acad4abb68876a6e96a48fb59524d2c92c9d8a189c9fd2db91746\niv = 04a9be03508a5f31371a6fd2\nkey = 2eb51c469aa8eb9e6c54a8349bae50a20f0e382711bba1152c424f03b6671d71\nmsg = b053999286a2824f42cc8c203ab24e2c97a685adcc2ad32662558e55a5c729\nresult = valid\ntag = 566d3ca10e311b695f3eae1551652493\n\n# tcId = 65\naad = 374618a06ea98a48\nct = 46a80c4187024720084627580080dde5a3f4a11093a7076ed6f3d326bc7b70\niv = 470a339ecb3219b8b81a1f8b\nkey = 7f5b74c07ed1b40fd14358fe2ff2a740c116c7706510e6a437f19ea49911cec4\nmsg = f45206abc25552b2abc9ab7fa243035fedaaddc3b2293956f1ea6e7156e7eb\nresult = valid\ntag = 534d4aa2835a52e72d14df0e4f47f25f\n\n# tcId = 66\naad = \nct = ea29afa49d36e8760f5fe19723b9811ed5d519934a440f5081ac430b953b0e21\niv = 72cfd90ef3026ca22b7e6e6a\nkey = e1731d5854e1b70cb3ffe8b786a2b3ebf0994370954757b9dc8c7bc5354634a3\nmsg = b9c554cbc36ac18ae897df7beecac1dbeb4eafa156bb60ce2e5d48f05715e678\nresult = valid\ntag = 222541af46b86533c6b68d2ff108a7ea\n\n# tcId = 67\naad = 2333e5ce0f93b059\nct = 6dad637897544d8bf6be9507ed4d1bb2e954bc427e5de729daf50762846ff2f4\niv = 262880d475f3dac5340dd1b8\nkey = 27d860631b0485a410702fea61bc873f3442260caded4abde25b786a2d97f145\nmsg = 6b2604996cd30c14a13a5257ed6cffd3bc5e29d6b97eb1799eb335e281ea451e\nresult = valid\ntag = 7b997d93c982189d7095dc794c746232\n\n# tcId = 68\naad = \nct = f5982b601c7a18fc72a65b218c44974dc564d8314cbe6f87fcf6c6cfbe618b34b1\niv = c26c4b3bfdb97ee6b0f63ca1\nkey = 5155dee9aade1cc61ee7e3f92660f7590f5e5ba82f1b59b850e3fa453d2fa6b3\nmsg = 2734e08eff8f5c4f84fa0c207f49c7fd78af1ad5123ff81f83f500edf4eda09edf\nresult = valid\ntag = c43632f55760b5d1ed37556a94d049b5\n\n# tcId = 69\naad = e99698241c599b5f\nct = eaf6810e6ec1cb7a2918856257d1aa3d51a827879146c6337ecf535e9c89b149c5\niv = ad8050dc6d122dce3e5639ed\nkey = 573f08ebbe0cce4ac9618e8c3b224bea0a32f055c6996838a32f527ca3c3b695\nmsg = 668d5e3f95fe030daf432a5fc5837af3a79c81e94b28d8204c5ee262ab3c9908a7\nresult = valid\ntag = a2950c2f394a3466c345f796323c1aa7\n\n# tcId = 70\naad = \nct = fba78ae4f9d808a62e3da40be2cb7700c3613d9eb2c529c652e76a432c658d27095f0eb8f940c324981ea935e507f9\niv = e74a515e7e2102b90bef55d2\nkey = cf0d40a4644e5f51815165d5301b22631f4544c49a1878e3a0a5e8e1aae0f264\nmsg = 973d0c753826bae466cf9abb3493152e9de7819e2bd0c71171346b4d2cebf8041aa3cedc0dfd7b467e26228bc86c9a\nresult = valid\ntag = 8f046956db3a512908bd7afc8f2ab0a9\n\n# tcId = 71\naad = b3e4064683b02d84\nct = a1ffed80761829ecce242e0e88b138049016bca018da2b6e19986b3e318cae8d806198fb4c527cc39350ebddeac573\niv = d4d807341683825b31cd4d95\nkey = 6cbfd71c645d184cf5d23c402bdb0d25ec54898c8a0273d42eb5be109fdcb2ac\nmsg = a98995504df16f748bfb7785ff91eeb3b660ea9ed3450c3d5e7b0e79ef653659a9978d75542ef91c456762215640b9\nresult = valid\ntag = c4cbf0befda0b70242c640d7cd02d7a3\n\n# tcId = 72\naad = \nct = 9a4ef22b181677b5755c08f747c0f8d8e8d4c18a9cc2405c12bb51bb1872c8e8b877678bec442cfcbb0ff464a64b74332cf072898c7e0eddf6232ea6e27efe50\niv = d61040a313ed492823cc065b\nkey = 5b1d1035c0b17ee0b0444767f80a25b8c1b741f4b50a4d3052226baa1c6fb701\nmsg = d096803181beef9e008ff85d5ddc38ddacf0f09ee5f7e07f1e4079cb64d0dc8f5e6711cd4921a7887de76e2678fdc67618f1185586bfea9d4c685d50e4bb9a82\nresult = valid\ntag = 9ff3427a0f32fa566d9ca0a78aefc013\n\n# tcId = 73\naad = 7193f623663321a2\nct = 5fbbdecc34be201614f636031eeb42f1cace3c79a12cffd871ee8e73820c829749f1abb4294367849fb6c2aa56bda8a3078f723d7c1c852024b017b58973fb1e\niv = d31c21aba175b70de4ebb19c\nkey = 97d635c4f47574d9998a90875da1d3a284b755b2d39297a5725235190e10a97e\nmsg = 94ee166d6d6ecf8832437136b4ae805d428864359586d9193a25016293edba443c58e07e7b7195ec5bd84582a9d56c8d4a108c7d7ce34e6c6f8ea1bec0567317\nresult = valid\ntag = 09263da7b4cb921452f97dca40f580ec\n\n# tcId = 74\naad = \nct = d0102f6c258bf49742cec34cf2d0fedf23d105fb4c84cf98515e1bc9a64f8ad5be8f0721bde50645d00083c3a263a31053b760245f52ae2866a5ec83b19f61be1d30d5c5d9fecc4cbbe08fd385813a2aa39a00ff9c10f7f23702add1e4b2ffa31c\niv = 17c86a8abbb7e003acde2799\nkey = fe6e55bdaed1f7284ca5fc0f8c5f2b8df56dc0f49e8ca66a41995e783351f901\nmsg = b429eb80fb8fe8baeda0c85b9c333458e7c2992e558475069d12d45c22217564121588032297eff56783742a5fc22d7410ffb29d66098661d76f126c3c27689e43b37267cac5a3a6d3ab49e391da29cd3054a5692e2807e4c3ea46c8761d50f592\nresult = valid\ntag = 41865fc71de12b19612127ce49993bb0\n\n# tcId = 75\naad = a11c40b603767330\nct = 7545391b51de01d5c53dfaca777909063e58edee4bb1227e7110ac4d2620c2aec2f848f56deeb037a8dced75afa8a6c890e2dee42f950bb33d9e2424d08a505d899563973ed38870f3de6ee2adc7fe072c366c14e2cf7ca62fb3d36bee11685461\niv = 46362f45d6379e63e5229460\nkey = aabc063474e65c4c3e9bdc480dea97b45110c8618846ff6b15bdd2a4a5682c4e\nmsg = ceb534ce50dc23ff638ace3ef63ab2cc2973eeada80785fc165d06c2f5100ff5e8ab2882c475afcd05ccd49f2e7d8f55ef3a72e3dc51d6852b8e6b9e7aece57be6556b0b6d9413e33fc5fc24a9a205ad59574bb39d944a92dc47970d84a6ad3176\nresult = valid\ntag = b70d44ef8c66c5c7bbf10dcadd7facf6\n\n# tcId = 76\naad = \nct = 294a764c03353f5f4f6e93cd7e977480d6c343071db0b7c1f0db1e95b85e6053f0423168a9c7533268db9a194e7665359d14489bc47172a9f21370e89b0bd0e5ef9661738de282572bcc3e541247626e57e75dec0f91ac5c530bd1a53271842996dcd04d865321b1ecb6e7630114fe780291b8dc3e5d0abc8e65b1c5493e9af0\niv = 8a3ad26b28cd13ba6504e260\nkey = d7addd3889fadf8c893eee14ba2b7ea5bf56b449904869615bd05d5f114cf377\nmsg = c877a76bf595560772167c6e3bcc705305db9c6fcbeb90f4fea85116038bc53c3fa5b4b4ea0de5cc534fbe1cf9ae44824c6c2c0a5c885bd8c3cdc906f12675737e434b983e1e231a52a275db5fb1a0cac6a07b3b7dcb19482a5d3b06a9317a54826cea6b36fce452fa9b5475e2aaf25499499d8a8932a19eb987c903bd8502fe\nresult = valid\ntag = f2b974ca0f14fb9f92014bff18573cff\n\n# tcId = 77\naad = 0587af8530ad0547\nct = 2b90b4f3de280c44913d1984bdd5dfa0566c6a14a058659a9b623277b0bb6e82101e79395d12e643f62d9a822bae497907493e4f8213fcf99da8a78fdf867af36bc8b0931c1886b4f0ae5729986494dbd59737e956cd8f226c7c522689d082f023894d54acab0c4d609f3746a67369bb8876008f7fd3dc6681c5fb9d728c5911\niv = 903188433c1ce8971aa19b9d\nkey = 80be86fb6fc49bc73428cab576f6ad72ff6aca04001b8b1c57a7128be73900aa\nmsg = 67ce499cd8ed68bd717dfe61c60f27d260b1c163a72e8cc8597253d3d987c2dbe1bff2e44d9bd4765d3e53d9c3f8eb3b90e751f47c7157bdc1142bc33f5833ac1cd1262cbb239066b334a4ed99ae82c74f2b49540f1a614bc239d8fc5add8c178184e41281f6e66c5c3117fd953547f7c829425b5082aa69686847eaf5784692\nresult = valid\ntag = f005ebe1c1ada75a9cee8d630881d5b8\n\n# tcId = 78\naad = 02\nct = 7e72f5a185af16a611921b438f749f0b\niv = 87345f1055fd9e2102d50656\nkey = 7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c\nmsg = e5ccaa441bc814688f8f6e8f28b500b2\nresult = valid\ntag = 1242c670732334029adfe1c5001651e4\n\n# tcId = 79\naad = b648\nct = 85f29a719557cdd14d1f8fffab6d9e60\niv = 87a3163ec0598ad95b3aa713\nkey = 6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc\nmsg = 02cde168fba3f544bbd0332f7adeada8\nresult = valid\ntag = 732ca32becd515a1ed353f542e999858\n\n# tcId = 80\naad = 8b71ac\nct = d46e8265a8c6a25393dd956bb44397ad\niv = 25b7bdf4a6dcbf7c9a3ec2b3\nkey = 7afa0f59dfcb5ad3a76490c5c804327c8d052be737a60fa8bcbf0a2c36630a43\nmsg = 623e6ba6d3166a338bfcc7af90a230c8\nresult = valid\ntag = e28f3ad9e3ef4a3d94ee07bf538eaafb\n\n# tcId = 81\naad = 3a5ddf40\nct = 2d3cb2d9303491e264f2904f0e0753f4\niv = 6fb0d1417cdfff4df37db08c\nkey = 2ec25b0ec7ac244224e9c7fc2fa5d3ef17809e19fd6e954158dd0d72738a4cc8\nmsg = a1c933768a6d573ebf68a99e5e18dae8\nresult = valid\ntag = 6c1db959362d217b2322b466536bfea0\n\n# tcId = 82\naad = 9eec540bb0\nct = a988c03c71b956ff086d0470d706bd34\niv = 2538fc67afb9eab333f83290\nkey = 0a2cf52371cf9d9f95b10108fc82b4fd6110a8ba9a88a26083685ad29826891a\nmsg = 0d8c691d044a3978d790432dc71d69f8\nresult = valid\ntag = b35d7cbf2beb894b0c746e0730429e15\n\n# tcId = 83\naad = 56e014d97c74\nct = 32bf95d4c195dbaf58d9af4001c6e57d\niv = a071be999151e2a1c41c81e9\nkey = 307e886b38bb18b445f8a2c6d6f8932492a9cea8d041ba72eb5efdfa70d0b8d2\nmsg = 9aba22b495cb7ec887ddaa62019aa14d\nresult = valid\ntag = 4393808703d67a90870578046cd8b525\n\n# tcId = 84\naad = bb5a3812f0aefd\nct = 2a2",
@@ -3062,9 +3161,9 @@
     "fffffffffff025d1565924f6c7418de9babf8be4407ffffffffffffffffffffffffffffffffc35e56b05c9d78eb406fb3f474f36294ffffffffffffffffffffffffffffffffc35e56b05c9d78eb406fb3f474f36294\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 19de9b9ec8b247d42bbee2016d6715babf286fd979807951b183a188930ad15ecef0b056a2eecc51d30838e640615e1464413d71939b9cb0a4d32ef115da9e1021d14da7b4f76f9f68fa8903138d563cdef8a3be837efbea7db940f762861f45\nresult = valid\ntag = 369cf17011cae47539e2723f010cf980\n\n# tcId = 283\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = f9ffffffffffffffffffffffffffffff005d1565924f6c7418de9babf8be4407d2ffffffffffffffffffffffffffffff5541133fd4554a1a89a3216ce40b9d0bd2ffffffffffffffffffffffffffffff5541133fd4554a1a89a3216ce40b9d0b\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 19de9b9ec8b247d42bbee2016d6715babd286fd979807951b183a188930ad15ee3f0b056a2eecc51d30838e640615e14f25e78fe1b53ae416d1fbc698522618f0cd14da7b4f76f9f68fa8903138d563c48e7e6310bb6c91bb475d26ff27ee0da\nresult = valid\ntag = 532eb8e272a8d171378b0d42dff2bed9\n\n# tcId = 284\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = d2ffffffffffffffffffffffffffffff98f82782afd996d0efe3800d48c1ca05ffffffffffffffffffffffffffffffff3a0c9639358f7c6d1ee0dc082de4d96effffffffffffffffffffffffffffffff3a0c9639358f7c6d1ee0dc082de4d96e\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 32de9b9ec8b247d42bbee2016d6715ba258d5d3e441683f546beba2e23755f5ccef0b056a2eecc51d30838e640615e149d13fdf8fa899836fa5c410d4ccd25ea21d14da7b4f76f9f68fa8903138d563c27aa6337ea6cff6c23362f0b3b91a4bf\nresult = valid\ntag = d1be7426cd12446fe52e8d45331e0835\n\n# tcId = 285\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff6b3fa796480ab62f9884dc7dfb4daf88faffffffffffffffffffffffffffffff79858179ae42311dacad2f325a8d3007faffffffffffffffffffffffffffffff79858179ae42311dacad2f325a8d3007\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 1fde9b9ec8b247d42bbee2016d6715bad64add2aa3c5a30a31d9e65e90f93ad1cbf0b056a2eecc51d30838e640615e14de9aeab86144d5464811b2373ba4cc8324d14da7b4f76f9f68fa8903138d563c6423747771a1b21c917bdc314cf84dd6\nresult = valid\ntag = 62630c18de8c10876adb9f30f300963f\n\n# tcId = 286\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff7141e89bc0455e348313475fa4bdb3cbffffffffffffffffffffffffffffffff97d10c4f5c7356f4ef3e5fd79afe6e08ffffffffffffffffffffffffffffffff97d10c4f5c7356f4ef3e5fd79afe6e08\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 1fde9b9ec8b247d42bbee2016d6715bacc3492272b8a4b112a4e7d7ccf092692cef0b056a2eecc51d30838e640615e1430ce678e9375b2af0b82c2d2fbd7928c21d14da7b4f76f9f68fa8903138d563c8a77f9418390d5f5d2e8acd48c8b13d9\nresult = valid\ntag = feb6412b9031f076eddcd9426fff5b31\n\n# tcId = 287\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = d4ffffffffffffffffffffffffffffffcf5e1ff522101a6eade8cd6049b76f0dffffffffffffffffffffffffffffffff20c173ad1d88a70fa8cf4367eef82a8affffffffffffffffffffffffffffffff20c173ad1d88a70fa8cf4367eef82a8a\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 34de9b9ec8b247d42bbee2016d6715ba722b6549c9df0f4b04b5f7432203fa54cef0b056a2eecc51d30838e640615e1487de186cd28e43544c73de628fd1d60e21d14da7b4f76f9f68fa8903138d563c3d6786a3c26b240e9519b064f88d575b\nresult = valid\ntag = dafdf430c8124483c175404b6bff5b41\n\n# tcId = 288\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = ddffffffffffffffffffffffffffffff7817ec25241bcc26c5b27dadbcb12b0f61fa3a21712933597b1da91633f3e64761fa3a21712933597b1da91633f3e647\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 3dde9b9ec8b247d42bbee2016d6715bac5629699cfd4d9036cef478ed705be5650f575882c3800f757ea6e0f8c6d47acc6e551e0be2fd7029fa1341352da1ac3\nresult = valid\ntag = f8800c5b6283dddfc41f935c01bd0d24\n\n# tcId = 289\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = ffffffffffffffffffffffffffffffffdba35e4e633a3c646379bc7f82db98ce07f07c0b2132c73943308806721c542707f07c0b2132c73943308806721c5427\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 1fde9b9ec8b247d42bbee2016d6715ba66d624f288f52941ca24865ce96f0d9736ff33a27c23f4976fc74f1fcd82f5cca0ef17caee342362a78c15031335a8a3\nresult = valid\ntag = 38bfb8318c627d86c34bab1f1ebd0db0\n\n# tcId = 290\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = 14cada5efddb046351f2487c56a6e4f6e5ffffffffffffffffffffffffffffff8558412d1bf9b512930fed3d4b054406e5ffffffffffffffffffffffffffffff8558412d1bf9b512930fed3d4b054406\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = f4ebbe3fca96bc4885b35582c43e0eb3588a85431430eada56a2c5dc944b6aa6b4570e8446e886bcbff82a24f49be5ed42e0943e30f91ba41b4362fa9ed6037b5b76f37550f12572040a9bc1a777edc5\nresult = valid\ntag = af7293eb09957d9de7432dd41316f0e4\n\n# tcId = 291\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = faffffffffffffffffffffffffffffffea6f4576d71568cae5ceee80e97eaf0edbffffffffffffffffffffffffffffffd1d2b02fe01eb32df3f3f0f6dacc4f05dbffffffffffffffffffffffffffffffd1d2b02fe01eb32df3f3f0f6dacc4f05\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 1ade9b9ec8b247d42bbee2016d6715ba571a3fca3cda7def4c93d4a382ca3a57eaf0b056a2eecc51d30838e640615e1476cddbee2f185776174f6df3bbe5b38105d14da7b4f76f9f68fa8903138d563ccc7445213ffd302cce2503f5ccb932d4\nresult = valid\ntag = e178b0d5eb9bc551fa645c49f9f17667\n\n# tcId = 292\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff0344dfbdb8a569b44dfc38ef4c796b50e3ffffffffffffffffffffffffffffff7a8b7d60e12965e60abea0434ec70b07e3ffffffffffffffffffffffffffffff7a8b7d60e12965e60abea0434ec70b07\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 1fde9b9ec8b247d42bbee2016d6715babe31a501536a7c91e4a102cc27cdfe09d2f0b056a2eecc51d30838e640615e14dd9416a12e2f81bdee023d462feef7833dd14da7b4f76f9f68fa8903138d563c672d886e3ecae6e73768534058b276d6\nresult = valid\ntag = bdbf63db237d195ecefdc251f5f17677\n\n# tcId = 293\n# edge case intermediate sums in poly1305.\n# poly_key:dc46b3c53be153ccd4986678ffffffafe484c316c93f64195da65a2742fd3fec\naad = ffffffff\nct = deffffffffffffffffffffffffffffff3812dd4103ddb68f86081010aac51901d3ffffffffffffffffffffffffffffff1c98423cdb89c7e94daa2af16e06d505d3ffffffffffffffffffffffffffffff1c98423cdb89c7e94daa2af16e06d505\niv = 000102030405060703e76f6f\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 3ede9b9ec8b247d42bbee2016d6715ba8567a7fde812a3aa2f552a33c1718c58e2f0b056a2eecc51d30838e640615e14bb8729fd148f23b2a916b7f40f2f29810dd14da7b4f76f9f68fa8903138d563c013eb732046a44e8707cd9f27873a8d4\nresult = valid\ntag = b4ccb422bc5f7264aff73f3675ff5b19\n\n[ivSize = 0]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 294\n# invalid nonce size\naad = \nct = \niv = \nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 64]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 295\n# invalid nonce size\naa",
     "d = \nct = \niv = 0001020304050607\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 88]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 296\n# invalid nonce size\naad = \nct = \niv = 000102030405060708090a\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 104]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 297\n# invalid nonce size\naad = \nct = \niv = 000102030405060708090a0b0c\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 112]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 298\n# invalid nonce size\naad = \nct = \niv = 000102030405060708090a0b0c0d\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 128]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 299\n# invalid nonce size\naad = \nct = \niv = 000102030405060708090a0b0c0d0e0f\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 160]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 300\n# invalid nonce size\naad = \nct = \niv = 000102030405060708090a0b0c0d0e0f10111213\nkey = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = \n\n",
 };
-static const size_t kLen110 = 232513;
+static const size_t kLen126 = 232513;
 
-static const char *kData110[] = {
+static const char *kData126[] = {
     "# Imported from Wycheproof's dsa_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: DSA\n# Generator version: 0.8r12\n\n[key.g = 0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d]\n[key.keySize = 1024]\n[key.p = 00b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f]\n[key.q = 00b90b38ba0a50a43ec6898d3f9b68049777f489b1]\n[key.type = DsaPublicKey]\n[key.y = 173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6]\n[keyDer = 308201b63082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818400028180173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6]\n[sha = SHA-1]\n\n# tcId = 1\n# Legacy:ASN encoding of r misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 302c0214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\nflags = NoLeadingZero\n\n# tcId = 2\n# valid\nmsg = 313233343030\nresult = valid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 3\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30812d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 4\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 5\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 7\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 8\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 9\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 10\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 11\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 12\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 13\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 14\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 302d028000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0280496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 17\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 18\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 19\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 20\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f0000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 21\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 22\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0500\n\n# tcId = 23\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032498177302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30312500302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032221a498177021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303122192500021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30352217021500aa6a258fbf7d90e15614676d377df8b10e38db4a0004deadbeef0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a22194981770214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221825000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a22160214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef\n\n# tcId = 32\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035aa00bb00cd00302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3033aa02aabb302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035221daa00bb00cd00021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = i",
     "nvalid\nsig = 3033221baa02aabb021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a221caa00bb00cd000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3033021500aa6a258fbf7d90e15614676d377df8b10e38db4a221aaa02aabb0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 38\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 39\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30312280021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 42\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30312280031500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800314496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 45\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 46\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 322d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 51\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 52\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 3031300102302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 53\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 55\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 56\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b00\n\n# tcId = 57\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b05000000\n\n# tcId = 58\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b060811220000\n\n# tcId = 59\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000fe02beef\n\n# tcId = 60\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0002beef\n\n# tcId = 61\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f3000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 62\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b3000\n\n# tcId = 63\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 3030021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3bbf7f00\n\n# tcId = 64\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 65\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 3017021500aa6a258fbf7d90e15614676d377df8b10e38db4a\n\n# tcId = 66\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 3043021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 67\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302e02811500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a028114496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 69\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 302f0282001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 70\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02820014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 71\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021600aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021400aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 75\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30320285010000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a02850100000014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 77\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3036028901000000000000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3036021500aa6a258fbf7d90e15614676d377df8b10e38db4a0289010000000000000014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 79\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 303102847fffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 80\n# length of integer = 2**",
     "31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a02847fffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 81\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30310284ffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a0284ffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 83\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30320285ffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a0285ffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 85\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30350288ffffffffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a0288ffffffffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 87\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d02ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02ff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 89\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 30160214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 90\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 3017020214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 3018021500aa6a258fbf7d90e15614676d377df8b10e38db4a02\n\n# tcId = 92\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 94\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f0217000000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02160000496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 96\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 97\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a05000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0500\n\n# tcId = 99\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 301802810214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0281\n\n# tcId = 101\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 301805000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0500\n\n# tcId = 103\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d011500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d031500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d041500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 107\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302dff1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 108\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 109\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0114496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 110\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0314496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 111\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0414496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 112\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4aff14496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 113\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 301802000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0200\n\n# tcId = 115\n# using composition for integer\nmsg = 313233343030\nresult = invalid\nsig = 303122190201000214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 116\n# using composition for integer\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221802014902136d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 117\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021502aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 118\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02144b6d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 119\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38dbca0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 120\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964cbb\n\n# tcId = 121\n# truncated integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021400aa6a258fbf7d90e15614676d377df8b10e38db0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 122\n# truncated integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c\n\n# tcId = 123\n# truncated integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a02136d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 124\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 302e0216ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 125\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215ff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 126\n# replaced integer by infinity\nmsg = 313233343030\nresult = invalid\nsig = 30190901800214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 127\n# replaced integer by infinity\nmsg = 313233343030\nresult = in",
@@ -3095,9 +3194,9 @@
     "= 54657374\nresult = invalid\nsig = 3008090380fe01020101\nflags = EdgeCase\n\n# tcId = 881\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008090380fe010201ff\nflags = EdgeCase\n\n# tcId = 882\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae\nflags = EdgeCase\n\n# tcId = 883\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af\nflags = EdgeCase\n\n# tcId = 884\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c\nflags = EdgeCase\n\n# tcId = 885\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\nflags = EdgeCase\n\n# tcId = 886\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\nflags = EdgeCase\n\n# tcId = 887\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d0100000000000000000000000000000000000000000000000000000000\nflags = EdgeCase\n\n# tcId = 888\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010a090380fe0102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\nflags = EdgeCase\n\n# tcId = 889\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 300a090380fe01090380fe01\nflags = EdgeCase\n\n# tcId = 890\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008090380fe01090142\nflags = EdgeCase\n\n# tcId = 891\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 30060201010c0130\n\n# tcId = 892\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 30050201010c00\n\n# tcId = 893\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 30090c0225730c03732573\n\n# tcId = 894\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 30080201013003020100\n\n# tcId = 895\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 3003020101\n\n# tcId = 896\n# Signature encoding contains wrong type.\nmsg = 54657374\nresult = invalid\nsig = 3006020101010100\n\n# tcId = 897\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303c021c296410b8cb6200edafd1205e7377a09ad2011ac7b15b8bc9b9b4c6db021c25ca283c868dc2a5ce86aafcf681ce21d660b461da48270f15b53889\n\n# tcId = 898\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303d021c347c4f6875bf4476afbdd6b2b1f9e35c870e785e708e661109bd068e021d00b0b908a617d3ad6c8bc277f397095c00e659c86ca7c600090571ab17\n\n# tcId = 899\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303c021c3c76bc6f17369414d4c21c5361ed0cca6e79f73f90706f1f7ca9f05a021c3cc60d8a0d44fb967baa0e5621e12cd434aafd748cba3e7cdc733b2f\n\n# tcId = 900\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303e021d0086a5efea8e6a8033b8a0034b52ae614e1f14fbcbfa0bb50194efa6a7021d00b3d66f6d2b10cfe62fe96b78fcf41ca7b442aceb98ab109a01409e4a\n\n# tcId = 901\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303d021c16727d52bd711e9a63e0dd2c4db045cfb993942b1e39e4f43a65c11a021d009fb9c02d10c968e75bb15acab8467f30b84481f679e136e8af65a266\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DsaPublicKey]\n[key.y = 00848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827]\n[keyDer = 308203433082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde03820106000282010100848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827]\n[sha = SHA-256]\n\n# tcId = 902\n# r,s = 1,1\nmsg = 54657374\nresult = valid\nsig = 3006020101020101\n\n# tcId = 903\n# r,s = 1,5\nmsg = 54657374\nresult = valid\nsig = 3006020101020105\n\n# tcId = 904\n# u2 small\nmsg = 54657374\nresult = valid\nsig = 3022020101021d009592121ed12d93197f1ffb863ac63937f28ef4f62f1e009a30aabab1\n\n# tcId = 905\n# s == q-1\nmsg = 54657374\nresult = valid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296d",
     "a887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DsaPublicKey]\n[key.y = 629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b]\n[keyDer = 308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde038201050002820100629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b]\n[sha = SHA-256]\n\n# tcId = 906\n# s == 1\nmsg = 54657374\nresult = valid\nsig = 3021021c5a252f4fc55618747fd94b13c9bee62bb958d85777cb07dd90710d24020101\n\n",
 };
-static const size_t kLen111 = 133793;
+static const size_t kLen127 = 133793;
 
-static const char *kData111[] = {
+static const char *kData127[] = {
     "# Imported from Wycheproof's ecdh_secp224r1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDH\n# Generator version: 0.8r12\n\n[curve = secp224r1]\n[encoding = asn]\n\n# tcId = 1\n# normal case\nprivate = 565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328\npublic = 304e301006072a8648ce3d020106052b81040021033a00047d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc719b01d050dfbe653e72f39491be87fb1a2742daa6e0a2aada98bb1aca\nresult = valid\nshared = b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f\n\n# tcId = 2\n# compressed public key\nprivate = 565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328\npublic = 3032301006072a8648ce3d020106052b81040021031e00027d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc71\nresult = acceptable\nshared = b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f\nflags = CompressedPoint\n\n# tcId = 3\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004e73a6ca72f3a2fae6e0a01a0ed03bfa3058b04576942eaf063095e62ca16fd31fa0f38eeb592cbeea1147751fdd2a5b6cc0ead404467a5b6\nresult = valid\nshared = 00000000000000000000000000000000000000000000000000000003\n\n# tcId = 4\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00045763fa2ae16367ad23d471cc9a52466f0d81d864e5640cefe384114594d9fecfbed4f254505ac8b41d2532055a07f0241c4818b552cbb636\nresult = valid\nshared = 00000000000000000000000100000000000000000000000000000001\n\n# tcId = 5\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004142c1fd80fa2121a59aa898144084ec033f7a56a34eee0b499e29ae51c6d8c1bbb1ef2a76d565899fe44ffc1207d530d7f598fb77f4bb76b\nresult = valid\nshared = 00000000000000ffffffffffffff0000000000000100000000000000\n\n# tcId = 6\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ed6f793e10c80d12d871cf8988399c4898a9bf9ffd8f27399f63de25f0051cdf4eec7f368f922cfcd948893ceca0c92e540cc4367a99a66a\nresult = valid\nshared = 00000000ffffffffffffffff00000000000000010000000000000000\n\n# tcId = 7\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a000408fcfc1a63c82860be12e4137433dfc40be9acdd245f9a8c4e56be61a385fc09f808383383f4b1d0d5365b6e5dcfacdc19bc7bcfed221274\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff\n\n# tcId = 8\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004d883ed77f1861e8712800d31df67888fe39f150c79a27aa88caeda6b180f3f623e2ff3ab5370cf8179165b085af3dd4502850c0104caed9a\nresult = valid\nshared = 0003fffffff00000003fffffff00000003fffffff000000040000000\n\n# tcId = 9\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00042b8b279b85ee3f3d2c0abeb36fdfc5aad6157d652d26489381a32cd73224bd757ef794acc92b0b3b9e7990618bb343a9a09bdb9d3616eff6\nresult = valid\nshared = 01fffffffc00000007fffffff00000001fffffffc000000080000001\n\n# tcId = 10\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00048bd5f03391eeeae1744e8fc53d314efffafa4d3fa4f1b95c3388a9cd7c86358b273119c537133eb55e79c6ac510b10980b379b919ccf2e2f\nresult = valid\nshared = 0a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf41\n\n# tcId = 11\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ce9631b6a16227778625c8e5421ae083cdd913abefde01dbe69f6c2b95386aff2b483b2c47151cfaabfd000614c683ce2e1778221ae42c1b\nresult = valid\nshared = 62989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39\n\n# tcId = 12\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00041f441c98eda956a6a7fdbfd8d21910860ab59d16c3e52f8e7fad6ca5df61a55fc508fc0499c55492f1e87bb2faa0cb4170b79f3a85ec2f3d\nresult = valid\nshared = 661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3\n\n# tcId = 13\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004be74583cb9d3a05ae54923624e478a329a697d842dfae33141c844d7d9ba4fc96e0fe716ac0542e87368662fc2f0cb9b0ae57936ddec7190\nresult = valid\nshared = 6d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c\n\n# tcId = 14\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a281ad992b363597ac93ff0de8ab1f7e51a6672dcbb58f9d739ba430ce0192874038daefc3130eec65811c7255da70fea65c1003f6892faa\nresult = valid\nshared = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 15\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004be3e22133f51203f631b81dde8c020cdea5daa1f99cfc05c88fad2dc0f243798d6e72d1de9e3cdca4144e0a6c0f2a584d07589006972c197\nresult = valid\nshared = fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001\n\n# tcId = 16\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004af14547c20afbd91bfe64ea03d45a76a71241f23520ef897ff91eff1b54ca6ca8c25fd73852ec6654617434eff7f0225684d4dea7a4f8a97\nresult = valid\nshared = ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 17\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004b1e484925018729926acda56ff3e2f6c1e7e8f162b178d8e8afb45564fceaa6da5d998fe26b6b26a055169063a5ab6908852ca8b54e2de6c\nresult = valid\nshared = fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff\n\n# tcId = 18\n# edge case for shared secret\nprivate = 00a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004937eb09fb145c8829cb7df20a4cbeed396791373de277871d6c5f9cc3b5b4fd56464a71fc4a2a6af3bd251952bffa829489e68a8d06f96b6\nresult = valid\nshared = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 19\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000000000000000000000000000000000000037cac269c67bd55ea14efff4eadefe5e74978514af14c88fab46ec046\nresult = valid\nshared = 3fa0b9ff70b884f9f57bb84f7a9532d93f6ba803f89dd8ff008177d7\n\n# tcId = 20\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000001000000000000000000000000000000012ea2f4917bdfdb008306cc10a18e2557633ba861001829dcbfb96fba\nresult = valid\nshared = be1ded8cb7ff8a585181f96d681e31b332fe27dcae922dca2310300d\n\n# tcId = 21\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000400000000000000ffffffffffffff000000000000010000000000000073ca5f8f104997a2399e0c7f25e72a75ec29fc4542533d3fea89a33a\nresult = valid\nshared = a2e86a260e13515918a0cafdd87855f231b5624c560f976159e06a75\n\n# tcId = 22\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000400000000ffffffffffffffff000000000000000100000000000000006fe6805f59b19b0dd389452a1d4a420bfeb6c369cf6fed5b12e6e654\nresult = valid\nshared = 31ef7c8d10404a0046994f313a70574b027e87f9028eca242c1b5bf5\n\n# tcId = 23\n# edge cases for ephemeral key\nprivate = 2bc15",
     "cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff77c5cfa4e2c384938d48bd8dd98f54c86b279f1df8c0a1f6692439c9\nresult = valid\nshared = d1976a8ef5f54f24f5a269ad504fdca849fc9c28587ba294ef267396\n\n# tcId = 24\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00040003fffffff00000003fffffff00000003fffffff00000004000000001f0828136016bb97445461bc59f2175d8d23557d6b9381f26136e3d\nresult = valid\nshared = ce7890d108ddb2e5474e6417fcf7a9f2b3bd018816062f4835260dc8\n\n# tcId = 25\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000401fffffffc00000007fffffff00000001fffffffc0000000800000012d8acca6f199d4a94b933ba1aa713a7debde8ac57b928f596ae66a66\nresult = valid\nshared = 30b6ff6e8051dae51e4fe34b2d9a0b1879153e007eb0b5bdf1791a9c\n\n# tcId = 26\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00040a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf413d4df973c563c6decdd435e4f864557e4c273096d9941ca4260a266e\nresult = valid\nshared = 77ec668a00f72d85aa527624abb16c039fe490d17dd6c455a1ed7fd8\n\n# tcId = 27\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000462989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39389ee9436d616cab90032931aa7fbbfcfc13309f61e2423cc8dab93c\nresult = valid\nshared = a3f432f6aba9a92f49a5ea64ffe7059a9d9b487a0b5223ddc988208b\n\n# tcId = 28\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3103b8040e3cb41966fc64a68cacb0c14053f87d27e8ed7bf2d7fe51b\nresult = valid\nshared = 1530fd9caf03737af34a4ba716b558cbecbc35d18402535a0a142313\n\n# tcId = 29\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00046d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c276cf273d75d367820dd556182def0957af0a314f48fed227c298dc0\nresult = valid\nshared = cfc39ccacb94ad0e0552b2e47112f60fbbe7ae0dc32230b9273dd210\n\n# tcId = 30\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff7d8dbca36c56bcaae92e3475f799294f30768038e816a7d5f7f07d77\nresult = valid\nshared = 73bd63bd384a0faafb75cfed3e95d3892cbacf0db10f282c3b644771\n\n# tcId = 31\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800174f1ff5ea7fbc72b92f61e06556c26bab84c0b082dd6400ca1c1eb6d\nresult = valid\nshared = 85b079c62e1f5b0fd6841dfa16026e15b641f65e13a14042567166bb\n\n# tcId = 32\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0126fdd5fccd0b5aa7fd5bb5b1308584b30556248cec80208a2fe962\nresult = valid\nshared = 8a834ff40e3fc9f9d412a481e18537ea799536c5520c6c7baaf12166\n\n# tcId = 33\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff20cfa23077acc9fbcb71339c65880cd0b966b8a9497e65abed17f0b5\nresult = valid\nshared = a0887269766e6efcbc81d2b38f2d4638663f12377468a23421044188\n\n# tcId = 34\n# edge cases for ephemeral key\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1c05ac2d4f10b69877c3243d51f887277b7bf735c326ab2f0d70da8c\nresult = valid\nshared = c65d1911bc076a74588d8793ce7a0dcabf5793460cd2ebb02754a1be\n\n# tcId = 35\n# point with coordinate y = 1\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a00043b5889352ddf7468bf8c0729212aa1b2a3fcb1a844b8be91abb753d500000000000000000000000000000000000000000000000000000001\nresult = valid\nshared = e973c413cc7dd34d4e3637522b2e033c20815412b67574a1f2f6bdd7\n\n# tcId = 36\n# point with coordinate y = 1\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004bf09e268942555c73ce9e00d272c9b12bf0c3fc13a639acc791167f6b05df0023c9bd41d0b0c461854582d0601182213f2219d44ea44914a\nresult = valid\nshared = ec856e807808a9c5332e886759e03f01be02437cfe0214613e4e7dc7\n\n# tcId = 37\n# point with coordinate y = 1\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a00047b664cff2eef0a4f7dce24780113432f66feb25cb0931d033d63910f548ee514f6fdf1cb6f5709581c197d76a5eb218afaed19f205f4ab80\nresult = valid\nshared = 91d424e122c9c01720bbed6b53ec1b37a86996fa4fcf74bfd30f723d\n\n# tcId = 38\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a00045a2b3ec1053390550b587557712bcc0bf85654d23099420154877ec4138322ca02e5fceae870227a43ae8982b67276f6d8f1dd7e12692474\nresult = valid\nshared = 012879a1ff456acb8726455836bc4f504c1bd799a4d96f514b3730c6\n\n# tcId = 39\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004fc229bb1df3e11351e7e4224f68f40c0d0e194023c6e0840cd45ee5ca242112fbab5736e821dad26493e4006e2c6125342e7d9bc25272856\nresult = valid\nshared = fd6e5edb54d7dd554f8747ec87b8031258fc0bf1d2404b64db4540d4\n\n# tcId = 40\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a000469a65f62d4159235801a246f2d13e45c8983a3362da480e7a51d42a65b7047abfc2a179d943bb196fede7ac3ad8a4fcacd4c4caa717b6b26\nresult = valid\nshared = 164e95bfa2a9c3a1f959feb88720bb7a37f988a08124639d8adf86df\n\n# tcId = 41\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004dc68eb945528af0051cbf23e3eea43b2bc4c728976231e7031e63a2744ba65a4e1e34e8ec50cf7e8df4458582b16413ab83f568508c59037\nresult = valid\nshared = b0ffd55fa112aa48eddc960db4a1200d406e144aac9e109ad9892b2d\n\n# tcId = 42\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a000481c89369d7be252920e08e2d6c6841b887efb4fc747db31dd1030b1919bf8ccb629b58fea6234e39812083fb0833a0c937e348eda22ea0c0\nresult = valid\nshared = d6ab4567eff21277284be082d9e09eb08bb80685f4929dc3dca4b333\n\n# tcId = 43\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a000451d830f792795409f1ee972d3b94289f59206fe09e12166920739a73d2f1831b26677901bfaf8323f82b81e1012d9d3f1c9296c59c97970f\nresult = valid\nshared = b43de12912b40cbdd56e30fdfe9a2c24fb72687168c9cfe6b7476966\n\n# tcId = 44\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ab63ce55145842149f99023f37a0a89b9fc4ae6a878fdae8caf31d17ffd0d55830eed46f8255f94b6dcf98a22f1ff26dabf773d556788881\nresult = valid\nshared = 588ee0af3bc60118a715325c6d56c850f73067dcb37b7596d0cfda5f\n\n# tcId = 45\n# point with coordinate y = 1 in left to",
     " right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a00041d64535d54bfcccb38165acbfac01ae33db20e802c5687343cb21b7eb59d86f1892a974741925624477eef21f4e72fa04ee6ce35dfffe5f2\nresult = valid\nshared = 7219ef73ac9e47ac2e03dead23fa8382ae898e2415017cdeb4739f0f\n\n# tcId = 46\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004d9d78436a3f9c1fa20e8c2318e61e62b94623e23a0ab746c5ac0cbc38262bd66c17515d3048944dae43b2bd6dd9d7c7a0f7042de2d1001c6\nresult = valid\nshared = 267b069aac5d768a720acc62c92f20b786fc48c7da42f1f5677424ee\n\n# tcId = 47\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a000465eb3750c6401339caa69ebe6dec86dfc4d79bf657d68bbdd082c5a03eb81e85931352ff338ccbc3a1d332e2d8bc84342d516da06bef220f\nresult = valid\nshared = bbdd4ac5890b9c0412e4ef3135f666e5b3ddb658ec837691e8129be8\n\n# tcId = 48\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004e92d3be1614555ae17a90647979fbb37468c55a1fff9e15f376d49994e470f515b7b3fe50cb55def16142df594c3e46d9d1354730778f9e8\nresult = valid\nshared = f793ff0d14bd7690840c733162b589cd3413d8c41f4488b427da496f\n\n# tcId = 49\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a00043c92710c9a7f6f98bbec9d2a4fa617cc70e96bc96ecd4597e329143f4750a027c6972459c091ab02c0e2a3082fccec429a38d3596e7aff2b\nresult = valid\nshared = 56c703d4716239c954109b9b841db75b04a790f1f72aa966aece3494\n\n# tcId = 50\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004568dfbfa42efc94ce207322e637b4c94f37a5668ad230e987a91d048dcadd244fc059cffab5fa8820a969353620e708e85bd5eec8a0c68ec\nresult = valid\nshared = 7823fe7eb642d50984fb32f911ef289419d85330c3398423d0eda05f\n\n# tcId = 51\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ec10837e495b644904dba58d8dd82133c905a285ae7c2a06d5ccaf6bf0fbf00d13e21a399dc95ae5524a1a37044193e94e3300259b70e058\nresult = valid\nshared = f7014d38f460836a51075cce9667b56b8851ba19011c8b0274b74a4b\n\n# tcId = 52\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004bee2f9352f42ceeb3bf3109e90e6578d0bd4888458df7d179d746977e50e53503dee83eca1824a290566588fa3591645b1a2d56861bda760\nresult = valid\nshared = 777f99f2bdaa72a1185388465ddda1d059872ad043c7cb85b94e28bb\n\n# tcId = 53\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a0004546facbcaa8b551c51715a9add5edc3c8a66dcc47a6223f605614cf7af6d92f5bdebea738658a42c6231e53c08237ccf52f79399579b2dcc\nresult = valid\nshared = a1db178b716e51e0fa46c1d74a2603005326bca7e81170d4b33a3d2a\n\n# tcId = 54\n# point with coordinate y = 1 in left to right addition chain\nprivate = 00938f3dbe37135cdbdb9993a187a0e9b9f0def035fbc52ad59fc50421\npublic = 304e301006072a8648ce3d020106052b81040021033a000423b1811fee891adb33c8bfee289964e92a9d3358daf975d0efb73e229a3332668b7d6da290a2edc941e8bd6f2e33745fc606756eddc013bb\nresult = valid\nshared = f455c8273416199505019861266ddb9bcde7bee3c3f15a98ee54607b\n\n# tcId = 55\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a000458f53d67332415fe5b4b81999f8332fb6dcdb965d96dbcbab0fac375f29efef7ab4d94bb2d25d25205eae29fe8d9a85b811114a50f6c6859\nresult = valid\nshared = d3af1857aca1689514fcfee8d8c40b8637d40452ae35c404f9e67494\n\n# tcId = 56\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004f2d6e58fcd3ed3f656a9bc687fe4c789ba9614d0359967bc0468eabfa1658a14ef0633f2485e29141e2c4a13bd328ec9bf6af4c7a774131b\nresult = valid\nshared = 933c385d5fadb57de53e4a5d385118fce830430703c3f585a5d4d0b5\n\n# tcId = 57\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a000402ca5d1b7638b7b88ad02176bd10ff1cfe8812a62f9769a6d62e0c6c787b3e3b2a063940911bf987fc38deebf542400b8bbd9dfeb7d90a8a\nresult = valid\nshared = 75aea79d99e5c7edaab0284443b548843371d1d9b55f2d73a1a9092f\n\n# tcId = 58\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a394d8bf9b479ec3c7ac3fc6a631d01d57d338b9fb5a0ed6e5130e050cfc600cfb08e67727ac5a33345ec1d48d4a9a18516c2203acbd2667\nresult = valid\nshared = 8c1d0850691cda7523ffccf1cba44b4d472193e6a3bb0727e490a8b5\n\n# tcId = 59\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004642e26421e96fa88f956d098ac26f02f1d6faa80e460e701a3789a66c38dd95c6b33de8768c85cbe6879d0d77e29fe5a18b26a35cb60c0b6\nresult = valid\nshared = 50b9ed4d99e2f24e0096eaeded0b552cf8deff5ca8f976964ae47e92\n\n# tcId = 60\n# point with coordinate y = 1 in precomputation or right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004f974d1cbbf4171d4773c3e84eab80bc3c6c2858dadcfbd11d64316905df36fbe345f28a3ef663125649474c6fc1ebe175c3865c4469e192b\nresult = valid\nshared = 5616ee3e63dfb424d329c2b9b50cf378bb77a8bd7e314a241b5942c7\n\n# tcId = 61\n# point with coordinate y = 1 in right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a000455561db3cc8fb08a71654ee9573a1a36a44f0913ca8ad7582cfafbfc62b31e5e78be98ad8c8ceab4bb82e8efc0acb29f1a8d031ed044046c\nresult = valid\nshared = b1da14507b5c05159e15f77d085c017acd89f158011357a97802855d\n\n# tcId = 62\n# point with coordinate y = 1 in right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a363bcb9bddd5de84a2f4433c039f7be3fce6057b0d3b4a3459e54a2ba32302871e7ba5c3dd7ec9b76946cdc702c15a8d9ec0f4a04e7afb6\nresult = valid\nshared = 2f1bd4a5a497481c4a21222320ff61f32674a95d540cc3f4f3ca5849\n\n# tcId = 63\n# point with coordinate y = 1 in right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a00043a656d0e25bce27282f256b121fbfcde0a180ccd7aa601a5929fc74002f89e45b4dcb873c56da5d1a28fbca33a126177b217a098e0952e62\nresult = valid\nshared = 8c807d65ba7b9fd3061dffef26c025a89524a26b942edd3a984fe51d\n\n# tcId = 64\n# point with coordinate y = 1 in right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004bf5f49ba0086eec289b068b783438ef24b6f28130bb1ed969ef8b041f11b0de95f15edcd835f01bab1f5faaa1749c2ca4f16a7d99d916ff4\nresult = valid\nshared = 8fda76f4d124e6727f855e5f4921cc05c48e2a8ed0fee7c75d6a8047\n\n# tcId = 65\n# point with coordinate y = 1 in right to left addition chain\nprivate = 00c1781d86cac2c0af3fb50d54c554a67bd75d25ca796f0486e3fa84f9\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a57232560d9d604655181f775859b0723d4e",
@@ -3116,9 +3215,9 @@
     "ed = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 312\n# wrong length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021033b000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 313\n# wrong length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b810400210339000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 314\n# uint32 overflow in length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3053301006072a8648ce3d020106052b810400210385010000003a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 315\n# uint64 overflow in length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3057301006072a8648ce3d020106052b81040021038901000000000000003a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 316\n# length of bit string = 2**31 - 1\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3052301006072a8648ce3d020106052b8104002103847fffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 317\n# length of bit string = 2**32 - 1\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3052301006072a8648ce3d020106052b810400210384ffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 318\n# length of bit string = 2**40 - 1\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3053301006072a8648ce3d020106052b810400210385ffffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 319\n# length of bit string = 2**64 - 1\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3056301006072a8648ce3d020106052b810400210388ffffffffffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 320\n# incorrect length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b8104002103ff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 321\n# lonely bit string tag\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3013301006072a8648ce3d020106052b8104002103\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 322\n# appending 0's to bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3050301006072a8648ce3d020106052b81040021033c000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 323\n# prepending 0's to bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3050301006072a8648ce3d020106052b81040021033c0000000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 324\n# appending null value to bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3050301006072a8648ce3d020106052b81040021033c000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620500\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 325\n# truncated length of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3014301006072a8648ce3d020106052b810400210381\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 326\n# Replacing bit string with NULL\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3014301006072a8648ce3d020106052b810400210500\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 327\n# changing tag value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021013a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 328\n# changing tag value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021023a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 329\n# changing tag value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021043a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 330\n# changing tag value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021053a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 331\n# changing tag value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021ff3a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 332\n# dropping value of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3014301006072a8648ce3d020106052b810400210300\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 333\n# modify first byte of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021033a020486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72f",
     "a4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 334\n# modify last byte of bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3dae2\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 335\n# truncated bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304d301006072a8648ce3d020106052b810400210339000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 336\n# truncated bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304d301006072a8648ce3d020106052b8104002103390486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 337\n# declaring bits as unused in bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021033a010486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 338\n# unused bits in bit string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3052301006072a8648ce3d020106052b81040021033e200486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da6201020304\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 339\n# unused bits in empty bit-string\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 3015301006072a8648ce3d020106052b81040021030103\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n# tcId = 340\n# 128 unused bits\nprivate = 00a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572\npublic = 304e301006072a8648ce3d020106052b81040021033a800486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62\nresult = acceptable\nshared = 85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63\nflags = InvalidAsn\n\n",
 };
-static const size_t kLen112 = 196857;
+static const size_t kLen128 = 196857;
 
-static const char *kData112[] = {
+static const char *kData128[] = {
     "# Imported from Wycheproof's ecdh_secp256r1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDH\n# Generator version: 0.8r12\n\n[curve = secp256r1]\n[encoding = asn]\n\n# tcId = 1\n# normal case\nprivate = 0612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf\nresult = valid\nshared = 53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285\n\n# tcId = 2\n# compressed public key\nprivate = 0612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346\npublic = 3039301306072a8648ce3d020106082a8648ce3d0301070322000362d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26\nresult = acceptable\nshared = 53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285\nflags = CompressedPoint\n\n# tcId = 3\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000458fd4168a87795603e2b04390285bdca6e57de6027fe211dd9d25e2212d29e62080d36bd224d7405509295eed02a17150e03b314f96da37445b0d1d29377d12c\nresult = valid\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 4\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040f6d20c04261ecc3e92846acad48dc8ec5ee35ae0883f0d2ea71216906ee1c47c042689a996dd12830ae459382e94aac56b717af2e2080215f9e41949b1f52be\nresult = valid\nshared = 00000000000000000000000000000000ffffffffffffffffffffffffffffffff\n\n# tcId = 5\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400c7defeb1a16236738e9a1123ba621bc8e9a3f2485b3f8ffde7f9ce98f5a8a1cb338c3912b1792f60c2b06ec5231e2d84b0e596e9b76d419ce105ece3791dbc\nresult = valid\nshared = 0000000000000000ffffffffffffffff00000000000000010000000000000001\n\n# tcId = 6\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004e9b98fb2c0ac045f8c76125ffd99eb8a5157be1d7db3e85d655ec1d8210288cf218df24fd2c2746be59df41262ef3a97d986744b2836748a7486230a319ffec0\nresult = valid\nshared = 00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000\n\n# tcId = 7\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004e9484e58f3331b66ffed6d90cb1c78065fa28cfba5c7dd4352013d3252ee4277bd7503b045a38b4b247b32c59593580f39e6abfa376c3dca20cf7f9cfb659e13\nresult = valid\nshared = 000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 8\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004767d7fbb84aa6a4db1079372644e42ecb2fec200c178822392cb8b950ffdd0c91c86853cafd09b52ba2f287f0ebaa26415a3cfabaf92c6a617a19988563d9dea\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001\n\n# tcId = 9\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004c74d546f2fcc6dd392f85e5be167e358de908756b0c0bb01cb69d864ca083e1c93f959eece6e10ee11bd3934207d65ae28af68b092585a1509260eceb39b92ef\nresult = valid\nshared = 085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c\n\n# tcId = 10\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000434fc9f1e7a094cd29598d1841fa9613dbe82313d633a51d63fb6eff074cc9b9a4ecfd9f258c5c4d4210b49751213a24c596982bd1d54e0445443f21ef15492a5\nresult = valid\nshared = 190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff3\n\n# tcId = 11\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d5c96efd1907fd48de2ad715acf82eae5c6690fe3efe16a78d61c68d3bfd10df03eac816b9e7b776192a3f5075887c0e225617505833ca997cda32fd0f673c5e\nresult = valid\nshared = 507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd\n\n# tcId = 12\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004f475f503a770df72c45aedfe42c008f59aa57e72b232f26600bdd0353957cb20bdb8f6405b4918050a3549f44c07a8eba820cdce4ece699888c638df66f54f7c\nresult = valid\nshared = 5f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba45\n\n# tcId = 13\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004f3cb6754b7e2a86d064dfb9f903185aaa4c92b481c2c1a1ff276303bbc4183e49c318599b0984c3563df339311fe143a7d921ee75b755a52c6f804f897b809f7\nresult = valid\nshared = 7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff\n\n# tcId = 14\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cce13fbdc96a946dfb8c6d9ed762dbd1731630455689f57a437fee124dd54cecaef78026c653030cf2f314a67064236b0a354defebc5e90c94124e9bf5c4fc24\nresult = valid\nshared = 8000000000000000000000000000000000000000000000000000000000000004\n\n# tcId = 15\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047633dfd0ad06765097bc11bd5022b200df31f28c4ff0625421221ac7eeb6e6f4cb9c67693609ddd6f92343a5a1c635408240f4f8e27120c12554c7ff8c76e2fe\nresult = valid\nshared = 8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000\n\n# tcId = 16\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004a386ace573f87558a68ead2a20088e3fe928bdae9e109446f93a078c15741f0421261e6db2bf12106e4c6bf85b9581b4c0302a526222f90abc5a549206b11011\nresult = valid\nshared = ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff\n\n# tcId = 17\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048e7b50f7d8c44d5d3496c43141a502f4a43f153d03ad43eda8e39597f1d477b8647f3da67969b7f989ff4addc393515af40c82085ce1f2ee195412c6f583774f\nresult = valid\nshared = ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 18\n# edge case for shared secret\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004c827fb930fd51d926086191b502af83abb5f717debc8de29897a3934b2571ca05990c0597b0b7a2e42febd56b13235d1d408d76ed2c93b3facf514d902f6910a\nresult = valid\nshared = ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff\n\n# tcId = 19\n# y-coordinate of the public key is small\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503\nresult = valid\nshared = 7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff\n\n# tcId = 20\n# y-coordinate of the public key is small\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d318abe66f575ee8a2f1c4a80e35260ae82ad7d6f661d15f06967930a585097ef7\nresult = valid\nshared = 000000000000000000000000111124f400000000000000000000000000000000\n\n# tcId = 21\n# y-coordinate of the public",
     " key is small\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c894e90f0df1b0e6cadb03b9de24f6a22d1bd0a4a58cd645c273cae1c619bfd61\nresult = valid\nshared = 000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff\n\n# tcId = 22\n# y-coordinate of the public key is large\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c7b021f5b006c778ba686cd8f14d00eb7d78256d9b4fccb061d9f6553e91752afc\nresult = valid\nshared = 7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff\n\n# tcId = 23\n# y-coordinate of the public key is large\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d3e754198fa8a1175e0e3b57f1cad9f517d528290a9e2ea0f96986cf5a7af68108\nresult = valid\nshared = 000000000000000000000000111124f400000000000000000000000000000000\n\n# tcId = 24\n# y-coordinate of the public key is large\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c76b16f0e20e4f194524fc4621db095dd2e42f5b6a7329ba3d8c351e39e64029e\nresult = valid\nshared = 000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff\n\n# tcId = 25\n# y-coordinate of the public key has many trailing 1's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca1b02c82f3a61a376db795626e9400557112273a36cddb08caaa43953965454730\nresult = valid\nshared = 7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff\n\n# tcId = 26\n# y-coordinate of the public key has many trailing 1's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a918ea7a07023ef67677024bd3841e187c64b30a30a3750eb2ee873fbe58fa1357b\nresult = valid\nshared = 0000000000000000000000001f6bd1e500000000000000000000000000000000\n\n# tcId = 27\n# y-coordinate of the public key has many trailing 1's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53c118182b85ef466eb9a8e87f9661f7d017984c15ea82043f536d1ee6a6d95b509\nresult = valid\nshared = 000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff\n\n# tcId = 28\n# y-coordinate of the public key has many trailing 0's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca14fd37d0b59e5c893486a9d916bffaa8eedd8c5ca3224f73555bc6ac69abab8cf\nresult = valid\nshared = 7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff\n\n# tcId = 29\n# y-coordinate of the public key has many trailing 0's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a9171585f8edc1098998fdb42c7be1e7839b4cf5cf6c8af14d1178c041a705eca84\nresult = valid\nshared = 0000000000000000000000001f6bd1e500000000000000000000000000000000\n\n# tcId = 30\n# y-coordinate of the public key has many trailing 0's\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53cee7e7d46a10b99156571780699e082fe867b3ea257dfbc0ac92e1195926a4af6\nresult = valid\nshared = 000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff\n\n# tcId = 31\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4\nresult = valid\nshared = cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848\n\n# tcId = 32\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff4f2b92b4c596a5a47f8b041d2dea6043021ac77b9a80b1343ac9d778f4f8f733\nresult = valid\nshared = 49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509\n\n# tcId = 33\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000ffffffffffffffff0000000000000001000000000000000138120be6ab31edfa34768c4387d2f84fb4b0be8a9a985864a1575f4436bb37b0\nresult = valid\nshared = 5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9\n\n# tcId = 34\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000ffffffff00000000ffffffff00000000ffffffff0000000100000000462c0466e41802238d6c925ecbefc747cfe505ea196af9a2d11b62850fce946e\nresult = valid\nshared = c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888\n\n# tcId = 35\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff1582fa32e2d4a89dfcfb3d0b149f667dba3329490f4d64ee2ad586c0c9e8c508\nresult = valid\nshared = 06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d\n\n# tcId = 36\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001684c8a9586ed6f9cbe447058a7da2108bab1e5e0a60d1f73e4e2e713f0a3dfe0\nresult = valid\nshared = f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45\n\n# tcId = 37\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c7859f97cb6e203f46bf3438f61282325e94e681b60b5669788aeb0655bf19d38\nresult = valid\nshared = d874b55678d0a04d216c31b02f3ad1f30c92caaf168f34e3a743356d9276e993\n\n# tcId = 38\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff321b8342ef077bc6724112403eaee5a15b4c31a71589f02ded09cd99cc5db9c83\nresult = valid\nshared = 11a8582057463fc76fda3ab8087eb0a420b0d601bb3134165a369646931e52a6\n\n# tcId = 39\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd4619d69f9940f51663aa12381bc7cf678bd1a72a49fbc11b0b69cb22d1af9f2d\nresult = valid\nshared = 4e173a80907f361fe5a5d335ba7685d5eba93e9dfc8d8fcdb1dcd2d2bde27507\n\n# tcId = 40\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200045f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba4562ca1103f70a2006cd1f67f5f6a3580b29dc446abc90e0e910c1e05a9aa788cd\nresult = valid\nshared = 73220471ec8bad99a297db488a34a259f9bc891ffaf09922e6b5001f5df67018\n\n# tcId = 41\n# edge cases for ephemeral key\np",
     "rivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff2e2213caf03033e0fd0f7951154f6e6c3a9244a72faca65e9ce9eeb5c8e1cea9\nresult = valid\nshared = 55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346\n\n# tcId = 42\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000480000000000000000000000000000000000000000000000000000000000000042be8789db81bb4870a9e60c5c18c80c83de464277281f1af1e640843a1a3148e\nresult = valid\nshared = 2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f\n\n# tcId = 43\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000722540f8a471c379083c600b58fde4d95c7dcad5095f4219fc5e9bdde3c5cd39\nresult = valid\nshared = bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26\n\n# tcId = 44\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff5df80fc6cae26b6c1952fbd00ed174ee1209d069335f5b48588e29e80b9191ad\nresult = valid\nshared = f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55\n\n# tcId = 45\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2c63650e6a5d332e2987dd09a79008e8faabbd37e49cb016bfb92c8cd0f5da77\nresult = valid\nshared = e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21\n\n# tcId = 46\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff7a116c964a4cd60668bf89cffe157714a3ce21b93b3ca607c8a5b93ac54ffc0a\nresult = valid\nshared = 516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265\n\n# tcId = 47\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff00000001c7c30643abed0af0a49fe352cb483ff9b97dccdf427c658e8793240d\nresult = valid\nshared = 6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3\n\n# tcId = 48\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230fffffffffffffffffffffffffffffffffffffffd383cf9bd5412f50f5b601cad34b7c00746823320bd839a71786cdbf2\nresult = valid\nshared = 6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3\n\n# tcId = 49\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff267bfdf8a61148decd80283732dd4c1095e4bb40b9658408208dc1147fffffff\nresult = valid\nshared = 44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc\n\n# tcId = 50\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffffd984020659eeb722327fd7c8cd22b3ef6a1b44c0469a7bf7df723eeb80000000\nresult = valid\nshared = 44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc\n\n# tcId = 51\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f4000000000000000000000000000000000000000d12d381b0760b1c50be8acf859385052c7f53cde67ce13759de3123a0\nresult = valid\nshared = f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851\n\n# tcId = 52\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f400000000000000000000000000000000fffffff1ed2c7e5089f4e3af4175307a6c7afad480ac3219831ec8a621cedc5f\nresult = valid\nshared = f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851\n\n# tcId = 53\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e5000000000000000000000000000000004096edd6871c320cb8a9f4531751105c97b4c257811bbc32963eaf39ffffffff\nresult = valid\nshared = 3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1\n\n# tcId = 54\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e500000000000000000000000000000000bf69122878e3cdf447560bace8aeefa3684b3da97ee443cd69c150c600000000\nresult = valid\nshared = 3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1\n\n# tcId = 55\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff000000007afbc0b325e820646dec622fb558a51c342aa257f4b6a8ec5ddf144f\nresult = valid\nshared = 1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc\n\n# tcId = 56\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449fffffffffffffffffffffffffffffffffffffffe85043f4dda17df9b92139dd04aa75ae4cbd55da80b495713a220ebb0\nresult = valid\nshared = 1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc\n\n# tcId = 57\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff152c1a22d823a27855ed03f8e2ab5038bb1df4d87e43865f2daf6948ffffffff\nresult = valid\nshared = 67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1\n\n# tcId = 58\n# edge cases for ephemeral key\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffffead3e5dc27dc5d88aa12fc071d54afc744e20b2881bc79a0d25096b700000000\nresult = valid\nshared = 67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1\n\n# tcId = 59\n# point with coordinate x = 0\nprivate = 00e461c5b5e63d75b4c8c123bf8b9cd45e712af08f7e2e494a8f255ac9d80e058b\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4\nresult = valid\nshared = d11c640b4382e60ec8d254ee76f09b8fac57651ab73b6dd3fdc935a61564a3e9\n\n# tcId = 60\n# point with coordinate x = 0\nprivate = 00e461c5b5e63d75b4c8c123bf8b9cd45e712af08f7e2e494a8f255ac9d80e058b\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004100121f1a09443851c9aa2ab6ee6440e2ac5e1be648274bd5d26c12fb3ba3f7f032a1c219fa1457cb20588297e0513cfd4901f9a95414f7e914f9179f38567a6\nresult = valid\nshared = 90e712e2afd14171c19467a2bfe7abf1c477d1f40f6675f00e622fd5604fa16a\n\n# tcId = 61\n# point with coordinate x = 0\nprivate = 00e461c5b5e63d75b4c8c123bf8b9cd45e712af08f7e2e494a8f255ac9d80e058b\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cad02ab537c80831ccdd395129fc4bfe4a89ae0c866f6619a3e1",
@@ -3145,9 +3244,9 @@
     " = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 440\n# incorrect length of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703ff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 441\n# lonely bit string tag\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3016301306072a8648ce3d020106082a8648ce3d03010703\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 442\n# appending 0's to bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 305b301306072a8648ce3d020106082a8648ce3d030107034400042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 443\n# prepending 0's to bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 305b301306072a8648ce3d020106082a8648ce3d0301070344000000042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 444\n# appending null value to bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 305b301306072a8648ce3d020106082a8648ce3d030107034400042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0500\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 445\n# truncated length of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3017301306072a8648ce3d020106082a8648ce3d0301070381\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 446\n# Replacing bit string with NULL\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3017301306072a8648ce3d020106082a8648ce3d0301070500\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 447\n# changing tag value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107014200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 448\n# changing tag value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107024200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 449\n# changing tag value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107044200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 450\n# changing tag value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107054200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 451\n# changing tag value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107ff4200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 452\n# dropping value of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3017301306072a8648ce3d020106082a8648ce3d0301070300\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 453\n# modify first byte of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034202042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 454\n# modify last byte of bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add6eb\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 455\n# truncated bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3058301306072a8648ce3d020106082a8648ce3d030107034100042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add6\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 456\n# truncated bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3058301306072a8648ce3d020106082a8648ce3d0301070341042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 457\n# declaring bits as unused in bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034201042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 458\n# unused bits in bit string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 305d301306072a8648ce3d020106082a8648ce3d030107034620042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b01020304\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 459\n# unused bits in empty bit-string\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3018301306072a8648ce3d020106082a8648ce3d030107030103\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n# tcId = 460\n# 128 unused bits\nprivate = 00c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703",
     "4280042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b\nresult = acceptable\nshared = f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4\nflags = InvalidAsn\n\n",
 };
-static const size_t kLen113 = 236047;
+static const size_t kLen129 = 236047;
 
-static const char *kData113[] = {
+static const char *kData129[] = {
     "# Imported from Wycheproof's ecdh_secp384r1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDH\n# Generator version: 0.8r12\n\n[curve = secp384r1]\n[encoding = asn]\n\n# tcId = 1\n# normal case\nprivate = 766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81\npublic = 3076301006072a8648ce3d020106052b8104002203620004790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796d9b954baa8a75e82df711b3b56eadff6b0f668c3b26b4b1aeb308a1fcc1c680d329a6705025f1c98a0b5e5bfcb163caa\nresult = valid\nshared = 6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135\n\n# tcId = 2\n# compressed public key\nprivate = 766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81\npublic = 3046301006072a8648ce3d020106052b8104002203320002790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796\nresult = acceptable\nshared = 6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135\nflags = CompressedPoint\n\n# tcId = 3\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004490e96d17f4c6ceccd45def408cea33e9704a5f1b01a3de2eaaa3409fd160d78d395d6b3b003d71fd1f590fad95bf1c9d8665efc2070d059aa847125c2f707435955535c7c5df6d6c079ec806dce6b6849d337140db7ca50616f9456de1323c4\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 4\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200040161328909675213e32098d35a6b8308a8d500cca39dcee5e804e73bdb8deaf06fe417291fd9793b231ef5fe86945444a97a01f3ae3a8310c4af49b592cb291ef70ee5bc7f5534d3c23dc9eefde2304842c7737ae937ccf9bd215c28103e9fe2\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 5\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004af4ae964e3bcbd923accda5da3175d411fd62d17dd3c3a1c410bef1730985a6265d90e950ac0fc50743b1ed771906ff33b68cf4d3d83a885a87097fdd329ce83b189f98cec5be44c31d1a3a2bba10f471963232b8ba7610fa8c72179050eb86d\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003\n\n# tcId = 6\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200041478ab6e032b9545eda9ac2c264e57a11f08acbc76d16a0ab77b04dbdaf20f215c4183437b32afc471eaa603d14c7c5d8a4c84ee0e895bec5c37f0a1ca075e106ff6bf38801b5c697409d39675231108d33c4a5ea65aaa8c03e939c95d96c4c4\nresult = valid\nshared = 0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001\n\n# tcId = 7\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004f63208e34e7e90bb5fb036432467a89981444010663b8533b47bfa94bd2bc16f38aa516b930a4726e3876d3091bfb72ec783ed4da0cac06320817dc8bc64f59ccf06f48abc4386a150913fa95743a7b4601190e1c6ee8f8bf6354b254ecace45\nresult = valid\nshared = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 8\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004033271ef42d92ad47b273b09ea2f45401161baa52696590d0e175ff2d1c0dfa3fea40e4266d446546c05e480d57fabec7889f16a8bcc176602f6d46561614a2f4284abe697b7cb9ce79f7e2e71b155cb1f155ce925d16391a680eda23152e6e1\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff\n\n# tcId = 9\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004737e8437e18683de2455b68945bba31daec3e754d72f0a0776d3192b2f9298bb95ca1464baa6687aabb679f804cf6ec6c2b4d47d61a60404df63b1e9ac0954b3419bbc2ad52a0409aeeb82f4703758588059165b20367dcb4b235b0caf71d727\nresult = valid\nshared = 007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000\n\n# tcId = 10\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b810400220362000437f9004983156bbd9c47891e75237bb13016bd7fe6f4e0f71cef0e63f16a672f0d3b0e20165c33407e146b6a4ae6962dd3b57ccb99e7aaf1303240516d0ebe08e585513e3695d42c467dcab5340ef761990cadc8d8840aacc944481415c07feb\nresult = valid\nshared = 3b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd\n\n# tcId = 11\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200049655d8e5622718b317cfbc09894357f75a6b13fa516bcd6630721b869a620196cf0c3dec8860b32d27ed9bac2cf263af17321698116d7d811ae8da9b9cbbf9382c1e36e2b67d6c6af9bcea7d9de00ca72b398606c098a0a0f0c4b8941943ed65\nresult = valid\nshared = 6a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca6\n\n# tcId = 12\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004ccb13d427b3c4bb33dd4f20cddabc68600eaf97eeb2c81e8c218ae90743e74ff38ca56f0c0224379db464dcf4a40f04350cd7a659b2c4851a5dcf8c990fc920c07d4d5aa50a2185750e6b84c42e83cff635050482decb4780f812e4c49fc7404\nresult = valid\nshared = 7c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104\n\n# tcId = 13\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200042664624307c02ef487030a632162c515f841d15ea3152d98ff2364232d7aab39343d5f703a4d5a31092aa7356c3a2f671c1cd603addfd8b5477552a3b32a18edaf3e33bec22ee2167f9da729636002a7974eaeb5ff082b2aabf8c7056b84c3ab\nresult = valid\nshared = 7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002\n\n# tcId = 14\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004665f1f320b6ab1c1b52d144e52d87a154c2b4489838c9119de622c2d1b52b65b0a3955e44e0d4859175360c0f63dee813f14f69972f18caed7916c94a4d20ec344591e7536a4a7a4d8c9832818c96d60b1a81fabe64ea02c5f647e361bf5b60f\nresult = valid\nshared = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 15\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b810400220362000491357ca87dbb08e85d7b1acecfd1e086078a82d19f81474da389364a39fe2543eb934b440173c38e61a1d9407855b5d89ef0d9e920764b6d7765b084cf9541dacc43d1dabaa390b0fb856097b0c00a8556f4e3848568ab4ae790c3d346ca01b6\nresult = valid\nshared = fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff\n\n# tcId = 16\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004d5a833bae33b2d10fdff6db7c54",
     "77adb614b191c70d97c6f130a14e93931cc1dc058053fee54a264a00fdd16d3166fdc42992276b79925bafcd183b03ed18235350980abfe67b814c6c11074c38f74cd4e734ad58cdb49d9fcd2181d1b8f1119\nresult = valid\nshared = fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000\n\n# tcId = 17\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b810400220362000467547cda7fbe8f16be5a4477cbb02979f1af72fc0f39302773552fbcf4667a8e23abc0e12856ee6234deeca5f22ae0503a4df7c068e7432417260cb9fe0d68b9c7fcf7e16a2ada05687d8f8900b84723103edbff0a42b27517da2760b7d38843\nresult = valid\nshared = ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 18\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200041363e3b99008e09bb3f085949b9b6ea26a318f496de568a96630fdb9d4c72c2814df3087a1741f32f24989b428167f93c653cb3ae8c3ecfaec57efd54bb8ce9d79c7bf6cc70fb1114f939be8f1a99bf1e42b97431124ef9fa33450faa4e76839\nresult = valid\nshared = ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001\n\n# tcId = 19\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004ba2be8d7147e2417c2ec80b24b4c1aa94464ffd0aae1fa2e078b3afbc77c144489ca9d064acbb7a9cfa6196d0f467b7e65ee1ca1eb1351ff9968f553dfe2e4c59ff8ba34c22a42b3baa13a9a1adc7f13abd40f1fd25d46bc5330852b9371966a\nresult = valid\nshared = ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff\n\n# tcId = 20\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004d69850ccbacc4736ea200ff2f8488f26247945a2ab48dd3708f494b293d8cba83417f48974881c7fb03854089bbf66cc1c773ec03cb8cd5f007ec3b03bdd05a409b352103f0decf25b41673ab8ca3d04334babee01219f15701f2bca22d40b37\nresult = valid\nshared = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe\n\n# tcId = 21\n# y-coordinate of the public key has many trailing 0's\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb487826fde2ed9f5649c11cf8465f8bf8ad50f68914936fc39666f68219d066506bea4001fdc816c9a90e7e2afb19bea085f\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000\n\n# tcId = 22\n# y-coordinate of the public key has many trailing 1's\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb4877d9021d1260a9b63ee307b9a0740752af0976eb6c903c6999097de62f99af9405bffe0227e93656f181d504f6415f7a0\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000\n\n# tcId = 23\n# y-coordinate of the public key is small\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e3982835fd2e55ec41fdfe8cabbbb7bcd8163645a19e9dac59630f3fe93b208094ff87cd461b53cef53482e70e2e8ea87200cc3f\nresult = valid\nshared = 0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000\n\n# tcId = 24\n# y-coordinate of the public key is large\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e398283502d1aa13be0201735444484327e9c9ba5e616253a69cf0c016c4df7f6b007831b9e4ac300acb7d18f1d171588dff33c0\nresult = valid\nshared = 0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000\n\n# tcId = 25\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e\nresult = valid\nshared = 6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f\n\n# tcId = 26\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3\nresult = valid\nshared = 89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052\n\n# tcId = 27\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036660041b1c7984620e8d7fd7ccdb50cc3ba816da14d41a4d8affaba8488867f0ca5a24f8d42dd7e44b530a27dc5b58da\nresult = valid\nshared = 35513157e804bd918d04de202778b81a6fc7ad8aa541ee94116a0f18466725d75e71c6942bf044b1b0ecba19db33e0de\n\n# tcId = 28\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001141b9ee5310ea8170131b604484a6d677ed42576045b7143c026710ae92b277afbbea0c4458c220d561e69404dc7d888\nresult = valid\nshared = 102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b\n\n# tcId = 29\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b810400220362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff70370385413d3eff6fa3407ba24f682c2b01b51445dbdf5ef7b0dd0979f17e713e09081571f1e94dfb66bf282002f39f\nresult = valid\nshared = f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78\n\n# tcId = 30\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff112e191f1f78bbc54b6cc4f0b1e59ae8c6ff1a07f5128e41dfa2828e1b6538d4fa2ca2394c6aab3449dcb3fc4eb44c09\nresult = valid\nshared = f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f\n\n# tcId = 31\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000028a4c8da5a05112fe6025ef41908969de20d05d9668e5c852ef2d492172ddc2a0a622fc488164fcc1a076b872942af2\nresult = valid\nshared = 8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14",
     "e0f2e8\n\n# tcId = 32\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200043b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd7b7f0f28d55e2f3a50f1f1bef3976834a05b43418e979303bc0363ed16d2d0b4011cc37b3c06ad73154faeab7915cd87\nresult = valid\nshared = 1fe6fea5f00d3005abaae2267ff18e430915838d87909ab503885edf38be7618ecb321f0a4df71b0913fbf12c76fc1f0\n\n# tcId = 33\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200046a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca63cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e\nresult = valid\nshared = f58adc13ff997d38383910db7befb17670393a33d95b049c2aa19d760c8e728ecedd32168476b90b26a3742dcc121b07\n\n# tcId = 34\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200047c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104562ee0c57e71d96cefe31b4c4045bd4086a38e8ab9adf2d5567be318051d70f3aa68b753f271ab032b6abcce919e2962\nresult = valid\nshared = 56299684ec5ceb09ba4d94d1231005a826c9c08a5219c757e0136cbe8b6430badd4925172f2939891da7c7893850512f\n\n# tcId = 35\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000024480ab33cb4bf7cb79c024eeade3fd641e2f3003698400e8986a7343a5da59a3b26eea4b4176e53239371437d834a1a7\nresult = valid\nshared = 1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef\n\n# tcId = 36\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020797da4c0751ced16de80d16ab7c654a5dc27d092626d0865a192a1c5ea7c1b88c9fcab057946741e41cc28c80ec0b9a\nresult = valid\nshared = 15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e\n\n# tcId = 37\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff6c70898ae6fb31fa2f086562af2d10486ba4c6fd5e41dfe4aa61598b4707a3bc276a62feb1b98557e3b17c025f7adf4e\nresult = valid\nshared = 88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3\n\n# tcId = 38\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000eb1592858b6e6e3a199c0f3e7c5f0b4a92915936efb8bc0407680eb7274be7422156ce8cfc8b505b2d902c39992380f\nresult = valid\nshared = b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a69611668c777c53bb74c2bcd40edfbf7944d\n\n# tcId = 39\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4987abae412809c2fa48fd23b1bdf9e622f5a606c44117215ffa61b18ef46e54a7fbbf11f9a6ba59c991b4ae501fedce\nresult = valid\nshared = b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552\n\n# tcId = 40\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000013691fe493d4d28bf8ee1dfec812d6c306eae0842919eda6dc525f0d49ac2d26a992251912139a2936849f9d6fa949a68\nresult = valid\nshared = b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0\n\n# tcId = 41\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff615842aa06b06f78f0a66f7bea88d4b6ee59653eeaa00dc5e0a2b658f969b71af90c9b4e96bd3ca33846955bdccbd359\nresult = valid\nshared = ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e\n\n# tcId = 42\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3\nresult = valid\nshared = edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511\n\n# tcId = 43\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b0000000000000000000000000000000071bd1e700c34075c3cade8ce29d33724af68a7672b265a4e157055360440ab7c461b8e9ac8024e63a8b9c17c00000000\nresult = valid\nshared = ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6\n\n# tcId = 44\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b000000000000000000000000000000008e42e18ff3cbf8a3c3521731d62cc8db50975898d4d9a5b1ea8faac9fbbf5482b9e4716437fdb19c57463e84ffffffff\nresult = valid\nshared = ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6\n\n# tcId = 45\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000000000007f57b69a014783dbfa4967b2f9cfa678a6f0b6e9cfd41648cec5b3c498e72152da3f82d3da2e8e9f8ef37b11\nresult = valid\nshared = bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3\n\n# tcId = 46\n# edge cases for ephemeral key\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000ffffffff80a84965feb87c2405b6984d06305987590f4916302be9b7313a4c3a6718deac25c07d2c25d17161710c84ee\nresult = valid\nshared = bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3\n\n# tcId = 47\n# edge case for Jacobian and projective coordinates\nprivate = 00938f3dbe37135cd8c8c04182952f6e6f9bfe7a4cff4eacf90612a48865dc43e9b5d230f761d1fc4dfb69be20e84ccc8f\npublic = 3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c0",
@@ -3178,9 +3277,9 @@
     "ublic = 3076301006072a8648ce3d020106052b8104002203630004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 400\n# wrong length of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203610004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 401\n# uint32 overflow in length of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307b301006072a8648ce3d020106052b81040022038501000000620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 402\n# uint64 overflow in length of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307f301006072a8648ce3d020106052b8104002203890100000000000000620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 403\n# length of bit string = 2**31 - 1\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307a301006072a8648ce3d020106052b8104002203847fffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 404\n# length of bit string = 2**32 - 1\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307a301006072a8648ce3d020106052b810400220384ffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 405\n# length of bit string = 2**40 - 1\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307b301006072a8648ce3d020106052b810400220385ffffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 406\n# length of bit string = 2**64 - 1\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307e301006072a8648ce3d020106052b810400220388ffffffffffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 407\n# incorrect length of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203ff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 408\n# lonely bit string tag\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3013301006072a8648ce3d020106052b8104002203\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 409\n# appending 0's to bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3078301006072a8648ce3d020106052b8104002203640004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 410\n# prepending 0's to bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3078301006072a8648ce3d020106052b81040022036400000004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 411\n# appending null value to bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3078301006072a8648ce3d020106052b8104002203640004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510500\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 412\n# truncated length of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3014301006072a8648ce3d020106052b810400220381\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 413\n# Replacing bit string with NULL\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3014301006072a8648ce3d020106052b810400220500\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 414\n# changing tag value of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002201620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 415\n# changing tag value of bit string\nprivate ",
     "= 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002202620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 416\n# changing tag value of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002204620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 417\n# changing tag value of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002205620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 418\n# changing tag value of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b81040022ff620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 419\n# dropping value of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3014301006072a8648ce3d020106052b810400220300\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 420\n# modify first byte of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203620204c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 421\n# modify last byte of bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312d1\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 422\n# truncated bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3075301006072a8648ce3d020106052b8104002203610004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 423\n# truncated bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3075301006072a8648ce3d020106052b81040022036104c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 424\n# declaring bits as unused in bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203620104c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 425\n# unused bits in bit string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 307a301006072a8648ce3d020106052b8104002203662004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed03125101020304\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 426\n# unused bits in empty bit-string\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3015301006072a8648ce3d020106052b81040022030103\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n# tcId = 427\n# 128 unused bits\nprivate = 4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a\npublic = 3076301006072a8648ce3d020106052b8104002203628004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251\nresult = acceptable\nshared = 40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797\nflags = InvalidAsn\n\n",
 };
-static const size_t kLen114 = 333824;
+static const size_t kLen130 = 333824;
 
-static const char *kData114[] = {
+static const char *kData130[] = {
     "# Imported from Wycheproof's ecdh_secp521r1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDH\n# Generator version: 0.8r12\n\n[curve = secp521r1]\n[encoding = asn]\n\n# tcId = 1\n# normal case\nprivate = 01939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce00e04ad19cf9fd4722b0c824c069f70c3c0e7ebc5288940dfa92422152ae4a4f79183ced375afb54db1409ddf338b85bb6dbfc5950163346bb63a90a70c5aba098f7\nresult = valid\nshared = 01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87\n\n# tcId = 2\n# compressed public key\nprivate = 01939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd\npublic = 3058301006072a8648ce3d020106052b81040023034400030064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce\nresult = acceptable\nshared = 01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87\nflags = CompressedPoint\n\n# tcId = 3\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004014c643329691ba27459a40dfe7c4ce17b3ea14d0cd7aa47b01f1315404db51436fbbfe6de0842e0f7e1265f6ff3aca28750677d3370b2fb2a6ef497356f4b95811201051b14178639a09a41465c72d3743436ee1c191ff7388a40140b34d5317de5911ea03cdbb0329fdeb446695a3b92d437271a9f3c318b02dec4d473908158140e97\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 4\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040029cd32125c23a41af24fd4b729da0faacbc35516ef0ba59096602571693cd282e26d67e18ef4643d0f6f158d7370d3394ca9a8de7938032ac178c6fd34e3702b8d008649834e2b41be3a8b7510bfe570f4c67075943cd0cbb9d9e1d1da52618b5b96d6aec9b650daf1ca6624c13e5116302b9c79c8c4d3d351915d1e8e1ab6ad76098e\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 5\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040032c6f06ce6a15ea064464d35aa368d299c9a9e1e368f694aefb603876248f898f223ce0217bef37d61eb09b27c93187cf8e61ba7b14e3c9bee692b06ac6d95f836019fd19f8480e21c63211d48d45f96f6365cf55f958e1a0fe7ea6b6b9ff230a87b70bb1b14d3a5fb6669a91641c6acf4570c1d3a9e709913b7fe6b35ff81c394d6a7\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 6\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401f7eb96e64b1a62daf9e0801bfd96a0b15b68e5f5cb3e90b434495a473907338e53098e1c2e493335d09c6aae6fdda0345b98aaed588f2abe82910713fb6c20252901396b17cf250bc018f4cead097e7e09863f14cf1239b065e57d884949eee141926f7e7c9f7f34cf0536368767bc0e1ab5142877293a4c722693a73fe14a5390af93\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 7\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004006ddf9b10965d5fc129e96f7a37667ccf66cc44384772906fedb21f9de4629e01aaa09ac7c9866112064bbc9bd58ebc123ab2fe19d8fed1a056d27bfef0630509c7001c441311ef20a16346332ea42d5c65788d68f6817b0267fcab11ea9c948ed108115dda8e823a380b601460742d3772d6424c67b240da24772ff0d2ccd9a1e0cea6\nresult = valid\nshared = 000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000\n\n# tcId = 8\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004007a8c547268c948b626da636cf54428ea2ab23861d499a84ad7be1cf691b92872a06e26c6dba08ca9ed386f83d396156d5fa023f57d5ea6440ec7401dad2c08ad70018c3815b1b9a2e42555419a6c19043fa2b0ddcc4b5a6e372fee9fcb227d85bad704687e7e1a818b612d5c046cd75972f7a2dd5c9a200ac5582cd59fec47ac525ecf\nresult = valid\nshared = 00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 9\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040029153cf062f88f303e5d6f9aac968bd901076d5994ea7f831833b1e69b67e9e9fe20cf9c5623e00e0b9e3592fca2a03324b5df7c93186aff697aca864600d44ecc002801a62e2f4106f34106da23dc93d50e3e975a1d47510021835290649b7a4125109f656b6b0b5bd00b24d84ea1ba4e1ed49e61c526fb1011005131caee7ee0501e\nresult = valid\nshared = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 10\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400a61eb994e28722c59b3c6007dfdf8b37893f6350f461b26a00e1a45104314aae9989da87e4facb2c4ef721185b7d96d9a45a28a102756501a1acc5d329a21bbf73010e8d0e12f5a9a40e0d59c90ce73043d39730aeadd3788e31d7c2bb62a1166161994664afa658ce2e60a13f45f27f914307c8d6f8d4ed16ab041b8f69908a62782f\nresult = valid\nshared = 010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 11\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004011dd497b30c73709906b164a9a79dc7f2a98c0148ed63016bb95243834fbcdf8eb74b0ff652d54f59f31aef51da6e8974d363655b1da138dc4de0f2a8d800f475ae0057bd4b84607400d863ffbf45a3cf58999ee24ba05e93eca7b0e4ae760eb1733559a45d15579d3370d716ffa3ec4bfdae418e32fb06138dfca213720a938577610e\nresult = valid\nshared = 01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000\n\n# tcId = 12\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401283eb93fa369fe7012b647d21e0a97cf9950e5fbed819ef56158f20c8a9473a418eccbca4dc2b47f4cb6d322f917005859bf221e84ac9827cab82a801c627fb1ec0075c480cbafb352fcaf93baf23a1405fd81febe09729a908d1077e177dd8993d94b251a0d52652da3edb6fdf864e80cd51540e73d0b5107e3433576dcaa4e18db43\nresult = valid\nshared = 01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff\n\n# tcId = 13\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6",
     "b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400173beefe35ee868d497ff6601628f65ce18a1591f7e4a3a406622f3f508e2da68f101ed02febc38418c6ddfc26a5ec9848c42792463b1e945f9e167db34bdf2d660053070647aba7cd60eb295ab81a268a3903f393c5d28bbc5e022351c377cd84f02c19deb36442372cae1332e92f95ba60b6c852e0de0718e89d24e43cd479c9fb11\nresult = valid\nshared = 01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 14\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004009829cd5432687739ab6ae10af8ea73d2cb53b81ebb06b5961b7badc1676b3ef7b00454f7cde56774a01312d574a9193c1a5fe5336fbe62623ad9bf81143789f9f90012f955697ed578207197bf9aac3896521615dbacc8dc665d4f1715b08439f49c2aa6ed337023ffccc5075a85944936826db92f919737ca3afeadba1847084bdef7\nresult = valid\nshared = 01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000\n\n# tcId = 15\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040126e3c959cd41120bb83693b1d6a034b385137c1bb3213b776122fed96056e329885718a73bee639c0ba4b68818682f498ce5496925002bd7652516405fcc4fecad0073a9c6e3b0c694bf7cc8ccbbd09800e81e3548ba44a0c2381cef0b07bf702a19054bb5d717a1b79294609cbdafd4e2018064f7b2c4c204d818eb7ce521c3268ce5\nresult = valid\nshared = 01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001\n\n# tcId = 16\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040153dc481ab3c5dc8decd24ceaee1bec77f59f21f7f31c19538af047d281ac9e2567933fd3d21096b185d4098919571931bb9b0be7197995e2fbaf21c8a10007ade001ad69f08fcae164390be826256b50fae47502ce0e9ca46af0c490cb4033c886f88661a99ff2bd3c9c8e7da30faf2b4c769edc5831810ac05054c97e41063f496e1f\nresult = valid\nshared = 01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff\n\n# tcId = 17\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401f586611c87150288c3e86116c5db94a26718978829d701ddac05e9b0ce22dee4b18e95f60cba783ed3384da373deaefc57b8265d3a34eeb458bf24b9d82be32819008456e0f1d80492ef0078cc246d32fc7c7fb6720b4d458b51b2098d35746752b0ef0345bd0d342dfee6dd2f12ed12b34bd95d058c2811fd479d2dde32180e6c9ef2\nresult = valid\nshared = 01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002\n\n# tcId = 18\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004015edc87fd499a73eabffd14d2b6a70a8fb69b6a39d0d9c4dda2337b53cc72e49a9e3d5a2d9e8930cfa11852dac33443227fba6684bd74732e6879884b6ef9dae98f010eeb8d2e3360ea9726628085268af3f2a05ad41235d0a892098bd661b636f7ef0a820282906eda3f1ff1980b98fb5937228e9edcd6332e3641216c7307e7f3f452\nresult = valid\nshared = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\n\n# tcId = 19\n# edge case for shared secret\nprivate = 00a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040131b43002f7e687eec1ecf6a253c2ccc9e48f04d86fccd18fee0d2d22191f1ea539c40d521970b4709dc03986f647e0e8bb3340cf8a3e643a3541035437cf25f01500b27a55ac45f0296f8c9656bcfd52b5cea9f4115c06e4c64319609847d45e92418400e7868672c0d3e6e5e6e004a7190476ed77cfc33ad19a4bd2c615ad9950f374\nresult = valid\nshared = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\n\n# tcId = 20\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20ec9fea6b577c10d26ca1bb446f40b299e648b1ad508aad068896fee3f8e614bc63054d5772bf01a65d412e0bcaa8e965d2f5d332d7f39f846d440ae001f4f87\nresult = valid\nshared = 0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7\n\n# tcId = 21\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564\nresult = valid\nshared = 01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4\n\n# tcId = 22\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf\nresult = valid\nshared = 01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6\n\n# tcId = 23\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000005f880f50ec94bfac6658fa2fce05945c6a36b266407b6fbd5437a83e2f2f9b9c50a734872e48e70df65457f13e47d06c6b8b29f4735acf105ea63e051904d18aea\nresult = valid\nshared = 013aefe3245728a08c904fe7d61cd9c2fdac63f29cf664d8f161bebacb93f8a710e9692f9689480ad498de00f00061e40e46e76e4754c1130ef4217a58933e0b1dc6\n\n# tcId = 24\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000000f33ffc45da3eac1baab727ab8fd355cfa134c42047d55262651654fb50df7e9a5a75f179c8c86c4388213b5687dc43dfebb37f30128703c44ccd5c3284833b8717\nresult = valid\nshared = 0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14\n\n# tcId = 25\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004",
     "00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00cd2839d857b4699f5c8e8a0194786e26a862f086b4ba80746ae5225ed3aa68f96b7aaec55225830bb98f52d75221141897ba49d7a31ebbf0b6d7d31352e5266190\nresult = valid\nshared = 013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f\n\n# tcId = 26\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813d9829119f42ffa95fea8ba9e81e4cd6a6ca97fb0778e12e5f5dfe35201dd4cca8eca0d2e395555997041381e6ac1f18ddf4c74e0b6e9041cfdca1d1c103091\nresult = valid\nshared = 01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84\n\n# tcId = 27\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00878ad597d290db2cf660594aeed0f9b7c8dd68451d2d1b2cbc816b1ec4f35465b3964aff2edf1255163f5fca580132f85cade2887a017e7cd0b37196ad85221107\nresult = valid\nshared = 000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7\n\n# tcId = 28\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000010000000000000000000000000000000000b5e1191b449fa1ebdbd677daa48f90e2d1d6c058c877087cafd9364d99dbb283c68402e6e6c5f5411b2ed42824d8b280ceb910aba6847883a7e3780e2132af41c1\nresult = valid\nshared = 017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b\n\n# tcId = 29\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00207513d615656a1cc7505c18aa21b08e2b1d5a841de0816cc29c004efdb2d902ac1a7bb05e20722b576b64a3ddf4d2486421ac706bf4a424f252386368a5340fb6\nresult = valid\nshared = 0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f\n\n# tcId = 30\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff001fe800c50e54012b75a33e4be7d07c8d60f29680a395e951a6a31c5096b0ea928fc2cbf327dd784dc0a7ca46ea73992b758b5641364b4aba39e93798a4d925a008\nresult = valid\nshared = 001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433\n\n# tcId = 31\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000008dd18a1f5e482140be79bb65a21ad60c8987e532c84345f0135affd46ec71ef02b1ca3ad56f301d955fa306c122d441d6fedcf8b855ef256350bf69d23a7207ad9\nresult = valid\nshared = 00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d\n\n# tcId = 32\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000100566203dd325a081c4441f001f780365874fd3d0c9bc47227481afe76a93ae1bfde63af972203abfe22c63b80e83f7cc2184c3cb8cfd0152c54324c4759fd1f9a50\nresult = valid\nshared = 01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a\n\n# tcId = 33\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff00b11c668fbd549f36889f7b63434051da26f15705839136b1b14a09152d7a182ea7806c35478a32d3aa3c9c1627a61519ebec71b36fa77449025b8829e27f307834\nresult = valid\nshared = 019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44\n\n# tcId = 34\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000200aa75efc0a8daac1d73f32c9c552414bccf44af8e74331b47439e7dcc49a135b3ee61e9f69717d89b4bba3567a195aeda13fbec634bf2984b5ec6b6f80f5978ed5a\nresult = valid\nshared = 00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59\n\n# tcId = 35\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564\nresult = valid\nshared = 0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda\n\n# tcId = 36\n# edge cases for ephemeral key\nprivate = 012bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf\nresult = valid\nshared = 00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9\n\n# tcId = 37\n# edge case for Jacobian and projective coordinates\nprivate = 018f3dbe37135cd8c8c04182952f6e6f9bfdbb6af4c98f31ba30abc68d88e1ea980d4edcdb5b19f0610082194137ebb019e7a664b522189a186cbe5a03376c0713fb\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
@@ -3223,9 +3322,9 @@
     "4a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 459\n# length of bit string = 2**64 - 1\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3081a2301006072a8648ce3d020106052b810400230388ffffffffffffffff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 460\n# incorrect length of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819a301006072a8648ce3d020106052b8104002303ff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 461\n# lonely bit string tag\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3013301006072a8648ce3d020106052b8104002303\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 462\n# appending 0's to bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819d301006072a8648ce3d020106052b810400230381880004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 463\n# prepending 0's to bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819d301006072a8648ce3d020106052b8104002303818800000004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 464\n# appending null value to bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819d301006072a8648ce3d020106052b810400230381880004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500500\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 465\n# truncated length of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3014301006072a8648ce3d020106052b810400230381\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 466\n# Replacing bit string with NULL\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3014301006072a8648ce3d020106052b810400230500\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 467\n# changing tag value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230181860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 468\n# changing tag value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230281860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 469\n# changing tag value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230481860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 470\n# changing tag value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230581860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 471\n# changing tag value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b81040023ff81860004017ee1",
     "6985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 472\n# dropping value of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3014301006072a8648ce3d020106052b810400230300\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 473\n# modify first byte of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230381860204017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 474\n# modify last byte of bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32dd0\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 475\n# truncated bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819a301006072a8648ce3d020106052b810400230381850004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 476\n# truncated bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819a301006072a8648ce3d020106052b8104002303818504017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 477\n# declaring bits as unused in bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230381860104017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 478\n# unused bits in bit string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819f301006072a8648ce3d020106052b8104002303818a2004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d5001020304\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 479\n# unused bits in empty bit-string\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 3015301006072a8648ce3d020106052b81040023030103\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n# tcId = 480\n# 128 unused bits\nprivate = 018c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5\npublic = 30819b301006072a8648ce3d020106052b810400230381868004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50\nresult = acceptable\nshared = 00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5\nflags = InvalidAsn\n\n",
 };
-static const size_t kLen115 = 112343;
+static const size_t kLen131 = 112343;
 
-static const char *kData115[] = {
+static const char *kData131[] = {
     "# Imported from Wycheproof's ecdsa_secp224r1_sha224_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[key.wx = 00eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7]\n[key.wy = 00eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[sha = SHA-224]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf38788e1b7770b18fd1aa6a26d7c6dc\n\n# tcId = 2\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = MissingZero\n\n# tcId = 3\n# valid\nmsg = 313233343030\nresult = valid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 4\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30813d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 5\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 8\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 9\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 10\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 11\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 12\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 13\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 14\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d028070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 18\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 19\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 20\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 21\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f0000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 22\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 23\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042498177303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30412500303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30422221498177021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304122202500021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045221e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0004deadbeef021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2222498177021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a22212500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a221f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045aa00bb00cd00303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043aa02aabb303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30452224aa00bb00cd00021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig",
     " = 30432222aa02aabb021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2225aa00bb00cd00021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2223aa02aabb021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 39\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30412280021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30412280031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 46\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 323d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 52\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 53\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 3041300102303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 56\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\nflags = BER\n\n# tcId = 57\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636100\n\n# tcId = 58\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636105000000\n\n# tcId = 59\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361060811220000\n\n# tcId = 60\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000fe02beef\n\n# tcId = 61\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610002beef\n\n# tcId = 62\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f3000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 63\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463613000\n\n# tcId = 64\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 3040021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361bf7f00\n\n# tcId = 65\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 66\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 301e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a\n\n# tcId = 67\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 305c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303e02811c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02811d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 70\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f0282001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0282001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021d70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021e00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 75\n#",
     " wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30420285010000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285010000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3046028901000000000000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3046021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028901000000000000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304102847fffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02847fffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30410284ffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 83\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0284ffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30420285ffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 85\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285ffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30450288ffffffffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 87\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0288ffffffffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d02ff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 89\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02ff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 90\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 301f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302002021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 92\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 301f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 94\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e000070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 96\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f000000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\nflags = BER\n\n# tcId = 97\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 99\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30210281021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 101\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0281\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30210500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 103\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d011c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 107\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d041c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 108\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303dff1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 109\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 110\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a011d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 111\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 112\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a041d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 113\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480aff1d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30210200021d0",
@@ -3241,9 +3340,9 @@
     "a5f8b89bbb2a7e667aff81cd]\n[sha = SHA-224]\n\n# tcId = 321\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n# tcId = 322\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[key.wx = 4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466]\n[key.wy = 00ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[sha = SHA-224]\n\n# tcId = 323\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c2770403d42b7b45e553308d1f6a480640b61cac0ae36665d6f14d34e021d0085506b0404265ededf9a89fc7c9c7a55c16c5b0d781f774de8f46fa1\n\n# tcId = 324\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00b68da722bbba7f6a58417bb5d0dd88f40316fc628b0edfcb0f02b062021c5c742e330b6febadf9a12d58ba2a7199629457ef2e9e4cecd2f09f50\n\n# tcId = 325\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c01ec1ff15c8a55d697a5424d674753f82f711593828368d2fbb41a17021c20d9089db7baf46b8135e17e01645e732d22d5adb20e3772da740eee\n\n# tcId = 326\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c3e46e9ba4dc089ff30fa8c0209c31b11ff49dbeec090f9f53c000c75021c6f2e3b36369416602bca83206809ed898fcf158a56c25a5474143f68\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[key.wx = 00aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf]\n[key.wy = 008a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[sha = SHA-224]\n\n# tcId = 327\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c77b38da37079d27b837613ac3e8248d66eabd5d637076c8e62c7991e021d00d40cd9f81efc52db4429c0c1af7c1d8a22b6c7babbe7fbd8b5b3f02f\n\n# tcId = 328\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008c03b32c166c0c8b99d7f876acd109447efb13f6b82945e78d51a269021c657568f1a0a8bd7df5ffa43097ebb2b64435c8e3335bcaafc63f9ed5\n\n# tcId = 329\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00d199a375253d30f1d2b4493542e9934f9f1f8b0680117679f5bc4ad2021c11419ddbf02c8ad5f518f8dac33f86a85e777af51a034132e2767a6d\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[key.wx = 00bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1]\n[key.wy = 73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[sha = SHA-224]\n\n# tcId = 330\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008ff82699e2e82870be9cfdd8a408bb34f8f38a83a4ac8370f18f2bc8021c7e5008fab6a0d4159200077ef9918dad6592cd8359838852c636ac05\n\n# tcId = 331\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c3f3b60b529ae0f950c517264adf2e481616bc47416742d5103589660021d00f731ebe98e58384b3a64b4696d4cc9619828ad51d7c39980749709a6\n\n# tcId = 332\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00dc11ffdc6b78754a335f168c4033916a2158d125a3f4fed9dc736661021c6dd84364717d9f4b0790f2b282f9245ecb316874eac025600397f109\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[key.wx = 26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000]\n[key.wy = 00eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[sha = SHA-224]\n\n# tcId = 333\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00a59b25b786d55f26b04dfe90ee02a6bde64ed6e431dc9fbdc3ab360e021d00fc14b5ad20f39da9900e35437936c8626fccf6632e7a3d9e587e3311\n\n# tcId = 334\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2eda1f96c1a6e3ad8a3321ce82cbb13a5b935b501abf6c06f7fd2b3f021d00e81050c3e5f53a3c7b9d0bdb9ed92a326dfeac44791ba1abe4d6e973\n\n# tcId = 335\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c60f5e093fda08fc14ac99d820a18ad1370c58150bea0aca24fc6db9d021d00c2220a0ebbf4896e68fdb5bd824f88291c1c862b916f9c4af87f8f5f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[key.wx = 00ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff]\n[key.wy = 41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[sha = SHA-224]\n\n# tcId = 336\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2ead37846a5e36a490b75140bdc7b636c6e9f6d8f980f6fadb08f769021d00e1fe130ae1798c196d7be62c7a5ddb3168cf4b8d48b6b6b4dc94ab3b\n\n# tcId = 337\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a8a4c9416d72c860573d073281cb08c86ad65313f06b15a329e82eb2021c5a6edd2f0816b7263d915d72c67d50a854e3abee5cde1b679a0cef09\n\n# tcId = 338\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c576bb86c517bfecdc930a4c8501725548d425afbb96d93f5c1e2a0e1021c77248c5ecd620c431438c50e6bee6858091b54a87f8548ae35c21027\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[sha = SHA-224]\n\n# tcId = 339\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c34e41cba628fd8787ba1a528f6015d2cae015c1c9a866e08a7133801021d0083d422ffdd99cc3c6d7096ef927f0b11988d1824e6e93840ff666ccd\n\n# tcId = 340\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c2558a42e79689244bccd5e855f6a1e42b4ff726873f30b532b89ef53021c07f9bd947785187175d848b6e2d79f7ab3bbc1087b42590b0cfb256a\n\n# tcId = 341\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00d5fe7dd5fb4fd1ea5ce66c0824f53f96ce47fd9b6c63b4d57827fd17021d00bce5bc3af705afaacb81bfa6d552d6198962fece9fba41546c602ddc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a9",
     "92b9a4a0e0ce178d20c]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 00ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[sha = SHA-224]\n\n# tcId = 342\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008c1da2f07cdcbce4db8067b863468cfc728df52980229028689e57b6021c32175c1390a4b2cab6359bab9f854957d4fd7976c9c6d920c871c051\n\n# tcId = 343\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e46d4f11b86b5a12f6fe781d1f934ef2b30e78f6f9cc86a9996e20c0021d008351974b965526034a0ccef0e7d3bc13d91798151488c91533143f7b\n\n# tcId = 344\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c305ccf0b5d0cf33dc745bb7c7964c233f6cfd8892a1c1ae9f50b2f3f021c785f6e85f5e652587c6e15d0c45c427278cf65bb1429a57d8826ca39\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[key.wx = 00f7e4713d085112112c37cdf4601ff688da796016b71a727a]\n[key.wy = 00de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[sha = SHA-224]\n\n# tcId = 345\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c0e4fde0ac8d37536505f7b8bdc2d22c5c334b064ac5ed27bea9c179e021d00c4d6bf829dd547000d6f70b9ad9e9c1503bebcf1d95c2608942ca19d\n\n# tcId = 346\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00818afcaf491da9d08a7cc29318d5e85dce568dcca7018059f44e9b7e021d00bf32a233d5fc6ed8e2d9270b1bdad4bbd2a0f2c293d289bd91ffbcf3\n\n# tcId = 347\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c0e05ed675c673e5e70a4fdd5a47b114c5d542d4f6d7a367597d713ea021c26d70d65c48430373363987810bdcc556e02718eab214403ae008db4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[key.wx = 00ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725]\n[key.wy = 0086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[sha = SHA-224]\n\n# tcId = 348\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00ab7a19eecf63e9668278963b65236b2768e57cae0e268cb86a0ddda1021d008829f5d3a3394f9467ba62e66ef1768e3e54f93ed23ec962bc443c2e\n\n# tcId = 349\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c17111a77cf79bead456ed86a7d8a935531440281eb8b15a885e341c0021d00fdc3958d04f037b1d4bb2cee307b5201be062e0d4e089df1c1917668\n\n# tcId = 350\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00acafa1e33345eeba0c338c2204b4cd8ba21de7ec3e1213317038e968021c0b42fbbaeda98a35da0de4c79546f3a0f7d9dec275d2cd671f93c874\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[sha = SHA-224]\n\n# tcId = 351\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a3fe71a2a56f554e98fd10a8098c2a543c98bc6b3602ef39f2412308021c5d1d68f9a870ef2bc87484b3386549fae95811ab72bc0e3a514720da\n\n# tcId = 352\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c132f7625704756c13f2bfa449e60952f836f4904660b5b1da07e5a9f021d0082b4abafc40e8fd19b0c967f02fff152737ce01153658df445c4d7b7\n\n# tcId = 353\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00f36a8347c6fe0397a1161a364cbc4bdfb4d8b7894cbaa6edc55a4ff7021d009c9c90515da5e602d62e99f48eac414e913dd0b7cbf680c1a5399952\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 00fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[sha = SHA-224]\n\n# tcId = 354\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2125ecc08e52e9e39e590117de2145bd879626cb87180e52e9d3ce03021d008f7e838d0e8fb80005fe3c72fca1b7cc08ed321a34487896b0c90b04\n\n# tcId = 355\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e485747ac2f3d045e010cdadab4fd5dbd5556c0008445fb73e07cd90021d00e2133a7906aeac504852e09e6d057f29ab21368cfc4e2394be565e68\n\n# tcId = 356\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a4de0d931ddab90e667ebc0ad800ce49e971c60543abdc46cefff926021c550816170bd87593b9fb8ad5ed9ab4ddb12403ff6fe032252833bac4\n\n",
 };
-static const size_t kLen116 = 118159;
+static const size_t kLen132 = 118159;
 
-static const char *kData116[] = {
+static const char *kData132[] = {
     "# Imported from Wycheproof's ecdsa_secp224r1_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[key.wx = 00eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7]\n[key.wy = 00eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[sha = SHA-256]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3c1bab8864e5e03a5011eeba8150bc\n\n# tcId = 2\n# valid\nmsg = 313233343030\nresult = valid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 3\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30813c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 4\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 5\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 7\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 8\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 9\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 10\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 11\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 12\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 13\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 14\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303c02803ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040280617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 17\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 18\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 19\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 20\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e0000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 21\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 22\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500\n\n# tcId = 23\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041498177303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30402500303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30412221498177021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304022202500021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3044221e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040004deadbeef021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042221498177021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0422202500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04221e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef\n\n# tcId = 32\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3044aa00bb00cd00303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3042aa02aabb303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30442224aa00bb00cd00021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30422222aa02aabb021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042224aa00bb00cd00021c6",
     "17d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3042021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042222aa02aabb021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 38\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 39\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30402280021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 42\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30402280031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 45\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 46\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 323c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 51\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 52\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 3040300102303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 53\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 55\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\nflags = BER\n\n# tcId = 56\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98100\n\n# tcId = 57\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98105000000\n\n# tcId = 58\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981060811220000\n\n# tcId = 59\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000fe02beef\n\n# tcId = 60\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810002beef\n\n# tcId = 61\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e3000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 62\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9813000\n\n# tcId = 63\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 303f021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981bf7f00\n\n# tcId = 64\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 65\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 301e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04\n\n# tcId = 66\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 305a021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 67\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d02811c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402811c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 69\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303e0282001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 70\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040282001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 71\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021d3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 75\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30410285010000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c",
     "800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285010000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 77\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3045028901000000000000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3045021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04028901000000000000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 79\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304002847fffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402847fffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 81\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30400284ffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040284ffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 83\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30410285ffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285ffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 85\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30440288ffffffffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040288ffffffffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 87\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c02ff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402ff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 89\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 301e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 90\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 301f02021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 301f021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402\n\n# tcId = 92\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 94\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021e00003ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e0000617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\nflags = BER\n\n# tcId = 96\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 97\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500\n\n# tcId = 99\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30200281021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040281\n\n# tcId = 101\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30200500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500\n\n# tcId = 103\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c011c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c041c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 107\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303cff1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 108\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 109\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04011c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 110\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 111\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04041c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 112\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04ff1c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 113\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30200200021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040200\n\n# tcId = 115\n# using composition for integer\nmsg = 313233343030\nresult = invalid\nsig = 3040222002013a021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 116\n# using ",
@@ -3260,9 +3359,9 @@
     "d = 356\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c519bf185ff4635271961fa491be257231deeea9c53a6ede3b4a89ed1021c486bdad484a6a3134e1471cf56a9df0fac50f773b3e37d6f327617d7\n\n# tcId = 357\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c09fd644898b7cb5d018b52234e7b4ef2b54789afd0ce9c434e9e5515021d00f19309532164ea2053cae55df7bdcbab536c83ea7bfe6fe10d60c1ab\n\n# tcId = 358\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00ec919d4e283ccf1f71a9e3c0f781a36758d3f38b1b78a87a74288e80021c4c4663044a73c79bd88f0dc245ab1a32f89f06f40a704b31e9fabc51\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[key.wx = 00bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1]\n[key.wy = 73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[sha = SHA-256]\n\n# tcId = 359\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00c51760478447217597ecc6f4001bd45088d53c90f53103608bf88aea021d00a201253aa903f9781e8992101d7171d2dd3a5d48c44d8e1d544cd6d7\n\n# tcId = 360\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c76be0112674ec29128823e1af7512e6143872fef30a64e2f1799bd56021c187e503e1a48c27b549fe0a4ce5e581e242c8663fc9efb02d6f2b193\n\n# tcId = 361\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c36245ef126b5b51e459f84eaaad5a495061f0471dc8c23f1c5f16282021c39e31d72a06ba8e14fcf95778e07bc16a2628e39449da8857d506edc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[key.wx = 26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000]\n[key.wy = 00eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[sha = SHA-256]\n\n# tcId = 362\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c258682975df8bca7f203f771ebeb478ef637360c860fc386cfb21745021c7663e70188047e41469a2a35c8c330dd900f2340ba82aafd22962a96\n\n# tcId = 363\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d0085c98614f36c0d66f8d87834cae978611b7b4eebf59a46bea1b89ae9021d00d1a18e378dda840e06b60f6279bf0a2231d9fa2d8d2c31e88bc1bdd7\n\n# tcId = 364\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00ca7b7432ba41ff2112e1116fffde89bbd68f5ce67fe5513d16c8e6f7021d00e421b7599e0180798acc2006451603cda2db1d582741116e6033ce5f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[key.wx = 00ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff]\n[key.wy = 41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[sha = SHA-256]\n\n# tcId = 365\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c19397fe5d3ecabf80fc624c1bf379564387517c185087dc97d605069021c33b5773e9aaf6c34cb612cfc81efd3bf9c22224e8c4fa1bfccf5c501\n\n# tcId = 366\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c70f24f5c164164bfbb8459aa12a981aa312dbcf00204326ebaaabdc8021d00f5cebee8caedae8662c43501665084b45d2f494fb70d603043543dc4\n\n# tcId = 367\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c0bf2d86ecaa8b56aca5e8f8ebcb45081d078a14555b75f5be8e9b132021d009a55b3ce4734849966b5034ccd9b19f76407ee0241c3f58e7b8fc89a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[sha = SHA-256]\n\n# tcId = 368\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00bfc5dc4434cd09369610687d38d2d418b63fd475dea246a456b25a3a021d00b171dfa6cf722f20816370a868785da842b37bac31d7b78e6751fc50\n\n# tcId = 369\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d008fdbe8da646c5642d767c7dbeb3872b1edab6e37365805f0e94ce0a9021d00bcf35ab81222883dd3526cb0cf93138f4687cd0b10c2b0a126385161\n\n# tcId = 370\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e23a11275848fd4f8b6f4ac4fc305eae981d3b7dc453e5a980c46422021c1a875693f24a03ea1614c4c3bbd0dd7221429f22b337ea7d98348ca4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 00ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[sha = SHA-256]\n\n# tcId = 371\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c76645164ff9af3a1a9205fda2eef326d2bffc795dcc4829547fe01dd021d00b65bba503719314b27734dd06b1395d540af8396029b78b84e0149eb\n\n# tcId = 372\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c32fa0ca7e07f1f86ac350734994e1f31b6da9c82f93dced2b983c29c021c7b7891282206a45711bdfcb2a102b5d289df84ff5778548603574004\n\n# tcId = 373\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2d5492478ca64e5111dfd8521867b6477b7e78227849ad090b855694021d00a532f5a2fa3594af81cd5928b81b4057da717be5fb42a3a86c68190d\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[key.wx = 00f7e4713d085112112c37cdf4601ff688da796016b71a727a]\n[key.wy = 00de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[sha = SHA-256]\n\n# tcId = 374\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c191eee5daf55cd499e8539cb2cff797cfec5d566d2027bf9f8d64693021d00dadfeae8131f64d96b94fd340197caa2bc04818554812feef3343070\n\n# tcId = 375\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e0e2c08180b8a207ee9105a7d379fa112368e8370fa09dfde4a45c45021d00c717bc0860e016e7ce48f8fe6a299b36906a6055adad93b416ce8838\n\n# tcId = 376\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c1b919ef93532292743bb2e1b7b4894fd847c6e5de52a08e1b0f2dcfb021d00c2d30d6b7594d8dbd261491ae1d58779505b075b64e5564dc97a418b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242",
     "a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[key.wx = 00ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725]\n[key.wy = 0086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[sha = SHA-256]\n\n# tcId = 377\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e75db49ed33ff2885ea6100cc95b8fe1b9242ea4248db07bcac2e020021c796c866142ae8eb75bb0499c668c6fe45497692fbcc66b37c2e4624f\n\n# tcId = 378\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c1f81cd924362ec825890307b9b3936e0d8f728a7c84bdb43c5cf0433021c39d3e46a03040ad41ac026b18e0629f6145e3dc8d1e6bbe200c8482b\n\n# tcId = 379\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c00fda613aa67ca42673ad4309f3f0f05b2569f3dee63f4aa9cc54cf3021c1e5a64b68a37e5b201c918303dc7a40439aaeacf019c5892a8f6d0ce\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[sha = SHA-256]\n\n# tcId = 380\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00b932b3f7e6467e1ec7a561f31160248c7f224550a8508788634b53ce021d00a0c5312acf9e801aff6d6fc98550cfa712bbf65937165a36f2c32dc9\n\n# tcId = 381\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e509593fb09245ee8226ce72786b0cc352be555a7486be628f4fd00c021c0b7abde0061b1e07bf13319150a4ff6a464abab636ab4e297b0d7633\n\n# tcId = 382\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c6e54f941204d4639b863c98a65b7bee318d51ab1900a8f345eac6f07021c0da5054829214ecde5e10579b36a2fe6426c24b064ed77c38590f25c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 00fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[sha = SHA-256]\n\n# tcId = 383\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d0085ea4ab3ffdc992330c0ca8152faf991386bce82877dbb239ba654f6021c0806c6baf0ebea4c1aaa190e7d4325d46d1f7789d550632b70b5fc9b\n\n# tcId = 384\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c44d53debb646b73485402eab2d099081b97b1243c025b624f0dd67ea021d00e5de789a7d4b77eac6d7bba41658e6e4dc347dabed2f9680c04a6f55\n\n# tcId = 385\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c1526eb2f657ebea9af4ca184b975c02372c88e24e835f3f5774c0e12021c1f1ecce38ee52372cb201907794de17b6d6c1afa13c316c51cb07bc7\n\n",
 };
-static const size_t kLen117 = 132917;
+static const size_t kLen133 = 132917;
 
-static const char *kData117[] = {
+static const char *kData133[] = {
     "# Imported from Wycheproof's ecdsa_secp224r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[key.wx = 00eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7]\n[key.wy = 00eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c394766fb67a65fe0af6c154f7cbd285ea180b4c6150cdafafb0f6f0f\n\n# tcId = 2\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021cc6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = MissingZero\n\n# tcId = 3\n# valid\nmsg = 313233343030\nresult = valid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 4\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30813d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 5\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 8\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 9\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 10\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 11\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 12\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 13\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 14\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d0280691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab028000c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 18\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 19\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 20\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 21\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f0000021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 22\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 23\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0500\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042498177303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30412500303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0004deadbeef\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30422221498177021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304122202500021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045221e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0004deadbeef021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2222498177021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab22212500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab221f021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0004deadbeef\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045aa00bb00cd00303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043aa02aabb303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30452224aa00bb00cd00021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig",
     " = 30432222aa02aabb021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2225aa00bb00cd00021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2223aa02aabb021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 39\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30412280021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2280021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080313d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30412280031c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2280031d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 46\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 313d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 323d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 52\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 53\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 3041300102303c1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 56\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\nflags = BER\n\n# tcId = 57\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e00\n\n# tcId = 58\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e05000000\n\n# tcId = 59\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e060811220000\n\n# tcId = 60\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000fe02beef\n\n# tcId = 61\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0002beef\n\n# tcId = 62\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f3000021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 63\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e3000\n\n# tcId = 64\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 3040021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2ebf7f00\n\n# tcId = 65\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 66\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 301e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab\n\n# tcId = 67\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 305c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303e02811c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02811d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 70\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f0282001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0282001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021d691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021b691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021e00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 75\n#",
     " wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30420285010000001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0285010000001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3046028901000000000000001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3046021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab028901000000000000001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304102847fffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02847fffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30410284ffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 83\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0284ffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30420285ffffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 85\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0285ffffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30450288ffffffffffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 87\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0288ffffffffffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d02ff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 89\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02ff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 90\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 301f021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302002021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 92\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 301f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 94\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e0000691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 96\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f000000c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\nflags = BER\n\n# tcId = 97\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 99\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0500\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30210281021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 101\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0281\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30210500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 103\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3020021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0500\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d011c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d031c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 107\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d041c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 108\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303dff1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 109\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 110\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab011d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 111\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab031d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 112\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab041d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 113\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92abff1d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30210200021d0",
@@ -3281,9 +3380,9 @@
     "ef6fa778b19dccd609d496b62a211021c6c51e846fa53d03d42f798e6bb90954f9a48c1794b47e84ac97b460a\n\n# tcId = 430\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021b34befa1d25b756ce76b383a6e8753741c12a59266c2c7921ff6e8b021d00bc44e3823e4d807cbc92fa786a89e62a4b217b5fb0c0f1865d4a7e43\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[key.wx = 26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000]\n[key.wy = 00eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[sha = SHA-512]\n\n# tcId = 431\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c224a38e733ebd3fac274ecc50ecef2e7c3189be2b9d093a8dcc6fa3a021c134fa5a4f923d296b3c6dd4683d249ccf0ad272890e4149c9a0d7415\n\n# tcId = 432\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c338d07d990879ad844e24c1788e362269d8aca70500357d385768227021d00f745cc4ebaaf1cd42830026a66e5b95564cdbee5edf853bb2cc91259\n\n# tcId = 433\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c689fce4b33d8212a663640a1ae0efaa7a7d7711beba719374fe634ee021c04bd9981fa52293063076f0fd70fc31875d580ef94f020d2f95440e0\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[key.wx = 00ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff]\n[key.wy = 41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[sha = SHA-512]\n\n# tcId = 434\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c2a4287e01510e7fb5fed2e1ccc3f2a6929cf7d03850e49d7ae8a504a021c355c3915f3fa9637dc8001438a8c04e15d14934cabd430feb0cb5ba5\n\n# tcId = 435\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00b5bf795a38adb052b401468ffcab81103d2d9fca2e15b8d08ab98ce8021c5ec0d2c6aec71888c941af324c7272bec192abb292f9df82a24e8a41\n\n# tcId = 436\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c100ed07f467133bf10917f7a15ab2bfda519bdbc2653b95955e22211021d00b38a081f7c2e2b775d1da868d0381c09ba1559c9613b5be7159363ad\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[sha = SHA-512]\n\n# tcId = 437\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c54e6add8ac910e52c6228fe3980d8f586218334d8d859ba9a3329917021c5836cc79ec88519eab4a6b2614c501628c9fee32fbafd93e32158409\n\n# tcId = 438\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c1230d5409f379584b4d548b7bccba64baf81d512a9f2e6398c4e3a66021c1937a298f8cbdfa85b8e6fcf0a12be4966d80270cade85a0c37ee6f3\n\n# tcId = 439\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00862f43b044fb32adb45e00378ba083ae761c84452054f17b1341bf5b021d0095d8d8e5e3a6cc2b0a06c792252ca11a642257721831578520f96b9e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 00ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[sha = SHA-512]\n\n# tcId = 440\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00cb5cabb1ca01b847a6bc70558d1e5d3a204d1741bbe800f4b159af35021c3580cc85f218394130bddf1c4eac04fe96f59f14fb436686950398be\n\n# tcId = 441\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00c9d83dc04cf4ee89c405045d0fd1d704f627ca5bbe350f40b826bbc1021c74fedc9e55045e9759f2124460fdfb991dc620cfee6effc0b4adaa9e\n\n# tcId = 442\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c46dd65b6e7f10c0841841b01033a5befd3a0e78c85f1f390bb3cdf25021d00f33acea3d47cf0dd5273735b004104f6512ed641052509422c0325a7\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[key.wx = 00f7e4713d085112112c37cdf4601ff688da796016b71a727a]\n[key.wy = 00de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[sha = SHA-512]\n\n# tcId = 443\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00ddb4a7e400a1e98118f474722da3f421f65a76eec61f4f7b699faf07021d00db80cba199859cdfe916d6ab3deb91d76aaf0ed554c8f9ed7e5aa59d\n\n# tcId = 444\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c4c260b546280604e4c80384721c9e803ef704e7fb70168e6730fc1f3021d00a8aceae219ac25c9f04231b4e0c171413db1d26df1c1e8430062eb2b\n\n# tcId = 445\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00f4098d2c0240e78fceabb0183df0b39e7ad3e7f5d6da1587fa09853c021d00d42412b2abaa614c95eb11f9b9346282ce3a1c93aac35ce7aa372f4a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[key.wx = 00ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725]\n[key.wy = 0086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[sha = SHA-512]\n\n# tcId = 446\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c48ddc497f9a4732c677e46c0e2bdabec54fc9d27e46ab595056db4d9021d00b8219ebbfaebc2fe4311efab0c35d4392751351bcc1971e8d01941e4\n\n# tcId = 447\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e1abaf51d27a6d7d4c9b28078325cac2d7ce3d5403916c68903760b7021c2c45a99e2770f782fee5ca1d713eaecf07e62d53c64b7cf93de9900d\n\n# tcId = 448\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00868cd127c99e1149f7fc8d878cdfa986b62e99addea281149611ff15021c16e5953820135b7d462ce5434ef85920e973eec9e4d14d7cb3cc2a3f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[sha = SHA-512]\n\n# tcId = 449\n# y-coordinate of the publ",
     "ic key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00a375929718ec4e6ada9c9370c51df6bdaee7ebab2a70675d42a0b6b3021d009eaf4802efaf7ca082ffbf5ed774af43792d9b3fd711c6b1c36112ff\n\n# tcId = 450\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00d97b32f3bf8bc11ec2672dd6320418beeed99527a63fe4c52199ec61021c68dd9006b03319ccbe651d0bdaf84c63356f03cb007a6865ee3e0206\n\n# tcId = 451\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008ee5794dc2e66f2584910ea1d8361e5b53db535adcf5c1c35e128309021c5d1d8b9b996c0a488e05af14421b86e9841f0cba706027fc827d4d95\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = EcPublicKey]\n[key.uncompressed = 04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[key.wx = 00b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 00fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[sha = SHA-512]\n\n# tcId = 452\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c7999727c0cc02d88ef274012a762afcbb19e7fce19091a02acd00564021d00dbfacf67999f22c499d48a60a6fe4bbb746199c29957a1ec7a0900e0\n\n# tcId = 453\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c5797c21c0162e42f69693c6c0244dfdf9218c01e9235760177b61a54021c5452c887b27fb342a8a00d27579c7195dddb73df399233ed0dea567b\n\n# tcId = 454\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c0eb9dc5d67bb0d4009544f8654977907dfe770e7fae4571d31d7b4fa021d00ab5cda53e868bff5198be4be3681b186cb0c1396d272c71f093f8b12\n\n",
 };
-static const size_t kLen118 = 131736;
+static const size_t kLen134 = 131736;
 
-static const char *kData118[] = {
+static const char *kData134[] = {
     "# Imported from Wycheproof's ecdsa_secp256r1_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[key.wx = 2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838]\n[key.wy = 00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[sha = SHA-256]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76\n\n# tcId = 2\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = MissingZero\n\n# tcId = 3\n# valid\nmsg = 313233343030\nresult = valid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 4\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 5\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 8\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 9\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 10\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 11\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 12\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 13\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 14\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 18\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 19\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 20\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 21\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 22\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 23\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac",
     "5df4087c134b49156847db\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 39\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 46\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 52\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 53\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 56\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\nflags = BER\n\n# tcId = 57\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00\n\n# tcId = 58\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000\n\n# tcId = 59\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000\n\n# tcId = 60\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef\n\n# tcId = 61\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef\n\n# tcId = 62\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 63\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000\n\n# tcId = 64\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 304802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dbbf7f00\n\n# tcId = 65\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 66\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18\n\n# tcId = 67\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 70\n# length of integer con",
     "tains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 75\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 83\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 85\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 87\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 89\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 90\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 92\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 94\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 96\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\nflags = BER\n\n# tcId = 97\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 99\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 101\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 103\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b4",
@@ -3302,9 +3401,9 @@
     "6082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000]\n[sha = SHA-256]\n\n# tcId = 367\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd\n\n# tcId = 368\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3\n\n# tcId = 369\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[key.wx = 3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935]\n[key.wy = 7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[sha = SHA-256]\n\n# tcId = 370\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519\n\n# tcId = 371\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336\n\n# tcId = 372\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[key.wx = 2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff]\n[key.wy = 00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[sha = SHA-256]\n\n# tcId = 373\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929\n\n# tcId = 374\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5\n\n# tcId = 375\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[key.wx = 00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5]\n[key.wy = 5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[sha = SHA-256]\n\n# tcId = 376\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41\n\n# tcId = 377\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba\n\n# tcId = 378\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[key.wx = 03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e]\n[key.wy = 1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[sha = SHA-256]\n\n# tcId = 379\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3\n\n# tcId = 380\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a\n\n# tcId = 381\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[key.wx = 00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[sha = SHA-256]\n\n# tcId = 382\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff\n\n# tcId = 383\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0\n\n# tcId = 384\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[key.wx = 00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[sha = SHA-256]\n\n# tcId = 385\n# y-coordinate of the public key is large\nmsg ",
     "= 4d657373616765\nresult = valid\nsig = 3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224\n\n# tcId = 386\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469\n\n# tcId = 387\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9\n\n",
 };
-static const size_t kLen119 = 147510;
+static const size_t kLen135 = 147510;
 
-static const char *kData119[] = {
+static const char *kData135[] = {
     "# Imported from Wycheproof's ecdsa_secp256r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[key.wx = 2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838]\n[key.wy = 00c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002205f85a63a5be977ad714cea16b10035f07cadf7513ae8cca86f35b7692aafd69f\n\n# tcId = 2\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = MissingZero\n\n# tcId = 3\n# valid\nmsg = 313233343030\nresult = valid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 4\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30814502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 5\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 8\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 9\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 10\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 11\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 12\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 13\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 14\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502802478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 18\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 19\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 20\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 21\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047000002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 22\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 23\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a498177304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492500304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a222549817702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492224250002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d222202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00004deadbeef022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02226498177022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c022252500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02223022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304daa00bb00cd00304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c",
     "2ed1dc84841359d1b34eb2\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304baa02aabb304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d2228aa00bb00cd0002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b2226aa02aabb02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02229aa00bb00cd00022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02227aa02aabb022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 39\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3049228002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3049228003202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280032100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 46\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 324502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 52\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 53\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 30493001023044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 56\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\nflags = BER\n\n# tcId = 57\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb200\n\n# tcId = 58\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb205000000\n\n# tcId = 59\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2060811220000\n\n# tcId = 60\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000fe02beef\n\n# tcId = 61\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20002beef\n\n# tcId = 62\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047300002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 63\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb23000\n\n# tcId = 64\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 304802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2bf7f00\n\n# tcId = 65\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 66\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 302202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0\n\n# tcId = 67\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 306802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30460281202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002812100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 70\n# length of integer con",
     "tains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3047028200202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00282002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502212478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3045021f2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022200a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 75\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304a028501000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285010000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304e02890100000000000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304e02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028901000000000000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902847fffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002847fffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30490284ffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 83\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00284ffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 84\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a0285ffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 85\n# length of integer = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285ffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 86\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d0288ffffffffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 87\n# length of integer = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00288ffffffffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 88\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502ff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 89\n# incorrect length of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002ff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 90\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 3023022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 91\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302402022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 92\n# lonely integer tag\nmsg = 313233343030\nresult = invalid\nsig = 302302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002\n\n# tcId = 93\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 94\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000\n\n# tcId = 95\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3047022200002478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 96\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00223000000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\nflags = BER\n\n# tcId = 97\n# appending unused 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 98\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 99\n# appending null value to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500\n\n# tcId = 100\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30250281022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 101\n# truncated length of integer\nmsg = 313233343030\nresult = invalid\nsig = 302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00281\n\n# tcId = 102\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30250500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 103\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500\n\n# tcId = 104\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304500202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 105\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304501202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2\n\n# tcId = 106\n# changing tag value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304503202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc8484135",
@@ -3325,9 +3424,9 @@
     "b1022064a83af0ab3e6037003a1f4240dffd8a342afdee50604ed1afa416fd009e4668\n\n# tcId = 439\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 30450220575b70b4375684291b95d81e3c820ed9bde9e5b7343036e4951f3c46894a6d9d022100f10d716efbfeba953701b603fc9ef6ff6e47edef38c9eeef2d55e6486bc4d6e6\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[key.wx = 3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935]\n[key.wy = 7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[sha = SHA-512]\n\n# tcId = 440\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 30450221008d4f113189dfd3d3239e331f76d3fca9cef86fcd5dc9b4ab2ca38aeba56c178b022078389c3cf11dcff6d6c7f5efd277d480060691144b568a6f090c8902557bfc61\n\n# tcId = 441\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100834d10ec2d2d50eeebfecd6328f03fafbb488fc043c362cbc67880ec0ebd04b302210094c026feaf6e68759146fe5b6fd52eaa3c3c5552d83719d2cb900615e2a634db\n\n# tcId = 442\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304502206894de495e7bb5566807d475d96a0d414a94f4f02c3ab7c2edc2916deafc1e1f022100a603642c20fabc07182867fcc6923d35be23ad3f97a5f93c6ec5b9cce8239569\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[key.wx = 2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff]\n[key.wy = 00a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[sha = SHA-512]\n\n# tcId = 443\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100e500c086fedd59e090ce7bfb615751ed9abe4c09b839ee8f05320245b9796f3e022100807b1d0638c86ef6113fff0d63497800e1b848b5a303a54c748e45ca8f35d7d7\n\n# tcId = 444\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100b922c1abe1a8309c0acf90e586c6de8c33e37057673390a97ff098f71680b32b022100f86d92b051b7923d82555c205e21b54eab869766c716209648c3e6cc2629057d\n\n# tcId = 445\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100823c37e46c74ec8497d89245fde3bf53ddb462c00d840e983dcb1b72bbf8bf27022100c4552f2425d14f0f0fa988778403d60a58962e7c548715af83b2edabbb24a49f\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[key.wx = 00fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5]\n[key.wy = 5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[sha = SHA-512]\n\n# tcId = 446\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30450220577a08a95db6dcda9985109942d3786630f640190f920b95bd4d5d84e0f163ef022100d762286e92925973fd38b67ef944a99c0ec5b499b7175cbb4369e053c1fcbb10\n\n# tcId = 447\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 304402207ba458cfe952326922c7aa2854bdc673ce3daaf65d464dfb9f700701503056b102200df8821c92d20546fa741fb426bf56728a53182691964225c9b380b56b22ee6d\n\n# tcId = 448\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 304402205cd60c3b021b4be116f06f1d447f65e458329a8bbae1d9b5977d18cf5618486102204c635cd7aa9aebb5716d5ae09e57f8c481a741a029b40f71ec47344ef883e86e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[key.wx = 03fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e]\n[key.wy = 1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[sha = SHA-512]\n\n# tcId = 449\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304402204b50e1e8cf830e04c17e7472caf60da8150ffa568e2c64498cc972a379e542e502202e3adaa5afab89cca91693609555f40543578852cde29c21cb037c0c0b78478e\n\n# tcId = 450\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304402205aea930c7d8fffcd5c6df2c9430ef76f8b5ed58a8b9c95847288abf8f09a1ac202207ddfef7688a6053ce4eeeeefd6f1a9d71381b7548925f6682aa0a9d05cf5a3a3\n\n# tcId = 451\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304602210098b092c2d14b5b14a23e9368e0ce1be744dfae9f9a5cdaba51e7872099df96f202210090d3e4f87bd7bc94589f8150b6b01045cd8759a00af78b24d7de771887610df5\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[key.wx = 00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[sha = SHA-512]\n\n# tcId = 452\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 30460221009e95f2856a9fff9a172b07817c8c60fe185cd3ce9582678f8cc4b02bc444621a022100c54ca51d8117d904f0d3773911cb2792348fae21c2da7dad25f990d122376e4c\n\n# tcId = 453\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100e77df8f9782696344c33de29ebdc9f8d3fcf463d950cdbe256fd4fc2fd44877e02210087028850c962cf2fb450ffe6b983981e499dc498fbd654fa454c9e07c8cb5ca8\n\n# tcId = 454\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100bd2dd6f5026d2b5ad7ead74bdf52b8cbcabc08facee0a1c8584658a85ed0c5dc02203e8543e819bdae47d872e29a85ba38addf3eaeaad8786d79c3fb027f6f1ff4bf\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = EcPublicKey]\n[key.uncompressed = 04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[key.wx = 00bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 00fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[sha = SHA-512]\n\n# tcId = 455\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100bd5c0294acc28c15c5d1ebc7274c9ca21a081c8a67da430a34a7fff1a564fabb02207ec103a2385b4ff38b47d306434e9091de24dc9f1a25967ee06f8a0a53ac0181\n\n# tcId = 456\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 304402203c7dbfb43dd80379ee2c23ad5472873a22c8a0179ac8f381ad9e0f193231dc1f02207cf8e07530ade503b3d43a84b75a2a76fc40763daed4e9734e745c58c9ae72d3\n\n# tcId = 457\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100b38ca4dac6d949be5e5f969860269f0eedff2eb92f45bfc02470300cc96dd52602201c7b22992bb1",
     "3749cc0c5bc25330a17446e40db734203f9035172725fc70f863\n\n",
 };
-static const size_t kLen120 = 168183;
+static const size_t kLen136 = 168183;
 
-static const char *kData120[] = {
+static const char *kData136[] = {
     "# Imported from Wycheproof's ecdsa_secp384r1_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[key.wx = 2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa]\n[key.wy = 4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[sha = SHA-384]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03995ca30240e09513805bf6209b58ac7aa9cff54eecd82b9f1\n\n# tcId = 2\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = MissingZero\n\n# tcId = 3\n# valid\nmsg = 313233343030\nresult = valid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 4\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 5\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30820065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 6\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 8\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30850100000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 9\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3089010000000000000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 10\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 11\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 12\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 13\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 14\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3065028012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 18\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 19\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 20\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 21\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30670000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 22\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 23\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a4981773065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306925003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3",
     "394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a2235498177023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306922342500023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306d2232023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70004deadbeef023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72236498177023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722352500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72233023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306daa00bb00cd003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306baa02aabb3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306d2238aa00bb00cd00023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306b2236aa02aabb023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72239aa00bb00cd00023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306b023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72237aa02aabb023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 39\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30803065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30692280023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30803165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30692280033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 46\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3265023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 52\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 53\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 306930010230643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 54\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 30643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 56\n# indefini",
     "te length\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\nflags = BER\n\n# tcId = 57\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8200\n\n# tcId = 58\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8205000000\n\n# tcId = 59\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82060811220000\n\n# tcId = 60\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000fe02beef\n\n# tcId = 61\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820002beef\n\n# tcId = 62\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30673000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 63\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f823000\n\n# tcId = 64\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 3068023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82bf7f00\n\n# tcId = 65\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 66\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 3032023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7\n\n# tcId = 67\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 308198023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 68\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306602813012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702813100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 70\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30670282003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70282003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\nflags = BER\n\n# tcId = 72\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023200e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 75\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 76\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306a0285010000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285010000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 78\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306e028901000000000000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306e023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028901000000000000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 80\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306902847fffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702847fffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 82\n# length of integer = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30690284ffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff4",
@@ -3350,9 +3449,9 @@
     "9023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 386\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[key.wx = 29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc]\n[key.wy = 009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[sha = SHA-384]\n\n# tcId = 387\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3064023032401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f02304326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753\n\n# tcId = 388\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100d7143a836608b25599a7f28dec6635494c2992ad1e2bbeecb7ef601a9c01746e710ce0d9c48accb38a79ede5b9638f3402310080f9e165e8c61035bf8aa7b5533960e46dd0e211c904a064edb6de41f797c0eae4e327612ee3f816f4157272bb4fabc9\n\n# tcId = 389\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30650230234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c023100cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf\n\n# tcId = 390\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306502305cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d023100bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[key.wx = 00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac]\n[key.wy = 00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[sha = SHA-384]\n\n# tcId = 391\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023007648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed02310099fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f\n\n# tcId = 392\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca44074102303970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2\n\n# tcId = 393\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30650230441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05023100dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[key.wx = 00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422]\n[key.wy = 00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[sha = SHA-384]\n\n# tcId = 394\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402303244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a65290230501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93\n\n# tcId = 395\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402305e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b02307e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955\n\n# tcId = 396\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306502306688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d023100aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[key.wx = 1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000]\n[key.wy = 00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[sha = SHA-384]\n\n# tcId = 397\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48023004cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae\n\n# tcId = 398\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a220230201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40\n\n# tcId = 399\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc202301fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[key.wx = 2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69]\n[key.wy = 00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300",
     "e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[sha = SHA-384]\n\n# tcId = 400\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023020fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81970231008141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16\n\n# tcId = 401\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f0230649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551\n\n# tcId = 402\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3064023023855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd023050f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[key.wx = 00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[sha = SHA-384]\n\n# tcId = 403\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a023100c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799\n\n# tcId = 404\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306402306ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0023032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835\n\n# tcId = 405\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc502304a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[key.wx = 00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[sha = SHA-384]\n\n# tcId = 406\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3064023015aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d02307f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f\n\n# tcId = 407\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306602310090b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47023100cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1\n\n# tcId = 408\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9023100a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b\n\n",
 };
-static const size_t kLen121 = 179510;
+static const size_t kLen137 = 179510;
 
-static const char *kData121[] = {
+static const char *kData137[] = {
     "# Imported from Wycheproof's ecdsa_secp384r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[key.wx = 2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa]\n[key.wy = 4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19fbb197e4c4250926e30c5303a2c2d34250f17fcf5ab3181a6\n\n# tcId = 2\n# Legacy:ASN encoding of r misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = MissingZero\n\n# tcId = 3\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = MissingZero\n\n# tcId = 4\n# valid\nmsg = 313233343030\nresult = valid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 5\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 6\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30820066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 7\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 8\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 9\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30850100000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 10\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3089010000000000000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 11\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 12\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 13\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 14\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 15\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 16\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 17\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3066028000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 18\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202800084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 19\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 20\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 21\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 22\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30680000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 23\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 24\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b4981773066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a2500306602",
     "3100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b2236498177023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a22352500023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306e2233023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20004deadbeef02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 31\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223649817702310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 32\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235250002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 33\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306eaa00bb00cd003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306caa02aabb3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306e2239aa00bb00cd00023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 37\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306c2237aa02aabb023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 38\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22239aa00bb00cd0002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 39\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306c023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22237aa02aabb02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 40\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 41\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30803066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 42\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 306a2280023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 43\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 44\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30803166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 45\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 306a2280033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 46\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228003310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 47\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 50\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 51\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3266023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 52\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 53\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 54\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 306a30010230653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 55\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673",
     "854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7\n\n# tcId = 56\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 30653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 57\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\nflags = BER\n\n# tcId = 58\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd00\n\n# tcId = 59\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd05000000\n\n# tcId = 60\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd060811220000\n\n# tcId = 61\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000fe02beef\n\n# tcId = 62\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0002beef\n\n# tcId = 63\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30683000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 64\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd3000\n\n# tcId = 65\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 3069023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cdbf7f00\n\n# tcId = 66\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 67\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 3033023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2\n\n# tcId = 68\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 308199023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 69\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306702813100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 70\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20281310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 71\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30680282003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 72\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\nflags = BER\n\n# tcId = 73\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023200814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 74\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 75\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202320084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 76\n# wrong length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 77\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306b0285010000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 78\n# uint32 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028501000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 79\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306f028901000000000000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 80\n# uint64 overflow in length of integer\nmsg = 313233343030\nresult = invalid\nsig = 306f023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202890100000000000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 81\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a02847fffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 82\n# length of integer = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada",
@@ -3376,9 +3475,9 @@
     "11337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb]\n[key.wx = 0081f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132]\n[key.wy = 221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000481f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb]\n[sha = SHA-512]\n\n# tcId = 420\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[key.wx = 00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[sha = SHA-512]\n\n# tcId = 421\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 422\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[key.wx = 00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 00c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[sha = SHA-512]\n\n# tcId = 423\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 424\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[key.wx = 29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc]\n[key.wy = 009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[sha = SHA-512]\n\n# tcId = 425\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306402302290c886bbad8f53089583d543a269a727665626d6b94a3796324c62d08988f66f6011e845811a03589e92abe1f17faf023066e2cb4380997f4e7f85022541adb22d24d1196be68a3db888b03eb3d2d40b0d9a3a6a00a1a4782ee0a00e8410ba2d86\n\n# tcId = 426\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30650231008071d8cf9df9efef696ebafc59f74db90c1f1ecf5ccde18858de22fe4d7df2a25cb3001695d706dfd7984b39df65a0f4023027291e6339c2a7fed7a174bb97ffe41d8cfdc20c1260c6ec85d7259f0cc7781bf2ae7a6e6fb4c08e0d75b7381bb7d9b8\n\n# tcId = 427\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30650230470014ccd7a1a5e5333d301c8ea528ac3b07b01944af30cec60f4bad94db108509e45ba381818b5bdfaf9daf0d372301023100e3d49d6a05a755aa871d7cb96fffb79fed7625f83f69498ba07c0d65166a67107c9a17ae6e1028e244377a44096217b2\n\n# tcId = 428\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30640230377044d343f900175ac6833071be74964cd636417039e10e837da94b6919bffc3f5a517b945a450852af3259f5cbf108023032ea25006375c153581e80c09f53ad585c736f823c70147aba4fb47bb0a224fae4d8819adad80d4c144ecc2380954a9e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[key.wx = 00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac]\n[key.wy = 00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[sha = SHA-512]\n\n# tcId = 429\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ccb13c4dc9805a9b4e06ee25ef8c7593eaff7326c432d4b12b923163cf1cbe5fe1cfd3546c1d0761d8874e83ffd2e15d023100db1b0c082ae314b539f05e8a14ad51e5db37f29cacea9b2aab63a04917d58d008cf3f7ba41d5ea280f3b6a67be3ae8f8\n\n# tcId = 430\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100c79a30e36d2126b348dd9eb2f5db6aa98f79d80214027e51bcf3cabec188a7ebaf25cb7bbe9ec6bfed135e2a3b70e9160230241338ee2ac931adea9a56e7bfe909947128d54d5122a47b00c278e684e10102740d26e89e343290a5b2fa8b401faec6\n\n# tcId = 431\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306402300df82e4ec2960e3df614f8b49cec9a4ee1054365414241361feec9d9d9b6909d8775f222ec385a14afab46266db390c302300968485e854addba0f8354e677e955e1ef2df973d564c49f65f2562cb2a2b80d75e92f8784042955f7b8765f609ce221\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[key.wx = 00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422]\n[key.wy = 00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[sha = SHA-512]\n\n# tcId = 432\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402301fafd83d728422e1485f1e52e5b631548647cc3c76c109c3177a73751d91a19012fa4628b218f2229fc4d55f105fe00102304474f9af7b4b0bb96fdb05ae918f799024e8d5b86",
     "4e49ccd047cf97e7b9f8763cce015c11cf1f461c9027cb901055101\n\n# tcId = 433\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100e6025bb957ab197fb4c080d0a5c647e428afb0d7cc235c605ae97545494fd31a9979790bb2da6e1cf186789422b15c970231008ae9872291430d1bb371ef72360dad5afbb6fb001f403d9aaa1445f0326eb1eef775c9dfe1d7ef8bf4e744822108d27e\n\n# tcId = 434\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100877d5567c18fa568259005a89c2300d1b3825b732fa14964c1477d4b3098afd09384b97d497464adba41e9df8a74d339023100c40f0760717b4b3bae75742b6dc3dcf04cc22a449cfea19d305e0658cb705fda75163e7399e0b3125ca7d1919c13851e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[key.wx = 1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000]\n[key.wy = 00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[sha = SHA-512]\n\n# tcId = 435\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e706b0045a6f54bd175e2437b48767b0204f93d8a4d9d3d00838278137e5b670de4305c5c55e49059b8b5f6e264654c90230405741adff94afd9a88e08d0b1021911fa4cedb2466b1a8fd302a5b5d96566ada63ccb82b6c5e8452fde860c545e0a19\n\n# tcId = 436\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306502300c57ce2bc579fbd3a759dfbf5e84c3cef2414846a2e300453e1e4c5188f24432b14ca647a733b6ad35c980a880d36145023100f12a119e22d48b82049df611f1c851fb22795056498a873c730fcb9fd8f314728de0298b9b22c348abc6de2aba97e972\n\n# tcId = 437\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 30660231009a8f80697ccf2e0617612027d861a3a3a657fb75cc82810b40dd5072d39ff37eca29008390da356137e2c9babd814198023100a86537a83c3d57da50e4b29b47dcc3717c5a1ed0fff18ade8dcce4220eac63aab60b9bfed5f1bdd241dab655a9bdd75f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[key.wx = 2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69]\n[key.wy = 00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[sha = SHA-512]\n\n# tcId = 438\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306602310093718f6f8542725f62de7039fc193d3fcc81d622230ccc94e9e265390b385af3a3ba50c91a9d6a5b1e07d79af2bd80b2023100d08499f3d298e8afecea122265a36dbf337259020654739783c8ec8ef783d072555b5907285ce83fc8ced9c8398c6269\n\n# tcId = 439\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ce26e42c490dec92cf59d6b1ba75c9a1400d6e5c3fd7c47e1eeb1cded30a3a3d18c81cdfdcbad2742a97293369ce21c202310094671085d941fd27d495452a4c8559a1fe24f3225f5b8ef75faf9d3fb01372c586e23b82714359d0e47144ff5d946161\n\n# tcId = 440\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ffc4738acf71f04a13104c328c138b331fb7202aef66f583ba543ed490d12993c18f724c81ad0f7ea18dae352e5c6480023100e67d4ccdeb68a9a731f06f77eae00175be076d92529b109a62542692c8749ddfde03bed1c119a5901a4e852f2115578f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[key.wx = 00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[sha = SHA-512]\n\n# tcId = 441\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e6fa8455bc14e730e4ca1eb5faf6c8180f2f231069b93a0bb17d33ad5513d93a36214f5ce82ca6bd785ccbacf7249a4c02303979b4b480f496357c25aa3fc850c67ff1c5a2aabd80b6020d2eac3dd7833cf2387d0be64df54a0e9b59f12c3bebf886\n\n# tcId = 442\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306502301b49b037783838867fbaa57305b2aa28df1b0ec40f43140067fafdea63f87c02dfb0e6f41b760fbdf51005e90c0c3715023100e7d4eb6ee61611264ea8a668a70287e3d63489273da2b30ad0c221f1893feaea3e878c9a81c6cec865899dbda4fa79ae\n\n# tcId = 443\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306502310091d9da3d577408189dcaae33d95ed0a0118afd460d5228fa352b6ea671b172eb413816a70621ddaf23c5e2ef79df0c110230053dadbfcd564bddbe44e0ecb4d1e608dbd35d4e83b6634cc72afb87a2d61675ee13960c243f6be70519e167b1d3ceb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = EcPublicKey]\n[key.uncompressed = 04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[key.wx = 00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[sha = SHA-512]\n\n# tcId = 444\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100af0ed6ce6419662db80f02a2b632675445c7bf8a34bbacdc81cc5dd306c657ca4c5a3fb1b05f358d8f36fda8ae238806023046b472c0badb17e089c8f9697fd0b4ce71f0f4471b235483d4c8dd3d00aa282cde990253df38ba733b2ad82a601c7508\n\n# tcId = 445\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100e2aa9468ccaaadad8b9f43a429c97f0c6a7eedcb4d4af72d639df0fe53f610b953408a8e24e8db138551770750680f7a023100d81020846d1c50ee9ae23601dd638cb71b38d37fb555268c2fa1ad8a761fa7b27afcab2fa69224d1f976699914e09de2\n\n# tcId = 446\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306402306bf6fa7a663802c3382cc5fd02004ec71e5a031e3d9bfc0858fa994e88497a7782308bc265b8237a6bbbdd38658b36fc02303a9d5941a013bf70d99cc3ff255ce85573688dac40344b5db7144b19bf57bb2701e6850a8f819796b67f7d0b6aea7e50\n\n",
 };
-static const size_t kLen122 = 225135;
+static const size_t kLen138 = 225135;
 
-static const char *kData122[] = {
+static const char *kData138[] = {
     "# Imported from Wycheproof's ecdsa_secp521r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.8r12\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 04005c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508007878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6]\n[key.wx = 5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508]\n[key.wy = 7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004005c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508007878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5a27a24a1aae1e218fdccd8cd7d4990b666d4bf4902b84fdad123f941fe906d948\n\n# tcId = 2\n# valid\nmsg = 313233343030\nresult = valid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 3\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\nflags = BER\n\n# tcId = 4\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 5\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 6\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3085010000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 7\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 8\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 9\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 10\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 11\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 12\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30ff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 13\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 14\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 30818602804e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 15\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 16\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 17\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 30\n\n# tcId = 18\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 19\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 308188000002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 20\n# appending unused 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 21\n# appending null value to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df92",
     "3a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500\n\n# tcId = 22\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818c49817730818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 23\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b250030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 24\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef\n\n# tcId = 25\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b224649817702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 26\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818a2245250002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 27\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818e224302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450004deadbeef024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 28\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452246498177024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 29\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522452500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 30\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452243024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef\n\n# tcId = 31\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818faa00bb00cd0030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 32\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818daa02aabb30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 33\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818e2249aa00bb00cd0002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 34\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818c2247aa02aabb02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 35\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452249aa00bb00cd00024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 36\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818c02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452247aa02aabb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 37\n# truncated length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081\n\n# tcId = 38\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 39\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30818a228002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 40\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 41\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 308031818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 42\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30818a228003414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 43\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 44\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 45\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2e818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf",
     "8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 46\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2f818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 47\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 31818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 48\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 32818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 49\n# changing tag value of sequence\nmsg = 313233343030\nresult = invalid\nsig = ff818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 50\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 51\n# using composition for sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818b300102308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 52\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a\n\n# tcId = 53\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 54\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\nflags = BER\n\n# tcId = 55\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac100\n\n# tcId = 56\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac105000000\n\n# tcId = 57\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1060811220000\n\n# tcId = 58\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000fe02beef\n\n# tcId = 59\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10002beef\n\n# tcId = 60\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 308188300002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 61\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac13000\n\n# tcId = 62\n# append garbage with high tag number\nmsg = 313233343030\nresult = invalid\nsig = 30818902414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1bf7f00\n\n# tcId = 63\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 64\n# truncated sequence: removed last 1 elements\nmsg = 313233343030\nresult = invalid\nsig = 304302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645\n\n# tcId = 65\n# repeating element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081c902414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 66\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 3081870281414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\nflags = BER\n\n# tcId = 67\n# long form encoding of length of integer\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502814128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\nflags = BER\n\n# tcId = 68\n# length of integer contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 308188028200414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf",
@@ -3408,9 +3507,9 @@
     "bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e]\n[sha = SHA-512]\n\n# tcId = 429\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024201625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5024201b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f\n\n# tcId = 430\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30818602415adc833cbc1d6141ced457bab2b01b0814054d7a28fa8bb2925d1e7525b7cf7d5c938a17abfb33426dcc05ce8d44db02f53a75ea04017dca51e1fbb14ce3311b1402415f69b2a6de129147a8437b79c72315d35173d88c2d6119085c90dae8ec05c55e067e7dfa4f681035e3dccab099291c0ecf4428332a9cb0736d16e79111ac76d766\n\n# tcId = 431\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3081880242014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba258702420108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab\n\n# tcId = 432\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308187024108135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb4520242011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625]\n[key.wx = 304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a]\n[key.wy = 009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625]\n[sha = SHA-512]\n\n# tcId = 433\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081870242011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218024134c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6\n\n# tcId = 434\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 30818702417c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e024201058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d\n\n# tcId = 435\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c024201de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da]\n[key.wx = 304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a]\n[key.wy = 01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da]\n[sha = SHA-512]\n\n# tcId = 436\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308187024200b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a820241228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f\n\n# tcId = 437\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea20242012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7\n\n# tcId = 438\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652024201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5]\n[key.wx = 02fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b]\n[key.wy = 01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5]\n[sha = SHA-512]\n\n# tcId = 439\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081880242010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e0242017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda\n\n# tcId = 440\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081880242011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf5906802420147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06\n\n# tcId = 441\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2024201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 0401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d",
     "0de6d2de407fd7117551a70826eada6]\n[key.wx = 01fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331]\n[key.wy = 01b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6]\n[sha = SHA-512]\n\n# tcId = 442\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818602414ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a702417aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188\n\n# tcId = 443\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308188024200e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836024201489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3\n\n# tcId = 444\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee59430242015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = EcPublicKey]\n[key.uncompressed = 0400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff]\n[key.wx = 00c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349]\n[key.wy = 08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff]\n[sha = SHA-512]\n\n# tcId = 445\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21024201ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b\n\n# tcId = 446\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0024200f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22\n\n# tcId = 447\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a024201a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d\n\n",
 };
-static const size_t kLen123 = 52032;
+static const size_t kLen139 = 52032;
 
-static const char *kData123[] = {
+static const char *kData139[] = {
     "# Imported from Wycheproof's eddsa_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: EDDSA\n# Generator version: 0.8rc16\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa]\n[key.sk = add4bb8103785baf9ac534258e8aaf65f5f1adb5ef5f3df19bb80ab989c4d64b]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321007d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007\n\n# tcId = 2\nmsg = 78\nresult = valid\nsig = d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 4\nmsg = 48656c6c6f\nresult = valid\nsig = 1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905\n\n# tcId = 5\nmsg = 313233343030\nresult = valid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301\n\n# tcId = 6\nmsg = 000000000000000000000000\nresult = valid\nsig = d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f\n\n# tcId = 7\nmsg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\nresult = valid\nsig = 879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00\n\n# tcId = 8\nmsg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60\nresult = valid\nsig = 7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109\n\n# tcId = 9\nmsg = ffffffffffffffffffffffffffffffff\nresult = valid\nsig = 5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04\n\n# tcId = 10\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 11\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 12\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 13\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 14\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 15\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 16\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 17\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 18\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 19\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 20\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 21\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 22\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 23\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 24\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 25\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 26\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 27\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 28\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 29\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 30\n# empty signature\nmsg = 54657374\nresult = invalid\nsig = \n\n# tcId = 31\n# s missing\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0\n\n# tcId = 32\n# signature too short\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946\n\n# tcId = 33\n# signature too long\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d2020\n\n# tcId = 34\n# include pk in signature\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa\n\n# tcId = 35\n# prepending 0 byte to signature\nmsg = 54657374\nresult = invalid\nsig = 007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 36\n# prepending 0 byte to s\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 37\n# appending 0 byte to signature\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d00\n\n# tcId = 38\n# removing 0 byte from signature\nmsg = 546573743137\nresult = invalid\nsig = 93de3ca252426c95f735cb9edd92e83321ac62372d5aa5b379786bae111ab6b17251330e8f9a7c30d6993137c596007d7b001409287535ac4804e662bc58a3\n\n# tcId = 39\n# removing 0 byte from signature\nm",
     "sg = 54657374313236\nresult = invalid\nsig = dffed33a7f420b62bb1731cfd03be805affd18a281ec02b1067ba6e9d20826569e742347df59c88ae96db1f1969fb189b0ec34381d85633e1889da48d95e0e\n\n# tcId = 40\n# removing leading 0 byte from signature\nmsg = 546573743530\nresult = invalid\nsig = 6e170c719577c25e0e1e8b8aa7a6346f8b109f37385cc2e85dc3b4c0f46a9c6bcafd67f52324c5dbaf40a1b673fb29c4a56052d2d6999d0838a8337bccb502\n\n# tcId = 41\n# dropping byte from signature\nmsg = 54657374333437\nresult = invalid\nsig = b0928b46e99fbbad3f5cb502d2cd309d94a7e86cfd4d84b1fcf4cea18075a9c36993c0582dba1e9e519fae5a8654f454201ae0c3cb397c37b8f4f8eef18400\n\n# tcId = 42\n# modified bit 0 in R\nmsg = 313233343030\nresult = invalid\nsig = 647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c\n\n# tcId = 43\n# modified bit 1 in R\nmsg = 313233343030\nresult = invalid\nsig = 677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01\n\n# tcId = 44\n# modified bit 2 in R\nmsg = 313233343030\nresult = invalid\nsig = 617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06\n\n# tcId = 45\n# modified bit 7 in R\nmsg = 313233343030\nresult = invalid\nsig = e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03\n\n# tcId = 46\n# modified bit 8 in R\nmsg = 313233343030\nresult = invalid\nsig = 657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09\n\n# tcId = 47\n# modified bit 16 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300\n\n# tcId = 48\n# modified bit 31 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e\n\n# tcId = 49\n# modified bit 32 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d\n\n# tcId = 50\n# modified bit 63 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00\n\n# tcId = 51\n# modified bit 64 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d\n\n# tcId = 52\n# modified bit 97 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301\n\n# tcId = 53\n# modified bit 127 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02\n\n# tcId = 54\n# modified bit 240 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305\n\n# tcId = 55\n# modified bit 247 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e\n\n# tcId = 56\n# modified bit 248 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e\n\n# tcId = 57\n# modified bit 253 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501\n\n# tcId = 58\n# modified bit 254 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505\n\n# tcId = 59\n# modified bit 255 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f\n\n# tcId = 60\n# R==0\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02\n\n# tcId = 61\n# invalid R\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e\n\n# tcId = 62\n# all bits flipped in R\nmsg = 313233343030\nresult = invalid\nsig = 9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a\n\n# tcId = 63\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab067654bce3832c2d76f8f6f5dafc08d9339d4eef676573336a5c51eb6f946b31d\nflags = SignatureMalleability\n\n# tcId = 64\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab05439412b5395d42f462c67008eba6ca839d4eef676573336a5c51eb6f946b32d\nflags = SignatureMalleability\n\n# tcId = 65\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab02ee12ce5875bf9dff26556464bae2ad239d4eef676573336a5c51eb6f946b34d\nflags = SignatureMalleability\n\n# tcId = 66\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0e2300459f1e742404cd934d2c595a6253ad4eef676573336a5c51eb6f946b38d\nflags = SignatureMalleability\n\n# tcId = 67\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b32d\nflags = SignatureMalleability\n\n# tcId = 68\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b34d\nflags = SignatureMalleability\n\n# tcId = 69\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d\nflags = SignatureMalleability\n\n# tcId = 70\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0679155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d\nflags = SignatureMalleability\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c]\n[key.sk = 0a23a20072891237aa0864b5765139514908787878cd77135a0059881d313f00]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c]\n\n# tcId = 71\nmsg = \nresult = valid\nsig = 5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302\n\n# tcId = 72\nmsg = 78\nresult = valid\nsig = 481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd291615ce42f02\n\n# tcId = 73\nmsg = 54657374\nresult = valid\nsig = 8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f\n\n# tcId = 74\nmsg = 48656c6c6f\nresult = valid\nsig = d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801\n\n# tcId = 75\nmsg = 313233343030\nresult = valid\nsig = 9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b\n\n# tcId = 76\nmsg = 000000000000000000000000\nresult = valid\nsig = f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0",
     "f2c7118f2573422a500b\n\n# tcId = 77\nmsg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\nresult = valid\nsig = 1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08\n\n# tcId = 78\nmsg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60\nresult = valid\nsig = ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d\n\n# tcId = 79\nmsg = ffffffffffffffffffffffffffffffff\nresult = valid\nsig = 8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a]\n[key.sk = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a]\n\n# tcId = 80\n# draft-josefsson-eddsa-ed25519-02: Test 1\nmsg = \nresult = valid\nsig = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c]\n[key.sk = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c]\n\n# tcId = 81\n# draft-josefsson-eddsa-ed25519-02: Test 2\nmsg = 72\nresult = valid\nsig = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025]\n[key.sk = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025]\n\n# tcId = 82\n# draft-josefsson-eddsa-ed25519-02: Test 3\nmsg = af82\nresult = valid\nsig = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e]\n[key.sk = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e]\n\n# tcId = 83\n# draft-josefsson-eddsa-ed25519-02: Test 1024\nmsg = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nresult = valid\nsig = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a]\n[key.sk = d7ad3f1f6bbe0477c3c357a806a19eb41ae3f94025035bc87f281f8ee9fc0e34]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321008fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a]\n\n# tcId = 84\n# Random test failure 1\nmsg = b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c\nresult = valid\nsig = 7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082]\n[key.sk = ad9b22793336fcdac10e136c4deea599be187a38eef91c1cf7c7a4ec884dda08]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321002a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082]\n\n# tcId = 85\n# Random test failure 2\nmsg = a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8\nresult = valid\nsig = 67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09\n\n# tcId = 86\n# Random test failure 24\nmsg = b477b0480bb84642608b908d29a51cf2fce63f24ee95\nresult = valid\nsig = 28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051]\n[key.sk = 04a6553d68a9baef78a2175af375458eaa01cdb77350c61e282ef5f0c7116599]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051]\n\n# tcId = 87\n# Random test failure 3\nmsg = cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f\nresult = valid\nsig = 24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207\n\n# tcId = 88\n# Random test failure 20\nmsg = 27d465bc632743522aefa23c\nresult = valid\nsig = c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e]\n[key.sk = c367c8d2ebeeecd70c1e8985b70c38",
@@ -3419,9 +3518,9 @@
     "6f0ac47ea136cb3ff00f7a96638e4984048999ee2da0af6e5c86bffb0e70bb97406b6ad5a4b764f7c99ebb6ec0fd434b8efe253b0423ef876c037998e8ab07\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = d3c9aa2f3d6ef217a166e8ae403ed436c37facbbe3beceb78df6eb439f8fa04a]\n[key.sk = d8aaad0749db159569a68b46048b3d3e8266e110150251c42806f0752a84e95b]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100d3c9aa2f3d6ef217a166e8ae403ed436c37facbbe3beceb78df6eb439f8fa04a]\n\n# tcId = 127\n# regression test for arithmetic error\nmsg = 619d8c4f2c93104be01cd574a385ceca08c33a9e\nresult = valid\nsig = b7cbb942a6661e2312f79548224f3e44f5841c6e880c68340756a00ce94a914e8404858265985e6bb97ef01d2d7e5e41340309606bfc43c8c6a8f925126b3d09\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = d53280367c1c0b95ac4112218b92c6a71c51fb6312ce668de196c7d52a136155]\n[key.sk = e78d26ab5b726c9d4dfb1f634082abded90432a2fd18089c7c85253a5d2fc7d0]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100d53280367c1c0b95ac4112218b92c6a71c51fb6312ce668de196c7d52a136155]\n\n# tcId = 128\n# regression test for arithmetic error\nmsg = 5257a0bae8326d259a6ce97420c65e6c2794afe2\nresult = valid\nsig = 27a4f24009e579173ff3064a6eff2a4d20224f8f85fdec982a9cf2e6a3b51537348a1d7851a3a932128a923a393ea84e6b35eb3473c32dceb9d7e9cab03a0f0d\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 94ac2336ba97a476fb4c9f2b5563e4167ca292c6e99e422350a911ae3172c315]\n[key.sk = 8e7ca56e07f1438ac3615fd9ec77ae63679d0ec059b4595febf40be59d976a05]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b657003210094ac2336ba97a476fb4c9f2b5563e4167ca292c6e99e422350a911ae3172c315]\n\n# tcId = 129\n# regression test for arithmetic error\nmsg = 5acb6afc9b368f7acac0e71f6a4831c72d628405\nresult = valid\nsig = 985b605fe3f449f68081197a68c714da0bfbf6ac2ab9abb0508b6384ea4999cb8d79af98e86f589409e8d2609a8f8bd7e80aaa8d92a84e7737fbe8dcef41920a\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = e1e7316d231f7f275bdf403360304da1509fdf1af1fd25ca214eaac0a289398f]\n[key.sk = e77525af5856ab9df5abb64e5312576b498cc27f61f266e21f382e0526d4e6fb]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100e1e7316d231f7f275bdf403360304da1509fdf1af1fd25ca214eaac0a289398f]\n\n# tcId = 130\n# regression test for arithmetic error\nmsg = 3c87b3453277b353941591fc7eaa7dd37604b42a\nresult = valid\nsig = 1c8fbda3d39e2b441f06da6071c13115cb4115c7c3341704cf6513324d4cf1ef4a1dd7678a048b0dde84e48994d080befcd70854079d44b6a0b0f9fa002d130c\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = fffbeea71215efaf9888fec2cc68edb3703ff11a66fd629b53cbda5eabc18750]\n[key.sk = 1f43235ad716f1beb754ab0f546dfa934488fdf7472b493d7cc3c60353005d24]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100fffbeea71215efaf9888fec2cc68edb3703ff11a66fd629b53cbda5eabc18750]\n\n# tcId = 131\n# regression test for arithmetic error\nmsg = 0a68e27ef6847bfd9e398b328a0ded3679d4649d\nresult = valid\nsig = 59097233eb141ed948b4f3c28a9496b9a7eca77454ecfe7e46737d1449a0b76b15aacf77cf48af27a668aa4434cfa26c504d75a2bcc4feac46465446234c0508\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 19ccc0527599cb032e0b4c4d74e60f13901768a99df041c3bc1bf6c0ef271169]\n[key.sk = 3977785b9f8c5320e51a3a16f8cc22c4f7e64857617f9550147fa35d685ca34f]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b657003210019ccc0527599cb032e0b4c4d74e60f13901768a99df041c3bc1bf6c0ef271169]\n\n# tcId = 132\n# regression test for arithmetic error\nmsg = 4e9bef60737c7d4dd10bd52567e1473a36d3573d\nresult = valid\nsig = 519105608508fe2f1b6da4cc8b23e39798b1d18d25972beed0404cec722e01ba1b6a0f85e99e092cca8076b101b60d4ac5035684357f4d0daacdc642da742a06\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 0e726e27047563aa0a1a9c2e085d8d26af2acba129d0869c65031e3e6cac329a]\n[key.sk = 1aa4415c5db0131bec6fa188d0c23d49a65bf795657153fae94777e3f19bcf54]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321000e726e27047563aa0a1a9c2e085d8d26af2acba129d0869c65031e3e6cac329a]\n\n# tcId = 133\n# regression test for arithmetic error\nmsg = cc82b3163efda3ba7e9240e765112caa69113694\nresult = valid\nsig = d8b03ee579e73f16477527fc9dc37a72eaac0748a733772c483ba013944f01ef64fb4ec5e3a95021dc22f4ae282baff6e9b9cc8433c6b6710d82e7397d72ef04\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = e77717b54a2b5e5bce5bccb8f0c5fdb5fd7df77ac254020fc9120dc0d4df4178]\n[key.sk = 0fb7680a50d3f2940077ea4dfcb7eb040a125c4f4b5dcefa16d3af968fc8e5de]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100e77717b54a2b5e5bce5bccb8f0c5fdb5fd7df77ac254020fc9120dc0d4df4178]\n\n# tcId = 134\n# regression test for arithmetic error\nmsg = 923a5c9e7b5635bb6c32c5a408a4a15b652450eb\nresult = valid\nsig = 26da61fdfd38e6d01792813f27840c8b4766b0faaed39d0ee898cb450d94a5d5f57e58b6a003d7f9b56b20561954c6edcf66492d116b8b5e91f205a3a6449d0b\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 6220972d3f7d150b36790d7d522384876d64d640cd9913186815e1629582ed36]\n[key.sk = e222c444d6bc8a4796a0d5a2d71d19b98845cc56e39caaf8233ea4c6b0704f09]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321006220972d3f7d150b36790d7d522384876d64d640cd9913186815e1629582ed36]\n\n# tcId = 135\n# regression test for arithmetic error\nmsg = 6f2f0245de4587062979d0422d349f93ccdc3af2\nresult = valid\nsig = 4adeaff7a58c5010a5a067feea0ae504d37b0c6a76c6c153e222f13409dff2df0fab69bc5059b97d925dc1b89e9851d7c627cb82d65585f9fd976124553f8902\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 7b64a28c50ec7678a90e3e1a21522e30ac9db7b5215aea2bfb33bea037eab987]\n[key.sk = a89ea18476b9ad90cb14b8b1ff24777e4ebd015bc810a60785a9154dacf3be52]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321007b64a28c50ec7678a90e3e1a21522e30ac9db7b5215aea2bfb33bea037eab987]\n\n# tcId = 136\n# regression test for arithmetic error\nmsg = 6e911edb27a170b983d4dee1110554f804330f41\nresult = valid\nsig = 4204d620cde0c3008c0b2901f5d6b44f88f0e3cb4f4d62252bf6f3cb37c1fb150a9ccb296afe5e7c75f65b5c8edd13dc4910ffe1e1265b3707c59042cf9a5902\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 724452210a9e4c994819229bf12bf84e95768a3a97c08d8d8f5f939a4cad34c5]\n[key.sk = 69b1da56cde8d1676c2a8c0e7f95c7d0bf60739efd1304dd2ccb02729d17a22c]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100724452210a9e4c994819229bf12bf84e95768a3a97c08d8d8f5f939a4cad34c5]\n\n# tcId = 137\n# regression test for arithmetic error\nmsg = b8cf807eea809aaf739aa091f3b7a3f2fd39fb51\nresult = valid\nsig = f8a69d3fd8c2ff0a9dec41e4c6b43675ce08366a35e220b1185ffc246c339e22c20ac661e866f52054015efd04f42eca2adcee6834c4df923b4a62576e4dff0e\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = bad265b294ed2f422cb6a141694086238fbfe987571aa765d8b4f3a24105aa01]\n[key.sk = b332265cf95595f0c90221593b5a2b3c574d60dc634ddff6186f0eed7980a383]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100bad265b294ed2f422cb6a141694086238fbfe987571aa765d8b4f3a24105aa01]\n\n# tcId = 138\n# regression test for arithmetic error\nmsg = 01a2b5f7fee813b4e9bd7fc25137648004795010\nresult = valid\nsig = 61792c9442bc6338ac41fd42a40bee9b02ec1836503d60ff725128c63d72808880c36e6190b7da525cbee5d12900aa043547dd14a2709ef9e49d628f37f6b70c\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 0aaee4b723db9b51ba7d22eb23eb8a76a5ac02f4fc9dd06f77bea42e1d37ec5a]\n[key.sk = faec9764b369df0ef10890dd022c502e551a3222b43e8429455496c76feea45d]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321000aaee4b723db9b51ba7d22eb23eb8a76a5ac02f4fc9dd06f77bea42e1d37ec5a]\n\n# tcId = 139\n# regression test for arithmetic error\nmsg = 0fbf5d47cb5d498feace8f98f1896208da38a885\nresult = valid\nsig = fa3cd41e3a8c00b19eecd404a63c3cb787cd30de0dfc936966cff2117f5aff18db6bef80fcfd8856f3fb2e9c3dc47593e9471103032af918feee638a33d40505\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 812344af15a91ba83c2c91e96f1727ac0f3c4c41385b9fa84efa399ada5168be]\n[key.sk = 4eb19e278f7a30a06a7d55e42c44775f4a81b7a45c0512aae026262e71770dac]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100812344af15a91ba83c2c91e96f1727ac0f3c4c41385b9fa84efa399ada5168be]\n\n# tcId = 140\n# regression test for arithmetic error\nmsg = 36e67c1939750bffb3e4ba6cb85562612275e862\nresult = valid\nsig = 97fbbcd7a1d0eb42d2f8c42448ef35a2c2472740556b645547865330d6c57068af377fced08aaf810c08cd3c43d296f1975710312e9334c98b485f831efa4103\n\n",
     "[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 0ee5cb5597fbdf8dccc48b01485e39b33aa133b52d30d23740277267cfec3e3e]\n[key.sk = 1998d5949cab365a00f828e7d17b06c708d33fef0031d353a4e15bf7222a73b0]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321000ee5cb5597fbdf8dccc48b01485e39b33aa133b52d30d23740277267cfec3e3e]\n\n# tcId = 141\n# regression test for arithmetic error\nmsg = 13945c894c1d3fe8562e8b20e5f0efaa26ade8e3\nresult = valid\nsig = d7dbaa337ffd2a5fd8d5fd8ad5aeccc0c0f83795c2c59fe62a40b87903b1ae62ed748a8df5af4d32f9f822a65d0e498b6f40eaf369a9342a1164ee7d08b58103\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 9fba1de92b60b5b4703089763d0d6f9125e4dd7efae41f08a22882aef96892c4]\n[key.sk = 6164676114c66bd9887dac341c66209dc587ccf0cc5cd9baffdfac9295a00c4a]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321009fba1de92b60b5b4703089763d0d6f9125e4dd7efae41f08a22882aef96892c4]\n\n# tcId = 142\n# regression test for arithmetic error\nmsg = 4de142af4b8402f80a47fa812df84f42e283cee7\nresult = valid\nsig = 09a2ed303a2fa7027a1dd7c3b0d25121eeed2b644a2fbc17aa0c8aea4524071ede7e7dd7a536d5497f8165d29e4e1b63200f74bbae39fbbbccb29889c62c1f09\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 7582ab1b52e1316e5c13671f43b39ca36b28133cd0832831bcddd0b0f23398cb]\n[key.sk = 4b0bd03a03b20069ccbcc214a7448473f4e7a491fa7ceb48ddbe24c83c4aa4bb]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321007582ab1b52e1316e5c13671f43b39ca36b28133cd0832831bcddd0b0f23398cb]\n\n# tcId = 143\n# regression test for arithmetic error\nmsg = 563357f41b8b23b1d83f19f5667177a67da20b18\nresult = valid\nsig = e6884a6e6b2e60a0b5862251c001e7c79d581d777d6fc11d218d0aecd79f26a30e2ca22cc7c4674f8b72655bc4ee5cb5494ca07c05177656142ac55cc9d33e02\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = dd2d678bae222f3fb6e8278f08cc9e1a66339c926c29ac0a16f9717f5ee18cd8]\n[key.sk = 2fce7870be1f392d21fb1d2350ec7877db8aa99b359fe5bdd5338ff35a791d1c]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100dd2d678bae222f3fb6e8278f08cc9e1a66339c926c29ac0a16f9717f5ee18cd8]\n\n# tcId = 144\n# regression test for arithmetic error\nmsg = 931bbf9c877a6571cf7d4609fc3eb867edd43f51\nresult = valid\nsig = 6124c206d864507ea5d984b363b4cf583314db6856a45ded5e61eebff4d5e337e0b4c82b445ae2e52d549d2d961eace2ea01f81158e09a9686baa040db65ad08\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = ccbe7cb2e4bc215cee2f885e1d22f7e0d582b2bbbd782c104e548b152d26fc69]\n[key.sk = a9ace42195ddbb3a16f366b24dd9d37a8a043ed2e6001f54652296750379367d]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100ccbe7cb2e4bc215cee2f885e1d22f7e0d582b2bbbd782c104e548b152d26fc69]\n\n# tcId = 145\n# regression test for arithmetic error\nmsg = 44530b0b34f598767a7b875b0caee3c7b9c502d1\nresult = valid\nsig = cfbd450a2c83cb8436c348822fe3ee347d4ee937b7f2ea11ed755cc52852407c9eec2c1fa30d2f9aef90e89b2cc3bcef2b1b9ca59f712110d19894a9cf6a2802\n\n",
 };
-static const size_t kLen124 = 61255;
+static const size_t kLen140 = 61255;
 
-static const char *kData124[] = {
+static const char *kData140[] = {
     "# Imported from Wycheproof's hkdf_sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HKDF-SHA-1\n# Generator version: 0.8rc17\n\n[keySize = 88]\n\n# tcId = 1\n# RFC 5869\nikm = 0b0b0b0b0b0b0b0b0b0b0b\ninfo = f0f1f2f3f4f5f6f7f8f9\nokm = 085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896\nresult = valid\nsalt = 000102030405060708090a0b0c\nsize = 42\n\n[keySize = 640]\n\n# tcId = 2\n# RFC 5869\nikm = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f\ninfo = b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nokm = 0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4\nresult = valid\nsalt = 606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf\nsize = 82\n\n[keySize = 176]\n\n# tcId = 3\n# RFC 5869\nikm = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\ninfo = \nokm = 0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 4\n# RFC 5869\nikm = 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c\ninfo = \nokm = 2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n[keySize = 128]\n\n# tcId = 5\nikm = 60ab7f45b0ad534683b3a6c020d4f775\ninfo = \nokm = 73bf325f0fcc78f15b6cee7c9e7d927d4016eafd\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 6\nikm = e3db76e02278cbd2adbcb4555803da11\ninfo = \nokm = a9382b2bb04ceb4fe0543cee88753df8cb90c9dc440f7e476e95150c82e1376e123f058875c00cff6f29\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 7\nikm = d4dcb92a769f57c8bab8a420ee0aa351\ninfo = \nokm = d10d4bd0ed723533adfceaa903f1ee8836e61cd085fd951dfc6a291edded082e8478c9f8bd1f7a2611a6a049761dfc2888a9e32be9c326833c6559487c33f6e1\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 8\nikm = 2d43e54bf0c94c9cbff4300f4aa69ab8\ninfo = d674da3bb47d5c7e38b501e5251d9348af601c44\nokm = c1b8065a9ea8e79d404f882089cf423a99bde5ea\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 9\nikm = 4055536896c406d5fe14a6cd6b999bff\ninfo = 2094768a8816f7df070d6e08b7ad93755dc9024b\nokm = c7d3c9ab74081357d0f6ee3aef0442afee7325381090a2df642926a3e6e6a7e213f05ea5c39978d52165\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 10\nikm = 5b01b2da3166f217cdd68de8af60078f\ninfo = 6884cfa7ffe8f27bf4ebc6e46a7e01488c79243a\nokm = 1535a41d6e8a94c5bd51b7447bbd9c2b8fa00ba05b92e7ab0da7d1fec7d348ee7d50a4bdbbde173dd6eeff83aba9e8b822823b339a76811d62771336f4e08f3d\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 11\nikm = 467403c2ec02a235bf730ff37e8d8ff3\ninfo = \nokm = 4ab2bf78f2678effaced317249e116862d3d9b8a\nresult = valid\nsalt = 41f0f173d307d40436c25856cf559f96\nsize = 20\n\n# tcId = 12\nikm = 3352f942aa93071da6d39cc5ed8dc460\ninfo = \nokm = bbcf63065c761017f229183e767683b98633a85f4d8f32236cfa0fd3f6b182a5f41c33506636d18c5eba\nresult = valid\nsalt = 57a0db708b25a51afc4271803aa35204\nsize = 42\n\n# tcId = 13\nikm = 08867e76311126089356623ba5381e73\ninfo = \nokm = 3084fee371179b60a4fd27ea2637a9b89a3dcf6ab45d4805c99880b26e5d73efed4b421f1fea4cabb60893241765b19554aa51689bf00d7d94a053a94bfec55e\nresult = valid\nsalt = 0c164c443edcdfaedb1ab150f047951f\nsize = 64\n\n# tcId = 14\nikm = c55c41d69d2424a520414e3662aa7303\ninfo = 3fdf20538063b76901d61bbf9b72b0c18749e00e\nokm = 3917a782fed4d7f525ca16ca1dfde0faa7207262\nresult = valid\nsalt = fea9bfc92b74337e43a201a2dc199e27\nsize = 20\n\n# tcId = 15\nikm = 5d3db20e8238a90b62a600fa57fdb318\ninfo = 2bc5f39032b6fc87da69ba8711ce735b169646fd\nokm = ca0903f17759fc29df761469e3b98a5b1476977706f3c87e9d39050e5b36c7ae6bbafeb3814037b12ca0\nresult = valid\nsalt = 1d6f3b38a1e607b5e6bcd4af1800a9d3\nsize = 42\n\n# tcId = 16\nikm = 8677dc79233ef3480777c4c601ef4f0b\ninfo = a38f634d947819a9bfa792174b42baa20c9fce15\nokm = 1761915ac282909fbfd43ce31934e7a10951f901ad33f614a9394b6f5ca04e00906aa14b91132bf9e8ae0aa2102c3c7a67756e81b57d89192a62ca0cf907a3dc\nresult = valid\nsalt = ad88db718244e2cb60e35f874d7ad81f\nsize = 64\n\n# tcId = 17\nikm = 0f602703d37943e0253bed3da331aff4\ninfo = \nokm = 4a54220ecee20a84e1b7b6f5407af234b14938d1\nresult = valid\nsalt = ebdc8510499f69b2e188daab77cd819cccb95f276f46e6b2be11cbe72700\nsize = 20\n\n# tcId = 18\nikm = 9fe65737574c5c7aa67646adf8230ba8\ninfo = \nokm = 741662ad515bf9d2661aa0731eebd674f7390bd20fa3bb7cb2e9d6ca953c2bd839929c44a6f0ba5ae614\nresult = valid\nsalt = 73a34648c152443586236abcb46a090ce55ef6c7f282ffce6342d694650a\nsize = 42\n\n# tcId = 19\nikm = e8f2b1c3e6a6c3d5ee0a20dd47aafa78\ninfo = \nokm = 695807f517ba39e33eadeb6a7b71d2016163e9f5e6aaad5f493bcbe24ac06f8a6770097da76b50338a4dcbd9fac4d3a545c45eb1e733f70e9e82ca03830d0ee9\nresult = valid\nsalt = 3f5e162de91e0782cd189f3b7778cdc2ce6bfe9d3fe841cd3c70475d7b3c\nsize = 64\n\n# tcId = 20\nikm = a679521cdb56aafc5a4b76db0431a4dd\ninfo = 44ec41ab4f4e64f4a36e5e30c9f0dc1d77ae4974\nokm = e36789305dd2613dedd29e041afddf558d6fb8b6\nresult = valid\nsalt = 123033b1ddaead83a4b9cfef8a660bd8e00fde01e67c35656c6d7607d456\nsize = 20\n\n# tcId = 21\nikm = 49bf155ca102026f2a217ea1bc9843ac\ninfo = 851bda4faa8f7add2a3cbf0acf9c2786f8f955b2\nokm = 6016f537e75e1aaf2e6920827d18aa25e9fc8742c607b0cd97a38cad0bed0a6622981f97b63b08f31ed9\nresult = valid\nsalt = 76776e3b4d75f8f43dce4bded71f3b1ae6bcb012d9c0d59f78248b9427b8\nsize = 42\n\n# tcId = 22\nikm = 6cf725e939e8824d4392233eeac75d30\ninfo = 495425d9727fee2e2b7e78899868c1c3e7735e1d\nokm = b31f845aa6ad9b6803153872145a28617035e9b2d2a5c1ce8d0d2c6017f17403a67326cd06068af972eb8b734903d10b633d07de05f02fc70ed383a60bd82b48\nresult = valid\nsalt = 1e72f24b05a91a0093f34306ffced79e7003055b0833c6d0f27a4f33a1bd\nsize = 64\n\n# tcId = 23\nikm = a319ff7b5ba9b14ac72b681cecf0f742\ninfo = \nokm = d547c94891439eb7dc9e0c425adf20262d27fd9b55e7b0516e836db6b2f778c70296bc97c466e05ce2d5\nresult = valid\nsalt = d7e3bc6daed343ce77ef793e15a8246e4bfcbaf83d2ac956d0661d1df7262b2e7311623dfe4152caddbfda8fa8ed7a82656ec00b72c5adf7c9d388e5b3bc8d24\nsize = 42\n\n# tcId = 24\nikm = 34bae5a158c1678aa76a744417a70d7a\ninfo = 87ec30aa53acfc3d09ccc1d57d654fdbce403cd4\nokm = c508b4bc7503440f3ee04c5b8c5832bf70b54a6caea8d2a0ade43a0ea72c08e474904587334d699ba2ce\nresult = valid\nsalt = 1532075f363e061133780ac959bf653c7687d181b9431215d6f62dd2f1ec3019d61c50fa82c70ae25e624c849a276b0c57d7c02a4d753fe84a1a6621e9a5ef01\nsize = 42\n\n# tcId = 25\n# maximal output size\nikm = 9ab09999adde788dc2bf82c7ec8fab03\ninfo = 60999543d9cec9d3\nokm = 033293a76b1496c9619331f089d402d0deae28166bccf304bf25822f369479cf0aa1600b6ebcae43fd1f5d3389c55331b81cbe1e9f6ae29aa86d8a332d298d50516af4926f01691754981c9c92d743d0d26a94423120761a4d0d0e562368696ab78684e51a65b30cc4849a6a5a6c53a076c276db287b787dbb43d1e107f86bce19986cfcb86ec40fd74dfba08784219c2aea2152e21be5a87dacdd18b22ef23292623bcc64bd03a3a1b408a77fbbf4e18ae59a94cac72f43687190e358579d1b0a54d3f2df7f08b867af0b941deb9f7035a1a8f13c6d0da4f9e02f817ea0a92c02140ff5a7d7e398a7b410574d2e6ef7a710efbd1db628318650236ea02f1b617bc79087f5a6c3adeb7037176ef51fda844b2607a4960e3852107dd2703558a534a06ab5a1595d237fe3eb0c0ea3f14400332abb221784914e99fa5ca7a1f67338860283bf589a6b6ea0b32e2779e207fa8139dfeee954e762ebf6255250b1fc58c4c79b3d98fbbeaf786907b5fc7a8c34a25a642b7286a4b2ecdfd1dce041294322bc54b3c15ac44913dd1a3a4361e2d2a0e58c13f34ab2ead723fa01311a2659f74722a09f5b1837a7666da60728ae5cb4b837621961bf0278da749f79a47249ea0e361be3afd14ea9ead4e2f70d9941fa55862d86b53046de5dceec48a4b9f7b895693e328c59c0b2543ef2cd84b2c549a8e0013351703f7669b8346d2b32f7627b7df9ee746b1092f34033f69314a985ce2e948b9a98dabe9bf259f92b78b9a1de7285db617784001894af381618e9a2992c5738337930408b7e0fb57697bf4839e7e72ffa1010319a50aef208829950d60b6c4e57b76bc62d1923003c374710d5370249172064e4e5e0aacae369fecd4ac4bec3861fd24a6c633aca87f2d73c7accb43f9d83bce2d544563c9213e2eaf4a159520500d576bee5d3301613c31580cd6ca8c47039a4d4085dd8b959e5b8ca4835705bcba8982bcf9e8fef0a1602a76364cedb6daf92952ca58be7076ff5536403023",
     "0daff9fee31152d64fa0d6541d862970c2c013efd711c4f96b532fe9f4a4a180ac4d3cd41e5d66d62371616e6ea88896320944a8f3df632ae0188bd93929ce6a6669803c04be549d80fba1815ec67a0269b74e0a1d33beabc1c94ef6636722a2b27bc0f249da083feeb39ef2fa5666ee38339791602afacc9829abf6541a5ede2cd45ece276ddaa9f49fc4d02b755eab466d5bb0ceb3b7b771ce6a9d85283d4a53f53c54b63b4011110b42e9c1fc8c8dca6e4b69e6c4b3b89c53f0f990e26b84ca5f0660e712c775c1824eab5055527bd92495cc59f8d4c04ae13b49c466e886d81639d00b7bc68875a8ab6cb87807d4b2257252561d69788cc136a5273e5f3e68b9ac4ba4f7547422544edd4ca658e1c13c756420e4a6290c7db03f5ff7f44ac78fe4d353847caacd1692c1521b12f1f55362ae755c9714712a6d80362080d865062905ed0e9601c5b12b1300dca219f7676d0080a33d1a6b08718c36f084211461c0f50f6911f17746752f3a6bda656e3a065aab0cf30ce2542eda35a42821c62c838ed18dcd4dcf5d51346804c034fb2c3a16b0c84a6aad62972c84b499a370965a959e17d537acc13d5d08000d732c11aaad9e0f192a9b74d94ef408040c8bc50e7b2ba9edbac047fd4b80c16dbd3962f7eb528e0d80cb5a439eb3d6cc62e41e2cc7f4e2d5141bd48b400ffd19da07d0694e983b91744e420541c01bbfba3f333c5e3e7946d2dd245b70304c3b1a35cd9485aa6908c7a7a846f23466265c1e55e6dfdf8d0cc320033a18feff132c0e3b1216d33b954679121ff2c8795e7c4f9a4a9725d31200bfc72444cb76f50f198b04afbd4821a31a183593210789f93ed612a2e1d70facfa0b23e5aa854059b83979b55ac382777e351589d266d3ceba76a5bc345c5514f4f07e79e54a8b70a024cb031808bc13524c04b4d1fe28781da04688bad13f379a0659915ce438985428473823a70687daa8b6afb659edf07e25518b00114e9847e3d6598f23f2eecf07e59cd2a801eea6e3891735e457b7fa03872358e682571fec629cf19f17fe167a6253dee7b6deb39773e0d3606e025df91f35fc27be8c046d67489e010f743d84599283fcc418b628dc244d2f859db667c376b2953991e0db773b3e068c1da262302c391681fb414c26c41ed85eb4212e982d0e15eab5a67257a3ff913ce68d6aed6e9a8ff385c7d878cd4789ec9adee99fe25438911252de7a7cf6ef5d6662cb424208003d0ddc04d38e04c32d9beb4f6e8cbb19a8dc0835515bb5ddbc600f148861d6dec69dc8cbd4aaa7fbbe49f782199d618cfcc9820e77f2a474a3fa219c384d66bc8abccecf9f82caed37f05f3f0e1d448af96a5a8287a8c877b25b842dd9e0f66ef810f1b0be4e76f8f4e6e15d7eeadd07633fa3763c493e12a84639f76f67cfc823ab945403ce84d50263edcc95223a22acebb79b85aecd82b3aee931c891ba61bd8ff94c625cfa4d55e1b2bd996b5d99e6cab245e243e6414005f1cc4f0dea54b35e1309cc2db46cd785b294aad50ebd634d363688e3206a57fe38d83cc068c4b8504c11bb4c1d256d496513667170163f7ec98b5b9c3e23777d6a3cf72598ed68fc51466ec4e3ebd0412e002af200f1bc8800400e816ab29293b1c7ef24e30415a8e513e4a9efc851fa549b3d1e0d881fda0a6c393d0ff0c57f44260b3f5d7dd60408ca687429c4cd4274c206f80833d605290e5c992f17e05dbc9552f8c40300bc1f3480c6bb404c75c4220d8888afeaa779eb0f625c5c044bb12349af62adf5b0a18e07b37c954146851dd628dc26e894ffea95c84e78a75c25cb751cc81dc93d3146b6beee9871ca3004af6e644b65e972df9934717e075b53eaa6c878cb94f5d1fea89c3e8c9da4d0bd7d8d8ffedda0b48eee4c9877748be05a06b3e69342d5366e9db9be38f36af0f759fb6904876f5ce327dfc777fad8732e4372ada25106477d8311095b8d9dc4c0100cffd70847305695be46b2b5ba8df8ab3de333d09a7f32736061eadf9182bc4c0ea5965ba7d91d655d6942f0796fb4a05c959b6afb52a8b943065de6e0eae3639006c5b130b0a8b00b617409c5c8d5cfcdd88b1e981930ec92f21ada92a8373fc7b49d3ccc5c63b776849d5efa51de531f9387a9d11ae9fba6987d6b680fe15fc19c88bf0b5e1764044bd689554a12c8013f1e7dd6d2214c74c3fa65b4a0a35bf479d2582e948ef91c464c4dbfbea80d42bc8b1ce1fa42ccc38f492e3acf93b2b64f5e956fb171eb2c0e4ff537c4ea2ca13978dbd280aaa1d5a798b423942b6897663aa75d4c153f76d653b4fbdda2d2e141e9731679d52225fbc6dd0e81e03095b37af927e0c2aaf7eea5bdcbf59749e54e391b2af88626ef8f86920c81043334b3a09acd8c0a20e9aa0849dd56a2643803d133fefa3ee0f6b52b6109170ec5d6a15d0d20f7fb546ed78930b4298f4b5623ed912d0a5d6688b05b1b5c892e6fe60b2f1c68623bcf9a0ed513ac75c17cde5e01c3be75b1ce441174d26244873a7946ec1953666512efae05547dc8cf58fc342b262c3ab072f29ee876327e1de6c67f5c480814ea26702e1c7672de4655a87350b38f7b290cb22a3a0725f8aa2d24a794fea6f70fac5a345fc426ea2931cc3890b8cae7e92cc171d86f5f1baddae8f4b1db7aab80e629022eccfad9276c578d2a6085a446ed4b017e6a0da40343be3761f190d801283c061865610c3173753384bf87ef3ec78e63aebb1b051236f9f4d6712b487f0c407a44c7241c96e2af404a2ca14b8b6a11564d0aa2b6efe18072d6d596e26d105783a57beb5954f6066f7d2f4eefc2b455171d56364b21c3d8747d5f407cff5bd8bd350d904c17a4b91f37b48ffca09e5334420bdcb6fc3797417cf99af8773a027d0dccf56087c7e751e519c365119dd9195ee2449de13aac6d538c31d58dfb3b4183be4e71f6b4893ca588876514b581b03ac897b5e9305234740858f2b2a368b26b4d560c54a3f1018df913344d66229c56b3995a9c67d5f6db145e495159501522472dfd3d38deebf4c8cdd698325914d7472d02c49af1a9c85d20c019b03259a849130a53909929695a2f911e11f04caec36280f9653218911f4fa62ff63d77ecbeab3f2eaa235598617c424eb6caceaf365fdb7659eb06569623d38e47306ca2dfa98398586c4d5aba8ee29b9046416b3d7c6660b03aa5f59ca921e9f25090769428587428c8715f053323dff1eecbc2bec9ce90bda4d890416fcb952018f50f9ac9119d45e7ed56af58a4d0d9ab8a2a301eb17325f89359575a6277d340c8fb40f3271387fcbe04f2d3c1d63b490d12b5d2e8e592529c62d07d5d9c315f54157d30cf5ffb870b6a466c6c1f19fd0aa4b8973f1c3492b77cd7aeea7bd85f21cec76b61c3183cccf83e754d8ecca2b2e39420fbd4724f03efd9b6f4d4d59f1e8cdc3746b1dfebcad85287127de3658c2aadaa514e35c84bc772839575622d872a0e8469b3eec05e143b2129c6a75d1d4f043b2785fd2818a3db7dcf2991ea95caf73db5b2340df001771a8548db332006378466ff16dd0c60fcf6fe0c185da8e501afebcc9f566e1ff34f69b5af7997e6413c9e17e34745e131edce9820540c07ada9f500368b0f3dda452b3d1f8312e2926e20ad55fd398d21fed2ae3440834c9779d747f4553cfa2d5edd8242f3e6b1b3694031fa2c7430e78f117e69487798f1f3ac539979e29cb69ec44d8dcf6d0220d956cb4e6a5c9b8ce5263a950362f88f3ba56ad7d2f38fcfb2195cfe79baf44845dc124aeb5283962691abc25a4e016bed2f127e4e6bb78b22437ebc87cc975fc898793dd20f94784cad271dafeda980b4c6a91de39ba71eed0529bf05907db0b1bb9ff09e2bbec611d8238eac1939c3a7fabe8ab631337300ed6c40dbd5299f934790137ea875e54af87a60a169eb920522af2a50b62856a6e471e6c52f285cca854d0bc98b69622aa2c4364843279ac21eb4002c9814fec8be3de5f1e587ea62b0b2f1b5313b69ea407f1f2b7bab8c13cd54ce2a7704ee97d01c1d40feca1aa698fd90b2003507b32644043254dc61ac50f92840a408c62d6754e80108ca656b0ac977e9d1da44f87f4e8be3f1b2258f092714b9c4027b1678388546031a1c7391d9a151a33c5d291d85a457fe46b12ba6faac046630ad646fd5705a67ae2b2f85e4a79f780bf506829fc9cdcf6b8c2cad831ef7b26b37d3db8d4cf63776eb60151f17b68d86002e878c6198c171c8db609f870ef0ce62bc27b0c97788c25262020c4b42036ac3ea666429f7a47248fc41126bfc5777ea036775437b9d14154aea29884aee95e46966699a6a5707726057de573d77f31d190624dc3833c939c318784fb1d80c448fca6f0af4cd18168cb40d3c19377852195ba42da113d5953c1a0fbe5d188d884f6162503d69442798c891d1fa0c706c80565b9e6300918e6f718770058f18e80ae393a96c83a987ab08b2065c42d02f03d88385f1b2041ed70b90b124b6973990d61cff38b493c778c3eb26c722408f4060da392632be571b7260051cf18dfaea3efbc3d37c67b0c182a0cfacc1d013c38ad0592bfd868797790bc8f5a5e2a95c33bf078bfcee82afa438cd4ce48eb8698906cee16e0eee03c551d8c0df8d3448924d3d1108a6dd89739ae1745d637035af515ef94ab3ef461eb479281e743b9d7ea10e7bc1a033da2eac28a97e1b81550c32033ad630efa2a6ec9f666c34adf8dab8367a40c21f1b70fb8254976eed50be0764be04e62cb0427cfa51a9b78d1f4ddfa09c995d20fa0cc3cda2978ccc762146ce9441394df789bfd8233950f84df64d20808758f19e00b5c6aabe64d3c23f709ce866fffa5d35590801459f076e6751827d131185e36e818c30bd5ade360e4f0818a03188a5266c44747ed5e7154c4c93a87f0ce05b745bc7ebd3fe011c5169f1ca118bab34337eeb61206f251d8a0307f6dcb33aea11b1ec7eb888667c7145b2fc601dac47787c842a45ee0f5af1811b7a57759c14f5da6f8b86f73a3bea7b3f1effd9366dc6658fb3b8510f54621d8d13f330163a6530da45f7263a8fda2c43123ef46580b3990d51def937db27f9e06e87fdfd186df2fd6a5dd6133a8f3ee06e0e14719861def6cccf68f085caa631db3e85b4bcdedf83923c2950665b0187e224522060d5d54a02d5501a0c0a384bd247164caedb02c9a69f9a3638d258b945aeba029250ab549478cb855cb27404fa5cdb15a46b9f1ff8dda401f2dd472a6d6c66dfe8f5f7449238eb959c091db1c26e5efb5e7efe096489c7a25515de6399d7399b793aea554bf9fa1f6083f3c955f144171e8584b133a2ea77f49c974c2e79846e83541f37e0671d65173b3327de75c5173644959ba119f49195ed3ca26b144ca3001aa5044d46781a1336967911496da309744bb6ad244d1a96d47c7089c539486a1977a63b6523782bc2701495d50ea208a7fa411c70953cb506befe8ef37cc41dded7edc0a91de2e952abe338141e020afcff657e3eae7d11b384b0a496dc105fcba6c9cb3404dc20c704f0d37c5a96cc37ee132c47ce1ad12791d48a96ea2dfd0881b1d1d777619405b9040fb52cb1a7ca1ca993f34eaa2a7e97edeec2382ff73bfcf3ed5b6fd911c8d610551aaf92c92111d95a3919e20974ac27f3ceabe6aa3be7b6bceab0080f7ad9ee3d48bdfa7e44f6c71845c4e744726f1069324c519188d7ea3607d466ffd25b2d65a4ae1023929087e959eb8277eb495fa4dbbd1fa2",
     "29490db87ba6b3a46c55524e398000d7f3d50c11aad2b9e3d033e503fa279f77d2a2fca9c8bd026a006ecc4c913dd3fa519594784c9eb43a9e3f862c3014cc1f01284545004d3733e63b6832607685b329988f26dc394bf17d2d4355e5e4622f86a4a2179b48f6e3a2eb391c343364a6040a384e70babdfb557d23fbf08730f9e8894f28b6c43a8fee397bdb39555c9e1cb389388776f72ac3c88656e4f36ff032c6324d68949bd2608313651eb6662095d40ed72a89dc85b420168c1c299f78ef8601609c1a5a29625545794b89a01e13cbaa339c05f7504bd45b79239d8f0ed106450918fc0be03205e414a58c734cc9fa134e6d7af2e106f25861511c6bb1510f1a4a493bacbad33bea4f41c3d8d28488a87d8fc\nresult = valid\nsalt = 1aa93ccbc92e29d7016f71e7f806bae2027f62c4\nsize = 5100\n\n# tcId = 26\n# invalid output size\nikm = 7727bdfb91621dcd4ca5e8cea6b4e2eb\ninfo = f3fecf4736e28862\nokm = \nresult = invalid\nsalt = 96b2e11fe817e1e40fba8aa5083cd490482b2abe\nsize = 5101\nflags = SizeTooLarge\n\n# tcId = 27\n# output collision for different salts\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = bfe5a1669df67ed5638007f620875759af8c0242535a263cd4d17ee9bd9219d2\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 28\n# output collision for different salts\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = bfe5a1669df67ed5638007f620875759af8c0242535a263cd4d17ee9bd9219d2\nresult = valid\nsalt = 0000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 29\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = ef793d5a62169cc1911fe5dac7ddb3ce07404e8299296f7c139442b721a75ef4\nresult = valid\nsalt = 329f445e7de8a156cf26a0208dbb028d9de6ef76b8de67ca634f4a5a732138a1bd436a7b345d7a0314c7ed0a00b0d34ecad2cb8bd141e2ecc1c77e237094d55154\nsize = 32\n\n# tcId = 30\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = ef793d5a62169cc1911fe5dac7ddb3ce07404e8299296f7c139442b721a75ef4\nresult = valid\nsalt = ff881c9fd53adc0535d68f4690bbbd4f4990c7c1\nsize = 32\n\n# tcId = 31\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb0536\nsize = 32\n\n# tcId = 32\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb05360000000000000000\nsize = 32\n\n# tcId = 33\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb053600000000000000000000000000000000\nsize = 32\n\n# tcId = 34\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb0536000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 35\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb05360000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 36\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb053600000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 37\n# a salt shorter than the block size is padded with zeros.\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 2a031029e1b02289917618b7e0dcaf0226f84ff1a5770896c92e42cbe6d27d00\nresult = valid\nsalt = e69dcaad55fb0536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n[keySize = 160]\n\n# tcId = 38\nikm = e2865d6bbc1abf6a815067edc4ee7aa33c290d5a\ninfo = \nokm = 1c9f5d2c19e47feddf19af9bbf38ed6aab1f872b\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 39\nikm = 8c177ab5f40e9c57203883562f01f174070ccd97\ninfo = \nokm = 07d4aa3e002dad7940089482d10e80b349da499fe7d9530b27a8dc5c61940bb44aa703fba340d21c1fec\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 40\nikm = e842a4fc1a147cf2f87de9bd5a42fce6457496f7\ninfo = \nokm = 5f426da341127db39b959cd77c13cfa4a7a29259f105f2b181067492a54ba259020a5289b0fff0ffe0b9f72606bb980c929a1aa37255d3cec453bdfb26a3ffe0\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 41\nikm = 5b870ee1bb97ee83f67fa7335b4a0f9dadc80d12\ninfo = 0a0dfb2a6e051441678788bdec04cc1b63ebe1f4\nokm = 31aa4cff955a0bc5884e1653087f9d97e284775c\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 42\nikm = 58ea7ab33acff514ec08f41e59c17a3c66c1ceef\ninfo = 1cf9e25bd70c5546ea7a79eaf5d90cacf754c4f0\nokm = 16ec1734868565540efe2967cae02d8be26a86abe83edcb4b599f08e016b25b925660179b9dcbf0bf07b\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 43\nikm = e8d20934b9d320458f4854e2442e2f0fa092f461\ninfo = 4425999958aa3cc629300c25ab15be8cea7a4277\nokm = ad2bdb5383dc53258ca2051b26c53adc156b31acaf61ecef7d0ecfa14b81b0f53b1c98ce28ee804e964f8b106312f429670287ddcf5bbb67bcbf96ac66c242b5\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 44\nikm = dc9e488c684dbf0ac8ff1eefaa0666d413d258f0\ninfo = \nokm = 65580e5feab001f31405f812d87c7d8bcc187c78\nresult = valid\nsalt = 9afa7df500d7a17af1f44422d25a62bf\nsize = 20\n\n# tcId = 45\nikm = 34b85c341a04cbade472b3f7dee4de4d1954bf70\ninfo = \nokm = e02ff2640000391f1fcb3d0fcec40150b20c5af7c3a0c4965281e1761539d48555cddb2cc35efd27ff86\nresult = valid\nsalt = b066b42acea664350a8448f8e064225f\nsize = 42\n\n# tcId = 46\nikm = 44cc641e09f7d5642f7b6007ca5a1c0813319666\ninfo = \nokm = 81c3016fe63b57cfcb13ad04eea7e2f5ab1402dc489c20824271c5a95ac1cb9b0809d76d5d7437e4ac74a36c1693d964d37d10064649fe9003503197456dc4d2\nresult = valid\nsalt = 69c0dde6c8e5bd40553a5981fad6ad87\nsize = 64\n\n# tcId = 47\nikm = 88a8880cc2b73e73b3b6ca1d4902caf2128732c3\ninfo = 6dc723df3d26f704067afb2fb6d95a66516d089c\nokm = 69614a2ebf14d74188e830ee5623c0e0366ea994\nresult = valid\nsalt = 0579f690ed32e57a26701a9f6877f243\nsize = 20\n\n# tcId = 48\nikm = 8408668b9d671121b8c7d31113f045c0d7c020fe\ninfo = b4451b0f1a217db703582881e86d8044d5f2e092\nokm = 6a6ee276cb321c6cf237360a7b30faab9060653ecad213a3aee36735e29164c6fc929b7f206ea4fc2f1c\nresult = valid\nsalt = 679b30e6930a8ea3f076e317b9595d5e\nsize = 42\n\n# tcId = 49\nikm = e6715cc4ee13c4d999d8f8f500243c321f70b0be\ninfo = ef17c9227a5ca654fbdb35dd00dd6dc77b6321de\nokm = 1532fbae2e75d854c96a0b172cbe40b91d36143a93bd1b68d26be85f19de06f585d8670190380dd0690f5fd168cd0c64bcbd99b8dcb9fda9eb345af917f75739\nresult = valid\nsalt = ecfaca2ea3301a992b4de081d9d3a4cc\nsize = 64\n\n# tcId = 50\nikm = 9a6b88f3f68f5a8e79903b51dcd733abaece1a41\ninfo = \nokm = 0b45a0d3ee381c5c1a33556af0a050c81a336f9d\nresult = valid\nsalt = 0226df3d66ee3abb275eb39c8ec3d3e12e9b87b67f85c552accc4279ec17\nsize = 20\n\n# tcId = 51\nikm = 0b9eaec88b2940a4754e83272cbf47fb6f86aaa1\ninfo = \nokm = 844af69cb0e4dbd1a768f69c4a5d2b280b645e48f11cf9f9dfd5930dacae47f5a8a0a58cda227747638f\nresult = valid\nsalt = c1616497d49246400ba68242b635c67515d2528ee1c3b71b318b631f9bef\nsize = 42\n\n# tcId = 52\nikm = c4717276e7c7f794c4ee333b2f7a2ab244be9e8c\ninfo = \nokm = e1e9d8dabba5f8bf934c933170abf15edfa69a19e32666503b00694a1952c38c16703c79ee41d76cc6219533876d162727fa738b949b74b8d04a880d7e917dba\nresult = valid\nsalt = af4c63e5b554063e83e37bf730ffa401c696088ccc4f133a8695ffcbf2a9\nsize = 64\n\n# tcId = 53\nikm = 5e43a900ee0d432c5fe6fc81db8d5f81a54e39df\ninfo = 32460280e60910b10abee2e9f80a3dab48acbc59\nokm = 113ea70eb9eb87624ca2956afa5d5acdb4a5eabd",
@@ -3431,9 +3530,9 @@
     "00cdd0299971ac4f1cdfc6af7de2a3f131c868714a24b3c0aff8162951852aa97a29cee9eb7558bd2f384065130abc4de58ee5b268aab6b2380d885e5c98d22138fdf77bff9fe2370eff28f22a4515341d9c226a6dded964086f3bcb5342acee09451c6257eeb434b61b8d93b0850d49e2d229fbd0bb84ba4efa3fc1c2d59a2e725a528fcdb44d43a0e1f5572d52b3f526581af49043d939e9857713d04ba2a96139e007b974b2971f71a0bbdfa76998f250802eecce869bee6e4bd3e4523c3b5d32a61c9f9aa1e0bc215484a4b11bc81ba3b2562ea49d08f63b46edfdcdcb7a496f414d80f853547ae94d8654de4729774b08dfe3acb94ec5ee2a940efef53bb76d2517ffe1acc915ea5c17652ec6651d3f7734cb8b7aa176c5f2e601dc42f0700357b592d4bc72c25e42ad9897ef1fb43bec5be51b7225e57b87732383d0274e1a9594d4cc22451611ec5de786e31a69fdb3c5aa4a857e02539f1655c542c84a32f40dffc4ae8d83ae8c8f7e54dfcc4362fb4c8134a9137836f0ea40b329bb7040eacb31e7b362010fda9fabfa96622db22316c3b297e26d2b867bdee55f600e97d338cd5a2969f38a76f968d9b76aabc392bf1089c0f99dad174b6f8b8e9897bbb0680e9fb08b39f1b9d618b81e1295b546c3ddf7b8b807950199d9fb48a3c1754d97344908e8a4831477132cc7e8525a5fbbe15608619dd369ace1f9c73c67224358f4ce07dbb3cde19df4bac7bc706f18df54c17c3a8284610ae25c00913edbaf2c9fc8ef582ea3ba5c50b7d15a93acc50f632ce4473009da29a6e1852e752a15e6b7c56f5a0dfe65e5cdd00edd363469dcb9866397646722c6ae0f48502dc75bf8381225a17f3533be924a0864f60ba58341a75b1a83404d1d4380f0565c3d55533e858d4c9f427c712965c015fe91589d43a4ef4e95f4bcff164ba8752ed83cb57a7b460d2c9796177433588f800fcd518c5e99baf8ed652e61c1fb4d47a882174e4a0d2d03078b2316327799adb88d07270fc7c9d7919b6be24bbbe2ee7999ca00eae4c64c19e217196c8df9a45d7a9009f11444340eac6454db20263873c86d884d466dd75ffa5315a693fca6ed2af24452a48c9a5e36c1cd7408f5e6a8fbc41e3653986e0f355a05288c51d1f911c494540e9eb164e2cf270d4d07c334a47fdd3d870a2fe69516f8b4ddbc3c0f21179c3ba3863d2851ee1ff0f336a23add665ddbbf7a8168c6e04119eaf4944b132df977cfc826cb53768c275848a498fb3c68a352c1d0a51701bdbe7194beb546c6f9cca343a7e3d86aa74cae125b926dcb5037bf7b3ac08e15c024b1997c4d01f95fc1a941027f8efc6b8abf34c6b25aed0b4052c0bf15aa56812d90c7a43856d9134dc1140788dd2300c555a0ede7be750bea34dd3f8ccbdba143abf975879f9e374b6d417fba64e22b5c848189173a9f972176ca68e2591e4be093e51ba3775443101767db9be8dd92953ce03d91a9f1bb3ebf0a3bdc434be0197f527da23927d8ab4ce0613e363fb7acafa3f2b11ad4c1f12a1990c431bf2553d936d98822a1c893a41663b0ccae8541da379d14895584151c57605c76390b1c91dbc752acae6ad571ab4d0a47e2a4db7b88fedf2081e1c0bb0cf5f60230129711586fa5c99fd34cc3816fcc30644195c4bb72fe8578d4007f7cc16ede32eaf34ce19084782080e2815f25d117dd1d911601fb77bc0e471189fd0a4bbe01b1aa979f052e0431dae1abd9dc8e2cb7d575c5749fdd82f247f1686c24677f8d3a358b6860632d26af38f2d4c91457372c11acde9b447fa1a598b5ec1a3ac0babdbd4eb737f3c4c2f2e15b5d8df3b8d6e6b70a3cd365b57349e6ac60b8759bb09bbef1855c1468d10a777a2babb7e77313a321f2169761108d5e8f11c51c1314fe8fd59aea60551c402c4102d08f4d0c54e4a8ad7303905e42bae5b1ceb09119324e274b63c32215eedf7dc51e4f1ed19f013c5a23c8a2f0841eafbe1ae2ea5f4cf20719010a448f154397b6c65be5867508cf112f9f2ff236024c8254d921c8de4e4c39d91e847e7aef69a2747f75edde39e3adc4c653f20d5742606baaf985260b955c2b6e1947b469927a61d866f797e73fadb2821ffe03c109219078d8c24c852188e3352fe257ca3e371043470575f1b180d0747550d9ae8b55b29b06be0cdfe6955a1acba316f2e0d9fc4a99d7725d022fc240e3956bd66425dd2c844b4824cb5307af5d6d77ee97590ecd849650cab25567bdfef5661d35966a16ad5fea8ca1dad42e19bb6b2b28b06e24dcd8bb240e065ea027ca71ee286e9b8c7a4100f1f08391dfdc0ea125e35c2867aa55f21af22a5ff685ef1bc3a023453bdd381b3cc0a1f0470f0e198c8e9ece8d469479b73f3eced657dabb588b95f82de80b58a924e41146274cdd7b32aaf7c2c1f600f30353cbd88bd236c37619ec4c54f44dad9eb79b5e0f5900dedf93b43e33b94a0bbd24bcf17aa7986287232717a8ccf085ba6826f7224d4a35fbee2592b32ad48cbb30961d2412c65f6d6385107267b7595568d7d76fc8cf4ec6fb06f1c38d29357511454a28ef029da6b9007f3d6a400c381f4b0bd99c5f8371d97a7adcf122bc8d1b51f914016fc96f1ebf1628d62d0c1ff93bc16b960f93d782c66d73023685a881acef65f40e5891132e723697082b8a9bc48eaa170e5935a801914c175906b0e7a54f199907562bc2a3d919bc41b4b4fc43872aceceb494f186fd2510925d082c623a3f17f80d1d421710b91035dcfdfdb912b84270e07c9be495e8713ff51df5eda5a030e51516917605e24d29f2238d27b2a823443e8c7659c62ee4d69d3094e95e630e27e2c0c913d200e23fdfb947f7d2d2037284680aac2d002adb79848e99ca1ee7d5c40e190a3ef5f05c59eeadc97449300b0f41943dd70f3ca2f59a218a093cc036cad4f8f3bf1d488f402d5c5abf5ac9fee0263f6d44fae0d5c157ac12b78032604b618bd66a2dbec688b28a0c301ae294b1e2fffaf0f4f92030aaf4154f91baa6d1167ace84be70da0cb2c38c1f1e8a0e8a7474f3f3e508c1fc9d4a431e2f1f45d142f8cc22af65ac656b94109905ca95d33e809586d3b409ca68269bda1368ecd8e9b6e2d95327aa491b6bc162a9f6c4e8162809b0efd7bee9e4c915534083d5cb9ff27bfaa40f7cfacd1c301c740254ab4421aaeb4fdf8d6f46014a3c3ea23256ac64fb2fc95cfb99688a8788759d1dc35992d455b3ecc4a4c99ebab223d774270d7ebefa8545203cefd49bb21397b6d68664dad1b3461a5162fced871d8fc2160d57834356ec88841f89da475fa7acebcc2321f04c6cb56268b42087b52191d43bc82c29c44d451d6798758b43040617a6024b5750577ee3679f43e08a893da6c330b54cbcb6a3c6eee525d4740ad5cca9c7dd75c3d1b24801961f7a517386fb0ed2b181521ab207574fd4edfa09597afd0fe976d2edc428ea28ba9a5c96162bf891e6b50e345855bd6852252959586aaeb63c1aa0c07c422d70e5655507c090ee47e98c2b7cecfa6a4d11210ee8f22a28806b5f5dce15f139385dcccd2838a7c6c71740b80a7f0239706fde8be06cb1e8e352c176b8bb564b5cc98eec6d4a554a4d7bca07b5f72ca8131fa8479d706d367d32d1652c6f8ec4b9cd374153acdf29bdedd5d385e3b581a3142092b28cc3c8d89c3470cf56ceb9109d70d5a0d98ebe4e9432143d6ccd58fcde6a1f0eaa845175dca5ff85dcfa5448bae273be2dd5354654763de0f2fb0974164f001b42d1156ede02fce2ca912355d59e510ddef52589210506439138c230298e2c7f1b76a4ca7dbcffda66fa2a52e146dcca8ecc0cfae3340fccd033e83fb85cd3ceb30ff33a8bfaac4e9d3c28bd0a1ab89d6582c3c9cc6894e299e71551e4f394ffd81b0a67985a65c9c9850ce869635da0c769bb283bf27c1c2b70fac3b7f0ec6773351753c7527cab97a982722b422eb950b41b9e03e025c17c8dc73852490bc83e82ae956b2c546aa0b1c9a06dd9d4c60c3702753385f67df61422906f5a63cc5ff225efdfd57d9e33acc917b68661c8145e2db301777659692925511534e701ad80c46479e5808aeb1f90ed45526ccf995255555d57f987e2e56bfb04233aad88790207b67b7675db58cc00f7594bfe5089671617991124b72ad32d46b304a87c2a5074c581421652bd730808ebb039e74cdd6dfd1f8dcbb55f978458d1b161780fbbbfa52e3a2288653210c0ba901b385dd7d886cb2db18407b37e3c455b2773bc670436ff702af2bd9d87dce441ed7083231763ca76fb07389de0be1029f29c0fc873fc2c986ffb21724c6c1a746ec03729a0d9cdcf123129c550b8e1500968110c363bdf0fd68df0e3a60146790b216447f82b17718c3ceff4df0ee840f42712f9bf4b898ac9e703afd5869309d89604f2c6fdae0c8ca348e1a980303c522d89949dda61e02982814708630324e6362839f3d28b80adf42a0772c52b532ebb2636c8a006a39b0d384cdabcfab075e66116fdd9ad6c6af17cc812d4b691708f671d9a63244dd833e2c3a90aadfd68ddc03fa290663f0fc7445aee617dca94941f94ca0c6638d99b92f0ed7ebbe5fb6f1c02273751094d8aaee32772365cd8efdb5a85290bb356c4c787dd8bbb9a97ae562c27941bc68cd38f314080c89e27fc1bd7f45bca8412149be8260eec24928f77fc7a722a42e5050ab5d135985c56cb68abd5b7ec49c56ec519c63373a1c8d6dee785671e3c104ca6f5c740c7ca3bb1fd8cce68a097c540fa40f9a4f2b21a7853554556596665881038d4d4530862931aca8cd76e412bf5d2ef66b0d67ba991c4c676d95e2a8d6a4ba8b9dc70e165c697227e59323c96f28f81d79db8ac1fb80de77f13358a2255b9a8c56eeb7a4e504de72e71d31cc6e4b4166313035bb6a44dd80a369c9106e9baf69f5963f92b2bc7c16d39e0e8b88611c36523a7635bf8172b995892bf67bf2f5b4d971508f1a1a8d8d1bbfc46f87f2bc50ef30a8922a354764c66e9daa50194e3ee90ad0b59072fa84b1c2e36f93446c9b920f543ddbb0485f18191cd1aba0387d7793aa3b6e62dc49e3bb5b7ec1cc06840fb671dfb8e6c185ae1e0c62a142d244863689a5772eb78c6356122498bc088e53f0c6895cdb1cf0f646ac6db2d8efdeea5f7ff23c91901c4d496e34550695667a7db538e2a4982d34e8256f18be3d493fa2cbe46c1f04b0474328f4eb417ba155cf3d926107845f0a734488bfc5c9c3b0b236750bcbe0bed15b7a5d219a7c2df95d3505a4f116fa6dafa8b746f4d1fdb1a502d9a45849cf2cad4dbe24eae0b65cf4f38ee38078997a5ade9ccf13fe11206362300fff7628603a4707c1c2fd5eb883f5321e8882c1dcfa1867877447ed9b6813031b95ab9603ced93317b265f70229bfd702da85e3ec5df6d2b9dc2958fb9a0f99e501efd391e22c0e198eec87bd2db850058e6f42b53d888cf8c5fb400ecf6e804554fe2b8e7a3a9d9db7a7704c3a2c82643816d8362c909720a693b665d3eb\nresult = valid\nsalt = bd5cafafd71f517269ce6300208db7593c558639\nsize = 5100\n\n# tcId = 95\n# invalid output size\nikm = ac106eababe3b8fcdfe44ed3f332695aa50833d5d110632b4215a86f9f4ceebb\ninfo = 9824a5f84186c0ea\nokm = \nresult = invalid\nsalt = aac161c03b3d3cf4d94072a48fd6ca3619510888\nsize = 5101\nflags = SizeTooLarge\n\n# tcId = 96\n# output collision for ",
     "different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 06e27d970948bb30a9d453d843ab332ae2231dfdffbc4815788695c38368fb03\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 97\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 06e27d970948bb30a9d453d843ab332ae2231dfdffbc4815788695c38368fb03\nresult = valid\nsalt = 0000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 98\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = e86ef68c222337607de55e6bef35d9df3563cfd8754a5a231a5fb110f1ed1b40\nresult = valid\nsalt = 0102c651e047fed9c217bcf915520532d44999534c1e7e7c87311093d7a3681aff3e2d335b3c6139b9fc66dcfe35573b36a329a550c4cd20bfe2a90dfea50167ff\nsize = 32\n\n# tcId = 99\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = e86ef68c222337607de55e6bef35d9df3563cfd8754a5a231a5fb110f1ed1b40\nresult = valid\nsalt = ce4fbf306d1eecef0d60543d9726b5b3d3d5d8d2\nsize = 32\n\n# tcId = 100\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed66\nsize = 32\n\n# tcId = 101\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000\nsize = 32\n\n# tcId = 102\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000\nsize = 32\n\n# tcId = 103\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 104\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 105\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 106\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 87cf7342816d0b08822263edae8567b453a251373e2f3ce338114b6738cdd1b4\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n",
 };
-static const size_t kLen125 = 80000;
+static const size_t kLen141 = 80000;
 
-static const char *kData125[] = {
+static const char *kData141[] = {
     "# Imported from Wycheproof's hkdf_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HKDF-SHA-256\n# Generator version: 0.8rc17\n\n[keySize = 176]\n\n# tcId = 1\n# RFC 5869\nikm = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\ninfo = f0f1f2f3f4f5f6f7f8f9\nokm = 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865\nresult = valid\nsalt = 000102030405060708090a0b0c\nsize = 42\n\n# tcId = 2\n# RFC 5869\nikm = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\ninfo = \nokm = 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n[keySize = 640]\n\n# tcId = 3\n# RFC 5869\nikm = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f\ninfo = b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nokm = b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87\nresult = valid\nsalt = 606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf\nsize = 82\n\n[keySize = 128]\n\n# tcId = 4\nikm = 60ab7f45b0ad534683b3a6c020d4f775\ninfo = \nokm = ae5dbce80bbab5bca5b3c6d3b7e6548fb2c23b2f\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 5\nikm = e3db76e02278cbd2adbcb4555803da11\ninfo = \nokm = 207ebfa8798c6d8d5260d797fdb9c9969173442186d9e932b18fb589fee2fd00ca4ab49d0402aba2c1b0\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 6\nikm = d4dcb92a769f57c8bab8a420ee0aa351\ninfo = \nokm = d875a072bb18fd7717ceaac8829178884b8e51a926849210caf7f42574109f218596e27b92041155d2012917c20e09539bf52016d78aac0b53a51d9cc21e3b15\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 7\nikm = 2d43e54bf0c94c9cbff4300f4aa69ab8\ninfo = d674da3bb47d5c7e38b501e5251d9348af601c44\nokm = 3d36966f29c0561b4e50f9325c7c98292b6d28bc\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 8\nikm = 4055536896c406d5fe14a6cd6b999bff\ninfo = 2094768a8816f7df070d6e08b7ad93755dc9024b\nokm = b10173a66a08fffa6cf7c1057744eba73cbbde83a3d8674bb0bc1a46d80792a9d5a0d2ca72510e02a6e4\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 9\nikm = 5b01b2da3166f217cdd68de8af60078f\ninfo = 6884cfa7ffe8f27bf4ebc6e46a7e01488c79243a\nokm = 7a8e83577d8aeb830d772d8e42fbd105e54ee3f38da12388030580c8b8935f4a2be01c5092f28d5b1bb757bec0a527250eba2549e770d21224e1cdaa5bb76a98\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 10\nikm = 467403c2ec02a235bf730ff37e8d8ff3\ninfo = \nokm = 4b1c4f54615e31f713f2364bf194d3f14f68e704\nresult = valid\nsalt = 41f0f173d307d40436c25856cf559f96\nsize = 20\n\n# tcId = 11\nikm = 3352f942aa93071da6d39cc5ed8dc460\ninfo = \nokm = a6823c9940138becba3f9baac05ec119a2715a018f51f4c0ce2add465db8635a6453efdf7c161c2d172a\nresult = valid\nsalt = 57a0db708b25a51afc4271803aa35204\nsize = 42\n\n# tcId = 12\nikm = 08867e76311126089356623ba5381e73\ninfo = \nokm = ce632c353328d59ec519023d08652a97252f2c8f3f29104237fe35261c82eed7e0df52514a157a00fd82d7e46ebf9acc23512e1cda7d5b65b92f692965943e8d\nresult = valid\nsalt = 0c164c443edcdfaedb1ab150f047951f\nsize = 64\n\n# tcId = 13\nikm = c55c41d69d2424a520414e3662aa7303\ninfo = 3fdf20538063b76901d61bbf9b72b0c18749e00e\nokm = 7fce7c021469c8e016f7a9eee111ad71df7c4fdf\nresult = valid\nsalt = fea9bfc92b74337e43a201a2dc199e27\nsize = 20\n\n# tcId = 14\nikm = 5d3db20e8238a90b62a600fa57fdb318\ninfo = 2bc5f39032b6fc87da69ba8711ce735b169646fd\nokm = d3e6274c91a88821367b1853b852a96f3ec12ed466769fdb88e14622165d5878cd736fecc93b9e8633e0\nresult = valid\nsalt = 1d6f3b38a1e607b5e6bcd4af1800a9d3\nsize = 42\n\n# tcId = 15\nikm = 8677dc79233ef3480777c4c601ef4f0b\ninfo = a38f634d947819a9bfa792174b42baa20c9fce15\nokm = 17c2b03dc593fe9bb94f5b9bf646ff15749e82cd4bf569f7806275c241c83e1fe0615663a628ecfd7c1b700215a450f9f42529800424c4707d54488150299f11\nresult = valid\nsalt = ad88db718244e2cb60e35f874d7ad81f\nsize = 64\n\n# tcId = 16\nikm = 0f602703d37943e0253bed3da331aff4\ninfo = \nokm = ff23874bcf844f88f2fb57c0c3a4e3a7a498965c\nresult = valid\nsalt = ebdc8510499f69b2e188daab77cd819cccb95f276f46e6b2be11cbe72700\nsize = 20\n\n# tcId = 17\nikm = 9fe65737574c5c7aa67646adf8230ba8\ninfo = \nokm = 19d4b9e3bf37ca1affeb953ac3a593882b2dd0002409be198718b376253f1e8522af9f276152739e2d5c\nresult = valid\nsalt = 73a34648c152443586236abcb46a090ce55ef6c7f282ffce6342d694650a\nsize = 42\n\n# tcId = 18\nikm = e8f2b1c3e6a6c3d5ee0a20dd47aafa78\ninfo = \nokm = d623e645a84b5ed4a210b9457aad79c9c3171f306bdb8bc9b60496a99e640cdef1cfb56ee336d216aa20122ee33b91c7aac3e5e7d56d87dbed3a446cd5224208\nresult = valid\nsalt = 3f5e162de91e0782cd189f3b7778cdc2ce6bfe9d3fe841cd3c70475d7b3c\nsize = 64\n\n# tcId = 19\nikm = a679521cdb56aafc5a4b76db0431a4dd\ninfo = 44ec41ab4f4e64f4a36e5e30c9f0dc1d77ae4974\nokm = b75be6d7fdb9a7c58514c81e6596973058e8198e\nresult = valid\nsalt = 123033b1ddaead83a4b9cfef8a660bd8e00fde01e67c35656c6d7607d456\nsize = 20\n\n# tcId = 20\nikm = 49bf155ca102026f2a217ea1bc9843ac\ninfo = 851bda4faa8f7add2a3cbf0acf9c2786f8f955b2\nokm = afcec12e5ba6481f144f6e6bfeab0a054b30f2710aeedea90d4be9c790c8e05e601fcb208afafc6cb991\nresult = valid\nsalt = 76776e3b4d75f8f43dce4bded71f3b1ae6bcb012d9c0d59f78248b9427b8\nsize = 42\n\n# tcId = 21\nikm = 6cf725e939e8824d4392233eeac75d30\ninfo = 495425d9727fee2e2b7e78899868c1c3e7735e1d\nokm = e70ba99926c4edd98bf001ed3c8a1557987449a6fbe58360e96c2d1a3c1f2eac7806fa406ec64c4dc2a743129f97ca449380ff495462d1b1858af83d40fb31ff\nresult = valid\nsalt = 1e72f24b05a91a0093f34306ffced79e7003055b0833c6d0f27a4f33a1bd\nsize = 64\n\n# tcId = 22\nikm = a319ff7b5ba9b14ac72b681cecf0f742\ninfo = \nokm = 31e7b971f165eb923b499460c94937477fd61cc4e96c27fa2abb552accceef42aa3a35637bce32d996e9\nresult = valid\nsalt = d7e3bc6daed343ce77ef793e15a8246e4bfcbaf83d2ac956d0661d1df7262b2e7311623dfe4152caddbfda8fa8ed7a82656ec00b72c5adf7c9d388e5b3bc8d24\nsize = 42\n\n# tcId = 23\nikm = 34bae5a158c1678aa76a744417a70d7a\ninfo = 87ec30aa53acfc3d09ccc1d57d654fdbce403cd4\nokm = b80f7525a93a3f630465033ac53f1ace76caf7dcae3bc7374ffdc6d1be60179e1adb9aa8def2d47823e8\nresult = valid\nsalt = 1532075f363e061133780ac959bf653c7687d181b9431215d6f62dd2f1ec3019d61c50fa82c70ae25e624c849a276b0c57d7c02a4d753fe84a1a6621e9a5ef01\nsize = 42\n\n# tcId = 24\n# maximal output size\nikm = 195b2a73c91f69140910664d79ee7f3c\ninfo = 5b3afef0895fee8a\nokm = ba560d02f6661eb3d0bf3a17438343b231d2757e4c8ac2d0f57de4ae267f3b3a40919c4dde2ad7d11ff636e25e4fdc21db7c2b2f20fa1ce7bd6acd2d534f1f660e0487703adde77a0f72c8e3f2b9202c94527e4bb9adf53a0b897a09abc0dddb7f94e6d6ac00d8eb5233f0b88921c8f4b97a1ebd8dfc32ac5cd089bf07720bec56f85dafe527cdbbeffeb168c8a7867fe35ff6fb57a969189d3c17b230db2d213a6860b5cb678fdc913aef231601d131588f021799625c080013a3547cdca49599368b5a483d830fe182bf4639bf830bdba4e301643c20c09434766dc554d7d4effc7165933ae420b136623ca1314383661593fe5aedddabdb44f77afa633149c832fbefd1c884d2717d61156a1916698ecb30aa2f8a43ef7238eb11e4cb1acc7e98a83f66eb8eb4387a7d6cd26249338054d9e5328d97506ecf06e9bf8923756f2f586dd8f17faf515c75d140f502fd162eb074c250b0c4430b659ee49c0dc2176d60ae2e4818b7089c1ba58cf1d80075ac3446fc8f14ad8a9fe26fc677c398bcafb401dd84755e7e550d20684650ca590376b140942410173149fbd9cbe4781bf81b3a3a2e04130e0b392d747f16aa54b323a8dada9fc690e05f75d9108d49ea10015c90505c2d500ceee985354b28fb74bf5f45c3c412ef281c372f4ee2f8df2ddbe889a9cd541326cc2528728159019bdd4925dce7d8cb6c6672298e24cc8760e8a33a5ec9dfe84725dbaba05a8215b30f0ea143d53706d99351f31fc6632f6a28b57baad13bb6768cf52bafd820ad0b2949b789bb4e4d449c8cf6e6c1543c2882bc225f94f70ca6d25855019f29f9d3ce5746ae88a12b70aca25cc16c7ad19769d63ad0de5e0207c994709755c2816febbdc3c381bcd90c5252139bfe45dc86d0ccafa5d437cb3c2c0cb74c59a1f67a206fb0aafc7282aafc7efc5de534c76425c699dff283cd10d7313f342ff79dca06a12dd44f168fe857d41658015e74f40c76f6765b57bc5827082b6ca55e57221428e812b74df3ff82d18678b619f1ac727751fc4b27f1dfcff461ad30bb17e2774288ec3e337a7c8438877f8006d8024c7a62a02d5ba2f1eb302396de86bccff719dfa721abc5be82373a5e62b69f2fd02cef4cde6e66e98c891221f0de23b6223470d34e357efac653c943ae7ce487",
     "18a549ce85a0c5f53b966e0ae1495efafa6f70bfd73e915b67cf9439029153161459ed07c7d3fd54cd66a89d366ff9a86f5595044060b612f2ec65e9f2216e30489545c706d79d23abc7ca26aa486480047a92ac01164c3b97fbf253b722c4545ab83741ff483d8ad28b54c072f0ea72119f2807ef71994d18e9015a6cd813c525ea838d3a437640e4f99273369cde21dd580b8e08865603ca87d9d28e1244e93e560f3fe4ce219b55f8f6753e87e59dbf51d89cd4b8aea2f45cfc1be2863b108920a5c380fc1f07b174c72a3ce791bf0799089a571a6dbc0adc4ea668fd8f6e4a8b5a92363d00f92ece0ccbffdebde591779210b34b329f943c426788661b58d637a37094744d7ff967bb27a9d4fbbf00f3a1c2c49e50c14b55e56224d98dbe7bc1e7612d1fe956f048f831ce663b85778478a8572a63ffbfc04e9db2bb307c655707548e48f2e91b86cedb00877e9fd7fea3f07341f4ac342ed020e2ac993209f7a721ae8ca4b9273790f571de9f9d22ab89572fc9a9743efe5a6accc921be33327ca7fe3d3b1f980919f2f62a58475a570ac9f08d39c6e0f9599bb8ebc2101cd9f60da8331dab6dfa3e65a6fecd113f8d28fb87d3750a7019527b388f5eac13b49640554f031e240f52e202e55938b80471560437be12619e1bbf98f3ae350f5a03722e811693285b4774505fc36ea01a97faa35ecc30fcfa8eab0fbf661293bf79877014c68cf582aad70e5c212b18588a6ef3d75202bc4a02f86c62f99a97fb0ffd980f2d7f2fbe7f1eec22c6bbbe2685b4c1693b0429a5069ee387cef60bf0cbf2fd81263085dfb22f404e09284f075d782dc3cdbc24cf242e6a4c7ef6dd65f0269c5a9b49baa1bc0526cd72ee78db3621fa294ee8b7d6cb15f0edf6d9e62b743f25c38f317d100b706baebcffc11396d5400af4657a267dedd3bcfd96527f03be8d733195c0c47d7dcc97e8c8f639c7c972338dc88861f023b5621b6b55549b47aac9630b19884b072aa58fe1a975e86fbf8482821147597914b28ea5a84fcaff9d8ad021282df1a06feae1d813f4094680c6709d63a3907e98a67a5c7a9232e7d4c01bceda04bec5a5dd8e29753af74521d01e346c29955bde6112e131948582695980b71a777e2c42c37c0cec771b1de9f737cfe5301b487e9bfcf35d2750940de6fbaaf00b9897e3fa99f6c5c79e5d27acd055212e0dea3162b27e2b1a400eabf4e8b78077381fe8bba84c8732f469972a0122b8009138ea77592f68717d66bb8ffb3e9bcf4f77a2b472a393f5c6d7758afa9f6adb1a939da7164c22fda33f290bb15fa17ffb87b445931248c9a67edc3e116bbb75fc9439ba7b451e06a589c1cf506a04c2d1c889ed5b9af2002171055580b9555b58ce083a9f5b9f05d440e7fda4eb9a62df33ce6ecd2399ad2725f1eda7568e313f3dfd85d240924ac987d9273f14259170ab30d7363929e3f22dd2e3976b5592e73ba3b4a2f58c4f490affca796ada73db38bdf8b56211038b22242dac86910c132496e9cd1b7fe0e6daeef0c44e31df2c7424d5a8cca7fd812b5b90fe1566e7558e22c35080a73a12c0057e024c60bbf849c9bf20b5acebf48acb4d513ebe9436fa6c6f2c5334504162e6a0e4297c814408483ef02a21b9bdcddb91e73809c36ba0728659eca89fc978f1f154fbdc84638e00620b505965be1b41dd7e2022fe2100cd5aaea63c2e6f1fe80b9188da7655c8c1457ec3f2b02a839260b8cd39d63a6734064ac59251a167e6d25d9d0384c9b526c10b6b258e40496fdd46c85c3ef2b1e4ba91f5c27ba1624c9135535fb922b43970cf7e9b357f2057137cb3df1375a6e6df71e392f2efd6c5ea6e256a0f7b766c30931d89b09dda788e082f9cd4cb8c9c82734d83b817de5877f3ddf0ca4f5392aebf9e70eb9f5c35ad4c40b26b0c485fe8f46638d3994011f2883a70f898fcdf84edf7f3e95309f2e3b166b0bba18f385cdf1d2e530632422c81766fe9e841c205e5e792b49b572415a5f7f5024aaee6e99c65f63df7967d8b3c1976a6c275c7e5668cfb6378bff333477bf599bdd6fc8a969287f796717f6713b375a9262e06fab02684da3ec5d533de48505e41b766540aea29ec73d7c563f2c5d131c1c758aa932a6e5bb039e725e3958b4f1556ea6e2307e2cf3f111421e4acb596aaf6d83a483b11a5c8dd44ae3ef5e3ad813495b54a5fb2688ec3d22d8109297a87fe891e9f67439f0ea7199d3bfd41ab61531414a4f858d0af8338753257934c05c25dc4618b90829c3a7714e732e4dbca579169bed379a46dbb638a7fdac8838d3b4f0769b75880b142568ce9d55e930db5f4d158262b1dc953ccdb6e0fddfee14f042fbfddc88d64b46b7ac177d26c6b7c20341b53a3f31b5c53e9b824b9d5d5d0f7917295409fb497b7ee9450b9d242b009792c8bcf25413c45ac27532d8f36fccac3922fd6a19d1868b558dafa58680e3add12a3fdbd1cdc92f2aa899ad36eae392ce29fbe66af974361a12495a041b5ffb82843750544c2a3a0e817f55877538ab75524b09ff702d04d694b9f7d4d6716a9e461249c298d2d4dd28ce99c64492477d9aa1b1294bd51b45eab201f4c42636bd2dcfa38f509ab8b49ae4e88ab4ef628491b77f073a4a128f452a7cbe3d82d26ba2d354af17cd6bf77164269da782261cf6daecb328573cf975b4d6e8a984839b1f3e6ec81c5c692e32f78f158c1f472ceceb9b448cb8676b56c7d6bde38fb9a37170492a469f936113127e01a8c3801630d56576654552504860b7677d4e49e021640003c093ba2efa8f4a9e2e3286327d7a84527af378029f4306ef188f02204bad184f9a3c977e9a270892b9c0af614373798f5a089c21db136fe3d078586875e6bda63ac7c25859b83a3d2979374eceb99039baee563ac5c6fc54e7b9d818f6d834fb240b3393e56f465ac497a95ea743d6f48a8e34f9c83915678d6dd580aaf103fa8c87ccc667bc66b8a6964d7705f739828272e4e342d495ce5b10aae5a17c68a86d28086ef7d7cc363fb73f763e6b72975f35b3e0e70d38a90d30577d86099de0d2f4570f852b52876c86a2589c199ef5b22485babf4d655a975e22c9c21db0d01dc32a3bd5b808a7434f3025e04a1559f9b1c8e74d928dade07d4fb01e37691077d4f2b9006c15e8122607a3c3176177ba1e6a8238632f705f3f25693c9a9aabee45b9296fe3b2d9333caca0935553f0fc2a57535bf459066442a922de1b96fdd69d5ff57a051eabb0f4781a46f122d393d21fb0d1856d40f6805546fe1d0778f8ee5d1d41d274f6c9edcd0a1d96bf7360389319a21aa2d116fb6ebc44397f1bf3f7d8382cd16f24ec49fa0285f293ee7c3f6b560097b60eada98927584c1bbf30ff9432e6e377d02876390dea6ef7661d3c3d3a7b481883c2e49714238dce4aa8c428f7fb4a5f601782d8b8f719ad89c2ce74333dbd61c7262a5145f5f7b42d3d642e0c393a6d5a2d4633053a4a2e109d70feea7b020b2691c28b5844bd361a442ee779b836100f8b08bd78fa9cf0baf07722570228f12971bf927e31c61365faef3d1e7692f1e48a579dcf3d5b64ad28fb0a7cdc483dc654ce82ceb69ede7f6a960d6c9fab900164aada8a0f600792caab44bd0b6dd8692d6060f90a751625968413dbe4d1d1a2ef3bbff2a21566e4cb41c3abf7006f6d81eebd0f9afcb4de724d16bb0720553523b33654ec6a0fef8af2d49a171dafad2e3751eb21637e4743375107925cb8e9c15d4f6aabcafa3a9659ee3dce219b6cb3e5205b836bbd75fa21baa00e7885613a241c2de00d0cb0b5de2b944f97b0aa758eb708872f7fb4110b852a27286092d31d2f49ec5104212068051f6ee4576f55e23447aef5172673e6268b977156f5bd5b23640bd0915d2e4313557af0ec6d4d0bf98cc881a4f7b5ccbcb77b74ae60c2e4b1c2c32e3738bde4ba6ff854f7d3912df0e28dd30b36f4008430166aff51725cc973c8c69115a219f677390b37ef442257d46d23fd3963904402cb93c6b6c6dad972478a0d8b79670f6f69f9e0cd8d819d8d1d45c38440cc749cf09ab90434d7b57fb1e66af9d09d38c3961a35cb526023b0469c948199aef59a8e1341ab2a73e42b9f05b8ce78c6ede74e9a355ffa0b81aad630bbbe9ef325be7149acb62b02ec7f0dc72b7ac576daa5b19993fb4a52ecc154935beef88abdfd133d51e9953aaa23669e423467a2be1bd35c09c5959f5861a7f9455fdbd25e4a792907b33f6db7f8ee11e5f36aa14a277785b0af2b8ac49700fcbda5aa55c47a24dfc8081003343d55973615b3783037abde6ae0bb35f4175f01b7ff3054b64ee4eb18cd50e0b879b6d41ccbda2638a33ebc23fbac7a09ccf92e19a0bd62725e555079ab1a3f4362ff43b363cae144034f33366f108f284c63ad8d4a798a540c6687823dab864832dbf299e7065594520156842659efad38e48464561bd7d5259af3e590c63cd43ecb95720cefc5b28c3d6b1c7128334db2c112991addaa5b91ac37f06debcd89852c6e8438024c5b4c10049b03169172ef733b1aadb6edf7add5477fc26a48ed428cf0d5cd336e646d17af02642837371913c7286d71aec82d4854617dd362bafc2d582e87bec7afc57ef3c81876e201ea87603b208031583c78876c3f9eaa3fd8995fe691d5ab476a91223c16ebebdc299b23eefd6e93174624021510a7fa1ee3c6cbc268c969f99eafd01f0f86e0146f9fa963c287b704d6fb11ee0b7d465cfc73d1d4c915cf2de87e94e2de498749cb2e0ee9e3cbba76b1a4b9e9e363b7f35088e99be1880fd235a06a614c3e82ceed6e27a72657a4d4f860b336f090adbfc99d4a80754cc747bf4151ab57358b6b4ca5233b17a2b2d1dfe8ef9ae0a92bc4304653b95578aeb5457ca665323292c441f91b6e237cf3a0b2cbee2f1ef8f356c2b42f4d2dee26729b89ddb7747145fd5e4344a82e4a3cedee77506ff79115f00aaa4ee1ecac6999a543d745cc0977340a2502ba6d32607ffbeb3c693a7910907da1a28f6818e6bf83fc72628cda0ec80947c5fda35ec61c3a87c89f1cba548d4a7bf0b911b35b187179d1c74ce03f14682eccf253933bc0b2bc3d4e3a8cc57ab254511075ccb4cf162cc11d36da79125e31f6ae4e758cc62afd8238b28ab8d4020006fc90854eb729edc885179b2f011b0f6d1be61a47e7e9e52110fd8eba49443bb3ec68617d4584c6e6cdfb6bf85db554d777ad8d7fb1ce7fedd3b873d8788a0103a9bf9dad1b07498eb026f455793bde9210c11b173c1304ec6bb44ec007451be41206009f8c723e9e05b3add083abbcd15ef7026af358880a3e9e66ee891c8c36d8133c13c0afb903869980c30d1df0ec297d0f5434fb3d66ffde872f3d97a723d1a30cc297a2e49b7a4590617e6a3c355cd654c9f5ffc5145ff1484b7f87a1e3ace368dca920a593580520438463900d1f079f27ebf68b48dc0fc39f7d7301b3224b760bb1170571135c82fbf1e1d653719c40a726b02262e846494e83a606a47283f002739faa870593c9e57270e36fa7ef18f490f6ada2f93319a4876b3f481880bc762d7cecd0569641b0705914090185793262c8bb5bbd669c86947bdc3b908a8f8abd9f0175dcdea4c952e2255576adf472da19d077e2988b0d5ce05a1aa5dc5c02646ecc7d5fe0a4bdf233f66cbb761e43e5c4c0863ea9e2876c9f846f6bd1b9b84d2521eb8ca0e3be5a9fcbb76713c69d29181acc9f97d73986f95e140d92b901fbe7399aa191d027c438688",
     "8ed49665ff8e2843745a065809990aa0c4fcccf24220fdf1e27aa789e334446e13a5788a5e9de3e575f582df12dd3e520fed30cb04d9349424b71587f581939ecfbeb7b48744cfd30e551ddce85a62b903afb33d999a5a1fdc40215a0cc01812b41a2a52ecd4def95ee47345d90865e8f4269f16214e97a7e1df0b4de2e20359a89f88ab906ae05430a211cfa0a33658fa65af3742c1541be4d3a6582fc4b20e42d9e818a62125a7d148966624cd65ebb5528c8c01dca81d20381d832add767a0126203fe9a2837d0479727876673b611afc9a7f5e87294c00deed48fae0fac6506aadda0f7e999a877f527a61d47e440c5f19c8ce12a8b09dcdcf4ea96b8af6fa7e83caecb2ca03fa35a454c419e1121f23cae9d24e53ba352c701211f3138c413d431937ed83da75aebe0acbb8ec9837e857be00a9cff2ca3eb13f045f347f7c745f56df8b73399b1f3d923571a20b5a9a7ebece39e8f379f6df72765272725bea9612e5bcf3cfb6adc56dd05f3249e799cd02adec060b809ca4425e1eef11f7ef2e5721aa37d051c34daa07fab8e729af4b981636083621d7044c13e52c987621a69ca8eac3889776d9c8aa3070aaf563f96ca393d118ce161fb7911b2952b8af451e1bdb717fc70c6e24f3e2f0048e1ca36be23c13d9957d6a021ebb35677f68fa33778ef7524dfb15ae96a296bc393ac5f25261a422e1f7238464d13e3f8726a75d10ad9fb74b480d44c2e9a6bfe0ca0c8d22fbf0f9ad53e9369d0ffecc27b8a0dd1b85cc77b81e701706231c39a045b1bd891a54b0ed1c87b282de40691dee685423f14ad5a6304fc5997482fe0d1351b34136d60b04cab130ab2e7f5721c6e021983dfd3e868cf2dd9f0b180d5218eae554fabe07a62aa7409a93e7e3b3718961106ca3d1ceb606a2e6e93e5d9c05a8d43d34ea1e14cfed1f25074cb7bdc1289f3f7a6ddaf43cc5e7508a964e0a93e26f6711cd234765f7a35c71975ed4e919f4c45cf83ce20076f5238b995a65cb0b402d3690b0a36cd2d164bc7ca986327ec955f49fad0c3f0e94c18638c5473f5b20ba654646d0178e3ba35353a278f32920a75567c7b87991b413db47a164acb93f73339bfe0f72b034c8785de3da8e22a445b5bbc0d13ff3312a13c11f8b5326e8860c136fdbf79da666469da270e0167735941648dfd8fe1b23ce03305bcbc60930906346821ac373a51eedf5c938d3c9f3de9ab43c68a2035068bcd4eb1585c0a696090c25c2825382d8eeb4b75bafd6e5cec3327e80c72b14445aced447bca79ce78d0e1869146c12fb57fc0e27529cfca81bf30b5829f903ac1a36dd560e2ab2ca33c521dadb57c3caae0298a1df936da26a6afe2c9d280f8d9861be48668150385d589ea349cc77c9f67ed448a01b4615decfd902c01ba53df4416736631256afb890af6aff39e47e5cbe59070aed031f20f16e3589d63540904d7ad5709c4830f09c1bbd5b33cd47ff3da3232e11c17d4d9eb02ceb827e092e8e7b7614adab4b3d9aafb45b083f4cb71e25ff7a865541ea185d95d1e80224c732cc5fbe1f2df689fa4ba1753d148d7f6b1846736071d9a4cecc99e96f47f6ff082cef981183d01b08fd14950878d7dc1101770fb3a1565eac3714820c0e058f83b7f85cd38a1ebe3f0fde0734e99efb883c1d08900253963e17333dc90901c56c8fcaf44e4389cc0515ff06bce030367c1301653fee32dbb8ea88c17cc1346aa072723cdf0644ad3d6d5f0608f21131d2fb7d3c994db65f2a615fb21087b4a9e73d81021d1e0316785c96b8236ac14ebcc6efb194a8f05d8120a6fbe19429c27ad8cb8db54e9404d04f94f681791b8d3251c9307cdbcfcc3619111fb10b1daf8de24da449e0e3c6f4f488dbd42c53ef2765a6e5d1a349d13489225ce8eba209ea228ba155648f59c77d5f8856e80e515741aab423e7f3ebe4700aa5c32d30756c4e37d7552f8e63be7a4612a5f1c6ff6c5846bb85611ffe0241200aa188cdd77303db4ad75489afaab6155212a1aea646b50221a9479c0c7ae53579e44c617d20e6cdadb19583835b19c41d230535cb7b4d06fc286554db084dd5b07e6dc7bb798549a68055b86ef86a119e8dbda606e006610f44f6fb62b0c1abfd3c69aece8746ab44f4993048148f4fa6d13399c70a422383be38844c0a1ba4e4b98c0dbfb2be577f62a5669d05ab1aea757959e1c20c691b1924a7fa7ff0c54a8b7388f1f9eb1641771b782a04366ad5799631fc3951ae756d2f54de50a356520be51eb6699a8e224bcf9c223947235da1286824b0feaad9681e68583697da87f55e0402d2baf68251f938930fdd1536cccac63e2ef55d90fbdc91f725846c592dd8b154e19fac278c3df0c90b5032d79ffd12203c626dcfe3091b59624451cdc9811cb5bb61e2894e0c1d5bbd462d2404302dd881109f99cc5b37b3d42ef44e55a8d68eafc143f01ec1a5d48090745f97ff747fe1aa7dabbaaee2d107d73852c38b35ade93c7e7a6cdfd8b3dba80a63626fd0d10adc304ab5c28fdfeecc83f3e04fbb298dff5233f3e7dbac1736c4ae9e80364b06f8bbade5fd619f4655f5f73ae4e978799f725c3c6f9e51528d9842a4c9df7630c857e856dfbe0d7c7753233a16151eae8bb1e018132a28156ccf9d5a085b73d0a3a530ca431a3e705f419091fad1d0dc3e163433f4b5846db6c15214580a533540dc1e14f90cadaa64f662f41377bf35a86310c9bd4ea2a890e672b5a3cc1ab945edaefaf5a7b99f6b664814c728e1ee958bbfd9e810502cacaf5b9671dc8c52982c810d9b737f7210ba7eab97ed95e03dcb75b2b4bd87b19c474a559829deb5f2459d8c25b4518821ac3e9c0294393126efc184fb52cd14e6381a976ba1bb579ca6249ea09d8fc16de82da10413b1251e9a8d85efa079f1afd02dcb8d92876e4d24fcbbe9b134183a28cdab503d18708395c33f94d50d9d4c1d16f2f417fff903f77c6de34e1f506dae723063052645c98217677ade132e466a07a2256f87aa7ad9bc1061cc9482c74717e544c2050b0ea8729bc1a34ce7ecf825b2137a815701fe04c1a3e50fd590521bd26ca7a193a45f864d33e8c7de51b3c686c47074b03d2c442a6882bc03154a61ba68a5ba5a1bc72a5d8c455f0c67371aba5140793aa1a3dc158004bd4da50b70d5a67cf250c665cb897394df202d79cfbb8917827c705a481c9429c7ed6b2cdcc008e6c33132b9173222ad2219b461d69ccbc63a0587bbb550d0e07711c9e4da24a29664be3222c7463661455021fe64027c1d31b052104c3f7a13c8b669aafc16b9558a0431ac7e997884a8a39f92511caf9647cd8dadfeba6ed0ac35813bb9149ac44f1597b00f85786ddd972474d6a572954383fbef702118754ee38b24bcb72ebe91e9ca9a84ad5cd6bac94157bf63ecec1f77bfeb5942430037378e5776d6931af7254590b90b8ccfd3e05f37bddd9dde73bfd7e3b285bcc494964d180a01ceea8f8cef3b7c34e9192f1c89310c1734dbef35fd13d612f699ffdc50e435a07f556f246ede04074b465150fd8f0d9305526d869db0f1b90386e5f775048e6bfe2e826320bdd95ae65061fae55e7a6a427bcf248008bc7d9a05ecb8ef768e24018a3c4063fc2703e650f4080ef663a80525771b147064037eb819c3f00e9b980dc091f9dd8367e79ec2d1c30ca6aa598554af86f347cb95d0f15b0a41423c27e1491a82a29284d5e0721d1ca8b515a2e2f365add9d4c577d7d769585d2e826dacf5e501b25ee58d1ed04e16955213f557b9d774c26fe2c621c0f38d4bc3a2ee4f39fb1738240cdc121c09f9ccb36fb3c839733027152d4db959a4654ed1cb50e35ab6988a551c560b62ed5c19ae6a1d28673ab5a7c10cf4bd956d14016d1d9e063a8c5135b6a4d0d6ad15195c738a9b2fd890e834b0cbb258a10acb46014c08f77458eaae5fbdcf3cc54a404578fbe639ae1a46139a906a94bffd319fd5ee35d1938dc165935bfd453046f5881bb9161ec199a1daac82dadd11df0427afd77c9789c0fa9cbfbf7406aed350f62ef54a54398f013fcbdb5b9ad58a14c024a9e8b390b06229e005fec042a74a3e169d6c54049fd303be7344695942bd50a4689f5a7c31c63e295d38ffc90802844cfa92980b429fe1d2cf4041f3131090b59bcfc7255319ce362d2dd90cf873f87ef01ee1ccbe31a8eb17cfb2660a169375068e2bc4d2a318d964c0d3a514093f77b50f28498e4fed5b90804b649002650720fb0eea7b9da0f92440c8aae5e4017c67475acca73c946425a588d50e5cea5bb5395b8db5cec759503a6e73858dc53e76bb21320a740cec4023195687cf5e82a68a40f8acad2e68df3b8949af88ce071d2db7b389c09ef55b9d7ff4d27d157bb78aa1db6acb793c82cf0c798cd204b48622a5f6af33c80d4d8068c2468c8a1ccc07e44fa27c3ec9d505a3aae1e7508254921905fa29f5c2e232ba2e5380f64603f44ac8acff4ebcdbc53b4ed75a7534bbe9ee9ceed15d9bedeef5398526b31a766364b5952ee2809ee10a58de9e7d04a1f3b729\nresult = valid\nsalt = 45cf5b7711c199f70999902eb755aefe490c86b96cf86ac20d4e67fd87a1c8bf\nsize = 8160\n\n# tcId = 25\n# invalid output size\nikm = febaf0ce3a452bdad48338ae258775db\ninfo = 572d90bc31fc1edd\nokm = \nresult = invalid\nsalt = 701dfbe3f22c13268a04871dbb9711f371bd702b2bb41dba24409578e6481bc1\nsize = 8161\nflags = SizeTooLarge\n\n# tcId = 26\n# output collision for different salts\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = e7f384df2eae32addabd068a758dec84ed7fcfd87a5fcceb37b70c51422d7387\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 27\n# output collision for different salts\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = e7f384df2eae32addabd068a758dec84ed7fcfd87a5fcceb37b70c51422d7387\nresult = valid\nsalt = 0000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 28\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 12fce691378f28f92cb26ae9cc7ec5a34007fc693944ab79b6fc461093a66c4e\nresult = valid\nsalt = 329f445e7de8a156cf26a0208dbb028d9de6ef76b8de67ca634f4a5a732138a1bd436a7b345d7a0314c7ed0a00b0d34ecad2cb8bd141e2ecc1c77e237094d55154\nsize = 32\n\n# tcId = 29\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 5943c65bc33bf05a205b04be8ae0ab2e\ninfo = be082f301a03f87787a80fbea88941214d50c42b\nokm = 12fce691378f28f92cb26ae9cc7ec5a34007fc693944ab79b6fc461093a66c4e\nresult = valid\nsalt = ed16eaa37a3cb51a9ae18e69b1ccb5950ba29ece2e94894ba05715bcc9d926f8\nsize = 32\n\n# tcId = 30\n# a salt shorter than the block size is padded",
@@ -3445,9 +3544,9 @@
     "8e3197751cfc33c0d47e2f32a53440109bc257e171bcdcc2cd92adc8f63eeaab0a9d8111a752d37998ac37e47b1b73abe52036c418b039ca2d7214b010104dcc31ecda77670e49ce591e8c422a87243e7529d1a214a84720328811bba534b64a4a893169322d03b2bff9fdaa6df1ac474bb7ff285f3652d171a460cdde44706e757ee9b9e5957d3503734df518dfa30792b6d916877c61a96bba4f104b409f6e6c378dd331fdf6ad124b2b83b885838cc8ee3092b6b30e752058e821a66b217ccbf651dfc504450e71ec6586e5f17d68e7114a1caa8da5360a5aeee9de512ef24aedfb9b48ca3d218f2800aa0c2b8e9e7cddc99a7efda35d71f11916be2cffcf12be9dca9644a856fc64cccc93940d2ecca09b2ec74af5279a3b33eed028ca439e2aa7ea02d043aaf3bf6f13511ca11162951fb9a638de1bd4925d430a63a02da095bd1439f121de1c619627edef0d652c08e4240509f99a715c51e30c6a95c08705355a64d79df580e24700283bb31692b1d1d558187d13dbf61174585915f5da61f22792572de06a64be18270608e0f4723612ca55d295d99a12751d85a54c153713d8bd3cdd0ec92f5ac910b8d27124192cb6d61479461fac6b4b6f0bff38a67c131e3a01c2eaeb6e88673a2b7d45ae3275a19e4a127a672cd91e5497a55ae90178d8130862a223a4b20b3ef51dcf658d63d26514a22107a18051f7f70a3aa1bc69cd60de295b3ac351552b909605a48a983f6ebcfaa1bc13f75db0f92ac8ee4af89daf8cedbc64cb880ef0f2b4679935f0d1cc60a60c5024a7c16ad27ca9fc21c889387977ea6b497d7c3d5e5c45d1ece8c19cca96c4193a19b36b829334385dfab2bac6158f47eefbeec3b171069f516d0fe68fbabde4009d09735fede9298d59d70791ce0572a48283a0549165f9937f165b91003dbacbedf6341b97115710021c1c32263d0edff55d10410628ff4cb5ce3b010951cc6b16d2756eb14ade18005944f0787c1d3860b750ee1e90d1d7a7bafab9d45e29260e0f228869fb353bdf071ac6fcdc0b87071b20d131cdc8305c5a91352d9ffb376e86cd72ce5973713f1e0a2d2079b133ca8a27ca6594c4631900da68dc067dac381dc16ab4da1cdb1c494f295cdd83adc791644fc6ea04915cbe120bc4f2c0e0a93d81c9cf1ca9c302497068c854d2b26d2d39b08c80efc43ec29f268a21a1c3afe2582e5741d7e7a1f364f0fc1e6a760caf6dbdea461b273b34a501dcb7e323f5f3467949692e2548dd60781e8c98262592f73e158d58d579d7859173bd25624e18c310ea8b2dcc5eabb1581b59131c877b663e55532cfa079fd08b4ebf4e9227152d69677d6e7152cde685feaff986167d5331fe5f8d2b509abaec8d2a8771e310c5aa188daca39170f42002ad8dcffd74477ce628c5d157e6e2323c3d2e768749a4194d41a9f6a204663b9efdde8b65d9739812513374659c5ba2ecb72b29a874c814e9ac1e71c005fbbe2b9bd73b00918118a8d6cccbaf2facb4cfab078aef373fa61a7aba5bed3e4b902f2ac9e5a41672c0b8aa024eae9a3e0c9b2365e2f5d8f4b94aa80425db5e16a414499f27eb4e8103cc1da41f2f25579246e0c32d8bc09f36f1f0591ff8a7acc32b2b16dc36ae4c8eb35ccd330eb9dba0abd1646b685f90cc6564ebfd51b0541050ea10e920051c2c2d720747a0ecc8c59bfead9ed542ffe1ff84c8755a2174e6292077e1bb452d199c75fc65218701a3d65a5acdd252a83df1c39745789cd35b05b041206b6e7e7b8ca46671aace80601dfbb50a9b88d636b6c8bc8318e3fd1015f6aa06a59982104ed7d08065a7d99c52f5e03ee16e0e58ca717a899fc1d329aab6ef3f5c442cabea9c20e61e7518c637a975bfc55f5957700b16e2ee0abaae3ea3a10198d7cb7cfde8d74588c9416896a477945712ba256d458b7a076f7f5750588afffc44f53ff99f77060c6dadf5cd921661f72050af110bed15d92a9853c5190d1cfa0cfbd5d73209f00b9257f9fdfc960b338642b7007b7b449bc9858391a4e090402f4b26b818f4f0e759aa583fccb0a54f1707cc222071e8b571ad78a68a1e37601ae655666a955bc5385084830ed2bff7d48af88ef15c08a59f163670a6d908dbdc464075134ee28a8b91a82a711b0ec8eed5ae747b023f0323ad5db9c1c8e7cd1436260754363f3910a94e240becec54980cd3ae6cf82f7e0d642f91045f722bc1f62866ccda4069718c2ab6f831b9b17e87ab967f58fb50ad011c541b2ece0971eda5bfa563c9d3be13cbb3c9c00b9e0297159049ab1f798fae5d555f1b76dedee3eb174955aa76b960815a9f9d9039c45e23f0b855d1c936adbc44cf79217332bde34937e523c797355f95e1ed5ca1e7ec55df924a92abd8ea4beed019aee23d4c31dc78870c90371d02f8c499bf94d6ebc8dca987a294c705f455637ca13f486d6bdd2cc4f6c6e41576ac70479f63eb74f10bb0ed3e82e26d92399046c5fa2b77720415b25c0d86ebb435d5faa4a53aa7103d035e050aec235e848c1d30ef28f49bc12badf7e1f1e9928614e373ad0f462991f0f2cfe39b7fb10d44d6abd53c506e7b2e728ae537ea2a126dfdb3466e373fd773deacc438d55b06f78b4abd8aab4ab2b694ef7422c177cc358ee977afef5b5d50717d4856c4839e747cf106cf1af079c33e8d946cd20a240fb94efe18f0ac7b1c9ab8be58e891976b7e7693cfb0592901bb56da2918b55da38a3615207720972a028266398ef451666fabe85d79b154c0e8157057847d93c7cd14d9fd2173b0f6b57fd7aaf2fee3eb98f059c7539557679090b842186357e19fabb891957788e34264ae867a83f5c5a1d79cadca44dee4ed6797611e9731da5a98b5b43f6a48a67431fb5b1f28e5edffe36a188cb696b0861194bb809b0f8687d790d0a5ada98ab06f6c1aeed04bc1beb0dbcceeece2e0ff3dcb54615206ec070cd109dd6eb5b4a84eccab44ab4712429eb91c5bd2b22f04ea140c252db8f65c42fcb09ceebb9e1de961a8d9ce1e536a5e040f9999ebf9bd8b38cb3562fa9b52ce8e27877303d542896526d5638f8fce8b69dc0ad08e9b1edbb404d24ba86bc37297a5dc0608557f9c520007078480adff54f8a6f36cba5441d7261f1985ad48d0d12b9172e1a1bd463d102134527099ce0c919d427dc53478fa6d6276e438cf83abc94414a5f73da8cdd206613833c836edf4a5d2dbbc7689a8c1abb9cdef52944d31a65d61f5d5a780db652e55ca89dca7d67b7e920c08e95d7d0252d008194b5392c948e4c00da29c0ab2d6a8d8e71fafb5c25e006a5c60ca27179312c7254e5eb82a9797b50169b21306cadc75a96b51c76f0685ee77b13d1d05985c1fcb8dcdb131f5292b79e076f101228173700800e8cb992e2fb3f06565ea245320b1abcf4461e40e6d01708758aad1c790f7859c47d85ad07ba8e693a056907ef24c37e7b2ed52ae5a36552043dc4cb67139b5bac5cb42d2641dbaa76d16aa1471305d677eca15b2ab5a0c54ac4686afc42e541c2ca6c82b8f2a0e4ca0b84d70822d3c86c3c8344f11cac9a1d9a846dfdd55d3789fc1b48c4382d02eb6d9c1b56d7ab915e10907383770457c13ac1ed8cb37b382043b00b921dad98b35ae0f62664b612032752a11902b4abb2b57f403a8417d58467eb35566fee7508e4efeba70f10fe8eea45aed2c3ed7d1c4124d491a4a609267bbeef11f79dfd8fa009b0053cf07750264a44771d94fd7f59477ba8cc35e98dd58e3b32564449b5477abdc1626352124323a28db2340a3813fed4291d6e1ce3d247cbed072c92b0c02214673a5332cf8df8f533a1d042e63b087c0c6666082a6688bdaf355c28592e933ca0d22b271e3973f8c3e19a73eb247041f0c4888ce1933e64b9353b8991e8e6dcc4bb680a4cda36eadb8684ed368247c079e3ad3c9eca7bf36af7f45ef899345b8fb087d7b9e0d74169b9fa5a25cb01512479c6deddaceca52e56682cc4cdbe1228de2e2fd4e2d960c39dbeadf0a170dfee63c326b4a1ecad2229c8244920331aca9b2aee0e2f8734f8b33044eaf313adc11332a2c9665d11021ed9807b8cb25fd533f36e9aaa71a725de7b51b60d00f1ef156027d7170d3a3ac9f05d7ff28c985322ec94758a93ae09c916f114bced7fbf18f8a87e1e7e0d38a45609c78c3c7f4215de6319be36f4900c2a6a333b680be8997b2e5ebef0dc61c45085ac0e7194070f17d1982ae77ea146fca09f02f4fe51ebc3dee456bac5103a7e9d92c6c3c33fa401e64fd35e4ec598c61a9a3a509383cc8bf206ff3686e16a62e603ced7512249b8d0bdbfc8c8e17610e04313ef99787bb305d7eafaf61c3f4bbd655fece58867d68a49aa0569e1d4c267cf30af3096b9c6974a1e14b88ea41d390540c7b9dbf5f796d23d4fa78493eab7f2d8f9004f7ffdea1545a49e54802468d30bce39995d712645aeddbecbb0cfebff195ab658fe05c04a31c6254858af5d8e57f4098e638f1faf3361d851bc7d19e72d8347c3fd27a16fcb329bbf9130af7120e6b8551fb82466f6a75562c50199017ca29fab28b0a38c1a3787a1b66d5edc9d7937ddc8205a210b5a339170bba3fd387e776fbe0f0dc1f05a339c0ffc8ea6f5ec60a7b8d51154103939fbb09496c79e6a62acfa592654be3067ce0fb5faf4499a7bfbe01f0aada0c03f8bb84de45f09e5a4b54bc6edc14588b705688fef1d0188c8726e69ce8c6cf22b576e96810c586601feed56c7926f4fab1cf71802fd25f8ec4ec5b27a5e163ea7a9562efcdb31cf49d310e073287941335babe8d8b1df469e47ae1dd068fa820453db30c3cfc4f6d5857235bb0951ab5e2efacadaa5381184d0a03eaf9be1bb86f8c7a15f078f0be01ac7adb3b1c455e76d1dd3767592ea6cb12986c48aaa4c20a00c8d11bfa44606f5d8475cc6dab844940f88831955d3686e3d0a659abe6482d560aa2c721525e66baa84ebe53aece8e36252b8d2458b955f55eb3706047683130aee910ff235fe48d2e44c868afaa3fc4641948d5dfbecf3ad74f7acc4457207f7e292ff1355af9fa109c498e2613f13071b229a4ebdc69caf29872b6c98cbd17b60fc797214bad78c987451e46418735bed33551e997e6bc8093941ae3d4a6d6a01c786f689e121e02827fc0303852bdf72f44330ca69ce6cc498cdb68823de53768741dea09be1bd98cceeb7f89cf473ccef1f3e672d32188cc599f37ce5255edc6148e7e2e3428d74f112916709609911f6b7f3569c50b9ae727f3365e1f14238184e9c67d2149c2ac408c6f7d7eae8b3fa763706dbaf0271402d92c639810f59698dc9117ad42e1c19701c1d32f069875838b2d83e5a8c8a064ec82dcd1ed3526e01bc511c41fc09d53856dab28f60107769eb259658d84c50e6739edef6f4df380a74c17db01dd0ac1f5465b3eefcd046a1e52bb54c98e52a22af4497c5b59d667b54d7f11969a547555d573df24946d51887f45fce145982b4f2632007f25f280dd87aec910932fba1f742218895412136ef7041f3d00e88efd80260597434a0fef735d07a3f57939821f13dec8de69fc4bb98f5ea8317ff7f89bf7af215c7875142e6c894c596a24acbb703fd5a4705d37ead919326ad55d19775b5765a7cd60314cb453a96bd8c64f51f19f9144f3f88072260d1a27d758fa670d63cca7b5d1ac750b591f0227fbc250f139e663f42b0e8318ee709f3e2e04015ed16918c57bf108f7a8fa0901c99161734db72e530c4e2f41860b0fd703913b4e1993",
     "a0fe32e26c2b93fd195aada3b88ae1bb5f40ec7e07bd6bfe95fa1e3cb060a3dab1ca52d87fc955956a25543af410888972e7984eaf94e80faa1b254569c95b0d52badeefd14e4cc14c42ae12adaac72c9eea48cff90ec96d85b37e0225ff9bc82cfea6499ec29d56a61bec24284e885e0021163b14649a050de5a90b5b941aa0ec0891e7d7052d045ef1ca93c47921019b3140b075eb6d99ff5c327f964b5ccb4d3fd4e9985606fa1f2850d1fa5fb1e902049c015d13b128f322fa47ba2552fdc2cabddcc3161b34ae0541945429d7607627b45bd7a808997dc1d5fff59ff3962a300da1dd37296d1cb39425e5fabae502da8d740bdea15101e63b97d896229910241dc438b0937b66a0df0730a966a00df510a54ddf1fbec550093591f891b2cb17934f0380094e096d0448c91bc7d28a5719ec9a8a2f6df5b593a15597a7fc6989eacbb343c928d7fc5e9051299b02b42db3cf3723e92250bb84fda24f61bd5a86e2696f5aa07dd1108fd5862ea54ea307f5a54e7a192f9ed2b214ef65924eed31e07dc3b7ba9a4195b53d446104060f29b26acbd1e36ffae1c0f96d2310ecc1d9ca125f3dc682678a47993bedb9cd91133740d17eca07bc0eb3d8ba18a3eb52f3d6779298045766f33f813212e766f76e48a4b0416b5ee646969659b490da413df61fc3d961b87793676a877123ae7038b3d10fda9fdb2a990097262004b63ae4d992270d53ceb9572f87655f0dc91b78bb4a8ba6047a16ec25fab31c06ac7a2dca432d4b7ae82b1acfa3ee0910af0f7717ea57f98d3330bbbfd0ce475815e85340be8f3d1d713b0d7c437cd5a04c5e511c6d55314d61274e8354c37b8c54b3cc613e9bc97ce393fb2f55873105ba127fca0716bdd399905948fe42b76e7ce9a3f6e91abeb51c346952241edd6edb9c6873f8ed5ac470ec6f69e75d42b88a643b9e10c7515b93cd66cf65a636f5f6157001c4082d53c5876ace30248dd982f035e6c4122a7a5d9d299c7774e55449af162b7a7a33394742817ffd6c4b5aad1e62c7319c1e6724d6fd0c8c2cecbacd2a7eefe17c1cb0b87945f3a19a3cda8cad0935fe7cf6211bd71b54463ce9e5a9616a5ec60bc5c85060ec0a6e63d0c5750d2bd36f6042db66accf596724bbff5d200e3286ca26b744aaad6288cde5540c8d2e99e6b682d19baf0bd70582c572d0271f259b6260ceb5bb831207992c5b20c8bd37067e48062c309236bc08cae43ccb0fe28dd0e1d05a910c5bdf7e255e056b06cf36d9e384e76c8cc42827083a300be06d63e2f17dc39415597fa647c502fe45cdecea40cdf6a5a133ebc8beb2303bd6a628f6c796d71ba2a5aaa4f0105\nresult = valid\nsalt = 90983ed74912c6173d0f7cf8164b525361b89bda04d085341a057bde9083b5af\nsize = 8160\n\n# tcId = 94\n# invalid output size\nikm = 2b1017f28a19841832f576bfb3108db78a1e6f2009d49d25aade75d403ded34f\ninfo = e4978d1c18687176\nokm = \nresult = invalid\nsalt = 41535a35ec11384df15a0a24a65f067591b446ac4514f7d981724db4900a6106\nsize = 8161\nflags = SizeTooLarge\n\n# tcId = 95\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 2d0d642aea95ee9892fb87ac392b06aeaead1735c3468fff85c4d65fa62d4a06\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 96\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 2d0d642aea95ee9892fb87ac392b06aeaead1735c3468fff85c4d65fa62d4a06\nresult = valid\nsalt = 0000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 97\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 99dfa94cc0a5e1c313ffc5b3e664149bfe9c85afa7f4d8cff61b7b4fe4b9515a\nresult = valid\nsalt = 0102c651e047fed9c217bcf915520532d44999534c1e7e7c87311093d7a3681aff3e2d335b3c6139b9fc66dcfe35573b36a329a550c4cd20bfe2a90dfea50167ff\nsize = 32\n\n# tcId = 98\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 99dfa94cc0a5e1c313ffc5b3e664149bfe9c85afa7f4d8cff61b7b4fe4b9515a\nresult = valid\nsalt = 4031634ed8a9a6152058b921eee93908e7277f79263e73976967278317c2b885\nsize = 32\n\n# tcId = 99\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed66\nsize = 32\n\n# tcId = 100\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000\nsize = 32\n\n# tcId = 101\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000\nsize = 32\n\n# tcId = 102\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 103\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 104\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 105\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 64f72009dd00e4ca7a63f4b9f92dddf6dd074b5cb3e0fa753d47748dc42f0824\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n",
 };
-static const size_t kLen126 = 104065;
+static const size_t kLen142 = 104065;
 
-static const char *kData126[] = {
+static const char *kData142[] = {
     "# Imported from Wycheproof's hkdf_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HKDF-SHA-384\n# Generator version: 0.8rc17\n\n[keySize = 128]\n\n# tcId = 1\nikm = 60ab7f45b0ad534683b3a6c020d4f775\ninfo = \nokm = 3f8b0e4a7b2bff01a26a18f1e07c0218897a324e\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 2\nikm = e3db76e02278cbd2adbcb4555803da11\ninfo = \nokm = 54d872ee6079718738b96cad7573bdd667aef80a43344ccdd2488eb2e1d3c33b9e291faf89609af32365\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 3\nikm = d4dcb92a769f57c8bab8a420ee0aa351\ninfo = \nokm = 8998abf032b4fbb29e431f0bf1544e19590ef4fc99e013db8d6ce0dc085660dd3f2432b5f9cdcc44cb6ce0053e7eb43c0375ac7efba148ece8688e637a5759f6\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 4\nikm = 2d43e54bf0c94c9cbff4300f4aa69ab8\ninfo = d674da3bb47d5c7e38b501e5251d9348af601c44\nokm = 658e6132e5279439568a617274fc788dccc2bacf\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 5\nikm = 4055536896c406d5fe14a6cd6b999bff\ninfo = 2094768a8816f7df070d6e08b7ad93755dc9024b\nokm = 14a650a903d54e0de9962f5462deb135071cd1e3051ecacd65d378b6181b41e1e1ab3b5d2143b710c728\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 6\nikm = 5b01b2da3166f217cdd68de8af60078f\ninfo = 6884cfa7ffe8f27bf4ebc6e46a7e01488c79243a\nokm = 7bf6c7c72fa9bf184f9a2e13077a0e1afb9d976a5574fb7ec819d8bafb9b10f962e6fa8bc6a844ee0b609eee34aaaa025065a7e3a7fe4678a005640f7dc286c2\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 7\nikm = 467403c2ec02a235bf730ff37e8d8ff3\ninfo = \nokm = 55169d60bedd7ab2399d830b1da06f69f94e4b0c\nresult = valid\nsalt = 41f0f173d307d40436c25856cf559f96\nsize = 20\n\n# tcId = 8\nikm = 3352f942aa93071da6d39cc5ed8dc460\ninfo = \nokm = 260a775477eb6b32fbeb4e6825464a47ac8484a92296a3a3d51b0821b346deadf57f9c82e589ee369fe6\nresult = valid\nsalt = 57a0db708b25a51afc4271803aa35204\nsize = 42\n\n# tcId = 9\nikm = 08867e76311126089356623ba5381e73\ninfo = \nokm = 59debea3637c46394e2fb2790ebf8760de4986f36a6b142305bb62d1466dd56fa201c96814a2e5846acdf141733ccc54df9e6ccbaebf84c4f40e21201e180b12\nresult = valid\nsalt = 0c164c443edcdfaedb1ab150f047951f\nsize = 64\n\n# tcId = 10\nikm = c55c41d69d2424a520414e3662aa7303\ninfo = 3fdf20538063b76901d61bbf9b72b0c18749e00e\nokm = 25ffbc81bc7b1c2dc1cf98020f55d256a31ce89f\nresult = valid\nsalt = fea9bfc92b74337e43a201a2dc199e27\nsize = 20\n\n# tcId = 11\nikm = 5d3db20e8238a90b62a600fa57fdb318\ninfo = 2bc5f39032b6fc87da69ba8711ce735b169646fd\nokm = 6724e716f6a953aab112b61e29d921fec0f8e806841d5ccd3aa567574b502904d04ae707d244187fec52\nresult = valid\nsalt = 1d6f3b38a1e607b5e6bcd4af1800a9d3\nsize = 42\n\n# tcId = 12\nikm = 8677dc79233ef3480777c4c601ef4f0b\ninfo = a38f634d947819a9bfa792174b42baa20c9fce15\nokm = 758546362a070c0f13cbfbf1756e8f29b7819fb903c7ed4f97a56be3c8f81e8c37aef5c0f8e5d2b17eb1aa02ec04c33f546cb2f3d193e930a9f89ec9ce3a82b5\nresult = valid\nsalt = ad88db718244e2cb60e35f874d7ad81f\nsize = 64\n\n# tcId = 13\nikm = 0f602703d37943e0253bed3da331aff4\ninfo = \nokm = 25b54be713ec3eabde9f8d25745672d1e6386c07\nresult = valid\nsalt = ebdc8510499f69b2e188daab77cd819cccb95f276f46e6b2be11cbe72700\nsize = 20\n\n# tcId = 14\nikm = 9fe65737574c5c7aa67646adf8230ba8\ninfo = \nokm = 24e3486d28a6574270b32541651cccbb93f0418905e628ec1274263681b943114f742b9b81db0f86385d\nresult = valid\nsalt = 73a34648c152443586236abcb46a090ce55ef6c7f282ffce6342d694650a\nsize = 42\n\n# tcId = 15\nikm = e8f2b1c3e6a6c3d5ee0a20dd47aafa78\ninfo = \nokm = 167928954f92eed2e1c82496e57cf091d9c96aa6d4c01ea0b4275f9f17ceed820d90287cea90ac8297f892c219885243a67429829bfc86ca8eabda4295236252\nresult = valid\nsalt = 3f5e162de91e0782cd189f3b7778cdc2ce6bfe9d3fe841cd3c70475d7b3c\nsize = 64\n\n# tcId = 16\nikm = a679521cdb56aafc5a4b76db0431a4dd\ninfo = 44ec41ab4f4e64f4a36e5e30c9f0dc1d77ae4974\nokm = 72f15cece4bc7704a841eb5047f04756f86ec549\nresult = valid\nsalt = 123033b1ddaead83a4b9cfef8a660bd8e00fde01e67c35656c6d7607d456\nsize = 20\n\n# tcId = 17\nikm = 49bf155ca102026f2a217ea1bc9843ac\ninfo = 851bda4faa8f7add2a3cbf0acf9c2786f8f955b2\nokm = f693a3253389435899adac72d3ff59c240c65bf282f373cea7a9ee00864d5b4f39b2000f7eb49af16fda\nresult = valid\nsalt = 76776e3b4d75f8f43dce4bded71f3b1ae6bcb012d9c0d59f78248b9427b8\nsize = 42\n\n# tcId = 18\nikm = 6cf725e939e8824d4392233eeac75d30\ninfo = 495425d9727fee2e2b7e78899868c1c3e7735e1d\nokm = e13a7490f842b6e5be206e6d5ce69b2a8e2cba5525715283f22b021d2fbc2aec59d0144088581058f0fb2f551c6d62bfbd8a15d2706e23e10f3bf7277fff337f\nresult = valid\nsalt = 1e72f24b05a91a0093f34306ffced79e7003055b0833c6d0f27a4f33a1bd\nsize = 64\n\n# tcId = 19\nikm = a319ff7b5ba9b14ac72b681cecf0f742\ninfo = \nokm = 83b3d9f22cb5765c16dcca24e6ce6875b180ec9253bb3950666c52e3711f3b9200d2a995aa548bc6bba2\nresult = valid\nsalt = d7e3bc6daed343ce77ef793e15a8246e4bfcbaf83d2ac956d0661d1df7262b2e7311623dfe4152caddbfda8fa8ed7a82656ec00b72c5adf7c9d388e5b3bc8d24\nsize = 42\n\n# tcId = 20\nikm = 34bae5a158c1678aa76a744417a70d7a\ninfo = 87ec30aa53acfc3d09ccc1d57d654fdbce403cd4\nokm = 9413c6e1b27f829fb82252b5ac5e14a54503e5f433fc8182a6b556bd7b8e04ac34b0d6006950d5917132\nresult = valid\nsalt = 1532075f363e061133780ac959bf653c7687d181b9431215d6f62dd2f1ec3019d61c50fa82c70ae25e624c849a276b0c57d7c02a4d753fe84a1a6621e9a5ef01\nsize = 42\n\n# tcId = 21\n# maximal output size\nikm = b8a3fec3c020e028a2a9512ad3acb688\ninfo = 006a7b5529648b31\nokm = d21bf9e7a8685d4c052b391b472767d436a0335ce2315a9e44d5b183da2f06fb0ac31733fe0cb0c1b47f1652d16b4ca84a5c05e4fc9432a840426d146cdf17924c62d3e1901cd3f5cbb0aaa55d46e0d3d23fd86f82a2bcf3181a548cef4d848960ec65518ae2230474d6177a29381e6537eedc2b2728db2573ee182afc5d72cd65ba04ed613f245f3ac401de5e4b30018040b8b1f253eb57a2128c2c0e99ab68dab4583f5a1ee7d0a1d16e9f00afb5f63a1e98268f8c66db5d49ddff7528dfe71f792a93623e355d0860d65344eee9eba04e739627874829c2cc469f27d467822a72a5dafbea14fea2aca2c521aa17985c07a8457b18a1965ce824bc886525c439bf48c36e957e567edd26ee015c01e01cf3ae463f8efdf12dd0d102d95310da2849b8b0bb0849e8b1b41c515708299c7fb645c8f5c86e165e14ccdd9f3ac4766e8ca74eec97f7632a75543d4a93818fcd2b3201feddc19eafe19ed596b76aa3a8492edc52e990549f91967aad94536e8234afb862a60c92267e029bf90e07315db87e56ce4fe7a857edd4869c44b4f410f62b7ddcd31bdad3c1d6016edff774ea7e17c1cb3b39ba918ef0d961725ebe407b6c89b06a9f012d8fa55abb1b84e277991d8b2089a7e228d326eb0c24632e4e35289a14cf7fa1f036de44ee56c0444bbe7d84873597fd82dd6b717488ba3086d57c76783e88cb0992944c66f8b87132eb9908c5dfcf30600feca06ac52d28af218bc5df00fdf4b8fe3fc3947e3ee24a68d8f7c96517337df46283adbad468daaefd334ee2b101692651cf5c8c1c60c2b204a111707afa2ff0520727ac222807629e65f8425c925eddd4a301ad247499f6640f9ae9818644cc94ce4b088e37ce728c48e42f82201b9b27c7b0e918c09b3dcf6484d6794ba27f10374f618c4ec49791a3918977a13099e53bb8fe4fdee599016e7fc91f849692ba97e722c90fa6b4fe54e2bdf4699857fafef364fda90767692818a40cd83cfa42e5c12b56f7d83c4a8653434ec7e5e9a13cb46019bdd215c106425ad51418a6258014a62a449287edbd879063d8db019de0980d0ee30c9463c50860c7a2c390974c09c74e634b0543212e99f6db9bc104e14fb7eb52c4d98c5df24808c59baeaa01bcec03dd110d0ca6529e437e2994dadd8a48af91734b638acfe6c8d216b5d1ee48143a0b24c51f4e24ab2687be88233d10bb974906d46ac8e08dee1191fe7455075c167a743290c261362051c28fc441737d92de5ebc763cb52bd905cd3cf115dfd3ee89f0051e31159965e285887fee7fbc529ece2d350985d13bd16abe379ac5f9a89a99b768d4f0353e2d52bc8636c1dcb05bed53e958937de69636e34d5f46ca5371bb0f38e2fd718a6bec6784076efefeb08c3184bc92e18a9fb7042910d1305b560b9c59223db160e2959f061cb0c9a0acb11f479d4e77c6d98d5ca73149bd19875daaf06341b86227a93e09765877c0d7d0e74337f9cce38d59f0c4c9fa202d1c48e9c398064d5f9fe802f634b094f47dc44cd041086b728ef57103162df6d62208c3b60f750a4bcc2ab461424fc88107cfd545518aab77b42fccbebc7bf3da92e4a8c2a1eeca8d7052ce8c94ba6393f66be9b758cacf37b7c87ae41e48f9d2016fcac2305d6e15256d4bf7d19d6129582eaf7237af07463aceb51edd7c56bbaae7a54af6678256bbd5ad3bbb328d0506e451855281c5b380f63c1bce87b370132570ca98e4e330c1ad12831771ecfeb6773eaa44880bc5dc633452160ac8388b9eddbd02fbad325e0dbd66cf20298cba81f3263a402c5e6d5d57d4ee5fe391de78d2103067fd889d870a36e7df6441e466262b759d3e2c051f7c850e8484b6fb837239e8d11570d095a76241817fbd518ac44bf1bdeea004f8496a252726de49f36b0dc69c0a5d01daf2723140922ddec55519d49391f9a34b7c1a5e00d094c0ba8af27bd3b2ae1de2d6ae15b23e49bf65483104ac62172c8f2e9ca109c59649d0318e5c38cdd659779c598c23620151783d521f7ca021cb910f195",
     "e36d55bd963c25167cdb3bffe3642bde8e184eff7905affe418f80379393cd7ca78586764a80be777dc9d9cbe0840a4219c83459745f9cae786d26c1edc74f5fad27113fb84e8854c76e1fb02b1998253d365cb7aa682104765ea1f020b0aef0d3cd2378c037e5d64ab2dafd8a23beb5ac5fae3341be1c6a9c6053a3d857a2d74d56a7bafe341bd5bf7779bd7bbd1991a949850fc25ef0f2e012772ea0d2cb7e9292fe2658c6424ce786d7b7aaafe415adaf9ed7ac5e5ac8e24218bf9e629dc93d22d398a7872b9a0477ae98df9fb22e042d475f96d349029dbe108632d4d3b56dd89f352dfc703e2f25fba97da49a079133f1e0c0c729bf80b02edad76bb036a9ce1c841e5202d59cf63149cb3b81a68df64589fba8b1dc7f4fdab3cc8c4b5ac9712d7c9c41a6d5e0efebc2a9ad6310d30087395dd74b61aef03cb4facfd59d5d50d8c04c5e79518823f9824a94e0ec06b7157e48916d551bb5a6831ec44cae0cc8dabba3ae1b6c03391f3b5ce45861902a8e777fea9a5729cd16eefff724636284dea34605f53d98010fd888f469475a6a98b20c8ad8fc07466276e461b9821ea55cf3c42e208fc56c610f70368ff331e3dfdffbecc26e489f70b0a3e995fbdeec6b8fc87e19d3ac6f9036dddab7e8ffc38f58446f75fcb2cc4f7e90a721533de151a61c67346dcc63e15fe1a4ef1a98d1cbb25cd7b24703045fdfcffbb1249ebd3c1e52399d6c24838d7bd5b668807a4310b447c167cd3d3c13697f35225bb284339149bdd4618656b2a09712a812b2586c3492bc07a4c2f8fbe39861cf8d36dad815edc9cdc97dc2fe4b24b0fb3c2513e3504bcdb1dacf2692c98a6f90ff77fc5348d4acc44ee4524506bc176257b434e8584a483c4c734cefbb7457b4761e1dd2dafa10eba4a031e1f0f644e210e5bcfb7a72e2e14577c972a78b1a275f338145e2b7d80851013b784811a91c19c71bbb9df88ccc2c1380699f0d88d203800574a0830632e4401880c547c6bab52d2235638a7222662e166307779d2528c3dc5436508e25544d1025ac3dfb627781e8fc7bfa67738b63a86bdd9f1f089f30a71cb7a79dda35340ac1a2dec129cab38dbde6cd5dcf9d2da3a88f9c2cf65b4a1aba02ca213ba596af1a2f323a47ab6a07f0e3057c6d635b2f5ed1bc2f4f6ece8eac348202cf1c6d9f9c8738044ca5166e371dac0f305fbf1b5ef2536cedda250a4f209ab01c714882244b3c1ab3c0a0e5c07d6b928dbc52c9b23362266ab8a25e2ade5e06c3d645dd557630fabe57733c7543f7453e002da4eb1844899740d95ebe604dbb03e883d9f668b4974282ed491ba183c5d8cb2867788f24eed7d67f4b6c235262cf71d52763fb7688d3d84d92424b0b23468908e95ae82de41a2615cb009aa7e5f18c889125f1167d60aa24c3fd9e2e087c6b99d29733abd06c81e5a728faa0a945a2ac8029d58d7782f03aea0e185dbcca12e0564fd163427ebc2bf46bc71fa3564bc9556546ca2cf1e8ac1720d8955caadd08a6530c98d7df7ac14b07f7959d0edc4ac31e6d58d793be3c6ceb370868cb1ee8b57b74860576398fa5c7bc8d23e673745e7ecb1754dc2c873d6ea61057adb9b91dc4ca1ae1fa69a93e8caebd8a647915a75db4935e040e609e3cbd1e382a433b7a990488094dc53a91104c9c28fac9c74568e5a9e4d37df0a44f750fba7dd45b17c142057f16361ac750fbccd56fe43ccc548c9c97ed9a190e14be1bc2a039a671175ae625bd4a0a7a9f6ff27d75a022a5a0e5bea17eb6976631117ad44beeff05360580b8aa87d8a6c65b7f4b51d53c20d9ccf9008eee95cddc90032325598f0c671810edc80c9de9a74cb32de95b940507773347a17fea02f85cd2461e2e76e0f58315a7393489b9d26440283d89ac0d4f8e853e35790aaabf8dc26981bccb4b85c36393db621c26c99d1ccb072c8f250924fd0411136c5e2f9e79ccf450e785de248b75427dc6f858975b0d3f11feb0f8745ef8e2873424d34f09d04bf01edc974865fb2223b9cf72aa4aa35a5b2c9c91f55f2e545ac403e66435c25fdcd6aff3466bc9b947bd1c811c65de058a92dd3d3668f2ea7c8fdfbc54188d8328e445676a3d115252022b2e828ffedad08c2b96b10b5ca3057083fcc313e3a6d1fffac12987b8d518cdb8b0447f6f23d5266d95e03d36a806dedcc5466ca408580d5c3872d7f6c96bc63fe3c0ffacdbac126ecfaa9426483bee96596d0ff88f8fac8b9c67de4d023b3f0b146d8ee27cad9ae019d8982c85e361cfb7495dfbcff0486448251e34a31f22c0beece7f01f8b81448d267397bfe55b4b384d6604606015a744ae36c92d593a1cf33d3b5562d98093313f3a2ebc7b8b7baaaa0535476b7399ef34521f06d459861985e81e2f1bee5b3544c09e5528bfd472e01383975dabd907be7e9628ba660a776a9ed3a815ffb1df09753e8dc45a0225ba98e197508e0a22560cc0d76fc1692749a16c91dbed55e385593331f3bef1666de4c2b8f29f5df2673ac331a337da8fc020d76f4e4b0933ed6df06b5199715416d6ce46b760205b7583973bdf3967fa546c9e367d6e60f4c9f8dd79fc73a0967a58deb4b779f9b5695a91db67fc2c0e55e7d74eff97bcc322a00c5a5c0fb9564d2c128f5ee3b3378416894ff25b8445e52d21bd35f1759171cb4e6e426c71bab9a6cda6049d8eea904a0c95ebacc98dbf5a5e98d835b6e216e6fc062e600ba74c321620f63e76995637fb506daaf7b7e0514563b536edbc11a35515a75c58cb7f56f3f5ca0e7dfa3ec715089bf6e5f26ad74c10e72ba5f603f3ee51c7bc9645f4194877d4f4645c8226b1d974fab69e62aa3527ad2fbd101eb6b752a739a191d431a87d5c739b7d7f7804430f41820cde5e5a717ed84d80ad154f816657561d58f379e4a2e7761cdb505b5da6f1008143cac623d11859b186c291a0b39267da29f64d5f5c3e0e5cf0f3dca3b78372593aecff71541dbe2d3f89d0febe753f9571684bf8c1b82826715d40cc0da84fc2cbeb3f46c1e53f522fe5f682479503bfa423a2fe10396a9330be5c484e21d60a26aa3f70b210d3ca96226972b7b03fcddfde1499fa81be22e82d851e609834ff9be6407e0bae00909f952798a559809bbe47ea0e4e626de0445b79758726a09e38e757c5645379223141ac21de8ee298542670f329d77ab498f73adfd2d269dcee504d8dd046f7b496fea449e2b265874af3419d43b58df44d9be3e414775c715d65a1d4107bafad16bc315610a36b5775b7fdba09511ce68d1fac79592e740535a27b47a24f07b98bc2548df11610860c5918173f04cf28890e9c038846ea4baaac30b22c552d5545c7dab8f4a034367352336e58409ed2907df1a2fdcb0c56994477c2c9075ce3b1876abda5da66b3768eb7eba609f83376aa5175e3d23a49e8a4327ca3687e401b9fc2f00fb41a13059dd57f9053d438fb66050c4022f9a2d740ca1be13830047d47e9d15184669640ae993fdcd2242977f479b80169ccc802baede5fb86fba380d3d6313bf2034f71f9bd7616c02225ae23b2a83158e31de5726b79564f16abde403a915c0e8d9110319dd91e8c32ba5546ae522ba3204b70d59731d9971157807b024306cbb720563671b282b6e89f82cf91d5686978de9af12e523beb1f2947a384dfe1a6b18989a0cf1c42803c8238eab525ed3a25dad792908db3478d14cb26abbf324d589eaf96204c837b32a4c4e6f9240103ffaa14c1edd6b7ee221ca2dc52dc553cd4eea179ca9a7c4481f17a3f4a9633d29987056afe59b8f51b8665837c62c72c0a3b5a4c5c597327414485c39f298b190da1d9effc1e103b0194f5dc634c6e12c7a22866ae23e64a86bca3629544be79f5b4e89592a69c46d92566c7939385870e3337174dde45ddbda3691ccd6573edb897a15d2d17f2599c523355137de6b987cc35df65d0bba0e06e64bd3059ff94e723ab11bb4f015d72b42e1762226f163b881bf82dcbfa1604fe33107c978181d850bbaec70b44d64fb27baaf7cddd33b1ebb0872115a4fbfaeb6ca5299a02aa07ebbb28574c430d02cedf0396b8e181ff3631a1fe938b0ef175ac9e7dd399b663ec6c6c9520e4a63c80584d8b845087f5419d8c815b1ad78e402a4db542b900c71a16ada2cff190d6fb38815c59238e96e6cde1dda63a89ba907db338e0db29d6151722e9120126d70c6d348b8d3b99084fd8b2bc068258d43a34dba7f639807eaf2176ca7eda0c0e2b4e168c1df200734b592416304e7fefe17f051640464164d643e7b66dce05264a24354651cb803c012af3aa6b61c7c2c5690979b1e1b5e05fc64cb6dbd4c95df382f7d5550e12d7bb9242ddc025f2af03a44f7974dcf5da038f23ad826e9177b23f6163b827a98f0cb065395235e7d3141f94e83e46e8fe71c9e2c43c77837c8616150250485db8a41f7dae069fba1e453cca231ac71454bcace3477af40485ff2f24474115a6029163ab3b7186af02de5c3361c3f26741b1d86334823120178f6d453057cd7b7df09c908ab114c0fda4767bcbc43d1262cb94f07c396ff51858ea2a55ee02873cf9fe2c456f8afb5a64671c05c020177891ba65fd8a3857359de1fb4fdd80d2f7bca6e369f8dca930bd1c977a141728afb66abbad60bbd3b5a08f32901354067f5442de768972a8ac3330f3b4324c16c1a5f4b321c68467404cfe642418620df5078d8525919eff62163c388ad4c2666bcd06330ce5737d438b59fe84f4089fcf35dcdb17ad93d3d40e32493a57ef97a6c0d45604623ecc80714b561e515c0169ccf488ece2672af491446a5d9ec8cd443d6bf95258d2bbbe220be1b56f1179231aca39ae84f5ed34ead9511a2e9af44bac69f4bf42b241696d4cdd5f260d28c22d26ebb580265c5046c81bc386c0bf698ca1d412e7cadcc247dc1c774877f5b9ff8193128934fbcdee8e0932e6658dcd30d07391f82f4d89a17e2b622a8b87997e1848490e26efbc6e79b9e1c40a414d9f84e22a0dec7e21321245c76e64921e3030a1076c9a87596d5aa97caa5c9c68b3280427668348985c7b7759db6fba4c1ce21ebc6b6889fd7d925215d56758131c515b544c56e75f95b90d15dda7f309b7740aa7989cf1a9e3ce217e0ca6e27f502731bb7821a3fdfa73f915ee49e0757a897972d58475e4b12ac735cd9e6b28b81a76d2ab0ff179fc1755a7d96cef5e8a68ac9256d8d8f17d9182daf1540d7af15aab8b1517f7b8656fd3e6708b99dca9a1fd598efeaaa60ebeab6adb5a76a0ab6cbb7dedbe3f0862ffb028ba4e942372344cfe84da9fdec4ec75fb290240828c4c31a1fac0d178f0dd2245f29d346c3a841f863130920bc97dc05c510020852f3c01bd783a8c6db64228b973b20d72c45bc5482517cff230f1a9bf1d8d0979f62049bbd5e8a3e1bc54f6a1c148289b2a66685ddfd0406bbab589abfd183c4299ed66283beb96556ff200497804dbabf9b6702a87692b4b5bb58e01d16ce069b6c3512332b394db1c91db0882a571ee41e458bc960e7535668e334152c9d46e9c155ad09617c348c3874e5db311601f25d5e1682cf69689c15c13dc5c8d836ff6e30b0b804e4810e280252f4bee9470964159f2b271c275c9615b341d20f292107a481955b0b986365c3d7f05de29a8955cccc5d42113c21fe60e2a4a51be45784fc304e8da0091398205a9afdad9b62361d6f8c42b16a7990d5fb50ebb90cd1e1052f62a966a9e8be73593b50be8398c5b3e8f7ced3af398d537bce72a",
     "b1d7b10b4f0aa77383560a79f4faf2f29992c1e2afda295d15a65e30e6f968d00d60e5f1dab5a847060e55ad9b64f0203b21bdb506319ad379302c24673a727acc17b59ba12f20c3ba472c0a5628d0b05213116e2dfbaf9e98628fac973046f60f930b7eaf0790ff010914c19e93f07b74ac3f7a6b6c3cf92adb49443194f9167f7dd553768841b34d461f7b854a40926b016d8a0123a1fae741e07662e125d42fdcfd765c52d518049ff16393422e6080b9fc69117e5f17f3764917eba5fff3f078727048f3e5bff1d9eefe8ebe2fb6db7c54cdc9b7678fd0d6551aee06b584dc4047beaa72c198bd96ae9eb9b151f29747af88b75399b21570ba6cf983637e6dd2b1d42d39d07108464ee22d81d640aa4cdbdbee7919de51d8f82710e32dc722a04a8ea96aa32a7a19c7048c1d76d2ae63ea288b1120d139bfd2e51f634c82f6f10a5bf18b02725bfed7a2913896b5f108fcebd949d04647467e9837256d9918c2185905e078a14d2945ae64d57eb7ebf9746f80ef939c3b1a307c6af627b91db34d59234d3b62279fec874720624278a51fa6d22886456135bc98b683eccbabcaacab2f013fcc884c554ddfc6f91950215c4f1f750cac338ef3e420a82c1ba15ef420798053483ced448b730e386f0788e1a3a747f8365385bd0e02cd42f1cb48a61ffeb2b2e6e3ad75363a118a27dcb86cf27400be97bc7d10bccdc03f6e19227ffd0e3881bd7c3126d682596abc15bcebe77854ce2844219b17f604aa2b4cc19971e8dc163ac654126bc39966d35737ae75a4852ea1c29183a3700e7cf609ca864285a8b92de0f32ae7c33b5ca11aaea05e10f87d892c5571e89dfe54091639bd87636245f06cfaf87fa3a7d6d657ab3aa89f5fa6b54eedec92186b2026954045a07822997051bf232e39dc1a36a50cbade8fe4dc6ceaaa29008c13fcd7ef96cafc7554b60d479132b2810ffa583aafd6c7e188293c4c35008d895fba6634eb20c92bc1fc2a93f7034694e6bae8d291c59caad61a723719298ae5d99fbb0485837a284f070fd293f74307fafbcd5b9b3a49c96d9b7dace812d6fc7a94aa381346e879601fc292e850d5a732bcec383ec59a1034a573793ee07b9c30e29c3f3cf0efb40693b8ee6df08cad92be3bc4666093daae5484fc02df28f3601861a2aa9ea96e68bbda698fbb032485a55c4baa03893813804f09a4d3e639f2d84c553f2e917b3d47f658820702a6cda2e06070d29c71640c677fd76c429f98ef0b65aed0d5c82d334a3e22b5e2d49a31518d61833ed8fcef352146e7a1ca1c9eac1d786487e357a108ba102415f9d87ef8b00d1fdadccaf3328d9376600ab0e4ee2400aced47774ef5374e62ceb9f19670e144e4590e80d33e0f5863be0e5c515656c7f0880bf57ad0b986affe07a1f66cc9b1763ae7646a8f28f6c804b6c8c260f5fa02af05cffc3a631377f0e4abe659e55655f691fd9572ad832f6485c06bc025d5300dca8aebf5ac0094e582c5ba28389d76fe6387f933db6d04b5da56b739824bd507a072f32b5e10be0516718d1c9031dc83aef222abe60c6ced982b4256a36beaa9d15e11fd3f3f600e28c2625ba2b7a9290fbe89a41465b075aa5f00b1bbcbbfdced6dbfc41e30d511b02c9711510087652b4c6637c44ebaabdd0d5527e5017dc4a339479c9be804bb5b606ea3e701e88bf02cb6c2b3e8c6f7e4bf730c8cc36748d38b96300ad92136c9ab8632c54da6d7307afc226eef8b3b9c849235347fdd953a194a90cc730edd043d44f4387858fb88daaf9a0b4f73abc949895ad4af054a8d31b69a2a98090940c24cf008fe675befaa7641a79c440e666905a055e4ede90f923d8bf16e2c451bbe8970e4c3c54ba5b1c3ddf66e8ee0cb3ea1d417cf82a72d244ccad0288c9231809302494235e905876cf8ae1f874b61d78c26b9e1645f68a0478767d049dee312f6ca578ef5630cf4bcb55967c960077503927f3562dab3e37bee4c96d18b66f969f04d592457d055302ac96fd47abd3582a5117fd62b09a1a8c74c379961fe68c9e1792a2097d29c1d837161edeee01a4b76158b0939af676edd2bcfd18bced7ebd0ea8464be04edfd2590004004b0b24af9c1c028fc2b7e756408854ad3d4f89f8d1d27f90db5844c1622b007c47882f316ddca82c7429c870b2455aebd0519bacda287f843419cd74bb07a40cc08d1fc812039254411266245f3b16dca3d88d305d7ffeaae1b45b1bf622945e3ce4e90ec153b9ef84741db9782f1b4518233ac86e10d5f212ae7dd3cbbb952336401a1831621aa7aaaf1f053efdf3938e73ec95d084cca4c2a266e7a1db5e58851fc291db9d0e7bc4447319feceb83767a5c226010db7c1068e8831d90c0051689a7d7a9dbf687d1f1ae43f62a33d3076784cb5d800c2e3e9007d9a50c1d218efc59bb6d5e61c12112b90f72deb9348e874f3292135d7ea9dd6061a6023cf8d9d8c3abc3a8f29a50f2a2be9ee11de0a910bd3763f0b90946ed1fa5a6494fc65f155bc0a1349f0c3626359746e020f8d3bd83ad591f6ad00921a13909d6df288f4174bdd2bd231d2c5352fa232687c5262432732b2837fc37874ba8ec887f17e41a0eff1b56a03d6d4cce12cd60b426a0ce2ca0a3af667874b2c43dab58e65f83c0afe85e36a754cf460fd66689746ecf640d5af440403d2339898647dd36e733b550f41882b6aebf31d886091d1f3a7044ac84014ffc793f34f6633e419599c792042282f37cade01ea1b307cff1f7ddfc340703166c24a63587324859d7190d540352bd31ecd34a2213978980a490c456dc55adda4f3c920aeaf16611ef0516180d05ccfb6c05a8df20792591a12df86a3450c0bcf0ee7ca2a861c9eab2de259e77391f4cbc3125e67d41553644b2a1a8268647237255bb08e884852fb050365574a5fd78999e23a6b0457b7007c0f31d1919680ba10e803bb52e8af42c4dd85638c87d5ea436be1c8102876cf7c38aef78864ad5ab556b7648806caf6fda6dc247f26754862b29fd0d8c89b5c70476132737eb9d6bbf044fb0eec96a961d4f9975d866a84df0a08cde0e9525b179b4b4f18ea67d035fcaa946e807bb22ae18c159241534ed15da394ed5f73b1d74c51db40283048dd8c0f8c5c807cc7c13129f10d957b698470c05caaf280b37f605ff4d855726869251fd4952cb35d6a873309a7166548cc3aac9008589a6d258d8b4b31835dc26504455bcaa25fc580f27b213d8af43897d59e89cca09472f57720146f4d0748040c2f21764b9b3faa75e5ff78d3eebba844feefe0ad9bc0493599bdf1de61b3d71446e6acaf3327dcf61635e51694d3713732804b43989a43d293f133ac21ead51d1f2b92b76b3c61f8de0aa8dd660effc9cb1bbab80f9d1915025cbf3f70198f979a5a1e15db18ec2b78da238cdab78dad028fd5aac7ac043acda7828234d93bf512e09deea886b6c9459962705f8cac432ca315c3b9449c68deb4b0e71b4d393b891bbf92c6ba9dcec3fece0dd91512f49af9806c6c05f950bf2af2842a85fe153153dd658719a2e1b1a2e989448fb0c9b456d81f4ca770140fe9e37e1ccbe61893c1886ba8805f08c9417c8a3998b5adaf96a37d71b953aeae5717258b9f11fbc891d2bec8ead8d355656a0d0fb783cdc1353af35d8cfce2ecc36124809a77cb6fdba75d0f1ab2c9f82de83e1d166a70edfb86129d9b4e362db8d4dfd6b37c6c85e0399bddc8d30ef6b24e1f0a49871511aa210027fb6dd37b979d3a79cd386d0aa3629a25df9e77c33f4eb822ea3daf6c29be1c2d88d3ae3be2321c8fea439c0da77cee72cce86673477cced34d4fd93aee2d2dde285eeac032a81d4df620603a141fdd1d62ee11d2a82e70c4134ce2a80071cd39cfca105bc669319fc85aae441754ef7a3ea83ccd1ccf3fc6c22b998107d1c747ad5dae0d304649f2bd9e21e3064be40ec7b570fe564fb71d95f9ddc94ca45b8768a0b96414dace446411a07fa0100835aa70b21526a1d6f59c167ae22e7e181a14cff96e1073f652cea4ff504180c74320633527430719178a4f75e65ae9464d7dff690bbed239e00e7d166c5b7f8b6f12d510c7d8e619976b359c3cf71b6ecca2984dbd080e631af5c0e5b4c5641aba47eeb4f3b0d942eff17da0f59ef22a12bf3c09f3c24b462743e396a0bdc21b728bb1a73c6d0038bdeb6c078efe49262c597c50cae204d7ee129f7189ec333b2099d5b8c30a5e651402dfcdd65aac3a30ce35e905b8480a45f3f339b81eecc19ed0b36f40fea6490f47ee1a3386678164e1f299abf45dbadd518f38c758bf4366f8e6a5774ce0ae4c4501f11b06fd72eb8ccc25e5bff4809ffbc78faf3b0055394348513fcc2053207008244ed0461660105fcdb9540cd7a026cd3485c5a06ed7907309c1666f9391eac01bf63d0c6d4818cfa4782e5350f14f0b61dfc566d2d6ae766ba4832a974e7524c351bdcf5279fc49f385894f64c56dafcea13762d9c1763515fe16207ce1873a183ecb0a7e557a2807289a868cc4194efa2b46e0cdfa8668eaf99e583888030891f9991f47cbd11e6594ddcaa87f1d8caf858fedb73269b5dc5749aaa794cd37241100ae2c6ab74f5e5d091cca278b3e2f16109d0fde76230e5b3c91c6b63dbf736fb2af20429af3975d589ccbf41515d492560e92c4f72ca6655c3faa78ea5f49487d2812c72b455b8be1c1b881d243e1bce03a6b171cbdba96e795eb0164cbdf40538e98efcde2843a8b1b12e66daccc68e2b4c169a7198090dcc60934783bab955259332dc3b2fd9f2ee83ab234184c22554325e0fb07c52cd3d1737f12911947312c46ee47ace07e8183dede9d52d1e4d9b8447ecc3f21d8ae22c4065d4a12ec8b0c317324595f5dcf17b14642d0e8b18c1a821723a9970281a593fd865fb6b9fe3c93e58767d3a60a55972e505cbfdafcd957752d2015af86b956972691ae027725c9bc6bd5ad63e8b41ccc5c6c0bce89441e1ecd86b20c73780b4e453a10cd3928c354bdb96fce9f09bfc0c0e34298604a0f2ab0e87d5ec6d3e20ca312695da3b65f8218f161a05fb224437c94c8a936b2f73f27f112df39ec596ec8248e228d379acedb3664a1a96825db7c770c43cf3fd1d8abff9fd68977a72d2cb6c3792c88588913e106a77749fbc9f8f5f0e3178475caf5b228327a7c1620c3b4e3a9e41f66456e40f484343dd3e14ce084e82a06d285379094d7d820b02673e16c79dc1a5e56c04d69a33b328a944d94e33c8009d7071d3dce25b74b1c7b7ff60cee8807c9dc1b8e854c79087e9ac00ec8216e01f1ecccab81432563d71e604af79bbb24761c6fbebb1b5420764624e0d6b08d7127661873b756cfbd99cdeb494228d03a619cda283e430da5cf2ea8854e3bb42b5af8dc957901e2442c89d189c7d0739eaa4c79aac9cc829bc70320c896d626b5cd2f862bae1294f3e2c83270e61c12d1db6064c4be559bbb03bca33d3129437a5f0f0696b9d36cd29b4f98561e4cf0e765258b324c50066db05ec4ed01caf9f6fec58dbd5818fad71b2ddf59c70506a2245e3a3a2753152d94b3b79a90ce2af0f6819bd9ccda102b73b81419c2a317c59d2baa3a963214050d15aa8fa85ea825a8e9852bbd3711ce45b495079b610c18789e0123c6d07178387bcd88fff0ac62437c5dbddcba1ea4af9ad0983f57381c438ff89700eede5047951aae1cd545597ef2f59b82ee173d1e06dbfd55f93b944ad68aafaab9eacbe1ee366e2e650881647d375abf478ea48cd",
@@ -3462,9 +3561,9 @@
     "be95c376d9934950577b682d82985f0ffc2adeb9ac1d801cee6ddad69d342046487798373560db6331ac07287a9240fe1cffa3bcb14825ee235389e80ecfbbe138c349f6fb43574077213fa5a995ecc936eb12b011a7a1b3417b33f2adc3963a2b7abbd2314c4d32291cf24e9d0e896bd709c01e5a05acb60bb7713234b450557e460aa3ba916c5da158a88f37fab9c0a293565610ee33a42fe1b632c9c5ec0a70667d5fe236fd8405a80152bb91ccf336608dbc472602343579d0bca549d6d97155ff65e6d3cd2342ba931158a97613ea430b8fe663c28dac1cce08e8c28db4bae76758d3d186b6e34c631ad743a20ab81771879df17361e7d5db49fb0a88651d6d4b388b925714c19d790c50a76182f3d121dff6fae46fcd97e7eff2277bc8c6b87984c0fdb67cdec92b763d867ac3f54f30ea1c5e86be4484b8d52408dd9638f3d13d32e9fc43a7596c9748e0aaeabc83c08a7849c28df6262ffa83128341431cb97eb574990a2e2e92610035442bd7fa3520c4ad3f6a849297ff68650516fb80b786a3cd5a2699e37ab1f36d40c6b35843ba7cca1aa445af87711feea243c787165dc51975ae058f80cd70a272721e7d3be99db79e76c9cdbb476eea6b73e50968e9ff7515d78bf550e9b77fde7f686544e238483e7444faef2829a01651eb76aa767c03dbfd37c79ed8d77491cdc75798d230d9734052ab886075da01556263d09e82f2682bbad8c26d780ed6def00bbd3413a3b7d69d2eafc4ea0c42fa89114964aa4b775b5840ea4ea9f69b01d269ba4551f1aa7bff0dafd8e3ed13941abcd91fb3bef76a7b49340382eeca128b9ddd1bb253c1d082f02d20c37f0411a57ba5249b05b1ca2959aa140edfc4bbb474c9273909594b1d970124f86f861c0504bcb56d7ce395da042c175384e8e1c0b2be453df961e9fb0e8d60ad09ab6b8c8b09d8c7c3fa0c0376e70fe6487dab64d398257b8293c19bca53ec82479f7784f5359ef3577c7904acfd59ba3694283d7f0b63be70c5f7e55b45ae013ba5a8a77126a11154e91f8c3e9ed719e087c73e425c7425abda06860b898b1763dc030debaa9790ac22263a099573d6b4fa2ac17ffc9e7e0fa710a23326b965df9e2d2a69f07a249f7b2c931f2219a3f6281aa96937b1f88f952693519089b4504965e0408dc018f449c566f027866f891ca75832689995b72fd5f518e5a1e37f33c06775166822050932319f0d1e53bbccb9ae4d18c100086fae3311c69650d2317d83e4a164c4e67278dc1539dfaf2d9e02b52cd6885c9a66831cb81ce13422ccb069067ab6a6c4d3c89650677551c344918a5c24b0973ef5727f9593c59ba1026a82ca6e78033d6ba6a40488c5ec91708ec2479dc53d0ba7fe14bb238181f1c058e694898c914c2208dc01979119bfc0195e8ac0fcaca51d61fcfc5f72d92ba68a8d51394eea8d10b624dff051a9153b7d729f50f02d04547a6676add6ee0338b6d9ca9dee43260980291adaed18759bddd5311b7b46956cd113a076a3995b2e72cd1a5138dc31fcb5edfbc514bd2ee72fb53e0722367afc717b9ec401e4213a317583e6b3b19a75e1c63f1889f60dfb3059b0a64b85fb758651c713ac43345c8cd3c801da3f6ba8aceaba572f46100def2adcc135c4af0965f379a7a6c75d039a2cd40f2bb5919a3c8b74d58bc9d008b592f2ddb3acf4888e8b7873585f1f3d8581c743b324873fc23a345176635375b746575f79d361d186108eb5609dc78612b7bb530b6327bca6dfca45fb4f4f975afd1bf0f898dae164a19dee3f0feaaede1440cc7ff8fcb21145680e8a24e2eb5404697e25c2558ae9289f528a8faa572a354931a1cd4bc05bfb0116a0359a6b70aa79b145a88df482ed33354c260d1567e000b2d315e2808138638fd7bf7f4e88add370d24ceab5a999643741b13612ea85f67ecfc728e110aedeff58060a8aff0b7e1526f4aa60b9f9b558c2acf584a83b08d91901d6cff5ea2bcdd832303539703d30102ca067db40908dd8b555834a6060f3f6e7189612ed0d3b6c645db8b113909a38149072b3decb1f3a28be9223cfde40c2feea7e8c9d5bf37a2e55a60d8f89c391903e49bc644178531e6891653b1a4d73ee0870b18f8d53a089d5066dfadc3d92271232455637b20c298d640cb04b668d7080a510146b08031fcb84f41ca0cc85428f27ea9657de94073fec43d2c8c464723539276dbdcef593d716d02d172d30e76a9fc022d4952621d4c306278d3969592469d9a9ba62841dedd07e76a362b67ae5f925fae70f27c9cc870ba7b15d2d7d81b4e1d49f02fd963fa6f9ea5f4c901eade1114d92eabbde70cb0c6ba9136c68cbd25acb278e6cc73f9e625f1747e281d248739ecaaf403a21269758211121db85805ac522295ece97b8f90abb56e5a762bb7601b916befe8257e02a2b10c8384887de04b2d1c5afabe583367690c03d3ea6f7294f71b82ca80cd99951e5ccfe9ce7cbc5e04d1d60dcdd2ec88f9edb424bce5f04217be277700df4035443d18c14391bc9469f38f78f41f2d983bf761296161216e5719b37e3653de0d4a90a5171c2fdb9547a75be38910aa96c27ecc4e1fcf7a12d5254a8951a659df30db813ad7c75716ac050e61bd76ee5a4ec0bd7208a4c8cf4dfa0ac4438fc7f85e23db79d006e2acfb8d5a4229dbf0ee5ee26d064dc57a1dfb4374dc306158c1f8a9fe450a11e7ed21700ab2b817724a7139e2ac3df5f953ade220d996821ccef9e8f58a9c4996ed0bf6e70fc17237141d822f393cbc725b6813626cc63b88f5b893732969b47dc884c772e12c9099be0e519eccbc31d5b5886fbd737499a622058d6c13e200e7b201839c52634dd89e87a742cc99c5971e0b7cd976e8b1f5043a74fd6bd9d30eb8ab29c332057b2dac2f95739f34f1abe9e85b856f1d2df1d80915338cfc454b70ce41c2ce77da0f06f3b113d8ebc2ea441721a2f4d6e573eef2ce7e86c2c68a1060f6836526723e6726046c6efc68178798d967a88c17b4b4c59b96828d7497c7e40d6cb57e8f83c7164ad56c4e95cf551cbfe0314523fd7ca84bd0063ba241b591799b5422ba0cec9c2d5d5a3785bc510a4b12ece05c1081bd489edf428bba344eac60f1c9a59152fb8442c7b65987ac41b5ee2ff7ca6b8bbeded9e8b10ece0a3a792a508ac22497df9e66031edade139dffb19a3fc7d27b9bcd572d60b6a0f3482b8fb6ef495e2aaad99cdb89cf6171609096e4f2f03e21f01ad554c59d008ffce5f1ba874fc58638179ff01dd4fdfb01c4b60e08e315654fa5e211d0b75109439082a982ace4667ef510211b1c3ed116bbff57a3304161e1707f4f9c3b22365760b1de206a68c4eea017970e138a5e29fa3f5fb28f220d84596c0a7fa5e192e7aac83a1b83f65a5a61b2ce0586cf5c387ad24efacdec8f4c9e96334b94a9994fe3181a5e0ef82dd8e6a9ca79dcf9e5dec753a01f8d8c89e709a63a92638f0dbd4d083cd80ee7b4c82bb08bdb24d77ead9d20fa041b32386bb68d7e5255290ce65dd07d470b220e5298bf80a064c940378f06d35a3eec74dc60be0a9f46d29014210cb09374406a02e48342bc07db10811d314b0fd9be677909c91958ef5b3de9660d105058cb3a9bb859a355d502076938dc0f8feab32cc342f08e5392735263ab0e84eae11b39e993f0a6dfbbbc69dd01a7c23989f05acf42829f0fedc564e8ea633dbd4a1ae9318b8a7fe03efc535eb008cf30f8c9d38fa572e79a1b6c8bb02b87050dfd40f6d8a91a3b1bbc167247613000dd7fdcfa7e49000eb3604cbc7e790b1df640acb5a7dfb359d138b6fe3e12a8025b512f429d47ddd60c8c56c9084c509766d38ee652d49fa12aa3c2a26be8faafe589bfbae0815203101127aa23abae6b01b4fb82a2f7fee10cac9092d92e68b48bf26629524f2d8882dcd18965c2b7b6ecbab0204bd90e68ba89f1af5ab3992604bebfd482babe08ac40f86dc638c9440796bacc8bda1895d75fa30fcb0434aab12526de4c026d320587ebc36843a662d5c646eefc6524d6350ab11206530a7e48b53c8ef851e1d17d1a78a5f0a58023b9081357b033e2ece1dfc4cd68f99ae754195ba9453cc90f60371ebfb5086f60619f6b951f0708c1304875c618eb30ff4acf7b16a5f88564cebd3afa0c509516889e4a58354aed00433173830cc90c16ebd6b366e7d2b43da4f37ee4a05860e2d3267b4b61facdfed2ffb1960adce69914d4f36d13a5b7d6920524b364c87c2697000335cc5fecbc68c24acb6a6235a61fff788daad1294df9d2fd0d012b446b35e3bd4592f4f6418d7e676cf46bfdf1ede5c9f9c3fabbf3ea0b435555d253412deb4c66922f54a59cedef5dfd961795b0a8840a78266810d45da1e76f4ff7c8642e106852173bb7fb44394bf4b285d95d711651031d8f062ea62f2503c0047d808a131a44c0d67bbf1ae1ff58f9018bd92c63bab4761f572ec67da2538bae95fee458b1f298d27be26fbeb9c80361e30e0738e7da2d5b0dd21817832bd2af3f92f2e6d9a8c75f0bdb4c5f31811c4ba4af5312aa615e0e72a987724b56d78c8d598a59eee50978dd4ef4aa0fe958ce88f6ff8d3672a5d07a50a4c61af4b8121e6b5efdf7e39842d91004d2a78cda448ad233708a91d6a9b0e29e5c6ae3494b3e73f81c04e9df3d7cb5e4f8484bddcc228e87c3efeb39ee367cc3e9bd25521b493b168d15f5e15379177fe625e9a6052f8e3312ba0b85380ce40ec62afe4abb8d21ff9e420865874f16525fa38e3ea1aab965f548db6ba2bc21001a836b2598792e4dc27ac82b136ce604f554078d44b80424f449968cd3e7f07e73c1769fd6bbf2580421d4fa4e6bc2929da999f4ff8fb9f6170210e1d2be140f6fba282ec31c9d57a6d69e73502d194b611b1adbbc4c028bcea1d4003368cd564a59bd93966f2996fe7c6ef5b7ca578dac3b59989080b47024732adf735ffd721fdd88638217d44ac912893f031366150855028af0b12719460cfcb72378447f43fde09ae5fa6060e41372e40b89e088b00decd495dc7f37f9e8a4421f504108fc2f56eef0bc2eefe041dc52cde085622407d0da699cdc018a7844e8f8589e62cdd3359b08a6b90c75eb5b77421df5316c6dcb2e0672369f3feb5fc368d112a1d4d00abbae91f28e5fbecf772c8bfa84c222963934b206f8f77886bfc27e03b876d3c33e59d29901d41c7f3209d9562eee953eeb239a9c83f3c649a86c55d84a799145eac8f05303dfa6530cb693bfd5d1facb26753f76c50a3528003044e64359f22d8b31750782dd323b003c767ab6a8332994c51b57563cdc60c181400c46b5e7f928684e049a146ff614facfc17ad5f34e23f2a3bed5bb41cae4c65b9e6a6e62fa7dbf787543e5d8d2dcda4dad9773ba129e75b4dbf341cf6261c71441875a690ceb6b56b1f8a5c2504f17d521e1fb2b9e802db8a2e332c9ec91dfa044b0d948be844b6c67547efa07d74c9f9b1f44998888a62ce1b04a806923e3368fe4d9a1960191e022a1774589533b5c39090351ad793327dea2c54c6c03fe8afa5185e8579ef4f91a7b34d01b771bcb6cf1c9107bbb06045b4f689c034d4026a0540b44c24e9df543014a18\nresult = valid\nsalt = 8ed2f3533ae5da80bc34db49d9c3b3b0a7873baf9148772f286244b23ec6b3c1d9f235310c383c96bfe02a7e8be2c01c\nsize = 12240\n\n# tcId = 88\n# invalid output size\nikm = f39c81ba274637ba1460a7ecd776db66fa91ac12e1429be",
     "f84a9963b76c2c07f\ninfo = 516c2d910a221982\nokm = \nresult = invalid\nsalt = 408df96efb424324020d4836d100280b70f5d0e850e5460db77c543224ad5d2ba935060d1b5d63d80923fe922db1220a\nsize = 12241\nflags = SizeTooLarge\n\n# tcId = 89\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ef369d7b63f5509da56c5f6e446e2f03b700ca40c13e059ea0f43b08f5c29f15\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 90\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ef369d7b63f5509da56c5f6e446e2f03b700ca40c13e059ea0f43b08f5c29f15\nresult = valid\nsalt = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 91\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = b8365c28c10d6cd188f01efa320fa26713f7d87bf18f18529071607d1410b93c\nresult = valid\nsalt = 0102c651e047fed9c217bcf915520532d44999534c1e7e7c87311093d7a3681aff3e2d335b3c6139b9fc66dcfe35573b36a329a550c4cd20bfe2a90dfea50167ff\nsize = 32\n\n# tcId = 92\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = be14708389e4bf856681504fe3bd6a50eb33bf71a823337ada17316fc641344c\nresult = valid\nsalt = a0b5f9ccef84deab2a26b5d81f84e62b8800dbf270bad71f53d66881ccc543e33c20eb1b6526ffb53ab50399c5c96339\nsize = 32\n\n# tcId = 93\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed66\nsize = 32\n\n# tcId = 94\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000\nsize = 32\n\n# tcId = 95\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000\nsize = 32\n\n# tcId = 96\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 97\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 98\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 99\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = ab13dba7201b6df9182666cf7e658b2660de998ac8410745c2873aeb502fa371\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n[keySize = 384]\n\n# tcId = 100\nikm = baa311295125e326efd92676775b9aa20a0acd68fdd9b05795cf82e157c7dac61394fdc26cd7f8a9015e9587c5d0855d\ninfo = ac9954349e500c55\nokm = 5f027dcc4e32bc2f1c23de92b8b5fad67312fdeca2c09daa97bf0c81015bfe02ff2c17de1851336833666db3b29ceb16\nresult = valid\nsalt = 79f4669058de474f47efb74371ca5b6e3788a729abc31d47113ca0c2f972217ac9deb56b317f1e80fe42f5504c8690fa\nsize = 48\n\n# tcId = 101\nikm = a91adac5ab8bdd60fb350eb81d7243cf97740787877d41b40eee1c4c9a96f077e8bda335cb0e3b106454e85629bc5e63\ninfo = 3eb47169931585a5\nokm = fca326c96af6690eb9b61b4b2a23d78a05c90152667c87cf813c2c16f56047a63cc6103986d3c2bce48c5e4e031dde077fc153876bab3f57e12e871a506278f220d6180321ce84eb1ea45494d6b1c5bf44f60a397cf01d5a\nresult = valid\nsalt = 07e28c9f6efd74908c06435c95f3ab25f4d9a9e023f287e7298f9cde0cba29717baa1158e86fb70d5bd76d2549291923\nsize = 88\n\n# tcId = 102\nikm = e80e0fdb818f228c505ea15887a42abfd7b6479b589a76c33b0f63c00e7d188a20ef8e98534aa85df6e482750f85ad7f\ninfo = 31580276db515d6b\nokm = 941c9c841ecfd3b0d2c0488e0b327d151081d6f4d6b927c319df7ba4e3c9dd92ebe1c5b420af2f3b50b6991cc57a4f5a6aded05d5be9d699b4c70555e3dae218eb520158fd63e7be11bff5c5601ed9c6e616147aeb9878d01314ff519c4fe23bf29abe768df09bc485c175d9320e93aebce8336bd83c400b69d07fc19ff692bf05d299b25679cd038bffa43405057d22f014b9db5e5d94f09d3f6cea5d479d7e70f31dce39e2acd93f47f789ff094c0ae4c68b231d818548a81cd1373120b0f5\nresult = valid\nsalt = d1dd17d92c45854e1c617830ec2bd6ea613d8debe261ac30f0fdf9358a2be2dbb25f7ffaa9eee85f06df367b370804c8\nsize = 192\n\n",
 };
-static const size_t kLen127 = 129346;
+static const size_t kLen143 = 129346;
 
-static const char *kData127[] = {
+static const char *kData143[] = {
     "# Imported from Wycheproof's hkdf_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HKDF-SHA-512\n# Generator version: 0.8rc17\n\n[keySize = 128]\n\n# tcId = 1\nikm = 60ab7f45b0ad534683b3a6c020d4f775\ninfo = \nokm = 2109bd244744acae2b8caa9e70f57596ad680212\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 2\nikm = e3db76e02278cbd2adbcb4555803da11\ninfo = \nokm = b28e3c338c70ede899f2a2654f2cd7e0d958d16eab2fa2a76035a2696054b68fa963c617b8fc2a826917\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 3\nikm = d4dcb92a769f57c8bab8a420ee0aa351\ninfo = \nokm = a8420281c08c5f087c9d54d5660847805b0fff2d6257f02bf849badfa8a29bee84ebe704a6eadc0beba0c33805d5843e167b1966aeba6a15b0f1f7b3db8c407a\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 4\nikm = 2d43e54bf0c94c9cbff4300f4aa69ab8\ninfo = d674da3bb47d5c7e38b501e5251d9348af601c44\nokm = ccd42097a730e47cd2908a834f9d81a3239f4b91\nresult = valid\nsalt = \nsize = 20\nflags = EmptySalt\n\n# tcId = 5\nikm = 4055536896c406d5fe14a6cd6b999bff\ninfo = 2094768a8816f7df070d6e08b7ad93755dc9024b\nokm = 0191ca548ab4c1f91eeaeaa2e561f954983885dd363c80079f7bbd053da4274b236f4ef0e4954b34a386\nresult = valid\nsalt = \nsize = 42\nflags = EmptySalt\n\n# tcId = 6\nikm = 5b01b2da3166f217cdd68de8af60078f\ninfo = 6884cfa7ffe8f27bf4ebc6e46a7e01488c79243a\nokm = 01e10d4c477c906d4f67105e4a8054bd2e9479d726166893fcf77b5df431ad007c0ae42847d3706a770a5e468783c9519804be63a404112dcd4ecea952952b73\nresult = valid\nsalt = \nsize = 64\nflags = EmptySalt\n\n# tcId = 7\nikm = 467403c2ec02a235bf730ff37e8d8ff3\ninfo = \nokm = 13abf6dd4468e2db7114437adc914cda3fab1c26\nresult = valid\nsalt = 41f0f173d307d40436c25856cf559f96\nsize = 20\n\n# tcId = 8\nikm = 3352f942aa93071da6d39cc5ed8dc460\ninfo = \nokm = 3cbd7242368ce2eecacd1839876cf2e8ee04d8c54848bf5515dfdd046fbe09483982d406345d1f71a4f9\nresult = valid\nsalt = 57a0db708b25a51afc4271803aa35204\nsize = 42\n\n# tcId = 9\nikm = 08867e76311126089356623ba5381e73\ninfo = \nokm = 098d9f9e0e0c609b94e8aa57b0449cdb3929605f821cda305e4d93746553a40a1e4c97565183e116511c3dc5d9d56561c698849a114692c8128b5d3c1cd728f7\nresult = valid\nsalt = 0c164c443edcdfaedb1ab150f047951f\nsize = 64\n\n# tcId = 10\nikm = c55c41d69d2424a520414e3662aa7303\ninfo = 3fdf20538063b76901d61bbf9b72b0c18749e00e\nokm = 19c2ea76fcf7ea72279de10e44533436300e250d\nresult = valid\nsalt = fea9bfc92b74337e43a201a2dc199e27\nsize = 20\n\n# tcId = 11\nikm = 5d3db20e8238a90b62a600fa57fdb318\ninfo = 2bc5f39032b6fc87da69ba8711ce735b169646fd\nokm = 8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae\nresult = valid\nsalt = 1d6f3b38a1e607b5e6bcd4af1800a9d3\nsize = 42\n\n# tcId = 12\nikm = 8677dc79233ef3480777c4c601ef4f0b\ninfo = a38f634d947819a9bfa792174b42baa20c9fce15\nokm = 918e9cda37bf7f52506111048a878e64a503f9869d0c2615047b995f1efedc4f713b4dbcc940838e68f6a2bf772ebefae9154e9075da80ea1fd68b9df580ad76\nresult = valid\nsalt = ad88db718244e2cb60e35f874d7ad81f\nsize = 64\n\n# tcId = 13\nikm = 0f602703d37943e0253bed3da331aff4\ninfo = \nokm = 60738c594db9638656cc8493db969736e743e152\nresult = valid\nsalt = ebdc8510499f69b2e188daab77cd819cccb95f276f46e6b2be11cbe72700\nsize = 20\n\n# tcId = 14\nikm = 9fe65737574c5c7aa67646adf8230ba8\ninfo = \nokm = d02f9f8a507d3cb0bc047b0d979b50f94dd9f3d805a5d7f5cd372ca14479cb698e17a95c737849aa7881\nresult = valid\nsalt = 73a34648c152443586236abcb46a090ce55ef6c7f282ffce6342d694650a\nsize = 42\n\n# tcId = 15\nikm = e8f2b1c3e6a6c3d5ee0a20dd47aafa78\ninfo = \nokm = 34718d60d8eba9f7ad6d111ef14160652381239551aca21bfc1f250f8d04c64cb6cd503c7f5fb3ff6b73ce234cf6bf91056228a8a51599a39c402e32d47618cb\nresult = valid\nsalt = 3f5e162de91e0782cd189f3b7778cdc2ce6bfe9d3fe841cd3c70475d7b3c\nsize = 64\n\n# tcId = 16\nikm = a679521cdb56aafc5a4b76db0431a4dd\ninfo = 44ec41ab4f4e64f4a36e5e30c9f0dc1d77ae4974\nokm = cb914a0b318cd57eda5b9575dd511313b60cb7ef\nresult = valid\nsalt = 123033b1ddaead83a4b9cfef8a660bd8e00fde01e67c35656c6d7607d456\nsize = 20\n\n# tcId = 17\nikm = 49bf155ca102026f2a217ea1bc9843ac\ninfo = 851bda4faa8f7add2a3cbf0acf9c2786f8f955b2\nokm = 4a540a643b1597bfbd4cb38953f31b677c02c40cdcbdb6c48984aa8ff3e5dc17caf09d0a6f67afe92cb0\nresult = valid\nsalt = 76776e3b4d75f8f43dce4bded71f3b1ae6bcb012d9c0d59f78248b9427b8\nsize = 42\n\n# tcId = 18\nikm = 6cf725e939e8824d4392233eeac75d30\ninfo = 495425d9727fee2e2b7e78899868c1c3e7735e1d\nokm = 379e6d4fc3c9b344754a1094eac60b71e47e281695515987abbc3b22c1e267d95b101592896e08c869557ea82ba075d9c9524d3cb79d7d8cabb33364f5252968\nresult = valid\nsalt = 1e72f24b05a91a0093f34306ffced79e7003055b0833c6d0f27a4f33a1bd\nsize = 64\n\n# tcId = 19\nikm = a319ff7b5ba9b14ac72b681cecf0f742\ninfo = \nokm = ca31c0e0f5ddaa7fded85be96d6311d8b935307b08127f690f15f5ce3ed5a44d1c226e354e8d7e5069ef\nresult = valid\nsalt = d7e3bc6daed343ce77ef793e15a8246e4bfcbaf83d2ac956d0661d1df7262b2e7311623dfe4152caddbfda8fa8ed7a82656ec00b72c5adf7c9d388e5b3bc8d24\nsize = 42\n\n# tcId = 20\nikm = 34bae5a158c1678aa76a744417a70d7a\ninfo = 87ec30aa53acfc3d09ccc1d57d654fdbce403cd4\nokm = 65f5385dab06d375033a6a25926ef4bf5dc660737ab8ccef370af10cc9dcd7743cf273fd048f64b7301e\nresult = valid\nsalt = 1532075f363e061133780ac959bf653c7687d181b9431215d6f62dd2f1ec3019d61c50fa82c70ae25e624c849a276b0c57d7c02a4d753fe84a1a6621e9a5ef01\nsize = 42\n\n# tcId = 21\n# maximal output size\nikm = dfc7c0159b921546a4ccb3067cafdd6c\ninfo = 7fa60cc2c830aba2\nokm = b52c51a447b923e2e6acfc05cd6fb0fb65d8f67f7facce95d3fd4b0dc0dc41d7a92bd06c1fa156d7756d603f8c26a5023cb842c7a133850e842aceea3779417d29a517452fac99855a2ec52503e725975b1d1142fe20608ca753d39301d37d99ff5956b45a7b587e3ad485e135c0002dc9918ec49a985d494795b7cfd53641ea9ceec7834d33d060bdb2eb158d10caccf74f87465052f71c43e67567e62975f02cc79349ed381720965533fa5eaa172d8c7c017036a0b4076d5b76ca16f69586aecc94d2e93585c4c90834ba697d0ecdf04b322c4a6f1b468a7c89bda5ea1307cd99060427fb6c2daeb2f25ad3572b9df69a5bb783d0e91f5f72f95e3aea3575de29e0d91aa8011c85dc918481155dac096260475076e1b5b2cf8061e888de70697899771eb8eaa9c899de2a5fcacb78ecec49a1b8d72df2e208eec858e2af089003c34079a24c15cac878d5339933b91497fe6732bd2d0f77cfb4a5adac9d59a778e38a65c986fd4cbe5f3661ff6e4aec2cb1f103660708a06b9dda3eb50e76629375c4bfc4027f563ffffb0a6b17e80fb1c8705fd28cdace78666dcb64e009ebbd67d77b8fd18c1cac8f7e114c18b4215f4678d719672f7c3307eafeb91b1ac44675654b26c49ec71144fee1fdd0c238be154768be9e851187d41dd1e8842fb4c7de48061cb1a2568a8682aea5cd457453f281541ec0544da726c0fa38b76672867763c1937fde3c9c3f8b58e4120a1ee1704a3dc472da40ac9326aa417b49e3a9603cad661bf1c61f92dff92c553a8368ec0c3b5b105e4c3a4bd1b02a7fe12e93b6674a2b45396206a113d28bc77fa6135d1a3c5d4c876a8c17b6f4611483ed080642677255f7d0219c9e6e7e661ddf05fd7ba333194efa079121091d9b117d9f0281c2a0d51bdafc8a7e391ee607176b1ccbae5b0df7a936f9611753cd5bd815a9fab6bcb2a95343dd7781484afbcdf55d260335cfce70f07b8f4737c49c7a9d93335fbf5bd2595c77e5fb088f81c033ccf08673b446da6edd68cb0e1cb2b93c793dbbd3f845d76bc90728149d6f5bcf3360a5601d42e6befa0574d89ef6f3d749538f7fac02e4b122ab93cee09cd710b0aea2570d761164f6bf37b43f2a252fb5d17a737b83ff36cc07ed550f5cc6d32679691d9cdd72c91f9fd3229c8492c02710a3b380b8ff95d2ed3779cab4abe7e1d16d21b0572a0cff15488721e447efbab8db70c2a79d36e80b6e7da11101e06b560bf6c3dd0e3fe7decbab8c3a023597d07f2ae5af73bac662508f4a86db8e71b9e02545a970f614f66c18fc69e569ff96fc32c05f1b3e87d3376131d69ac2f0aa9e50f4c02806f164a29f32852f64291862609f423be3627ca2a0b76e09f1080c3b602396fc043c7bb77722c08574385685f711446600a98718e78f49ce1ca2d522061bee0dc45a5b899769d098282d1bfde4f35c9a60101dae768e91f59d69e6b9d6f5c08c067044c7efa01790ad94b8e3c562ea8501f67b43933e76a7e416bdacf52f7ced3f5f01af4e317b5e537cb6d1b96960832066d8ccc74ca06664a8416a390ca7d0f31aee6973ea9c4d08d7a14b6dcba15203cada6baf08934cd211b6ec988cf1ae8b23ec9da4f78c5a73313fe294fe2d19c5dd7e5086efaf5956d8653362f03d70a7c4a348ebbab64831a12ba64081e8e4b9233fa75096ac0f0d225f2ca3d4944aaaa7da6dc1bec11a9aecb14e21181bbcd0f5b466d40bdbcd69bbddd51a85e2e9cb8becd5da2c7fcaf20283a35f6408061f9cc0bf68088c68df7e257492f2b1a77db3f6e3884689b09ebe0af6d8bea07eb4ec4f78aa4f61f94533311ce24c8e3bbca0e57d96834e2ab1fe9b80f8ccab305e47e63145244f340480513ea6089fdeab01a69f4401d2da6aed99176d5603cedfad1a9ba79b277c35611801c03534b1de4784e5def8f2e1d81aa68207968e1e9baf3405cd5fffe6a0acab1a18e01540821cdc1b69d344111c6043ea8dd9196a3eb2ea9c2b1f6a1c77564c0eb144e376b9cfe74ba734eddec86ba19e2c57677547ff6",
     "5dce2091d57fe59b7515941acddacbe757029babde6d8363e9c87ea40973f121463e706514a6b93cacc4375b0a4b640731d39bad93aa5d81d0024406b9412b951158a4a91a40c39dbe50295b01281f78c65430e6ba97ad3106a672721c80909d5d0d3e95b5e81308fe7e9b7cd6145dae402c32967ff73b04a163405e8d104ce751203d2c354622370b9a54601c1b1c9d484d3827d2137faab9fbd6fdae854add24a933b1b32f33985cf3bc1132ee2f6b0399101801754e34ef0d15bd95a40e9d8b3241008e39082a518a3882e30ffa1b4073cc637b2412667d4b51993135746b748fd88ed5da3e83948d278426262368f57cf5179ffe02c35952539c1f61591825c63e8178f45b6eb515e4f02547f7118b39646b8840694ceeb28ad96b4a1f63941fe68cba5eda641538906fb6b930a9e4fca5b02b2ea1e155093dc56bdc8c88780ba1ac9402fd0674ade1621e0aae1936fdca343e6a05e791147150e06c9a5720c76cd7f1b6ea0e02472deed435d69081c57b88c33618bfc31938fb11e5d1e731e1ac83b24c15a32e3c4becdfb839c5e737d21e3321bfd607300b606ec2c73544741536cdb72b0853da920453443d6efd99694124b61d312e11a8bfad436df14d04f9f9fab14ec474c5df8f81f4dd1de24ca5a4a74880ef61106f1218b55df34ed85ff1a6139330c8df45b047fa3acc4f3b1c896cea3a979e8dc5f58ee34c44a82dcdfbbdb6a42e1332579399651cec217355acb55e45f8206bee4e53e6afc6811704e3119e191e3be8182219e8543095cbc639f1b66b4cfbf96fd3b7d02ef6f781b18882e8dc5ccd684d330141029a9d8c8ebebc3a9e49a7a0f21facc94ebe64cc538d328679f38b06f31b3c5996729ffd9d1cd95e7ad33e7c5dfc147c3e75cd9dc417a08c910fdc3041accbe5b669c649502e16c02b78729784d08e81e0bc40b4590836cd877f80217e23bbde955d56176372221ccf1f18b1bac1f5c150b0b4bd764206b7cfe43716f4bbdf7a44b4407278bd849479865a581812221fa56ec34c30a08fff4045853251a12f48e9bc4fbf58fb1cca7aa68b5703ab6f6be834923c933b2b467013a0e6c156f417e14ae817f20a18898db4806465980eda6f166dcd8d8e36f8a138a96d65aa739a4c3ffc5777d1303f4a3c44751b12ebf293df5fa49beaf657ea5e10c06c5160635b5ffb0b252c32a2f0cf448bfb934d099fb450de717981befb8fdf24fa711eea66e3f670124b68eee9c7861e3cdd3e3d1366d981a6362563dd7cd1c3f87faff083c39be3cf2f39101012bd105715f36c34ec8d6a4bfd35ee74a813e4fa0c98c077f6c9f2ebe1decc3b2455f6b2e99121f6b1478ca45d6b2ad2903ecf2294741f80d09076c447bed7da37e3445fea133a4cab5de5c4f7b46abb84756925f3e1e1a6adcad8cf667e6521aaea32d8fd5f423b9ad7fbd6003ca6d15d6457f31720d5ec7833e58866465d89d807b9bf71be745241e6dd2a179f5d2b6ebc9b92ad0a86a7c64d6fb15ddfaba5b030ed94a0cde4ff8f67282b572fcfa85072a3f1102fa710e60e4f59e906fa190ead2056a35efcee0d74d7d6f3bc05fefda6a43362eb966944c23c99810f0ad6998427f33c0e94388ed7e677dee402c48fe08409bb8e7a2109c230f1f0bbeacf57910d5beb58d1d83c10e55454cee4de633b63fba04904b9f796fd0d8428522536c50ba8ba2997b43198ccc4e3009eecbe43ff652e3e17e6cf0e9774b4b8616cc9bc30740c85fd04bdeb181aa281a3fee92bab269fe0999d85d89e8cd1a4d1682ee873de633eff0f51473e0e29d625c2582c2d67d941d6a80aa9eae47bd8b1c147601eaafda28e721082edc8724e3a6ca944f2b96286035fe8017a9dbfdac05d0602037bb330ad2e05aa6ac6b771a836334a7a8eae30f8a0caf757b74e63c995fdbebb159152c7ca7105245597035258bd9b031bfe1951c688cc224fb3ba8da6063f244cad38b8fb5db148dcb838eabdc402572bb30cd8ab5ecf9a220c513f6d45ae3472e04779776b014acd812f48b1356d2c8429213b0204734338d386e29ea394fd856533c1fa81483a3acf32cb33025373debc7d00c8d5a153dd3e56f5069c44a8ac745cb6d1cd6d0a37ddf4816bb64667da38ad6c75e246ed358e539febd606bd66d12153ec3d223a5ff15f74d7a46319c73962aaeaa8cd470a861782ec3de3ca235688a99bdd8b234e61f6a1264fb93292ea2826e3695ee16b6c57e4287220429d2d1a28c6dc8b5a0b50117d23b0b5f4df498d3ad61ac6fc58e398a9f4093b5aa92e23a1a4b5a34ef93b9662e60baccf9bdcce4c058b80469c01975c6f0742e7cab07c14f975072533081a312d30a251867341f0e904391252bb5cf03e9cbc9318e2aac65b0a69c506b7f9e8ad7b9d19ebde74801e0526a2bc03b4821f8cec964bf1763ba94930135d589dbbc63a048c42d79ead50613135278685f99a38070696a4c8e88985a9a4c7fea3e23bae77d287db1281bdfd00e60a5a5cffcf7c29962604df3017c8b4f4fffaf1a27f2d353fca7c40784219c8e31c06ac628257dbc3cecd1341cab153109fc5e0df5e89c0996525ae5d2f949876a85e6f5671e9043c28920f46f5c778490cd1ee733ca3eddb8003abd82fd6973a45e338b9091f472ac877ebf57161b9afc4ec5721a03f17729c95af786d27f02da6c53f43d339e313bc11aa483a354fef6e36d17508bc8f22a98f13508af80a5f136248cecd3c34da11b2ebec4b2f135b66f3188803b840eca048a559b33b842d340e489df31644ec53cac0d10646d6100f76e3c6e074a13e4194796113a770331bb84bd00fdea57433ed74849d90410e2a2913a79d642103a3b732725d6e7a7c02c4fa844fa4866aca3af7c257cc94720fc032eb482d75a27ffd5491b28144bc2191b2db5d4e515ab4c79c55af44000a821f02c31621b0efeef6a4ef945c59ea4b32a6b95b73bf9a2687a3d059c9cb7ea1472271066892c4ab14198897ae910311f0f353ddf4f9e8177f8bb10dc0a64e0c9be776c07d94fa788718973226077dffca41bcbd57c0cdb2cef9b95ddf7beffa76ea663b28225b382c11a8f1a9a7fb3d1ba4448c36aeb55e7a49adba4992d057dbf4dde3f24d208e0611ee7e15fa715046eb32fede6193f64356da54799599a582a499ed2c48182d9a4f208931b64105ed27385ac1727122cabec3580897762509a7a5e5fe4c3bf921bbf2f0308905895c298633dca6450cd9334708b3c0342c73e32674530d6588a7528cf2fef4077597d18e2342b692581d6ddd977ef3a7bff43dc0c5078f38985896f6e6dc753bc5d2b02d8152097f62fb92508bc80bc556e5295329a0b1502b4fccce062bf1166e21da5b1253c0165fda2d31e6d80b7e68e4687ba90acbdad5a8af67b06bdaefdfead0deed71d318805adea6f641fb35b300b9f79a8ef3822463258684e0ee033b5c304db81f3c104fcadc7aaeefd80b8184e2d016440463948d35058ba6be3dae282d096beb6cda140c3663bce15aeb07fae784de1372f766c0ffb2748fb1210f5eede51c67527dcaf5621d225586c17554bc78d367d70413e2a1e0cc06bebfa1fef2b7a971e08e50087d0266a4da1505dfbe5f639d29421bb7045712a603aa65d54e9070e4d71fdd4a14ba92681a8aaa0254b198dd5095780dab36afe8e6e85289c67740cbbca6723ee55173b1c36759edf969af04cd52c05480573f60ce7c97dd97b64e3da1b9889bde260d1dac867c75d365476678c33a4cc2adf218a1d469af05e821cea216bccbff7ed7ce7af028816181e01eee51a9f72c4520abb40a82bdbb8b7b69e97b92c0805555a9052f17a123ff4a1c797be25a661cfc8c3096dddfb987022bfaebf169bb7f3d83b9e66d1999bc8f75df07be79b3be2f1b69d8a5d3c4b9e3b8388ee06bb5891374c922a99f597729066efca97d709c55b9dcb49384a2e49c63e4c83c3378b8cb6147405d2998d113bc29909ebb2fe97fbcdeedfc89d686763bb9a43476a2690600a3cb83858f9198c1b8d5969dd534e609cbf3da0d311c70896772531a53f4e8329b2d8fea575831bfb77283bd688dd6a3004438cc10f0dbc4f5b982fd25325e16b530b6f3fd015036b92e166b5c38238211b81e8f7b92aa492027bd91fe3f8d879dd4b3220c4738fdae0ebd462f554eb1a51987988a130e78c40e0e03c7df1f7527d87899a1fed1ce4155992c753f7b5a8e554b99d14cbe36ab012687e89fe01a87e250bef650611d2be15071119f9649691eef5a147c253eb77eaaeb53d44b1e354e0b5c00eaeba91dc4c5eef389fe861a38f1f9dd4262cc2f85351b7dc1b8dd740f43040c85c5fcf4b3316738c1bf0d31960416a6cab54112987262ea54c06ead156de660559805558ab110145b2df2a601266991f00c9e4dc7567d33834a13a156419eb1cd213629b3ddebe5dce71212c4c08fcadc22ee78687d465b6908cd578729ba23f326c7f02f68a7e567a5c07effefaff4bdf726dc90d37e1f3b72e8332d3ef5016fabf5c73c384816e18d175d718c6fb5f702d39063ae9b92e05e1674cac86a7c34db1f11eb9dcc0898143d8a66e8ca343e4a3f20e593ecb311ac06a36c4e84068de483794bb0fcf516bfb291befb6ff7af518219d6bff8eab670b42e824610522e805aac17808ffeb87ff7bc135de4eee0fd200c4344fb88e4c178fbe517c9f2a4919dc2a3f3c68e849e255106cd5216235fc8d6a0ec04d9f4765c7c9f58a71d2ea63b4446b5ed4cdee274a224d3c4ee5d5edb1b0a7d4fcf7234e612652e06c88f670eccf15086f1da39dcb273e1c0e7365b7fd506b14944f2a387294a3221993e60f0a10a50b662b886e199d3421d0710bf08ebb40a876de217eab4222db41590f13e7660939173606158d050d3d3e5e902b497bea23c38b0715033e0aa117fc2ac13c8f467a9e2547d58e60a68f478b78e6ab7bf8c963a0e708a60cfd9cb5d9e3782bf3cf2449d0df555bbe8fed61c7b55e56b056ae1220e94e13ae292ae2aeb6fac9ab5c5b920889dc0c83d2852ecd25ee82227d112a1ccd356aba1087f72f3885d302b7d302dc44b61483e0d1a692bcf68d96574a462fe217f323c5d88e76cf792fa81e6956800b6c0b5ef54f596dec633ba322dcdb6affe30af64f39bc4907ad4ed4f74e1a067fa82f76fab1d05f0804124e65e2afb43cf97c3c335fa71b7efe743955a5b5910c297799a57fd46828969f8c9690d4e2f102aefb6ea3acd049d811d977827b88ae5c01319beb85ca0a9f3cb835733b8945ba5fe50c23a84864800c87e9e26e3271612006e057a3fc38fbbe52bf7db6bac81d1c1b6c1ec9d12d09a27ef91546cf9f2ac6354e2118bfedd3fcceb77c6aeef1abc9fb985770980d65dbd1b25651268ec9826f979d10d2c9f7b267349c2a2afe2d3a799472a1f555f38c8ec67cd153b3ba55cbc3864fe8bf4e8624d9051fc4270abdf759e1cb1ca09374a747e806002039acea004ba5cc557d04701871c4ca0c5814c1a5912c5ba11dd66a36ca49b098f0d16a1a067f3e5df1c49a6a1ce5a82851a518986d12e0e207eb73c94648ff95437de11e49fe8f1f99f2858356472fdffe262a384e42443cc535767ee5aa223664cd20254e8a26121329fe22b0f64cd59a4b4558d21568e8cfe22272163e3d2af3805703153fa7b252ecc87e2ed1f807d2c8f1f52bd46bab665c207fe031f943a2e48e688c96417496a553eef8ac31d2a284f579464ec7e1e863a603fcae6bda14452a6ff6ea9efd2b83036848905df1382",
     "32bd8f68ec7f69078469111304bcf83519431481bec07ac9baaafe37dd63dca2aa6a07918d6da72305a3104819759dd829ec38ef1f4f2d96325a1ef4080075dad795c9b99bc0170f3d9868d11edc63e47e3c5bea097abf2817bb5c0e1d682370a22d70310d73280d5b50cd197492ae15176e292ae2fe2e00edb69c55817d5b6fd6eb349c028d35478edcb877d5316cf53d91a91e381bad7c07f015bb7b5f5bbd5047e51207ab93564b2120d34c524aaad5ed7d6334d22971eedc4ace2e319421644ff8f0b072f083e7440dbf8b97dcaa32702e364e481cc7c6fed8b50bddf67165224516ca8043dff05c6a9ffdbfed302ec8587866937ccde5633787e4e2755a81562acef00e150975568ed07a35182c06c79ed2db3c738f4a14d0281a1e649dae9d6b9c13faf164c4eb24a639fbb382776bf5fc01a4ff8273bc8e2229fa421a530f4f625e6ad2ca3b3309ce6eb1b090796771606b41d7a875d62c895937a6f5b8a202a4a215a72977a5ef7a90d63c6be8c4acf2f468a2f67ce26cc13f2d1d39788660eddbea5dd1ccc07578fab26c0d15f64294f8e51aadc1face02f3b990cb49b5898388664dfd0d20aa9f93d0a8a606cded780841bfd8aee52a4c9f701c8461627f94cf4e501ddb23033cf514839a23206306c5158cbbc993614bea44e00b8c927cafd1df01381884bcf35827ec7903f6b6e9eb1c6f6e7e163b5aafd77088d59379437babf32201c99583e65888a06197863fbd2cd814126905e6c4df6a4a4217b7d31535448cc9cc82dc5c3b2d9e939c3b4b6edb4cd2548fc94a2b94cf5c3bf992e5c4b911308df9fb02a4f3bd2565b06486538ffa08adb77fc650b51a3c5d1437a09f8ef2ad418241e9d22e1054133565d13eed0095cfd57364ce634060519d52865344cdac47c5c5c91c3ac77ae18d392146f300fcbd35f61126868b13763eb3978d318f53ca31de3c94449bde5eef91690e1a69d6fb44ad56edef2f8659123fb7022346472a6e218ca641aea266e6e5d582147a2f8e40d0689abfd150c9228cdf6d994ea3d211260a8c6e7ed60b6710babef11ffbd7c0c7bfd6c23f8030164341158ea10697c02855b827561023c20df47c529aa71fbd242425ec2c0fe1d506a0b72bb3b37564390180e0c2597b91c4ab07e02f5e95d71279cb44c01bcc95a2f2cfd095d48e6501ebef72e0696702b1d86506be3e53ac548fe2f567606f0b8d6b9dd0e4cc0fb24d78c6f5c3e9bc59ad74ba7d0dc92646de38bd6f9329cfaf83babd3f94752c44e2e1a20a7c8735d1adf9876360e5916b16761a2e1eb6359870e521099da05eb535b008fbc519aa03b030835033e4d529cc93038eb836c85ca1d61bc454843f0b32992c4f155c18a5cfe15ff5a07eef8e64f741288e8ced16b372d41f82cd13f285a51209a80d7612ea7ed2f11d5bebc20fae499612a9f92e203e49de1fe3a5a8caa9b27f49de9c73e4b7206f87142edfc179cefdc06ba50b8aabeb06f20e6023ce71dc996b53119e6252709b0d42d4abfac576ac907d31403dc260d76d7ab2c6e3dc25a079878e543abb7238f5e0c178388075d1a0abe378dd46e3f28ee782ca60459ba930c5e4083c4d91f4e7538b85e71bb5997c748719ba412ca291e9b9e93e3792dfa471652b710e86bbd38d4c147de34fd1ab283b6b3d8b7eb886b7306137e8c94ed0b18bf7cad1e829186ca25d91bb60af412b37080728f94f8893e6956f99e48cf032eb1604c6ef2021ecea58b87b2673a3f7982ecf16b372d6315f0613dd8b964f5c11218853f0db2f4c12d990386fedd53a848270f9d16c197f48ea850ece23c9b892bfaba8aeefa9d8bda3e801b186ebd7588469028406e0e2605bd66ec849c3269b6e6356ba367e8915d9baa88fdf5d8e039990b858b956daa61faf19856721bc4780662f698cd0ed03ca4f4468115c2c1431bfa187c7edaad651d6f4b361939235622650c1287aaf97dffe04458ef2d10070293cad2ee1b42e405bf3f8a18158d89e58309c37fe6616bca374f89a7566d914cb5ebc32c29141d38cceceaa28bbb02e13d5e8ce5626e6742c54ad953ec5f34eb15e1fb92746cbfdbba531e5e2d3ac6725a02d17007d31d1c7ff2df57af6430559eefd0e814e40553244b8a4a4e31dcce5f5688a7407d262dcf5369a50c964b56b49389d7aa15c3cd40191b21a1faba10db56cf83b2b47aef0944ba252ceb790f52a2537b6d9935029dd9c78631c999ed03c06e9bc608d4a87aec4671fb361bd631699270af5c6304e0fbc309a4d46175ecd1ba5fdfe9bc08dc3745b27af2cc22d67043a8c9d2e616286042cd0286b66de058bf1bc424f035a07804364dd03f85e3353e218c871f9faab4e276a676d0bbc1ae56750a56901b46a65b8d0fe096e571e70b9007d6f2a3c138b49d1883f0d32ac3956b94db4955f638f99c131b7ba291075e7f14692769ea03d8a05a64f68dd34ec9e39b7685192715b3b79463ade1c16dbe3522447078684a50264b26f79f9c6bdf1e8373a3d161f91962f5a850524bff5437bc9b9eecb657141f91aeec634db228a5246a9e2a2f96c005fedcea91bf8c4623894cfdddfe606c7f81cec461678b72cb4542715a72e5790be4f0bd62f36d6d2a1182c19f7832d9dab663c75e89f2f84603e9a172db7d89271ae0cbc7186c17a71204394f63294b540ef407d4b7b83d087026976b3e4b2d3e3252a6e9c281704bbc21333bc15c5f0fd67ecde2a13b763dddc1b6770c28641bafeca1bf333b09d5735b117bd3b93d404afdea4a35b05e910985225472d6363b481adb11672b6cf1ac2e8a6b50b04b355ff9f15fd661b36b8f00a9af9775c7c6fe44fcfc33bb73f702ea96d647cc6758edf04c77e209baec6c2c99bbaf14b43f100e920afcb470bfa5d638e8938908131cebd588f4591f846591b5ac53c32ae5809a807d57b74f08d949eb55f8e21b4b0b6007600a541e0aedbd027727592b6720f4275e832da4a488efba1ca4e94ed3702a2c978c656984960c0893b911aa7ed49cd70d543894eac675b2d9a37659cb89aba129a285323f92918801987f2d87b8c328005ae3fd99c48c1677f057f3b4eb9ed4375ff2cc0b34049276a9007388e0eaff0b20a7d209ce1186707e7773bc95fe97fefc2ba6a06680dd37608d1f76e91fe0a5fcf49577058e4ee270e6966c71f482456b31ca90bd7b43c3781a48eca3eb0689c3a93e9b258d25e49861e6a37e4de6491f6e4924a9fbc6e712fd4aeccdadf5ebf6dcfdc862e11bc52ee047460ed3d0bf6d472500b03762ee040ea403540ef4ce2495e50b64c0b541f7f27d14a6e6e20a3089ef309ce106504788a40fc4ab08a31608ec5237409fe59978339c672ebd22da9af5e791cb41dafad39e6217bee14f7367618e6183ff7280fc9b960871418b2d249b14879dce08f4bf1c1a1150672b5ab73002064d9d2b39941244c3d892d9d901bb9903aa66f224c2944b185c4a4f457d07f9587e850c4a0357bb6d64f0d3ad5f77edad72538dfa9df8569ec6094b24e36fb7a73938a13dac36aaf5813bfd5106e8d4064b9d82b45e3ec7caaa743e393c5de2145f711a6f653ad8de4cca55d9a8c4e90af42aaab37957dd4c9e7bca090dc713820e2395cf884b00e898f5196a8ee68ac822fcbc1a02ad92804d6e01bad3c337e3cdf3050da13a4cc0e5e677d2c225f6a297b4f077a90f52869e548b939a5fdfca735c2d0a58f279e624be63b6ae8ea3e5fc992f821ca38a5f67a05e721c90e79a5192bd6758d3d126ba9646c571b1a9678ac57975894f96f0ae17f0e2ad8cec39e8bc7de599e46bc05811360150acbff1d114cffe1edfba639fb63a1896cda03d42e6cf8fce4473426d92377e23454e8f289c01882305ea571138ae226d7c2951dee3b41f82e00c2425fc7c0b0bf925fdadc8e9abea6464ff49393539495e8b2b2b60a46a256b07b99a961bd11acafdb4235eb1a9d428296f068495861b824bf3be80a7e58dd09062d8141dba93f4b969a3a056cf78c3b91f6987262798045d5e72494bf3954bb56b6f9576ebeb2a4085aca829def1fdcf8a34140e859586819f7c50ef6aa4910c868de43f1c510fd6c049ddedd62dde4f6efbb83959d0a9157bee03c782b0b6e9e965bb0628e0600531372cdf27f510f47f4ec377dda208d43c5da5a0690498ed64dc9efb560295afdd09fe1fad5b1867a44cbde8faad2da662336183620eb7cec6d9bb09e60dcf67d332f28b4b07da39e25ab94fe074bd4919673625de5565a83ec7e42dcdcebe3ee5bcb1d52e7db91e1ac1f76359114080bb4e268d243906cbe5cbab8fef482732b971c4052e746c7136edba055dc6527e0516f5999c05654d28f4e23b56fe7da84d690ebc208193c6859c302346555c76f1e5f92cb4bc8f95abb2522d25a9b31387f3b3002d4c9f6b40d36d19b31fcf7715d9868513eef8de50afbd4f10caef4edebff586250b9965f8414ccf493a5f4c81032a0972c7ee33986cb278f6ff999e8f7be77795241a0c801966071c8f12aba59d9011f46acc1524b9683eef30700f8bab89a9c3d981e61be6d2e7b5227539d0c0227d8d1583e454404283517c2f4915c3612dba632ff9ada1aeb3ae94e9ba31a5c6a9fc555a8b1772fd2f2c7664b50a021f3e7174a65c386278ca670b398afc43c5bc79e6df61766780b73e0bba811fcf7c11541802953d01289f315fc4d1689f27e34ed4179ece68e550357a0ead1c34b7bd7b36d4fd5c812539877255ce67c1f561d58d9389eeda415d939bc3ab34a80e21fe9c6838b751130ceddbd412f8faa61b369670917b4778b0c0244619a6d483466a5ef85ec76a8514fdb1ac5cc429d6c6d6e5904776fced03bb677d9c3929fce21e0cd0f161d6d2e6149f6653f97cf62e802212ad1c6207866ad0fe6261428957f9aa0606262db22ca6490ed5930db5ce49a016265f12ea5262620acf93dc0a22fbb8147d92a11e6ca3999e0cf6d7b2770124db73949f84556ddc3008a0e27c686c40b8f3eac972a4c75a84e76dce3f917f2abe9de474cce9e6fa11711411d471971d74ee7474bf8e612ee769ba9878384f0b61a98c6c62f27dcd96398fc04883cde133d86e396b28c08443217a14efa2fc801cda336afa7481ddb71489df94bb8b432240ed0186511e55d8c03397306d8b67c2fa79da7380a866d40a5af26d5fdaaac09f98eebc69b1b4c0d339115a25c6435c7e6f8905406f0c6dba03d54f32e20333c5c2273613a764a7d594f967f9471a206380ed6f38997a55b7a4287d4f2b1cfd6c15c188b55696b90d5625ed0f33a9dc3ebb89e085bb7e295236b2be0872ec037b43a64b0896d2daaff9058d028298b7aca6a1053cc500885314cd0a304fa04e95a6ee95f859823c1a17808903cdc093c039b11c78108ec49a1af11a3188d61c9517f781745e32a02153a1f9af4fa8d7db0b3d34268c129a2c5f7b72f07342d1f3221037704da06235a6c55c3bec83b705087ca5293765ef24603f36b9280efa3c4683fd25190ccf2342034ac0fe5813ef2aac89c06a0ed565d2f9d590824a09ae785e581628ab9b0de009a736a3939bbe79c62111cf6a16fccdd4f1266017f7e68cfe71898b4ddfcfc58869de822590b124ce4c188eca36087b5f848fa8dc1b8178b943d8096fe3a94e24745026ce50f62632610540fcd8c2db5b9cf714002f8db11807f008e719304f269d1fc41473d14d97f85bcfe4c797bd0529fa8450286284fc57e63f4952e73f96268e7a413754182d5ccfb1fdf5c05a0c016696dae8516e8",
@@ -3482,35 +3581,35 @@
     "b8069b185e8ca97f1772204e5a84ceadc892f8d3dcd2e3314d0d52894beea8ce9a536a88231f4d4386da6cae92841b9b90f78efa335ebca2464dd7017346fb53240150b5effbe0ef6b2d22398879ad07f981a2f079f28e29b73e67b58fa3163bb9411a5be962fdcf419ed7f5e67edb9c325aa6f1440d04a5111dc190e085e7c0f68365ab086f83ea68b4607f7219a4719e5c8288a0bc08889bfbe0dfc469cd9a90d440826ffa49296cd8b157a14f4383d47470bc139e2d38e0656b56f9958b5e08ac1802bffc142f9fed8df02e04ff976ead2817af9cc173aa9328fd73416fd105cd6d5742f509f7ea8864e13d4030555142c5507f1c2c74aa273cb9823e12c54d28842756504b966e2c157a46b20f57154ed063db1d2c31e55642edeaf53c3d078c255f168e5905689c30e94c8ef657e3990e3d32f09d41fbf6c4a360e3cf7957cff3888343f1b24d277d4dd8e70a3defe4cb5247b9f6c24f7469bf5d9270e9a1edd5e764ccd8b5e08927c066e08a792166b7907ef572dc9218600b18ca4c0de84870580871201db507af257d516c40c01902ac4be0a8190fbef31e71cf812dd3fd0d01cc6f4e5abec3bd68cefc1c97aef46e84923c08997c6ad565edbb70b0cd65856fb253cb35f9e10b485713cfcd5dd870ed6ea4d6490ef08323757b067abe2a1ddeb4e4e5b2471eba838682e0c611894bbfc1fbc831d2e6969798016462299a89f2a60860a5ed5fdc5854b2fb6c5b7f7e1b0efd261f70624c290c9207e903900faad06a7690b924edfda733a6e1b9541b556ff4c5585c3530349060eaa8576cc0e56ee3687fd087e26d933e4d0c5cbbd887302c3622a1a747096dedb5fc9cbc86b084df79d205cdfe29bb6e53b8f34d67111dd8218af04142332ddecb12e66d59307633b51d33e465b00b8126d2708d6caf45aa045a800b2860da7ed2b0af0f949a6fb164a9d5c837de7ccb4931c45b6b0c857c52f9030a377a75e5b27623e5d63badbd3d4d15dd9c36dd518f54a7f9f3271686fe5e606e608aacc9114e3ec0f6cc90ac163dd2ffde0fe8f2012477bc3a7a90b9df4233648634ec312a46994d4399ee5b5446c47c4d51658d88d2584bf7fedb329557ff80fcf1a94b03515561539b20e90e4da5c0626b51efeba29496fbc3091b70a73d9fbdb8739606dc5ee6d564d0f54d7febceb590be1e0f2b78fa7b21d5e181c6ba899c40d234e438bccfe37ba779cd8e1194a496e459c9e76fb9d8494a1182623ee747a3349b75bcd90dfc760f6fc72c174b5809789301ccfe6685c69968d1400ea9ecaa2441b8d772ecbbc8b8bbf0cde4887a9729298cbeeb2f9f5c8a823b0634818f78d0d4a79b2252fb5aeaa6c2b89b8818c18a21930e5b740cd842d049e02690fe0c10ff9b962068454d63f4a1bf7f6c5b7bec88db6810bfebfa38071ced9253e21f4be3790c5d96c6e99347b02d1fc6786aa7266bdc6f5c0e39891e772773ff348bf7e54bf21870692d07f2ba6558a20012d80351a9fe55ebbaeee155ffd13f59bab4917f75b1b8a0288340df5e06eee792497cded2f92016c00e44107b3eda12a007e84f9b81b09b21c22760e5d143c7acf0e057817149f07c055e049d96e0490f9b860bb80473a597fa2a842e0d20e7f2dce2eb2c5c68dab59d5205a5c9eeb3087b7cc798b02bd1bd84ac7d6973624fec2443fbbcd67cda5742651a441c0aaeaec96fb1186f66bc33f488c6f243ab16a07227e6796ab2124b62f6cb47255f2cab97c44dc94a090b366aeeee5efbf3846a47a886ff23b29dbec2a3df3b6295127d9b7fa6de46a69c7c195845e996a4384c07d1282dc7cd461fcf7eed91348d7481a4de5b3dae00f7326364c77f746e0271981779dc832edc3665628b504d657103f303443c653c1a1e898f99c794180bdfc2075787c0a6392e57b8afd6a517367cf614474ad2af4c221b448a23c0083daac98f16c9031504e778daf072db58eebf0485fd739e8431b88684f8cb3ca585577e8795415a16f19a11b5a60ae17bd244d12339bf1f5e9610cd19f1b020421c6b5cf6fd3442883cf10dd8ab6ccec576c81ee4cd404e89510b4035947a370442ef46a71ea93703505c240d8430c35d42078f45ff49b2fd382379643b36318efbcaef2d063e5f0306551454752b86adf5e406a9f190a0ac2fd3e8a17f1b02168e1a1a97b909e79c5e820376e6832bc3be73bace1dd05ec791590daf112a232a460a133e0d222d11d6faad404924c8591bd5900b34c829f6ab52fac5ff158b40089324d8e2ffdd53d0dd85b43995f7df351ec38825ea4deb1359e7fbfc8eff2135241fbfd484e1e832b3a680c8e228e5d5e5356818bf93d2b97bb68c6d6e528fcd6bc0fbc3ebb28ad842d94e750072d3a635e69969b778c8f14a97a2d28042a4071753fab49db785b5c41f7761ef49280a1a689642d6e47eb6e03cfcc18313729895c6bdc6bee62a970bcb247099c27c29733de0ed2de83674756ef4c84c41ffb7d47d67aeb8737ba082a33aea742601158d4843e55ee641a0fdc956a3bf2fba5f391b73036f1b4150f2908be5138cc0ee92953e2ef7de0455af425e8c5dcaac16b5e640892c56bf161ff1b94c16ff80bb0c3d6a876d072aeed92e4d4b1becfbee8b5c452d796b92ec452af4f8bc838e7b84dfdd80343983526d315622afdea80ab1ba296617556a993c9169f778c9d9e9256f4585e843fe550d1148d4d1a4891aa0fdff51a8f8914092a162f7959aa899fc3a0d105915bd88c05412fccff60504a0cafae00bb4880b6bd169316f9eb52835267f95c448cfd00dd1e409acc0cf2d7f5f6fdd1325f38adea4fd6f55af71c739ecdafe366dec44f3b544ae5c77c339e8fd5c7e06d28fa7207dd61518b3f327b35c6ab2b6e245fc4560770ddb18820826d95c743ffdce1b1a3af8a71c22beb5b5ef571ecab56373d182c20ccdcda91fc9a1b3bee03ee89cc38bf109cb0070c20d515f0b5339cc9060aabd23c2715f82a44bb10f2d956dd51f9c1d48dcd887b79723f9e7c61c87d61f1414d1ee1945f8defabccc0a4eddc2b5b02e2190d4510ec2b7ad404eeb28ad5a0c5eb838a35f39bf7fa91fc999445ccfa59391363ea6cd7ec389694eb4ecae97ca31524582f207dd120eecb0c6145885eee6bd39c8627c33916379a9d614c929adb64dd3fdb28c12b24d31b66919c4730cafd23fbd0266d471a2bd72b01cbe1649b56b4203c903b7c1e27fd00bdb8146632c2a5916ac678cae648192464082c747da12caf955033f4d942da3bd16690ced4653280abdcbe6ae6780a5512930d8adc6f7badde45a3426b78271bada4c28cbd4c5e5bb5ac958615ef129970ac13c376c7929d60ad1c629f8bab3c610649007dcfbfe6abfb66f4c4585082b1d9167a705cfc685f5fe5b17350e48b405e03a3d3d07f0ab0cedc961137e009b4ecdb9969f6ddbb92fc05bed560080d8450f7235b43ff79c9b460c29b2ffd0b67f4c437cbd8cc3badfe5a9feb3315c0aa6c9bfcb81c87547625038c804061e98346ff3633746cc571c3853ceff7a1842e0d2ddaeafd01f15758954ffac64ba46725acc1e30f6a5872fc090e47640cb4c804a59c55a5ed0316297a72f2bd4154f0452eeb785136f5d9befc4534b2ec2afd932c235c0c58f932aab15aa16f2cf7372633656c8623fab7291525e946550efe47eab479a1fc6c51132856ce09eecf36091892bb06f0f8ccc87f260c858873a4174ba1a64e1060a111efe1224c0b3d2c05e7d1282660b52e35c8f1a68a52cee6516e94b9746917d224c28f68ab4bb4a75a8b47ff343ea1056cf3116ac0660815bf0f6be1a6b98d713647d439c7e2511824026118a96b06c006d27454c3050f8bfbda087b3c7a8397383d652cc3b579fbeb309947773d6fbfdeda2940b7a0bbc2569b31dcac7dbfb8843b5a7bee26e63f734db3eb0773460d040238dbe757db9efb4ef872f781be75f357336b17bd84e2717db6fc23ab1a5c635a2dac389b3b6ff5bbad55711e807fcf207c80183f32efb5d47943bbccd96f5761c3861eb1ad3dc874cbfc5c25435c1a283c662cc13cd65ad6a807020dca215132f6a453ccf26ad4e8bf94dd0f6f8024c17729843d9f359609dd9b25e2a9b3c87622a751ace3ae47ac5675a3011c86d0ba3356ab8f9827bc726c956d11b4617010bdf90ddde46ab21423eb8ffe23da3cf551b23be964f9dbeb79297416ec4b3ac8e3dc7881aebed2a8c168e2c34316fcfff83602ff57cb99c18a71372d9f019fcea16abe0b6b7a27b02d99e2d67564986f122cae4205c0937bdd89a1de0cdb4fb71a4bcacc2a592b02be16e5d32ef4cddc4a52889c793dfe401135ca3baac0e1610f3bef47c89d411a53de275cb290b0715ed885bffe333a2df6bcd681ff0b47760306c0e379b07503e556a0f5313f7314c0d20f53cc41a75f07ef86720a42c88781ac6a968245fba509b43b67a42df8200981bcbee163c88d28b8dd1b70c61f0d558e0c5f827920d0b677e48915b99361dbb017e7df4cb5e2285557751b5dc2427cb7ff490b3f4566b3130b3c373fc877877149c8182c6e8c609eeb46bbc9e353d87cb8dd2fd59112b778881c30a87ee32618501767587e3bf64fbc7b8d801738bc9fb703fb8adeaa7699d4b227a588a4820dd4d07ecbead8910578c190465c14d7a1383b6ff1910017c3cf624b7a02dab9b2713084f45a7bac3d75012c3ea47cb39defc2009ea9fd083dd8b521e7df4c903bd39207ed5fa56c5dc594483e1531190bac65f348baa2159249546cebcf65155cc70b76013883af3df8ed1d8ae43da4cb26eab8d7e13a9ccbc1a8da5cd1026ef1bb5804169bcb25d6724775309414c7fd55d2fa219998a69a911a7e77e447fb12e3a2efea3265c728a0b14139436b50455669838f83463adb4ff0876285c5ce221ff704682f68949b2cce4749a6d442c6fe3a1fcf84e6714a764e19c383174b20f054c7f9488474ad2f8e572c566c1a33457f3ad24347e9f2517769c0a0842e3299b4b693492d5ac595654ced83e3b478676ea56dfc6a0430f356b6a5de1b473d5f9a6aaee5e4d31d1933340f42e09f245ac543fb2e2331f2c30847af524456563c0d9bc4190ab02ff510fcbcf5d8efb0f668587ef0023b0f4bdb193c4c73f7dbf1c7d662bb8e98fafb96bd9015c2b16b8fec91f764add9a57a5a5b25b4c9a836f95043b5fda20dff16e139c35922ce381d246f430036c79b32904979ed54ec4e08fc3fb006a62f90464b7fbbc18624e377710ba748782fc2ab80bb5133311d98a9d234601337b680073800c4408f44040629a3a0d2c6610a28367dd7ab59e43270ff10c3d29d945b01798d01169b13c061b4b60978df83702d7061bfefa1378b2ad3dda42a60179a5e3f080a3e1b8e36d9a689b1f41e039e39c500934d260bc1a51e0f6a87d5b65f65d2bc0bee3cb85adeffff9b0ae52a1bb80e1328a738964d91764fe1416a199b41603aa97fc63489238c6cd17c0d70a16c70118321cd1d3cd2536e40b782b40dc3c6f02d994a9a7270dad180345a48050119d96707c31159e12430a79b15330315c707e2d6843fef43e4454b1e033dd54ba498fe3dab1614aee2e290d971d4cf9d2043102231edeb6b703b4af5a23dc1dfd3f796c4916041aea90dff64d5c9cc9f6181ecd0843d6cc3d1767ee1d660929b953f8b4a51c9f10e90e1fb7dc1130877c46dc26b897e7c2b31cb868e38f9358d7997fc52335f530e41e33c\nresult = valid\nsalt = a1f3edc92da6733ed0c662ac5b9564525810e6",
     "4d87a2b317749f9eb4068f4df93b5e9bf1f5f2033b8e4cde8782738fb46c37aa1023399f29562033cb35b65ea2\nsize = 16320\n\n# tcId = 88\n# invalid output size\nikm = 38ec0b50e79a870ca225d1e78fdfb74b7fbde0891a16ed1b6e7ce8889d441fdd\ninfo = 9a6c71fc1588b2d2\nokm = \nresult = invalid\nsalt = 78865524949fc5a008997d85b1ce5d33054ea061d6ff5d7bf74c9d36b3502f0b6fc163101376b241024ee063e82d5826ff5395124a18504256544f922b7c1761\nsize = 16321\nflags = SizeTooLarge\n\n# tcId = 89\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 084332b8a0ab8635227a3b9ee0737072f021c21fbf0b087940939f34f685c0a0\nresult = valid\nsalt = \nsize = 32\nflags = EmptySalt\n\n# tcId = 90\n# output collision for different salts\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = 084332b8a0ab8635227a3b9ee0737072f021c21fbf0b087940939f34f685c0a0\nresult = valid\nsalt = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 91\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = d41d1d366b10f6dd7e886e5030ccd01ed14ed918407c84f12f8b9a2ed3a5841c\nresult = valid\nsalt = 0102c651e047fed9c217bcf915520532d44999534c1e7e7c87311093d7a3681aff3e2d335b3c6139b9fc66dcfe35573b36a329a550c4cd20bfe2a90dfea50167ff\nsize = 32\n\n# tcId = 92\n# a salt longer than the block size of the hash is equivalent to the hash of the\n# salt\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = dbbe9ebd37e2545d08d715013b50f31fd1f7089ebc2866191e49e774c537b17d\nresult = valid\nsalt = 1a57a60677a3c97fea6d4d6eabe0201452130c58eef435bb9cbc21eb65f1cf2c879639d10b9a580b1eda822aa5f406b939cea2ff9be10c56f0856709abf33a08\nsize = 32\n\n# tcId = 93\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed66\nsize = 32\n\n# tcId = 94\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000\nsize = 32\n\n# tcId = 95\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000\nsize = 32\n\n# tcId = 96\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 97\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed660000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 98\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed6600000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n# tcId = 99\n# a salt shorter than the block size is padded with zeros.\nikm = 2b54cba29681b6ff2feaa9202b87322d861aff8a8260e1bda68d61979e605b2d\ninfo = 1301b63168af5451377717f7f5ed52de36a197ff\nokm = f05091c6083c24742adbe5fbdf10a941783517d568e96dcc8cb55db90756d8c2\nresult = valid\nsalt = cd920e8dbf19ed66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nsize = 32\n\n[keySize = 512]\n\n# tcId = 100\nikm = a75ce5b072311acdf290ceb4c6fd25eb6c52ecabc8ed1ffc698d7556d1132180e2888bbe6a798d891e0c8c5e0f79cabf3d27df56d472be152aae155b52d9a9f9\ninfo = 69d2aa66efec2cca\nokm = 8b025c9925f105898fe8f75da1839b683beb73e349dd08b79a3d80a7b29e7d9c1eebb5cf4c902371b31376e44d49ea39725ac912d5055c8638ce0771a8edc999\nresult = valid\nsalt = 8df18f4f797c4be88ca6b2935441a1100db080759c042a6d2c37d2e6fea9fd6fb066805c467b7557c78d078ae44dcb886e5e3d5f74a96bf6394aad36847ed8b7\nsize = 64\n\n# tcId = 101\nikm = 5be4b9756eff71ebe87fdb5933e5d88d51bcaf384cc289c16ec642d67f2e9236c04106e01ebe7956bac010e4107b6b788ed8b3916a39b59c7c01161cbc2671a7\ninfo = e496bea60a731eb7\nokm = 02487460b110121d3df3746d7860332b6d67d746f96ff8e7bcb2d62481b653dcf67903b25aabaf9031b370959105c9136536b52dab810cf041862e73d3352f77747814aee2d74cfa29840dbfbca242f38b95ea26d4a540edbdab3fbeced1c767d35a73b4c2ff180eee75b4ada9739b7bd8c75c3bb03589ab\nresult = valid\nsalt = 336a871d315b7d2ae0a0d24febebf0702d9f039ca97146cc0aa2341728824e83553e6eb166e954dac33e4d6a2437309d0980e26d1c7665ddc79b2e9ba3354262\nsize = 120\n\n# tcId = 102\nikm = 45102dd5f609c2f9352b91d8b492d83b5ab34976372b4ac814bf82cf0dc4f3875cd31dfd5897022458fc7bb8e5d2930a620909b7385ba4e48c8395b50d7d07fb\ninfo = cf6db9210ef18e3d\nokm = 146e59745a9d65fa6c98308b6f162566045d2f459a09eeb7ef7cf15e076fe8093fa202d15b12063e55d4b5ab4e80d58140b2664d944e33d8b2a72a3ac307ca51c23976adb1ff9ff04fd0fcbd21edea49890c12698b0600b3b70a61dd228542d47e69797122f0734c08d53f51afeccea785af1028b35e6ee911fa0d98f76e2aedc517f35d719c199b6a73aa867ad31253fc1c1d612ecc913b70c2f6b983fd50eccd8a20172052c8726ac6ecad97b8bc8770ba5fd59eec423160828fd8b1936a5ac5bbccfb6398cf46dc3e19df40d315091f2ae3df875334030418143e7b791cd1f732935482fdd585fba2f495973436138c7fc106058f9538b92f055ea3bbfec1\nresult = valid\nsalt = 76d1494d3631034558ac7108a69b79f7e38a45aa50783af41bf8c19531fdb30782e7689a50a4eb1391415ab2e6085b1e246ce0e6c35a5e02910c072a241cd8a0\nsize = 256\n\n",
 };
-static const size_t kLen128 = 30701;
+static const size_t kLen144 = 30701;
 
-static const char *kData128[] = {
+static const char *kData144[] = {
     "# Imported from Wycheproof's hmac_sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HMACSHA1\n# Generator version: 0.8rc21\n\n[keySize = 160]\n[tagSize = 160]\n\n# tcId = 1\n# empty message\nkey = 06c0dcdc16ff81dce92807fa2c82b44d28ac178a\nmsg = \nresult = valid\ntag = 7d91d1b4748077b28911b4509762b6df24365810\n\n# tcId = 2\n# short message\nkey = 4cd64efdb76df5a85dce3d347012cad06b0c3db4\nmsg = 6c\nresult = valid\ntag = 6d3d37af55c75d872d2da07b9b907ba22ad487d4\n\n# tcId = 3\n# short message\nkey = 52e1995025297fe7b793dc8e1e4f7d312fee2700\nmsg = 29df\nresult = valid\ntag = 82cb24bfa38fbdc91d1eea2d2dc1ce6e60ff881e\n\n# tcId = 4\n# short message\nkey = f3edfa003d89c4e2a6422e77a01b8adbd7ac26e4\nmsg = b015b7\nresult = valid\ntag = cb244ca6ad233947378436076fbfd20c9c8b842b\n\n# tcId = 5\n# short message\nkey = 4b07ed4e0c8ddaa1f76cf0010728679c8857e18b\nmsg = 3b2c1afe\nresult = valid\ntag = 924125532e6b625e7c5a8dcd1614e04334c067cd\n\n# tcId = 6\n# short message\nkey = 7f532c8ec83cb21dc98af7734c64f5fd9167ec30\nmsg = a33c6f9826\nresult = valid\ntag = 0d25bc40f60fbed36d8d7a1045ffa60d88484d56\n\n# tcId = 7\n# short message\nkey = 99e60c1fc0cb3e6ed836619775e37bf15b2cb93f\nmsg = b129bb88ceaa\nresult = valid\ntag = 6924d833a3e74b48f991e6c44173565fdf8c7470\n\n# tcId = 8\n# short message\nkey = 53845f10344b7f39eddbd3e44231fa802d7e1aca\nmsg = c6f5b1cee31033\nresult = valid\ntag = fd4b28273d3ee8cc24de2d8dad23ad4f355240c7\n\n# tcId = 9\n# short message\nkey = e3220700ce24a010cf623f60891e4f298ff26b11\nmsg = c97afb5063a9dd0d\nresult = valid\ntag = 383b103ce9054cb74a0431d16da99d8233e94fc2\n\n# tcId = 10\n# short message\nkey = 466c061ddcf3d9b285a2900f8725971b733f850f\nmsg = 89024ceda7de3c114e\nresult = valid\ntag = 1b81f1127635233383b6ea5ba8fd68eb5112ef0a\n\n# tcId = 11\n# short message\nkey = a81f9f51b041ff29b8d705bb408f854ccbd7e5ab\nmsg = 032d866a270762cbae24\nresult = valid\ntag = b72ba0c89d010215a8f280616acbd8640fe86cec\n\n# tcId = 12\n# short message\nkey = e60d0b14886fe6fa2c839329204d84d81026b7ab\nmsg = fda7f48c11101255e02c8d\nresult = valid\ntag = 2be7bb541cede978f541e2cac0ab6451060e3e83\n\n# tcId = 13\n# short message\nkey = c090ef122a29348740ccd571d98407764b2adaac\nmsg = d1fe3dfa80ade7087efabb52\nresult = valid\ntag = e6c1e0c3ebb7750d66a50b6abccfdef9c2599008\n\n# tcId = 14\n# short message\nkey = 564a56290e1aea0522f19088a88ab4dce4c7cdf2\nmsg = 4213bd3cdaebbb1ec1cc81866a\nresult = valid\ntag = 6d1d5808c085ad512487debb57fb93514b205075\n\n# tcId = 15\n# short message\nkey = f898459d272fd5e43b062156f44958d85d97ea3f\nmsg = 5e86b05522eb65a4fb7b932cecd5\nresult = valid\ntag = b778f421c2d1e2701e75da6bd1bc65379b80e879\n\n# tcId = 16\n# short message\nkey = 7d5cc53f464e759438ee90b47f2fe67aa83d6b52\nmsg = 9f38ea80122b40f742a00c2e83e085\nresult = valid\ntag = c80ce6d33fe868432c262766fd23bf431e313882\n\n# tcId = 17\nkey = 33e9140175519b2f1619b44848331763c756fad4\nmsg = 7de0fccc83b51c29e5eb1b658c102438\nresult = valid\ntag = 34de6b8f479523870b8f905684672617669b0607\n\n# tcId = 18\nkey = 0ef29e7c961da37afaea8182f28738d22c340232\nmsg = 165bb8e5c6f0a3ae40946dc807aee84645\nresult = valid\ntag = 78e6fa53ec213e9019d47ee7529d963a8a252942\n\n# tcId = 19\nkey = 203cfad921e605c80d7aa8b64d3bf18328b7a7a0\nmsg = d289c7cd10d996d5daca1410c37815b237f74929588c5ae4\nresult = valid\ntag = 27d96da41895bf53d150ac15e7c31853f56ae363\n\n# tcId = 20\nkey = 8eb7416efd0c73c86b91df0d58891fdb738f40df\nmsg = b415cb7cd384a1035d2bac1f7b96ae858dfd44c467030f304e817d11b9f9c606\nresult = valid\ntag = 24cb16323b7ec47e3add8f55cb9920aa7c1655de\n\n# tcId = 21\n# long message\nkey = 6fbb3c55e935e0a002c170a9122f1f7037bc0c59\nmsg = 36ac9a8cf0223ccf5d9048be9a65df4a1f40aaa857ce13d621f601bdee1fbe803171002d1fa634a1977dc23d9aa8fd\nresult = valid\ntag = e2fe8b343cef4b9754308408930526159537ecc8\n\n# tcId = 22\n# long message\nkey = e40f6206105f7800a1f190602bb6dde8057c3a87\nmsg = 10463b771fa586c5ed5c1f6488d793299db40fdd4f3e53334ae3ff8e09e5a879da06eb46d210ee0af0c8251e6c07aa1d\nresult = valid\ntag = b5dfce5998d2e321800e0e42762e62ec7a81448f\n\n# tcId = 23\n# long message\nkey = f04cc641ff67aba4ac2d17e6a042b6ccf86ae1d2\nmsg = 73c179acc26ffd0710b6cb3f73570702c9c059bf685614bb0ba7973ab875ff882d9aeecea4ef452c8893224472cfa5b61c\nresult = valid\ntag = b7d1e63fae54638082a9cb58c69fac9efcbee174\n\n# tcId = 24\n# long message\nkey = f61c1a878550d27aa459b3016b31731b89630d36\nmsg = 82b378d40ca04ad478a980d7b46e56c9967bc4e110a7add8bcbda411c12de384f41324e9df888d81702ff2b9e8752986ba081363eacc2e396f6b5fb01bf842358f0145d569d34fb3b4e24ee9dc9103284d743c52ea8661504b2db42f221b6d49b605fde34aa555e33ab0a140f61f3cda\nresult = valid\ntag = e688199489c9d3938f2e33d7cb3fc81bad4ffb8c\n\n# tcId = 25\n# long message\nkey = 8c29eb661fb633087f2452d057f98d553d2846f1\nmsg = 021b968c4ce337595154d90e44229980f0e2b64776f562ea25b24881637b44375bde65e5f9418bf163e2aacd37bd10319729ac596615a35cb632e0ffc316936a68acf4c7ae3ad36026124cee6d204f10432f08157cc32c5f4bcadaee67bd42bbeb826a9e9c8af9f554f7419fb265338d22bae2190bb644b32fe9bb6a2287aa\nresult = valid\ntag = f940df33b09965a3118c847c2ae1591690d0405f\n\n# tcId = 26\n# long message\nkey = 6316298f3aadadc664eda2cedf17669bc80d44ae\nmsg = bab807df54c009610a5c3f1e81605f6bf7d76b299d7ebdefa70f5e2e0b979011d191ead39c3bbe5dd2658347eb172950a1e03a01552bb38add33bac832b7177a77b08eb11cc1afe3ae84daffe4c4e88bc441e54e4dcbae3e0d5639f635228d811f0a043b13d5c91899c26bce2da2ddabd21b2ee668a21b454928915d6585408d\nresult = valid\ntag = 23b9a6d6a9c7cef6dce537722f4557b65dcdde99\n\n# tcId = 27\n# long message\nkey = f291696bf4f9655a00c9a2382bd1487342358714\nmsg = 32a650b5307d94b23139be64d470ef1492d57ca7af98205bf9bce8854ba8f5204880b2e9d58ddbe2e7bb21e6e0673f5e1a39f505909227475e41c1d59c73a933b13f4b07a75cb9f3279cc3bf61a6c09e3b9f755907491b9e745bfda58ad4e2304ff7525b41507a51a2fd664a2ee98cea00148a3663d77c47beb055bd45e7df48f6a0ce66c0a2d9a848761a4575d195d74eef5bb78c0993557a25ad7ca32e0a96b2518d9d8a180f357402a44217f1e36a9138c0909faffd0e9a907048584bb03a4e06fc69c463f39542dd2c7c81467d3728481bbf6bb60259604aa33a2d4c6195012fdc7aec99e2175aeb2d0c1f680964d63ee11418cd4d26e77ec131108417\nresult = valid\ntag = 3346bf23e52231a4aed773fd73e58d918580ede5\n\n# tcId = 28\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e8ad50fc1035823661d979e2968968cecd03d9\n\n# tcId = 29\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5641600cedd7e12063deaea0788785f56113520\n\n# tcId = 30\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 04e8ad50fc1035823661d979e2968968cecd03d9\n\n# tcId = 31\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e6641600cedd7e12063deaea0788785f56113520\n\n# tcId = 32\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 86e8ad50fc1035823661d979e2968968cecd03d9\n\n# tcId = 33\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 64641600cedd7e12063deaea0788785f56113520\n\n# tcId = 34\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e9ad50fc1035823661d979e2968968cecd03d9\n\n# tcId = 35\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4651600cedd7e12063deaea0788785f56113520\n\n# tcId = 36\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8add0fc1035823661d979e2968968cecd03d9\n\n# tcId = 37\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641680cedd7e12063deaea0788785f56113520\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fd1035823661d979e2968968cecd03d9\n\n# tcId = 39\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cfdd7e12063deaea0788785f56113520\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fe1035823661d979e2968968cecd03d9\n",
     "\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600ccdd7e12063deaea0788785f56113520\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035023661d979e2968968cecd03d9\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e92063deaea0788785f56113520\n\n# tcId = 44\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823761d979e2968968cecd03d9\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12073deaea0788785f56113520\n\n# tcId = 46\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc103582b661d979e2968968cecd03d9\n\n# tcId = 47\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12863deaea0788785f56113520\n\n# tcId = 48\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823641d979e2968968cecd03d9\n\n# tcId = 49\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12061deaea0788785f56113520\n\n# tcId = 50\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d879e2968968cecd03d9\n\n# tcId = 51\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063debea0788785f56113520\n\n# tcId = 52\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e3968968cecd03d9\n\n# tcId = 53\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0688785f56113520\n\n# tcId = 54\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e0968968cecd03d9\n\n# tcId = 55\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0588785f56113520\n\n# tcId = 56\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d97962968968cecd03d9\n\n# tcId = 57\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea8788785f56113520\n\n# tcId = 58\n# Flipped bit 152 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e2968968cecd03d8\n\n# tcId = 59\n# Flipped bit 152 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0788785f56113521\n\n# tcId = 60\n# Flipped bit 153 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e2968968cecd03db\n\n# tcId = 61\n# Flipped bit 153 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0788785f56113522\n\n# tcId = 62\n# Flipped bit 158 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e2968968cecd0399\n\n# tcId = 63\n# Flipped bit 158 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0788785f56113560\n\n# tcId = 64\n# Flipped bit 159 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823661d979e2968968cecd0359\n\n# tcId = 65\n# Flipped bit 159 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063deaea0788785f561135a0\n\n# tcId = 66\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e8ad50fc1035823761d979e2968968cecd03d9\n\n# tcId = 67\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5641600cedd7e12073deaea0788785f56113520\n\n# tcId = 68\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8add0fc1035023661d979e2968968cecd03d9\n\n# tcId = 69\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641680cedd7e92063deaea0788785f56113520\n\n# tcId = 70\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035023661d979e29689e8cecd03d9\n\n# tcId = 71\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e92063deaea078878df56113520\n\n# tcId = 72\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = f91752af03efca7dc99e26861d6976973132fc26\n\n# tcId = 73\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 1b9be9ff312281edf9c21515f87787a0a9eecadf\n\n# tcId = 74\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 0000000000000000000000000000000000000000\n\n# tcId = 75\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0000000000000000000000000000000000000000\n\n# tcId = 76\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 77\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 78\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 86682dd07c90b502b6e159f9621609e84e4d8359\n\n# tcId = 79\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 64e496804e5dfe9286bd6a6a8708f8dfd691b5a0\n\n# tcId = 80\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e9ac51fd1134833760d878e3978869cfcc02d8\n\n# tcId = 81\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5651701cfdc7f13073cebeb0689795e57103421\n\n[keySize = 160]\n[tagSize = 80]\n\n# tcId = 82\n# empty message\nkey = 5ece0769742feabb6644469c9b264326b3deb126\nmsg = \nresult = valid\ntag = 344f8351f1d2773cae9e\n\n# tcId = 83\n# short message\nkey = 4ee9f9a93b2ddfe551281b397ccef844fc21af3a\nmsg = 2d\nresult = valid\ntag = 3aab1a2c9a2f2b8ac840\n\n# tcId = 84\n# short message\nkey = dfeebe9a5c181afc605ff63b22bf349ebdb6c7fb\nmsg = a5f3\nresult = valid\ntag = c3b7152230dacae4ef48\n\n# tcId = 85\n# short message\nkey = c5147ecd59b7d42315d5e3a55ec8b3a320c8d615\nmsg = 371777\nresult = valid\ntag = 0abb78a2c67c565f89b1\n\n# tcId = 86\n# short message\nkey = db0da5659ba69ce195a69524508e437c688f7147\nmsg = 4ef4ec44\nresult = valid\ntag = 4062faeb0b406698b740\n\n# tcId = 87\n# short message\nkey = 495d6c1191852ecaf0573e6a77610c32acf5a117\nmsg = 1566ae63ce\nresult = valid\ntag = 45cbefcd9c7eeee37ae5\n\n# tcId = 88\n# short message\nkey = e5cfe7dc67514c4c75d28bb805d0700bdea0d669\nmsg = af1a6b15b622\nresult = valid\ntag = e867269d506a37e8a62d\n\n# tcId = 89\n# short message\nkey = cf1b8b902512186e38c38165d6e587bceecae87f\nmsg = a59512152c7221\nresult = valid\ntag = 1a125b21412cdc596894\n\n# tcId = 90\n# short ",
     "message\nkey = d0157fb40c7739ae506aad7de60f32ccc3325583\nmsg = 1292df8d53d16f3c\nresult = valid\ntag = 9224f11bff0e49b9aa95\n\n# tcId = 91\n# short message\nkey = fd55b81edd55a15bff409129e9930f1ba1763c33\nmsg = 05220a6997533c699b\nresult = valid\ntag = 3b2d07dc8ca206ba16c4\n\n# tcId = 92\n# short message\nkey = 079937cf3bd42864d5b15c62bdd92f275597316d\nmsg = 5ac13ce1b1f77724e281\nresult = valid\ntag = 0c24afcdadd8538977b1\n\n# tcId = 93\n# short message\nkey = 545b13e1f39f0b7ca9252bc596277278166ad410\nmsg = 08a7bc90732d54381b6e30\nresult = valid\ntag = 9bf7f121365a82c2ac69\n\n# tcId = 94\n# short message\nkey = 25385e9f89b66098ee8162aeca03bb45b313561f\nmsg = bff236aad71fb5daf7fc43b8\nresult = valid\ntag = 44db86e7a1476226dd86\n\n# tcId = 95\n# short message\nkey = 9b68139d93a88fe34cf9f83006c03b3164b60468\nmsg = ad672b9719c10863fd6fa8db88\nresult = valid\ntag = 2d17a88d87aae7dbaced\n\n# tcId = 96\n# short message\nkey = c3b785915e137544dac542cb4bdb16d53036fb11\nmsg = f8c1edb469b93c073b6f6bf74cca\nresult = valid\ntag = 16713d61fbb4149f500b\n\n# tcId = 97\n# short message\nkey = da67475185b3615055f971819db27871b23c75d0\nmsg = a176533319bee5e43d8f0eafb77bb3\nresult = valid\ntag = fceece892852d4a26070\n\n# tcId = 98\nkey = 0cf146ca7a254db1e001a29ad03c5e6dcbe7140a\nmsg = a83df5d099854eb6ead7031c51460357\nresult = valid\ntag = 9bcf7513206e27a4697d\n\n# tcId = 99\nkey = e038dff028227dc4b4d7453db3070108465dd5b2\nmsg = 7ae4e30834db449e4244a9fc0322193e7a\nresult = valid\ntag = 9aa8544a9afdd920c0f2\n\n# tcId = 100\nkey = b399fcfd1ad32140879aa0556ac34d8b5ac267f2\nmsg = 0e3f0fc5cb1456fede99f86a056f640b8f5e5e1b612f25f6\nresult = valid\ntag = fa095c6faed0f086b215\n\n# tcId = 101\nkey = 2bf7d201ef44241a22ae4b81aab910d22c2db918\nmsg = aa0afaf3af36548227349adcfcb6bf998a7fa78d29b87a0f50609c42edcdb3dd\nresult = valid\ntag = 708ec45d410b1fe075c8\n\n# tcId = 102\n# long message\nkey = 48ccc3907c3612a18294fddf2660e33d9cb787fc\nmsg = edbb680243a825068eefe5ba184e5eed4b7f85ca3b511a42d655be3e05d8ff124541b3d56a10a35cff8da8b6229ac1\nresult = valid\ntag = 3cb7fce20df8385cf6bb\n\n# tcId = 103\n# long message\nkey = 227d796b7867409db3de1ffa3cfe376704044f01\nmsg = b6393ab18376c025e2d8e00ca774a51aec19dc4a89cf6a9f8fc4aba81d73b3907efef1a0d018a53cb8b8ca1032e31583\nresult = valid\ntag = 525387c81c2ab67aca74\n\n# tcId = 104\n# long message\nkey = 5718e700c48a7971350d8a11b37754ae55a9aad2\nmsg = cc95286e9b3ca936191aff8731e6a17806a0958b0b1a39977c46395240641e97d5395a9c8a9d36281eba825a94e8b1ad79\nresult = valid\ntag = e54782110d40efb54343\n\n# tcId = 105\n# long message\nkey = f56aa792795eb03ae0990440714ab16cc4ad18c3\nmsg = 7a024d995addd38d967bc3b41641738b69897d8c52b7aff961a700cb68fa7481da0a3690a151ce09c95b4da60f7cf28990017292893bbb2f81a4dda45fe8639877ac5abaebbe00c1fd179eaaf7dfb4d50929371b9ab8b7d3531a63ab188d7b99160060475c33e83351f65d5e329ee8bf\nresult = valid\ntag = 1e2205d17ad4de3f1ec1\n\n# tcId = 106\n# long message\nkey = 00be0034d32699b1335d8d4e506235ee4f07bef6\nmsg = 639e828d88bf0642be0a541b1c3fca07609eb98d23a8b2cd4e60e139515e4ff440dfda1bc19392feffed74164d6a9d8f5bafe53fd397cb5ee1dcdf9bfc86169f1bc38ba57f88d7e8c6728c35fc07128ab6c396bb3ef3c14d13a05f8c3453353e850dc1b291ac7061ab52f121663f18b024e5cc0068328c88f52c20cd21793a\nresult = valid\ntag = 6e98973d3a775ac508e7\n\n# tcId = 107\n# long message\nkey = c5baa750a8424450f1b4d453c58e29c462e52639\nmsg = 137c7227a192bed26d08da886430f010094243b5c4686e6831e48db450045aa1d7e3aecf193eaaa1a73905f5f1190659a43ed4d10bfca5668ebeb343b21ff71d0737f81f67392b6459aa95f9441f699bf45fee24867a98a8a6c57f972abe3e400fd64ce3e5b48622a0e99e08d424250fa00ed0dfa1193f936c78af276a4b442b\nresult = valid\ntag = 490dfd2d5e6ea130f6a1\n\n# tcId = 108\n# long message\nkey = 6bd486ce934c2f5fe38a19423d257bc5d808e367\nmsg = b8a684ada0a01405614b1fa66ebab8b0356e33b889b81b3eb68d13b05c4e60c724785e634c4ec0081cc6bbdf213db7254f92c0a858bfcc3d63a4e4dfd9e75bd4839ac05751c23cb59945f4c3660d2b3009f5b08a596bdc33070244bceea11180ac0906404518b09d5d8612e0d8e69f4b9e55bbc053b56574711b02956db3f3bd8f6c42065871255854a161e57100adb82cba79893aad715dc3df1488b3edb56e58b89c0be3cfab09a3df40524d2d3251b0fcf7faabfc75f50026795060c1d62872574a769e3da0e19af1b5e25514ae17a160c8d1eb253c9f66ec3df789ec0c6c704a9e2fe8ef7e9bf8e8164f86d09d2a23698733a8e40a279cd5fe02c295ff\nresult = valid\ntag = a594d26d98b53b4063b2\n\n# tcId = 109\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e8ad50fc1035823661\n\n# tcId = 110\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5641600cedd7e12063d\n\n# tcId = 111\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 04e8ad50fc1035823661\n\n# tcId = 112\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e6641600cedd7e12063d\n\n# tcId = 113\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 86e8ad50fc1035823661\n\n# tcId = 114\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 64641600cedd7e12063d\n\n# tcId = 115\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e9ad50fc1035823661\n\n# tcId = 116\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4651600cedd7e12063d\n\n# tcId = 117\n# Flipped bit 16 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ac50fc1035823661\n\n# tcId = 118\n# Flipped bit 16 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641700cedd7e12063d\n\n# tcId = 119\n# Flipped bit 17 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8af50fc1035823661\n\n# tcId = 120\n# Flipped bit 17 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641400cedd7e12063d\n\n# tcId = 121\n# Flipped bit 23 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e82d50fc1035823661\n\n# tcId = 122\n# Flipped bit 23 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4649600cedd7e12063d\n\n# tcId = 123\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8add0fc1035823661\n\n# tcId = 124\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641680cedd7e12063d\n\n# tcId = 125\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fd1035823661\n\n# tcId = 126\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cfdd7e12063d\n\n# tcId = 127\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fe1035823661\n\n# tcId = 128\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600ccdd7e12063d\n\n# tcId = 129\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035023661\n\n# tcId = 130\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e92063d\n\n# tcId = 131\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823761\n\n# tcId = 132\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12073d\n\n# tcId = 133\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc103582b661\n\n# tcId = 134\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12863d\n\n# tcId = 135\n# Flipped bit 72 in tag\nkey = 000102030405060708",
     "090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823660\n\n# tcId = 136\n# Flipped bit 72 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063c\n\n# tcId = 137\n# Flipped bit 73 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823663\n\n# tcId = 138\n# Flipped bit 73 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12063f\n\n# tcId = 139\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823641\n\n# tcId = 140\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12061d\n\n# tcId = 141\n# Flipped bit 78 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc1035823621\n\n# tcId = 142\n# Flipped bit 78 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e12067d\n\n# tcId = 143\n# Flipped bit 79 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8ad50fc10358236e1\n\n# tcId = 144\n# Flipped bit 79 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641600cedd7e1206bd\n\n# tcId = 145\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e8ad50fc1035823761\n\n# tcId = 146\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5641600cedd7e12073d\n\n# tcId = 147\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 06e8add0fc1035023661\n\n# tcId = 148\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e4641680cedd7e92063d\n\n# tcId = 149\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = f91752af03efca7dc99e\n\n# tcId = 150\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 1b9be9ff312281edf9c2\n\n# tcId = 151\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 00000000000000000000\n\n# tcId = 152\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 00000000000000000000\n\n# tcId = 153\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = ffffffffffffffffffff\n\n# tcId = 154\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffff\n\n# tcId = 155\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 86682dd07c90b502b6e1\n\n# tcId = 156\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 64e496804e5dfe9286bd\n\n# tcId = 157\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = \nresult = invalid\ntag = 07e9ac51fd1134833760\n\n# tcId = 158\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = e5651701cfdc7f13073c\n\n[keySize = 80]\n[tagSize = 160]\n\n# tcId = 159\n# short key\nkey = 1d9535a0daea9dfe443a\nmsg = \nresult = valid\ntag = 7436089fede3291c0c421c9ad13c357ec8660bae\n\n# tcId = 160\n# short key\nkey = f5c2c420c6f056467fca\nmsg = bc8a29f52e57581cb89a86e5d644a14d\nresult = valid\ntag = 1eb76df7235c52371d86113f5423628b2eb7c3d5\n\n# tcId = 161\n# short key\nkey = e59b0276e27a0abc75f1\nmsg = 061ca1a1af51c5133728c414f9646b3f50223e9b2055707032e754dc1d31964b\nresult = valid\ntag = 2081260f65316df2956aac723a9bd7d2225a8669\n\n[keySize = 80]\n[tagSize = 80]\n\n# tcId = 162\n# short key\nkey = b18aba1171cc2ffc7d58\nmsg = \nresult = valid\ntag = deeb3d6d81e33d1cad21\n\n# tcId = 163\n# short key\nkey = 23082066e8c45da82fc6\nmsg = 06c19c6ee4d2f015769f6d46eb46d6b4\nresult = valid\ntag = 747cd928e8831917c855\n\n# tcId = 164\n# short key\nkey = a6fa1e04df38a78667eb\nmsg = 51a4ea38e5566d6fd803aec5e073e087e9ae00d37d4a98d559074ebffc7658b7\nresult = valid\ntag = ec8c200c1ddad6d3aad0\n\n[keySize = 520]\n[tagSize = 160]\n\n# tcId = 165\n# long key\nkey = ab92e2cd40e00b40c4442dd7671c067c7792af28e60f2585e87f163bf3bdfca7f553cec71b0065025500c48e2070984ad9e24e733107ebfde27164a4828981ac20\nmsg = \nresult = valid\ntag = 7a29b47ff6ae90c99573d8c922a23e83a62b66bc\n\n# tcId = 166\n# long key\nkey = 3b47a5d5b72babe116e61919600cb980c904c298ab91fae3db9c82b0f38a18888bc05a418d65d68f8850937559bb37325bce04d0e5d175a24fea309895f5705ad7\nmsg = d71862028fcaf13422bf32ac0c5f079b\nresult = valid\ntag = 8019231e77aca645182670cadf887afd4b4115a7\n\n# tcId = 167\n# long key\nkey = 6e6c43df9bb6c6b8fe414a183e738508f0aca41d5beef6df1b260c39e1979b54683622a4d53354231bef6c35e129f85f822ba09198aa30c65ee60e4202de8cd102\nmsg = 98f0a4b9a36e173d89730a3b370777c499b4cff2846f50bfb88fbbbc547cbae4\nresult = valid\ntag = d1653c90fc591e3a3c285a3be8b12ca9b2121e88\n\n[keySize = 520]\n[tagSize = 80]\n\n# tcId = 168\n# long key\nkey = 4f00fd17ae82a6252ada98280bbd895d743fc4c20bc9e615d8a786c79e454c2b1341e24254fa0371fac86e7c0ef1a7df5c16f3b3569fda112cca8685faecbb8923\nmsg = \nresult = valid\ntag = 6802ca52be056d66b9a0\n\n# tcId = 169\n# long key\nkey = d22ec568909990c213679f7072eaf19763508ebde6962c75e7429c5f2454d4b5472811eea8e02fdc89ec386bc6f41d2ad8a91d116b2cbc52b80d357127d1555a66\nmsg = f71b43e0cc64b5409e6501ca55a8d450\nresult = valid\ntag = d492a296860cc5a89c5f\n\n# tcId = 170\n# long key\nkey = bcf6ad6e5c7e2200299ea8602efb42b409292346f78a0e57a789ba17b17ed608e88497e2bb4ebbbb3ce7750d222b3bdf848d4dc8d49b5b60378fb93ce3f66ab4eb\nmsg = 586f5ddbc372c0711b77e4b87d345d62b6de55a1ce6fa18de3346c86be5cec6e\nresult = valid\ntag = 1de9aefcc53130245a6e\n\n",
 };
-static const size_t kLen129 = 35704;
+static const size_t kLen145 = 35704;
 
-static const char *kData129[] = {
+static const char *kData145[] = {
     "# Imported from Wycheproof's hmac_sha224_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HMACSHA224\n# Generator version: 0.8rc21\n\n[keySize = 224]\n[tagSize = 224]\n\n# tcId = 1\n# empty message\nkey = 7eef1e40253350eb9307cc6bd8ab8df434bc2faf7095e45b50ffdd64\nmsg = \nresult = valid\ntag = 45b466021214d19245506900532f5272f44b5ad9b3d829f0f5c2108c\n\n# tcId = 2\n# short message\nkey = 8648ee936c6ebc5ae4bb48c1139a54e3ac5d897beec492dc4d740752\nmsg = 2e\nresult = valid\ntag = 5b72e3208679e63f929e6ee19a257d0555f21484c7caac7c9861be43\n\n# tcId = 3\n# short message\nkey = 2297d78cc45faf9b885b36ac80205cc08e1b730f264f23f4edbbb406\nmsg = 329f\nresult = valid\ntag = 2e7a81c4e29a435d91e95f37fb0a62fbe9a69e061f416c1ad17a7fca\n\n# tcId = 4\n# short message\nkey = 0361a904f7cbd107a617614ab69d11208ee6d423b3ae90e2bb6d7e54\nmsg = e6e765\nresult = valid\ntag = bbfa7ff960931e2f5ed8c925cd74272990e755f31422e5c858995b73\n\n# tcId = 5\n# short message\nkey = 264a8d2128e8fd0972d9acc66dc275b1286beeb0aff7ce8e97c7b96c\nmsg = 25838e50\nresult = valid\ntag = b25c33bba1a91024f42cfb93232ad685d54be2ca310b0ff9ba5107b8\n\n# tcId = 6\n# short message\nkey = 6dde8828f09b7aa981082aa116fca3b7341721c0440803f52cc9732e\nmsg = be81602da7\nresult = valid\ntag = e510fbf14bd7301f751cc0ae89f8725a7654ebbba6bb2f741626471d\n\n# tcId = 7\n# short message\nkey = 3ba156ffdc55d155bd085105aca64d13044db60c82cf2cd9d61d098f\nmsg = 69c76c8937a0\nresult = valid\ntag = a9d38740245038d9c23cbb59ba6513f7034d8047a07a904a2a23d2fc\n\n# tcId = 8\n# short message\nkey = 9c2739bae2a863fb0236466ba3408f4eec8d43206d56bb7aa2f8f75e\nmsg = aaf4c9146db948\nresult = valid\ntag = 2110393c6ba01f53be203533fbc5471fc8f04940fe912411564ba36e\n\n# tcId = 9\n# short message\nkey = 31d9cae2c3df064018209b121f9e883976ea757942ecda9d92fdadfd\nmsg = b844289529206f5a\nresult = valid\ntag = 1f1ddb8680b0d99893c498a772a7bea63c2e08c0257a7f31e3db2b88\n\n# tcId = 10\n# short message\nkey = 89a1b9e9004444c1d4e967570c21a05512d3f618ec168fc3e13ea5a2\nmsg = 6b42eb6d84e90c70c2\nresult = valid\ntag = 3b6f3b09e03424c8adc267fccefaf614db6d74977754fcad8a8d1a9b\n\n# tcId = 11\n# short message\nkey = 4398731752fd7af1db86ebccbee0ad65eb5faf00ace6c9aa35441faa\nmsg = 1ae2e7d917c48026570d\nresult = valid\ntag = 5f1948336953337c381d449c17ab5c327c86121a8b1e0db19f624e3f\n\n# tcId = 12\n# short message\nkey = 339460d6bb26ca60ebcef10c38587b9e575c398491782ccf9e8f6803\nmsg = ca03eb4f37536b2377738e\nresult = valid\ntag = 51c5661c31fc7edd09de60c91957036824a19761bcc54f1e93c43c3c\n\n# tcId = 13\n# short message\nkey = 025f8380d10b8207b3623e4a90f79c3e753b1be6a35b88b68330a40c\nmsg = e57daef9ede4e915c3a9eece\nresult = valid\ntag = 8afdb371714e9d6063ec9e43c8cd55e1c032b2fda57f91e9ec0f6601\n\n# tcId = 14\n# short message\nkey = 0bdc5f51f8a1a35d75554be70efbcdf51e54f30fa4696f727431941f\nmsg = cc3dd1eb0690f7af09ad408f9c\nresult = valid\ntag = c0918951c3422b48502635b6e58c5dcee9fea51c9dce5c7c215c9b93\n\n# tcId = 15\n# short message\nkey = 5ada97d90a74a7d4a68c5464fff25a9b7fa2e75d6acf0a59f143a2e9\nmsg = 3fe4ede158af108e09f543e14ab7\nresult = valid\ntag = 180a6b8814ae34228ae9ac76da8379376aae6f1aa0102e8f06b022dc\n\n# tcId = 16\n# short message\nkey = 007afe6b7c0701c30cb76b431afa3510c8b31d21cfe0bbaa5289cd08\nmsg = c2cf80005c591c1f737369fcc212f0\nresult = valid\ntag = fbfdb450a42f9a4154146f73c590a0ee9187af8505d60790a9615447\n\n# tcId = 17\nkey = 26491168a32ce8cbc4c0cd64107e4fcc432f07d59c992862e1e55b1e\nmsg = 15e51091b4f424ba1fdecb5e2fba11f6\nresult = valid\ntag = 3fa99ee160328fddc47a7c5043e9ef645b8b07462b71cad58a024517\n\n# tcId = 18\nkey = 6978b6c134dd6949832d65e4cb9c1e1dc36beae4a134907c80da0f44\nmsg = 6641d834b3fbfdb5d178007801f7b4e7b1\nresult = valid\ntag = 61387230446f31fde8552f22ec52a7fef82e16d0ad399de939d8229b\n\n# tcId = 19\nkey = 9f9fb280adf12e739548b1d676cb794d685b9104e63b619b055cb60f\nmsg = 91513dd6de40a1c23f8d1eb0ab8f5ea6f6835506ec750894\nresult = valid\ntag = e6b92f9c030270897c5d27162a5d40f6d373ff136105d1a90e0f9a60\n\n# tcId = 20\nkey = 3b1b16e6dd2e69559dbeb964e10fc94c068471b2374d3a2d24d2d466\nmsg = 8ecd55b56c668dcb8e8b1efd699c0e4a464204d29af140f87d3f5075495378a3\nresult = valid\ntag = 175856b8f56a8c6fbebc36541771545046bb416254f01ff11a218d2e\n\n# tcId = 21\n# long message\nkey = fc296398845063e661bdf36ff3615926eaccbf06947cd31e6677f710\nmsg = 62bd0ad75d64c554cb2cc109c6e4019fc601c61cabdf99f8de871edc17a301b4c1f55a15ed66f91eb4666dd08bc59c\nresult = valid\ntag = b7cf741cf96d6bf57d216c43611c20869ca0d008a4542f5c850605bc\n\n# tcId = 22\n# long message\nkey = 6c98d1feafff9861351966bc6ed19ed467f9dc767fa0df6b56955554\nmsg = e99d51a1d9a25c5842501a5383133578c8debe501581b1610f7575519bbd26f01ab7cbe069bfd5df3699a2fea5b461a3\nresult = valid\ntag = 0fe64fdd912966a6542069a22bfd084b484c015cf434d86bca15cdb6\n\n# tcId = 23\n# long message\nkey = 42a164f94e33d574118e0f8c938bbc2874bab219ee7a179f21e13b02\nmsg = e895639631f8b5d48e3ce00eb310bf129976ffced96a6f30a09d6ac1c291f73e93690526d86cc4d1a8e21c11f5a8979308\nresult = valid\ntag = 1ea982226e8d4cb7b07922158e535af2233b4c4d39d26b062d6d2aae\n\n# tcId = 24\n# long message\nkey = c1b5b91210667e72aa510346e1811358815a3330c5ed27a695c39451\nmsg = bf1086c3ea8b8840418c690c92152c73a6730bd1a0210c8b1d25c43a2193e739684f04a25a52cc305599f22ba6f70c8ed00d10b914a9522a25e06c471ebca2ff1bb4fa6799b85122020978dfa66ef12ed26ad38331b26eaf591afceac96d8c771eae50fb7f46242337dd0029f4813b53\nresult = valid\ntag = 4f355edbe6a3c93fa7add384be899bb4fb55385a78812a26cb64e44f\n\n# tcId = 25\n# long message\nkey = 4f09d14d40e475b68288c080668ebb1bc8c6be3191f6664d91a23fcd\nmsg = ae8b6ecc219b368d22fb596e42652d0bffee0b20d69cfd089ce3dc9303ba2f054ccaf5f5147c7968a028b140f5e3c9274eae2afc61c3bb6298dc598df77dec1cd2dd84212693b082b8132ad0f0b19f66db69fa7f6bf352b4feac724ce048440d2a42b44d53bb62fe2ab25f7f54bedf9ce7ddafd8e09330dacc6d52ee9b65f5\nresult = valid\ntag = 29ba268103019e158a35614c80780fda3f5ec3fc32c80aaa27b4025d\n\n# tcId = 26\n# long message\nkey = 613f414cd94130bb8a6243e12eccd90836808428b4a7177867934da0\nmsg = f696b9063b64816a45064f48ca05ffe4d5cc3d0b3beb0dd4057b6ada994969bf039bfbb72ce197101cc4e4b3959b3702f045afb7fb3113c997606dcaf2aaab31e02ac6ee597dfc0f9143d0effedc9ae7ea10e7ddb1db860a91afec62c48ed9c0a6c10b4da1de748caf7f7a5e01799ac57090daf4e3352fe859c5131c205d262d\nresult = valid\ntag = 8129e2093070168a20899793a04447a7ef01ae723419256a8cb42f6d\n\n# tcId = 27\n# long message\nkey = 5b88275307aaf691a0cf0c51f50553dda972d14f8afff98e62c2d972\nmsg = 57e4efbde1ce9fee2e29db19dfc6ba3bcb17f33765af7f20133bbd1910d542145c7def187a304517b8d8954454a90a717f67f9c8cc587965fd9b43f41ecc50b3458d8ce9f66b475f1eaef4a29ba89a3d58e5011c92acd1536fcd18abec29411b389b64f7f344777ed6deae32127abaa69a50ba22a11d6e59354f2ff0e3c3e3293cdc335411cf55b180bab59da36903a6fba91df34d2aadf7017ff49a4fbd73c9c74469f225dafc0a0c7048c2b824cc0cba8cad8aced11b8cdac3243cdb5b654f7a15ce2014e92ee287d06904d778512a1b1f5ec0c9b090b9ab439c44266b6be3d6a98947d26d079e4f7e849f3c6d93de98624e6c5f53ec02dbd368bc24a300\nresult = valid\ntag = 657dd04b970219edd63abf9d4aa108474aa316b6bb66bca76ed806c6\n\n# tcId = 28\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6f99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 29\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 30\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6c99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 31\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0f216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 32\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ee99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 33\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 8d216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 34\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = inva",
     "lid\ntag = 6e98e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 35\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d206faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 36\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e8e2e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 37\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216f2edf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e432e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 39\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faede3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e732e8936d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedd3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8136d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf30534d51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 44\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936c78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd50fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 46\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e893ed78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 47\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cdd1fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 48\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d58b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 49\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51dcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 50\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b4f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 51\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcae417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 52\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02809b130ab09806b2af02f7cb9d39d12\n\n# tcId = 53\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417322c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 54\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02b09b130ab09806b2af02f7cb9d39d12\n\n# tcId = 55\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417022c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 56\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f0a909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 57\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf41f222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 58\n# Flipped bit 216 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d13\n\n# tcId = 59\n# Flipped bit 216 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d88b\n\n# tcId = 60\n# Flipped bit 217 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d10\n\n# tcId = 61\n# Flipped bit 217 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d888\n\n# tcId = 62\n# Flipped bit 222 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d52\n\n# tcId = 63\n# Flipped bit 222 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d8ca\n\n# tcId = 64\n# Flipped bit 223 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02909b130ab09806b2af02f7cb9d39d92\n\n# tcId = 65\n# Flipped bit 223 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417222c8f144abd5f2f7fa00ab4667d80a\n\n# tcId = 66\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6f99e862e532e8936c78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 67\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c216faedf3053cd50fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 68\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e8e2e532e8136d78b5f02909b130ab09806b2af02f7cb9d39d12\n\n# tcId = 69\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216f2edf30534d51fcaf417222c8f144abd5f2f7fa00ab4667d88a\n\n# tcId = 70\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8136d78b5f02909b1b0ab09806b2af02f7cb9d39d12\n\n# tcId = 71\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf30534d51fcaf417222c87144abd5f2f7fa00ab4667d88a\n\n# tcId = 72\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 9166179d1acd176c92874a0fd6f64ecf54f67f94d50fd083462c62ed\n\n# tcId = 73\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f2de905120cfac32ae0350be8ddd370ebb542a0d0805ff54b9982775\n\n# tcId = 74\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag =",
     " 00000000000000000000000000000000000000000000000000000000\n\n# tcId = 75\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 00000000000000000000000000000000000000000000000000000000\n\n# tcId = 76\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 77\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 78\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ee1968e265b26813edf83570a98931b02b8900ebaa70affc39531d92\n\n# tcId = 79\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 8da1ef2e5fb0d34dd17c2fc1f2a24871c42b5572777a802bc6e7580a\n\n# tcId = 80\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6f98e963e433e9926c79b4f12808b031aa08816a2bf12e7db8d29c13\n\n# tcId = 81\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c206eafde3152cc50fdae407323c9f045aad4f3f6fb01aa4766d98b\n\n[keySize = 224]\n[tagSize = 112]\n\n# tcId = 82\n# empty message\nkey = 26f314170b054daef5349804da18f969c94174baca2beeb009d47a23\nmsg = \nresult = valid\ntag = 816d7af2475e94713f2dc3aa3069\n\n# tcId = 83\n# short message\nkey = 17429a622dc18d38715b31f8f2b963108e952a6708f3e52d5b25848a\nmsg = da\nresult = valid\ntag = 26630777d85f777187630bb94674\n\n# tcId = 84\n# short message\nkey = 0acfe12d89acd7d9ca49bae6318f35b2fbbfc84e5d2c9d4954beded7\nmsg = 03a8\nresult = valid\ntag = aa4c4bb63cad66ac675150f718b2\n\n# tcId = 85\n# short message\nkey = 5a0680f112354bd467865b19ae956b2719e21ecee1a913bdca294339\nmsg = a0fb73\nresult = valid\ntag = 36c7cd3f290d1d7d332b951aa471\n\n# tcId = 86\n# short message\nkey = 46fa59aa524fe30a0f4e39561b5666854440dbd970bb59925ce0ae1a\nmsg = c8b2f557\nresult = valid\ntag = c1a8a7d43df34d917f0cb512c57d\n\n# tcId = 87\n# short message\nkey = 29efc5ab5d30e535357603f2711b6e0aa6cf4613546c23144436d213\nmsg = c8d9f5b373\nresult = valid\ntag = a8cc7bebef4cfcd5ac2f401a372d\n\n# tcId = 88\n# short message\nkey = fe60e0322035538f2b1de9de380cde35f291deeb6e027b5d829ecd1e\nmsg = 185e4cada4f4\nresult = valid\ntag = 32faa154396b0b62436e6bf937ee\n\n# tcId = 89\n# short message\nkey = 1bf7fcdf3742fa77991528cc1c678b98be9876a8c8c5b809beab7d9c\nmsg = 9c0f34a5654279\nresult = valid\ntag = 086170c46d2b0a76c61527c2d052\n\n# tcId = 90\n# short message\nkey = 32533c16f792ed0acf8e9e60f54aa173937c7194b882ecc3e671009f\nmsg = f968dc7a19afe339\nresult = valid\ntag = 3fb4eb4450ac4b26a714bcfb224c\n\n# tcId = 91\n# short message\nkey = 3cf28a476ce7eaecfc3fbf1b0859a042a568740a584c77cb8f9603ac\nmsg = dbca9e4bdd84b38934\nresult = valid\ntag = 2cf14eb8f4c7537e9831983bb5af\n\n# tcId = 92\n# short message\nkey = a2a8090aef69277f92830ec7404c032f8fdebfbceabb9e590968a77f\nmsg = 6b790a946a83364c79d7\nresult = valid\ntag = d467209f63a9bd3d2c5398c305da\n\n# tcId = 93\n# short message\nkey = 6f999929e91672bac35ea70f8ff8b9aeefa5489493c99b0d27797207\nmsg = b7dabb237aeae2be8b5e19\nresult = valid\ntag = 09b2bb6eaeda5f0229b8c35a2f54\n\n# tcId = 94\n# short message\nkey = 4525b96c263e4d2dab2890aa55f3cc503dc1206d9f1915a6fba5ae61\nmsg = ef858f496fcb7c3fabbfb52e\nresult = valid\ntag = 6f5ca7efcb9a70d0abf8425f42ca\n\n# tcId = 95\n# short message\nkey = f89401acb0a60d07fd733ed563f2ee241f4ecfea8114587a44dfdb0c\nmsg = 7d3c0918085984df95097afa81\nresult = valid\ntag = fc227f29b51f9c855343dcd0ea11\n\n# tcId = 96\n# short message\nkey = 58bce8c0d17fc7131d2fa2262409bb14663a6e68019f88299987893e\nmsg = 1ca50cd6c3f1225eb6c4ec4d6a90\nresult = valid\ntag = 53e103bbded7b825affa240f8578\n\n# tcId = 97\n# short message\nkey = 658e510fba4e2208afac98333f9e242bc118f6e79ef0661d619dd32b\nmsg = 32c385b75ae84558ca302881c51639\nresult = valid\ntag = 485f351e2a9a82910c3c949e32b8\n\n# tcId = 98\nkey = 6a41cc3ca7142ae14e6d979a3f890a331597e592dd74520ce4ea660f\nmsg = 78e3a770a8aaaf039fd4c9b6a1780411\nresult = valid\ntag = 331a58ed96fc8b9e684ab05f636c\n\n# tcId = 99\nkey = b8972b93b68302cbaa08d32904eae6375a66f3508ece3c9b22382c7e\nmsg = 3687e6287d73c9e3f679a50e7671247127\nresult = valid\ntag = 27d8113955026d4d318070fbfd8f\n\n# tcId = 100\nkey = bc570932abfa11050ad4fc80a6d5afe3271d86aa29dc62738b207d14\nmsg = d53202acd2ec74d746531bd9ad3016d0980e0166fb427a08\nresult = valid\ntag = 020e3e0c2940ce15eeb67392570f\n\n# tcId = 101\nkey = c92a0665c12e87026e1b344f971fdb0e474d450cba834aae40e2d21e\nmsg = 4a3a85ac09f5190ab94f73fd91d98f056015263c89ed5da223fc4675cab25cdd\nresult = valid\ntag = 922853f159c42b9e274fcef7bdf3\n\n# tcId = 102\n# long message\nkey = 6fbef67cfbacc98c63252b1ca009a60e8e3479769a2d449fb4639064\nmsg = 006e179eacfa9e1e628bb7823ee9609ae7968b6df90e176f772a79088d37e9b15cab312922aaf8fc6583a341002bda\nresult = valid\ntag = 0a27a12afbb9c3136202e02ae3b2\n\n# tcId = 103\n# long message\nkey = 700b09908174f1072e31ae8ccbda1c4460fcf21fdf146a11482b210d\nmsg = f772564ecb109e80eefb1d5a7f1c95e203ba4c980233dd8d13de3046079a6b2ca26dc3521e5e0c807eae7a79877c73e9\nresult = valid\ntag = 04c718a4cd8b583d5ffb8170276c\n\n# tcId = 104\n# long message\nkey = e18a20246ebe1b5796dbfe35110efc7637d74a355f0a6758d4a00b7d\nmsg = 77720dde530e6eeaa0e9af3311f7e99189d6c4f7d71d0a4207d62c766bee32020c92f5d5d28d5de4d0d9c94b57ec05f0c3\nresult = valid\ntag = 25ebc8611f4b636d892f11df2b29\n\n# tcId = 105\n# long message\nkey = 3c4585a775bec76c7d8b27b87e70a5863a85e6111f3161b3815f59b4\nmsg = 628c0ff8c432d74f4cfb77ba46b7cef67a48ac053cf0c18be41648736abcc8c6fbe4981529babd4b27866e34ced16d8b0bec456e14653a1422f5a62556d20b0fe4e03749d5f6e986375062dbdd82f6e9e1d4ad547c31530c2a31383c25ff57e879eae99d9b3a0da1f3c1dacb975067ac\nresult = valid\ntag = deb94b2d43e98926af51fc0c88dc\n\n# tcId = 106\n# long message\nkey = acaf94cb1a8ff4677fc586d2bdf981ac3a656b208215e0a7647b420f\nmsg = 314c2c25465de3427279dbc89436505fee6d37d56fbda0e5e2a49449d9dbf003027f2e4ef5c52f7af93fd80155a66a1cd6b9885b56d828058a0de7d247e19580b2e8dcbdef2ae46840565fd8b276569c19d7e185116ea11ad67d5fc27f4a6816ba45be5d14f3ba4315c74d1edb20f217b116be852b62a7f4e32b3e708ff9f7\nresult = valid\ntag = 5b0d7aec7fbd196ee69ed373e131\n\n# tcId = 107\n# long message\nkey = e490348ad78fd2cd5b51f2795b79e5805ce1d9baf1151dbdf995e1b0\nmsg = f6ff1845842b9e46f79adb1079aff47397391dc269bc0c899ba4087b58a676f5408c3f7637ffc4772af3e41b5cea51058bc528ea09bb4bd797594c798b0f0ff881695e98c08bbb040c12c5cbdb228d61cc99e332e963128d06e97ed2eefded2e1b5a035f3bea68273efac03a894dcf2fcc79a5696218595404b2758deb9a80ee\nresult = valid\ntag = 590727f344d8a540e5c5e0f4dae9\n\n# tcId = 108\n# long message\nkey = c8e099dbb60a8f19d8b86856b21c55f3437ae27f77dff9808f12a1b5\nmsg = edbc109bf28c8ab32b1238eff1cd14308cdd845fa919bfd8a00c991cf9a8d6b05dd8cc7d2393782949c899de79e771ef7d8567f32287623963048e6c80d91f0778dd63311106e9d0913c08b7a0b7253fa3ce307ac40ec55a4c445f5455a570fec090e251e8646bada1a486d41c3794bce5639732f2c6cfd58081c479a68c515f5d47bc5b2f1622a08d38a596a817f3d4efef8003ae430e6ae93b0a3ae8fa95a2ace3d24d90a9ef861dc04c13e38f6e524b3abdf9cce4fa490707c80c16e254b7a71af00a12dbf473b50b9fe4097ec00ab27e66b6f3022b0f101ee1a9f7fa8652e9f095ca240a446067446867f78e8352c4110794c2e3383dfedfb35e74a33e\nresult = valid\ntag = 33e7dcb0fde3b1c5b92506e635eb\n\n# tcId = 109\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6f99e862e532e8936d78b5f02909\n\n# tcId = 110\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c216faedf3053cd51fcaf417222\n\n# tcId = 111\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6c99e862e532e8936d78b5f02909\n\n# tcId = 112\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0f216faedf3053cd51fcaf417222\n\n# tcId = 113\n# Flipped bit 7 in tag\nkey = 000102030405060708",
     "090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ee99e862e532e8936d78b5f02909\n\n# tcId = 114\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 8d216faedf3053cd51fcaf417222\n\n# tcId = 115\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e98e862e532e8936d78b5f02909\n\n# tcId = 116\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d206faedf3053cd51fcaf417222\n\n# tcId = 117\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e8e2e532e8936d78b5f02909\n\n# tcId = 118\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216f2edf3053cd51fcaf417222\n\n# tcId = 119\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e432e8936d78b5f02909\n\n# tcId = 120\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faede3053cd51fcaf417222\n\n# tcId = 121\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e732e8936d78b5f02909\n\n# tcId = 122\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedd3053cd51fcaf417222\n\n# tcId = 123\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8136d78b5f02909\n\n# tcId = 124\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf30534d51fcaf417222\n\n# tcId = 125\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936c78b5f02909\n\n# tcId = 126\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd50fcaf417222\n\n# tcId = 127\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e893ed78b5f02909\n\n# tcId = 128\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cdd1fcaf417222\n\n# tcId = 129\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d58b5f02909\n\n# tcId = 130\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51dcaf417222\n\n# tcId = 131\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b4f02909\n\n# tcId = 132\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcae417222\n\n# tcId = 133\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02809\n\n# tcId = 134\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417322\n\n# tcId = 135\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02b09\n\n# tcId = 136\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417022\n\n# tcId = 137\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f0a909\n\n# tcId = 138\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf41f222\n\n# tcId = 139\n# Flipped bit 104 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02908\n\n# tcId = 140\n# Flipped bit 104 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417223\n\n# tcId = 141\n# Flipped bit 105 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f0290b\n\n# tcId = 142\n# Flipped bit 105 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417220\n\n# tcId = 143\n# Flipped bit 110 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02949\n\n# tcId = 144\n# Flipped bit 110 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf417262\n\n# tcId = 145\n# Flipped bit 111 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e862e532e8936d78b5f02989\n\n# tcId = 146\n# Flipped bit 111 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216faedf3053cd51fcaf4172a2\n\n# tcId = 147\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6f99e862e532e8936c78b5f02909\n\n# tcId = 148\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c216faedf3053cd50fcaf417222\n\n# tcId = 149\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 6e99e8e2e532e8136d78b5f02909\n\n# tcId = 150\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0d216f2edf30534d51fcaf417222\n\n# tcId = 151\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 9166179d1acd176c92874a0fd6f6\n\n# tcId = 152\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = f2de905120cfac32ae0350be8ddd\n\n# tcId = 153\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = 0000000000000000000000000000\n\n# tcId = 154\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0000000000000000000000000000\n\n# tcId = 155\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffff\n\n# tcId = 156\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffff\n\n# tcId = 157\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = invalid\ntag = ee1968e265b26813edf83570a989\n\n# tcId = 158\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 8da1ef2e5fb0d34dd17c2fc1f2a2\n\n# tcId = 159\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = \nresult = inva",
     "lid\ntag = 6f98e963e433e9926c79b4f12808\n\n# tcId = 160\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0c206eafde3152cc50fdae407323\n\n[keySize = 112]\n[tagSize = 224]\n\n# tcId = 161\n# short key\nkey = 77b0de54e893642caeac34bfd1ab\nmsg = \nresult = valid\ntag = 2014a9f272378fa1c9f6744d4db4861b52e61a19eb28320ebee2d174\n\n# tcId = 162\n# short key\nkey = 7346c7e4b118b24e51f4512f906a\nmsg = 506d4faf624f92965aa6b5c01e0c80a8\nresult = valid\ntag = c4e0ad2f62279898a7ede0f709a1ccb8c1004941f3c5074392e79533\n\n# tcId = 163\n# short key\nkey = caa864179f66e826a0ef3b5edbe3\nmsg = 73f64253706ce6b5094c24ee012ece9ac2495283dcd8c7f1114e81e4587d8ea4\nresult = valid\ntag = a1220745bb03d982763bfa7ce352b8bc87576a0ad5d46a0da08ff2d6\n\n[keySize = 112]\n[tagSize = 112]\n\n# tcId = 164\n# short key\nkey = 663a97d6b5493dbfa60c8dd087ed\nmsg = \nresult = valid\ntag = 0c6e21a85e3cd2cd413f36507d6e\n\n# tcId = 165\n# short key\nkey = b08c345a7c7166fdd33ce768c1dc\nmsg = 9964d80ee2338cffe28483aa446a6f76\nresult = valid\ntag = aa003015309f2ed6fd7752e49c31\n\n# tcId = 166\n# short key\nkey = fc9d2883c67534fefbd6ed4a9798\nmsg = a49820c194a43deef11f3a0f4eaa80425439fca9d9f1d7c8e665d6b130e4e908\nresult = valid\ntag = 1c2b96623c91ca9c5027f8f81ede\n\n[keySize = 520]\n[tagSize = 224]\n\n# tcId = 167\n# long key\nkey = cfa639656cd49f8d70f0b1a5a056ab4fc0aeeebc91338d067f36c47b6012dc8d856b8abcc4e1abffc910aeaee21b4d366e907488ffd0ca55b36a621aee0b2e9f0c\nmsg = \nresult = valid\ntag = 0ef4fedaeaab4ad52c843657047b19788a9fa91061b7a14adda8c490\n\n# tcId = 168\n# long key\nkey = b36d3d47a4585b401fc64c98eff56243d4da78863063d814e88f370b92576406d447fcf3d129a1ede57ddc56ea3a0a1f100105a95e83138cdf45ecf2a5992acf90\nmsg = 15c75a64b04d097af2371af380079eb8\nresult = valid\ntag = 4ecb2daa5fb08dbd836e92a51e200bb230f54ac2c9778f5226b3abc9\n\n# tcId = 169\n# long key\nkey = cf78b991382db5e8666ccb2333fb672179b10a75cf9e5a7699ae640005e19772ef6499a3bc97f12e58e835bb0017bb3b2e64c6ab44a0d619dfa0363484d1c991e2\nmsg = f661e598f180f25dc6dd76db8a9e0e4c9c272b9665a6b1756560c723b8e08595\nresult = valid\ntag = cd55cdb0c4f02b9f6148392993b18b4ff00a5e73b6f3fbf83a854aeb\n\n[keySize = 520]\n[tagSize = 112]\n\n# tcId = 170\n# long key\nkey = 3772ff6bb4e5b2811cfd4d6a3d34dc74bca3dbf89a5817b79d8472a1383b8c9afb27b3006196ce9966829eae6a313c2d724d995f4def17117c09edcfc8c0cbbc93\nmsg = \nresult = valid\ntag = 40beb1d3aaab25a403224e577770\n\n# tcId = 171\n# long key\nkey = 2ba910bc0bca90644cb21e96063e2cd85f5dd02fda75d353c9b51eaf45eee94c165ca6592d6cfdd987bfdc1cba66363d535a14b2f7ead841b17c4d76a5049105f9\nmsg = 7ba461040de9ea3cefd4809124f78b39\nresult = valid\ntag = 4d28a926df1b188e85d092bacf11\n\n# tcId = 172\n# long key\nkey = 7fcf3cb1b1c5b537492aede4689284b5881935e3537bb7307198d6518e7a6aabf70b50b44e4a8dfee35e9f5cbada7447e511a37209390fcd171c62075c6a8bf1eb\nmsg = 83d29c1c4d059ddb0d2aca787e5b701bac3953fb9bc72dc87b1ef92a582e9748\nresult = valid\ntag = 392ce38f7838b2f87163eea00b86\n\n",
 };
-static const size_t kLen130 = 38438;
+static const size_t kLen146 = 38438;
 
-static const char *kData130[] = {
+static const char *kData146[] = {
     "# Imported from Wycheproof's hmac_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HMACSHA256\n# Generator version: 0.8rc21\n\n[keySize = 256]\n[tagSize = 256]\n\n# tcId = 1\n# empty message\nkey = 1e225cafb90339bba1b24076d4206c3e79c355805d851682bc818baa4f5a7779\nmsg = \nresult = valid\ntag = b175b57d89ea6cb606fb3363f2538abd73a4c00b4a1386905bac809004cf1933\n\n# tcId = 2\n# short message\nkey = 8159fd15133cd964c9a6964c94f0ea269a806fd9f43f0da58b6cd1b33d189b2a\nmsg = 77\nresult = valid\ntag = dfc5105d5eecf7ae7b8b8de3930e7659e84c4172f2555142f1e568fc1872ad93\n\n# tcId = 3\n# short message\nkey = 85a7cbaae825bb82c9b6f6c5c2af5ac03d1f6daa63d2a93c189948ec41b9ded9\nmsg = a59b\nresult = valid\ntag = 0fe2f13bba2198f6dda1a084be928e304e9cb16a56bc0b7b939a073280244373\n\n# tcId = 4\n# short message\nkey = 48f3029334e55cfbd574ccc765fb2c3685aab1f4837d23370874a3e634c3a76d\nmsg = c7b8b2\nresult = valid\ntag = 6c13f79bb2d5b6f9a315fe8fd6cbb5cb817a660687009deccd88c377429e596d\n\n# tcId = 5\n# short message\nkey = de8b5b5b2f09645be47ecb6407a4e1d9c6b33ae3c2d22517d3357da0357a3139\nmsg = cc021d65\nresult = valid\ntag = e87538eb167e62d7cb236690ff3f034a9c12d417aa8dfa694d7405f9e1f85fe8\n\n# tcId = 6\n# short message\nkey = b7938910f518f13205ca1492c669001a14ff913c8ab4a0dc3564e7418e91297c\nmsg = a4a6ef6ebd\nresult = valid\ntag = 01a93f4ed216d0b280896301e366aa67b25e6b6a5a6e84f291a13391c6e496c5\n\n# tcId = 7\n# short message\nkey = 1bb997ff4de8a5a391de5c08a33bc2c7c2891e47ad5b9c63110192f78b98fe78\nmsg = 667e015df7fc\nresult = valid\ntag = 06b5d8c5392323a802bc5cdd0b3c527454a873d9651c368836eaa4ad982ba546\n\n# tcId = 8\n# short message\nkey = 32fdeda39f98b4f4426c2d2ac00ab5dd4bfabb68f311447256ed6d3d3a51b154\nmsg = 4163a9f77e41f5\nresult = valid\ntag = 1b0103729f48c2772bb132aef9ebd6dd6aafc9145df6d5c514b233ee92ef4a00\n\n# tcId = 9\n# short message\nkey = 233e4fdee70bcc20235b6977ddfc05b0df66f5635d827c66e5a63cdb16a24938\nmsg = fdb2ee4b6d1a0ac2\nresult = valid\ntag = 120b26ee1355c134c262513c7922deb6c4fd90303de4cd61b9f9cd08f22d6e18\n\n# tcId = 10\n# short message\nkey = b984c6734e0bd12b1737b2fc7a1b3803b4dfec402140a57b9eccc35414ae661b\nmsg = dea584d0e2a14ad5fd\nresult = valid\ntag = 88bc2282e5fce47ec6d9895395cd47fff91a0cdc589a8fd56d8d344616533a3d\n\n# tcId = 11\n# short message\nkey = d0caf1456ac5e255fa6afd61a79dc8c716f5358a298a508271363fe1ff983561\nmsg = 18261dc806913c534666\nresult = valid\ntag = f678f081d83cf126ad6bd52c2dffd786214f519c47452b85a97458d0c10c3ee5\n\n# tcId = 12\n# short message\nkey = 835bc8241ed817735ec9d3d0e2df4c173ee4dded4a8ef0c04a96c48f11820463\nmsg = 26f8083e944bacf04e9a4d\nresult = valid\ntag = e0e46cd7d1a75b3d102893da64def46e455308761f1d908786628ca7ee22a0eb\n\n# tcId = 13\n# short message\nkey = 055f95c9461b0809575eccdfa5cdd06275f25d30915c4eb8db40e1acd3ab7591\nmsg = bfb7d6a08dbaa5225f320887\nresult = valid\ntag = e76d5c8c070a6b3c4824e9f342dc3056e63819509e1def98b585aeba0d638a00\n\n# tcId = 14\n# short message\nkey = e40f7a3eb88ddec4c6347ea4d67610756c82c8ebcc237629bf873ccabc32984a\nmsg = 7fe43febc78474649e45bf99b2\nresult = valid\ntag = aa57d020aa24ad823472c2b80ff2d0cf475f7de0068f9a59e8112fede53a3581\n\n# tcId = 15\n# short message\nkey = b020ad1de1c141f7ec615ee5701521773f9b232e4d06376c382894ce51a61f48\nmsg = 81c7581a194b5e71b41146a582c1\nresult = valid\ntag = f45c72603cc160c0762f703407844a7781dfe0f1ddf0aaf4ccd8205e94469aed\n\n# tcId = 16\n# short message\nkey = 9f3fd61a105202648ecff6074c95e502c1c51acd32ec538a5cce89ef841f7989\nmsg = 2a76f2acdace42e3b779724946912c\nresult = valid\ntag = 0226ee13cc05e2340135b3f4b27a9da1a160f6170fe805dadd98a3711ec9c421\n\n# tcId = 17\nkey = 6fa353868c82e5deeedac7f09471a61bf749ab5498239e947e012eee3c82d7c4\nmsg = aeed3e4d4cb9bbb60d482e98c126c0f5\nresult = valid\ntag = 9ed7f0e73812a27a87a3808ee0c89a6456499e835974ba57c5aab2a0d8c69e93\n\n# tcId = 18\nkey = 5300489494ca86221c91d6d953952ae1a5e097139dc9cf1179c2f56433753824\nmsg = 90fea6cf2bd811b449f333ee9233e57697\nresult = valid\ntag = 5b692cba13b54fffc3adcbb0e015cc011fbfd61235303ff0ad2a49775083bf22\n\n# tcId = 19\nkey = 383e7c5c13476a62268423ef0500479f9e86e236c5a081c6449189e6afdf2af5\nmsg = 3202705af89f9555c540b0e1276911d01971abb2c35c78b2\nresult = valid\ntag = 4e4901592ba46476408d758435c7d1b489d2689afd84ceaaee78bfb91fd9391d\n\n# tcId = 20\nkey = 186e248ad824e1eb93329a7fdcd565b6cb4eaf3f85b90b910777128d8c538d27\nmsg = 92ef9ff52f46eccc7e38b9ee19fd2de3b37726c8e6ce9e1b96db5dda4c317902\nresult = valid\ntag = 3fc1d73dd4a8858c1fc3d8c4a3f33ed5ad0c70210038394a5902cb26fe287348\n\n# tcId = 21\n# long message\nkey = 28855c7efc8532d92567300933cc1ca2d0586f55dcc9f054fcca2f05254fbf7f\nmsg = 9c09207ff0e6e582cb3747dca954c94d45c05e93f1e6f21179cf0e25b4cede74b5479d32f5166935c86f0441905865\nresult = valid\ntag = 788c0589000fb7f0b5d51f1596472bc9ec413421a43df96ee32b02b5d275ffe3\n\n# tcId = 22\n# long message\nkey = 8e540cb30c94836ae2a5950f355d482a7002e255207e94fda3f7ef1a099013a0\nmsg = d6500f95e11262e308bf3df4df4b855f33e857563d4543f195639a0a17b442eb9fdcc1367d2eee75c8f805730b89290f\nresult = valid\ntag = 39697e70ce741feb33dedc069f00b5627fd9b837d10cbdd5b6d19cfbd511dd2c\n\n# tcId = 23\n# long message\nkey = 69c50d5274358188cff4c0fae742243d4e8a5e5ba55d94ff40edd90f6a43dd10\nmsg = 1ac5255aff052828d8ea21b376f1ebdd4bb879949913900405aebce83e48feb6813b5e9c89f94501a8ade41b26b815c521\nresult = valid\ntag = 4b0b4d0416fa2e11586fbfa7fb11261e69991dfa34019b9893d69a2be8c1fc80\n\n# tcId = 24\n# long message\nkey = 23209b7c5aadcbd13f7279af1a86d3c7ae8f179d1bcaaad0dff9a15302e78dbf\nmsg = 84bdac37e1af35d9356404e2787d47ece58348dea76a4a46e8aade3463d4db8c94a051be3733b38d756984865d56c60e8025f15e3f968f093e7fb7ebc7e31189c5692d15ed4256737b9b1894e5809503aaa1c9983fb096aa21916361eeb6ef455b129723a1a1ddf9deddea208529a648\nresult = valid\ntag = 4a85c479d1650dbd73bc5248074a55ff50218bddaa8d1fddaaf44946dc19aefb\n\n# tcId = 25\n# long message\nkey = 7c9cc667cae175f448faa96647319633b2d48531373ae7d316c44ddd8b9f69cf\nmsg = 9233c1d73b498c5106ff88951e07b9652cb0ddae740737ec205c9876d094978bfc947f7dc937119fd6a93915b19b625958a7a22363aa2ac33fb869ed16b303336ab740a0498a2df66a6599da710094481a7b544bd955b6f97135ba4673401db2db144a6e287041e47a51ed9b6ba956c13508c1c0c25310105239ab73629e30\nresult = valid\ntag = ca1b80441d333909c2bb30769650055051ed20f17de8ee953cb9070af56c704f\n\n# tcId = 26\n# long message\nkey = 82314540564ea3ce30591e97f68b2602de40fa29f773c2508327471b8348e8c4\nmsg = 6a6d2f45cebf2757ae16ea33c68617671d77f8fdf80bed8fc5cdc5c8b7086bd28e7eb3eecc7163491104e5309455e67f836579b82a1da3bf5991a8e2b2f189a49e05700e46c409ed5de77780a5f389e3f13dad406c9d55675329c5c921f07034180937c0f6ef34a2308b6ff3e1a0e9dc1ea65f5632730e8744d1db2c40a6595b\nresult = valid\ntag = 0900b3e6535d34f90e2c335775e86bf38ee7e3d26fb60cd9cdf639eb3496b94c\n\n# tcId = 27\n# long message\nkey = d115acc9a636915241795f48852052e07b51273ae2448251ec1d0d0f9807f3db\nmsg = 696d2456de853fa028f486fef437b6b6d1b530a8475e299db3a9005ae9cef8401985b7d31e172e8f439ccd1ad1ec44c9b86b78f3f243c1305b53bc21abad7a8fc5256311bfd34c98e37dfdc649e7ae4bda08cf2994b063c0c7106ed0b02a1f48af9191cbfb0d6a953b7e04327dfe8c93779cb574ba9cba575d01674e83621aa0c5f400d6e6cd24b301e33c9f3303e73bf357408c1be86c2489c09de998ff2ef32df554f1247d9313ce1a7160115d06f4c18d6556ff7986ef8a55e2adcfa27e4c69c71cc2ff01639e9d49bd9ed0687f530ffeb0890132457df2088081bc4a2f7f0a9f4dcea2c80d991db7f3747a1803d7619aaf3dd382c69536a0bcdb931cbe\nresult = valid\ntag = 82f92977f0b605eaada510ffceb53ad75fde16a8029f1b75b406a84270dbb8b7\n\n# tcId = 28\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 29\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 30\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d18b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 31\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = dab99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 32\n# Flipped bit ",
     "7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 538b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 33\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 34\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38a42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 35\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b89f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 36\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42896d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 37\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99fa709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096c80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 39\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2708a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096f80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f270ba3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f4df826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3caf4172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 44\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f836b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74162cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 46\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f026b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 47\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74972cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 48\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f824b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 49\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74170cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 50\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b45a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 51\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbf93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 52\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d4607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 53\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93834c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 54\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d7607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 55\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93804c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 56\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a955607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 57\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93024c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 58\n# Flipped bit 248 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1ca\n\n# tcId = 59\n# Flipped bit 248 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14f\n\n# tcId = 60\n# Flipped bit 249 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1c9\n\n# tcId = 61\n# Flipped bit 249 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14c\n\n# tcId = 62\n# Flipped bit 254 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc18b\n\n# tcId = 63\n# Flipped bit 254 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef10e\n\n# tcId = 64\n# Flipped bit 255 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc14b\n\n# tcId = 65\n# Flipped bit 255 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef1ce\n\n# tcId = 66\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28b42096d80f45f836b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 67\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b99f2709a3ca74162cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 68\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42896d80f4df826b44a9d5607de72496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 69\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191",
     "a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99fa709a3caf4172cbe93824c1f29b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 70\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f4df826b44a9d5607d672496a415d3f4a1a8c88e3bb9da8dc1cb\n\n# tcId = 71\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3caf4172cbe93824c1fa9b23a0c1e9c21bd851ff2d2c39dbef14e\n\n# tcId = 72\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 2c74bdf6927f0ba07d94bb562a9f8218db695bea2c0b5e573771c44625723e34\n\n# tcId = 73\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 274660d8f65c358be8d3416c7db3e0d64dc5f3e163de427ae00d2d3c62410eb1\n\n# tcId = 74\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 75\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 76\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 77\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 78\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 530bc289ed0074df02ebc42955e0fd67a416249553742128480ebb395a0d414b\n\n# tcId = 79\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58391fa789234af497ac3e1302cc9fa932ba8c9e1ca13d059f7252431d3e71ce\n\n# tcId = 80\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28a43086c81f55e836a45a8d4617ce62597a514d2f5a0a9c98f3ab8db8cc0ca\n\n# tcId = 81\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b89e2608a2cb75162dbf92834d1e28b33b0d1f9d20bc841ef3d3c29cbff04f\n\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 82\n# empty message\nkey = 7bf9e536b66a215c22233fe2daaa743a898b9acb9f7802de70b40e3d6e43ef97\nmsg = \nresult = valid\ntag = f4605585949747de26f3ee98a738b172\n\n# tcId = 83\n# short message\nkey = e754076ceab3fdaf4f9bcab7d4f0df0cbbafbc87731b8f9b7cd2166472e8eebc\nmsg = 40\nresult = valid\ntag = 0dc00d7217bbafe8d78bf961189b8fd2\n\n# tcId = 84\n# short message\nkey = ea3b016bdd387dd64d837c71683808f335dbdc53598a4ea8c5f952473fafaf5f\nmsg = 6601\nresult = valid\ntag = ff296b368d3bf059cc48682f6949ccaa\n\n# tcId = 85\n# short message\nkey = 73d4709637857dafab6ad8b2b0a51b06524717fedf100296644f7cfdaae1805b\nmsg = f1d300\nresult = valid\ntag = 2d02bd1c25b1fe52b1ead07374d6e883\n\n# tcId = 86\n# short message\nkey = d5c81b399d4c0d1583a13da56de6d2dc45a66e7b47c24ab1192e246dc961dd77\nmsg = 2ae63cbf\nresult = valid\ntag = 4d9e8bddf9b7a1218309d5988aa1b0d9\n\n# tcId = 87\n# short message\nkey = 2521203fa0dddf59d837b2830f87b1aa61f958155df3ca4d1df2457cb4284dc8\nmsg = af3a015ea1\nresult = valid\ntag = cb8a4b413350b42f4ac3533cc7f47864\n\n# tcId = 88\n# short message\nkey = 665a02bc265a66d01775091da56726b6668bfd903cb7af66fb1b78a8a062e43c\nmsg = 3f56935def3f\nresult = valid\ntag = 1cfce745db1ca7de9a1d4420e612ca55\n\n# tcId = 89\n# short message\nkey = facd75b22221380047305bc981f570e2a1af38928ea7e2059e3af5fc6b82b493\nmsg = 57bb86beed156f\nresult = valid\ntag = 0bde0d0c756df09d4f6da81b299a3adf\n\n# tcId = 90\n# short message\nkey = 505aa98819809ef63b9a368a1e8bc2e922da45b03ce02d9a7966b15006dba2d5\nmsg = 2e4e7ef728fe11af\nresult = valid\ntag = 406a5c2bd3e6a9595f9b7dff608d59a7\n\n# tcId = 91\n# short message\nkey = f942093842808ba47f64e427f7351dde6b9546e66de4e7d60aa6f328182712cf\nmsg = 852a21d92848e627c7\nresult = valid\ntag = 0b1bf9e98d0a794fa55c09b63e25799f\n\n# tcId = 92\n# short message\nkey = 64be162b39c6e5f1fed9c32d9f674d9a8cde6eaa2443214d86bd4a1fb53b81b4\nmsg = 195a3b292f93baff0a2c\nresult = valid\ntag = 71f33f6021d90858cadb1353d7fbe8d7\n\n# tcId = 93\n# short message\nkey = b259a555d44b8a20c5489e2f38392ddaa6be9e35b9833b67e1b5fdf6cb3e4c6c\nmsg = afd73117330c6e8528a6e4\nresult = valid\ntag = 4b8d76372ebe5e5caa56ca4e5c59cdd3\n\n# tcId = 94\n# short message\nkey = 2c6fc62daa77ba8c6881b3dd6989898fef646663cc7b0a3db8228a707b85f2dc\nmsg = 0ff54d6b6759120c2e8a51e3\nresult = valid\ntag = c580c542846a96e84ea77701778455bf\n\n# tcId = 95\n# short message\nkey = abab815d51df29f740e4e2079fb798e0152836e6ab57d1536ae8929e52c06eb8\nmsg = f0058d412a104e53d820b95a7f\nresult = valid\ntag = 13cdb005059338f0f28e2d8ce1af5d0a\n\n# tcId = 96\n# short message\nkey = 3d5da1af83f7287458bff7a7651ea5d8db72259401333f6b82096996dd7eaf19\nmsg = aacc36972f183057919ff57b49e1\nresult = valid\ntag = bd993e4428cbc0e275e4d80b6f520363\n\n# tcId = 97\n# short message\nkey = c19bdf314c6cf64381425467f42aefa17c1cc9358be16ce31b1d214859ce86aa\nmsg = 5d066a92c300e9b6ddd63a7c13ae33\nresult = valid\ntag = 86c9f4dde0b257a7053a7b03c7504409\n\n# tcId = 98\nkey = 612e837843ceae7f61d49625faa7e7494f9253e20cb3adcea686512b043936cd\nmsg = cc37fae15f745a2f40e2c8b192f2b38d\nresult = valid\ntag = b96bcacafac30094f18ac5039e7b3656\n\n# tcId = 99\nkey = 73216fafd0022d0d6ee27198b2272578fa8f04dd9f44467fbb6437aa45641bf7\nmsg = d5247b8f6c3edcbfb1d591d13ece23d2f5\nresult = valid\ntag = 6e597c4c3861a380c06854b446fc2a87\n\n# tcId = 100\nkey = 0427a70e257528f3ab70640bba1a5de12cf3885dd4c8e284fbbb55feb35294a5\nmsg = 13937f8544f44270d01175a011f7670e93fa6ba7ef02336e\nresult = valid\ntag = f731aaf2f04023d621f10495344679a0\n\n# tcId = 101\nkey = 96e1e4896fb2cd05f133a6a100bc5609a7ac3ca6d81721e922dadd69ad07a892\nmsg = 91a17e4dfcc3166a1add26ff0e7c12056e8a654f28a6de24f4ba739ceb5b5b18\nresult = valid\ntag = 95243eb1a9d448174ae4fccf4a53ebfe\n\n# tcId = 102\n# long message\nkey = 41201567be4e6ea06de2295fd0e6e8a7d862bb57311894f525d8adeabba4a3e4\nmsg = 58c8c73bdd3f350c97477816eae4d0789c9369c0e99c248902c700bc29ed986425985eb3fa55709b73bf620cd9b1cb\nresult = valid\ntag = 343367207f71425d8f81f3110b0405f6\n\n# tcId = 103\n# long message\nkey = 649e373e681ef52e3c10ac265484750932a9918f28fb824f7cb50adab39781fe\nmsg = 39b447bd3a01983c1cb761b456d69000948ceb870562a536126a0d18a8e7e49b16de8fe672f13d0808d8b7d957899917\nresult = valid\ntag = 151618eec4f503f3b63b539de0a58966\n\n# tcId = 104\n# long message\nkey = 7b0d237f7b536e2c6950990e61b361b384333dda690045c591321a4e3f79747f\nmsg = 3d6283d11c0219b525620e9bf5b9fd887d3f0f707acb1fbdffab0d97a5c6d07fc547762e0e7dd7c43ad35fab1c790f8047\nresult = valid\ntag = ce201c0dcfdc3f2bef360609a31fb19e\n\n# tcId = 105\n# long message\nkey = 17c92663741f012e5bb6714e614c2d155948617f10936269d954c58aba2ae62d\nmsg = 7fdd6a15c861d0313f6635d77dc55e115ff18c8ab063b5d03eab472eeca87a378188f25813515cf90b6cffa94a8ff36b29d65603eab3fbd2aa9500b261e184049893dc6ca2010becac163053f211070bdda621b8bd8af77e450268603b52db34c90be836dfebddef42303f724e63bf0f\nresult = valid\ntag = 76e8dfd94db4af9d79d9718eec46cb2d\n\n# tcId = 106\n# long message\nkey = 424c6b22606fcc094ae82fc5d3cbe484174c2211b3ec778091cac34a8e38a152\nmsg = d96ff062e2490e8e0c54c5a8b89e85b25a66d93d7c2b93bdfef846b70d38672746a4b988d08f15a5c527ca4f2c80e53f7c6ac0521bc57ebe38209180cbf934e0bbeb58cfb63d75da64af41d09ce174af1896f42522910fced35ea000402e95fd3ac7aa6d5e0a6b533b0879bc466019b3a5e6b16e4bd1ea6cdfc9ccc1d6f0f0\nresult = valid\ntag = eda709c7009714c372d0d6a63dfde469\n\n# tcId = 107\n# long message\nkey = 15d553c8da433d53cdc7f15087a70349caab57b379a4078928ce9b99302e31a6\nmsg = d6c0c53b73f74fb426adfdc143d70db7f7a8f8ed32a2faef263cf9ab117537b6b9d1728bd1000c1f28906c6ce6ad21862bfa4d689c1a8ebe3868b992098",
     "b7f981b2af5189a6adedff53a6c70c83693f5c8d6385a9a8a4dca017c5716ac4d5b9765c5ca2ab5f9867e02795198c0b9527e07d08af52dbcb91ceb3d8b412a2b2402\nresult = valid\ntag = 8ca1402bf8fc23442ac2067be925b828\n\n# tcId = 108\n# long message\nkey = ffe559468a1031dfb3ced2e381e74b5821a36d9abf5f2e59895a7fdca0fa56a0\nmsg = 238899a84a3cf15202a1fbef4741e133fb24c009a0cd83854c6d1d7c9266d4c3eafe6d1dfc18f13845ccdad7fe277627b5fd5ff2555ce6dfde1ee078540a0a3590c6d9bf2fb63ba9afbe9380e797be7cd017645c5a3613eef38ef89e3b7461e6e700ff2b4deef5636c9d2198b143f797ca1820a3dcc5d462ebf4a8c4c09eb202a23592eb9524082c79adda8fcd56d256041a26bf8f523962ba911ce5a5786570d65be3c4df722ed8830302065febdf944715298a1fbb7d10b68d7da2bf889324314ce51e815c7fbf03aa0a8358aff3a86eb7a33f9a4923660db3047e793bebb0c6918f4395d400381723fdae2832c36efc8e368a68f30f6351c3bc942cd560\nresult = valid\ntag = a830b313f4936dea56a3aefd6a3ebe7d\n\n# tcId = 109\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28b42096d80f45f826b44a9d5607de7\n\n# tcId = 110\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b99f2709a3ca74172cbe93824c1f29\n\n# tcId = 111\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d18b42096d80f45f826b44a9d5607de7\n\n# tcId = 112\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = dab99f2709a3ca74172cbe93824c1f29\n\n# tcId = 113\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 538b42096d80f45f826b44a9d5607de7\n\n# tcId = 114\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58b99f2709a3ca74172cbe93824c1f29\n\n# tcId = 115\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38a42096d80f45f826b44a9d5607de7\n\n# tcId = 116\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b89f2709a3ca74172cbe93824c1f29\n\n# tcId = 117\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42896d80f45f826b44a9d5607de7\n\n# tcId = 118\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99fa709a3ca74172cbe93824c1f29\n\n# tcId = 119\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096c80f45f826b44a9d5607de7\n\n# tcId = 120\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2708a3ca74172cbe93824c1f29\n\n# tcId = 121\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096f80f45f826b44a9d5607de7\n\n# tcId = 122\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f270ba3ca74172cbe93824c1f29\n\n# tcId = 123\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f4df826b44a9d5607de7\n\n# tcId = 124\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3caf4172cbe93824c1f29\n\n# tcId = 125\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f836b44a9d5607de7\n\n# tcId = 126\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74162cbe93824c1f29\n\n# tcId = 127\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f026b44a9d5607de7\n\n# tcId = 128\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74972cbe93824c1f29\n\n# tcId = 129\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f824b44a9d5607de7\n\n# tcId = 130\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74170cbe93824c1f29\n\n# tcId = 131\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b45a9d5607de7\n\n# tcId = 132\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbf93824c1f29\n\n# tcId = 133\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d4607de7\n\n# tcId = 134\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93834c1f29\n\n# tcId = 135\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d7607de7\n\n# tcId = 136\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93804c1f29\n\n# tcId = 137\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a955607de7\n\n# tcId = 138\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93024c1f29\n\n# tcId = 139\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de6\n\n# tcId = 140\n# Flipped bit 120 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f28\n\n# tcId = 141\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607de5\n\n# tcId = 142\n# Flipped bit 121 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f2b\n\n# tcId = 143\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607da7\n\n# tcId = 144\n# Flipped bit 126 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1f69\n\n# tcId = 145\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f45f826b44a9d5607d67\n\n# tcId = 146\n# Flipped bit 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3ca74172cbe93824c1fa9\n\n# tcId = 147\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28b42096d80f45f836b44a9d5607de7\n\n# tcId ",
     "= 148\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b99f2709a3ca74162cbe93824c1f29\n\n# tcId = 149\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42896d80f4df826b44a9d5607de7\n\n# tcId = 150\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99fa709a3caf4172cbe93824c1f29\n\n# tcId = 151\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d38b42096d80f4df826b44a9d5607d67\n\n# tcId = 152\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d8b99f2709a3caf4172cbe93824c1fa9\n\n# tcId = 153\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 2c74bdf6927f0ba07d94bb562a9f8218\n\n# tcId = 154\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 274660d8f65c358be8d3416c7db3e0d6\n\n# tcId = 155\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 156\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 157\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 158\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 159\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = 530bc289ed0074df02ebc42955e0fd67\n\n# tcId = 160\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 58391fa789234af497ac3e1302cc9fa9\n\n# tcId = 161\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = \nresult = invalid\ntag = d28a43086c81f55e836a45a8d4617ce6\n\n# tcId = 162\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = d9b89e2608a2cb75162dbf92834d1e28\n\n[keySize = 128]\n[tagSize = 256]\n\n# tcId = 163\n# short key\nkey = a349ac0a9f9f74e48e099cc3dbf9a9c9\nmsg = \nresult = valid\ntag = 3a8437b877b75cc08a4d8d7559a8fc6869a58c713da63d1d4b350d59b597e30c\n\n# tcId = 164\n# short key\nkey = ac686ba0f1a51b4ec4f0b30492b7f556\nmsg = 2fa43a14ae500507deb95ab5bd32b0fe\nresult = valid\ntag = 008532a53d0c0ab22027ae249023375374e2239b959609e8339b05a15742a675\n\n# tcId = 165\n# short key\nkey = 73ef9ef1a4225e51e3c1db3ace1fa24f\nmsg = ffad380d9aabb0acede5c1bf112925cdfc3d379fc2376a4fe2644490d0430ac3\nresult = valid\ntag = 9c7cb9f7c207ec46d1e3c55764731c4ab5ddbae4e1401e52a895df0cff4787c9\n\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 166\n# short key\nkey = e34f15c7bd819930fe9d66e0c166e61c\nmsg = \nresult = valid\ntag = 1d765ab9e29892f7bfec2975ad4bc2dc\n\n# tcId = 167\n# short key\nkey = e09eaa5a3f5e56d279d5e7a03373f6ea\nmsg = ef4eab37181f98423e53e947e7050fd0\nresult = valid\ntag = cfc19ec07902ec8be489606d8f40d172\n\n# tcId = 168\n# short key\nkey = 9bd3902ed0996c869b572272e76f3889\nmsg = a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e\nresult = valid\ntag = ac50adad9785a89c7282d8ab881dc615\n\n[keySize = 520]\n[tagSize = 256]\n\n# tcId = 169\n# long key\nkey = 8a0c46eb8a2959e39865330079763341e7439dab149694ee57e0d61ec73d947e1d5301cd974e18a5e0d1cf0d2c37e8aadd9fd589d57ef32e47024a99bc3f70c077\nmsg = \nresult = valid\ntag = f5bfb940561fb4db73ebba49bf2e4893bb0cca618a71b7ecf6aca38231e167ea\n\n# tcId = 170\n# long key\nkey = 2877ebb81f80334fd00516337446c5cf5ad4a3a2e197269e5b0ad1889dfe2b4b0aaa676fac55b36ce3affc7f1092ab89c53273a837bd5bc94d1a9d9e5b02e9856f\nmsg = ba448db88f154f775028fdecf9e6752d\nresult = valid\ntag = 1690ed4180642899e0deb9ec2270374e8b0a484217f5a682c524316eca219b64\n\n# tcId = 171\n# long key\nkey = 21178e26bc28ffc27c06f762ba190a627075856d7ca6feab79ac63149b17126e34fd9e5590e0e90aac801df09505d8af2dd0a2703b352c573ac9d2cb063927f2af\nmsg = 7d5f1d6b993452b1b53a4375760d10a20d46a0ab9ec3943fc4b07a2ce735e731\nresult = valid\ntag = e542ac8ac8f364bae4b7da8b7a0777df350f001de4e8cfa2d9ef0b15019496ec\n\n[keySize = 520]\n[tagSize = 128]\n\n# tcId = 172\n# long key\nkey = 813e0c078c221375e80590ace6774eafd2d2c242350988d02efa550e05aecbe100c1b8bf154c932cf9e57177015c816c42bc7fbc71ceaa5328c7316b7f0f30330f\nmsg = \nresult = valid\ntag = bb6ab66f51e53fa086c9c61a26ca27e0\n\n# tcId = 173\n# long key\nkey = 5713343096b0aaf0562a6b92c1a15535924160475a4e4233589159728c562e3b2ad96f740c6a4da2bc3f768ce98c9bd66bac28d1646ff592028c940d455f35eeb4\nmsg = 71712de2fac1fb855673bff72af64257\nresult = valid\ntag = c18165b8b97db1ca5e2486a32b39731e\n\n# tcId = 174\n# long key\nkey = 7208afbecf5f1f34828f98b719414e280716de64f5edd1ae1c774153cd2022337bb20fade1b7856f1dbfd40e2b4307f1293ceff1692ee90d8c90b5fdf953ab01a5\nmsg = 43b53302b604d613e62db002044a4782d572ac8fbd3cd0ece91b43bc52e18e98\nresult = valid\ntag = 2fecfe45d79339c57dddba68ab34f5f1\n\n",
 };
-static const size_t kLen131 = 47894;
+static const size_t kLen147 = 47894;
 
-static const char *kData131[] = {
+static const char *kData147[] = {
     "# Imported from Wycheproof's hmac_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HMACSHA384\n# Generator version: 0.8rc21\n\n[keySize = 384]\n[tagSize = 384]\n\n# tcId = 1\n# empty message\nkey = ee8df067857df2300fa71a10c30997178bb3796127b5ece5f2ccc170932be0e78ea9b0a5936c09157e671ce7ec9fc510\nmsg = \nresult = valid\ntag = a655184daf3346ffc6629d493c8442644e4996a2799e42e3306fa6f5b0967b6cf3a6f819bab89bce297d1d1a5907b2d0\n\n# tcId = 2\n# short message\nkey = 976696c0dc97182ca771975c3928ff9168ef89cd740cd2292858fd916068a702bc1df7c6cd8ee1f0d25e61d4c514cc5d\nmsg = 2b\nresult = valid\ntag = 363e8973fedcf7892013dfae0b7065d61d80b98c635bc09ed860a01473b9bcd0dc550dbf66cf0d601fe9cbf3ae59620d\n\n# tcId = 3\n# short message\nkey = c55ea4c64a0a63e2d14ad42559ba7c816b8824d263c2cc6a015761b53f681e514369f0dfba5cde165320ee10a96eb1fc\nmsg = 5abd\nresult = valid\ntag = ccc2925f164a7d9662f1e76bcaf6345492bb091d4d2d775af2178a4bcc1ca21dcf8b3bf8f056823770782f25a419bb3e\n\n# tcId = 4\n# short message\nkey = 2928d465d92fa40072ca9d67761be66e491755e43499003c1057d3bec870f255126c3658d0d8a0c7d207df8710037ca7\nmsg = c405ae\nresult = valid\ntag = d9e19c672a466e4c83a849905728c4be1db99bdd260946d9ff52939779002dcc460c576f02b40dda0717182be96b5411\n\n# tcId = 5\n# short message\nkey = 686a3730085cc944fceb141628419818e662fe21e52bea2748f3b704f80ce801086db1e3068917b242e62b4d6e6ed685\nmsg = 6601c683\nresult = valid\ntag = 10dc39103983b3a6be376a8eda7b6f363cb91efe11b027a62440ae136bd66f98b0a1d8b8f2399099492021076afa14a0\n\n# tcId = 6\n# short message\nkey = f22d867b972b232e3f444a488dd794d170807c70eb650f952b6177596f76c558a5d860d6f7be0be9e666f9bd53732f8d\nmsg = 15b29377e0\nresult = valid\ntag = e02e4e20b5f1e5f06913bc9745c9069c09ec1369f1a296ad1d07c04cc4f9cb4741248d7ba097cd3ba0e75d2409d6a01b\n\n# tcId = 7\n# short message\nkey = 3ac9abd53dbd0fbb891f9b5e16dd45df994e5283527832707138fc2712bad9e34761e7d9c6d05d46f2c8323ddb0efe99\nmsg = 5a34155b1115\nresult = valid\ntag = 78c53dd1a2431174628f5f4867fa777afa6df1b36269bba114d016d1065fcb021170baad09b4a528f40573903a65f540\n\n# tcId = 8\n# short message\nkey = ae3aa94fdd35e2bef40472d29bdad3a409840ea441c3d7025cd72f3e81ff56da602161d84b23d1634061385be30c5bbd\nmsg = 8a140d781e7191\nresult = valid\ntag = fd22ba896cb1147bb86f8ad51c253b792657c0becc913e90104da0f139f9b08c9169706f1531a2c6c03d6bd72a77eff2\n\n# tcId = 9\n# short message\nkey = 44b79852cabcf3fe93d2fff55d2afe6a46c35b7ad1954ce0888de7b459b982722faf8b490e6b00e7bcabbd36f18443f5\nmsg = 9398cd251deafe8b\nresult = valid\ntag = 56128fb438a93f6f48f47c0f4c7549f8008a8e69bbdbf0886ec40f86e7870034ef9090d2b04057391f1def5b25e8f0ad\n\n# tcId = 10\n# short message\nkey = 03fed2f579a3ebdececfb184ebe2984876113399c4a593d98b5f5e606dd330fb394c285d9ead601748259b493335f8e5\nmsg = 18d879b1f63df3ac7a\nresult = valid\ntag = a0e3b5660eeb5fc4a5dd48e725b09a0e282b22bbe2693d8b893ddf0f2116450e0875925407e909fde0f1f728f608fba9\n\n# tcId = 11\n# short message\nkey = f4ef48bf4056d39dbba4154018c63bdf29420b9991ea594ff05e3cc1cb02e176d54ba038a6b78692519d6788e495bbab\nmsg = 0a5de13cd9ba31c94486\nresult = valid\ntag = e9a1219e86983d69e336068b280309f974ab61f25968fc6352324ba49c36ce42c578676a3a31ef11e960d6771386650e\n\n# tcId = 12\n# short message\nkey = fc771f7ccd499a1ed633d86876d707b5f1d53c6bcdf21aa2907766ab3ca7fa6cdd6a9b981b1a84a528e81444303f1057\nmsg = 03ba11f3f3173b85226b25\nresult = valid\ntag = cfb4971d5449db364e2c8d0d429a0767050d480a5397f0dcc74294f52ea96260a57fe6cad14409ad67da6fbebf2da0d8\n\n# tcId = 13\n# short message\nkey = b3999de680b11550e18631c8199f7eb8a74e21bdc9d97f781245c2af19f85497d9f38b250a564e48650fd00be365f155\nmsg = 9c658cb5e601d85dc3857863\nresult = valid\ntag = d547e4cbd56e82b47d2ec93eeb6b34924ebda461fb60e475bf328d2368618f55fbf7b0e2eb1ff542c4eb7eefbfc8bd2b\n\n# tcId = 14\n# short message\nkey = 88005a62864ea699e1509616ec48033e84d2e2a13b8bc2e8a76f2eccbdb207a95ac8e2f5b5a703b22a0b571e8acc599a\nmsg = 5a94f84541a794bf23d72db16d\nresult = valid\ntag = d6b73ee67e88a20fceb5520be92594daf1b3786c7187535ccb1f0b926dae11adde6e8697ba803b159019849df3c9d2c7\n\n# tcId = 15\n# short message\nkey = b1cbda2c9a12f92315a5101aef311e99d6db002b0e04fb53c50106aa4d28e9a346697ba97084572eea56ccfc4ad7e572\nmsg = ce12c0c78e3f6b276ac56ed7435e\nresult = valid\ntag = 5c0802cd0ed82380e4c2a61d146ed72762613de89eb4ab9fe71da9ad3d79e1d2321cae186292f7c52ab639d3ba6aa85a\n\n# tcId = 16\n# short message\nkey = 08517e8014e00db5c37f2a20f987ea2ec52e7938de018ad6be256ba2236804144ad2a1bcc242738862b40647007e0a2c\nmsg = 21e2a0a167789a6b722d1737d92f8b\nresult = valid\ntag = 2264d3c9b835aedf699d5fbfc05d46f085591441df75aa2b2873f6c8a11a0856a2b79ae11ea0a91609dbd564a0bed456\n\n# tcId = 17\nkey = 503d7478a773b694d6e552c9703cc8bc56fd49fafc9a17cab8b0332dca8d49336fa7e9ec2bcb56253fe5bb504e3e7f7f\nmsg = d96e6fed893addfd9237c81c4f4e341b\nresult = valid\ntag = 19389766789912260f3f9757df3651663829c358bb48b22c1c63132070df318905beffd45f51e4dfcb3e785f44cf9106\n\n# tcId = 18\nkey = 41341bab902e767d4d1964c0acfecf46eff1b02b6455bcb2097de9c154be1f667f21be076de18cd2c15c005896fca87f\nmsg = 4c43ac7de3631cc86f4da72fe6b6a552f1\nresult = valid\ntag = 3c3104f24b7070cc3277d9ae640d416298fc917a0c1cdc3c2e7b6da75706fd2ae234efd551af12ae29144704793e2f6a\n\n# tcId = 19\nkey = c2f83be1acce7b89a5f9e9ea7e4c4f8b0f4319986fbe479fa3b4a3c298168362393b56ea03b5cef77f48e5a72abe6d08\nmsg = 8dd0cd786cd800ffebec098728923d69249d3223c4c595cb\nresult = valid\ntag = 751c6c7d00fef5e4edc993915fba694943a7ee3a2c8e5b700d0ee536bf85fb117a9cd6c456485cd670f7a0b490c83e61\n\n# tcId = 20\nkey = 6bd2aee9dd98d6b6609fce82181b10c20bba861da68a1590586fab08c5e9e90ff584047db4760828643fea38087160e4\nmsg = 33236a9de603c1e4f5e11164224740627d10f6008eb73ec2642321bf0b82d579\nresult = valid\ntag = e4cd8b8868bb078ed5d6938e40d9ff4bf61a4994be40a5f2b5446463e5db90516bccdd19f16c92e3f839b9d6de68b2a9\n\n# tcId = 21\n# long message\nkey = 2f98ba2ceaadc5ba08880a35cb0080dc870a5734a782ebe31c4bab100ff8786dcc3be6de18482ea5d1b3bf14aeabb470\nmsg = 2d74a66dacf12edb85ef3073feafd122889cb634add00ff0395d224b4ff8b5d5d67ca6419b6826abffdb41bab427d5\nresult = valid\ntag = a8ea72100859f4b7b6f2fe596248f1729bcdf0606c900ab52e51eab548d26e1eb634a42e5fc7ccc18356c0d283597ee2\n\n# tcId = 22\n# long message\nkey = 5e5f60e40d84c7ca2608af3bcc6e04abc5f8b7ca730a78af7f6f032e5a1501695bd91f3bebb28590af1db90d8390ca58\nmsg = 2efe6a14ea8d679e62dbcedf35e61852278c83c54adbe1f1c72cb1a746b11cff8cb4fc3a2c3acd44255d51c020ca6d47\nresult = valid\ntag = 6e8c95a4097ea13d064ed10809a33b569a6a84205158bd692ff82bc4b70b47a60ed332f2f5bca5211a1cc89c06f9c595\n\n# tcId = 23\n# long message\nkey = bc310bc3913d9fe59e2012a058c9e150534d25611e36206cf07ccaefe153f38eb0eaad9941b6883dfbce01bcb5196041\nmsg = 9f0747d7396bfbe01cf3e85361e50085e0a91a7490b994031d81851b725065993f45dad0d60d794aedec7ba5d9d6dbbee4\nresult = valid\ntag = 3a86498f78c3fb7eb3b7b3d82f677d2dfe01166fe76e232083334d74f11588fd089637c94761e9cfe836436005deaef7\n\n# tcId = 24\n# long message\nkey = dc770c64d00d156e43cb74970e3a1a2ad28b6d9ec6b2b6e5ac3e356a99f879cb620f00340c044cc1f31bdccfa0dbd177\nmsg = 403fd8e3ef51b6539db658a894be85b58fbc84881e61c5e0cb13ae421a09d31d780603256d390edd056d190856be00ad20a7048f0c67416fe8e02884086155f4263262e8c1275504d4f91f2751d3c3dccd4409ff2b45e41de93f7b104d58f6e15bacb62ace9700615ecc1b30a0cc1b35\nresult = valid\ntag = 1c4f6474f39e6eabbe7a99faa234f49833444130acf01dae68d68251a930419960b0fb5f48360149e05d1209941cc9ec\n\n# tcId = 25\n# long message\nkey = cca9299c7bdc26a4b595055c99ca23bec8ed11b5deeda91f83e2365e7340395ceef4e86e5cd91f2593bcfec498a67fc9\nmsg = a05b40b8d3a7bc7b75b0e97309c9bd1c9d8755c1ff5245ef6308a6a5cad3ecfbcb6364b41ca6f3d24bbee844d6204d1026abe345af7bdec114a373b109aa5724b738d50ab7a826c268e873709f8b35135a870045d5fb9daa82d3c245b5338917354e72b3058c9a4b807117465217d7d14f36f8a8d4e97bc3b93587c92641e7\nresult = valid\ntag = 1b6b5ba848bc13dd46c35177ae9ff9bd2d6ca5f4c9373964d3182483d980b4654527f36d7cc51b9e2efe7ed97a82e3be\n\n# tcId = 26\n# long message\nkey = c728e65e08d9296fe3cdf2dedb49c81a30b603a62569eece4ee5d01e9a32ae3bcb4ec163e455e452582454ceefefc046\nmsg = e6c6bac87c17e269a471434ca9568401451d78c2444a9d6edcda3cdab51c5bed1c19eaf34326580fd85ae5236ad51bc5dae386b36101f54695c595eeedcdd0182a4a117f8093f4f4812e03db396ede9849d193e7722081aeec4be6c4caf6c979d36ead56634a21be21162ea232dec9cffdbd2474245878dca369e814fd028303\nresult = valid\ntag = 533920a013cf006aa29b26f74b6dd29363",
     "4293089986aa249271c426b942dc6bae32b2641616672f3d75968866e182e5\n\n# tcId = 27\n# long message\nkey = 90c4215dc3f237435047fefdd8638d339a3fc66fca06c5063eacbda002ab335e621605f672f3da9f641fae110afc3e7b\nmsg = 1ebc22c3031b64615eb6f1a0696e33b7df139a4b891d3e6721cc26c05d55de790dca623668c10308485d38e95ec4769fa4430ca3ebc25da9f5d31c972674517d9a2222e6b97d8def6512af096c6d1480d83a229c84b7f28c80184b6bebf3f4eff5fc4e5c6cfea4f8eba9a957f7913b20a88ad1734f7c38547e934d1dbf2d73dbd61e31fb1583c7b6577a171e7d02f19045126ac2973d855bc18d34d32326d1e216da58366a60033450091128ae26a479069bba7b91b2ab7f3c5fbcde391de3ca114b951d6852f92795f8023d7a29a7f4ce61e9241b4f235d21e899087167ab3f3a0e9321c7942b165178788df48d3b106b203ec1e01d29bda41a99ac0d2c00\nresult = valid\ntag = c52b91daed6ee46416f2db78978251cb334e5d8e00b32ae06e365f455d28de406a9cce2f9f29378f229822dbf26bfdad\n\n# tcId = 28\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 45be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 29\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a84d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 30\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 46be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 31\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ab4d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 32\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = c4be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 33\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 294d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 34\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44bf81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 35\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94c07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 36\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be814415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 37\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d077f90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c414d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 39\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff91b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c417d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff92b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d2832b7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b3386064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 44\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7b62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e065b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 46\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283abfa62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 47\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e0e4b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 48\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a42a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 49\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064903603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 50\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a55188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 51\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03703d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 52\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45189e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 53\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d66bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 54\n",
     "# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a4518ae5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 55\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d56bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 56\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45108e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 57\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603576bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 58\n# Flipped bit 376 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c67\n\n# tcId = 59\n# Flipped bit 376 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d217\n\n# tcId = 60\n# Flipped bit 377 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c64\n\n# tcId = 61\n# Flipped bit 377 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d214\n\n# tcId = 62\n# Flipped bit 382 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c26\n\n# tcId = 63\n# Flipped bit 382 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d256\n\n# tcId = 64\n# Flipped bit 383 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310ce6\n\n# tcId = 65\n# Flipped bit 383 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d296\n\n# tcId = 66\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 45be81c415d283ab7b62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 67\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a84d07ff90b338e065b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 68\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be814415d2832b7a62a45188e5dafbcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 69\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d077f90b3386064b03603d76bcf0214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 70\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d2832b7a62a45188e5da7bcb97da606bd5b16c92c1fc36f198c0b3a714921848d5e03df1c4849bb8310c66\n\n# tcId = 71\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b3386064b03603d76bcf8214b1fb88c66b9415dde76674896400f97b8408bfefa6ee86c716bfa4a460d216\n\n# tcId = 72\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = bb417e3bea2d7c54859d5bae771a25043468259f942a4e936d3e03c90e673f4c58eb6de7b72a1fc20e3b7b6447cef399\n\n# tcId = 73\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 56b2f8006f4cc71f9b4fc9fc289430fdeb4e047739946bea2218998b769bff06847bf7401059117938e9405b5b9f2de9\n\n# tcId = 74\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 75\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 76\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 77\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 78\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = c43e01449552032bfae224d108655a7b4b175ae0eb5531ec12417cb67118403327941298c85560bd7144041b38b18ce6\n\n# tcId = 79\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 29cd877f1033b860e430b68357eb4f8294317b0846eb14955d67e6f409e48079fb04883f6f266e0647963f2424e05296\n\n# tcId = 80\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 45bf80c514d382aa7b63a55089e4dbfaca96db616ad4b06d93c0fd37f099c1b2a615931949d4e13cf0c5859ab9300d67\n\n# tcId = 81\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a84c06fe91b239e165b13702d66ace0315b0fa89c76a9514dce66775886501f87a8509beeea7ef87c617bea5a561d317\n\n[keySize = 384]\n[tagSize = 192]\n\n# tcId = 82\n# empty message\nkey = 1c678267be13acb464939c2896c9e9ce1deb5b30833bdd9ca00370889b84410782ad52afe25dc10ab7ec5cf5f34793b7\nmsg = \nresult = valid\ntag = 6dd566be678c1e6359ab31b635cc1601",
@@ -3518,9 +3617,9 @@
     "090a0b0c0d0e0f\nresult = invalid\ntag = ab4d07ff90b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 113\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = c4be81c415d283ab7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 114\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 294d07ff90b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 115\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44bf81c415d283ab7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 116\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94c07ff90b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 117\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be814415d283ab7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 118\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d077f90b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 119\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c414d283ab7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 120\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff91b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 121\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c417d283ab7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 122\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff92b338e064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 123\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d2832b7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 124\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b3386064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 125\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7b62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 126\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e065b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 127\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283abfa62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 128\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e0e4b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 129\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a42a45188e5dafbcb97da606bd5b16c\n\n# tcId = 130\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064903603d76bcf0214b1fb88c66b9415\n\n# tcId = 131\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a55188e5dafbcb97da606bd5b16c\n\n# tcId = 132\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03703d76bcf0214b1fb88c66b9415\n\n# tcId = 133\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45189e5dafbcb97da606bd5b16c\n\n# tcId = 134\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d66bcf0214b1fb88c66b9415\n\n# tcId = 135\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a4518ae5dafbcb97da606bd5b16c\n\n# tcId = 136\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d56bcf0214b1fb88c66b9415\n\n# tcId = 137\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45108e5dafbcb97da606bd5b16c\n\n# tcId = 138\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603576bcf0214b1fb88c66b9415\n\n# tcId = 139\n# Flipped bit 184 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16d\n\n# tcId = 140\n# Flipped bit 184 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9414\n\n# tcId = 141\n# Flipped bit 185 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b16e\n\n# tcId = 142\n# Flipped bit 185 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9417\n\n# tcId = 143\n# Flipped bit 190 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b12c\n\n# tcId = 144\n# Flipped bit 190 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9455\n\n# tcId = 145\n# Flipped bit 191 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d283ab7a62a45188e5dafbcb97da606bd5b1ec\n\n# tcId = 146\n# Flipped bit 191 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b338e064b03603d76bcf0214b1fb88c66b9495\n\n# tcId = 147\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b",
     "0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 45be81c415d283ab7b62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 148\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a84d07ff90b338e065b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 149\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be814415d2832b7a62a45188e5dafbcb97da606bd5b16c\n\n# tcId = 150\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d077f90b3386064b03603d76bcf0214b1fb88c66b9415\n\n# tcId = 151\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 44be81c415d2832b7a62a45188e5da7bcb97da606bd5b16c\n\n# tcId = 152\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a94d07ff90b3386064b03603d76bcf8214b1fb88c66b9415\n\n# tcId = 153\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = bb417e3bea2d7c54859d5bae771a25043468259f942a4e93\n\n# tcId = 154\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 56b2f8006f4cc71f9b4fc9fc289430fdeb4e047739946bea\n\n# tcId = 155\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 000000000000000000000000000000000000000000000000\n\n# tcId = 156\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 000000000000000000000000000000000000000000000000\n\n# tcId = 157\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 158\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 159\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = c43e01449552032bfae224d108655a7b4b175ae0eb5531ec\n\n# tcId = 160\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 29cd877f1033b860e430b68357eb4f8294317b0846eb1495\n\n# tcId = 161\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = \nresult = invalid\ntag = 45bf80c514d382aa7b63a55089e4dbfaca96db616ad4b06d\n\n# tcId = 162\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = a84c06fe91b239e165b13702d66ace0315b0fa89c76a9514\n\n[keySize = 192]\n[tagSize = 384]\n\n# tcId = 163\n# short key\nkey = 08476e9d49499c5f52e37f80ece6f5a45459948806b48241\nmsg = \nresult = valid\ntag = 1b6cfc8709aab8075465f32e13b0b0f796cc34d93d7bed090f297dcf9fb75e0d8e285b1500b732d554ac97ba45f33e47\n\n# tcId = 164\n# short key\nkey = 213b44d8e1fabaff837ef30ee2542f9ab82ed70411dae78f\nmsg = ee0bf48585c186ff991b4d8607817c9c\nresult = valid\ntag = 54f4010d50f80bcdb4b84d56bc4ef30e4c68f75128214cf446b5145f6fff1326a209945fc21ab5e1f5d917559ea9b800\n\n# tcId = 165\n# short key\nkey = b4afa9daaa8c944d73a3881f3221e42b34ef4e35f184e878\nmsg = cf607f6a0eb44ecbca81b6d1fdb595cee35f2353da02e82e28e133b9decd8fbb\nresult = valid\ntag = d064a51fb109c3b1d443f13f41e90e14198f846080464547806d46a8151c4e3855a81f4af40915609095dd72f869aa1b\n\n[keySize = 192]\n[tagSize = 192]\n\n# tcId = 166\n# short key\nkey = 89e46b66209548c80b0c830662223b49b0e3b895eb30e2fc\nmsg = \nresult = valid\ntag = 4b012c0c0da44ede2a427e85ace8ecc54b379e9e24f08d41\n\n# tcId = 167\n# short key\nkey = f2c10ce8cb1cf3b363354473b027c1e53deccef03233be0c\nmsg = e1fa10b8e301e0348405770bc3fafcb1\nresult = valid\ntag = 2d088af29cc744e347124fbe4100cbcdebbae037ed9bf69d\n\n# tcId = 168\n# short key\nkey = 92e074442cc4c59e72260808d80d8e7b85c6335068917b83\nmsg = 34eae27425ace17771e164cbb634306f352edc9c37bf608be8a755fb94148183\nresult = valid\ntag = b7e6b7bb29c02e4635dbdc50d8be71e2ddf0a544471de285\n\n[keySize = 520]\n[tagSize = 384]\n\n# tcId = 169\n# long key\nkey = db6f9956c3f4ca6e41f1f7f14629d44c79e0353edbf3e310e6858bbc45a7cd57778a9053ba22a141bf58bfd434ad08648c7041a224b97a0d17e0edf94fd40b410a\nmsg = \nresult = valid\ntag = 0cb1b296255bb259f3b601b49b35524a5eca6c52360754d3d96dd521c905b1c1821d74965967d8e86d50de950fe4d635\n\n# tcId = 170\n# long key\nkey = f03404bdb3e08f530d4c3a5f165d236012a4c45cd063e3e4483da088ec0afdb24e9639fccabb91f98a49dc2972e2981426573ecfe69c00c43a2d99a3107cef3a70\nmsg = 73ed9fa2acf49d6c98bfc7d6c5ad9c56\nresult = valid\ntag = b6132e5216f711eeeb44da3d92983fe5b6de5cd9410be71db8d3b07228341686aa60e7081e95f2e4b69bb7cd9648bc0b\n\n# tcId = 171\n# long key\nkey = ee799e25edb1b18452e5ed174bc6b2185a6754417d6cc05d736d2ba9efc8367e4b05ba0a2ee525ceeab74f9804a8479130c328d671e34070cf174a003a1dfb5994\nmsg = ac3e7da7e578b9b4dc2424030446c7f6aebcc471445a9e0e6e65099caeec5b2f\nresult = valid\ntag = c8607fca1888418166c550dd58d7a3976a6ecd0e4ca99b02fb187800a9c9ef909a6c1497c0652d4dca82405ab07f5eed\n\n[keySize = 520]\n[tagSize = 192]\n\n# tcId = 172\n# long key\nkey = 063d6e12e670098adabe68192023b637bb6d8d713fc8436188c4ec06fdd084ce6d193f26c86a9560e1abc27d813fce2b3eac0170fd1cb72e1930a2776bc84d6c11\nmsg = \nresult = valid\ntag = 9dc2acbfa28a7ac5f2a5bdd4b1b2dbc806c48f96ce950eb5\n\n# tcId = 173\n# long key\nkey = 359318e6c6279ba9ebcb1675f5a98195bbf5d895da9c17b8329038be857dc395b12ae91a55598876593c1c20bc0172cf15126b7a6bf0a238eda3325d6dd60600ef\nmsg = 7ad0c9098ea10e615bb672b52c96542d\nresult = valid\ntag = 4163737c219f7c5e743843dc3d36019c6585ea5d4e7cf24f\n\n# tcId = 174\n# long key\nkey = d01cd898089d8a1eeb0035b0d332da80fbd3571b9192db10fa6f55f665ab192d7050cab643996e99254d9573e0cf4eeaa63afccdefd81614fe7b83dfe30e3ba19f\nmsg = d67c77cdd0af5d10e8cae887e5a609bb76a9e5597653773c303b82b918fdc59f\nresult = valid\ntag = e7df527a988080749ee215ba0f8207838df38a37707a6330\n\n",
 };
-static const size_t kLen132 = 57350;
+static const size_t kLen148 = 57350;
 
-static const char *kData132[] = {
+static const char *kData148[] = {
     "# Imported from Wycheproof's hmac_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: HMACSHA512\n# Generator version: 0.8rc21\n\n[keySize = 512]\n[tagSize = 512]\n\n# tcId = 1\n# empty message\nkey = 5365244bb43f23f18dfc86c09d62db4741138bec1fbddc282d295e0a098eb5c3e37bd6f4cc16d5ce7d77b1d474a1eb4db313cc0c24e48992ac125196549df9a8\nmsg = \nresult = valid\ntag = d0a556bd1afa8df1ebf9e3ee683a8a2450a7c83eba2daf2e2ff2f953f0cd64da216e67134cf55578b205c8a1e241ba1369516a5ef4298b9c1d31e9d59fc04fe4\n\n# tcId = 2\n# short message\nkey = 00698977f7102c67b594166919aa99dc3e58c7b6697a6422e238d04d2f57b2c74e4e84f5c4c6b792952df72f1c09244802f0bcf8752efb90e836110703bfa21c\nmsg = 01\nresult = valid\ntag = 4d1609cc2c2f1ab5ddc35815ae1b5dc046f226bde17ec37a4c89ec46fbd31af2aeb810b196dffdd11924d3772bef26a7a542e0a1673b76b915d41cbd3df0f6a6\n\n# tcId = 3\n# short message\nkey = ed6dc65dbeaadbdaab530a0d35f19f78a7bd93e698546c82751bf650c2a44fc8529033d088febeed288fb4c8132a59df0207687640c76dcdb270ac3af5f042f1\nmsg = a78f\nresult = valid\ntag = 0757b27e120559d64cd3d6e3cb40d497845375815181bd9b4e74f2189d09d01a1b3ead53701380d988958ed22bc379ace9d47cbcac1d49bfa7e14f1f44804c30\n\n# tcId = 4\n# short message\nkey = 463c5e696da0ec0d784388be775d1d91d94746aa8d3d2c209f56ac95ea54e7288329f9fb40be4eef35547e64c61dc51a4a1f3380a2b96420f088655ea9d85b97\nmsg = e956c1\nresult = valid\ntag = ac4b1509391814ae5cb5a123e7a060601575c11d81b563bdc52febe6bb2c747b85eeddcb6748c98147a46a1cc9be6776d1a8e82ae4896b9c18da2ff351c56795\n\n# tcId = 5\n# short message\nkey = 4bc0d32e945cfdafd20d39be3820f9649727cbda5ab5859953a322cbde1ab7a514d7dcd14ba90905e70919bb86b85cfeaa375ee2ce2703711b938c8f4ab5f178\nmsg = b2aa48b3\nresult = valid\ntag = c4ecdbd2efb17640ce6707e2e9d0ee5bfb98b91584bc86ab386437eaa37b0f2eb70500361105416c0dcecff389dc94c723fcff18cb801740962312007a195a23\n\n# tcId = 6\n# short message\nkey = aca47f6350941a0efd8c3bac9064a554be337cde7d192f6fbf86d1b4db09b36531165cbae0a634206f71fa400df33352fff60e1fba4009ac6671cd37312bdd98\nmsg = bc993b1db0\nresult = valid\ntag = 89af2f5746cab89fda6993e00f1bf0cc70a77188945bb7b5409b536aec5533ad501db6ecfa3e516b580b7df9c8eadb3cf556ccc01668be984335bd5a6255d566\n\n# tcId = 7\n# short message\nkey = b3ecae6f25c2f699f158b3ffcd0a7a575583e4c9cb56b5c22ef4273cde6c6734e84d7400749c17e47e8cfccafaf8b50c65eb47dfeb273d5d30a1181e37b27ad0\nmsg = f0361d58291e\nresult = valid\ntag = 4037a57aa279b5a07abe9389dcf508be9495a8257dcb3feba3f0801cd57574c30bfddc6df5df6567cd572c4e82735fd4e67b65e85b030f183a7f4457fb7d2c3d\n\n# tcId = 8\n# short message\nkey = 70ff24a252d65183bdc6b7c88751f850821141a61246727c3240b4f96088ae3278767a822b65735a28ccebe4c874bcb2c942882cb23f9dd87fe08fbaad5ae72f\nmsg = e18da3ebf0ffa4\nresult = valid\ntag = 878d488754bc796c70e11d5db77acda2e1796d86146e27d862586740c4d488ed12239e6fb4ab2925afc88168609edc048f8572536fae96e149d73d230b18db66\n\n# tcId = 9\n# short message\nkey = dd4e05933d09711ee88cb4c1ceb3600b2b33808bc08d499387b331d9c7af49bc65b55172cf8083385a940e4b864b7b4b73ddf3bd513a6cbcac73878a879b4d06\nmsg = 66948029351432c3\nresult = valid\ntag = 9968a16eff2b4eeecb2f9d11fcb105e8d8ca59ed4e69131c9de599cd8155fa4f33def1195a6b452263aad9265e16d4951841d7cd33c74c475da04497c02922ea\n\n# tcId = 10\n# short message\nkey = fbd32caf8984fc4376d10daa7288db8e6e74464bdd94b448adab4497b319e9a6dcce542f82a7ff2e775d12477c880e460a9eab8efc49fcfc8c5476cb4b08954a\nmsg = 38a2586a2883953cc4\nresult = valid\ntag = e0c69bd034cdec5b48150fdf3a4383456a7626d4405df52dc6c2bc8fe93bd87e369e06a781ed80ba8b1fe1146c4df82b6a514412358b31b77b9b79c7a91ec9e4\n\n# tcId = 11\n# short message\nkey = fd4c3f6b2137513616c28ed4d8638f867ad0b97188b73fc9b36f3d52b82d72a49b9dc1b8b25397eb448054a8d38d838e7a88b4df9c263aea1b968771d5ac5756\nmsg = 86b4e61b3b7d650044ad\nresult = valid\ntag = 29345d7da44e2f228e8d502e29fb655da3676a481f9947c8482502ce070b3da5065589d84c02a05cd774b4bd5a15b668c59bafc192695aec43e5df3a82301745\n\n# tcId = 12\n# short message\nkey = f95baea535f477d22b405c67d927f59a9e042c46297a1681bcc16fdbe1b2cd59675a221351a78075981e7eb4998066768801cbd7a85231114d7f27f9bdf24899\nmsg = 5a34dee4e0982d458efffb\nresult = valid\ntag = 63867bb3e82bd4a5f715b3dd67ba3625666e458c5e3d75804709f80b6dde6f774ea223ba9e2536c60ab636dd12d07b217234a490ea9cae4fe673215d33f8c57a\n\n# tcId = 13\n# short message\nkey = 4d76ae95a123207e01c6d22d8b587e63ba682963e50961afff531160a9b9aac6c772c5e8bf918ddecbeb56455ea64710e51ac21e3bb9af4b24eaa8535b3c2924\nmsg = 2c31f2d986f68a6d6a96c4b0\nresult = valid\ntag = 9d4f9549ac134a6f60f17fd0fbc80f55426afa73cdaf84a806d98dfffc94263178116f76aadca95a9243a9128f5f66d3e7f33e72603d4b35ab90ab7d1e870ad7\n\n# tcId = 14\n# short message\nkey = 0da7fa1f5d217951e3e343cda81f232deb71764eb49e8510bc28dba8eb62afa2a98b6f0536adb10250c74878fe649f47bbafdf3f722fa150f66e83f65f606ab0\nmsg = 83511de190663c9c4229ace901\nresult = valid\ntag = 11bd76ba2fd5684e3faadd44abc05d32661472ae4c75fd69e62e47a2d462e483ab5fd374070e648017250934d486fed55e68f4338547fb5dc54d4bed894c1c2f\n\n# tcId = 15\n# short message\nkey = cec9e9f25ed9a017004a7882b1e44e8bd8fa3203c50cb6058455ed4f2a036788d46fcd328327d0d86b1abae69f7bbb96e3d66373ec8bd45075890879a83f4d33\nmsg = 80dcd8ba66f98b51094144e9b8bd\nresult = valid\ntag = c69f1787bf7804bfffd9da7e62f58c1c9f599ccae2ed4fc6abda1be48620afc797d59d4adb396e1fa5d18b8c1aa1c7c15218a9f9e3aab226119adad742641089\n\n# tcId = 16\n# short message\nkey = bbe25649ecdf54ae0028fb923cc8c28ec00e10e2d44214590781238a143b75d54efb037eb9f53082a8ab3d8876daf4dbdc2483c4ba222797fe20da3b7730368b\nmsg = 33f630088c0d24cda98caff1a3afc7\nresult = valid\ntag = c803ca833e851418a3d9ed764f8c83f481060141eb1b2bf64d7ee7991b041c48bfc747bce13d69722f63944085cef8e7a166270530fe31a2a525a99b8a75f1b1\n\n# tcId = 17\nkey = f5e2b9e2313f4f807cb3a924a7d4943fc3fb475d8f1a1b40ce09a37770f621af8977729cadf986c98c75f08a4fab4280538e09e7e51e87a8d62c03411bdb8d24\nmsg = 74ef623c83275ae99745bff7e6142afa\nresult = valid\ntag = 471055f7a2d44758e7d7837db85c33626b8306760eb45e18d4ba8dfbcd0d4279fcf8b539ef7b165eeabf5457ee2c41e52d07e9121da02c988f08162f86bdf208\n\n# tcId = 18\nkey = 8e323d5fb4752d92a6d905c512b287d07b21ae50002d026ff0388e1593bde9998dd02321e200d148f5fa2e824b37e9f5a77441794b840bedd552d1051c1ddd8c\nmsg = 4daa229b009b8984354c2ec3e7973e0042\nresult = valid\ntag = 93a2137cc84e2fa1439d7c239767b3ce653d634c58a4590eb61af9d3ef986445220aff3554de45a1b0933fa06d3d64460418910977d8d9ddb2eb04963c816841\n\n# tcId = 19\nkey = 465bc1ab2125cca29729d01df044e393b0677defdd939280a3aa141224efa06457e623056d02f6c36eca3dfc4a7476dd36b97d0c2d60c7672129189e73b6af8f\nmsg = dd84599b47ba9ae9f2ad0c8eac678485433eb6b1dfb7c998\nresult = valid\ntag = 9fff43a83c71833211f9d60eeef4166965c41a37c76634b1bdf9c5291df75dc877668f2287bcf8108ea9e03d061a708db2db08687eda61fa97b1ca92dcf22b92\n\n# tcId = 20\nkey = b90226798dff2ffb91d1ee4103f26397d0bf84c13c1ec717392c5fe1d4d0f4dc790236d759fa1be852e305da585a3dbde0d3912bea60d6b140c25645eb00943f\nmsg = aa29c372f136993c65ace5e1d62078806eb787913bb35af33371056359d354b2\nresult = valid\ntag = 493a727536b07d434a7fc8df6b70989148a8d94cadb9761ad845ac5fde2068f9565e68607b531b0f307d7c17ce0a2ba69fb1ac1b0c716f93904eec75669e70b7\n\n# tcId = 21\n# long message\nkey = af1bb91775cb40c73983f119c927a2ce8f7b954a6274ecc1cd96019e5c417af4b094376194eae71c7f68f3345654d5d9f8198a697b41ae251e82308accd935bd\nmsg = 75ededdfa7f1df1dc144fb195b27e454640e3f897cb564222f05e8aab0c6024f90472afea6e7254ed25134ea43452a\nresult = valid\ntag = b53d564086a745b10d88a48b50ed8b53f4c83fd12bf56a75108074de9b343cdf0668ce8b6a3d884ba2da5f4c957f1319e26c0813c99a4269c171ad80981013a2\n\n# tcId = 22\n# long message\nkey = 513e0e7622eabcb6bfc81669dac903df46daea1240f32248bbf4fc61f1f9b13b2c3fe1bcc97540d30065be9eee41e51748bc42c16a8c8269fbe2b6f625c19228\nmsg = 81d8650937f50871a66af71605ea4fa9d6c5d7a375774c2280eb34aefcee8c0ef83345bc547e4de7cbea482369b25a93\nresult = valid\ntag = 9d942e4585742ba118bda6e132510af3b9297047d364f76b2a0d1fc803849b06ccac0eaa427934055c9d2e5a5da19cf17299ffdab65089580d10ff7207c9ed03\n\n# tcId = 23\n# long message\nkey = 627c9a72247d07b0cec8346277468311c7401fc4cecaea8e22e13ece4b352c8f7a7eb1ba81ce348a08670438c97b8d9e883614d550f1ff16d636975c59988c2d\nmsg = 118e0468cbb52f93a3396ebfaa114881a98a4101f4ff912ced47ecfc73b27f52205b7a5d4f3899506f9e34ebf99460da7a\nresult = valid\ntag = a186e08c7731d4bbb1d5342a105ef48f5353c5c542277de607831fcbbc8d0b9fd509c74bf9e352ee739792ee3cd6382f",
     "96e70adb589fdf1fb031d43eef1a595f\n\n# tcId = 24\n# long message\nkey = 1e981d0cbbad5bea9480d836b4704bf3147663b6ea59e1e0a280fb45d9b85d445dc972159dde301c6f1e66681f95642dbb9a9218c00d0cd724cb02f3bcaea2ea\nmsg = 440dff390688c9fde31c17fdb61c1d13899f9544a986324c34d5eb07bef9a4436297f4a7fe16de5dd7b24e0c7c129051efe6f2dd0a21aec05c3e3c8f6fa30d9c0cbd60d840d14f0b2a928bc7189b9de4a6a731151d6b31e6a0ecae75095434737be8c3db11a6a697d0616c78b97041de\nresult = valid\ntag = c52eb5d18e90687248342a84dc0241c680e992b88b1409275df7e347c99169a50cd780eb4726ad759e2a027fb091354e3d7c7aba8a21f8acd1d0e21236af5f98\n\n# tcId = 25\n# long message\nkey = ee8aea2a52eb7e0c1120ab736b1a825b12610063de9642c594766c020cb87314d8ac94b13072bfbf3c019b4aacb1d2695cdd7563a26f574e12559906784d853c\nmsg = a3951f1d18135602fdadceeef5741c24ad22756160d0c55e51b788af952adaeb13e18c24c6b09672f405d7ec3d49b0bd86c7f8691b6f69af49175423215cf57d7c08a54ab0b0293e685c9aa250f1599d78193a00af822dec4b56fdb41f0343ab2cf85ea27bb2e650930f5e8ca836833903b053b3e06899b4012a6532978d90\nresult = valid\ntag = d3678ca7c5c1aa21f12eccc21a1add0b3eb12ccd134033570468191e51b058c61f2a7d88f2ca6c652c29c65c491bf1f0252bc157bdd77436ff55204eac6dfb0d\n\n# tcId = 26\n# long message\nkey = ecd1861a12eaee48aef1d7ed278223b50d3416dbff81e976c56ecd4b1a1bc8892b584cbcc72370ff5e976a6af1790caa32f9ea912855914c0315979578fbf165\nmsg = 5779c56373a8e5db43bd65c0453ce23144230d43666d717a3b59d2e90f0e10732376831d7281cb23dd5566e5f8c627d00d39650139ceb87cd47e921d65d6c1cc7712ac4bd75bda8828e68abc968f4160ed91b28946c9d706b0360bbbdd65f47ef9983c50f2d09d05c3674c0943ea4af54c381089f9b846dd69ce908e0f6eaaaf\nresult = valid\ntag = d377e4efc39f25ca751452e79dcb5661f8adcc06570bd3f710e03854e032286ca477e6a620647958fd31706463b542ddf617757875f349c61109358d04f6dc58\n\n# tcId = 27\n# long message\nkey = 71aadbf330ea133b46c939d12e603896902e8df638597c98872dfb5aecd5161bc84095221de3222367012f45c6d70701e862ab000e782e91b505b21b4e212c38\nmsg = e6d7b0280d2f7df83fd26562fcdea2597cf687a9c9fa194f655c44d3271b881f28adc436db8e0437ff4dc5d38356271c338829c3e2d9ba4ac1777c94886983d4b72c275bc00e4f7b06c5ce38a2fe549fe53761857f236da705fd03790b41cc6f759f41aa206feca7ba5486f4fc9d09f35c8e0887241291882010414ae41b8b384a715a409be13da17bfd60d3fbd4b8cb3cc7c26043807264a20b9a5c02725e742fff03e1806b38af357ebf8c79fc4c38b007bf0613286cf063e45482375475e6c426d4f70057cd92efcb2dfe86e45bdea399273a5e0f142221fae206800555c01b18533295f577e23a9a7a0aa072823002b9096501174d3bc4aac33e0dc600\nresult = valid\ntag = 0c1cbb2f196d3d1af5f982a330bf1d9accaada72cf6c254658cb32bfd8705481abd2e163a73338700f0d961ca02a31b600df04faf311cd06498557831102f80f\n\n# tcId = 28\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d39b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 29\n# Flipped bit 0 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = be301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 30\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d09b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 31\n# Flipped bit 1 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bd301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 32\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = 529b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 33\n# Flipped bit 7 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 3f301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 34\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29a9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 35\n# Flipped bit 8 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf311cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 36\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9ebf87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 37\n# Flipped bit 31 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301c3fb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 38\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f86809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 39\n# Flipped bit 32 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb466720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 40\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f85809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 41\n# Flipped bit 33 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb766720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 42\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809606f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 43\n# Flipped bit 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566728e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 44\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617",
     "18191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f24109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 45\n# Flipped bit 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e22f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 46\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686734109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 47\n# Flipped bit 71 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720ea3f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 48\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f36109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 49\n# Flipped bit 77 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23d166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 50\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34108fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 51\n# Flipped bit 80 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f167e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 52\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc618d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 53\n# Flipped bit 96 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24965c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 54\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc518d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 55\n# Flipped bit 97 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24a65c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 56\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fb4718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 57\n# Flipped bit 103 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e2c865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca52\n\n# tcId = 58\n# Flipped bit 504 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388d\n\n# tcId = 59\n# Flipped bit 504 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca53\n\n# tcId = 60\n# Flipped bit 505 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388e\n\n# tcId = 61\n# Flipped bit 505 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca50\n\n# tcId = 62\n# Flipped bit 510 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb038cc\n\n# tcId = 63\n# Flipped bit 510 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8ca12\n\n# tcId = 64\n# Flipped bit 511 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809686f34109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0380c\n\n# tcId = 65\n# Flipped bit 511 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566720e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3e7e2dca7b011bf4cec4c7e7d6cc41bc10c3be36e8320c50aaf6c35f04ac8cad2\n\n# tcId = 66\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d39b9e3f87809686f24109fbc718d6abbb09c278cf05a206adf21463e1170362122e58272a31679720b254cbd63a7c6d696bf9283f9c6897e7d792483bb0388c\n\n# tcId = 67\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = be301cbfb566720e22f166e24865c396f21619c7c15033cc6e8ebbcc8c5c",
@@ -3530,9 +3629,9 @@
     "c396f21619c7c15033cc6e8ebbcc8c5c5b23\n\n# tcId = 147\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d39b9e3f87809686f24109fbc718d6abbb09c278cf05a206adf21463e1170362\n\n# tcId = 148\n# Flipped bits 0 and 64 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = be301cbfb566720e22f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3\n\n# tcId = 149\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9ebf87809606f34109fbc718d6abbb09c278cf05a206adf21463e1170362\n\n# tcId = 150\n# Flipped bits 31 and 63 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301c3fb566728e23f166e24865c396f21619c7c15033cc6e8ebbcc8c5c5ba3\n\n# tcId = 151\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d29b9e3f87809606f34109fbc718d62bbb09c278cf05a206adf21463e1170362\n\n# tcId = 152\n# Flipped bits 63 and 127 in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = bf301cbfb566728e23f166e24865c316f21619c7c15033cc6e8ebbcc8c5c5ba3\n\n# tcId = 153\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = 2d6461c0787f69790cbef60438e7295444f63d8730fa5df9520deb9c1ee8fc9d\n\n# tcId = 154\n# all bits of tag flipped\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 40cfe3404a998df1dc0e991db79a3c690de9e6383eafcc339171443373a3a45c\n\n# tcId = 155\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 156\n# Tag changed to all zero\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 157\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 158\n# tag changed to all 1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 159\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = 521b1ebf0700160673c1897b4798562b3b8942f84f8522862d7294e3619783e2\n\n# tcId = 160\n# msbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = 3fb09c3f35e6f28ea371e662c8e543167296994741d0b34cee0e3b4c0cdcdb23\n\n# tcId = 161\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = \nresult = invalid\ntag = d39a9f3e86819787f24008fac619d7aaba08c379ce04a307acf31562e0160263\n\n# tcId = 162\n# lsbs changed in tag\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\ntag = be311dbeb467730f22f067e34964c297f31718c6c05132cd6f8fbacd8d5d5aa2\n\n[keySize = 256]\n[tagSize = 512]\n\n# tcId = 163\n# short key\nkey = 14d93759fc28f3319ab74b8167c974e800f032344dc2747ec0f4945061a47827\nmsg = \nresult = valid\ntag = 68934dbe948d9a77a5e0a92ed98254fa3b6c93c8bf5eeaa912b7dfdf762b37192c5d8523bcab9ad71b09bf96d8454188d001c7f2077eb641199f5731b9f94669\n\n# tcId = 164\n# short key\nkey = 9fa371f36fb273d514fd628cb938067a4bae32a19a1e045a7d6d7f6de3751cbf\nmsg = 311bbf722d322cd7a0710f480fc66518\nresult = valid\ntag = 16345f6a6ca6e78d4ccac30b48d76691d6442420efa113c15ef127b538b5b024018b7d2db4bc3ed3424251ab6b8b6c3cb108b0beda842dc3e68e63400287e5cd\n\n# tcId = 165\n# short key\nkey = 6313f1526bc220f20dde1e64ced8597279586d1e15aad05ad591d841b369284f\nmsg = f744fa3933e16d8bf524afaeb34c715653a9cfb01fa45fe1fb68e701fe1487ca\nresult = valid\ntag = b88d1ba03e2799200a447550d18e310697a57974f513df77eb07bbe315ba5fef397eeb81ad9071680bcc6c70f6b252ade35b4a4040279ec01b86e40b98770e39\n\n[keySize = 256]\n[tagSize = 256]\n\n# tcId = 166\n# short key\nkey = 1e225cafb90339bba1b24076d4206c3e79c355805d851682bc818baa4f5a7779\nmsg = \nresult = valid\ntag = 23d482a05c907eeb346ba98f83db0f63c2adfbd5b2940f33c7964c7f1799f180\n\n# tcId = 167\n# short key\nkey = 6fa353868c82e5deeedac7f09471a61bf749ab5498239e947e012eee3c82d7c4\nmsg = aeed3e4d4cb9bbb60d482e98c126c0f5\nresult = valid\ntag = 1cf9d2c9c1b55a45190b5beb590cd4cc95e3853df8aaf9f4fef9bbbbd72435ff\n\n# tcId = 168\n# short key\nkey = 186e248ad824e1eb93329a7fdcd565b6cb4eaf3f85b90b910777128d8c538d27\nmsg = 92ef9ff52f46eccc7e38b9ee19fd2de3b37726c8e6ce9e1b96db5dda4c317902\nresult = valid\ntag = d127b7385badf0c76f2b3d8aa9c722333592e01f462fedd35ec664a6f6d52d74\n\n[keySize = 520]\n[tagSize = 512]\n\n# tcId = 169\n# long key\nkey = dd1e0bdbb6b60862176484f3669da531455f1cd714f999c29f08b851055fee8d72186d376c236f4e16cba7a25cba879fb2753deca4459aaebc6f6de625d99af330\nmsg = \nresult = valid\ntag = 7e4f7d844b3ba0e025b66de7cc6227bc50d4e174930251bfff3df36c3900b5b76b00095a896d0f96842e37b6134df40760307699534d6670f138974ee1c58d94\n\n# tcId = 170\n# long key\nkey = 432b311ebcfd46ecfcd3cc706ebd05c787dfbe1855fdcfce8d50c9a00f72b65a8d42acec335b4e07d544c92fd7b1d38543ac6e0fc04c26d88de8dd974af69e24d7\nmsg = 36b1fbe8f1335e7c0399c24730906420\nresult = valid\ntag = 2cfb688f30b10534da9377a4b3fbee1dec161cb288ac8b758793838b45ab953979dadf27817f477c9ebf23cfdcbacb60b81038e08bc4fc3180bd2a1ee805976a\n\n# tcId = 171\n# long key\nkey = 17f720f09df5972af9b9c63e10043284608900d50b7955db3b4e2679cb4120be2c9b9e2aa1a5743eb519792822c326b4d890b5554d1cb0eb71081b7569a2f04df7\nmsg = 57167c2524a55289687b83a40d3a69bc90adc53ad247020b88897f9b95d1516d\nresult = valid\ntag = 4f70267b98fceb4f662901bd18fb4c81ac164281dd0ece43028a3c2a65ca213aedf1bd207f0939bd879bbe20fd09cdeb20246e6539766add08b3adc5143d2bd9\n\n[keySize = 520]\n[tagSize = 256]\n\n# tcId = 172\n# long key\nkey = 8a0c46eb8a2959e39865330079763341e7439dab149694ee57e0d61ec73d947e1d5301cd974e18a5e0d1cf0d2c37e8aadd9fd589d57ef32e47024a99bc3f70c077\nmsg = \nresult = valid\ntag = e1657f44bf84895e6db0810a2cca61a6e105e12ec006f0b5961020301b57744e\n\n# tcId = 173\n# long key\nkey = 2877ebb81f80334fd00516337446c5cf5ad4a3a2e197269e5b0ad1889dfe2b4b0aaa676fac55b36ce3affc7f1092ab89c53273a837bd5bc94d1a9d9e5b02e9856f\nmsg = ba448db88f154f775028fdecf9e6752d\nresult = valid\ntag = 33d5a2d1998a586849eebf8134728485fcfc71248f4a98e622f83b967844c40e\n\n# tcId = 174\n# long key\nkey = 21178e26bc28ffc27c06f762ba190a627075856d7ca6feab79ac63149b17126e34fd9e5590e0e90aac801df09505d8af2dd0a2703b352c573ac9d2cb063927f2af\nmsg = 7d5f1d6b993452b1b53a4375760d10a20d46a0ab9ec3943fc4b07a2ce735e731\nresult = valid\ntag = 88d579c2801905b818070ccebd2c7192f97bb3e7acdcaf613cecc74d0e41",
     "1232\n\n",
 };
-static const size_t kLen133 = 55755;
+static const size_t kLen149 = 55755;
 
-static const char *kData133[] = {
+static const char *kData149[] = {
     "# Imported from Wycheproof's kwp_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: KWP\n# Generator version: 0.8r12\n\n[keySize = 128]\n\n# tcId = 1\nct = 8cd63fa6788aa5edfa753fc87d645a672b14107c3b4519e7\nkey = 6f67486d1e914419cb43c28509c7c1ea\nmsg = 8dc0632d92ee0be4f740028410b08270\nresult = valid\n\n# tcId = 2\nct = e8bac475d1429034b32f9bdeec09a37f9b3704028f1e0270\nkey = a0b17172bb296db7f5c869e9a36b5ce3\nmsg = 615dd022d607c910f20178cbdf42060f\nresult = valid\n\n# tcId = 3\nct = 4c8bcd601b508ef399f71b841294497a4493c4a0014c0103\nkey = 0e49d571c19b5250effd41d94bde39d6\nmsg = f25e4de8caca363fd5f29442eb147b55\nresult = valid\n\n# tcId = 4\n# wrapped key is longer than wrapping key\nct = 9e4510cc84c4bd7abab0a8a5d7f1e6ff3e6777ca2dff9be7e223652239fe57d8\nkey = e0e12959109103e30ae8b5684a22e662\nmsg = dbb0f2bb2be912a20430972d9842ce3fd3b928e573e1ac8e\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 5\n# wrapped key is longer than wrapping key\nct = 8fbf39ae583bd4efa7a3e8f7b86870b34766ae7d8923a8e97b0cd289ad98cacb\nkey = dd583d9f1059861430ec8b5d8a180e9b\nmsg = f2e34f356362a31b51d6e02bcd333c9e6170494ca5ff5487\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 6\n# wrapped key is longer than wrapping key\nct = df2fbe5fa86418edc7b5b04a4aea724aca17e88cedc84ca8b0b0f048e64590cb\nkey = faf5ccfae42b43cee2c5f0f3177a7c5d\nmsg = 4e02084833660c463830483b36dab866c64c8cf7429cac3d\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 7\n# wrapped key is longer than wrapping key\nct = 67f8edf57f84ea0a35b35511d67d3f299c9984b2c07d3809c3d7f5f45091f1a8fbb937ed447677f6\nkey = c2b9d23f2831ddcdeb456853d4014db9\nmsg = f4cfea98e58b939cc859554385cf3a6c7f8217f728efb431c964786de8274907\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 8\n# wrapped key is longer than wrapping key\nct = 60d55a22ba7dbd7d8f317388e01e6be561d15d29f85c566f1259aa7e7dc3d5d30e0ef5f4c6267553\nkey = 620a08f320cdedbf7ae551add348d95e\nmsg = cec34eaf8e67e1ce619ddfc309531c42f16033a7e2cbc4f5eb3a548164e9b291\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 9\n# wrapped key is longer than wrapping key\nct = d78a8291108f0f2d8be0ec10ec08240bf4d3021f0a5ed7faba0748db73762f34a0504bd373212df2\nkey = ed089ac274f8c7cea2415671a94b5e53\nmsg = 6065e41df14daeeefacac5daeb7674cdc9c1f686013b797153e80ef215893299\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 10\n# Round counter overflows 256\nct = 9341221aca1c647e2afc2bdd9cf4ed6e60058eb0a84cb3fc2daf3a87d9fad0a1f8268b27aaf7201d705e72f7e2240309ad98742094e3f1c99b7faa9ae181b441f5004b8bc93cdd4160d403d0884749a3c379d47c112a45788c05c2106c98f59758d393e04c880691b0e8683a12df7f876e1e1f68b4acbae9cc8310b34d59ccf4617cee72e845df1e0e32e5b4938f2923d55f1bb5156dd8c787401e6ef241ea4073d0a59ddfcd7a53db5d89b480b030cfb9084ea8479b964f090bb612d5251eee9ef8870a45f1e76fd24abdd9b350fe148b15a4cfeb032d57b5743b3548a7ce9eec8e21a31ce832530edfd1cffd9bb37369e6463c6b373ab60d80b0a2677e92e658f7daf2a5234b7312bf2d967cd0bc809e9be2f706ae63bd632fd611f161e48ee19677f3243aa0e91f6651a1cef62feff7a72eedf830bae1dc6d89e55ccb5e6f97889c6266f7d3f2eb0aea6c8c42200febccc5916825368adc87e04e835de06fd7bc2805c219e7f0b6252563f29969b1f30cfa1a8da4b90ae7534fb849d068a7e77de7360f8af173\nkey = b6121acad51038e11873aaa7e6c7be06\nmsg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 11\n# wrapping small key\nct = a65959a600000000\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = \nresult = acceptable\nflags = SmallKey\n\n# tcId = 12\n# wrapping small key\nct = 09bcbab50b8dd45ad83412e2919030d3\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 4c\nresult = acceptable\nflags = SmallKey\n\n# tcId = 13\n# wrapping small key\nct = 0cbe852cdce4f0b5333366f446b2b1c5\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = be52\nresult = acceptable\nflags = SmallKey\n\n# tcId = 14\n# wrapping small key\nct = a9dc66e03435ab3d4f97ff66f2c911a3\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 2d5244\nresult = acceptable\nflags = SmallKey\n\n# tcId = 15\n# wrapping small key\nct = 1b970c8ecb4187447e60e6083da03086\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 6c3d3b4c\nresult = acceptable\nflags = SmallKey\n\n# tcId = 16\n# wrapping small key\nct = 0344f7b34ab8ef28aaa843f276b0b3d5\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 0412ab3ec6\nresult = acceptable\nflags = SmallKey\n\n# tcId = 17\n# wrapping small key\nct = 17356c7148334ca1a24aab7e82a66e18\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 8ae08938929c\nresult = acceptable\nflags = SmallKey\n\n# tcId = 18\n# wrapping small key\nct = 1db7510a55591a455d9f8167e6db3c88\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 7c8dfbb68d72af\nresult = acceptable\nflags = SmallKey\n\n# tcId = 19\n# wrapping small key\nct = 936fe58b629ea6ec158145218f2361c7\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 536f8f83b64771c1\nresult = acceptable\nflags = SmallKey\n\n# tcId = 20\n# wrapping small key\nct = 6787816804b3127d0ca4073f1dba5c4d3db1ec9c227e6556\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 8571f282b18b64ec5e\nresult = acceptable\nflags = SmallKey\n\n# tcId = 21\n# wrapping small key\nct = 34131c3bfcc48af15eea8672e52927b462f81d5ba0e6260f\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 8ada889862813e364c4d\nresult = acceptable\nflags = SmallKey\n\n# tcId = 22\n# wrapping small key\nct = 4d1ec9287cd4dd378b9aefee79d4ed35bcb98ad9fa9fe529\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = f9c56e8058758a5c7c2baa\nresult = acceptable\nflags = SmallKey\n\n# tcId = 23\n# wrapping small key\nct = 7209f5b6bd5d4916f4995d280e9aa89edd5e96e3c9283ad2\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 7c7dbc83fa62206a521ed4ad\nresult = acceptable\nflags = SmallKey\n\n# tcId = 24\n# wrapping small key\nct = d85a1efc6ab3a40948f723d9810a5deb019b3ce0208a0d94\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = a6614daf00df6d14f50388bad5\nresult = acceptable\nflags = SmallKey\n\n# tcId = 25\n# wrapping small key\nct = 43509b5df3688b6e44c1a994592f4c03da34712f886e63d5\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 450580a47d7008321496bfb82f48\nresult = acceptable\nflags = SmallKey\n\n# tcId = 26\n# wrapping small key\nct = 16e369351c40f220d3fb1197f35da652a3a40ca3b1e99bfb\nkey = 1abf4b7fa2bb62a78f09ddab04625dca\nmsg = 9efd21e13855eea8907afdcd8935f4\nresult = acceptable\nflags = SmallKey\n\n# tcId = 27\n# Modified IV\nct = 4cdd2962f23ec897d41d14c3f818516c055799185f459e2d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 28\n# Modified IV\nct = de895192c35ec58ee6e5614fd2b20a85f8e9c8234cdc5319\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 29\n# Modified IV\nct = 4a24069a050af7bbcf6c2160d54525e017e3ac1b3a2e71f0\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 30\n# Modified IV\nct = 6252ab0e688d0638df7d87ec5be3b2f9c0c245c0f0794012\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 31\n# Modified IV\nct = a2ed5982a604512d85d87630cd50705b1a70189b81575e3f\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 32\n# Modified IV\nct = fed7d02db4081728c55cc17f45f267117347e526f4231651\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 33\n# Modified IV\nct = ed37722b94b08b6a6f7663fe90acd81dc25f85abd2f65c06\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 34\n# Modified IV\nct = 0adb0f47b890efed426e7cf5dbd67d5cd3d9d4807c34bc7d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 35\n# Modified IV\nct = a0c51e687c46f342c78e3c59eee076a85312206a37213ac3\nkey ",
     "= 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 36\n# Modified IV\nct = 8ac142d100eab0808b5f34ed29650163db77ab281e6f1e58\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 37\n# Modified IV\nct = db345851a09bf92c35855c367c8787e5ab3ff16e9d8b0f3b\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 38\n# Modified IV\nct = a90cb672f232eb693a290523a10d8f988a18829a11cabd96\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 39\n# Modified IV\nct = c9b3a55603e490c450b49c8b79c9a169030e6985b6e95b54\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 40\n# Modified IV\nct = 1c90d7613c7e81e66d9374d72a8a6a0c40163fc69bccafb1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 41\n# Modified IV\nct = e381bb56d1354e40c01cb414118b9518934c9ad92663f5e8\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 42\n# Modified IV\nct = f2a87686a3baa37810eea23232e9b784f628b1c0b4a557a1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 43\n# Modified IV\nct = 36ef8fc13d0f1f5745e3939877b62b8ecba2f5f0b19f9e90\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 44\n# Modified IV\nct = 7255c4eacb4105a68095e9e5b5a4bd8f9623a0da5c6fc230\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 45\n# Modified IV\nct = ea26eec89a46ff1a628834c7247a8e4e45d8a8d3229e26cc\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 46\n# Modified IV\nct = 508593fa85a8effd27c8a225981978fcec6e992eb488c9c2\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 47\n# Modified IV\nct = b8a4cb22f15529864d4ced8e8abae69752a9045a084dfc3f\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 48\n# Modified IV\nct = a0a6bf5e47e89706932b1057b680c3c81dc4d9d0b4f9153b\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 49\n# Modified IV\nct = 11f3af4ed30e77520517c880f1d0c272a89a968dc697cb5a\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 50\n# Modified IV\nct = 6fc912a0bda73bacfa93db4002f18f349fa30f22f7a95ab9\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 51\n# Modified Padding\nct = 96518bcf3d24b1c6c3c6ed642a3336531563abaa9bc19873\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 52\n# Modified Padding\nct = eceb8904c71372a974dcf65e2ee2e8eac035953cf41bf31e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 53\n# Modified Padding\nct = e8e1f4d621dc0d10786823eefd73e1d98873900fff79cdcf\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 54\n# Modified Padding\nct = 5aae3ef6d59abbd1acfba77d5e660a176b45683165398912\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 55\n# Modified Padding\nct = fdf11a815beb61c33f293801c33e681e296782967ff6c56b\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 56\n# Modified Padding\nct = 62cd9fd59aa08666b6d0e5fb0ed60b3692e87e680ea1d3ea\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 57\n# Modified Padding\nct = 31a9c782cc94c6fcd26e0aa6ee327fd01c5b1997ec70e22c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 58\n# Modified Padding\nct = ab29c3f5a4822bd572e43fdf2c59c2dab20327b9a25dcb87\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 59\n# Modified Padding\nct = 078070742b07caa793dfcab4d1c09f8df6a99f494ed00ea4\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 60\n# RFC 3349 padding\nct = 3731038571c35f7dcc55e48892de353e54c079b89774bbfd\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\n\n# tcId = 61\n# Invalid encryption\nct = d85c6bfd092df1aeae5a548e47aa7681\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 62\n# padding too long\nct = 7a92427387f5587ee825d1ffa011c40286844ecdadce31cd9678338694ea2682\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 000000000000000000000000000000000000000000000000\nresult = invalid\n\n# tcId = 63\n# padding too long\nct = a437d354606ae752894feb62c8def7d17046d8e47f9aed755fba48b3a3009e3ff67d34e26a779064\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\n\n# tcId = 64\n# incorrectly encoded length\nct = e8d240d64f16d1522ae2ded42ced257dfec158ff2fe1467d\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 65\n# length = 2**32-1\nct = 6d1bfda356b7b954e7aaccc6df953322f75be95947b02b30\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 66\n# length = 2**32-1\nct = 17dbf878ef4076cfcaba5f81d7b123d7\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 67\n# length = 2**31-1\nct = 75c23e253478037802fae0f86af9c78d4e4d9be0c3bff89f\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 68\n# length = 2**31 + 16\nct = 55717658c6a35e15ee36c66cce91083b63091f51525c0b51\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 69\n# data is incorrectly padded\nct = 8ede88a52ccb8a6d617456955a9f04c94d87696125ded87eebe3e97e185496d9\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = ffffffffffffffffffffffffffffffffffffffffffffffff\nresult = invalid\n\n# tcId = 70\n# data is incorrectly padded\nct = 5b4a8f1abffa51676ac8b5ddf9366c12\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 71\n# length = 0\nct = 205cc6dd9592da0ebff6b4b48a0c450eeaeb11a60d33f387\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 72\n# RFC 3349 padding with incorrect size\nct = 908a68b0d2054e199220d37c34a2e136\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 73\n# length = 9\nct = f84bdb15045cee3a8a0f3ed2f07c1771\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 74\n# length = 16\nct = 7592b1ee6ee92c9467db366adcfa65bb\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 75\n# length = 2**31 + 8\nct = db93a1db3b5babc80a304d527682c1ef\nkey = 48a53c11ef2d727db7eb9a834b134ea9\nmsg = 0000000000000000\nresult = invalid\n\n[keySize = 192]\n\n# tcId = 76\nct = 5c117a678223cfe5ee691503061e7ab1e5f720e005171b32\nkey = f75a2f49a630c7dc91626b00ce029f0bd2981d7c74a93ebe\nmsg = 9adbc00c710b1101bdf6a4ed65b32d72\nresult = valid\n\n# tcId = 77\nct = 6a7f9e03b6f379c56da3a56d8f32eba515454a91fd417449\nkey = b713f6b7814f98894d7b153974684359f1460213eb74be68\nmsg = 78585f0c49922e82caf17ebc3721b4db\nresult = valid\n\n# tcId = 78\nct = 764097f5ee8236bc0d93bbcea139a652f4b211cc33a61ac9\nkey = 13ecf423211caa334ba6db37259a535c20de8ad10fc8c432\nmsg = 4fc75d0f221e22408a37e11265d49a05\nresult = valid\n\n# tcId = 79\nct = 04b83ec803a75bbcb2f87fc6f488a4ccc1827b412483070eed195b6f0048ccbe\nkey = 4417fbbea51bdd91818d74051957dd70e135c5cf3732bdf1\nmsg = f5357da9f8fd4a1190f36e9fa09a90fcf14d87d62332f1a5\nresult = valid\n\n# tcId = 80\nct = 46ab71f032cb1ccbcc7447a5183574268c0167a26a93fe8422bf284417aa93ea\nkey = b3f26d8a22fdd61f709841231fbde695b3f28dddced6d41e\nmsg = 0d0af955d2e3829cc3d643219b301e64e0510dfbc428119a\nresult = valid\n\n# tcId = 81\nct = 47ca298ee47b1b755a499129347e11e7a25754ccb6c2689e8eff270e98c81d18\nkey = f70cfb262c729a18206c8afd74356ec7e049d10b44a6e000",
     "\nmsg = 241cedfa64c4e7bec541a2eb4c368269e0f0ddebc58267ea\nresult = valid\n\n# tcId = 82\n# wrapped key is longer than wrapping key\nct = ecac4c91758e1ae7bb010c34f4c5f99a3d728b9fa92cb778d3fe80d777a20d3de85ef46e7a0c6a6a\nkey = 1639f9f81e53e2eeb677a249e5eced3af108971301601a7b\nmsg = ec3c6a1f1a9585327fe658490c74635e5300876da5846a629398984fb551d691\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 83\n# wrapped key is longer than wrapping key\nct = 39b7326a44eaed08bffbd4aeaf3e2c3f899c1fd049384ed7b3eb92b788c6449acd6385f0bb18cf28\nkey = 1f22d5658aa685b8ba8659dc342880d5b2399e6a815005b0\nmsg = 50be4c1b2f29a63f44d7fc63737f600f0194ea3fb36e173d2ddd19f218656380\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 84\n# wrapped key is longer than wrapping key\nct = 3d2e9f39c7b13e9585227c4344fbe596f92b002456616f137deacc6a8c941649ce294bb2695c1807\nkey = 3a2f4aa50441954bba5a1836294ce071f9296b23dbed6771\nmsg = 65da02ff21b483a1e39575490b4319e84ae0299f1f00b3859fbe2e74b3ec2aaf\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 85\n# Round counter overflows 256\nct = d6aacfb52c26baae78c2f54259a4e4168f817064344e2ba8fbfa7fae9f1fd69bd5bc5c1e20a6101b4a7119cbce028e25a9e93d29ee260c4e609baedee788411c2afe60218ce1b0d28b9c29b941251fdcbac3009d59040a0337b8b4a3a020c6d8f310cba63db046d8f36b64c9092e75cee463fc7692ef56bed395c4579da0ecb02129e45ad8a7f116aac6170204888e40693f017a6a0a7dd3962004e60db3a9b6c8b7614a467ccb799bce1ba83f5c0921f1e52bb3909bc0486ec0eaea736498f3ba520a519c3ddf491307958620b737613417b15b438b80b43189baa455031f5771502002ea170c767b33d247feebce62e606f2262537f85f18d1951cc75cedef291c6a501cb1778586249b58156eb8d7283a3f508ee8bcc1206d77bbd6892fe74b865bfc02a8f07223087a6c1e50a41b7cf5f6ee04bd07766b2e5b34c4a7666b0ce06f670e6434a59fb74e0df36c91d94e5e8b721e53e09b6f6504c5d515492a373fcc348a63122cc6e4716e0e1a543d038c6f7731199f691780a8a655cca6718e3dc56e815b3669\nkey = b6121acad51038e11873aaa7e6c7be06f93826b74fec0ea1\nmsg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nflags = WeakWrapping\n\n# tcId = 86\n# wrapping small key\nct = a65959a600000000\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = \nresult = acceptable\nflags = SmallKey\n\n# tcId = 87\n# wrapping small key\nct = 52c7f388d0d4237afaa29f2b94723475\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = a3\nresult = acceptable\nflags = SmallKey\n\n# tcId = 88\n# wrapping small key\nct = 833431ce8799be69b36aafe3f38d9dac\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 594b\nresult = acceptable\nflags = SmallKey\n\n# tcId = 89\n# wrapping small key\nct = 31674f46b989f6ead582c70dedc8c6b9\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 72ab34\nresult = acceptable\nflags = SmallKey\n\n# tcId = 90\n# wrapping small key\nct = 80535172d2a498aa31601d70fdca9dea\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = d4d9460f\nresult = acceptable\nflags = SmallKey\n\n# tcId = 91\n# wrapping small key\nct = 56232300dd7b2a71d2328b6df47af8e3\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 643972e552\nresult = acceptable\nflags = SmallKey\n\n# tcId = 92\n# wrapping small key\nct = e27e08efe39adbbad8d300b87be2c258\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = f3cdb73d2561\nresult = acceptable\nflags = SmallKey\n\n# tcId = 93\n# wrapping small key\nct = 8f90942cdab33e58b24a23ad7efb7538\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 7b0b53b6429e14\nresult = acceptable\nflags = SmallKey\n\n# tcId = 94\n# wrapping small key\nct = 0ebaf23c858015d3bda5b8d908db6049\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 6b2393773e6d1378\nresult = acceptable\nflags = SmallKey\n\n# tcId = 95\n# wrapping small key\nct = d56f89977b8eff511158edad6b993007189e5a4b8c0e2faf\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 2c52d6639e769960e8\nresult = acceptable\nflags = SmallKey\n\n# tcId = 96\n# wrapping small key\nct = dd889475a76733849f59bed49a15d4315bdb5ba00dc63470\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 707c9356216d69c69048\nresult = acceptable\nflags = SmallKey\n\n# tcId = 97\n# wrapping small key\nct = 1a9b3369239b0f40a8dc5bd8d965caf7431445799337b99b\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 615f6fa79e1847e7359a8a\nresult = acceptable\nflags = SmallKey\n\n# tcId = 98\n# wrapping small key\nct = 5232f8f6679a17d3303b0bd72b06b56b5089e80372dc295b\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 7f5e999168ec60624426cbb1\nresult = acceptable\nflags = SmallKey\n\n# tcId = 99\n# wrapping small key\nct = e5544361c60980f3d38f2d8820a150f48f49ef3f9184b29f\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 3f93aaf4463775baf6c0c975ae\nresult = acceptable\nflags = SmallKey\n\n# tcId = 100\n# wrapping small key\nct = 55396065905915ec914b8d1efbf471e37d283fc2c1496b49\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = fefcf10c976309b2beb085771e50\nresult = acceptable\nflags = SmallKey\n\n# tcId = 101\n# wrapping small key\nct = d90376be302a24c541bd6d96094f0025e3d73888391b4306\nkey = 1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b\nmsg = 6854354d0099f7eff740b0587140b3\nresult = acceptable\nflags = SmallKey\n\n# tcId = 102\n# Modified IV\nct = 24f5b27f9e4d7b645331719ea8f2b63841b2324e61ce13df\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 103\n# Modified IV\nct = 5b5221464c7e960b31c3d6e5784e66c69fa0fba8ae315d4e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 104\n# Modified IV\nct = d17e8392b0d7e064f22770b7f38ffcdc572cf7694da9648c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 105\n# Modified IV\nct = 2f9ba2d81292a2494845ac8589f1a44affdd3d09044fc81c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 106\n# Modified IV\nct = 9258882e1812b1793c0cc08d6adc9fe9597d9270b1f0c3ef\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 107\n# Modified IV\nct = 8bdfb51ff4664220de3d87e06882c748490af56c0c5ef789\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 108\n# Modified IV\nct = 20a5b0fc789e8422e09a3128a10b6b0bca6aba2bde496aa6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 109\n# Modified IV\nct = fdfde90ee4681372c85fc5875dd482cef85bf69dfe57e71c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 110\n# Modified IV\nct = 5f2ba1d716b8fdee03f3fc5cc4c7ea35836bb3c073f02dc9\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 111\n# Modified IV\nct = f241ce804660d60397789d4c67f4e252b55838144b199355\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 112\n# Modified IV\nct = a4f5b4f3ef5a6939949fe6dfd755f327ffa604dc417ea495\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 113\n# Modified IV\nct = 4e23f48297480d1a4afc85fc97d6d69f861f518bc00fe7c3\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 114\n# Modified IV\nct = d9f0de809d4f6ef5815a3e6bfb09b11f0b51b6180caac98c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 115\n# Modified IV\nct =",
@@ -3541,18 +3640,18 @@
     "\nct = 60107f4c60c04c987c7c5810130303bd83fbc35d924f4482\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 189\n# Modified IV\nct = 38e8d42ffc1a26278c6fad73bd699f207251f6e1b622bf92\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 190\n# Modified IV\nct = c23f1fdbe6c021a04bfc386b55c8fe911481f82edf308d79\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 191\n# Modified IV\nct = 7cc6af073f8d21e26713222ba609c91b69fc5faee9870eb7\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 192\n# Modified IV\nct = e7e5d96c0bc89dc23bff610db5ccfb5de8f97b74100b3492\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 193\n# Modified IV\nct = 18e77b855e322457a4942209f97acaed1fe6af0aea80c454\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 194\n# Modified IV\nct = 0fcc89e543fae40b914510c9064307b70ef12de4c8750874\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 195\n# Modified IV\nct = f795cf444efd94bd6a561d8cb0703ee0e979c073aa66fdaa\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 196\n# Modified IV\nct = bb5d2e4082140258d6cb26a74af7c10f985e4a84dcd5d8d6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 197\n# Modified IV\nct = 47819be55567934b165a6e93ca25d3900103bedb86eab148\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 198\n# Modified IV\nct = 41b70a974d3fce94feb94b7b01d959541cd120f879cf60e1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 199\n# Modified IV\nct = 86b9f13e871ecb5aa009c80a31693336e59ae1ed3c8d7aaf\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 200\n# Modified IV\nct = b17c3957d85127aae1ae0a04096b19eb2e0f67583772182b\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 201\n# Modified IV\nct = 2ca5c335226e3e171fde0f3401ba6835fa389f30f5288699\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 202\n# Modified IV\nct = 5b8ba944f4a961d6e4c5121279ea4d3fcd555b05e75da4ff\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 203\n# Modified IV\nct = 7fd3ad3aee0545da1ed3a54d5a198a2c76cf8290c011c042\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 204\n# Modified IV\nct = a24e94c12b2e6b776c8febe9179521beae0cfbd507d358b4\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 205\n# Modified IV\nct = 9395b071fa3d9908b2e1b349bf7cd6a1cfc86b979c8c73cd\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 206\n# Modified IV\nct = 1eb452770bc0f26a3576b604bf5ac72f714fc468c357eba7\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 207\n# Modified IV\nct = b42bcb4161f40b30f3d2f740f43e441d3c9a39613914f1c6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 208\n# Modified IV\nct = f3d76dd320e5f1b3f85b8f73a9ebcfabfb8346daafaf36e6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 209\n# Modified IV\nct = b8e26164496942f44f16751096fb47952ec478bb288e72a1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 210\n# Modified IV\nct = fa783b3aca0ec1e677378f23ebe937776fa590ecc6b01392\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 211\n# Modified IV\nct = 8b011408049eab81cc185796b9636982c1ad28e940e5c35ab1219434c23e8c59\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 212\n# Modified IV\nct = 08db2f06aa2400d4cc1113b1c9e3ba1b39e3e26a84918f9266796c426c166428\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 213\n# Modified IV\nct = 3114404be000ee167b65dd3cfae3b10c50dffe1df864b5e52a2805f0c80021c0\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 214\n# Modified IV\nct = 405ae5bdeff8b05d28ea55900b8e81dc789d532ec3fc457730819e762172f751\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 215\n# Modified IV\nct = 7c19e66d21c0f1409ee6f03a36ab6ba532349e2567200b95d7f5012b2b7e5d33\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 216\n# Modified IV\nct = 955ac67d6e496b9b93a4dda8f6e65e668f1326b256ee146a7647ba18deee7986\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 217\n# Modified IV\nct = c8600aa18be27279493fd68c84130c8bc328b0f6821e01e892b6c2dc1c005270\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 218\n# Modified IV\nct = 492566e0dc539e234b08b95fb23594a6d14f59fa4367799495c2e7f2993135ec\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 219\n# Modified IV\nct = 0b0aa97121bb8e367b8e80e6518a786ab686f4d6b8a075c3abe534698ec462e09fba981615d43ebd\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 220\n# Modified IV\nct = aa6eaa5b94f39247b9581c4d3120ed71e6a427eb51b2439f245d1762041dcf50741fc53fa7a95579\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 221\n# Modified IV\nct = 5cef33853f321f523951a27e41a68dfca418d5b8560484d3f233c5a45e7b69e7a6e4893e690cde6e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 222\n# Modified IV\nct = 62e120f39799ab7633fde15836b89b28a8ced5ecdc421939d8657e41fa1ea49a54da75b51b8dd3d8\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 223\n# Modified IV\nct = 9dc7bc15dfbc7da1a6f74bc4dfbc70091f2a180dbb76f9a6e9e18bcc3c11d2b56bed36c58c7dbc65\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 224\n# Modified IV\nct = e7ee36c6321ba0a30906b25e087fb0cabd74fbb0905b015ccc246cc90e5684605898a5a77983e897\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce",
     "3497352690\nresult = invalid\n\n# tcId = 225\n# Modified IV\nct = 75c636384c4210ea46422f31a5622d001e8978c2b0fbbb79ce3d7c4b46bb3c7c2c9d4182571ae515\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 226\n# Modified IV\nct = b0116ad877c745d609f7df14b9225a2d69ab56f2e74077e34607b4e75a2883442864f17ca19af259\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 227\n# Modified Padding\nct = 64956d333265a8f2547756feab37b81f97786a4ebf491f13\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 228\n# Modified Padding\nct = 6ee239e916d27f8a8931740fda92657f98dfc68e5e3984da\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 229\n# Modified Padding\nct = 40c990f89aa7c76400655fd4167b04cbe24145c8c800dc35\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 230\n# Modified Padding\nct = f2a900684f167b9246b1345b8a94e711d9b6ac439f3ef3e8\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 231\n# Modified Padding\nct = cd7053a854fcc2f476c20539360ce47e767563723c11d211\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 232\n# Modified Padding\nct = ffa557ea4960669ccbcf59007a24de06755475c1cfef56da\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae37\nresult = invalid\n\n# tcId = 233\n# Modified Padding\nct = 8672fdfb252c0dc9e3bc39b0fe76b9b08cf87b65c0f28ee3\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 234\n# Modified Padding\nct = fcc2c7a6d2944e7d02ca08e49a7ceb77ee3f5966509b528e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 235\n# Modified Padding\nct = 57bc3a4c7544fe76b92740608a1023bb70227856cbdb8ada\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070\nresult = invalid\n\n# tcId = 236\n# Modified Padding\nct = 9220a6eb9c77a3d6374647afa7a3effb99be7e1f7bafeca8a1bbd93e8adcca6e570484008ee674ca\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 237\n# Modified Padding\nct = 94654a58be6bb6b946ef40ac7b8f1d19e2edff7c2c8c54eb7b2cbb3227c4f9df2cb317795beea413\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 238\n# Modified Padding\nct = 1ae49d65e69886f0f47cbbeb50f07ab5163983916a738a0d8f538c59c8a6e1e9ad229b27418259a7\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690\nresult = invalid\n\n# tcId = 239\n# RFC 3349 padding\nct = ac1a774a5de27e4f9c356e4f62deaf8b7eeee6bcafafd895\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\n\n# tcId = 240\n# Invalid encryption\nct = b3941437f55e7cbc3f88050aff703967\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 241\n# padding too long\nct = 86175acf19ad0b7ac60d1fe4bb7850635e7ec6f8a314f85b6dd3d8f9349ea38d\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 000000000000000000000000000000000000000000000000\nresult = invalid\n\n# tcId = 242\n# padding too long\nct = 791f088847a76731e0d56b9b2dcb28bf9f091a9725790e0a64fc8e7cb3ad50f380297a98e3b1c33e\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\n\n# tcId = 243\n# incorrectly encoded length\nct = 868c34495bd3d7b4e2c1861e7fcbbdb372099488dd96c9ea\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 244\n# length = 2**32-1\nct = 4a8b4aeaa713469bfd9bf88d4072379fc858e40b24b0bebe\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 245\n# length = 2**32-1\nct = c210aa3b5fbf5eac97e68d98d7727f38\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 246\n# length = 2**31-1\nct = e0ebd376e050cc9027b76dfc38ee2c6ae2808cecf480a560\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 247\n# length = 2**31 + 16\nct = 23a693e211c08ab9b222c2ede2db18f437e22917fdff8032\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 248\n# data is incorrectly padded\nct = 003f2916fea6827e01199028d3dc4e03889113f97b1860cc242e5a0f28a0f159\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = ffffffffffffffffffffffffffffffffffffffffffffffff\nresult = invalid\n\n# tcId = 249\n# data is incorrectly padded\nct = 5c25a170d5225a6d66e117c691b37383\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 250\n# length = 0\nct = df9ef924eb59634be5b27cabd33d72bd6be6e01e4672ab05\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 00000000000000000000000000000000\nresult = invalid\n\n# tcId = 251\n# RFC 3349 padding with incorrect size\nct = e6e66fad359a7b63a977788acd297121\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 252\n# length = 9\nct = 76b88ecda760b1af80703036185fc476\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 253\n# length = 16\nct = fd101943f4ab7c38ec68c75d4b3193dc\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0000000000000000\nresult = invalid\n\n# tcId = 254\n# length = 2**31 + 8\nct = 1793a3a9bd146726edbcb9589f20e849\nkey = 48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2\nmsg = 0000000000000000\nresult = invalid\n\n",
 };
-static const size_t kLen134 = 36748;
+static const size_t kLen150 = 36748;
 
-static const char *kData134[] = {
+static const char *kData150[] = {
     "# Imported from Wycheproof's kw_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: KW\n# Generator version: 0.8r12\n\n[keySize = 128]\n\n# tcId = 1\nct = 9de453ced5d4ab46a5601708eeefefb5e593e6ae8e86b26b\nkey = 6f67486d1e914419cb43c28509c7c1ea\nmsg = 8dc0632d92ee0be4f740028410b08270\nresult = valid\n\n# tcId = 2\nct = 8c3aba85cc0ae1ae10b36658b068f595baf8caafb745ef3c\nkey = a0b17172bb296db7f5c869e9a36b5ce3\nmsg = 615dd022d607c910f20178cbdf42060f\nresult = valid\n\n# tcId = 3\nct = 1de093654826f18fcd0f3fd499416ff22ed75ee12fe0b624\nkey = 0e49d571c19b5250effd41d94bde39d6\nmsg = f25e4de8caca363fd5f29442eb147b55\nresult = valid\n\n# tcId = 4\n# wrapped key is longer than wrapping key\nct = 9c3ddc23827b7b3c13105f9e8b11523baccdfb6c8b7e7825496e7a840bd32aec\nkey = e0e12959109103e30ae8b5684a22e662\nmsg = dbb0f2bb2be912a20430972d9842ce3fd3b928e573e1ac8e\nresult = valid\n\n# tcId = 5\n# wrapped key is longer than wrapping key\nct = afb744aaf746dcc0b57f8b378c404cbe877f44cf3d45140d60814eda3f541f01\nkey = dd583d9f1059861430ec8b5d8a180e9b\nmsg = f2e34f356362a31b51d6e02bcd333c9e6170494ca5ff5487\nresult = valid\n\n# tcId = 6\n# wrapped key is longer than wrapping key\nct = cff98cd64cb51ab99b81aee82cee4274d0df3e1b6a4943d39236ea989846d0cc\nkey = faf5ccfae42b43cee2c5f0f3177a7c5d\nmsg = 4e02084833660c463830483b36dab866c64c8cf7429cac3d\nresult = valid\n\n# tcId = 7\n# wrapped key is longer than wrapping key\nct = 58dcfb0e7ec4d3bc8003418d865fbd520c6b24b2bde35b1be5b1c5ff32a130f33d035e5932616083\nkey = c2b9d23f2831ddcdeb456853d4014db9\nmsg = f4cfea98e58b939cc859554385cf3a6c7f8217f728efb431c964786de8274907\nresult = valid\n\n# tcId = 8\n# wrapped key is longer than wrapping key\nct = 4ee47bd68d418586c447a39111e2ec1502ff0f1726ea91c5d97370409d89b8e66e889b638ac40ced\nkey = 620a08f320cdedbf7ae551add348d95e\nmsg = cec34eaf8e67e1ce619ddfc309531c42f16033a7e2cbc4f5eb3a548164e9b291\nresult = valid\n\n# tcId = 9\n# wrapped key is longer than wrapping key\nct = d3b093fd822ce454ebc251c6f21fa71c3858ee7e623ecbfbbf887398a30b40c55d0565c7a15e4015\nkey = ed089ac274f8c7cea2415671a94b5e53\nmsg = 6065e41df14daeeefacac5daeb7674cdc9c1f686013b797153e80ef215893299\nresult = valid\n\n# tcId = 10\n# Round counter overflows 256\nct = 222deadde6efb760cae42fa188310e0c07e7d557529766444a9efb330907d42f0dd8f3d17b3a38bf40d68c095a9cce19daf907bf2c92f1e59b18b277ff0397fc50f45f582db936aa8afb943de01b58abfdc81daef4e038c99e4c1eb3ee447464bb8f89a4ea81e56556cc26c72883c06a7fe850d04347d68bbadc4a06775030676db8cc34aeb07e39c7f059c2bff76a7f2baf076749004ef7189f887f89029f88c5c1d0f5ee62320b423048e2ad8186e63be23c553f5576a40d967e8b527ccd783c41abc64bea1aec8a76deb3e9c9a6656756e1dac38bd25ff008888a5591af763fd73f5addd749794817070990484654a46ef442adaeacab14d12daaf87bcb91661a21593717d9b93529d813ea5fc812d708c0d8e9b68122d9f5e6267cde363780a45d07e4caa5bf14f2334f25b9d177632bb80a82894aa47b6f360b2da1138dedd4331f077c900554c7a68b5d154980bb3517ac20a78a51f6f21e42b2c4c960d31cbd22bd610819182c5e456ba7d7e903f5e60f6e0c4cc014feb4f81973ce48ad6f4dab8da51eb7\nkey = 31cacbb17d6dbbecae40727c5048fe0c\nmsg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 11\n# empty keys cannot be wrapped\nct = a6a6a6a6a6a6a6a6\nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = \nresult = invalid\n\n# tcId = 12\n# keys of size 8 byte cannot be wrapped\nct = dc26fb6911d71971df0356d6bb9ed6e6\nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 13\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 00\nresult = invalid\n\n# tcId = 14\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 0001\nresult = invalid\n\n# tcId = 15\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 000102\nresult = invalid\n\n# tcId = 16\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 00010203\nresult = invalid\n\n# tcId = 17\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 0001020304\nresult = invalid\n\n# tcId = 18\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 000102030405\nresult = invalid\n\n# tcId = 19\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 00010203040506\nresult = invalid\n\n# tcId = 20\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495\nmsg = 000102030405060708090a0b0c0d0e0f10111213\nresult = invalid\n\n# tcId = 21\n# invalid size of wrapped key\nct = \nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 22\n# invalid size of wrapped key\nct = 9f\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 23\n# invalid size of wrapped key\nct = dc9e9580\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 24\n# invalid size of wrapped key\nct = b9b282d138693000\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 25\n# invalid size of wrapped key\nct = 0efc635b2d61e244056b9d4591ca6b\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 26\n# invalid size of wrapped key\nct = 4a305dae087b0d24d62af41831338f33ae\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 27\n# invalid size of wrapped key\nct = 82cb927097cf31ea4affea440b0d8ca6a240b900\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = \nresult = invalid\n\n# tcId = 28\n# bytes appended to wrapped key\nct = 9790ab51fbcb850df6764e011ae97c85785bed2633aea66500\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\n\n# tcId = 29\n# Incorrect IV\nct = 0aac329ccd513edbdd6367df67999eaac9e7b51984c4d38d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 30\n# Incorrect IV\nct = 5a55dc429749ca49bb4ab01d966b19ea9a9e1402e6ab2962\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 31\n# Incorrect IV\nct = 45f533f6072f640eb7e1e512d56072085567f4ad6012a97a\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 32\n# Incorrect IV\nct = 84f284565df47c409107f7a0a71bc370a8ed4489d414b9e9\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 33\n# Incorrect IV\nct = 3941c366554fc896e9fe52f02493ca03d439eb17c236146d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 34\n# Incorrect IV\nct = 45c9d42363d981d086a972728e130a42f5dd90bda562a85a\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 35\n# Incorrect IV\nct = 037d17859519d6c0728a9eb6e64113e86919decabd3bbb88\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 36\n# Incorrect IV\nct = 1ad10af7f6c042b267a0c7bc4d25d27c003deb50e2cc566a\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 37\n# Incorrect IV\nct = 630c571b7fb8647ac5360a255f9f5d3645795ac45285cbaa\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 38\n# Incorrect IV\nct = 16db553e467d4029d0fea62b2c440e5df6c6591f0497a99d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 39\n# Incorrect IV\nct = 097991090a156047d4784b757f262e12ce57e13a3d5d286c\nkey = 4f710eb6b5e28703becfc3dc52",
     "fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 40\n# Incorrect IV\nct = 3957c338b750a3285eb7b65c9cfe77053dd7d8149f42caa1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 41\n# RFC 3394\nct = 1fa68b0a8112b447aef34bd8fb5a7b829d3e862371d2cfe5\nkey = 000102030405060708090a0b0c0d0e0f\nmsg = 00112233445566778899aabbccddeeff\nresult = valid\n\n[keySize = 192]\n\n# tcId = 42\nct = 00be1caddfd5ad7697877017795f9cee4bce5a61687a6126\nkey = f75a2f49a630c7dc91626b00ce029f0bd2981d7c74a93ebe\nmsg = 9adbc00c710b1101bdf6a4ed65b32d72\nresult = valid\n\n# tcId = 43\nct = 54e7f278b5a1fb4c31a0d79ac1f615edd910bf22015a0668\nkey = b713f6b7814f98894d7b153974684359f1460213eb74be68\nmsg = 78585f0c49922e82caf17ebc3721b4db\nresult = valid\n\n# tcId = 44\nct = 510455bd9c078ac1f07bb3752cbd04e421b0dd635190fa62\nkey = 13ecf423211caa334ba6db37259a535c20de8ad10fc8c432\nmsg = 4fc75d0f221e22408a37e11265d49a05\nresult = valid\n\n# tcId = 45\nct = 880da5b410f913ad72cc93f46344f1152165bdea14664fd2d3afbd87b8cc5cfd\nkey = 4417fbbea51bdd91818d74051957dd70e135c5cf3732bdf1\nmsg = f5357da9f8fd4a1190f36e9fa09a90fcf14d87d62332f1a5\nresult = valid\n\n# tcId = 46\nct = 27654cf6a63d6004ae83da54c2e5d7b5fad20878f350087ddd17ac44a2be868f\nkey = b3f26d8a22fdd61f709841231fbde695b3f28dddced6d41e\nmsg = 0d0af955d2e3829cc3d643219b301e64e0510dfbc428119a\nresult = valid\n\n# tcId = 47\nct = ad7ca66ad4664f43e4dd09296a6e6f02d5af4408f225c0abeb0d9b76c8d1e982\nkey = f70cfb262c729a18206c8afd74356ec7e049d10b44a6e000\nmsg = 241cedfa64c4e7bec541a2eb4c368269e0f0ddebc58267ea\nresult = valid\n\n# tcId = 48\n# wrapped key is longer than wrapping key\nct = e245c90a6b46caece94f47117d608331958c8f75f531ebcdc902c0213d9105f2155af07daa62d132\nkey = 1639f9f81e53e2eeb677a249e5eced3af108971301601a7b\nmsg = ec3c6a1f1a9585327fe658490c74635e5300876da5846a629398984fb551d691\nresult = valid\n\n# tcId = 49\n# wrapped key is longer than wrapping key\nct = 8a32b9f207ae5aaedb7e8a0d945107412c1bd06999bc5ac83c1f958dfb77ebdcf9d98c60dbd4650a\nkey = 1f22d5658aa685b8ba8659dc342880d5b2399e6a815005b0\nmsg = 50be4c1b2f29a63f44d7fc63737f600f0194ea3fb36e173d2ddd19f218656380\nresult = valid\n\n# tcId = 50\n# wrapped key is longer than wrapping key\nct = 4a5842b10d2db96ea1039ef4785ce722555b3751a9b6dd39126ad363378c72320d83ea7adb81615a\nkey = 3a2f4aa50441954bba5a1836294ce071f9296b23dbed6771\nmsg = 65da02ff21b483a1e39575490b4319e84ae0299f1f00b3859fbe2e74b3ec2aaf\nresult = valid\n\n# tcId = 51\n# Round counter overflows 256\nct = e2192598e6124f2791b2751f930958435bb1d02e98aa1e09781bba0b159435db659fa73fa310111704692c68e16ddf4be06022c52fe9dba6279aad1aeb814125d0ddf33f31e58e625af32305050cfea390d8782d32caac558889ca8e641908208da6976542b40dbd090178e2a6812a436c18a5e891ac8083176ace1ddfee4d382856a59c80c643ecd5c1ab68c66b2b8984ce6e0e386f6554a9cb91d363bb4accf028878ec20b8b2e37214f7b12dbcd78fb38f711a90fe262c78491b9058354e27b34fc92ef0d7028594cb08259f86b54cb1d317ec55f2ef2ab7e8b141671f8bcb1a90bb7d82bc8cb4fb02c9ce430ef4ae0dc847e91e7d4fb463eb9dd87fc9dc9568f3a4ef504d74c134dcb60ca01b36ce10cb467268ea297c0518a50d12cc025cfeea1381ddd7dd63e4ac94890a0eae9dbd8db244625a3c8af2e1aff6a8112c4d3d98e8263588ee1dd9063b709b8ec00474c4ea413a802b8cde814e7b3731410809ed000060fb7b9b0bf8509ef17515f333e868b188ea16445f380b3a7d42774f6456cdf724246fa\nkey = 31cacbb17d6dbbecae40727c5048fe0c01bc53b23ab63502\nmsg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 52\n# empty keys cannot be wrapped\nct = a6a6a6a6a6a6a6a6\nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = \nresult = invalid\n\n# tcId = 53\n# keys of size 8 byte cannot be wrapped\nct = 38d8238cdb0d9a2da28d6d56194f2e78\nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 0001020304050607\nresult = invalid\n\n# tcId = 54\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 00\nresult = invalid\n\n# tcId = 55\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 0001\nresult = invalid\n\n# tcId = 56\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 000102\nresult = invalid\n\n# tcId = 57\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 00010203\nresult = invalid\n\n# tcId = 58\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 0001020304\nresult = invalid\n\n# tcId = 59\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 000102030405\nresult = invalid\n\n# tcId = 60\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 00010203040506\nresult = invalid\n\n# tcId = 61\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76\nmsg = 000102030405060708090a0b0c0d0e0f10111213\nresult = invalid\n\n# tcId = 62\n# invalid size of wrapped key\nct = \nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 63\n# invalid size of wrapped key\nct = 9f\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 64\n# invalid size of wrapped key\nct = dc9e9580\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 65\n# invalid size of wrapped key\nct = b9b282d138693000\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 66\n# invalid size of wrapped key\nct = 0efc635b2d61e244056b9d4591ca6b\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 67\n# invalid size of wrapped key\nct = 4a305dae087b0d24d62af41831338f33ae\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 68\n# invalid size of wrapped key\nct = 82cb927097cf31ea4affea440b0d8ca6a240b900\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = \nresult = invalid\n\n# tcId = 69\n# bytes appended to wrapped key\nct = 55dfb2f7e0c1ea04fead897c451c0505921dc47f308c491700\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\n\n# tcId = 70\n# Incorrect IV\nct = 9b1593fd7d4fe25a660bbc1976ea4ab68bcc53f848a8eb9d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 71\n# Incorrect IV\nct = e7edb847fa91e2deded726edf3ab93da91151697425fee28\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 72\n# Incorrect IV\nct = 1b51a7c033c1efb5ee2994259c40f03bb57d8cc09e507e6e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 73\n# Incorrect IV\nct = c40b614a5062f5fd049c5379b3e8141614c2da97893589fb\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 74\n# Incorrect IV\nct = d7575ef02df54b3086eb49035eeafbce0e08336e89b35ab0\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 75\n# Incorrect IV\nct = 0d617f1c12485a35917d2a941e949d2fdbf03a346889b850\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 76\n# Incorrect IV\nct = c7df34729174db2e83ee16c6de74d5eb9766715fad049b40\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a8",
     "28cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 77\n# Incorrect IV\nct = c3ed38d6f9ccb9bf3c56bb3176f00d3ce9887521f8d4c70b\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 78\n# Incorrect IV\nct = 6582b5f4652744b0537e97e7cdae0f443130140dbaea604c\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 79\n# Incorrect IV\nct = fc9b9bdf25f2b48ad79934c8d34897cdbf4c846f8cb4b11d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 80\n# Incorrect IV\nct = fc23c7f4fe20aa81105efc1a7105a5316b23399ac792c824\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 81\n# Incorrect IV\nct = 37b4a261b96bcec9cc93eef5b2fbbbe84634f978c5893dda\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 82\n# Incorrect IV\nct = 1831109847d17d010bfcd93fb46f3150cdafd52733db74c221b034fe8e1552c0\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 83\n# Incorrect IV\nct = 2b2b89c3c6b2db4903877ad4622ca33f3a3cb7e6701d1340e6afc0fdab7dbd72\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 84\n# Incorrect IV\nct = 3c6903f37da57161af6706050a2ed747cd55344d869189fd49d2536ff948129d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 85\n# Incorrect IV\nct = 8a8dc8b131c6b968b60c1dd819a655392d1a96d6cafa48e30fb1146f096229c6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 86\n# Incorrect IV\nct = 303e0b3602d514a7d52edba3306d7383e8999e7c652a510335a8949efb42eb66\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 87\n# Incorrect IV\nct = 319befbf2ddbb475723fb2fa30f2ae7fc1ceb1e6f361715eca7209608873c7fc\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 88\n# Incorrect IV\nct = 9b3e440341c5da131559959db6b3553a534691162f4f009327bf2c21d6fe5ada\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 89\n# Incorrect IV\nct = eba6cc0959e6a56339b141629840add80f4565656dc687a3b996960c994dfd26\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 90\n# Incorrect IV\nct = b703b6cf4587709353c7e4004d3da61ce5f5deaf7163ca9d6158dde919e0ac34\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 91\n# Incorrect IV\nct = 72549d52d6f4ff912d833c74136d90634ce8afa4f84412bbee8074084d4cecff\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 92\n# Incorrect IV\nct = 1337c8bd6c8a5dd43aba8d298864ffe76ad6ea909f3488157a15e6c46acf2214\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 93\n# Incorrect IV\nct = 4aaffaca5fe85814d040aa2a306ba4d1d44746cfe46c978aa057b53fd25316c1\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 94\n# RFC 3394\nct = 96778b25ae6ca435f92b5b97c050aed2468ab8a17ad84e5d\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 00112233445566778899aabbccddeeff\nresult = valid\n\n# tcId = 95\n# RFC 3394\nct = 031d33264e15d33268f24ec260743edce1c6c7ddee725a936ba814915c6762d2\nkey = 000102030405060708090a0b0c0d0e0f1011121314151617\nmsg = 00112233445566778899aabbccddeeff0001020304050607\nresult = valid\n\n[keySize = 256]\n\n# tcId = 96\nct = 940b1c580e0c7233a791b0f192438d2eace14214cee455b7\nkey = fce0429c610658ef8e7cfb0154c51de2239a8a317f5af5b6714f985fb5c4d75c\nmsg = 287326b5ed0078e7ca0164d748f667e7\nresult = valid\n\n# tcId = 97\nct = 939b3389336fea4a9751bf014ef18011323090e8a0500bc4\nkey = 0dda6da5123e2c37c6fa16ba0d334cd01acd652f8994211751dfab4faac2fc22\nmsg = b40b6828729b456322a8d065abc0d081\nresult = valid\n\n# tcId = 98\nct = 59ee8e5198861237f682edec6ba906526c016d4d935942bd\nkey = d6925914cd06308f81ad91e23073593d99d4e50351b20eb2a8d1a1ac4ced6588\nmsg = 037b27b3dc95b19d15bd4091e320bfe1\nresult = valid\n\n# tcId = 99\nct = 1ab53a065d8f776a08b33e51383071b6f154612116655137bd3b7ec29b70fd56\nkey = 07518a82cbc8da1dcec55f3763a206d277487abd03cedd0b8bef9ee2fb157121\nmsg = faa4664d79fce3c7d2fdd462f6c1c423c2f8e6b69be2e071\nresult = valid\n\n# tcId = 100\nct = a1bf8e73e3fa1db759f0ab2ab0b1ca6f2c85b63d83e25f7a0b5293d0a216a2b7\nkey = ea46991d4e71f53dd624e7fe7fde11944a7c5942d232369b8065d42b8cd2dde1\nmsg = dffc5cf1dd5411d015d84601fa38df5effe885c7f26a4825\nresult = valid\n\n# tcId = 101\nct = 27308a0e1a6c0a1d15d6174ab7d68675207b615df16fcf7a3c69b25f551cca9f\nkey = fdcfa902c6f222f527af84da533b14b52e2615da3a89d1d35708b0cd49f60d87\nmsg = 966b07047354966a703e79607b556032f4f596b7f9206f05\nresult = valid\n\n# tcId = 102\nct = 7155ee932b0358d98182a23f7f427c774ab340a4757d0b6a63facd3de90578438cf03201c3f88057\nkey = 38e1b1d075d9d852b9a6c01c8ff6965af01bac457a4e339ae3e1d7b2ffacc0cd\nmsg = 80ad6820f1c90981e2ca42b817a345c1179d0a11d8e23a8adc0505e13d87295a\nresult = valid\n\n# tcId = 103\nct = f20b9b553bc0847529f8d4379fa909211e68249bd429f436c615c4c4a5d9f1a1968f0b89c5237b30\nkey = c641f1689d81caa8ba37d895272240664054ed974cfffc40e6c5c0cad1b916c7\nmsg = 3fd0ba19955e46749f54d88e99d080b7339d588fe612ec0f4021ca3ca2104270\nresult = valid\n\n# tcId = 104\nct = 2811716854a214aecdd318c6670b9b2a7511713c9a0c0fa805230ff05cf84af795dd72f6c1a44512\nkey = aa0ab9d68ed4a04e723f81b44c0c88d0bcde7a80cfd476eb4b8836d9aa01ec4c\nmsg = 57faa8766f6d6a0aa1cf643f857c150df5b31303b50af480e21c4b5e8c8a15d5\nresult = valid\n\n# tcId = 105\n# Round counter overflows 256\nct = 5322bc62bd8379abbb75f69688b8f00e31962b8f9ae1e89771952d8a2a749e1352ec33b5435a674271b314760ab9f753b16726185ec7d319ac60531355344c1d53c7903000a8039eb40f70564a0ad3f41b2355ea5dfa6a1d46392f1d106a5da569bfb0493bf7c12dff04bafeae377df4bb47cd440b6f60fbab2a54a98551b76273e02cac8d7be9f2343d3abb2a23af1c91a7011c67a7907260116b67d510aabe5c7ca46c1c20f77106c45966583b3e4ed799a47ee19bb4223209265c2b1ac8183a678ff43bc9a3470a50b9ee4d10f60674268d72c68be003a0d9dd6849aba836fe8a1792b81c90e12945bfe1f27a9c6b2af66a063cdb7721a7f23fb30afdbd8b18db377dd1697f157be81c1578d08b066c71b0c5ca7feecac1cdd938cf9ad525f74844660908194b28e54eddb158f6e4c921b811d90db71a92ff872db2250dcc3f847fc752b66d77e33c85084d3fa53b4f30503d2a06e6cabb9033d59fc1dc15e32f19846a039b91597b0ba3141a7d9717630062170117b2131dab77406e9ed7d66b2c754d849c60\nkey = 31cacbb17d6dbbecae40727c5048fe0c01bc53b23ab635025cbac1ecf52ca495\nmsg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 106\n# empty keys cannot be wrapped\nct = a6a6a6a6a6a6a6a6\nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = \nresult = invalid\n\n# tcId = 107\n# keys of size 8 byte cannot be wrapped\nct = 181ba6a3a4392469e3de98ddbbdd2432\nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 000102030",
     "4050607\nresult = invalid\n\n# tcId = 108\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 00\nresult = invalid\n\n# tcId = 109\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 0001\nresult = invalid\n\n# tcId = 110\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 000102\nresult = invalid\n\n# tcId = 111\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 00010203\nresult = invalid\n\n# tcId = 112\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 0001020304\nresult = invalid\n\n# tcId = 113\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 000102030405\nresult = invalid\n\n# tcId = 114\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 00010203040506\nresult = invalid\n\n# tcId = 115\n# wrapped key size must be divisible by 8\nct = \nkey = 574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692\nmsg = 000102030405060708090a0b0c0d0e0f10111213\nresult = invalid\n\n# tcId = 116\n# invalid size of wrapped key\nct = \nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 117\n# invalid size of wrapped key\nct = 9f\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 118\n# invalid size of wrapped key\nct = dc9e9580\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 119\n# invalid size of wrapped key\nct = b9b282d138693000\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 120\n# invalid size of wrapped key\nct = 0efc635b2d61e244056b9d4591ca6b\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 121\n# invalid size of wrapped key\nct = 4a305dae087b0d24d62af41831338f33ae\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 122\n# invalid size of wrapped key\nct = 82cb927097cf31ea4affea440b0d8ca6a240b900\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = \nresult = invalid\n\n# tcId = 123\n# bytes appended to wrapped key\nct = 7dfbd7cf6158d75bb5900b3bf1e3871003402a6508b1912800\nkey = fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7\nmsg = 000102030405060708090a0b0c0d0e0f\nresult = invalid\n\n# tcId = 124\n# Incorrect IV\nct = a417671bc62a23c7a65543092124024df72c048d8db330c7\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 125\n# Incorrect IV\nct = 9518d0f99d7a73ed4a502b449c14c285971b0e6177ce0eca\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 126\n# Incorrect IV\nct = f3511f0491bd74ae1defb5307f0e18db864b57b5c404d428\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 127\n# Incorrect IV\nct = 6c03ce779259661c43d41d5d0e45687f874353bba516c73e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 128\n# Incorrect IV\nct = 8df01969a11c87026535bfccf72b1d064c86ecc7e5227157\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 129\n# Incorrect IV\nct = 8ed1cde228d9c8d046dca65c7a27aef2edf8ae90c705d1e9\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 130\n# Incorrect IV\nct = d69b3e34e9de38d44de1998992362a6fa1f696b5acab3f10\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 131\n# Incorrect IV\nct = 67865122af3294b8da0588775125cbd6dc19d5e5cab97b6d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 132\n# Incorrect IV\nct = 9f0fa52363dd55df472d867e6faf5da8eb204a1d6d497030\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 133\n# Incorrect IV\nct = c399f999c96a4204325e7f08d6a4de256faf21ec2c007ddf\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 134\n# Incorrect IV\nct = 282082264a87dc35ce1cc5b9931b77d80d82fcacc0927f85\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 135\n# Incorrect IV\nct = c192c90b83003ca96744498014b6ad6bedda837955269819\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5\nresult = invalid\n\n# tcId = 136\n# Incorrect IV\nct = 30a983cd9e69d561acc95c42b252aba4185f8392f2e6c935c8eb105af8082e34\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 137\n# Incorrect IV\nct = 4de9a639b799630b45b49e28dbfc44dabb9843ee588a8cff286b8d5fbd7b32ee\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 138\n# Incorrect IV\nct = d915b2cdfb769d9d82259dc3d124646bbf972b83efd4c2eae9b9f751073f78d6\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 139\n# Incorrect IV\nct = 117d653f480b69fce564f1fe99572492945189ed5af789ce05a2651baf90bb5e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 140\n# Incorrect IV\nct = 8226d07a2f919e24ada1081c69a75520be895e3a2bda9b805d9747773ddeaa38\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 141\n# Incorrect IV\nct = b0a74345bedf8865348daf45d054b99ce515ea8be136270d1cf71e1cfa7aa4a2\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 142\n# Incorrect IV\nct = a261db77f17f7ec736d1a8be16e5f9ae432fe2a17012e5a6f07c5426a9f0ca59\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 143\n# Incorrect IV\nct = c53acb5e096b54548e1385b2ff18eaef68d235c95b0194e74a2383d3a7a530dc\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 144\n# Incorrect IV\nct = faef482d99ebb180e5bc5e3cf775ba292c2a3b6c44aa4a21ad400906f11af392\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 145\n# Incorrect IV\nct = 73a450b63b07b3aece9d1ae5bf097a3dd3fcf73e3ec2f1bd8fc3b5586cb9bd73\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 146\n# Incorrect IV\nct = d34b6ee184d387c9aa4b2d180ae0a89498014e55fe8e416be4f826fcf7d56522\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 147\n# Incorrect IV\nct = 2af823d1602803740bfa9040c2c4e769a5b6de919d403cfba9ad360f63af1113\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1\nresult = invalid\n\n# tcId = 148\n# I",
     "ncorrect IV\nct = dd78ebd3091c55a5da5b24504200f7fadd1b3ac6ad35f814f733e603c13936245d69d83f262f6b1e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 149\n# Incorrect IV\nct = 3d8338eae7de322399e1d1b4a3df54326b242b563612ea4b27da22a041d3c80966911bc009911761\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 150\n# Incorrect IV\nct = d04bf75cadd3b5f099c34b27a91e64a8f2dbcf08e8c5c1c9f07a777eeb805d5d0e8c5c01afc43944\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 151\n# Incorrect IV\nct = be0c5d193b61c5137a8fd8a6d7d1ed8f0fa28cec516f544697c12add4f8f4d5cfca65edeb1019974\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 152\n# Incorrect IV\nct = a83ebcbeb2be9d6807b5cfc31c89849d1343dd4eb22e5bfe9e2b2b3790ad8900601f1f5d54fd472f\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 153\n# Incorrect IV\nct = 416221485a6cb98ad1342ea9a12926a9a133ead8bd919323fe789bb8f89a4fcaf81e1be54f9d358e\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 154\n# Incorrect IV\nct = bf6a53286fac48e7f25d89b7056b27aa917d5b54c0d3171dff369f7249153bf09da5891eb4dc2d88\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 155\n# Incorrect IV\nct = 99d517a1321bb633b0d5f3afda2372d3abf68b41d13cbfdffc78f173b88bc4b97efcab2b2904788d\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 156\n# Incorrect IV\nct = d92456bc77a268ef71cba76064a1b772d1fee2ae4f0ee3bb932a2adb2b031796b9eadb51753f2868\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 157\n# Incorrect IV\nct = 5bb54630ab8d73a040f0f87e70e263d1aeb2358bcdc0dce6994d0d874452bbd8741b7ec1d59d8298\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 158\n# Incorrect IV\nct = 4581d6536039db1b23da50c648777e90c82d6128bb92e28b2974bae1141543a19a1592fda1fbd61f\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 159\n# Incorrect IV\nct = d35bc67e62064c34f48150999ba30ded475d8c75978f45737320f23edaaa7a40d7803fc61add34a4\nkey = 4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7\nmsg = a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c\nresult = invalid\n\n# tcId = 160\n# RFC 3394\nct = 64e8c3f9ce0f5ba263e9777905818a2a93c8191e7d6e8ae7\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 00112233445566778899aabbccddeeff\nresult = valid\n\n# tcId = 161\n# RFC 3394\nct = a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 00112233445566778899aabbccddeeff0001020304050607\nresult = valid\n\n# tcId = 162\n# RFC 3394\nct = 28c9f404c4b810f4cbccb35cfb87f8263f5786e2d80ed326cbc7f0e71a99f43bfb988b9b7a02dd21\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f\nresult = valid\n\n",
 };
-static const size_t kLen135 = 94020;
+static const size_t kLen151 = 94020;
 
-static const char *kData135[] = {
+static const char *kData151[] = {
     "# Imported from Wycheproof's primality_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: PrimalityTest\n# Generator version: 0.8rc17\n\n\n# tcId = 1\n# small non prime integer\nresult = invalid\nvalue = ff\n\n# tcId = 2\n# small non prime integer\nresult = invalid\nvalue = 00\n\n# tcId = 3\n# small non prime integer\nresult = invalid\nvalue = 01\n\n# tcId = 4\n# Non-prime Mersenne number that is pseudoprime to base 2\nresult = invalid\nvalue = 07ffffffffffffffff\n\n# tcId = 5\n# Non-prime Mersenne number that is pseudoprime to base 2\nresult = invalid\nvalue = 7fffffffffffffffff\n\n# tcId = 6\n# Non-prime Fermat number\nresult = invalid\nvalue = 0100000000000000000000000000000001\n\n# tcId = 7\n# Non-prime Fermat number\nresult = invalid\nvalue = 010000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 8\n# Non-prime Fermat number\nresult = invalid\nvalue = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 9\n# pseudoprime square derived from Wiefrich prime\nresult = invalid\nvalue = 123a99\n\n# tcId = 10\n# pseudoprime square derived from Wiefrich prime\nresult = invalid\nvalue = 00bc18d1\n\n# tcId = 11\n# square\nresult = invalid\nvalue = 04\n\n# tcId = 12\n# square\nresult = invalid\nvalue = 09\n\n# tcId = 13\n# square\nresult = invalid\nvalue = 010201\n\n# tcId = 14\n# square\nresult = invalid\nvalue = 0f2ad9\n\n# tcId = 15\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 01f51f3fee3b\n\n# tcId = 16\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 032907381cdf\n\n# tcId = 17\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 0136a352b2c8c1\n\n# tcId = 18\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 023c3db80e80e53bd1\n\n# tcId = 19\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 0504e8e504fd585e79193ca1\n\n# tcId = 20\n# G. Jaeschke: \"On strong pseudoprimes to several bases\", Math o. comp. v.61, p\n# 915-926\nresult = invalid\nvalue = 00b7d84161830e3f6f2231a7a1\n\n# tcId = 21\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 4c6092d9a7a5462b34e5\n\n# tcId = 22\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 22c9a603ee84bb9c4cad\n\n# tcId = 23\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 437ae92817f9fc85b7e5\n\n# tcId = 24\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 0190e262098f0d746505\n\n# tcId = 25\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 027a5f7ca7b29ee74d5525\n\n# tcId = 26\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 008d60a89f3f36cb1fd495\n\n# tcId = 27\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 02be6951adc5b22410a5fd\n\n# tcId = 28\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 0292a0068ebb0ed3251f55\n\n# tcId = 29\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 750b703e68cb957ab415\n\n# tcId = 30\n# A strong pseudoprimes to 12 or more bases from\n# https://arxiv.org/pdf/1509.00864v1.pdf\nresult = invalid\nvalue = 02d0facc78aeeb89f5b299\n\n# tcId = 31\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Maple\nresult = invalid\nvalue = 09bdc1c98b9b\n\n# tcId = 32\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Maple\nresult = invalid\nvalue = 0ffb48c934842b\n\n# tcId = 33\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Maple\nresult = invalid\nvalue = 18444fdb12afb7\n\n# tcId = 34\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Mathematica 2.0\nresult = invalid\nvalue = 08e4f37e51\n\n# tcId = 35\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Mathematica 2.0\nresult = invalid\nvalue = 179d55b600e7f1\n\n# tcId = 36\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Axioms primality test\nresult = invalid\nvalue = 085270bd76a142abc3037d1aab3b\n\n# tcId = 37\n# Richard G.E. Pinch, \"Some primality testing algorithms\" a counter example for\n# Axioms primality test\nresult = invalid\nvalue = 02cb78fe3f36c4f5f05dbe92b82798d5fc18f2bfaaa388ef\n\n# tcId = 38\n# A composite q that was acceptied by Gnu Crypto.\n# http://www.iacr.org/archive/pkc2005/33860010/33860010.pdf\nresult = invalid\nvalue = 4682f52f0b54308d315b2fbec25065506c77be95912b137bc6eecffad8a299b631c55ce068702b1b3e4ce50958994c289b148fb298a8c603a0959cb0ba5ad4bcba278cf4c87e0ff85a62a25c40849662c53d0f81cf9e4431d8c391586629260e558db473997db20108278b1ae374089140d93bc2c5a808ad3aaf212f60bfc93cc0c788149dcd82f7ab\n\n# tcId = 39\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00f67307e54779cfe9120bf862afc5466c5d6d0783d12df5215c0c981c51e4bfc098e9afd574f51b18c820259b692ec0bf7c9d6e56e9bb99fbd3b7ecc4082146a9d7a5b7bc6519d476c4a9975d9c3e3b12bee45b7accb07a6a68ea583ac2523ef32ee6d01bc766b59c43031f9c6980c9b4317da6825be9f7c5db03283d04c13323\nflags = WorstCaseMillerRabin\n\n# tcId = 40\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00c1d00b32d63e3ea4fb69ab6b9dee40a17fada46c122e52a53fecd3fe613303f51c07871dc0b5d8d8c1705b484de6bdb7f442efecd7d9f59dc36e495f72905c7619bc4d3706283774e704a3adad7d6c1be42ddeffc2ca5b1c0e31b58ed606f16dc14676e60ecff42ae33e503621e232ba449e91e3a9909e80a8318610aea3b7cf\nflags = WorstCaseMillerRabin\n\n# tcId = 41\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01c2faadef91d43c9ab1320020e08e2ec3c34012bd0db94a1175170dc5aec26897e867d0b7a7273119fbe1115f02875b522566016f69f319ad5485e7458fcf50205d22ba765cc586a6037be987b6832c46227df19cd8ce0641794b60b73fbdd3c104870ae9bdf0194e772c985536e860b90b7fa3eb205af6b224413f5813836abb\nflags = WorstCaseMillerRabin\n\n# tcId = 42\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0109fddd44575367466c67aaa921047b367515c9aa579eb60728034ad2d56f10eb01cfadb3ba0abde99f348bc3c70559bc24551b85937ca4c886abc0826cc1c310f14393652c1b4994953881bd2d81de0f2a280839829543f429bc41bf3c6db120bb150173e2707f36d1f76318249851f4fedc39e36aaaca48686de03e6d256973\nflags = WorstCaseMillerRabin\n\n# tcId = 43\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00ffd0847cdda5a4fdfd2345bc731f1bc77843478950d33b2830ef0caf8deffdbe6309fe61fb67dded6659e433f30363339dbcc7c0832593f33c24a8b8f0e28038cb6edeed58ae765e6884ac0b66b5218cc758e6247269d24be9f91865d33c105219ffbce00c6c2d6391448643bcf5138268f510258f638b90a6c8b53bfc121759\nflags = WorstCaseMillerRabin\n\n# tcId = 44\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0118d077827c6db85bc61d53063edf5676d6ac65b611d836eed07ee7e1d15c02d999a3eb78ce662edaf457f0f7d9c0a0305acc1faec4170400f0610a797de50ebfb08fd0a5da77144a1e0236e2bc6d8d2a6a719e59df071367cd61275f372e23b1c0187d87d15bda5f71f4705b1c3aaaa8ad951d20cee93274b151f3f9a55bd693\nflags = WorstCaseMillerRabin\n\n# tcId = 45\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01c09377e15f53b1329b6e8a08bf0f94da27dd29c89be74544d705173a0bdd410935e186dd95ac113732674fe08585690ebe9f749a116a8c64e1b4a281ef0cb28bc70b1639bc1352ff5777783bd72e3b8495c1494ae11fb32bdaba8c80870a3de71c0c27f07983e97500c0ec0321b86c679c53ae7f8c76ddbf6a9cc3ff63e45023\nflags = WorstCaseMillerRabin\n\n# tcId = 46\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00f35cac3bb3c7cf5e4e50162f4ca889ac7b875f4aac08c5a2433600e9bc64db6c9895aaccf3ee98783ee2cfd8a5e448b265bbc4cda6cb80d487c7967d5a6724fae1ffd27c70f579e62b49f29819c6221d7659fa9364e8e37795d88611506b552a20533f1f6446a35b41a986d304fdd7a39f484331b4fbf242f95b80788cff39cd\nflags = WorstCaseMiller",
     "Rabin\n\n# tcId = 47\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01e9df6f069f5984c080087127f90437f2d38f19385b3592d17a5f23603ec6315c36a88d2012e85eca62a983de7ef27673c605155b5647311840cf8887be8267fbc01cec3f7e0467d5e9a812e5dca577cc8ac93971c84f8cea94637c60c0bfe5d7f4b4f950e60ad077941190afaa905d6d5d570c9b4dab98c32c7abc42346f894d\nflags = WorstCaseMillerRabin\n\n# tcId = 48\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00c5286502dda772fc22d43b0a2f46823777a91f580f3a1261c47be8e2010a5ad9395e2c036b32813dcdaad33c8f2f4a522593e31ae55ef05c8df8ed58636ac1b9db2b205797d39343e0868ff02bef46d18736bedc6f527730da8594d45d0447e7c7f0e8ca12b285b88aea5e343264874ac22038f5821bd96519d49caf45184f97\nflags = WorstCaseMillerRabin\n\n# tcId = 49\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01c29fe8b7e63795218563774685b9fe85eada73691a6420c38f0e9f2f802e89c77ae78716924e4efb5e4c639ca98ddb0c9e35cbc6313196b3327672527404b6da8ff7813915702fb7fa254c1cdc167a34170da57606ccff876ca0ce5e920f443e389fc9d0c071b908c6675b6a9f5903d6d22ad490e6476a7e13adcaf988663b3b\nflags = WorstCaseMillerRabin\n\n# tcId = 50\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01e8648f8abce82efb0afa9861c96c428f690c5fe33b9c9d47f97198542c982e607fd9700f876159ea404983f4eecbaf2a73b262085da4b7b5de8f6e8ca0b712f5e89c0e8f024033879f858f814275a3ea5543fd539e74f5e099769d0d726ebd8bc74bda6e2f8ffabbb7d043f7818cd8d531180a827731fac59f45b2af35d273f9\nflags = WorstCaseMillerRabin\n\n# tcId = 51\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00cedc5db464312d6f1ecf53a40bde07ae0d5540ef75a4802ff469142270049dbba2b74e4ece7340d8eb99bac1a3d6f0b52ebb41794d3cd4e4a588431879ff81818abc50bca5e686a06d48461b425be62d3c064321429e346960163f897d21b362dc72f306a6865cfb9c8c5682cc7fcd7dc6ac4202e8d070729ef9e3b526236c71\nflags = WorstCaseMillerRabin\n\n# tcId = 52\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0093ec9e6681f1bc1d6534add99d97e0d907828996bb3d7b481f3ceaefbe8f3fdf15698302ce26feb84c08994079c9f368af8171faf76801fe6dfdaecd587fa0edc751d64ff7e9aa73fb7aa51a8469379bac38e9d7941e0bbdcf658633daea40738e81f5605198b04fe8fd49646da4e98c2282a8041c25bb9894252412472294f9\nflags = WorstCaseMillerRabin\n\n# tcId = 53\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0129fffd0bf1827f2847f45bd490d5423f67d87eb8254535d57078707e19f2ca5ca10602c5eca552fbdc77e30592b7498254f901cad02e0bf59802f5582cbb3059a1979a5e5311855807b1cbeff86a651dbf3818c3b6cf50092c9b744c4831873d1d0d8c23f23b39517ce435a257e5026cfa0be280672e1bba3074b2cdc6474a37\nflags = WorstCaseMillerRabin\n\n# tcId = 54\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 017232b942eedc8a0df14f5c1ad4e099f192b242b7d3dff09c50cecfe636c72c6c8ba1c65dde4396282e1a1c823b6d5d9c0c9068b39e202dcba26a9d35a00b7bb6bede272820fbbba503bc1866c6ae183d8b50e28555a921121929862ce87ea4ddde8f9d6ff2e17a8ee7cf9d306faa0815a4d46e8dfd4b7ea538b7399cc1c06c1f\nflags = WorstCaseMillerRabin\n\n# tcId = 55\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00d3768b43c242fa7ac1de856dc7bd413b79d544bb8d38677bc9f44aa116ac5525c3e7fcf2fb2c1d3de61844931f47646b4c5f7de226031c925acbe57f1cd292fec7e7d4fd25afa128704ffd8da910ef18961e081e88d40bc37582b087f1b1f39fe4d23a03ec6b869c76fa3aed7a3606c469069c4fa1d4ff1c6112da16ba9dcf97\nflags = WorstCaseMillerRabin\n\n# tcId = 56\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 011b5119e5c68a710158c36d414597b4e1ccff332d1b437a4d2da2d2269ad2b626fde79e3ba7ed92128e5feaa87556f18ca6937b5a88f4738608d6bb6aacaf4fb719d67561d66dba9690009bcdbea2db4ee48d575722cbafbf1e487bab1c62ba0cde30a34620c7733b3e13d8b27fa035115680fb81016d1ca777b8a2bb7c399a47\nflags = WorstCaseMillerRabin\n\n# tcId = 57\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 008e9ee596ea83d06e1a9a4c3b75fc67f3c01de737be4dcdc18f1d10e322df48e455546ac8ac810129dbcb0fbf568987033cadef9d051f6032c8dca2804fc8d8d6e79f5d767963e4b6d72ac29d98d2520c29c8e69ffa59164d6a1e4cb55b7fcc60c7cb274da264203839873ec2f85f4ae377eeb6189e031b17e8603a01ef877b3f\nflags = WorstCaseMillerRabin\n\n# tcId = 58\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00879d1e0bc0538cd9025110cec61a034305c8fdea2b9709ba80b0c45891e7ffc69c05285f4680b95b5882ad04210342314d3ab465ee1209d0690613a09bf7df0d48de18a7200e09e8b7944e748413ad64057fee2daacd099dcbb19920429cf9776d939c27c74c3adc8c41f1001f98d5293e018b1dde228abc6e79092331804bdb\nflags = WorstCaseMillerRabin\n\n# tcId = 59\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00a14d02b57eb643499b92b797687a69aa809fc6c5b56be581de2f8668d38936c9921a16c921a18ae91bff15ab595897416ebbbde977244dbab4779d47bccfec14b1bdb255597bb9bb70e9372fc9afe475b2f73754daf575ef2dd565dfb4216208141fa99df428417d84fff2c54b1fba037a4237bb17b07ddac0f39209f83f8541\nflags = WorstCaseMillerRabin\n\n# tcId = 60\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00d11e471371b5ce0473a80367ce1b0baeb21d8f8ddfebf1116f3b3721247ec85f6e2786467b63743af0885e69c59d674d2b1a4b655ab15d8003be755fabd56f60ad3a7d2a5edbe942663b882e8c1d9aab7250a45b93feae3f092e8819d5cc2c0eee2cee0c6a098a40331aa12a0efc384e518036d382e4e231de3cf644e8aa8b97\nflags = WorstCaseMillerRabin\n\n# tcId = 61\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01fe65939e5a1c520be98522b1ebbd40e4c030adf0677c1878b1b0a58b72873eff6f58712e377457ef467bdbb4666e2f8a4733a13a065aa01e3f5f0cc0fbff0e8a2eb2d8d43b9f2a4931d107315943fa7e1d304f98838903897cd42ab948f7c5ce31a9323a35bdc0cae10eebccb5f318a1239f9b9609d45387805524d67e216477\nflags = WorstCaseMillerRabin\n\n# tcId = 62\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00c24248b5f6e52e0ce8c9068ba2b5839489d1a4849feb751b627e12d13722fd5a00cf4597e63c9bfd1a275b68489539f2b0bef36a09504d7539d0e1a346bc0dc5fa2c65c4c23b771a9946ef5bda403dcd27f496dc02233c05d7d7dc73f6438169a0bdc510bad2ca105d84c2c8bbf2a44c4d7d4d0ead980c13bda71a945d1f3f01\nflags = WorstCaseMillerRabin\n\n# tcId = 63\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 00ab0ef4c1c3be6b7bb39ab0c8a1ffb2c12f8a2fb6c85ea1a8893f452dae161a8decbbc6a84ddc2068bf9df927c0f68a95fff1af8aa9eddd80b0c373b7ea750def2f6df54c0a7e50c16bded071b8d1df6687264e496316be5fcf5f9ab73f5c39b61a876441fb3f467205c92a864d97205032660d6eb2cee3ebfca9649295f6fc95\nflags = WorstCaseMillerRabin\n\n# tcId = 64\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01878ec4f236498bbf2320c89679639394b03dda157a9901f2e07486e64f1bb52f6b4823db13786296a71d6e65ad6a17308e46ddbb2608774eab3df41221eec799fc13ec95b567450abfbae8aa04f3c6361df3a1c01028b83560018b729b5924ee5f03f1306267eea55ab65a95591b105810a50111c9041d20b3ddd389e8ded20f\nflags = WorstCaseMillerRabin\n\n# tcId = 65\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01602a125e7578a82e23051dd12ce12be44f2becfccbd13c2ee18ae1e391356786315832fe9fa6dd5488c83b4f560a5a4b9d9daae4faf0b9b21075fa1b470c7d984b2b43cfca22bc36ec305e52fb4b897445024f2ee536164a5a9a4201db4d9247d4e28e193ad3c62657a91b23727804e8f4bca40691eb41f17c68ab65bb8dd2a5\nflags = WorstCaseMillerRabin\n\n# tcId = 66\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0109a25eac262687f28e560e73bd95be9894bf2a0006dc217e97547064d29be5fae521312fcbdd2949520961abd90b5a2ebcf55780f0d14ebda3c17825089183fee844a3ba0d132cf3db13ebb8f42905bf24374ac29a7b68f93f76dbce3942d4b1dbd91c611d24251b374bd29ae153cb9e23177115dc7003894269328d960cbbc9\nflags = WorstCaseMillerRabin\n\n# tcId = 67\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01962b71c4824f2072f59c73cedfa26a49bd976bba7014005b6feecfc61c90caeeaa05ca8954219165f073bcdb73770846c97383ad1d47f0cf656830388fa5847ab9f542e26226d3e9c2a90bdc23819333bd13803f7520272e4cfb80b5c54c92dbc2936ac75f426babec5b49db6a64cd6eee14ecff0402506eabffc8bb11ec6c93\nflags = WorstCaseMillerRabin\n\n# tcId = 68\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 0102134c13210c561b22c8f2549e0a1786fb85900e3c69c20905cb46a3f633b7128656ba1644cb6bbfa1b5b0c5a5bed69a7802a543cefceb2132e0db7c596e51b88e62185f3815fdd40e7db9d1aed0b0f135b09c4d90e81fcd4ea7a8e7c150147bb2f0fab2d8a0128f25e1e498813f6dc26722a73a441d6e9ba4f488d96ee6d399\nflags = WorstCaseMillerRabin\n\n# tcId = 69\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 01ecee4b07f4311afce14524ab060a72a7198499342f099f681dd6b8a366bc9550a7ddd3288273ef59f62c5daa55c9c4726c78f08c20e0d9a74208db52f732377bbd8ca8f8f1d336bda6bb2defab66506c0db04bf0d",
     "d6f7179f52cfe9c5c91179de1c03eab017d7ff867478e45386955c7a5a744e7f8dacf738c80352a99226777\nflags = WorstCaseMillerRabin\n\n# tcId = 70\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 019fd1a5266cb6e8dfcff2b755624ec26413d25cf53a9d4341ff5c7b0b4e06e8246e6e1063e185b05d90f38637ca69c298d6a834e9aeb06e02afd001897c1fb097c905445b2e6d27750cef01f40d6030f0328eee55241137afead4f8d358d0be0655782a60265f0b9aa30b275a32b60bdb252c95d8d69b68e8a1e07c2374029bcd\nflags = WorstCaseMillerRabin\n\n# tcId = 71\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 32fa78d5eb67eb14a53de388e9d03ae6ebeb7ae017dbae8f594b95f82f6ec380d5162f6f498d0cb61bb14d7ae54fa1b427c2a1d819133161576864a86d039200cb22c5d68716fd0e2b8f021cf25e08506d4ce285536bc6a074edb6d9b4a9dc01fd79eda19efd3b168eac045b6a4edc4c880de430dadc5dd3f32886b88d320505f5f0b064e46be0f1e31c57dd160e89738a4f6897975875564f20f82ecd4cc0db\nflags = WorstCaseMillerRabin\n\n# tcId = 72\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 5954649e58b4eea73bf1738957727ed4f356fd14891d95b81c7cd40a9ae4b9f1a807fc859d4d419e9a2178a369ae734cebf3b6b9b7069570515a94b5609585625a7aab4e2ff05566be39860b1c2e41910a07b46a555299a573c50b82572a8e40d70cd5949c0c5488582cc2ca544265e1e48ec5501fe611ee65de54946f4543ddd94f5d2c100fad681b6390924e3dbee62bf78133bb2ae6d1592fa5c4b0873635\nflags = WorstCaseMillerRabin\n\n# tcId = 73\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 282ca88061946bcd2fa15fecd98e61505b4c98079e5ffd08e9797059673150435ed47f6d94311c9df4ceadce2e13679b4eb1e7120f9f19d7ac393cc090d1885c88136ec24d085ace42e92ab049d8cdf963d8ba7b93b25e3c720367fa9d7d3905eb460c6922f53866fe439bb96f6d5213e66ede6239512bf0c2253ae23c3ff9915dbee4eaa576395e2d6986d40151cd8fe4c9b4d990ba17ec4bcdf6660459858d\nflags = WorstCaseMillerRabin\n\n# tcId = 74\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 2161895b72aff5d2a865dac7e95cabaf7a28010da0dfb075f9b25c189821c99c1bb599d47d6a688254401511cfad26f1d93f254a3be2752a70f7859acad5e6f741848bfefe449072365616be7251781063e8f8934b59f1826341ebd0839dcf72b1735e21f35301313c683d28fb637f6f93453f575330f74e2a0d661ed5fe54816f8cd38b162d5e769c0bf94dfe83e25b6c05b7705a477ebf52ff4deb6bec6aad\nflags = WorstCaseMillerRabin\n\n# tcId = 75\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 71f7dff1a6a0fd66d5228398a7ff1707ed9f83b9b8c660ae57ee4dd40de7493cec1540e50b4586fdda98ee538e6264fb72f51682bb7bb5305285c287f4577023b8350a84fb088005e36121d9d137b16c4528b4a8a3934db88fd27128733b5f9ea78bbaf239c93bd9b6b4b1fb683e2e2ea911eb4da824b5650f186a7304031b62fc145a9a20a269079ba598dbd183f29a2f35a46eb05276b8ac99a8dc72d76151\nflags = WorstCaseMillerRabin\n\n# tcId = 76\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 55654725a248e323f3d4050b87acae89736b85dc8dd45a9c143b001685c72a70996f3ce99f40be4cdb83b7b420b520e7fa001eecd49cd43c31500c7c502e8c31e309026c07fcba386f0905da79d34b855861018af444fbd519736483fa79ab2d02182a9f0c0e514528f38cae7ef7668829b25d58b569027e4f286a71c1da3d9257a72a234ccde58d1604954d99115db265ae13c012125b5f317ab3297e5ca3e7\nflags = WorstCaseMillerRabin\n\n# tcId = 77\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 6af6ed1adb0d772536d2e80f9f048b9a94cea70f6e15f37a6b5cac22794826089a11c8fb421b3bf8c108bd41a3cd7f34d09466aadc8b043a51b0b3e9c18e0c96e4c703343fcf68d45d5f023bf781de530a1d7946f4d2bcde9d7ef44374a2ba94ad56777aa113abb19b57d4802c18bedb58157dcd52eeca7a3837e65aa97d95f3b757e7eec27a5f890f41399aa5c2831f13a724d798aeabfb642a011c52a7c70d\nflags = WorstCaseMillerRabin\n\n# tcId = 78\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 344b4e93ddadf36e039a4e97783a18c3a84f3d725d5f496f0b3632fd15b1a0c2ddf8f97a0f47401d0bef33c32ef36b2819f5d0f72046ab8bdd68fac28397d1906a1923f5ad96483048254e931a6acb5a3d31d4953212aa58c2f96e94dd5393f1e830e76264af68abfed551f3ff4e8d3bfbc6e6cb296befe2b9d694db4d4dd186cfcd6d697c7aadd92277f9ab85e000dfef3085cd52418d0f9b11605a64719003\nflags = WorstCaseMillerRabin\n\n# tcId = 79\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 2947f606c39ded9591b3314918b7fc0586888d42eb0a8d68bfa0890292f83f948280dc92e897c59de2477340c9fb288241737213d63d006a64b5d9c36b010164953fc68b3e4c7d70e4837b707a2b4b3608d878c7e5c122665299c012e2d5b3630b6862b87e4c680cedf13a6fbcc6eea8ce2d1fc394aa2327d6e0f41c4259b00fb8d8922b4a81432a30f7adf6477b5c436102c83bd1896718d8e795cbd5c30b65\nflags = WorstCaseMillerRabin\n\n# tcId = 80\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 2d586d8d3e1a38f532ed17011ff9d397084633faf6690129eac51e092c67217fb23e6d08f9cddbc38f7b3fafc308f23375df556f68f8dce22247da756e8aded669cb841b6be2fe5a22da4c0d06dcc6d6fd899d294ad0f62de03a7057e56ea6836ce8967d929f4144c9955460bb924fc32f5210919c79e9566e0552caaa130b6ab2e9be086fc97659bb2097adb0ddf82cca17b472ca511735499c448a8301f379\nflags = WorstCaseMillerRabin\n\n# tcId = 81\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 4ae1078c81d196eea211f9c4f762a350b4c060b4d3630bf7fb7dddd2739986b9de2422c9902e5870b3760be7b7926d6aaae633cf0ca9c0e78a2ee03fe193675524e0042073d3be737efe994b7bd93382bf8426f454e4a221fc899764f1059fa30b48ba6db9be33c92e312e449d190b3fa2f1c731277286fa363ac8420668239e0bfc26387ba329720bc4ed0217a772ab214a60d8d2d0889d887960383c420595\nflags = WorstCaseMillerRabin\n\n# tcId = 82\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 4acba34e2619592d5cfdbbe195d2aa9eed8762ac0a8336d947c846fc97d1d934c1ff42f1254de674990f76e514be53b2755cfb4ac52edec66a8127685c8e77e84b06bcfeda0684fcbfb20e2ee05c1202f3cb897bfb1c44bcb6301a9843f8e8eed031a1b4eb913bea04f13390ebd2a033ed151ef8b49b511da558e56cf1e3ac89545219ec026b3938ba9732792a1c89ca6d38c3c5e0e400af528ee477ffcf2ad9\nflags = WorstCaseMillerRabin\n\n# tcId = 83\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 3d809b8c90e877efa20e031ec99d825afc1c1920d8b94e460848b80c3fa0a093ddff5c608963ab74f505a6da96b8068c2c2b3bc1676170dd0c2e65adcaf7cfd0c6b0309634961ad0c9b7f75e2f721f1f57fa9cf5d4f41f60b2ad3fc1d213b8e75fedb69ad157e24ad67f2ecc4099943e19ecfa7e1a34abb9f4bb02cf205906dc159c258973267731ce59d16552d372b9b47f0e630ec677711bc13995e00a41c9\nflags = WorstCaseMillerRabin\n\n# tcId = 84\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 3de7d0bda6eae8145cc70591c4b78b1dd8d9ecc4a3d7edc1bbb75bf0e98fd3fb8d5cd4e94e4cd3ee246617b22426ceec6981681af9f7e6af08bc02bde7cbfa13301f7b88f607e1751285c4a861af2ac69f20d2d600e27b0de873b9ec7bf2cd0725b31032932f0f817084b347852613af9977931e2b3132a523dcd87f545805730b34db29c8c8dac9df8a50f5aa1e36a056ae41b01d04cd9574acaa98203d84a7\nflags = WorstCaseMillerRabin\n\n# tcId = 85\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 5e2a15c7d9bee2668dfd689d027bcc37743259309457147ee7785bb3960dae3c8126655cff9e1302086adb3d1c962c3390f50ca3bf5f666e8a004930536c0bedeef4e8bc3f4dedafc3168692109a239a7d4fbd3aef9e6e0c8665c6379caa6ccb05a6f941782379fb13990f2bc104dc7e0007702c7eea3bb7ee42ffb5d570570b2f5409ebe76d7244b1e8392ccabbfda22515beb0bfad6c006c2a02a5e8526763\nflags = WorstCaseMillerRabin\n\n# tcId = 86\n# Worst case for Miller-Rabin test\nresult = invalid\nvalue = 550fda19f97cdfbd13930911ef6e9e1cb2b7b5215a35c215d51ebffeb435642174cbe998f4451bde2d4bd2ce92ab5b9493b657f1d77d9ad4d348550247b903906109c608ecba7f88c239c76f0afc231e7f1ac1cee87b4c34448a16f7979ff4c18e65e05d5a86909615fe56587576962a2cb3ba467d9806445a0f039907601af77ba7d07578eff612364fbcac11d35e243734aa6d9a6cdcf912a2dd0a12ba7e87\nflags = WorstCaseMillerRabin\n\n# tcId = 87\n# A strong pseudoprime for the first 46 primes. F. Arnault, \"Rabin-Miller\n# primality test: composite numbers which pass it\", Math. comp. v.64, n.209, p\n# 355-361.\nresult = invalid\nvalue = 00907b5573c3d72ca5afda9df723d24066410e3d2b61f89c5c600f90732d0ad7db06a02e209f6792b609fee2ac6f3d73a5805f2b30642d1e2654f7ffd155153e5fbdcb17c76c27fbcc15010ccbfa7a1737cdf032edd5da7edebc9703e51572ce452c2319f1d91bee276d3e1121f9563b1700448ff37346b5a88098c9a682a59ccab86401aeeb74c8ce45dbf8b5\n\n# tcId = 88\n# Richard G.E. Pinch, \"Absolute quadratic pseudorprimes\"\n# http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.210.6783&rep=rep1&type=pdf\nresult = invalid\nvalue = 19bc037ff6b1\n\n# tcId = 89\n# Richard G.E. Pinch, \"Absolute quadratic pseudorprimes\"\n# http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.210.6783&rep=rep1&type=pdf\nresult = invalid\nvalue = 01933ecb87a0c1\n\n# tcId = 90\n# Richard G.E. Pinch, \"Absolute quadratic pseudorprimes\"\n#",
@@ -3566,118 +3665,118 @@
     "b96229e4dd12baecae8680aa038c104df148191a40e5f0cca2b25b456957bd8f2145529e71d25762fedbb3b6cf3023dfacf47200b91b6a4bacbfaa92ffaf4a760ec132868b9e7e3f3d0f7cf77a1426645ad54a2e057fc01e223682e7c56afeec356d4f53a08528e5d2684b8be5eab78a3d9b46cf331\nflags = CarmichaelNumber\n\n# tcId = 192\n# S. Mueller, \"Strong Dickson Pseudoprimes which are not Fermat Carmichael\n# Numbers\"\nresult = invalid\nvalue = 00f4e8aaa62114c404219ed23f\n\n# tcId = 193\n# bound for deterministic tests\nresult = invalid\nvalue = 07ff\n\n# tcId = 194\n# bound for deterministic tests\nresult = invalid\nvalue = 05361b\n\n# tcId = 195\n# bound for deterministic tests\nresult = invalid\nvalue = 14f5d5\n\n# tcId = 196\n# bound for deterministic tests\nresult = invalid\nvalue = 008a8d7f\n\n# tcId = 197\n# bound for deterministic tests\nresult = invalid\nvalue = 018271b1\n\n# tcId = 198\n# bound for deterministic tests\nresult = invalid\nvalue = 3e9de64d\n\n# tcId = 199\n# bound for deterministic tests\nresult = invalid\nvalue = 00bfa17dc7\n\n# tcId = 200\n# bound for deterministic tests\nresult = invalid\nvalue = 011baa74c5\n\n# tcId = 201\n# bound for deterministic tests\nresult = invalid\nvalue = 518dafbfd1\n\n# tcId = 202\n# bound for deterministic tests\nresult = invalid\nvalue = 01053cb094c1\n\n# tcId = 203\n# bound for deterministic tests\nresult = invalid\nvalue = 323ee0e55e6b\n\n# tcId = 204\n# bound for deterministic tests\nresult = invalid\nvalue = 1c6b470864f683\n\n# tcId = 205\n# bound for deterministic tests\nresult = invalid\nvalue = 081f23f390affe89\n\n# tcId = 206\n# bound for deterministic tests\nresult = invalid\nvalue = 00ffffffffffffffff\n\n# tcId = 207\n# small prime\nresult = valid\nvalue = 02\n\n# tcId = 208\n# small prime\nresult = valid\nvalue = 03\n\n# tcId = 209\n# small prime\nresult = valid\nvalue = 05\n\n# tcId = 210\n# small prime\nresult = valid\nvalue = 61\n\n# tcId = 211\n# small prime\nresult = valid\nvalue = 65\n\n# tcId = 212\n# small prime\nresult = valid\nvalue = 00fb\n\n# tcId = 213\n# small prime\nresult = valid\nvalue = 0101\n\n# tcId = 214\n# Mersenne prime\nresult = valid\nvalue = 7fffffffffffffffffffffffffffffff\n\n# tcId = 215\n# Mersenne prime\nresult = valid\nvalue = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 216\n# Mersenne prime\nresult = valid\nvalue = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 217\n# Mersenne prime\nresult = valid\nvalue = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 218\n# Mersenne prime\nresult = valid\nvalue = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 219\n# Factorial prime\nresult = valid\nvalue = 02611501\n\n# tcId = 220\n# Factorial prime\nresult = valid\nvalue = 00f17a60a5d627ded85b6a9a397c2ba63bb27910ccf7e3135d4d1ae8c9f5cc1e4bf01ea704abb2000000000000000001\n\n# tcId = 221\n# Factorial prime\nresult = valid\nvalue = 01e764f3171d1e44a5f0c50c6537730168041cd93fa34898140da93d3df2939adecf61802daa63eaf08428d72148d63f267f22bd24cd411b7f25984b057bda5c11510000000000000000000000000001\n\n# tcId = 222\n# Factorial prime\nresult = valid\nvalue = 3a7c596683f12898e64bf1355bb9bc85f01d91307e568d01afdc9cf0b3fa9e464b140d899d9bf62a0c61c2bf0a8bca1de36f6d36a5be4aa212681896def96f583c8a7cfe362b4e823bd244f813e575391a029df7012e738d3e2e8e0181ea40000000000000000000000000000000000001\n\n# tcId = 223\n# Factorial prime\nresult = valid\nvalue = 72b20ce22e5616f923901a946b02b2ad0417882d9172d88c1940fec763b0cdf02ca5862cfa70e47fb8fd10615bf61187cd564a017355802212a526453e1fb9791014f070d77f8ff4dd54a6d1d58969293734e0b6bc22f3ceea788aa33be35eed4bdc1c8ceb94084399d98e13e69a2b9fa6c5583836a15798ba1a10edd81160a15662cdf587df6b816c570f9b11a466d1b4c328180f614e964f3a5ec61c3f2b759b21687a122f9faefc86fe69a3efd14829639596eb7f2de6eab6b444d06233d34d0651e6fed17db4d0025e58db7cad8824c3e93ed24df588a0a4530be2676e995f870172b9e765ec2886bce140000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 224\n# Factorial prime\nresult = valid\nvalue = 2c47a7947e4ef970e990c8b4a793b5f7d49b9af95a12b9f08475e1cf58f31046fd224c3ef20a736d7cae39a2f989d934c2aa644483aa6e348bd41c34a6819d7c08fdbd93a7f7c24a4756bb7dd97516287e161af87e56735c06d61918cb2fd4ae9dc1c7f2cbb5749934626af5f4db5bde6b748072c004110d45f6db0fe51c4889ff053bb2a24f83bbb80798b94e5d7a189599d85792807626de78a61a7468eab70a2c4dda6200e0c8328408e0327897220bbe009cf8bbbb23fa1cb5fbd3713f7172f8186d059d0b97c2ef5b096c558ec61f66e81116be44f2940f4c93b67d7cd3564c266540fbf0bb95cc3c52c9dbc71aa6a424457131aec3285e6ba46e828e635f3455e30b6db3e4680ba04c580fb569145f6371a0d352f40321751cd26623e92a6c5c9e83eb655338c9077826148e23c3705b8f11b15a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 225\n# Factorial prime\nresult = valid\nvalue = 1774015499125eee9c3c5e4275fe37ffffffff\n\n# tcId = 226\n# Factorial prime\nresult = valid\nvalue = 22d4fb39eb23880b4674bcffd06a18547ee73e7e77f1fb29c0dbfa66ed52cb8b22bbe0ed9b2a2b779c9037d7b412a389bec5ffffffffffffffffffffff\n\n# tcId = 227\n# Factorial prime\nresult = valid\nvalue = 371196ced90a51b120fd9171fa388fe8c2e634f9ee10f4bcddddfd269ebda2f3eed661eaab3cfbe6914395a73735701d7d65e278f76842b02d1f8f5d941d652067ead60bf9bb537ae7e13404711ee80b35bbf5936641be34d53d4b3bbd025bed4be7fa44113cfea3ffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 228\n# Factorial prime\nresult = valid\nvalue = 0120dd73742e20e30f56d82ace2d9ff917e66b2c92024a1444490511d41a39685a9901187f206b5a248b9e52d82f15820801be21beb73ff9e0c8150c69334f02fe9593493b55d48229601857a3ca4449a444d2c0566936deadacd46310d04480265834fe9b5e733357b0c73a0d1e23d85e401e8c3b60571045a6bfb1a19f4940140736098dac2d705dc1339370f1ac19252b931c450bb260800bb40aa404dc54199b7251abcb50d26fc9de82de037c3b9926a2958bd6a1d8690805c0681f5cb5d90b1447cb7e5d81c436b913d743372be382e3bb2d1cd7185948136957af2496888060c7b7ea519b173d5f190c27c70f3dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 229\n# Factor of Mersenne number\nresult = valid\nvalue = 07c97d9108c2ad4329db02eb8f166349\n\n# tcId = 230\n# Factor of Mersenne number\nresult = valid\nvalue = 010001\n\n# tcId = 231\n# Factor of Mersenne number\nresult = valid\nvalue = 663d81\n\n# tcId = 232\n# Factor of Mersenne number\nresult = valid\nvalue = 00b161194487\n\n# tcId = 233\n# Factor of Mersenne number\nresult = valid\nvalue = 08112264cd9bb77f\n\n# tcId = 234\n# Factor of Mersenne number\nresult = valid\nvalue = 0b73493decfd9b68318ef9\n\n# tcId = 235\n# Factor of Mersenne number\nresult = valid\nvalue = 3d30f19cd101\n\n# tcId = 236\n# Factor of Mersenne number\nresult = valid\nvalue = 126cf51772d253cba3f5a7cf\n\n# tcId = 237\n# Factor of Mersenne number\nresult = valid\nvalue = 00d3eafc3af14601\n\n# tcId = 238\n# Factor of Mersenne number\nresult = valid\nvalue = 013540775b48cc32ba01\n\n# tcId = 239\n# Factor of Mersenne number\nresult = valid\nvalue = 3a294c585a8f5c7073e36ee3637cab2586d049baa0ba2c911801\n\n# tcId = 240\n# Factor of Mersenne number\nresult = valid\nvalue = 03f1cb0fdf0fbef0f3747f239f5a8983e72b455488b792c8e29308f8c78e7f\n\n# tcId = 241\n# Factor of Mersenne number\nresult = valid\nvalue = 37a5f7f30fd2d1f46cd794e8337106ccebced1189c1f5b6b3c525b64b6c36768785f7912013f\n\n# tcId = 242\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00c4ec4ec5\n\n# tcId = 243\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00c18f9c19\n\n# tcId = 244\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00a08ad8f3\n\n# tcId = 245\n# edge ca",
     "se for Montgomery reduction\nresult = valid\nvalue = 00fcfcfcfd\n\n# tcId = 246\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00c71c71c7\n\n# tcId = 247\n# edge case for Montgomery reduction\nresult = valid\nvalue = 3d70a3d7\n\n# tcId = 248\n# edge case for Montgomery reduction\nresult = valid\nvalue = 3ef368eb\n\n# tcId = 249\n# edge case for Montgomery reduction\nresult = valid\nvalue = 69d0369d\n\n# tcId = 250\n# edge case for Montgomery reduction\nresult = valid\nvalue = 51b3bea3677d46cf\n\n# tcId = 251\n# edge case for Montgomery reduction\nresult = valid\nvalue = 7e3f1f8fc7e3f1f9\n\n# tcId = 252\n# edge case for Montgomery reduction\nresult = valid\nvalue = 43fa36f5e02e4851\n\n# tcId = 253\n# edge case for Montgomery reduction\nresult = valid\nvalue = 3454dca410f8ed9d\n\n# tcId = 254\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00c5b3f5dc83cd4e93\n\n# tcId = 255\n# edge case for Montgomery reduction\nresult = valid\nvalue = 593f69b02593f69b\n\n# tcId = 256\n# edge case for Montgomery reduction\nresult = valid\nvalue = 008f6ec07432d63dbb\n\n# tcId = 257\n# edge case for Montgomery reduction\nresult = valid\nvalue = 101767dce434a9b1\n\n# tcId = 258\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00fafafafafafafafafafafafafafafafb\n\n# tcId = 259\n# edge case for Montgomery reduction\nresult = valid\nvalue = 0c934ff1a0c934ff1a0c934ff1a0c935\n\n# tcId = 260\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00d2f87ebfcaa1c5a0f02806abc74be1fb\n\n# tcId = 261\n# edge case for Montgomery reduction\nresult = valid\nvalue = 7880d53da3d15a842a343316c494d305\n\n# tcId = 262\n# edge case for Montgomery reduction\nresult = valid\nvalue = 6a850096a850096a850096a850096a85\n\n# tcId = 263\n# edge case for Montgomery reduction\nresult = valid\nvalue = 0098dbdea62334302c77d10fbfc4b593eb\n\n# tcId = 264\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00df0041ff7c0107fdf0041ff7c0107fdf\n\n# tcId = 265\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8af8b\n\n# tcId = 266\n# edge case for Montgomery reduction\nresult = valid\nvalue = 7f26fe4dfc9bf937f26fe4dfc9bf937f26fe4dfc9bf937f26fe4dfc9bf937f27\n\n# tcId = 267\n# edge case for Montgomery reduction\nresult = valid\nvalue = 009b8f4f9e02732385830fec66e3d3e7809cc8e160c3fb19b8f4f9e02732385831\n\n# tcId = 268\n# edge case for Montgomery reduction\nresult = valid\nvalue = 64a9a50bc0a383524478973fdf4c22bf1b14f339bd92a6942f028e0d4911e25d\n\n# tcId = 269\n# edge case for Montgomery reduction\nresult = valid\nvalue = 7f95438b41e0500d578e97c3f5fe550e2d078140355e3a5f0fd7f95438b41e05\n\n# tcId = 270\n# edge case for Montgomery reduction\nresult = valid\nvalue = 5f1bbd6c9500cae5d85f1bbd6c9500cae5d85f1bbd6c9500cae5d85f1bbd6c95\n\n# tcId = 271\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00967300c9a633fcd967300c9a633fcd967300c9a633fcd967300c9a633fcd9673\n\n# tcId = 272\n# edge case for Montgomery reduction\nresult = valid\nvalue = 00a305942530f7f11f9cd2c027abb32354eb8b77a1c8368c165094c3dfc47e734b\n\n# tcId = 273\n# negative of a prime\nresult = acceptable\nvalue = feff\nflags = NegativeOfPrime\n\n# tcId = 274\n# negative of a prime\nresult = acceptable\nvalue = ff3b13b13b\nflags = NegativeOfPrime\n\n# tcId = 275\n# negative of a prime\nresult = acceptable\nvalue = ff38e38e39\nflags = NegativeOfPrime\n\n# tcId = 276\n# negative of a prime\nresult = acceptable\nvalue = ae4c415c9882b931\nflags = NegativeOfPrime\n\n# tcId = 277\n# negative of a prime\nresult = acceptable\nvalue = a6c0964fda6c0965\nflags = NegativeOfPrime\n\n# tcId = 278\n# negative of a prime\nresult = acceptable\nvalue = ff05050505050505050505050505050505\nflags = NegativeOfPrime\n\n# tcId = 279\n# negative of a prime\nresult = acceptable\nvalue = ff20ffbe0083fef8020ffbe0083fef8021\nflags = NegativeOfPrime\n\n# tcId = 280\n# negative of a prime\nresult = acceptable\nvalue = ff5075075075075075075075075075075075075075075075075075075075075075\nflags = NegativeOfPrime\n\n",
 };
-static const size_t kLen136 = 26217;
+static const size_t kLen152 = 26217;
 
-static const char *kData136[] = {
+static const char *kData152[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha1_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 0747d520ca9b2dfc0335cf94301140b8102fb838c92ea99917e354e25709602dc0cdef231ff26ad2dfabbc391e723072a4ef52929f3f1cf0216e44c0093030f8ac29096faef28933bc9b924287014e2e935e2145be4752ccb82cb7646271936979cab73f521eeb27855ac2a410834ae5082eb62ef6f9899ee5cbb624a8d8c04ab7edcf78fe135d0f808f63b5de6e071779bf1d9eaaf8d3ef965486f2c52625e6e57a651c7bbd0197c99c057b3860a3260c864a11b3cf22ba44de3a3b3f3117e64ebf9a91f626ebb3f3c26d1b0bb80753468d4bf6a997b28335f20ed8c384d7558360a9ae9755661fa3749846b174e6bf330e52d09941f6ccd7de5004779f9bb9]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e5]\n[privateKeyPkcs8 = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e50203010001028201000747d520ca9b2dfc0335cf94301140b8102fb838c92ea99917e354e25709602dc0cdef231ff26ad2dfabbc391e723072a4ef52929f3f1cf0216e44c0093030f8ac29096faef28933bc9b924287014e2e935e2145be4752ccb82cb7646271936979cab73f521eeb27855ac2a410834ae5082eb62ef6f9899ee5cbb624a8d8c04ab7edcf78fe135d0f808f63b5de6e071779bf1d9eaaf8d3ef965486f2c52625e6e57a651c7bbd0197c99c057b3860a3260c864a11b3cf22ba44de3a3b3f3117e64ebf9a91f626ebb3f3c26d1b0bb80753468d4bf6a997b28335f20ed8c384d7558360a9ae9755661fa3749846b174e6bf330e52d09941f6ccd7de5004779f9bb902818100fe3d238d376a3856d9592fd4961c17a7fb0fa39d442e9df22e7eda115c648c5cb738df89ea92d8378558d0d9c1cf3d8bff740d3743a0140a6a7523e9176c2953b2c11d7f44691cf8bec2b34fb59c649535983319488118c03118ae7445e70df466ce98671260f05d5068ce777da97e2ba84779490500ceb4ff7f62ceca9a147f02818100be814af26bf3c27115bc7595d0d12a1af7713feca877ae6e6d858825eda3d192704774f42e1ae1b67f1739e8c45a0476388070fa545b7cc96b8a44003bc8d07fde73f5bcdd18268395dcc2842b5023ff14b352382607b7179a5ea330840fc45045d86e0acc4feb135f0ab9b7ce6b8eb5f5a575f2a2a8de299c0d3f506df4879b02818061bb4cf4572e0cf44ddefc0503a34ef0b31142fb0c9fc2f5bb2be656302732d1dd590e8d6cd0002fefa1c1bf43c28fcd4668ed3fa64e5e05d700aaca4ac7b867455af924d83e73f5a7171f68efce6bd7f3df4b1d5802d069e935acb263c0bb5b8d3db3d64379624cecc12d453fd82cf9495a18649a78c1fd500e3f04715ba3af0281806649dbe920a7a8ceb982108cd9ab857527498aae52a2b86918ab6b381a4a2cbbf94794f78b4de9c5e8a59af56d807c06d23dbcebdca1a6f62ba4f8f03b298f32294a9036d16c2739de1cc3e0ddb4d12f2479487b57882afa246c0e297daf4d94607c5e51b3f4715f5c57d0f26d867901209db02010d0a541284640a9b9f0636302818039ec606f5c9f1f33d964606e128e9e90cff932772c5715aa759816d504efe2c46206f3379aa61d31f88e726b50dd80b8ce8558a0d7408525f58c3399ce32e239d70941f12d21e7761c043e0b02220d25ffd03571c7ae5bbd59c31f48120676f9d7c370a749d8491bdfcea01662a136c85d349b6c710fc6f6ebf8a7a79b62adc3]\n[sha = SHA-1]\n\n# tcId = 1\nct = ba366806e4ad50f76c0d8f63a84cc8c1045fbb2f9bef31da89214b2c8553e2d0126fb91e8ad9c78d1515c1593fcd589278369f83d8da3508beed573b2e8a2e61e09d9923476cf2d1cade862344a87c8e50d6600754089992851f44998be57109fe4f9a787fc13cba351f335df5f4cd656858a9d9b547438db4e0e81640618104fac10c0227733f85e041a322459c13ebcf4855fa69519ab94301561146830680e1616fcf4652d30dc6d0cd0aba397560d2a5b9556b42d42ee2088ef8793469d1142331a0b3018feb153999a2439349a709eecbf09568643f8e5d3389073eafd93d37544057e567c3a553269ea1b15a49388127532ab967860c0406a4b0cb3adc\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 8773fdde3f148ec33d4facdfba812e44001d90861c047a9eefe6c6540212795b50dd186bb7712b8448830fc1799e0543b7093e4770f301e9216922e80280e9b50582c669e3a9a4feb08ec6f5b2428dc7efbcf6fe49feb61fd2795af1c8b23acb605812c9d7586e4f48e4d758f0695b688d1b4b563067852b1ce9db5dc82aba29ab416178f616426e5d0caf3f9903de2a5beeb970af7281e7cdacaaa00662ae36fb0365c20c653b670b3e7be4b0680932f3254d48ec3505ca1547d1be27d2414a3539f405df91057f4f97aa7796d7ccb69ed553447131fbe79611756b7e564bba7d76ce9256168446b34498a2e91d9a955a8aa98a71a43d65ee60fcea39d811fe\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 504b4e0d94d800a9da92be8fa84fc345f7ab4921ec53c073c79592b347a692cce2450135e998e07bb75ed7ee44f047f75a07e37b9c912d3d529b62bef144952d5b202246ad32c5d34ec8559c4163e2145fa5fd4d56de28cbfe7e537d5732305945c9370bbc6dcd72b3296fd54a2660365715f7d911099c96dfe6d114eec7b4425cb65701aa9e08d99c7ac20179656bb678554d74baca4501b5d0b366c97224bf0c8734e00ff2af8b916aef8b83142d5ec142493e0cc4c57326515a50a31ec2c6703512034642e5789649773d2f8312561bf2f2f6000cebdbf7c7a95fbfd0f721c31ba392acea37568a24f176767f71b31f407573deef95c305e0e063db0e9168\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 25a918a0c7985a72f18f6b6216d0e2d19a9b42a4d5b680e995c3c5c584966e29c6179877cfd0317f9e4dcdc87f76714994e4407cd868842350e28f328b3f33746a897ea9995575f328be7f9912369482ae1a66ff5b7a1c8ac8fd4e5771e58077b54a55db6c6849ff288d50de0ee1e45bfdf81ffaed16971f19abae660338a3a9240a0b732984fadcd28a85c680f0dac8b73306481a096f700706e91f7c100ce64e1c6bbabd419807dc167f1f924edc6f44a69b75a7c72989b25ce35480433bc456c6afa93a0e9b4156d75863f9440ae442eefd213b8a3f53a065daa8cd0206886d1544c3bfecaf62659cfa591da5e920d7d4370a9aabf7f9983fade101da2dba\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = a2550a9850903f3142bc1b1b54e45d7754e75ff0d39a8ae813b51eb8165be08a4c0366b93c803ef161650f8cb966f7dd4648f40363dd0cc37595e43756078955ef02e415b3e0efd5f9744d564eae763e307e893002dd1a9d0ba2997fe6658f3689fef4f4f21e7a972c0dc642993ff6612c6e6b43f9ce53674919abbc13e42772beb8c3f3f655df9dc9839e075e01beb9b93d8e016f57afc9a0207d9189b4bcb14ba6459ff5fdd5f2fed5260ac9a7a092feca20af0f23a00d8b990c074ca23d964e19e49c17c970bc972b70fda2b6c6e99e4e7ff11902ea7126257fd1964e7da07fbf413c8becb48729fbd861ddcc3fa6c3df2355759ef1338d02551b7fc80a88\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 6f35b56ebd7e12d58cf2239b3c926d21d54222da0d1943bcd0c0e446bc9213526c63ce0736b11340754460036eeac885dacac617499a58c56a6df5de1e91db4e1befba0237f696d1b6a8447163b839ddf082a1c5f8c1315f7fbab45b2bd8011accd5b2b1e3d4f35315e998eef82f368a72728817f7369648b9b1959781449707a5a668a6f8eefe5624135ff8edcdf9594eb4db32f27b2a6f5f7c6406c2f2c7b818f859d9e379a76c17b4d1535db7404e77d611f6cf5b4d0205f885883186d603c7a9920934fb5886406a38013f7a1864d5074f89ddc164c9e13f5aa5e4eb13dfc3a53b153c56d9f6403bf2ac5dde9c42227201fe314984752b5b41ef0064acb0\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 3530605f43b5539c80398f856eea8d88984af4a6a08db3b9d4093cc80d1a313c0ebe727eb2c45cec2025eee60f385822c09f82e3bcedf66b79c2b34a4f41aa8885eca5b9891798d47914f947c76881dbfc3f21ec27a11dc926c647b6b2a7f3292ec4aa32e969bab49afe203ffd79b0c1ab5777a041fbe4e9e1a679fe2d82e9c267ee7fbe54e9e0def68d8bbacb1e53da99aec8ba9255d2ff6676dbcc58498a386dd8a6b3cf0222a9e14fd03313303bec9d0439ff0e8a5a09ce2926ebe86cafd00cd8ca761b88df9cf84f7b8e07cc5f655199ea81ea6407ec264b5971738967a2e977132dc589c72f8bb639a9429feb512d8d32c441f7e1ce6c6befa08140a090\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 4d0cb9e23ea2f25cd93f6a4a5b9189156178572214c2bbc773158ed82b83cdfe7ac1e96d662afd46a9225b9e8d1ded274e00048c058d4cb66cccf4eb6c4ebaf30b97e3ff17a21223cded8708524bf75e3dec075833dc953dfd9a1341072f1485c60018f92bd41cedd0510085d818a5cb4df32c447294f4245385e1e5c4627c41450c1dfd22f34f96514aed1565976735e321c266300de6b93dd93e4db4e521b1a269947cb79bccd472cd40e3fd",
     "430726723cb97bca50e610bd81daed31fc164c18ef378f68e405ee6d978f97cc042dd266c90b909ba52128824fea7f4496ad56e03fa4aeb528d2fd3d9bfae8295e1a5306b389654b1d7058890b5dbd6770ff5b\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 873c4ecb4858c60218b4ff5fe75ec216502367e0a8446fef2302da892816f127a8bedf7e2fff349be493857c4e363493b28f90365eae44323a933eae25701d84024c84e09b9163de0dc7ba2d44f97c29af5b9422c417bb241a2fd326efd9aed2dcd7cea55bb16b9571647eaece0a0ca71f7da7decfbc588cafa8beacf0b286e143ff77f05407388b72c89c6a4be35d074083e2a128fda53ba7d3363c0d261430667770fd7b42032a4d9764fa86dd4834eba3864acf3e0c230fd03581292562151faa1ed3f8433bc63472c425c382d7425b11c97969b1fd0fa0b014d47d87af919de6df72ba52be888e44de4fa63c215ea80fc61072a320a24e99c6a247880c9a\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 91de22e76714eff612a41318303dc5aaf154dc5e4b79df8495b5acba18a27be6dd454f2c39494aa18d1911aabf38bbad0460922404c6e2c08ac3abfdcdb963623f1c1c07eb2096dff7064d3c55c6221773e4b2a80adaeb210532ec76a3c92832b0aaf7da03cfb60303e0116cb6cdead2b7371cbfaebbf3e511503b9b8bcd54c13c035a44368fba19dfb8735c6117a3edcbe9939afabd7204b6542c77d31a6a244b10481211ec99e45231203720043fe89a57c7a612b3588b12166c55edec13b8265a2c091dd859d4f34eb66ead8b583fd1f0f0ec739b92e7618c1abe1e3e9219fc43f628fe89ccdf2cabc07ffcc5c485c4cadbbbeb02efd8394f4db0b72d81d8\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 8654643090ce426118dcce2bb0fca3b2a4ed45589d73ae2f5683334f17ca5b9f41eb97ff566cbbc0171d8962fcca465f66f4cf14d0114d7768bbac1dfb726d91331670e0e88ce7286e1f0ee7acd5cd75e0d325adc9f47ff02820544770ecf46f381ff330a5c75978e8d248cc12f0752cc7c452265ae919f5a4dd7c20023fbf51d0b413afe09f746114d16d1be499c98d270e9213a37a2a745a3bb216bd30a07d110558090f4fe73debea009e18eb3770eeddd7150b4c7231539f7232d837836490c9547e27dac00efb5a8ccdf9a7c3c1d29c035170a517db899ee61925cc7a2cd278cf576ebe8281bd3a4f2665f15dd0b2e61bcd65172c2fff50a86a2adbf2f1\nlabel = \nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 7866ab0f81437de93442325f02f86a305c4a4a0871207ff3203746c26a43fff5979e68c74264c34dad13955a32785ec1523fccb264957ed6f6b822b5c052b9161d6b75adde451c6f8d637a75dffc9b9a9103934e777cef41b7966bf730a648e5b96aa587936d460124dcec515b55473a009844f19cb2794bd739557d25417e2c036762a921481d728b4d32a8015b17539b7cc2a16a2b33e43b85561a2119fb6c9d8ed42d6bec324281be79e2f79426c653f8445a20cce87a2c263e7933b8ef3fa0b9f9f38fd115fde459e5d32eee2412c0af06d2f6454e04ba060ea87c5aa0d4b365f24b4f05bb27c4aa42061a45cdcef1a39118018b875dfb9f904fda4d80fb\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 55fe2f0fdbe16bc284545cf2be83d2a92a526f52e33e7b116b265859f14433fdf3ae92e10b3a906ac95a4541c42eb80b3aa963e5d9dc4d3414bb5f378cfb3d50af10e9e84fe0e31c98e091643ee99fda65a2a8802f9fba68492beab9e606501b8e82a3d830175137617ae0352bc790b4ecfb76fc126c34fc600f5f09b58f3915155d3ae4820d91904cb92b61fe9193d150d4f0b6bbbaba2692eaff15d2a0f01d0bfb81228462954f404ae06350a24469381047a62e281d2bfa798a3fe19ab0c808de18ebaea11941e6325c04927e0af3499043a42705cfece04a60b6ed8c280869787a4f3d484218f09f0b266efc3a5b442098c82cdf809820cf3b8e7f6ebb8c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 930eeedfc0e94791a2118b228c4e1522ab52f5fbe53373d9c11b4d1b2595b121780f4312a4f834614df0c31425483dd845279b08fc0f1081dafcf51f32958505960e2eb9b9672c9a72a12fb45a25df678009542a171ef8d7f07b11fbe52db47957ce38d9242852a228a4ea864c36d14d58bf41d2a1151b8c18cad777c9a6f8542b2f3c9c84990a461df613f36a0461658b98ba193e6e6b14765021d0272536c044d8820bc3a5da2404f11a35c632b8c0f9ee8f5f3cf6c77934a7b03750031d6d7cd99623c484c5c244ddc07559ea756886d235844d9c6ba4aa24fab14e9c4ed01bac85d332869a8ba8c05ca7a074409e8231ae38c0e1bb98412fdf124f3ffa9f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = bbf27bdc6311952dcf7bb31459ad6f97e09d5948c7d21226c656121aaaf3ac28118efc49e379eabad3ab4b576b494cf438d0e210b8cbe6067a07ca78af7df1547ef9accb15c5c2601c2a020780cb14757201bfab58bb85ef5642d9b5b97ab768f285eb2012f1ed8f7bbd2bc4ac2b9eddbd656dc7477e800e95924827ba6d4f5bfae058e34150dc676e91cec780528d6bdb9d39c4af4005035ef45afeced57ca8f2817b5fcec969a6afa2e0df7cfe5b818bbdda76d7b760454f682d553f6976562f7f529ed8319cbc98bcc759db0c5f3c7c47557092bb3e0d3b208ab6fdfe75dd5c081ff4fcdb08556e78877623fdc4be029933bb659fd3677d62bcb5d8d37818\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 0fe6fcde58648f13ebd5f0ccbd68458da8ae18dfbe82238d2fb90eb42b743dcbe7b12b33f77e31ca85eaf694dcc1159c2fd4778fce93ceca25f5123aa63ad8ddbf776400d489d8d3d46665c9d22b4382d468881b7aa30c97cc6068a9031a100cd4b035426932c488a6396de7bf42bdfc8da04af6ceaa7836752feccfbe5295a757dfcc25c8e8c5cfe122bcb764f0660528e162c3205e0a6b9f8d399f50529005467f56ea70c0182c9d679d13dbb0e1ea24b84709c1681418cd174f4467f943cd5a1802bd0ac666dabac72bb3be4d3ab9874b23c4c394f3287075c60454daad062f2e5b81bfb14222c97caef742482c6729c9b44de880e07668b59a93d8e27d17\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 0a182cc23064e7b1d11ff906ed40842213938431906395ac4995b9e8e56fa3835e9fc4c4ca81d5cd0e14814bf16de6e07ddd949b43522387e8f543672dc965976229da3e791efccf4a4d28c3d5cc8c32f7216e89400794c495a54d2b38f72e30570b43b58c657471fb9b6be7a999807976263cc259c06df51e632beecd7372e2d0ffa17f79d029dba8cf00611caa9e05bdc0ef87d9a2f5f02e4732aac5bdbf1d754e2263a209a9b211a1a8712a2b9a8dbf676fb7bf130c505ec1972e4c5c4baef2e33c955e63d55cecb818f9c85dfb1fa54207a406f153ce77d946c60c4faa289d955d73a8c64f5d4dbc2fac3b4741eff3b3fc205e1bdaf7fabd738d01eaa404\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = affb9604fa25ac904e054b0401d51c566c7556c965088e81bb0181dc16532b5c5800117eaee491c1dcfebb184ca00ccfb3a934a4e3efd42a2249ef6d4a1df93af90db0d135a000c97fc1092e85cca90770e4b3583baa654cd127b5ef7549d7d7a4dab1ccb16b7fb0b0eaa6ae401e023efa97ef61a136554d013c61934cb9996db2cbac0a4b68651285ef3421ae2276c7e65dc81d8e3089c15e36e2bcd8f42926daa907f56e5fa4d6a8f3891e71b4f80a15798a94bb64aa68e295bb0d1f6669ea761de0792fee6e0bff465e53b1447eff610b33d38eca86d9c66b542f579338fd944f6a116333dec3684e4c78aba1b1ec12e8e6712206f81701d30a3b43688d0b\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = a455a8536e5295ac29243e3f7bfd2f6ebf1aa7e3d1333c1bd9fe05b6ade3aa913b859dbd45ba093ae9b034f619f99a69eaa680ffb7be3ab38784648f6f31f858200992f95740ff2edb835f8fc03bb6785278ab9eae742d5966519fa9f584f0c3044136d04fe12104ec8a8bd07950334db8df8a83af843347a10974245c723fc85686240eefd0cce09d81a63c6f6a4d2b83d29ff9ad060129e5521da5e635dc05796ba540f1dad25b9423bda365202709e5e287a2b0d7b09a2ab6031447e1a2ae8efd9e980a29dff1458327edc0ad162670f80343d8490118856f396c72058227f57b9b0ba66b13c4e7117538bcda3e937dfe05d10a764c0ba1f5626478d4fc72\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 96982e222302818f506285642768615f426bdf9f3b4daf80ec5e3ea26cbbe7f5ab48cbdaca4ab0538bfdd91f7678101b61181806f48b2d6fe778d899804a888716a0c2c3a7078513b1cbaf1d096e6fdc83abc2fe40b6742709a2e51afd8e767aa4a72bb4554286140533e4bd5432010d6016d308d475eb2a40165d46dba630c11a183532f658bd538096c1877fc4d843d9d2d8cee570dadc9895cfe2372df9601fcd74399006466fb9ed923b7d9abbad9bc7de963e0eeac7bbd56f20e1c254ef722d523fa8f3bdb0b91b37202e11b4578a3252673e69ec05a05ea60913ea1b9e6228d9fa0c85ac6d794dfeccdf7595828b06df2bdc89fd8d22629fdfee205be7\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = ae11f45e24cffa8e4f37be34ec87852db77c2501",
     "c1274e23477c50d62313480ba2ac9de76b790a355b50c2f2ed2dd061cd860ff7932cadaa0e1565e43d4177ac98e26d964e81cfb7c20fba7e2b0853fdcc7deab75b62ef5f231ea29f10c83c2f27c9215b7d10d85443d967ce7fcd41b0de999d9f98a072dc80fb5857d47e4373c736bae728932733d0a071164b6d6dea3205e267bebc287d9b5035a76978dcc2f38946dddca48a6a6035557dd9e1aaec4344dbb457612eb27b9302e02ea0c9456984e70faf235aecd20cb32f3da016c9a8a8b23e07a06dfa57f5a25853944cbf538c864169566797a4346e52fcd2ea1489799109820cca4b6249502270dfb1f6\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 8ba65949d2a53d5a933abbdff1efb4b6861484dc230bca0c363a66202691bd39d94798664763d72f55edb37e8cc791b3904c42c4e1b75e4aaad312f5dc53a246f211d19e311a974c92ff8af0573dc831c51194e59c920ec3d6325f06b9c4bceaa6e55696b185163e73aac401fc1925cffcc7b80985bab727288d258a3c60f7d3d2d8ec80dcfe7547229183a19247e3ea10afcb0fb0c8e7c4c57bd5cfd5529abbd407f959f4b9c492411691da445fc5ff3ffdd11fcd20c2a2936d1373b55c2ee41a7b43c049b40cc55f7bc85e46b0d8464a3add0bf28a0d3ee46c12e6fd600f840ed65f11d590381fb9c6a80a46d64570eb4f6930ed24087e47aa12eca2a1329a\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = e2dae040ee2a2d4c4a0e620b5dd05b56df67f079884f0bbfb64a3eeff08fdaafdccc458b014d53f0574f9ec5514ef21524373c0408b2d67c11fdc812762812db75786693b66313ec08cd001d90787a1b4cee69d3a9f2cf9ab81503be8f205c701da8a39d70b1e8cc40f132b3bed46ed8f466cdee0d032955dacc5c373789f5d58886a3a5cff7c841a5b34789a3091a0f1903a2227ac24ccf0a2fc3739c92210afdf726d53e07692f3fb82f431f2779768766608111f6f4f9cfdf256d79c5ab13cf68e9d494b2c60fd5eeabdaf4b0c896fdc190db93c78c85671ed3ab6b48b7bef639dd19b4f224d0667f1fffc200019773ad09be3f58b1eb5a7cec3289ff8f9f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 000025a918a0c7985a72f18f6b6216d0e2d19a9b42a4d5b680e995c3c5c584966e29c6179877cfd0317f9e4dcdc87f76714994e4407cd868842350e28f328b3f33746a897ea9995575f328be7f9912369482ae1a66ff5b7a1c8ac8fd4e5771e58077b54a55db6c6849ff288d50de0ee1e45bfdf81ffaed16971f19abae660338a3a9240a0b732984fadcd28a85c680f0dac8b73306481a096f700706e91f7c100ce64e1c6bbabd419807dc167f1f924edc6f44a69b75a7c72989b25ce35480433bc456c6afa93a0e9b4156d75863f9440ae442eefd213b8a3f53a065daa8cd0206886d1544c3bfecaf62659cfa591da5e920d7d4370a9aabf7f9983fade101da2dba\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 25a918a0c7985a72f18f6b6216d0e2d19a9b42a4d5b680e995c3c5c584966e29c6179877cfd0317f9e4dcdc87f76714994e4407cd868842350e28f328b3f33746a897ea9995575f328be7f9912369482ae1a66ff5b7a1c8ac8fd4e5771e58077b54a55db6c6849ff288d50de0ee1e45bfdf81ffaed16971f19abae660338a3a9240a0b732984fadcd28a85c680f0dac8b73306481a096f700706e91f7c100ce64e1c6bbabd419807dc167f1f924edc6f44a69b75a7c72989b25ce35480433bc456c6afa93a0e9b4156d75863f9440ae442eefd213b8a3f53a065daa8cd0206886d1544c3bfecaf62659cfa591da5e920d7d4370a9aabf7f9983fade101da2dba0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = a918a0c7985a72f18f6b6216d0e2d19a9b42a4d5b680e995c3c5c584966e29c6179877cfd0317f9e4dcdc87f76714994e4407cd868842350e28f328b3f33746a897ea9995575f328be7f9912369482ae1a66ff5b7a1c8ac8fd4e5771e58077b54a55db6c6849ff288d50de0ee1e45bfdf81ffaed16971f19abae660338a3a9240a0b732984fadcd28a85c680f0dac8b73306481a096f700706e91f7c100ce64e1c6bbabd419807dc167f1f924edc6f44a69b75a7c72989b25ce35480433bc456c6afa93a0e9b4156d75863f9440ae442eefd213b8a3f53a065daa8cd0206886d1544c3bfecaf62659cfa591da5e920d7d4370a9aabf7f9983fade101da2dba\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 31\n# em represents a small integer\nct = 092d5b4bea487029a4c06c97f727f6ad4531f7f646c95cd269e1e606a7e047c19a6a9eca8fa5abcbbca415477420ba422a7d5ba41ac79ba7548aa6f4b44aa65ad915ec11d7f50cd2ad7eac86869bf88bd7cbd11439aec354a25be71d36541e7ef211ae010d8259ac7b5af49e38e14d87b62a3e7840316799b548f14339cf7b46ccffd66e596b0879782f8638b975a89edc2b2355f05c53845078502d046b7f4371bdf911e30302fa980fefb439737333fa9c179c33a98e1b052da7da2436e8b862ee5f7c63c88ab751a244705c8bd1f32c277e0a7c80ef302bd01c9fd50c9b7b6395044c72461dc69aea549e37858b8b53b2792238f59445684e551e52e08750\nlabel = 610c549ce717749d3143cbd96c51c1c75885a5d200000000\nmsg = 32fdd5b5319188914afbe21b1fa91bc4e484ecd1f9968231879e372570c43a27f720e6773e1d905b70f85a312347f7e9752a8c4f5b9f27bd01530b6efeb221dddc723cd51b4bc4814992268c403ed4fdddd526efa87d835069246f25e8098dd5ae3e463fd639b36a4c139476b3d29ae0c9b6c163d81e7719cc85e65289bdde2f82b69bb4aa9c5a5dcd513421a54e5d4638d8c23567c12978c3aa806ba7964a547a689360105fc1b2468fa1480204d468ba2fe41ce9302328d4279e00a9af1c7cdd9f16d572e70b06f1f40acfd50c8865ef37d888b2fb\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em has a large hamming weight\nct = 58a4e190a7306bcb33ea5f1ad83b74da56e3debd2b2fb4499ea9339379b0f08117c77b4d5ca6dd1ad51a4cea4b818c270344980077674c8bf6e8a5ce5ab6212ddcabcd53be82672f19d535debf66bf853538d163b6128468fa21bd4464e84fbfa92501ad51bb1bf7e14ff522ecfd65a29e08ef23aae01218d7635915f8372055e0c6a2ed1de61511484bd6c32286a23a9eb2f1999708e8ed5e28516874241eb778713a845241151a946c509c07e4d27c167b7b5ef6f7a4f1fadf9049996eab17d97ef4d22550649060692af63fd06d05c76f3191689158323605582696729db7d94f730e5107d0d585cea56160968a887ab42bee7fd4f9ffd1449f021a3d41ab\nlabel = a0a0b480327073f080fc1efd8cf5be9bfcefd3a000000000\nmsg = f032ef2759de946b6ccf829695a9438e5f986fdbbf333262a795ff9ede842bb7b153c526abd1ea498f56e992bd21558c7c3b6434e4c667ccd16687eddc199bbaa59547e065a8a3814cd5ea46d7437c1d6bdd8f1a72ee5e945a2b1f11da2049a685ddb525da742260a20ce52f95755b8d7b5d29dfe7f55395c6203c518d5f45ae7435fbc19efb7fa9d2e1626cd655d409e35fdc4e8b5773965d9db726afa40a73cb212b60678bbc7a0417b94d97e03c273c8ee2ec49f23f57576ab3bce568fa2a1080f0f036e6971eba8a773b405ba2c5ba6564a4289a\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em has a large hamming weight\nct = 526352ba3b50ba160f05b9b7604abd508e744e176f99f5ed5fa47869dbf220f32fa43f7942a8951a75505a5800f8f49233d57778ea9dd5220bbecef15d38dd7400ba81ff4cd5085d2d20af7ce79f097ec08ce2a8dbab4482675ff08bda80c74078a44cd89af547a356cd21bb4be52a0cc5dad5bc779b54fbad60d15f10ca79d25e82f19d9dbfff7ecc1cccd8374582bef1d4bc3fa745259dcaecc56b8f162f7d4063aa2c99ed8f418f2aa5658df7d1f36041883b4484ac6766b059948960fa2e40363c6c56242396809f4b036fd91d46de8eb053c8cb0297784120264c6ac7e359f4ad5ec65a002644c03cfc166a8e5a019b8236c7",
     "d7145df247cd123a09c8c2\nlabel = bba0b480327073f080fc1efd8cf5be9bfcefd3a000000000\nmsg = a472bbae5a81e6500afc183d8bd1ceec795f4907c496830bff4a9f3b15f1768724cec8d288d1d11f47529538cdf93f769917afd65d033d4f563cc14f6dd39a8e7e03afde9eb374b9177f5bed74ebcbf771f630a1b3075d0a308ce65424386304396e824528deed8a2ac7a387f7a3eec3b633882c92e9c33eba9a91f9297dd6aeef37a5d475d10fe69e0b1264fc2ea1cb45ab4f1c6908cedac276183adee1f60da7cc1a105ed5ef187c2b11748e98c8a93af9683d441a3088cb0aa669b06db151e7151371d0273e2ecb161c8fa69d4e56666681c6439b\nresult = valid\nflags = Constructed\n\n# tcId = 34\n# em has a large hamming weight\nct = 6ab92b1c57f99c17ae4ca5f7d4c0149eb24cb18aaf36163859e1186dcbafeeda4d77fd059b0f938e92b8d413b771852fb019a66d76009444605edd5fb48e6eebbd9d01827be732292cb07cde541dce138990d46599b5a196525af199ad4adf7c259109e715e563d8974cbbeae62a53c8137076f10731a964f2ce37305a175d35eb7c8e6e72c9792631d35133dcd49f1a1da677ab3ac074172778402a4176c036cd8ac5674770f171d9134585a115f6a0983d606b748e0e47be040acda88cc5b8c7eadd33162117bb61f49cace91260c5e2c8ef4dbcec7f156a18894a2bed9956520b2b681b2fa31347df7ea98062d97f2972280be22e507249b2436a9ab91689\nlabel = 7fa0b480327073f080fc1efd8cf5be9bfcefd3a000000000\nmsg = 6d5c2cb5790875728fb21e987278fdd1d881cf4953e62866f8d53ebb067cf9a4ef53218030e3eca6732a6b1f789cdf3cc711b6063a01f424b388905549663769dcdcbdd82deb6bc23f66c1c04d30c6d91fd6116bdf8802c150fed396562edd21ca606528cd40b569e895c8ad5bd1bd5848a215501537dccbd0fcd70cf3b2d0df58a072e07f60ff764c4688c37240863242f6eafe36601dfcda41eb863f4db701de54781a6d53a97932d32aae0e6a526048f766902128b4842068fad9ab10811ce93339ad42f2e13c4cec324a8cf7035705b8a36fd8a7\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen137 = 21242;
+static const size_t kLen153 = 21242;
 
-static const char *kData137[] = {
+static const char *kData153[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha224_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 56d0756ceddf7b1e5b258f783b99e036e25675eca054ae9b6ed7552776c69b2728f76e08973556b0a35ddbade9d462ed12bfc46fd254a07ef4ee043ab24d1ef00f8d214cd1d906911e92c4a212d9a981da74b8d18208153d583035d6642b87a23371787867efd02c336eab01486266c853a052490deaea430c6043a6b240b6e9d71e16f29255f2ceeb35d1a4ae25ae0dc9a436fb5dc30381cce982acc824961976df683173a02a540c403f3c8560243ceb5b798abcdc20f3c85d9532b0f0b0826f1b6352c5adac757fe3224b822455cc529fcdc8a220b0469f321f56bd1853d8a70b893f404cc06317e084173770c7d4c836281ac251353fcee4ac393838a1a1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5]\n[privateKeyPkcs8 = 308204be020100300d06092a864886f70d0101010500048204a8308204a40201000282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f502030100010282010056d0756ceddf7b1e5b258f783b99e036e25675eca054ae9b6ed7552776c69b2728f76e08973556b0a35ddbade9d462ed12bfc46fd254a07ef4ee043ab24d1ef00f8d214cd1d906911e92c4a212d9a981da74b8d18208153d583035d6642b87a23371787867efd02c336eab01486266c853a052490deaea430c6043a6b240b6e9d71e16f29255f2ceeb35d1a4ae25ae0dc9a436fb5dc30381cce982acc824961976df683173a02a540c403f3c8560243ceb5b798abcdc20f3c85d9532b0f0b0826f1b6352c5adac757fe3224b822455cc529fcdc8a220b0469f321f56bd1853d8a70b893f404cc06317e084173770c7d4c836281ac251353fcee4ac393838a1a102818100ea6010a0017d4073198610d0e761f286e3a1133eeed71b4fd4dfb0d8b52e1e1d8ffc58d9c10396629952eb002369b22bb9c3313c80330c1f3ab7a3fcf8d0fbf5a1c0fb7936ef20d51373b21bea72fcb7f70275ac41d97b566b71f727a32f0006de15e7f9bccfcc3224106f6b1ae62d59380065a48ef7bd015ee6dabae0f9d78902818100d52ed808d74a79b3ab515b4f2fe7b41027472c3785eb25587ae31d3500bf3c6ef20c427e223efa4f2911cd38cfc4479f28ae495fe3e88e94c236c0bc1323d71027aba290669ffbd7e0fbb6f615df1c9e4fe5abb5a90d4d0b6d1dea0ae2b249e6a5102092c998b60dd920d09a2e6ecf2a611793016bc0c92de3b9d92744bc070d02818100cb64f6c884c257ae0b56673d83af62b360d3a64a1527a3d211e0d62e1a7d9d30f6857dedeb2cdbd3514fbe14eea689329d1121a76971e3712e99b3bc9389793edf5304695b1d0697233c62330bb12253dc0ecc63e2f983a9a9b0cb5620ad670e8ea8e019c09b6c8f8ef09c608c85789156a231932f671b251760ac2d45944c5102818100b616befc3e3824dfac535f74b1ec6d46e6e5ca04dae4510fd4572d595a7bfdf89dd28ef101fb5cfe448c2a087e9e9eb6799ef4996d27f4b1677a3101f42f46c14bc134a7b6a0ac1266df5a15b3f4d0930097a22516727ffe64838aa7259f37b44405146d8cb85db8525fcf0e02df2f2079b21324c18ef7c7b49dc7b7dce3e5f902818040fbda2e571060971cc6aea0c1cc82beab4fa0361de43a55bd2b399f25ed89e33c48983f409d9f27292770d5c0ac1b31adf766045e60d67b89957c81c0f3b7706c3e1418926bfecba0242ba54ed95ae1bc73b67ddb1e3f4161380cbbf1db7d3dbef852ebb38063bc2544c9c29f47f416f14eb1ea3cf2bab933d21c2c091293ce]\n[sha = SHA-224]\n\n# tcId = 1\nct = 03aea385d1f1321eeac78684a79ea101f54adae40474a54c8e574e1ae3871634050e5b596461730c345cfc93224deb7a26ae40f30a0497d7c6f0e141e9657b84bf9e20606fa7fe6e1c921d8de5032ad8ecc37b7c3247a56b3992c7c63dfc3fe2f22d7c4904fbddc371f560fef052f3ed89202bcc5f92f5a7fced461f984406554eadb85ab7d2bd7fc576d333b8876f82860c94aabb705e34e5f385cc2d7acfc5463a0135a15ed3c417789e0b8873d5fa0241c9a0d9894f617cf55c11fc45a47b3fcc04fa5b57e9e188addcf259a0f8051f254b6a57c2af22cbd4eb2c411e229045efbb577da4f480989d173a2fa367af721088547a8a219ff2466561eaa877e1\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 5d19107e5f9422dd3d9e2207ca637f7347454c338c3191ef2eb5687a49f6570f723aab7ebbd78abba840942e74aea052dc24792c9eef1d72c148733c19776216431f917b81a9a80ff4b1883daba20dc6c368c525a2105550715a374583b56f9030df876d67b229fba732369113585166e41f8b5bb7735afc50970396f47921cb2d6c8bdedd5ff1f0411c804e412c2523da5354a0232a46bf9268402fb952f0ca00d04bfc4504c2ecd9772001b2d77be4731e131f90b46e0d0f51a6f7d787d95f01ce64f78b0c4759db1e4546857658b4bb899cb2e024d15b8bd14d0f2fd02a4001be3b6ab35ac589a83234d8d906750dec3e509332ca081969b26a1dd0ac7614\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 00d7ab45e49e37e0d73d9ec5d477985b51d9e1b7b9eb67a8e0224f49d8a3432c0dd8df02b5dbe8962b8a3d749d71e56c7871c0b4137d98de5b77d5f94bb448e124b57b2af9c24004bb693baf2d9f54fefe770f6f320cbe73c0405276b09b1d0627b3018787a3b27e09aa0b3ce50a79f946fc45746de72a93554b993936d3a41bf90bd9f2913f5580c8c1c1b853271286dacf275280faa981c78dfefcd4dd09b6f09bd5dde3ec11b02eb4538e43fbae835e40f903c81744797f04f5a38409a502f3a7eb9447a342dccd82fb192601d40f57192255f751f102e14fedc7e7aa81c770c6b72dcb853366b7a18fb11b8e3b3ee218e59f2dd74feba1bb6e06a87405d7\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 942fc136ac976cfc686ed13a38314c9c8b570a4afa2b18ae0a3cc39173a1430c1cab8893d530d4bfbf98251035d1fc18d18d905ac86792a1f597c08de11d9e2487dd78900a0bf79239f75e155eb0fc6d151cd7acd4664ac606c396494969422c6a321e12fe747a3b0601afaa43a0d9c08c776a7bacd68ca04b3b5dd9e8c9dee6773cfe652b923ff9d4e82d353113fd7e0264189556b1f28011dabf2fed6beb47498af5a6a8b0b1ac9640e5acb53ebb90bf29b7783a01ad6b4f4595e067711a49f8f1cf00443292251d2c0551f89e4271140b03681e8f4fdfe62e588f565c2e5288b3b14a488f14751b5a493290dd9365a48ea33011ffadbd2b898bec921bb1ba\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 36deb3f715d91d4f2c5a21a028f87b227dafedb7c0e064712dad36c276fc15bea7d0d3671b115323849ecf52e6326e5f2b205033177410eddd8e29fb06a1b93e99ff62ac8f7dbb973345947de615e9a8da910b5c810732985c3020d93e7485c69801b7ed49433ad66a0708f26d51c0fbd1c73cafc4c89f50a20a09369db4d065e9cd7845be623e86f497a0c3e9485701f18006b8130210cf09c69dcab7ec0e3c166fbbc5cc78c89dbd0cdaf7219b03dc580b4b8f7497c1f9f36d1c61e1609be1f67b892871ded426121c5f83e38d39127c7b574157e2f4ca589efe094c3472348bad8ec5b07b4a2f3f68d4176b6f381930ef377c640ae8491b5bc3249a5296fb\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 39f8f5ee290e93d4a36b96aa94a3bb7edb33c0fb6565ca6a99fe2434222be6b6846af4daa933bc6ecb62e963d2e107f51bba8a92ea5a4e6490402102dd378a55c0ee2224e77395e27bf28a216c6f929db2c2c95721d1448160e888aa93251c966858535146a70188d87443416101e530cef68a1781f10368ceb43c287c73cd8c44592c56bd8f2bd501284c3118fa0f0402b42ca7c4ea3a917afe71ea82df1655a39c650ea6adc9d73e789970d9b3bbe3f34d0fc4dc5fd51529cd328a62dee0c30eafbaf7dd51de3c31090833024124741966bc8722a157a8e71ed60bb3ef4704ebfabeba4ef67edfc5a120a0ee3316797e0e6a9ddb4d3bc7dcc9f4c262fe022d\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = b798998999f0e4318470e72841a57733c842f174121247fbf3e59e7724bfd9501425234f8616d288f0dc8206c727aba50c13016d4be6f3bb64bed9dc5122b94522b8987a9db93403975302ef6fd585cad02556a735ffc5332d362272a07c1ddde4484639ab767e39881fa1c0077aed9e8ea4f6349f59940953c956f52065fde0a97624d0840fa610a46dcbdd12b8ea3c56c5873e9fb3f58e43ac719d50c75b434b01fd7f65c7eabd5a71f305561088ffd2fa7bb8698d16455a81d233a4dcc4c1f12280bae89741ac47885552d21b37523ffa8901a2256b3f7fd410b6d842a786ce2cd6ab81a7596ce5479eee98aa3836a22ee8307888d9365a962f2746b01430\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 2860d0785fcecef5d43ea029d6ef89b978b25b091a2bb64ee1b95da7dd257ed644a5e4ae1437bb20840715895adc9b2dfaaa1a427ab35d6380c0a6840c022a2fa1eff9b6de19568cf8276ce549365c768a0ee6d84c4c4f4c582ed93c297e83507c8495b3951279b274215cbae88de81447ff5d5d9421fb025a821a934d0103b9efa6d36067cfd394751251ccf4418e32c283ace982f8ee86635b9489aa2e756ccf6d2773a4c8613b89",
     "9b7764c319153762a9ad14352538507d36f70f56e47c74e2786b8197ad42e2380324ba8cfc80d354eb4487e3642dba175cdcd8382f074e170e326f2cdce0cbdc3831aae1e1abb87756e503520b87a18eff17fca24fe20c\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = a13447bed3796370d356bca37fe2ce27d19022301007dcaafa7162de0897698bf706c3c4594107e9a3585091178a25f458aed6e63eda039b1ab89704757d80a94751ee21c1fb672ca1a8f448fe8d959ec226867bb13dedd1b870986a9e7fec6893fd2d8d533ff13e60b7d61303e123d1f50b7301ac9dbce4480cb3d334b72e048f8740a5b9739bd07beef64265dcd6576dbbc956095aa586a1f22962dc96a00baf953faf836dce03568f3bea85696b074c9e1180dc2f801efe48a47e0735195944891a866d3e2cd1edb8333bf5164b94e618b1204af410644d966fab0e49b23efb23ee2038dfa88bf231ed1deab19346c4833f17ead5f1a2f15d695eef4e14df\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 19dc98b0bd6a47a1d0cf9c9584bae53837bc666029ba6478152d23cfd36e72f1c686543a5836a6420c5f2c984c6c025cd26ec5c6a74ca4e0eb87ea26ad2ee94365c3a6ad0928f9bc9f560bef8b2830374707f7dbba0a938b230f8a42de6645fe765422810eceaa713e8f78e0fbe48b70bc636e21030a89b80118fd4bc066e4d5400529e9c2f8984bbd5800168d72329bfe0d86ac71d3b3d7aa749b1d860afc9b49dac1ee8fd12b73ffa7c095c610df9d502e80c8108b6c944eddca8162666b7955d061231a95698c4c8470217ef9c47ad1003c80f032d95b7a29f459d7ddff205a9b02513f977fdb72b148869527539c0f21a4d749a0301a2fc686e12a2aa6cc\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 94ad881563060d9ac62c32f57f9cf08c57ec10bcf77b35a67ce89da68cf8569e2e6891ed966ab988e68a0e6e44b389a57e2ceccf4e7e32d6bb73be98db72bf363d0da8a20d063e9be5d9f4c62e718004132c9cf876ef58b07c122f02691896df3deac296dbf3e1f6841d02572b6e297d2f0c8a54cc4088fc9bbc0f67f9de75dbdf81cd48e2f45b3b9ff2bdd3ac749d4f43866ecea7483e810cd3c332f055cea1525f263c54e5ca3e1e049af11850bc836e6064cda5cf9204e9cba0857b1fcd65654e30b062e980150d541027a212ecda6985f7e93a0f799679a7c36918aa39de158e0fd52c5cdde046fe6e4ee67f20ccdec1c4d328098c09e6b2fe4251586b67\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = bdcbfb51335812a53e7db2c1b73ed5585fd7899936adb790f4b10327ee075714e21e7df55bddc6888adce032ffe1935d37178adb4dbff608eb5f4cf9e29bc32554358a829ad0b84b1cde5da1018440fa31f60ca72407f5604ea216a139c34034705d295bad65cb9fade9951e17d1ee85f4a46dd4ce81bc878daeddd800d0296eaa90345dcfd83f6dff5cb3ed87c7a8b5985b2ccd7f925b67d39920438b66c1ae1c1321fea7a8a90023f57cd97a50081c42d012de9ba5b98a1aec7da9929cf783def9efdafeaa8d9302da9fd44ec252cb5a97d5dd4fc6f68daddaa9d0f431b7968386df1a514f407f1342e33b996ee9c4b5af934f1aa2fe1e1ad485438d497afd\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 61b8f5873124a6ec36f1ae35081f79e17516362e8e7c5ddf3f44af7070808411db7182a3c82b70cb4c0510aac537a817c6087b907627cdccfcec4cd4b0a901f8aa2ef75e797457cc6f5a0effaaa9b6c542726eb45e9b27e3040d9dd283cb92f1514d93f00f9ea8f40170fb26129d82f169d5e3d9e4d57a38eac39a5aa5dc7fbece162c2f0f13fc095894f323cef093eaa2f000507fbe9d2fa22078bf824b9df7b894ec9705c16e9dd43d2c98f11594e04cf120666c72c8192658e94b02ac89876d51173bfe282c90ff93a5a68d1136e2ebc98fbaf956f28c71df44975fc6376003e713dc5d89ef08658a4d3686a198a4d140259e213f9fbcf5471afb3e0bdfae\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 4fd0d013bedc7ec38e1cb2bb2c234bec4a91733c1363f1dcb7ca47b6d4c8cbd56d7d75255efb3d5fee9f0c1bc5f00560f14ec1947274287153f8db015df8f4f4db9e9d0d9cef10302cac8cfeb72e04feb612ddb2bf4d58a50e19d77027457cbcc158dbcc845ad48b13d710ba1156a9d8f50a27da1e09f0c449e4571a359b4bd9555dad9f5b9354d6ebcf31171704315f6daff2a50b9807dfbfd94264680f44e146039216d83821e27c7933cfe13efb6b0f3912c51dad42bf433d89ccf52a7de04b59931665ed7ca91c7b9b9ce9da70c47c5e91f55cfc6f97c88ce230dadc2222e25f8d25f6f669762bc05e3888b9a05bfc03ea32cc43df08c84219d5c75d7283\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = bd6952203734e2d690c1468c7707b6976f802e82d79a786b40e64275d563b36f1e91bc99853eb3c194d265509b8011ca2d553f6fbbe7a0d6cbb1de6a61dc2b4f6f89344b3033f41e0b302eb626f800c4cf316dbed56580210f951535656605ff142fb8f4e116663b17e0cf8725de29c385737660b4e04c0b710726a70c39d5c417c12a653c3be05031958b1a14befdf95c582e677daa8364fb5ab08cc7d9aa59e02792c44867f68daef5eac69d81200d8dc12dc34be80bece0b80cb16b40a6317ce24ee21e8c082af1598bc4f590459cbf469ddfa4130118fd4686ebb636de9fa41216c24885726d53ebfe50bdb41fd93ae97b079fae913694543339e5cb3ec7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 916331689c162246baef783597f0448e34dc5d358b7f00fa47d5549f4fb52c7607c3a3d571b0930705ea61da60d59e96f9b4cb9fa6aac7fc737cbf6615c98b4f8ecd4a0c27878f469edba1bfc1108b104f73d90f089621ba85a938714818efa68c0483359e014c69c84209e1560b8692b8ac90e6164796cd1bc0578805d9e7318bbf08345835c67397eddc2d326468f594b2d4ddaaf8c67f5dfd998eab7c2fecb6a9ce63bde38cf23e0b0f252dbe964647da61dd054d10c5ea82abf730b0ef1722f98aeb15dda842a099501246700dc37d696177f52345c7a8be7bf55d0fb0f134731fc138ece8feee540bfc0da05edb375a1c0035e6fb0168a6424cf25bec5f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 7d9133d56002b70d758be84c5765c01ada73449ad76776d0dd6995062b5707c6033cc93a3d3056d5cb576d5c8ef6e65f8f3aa2555a454a953c405e5163bf2b0e7f6fbbc9dcd210430862ad22628dc2529179eaaa047f2f87a5f5831a36b604a117908a2170497c218db30110812da89559c5ebaea9281429172088558b7754624f1dd71cff3eacaac9e71df7e4404129cc1b7a1d77c5d34167a3ac4214a74e11d154e1ad42c4d12e9ea32c40bf3d92b356ca5cff7ca65c5cab2298b2899c00fe15bc31996038b577f50204d0def12c900bbdbff4f7ddca011437e01ec923ef76144f097c6951c0606c18bb200c700f451529594512d4ec4c55980c7c0aade461\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 8dabf24844e59cba5ce1ab2a32862c6357c465475b98cfd54c5dbd07017e0ba9215aeddd2dde36d2db9891661e6a8a9ca5bf9676ed193047dbd140875f312fee28db4ffc433dd8edec1fd8c342faaf36ee398f8aed0108a3ce98f145883ad126eb025a011c64ea51e2008a14fde229622275c8fda70f3bb83d92597a110c655cf6303a96bed0ac6955501f14b663255ed5cefa0d7a14ff79a993c4f42db39e67530d0263b55832678bf1502d2defc59bf6848d2929ff8959cdf4d7e44c2721786b2306a8e6eebb4ba8d470d15bd8e608652c5d3922aedac36727ff02b55f3e4eebc38924392d28306f8e364f61d8f7cf4749165790cfaff47c3ba7c81ec5430c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 4ea21ab2ff547aa2e8edb93ce6e041b654793095327f4fa21f5bb5a06d84c40cdb428e99a4fee6e90697cc8e79f5a1919b47d057b79bf4be5baff430c28896a336705c57da70586cceaba902aa3740be61b41403d7bba0bf939ed2faad83206e0a41536247fc8b8e4e58686d0d19b8cf3aeabe578f4af256100a79472c4d501dc32bd30d7a921574b1e0d4f4ed2151350d246ceff46abd7b588d66c519d7191231461aab4009c03c3995b9e3b7296eddc6db550d8e6f57d1496fcf2d1c18b993557f11a7df438d4a9c73b680fe653297af059964a691bfdb378497528c1ede29bda74389bc462f6729d4ee3303e6e4ea17ece5e270e2dd2bd5ac6f415f972a9f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 8d15a2f44d4b458af3d83dc082cd75e1fb78f6d8016a22458afaa019bcee0fb298d2990941c1bc9c0594fdbe4d292183b7b3c7d3a747117cab05a1312c34ae5ab16f25f7f002b8ff9cc905d2372601103f12c6c69d91ef320d0f31775fe72f8d7db1e8e0b7a6f45fdccf017b74d4e6a3af16099be38d605921652dde236101c16ed6310e126e36b74936a04ca0fb0c26b0d4b28b1aa2ad42cbee98747b7c43ed3ad7a5388cab80b25b5ef5be9fac24f6d0b373919493f928df49bb415f7842b47c13e44f45c042da263ea3b5b989312bd6284fd049a59ffc5eab219440874d173bd11744419aff23450f86d7c7bea2a341361a306b299a8513a94b9c034bfed5\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 4f802efe0073cf430f7af010f23dffdca40a4a53db96a5cb00431170c6ea57d3",
     "bd6d50cfb0cacf6772017adc41810de36f020efb1e00e500a3ca6329ff3d88d86322c0764d4b11f75746b78dfb0838a848d24e0c471d58743a296f10b3fbf44375b289f87ad7ffcbafcaa46a2a0301270b48d123d61ea6f21dc4666df0ea2078140b742ae75c1887d29742dcd7b92b4cbda27b98d8e16b43ced64d5e2a207778d6f022f3228c0b7edeff81437d3669c418186e651b7ed2df8963c5a71726d1f507c8fb694a9a94ef7ff17dca9e1bd79c9686097e7286665a454a9b68acc4334349d99b9d5ab7093fc36c0c0c11d41ac6de2e4c3935bd0ec2eaba1502d22ba0d3\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 91a3872121d32ba547703f8a0b9c9aca280f099b9c559998fb39d8841f7ab6a1fdf05a81f246c324ce435d7d9ea135fbc989e15a56df082b5e1c47b3b40f86cd5db01304ffdd328ae99d205d4185bbdf506acba181cdcd2d1d48be3b860d96e0c6ca54ce626372a2a749121af68523decff2c4f02d9d6bfb3d3b9a175e9ce1f03e4616230d32d691a4a8455ec09995962d651cb6f85d2cad6b09e35274368f2eee8ae5c7aa123a16407bcdb200bb351ede750f4798b083ce82f2800e04b66fd2be942b4a64d56dd582de56e3da7facc71157ddaa124502cdae10591eac676df0c94224649cd109027af09cb147dbfd9938488e7be36cb1146753e7656421e90c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 0000942fc136ac976cfc686ed13a38314c9c8b570a4afa2b18ae0a3cc39173a1430c1cab8893d530d4bfbf98251035d1fc18d18d905ac86792a1f597c08de11d9e2487dd78900a0bf79239f75e155eb0fc6d151cd7acd4664ac606c396494969422c6a321e12fe747a3b0601afaa43a0d9c08c776a7bacd68ca04b3b5dd9e8c9dee6773cfe652b923ff9d4e82d353113fd7e0264189556b1f28011dabf2fed6beb47498af5a6a8b0b1ac9640e5acb53ebb90bf29b7783a01ad6b4f4595e067711a49f8f1cf00443292251d2c0551f89e4271140b03681e8f4fdfe62e588f565c2e5288b3b14a488f14751b5a493290dd9365a48ea33011ffadbd2b898bec921bb1ba\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 942fc136ac976cfc686ed13a38314c9c8b570a4afa2b18ae0a3cc39173a1430c1cab8893d530d4bfbf98251035d1fc18d18d905ac86792a1f597c08de11d9e2487dd78900a0bf79239f75e155eb0fc6d151cd7acd4664ac606c396494969422c6a321e12fe747a3b0601afaa43a0d9c08c776a7bacd68ca04b3b5dd9e8c9dee6773cfe652b923ff9d4e82d353113fd7e0264189556b1f28011dabf2fed6beb47498af5a6a8b0b1ac9640e5acb53ebb90bf29b7783a01ad6b4f4595e067711a49f8f1cf00443292251d2c0551f89e4271140b03681e8f4fdfe62e588f565c2e5288b3b14a488f14751b5a493290dd9365a48ea33011ffadbd2b898bec921bb1ba0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 2fc136ac976cfc686ed13a38314c9c8b570a4afa2b18ae0a3cc39173a1430c1cab8893d530d4bfbf98251035d1fc18d18d905ac86792a1f597c08de11d9e2487dd78900a0bf79239f75e155eb0fc6d151cd7acd4664ac606c396494969422c6a321e12fe747a3b0601afaa43a0d9c08c776a7bacd68ca04b3b5dd9e8c9dee6773cfe652b923ff9d4e82d353113fd7e0264189556b1f28011dabf2fed6beb47498af5a6a8b0b1ac9640e5acb53ebb90bf29b7783a01ad6b4f4595e067711a49f8f1cf00443292251d2c0551f89e4271140b03681e8f4fdfe62e588f565c2e5288b3b14a488f14751b5a493290dd9365a48ea33011ffadbd2b898bec921bb1ba\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen138 = 25538;
+static const size_t kLen154 = 25538;
 
-static const char *kData138[] = {
+static const char *kData154[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha224_mgf1sha224_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 56d0756ceddf7b1e5b258f783b99e036e25675eca054ae9b6ed7552776c69b2728f76e08973556b0a35ddbade9d462ed12bfc46fd254a07ef4ee043ab24d1ef00f8d214cd1d906911e92c4a212d9a981da74b8d18208153d583035d6642b87a23371787867efd02c336eab01486266c853a052490deaea430c6043a6b240b6e9d71e16f29255f2ceeb35d1a4ae25ae0dc9a436fb5dc30381cce982acc824961976df683173a02a540c403f3c8560243ceb5b798abcdc20f3c85d9532b0f0b0826f1b6352c5adac757fe3224b822455cc529fcdc8a220b0469f321f56bd1853d8a70b893f404cc06317e084173770c7d4c836281ac251353fcee4ac393838a1a1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5]\n[privateKeyPkcs8 = 308204be020100300d06092a864886f70d0101010500048204a8308204a40201000282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f502030100010282010056d0756ceddf7b1e5b258f783b99e036e25675eca054ae9b6ed7552776c69b2728f76e08973556b0a35ddbade9d462ed12bfc46fd254a07ef4ee043ab24d1ef00f8d214cd1d906911e92c4a212d9a981da74b8d18208153d583035d6642b87a23371787867efd02c336eab01486266c853a052490deaea430c6043a6b240b6e9d71e16f29255f2ceeb35d1a4ae25ae0dc9a436fb5dc30381cce982acc824961976df683173a02a540c403f3c8560243ceb5b798abcdc20f3c85d9532b0f0b0826f1b6352c5adac757fe3224b822455cc529fcdc8a220b0469f321f56bd1853d8a70b893f404cc06317e084173770c7d4c836281ac251353fcee4ac393838a1a102818100ea6010a0017d4073198610d0e761f286e3a1133eeed71b4fd4dfb0d8b52e1e1d8ffc58d9c10396629952eb002369b22bb9c3313c80330c1f3ab7a3fcf8d0fbf5a1c0fb7936ef20d51373b21bea72fcb7f70275ac41d97b566b71f727a32f0006de15e7f9bccfcc3224106f6b1ae62d59380065a48ef7bd015ee6dabae0f9d78902818100d52ed808d74a79b3ab515b4f2fe7b41027472c3785eb25587ae31d3500bf3c6ef20c427e223efa4f2911cd38cfc4479f28ae495fe3e88e94c236c0bc1323d71027aba290669ffbd7e0fbb6f615df1c9e4fe5abb5a90d4d0b6d1dea0ae2b249e6a5102092c998b60dd920d09a2e6ecf2a611793016bc0c92de3b9d92744bc070d02818100cb64f6c884c257ae0b56673d83af62b360d3a64a1527a3d211e0d62e1a7d9d30f6857dedeb2cdbd3514fbe14eea689329d1121a76971e3712e99b3bc9389793edf5304695b1d0697233c62330bb12253dc0ecc63e2f983a9a9b0cb5620ad670e8ea8e019c09b6c8f8ef09c608c85789156a231932f671b251760ac2d45944c5102818100b616befc3e3824dfac535f74b1ec6d46e6e5ca04dae4510fd4572d595a7bfdf89dd28ef101fb5cfe448c2a087e9e9eb6799ef4996d27f4b1677a3101f42f46c14bc134a7b6a0ac1266df5a15b3f4d0930097a22516727ffe64838aa7259f37b44405146d8cb85db8525fcf0e02df2f2079b21324c18ef7c7b49dc7b7dce3e5f902818040fbda2e571060971cc6aea0c1cc82beab4fa0361de43a55bd2b399f25ed89e33c48983f409d9f27292770d5c0ac1b31adf766045e60d67b89957c81c0f3b7706c3e1418926bfecba0242ba54ed95ae1bc73b67ddb1e3f4161380cbbf1db7d3dbef852ebb38063bc2544c9c29f47f416f14eb1ea3cf2bab933d21c2c091293ce]\n[sha = SHA-224]\n\n# tcId = 1\nct = 5b467ce0a97ef94c7956b5f2ce08f88acabc4e9d6e7b83e6521e73c03abe9fda31c4c2c61ea1dcf5a4bea5f68cd1c17198c9c9f22cf9bcb6797629b9db4d96341503d7bc1286c0c47faca078594ab01530f88dae2fae71e5601c8a79040c81afda8f60fc1853df885885d8d2cc6bcb905f105f448d984e4a2374e78e4c357ef5674fe9917e30196d33fd97c4d67cb98c2a0c3f30c410453679ae748fb922a91da74359ad8dd9b00865517e7f225a8c999bf7c93bfa83bd687404425321e73f9e1fb97c11562f0622b217b09ac3542e0ac650a451011431a870c2ad77b9be4c72068e25dcaed1f2f9cf9a2a8336b407711c3fe16f2bc2c12e5454275ef783c732\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 9dd1ed2ae7257d576d793a110e0b39d85fe2b312ede286f0c1bec4fd975f10f9f51d9cb1b467de234697c428094a87879434f21f91e39fbd2e1d4b877313af6d9c92f4a7a16ba148fc5bd48c5405e27a9bfd6f2832f0f40fdb32ed3067fe2952060e5726a9a97d55e055b623cc42ed6a4db870f246ece6e89ce346060a4a5cca214a35e868231528c0c184a167f1d7c331cb0c1af95d6abd6dda250262aa54f2f6016d12d3b530dfe09d31eb182ea3718d8241bfa3e60137db838043ef4cce8ba28fd32b94198501d8d3d81dc9cf7eb5163c41753abee2ccbcbd368b8383b39bfe0739fe84f3e2b32612d01b324e4408b727318356ee38c200d5148b6e246bd3\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = a042226c1eac49482797ac7065940a268bc9d7b71a84ec7ab43f2fec5af2e39521780c7410cfd7538acb5d17d213d4e9ee1ae14e44db6e2249f97ef1ee97983e2bab3d2ea4775c4c8cb79f252cc7875dfca5214835dacb1bab7da6bc7781c15b56546f9273f79025fb8cfd90e632da174311aaad6cc5affbee024ff1099395f5cd9f314ec3cfecf089c6703296caa433d6c3c5779645ccd5c2702dd916aa74963c1c11d30af3348ffcd6ab28ea6b8076a8a82df890186c1821c1aa18766d8024885083b1ac5ade07aaa0bc7c5d38acd6fe392f70378e2a64403c39fd4dff70af9ea96b25d2dcd4ea4f9334cc24a888d1cda58af7eb85bf04752c379491c9d8be\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 54a3149fd9a580492b16ab91406c69164f8091ce0f5f57e9c2c798fb1cd985cea1cb7c3d39e2ed35fd5443140b7f2868e3090cb90a4e1f4f9efb8eafbe93e6ba65e2670778f0e82c403921d29d55f3ba5a965ed2bb623f6bd39078b859948a7f0dd929210c192ef7fd28d9ce9d04ac56f785ecdf5b7c98cc2735f0af1474125fefc2c063893868eaffc6bc61c80551093926f2b79c3d207ce310c3cd11063a274760e17ffedb5cfa640080a7c233ba38b95c3976a0a284ec904eb3ac75fd2156763a3968d01aa22886b3eef912e3a0fed03e2652eb18ecf0824e2879d70a586d92ccab823d16fe430fe5b5a4115f079b591c33d31970fa8081972d3f1c6fdbd5\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = bb49b660fb692e67ef888b55dc4944726ff955229f20593757eb616a796035bc3ee9d461d37dd6c5a5cb34303eb739b938dd53454675f872db127ca7cc6b77c6ec7188a436c09310004777409a7e680b8631cb420f7e69f04bd8fc3d1f735754a297a05b58ee52188b8fd00c7f1059932b8fbdc5db8321db0599dbae89f62d7a05015ccaff40a0505baaf4bf96a62e0f3656e84fe1b5e14117755d3c2d4395b9039fec8db8d02afc90cc4589d232f501c184753b6c1c9d687a77e6a40acbbdd97be6b43deb327c4a75f3e09b638df85eeb73cf8e6234122f04814c412407003d703d8192e02016d33638765f5aaf83699287095b47eba7d48db65541e4d8f6da\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 9f0a968b8aed115482ee51eb63b25ff07c3294eb3f8faea6af968408f4bb7fec7b456e2459626d5b8bf10ca8e953b0606627607ac227155b7accfa1ec90bd94ed216b7a7bc8ffcdec6f4ad0441dd24f1227a2f2a61e0645fa9a4d325f5861479a51af341bcfa8f699c64c02b5d2979cf7fa6ff2316aa3546e31bf0e17b0974252019c61783594adad3f8ba9b81780e17a646528e111994aac91fb056a57c19fedb948bcf1270573ab35cf903e1ec1ac33ce8359c3dc4210467a1620b1d3928782ad079ba9bb1f2040e157c7e5963594a7bc855b9a476adcaaa3be95f28ec49c934bd2a2440e6110ded6f02ed569206cc986a40f60ea4a97b30f5dfe8f38a6e30\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 3a2f3740f3df888485a993c169874d624097050697b21f5d3b6d19bcd373a6005f633931446147e8a4ee53fe11c305d397670019cc03fe83eb15431de666c1b7164184c33ce2508bb0c0e0c79639e6be07b7f5435d37e5f1279bf033ace5fa259c83b19a62f8f9df45cf0fa8a2b1b0b3725926c40a7fb2463da7e80e4dddfb260b3129d4dcd8f05e728f5cb6cd484b2328b8d8c5e421c9a7227daaa09cd0e7425886a9912a38d5e6cb716f0d148e17ea1ffe520a94d8b6235b5c82579734c642717cdac41d65aabea49e05cbf41ad2554ffd97fdf73d14d783e80f08eadf7fd522961ab00d89fd964b6f72039a5f1c76cf029f2177a80bec3cc89475ea3c9010\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = bffe021eb677345763b20dda24b4f482d02b9c42a3948fe4e90391f079f527471795b8ae9c8bb1b5437f56b8a6f60e5623433b02851a387761e27426fea806ad68ae140cd104b0fda542b1f00130bf89fd565c13cbdc28a27c980a0707d1d5a1fe275aa2acec5290c2892a0a28f6b7e546a89706965d3be0ea55a664471b03017a3c4414c1c694484b58a38eda72091cbdb2160f699f5bd1f53549f4e03de3d7fffb080bc57bb2",
     "835fa1bad1c19eee3d330f3e8eaff8110f226ea824842ca9996632b832a4509333ccff3ada3c6b9431273479ea1d0e541fe6494c9f053ad07d6bf9a4ca17d64fe50546428ab72fac1602637c7eb7ddf6ad081f6c9d767b4177\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 100de36f08403f5f8d3a42342c9471b3a59f412d641d402971d0208fcdc7f28cc5517e2d6aafc79d59a49c654ed10285e75f8b600f5ac4906d3716dabfd42785b6698147dbcca09eef28ee96c78699b688428e2de34341ee0c81febc6ed43512cfeb9304e2e40738a20d7b4847742f9fad3824f0cf06e437b3ec1061ce8aad0892689c3388ab6087adae203e23019875768bd53a4568986f9cc91a65a5e5e50c0ffbe07bad0f002a03dbb3b3c61647c35e23d8658879956fc23d5591a6142421490cfbe8e12f0673e2e456afd44b6f463ef3d2d5b51755305ad83181bca08f14b2a702e4ef2cc0786b69d9188714e9a4e9a1853011c515a22bb1789c47da7331\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = bb47d730bdcc0fbefa8cecebd029150fe5d3c967a429c40f16b48c8d07848699a3ab5d68ddb32f76e0e74e897bac9405a1620dbe9ffc2e0d653924bf5da381a903a278ed7489a62ca5b94c7f963a2604d5cca61a637d43dd78ab44314b4eb3547e2e4a72afbabed8cc8d48e23faeb5eb036c42d542578c68d72134feff3cbfc561348a2db48032e08f98765e87dc76600504cb7217fec04ee9050bd3766657719757f389c0b4f0bdb2fdeb8e5757a3a9b2391ee6eb2e6fcfe95764706c0778e4f0f3c7fc024f356f999e5f50c637ca9be7ff20f65edd5c9f6ec869c29657b1792225d8a16574c183dd5f15f084e97a9337e53b56f5d7bc54bf5e031922959f48\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = c2edf03b946ce57141fafbc89189daa734d0f388c211a322ad4ad9423ba5f31699abe68d5c03c0ccd56b1a39abd3145f4c0d59955e6cb502d6720c1af31ec511fed541e1a66761a20422f5490d3dadd815390a01da616ce4d7934c68e7b1c53d947803268d81d26429df505c22578f55ae0788cc619567f02237368258d2f591b51d61f088d972c40e4fbd4f50f72a674d25a1cff3b49edc9019ac9945cf2b828d4345398b3aefb63c9f0497ace4b7f9cf6c087efc93802e1c19326585788df3aeef36300f78f7ad016cd4ba6c55eb49d36e0d49f97e1bb8ae12e9d9ba66d18aa76812008eff83e0d7d45212ee972957c355307823fb692bb2041e6acc81902d\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = a7bf9e3d83a704bc5d3c672912a883d379f18ad0a8480c8b062b05def52191ecc81b2c6a8f5783ca3b401cec23f981f35246e3d45272ec73ed416713a4afb104f344dc9e73c4af29948dfca67f245815bdccf4491c5ee7ca2827934db728e08778eea48cc82da3ffc7b94434d2ce301e801feebcc39a57bc7450ea29d1013c31f716809af36189c3cdca42e78e31408f32b98dc79619628ca348ddbef3f18a942387b9479dec0af05e382ea15bf0280a9027f7f24a3150da0497a13a8f394070515c9be5fa0c705c012415dd7b4201f2ee28af50178f59e5064685d75fa54c187a22f2854051d6084894fd902e43b20f18d14091cb14804fd9e51dc681d1d9f6\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 794bccc669c6a853722db8e7100d5a76bdddd5997be5ee52bb6b30751672566da38fcc38fcee38be9ef3b9fee98eba9818277fab9367e3f024cb17babf71a71b4c03619de6bf25772b64e670102d5eac40c61250ee174aa802277a48a7488ce9582dedbfa941e7ffc6791515787652964bfbee021da63879251de9c89b9d9b63c547253c1b539d0ddec1074ff864ae6360db0c60492c5a992124593a797e7c4c85ed6bb873d5718a24df180f0739495562c8a522243bfb8c6dcef4bb099b7fb42ba01486e48b6841cadf7f8a8294c0234b779a8618945d7d557238fb7153f9f3fbaa89027eccaa49c75c583fb5b2309650bd4fdcfd3d77b9a181915fbe009507\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 3155ac16ff4b2c2e256d01ab5adb8eb7127076c92fb72d9dc30f217edbd10183a15dd8fb41ea074dcc27bacdaff2a5c58193fb25a18f15a98bea320cb52be2031f18b247815599f43f640121f91873d8a61cfaea011eedb77474bbbf9b15481ece1b0db5b56049294539168d6000c36dd0c35d11921cf5df1a0eff4cad1a32678700a4433e5fc90a7cd14a1fbc4f819e8ef74db8474d3c1c1aeda496226e8b7e1a184277a064be61e932dcebe94f366831f54088aef277819cbe29bfce1332e4d2cda509550711a9edffa9fa36c1dfaaaccf0d8a67419ad9cf1a5421a2da4cb2a96b94c0aebff1a64e4a932f6361b50685e07e9ecd23634d64a7610def333a40\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 2df84b7d330dbc93c4804b6112d997d012d1bd3bc0047630c9c7a97b494e295e25b63d5ec98a62878213bf0d523f7b8f29c5aab3fb6ff08d336cb078ac9ce0c3be123eddcd83ae7b8189409f4db89ed764c8dfa4557f95630065e74073bc92e6a725550f19957da5cec59402f82622b86f01f92e896247e80a2cb876014a6decc3cea0e3ca9290eec17f3ed80fd54e2a0410daae5d9705dba809ef3f2068038db7e74d0b1cbe8e1b3634fae69166e0348c9b1fecaf9915e9dd09cc8017b66a2f3d4faa8b51099e69e4f68728c223f79b32bd1bbbb01b9ac4ef18e226b9934290dc8e88369041624396f4dd27f6f570e18d790d29a894c14c1ab62c59b81d16b5\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 6995411d2531e2142f0d8bd65d41d2bf17c3f8b74626ae10c84ae86ffd0e53943af5155944da2d9eefe255f92aa8c4b29aedb9851202d93b36df48cc0fa6b70c79b8c3d5bd42f5ffcd1ab9a223b1126c2018c0628651f6c23d5d676365e3a5858cabd99eae861a3e91c0d8136d9e6dac7e95e4e1c6201132f764922b2beb9a47fbe9d5ed12107aa113b50cdbfbeca7ccfe9ae5abbfbbb28804c1f7b155b726294e6b0d77b1e845ac80c1b8e7936cce6229c7202d9be49b90c1816b179012263a64fced7858f52d80b8565ff2b0d7beedfb6c6bdaead108c19b2007b6872e83870133f52fa0caab1842e72be8f9a3d66d9e34cc16a650c69041bbdce7ad707878\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 5abda3c551401f34bbbbd1d4fc754b3bef1278a4c7a349e297c89ff1d98005c2c230312b998e000926e11132895d2c92b9d91cdefbad259528e1b95e5692b5ad2a60b304434c75ee9ca52a2135ea626b3d0415495062b5433522d802a370aac20123f8060e258d6540debfc200247bc61dbd72bc00517eed3d6ae66c064e7c5bcae2187b152024e8d092664bf1883d9fb64d39d33b350656236b92611a2fded06cf27149d479196a94981264a3fb4763e34afd94550d73615257cbd75ffa421aac56d79c76a63231daf70775cb510892ef88f2472ddf66ee7127112d2cca7006b3cce968538f95250aba7a914f1f3074433be80ec762ae2b35b463babe9d52cd\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 1aae5728fbc6acb37194eab4cf6de62c0d8229094f0c559c285c86d9cc2387c16639a8f567ddf7ea388f6e3785dfce3edf8b3dacc6f6b47ca90328648141623acaacbc02b2440cd5f3d5c41f7537736d9cd5c7a297bd8f773ffc2f616282084e3384c445fa3328ae6448232673e1c1fab93cc441ba6817099c64e22744e23c877720ae09f1405ab3c05837a80bb8f8c9f03476195d1c8fbb8202ef359b4b33911088fe4fbf601044702df98d395b4f2c19d7cecbcb8a544a8e50fb38135d272ed2b8d9a41432301d15822232b361f077336675c36e157d992d2f0a2a467f7a40a1b899ffbc1a310c92ecfa631d03f21a459310c05cf84a0a2bf58c93178e2a72\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 67bc8ecfbd98ec151cf04de90f1ecc3da09b7f94dc7f8ada3750c49de7a98173a59b908a09df6877b3787f1b74a5b456f92cddda3f1f14ea05d4531725627a8003773d0f6f14b4dbf5a06690f9d8b966e473741cb695e287c1f3c60aaeb01ca74e673f080928793ac06e609f54e4214ff53107cbeb73f32073ad771566fcefda28ffbad80a765eb52e2e6065227f21f60e06dac7fa34384968aa2d355184fa8202762bff510315ca73a93daf910686d36b77f0a4a9175874eda4ad07023cff631450b2d2aaaf99be755c36ac2bebefca2e402a8e4994220ebffbe080e84582c3f9ca283546ba8b9fba3b7aaeca60d8b9d61daa87940b9e500fbb47f0d6bde479\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 2aba9ba6b55fcba1efd92069966c95ed8b567213bef9fd6bba37a7b7c502f7fed38c9cdee9fc1c221bd651f1df6f1a938a01ef80a746ca9478ae00b7ab697e2ac311425a38e4384002dea66d9824c79b56f05b00bba5b26f852a7fe27a869ef101ca73c1bf8951edfe60da5b5ca9650a2bb04640026720b8c8e94e941b1f6cfa3e9475c2ade8597515ca64077c34e896817fee30d8c80e9b4802b5c8605f7597e7f49025237989bb253e06ce5673481d36ae7f70103a4457624dfecdc953207102cdc2efd5d682907fc4812a31fcb55324b6ba2ef697b3c31cbf82a5113e1ae8fbc2afc8d63a1ac9c3a54a25cbd3db54e934402b1c5b07ea445e4d21f38ff790\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 8941c4670d7798f1a935da39de654e7763329afed53c9ad2c2c6f7e8214c",
     "19e8fb27ecc137be1e54b1d51f6ece4e951fa2e7f4e39a3124d9298beae8d2ae35243b83d216301c34010df33faa631b50f87fde7e4f7c34436f62df2330fee4366da95ac2bf891a9fd4fa850f7e15430b8c966ea5bdd78f5172a27df1b56716e1260f71dbc42fd4fd0b92b90e9de67f8b4ff47f20365153799ba212ffd601f0f7e674dc532ccea5619e039068990beae5f10d39e5d1f860018d25a784665d6ad50e06e59386e13b6da201980fa5aa3b642527aba012269691c773484ff2fee7a1b0a1fe6db4f1ffb1a7da8464320ebb93557c5750bef6794696b3022ea92d01bd52\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 956180f6a240d45f212d6eecc906477151f0af704e743ed7789c06baf8cb4c3ab00d30cd0e13a77f1905ef37e55bbaad3c7e80abb5e64f4ca1aba2861d98f504e3cf834a2c669535001b0ba494e6684dbfc2c7f43dc14a80ad73c79856d18c26f5c635015e282bfb4344229d9f7719c743baddb89a2f64bae603c8f3da5e07d09a363a86d3f71b7c038b939516e3930a181f6b00d6e8171add3f68d83c3d82a34e56868c84105afbbeb473a38934af4a9264dab2f8b3495e7594a25df693e71a5806163f1c44f8040aaea20586edce9050e1cbd7f8a2c30e40db9508b66c42f21a9cbb54a4b228455b05aea9486dc81233679ff3bb13a463debd8ccf55660b02\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 000054a3149fd9a580492b16ab91406c69164f8091ce0f5f57e9c2c798fb1cd985cea1cb7c3d39e2ed35fd5443140b7f2868e3090cb90a4e1f4f9efb8eafbe93e6ba65e2670778f0e82c403921d29d55f3ba5a965ed2bb623f6bd39078b859948a7f0dd929210c192ef7fd28d9ce9d04ac56f785ecdf5b7c98cc2735f0af1474125fefc2c063893868eaffc6bc61c80551093926f2b79c3d207ce310c3cd11063a274760e17ffedb5cfa640080a7c233ba38b95c3976a0a284ec904eb3ac75fd2156763a3968d01aa22886b3eef912e3a0fed03e2652eb18ecf0824e2879d70a586d92ccab823d16fe430fe5b5a4115f079b591c33d31970fa8081972d3f1c6fdbd5\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 54a3149fd9a580492b16ab91406c69164f8091ce0f5f57e9c2c798fb1cd985cea1cb7c3d39e2ed35fd5443140b7f2868e3090cb90a4e1f4f9efb8eafbe93e6ba65e2670778f0e82c403921d29d55f3ba5a965ed2bb623f6bd39078b859948a7f0dd929210c192ef7fd28d9ce9d04ac56f785ecdf5b7c98cc2735f0af1474125fefc2c063893868eaffc6bc61c80551093926f2b79c3d207ce310c3cd11063a274760e17ffedb5cfa640080a7c233ba38b95c3976a0a284ec904eb3ac75fd2156763a3968d01aa22886b3eef912e3a0fed03e2652eb18ecf0824e2879d70a586d92ccab823d16fe430fe5b5a4115f079b591c33d31970fa8081972d3f1c6fdbd50000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = a3149fd9a580492b16ab91406c69164f8091ce0f5f57e9c2c798fb1cd985cea1cb7c3d39e2ed35fd5443140b7f2868e3090cb90a4e1f4f9efb8eafbe93e6ba65e2670778f0e82c403921d29d55f3ba5a965ed2bb623f6bd39078b859948a7f0dd929210c192ef7fd28d9ce9d04ac56f785ecdf5b7c98cc2735f0af1474125fefc2c063893868eaffc6bc61c80551093926f2b79c3d207ce310c3cd11063a274760e17ffedb5cfa640080a7c233ba38b95c3976a0a284ec904eb3ac75fd2156763a3968d01aa22886b3eef912e3a0fed03e2652eb18ecf0824e2879d70a586d92ccab823d16fe430fe5b5a4115f079b591c33d31970fa8081972d3f1c6fdbd5\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# em represents a small integer\nct = b2ed7a397f2245207dd9db69744a196ee5cad1df24e980196f3e9cdb69bc3db3bfdd4ec01780f7a063e1daa0b670f0185ab9c19f37462a1fa76b50a580f9c919be1502d3cbca99c24827c738178da543e0c2b7a8714471528fc54db03921fc9558017e01a2397d9c31136000c17b558b72584a1b25d6ee85340e99ec4ee7163e6f205cf0c8f3077050efe8a244bba2ef0dd2c1d71c1ff6aa76c34ed678d343a644d6b03dcbb0b1e176c18aa952ee1a95592e9880d82a1fd4ae689a9045d90ddb95ebeaf30e35f7afeafb7a127695bde67a5e0a79277db6769022d13e2008e2a1205d67f8776f0f99571ddf73bbc611e3e189223f1e62daedfa12f4a2b0cbf58a\nlabel = ec04b8614d294a9aa508cf5e5f0f29ba3547a24e4c6bf37feea8d68e00000000\nmsg = fdf36d511ab761a3424c296760f4c8124a75896cd8723dac73d3684ec27193a22113fb6e6df10b5d34b906fa8b1503b672a0ee0498a0c6c022c7d4a82a2c7eaee28f7a38c9b53e60b9473ba26c3db70480ff58291ca5bd5ca3ed660337e5b08698937ef2a3008735c097e79815ee74634bc13d152974b54cd3326355cda4a97d1e6aae770028678d51f0bf04ac5765ebe78719a5632f58f5adb235889cf900a7cb6d1ebdfa41af651ce05cd16e08fb62fbf95746a3ccb13edef8391ef9f6c996939418289d27\nresult = valid\nflags = Constructed\n\n# tcId = 31\n# em has low hamming weight\nct = 975e78a8894d8f0bf47eb4b6baad70b000512823ad93b370c01f1959aaf252471951b0bb941dc89e6d552ffdac77eb6af19b407dfd767f4f608a82d0f8f03d25276bc2dfa69b39e2151eea0fd6505a997439dfc73fe9ae5d1c95835483ec4a41a1d7cd5c9446beb7d418302405ef80324fea76ac32bfe1a06db9ad6d651fbb821a025b82f78197d7aa3185b785139649479e896ad382be558dffa756c7b09b28925f2c25897f00bc4be23f907a5ada5868929dd72a1fdaae110c293ed039bf6bf75065c42870f9227a914e4c00a14b58f0dbcd0f5fd6c94596ad69a89d28a8e318050222fe1c288e5d9ff624e97cea755a733ca76d4564875f09fb2d4a4b0a19\nlabel = 8c9ddb95c6f32d5665a1d95cd8c6fb17668ba638c482e0d539c28bf800000000\nmsg = eb6b68854f2011f6a2fa9d614c12f76f5cee4b203fde576dbb232d69f7b9301154d7af5c8c9d320a7456f93a84dceb152759d3c505cfc95204a618bcc5bfb367f056b0fb95c8334dc354c82036e3b551309b5124f4ca4696d481cda583085708796059853abb72f63e59a64dc28f194356fc9ce90bf90aaa50846c50c14a4ddc6b8a71a97de2b8fb16a1521d9ff6a612b27cace9431d59038669ce497219e934defc48a24b7916b75e18e8dbde1a110b5a4d3100a2935b073ec3cca440f5d369572581894d06\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em has a large hamming weight\nct = 16e4df71edb9cce0e20f9bc613de0958325747cf1e90d4b1aaeccb1cb9c586a9896b04e18bdeda54f82fa113e54e05e10bd39792ce5d3601473602b0174ef3d81040b9ba9a237de71d255882422b1a7e13ae5d7d50ad14c2054b0734bda9f2c42ca169e89fbb1072f4819c6a13e7d9ed6adce1cf565ddb5885c17ce7200c795f73b8a0f6b1d76b7f7bdf03291fce95b4ecc8f56178f86cf30e71f692c53cec7c091cc619a5bbbb2ea063bf1328a3abc56fc61dcb5ea4aa78ee1075038c2ae17fffef8a487b94efa62a26c01c05de83e965dfd19842fb586b4a8dcac7afc952d231be7ac0ba96a7d63c942cea6736ac7f2682023c9efbb312157e57ef082cb9c1\nlabel = b42f55b1895be2324ceb2fd6f40f469df1f5f3db556d84846989c81300000000\nmsg = dda76849a089db6948515c7a512b285ee8fc97c5b41ff7f7d1acfcd1fbabb4163916e63656f85bb9e285727e22f03d15e93e0895dd10bcf276fb8fcb21ccd0bc8ef2a8f29b87780a43622ffa7d92f5ee6dea280644027661d96d9ac818e91454f68994b11ee4fd0e64d3be8d3c14653813a704f0c7410ac1368ff6bd921ce2c4de86ccac17ad58dc2495129c8e3d36f141c634d232f2587dd102c609b57f0ea3c821e620e5f6437b1bfc1d99f5176a79a9f7cc7ed90f6012e54ce1cd873f2aba6dbbdb2252b9\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em has a large hamming weight\nct = 7b5e8addb0384e472da0c2465cb1e03bd4fd865c148850710b5cde1892c0834",
     "458ab2429e93ba375ebe1fe26cc81b8f991f0d21e6372fb34660ca513650fcfee3114aeb10855b9b3e7713b779687d0bab738dd24792b6261182670bd09cacbc7a26655ef299bc715a51403744282d0614c9182030b51c3000ab17f98e604eca3f7edd824ae52607bbed63f14717f771374ded2b5a0440d1a2edf74115df754a5c7e1368326f90e245ddf73916b6277f73d0866fc4657a1b4470cddaf91d3d297bfbb04e03cbab5d180a1e3c63d88453844c30d91db2f458e54dcc7bee78ded8ff29dce2d07fb8b5256531fa21a95524f5f8467b5ee2a2d4061676eb8fb899891\nlabel = 842f55b1895be2324ceb2fd6f40f469df1f5f3db556d84846989c81300000000\nmsg = 07f559e91dcb945125f58eed3cce2d841ae22af2cab3b8181eb33682c8b712922a911f397cb92e66b536246c3cd17f27605526c5eb17d4e77bf7509dfdde05fb598e3b037e613804220ac88b84bb39fc8f885bcdfd9734d64fac27e32bef6696c09fdf8bd5117f1a71f5b792065d2a466d9e33a36c84b0bc3ea2a99e2a4abd23c50bf71f8dd61f8e848abf5932c63136d82c6957b6cd80e14a54d43c96f670266df22733de9e8ce1f399f0a123d7e643cf4e4b7aaa832a94aeb9d723b7a4f8639535cf4da088\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen139 = 21224;
+static const size_t kLen155 = 21224;
 
-static const char *kData139[] = {
+static const char *kData155[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha256_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 7627eef3567b2a27268e52053ecd31c3a7172ccb9ddcee819b306a5b3c66b7573ca4fa88efc6f3c4a00bfa0ae7139f64543a4dac3d05823f6ff477cfcec84fe2ac7a68b17204b390232e110310c4e899c4e7c10967db4acde042dbbf19dbe00b4b4741de1020aaaaffb5054c797c9f136f7d93ac3fc8caff6654242d7821ebee517bf537f44366a0fdd45ae05b9909c2e6cc1ed9281eff4399f76c96b96233ec29ae0bbf0d752b234fc197389f51050aa1acd01c074c3ac8fbdb9ea8b651a95995e8db4ad5c43b6c8673e5a126e7ee94b8dff4c5afc01259bc8da76950bae6f8bae715f50985b0d6f66d04c6fef3b700720eecdcdf171bb7b1ecbe7289c467c1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001028201007627eef3567b2a27268e52053ecd31c3a7172ccb9ddcee819b306a5b3c66b7573ca4fa88efc6f3c4a00bfa0ae7139f64543a4dac3d05823f6ff477cfcec84fe2ac7a68b17204b390232e110310c4e899c4e7c10967db4acde042dbbf19dbe00b4b4741de1020aaaaffb5054c797c9f136f7d93ac3fc8caff6654242d7821ebee517bf537f44366a0fdd45ae05b9909c2e6cc1ed9281eff4399f76c96b96233ec29ae0bbf0d752b234fc197389f51050aa1acd01c074c3ac8fbdb9ea8b651a95995e8db4ad5c43b6c8673e5a126e7ee94b8dff4c5afc01259bc8da76950bae6f8bae715f50985b0d6f66d04c6fef3b700720eecdcdf171bb7b1ecbe7289c467c102818100dc431050f782e894fb5248247d98cb7d58b8d1e24f3b55d041c56e4de086b0d5bb028bda42eeb5d234d5681e5809d415e6a289ad4cfbf78f978f6c35814f50eebff1c5b80a69f788e81e6bab5ddaa78369d659d143ec6f17e79813a575cfad9c569156b90113e2e9110ad9e7b48a1c9348a6e653321191290ea36cfb3a5b18f102818100bd1a81e7977f9898122273ae3222b598ea5fb19eb4eabc38308a5e32196603b2e500ffb79f5b886816611debc472fac45544070beb057c941378a6868af3b7a03d3f9880ec47d5e089b94fbde542aba9ae8d72c57088d7abf5b131f39098f7bc160f90536abc9492fd4e06f3ed7299d4b97bb03677207d95669f140cfbc20f2502818100a94b528b28f291599121d91952ffd1c7f21d7c1479d99d478885fb161870ee1218bf08472612dbe5497e8d9c650688e09c786961ae3e2c354dc48ae34514759c4c23c4588488961dc06b414e61c0e1e7fbbd2923d31532fe289f96da220711e58c14019808e00414276933bb07e4efb9b4a9b37656917205209f33f09515d7c10281803af0e72a933aef09ff2503df78bafed531c02ff1a2bc437c540cdcbd4ad35435cf511763596543480629b114ca7f780ff7efa32ea0cb6e000d6d9ea1f2ef71fd9cf9948422a165557e37e755edfe70d90b920502eb478bc98a63f788ce3a0f856d6ede7251a383bfa8fa480a81a925af7b3cc538c4bab8c9f7597ffb68011d8d0281802640fbfbcfefb163ee7a87b6483a66ee41f956d90fa8a7939bfc042ee0924b1b7993d0445f758d51933e85179c0320b0c968b48a91c38b5be923e1097c0c562f88d42294b6a2759bafa5428a74f1270874e45f6fcc60f21602de5eccd143cf31241f5921b5ad3983fb54ef17be3b285367e50c999c67247b552fe4bfce945f7b]\n[sha = SHA-256]\n\n# tcId = 1\nct = 8e6f127b86ed4ce03bea0242759dec562f3c0e475d70c950bb9865c5a00c19186487f6dad25e6ed4600510e067a8679cdd63f7718af92e5cc297d74d5ce72472c404083b156924c39852b03fad90becc3da0cbb1e80556b4010e9569c61e3b188b9dbbf58f779d3be5a9a7d000ab596d69c9aa48fa6c1f1fbc5be79ec39e27b7a76191b681a02d61cbc5924651198bdf9bb7749ab4a515d1ea1d9d32dad38dc703228985985043c152e2d8e918b652d67a40c2be1e2c6cc2fce11f6c923714b11732d8fdb1613c46bfcecafd64f9536fb7b41816736e3e4b62a1dd6e4c26e8a8f66d99cced308127a39ea1f21a6d7886e22aabf3ca6d6464278d930bf60f277f\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 7a896725e0944db789d4caa96bd8701fdc100a26ca12e45d7d9a5f5599fdec0a8ca5ba9e2e0a5c743d2e82a0006b915e6572e066c30bd794e98fe0959519f418d5587a5012ff9b0c545930e3065cf8deac440ef60715ecb8de63f2bea7fb80bc81cefd2f5b979bf0d32e07e615db6a363f0447bec068db90a9e86bb4703098b3ddf1bc34b2803930b56fbb8e026b8691248d8e471ed6dc0a90905f96412470f1002ab2a754cda6dead97c5a05fbcec5d0398c1561876bac021ec4cdc6915d929ebb6fa5ffa1d6e37db99951fa19670ae0f8bbe18bacab54bebeb5ec2dfb4a0cf69dd7077b3229fd0cd8580fb56fa13c399364e2bdecc1a0bfc6eb67f01a17fcc\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 835a8d5ab336e2133ade3b3537dbcd908a49d3933d0747e6c567e6e4938346b40a208321669f82ac6fe7055b4c435c455772ad9b3809ac65b5223c04329f232aaed6412bc6f024575fa9eee9d5f813e384a07289b9b203cf8cd7e2bfadf949aedfac4e08705a17e4db719ece091d46b264eb40befa199cb27de1a744c96182483ce84808686afc56e414ccbc2f219057af1d7e23549f44f7bae74f135254cc965227aca4ecd7b4571cd05cb2c99b6fa55cf7ec9c4cc085cd0ad0ce90e3e7f68af2ea3e2a6097b81a5c5091c31026261a479d46f05c45ae016e86029dae86c67afba8b8b6e8e646a94d07d07f3eaf8ca177c6c0ed05896971c0a911c846ffbdac\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 822e8870c00908cbf5032226547d38e423deb912c49c9fcbee66920cd2e9e3197b3fd7428cbbc5e90e660545720f180ac0ce06205cef8735446de30df32c8797380ccce9c0512eb285b7bffd883ef00fe118f027bdc75700e511226ec4da35f406e460fb88f9af2e9c4ec219387676ae21cadfad0fb1d704be69d0ebcdda90dff7e172612c972c6a974b828acee6ca186c71b50376d1ed5eb6c107408065473d53a2ebedc833f07f60f909a6c42464d79d76f94531a0d386213fce5efc2e66f311e73b06142f8245b063b9e395722dbea029dabe5ed1c12788b890974ba1d28492cce2c90e0a3026c282964763a030a7f7f3f76a72843a97d9eee17cdbbb00f4\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 94712359a945bb4711cabb40b95020092c43428748b10e0f11189172d7052b28401d96ffba516a9d491895e9e95308562cdf17953a4e05bbae8c8cf391e7c363506ac86d46932b373963e9e661e9de2df322719e6369f3ba68f42bba78ac932f7d2333759a53d4d18f5990b18a6d4d0af96d9a9451b2d5a8c3f427f607380997b5b2029f58f04301b52c18cf57c2a763b546a21b8da9627070a1cc30bee0c75863b196128988ffea683a4da5203924db470a53dac36a3fbec3dbd9710f85ff6b0728a692d640ed7ba67b7e493a7b95864a2191f617968ee1efdcdb5b015e45da55086b2b382a380cf66bc61521b2327a6bbf247ab7635da9a48acc119e867467\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 610aa2973bb0d67efc725204a0af7db852bcdd8227e309e6a523ef627555b7aeb783dee396934b61141590952801c027a559a3b7380abb6724224cf825a9c74dccfae278719551bbf0e6a8125d64bb437ef78c24cc00a52fd9a716ac20102b5a1d8fbd445d9a2d4ce2c55a2f549c2fed8e5932cbdfc8deb907d973834c2963720557668d61e3f2e53564d6db7b41899873e3ca66a1b5186a8a545d27915aa466df12ca7163a7d8137eea71ef80690d229deb089510567f24756f0f70a1dac609a57a11ddc400af943126e5c5b118b76b769dfc1a7a6ec748b5b906baa0f0e188b1c6fdbd6bc307af0fd9b4602ea62513430b3208e3d690707fc2d28ebc432388\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 76f7b6e1cf45b005ad58b5354cfc5799f74edfb27f27b414b4d25500a1ec4bcd46c6b65603b204f69a2a71b8d1099ce96c8ee52e119ed9b080d86d82789e3e5777cc5f920b147126ec8612b206bc5734e828ac819f90ea7191832d570d376df2c4e3eb5070fd8382f8c0a9b89da928bfbdd24bf1d17ebc83f9237a51352ff04b6bb3848cb6a9c195e5369f4b6ed9b4cc166377f88c7e6db6ef78c0e1bfbac5a3825867af9b22689b627dcd8d1441b515b15b78688b52b04df4157a888aabdb9e792c65fcbdcd03743fe45e637afa7e422782e6da58b95163acd59353e634337abb1c15b831a9dec79c517a5be0b4ee43f7544a2e9bf6af2bc53b080c60dc2bc6\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 338514dc5a9ce8f20a5040f26a830018314c569249d540e2dec247f4ae925f6cda2d7a535e4e20e5348bf14f6c87861b37fbe4901758dd38da7cc7cc050edd1e208acaf6ab2d332a6482c4e5af4cd4c4f1f9950610ff56ef910b2831e3f23b2b6d3325e8a9f4fc50e0057a50af5db51ec2a1f78d0465e5f54053113df300584f458a1ebf6e5b1358f2454cef3b3e4aec9bcdfdcdf5d88206bed1e9a4e7c7c8dc5f087d66103bcd28e94c",
     "2c233eac1706261aa6aa67f044bb06532954d91653aedcd58e8231a81c52aea96bb4ad1adc5e3c2183ea99247a4af8011b415d618c67c94f0b276bdafcddc8b646182989c1db26da677bfba285c0ab76c82b80a638a2\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 31478424e4255ab21a4d9a8c5a3daa8f0dd5416f79c2baab2fbeef406f76c493cb436acd030e0bc4d09432d9983860c01b1c559ce095b7d91761ac2e4bc5513c68ae6bdf747d556a84ac07133233368fc92d4f32f9bc9fc415c3d0dfa87f84853a828fdd103b8ade889a020f965304cae5324f78e36c72cf5d8b94496a6f48b03a9ee3f32fb435d48d31002ace7d212a108fef640f55e715a148335b396e900ca3fe96a0854764b54c3187e37d9eb5a65b54ce6676d3747bfda91ed2f536d79a6976fcfbbd683ecee32c5a8dc29622f789579a370eb7d66a1404a376a43ef584a0e2eddea06fe60c28ae08b7d1a8af26b20e50e9a8b3f8654e183219af3dd508\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 90689b191d041a9bc69ea93b26d04236edee88b8af6c0b29e9b438270b242dca467ee4874acf7f9b6b244c3843674962c9d0d67fdb7021aba63fcaec2eac3b6b5114ca4b242b08a1ddc1dc671b403bbd5ccb57c7f6c87cf0dc995b38aba6fe635f4a727f6b164bd36a5ff5e7b91e42bbe50835638cf9e3c7a5397f5f095784c3dc5c493ee1a22a9e2b3f28c71dddda2553e269d6e818aaad196b22e670eec5832a84a0f89cb9bf5d8f69e35f34ccbef4037e9a4b6bf2d8d3197bd02acb344cbe27006efb73db0b9d5493dcd14b95b934afc2768af27d1b3b24de694fc0f00f757488d231e3e2cc5be77530f512014445889600bd1a265a4bf188f617b9751783\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 9edf0e6ae25a3e7b6f31fa13a7a31db0e6ce2faa624c2ebcba9669bf5f205758e1e904a9a738bdf430072b0563d1a87f16522811d645cd9f85f13359d2961bbc583a3b15c66ab5a0d1373c2949261e3f44c2a1a88e25190efd30aa9fc410d2d23148c16daa90457bf1ee77c2d344525036e037ed473275bd535fa961a66e47072b586915d85d3d7edaae7945b5e7f08fa15a4d08cc669b3846b1ea02cdc3eb9bc5a54aba227f9434f19d28d06add791fce9efe2171e2c676bc1b09bc163798a1a74b7fdedad993dc47c8323cbe3aead96d0d4e7e494ac390200e6a79f96d88844d59a3d78626b0797b902220874e6957e6c214f3ab7574c6e476cc4262beda98\nlabel = \nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 9a4a3467718bbd455baf312dcfc65eeb570d286bc88ffbe19d2f8e032308a50acba1f7951f507f502de91c0ae3fa4708f47ba2459c5c62ca667fde3131ec16f65a221a63d1d27314c54589db50a1fdfe44fc7c789c041ca0398a0e648b1251fd3ea559eff450ba92d133233cc1779a2094e23a6b88f0ad8ef1e0c6ff42d9be754e2c9d904dfc75124b3f34b00e56087e672f5eacb98f27b5f0fda7f67e71c2e3e2d98ce379872d8120aeac24bc5edb3919a196f2790830b615806fc0b5bf03e6b60fbb36c9b202a9972dfb71d28d168f00f698960b2e1cf6a6528060ff7fff91afa0082bb9a618c5a05206de8bdd0759cefbe16b300a1b51ee12809551009bf0\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 008e70553d2ab7d1724c2e422ba525ebed71739bd8eb968c65d8667704383fec6432f0e071cd0ad71809a3fde92233bf7ef0144dabc688dc1beabcc829c76b3e418b6a994c94209e872bf7e7dc64e6ee8cac7a5a6ca3d40a2280f875d88fbbd59a2f5afd245a5b12c3fda1263c97bd1c5536245d0891ebc220757f6a95151cf06af744840cf2ee8610150427ffdcc619de7e0b0c8519c2eece9c45882dcec3bc4822057e5be017d17cf3b1df53c00414fc19fe478e67abec5b1b8e0462ec9e8606994f60433fe15ba3652719047d54089c9193218077f743b71d04990705c663817918b803ef8f362ee17522c3080b97a1db100291a70fabd925de209496209d\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 45a7b98944f429526c32ffd6770d2cfa275eb81a8163d0662e1e418d9a093736ad0aef2ec70013f15b5f240336a0c2c3c673ba265125ff6a3897a91a749a2894187bf7ade153ba1491c66c52b5dc67b3b163725dff9c49e4f36d901e1e9d964b285586777455438f8c001caf53e013720ecb14e1e28aedae25beddc5f42580b9f72bccef986ae0ed3daf0435838b4c2d55bdcef2341f8a08f6ef5c2bc4194eed1c1b2c741c7c9041fae5c8a48e90a469807750bea3a50fb7c848199ed62a6d0b09ea8bebe4ea6d433a73d6a34e31cd9fdd21622814cab547f01d4f6a626aa180e982b2a89977140762567f391ec069d85977a9469513ee60e7a9abb54e07b3a4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 2f782d8e57831158d10ef1fcfa7c1fff1aed675d34bc49656a11d97e1927503e189f76bf4e335b1ea0f53b1e909fdd5fdff67d7e034b518da036c00dba897006031af4830863fd11d6fecec254646d00a2bfc2db8cde7b303922c703885372cdac94d19a296761850dd582c42ba5c96905ebcef582442643ff8baa83911817a4f00ad7f644acd3fef86d43c20c8f81580f044546e606c87a5b073ac860462f11a004ac2fa00f775cebb98e20d07bdb3bfc407f2711267889b0fc365762272276d509f4a9fa94b63c407c0ab98b601837f6f5d0e5171ad86b5b66af9eb94509950c42f5fd7cdb0cc9cd3d95a96f852b5941eb73db45843ae062518044ce18d200\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 3a88faf7dc8658070703eedbaf36302db8e43aec4f1cab99a39637cf2221f5feb0f716d4fce38903532055f8fb6f9036a2e0be53417736bd3746a04bcfe47954a61402fccf19851a2299a54d3c63485d69dbc52095bec0838ba87eec636251a2483d320569d7e62da616dafe0b5f0ab8aae2b2f943d6583dbe35e2047d50eb9b3ae9eeea5cabb580bc34628fe5d00e6f5e5e9a1b5db85d446c276749fe47ad1c495428677e33698ebdc4da12972bcdec64318bc7814e8578851f1905a6ac0874af691da2518daa47b9da4c9f94e832d9d932b5285ee4eb5e50072590f9d3075e76f1e3d691269d76dad090d98a6c32aed8567b74f4dc343bec1cd5a538ca796e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 36b2dd6aae05f5cc143d28532d5e9c2107cd30cdfa69c670004d61657877cbc80e619d2673ca3de8313942f1fbc2151e7b2cd2ab86e91f99a39af44864999bf1037504fdf0561875e7b713e497da2000220ce615d933ad78f04d5ccdbf050affa72953cebe1b52fc2f2745da7e918a235d5e0a55bbbb8fff755704adf305ffdba10fa536361ce984126f0f8b72731218cfa4ad4c6c007a2d3b9329916393a9133b80c951a5731f62b1e8eff8c2c66865260e18040fc603b2479aee5ea762070c09af9149300c12c9bca17f3605703b40bb914e8da315d6db1062f5766cd03d9bafc0cbab492df3f2c74f59a65e4d3b3eb26519b6cf775239d370174032e2c0ed\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 7c440d6013a18f8fe017be3f55384c3b98e08a0df1d71b68e21c8ae75774a80584f9708c21c56f78d0d9bfeb0bf72318abb61c8c89df56db67261930900a1e6353b7ab4615bb4c5fe524b591e6383dd54ed7740f0e0a5f64ecb497c3d503d4d7fcb20441ea1bf678a2edb792dcd4c5a6c0ef570f11212edf698b242c43ebb3081ab17f6271f28c45e300bd367295195db3f2f160f7d6793192dcdf15049e89113bdb4fb526833db559e42f939229c2de0f1d86f0c1b59f6cc27f44744e227b373673c19d0c20c5298fdcad478d2bf4be5514015e5840a5a207f2c61188511d4513a874cd9836282984615369ef4d0d172b6d50a39fd12846f0c0cdba4f8a6c59\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 540c7f1adc69c34a2c230cf1a22a81f8a04bde9da4f844008074f3f68856e2f09fea0ad1ae62df08afbb99b659db9fffd04f940d4f764829a055908a13b59263264a854fbe97eaa251ee5073682fbd7f2316e9ec34a403b05d285e2852a574a25a29d1a1ac4a6d85b74f833160aa292aae2c90f169a83349d58232590be84533448d63f7565d1b3530b295913d7107217d6e98dbc18435da1be650ab747c5fc80bd3b6b3e685bcded82b901b8b58dab7d3ea18096535a9c77c3144e93a8191e0eb2d0f991af331a03c6323c59a45efd1c87a73dec29f9f091b7f7da23f4d7db399ceda5061445e1374eb75653d8422d32c4f36557ec66128ad1511a9c37a132b\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 610b4b5d2a85de6825ab293619162335cf8bb7b234e2b7e3bc898d7123b30f0abe764a0a5c9ee849cc107c6e9dab86cce426b42010719a05096e3cc7e0ac1f0133035756c1380ace2afee84ea82de9b8f612b7d292598d8533a8ce2848ed6d539b2519018806a11318317a864bfa2f2d55db110d7477d4f4f71ab9261477c7d8485beb1c5eba81c52529f98a5430d3eb2f540c7a66ecdebeb1d75391cf1f2d99be18967fc32fb02b515d10f60c20ef63ef6da45f78ec1692b131b2dc8c1b337e78cf81976d8e8908b4f62c0767be8b3a4cd8b3cd2f7ef8b9454eff54795a3edfbfe21cde680dae88544d88624ea27efdf72cd4bebe4a86951e5afaf6170a2398\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 6bfe4b01a7747e8f92a4d9138a2ef034b0127215095145b36e2668e10275c4ee9bd79e397f28bc9422",
     "75c9f401e81a3d7f0b6e3e191026be641171ee916af6bb4ddaaa20fbe55be2e251e2aa4f07b1291c955af87823e2134fef3e843c8af3bbd168344176d9fbc8d11ec8d8b410fa224530c98b84a01da048b7618c944d8cc7b18ab17bd405d262a1870552e827dee9d1a8196ddd93975d4c487e819e4b2e0cf5dc39eee5670e249437c5460dc4684794760e26244e83e0017e3cb37a1b5947709f9059d245c5e3ff23fcfe3b101e496e7a222bf9883f2f12e22b0a31da932f6ec8003f13a70050e2dda32c01ec3fb80908593bfeb2c9b06e0868738d545475\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 989d2556e8fe1a5bb102c28190c8ee1abf3ce700857a0fe25e648998daf337bc5cd835799d86a3b3c93c7ba7fa9d7feada59bfe62a6f76c694d37aa6e741c1a6a0f55c8202b3649d9f134c3f711b9dc907b5b8ff932379c3b24da57c4684c99cd94b5f0dd363108c06f5b6a7b6f7743f46f726d064a4cf2dd63fe0c26e02b2950db03903f14b7b1a22e1a68620384cced1e54efd29b977cbd58186f10d46d54964ec04f29b8ab3c6b58cbde5630465ba3410c814b9da9903f8549c8455d3f9050d905ba75c8f7feb55a20dc996d040184dcdc3019f841dabd657b07cc0da579f88eaa0298507ae6b2e5b8b0ecfabc254679900366ee747831760ff1667ac9625\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 0000822e8870c00908cbf5032226547d38e423deb912c49c9fcbee66920cd2e9e3197b3fd7428cbbc5e90e660545720f180ac0ce06205cef8735446de30df32c8797380ccce9c0512eb285b7bffd883ef00fe118f027bdc75700e511226ec4da35f406e460fb88f9af2e9c4ec219387676ae21cadfad0fb1d704be69d0ebcdda90dff7e172612c972c6a974b828acee6ca186c71b50376d1ed5eb6c107408065473d53a2ebedc833f07f60f909a6c42464d79d76f94531a0d386213fce5efc2e66f311e73b06142f8245b063b9e395722dbea029dabe5ed1c12788b890974ba1d28492cce2c90e0a3026c282964763a030a7f7f3f76a72843a97d9eee17cdbbb00f4\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 822e8870c00908cbf5032226547d38e423deb912c49c9fcbee66920cd2e9e3197b3fd7428cbbc5e90e660545720f180ac0ce06205cef8735446de30df32c8797380ccce9c0512eb285b7bffd883ef00fe118f027bdc75700e511226ec4da35f406e460fb88f9af2e9c4ec219387676ae21cadfad0fb1d704be69d0ebcdda90dff7e172612c972c6a974b828acee6ca186c71b50376d1ed5eb6c107408065473d53a2ebedc833f07f60f909a6c42464d79d76f94531a0d386213fce5efc2e66f311e73b06142f8245b063b9e395722dbea029dabe5ed1c12788b890974ba1d28492cce2c90e0a3026c282964763a030a7f7f3f76a72843a97d9eee17cdbbb00f40000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 2e8870c00908cbf5032226547d38e423deb912c49c9fcbee66920cd2e9e3197b3fd7428cbbc5e90e660545720f180ac0ce06205cef8735446de30df32c8797380ccce9c0512eb285b7bffd883ef00fe118f027bdc75700e511226ec4da35f406e460fb88f9af2e9c4ec219387676ae21cadfad0fb1d704be69d0ebcdda90dff7e172612c972c6a974b828acee6ca186c71b50376d1ed5eb6c107408065473d53a2ebedc833f07f60f909a6c42464d79d76f94531a0d386213fce5efc2e66f311e73b06142f8245b063b9e395722dbea029dabe5ed1c12788b890974ba1d28492cce2c90e0a3026c282964763a030a7f7f3f76a72843a97d9eee17cdbbb00f4\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen140 = 27137;
+static const size_t kLen156 = 27137;
 
-static const char *kData140[] = {
+static const char *kData156[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha256_mgf1sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 7627eef3567b2a27268e52053ecd31c3a7172ccb9ddcee819b306a5b3c66b7573ca4fa88efc6f3c4a00bfa0ae7139f64543a4dac3d05823f6ff477cfcec84fe2ac7a68b17204b390232e110310c4e899c4e7c10967db4acde042dbbf19dbe00b4b4741de1020aaaaffb5054c797c9f136f7d93ac3fc8caff6654242d7821ebee517bf537f44366a0fdd45ae05b9909c2e6cc1ed9281eff4399f76c96b96233ec29ae0bbf0d752b234fc197389f51050aa1acd01c074c3ac8fbdb9ea8b651a95995e8db4ad5c43b6c8673e5a126e7ee94b8dff4c5afc01259bc8da76950bae6f8bae715f50985b0d6f66d04c6fef3b700720eecdcdf171bb7b1ecbe7289c467c1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001028201007627eef3567b2a27268e52053ecd31c3a7172ccb9ddcee819b306a5b3c66b7573ca4fa88efc6f3c4a00bfa0ae7139f64543a4dac3d05823f6ff477cfcec84fe2ac7a68b17204b390232e110310c4e899c4e7c10967db4acde042dbbf19dbe00b4b4741de1020aaaaffb5054c797c9f136f7d93ac3fc8caff6654242d7821ebee517bf537f44366a0fdd45ae05b9909c2e6cc1ed9281eff4399f76c96b96233ec29ae0bbf0d752b234fc197389f51050aa1acd01c074c3ac8fbdb9ea8b651a95995e8db4ad5c43b6c8673e5a126e7ee94b8dff4c5afc01259bc8da76950bae6f8bae715f50985b0d6f66d04c6fef3b700720eecdcdf171bb7b1ecbe7289c467c102818100dc431050f782e894fb5248247d98cb7d58b8d1e24f3b55d041c56e4de086b0d5bb028bda42eeb5d234d5681e5809d415e6a289ad4cfbf78f978f6c35814f50eebff1c5b80a69f788e81e6bab5ddaa78369d659d143ec6f17e79813a575cfad9c569156b90113e2e9110ad9e7b48a1c9348a6e653321191290ea36cfb3a5b18f102818100bd1a81e7977f9898122273ae3222b598ea5fb19eb4eabc38308a5e32196603b2e500ffb79f5b886816611debc472fac45544070beb057c941378a6868af3b7a03d3f9880ec47d5e089b94fbde542aba9ae8d72c57088d7abf5b131f39098f7bc160f90536abc9492fd4e06f3ed7299d4b97bb03677207d95669f140cfbc20f2502818100a94b528b28f291599121d91952ffd1c7f21d7c1479d99d478885fb161870ee1218bf08472612dbe5497e8d9c650688e09c786961ae3e2c354dc48ae34514759c4c23c4588488961dc06b414e61c0e1e7fbbd2923d31532fe289f96da220711e58c14019808e00414276933bb07e4efb9b4a9b37656917205209f33f09515d7c10281803af0e72a933aef09ff2503df78bafed531c02ff1a2bc437c540cdcbd4ad35435cf511763596543480629b114ca7f780ff7efa32ea0cb6e000d6d9ea1f2ef71fd9cf9948422a165557e37e755edfe70d90b920502eb478bc98a63f788ce3a0f856d6ede7251a383bfa8fa480a81a925af7b3cc538c4bab8c9f7597ffb68011d8d0281802640fbfbcfefb163ee7a87b6483a66ee41f956d90fa8a7939bfc042ee0924b1b7993d0445f758d51933e85179c0320b0c968b48a91c38b5be923e1097c0c562f88d42294b6a2759bafa5428a74f1270874e45f6fcc60f21602de5eccd143cf31241f5921b5ad3983fb54ef17be3b285367e50c999c67247b552fe4bfce945f7b]\n[sha = SHA-256]\n\n# tcId = 1\nct = 6e62bf24d95aff6868afec2a92a445b6458f16f688c19fe1212f66a63137831653cedd359d8cff4dd485d77dfd55812c181373201f54aafd65730d2a304e623455d51125d891e65d97fce52341cae45fb64c38a384a1c621e2713ee6794633f029a9fd4d774f56551eac2176162e162640f25eab873a3451c475570f19228bcede4c67c370a75ed7fabccd538c9819eff182481b10d42f1a9f6a05373b8cf9b71818d467bd3b8ebacb619e8ad42916e600c043effceb3855bc48a629e60ae886f51b2a7876b0e623fb2ce68af4b039242f963adb0e4240aed0ed07f65f1ee7c0cc77d210d0c2d1dc10c81b881aa0c9c9e9499665cf2970d2ccfeeb3191531765\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 207180c340658b5154ae45d2e4e7326a0997c683a26b595e536a29333c4b66149af85e029d5419a39e3a147b221516ffd86b6b4b66c3e0c4c49fe8c57a2f5c37b8704b9b592b80db9cd788a4ed51ab4f0a1cbed63bd18d1f06a22f225866b0c2c417cb23473b7ba4250b1353bd2e5b4f0f937cd2efe5fa38db3c295f7748b970088657db4aa9a76e1ee6fbff166ec1861d00d085326c7384bdd1bc2f400d4f74dbdfadaf3fdc46073e668573e02030b9eb5af58eb540c66677a771194479ec0098d858a2ea45d0ba1e6b32440dfbac745000554d51a17684ca964b02a74d479f1d432ef763ef4059715a4348cfe36a215359712f25b6977903be4adb92febbf6\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 5eab3f0741e63986ed647d53e1cd71df041986900803d0f99c68355d249a15a47dc5b4f70a191477654299e5a2731f3b4eec76dea18262fc696ac794e5f66cbfcddac4472c578e246c26707598055584540b839836b1404c5611ae558a984cee8fd036cea924e0be2474a940f61e0acc14fcae95ebdc59942a9ce9af9a9c81999f7f6815f057ffdc2533cb15d6391d1e2d95f16f9c04209c889a4c359c7d2926d28a66e2b030a416b928d2825627998e5191fb4983a6e65024262d94fc09187a2d78162122433251d1bfcc8e507d06eba2d229c10031261da32ab8ccd15f1c5f9fbf07ed158483d736a110af4b44d6a4da60d6cb519b4454213cf9f0dc560f2b\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 0da290b0bf71a1141b2adc62b5b42b07fc52520cb05d1f39ccca7b7c22d379a6c2f2d93143d057050140527a1e5638243938b531ec3de7014b0151301e49b9fa433482a02abdfd94193dc9c70157e557776a69ded01ecbeac405133595c61165a428b6284729a4746b47d2bbaca9d7432c3b5693591cfee488eb3c68ddb6cde0dd61cfc6952423f994abecee34f5683732b29934a2c498ad48cdd30c149177189f48eefd9cc7232df18be11ff5f7e3af7319e3115997c599e2d8f7f4f663dcc40032d403436d3058a5ea66473660f0e195281ec6eba997d2a951ca6ca5f3c112715c89da1d3dfb20a21940594ed10ade90ed7452b753757d7241cb8a803c373a\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 121196e51a3f4476bfb6adddfdeb3a25dad72d1ea315d652f331a43631ad36724b3d14532110dc44e407b1184618f115677b33751fb0e8786ba220cfa7fc3fce22822eabdd4fc2761c7f34a04e8f13c1021c31adc123a32d871f0da6cdacab9c020222da52afd5c307a6e55e4566944403fda426ee2c6c973ccaaafe2d081ed8c5b1dc00662424e395faed86c9ae19a3a95950c83d2a9ad5c7e7f670faeb123acef07fe7795ad298aafe543504d7811336b3e2ecb1622bc90599a185b34700f8f4c52a651d73ea57e8cfa80e61d9da61f36951c7194ae4dee3c6e67b5757a39685dd3fe01cb87620a54666ff8132e93d7081d38ddc9f079431075e96cca78f59\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 7ae8e4f5494393be144d81517f11baf4b634bb68b2f0ea9b30731035e8cbf4283c0ca99120f60b75ef685e989fecd7a5dc524cb66292a0ab87ebc61e67baca1a8aed99350edee045dfdd029406acb707d85dec9555169cf7ec5118d8f29d182f205e2859a8dcc5122bed640ad0ef128deb21785efaa20f92067dc216cf40c15bd7130e2c094131917950a816da814c5990fa6beed709a0218f4ddca2473796e1b44cff6d7ed601c574a784d0865d3afe5fec023ebe71bca881da5637e3d1d17238c20a5bd0075bac018f07898f74b9e6dc0fa3d5f8d0b274dfef3e6720d8396b34a81ac2e64da5b3e5d7666323ed7c56e8bdd179f3c6b2cf05bcac402513dd87\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 096958786ee7972050d67a9e4b69d6c6af7db7cc674386df725770dd29129b826e39552330104c8d71e6cc3a3014dd2f61b54153af51b0438d447ee939f9e3c13bb8b00a37dea6a068f6c9d27e848b1be7a1eeeb3ee50b78036fba95ae46948ca5b13f356ea24db10f60dc09e4b8bad8f766b668ef72524432080a0ce00ed676d6d5e354984b1078520412525848156d06f0652469f95791baa3d9a798ae537094f76f976faecd5c9ce0c930a75910c63dacf63485cb4b5e7bdbcf4d80e74037eaa1a8fe4b52930bec6be99cf6ac88cf5878dbf6859d456a95dbc34654eec425de84ca2a535d517403a9aada827e7d0093ecfc97ed056a7652825e9a45cb2dcb\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 6583e2f176aa7e7f655d2c53497349c156c8851fb23325589e85fb83bfa857346caba222cdaa3234e71564154298c24dbb85e18822a1d5e7faa47863a64d76874a3cbc70f4d9f137426a344c473fac1dd7008a9973765e9f66c5b492535a647c273c4f78ceb5aa7ba963a2142f2ce4a81f804c002b9b2eabb3c75e80a3c6ceafe5384a544c672a5d28d32bb87115f43eb79775fd9b3f4a2f6e6a89368bdd95ef1d014877b60afdb1",
     "234acd57653a65459f01b2fbe381f22a739504b4897a7e6c33b6349b276db6083abad9c169405859b800c812237634b503de6ada43013c1d86697a135be78a9784576d796d62aa7819e2ea0e2d902ffdd9cfdd1ae66212ee\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = a0443ba434156d0b503ec662f5eb5b10e20ad0cb8233720ee187ba986e4811dd312844d3edb26bfaf51b4b9268dc3c76072dd47c199d713c91824da23ff00481ee69e9d4cc543120fc33b7244bf0c1ad5fdd1ae9cbada7fe9a70ad0afaaaad8361e8dc4b3198ae661a84e275b60bf2ebb85e512da785d2fc3482294fa11967681d7bceffc08ce0e36f0a8af7fcfb1337186863c2c1c1b94c9ec9785cd3d94d15437c23b775677f3d29a4c9e52f13398fd14661160e5868bca97625aa6c7ecb07bbb479644def353f1f01a4c4100f9adb82c4f6a265a5ee962da58c3c042aa549c9d2de3008e7448e0c4b9b4ac8f5e4d8629873909bb995ccc0825fe87d81d596\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 26aa8e7931ed624bfd4077e3b83ec08de080483a61641e877f493fb7d0ae4dfebd4f05612a2e4869d20d440a64e928b13daa3b79da2ed674b99421df7e7f625a22b1c71136da27db699d3dd96e3364ee0cd2123ab6808930c6bc28a5dc307880d1ab4b03bcd6178a81b8ad52aafffbab387d40352dfea526abedca016c87e9e56ccc4c88e80f579da015b979bcdd88618b2a32ce072918b2e223535359f1ce4eaba5e692e6296b2140dc2304092ebd6f136a48092b3849082b57e70c93b54db55045dd6094ef3d2cfa8bc9e2fd2b1bbe0c7c603ad38d3f40c9eac8ae5e28cbbb031c38d93d3b2541d94eab3a1e8992a444ee4ce7b8d08c0b9a4f623d32fcba14\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 7efb69f1137d6a6e813b7ab75bf0400b3d07a442b88ab048675dc06b0215fc1a2e033263ec31a6c1d2eac56cb0470d69022a48131d1f000bbed70586b80cf6356465c8834daced7ea2a5ff8ef9c44d5ab828ffbf0556a6394752a4a28a70cae20084e1236f042f6c29de5cb34ef73acba5abcc7ccb3a26342701df3b9daa945d9fa5bf0b9b10306655e56370183f50fb8321f8f0cd1c72114791fca5df2166296b509b01a0b291c46110787cebe69d41b3b1e89590bc2f5e5d49ea24ae0f1207eef1aee54b9760553e80c5506a8a8a75732e92875025f0bfd5ead71e4340c8a9fa16dcd5a7dc96d8c4a7dc4e91f47a69366445c4695c8bad578ffe52bb672f65\nlabel = \nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 287d7108a1c6e7a18acb0045b20c57cdf2ac03456b44942764a7a9e9fdf3db481d7e202e4c8d733b56b9c1e93d71e791af8325c9363df789b252a5ed0eddc79e76fa41c2cb0a35618398217a390a5e6d99eed905d5554d19c1cf4e30bdf1c2fcc5148b641d71b3f1977b63d232648ddd935ec9499a53ac2fbcac55f462e91065adaa018a39c453ba759bd68b454074153421e2ce75cf149f748b5b84758df8a423d1c50c880af863f2a6df3cd465ca36aa2152b5771f3d507f4a4dd9f8006d80eca23537092287976f218a90df1e16d889fe31e79f7309f3224f613e9b52479fe73b7aad915319a3b62a5936649f7d015d7b09f7fa9f454f78a7c3dd4bf791e0\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 8b65065af82770625d24917d13fd97ae13247cad97910a2651f95800165b76cc34bfe06cbf8c31a7d7ab4f41e05c45a25b90c606378c8e49c95a15ca11ae37e797a00f1b2680a6958c54396be4e1ceedcabc58d9f136b36867a2fefe648a9758f49634bfbcaa48717a116cba58c27539be10c56911aabe013e0329645e8308423c3aa42e0c9b1f4b5f546ddd9f90bf4d007dab52ac3879db755e4f2b96db5cf01950f39076f261f50b1bae137be500b03ceff6ea1bbd80b33424f7faba5cc6b86670fcb7db1a9b3c58bdfd7b75ba9f3ebd34ae32d320c757020a7324df7d3985bccfe0e81bb7f61bd98cb37219312299b4f274b2c90c52a8e1790f52e8fdd768\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 356e91db9bd932c7b5726da288e2620cd79667c2e1d7aca562331ceaa6e4ab47665213ed75579abb147728bcff60787c95107f5be787c42e714d51627fcc8b4ea71c232c0c80ce6163cd0fbfa9dd7e8c1990176abc2705f4ffcf1d5c62393eab1c0ec8a653a90f27a968df8f4af622e96f663fceead8b0bf5dff65cd657a72b9c33265c5c2a8f7f9c614b9c2f8a95246970e6a778aca4b12552da47c274282ad9205ecd2264ae3c649597beaa35c141910e84233776d419448f55019a84e199a4867d68bf213f47b0316d50079dab77299fbbe7fe8929906461c1103a97c2b3f1633c8ef03e820ec675e331cd1fda8ebfedf541d0f2b571f4eaf292ce0ab14c1\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 5a6efdd2d211d50366885e177190ce1621ba110ee46530bd083ba76ed48992d85efd8f9ba964eb33e596e0c0bcb545f89e2c9592ed18495e8e5df1866fe30b27522a3ad9cf7124c4aa23f7c925900613c50b7c18872b4537a750419ae128e913e9a2d87c219e2cd01132972298028e54fe394ef9779d04543c72eec4c5732cadff0b954964706bc4085722b0c595162d11793ab29754837bf5d324e21814ea24b12fed441f20d22148ba5a987b6aa7c7d4ab5a33af8e6c9096c29777cb0d5cfe938a6ed5d30936a5a8f5fc435df14d1c439d1b9d274254e7b248bd20d21dc4652c1605d5a2929db018bd45794a523b217fe0a9a6b0704197ba8126fc8311556f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 52582e10264630e1584155f5e970b8eda9108a87370861cda12ee773411cf556db328c8a2a165d10f6f969ac61b170a75975fbdf9319d13c9535f30d621db19e41da3a04fe40874caf779c8f03bd5d1892e52925b183c118446ed9a335e9c1dc4519fb1253215e5f8d8ee6d49c0167af9d5ca5b1ace067af573e0be9a61beeccdac37b0e54f6b0f70576cb8a400d01136357a8576e81c119d3dd91c7b5cb343692a810362e1e6dc06c1746e071a903a2856b4446f10f78c670d617e5e24dc5c0e45caafbf8ffc4af6b3ef998fe1bfb59aacb16d98d7e389679939861a6722c4e29af731da99d17058d7a12ead0d3d576de796ad2ad596feada4c091f10748536\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 3f5e00347c36ceb79f400effcae92d331aa9f52539041c50dbbc6fd071912912692a16353378276a2c1596358c46f6232434a95a99c573d0b83e4a6e970a73e99ca13d734506e2a2a56744b1872bffd501a80ba7cf5494df6ff9b421cb10247e11d19ac9e60afe0dda87cb351c21ba554ea50b70f6eee4ffa949ae38694ef831020d4e599c6ff4493d07c7b6be06453b84143813a68dfe0fada2317a9f4040a3cf6308090b6bfaca36067312f41bc0c4c01ac00fdb5aee4395b04cdff82cb433b01cd3e70daafc7807b2f770226699e7535124a453f7ad2653bfb7cfe71e120dc37ba88a5be347ad134351c11ff1019b7e42d24b7a3890a8424fae53a10c0e11\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = a166bf7b5c2cf1896c0b924a69233a0a585bd47ed7f2330654aa68806deb0ff68c6475050ab45c691bbbcc58dbc2f5c817729e8e195ebd39d48bd5e14977abae0829636831655917fb5a758fb43a8e505d6ce595f625970685f7ec81cb5592210f5d68c6e2e1ef26b4ef8c92bf44f077e1d5099f379cb8120ad185bf07877979ca81f251fb81be0ad3c14f4d7885fcec496f80033fd4279b6830a20cbdead27c0967e28d1e06ef4bd7ba89210ec0d696274a187dc2f13212f5adf06e9450eca398325cfda73431036ac21b087d373c9f575c941f8cb078961176e31859a61c49baf8ff4f817a11010448d6a0e40dcede1a5ac3befa4c6e9d9d67d8e8fd8b6de3\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 75829ac4d97848dfba21c1688e936cfc736f53fde5b91d5330b63a9968dd4f51c2f529fd8d8f84e4a908196fcc5deba21b5c7300d7381e07c4e0ea2184965169cc9464933ef5a840d86b1dbcc945c7547d9eab245ba64d24946a75961161c2b8f417daf11b163b1e5a5b02d45341384f37755248fa871e6a82f948ad6292f11445bf30596dcccec73a441cea5e5dc470016309a83b6c8f158536687ad2734d3ea1562d46e23bfe8cab498d19b0b104d97182aacf852b6db3c4670109b81af1bd99b483d92b3e4bd813edfa4d0513214dcc5bb4da768e86007c22f11e5fe6f4cb60b909958fb94dea660d3fff0b99db15c2d2e6c8df7478330dade8c517b90975\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 8e5f01ff0c1775870715fd0366a8748531f8b00803df35e0e2308db63bbec4eca4e093351876b794213b904e5dde284a82d74abfcbfff94bc9a8300bea99edd07fe97d6e0b11219f85ac15acc404d37d3da16819a14a438f3f72f8178b312526232386e918a8a7e11fc38f4668c499a00480cf9d2d75aabc0198d3ba9ba345fba9105c6564df5f6ce796f14100d186abffe4d83d57969c1caddc7c7aa340b4d1bab23d9b3982278328ddebe648f5c52588738f3c56a88b3f34c890c03fafc27f485a17677a53e974dc1dd86f463a927f4328ac51bbc61705ae8abd7f45628957489e2defd8e043b955b118fb2a1c407d45893004aae0f945f06add1e45b41a03\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 50c23e2ad6e3f3b10a5716cbf60efcc9f66d2c6f17bf050ba0153b877ba2755e8a0d5406003456",
     "2266155744ef80547b8af777b0ff764fbb12baae49d02b4f6d65b6cd8f0a397839101d32ae163ff2e6072748d6b8017e5e73e332d53f4e91fe6233a82dbf54f3146b489803575c5ea37ab55a9ea7eae47ad4f1727d45822b569cd6e5d4b6ab759850948186616b5da2a9a316f57d899f91934bbb27edcdfa19532ba1c01f3724738daffdd88c9a18562ebcbc49185b0a817407903476d442c424c81b63aeb8f9d1b184756e0cc0a381eaba45a85c8bbc6770fd047ff1a6404a384599fbbd6a40b212a066e23f6a15cf13e42c0ea88c710e4d70c612074968e5\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 3f92a694661cae336cac7a3c5a6f67e0655d10218a64459739ab9664f2cec58978939512df621e6b92fe3429bb22c08b5103da648a7719e7e95a04e6b61601546955825d60f4c517619f851780ad17f1b8a955cf8c7f1a5e26ca4a0cc19cca751d0790d56e1140a4705e19274f638b7c16d9d3e423a7f787d02699235e3e9e4d543a954f9b1bce5411c8ebdcae86a4bb86c66818a0bab51a2b00383b318e53d95508bab1b19e388cd5a03cdceba0f7176c1782e19ef62cff69352d444b1ce0e1f339e96d8a65c07aa37f5f2cf33867f6c496e0da6cd79b3e2183b57064ce21a1b92072702e555a82cad75107fdfd8bd5e7ea5f119cfbbc1770e962fd0b781aff\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = b056e2513c7c470d897032d406e97b5946dcad52df1c1650d61a1d7b0af59e8cfaec4d9e834d06d819b92a7d440d277e5039ab8aeff25043e98b281ae6ce0a91f8dfbbd1b4998fe5481671381b6a3952448b617ae606f06a0143561a040edaf3c972e611bd7cb814aa4761d38e4a007ca65af8fde6eb25d919d8bd9273cca7622984aa27994d049612424547775c5df75483962143522d075b8c55ea61b04583eb4c0358f9fbb902dedff30b7d8592b57094df4f6345668af53d1aea86fb36dd69b4434bacf8fc12c13802f5b03551ba8f207d4060a9f56e6b7e18c766eb82b6ce6ee0747fbe785c3c1c25fe7fb87de50032b172129fa41a69c3ce0e777ef10f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 00000da290b0bf71a1141b2adc62b5b42b07fc52520cb05d1f39ccca7b7c22d379a6c2f2d93143d057050140527a1e5638243938b531ec3de7014b0151301e49b9fa433482a02abdfd94193dc9c70157e557776a69ded01ecbeac405133595c61165a428b6284729a4746b47d2bbaca9d7432c3b5693591cfee488eb3c68ddb6cde0dd61cfc6952423f994abecee34f5683732b29934a2c498ad48cdd30c149177189f48eefd9cc7232df18be11ff5f7e3af7319e3115997c599e2d8f7f4f663dcc40032d403436d3058a5ea66473660f0e195281ec6eba997d2a951ca6ca5f3c112715c89da1d3dfb20a21940594ed10ade90ed7452b753757d7241cb8a803c373a\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 0da290b0bf71a1141b2adc62b5b42b07fc52520cb05d1f39ccca7b7c22d379a6c2f2d93143d057050140527a1e5638243938b531ec3de7014b0151301e49b9fa433482a02abdfd94193dc9c70157e557776a69ded01ecbeac405133595c61165a428b6284729a4746b47d2bbaca9d7432c3b5693591cfee488eb3c68ddb6cde0dd61cfc6952423f994abecee34f5683732b29934a2c498ad48cdd30c149177189f48eefd9cc7232df18be11ff5f7e3af7319e3115997c599e2d8f7f4f663dcc40032d403436d3058a5ea66473660f0e195281ec6eba997d2a951ca6ca5f3c112715c89da1d3dfb20a21940594ed10ade90ed7452b753757d7241cb8a803c373a0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = a290b0bf71a1141b2adc62b5b42b07fc52520cb05d1f39ccca7b7c22d379a6c2f2d93143d057050140527a1e5638243938b531ec3de7014b0151301e49b9fa433482a02abdfd94193dc9c70157e557776a69ded01ecbeac405133595c61165a428b6284729a4746b47d2bbaca9d7432c3b5693591cfee488eb3c68ddb6cde0dd61cfc6952423f994abecee34f5683732b29934a2c498ad48cdd30c149177189f48eefd9cc7232df18be11ff5f7e3af7319e3115997c599e2d8f7f4f663dcc40032d403436d3058a5ea66473660f0e195281ec6eba997d2a951ca6ca5f3c112715c89da1d3dfb20a21940594ed10ade90ed7452b753757d7241cb8a803c373a\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 31\n# em represents a small integer\nct = 18416ff48c3a78bc85e1f483d546052d84deac02ce86fcd197215f227b6dad58bc19394f46551111f858b08879bc37c620b1e81ebac4c75fdd71713ce75c24293fa39caf46294d28bf87a46da9a769a304157ea1fc71afc3bfb790da32e84d812a8946d1b3d211fb6972b3fe6674496b2d8056c1503d02fd4c2e607bfb1e6b26b35636b8b823757ee9ba3795d3af2dd8710b0a6da4dbb430bc69dc089f1563d34f0d79431d63e7b8d94c8234649b64223d1e0be17463401184a096feb9c81e226eec26c7e9f3f4357536633029ebc0349bc136d1206c6064fc51b6d2e79578f2b26439c5b3f6ffe1b515740b3c4b94a49430631292968eb50983251bbc7f0f89\nlabel = 5a3564e9482a072bd99d0306d69a7f4595c49fb9c06b72250eed2b50ceddcc4700000000\nmsg = c4fc4b065f4595751c7ff8bb99681d505b7d0f1730d404617940f4b5c3b01979ffcffd19e86f69450e5fc14d9bc27a1f39734fd5f8f663d2d87c444e3e15da8764709909679aaa553d98ddbb1ad7dcc8be04bb8751570b4e6cdc7a8f56b09a4af43053a393bd8f947d7625137e6d84f9b9c727475a98ea22efcf679ee0aa5258da88a08afc53bd8bfa19b0131d6f676fe198a9c6a1f84174fc69ccf8e34e3617f8ff6c4192075cd6668392523fbecedb27578e591dead78c80a89be589a1\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em has low hamming weight\nct = 23ee3b4df8ac632078167f2f97a736469c6e6b39ced4ddc552d31f0fbc7ccb478adabe56cac20cbec1a0084125aefde0bdb575d68bd74cfbdf5f3bfb4401fa573645c223568918aa911c1f5a01b3b0903e91d82e8c04194df4bdc5facb6959b4df23593c7925a827f029064c75a4bc3d2899649025670e70f3e01336fe961664563a3bb0c7bca66d7eed48326746a060c5d3f18a160abce399917ab2e2386d0f1c2d7c9105d16befc1b0bfd72606ec300a777ac550b1b0b807b7e46467db5bfe0eac8bcbebb2df47bc65fe42174368595b72650b770f47157d2d14c71cebcaaa5cf567ab803e2bcff5f4298c06b1983757abe02faf4c7c5f9141aface72ab98c\nlabel = b503d03521b4ffc4b855c94e911a6117f04c76c6fe8000f8031e705486ae641900000000\nmsg = 03fd61590ddd05555a6d46d1e8925293fe46fa168cb06135c2e7c8d36551187e62016f40f3eb31751f3690f5da1aaba5c16ffa650b2e6c25f3763fe324929c4becc7fb28a383d66c31973c72eb13ff8c87a92b495f6f0619290f8675e9889f49d30d5e77b2115e8805eeeb1aa9324843a75e0bbe70538eefb7978a0ea7beb211e67bb075981673517518586eca5b04ef3ad6a3a978605fbc0e67af7fe412acfcb550d20c9900f4d71d7829a107cc51d663db54c57116959998f3946b4d43\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em has low hamming weight\nct = 94f4edda147a95cf29bb0402d0413e5421b5ae347c31b2ec3239bd808c4e5b609d0ce9d9c3a12e47eae6c5fe319288553ba25e8932d644a6387087b4e495ad4bc124596d9440ddd5376f2c1844e61a7c51bef528ad20065574198ace92d3402dcf4df8ff5d68c06dafe9302da4e075ab0e011bfc1bbaa55b4cc1bc30dc9b104539c21d60b6fc7044e0242591360751fbeb2883099602a900cb5320195cb7071819dbce2667a7532aacb2c9b96f3e726267b709c5c0877280f5d4efeb5d4155bf8751f9560db4bfaf8150a8f27b366c3935860aeb106bd88914b6bccf35bb6eaf9217254e6dacd88f0f1182d6cbe25635d4d9ad76a06687d2527ed7d9cbf50803\nlabel = 3bd80a6378115c0c946b4e3af28c6c96d1110621e21e8633416e9c8ef0a73d4",
     "000000000\nmsg = 90fd851c721e936df0134ce13f2b7f4469d58f69f85f4bebe2726123cc742c1c43293f85f50b5c6d220f40c387a1f2bb2704a16508e267c6c4324a82191170e67cbf57f56dc02a706e3373e9dca1ca0f7703804c0093e9f8a2ae5502d2ccbf26dff3cd179b5b8f97959d5d2a9400b31b01ee09caa6013d198beb7e0979aed5263974591cca36ceceb252110e61bebdf0272386f9571be79fe3afc8478eb9e7155759ed20e2a2e537d98aeda18c374ed9b48be8624984ba4b15bfffff6cc9\nresult = valid\nflags = Constructed\n\n# tcId = 34\n# em has low hamming weight\nct = 68825b60b53cc0bbc92e4ce994b0dd270bad0eb657e41acf26a9e3161c5254e4bd38b03e90d7453424e605a372bc185f3ae6ba9ff58fab0cc4c1cc158d7a1e8f1f0b30ac08789f7576fab2dae7e86dae60d9af793dc1b400c2d25a9d3357ba0d27361d74a1b4e1445147a45875901d70f3190a0b34defbdbec1cb9ed3014f15a1a0f9000d9b224fba944e791d303d816bafeb8e65dfc6d740d04719c4ab36c4bbf4ebea5fc45ead338825fc5a71dd6c25f8d8891a4f8d6e0b35483c75c1bd645c3cbe9dcf5a17ae5cd2abdfb132b2b37102122a9bfc42ceb3eac98f2af39905b9cece5d122b70c95239062ceeab798691dd2b88028047924d5ae814df78d555b\nlabel = 48915cebf2a2ef9e5d5b92cce033b60456d72af1ba54f88f5074a36a643a317800000000\nmsg = 0cf83d297f20f527983f3111716a68d0d33d97ee4f5d1822c9e5382398542bd532316db29d8a8f92bacae063aca1c1cd9bc272fec688b3f67956c662a5b2f895509fe6f2406f0674afb0f0472aa205a7d55a092a5ced1b1c1b92a7b93f9c695440a3257e007949d27098410454d4e39612c7dcabc85e19f3421734bb2717de00c041f569e8d43006005960af8f573e13867911989a4c678da8f15ca0278ebbb21742fe33b3613f22afca45ac09f815b50155ecab6eb07806bdfef37b5dd5\nresult = valid\nflags = Constructed\n\n# tcId = 35\n# em has a large hamming weight\nct = 0ed3b1f6a9b200147e535042353768280244b3c831215928a2b2103df02b3613f43ecfdecc6a8f61ce0183b8c60980f82c3dde3a731ea25a0ca9b89e5f68a7cd6cf6c6475f591f24b7a89a885a46edb0ade49e37665219a6da9afbbf655943912636af85e0bc859f43d3c48b4e77c9d1c0d641a21fecf4957185b805aeb908c6387c9d1c8ad85a166c075942f0cf68ca70f8174a9d2a4e5589c7005e2c423ff97c97a208da51d9adc0cb4588a257c0a1d0feb02eb050f9980309abd09258570ab2c8186cc357a9f693107c84855ff6ee7936b71980de42883e3ee7c1c6ddbe03d16a1f1c5bc5f987e6de9cab329ed7a31b59cac467d7b6432cb40f616ac9d4a8\nlabel = 02be339a2b399ffeaec99acfd80f50ebdfc8fe3021a9a432ddd4134b3466b4a800000000\nmsg = 2124d6fdfbbf77ac89f50a235b0af69edbdbe9ef3fcde36441d7022afdc8434431b893eba822cb82585384e36298df45b4b4415a3bdc494604305272f5e988f2cc14a56043421557d5e5dc958fd771e4d509126656d21222cb8e2e1052ba38286c5e3d0be0f4b1c978a61bd1e3652ccb63fea82ec46d6b64863c00b93a3243e2328f70f692aa65f73976335eec5b29a9542befa03d5e82aba9dc285af0913382d67aacd513bbf6f5095e4d5f9b5ebfb5ddc25cafd888addf9ffa068bd4eb\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen141 = 21160;
+static const size_t kLen157 = 21160;
 
-static const char *kData141[] = {
+static const char *kData157[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha384_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 5a3dc962dafca26cb3640e73bea7439a9f1874bc23e04226ccd89e7ba5c3b938a1a293b70dbab0f9f0f57f66951447dc33e730fd7e2c2a164d47ac502b07dd24cd3c142c2a79e4ceab5cfabff4478754b25a8c02c1a47d80d9f37abe442ca9a78b23f631b6ff3e15a4956d7f18590cdeb206d5e2b698bd084f260e82ef28ff9ec6dbc85a895ec8a3865750f501b96125db1bbdd99a4ae4688adb304aabdfc4e0cfb9fe6b6bc0db74c88af8217eed738a0d04fe8d32c1d110370ce1c1b2f630657350694942730878e6fff77ada7e9a317df8bc059ea7081325306b8eb2fa0d3a3d89fae476d9344892bcd5a42cf83b7bcf3e0e51b4c78e72b3207a60a701adb1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f0203010001028201005a3dc962dafca26cb3640e73bea7439a9f1874bc23e04226ccd89e7ba5c3b938a1a293b70dbab0f9f0f57f66951447dc33e730fd7e2c2a164d47ac502b07dd24cd3c142c2a79e4ceab5cfabff4478754b25a8c02c1a47d80d9f37abe442ca9a78b23f631b6ff3e15a4956d7f18590cdeb206d5e2b698bd084f260e82ef28ff9ec6dbc85a895ec8a3865750f501b96125db1bbdd99a4ae4688adb304aabdfc4e0cfb9fe6b6bc0db74c88af8217eed738a0d04fe8d32c1d110370ce1c1b2f630657350694942730878e6fff77ada7e9a317df8bc059ea7081325306b8eb2fa0d3a3d89fae476d9344892bcd5a42cf83b7bcf3e0e51b4c78e72b3207a60a701adb102818100ef885b87e25c29d1ee431d1f4ace787c4f882e92d12c4b2766c84f89263106ef0be0ddc4de3bf061a2ba46ffe7c132ae67d337f04dc66daeb9de553791f4989f50b224c981812b5388d1c2b5d53349a61393bf6611995b6988f143c278ccc260cfe82a6ac4a6409807eab32664b7ee3f1c41dfe567e097fd7afe8520871a1c5302818100dbca582288c81a30d6581f272050a5fea773d711301bdd6ecac7214e00c0fcb9498f1e585086b14463cc89a02c2e77a89271c058c6f69f3cd13553994d8a76cf62ad9e275217720d62eb6e888ec4509cea474b53f37b458fc956dd31df3bb6ec7de659e88e7e709fe3be6a8d37264c3d20e7d088276ce7651a403c68d6c47ea5028181009d7e87c851d28d80c5eb84f375494ab959c5cdf1a4ed3dc0fb78cbaafedc8f958fb6dbba3cf1263ddc3424c8d0461c9fc60e802255d1197f20210ae10debc88a4011d1d4587d68d2750c8ebce620e1d4fbdc52a5b6fea1b7435e7752200169f123e2a0393171aad90ba38b05bc859f76098b5abec8cd48c2572390bef175fe970281800eed602d00432edc30428de31763c2d257c71b4d348a3ff0bd5ee6d9285df30c167ddcdebca1593abed86e646d7bbe6eb97b7647d14380af1dba54722dfd0072b74df956cc5181527d6c65f66a53d4f1c34b9247225b35ef3d0a643d75ded55e9c725f9ad6caa995825f35575fee7ef10be2129c9ca8ddd2550515d53cf8dd6d028180101d1f49afb04d065bd8c29001d212e737bba696108574a330a9cbacc51bf6c96594f37fba9c8de156c226371d49902191e1f69d84a1352193bff29e318eb36ede6ffbab93b6555ecf6addca9e134c20220a2d24b03a6d23ef8c608a5186769f66fe2f6b21bc39f6277ad706038b907872c4716609c223762130ef03616482f2]\n[sha = SHA-384]\n\n# tcId = 1\nct = 8402dbdca0d3e9ce70cacfdfe3b2ef26ed92a6b8dc3c70640e06d0900213824a79d0cce6d0d781306eb236384d69f3ed9d921db8203e82a0cab04a51c12eb0a3fe668ab0ecfc419d3529f9970d45d9bac4373ec312b2a24f0c829aa0c0051e44a25e6da5bcccf9edc6f1d87f152b4770aedb8a36993d5768cd97c302abbcfe9360baacf437d68f59048280b560f5265e7f08769103468338bc9332568c20c7efbeddca8350662d64964ae5338138ce13c0cd0c9eb6f0b2516ef227bdbbe55d208f470ec5976116865f42897e63294d4fdbf36f6f4fc43dcb79d2c84d30c5f69ace97abe77a1d82d3fd815253d5b573dde8eb01f96416085538e94b8a0d95de57\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 858406b01fa56d4f216e36fe4fb2ba991130cd5ef56542ff60bc5ac95eccdaffc40bedb373babf08a79620f838d874e574935604cc15b2dc0220f84ece76b43d5239c3012f0cc6a446dece3616606e36026fb1544b26ffb2d0dcbb954eb812e96abdf245dfba3ea30aa5d5e7b81973f5c00a9e18a5337bdcf046c55d7e5a6028b093e6fe5e825807376a27134974bed314226cd65e17077d721cb52bb083e5e379d2cbe8594617908d9b90e0851203ce7d9dd8df667e86c3857c2bf9dbbac70f939d822c188de67c60f3bfaaed36ad4932c2e28bf9a5460bf51f2ad381e96391c4024643c19165e63db29de6232c7bbf951d04d6fd67df6d0dd08c4d164386d0\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = c5390503bcc08959ab92c92ec9e07a59cddd2ca4929bdaec89efde9c4da1011c1be7484eb76b649769f3d258219a2503464c284a1d3bf12af8e584c45b717db7bebe3255a1b8aff1f19bc2ae26672d2bb1cc3d05ca6f4af9bca6967f22593e54d7c42b10e19735d483862850b7f184fcd38a3f895cecce365b68f922083c4737c16d152d70aeee8edff5d3a3c0153b33529b8faa73bccc4e2342b23acc227064d09fa7b66583068d9ae9978c14f96998362dd9ed0f67290b8eb220557e257daef38f118873094b8733c6d72a1aad6e40601cbec847690842a38de4f85e04e9d0edb39834571adb0da4dd158f8e22a6678db45ac86ce797d8b86d4d6de844c0dd\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 5814d6f2f3b23545e005a4f72eb0ef659fc07a8374780f8eb9223dad417bff6c96a91c6071abd678a8c9cbf0b4735e4c225e984669224e88655dd4f05adf1cb1ae96f7dc7932a0b387158a915f7563085f44c72a41f331e0e17e6895e442f7492151397159637968b15888f851323107bfdc1cd419d6ade56b974aff865d5823daad3d0cd8b1a94ee1767b70fe477c64a5bfa593783aa90868d4456f098630eb32ae71ad4914c142c805a69d2fd0e93563feca567ed922514c0c8867332c053d4912cd17d238eb46245fbeb03439c6e6adc1cac06d1eb41d9a185057431b25d4600684e057e571dfd1a573dc60395e7c2e3d612f9f66472f4dff284f4cad4e6a\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 8472105e089af324cfcbad5eb2ce2f85185f2e2f5a9e5e302022eaae5e40b1507dfd4801ac5d4743b18b87d916b2bb55bba812735831296dfcdf4087ba4a4dbf852f0274c7e37dcf2682c3aac50a70b6d08835b0c59e90fe3ce2f3b6100863936a67af141236daf5f588f2eaa09c391f5728dac6a007a02dde61bc69c65d4885149a344046d66f1b91711eecf5196006fb916ec209e5bd251ccb97b08c31aa1ebb25b44028047ae4f61adaea5215e0324af6d0509da3a3843eed6ae53fed3a1e459c7aac4d94f8c85611354e0e24f7630a42b184805f67aa7ed0bfb57e6136c43261f81940338fb4aeb662d29301ff3a0a5a01aa20e53f4041c20f14207ebe96\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 3645e92f0c46b7d6f6765575fa9aabde09512564a2d2ac80aa8b43710f34c4aff72d2df02446cc548acf30e34994020ed7301bba6b69bb4e9abcc766e3c9284abf824ae8389fba58bd2633b01edc3ab648788d31bc7b404f6e079a650dd8224b0642fd589b3f84cc393d18bf8b3a1f65fbe6684f6a76b3e767d5f2953db53e61dbfd69371b69b7112284f256ff11beeded9f4deea47350c283d825387981c1d51d62ca032485a1a6f8582148e7b80d2c55daae467576ef45be6f00e676eb5a40da88c18573ff012267859030cc614135dca8694dc0a0ef0d00e62761999d93c3e8651a11fb43a028370b481ddaf6cd8c4a086aea2e658d44556a6eedd64da5d4\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 4dcaf6ae82481350b49b344e2ff3348d0064b63d4a686283cfe7ca8ded4d73c55c9cd3dfc6656e3fd18e45dc69dddcc82a33b46531f3b5b7682ef1fa0068ec42583a2021e7dae3908d924a6bac3bcaa123c88afcf1dc6e22ac6be966723223f5f7aa46e2205c6e6cc594cdc5cbf9315c641a84665d66408a7b4f38ba6672fe3c77c53ed13ff5ca5e3d78ab51fd19186802709a0f98d7de5efc10ec7aa4448c0e89d506168acda5c85a12badb8b4104c6b6d48ad4cfaa4e055484a8c4009bd579e89b81d7121d4bb40e94a31f35ccab0e71cf767158139e7b413912efc9716d8de8f088467cb77f8e0649aaed9ef9f48df64cddd9b75ca5f077a08468a768cdcb\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 8d31b6a86582c2b35e86fba1af4d02484ea81326f9728c22761cfe337b7d0adff787e2cd68c3b71f22cf9d0c141e273ba9c61cd6c6cb18050391279456c3c930cd6cb2df70b295e3c062c93d60d8884a2cff2839364086208f1be9007247233a04805151b46854f9da2b9a9e0803200afb3166db9907c9406b002013d5a566e4ce83b0572694bea9d3cbedc796fc4538f0315eb920bed4267b12b9127c683e83069e8baeaaa911c8f08d",
     "2457539c731c6a90c62768fcc7169088b98c13a291bc70bf6d10372494f072d017cab2f2ab8ed682b4514f576af2f81b90cdc13a266efea3f98fecb4a2ac1062aba39e47e8b3bc487156bf7f41cb7872e402d514df86\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = a78eefe103fdfad9987535d10be6543a0092d1b49aef20a8c40df71b6470b560c64d1cda67b47338a572d695b314d4ba50f836deb746cc5a862e50c76fac689736c7912d5324db072f029fba10c9cb879973473e66f4a617d6aca9405f2556d44bf1d6fc3ede6a60a52334cb09cb0637f8f247200fc0063a0e8cc34ef01a6657a41444a942a8c72248f9dc2d15a26e822e0ef73ea5d9ec03060f906790510d88f46c38def40397a2aff2b77540dee5963a0ea5049904235b5e74da536c7a3f353d9cec5c50a5bcbfa07b9476aabb8de297653680823265d7afd8815267a79953301d7040e08d5981c1bb8958ad5bb3bb420b02449a25e8fff1d216fdc1f3cc2c\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = bd682ddc5226f61206b2464973df9155f6c3474412943f51dd8c8e1fd00a31b6ee2cca899db0aba83a918bda521014808790a0455a32cc765c19f088a0e1773364e25745eaf015b185ce69c7886efc16b3d95fb1668038eb9ee812985f965e3bd9bb84b8da9f1bfa324d050af36d93bc793fe58d6762d927340136dfac3ba149bbc38b4d3e4177ab95fc6fd53acaa925180b88b71f607620243d45d3bad1e96297fdd339a5a25a37436320e549742a5b1266d0946e056916cce24e002f7ce5ae412046bd0c519efc417352bd6d0e95920712d11a7afe3190afdd3b5ce510c0df7ff16c2e80869f69a2cb735f34f9c260b472ed20c3e8e61b2c38f564dff60ff2\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 672d24c076429291e410245c34e35eda0356fb22076601d55bea1bf309a8734062f44ee6615df4fa0067d43e86cca0a823bc4089cd50517fb3b921585ba0d1fbdb131a24685c02cfb25ab56ade1de0f6e705519bd5ae7e4eb2cf2a63ba9537ca850008712825cb2a2873dc76715c9922fcfb3a3acca0a4f15abfaf49fc298b5788bc912266900cb82700404c502ed66c83b6a4e93830bf9ff8e547a6c623ee99927dca03447fa1af896d76e59ecf3ab73e0453fd0d768f5ea1f4c8252f6a01849f8098461147c8e137533a89807968520c1d18b2cf62677ecdbbad1f09615c6ecb4939c7cdc17a53dc46f8143c36e3ebc99a21ef9320e770867d90fa3f083f9b\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 17652dc5457163c0a622e1a52d149770af1b5399b75cc7797aec3238bf8d9a67061e1d735e67f76f4f6f697c5c4f5eaece14eee288609ba0433fb17d0f7c54c9f5593b0059aab6e8fa94235174fadf7e601ea9968257bd9d9ee85631e3b1ce0d7a66294bfa68dd265f921dc7806babc31d404c35e51f4ae61c4b7b9e4d44f8c8decc0bf99b4a4367b53e3a61f85683ddc9c0f7f1d2186727517d1f9cf206e1004b0f57a19cf978456d669d9ee1339ae3329ecbacf717f13c51387b1ba0ae81718eeaba3e6227301ba8ff149a1c6d286e1fb016919fa4c8c7b78acebacb47606713b58205d15baa11755e7646b20dab4646a02d374346ffc09f6beda72a7f6734\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 02776046b529db8ff90a316f91eee580346bc626a688c0978fe5d66c14aa9ad9fcd2a887f98b77c8f3037126d32382dbf6a8109f8c0120e964a7519fe5bb9d1f4bcb3cdf761a19587b4914cde8d43f6bf31ab3d71ffe29ed293ea2202e5d383075cce7f9b83e3366563c148c72648a0ade863be3613d715dc9649a442cd2544762f3d2f0c0faaf9384f3f5b021200a062ee74d8b809cd9d8bfbe989499d9872402a0a490b654c1f856526334dfb84e73ec37cd75f63151dbfdf78d5e062977ba707c504dca2509fabdc85480fa2bead84f14c1a7197e2f41a6940ab4768fdcd6c72439be6f25bc600e0fc882348b73582adc13c674080d9c921367226230665f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 3102a70e601b928a6b350337b6e424d3ce2850bbccc6de821d677f2c406686c24ef6f3dc6fc450f873a7dc4ccc8a16ecd1c35b9374ee480465b7b312149538fe2e1d3a2a8b017fc916d3316eac606bd65b9af6d6179fecbd8ac2ef0f6f59082612dcf24786b4688a6a8659a46e5a8f941ad7c11a2e2e7275b900f0b8b0f6ca4c21878d96e876b05b3b1bc8e0d5548d433ee56f37722258d988624f0cca3cb0976c31c395f06931da563c3f2e134e636d5c50b4f4c32eb3a596b360ba0dc5f7fa2beb8f8342787d9f9e55ec018556edb4ce0f9d26b0f410ac877073ca8d40eefa2a500bf4489bad4fc60c373c576ab0135a612e2711c6fe04a07566f4c17d021d\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 2393ef64f33218e38ac80c309344fe33a1deba9f63aab29e06529f5fe5736721abbb792e787f2df1ec8db8513869c1fc1f0a78648f5613f70e0b522cd5cd78c01e121d3e527a49c248861c47f7b108228a6c4481451e2ac834029a48403598105fe99b3f060296043fb609277fff1746325763a5fde8d65e6f43791abd7b113fd7a8281d2629caf7f7615876dbc702aee7f2f01829b506dc336e9ebbc6147d94d853ead79693c3c6f956a18ec825be43084e23a3e15d31a888a885152bd7cff34cf3de284805e8358c7ffdaeb56b2257e3c7c1fe8c2ced183ee27fdc99e4f74758cd68d1442e1dcd05b62ce431c26c0c76852750791375345eedf9c9848eb272\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 6115fe66f94af6dc4f2cc46e552710603c271eb211261f415bea922adb0dc26085fc650758b79403dd76e035031e5d7d177abb752f4b1feb0bc44e13cf4b17b9b95b553c3eeeff2278f827345fdf3308b8d534a1e4a07be9ebd60c96fa45a2a04d6c91292f13223950466e441550c8903677be93f0c40562d8c51f9d772b7e2f721624342d6ba28d29b628ce8cccdfa07e50cb379063861abdb0d6876433243bcebe75a3424322255b5cbb44f2dfefaa9a9383296ebc44c6552f87e703368fbb33cc83de4f9027c588ae3d9e567ba28bd8efc5a4b173accdd0d0793abae5d2fb933055553be82eedbb6711e2ad648b04098a17e82a2a0ef4c6745c15639b7c85\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 4054692a9438bb2156dff805a60dde5ef1812df0eb8f7b4eb2aef74951bc2ad44850b830f558407cf5bec5cac20a26ba54112871a24e138ea43e499a7ff60e612124d06e0cd88533dd7b64ea20277fdba3c2522bdac6f79d9884ca1f971f1db54698e4cd149cca7674210f3beb08e1ba5bd1647417b5eb25116b94b165b80bf69cfad68457cf79dd3bdab1ec01b757d5f1a0286d53d8340ad5d53b0531a94e91e1a7f0fc864d7db4f9f0cc9ee0f9a6eb03305d7ebec3fc997923e7ca879d6f458ddc4618d2d8b7baa058f25c6dc092d6360b7f2708a0f28ed44c722f39f1e42b6aba4e4df8e51545df6cba4ed7b4fe8d65a6c1ad09fffde83e962d728de73fa4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 14c56a1f064ef78ee6a263c6b551d355fbf6beb7bdf6769999b86182f836a63f1f53c629243ab3dad581e221e8b51cae706698970d205f4bfb3858d265d05e0d5c9ad973e0a30f8fa6b249d1271ae931132ddb7d0b5a665c4a4f178aaf036a25ffcd5225c6edec847f9ecf949a93dbdb30cdcda198c95353033d87b3cc16fcbdd928dd131f4874dd4b50a8a617d049b475308d649c84444cb44e8544077166636ae6b64c4600029243f0acca7182a32e5504d98fdd8ab9cc3136aa0601ee63ee4022ea40cc6525bfeaaf3afcf66b0087885badcbefcfa31a0262840f098800dbe26ba91138600978ee739054ebae9fd9ce8566aa2a24989688b4f3245c7be832\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 81ea170e37cf844e0e3569cd9a1c88fb35d894c820fa46ea6de145613e51a6444404b18313bb47fc27ce81b953416bf40d9c86062f50cb7d547f0cae0682408fb6d1ca311ad617435229c6c1cd118476a12cf1fc96130208abdffe50101cf07ad3a318a8312c6c23fe9545a21274a169b1d7d4dbf198a1a06197c4d77c91bbc6b8591f66a3673d1eae4fdb0839b5925868ab8cd41ef670bbfaa77d12a9347658a969b7d0e4f51a1efaeb3339c761b8087f865d580263306417a275aa2a69a5b7db581b09b636f2dde022a7f9d2b2d88d64c02bdc3ca912ae89f10a0db867e61e7946057162259f9105cc13ba8d5125bcb3c49ddced4ffa833414b5f21d1e8446\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 8d86dc4148c4cdb2fc0fa7a92f48a1efd33897a2306f002aa39ba338cd20c44bee1dfe7db050145d9deebacf296cfa651f5e2e0f1a2b9e09df5d11dd564e2895f64c359c590ce0f400dd774f67c2e1ee178c0e5127ec30a2154f74b4b75b7f3788e51bfc6a54397f28e88587ffea825efd6cd1e5b6aa1464cbd5ee1aad24cfb86446687e58a2e9604f05a40c237bb94300677cb65a70505581af2fe51e0d7d82a08629db0499fb1d360f1f1a9affbd75579b98d6d976ebe2e407da9121cfb3a8b88472fb868d82881be87cee4d23c58a27b3707f2771dda0800ff269968bf5393a5d8c83d5d4235cc1eaa8c9db342b2929ad0ed8638044915efcecc507f66350\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 3e970ded411dc9ed2a18ceadbbd9d5470209c1dfba22e7cc3287ddcf10ca0c28fec6cad62227a156a5ee2066a995ab28a121ca7599992abfb75dbe987a4c190b1c58af8b13b11ed247",
     "24ba41e4a484fb35a38941c6838e4045fa8a048ea3efb460b01fb2d11aabcedf4ff2db5e889145bb2d729c8456e51f29608eb5aa65a1908fb94beb6c2a89778a1f2389821f15f818865e38568eea9aeeba0366198379b13723c6c37745b7ff7e4f7164afa5394083592e7d102ffa72a5ae6b3da8d92b5977fdef3a6449696c9e5cd2024a9f795e81633c243db6e74e566cc68ec4043a89cf69e020ed10b6590082e1a2015369029aaa673a92f44d6e62604672559fd933\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 731eaff9f54ce72b0572eb6cf3d586b898dd9d96ba82202c77a63f1d98642920790e092ed5a38abff54b6d12d7985efde0ec8b6321a5b8183a80adf3c68972e90f0027654e2c585eeb99e5edd7a9b56b652acc0051b95507b3daedbc6b00203f50553f432e612afa74056d0fae7021159ed95477fdc5719627c77af1ef2b2ee3b8048da4ef6ddb1662e35aa560cac6cb0beaa7d811eab49939b6dcd3cdbd1f00beb875bb60fcdf2a006eded6f449bae338908a0fe181035f14e6fec4f162743438ae2d9bdcdcc49c7cd778e762458bf2669b35ed3d498ada6041342d12627f14cebbab2c55daf2b9e4e645641ce07961b39061f432b6ab787a175f8e68f2c98b\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 00005814d6f2f3b23545e005a4f72eb0ef659fc07a8374780f8eb9223dad417bff6c96a91c6071abd678a8c9cbf0b4735e4c225e984669224e88655dd4f05adf1cb1ae96f7dc7932a0b387158a915f7563085f44c72a41f331e0e17e6895e442f7492151397159637968b15888f851323107bfdc1cd419d6ade56b974aff865d5823daad3d0cd8b1a94ee1767b70fe477c64a5bfa593783aa90868d4456f098630eb32ae71ad4914c142c805a69d2fd0e93563feca567ed922514c0c8867332c053d4912cd17d238eb46245fbeb03439c6e6adc1cac06d1eb41d9a185057431b25d4600684e057e571dfd1a573dc60395e7c2e3d612f9f66472f4dff284f4cad4e6a\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 5814d6f2f3b23545e005a4f72eb0ef659fc07a8374780f8eb9223dad417bff6c96a91c6071abd678a8c9cbf0b4735e4c225e984669224e88655dd4f05adf1cb1ae96f7dc7932a0b387158a915f7563085f44c72a41f331e0e17e6895e442f7492151397159637968b15888f851323107bfdc1cd419d6ade56b974aff865d5823daad3d0cd8b1a94ee1767b70fe477c64a5bfa593783aa90868d4456f098630eb32ae71ad4914c142c805a69d2fd0e93563feca567ed922514c0c8867332c053d4912cd17d238eb46245fbeb03439c6e6adc1cac06d1eb41d9a185057431b25d4600684e057e571dfd1a573dc60395e7c2e3d612f9f66472f4dff284f4cad4e6a0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 14d6f2f3b23545e005a4f72eb0ef659fc07a8374780f8eb9223dad417bff6c96a91c6071abd678a8c9cbf0b4735e4c225e984669224e88655dd4f05adf1cb1ae96f7dc7932a0b387158a915f7563085f44c72a41f331e0e17e6895e442f7492151397159637968b15888f851323107bfdc1cd419d6ade56b974aff865d5823daad3d0cd8b1a94ee1767b70fe477c64a5bfa593783aa90868d4456f098630eb32ae71ad4914c142c805a69d2fd0e93563feca567ed922514c0c8867332c053d4912cd17d238eb46245fbeb03439c6e6adc1cac06d1eb41d9a185057431b25d4600684e057e571dfd1a573dc60395e7c2e3d612f9f66472f4dff284f4cad4e6a\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen142 = 24258;
+static const size_t kLen158 = 24258;
 
-static const char *kData142[] = {
+static const char *kData158[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha384_mgf1sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 5a3dc962dafca26cb3640e73bea7439a9f1874bc23e04226ccd89e7ba5c3b938a1a293b70dbab0f9f0f57f66951447dc33e730fd7e2c2a164d47ac502b07dd24cd3c142c2a79e4ceab5cfabff4478754b25a8c02c1a47d80d9f37abe442ca9a78b23f631b6ff3e15a4956d7f18590cdeb206d5e2b698bd084f260e82ef28ff9ec6dbc85a895ec8a3865750f501b96125db1bbdd99a4ae4688adb304aabdfc4e0cfb9fe6b6bc0db74c88af8217eed738a0d04fe8d32c1d110370ce1c1b2f630657350694942730878e6fff77ada7e9a317df8bc059ea7081325306b8eb2fa0d3a3d89fae476d9344892bcd5a42cf83b7bcf3e0e51b4c78e72b3207a60a701adb1]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-384]\n[n = 00cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f0203010001028201005a3dc962dafca26cb3640e73bea7439a9f1874bc23e04226ccd89e7ba5c3b938a1a293b70dbab0f9f0f57f66951447dc33e730fd7e2c2a164d47ac502b07dd24cd3c142c2a79e4ceab5cfabff4478754b25a8c02c1a47d80d9f37abe442ca9a78b23f631b6ff3e15a4956d7f18590cdeb206d5e2b698bd084f260e82ef28ff9ec6dbc85a895ec8a3865750f501b96125db1bbdd99a4ae4688adb304aabdfc4e0cfb9fe6b6bc0db74c88af8217eed738a0d04fe8d32c1d110370ce1c1b2f630657350694942730878e6fff77ada7e9a317df8bc059ea7081325306b8eb2fa0d3a3d89fae476d9344892bcd5a42cf83b7bcf3e0e51b4c78e72b3207a60a701adb102818100ef885b87e25c29d1ee431d1f4ace787c4f882e92d12c4b2766c84f89263106ef0be0ddc4de3bf061a2ba46ffe7c132ae67d337f04dc66daeb9de553791f4989f50b224c981812b5388d1c2b5d53349a61393bf6611995b6988f143c278ccc260cfe82a6ac4a6409807eab32664b7ee3f1c41dfe567e097fd7afe8520871a1c5302818100dbca582288c81a30d6581f272050a5fea773d711301bdd6ecac7214e00c0fcb9498f1e585086b14463cc89a02c2e77a89271c058c6f69f3cd13553994d8a76cf62ad9e275217720d62eb6e888ec4509cea474b53f37b458fc956dd31df3bb6ec7de659e88e7e709fe3be6a8d37264c3d20e7d088276ce7651a403c68d6c47ea5028181009d7e87c851d28d80c5eb84f375494ab959c5cdf1a4ed3dc0fb78cbaafedc8f958fb6dbba3cf1263ddc3424c8d0461c9fc60e802255d1197f20210ae10debc88a4011d1d4587d68d2750c8ebce620e1d4fbdc52a5b6fea1b7435e7752200169f123e2a0393171aad90ba38b05bc859f76098b5abec8cd48c2572390bef175fe970281800eed602d00432edc30428de31763c2d257c71b4d348a3ff0bd5ee6d9285df30c167ddcdebca1593abed86e646d7bbe6eb97b7647d14380af1dba54722dfd0072b74df956cc5181527d6c65f66a53d4f1c34b9247225b35ef3d0a643d75ded55e9c725f9ad6caa995825f35575fee7ef10be2129c9ca8ddd2550515d53cf8dd6d028180101d1f49afb04d065bd8c29001d212e737bba696108574a330a9cbacc51bf6c96594f37fba9c8de156c226371d49902191e1f69d84a1352193bff29e318eb36ede6ffbab93b6555ecf6addca9e134c20220a2d24b03a6d23ef8c608a5186769f66fe2f6b21bc39f6277ad706038b907872c4716609c223762130ef03616482f2]\n[sha = SHA-384]\n\n# tcId = 1\nct = bf20e0e04ddbf103a5133227fbc2696a0acc72f76f869240b06aee89c25128386d0e0c16927f98c1ff3b22b4fb61b508f383f7ea764396b2201e800c793c81a4d38e20b03ead703f0b164d7e7bf4708ce970c5907b139bdab8e2a1922989f97cc2cce656fe37630919626d966222c462af0e72ea36f3d81678bfd1928caf9111079edf93796d2713deee2b85cb04fa63d9fa41d212345507c90d04f4c6c80a114b36416cc55d78eb969d904269a69bf2e839075543955616071a45bc1678c64304ff5f4c22b207c27703f70061d1471b4704357c13dc44e1b3eed0842f578e3e84e28184f84ef6f80ac806c3ccc0afdeb17a74b42693f6e4b2a6c76161363f3d\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 0051190f85cf3bd0e9bdf5c937593d2219db50ba7d0512d38807b31eaa9310f0120320f7fad7c6b135f29cb17ffa5b135c0ebb1c4c8112a66912aa92bbb3191d5a284884f19460dfb9bf232f0db6c207ff21d53712e1c8d90bec036426cef56a017e6175bf8bf238c32050188869301ef78d3984762038bb72a982d5c9c9501820196d68c798ea29d0d60f7628625ffe975ee0757c6b70bf87b8219ddf9e6ad324ec9751fd3664887336bcaa7af71c93083dd96702e6089e2b67abb763193f95d4222b9177c17b4726998240ce74205f18cb4b17bbfc73185176ad761c1d48e633a4ac7adc2f61dc95798e530d20817b721311be824dfcf7629fbc533543280c\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 0a5067a97a17114be5a71697f15694d98cdd6e79dcba1726a38ca660ae4fd9a1336df2de79718cea176a365c46a24d0468c2a719cc1835e5b60aa64424a8dea0921fb641458c279c74a7ac74474126becc25c84cb8e411cc7a119c78298a2f45658c7590c3b40dbceb7c41c67e73d41b46ac55cbea541c64a91c521e377890cc031a4933a237609dce1d9f76684641417a44759662e166d837e77e9b8b3fd3343cad26de86db4f914ae83893fe9658654d0932b6a98ca5735669d667186d894b5d472a1efef4b2e06035189feaf960ca1242b620264e71c47307a8a38bbae9bc3d1bd5508ac37f1ba770bfc36a50a543ee204e5eff5310fe3bf430dc6908eb9e\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 767bcf450f416e428980a488bc8307674976253008d81340a2f519a1f4b936abf02028c2e7614f4aa31a8b3e17c96b4922340a6a9696fd4ff358c1a84c347b405033459f9192e9f7d611ca2da6a669a895d491a3c1908cb598730b596d66b1d4b7617f33766af385c333f037e7341c9680f9854f6ab4f2c986462d874f4dc66c6fa4f49fd3ef33d7c8cd81d7608411aa610e5e9101dbdba522f75cd12c575b42d082811227ba10319f6ea0c9a2eb6a3e63cfe0c1bab18f29091fc5d6372785208a830f732f8a0635f5ee7b0b9d2d62ff9f1a6cb88da253ad5f0d56e572548a350a7e12ff846d09ad5352fa45de484386b529e6f14a1e8055145394f8d4f91b80\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = c2a9b96b17314bfcc82d0653e14aaa7024b31451a842f7174a8a708dd80c94212af670806f96e7c08e2413198bc32d99a2e67d32c6fe772735ced16ae8b903d340b61585eb4b2ae7e0f51caafea691dabe31ddff90b114a13f05072fd8a8a9bc16fdcf32d199daa0de8ef34fd790f113505eab2b049c515a13a7d56f452f748ab76a07476d609f9e8db48d97f74f8e8bcdea62f495f573bfd2a171224bce7e2389811c01eec70ddffedd6bd2b7a3896a81a383e686dd80863f86a2290db0961ad1b2c6399a12fc725a33a182dfffd5ebc099612b9cd996a1c44037d2396ff657d22a50d94204e4428fe3d62b629c8319677654efb1bb0fceac9ae8d1eb3d2f07\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = c67d74acd68029ef1783f6412a2ff097bc4c588f4125dc9af871ff6cbc18caf2fdbd5f92235211bb460d7c32bad3d768a7893ad5b1e920ec9bde3cf9577f66a16d5a3e5a4feb40f0413ad47613929b44d40185cd4507515e73e9144a626c6e2461876789c8128eb6438879cc6b2a971dbcafa9e9f40b0120fa38f48023805011d89d48cb093bbafd221aca8b62311a6a2a29a92e13302c6da0f9190aceb9c36c970d731425ec079bbc6295aac01d9cce136f9e2d55e8516d007413f1d44bfaf63e257767dc0620a8902fb449f9d62a25630087b613784af81f1a588da7b0fc2ed2138e58eacc746cc2417b0088a1bc945552afb7536847baed72c16484ee7ddb\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = c1fb0843b4e3c77e622d1197ee897b8251971172ddd2a1bb94142173451d1748b468a450b15bc062adc94311fbd43a807391721bc05a4949b39af2ceafb1bbbe6e157237c6a7cb33fb971cef3c7bb172ca76f27e5a70b4ab501b8c4f695145da34f00a54deb47baf1f4722c313a1822b8746109c471f4fd8e6941cefe545804fad30e789e419aa32f16958fa667ed42912d6dfb5cc6d7635e2867253bfeb5ae946283f4fbc001fe8f578ca00c735f6cb02f65efaff2401f9da630ac2ed9ca7d44e4de8ae1ff6425560d54d75a934937021589418b91573b4eeb4f698383009c3074939d83c90d463a2c799c16e06c6467641d335b001ef89c9412f7478d5afb9\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = a59ed1881782b3a151254fd0102d0c78269ce015a542767763d786bbb88d7c764e6a2449f49bb8313430ed480ce6d65583502f647f439ffb578cba6267ddb492dc74ffab44cebbc11df44fa6e83899719c7432e509ae3a58717f452bdb531f01b70f9541cadb504b942f82b1032a5daa27179d83dc63e0f342d5f769fafc07506874704fab17d61cbda698a201fa42738fb21e9ef8828cfa0e0b4a5ee86e639d69642748cc764a4f",
     "a27fdb18c422f1257b9a7caaf2430e6a347bbaa170b77fc7f2aab7ad2673324c17acff7f67cc00525483c5a390c084eceb0ddea637f09cc1158638eedead7b38a14e9939c555cfb1881dae08479d838c1dc1af3b81348305\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 5490da684778d73666ab3cddb145bf50c914ed7fc5ccca7fa5aec07e45d925fd404e34c899b3620ee010cbdf02f190bf23f47c07f995142bfa0b1bdd988872671aa4ccaba8fcc668cf413a627bdf27f8b680f1b9d633cf3e2a3c0b83a9ebec591c9fd9f1a4bc997ad836bf5db9a8015c34bef11392ef8bfa4b278b9ba8f315e256908299812245dc534deacb9b97b7645162ab669721268177404799173f4f9a1e90abaf04cf78a1ea8a95e86c343553153562e3175ea135998e20cb51386e934ee28676e10a5a73b59fa1ca3b5c96ae43323883ab5a9a9214baa461046e3f600eaced75ccfb887fdb11d5d202347918cb42276370ef6fb42330d3922771e7b5\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = aaec366e45e9cbee804f4beab0c7d4a802731ae1e22d93e3dc0fa4868dd849c0cdfc52066051cf12887ccc09257301026be0e4ebe2d60dbec6de547d1dd4f778682fa9d88dccb0eab5e6cb07fe7c3a3664b5f31bd68cdbe9b88fec684b9e4a023f0e782e5e9a328628db6c3d94a1082bd0d3e453ce2628c1f17a767c017d725084dd0b7d715241b808b2537464dcc6eeb5af4c4c18702bcdc733c53f35d805f813e772ac32bcaffe025ef0fa8931849febf99c9e73cf5e4730a14924d9f074063b4d80faf3e8bce1930daa241ecee3b684d6674dc41b8ce53aa8c0002b0200fa393720ed967822eb2edd74a195423eba5dd6fe39150dcb697cc1f3553f84b9fe\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 348f6680d25d93e7f8f17f2410dd4bdc8a2ba5c9d29b17f3dc1e308d868ef3e1121982635c60fd386f77566370f5bc0d34e9596637c59b00a6eb665bf57071260483f72a5cf0bd6ad806a049aa670ffac206672fad6e206d9e13f82d89cd3675a888873cfdd1ea20feec04ac9e1d4daebc58ae9ebb84459a3481d268468f6e97bbad0011247576cdcea319b68b19ce7f2573cb3d711e078b9e206fea729e5b61d67f400a335aedb48f673af1a81c2998d80ba34ac18530ccef71838658e8937c127f5d5ce93a525a2ec60c98569d785592490fcf3c72d53791f8e81244292f1824264518bb827adf1205e6a2e1ca7d01195dd4c3616acb7580c0c9c572024a4f\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = a642bede4d119d37ba3c6f729ab8ef09055a41c5cc650a954bd0a2aa248172f3e332d3caf27f6652202287705d58b3ec31a5925083486c50c31ea5b27a693b2b93c6a4be3c5938a478148ed6600042970d71e2ae81e21a2f60ea683c4a11be85d2a00cd39edb6f05f8e93c2d760e68ba74a42dcecb6a890536c7bb093146a8161e8847b18ddf18e13eb04fcd841260016084b23efad5f36c3c5374a850b26f97e8076f9e288c9e904845c46df4fd8af41031dc6a9dc41c35c1ac73fb9586e308ecb8260d85d730ffe78bcc0439e4845bc9f6197956b2e4dfa4c5e6367b203c1a450a081e3edf6b50aa85303bbb547efbab5009fa80839d78a7d3c8514815a993\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 4d805a7ce650739a4e4f334de9e57fc134604c9e5198aab2bd2044b11afbc45741814b2c6b796411710445ad3f73b5a11d2066ab73d4ed636997c6542ec18e8af4f1ca0019865156cf9ee86315adb75db3640953d1f1268537d308256f712d0a3b3a4b2b88322056ae9c06458fc36eeed60359d091090a9a3d6c3646fcf54e0f98008a6440f5077ece467e10b9eeffc671309306eea60b912dcb872b48428450041f553412b0f7a370fc1f2ecfbe1711658de4991fedc33413f8faf69c3f8cf97e9003b2b039bff237681339875a85d2132bda1a029a2e79f0e37f90f50358216399b599d17e7760336fa447e6599cee60ca384f829df0fe49e6fddfce91a74f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 552edaec51577daf5a3a41f5122d8e14a0f210f4a691c22b624550d953c2e0c93fef2fb883d766a4996424377c384f41624c3d65728aa1a953e3283bba9ff5d020acc1f870e495c539f9857d32b42e9a7f821e2187e997c409ef85f0013c434918d7e085566607c2cf279d6d7a1f51ba51672d74491d1ad797461b555199ff3bcbd26f3d87781f09dee6cef446053685eeb60f0a81d57cf73b3d674cfff6060f53b0fa8f224e43ab4a88f0ce37d2ab9b4c257df77e7519f211dbaf6b9837992d9f6cd4e5fabba4ab0b405b49c8ef0cc172bc5889ac9beecef9abd48b46b134c3f0a8522cdfa0a07fd1c91788ac81c06b2cabd16117fe55d7892e4dba41188dc9\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 5de9c4fffaad1023d578673bda5f05d62dc73b5972b5addd16c453cb0d5aa9beb4cd7b51ef91a49f58c4eacba817b298b3f0d5053c37cfcc03770c0f84e77688bf35904033a4b002fab9065805e698f6f3082c4afd05d18e7b066a45a8c400a25d935455d3b575ee28da69e833163f8014f50cc3abda567b07f5b5fce34522f6825cfb6432ee17fb9ed6de30b7cd610960cf39f19844b09a61b00a957706227b2fa4e88081ca030a264dc1314bebc9a760dff72ded1f8d51706349db4cc95f0d7e6f331535075be4e95c12389759c26717cdd933157117a3b03f1c6f73826ab837a57405b0cdabb22e7f6ee468f46d93549067daaa6e735ef478fb2f6809b116\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = aea235313fd3bc3be95b1db39e4bf2ae67b8e70555d6dbb3de2c079c19fbb1dc4a9a6b4e8ce3d8dfc6d085b76a0559240bb90dab223dddf650da78301c255085982a7b8ecf11bc824586de0524cbcfea2a83ba11f619c8c87ae91d64aae92743b6e2719cc3d7a670a77614e086e4e3137cb1ca0c4867689b3c3aeccc5f31528801d1e22e864c031f58ced9d73f619bd5efa8f28f224587768c309e5086703ab9d6acacaaa1ee2681417b647c92db0640446840866b50de5d357da3ca259bd9e0b072bbc3ddba819a90ded0b4df6045ee3af3a0f013228fc454263f92a249eded9c73f7612f2f3303cc2b3463dd9c7a0fc2e474f899e9a27f83ea7fa5f11e0995\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = acb7bccf7e2cad69572f61c98565957f0e30931cc5980c4ee4540844e08d37066280b3d8d0f15090faeca12ab22b0a3f70b2d3b68ebc6d4b3f1998277d93256836a1f65879c8f48ea22b13b80fb0738cd44fb540507fb9f44577623a1af15384196afc9d5a6882c245938fc1b53c600fd0dd9f07a574e167041b53f414c7db6c252e875443b0006358382f5c83735e971337077249f7e9386ed0e915ceab283c0474308bba05e7410c91959648d1768d2e51e599d479a5578c6e7a0fc61fc8e18c017f4e2576087be8a8fdc7ada5b708bb07d6b0579c9baecab7e38794698c6d91390fef554c53b97561034db14b16dde648c9d5ffe61ef8debab95c57b22565\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = aa5b36de5f95c3c3b355a7968d39de17299bdb01870f07b3600714d5999dceee36451047e7eb1942bf25828a7368d219710ee27cbb8f58d9f64d9cc165865fbabdc52594a95049f21b65fbee38116a8032d37eb53dbe05b7ce5476e694cc0ea4ff981fb269d93cb634061c8355ef8e29d35ae3c251d24d894fbdbcd151da914a2a1c057a22afe8e13a596829cff32da6a8f7200cec826833bccb20bce20f96dd04066ea0728149dfd469ad2057ab3d6517c85d8817365258bec18a3fc67f314470b75f00c57cbbd04c51bd04971603acdbbdcdb36ff8b315baf4939d0b9ad5fa52093c8dcd701fe20fd67d8c3a1238f60141cb45e6b4ce0d504f03028091447c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = a79aaccb72907b41123e3efdb57be0c5ab48dc09ac22fddcda6bc497cbaa95b588ed3c70dc3e394e96e8c8cc07d1b49a6ad958a9cff9422be78aa2be641f38dc1609e076c41b79d874b8dfc0d601fcd065c4a24b9762170fdd20985a283f493d6772ac5b87f28ddc3fb67a941b7de48c6a8a8769b30d8e1cf020e649d11922d46933ffe809a68597744d9fc54ee47edcca190ab7d95f66067657703a61d53a0a6fa28113e1d4912f3ef0a8d2b5d0aadcf607f2f42a4ff52e2a9962d119fcf8d65c6474a91d62fc3e7fba867d06a07a03d2fa4969195879a692389134a5f414632de3dc6928744909452f7c6318ffd0df0ce3d9e10a8cae53d806b555a462178e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 07bd2fbe880a85da97962b4e806e3f380bba3dc80f631d9b4a9a64ab51179c5ea7f58789d8e5894b1fc7df15b34d09f5592fc600bf1edd118538a614ce3144165bf0578652686ce7df720c2660543d836746675a41cc929b198647c52ffb8b4afc74cba7de456d2298a1aa40c25247b4c1304f41bf4e137b98245ab8edea6f62077a8eadc6bc903722d0c7253b3d2b0acdc1f961157f14404dbdf50f294fd7fed64fab3a0c3cf46e683f41b89c0db6112395ff8af6348924823a43855a0cceb4bb00bb2564e40de0db8ccd803af1c4ce7873aa2fa156d09a4274b47c5888553cd09c32456da49411061e900188225eb181cf57cd8bbadf055f9f4df6f6389acd\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 79cb7928bcca16d8b74a0900d8de2b4e7f962e6073d74f3dff11c5a7d3e407ca962fd7eae0d3dc1ede81ea7cd4059fd1e304bf297cf30207b0abc8aa31189403d52a38811b6f11",
     "bfb930c15ec7b0e2e903623ae1d81083a5e0a7331c620d3d5b289adcbb74246d9c59336d165c0176e3c1b922d381ae8da731a933279fef6d185a689e039970135ac3c4d1d87d858e65f409341c593dd199e2dc60c16033023ad2665615877b41348721fdf3569bd03aff206a00a9705c25b3e33ff3b700ced05a6e72f3c5581eb3090c1c238ff5fcb26a286bd4c231f4eba81c5daee3c3c2dc9ac3cf2e73bcc15eef091cef335b8b89963a0d5983e1754e423d3b70c039b2c7\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = c295f57de51d491eff362ae8459c8be0224f27393a6d135bc8656b4f4a801f50e1c4c48b9eb52dda12c397416a89f709813fc500804e0cb458ce64d7c2c96f3f1f89ce70eb79b1f3c2efbdc46e1bf5dc8deeec5a34ab252568aaf8b6d832f677c04aac913901cd37c6914fc3517e53de1d75060c6c2d766625b5b8163ba556414cd114f45403f73d2676b7fcf9208d4f299d492f146f3e3da32ebfbde77a4f91574abe2195af5ba3b91bc4fe441e15e01da0fcd6d9e374aac38e622697b9385edb493bba4a486d35e8700c5009ec9cb82cac71a88c854edc6f1ceef96e759c64b08350f8073fff929468ef5aa83a86bffd9750dc43ea99927e93b4b3f84819c8\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 0000767bcf450f416e428980a488bc8307674976253008d81340a2f519a1f4b936abf02028c2e7614f4aa31a8b3e17c96b4922340a6a9696fd4ff358c1a84c347b405033459f9192e9f7d611ca2da6a669a895d491a3c1908cb598730b596d66b1d4b7617f33766af385c333f037e7341c9680f9854f6ab4f2c986462d874f4dc66c6fa4f49fd3ef33d7c8cd81d7608411aa610e5e9101dbdba522f75cd12c575b42d082811227ba10319f6ea0c9a2eb6a3e63cfe0c1bab18f29091fc5d6372785208a830f732f8a0635f5ee7b0b9d2d62ff9f1a6cb88da253ad5f0d56e572548a350a7e12ff846d09ad5352fa45de484386b529e6f14a1e8055145394f8d4f91b80\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 767bcf450f416e428980a488bc8307674976253008d81340a2f519a1f4b936abf02028c2e7614f4aa31a8b3e17c96b4922340a6a9696fd4ff358c1a84c347b405033459f9192e9f7d611ca2da6a669a895d491a3c1908cb598730b596d66b1d4b7617f33766af385c333f037e7341c9680f9854f6ab4f2c986462d874f4dc66c6fa4f49fd3ef33d7c8cd81d7608411aa610e5e9101dbdba522f75cd12c575b42d082811227ba10319f6ea0c9a2eb6a3e63cfe0c1bab18f29091fc5d6372785208a830f732f8a0635f5ee7b0b9d2d62ff9f1a6cb88da253ad5f0d56e572548a350a7e12ff846d09ad5352fa45de484386b529e6f14a1e8055145394f8d4f91b800000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 7bcf450f416e428980a488bc8307674976253008d81340a2f519a1f4b936abf02028c2e7614f4aa31a8b3e17c96b4922340a6a9696fd4ff358c1a84c347b405033459f9192e9f7d611ca2da6a669a895d491a3c1908cb598730b596d66b1d4b7617f33766af385c333f037e7341c9680f9854f6ab4f2c986462d874f4dc66c6fa4f49fd3ef33d7c8cd81d7608411aa610e5e9101dbdba522f75cd12c575b42d082811227ba10319f6ea0c9a2eb6a3e63cfe0c1bab18f29091fc5d6372785208a830f732f8a0635f5ee7b0b9d2d62ff9f1a6cb88da253ad5f0d56e572548a350a7e12ff846d09ad5352fa45de484386b529e6f14a1e8055145394f8d4f91b80\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# em has low hamming weight\nct = cd72b9c7697a399323bb3df69256ef3d7896c4b7c35a4932d56321e2bce7d590399041672d8a7694ba945d065469d9f527416cc771d6bec69db4d3653ab84ef6a1e1ab13cfcd5a23b49fe970f218016bcc674a655a10426cac75580065df467e2b3ca95e4a92f0c58b5fd9e6606cc44496a42207da4b5bc46ea6d389c35b3095db2c7ed756182408ac5c99aeeaa7098b1f4a91c5b6ade587633d66c9bc3357b11f3ecf019b1c53858d451d9f00a23318338255d48921971e86adb89a5c5742c6d7da82c7b9eb71679d2dc54911d9a427246be058f54ff269108c47a4bd568c3953a9365f641588f95c3c51311b3fe2f7c4e9b94f8db3410e738157d57e559898\nlabel = 027f3eb14d2f370b118a0b95acb6ce9849b6394de05269f339cbc505fc1b45f3f6a25b824cf997a6406ab2f496e145bf00000000\nmsg = c8556ddde4086f39f881c459e790ab6d3e6ac862be3b0f7ccdb6b1859eb160793cc16538744dd2d7b8f5d0a431b2e7fb21dc47977b40cd1381fcc5f3e8577331c14584ab3e5ed92a979a5bebe4b48c21a8b4f71d6a496d526907f7b6e5791328aefb2591e7994564c996826798bf62fa86d4b1e2f57e5df1fab316a928a007174698d32d15cc5a7e15acf53c31b30dfc18aab2aa9ddb0edabe65e153edb6\nresult = valid\nflags = Constructed\n\n# tcId = 31\n# em has low hamming weight\nct = 4112dc2f415f5ca05e1a9372660096836f4e47649ef22f31f3d2b2765cccedf922bbd9417f3863ee6be8f99a748f6b2d8bc0b286abd20849548b0173e385fa906d2e6d50ac3c8beecbea78d90aa7c630f4cd126b84e34b6acba9dd545a8673c4e00de4f6bca436f626bd7b8c1ff3c7cb3da7176ec11a0fd596078905a57e91387ce470f73c239227b6a9906c3aa8ccc214f323ca467a359fd0d1ae6c3a560d0f1285589b3e8b2e2acbc3ca606fe23298739cc194d97448a57206595189bbc9ac039aecbb77a3874aeed61ddf8fe718a873560c52f7cfa22d054d370aff20a48fc31850a19d7c4173d120a4fb108051bc68b8ebd40da335f620cce53cd07ea9dc\nlabel = d14bd61a246e92ee2be39c6066d25d2b2bb3bc95cfb16ca34700048ecdcfe85685d5aab6bf71d5d83bd6faccb81d1c0b00000000\nmsg = 5a1eba083b903ae2ef8bcc91ee0ce44249903d72e0dfecdb2e44e196f7b1febe5090b58e40b6e70004cf163b9a59bc02908aaa3eb52063d0b9ae6817a7eae8533a13437c0eafe1b5c359b5dfbc8821e213c41befd4b4548dd3e37f01d6b461d12cc4031d50c933514f004dce0e62a4e970b6a7b3bf06819dcb2a33351d7e8c0d130b0bbf3a67e2b75fb0059fb6ea8364678e90f86f9ebf2e9e4c5299d389\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em has a large hamming weight\nct = 204f1dfe1caf7952af8d4745071f4176edab7c4670db83502a450f6b52a6d90aef179eb4869b371d6a3ee2f0225494bdade6bd38b04a8ccbb00493e7c4b60c0c5be671808ca91f93aea17496b47cf9c6ca83e5f6cbdc41860b840f2c7bd19c2236aa1caf92f7b7f151305abb173d1ccbc97a3dabf50c24ae5d5bb719595cc2d1bea29185c55d7e1e873ff504b8e3008ec3bd8c702e792b6f6b7b24daf71b12168fb5cd586ac9313bce2fda37cfd0d68e401444920ea125fd9e7c8f424f4c5e0a068e7b95948289d71472b75d429021acf73249651deb09cee062de574e5ec18102852d1946050c84b3da9e63756f964cba0e4c68e8c8ef2cbbf6cd325a11853b\nlabel = d13595cf0b4193b80f34d3ed3f8a4cc3a3ff5d42f6a21d7f1493e744c3bb5819c53a9f16c9ec3b62dece167bd674a2f800000000\nmsg = 068a7d6662c9e1f96cb4c32cde0ba6da2aaf25501dc5f3b0cff0c74b6adc1cacf81c5b546505f360a4edc91f7f54cdac99458bdb01a5eee04947e2c725044da507c560a8b9856a5374fd75c02e6b8d1f915e291c6d8352eb89cef2f9297cc4d9b8ca118d1ebfac47aa64992a7e077e4ba35ca181eb3f0bda0330720f3f702a33878d3035e15e6376d528fadeaf29db79f4b6943417bc741c2a2f1d1eb598\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen143 = 21094;
+static const size_t kLen159 = 21094;
 
-static const char *kData143[] = {
+static const char *kData159[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha512_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 0a5c2790a591c3ecf4f6281c17e1038845e540a95f21294a7ceecd75b18c54c50c02e789311c1b0091526f87ab3cc8d48188e980ce0e0377bec00e9f7d9793583cb66a1f281e31d20b594b5c66a2d9efcc36d979a92bb877a9678f991ff60b77e28fac55d64f21c064552a4319eb0a9a1870a76ade3c3a3534ab8353c3e57b2708363859ad3a6337fc15ffb90980d93743f972d743c3dc6fddb44279079a809abec8113a6f987f71748c036a4daf353b27a81e6983d56a2d65b71b93128d5569499d10ad1396f094eed77c044e3ce9ef82f0014c25ba693928c00b5043b641b016e3569b4bd84d683372538671307321c25e590f14bef241e6d8edf24ff39859]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749]\n[privateKeyPkcs8 = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001028201000a5c2790a591c3ecf4f6281c17e1038845e540a95f21294a7ceecd75b18c54c50c02e789311c1b0091526f87ab3cc8d48188e980ce0e0377bec00e9f7d9793583cb66a1f281e31d20b594b5c66a2d9efcc36d979a92bb877a9678f991ff60b77e28fac55d64f21c064552a4319eb0a9a1870a76ade3c3a3534ab8353c3e57b2708363859ad3a6337fc15ffb90980d93743f972d743c3dc6fddb44279079a809abec8113a6f987f71748c036a4daf353b27a81e6983d56a2d65b71b93128d5569499d10ad1396f094eed77c044e3ce9ef82f0014c25ba693928c00b5043b641b016e3569b4bd84d683372538671307321c25e590f14bef241e6d8edf24ff3985902818100e74a124759a174de33185996b3b437c24ed248203d674a87bcc2e76a667be3f54ac15e8f04e4c5e540f4e19f402a71d37d39756dcefbfaefb380095b6cfbdf4d78dd20cf085a1f127610e3b7102ca6bde1825941ab602e9b72c08e4533ac50317138e10bf7edfea30f52ee91ea6628c2cc65e76bafc02eb9d21ab66ad374ef2702818100d793b4f5514921bfbc47a1e45faa043eea03f052bce600ec4f5c62b014a7c45aeb3f4bc02160e7b12dee135e44b227a31854ca833ac706d14670ab5932a269c9b6f9188acb93e698b4a7dff65bb9c963c2e02b2cea3f2d5cb254e07b616792896e37550cb38171c4c32e0a6543bbe6acd4e99abeaba1340a961017412b57bc0f0281804dd402049a679730f2169e86f49f8f27c6684236ff1293e4cb22f6c63a083474251c9e9a17b677d5261f81109a81eddd91c4d4fc076b894c41a5b3005dd2ff984d3473c6d6f3a4830cd1b01eb8c59db245811c51d9be3ad0ba338b6c43f016e81c465c8c2f789977fb3f17e267f2ca828a4f3c29637193079a68bcbb83be547f028180767a352fc5d6bd7794d08186f3948af4d0c40d664b6ed4ff0ab6a97e403bdbcc6411cb5df27a419bbcb4656c9fb091dc2ed91adb78883d94f273a598461dc0aa1da754f7a2decc130ce65e4e15274c2949c6cdb3c7a1a51a96dfd2e7bc26a20069d47b2799d80060b52c2e866ced6ddf7abc50518e1df06e08ff1ae8b41b69bd0281805479dda30fc06b63cb5f77e20bb29db7eec7a6b37a5007f9651a46ffb66c90160be5700145c6a08d9737a98c5f7ba0dcef39352cc5d8612d94fd02383b8e093115376b154fa1cebdf915ddc051a7017d67a238fb4376749ced94712b117a1d0ca31cd653a1955dd547346d03b21eb0ad3c123fb85e92c8af50a985db10eba79b]\n[sha = SHA-512]\n\n# tcId = 1\nct = 409225dd2229d11accb99804e4da69fbcb862d3a74a1dceb8f1186d8d13b1569aa4fce51aff273aceb1f0c875d87a979f9915fd400a2eb1713b5a1ed129e6b0c7ca14a61a0939a87ae88c53e91ffdd635f7ddde6185dfe9b5b7bd739b53c4c198dc8333a36461c4d750773df1c84f024e18dc78d09fbbcdc4d12bb29854b2ae04c1b8b141eba753eed9cd90a5b66fea37612aca4c55f65a8381c4eff13c37ae1f9ed0688514788babc8ee27f8e76296495df254145331a49d11e7bee5a83a3713d4bbd5a805fdd8e84ba6ab869002b26e40b36d1d6c1189b8ca1c6fe19497a8059414abdc88ca71252fa86705ec96a7899296925f885fe55c9c6d2cbe7ca8578\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 7ab35168dc51cb7b3d8e5e3f9568e588c27dc395e825f909f3ef2a88c5ef8e1ee4918dcce7aa0c3ab6860f69de90e36d19284a15954a3bce2c95bb52b1a5cc752e35a7e08fc327f2a95ba05c474c4a5e625b5c0b780b3bed961e69bdfe073bc324a8dfeb3782413109fce1d795ef01a8eb0608ea42866ca997b8cd3c7b849190e42e84c3d60f935886df8d3dff5cca4157152e9ec9f954a7ea7b1ec4b0e1fbc14cef0f3ed16f1b013cef8753e1f5493ef7d0f753ed0a18ae5275459d15b86da95445dd65580a789354616e9a8a56720394a22ff30a01f38b173259a9829b8a4d14747326597ec332e1d402915c7f46a96c20bcd25a82ca3084660b4171cc31a3\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 930b4f613da112cd29f8fbb235ce0715eef85bd5a34fdf3a67b4af55015269ce99ac8112ee81b576b31f083160c5890dc2db204d581aba976974056a8bad367ff05984974c10f71f5b03482c7f7dd86aeabf5c9060b54b0487f40d30627e0a46fd7e801e5f1b2b813c4385f870258bc2cc186599e124b9ebca2a29a43dbc06bbd39faf7f305a902e7ffa403abc3bcedf29ee11361ba0a0b34f3bf9a9285660f66b4b75cf75e0eed8f463e204d93654a9c85b9788bf8e32890b658ea732efe3a56a4ddd2e7a426fec6486a0f591a8a1d4f089eb9c95a6332e7e0db103dc3daf8cebf35554d18cb6da33dfe6dfbe0c8cf04a4f6305693e94e87f68539f67892976\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 91d3f1fd66163ef8a8fe02f98802219f370938f21baaab871d6ed20de4449d5c615f395f89b5e455d301088285cf7ac42b51eeacc1c7d4220cf4c456178b9a2d6ba93b0b1c334b6aa6f19cb75f374d88d9d284feda4eea32c5a4d9baa0e12fec0f72308322eeeac9b0769f161491ddbea08983ea565058d98838b86df181088dc9048091450bedf4a671fe0a57f9d4ed67cc41ca6eb6a8324ce14d6202de07d55e80d56660ccc358b1cf6ed56061a2efdde8075553c326e9a15d441432c52c7209a6ea6cb6ae8fb1fb128d8aa31cea24e5648baa087eff8376bc01b6084e0476d3d5c5533d9c2c36803e939b8f525c2ed770ba08e221cb946d21d611c0fcfc15\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 41c04aefc703aaa71f40ce9f4f56a7719126ca192d2e9c33dfc6a8c176e8c1c22d9d7a83f39955403a7798d161e4ad17b1575c35cd8f2abab639307222395348b67ae8b7edc41eb0b9a38ac508f1c08489ebc21e5db909d98d69a74b210de76a924787b2fe1913c96ea934ef88be13969cb26fbbf007fff7f639760ca7de9041ddfe79b3be7710cbbf559db44d2db8aa32f88be33463b366924b845d07e2c00bf07fb3625a600b4f84041c73d777c0822bd896aee8b08c4f6e30dd4569208fc8caec74580a43acaf7fcb2b6daad569f4a58e281298caf9b6f155cf30e94ff671de9bb0cbabd184b854ef1d2b7cae33e7dc6072230ebe4bcd4d49253aef563e92\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 32af08d0e192b87a392e69c0e4f1faf525f9705af04301bcf4773caada60baf8c9e3ef5b23f22e38f9966849f55e075aab69f1bb76d2c9e443f34dcc1a9ed8d32a7ed3f9ecfc05cb154235e2e532af1b6f1fcc392676a500b5539f6a86be792de013a4d614129852ab57e030521e1a776d17a9c54061b7457e0517f260826640d24e604a08849f9c14a8b9b6126a394d1451649326b15a440f52da5fa917b15189a73f0ca93c6f1ca65a8b00f96516b9f87519e6ac96af33df112eb8cc669117821d7f318eb7f09ae74fe283ff4ded8a2e6b363543833a311c2b7be7b6f07798ba355a716707b06c4d50792c888424a5a049b1b0a33c881059dc8178119676a2\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 602a88779ae26e4aea37700b4ed513abed889d15de24523aebf34c9027fbd62747fadbdf46449ab8cf1bf5f2c4c942423e0c22df00e2b513aaa7a9502ee330be441274a09ac0b872150d73e52f34763879c56d09c400521aff0c7a8ddbbae280289113bd4f5cb1780eb16040974f41b6ec4e0b060209e7743df321a597a8a0fe00df285780073a03600c16ef62496e7e06335b7311d16a8cd376784f27289d02aadd1be5390e6e618cf8271dbd9ca7f8338392076ca53fee750f30c95aebfb26c8cee568a2253f2075eff7941b455317728bb1ad0442d691167f6472883b6e8b07e7f6c5bf10e4def8f271e622dabe23d6d3e8c0a1e277781e5888237e83bffd\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 738a92656e1e759bbf4515a13598efa7c7c3b3759ca87ee1974e7ff8f379953b7cb107fd421225d4c92c59e459e33290e6b73f8896f5f064be8de43c67c68bf6da3c7e4639268e5f204a7a9832fc1b1b5c4756c2e5b49c0912bb0dbdc049949090344301c42619143eb8024cd633a5a8429c9c717431f9dae72ce8f848ced228b72562517006f5ca77ef356af98f1d2828a59dc75fffb52437ef822a151bc696917a4cd0e688beaa6ca9e7",
     "ff15007c5ca12ff4da95e5780b8f7288fe9812df205a1a25baed9359ac87511bc8d4f0287de59940f0cd45e2f8ceb7ccb12b763b243adcec6da3d3def4e7856df4e4a4cd75fa03e14d5a63a5808bcad798ee2d2c8d\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 57c821093f340232c5df14fe7f6561c063d64e5660a353e6741774842e0fa0b4cd637ece4e935f7d948fa875b5978886b868195f5598a86e83f8d25bfaf445bf453c0a7ba4088e38eb6fb123788ad1dba2a3098e33cc7f354bd9622795720d3f3148db484fb982d5b0855e58ef8d74d12fe93e891f8987cf47d74024d1a2824b3d6a955670552d00055ec3bb0f6b4cfb87202cd66c36d831a62471c59c7d2ccd4302865496904bfce0a41ac3db7ac152fdfcec6bd984c9f63bda06d4b467ef1748f3a0c7f1e5a8ee5efd56aaae8981fb15329c44ba92d15edd20c982e555096b93921b081e68bd1e36b1dbe36fb3bdb69bddc8e9d9f6f1ca317ba16f664034a2\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 3d7787e441ea11708527a37464a529449650265f04b55294a71f3452586f55c1304fac48a46faa7082cf1b5d1d728fe337056551486d892eec1403550dd851ed6997e41f70acf7f401d1ac92c5e416e73f1f1a024e542ee279484db770c9a6c91c14d487bff37960db7a11064dcbbe07272cc036a1e0946d71f1fe97dcbdcab911b14d6e4dab44a07d8cd5bc3c0f008d9929f2d60b4c6ead2e84dcb86002adba056b3559fe40afd027cb05d41ea7f967e2cb4345c14ee37c25aef415ec932776de1ab992458203eb58a5eb1a21c3a619bf06aa0d6d74b5ea6decb25602139733c01e131c64b7de3465db2716940d00ecb5db6ba7c541543da53ba6119e7c117b\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 76a390230603a834305783f493b721b4f317f3d4b6e1bc26d1983ff1f49448babbeba061e94ef6b483579564496ea89f9e2e784e8e8db83cd0d2a6081048e4bece721197e66a54178acc6976089a4f6f268f8a54a2a9a3e90f583171401173f7f646d8cb422e4ee14fe057686b0072281e066a28cc0133c6b707781b718f535fa3a9c99a65360540d3182672acb1db4689c5d6d33159f37aa7e16d988d49f73b5e603f8116e1b5053ca45e6c04743cae29faa04ed939196b15faae2fe4303d7feab202d8809a7a2ad30deeec880990334f0da9c7faaebc1f7f64f0c8c20270c44b7046ee309d4bee151a504bdae896e856e202c8c5d8dc5d6f66c99961b6168b\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 60a639b945483083eb99c1c158f2cfd68ba8da37615b6f14f4a999b75da7fada3fb5b0716168f5342063306d8845ab565be176f457b6d26f2df5195356af72be2eab1185240d2b27d023141c060c37e46fc139d5df47667adb1e2acc5bf0b9d3adb7de087eafde53a157669b5e07507432fb366f4336f0231a04a3ff916ebc5f3a679239b39f952efe24aa5f053dcea10010986495bd2e1b6cad627f6c788b4adc6ebe482df63c13fca3b0371096ed74c079d8fa8fc3ab748b2e1935209a8934d4d4cd3baad94a6bf5be7c8517dfd55f76c25929cf3c14b64fed9c35101e3bbaa8c71ee816098741007496f20161aac16f1b4bc54b6a004d1e63beafc7bbd1f2\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = aece8a87a0c25ac33fe3225e262e5d2676ca68fe153b84c26b65e86f4dce6585f801e0b1d748ae6f3bcfcba4c5b95ab78f614499b547118d1eed2f6ede6e4a5966ae86c697577ce3d4f02cafacb76e2d90dc18222eadea2668717600e5eee93f3a20d583955ebdf9a66d5f957e42222a90f9de7232ef1d8eedbf884efe5e4fc0cca53fe4d7f60275c816f4f725b2d7539ce38ad3e643b7e4b4432842288e03734ae9dcb3d26f5e76ae227e7050ea7e0e5e2a755fd481a57d65cbc036aa9cb4062b5cee0d07e9dbae45b9a113575be96e9add1570ddf6b4849917e04bd9636f173cd5f79d3d05b1a0344cc62dbb523dd29c8cb770839525b9e6f7bbaf17385e2a\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = b05ad1bc0a5c6437aac33f123c62b94db24eb98d88808ebb1617b2866cc851c3818dd9c18e68c01416b1d593cabac1c364f89b1817bc58d021d9806f27d4ab4ec812d2a964dd70295ce9524cbc92b754e4057b2974b3648fec4a61c23548c7919ad4b97bc05639e6f727df472486c9f50265e227d648c56c13eb1ff4e5d743cd0a522f5b01f8efea61b934ed1f04fa0effc0b7a5a48b2662826ce72abaa3746e1718e73d06e3fa973f3117a45b578d759f89196b708e8685a314b8dc9387b4e82dbbad897708eaf10c285b9471468e2e464e57705e894018d2a02ea2059ccc7c7a921687ed9e358af5bc13c1d06d42afc5cec33e3497ad3c20b620f80eeee56e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 96a6cd6656b99ec45dae887958148f6748cf84dba950d7351033e98aae440c6f3603ed65bec311a55c6ec2bbc892442cb12730957b797ea8e3010efb8599891a3e8d209ea0eb6b32448e57f4003d2ac3dcf8c29a44454d0be799a5a772344282737e42f785ee3abd3ef80d5d4653931828d5f064354aee256b6271817e3807e15c805afae2877c8531cdccd2f8d66f3cd66d3866b5565d99154f1eb5a4f032596244dff79593980d07e6e06de0960c1df2c3f84de224c113494ade9d03f554871a0ef5c287fd0af2babd16fbf2983c758c792b489156e3a0db060a64d717e0d149c343c40015ccaff45bd4e3b155b9c4563d5b8c3d5caa97d7d46d4c5a2d2077\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 031efe798531e2ce640d492b623c630190a8da56e0fa3e2981680b20f14db024abb3bbfa08bdda51aa9d2fec81d23401a007326aa5849b24b099ce957c7e2b8352f97210a1e7ff68398aa3884a027f53f27e3c4ff65ee81af6afd4bc539e2f93282ed2a2274093305516b9800c547e4a8933db99b802b0ed67503fa58bd1ec8f086f1d646fb4fb3e468c75835efad1a17c5c1c7963cd74efc0c15d979a686ffc72f65b164dbfeb29930925ee5b2bd506378fefc797d96bcb1b55dbd4c58f0dd683c51c6d11c9427b4b452dcd7cc4344f21ba88dab082fa699acce7f0cb3e677d2d8ae803e0f1bafb0d2bc54d4ef88ddb91630fa6aa141b854b475ac190b696d7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = bc296554a73f000dc5b04a4dd96d91a82792cca120e52c7b9328a5b7518f4b8044e3bcebe8430badc933a8513641d68127d93a9137a96c81c67c4ad59048067990d14a208fd6b0d44d068c6bba72b28368c5781298d7be36cd3d462fdcf4f3c09fc0bedf8341b23f6722db3f0c96d7013603cbc35394ddb1f9edb8ac550c25d4ca6fe0062cb75ff3aced20040dbf752783a970783e78ac9f1c572c85973b254434cb7ceab15aeaa965878d1bc4be560838b821c35c218c06c5f6d690b86bd387e6511294cf9723d38226d95e3ad5d36ceae48889b7428d1f4188206cbe7673cfa2c28f51c4e451c5e2ad92c988038048c6c03b372f04eb2463512f5e85867504\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 6b36862a424ede6c744f0949dd9a3091d850ee1694deca2f844d864698eac29b2f1125ab310608067c37943bd386732b903e258865e0ae33eb38a8c35a84b3864b717ba29aecd5d5ef53f0def257b2951ee14bc95070356a9e9bf2f36232966c501710d08281c9b5944c5c923d65376f0cf592d3750603a758c16d30b9c307e32543a311bff7d47938f31f3547cc0ffc71441a1391f303970d975001d2df0033170cc00f26ae118bacb31707fde93c24abbbb8304b558c1bd52e9e6dabae23b789fb799f4f8667f6b7b724321d455ff4f391e8f1989f271204aa81ebb9491241871472ca1ebc38a05b93d557c4000e2cef7c5c9c0a85f8a63049170c90b2d901\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 8cd7fcfdeb18140c470d230b89444a63763c1025f69409757be574bf71fe7d899467cfe1a65d23d2401b7209e86be5a47753ad295c7203d2c935bd9de14556486908a7bf83dd9aee74b6e57204f9eb04cca15e2d50b22c5f45c7f362f23ed948195392a15b96a238b4e03daae8b7258ae607a9d5da0dba5629575edb56b444817824b8493b125d5da63dd81eba51dcc11f7979b16ca0314f02af4212a5ea840daf215e9fa082a7089550e5dd0c0d0f264d230a6249b45926fd360a4a56ac05910a15201292d5dc3d92308f98175c0fb4f9034ec8fc8d5b584e95ebb942fd16d04cd6867fbb2aa53377dca93e5ca2380de64e59ab41f71e449be3eafad63b4158\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = a83a07c4b0e408dd205adbed9d929d418e19e6cb0c2d486bf716ab66c21d1bdb341636ec9b5734ab9778ce1e28f882fa98582313d9840c05cb453973dc1384e73e2586b5e7539a3367f9ec788644f881be29c991b0e23de4e9e299dded39e349807318c5bed4d32b52d040ef5e99f06b1c14244347f50e57a8cb264638db98b3cfd467c2fb621366f83cbc68a27b0d3567e5741d1ccae568eaca51ac93f4c5febca4e23cc73fbf506ea337b0dfb47afdb351ac03e7bb81f1f6e867e4428d9b262d006976fb39901e84a2331b65b59fb96704f08bd77cbb7e0a39f357bc1100a70342e5f47c092a817374ac5ed1f66a4beb6f3a4820b6109b075cd80e0fbd840e\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 66e2bd9cb74a6abea34c2285165902c9a5aa5e11208f38a161ec72b0ba11e4006a9ff8b118de42bc45297a538e6aff1f4b56519e6d31d7ff9e5ff32e2ff05db68d023efb5fc10f5b57d4a3b216b63048c4aebd88ba409ec87e95bc239317c2320a06bad2da6cf7dc8867",
     "1c76859e4750eb39d09fbc2e27fef6e6247b23981a506e8ba9e8ee29709e0a846a617649083ef5ee383209036ba666f1240389328aabf61996563f65fceda07a24052e68896c65aceaa8d4e543ad4a2858a37369ae622924af975bc6924fd5eef327a01baf0b864c557ce86bfc2e84c1900d201e5f66786b499741e0f3504286ca6adad82d379394d4b8ab6f3a4ec3b16eee5506d98e\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 2d18a31f2e8762317ad943db09655b96ae7dd2b7c4754af2e852bd0fa877c58b160d62ab9378c06c0956d56b96d63d5693ed28b5d57a635432fbcdc2911c9843c68094301c6eb1ec02ff41400b9d9806673a0c07310a0a0e91973761a2cba91e38140217590cc2634c85247886f6364d5e5499c6e99f43822241d4e8ce6906b4d9b66ce4407c6e8fcda8f18aae2831c382afc9a8d273f17e2d44cfde2f463ea47a3292a74f743b1a99bb9adda4b65c8415040834f31e0f4392572d3a1237d8227adc380f794919e16144590fde3ffb92fae4353fab405fc09b25282450f66433d25a3178655545dda9da0a4759c8510e6e8f3f85799226715e7b2be7867d1fa3\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba748\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 000091d3f1fd66163ef8a8fe02f98802219f370938f21baaab871d6ed20de4449d5c615f395f89b5e455d301088285cf7ac42b51eeacc1c7d4220cf4c456178b9a2d6ba93b0b1c334b6aa6f19cb75f374d88d9d284feda4eea32c5a4d9baa0e12fec0f72308322eeeac9b0769f161491ddbea08983ea565058d98838b86df181088dc9048091450bedf4a671fe0a57f9d4ed67cc41ca6eb6a8324ce14d6202de07d55e80d56660ccc358b1cf6ed56061a2efdde8075553c326e9a15d441432c52c7209a6ea6cb6ae8fb1fb128d8aa31cea24e5648baa087eff8376bc01b6084e0476d3d5c5533d9c2c36803e939b8f525c2ed770ba08e221cb946d21d611c0fcfc15\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 91d3f1fd66163ef8a8fe02f98802219f370938f21baaab871d6ed20de4449d5c615f395f89b5e455d301088285cf7ac42b51eeacc1c7d4220cf4c456178b9a2d6ba93b0b1c334b6aa6f19cb75f374d88d9d284feda4eea32c5a4d9baa0e12fec0f72308322eeeac9b0769f161491ddbea08983ea565058d98838b86df181088dc9048091450bedf4a671fe0a57f9d4ed67cc41ca6eb6a8324ce14d6202de07d55e80d56660ccc358b1cf6ed56061a2efdde8075553c326e9a15d441432c52c7209a6ea6cb6ae8fb1fb128d8aa31cea24e5648baa087eff8376bc01b6084e0476d3d5c5533d9c2c36803e939b8f525c2ed770ba08e221cb946d21d611c0fcfc150000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = d3f1fd66163ef8a8fe02f98802219f370938f21baaab871d6ed20de4449d5c615f395f89b5e455d301088285cf7ac42b51eeacc1c7d4220cf4c456178b9a2d6ba93b0b1c334b6aa6f19cb75f374d88d9d284feda4eea32c5a4d9baa0e12fec0f72308322eeeac9b0769f161491ddbea08983ea565058d98838b86df181088dc9048091450bedf4a671fe0a57f9d4ed67cc41ca6eb6a8324ce14d6202de07d55e80d56660ccc358b1cf6ed56061a2efdde8075553c326e9a15d441432c52c7209a6ea6cb6ae8fb1fb128d8aa31cea24e5648baa087eff8376bc01b6084e0476d3d5c5533d9c2c36803e939b8f525c2ed770ba08e221cb946d21d611c0fcfc15\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen144 = 22691;
+static const size_t kLen160 = 22691;
 
-static const char *kData144[] = {
+static const char *kData160[] = {
     "# Imported from Wycheproof's rsa_oaep_2048_sha512_mgf1sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 0a5c2790a591c3ecf4f6281c17e1038845e540a95f21294a7ceecd75b18c54c50c02e789311c1b0091526f87ab3cc8d48188e980ce0e0377bec00e9f7d9793583cb66a1f281e31d20b594b5c66a2d9efcc36d979a92bb877a9678f991ff60b77e28fac55d64f21c064552a4319eb0a9a1870a76ade3c3a3534ab8353c3e57b2708363859ad3a6337fc15ffb90980d93743f972d743c3dc6fddb44279079a809abec8113a6f987f71748c036a4daf353b27a81e6983d56a2d65b71b93128d5569499d10ad1396f094eed77c044e3ce9ef82f0014c25ba693928c00b5043b641b016e3569b4bd84d683372538671307321c25e590f14bef241e6d8edf24ff39859]\n[e = 010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749]\n[privateKeyPkcs8 = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001028201000a5c2790a591c3ecf4f6281c17e1038845e540a95f21294a7ceecd75b18c54c50c02e789311c1b0091526f87ab3cc8d48188e980ce0e0377bec00e9f7d9793583cb66a1f281e31d20b594b5c66a2d9efcc36d979a92bb877a9678f991ff60b77e28fac55d64f21c064552a4319eb0a9a1870a76ade3c3a3534ab8353c3e57b2708363859ad3a6337fc15ffb90980d93743f972d743c3dc6fddb44279079a809abec8113a6f987f71748c036a4daf353b27a81e6983d56a2d65b71b93128d5569499d10ad1396f094eed77c044e3ce9ef82f0014c25ba693928c00b5043b641b016e3569b4bd84d683372538671307321c25e590f14bef241e6d8edf24ff3985902818100e74a124759a174de33185996b3b437c24ed248203d674a87bcc2e76a667be3f54ac15e8f04e4c5e540f4e19f402a71d37d39756dcefbfaefb380095b6cfbdf4d78dd20cf085a1f127610e3b7102ca6bde1825941ab602e9b72c08e4533ac50317138e10bf7edfea30f52ee91ea6628c2cc65e76bafc02eb9d21ab66ad374ef2702818100d793b4f5514921bfbc47a1e45faa043eea03f052bce600ec4f5c62b014a7c45aeb3f4bc02160e7b12dee135e44b227a31854ca833ac706d14670ab5932a269c9b6f9188acb93e698b4a7dff65bb9c963c2e02b2cea3f2d5cb254e07b616792896e37550cb38171c4c32e0a6543bbe6acd4e99abeaba1340a961017412b57bc0f0281804dd402049a679730f2169e86f49f8f27c6684236ff1293e4cb22f6c63a083474251c9e9a17b677d5261f81109a81eddd91c4d4fc076b894c41a5b3005dd2ff984d3473c6d6f3a4830cd1b01eb8c59db245811c51d9be3ad0ba338b6c43f016e81c465c8c2f789977fb3f17e267f2ca828a4f3c29637193079a68bcbb83be547f028180767a352fc5d6bd7794d08186f3948af4d0c40d664b6ed4ff0ab6a97e403bdbcc6411cb5df27a419bbcb4656c9fb091dc2ed91adb78883d94f273a598461dc0aa1da754f7a2decc130ce65e4e15274c2949c6cdb3c7a1a51a96dfd2e7bc26a20069d47b2799d80060b52c2e866ced6ddf7abc50518e1df06e08ff1ae8b41b69bd0281805479dda30fc06b63cb5f77e20bb29db7eec7a6b37a5007f9651a46ffb66c90160be5700145c6a08d9737a98c5f7ba0dcef39352cc5d8612d94fd02383b8e093115376b154fa1cebdf915ddc051a7017d67a238fb4376749ced94712b117a1d0ca31cd653a1955dd547346d03b21eb0ad3c123fb85e92c8af50a985db10eba79b]\n[sha = SHA-512]\n\n# tcId = 1\nct = 101f82bcb8157966c8f50531f294510416393943fa9dd5dc05f85bb82f0492502274e07ca7dbda2a7e16187981c923d60cb6b427693c6d7b107ebadbb6fc400492fb795cebcc804d498a7d3a077cf39cd030e941308dc87000af5380b3ca5e8728313e35e31b78ede9e5f07cdec8e3569afe3d13466d06d4b77030d146b32cdd7da566d96753fa44d64791e687dcb324f52371c0191bc9f1a5bc7b7736a5bf00d3fd518b70ed6f4ae0fcb20bc92ff3eb048a6f767596263127ccd66e474e8c27521fe2eb21b8abb2c23b91bb16264e058265a567492bc51c4cd033b1d8a5d7b5798360f4c3716ddb43622ea5dc9fcd36819e05a989252dcce826506711a20fdb\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 35aee1c56044da3b866bfed989690dbaf57ac10211ca4c364c4f4127fed0a55b581217c7e854d11fd1a1f9d5431c2c309e62a6f7c3c59676182b288edccfa961c78c1baa53f2db1b1b9a4dd05015f41872cf22acfe3a071d6ac1e82ba6c31f5c2d9325247d6f2c9b03ce00c94f02fe33c5678a4149cf2fb70bbbd995af1465e3819c83c9ab8b55088fd5d75036613b04df302113948700d7876b7cec9d7337bf5773343d51a4298e717a4fae09e573fea412d88b836ecd4f74c7cc7500609723b3f3a2a00d85ee7ccbd92bf6c065833027c5e50310c6cf8fe8d13e2d8218e785333a2e65b547e5eda2f8f2f9608f366d7e43636fca4f46450c76f06dd08b00db\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 58878dc8b9527a416ec9bfbe0f07fdee8dc5bac8e31ca545ae7c6ef4a68f2c6b2b73366518edf85f1143c27fba00a5d9a9b02843ad8951631ddf01ef1238853b4593abf9701c621941b4f05931eaf307c06faa7fb818db8f859c96dbfc43268965303b44fcc69a0e3ce619624907bce074205f113715e5e820bc8c6dda65066453215702416db9320f54e67fc91e9d37a8522d701aa22976966a99cbc8fec0e12f2eb9b5705b4dc77caff82a36485550752a3a5ebd47fc67d66b68024a2c5db809d08be9090bb96e18807925b18a753ece05f1624fb19537abe7fd662830d56647a416df7ddb3e6a073150d5112f60538b685243f1e4fde2a5951c9e9499ecc4\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 2800f421c1c078b8bee9c4a4f355e1ea834c5bca442e9986792a50e66e68c0b8122cb81bb59e0070ca044c1c5b190f9098dbdaa977a441a8a4c62897edb9484935007aadb6732c1b2b2171aea3ab1513f225ebe7830fb823ec3f5433bd8f3c3e52775bb45fa91aa0ad3b7c1bc647b775e4de8e1b22eb971041267878421cf43a5e2a2675b2c940daa55f12a7c79d87d45e08c5592362f5e0d7ea668af99eecd2f60d7fc3791e4f53aed79931bd0ba90f701de836d8c8c9be7f7f4aedcbe5c92383932f762bec65fa298eb644877de26eec995146af551ad77ecfd06a3670721ab4c7577e61c048c5dd01b282cfc0fc963b92c78eabd13fba64195d74de4829bb\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 65a7286d77963a2d168ddb4c0e854baf8898d1d22c9de5d4968e8b326f92ede2f18fd29964708211ef6328e4ef16ec36a775b36b4531c52e01c7cc0058064af954790160012517134f17d92a05000ebba84f515f90258278208cb0a5db11d4b1dc26d2042218d2fd62aaaf53633ff0f632431a010b7e14971a41791644ebc170792a61b5548569f1b0268c890074a4b07d8e62d4857f9e720cb7307713424c701f6f666981ac8e96ab066f303fe89a138abd57b24f03d9136ef468cd8519235cef7bab01717898357c0e4ff4d3685706beb5d680da2885556e84663772d6c299fbda67df2cd325cbfd62932836920e0751b0d8095b914c18fbe5e348bcf4d85c\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 7fcda819b841cf7c668f9ec9e7e115146f990cc420efefafe239637076bf9ef1c49ea69474f63495d90cd3859e335d323ab9a967c65fceb0b33a760142b00894d1ac25ee7c2833bf2dcd086a0cad64433aa606f4747f14500ed2779470b4339f580e2fa0a14d870d6738e726a34dda3fb7b82509edb6d6b9bcaefeca077b2dc582982ee6e28fbf167a92b0ff1141d10fc3dfc49adcfaf32115f900b20c812094bca91bb10301616af5030e0a600c993a24d96764986782da083e327569103f7b358a6a91d05fcf89a9290ff989ac8c0acdae03438a44b16c7a3e06a1591869874f29460b0ce09bd022fc3c606d785ecfe4f4a120298408cb425e9abc7171e4d3\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = a5053d46939bd6c90f2a67f6613070ba40a831428884fbbb09d4923b978f17bf538a5963a0416875300f1b51d56880ecefbe58ff6ec7b3740a649f36db16ba6cab9b0e4e7a1ec658fa0fec781361a547a718ef5d9f7d03892bc1b18602436fbe5ff5cc6c3cfe8f2e9df960ed89800da546630251d292b00a60d102211db28ad184919709d8d4a1ab89d65ab2fdbcb66e1492c4525417eed89a0be2c67a79c5f89494ee7ef9d3d0d7db2de34ec6be5863993e8f64e4601b7945b2ea271efc941c4253b09dd3a3fdec6b45038887018a5018771fe60eb67a68bf977e9d3c6b032fa28868df58386902065ba3ac7f028600c5dd5c180552a25d741db12763dc3b89\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 38ead5cec1622d62e9f27eb7bb9d369fc13cf7d21256c5df8958dffa1df2dfbae006c80ac45ebc3044a20f8ba024b73c2e03185a9e4d975fe3075e6e11787116d1ddabf2af65904ec9a5b145dbf167872d066ef490c4b9a724000c44425cd33448288e883fd01ad915b8a4d9d3c65fc0c12d5c5bcb78b323db20ba07e57a18820e1154e9460d71b92f85aed92c2128c83e598564138a97e0379966459364be6aa166a8b62cf7c5b806",
     "2d99e98fad155c9f0f1c8629e43a45674563f0d142c309605ba2dcb048a9d5c58feba16b5b2c988d93741e84ec47f1cbfeee540f10dac120734143c80e98725c609ac249558f8ac58cb21769941102af34aaf02d538c55\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = a4582c4dbd1e60062e517331f4d49a67491c975bbeeb58c53c21c1aa350c63d74940ebb3e6d8062cefb2f0cc645b07e77e6bd350baab08862665b80fcbb5c386bfe330eae7c43a451d68e75da6a0230a5ffc45c9706cb5bff4952aba08230a626929726ceea068d52c18c525dec9d94884cd93a5b39acbcf31a0a3c1d28bc2ff352ff4097224664102015a14d6d9663d91489f9ca4e5e240a4d9c93707e015f07dd6398b306959d6a545616a3124b3a87c8a17293ba36f3c8af4be8bfccbcc0fda06881e05046b8088fa09c542f6bc7a397ab82f47e05d517e79b462fa77be7fa1af05a09baa17ebffe73e38c3107f4600d75f9becaa8af68e37a4deedfd9f10\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 1bb7a6d1dbab994619f25bd1659c215dfc12ccde9f91ecdbcebebd9c9d1399ab8296035f43f0ac65c56f56707aa4a301939b745a0d0000652072aba5c514ca331c9dd06a2f1c0122b1ba6f9389c6ea6904f36cac5788d339691feabd34b65bfa4505c60e439713591a8ddc6ebe85131bcfb37f7476120d587f127cc52f8914f0c78a2edddd1c6c5280b745de595bc6be424d01d99e58a8834742cd2f085b334966b692c3bd372b94c846581548ed2280c64b320ec1341ab54a702ef7040ff67094d540dcb080fdeeb2050fff66eaabfd5b66c99ab49db5e6c72cb2d530d503a87d691dcdbff85c5e8c9fe28a1f32fc4a22a2a67ae9584a4411f8dc03d3e76b55\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 89bc06f1f12c0b688352d31ddbe22de92b3e8ce8e0f7d34e5663cef1b473408c932aade4f06b056a52a48a0b7c80c763ccd3155f9f4282aa350e9c494dcd99dc2f4c17d53abbf24a37194db5f987aaa176028b2570c8e74aab356e233e406812a17fac0b92d27f503e6dcba5578755ad33a105ccd91204c8ed22e923492ff07d5aa702394b5b8cc417e8e390fc8268cab2468a4285a4fc327a83038e59114654df7d4dd32910f0fc2e900177d46aea50a61fb0e2066947fc648ef40e22c2156464fad8bfab19d8dd9a4aaa8804024693fd2cd45c233c59ec67be03a8b23fd859003b2d01540214b3c06633ce273a9a992d11befc23ef6be34798522c074f4ffd\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = ae26c94476747f8a7454a80c05405bf35799ca1070341b73208de24e7787af7846de55ab36c2d0feacc1653197d42cfd02aabdd57633a69f7fe09bdc72c8ed28c4b1736ca7b285cc685886a5ec535da9db91965b291c53bf92b1ae159974ee795ad0fdb8b422c06aeb78923b27ce67a766f142d10f960448679e5fd1176124593d32b9b7653862147637a76a87332acc5be2a955e4bd2de8b63d873ff449715f6f1f7c76e4083151dc6d58a3e3144c694a4ec85523fe71b298dca5f0716619ea3e1182a94c5a9f6e602844df92d1d2850fb64bd1f28da347b44e0af2017bad6b61a7190dcfded0df48840d3a7bcad796744c7ba5b214002f930b28f958cc5f0e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 1773e5b493ec17b56e250885eb5fbc3db160e2f6ae55bcd6a43abf01aa61a4b0b7b2dd0d522428af6730ff374c40779ca0c2bd8008e266ed234c6133ad4ce13f78468a0f828ad86a8dd7866fbfac741f66d909ea1f415a7337fd449f5b2ec62c5bec328d18f9dae193eb1645e1fb26be42bc6eb980ce5679a88144a2dd1df32d8fc48fd9b3c70e95561f50da328161d2ff658196f7f98da563af6e4c1ed2dbe992ef0df66932a45812234211131b43f618b277c553fbc408ca2369f33e080d9b1188210434c2d90c3f8d03d892eadd70af1c43a8586a4f523c60fbba5cb98e2b0855db413c2e99ea4863a1c2db014b6a31aee56448bc00a58717f03859dd6552\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 6cffa2bacf010449460c15f4e4d5bafd23be3d7ba4ac69368ac0dbba1268df39b96a863e759eb31a3f9eac5494e29f710afeec490ec82d582654e782c06cb0613d9b15d8c06417e36f686b71540494f51e993bc2eb44629fd3299429068ea84309504899c5b1bcd7a49599938f5bea8d308113d84c38acf7eb901cf3274dbfd71b98f420a83372613b4f43189308aa76c9ba15f9769cf4bc5def8ae02449c3b1ee74f0032bf1a8356797aae23f5a598c3f336df8d195cf31f9dbb60ff4a9e5c1398ba07662f31246170ffa3bd38ab0b42dbbb555affdd4928a4b478f9d5ca9a8f9719b0b2a0d3ddfbf708368970bcf027e48ea2d0ad10949a238c218ac7101e7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 9256e2341234a867ea476be7848b35aad5e2d2cd9170768af4f14fc1b30be151ceeb2768767e090913e0e05844088fa15b7a1a99777b614a89e99de472047decd6e9214e6c025385fbc467c5331febae8e2307bbb0f015228024445e142e79d91cb7a00cce07ebd36474d6bb2194a39cad1c110492ac0e0637fdfcc5453b0313065475a563a8257aa1ea467c58cdeea0e139132a97af3fc90b3bd70f03c337dbe73ee8c992a71d847bf9f559e666592a7f1d3876cd1625ebd4056c6de6077229cc2dd230cbc51ae7a28105be3dc32f795ecc11b45ed1074154f1d24b11ab5596d3f8829a5be976b2db2dda1e2fc2174384e6332a63a19a734c50b1a34e201ca0\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 6808813038a51bbaa5f4054f9fb7906c30736fcd150a1c70b3541d3707263057142503bf285bda1debd1d6c5491269627245cd649a027d0edcb4358ff9fad83c0644ebd8c3dee5be6fdfc1eef443bcd9cd5530b088f9f970623b380bbeb0b945c74737177c6b1485c5de2a0aad576ca79d05b41ec7c52975503f3af2cbc772116a27731687aadf16fa4704cfe56223336c64e2d8daa6a5fb75e47c0fde2bef7c48beb46317b3e637c5bfce3ff4fd5654b24ac6401ab346fcf7e214c674e099eb9d933cd1484e70fcefaff0498c8fd8672e35312d0bff87e244df3bb4a3c3f64d73fb0606ab46b8848e140a91fa3da08ec104bcee483360048cb1596a25b56106\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 7696edf1c06a6b772a95964665cbeb28f92fdde12ab092d7cf18816ef5209503d6416c9f4b24a5e4e1f828bd93634594b6a597a86005900d47e6b467337ce96023392958e30e4af43e7adf2a61b523517e299dd10092398d1b13c227b846a9ff8c792b0b1dc413459d9ba4543c81db4609dc6e17e5b99f04154444ef3b235e517e2b493f7fa1cf6e7271aa16961077f6843a3170aa61a0c4d57c0411a518cd35c0eb63e50b9479e7b6d41ea793a6aceee1cd892004dd35934ea383799eaf12347aa184c9be87ef1c244407acfef24f973a7127e614c57cc11a8161b92d57ecb67740fc29164c53413a9a9e216a5b3a290d585a5c0d9a26bfeb6b045b6bcf5c4f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = a7b27e1bb007bef734447c7e9a2b37e06a1721aecf7452f73da74ff381762b1489c6eba62e348ef4c4c6227a910025e8970729023cdc628d97f9d67e81a36e05d83ff625daaee05183042d5f1490c6d5ab6347e94f33a88ff692cc1388ac01fd1d7fd5ca5a026af5fe75551a76a8bf51b5a88e6d7f9e9977a91c535450f27914556a9bda1497dc58dd74b6f27b8a33d8eb157e03c3c5d874232f1b2e7c13138756c81e4de00d53629d6cbe7c7ee9b30ff55b5f31475e2ef3e96aa01f604bb382f5ecb0615d195c011d405e72fd5510adad469e88e42a5c61415c6147e2e471f28ac71c97044fb5df892cdc482caac4c2350033e00b43a1221d0008c63fb8f0b7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = a0c8b1ed6dfbaa3e738a3f6382a9d010f7281d9f0ee9de03436db92cb51738aa315bca194a9bd908340b0c3e1fc8523ce5711ab0f9b3f9e009ec09e1252805809eacfc2059579d45be3d4e26ba9c6be2f35c2ca3f00876a097d0ba9719ac9798c205fd8b44fd239f5bd21f7b264d883a1aa760c60a226c9b9c43090e6d91335a1f0ea04e5151631807a2f1e13fcbb5da9d98867ce9fd448ef1a116f779933dae65e5284053dbd2d004cdabf7c3bf5eb2cab25b0e646b25d34d277a4b20696f2e6cf735ad8acf6a999858d808627a049fc4acf5a507477620468ddfa11b56d28b63e46ba88ee90133990e0f4bcc2ee53acc150ab3f0c6ffa1015bcbd29f9d2d69\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = acaf316a29cbd805132b0c43a4589761a54aef928e4036b15b389a9c17a04c86ee6d595c064cdabe383414e41420be7e70163d89822774374ea85befbd3f3fc7dddc3de1f1ffa2bd595dbc678a03c0ed643ab4ee540c8e3ffaf86fca0f39eb4f795e9c387045ab2f378f246a2ff746dc3cc1df8f6158f16581231514fb22f6e169b13199c4239c1827767aec256d84f729739916f7d43a015a331c56099e8d33d66df6352a459356d9d981bf467dd88fc115eb88b4b22bfcb333facc97d295d72cb06984cd12b670a539400a719d11809a73f8c4406a677eb6285da557f8f69bd006da2c286a64cbbcaf2f2a083a8e5baf560c9d6fd703ad1544413eb0c3fce7\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 0e5569756d22d82b912ac15e90209006c52f6a48a499e242c6603eecfc2087c3175c4d18f42bf6bb6b201b9cebdd8a97a7b32e4e7e75e034ecb96bf0013b2f52ba036ab2929c163962f08cfd96ce780912bbebcab7798b5cb3eab91b82b01dd1983c1bee76334a71",
     "fa93ad2468a799afed4caa1284fc01225cf225bc0ceff35a6569b76b5cb57be214da94872eba8a73cd51acf917a627ef17547af38bcb805485262063f80c0daab609a40467f73fdede744db116842cfcbe4b1ea7468fcfc258e2069afaf2c552b3be864517a7b0c71d46765e9573f0643cc762ad21826920de1ab3d116496b71366b2f6eb487d8b4cf8b1d6d673da1b38fbbf1e11615b108\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 27f08c9efb8bae2841e67397d0bbb2e852c6d844b0b83eb0d3124ce3159020ac4bc750377f11630cda6956954cc9dd8ac5fe586e73c045ec8af96ebbc2bb6c0a3bb70c8d67cac5e972b38b20901339ce118e268a8a59675a6dd3db05f0f9c4890061d040a8734fd456176d1f4ef81129c7b3daf2eddb2f4c72251fa52550118496230461b583122df9f112599cee7372629b1704030385c988c372e4892007777098d3bb278578e306e5a37b89b7665321635b24564055f9f4ade4e2c7007014db3add8093659c285338ff370ff7e644ced701a7f8c131073f8651994758d0394224cd2271275443c079a3121df825024afec839406cd410f20fc829aa542702\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba748\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = eac59c81e52db549558a3b7bada6e9cb7b09ddabfec008f9ee9c9cb91f1976f168adef3158e37b210f8fbe1790bd6ab892cb556d5d1e204d02c2259f6f581f00371b1fe122cb7045d8fade589248475b30c37e5fd93b053411ca329e568a58bb503b0f25ce9ef9663a32b75165804d0f99941475bb4ee8aef1283b9c7a9a9b8fa337d9b6e35ca1be25db180d80804c241b6733e62832fcb8c660f2197dd4f4fd87078e46f85143b43682e33f58ee33b74a357d0588dff43dd06c6be4ab49e81f4f905a22b563c2704401c64dc3e4ff066c3adc541d5715fd7674031e62d5a7b2398de09eb8da0a954b3c185db29b3fe26e00a61067413fb640103bd0f503d104\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 00002800f421c1c078b8bee9c4a4f355e1ea834c5bca442e9986792a50e66e68c0b8122cb81bb59e0070ca044c1c5b190f9098dbdaa977a441a8a4c62897edb9484935007aadb6732c1b2b2171aea3ab1513f225ebe7830fb823ec3f5433bd8f3c3e52775bb45fa91aa0ad3b7c1bc647b775e4de8e1b22eb971041267878421cf43a5e2a2675b2c940daa55f12a7c79d87d45e08c5592362f5e0d7ea668af99eecd2f60d7fc3791e4f53aed79931bd0ba90f701de836d8c8c9be7f7f4aedcbe5c92383932f762bec65fa298eb644877de26eec995146af551ad77ecfd06a3670721ab4c7577e61c048c5dd01b282cfc0fc963b92c78eabd13fba64195d74de4829bb\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 2800f421c1c078b8bee9c4a4f355e1ea834c5bca442e9986792a50e66e68c0b8122cb81bb59e0070ca044c1c5b190f9098dbdaa977a441a8a4c62897edb9484935007aadb6732c1b2b2171aea3ab1513f225ebe7830fb823ec3f5433bd8f3c3e52775bb45fa91aa0ad3b7c1bc647b775e4de8e1b22eb971041267878421cf43a5e2a2675b2c940daa55f12a7c79d87d45e08c5592362f5e0d7ea668af99eecd2f60d7fc3791e4f53aed79931bd0ba90f701de836d8c8c9be7f7f4aedcbe5c92383932f762bec65fa298eb644877de26eec995146af551ad77ecfd06a3670721ab4c7577e61c048c5dd01b282cfc0fc963b92c78eabd13fba64195d74de4829bb0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = 00f421c1c078b8bee9c4a4f355e1ea834c5bca442e9986792a50e66e68c0b8122cb81bb59e0070ca044c1c5b190f9098dbdaa977a441a8a4c62897edb9484935007aadb6732c1b2b2171aea3ab1513f225ebe7830fb823ec3f5433bd8f3c3e52775bb45fa91aa0ad3b7c1bc647b775e4de8e1b22eb971041267878421cf43a5e2a2675b2c940daa55f12a7c79d87d45e08c5592362f5e0d7ea668af99eecd2f60d7fc3791e4f53aed79931bd0ba90f701de836d8c8c9be7f7f4aedcbe5c92383932f762bec65fa298eb644877de26eec995146af551ad77ecfd06a3670721ab4c7577e61c048c5dd01b282cfc0fc963b92c78eabd13fba64195d74de4829bb\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 31\n# em has a large hamming weight\nct = bbd79dc8eaa9101aa641ce152235ba3d804b48ec5e3dfe69842f125d815d6a56bdb774857c0bc0966aeab1d9c774e921852ff2b84d0a44016382d0e091c3534f0d38f4d5c0ea27744fe320bb0847521ab5474f22d4538562730909fa4496a0c262fdd9b62b422ed4ca9aa30f9cd7cbffe22b3747b0f2eafe1aecbf0f7506016afc9cb3414710fa3f46dd779b21622579b78aa7b580e5960d6c21da81b21b112ee7e2d33f3d67dceee1f07cb3bce8d7bcf8678a07e55498018470a714e00ce9ab796ebcd335240c202c82ac18c4c8c47b2fffba6974322e0e55624a2f0b7e8f3dff1ab4e73bcc65158f6e3d06f7e37535b413a7467979cb5a748b91313e3b7bf7\nlabel = 83f0db4e0dae6949337373a0d78c4b20c15a13cbd4e2adb885c33e0ef4c9764667a8706d059d1d891523d052e0edc1d8b5c959eebc340ce5d41559a89a1aeb5600000000\nmsg = 6b2e7b3152a8eb663899ce78d5c196462d5399720e85cb69fd2714b09842db9dad683ecb27f77938182f14168e76ab7dc039c224ff26c4631344442d81afef7a776101af2d19c45bc7609582eedaa9c1c1a1d364194186b767e6329f7c3daf2ca26348d9f6d2a80b0d018417606cf2256d28b782ace17b8463eb773cfac1\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen145 = 31155;
+static const size_t kLen161 = 31155;
 
-static const char *kData145[] = {
+static const char *kData161[] = {
     "# Imported from Wycheproof's rsa_oaep_3072_sha256_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 72ac6bb6d9a5726e454b5430c71125c6e9ad5fd42e1c5a18a8343e9d83d72214386b2308c0b8ec5ec6759dcfcd6a21f88b8ceaf46403923eb86ac3d14a8592e95de0462e14085c3f17db005dc4fac87b4a2d1ede5cf851d5745c8651a4438c0a4d746ad72e419207964728c301bf379a01c094e9693376f721137d3dc76ee47c9790fbd590b7d6a8d626e21b277ef17a4e4f7e0171c1146e1ec324fa97f30d3a1bae08f8d5f6e92cfc121665239c429167359e9650434b29d2015190356adfee12f25b341b08f12b7fec6379598af7d5cc24fe7f00de1d47133ce3ad8b6be1c9a854e33fb952e164ac6dd2a9052186ee144ee7dd986a8f03891d0da21ed78516dcdc2ac89cdddc8b544731d66f9d89bf17a50c6d987a598b02c938dc36521b881ea994e4c8fb2ba8fd001f73335d4dd1bdbe177d3093cf3883657c9ff944e8f5c9cde548b7c1b0741929b0d74977ecda694d940aefd9d2fc75323e0b3a114b99feaf3e2518f5158d1fd9d953aa20af158e67d27e2ce2f18d97fd02f369981979]\n[e = 010001]\n[keysize = 3072]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203]\n[privateKeyPkcs8 = 308206fb020100300d06092a864886f70d0101010500048206e5308206e10201000282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b120302030100010282018072ac6bb6d9a5726e454b5430c71125c6e9ad5fd42e1c5a18a8343e9d83d72214386b2308c0b8ec5ec6759dcfcd6a21f88b8ceaf46403923eb86ac3d14a8592e95de0462e14085c3f17db005dc4fac87b4a2d1ede5cf851d5745c8651a4438c0a4d746ad72e419207964728c301bf379a01c094e9693376f721137d3dc76ee47c9790fbd590b7d6a8d626e21b277ef17a4e4f7e0171c1146e1ec324fa97f30d3a1bae08f8d5f6e92cfc121665239c429167359e9650434b29d2015190356adfee12f25b341b08f12b7fec6379598af7d5cc24fe7f00de1d47133ce3ad8b6be1c9a854e33fb952e164ac6dd2a9052186ee144ee7dd986a8f03891d0da21ed78516dcdc2ac89cdddc8b544731d66f9d89bf17a50c6d987a598b02c938dc36521b881ea994e4c8fb2ba8fd001f73335d4dd1bdbe177d3093cf3883657c9ff944e8f5c9cde548b7c1b0741929b0d74977ecda694d940aefd9d2fc75323e0b3a114b99feaf3e2518f5158d1fd9d953aa20af158e67d27e2ce2f18d97fd02f3699819790281c100f5eca16e0e83696b0ed9ac8a812545daba55f20a964c4e6343604a7f2be2860fce9fa16a1cc92120939deb88dff68550383ead851fac07ad1b2e8a9b2bb69525d96ceabb7ee83ce50f08d649107f449a14521a6893f3f3c5c5a703b2fc28bfcfe261a4f7f450558080deaeaab651c7a9ae586c1e7f5c52cda93e40aac908e4e3357984fc116af9cbe9539bc7a8d3b351a73ea5c2413d1da2e0b448b454670aca89ffe73b1401e9b8554fc3f23d6c904623251a1d29962ca9b26d973345bc4c5f0281c100cf25446f59cf512919ddbfcfa2d9670495ad92b6f295d61032057f9da6dbefc4510a623c2b47a5220082a3bc42af1a144f98c9ee4fdae41be0ec501ccc94b2b0640191099b355611160deb327e8ace018b898025ef470e4373ec1d97f669e298e1d845c6553c0a546ccb168d5b510dbe6018fd4ed9a3545f9bdb81968f4a6d7c790e5c34729a8efb496086fa1300249ab8b28f38951d7bee1c127ac3c4d0bd596edee1e9d17781dbb8227d7b5d76ce8b8bce03c5d339b9757981610848c55cdd0281c06357a59679d26801514c6940c20eb67b370e84e9f5f0f9316c0437d3cb7c843f5a6e6d9c19e8bdb3152e93f904cfe6e692f1eed27a0ada46f95601b3d122be793dad9bdd05d4f6d469105ecfc11448381dc154ddadf6bc20c649435b483585d68a527b7b967be52e35e0be9a437021c1cfa5f4771567cc233c1ce3ae99eb37daf8bd10156b4bd580a3ce9c7d391bdbb23e67363a947405c6c812cbd3dccc8b356a2dafd0d3b23a21b684b458e4ab3854bcd9be04cdc9d65ceeb10a8531c470ed0281bf04dadabfc15b1a8bdc0f566f876191088a7986f6c2b8c04ba0e0801d31cbf5d2a4139a39cec9df14ecee22e846a7d3f4a5e8eed2a70c7a4c2cf95ce74fe42c4bf60c135a264919bb4cc906ba283d1896f0ae48529b490f0c85ab03068cbfee8fa6bb6ae73b182d25cd66f5205b038b4eeaf1aafe2e1ba5de97c88d40fa1ac47626602fc90ae694734f44f3e4e88d184e8805a755ac2904be8fe9def6b7a62cc9ebcf4d7c2d6c9f9e86b2483e9bf22ce51861bbb4e73e731a4dbeba87772d290281c0214a1f73130e48b336fe01b950885ecdb3443d93e7e8ca62fb0da96bd423759d8be552c8be44f139fbee6ec24b75fbf0744fac4daabf5488fe6c3600d9b8e9a922481fc74a7a3d622662db8c85318de48ee8b716f19429fb594990da705ebdf7ef6613dd6bf885c16ad65e9fe6c280386bee976c25dbaff8fbf69baed9510be5eded3f90e0ba4a97e5c81a2189f114670745ab95edda215bd05fdc78929fa0cfe8b01c83f2aec93e3ad1a334fd85aa8794eacf955ae5dacd45b268741fca195c]\n[sha = SHA-256]\n\n# tcId = 1\nct = 5817f7d276493c294359e776931f0c4922207b6a06b43b5b03e3ec6cea095fa6acb8313b61d4a60e293eb8f99372b9cd210818a54e796bf09c70e21eec280fddd784c56d63091bfca32ea28846219f1e39d262ea475e5ef0e0802e80d36479ab81f6250d3b590de65e870bc9a1e71da1bb32154c9af2d049b539c183c0b5d6225c7ebc81b29cd0ad8caee728c57b8a9aa81e02e0e4e2ae2653d8e9045a2f267b844244eb84f93fc5dd37fd956ac933ae1a65643bd910bfed21dea885581b6717cf9cfff50fac0cd7ab5d13884401f3fb65a280a209e6ead340dab05177724f6ce72109a78c433c936e88d746c244d6ffc9ae76d16cc5a2d55fe1ecece194bc1c1a7d589376b16efe8ab4198997476c3c47ee232107af8fd1285f27bb3b455990649c14ef7ae1e81775042d6905c37a0afdcaeb6ce8c303d8fac88d9515ce50e6df603129aeb112fb3742ed607a6f095b1de291fc9f1d808a9c17c78a314bf0d1317cb4d2498b1ceadf919b4aa0978b929fb1b25e2f310daa3e707a7e3816e2a1\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 9c3c92244619c8e02a3a5c444ed621ca2dff15ca12def6a375b96548ae86a1c27056903fe1ba70d376f8f7949adff43d946430cc6692b03151f4baed3f395c496ce2416d8fd91578c607832c3d02005a88631b741414fcbd517f7d4774a818566e2a8eb15e5737110a3515cd43140083d6c8f8e059a1ee0e30145bb10ae2170c0fb782296d646e50066bc92825f1f3ded41d694c6f0c5dc5b17b1dfc84d6be72ac705b41f82157593996f7b95b6362e7227f1a4b1213e473c1f6eb3014f2c79f255a00b3ff7d9aad362a88eb5aaed14b9a620ffd3abb2301feac7cbeb7728b261ee6e877da45d28e6554f736273879833b0d8f11ff04b44753130bf7e5e340303a20d5c21c5659f48e3c3d1c566eccc2b5c57cc7d215ecb8adc6cbaad1eb2dedce4dfa5cf2888cd307718b9980ea17b6b3c559b955b19534207a2ef5ec1ee270a69e417e5d6bece4a62f594e94ceae0ed182833cb7d58633d24d676d1c009be9f52d655c656ea5bd938f1459d9b8405aeb0317d6d4d14cf2c7de2146696a64bf\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 606657c39ae419347af5117fee8d9b8f28866aa59e0dd7d6c2c07a24db6f500272a7766cd45e809055b4ad8a650647076034035a055e0b492a2ffeac0395ccf0a1f79b8344f6e5fb30ede7a0c75ca443b9e999aab43f902c8f85b1c3295296a599b16d5dbdb8f0b65a541d40c4fdb7a800406b56d3b01466b7097a5ef5140e283bfcd16ab7a9101a71700b490eca0a5f12b465be16e46997d03f119b25c98a3898417a433139043d11149f07e829fb7a274f8b6ad7191060dbf740806326fc62921dce846871c2800f4b3ed6936b63ef829a6509d17dd5ab71093f75afca0b32f2b81b697213a1076757fc7e2d264597bf2670b61c2fa2376f21a32aaac2dfd0ed728bfdf865762e07303c860cef78fbb4a32bbac94320bf3246eb7a9e19db4a219b88c41e86aaac68ee52a9700e734887ca4547cc5b6b2725bcd47cfce7d74eb37e7a67ef1cc2adcdd5137201a43af8c5da372c80946d8aac2bd920283bbc0cf4afe2e20572e8100134a0ce1db5422e8a2f52e0f46be3de9dc134e2a0fae6a8\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 3302b97f67d2cd9fb0298f15a375a21defb6c9b52cdbd78838d4561f0650cbe2563cb5e5ea797ca7703f551980307429bd786c5f5d15090701f1d130366cb0a93219f0396c9bf9c7bf2aceee5053553f147c15d02a0b5f00b597d01acda7a396d4f7c250cf61342a48e1bbd07b3bd3c2d47fa2da326e1c757816e47c",
     "7cd81de6e0e7ae36c99ae2fcc56bb47570a68f5507468dd40bedf2ab43eabf6fd00fb43a0e711477db4ee323300897cf11e4fbba49836f55197b9673a2433a1756fbcfc2497a4adc620e65428e29a18c80c9a86710d1634b56c296238efae7cc0ff177052ac7b2159d2c21e587752ca16ea50c3a3e50b12709535b7eac02c4f8fbb6a95d8455e472f41765a2eddc24008e74b79baa11c7073168c7b54d3168cb41353bf8011e33d02d4753bfb28c762b7c459912da6d441f4942c64fb5f6e82c351d8942c69299b07ad25b6011a7a280471bb90113bda8e450a1098c6944d048c371351b0f1fbc254f9334a6c7b26f5a1888f0c558727ad05da09539ec9966b5adb1f6dc\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 22609a0bccdaf1e08cef04569a12655f58a9d5a43f83cf9f979e3a358c67a1e444d104a656aaebf8f7627870799435c292ac4655edcdc427a0b618781268a9664fac3a2ea481d3b62b3fcc37f0a473ce47090bc6f3fb2a3d80db8883b99f26c3da4a9e9b1902b2d0dc4643c8d9f47c105f8efa57bf8aaafbc96ab3094d49792d0edd751bf028611c1a5fa38319514bd34fbd19a837cd328f0a77b39e7f56f1c76d1e2ad9594251ad8c7741e958371a5737aa272d0dcb6674ea36440c807e57f95edbb182236bb5af45cf17d8649e33cec6e594b5d0e609fd7fd74c53358f9aa320df99c2fa38f69caa1fc333e4cc5d0bcf8a4c4b6d2ed237748eb1886e5a9f155aac9e86dcf798caecaf3d8e83fcdcf1dad4c2e304e288aa925ed68a3ed672c78fe3477f2f59510ced468965d90c88b1d7eeda4d7a6c5f6cfb418231343d2838d96f6152f9963ecc68684d5e5572cdc3b7cd237c3307b7ab72c810a5832ed907e275fe67b267d022c4dde029aa840bea6870f3ad29524a097f9060cfea3a73fc\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = a79686ec88818d6266f1fb06991ade5719ac10a7b0ecce5694dd76aea13fdcf32d620c290350839782f8083af7e73eb65a41d7a908644c6a28d6b9ffadc9545127eb1827468aa6f39a2f04308099480f79c37282e9d7f0545f6214bce22534cdf131c5bfc148562e45545beacab5568d3ce1615ad3ba0c48a93a3ccc72ec11ed32b770a3d435e5ecaa6f013cace1e04b8167dde67b97dfcf4c6434fc50bc53494d6252b70de6d48370aa80b8efd667993cc559791c0f60dd8e324a578a50507a2b36255c47871659e1c96148b17d9d2dfc453db34277a9ff395b828d627bd80083d44b594257a1b7741bd0b0865cbb0b6073d2b7e2a1158db00a20d652786937ed861e6775b551ff3ea78419ff4287a1d680981962f34d2c57a7ff0b8bfcbfe10e5c1a42e58e624971a53d59e1985b215a48a36ca8b4f2977b713baf9066ac3a98fef9775c97e248c53c3f425552050c29fe1eb05e31132806b7b7660da08ed9833ee43e7fe8f8d50325cfc1f6e54bc34b9b5994548516a980df38b9f61747fb\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 5a4eaf5cc897db7ed7dbd6a57519a06247b0c9c229f7bb1c6c6561858bca7552d56590821e22591218ca5edce82972f58cecd65804e048bbfe48df1934501d4ae5bcb8d50a0a12778540cd5354cbba91875ea70dd0f5057d808528f8c5600ee33c38ea7910f881e45ddd4db2ea933547db764769ca54bab59f3f9559b4d4e2d439462762fad169bf0e04cfc377b3f144924514c32d82e0a53e870ee0855d4ec96393c0eba5fa5fc5debe3d384debd1b61b33509f17da3bd95baeb0c43940924a11124d95d274e67df9e697c2b8133231f2f33aa5d6cc6f41b2962292c97465926bc8569a907c28b54fa6b6d2fd89c409da1b11d23a5f6c53ed82043fdaac6c0e4098daf8a27569d58b87b4597a25134ae45a8e1e6f1871d3310e56eca5894fcaa946e9a5844813e2ef31931dd105a3696bf04e4defef88c5c5a1cbe6bda766804a8e99c82474bdbc2ec344bc2de0575ff90a50d39f6446b99092cde226a81ac82f3688ecdbd527f37cb48490614022e2e961dc1ecbbac819cdcd1ed836a3a344\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 4b5ee510deba57cbbf954949f999d27fc760ad542eb46689672abbc8a9f56b3d2ed8d175a341686671ab4946655b7231fd2ecc8166781329f1f427dd2f937cadcb752bcc459fd51cf6d50721736a18d19387f0beb3b1c07f24bcc162b89803f58ebbebc35485505e834d9f5b69ebdc3428fd64aa70ac45d13765a89594f36498b5092fa8b8f5f0c359c2128af55530746375745966081040842f51894aec7f54a500b4e16525c264f587a3db0c2567fb431cc6d4efeeaf64df4328055c7b5d689f656bbbc221ee003a47ad35dc16655763c90633394ab8b584cfac31f81c90ac72e19dc800f2a5ae2fdbc2f839e56aa60558aba3868f835967d2610ba6214acc3f9d256bea014cbdc8c45a83d37fff6fcd59a7b561782123bcf2d41e15b7e08e7c247053d6114e951b5a50fc6e0b6281aa366f919cc36068fda6f9b228ae866cdd62a108ed151c42fd209bc4088cb6c03767bae21f310c37065fa66f0dffe8f4a8ca90b0d936888fc5e0401072780f54505f20e927be377a709ad13ed6d3fcc0\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 991e95287bb7b68da9337b8d5d615a7d18315a8b2a1023deeffa4f54728a1a0e86f4f70ffc2ec884eea8a7e6438656b96b6f60b5cbe724ccd58c7f94037bd458a24ced5ee99b57fa1df9fe91082dba94121e6bf34c5440e5b286af25ea23aa5295da4a4edd441d8898eea42606aee4f646980c3fa4b99da3cfd1383188fa3e5db7e464360d57ba32f94583f317bdc7c8679b793009f25063a948366be29e04e2a5e4e18384bab0c3c5dd25a9c015c5946b606b8e8934a831c674cc228b9cde32d090bd575ab306c7f88ac0ab610a4e4b81db9b54e9000bae8b8cc411297d7902bf219d3c5137a6c402a7723863bd3347293369db5916ee72250e8f699e0bf2717fc07c9550e875fa125ab902fc8d8df07df501a35e7146676480677587049090739721b9a655bed7737ff664def6cb4eed10466a264a83f3504e8ca057e98e9013837b221970549f40e48fe5c2637c4c5463d7a29371c5283111f1583c3639eaeac24b66aedddfca15404f71309f441196373dc4ab6419b9858131842950ad08\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 9a8b5757e7be4efb98d03e5a6d7e8cae4a3764168bb2e0854b1c95b4c0946318ab46fcafaef9f1859efe369c7bd3ea1bdb7bd3e119425ce9de08f5c2c2c2c036b1e01632d6582f86bba5b0aacb210c99aba26c96f1f3d5897617b5a5865e9999f6375bc8436073d631801a76881a6af0348759be5bbe2efcfc31416cc51ffdcecd0dc40f41247911f0b6b98a580792c68120bc3a662f0268dd84e8e7feee9634b590257020b8d1698510cac27c586a2ec72ea743fb2951ed79ae3e0a801a4a35361a37fcd1f8c4be9e06ee6e70481adad57d9fcf2baeb8820acba99b09549a3c44d78e17849a57c8ce356c823deff5597c8b6098b610f7c323693920fa088ca307ef3fb23b4730508bed46f575c83b2e7ed70ee9bf29c90ab7dd123a359280245dd7930363a0c2ea0ac1eab83225ba1cabaf5f57ba9c0a26a86242b3c09cc71533317dc5f1b4a410a9af00c14af4103ec6eb61ced21f3b115eb40c0b7a4a2d4667451cbd76074671e1c8ac3797ecddb82c55ea1c2309db5c4c9cc6ce6aa59fe3\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 0392ad8b60f892220f5ebd2ac686ba3bc49840dc8e54fcf21f8e8a656ca0c53ed0020c9d512d5aba3f3b8df0ea3c65ac066deeac64111af27d7f7759900280f3cd554ac91016f341bc089ca022bd1d772a1dc99ef9130cdd0bdead74f65d08cb1097c9b5745bf28141cfb6dd17c3587c549e06fe37325a51df08a15c1bf817760f6b4d6c3bf6d49b949e97272de6700e3a82a856ed06cdb3d0eaf6e74d6c9a5e6b2da5bb6b3b162baf291a78e0ce082b58057fe92de538672ae21c19e215e337d4ba7e6b878f269be166e6834d8670fcdbffe7676bca15ea3bdea2ce9286d87ec21d3c538f17c17e41f653257e967c8859bf9cca349d5450af6b48355b49dd58c189816bc4da34f907df6a178768c511e645b8a6069dee23854144693045814471cbcb45e607dbc82a501d97ca7e0c0f641da3f83d69f9561731ce59cf2020002e3ceffe8371422f1318194b862617d78c79f89215733c2aab34c3dd4f1eac7815d88cf18ac9424dfaeeaa3d4262a2e1f4871704e4453d65fb9cdb82700295a7\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = b6633093d61ed6dca2c22a5d7b8e94b34249d45c6b52b8b01473b8e2b7642ef1ea0b468a6ff1299b8b09c52bd3cbc63a157af1f85b78ee2f9ec7ca2ffdb19810dc6af4c5aa062f5ca321ec5ab600eaeab6bb087307ab0f8f0da27b8e0056d5db61852634033671983ae8d3455a468100cb1e5383ff42dca3a40a9cab167c33d118f67a3ffb4fa9eba472d0b0479eee9931383b3e93ebf3cb3500ad790bc9339b1c0bf4fdc1caa43f988e31587031fde728abae75749c2341e1df58bea94a8283537e3c77192f4b280a0021fae6fbdf9c456c9b34a5103e34829a8ad337d8020c77f244db22d05814877a3009e9a1e6f8be764b9d85cdcf129611c636eec65e6a968ca1f1335d320297d9f3c948846a8ef6545abd5badfd309acb083d7c163d712ac922de783b48812669e0d062d56e9e39c411b16fff13d48e0635ffb1ed8b7a43b2431e2d059a6c3b4a73dabb1bc0d09c3937dcc0fdc32b524d6ebc5d23db7d53a33943d8b0c034ac1c5cba115dc4e27eb04a26877806a61886f33ad3032f9e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 3f25923327bf6f3a1302697fda7f9024a1a4f649675fe8d5d09d889649499baebd",
     "6ba47b49782b04284d7cd00a863e6c10cee1268854bc884bc1061a8d8214f1326f95019026a6dcb6592b9bca412ef144252a66665f137bdb5fa5a39d13de8808afc9dfd8fd7591d180d436bf8d5f0642715b78e39eeb022cbd0d74669a755119984e255b8ea3223bfda0bb53c74c3e074f373a7c819cb0dc1b7835d27b94b240407dd5420e53fa72a4987a565880a83d242b8aa72cc902e89d7a47d9d2d74d3d3e0c4c5e1c798217fd1cb56999034773424f7a1e04547f463eb522d546a71bddf0c27229f82036391edcfaa85b32ebea83b0bc99b63eb5eea1dc614b6aec31ebc824ac6d59ab00538b919e9855e51378a82333817d20afb8128855ddee447c4653efb484524e2ef813c8ba23e3bda9824731553faa3289cbade67528884650f0c9c604129ecdd19668dacb79fcfbc4341f871845317194b0a147c86ec1225d0053209b5d4d2ee2607665c7ab28bbb156908f2f8c1f883264da65bc678669b0\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 1ca152106ad2592fa9a59024cfa7b33ef0fc9b52f1bf824f783c63ac1ef2e7accab17e5097103c4998589449398ae84a2e3368832cf7ed0647ba3d0f6ee5b8d947dad4a160e36fdab3f050371c4b332f0b4e4bc9cd7367ebc86a5fe51a8c925da97a01db87bf9d4a27992d97d2b7562d38a1fb1ba9c58dc5c423883a22190063ad60ff05c3c101485adfd95cd521e077f8b65cdbbfea945a5b212d32d0182bb1af5667adb413739e7c5582bc92845cbc17284f37b723bb8d6a77509376c492d58ed32683553bda2b7ebd24e5f83813f67b12f506e187b2db116e067d49eb1cc5e8dcd51a0da2822d2fbdea212fb631d264f255e0611c09fa43588cf92e1a3980a772560c8530f53de1c6b37cf5bf8325a915a9dea8ff1f580a657e795485d983a998e31fced4e23e92bc0974f58306eb2524cf3c8c3e592b2156e826e1fb88658eb65a947a5b2149941265faecde18bb1a2bdf7f03bb87a522278766016eb9b64dadf50d1f19c5c10632ca1f107d03b421abc217d3a07ddeb3b941eba59d37d5\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 819801441de0c512f558942ffb97c590b1fea96059f83f626fdc0ffbbecd334da7b9acfdb8ce52829cf05f046f57a083de44312d83eb46c93e971909ff553ab9be3c42f23ca15d7b7e14ca08fe874b0db6083700577c69a5e8a3bcf6f7c36240ab92ed3deb516b1aba0533a727eb75969ace40a304e0cf2982d696c4e95e30090b14a55e078426061c5d160f5456d6e6443f730341ddaf0acf4ad0e73b60e4bfe5e2305770dd65728ce2424d79115efd8de9cc2cc79bbe1789331b9a36100e1acd528a6fb25f6f093e4a9d4d187d767370f52c2deeef9448a6c016369e9fbdeb0c85b75d44a9afee56ccf8fdee0785e3e709bb36d125aafbfa9e80e38e01cd6604c5b29351fcfbc3bc31023aeb841f5926a37f728d3d345d48e2545d5412b738050964d374e493b3634758a39a73a29f5fe41185b60fff764008efb9257dcfd84a13ac79754875834d598c9cc4bade1c0927a274fb4bcd43d8d8a6dbf2b6f386022bfc68b79a13ecd608645a4d5dd5489935e221dbb767e760fda20b0c74aec6\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = bd60d3822203c14ba38ab4a83f40cae9dea49fc813a2922110244644eec6cbf63a293b5b7cd907705082c9349cd862f6f417d8d401d9c84c1dd39091c8288212c7b9b6ede28fd84fac25afc707ede9ddf3f7275b75ba946d2c9d75a2e26c712b20f704f3369b6c21d9c2a4ff3d691970055fd4b9d42f53c8040ff307aeab32c957973857843cc7ef2a3a2c86fada1ffedffa21dca1a343abc4f66c5944087096e3e4b6ce3adf9094c62d7dba4c615d7f60b13cbf445210186295fd55929ca296af79208f6f3e95945507e094ea927aa5c24316d8049f960cde93f221a018e42f772b765146f436aaaf003a0a4404b65861b86f299cc1d3b85dfdd19512632e513f282e06ad0c0e063950f1e34d612f8671a67724012597d080211cb310b162370026016db8f3ed378214ea76694c335723348f045b953467d86a13a26abe92194894f32b440bd247d81fbca4b1eb88e6175527f7cf454f7065ae5a0c5360d5f709969deeea42b2de830c2d346192d38589aba7c493e8329077deb6a2ea55f714\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 59ce93a93ff164f56ac01663ac9489ca65b071391a24fa7c70d4434d5a8be4a815ae3c84b6112429f69809f0895a3a35546630a74ba8a9c293900cb9e55e6d7ecae3a5c67471efe91e13246a04ae6b41886b338451f681597574bb3ed36a732655e8c32c819a82fcab17ab919a57a5d0f670c164bb02718017f99b5a6f45b5c0babdcd2b5d5fcf39f763f87fff70dc8cae554d1eb91cd9aed7b54f70e44e2d045602855e1a8b98f48b93da66e60c20084eeffe77a4fb5426b382505f8af60d97b7baa46921127dfd413b44bd26bf6453e10a849341677d809a831a68e24235af3a28481224fd114afc88ea74266671295e0e8d132f83f2a9f534b704418997fd51ae3f8eb0bd1353b1e396cbacd5b028d0323ef115c6c35af47c138f1e2d87ee03e418a9d02b95647e551037f263779322f1e9ed29f66432f3e71b1010b07951e0f155ccc4c3553602ab28551b6887530b7a066baeddb111f90fab9ff18eacd2f48127b1ffda4130f66f15c69593552fd6c8e2c0add716bcd8f4c23caa9341b5\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 5f2eb84a45b5c17a89eb1337b0ca5d7f13314a850e5607e1348b1bf1afad9e278454ac3bd3367c36c8ab22d1b3d8e16c364e0ab79c9ca91383c3ff68b8601faaf797f3721551a5f422594a8e96069ee1b7a698a86898cdd5e1b33d3fd108c74bab7c1e08a17a47d7f2195bdf1644ce12d6c5d4157a03be9019e439da230deea8972e360fcb3ba2b59c6e9fa514a26c00791af0dd5401cb01169a333ecc2216d2e0b603a52cb1fa09fe530324bd3e19f868c8c5b4cec1a07877543ee1b68bcdca734a6cf8f28bd57cf41f306f55fc759c193a6225893b3df93cf909de46a9a0eb80c58f80a74e11e78217489409579ab2a53ac7e0f615bd2e3f875e9abd2fc9046db342415b452ef112b7367c301f3bfe7ed537b5659302dc49fd22a8b0ddd8246fd5259b1f98bc857e4d4bc489db04d41379d82f81ceb2e3ef0a24defbbf027be3ece8af03e4e1b0323dccff2633183397289545988b0524b30ee637bc2fcfacb7cf97e57dcc78fc507d02cfdb4e3e1306888d1adc4d5a7d2c12d12c3e2f0d69\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 4da5ce126030a6df46e78cdf2c25b9e81c394b2ab1eb72128ba36e1ce978738830dea1af9cb743d037c0391feb51e3562a117b5bee96335495fed5e0969f26a25580a549e1299baf27f44253aad62b532524aeae684b0f989a0c5997ad35e66b8f4ec2501869b8c7a4161a126fb2594c728c96b97f0f52d29d1c50bee8db7358d5aed88117d262cc790e912403a332c5585195d815a84c8fef117f16c101fd12f51dba843c2e28b758e05b1fe47d738299a120b179703bb8116c50a9caa38799ab377307ed51c185d0ff54206e8b45215a5670d3a408dfdcfef08de0282d59fc33ac76c733d2e00c3a205b571dbf62c1e330d0948397a6a4f7cfea31ef6a297e7308a56bb48260cfbdc497d30956c976deae81604ecaf9ceacf056fccdc9e5d0c8ca1a0de2e7faa24aa0ddc97ca75d5e19e07a614e404ed0ea318bd04ce8866ab6db1f7ea6e65316582e3f8f23e9d9f258104da3cb9c3e8b2424642fea70b5de0b372e1b1ad15c1c97b67be227788bd1484d624d652a665cfbbac148ac4eb1c4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = c43f9e1991771364c2ae0e3fe7f0c5a30e39e998a7e1b293209a2bdd14dd1cfa14356288bf9f71056a0cf724b8e9242b6ad5f6947437051b9e09afb610b5a785f872f40d0ecf76417c38c2957e92d0ab43f77da2cd548e324ef96d87b78952e490e3d44f32125e62482eecdaf448a7a0a70df5b275b086dae02925d64216b25861017c73ffad338647133784b3629519245e830b11d2a9dc50385167b9cc698fa52ad02c5ed1d876f96cc1e425cd0d1f428c78227db88cdb0a9031dc555130a464d224e23ce8a53f41d3834bd414bf98657bd310e411a464875fb7cb12927cd30d2471171fe843c7f2d34160997dac0b91e9a3204b2d46909beaf50482d17758e088b392b1354e26a3ce8fd30afd35327056c432af2f4d0806b47c57183fe6172f9e2af390b2dd02e63d99a920c676c8e9b053e9544f3f01f75f0fa47646887ebdf8b677cb9855e49fd41587907accfbfc76712627af36d53253c3cf396e8ca0c756deafc025267e602af5648f068441e31b77773a0eb6b0be51b162941372d0\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 953969d3123d65c166431050330fbbb6927723a3315f714b6ed05c26b733b88c5ee3ca8d03515a7f3c7a6db910647b0243084bdcc3606799c7844b59faba014e8715b766dba6ba11cbe86eb7dea482af06558a87e51a9e4bd753bdbd01205bee4d3ba127063c0396477b600e44fb290a22241a4e1ff0091af1e93841ea3cf175b09aff11b81d9decfa5259165f4b7417067fc491fe816c700f3205eecd8b296f0d4047df2744843a1d8ebf774226a74e33b29c6a95750cd532b868713c1df0096bc9daaa57f21a7879d0f007c247c516de49fe3890934b71c2400646a983c688f1ad176891a79a87ec4955ef3e22c089c14e5b014f90de8f2ea1244effbe28fe001d6f80d09d2643f19e3bd09a8723267dee93ccb37ec58e10ae4725bd87b85a6268df03e98c5ab3227ed0009bbd4b9c338cc7089cb66228f626e2e12de47391ce49620c50fef3cdf1bf6bc0c068d81c3c776fa4b69b422b2fd5775535bbbb82c652519266fe45252f7ccb75f820690c91c1fb7430b8086aa10268fe226c9c79\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 5dc333cac75cf3da3e0a3bc580d5305ab08b11b10b8a4ddc4df54a6c08dcd21bea3c83178db7c3a9f1581a6db19972c2924ed07705045f0dc72bf60304e0f9f140986ad024aa4791f6b4e903a3c1f8e33f61268feea185a1b0f7690b80924ea06362ff9821ef7e39447bae69fda7671d11171dbbc6cb60d0e95bada53bd7a81e8a9188b4eb63d573bec3973d286777278fc4a4c7aea62267ea0c268a5498d2e989de4e4472c46a2d5961fd4a9a75d81e23e73770014b01721a09c05b39a1bcc1913a9a",
     "aa0c1f7e54859a86ed3f1dbcb5e4371658c640961927c2719109a964bea77b037d82a08ce241938ce0ca349590b9a5644c3c8f22b250bbff4aaa5731fec8ec554af2c3ea743effe2b42e30ff4ff181f8e6552c11b87090356b8d7597ba0d97059dfd77c300db534d6f660f6ae9163ea6d24a1543f5dcb691ef1fb9b917b7980660e223524ead8ea1d7b4dc29f1e542122361b4688c93f15434e52b791059650c99d97e09a3cf15e7dccadc95224478ea4c90615d654e51ca9433357835\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = fa00dcf88d38cfdbd67c16db4fe513720bc05e8649e1766e790ddd0ea86cf0977215d36e4d735c2115227dfd62acf808e3839209114929b6fe36864ec3e1d66024b62763acecfe3adf322168b340d839dbbb5e62d2196868dfd975a7a0eea51610df9a5202b0c7037afc6ba5b68d93bd9446f5a9ff1c27945852bf7c1b1aaaa8a1ff9fe3604fe120be2df2d8f1bef9bc049fb667459c487000c59b6f54bb8edf409521c5f87795f3782645a2c42b5136f281875e4193097edc2a284ee6f8981d637a276dcca9fe5cf990763648845e5cf874d56c57d6c49dd003a929672c8c2dc8cf96844bcc9d284a20f8449f8ea18ef2b6128cc49f6931623bff00e85c1f229ee9a9544ff2751766e5687ecd72ec6226ba5c5284771e57574cd65015940db4d4c88cbc3438d8ae0ae420d3962765bc7cdc92481ffc3e22ef0dc3c4cbefdc147639fc93029d68985e6efe7e9b10a223e3eb7988d2614c6f3c4b84fc84fa6c39667ae2054fed4af3be503ff186d64ca9cef2e9771c011a21074e5c6209cd08df\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 00003302b97f67d2cd9fb0298f15a375a21defb6c9b52cdbd78838d4561f0650cbe2563cb5e5ea797ca7703f551980307429bd786c5f5d15090701f1d130366cb0a93219f0396c9bf9c7bf2aceee5053553f147c15d02a0b5f00b597d01acda7a396d4f7c250cf61342a48e1bbd07b3bd3c2d47fa2da326e1c757816e47c7cd81de6e0e7ae36c99ae2fcc56bb47570a68f5507468dd40bedf2ab43eabf6fd00fb43a0e711477db4ee323300897cf11e4fbba49836f55197b9673a2433a1756fbcfc2497a4adc620e65428e29a18c80c9a86710d1634b56c296238efae7cc0ff177052ac7b2159d2c21e587752ca16ea50c3a3e50b12709535b7eac02c4f8fbb6a95d8455e472f41765a2eddc24008e74b79baa11c7073168c7b54d3168cb41353bf8011e33d02d4753bfb28c762b7c459912da6d441f4942c64fb5f6e82c351d8942c69299b07ad25b6011a7a280471bb90113bda8e450a1098c6944d048c371351b0f1fbc254f9334a6c7b26f5a1888f0c558727ad05da09539ec9966b5adb1f6dc\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 3302b97f67d2cd9fb0298f15a375a21defb6c9b52cdbd78838d4561f0650cbe2563cb5e5ea797ca7703f551980307429bd786c5f5d15090701f1d130366cb0a93219f0396c9bf9c7bf2aceee5053553f147c15d02a0b5f00b597d01acda7a396d4f7c250cf61342a48e1bbd07b3bd3c2d47fa2da326e1c757816e47c7cd81de6e0e7ae36c99ae2fcc56bb47570a68f5507468dd40bedf2ab43eabf6fd00fb43a0e711477db4ee323300897cf11e4fbba49836f55197b9673a2433a1756fbcfc2497a4adc620e65428e29a18c80c9a86710d1634b56c296238efae7cc0ff177052ac7b2159d2c21e587752ca16ea50c3a3e50b12709535b7eac02c4f8fbb6a95d8455e472f41765a2eddc24008e74b79baa11c7073168c7b54d3168cb41353bf8011e33d02d4753bfb28c762b7c459912da6d441f4942c64fb5f6e82c351d8942c69299b07ad25b6011a7a280471bb90113bda8e450a1098c6944d048c371351b0f1fbc254f9334a6c7b26f5a1888f0c558727ad05da09539ec9966b5adb1f6dc0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = 02b97f67d2cd9fb0298f15a375a21defb6c9b52cdbd78838d4561f0650cbe2563cb5e5ea797ca7703f551980307429bd786c5f5d15090701f1d130366cb0a93219f0396c9bf9c7bf2aceee5053553f147c15d02a0b5f00b597d01acda7a396d4f7c250cf61342a48e1bbd07b3bd3c2d47fa2da326e1c757816e47c7cd81de6e0e7ae36c99ae2fcc56bb47570a68f5507468dd40bedf2ab43eabf6fd00fb43a0e711477db4ee323300897cf11e4fbba49836f55197b9673a2433a1756fbcfc2497a4adc620e65428e29a18c80c9a86710d1634b56c296238efae7cc0ff177052ac7b2159d2c21e587752ca16ea50c3a3e50b12709535b7eac02c4f8fbb6a95d8455e472f41765a2eddc24008e74b79baa11c7073168c7b54d3168cb41353bf8011e33d02d4753bfb28c762b7c459912da6d441f4942c64fb5f6e82c351d8942c69299b07ad25b6011a7a280471bb90113bda8e450a1098c6944d048c371351b0f1fbc254f9334a6c7b26f5a1888f0c558727ad05da09539ec9966b5adb1f6dc\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen146 = 39041;
+static const size_t kLen162 = 39041;
 
-static const char *kData146[] = {
+static const char *kData162[] = {
     "# Imported from Wycheproof's rsa_oaep_3072_sha256_mgf1sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 72ac6bb6d9a5726e454b5430c71125c6e9ad5fd42e1c5a18a8343e9d83d72214386b2308c0b8ec5ec6759dcfcd6a21f88b8ceaf46403923eb86ac3d14a8592e95de0462e14085c3f17db005dc4fac87b4a2d1ede5cf851d5745c8651a4438c0a4d746ad72e419207964728c301bf379a01c094e9693376f721137d3dc76ee47c9790fbd590b7d6a8d626e21b277ef17a4e4f7e0171c1146e1ec324fa97f30d3a1bae08f8d5f6e92cfc121665239c429167359e9650434b29d2015190356adfee12f25b341b08f12b7fec6379598af7d5cc24fe7f00de1d47133ce3ad8b6be1c9a854e33fb952e164ac6dd2a9052186ee144ee7dd986a8f03891d0da21ed78516dcdc2ac89cdddc8b544731d66f9d89bf17a50c6d987a598b02c938dc36521b881ea994e4c8fb2ba8fd001f73335d4dd1bdbe177d3093cf3883657c9ff944e8f5c9cde548b7c1b0741929b0d74977ecda694d940aefd9d2fc75323e0b3a114b99feaf3e2518f5158d1fd9d953aa20af158e67d27e2ce2f18d97fd02f369981979]\n[e = 010001]\n[keysize = 3072]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203]\n[privateKeyPkcs8 = 308206fb020100300d06092a864886f70d0101010500048206e5308206e10201000282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b120302030100010282018072ac6bb6d9a5726e454b5430c71125c6e9ad5fd42e1c5a18a8343e9d83d72214386b2308c0b8ec5ec6759dcfcd6a21f88b8ceaf46403923eb86ac3d14a8592e95de0462e14085c3f17db005dc4fac87b4a2d1ede5cf851d5745c8651a4438c0a4d746ad72e419207964728c301bf379a01c094e9693376f721137d3dc76ee47c9790fbd590b7d6a8d626e21b277ef17a4e4f7e0171c1146e1ec324fa97f30d3a1bae08f8d5f6e92cfc121665239c429167359e9650434b29d2015190356adfee12f25b341b08f12b7fec6379598af7d5cc24fe7f00de1d47133ce3ad8b6be1c9a854e33fb952e164ac6dd2a9052186ee144ee7dd986a8f03891d0da21ed78516dcdc2ac89cdddc8b544731d66f9d89bf17a50c6d987a598b02c938dc36521b881ea994e4c8fb2ba8fd001f73335d4dd1bdbe177d3093cf3883657c9ff944e8f5c9cde548b7c1b0741929b0d74977ecda694d940aefd9d2fc75323e0b3a114b99feaf3e2518f5158d1fd9d953aa20af158e67d27e2ce2f18d97fd02f3699819790281c100f5eca16e0e83696b0ed9ac8a812545daba55f20a964c4e6343604a7f2be2860fce9fa16a1cc92120939deb88dff68550383ead851fac07ad1b2e8a9b2bb69525d96ceabb7ee83ce50f08d649107f449a14521a6893f3f3c5c5a703b2fc28bfcfe261a4f7f450558080deaeaab651c7a9ae586c1e7f5c52cda93e40aac908e4e3357984fc116af9cbe9539bc7a8d3b351a73ea5c2413d1da2e0b448b454670aca89ffe73b1401e9b8554fc3f23d6c904623251a1d29962ca9b26d973345bc4c5f0281c100cf25446f59cf512919ddbfcfa2d9670495ad92b6f295d61032057f9da6dbefc4510a623c2b47a5220082a3bc42af1a144f98c9ee4fdae41be0ec501ccc94b2b0640191099b355611160deb327e8ace018b898025ef470e4373ec1d97f669e298e1d845c6553c0a546ccb168d5b510dbe6018fd4ed9a3545f9bdb81968f4a6d7c790e5c34729a8efb496086fa1300249ab8b28f38951d7bee1c127ac3c4d0bd596edee1e9d17781dbb8227d7b5d76ce8b8bce03c5d339b9757981610848c55cdd0281c06357a59679d26801514c6940c20eb67b370e84e9f5f0f9316c0437d3cb7c843f5a6e6d9c19e8bdb3152e93f904cfe6e692f1eed27a0ada46f95601b3d122be793dad9bdd05d4f6d469105ecfc11448381dc154ddadf6bc20c649435b483585d68a527b7b967be52e35e0be9a437021c1cfa5f4771567cc233c1ce3ae99eb37daf8bd10156b4bd580a3ce9c7d391bdbb23e67363a947405c6c812cbd3dccc8b356a2dafd0d3b23a21b684b458e4ab3854bcd9be04cdc9d65ceeb10a8531c470ed0281bf04dadabfc15b1a8bdc0f566f876191088a7986f6c2b8c04ba0e0801d31cbf5d2a4139a39cec9df14ecee22e846a7d3f4a5e8eed2a70c7a4c2cf95ce74fe42c4bf60c135a264919bb4cc906ba283d1896f0ae48529b490f0c85ab03068cbfee8fa6bb6ae73b182d25cd66f5205b038b4eeaf1aafe2e1ba5de97c88d40fa1ac47626602fc90ae694734f44f3e4e88d184e8805a755ac2904be8fe9def6b7a62cc9ebcf4d7c2d6c9f9e86b2483e9bf22ce51861bbb4e73e731a4dbeba87772d290281c0214a1f73130e48b336fe01b950885ecdb3443d93e7e8ca62fb0da96bd423759d8be552c8be44f139fbee6ec24b75fbf0744fac4daabf5488fe6c3600d9b8e9a922481fc74a7a3d622662db8c85318de48ee8b716f19429fb594990da705ebdf7ef6613dd6bf885c16ad65e9fe6c280386bee976c25dbaff8fbf69baed9510be5eded3f90e0ba4a97e5c81a2189f114670745ab95edda215bd05fdc78929fa0cfe8b01c83f2aec93e3ad1a334fd85aa8794eacf955ae5dacd45b268741fca195c]\n[sha = SHA-256]\n\n# tcId = 1\nct = b47525feffb063be5201aaa1d6846f9f397589b988fa26848afb9bbd9d6b0d0c92cec327332f02bd072d53e479726faff5fb89677c4947d60d5f1d7f3bbf211755975e1851f17f0d88eb970bd14719a9e5b257cde71071915774578e0bead5f7ccd7b476732a47e0d54ef214488d733c689238f6cccd6c8be7145e0dee871fcbb504c93e1efd842b228d67fa3e303a1081e26052c6c11ca85355a2de7f717dc432a90092ff9d3d75301e7f092b3b425354939c43f0879768342242836030822c9bbbbe09d5e938fd070aac9f974c35dd46599766ac6f0f87a036a36e3650f7244a336bee4a9ed1280b8adf57d702844c739354eae88ceabd8e66338e59262ecf51b28f4dfe7bea8449383c27580f81ea06bb4bd031826e6f6ddd0c6a3c7eae23d3d6acd5f6388fd9fa70e66c86d178394953ba4e391629a9a588797e25acf8c130859cb7c9504998cce6dd9e032b1a09aba8b215b03b4343a5c0f2a8253b5543d301bd883e941786371bdad14117fa273296b153bca8ce4581df09fee1bd5e15\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 4aae8595883dedea13a1fd656405ae1a94785eb86318e181b747331019087686cb81b259f864c6a524137a316f744c0d092348fe0428e1d9551bd402404342e1df33f7491c381a4f32ae5687bfae07e1c408c3e65720f54c5a168a29df6b7fbc1835fa49ed5a8b42f2acbbdefb3cf58fb6876c2a0a710bdc5c9032018c6b326389b3c32efbd7aefa8dfde0ae7bbd829e6160cef2c8632335006baad32fa7af1fc9fc3ec5ac9c4f7af226e7561cb44338d428d97886d29009989e1d875650c9f3fa8af2a0924f93d00d2cfcaae67e8a89ef34d96afba478a250b7995e7882873bec869541c02ed46b410ab75a214f0ff08ceaed4444080a4ade6baf39aaa9d9ba52487dca33759153345538143d11af5f0ca335a2a3b94e1045da7ff690a4bd454fb788bd7c73b0b16e35ec2766024fd0b7fa44e0ca01fc61e331b1fc8b09f549a946101e2b60c339304a48d044fe231288129d2b70d6b08592288d175183e442b9aa4f5ec6eac0148b6be1f989263d3cf34a7ff265539b8e34c2117b7a1c7616\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 8f71391b8e3a079a51d015e86e0572aca134e5af782000545da1cbbb4cdfaf836542cad19bbc6aca73367dff9cd1e33631260d390b6d83882f82606e28abd2d8aa229ec1d93b4cf16599dfadd2178029360ef5a3bea6a136cd437f59289d334f20e7bae91ecca18b7e4fa5e3613e489ec806a52bc4727333bd7ebd5bcc7568f697d4013d0f6f54caf1baf36791fd21f8ce84643031ffe474901920eb4f592ffa306a979edfd6c287ee5b1fb0005a21d840372c60a649a1702fbc46489211700e8262bb1a2f54fd38da6a07e15850405a277705a66e7088b98bfaee8b2b51992797d5e5712147b756367170b6fde26c3fb5988ee07f916d189a3a18cdc0f3b1affe63538cbc187d4bfdcf5149b4d26bb207a1495d51a2ee1c2415f4a0d6434d50953ff2fe8480d276491ca1468e86c2318e94087e984444b04e7b804cb1f62c66573e82fa6800ac3a42ce0d8e5909f3dfba024a40c51b21b5455836a9244eeba25157e24676e1a317d1af9bf4773913ec3ba6ed1df50d3810eb98bcd290757daa\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 157562f61b512b11b02d1f8299e62f55ffb9c1cb5facb33c75fee79ea8bfb68314d48a7868c05b8c97de4af54e4960868a694a3c302c73195a8acfdc78137231dc960dab44bad191c4bb2b9f8b162a73799ba2083d93c55b425f5857c925f2aea6af19514825fb18724555a5b11ef553889af38c7585c35033d1",
     "eb9b71e56ec0a1a1185e4e6e5b7aab351404f0d4a4416023449d84f3bebdf57d5666ffaea80be1958be5d7da7ad2c081aa338203516aba1e11642192aa4024e5fed6119aad7456bf13c2dd561c4ac9ac887eeaf4b53bf15e007b043de9abd6619a6fad5df35a336f744d5034af72a6ceecb9305da973c50615c29b98a8d0afa8c54f5cfe80f8efba51b08cf921cf55c69314523619e753f3056ee704a947c24d12e8817d5312ea5f6d8444da4061d26f18ab660f0eb88019506eda480195395e6e948d42e96c3ac8723f5514d87da3bc47432ab60e93efd8e6100589318f1b85d1c4bd04820be2892a8acca1e3633950b111859c6ee2063cc061a44a737ffaa2c158da806864\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 7c741c6f511fb2eeef9ce3dd89269e991cec00f0ceab514a1780c0ea2e06261259652bbc5e46871780d0c03f933d2a3e4a482ad95bf346f7402509a3234617ff36bd50070e2278e77728ebb27eec2b1573c76ec52a25d921b1a6372ee6200dec65575324588203fc3635948e856cd47a857cbfa8d2fbbd046df850ecb1582d7ecf531f4f6f390b725703a58e82947141179811651588d6b13ea9fa09d138d71afac2b24b82c48ebf0e5dfdfc2a700d93d396c8ed4f78846797dff44535b39d176ec2d0124dd61b29d36a314631aa2a7d25015a06c0e30e2dbb011045115d6d705f06b593a22f3f6921806acb1c8a4460cad9104a78ce9c18e940fdaba39a6451a10a54aedc3cf31ad505fa889ccced290dfae89743722527324ef6131b7ff0880d90ebbf803fd798567ba0e07ecaec6c6ab2b3257688d2c374cc3e48137ff81a66c504a8aed98ff76ff057ae39ac67485b17abe4e16d6fb5b64a5d7c3303137ee286cb6ec53a86511cb224eaf47a59045529ed6049e3bdedf619007eefe4094c\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 76efadf7cc972062cddb8c0eb6789d1422632751dbfd514d3e8a4cfaeb17e07d78244aba11bd078fa4fe3da077f1b6b2a6bb161dffc4d96245b6d24acbddb56a2245146699ef629a069d73ea233dc3994f93bdbc208f6f53d4d74e47cc0ac167ca7912c915842d9113e75da6b2492608412e7fc2a577fd3621a1107c1d1c5e74d3a0aac4cfbf389c88474aa37be31d18fcad2f750c1b176f2c1ff544f5d23fd3e1a3c4507e62d5a2c2e0fb1bb426f860f84c4de0a2ac63f90e3a6e266504389e96b37a16ac03fff70f3bc4488b3ef783bea505911512b7d04abee4ce52b0100727e563f8416e9c6f889e5436b27388cd6d7c4e2ffda6896688f8ce15167e8baff14ce9ab95caee52a5fdc51515fca66b646af8aee83e0aed730bbf2af2a966f330818dc33d4662e4dffd50025cbf77efe6ffb3c6cfa24420f55a418d08b675dd85f7aba3da35cbadd290482af1e7a0c2b7034a41bc28a5e3dc2c47e78fb46ef14dc4674c65f5cacd17e4f542a9b98ec268bc977eb97045f50c714ad7a49c0e84\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 0351794ac968e26863bfa67aa4d602c725b79ca9a4cd907a9e03c7575b975bfd99fa491b5bc3f93e1eac5b48d95090e10a29d9e4edce709c74886ee2d5067bcabab044e239cb4c23e1ffa8a8666fbdc706ecf49225697fb6f1a095e20dcca49090548d9fd0b8533b090823a76ce6c8c8a139a20b3e930a8d2ef8d868fd92c086c06a86c172e40e76f9920a6de6ab2fbff2cbe029b685dbc20da94e84442050b0128200446bf227eca935e1bfa8c89ec3454ea3a82cc792a2512d8513f2ddaf172e35e735ad69a5f892ad0c216e84ea9e92129d8272db269173cbc525e61fdfa5533e2e69a4670ed95f4958c684476c208002667fc7f687260eb54d9cea88bbfeb7b6d7aa640cf0ad0af22ecae17034c762bf832a9e8ef090926c5ad4fe6a15b6e5ef69da001bb7fbc608bc024bcf38e157dbb57974169bdf302ec177e48d15a1d0c919d9b8862cd91d454a96df1c720561928e282b9e922d0d8218d65b74bb740cb7cf7455e97a5e6bba07424382c31c37549d7f29bf7e2e23093ee861dce0ef\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 7a9f4a75375002889bb9c4cafe5f044e2f28997474465251246788e51b0cd5c52c809a69f1ccef4c11723af030fb698a641b98b88b39c152e741b8ee29b13857ec144f200c669010a657441701e929ed7df195669197f46909acc69388128bb75645f270f20df256f0d0c0ed488efcf26c44e4d4e54a8757f6c5bc7008c68b7fec43778743a76a890d383e2983a754095224c56862b4b62e20f112d1bd96f30a3e66a20b01069c0ed9730f9f7de6cb13e2272640ca5cf807e64f44297e3e58ee9331e1f04610694a0d5be7006f96747cf730ff3fc4bf8884b3f9f0cba9c4a8f38a01b225b083d77516d46ade258242b0ea4f367bcdff490e2f127f013808cfeed451aa7c0f64b3156fc968507ec7c80572693d154b924fe18dfea946d52da81a5ad0bfb5fac7010ed5b4f18a0bd1ef400a2804b9ca2b2dd0bb8b8b402952949bba935b674c4863ea4a9e38dd701d23c71e29b4a7c695856db5978b7e3c964ad8fd4decb1cb5eb3f83e8ef0be4e5fefd27f8604b1d6fa06dd4f97110317bb19d9\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 1f1ef3e2956c31f6b98fb4141a42fb2b1a14331b5591f40b5f34fb3cff536753eed85f9c54f24c76b29cf7010875b17e2bdadddffe230d411c87718a5f0cdbe6c120ade66b2171949bcf7df65e6c687249c0dedcd358c38aa1b61867e2435c478f46be8853906cc08741a1c092c2fc577a0b8a32c818434575b54bd58e17fcd1a6f910b185df53449fa88a777f1f795a89eee2586c1cacd4d1277333ca2ebbe0430190289665c3efea05871227670fd07250652a1dd2afa6ed9c295ebc68b15a254725dd6006d28aec6b1acdafba69247790ceacedf5eff437d569a71e5564d6ec6c90d295e225fbf525e76b2e466985482927345737eabfa34046ef618494af1c847b1d819f2f99b15c13b8e817d437db38a574f66da845f54895710f1b685cbdd83fbff9835a26de074c5b1712d98d4e036c9720d921739b8f3dc320f1d266ae5b367b92f5e33ae28a7a06f727f2df5437e55c325cb233c801ddf6b12240ccd0b8db8c31a5ca652cd0e33bc1087f4bbd70a0142617903956443f4ccea5cd93\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 85186e5bd121796c604ceeaebe2f12fe87f41f502c2622f0ac8599428f556f7ddba82355e65dde44fe1691b7901fcf6ed83fb837c1f7ca549b2565da1a249dc717c245a9c6362c8e831ee4156dfdec6d9e19ee500243edf4419d152c643360e35935d88a0364b28038cbab30d23f6571053be99e0e405538c54a71c4483caa328a8a49b1e9a5ab0172d429b5635fa7cc11f5703bb95536d218bdb4ed555a2b1b71c717bd65e3607dfd7e7cfc1fa7f42e72a5daae3e6bd694a4a6194bce970cf102bafc5573b8de18544080db3e89a753b9245ed9cf7a17282017c8276bfbe737bf0d802a7d2e9a9fb5f373f9760708211f9b7a99d3dce0becfa77c96b1f5fe1c4ae8cb2b4f7c741e90e4bd2fd1b93648252e4576b5670d51e86068497ddf162a80dbc2a16b73e16e3661f31a8f2fdbb66764a70a1cec5e0e247e38f3fe95949a5742b1987280ba9d4afe69cd00fe10feee87b9d0b40a2e94fc042a4a51474d7e162a1e7261b2791f8af2af6978bb87ea1059553af71777fd04fb92c4fecab972\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 6aa169ad089b2cd0c5c0d0742e452c4f1bfe9aa04f4df93eeb38ad6de8cc93da66af9ba589352446b8c3a5797cb0fb8b0b6d6b6fca1f9ae4d508951bf0b526a9433a9b26b5cee4aa943f0d2c0d94c479ef8f99e2bb680aa4bddef38ef607ce2770f4d60629ebfabdd9fc20c6b88c8a02179dce5e9ad9beb90cf75baf5980edbd5b92794bdf9bc58dcc44a13b181179e92fa394152506845188b80aedc2fe559a3bbc289b933fa2cddefe080817f6fb3f1e8f585389ebbef06c3376caa975c07efe683a32e64917566645330dca75480e7ad2eae5b4505b6ad5233e7cf4c3d8677e0350b8e1db4cbfd73344e14f458f49849cd991d3b4fd19061bf25784e17b04230b9a1db1637a7b8c0f4e3bfe00952201c039483551931f84980bf8a633a1bbf4b609ad64ac6d26514c869c1d7b915b223356fbb07fad300cc9a8e6c768927a857c7e9a58b0d784a04e24082a393e65f098ff211dcde8a5155550c18bb22d64d324224d77e150bf424262f17827f13920ec7df259ccfba158766b0b52bf25b9\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 5e6a85d2e4ebae323cdf919e12ac8e5028e0bd12501c5c81f2a30daa39a0ce15ed25e705c59edab7e53895e9a4b60b0a0c75f11d984a5cdc45d8f300398868c76c973e5d47f50831cbe994c5c76633574bde9f274bde95f5f4c7a05c7c74f59718e152c182b4dc9f86ec3a677d824ac63d33aa5dfd7d695bc409a3f22d84b4d75effa7c80b64647b1344e948087aecbbfbc607b667611fd7c3f847ce223d0ce6ee131f75eee01cad17131b5de821fa7d6b458cf989e3005ecf6fcd1f6cd022162c2963e05893912cdfa9b06634ae0e040a73284414a9a6d8f8ac2e23b51ddcb108586216bcee3f07c7b1abc84c41b98cede33d5c4ab8f8259aa0c52a4b6cbb754aa21c2b2ebe83962039651c9159ec65da43458f6ff397d9503d41ee102d0456ec58b1b8e28febdba82dc92e5e6941a097c8e406559f8410974fafbb77a9f72b0566bde813306b1a7df7603f731e8982f1730b95f9e541b29eed40fa85978044067650c55ead01240e58c456d9416145b0124170f10675e22d32920e91c11784\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 61a595dcd055dedd65419ed49aa559d1bab787f1d38ff2b2ca65baae8439bf",
     "2a6afa3cd590f450b42962d84919d29f3d9c11a2586be563163b0a16a4f182029568939068003b3cfabe21ff2c6b7864fc2f6dfbe31bcfd32a1cbf3f0333477401f2d469b6ba8a7509d7e832df96bc0dd71e3c0d2979ec479609db9c19d8cbc99682d5ba09a8dab54c1ef4f3257919c3912aee52376bf3dc4ba4de5d9362b6c197779308ecde992bfcdc6ac658aeb01d5112fe592ca8665641d1e09dfef06ceba48ce18cf6b8ca0edb966246f04705574bc72c163ff7b28c149376bf6302acd2dc687667a9df54b4796941ec1aa9ee96e484e34429ee3a48e8a8a0a912569490190656207dd2a933ce212e229314fd51ba3fe505db2d10a0d29b5f54af042b4aaaaf3b548f38837b95d61739a895fdab837efe422db7fc71ae4652ba5319ba383fc459c7d0115c32b1c99df909cc3722e549e3119e0b47061eb96e714522b8b64cd5841967d43cc5f700a197ef0ad5c7c2e064fee98c461690b0fade7ff42e3f11\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 5c7b1e592ecfb9b230ab893e72c80dd0f762e62227686a1978cfabb3b961c490ee18a68174ef713f4dacddfc392fa0862e55e48cd084199f702507cb1ff8352ad67fa9c128a5d2738382973a65a6302b169a94d977b242ae57edf951c3ec1a368ed5a580ce6755709e722f5a8bc0c6844c53e8f72748f5123ad8773485eaa9a52446bafeb59193b1a95fbe6a8fe876abe6d26c161d8d3b56d5f47cd3b9912e9e3d283ff8d459f99348fd5d81a20bcb4792717b48af6a455333b99aa6b34e9e2f8252be8d51256a30af1209d7c33b55238c72b92fb08f216eb598a99fdc4d660307770a19045fc5e21e2b6e67df5cb3e8a2aa7b7997cf0eeb5324e86a952704beda65502e29b423222bc68184e4e18e3bd1efc4cd0d371eee26f2472184edf302701c0dc869cfd10937ec9d720f0b09c9e663d4e528ed257bf03a6bb7edacf03ea5796c5fccfe6f99cf8ad9b487db1bb228130afbb468d289230366e3890ae1b9561ee44d8fe019eff7ab5a6b2179e142616f9e2dc0c753e570185264253f180c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 2595c4281b17918f228519968ca6882fd7abc6de23a3beb223391548f6c856e99d497778dfdd24f4a91a63564e0e059056977ec4f621994ed67135ae72392e35a3b80b21ef4ce5ef01cb72faf38159b78a7e395eef3525872d6fcb7b97124be06ebd9c78110227ba0108e5d681d9415801b70384822cc24f0cae597da0f161077940fdfee3978a420907b0fd66dd64a8f4231cd963a1a36331dba563922675280457ad17d8a9a051f0852f2d0a69044fd501f1e29c4fdf9ad5957e249ef72963d678ebca418f08a73b8c16ce683b146ee731da35a48057ce41b309ef6ed90865e59e3477e23d7bbc8e5da47ca9c890772f7a5523ef181af764a4d05781db1e8a856b09478acd29c273f3bb7b52a7926bfcf43326a6bea8678151ee6235cf8e94696e174552ba644867824d9bdbaffdfe6e82ae8dce01674ac44d636f6ce97e926f1da2fb4bc941fea2592cbcae57769cfebc519c77c1fa9559f3c13fea9a3fc985ccdd02aef5d977b7aee39ee424c8cf4e0f522d5f50e9981e3b58f33713bca6\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 2db9c10038f4912d0d2011c0a684a3b918eda30b238660865c3047285390cbf019eb7bb0eb17c1c94f956eae46ec8f6f86b4a800ad7dbbeba616e392ddc7e5cc1bdac3433b57e73b48a27e62c59de1da90a8960f3d7010792af056407060ac39d6c200c89e9e0f10668962bcd13506b58b0447424c0e50b27b3a5e501dd35470681dd6f88a05903f4a9f42e9e4440a998a9ec6c575b0472452fc2f7816fedfbe7b9335cb3d9dc84bf54ed5e8bc89a69aba9ce9507e388fa8ff2ff2af86c6ef6f385c7ca2a18714a3652721c00768d8024207d8ef89b4cbe181e645ae1fc906620a7a9890ccedf3b70a08bd90c4acd3b2213e75ad7a6725eadcb6b7a57bdb5cad2ad599991800ab4f7e8e875a2c722bacb09346853dfcb293f213e4d5612458441fb923615b5bd9ca7b38a1bf2578657858ccf0ab002de62f04c195f3588db29c6ecd74815a48c0d7ba9808750dc2569621878f5cdab99c8ae361fceb0f0440ee4c896cddf709dbe0b3d3a6a643cf98b31e40296174ebe7f9fc25805bd6fe8328\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 5552caabf0e33c74402cb8d9cc43fbee119055f8e5a9169d8fa3eb5bd2fdf2f9fb72a9d190ba067eb625da0415b9e2127a85aefd9ff61dfdc42a6d252101aaaa3c11703115298c8893737ab8123c675a65f7db661273b936ffd0f3a5cf5dad3d732b749c83705a90d03e1eb1845c4a37fefa7d1c10da277de8437d44d9c448ab38433985a1b9a24697bbae2dfa875cb033e57527fedb17dca5102683c907b82a4aad66345da3031167fcf6a333a9bc4006934409c7141c70ba0bc3915b2a5579a351a8a6d7613fffeb014fecc6dc9937b1311970e71f45968c890521fdc2167b80155619b575019b563601d8fd6c14c261f64b9d5056ab189a9730dc157f69ac75ffcb8cf2fafa06db43ec91f583ec085c6dda8b0dbd48df33e2aa84eb5bbd77b39334d3dae4dc4b63da5132d69c0879639db22f84b29fe9e03b0102c95c339bf85cecbc564091d9168d93e92f1930617687adf56988cb89b69c367632cca798372b89002bec586e92609c021273a1cc4bd596342d6fd7fcf4911b3ccafee359\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 11e958a24a754abf620bfb2c265c568e41ed4e601bd64e1918a4759a84d6cada1c3b704c9b5c24a3be37aeba85e539b33c05ebc685e81be333d599f3fbea364eb63cabf71b57d9cb38ee4bf01ecfe7a0df7f79d390981a7d56ae6be07c5789e42ce50a9bb84e388301e007ff823f95b677d8cc0c0ba7d320f94032369eabd8500acbfbf2040dd68cf6ad2abce9ad3f8e54033c81e3e2e9ed966b56554d4f0a8134e3fd18facd3dd4e0d3e5fe7be2e1121e926f6f7ce9727475c0478a73bd2256d5d0d90c4ea144b5ed91e3984febb2469a858020294c7c561ae2ead0a05f422fa01e7d91f9ddb1e50a4bd6619f841349f5c998554f023b19abb2c5e77cb0bb14c2630158e37b83ffc5a7653d97a42c7d670feb8d19ad2a3a5be3a3911024fc7d797c3f27b84923e6837eb6a24ef4c9a95f437a17d0faee59dc181771cdfc6c989f7cf9004a353e4ba84fdef74871024ebe667e4cff2959830cea4f2ccfe9a83f58388e56090ff9ba7278759508b65d39c4d4e977f0d0ec1280b7317e42b8f05a\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 7a6ffb72a3d0219ad9e99ec707c39c37d4aa072c47553c307270b9901c1587669de22819c1116d67f4689fef5453007800c29eeae66a1ba58ef4d08a77f2fc7fe9d6bb3f4105adace30eacd883ff86c0c64c422b9101a997a1497ff145d63f7f129a11237d7189361af0da522ec7ea7ddda2732bee2f2870a590c362063ddd5c4ee4476272abe76ff2c761fa7818d951abd8841d516c816b0c7ba93967f95401359db08c8d5aa4edbf5d535ea42c1ebe316de34ba0e392683ca5c5e6767c186a1e0ba04b7ed39ecccf96ddcec921c192c5545881ab2a84c326304e2ed70d29315746cb8b31bb7d036023684f6fa2cf33d558d194389029329da0802c377675a0f3ea28e497c712c5cb0b754af92060ae722563facc3a40794489765d23c9925302c8c5bb9ab8ef5c05c8a9d8a0907858f51e276671a9c96484165b2463e8bba99b3ab7ba5bf88a787800682b98d204f78dc0e137e1aca622d8a2e2f268e2a23309ba8085536cd0630b561211d6c844ea29224e7cd8f598df9bd91a961ee33544\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 4f2f2db05cb302c4fb4b2eb83bd00e6fe362d4b7fae313de90374190931919727876280139e8d52efceb10003b9b367e13195d83354a30df2e3a06a743671df8761f25620790d1ab32c6ea65b74317e4cedebb725e8558d89ff6d70da36663cb34d8b0183caf9a6766b8436d2d9b0e7bb92c40483cd7cd30a681940699c8d167a4b1a0b2ba2670afeae543d34c60cd758ad7a53b8053be8bcfa471635389503b1146d051e978cd4befec148417f3b4b3cfed96ed78048452bfe88ba9b7ac4cc09ea8be3fbcfef9a818235c98a43e160f25427a5636994066ec1ac19be9fad308eb71015f417c15330083d6726977714841383bab6f44f94ef2b7313f513d3589d67d96f1b4d0887f79e414e77b77c39d5764bd7e5156193821fb80d11f7a0847d68d62e1e092d09fa4f2bb1bb65bcf407ee2d9352b3a84dffa4ec241a850466864a38518e2d5f3b51627dce6e6cf666f5f80b476ed84f96b023a63cd92229feeabdb855de9ad90cbe085190f20e6039b01a41b36f111e8faa8e0ac4578cb4fbc\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 1afed89bb5df115fb1cf52de68fd4b1c895c86a6852a06002519a69c6a983e54d19351f930c227b46a6f3481b09a121bb19aeba02f2abca4b0c5aef15861f0f1d25ee3f6c0cf56eb6b3d10ec5b7640ef409d9897b32c3d3e98da2ac0089968c352838d0bc6a594786ab813c212cb72a1238014d421642839c3634ab14f61d0c775f03d875490354dd902b23752fa3bd39cda588aaedaf31b69d29895cca2bac9db554708224b753eb36c7bf11031fe9ad0462f5054750e7b5616cdfff13467b20025a71bcf4c5e6b31dea741ce589c1cfbf76cd858ee480a69dac7a306308c5d3ec8108a7efb2fae18504e72e263c0a1366103abb70cb1f7a7f01074bdca763c17d7edcbf8d64c9b0a74ef11855abbc4188451183904ef1e9647e512b302ef263123b0e4af885187d8e1eb2f6a1c65daf7b2779be15337c3386a284801cc40358c19a4d9e487896c0bbfc1e56913247e97876487d875d6bd487553552b4faf8eb4b17ddfb55a87f46b202bda0e64e480ef03e057b410b5823216f87e4709bd64\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 3dc25636b9915a15c0b5bc467c0f3834e40ea9df315ad7e60a0f515408382a40f900e8ca2279cc2de6c94500db484692f92a0a62ad1a91be01e55e82ede69c5c188bd624cade6a359524023b3654c4dc6fa2e95a5062a1f4ea04f26343280871eca16ad398ab356784775159cb6d94f45838ec75c810de14ffaddfcc76d5cda931f6bb0285f812d5bdc15c77af50ae6b10438019e0207a4e8f95982651de5b251702f3778f4c92da002250cbf9e9f6cf57b8736b3b5596e6afc06076460e948f87",
     "b64b008545a1a8f71f6918b4d944b6c9a777a1119eb1ff63cace54492b7fc7c57e55d7306d06df5056275fd1c61845cc2981cdf71a8f6ac8bf58036845a6100b3db63d6453b22f44e9dbd85a417e10a8c033cea38f7f3d1f0fae1af30f609d97d8379542dd1a3ad593c2dd00b79badcc9824f2a0946991b01382b205050f68926efef723a10acec37788969ed56ad9c2113a4167b69defe05f02ca56bf93fccf8278dcf160b8e01bdcb4460013bae15219e16c64464cb15e2b94e32c909cb8\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = dc73866f40b72d4dd67fa7484655a0aa1bc3569c7cb25222b6386e8e4adbdb3830ada800cbba3b063cc173d930c5e465b0746fe5e46093c956cf84fb058897e8cf3244d5850bd604e4c27e19ee03ad6e40daea9ae5a1cec36ca0fde49c6cf42de296f1527b758df1a460057aec70b54e4862465c4233ce6f140dc69b1027fb8262b90a0ae523599ea3f7526871ed0ea85d7c6d30bea21482b2583266845a82b113b99933f5032da3089f58073449a6e7631c296d49aa1d4b5ecced0da19775cf70bef05447f1b56535135d28b2af6b31d901729c05521826176a5bcd04990882d17758bbfed52ab5697ab85c61473ec8796b772856e4b68365e1ff5749a3f6be0a4e1691e8d43143cecfd79291344eadd09b9aba3a12ffe9cc68806d55dc24cfbe09c6704bcbc5502ac6c3537ff0db6222889e97b101796872754a2d24153c3dea6fd521dcdfe5b5f083a3417eaaf7b6c006b6b487497471ee8c86787e8db92a39e4506accfbf9b02fee81a8f3e9cac67cbd2f0862aaf8671557b705369b7a67\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 0000157562f61b512b11b02d1f8299e62f55ffb9c1cb5facb33c75fee79ea8bfb68314d48a7868c05b8c97de4af54e4960868a694a3c302c73195a8acfdc78137231dc960dab44bad191c4bb2b9f8b162a73799ba2083d93c55b425f5857c925f2aea6af19514825fb18724555a5b11ef553889af38c7585c35033d1eb9b71e56ec0a1a1185e4e6e5b7aab351404f0d4a4416023449d84f3bebdf57d5666ffaea80be1958be5d7da7ad2c081aa338203516aba1e11642192aa4024e5fed6119aad7456bf13c2dd561c4ac9ac887eeaf4b53bf15e007b043de9abd6619a6fad5df35a336f744d5034af72a6ceecb9305da973c50615c29b98a8d0afa8c54f5cfe80f8efba51b08cf921cf55c69314523619e753f3056ee704a947c24d12e8817d5312ea5f6d8444da4061d26f18ab660f0eb88019506eda480195395e6e948d42e96c3ac8723f5514d87da3bc47432ab60e93efd8e6100589318f1b85d1c4bd04820be2892a8acca1e3633950b111859c6ee2063cc061a44a737ffaa2c158da806864\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 157562f61b512b11b02d1f8299e62f55ffb9c1cb5facb33c75fee79ea8bfb68314d48a7868c05b8c97de4af54e4960868a694a3c302c73195a8acfdc78137231dc960dab44bad191c4bb2b9f8b162a73799ba2083d93c55b425f5857c925f2aea6af19514825fb18724555a5b11ef553889af38c7585c35033d1eb9b71e56ec0a1a1185e4e6e5b7aab351404f0d4a4416023449d84f3bebdf57d5666ffaea80be1958be5d7da7ad2c081aa338203516aba1e11642192aa4024e5fed6119aad7456bf13c2dd561c4ac9ac887eeaf4b53bf15e007b043de9abd6619a6fad5df35a336f744d5034af72a6ceecb9305da973c50615c29b98a8d0afa8c54f5cfe80f8efba51b08cf921cf55c69314523619e753f3056ee704a947c24d12e8817d5312ea5f6d8444da4061d26f18ab660f0eb88019506eda480195395e6e948d42e96c3ac8723f5514d87da3bc47432ab60e93efd8e6100589318f1b85d1c4bd04820be2892a8acca1e3633950b111859c6ee2063cc061a44a737ffaa2c158da8068640000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = 7562f61b512b11b02d1f8299e62f55ffb9c1cb5facb33c75fee79ea8bfb68314d48a7868c05b8c97de4af54e4960868a694a3c302c73195a8acfdc78137231dc960dab44bad191c4bb2b9f8b162a73799ba2083d93c55b425f5857c925f2aea6af19514825fb18724555a5b11ef553889af38c7585c35033d1eb9b71e56ec0a1a1185e4e6e5b7aab351404f0d4a4416023449d84f3bebdf57d5666ffaea80be1958be5d7da7ad2c081aa338203516aba1e11642192aa4024e5fed6119aad7456bf13c2dd561c4ac9ac887eeaf4b53bf15e007b043de9abd6619a6fad5df35a336f744d5034af72a6ceecb9305da973c50615c29b98a8d0afa8c54f5cfe80f8efba51b08cf921cf55c69314523619e753f3056ee704a947c24d12e8817d5312ea5f6d8444da4061d26f18ab660f0eb88019506eda480195395e6e948d42e96c3ac8723f5514d87da3bc47432ab60e93efd8e6100589318f1b85d1c4bd04820be2892a8acca1e3633950b111859c6ee2063cc061a44a737ffaa2c158da806864\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 31\n# em represents a small integer\nct = 8390361b70122cf45d2cdd8c575a7e81a81ef3cc4b54f591ecb3d817212701a0b53df39301b88b041a317e6c01d58085a7a52a7f5e6c18975918b5a9b6166baa57ec8be83cc19f8c40c087d2d7128f9f45643be5e1fcdeb7d733bf3bd1b6e850b676f32cc804534e29b2c1f1fd50eb94d3ca585d584f854e2dbad003aba313c12aa86105a9e53ba2da03e8df687f3f1932554175756a48f2f13f3fa63e255bd0f86b2e9d3bf680017ffda3b94ac1ae12dbb5b7e03e0f022f53ce1fe8e6708ad61b30bb9513b76224b9ee689c69636224e613aec7dd6386fb8fc7772e336ce101360764dfb8f762b86719976571e560521ca776efa90282705129e3d30cb0f4f04ccb3bdfd1dacce9813d1a589da6ac9a39099495853e346f5733b830a72a1dec9f74214b5ff93f7a8e68874fe90f7c7e02dfa2afb96dfe5018fb6d6c3a4705be77f901282ae50d911e381213495f44fff40a823e618ae7d248039b6ec7e13c78819c3222a2fef30fc389ea017f4e98f0783722ef626ad4c876af3a45f5f8fd2f\nlabel = 904f95a1a204aee8987400c5d30ca79d72fbe988321fcf55dfcd0f07e763a9d400000000\nmsg = 119f6f2b7ee1c7fe0d5c2eb8d68566d8cfcfa3e9bcb1351737f23ae3472fe909dac0d4cd2b34ca643e3eda5343b07d47138a25489169897ba8772a74cbdcbca5dc4c7ffb707d57e86db83dbea8bff77172aafd113d5445618e36f7b9e50a1e9e0eb1f0809528323b45195b16666f5c22e8365945918e81e29aec72811adfe006c45e968e96c605e247163ea93dd434017b482b88187e06d021b1fdf4c985142f471e08d8a2398d54a6ddc6ceca63c430d3f67e825e61cd841b9a5d157b265ec2e5b789ba4b3844bb4ca168ec70fc2afafd9dac34d967400e982ab175d0d82a5007905a83115a181d4ee569c223bb9c2f9e1499f2798658aa8ee0488046b6915db383b001dc693da904cc4e330a9937914a8e0c2309b07be783d0e56a045a195b124f54016ba1c3ae760c2606a90f32760e303343c1b0729da9d1ed18fb16\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em represents a s",
     "mall integer\nct = a5adc9089becdf7dfdc75a59cda6125b66cd9680c5689e6266887a4a73880b492e9fa277f1839994438962e946cac0da338b98a8affce9765feaf004bbce10a3c85faaf2a0a1daf931d273590c896dc847ecab8b923005e89613784536ff40fd58e193d1a4a179383e4fde0b914b1537bbffb23f311f7abf9c0de7ebf412451b7e8683389bf9f80bf6f3f564ed44682d5712d434f5a8623ea6918af69748b5d5d26d2c1b89dc6ec5262cfc327ab7f3cc1524c36991e28bddc59adcdcc69fcbf32d19db045753ed85ea0700afe3915bd95467456c967a1b1bed39d7b3cda9f103794eb26479894a83066ecb00e23ba424897132407b50f3d25fb2e9649f1afe244c5d4fabcbb53c2d214febc978a3495e0cce53fc9fb61aed4f7f6e42152a6cce5ff9d5984e4de9c7b757c6f9ef5edd7f5a20450bfef586996b009cd07f8377b240ae859b1e4518413d9a79b6111000ecd1312157f4ad3a35a0386eb1f9bd15193ad9e00cb0d63bbc5e279add877eeda0ad66ce845d8acbf33f69b5d8b16ba8f0\nlabel = aa66934039f2adcbc6de2b9cc1b00b11bf33a72ca8dbae5e7a8af45446ec682900000000\nmsg = 2a0e8d66a82662bc1db11a99703df46431f00f815f55520c16be0efcc67e8757ffd4596e232ea9a09a9c96c66b73ccc94da587d0eba7bbd35834c6ba2803a21b5e9a70aa8c37e391f6bed5ffa250276c19719dfc01d8f693d5760ad1af4eed07387a5e6cbdc69584f6058c04bbf0f3f32ebbeccc2d2bd395e4debc53f44a7eb184111fe6ca944865c9978f969712e1f777c3c2fd4286b705e40d56f7b424c315fb5b181bfb14b53dff5687e9c122fee7b3569444f76dd158cf3925b6a3640f5e573c0e5b420287396d85db8b3eb4e42336eeb55bb04e0972d6fa2172391bd954069c8aefce760813961d360f1a34d052e90f9b2b8f71e8c63b7a1fd2add9b04046148d2d8308f8517ed8010f8b23a56982a77ac8cc7f68da4c8e3617933bcad802044e176612450f2c2f5e399275e3877102deb58418e2b51dd2cb0da857\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em represents a small integer\nct = 8da7f29a7b3fefb253514a166eae3b4a8cf5a1eb746e9c6e3c0bb84c81047546a77815a6d527c3ec81c23761be29ce1e44df62dd3e6f5f04b91541d6f4b3591d9b8d9d701d92c6080842305e73c7be4ce52f3462c3676aba2b88d70cb82cb28a9052f0315449a7dfce72089e5a2508d99c54346bd2289a54517136239152bddec1181dd09406f5bc2b1fd9f637d3fdd8b2efee4136b1e8b8ac2aa5883343f56d74280a0458258a7fd7ffc3277c79adbbd96a928664853c2b3964b139071dcd56ad6bb3cb4921a3fbb2b90aacfd932b5d5c5521088dc02a453c719a22a0cf7e925264e8d3252d4c05f326f9bff175937ff2c3b5f3ba29d18a37e9d962274a99bbb5afb7431f68f50771d099288f3c4fff9b07dfa656bd8bd1d309ffcb8f1541e747ce920ca2d6b7582aa81838b379f4dc4ee23ea768e16d42784f97f0f670cb1424195ad8bb382faea3e5017ed8643065d6bbaf54999b08734097e7e34b3203d2c7ddc42073e15ed178e7893198028a58695f9c58f74a7def45eba8bf7ede23f6\nlabel = d586a88b3b492bfc530bd701d28172d67359ccda042cedca29f17a6152f01d4300000000\nmsg = 8d708fb7bb840034728ef72ec2bd7f10b95e37c272a385129d58f003364fcf454528e290bcb872d51306812bca9ae146edd97f2d56c4483bf39b073b43b44e38b55b35c7c35946c59ad9d513af40dc6d65e0edc2017091d4b762d7698c5b632708028d4b94b2e59489bdd2140aa173aa8529134e4ca51f7b3a038521ce76eaba81dff111922fdcfd13b75dc6a8aba0c56867c4621c740fe412f5a4146076e2c1c3132012e7fb48559ed4f39874e6d00479e5a19b20f8f3e247b91c083a2ea603b2a75ab0564d62c2568de416082d9a0c1384742839baef2401f63dde8e0169446cde0beaa9fc0f92ad4d8816fa0b9b06a3e394d9a0466b9bbd13b3c9b832b18df1537f3a79c941ecd567880d99ca9031690e619674e8cf67dbff8ff7d650c03f49f8f0fb2fba43b76e6116fa9ad33abf71a232614cfe1a2e99d2fc6d9311\nresult = valid\nflags = Constructed\n\n# tcId = 34\n# em has low hamming weight\nct = a42d715c584bcc5589631f73e7ba3e0ee68d590626f76526b15c0e6defbd3a0c0e0504dc90157ece3c12317cf898a3d753787807892d2d67476ca7400022f0b3fb923b0add8a519027875778cea6537ba5a1c6ec5ee73d60e6fe998b97c18333ba711776d617198f38d97e7b56e260637efef5b68432394ba6e4520a33ebd7785fb05b212973664492a271ea666e76e5e15c9304a291b2a3800a2e0918a293aaf69cd280db9333493a261386a8fd602cd072bd9a16d242da982c33b6f70d475ffe8702ab82471831496584a4a3b6710aad7e4019dfebc6ec2f3e3128ee19325de5522d64000816e98be981ec2755be99c4d340413a08f2f8c888452887ab8e9e293297391fc9473c216d4a48256c3c1b8c7a142be547fd383de8ab7c2ce4fa5d4a0c034e1098ec5fc4066ae6b70fb24538432f67b8b188be691d94541522e78fc6cf46e3480ea6188598f8e73d08593d8b17e4fa28f470f72a1ca8ed92c7a9fe7abe2d02d7c13917c93a37dfb2d631942ab003c84c2216135bf8e2c014e96d48\nlabel = 01ca475244e50d16a353682007326d0ef4568cdb1e388a8d164ac114e459ae3000000000\nmsg = e00ac921d4554304c4d4c75a656ec3ec388c3c22e9837409cdba079cdd80fa3d215a6ee2db42947c7c4cec3d31f3f80bb64662df47bb9640eadf73d64054e3808b7c847e551fd91bf8d15baa9e33e37b688d48432deaf1855821721d903f8c69d7f6735d6d57d98eb8510cf6ee31801946f6aeffbc37d545028c0d5bbac890e91142f630a634c8b54ecb1eb9639c9e69d5c8a6a8c320b762e341948cf4e8cb9ff0da3024368e4ca87b838ee293fa8e209f8b993fd6a1048db31d149f47b150a1484c14f3c218baa1fe9a17fe74acb1f00050fa7642bc6ddc6574004dbf83001140cff15b3fb32d221c8bb21d9352e3356780e87b0df0b03b1cbb6b257150c70f19e43ab09c5a511c3b3a7c4ce192e718faac1bc6bcd6c6d5958b129076e1e0b3aaef5b38a1f82ccc0b8479aa41ab316d0b3c22de19004e06ea50413b0582\nresult = valid\nflags = Constructed\n\n# tcId = 35\n# em has low hamming weight\nct = 51ac53ba60a571b3257507f19d07646d340d8ed75ddac57f0633ce8f2ff5e3d86d94ede08c2e18a5070f954709ccc044625592249fd797f98a62190a6a65e0c6f8621c89af542ef7bea7c4efc0495abcc4554a22a77c9df7d6173fda1f25d3e33cf0f4d64989e9536570514040611dd78a07bf98f76a642d7bb359b151e99a5b0bf5f245ba896602f01550818215f48d020b8d521d63b611201492b22d6a212ca5bbccf3e475f045e3afb0f976fef14bb91b45e2e2927dbbf2bfd1fb94ff7fb165d5c000eaf09421df56691ba70bbeb98d660c7598cc58206c57a37bd9e8e111582f5274dfce29c934d156656e15ed0fbb61c0b4a733324cb3e6abc95d75b0bdbef8b617e0eb18350549dedd8692f18fe6e2196af679d4ddf4b040efb92d2fd0ccd60db025c402616e0f3ec8259e7b1667501dda86a41e15fb3bc259d6aad4553923bf563933940f1679106b9bde4b73a86a502f1e5afb6a8190dd4b03cad65690dd51afe3e4cf11deca11bd2f28a759c94624ed6b26fe3d89da93eba095b56d\nlabel = 9bb39276df720a4c92ca64f2e89a3c144fb2dcb3f8b13d74df5f24a76945812f00000000\nmsg = debedafca5e356c5375f0abf71f8c6ceb3879a1d9a0a5d5a750f2310e899a70f1cc833bad9e4204d883ac3c6238939f044a3df5641bc1ea2db48995850ac642ff1735062f441dde9376e61a3c7d2ad1eacf4af26c25e29bf3c1c27d3ee76bf992cde316973f88ee7c940beff156794d0729561a24e35e144f7da7a87664e423d6f040f915d996323d091901968e910ae6e206b586f084b5da695c1a1aa0784a7efaf92ce453d3c57f05c8fdb1ca7b2fdc0c4dbf463d5d8f4f62f19281221eb386ad292d26deb871d968d0b42073e1687cb3413f07702b47307a7c83df1a6654b0d92f55aad337d5e7cd58a7c7645df931ade6aea398e91f148392eb6032827cc2543847140b19bcdaeeaeabdf7ff22079aa822948088e7cec45c953ef1e13139f3652464cedcb9127b38b600f3e50b914c2661cb3c7196cbb9b7a4fa17a5\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen147 = 30190;
+static const size_t kLen163 = 30190;
 
-static const char *kData147[] = {
+static const char *kData163[] = {
     "# Imported from Wycheproof's rsa_oaep_3072_sha512_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 009a389207c44f45ecd4b2ac716d728ef622e8e237171bc3e12f848e1743b73159a7731fc73bc8011bd8bb24855acda63ae8327dd60043e6ca86d3ea10f2dcb863f1fe20ba98246f324885198d642cab314c087b26fb115c0ba7dfffb222c3894f6577fb60bd07384dd4e71fee050408c9120a884f63ccb0901ea3e2ebd9da67c7cf54e7aa1adba1b146a9372f426e4d0f2fa4bbe070bcccc28a498fc711af83996362703b0433851ca516316da0758fbdac209eb63eddd91f6b3a24e87fbfa1d2ab8f8a95d1c143bb643d9ed2cad7778ed1bb41277f07a2ae4d5e01b263f905a1457fd1f7689c85694bc8a7f2181752a606b4e3ea5b59e1f85e993c8f8c528cdd0f9f09c65a53edfee6354be565d594060cbe594faf46d82a17056c8eaa59ccb0f0bb33114b9c2c029a6e0e7ee9325f03592ac0067feb660d99f8bdb6d25ba1ebc480ce770c367949668bdd2e3032d04968b5293c080dc41f2b69607c157e71c62570481a93e340a7a5be1629d91334533e41eae79befa422cd5ff4d838ec2181]\n[e = 010001]\n[keysize = 3072]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245]\n[privateKeyPkcs8 = 308206ff020100300d06092a864886f70d0101010500048206e9308206e50201000282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245020301000102820181009a389207c44f45ecd4b2ac716d728ef622e8e237171bc3e12f848e1743b73159a7731fc73bc8011bd8bb24855acda63ae8327dd60043e6ca86d3ea10f2dcb863f1fe20ba98246f324885198d642cab314c087b26fb115c0ba7dfffb222c3894f6577fb60bd07384dd4e71fee050408c9120a884f63ccb0901ea3e2ebd9da67c7cf54e7aa1adba1b146a9372f426e4d0f2fa4bbe070bcccc28a498fc711af83996362703b0433851ca516316da0758fbdac209eb63eddd91f6b3a24e87fbfa1d2ab8f8a95d1c143bb643d9ed2cad7778ed1bb41277f07a2ae4d5e01b263f905a1457fd1f7689c85694bc8a7f2181752a606b4e3ea5b59e1f85e993c8f8c528cdd0f9f09c65a53edfee6354be565d594060cbe594faf46d82a17056c8eaa59ccb0f0bb33114b9c2c029a6e0e7ee9325f03592ac0067feb660d99f8bdb6d25ba1ebc480ce770c367949668bdd2e3032d04968b5293c080dc41f2b69607c157e71c62570481a93e340a7a5be1629d91334533e41eae79befa422cd5ff4d838ec21810281c100fd9e30b6bcb1674ead266332e2af25c56b2869b4d822d247e6f5b35cb0f3c573b5efc39e4b5de760489b82536d6cf3eda1bf60e5e43f69f26ac8e45b056d702f0361dbb4a73f42ae5889a849657a841d866b8b4417286ca9b39f854c4d95e3719b6cf367fc7128088a365f3e322c1fff16bc68bbfeb69c5b2a9a677dca6d494de44ad057135e65ae5a5f83c59a0d1477e5175acf716cdcb2966fb75145dad1554a112c466d249ba894caae5e182c65f1753fe5bb583ef962d1574d9be20bf6a10281c100fd3c5d0967b74bc6fb54ef961a6aeea76a59cad1600e3c73f834e5f5b7b5096f7779c62b07f783739341ad5de095e0209f2f2f30b8dd503da8a271f4b35d93cbda013b515f573501ab80dbc7d9fa9dc98da4451e00e0032f53583c818c2645cab8f35619e7c27928648cbcc3af39f30e0a61259ba2499ba96b2ed7b9edb881d442466c07f362ad11a2a9bb3f67548a5e24c246fc6c438d32de9ecfd18b609ce12fccca90bfa4c3ef63cfe3a349611e590e44a53242dbdbbe0937f2ecd81c8d250281c100a975dfbada4df7673c8edfcd8a65d96915f6c4dacf6844f5423f7dff3b4546f3cfe74ae0241fb4904333955b454c7d98947119bfc24914f3a3a263e2e5b7803409a0837b2c1d3ae2dfc9eb264fa6134cdf1a50cdc8637c67cfdb90e7b117ac07a7009f8b25c43e29a6a039f786f2b0d6734ca4f6a8753ff83279451969fea7f261ce13737b3fa1d564115a2cd88850dae3ba3d354ae6a078bbc81dc73253c977a1abe3d792e9d910458b40032347d73e054812aaa186428062bc60e0fda35cc10281c0098b4ade5de054a4cd38284779fb69bf398ce4cdfb56ce0478e8557a6b501168f811c8dc3a52a3cba953225b956950a72a18b72898ef0e652483ead3942704b8fc206bc1e75bfc0d720f4b393f07e9067da6214cbe2fb32f076f1de8ac058d3fd4b4a71c16d60786f43331b2165a92c486b39e9d3d0295314f6ed68695650ccf9927da4e7a67cfaa087d69273c97bd174b3f5f3988430b814d4ea2fa7ccc495d5b55d6949a0475b6020705c753aeab5c23e3866e5c82b8c772c57f0c5a20c9590281c100a2775a3e38c279cc6633f91e528ba76d14750e36b7d43883b1c8bc89eaaf2878c3b6ea9b87140d6938eaf938d1f010656899717be3e0de04437e1da539c6acf3db3956bd49ad71b747778217e2dc67ca0800726a7ab9624e41f10e578719850ed7684db03b7010e86c197eb79f7f68c3022403fcce14d8cf9df186b0a2b97cc120e2b4a729aa5877089240a18fab397962198fc846cf9a10eedcdb7cced6091c61e8b1c621df270cab19e5795485a4b74cdc3e24028bfbbf0eb1fa2ed4531cd0]\n[sha = SHA-512]\n\n# tcId = 1\nct = f9798ff0c606b0ff80a1042cd429d55bcad69856a0361640456261d29a98d2e42cc9618a08044fa29eb116d16f67212cafea3410c7c839a67519cfb5ca1def83ad3fdcc5488984ccbdfb2726371e1c2ca157357b881d873a7489004698ba21d697349968968a0189bd56ba4761b0e6feb4feeafcf4ebb5dd95fec7cb0a3cd23214356fbfdf93f17668196c354f7331a27bf12e8e9193e5c6c79e445160e0f28304be532b3157b50eac999cd162791c7bf446aff800686ca5d14a272a01dbfc6511472c18aa62d22b6af90a6335fec530aeaee8403cc8a07d9c2df2e9ea0e8c0cf83b82cde0488eabb8e7c8d18fcdcd62e680c6835955fdd7fa30c689b6b39805f317bb00e8dbe21907ee92f784c930acff37d70f8a7a838c7230e77d24ca45a5650726c2d1e3e7470d4247ee9f0a1bb8895dc2359cbde3b52785e4c05536759ae0c83555ef30f97482fe18f00527c7f0b37289c31c5621e3c7895abcb455277293e277c450bbb972fd63c533741d9a931be06163e166a4c6b139260e5909f01f\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = 93c78c91f4245a3475669a0683430aa59900c789474ec8f95321c46252e440209469e541778dc362b2ce9d5a6c822892b5e3754fe40038d5523d76e13ee07d3ae941963ba947b2fbb07c687a18521181f857d134a3286c073abd024691a0b7b85460a1872b5e33cb297e6630af2acc82c8fc61b96b8e7795f7e6bc8581d196dff9e3752fa88b08cba6bd67ca563043bc5296b6c26d526e34b0683b921739dabed3986c9b36b354ea17dfda86b78cbe5f0d4646cf102fea80da86c45b5dcbea40b44807935620e382aa17c6ea148d9b5e655793f7e6b6088ce719b08ccc6b5dde7bc3424f1c4d61f3a282bfee3d6f30480ec23a0b6c0712e9fb2ff799fc79459d1e2dfe8e7e87404894bb0a31260c1086c577cbe703a54eb9e750488529076c2dbd6f6b34dcf39e843f0ff279d0beab2e6709148b8562ae172bcbe0e562125cd6ed7f5d3a055c320bbc3c8b4bd28f7f9ce1fb402ff265e6d311e82adea22332d1b6d2b920313882ce3ba836d17e1176bf001afdceb1ca006c8a18f574bdc635c0\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 2679e7a6a3aa29ea006f84456c5cb6b33dfc0a7d1a86cf711f001b442fdcd788b01cdfee7d6e3d63ff3c30b2a67515e7d1d609e6ed4e22087d5857d7fca0d0b8f5dc41790d2913033971f85ee7d789de23ccee294493dd4484eb79e400799b24d6830ae8290343ed50d123ae840c6e4aa819badbbcd513341fd19654391085b0682d8f32c9706eaf8e2a0fa09420e861dcf8ca0867ae2f4b333031cf8fea956e3d67b67c40d97847cff086033cb83b95f33267c69d771407ecf5caa28fadb976db3855f39ba0710498271c86649604db35b141c8b9ae343bc4bc62b43d5c662b424a8e766eafdc22b41686d96d26d65cc28a221e15f53a1ce82ce664a2d5dc602bf0c9e488781fbc0ed679c9b225258a5582f15be48ba4a7a3d541a7433af5f40de0f04c04544962ba318179d2ecc8f4965d306bc56e2b6ee7f9705ad1501c218c31bc2f277c62029626fbf631f46964403d8037f4f6c8349ee8d9906274ede7d6b78ba30a3e0473a2621bc86dc31ba89561d82c5559982ff188ffcde9f81729\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 5120b9815296215e7ee89f5a20a46dee6f255f7d96d399c8cbf5721f9f9c4d89a8ee37e2a6bbd6acd4878404856143960be4a77bd8f6afe6b255f15bb8bcdbe3395f800df64c2d2b55aa7cc3c15c3d753562359a14433abd29106a0d1416cac5fea97732828a198c04d09ed6b47c12365de2a98eeddac3",
     "46fe879d39a1a28bc19e2ec570b94681f7bed871311edda5c8fd76cc14b15983046da8cdf1e15c465e4a9df0fda11ded950ffe5e67a3d07e56f902c7535331c08720493d6ef4b1760c6489e0af7d1b97229c4380167fd68f6ee30de2d61859ec55b5f0106ea0f675fed7c9f660520981dc201cf16a6fa87379d2c667f9c8fae97fa337c34d591f18b092f534be25db157e6696b1c85fbd896971f2c045d08be1470b403f2effe6d82fcd1b9baa9ba2c0ab0d25ca9cb2aa26f2c4d5ca3699cae3b61ee6eaf98d44610c8204e4298a01886e9cd21030058b29462f3d73018043466fe45307d2382b8b828fbad34f77c1915514a9ca9e0bcfefd3c0c7daaf02db684454c18b109a7a056f\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 290186a1a87bdde5c2ce70e17605b39b4fa2a286fd85c299a303d56207ddd0557ad5513a7f92ce1a39d8cd571c9c638c279d722583e17ae488d9d3ddad55d837a43845a84f3e774d8679d09b13bf218d11d8a2173cad0c5fc7b86e477dc372f215bc5641a13e931170c6401447836530b065f574f3376b99d4e0200053b92b1fe1c8f513d2d8ddc3ed210062e601d4750c5bb9a63e051098f159ecf8c40f90e6f0265b357585aaf35c32dde08e565bc6687319bd7c637b7e1a012408224865b9334083460aa39c12565c5bbf03a316a6ca5c174d6edee3391bab9773190bccc4bf737ad0f350e629d2eff4cd1611d510a7cf9c11dca1c86b8dcedc8f9b80fcff7a828c9b415f4699b2a1de2bebbb804e0203a1a04ddb95afdc4bcc6d98d240ba71ca2918f21696ec92abea1a9e16607e86f40f7de08c9013485d9f8121d9f9c0675980275519dcd2e705dad4d87009f0fb8f6c413b97c131766620ab583c82dc1ac489bade156b8e502335365bc4a8d7d8adebcc32bad71e6b949a48118dcdea\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 13ad5b087b5a11595dcf44902ca1011fffd32efe6b77be307b3dddd1b528f33e7ea3f36e09873da3909c7f44fe9ecd17adae5b40cddf0efe84fd401df7fed988963d555c24bc5a55e8bc40deb8061fcb59183836c1b1342d66cfc74f6404b67a4f50d9dab04223c18805c0a577b964997e5aca7016daf2c4273ca773bcde39470fe7eb5ec4541650c7687a378d00008bfe8a3a4627cf1efe29e7c81b8a12cc8afb745a86567f5141d16d1b848514acbbb52ced7ceb7381e7cf0261991761d411e6b16f2606050b24ee918cbd17f6c3ff949ed2dc7fa6e99b21436d35729b241f4a346c9c92a60d57c40f39fd299b2bff2f97e196aead3f954135b473267b27ff76bdb451c23b49d9477aeeadfe45a08852caf353d92f0e47feb7cbed5e49a89f42e2a755db0d5efe9dc330c3a71f331110db4a9fa3db914535050a96b0671c2a15b2e9a3ff3f1212526e2391e3edb1bbded4de0c3cc677263f2ded3a9506bdbbbd5fb3f15efda88d954063fd70f6642a5a28295fbf96a4e0cddbeef97a2b841e\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = f4b9ec8148f2d6757e6a6c9c32d5928e0efd5ba4d9635d60d9b481ee84631c6b019b4a04d1e15d5b3911aa5c5e9c46d564e707e64149cea901a88781512ba96a3a53694d5ed7ed7f8fc7885e384daa32dcd4c5228ea33e6266bec630ddda028c013288ff16671dbc5147b28e26b73585beda7e572bae5e30a2a9b123fb12b711a4f64f4aab9b6531fe691098d38c27389a8e99b44ff5d39b0ebeee5930313422c918681be11fb722230759c5b69f03c6a07956bf406d53f8d55729373931dfb19e01dea1b9e5203955712ec5463772b38097c075d8887bcf437c44b1f3041f2e84a60387e5565feadf19b528e77fd009bd13d248a0354e701a09a63bad83b30b4c64fbeaabfe23edc45e8405ee8a9496cb863e0b12a21848023ab41bf5d24f39b35fefdd1c27702dc3fd3ec31a3643ff7cf03cd429ff5b14735c8b9c8fcc7683d599ed14200e472a030cf3b40dabf7c22ec7645c735800cd1c72cd50beef8439f5a7406a932bcc1f0ddff90c95fe554da7c1efb79364cc53a773a35a2ef89bb2\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 20ae63774da080fc14e32bd56d9cbb3610aa0208185afbd8f612ad4edc3d9fda4746957c1891098ba091c3d0d3e337a218aaba1911eaa73b78c5f16e54c31cfd460098b33b160ea3c274d8e09703339b3b1cee7ce11299b1e7f4fddb75f19f546844b211764c6c171d2dfe820ac2e3a8656b90c7e4e19f81cbf80fd85e2f81c350c49462b45501487df08c2188f87383bc2382a32d60ac965aa4dbe5c1cf28619901ed6b42f2254e066af44a20eb6a9d4348c3a4169a209263f939ab49dfb989358c6cd89682df00fcbbc2208bd992e06f75c64f3e8a434dd7d1a4200fd197d0ee2b7f851d04dd4448544ab22c16bab499719bc43c9b07007a124b5b1e18b613e401340b637a31860d86cb4798c27afdfd885427f6f8b267d767ba290113eced53c9a3a0e7143b00c14beb395f2ba5bff839dc2c53a44eabc269e4860ef9d4c42e9e8c1623ef77613278b399f344a89fb1a107f08b5c265bf5809f89785ec7f24ffcb884897b891358ff48196142f57290b1a02a31d6bf5288893a1fb615fe0c\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 7a90b7e694903463592d5bfff2e00189459a41261d0d3b1c7c10b2a578c792b8abdf57f52d7d26a26ef2ab75a7ac39c28334f8a05fc14775ff1d63dbefb688e654a595ba49687d0b711ff21643a2467ff587aeadabd0966f1e5f34519e5b36ad9005a05b7093d5053f6463734c314e654340180ef8a18ed259790e3058b1d5ec18842e9b054853d8219e18131f51aceb01736666e60dd293e8ac47d4966ed68ba39194b766029f4bfd344ba2b07d9f89238804f0685706ac9c16462e69506f18dc3ae39e0509d67acbc603fc21b900712c4386c01a48877b9935355adbd009fcb41e5fcf1d39fc4dc7d26e72f0db741e2dcc17ddf79db46ef3ef3b2ee3c6ef5c689e139442c24c2cbec5eee51f03b0f38f19f67ca802e899be6597feaf3f0fbfc52af1960c1374f6114ac9b1e82670568c8c78e00474a1ec3de11e4f510982d8e9fda89e537733583ef6792ec3bc77955f4389b5b44965644c20f23a09363ac346e15e1f0821cf0488498824200191971257392490946d660819e6dbf310ae57\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = d88801d500a78a626043e14bd52e01f068eb5381c434bb3af50c9367a2ac5ca1fee8a9d248be2b7de7a5f52c1e716d110113b72bc6e2d08766607ee20e262275f7dbb669d47d8710a753ed8b0d99aa86c7b4cf0e342800c2185f00c38190bcfe3b40758035390fe649b2b0936433cd218450e3b762d10e7eb95d85fd52e5759d0d5a0ae49c897a059f7b1628efe8fe06e04d294548a07f73c74e6e6d515e311e7ae846b0c7f5aa56c61f3373e1a99f2b610785df6cba710fda15c24f56c37bf66e05de18f8417c5215ac4401a6f638a8d8b9fe2f77d247d0ea0d190b8c604bc702c91a84a4352ad0c8ee44d8fd1731a01d91503de39f8b19a7693f8aa6efdff15bd1169a0b79272ae03cb20b3ba573b24be410a8eeaa6ad6de87734f1e299c7dd95afdfdf56d41cf33ff61a7ce0af5eb99826473647fc79e884a75541ea7ab9963f154efca34741cf5b343c86be001c6dbbbf6b2cd8197ab5d377b8f0d2761f42f058ba8406f768ba8061576ff516f45faa42048b2ed3851dc7466c425433f6e\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = c609ea7cedd8b6d56fa625b11123b898819558797be9cdb61f0354efa52ffe6c379c4314fddd546020ce9f0fd5b907e6e7b416b46ce8bb3c6129ec39295077fbd3b6c24aef4a9163f5d7d80dfd47f44ebce3b5127bdecb5cbe49d1e125e20479d226ae2852d79047b5f0d535b48e8bfe6118c1d7c37e8c70ae84d1e262977e550f5da03bd087012a934f46c01e121e8b3106e50b4bac05632e9aed32996f09ee8c524ae104911cadcac120a45c44992fbe6f3af37b04e8754dbd674d1fcabc9f5c8649e0228f5f87cadd6d6620f8a9d27928e5249c08eee52372cdf67a4ac0fd8dee2b9e57699d7e28f17a7c76bb3565b6896c83ad14157908aa765c7a51493f2d3de7d735f3adf9f911a6ffd0b7cdddf610bce09e6d929675631381777a9fd486a7915890c0b8b3c119e50330579a4961db1c498955f0889dfaf3dcae46f319c722f7279102467b1109ba6191e30159ca53c9398e6de412afd21cf25ee131840d742562388acfbc528672d3dc38ce758895ddd5db82c875f12de940503617dc\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 2fdc9577156255b3b2f1073c76aed1dea93f18758096085e69b2a8593bd9dec848ae70a250d893d73c6b4ee109c967f896361d8d57883db63549cd9b3b61cbe50d2d944fe88524124c168a322175ee87b571569b567310b4367af407a9ef2657f693a33b536fa7804f066103fc012414c932c83aa1eeb9169f2ca10992b48910f0b2fa4409d992bd4218954078dcc78da6436b809a83391bb8cdd75c602f2b41a1b836a62e4bc04add443e90f58038b99b177a9fdce99813cb7cf42854520916b9ed0bfa4326c3aaf45ef8915c50a8c159d4c8ca6dcb06d35c15c5e8869d3b278e3f2e9fdb0811c6be2afd4959d082b4ee2f57be078d149a673fea7252b085e04b5c91d93bf6ff343e374ad5454a89c2bb77e040df555185539f0ae81808e20edc9d7c94e06498aad532b1de2eaed00d0f3419adb91893941688baa57269c9d1de160d9b505d55c7c58a6fdf95facbfc2551150825f42c1df3dc8f3bddffb80a0f424386a04ee423b72d5fc6161054ac43edad4e1f0a0d2cb96727de0dc6487f\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 12a86b617c77976f1647c75333a0e938a926d6ce39ae90208c63d1f0dd8420552946dcd8c929c08e6fdd8d03f8a1b8e8c3f1247a49bbbc010e8583bf4907405f62c95cc18d337bba3d54075dabc18c2845534dbee7df792262b49f3d",
     "7a71910181d6217f0f22f9839b7cd3990f2da4d959196ff448342b9a9dacb984a84969d62ae400a3116dbb8aa7b1ce61f82361cc5cf994f2b65639a772c731bcbfa1df069f6726ef3de4cd2840e7c6b91f3e032eb826b5b4abf2de20d4e8d667e6b275e72c202e4acf65459c91466dce7b81a811711d3fd4130b83cc8d33a6f736f91bdb911bba9c894f6a3497be6381a2dc4349c85fc07bf48b47fb2291717724d8fdc53c9b8ce15f3a536bdccafd36ebd5e4693420271c9a6c77cdde48f851279748a0acd9e29048174644c503c047d75be164bbef65c7a1c2f6db94298e7bbd74679e5b0d7799980173b89358371609b256adc28b8a7f67cae1bfbbd83b4497ee13646be77e17edabb75b33e382fd21cb8085ad958c38505ead775bb784d608a123a9\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 4187354a63cece7c984286cdd0eb98909757a41fb2e5cf45982676ca14e89fdbe5a570eb2d9475a5b9bd13a58b225f3154d538195a67f3813c6d70cfc8a282231aa41d3d3ce79aaeb9876af8b9cdcf68e529734d7ca576a8458837a6cb3ae65d8b706d54160f438ba1cb1eca3f6a557f2d2c66476e2d64a1b0b3dbd9ab0cb01d46900234aa22ce906e2acbba4cb1761ce412316deadc060269c74a81827b3180d94c69b5e30d2d45d51ec49b350ee0e672a0ea247a49601604c853c47170c4adf4a9e4a1066da59050f9edb6a21e922714706012443ba153959c8c11b9023f153d62d2a23f271e2b81ea0cb73dc15756ff7319f5ec3fab7e10fbb60b8a996fce23bf7de9fa17c11175f2cf604e32064b2ce3486221314bbb7a8d01987a57882f904d020761a53da20029d9b3a5355ce00520e61041b5a00d98a921300d3e30fc9a7dfcc00186e503bbf0fbf6ee00ca7eab439263d6d1257ce1dafafc1a0c3c684703ec18b3b12ecdf9a3f680b320a09865e70db3a6dce20a868a61ce187e5a56\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 4b845fca1d048ccf7e5a9cfe00c182238a2b69e02bb0b798863246e24c26856953d269d4de46e93caa7f383f241a963411b455e7a2547a9018b2f7676246324db9ebea25603d9b7f7792cf29ce26bb64cb6f3e703e359fe53ff4e2734371219307709d8a43959e61c5e76146b67b53cc2f669527594188b502bd92d811c9c44fdd7c7b69468f314ac30860bf51b26fbc8b6bf985df2cfb215fbd5f53ce0a6c00781f4d987f99fb420a8e34fa7544f87a7dc67f94418659c747bb984124086253eb86e0efc15214550429a7f4d13d8ab4bfe908794e0ceb41c5753b19792e8ad4f108f26eb990baea0d88e930c3bb245371905354c2a192bb21483c2f5033c05073e2bfaa65c8e7c0eee1d22f7363b363cd698b781cd7241db25eb2fe43f480ea8363a3c680869ca143f531d83cee2b4b6e9a56196358a4db22839aa7332c9be2acfbb5f0e710cf3c8b7eb30a16bc126d1a3dc2e29bdc54c830b070acddf2bbb2932a571125f12a5fe70282f21772bfa1a05967a04db4a17009ceab8b4ee7075c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 4e6394953d0761d4db461cdc976124f729800f191c1b308f663344db610b8e790521758688bff16f1f631d0f3023e5aec3d750db63fd4bbccb2798d1050beb31c16151253dbdcd7363a2c2c11398134965831cb076c0dda88d3898714969b0a55f944956d8f792a0d7074fcd6899675843e91cc6ea2f1372e3aecba67a4b598c4aa7092496070c94a0a1a289fcb6a0f19ae54ee2d634014064d76f44d092b2dc6da115b21b811faba0168722a5be99965527ac6c5992d2f8428319f72fed15451b89fc5b06710baf912bbdd0cee7e2f0f2818599bc99dc8df17cd5c410911d0277aa956f330f3cf062c8388e3d35136049fc9ea624286e5febc37ec9802aef1ab20b28da9602b88eac75b6d055dbc4363fd4d937e69a87931ba728101f70c8ce12ef9e1c1cd47ccaed88db0a95b40d8c1da61cacd0b31f723a57d908b8577259924ce2c457db888c302cfc9f2867dfa6b86dcc9250e69e3b392cf3057c06e0090d511ece16e3194abaf26a2ac9660ff6e0237d8ed4479b0740f77864138673aa\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 81b9ea5c0cbcc4b7f183deae85cf3d04d8c9a35cca7b9502238d1d94c05563bcfc6e3cd27320bccf3fabe737195bebf4d8770ddb232aa0e25fe41bb055d36dc328b2876e4b7842ad4499f0e735ebb283e7779f6b7c66cc71b62811f5c88ea3408939706ab48ba6fdd4359f18e8a6e0485de9bcbcda3654e7964cd8f243d3afd3cda79b498e6a10fda660029207f4b185f8ca73b1ae46c3dd3edd2097ddb6ca0396f94ce626448ee9325c91fab3e550bcc72c7a36cd4161cdfa65b9fba398e153ef1b75e06a2929a86a6e87f266b50d8f513699dc8663a7c6b1c4c9872a63fc3218cec37029c07a9b701d615bf8ef0da3361af097184c5f1a3feb4ca3785e235b83c0b494ac1e36b514fe5c343561136d14bd110117604fe8a99f210325afb5a406a10c99e6347b29dc6ea5b1902b7cca6fe6715f3b291e07850a12327d985565715266f723249cb595941f43b946ce7822edd05797eb1bccb9ade43248f22df4e38107ce9d92718cb795e93db7d1bf3203c8f64c804669159b58ecece44c6f2e\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 5a49100a3e147a880407ba68183f96a904529cf14377eef22775c95ae7d3166b73c3fd5dc259256858424ee97812b1dfa159c25b6de84831d8227b153c4624904ddd8c84bb1fcfde36bd61319120a7cb0c916dc22369b2243505d5fcb2d466462dabee4b8495ac8c186a38bb4065fab4e483c947cf72c27ad542ce7d32f689c34f6d0873aeff48a87eb89efddbcc1a5f51264ba246f10dceb2091823d3215f4928a8b7f3ce462e227cc5726834b6e86a503506497cbe8d6bf04a5b4085ddeb04816654829ff24cb8978551e92ebf588f3e60006b444d7b39efc6d18e42be234c37fc25ee2a1c02e1efaab917de7c6d12b05bd599adc92af582e7fb522c884d0cece7f912d2e69812e52aadf0748a98aeab06f391381f4518f20d029360b764faaa3aa1e69a9c05cc59e29cc663119ce74e74ce1efdfa565cd0a67751a070b4a0def04f79c7da5a7340123d00de354bffac3cbcf85e7309336977c2c4f84d528a123bf1ce7fcafc49020a8d51c48ded174b9eb468928f5fe94ea6dbbc83c68d40\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = b4a8e5d8f2cab3e3b659b1964fb9f634ff7ea5de5a447fc7c6ceeeba8af5efd0f136fb79e09b734a3978b655e74a0156a3bece09c00b578d894b81331770a3e95691335656eaf1c260e4e9dc67367265d6e870b37d0685b16762062166e10f0c0ec9fa34935d0943b0f5d4c5b1d88422e21f9e3846f854a2e725f22b53a778e65fdaf32ad88943b2baae31209552085f82f27a01caea2fdf471c08643d806463c61ffce92d0c1458518fc100fda777f769b33750aa84d1d4e206282f8ca944f151ef9a5061561e96453d7bcc9927eabc21a04c84ce1e0e6a88113132eee3a7d7baaaf33db8d1818e520e202275c5df2d3e749c3acc43326964a6663eb4ff856bf2291194e584919e872a31e1f040a59dcdfc88300a816a0ba27616919df4fc97d16de1fb0c6150cda6c329f643b036d99736b0424b6676ce0cc4d971aa6c5ad91a421cd369b35c95a38623fd99dbad13beaca3bfae5f9315a8a788f111608b5b856f4313ca6d19cc3172bffc6cccc28682a09d0ff74fd16a58234151c0224da9\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = a985e8779a4a34ab75873210d0c8897af9381c83887cff7fad9fe60f601801620747ec0a2c1f5acf6560a751216d204acdbcfe2d5bc235b84c17e903ffc96897d5df86031aeb1e40320502be3e18daf723c2577331e03c216e1febd35b30be8a419d5ac4e78674c93bf244e2cd8e57a4774d0b8763b9de21aa1e74b0afc3b423be7c52f32595934c993c88c32c2b0a66e5180c96ef478ea2be4262c840d3e2dfaf86b9684e7bdbf3b31b0513e3e48322dfed125f2d0ce186e58a321cec902cf01a7253b77069576594488b665facb1ba33671ce26cab40dd679f3817607719fa0669c6a593f30de1fafe264156cf48dcbfb8a5581f6a9a8401a749983b43cd90bcea0f6b690b46b2a00505e112d0bc0fd080c453085319b5d31dbbf46a234ac0f0eefa947f002daf872681ce731b27714e37fa3ca743cfd3060935affb356be4ce827e27ad36df8ff4b4fd72bbc0076d2277fd643ca0a39233a16fa545a4d84f1217ecf07a2ee57298cdb6de88f797116f80de8f446930045119e52fbc7840c0\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 3a567bb387312c94a0b8637807f86728e6e54ff473ee541ffdb4131cb5c55a60c6044a53a813672e4e5f90d5779dc21f824587a3618d4996449b2949720a93afb50520947d3b4a7391e2928acadf5fbb0bf87e48798e018f133b12276891e49007ebb27e49c858818e242dfea715f575da026a4f039840ddcba0bb330fe916739d095ecb76829091ad29e33a0b58e23f3e1c80a9aa4be2bc6e21eb1e7dd3061a737d3b460a5c4cbe6264b506d4f424bd0906a3977e3ebea5549825c889dcbb601c111f392f690b8bcf4b9935895e23c0e39672391f5e12e873d393ba19b00922d7f188def9a193789a80514abff02565376577c073a3ebaaf216d535f50f6a602ce038216ce7f1d1f7e9964570d8cd2b3821b11339446ebac43ec87bfb712a634089daf4db979d50d1a93e8badc40395fd8e8d680206606b8a1e78fa238f09ab3eed6ba87ee54ddd3a3bbdfc5c036fc9aedb207c6ab9e9ee594ca06da39297d8528fbdadaf80005162964bd4e0168d5c92d8ae5b05398d66c032ab5ae0eaebd7\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = a0f2388c5bc52093c31189674c410b4eabbe1ffd0e0a902dfe0b4fc7daecf29148703ca5906bd860065da69e5e7dead22fe28bbb7f3bf71d696174a900c115ab7a98848a08467643aca3a056ff58ef4b4515761b0e9452a587c4e7a0330faf97f657cf925e5bb0a395f7a798a715f41b70aa2d3dbe411de02c6ba40831f0b636e030a51e66cf7237030ae9569bab4cd8759baf22325f88c11cbac0b0e7b87dbe01669fdb5862101679e28774aa415df8a92e45b1ab74e1d85a95125163aa74c91da4a774ba539c7e1ac945c20df5ae3e31ec55609883f83a75fd3bf70bc4e4dc18b0a6e77d678d19c82400c698a0c34e3e77e86de8f51daf306f102a22cb",
     "a918b6ac435a045e89df00a9c84689e29b1eb466ad2c96c7326073afe08d47490230150c9b5d8ec84b352c6a33a896a26bc0f91e49fda6412bdd8a0e7c9b7f8beead5070a494af8b5b4a449b976b7f07c1b5648ac303e7b60adf3e53bd98642642f1041694986f214882a06f48db4d118f2b91c05578c0e7665c128cc6b4685b7faf\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5244\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 00005120b9815296215e7ee89f5a20a46dee6f255f7d96d399c8cbf5721f9f9c4d89a8ee37e2a6bbd6acd4878404856143960be4a77bd8f6afe6b255f15bb8bcdbe3395f800df64c2d2b55aa7cc3c15c3d753562359a14433abd29106a0d1416cac5fea97732828a198c04d09ed6b47c12365de2a98eeddac346fe879d39a1a28bc19e2ec570b94681f7bed871311edda5c8fd76cc14b15983046da8cdf1e15c465e4a9df0fda11ded950ffe5e67a3d07e56f902c7535331c08720493d6ef4b1760c6489e0af7d1b97229c4380167fd68f6ee30de2d61859ec55b5f0106ea0f675fed7c9f660520981dc201cf16a6fa87379d2c667f9c8fae97fa337c34d591f18b092f534be25db157e6696b1c85fbd896971f2c045d08be1470b403f2effe6d82fcd1b9baa9ba2c0ab0d25ca9cb2aa26f2c4d5ca3699cae3b61ee6eaf98d44610c8204e4298a01886e9cd21030058b29462f3d73018043466fe45307d2382b8b828fbad34f77c1915514a9ca9e0bcfefd3c0c7daaf02db684454c18b109a7a056f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 5120b9815296215e7ee89f5a20a46dee6f255f7d96d399c8cbf5721f9f9c4d89a8ee37e2a6bbd6acd4878404856143960be4a77bd8f6afe6b255f15bb8bcdbe3395f800df64c2d2b55aa7cc3c15c3d753562359a14433abd29106a0d1416cac5fea97732828a198c04d09ed6b47c12365de2a98eeddac346fe879d39a1a28bc19e2ec570b94681f7bed871311edda5c8fd76cc14b15983046da8cdf1e15c465e4a9df0fda11ded950ffe5e67a3d07e56f902c7535331c08720493d6ef4b1760c6489e0af7d1b97229c4380167fd68f6ee30de2d61859ec55b5f0106ea0f675fed7c9f660520981dc201cf16a6fa87379d2c667f9c8fae97fa337c34d591f18b092f534be25db157e6696b1c85fbd896971f2c045d08be1470b403f2effe6d82fcd1b9baa9ba2c0ab0d25ca9cb2aa26f2c4d5ca3699cae3b61ee6eaf98d44610c8204e4298a01886e9cd21030058b29462f3d73018043466fe45307d2382b8b828fbad34f77c1915514a9ca9e0bcfefd3c0c7daaf02db684454c18b109a7a056f0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 20b9815296215e7ee89f5a20a46dee6f255f7d96d399c8cbf5721f9f9c4d89a8ee37e2a6bbd6acd4878404856143960be4a77bd8f6afe6b255f15bb8bcdbe3395f800df64c2d2b55aa7cc3c15c3d753562359a14433abd29106a0d1416cac5fea97732828a198c04d09ed6b47c12365de2a98eeddac346fe879d39a1a28bc19e2ec570b94681f7bed871311edda5c8fd76cc14b15983046da8cdf1e15c465e4a9df0fda11ded950ffe5e67a3d07e56f902c7535331c08720493d6ef4b1760c6489e0af7d1b97229c4380167fd68f6ee30de2d61859ec55b5f0106ea0f675fed7c9f660520981dc201cf16a6fa87379d2c667f9c8fae97fa337c34d591f18b092f534be25db157e6696b1c85fbd896971f2c045d08be1470b403f2effe6d82fcd1b9baa9ba2c0ab0d25ca9cb2aa26f2c4d5ca3699cae3b61ee6eaf98d44610c8204e4298a01886e9cd21030058b29462f3d73018043466fe45307d2382b8b828fbad34f77c1915514a9ca9e0bcfefd3c0c7daaf02db684454c18b109a7a056f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen148 = 33222;
+static const size_t kLen164 = 33222;
 
-static const char *kData148[] = {
+static const char *kData164[] = {
     "# Imported from Wycheproof's rsa_oaep_3072_sha512_mgf1sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 009a389207c44f45ecd4b2ac716d728ef622e8e237171bc3e12f848e1743b73159a7731fc73bc8011bd8bb24855acda63ae8327dd60043e6ca86d3ea10f2dcb863f1fe20ba98246f324885198d642cab314c087b26fb115c0ba7dfffb222c3894f6577fb60bd07384dd4e71fee050408c9120a884f63ccb0901ea3e2ebd9da67c7cf54e7aa1adba1b146a9372f426e4d0f2fa4bbe070bcccc28a498fc711af83996362703b0433851ca516316da0758fbdac209eb63eddd91f6b3a24e87fbfa1d2ab8f8a95d1c143bb643d9ed2cad7778ed1bb41277f07a2ae4d5e01b263f905a1457fd1f7689c85694bc8a7f2181752a606b4e3ea5b59e1f85e993c8f8c528cdd0f9f09c65a53edfee6354be565d594060cbe594faf46d82a17056c8eaa59ccb0f0bb33114b9c2c029a6e0e7ee9325f03592ac0067feb660d99f8bdb6d25ba1ebc480ce770c367949668bdd2e3032d04968b5293c080dc41f2b69607c157e71c62570481a93e340a7a5be1629d91334533e41eae79befa422cd5ff4d838ec2181]\n[e = 010001]\n[keysize = 3072]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245]\n[privateKeyPkcs8 = 308206ff020100300d06092a864886f70d0101010500048206e9308206e50201000282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245020301000102820181009a389207c44f45ecd4b2ac716d728ef622e8e237171bc3e12f848e1743b73159a7731fc73bc8011bd8bb24855acda63ae8327dd60043e6ca86d3ea10f2dcb863f1fe20ba98246f324885198d642cab314c087b26fb115c0ba7dfffb222c3894f6577fb60bd07384dd4e71fee050408c9120a884f63ccb0901ea3e2ebd9da67c7cf54e7aa1adba1b146a9372f426e4d0f2fa4bbe070bcccc28a498fc711af83996362703b0433851ca516316da0758fbdac209eb63eddd91f6b3a24e87fbfa1d2ab8f8a95d1c143bb643d9ed2cad7778ed1bb41277f07a2ae4d5e01b263f905a1457fd1f7689c85694bc8a7f2181752a606b4e3ea5b59e1f85e993c8f8c528cdd0f9f09c65a53edfee6354be565d594060cbe594faf46d82a17056c8eaa59ccb0f0bb33114b9c2c029a6e0e7ee9325f03592ac0067feb660d99f8bdb6d25ba1ebc480ce770c367949668bdd2e3032d04968b5293c080dc41f2b69607c157e71c62570481a93e340a7a5be1629d91334533e41eae79befa422cd5ff4d838ec21810281c100fd9e30b6bcb1674ead266332e2af25c56b2869b4d822d247e6f5b35cb0f3c573b5efc39e4b5de760489b82536d6cf3eda1bf60e5e43f69f26ac8e45b056d702f0361dbb4a73f42ae5889a849657a841d866b8b4417286ca9b39f854c4d95e3719b6cf367fc7128088a365f3e322c1fff16bc68bbfeb69c5b2a9a677dca6d494de44ad057135e65ae5a5f83c59a0d1477e5175acf716cdcb2966fb75145dad1554a112c466d249ba894caae5e182c65f1753fe5bb583ef962d1574d9be20bf6a10281c100fd3c5d0967b74bc6fb54ef961a6aeea76a59cad1600e3c73f834e5f5b7b5096f7779c62b07f783739341ad5de095e0209f2f2f30b8dd503da8a271f4b35d93cbda013b515f573501ab80dbc7d9fa9dc98da4451e00e0032f53583c818c2645cab8f35619e7c27928648cbcc3af39f30e0a61259ba2499ba96b2ed7b9edb881d442466c07f362ad11a2a9bb3f67548a5e24c246fc6c438d32de9ecfd18b609ce12fccca90bfa4c3ef63cfe3a349611e590e44a53242dbdbbe0937f2ecd81c8d250281c100a975dfbada4df7673c8edfcd8a65d96915f6c4dacf6844f5423f7dff3b4546f3cfe74ae0241fb4904333955b454c7d98947119bfc24914f3a3a263e2e5b7803409a0837b2c1d3ae2dfc9eb264fa6134cdf1a50cdc8637c67cfdb90e7b117ac07a7009f8b25c43e29a6a039f786f2b0d6734ca4f6a8753ff83279451969fea7f261ce13737b3fa1d564115a2cd88850dae3ba3d354ae6a078bbc81dc73253c977a1abe3d792e9d910458b40032347d73e054812aaa186428062bc60e0fda35cc10281c0098b4ade5de054a4cd38284779fb69bf398ce4cdfb56ce0478e8557a6b501168f811c8dc3a52a3cba953225b956950a72a18b72898ef0e652483ead3942704b8fc206bc1e75bfc0d720f4b393f07e9067da6214cbe2fb32f076f1de8ac058d3fd4b4a71c16d60786f43331b2165a92c486b39e9d3d0295314f6ed68695650ccf9927da4e7a67cfaa087d69273c97bd174b3f5f3988430b814d4ea2fa7ccc495d5b55d6949a0475b6020705c753aeab5c23e3866e5c82b8c772c57f0c5a20c9590281c100a2775a3e38c279cc6633f91e528ba76d14750e36b7d43883b1c8bc89eaaf2878c3b6ea9b87140d6938eaf938d1f010656899717be3e0de04437e1da539c6acf3db3956bd49ad71b747778217e2dc67ca0800726a7ab9624e41f10e578719850ed7684db03b7010e86c197eb79f7f68c3022403fcce14d8cf9df186b0a2b97cc120e2b4a729aa5877089240a18fab397962198fc846cf9a10eedcdb7cced6091c61e8b1c621df270cab19e5795485a4b74cdc3e24028bfbbf0eb1fa2ed4531cd0]\n[sha = SHA-512]\n\n# tcId = 1\nct = cb9ba45404396101c1211be70415603708e1051b0debfa045b75ab936fe7c5d4e8c67704fd2ee046af8679e0bcf3d266ce67b801c90b581a3f6909f56c6fef023f0e2c4428227a51362d3f50ca65a79edb3faf899cf71bf99e244dc817fb4c2bce848216f0de57a1747fb1d4f0310e59f7ae0a656376690125dd10657357de11b5e7e5588af7083abc6018013ddc43d21c2af42c9c302f008064630a27ab014d6dbf48350c8758d821e74c45efd168ac37f366b413024ebbb0c9624e6a93d4c02d1f2b050f75de4b6a74c701386a6c330767af6bf03e8ccd69ce6540b471c01e6fe20852a10f198e4e0d29469b1b01d5ebff85ece159355083829e4c2935f16cd2f409199f799f250c8f1306da1614d0aa15578a58f399a17223c7618242cab31fe32a2317cf7babbb30b3885d5c07c4b89e91ddcb37f449cb3e2faca585d04beba9dce34face1167f5e4aaaa0509867716e3da0ff81b8a481b3f9cda725f01441d7d3d7ae24a5bcb373ff85e608ee7a49750a0d7d185a61082924b2343e18cd\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nct = ad215dc277e269310c54925f735d9bd6e68b828c8a9adcad792a567fa89f75bfd9512c69caab0539f3a2d4ad7caa73e6c1166d94645308d09f98166547beffa48940bba67d08391d8ce831ab3e819b1113eff18d02a83d7f07f1db2ad63cc53dccf2c9a8d8cd42f3054cbe1d223029364877c61d2a58d4c16929eb2c8b21fa1d09797a558d61f00f6b2a4b67eb794dc9730421bf52e073cca7bd083b35562d21b6527a525662defa0db2c9fb0fb3d8122a85128839e68fab7224756fe7cfde6d86cc7bc3c6665d3ecc52ad0ee25767d5f1f1815e56c79e1ae089a4278bd8c34fb397c1029b4315573391064c02f139e6a672b8a9f50678419ab6d9fc42fbcb69b71dd644ceb7968d6b0edea5f72d9d05da3d7b36cac7de135d45edf45834b47f7b2b91fe89ec6c3f2863f7454017091cf6622b02447a0f8ea6a8668c61a55f8654c4c8f60ca13639f125f2a3a46bd82d2bb6bc66511ab7050433cee0d6fa98946d18947d5649b380f795fdc8f0f13b663f518fad69c65601a51d170f7013204b\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 487ea78c9548871a93a0b856306f349ab51bbd30b3e6db0c47cfc965774cb0532575333f8584dddcb13f24ce98ff4a33d63b5b1898b3a8d9babc0ea906cf7d9ae047284f7a36dbc350d7affd57030196afdd419750f1c5f2fc55622e442e6203d58a725c7b6e59205baad02c86e44447caea8e88d38963389541a86933cc64c1d8a3b70c4870b0f75146de372de834988a5f852235926d7f3893c83dfbb78a1a8cb4d9a4d516de110d315ada9be71431d3e6b03681d4d7f665987000a72a1b138476579aae7058f7d4151f058410d93bdc197009b839906ea6254e90c1a49327ebf818dab3517edc39761d3f84be8f8bdc8b35541c6b6b30bf8cfd20fbd9a09713c470c9ebe0622ddd8b2471f9b0298cc77b51e56ac2dbf9209fc5a95c066092deebeb7ebec0bda02f89904ccad29ecdc1d263a29930947b90a6ab83dfaa657871be533d55231224ba4e866ee9a3e352f501372d75090b5236d39b62ee6c84c792dbb253dd1f9fceb868d460fd76847d9c450b1ee5f280fdb0da832bc5627957\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = cc6b45a4202ea5a1fc930a5008136091f48831e3dce258955f0a2fa95427a18ce12bc6d95424b983e2e75152b654a0c481014c6bc538354ff720b043f57c238c42ef536dccde3637babe7feab03e2fea7ddbdfcf1b689cea466c07b1aef757a7120141a2720cffda1ad422eae68d751425f879eb8e",
     "c65a1d0d24e1529a91f0643fac68e71da9f4d0eb56aae99bc03b600daaa127221dc20a5f5060820ba6cb1625382a4adc47185c0ea77d650cb517761a085a55e1a306c6136ba6a03d254079464ee8022a7e0189ef458fb4587b53fdec7864c90872bcfc5476bac7a7af7b104cec4cea576ded30bf4e24f80513ffef05b31e5031a2dcdcd2cba7784869c211c2ce0a3a65814fec0f153de0b8e327ecd2b0ce80a9bf691c1c08f5920547a2a08d749e229a6eaa4b770db54345c18ec3365f68fab045111d0928bb2cef7380dbbe07f6bc4fa3bf340e8fdefb1438188a474b206b430f988fde41f96b0642484d02adb39aa8624d908e52cc7fd3d39d74e002ea04a756b61be3f279ccc7206ee0\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 2034cef8731f5ddf7533380860b7426ba0a7ba97199ba332efb7422578d346ede8a41c8c4488d52cf2559706f1a677edbaa50c5783c00301cd41815e46c588e2e8657ced9a91f1b2e61d51d5e2384b59b90c78c8d5607076130926bf198e0968b239fd8d4451dad125467ab895eb3ed450e6abb61d6217c65ba2cd2176e2532594b5a09bba689ea1562d04527de919d47c3af5c2c24698e572f3ea289f5691afa164970daed05e83c051e39a99240a4fbd9c2046ae742cd1035aaf0d0c20b5ce1d42a08f9175d5ca30b6f4a7345b4820784c148a68f92be82f6e38638c1f8ecf8f07df3827f9fdc8469049d157202f31d98f06563f737ea3df3764f4644d9f9185cb2739c8aaac86e9b39fead8e03818550a25997c31674d5e14cc4c13790e409e278d778171c5462f689b0ec344f9a920a312ae9351c7d51ac7ca7783038b3d5e59d79c4d89ed4d36152d2a1baff8be23ae1eeebf6af20eaf093604cbe79fb93b61478d3a1bea20e1c6c60d63cd3e09920f521e3eb3e40fc21fe46103f3194d\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 7929db7a0ef0e385abca461e86013785f72d60fa4cf1c97b1a16e7b501235701aff06e71d981ff75392a27a266afcc5bebef5b1dc09ce60ad97b1722baf70b7be33b09de2f203f92a527a123e929b038428de471fb0edcb8e64741a1484ad5d2d5497f91aec6d87e5ca95fdea8962b61362bca2d0a4742f8666f1b067da8db4fa24cd721440d6582750498c9fd319d5ae5c27c9b70f1811d90b673d0529706d085fc78d73f933845278e36e96c48194f1494a1b4d891f249e8633c03d9c564534952e98c059dbe01294506d9238816215028d6414b954467650820e5db42b7701adb0d694bf2c00b42e89b80839b9f35b4e23ea70e55e514c50e9ec197423ad28a5dd4ece946345bd6ba154c122ba356320c2c1cf0ab4e0c713db0c8296ff900a078ed5f0ed1802d7f1f92c9305c245471d66820d4230aac6cf9a4311f7293e1d93a5dfd529dadc6699aef4c2ed53bcdbcbe8deafe5f9b035a6aaaf9b2d8eb23dac290f828bf1886136c79fdc915e21e06133f24e63876514abc29d25c146fff\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 5ed5766e97ba0017cc6ef508702d74049112f588e8930c3954b43c7398650fb1bfb94cdf75ddcfad8b50c59ed05bf8c32291e8b804f49fd5faef0e39b922e14ab4186c575cbee9cd2677b58cd890df072669c3c26845d7c89420cbea27d8c1ea43c2041a95852c85056e1d22c0cc9ec563d937fcb1d6d024f3a1a2943f77354885b3fdcdf8945f7b41e1f5a3c7cace9bfd2bb845f6cfee05f8f4680d1bf2b9d6510a6d2093a12214396ff02bdfeaee4b21af5d52244a3cf6eeffba75e946b83b5784b3bd98e5e585032fc88a1abdb12cd30c7f412c72d2e4957681f77e4157760c067a9312df871c972de688a839bb155c9de29eacd38ebea064f53f2599d08d6014c0f77f3ae121a4508c30eb0c8dd49c4c0ef31cacc3b1dcb2240050db157299260e9fc52dbfb530af6f759dba3764e4eeaed032e564141fc102399433456b91a3df2186ae9032957276e691c095ddaeef7142cfaf5bc86915c27461c136c1381a800bc3322c2dbdbfa83374922d607720272c8f955a9a10814c4bb9587e5a\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = c3aca8106f74c7733cd1bfa74419a2cf802f12293693c1a207158d52bfb728bebdea14a885fd52ea5600f82020fef8fa23f9078fb9ee34d82eed4c76b1312e7f50d0165792a938d264331da446b09533a0084e7398718c9575b66a07b7cdc85293695f291fc1ecbba9e0147320a557fd015a1339ee323d6706af18a08654564c49d2150f5d182a44f12e5d02b1839771b2048dd04c116f961e4af1632043bbade7e993b416c45c61e4a742bada5ad14dadc263431bd542050f40f4db8a95dfd24db22e049477f4ca93375e1d19513d64ecda0e9da1166da426a0c8614524471d72d413f2f6822843154959239b134033c876b0b68cec3a5eac05d5f179f70305f1f2ec7ef9ed17e79598b3d2fc148f9aea95774918aa6be14aad89ff5d612b13fedc0937bd1ab01f05d43b5f7c131086c63f5430742a347cdcecb435912d226ddde31250c3c0ed6d3ac9920873c1e73970a9d44061dcf6e0acf1a2935bcc48e2fb76ef74bb5101d0bb1a02fbf9a55ec75e122fa4dbe210836873099a1f91af20\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 4ee617bce690f21a6cd1760d8e7c41ec1c4bf0de2bfc4aa85002c278eeb63b568118e4ea28cf795a673965cbaecf1af5e4943b95c0fd20604911477492950fb99fbda4d5c0ecb11d954c2bc0d8522f5ee7365427d59143b261d6138aa2f27ee1a60d64f1f491b9ba1adec8d09f242ee0116e201a54ba968ffdf39edc3b314e8139ea8efca06185840ae9a3996ff5ff3c41add6c4dd6ecc3943aa60254859db786a0f0500f644e3d43e348b993439cd021ff0b92d05f327d6bc3c11ebb2f8c1812dc460d4ecebb358eee01fde79aef408a6b51694a2a2f7baf69589f4ed152026303290d9178c9d580421996c89e94e14ce91de0686d70a37241e48e439bad3371aa900d0d6142867ec2177ac21d912eacc5e2413b78b0adad7bdd0f72a5715c69f6223ac7ce99fdc20fbc7c603371c328eaee80f94f079b935713d38d83f18dc810dfdef5f1221ff8a24abd4a0de3e5d3f993bd5992280b06bab17ec6e36b27b7b08522f8bea3390590832da475e85ad4b898045930855be48bf2d56603b7485\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 5e8f89e2720d8edfa1a943223d6445bef51e330036fe6efb07289dc1388098aade647cdc9b363b4108a900611a1abdbe53415599192cdd5c39b4e467073183f4732e06a58fd43dd48d378495b2b4109d62042edecdcc0a93df468a0f2f96a4957fc744cdcb891484d7a1db15a6e2da980a91942814c5a9910dca32fbd27e2fcf862756a50658c8531d12ae652d088b15b674dd4bd895e8cad8d81b29c78eb7cdcd29737c8e532fc0c8128222120dd0a4da19d00b603f6cad9d6dd559230e237197269aa75f4ca4f361e418493aabbcb0e55bb3aa114c5777de94e53abedd9e358b2bad3fab666693ad525b1970b97944578ea65a15e31bb1721776bd9b91ac9f558de32ea498948d75d7a7a9ea610bced38be4dad797dd5651eab3b972915ce41aefcd28b641a4563b71b491c2322af7b06dc3f6b6e70ee40f25b6731a5f34ef7726cbf19c65b26d3c4f0a673753c6bc538841b6bd6efb89fe76793ef7859f6866e264baad2a7e1b1c3905c04e1ea8632aefe5c158cb560eba262aa7a3a6b143\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 4d0da40b2f6c6ec3b8de97593a591681c69853847f9deaba86baaa69b42bfc3d8fdac5fbb3faaa7a5edef6e7ca0f25ae169c6545f26c908a1e3bfe8f0a385c584cf3da930acea13076d475e9b428ef9758113d3d8a0e23eb2dcbccbb1ca0c9b384aa760d17a5764a7c4c709cbfa9cef0ba5672cba0deb198577e3abafb2176781956d0c4d39632fd30f778b8da3da16eabf3caece2a325926dcd25abb0bf743b9ee06a3b4496d82489613b0a720353b017e72c3c43eda97c6444d8f2edee7a444916187129bc0e9bc20e457c0946c767d3b32866655742e891490ee996a3b2106cc024c5da94ac89dac17fbf0c97a95541f8283510411868863e68d9efb7ae4493246b409441656ad0eecd3f0d84c7fb16a593cf0e3b5ce01c142da30d50e42f58c7bdede2dc350313c480a644802fa10fe117c98a92f5f8ce6c9c4cf3ac0b01ffa629dda82c217171a4723db2ce751d4a359dc53dd4b398e7882a8c88c9b591856189a9f9afa349f02573a9f07c6cb96eb41cbaebe69dd82ea7d9b860b841b5\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = a5f338d231cde9f20f87f69ab54147107fab298cd79df6635d3ab882e8682d0ce5bdad698bcdf0260b11ba11e5db3e857490f9ffcfe8fc98b8c89f09903f984eebea2ed74c73ac578bff3af99d4fbc33587d91518a948549739b0ffab4ea6a3fef5726eaf3ce77cefbe4fb001386101027d78b04ee5f23b6a7b0b5ffa9b473e7a86d076223fbaefd1f5ec030b5fb36aab0453a3b51440dd7709b78c0395e3b43ea873afa61e2e391abf0ff567d934c61d87f15095143bf660b73e2df1be6734064445154593fbd304f80a9ff730a66f54078142ad5c49e77b55ad5de5d974ae09d73f4fb506099ff06a226de67d55665115eee485372c19e599197aa561909804462dc0ee6d233da9c30fa7687d4f0a0f764646697bb93d2cd8cb6cd86cb3143b043f54448e032e8790e856604977e23088b69a57d4677e073fac808c8f65240f7628d09e0bc74bf7d6fe0ab2f7378808f082219edbdc1c1d456e4bc7dbd8508415917ec0d5f5ea10242368b8fb75cfb28975110208788b5696e34589c8a48d4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 715a8b585a2759b9fbebcb1683dd7d1fe956abce7255358e05cb19547a92083c2b5abe5c429c2a5527bd8193a4d05a0a8d161fe71ba612cc8aa3270a5b8186ca3f02ad716d78b7702c20f7bd17ba01748d1b51e52b6cb6561c13",
     "e84ccb9aad4f4c241a951f999d4b7b60c14021619951204e046d663a011eb9cd9bdf96bb2c43d6f8bc97bba1b63845db59268a3ec918e198448050332a540fa49e39796220fe2a97999160f564baecd0ebc4be5030a2016961f9f352d7fb04ae9d3218261a510614bcdcf33ec274b31cfd2d4c9462803c825e7dbb1a3b2618fd5067bf676c5fbb2f6dfee7068e84d4de68f840f97faaf880b8596d8847141ebd59eb9810d18cd95ab6a8b3bc87ba2e6bb2ae178a0e5043497b5cbce86508d96991c5f3d78ea3cd3a77be12bff0a0ebd7a3cd03b9bcbf7faecdad6a375e55569ac9ec02c9a319078d79ed2ec273078ef328b54579c0661ed64dd94883eede29818455b37b271c67b7bb303e743d6a080076bc712a2f22b36bf85ea242f2b8697b0b265102c557\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = b65f42ecb2fdbb8c231e201751bcef6779d0d7c755c19d5c82824ba34a5657a6187dea33ed2a7cb91fc1e5a3e417d806be4e626c555750bca3b45d0441865f0be6a52f5754fa871ffd1fd58b00f74e89eb60518330b21b78ed6c79fe38b8ff4d0f7ac49a152d1c54189e2eed31eb6211601b8b41b9a90e5e3d34e537b0af684133780bbaa4ae97c6dea9a75ec01cd00d2c43ac2c7d8deef21cd6c6382e2935ea1a0e350156dca5e78ba10e88891a5c0978859ac2645f90d5ac32eaf791b34a0c7bde0ce53572d2258ab7e5a9058624892d5e680eff78aa4232b579f94acad6081a7fa8330e8d3339afc4c57a48bd39279a54900e755f741aba2d5663e5efb738b38c72af33c13be9e996aa8c6df839f08af6a4961bcded7eed2b5a67a81c112095f1da9a3e6aa6e149715bb69a265dfb1fba8ea52bf7c8309f613cc183cf53890fc51e4c5f3d01336d67ebb66a9cb0231bdb1f99b033e9dd361262aa6c1dddcaccaaaa7b6a3e94c2b893304404c6be98cf20ef488f64b7540e4232d05b2ebe0c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = a0119ccf48d11ea14d4dd8a57d954cccb913fabc353727e883b53d6fed8dcc48ed7cbf98e3703c740df9bbecd0168b42e699c48841c0a964b40630f28076069a3363bb14c38e830712376d9beeb719d2620eab87e99ca2897ae1fbd4251f828db85c0c76a4554a39b2e14150b1d3020850dce02ba6e7619daa5e95598d50d9fb9bbb7ad57d60a4811d50f432845df09da1f01744138d10ebafe8951e111aa93b24588c803b37b12b2e572c2b46d13e654954828585672706a001dc4777c9b4b937d92a761ea3fce68c14379af6a8a2700cc20f25e47a0e4bfa85e2082dbb569522853a5498d539faabb90c479fc95fecf1ffcd3d03f9283b806bc6ab6b7310e72be66959082d631d138221c4cd81c46162649b25e46f9fe864b4394f8afede0bb4c1e148ffd62202141640555283eb683a3d3b1fa0a62d8380fdecf44d9050e06bac6a24fcfef1e2b04d952726ac9cfbd67ae3090ae90e16379a96bc7731a38401ea68365ea413ac757de058730259473fe79fe30e1b50e4ae66730e489a61e7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 21f59c055849cccb6dd90d2aacac59f987c1dd44f560c7137cc762f975a7161edc11503a838e4ed98cd8c630b20a4c43bf191e26d4d4f19b4e714d92cc45303c14209989cf10f9782d96f31ed8d7bab24ba02fc114d8dbd4324bd5b198565bab012bb7fdbe6754ce6b54666484aeb42952b055fa69601a16cb86a20652bd091859904bee412c53759137e811dce8eba60390b011b123ae6c1d6d76c33acd26b54eea627662cf1c6887f8c5b62121064097bcd69eac2b2e669fe8e018ec3fff888396075059ebc0289c8925538861246b2606e878b4d93c4c33c3bbbe21cf5c861f5bdcc9121cec2d0c4dbe3a95976a658c8bd8ed7579c1c6eec248317ae3d3c73e5104d377ed5634c16bf49e65879db350bcf5988b99ca124c3f5c4ef52b7f170f5c48f139151adf8d39dc1013d9a152321fc5784e1e81d3ef1cdab8fcd83623453fe4ef7b825b1baecc5817a13b56197e0c0c35463f8f8d8bf2a1068b8555aeb0e099ff5c9b86aeb6c495f6ebe6d0d6d44ace2ef80ec9fb647954a9137b9cc6\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 100e00b23d1058916a2d99f5a1285efad8c62b8ce779a558d9256ac36757a024bc6f72aeb307db6923d7407ccb91d1388a525354373619139eab0cdb413ebcf50b82f19184b2187eddc19b2c0db25f4145b35111111b98b109939155f008552ac863a7bfe1dca6bed2c47cebf48e29328c475c9c34499b770ff42f94878cbfb29e6254f89a4d49f5b886d355834c3eab27d65013a5928e6099fe125e61b8300e68fcad66e8413404d6e0eca34a8701c2575089955cc13fe0c0b3e7fd6a4bd296c88fcbc71c07bf7278a410b90fb113bdb26db1738b06b5d0b559cbab838d4567754a7154e17eb7cc4506d47ec99640c51f1d0134da884335a3d982078a5aea7543ad3a8db51db9bf771656105982e0a85b30ff080ad7153656d52ab2a738b5e8beace9a74d9492cdbf079a8293b52c8284acb1eca6ae8e0b47b2d699d069536b62312ede061a8dcf651d3eb4286ed22c6da22418a5856cded4866f74589b88ff9a3afa0479ad7964cd567953510df300cf3a3443e04495cc0fb02a8ed9c352e5\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 8778373fedd6de294c9f7dd84acf66211883066ecd53d860d53031dc51e303841f14dceb8999be392a6ccd19b899dca89764db04c2308f241090b0e09bbfb60c82e460757f6da6aacdda90f1a853bac858100d701fdf37997605324cdd7cda6260dbc2fc40ffb17973d1d82715d59055f8d55c74c93c9d7dcab167e25d8d26e0d98b6a02e5087faf20b50e429fa134aaddd0213e938f6f6c03ee89c413991163746a7df66212ff7b03de95c7be90a0888f8791e3b72c8f11e310c291c3f316425ac2d418baf46aa79a1ecca245e0fdb92a0f4e99eaa8992bb0f5973f080f2c72b7919055e88026012d86e2faa008e24545c38470b24dffe84f12577a14311306a9293ff98e3c6c42cac10b913d912e5060651cc73dcc015707c429c7bc669204d78335babfcfc614d4019fb45be0aaf7ba50b7947bba652a2b1984d876ecdad54fea8ce3d1524e812fb2519c17db82f300cc3d7c163c8653b46ef233c1678dc19dd75e93d0db22648147fe17ffd841f38177033b0183ec70d3a060ae69a71f81\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 66f53d3aed293fc5a20d24b3a7a2774e12b69115e277894670046e3fe076d7ac74b830765d3d8b12b3979ead0d87ad3a0a8b3e677688f7b8cbf5e7ef7ed5a336ea144667a507be46cd3d9145c5ac552ebae558ee95d4e17c6e9e5d49105777dc1ddac7969318d03678e2afae41e265c61704b7f61cc3306b0ead4d0d9e36ffd08164f93422a1e51769b0c8478c9975e1b2244544252eec743da10d8eca2cf901a3052904e898d5018c0ea9923bb6fb8a405cecadd81a3f858e34c87c069897729186710de5bac42a6c7a19a3f7b310ea5dea8bba7c594ddd2cb5309703baf64cda2295157f8530dc5a46de57d3ea7461df8af53474b15b54644d6e724cf6684b72dbabd5cea129c80a1dd67f7b636b55ba6980fc123859e9a702df29b2fc3959ecdf9269246c4cdc05bd06dbb9bcdff693ca4d04170118e7fdf43b163831f0f6bb9828faa316eaf92a4428efed7b2f22efd93761593be714e9a85aa7b690472525bb0b2a28712f5f524ec56e1d0515ec7cc190662ed2be402c824396f7de194c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 6ff0c91199b45d05ff630f4b8bb84ec1eb03dc229b51ac817c210f6034e8f27e8623bfc1f8cb5e597fe687d075f289ad76cb2d1e6ccbd7aaf7812e49e2408c74b4b8869d4bc86db5c2d6f62d2b6c1aaffa76d3059809ef3945e7fad49dd198e132f2681c4148eadc808231b6dbb7a9a8e5b5361f23d602c0873ef6751cd353f10d1f922a20982d60d29bb7eb57c86d3337bc8f2bafc28f830e16b4684f7b6f51e0efc3cfbabdf76b08cb8b5770e9f709331053794e35e159ecfe46455bb0994b38994fe6f405b6a88b7f5912c409f9781767871b2ba18f5e542c964450a5dac4c82212945e968878e43f4698500dd10621f31eaf5ccb04551d6ed36752f110fd5cf3ef72b2c3369db93f6480b3cb01bef799007820b1f4aa34354ffeb4f7c8ffdc90e6d19d1744f27516d67d1eac69f139b5b753497a599e977f459081460a35c75d986383ee486810f1c6eab1836f7ab4b6cbd427fcb206c05d6e46c84fed94d065c22ca732eb88c02550dd72259aaf4afcf8da2eb419e81d4f8a8e914e903d\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 5a8eb1da635aaf6e94012e3d61f9c7d016c657b812d9d95c50f4ec073c662392c4ba98b5d9c93bf5fab48d724ea9a147b5b84ad6e169033f32318c6fef89b2733c9040aab0862fb4b049f560fe1b448b987d203a40f3f46cceeab0ed9589df97e6cd928fffc5d20d64a10b31f54bcb269f1522f04762b4935feb0b02ce5d9a8a0f99910a4fe237b00b3f48e44e04ee9f7fcc06252b7c08dfbab4fd27e47604f4022d3ca0aba753b9ba9b9defd3496cb0c752a2a4cd619755fd7693ee7116341f8b9575d13b4f821759055225d0fe338659c02eae9c528cfa937a1d58efd0463773a29e9b34ad3647487267df59b324f6b8e73ce0be930c5f163d43df88fdb54e761bcfc12100362a17c507adef60e2be506df242e81161144be1e4a29a3426436c0a7d0e574f9468acc5af42981d5cdf5775e2b7d4e02121398b6dcb2d590417c06f6daee42199ffb4a51b0de715676d3f9779f1ec051219057c75208ddaf3b4530fc0360d389d7f95fceebb0123e0fa25c5c7c7f4f8ff9d88a928d6904ef4b1\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 9fa960f4d424a2fd23f7cd07dc40f43fc0490862ae8fbe2399a96ac7f9931e2f30421692afeddbf00fa86731e6e6724f428a479b49af5af07119856a913fc9211c722a6d25791111650b71997c40a7c8b74b4d0efef376806099b634388b93da0cc5e3b2678c5037d399fb7770546ce572852b1f4461ea415c7dd846b5611fbff3a492203d16b18b476f48b4ec0c3d900054607843bc23dd2d8e4889ae2871774fd520c510b48fb25dd15ca9f09c4cad7adf5614813506511473110780457194d41357e2ebcff9e3f4819e70fb9ba71d9eba053946beb75147f47e5d6fb1ff8c560010c32fd708025f5ac3f201d9853184f7997ebe8ae6526f7c7f7d",
     "abbbf94ceec56e61528b321e5b9d6255b90f205d9ee6a1f86d52b97cef1764fdc42ed14c22675111650e2237be27ec2d1e9ff2a70ac5832ac5a6db325f3fda757dcdec0fc662803cc76b18537c03465fa51cc15c395369001bbc615334f3aa161304b6ec18cdc2fcc44873e22bd833fafcbfac7a74f30c44aae4a176f48f8686002a6d10\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5244\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 0000cc6b45a4202ea5a1fc930a5008136091f48831e3dce258955f0a2fa95427a18ce12bc6d95424b983e2e75152b654a0c481014c6bc538354ff720b043f57c238c42ef536dccde3637babe7feab03e2fea7ddbdfcf1b689cea466c07b1aef757a7120141a2720cffda1ad422eae68d751425f879eb8ec65a1d0d24e1529a91f0643fac68e71da9f4d0eb56aae99bc03b600daaa127221dc20a5f5060820ba6cb1625382a4adc47185c0ea77d650cb517761a085a55e1a306c6136ba6a03d254079464ee8022a7e0189ef458fb4587b53fdec7864c90872bcfc5476bac7a7af7b104cec4cea576ded30bf4e24f80513ffef05b31e5031a2dcdcd2cba7784869c211c2ce0a3a65814fec0f153de0b8e327ecd2b0ce80a9bf691c1c08f5920547a2a08d749e229a6eaa4b770db54345c18ec3365f68fab045111d0928bb2cef7380dbbe07f6bc4fa3bf340e8fdefb1438188a474b206b430f988fde41f96b0642484d02adb39aa8624d908e52cc7fd3d39d74e002ea04a756b61be3f279ccc7206ee0\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = cc6b45a4202ea5a1fc930a5008136091f48831e3dce258955f0a2fa95427a18ce12bc6d95424b983e2e75152b654a0c481014c6bc538354ff720b043f57c238c42ef536dccde3637babe7feab03e2fea7ddbdfcf1b689cea466c07b1aef757a7120141a2720cffda1ad422eae68d751425f879eb8ec65a1d0d24e1529a91f0643fac68e71da9f4d0eb56aae99bc03b600daaa127221dc20a5f5060820ba6cb1625382a4adc47185c0ea77d650cb517761a085a55e1a306c6136ba6a03d254079464ee8022a7e0189ef458fb4587b53fdec7864c90872bcfc5476bac7a7af7b104cec4cea576ded30bf4e24f80513ffef05b31e5031a2dcdcd2cba7784869c211c2ce0a3a65814fec0f153de0b8e327ecd2b0ce80a9bf691c1c08f5920547a2a08d749e229a6eaa4b770db54345c18ec3365f68fab045111d0928bb2cef7380dbbe07f6bc4fa3bf340e8fdefb1438188a474b206b430f988fde41f96b0642484d02adb39aa8624d908e52cc7fd3d39d74e002ea04a756b61be3f279ccc7206ee00000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 6b45a4202ea5a1fc930a5008136091f48831e3dce258955f0a2fa95427a18ce12bc6d95424b983e2e75152b654a0c481014c6bc538354ff720b043f57c238c42ef536dccde3637babe7feab03e2fea7ddbdfcf1b689cea466c07b1aef757a7120141a2720cffda1ad422eae68d751425f879eb8ec65a1d0d24e1529a91f0643fac68e71da9f4d0eb56aae99bc03b600daaa127221dc20a5f5060820ba6cb1625382a4adc47185c0ea77d650cb517761a085a55e1a306c6136ba6a03d254079464ee8022a7e0189ef458fb4587b53fdec7864c90872bcfc5476bac7a7af7b104cec4cea576ded30bf4e24f80513ffef05b31e5031a2dcdcd2cba7784869c211c2ce0a3a65814fec0f153de0b8e327ecd2b0ce80a9bf691c1c08f5920547a2a08d749e229a6eaa4b770db54345c18ec3365f68fab045111d0928bb2cef7380dbbe07f6bc4fa3bf340e8fdefb1438188a474b206b430f988fde41f96b0642484d02adb39aa8624d908e52cc7fd3d39d74e002ea04a756b61be3f279ccc7206ee0\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# em represents a small integer\nct = 26a03bdf11a01ee4ba476d721c110840d093f38ed49f406c38f1c46fc4735a29bc7deaa3336aea98f6cfde4ec8ed305b91a194a23fe73112768080aba2c9e152f6ad8fbb8401546fac21ff696fb1f52268957cfd591fab64bc48c3c87ae5b3eb871beb669e15e881c0a9920ee5f401910d3415850fe2267f5ed141ea6e69d01cde65fb0a8cc063c33c0d333b6c90e7838f97cafb7a8aacb14b499c534a6af12934ee0c7585bef97a1ebf74aff278664aad35138fca85f360ba259d47542be5f97733b8f5e7a39bee1772cb8038d08acf56d3e8f613ee48ef147d6f0c1f57b3c08cc68b1c8f106402baa6834d460efdb8cc1dcb54f79f2928f4509e81de32d9839f9a022f47a83d8616f482c31eaeab84318f898763de7048f507a517900666549cc093b3c8f4d68c84fb33190e2b413134061e20ff51b8da5545aa991f89a0f612b5b2e74b7ad7facc491c7bbce41799ab70be4bf96a0ec76017399662ef8a6d8b3d8569ca86b2952ca3572777efe99724f85fa0375b29bbfff7380c36e4c533\nlabel = 55aa28091a62698acb80855f292ce725f088dc8fe0045e9e49375aa663055d72353a67087466c68306ab0135004b7cec41661da3db65188b9af52b255bcc888300000000\nmsg = 354f2c7d123c5bd8675e6f05c7a2d2a68f9002439be237430993ea325858e6a3690cc9345014539db4dffbe387995de694ff13c942a4d2634caa52b8451d2b04815d9a764cd9c7576943b559b7639ed8c0b604c2e59e65af105988c71dc91c6a0970c8917b0e00d3029bebf66129d4dc60b03a846decc6bb2cba9c45f6b2eefab79a9df5bfc01d93d5aa6bfef888d7334fcd0d2cd41f7b3e1c564dcdd2eefcb8819a66fd703cbbe9a4d7fdede75fc8578b94f8ae0009bd188f8c7469d6588ef8f240fabc1ddb0174783967106d2b6aaedbc15c4ece1cf7e12ba1d14415d7261d6d56efe0bc93f6838569504a131a4e126124d933bb63f6df189145caadf7\nresult = valid\nflags = Constructed\n\n# tcId = 31\n# em has a large hamming weight\nct = c63dfab03faf7d5933506b3a7ead6c6cb9bebf25ff4afc5693428e988bef9fb508e9d50f58f8e76f26121eb98f036c15d2538f6c8d7e707aff411d24b9ec3fc5ebe0fe04de2f13c212f674585dd157f5609b9ec156a04642e1b087b6b3d2a7015324c5c3986fb8a32482ca52821c033fe499e41aad19a55d934d2b179f6c89bf3b34b20f2fb616356b13b4aa8041089d9ba831f0868a66175609f4e3cf067289ca512b0444ee3a5761b5b95ee79151eb429e9fe2cf946c8dd86d5862ddc33997eefea8e7912a340f3d1e2d5a69eb32ec2bc82f74c4e68ba8c565dad2e9c71b81325d76a3fa600120cfe96613ae89a4251200df79ab92b1f04d9ec34f61f4bc71f05fe27b972c91be268d1e52dc46d85911212b9ecf42177f3be164fc99d11b878f1b85a508f13f583b4a0b7cfae186c421b34a997e31c594b7370503830ef7fdd8b50198def928a1075594a6e0b418e5361cb186fc3bd4ba01720081e21c9646aeecc0882c847871c894562508ce3320aec2f9b04c5b25975c9cf5af7364a3e7\nlabel = 5360d4b1eaf5a46e6f6a6ed03c0d405e7ed7fc2cecac86bf3cb27348f9d66a7bdca863e055ec1b6a5b20c351d63dfbc7eb599589d69a46ed7eafcd2ec117547b00000000\nmsg = 5265a56c99e71128fdcde31cd5918fd7e964b9f1d216bc9c4c10d6ddd3f63b65f0d3041f061c6eaa6f60407788d",
     "77e12b4e7b3b2e3751d2f1774d626e83d195c5b4d23e3fcb5f50eaf4252d720737b2af5a4e1928dcb7fc383193dfb13ffc6cafb3b609ebf0395508fa5124ed27207bef82e59dde2251dbbbd44405f69d771ffe54d269d417c42979dc014c1579ee58895475eb014ebfda48971ef3a08a3dc4f97b9b996ccf293d7b8f40055ed842eaece6d7fc4c76cb342914fe6bf89beef8ef463a048ec18695578ba514e5f6dd5813c58c7acc6f6eb02258dc3adcded16bc7cd3307e73445dad5f36e7e230dace3d4bf568daf408b6e07fdb365db5ad\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen149 = 40513;
+static const size_t kLen165 = 40513;
 
-static const char *kData149[] = {
+static const char *kData165[] = {
     "# Imported from Wycheproof's rsa_oaep_4096_sha256_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 097a59d2c4f70377793937bbbd95d19b5d01edfb1eb3b073e27e4cfed416820d4af4e04cc3f53d272ae43551ad0cd09b89cacb21a595f9f8423b3b0148d2ad46cf818fd9e7cbba18f4f84a1dc18f69ed5a764c6fa191a3664fa94a39bafb1a29431e6fedf61eb9164dd7684f0cb506248121fa948a32c8733f3d9453dae61c8708b2500582f32d91128775265f18bcab6eb170145e33dc40f1bab451194cf8c38f9fa91806bd225fa4b54ca50813b9d7a54f61e0000e5e0769cb2a3eb99b1ae9c3c5416dac83a6f91248c734d7e63291ce12de4d780703614128f878f29015801c7a5ec7670e531e1573ebc8ce63d640b01b9aea48b43d1eea8ad85b55423d4e142bcf73315f3e9e978b65f0556246066596013fad97b83ba552140c6957ef443ccec4051b2a8c9cd9f25c4cf6bdc2e904f46063e319643283462a4047d49c38bdbb0ee3d87980ec08410d5d2dee8e5349958e4178aba065a55d79d89080570fd4af5678b1573e42f2e0f863b31bb4e19ba232c02ae5b8f948d1ce8145c4968d24b56ac930b4f67047257f3c0b86bce7a77b8d0d87124c4a4141409ac11377fb9fc805d60012386becc2ba8478e663becc3d73239ce3036c2d2fc9e6e2e370c2c78053ee1bcef7a87872ef92b784638b84713a5d78ba8c3a868e3466f2275b252e19766d2104ec60537bc1589b1558b76643751f6a60fd8a5102b6c788e0f049]\n[e = 010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed]\n[privateKeyPkcs8 = 30820942020100300d06092a864886f70d01010105000482092c308209280201000282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed020301000102820200097a59d2c4f70377793937bbbd95d19b5d01edfb1eb3b073e27e4cfed416820d4af4e04cc3f53d272ae43551ad0cd09b89cacb21a595f9f8423b3b0148d2ad46cf818fd9e7cbba18f4f84a1dc18f69ed5a764c6fa191a3664fa94a39bafb1a29431e6fedf61eb9164dd7684f0cb506248121fa948a32c8733f3d9453dae61c8708b2500582f32d91128775265f18bcab6eb170145e33dc40f1bab451194cf8c38f9fa91806bd225fa4b54ca50813b9d7a54f61e0000e5e0769cb2a3eb99b1ae9c3c5416dac83a6f91248c734d7e63291ce12de4d780703614128f878f29015801c7a5ec7670e531e1573ebc8ce63d640b01b9aea48b43d1eea8ad85b55423d4e142bcf73315f3e9e978b65f0556246066596013fad97b83ba552140c6957ef443ccec4051b2a8c9cd9f25c4cf6bdc2e904f46063e319643283462a4047d49c38bdbb0ee3d87980ec08410d5d2dee8e5349958e4178aba065a55d79d89080570fd4af5678b1573e42f2e0f863b31bb4e19ba232c02ae5b8f948d1ce8145c4968d24b56ac930b4f67047257f3c0b86bce7a77b8d0d87124c4a4141409ac11377fb9fc805d60012386becc2ba8478e663becc3d73239ce3036c2d2fc9e6e2e370c2c78053ee1bcef7a87872ef92b784638b84713a5d78ba8c3a868e3466f2275b252e19766d2104ec60537bc1589b1558b76643751f6a60fd8a5102b6c788e0f0490282010100c3c677495c2bd56619e44e26140d2ede0037409b81f3a5b3886a0904eb486140f43b8626af13d14a33918eb72b786b3c9114f39017871528953c09104e1fd2d36b725388f54ffea30373077895a6934ab174e55ca6a12c21923a7b775b5ffaffbd813f9fb752805b016a5735b883c639fedd55ba2e233a6dc1673063d8487390d1676123544d3def177a91caeef98b13f38860474e44993d4c6060926d878a2059855d0de1c794ac8dbdad655fbbad20f152f15c73b95ac544cbb87b8bec8fd3c007ad09d76ae22a5e993302aa72f11deb265a7f28b88976af5d0c912d97b7284b1783c5bc91a6dcb7a9b97fe53713965857742b7e4032dc5141acd4afd4771f0282010100c357cf685f9b8d4e59e96686f7b8752f0a982efbe6658e6bcdb615d921f5e7056882825347455782d7bc78d637e17e0e6810c2136ad81b16cc1c81750785924616f2bdf5964b26c7fc50fa98fb67b746b50812705b379f5deadbd11dcd2fec7b724d042aef25cea2eb37f85b7554d7ad49fe5f47737ff436bded418507f2f175c695e324fbb11beb0544a7a7cb3f07924e291b5c8ddaa6a7dbb07e23bce1960cb52b9000d3a7aab1f58e3c750b6d978adf3d085ae7693b7e6a46cf6dbb6d2ad981f4bca5d15e0962c39066a9fc27985b9ba1f51132355792796a5dd847400804f98671ee4899050bdc2e7872ce6fb2b78b1050436d882425ee0745546a6a1c730282010100a6bbb5460638d2b2f5242aa6657760cdf3731b1415d5f2ee77248f6fe00e31bdc70396da054ba47844791809c9fcf19f90943e671e928e23950d9f4e82aab9bc138b37b7b1ed2219a54b67367c8574762db237d0f39cda5ff110dbac286712f69167ad4f122b3263cf4dc8de58b9e9ade4f08e1d5543ed74223e06c9521f4a45310291892c37e8a262e5a19b2a71decfec1dde997c00125e5158d7867dbfec9466899d59c04b60c4a0a6c5314c1a2375a5f194dbbf37422635d426d719b12c41140fb5806735814ec268493861002977e8982e8493a2ae78251be32315a85b75f6961d44dfb7505c34135987a2288907074fdc015ab1c45f3cd8e91fee6bcdd302820100178cd58f72bf5118da141e6d351e42da69ff90e2839348c94c62a05dae0f744b9d9ee6515ded4930980bbbd1afa8fac687db455a8bee03ce0acb80fbf7ed2d864fabf224d27abaf12f45200123860c7d74c3c55d5051f35fa239e00b24ba9b5b029bb05df0b8f12189141558095c32284d1c62a63d917682c700fc7e2a482abe1533eacf819c878e1cf37af6eab4ed97c0de89d2edb327966310f31421e85c6ba9c7d7b391d0cbee6a793c66abfb09630fa8cf020e960c3b205aeb15029c95a6e558f90950a572a23a8b852507264ae2f86f5d1936a161ae61fee5d3763b8cfbf48d35dd1159895735b350881ec52e999c255a57d6b3ac0ffa935bd36284ea6b02820100484ad86e79415ea3c78af5f6c807cc99decfb14ca1e80c8e6a1ef00ee582d3d180774236a54ec9dc8dbcca51f4da4379cf634f3a07cea4b7748d7b5d94cacd4d474111f92d19f3ab5eb4def8dba57b990844efd28d85344666e283f5d5fb0e6e8d96f07411c882bf280446e49b3b9b15218fc24da34ce8f01e02735920ef48a343b4de11f99b26547a251afa7aaa69083c421e2447b1a989d50712bf8fc35882b63517c7c39843cf67b92645b68c6d8f90331600142e6cb97032a5af6ef7c20f87630c6b25dddeb57f2cc0cd8c8a0661b5f40ed6632989f5d40f33bbfd9be09374483606c2cd7ed8b5fcb8bf3df1f9368a13922b1240c0d25792505b857d3e8d]\n[sha = SHA-256]\n\n# tcId = 1\nct = 864915b51654401f018ee23280252369c2a4655156b167747c886796da7fd08af0e5ea3e5e477ef31498be2547e78de91aab3283aaaead23013a01cb14cbc5ccafb27b345af079fe4520c6fc4f4395abe18f8ff3525b7f9bcc1876693800de79ea33fc5c3aaeafc9e4c97535033708b77516a891fbecf160fa3f98ea6b0b7fcf69ef44c470df232a35c48e758dc4b70965d2c2256753afde954b642fe83d181759949a901558dd0c88cd20291e236581199cdca2b5436a102fab4c6c58d5c8f2e867a046114e0c3662bf115126aae27a66ce932b4d9603e14fb3769a2b712e5b332ffc1b615bf9116455cb802f907a0600d9ac9d292a4582d356b6f8c06d54f252ff17d1d4d07ae25ba1fccf3ae9b372e2b8420de1b9258217c15c80bf88afbdb5a879fe31fcd7c7a275f4b7432921b8de5bcaf43ec8db6ea38a962b79d810904406573cf3c40fc416dc5f8d2d8feca1285748cab7d5335cd4c253b656b52e9ed1b8f8dbc4cd93962028f0ac1feb7d4f754c0aeb1c31e961f25965ec2328ca7049661e8528603c117f9ed93b74bca5954936546bf729e4572682bcdae42f0e693fb3d05de3fb7f8728825675268438339debeded1c2d50bd89128b41cd40cbb6bd68564494b06c9bb43e3ba7edde3f89933165eff31ff255e1174d51b885b6b61d4d3712625d78423640fe911e761fb05bc702da7bb7a6819727dcd892f7462c\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2\nc",
     "t = 0d9e70cb448371ac08d862e2ce2cec00ec8cadcd05aab58ce26c5c098cb8aa64ee561c446392253b3b6349c286f1222a3650d2393aeffa1eac0832552a43d11f7780f6f219c8ff1d1c98bb085092751f479aad553b0243537a23e53a9c9779e15bc3c8d8a176693c3261b4c0520d634dc5b3d618565c1428cf9d616c6bff17a4d0dceb97339f5556f0d96f28b187309a48174651383989854585ae85d30874894e6d54a3a65e16917c751f3edf1d1653f22ff5d3f1eea35b390c1df1912469db041559b9ccf8148deb9d4caf8cb587191049bc575cb20495a9b0837035d2b8c47a74190829e13973b5b72eda42ae1a7cf0022cca75f86f039c64e16797836c83bcc7c638d22fe1357444bb4e42bb1410d7b63a8c122006f45dbb942a802aa4a964c6b17f21634e0e029a9a6510158f88dc05f9c6f4ae024c6f13d32a4d412ba0dd0b9f7382a1771a61a35fad4e310becb6a5a59dffec526a9e06d9feb696804aba676d0d9bc043f07068c7882b1f8cc19033b78416d64d5c6f4b2d121d170e4924cdb9a7179ae3a93121b814fcb74cc25eed8ab26b12890f9392debfa3c1b9382d41f8bf0d1b8cd40a724478ee753c70d3f3820f48b6f8d71ac6d62d4e319659b188a24b586521986fa3ff61b376e6a78a8988441da519c6f986f10c32bce6ce156ab0e2e1d4cd1f2765d0cfbd8157104b64709c4f8380181f8021f9fb153b15\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 40d37ad25e0f854b3f3431c1bf0e24dfdacddd8985895dd95f95d5b664e03e9f3d6c006973be95f2b17621615b8fed29aae91454a4108997a7dde9f279a93909782bfa6ebf7eb69c198d656752b980d6424f054b3458c8b772f509981209e8514f5c366d7a5272ba91072339cdcd81810eb2c27f47da51e13225e564ec772a0cb40c95a295eddef2f5dc6fddbedc8f7c2b141049979b7373049cf5b8f91b093fa2cb1220e145e5fa8bd1581dbb7ff6f1e28f51f15e67350f145ba336d4a894a1156ca2cf35cd8a29318d084e28d4402529551e8fde5a30c8005b983705cc67a7cff211e2a23065ef9342d4d065405818997126e14834b4f3073a6845add06853121bda9df7fc68e2516e72515d43ace942ba26c0bd36f58e93fa586183533b82cce7c8610b15ebd305d0be2ec52636377cdddeacd4eaaf84fa64e7bd17dc2acf0cd54f75181a7e237a6b1cba8514dac2c0301fc7b28ca07dab48894ed25f0d2c4f755cb6b83eeef73107338cc9bb21bb16bf8069f41d5a86b37f2c4e9f793d5226a5723c5c95da151f663e8c96f0dab2af01ece8ca1280fce698ba99d033817f79190c7e387c71ec8c70d04ddf965afb5e0c106e1ad913882bf6295b8b45d6859b25125e0af2514fe66c40381987ee925e6619c9cdff3ec71534ea1cec815bd3ae8a4f66ecea466d9100dc1c94c64be432d8fc9973426dc2041583a96e68312b\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 3d8628a19ba75e418329363a074d5992a80446e9791583095c23ed66de5dd41c94db742324edfa2a8807b6e115460e48a30898c1cf94d88edd54e400e448025e44d35e27b89509e4bb5e73b5dcfddd38939180b69ee551aa3eb74cb3b4320127cbd77fd51b28da7c74871e20e5067ac610053fefed9cd4599971e219849142dcae66ce97d13c937f8812d619b6fe0df57abcec358341f82ffe13827fe7e8e26c1030f821cb1d43a8787ee48033f4f11c901adb48e7c85a950b3502fff2f12695df04d55e1c816464a636981de537d1b3e66598759c8b38e1d87b9cf69c752982b6b54f2398f7658ab446c12585975bd3154386accbc9b796abf8a1c4cf6ef291e9cc519bfe2e09084a20a88d1f2243ed8d21d199f983df56d8a176603a9036a44c175f1417b7d34ea95c32993c0cb6a029edd753c10d77944b666f3fbfd743adb9e6b60c06e83cb51ddae3f37e3632e4c2b547580dc1ab3c7c94c6f09226dca4884affa94a0e119dfbbabb42a85a516375f767dedc7d1e0cffbfb44ffbfc7534cf619d1f926b0f61ddf2dbb8921e9b27fdf9cf52776e0b2adb781a5b110849c4600399850bdbb155c2523862f61fa84bfa9362cddac0a49e276c01d31ff4ee6646d914819ed75e7395e04cc741a0d7f61503d940d0ebce7888ded00facab381e912fa737c5d628f820650cb9b867cdf17ff60f145fb2c107203fca793503dc22\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 64d5b5a72e27de69cd016f58fc0f7b1a4608376f0c9c51c7c89ac24487b6a542e414606aac2f00892e8a72307c9167d48d555d3c46f924e95b2f7ea6451fdd6eb7bf14c5543ee45ef6c30d39c9c31d93fc807d9b1ee85405c38a5952d1387e393ca9e357d819470f43cb202dc1275b91d0a5dec0b7b3c547994024200275bbfa9acee80b6adbd742563088bda0f2fb6989e78e2464f0b7a7dc96701792c365f9ad1d8efd0b3842bd407774c4138810bc0c7f5900e50cfa5c24eef43d52be497b7c8094413d543fa3474a04580448d8203661d3ad87e997777c112161af200af2442f591c8bb41f337c1ec11821166cbc3d2f264f27eeb2ebe05f68f610aacd58aab3722eb38ba798e9a9c083dd335be40dd65978cf0a67d0e78a5b9c77034dd7dee2ff87172f98b61899d76b384920570ed063670b5dea2e644e538e7124a4b8c9ba5da4afc1e1196ec194a797bb2c3ff90d8957ae7bb8ebe99b69b90fefcb876752cbeeaf4f921060e8cf420463152b32ca55e39e61cef5ad4ba4b0ee4a2eba2d784b27ded395bf85db2bc85eef5e0cfb8fd0ab3198ba5aea550fdc866b828b3095b2a8d4b71a6e20ee3d572b94cb4f6753ddfbb144b11266a1efac7808931bf3763a4a80d0bbf475e5a3d237eacdc58351c1400d5bcfe9006e6483cb664d0274c5cf12d2a18038b6e5643244e0ff07072e38eec29eab5090946e73b01474c4\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 286d5dd2d8141c8f28ad5834c57b729f39bf5f90a087ee09eba1013208793361cb39d338b4acdad72ef3143f45c6092cd790abddb45d1150abbda9c70f4d42abcdf71648f63172062ea5b64629430b5e3b88021cf5fbb63dcaaded696e3d6ecce60a1346d75a972dc6eb6f50b5ffb7da7a5b7b7f8a5454f9dde9fc21ec497b2223b24e3dd579e3c0518feccecd2b3dd91ed6a26318dea80b1eabd165a87bac00040c29f3335a7e474cd01cb8cf2f1a56e27d5377d17da3ca581e84149852b63868a9de2ba8846142b07d14ced219ee0fc318b826a35f7806fad240685ba4067949a79b9fa3252495f14f49db5b4a31710d4c1d04d8a2f6e7121762cb4873d1d5ddd05c2be9f8c09ce5e22e15342ae22f227d940c8ce9ca62f4fdb080b85a447d2af34acd4e77d126792a69892f63356061221c0c7105dd5e044bdaf073db841f0f25f957cbe259a2474b7cb6421225add558838757ccb028ad426ac1b75029aa08746f9a47df7df604cdefbcf4abfa92e114da11686a6b2fbdcfb9a6bb3e676a7bb288b88a9c9546eaad05a84e1cbfb22503e326c63c15c2c634085d2ad2d5220b9c6a7a51548adf4474145cf3045aff023c27f92c098d77f065ba59a530ff15f1f0cc634432a3b3fcf0c5d5cc58fe071deb4268fbf16917bdec618250dbf4d41efb3d13d0be332848a0512c5e8e6b4a6fd06ab4094550cf69d51e5321627dbd\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 815f21b2970412f0d01a6f7eb209b214b80a944718895712c0b17b86ae408b01d38636b0b10a0d50a761359b770aac9074d0a89a22431f031063d9fbf174a767720807d02dbf70f9c561214c8ea73bdb37b0ddc8ff2e72e744cfe48de0e2188f2c034d6a779434a7e32ff44f5a9016cdca2e8ead252ae8fa7b5137c033013dc1a74b5bdf048bf81ca66a424feb93d2579c63f2aebac51db1535217341b501557c7e034a5276c8279d46e8724cf0c184025f8862c22a64d9142472c098b8974c61b5c8c998f0e9c8eb5525dd520a190768faa9d3fa58ee6d93f2fc775edd368ae734f6b359469f4d3211895f35dcf1610a4a6981cd135709b91f2f7667b7288db3337bd46d6f15c0eb26385078f3943ba1e67df9ef34f7e52630d5a4862dccb0477a3988f25d970ee69cf860eb4b56a85665fc47995befe817a4e3fd2b4f112ef60a52180adee5a11edb9ac1458c1c6ec41e3b9bd40eeb906e206b447b7538be7fc0170915b047c998b8baba8430aeff4ee8c48c763be4a49a8d0b8b7b45a2f0e0403e18aa2bc30e754982d6d1872434fdaf22ba6ab298ebe29a739788e377c51a140e6ba07545e97eb9b2b12454c720653504686225a4c7966a13cf0dcbe8e1a852a2d0b828b9e708c1012ccf401e7ac94c9fa0ab5c4a19f087761b3d1129317571621593629f9459c94b92c62dd5d6827cf1c5187e98a9c20d27c0cf4e4b18a\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 91d2e4d3a0be29f0dde7d2033e960301ff15e0fa649865781d97876e1a566b19e1bdb2f7f458a524d6d86e0d6f5e72f0bfbe5d23139987cf1d8cf778fabbcf3b5c10092fcab71b296b12bd56eb87093e90747d28a2a85bb1e62b6fc841f0da507978c7aa9039c5d7bfb8dc20008153bf81e94222fbafbbad6289c4fde8da4ccfe8142f11a922317673f94aee392b3d34dae9cda01d4fc3dd1136b7341f45af106ccfc8f71aede870522664494dafd9c740e7d864453ca9874b909bb08ad74c673e97ee78e816db3757f80d3c1edbad9133361160296a304420841c37b0de7c73fb6d3dc1c98d9c637a57d145008048e02235c51c141fc0d38e0815ceb54847a381f02c556d1ec28f823fb3ffdc98e38e9de7d52096e7c4901ecb03ca1725d2f386296ef307b2f4a0471ae3e8eabffc1581ac2e1a00e70a3cbc584f7efe6bedc8d437a412035e527aae977647eb7b8271cf9dcf361750720289218c4372448a24b1fa8558cb8bbe928ab734d66b210489bab3292c2745a050ebd6a88d38359ca463ee4aa29bf84cc09e69ad4116765ca079d5a1023796342d7c306fc0fe8f2ccff4c2b1b855077f752fae6232761d40fa9abe063125cc56e4efd234fe6623325417506fb6d4be187fcab7471c16e607abda762423bf4dbac021cb2700019a1862e32253c0a8fd3c443d381555a799f4e2df7d6d0a92fbe889426c9dc8b6801635\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 5399224a31e400c2e26dcb43e4bcc394b22b87ad7694e59fde38d7f16e3abf190c877f79a262b6e9e172659acfb37cd3879dc2d4d86b0f7672f297a569650a37b3392602b147b1b1110431a4615389ff759e6ab16371a514259f1131a96952af64515d93eda9541791429cd14d3a2ca29c279088607ebc57b887cbafcc88f3e7eb65067e952fae40301e9b784f0c7c9f3251287d279634aa92573fa33b7845471f96c915352618618d733706d2d9d661afbb04b87927a2589f46d13d8adb749d14eba316c9cdfa066623c9882894345033e1414a3f3430b551f7de8d387662f75589b7f55c9ec5293c1de87f7e3b0589ce9b8e2924cf7b87232f0da39c0eb",
     "0f89489d73ed6f7e73730d39823495cca741a19179093f15d6cb1518650c74138c1c1c7e4e65fa277757f17be457607c51d310dc10150e7b381eba75c607417449b7d1bfcd7223ea1d373826b623c7d1580d1e989060791f027adcb36e4bae8a7b09799ecdc0927256a218e24d1e4c51ef7d5f201f4a167d4ec77f0a77521c1747a67d413742f15b1393519758f9c98f3b621c361bb5eb9e7a5b904a324d98873d54944a18a87930a79d53332a9b8ab093afa12029406a078815b13872033145a421ad3b1cb9e7fda09679e7e75ceed95f934720e32fa3fafcbfbbeb028a62aeb8855569d7efebd70dc3f078686b54d26088c2870d698e42956e65312a57563a2b8\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 043e5e7106d5e9755860328c3c135bbd898ee93b09f329aff989c41a271d88239c9f079ebfc17c352124fd5a9d31265dd912ac24b2c506ad33ed33b5109e5f42a7e01cf4851c1246719eb1c75267edb673fcaddb07f0fd8ebfedaf7df9331f95bcbd21a766418badb064e6b0c436c6e21c74eee42e45e5d04d3ce219d089905eb700542144a045e0f7a94a38b0e20858ad94098e82a0197e077136352f26725e50d7ddc4771f52ebe4f486e1fe72dbb94f69968aff98fa9f5b820b368c60d82e89fc27f0aeff824b59a6e64a5f604df475c9e91d18911f5e0a20b8bba06d842d6a55378f382c0705b75a308b08a86bb37e4601903e18740d041c987dce213071ad7edbcfdc327b8dd6e8bf1d21c74f8bb0ef233340ee193ad2728bb511e7b7616d5c1ac6708ca3127b00a8e743b73ece1b007a09c74f60cefc924a0e04d967640ced76c5025246e888168dac8b3a9e4f16c0d44c8935fb401d3b171abd18b7c79d2f445cd22467c77d34dcdba4c01c5418def4c170189b396e4ce9216edceeee101c6b6df834ca29c9f2767ba5a1b14ec157c09217c28dc4db95490ee3c8d0059e9fb8314b4c89123be5e1f2c4bcfd732975550f5755a845bbee0c65aab017c25c306ebb43bbd14406be70e046a7589ca3235f529fbfa8ec9d9208a95f39cadf8b091857cbdcc6e9ef11439ba752b8d24d4c401f1e0862f71d07262f007e562b\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 0e617b28ed72162e19b7a80a8b57b9ea9c826d0ac8b230bcf449f027978034e1bdcfd55b89393643d97b082d7c1e7eb4f901241955ead53e18ea50e07d8818d01286e6c7f6a0b1edd82c40a18cd934fe4b117f3711f762dfff24668c511524bedbbf9248590b708c36ab59ea8449c9468ddeb978614c930d7cbc45e01115f5ec5bc8e024e6d4ba38cb8a3c80fa85142de7dda62ec3089c56a3a2a067b09a230890842e6844b20cd1e5143f4d149a99b86c162b3be1d98ea2850f0c336a9a0e1f350e4435b7d0ea8cf479f4c07b3ed800c51ee78cea37c628ad0f8d9d9df93c94a7b40c828927dcb7f53f705f9145bab0191ca8279957674707cc442482754603dce5fe9dcba2b0a545f8a3be70e108e4c7c9ec55f58c43cd654fcb7f0fe85dc2cc02fbeda0171dc5c2344bfd908692aab69fa50fc0d06bc7b9791dd1cd02f23e52fb26c7d017372dcd84f966b49ed939eb92b51d8d25cea6b25ba6593900075f0ca7fe54a43faf9686e35eb42658d2af3c62ec9b68abc449462342c1e1e4f5891d8a2b7b60446da02600bc65e9e48efb38b5ec69103a8447e5df840a266776eeda1864013fb966360ab45ba9410a2721850cd0e2672840c6efcce5d468a35f9bf0ec25046e47d0dfa4ee6241db8ea32125cf8a7ffaa9941e00b49a1cf68928d493fd1a16602dab0db580001bfece99fca4f90aa823717921e836b12ad2827e06\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 01cc477af0a4ef90faf0020641b6140a27ab93f44cc33a26bbf0a8bf451443db7a3b4625689cb4ae03fe2aa97efd4518d49148260e72120657b158a6070f400cc5c904b24c4ef187dc6c5deeab86130eb9eed59d75bf962ec900cb0b2df2a0086ea5a1ba9d85c9f71a5df2f61a4dcf73d40a1d6c25e5503316bfe9a2c58c3d6012367f51720baa470248a8d54c1e8cb5f8b1efe93f2bb7bb4e7f000e4c06df92986ee7743b9088571fe8b3cc5b16f35d98e633ea3b623d9c83e2095ae81b2877c36898c983ec58d74cca9026d3649a12248b09f04c49e3878715eadfd966af34531699ad173cb01f8d73f585dc00b8b3d72b32cd40903148c0b6167e4e80e2f3d29e5285486ce51dd8ad1cd195809a4ce6710776c19d9bffcc915da723493837d6f99a215ebe502da8cb4444b0421626b2eadf61ef05210547940210bc4e647193e0a7cf00a99cb51533f74fc29ce5fd4632862b8efc542a9ca0e2da81b50d1c72da1dee2bd9af43ffd5264c92e5c00e9cafcff11e5b4f9b6e047e5a19e7e599a736e15463b363f250a2e1616162dcbebf4791adfa8b51e80eda02a8440132a80fc0f0a2939f176fed967240ff457676c6deaf5bd76a3c826445ce807ccf4135c7c4f37b112ad2f6a10f213e4fa70ef872eec4a7371daf30ab6ec5a47bf8f1a9f6f7b3798e3d5bcc0d313eee136cd9c0d831af2ba21dfbfef9fb6142bc36f586\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 1c95586fb690af2cceacd7c9232c70a8a52fb37a7ce391e9da23cf087e3b4c609081977a713a032c4dbc263a369c9b57f7036f6218b9ba5f522cd965a34d8cecdaa0a79c97a962dd5641cb6b68dbc77018238489ca1d64b9d3a3beb33eccccf81de113073030fa54305d959180340c54c9ae4f3e5a3c308c150f0498cdbf23555ee5377805d2cd58e72d6109030837740131a6a7e5c894ce498eb4eeef7aa8099c727946ba78f684103a1bd386840932ae99cac1ceec176823bd4c2c5b7c7786e2f071add8a940edc4695d0e031c1466906b4e6e974f04e80d21177a21f4caf5e2d542d7574df82470308ab1215a83b9380c6fbbd34059a2896f156a076f13e95501784ffbeb42002c2659b88540848cc06da46d99dcb7ac4f6294bda2e0dfa699b1d852eb946ed4538b4b743fca2f1384cdd3aad9e863874448eec50d7581c96fbdde8af1d6496386cf49161df95c1fab9bb4f905f3dad3dc67bc70e21629e19bc60a2a9300b246964e5d7a5a56942eee8ac4676556283af90d27274bb9f460b3f5374deae951140d616c34905310a36b2c52ea789610288e60bad45c26e2df328161c54bdba8c7b25b077b2ca5ece64e59d0e35a052839bd762522b4a6e2ea4ea98426f7b50b90ee1c39b2ff1ccd1789188cc547645e96857f9eabdbe1ee17d4e040f2f34eb826c9a2f5a4712806efbaba70b3272797a26852704e9a14c50a\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 6937187451f030bb4e8da158c24989f1466afe60449e8f720abeb3ce766b5e1fad5ce87b6902b67daad9f6deeddedcca13be3a888cbc0333a205bbd292e0daa9367ad5901547b70de0174f644c3d824df3861a1bb6a14cac290e70b06935c39d9bbca33932f5a4cc18f96561a328f390f6e6b81aad21c090c2f0a654b18674448a9a858b6b2d0e9b2bd2782516e4a7b401e04845a24882190361278557785f7ec9bf9eee62162543341a8068018a92600a5ab037b9a646a294492e6b8776c2f3613ddea88ca7e840d89ffc3a3a112fc104d52a01a5493446c524a5c02f5f8aa393c3f46cbf05530bd70747ff7dc95f021dab34c617f550f40ccce73e92d7a351a67f4c531eb3e786f6b92632444f36a8b7a554be5bfa9f8f3c0eb18dd96da5eb9fbf3d39f79495da701a549f5a4a0dcbcf147d9f992ab83ecac1504b2dd11ce7a1ca3bc084a2c611c68cfa89aca69626d80cf2a016cda8f47f6536f085bfef6a18ee2c84e0cc32e9dbc08981b6b54110ac7a8146627283e5bb30f47869d09987da689cf5b6f3aff6893dabe94d1c2fcdbe789d29430a3913e4a20aa6569c26d88d6e15030eeefe1fd1ef7ba865e52a9407fbe4578685672a4603d41c09a9aa99ae0033c5265117d8438f64a3daaa862ba2931fb86e429870f51f77697ef8e0f4b11dc6b70c9a1cc47fd2cce484f7d088d1d3a0fed120555d56d1e7304a656513\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 35826bea475a851d9f7c2b94b28922aa417b7cde808fb6cea5a243a3f414bb2c5c6dc76c00dd6fdc692b085334c38ffbb4619198bf1c9f4cde1056f796f47adfef03207a911d7529bc6ed81f32b632d0c2d127556b9ef010d68a2f45071dba2f128052b3e34588c8edaa552f7e060156dd683dae4dea4bc0ace1e17681ff4d826816dcf00dad4dd17df81aea72ae1e436f42c4c9f0ebbcbfa801d94db1bf0f80f51cd82b25aab6b9afd42a4c22ac9c04dfb0faa1b6954941d8684ff721cdd485f81abd6a59793f681f371d2e2187e7f7c034f5f5d63560284d2e0de7aa27b61a3863722b3898769eeae9dcf124f6314a13328459c4093105481f7cc0bbfdb872f3f304892eaea2971420eeb0b86c5839be6afd4c719a50ded51fb8d1fb08568a7d12ee7614b6e8be6f21baaca84c166a69eb773dc69fdf855d02548a188402616794437a2a9aaf50ab6a14f0f172af0af4a89c057e857ba40333a8ed3f61c6e08a6c98679f55da53c76c1c1349791ccbc7cbb3c189a52b2ed23c6fe86f00a2394fd664bb7a8296fb32868901dae475bfdf0b66cfeb7661e5b734aa5b8689fdf54299a393cd85921e21d35bff5de824a9434378106c3d21f2716be4f8a60a37b64a429a570c1e19c7a5d2e9db9f110e7c0727a711d845a1d8ff3a8778852eabfb793d5a0054",
     "b6ce2e38f4d085b44603b812611bda8754025e89e65cecfe99c11b\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 16\n# first byte of ps modified\nct = 29d887eba4aa52b73b5bb2308c0fe6fa78e6bd682ac7278fbe85cc8a9f9d009b2ebbe241ece0dfe5b6002921e555771ac5e5edebb8894be534e00135ed6660bc43e32fd3c20e8147f1d998d5291e877e075889a114b87a0051771a8c8034d4317e12f66d40955dd6d2e97eb2b0877ae0ceedfbe345cc10b5e6e3f41cf875f2600480c513672c8c0193d8f141feddc8ad82ff0fc3bf69663d386c968d53a4cc2fb82cbf8584d3c4d64280925737e1b6b27e60a443fbcb38ab7c4d14c81c98ff0018572054746a0ce3c6a004ec5ff3a827a140aeed96cfc0c2480fbaed571718b30ffde4c1de43667125ff7f68a5352ad76aa828abbb4e70dbaf02fccf4656382d4b7c261c0f858be7c59497823c892c52e9b2b8d57c70e82c8059345f12bf2a0fc4a214000e79a4f04ab7016c7ca1184a32b81243e44dae41d045933b9dae873d6b836d0b9c911616993eae95830ba8c5698d3ea722c370f47cade258cbdb67f1eb167e51c6f4b12ce7adce403a001e78092efc30a214939e3b86655bcc37d8b485d53b6e2ae42c18b03bd87299de70bf553a112e9e6bdbc2e2441c5072ecd2c74c25bfd94d7f5545c29c7a304be24be5ef61aec5ee4b119e971784e0189903240d2bec19ef9b39b528c65221649e72dfa36f7d04aa0becb4d147a33480764208623d0be7eaf7b466be492223d12c0fe756e23fc3b1212b4c3d257d50712c0385\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = 7e977901be2cb2d4f55451fbeeee9f081b945a7bfdccd3e16d502a15b2e05b0e31390d996a74de4521104bf642f5c1f4b28775ee21dce345273b595a6ff7578635c888f9d3615f9852a0530b65ee49695e1d88fa542e3852b545d361bd8ba4f9d66aed3a7d59101dc971aeb3f47a3c4f7cab15319981bfda2c68a491ff3de9b8975c8963b692061c8a8bf3b5dd062d42e8a2efd1aad46f46be4e31e3cc397ede8203a3750d05537992f310c936d7559de5745cbbacbaa0cc8bfc549b5299662dfaf3cfb8a85c5c40e30d12f10b8cac0022b3bc4405644b328ae4b38e077cdf263ff9e2fe9ae44127dc71f6cff5487e76c51ff94cf6c28dea5771fee269d5c47a9bfe519ef6ca253677fb1a8deee6b51b9d6152b53405958e724281d374228c4e501937e5b7cc745b6aaca552b8fe6db2c346b7514831f4f0fdf724bba6b462ffac33f9a2b353ee8429307ce9e10b2f2e3af326bc79bda4a4a93d9d0560699b91a5afef136e1ae2af5d3c5f483af0578b032f62a5c65bba35c47ec5f0c662fee407c775ec8718b5ce7e696fa2f5cf2d7d553a7e1aefa31c7716762e4b2765e6b58f268576cee7143caf67cfd32e6759891d1f823fed71339efdd7ee8b3f7e3cc8c5655a86a6823114c14643c2ceff08b1cb448d8b0814205d2b565841899ed28f1a5240f914186caacffc0ee03a7dff8df4cbf4b7f587c19bafa9f33ef132d808\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 310d8328fe04b15b0f7e92ceb3aadeb1785e71cf8a2081386e2938a95f4fb2a7732d8c347ea1159e9d7588d97496cf8f2c89285e7f226e7572055dbaebb4f4fc4bde689bdf6e6c9a0ecf6b3f8a98be9459d6d8b86dd184061d822545703e2fb958345bdb03465422909aad9f52d45eae132c5e6776ee9b37dd5eadc8531b69839ae6cfa8e03b35003cba6f1df317b522eb2a62dc4ce5ab7193693aa3352110d7fca5a8d74515a01ad236a515bd61bf74f768b8b26cd61d03a3a9b3e635677d8edb4264860173a1fb650ca4cc4fadc3545f84d1b85fdbf883addfc6607c898765f9ad4c3a6e64ac02058be83c8fc006a2ab52b3945fb0291509691adbc95c67548feae0d40f72e71eb9318d7a17a64dc65260ebdd69f97b608dfdaccd8bf1d371084421ae3b475babbd4dcf6367e3bac835190f2a9b21258329dfb8930793f76fd981c7ffe8eca6244e6a546ea4b076fe2f99a47c8dd4241a14959f9ee3aeb07061178d00cea20d9caa337464fb104087c6a9aeb1ec2a78c9c3fdb0c764c5128f7e2bef352dfa523fbefbc4d897a86f3a3fff8d1c24f8b9c8199ca7ace330f26c883d7dbca66825d8b001023438204c5b80f62c6456f7f3a383c27eceb2c3da0f78c4a9a04f12117658cc8bca5fa240874732e08e3df609e63f82f899aae27f08860d4a02afa12b495cabfe12fc3540c200e4ebbcd328f05ac68356b36c4c41ee\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 132666be585f41004622ccfbe802a61bde0f8a0459044a658e98e8ad9adbbd3b83c63144153da14dea424b7adc4294fe52961e94703eb7945ded497de3e26d682d745c7a37c88d88d0240ae3f334dcc23e2a6e3eb18888b7f5bc2c17f54d167f1704cf1f0b726a5301e1b94707f8c982cadb9b9aa8a559bf2dc2730b17b425ab0c26e4816a7d30d040a4aa995981db947765e097b5e424e8805a78980e709e3026ce5373ce1bbbdfcda646df70e8f8f8536a83f0284d685e99bfc5d0b98efcec6246241ed9dd3a1b01ffeef06b647be2cceeb122fbdd140999b7cb00a96c039bfabd7225db666a10478b83495c1c9636391daf162feb08bd7b4a1a69e9b0d2f846e9608ab327dfdefbd89abcd763077996dbb0a974472a17a843348d67b9fa1f630c3dba8aa8edc0c6b56cd7f05445133eeeb27377b4442a2c1dbb1d7027ed3f3d2a335b78a1a138b423f05cb16db5ae8e609d2f1c249668f5e47bcd9e405d4a369299c17f5e1d24472b112300c296ed49b0c094e93f0fd3ab10ca2269ed94ebd31c65b64c6988b8e0eef4f0bf7fac04758798fe736d85eb2025a82ebc064f39e529860a05ec50a86d16100059da2596f7d16861c88be135d85bc586cf40425ff0e2bccd7993e9e0fc0fac29465db116f79c0708497456a5cfd8ef12a50cf1c5183e05fa04ef7a6c1283b2aa140d8de9b8f5652ef08df0499b3ab4781c0619e7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 28c4f829d3446be96b30b681e6de5c390996a47e1a3d8ab42a4d7cb12eb7ed14d2f30a66e53e526b0345fba4f6f7ffb2434dd204dca8277c906b4d3d96862697467e33eca8ccd99f6e4ad1224a068d5bb405c4dd3cb3a18af3bb52b0ee49a359e47a84c5d8f5bd9c0ccf5bf0fa147af08ba92d625da26361ec5322e7aa2bd8f2c015efc99142858cbc77053be48a76de6cd665936efa7ad555860d8a6ca836a8d82aa179e97d5eeafd63e00a79ec614087a601d31a41dd151884d02c9ed14b93330d3f9026162b5593ffaae8ecc31c398b23167720e34558702d0e64adab0486a0ddf92e33c8553cb7ef0aefcd27f85c1fed5f9541f060c0b5d8ef2bfaa8537cc5b892aaa9c10237e9c3de2a57ce3722d36c8451efbe7a6f13e03e3fd87fa549d001aba5ce8cebfd5e171fc73243a7d6093980535351436175ebca6ccbb69f77d902bbe1a7a42d7d73685bc085bfe6baad593b92def6d419b500a864a7840f980ac3826f275c269f2ebc1186de6031b54f094f318b4835f6de0b460fa87ecfbcc7a1ff512db05c4db55b58a9f19f7e9e1e44508b2facee44c80911467ba8e561ffe7ba0600665bb2f957f80462f5490ea6b2645b27fc035215a3ca465c0616108b5e9ef246633ff8195c2b43c9f2a0d5a4feb1d5fb918e761d175fb6fd826874dfcedf8b4a13b85e4eedba6f12b7dd670b47b3f0893686880b4ca58ee05c1d24\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 401be864d1a7b598cce9822ca99a41c4c8c3ee4421c6ce8f617fdddc4525b8b92551073d24b40f107d52bb3e6d4f9ccc9f857a49e3ee5389fd7f2140fff2181773f8badcdcdbf004b0ebd00b8732c118bc1552c14ad305eb5d02e0c75ead4ac514ef866f68814b131d94d7f4dafefab4f9751c00864f09e840e1b1f6b96f8b7bcb8b2285bb959355d8f1843f82166db5986be2c6d82bbdeebc45bf944b47ff35f7f6b97fbb9bde65d138fb7bf1e93cb635a8b9b2ee8b77117225a193c0b7317a4d28f9e1bd925c43df48629674f37161f7ee36ac41324ed0b070da7159b19046c21d6f2e850dcf024ce3c5149e4ce4decb467433f32cc5bcb32e48b2f5bbf3cbffbe002eaa347b68d5017c8d0d4bb0be96b4607ad1877e7fca38d52e5b88eea511911d9ea1cb4fe1c89d7d786b0acc3a21f344b146c8da86af77ba17526d5a00fd43c7994179841088587d184b6663b89702f7c54f453a698efb1089562994a6908c41e261daf831d3deb5994ea78aa415648c9148cc0490b5cd756dfdc205399d7d111688f501834e8bc51cc92859f0bab7fa86a111c78766a0388cd009ff8591b3b81304eb0222bb3362b921c1df0cfffa44027d444ab1d8c3c993841abc6ed49c96f341c2951a3c23c8250addaed803239bb494f8263ad311a1214ebe36a0e1b51eb85b9a425fcb6b8f178e02690446290af6fe01c09d5f4f9b36eb40d65b\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 7f535a238cb7c5b93031a9397f139bfb2f373248f05c67528e2ab5db915a413b99734f6131452d43c82b82289565a6b9a601f5e3719e0fa0d44add201b5b2dcbec7925a4ed7dedf4d3886883db6b6d9b56d3391d9753af4872c3214cfe1055968d88940a3c3549ab27b22f7e56e7812e1ac1963f263e6a574d5f95296bfc1f34ff9cce1a7ea7f71d1832be55a18a78629f15ac9970797be6505dcb6f2a07f67acad1c058be5ec7accf2daa109605c83a5c928423af2bb802e787cc7b35717ea5ad221bdd0866c3e166f258976a660fcd923da605b11eb416b2ac80a42fb12d8fdc8a2152aa145035760c2abc4a88b3f0d96e14be3b01a2a7572095fb1d0f0df7b725a7247fda5afe22e29c0bf543b3a396531dee98c852c578e16049d01663fb57b42636305283a5f184ac11a0d4e912bb3da0913a27a515078de839c8665d9331b737e5b86e4cd7a103a40b73c9b64e0fd3d0d30b75bd6de1f6fcd05df200d059a19ecceccab7836970536942e0f7b7445dee987b47c34f89cc4de829109bd3df8f695a83714ea81b7f98f38006c13f7345b3cf1b1bdd70462613844b3e751cf4adceb98a6d95c63b2f245e5721c1d5f5099bfddf28ad796382c325cfd08235040572734dfe3312ec5d5a1aea0665859d00ec81638b60780d40b6fb93daedba0ef0bb8854f6d71261c6271b9c6e6c44689818e805d9bdc24a693ca1d83c6981\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = 956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ec\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = d2e97c8e52fd77875f7e7b1e6771bf9a3498396e8085a306960696e81ae89c90a3464a3fba4b4278d942f4afba6dee4a432186edf010f09586bc4728e67ecf9ac6e15da13c11a555581328d8b0db99ca25b5a31063213908e0fc203083daa5ef1bfc22a497f04900a32dbae8af18a2066b0c4037261724c27e09506513673c878be21c47f6384c57459cda2746641eb741a80980e3aff548204952b5f06912b96aa5fe257a2985f4050d523c46b85a99bd7b77e03c46d1e3396b31a96007b7727336e68a6fd3bd188162e4509288df1fee129ffdd203bc68777728592f0d9bcafe47ac17c42b9df69b47b14e8972b4253caf74d03c5dd6d027d4dacab27857329fb3879e6e61499e565f7e94a185f9ff7eb966f9e6522af10b85b3320d761f209902c501e03d0dcd8c795b7aaa67969bb4b58eb4bd09db6a3cdb6410533ba5896b134c567255a9a3930943bd98eadce1e6431b4093cbc8b2b9b4e0ea79e07b7beeb84dacd11f0aabfc4e779911e228237f26bef2536423c042901b154a6a9aad61dd2fe182fd9d462c8d49d7dbd7a2eea8492fb14131a400397036c248434d90e113afb4bff3aac595733ce93dff73ff8cd8b3e3a851d3465abd87118a0d40eaab61572f6aa9bcdaad2a885afa4724d8e3a1ba29286759deb5c1fe3512235e846e688cf325a278d94ea82d946fdf0945d9ffd5e7fd507bdb7a31e9b79752c30f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 00003d8628a19ba75e418329363a074d5992a80446e9791583095c23ed66de5dd41c94db742324edfa2a8807b6e115460e48a30898c1cf94d88edd54e400e448025e44d35e27b89509e4bb5e73b5dcfddd38939180b69ee551aa3eb74cb3b4320127cbd77fd51b28da7c74871e20e5067ac610053fefed9cd4599971e219849142dcae66ce97d13c937f8812d619b6fe0df57abcec358341f82ffe13827fe7e8e26c1030f821cb1d43a8787ee48033f4f11c901adb48e7c85a950b3502fff2f12695df04d55e1c816464a636981de537d1b3e66598759c8b38e1d87b9cf69c752982b6b54f2398f7658ab446c12585975bd3154386accbc9b796abf8a1c4cf6ef291e9cc519bfe2e09084a20a88d1f2243ed8d21d199f983df56d8a176603a9036a44c175f1417b7d34ea95c32993c0cb6a029edd753c10d77944b666f3fbfd743adb9e6b60c06e83cb51ddae3f37e3632e4c2b547580dc1ab3c7c94c6f09226dca4884affa94a0e119dfbbabb42a85a516375f767dedc7d1e0cffbfb44ffbfc7534cf619d1f926b0f61ddf2dbb8921e9b27fdf9cf52776e0b2adb781a5b110849c4600399850bdbb155c2523862f61fa84bfa9362cddac0a49e276c01d31ff4ee6646d914819ed75e7395e04cc741a0d7f61503d940d0ebce7888ded00facab381e912fa737c5d628f820650cb9b867cdf17ff60f145fb2c107203fca793503dc22\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 3d8628a19ba75e418329363a074d5992a80446e9791583095c23ed66de5dd41c94db742324edfa2a8807b6e115460e48a30898c1cf94d88edd54e400e448025e44d35e27b89509e4bb5e73b5dcfddd38939180b69ee551aa3eb74cb3b4320127cbd77fd51b28da7c74871e20e5067ac610053fefed9cd4599971e219849142dcae66ce97d13c937f8812d619b6fe0df57abcec358341f82ffe13827fe7e8e26c1030f821cb1d43a8787ee48033f4f11c901adb48e7c85a950b3502fff2f12695df04d55e1c816464a636981de537d1b3e66598759c8b38e1d87b9cf69c752982b6b54f2398f7658ab446c12585975bd3154386accbc9b796abf8a1c4cf6ef291e9cc519bfe2e09084a20a88d1f2243ed8d21d199f983df56d8a176603a9036a44c175f1417b7d34ea95c32993c0cb6a029edd753c10d77944b666f3fbfd743adb9e6b60c06e83cb51ddae3f37e3632e4c2b547580dc1ab3c7c94c6f09226dca4884affa94a0e119dfbbabb42a85a516375f767dedc7d1e0cffbfb44ffbfc7534cf619d1f926b0f61ddf2dbb8921e9b27fdf9cf52776e0b2adb781a5b110849c4600399850bdbb155c2523862f61fa84bfa9362cddac0a49e276c01d31ff4ee6646d914819ed75e7395e04cc741a0d7f61503d940d0ebce7888ded00facab381e912fa737c5d628f820650cb9b867cdf17ff60f145fb2c107203fca793503dc220000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = 8628a19ba75e418329363a074d5992a80446e9791583095c23ed66de5dd41c94db742324edfa2a8807b6e115460e48a30898c1cf94d88edd54e400e448025e44d35e27b89509e4bb5e73b5dcfddd38939180b69ee551aa3eb74cb3b4320127cbd77fd51b28da7c74871e20e5067ac610053fefed9cd4599971e219849142dcae66ce97d13c937f8812d619b6fe0df57abcec358341f82ffe13827fe7e8e26c1030f821cb1d43a8787ee48033f4f11c901adb48e7c85a950b3502fff2f12695df04d55e1c816464a636981de537d1b3e66598759c8b38e1d87b9cf69c752982b6b54f2398f7658ab446c12585975bd3154386accbc9b796abf8a1c4cf6ef291e9cc519bfe2e09084a20a88d1f2243ed8d21d199f983df56d8a176603a9036a44c175f1417b7d34ea95c32993c0cb6a029edd753c10d77944b666f3fbfd743adb9e6b60c06e83cb51ddae3f37e3632e4c2b547580dc1ab3c7c94c6f09226dca4884affa94a0e119dfbbabb42a85a516375f767dedc7d1e0cffbfb44ffbfc7534cf619d1f926b0f61ddf2dbb8921e9b27fdf9cf52776e0b2adb781a5b110849c4600399850bdbb155c2523862f61fa84bfa9362cddac0a49e276c01d31ff4ee6646d914819ed75e7395e04cc741a0d7f61503d940d0ebce7888ded00facab381e912fa737c5d628f820650cb9b867cdf17ff60f145fb2c107203fca793503dc22\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen150 = 50963;
+static const size_t kLen166 = 50963;
 
-static const char *kData150[] = {
+static const char *kData166[] = {
     "# Imported from Wycheproof's rsa_oaep_4096_sha256_mgf1sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 097a59d2c4f70377793937bbbd95d19b5d01edfb1eb3b073e27e4cfed416820d4af4e04cc3f53d272ae43551ad0cd09b89cacb21a595f9f8423b3b0148d2ad46cf818fd9e7cbba18f4f84a1dc18f69ed5a764c6fa191a3664fa94a39bafb1a29431e6fedf61eb9164dd7684f0cb506248121fa948a32c8733f3d9453dae61c8708b2500582f32d91128775265f18bcab6eb170145e33dc40f1bab451194cf8c38f9fa91806bd225fa4b54ca50813b9d7a54f61e0000e5e0769cb2a3eb99b1ae9c3c5416dac83a6f91248c734d7e63291ce12de4d780703614128f878f29015801c7a5ec7670e531e1573ebc8ce63d640b01b9aea48b43d1eea8ad85b55423d4e142bcf73315f3e9e978b65f0556246066596013fad97b83ba552140c6957ef443ccec4051b2a8c9cd9f25c4cf6bdc2e904f46063e319643283462a4047d49c38bdbb0ee3d87980ec08410d5d2dee8e5349958e4178aba065a55d79d89080570fd4af5678b1573e42f2e0f863b31bb4e19ba232c02ae5b8f948d1ce8145c4968d24b56ac930b4f67047257f3c0b86bce7a77b8d0d87124c4a4141409ac11377fb9fc805d60012386becc2ba8478e663becc3d73239ce3036c2d2fc9e6e2e370c2c78053ee1bcef7a87872ef92b784638b84713a5d78ba8c3a868e3466f2275b252e19766d2104ec60537bc1589b1558b76643751f6a60fd8a5102b6c788e0f049]\n[e = 010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed]\n[privateKeyPkcs8 = 30820942020100300d06092a864886f70d01010105000482092c308209280201000282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed020301000102820200097a59d2c4f70377793937bbbd95d19b5d01edfb1eb3b073e27e4cfed416820d4af4e04cc3f53d272ae43551ad0cd09b89cacb21a595f9f8423b3b0148d2ad46cf818fd9e7cbba18f4f84a1dc18f69ed5a764c6fa191a3664fa94a39bafb1a29431e6fedf61eb9164dd7684f0cb506248121fa948a32c8733f3d9453dae61c8708b2500582f32d91128775265f18bcab6eb170145e33dc40f1bab451194cf8c38f9fa91806bd225fa4b54ca50813b9d7a54f61e0000e5e0769cb2a3eb99b1ae9c3c5416dac83a6f91248c734d7e63291ce12de4d780703614128f878f29015801c7a5ec7670e531e1573ebc8ce63d640b01b9aea48b43d1eea8ad85b55423d4e142bcf73315f3e9e978b65f0556246066596013fad97b83ba552140c6957ef443ccec4051b2a8c9cd9f25c4cf6bdc2e904f46063e319643283462a4047d49c38bdbb0ee3d87980ec08410d5d2dee8e5349958e4178aba065a55d79d89080570fd4af5678b1573e42f2e0f863b31bb4e19ba232c02ae5b8f948d1ce8145c4968d24b56ac930b4f67047257f3c0b86bce7a77b8d0d87124c4a4141409ac11377fb9fc805d60012386becc2ba8478e663becc3d73239ce3036c2d2fc9e6e2e370c2c78053ee1bcef7a87872ef92b784638b84713a5d78ba8c3a868e3466f2275b252e19766d2104ec60537bc1589b1558b76643751f6a60fd8a5102b6c788e0f0490282010100c3c677495c2bd56619e44e26140d2ede0037409b81f3a5b3886a0904eb486140f43b8626af13d14a33918eb72b786b3c9114f39017871528953c09104e1fd2d36b725388f54ffea30373077895a6934ab174e55ca6a12c21923a7b775b5ffaffbd813f9fb752805b016a5735b883c639fedd55ba2e233a6dc1673063d8487390d1676123544d3def177a91caeef98b13f38860474e44993d4c6060926d878a2059855d0de1c794ac8dbdad655fbbad20f152f15c73b95ac544cbb87b8bec8fd3c007ad09d76ae22a5e993302aa72f11deb265a7f28b88976af5d0c912d97b7284b1783c5bc91a6dcb7a9b97fe53713965857742b7e4032dc5141acd4afd4771f0282010100c357cf685f9b8d4e59e96686f7b8752f0a982efbe6658e6bcdb615d921f5e7056882825347455782d7bc78d637e17e0e6810c2136ad81b16cc1c81750785924616f2bdf5964b26c7fc50fa98fb67b746b50812705b379f5deadbd11dcd2fec7b724d042aef25cea2eb37f85b7554d7ad49fe5f47737ff436bded418507f2f175c695e324fbb11beb0544a7a7cb3f07924e291b5c8ddaa6a7dbb07e23bce1960cb52b9000d3a7aab1f58e3c750b6d978adf3d085ae7693b7e6a46cf6dbb6d2ad981f4bca5d15e0962c39066a9fc27985b9ba1f51132355792796a5dd847400804f98671ee4899050bdc2e7872ce6fb2b78b1050436d882425ee0745546a6a1c730282010100a6bbb5460638d2b2f5242aa6657760cdf3731b1415d5f2ee77248f6fe00e31bdc70396da054ba47844791809c9fcf19f90943e671e928e23950d9f4e82aab9bc138b37b7b1ed2219a54b67367c8574762db237d0f39cda5ff110dbac286712f69167ad4f122b3263cf4dc8de58b9e9ade4f08e1d5543ed74223e06c9521f4a45310291892c37e8a262e5a19b2a71decfec1dde997c00125e5158d7867dbfec9466899d59c04b60c4a0a6c5314c1a2375a5f194dbbf37422635d426d719b12c41140fb5806735814ec268493861002977e8982e8493a2ae78251be32315a85b75f6961d44dfb7505c34135987a2288907074fdc015ab1c45f3cd8e91fee6bcdd302820100178cd58f72bf5118da141e6d351e42da69ff90e2839348c94c62a05dae0f744b9d9ee6515ded4930980bbbd1afa8fac687db455a8bee03ce0acb80fbf7ed2d864fabf224d27abaf12f45200123860c7d74c3c55d5051f35fa239e00b24ba9b5b029bb05df0b8f12189141558095c32284d1c62a63d917682c700fc7e2a482abe1533eacf819c878e1cf37af6eab4ed97c0de89d2edb327966310f31421e85c6ba9c7d7b391d0cbee6a793c66abfb09630fa8cf020e960c3b205aeb15029c95a6e558f90950a572a23a8b852507264ae2f86f5d1936a161ae61fee5d3763b8cfbf48d35dd1159895735b350881ec52e999c255a57d6b3ac0ffa935bd36284ea6b02820100484ad86e79415ea3c78af5f6c807cc99decfb14ca1e80c8e6a1ef00ee582d3d180774236a54ec9dc8dbcca51f4da4379cf634f3a07cea4b7748d7b5d94cacd4d474111f92d19f3ab5eb4def8dba57b990844efd28d85344666e283f5d5fb0e6e8d96f07411c882bf280446e49b3b9b15218fc24da34ce8f01e02735920ef48a343b4de11f99b26547a251afa7aaa69083c421e2447b1a989d50712bf8fc35882b63517c7c39843cf67b92645b68c6d8f90331600142e6cb97032a5af6ef7c20f87630c6b25dddeb57f2cc0cd8c8a0661b5f40ed6632989f5d40f33bbfd9be09374483606c2cd7ed8b5fcb8bf3df1f9368a13922b1240c0d25792505b857d3e8d]\n[sha = SHA-256]\n\n# tcId = 1\nct = 48b29ff276452ebcaa7f74bbfefcaa0cbba598beca99a178594baba98b126b2679e7d64876c8fe07e39f1f3fdd5c4f664a1ab314bcb75f1e906643fc4c786d66e90cac12b8c23aef35c4727451cb033d889e2a30eecd2f8d5091a6d52170ac6ce579c9c49701461185196aec6a380e2504833609b359d33a436f2c63bfea9a70e803f06644a0ca725a4c5b9b01cec93c01cbb79f9a17c401728325e17bfc9750dd19cfc127b9dcff8951a78023b9e30ef7ab628084d04f64a4be3b6d7d3da9d0a94d692a4cb275a7f509aac8dd2db4f797a374aa880c2d646d23760c51f3e0c00601b4c05f6e618372edb7d3a6f5cc9a26b5095adbff2134450b1ba238dbb9b3952f4d055f6d486e27e8cf6ff773896a0fc2991fc5ee046f6e81cf948afb12d669cc020b3aa3f14a18cd63830964c9662fcd3860fc461694ab3c6dc4f85fb4fa527f77e944e7c13b94c23fd0fd517a30dc00212d15bb25c00d48a36db8bdbdcc398fd6b1d229c762f7bf6e99d5452f69b91b073d866884a6e34c4608ee1df0733e592e339eedd59554e85be57c0a9689b69fac6e010d35c9c823a37f6f854c5247db77d54fd784ba82ea4e3bf776413376b4bae99c02a0226abef411f1d56ba7da24b72a1a5f74ab9d7431af7fc940d2319ce81dbc51390096d42a3072291ccb44f3db326cffac084c6a73c0b92919d6039e0ddaa9fe8ab1d65aff8b22cec120\nlabel = \nmsg = \nresult = valid\n\n# tcId =",
     " 2\nct = 0788a1201bac2e27ee3c704ab8172cd45416bc353eddb23477841fd6e13d87b9926231315d26ccb3694064ed9c52ecf401c9be16f4e70e3d7c4eea6a2b20f32b53e94c9d26d10e60a3fc37983c4f63b46be3c04f66305c4aa23d409c9875ebf238a1d999114c9ce8644e7a93a8caf0cd006be19164508142b36000a3e3a3b8bcd445f9193ce9bc2100b4364d4c88cb5001b8fc6314cc782f469061cfa7cef3c3450121c8de529bb8d41b1cb6975698b138cf9e0460b15f10baf335cb8d680146f801de67dac74b0311059252960d59b734295f33c9f8506b6940698fb0467e746240366a49da355582831cd2d99be95057e9560c95f86931843633119218bfd2f353ffcd64983a5bcd4802acc68a0064f9da51d585c1e38310957db7373b76a3e376846614bc9271d2045fea65a6eec059cc7647c94318166fe53dd19b6e8994caf8fb0ba888f0b9b89071649299f95512c3b459ff6e3b1636c51213108c3140ce88ff377b3f36da31e85c46d5a479ddecc07899a5c175818881ea30d9a5a21b3abbbc1dfdfbd40cd6849c1312c4a89360ecbd5c1fd90c759563b0700a945bdc03a0b7888b893ed8c50149983a7e18668dcf61effd03ac8cd9d730ee55a0adfbfaad873b4b7e1923bf839a5e3df9bc634b15076379de0705150f03897142daac961c8f99a5dcbea953f2e29681546361fefa495afdb116f789ebf9815f271c55\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 3ee1f8fe284d3b84ecaa5f48ce36661a7842cab4f4aac4019e0e7e4506f1baa27539e468877d1e41bee136782ccd335c23640316a24fdd13e9257062fb40f102e0b482a4b589537d0e417f3db7df51c7f8a5094888981132fbc8236b79f2463b969e12c621121e697445cc80f7d0abbb31548e0b732b014b9c40b4481896c47d4d6194346f49fb8ab3c69e3a9e282a5ddab98140a798f4811b1dc4f5903f44cfe029b7038ba28d806bbd42213d5235180f33161efdc80bdd1424fee3e475dcb353f79a1fd23097f20b54afeca8d2123830e9a706bd6d827be20089a464d2df133a631db522dbc7ebddb06125c112644cc41dfc1ba6a924f7b32fc9a315626f6157aa9fdfa9979a73db2f8ee054e534b4f00235daf2fb967189720f8196986697609a45e1586fc6321a2ccaf745bcd99d69135edb45734fcd27698a87b8b3d95f426f63c5addec03201fa33ac224deb25c1cb5e1e32c7c0b895166ae10cc1b9c270a075619364650d78a2119816b17d808d44d2169022cbc5cc64f80b042ef6def97eaccac3a45c497bf2e43d823c1468167d3dc824fce8740e811c21d3e7b2289bf5c09d722edb94bcd7ac47427ce90c944279d898cd7d975d6a200ebd00104238be33bb85730c0edbd41ad4106855567be674a73b325e508483cb897cdc25aa678f0379fe121795cb858527e72c8a62dba7612104dd796d538d4d9ba80277a4\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 0122a411f6c18869d9d071d89fec1f8d91a658d644a5da66453ad0f0fef2d07146e6a96c87dc4bc5e2d5c65cbf493289d4c9dbb3ee79dba765c71d74d8f0f0e9342f39e8621d791c813e004383fa970001c72a859ee9d01ff9920a650cdb08c11e95df70fcd3bff1f21bb4838a9534f815085238a9f860c27ad6e3075ece222d7d035732c4ed6d4d4fbc64d153da106eb58676f527e7867a7c46dd86c0f55451cfd22b07897f84621765215dd8e2814ff9d9a9cbf828d594c16ac10074689ee3472280fbc14c5f723286f2ca0f15f4b91e25559e77c244be757c18ce7743fbd0151419a1317b82407ee16e2a5b970a660706d0b4de8368ea542ea576d1c0dbcf03e07f646b42a78e430a39eaf5e48ead2d6d0cb360dbd6188d364e4a8e2b0094c698adf864724dc7098b4dda564d16edf775060eb7d26c15692878b93af87c3cf79027ebad55a08ff9f04e863d3d56dc9534d48edac17888342ab8c1bb28d8681bfae21bee0139c16ec1f6a60f2fc4927556a56c036a13e27eed7b056d5e92e296a5b7993a83f788ab0f943b56ab2622b732d717b2a6a46ceb5b9361430c8e8cc05dfdb2af949702d03a1a2b438e1612293a05ded6733e95fa17f24a06e573dd722175195e21f1f5a408ad2d72c8cc788de6d7d02da851f64a59bc64fee89eb1ffb06addb5459871a4614d6652374ed29811d3ecbb04a6646dc261e8aac5f109\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 01f290bc344f5b28bbee4f37d113bb1eb5c9ab3a6e735b9ac13ee65aa42a18ac22b51c684a34b969de549af295d48235bc0c46bad9e5ceb6a0ddfabac4dee6cdaffedda65556e951ecca0dcd8d1ab708176c1d665436ee2e3e9810dd2ecc508b232b3345708d3f2acd95727a2a1f8a612da88865c39652c8de64ac37236fbd0bf6aef4519821363e0be2391b7b0279605d193e4ac96caf52fdf1b71807cd37458f28bd4557f8c9b6db47c72b468f8bd643b8176bced97db6657a59c146b78389ee5d7fa3a463cf2d207b0cb68fe760b83a62462b42398ce7109b3d00b991f5ea915501b6c31d1d7a388b14a995f9c415a108542d375015bad8950f0be42f64c09eb54e39fdcea2efe61e2fdcffa740a71ecc94051c073c66e38e47f9f3161bc6b325123fe3c02ecfcd1d4b811569d95f1eebc7135fd7118cdda6bc24546b5d84622b796c289d7cfddf7d0f34705666b9263e6b9b8c070b28b6853c06fad4b8e538de222799b65f4efedd7d7435d3eb6aa30bc3827247374447ac92dcc59825b5b1e7c636f77db09411ca764366bf3db3bf39d1803034cf76cf59202e664f0cc0bfe03e67c83334196efc95d1f57385150212613147d149d4e6f4f994a544abd82f7eca54c8f8bce8bdff122079196014832547d1f50a9123ea130bc93a4c5ac43edcbfc4fa0f2804a31fb2061868f401e98f2b92a0d9cd2e260ac119fa06664b\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 185bdb913b9dee3ba4d6b27a945258beb43ae70909b6f5a2011256c1a743a6e2e14dad48a92ef6cbe1452306c5dbc77266590476febcce9eb6f64ec7e8d0f233749770275271e79c1980a247c0571dabf207b9d9afe8b6c3ad6f6c5b77c83f445cadbd77c043d5428acd6a55f6104c102240bfb9bd9e82d6db53547abc11537188ffce7d688b116527992f2501ae917f7aebbce1c402693c32ec29611afe7b6709667a65a6b38a6029a6ea884a7659353c29f49398de3c16e6d06e33dd186b14e7e04660c7d864954efe5c9157f178b4b9af46f12bf5fb083bbefeab1fc97114d45f08ff8389e93945afdb56a13eb3a86c64a8b33ee46349289cae37cb4f0b9ddbc306464b7574dfcea969398e6d8720125aa72fa7513ce8cf11502444594012024345e3bc716639cc1814ed18d14eee2251d20464a43bd018a9243dfc8e1d122f1d84664bf1d7e2b63236c3991929fe20d44030d17be9990e11cebfd07836e7ba4e7fa960d88cbbd23859135d2e7359a85e99e1fbb8e97ec736bb9ededf2eaa94c3165c46cdb5e289fe4b243e8e25f3969a39b307840990eef3d8b0db5d515e65833fdd59cf83c152e06f9a066623cba2fbbe233541121295566c0f2ac6150fc0efd89e2cdf7b0972a5efb7302b078816279069ad2e89016cc82add02f9aaacbc26af2cb8494d333c6e33f29a9e237df6dfb5c8e5bd8868c3a66a02bce69e9b\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 7aa5fee8dd85b6fc0c75c86d72fe6c742ecb062a036bbd3796af044378669c2162f6f9c9470e1dc8edad8a41de37411b21c865c0d04a2a4a8cbae941258aecc1bc436e96ab7d66aa1b866e9b3018a56366eaefaf92a1af51d5a901900739eecf07f05748b76565e386efcc8a717f39cf0a163dbfd7b1b02d78f96c4688143a80ea589df83c78440f5c53a1a79fa7265f5e1c15cf8348b8b7abbfc1739a9fdc8a30e25c2081b44437935fdcd19682cff42627b223d796d1cd3437fb12aeb990bf5dee03ec6fe8f0634dc0545d0390facc7fea02b5609f0b37e4bc5f2a5e26868ac3042fac5589457b482bf1c144c239e2a96bd80a813e67d36b4e43cb89450289ab3fd7d377cdcaf9b40811ecc5aa3704086dce9a893d1b19d9f957dcfc283d0ff1a4bdd7f3351314bd5e10a22b2a469615feab35e9966e758c5c2742c35d42659533fbf50693dd1efccaf1787de3c7f66b8c0df90754ca851caf2341b9a7004a7eb8e34cf232a6bc0e993db274107d4d734bb996803a4b335e1ce32d0453450a6fa871430827fd49123849993f421084c60880e3b6e4d33771a1bb255535616544cf4c016c416cd8b9b92c3ed61214972e86a901560c1721fef866ea7044a2c89cc2cba85fb25df521daa90680fb52c2a0baeac9d5942c851fbf5f1e88d522e759aa342d15be1b72f9815c0debd081e9881fba247dd6858890fdedc8838e9448\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 339772930c065104ed237b979efdd87be944739273a3d76e38e2a9dab4a089307f236ad0477a324c0d5f065f6eaa3f50e73104e4e44d25fd5b999948ca61c72ee440e4b75ea2909617c41833d0f67c28de6ed499f3df084310babacb41dd8dc94b66622e7b9d1fd0f81328cdc451c86bb891efcb31c020b191598b36120a40942d35761113680911756c72b859bddc17993acf696a4360dbeb63534f4b8edbb8a633d1d649370ad4c46c51893071712d3ab165421f8f0fda893e4c988ebbfe22d2ff6cd0f289f3cb333ccbe06291fdbeabf19f77c4ead63bc8f316e95d1bf9f743fd5ffec9513c0a1b2b89211426d7e7fc386affb340a8a7caa6f17a9879fd9582a5a01fcd3a2c399967feeea1333f01072ff1ba1785d27cfc48e04b05bfefe22870d82369338b6146d72761318ec977e3193a5fa325bdcc4ef2bac547de3fd099ef4e83461b9cd4cf9c1d586160c52d9770060258792ade9ab50568281f1c71d7a886db372e0afe0a6a03b3d3bd24b9ebf1cc5495570b3304a39b2d57f94f282e7698bfa71904a087d57f20cb67a859a888a2828df1ad1a424f02b272fa7467555512050c3ef8eaf9169ed20d7143cda6fd86a110a3b4102ed8a74d176bf625e488dd209dbdb81b78d5d32509af825405fb87d5400201176c36c19a1d8b93b020400bfbd5ad7dcb2c0dcce99ee05ef2b48e191439fe990d0576d0d98c5c9602\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 84f103bc40d2535d3ba06070b9e5739dea918968e524cf431e4a8a18036d5c43c40fdda432b5ac9134a54ebc6914d6f54895aa24a0420175f348ac41d13069bdb443ad3dfd8c15c283ca76bd557060876b5e686e6ed9e090b8be9701dd6afbd650eb9032f5a331fd91ce85f784e20b4a20c998b94bb9e79ff8bfe56f67786ed76dcee79002cc5586d04b2e1d82b7bbb1998ae596d09aa3cc8c7293bf8c6a89c22d7220fc97f426d0738de5c06d41e9cf13db801180f3407448ac2bf55d20ecdec273f41dfabdad0104f07d7902905ec1d4979fe36d5e0f8940255817fe8f911cf3dc295df6f17de9874b7f754f08a50209b63e8c87302d78d5ea909b0",
     "ed81f07965e30cd58e877984067defb9599541a7770787fb738bcb34b31adb2099b19ec15e5f585c52d64ac0d3778ed8bd415fb08303ad9492fe1ece5cc3cf824465856c179c304211c7121e226c859b7b4951a833eadf6a6f29e3bd3c26156f5af69f61ba6b8dd42747f33056fc1c0ea9f941c397f0d57d67e7255fcad2b97db22be83f2661122afb59dd2e18b38019f1ae40d48e6482aaffad2fdee1b971f75a93a9b14062d62bc8639bf866cd70c4963bef4303da8d1708f4ed489ec91b0593ce8f83cf3609cc51fa8c0ba0a43f96004818668f403bf97cb37a86b247580a33595957cbe39c8766199e186725afba94491a5cc7b618e1ac76436322823bc3f0b44a7\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 0b3d6f1a7949a05d472e0909c4667374a87e291ca8065786829b26702f2b979ed440a037abd310da6c0eacf0c01f5b2b082d00ea043e9bd403af238a0909ad8302deb3514cf7710d6a7777838675fd61e698ff09d03821046caa15848cf3c8b1e70fc497e2c8d3639dfaae1bebc52b68c24b54f3f1c4dbd8691d05867a818b0364512d6096ee6a49de7aa7f17148de1f5036af74213df39be1639a1b22640a693163af2e061073e28e1b20f32ce15cabd1005ed66d4d4ccfb50f94c6a34357989c1e13350fb25eb75e5004dfc311babf755d0c007fddf9398aa9c2761b5415c3a1c25e1d0c883187ee41c669337f3b69e131f87c68360ebcf4ac53cdd7101c71fcb1aeead812b06efaa514fecc8ebbc4b339a3f8e9fecd720c2d9019885346d4b483418ddde6f99c6cfe67500ac3ef5c064ab2fd96bf3372ece582c02e3dccefe5ea8cd82a79e7922075db696c5aa712243566fb820bec894ff96d3e844aeef4416b08e023fe48570f05203cf48054601a227ed3fc81fab7e54090864c110d7c0333299839675ce029436cf78266441fb910ef46101c3378cf7d322b696beed85d68a74fc5ad8bf65d212996774a80a68c7d017bdcffbb3f6194c2625e5937d3a004684d3a30b4c31c7fe4c05718182bde18a444dc2467d87bfa9fd64fbf5d31919d4f33f6f5721bea0afde9f47170fc8a2f45e17f4711971572873344a14372\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 2049694bab04b950f76d997385c150446040ae3373d4f868e852cbc4047ddf2648523a963df01a9a383e8a8a47a6abaf900de879414fe360d8eeb36e805ba2821d64a536c7e9f3c013d72cfef75038007cf546bc418d5e612d2ec9a41d9ff6807f8a2def511b09743b28514ec61139abe25a6087348d66f18b0a80a58f7fd91d019117c3b223057b8229f07d22c3af1f37b92c1c7fe8f27ed23729926bcd1f8470eb84da9b8991ed03ed9420b029eac8fdb6c76142150d1216a9d0622bea7d168c8019cedb9db6b984232a97385fbbba76ee260b8712f805f8e1e6fc966c9edbb4836137cf8519961f2ae1134867928ab4a517f6c4148500492e5a70cdc756df38f55b6b93ab81651e6edbd434cbd7f41245cddfa884b5e6ccae02cd19e1714ac3537966a113ea8cdf31b73ab55935af37a27420a6b0c8aaf225ed93e4250392b67cfe09300596836050ca95f16f1e2913eb3118faae6026571bba1803c0b133c5c39b6d8e9db60470b193760efb1d229ed1b5f867636f890c96dd16e454ff3bf75c54a1ace011d8c5d85a0ea3723bb3461369ceae212f0632b50f0dc0feedacfe701beea123f7c2ce22173a1fca90c2a861769ff9bc7bffc4d04d5e8107dcb4a1a49d9fb5dc3d806a0aefc1622935230a617009831f58adfdd08426ac70c688297b89452581b094a21beafbe33547f68812433b41227b87855b205aac11c970\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 741d6aa34179e67d3a1174ac4682ed88991e043dbc2634ddbcbe2b36136b99a279116b713e8484a4d4bc12b53ace3d70c5c352a07a7fbcdca7158abf5def14eafcc6919288f84b315dadf12a105e306b8d452f78d5ff6d4a95705c66186eb3b3a112bb26c266d3b8262c00d7a97da919ca37bbab032a60a55a1fd8e1a2cf908fbe918fbbcd5065dc210e4020deb415ba02e112f098aff54824f7fbfb959fa23b411fdb711cce0e0925e8ce526052ac76769394fa9a57ae4eddd30e4c28d87473054af6f6173292e4047d668c3c7c6c0d1f1e5e5ae3dee7e85da43b0478d0d0a46a759a23e1e5e68f80562ef52b76d85f664868e8866d8d728793e0d4f20b5673dd32eceedb4fe982036ed1c7c930c8f711888c8bddb33e385033043c812d6f678dacb3efab547176eabb08abafbb521111a6d5bcde133fcb7a4f3ba2316d2f7bbeb4aff80949e759da76dc238e64fbe7d27f4501eba60eb1e4ea0bcf9bd21c23f4c2385ec0a8cc078f8e67ad9ccd605086477ba2a9cc7148213827f63173641b78d47c920f73b72d2ac17f7103aa8c8b3dd050b260a17ac760a3463fb7dd19703d6eba6cf5b1a0467b2691b46ead45cbd6ed0492528819b50c922ed25f2b7f4a7322bdf24194f1cab6507b11f2211090f27bf3a6321a7d2de90690968a0401c117e8165c08431a1dca9999d8167cde6d53d41d3dd8700892941c9a36aa4d72dd\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 0e1551fd4bced67cdf4a57e4bf864bfa05990c52542f86d76714e74606c4f034d8e79cebc72af64e9f38bad64a2ee9f9ad8e6b1674fbc8c0a8dad71b55d59a52689bf8dc4fa8912ec0ba8c8300089e7fd689afff6f33fd13d0da443be82080af45276f790d551b162dd1e2592a53578af985307251a07aa46470932fe1ac6fe031daed53fcf0cd8b542f24f6dc3f58b28488c80231e087d6b7f48d8b0629e450b75648c065b603290971708a831d42837bf8eef88e5233228af52766675a046af5524d3b79831933e96be6c737f958aedffeee151f0eccfad3e95ad7bc3102ebd4887a340471e9115c4a6186b1021c724c00322e79c2dbb77e29157b72418757eb07371634d436133517b20d54de645b49ed5cef79d7fd88cca5ae8eeacf2d086f33e9e08ab575c1b1d090b64145cd6b57793a182e519743c4a69c1369be0494c253de25618cb488cec77ba585e7a2d5b387fd3f76aef6f6f7811848610098b916d77efb486f42f85e011c962c521891e35877c392d190bb2a9ccbd60a8536c29a07033531b74f586add9eda8bba422f6d1d343d6577d9f75906169d15045cd012e1b9267aafa15f39df23f55f931d9d8793a9b5c3e93e077992cf32ad57ac46048b19e0576f4bed86c502ce1af168efc236c49fed9aaa9614bceadfd3cac500628a8be815f074618d7e96c5d9b23e4139ad155ce9db36885f72b9ee1249e069\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 0cd65cb5fbf66fd36a61d7c3577eaad17191db8ed11ad0075fc3661120df2accbf0ae26da7e52e6aef362c2ba11d0743c4672a96f5e67b2adab40902216f433bd70601099563d3e168ee93d75f3db88806cf3d59017f5d2c6da4218dd9c8fe0be177ac0093e0909c34245b86cc1b791787e9544b9a874eca413895d81710df277837f4a598ea9f57ab8ce38f6a960646abe9f4ff2748d994ecd6ece82788ff368ce6d3989a820bc2d51c43cb88b3f9106b9ffb01da520514e7a03c605b4bd10d706eb322b67ed75072423505118efe727496516397a3f5ef9c77515d391e45c7d589a1fa1eeeeca8e9511890ad1a5d86046ddc72af6f6f6e08f87668567cc67e50b20d47f30e41665f192efb99824b603012d24d8c9e14f3f9facb12baf09b7004d558c39674c7e76f26bbb33945f73264a712e09277ae0e8ba9f208971a207dfacc8c5743411a591e4000b25b263ba78e7305a74afbe58673f26b8ed7b8377f7ca627839017b64d20c3940670330f6b45938e382d6d1099301a4b0017cabcb04d2358eb62634f121ff426e39c512bbc6539316f1d16da7b4ea3e203c2cd5c599080d1b3b3eda0fddababa6b402ae8ab932185a78dbd47a69ba9eee993646670d07bacd79caab4f50371f0b28e23045fed617c632dfa694c4028b8724733f30606d57502934000a6b95068805f70d44576a039fa70db1de3d1a001c6030913b7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 16bee7581623613fa6bc708e804b11954ee5578e6f6f6747eccc52b5bc47c0039569ad2ff4c9fd98cdc54404c50d404987cbb74716d769d70045361ddbd27f2c0e744681a2177f4ececedf39d90e23461dce3353999c90bce6b6b75f2c73cb2c2bc6220cc652196e8555495379bffefee61caea6eb850c0132e084897d9bdee7aff74da1be6f7ef2b86bc6f57494565ea93c6f3ad1853a5706acecce1190bc97bde071559d89f65c2717c31740e176c2db442d48c1780f65230eed8b498da2000a1a12ce4247221e68231e27d8b60dcadb2f50e0a9ee346e2be5083d964a5195d80d9b898e18ae88ffa73f690f2598b45327875278135b4f5e7ecfbc273848e1f1fe5504cca4a2c4a7fa353a301c2b6ccf0f2df7d0ab439d1e8629304f63fbdab4f6d28a84c1d581d3d43ba64408c286dbb452d34a48644271f23841868bd3462df5e4c0f1cded8e868c96cce995b13308339c49a0eb16bf5ce9493812ee205dc8b3fc3b8330895de3389895f162079c72019cb2c936cdfef9cd9f413514947e0abbf440db492f8b8b8aa66522975d674b0f663b0e24bf826c8799b850cf6a80221414eb8ddd2c83f824ee4d4db6565d07b46d8ef26123148c77c693f3c16d007b7103230e378a428dbd16eebcdbcbde38910984b10df5a3f6f9e6204d462e5c304cf5",
@@ -3686,18 +3785,18 @@
     "3f4dd2f0c772cfe0ede15065b351c3e0892dd065a0fbfc35e6cfe47ffd90dbdd465bd7ea500b73f4981f3edd968cb5f9d2d1fd5abc1c9575ee16c263ba85d349f23de634801c2b64769b375e7bf0d098890269762840fa2f6084af3d9276a030b975a42c484d2be534264562b4a3a96d8fc7ba0b333d5af7b7a218fae0f23d21567293132ba3380de85689a1e913021a8df624e80c09d9c0e039544dcf6233c76071028ebc67c9de3ee674bc6837af70fa12d22c6f0d04f3060e2acb6700c3cff134ab90c2e3b1d7526b2fd34f8d8197a2c9e2727615732b14bf4cca0d38ed1dbbc357e7e2cd994d8deaeac9e6f44f63cd0fe509180540b5f5e85431d78a2e1703737ee082e0e709d55b27a0734584ae1adfbdff977e7019978abc30e0a9736b6b3aeb8a9f7fe1843c1611a8c77f4b92620b8167335ca222b44f3b\nlabel = 8b64ae26615eda5dc0a47b20b4f2a398844e7b97a06abd28b8db929ae347a11800000000\nmsg = 0cb3e2a241c8977bce02b885deb4bd3e707e1e950bd20d6573ef1cb28e558aec1c4064a18a0d656c7649d5412c422663784f9d24f4ef4ce744446a8e22634a4da006497c93df79b1a1b35d3461ce7ca8008dc4e2b23ca9fb63f0e1819e978ab95a173127e3c347ba33ee597b269c39983a018b9b79e596296582fae18da8c38090f1f775cb3b12f45fc33dfbafbc262b2579d93370542c2e67fccc40872dca0e2c177a349278d9a04453603c7c94a818541a586470c53302a4e0541081d11de7205c3bd97987db419aa7443bc7256213a8e046d1160ca9b77e1f10d134d43ad288367dadeeb55633221876e5783214b7c454e9ab79741b8d47e2d2f8c8ef01fc3ce7cf4b3f18068cdb386ec0a5734614ffab0dbc2ee1cc35a2cfd2e84426131c78630b4c8965796691e84f276ad55c41ac6d9d66b320580465b9d8d5c956cd4b144874c3430b4bb9e3f9408b420f0dd6c86918f85197e53538dd5e7ccda27d0cc62d939f394f7b6acb0044674ab549f087b33eddae5e49688e02e1ba0abb60e28926692de9c31667c147a8058b6db9ca87b217048d621b8685a645ed87a5d1edf0027a4eb07bcfc874987f43691f3e82ff028f7052b66610ba4a02d25c49\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em represents a small integer\nct = 93ebead3c8001ed15efe1648c9615db880d29fc29efb069671fcc0d5888f6ba3e2784639e6e3b9028614603d2f5180680aca911f23c5cb3028ff616920026d65afba45ce6e8c708e166e11ba2d837e4b120563ac783ef6aac5baafbabd26dff137ec98971ae892040f9795f63ce03f8df39ed75ca38999476088a21a7e32bae2f446e8a7ff5d6cfa78fb3635e9e301068d0bf53a36d66f0837f69de0da108f5c43caedb8136bcb9716014f09a7eb76f28761ed675447fdc46bc7ed2993a408e047839ba94a7698361b102c5e22b091ba5973b82d4a2040cfc5bdcc767faf5479a5da031d1be8242f6b1ff9859cea44db3074f021a6894fec3b637e320fdd4a03bf1b58fe91d5f8fa36f41a1c989e52e5c7b2dfbdce9a6dfe75d95977fbe533a753ac972e92388351080eb1d564fea5f3eca118bdb6004c0f16ec0b41acb7dde8708f65a8cf3af10ef8d3e9afdd314fecd3d7d4d480edf892f5117a6344cb12a2d39637d4d74597c129d7713dd878eb34f6f7dab71e71efce02d17eb008d370b809b31202cdbcc15f437cd362e7d41a1aa2425ee578ff8c19e6941a79d7bafc87201e819e1fbe5db1e7148628806b4ffcbf0e0de6f4632452d606122899452282ccb9b84ac11c70943386b6dd0ab1a5707bcbcc1799708ac8b05e0006aae87dff7c5c9b167f50c0fb6cba16c7a6e3882c32771059591abfc5a7cd53224b120ad1\nlabel = 2750512215b61f8e6623523475aa61c48ecec1b5ca09ea23bfaef162984dfce100000000\nmsg = 88ee82a2ed9e2db05df7d835b69113bf60ff23efe64e0bd14bb064e197c03e75f9730421be7b35770bc6dfc660b477276ff0ec936a3d3cd416f69ce8d10e4a4c6dc855b7a9e2bec17e3443ecd35a567fd0a1ab0fe027757a4b8c90c35d3aa26e337b99d6a1e0333d57e997a16a65d75ebbc8a06eef396d316ff45d066d6f46d18e68a423b8056ebc97cd8dca44036864f73584872405f8935e33a1247f20957f470445c36617087ad5260395f5f2763dcf4027dac0f95f0b378c9a1eea7ab02092ed8b893257615aec24a7ea9ce8edffd082972517246dbd9fcaff3fcff191cf23be27ce41c97b77b0e6d0add28848d0453acd8fa996b46edd975934d449d40203bd2bda89dbf80c12859c00087d77f58172226c065c8a7a3ee9ffdb688b8134a06216335b1d5ae67b5ed44c48c01c7fa54732478a2789be70e8082707395fdad5bf7cbc111cec0fa6141d8107e962e4c22c4cdba303dd692d6ecd71b1fbfc33487b33be2fc6e261914e407c155e2af7a459c10a1356d679a5a338528a283a47163656fbcdb748f5f7e244291f6699b0355f0d3d4931bf6c258f29ecfe69d2d01cb1610ddc40751b17fb275c68c899782c43d1a15950b53dc42c556b0c61\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em represents a small integer\nct = 054309a578d6ebc75b500308a2dc17b0f4cd5f9c1b3776bdd084f629eb6cb96d419a9cfcaab5e82908aab40bd28f1c622ce7b5ae40487aed8b56a71be56a91b6c3a7059b5cdbe81e5c7d19e2b63fe3c55833cfdf176eb5d46b0b4237c4af14eacea75a53dbe3770d934d5f8fab4f3ac1222264768e12f4fa4e4d23b3b2cf5fa4e315fb3da46fbb821456e17873e7ff06c247be7feb91ea4d1f7fdc07d351f423a4d133ad4ba543c9eba67b06b9c023b06c12e64b3d9ced33192945f630509f38053601a70e9a1781ae3688db6926a65697f41b5c51e2d97cbe293d39f270bafc0ef97920d83ca6a8bdacbd4ad1f5ff7e6643be13f2b6a7826bb03c87c99608a3ba5088c5703148928b30fdd459d902af837a8a51141a10b7eaaaa47a5458e28c10c8c92522efccecf7961f9345b4f9e00fe08c1cb01d0780199ce25edac27918db9d31adc7bafe055d4b76bb6f6b92cfcd8a51fb57718413e6ec3b7b2fe695baec3c0b15f63c91cf1f2d5a471e83e8a6ef73db86dd44c8284e0f6beedfac5d50bc2a8985383610e388d4902fe179cc3eddff4e24e2d4585af1dd5027fef0f6544780d1b43e3f23c04db2b00f3078986124369b8e7db5295588d3ec5340806229069c50e91c1e5a63446ab7c5f7245df2e3995ff5e39d4f5c4c734fe01ef23371e79420c43efaa0683ea212580d7e4d2ab5f3cd988a26ef9b3bad91571df86a97\nlabel = 0e5192d581dd952ec3aff44952004636d015ecd7faed33c005928a26bc0d30e000000000\nmsg = 0d9c1280709b3d2fa20196594cf21174401bd42de9f550466a506bf1f088ae58de149971a848fc31a4471bc8500921a2dd2c5a642ba523c264e5a1e0571e960df2c7d3848705791fdd05d6518e92034740719e5a25806a19c9fdc454076b150538dc7e949f3c997c17c1d3beb28393b00e4778c4d373e8b7e4acedce664f9196a6ce3e1e2274d793f58b34a50379bbba57b221f961c0b10dc5af3fe6d55e368d91357095c0ede3cab024f4d6e38884616f9e9b8ed2b185036d44b54e3e26d2d84b0f8b82f401a3bab3a8e2fb63a1a7a29e10f821762ba1bc904a619c4c82ddcb34c2091b8326fa83246ade38d516a3c04a31c9a934015ba0dbe6cf992477c52e7d13bdb9fef43230fc19fab553c04337ca331860a1b1d6af4d99ecef5bcf2e28f67a4b0182156da9e5e7b9eac9e8caf6fd5a7463e31403d1ca14195a25e697e0b8b3038b2ae86cc6bc2a3aef690853778984ade5bb45239982aa99c961936b64c8e89bd2f35f8853fd1df173d1afafb939bc4171550ded9ec0a8e6abb02656e45adfab051cc64040a736882206eb723b5f36def6acfc31a51bb6524dde33205ed599e38d7976af79c6986fed1f6e7c064ccb6d57599d23bf9a1c96167c49\nresult = valid\nflags = Constructed\n\n# tcId = 34\n# em has low hamming weight\nct = 904f9e8ae7e411ed6172cc00bbbd2ad1149573d177a9a2eafb9c0a6df18aec5bd83c1e4e865b35425e562780e57e6d83e1b5258978a444a1f91fe68be1bc0c529d64702d3a0f7142a0f0ebf9a5fa6df32d2fabe3d2bc7aa0b0f82a903c8448e0037a8e204336396d5ad28fd8483159e45102360791d7c343e973b38943b0851d339f868715d6ac4e5ab615f9d430d666032712e2937cf325977db79cce435d8e2c6d75b306b668f72dc7cf2ba2f8eecbd23b54878d1624ec6d7fb72ba26e5ce30603b66edbe87d4402e989fc75352698bf7fb03d1b5694eda874b99e7be2fac348f1736a351207f1cad43da26dce1470a55a795f3d11fa4d6302f68b88d976b2989dec0e669388c62cb555b929bcd6b5e4e2e42b06bf23672f8b1ab3ab2078b64a598be8d3ea6540027f736ed1d75531c0ecd52be66328c4eede803f70e8cdab6524f226d035926603b27376fbdd28564d8361f7584426188ef5318ea7332619bcfb2eb02424e1737ee0719562cc9975e4a0cccbd6e41d9a133384a62dbd2fbc36c928827c56f275731f4b197374e99c572d190a18b35f19bd9f5d7048cc9b9e034aefd724638b37a973348a1b5e8211c24fc16795779885acf915a7f2baa7087ee16c125a417d7a180a8c969b0d958f3429e12bed1a8d24b1b1f3d315145169176d69707d60e34ea54b7af983722ad91a05ab44f8450a55fc2e6017d0604aab\nlabel = bb9da557e9104db1e8ccfef13fff9a409a7d459e1d4bfee04ded3f75aaa0f23300000000\nmsg = c41f3759e1d39fc1a701e34b0876440172eee941bd9a5bda66ce86ba942527eacd2a8089adb0d9112c57437818d1cd9d0ad82977a20a88f8599e23b123ffe00fe0b9dd3544fee275d1e48f072bd4eca1e3a3a40afb914f22d3cb06803575442d04a2dda5bb93453372244d63b23e9d8a250c54f27657ee68024abe1ceb69bc3a4f5933def93f4b1084b30e2577d6eb2e21e5febda06eec675093c2aa117b7024c82b2ffa9ef5d6bcec8481c5345843504ece69e52a8a57285f048f69b1afeb735aceee081655b8381f632966f3e34eda7c8b6a7bbf4b4c7af65b2d9393cb4424c94930cf941d15675c6b12e33f892e93cc11271affc6036434e9514c0edb18846c0962ec369f4834d0ecdf799f0b36f11837533d3b2b71c9a819008a14408f0e360d44034e14bdad6dee228e37ec34bac910970e718ca4467a71393b59135e19f2dde5b693383e9db1f8f890b5ae64a779c6ab4bc9b48185d1d03d69037dd03ff1fc4aa7368282ec50040a28b160fb406b0a573d0e10e1906e0665722a07743f34c8779f3d6ad56f4cc3e53d3e2ab666684bfe67cc631e1705a47df516cc440d8ce171be464a68cb9a2cd43d1b92414bc3620f2c1adb8e53130306750414\nresult = valid\nflags = Constructed\n\n# tcId = 35\n# em has a large hamming weight\nct = 47b177a8fea05a0c3f6668bad507fbd3f0278faad6938c69b45826043cd24505022c2ba5fe8da4f4f4eccda8e86f4b4eb290b5b53952a803326a60888c07e41b74496bf4f5df9aa6fc884eecaac5dd52252d4631ac09c3df407a28b0c10de2794222b4a5379468a407805f25bf6077f8ff834f",
     "c49a01d6b12d2cf133fd37f648da7a24dc19035d8df2ff9da5135387fffc1abaab10028bc3cabd79ddb8901a81940ed80d304252b38d7e62ed0bed5061010737d88d9482e99e6dd71c1db75922cb2304c6ff0b594372dc7d73000a80a0dade307bc7cac2a9e634c32573ba9197b6bf554ca549227815325399560c8aab7d29224d99572c91b9148b167d987c19c8e33e7afeae675d5b4ec8dc013d439cb96c9e61ffb67937172b7ebac9decf7407c2cad48448cc5ac696ae4b53454f75aceef6e7a9fe7f04657bc0b08f3b0373324a12f4e0a04ae842483abf2aa9f11f236cd512cf70859d1be27b58f7cad0778a34708770fd295295e89c6ed6d055563ad5e7b30b64042860d2d4a17d7d53ba648ee27639ec91a9cb4dfa9a640f18dac43a47717bf1bb0f6371b44efc63b970324a8e25da6e0e83eea6f835aaabb815eac784aa023866438c2763599e078242e9a9aed6895715fbb033362fb2f1b543d9be3190dfbc2420b57c16816813ec78be3faa05604379ae168ccb0d6ab9509d0a84f667331e158c1644522c7b0ca862\nlabel = adc385a5ed585a2afe16f5f539620a47cc3352cb31c836bb72e39dc7a23b84c600000000\nmsg = 12087af4d447159fa47d932be56c419788668b8da88954239531178a718810e3a6eab3a08caf92b39bf1500d64eb0f9076100fe45b8bcc1b04cb6df9cdf05cfa1f806361f6c72f2c7d3afa9340d3b5dd1e2381193ce01a150701dbf4dfd99b8fa8bbccb7d0336b2d5b7df7a7d60a2c199ca037c6125a20c115df340e417f6ea87e7bfc53b19108dc404e3caaba3338e4edbe2e66aab7fca73fcd855fb95557041c59256e35306c102ba3043624c4b01378a0dbb3fcccd81e9907bbe9f17d44d0ab1efd0cf45d8742afa55ab4efb08a84e1579cb57d8c233c0021b1d22c32b6f6dc903d63f12df51959b06b7070077ab9672bad56608c22e54dd5cb4969c9798bbbffde18cad39c18d8f392df84fa68142b383d4848ec907c251af6aa3b8529b84100b981bac087ddc9e1df72a30f0e861dd4cbff9b1583229ef9610217ff4592955db67837842394f4a7789e8d99255b999f61af7244d23e66805f368340c7662fd398172d326076936fd1e5752cc9b176b30cface1bd386209c50fef70e95f6d7ab854ff75368109c277fc169615803dea8df39fb4953f78c48a42ab137b0e6ef3fb7a7a45e5790773e8465d014e18d9d51feecab8f2f3e168ea78d410b\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen151 = 39284;
+static const size_t kLen167 = 39284;
 
-static const char *kData151[] = {
+static const char *kData167[] = {
     "# Imported from Wycheproof's rsa_oaep_4096_sha512_mgf1sha1_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 7bb0b14b4fa435505b69876e65a3a3f8892d61dda53709f4257aed4c8aa91f2351cca74cda1989c898c88e4a4dc60c583fe2e5f73852933bb13942bef04b4af985f8e56fec2d282ed9ce56f27e452bfdc4ff6e7295d95251c264a36743c14fce78a2f4ac6bf8ba0a8ac5f88c82524a1610abe7548b7f6a97bc744473ded26370bff86f966885ea31787b058197ab58830ea477fb600bcab4e2f133a613f9f125319d272ea5ea323fbea830ee146725a86133c4167c63ef899edebd2f91769329181325b5748a1146407901a8d8bf66da94dea20e64dd3c12ad7251df719dddf3fe882b6a22a30ad1061853f748dd83a72839adbd885710cff95d554c1bcf043dbb3feef19d498e7d8db5caed36bd0d44470fe7d7d1a1b0eb4c391a0736bbfe04846ac98d6243a4e3e58b57549ff7f54c92f103b33c9db04fbc6b36fdf5191567a79bb35a0be94a45480cfc28d377be27da9c2c3cc0bb2a4e910ae44233305af6a87387aab762c63d969714be53c0b8a26bd20cd63761b373b815330eb92a1fa7e6ab827276335dfec94146548d073ec828f3793a84cafa12126196a33f5fa2f4f2f6470093e99b2b2d91f2ff9240580965480d56c74be39bf42408a0e41ef60dc080898ce3eb530d87b4da4673977055e83d6504a89d60fb2f49703936a2fb391fdc39d59608d500870511b458c9e45e53398db152d3871f18d61b9afa4435c9]\n[e = 010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3]\n[privateKeyPkcs8 = 30820943020100300d06092a864886f70d01010105000482092d308209290201000282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001028202007bb0b14b4fa435505b69876e65a3a3f8892d61dda53709f4257aed4c8aa91f2351cca74cda1989c898c88e4a4dc60c583fe2e5f73852933bb13942bef04b4af985f8e56fec2d282ed9ce56f27e452bfdc4ff6e7295d95251c264a36743c14fce78a2f4ac6bf8ba0a8ac5f88c82524a1610abe7548b7f6a97bc744473ded26370bff86f966885ea31787b058197ab58830ea477fb600bcab4e2f133a613f9f125319d272ea5ea323fbea830ee146725a86133c4167c63ef899edebd2f91769329181325b5748a1146407901a8d8bf66da94dea20e64dd3c12ad7251df719dddf3fe882b6a22a30ad1061853f748dd83a72839adbd885710cff95d554c1bcf043dbb3feef19d498e7d8db5caed36bd0d44470fe7d7d1a1b0eb4c391a0736bbfe04846ac98d6243a4e3e58b57549ff7f54c92f103b33c9db04fbc6b36fdf5191567a79bb35a0be94a45480cfc28d377be27da9c2c3cc0bb2a4e910ae44233305af6a87387aab762c63d969714be53c0b8a26bd20cd63761b373b815330eb92a1fa7e6ab827276335dfec94146548d073ec828f3793a84cafa12126196a33f5fa2f4f2f6470093e99b2b2d91f2ff9240580965480d56c74be39bf42408a0e41ef60dc080898ce3eb530d87b4da4673977055e83d6504a89d60fb2f49703936a2fb391fdc39d59608d500870511b458c9e45e53398db152d3871f18d61b9afa4435c90282010100e97acd5f64c460b2cd51cbd70af5b4caa2882bf6033a92a23ed80f039e8a32c8a4c483f94ee1bb89c1dc1f6d04360a1c3f654251ad72eb39cccbfc38b072054bb0f21b9d516ef272e7cf86f8a8f838eba829e7fe9d803d469a1810fc5b37476333ddfc0cb6f00e9967970b4e474e04373f8dc92df50fa155e3139bfebf4e1cd274705551f2e9022029bea4b86664633d13fd90ebdd0b72d95a6508b6b4354e64b187fd81d21a0b1e4a853c27df11d7fe6c8953cff6344f50ebaed2513dc03761e8877c71ffa8005331043027b8dfdba97cae037fd5d1fda1f145a200c0d20f8dccd62e5c489eea8ae827910d3f48bddf0b18dc3089069f96d800de47036859550282010100dd1abc951ff1474ebfb70807b160b110b1eccef429c8fc8535ab0aa98376a82d3d33af906fb0395750b9aaccd8723cf73a8c3a6ad5c3a0929178ac55e1bd1ba1bf5da4f7698dbf09e87c84c45ecbbe8f12d3ed1091bc470eb2c733c31f8d27eba9718ee78db887385bff6b67950b79524482c50daead4db0f5676e4b92875b5be383ab1cd75e1cadb59cfb5794c17220154aca808f733a636d28c016d9843940bf44bb15ed191f53449b1651b79554c23e006a56dc0232cca209bf2d3c12cbbc0ed8b3110aabd365b603ea8cdf15e8b9ac781155f92f39dbf9749f70df003195a6bb169ea0e0d69eb3a18ce8fbcac9be3c710e797acb5c05a399c2f102947c870282010062f25622fd53741f927ffdc10eb5fe7e79cef7c274afd800c65d4e4f9c5ab916eb2d15390cc301756a20dd7897f646e69dbf4e11cb4e0e7e1a5ac0734de3a476e570555fa069427a8bdf19363c75a5b9c934a94af078ae7f4342bbc016f02062dc5251451a2a3625b10f040d928e6f9ef262264641baf406b00b596ae6ac35eec2c5f082a04d3b476229972946cb787b2403abed296a76abc2715af602fd2c51e422dbbeaec9b6b889a0595414673d806782f37008c9366bf6d5c9f000197bdf146a86c4d131e3a15dfe8661ef297fb01e54a8cafe54d6065177cf263e91476232d2fa26c5e80342070ced9e0d99c84dc4282ef8aab991dc9d8210b14bb267590282010100b83b9f0763265894758abd562ba6b5e3835e1ed3b43d94ac2a9beab674a45a5dd7b14988c087c63fcb33e9ede62cca3ff6b901b4238a6e31b2a52a742534bde178e33ea22981c2bd2ecb1295cda757913fcef6a9e7c54a302527772a0f103f434e5d21063040a1eb843cbff1ff6f20183c9dfa33fc68cb63b81806ff518917c6e93cbd47baece0589e0bc022aa00c66795564c85f301c095384fcc3f3ddfbf15044af0d8c4473aa2d777a29154b74978d0d0e7ca9867fc8c263898e3c83aa12881f66ebeb4759820181a0b46765c7b1ebb67108ae2a7473ed40d290d93c3458dbcf00759061452c0ca4cc26d1fe149590a63e9fbaf25e3f78eea8054f22167e10282010100c301f6bbe5fb5693f665b26d1a61e1de87e38950a5825270ee68ea5a5667e11a3aed28b2266768d1a3db3437dbda681ac8294dd50ad0b4bc5cee5694831b8df7354695335740b9b7dae5f7881536da6a6b2ac4308a0420ad6e99cb779a6338f5012986b1c1c889444d90585fb0dac995ad6e93af7eac717c643c4b8e7023cf57cfe284ca911d6dc3132b08e17f4e8759af42b43ac929c0259c3a1d5e5f7c4b247e2f6461aeff8577aedc710d6d2d56d943c211e47467421539dfc2700663c4068031b695e487ae6910ecb9c547cbfe12cc6f45b658e2c6f9f8fbe805304194a9d1d9c6d599c5ac5c9ee5fa78c8a4583218f7dc8f4c8d3adf275eec0e0941fa69]\n[sha = SHA-512]\n\n# tcId = 1\nct = b9fce8bcad33219375323a2e641de7650c1163d9aaf5f2f0c5b96230e788a9cb970fd4cfdf9df98060267e302b133e4974c0cd529ca1c900dfea65b46078fdffd9d589319087bafdbdbb8467013e48262bcda8554b225dc3567887da78976d5d9ae23ca9914248debc2383634f71d171ad375dccad198eabf391f4bcea22473c925e18d5210b02c555561592411d3fa6d2e425415a83fedd651718a8a7d1db2d81f64685c8da9a05e7201593374e30173ef04b42b1f16f0b8a8cff6c3ccc6b251fb61957df57176102a8a03d9718d95f3bf637b1fe1feefed9d50ebf9ee93a99c60d2e404bb78f9a4292ae280206782564cea8e2ae831f9b5d629b88af7c610cf28f9c6ec56534d16b70ebee0df20f8ffb40afdebec977d16f84c3e583a1229f0d2a01e0959b1cbf37448ab947da05e7cde1358c9bdfe298f2da27d65beef13aa13cc51f04c18560c054dd8f85d34ec759691b3d8c72138df12e6e442992a2466e3a6db6bd322d04c069741e0accc5f291a6520fb42fa001764c441c37456f9d91ab31c94283bd4a299fe4fda6fbd132e04d8d92157bf9aedc80c66cf7046a33bfa308ea7f5f56963edf4d804483e631acd033f2d9ec190c6d04c55540908e76f9b3749b8aef86287818358e4470cacc6d45fee370bf836d2b9277d044487aeec4064c74814d2c57839f6bffacdabe1f2ccaee4492b2a5b1ab7f3055d2569c58\nlabel = \nmsg = \nresult = valid\n\n# tcId = 2",
     "\nct = bbb5c693aeb28296b4559a792e489c74bf21c3739153be06dfd336f397f16969fb1ea0523f0adc7e206d908ea2a8eae1011217a54af3beeb6558bd80f2c111dbe51a0e25f3ac65578d4e7f6b41bede65813bb551c97cd70485b81d70934e86e6fa349287bcaf977e666bf9526db02e76f82b3ec2941c2c7355133adf80e16fd8c4d01a62f63d1e0e6d67a247fa2084409df92f8f528ddee355bcd9cda753010bae377bfd6e1a29a4021b239f98cecb5b8932c268393dd5ebe58d42f7eb59fd389491cdf05d29e7cf8c148caf71232853203dd76bf0ef8ce7be145196b7bfa83eca9761669fdc281ecd66ac37d45732c510b8d1f520f8be259a2de0220068a5c741358d4c34d72ab820e7791764efad86c4113988cb71ca323f31683105e273c037c02b4d4b56e7a2a341f9348180cbd671f73adc9767e050b58b99269b5fd696b071473e9d767918d99ef0e5e69859bc0a3133be92bf38edae5d8060cd5c13f2aa522d0389c3a5af934f81c46f83492c1ac6e856b2b1e3b17ea83a7dffbda5e8f4ce57e5c106c5c337ad286858af9ccf44417f2e0cfea2f196d89e078d9884fc176b02673d3295fc3849fbaf4829d7f310ca53a3861e8704765e8654e2b0274d6bf43152d13ddca60014067eb1d5589045ceed16df90a718260db6ee83662542c8c6fe47962d18758824b7f276dc3d94b6b8bc85bff1babe91b13604b8696078\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 3fe06a589140e2e037ca786111219bb545a189b506c2cb52376b6fee3d8c216b33578a92623f4852d2c82ff02db90b9266e5fd0301c8e156a44093206a8bf93c48022738a35b834dc025db456dfe003026aee1e7144f95db86d357dbc93d11ae9568ebd700fb577e9ffaff19f324cdc30332c0a680c47476564de727eccb1a974826bdb384a517d489901cc5f0afda3be84fad6a95435aa8cbd91b0cc5d707cb4656303541b69e70f9327c2ee061d96a223bb6e29b5851bcc345ad6e47feb0b86565706fa575fbf7aa4728d997023de295f669b34ef205feb24ebe07074b2ccd0fbfed7c3b543ba56875cf0addd47b8bf0375a5706684763dd7f7f0702d43934726a1d2600a668b6c4b170c85d0a4841661bd946b0c1ecfe801d1e366bf4432e756ecda05afecf29338edfa80677e3f21e54213f77c673786ba5cfee8ee800d651414d055d51edbbd2108afa1ee8f354ea7427ef772b31d12950c1359e9c6b65a1e2a2636efdc0cc6da8956ff84977c25cd67e31c88d27ba681626f25acff63b056f402f8f83090c5be0d51b6b9ebee8ba48ba88917b02058f4efdedd354c63063ca470036e3ef13da38c9462da836826d9472be5a6133c137f496b2337c9d470478800f67045cf9b1f5cb072847da6981f77d4e16f71181e90748c40c79df936e36ba4d4810cc81023591a82465f59e0b98f8dba0b0503b8bb9ec28919f0d89\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 8889564896395f4392a9ff76ebd1e0f5b3c5254c83fa7fd7bf614aeac559db65999171139bcd3c0fd6adcbbe7adfff9d8254ce2300d4ffc48ed00131243811677e8916cae0ff5752d75135fda0acd167b0e383f48e2cee184917d5f860c0bfc88a59d54587825f75db894de2e9f40bb3b168db171e8844d64add489ad839f47a63edd6382972d133d1d8887cf120a1dbf4cc3ebc0845ae85d6abc4ca82be90648ff4905e11e9a37137cff9400a0080e2d13babefbcd787a86b75772dd8461d5cd8a8f3c3f14b7b305ba6e51c765302981f0c3632a2860fcf61735396fa39bd407100cc1e8dfdfddfc0b87735b0ddefe96f2a2de97f168e41f2383c345ff93007f6fd505874f2c6cf2ed6f30ab6a2c8bffbbf6d3cf32ee716c85697db87f2f2b0b9cf65a48cc15187f5febd3b015b3339815beb3b02f418bbd3e7c6e9fec74374a1fb7ce9acef3b75292a3659b04f44062dae0980f6426dfb1ebe6d67c6cfb887f5fa3f9027ecf4936f3c0995acc540a4691cdd28909b3df8c48a4a27c9772763f98e7dc7d8a5497142aabf2c4c472ca397edf2fd1a74af576fbe1db292fdbd140d64a3c65173c0656619f5e5b3db0596a955bf017db34d849f29902f8a08544eb8aed66579084ba3aae9646d170bb76eeaaafa95f34295f2ce86b8bfff613644cf1ea061f7af8ee42df5d97a83a094d07219901d2e1ef26517364a03f031a3ad\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 81935470cfa189178b215635b35436bab84d880c42127d5bea48563d6d1e52cc4116d8ecb9dc9d30b82756eaf8981ccde25d4b3555e1e26691d92cec29103f7a514036ebb1d850b795ad662c9bd6c63b2dba32ef4889419b740d4cb38283feefd285041ea880319eea371a15e99dcd02761029b5709232f5df156594259cf6f63f882c22a3c427592ef86b0e4a7d0b13f772234fd2889c13b157c2da6a94c3e3807771059c970a3aa786b05d79c92a36607fda0c7c3b7279402543debcbf3639b3bae654f48b80f65eb9fcf5d4960d88b8906ebb84aca936b7a06e4db3be1bdef0fd16af1a3d0fe03203492a0357bc7e76eccfef7a2fc1edfc50aacd0d46bc7a28428b92f46e3d3a58af3a7f9e0d4c70c3ac240eedb878891a8f148b1e729604d943af03ed079787a7f67f830e9a77e7fa6e39fab006398e09483e6e848d14a95e902f2cb60252059d1cabf319bc463719132bec91c6e7bed2341455c16502d2bbd0851301f86e0674c9c62f54e6cc9bebc268a4a714320ba2d30e0dd7996720466a976d3c9e8a11e38f32050ed5e079875160e2c1b0f8d4a29a5e3f6d04db8f501b205e56f3375dbadbc77c4a48117532917f09575ebd5ac491eb1bacf1d157dce7465eccb7568b2d51a87ebd493fbc9275d5b253b05d7744921cdf5c274906137b3076002a2c10cd52cee21a17feb9e35c5ab3af3e0427207c206fe6a068ab\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 8eae919086dc6c634f495a45d86023caf497163b2f4b63ab9dbee8cc8c139e41d83c5cbd2c54b032f79f3bc37e93ed2c7a4b652014b1fe4b607bca3529aa160c84ec89910bae46ae4d6e8bdd384ae8a5a18a48721e0f59aa9b8394ff821dccb8e222e7e7a2a33e3f02a320301e2e7a7c315fa0bf9f9c676e6a4535c34b621ff8345ed2b7d5d35014610040a9b3f81340f4911e230f356b469c9c6035de42048a68d5f04681d85eb9c2891c6a57a29e8e64cae0b0404d4e374f3188caa210c4d1378f0012805d7b91972d085956f067791529fc0357dc30aeed5fd3bc5efad687e5e9ec50957ac809d683b02e5764a5d8434e5e12764672807e18198c225d346b406b4dc06b9164ba5f3ae719bd376643727d9061745a2e587718206d66b1648bb52090b224c175688ea8d50b43a1d08ffbb4248ea7f351799c7e50f2d490e466722ece2c4f88f89d2f96fb9aa9ba610ddfd6cfa7b7a9c375e95575ae51c5d6de43086fd0c0663ff88035c3adafb82469a77556a91d32a421e33338bb16195d19010b58d720688d172ea7d64fa50caa902bfdc7b78c7bec427031ae9e3f691edd91a90c86e2e86d00dcdde12076308e1fc4c910814b00d751fe2e44baf232c4934b58624c1da5bb51b0e8acfb454aeaae2f04be02e4e121cec2b980ad7c23d13698a88d1d545521c0624261fb0e97422bcf76f47d7c33ad63a8eb4e497502569a\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 9284f12053cab1f558770b0da4ac1122dac9f3ccc92992cdcf186b62557b265a72234cd443e39d5d2e1e88d4c2b3bf569ba8feeacb53d7f4100a505de9118cbd22d159ac00d2702fc37350780cf78a101d7447d82b6e0ccf9d901c58734cf9ce7b182c05315b31756a30c5e563da32224272523bf01291732ef390e90d0b16de359a944c8fc92ed9949e9bab4059424aef42a5ca7c28040f3c473c952c52827159eb125e2234fdd251c898746ff9bed99fa7cbb2894cedbcb3218526ea286da4e1420af5c9fe91fd4d557f81b69d36964121e5202599cddd4993cd8dfb82a48265771b3f940a82ff572e514f5eee9bb98f848a31e2d3f7271ac9b298ffcfd03857cd562e8a36daa26cac1f1dd173dbc4e4d5dda6f3c28e3aa8c8d54dca67091d304bbd3217e2c42bf13ae02867ab9da1d3d01bf196ec8be97da126cde6a0244673477e4f0c98651592e25ce1266995c7a41d41fca2e2213806394df9a7aef43a1d90609cae8511514702d890fb3230b8c22a34720435a547edee50bc5f78da62224ecc3335e900d8803aeac4296fc4a41d59806c811924bc2d4a6067dcf71ae24a6d7cea82597bd14a3149fdf718aad5f5a6b6f126436c0621fdac4297d646ad0e6f70d524a48e58988066694f3618e013825d03c19c75b9c9d9aca436424a3a9a58bdb92003749241661527a6878601970abc94767cbaf82ff3ddfec7478638\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 4db93239d2b04e8d6247a970797e21cda029a6986a4e62991fc489bb1036ad5ac9f5cacd7bb84584f0371c2781f81b64b8289c8c0bb1f00c42513bca88417ac838ec7dff9b6bdc59a4e3598454fce85bb1bde30db75ea83352358326386214dc1f0d584939cda6019ed6e4433bd6a45e3a7a27a15bf08b69b70346819fa1fad4ae11b1ac7d06834c70b1d25b0cd2f7815a0a00c692cb7d0fa1f4cb53448834fa26b344fe6e38560f48f6ac1cc170822b599dfeda6f3709a8d9ce62aa21d5e37f8348808d3b50159acf7e3cab7efb6a437001a596c17d31be3fc0f896b41091541f705d64541e84871d0136e251f8d31d24fdd101672940efe26b433ca084ee48a7d60c5f4afc1bc60b02d0fd1ea25a77e976b691578012f251f542e60b784afb61f3fc988fce74b9ca5be9cbd9657a7d88d68aa9544ffa2198bf5fea0ecaabd8752afe5c51819dadc5c728c2ab1f6f24d474bfdbbd252856c4b7588cca27801c61df0afef9b892acb53842b0656c91f4445e50f395d4bbcfaba3146fd6631b668f4f5c1897bd0a12f45f3d03aed84a26f44ce2ad7facc05c7035e675b0411a7ccc6450bcac760def267f79bf65b033f6b807ba0153398b5cd5833688ca57ec08b48fddfb6cbe4ba4ab293865c67bab953a4b9883f8b03a5441efa492b4d8f2b7d1a216d057feda7a9f388d3bcb0a28a6fb082ec632bf88cb411da33898aa9b9a\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 29583aac29536dd4b6a21da5a44e1e2b6e755a45c67f828156e1af72c7b7138374e5110ec7e3d7385f3791c5198d16cb5c78fc6f0291716ed818ec6b6d0a8cd4a95e3712449f0e6b6aee58b75413aa6cb09659378fe2a43ec789310182cd7eba7be97bf2b38386508116c8d693ad3f49a825e1cc0f9f692e1c9e955a92d4988408b2e940ea4539a3579c55a1cfe91d1019c996cad449ee8d95cef7d84ea27fd992532db562cb5d3dc30509c9ad0ffc624aa8ead95ce75d914ddb89f5a6ad950323fcf94830744e9af3681eed79a3b1d88252b46ad3ebe55263c003f4efcb25e17b97dc7a3c2d5dd9c1b1b8352dd3ac3665172fad40d9a7e9a9a5b185d2c",
     "b383cbbfb0bbae7c65e186479da5f850f466391ead2670c7512c3a24a35998283520827122e3577f3b3e8fccddfac3cb30f56e1f69f9e3c8fd503cd3daa2492b1d6adec372e11346ac8e6c7470dc31336cc9fa256634e927448a8eb7b36c49486d2f24123be03d021bd6058a0b891c06a50dbde6d8106de893c046a98d8ebc3ff0dfab1cbad8188c0e411b619bb1d4bac1da82093804e81621306cc06b34ddab2a944e1ca809a63c5ebef662ba409d20f1c980a311ef4d46a0d28921faa54d1d48a6f47b06292ccb4deb9dca5af89d789101caed8b7745c5439812c980c03a8a103fecb3be579c450ff6dd5920ee4fb7144f243aec7192c4d4a623730b01cd323a381\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = a0eef89abaf87828a4359fdaf9ad21419045568dde6cb1c4975fa744cbec96a60e2752acd8b05785f34b9ea28f825959422f50e2326234ff6df151617f00274446ceb3eba0ad79476ab70b1efb932bad03236af106d7c5011cfb4fd9b19ea26393651eef432422ac892f6905f4e1ef1f6c8da0c57289e93f580ece8bbbad8ed8892a5481685a8ceedabe4944bb8bf3022cdf1d004be65ab2bb24e4b2b1495abf0f0b162cf02b949d431fe6f629c9a80388876012e1fde67fdd454b306c42899b92665c7ce20c3c005a0bdc49eb32a482b410fb4d10918d7c4bd2ec7118980d88d567883117313a7b2c49d482686d8f02659a2801c4cc237dd1a792f2b70407859cac860263f05854d96fd588f0d8e66bfe4b04309b8869693e95f08ce4cf3662fb03b172661c56d8033563a883a0933fab91ad2a833590aefe1f0152472582c54a533d77c232155a70b628dedc6898675e368b84aa1b757c40baa07ab95c4a450b7097205fe751e415ab68e5e579a0e5de2bb9eea9fadf5a7b53e969ba85b023d8f0c6d749571baa2c531ed105531078de99aa935266d04eb82699958047ec946c63384d431076556a7e6714a039306420c483ef52f0ac7609b2a2754b31e96c9d2cf72357b8ca5c7a683b95ff221892058b1809df67ad955ae0852460374176f4a042b31545146685339e928136ce173aefd8d6f5066b3777ccaa5e5fe312d7\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 5061876f8bdda06553a4f653c4f0a96a96d8f823c9484a6c0c21ca0344c6f9d15086265fda4f6f14573127dc073631fb91ffe0082f926d696f974b22f4f9c899dbf16feb967ab9c66556a4e4aacde7df73d4c789ef2eeafc23dd06d363ce3f70da60283510512eabbd43cd89b7c014240c35266b87d860466358840f85ae91ff3ae033c7456c74f5f425c4371ca76bca86e2a9639f9901780b1ce20f652644cc504c2497204fa6b51759eb932f4e7099701718476a8d2cfcbf95d70845d7c0ab4a264cd023bd5fafd5d3d0c5500b17a38d0a85593e042685b6074f4737ca181ce3f58f81d2b29e934d44c665713733740832079c3888cee12a5435372a32df434be0c03698d2e2503adc889be76619f4076e02b3517e75a94b7bfb58faa31e660682e8964aec6abad3aade06f376a9ac9d3266ef1e4e51078c446ab6c1e1904e5a1c5b121da4767d53e60f9cc1ad40822ec20c19cb3cffc61fa8f211a58c57b2f79f4131289f0354eddab2bbaa01962a25fa19338b2e546ec96054013cc3c2688464ac77d89fd3106621080266357eeff963c2b0244599d4a594b69c3eb4458187a869544522031235c6a8f3ddaad154c15df7380b8da5ba06afbe9d5c4fc1fdee76b0e90483899d564eaf23c5df73764d4af52e10aa7891d82f26285ef441a785ba0915feb6df082044bfa6fb6fcb2a3a9bb053afea9c015b9188a4123f1038\nlabel = \nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 370fb94a46f8feaf018d0f2b9690189bdb29942522166645d0bb7921bc837daac9cd1bfd6ec6f67e4e88a7ff996932c9456314f2aefd01d81c9246696a74f0818a1f05b656ed5804bd99f2a9149277f8e5246e0f9724ccd5f1a0dc637687389bf5540d4873b535c2cf6e9c491b5caa3bbb2da4e71f1c27b7681a1f03b8639139ced480875abdaebf627989ecbcda9373d71c431513b8e937c4bb259db0e5bc64bd42da435ee9cf5f700f9587f32796e97eb5f60969c443efbd3c92f310a0005eadf2301bbf6d5411f7800603b53b6f7bab1072f9e6af0a01e44fb8c9677ff655de1a020b8a9854084c185179b49695f7ada1ca5300f1c8c61cf616ad7c8ef8b8f0250411cefbffad9fddec87dcc9e991ca5ce1f16049327704a73e2d46e6703b40c70e569ef52f0841e89d28da9c743a71fc17e3c23cd720ab7ef22a25d068e0f205a708fafee581787156f6804076ce20546c3dbf2609c9a70f7ea85915a8d0b7103daece1017fae3eb397e7f8b4c9d2ed708c97c9d7e34de437ddf5db42854ccbeff8be2557548bb1e6b1c443fd2a726e36d7ecad07d7ffa4f304dd374180a7456f2947212cb8a767a9241c537211982a9d42c67c5f9717eb6c05951f09a5c40c9d4d4bf6675ba071652912dca387602006b99455aa66dc45a170954700604296cc45204f89d5f875f54751f48b7b10984ac60cc5a46b55aac7443e91bc3dc\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = 48a28128571fee7bd47d4e6645181e9bd4fda711b9a85e22ea31ee3668c2c4dd7f8f2e62bc155f642fc37c0f4d8327d06190242d9b10cfdfe70896e948a0272dc93c48a9ac7ea5211f6938e8c969c88ae3564f27a190b8fd230ec39ccb3f0a8aab83af20906b39a93bdc8d39cb09edc2f393cc3bf761ccb6a742b9cf6e7586a22f885ce9a9d673dfedbe4e54ea710c446a5489d5cee956b781013c83dfdd92d7af84b909b7bd4fb92e32d374398b7bc9f7fe145e3930bce6f600546b7e645b085a213200bfb1ddfb1d52a3abadaff9565416e526a2e065f8de084e2b729db9da4b413894a7bf36a50418872b64c65fcf92e83537f101bf9190b21bb5f16f65bfb50004139d36b78814adcf269cdb2c2b7dd19e2b380ea83b2af202cd2245f857abb0ac9208c009554772ba5bdb1b2ef2a3889c077e3c5641b223a04cdeec295ce6e065478a9f26ced392fe29b971b15ce35389e68fe5ac48c00750bb26d3f79bd7cf24273c5c232e7e3569f6a315b5a570cf6265946b6a006e4045b97da36792ead0677dc864c71903234ac1471ec2bb3faed265e2cf6159822b7cddeab67897bc723d6db29210e46b4da283d6f66330c035b67eb21f179f1828272b2a114bd72d7a5039eb63b9865c983f700070a8753766041489b36d6c66ff3f552f0f766bbcdcb9f58a4eeba194ef89e0ec68f47b93de49bc3006196faa6298cc7c7f1099\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = 5c8b5881da1aca7e3842d9bc22c5af2dffd0d357380d7e95695af13a2521084f373dc2827b999094fa8dbaa85276b97cc95be2d0923503072533914032c696ab44172520a7f0ef999a7c9140da1facb71b44ff0b09c9e64fa3eb584aea20f1df0d1ea8f816b0bc4be4d59c12f586fe4811d84f9c3f0509d6c729e8718e23f261cc35ed38387e5ded781635738149b237f3c7e736a365d656175806cef25f50cb61271b4a0627e5c42c46398aa146e29cc27961851543196416766dcbadb41ff39c0205dcc43679391c699ad8f1b7202a17c7c6ab98a5edd3b04012546919d924f8081d2ae6b259a17e0a2f50cad28d3e4eed4a0d7f922cc5792a26ef2987ed8ad6a8b6dc3c5d05626854ff47ee4ee013ac85cf817833b43e1a856b8c3974766702c14e99e4e4b34e4babc99744c0a621820c234e2f6a3693feeab4c7db39744a2f039bb7e6269315861644474fb7586515bf340c764af09a408618bdfd79a944f14496b0d306f72e9540d650ac72079be5a90ba9ff80df176e8f762847be5cbeb391b7234eb1c37426ee6288d584af02b1529cd2cdff838523c9dcacfd7dd0941abe5b9f3868491d6159b426631bba86846321133bbefdd1c720a5f250c18678bed4cc4b1304b37abe5e0c7ebc79e85f615818cb2014945c519b9291331dc11cfed6a40258c8d547c0442a69d6dffc75b529e5fdad3aaccd820e89db767f91b9\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 256e3457626f1b5bb2cc1f82d7abcf966f487ea2227d164f5d9d60c688dae539988cc75a0f670e8c66abd77ea06101a9d78fabff1c5023114eb3832d561b48e99c977f351a4125af9d0b5210ed1473f07eddd6edd8905dc21189e23a1502cbefdf184534d64c257b896c631d6b3e17672170278af5850663207ac60f4da2151cc13939c126801477b181131d6857be3c31721ba2da42e7146ba1c2f3033072935546a6ffd833c4e8d5a733c1b1cf5854ade160c697e8f8d794bd6330af3a2268e31e432841910bfceac4d7c2300d942739c03a1234ce2195c28d4f6ec3b01c4ded49f811aad03021a7a7fcec212d150ed25cca815c461acc520bdc60d22df38f23a4e7fe25572ef55b1fb8a61ca50dd80a16e9ed0faaa74e7b502c81eb5e84e35f30e1b286e957195ea8c5b0326e5c45849ebe4a920dfa623a0295248d5338e888b7a47eb9730224c1f86663ba3bbef1aba30e9ed91a49d6abda5e0c1c5235767efef235585d81c789f7d83f3c42bbff9f327fecccabb5e35a070a6deba53bff749450c5883ccb2cb5a5545163df34badfe0ccba4b962ddaaa282d83f755f5b1492dedfb8c85c87e387e2855ac2ac6e669c981845f6feb77e986bc84bc16405a44fe810d9e2eae4af98352f93039a1495e4cc85522016337f75ddc3af6a2a4a5c89c8978c4d1d7c21bf16d4631c6406bb317160306aaaddcffca48adff7afbe4\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding",
     "\n\n# tcId = 16\n# first byte of ps modified\nct = 8324d6f1ee40adbb9d76a16187d9d28aa2bb90202d7ef7bd7ba2d01cab0915fe4789aaba1aec37fac4dc16d4b7dae25650daea9d26cb1bfb2a34b622943f6e3fd01cf3479718b906afc21801acaf43d8bd91b7c2bf688923609ffddc7043677e906675fa06701e0ce610041a687aa5f001a212896607d19574280acec0780c76a8d5e9ec1b327c9190527a5f1c13a0326c138e0c7079a83bfecf601aef604e606b70cef7bdf1782c0dda68c917095c1a027694c5448c6653c1074ac923eed2f06fc96810b353925f33c48e509aafad75195f06332c8a0c4d05010d2a14a1b00b3f474a35897fb12f61d4caf772076db8a8f4fee8205f7b6f0ce12200ccd45ef177481def6f74d4c4e744812eb2e4240dbe0095c8a95f060ddbbd69f6a1b376558081c24f647cdeaf242a153b5e5ea36efd7dd42a6280f1811035a02aebe53b95f847ade834fffd070294cd8ba8d7cd753e0506d900ea1e76279ff293f1ebd5d973fa9da26090aaba7117237c33b08b9ed345672bd0147f78e2c9ec9b14e4825cce84dc2f39284e25f85b11939ef7f0ebb50c058597d054fdbffd8128f8f5822652b1c75e38d32f35d699b21d5a73f9ec5e887e139b061f24052974f08f36213c5c6250aded6afa138ca53c0328b0692403cbe3ed569304a891268123660cac7080d92fcf4b2965159c8de01cca170ecea328326c393bf2d118efbc50f7bd227c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 17\n# ps terminated by 0xff\nct = b91a1ef2ec1a83116dfaee41a62d3813d42ad5e092e3d68b6b790a6213b322b08f7672e85698de1e9d650399ec6cf9161fb3c57d63c623426ed663f2add206630f5fcbdbc3111078b804b84bbb7c9da6c1e90edd8a879f675ae49d7cbe4d31c4b5c1b8918693844b85f45a981f980c8e15c407dadf7ebe288f6487b6a85cfb5a4699ac0295a003fd58f06d428b56b430496e6e738c18578b846cd957f592f2b55230a27faa2c3d43dbd9ebc41a97f1120bd0e0a7e71ceae24770933a5cee41dcb424756c9934f0f873bacaeba7f5096087a1fa9b320facd6df2d390bd7f5a1c8ef3b92ab179738023590fd962278905e54028a04f4c6537e4cced2c9f6ff8bce8cd8ba1b2ed7f317b2eb9b6abe079750ec65e10579fd2db0e8405d5dd1dc597eb19888de90efb0b982ea435db8697fccd7b77a2090b1f4db9116c59f3ce1b59309b22493c79d48df153cab3a7164ed686812ae714c2ba5faadf874748928b036967310ab1d3b17aa4bea2d663cb7325dd3c877886aa2136271d3fe514d78629cd12f294095a768dddbdbfe241ed8d1e32e7c2b1c1dfd061ad38a84708e4fac5611a973a66f0e3354cc73117217ff4263abcebf7c7465fa1f74e2ef7d850ca3d3e9893e46741a7e46da50c9c93f258f9c62ff71b83b03ca1a6e98934519e2fb6023241f8d09b8d78708462ff61f43bed939554fdc306a81051aecf7990bb9b5a7\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 18\n# ps is all zero\nct = 1d604ba6149ecca0f7e06492035e54d8b4b89419b39ae9aa2560d00c46de8a25daf8dcee5fb9f5aa6b00d36f080904bb41c72be319b3007d05d1a2fd97519e3acc0cd8d6f492991b6a2deceb16839f2c541255d026ed575f4cbc2bd83ee3c16d7746996c887e8c456242ffc0a8e4730778590711a998c081f2321c03593e85933127012d86dd0e5bf30d8433057e4880da06de4cee2cef6b3f8a7d93703cc0fbb6591464a0bac813c2a91c64c5508a1d7716ddf2b75575446ea87f8b94a8db97c95b8b977cdec73ac3ac3f9fc2be746a0b3ec323fc241ac2e22e9f5a52b62efe8a96de6b18c28df18013c091207c1029195b4137940a38aab6d59bf53dea5de16c977fe96d4ac615dcc87e86c044ce97a40324e325ac7660fae8614c56f86ba270bcdb766f5598771aa4fd149259353d752dca72afda5c86b72e2ce2f98a5478c800ae5a21e0d84cc1b1ad15355ad0be194c19181d984768738c3c7872ff33e2ae6f57b282ee6f9987cad599b0c510cced1a31793916a26e354079ba5bf9077720ba336bd98a275844136a433ba7e039c960abcef4b13c322695182002c1a39b4ab04b1994c7257e90fce4dd4681dea84044f6ab11df936ac8af219b72f17588abbe9080d67a0568e4b41d6869f8a1368188ebdf8d4c95300de029b3caa43ac7a08b2dda8a9aa3e6ad3b35a8b8aff9ff4c47b28dc35d06919a9be45833c107fd\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 19\n# ps replaced by 0xff's\nct = 96104d3365a60a8b4e6884fb18755e6d74fb4c114dd3847681d61303ef4deab05d2e34c44ebc6463ca72d641d9783cc4c5bfd79063f7dcfa75531e6c238b1ea1a85482eae2a8db6c7d25963e3bfacea905ffb37a9837707d5820eaead9b6958ac017d2e8ba7e0b1419780caa8bcd341ba025285798d2bc389ce095978243d48f94a2985966a940028d71083d75ff3c1509ea04af0f58d55b45982e70389aeb26ec44c9008df049ddf184bf0130e5671ede3b36836763eecb90eb544f6268c0dd87ed68f421210ae4efbc8c9601533f18cef68da370c1b0960a95d054cb4cab186595d20c18a409403f20ec25df0f928b737e369656fb683eea7a87e54c46fcf1a06ea3f2df95570b95ac39194c9f7d51ae98b295546f7b18f8234b95c99a6e9f37f99c638971e868b389660e95c12ead98f8526e2190fa132f7ddfa58b987ae9f8150d83477bb40d96f959483aee8f8b5d51b9f1df3e4e309db43c83795bf8a08db5d3ae0dea4370f5dfebebc5952eb6d4aacb4fbd3629cce8adb205225aa1cc7c8934e119f1b338151e545722c27adc368880936c56eff68c14ccea07f5c328d5a22e298a3a681c84d7ed4b7c5f78609b63822a327ad68922d0885810f797b27fee06205450b897fdb36c9c6b1c6a8f095b6ad15118c6424581918f3050f86a329821dcdd1c144cbaba537a25ee0fc4ffd90205e223eb7030c6d55e9ecfab73\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 20\n# seed is all 0\nct = 9e3b1e800104dfd28dcd147101435ea933562abff19d63aafc2bfc854596809842a68cb42f1110626176ab91a03bffd82b2290d05ff163bceb387601be00f5899a165f697b152b2812774910a5e07269c3266e5ad61957ff8e56cbf7fd896a0fcf14e154e50e3f795e081d11ddf10d8edd6263eb3e0f15fa54b0f16a77da6ab159b6ee22d74177d8ae5b05215c9544269d0f7a8013baab60516f2c7fdf631db996b5f48797015db8f2141a7f10beb71e68708e964e3457a48d6da6bded0525e6bbe10507aa87bf486199ffb52c67df477f9d86d307d8dad384b854939928e2d962f7c7cd6d309027a3d3689c26b7da4a648fbf3854f05fcc4658ffb3d9c35ded1169165bbd750c230a494f602b2a271425989f2a7d175bb24c0095f17b0de0d9e7ca854c80aa870edc6a02e17b1cd5a31a3bf3c74c2c18513bbe7ca1f6888754f35e2108ee1a2751d88dbc17dc1f4856eb8998151da990960f932f37c0d77aa44c25b5fe6f92c288f68ec83b2e8a453d608b2aab73224bdcdc3a4c46303c42106fbf5054c4f201cb96052c919e1c0eba7b7a88acdf38d35c6a998cd6d81d04665416959591662927bdf801f0de837ec3f9ea86d2ce82b07310bd4c326d757e1a56476f2ca7f5fad65a91f2b309ac1bb39c44737deca8203feb6fb18ae93ae546d7a23f6c908cb0ea4ba0183a25120f44659a112939745352e9ed922f478aa6a4\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 21\n# seed is all 1\nct = 576983b7901bd02be7e1ae3261de56e187b6acb5c3b891797fdfe324bdb249e1960d27b5498ed2ef4039391a2678306c8245b3fb59c3d9a55e62ec37f83df7cfa13a29cdeb4a5f9a03673eddc3d0faba2ee005b04679b7b476b1f7f9f841948a7983c977eb5319e6e667215b70ea465c5cf4d53ab87a3784bc30cde5b84cfc5f483d13eb3747364847668cf566a1992dac542f451274e31b00f21255e750022051d39983d77ea0b08e599e24caad762fce8f4244baa51dbc8b61c2d81ac1909fbc6144576efe1a60ea7176bf45f4091e32b37607477b20b721ee8e4492360164c98cd3b671dbed37e8c6692af81c566dc6e7d614932bf91758affa7e71fb8d5cebd71ee0165c0cf5a62a672670963a0afe16b726b4618d7ae0287a31c442edcb5e3920d363b230a027a0479578fa36c7481b901fba6087f89e6d5b18f8b80f503db8da0c67f71b7882c92da575d640a04a87d418d19857f4073429649f149a87406048a181c9d0e29a63b207e0a14cf6e40b9735e5e71522a779d27e767ace40ba92921e1b20cef245dfd04600a9d7ce98c00577dbb3afc36d0f6be77e493cab881a74522e2899f97777c943255852e3a61bcd69e375ac0939c37d38a4c5be0ed2ba60a5fb715e56c953865c17085925389dc7eda944d8eca151607ff7da2187a299d8bb5a52741593c451696ce684e066eb91137f6d2432db760fc2ee11306c\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 22\n# First byte is 1\nct = 9de5d8e7e5d4ca1a214e903fda56a012e739d704e4b910681d6f347198b1af54555fb28f1e4e071154f75374e09e4184f503d31b45358d72c4f1404501f87fcc4d124eb4573e52c30140e49aa6219e74f3aacf4ffb2e739bb96ec12e492e2a5bf490697b7a3b9f7fd3daf2f3bbdcc5c032441ff1cff63c70c3c27a7162afff864dc8ad1404ceb6fdc058222db8b69b1e4481f0044353d73b8e017a6a103030ac8d1ea2d0ec43c650be4fb8a410c4bc7ae813a06f6e3a393e5eb7272c52d1dac55a1834e1f3f6299573abd8dfda92c65071fe11be6edc0ce2561dbac5da100c4edfac2ebe9ea8756762d479a55132b0a922d7d405a301d31ec971581ae5358c435804f95ebec6286e7f7972a7e082f7172f66e5c118073a719e1a872665ea898a0a50c3d0bdf81b6cb1e890da4fbd8a9e45d78194dc687a5a91664003727689f7fb080d872580c6228601f61cbbff236caf521b76e527f5bd180bddc13a823a0ce7c5972466523de8cb6626761453d218170a37976e68113ad6294dc19ff06210118210c75d4cf2657f04ea9d79177474651044795bdfdf3c6959d9fc5c11d569f978679b7b81f9fedbf012dbf7b9b0652cee90c9059c98d7b24286304f7f41be1ab2a26931715c150de73775de58c2f12fa2fa353210ee1d8cb0f8dea22e9ed1d19df5f8dd349c181ad9bf5b9ffa5938f4b0f810feee4cd34356fc7251f5fea3\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 23\n# m is 0\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# prepended bytes to ciphertext\nct = 00008889564896395f4392a9ff76ebd1e0f5b3c5254c83fa7fd7bf614aeac559db65999171139bcd3c0fd6adcbbe7adfff9d8254ce2300d4ffc48ed00131243811677e8916cae0ff5752d75135fda0acd167b0e383f48e2cee184917d5f860c0bfc88a59d54587825f75db894de2e9f40bb3b168db171e8844d64add489ad839f47a63edd6382972d133d1d8887cf120a1dbf4cc3ebc0845ae85d6abc4ca82be90648ff4905e11e9a37137cff9400a0080e2d13babefbcd787a86b75772dd8461d5cd8a8f3c3f14b7b305ba6e51c765302981f0c3632a2860fcf61735396fa39bd407100cc1e8dfdfddfc0b87735b0ddefe96f2a2de97f168e41f2383c345ff93007f6fd505874f2c6cf2ed6f30ab6a2c8bffbbf6d3cf32ee716c85697db87f2f2b0b9cf65a48cc15187f5febd3b015b3339815beb3b02f418bbd3e7c6e9fec74374a1fb7ce9acef3b75292a3659b04f44062dae0980f6426dfb1ebe6d67c6cfb887f5fa3f9027ecf4936f3c0995acc540a4691cdd28909b3df8c48a4a27c9772763f98e7dc7d8a5497142aabf2c4c472ca397edf2fd1a74af576fbe1db292fdbd140d64a3c65173c0656619f5e5b3db0596a955bf017db34d849f29902f8a08544eb8aed66579084ba3aae9646d170bb76eeaaafa95f34295f2ce86b8bfff613644cf1ea061f7af8ee42df5d97a83a094d07219901d2e1ef26517364a03f031a3ad\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# appended bytes to ciphertext\nct = 8889564896395f4392a9ff76ebd1e0f5b3c5254c83fa7fd7bf614aeac559db65999171139bcd3c0fd6adcbbe7adfff9d8254ce2300d4ffc48ed00131243811677e8916cae0ff5752d75135fda0acd167b0e383f48e2cee184917d5f860c0bfc88a59d54587825f75db894de2e9f40bb3b168db171e8844d64add489ad839f47a63edd6382972d133d1d8887cf120a1dbf4cc3ebc0845ae85d6abc4ca82be90648ff4905e11e9a37137cff9400a0080e2d13babefbcd787a86b75772dd8461d5cd8a8f3c3f14b7b305ba6e51c765302981f0c3632a2860fcf61735396fa39bd407100cc1e8dfdfddfc0b87735b0ddefe96f2a2de97f168e41f2383c345ff93007f6fd505874f2c6cf2ed6f30ab6a2c8bffbbf6d3cf32ee716c85697db87f2f2b0b9cf65a48cc15187f5febd3b015b3339815beb3b02f418bbd3e7c6e9fec74374a1fb7ce9acef3b75292a3659b04f44062dae0980f6426dfb1ebe6d67c6cfb887f5fa3f9027ecf4936f3c0995acc540a4691cdd28909b3df8c48a4a27c9772763f98e7dc7d8a5497142aabf2c4c472ca397edf2fd1a74af576fbe1db292fdbd140d64a3c65173c0656619f5e5b3db0596a955bf017db34d849f29902f8a08544eb8aed66579084ba3aae9646d170bb76eeaaafa95f34295f2ce86b8bfff613644cf1ea061f7af8ee42df5d97a83a094d07219901d2e1ef26517364a03f031a3ad0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# truncated ciphertext\nct = 89564896395f4392a9ff76ebd1e0f5b3c5254c83fa7fd7bf614aeac559db65999171139bcd3c0fd6adcbbe7adfff9d8254ce2300d4ffc48ed00131243811677e8916cae0ff5752d75135fda0acd167b0e383f48e2cee184917d5f860c0bfc88a59d54587825f75db894de2e9f40bb3b168db171e8844d64add489ad839f47a63edd6382972d133d1d8887cf120a1dbf4cc3ebc0845ae85d6abc4ca82be90648ff4905e11e9a37137cff9400a0080e2d13babefbcd787a86b75772dd8461d5cd8a8f3c3f14b7b305ba6e51c765302981f0c3632a2860fcf61735396fa39bd407100cc1e8dfdfddfc0b87735b0ddefe96f2a2de97f168e41f2383c345ff93007f6fd505874f2c6cf2ed6f30ab6a2c8bffbbf6d3cf32ee716c85697db87f2f2b0b9cf65a48cc15187f5febd3b015b3339815beb3b02f418bbd3e7c6e9fec74374a1fb7ce9acef3b75292a3659b04f44062dae0980f6426dfb1ebe6d67c6cfb887f5fa3f9027ecf4936f3c0995acc540a4691cdd28909b3df8c48a4a27c9772763f98e7dc7d8a5497142aabf2c4c472ca397edf2fd1a74af576fbe1db292fdbd140d64a3c65173c0656619f5e5b3db0596a955bf017db34d849f29902f8a08544eb8aed66579084ba3aae9646d170bb76eeaaafa95f34295f2ce86b8bfff613644cf1ea061f7af8ee42df5d97a83a094d07219901d2e1ef26517364a03f031a3ad\nlabel = \nmsg = 313233343030\nresult = invalid\n\n",
 };
-static const size_t kLen152 = 48491;
+static const size_t kLen168 = 48491;
 
-static const char *kData152[] = {
+static const char *kData168[] = {
     "# Imported from Wycheproof's rsa_oaep_4096_sha512_mgf1sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 7bb0b14b4fa435505b69876e65a3a3f8892d61dda53709f4257aed4c8aa91f2351cca74cda1989c898c88e4a4dc60c583fe2e5f73852933bb13942bef04b4af985f8e56fec2d282ed9ce56f27e452bfdc4ff6e7295d95251c264a36743c14fce78a2f4ac6bf8ba0a8ac5f88c82524a1610abe7548b7f6a97bc744473ded26370bff86f966885ea31787b058197ab58830ea477fb600bcab4e2f133a613f9f125319d272ea5ea323fbea830ee146725a86133c4167c63ef899edebd2f91769329181325b5748a1146407901a8d8bf66da94dea20e64dd3c12ad7251df719dddf3fe882b6a22a30ad1061853f748dd83a72839adbd885710cff95d554c1bcf043dbb3feef19d498e7d8db5caed36bd0d44470fe7d7d1a1b0eb4c391a0736bbfe04846ac98d6243a4e3e58b57549ff7f54c92f103b33c9db04fbc6b36fdf5191567a79bb35a0be94a45480cfc28d377be27da9c2c3cc0bb2a4e910ae44233305af6a87387aab762c63d969714be53c0b8a26bd20cd63761b373b815330eb92a1fa7e6ab827276335dfec94146548d073ec828f3793a84cafa12126196a33f5fa2f4f2f6470093e99b2b2d91f2ff9240580965480d56c74be39bf42408a0e41ef60dc080898ce3eb530d87b4da4673977055e83d6504a89d60fb2f49703936a2fb391fdc39d59608d500870511b458c9e45e53398db152d3871f18d61b9afa4435c9]\n[e = 010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3]\n[privateKeyPkcs8 = 30820943020100300d06092a864886f70d01010105000482092d308209290201000282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001028202007bb0b14b4fa435505b69876e65a3a3f8892d61dda53709f4257aed4c8aa91f2351cca74cda1989c898c88e4a4dc60c583fe2e5f73852933bb13942bef04b4af985f8e56fec2d282ed9ce56f27e452bfdc4ff6e7295d95251c264a36743c14fce78a2f4ac6bf8ba0a8ac5f88c82524a1610abe7548b7f6a97bc744473ded26370bff86f966885ea31787b058197ab58830ea477fb600bcab4e2f133a613f9f125319d272ea5ea323fbea830ee146725a86133c4167c63ef899edebd2f91769329181325b5748a1146407901a8d8bf66da94dea20e64dd3c12ad7251df719dddf3fe882b6a22a30ad1061853f748dd83a72839adbd885710cff95d554c1bcf043dbb3feef19d498e7d8db5caed36bd0d44470fe7d7d1a1b0eb4c391a0736bbfe04846ac98d6243a4e3e58b57549ff7f54c92f103b33c9db04fbc6b36fdf5191567a79bb35a0be94a45480cfc28d377be27da9c2c3cc0bb2a4e910ae44233305af6a87387aab762c63d969714be53c0b8a26bd20cd63761b373b815330eb92a1fa7e6ab827276335dfec94146548d073ec828f3793a84cafa12126196a33f5fa2f4f2f6470093e99b2b2d91f2ff9240580965480d56c74be39bf42408a0e41ef60dc080898ce3eb530d87b4da4673977055e83d6504a89d60fb2f49703936a2fb391fdc39d59608d500870511b458c9e45e53398db152d3871f18d61b9afa4435c90282010100e97acd5f64c460b2cd51cbd70af5b4caa2882bf6033a92a23ed80f039e8a32c8a4c483f94ee1bb89c1dc1f6d04360a1c3f654251ad72eb39cccbfc38b072054bb0f21b9d516ef272e7cf86f8a8f838eba829e7fe9d803d469a1810fc5b37476333ddfc0cb6f00e9967970b4e474e04373f8dc92df50fa155e3139bfebf4e1cd274705551f2e9022029bea4b86664633d13fd90ebdd0b72d95a6508b6b4354e64b187fd81d21a0b1e4a853c27df11d7fe6c8953cff6344f50ebaed2513dc03761e8877c71ffa8005331043027b8dfdba97cae037fd5d1fda1f145a200c0d20f8dccd62e5c489eea8ae827910d3f48bddf0b18dc3089069f96d800de47036859550282010100dd1abc951ff1474ebfb70807b160b110b1eccef429c8fc8535ab0aa98376a82d3d33af906fb0395750b9aaccd8723cf73a8c3a6ad5c3a0929178ac55e1bd1ba1bf5da4f7698dbf09e87c84c45ecbbe8f12d3ed1091bc470eb2c733c31f8d27eba9718ee78db887385bff6b67950b79524482c50daead4db0f5676e4b92875b5be383ab1cd75e1cadb59cfb5794c17220154aca808f733a636d28c016d9843940bf44bb15ed191f53449b1651b79554c23e006a56dc0232cca209bf2d3c12cbbc0ed8b3110aabd365b603ea8cdf15e8b9ac781155f92f39dbf9749f70df003195a6bb169ea0e0d69eb3a18ce8fbcac9be3c710e797acb5c05a399c2f102947c870282010062f25622fd53741f927ffdc10eb5fe7e79cef7c274afd800c65d4e4f9c5ab916eb2d15390cc301756a20dd7897f646e69dbf4e11cb4e0e7e1a5ac0734de3a476e570555fa069427a8bdf19363c75a5b9c934a94af078ae7f4342bbc016f02062dc5251451a2a3625b10f040d928e6f9ef262264641baf406b00b596ae6ac35eec2c5f082a04d3b476229972946cb787b2403abed296a76abc2715af602fd2c51e422dbbeaec9b6b889a0595414673d806782f37008c9366bf6d5c9f000197bdf146a86c4d131e3a15dfe8661ef297fb01e54a8cafe54d6065177cf263e91476232d2fa26c5e80342070ced9e0d99c84dc4282ef8aab991dc9d8210b14bb267590282010100b83b9f0763265894758abd562ba6b5e3835e1ed3b43d94ac2a9beab674a45a5dd7b14988c087c63fcb33e9ede62cca3ff6b901b4238a6e31b2a52a742534bde178e33ea22981c2bd2ecb1295cda757913fcef6a9e7c54a302527772a0f103f434e5d21063040a1eb843cbff1ff6f20183c9dfa33fc68cb63b81806ff518917c6e93cbd47baece0589e0bc022aa00c66795564c85f301c095384fcc3f3ddfbf15044af0d8c4473aa2d777a29154b74978d0d0e7ca9867fc8c263898e3c83aa12881f66ebeb4759820181a0b46765c7b1ebb67108ae2a7473ed40d290d93c3458dbcf00759061452c0ca4cc26d1fe149590a63e9fbaf25e3f78eea8054f22167e10282010100c301f6bbe5fb5693f665b26d1a61e1de87e38950a5825270ee68ea5a5667e11a3aed28b2266768d1a3db3437dbda681ac8294dd50ad0b4bc5cee5694831b8df7354695335740b9b7dae5f7881536da6a6b2ac4308a0420ad6e99cb779a6338f5012986b1c1c889444d90585fb0dac995ad6e93af7eac717c643c4b8e7023cf57cfe284ca911d6dc3132b08e17f4e8759af42b43ac929c0259c3a1d5e5f7c4b247e2f6461aeff8577aedc710d6d2d56d943c211e47467421539dfc2700663c4068031b695e487ae6910ecb9c547cbfe12cc6f45b658e2c6f9f8fbe805304194a9d1d9c6d599c5ac5c9ee5fa78c8a4583218f7dc8f4c8d3adf275eec0e0941fa69]\n[sha = SHA-512]\n\n# tcId = 1\nct = 8e615a3b27fae31bbcb6abbd713e54498b38143c5a740eb326cce75e2b9df42b6454dcb465873b831d3c18c4a0e4d941ebc49722402aa05498b34a7fa56a74774adada8c9c3af19386da29c191816117488a37b9899d135da5e8afa8e2b76a87caed1b050b8289d110922ca9b19ed932be12c92b36d36ee77ae9803fa8bea86cf8287954fb0fd69a0cf9809b686bac0c0035d8ed0bd80dc2c5020b6c6afeae2d7998373d551ae3a868a06854eec8fe07c8dc61408676ab2c21c251c5877bc31cb570724bdda76cfe2b055d5a27d1b3961518ac88afd3a041e2d21542ca027d6cf8c71c078016f1b23f73aeec8b7f5b77bbf003ab4233d0c56ea42337f5ce83d82b5e05497f0f8e3b4f23b78f71be7691f5bd66544a60f2ee685c9c70b17c5933e864d66f1ae50976629c7b76e91e17c1bc3099f5fcd191fe6419097088fed1b7d875f9a39dded5ca6c7c1ac36edf1ef3dfe9cf707de34c21962bbe9e8d0a92a7bbc0eda639d813254f44c47983db3d35c662096dcb61324e97d68320624f97eae0fe0400a7b618039d97bed9034c29846278a030d3c2e0932bab62a9ab325bc07cec7094fa427a37a937dab17357ede8d08d3b3f76e95f1f470af327f2a98ee1f56a5c69d1eeda8f0262fc36e04c78b051f4657c94cbdfa3218385d4e3422f5c4cf7d6c869113e0307a3c16f41db561c4a7d43e1ecd8ea7ffa6a6a548606ba96\nlabel = \nmsg = \nresult = valid\n\n# tcId",
     " = 2\nct = 77c634e7ac8dc0d271f8d970c3d59ecdc19a09ad5076f586942116e7125b6df207f8aa21217c47862419cfd64f8cf83302660cae993c45bded252c6e618ff225d251b0057099b3bba4fbf9480b536e5eb6f39f64f2c9b32c7d07edbedc4a642a7d69d263d88a62475769b653e550dbabc1d2fc0d14e27bec772b2643f46bc6c8950415977fe21b2f33a432617134bc208a613c3ecfcd531950d7ed44b925b3f16caa870419de62053c44984fede89b8503212531c13345868265d1fb139d2272a9f659e6a988b9f54155251601259b2c0159b3dda4910b5190694d98ae847b05b152fb63c1fefa31abaee992a46fa7407499ba1f59b6dc69c348502fcddc58fb2c60fbe30f7471821b75572f149138841972d08515d85ecf0390ade20b1630c9f7cff16bb1c0c0c566fd0e55c1090dd28f18b5019347461e4e533a1d97e553583af0beec3f1dc3a595f855baa75834eeda16f6adbb435be7044050f164b6ba4ee420ba9186027b166b50534d5607f2635c3317ca87acb9fa9d08272fc1b69eafe2d0b17b81def08851e9f623e14674016ddad14a86125f629d3642f5549c1bc69845fb7fe01b9be3c77051781635f438c6846a17a1c15669f0a161edef0c13d01ee2f53902585dd02d2f139bb91702ad29f93b6275de15bc7e537a1d2a4f8df47fd7751a4f9ac25dcbc9b2e43d21accacc6c3f7155845435faf50c275c3d4572\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 1dda78168838f43a71aa61151bb8bb953c204d0af526231cb804952d4e958ed47d2b51aad7c3ddf0cf5af70b87b5a5c80d9963e261309692a822294b40ee3ad67af64408508bbb18dd2b61090882869a5207197ffe0df39f278c2f3a710e0f8ea451b655fcd8542e07606af88a44a7bdecf5a523c312ff73942ef4e8105a5cc69fc1bb315f77f36b87477ff693289963d72f2ff0b6ded18a0d56d79787928ccd72b7d5d7acd61d37d632cbdce66e2cbfe990cb6ee250b8261248e81013df77448dfe1cdc5b812c8380aaa0c19e6cb11781c0e3080017ee254b89fab5d534cc4192946217718d3161c87231d955d4fbecaa817fa92800104fbd0bdff088fd65e9ad9f8513c88fa613d952634ee8306166225a2f37eb7ed779fd6a799f0e5600ef915867d88e99645bd797e261cfc9e462773fb52eb5398e4e6efc189759c2405f9506ed48e6123379ba477bbd029e8bbd11ba86239e138487ba48882b0c3ef356cc1b3cb2cffb0d2d0c9161f8dbab0a91276a242762d18ba36b2daad8527c781a2343a110c4acce2f2a4c294057765d82e86abe6ff036d9331f1986115b8a22d7e425b81f7c0f0e32fb57b2971e8a7032d155fcf61d0df5e9415344519891a712907727bff0b31cf652357e7755c68d35e22dabdee83f8b46ef4f4cba34f180b957d52488c033f4f2fe413bbd6d83e70c52783d78bd98689bd6d822618fbd464c\nlabel = \nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 2013a5504dd553e9ff2d0c42eefb6f6978cdfee946ebacb69aa0071640f42b1c6d019ab2c50362c7e271382d546a9ab53aed7cb625fdc692a60b4112df16d85db4a748935df606e4805419d4cd4a595285f369e20c7b474a2f71a6c40642c4e84f6ff870cd4546a4bb2b9f92a77d69bfa85724caa7c3724aeea131d9e2f61b5c24ab19a3ff46ef9b25e8951a165b2a795e8d734c996f0d3cdfc97995952195b60c65979f154ff185e880be3948eb95e449f5427fc3cebb805bc971dd32f57798e11d4411c7f2cae6ba40c711a5748c68d37fc7f493e5d389666159a55c57b1edb99fa9c30bc7eed5619177a90175cd0cb290b93b75a4725867baac40edc7033acb3b31e89063546d9c5b0a5d4c4f9062295269c51e7230b35fb2003c2e913f4c234ac9da3c467e6d522872fef1d28493e469b8e9efc1f6c389e69941b51977c4f4bb21c02a66926662899bf3dd638de31d47f8ffa9d8ee3404d8fa102985d2f8ec1e684acd5ca046e8b96d122630b3a7059ef8e7dc930c81c97bd81a3e3b9e984602d71cdf9985778f5f3b04d3f30faf4bd8a323ce6aadcedc43e3027abad83e92667afe962b07edfb218267f515c44be8509f1e26558220207468a318fe23e07fe2fda04114db17e754d9775d2c4951dc1c7f8d1b4476aa13ef50da043815a2a1c6453546067eb463db0877f717ec70c176e3fd73c8377ac3a8fd19dd2bb80f\nlabel = \nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 0f0b837a5f4f036f5a1b38669a4768571e1ac523e89f082361530f1288a55cda8c6cb5f4b7632d4624a9ef1507546ff1416f5baf2c6b53f1bcb9aecb305b6bf57b204282c74827ee71d23398509537bc7dfda5a4810b0c4b6af3af45e838e1586b9728509124d8b49d0a2adc8d383962fe70e4524e2fea9bcbe5c71ab05ec65b5e4822a6b765de292861c86a7605e3c20d1e3f8e8268a21a326f51cb66ab0490673f036ebe3d8fe5fa39e195fd703c1c93b49f3697d9f73f683b6f70d5bf585d72324d34efc79985463ce1df5c6112720e9bedf876e1b80f36614d719743e4420a62200dced4d457ba2bde819fa7ea2643eb1a4672e6827c915920fcb94f3ea9c1b0eefdbd7e5e07d1a2d6738a60ac7f81be705645f2b33af5d5a20b09ea4c3922169bcdf0d376fdc80b355740686e77049028f2f0dcbc7c910b8c15cca7461ca5a411a9b6d750a315a250f0da703459a2147aa3633c5711d3938f863e35713b802788e2d20b0de356fdbec6d187580b75d97cdbe7f07ffba0c14bb88f32e30613a1c911eb82ed72b4bdcc232b46684c581440df157f780fa9ce534ae18d20d50187aa905611b2b045d8b1c2061b0eb9fabae940de151348d10f0f24f753cf6f667bf2689a73bbf3089bd26dd74b803ca47d9da8f9ca538f4c7a62aba73def2a08f92eba90bd6d482ade0b6b724bb100c9231a31a7a0973af2de4fd5aa752450\nlabel = \nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = c40804f6c7fc5ba3c30f051a719c08823b6591f45a899fc9839d8dd77157761ce610d4a138c10bc231e53f9cf87d5fa26aac8f167deb1b6522a4b365a136849d0124b09a03c4d5f5c26ea90f7a0fcb4518625c3ae3908910085be3757143e1fe1fbd23bf0942174491cf8f7c2a1b697efcff99822ae13e2f4527c1b8e5d50c320971dfc3bf8761fd08ea49f60f78c80e65edb08aa916a5cb9355e9201c867fe17ccf4bb36d69dca6789906dd27515b1dd99285f483f8fadef217c80e0a430926bdad691118a33577689ec1815565f51dea4130533aca7a57a7bd706427ce2022000421a26a5d1fadbb834e6d78fe4dba457c70820c1c0f3f1efafa8a27ba302b1cafcb9b96f41a4f34633a28e87a6202f13fb0e41df3ff644a91106925c5c3b875c313aed8a04930011dd866c7d52ed018a6233f0125f4ceae5df8ef8890997868cdd3756e42775bce57327cff10e4daf568322f1021b140262f94f4c061c31475de1807313f1621fbfb24f4d779d99c917fa5104f93324ae675621df90b02446d40ab2f319c32d363b265ac32a7ffc6d262e7903d8c05dafeba307cadd25927a034cfcfc784ef45136c950682d313d35c20cfb918490c86eb342dce1c2b68967f3f10d439849a4b6db8430702615f36af9839391b1316c0505ee18b8a35806a94b73d00bd5e8bd2b79d383b89ce7bb046e5ef957d502fcd9e0290fe70886991\nlabel = \nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 9e053f731455e4fccecfdd3260ac0056a291fb4a37e297899e812777054f13c9e836f27de12cb2549d6aab0ed553544464119c495067e90699caed744e61ee17295673d2c868b41cc23f9e594a002a7eda75f1bd7e0b211c3c2e8122fc2568131b354b722bc1a29ec52e718e471c212cef4242270a4f9a765f6d077e37a01091bb13ffd9ef02c70462aecff739a2624a5d8d8f5cb8f8cd3c6eaabb683a10bd131afc6197a8d21d6cb066c610277eea1221d55c9c0d26f553ff7c22bba1a883d22f153c18ad617b506ad55e4fa04fbfa7cbc7fd310b49809c80513322b9ab296aa4a033ad3bf785c1bc5ff0c928777de67a71b393b213227e102c145e9b40357f251c19bf572a48c2e3f5f0bc12604c8475aed9baed2155028feecfdbb328b488bd5bdc031213b0b122bdb9cd44097d1813a759d13122530587be372a779e1aaa08d18a84d26213f936885b73835c27939e9c5d284076a09ecca3e6dc6e5be5c36666ac1ca1d8796502e0d5359cd6fa43edec58bc3d2b39938e69cd46e2a62ac4f6760d8c0c84765a6f5f6b66411dd3e217d690452745808a2c0f0fc504e6e56989a72bd1a59774abf529067cce618d2c39c05f0b400e644f7ede106e6eb1d0635f7f32ec04f86cd3628dba1f967b3109bf0052613fa84012da70ab4ea84e5d5942d42a0b9e3d0c80b0343fa9486c5a077fca77ffd30256cd4f8138dad30d6b5c\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\nct = 63a3fabc60b94267d318b377327ee6548f594777842681fe21baaa2e9278f001a575ba38a207a3deeeb2258de8f6bf11276090f869efe817fec6299247c09550bafe7bad02d0d7e0be51f8134bab130d4a9c593e3fbab7b276034f22ba071792a4031e591ebf2d67048ef07c6a017d2f71c72f8db0d32acc16788976f02fcaad2097aa83843773e59ef4c04f383f013f86e2334f215cfbfe64257f60d0797e5a56bea35b5dff983414ac686d0d80d5ae14572869d02d442b6a7b88954a9c0bd56a872fed20dc45fc0ca511db195232021fca52ab997191a08d1c02d0ed41de86b49d05715974776d8b0fcfc5a78432f122482e28812a0608ad1570de40c55397abd5c2a58046519a052cd3e2f03cd9e91f4888bda964e7e52d1296ce1b41b312d20f640276b91a737e9db0bf4fd449ddec6da642559b92d0a60405e868793681a2366904e8fa4eeee0368a2d0a606173c9470e26bfd462d97a8e40d06c31a4330a9ec02de58920c6ac90dcd20debe6fc14357842640b44b8d0be5bf03d737c4fc08fd37ed249017682b62735964a24681332b210fa8825bc60ed85e857828004b6cc42e8cf8b7d08308280b0f6daba6ec96cb5a300dbf3ed260984066478b5b93274e1b627d6a2a126d9e8d2db8b886686cccf6361487f5a0d62aa0027f1608e1da7f5b909f247ac42375551af7c3fa53673470c1c156bd953cf188f62bc696a\nlabel = 0000000000000000\nmsg = 313233343030\nresult = valid\n\n# tcId = 9\nct = 21f1f6cc2dddc3f1d41d482a0e1161769b8468f2340e32187349d80955e7003c57386a85b297aae086ac1550f90f8a5ba73192818c68f0cdc9f1a69ca518d1bb84c34538d9b0fdcfaf2ab859bd24748b326c8f8e1f0bdfe2d32fa7a5a6e56dbf69b07c41eb81ec699c79be15f34cefeaac0531923556296b7f9c29b06c2f8c4c36f5adee505c95db1496bcf923b27d4af4e083e986b0bd04cda37312a99bc091a81485bd335fa7e63772d8512b4fba1df03cda8cdbfafb26479518a75618068579bec06809c3107cdea7fa5a264c9dc0f43ea9db33b32d4637b65b7fcbde0d0c959b2c5bea8518f24f7f600d33d89ed286044d4594a446aea113f86",
     "b19764f68eda9ce15504f779316529bef78d1a83aadaab26e8aac19947b85d949d253713036d7c04f405051fd33dd8cca36bb657b3519f4e4a1722476b02577db945b86c39f8614df5782fa3e1cc7074cc5b5b71c9cb1077d8e88ed3aaa9be3745859c4649dd2845b4c6606c8f689cc5299cce15721eb0a66e7b6f9a9105191bf17867eca2a2668ea0e9598454dce6a10846f49e680c4bed4a9db06c5b92f92735b4dcfd63506ffeac5b354a09d16adbfe6375f9b6ac88fbd5402199f68d31254cad765a554d65757f4ecaeaa55b0d3a4934e24bb12f8fea46b18291e9aa7daec97ae675707a3913cb08b306876ce15a025e386cb03b1638ae4d4ccc76b8ebed23b92a004\nlabel = 000102030405060708090a0b0c0d0e0f10111213\nmsg = 313233343030\nresult = valid\n\n# tcId = 10\nct = 5559053e2566127dd1aa6ee3eecfdee11fa81f6896569d8a4f85c350c4f258126894f6826ae466ad939314b2674397f4aae2bb6a6d53ff89f5806cc29ee6c390434a4eec144547603742bbeff4584b884888b9af8988ec8fa2567cb6749b636b4a2a6196d2751840aeb64dee7dbd25c32b42776d04a2797bacf5e274895771f43b519a89669f56233c0b9a34c8a8e87b70ecbd5aa79337bae44364af6638e3d57b86946e3d26794434f8816b533aed1be591087448a13a1b247a64bbdfa989b1cac0047c966af74d0c9093a410cfbfdd828385597006b556276e6a466f9f3cfd38ccaea36d0a3bcc5acc63ed8f65ae5c3aec3091dcda791e7931221c09399ca56bfc3c2710c0211e9766dfa6f65cfbc6141479414a63a62d7c72830ff955b1cd86b38802d7935b430e7a802614d68f5015ef90adeeaf15f95bcd770fb7efe4d9e6a0ef8f23ec0743b3f71a9520e20fb60567998e58658abf6ecb98935fbcd343a949f952baec6ff5de23552ca435866b98e36288693b508bba177c09dfb27e13d70c741712d663f3525a7bbf929162d6f45031ead380ad869f40e230f78d9cc8a8918964ca0d8499e4bc355b3851a1fd1f03953d65935f613483058f6f250924db780733239b24dc454f9881df7648e2d19b416c2f8af53948cd7ea06e9b3baacd7fbd35e50a245c8c7d2113d9cac43880515d3a0fd6f3d76e5aec0d38f02e63\nlabel = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 313233343030\nresult = valid\n\n# tcId = 11\n# Longest valid message size\nct = 592e487960f3169443c5d6f87166bef2ffd52931518f3b0e5d977f3a2101814e749fff5fe8eba424a3d439609857940f5e23dcedbb45cde57c21c28bf729e396530d21fbcb96c97a148c5708801467b15be1eb0d35206105f543d21022fd023ac89b616ec790a9182aa053ee4aa7962f33f4b413a48ee3d53b2d247988683d4db30bf4ff6d80b6d0ce82e314ed6dd7607df577f1ec956acce51f744f89e7c6a770ceaf90b20665df2ca8050ac25ed29ca80a0351ad790c3b8fd00527195f427410dca6bbba37a441cb82e44383bb4e077fca32b27626051c13886392c10a305890454588f508ef8d9d0aeadd8bc78991fac96c5ffec892381b03580e28926d8b3a51da862951a05f48ef809b9ce11f23323ed10fd597d0449acabba954079164d775abba56da956c513b601d1846c867c6bbdbadf195db11857d4135c30c2b5898782ac9346f7fea4e2ec80b39b0ed962e0c1b34494af4441e5dad6d05fa7a47763368f850e3b81451b47ec12886fb317f5f5ca688275ff1d97410f8eeff8e210680c799f45dbc47744166d5b470c35a9df574dbf1b255931ec98e82e10985ea23daf960862882eb3ed17a99fef36af01b6168b22ae7ae0c91045f79da51fd62317630e123e322dc692c386bb9e30013525da3289321f311b8cd4e90175573debf08f772ce6d9257a6593557f9edd956c827a285f7bc620e262a7d64b8c56478\nlabel = \nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 12\n# first byte of l_hash modified\nct = 8bef4f3022bf5b4897cb318c5a2bbacab6b5a31d84553837feb0ee90f0e26e9c5fa0b963e13fa3f4867f60fca67c9de0ea48cd495df7083c269cd3d7da9942847623ccf81deb85240edf5ce1ed623f5edf0f8cbac61182538be43a32710d62881a973c12fd20012209ed24a8fcc64ba98cfc15029231ba9bf8c6171fce1cc365d7d49c169371e68191d9ed06a2f2b0b9dd8f21750e50c897f808e696730353a620656ab4449918b552628445f37e168b9d8e812bd6bc6ee3df375fccc531546479cbe773a839ae3523b7ba697ea0ca9cbcfe995f9f3e22680a787f3a43206571c556e6caadb9c6ea8f51da21f00820a2b5a3189fe1b3ba748408d93502cbff30e5204df86076a6612513db0067b2011927349066ba94b393a7dc23934904e6190a28c48d0913ba65f51e180b5458e1f0dbf0feb055bdc2f1002d2d4a1e506af1367d234dd0751cb2870fc9f4b84c05839366a2120503e8cff9f648c1f0b630619d5e020ea4ef7066df63053257d303bbe3717591e769fae87a9f92b1b04f9c0d879391fc063c8e5534f7b2eee96385fdd188b3ba26d6913ad9a767334dcd8d9b5b596a808301518de9f12f12b48b99f192670865abff0ce432ffffddfe5c311c3e321db48e79399c1fb530cf127936267dc18b05ea7e5594e77c63231d6a79f261854c856a4507d09ba5796995e1410135e05f16c7c5dde89973d35b0ff9b5f2\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 13\n# last byte of l_hash modified\nct = ab1f96560081e6aa20dcf6eefe00040bed6e0810076e5ab0457e276c06aea748946ff1f44c4884fc0509b79498709880b9be9a10accb2dad7a1195f6dafd668bd6d7b7225f1cea79f8c0dee13d125a0a1ba905f498ace6396e51f61f263af74304273220aeb8967b5a7f90fafb8226a1d3dac4f9bb626a513e4c7d352b31e25bd1eee15259fc3a4dba78641363e261242e18f860ad5f7ba35e60cc6c04c0709442048fe5b34ff9c567cfcba5a146df9f0c5fd9c1ba61d99595712e98a88c8c8d4b643925f0801b59cce4c1933d864b46c038400450bbb5da930612153116722050e8f8b377da4114052ab47ac3757aafbd6b7efcf006541681db2262478d3d125945901c2418fb3f013c5a9ecf3165de6e64b64a45e5bdc35ba38b6337b5da3cd9ffbd2a92f94565935f9505b1abd2f9c22705b5677b5e1e1290054d5dcae14f9314219287a4a618e2671930e6500acbba9417ec71e23b64d1cb5326f2fc531c5602e4b2fe45bcaa892dfdd8b05def3909b583d40e97a50ff7c38d29f7da72c92d7517e795ce7474f1ddfbc0cae588bdafa42188cb85204dbe88d742bbf7f71f7410e49b9215d9cf14a47d8b5bee0bc7947bab919462dc2c5549181ecf6ff07093fdc028251b8edaf2861a76465b9e22dd37940012d78182955e25a2a21ce157c6a93de447125184be3ad362f86b0299a74478f46061091a48704285fbd3a668\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 14\n# l_hash changed to all 0\nct = bc4463414999b839a31fd9e688d87f659a154a3025c0bc4bbb7ddee3c343b3b0d302def1195d56e39168b39dd48ec9ba5b16f8f52969e151ca122b06990d424b84884dea7a27d65b009af3125c2dc57aaa19bddb4ec284e008fe3c611883d60311c7cb4275588813e96090601c5c208f1d106145d02a7cc06659bbca484e1c898eb03fce81aaac560aad4b1e0dc4c92fafa0d4e232bbcfabb2e8c714c821a5673201df7b163f27d398451c4af2bbcd1448f83a4a8b238351b0561ad32dfd856b9a44516b3b6c20f5dee820aeb8e953d72f8d7e1f742d729bb1511d85400866e0f604e22f98e2f48033539756e86ab74939fec4568f37530678667e18bccece1abe6d3d934efb95ec85e1be5f0c2c4a3152cf5724a98a6f092de8ab70664e5a0725c8e5ed218540acd30ece6bc1279f1b8241660288b09300062e5d419525a9a7d6a04f24c2538189c9aba60730cbf6f6e208654077ee8e00a1e4b46ec3fbc37163572f0ed22b187970fed4e05a3331252263337e1d99f9d8e8fa5e42d5c4eb0b8cd9f4580b5c0c23667ac95004644eb125a6bc89b056d29aa9ba0757dd1bb7087102ef146b0bcf4f49d8898045ae7345ff58e4f804de5ec45ca10364bfa5594ff22049fc70801c1533a7946ac8eb445a14bb2159ff2c6f500fd67278b853d8b124dfe0ff022d0839533e4c17823639c6fc2fd0472649483db41ce72164970122\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 15\n# l_hash changed to all 1\nct = 17a8c7f746c34ddeb535edc9196c8a8f921dff923eb8ba3be9fd7079733982a147ef9aa5e9b32ff0c54968cccab1ba030dc623204693c18acffd0bdf46730a04befd55035b969d829cf539168ecd100d24cc7b8db4651054b5e63def4d6b183236cefb3ad9ae7c8eece2fef6f5c3355af267a7ee614050bae80eceef92dfb3b994a37724d46dea998894bc68e37252dfcf5c0a43bd3ebbde0d5a99fd8ad03a42f5d18b464b1f0a46a80242d7533ffc26c012b03626a0339ce0649b1264e9b5ff0654a52ab981783ef6c1b0b53a4be1bcea6f0367e4a1f9be96091038279d6bd15ef2f87e0619915d999cb30044f1abd24e019fab6dc7a1c413fef5dbbcd29d268e72fff5da72de0f4c0813615b27e74776af8b7a58f4f29a233103487f20d09750bfa9c272d0d57bee59b1e50577a04fbb46523ce1a3434f72fd69eeff3ab5df6c9d5e6832ba2601c0876f9c67b5854ea9a046b2ca9b0d57700728e19204eae99e1797637d510b54a2057d0f772ceb31c84d5625fd3c458bed65501a38ad0287df1348290c8b296fec11e7b3e36969bb8ce32ab7ab19bce268abf0a5c183f9db1afe56f47aaf73a1dfa499b8669a50191d80635c908f4b46183a33f025e0d1c6d7a85e3617967a421d998ea2a7461a3ddf3a19740273fefaf7cf9e64057042adeaf6b765e514071b92aaa44078cca712063c1415395f2bdcf86108d77e0f2a9c\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPad",
@@ -3705,9 +3804,9 @@
     "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 24\n# m is 1\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 25\n# m is n-1\nct = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2\nlabel = \nmsg = 313233343030\nresult = invalid\nflags = InvalidOaepPadding\n\n# tcId = 26\n# added n to c\nct = e9bb0b12b3f09a5ecf2054518959b594497b2eb3035b6bacc2e7ba277e14c43bd23b0249e12b87ef366733da226bc6dfc5a30f477324658da07d90b79837bb9e47b35902d92cfe816c450003562b3dc90e8208f02e93b217e635f8fe296e2a9d4e9cba9e9194d0fa50537730245546b31f8937c2635e137eb1b297a6492cac1b36e88d363bca78c4f2988373ed2233d4ebd7e8078c40a00684b1f5e3a7ddedb73cde4a298cd9d9b487b29c589655c08b31fb753e521a9aa69a56bb8dc70c72b2a5a6048ca0a23d1171d249c3d59d3386d9dcca35be84bf4dd3dee8f3602f44269260750da3718ff5704ce66f41b8b8f97d6a0fb09c93616b29384101f2638bd43bf4a07d5c9885e03ec3aef9aadb7e75eaada3a3e2c15d2d7a557ab63a00b1752e15a40cee1f2d8d1604fd883a4e2ca72c35a3fd405453f4830a2ec2bbce111ebd2d0982060bf006d9b7d220d5c5ab5b7e5061b83eba5c9203a26284d2c01fec65d2e6c8fee9835bef26de005f68c7b165b388082d18db7a70ebe4be0378f13dbb6d3ad091089aa7f2154d677a77a5d0586488130dfad798eae4c6b61b90af10b95436f2e3da96f258e40946c8dab0999f04f2652df4b60b1a02a538cdb4325a6f2d2e3440012f4eea97051ea73dce639e35bae219cfd9e27adc7d4a6103dc8a7b99aa9d4ff2bbe7bac248828d60d8a811c725e156e3293af298e63e839bffe2\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 27\n# ciphertext is empty\nct = \nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 28\n# prepended bytes to ciphertext\nct = 00002013a5504dd553e9ff2d0c42eefb6f6978cdfee946ebacb69aa0071640f42b1c6d019ab2c50362c7e271382d546a9ab53aed7cb625fdc692a60b4112df16d85db4a748935df606e4805419d4cd4a595285f369e20c7b474a2f71a6c40642c4e84f6ff870cd4546a4bb2b9f92a77d69bfa85724caa7c3724aeea131d9e2f61b5c24ab19a3ff46ef9b25e8951a165b2a795e8d734c996f0d3cdfc97995952195b60c65979f154ff185e880be3948eb95e449f5427fc3cebb805bc971dd32f57798e11d4411c7f2cae6ba40c711a5748c68d37fc7f493e5d389666159a55c57b1edb99fa9c30bc7eed5619177a90175cd0cb290b93b75a4725867baac40edc7033acb3b31e89063546d9c5b0a5d4c4f9062295269c51e7230b35fb2003c2e913f4c234ac9da3c467e6d522872fef1d28493e469b8e9efc1f6c389e69941b51977c4f4bb21c02a66926662899bf3dd638de31d47f8ffa9d8ee3404d8fa102985d2f8ec1e684acd5ca046e8b96d122630b3a7059ef8e7dc930c81c97bd81a3e3b9e984602d71cdf9985778f5f3b04d3f30faf4bd8a323ce6aadcedc43e3027abad83e92667afe962b07edfb218267f515c44be8509f1e26558220207468a318fe23e07fe2fda04114db17e754d9775d2c4951dc1c7f8d1b4476aa13ef50da043815a2a1c6453546067eb463db0877f717ec70c176e3fd73c8377ac3a8fd19dd2bb80f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 29\n# appended bytes to ciphertext\nct = 2013a5504dd553e9ff2d0c42eefb6f6978cdfee946ebacb69aa0071640f42b1c6d019ab2c50362c7e271382d546a9ab53aed7cb625fdc692a60b4112df16d85db4a748935df606e4805419d4cd4a595285f369e20c7b474a2f71a6c40642c4e84f6ff870cd4546a4bb2b9f92a77d69bfa85724caa7c3724aeea131d9e2f61b5c24ab19a3ff46ef9b25e8951a165b2a795e8d734c996f0d3cdfc97995952195b60c65979f154ff185e880be3948eb95e449f5427fc3cebb805bc971dd32f57798e11d4411c7f2cae6ba40c711a5748c68d37fc7f493e5d389666159a55c57b1edb99fa9c30bc7eed5619177a90175cd0cb290b93b75a4725867baac40edc7033acb3b31e89063546d9c5b0a5d4c4f9062295269c51e7230b35fb2003c2e913f4c234ac9da3c467e6d522872fef1d28493e469b8e9efc1f6c389e69941b51977c4f4bb21c02a66926662899bf3dd638de31d47f8ffa9d8ee3404d8fa102985d2f8ec1e684acd5ca046e8b96d122630b3a7059ef8e7dc930c81c97bd81a3e3b9e984602d71cdf9985778f5f3b04d3f30faf4bd8a323ce6aadcedc43e3027abad83e92667afe962b07edfb218267f515c44be8509f1e26558220207468a318fe23e07fe2fda04114db17e754d9775d2c4951dc1c7f8d1b4476aa13ef50da043815a2a1c6453546067eb463db0877f717ec70c176e3fd73c8377ac3a8fd19dd2bb80f0000\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 30\n# truncated ciphertext\nct = 13a5504dd553e9ff2d0c42eefb6f6978cdfee946ebacb69aa0071640f42b1c6d019ab2c50362c7e271382d546a9ab53aed7cb625fdc692a60b4112df16d85db4a748935df606e4805419d4cd4a595285f369e20c7b474a2f71a6c40642c4e84f6ff870cd4546a4bb2b9f92a77d69bfa85724caa7c3724aeea131d9e2f61b5c24ab19a3ff46ef9b25e8951a165b2a795e8d734c996f0d3cdfc97995952195b60c65979f154ff185e880be3948eb95e449f5427fc3cebb805bc971dd32f57798e11d4411c7f2cae6ba40c711a5748c68d37fc7f493e5d389666159a55c57b1edb99fa9c30bc7eed5619177a90175cd0cb290b93b75a4725867baac40edc7033acb3b31e89063546d9c5b0a5d4c4f9062295269c51e7230b35fb2003c2e913f4c234ac9da3c467e6d522872fef1d28493e469b8e9efc1f6c389e69941b51977c4f4bb21c02a66926662899bf3dd638de31d47f8ffa9d8ee3404d8fa102985d2f8ec1e684acd5ca046e8b96d122630b3a7059ef8e7dc930c81c97bd81a3e3b9e984602d71cdf9985778f5f3b04d3f30faf4bd8a323ce6aadcedc43e3027abad83e92667afe962b07edfb218267f515c44be8509f1e26558220207468a318fe23e07fe2fda04114db17e754d9775d2c4951dc1c7f8d1b4476aa13ef50da043815a2a1c6453546067eb463db0877f717ec70c176e3fd73c8377ac3a8fd19dd2bb80f\nlabel = \nmsg = 313233343030\nresult = invalid\n\n# tcId = 31\n# em has low hamming weight\nct = 125414a4d9a1c6dfb02822a23a43a54f9a43b4695f7e563da34da5c1706cf07baf3c7c58cb37da1ea56305d9bde03f0559205e05dad61beb195f5aef8a6e6b0a921b3d3913b5bc7c87e3fff274afe789c715b96cf2fc43e8372b68d10cafc7362095410c3c4d33580884a0f215572fb05c19fde4744f90a0ac23980d6b579ead8d68bc782ae2cd5e70064478011ceb82ac9df20d2f64550b37def09050c319134383a88c9673f6349c446b178f2d02b2abe7c61f9a1a1193ed6869cf1a985ece2b921a1234ca29298974ef9b3b42b5984c44576725aea8d3da89a5703081c6cf915be00750ff13260950b24f46f4551b069e7eefd531e71f7b7f7afc717c1e41d7781f01d6f0",
     "9cdc49b966d4f5455694379f4f0e31d3923db4776ad7fa2210f41b0e7fc6191ea18cf536de4e56d1865fd58f0dcbd71a0780e505f3d971fcd44e11db1945116fc8ed7bb7fbf3afce6db6454d9842f6c75b9c37503aeeadc6ad57e515c32bbcd5d81da7d178fd818d9bc8aaee2480754bea86bd507e74c33995458113f481ca8ef4de38f11dd0f0b7e6c05419c3c15b08adc2d4cea1558d8b430d2ecc1dd4bbce534b9627292869357b461fbc1087e435636534021ad02964121c474948a618c92dc5b7e8cfbbe1f3a5333c3d643f6ac0ec753540ccf3557762040a4754d7bc61d02aa51c7d7cb10e53c01b667af539a6b45c60b3bc1624073644\nlabel = 34c9c04473bd8a4da755a88a04a9ccab0bae8fdc51332dcba4aad045ae8305491fbdfab41821f6b838729d1e09fcf99513db3817c94c5be96a41bb23c8d0b0da00000000\nmsg = df487116341e4900036f3e9c31d809d20d17baa32348aea3f66babb8b082fe9fd496aea62e54c7529e0ff4c30690ce047caa15cb2a1824f0a4b7d56914272e8845d85fc8b5af454a5012355b5e862b283c59dbbd146cc6fa2a8aafe3889e10c8affee1782529b9756b45692bf369febd0639dd46029ad55111492ec2707939e62d645b4f4aea52573b3fbef8b4148ea2a539530f6841d8396c279ec66a503d8420c580a1ab55f571eb0ca931a2cd27b08986a7906d1f48ba68721967f2aded2d43cbb1f7356d62a169e3a376bb8f6b9e5b9e2541222d43832fd541acbd23a2044f04012179f654b70514bc38743bdbc8d8ad78b7392860c4dcc7173f180a25e6fbcf18dbd7440dee9e8ed9dd4dcfbc6a49e08c8ab08bca2ce4c774dd10e0126424948876f2a922d074df12d549328fa802275211d8b108880d90f4e1728f82453ba6bd5dda5a903a39f4e2da981e93522d7894a2ede6d1cd7f294ebcbb3a153803590097030b4d280e148a4016e454bf6b8b2b12b8c107b00826c5da2903\nresult = valid\nflags = Constructed\n\n# tcId = 32\n# em has a large hamming weight\nct = 429b721c92718aab272499bb59c79c051e89a93c091925faa209521649f090ff304342e04f258863a9da36b906384afb760d40bf553aa3b83e5ebc6f6246b0628836e59c56daa726c02e68552f79f8cbdd1cc349b7f988263680b7519861f8fab9ddd10a8392e6814d6e300a4b6447b0a1860bb8af7bc18e818ca2659c0c462c70ca929e2d0a67d81f557da8b1b63031835c362527289dfcd9b18f5644d1fbe54fd67c3b51fe84d3e44f3efaf280fa7cdcd72bbac2fa6731dae2be296992d6a08e8b8ad9fbfcfc086669ad34e4de07238791db1540c2fc91ba513fba4a692fbccdc717392bdb91995daef21430eba513bb80fcfc450f7af98a49fd254267f8f424ed516825cad9bf036794b9042ab7cfdd16bdc3398b8235a225aaac21672098f9fd799164f02d367ccbed67df1d16ab7e6948057efad3ebf9320ab3c74599a28636bf039ed4d1e023ce92732d1bc04cc2f71dda0093027e1e84666da7b6797e1b64e66d79dc088f0f8f91a806efe3c17c563fc2d6f3cd662fbb5bdc94a6b8a24c968e99a72b1a0ae5e621891d0a81d3b266da316c55284d65e20827d25a9a7abc5cd394b5cf313c5f0fc78fd4d2d8646c910ebb04f96e5be89d794bdd65b12bdafffa37dc5dc9c11b3cd664408e0954ce302a6e846b86b182f04e4ae30122d2b87dfab07e68d8466ebb235f606cc5d0989b1b2dc222e4a6c48a98f785a07c5d\nlabel = 2aef95ffcec9fb31cd3a17df07044ff10e054c4ff56d7f31b8ec1e24cbebf6979ff21d71ce627f7d4d7630e65fd07df472b39f2c7ba2f3af7aa645ac7aeb68da00000000\nmsg = 1348c2870b2c2aa0b686a87d4e51b8c9155e89f3e33ae3f7eb5a1c09c3469d3049bcb8a76f98c27e034b223a6c0195d29de1d4fde6748b2bcecf39457b292114fefc237e5d5e67893b1fd93385f9ca739f2487b79754c5bed364bd846a7afaa88ea1477e97949b770d6775830e932ffe327031d11a19db2d38d8a1897f2207a29d24ad47db096857838faf4512990ac167e5838f4001b62d6a7240b20cdcc159135bbb0939d67ce2c35f50267d2c4d702afcd907d6e43332eec8f52d71445a709fd365adaac1ef0f6ef72e7f7d976acc64e2d7e8e574918ed845fc4468727267d6e365bfe4fe3230645432cb5dedd284bbd28eefd53476d4a046dd30411cc8841017d1f0939db10a5c028140351147949d03d3aa0d512f03b42ac61403ac3c0fd240d9b69598803ef2e934c8b7d2923acd94672d570b44e60ded2df818181613e1dac6d19780fa2974a3226335c7c136ad643a17739b5b252c2aa82ca6ed8040c7230b86de80ffe9d81a22853124ce391dd3093076c0a93188554d202c53\nresult = valid\nflags = Constructed\n\n# tcId = 33\n# em has a large hamming weight\nct = 4556d44840f6c838427c8c477bdd8efc88cdf57d419d128f208a9e44674119dc71352004f1b149f2beedec7f3ac44d93e7fb9bb10bee7b675d62dbd9bd28dfa42dd6173ff17968e8578f0629486f99d40473d3ccd8e0fd3747a6daa2323c61a88e1f168a073197686668a8931ac03ba05cee8db7a5863532e798da7b0c371d03bee6cd2ca532c448187d16f424e4c22dc0aa86f5bb8358d0a593c9796cb5130cd6610a3a4b9afaf4da87c0eaf4aa015fdd5899b749af62e85e955de5a315fa971c35e900e410017f6860dbcfa347206a7e33277efcd3a17715a8f1527456d16e2addd711d7bda3be776afde4adb2a8834d98e4a2682e9b742a8798f4a5496138472bd889eaf0b03316180ddbf750ea5607f37a199e54c0812c5d59bba22dc1c18bdd8e0f8c4eb61a3701de06a710d142a2f5c864dd05a40c7c3fc4d4ae02078abc9559017f3c6588e670854ad81896b213a769bdfa6e221b5f8dd7ada50424deee1b1f138c738ad938b64f5228880214bf4166580b11e1afafe2b89819e720a7e08f773109dbecf40851e839b4a512b5fdeb3309b8e2fff237f8207df0af5d33a6b42da14f44dd49b716a7dba83989094b217d4b448353e250b9ce5f5536a471f2e1058e421f9c5c166b58db8e6516fe57db729b4c6ed31f014510976779beb555e30f1ad0de2c2922d9dbbf8bffadb189b7a5506545d3ce0b0f5891cde090cc\nlabel = daef95ffcec9fb31cd3a17df07044ff10e054c4ff56d7f31b8ec1e24cbebf6979ff21d71ce627f7d4d7630e65fd07df472b39f2c7ba2f3af7aa645ac7aeb68da00000000\nmsg = 01bb3b045ddec9528281814d028d1d6e78be895499b7f975e181c80e60627453016f4d2a767ee0ac090290243a9af67a6952a9591e3f242e80a7a19f177bb1c130849b9d74929ee5b048974b2d74dacecd05a32216976c9f605d1ab338de1bf245f5ba8c6822623458be9be96cfac7dfc65146dee746b67b128b68b36d03104e31ad9318c2d6eccd622bdcd07880ba1764a80b5ff9a367cd8366d82c1bcc65c9784c7842ecad63080230c1d6a5cade3fab837afe5785a8972172b9d9d0d7d4558ac162ae80991ca40b520979b24f64435b68c226828eb95e30be152bbbd509f010d5123ab65f31f389136a53b91b89a8b4c4ceef30ddbf0f3ff6237386f9aa9e2e57445d2a100b8eae294b08d6b86945abc3314af6982e5513eff8f8d987705a43de929382267523434fe4bca190b6c725faeb377f9581c49c45ae50e311dcf29cf3489ca8d1ee5cdfcfd5eccecfe9bf7910aebf141b6099f26135cc20538145ae8e0406ff3eac640c7bcc2f266a033212848d4a25b51dea318a97d38399\nresult = valid\nflags = Constructed\n\n# tcId = 34\n# em has a large hamming weight\nct = 29171896b305db27c0c404b65571df5125fac9ea2d8faedc5805fa35dbc2c335286694fe96bf415f4f2e579bd6b559c2569e886ca2e507881c1d80fec2ec6a83c3cf176b697cfd88f098c4105aabf25e2d322cb6a933c0b825d76a45deceecec9c5809a11acfded98eee74597c0e6963ea1d4fd2718152c9be554d511e380f5ef59ebfedb279c60fc622c3ec2f89fb89f82104567eed8b0d1e5548330fd434f3d83adb81b919e308c90108fd10261ececaa4249359250aa1f58a373c351f0d0ab51e344fd76cf0e688b39cd2a14569aaf49fc9f2f4d31d3e7120a2bd1dabe14f22022dc4d9a24cdd78ab85bfe34e048d57d3d465b616a835c33ae1ac2e337cf19d14e362e2f79b4e0feb51387a2b12a971ca1da3b2c7b03520cc6778249ce57540d7e60717864f4fecfbeb1a2e1c5a26487f4efe315fad65cd6c3c9929cdb2be9dde2d7def70709d5d87b7df54b0f7d2db610098a5da516f69cf4375af1c51c5c58bf8183a39ff3476f3472892625357eccf2c71b98f09922a560248d9b1c638a2fe635c7d3c06bbaedf44c5643c3dad43aa66efe6ebf7afc7b19e2b89db235b085f5aab01fe49c5dffae0dea31a4af25b8a65fcb68dd13a166b9b6fbe539eb79d610d2333b77e08a21ba8530133e24b7da38dc86bc1e56c5c869df6f5693e4b1e870d0c8884292edcd5fc6fe0d726803055d1a64d28a19ebfc4b027a1a340c7\nlabel = 81ef95ffcec9fb31cd3a17df07044ff10e054c4ff56d7f31b8ec1e24cbebf6979ff21d71ce627f7d4d7630e65fd07df472b39f2c7ba2f3af7aa645ac7aeb68da00000000\nmsg = 204020bb5dd616c0697e2f261d547f9e1082f60a8691c73b8f3d78ad19e772d67ff85453cce82d39d052f76c2743445d7be719c7d1a8a0f437669c40430ea1c8af4fbeb7d70606e67341925e63768085c94685aa28d9d55ac67e9196712360f477df744ce770c1d8858f33a2dd2a6926945f3632b3391487a2124c4c8c071af265dfc365901ed8046e9e5857c53332906a703bd0afe663ac7143cf4900405ddaec708d18159fdd7919bd6684c02a48edb54223e12c8c5d154627eaae83b3cc1bd4f2e6dcd62d41b519fe2b01199abe2f4dc57d7cc2c360f8c4e72f28d826a8a849d41a86c5b6676f7204a8c236883ab504681fe7a83ef0f12201691252a589cc985001cc7462eff1151fcaa25741620e914aaf6a1699c77a09375d1005e7dc3755e795086a32bf86cb71e93093315233fcc8a86b4fb72f8ca5d320e5ac19c142fa7a0d2400979863489ecadbde99e15e3fc0277498fe871719d2955f229804c2a85594232e3e29ccda494c5e340e7ca9c720f93a1e39f906522bdb8f4f08\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen153 = 931551;
+static const size_t kLen169 = 931551;
 
-static const char *kData153[] = {
+static const char *kData169[] = {
     "# Imported from Wycheproof's rsa_oaep_misc_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-OAEP\n# Generator version: 0.8r12\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keysize = 1024]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad60d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 1\nct = 673779703fccab3ee7735e97e7be7fe3d1b39fa902ee35a858fabab8b2cd6b76b3a68f5971b42e28e8ceff7942cc4f3a0f2eeb4b998315961b06fac4b946d0c9f586fdab0c22b1252eae47d3c9d4fcde44dbf622b33b130adab572ca18a29016a35577c8518d24fc6659851b434b0025aa7da027d7ed77bfcbfc51c991daea7a\nlabel = \nmsg = \nresult = acceptable\nflags = SmallModulus\n\n# tcId = 2\nct = bb7914975c8a7817a50e7b3af7d79a93b4de5f9b3ce8a9a15300da83c75af932833d5f662ed58de5d195b4b03b4f70c6d7741bec915bf8077e31238c4d51c6e3c49d1a89211d3e14a3d29ca5e3ac4f9e1d13e22cde950fe979834f12f6ff93247e10da5cfab6b265bc87c8f2a63253ddbafb8ca0c16b07d2b230a78c04747089\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 3\nct = 615a6e86e3d447a655ee83eba8d92e29e08812c5de4816649765457c9b3241498f6308b3b5b1ee54f70642b35b85ff229af8b1e81a48e6e3359a5dd67c34e5d02b58caa36e3be7350481d0f7c5a0af1eaa8eb93e9768e7e1e0eb5c5d75de77c220f41bd03732d4c3a56f6d29cded37752047b5f79f11fd4c4eca39b34ea792cb\nlabel = \nmsg = 54657374\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 4\nct = c3e50252a748d77060deb817e617367fa93ae234e535c7c3155c65e0131c1c249fc7ee8e6b8f58bb085a6a455b63efb336cb6fbc9ff82204ec500026a7ae09c7cd8d361cecaf6fba5fdb265d64f90cecd32b0b3fbd93e29725058e1f689f030373fe0c9133660ec88e1b027bf7ddb5abf3aae80f86c0af411496acdcd89908a5\nlabel = \nmsg = 313233343030\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 5\nct = 6aacaa5bf3d71e04bad9ce95861983d5fa561c1bd4439aa47953d144fc880e82c1540487ab4586e24dc0749cb5d4f9a54854e6f90d03e288c23e5faa4a7a7f9ae09e36dce48428a8a9485123f1bb6d5b7a9bd339e8e799429da33668733dc8b323a29b8014a8eed800b36a783249842b7135e33b1708d4fcb5762a5845b16cf6\nlabel = \nmsg = 4d657373616765\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 6\nct = 0c0166f8e2d95d40d1343c4afe4ac038fbe7654fe7c96abf312e385626830eba877197b931039bd4270147d3480a99ee9b124667dd8a89e3e253234c669d9cb45e35a3465252251ab265a3812923dff495c91c5c50f4bda0b3ba9f9b14565ce78583ae7995813ae9a795c4f7d43ced1cb60e2cf8c1341798f8f72ac397f0bd36\nlabel = \nmsg = 61\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 7\nct = be7e293ee24ecfa696de652c0ece7b95c8cb70b4eca65077616021f7ab5e2e3e6e1115283757d9fae9ddde688e69ad470481459a7db49eab7ba3b77015a5be9e294a2fd5372810d1da1fb6ead5949d44c20be3159e56a9400a685128091bae955c4838312b4da54a30f26481092abe3b7d89ebc249694a09f2a029b333cb1126\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 8\n# Longest valid message size\nct = 163a77d9bf01658d6c74efdf3615a6a44d3d06415a9b6aa7a43d0c8f3907d51a66d51d6ce250431dbf91c22dffb39b6b51f9dc40d9f45a23943ffaf3904e7193816a5a521096c135c6fe6f59982b0c7425bb7a653c9ca33dba69871f29a129be856488c39f19420a4f3a9fd9b6f49ecf9e9cfeb2de7ef3eb57dba9cc19efe0b9\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = acceptable\nflags = SmallModulus\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keysize = 1024]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad60d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 9\nct = 43292f009868017ff514f9c3c04c2bcbe7d39e33b2b39d163812815e7294a87eeae5e8503ec8bd57d1f5bd02795ea3923c396ebffde08f70e9fcab64ab22b70d19cdd34653a265f13a36f832bd2e34f5a0211ffadb4dd353aa0bcdeea19c75290f0f948b61eeb5f41f86b42ed3222be38e2a30b8e568712d786b57173b3e4090\nlabel = \nmsg = \nresult = acceptable\nflags = SmallModulus\n\n# tcId = 10\nct = 583c33c713bf7f920f63add1f9da9051ef3716581c117b4fa41c82e59a45dc4539569ccfb8a86dde1ef4fad8bacfb8be0f73a9e3dbc2c682d1463f8f72304aa181f1c3bf829121d5809cf3f57ad295710728cc44aa6ed74e46b0975ef5510e89ff129dd20dbb66ae948b4f633d6fc0e886f8e944df9a2dcb43f48a6b3327ead7\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 11\nct = 342f6040b7f229009a429a9079950154588ac7689aa226b363b75ff03afe2f69a2eb8e2261c6870f1aae8a0885ad5fa612cac2cb63f92ddeac9a721b06bfa7a343670a44afda70bd8e64971699f1136eb95c0e06bf684b850853f073719275accd66f0e1ccc50c6f163b13d4cb5d273792343ef69f547a3477ae5d7985ca5240\nlabel = \nmsg = 54657374\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 12\nct = 75a608f2a58538978fbb1b5b761bee895c10d3ce99a0a5e791d65937098b9ea30586ed1bde62a2cb3e0b4332c5d993e35b52ed28402404521f5b579a5e257b76c2e70d67b6e1459b790fe32eee1c64a5d9d78e98d7a8",
     "513d5dbec7b1c958b0f6fda4b322194d68818747f9a75afcaaf07f8def984aa09373997900b69775db86\nlabel = \nmsg = 313233343030\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 13\nct = a12a689e17089bcb36b9487ba3b0ca55781ebcd5c68bf4a8dda58126a7ffb184633f97790e84905c2e9e2feb8d7fbf6cacdc35869aea943727ee3fbb494ba7657eb1cafb0c6e39ff159f41308d758f07afcd48808280f1269910b0aa51da3027788842df88ad5a299a014a040b4a9c9b54b382d349589ecf24f4acd82698ebea\nlabel = \nmsg = 4d657373616765\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 14\nct = c019f80847bbe0b299b256fcdb1e71b035345fad162969d202c20bda4c7398d14a1a6a8ebe75ce61b718425a72cdf0e1cf7accf1b692a175c146e87e0eac2bf7920c8b218640f8223e536dbd24f93b8455bf6a45f6b200b38b11457491a1bfffb4abcae258e2590bfdf585264f31bed39a0039cd23969ccaaa5da66307a6caad\nlabel = \nmsg = 61\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 15\nct = cafb437c778965cf82ba9e33cfd390917c7fcfd4090e56c70c2e9ffe5863736ef3c8e62a00e61a11c86a100c56c49f8f39fd9d04616d95e2467dcb2c61ca6323c887d78ebf3ff71eb67ccb9cae039de696a47c1c3bea01caac297e3ff14cd6642353d68e3bce9bd702d225959e894a2f996c7e0064ee1a340ddb6071634d0982\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 16\n# Longest valid message size\nct = 59f72eaaffe725a5808f31ab0372afdc2e87f4ee8ba12792560c1e014374c82432128380adf701f4a4f814a8329583abc22dc9e76af568d3aa1539ff41034e17c89450c9efb17ec61b89c2a47744f43e675e870a9fb901ab596a8bf5bf8603833bc12f49d52923f32e4d0af4c908ef75a4b9ec2a6b5475ef30d31944dc2534d5\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = acceptable\nflags = SmallModulus\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keysize = 1024]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad60d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 17\nct = 683504d9d84b2f9eeebda7748ecb59a8ea8a72a283983113deac27e65e268be105019dfc6608b6adb4c68e5a8b945481d797efe72bdfa554eafba55b5d4f2236777465eeeca0364e72f0e0ad96b09e1ccef8e7eb6bc1c58ed90a838f7c9b81517080b6978c1dff0038c6ff944bd084954b6b3b0c3184ecdfd08120455b5a24f4\nlabel = \nmsg = \nresult = acceptable\nflags = SmallModulus\n\n# tcId = 18\nct = 0673ac76c5cd297a6605ea6fa07ab36179ce8d7ac2291ff1ca43078d542b928aa53ed48a9389203be4313a15c4dd476a6d97a67aef5b2765e460108312bf28c8b85433968c82a3127e22a6fb6088c088c0aa428a495ba25fe6c570516457ec68da37db32160266d5cff2b8e0cff69c8ff722cd71c44f80a6085005eb48ad2c02\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 19\nct = 196a786011bdf22c7ef74f04b9104314086a25219803c319ee8d2d1e0669505f61122c13f4414c23da0ba6fabefc94635ec5534eea50d60cbf094ef254622005da9b64ecdd529280e32ef32a1210c827e25e9f851c235a7d1681cd0156bc7714b22819a8ab99cc647ba310998dd3ba11a2d694376e111101e781cff6fb0ee52e\nlabel = \nmsg = 54657374\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 20\nct = 73cbf741e6ea2ff7d90da94f6b2b0193948f3bca2fd46b6d3d1419a70628523b78325e3eb1db07f504e0463612ca04a10badca665cf032332e0cdde7577e1f54710588db2707c1606abf8e84f2d8141e4f09e63e198827824bcbc82673fe2186b8489b4e9b52c30e536705cefe652954b97fbe7e0bfa0bfc3f8b51a762806232\nlabel = \nmsg = 313233343030\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 21\nct = 9a05e365b558644187da88d6d54ce54ace67beed3b727dbb59bd3ed1f72ae4b8456c85254416efe608e2073ab3010fc7c2d27f157e9234e4d5c7f49bb89750819887d784c6ccb51c7f59cac5e04375dbe42b18f187be137befa13ba80c89605a18b8d838ce7a899e4a3145107d23cc55860e5d32187e0c6dcc946d11578c6c9f\nlabel = \nmsg = 4d657373616765\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 22\nct = 84084b95130f1d91ba7444c045898f8bee7917d9dad6b59b9bdcb204e5ee8a142bd94b405ab42d859bd6d9e8338a202b67c2551a539201d6657eea79cdc629125515560ae5061477e5c7efe0c4aacd36da41ad126aa630795f9e105ee70fb77fea7a2b371907afd415697fbd570bc3f414f4b88e271f41be1223c29e3d72b21b\nlabel = \nmsg = 61\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 23\nct = 52ab5613c4ca5fd259398258edd48186c9007cb99b11915c85060e84975e4de2365723315ff4269ddc37acce4e809598b7adcef464c0973e8ad12037b186c74b2e1e76212421b127c2c1d56c6e69d353a7ce52531c7a1d375cb6a0e358c86de3798378a09c4ffc38a4d27adcdbfac6211366890a75692fd2dab14360717fa415\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 24\n# Longest valid message size\nct = 1d79894e48cfc27e8fafec2f2f59fea5890569201172ffe68ea13fc3918ea0eb0e5ec1c3265a39acd5e1d210883359ee35c33d18206aa8d59c1a0459de1282fbfcdcf09a2c0d3a849c048875240b9ff1452f57a9d45148f838dc0b47dff2b52e0d93760d7b4e1f0e389abe425c9c167dfbaa3ca0196e660814986572d1878cb5\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = acceptable\nflags = SmallModulus\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keysize = 1024]\n[mgf = MGF1]\n[mgfSha = SHA-384]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad6",
     "0d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 25\nct = 54b9f6b31d9a10c7534d156f6f07dba7310a714a4b3b1c7b7d325825cf30ff36a2dbfca7c740ea03304e0a1e270e320f2440504499c312b4f4fd46d8dba78211b5b1938e43dfe386605d09c8c1c90fe2cf0f8ff7f7be04550914217312fa4105f13709167cae9a0f4076b1d07316f7347bb01e33d71bb0b7ed1cd673433a1ed6\nlabel = \nmsg = \nresult = acceptable\nflags = SmallModulus\n\n# tcId = 26\nct = a7f2cc65230e26da285af8905677315578b2d4eed37c8eff3c649f5f099c28d5184509b6ea5515bc1b15f7c0baed4323dd600f13d3831613b923b598c6446050a13fef00530f475bed55ec8de81e7badc5a078a2989e4b66ee1909793de82fe3bfab63263c7aa8bb74dc4afa23723982e65a0d6ebb2f54a53bf2bdd2c7c410c1\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 27\nct = 4f23774e0e834c3c94702652a3be92b3007b830b8650f517a5d2c690161c0a802f49fa9f896ee4de4c02370e84f66b8289d69eb828eae7ae2aad814770817b31a022fefd33e18197dd4f8991eae93292d9236858266944b86fdd9dc33170bd8a5f9c473afbffc88c51870d2ae39deb343da25afc2569bfede7177c92e80821c8\nlabel = \nmsg = 54657374\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 28\nct = 110f46bd1e27da8af2ce52d4c41171cdfc0c6a69f0709826b5c2de86e716ad41401d75442f849a06522ef7ddc0d67a99c06d5b6bbb8fe00a7bf5b470793bb65e3ddd761b7db657ee2e0fbddd1bf9e2441515e11717507eaa4a868378b888eb17ff4f02221c84650c2c41ce89d95e399f055ac70e3698f6836c655c44435090b4\nlabel = \nmsg = 313233343030\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 29\nct = c55786f3ebec1657da50ebd20d4a984ef54d89de99defea0de73db7e348dcb505945fe5af43a319f38d47c9fd1fed3c6b5e91961d1cd8185b6021293f208499848e5ae2bc7b24274fdbfa2d67dce5f2fe986d4e4ac7067979b51bc220441d2da2c9123c5526200d57d81d993480d6ae622f2a1434b8387c4e641cb632673be9f\nlabel = \nmsg = 4d657373616765\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 30\nct = 8637f6b594861442f04a9422df3ebff415fbca162712c1d69e83f6b05f8ac8214893e815fbe46b29ceb901830aa1b5397de66c0fa9607ea758849f5cd67571e3acfb0c614cc59512192012f18cc7a8dadd153cd7838572f921907b11b4ccc8e67614490a3e4769321f1e6330470bb206e81107c012d151512f8650b60c61381b\nlabel = \nmsg = 61\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 31\nct = 91a7ccc9d2fdac9e8b9697e0efb4f67cc1c1f5083201057e7405c0a82a5a91e3c6edec26a406367721c98be3baa7cccb5fd2a08bafc4f035e7e4c664e544611e0e44daf2667b26a1aaf84006c47661cc483d4ee031b35cf33c5205f26aeaae9606345d51b742aa5a09bc1a51b739a71aac058f9e69c4ead478f47597fb6a45bd\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 32\n# Longest valid message size\nct = bb0ff1cd0900a210d44649909b503a58e88073c3f1707d3be68f3b8148229b789c4870f5353a38f0550842cbebb7a596e6c458809d94626c3d2b457709990ed366fa1f66a0eb0c144b311a873080974f9e5a681abfa2afcefe43f59115fd3fb9fc2d2e685f3ee2ac686460bd79a88d90d2e5abc6853ffff19bbfd70333bd008e\nlabel = \nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = acceptable\nflags = SmallModulus\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keysize = 1024]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad60d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 33\nct = 2599294707d4888914f7f4b9634dbe1e471b10e3e8d43a988e853dc9943bcdca9cbfd9d44a780d6ab9df0617795585ab91d4c2d1a0f0e2bec78ac137902a2e1a88b165396d02a24beddb3905a6b3f031a2fef0d803266b170e435769f248c3e6c122f404f32ff3c450b38c608f12ff70ed46657d2ceb1a277b8ce418a7d9ba73\nlabel = \nmsg = \nresult = acceptable\nflags = SmallModulus\n\n# tcId = 34\nct = 0daa2be79921c08cddd40e536bc38da267157f22cacde4e9ad36730d616b86c734a7751afa3d7678cc7e173bdd3b9afc19c2f4cb4cae58fe1d623685026468673b36d268f170ab500d974b57536bbe44f544b002101b7ed1b4d342c18c2ac169bcda4219490bad3e645cf5ba69dad96860cecf559307ff0d293ab30dd330f8fc\nlabel = \nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 35\nct = 82c311c219ed2bd02be97da106d14f01e3292595f16afc6e61cf6d55202e7cff585fdccb56eebd86d03a04dc76069d1f06d3f72b59ebfd9be08ed664045377434311f83811163891704ed2fe0d25fc813b2df2718c4e32cd74fff8bec4d554ff72ff5c6420b2b76c03286dcfb2a662c8c66a86b04e61863d2ed379baede9c918\nlabel = \nmsg = 54657374\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 36\nct = 09cb258d6a5090a2638d2217f3c6535def5a2a05f97a2606f608d3ee10f7a6077f44bb63eb8008fd6d797937edc31dd0d5526cf24eda0191c4f48fdee02bcb731e4ecf09388df1d979c11fb841a0ac0d017334f6ec9f8a9c4de822c232faea803eff6225769a39d68206eead6414af996b1969f2f8d6bc1c3400f6fc31bfa8f9\nlabel = \nmsg = 313233343030\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 37\nct = 6daf23cdb83c5d16be94c4d9646081be49dc1db87287bdc534052d6848c5cf47584ebe6ddba5767f445c11010e019352472aff14343df44232784dc2adb135455ca28a03bb69e865762afa850f907d89e14e08d9a81e92b0852e99d360804cb0857e47b4bd2608838d6f81826d74d17984f805d7de29fb475ab71e5bdd057612\nlabel = \nmsg = 4d657373616765\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 38\nct = 6a397116dfd443619d3acb576c282eb0ee28b2ba901694c5459817909167fe1c9fffdce119316fda91e0f5c65ea4eecc595a18bec9a718cce8281fc4ab63d56dd82bd835b86a8b91229178d52ba4467f74a161314abaf533443efbe08270c1581caa5876eade4d34f48f1c9411aa089bb4a3370b92c30cd918bcfda92108e083\nlabel = \nmsg = 61\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 39\nct = b399d03b2fa231e85308c6c45fbad1aa03d7f328bae29e94a1c4e6975238d1883a343ac5c49f503ff35472a27c843d56cdc7c962c8753ce2229b2ca37dd9e24e3fa3f528787eed3c8980e9c1b888b093079af2ca69eb39859cffc31d66d0dc245d1213c7f54edb769bcbf0f10c6833967a7d13099ed99ed84154d505d51de912\nlabel = \nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nflags = SmallModulus\n\n# tcId = 40\n# Longest valid message size\nct = 149bd74986f0b9a4910723216817870a910c157d65df96d991f5dbf144f9911ceaafd2fa799b58d7e56971d6db66d3b23d1232ea0fa5be2467eab1c9142a898f0ea53f2c40702c42b2a7c0d987c50a6d4dd54ef27238f5d708e77954170631a9d52a2f54c79a4bc3edc8858da72752ad472e869782783f3e91ae36c176890190\nlabel = \nmsg = 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878",
@@ -3823,9 +3922,9 @@
     "e33a4e0d8d02d15628a0a3420429cbefeb8d4128cff26cd051b7b4c4bb0ab6aed614352cf66da8d7a7b00e46ac9ff86251f7b85c044082971c22e343b401ab57c978250597e27fab6ffc7f1d18cff956eaaf9c317cb82b32f342099582e6c4ec53d7d31fb4fe7b5394221b00e2fa6cb5a1218fe0db3f3fb5570d2601507a7b5bf75dc6f262222e755bf22b02391f0361a189138af6f8c68117bea1035f384452841b7d91137a970d9dfba0e194c8fda769c05ee3f82da90ed2fc9d2edc8953db5b293b3e55065f5e6ae1998f2\nresult = valid\nflags = Constructed\n\n# tcId = 771\n# em has low hamming weight\nct = 85e36c189212207dd67264ad00a49e5eead977895d106b9551af968480f5e64226cccd03ddc2714a6b85421c6b8ed498073aed03131b9f61416e50f94fc2a0b115b70218b10980cf3f84d3963332d7728b566ff6e6c58f505793d380c9b33420912c8341e55ea0b4c141f1bd28d97de1a8a651b55388ac26d0359d6aafade11be18e1a9b090cbe11032025c18cdcfc67b209f543f7d7b5d5fb92ebd1c989ca78c4b285ecdc1311bf2ffddda98449c0b13de1ecd80c120ce982a9b5b85cbf8e93eb8bb17821d69811faefb6c9f4992885e8fdb2375f68bb4bd3d183e2966e5fbe425a582c13a143622c043027e2d35f6574d58cb80b2f006fb94163bce16ec2e540024ee8da188547bcaa8d579642d20c9e06f7eb29745f99c4ff0a5ca6a815de406a64887603b4f2c65672dc279d987aba84b3c7f37a9bdb9b0742d1f62a50ec92b8fea87c5ca84aff9943fa6a34d656820e1bfcc5895389870cca6f49c2e3b16862b3fd8f12973ab778a10659ecefd945f1b13d9c8bd5be10a8817819f5dea3e91dbd19032bf339a325e18727beae8a3a1fcc07691931e274ffafd4ce98e1f4ef3778f7254ef748b87237bd54082d2340c3ef3b628fe9fac36ee4d883aa6876a0151704eea3a678fe74c23860bfe610f15207bddcd681c65efeaf7dca35005962b57d0e463b77e430ec9620c9aa16fe67d1357bf23be23d\nlabel = 798250bc59a7dd01906d16cc87b8741d16a7a2168648d6a7d51e0af8346347d700000000\nmsg = 38854b2bb70035c630eb18f92cdb1333a14781df75d9a6fa5df90a9f307ebc1cffbf3575bc023a390aa5b33488592d80753b0707bd600f089522189fe3129834480d5f9147bc33e5afb7ffc5bbfc1f6d7b87954382cb8af5b56baa01898d06130b5f25ff96ab9636b27cc4ec040c5c7c962933fefb64aa53799a81300a71bbcb5d45a29ec4f4c4f20d16aab39cbca96f786797bc871efdfa61e36ff896599417d33c0794e550da399e38e183115aa9169008be498dcbe8d13ce1ab10e0a4868e86f4c68fa377a119679740ff2fe1633fed84b8e2a59f33ef3a2f13cc2f904b0a0c2801a10c7d16b818c0a0b15dc9b66588991144e8ebd1c308bceba8cc36b7b417f0ec2d6c12aaa91970802aeeb2f83e67ea7f85ac3257087f19b0cd37dfccd7ebb0f40c86ca954588a92b44626d3281ba5af5c4d999981fd48ceb634757a338f969d5ce09f18dc24f7cba6de30e47aa5e8eadd957f3c121c73f32918d2a0e61f2469a9de31363f28ca0cc85ada3301dd9f4de8cb3551fc19c82aea08fe37c80fca221e54b58db3f4ddca8e89cdd30490d092f8c270bc54c23c7a1095a390c3ef45b50e59328e28877f81bb05c2bb97c2f33ceed6c83\nresult = valid\nflags = Constructed\n\n[d = 0082a411c8b1fcc0e52f27dda23b1004f1f68f4ca36b3d4d077bd6105d63c4f42c676d8fc08e031c9297617a2c53c602a207046f4b5de2f1f78f2054466d42fee730b0b95557d9965ee3a96d870b0cd882786d8287d650cb5f6b1bdeaf03c9c4bf1aaadffd747d725cf58ea9d184cc0cf4475064df227a57d8a9493f9b1eeb60dda43c3e89a57097f5a28e1ae2fb63c62b389d216dd055aa82655b01b2a0fca375aaf5dfcb179e9141c88aa3f5aa4323f3779101612505f06c60ef5077b2a46d5db7555ac0eec10f4c91af2cd605e34bdbac1548424c878a91dae7ea391c95a85ed55318fa5e9dcd464a11fc5425df5da1d1d33fbe659dc98138bcb73f2f85f1416dbf30dd4336733c04534da98aa1b333fa0444a4b337ca5368467dfe256d04d08aead94e39131110db422603fe85812cd15453ed02197f7c3ea38a84bf2eb21d8390acd3f2e955d7ec84286987b28ec5aef7929701dd466c7c1bab412e1550c118696bf47b3ca98435e5374852505188b8d70e46cd1b60553a5f56d2c6c47179009dcc01]\n[e = 010001]\n[keysize = 3104]\n[mgf = MGF1]\n[mgfSha = SHA-384]\n[n = 009ce4a11414e91683314b711e299ef58d817c68ece20f52902009d096bc7903250dacac14afd27d454d4bd21c4257f85820448ec74b5d5458246716f04252114873e3b19c867b00ac4e3b1ac1797c5fc0948a4095a1e87c8f5f6daeb754f2324d6ddc935c09a3cb86dfde5efa44002d563106891ea4e67eed97b4cbbf462fba0355fbb9adea1589f40ca565c04bb0ba23bb3ac683b9db0e7b591d5de431b42f174fee1c8e06adb78609f4e2654ac433fd721d3621b8c65de636e9ba769dab70079a5aafcbc12257381f14443892fda063ec252fe3934841c766208945e310693e735ee817e8639a8a9eade2f2e0112a845c83470349c32983e8b31407aada9e451f6973d47e39428da5c820681b8faec473e971eadeff14efe56e30060fead78f9155f5b9fb0807c0b800123f03c6ac5803334f6f8887304913198d98b2a97f0876ff24c3dc11644f6a7bf0e4e3a2aaad04ceca84bbc22823fb6559e914bfa9e1617f89dda2e90780ac15f12431406551b1f46e9995bb47eef70f6dc1d0e9929a22e5be91]\n[privateKeyPkcs8 = 30820710020100300d06092a864886f70d0101010500048206fa308206f602010002820185009ce4a11414e91683314b711e299ef58d817c68ece20f52902009d096bc7903250dacac14afd27d454d4bd21c4257f85820448ec74b5d5458246716f04252114873e3b19c867b00ac4e3b1ac1797c5fc0948a4095a1e87c8f5f6daeb754f2324d6ddc935c09a3cb86dfde5efa44002d563106891ea4e67eed97b4cbbf462fba0355fbb9adea1589f40ca565c04bb0ba23bb3ac683b9db0e7b591d5de431b42f174fee1c8e06adb78609f4e2654ac433fd721d3621b8c65de636e9ba769dab70079a5aafcbc12257381f14443892fda063ec252fe3934841c766208945e310693e735ee817e8639a8a9eade2f2e0112a845c83470349c32983e8b31407aada9e451f6973d47e39428da5c820681b8faec473e971eadeff14efe56e30060fead78f9155f5b9fb0807c0b800123f03c6ac5803334f6f8887304913198d98b2a97f0876ff24c3dc11644f6a7bf0e4e3a2aaad04ceca84bbc22823fb6559e914bfa9e1617f89dda2e90780ac15f12431406551b1f46e9995bb47eef70f6dc1d0e9929a22e5be910203010001028201850082a411c8b1fcc0e52f27dda23b1004f1f68f4ca36b3d4d077bd6105d63c4f42c676d8fc08e031c9297617a2c53c602a207046f4b5de2f1f78f2054466d42fee730b0b95557d9965ee3a96d870b0cd882786d8287d650cb5f6b1bdeaf03c9c4bf1aaadffd747d725cf58ea9d184cc0cf4475064df227a57d8a9493f9b1eeb60dda43c3e89a57097f5a28e1ae2fb63c62b389d216dd055aa82655b01b2a0fca375aaf5dfcb179e9141c88aa3f5aa4323f3779101612505f06c60ef5077b2a46d5db7555ac0eec10f4c91af2cd605e34bdbac1548424c878a91dae7ea391c95a85ed55318fa5e9dcd464a11fc5425df5da1d1d33fbe659dc98138bcb73f2f85f1416dbf30dd4336733c04534da98aa1b333fa0444a4b337ca5368467dfe256d04d08aead94e39131110db422603fe85812cd15453ed02197f7c3ea38a84bf2eb21d8390acd3f2e955d7ec84286987b28ec5aef7929701dd466c7c1bab412e1550c118696bf47b3ca98435e5374852505188b8d70e46cd1b60553a5f56d2c6c47179009dcc010281c300dd60b390ed7e73bc47d85692928b6a7669b75ac07b0d2d5e2aabbc97dd4f26f4504ccbac15fc18c8681e24241af32fea58e247ef47ff841fd88cd482685b24de080a373a7b2fb48300b997e911569f64129dc02092b51b0093addae3296c47a5388dd6f8cdc258c7bfa1cde81e97d01f198e6d05312ca8b9c58c2a11df5ed9e6ff75cd6925c52738278b7283ec198ff2c50e793e8e6842c23121dd5a702d312f6a0bdf29dcc932f5f58882953423176aadbf02dba57915fcbc2356d7b6d0e7a4ed410281c300b56e27f9764f02ffafd4689a3d1d1fc4ffc5c0d9d1b052394c72840963ee5eff90310b07cd6b45b0022439755aceaea774ba8aa99cfbfb9dadf8e007faa89329c347181236496485359d0d6eddc3c8e9f9ac3119f02b91e2e94cb63f1fa6bd4c02843714a74d5ae775d6d4422f7c4e99e5b3980bb3bc2ab9ceecc0a503f67720c8f294d15362e36b781c186a3c97c6076bce45d5853e57eb61dfed7e5db0094a28fee6df90a4406a9e3480adb2a972ddbf61a737dbd6f0afe961cdb8982f48326d510281c255e3d5e76ded78d3dd00179ea892c4cc8a79a41137ecc5e45a23e578fa596260b9e301c693850acc7e70eb4ec2d2058e23cc2f62ac097be6ab2b00ac53f6c0d810407e6b072e5c17d3a92e423402eab675ee94834ec84b60aeeb6e186292eb3d3432fbebee50f00717d79c3ee9d7b6dcca1a933bc7776f431c5d245968d3b131497e18232a8f52871bf8a386818ced67a082dc11a448d955e4a021f49bbf3ced0b74edb19d42c6addd0488bd80cbf8a2e02452e48b4fee72ef3fbacad8d83677abc10281c30089a28076d1d68ccad56388db0163b7b725e5aa3053cfb400bdcaddf995b2bea497896cf9c54f0cb5c25a22b0b16bbbb95367344c09c86b102a6b73e0f9b9aab272eedb06ede1ed7cd4b848f98308c4c122e40af7c767f62b329b3c6254ab944d365780c58d49b49d849aadb96bf69c5649985dcefad1d383d3c36d3d81ed16606bb1034e6d38c697bfad68a42745683837036b9cd890fbf797ef5d6690c23bb9e3b1c40973dbf6f62b005f61e5f8802852c84d27a601bfe363640bc16ec9e7b641910281c23c1346eae095cae1ef1feacd06a4c4d2f1ee4b135c2b7f3d22dfc10de6f4f67899cee2504252b572009a8fb80e807fbcd958f45a5237cf066f20788d8abfb76022032b6ad878160d6274c654681b9e399441fb0853c92f403cff13ad21d3ce998026e21bdbe3d98033fd1582169915b67c491388d41cef393ca2f2f583aae732d5d87a4561cfe160fd49a205531a03caa174ac48ba94d18e1b618c4935ecf562736897f2f813a344154387c4cd524115d352f8dfa10883532db127d4dd99258dc2d4]\n[sha = SHA-384]\n\n# tcId = 772\n# em represents a small integer\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nlabel = e3ed53a6f0f18a3e6a90044cfe6bf4efd1d3132cc274e37a1d65f5d86b7f0f44f3c924f714cb548c3e0a776a56c5ebaf00000000\nmsg = 6ce8486057bf0af47682d34def751d65a7cdf2edc2e1518cf96c95d125f17618b9a3fbeefe4b1c29ec258cfe3169aa771b3772c4997e472d65da3736e64120c1cc68110e5491fefde206b71a14cc4e96f826c1af4dea1369d6f29a32c9fb867c8910ffa786e47729ca862fb0e1b3b48700299d591a8cebdf0d8a2c622253dfdbc51fd554dd08d1bc4043b65aacd335b48490779be1b2499a9478415615ef70961421a4bed7be61a42825073054af2962e67d71201c094bb0ba924cf97e6e81dc4ebd9a8ee33030e2356b8e808a87b0cff1e91897aa241e7d1211ef464cfdb18a8881b59e346702e320abcaefe4e9f156fb589d54c340d15970729f64029341f2ba1b2ae0dae77be3a55122c85fa86945d41b1f4ab8411426ffed8fa632e75f609859\nresult = valid\nflags = Constructed\n\n# tcId = 773\n# em represents a small integer\nct = 1a93aa7065475280bff152e46394d26f07621a1e52972f0ee81c4f02985d276904c372f385c0f895c0f719ede146e397ad8e6c0c270d9da4f906c256c618d10cc581f4fde6f44263968f2eeb1b8c9d9240ea0976b8f4dbb8957a39cc598f3b31a69ff5cdd21b11dae9e0dd7929adbd6bcf5a34de85c99f2810960625d8ccb179b379296a26acc62c052f586ff31cead363a717c5726486fc1696a0c2f9d6740709a66f51043c318997911a87770afdf578c8d0c453028f2e597a3c5fdfcf7d039619736de870d84ddba29dad9f590483aebf4b84bc8b717ea498981c279c919c3ef70aecf7bef0fcd9536d340f43be884b3b5ad0b3482718e2132916cd068571b14694c4f6ee8433eaad6a13f3c4ed896ab0fce11b1b9d50c6347acd8ed088ff67aefdb19cba937e07d0705a6c8ffcd011629b33ad514510d5a3a31f53cc5f90817d5420472d554981b0bb9a45673e6fa956937f9f9ada017bc0000e5b6f5c578bc945402b216301afe6b25a1a961efadc4cd3aaf8bd3d4ec77fe13a554be5d73a4b2227\nlabel = f8343ff86e5650448a1a2c372b1bda8bf512701713017b61daa782751d0e3768e87e7b728abd485d2055e2bae4ad37cf00000000\nmsg = eb910d54e051c09090181c1bae07917b6b3b3f57a6a923307cb23f4d5a6e6f4ed2977762ddccefe94f439e9f44435e53180045f45de15320a30ce0139460d62603f53d66d59aae95b7000f0fb3c5d621d3583b023b69873a27fe52aef03ce6afc9b97588161d8a7c0a8fd4ed55174db1aae9e33649c5eab7d930b51f8c713e26c5bcf394a34ff1b893a409bf17437e0330cf4361cffa0e01aa3db7440b7c8c21d9c25e861eb8dad94f11e615efc251b37c63aca012fe778bd14e15a641075c8cbe4e497b4dbec93f63f8bf0e88a3e8e7f7a7aee334332db62eeef019f1ed55158ada3f79a32bc5e48f22b2856805a382b82edc3ef3cc492dad3519657b188e23a1b56155a3789dd2335759757412f4fee48f0aa4dbbda3914fe48c38ea08e835544b\nresult = valid\nflags = Constructed\n\n# tcId = 774\n# em represents a small integer\nct = 317931fe3f6a8b1f899371b89ac3d2497b91536b82f75179c593d8f5d4ec36284caf5587e49a9d1a4ac89ae6cbe6f2da24eb7a0fad03fcc277e0827a3c534fbc16f173cfd3d31279d229e50ed64e5ee7dc0baa5e46a3e9d4e79905cf87d85c2fbab5dda6afa8b9a08e3908e208231b5d5d56fade069077313c6f9494879b59092697c4f974377483ed66fee87431aef2b900896345c7072d705903497575fc22aaa3511a446ba3bc0f8118e3b74adf25c72a56495a5df1c96a6fff13410e7178fb32e5907afe85976b9764dedcea2d4f79fd3570a71844dff060084d8637d63577310d33741265e18641590c0a0a2909f8744aeb99cf97f819d614c751cb2c9158cfe0e3ef4843ffb7ba93958fe8e4cbe807274cb9c6d6b17d12200bb83b64f3a516eca3cbaadd70e4c55c4bb20346fb4f89f18ed70a829518f1b8864e1a83c5db09ffc880667b1ae30f936a30fa40afeb7f9471c4c7199ad7546de568c207de8dfe2bad374d7d4c5bfd7dce4398b4c971ca5700b13683d24e1c0a6d4f487e1f2cc86108\nlabel = f690520506e109069b536e670dec5d61bfb9f180291116fb2af2cd5f27bc523d9e820b145c1c03bbc9926a0629c09d8d00000000\nmsg = 0dae1d5855fa986c2b65cfcb24c2e3e6f84f8ecf91770c501ddb00b7e274389f5e7969dd2a1453e5bd1050f1c7961d35863bcefbffed80f16b2e5e282a0b67012a8ae741efbaddd1e062ac88bea714efd456d9a681c3baff87cb274d07ee5b9f75961b8d45bc2e3a69df97e477178e6e83c2c56e234336f3a219cfb77f32673129d1c3417e20ce9cdcefba9fb83375e0741bb66cd1c66fe62ae1be792a8a76e07e182ce6bf0116ff011810799412cafc477c99976222425a8843a457a3bf80c201bbc3976f13ee9a9b7fe378561b07602b3a2279af35ab5052b4dd71956a19656394bb2f89c7788cd642e3162a330c2231169691b4eeeafdcb63dd7c031f41b236ef579dfb688b0e6a4a0f7aa0c749196f154bdc8256e035e6ec5baeb3ab401872d0\nresult = valid\nflags = Constructed\n\n# tcId = 775\n# em represents a small integer\nct = 84484fe5185d8a4175d1501e8337df7680a210288677d116daf6828c7ac54fb635d29eeb745c517ce98ba08e1613073b1ba012605710cfe22b44d91fb95a07c261eb26afcca8385b0538e76dc4f0838478f0a1538c2cd12b53caa64b3c461f7abc5c01a2760f668db4a92451529c8c3fd63f4e3d15c47e7bf321fd1b90cfd1fa304ad289f36c5700f5289dc20c617e3447e59a6f590ddbacd194a42d44be825ae0558e0e0426b1ea46f86bcb746c643fbe87ce6d7b794fa3e575cf4692a457fb151fd1851f6268705cac43ffc2dca0d50fc1b1fee634478e7bdc5f64f00e53ea9dfe6fe13ae631530b87bdee1c33854e5091b84bafa460617c080bdd06ebbdeed51e9d91739ae2499fac61f980bfeaba7f190eda34acc3b60054afd731d51aeaca0dcba0de614119d4d30a7c6672f92752d0328dd926a05bd46640b98857c82388b4ee20450db739659997aed252d843c6ba8ee9f0616703dd8b33fd4c346593f325051c347fa4302534bee5dd669ab0ce33d210d0d72470e41403f05c812920ee0f603c\nlabel = b60b80e37f381cf571ed38a78823b59f0490163dbe7982f1369e986af48c8638c7937bd7302dd0304aa280e33c2bd03500000000\nmsg = a8ca5ddc13bcfba53524e57c821f4d1a979488b090c1bd30fc08ccb1e9c75b6e9011e7870ed5097b15ba4b0cb7762a52aaf7e68846216572ae70bc2057669d1b3e28deae3086c2309ef24b6d1338364c42c6bf2a5e504e2f1eee10ef2bcdd86054f38f04565fd1279b1a64fd84614b50f0ab724279398b100f10e1d64b6f83773e1be8877f1bb177a3dc0819d2440fc18e0fa600bbdbd6969213ac4502cea518b585dd53d2cf4775d96badc30c6cdd8df13407f5ccd6263b5d5e97a810cf14ab7330f744ba9789d89b56fe4a1d9808c5f65b5ae7c6adc55efd5626506f36ba3410d7ec8d33e69a8740563b57f5f1d612d0e4676d03fa2e0a3b87cf03893a3637b44cf05fa1b2bda733e15b633ed0c8d2e8049a49793ccb77c04874c9c992021ced72\nresult = valid\nflags = Constructed\n\n",
 };
-static const size_t kLen154 = 164058;
+static const size_t kLen170 = 164058;
 
-static const char *kData154[] = {
+static const char *kData170[] = {
     "# Imported from Wycheproof's rsa_pkcs1_2048_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[d = 1a502d0eea6c7b69e21d5839101f705456ed0ef852fb47fe21071f54c5f33c8ceb066c62d727e32d26c58137329f89d3195325b795264c195d85472f7507dbd0961d2951f935a26b34f0ac24d15490e1128a9b7138915bc7dbfa8fe396357131c543ae9c98507368d9ceb08c1c6198a3eda7aea185a0e976cd42c22d00f003d9f19d96ea4c9afcbfe1441ccc802cfb0689f59d804c6a4e4f404c15174745ed6cb8bc88ef0b33ba0d2a80e35e43bc90f350052e72016e75b00d357a381c9c0d467069ca660887c987766349fcc43460b4aa516bce079edd87ba164307b752c277ed9528ad3ba0bf1877349ed3b7966a6c240110409bf4d0fade0c68fdadd847fd]\n[e = 010001]\n[keysize = 2048]\n[n = 00b3510a2bcd4ce644c5b594ae5059e12b2f054b658d5da5959a2fdf1871b808bc3df3e628d2792e51aad5c124b43bda453dca5cde4bcf28e7bd4effba0cb4b742bbb6d5a013cb63d1aa3a89e02627ef5398b52c0cfd97d208abeb8d7c9bce0bbeb019a86ddb589beb29a5b74bf861075c677c81d430f030c265247af9d3c9140ccb65309d07e0adc1efd15cf17e7b055d7da3868e4648cc3a180f0ee7f8e1e7b18098a3391b4ce7161e98d57af8a947e201a463e2d6bbca8059e5706e9dfed8f4856465ffa712ed1aa18e888d12dc6aa09ce95ecfca83cc5b0b15db09c8647f5d524c0f2e7620a3416b9623cadc0f097af573261c98c8400aa12af38e43cad84d]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b3510a2bcd4ce644c5b594ae5059e12b2f054b658d5da5959a2fdf1871b808bc3df3e628d2792e51aad5c124b43bda453dca5cde4bcf28e7bd4effba0cb4b742bbb6d5a013cb63d1aa3a89e02627ef5398b52c0cfd97d208abeb8d7c9bce0bbeb019a86ddb589beb29a5b74bf861075c677c81d430f030c265247af9d3c9140ccb65309d07e0adc1efd15cf17e7b055d7da3868e4648cc3a180f0ee7f8e1e7b18098a3391b4ce7161e98d57af8a947e201a463e2d6bbca8059e5706e9dfed8f4856465ffa712ed1aa18e888d12dc6aa09ce95ecfca83cc5b0b15db09c8647f5d524c0f2e7620a3416b9623cadc0f097af573261c98c8400aa12af38e43cad84d0203010001028201001a502d0eea6c7b69e21d5839101f705456ed0ef852fb47fe21071f54c5f33c8ceb066c62d727e32d26c58137329f89d3195325b795264c195d85472f7507dbd0961d2951f935a26b34f0ac24d15490e1128a9b7138915bc7dbfa8fe396357131c543ae9c98507368d9ceb08c1c6198a3eda7aea185a0e976cd42c22d00f003d9f19d96ea4c9afcbfe1441ccc802cfb0689f59d804c6a4e4f404c15174745ed6cb8bc88ef0b33ba0d2a80e35e43bc90f350052e72016e75b00d357a381c9c0d467069ca660887c987766349fcc43460b4aa516bce079edd87ba164307b752c277ed9528ad3ba0bf1877349ed3b7966a6c240110409bf4d0fade0c68fdadd847fd02818100ec125cf37e310a2ff46263b9b2e0629d6390005ec88913d4fb71bd4dd856124498aaeba983d7ba2bd942e64d223feb7a23af4d605efeea6bd70d39afe99d35a3aa15e74a1768778093be0edd4a8d09b2def6dc9b67ff85764625c2e19236db4c401ce30a2572d3ecb4f969b7ad19c522c02d774465676e1a3776c54d6248348b02818100c2742abcd9897bd4b0b671f973fc82a8f84abf5705ff88dd41948623afe9dca60dc6543390767feaebeb539576ee8bfa61b5fcbca94a7cef75a09150c540fa9694dd8004ad23718c889049219369c99f4458d4afc148f6f07df87324a96d9cf7b385dd8622414a1832f9f29446f050c2d5a6407649dc41ab70e23b3dcc22c9870281810096a9798d250263400bb6277342881627e07cecdf91187b01b89ff47314188a7c20fb24800156d2c85d5666e8df6ceff9f9804ddfad80ff5767de56ecc029c72bf6c717df9f64daafc29acf9dc7908f9a0ad67e20e8949936ccba18d021a2c4febb04349a2b2047c4901385b6e5d0c691d118b33f81802b32ac272ef09e42fad50281800554f41b0b87f68a45722b3be0cf4ab1e165034c1a91002ab8f29e9ef9e2dab6fee7b2455bafb42037e9d2f7e533f348a147412fd72080be7c2633f5d802c91c39e6bcece3e675e59995033c55737020dad9e8b30d04b828adfb9304ad54a11a35a4f50709876ac5b118236ba76a4d7c9a291dd9607b169de1d182385691999f0281801c640189d9bfe8c623833210a76c420c6f44e5d760e259916cec2ae2b156456960fd95e2747660c389562250f055049cfab7e5c3039549384a7a2aaeb1c824d3af709482a8cf9b587022a00b1f0722db50f33cb26dc20dd2245d5265df61ee2983c938c2167dcee121fc4b4479c237e728cf633ab60a8c0ecd04fce7e3baa559]\n\n# tcId = 1\nct = 5999ccb0cfdd584a3fd9daf247b9cd7314323f8bba4864258f98c6bafc068fe672641bab25ef5b1a7a2b88f67f12af3ca4fe3c493b2062bbb11ad3b1ba0640025c814326ff50ed52b176bd7f606ea9e209bcdcc67c0a0c4b8ed30b9959c57e90fd1efdf99895e2608095f92caff9070dec900fb96d5ce5efd2b2e66b80cff27d482d242b307cb813e7dc818fce31b67ac9a94501b5bc4621b547ba9d81808dd297d600dfc1a7deeb061570cde8894e398453328740adfd77cf76075a109d41ad296651ac817382424a4907d5a342d06cf19c09d5b37a147dd69045bf7d378e19dbbbbfb25282e3d9a4dc9793c8c32ab5a45c0b43dba4daca367b6eb5f4432a62\nmsg = \nresult = valid\n\n# tcId = 2\nct = a9acec7e58761d9191249ff7ea5db499cadccc51d29f8e7fd0aa2cb9962095626f1cadae29666f04ce2afd4b650be59d071d06446d59107eb508cc60545727b0567dfb4f2f94ca60b939c60be111172f367dfd235516e4a60061648c67f5536650821ac2a60744be3cf6befa8f66e76a3e7c5fbc6dfa4dda55ecbdbffdc98d610de5667a4f485f6168b52bbe470e6014253874ce7b78e509937e0bc5f02857e1ad3cf55139bbe6dc7ac4b1ed5097bf781b7671ca9bb58187aa6c71c58ac0561c5aacf96c35deb24e395b6823de7fc96b8031b5906a34c4dc57e4f1226157b9abd849e1367dda014fbf9ed4ca515a7a04cf87787945007e4f63c0366a5bbc3489\nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 4501b4d669e01b9ef2dc800aa1b06d49196f5a09fe8fbcd037323c60eaf027bfb98432be4e4a26c567ffec718bcbea977dd26812fa071c33808b4d5ebb742d9879806094b6fbeea63d25ea3141733b60e31c6912106e1b758a7fe0014f075193faa8b4622bfd5d3013f0a32190a95de61a3604711bc62945f95a6522bd4dfed0a994ef185b28c281f7b5e4c8ed41176d12d9fc1b837e6a0111d0132d08a6d6f0580de0c9eed8ed105531799482d1e466c68c23b0c222af7fc12ac279bc4ff57e7b4586d209371b38c4c1035edd418dc5f960441cb21ea2bedbfea86de0d7861e81021b650a1de51002c315f1e7c12debe4dcebf790caaa54a2f26b149cf9e77d\nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 455fe8c7c59d08c068b5ff739d8dab912b639c8e9eade5d0519d58f4ead7208d5a753b4a88fe771475adc82d10ab29ded28caf03f9034d3a111b520440c02276e1b6417c42eec0257f1f05482868987f2f75bd33d1ec3dbc799d7b5bf25c4a0543793a4d3ce305cc43646bc450344e624fd381e24d8e57ef2840dd9d576da554ba408ee6580159e6d88438a28d66250b3b3fe3bc6624406022a9e4ee2778c38230674f635f56b9d6adcf2be6bfab34a8a431169d769876422f7077ded31fa6f29993dd1972b2d2d24b0513a7a193f6a88d53c49cde2c030f85e3ddfbc9f99b4a667fd9c652382238166f3d39eb2b78de53ad24c97699fe5738a7a705a2ab141b\nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 1cf861ef8b6c29474666605d3ddb663a259a9ae838417abcc7f7dd42d471d5f3812cdf90e3041c4c5bfd38ac1e4d95fd71661bddac45f5f8e3e89629a335bbf2eff116030f1c5ace8336cf7e94c2e8bf5a1d6116e54ec42b9da5fc651a41ac8fd38194e5029489cfde1f7fc850c0dfb3dc00021f74ae3847327c69afdb1355c7587bb93d5f4d2cfb35a7f70bcabd43eb32300585b6ee32f14a68c2a08434e923adb76dfcdf3ea5133edffa5ca20425083b28ecb045e69562b44286d320d87285e7a2e3bedded083c010401ae22c8f278b080112c4264a3cad3ed9fa31cf19e052aabbda9f8ecef1d64786258202bb61128b3140a355d65b982b0239764d77d24\nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 8122b33665648346f6cf728f285667cff7f3c20907e76438e64db81a6a5e74c34c5694fb5b4c826067bae94c5176e152eb16884d9c2b63d2ff41d06140c9c39469a4ae05cda86c81ccb208894266f6b24a0f79132f71521e10683faa05c8e68b77dd6c0c04cbfef55a9d1b68291c286e08907c3df029c52e15539027f534c7df8da5637db99355b24576b873c119ff1d74b3c913b70c48f366887ccbe6d206c11657401f41baad9290fe6ae01855a99891700d71775fb36237bd3597ad240fff4c03d1fe599cdec65baef11fbc4889575a55f255b51ec8298595dbcc89659382d35c2b85a941c33746a7937f3d18e27079fc3d2252904aa533fbfd2ebed2e059\nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 18e280e8b03d8588b923842d15fddb0493285ecd7ad2d9a9878045ce615ba07cb811fd4a0737e91ece5a63b70b1edc23e0da939ec654333eb77e956108b040bd6b92927e25a6922d1b92302036985915fedf9fb38431bbce1feee3ec42ff15bc4a4b6d10b3da41ec96667b81163b30b46eef4f46fb22f187da8fd536461e5594bf557a6dfc2337883bee8d6187192a3b4bea70398b01f3ea8c1547f6c57248243365b3c46b117924d8bb6845ea382c389c648d3e65ff0b8711bbe1a6fd3bea028f5808725f198cda0407a0ff46b5af261a37184547250f496800e697290e39d46d6bce67b767d73a63bd98f699c1828180abfd51a3048d050d496236edf1e99d\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\n# Longest valid message size\nct = 7e151b7b34e3b4abe045cf708640e61501c50fdca629aeca10259d45d15eeec6a2008b6336f57021ac6fdad9a6b29d65f098abff76f93722a8e23fb5e153db075005575dad6adccb7c020cd741c3419946b82d369a07fad5b0d55d51774f8991bd65e9e828d8f5a989c866a024a4a78434e9affd0af2c72f9185d450b627008a8a0968fc6373ca340410306a58921cce1207bb6f6c14e3d1f214304f9f6bb9199909e1610322e834b0ce9f55b1835d7623b82ef548545f984ea51466250159344dde902a0f021ba4baf26b16d8c6a42003f4d5dcae531",
     "187dc7e3f87c9e04470599eb623e04fca266e86f98cabb6866004e7fc80b36c3977456e51eb64f4b65f\nmsg = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 9\n# ps is all 0\nct = 6e0d507f66e16d4b7373a504c6d48692aaa541fdd59eeb5d4a2cd91f6000ce9b5734a232d6541a78729ac82152d3a30b51950a24ae379a108ed20fa4ec7542fe2281c2dd5de685564d15182f3c73e9c0135ebc993f5acd240a343d3257997582328c31be215c7349375406aa78a3ac35327226839bee2f1a4a0f8e6e06986cb33806c93e0b0c1d6cfd23f4a68c1f2a38c74b8df70f280984a840c710c52279034d04f61e313d4bcd8b3b5c58468a44565a1acb2eefc6d49044be7163e64ed84b5e7991ecba274a3a7ee4defb842a86ac4cbf2d3bfc9cf870ae025a3e2fbc775916a59579763c06eb84ad8edd1d03787e609ad446de43ebed16330ab06716fa73\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 10\n# ps is all 1\nct = 633546723d13ef2712561abfa5b477a36ce7c8dc5a9f43589ea289a15f749c89e4e3ba3ca6a615333e9bb5ff3efb62b32e7f11870c8bbeffe884a5ef2b1006045bd97bb29699084dac4212c217e10113232683445091fa7224abc02ad37feaf10d5b4af6f288fa01d85bcd944bf411ac56c0b7bf1037452f540f286114b14b2208fb4282b6829c594aa27ad5ef1dc67b5696ed2a4b9a4ee2354cc05315fff5e8a4e0e75675c1eed34d46effa73ea96e748340771dfec01dae937edd8924ece8470542a8251c31e9130e2c5f80152b4c66111df52f7e5f9b40835b44bf8e8e273b075dc04f758a30c24dc2c2abeaf639f4fca4dacd509250378ad0e5276374b99\nmsg = 54657374\nresult = valid\n\n# tcId = 11\n# rsa_sslv23_padding\nct = 94a6ecdadcc3a9c5645d0410929ba8f01c89b8426b889d3064cf1811f2caaa1e1a55a29a1869a7d719226bcea637407bb80383e76b5966e2ea4d56fbb2fb325da12546071b65898b12e36d0ea0e47245930eb051cecc4b8dede18adb4f1ca318cf0e36820f1cfd4911f076e0f3fbf9c197a0ed32063f72405477888f13cbab4649e3c8df4f022a4109ecb91fbeedbc4df4d89ad9cacbbd7e8e27a2f1fe1813d3f1b537ecf41878f05918171504bf800631781a7c36451abbc32dda5b55f05f4ba7b5414089d9d679248cf042756a4f06c37c8b5a18a6ba8f97853cc6763235ee841d96e61f2d75c188ca53d222d3d925a3d701551758feb79ccf8709cb61b793\nmsg = 54657374\nresult = valid\n\n# tcId = 12\n# byte 0 of ps is 0\nct = 6a8b8c01247d9d4d1c3bbaac58e077e37926854dc8bdb58fb7b98979ba9102934469836480a0b96a5b452e54dff55e77b52dc1cb93656f6802b7fbe06ca0923e38e549dabcdbce909fdd10d677d896384af75e7146794bfa009ebbb2d6890b1cfcad4698d297c759b0a01151bdfe1d48cf92e80896be923d02371930cafb155e543d9a21e52faf2395234e65d575fa9f5276c80ae4cd6ec18ac6d954ad043d2a46932763ca44476180b397215d95651fba63220998e06ab2dcc4935dadaae8660ac8c6356b871e0b1397af20d6fe937c3211e21559a3d0eb39c2949a96611b13740ae0c26ce67c373a9225a3c1773ec662ca20dee620c0acef1475b362ee9b9f\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 13\n# byte 1 of ps is 0\nct = 84c149c378f3f12ce202bb561456257057709114ecbaa4c3a7dbfbcbfaf2fe9a19cebabd72e39474b6bd7871c3dae41a9c87c5cb2fafc2d06d49c60ac401ed1e125522d0854fe8fb8611f8efb90d2b89a14eaeb6e991f19329dd7d183ef72cf0543dabedcdecc9977cc9395e2629a1dc8d359b2bc0fea6ef250c4cfa2ac8ad22a6a587e32859a8c99e4f7cdf938527e9e0bb597721517067d83fab31457e52e7a11b0393135d30e619d7cc47caf970facdd8dc4bd613b151f93cc53c1307cef68feb5a67d32337cf2ff954be7a553d3f07c9f657aebd9e8d4ee99e8736c152804295f366a4ffaf2a72e29c2f87b03b28b99da1f6a7ee0d9364ef711eda4f0793\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 14\n# byte 7 of ps is 0\nct = 3307264f64d4ca8b62c4e7da4cac117262e5d3a3dbc19a529ac5167c1987bce56e358726d0ecfc6cb591a12bd5f7531cd2249439254c366ad3cb7a608f845e1eca931018295208ba5c6198027b22191224c4568856ab331e2acf530fc434870865d3321ac90327a8c61f27cac9859dac8e3c38d8453349d2ef8e4a7e8011f6badd1530eae710e0c60d35905f20d7a2d118e7ce18ebb220f04b4089778cbf091bcb3e02aca83b4b9ba5319c3069188c7b00c7d32ebe1dd6e6535b5f667ce972f00ba773d4cf6a556ccf65bacc1eca2312881caf6a89ff5d83960846a5d9dd31477dcc9ee4ae50ab0cb2e574a685bd9d7b7a74c7ca9876f08fd64d1d5f196786be\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 15\n# ps truncated\nct = 16d56b7a9e672e387016e8b1c9cff474d560faa8ca14a565fba086015c5f9d53b205c4ccfe77ed5f3d10a04a23bc031d9c7fc809668ceb5c4e31ba8760475de713413b1ae5666e93087e146a2607c00d6492ed095973c7ccd79996aa26023a2c6623f382e94a4c595fbb596be074f87559267186cc475175152277cccaf9513dcb95a1f6540bb633a9a65182f2a53838b85329c9544c24740b24b27ce5d760f051c47e6cc107c264bc1a87ba7bd2bf27675547bda28b3d2a7281d6732f9dbc3c20eecb280f2ba6f25cd49c930dcc3a413987ab4de0fe9314a61e092b3708c75c9bf96831df05e4dbe31f75b2ddaf3bde7f01c7940ec62758006a652871d72b75\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 16\n# ps missing\nct = 25f67bc6c1320a13fa91a23d4d1801cc73594161a7f344ffa195d6dd1894c1e39d6cd81866462d05e0e16c02459a3f1dc5f0ecc52657f70385fd0b33de214216a2298b4814550af1ecd929170bc69b74e08299bea50de33021468f4fe2a2e4a43233d6872d15379ccea03450145d909c5eb11ca5f524e17b2065768b9bb06438e81b0b8ca816bfcc7eddcffba59b33e2a0b4ad8df215c2eafa240e553f1526dad66038e54f305a6d3fd6460e781239c9dc424ab6df7f75bb4327d873d0e8d7ecab1b09b8779cb841e002ee45f8dbebd2d483de2d7136ae7e350580dc8a48bcd6359a677bccd689bbdf879f2520d8976fc2b92e64dda8e7399719a13b8182c739\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 17\n# Block type = 0\nct = 371e281730bbc289cd77a64ab49b370ed7900c48f5625615ff28beeeeabc860b4673ab16003fd5e13c89c8b6a0e5c9b732044981ddf2bc45d4613bf409cb2e98123ceb661c1093773d71c67fd198288d6e9b832596894834c3955799ea20e242b632335baf8e8787c104499fb5d0eaa331f05a8b46383dd13cc05f0518d05d9b03bdfdc2dbc9299a04210c33f5dbed3779fb1548ead0022622234a6a2ffe5ca42a43db40f272d6633c7151360b5b90e135283a6aaf69b0491edda637dea0989e3a5dd0c3aac267074662443c37ce1b3fd4b2e9743fb0d00dc136d8df10b6fd0b60d30c1399ab52d75e2db559d8faefc45008c2d9100ed08caa88bdc11aea04df\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 18\n# Block type = 1\nct = 92210e5bbf24d2cd9527f6e24ffafafdfee242b146539f3731715fff42092cc8f5a1a4919417c9df9a5a32e61201f4354a87ab06e97f827f69e6cc13e7b9c79515145f210713523e6f64def697406a4929b2e09c31890b695b7b8bb851a22c7b541c5dc53cc75954c0246eae5a12af304133f4dcdb90f8c6f54847165612f7ef70f51dd493899d6e09ae9fed16fb1f1225d09750177893c5e5482e3cd427931ffd3fef3e901d51f39aa17e34443a34754533a887474e19213a5e24298071495d18c6ac77dece094c56bb34ed8274f5d75f99162a58dfc4240f5393baae58f484ef0a0259b56ad647ad81fe88c91b75a36b1acc67a56ec379bba03a8be91dc0cd\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 19\n# Block type = 0xff\nct = 6dbc27d33371f8cb3c3a54185a687a66eea8114f26cd234617b2f567d6013e222f33d7fe05298b73f8bf20266483571a52b1da2c0b1a431c257c62ed441215f57cd2a4af4628eeb21a9cd66a350a161cce446f25224a9acbdcdd709b14b810fafb02f3879605402e3fa6404e6e9a13b3f4fd3bd0e6c32f188a367a94aea813aebf4bd31635e5843a27bf7300419365d00ab97cb535866ba521dd0a8460fbc368ab9337caeee54f719f8998b126a111ffc6cff6d3c43ced45e8dce6565c00bf0be00694c339f7fdbe064c60e040a95b5d5b4af15fb7f14e00da6a591f187277e0c453eef7ffcef2a4efab93afdaa58e0bc1bb25286d9ce202176f395e29f92136\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 20\n# First byte is not zero\nct = 794ab724aeb176c4415a597e9d69cb567cece4479e6e4c9c19530b0877b53719d7f6318be8e970874c4be19984c632825dee7a38561a6904e23c776ccce71128847c24d5609e6790e3c9112393660ffd208771916d2e80d2c2fb35ff7936bab6c03e07646f15d09a88fd2ff8e70b624c66da4eb7dae241907ef328697c219d1ff347ada945e24ab526b6cea4e6b7f386560ab56f16751f6e2de0f7922a8946ae9afb9ce95369418f540163827f452f5d2a5029a1ce417453324eb015fd83ca2147331c02c762c457fc52ca5f097610c60430b69b6b0fc1c0877513bdb51923bca03e9af9174d3094530a007253958bfed03606e6f75cb5854443eaa363614116\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 21\n# First byte is not zero\nct = 8c7b80188818f63e6a0110cf94a169c78a0db75917caaf47405e8384b79a8f40de94f28f749186c4f16aeffb66168ac7c319d47de699ccae0edcb51a6822f88e27e99a1a0bb39d292e7d6e0922c1d2fd649376d81160d15cce10fc7082b88e8cd80dff13a33b54b8c00178a35fbbca633f4987f117aa9ec8e5f123dadcf29700ed5dbdad05bcd8e990985d950b210edae1ca1f6ecabf50a27e",
     "4bb23d4e80bf3955852e2ca18fd3e3c2f570fbeece943ef5c10ed1265049eac0d5b549713368703ad02311193ba0d3dac6073eb799139229a4aa0bfbc25bd5e886ad213dc321131ed12cf1008ee8af3a1588d06c75d7cf7375998e5a03af0ec8aa92276bd51b21\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 22\n# signature padding\nct = 34bc8b1a4646f2db8b10fdae22d6b5cb300229114015f25293d4b28e8f58783e1c5e6894da18dea527e4d843b51cf984170d56853e45f6ac77b1179eb0aa74fc556cbd632d576524b820a2c74a4c8159885fa08937e9c73ca0385c7a19676f2789b62f7a8b359a29132d74bc2b850e2335b5c7da8bf52d8d6fadd83ff9db32239bb737e890a32d561b10e9163c2fe4d35624e3e5faf664374c972a8d2e5b873c9a465e108bbdff1296c5557f314026558441a055d4b9cbb54179356787bd4bd02015cb3bbe02633711f266e915a0b4591415983610a2714adce1b0716675b95877bcef618784f2b3cd23fcdd0636e5856edb96852a32c9632c2e6e4b9a6f881e\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 23\n# no zero after padding\nct = 4629027bfdd6c33abda030f0cb3ac1b55bddddd11292520f142248bbd1efad14adcb7ec50d278471f4a98dc9a674c202d823677d2606cd639fda443d7c14f0aa35f472189abe1b639f0856743212aab46ae35160ab4e6c08a20e5b82210b07b6eed11a315ef1b1f831b52bfd3abc06382b51c41a665ca6428e4bb6bd0df7895d056b8c17093e73c8129916e3abab3f61ce9a94c9d2fd30902076104b0e7fbde8da601f6c1bcc56a0100104848da6e9fbb28d893274b40885b3003ec7781aa710c83fbf4d4bc197630b1455853c4d6d6050011a7f7377e9034d29e4396f52b24ee6875feef883274cb0842b4b177d3fa3b416095c6ff96f6de0d9123dd9ce6d31\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 24\n# no padding\nct = 910ad40ae0d8af151f512354e1cf12af7c4851cff0b659026e90a9ec4dea6c1e4b2b33cbe8260501493df2e7fa2cd77f020a7cfac1ca379eed3fe6d003335653a5f022f6bf5010e5f58c41fc91253d75eac2072479d4bb3509e1351a66f700ff4ac470115490021734bb8099e66c35f904f09d167303e26163393ed556cdccdfae95f239ebf0bd361a8adad927fb9544ca30132195735cb026dd0dc66c6efa0db41b73fc1c917be384a430e0788f5f872785cd709f70793204753d7b207fbce2d0bfbab11d3d614b99bf87bcc9a34db639fd203c9c081ddeecb9c85221e03cb9171685dafcfeaba470c5f1921a6fe016ba4b816a2328eee9853fa6994ec313d8\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 25\n# m = 2\nct = 6294ddf0fcd137390cb2193e050b5f61bf0183972912dca88ddcef7d54388665a7ff9be1f074b5e33b55dbf7c4212554a4e6243d3974aef4d95794dc72261883a45842da69497a36ed22c3590b0110e857bd0fc729663df53c831836f890b2b2012c9f56fc6dff36daada1a1e1cb2d654fee868c7c6fd58435dc8edb95dfe0271787074c2be9aace1f33ebd07ee6112cfb62f52487934af0c22ac93dafccfb01c561b370f05f3e604e92e5380103ba91113d007ab97b21ff3feb22f37c1a358215467d0a0223d43792f4947aa30c38f14246d1db9918c94600e7d0a393079dec2d9ad368ef378b2fff72cdd7c572f11074caca0995ca3e576428f651e1cf3764\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 26\n# m = n-2\nct = 50bc2c3ad07baf0bb9037b704b4e81c97003c7ce644ac8ed0c52ef9b1d7f825695f44a46e204786e6f7fe52cf01ab4f098e438a1125a79f2e3f76add9a8e9ebf175e92c5aa81e99abd17c6871b26de6b40f81c45d43194136f687545a33d590caeed0916deea9cb44ef815aa1695d9f7178dfb47b4805b3e2f47ec1e3de933e5b3de2950dbf702f3d09d7120ff94f43082409169beb5814955e445aa4914ecafbb36efc82aeda8b5d005f042f7a58d50f06763681d40a88119fa4d7b21e4a372701de8f5a4ef18e30e99f4126fd031af5aa28cf4316b03150a2e0a66355ce17124b13bc586e918116c2355f3169c186a80a85c1302fe01b33d01fd3c61fba0e9\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 27\n# c = 0\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 28\n# c = 1\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 29\n# c = n-1\nct = b3510a2bcd4ce644c5b594ae5059e12b2f054b658d5da5959a2fdf1871b808bc3df3e628d2792e51aad5c124b43bda453dca5cde4bcf28e7bd4effba0cb4b742bbb6d5a013cb63d1aa3a89e02627ef5398b52c0cfd97d208abeb8d7c9bce0bbeb019a86ddb589beb29a5b74bf861075c677c81d430f030c265247af9d3c9140ccb65309d07e0adc1efd15cf17e7b055d7da3868e4648cc3a180f0ee7f8e1e7b18098a3391b4ce7161e98d57af8a947e201a463e2d6bbca8059e5706e9dfed8f4856465ffa712ed1aa18e888d12dc6aa09ce95ecfca83cc5b0b15db09c8647f5d524c0f2e7620a3416b9623cadc0f097af573261c98c8400aa12af38e43cad84c\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 30\n# ciphertext is empty\nct = \nmsg = 54657374\nresult = invalid\n\n# tcId = 31\n# prepended bytes to ciphertext\nct = 00004501b4d669e01b9ef2dc800aa1b06d49196f5a09fe8fbcd037323c60eaf027bfb98432be4e4a26c567ffec718bcbea977dd26812fa071c33808b4d5ebb742d9879806094b6fbeea63d25ea3141733b60e31c6912106e1b758a7fe0014f075193faa8b4622bfd5d3013f0a32190a95de61a3604711bc62945f95a6522bd4dfed0a994ef185b28c281f7b5e4c8ed41176d12d9fc1b837e6a0111d0132d08a6d6f0580de0c9eed8ed105531799482d1e466c68c23b0c222af7fc12ac279bc4ff57e7b4586d209371b38c4c1035edd418dc5f960441cb21ea2bedbfea86de0d7861e81021b650a1de51002c315f1e7c12debe4dcebf790caaa54a2f26b149cf9e77d\nmsg = 54657374\nresult = invalid\n\n# tcId = 32\n# appended bytes to ciphertext\nct = 4501b4d669e01b9ef2dc800aa1b06d49196f5a09fe8fbcd037323c60eaf027bfb98432be4e4a26c567ffec718bcbea977dd26812fa071c33808b4d5ebb742d9879806094b6fbeea63d25ea3141733b60e31c6912106e1b758a7fe0014f075193faa8b4622bfd5d3013f0a32190a95de61a3604711bc62945f95a6522bd4dfed0a994ef185b28c281f7b5e4c8ed41176d12d9fc1b837e6a0111d0132d08a6d6f0580de0c9eed8ed105531799482d1e466c68c23b0c222af7fc12ac279bc4ff57e7b4586d209371b38c4c1035edd418dc5f960441cb21ea2bedbfea86de0d7861e81021b650a1de51002c315f1e7c12debe4dcebf790caaa54a2f26b149cf9e77d0000\nmsg = 54657374\nresult = invalid\n\n# tcId = 33\n# truncated ciphertext\nct = 01b4d669e01b9ef2dc800aa1b06d49196f5a09fe8fbcd037323c60eaf027bfb98432be4e4a26c567ffec718bcbea977dd26812fa071c33808b4d5ebb742d9879806094b6fbeea63d25ea3141733b60e31c6912106e1b758a7fe0014f075193faa8b4622bfd5d3013f0a32190a95de61a3604711bc62945f95a6522bd4dfed0a994ef185b28c281f7b5e4c8ed41176d12d9fc1b837e6a0111d0132d08a6d6f0580de0c9eed8ed105531799482d1e466c68c23b0c222af7fc12ac279bc4ff57e7b4586d209371b38c4c1035edd418dc5f960441cb21ea2bedbfea86de0d7861e81021b650a1de51002c315f1e7c12debe4dcebf790caaa54a2f26b149cf9e77d\nmsg = 54657374\nresult = invalid\n\n[d = 2bd68add0171ed921c0924dc0a40427fd4a4fc67821c6e7d50d0e8c730c665e2a843b1eb243e763a740d3c666b1bb1d4f9466b32b2b2e09a9e26e8777595da48a13ba9f9c45f6d2c214b9e5e504bfb3fafbce6adb31e8c15bde1968899efee1a5dcdff0d2a8bf2e27301eaa07882494610a23dd3644d0eb0a6086450e3a7bd4b5c446c01814be16c208619f8a5b7463fca583d936864bf74d96788aae8e5bae3c052a2b409df9a08eb9be76b3dbaba28863d5c56ee42eecdb85075e04de90b6dd3bd9408d7fa5694697c185162329ab9b57f21a84cab007c1c10d975f5491977fecf6c949f3a566d84be477ddaab02c0762d1b232f8a61910715a0ffa438a461]\n[e = 010001]\n[keysize = 2048]\n[n = 00dd904590397808c4314329623d9013453843251b13b8b3c4fef54598112af3eb31c71103c6259951674e53bd93a7e36d19472e474ebe8028686d9529484d8bafea4a04ba19555667616c8478670594009c9bc6a3efe52274cba64c724747d7edc194e4fedde32a3289d94c31936e7e7a15d756f548492f5b345b927e8c618bdd550acb21a17ae148304383db9b3c7baa3e4c8bd8e844a884daa3e18d56998cb32f9bae4d41d56a18ddd4313c8089b75e9dbb9128470bac9b087fb61928ab0f8c4c89360b020899008d08e8bd31f907a807e8056ad6800dffdf9ed9d964a939e7e48114b84978551acb85c9df9196f3eff55286d6cd4b39a822a8a7763a18208f]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100dd904590397808c4314329623d9013453843251b13b8b3c4fef54598112af3eb31c71103c625",
@@ -3848,9 +3947,9 @@
     "fca291fa2ebd0d9ffe3e8cf5071a524f863df26369c22b38eacecdc784dd65e20d356a6e20de033c481ebe1c5cd42366ac83c26caf73875e628875c925de9c3939bd7f912bfded876393b1f6a314447a96bbc4cfe3c01443a2a9de7121023ee025194f5a20cb768591a01]\n[e = 010001]\n[keysize = 2048]\n[n = 00cc890f82986e18c35e18a2ea354bd2c7e88dca9f0e1981497b31342b893992a49f36380fbe9829995e9aec1b3ec88dfbcbfb11bd2a00140f8f6647c5e3bdda527799ef0571f45427f10d2463ee096fda48c41085d3a90bf7072d06fb7a3d2286cd10255a82a52452ea3e61e2d8e35eff9f6b831b48f09b522df104f48ac58f76cd241b9fddc042e7683774117808681693536600e1cd3035dcf6ec30a6bdf659b15e0417c3bfc4c9a591f2f858081df1243477d41812a6ac74bc4fbb6485b18aaf6a00c32593751a527723b4802d318038698de9063818044cca1b035b8800193fed71d3c38ed3296fddb336552b68d380d1214b13a1c86e6f687bd37e5fd22b]\n[privateKeyPkcs8 = 308204be020100300d06092a864886f70d0101010500048204a8308204a40201000282010100cc890f82986e18c35e18a2ea354bd2c7e88dca9f0e1981497b31342b893992a49f36380fbe9829995e9aec1b3ec88dfbcbfb11bd2a00140f8f6647c5e3bdda527799ef0571f45427f10d2463ee096fda48c41085d3a90bf7072d06fb7a3d2286cd10255a82a52452ea3e61e2d8e35eff9f6b831b48f09b522df104f48ac58f76cd241b9fddc042e7683774117808681693536600e1cd3035dcf6ec30a6bdf659b15e0417c3bfc4c9a591f2f858081df1243477d41812a6ac74bc4fbb6485b18aaf6a00c32593751a527723b4802d318038698de9063818044cca1b035b8800193fed71d3c38ed3296fddb336552b68d380d1214b13a1c86e6f687bd37e5fd22b02030100010282010100877c32fdfb22d2dc7734329699ff43fc901b7ca0a7a25575eb58c88a1e3838df3b679af332f97074dbaa1bc4606e513efdfbade07435e113fd956eedb2d24c105c9167376028cca63892d00c31dda66e1dcd627483a472fc8b905413b9014e21a52c90d1c7c0c4b2f7dfa2cfb583c7a5e4603f548f98720a99cc11d03b2c6abec41d4ab1a6e4f73f394ef46213fcade3131ef85b004fca291fa2ebd0d9ffe3e8cf5071a524f863df26369c22b38eacecdc784dd65e20d356a6e20de033c481ebe1c5cd42366ac83c26caf73875e628875c925de9c3939bd7f912bfded876393b1f6a314447a96bbc4cfe3c01443a2a9de7121023ee025194f5a20cb768591a0102818100ea90923ad1a16d8f5704bdfd34a7f059941112c391f656b750f6c9ca1d916397ebcc33f48c300a9d001071caf00d33f80cf0ae3efd899c6443e6cdb9214d9dfb209e088163e75dd7582d3639df75d9cf113eb42bc61f7e90ebd9a619deb41c76d5728f3134d4564142e166f46313f1a7492f23d207fc2d8fa15cc7a01f24214102818100df39faf40d3cbaf2aed2d0f69c67b2bbb19e7c81bc90306918471d1e406cac8ed9969e8bdc80be72502176d68ea1f6016ecaf4d3b4ce24ea76762325fd1680345e5c5b77ba4888b9d7d4fd85af16e20cc922b8bd2bbb49f6373236ddc939063ae276d2fb4a3812de74047a1d9259fd877e2329920f4424585bb27afdc61eec6b02818100cc97db2438b2d00825c37a1fbfecf7a47a94c5c415ad4307d433dde05017ff4184a7716dcd551dfcc11096e086af4d73ff7d72ce7880ae0b7a7a775811e74c73bd887a2cb9c215c4fe21395a13420d0022af89a160c719b33834783fba53693c7182e1c8eea682b19baf5508b6deaf79d548abbac7c23acf3bd4dc3e1acb7dc102818054bbe08bb55ea1242fc26c79c02308d0807ac58e45b281fdd2ae63da30e04f9c25f22b9ab187d942f131d2b75d0b13a3b597aad995df4e5a05bf9056023d014b5faa353a3c66fe27754b2f3508a26a0a2a6b58aece23d8ce7263483a66009461d3c7010d4c3dfec39c4c7ac230e4a1fd459f394f6d261399caacf44cd260b8a30281804f8c1d61e059c9920e68544adc7e028f8f05933b4f49cec1614999d120450198bef26bdde1099bffc5316baef331c2b3d854e42a2f18858735641952104847cbbce742c8a6b9238143af4b27cb8ca4ef931f5509f2bca875397edfabdd2263e0867303dbdfbfac683a10c42d76184f320c469ab0f680a83797684b61026b93df]\n\n# tcId = 64\n# edge case for montgomery reduction with special primes\nct = cc890f82986e18c35e18a2ea354bd2c7e88dca9f0e1981497b31342b893992a49f36380fbe9829995e9aec1b3ec88dfbcbfb11bd2a00140f8f6647c5e3bdda527799ef0571f45427f10d2463ee096fda48c41085d3a90bf7072d06fb7a3d2286cd10255a82a52452ea3e61e2d8e35eff9f6b831b48f09b522df104f48ac58f76cc241b9fddc042e7683774117808681693536600e1cd3035dcf6ec30a6bdf659b15e0417c3bfc4c9a591f2f858081df1243477d41812a6ac74bc4fbb6485b18aaf6a00c32593751a527723b4802d318038698de9063818044cca1b035b8800193fed71d3c38ed3296fddb336552b68d380d1214b13a1c86e6f687bd37e5fd22c\nmsg = 841ee52c94cac3dda367429494b2a07274e19f7f9567bceae1a940df892b8e44c7c86bdcc6ea7232774ee2195b19bfe932a88c12401c06fe0b865583d989ed3236fdb18264499a36b6ae6ba1bfc68b8220a0e3fa2f8221bb3e72e267115469c8648b5ec81d04393f8357daea9b849b95d2707a3b13e4e27a5be8e75e803f41b081c7accae863211f5357a4c81c\nresult = valid\n\n[d = 355d71fce2f312b7c53d7911d7fbdcd976ddb3d5809691d3031e2d4656b7b48545bd7b265aca5f9779e2c332e70d592904b9e0caf2a8c8aa87b9dd8d88ac9ec370a637399688c62bf63ae41d87e493820cfe30144b7f8f7f6cb3c88b00a907be37190398927353a005a1a821edc644ecbd9ebe67c2993d9575d88c45ead2251e270a28bf017051d8a4248d76172b65c51728c23b56a8eb3e8c24dfc35b05675314f4a6e808411ec2564969d7e1a23b10277937f3e4cb06a338691d26677927f6a67e5334bccabd309fabc851b5c55999c160300ee10511656561fa98c0ec5b2dec78491319862664bed347bef461b5fa7c5e53859bc36c440a47f39a63203d01]\n[e = 010001]\n[keysize = 2048]\n[n = 00b519563f7b707c6e9b89342aa5314536c521dd78877a3307b372f617622cb06c84626ca4e09e92cb869acaa07b04e18ae51a2935eb0d4cd29ddb96e5fea661c6f038859e31a96bcebefa32cd77dcbb2817c20774ce6badb1795c8b1e73a555921e6cf2726663576d9075af06dd89795bdf10b3f1973cdfbe81fd0f09d9b7aca821e3f403bbf517982d39f1a3411814a24f72d02f96a545cd0e0297ed88f3603cecc340adb01e2b35f9b7d8c2e4fa04e22122e5931cec5a12a3e0b93ca623a7d1a337c2bf6faf6ac17c0480a2b7e922dd99ee44297c5c085f044a92865429696387768e1ac55b0acd5bf312fe10279d3e7277f11c46ebf161feba67aeb49b103f]\n[privateKeyPkcs8 = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b519563f7b707c6e9b89342aa5314536c521dd78877a3307b372f617622cb06c84626ca4e09e92cb869acaa07b04e18ae51a2935eb0d4cd29ddb96e5fea661c6f038859e31a96bcebefa32cd77dcbb2817c20774ce6badb1795c8b1e73a555921e6cf2726663576d9075af06dd89795bdf10b3f1973cdfbe81fd0f09d9b7aca821e3f403bbf517982d39f1a3411814a24f72d02f96a545cd0e0297ed88f3603cecc340adb01e2b35f9b7d8c2e4fa04e22122e5931cec5a12a3e0b93ca623a7d1a337c2bf6faf6ac17c0480a2b7e922dd99ee44297c5c085f044a92865429696387768e1ac55b0acd5bf312fe10279d3e7277f11c46ebf161feba67aeb49b103f020301000102820100355d71fce2f312b7c53d7911d7fbdcd976ddb3d5809691d3031e2d4656b7b48545bd7b265aca5f9779e2c332e70d592904b9e0caf2a8c8aa87b9dd8d88ac9ec370a637399688c62bf63ae41d87e493820cfe30144b7f8f7f6cb3c88b00a907be37190398927353a005a1a821edc644ecbd9ebe67c2993d9575d88c45ead2251e270a28bf017051d8a4248d76172b65c51728c23b56a8eb3e8c24dfc35b05675314f4a6e808411ec2564969d7e1a23b10277937f3e4cb06a338691d26677927f6a67e5334bccabd309fabc851b5c55999c160300ee10511656561fa98c0ec5b2dec78491319862664bed347bef461b5fa7c5e53859bc36c440a47f39a63203d0102818100e9cffe9f3b702d03ee7c25703f1314b2647963de2da16f2c7966d3ebc18fea929f28cb7a55f576d9c3a5a2513087a439d74cae037a965a31832b87188d3ce71a2000f54b983956c8e6827e854d21b4c37eb3948f6801895319b1cf51e020dbb7883bf15164f1499696feda88eb0b6d75877deec33da2390e9976d698a6d9b0c902818100c648c5f9422c0127928e7a9cfe9b345185d53e06d8bbb35201cae7bdfa2ceb7a6b31bcb88f4617c995feb2b71ec8f4e1854fc17639c970bcdf37fc46654305a690b8e6a6bea726e8b7ea40edb886532d7944a2ad2763cbe612cc170d7ca95fb90ba90a806190252dcac94a3e79ba45e4abde0391769c1e750834f5cd00e384c702818100cb766a369a7ca54f948a87f1c391912323f7d68612e33661574bba02a02fe28ab0e1c91fae09aae11935dba81739121a1b56e8deb220806031ab0126c65147321ec376b1cfc7a5d3b173c131b2cb3008270b92adb06e15d830b5e09979165edcb93aa0669a16b658cb10ff8ec22af197a2ce5da59ccebc240e3bb1c6a8fb2ab102818051a7f48792bda678127dc476d4cf3bbb7adef75d40720405f8a103d093af5e061b10ef841dd4a2c52c95282a0b6e7c924721322daadc8f25e8d3187c310569d54f7225e2734f48d1bbb3a7ab7e3b2b13e605e2ec65f54e29e081d5d8830709599e38ae0f729e370165aa817dbb097ff10cea3013fe818a756dbcc9a0f405be4f0281806011e90bcbdc97ec1d0d43992f8830d4bda5922997eec843a9ed14f80f83d0a0afad3cc320108cae02e4010403b31650c26af431563f0821858c5da0095a9813c45c11bbf2a43bfc36ebd036cd4548f406a933235a5ea71aabe29ca536c5d8a37fd1310b43f0e1bcec13bba1d6a9968c718bf974f5b73ccbd808d1248c8f5cae]\n\n# tcId = 65\n# edge case for montgomery reduction with special primes\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000\nmsg = a3b94a63d4937de4bf024bce52957cd9af5efb3b0defef908d5f2ce35941b10168128951a1c5093dcdcebaa0622fdfc1e481daac4ce5675ed6690cec5f8ef20305185ed5b61db798e7a13626831fa9\nresult = valid\n\n",
 };
-static const size_t kLen155 = 242948;
+static const size_t kLen171 = 242948;
 
-static const char *kData155[] = {
+static const char *kData171[] = {
     "# Imported from Wycheproof's rsa_pkcs1_3072_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[d = 0501205bd17b88d0d6626dd0fec898a0fd7f68f8dddcc314f74d167c40495b958a87e4ed63202e6ac68f4f4f4b88e3ec7a07d85757a7458468b766aad9a40f77337855408b28d140e75c2e6b3604ea8907bbd7f8e9578c2400ae645d28e2deef8bf718e29cf12fccb92fef9869f43aee5bd6adc223848d169cd6c27c2766652766ff81993b3e015a553decee0ffdc1624f39f8d96b6ed5d95047c1570b59fa2eb3d688dd5e14acc9407b8094f18b4694244eb1adcd655d873f57ff9af6e4fec470be236baf3b20c2040ab360d759c8b4e618bf8bd4e0ec6698f1b72c7160ed0521c82b5176b60fb63503d0ae23f6e2fb7a609305b0af62150b921ac53f4de899666cb01db0c9d8b650753015c1b6e682e6bf38204e59f7409c3808c0e53f254935540a381a963c2c1a77c6f987f06a07a0572686ed22882dbc82e7823cec080a58d72b09d00cc1d245cf158ff49cc40599d3af719dc301b4aa7f5b03629ae853e9daabe284db86d5c41d0401143df2b4593ef4e3747209c523f5a7f80f02d011]\n[e = 010001]\n[keysize = 3072]\n[n = 00dc8f7880672f0cf9d63617a8a58bdd271a109badda0fa826f94b8a795526b6a49a80564ccaba8a9491a935a53edeae1d9a7b5463d9e2ef3ee0ce7bff5d4b6c8147b5c073c2f220515d531d55a36687a6de3c34775c2f15191ac0a742d7342228c8d910fe6bbca439539c485debcbd0ee0e4bae317503b83cee8100ac7bb4587467cbc4373c4bda2eedf7c41631e50922b580f5bce81d24b208cabcd2d75fcfe99f75b493dffc5c9bd990f7fc3bf2efe392fecae36f3e4ef4456c1b5de99cc7451733a910b6834b61ec29274d986be3752c350b13a327dabc08dfcf6565499ad26e853446633eadb2970ca95bcf6bf05ffdbc2a804378d76985a71f06f90979f9fef716c36aa625a45b5eedf50825a53e9d9435b23caab9e5c64d38fd3a767e185ad7727d6e15f9e9bab2f4184d6487695db9a2698c672b2e823410dbef1d93fe40c9d357ee9fc77f849de11363f583af8ccf5181ca1aeb944c422516cb401e950923e4bd881439fa1093c77582bfe1ac5993674700b6434339e0245315d86fcb]\n[privateKeyPkcs8 = 308206fd020100300d06092a864886f70d0101010500048206e7308206e30201000282018100dc8f7880672f0cf9d63617a8a58bdd271a109badda0fa826f94b8a795526b6a49a80564ccaba8a9491a935a53edeae1d9a7b5463d9e2ef3ee0ce7bff5d4b6c8147b5c073c2f220515d531d55a36687a6de3c34775c2f15191ac0a742d7342228c8d910fe6bbca439539c485debcbd0ee0e4bae317503b83cee8100ac7bb4587467cbc4373c4bda2eedf7c41631e50922b580f5bce81d24b208cabcd2d75fcfe99f75b493dffc5c9bd990f7fc3bf2efe392fecae36f3e4ef4456c1b5de99cc7451733a910b6834b61ec29274d986be3752c350b13a327dabc08dfcf6565499ad26e853446633eadb2970ca95bcf6bf05ffdbc2a804378d76985a71f06f90979f9fef716c36aa625a45b5eedf50825a53e9d9435b23caab9e5c64d38fd3a767e185ad7727d6e15f9e9bab2f4184d6487695db9a2698c672b2e823410dbef1d93fe40c9d357ee9fc77f849de11363f583af8ccf5181ca1aeb944c422516cb401e950923e4bd881439fa1093c77582bfe1ac5993674700b6434339e0245315d86fcb0203010001028201800501205bd17b88d0d6626dd0fec898a0fd7f68f8dddcc314f74d167c40495b958a87e4ed63202e6ac68f4f4f4b88e3ec7a07d85757a7458468b766aad9a40f77337855408b28d140e75c2e6b3604ea8907bbd7f8e9578c2400ae645d28e2deef8bf718e29cf12fccb92fef9869f43aee5bd6adc223848d169cd6c27c2766652766ff81993b3e015a553decee0ffdc1624f39f8d96b6ed5d95047c1570b59fa2eb3d688dd5e14acc9407b8094f18b4694244eb1adcd655d873f57ff9af6e4fec470be236baf3b20c2040ab360d759c8b4e618bf8bd4e0ec6698f1b72c7160ed0521c82b5176b60fb63503d0ae23f6e2fb7a609305b0af62150b921ac53f4de899666cb01db0c9d8b650753015c1b6e682e6bf38204e59f7409c3808c0e53f254935540a381a963c2c1a77c6f987f06a07a0572686ed22882dbc82e7823cec080a58d72b09d00cc1d245cf158ff49cc40599d3af719dc301b4aa7f5b03629ae853e9daabe284db86d5c41d0401143df2b4593ef4e3747209c523f5a7f80f02d0110281c100fec6a10bfc49b58a2c850eafebdb997649a95575a0c17631b011cb20d7a320232a815b9af6040d7bf23d267e5e06304c33e04c85e6d481442f010a9758ba08364a70035ef99e9c98eeb431505b2afb6779d1c91d0ea2fb0a65dc391e79ecda7d52fd7dd69923b25dfae448cace829ebaca6b3c8a3cb64a81800614434895778c20d629b125b69f42945f66b644f3840bcfa6fce361074256c50863ecca2ce756b4a9fb7e993d0f1fa48b2cc485b7eaa61405fbef150e7563c2150811767de0f90281c100dd9ec1cee6d8a971b166902c44a4f02ef37a62053b41288a1d873d399cbc9e7bd306ed906487da2f49bc1c1809c0d4d88106d6879518ed925feb66aad5ff3c2b83466c554ed97b96abef55b3b02314f50d0385a0a1d8a46ae03e8fce91b412120f0a10dc681570fa564b6873bacd997b616b2bd7733fb723ade23bc1089da32e509583436f1e3448b579fb21b240620d20458d08f0f995abacc0a398f0ab6a67c9f5bcf7e032fb1d668fe698d80327599ae3fdf3aaaab19baf17639443194be30281c100f1bfb40cd56573971acb5eb65b0cd2bf4502228f2ceca5a45c37661151cbfdb0a0a28233b600fe727fd6ba71e9f1e15e4d53260960907fe01ce1d614ea220bacc8512541b786637d51f3355fd44222af7b0e2ed11d9454b4f7165234b2e8a62188dff3c9ef21ca1c16f70a833615075ca2b9c28641398fd4f58fcf2650f752aa6a760cb584dd969cec80e1cb4dfdeb6bf1abb80661892bcf7dc28a5ea3309c8acf7f039e8af53f267d517a3737d2de1a9ca158fef171f8bda1e9a6f03b0912b10281c03e3c2ae8d362dc9294e2dc71d2050f7ddfd9ea54d5c3028366af67be1a09cde7afe72e277253c42dab632bf0842ca698f602d993d186e2904c676ab966c6fa3aadeec4d560032af5b0ead10258e0412e5fad31855e6ddc1e3742da57840b3157e8e946bade6fc6fe45e57f3ba0a5c40825df56bc761cda6d2693757c4bd318d414c527cb7414e351d7c49d8564ed379bc0084806cec50806e1c86728b7cd2b606212a43267bf694d6453dcc9e73f5b798a49a4331d263a2222154b5d834a43490281c018cc971e9186f86c144d140ceabbc9ae22c94e8d8575356fb6a4a033991ef210bafa39a4cd1abfa99b332fde9e56955af179459a7236a700b7fd1d88093906f6130ae7ca9742d9ed0d5c63e6a9e9b43df4d8b261c12d2c2f9148bc0669f165b8b881879c3ed58d4a6cd5a3f1193e9abd2784609c01fb9094c7c822532ad7aec2a08aee9e263095ad0426455cb59258c7fd3731ca89dee31800d191ed7249721c25266650c46dcbfbae3070604d2e009914a2e269a01bafa5bdf8bba31c4f3b60]\n\n# tcId = 1\nct = 142b27c795e6d7451db575c90a38488757a5c07760ce10e23a1eeeaa20a08ef14cc07e3ee757c45e309075f7261ee35af580a72c06dc6b0446233687592e838b1220816fc578bf0ccae6977aeddb03fb2c0b5112334acae93f64026afa503d8707faa9989c2176c59a1ec2ff6b6308593c85c11d94a9da2fad66c860fc248f066574fee8b0d82fdc684d8eabbeeffc55c3897099415d99c5d1598cc3ff335bf494c8fd36f234a20566c0d35e3bac56082fc6a81b8cba2c99c47d1d372481ec23f35b62a6469cc42f4d349eea52f7f08a63898da4207e3104efcf81de2ab1e33cd243769bec34df4a4e7cac1c4be4073694bd56170dde8c4e12f85d2f02df12e9936d2990d4a6c490ae0cf6c3bad313f3a477db67332319eeb5932e9d1e1321dff28a866e939fe50626342e141854081981f388489a962f38220ff14a686fa111a5b236eaa4eaf6d3fbd54f93fe744e2767a815adb0c43e947360a149fbf75469957dc3ab8dac091f6339402620424b9cff8324e2a35a5a2b765897ed6e8b2542\nmsg = \nresult = valid\n\n# tcId = 2\nct = b5d5116431fc78c12ee663635c9e9c32ceb91a18a9af36ea63e7e6b647e17a981741279957fe4f0bf08288082fd4c1b6b09a805ebfd229396eab3689b5bb2b686ea39637ec69c1b8142c7033c271c9cae9abfc14f8107a8a2d57984ff2a45c70b276167ac8c92a070c718bca9a1a274258fc385a62faa02e8f15167f9e825c6ad7e2358566f79f6641c6e959e3b898ac780e369f43739321906cae687a9d229f9c86fdb01cbf061dd3c53f8d0c950d4226e7c58a66b310e197e757db3516db2388fbee4e4cf16d12bb2786607617e6f6c4b86b26d36efac63fad1dc561b91b66122d9600124e03b18ca58da78f30ab0c31c5c7f4bc059ce65dba182afdaa788cbbdc3bf8d48b7972c5400f14d3d460d329e0ac60ccf96b3c1d5e4ea9f763565322a110de5569fb74b6cd44de2a5777e23c681f3f769afa961c42782dd2e56e22b4af1c777b87a15df1f6cb48b6a39f7396068fe40168c4dcbd3cce69daaed21554a3b15a2ee62974b112733ecd4f78ac4a05c63eb759842f4503a950bc7654df\nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 63b63f6eb3fd2322a6c85ed16318932e83f32535b3ec2527fb41dcc865bc44690554467655034ad33aa0fa993788e80654ab0e0174f8dd238ad68c3bc194f390dd38d26408778774848c49a6a606e7fb1b3bfbf5f19db4d4d1ba2db43fefb9a9bac311f2e1fc1ab4f5ddc00a009b9dc435448f250a648b206fe764505805c9bed1729d5bfeaa4fddafc115d281703fab0e79726d5546fa698a45ca6e5e561b8c2964b2da01914f808a498ab77672eda3432ed9974f0a06d320ff87a4222899f893a6cb6abf13d7e56cce2ee7eae67fc26f2274b63ce8301c721d7195158b6c966b8d36e3cff0aec6f218b0fa6d8490493471ee0f08b840b6cdcbb73a164246864de0f35565bbebe51585819e42a425090479537ed67f98236415e6ad3ca81116beb91db802dfb3f9da733f86cb6fa90904c8a382afcbf6162f0d89ee04973f2d26659325f7f00a4ae9e800de6aa27b6c94b9d57791658eb0714b7cba5466ecfe44bd5803647c3825b58c37187311a8b11399f53a877c265da82493a90869e376\nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = 072c9fb5c97732ddebad895eea7af5ae193a6cebe74a46cc2f911ddf31ea5a90fe7052861a520c8d8a2680b942eadf644933ac12d3f4e13390d0905808e2d4e7f29b3138ef7f50b360266833fb3ebbf3db0dfd33642b710899472500528a49b3d8d036671038820ede3a46709f7c64114e74c50f81f52ce4eeed74403ec9ed4fef6fb7cd788f8793b9951c1be5e075dfc1c53172dce2ec8c6ebebc3cae300beff7b551",
     "df0a11913f0a3aaedd59ed70d3308a3a04cb1f656edf2829c8c3d1de7530ce5db7ca1bc5d0e7d3830c77871b6af589b5db87d3d6e8f02c0954a14cb1ad4a79481ab124674acac340e0fb20dc6682c3db4039d2e15371807686b260cb093354e9e1b1793b86aa087455b54ad5ddbc9fc6a5b2b8f786fbd70c7998f55114adf9908a3259f51f31f228741ae5e7ed598000d8171f9c3fc1f24cdae7c6947c8d612d3918f4c7b01682e33633cab0875a83a779bc211d0c8c6c189af12c93716003a86ff7c5ce00a6d43cb37d9f467dff17156039f50c5a3c811f0f0b8be025\nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 0dfa0e455f2b30f23b868ebe95dc8008664d18f0a00da3612c045138c4ca44ae8d8bfc050f377f1995ce2084e7320bb75c763d95219f4fc11d9a3af128e9c369cec5ed19d52af27fd8e4a462b39c645c4b7b8534bdf7e2d5e2e7cb99a4bbd5713c3401fb1dc3dbe2f851a5fb655e3289d0592367c0518ad0dec38eb84c3a7f2400d3b53d9439b7fdfb42a8320a5617ad83366787cacb3644294a1a98deb09cf2dfc626889f5824b71d20b1a95b7b984760cd1f382a472d6025644770176390b8f38bebce8f28b68944eda8e5c6e99c694055456448f0df0136e7e4e881f1a6b73c642047327a6ce3966cc7d3124434191b09a0f6636e2346e234943cabefd18418a60da871c77a858551699583ec8c30516a28ce4f62a779d0f468f2efdb5fa60a4c647e62f045bd56f6df1564c5c2f112ad050a5bfd411396cfff1bd9618529efd92a62735e01c324da2ba4be1d3f450c2d37b7913bb809874bdbc0081397dd55f93716606a00001b25563f413d0c4b9c2b81efe320d9478bdb65fb3be9d268\nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 740486caac4d0038274e7627da5325320682e610bd678923158c7e23ce3d430e6bb0fc1063fcd84cbcb2415ac32128a0e506b2f95899dfc67c2955514d8e0b0e4d84077b869b5f4d13eaf96242a0925692ff69c752190082b813bb9dda83907e1d6c4733af31e00847e856c8d68445fd2021d982a0ed9165db69933f50acae667a5121672294ce4c534479590a9f4425a8fc7c0cdb8abfdbb290c71b4379cf7e7cd959f4557b2aa61e185e95699345aa4010d67efe3891094d5c0ad2310f1884111f4aa0d33cc1a4fa494c5a744c10c307069377c848e7042ec1581f0dce3fb7febd7d347c5abbce2ed3d2ec085644fb661d15ad8aa041a375ccc77c9e01dd47e300324738db555201506ff60fbf6c12a82f6acdf7396fe38e4692d1fbc9d86887709f81697676b0f45d57379dab3409b173827a6619572dd8e168b991d6f9f6b996453544032e097c28c320ee2072d5aa9582cdba70f40ee2aa58b0933896e6c27b0933268cc577ff5f6e9e6a7591b73dea4c6ee24fcc365bb7688eb786fd3d\nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 7f56c9312bee49fb2d93924c4be0ddc552ba918b292938136752bdced1074ce61b0af9f1cdea7dc572ceab2ae61510304ec9674175bf1f5fcbb78d466d1b8454f02c54d11e93153b9871842378a584722a5e85aa229a4c7a4399eb598f11bb931ea97d385a75627dd6698dd9255e77bd09d49b0453f2b2f7850dfea6f48ad7dbd64f046d656b0414da4e840059dbbebd27fb71c819a953440bd4bd7668953274cbedddf83dac7dea1422a6065cf4933beee13b7bf20c95ac07525f94ee38ead3809fc9eb8e4ae71ad57f72f7e8d6969aafbf8700c99f6363362dbeb0fd864c554f9a1d3cfeed9e8a94cad44a88427f856707c9f674aa2e2d29b075e246207bd692ef638c556ce50673823f5e0947845cee31ef97c1c92111d3121c7565cee925182c32ae3082ec1b0de1d6d85b61773f1b4a61a41f356f972e1358c71ea7bf9d984f603d3b69bfe0f0e995e38ef5f81f10c9e7d759eac65b7349a91b67105e30193c9491b137186bb834b8cd34171dd2b1cc4c5e923d9b29ef011937b9c59c8d\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\n# Longest valid message size\nct = 74b3f849a2957b53827ae1eadedf9fa29dd46c3705340afae5b18a4154efc6f2ec1705029383be4af5ce9140fdc315e8ac5d50e6537a470c0cdf0be4a66be30adef9c32e2caf8351b695c2e51ba0b1ef2dc466d0cee3c79bd95a8513f2241b3d82b8e0638d88f4b370ef17e0ac2fce14a626a34ce60b3e3f26ca01d26264ad1d577ea960c3eb57aa2f5cfe3a49f21fc081cf980fa5f433366a7fea9fc9aeff4441a86db59c8694b253d0bc35cd21332698a9358739b6a7524ee7228d89dfb0dbacc1e237b50bacf8c1d3f10586b68dd79303a37e2d0b6164f22a8f67cf0a39c4f66a4548df06353c4d2117691b1a2cff393a0ac9783d2370f52d7e6e8bd25bec8c193d1b4984bebfa72ba46c11d999094d0a5ab0a78196a6742c560291b79af6cb29a8e2504b5114411b8d83161c522c4a584b43603e47afb09500e82ed6d6a746e529742e50095ca9a8344572002881819b2cb50fa301f3b4d0a2b98c8f4e817d53dbbda8ef8487bdac3eb46ac4dda2eb7d1e9d08e782075669436bf5c094c7\nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 9\n# ps is all 0\nct = 88a6584754ad31f28a05575dd809be25231d078d1c1e46b7240c1c402645b710eb2d2bc189dbc16d82d9ad7bc5cc1df3318fc31bae54d88b25819f2b417f4da85dd11330cb8ba58bbf766bfe421af84f2b55a298ca0873fbc72317748c0437cf1416fae4bfb73a6ff973f62115d3cdc71d81a4cfb73afda00fcede7b586599efdc3aeb5e9ad6e816c0a39440629b8547163ac01340381607cbadbc93fd3e24a627a7b88d9d09dff135d22ec923af52d0dbdbe37f57956719b552ebd15803525b0d6509841fc3b35e8c564945f6ebffcbd96b4f34bcf4ff9120fce1c363dad2cefc2a83d427f47bf29968260380e47ff34e87ef9e2d9004a68641fa0ef26ae3a66a423097b16d4b82e8614cded1ebc68e7629c11eff3c9331d22adfe184bf4881691fa80d32790669d832c858c97149c47124c8ffc7fb55376546b7d9f173c51b899a156c7d4d5d8d0aa8d3b5ce2624cd24fe34fed4bd57b08a4c464f719bf67327fae5805d719276d3671b0cfdf7f05bf0772dfe1c830ff8f091ed49e73f60c8\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 10\n# ps is all 1\nct = c2459fbb04d640477c76958c8d5cb949ac552d188502553f01e6b3ec654bc70c55045b0184006936a69fc7dfd6684422c54463c8ded5be163f3392302834954c91852525e1beb096059465e6c261de5afca752cada74922debfc771bd0b99a5770f9a80d4b76e8558ea8ec6c8aa5cc28fdc3f049f5e38d99f2899d59d9b5ed6ead7581e991c56f8f6f1edf16881dcb7b29fb00a8566f0dcff5a1fa99ea2f6e4264545ec11da7762117ab938e3d906ee20c114cc35778753d96a89ca3e025efcb20215b6e983b9446e559831c4b5c06791e282d03bb303b9956bf3d90cf717e2117a45718edd2591d67dccc8405a3484c1633f0c7281d8c2605d9d2da7ccbe0d992c12c8bc54f30aadcc65ebb4fbbb27ac39571bde40631f8abd579c2c2a444b088a0bd112fb6b9ce010489e8561f6d411adb9cf2758b8874adfd0bc90eff1652f7ef9c6b810dd90a1ab591275605f9b658273d2edd513bffb5be5fd681a2b1f50d6dddc9b9b3f39d59d407d0710a712b3e6f3ac2a74c310caac45827c7ae241e\nmsg = 54657374\nresult = valid\n\n# tcId = 11\n# rsa_sslv23_padding\nct = 389edb8f7af2a7234657b851306c9f2443b9302403fea9ca9ce8b4e7a246dd2bafd4d669f34d409d04677dc5a64c42aeb834a324c9acb7f13604959422703274a686f8f39825f220173135cf4b6f32a97077f037cc7667ea02455f56891f98845be33b2e1a08062faed9ade751f5fa1b4a0d387fdf6be0db76f6525f924fec655cf8db49ff7e49a10f0facb52909bfc467b3ef4dda4ee287f681fb4678bf7f77545b7e8e168dd8202b464ffad10efe93350b6b125bd9153d9610dd3e7d9856392a9cd93ed9f77c6531e445383d0269bbff5a28524d29513f21ed2eb452456723606014c031722ec8a4768e2c17c609a337b0b9e992bdc43e6c49a20b834f8c93d7806949c32f281293393163a7ea5f83437c647dd29ef663b1c748304bdb663923b1cbc1c50ed4c1f5cef5c2f9b97d735500772dee60b5dcc2bcf925b2b815571dda26024d835dd99813ff469e5defc2a5f86da2049924ada57d2d811acdba5f8c0f7513b9fae73a5856de97fe8cc2471a06284075dcf00d3fb57a938c7dccbb\nmsg = 54657374\nresult = valid\n\n# tcId = 12\n# byte 0 of ps is 0\nct = d723aaad7aed7fe22277d057c70113531122781e8e46cecd035a9d26e980a771653d780cbb21d70db01aadc4a8b13b51380cc015326f5655e4acd5fb8e6175999efea729f0e1ddeb0369aace87d73d2d6c97edf3e65ac51a4b0edd0ff0bf10215cbf084ee7b463042f440b164e1e0d725651c2d79ae8e853bda5a0c656fb6999560b0734ad2f831d35b864e9ceda47dec6f6a675d33bf9412fde2432fa3aaf4a3278005f70838e7ea045097eee942e93c23f1bcc67bf383d47b8c98c7f7fbad6472745245266657de351cbf7b268e093bfd3eaf75c00da99873884f5c048a50348f99554c6a4c2f5e87f4c791764a09aa7e87a8f6e706cd18a6435b756f448fd903990e3b8edfd88a511eae5facdbf0db75ff279bb648b21517de4d306131552011c218ad28eb8e650424582b4ff49b47545f95101f6e0c100c795ebafac15a386a40200433f023d633b45c5b16a0727bf56488934a6328a352793a39d3b1d77b1a670ef6d02c76cd16e056740be323de03dd09d2ba30c913f289d312dd5925e\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 13\n# byte 1 of ps is 0\nct = 5b68c3c463fd8ffeda06c09fddccbc5284017f753ff81e1db255ecc8c32b7c11e7f92ddc170fd578f6d0e8218acd1b04bbf5bf540c1167984dc63abbc5799284a7c28a20ce4f6b95e142571f57198a6b0bb9488f455fbea076e520853b92e848bd",
     "1d29bb0581b6b5eb56ce839fc1c1afde7815d075f5da520443fe6d5d4d03ffaa029736d703457cb73e3769f6d9b70bb22d340886e088ae8356501b58ae6b6167bb0a29b9065305ac7228a07279a2f9787742991cb9c136ba53c569615a74f323526165ba73c340b041b97bb13c129bfeae795cca3dac7a1dcb30874c1b298056bf231f5bdb6419f5eb436ffc1f3101dae12428ee5ed02a4e72a4e7db60caf26b7fa4dcd4e8d0e663ce66569364d058db26c29588011543fc8c72995d325235eb4d3a6f85e1d74ab16cb3166409d3aca165c81746d4c956ebf8fb5b7b31bc31c8a0509cf068794ab0bd687dc1ed84ea6b17e7f98d235e7541bfa6e64916cb02f6c2892c56787c1ba490bcdfd7000f529c48608c2efd6240ed7e84fc1b04f0cc\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 14\n# byte 7 of ps is 0\nct = 01af89a4d37a04280b78628261964cd3fe67d062b74c35e851f68b9f8faf7454a22df1c84c64f625515b16b90d298d1123c3010d845b86c7bbe516e4434f1feaf3d83829d6658d5128069bf4a3fd5e0870903ac313f743b9c7a8f3a7ea4e9f72f5b8774046980bdc1a1af025337567bddf436ed9b739a7305dcbf76ed4d7085183a84bb298a262241ca5811113b60e211626adb2c20fdfd80d1bf76e763fb3eb7f2a0eebc565218808fe0f8b0351516773f4ef822693169a3f1c31c12ffbf53d583b1598125707ced9b6636acd2a66651eb3e94bd21055b13d4d6509bbfb01f9cf449f84397b448a7a761a878195a4a96f6ae1043b947e224325b5262145abf8b2daa65544ea8d56bf33cf9af7be8e0c8f20eac6dda208f45d068d4ffff279bb0f87ce8ed1562fdad32e89819f6d86bbdd46c175214514b2801ffae449029ab0987dd2ae49a619e6717abbc2395cbd02b2b0ee4023dc858e10fb08af579720a51b7aa51e5b366b5503563c271c485056153efc362515929ed6173a4fdcfcb0fd\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 15\n# ps truncated\nct = 700d40cfb0981f7b86260e36712a463d2d2faf1f9da3bf762c3f993371b441d9e3747f126dfe2ca3b6d538a2c53147e7bae60b6405238f0d76cff5f420f8b641ccbbe9db0f0b2eaac87335ce99ce8a2eec1bec4d569fe81cd580f6490e3ae27209c1d022de5fdd02eac36f674d664c75bbfab5020afc8fce701b6769de63eeb7c72ac0e428a3d88f071e68f377c79d5624481213ed8bf42d5f56a3a00b170c63f064cc61d8966ccf2ca5983d7d1b56f4e81e379e57aa8aaf59a05946c1c24aebef5eee5a97b4d6ce8796b2e731e9b31d3633524cd526c30fc921cf927ec392f95116c121c4599a9e180a9bc963d01cb3977e2d5f72747e5c1d839a515802a7c26529fa487ca5954bf137fecd5e46f301c54e8227c89f4ab766eb9b5f9d9a1d96a0a482c2415ec9bbcb5613a1d239add7fb99f24a4867a85a8e29ba668c7c1b5948d79b2f412998422bc35457bd05a4e5373ec671a88bc15eb7a4fab7394e38541fe8d4d2dbc7094be069933added250dafd8091dcc53ba08301e64d49a4960c9\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 16\n# ps missing\nct = 5a76259027089edb019b04788cb702e5e06b13b9826d57351694d20f5984badd4960bdc49b900c903255ffc689676044ce0990447fa4c674e780b24c142e39d157bd649995c23209b697f444a8d14f96033707c636c312b019783b1985dbae4b1558a9ce257fcc6a197edb6624c309bd3b2bc41898f370a0f94cd9531bf15f635d1ff5895654358db4e56c211a732a237cf9792b84096d747f41159ef8529324f5901d28549c726cdd12b9f60fd110a18b2ee2007abf99e0d126b57e8d92371091ea3fe289831097ee0b97b11edd36a5e382d3360ba33059375248e6e8a873b5e7d1382c430dd8ab68d93ba151680ff08c23159c7375bb455a9f73cbfec427305b378c4ba45f2080803a83d00aa058994b6cd3429653a3bdfade0b58221f94bf4c132888a595cc73ab6a705299e10f65297dc6e70f8c7623312f7205cfaba759a9663954ca3cd4390e7be33e0ecb9d3a5493c0329e6c07d048c93ff285d28e338db5595c5dfd6d31e920e49427c0623c01d498bec7ea2f1977a3d6a1ed7943f0\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 17\n# Block type = 0\nct = 0946361acb9a12452e370d04abbb2f64de0651ce5d6e813b4d256476003cfb170048284425c150dd9430dd53a2ca6fb8e86f1375ebabe86603af28b3561fc7df1cfa22fdd5d92018dcc4e208ec75723d55706351d00c8ab8017d703a0ed1eb5ad4772ce0abfe976d5c8c1e2b238ac50e9c7bf7871bab2362543312f24141ce3e0ff5fe2cdbcd8d36596189a504e16e09e617ecfe3d553ab36d529d885608cb4c3648b763b173a9f3b003e8a97bb9e8a0a19c5edff9f0cf585c0abb60af2545444df8789a747da21def80f287a3d54c0c5b50e114e2b1c17206011fc5fe9ad783b375044c442daef1b7c789cbe846809cd8eca17c1576060c1ff702e8b3d908e57be8c23a1a0984cc512937c3e3709f2f4ee82401db017d2a362af38f4e6629b70cba25cae45ef4f7a3d1c66c3ac7ceaf95b54638f8823b6ec510293f1d7221c2524f3b9011be4fc017ce600f6d0f77b271bfbd2325ed58e5975c41dbbcdf752e8c1bc40a096af1ccf5016b77229a4b081fa771f249695da0bf14e7be770ee010\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 18\n# Block type = 1\nct = 849eb249b9b5904f726cb7db324f5579d331895bd3ce5138edaa2d283360feda0bd3ebd97468ba98f3a5060ebfee43e495bf75db592f816bb9297fd1bd260d6f8ff79ddaee1100e013f13e4812caa3a8db290b4ae7dcb34701a2decf9834c53a0f6a5faee7cacfb11d017516aba150619021621d6aacd2612577802a52c88c119363358fe96c67ac5b3fc25c6ba28d8e6efe5f2b3305d686c58dfa3417a40134327885a302f59e9d81b5ec46127c391b5fb1a12d9776ee2190cc20248a4beae4c46e4b58130fbc3b805935a00df588845eee7956990d163c91b384d0db2bb66fed9eae58f15d3f39588e75ef79c8dbc60a87e4470ed2f48a48d62e2030ccbdadea0dc5cf75b21a8163dc2391bdc7d0b7999263b70346b02152020ca6160297797393be3a51944dc2666d829302eb9e1829fbaafefbec28710d58a0eab63ee49a5d1f0c2ea49b73f331ab27170fec368dc2473d1dc0ba7bf7b70b7ecae315e67b323ce267d5fa6b9fc83b20783ae20d755127b5654272b76c88fa362960f66466\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 19\n# Block type = 0xff\nct = 99aea15afde0b40c12960cce598c11d618b3e4a0502eb9764cc114eed704113f0d13d9c1181324c18669f6385b5f6b1e0eff715769e5b3236a53d7638b1b27fe1b6bf2089e97e0bf6b587ff2ee42c708ac45ebfea88d057b6fddb6af2f8ba0d0ee5da9366961ac098c0b8349683aaa5dbc789ef0a49737b059bdc1936ebbc03a00330b84606dd9e0aed5e2c51f9e336ae9f19c225477f1edf87e463e4d0d80cf6c85f8142cf6e9b33b83b9f4d0e62540ba4b3f73a8b3b6b9ed0728ffd97e2332131c6625578eced873f96e1a84e1f22c1ada6d8bae41e0f63f284d28e9198b4f047f9664f33db978e5d7843b2891fc5006b25a17cb8418c7cb17abc7c8235b9fc5c2acbe17febd87e3b758b1e0fa783117e738219bee41b29c2b64ec23c413f00cce03bb23652a7174fd299dcd68e3b5521a0b22f89cbbbd021fbb8723f5020e2e7205bb071dd792c6c5ab293f8ce1c5b837b6a8966a9560a38d52dd6518e636b69ffbb43035eba80531cd1077d7d1646cd1a458cbd4e88a42ea2ab62906f2dd\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 20\n# First byte is not zero\nct = a225db92d6853b708dd72cbfd081c06ce3d6c4579def7e6bd8b45090cc0b9f51d4217d3275402d5ec90be82e920cef6f9bfaeae58ac461a61b3cf568186c6fa2f3a14db4d349e55cdfe5633a530bb6178ab1c7d126686d3297c4871f19e065f1fec05b85b72b675d58836dd2f741c593719d8bd65d74b9c61ab771464766324338e9b3bd3c05fde9027f2f2746d806c3f8e3b41b93a2e45f276af2df8886948d9b4f1a4f7e67f2ad7ca03ccb2275850982e7723017639d51c0f09138f19449ff344c1caaeb72ca8607f6012b8fa6f7924ef0b6e516a79b02cd2219b03421ba25e7af6272f57d118e165da759af7b64b18e60b9597d1ca41a49da64caf8f9788dfbd67b5b68fca5fbb3d42e045328739d079596cf63ebe83c39041490d7961ebbd2c4729059b4e01d180e4b34d69fab70832dcf698225887377c615affc0df708dea84511b44905711e68a1dd3c0c6247f35c998299b82f1511168a79f40f50f7576eb4c963e00576cec70dc0c3016793c44aa9c8d9f7c9d34907523613d4bd84\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 21\n# First byte is not zero\nct = 85421977730b0f2ca7ac9e69328c09853d07e68f0c12396011a88e1b3d0d8675c723c3c7818b1b3ba6e46d1902eddcf05eab8f2f964e5b17e9bf0235c118336a25dc99469b6be3b939090279f0435f28e7b813444b1eb63a67aca79153c67addb59e1329c1faa7bf9c92870169afad12198dd0954fe581749137e63dceaa0151a4ca2e4157248458ac4d999dea03deffb079f01b7bb64d5e3f0f7e53817fd5af4d11c4768ee2a5b184925d0924ce5b8143d902768478439627e13ff2ef8554c322961b0d3070abda2b0821b53053228f63f81a634fc32cb909b7cd14cefa5208348c0044262ee4157d330cdfa1391471853554ebebeecd74a58c51d8d4dd433327a2b8bb6e2a29f986c6ec0b6cbe86706f8aa7f89b6287d818ef770f69e48d0266abde3f94fad09cc6f7bac45740247a03b7dd7aa6cc2b710e1fbf74d7d914c9588877e8e52ecc3eb8e5cd5b9c772a1aa3acbd2ce86168451dea1f539fb740fa4fd966bc7d124b098ee4dbcb86ec326a54665752a9050f80b90ac34dd51f1f11\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 22\n# signature padding\nct = 509c69e802c2ab812fea8c77f89dd321c0edfd279b200e93aaf46591886148722b06584fc8745e938d069cd4c100f07c48c2f81b7f94d47f835244bdf9c9eb08af688ff6908ea2b6b938b9265fbee0f421a35086223380a9925b3570b3c0eaebc37b9bc18db3271e7dc62850ef17cce8ce17d68dd81dbee566f4a585da87d4f02158f80b7ecebd0687acd6dc52a334ecaacd67895720766ce54ca6a3872ebf90f3c9b894a0f44c0e1a83d226807faf67144fa59b3a21cc33339d2bf9249ca5018b96ef837c3fad08e325c7d31c9ea2fa1fe4b7dcd36b1fe7c95530787423708a80044a745dca51ef448fa953e27353308a10d431c01b688cc2002614fdf60efc7f8e969b3b84caa04ac8305ce87586b0d1a01f016ab6eb5a970766201166d16b42d0829e811d258",
@@ -3882,9 +3981,9 @@
     "9cb188a8308215dc910c83c3499870989ed340d3e90575ad9632f5ecd11bc041f4c5651993d5a0efe54af8b6ae87a2699a1fa34333ebcd069264d230219af3638c42fbb6aea60090832117dcae0d7795b13fbf2b0126f0a2a85868aee3ba033d64cad48b1e9a7bcea144f059333278d38e1767c6ef682d9d40f6ac9ebbb8\nmsg = deb2027b4c88c9d2efae9fc1aa883f016f01f7e8802aec6cf3f637e669b7e595e8d97d299bbb88\nresult = valid\n\n[d = 76557e33fa3349551c2c557d2b7c948c11b736f52766df40a37da1a0d263ce2798d529efa34e4b5fa79307c0345cb9acc995dadae0d7a7d1d7237a53f7b68ea0b73f70fc003450830b57dbc5b37ba185e01500771d7111e10b2495945f81bd854676cd22b3f3206b0be61931bd4e6b34d9d30384dab033104ed8a3ff4416cf02f60939fefabcc9a5ba2442e9bef333ff52488a0e841d9ef7ec83e1a476c447b94d4c8239d5f64346a9fef1de49bdff5db251d96d4823621146141d46aa601040139009c37c551455567562831847b6c43636aac85abd279b24390806cb9b555b05e0d26a2457801ad8f5724452695be0147c36e9a0cc332d2adf77628aa43253e4ef5f337484deca700db2962d4dc28421843880e3821e535dd94ea72662c4f3a5492e824d98c63e182c107a87941c7834c0af66c57ca1cdba550049c3bb3531d5d7bb07ee93bc84644ea60521f1511093b5b4d0b5a19518f6f48f377050b57a5919aaf958fd33b071109ed65741bff06f920401d5ab4d3e36c59d29bbf2f29d]\n[e = 010001]\n[keysize = 3072]\n[n = 00a9bd730ba3d04dc5f2f9ac15d00ef8bf6462ffd41000aa326e9b501f0a90bb299ea7f0bddcc46ff03cfa0d23fd45598a578be2434aa1738fa40ca05b8b2da67df4fc353facb7a0f7c4ab11a16780975641eb764c83f15c63e01807b7193b3c724220d21a2c2c83594c61dbd07474a8ce5b518ca7635d9c0e04b91eb2e84e0eadc7c790d5ee3129eb6f793d7b9bf4d52daf0313f841ea6688bf10891ef87aad500ea53b94662dbd4b7110103608bb31cde255ab82f852667bff55dd273114e5c1b2471f86fd41425067eafec25f8fdbbdb08490def14bb2d847b2eecc51cc4ef94e5a9f415d59ea8549b232cd8b6bb621d655989864d85de41d542f16eec86bc5f5d5465aa2e3eba1d1b82ddde61dddac0b62d660101032ba3f8fdd69a31c1ea2fa1966784802d3dbd848c479c93e12bec95a7ff15ea6bee5fbbea15ac31cc9e3e8196b8946aa322abfa29b044cdc5008313883885843728e9cd9a7cf1679fe374b06e1cf5ecfc51af75193797258c51309d96e7a71113ec0896b9261cd6cd2bd]\n[privateKeyPkcs8 = 308206fc020100300d06092a864886f70d0101010500048206e6308206e20201000282018100a9bd730ba3d04dc5f2f9ac15d00ef8bf6462ffd41000aa326e9b501f0a90bb299ea7f0bddcc46ff03cfa0d23fd45598a578be2434aa1738fa40ca05b8b2da67df4fc353facb7a0f7c4ab11a16780975641eb764c83f15c63e01807b7193b3c724220d21a2c2c83594c61dbd07474a8ce5b518ca7635d9c0e04b91eb2e84e0eadc7c790d5ee3129eb6f793d7b9bf4d52daf0313f841ea6688bf10891ef87aad500ea53b94662dbd4b7110103608bb31cde255ab82f852667bff55dd273114e5c1b2471f86fd41425067eafec25f8fdbbdb08490def14bb2d847b2eecc51cc4ef94e5a9f415d59ea8549b232cd8b6bb621d655989864d85de41d542f16eec86bc5f5d5465aa2e3eba1d1b82ddde61dddac0b62d660101032ba3f8fdd69a31c1ea2fa1966784802d3dbd848c479c93e12bec95a7ff15ea6bee5fbbea15ac31cc9e3e8196b8946aa322abfa29b044cdc5008313883885843728e9cd9a7cf1679fe374b06e1cf5ecfc51af75193797258c51309d96e7a71113ec0896b9261cd6cd2bd02030100010282018076557e33fa3349551c2c557d2b7c948c11b736f52766df40a37da1a0d263ce2798d529efa34e4b5fa79307c0345cb9acc995dadae0d7a7d1d7237a53f7b68ea0b73f70fc003450830b57dbc5b37ba185e01500771d7111e10b2495945f81bd854676cd22b3f3206b0be61931bd4e6b34d9d30384dab033104ed8a3ff4416cf02f60939fefabcc9a5ba2442e9bef333ff52488a0e841d9ef7ec83e1a476c447b94d4c8239d5f64346a9fef1de49bdff5db251d96d4823621146141d46aa601040139009c37c551455567562831847b6c43636aac85abd279b24390806cb9b555b05e0d26a2457801ad8f5724452695be0147c36e9a0cc332d2adf77628aa43253e4ef5f337484deca700db2962d4dc28421843880e3821e535dd94ea72662c4f3a5492e824d98c63e182c107a87941c7834c0af66c57ca1cdba550049c3bb3531d5d7bb07ee93bc84644ea60521f1511093b5b4d0b5a19518f6f48f377050b57a5919aaf958fd33b071109ed65741bff06f920401d5ab4d3e36c59d29bbf2f29d0281c100d42b178b5a12579410b0b3c5bdf6a93f15bdab87be1d964aec425ea611ec88b6f3bf924def484e9dcb2abd1fab2b2c3cee7f1ab3079d2d4bd7b48afafa6b2c903e112a7fe1dc997554054b3077e585d63ecc4ae058436adc56f417bdbaa3f346786aee58a26bd6c5e1d7e3965bfc0c7ce5e5d71ec1470d2a9358cfe7a3d06cefac24b0bcf692a8bfbdf38073f690535650f5620a6cc664d24b23134396397b79d2eeec9b97a290c282d3385767a96cfcb900c8220e76bd8dd717374085a019030281c100ccce75c5d321a523245787b19880044387fefb9fc06465e524539f265e85b8be15fad29e03173fb29e113d16d5c53f171fc9ebfb1df64428a59148d2ce5217607c1d2cc6dec49d46a88a10340e8c2a9e66b198b8babc64811d5e7cfdbc4b8710a0c908e081424549be828929b634e845fe8c1b89baf1d80867a32120884fcdc71e2aaec0d9e29d6fe907b706a700585f92c7eebb2755640dcc961361ddf239b1336088cb1cc2c6811e3d3703ff5522127f4b1f9bbde92f137cbca148d227393f0281c0789388cce4427a4d267315a7b27ec4ce9a4f7175328164116e5585aec18ef85f69051d63773253a36f7bf9814ee8b93a639c0e9362275c3fb6f5deea2578d519a07c66f7c867733aefa61686140d77d33b5b24ce7cbacbb72f1f878286d878003b9d219973acefa103e98a68c01bed08ea2a85e7ef95ae90dcae63715472b6063b819a83b969bdc7426f6937fe0f259d6f6314f5b1bdca3c8d010108af0e39f3110241ab6730b72e23e56026a43df0376bf85ac4a80da94a3bcbf0d5955b57fb0281c057e12b45e44f66858abd883b1b3dab16b30f25372a1daa5f455420511d73f18e96edd65bf8e58bee7fc6d3d8ad878287d09b1b07d896682eacc48763f525e264033d9d8e03de87c1dee5c7081f49e3abae52fc3e1fda60a1ca5155fea6421e4573486fe7ad6f1b3e06620aaafc44fd79b33cb94043182ce3865cc80526985faad5f5e8a0559dd88241928ee56ad94a1250703baed0b4e246cd8783ef9585af5daab6fc5b730edc9060c2518e048caa1f17c1cb614f7ef4353f6bcd24eb0feb8f0281c05a753898792e9799b9a6e5b244bc184c0cd8a06180b1bc3628fcdefe815675744c53e1c1881df87c00e0b104739754dcae0ee9bb9e7634c6d0e4530eb84836dc108bb38708935677fbd517902d757d0f5407ac78b9c939757a8c471c14222024591bf16784825190ae6e802258921a715d9a18a46994cb83ee87f5ddc13c69edbed56a8030f9f2d79292902727696d07013b12fdcdc5ae905be88a18fe318be5215fcc72ff82ceccfa6ebd9564ee779660cd31fe5f5e61b8f92bad3a8f7f26a4]\n\n# tcId = 64\n# edge case for montgomery reduction with special primes\nct = a9bd730ba3d04dc5f2f9ac15d00ef8bf6462ffd41000aa326e9b501f0a90bb299ea7f0bddcc46ff03cfa0d23fd45598a578be2434aa1738fa40ca05b8b2da67df4fc353facb7a0f7c4ab11a16780975641eb764c83f15c63e01807b7193b3c724220d21a2c2c83594c61dbd07474a8ce5b518ca7635d9c0e04b91eb2e84e0eadc7c790d5ee3129eb6f793d7b9bf4d52daf0313f841ea6688bf10891ef87aad500ea53b94662dbd4b7110103608bb31cde255ab82f852667bff55dd273114e5c1b1471f86fd41425067eafec25f8fdbbdb08490def14bb2d847b2eecc51cc4ef94e5a9f415d59ea8549b232cd8b6bb621d655989864d85de41d542f16eec86bc5f5d5465aa2e3eba1d1b82ddde61dddac0b62d660101032ba3f8fdd69a31c1ea2fa1966784802d3dbd848c479c93e12bec95a7ff15ea6bee5fbbea15ac31cc9e3e8196b8946aa322abfa29b044cdc5008313883885843728e9cd9a7cf1679fe374b06e1cf5ecfc51af75193797258c51309d96e7a71113ec0896b9261cd6cd2be\nmsg = 63461cd56eba70d756be706bd754d8e26d16629a685e3d6159e5e8684752574d6fe36a66755e327905f327c75de1158c34a22a99ce4306675bd876997225d3f508a2300a5029e7860d8eee842e28a4f3709dff9dd84365127e6d7b9d8d59d095894aaebc737dfebc5cdec19318b26245f2b77dd1c507cbc53dedc14f4a881fa4b41d3fb2b3b7569b36bb11bd79b562d464815ae4fd2742f03d78c50cfb22a2e56fa5754793390fba75ab1d068deead4156abd95566c051c3692f8e53bc4fd4e5a605b4adb29a78cda0170dd0b83546c951929adcc42bb4a2ac25439a55f0d193683aa521319eda1d6e0fc61ab084aa52909fdc220bffd22f2c691c579248b1928b08f791a3b64e81f587e58baa7a68e5c0b2ebbbb95418e3b2e0f210d53c33abca5076ebd4e0f5f7fd8117c3ba5404ddcea670da37c868e81a23e1d0f85f878917ef825d5a6bb5d257589ecb77c87a2cfdd6df915d343c38cef865ad4d0126c86a668cd64d6561c374c08680\nresult = valid\n\n[d = 33136923b595040cca19c000d9e6a1e3216b18c9e46f18b5b1e67f4e52a748127a9159484d5fd58d5ee237d363810c02db71937477e79085213e3575033cb57e2cd9a87c4a04f852d6b486580d410e57426d7529a16050cd30b280ddfe7f7ff35dc57caaf74152195da8d3b32fdee1cf1d4cfa2f615415f7ddcabf94a53e7af181b968041650665b517b45dc98556596e7116e247485b450e8937dbfcea703deb93be440bdc88ea6fb131ce97b7cc27e22720ec34222563ea0ff369f3ee4ca6113a2e77442cb9a7e616fa335b90380bcd954d71b62c201f1b3af478f814f08d2c78c982f9cacf8c9f63a06132b8164b69bee8b987094db722d99022efbe67853a0a6006a66a0e2d16b2d78d8c7eb1a568b647c5bfd81cb9da9afa3dab576a2b1569729aa492cc73214f473d4dd78a186d77b39a1f2ac5dd8b8b1f9c3aa662245774af9e2d135c7c267d4d4ca4d0d3173631fe19016e01dca4682de5d5c6849835487521c28a559a5faa8aeae2269cdf5d722c26fadcf3f759c4fbc23156990a1]\n[e = 010001]\n[keysize = 3072]\n[n = 00cd558670bb52e8c170723ac5b4edbfc4c1509816d2212f17808d7a17b637e281402984987e01fe42970fe736ab5d4d9b0c79b78b57f8d8883591fdda2242c87c68c5927b78370feba2050aa7f59717f7f8c9a0b23e87e6d5c7e6e618cd3cefdecc593c16cce7ae42039d671c2a5e8fe053dbcf9362e4920aed0a",
     "2a840c7c80444a2aada474069b25a79919882f44877ecd181bbb12582448f1066984633a6cf28b2cc751e917d84b475bcd91c45c8e822a874221ff254949c379d28f9e12ad06f28f0dfad56de8dded0a10888c5d18c163b7a9e826408dd8a27859e33874dc409fcac674eb8b5da86afebdaed4e83456df003b41f0a145f5cbc2b95455807080e2fcd049a6a49ee421b8e146fb9fc31f43bc7591ec25a970aef4752af01175b9370c20b49ce1bdac45ade8ae27f27e62f7716cbd5d49e7cbdf1e6952bb2403a01fc1d8b147dba49584931d7e0066544223a614d157beacd2f1bf36b4ad926c3073d9ba13a55df83a99017c500585320efdaedbd3ca91c227eb1f92753e3bed23]\n[privateKeyPkcs8 = 308206ff020100300d06092a864886f70d0101010500048206e9308206e50201000282018100cd558670bb52e8c170723ac5b4edbfc4c1509816d2212f17808d7a17b637e281402984987e01fe42970fe736ab5d4d9b0c79b78b57f8d8883591fdda2242c87c68c5927b78370feba2050aa7f59717f7f8c9a0b23e87e6d5c7e6e618cd3cefdecc593c16cce7ae42039d671c2a5e8fe053dbcf9362e4920aed0a2a840c7c80444a2aada474069b25a79919882f44877ecd181bbb12582448f1066984633a6cf28b2cc751e917d84b475bcd91c45c8e822a874221ff254949c379d28f9e12ad06f28f0dfad56de8dded0a10888c5d18c163b7a9e826408dd8a27859e33874dc409fcac674eb8b5da86afebdaed4e83456df003b41f0a145f5cbc2b95455807080e2fcd049a6a49ee421b8e146fb9fc31f43bc7591ec25a970aef4752af01175b9370c20b49ce1bdac45ade8ae27f27e62f7716cbd5d49e7cbdf1e6952bb2403a01fc1d8b147dba49584931d7e0066544223a614d157beacd2f1bf36b4ad926c3073d9ba13a55df83a99017c500585320efdaedbd3ca91c227eb1f92753e3bed2302030100010282018033136923b595040cca19c000d9e6a1e3216b18c9e46f18b5b1e67f4e52a748127a9159484d5fd58d5ee237d363810c02db71937477e79085213e3575033cb57e2cd9a87c4a04f852d6b486580d410e57426d7529a16050cd30b280ddfe7f7ff35dc57caaf74152195da8d3b32fdee1cf1d4cfa2f615415f7ddcabf94a53e7af181b968041650665b517b45dc98556596e7116e247485b450e8937dbfcea703deb93be440bdc88ea6fb131ce97b7cc27e22720ec34222563ea0ff369f3ee4ca6113a2e77442cb9a7e616fa335b90380bcd954d71b62c201f1b3af478f814f08d2c78c982f9cacf8c9f63a06132b8164b69bee8b987094db722d99022efbe67853a0a6006a66a0e2d16b2d78d8c7eb1a568b647c5bfd81cb9da9afa3dab576a2b1569729aa492cc73214f473d4dd78a186d77b39a1f2ac5dd8b8b1f9c3aa662245774af9e2d135c7c267d4d4ca4d0d3173631fe19016e01dca4682de5d5c6849835487521c28a559a5faa8aeae2269cdf5d722c26fadcf3f759c4fbc23156990a10281c100f793a0a9963aabba0dcd9a4f18a08e62f6b194dc64022af47c6d473f2a0d38ef862fd20f361a96c334f9457861bc8c09ffde66c5e29565a57b864911920113b5f0d269968e6177ddd89da7d77263dd9cc99108f3a7063b58216850eb84446971a6d3726aa91f4727f99302ce5ba63295c559b3c94f8c93efb8443f7e97b4ac489854e9062d199d17ee00910b3213639759dd9a5e1b8bd1b6d9a306b33fd6326268be6ad24ea0927454fcdb091541fe3c90f6f2a9534339b6f83da27c86fd30fb0281c100d451f7d6105fc90f350a536765b5aa8e42083e0f67747d67478a105e012c870da1abcb07e1c73fd46c7343ae5e7eea192a4d865c044a300a526271d4ce475c21b56e1123dc9185a64e261f4d09f94f2b43814397cd5edade156d06378c717e59d27b92f928e245ca6d5b5d53936d72489c2f62d0ff99f475913fb21424c9e0a911a441d534506200d0579e755a38346740f41794ad4aef4c64c9db039d72c400a3c44d38d0cbbefb3eab213fa287da49206bc14da3634dfa9c2d76f260ed8bf90281c100beb436c3aaf6d2a4e4510595fbd0611d960d402f6bd1c7a8bfd7a553e05e8306ee0413f8a7a25f934a50e0d453e4dab23127ed5e6ca4cbc1669f0fd5baf39d6d3e6db5ebc50d0b3a15cb8b2807f32917c6a433930b8b5f570994c31047b832c8daca718dfb6c1e718a6b55740360c8025a1c38c2cec5e88675180d18c45ee57e9de879fec9eabaf95dd98de063d84f949c2278f018a3e10cca242bdb13473954587ea4e60eaedd6142bdeb32d9ef15992dc92b2e86f677949b2f4ee4414ef2d50281c100ab451bc900186455f2114c4a420f936f81f0a82f40e3052dc4d5a8724c3c210d6bf6eaa687087582e3a0ef5dbf385d9ac3371a452be8b46bff1d0e79fd942ecbba50f95e9654851d2c393052b2d2fb7c08ce433a371e672b72d92984b1b3f39a7d61d5a34bc98b46c98443fa61188e71e81b8978d256dc8de207219d82379f1482f89f6a5ef2e0bb8b54c2ac2384e730cb829b6b01874b15b2cfe9ee369a1765f4b52b1dc3c03764f09e970980105a9356a5d59ecd4813e52f0ab5c2bb51a3f10281c100ca356699c6f5b223bdaa954d5a6b95c4d0b0b90d679f302e3f3d6a2e6fdb5b8c2d34a2362b72fef0cff0c7e08bb63b88d82bdf424384975477943e464a6282a3c301b8da1e77fcd5a4f28d2906886876c3094224d6b0f482fa388585c0b859d79b0d76badf107072971cbfc6057890c50c5de1e7582d45dbee868fedb52b4de3b2779650ffc977663dc7fcbf0da60eff97bdb3257d0739b22738a68e31a819f090a96d3a79e9ebfedd99b677e93bccfd4112e4f40843324703eeae57b3f5089d]\n\n# tcId = 65\n# edge case for montgomery reduction with special primes\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nmsg = 2d6385fce580f795102dff20c7917588dfe5304746e5635dccc732d3a58def00efc60fe4af7805f09bfca49aad1ca464b6658daa7f133c12718ac8a6f60702eeb031d49ae35b99ec56d0c7a0a33108ca98b55ed68d27c4c81c38c02e82bb90060c5c2fd9d411dff55509b1e97908d152a4b3c93528013cef644dd70c3e99b647b403e49d0175c818de9f1289eb312cc44ed3a408b4f7f6ea03e44f9f1dc07ddfe02f2729feeb2174c032be05e9eb9243697264016cb0deb113266c3b\nresult = valid\n\n",
 };
-static const size_t kLen156 = 319528;
+static const size_t kLen172 = 319528;
 
-static const char *kData156[] = {
+static const char *kData172[] = {
     "# Imported from Wycheproof's rsa_pkcs1_4096_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSAES-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[d = 00d3519bd86edf5dbe9c64a3781713dd049b747f5651fd918cce8a9b80b6d6a2fb6aab334ab569a89b58982e0aae373090299fa227f9652b802d23ee5ca6824c433d01d40bb0473b16190a8bfb137c0a704b4f49b45015bfbee1f670446f07595259d70c7d79ae95f9b2543b0162ebb763ebb81c4b6edff9d197dede1dbe57e40466d156d4dfd5d7634c45534fb2bbbd1bf257817a173c0795fdbcc533976f4a0d04160f299af5dc272a814b36d5bae5116b9542178f1d554cab7a6453035482b981add4bd8ffd5d500839b23e30ebd3f3868f07584cbd12ba089325982860f69f2bdc7077b6c60f58a2272823379e1023704165f7c14f64a18fd5b245a18149b7eda3385a56ba9e79502a27bf13865cde35be15de03d06aa6f08b172b7eeb4b73cbc157019c5d933584a8d1add61b7dbca3b253ca0cf93dc9a8a3aac2f50227022e692f7b4767556620cc928d63e31078c360e2ab4b71a917e19e7eb09380482e5b4ea88202871c2a29ca6f66b2fe304af609520e4f81d64c26768bb812a86679366611f4cf6e89e2bd1d9d7e28729c7f0e4e3152d7ad7f186fa32f01e169ff06a12001bc179dfd0dc942cbabc555f67f5fd043e0a3354340fa490d2f123367be926eb3e1dffe70c3151c87450f3217dc2aa0b5a7069c5a17d55614c9994139f7b37b49e9fe780af65a0e89e2e58feaaffe163bc9d19eafd9cd29b0ef3cef3d01]\n[e = 010001]\n[keysize = 4096]\n[n = 00f601be0dccd04aa40b12f3f191ae17c1f9c8c0b68e7a77e14be25c3c7907cb1d33a6ef418ef41852f32c98392bc5c9aed91c1a1501c503eab89b3ee6f4f8eb2e0fcfc41bd03609cf6a8eb3aa6f0fbe23187b33db4d34b66d128a8aba0a2abf40bb9d13d8e2554569a57ab1d8c61b8cad2dc88599ae0da5346e15dace1bac7bf69737c22f083be9b46bb8b1eab5957b2da740275e96c87195b96fe11452159dafcfd916cee5d749a77bc3905a5ebd387ae445e8fe70f16e9a086639779ceffbfd41557bd99aea6a371a6b4b160615a1a12bc6958d34bce0c85adcbd8392fa10ceca52209d56196ba3d273ce228f1f111192aa92de2a039798a17bcecb4dc6100e6f8ae8c2643f2ae768b2255f082c978e95ca551555f10608231cf8003bbf807969fff1e51914b9a8c9b8f4564645b9e5d705ffad29663f5dae3d76652b422e43f13e6c1491090805c2d1268a74a251177427e33a9a91175c3670b91746008bce1fd231e6e4f2ad70cb43aca5f07600a6d31dd02915243dfdd943a02165da367a6b7e4dae1dd2e8b836903080795d2585076cc1c15dd9e8d2e5e047526569b1bfd395d957eb9fde325d342d14426e71efdc1887515e53cdea5834921f928629e748eed097ac4024e2bf255d70411f87373948cf8e8aa7effa2b0ab47d5166091e1aedec60568b155bd9c27bc55f3ece35f83d636dbcd5abf4853a051db94d5045]\n[privateKeyPkcs8 = 30820944020100300d06092a864886f70d01010105000482092e3082092a0201000282020100f601be0dccd04aa40b12f3f191ae17c1f9c8c0b68e7a77e14be25c3c7907cb1d33a6ef418ef41852f32c98392bc5c9aed91c1a1501c503eab89b3ee6f4f8eb2e0fcfc41bd03609cf6a8eb3aa6f0fbe23187b33db4d34b66d128a8aba0a2abf40bb9d13d8e2554569a57ab1d8c61b8cad2dc88599ae0da5346e15dace1bac7bf69737c22f083be9b46bb8b1eab5957b2da740275e96c87195b96fe11452159dafcfd916cee5d749a77bc3905a5ebd387ae445e8fe70f16e9a086639779ceffbfd41557bd99aea6a371a6b4b160615a1a12bc6958d34bce0c85adcbd8392fa10ceca52209d56196ba3d273ce228f1f111192aa92de2a039798a17bcecb4dc6100e6f8ae8c2643f2ae768b2255f082c978e95ca551555f10608231cf8003bbf807969fff1e51914b9a8c9b8f4564645b9e5d705ffad29663f5dae3d76652b422e43f13e6c1491090805c2d1268a74a251177427e33a9a91175c3670b91746008bce1fd231e6e4f2ad70cb43aca5f07600a6d31dd02915243dfdd943a02165da367a6b7e4dae1dd2e8b836903080795d2585076cc1c15dd9e8d2e5e047526569b1bfd395d957eb9fde325d342d14426e71efdc1887515e53cdea5834921f928629e748eed097ac4024e2bf255d70411f87373948cf8e8aa7effa2b0ab47d5166091e1aedec60568b155bd9c27bc55f3ece35f83d636dbcd5abf4853a051db94d504502030100010282020100d3519bd86edf5dbe9c64a3781713dd049b747f5651fd918cce8a9b80b6d6a2fb6aab334ab569a89b58982e0aae373090299fa227f9652b802d23ee5ca6824c433d01d40bb0473b16190a8bfb137c0a704b4f49b45015bfbee1f670446f07595259d70c7d79ae95f9b2543b0162ebb763ebb81c4b6edff9d197dede1dbe57e40466d156d4dfd5d7634c45534fb2bbbd1bf257817a173c0795fdbcc533976f4a0d04160f299af5dc272a814b36d5bae5116b9542178f1d554cab7a6453035482b981add4bd8ffd5d500839b23e30ebd3f3868f07584cbd12ba089325982860f69f2bdc7077b6c60f58a2272823379e1023704165f7c14f64a18fd5b245a18149b7eda3385a56ba9e79502a27bf13865cde35be15de03d06aa6f08b172b7eeb4b73cbc157019c5d933584a8d1add61b7dbca3b253ca0cf93dc9a8a3aac2f50227022e692f7b4767556620cc928d63e31078c360e2ab4b71a917e19e7eb09380482e5b4ea88202871c2a29ca6f66b2fe304af609520e4f81d64c26768bb812a86679366611f4cf6e89e2bd1d9d7e28729c7f0e4e3152d7ad7f186fa32f01e169ff06a12001bc179dfd0dc942cbabc555f67f5fd043e0a3354340fa490d2f123367be926eb3e1dffe70c3151c87450f3217dc2aa0b5a7069c5a17d55614c9994139f7b37b49e9fe780af65a0e89e2e58feaaffe163bc9d19eafd9cd29b0ef3cef3d010282010100fc21b855c5ad4ca2b6970516406f71c6e79efc4126e6598772db1e082de6b0dddaaa2a2951f04148e86e0bde28213b7f600f987308301eacea134062bb0c3ddf628da9abf93ef1ce3e75b0953a484dbd3554bd5c0649933dd77e527563e90f05a8013fddac958c329378e94303b304be5f9df1fe5b043a7fdd94700a3f0b1cbbd0516b7cd94c57ca96d9fd2a8ca973991218cba33a1c23d810f7519d1f7702ab72affdb3f84a1b2a88116e4033bc4d0cfc7989c657e0fe94e964476ae58bae6b7876f36c09d32b1a63f8c47c94a74c92eedf75fc27cffe0f8452363e4bc8f7653f3cb55eaf693cec70d13c875de935a8b20439ab7e93f76981c5957fc5bb44d90282010100f9c7f748a505d23ecef9a85f8097c8cf7d7028ef6c90e22a336511582d2cc3636e34ead37204dbd22f142a3fb1d5f857b0310c7a433f51ae14d4608b01b43aa8c7ae67835f7fbe0b9d97948b39e9ba2d3a1687edb8b56ee70ff0536dab4d0551f71ed0daee9e412449f5f099bcc15e4ef0554dc79f87fec5a0dea717c7054392bf444613937401bbef3c22fbf7e738c58779b981609a1f9c11dd6f0bbe9996e2773459e4cef247b02a9fc21296ac57a5b10561824310cfbdecc90e06598370e3698713fdbe2528ec4ef3dccaae701eedc3e54ad6e7af4e68e3b39bd2e97ac9119936c647a503511cb283df984cfd7c07f0f56aa8ae3166948ef3f41b0859934d0282010100815486aab0a0896bf97f13e3eb1f7f5c49195b49cc3b6277412a3688798b18f46422df479cb941b3b54e25964a3d69b897bcc8355160e58b4af29f1745dd2cabb670f634b9c058e6b3514947f2c27de5ed424f73b1e1f1be4a188911a0333f3a6688658b3ee8e3265a512e4deacadc470ee304ebb5224123afb461984fe8524fe0b6b30d32a59f6ed2dc74a96bc7cbfd1bb44e58a7092235c5d6272e12a2c862cb8c8cf5d109aa4fb1c6472875a14460c1ed5207c4b22bc494c7947eb7ca63a8cafd31361d000ddf16a2d79f13dd9140d979149b488cbf44945a5b6aaf13221bf4491ebbb7fca27ca20e221f49c3c37b89fcf2dc0e2cb63f8f8a9b7a142250590282010100b61d84ff934a4e437b16ee1b4b9fdf4ae13370b5385bde7a5464a123c0343df575f9e128ef9df944230d39cc9cf5dc0edb28b7e740b69ef024c1bfee39fcd5340ffaea0010160c535dc0920e7cd81be533d00fa554a1fc4d3e02c461569f5e7ca787f1515edf45b196b759884de652c38d5934cf92524e807b4d3b590bc39bc417ee4885a761d28ddadce6c8fdb3b961d3e7fd48064df9340a967f8b79997438841f48579a476ddb55088c308f68f2b29d01c6597a5a7c8d066284f63e37a68c3879c32aa3836675fd0eb2719883a91944561e9dd7e8aa6bb17157f08c48f8e6fae5c3e5a2bb6b5d580eec6c97ddcd9be0a49ef283a7031ad7aba8d438df4e950282010022fb8e5fcd9b767104e71244db53058c18061e1b0d1f63b73e2d59a95e2a10cd87426a33da13c287cdef8136e5e47e93fb9b30ad92628a7b543f48eb011a86356ab3cb480f27e391b018ca187d97af3d82e31861ecafa663db78aa89c3bd468e6aadefb3a43f78bc00b8014c95db54e9d21a017e8f21f671545edde9a965ea32dfff45cda37fca1aa5132f6c8eed222bd01fed5a6e7d639580c5955777a86544c2c4c939bdb8b4c486dda53072861a0334359bdb3758475e49d90d0539944e78cfcfd8fff55bb31a1cebc65b28f51e790701b2f7912188984f034e6e96e1c5251e33fe38fb221bce7a90a86857c5f56b6ca77307c45d5290b1f088ade082b349]\n\n# tcId = 1\nct = 591be9c4c087764d1c3f38b2948c896bdca19616e70ce1ea20c3c1361d51635345bb8db8f559be2a08dfa6c8e0a717e9c6974762b73927213682e730cd4697d377f8c36ceab1b52fa4e67f7f230a1e3a551a51b6e355f3d40042d3508a0898b061bda6b6cfd1a13753f3379a1ba33f9e303317cdf768ddb009d84a357231d04aa159d88756f8037bf1da996720dc0360998f2055c1fa37473047bcad28b5c4ff5540769d6f23815cc0078821c1976249926310f0fa4013e1dd0bc7294f4e50eaaa2f5ae3cf936dea032b42e5889d0f7fb8f139ecede958ff2756be876fea0b426c902682523fda747ef8aee0b72e0a76659a689b989685de912a10cd2c7e095b147294e8cdfc9e272a7dcda458c61a6f94cbd1d54d9cec61f95d7b4698761a3930715b53715ec6183cec159f4b1e532073b7cbb9224e5c0d5f8e36041d5be8f8de2203c66cdef24a278027e5a2212bb5ada33520b304f186b5973b00c5d2ad7d73e404ca1e930828f08c85b62001f589a73ef0d1e8c2367ab6f1a3bc29d9645597cf7c0a85bbf5bcee4c12fc89af545922132759f83fddb369b55fe68f2c93a7d2459b04f52bfc2fc9ec237c14f651b41e9fe813205c345d1c36a838785a2465619fa0d4370088cf2b4083c972b17e4e0e207e142a765529b325ac91e16eaabed7d010e1735525d166cd310caab5b27e56bff36c478868233a38228e0177cec9\nmsg = \nresult = valid\n\n# tcId = 2\nct = ae1edfea692eca58775d3c35999e5738886a47884814994b29dcc9",
     "7b99e79d9f35ac1de680ca6ac6638fe73771ade65e74d13f8de01ee5cdf5c4c4ed2b86261218ec529437606353a80fe45be9fc7f9f27850a70653ad31f490c1075429ad5263c46992a1265871a5ecfc7390c86d72ead118028a3fb3b9fc81ad055c137e34c6d56769cc8cc6e9edaa31958d0b2ac87751870f8c955ed2a0999d5638c8a42864174a0c8045a6fa810b6e0204f15800dfea5688d98156b1589d4c51032c7761bb02fb90fc15643db17f398b30f79906c739dc10751011032bc75828322de3d1e98de6f1bf644619e91cdd875f18b08c5876a485d8d46e5cde5435e26eadcac8dc48ead9f9fb747220fcdb09d2dfb1d1197b591b1aa3003c61dd880fc4e0b7da59146e04eb0d12715f6f44704bf0a9a0fd77bc7b74d3b61157ff5b0221c782fc886b9cfdefcaa2cd737178c683c84055beeccdd1d402d538e0b72485f3be93d8041a145ab0d42855706d61056a1d49a656cd67486682349ed0a6f8ff52ff05ef800a969b978f93d441f896302029ce5e8e800f3b5c2bb9c92c93cda18145fcaeb8f8942787074b02b434b4e52b6ddd918c4ad0ea22575fda6b108b6e0b8c7f681767c553f5b6b2ab56bc657f7017d1deff8f1f55906767bd039038373416eb1198e0195112df8c87c52840e32e4d616963b2e9cc7524c21487d7e81696125ca63\nmsg = 0000000000000000000000000000000000000000\nresult = valid\n\n# tcId = 3\nct = 04327a40b02bf671557124f963a57b3860e92cff62c439c0425b48b4346fc60c0ebf7a7584f94d34450d20cbd877c8d5dca12f517b486c2cccb8e1f467276ac03aadc94a97fcd224994d81672eb577cf0bbd6aa948d3dc4d7f06456f6650e5620435c078787db0f36124b292349ebe011ce54b3e932fac6525a37c793846a4f08ac3694d649f4a04e24e1f5e50f11a0492a68a509cf30e565ceb9931565b4aa5c3514b2ba87c4c0937ebcd6bb2b8248abb0970d30480059daea4c6ae556f6e91b25ffa5a4f723a9bf98a0bff668a1f0c799d3b0c85b19190dbfb5d894f84fa5d72d261dd2c09013dc0981cd0c46d7a08710801590aac8ff17b237387427ab3c6d6f2a59434b37f123bc7fc0a83d5ca5793540cba582e41b262859d36eabd0aa8203ca05d4c16aaf2a7b2bc7f251497d4c8f8654deae3cfffc5d3599ab4779585bf1673196782075a91ee7c3296a2edc6ee6c30344dd0c0a82274ae17982eeb23eca5c39c7d11a2dd171c70108b0a33164fc175425586f714deb5552e90e561f7882211d3f01c07867256d0cca511e61b0cb51189d8e5124e8cacdab6042bd421447ffa7fe6cad8e7f17dd3e599bae061f85bb5181726d1c0c5bbf2c2a5c1e60f486a81782e58d90ccd5a769f98361765441de142bb0a7f7bd406a537d5be0c2773e847b1df1d49ac1daa963feec84954b72a695b74281159647a62a3c19acdda\nmsg = 54657374\nresult = valid\n\n# tcId = 4\nct = c550c1db08ba647b812973ac38784a62e707840367a725e60489a0995a789463d05a3a6ef7cf06a8fa7304cf28e8b11d1b684ba87e3be712b2c086e2acc7c8d46ea84175bee9e4d25c4a24967296374811d4afc6675223e624b7f2c59f8a02a875b1ca75de2f5fde43b85b7aefcda3beae7cfde9ea0215c48d65a8b4014aca446b780c785a49fdc8481e3c342c82a66d1103bc48a4bef5702e6b9157ed367e20605d4645084950abf36ee49d76d25bc2639130e01fd9592ef399aa670c3cc549787466bf7fb5fa5be203cf86759419812af003850ffd3bf9c7170919ca68c224cd4fe9a3566bdc17793a69688313d71aded8b64e3be8c47f81103ab35ad6090d98d7d00952aabd1c67ece3e2ee12717f4fc1e849ce2b8130ac5873ccfb99cf683756641d11747276cbee0a9e75a7851012517bd4c197cc843c9f26c6f2f357323918600db96dd4388202afe276edcb9b73b2d7d43126c3a92f7354dba6e67a1bda30612897392116d33e53005e4eea4dda087e5eee5a30739076c1ba838670f0315ceb7cdc9b7aaf5aadb049345c81fcd972431f80ae8722a3f4a58b68c42f3206f8cf434205700a27742cfe25a0786e5f0bf4dbf9b150a52807be2db31b3258b87f3f5e617fb3b1839d4353951e7f556ad3689f0d9418e4311d99b790f39ae05cb28fdba711d33e28bfe87421fef67d98038873a6bc8a103ed14dfa87249332\nmsg = 313233343030\nresult = valid\n\n# tcId = 5\nct = 06c23a6999c870c68707f2c2d85c11c35fb77ef6cd263393a1a6a8363298f4b8937a8d176fc268a9a1d4f3bea51623f7ff7c76c4e4c8b12408471a460d9d1f226e41d17da80b03efd27ba00bcb7067dd9e02c26a3ae9f8b082f6cdcf1fcf76dd2ff774307b7810a4128eb2090880c967845ef02a6da6344749fcba456bacf43d915bd394eb9babdd19140287e44bdf1951eb4c058b489c7f3984dc5763f64b918f35393c4f6e86c457133a101b60cda0f9d0c93c90dcbae3345cdb894947d8bf1371694c0c21d009d4173bc849ea7d00f0d2c77e4683b403c32ded38f38afb61ef1348e889b3d8e0f787bf85b6b93ddee2c97805734d20006111b26ad1ede2d16d3f0238369d5008d255f1e1c518e68f82d0a09eee6ca803ebcf11b95cd20e195cd3f0d8221a78bad42820f2a5a7184b461a7002d06b003183aa66a313d91164a7d6d09aa567aff83e3cd512368893156337a741b388d1f18b10de386a28993117679deabd6b00d7f8c641d6f201ee8fe4b9934c9bdc48a70f21450c6f23b21e655f8818bad28f0755c856e3ee926b021f2c3d5336bf1752d6b54388b745b6e109d4c6885608a61ea8a5d511eb7836025cd1503bb3d25ac20819b7d9a1257a8d68b0bc51e7b085de69c267c0590fad3e003ca8018835b2c7cb32a25bdff2bea8111bc1656da3b8cf4ce3ce1a5b2c6838d9c276a6c1a4b58b07e17aad2c645736\nmsg = 4d657373616765\nresult = valid\n\n# tcId = 6\nct = 2d452fce3031f644f4a22e0d7b2df7296edb3aacefab84e7c57107021c61acbef498a914b9a70d3e33f97f66767eed7a14c16da88ec156e436245b5d9d7bd1023c997155e2e64d6801b535c3c861b19598807387c0ee366d024950b996cb206155493f0f320cbdf58f59c5911e10db3f8034b89a81878dee5a73dfde620ed224181364e7c7ea5812c874b252ededbe4c8644fdd3d312c7bb4785fff4b23a3ab00a2e5fdb3192404d8f1af8668d89e7b4aaf70634b98d98b2c244c336e57b3cf8411294f1a614f55b06a78e56eea98c6f59b2813643515a919f7be4ed59dabf69d68f43376964f0243ec6dd19a0a3609f8ce3e722ea3375a6b5f7ab24eafeabd58f81a2b3d2bd3aea2e6cfe396542961c1fa9d806037945ab866a0af6b2ff9f517d8beb5cf0c8679ec75324fd82c03e217572bdc12f374a445ce528b4ee5d8c93d3b8f254d372cabcec7ca69c4c539c0e1d02de02a0a337bdaa9910ef9402f449219b2e7376637dccdb01693e50196b7691cd8f6557e42afa7b9b7a7c925e6587613ccf007bbdf5457e67a2c2afcebd609ad8d04903cd2f748e1fd3eec0f7f812257da9d99207788e9770d12eee0240f9ae93ad9ac9b4fb63d4bf35f0c0a363bcf19eb0cf7085ead9244d4623a15deb7b9c02698d38ee78713fb67ce662ad0c76130b0b541a5120405b8683af5ec83bd8fedf72bb60491f829448cf76a73e534b\nmsg = 61\nresult = valid\n\n# tcId = 7\nct = 3ed60cd73681d506ccfea349e5fb086eab2b679ecb796532af888088cc84d8692c6326cca3745d20a94e710335e105d2b71f6834f7cd16a1a2193a3ed88aa01b31cc5a8734178f6d9256a9a660e967ee58ba4ad63cc33ec6a08aa1c324a88f55aa700b4d5eadf46cbf7a3c5304bf883b233d5a3a2f9ae8f858959c7f832e793b5dd68f196b83702d929857a39d74a4e386f7f6636f7c03b96ffeac87625088b07a1fbeeb44fc03cb312b8f3b4308846b0566208b516687c5a786ee443ab399ea598a2631d40a7ec8671e49b6f8be46a337d9fd80c56308857247cd714205d647fdcf8019608f20bbd7816f427eb4e4384f8c10c57fb0a7a3557bd80a6744b3ce3f53ed8e32b2e384665bd274b9fd747c646111ccea90eb809e690bba31d190c6a2e2a895fcc71f521fa9c0481645348b718aaafa968bc18cc20065f25924b8f0565d1e93875fc6ec0249e5be0b1bb9d8ae054dff2a368ff4b11a3724fb8c56033ebda05246024ee0be0126217b6988242a17430284d2e9b204b9296ae22740a2e847948c60085464d8158d9ba7db29f4594dbc85482304e466936689599505576e92c6441653c2744a37b5bca6fd88c3cbf990433bd3d2f9977e474b4d09f3d489e78700df6ad9dd2b8170652d7df55557d86055b803ffca1a8c3f214369bfad683f77a4e134fcc4dba92134117323893a83c5a76c081d7f8198c2040d3fc308\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\n\n# tcId = 8\n# Longest valid message size\nct = 3f1eeaa59c4b466f1cd4cc42345749746e18c80805c885df89ce608031692414ff9d7164d06a3cfcb16d20b439e65c44ec534016e9d9a173ca5652a707841e877c1bb3ee6e7440580e1edba79c7ce517bbc32f127fe0a5ea6d2715a1742adb5ab5538665620da3028cd1a50601942c0d255dad1c2b3fd7789318c0257c1ac140c0d3cb0766a7b51bedd5f1e1a65e533422158929824b7a8189f1c3aa0bc51586a82fa130bb465aa140def445a86b6d6331d6d98547d8da1a1c989b3d5e6b1f4b8278de9863cf8cfc30c776daad90dd4b9214295c9510d37a035c3c104c16d57b65ec0a816173ccb580e16b537948b3b21aa5fc56e78663b1b01c6623a977eb4aecde5d6aab6320be170f9cd5cbc6a520f32f23dd000116200faec4f04e7883abe9ccc482951384e7149cae39c6385ca17593a9cb2428fcb94eb6986b1a49b60f5fe43121423510d98bec37f700abe8adef9fd7e13321dcad201ae5a6033b59806f795bc0248e4c039e2f770635e1ceab3cfcee3f4c7ca68603b410cd9629d2391f38ec8576cee684aaf7e617d8da424c323124b28638b78e941933c7ebff9ab2d4a27069b83d82bdd694715be0a9145e30b9438d0e1b9fbae8ddf215f010ffff55926828d6a8f4c64c38370e5c3edc7385fef5acdbc4cbccb34352c8083b6a6d86246b940e7d19e98ee44c5b8d867d5b746061ba71d50c2d7ab4af66db6afcb1\nmsg = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878",
     "7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878\nresult = valid\n\n# tcId = 9\n# ps is all 0\nct = 556ea7b7b4ca2cee4cb4a386744b99cc7fea3ad359cac1f08fac0417e051ac35a704c051a14eb3031bfb25bed2c51e1967068b1927d595d40c6f9d5ee029db187993bffacd772075e9b16f8bfc0dbd5a18ff065cb6f99ed759d219f3e03baf53c6270c5ae1e66ecd4ca71e44bc8efa0292987c8caef2b464cf3a2fbadd12613ea60e0a5b5e0fd207388374d20f2be36e8332ba8b37e20b8f461b87afa253a34cd7eb3314de4c3a6427acb27429cb1536f3171224c84e05f81537a75e6ec28a82ac6fe21af38c26831a9e7cde61dc7f3e0992170284e99518a3048ce6c4d687a3ecbaa8ed0244371343bd935a05be103d255a2162c7b914b99731f8b2fe088994e6c616611b12cf5f5f6077e3d18bd435aaf0aaa53ed40c023b8d2d13fb190fdc2022049c6fe4b6eb66f0bf6a36e81c8a920c53bfa9c93b51f8b2659051e445c9b816c02e2072024227470f10da398e35679e114795053d2f96c3fb033cbdbb0b2e31447584c35abd60875ffcc1bfb24f892ef213f507b8eb63460df382c6c507c6ed17ebbe049501ba62f53b499ff31d2c04a242f7e16e312439baca228130c3874e36c84c5872ebe774e3dd25dbe6b5aff945cb0399f742d200be7057375538701c3d5101feee7b02159ded185eeeaaedb72ca1d4189ad165b290b6b3261b0cbf74a87e1796c1b128a7d8bde89e189917215cc013add1c07f8eb1de069ce048\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 10\n# ps is all 1\nct = 2e6309334d66e15e8cbe39a9cd2c3c6d8f19d49f017d87abb99dd4b32135968586766bea12529f6eb01da0a1902793ab8fb656e7df70b5de12548670583a75d68eb6bd36357fd326d07aa4f1c690af4a4b6189cc2de456d163eccee06ecedf4f41a0288eec24c2e3abfbae9ffa349d578594bef818268925dcb294ee9066355b061513defe161749a2469abf3ffaa28d537d55a71a7910e4b29836298f9ea464bd327d33d33967029b1731c742cfb8d4a6fde07bf28789e2a2590d084f7330b52c9ed8870922dec327237b1ee9178dc611bff14380b330ef94e677a40c81c61368b1eeef2ca753b90861bb4421f7da836516378eaad2ab7f80e2642b84f66fb0acd62807f9673b8d975db172958d54528c915116257a5ee2fce3160253190511bcecd7262435fed8ad1a11ddc8bf0ece11333b01a3087f40beb1c4d112c2eeaa46f3c7cc843526ac0abf0104c94c8be9e54ec285ad5703ef1514fd210cfdaa6b2cd2e9d39bacfc338739ada8982b5b6af683ec8c2bc902bc9bc4c9d5ca6199fed502481d86f2a6f9dd23f3f8eeda71cbaf90b51a50f5c6280aec08469fb45447ab4878cfca86ef78daa0b618b9af3c16fc9e4402520b7fb3abbf3086a2ecefe84a10406b879e410fd46c518760059e37f56befef10590593cb4707a0605c056051956fcb9d95f36d4f3852cb15aae172578f73522f966d077a9d8d98d316b664\nmsg = 54657374\nresult = valid\n\n# tcId = 11\n# rsa_sslv23_padding\nct = 80e0480b11f19fbef3551fb123a4fd968d5e5ff64c88c1c2b70546570eb585d5b119f9d511fb15ab3e25b1dcee9fd3f337f949377af431df9ea9b60c07225da87ba0d61c0f7a99aeb130b09c294e0d49caf3854a65fa98be5644457cba4e5591b0f0434932b787e0573354932a6a9f0e3355524121b04fbb8fb5e4a787fa509a7fa946aaa34e91c16827a65639b06737bb1a9fd5b85c85c58b116cdb2a900142ff1886292de9d4d944edcaf4e98aa28560bd6d35b4d64f0c7e72c1b572883581ec8e479a836bc2fc55c49f8ae50a9118a81597ac5e0b31035aeb0cef1e5327df6ec7179ff461b6f157c690bdcdb9937fee7e8355384667cc7a69856f6e86457eab8d87ea8be33e5f684184001319fdacafdd20b90e2e03863bda108c349de950377fc11f20ee32f481d74fb656449c309459a0d296124f726519a73c2a5b41bff6779d91ae9b47c6091e695ee7bfc59ecfe123e4d0327a3cb5b04cf0a998487afc20a3d0aacde87a080481ae0455796c5273815cd2b2d76edc7c9558be1ea2840a17584941b3c86acd32967a64bd1295a94d3ab34cfc67b2cd27900898bf461453a8716c8820ac8e6e9880a3eee38b196d9af46a3ff7abd2354e1a5f654a1dc1ce45cb4902988e3e14d78d78f96f59ca20eb5cfccb2767e937a55acb7dec407f96f6e5f6345daaca1e8b11a72a599515e08a96dcdfe2a8b8dabc0a4dcac4cabd\nmsg = 54657374\nresult = valid\n\n# tcId = 12\n# byte 0 of ps is 0\nct = 4a7a03202b982309bcf2f99d30cd0bebe24b43800e3bef58abbc11e865ec2bceed4d25ae1aa95750d267233c5db0860e48228a4fd8c2953fca6bc7aef959729a7d35c9af4868fe63303ba4f00a8fef777eecab7baeb5d9db61c4a7581eb0c12c887ab6ee59f6d0d8ad044c64c39e344db3f2fb7906af25dbc1263d9ee3baee8ff46a49fec4d893425bb22ccfdf7bd86adb23b3171ee653bd129c042c60d049730a28cd9ca83ccc8d8838341701f545503f3e356bbd4ce269f455c9800a1e03228880edb0590136ec3982b33a4f561607d00eaf9ddf68b67f18808c485f7d2001712ca5e62ada62d3bb575e612cd2e94bd88e831026eb7a23cff7f3be1bb320d853202039b0f59dde8211f9c65494335e99b9049b5ca356dde17f3be1688e6cfd232271474065124a8b55186500bc42ba4d6dfab381d5dab6d7ee1e7305e9ee93f1202a9b8dc6a9b7f69034d9de54d112891a053223b8489ee5b24238629ddf6b5d78ec366fd0b00dc612c5751248108106a80676a3137cfe96008342696ae59c369c7364fb070fb0a5af3ff548f119c88f2a7059ef880d0d135b085918d48a377027f78c72ac6b4eacb869c8bf86135d459cd07202945b97873228fb280ef770fd317ad5b2d36925826d786bdc9fbb760d3907d3ef826a6ea47b0eac1ef709b7efacd40acf51339ebe4b99702e084bb6a15f070d409df7e7fc802e0e6a988a05\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 13\n# byte 1 of ps is 0\nct = 05256ddf55991cf3e74b8fb8b3172db6e327f15c2cf13830fd169716f7e5e717147f91602814e4e7b38ec9bb7fb5b5b60895a89a949d835398ee6798857e05857438ec27dcc897a777b85d420146e5a0f0ff64b23979b9626bf6a34a8e01658fc143eb9d6fdfe1dc878363b038e7f2d91a7f50854684f7bf2ccbf042477b9c6c50b8146f594800a5b907f04fcd03220bc25260748b24f6281d3fd939b51d2d694fa76941b8873c0c70311fec77bff5b0752dcaf86a8a041a29c5ed35b0a96bfe6f82754cd2d173763f9753dcda7f5651ec40e1da282c01bb0be7b5faa390fd134b05af61b3fbd83b0ddf0060015843aed03bb79a11ec906766a6fc82fc28016165b7e5f9c9b913d52eb0e1862209b9cc6950b5d47c21c3fd0673d0d7aa281ca5ec3a36cd9a4570419a29820c75307bdaf0012b68579a6ae9e832825f47ead6b6af0a1724ba7679a88233082b65862bf1fb76656b0ed76dd758470b00c147965b4ee233275476e9030ed301dcd19cbf7ddfeaecad3d17d7129c4e9b4352422a3d2b812d09e829d5d8c2e41f6aa10664824cf0d3b4597aa2cc137f05df672f17f0a345739c93f2cd583bc4ed5dc2bc7295d89c0d986eb88ecf5732a87fb8a10fb449fb3f5da74952511bf2ce03bd74db026b76df93b816a64b4372b33e873226681204022fc945d9c2909982e6517ec2157f57f4a36cbfadab9ba6c8589eb03310\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 14\n# byte 7 of ps is 0\nct = 9ea6991124c047788b4ce768614edc52cb1bf88865f80a7b7bbbc435c1389625a085a5030338856527d86f0fa9363101a7800d7e61dbc081d5839bc679728403bf028a22cebbfd2c9984d581ca79cbdd2e9962fae64a5bd3b2a8d419cb39fbbe2df7b8a9b4e7c603ae1cd923cea1da1561beeefa680d5bb36fe9822ce12e1c88498c2273b76646918353c663f91a2f54432cb3fdbc5c7191ec5b8412da54ea45616c4125775dba29930c36a12522ff3af5eb628d2fcef30b887114ab5908fba3ace7b7c71b101ab1fe311653997a50de08b7a3e92d50eeba2064e9162c13eee23b9fad9ec00bd62e62835745547afeb8fc1fa5af5a8be060bab8e4e2fa2664f62c8956ad4d20dd27932e57aa44eac7a86b867c4ff6e049981109c84585bdb50c31e6064dc4c592cb1796ab059849db5698e1956c38f0e07257fbadda137b57f03b8dbd3d6d5e4c06474bde194cfb7d671ca3d2f99b827af954cbf0c0dfff8cd63af75f7e01b6630798a00cc01676b0cdaff74cb270c216282906931a7daf29a4ef8034407e186f2f9dbeac1f712e8bb7b1a4b121e045e9547d15ef1ba1d8015f1d19a3be353f7a82a88c130352b8cfeaaaab871902fa5f68c852931b4a014e4fe3644861f276a6c17adbaffaa7cd23c223c4e54e2b85b46204b66a3c447b4db722e6a9dc0c61ce29407a4d246a2fe8386cdfe99732316026a2c632afe5084297\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 15\n# ps truncated\nct = 1427b2364dedf9b33b1cf70f8823b60a2686520f904e89247bc6b5b682170fd152554f862ca64234345bb83b118539eaa4c0b7fc46e21d2fbc7eb5bb26ade5464a7723f8d44c8d0a88e1d1d7fca1717adca7207b55c5b52457c8aa2c6d9a19e07e04ca09ac39301512aa66d61c5363898138d1f390af651cf230fdd8cc691d3c69dece67e4d9301b74b1cf6fe7aebe6626d49f47ea33e5861ba4c5bc0a24f506b4afc959e33733fef1ef7a207c29c610ceb9ae53f7080a84491bd12d609ed216445ee54315915b892561efdb1781150fe9c243af8800c7edb8466da8e4d0240c0f627ec2106326805cbdd845b30ac35dd46692ec964f6696adedf72948474255d50505acfc1f4be6f9b300708861f2b9f9796b0d488ffabd14f6750e67477c59a0abf21f066388b0cd1133c90dec0bfccf45f34f777748ca8687f3268c9b32d0552588df9fc496f29d7a9152d23b8b51203cf151c612fe183432ace03fba2fe5068d749463e50bfc09912220a618f650afe592e3bc4c7314e6d9a12aea44ac0b50d79c8b9393b0df70150af7da499a9c2d1ea3dce363305c21f3ece8f3880919bb57e764760ff7863c184c043be1c8de30b177e1bcd5cecb5e804d1ee96fc823f7cf2bc3159381c78a49879407191998ca759cf30eb503783f88ea157970ddc6ba7569e1362cbb99eb45b6578f142df5f1cbbcf2a713729c2a0117781f8509df\nmsg = 54657374\nresult = invalid\nflags = InvalidPkcs1Padding\n\n# tcId = 16\n# ps missing\nct = a4dfae8779a11c4254a59",
@@ -3926,9 +4025,9 @@
     "59cd5cb75cbbc743f89b535898898ad298571\nresult = valid\n\n[d = 008777a7f9e0311bd8a049b874396230be6d1fc90ff4985e251641991f019ceb1914c2d911cc1b71f5f302cc3a4d094db7e9c1a544a07643d718c333434b76c0dd90069a90e7f8a6aae688c8d3d909b0c92a025669f07b55c99cd07757b58bce335fc9799f581eae4acf614fb15f07ce51c1b7fbe74e280238ca9a84cbe292534d10fb64421996652f7300c872f00f7ccbade7b6afba2e833be20b55759b112fde52452c481597cdd9681e9fbed850b16fda2cc86bdb0028150e10688cc8383ff58c072e02a86553ba2bfc07092d1d53c7d10100bba00464b776a07367b8a5f2754d3eb5236e811fd8100f6a9e14fc07bb0154de227216f22c434b07c179d69c754a87505ed6cdd1cb043f21629204fe4671248c4e70d28dd7a5e62fe9cfd08b15a0bf5754158c55bf271bec4963923c06964868c00b70f7f87ea54e2b188d3605477ccfa2f658a6298d627f56ae95131fa0e12c536b8afe962f8daf4b9e66bdab867e3809d80c5334421d14305e3fba5710beebd3f21012dfeb946644b1af604aeecb93efe288f047c076acf57981e0b0e873fbfdfb4a49579a7c1a8b2c945341e876027e93c213f37b6c09e1252488d31436dc62a9924c4d92fccb1f51296907e2faba674dd7ab7e3d73761a7c622bdbdabd45f02cdc66f0d6400c6b45875ac720fe045ac86a8e8324770aba7b9d7bbe49b98a819925ab8d200285ef0e927d55]\n[e = 010001]\n[keysize = 4096]\n[n = 00b9343dd96ed558cd9a99740fb5de19a5ca4c740e108bcdae2d6afd8d5091c09eed87021fa1bd291f6c23fd6657fefd470fa672ab568e41f5e37bf1b38241ad62f77630b644cd77be7db87d49ae13a151fe992198fa98d790099fabf71e50853482f321c833e5c7f76679faa9ce2e4ed7acdeef98944976b9b5a06fcc00c7e36a4d1047556587243903b678a3085eded3a17e7a7e691966a0a236ccc929af83ee37a78372d52cd9be2f79cea18bb20fccb59335b09b7d4e65b93f8f06ac983e521a341f38019f960b80661f9c4eaa7aac7c90019aff2c1ed85571ecfa86c4618831739d78af3af432e7548674daf1a781601ec1ecefa91fecf98fa5113de67f029e01fce0870fae71cbde1aa2b25cb958ef78ada540e054551be75c9659834d2fb458b20be0c4dfcfd02f5c69ade32a6301656d83f7ec8b88a610a9a4f5ab2c1e60fc8a096848658a1cab992cdc9954e29341cdbd4184909e6079d322b8a76eda67d6b5ca878d850d6c3ea2fff7119c1aa313d03797494f11b54cd36e4a8b22572b0088251f9fb3ed1531a4e70549054373bd4e0a17a0230d104c3f666ebf2d14d2060405b846202d2e4a44adc708b18749b75235d91ef786ef9b861ac1262dad728a397cb9e299bb64733d43aa2d21477c726bfd5993804578ac0533467af9a8ee31d402bcac633484e5445ed3b1a74d2a95feca1c4767d4cc7c150765558481]\n[privateKeyPkcs8 = 30820942020100300d06092a864886f70d01010105000482092c308209280201000282020100b9343dd96ed558cd9a99740fb5de19a5ca4c740e108bcdae2d6afd8d5091c09eed87021fa1bd291f6c23fd6657fefd470fa672ab568e41f5e37bf1b38241ad62f77630b644cd77be7db87d49ae13a151fe992198fa98d790099fabf71e50853482f321c833e5c7f76679faa9ce2e4ed7acdeef98944976b9b5a06fcc00c7e36a4d1047556587243903b678a3085eded3a17e7a7e691966a0a236ccc929af83ee37a78372d52cd9be2f79cea18bb20fccb59335b09b7d4e65b93f8f06ac983e521a341f38019f960b80661f9c4eaa7aac7c90019aff2c1ed85571ecfa86c4618831739d78af3af432e7548674daf1a781601ec1ecefa91fecf98fa5113de67f029e01fce0870fae71cbde1aa2b25cb958ef78ada540e054551be75c9659834d2fb458b20be0c4dfcfd02f5c69ade32a6301656d83f7ec8b88a610a9a4f5ab2c1e60fc8a096848658a1cab992cdc9954e29341cdbd4184909e6079d322b8a76eda67d6b5ca878d850d6c3ea2fff7119c1aa313d03797494f11b54cd36e4a8b22572b0088251f9fb3ed1531a4e70549054373bd4e0a17a0230d104c3f666ebf2d14d2060405b846202d2e4a44adc708b18749b75235d91ef786ef9b861ac1262dad728a397cb9e299bb64733d43aa2d21477c726bfd5993804578ac0533467af9a8ee31d402bcac633484e5445ed3b1a74d2a95feca1c4767d4cc7c150765558481020301000102820201008777a7f9e0311bd8a049b874396230be6d1fc90ff4985e251641991f019ceb1914c2d911cc1b71f5f302cc3a4d094db7e9c1a544a07643d718c333434b76c0dd90069a90e7f8a6aae688c8d3d909b0c92a025669f07b55c99cd07757b58bce335fc9799f581eae4acf614fb15f07ce51c1b7fbe74e280238ca9a84cbe292534d10fb64421996652f7300c872f00f7ccbade7b6afba2e833be20b55759b112fde52452c481597cdd9681e9fbed850b16fda2cc86bdb0028150e10688cc8383ff58c072e02a86553ba2bfc07092d1d53c7d10100bba00464b776a07367b8a5f2754d3eb5236e811fd8100f6a9e14fc07bb0154de227216f22c434b07c179d69c754a87505ed6cdd1cb043f21629204fe4671248c4e70d28dd7a5e62fe9cfd08b15a0bf5754158c55bf271bec4963923c06964868c00b70f7f87ea54e2b188d3605477ccfa2f658a6298d627f56ae95131fa0e12c536b8afe962f8daf4b9e66bdab867e3809d80c5334421d14305e3fba5710beebd3f21012dfeb946644b1af604aeecb93efe288f047c076acf57981e0b0e873fbfdfb4a49579a7c1a8b2c945341e876027e93c213f37b6c09e1252488d31436dc62a9924c4d92fccb1f51296907e2faba674dd7ab7e3d73761a7c622bdbdabd45f02cdc66f0d6400c6b45875ac720fe045ac86a8e8324770aba7b9d7bbe49b98a819925ab8d200285ef0e927d550282010100fcccd1ad86a93b05a2cba0cb9ce824924f596306841af3405169ef836d6bd96c57dd26ce2d01e46ef190871346e1486cdb3c11dc05b56e85c2a8fc5e1ff15ac223e033ff80aa03a3c0464636796e76865f1f3e4d255d7cf8d2e130da412a6508053a4a4b46bc091084cff4fa5ee007d9e48efcba6c4ddc4525f5f4a93e5771bf1a55699eb3c41eff562e529cd481aca601b7d4b4a7708869b7c3cbf79aeb2499a7845e0805d6f39e594f68fbc69f1e92f7488e57a8075a8f38c64db3fbe642bd8cdc48ba23ce019858adedd8c3fe56cc81e1b233e8f48a02175fa2919d4c16bc9003a3aece7f3b482745b6f767f137acf1bb6c673430440a3d17237768f235830282010100bb8c61e648015d9d08f8786e9236a5cb110048766ee1d43a8599b4457853bd67d168d8d2c076ce441343dfe0af9b219bd22457e0c431304dafeb78e00788992114be182aac566de4a788be21a91c78fc6cb214b6b464960bd4a257ed8873e94d94a81f83acae7f96eaf5e3ea0937569411b1dbb1421859c7933021d54f2b6001af99821a9e5f7bde3d396ed12e652021a0f80a66242ce8bdbd1d558c00475241b754eafd8d2d3217c7179d44071f1fdf3fb198a6addbdf14edfdc7960c0aef6668f6912c52df53f250ce93fe4209db1813e8f07160f5c117ee162110ff21f35227f2cec2c7f586a6e352b58a0900ec91daa3f05ab1ebff2dd00ff945534042ab0282010076bbc85b851ce4e0cfc66e1e53f2e0826b8c632b434ed9234359cb29e271be2bd9d4c00e242b785bf74f5771e15f9c41ac72b93caaddbd2c4bf24c9df4c8ca44d6cecdfd5a340003a022218622609480a61aa98b585a618108a2c5ec2ca139d49b87f62f06e8f824ef0c31568acb1444edc98ec00c70415da4e7b162f029e7fdc6e388f9061bbe275515eaad484e2385d0d6c3ab99dd0be5036f8dd41cca0665b8bd3de0ecc539a50cf3742e94ea5554d79a1768ea3d91f624c756e58b116a15571c7b7819aaff2acbb3dd3b6b4a81000a9cb3b317de0b17d25c93a16accbafd1372f224ff4dd8cd19ccef93a219347a210b536de1a02dc4d54e91d4dad0affb028201004ca5375123f622eacd42b5fd0216013576d235cae8cfb3aae2f488bea74919abb6e1f15257c375d24e493bd21811feef2e371a0eca3f0bed83ca6890ada37e690d900e524a31dc2148f2523971622873887c5288c43a2333dc872805f3f0e2d488bf1879f8752bc1626e70e131390351e9d554e2210fd0890636f26cb93911b83eaa2e887056b749809ddb12f3b1f22aac1d122ae1f7d479ce3291c6704ab56c13df4955ab7f5fec65b9d9d476509af6e291d2bfb3679ac873e675cd754876c3d47b87a2a48f8e40061416591f65e5baf650090b5cc3b250f444e8e8884bb8a3c79dac2fe006102c5dd46c4a68198f949fd4c5a25afa064413b6a37958677797028201007e3bc25b06f642f98a9eee091de958de87ac8252fec117dd7c6e873cfeffbb012320dded22e3640689346997a13b8fb96da25bd890af6e651f4884d9051e24c9ead42f096329b2692acd42374d8225a7b61159310a77dcbdc4ad809143e6d684890965cf485d0e805286408bbdd353790161472c7b0d2c309e897785c26662e27ec620ac7a496424410049c0848a2af34c44a22f986ae8a98891dde90219a4bbb79766be3101ffdde6c36a13dad1355dc41de41bcd282b29a171bac3196df7f18522d7776a947ac21658fcac2d91363ace9681184b2db52841c7b1cb12261997fc198914ed73a726fadf94faaa5b91a8cc1fb30dc0dc023769df5e76eddbbdd6]\n\n# tcId = 65\n# edge case for montgomery reduction with special primes\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nmsg = 229f09dfdf4edef7a8cfa04fbb1437e22b814eea8bb7b7e81094c94ffa8aac13d2a9cd1b51c0dee1bea82d037034bc03105041e86eec10abe3b74313cec27c1e046a5d0bc57bce9a5171bd9bfe3217ca5995eb0",
     "825295da331ebdc096c0b73\nresult = valid\n\n",
 };
-static const size_t kLen157 = 50963;
+static const size_t kLen173 = 50963;
 
-static const char *kData157[] = {
+static const char *kData173[] = {
     "# Imported from Wycheproof's rsa_pss_2048_sha1_mgf1_20_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e50203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e50203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e5]\n[sLen = 20]\n[sha = SHA-1]\n\n# tcId = 1\nmsg = \nresult = acceptable\nsig = 1d5a9bb49cb1f5c2862f36e451dce7fc607f3d302eb9a9fbea5b673a29fa9023308381262c538cb53910b5773a7a44ff465828bdfccf8a7a4ef902e945dd5f6226ffb7d5b05f2335e5762c5aceff71c8408150959c1780cc9c22fccebd3405e81f1bc16d276c07e4a545ddb1aadeb751b571d22f3e4bc4e02020eec5901a1ebc04415e9ddfe967fbe4ec7166923aa095b9fc7a81fc21ba37b5220a973fc5f32fdb8e0841ed321450248402a159d2c08e4a72b780310d420a6e499c2b34b0bd6fe0d1d0e1a7810563324ad8e778720755eb00ac6e28b204ff5fbb01fcfc91e8f1d2f113a5f32843119f5e06beec0fe94e5bfd0ccdd7f322bdab7b05c4f83c0504\nflags = WeakHash\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nsig = 01e9b1d4f36d040a553ee12afb76a36d04c6c5a0f3df84ae22422e8157e57b1c43a7bdaade30ae73073632a4679973ec10bcbb3016f6e20c9cad29a14f96052507819e90cf56ba50c97df5e5001c7f94817ed29f7500f839eb415ef3182aedb2484bace43cd2fcaaa6f5dbc4b6491791592f084b2a14ab303e89deb28a68c72b0b630ae85becb67f2b722f23a0f321f3a7496b251895111640452932579aa53ffb8f8fb4ffd331fa48c6f1e8e152ce7e04cfec941cd96dcf7a885a3022e426d87e8111336f1166878dcf8d190ffb16a574fea9eb6d7e270e025c6d98817e75c968f78c4750be018f74968d7f3e5cb9d6f47d5aafc99c85c83af7175c73091ae8\nflags = WeakHash\n\n# tcId = 3\nmsg = 54657374\nresult = acceptable\nsig = ac3c332b52f06ba2190c6ee312c32321ac377019c35453537a393bcf0c1e6f3697f770ccec092740100a7009cba20f86304108165d5de572df89c42423eabaf910619d555f7b27f7aca31861db0bca8357956466d3792fb6669c77b98bed3c721f71321548f8b4313e535eab5638b9e341f4bac6c9ca02bd07111da4e39f2cb8ed8ea5daced3ada8376ec8db27f6d619ad92e01fb49bb3e53ec3b84ca67b18c268db08ec28752b0c13f269a39fa700dac163b5b9439cd7a9883673335f2b7ecc0728ab38df178ce14479bf6a8aa1e24a433e41f9f217be5c0181245135d1e265e1ca1aa06dd6e853f5d1f144878e2f64461599cf88490285b52a79b744f25ec5\nflags = WeakHash\n\n# tcId = 4\nmsg = 313233343030\nresult = acceptable\nsig = 0bb9473d3a8cc4abd63c6f2ac13e278a9cd1dda844fdbd13e9b77cdd52c1b05ac59126e45d276777e8b1bc423cb261d29675988954c9ddc38bb9a67bec5e03e1e780915333dfe494dd8a4f0bfa0d748805885c389d6f7fb6f786c58d21a468b3589346d70e1153e29dcdb91dec8ac185501efea247bac7c63e3c546ed635e647097bae3b8ccb992701a75d209c439c5dbe8122da616a4e230bce08f541abff854fb93c87fdde0fb457c44b2783568bcbbfbba611d8e984410d360c4ec3732cb69426a94191d5a0cb33149b518ded86864706c723b27228d74836513191cebc790793e5809287b0279e7bc82f266d437d192e98975960d0014dd02e172b7fe251\nflags = WeakHash\n\n# tcId = 5\nmsg = 4d657373616765\nresult = acceptable\nsig = 1b92015bd34fcce819bcf75a6c38a05ae2b425f4b21802306c1af645d1197d2c84b84b24d453eccc44f578465b8100ad9d60ac4912c7aa4d5745a1acead176d8758f6abb532d874ba5407d9e3e399f2cd6166b9d3ad1745cd20ddbb584891879ebe71bfd4275d4c176c9da1e13903e42be68ff2a78d2da9324a8cfc7a8e2fd08307c0ee14288087196c840a0e2b3811d9e9bda6ec24bc86e7ca5e34b57969e3aac31388fd2e696528f7d5136bd44c122156a5147f05bc9b118d3a33ee6d7faecbb048290bb0d4719c25ba71741d7434d66fc4baba9b995dfbc56e3507cfc97aa2d67acfa1083e0ef58e6db6975b3bd6b10ddf1c13087d2bf546a931f0baa0cc6\nflags = WeakHash\n\n# tcId = 6\nmsg = 61\nresult = acceptable\nsig = ab8c1e95acc36ad6218e48f033835d15ec6bc7181552feb6dd6e128546917bac892f5b349a234d051a83ea6469e27189f2995302388337c2ffb3a746db17b157923bcf6e985ebd203a4e9a23697cf2925912ecadc3d3f68252e5e01e112db1829658b16ffe7188228921829ee59d575c6ad8299d76c7f5d6cb204b769854de0204087560465904c73ec3bbc1b47bbc98586f0ba17b99c43234d262b7f1e19fb2cdd20b92c322d6e498835b3ce8480eda172921b5a4707d5ccb662e1ee4b3b4c36b5b485a10aecf1b12449732018e594a734b68c8fad4a730b469d097c89c4121d4f6dce34be78f65591b673b1d0ee170cb3c1852ca22bd53b9b26b2fa19ff275\nflags = WeakHash\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nsig = 264dc979cdb293d180f15ef3183334d4940410c9639712910006c68e3766c3aba1dd95510d71e7d91d93e61128da456cb0d84c44552f33504bd2dae30699d372e394912a66c334e888873a949d58a3b7d7d43e76391ab0cc490e7c3afee6a5f3262b7d298919d64c5e7bb81cd7bf8e612b9f6e266eb28316a7fd01e44b62100f4b462ba5b238115081536ad1f6a068d656d00000431afd1b6a5b57f43f27ca778c08a4f86f62ef84c73aa72b0c361c68345c10599ed731d6423c750462acfb469910a50aa2fcad3ef8c908633bd3fb0b2e7e8988f9be2ebd715333381c6506e0cdaba7691109cceb8ad5364fbc035c309a50912dbb670a8c255c287a9ba992f0\nflags = WeakHash\n\n# tcId = 8\nmsg = 383633323732373830\nresult = acceptable\nsig = 91d5f67dd4f93a6093adb8a7686be7e458f66c23e32464942f46193055c61c29db94eb12f96c918e1cbfcbcd2ed6f4ef6d271cb6def90375b1c07bb2d5e7c1c92425b16b2d8acfb87b8aececb874b7bc2ec9b2865f8882e0807db9ed481ed5fed0f3dca5b643686e70b4940af6d086ed7fb91fc30b322ce9fda13ab70a7206feab152991415d50ae586e8a9229a5d2ebdd1cfe56c131fb832f1dc39bd9fce7b73b190832b4052f5dd34cffcb39f5b0d527db2322d292427bba611ccaf8afd7cef8878337f1a8b2bc0f5ac08497eecc95b23ba171707795fdf5397f94ead6b8569b4871aeef1052fb4e895bad9f17462c1dfd712950631f625503d1336e850e6f\nflags = WeakHash\n\n# tcId = 9\nmsg = 36313639333935313337\nresult = acceptable\nsig = 500ba4952945df532e565c9803ee08eae2b7b69e02199cdc510184fab3f22613f4a005fb425bcff96e25ba4f66a849abbd299f2ea7d530b263bab4899ee3b6121b88b1f2ba0186867fcacf686a71fdba46c2e5379167603bd88a9e1a20f5211420a1737a77c40fce3a7722115682882ba04fb521088750178f3b665921011209f4046b9981b79696cb4193fe56783ea96ffea62fd3f5945e4790ed1a1059b5f81124e52dfdae58e6814a1ea91851c045d71960600a2a94db05f40fdcc61b90e846e563122e6fff4ad1ba74394af7fc13ec46fd7befe8825abb40b365e8ecec7131769ae3871e806eff4f6092802a8edaa8cc47ac8053c8fefca21648abcab60f\nflags = WeakHash\n\n# tcId = 10\nmsg = 333036353331303631\nresult = acceptable\nsig = 3296d2cbabc9257d91b75b51b994dfb8f777fd2630801414c33d405860e3f75b8b08540952e4defba250d3946537774f93a8c88607c8d673a0a1c7161ea14c56b8d3e2d17862e932146f29937b0084295f16bda9f6c555af0e26f7ddd223af6118c795463ac9b5be70bd413bbeda91539f05da157275c24269f039be88b3c3589e4cbc99746f3acf186b79bf27882ef2ef3edc0dc717ed2b94ed55177f99537a3261cf509852115652376261b090ef766cc68a99ec4ec7aa8ec6cab724b4eccae9805f300c48a076f0dd345b6018941bbe4fdbf94e548bdd6bdb6c62a358407ed3c84ff587ebb36ca82818fd82618c94bd355944547b09af94a03e68a3f07f94\nflags = WeakHash\n\n# tcId = 11\nmsg = 38353939363734353639\nresult = acceptable\nsig = 97e5859c080f776faa13039db19d49eaf2a16b048246c939ef875fdb4e28eb2bf4ee3c114b2d99b20753d1082061fc4935429a92aad3d486718657a8ca2141873e69668edd749f99f1cd757dfe7cc2db297cf1bcaa1f82c3cd92482f4dca6ca66b0c28276c32c4c2864c8e87e8c42b4008a",
     "87a4100523130c8e4bb35b7fa7d1af7ea6097da7f7ae8372d5aeda20b4a4ba3a6c93e1b77b17a08328a27d975ccfa6d1b9010b34ccc12ebc0c3d4e6bb14c1b655a15b7f68604068c9c493f561017a1aaec7c84d1a24d9ef97aa683a240abd141a55daa3c210174e731daff63eb39ac3aab1a79b9a0f9178a7c374f0bd0148e4ffd8c9e17f2dc7ef8fb20e3f5f1043\nflags = WeakHash\n\n# tcId = 12\nmsg = 3135393637383036353431\nresult = acceptable\nsig = 8357bf730c668cf632cf2b1b5f9f9f3837061a1de0b86906debecd43077bd132b6c6a078b35b6878a07a8d0a84ceb45c93cf8e56e21e7cfc095107412672b58faeea7cdba71765101890b12a92af31d12f6370529215c299469ebfdcaa2055d2c2261bfce7329977f13fceb51d445b56a57a4e34e7c6abcbd7ecd13af0d92a6300ccaf70e3ae8a827380c58bfe4f381ab085784545d6b23ebf896ea8c453af1b498784025c9e9eb01e10e9d1e22eaf2c77902b64435be4c54b9f3d74b63482e69cf751f522f5a3ff59a35ccec8e612321495a727fdabe0891265cb45a18c99846aec27bcebdd79195f65e05a4d5799a333219589c61e1aaa93547974138746fa\nflags = WeakHash\n\n# tcId = 13\nmsg = 333237303833383939\nresult = acceptable\nsig = 46f2507d0817c14753ed5d4a9fa6c98cbcf7483f237ecf5d26d76e6522e940215841da07f3f20d4af6d8a35e182617150115063c1e1dc897b67ade6b6263700f5420a7f6595ce620f90ce6b8393ff006fe4f0825dee82ddca8457ef74d78e3352f05ecce196a1bf4d45f018317a6a42c59a2f2876f95e405d65c4bc5f0380d0e0956766f89b15850fbf736cb042921e4589721b5ad9abb6213bfecf8eab2ed077c6cf33be26e8b9fc5f95adc045efff8658231e28fd595701531e8bc3c74b42f12271f077e08cf9386d5b611bd88218e42ae757eab5c0c9b974c2bc17da12c8babad3eefda8a16a56ce3431da35460b1ad1df2b2e172cdfc006512e1a4ac866f\nflags = WeakHash\n\n# tcId = 14\nmsg = 34363035383435363034\nresult = acceptable\nsig = 0c3b3f5120fb9c7dc3a715498786aae8e2dfe5d63f54cf805d02bafd36c806c83d0a93af5d1eda293f4ffe6d0ab218648a82ad12dd328a60f6c632dbf9f6e5e504fd08b8b84d8d58000a2d2a9f9a966ee898d9cb75a69c930b260f6dba3a0301ae876e212d4fb971d819c20cb07aaf0fcdbc152765398173dc0d7229ebcd8a9aaddff45d118bf63ab397adb39af91203e8fa5a7d28f2937ff7cf31ae90dd9efc9f2549bf6cbcc3c65aaf78a93c76007bee2720930e2a5331335983943a6d93570b11615165196f9d7ddadf805d443021580514d921f439891446c1fb1dd740794bbd6decb017acc238a81ceab36071be58551557b09643cd2bd7be6e69b77aa8\nflags = WeakHash\n\n# tcId = 15\nmsg = 3131313738363634323032\nresult = acceptable\nsig = 94b777215d1ae19f959d046fc02fde3e113e15bdadb1d792c744f217200e275d3954b798b43e5ee382877420144087be340e11d2879c10af6376437b5a8f62634fa19b9338360a318c95c9421d90f60337634f3a03a2260796d8928e056aa7759cb13f3bbc72954f9c9da7eab1d3564050e4267ced557e3684e5090cef96f585153db8c732b78b4f7df59db219d7aeac42d4f20b1dc9825171bbebc2712e722ed6fed12dfc72dccb1e9a2c6d93e4c86641e1dfe16d6d43629dee7d80eba8e9639ea594ffa206cf3f0e561b2953a290d8cd70bd0ccbef64b32bd66b294f1fb1ec97bad0e096e5e200e5812fe025333cedd7d1ec8c111b28beb4a402f5cabf2f99\nflags = WeakHash\n\n# tcId = 16\nmsg = 383035343535343634\nresult = acceptable\nsig = 819f624b0dfe6822d3923ac1e5c75f79e1da3dfbc13b332874d4052eebb30f9b2a09ecf75f1122990c37367d75e4ec510f4645b9f41fe4f2f9805a981ea81ce932127613126caf8e04b9d194a927b720b24cd9f1721e33d121c59930ec48a5f5574f9aa8c6bafb5c8ccf9dddb2dbb418d9884ecb4a931a9265360dac7475de7e4cc795ce7a586c7d476ba470dda7c03b3f1ab69d9372d7cff3422306edd8fe8f6dd745596f1fcacfb99914470c13e752bfaadce632fe4124d6ccd80eebf87a6982a998aa4a0892c270ae6de0b9bcbfbc9cbd96dff2e2f93f80d9370fa2a015e13d0376b4d9dcbdedea29ba9b616a83261ccf6ec56079ff2ec93d72989cf93454\nflags = WeakHash\n\n# tcId = 17\nmsg = 32373335323330353531\nresult = acceptable\nsig = 118d4dcfebd82ea74b28041bd8bf5f969d04e160e2b8ab2fbbe1c2a1673cdd4fa7d801aa4bc23f9898bc0dcb240e8a3ede076f911ffeb2749c03d21923055f8878aeed88563dbbc45422b658f8647dc868885c92015df4d5925f3e6d75e85754b7f002374d4583ed310bc991cad2812fd29d0906c4dea5c52921fe2184880c5e8ca51b06bc5654edd5e0e72e20922a9c9b2fcd068c700ec82878b6ac04a56becd76fbbe9fd4abfa9348756f983bfa92539424d972d764e7813bbbd34bb369ec147fcb1a94e8602e359f1ef312725f2bb81c04932c1c4ebebfa09e3165d0287a85a22f0898d6385538066246ade07cb51580db1fcca86afad06fe2f9695c2f8fd\nflags = WeakHash\n\n# tcId = 18\nmsg = 31323238343430383037\nresult = acceptable\nsig = 53711344088547e405b1e3f7605e44f9b7b6735d5d3c32ee0e408fe7ec9ccf58998487443f66d4edc0020dba88efdef9ead403a2874b2892054e391f61c1b36e490a8623868ea3e3eeb07eb6a2de96503b93f4fb534225072c6bf90837c029a1f5c2a5d8194df2e203fb0c2aaeea506767952897d900d9fb20c8cf4f7b68a97a5278d7aaa6e383f0cc8d2b53bb748ab6b0dc5fb1ce82b08aa986449b3c3137a5965985d0cd62b7a1a11b31a498669a0b3072692eed9a1393e42d7e61b90226acc62b284ec550c0813c4afa25a1b6fc103cb80cf429944b557e1334e81c1173df4a86ab107cd8ec6c75392cc7cb11c9212f15ee7e18aa0d27006af5c5ede7b0e6\nflags = WeakHash\n\n# tcId = 19\nmsg = 353131363538393837\nresult = acceptable\nsig = 972ab5dfd3aa92ef9ff40026764716784c87154f12967ed3f02adee5f73fe9a0594b22599e829bcdaeb00217a12218dadf06c9940aaf9c02c75cb149a89e258a548894bf4762100ba17bc8bc60a7a0d05307b7133678dba4babf660d12418659cea25c9f982bdb9b1d2300fdd9d144a25d4f150e54ca7ca344dde9e9e1ba5783c2cb606bbc86341ab9344a0840dc515dd1d589bede2e3f483b20180f08695cca0e9e1cefc68b6bfc3527e48ff0260a3f696c0680364bd4b6830d675ec4986638e976b83cb1f56ad5fe705d5dee0c0c5eb29bd15a24f265965000ebcee5a8551ad8ef74b40592477255169bda56dc8f35fafaf796fbfa44d366033e15acfe048b\nflags = WeakHash\n\n# tcId = 20\nmsg = 36383435383536373234\nresult = acceptable\nsig = 7a7cdead06ba212e8dd6b446f911cf37b40c5ac7f9c817125c0d5ee3cde49ef336b87eb94f7d8a93e1d9fd0efeb77e724769b27d6f63ba91f7219f23e085a3433e4d69ca8f8e420534f554c69a7221d70e57f8a8246b24b5986716c50da4942a1720e51b3ab87efdad42e02cac254be2673d5bfa4669e764defb401121a25055993dc5ebba22176834b4a2f9a8a3a34d35ae2c344e9a84675d94ef8f56b16d848d15851c058ae64df8a404eee09b63bb64fe017c206a94dbd7b274440f04fe07d22d079c2d2a8686f247eb983a0ee625b2d4b9fdd4d9ade53712f0d13cf1ff1aac03d09f80335bf9364327a89171a8a51f4219f86646be96f0d96c6cb27f43d3\nflags = WeakHash\n\n# tcId = 21\nmsg = 32373736323939313435\nresult = acceptable\nsig = bb15915502ad77b3a080eed70b444b753496450a4114d435d2aee9fbf1b345074fe85c23ad4ef52603b3a8a077d5024e3d56dd620169b6dc0ff7437fe1a520c293d78faa77258e8c8632100e0644f469f0a3250a53483e9a2f8dab0bdaead5df41dd1bba91dd01d79eda1df838dd4567d04526b0e1fcb5d07cc628f4ff62fecb65d2386af638ba6d0e594518699c5685033635af6cb302d07bf39a1dc5b50ede06baacafad9a2ee9ac48bf88c11329d2be62d565b0312813fc81c9e3cd243aacaa6c11dccbb6941e2aba6f93524b0140f30987168036b13810c10f65f0acc443f7df7009c238a8d5bfab00116f1adcb4cbf55c484239689404788bd29eb787f8\nflags = WeakHash\n\n# tcId = 22\nmsg = 32383739323832383334\nresult = acceptable\nsig = 4fe965e8b685d1eff38f26261f5c168b77560de5f2d7243a33c3c1c7f267d7b60e9a61444b6cf0a71caa18ca81f38960f45ef29586910c240c93820551f3da5e15180684807faa5d9fd361325b9d39c7b8e805abd75b69af4d020345bcda266a15540b32ccd28e57f7063edc228fbc815f1ab965fa542ed679c43f7b4949f7448e6882bc36a8f10412dc0e828b33ad4e09a5c72d3730143520e4eb625356615bf49e51ccebe904af7c6397785de0f20371689f2975666524103bdbb4bf27f1e202018aca8003de615f073773cca7e647e71ee51d97cc30356a17b50aa3c47a74e133aabba4ae41750786a9b1e584e319836c3c7e7c8c2eb2ce6604323856b399\nflags = WeakHash\n\n# tcId = 23\nmsg = 363635373637393733\nresult = acceptable\nsig = 9e12dc1ec88182f9462a795d710dd07447e79a4e035b97c16e351c4b5d4e98459b8e5a52e2f51dcc1edc4c8943863fa9abc8fbd75ee2f47691a58428034021c6d3323191a5a5fdb2da2ac1b2a149b8d1025576309e21410c9400cbd3b67d2ac4d4af6f57c6380fda2817c263984795934b48844f5ea4761402354112a2a8e2c06dccea0e535a06b6b1274a42f218b1d442c2c8347e7fd168100ef658c63c790e6bdfad3f4e57a536e2ce181a976dee1d605cee947bf5b228f7c540c2c9c9f2caa0461bf737e32f5454f52cf5300b23e8a9921d5e4a380eb836b645515c0c71ea803b730d0667dba49be3825c7a5f49afb7e989c85246ceec236c3a0eb43ed8be\nflags = WeakHash\n\n# tcId = 24\nmsg = 373436353535373037\nresult = acceptable\nsig = 3f55470e612c832eea00cd738b6152bd03d88c3abda95ccc2ed6eb6aa5c0e4d858982a548d25914eac7649c53d2169da5ad4f09bb64d6290c913d346424d189bc2414ed50dd2bdcfe3e9e80a992c6611ec86b537a8b5cd92985cb6226a0367c2ff20d2859c21882fafb2b9c47f48fd19cfa14f793e0fff45d06a2e886253a209ed95030da05a1c6ea35d2993c600491b493ded76e952acb0442c52760fbb1f735957a1ab30fefea6e7b596a7aa4ea479ba6a6aeb866ce6caf38cb7c6338b2993213c39c98b0cdd6e46c9702069b85a8c7e050c1079b11fd209fde0cc58d37beec46db4c8c95b402c45b2f5b7906f1ef19f2a84dbb8e54bd5d5dd39a532ed6e37\nflags = WeakHash\n\n# tcId = 25\nmsg = 39383734313231353838\nresult = acceptable\nsig = 08823a3eefc4d13f801419b374a5d8cd51f9281e124deb0415250e9e353e3a2f974a83347ca09d3b5",
     "ec24ec94048b096a4b11dfac52f2480b522f70eb4eeeed6f84941bc37d1dd1d82d7b9883beef1a6cdcdc5b3f6024d9299b10d7697c0325e2c75764f225cdf5fed483ac300a489b69536acc9fc90d581dfa10d67056b3ef9b05e09aa8dfd3d688ec4d63f483c301a44934bba1841860948c130d6353e7d74c9ca9e764c44e3b6fb1665afd38b6a7df8892d90a0d5483dfaec6270084ad76aa50f38e34389f891fa6455ed9f3cbacc422266f6ca2b10aea5c3caf83035c06833cd7bbbba83dadfb28807f7b3d7f4ac6e9025a47217c3dd1dfe9426aae6175f\nflags = WeakHash\n\n# tcId = 26\nmsg = 32363032333032333730\nresult = acceptable\nsig = bb6c055b3f55671f0ce85c5641b970b5ca0dd1f1b8978b915c8e36390700f6bfc765dc6b1694625672f70c0bdc97517d81cca9190ac4bc9eb5105df3457f48144ab9dcc049ae54f28123af0204176685ef6c2d71b0e618389400e18e90fd1dfe65cde88b628fdc410631ecae8d64b86da329228ce4c99fcf572e77e3ea366ce6d33d1401e250c75a329c71c7f5363a95cfde27bc8cf010bef57aacbd44c60a4d5b7aea41df9b9d59efa0cb6cd343b3c95c7acbd84d77873a5775c8757c585d665cfae9bf10095fe4f979b5866b6fb393b09890e118a35ae8a17f7eb8f60dd6e4954010ba903e69f4cdc63880bb24c3019acc596e6028b5f1aa86cc16d6f9720b\nflags = WeakHash\n\n# tcId = 27\nmsg = 33373236363131363038\nresult = acceptable\nsig = 80ac097d00555c8f6ac34f3ea96570432283b373bfbfc327e5e1f88b9b25d8dccd61d1064a944a10418ffb863ca2eee28182d046ea819b776e00a6fd62836aa3f334aaf7d14897971782a8e557c53314a3da16f3bf09959c139abf42c95a943e8f736fe6ac47aac2c4453d2a7091214e9d6c81098f39907d001b4cdaef6a66b426b571105a94331349d0c4d456263e090c0ed01ad2195ca0e7affd36d0f559cdf12c8c8128c7cf1a8aebaef6154b4bf8e3bd8db789eab080b14b45b10527e800452fbe2f20345cb41afae4f35530936c1b99137a3370f4f1c9eccfa81bfa3749fec4b1b0672b50e970c621ba0a66d1e775bb4df0674f587c938a29176c603318\nflags = WeakHash\n\n# tcId = 28\nmsg = 37333434363334343235\nresult = acceptable\nsig = 669f3256203b4ffe73ec01c2d7d120ab9c02bab82ac75495dcfa24db2f8e79970673d4790da772f4b16b14f81047086034b3ad927196a48390774aefe0d277ff466798d3497c0e108d51476945e4c324d32145af5d8cafe88bfd6a4b52c8e033ab4b95bc5b5c3451808f019b39285efd4feb6c21708b00aa5bc781afa87fd7475cad673833617159e75051646064d81ed42044791c27e37eec421893fd371d7cd96b462c158560545df3f5862fe97958c9974c9332b46d894486e97c84528a1f55a3d9add429cd7c1a05fb582affc12fa3aeee980a93b8168f284d7f95faa2ddf137e445d2c5658b89a2a230a9a640bbee40665c2bede3f16b986c72ad15b4f2\nflags = WeakHash\n\n# tcId = 29\nmsg = 39313032343039313337\nresult = acceptable\nsig = 50191cd6481555054231eb25b7d44f374052a228036f1e796c2d923c9df9bfd2f881620870ee4d7dffa4637e570d6055345c87b61a2c8f4f3b536d89cb0379883c99fa246e3ae9c6a157770767bb018d702382840e5125ea59bb6367f98c070327d30bc4e17c40b465fb5314e59692527d792c9155f5f1c2d9f4061a3b784741788d92d761e1a3c553320b4165c864e874f24664de3dc6b572dbbd4fdc495431de288389c2690bcf56482632ee34b638aa902f5ea808933aeace4eefbd2b6ef54b47cf2afe586c20bf015e782d5ab952bf7696268467a6beb2f2506cbcbec919674fc785474ee0608c43980f64987ec0b75e8041871ed9a2f99bf4623504a9d5\nflags = WeakHash\n\n# tcId = 30\nmsg = 33383239383138363835\nresult = acceptable\nsig = 55a3be3e5c6c1bb472feb54e2154aef10c8880195183860a3c19dc2f0d9f2e7473b90bb2a9ecdb1a8b144ee27c60ed7ea25838bf6ecd60c2c5dae9213439a9ee8a7a49e970eef3cdbd86f0b259d7ad598230f43e2a5ac0a0f68f947cbded0d20e7a768fca530f3dac41515ec9ca79167de3d800c8bf547163b035a0f3f45c371d53969ebb6d14e5850bab303dbfcf86092b47d41582ede460bf9920c8eee792187d1da134945046d28af67c433fb802f09a6bfa946a8aadba2ae9f89afb530540cbd22960126e6e858be58e6372903698c644253cb5ff72c493b35caa4407d381f96b304b0993ce08b7b0c692c0bb7936f743666db5aebe2afc2c67e3b256fec\nflags = WeakHash\n\n# tcId = 31\nmsg = 31333332313433383039\nresult = acceptable\nsig = b6fd6d2d4ebe5860470aec5e25bbbb02d67d46d960008311d1dbfff3b85048cef40642362104e8e544b914b9974eb53ff1cc12cb8b0fd5b8a924e96ad982ccafc1a80092586adbd2905250452e38b342f7921cfc82623ed499742b2fb0b90d1b5285bad2fa03ab82468488356605b5b7693335e8dcf983f639d82c3168020e27a7e0d06b2af184eb96618ce942c99b49bfcc27a4b6b47c5c07865c5b2eafe30c6bba2d9a97818aa0eb5d2288018103668f892e8bf5ef1837521cd2bd41b5b8f6a954f5c4a50de874b8e00784a5546cc9b7ce8de2ff776749b0027b37158cd5b11b440a52a1820b7950fa685bb43505e1d35312a6fdcbecdbe947672dc2be74a1\nflags = WeakHash\n\n# tcId = 32\nmsg = 34343435383035313539\nresult = acceptable\nsig = 7fc54d8108368eef19f5877275d07e871a3251cca71c63cafb46808748cce240b8eb95a1f218b77954edd2ab8768e3fcaa8c8d3e9b7d678c0d44f9731d5a58f6ac5f3643187bf88ba6023301200936d9414517f1b13ac2afc01d8cb8e011631109f2e8eb66b61b7110c273e26c2066e9384732b5d978c0b2d6a9f0227533e092373fe9d8c2dc33f8253c13aa5730b3f792dd66c6b6b2be2dc5723a470d8da15c79286d1842c5cea67eaa47b906c4f034d1587610d9fa02cb7241364f8862458feb6d8fff98255b4c81b69c248d5f5dd721ee477b1f7341c73808b880a88f8425dff9c27c2bd0140a61b8c64d8dae15c4359a918de42c8a778b8b8e352b624291\nflags = WeakHash\n\n# tcId = 33\nmsg = 39373637303232323239\nresult = acceptable\nsig = 039ca79f8bcf17374bde9dca5b7615b809ac8d49241a48b118c18cbdd4e3fc43c2e3792b73d403062ce800f26955125b7b15beb60a6447710082c6c6bf80d24dbb417a58ab934160b18883ba64f29b461f6f76f833ebd16c38f7664976aaec1521ab6a567b34283a98b8556b4fd346b050ed4b1756c1228f891172a634444779e26798476d481e416e1180aa1709f885fe5c6f091466aba6287f727f26d086618ebbcc2c020a001ad8b24d2ad0dac784456e162d06030567187c25f2e2a023e30decc076eaca92d2c82042dd077abfb788fa03a0daab9714db415822501d99f89600f8d677faa726aa43d2314645b2320588b4cad7208b2fd12d7f99fc37d809\nflags = WeakHash\n\n# tcId = 34\nmsg = 3130373838393031373235\nresult = acceptable\nsig = 907f826f39412c22974469bbb28f049d8404b9397bbb86322c742872d8dc008bd199ec7e891c1a799da60ef20c9dd7573ba969761f5d812f72e889af855b833b5aa1cac338cf2a42d4e0a9d14cbc6fb004866aba01341e9dee8e2896df163996d78c4d30d8c68770e7c72eaf689cc49713c3eb479be8452c935aa44c48aecbb0d3f0646614d36750ef126036828be76be580879961932a74f34bac9983fba0b970ac740f584152c5cbb4d6e3815e87701ada8d30a501abdb62ab173aa1a7a3199ca27cfb179895132089c038e40a273be45b471a1a1f70e7d176b7424e852b3f8c608193a7126588c5065cfc5a7117beb72f73ea8a836c8a15f12eca67f84051\nflags = WeakHash\n\n# tcId = 35\nmsg = 38323137333338363331\nresult = acceptable\nsig = 7b786c0a1baaf52fb84459e92afaf038bfe997c9a4d910303633fe2750b97448a15bb057b505683bc53ca4b18fff1dd90d1416bb8c0fb2c29550d7dda9c9a7f087386776fe65b1288c1f5508ba9468ed9328c9d6620e6882fc818c4ebe832df36dcb5d92837a711ea6f0d20b784235933d0c571e2d6061445ef5d1bc22d43378d2593b2a762114f687bcf59cadb4ecabf258d3e14a4bdea0b215828b2e7462439fcd4cb99518bb5d5dd9266d6dcd459bf36cf32cb8683067918a225c1685db5e52f9a5305cbe60a38df2babe901367eca57f9cfeee2955549ad9b99318b015ae19402a4dad7752e15b94b25b3414cc9be0c13421f31a41d0b1a3e43ce2c1d309\nflags = WeakHash\n\n# tcId = 36\nmsg = 31313438363037323135\nresult = acceptable\nsig = 642e3b94f8c5a0897b5787805c99b04af6c7a2ef47eae10ddcbf58e0f9411373920d1e4d769619f97182db36a9c38b6cd695a1d96daaa9c9288ddd4774f9e085dcb4829f1cd852239016dd23ceb1a493a1294e3d35104f48384acebfa0cbecdc114f445c63d8a1524e608d3f75172782b1c3169d5317902a6796688dd6b0112d0822a5c65a9ab31be84c939cecc4190dfc766cfd29b965ca02baccf2e3a68f13fa304b469c60d7eb49049d78dc1e0ed94daa273dfbde714024e62ba97cfc7b3d32fff034986518e0486124a6d6d33f40474182b2c235306c7d0d5088e7e733b0a895745a4bf4c187d2cdc9d6a8df7153b41f16305a15da7807c6bc69c313b4ca\nflags = WeakHash\n\n# tcId = 37\nmsg = 38303433333530303635\nresult = acceptable\nsig = 5ace1b9ce1f57901e8b8a90f033750f807e52361779bfd97c60f029cff8a70774c06781a2ec5d16116e0ea5170b99d0486eefafcff11f2780d7d04139e28e408a358b48ad55c0d62a357323d3ec759205df77c73f89e991f849114d8bfcfe4b6a4eafd86a9cf43500775b1cf4b4980c4f6eee17aef782eb7f94144ab1e7a0ab9c83ef2860c1429d4ac9174295f5aeeb6a3d5fd430807b9c2ec20e0e2cd1242e496e5470b733db52c857be5a65c604779d9e1bfa5a7bacbf2979f1e533278076f102b14efc321e905ae5285e50e3c9998036718b34cff35ea0c082735ea576acc2f18065c7e05df03d3fee209f1a8df7da5a07af3a4ab86e54edf85fe61343fef\nflags = WeakHash\n\n# tcId = 38\nmsg = 36363939343437303335\nresult = acceptable\nsig = 30a1a557fc9651e08c004b23a5fc256b13f9f9221082f867643dd707fd5513de72b52d13bd1b1b6fd090fd816beb486813419bd9f426f9d4e8ec7e5c86d4228e3bfb899287b2354d5b720db60b68982e76ba2b14ed22b8bf849244c9ae6b55071bcefd4f7063d15ba43e0a5f747bef7373cb2dcbff6d511b030d3e13f628896406955a77573570305073d92c5cfb2a9c4d92f867c1801e63c8addba43ce3d7faf91af464f941faa48f28f549d897f93c074394137203a19176cbdb41bcff260b7b0053508956970e31f65807b40c3b7905da151b5520931ec5c470f020acb306fc6e969a89966fef4ab1c2a17fd5a112e0a841b853dd1449be32a3b52d2f6e89\nflags = We",
@@ -3937,9 +4036,9 @@
     "e93c01a0f4605c7256de93ce1e1cc8f5175838999c734809bdaf8b95edfac0d5f98c3de33ad6399e8207a8015373e1f5ed76e304b5e2ac260bbed23c662c38b6f29dcb01faa4894\nflags = WeakHash\n\n# tcId = 66\n# ps followed by 0xff\nmsg = 313233343030\nresult = invalid\nsig = 5a7e549f99c138d3fa7ede3ad655473f78c3a8de650bf8db6a5116f0807e5df84445ed72ea6a82a8150db352b85210e120818da13d9800d15823f5780b6051e51bf4488654e6a93c95d19b45378744483b43b37200d933775d2f84a7719cdff6dae2e15716c86a9c5a0042a5268cdc7b5e1860c150d85253573787b2839fedf64df3d54c977f63e7bfaf3168f0153e2ef019244e5cdd9be69b421607fef727bd5442ada4bab802ac9fc0c0044eb5b435a9caf217732b6740571bf9f7b1b3fd83da8d4c806a7e2241e37cd0d06abae28ac5a83ae3b2f81f3374dbea97e46c66e821226fc7cf0b0af2dcbdb7c5cff641775c81fea4c8cb9309e989bca04a4a5d3d\nflags = WeakHash\n\n# tcId = 67\n# shifted salt\nmsg = 313233343030\nresult = invalid\nsig = 4975c3fd6358989938633d07cf7bf0121c8a8c987fde1cac405924ab88c5a3175d27207ebbfe42b24404227e388b11d92bbbacbbcf152d3fac0166acb868f908515903e37da98e96aea367c179530a43f78d877cf0838333fcea303cf6710f046513f01d586bc54b42bfcf5dd47b1a01ea8b95aafb4b9406888b3266445f749b1c56459ce4e10a57edc59f610b8b74edf9987c9888460108a11525d0e7228ba5eb9472a0fada1d056c8b0d08efee2761107595c6b221716b6782c27bd7755f1a23aef6cb966a31471921594a1de17ebc7e5b52b933ae52a0794bf4bcd1a792e78a47f019698a37d0d389ca2040c0d3758eedf0fa810041574b32938d290cfb45\nflags = WeakHash\n\n# tcId = 68\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 881dc4bf8b2c6c17e10bef3dab327b4cbb76413a7e5afbd24f198fa461bce9392d31f0a11d69bd67b75fa30ff2100dcd52b8e0c24c91b0196d172ae3fc1d40fb167b2abdce4b83fed365b9d5946a333d0f669d99edf7b8a3a1c8ddf2397cb77bcb62aecf818807d696af4f186bf2e0628ddb1b9d45dcd6eb965dd1b5eb2bade60fbf5b2ae816f45f9e0ad024039bf64c081e37630d6db51a368e92256268178aebd32963a07693f828d01eebaad0fa04e0ff29d8c7ae681be4ec16d2a6bafc1573e38f58c6c2c36a5d5a2ae7718adb1390770d9a3882f895b3f0fee16a2bdc743b0906567b6938d73a666cc33d85142359d40eabbc1da65ae616c7818f86fe1a\nflags = WeakHash\n\n# tcId = 69\n# bit 7 of masked_db not cleared\nmsg = 313233343030\nresult = invalid\nsig = 15872263f8270e7ae9d3127a9b677828cae2077e534ea349070289394d13599392b5f803f8dbfe40a5487223dda2a3c6f30ddc92c4e6d9d22e7d0d2b60197e032f188da35457273ce5518b426196c952d0219ff6190fce905d856d491b00999821ce8d1ea4b18f3423ebad242bc846e0af408f21cddbf44e9e5f5d300d71a3b104eaa2230ee633d2ea44016af735cd5ed9c7b421f322781547bcbb0cd95e4780412f734bf681bb47abd46b158d251ec92056553ac06a59c4ba7fd20bfe50cc58386832b52e548df345b086b5757c4c9f2e133131becc90a72ec6c313e7664dbc922c87a90364bfc746a425df77c9b97dc2afecb2cc36fec415a4e1c6a957b4b3\nflags = WeakHash\n\n# tcId = 70\n# first byte of masked_db changed to 0\nmsg = 313233343030\nresult = invalid\nsig = 6de50a9911893547ab56065d2953038768cd0689a63b0703c0dc99e7cda412ff49eca503671f068635f69b38c0627427f02785b3870c6791add37d436a81538e6fe3dd0eafdb50a18d2f2d97e3cba062fc8343a6dfd448c11997d1c5bf6e1895e09ab435ebb16052c20347f4d077c6c7779297a29e76e49cdf0d10713fce20ab51d273febaffd0679a1ed56da5c0430a90a5fca1ec2010293b2eb8fe34a732ef4679318fc5682cd8796d57be09904043961d5171fa3230674501544e3d5482f510afeb0ee4ba9fd1cfe5ba5527c9c32ff09df579884d4a5b0351cefa07baf40961412348b6846fce5bd6d65a5438821218d677e774828108ad805f574ce7b597\nflags = WeakHash\n\n# tcId = 71\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 1f47ac7fd4585ea42ab08e1002f547dc78dbacda00eb2b3e74d0e46d45ffa8fa7b35d7afdf605b2da772bf54843f15297bcc6f52eeecaefe1c26108c35f9059c8223767c19597f4470de5028b6c522aefc5b61d545ebd6d3312cc092d1fc2a70c524fe0256029d3d357975215b2bb62336c4f4923eaa0cc422a3a088b86f4e0d81b6b4e04c21808a19ac229f2657edd42a6c41e883e69a916717b59fc6980d79884eae5ea918022da28ce2f8e52a2e5dd50d2d2969748c2d97525e672c12113f605b8c4bfcbfdca05bd85285d8fe6d22b73d3b04fafd453cfa7267cefdb5281900389ff53bb4dc3bf0dc366d86912d822410e8f77f33392c0c27fed3659da463\nflags = WeakHash\n\n# tcId = 72\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 7922bfdd4da222918c573184b1d81a14fe87eca0a30c55f9167ad8144ea06a9d22b108a41437b42aa08afac44e7661f7b4c6293897426cb2e960aff163613349b3581cbd3a884ff9898c45c5c213d996cdc1cc119dbcd7e0e99ed08f99f8b69f8aa079cc6d15006697d4a7fc5bcfd349fcf26f43b6f5074db8e448bc92ab8442b27e82643a11842a0dc70b822cf7ae26e90791f67d25a321aec24ccd7553e631bce74888c43d9ecd18e77fc24615ec445b7d7ee83aaf63c0733da25ecd512f7dc7eec6e3fb499d7eee6165c78a4275a9e6fdcb1b962f38c8139da5089565b39c6d73739f84c70ed60e2c83bb4f351d4c87cba2cf6c68b9879e283b9c5e3de1c8\nflags = WeakHash\n\n# tcId = 73\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 8a7e600a6675a06e677ff1344fd53a8dd2b99fcca40c2ab799636663594ac3fe2a510bf1e3ec4ca9dd28cced48b4e8457ed74f4ec2adf31b77ff1bfabd0f80c9ab4688f15630406d8ca31edaa3a3cc7980ba1b760cfbd3ff9016e1f3fa0c34cb59378b0f3745b451fd3e053c8711ecc41feaaf350980532a7db67afc35f00da1f191ff4f66b8e7e27368bc26160f540af784e8ecb38e2dadf4be82e4b761626c5c06efe0dada642eb26f12d1ee96684a5ef8e5feeeb0da9ef432647336e4ec715cfa260a8727aec4a080738086ad26b51355b8bfaf1b135e97d108b36c73b436cc5cb59593a7ce0f0e7483152319fceb37479451eeea098a8eeb0dee19756e03\nflags = WeakHash\n\n# tcId = 74\n# signature is 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nflags = WeakHash\n\n# tcId = 75\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\nflags = WeakHash\n\n# tcId = 76\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e4\nflags = WeakHash\n\n# tcId = 77\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = bd31c7a02691d2d9587ef6a946ff788544ccadd4b2988ad62086792a6bf96c8616b4ad13317d2270b901d0fcd1d880cb8f52fb87304a5258c11b38dfeae8df670aeee7ea1d0d9df8e00e80847e41e5989ed402d44e78b30fef17b5671d3adbf8685e4dc204499ecd1863e1d5aff28a7cf66eadf31fec9236c120add13451522c647c9832a672cd64d328c1c322183f4661d09bda60b8dd5f0328da5420821424afdabb1a80c5d12763a1b0238cd89d0742bfc50b6a2fcb701d824218f9826f4f78a23a2b5aa42ace7f175376fb6cbdb2bad293ba583d4d31c6b8f9029e46b13689249855f505756e00e225a6a45a18769bd8d2b3a4acb9f1c23d3e51882561e5\nflags = WeakHash\n\n# tcId = 78\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 00000bb9473d3a8cc4abd63c6f2ac13e278a9cd1dda844fdbd13e9b77cdd52c1b05ac59126e45d276777e8b1bc423cb261d29675988954c9ddc38bb9a67bec5e03e1e780915333dfe494dd8a4f0bfa0d748805885c389d6f7fb6f786c58d21a468b3589346d70e1153e29dcdb91dec8ac185501efea247bac7c63e3c546ed635e647097bae3b8ccb992701a75d209c439c5dbe8122da616a4e230bce08f541abff854fb93c87fdde0fb457c44b2783568bcbbfbba611d8e984410d360c4ec3732cb69426a94191d5a0cb33149b518ded86864706c723b27228d74836513191cebc790793e5809287b0279e7bc82f266d437d192e98975960d0014dd02e172b7fe251\nflags = WeakHash\n\n# tcId = 79\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 0bb9473d3a8cc4abd63c6f2ac13e",
     "278a9cd1dda844fdbd13e9b77cdd52c1b05ac59126e45d276777e8b1bc423cb261d29675988954c9ddc38bb9a67bec5e03e1e780915333dfe494dd8a4f0bfa0d748805885c389d6f7fb6f786c58d21a468b3589346d70e1153e29dcdb91dec8ac185501efea247bac7c63e3c546ed635e647097bae3b8ccb992701a75d209c439c5dbe8122da616a4e230bce08f541abff854fb93c87fdde0fb457c44b2783568bcbbfbba611d8e984410d360c4ec3732cb69426a94191d5a0cb33149b518ded86864706c723b27228d74836513191cebc790793e5809287b0279e7bc82f266d437d192e98975960d0014dd02e172b7fe2510000\nflags = WeakHash\n\n# tcId = 80\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 0bb9473d3a8cc4abd63c6f2ac13e278a9cd1dda844fdbd13e9b77cdd52c1b05ac59126e45d276777e8b1bc423cb261d29675988954c9ddc38bb9a67bec5e03e1e780915333dfe494dd8a4f0bfa0d748805885c389d6f7fb6f786c58d21a468b3589346d70e1153e29dcdb91dec8ac185501efea247bac7c63e3c546ed635e647097bae3b8ccb992701a75d209c439c5dbe8122da616a4e230bce08f541abff854fb93c87fdde0fb457c44b2783568bcbbfbba611d8e984410d360c4ec3732cb69426a94191d5a0cb33149b518ded86864706c723b27228d74836513191cebc790793e5809287b0279e7bc82f266d437d192e98975960d0014dd02e172b7f\nflags = WeakHash\n\n# tcId = 81\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \nflags = WeakHash\n\n# tcId = 82\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 3598f87916b45e657df63a839c7e544953c0039477b396a276d8df752b0a98192a10fdf431033353f8565c6de1b268f4ccb44c00ce760c67e97409271c55055b3ea885d742def2c6cd32f5fed077193d12bd48d78130353ad4aca34d9148bfe80d8ea455c3ce4b24f70131908e1947feae311e29e0ae9d1074ba73124568468e34c8b073283d16359c530ea613adb4de2ba94ebc470a57055571ef9f575c068e00de09b6d1af2051b93079ddc683090d4427847b4b9ed63a34a01d9aeeef00524278ff54b7d2955ccae5ca1001ee7588f5a21166dde7b2941a6136b38d374aac73752bcfd3e700066b2972c66cef76a48d81811e26fc7646974a149708ae2d21\nflags = WeakHash\n\n",
 };
-static const size_t kLen158 = 59654;
+static const size_t kLen174 = 59654;
 
-static const char *kData158[] = {
+static const char *kData174[] = {
     "# Imported from Wycheproof's rsa_pss_2048_sha256_mgf1_0_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5]\n[sLen = 0]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 20081f8894a1330c4d503f642880e3c30e398fc6235c24f1be752e2d49cd9493ac0cf999e275c4f89ff08f0d9ba4e264a332525a616d336bd9e822f41ab3f4fae2f48ec66c2e52642ed93b7cb944396fbaa727cbfdfc1f20aace99a6f2a74475c338f8d9f22a38cb5bc51752076503b3aef1e65e5a8f8583d9ae7378ded038cf516898ad06beb90a42b85764526fcea44f74258fa4efb1da253d337f65619181ceb832dfe285ce78ae6b15f204e23bab274e87445d9f5df97f41dc8e3a97736b62591d075744b2552f90bcf1b1393e1e7627ef1f985f2bbabd52e43a35d0ddf4c67126e391f922ef7b1bb1911cd6e1b303cb2910dd70672bbfb62ea4eaad725c\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 4bf16f098701d340c438368e658ed8904d3a21f7714c02440d7476ead132766b3d578b325ae752f906873af1b795585a2a0d0e6788fe903321b2080bd0dfb9de42c3be41aeff37e32defdc0a75f12adb5b9de4d067a920a720cb16cfaf56d7c09d8ef384a8aa106545229b540c52b49ecc9d6d14ea70480642b9cd0330efc005502e4c38b96a36456447ce2133df78854307010ec221305dc90570252321e06c1bb01d75100e85e68326fe92488c0c5e58524b10f8ec7458d887cec254d39b0bef921ba31fd5a117977f1945fc04837727456949ffdc9886f21071186bf32dfbd9c3cd6a2a00a1cdd5fc3c22f4bbaab92aa85116711f1c53754bdd2bc384f2a8\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 2b3155b14971f79c9e3294723c7e41ded41af709f6edb2c19f3526584aaa1ef2de2e7a8dcaf5d7c3239f604c421656dc58e8b0852f7a65cd557724a9b2a17cac38d8020e939bfefec5dce0d8993e75615b974944e4c4a811e40db63f13d2b626bf26257a706a7bedc863d0100b676ab70d4a4f6eaf4692e0b69ee4426cfe7cfc3e92d93bb804569883cf31fb282efa5a81ce9f6d9f0ed79251ef2a0b596f80e0eb96ede67e30457a07655d777928b898ed1679046673e489d9c6305dee05abfdeba7357099f9cffd00735165ddc39aa7355b10a8b8612dfa2f836fb9f5f89f1407365d6b39a39e89c6647ff9da5fc6f960306686a8ed8e2ce12cc7fd9870d576\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 501c8119a0f8aa2139ef5e05adc65384fa389b9023532171d514651ff48677aad546326a2e3c02b39ed84e5b7e4630604f2979c1fd7bf37da8e0cedcaecfbea6f9c715141a1d052529d0d0fcd71eb70867e2704377801a0ec721fc59fca9d8b1b08cd9ae3ab094f5bbe2faaf3171dcf1712c534bbc7ea802a2a72d8cebefeeff1530e4081b85a42ae38f630f38c1121199f2156e267ce2467f9b4853dbd29dd999aebfc402f2a0c33b8c1b8022941e754b7a187df4c59633dc6e76cb3200e34acfde53a386647833dc2accf244726fdbf440cd32503188a291e5b0678aa729b539c1f5f97e7b788c0c20b88d90c90a3bf33300d181b9ae797cbc76049b43be3d\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = a17d67937354c7fcba18dd5383edbf2f0868ccbe0a316876fb1c4fb14e7f4c048ef5ded5d01d02556cff0c8bf081bd09c46ce4da156e9810df195c5b65ddbc3025b84f91047049f205341ca8dc55e440bf8d9a3e98c231bb74e71be019cdf451e962d8b7e8e6d766d3be430c7596ffcafbb785e5fe8987ce721ae228832c8b4fe0b0071b0e5c652856f785695f70cbb3c62394a8291ba5f587d4fd7bb448649a72261447aae6a2b750824d400ca402543c8bdbbb8e7c3b44cb7085a83392346abe999ea2a5ea15e9eef6bf08a88096ee4e532369f0059285298b387a428e5e34ed7296e0b53d34c5e23f0d3c12e8a2d3132672a655c7048bdc0c69b36cae602f\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 64c26d43b028f284e9667d5951e70c75e611ae2ab876f66ccfaf09bd54a26dd17983d993bd4f5270537f4c4b2e48695eda28c8c365486b5fc3bde4049dcf6fd722e634fdf5571d29b1e156a48b0c706d96155d86c20dbbb1a47c7e54efa15b25d76f502b3069e2514f89d9bdfda9bcda02301c58e2173cf4f3dd49d8415802c11aed78f031e8e2e50197443e5fe9ab55afd8deeb7b5db8ba7a7b9fce6b7d9eeab9ef25035742d076935c059d076b4714127d408c9428a90cb9891a151eee8de7d0cea32b0ad2d8ca4abeb0521b296b5ac08f7c53d5c85e47ed828e0c11468d6cb50bea89e4b455936376bde9f22eb98b3e2395eedd05d1def38fd5e082ade3b0\n\n# tcId = 8\nmsg = 343236343739373234\nresult = valid\nsig = 08a900c5c0cf38963b8d47682cc7dae9d3f0a78e571ee5bce658154248b0084ab96a7ab0ca8c6ad8d6fc105040c9de8f8df61c1b6be59a5b899df586026e4b3ac1531ab09b5fb5026cbd252c6a548fae9ee881fa382d98499fb88c2b061f560e1daf98145705054fd0ce66d8fb2f64ab160f4bf1ed1a54cf69382afb75c71cf4c38bfc1603653af35a7ab1ab7268cfbed88bd4e779a8811acc947a21b059ea43c19786f370076360f4620a486d6e0572e5c6c796604736acc5b41c6da7ab2a40630bb8bf572ae96c9bf293580021d5a0b42a196c74b80b55225839756380305203b2bfd7525618b402d5288da288bb3d78deaeb26fdd432b2aac746c4fea8b0f\n\n# tcId = 9\nmsg = 37313338363834383931\nresult = valid\nsig = 29b1c67e4be642cd69e7f38115db51d963a54260a877781ddeba5fa6ff2fc0da182f8923bb9257e92989438392f047943f5769ee057c7162c71cf2c0147ead670ab9ae2c1fdab604601a2dba88483b2d3b1dd530aaa17f7a056f1dee49e0b967984506bd39f2df29a06d58f159465973a0fcf1eb5890464863aee92a4f3938742c876164ef95cf34753e9926ef87004d207b9e496922bd00dfbaffd9ddfa216a4b7bffad0d9608e0a2e8d22e41a514494683831e25c24f032d1bfac19d193c4b343815747a254f026313a6b554085921c6a8d0b362a7e75f6419215a5b9d4b7b872cd952f830426462a547a475ed3696bb977223c1fb5aefccaceef99689788f\n\n# tcId = 10\nmsg = 3130333539333331363638\nresult = valid\nsig = 12a1cb80d9ca2b229f85c7aa1705abaa6152b3fe1c6ddeadde2de56f49cb5d5176c91bf9a12a12372753d0b657fced52a8c6ae88cf6e84a358b996fd06ed0846dd685b800232177f17d72da5e817caba8ec9a1f08ec7e015aa2821a1f9777ba6a7d0950449254e5bc5a0bc63f7a6c797fa5b2d30e81704735f8dbbe1a6c7c8db18c142b0861f8525b66e4c55090377b08350001b18cd27f6e1be8d43b936883f7e057016b78f6f810cfbc19d394909040844c9cdc9ff5c8b37327feced820f3dabbc1f597b2ed353e7bbd3d315e9e02124f98b014be827c635e13f284c1dd5f5457129d2ef249ad12659cfca95646314abbbe090e12ff4480a50e393a47a19be\n\n# tcId = 11\nmsg = 33393439343031323135\nresult = valid\nsig = 7bed5bb43826841053d23cb2f574c687be827e9968b37af248db451efcb818d0bb8975ddf7407496603281c5719aab83afb418f496d8cf26e91c56974e65b382f96a206995dff1b57839f7208e338e86358cccaa30cff9677ac0a7afa48e8ae3e3942e36fa3fdfb47db4295027e0cc4e2b98ef1db49519b316ff4bfaac246391691c7705acb89923d39981388286c5969bc42851788872659019a3bb05a72fe815ee17dd0bace92a934683e019049669ef285625b0bdf9935befca3a0bf6b4154d65b62a83597abfdb0ec335c2cebfa627918ee28d64ef0debeab27e9efe",
     "dfcc557789f44d1e57127b066a221e11f4c0b146293d78d72a5f899f954b5dd37c1e\n\n# tcId = 12\nmsg = 31333434323933303739\nresult = valid\nsig = 38b09eb6acd2d2f0e083f0bf84523a475fb5519ebcb8a5fc2007cec2ca6f01b14e4332acd935b070140cb241b4255fa097db2781b572866b55aab5684d73181b4c911ec6e72b3c267c09469737ea36eb2aeba743c29fc4ff0c82b3002ed8daeac313d2ec4f7d9e707ec334f0228852eae8d58c27e1fdd1dbf8d15b8a7b0f824eb4f2c0191924749e2af4adc0a0ed41978bbf390e31860068aa8db5d5c7c7e86b0cbc9239fea65bf0d9b0a4d7a7058ce6e423858d3a0956c3ac3af7f408c7926ebf86d47cd49de364f90671afb52bd7d17aad00833ec79e43401ea2437d0ef7a89ad35dcf884121bf91ac17df17163ae19f084398ca3abee47db7c111c81bdad9\n\n# tcId = 13\nmsg = 33373036323131373132\nresult = valid\nsig = 495254a0e2eb9ca9f0fa281cc7ee5031ccadd0ff52a1c77dc7fd027f54319258dc0a4e4bf98d13711a4d9ab0c1ac8d67f98c04747ae6b9ef95e67c8671d7d9a2a2bc5e58b1b863525bc10c6fe65388590b96f246c58d118f03bc673b87715db69385907b5ed7ad576b452361ac8164f9eadd250eb445d697ce7c0bb4360c65868a8fe06101b56f4f7cf82a9bc78254eff974366f2ca2f7a17096b05b9bae47ee572eb60cceeaf1e7b484e90b5b0a8ee6f1517d1e694d23a2f9d33ff47a3acb7c9e93a6fb9ed2e994773caf5a8ed3453554807124fc4a4a19fad88c70d5d5d90969e19acd4c1f10b87629dcf5de6a7441f47ea4cc4b84ca6ff43e0905a73083fa\n\n# tcId = 14\nmsg = 333433363838373132\nresult = valid\nsig = 7d0aee24ec62cd2c6238e49dd589ddcc804b5122f57ca8c2d3f7ddcdf1503c3eae8ae192a0057fca6ebfb3231cb9aaa380bf4509df5c83204cc61b4870e4233616ee7097507222c22010c3f34b6c75e4a341920dce40e4cfb72206f00dad39cd0786427575cab19832b64ce9dd45bf8c0023b5b007544c4048eb06b0a73e1583db64b9ae70ca88a7a169953cb207acca099876841c6f0ae9a4cecdee900d2ef1e5559f8b496467733e44bdc6ce8f222fce5e99ae3bf2ee9f6821dee0f1a1fdb072e92404e325e06f813d70df6525e76f0ea5934e53ca6aa12160f6a92dd9d1f5a4a61e47f3f01f297f0470c343df4167588b81c5223908b68c4e2380d95fadb6\n\n# tcId = 15\nmsg = 31333531353330333730\nresult = valid\nsig = 5d822177791faa3beb1493af760b50f62e78f14b3eb278679d59dbb8ff0eca8b4f4f90124b830c8d635e90b86de97d92212b1e42aae57cead0650e7e9204d3d204b43d2e6376092d2b280acd18398295650dc94f74b7fa7198c0868890078422e2ce12d375986ef387a82b188a231784c86e85ab0c630f7876c652e4f4ba9a4d4dc3ca70316bbae3399f82c3e4e24983143baaf4e176c7c0ec1cf908eff9c15b3468fc7a44f6bc077cc3467e4ec3a50ba51858ac9cf3cff0c99ce5c963ebe5341752db2cb6ed5980544056d308c7c74fd14985a414ee61669bf4abf48767071cfd0c1a1df84b8dd4dfca74b342ec820aeb73a5eba0df78b85a568dc36ceea5b8\n\n# tcId = 16\nmsg = 36353533323033313236\nresult = valid\nsig = 978c8852ab3a09c6e28f627cd917927353874cb7b2d6647f3f5889ff81b048f4a4c6073ae6d99bc7354d9e45c805febe5be5dd3f95ad14513119169a6ac7a6a5b88ead2171d999f199b324251566066f8d9a3bb51a5b59c799858d459136341ab774480f059fee153bc03e37cf676b1db4abb2f7979554fb635200ce1c53448e5dc397be13c4d8f8bc2cf2117a0c4ddcb08926fd5a1addd193d0c1f2167731c73affba2c7437443d8bce828540a3d42f03b590dded0958aa4fe48d66d3dedb0697f366b3c7ef9bea8c2b5670a31c41df21828a3a481d9e42c93ef0b5cf43330e6356021893078179fd857a14c437d8b8c66d4e4efce1369f6945c6bf878508a0\n\n# tcId = 17\nmsg = 31353634333436363033\nresult = valid\nsig = 132228bc781249b547b2543f004b5807c05f6530eb685a0a3c6b7ebe5c38ef39eddedc5cf3f98f452ffb202e30dccb8f14c252e673473ec7bfeb0d9cb16c2d88ea166fbb69eca16f7e0305e054f158ed24c74d02328730488179254ebd63972f2a51c45f274939d89bcbad5df3d3961115392aa483beba4f00e55531550f6e167da38519273b3d16555dbc286979b40cee6e5e5559cdfbe6bc208b53e6337400821c43646f940fe624466834b335b3bad27b8f298dfb4a1d3e6308a5fea77fd5347abbd2ee8e708ca2f8719cee6ffe9aa91443fc8ea50417d5f546c223fd07a587ac547a2e4b3f686b7034c06453db15fde31bd1b1c76448a3bab5d14c7ff94d\n\n# tcId = 18\nmsg = 34343239353339313137\nresult = valid\nsig = a04a78f92d6693c9470e7e88690e40a4ae8aefd0af1845450690337321ce5b5e125f981b768e9e0a8a4a37e687a038da1d2c21462b962b3cbbdeb170227fd92f8e22e99e6a183ac68c0c42708e369559cfe7a1bc5fd64ac71e8ed34ce70e86336503028e6174b3ff2b9076f4b6b84f050fe36ac45a0f1de677b78f42908de140d1f2a6ec887a4fbc795f761f2f9b71d45de9e6ce7820bd6fd1a53f0c1516e3df5b31486518b767ab554814ede6270b417d53480d82c415d86d40355b405341034da2949cdd7598195975236e264b098822aa8844488f16fcbce076baff03a9aef6a2aba155ca14fa30e0efff4c968eac265760dfff2056f6b1079dc29316b629\n\n# tcId = 19\nmsg = 3130393533323631333531\nresult = valid\nsig = 221efc61ab6dd3044cf77780d379c01af65312951e5ea5bd5ecfafa5ef55c5a54e8bcdba38a7b12753bf049e5aef8f2b71796429ca9350ce820a10c7042dea4beef196ed5ec3a34cfa534e711ae8009631a6a3c6d87b25af090cabb2c80e14321763fe1545bfca78267415fc89878e968283b216af23a9a5e675028e62e1e2df117737c773d832c705d3ed36e680f1e3b2ecf06aeff69e0072f951a34449b4134e9e139ffddce8c38b2ff0d20a314b45a9345e3ae6e312a94673605e5ed8693002d60629c60fa54469148d5c50d80ed8a1a0d22e4672f9f3a2eb85d298928e4fc333fd1e0ad5909e65b8fb82917415473f28a17a618c07903e8acbf8015e1c81\n\n# tcId = 20\nmsg = 35393837333530303431\nresult = valid\nsig = 55b67374c9ef2ae609f70bd1c805f5c092278e8a2e45f049b949bd57d4bed44dd9880cd59896de266e3a5294f29023a7fe376bfdc35bb92d542f28f7efaa37d4f32c297cef38c723b27cd1fc0e45f6babb61a27547b37a186866a9c725a0d4253e35befebf4f47aef7cb1c4b35419b6e024e0151d47c0c49fc3bbeabeb75f2dd596fef0f8c9c275f6058b9130c58e0266ef12e0233c6d16f78ec5ccc1e8c7e03e3bcf12be33317dfb660cf6d3851bb2aeff5693fe1a6e4b644e0fc860a3d6c2100009f29c632fd9a579a6bece04ed27baad3c5d62b12ba30372e5d7bed23702c146f4a644a6ca1bc9b23f29cfec3b47f7c92e9fef471b9e2555700ac3c2960b1\n\n# tcId = 21\nmsg = 33343633303036383738\nresult = valid\nsig = 74af7b301b5b480ab70b7af2decd155d7c6a280ca77663c276cdbb702f7843fc3b0e3d54669fa9b99093f323533f3ee584483c83fd2f20d2d291ab8482435fb53dfa19a898fce36f470951b4808ee4cdeed273546db4e6db79cb2a429c04c6e0e7661f6ee84eea57981797a298ee37ad2661b002345afc0fe97c6b2b955efe1d753f3e26533b43c0ee4881e6e7bb36bd56f061bce340a9af0a679bb29f10c3c140ab6a5d3fee7f5ee90201d335a09cd99d71c3fc4a890723f1992f18ea3fe672ab6556140fe4ca5b16b168736d58ca8b0e2be364931a1c2d63ebad5fa3a075a889ee1c56d5c128b151ba55a0db4139973143182b6521962ec36a81975b0e4a7b\n\n# tcId = 22\nmsg = 39383137333230323837\nresult = valid\nsig = 3ed6a556e0d26350f61ecc896550888481a0e4fddc0a8db85ce3547bef67d5a4dc8ec653123b8fef836e6d16187c746042d8eb68310545578e7aa69d676e2fecbec00567e67d9f90bad6ffad56f2ceb90d06cacf8e7360439542a6773e0b25b15f385f356f6303348177e662b6ed30854dfd40b649e98eb9289e964e15bdfad7a5596435a2c2e5f849431cf14d2b3549691e642d5dbadb128f663fb06f84ae233d8bd81fc7571970de9c5a14854ec03b3b424aa5091c0da9a25020d83ee439e84898411e977db53a9bcae55985c218c1b3d08a964593774f9120aea723683f8ebc9f095598a1312259bf1e20ab6a79928fb22858572bb11a77354383713232db\n\n# tcId = 23\nmsg = 33323232303431303436\nresult = valid\nsig = 05d975ccb92859e4322c7712119877401618268ba486a05a525ce5fa879c5b8cb2e38171f1b8c5badfd2d32b276767389b011148e994c400b8dcd2e44919b20fdac75ea3c5bd2e1b488d285e974569932c418741da41ab229dd65ca09cf281f42e231c8657623dbaaf7b5d875aeb7dd4aea1fd15fe6a0b7effff66e9bf979e70b0ec28dab260ec68d679b13e76dc1f0a82a0c598b3412cf6a2f306e8e5107698d3c54a7ede188ff396ecf7e153cbbe322e48de7fb4c8eee3cde0cd35615779ce24f85f550a35d3d31a6ada6175dce6346f2b4c7ab0d60d4a95500bc54eb5a1da6028192d5a5372f48dbf704784db5616fc1e690f7ab3be167b5328d487893c3a\n\n# tcId = 24\nmsg = 36363636333037313034\nresult = valid\nsig = 40f9b74051d6a95fdaa25b05598b422eef97852dda217d51b591a36937af45ddf5e06f3eabfaf17610e55490ed3e00d11c8561f7cffa25600fb9ef7a5114399415a933eb6811ae2142351cc0621a5d39ff452875b1a669c666c606e4b817975b966635811694c8a920a5cbe8300df00c0ae0faa1a7812912daa081c7204af6eb7f7152ec82b45b504dc3214eb9ec5b322c58771410dad121f5cd887bff9976c38c3cc9b1a44d3683e95c76e6a83af6c650cf6091b68e6ea2e6f28b11e0c664ad132ff098d0cee65c8f0b436328332ca0bd1048af8de618fdb494148af8d2d98ef4819fede564476a52fa2b7d176e57f0fd9e499a215de6b7737278d7e6d95a2b\n\n# tcId = 25\nmsg = 31303335393531383938\nresult = valid\nsig = 94cd1d5b54a88649f920e1decf750e04c8630e32d71810016b98818bfd0d978bab2725466c1a826bdf4ef42b115b904e328ff1c012c704865640af61aff3f7bb6a3fd667ed2c91ebb93a0232655360807002c2f05fb64c90f842b7bec11dd1960bf85f2167b397e0852b790c7f193d6e7f264b2a5024807dd5d76d9487ab0e422c9216c693aa1709e56b3b61719c9d6b35f510a721d9471f83ca1a6e46f7c14ad0e4ab4f2513a389e70977b3d7d9917a13c25c1a439a75185e9aab64ee7576db623e514283b2d94e105f8c39acdfd853817275e90541c67812e40a79fcda5a2d32d2c400d1193f1b756c98e8d3212575dece26c44792fe3fbce5dc56d0248c5e\n\n# tcId = 26\nmsg = 31383436353937313935\nresult = valid\nsig = 17da6446874a87e7a7ae4fb637",
     "c191db1d13c20befdc726c8af26a63b78bf0c998b82c25a125674a50717a849ddf004ba0f1400921c08a37a0c56a728322a2069dca4121c0c47c437e7a16cc3592ad5441a157028d8cb6cf7ce5b8582fd525a1c5face82204e01fabca60243022ea4d58126fa33170a6053ce2fd53b46b165d105151d5a3ea7b0f2f019784ae87fed529d771ba5a6a6ab60934a8aef5d4a4f25e5ac91b64e47aee095352ac6a9f68f5eead836730c08a35395e0a2cc1aab29b7e1d5ef238e939e9847b90d7228b1239749e79c07394acf13aa32e349c23731838b241c20f7ebfa627f96dcdf395b4f773c74347ccb966ff8a3122f6d6f1192eb\n\n# tcId = 27\nmsg = 33313336303436313839\nresult = valid\nsig = 0169a22f82d7c1fc21caf6131d6a4002578212f3beeb185a832408833bbc246f05222959e90849bd41207d6d74a48e084b6eaafaec78c9c0aad7a9b24624e8c4c66bec56fc86d2ec31762a7498dd48207a16b315c68aac94662013940307e6f6dc1d2d512885198f288adbd73b3109300b1f03e137b904f743ccc7b90db246c7ee7b18c1b6b2ad5f061496f8cac534b58f161e2778e8f73db6f455aad62f599cffc8ef16a462bf380e0d09ad8295e7e9a7bafa1b7fd84166dad936373b323b525a111d3b34e5f918358cec48144a99f2c614ffb23f9a3c8f9a491f8a7fb0825dcde62b40b9b56fbc816e21425fa4b0621d215fa019d293107a547d55a1f552b9\n\n# tcId = 28\nmsg = 32363633373834323534\nresult = valid\nsig = 78b2098126eb13ca306f31cb64ba1afc17e053580b68184a029d5ad47ec8029474a64dccea67ef1d01b4f95f1c2b416d312437139ed1977ec80a9339bf925cd2f2c157dd3accb47d1b85eaa43a7f2f6083e85084b05d80336b2d0435315d0124ed155be0100a98f75b9d7596f3799cfb3a1b7e2a8ac3c805da8da5844a27b04486f80f1ddfd463ba9d01a850096a600346772d8bbfc73c9932522687b296ddcf2892f37b2a9b90be7dcd9081df2a48014f5bdd08c114989a4920ead57563c4615874f3b7707607d6257614847bd99429642a58a305383c835a1bbc2ea8b443a2aaefa5c8cde459904016ddf381c591dc238e10a8249c7e1caad96b42ea415f7d\n\n# tcId = 29\nmsg = 31363532313030353234\nresult = valid\nsig = 37ac7d0088f21118f5f9f834063d56966456a9ba840089a1b1805fcfc808ff22cc9d7b3b3a361cbf1c2f96c62f694b47a6e9a19f2adace721200a52110f34b9c95f45fb4af9c250d0472018069d493847fafd468e8f50b4d2f1ad97e10015862ec02822b1e17dce3da1715f6f09fb89b4f7d0c35b8509445f770ea6ec325e933c651dd4d75f5702080ec3b03c48b380b1f202112eac8686d3e6e37f2685a6be8b078584533ae66855cfd6f6b758e4487bab19a65a12245a6f177fbfd861c94c5d30b6fbf750d66b682f98e34facf4aadd67b4db4463cb08328d8d59357895da55f1736c91c62b2634a66ace8b2ea44a86e5dbc09aad6998524077a68b9c1f33c\n\n# tcId = 30\nmsg = 35373438303831363936\nresult = valid\nsig = 6d250a920de5965ec36ab916ad585ef21252355f0629b084a119f7e9b73d3de14256f612fa92e3d658efb3e53343c0edb8b7e55a704dce2af2f7d861a404d1554fe19aa9a6b9aa8a13897247a37a2d973cee58c3608c94789fb8ac1ce05d6f0c2c1c7b8baa7baa1cc8d77d4b7e911db371038117af95b1e240ab317031bba83686b8ab99d75baabed4873fc72884794b3a3da905da016ac292622b8f73e446f46a992cad8d2b9c9b4d50381f58de58da58a25ae341b11d302e11db18d2bafe673dea1093d67f7d1e4919abbd43c0c0008b8eab089ec6bbcf126fb9998fa8697ab48cfa5d90ae76eafdecf18037fc3c8c5fba02e37ae79b29665c051e271f269a\n\n# tcId = 31\nmsg = 36333433393133343638\nresult = valid\nsig = 97a3e342aa73973a4b993873d1741dc9ad916f5de63d78f8c6a7f7b2247e2ed62a76510d0e25e6a27ea0e2ea8a5d8e38381528f913458bf6caeccb73fe2e2ae3830d0c3f463859bfd55fc26e5bb16f95a1517f445979265fd09b17033297aa6d5336206182d5030396176ed04b0f6b86a9ad9d180c17f7afc6aacba9416f0a67d5f7b8d93c994b719fac075389f83eefd9c9f3ade146632917c26f622a1313ef470f257f67f9fbfe67245ec253959751a84ae84c7a0c06129337645dfa36c65ceee8fd1ccbd021a51781f4ab8398af3344b0a3b9036ed4b9d17f7c572903391a64a8c45c1fe5ef9da607a0a7ced1f97a8651b44ba4f037484626bf770d1765e1\n\n# tcId = 32\nmsg = 31353431313033353938\nresult = valid\nsig = 6fe1f5e3f11dbac400043505b0b331c32c28c37b4d3cfd9bbf959b301b3bbc752248e052b5fc3fd6c80b2a8175440105bf84904d2fa9ea763a31ba532f7c528e15967f4858c0a67fb9b91b0ed43926f3bbb90d970e8d81a3d2380556e63efe0b49ff702db5c1835adbad43830a983fa891529732104e60941c03fc8e267c0a889ca7d29d615811d05e964faa99f81c2bac929b26b0825c35abd7d3a36c09568141a53853760d632446d4088d032b348ef0942b91ebf1c68bafc91bc54863452245af96c00250302a05b24723f7327ef420fcb4427f40d5e33ef4c4820e0a7df57c24814b6ed8bd61de28c65976356a3279d52134753e008f02cd9d27bcb6330f\n\n# tcId = 33\nmsg = 3130343738353830313238\nresult = valid\nsig = 9ae78de184d5b7207e99087c84dacd1d5d510119a25b43155050154c1539a7b44146de65c835426365c6d8778c29e6e7639765da4184dbe09e8f5946eb2d632caba6e31eb2edfc30016ffc4e3b7eed4d2d95cc563c2794d70f8ef60ff3f77f876d82cd075bb2fb6ab0d027ce9dc5f3b26a3e93c8a2c2e8bceb14f9eb45ba4e1095a19f441fee145c60df21adf2068fe566dd7926dade24b31b71f5db3d4ddaf6c4e44bee59e0d3302dca6d75fcc87952cb58555c7dfbec53975c7e1cda803c2007ec1e53fffa363e69613d17f870c2674442840d1005039ecd2106921ab6ebd9d96e21307a80e994ff85eae5349f4b426d458aeb22cae533e46724cfa5f2b442\n\n# tcId = 34\nmsg = 3130353336323835353638\nresult = valid\nsig = a288dab1bdd7f4676d1bcc84291a7784be62f001c5c1a83ad575b15cf56a868600badc95f22954f9f474340d874d3d56fd23a8a85ee3f052c7be5ca653cc2fd2c1ea62f02c0c5b653fc201272d432671059ee279398e5ad0c45e735eb5c03a2ff9c82ab53d1ac9225589ecee80fde90a036e079e45b33b0b4f0e6afc317ad3744dd65d22607cf31dbabeb38b0eb935ede4420a1d8246b80da217dbed5d1cf6a4cf88ac03a3eca307bc7af4cdea63894f676ef253f7c8e1e7ac1f67fb45abd2aeac3ac8899a73867af86688b67b3ecdf9e6380a84b99b98d2dc4e65682558d28711dbb1288a0351cef187f1edda14ab57a8fbc71fb60375e682a53566eba5ff0b\n\n# tcId = 35\nmsg = 393533393034313035\nresult = valid\nsig = 0a5339301400f505424bbd72a88355759ce2b8e43c97c7dc6fc90dc4bd339dd397bcdcd706ae49df8d5f535f37c4275e894419345bc01a15a11251ac2b01bea9edcf093239b6bd15196974ed38ebddaedd60e6ba3ee67ae005c73850ca8a13a1ec693433bba8eb40dcb23f33a1a6fac64d634c9363f276c119d8e7e7649e15fee7c0a039dd41ffd5871592b7bcd7c3052b3daff5c998442f788f4af43ad032f257dd4fa0c7c67f078d6b0608df1a1d3b4948327eded47f9f4ed16601a6e7fe86ecaf9721a4391b01051c00576627d44f66ca5657236e1f5260a31f017c6dae68d17e984997e1892626dd97f41429a914a7669e650182845b2614c77f39267187\n\n# tcId = 36\nmsg = 393738383438303339\nresult = valid\nsig = 8383a989de89656ec90337181cc615385f691622af128860328520625bfaa1ffd2792fcd8395cb8f4ab3986c00e9d43a0db678cf1cd3f130e95669ee3160da36b99eae9388a24079326e0c3e87eeb7fed2ad444e1b66d3072f057167ee967e9dd08dec183c4bd55b07280f74be43445a19aa0659f78fabcf56e4bbcf3927e308ef773ea6324e5b23fdb46b08057a1a63272b9c29a0d0ed59d4778ad7cf2ba576ec19d3d81c869cf762d04260ef805a35055d9013b327013da7a898b6684275dbe5057b833d738cda3f018c100d63848959e15492fade26378f4b39bed4bd56259ea8df023f2c63014fad634806f6a650b5e68fb35f6caf198ed09dedcfba9da4\n\n# tcId = 37\nmsg = 33363130363732343432\nresult = valid\nsig = 23b5e6dc26e10e99bf0405b84347e1cbbb6af4a8d0025d0313561c726de0268ffe4ff7b2e20a96e4bd699583281aaeb10b592e207e1cc5d8fb7d5c2c1d8f034467ca090ec4885e0a1b09dea61a129c967450cdb5984ac5dbc852893afdf333b5227df2f023f37f310f13dd73ecb9c864ccba1c93f6b7c4934fd817e26fc2cd607dfcc6618b41cc571603aa26dd4fc180d5b3ae915418d35d6476dd34d4612f50cca249ff661fc5a2bcd09a806da0ff0463489fc0fac10cdd41d4243766584ae38e99c68e9abffe362894cf5ab10100dd3171c6cf63d93da5f8f6f7d3877cebe64f3afa8bfe78f4436b83f8b845ffd94f9980d58a743856b6efddbbebabd31d9e\n\n# tcId = 38\nmsg = 31303534323430373035\nresult = valid\nsig = 9f8a9abd119e44261097a7fb120fa7edfb77418aa3a5498abeaf17e2453e8be26a814e7cc1a276a351ae002ac8746f630f7da9459d3fa4178f8ec9756fa6debdf4d55814bce8f84eab38dfa0c98f81448800755d08c3b9691e837a2aa052b5ca412e2bb8156e4a3aca3d35c9bd447d6b5b532905c60e70dd65f6c79a28f236e3a0cbe4f734b2a3b22fb733e45038820e087bdd429b5b54b84a6d1210788bb558f0325ecf8ab7f4641bff09564f06af6d792df988699550d35f2197b4bd7cb7eaea64341ce82391ab8798c1ef6be8a7ed8f2e1dcaa331da2844c06e3e056ad0ba22c4724ea7929f57274fe5a2c462780b190d5404c68c823ba233ae35026a6e72\n\n# tcId = 39\nmsg = 35313734343438313937\nresult = valid\nsig = 227fb42cb5c3d88b8b71d1a6522bc5f824b2507d2998a94b9b972cabe4ab46eb47cd106f79c17d4a0c59c7b74b5b3d03180ce155a8bb0920e987fd2bbdd64d91ff3f57b5dfbe57f3989ce4aa9d9e3efafc501c4437a0b14e2983262a61b15a1000888ee1482bee4a1e6afc92bed17f35a32df67fad28979775cf0c1edde006919566cfdc3657c9ad2a82d2e68a11e23f01f4d8faff873f5bd1609e3b901ae13f8a599d42d2fb5ac9f9707d730921c5981cafaaed86d370bdc7585bae3ea4002c50c96b195283592c5d577c53627d946afa48d10e8c89432f50210f8e0c99a23eb089559390dfeb472db740e27ca255f0764c7a575d3909c24308f187bde90fea\n\n# tcId = 40\nmsg = 31393637353631323531\nresult = valid\nsig = 49b8d35ac6093bd9d53d5acf6af1a2f294c13b0072564931b8e69e11d7fbcc7ccea44f5e52f28b63b09dedddd5766515eed3ed3d595424e70846ba96b9bd12781715ac7c405acf97a8a735c8a9d274b66a54f2a24138fd9006b2b5",
@@ -3949,9 +4048,9 @@
     "8f5f616b3fd413b310fe8f50ef4f721fc026a6222f0d9113624cf7d481e79e788587ee659e81296eaa438ff13454e36ea50e9f038ed2a7548a8d169635c3e15bc20cd83c8279d16e6b0edcac2e9c72b9048dd7fd1d298e414c3832236d612af3841e426c74f20484ef408b19f22449e701460633fbc5155851e812e886cbfd6218bb27388e20547fb4a48d2e0f9a284f9bc1e9391b28ab7f3f45ff5aeb6af12faae437361877d04e2df1a1057ac3a680e5123ef\n\n# tcId = 83\n# all bytes of ps changed to 0x80\nmsg = 313233343030\nresult = invalid\nsig = 4bb8fd79da58fd3217661938c90772eebde7bfe5d49fa597cf448019a56d710ea126e8b94aacb45bed81df07ed4c89a9889bac0ad2abd506374d5ebed14777673fb1c51a3f844e9619bf707c9866b21721a75458c100d57b9ebf6ca58aaff1d47cb2d0f26074dc15d0900a11d681bcd76b111140500a51cf8c1b5ff4771176f1dc0884d42b36a15690b991c77f9605ee9c4329fead40364f2b6372812319c0ed4a6a15c0716da9426ddbbee79938bbf8dc3b459bad11ce79c0bae6080a06b6c8c1c051fc37e0bf0546c7b55b2cb6d90bbf4961ccd1adc623c9b9b51912d6b78843932ce04323f8a9159d10ac94c2d980e9b48fc143299d4c830050ace61f7238\n\n# tcId = 84\n# ps followed by 0\nmsg = 313233343030\nresult = invalid\nsig = 9aca5b5fe1369dc46eff908e690ba88744db0c86f7da7e644eac314493ba6a7d003dc5400e1c521c373ede410afcaae8a4ea8e14d1e6c2ac3f39c0bf8bfeb688962260f91058ef9c1a0ba39689736d039ff86524a97d8eaaf248601793023ce6569c3cf15dff30f41e384690ab40812cb1e4414a0370fc39f526abab87bb9a405fd44869069f343f28bab50a1e582d4bced25d41f9fdd2e958177a3625bb59c4677f7f749321023fc9b9b724e8172a4a512743a1c78c3c8b1f0556fede02e9f6f2f851fd31e21f0886a35d12a0e04f041251524bd7838d91657026540e133a2ac1ade52f03efb509c30578bfde272f0d9fc2e515e541259dfc249bf1762b17b5\n\n# tcId = 85\n# ps followed by 0xff\nmsg = 313233343030\nresult = invalid\nsig = 9211ea6374362d77f491d9dca7e8e8d2b672bd565dda1566814670d22e3f211b38246529a5f01333ced70323e6cc4de58e9dee11a90f345fc53c1cb0f0c2287230d1cfc83d33c6158a8730853b5163c825ec05084cf0816325e21ba87f1685197c9891ca3b89d8d8bbad395f7f71b91ef937a1d81bf7497356928b77b10fe270500a731d498beb85490c1d3c4145336d2a8ce8430354b3afcbf0c923b0b0e824adb36d7be69a8e951f64a5b1d648dfd9fea49b59c99efcf015c6b3937d8986100f48022346136eb56f9538b115284ead85196385d91dd414ee22a3c7f40f632cbe565c8d0a325404d0d4905282cf7acc6210a6eaa26f3c3961660a944771b342\n\n# tcId = 86\n# shifted salt\nmsg = 313233343030\nresult = invalid\nsig = 39112e1c8251d5ffe1373e70fac946358b00bae6a461a1af561a82d81ec4acdc63eecb3b98f5f070929dec66a758d4a12cec2600208d7597320ba5db412006ebe76ed593d8b1090e93be21b1c00700e393ddb4b7d7a8bbdaab603087abd2b90a0408a775a4469d4f2f6b34d228da55bb4872ef6dde5282f5bbcdd6a8cefc71c4caf00453e6d6c59321b738d3b21a3d8f0da4afde30c16bc5722ac30ad6bb1f9fe0451ad150fb3d67a805993e506a80b2dea3801bbedb8ff7b676f50ca3fa5b9bd744c00822c975e2ab8cc6a917436279a9e85aea62477ef84270f6efe495ed503623108ca39d5c47bafa3505f04995ec9c2a0e411fed9179c9a9e94fcecda5ad\n\n# tcId = 87\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 1baab34d753d4c169107ff7dba46ec1a4203cb1654489d6fc20d206bb21fab483872c44ae8017b7c07aadb8e8489a2b41b89f9331fef63317408105eae19900377ce150ec89a37b26bfb169a89aa1c71a83cba6858d5b47353e82017f19a6688927768bfd0e75bfcd71a5e1948543907d65bc8fc813436a15949fbaf0a7f95ddf010f298df9314203838a60b39c5bcbc7a438500649950bf28e78f94155cc664ad5ff996e51789fb13038e1757dc19b6572f028fdd8be318ab933adced2e87b569544503916030b4060e231b0265372805cb53214c6f21e13c632ce08031ee368bcdf3eacb3b87269e8a8684703a348524020e820de93f1f334b59cddff51a12\n\n# tcId = 88\n# first byte of masked_db changed to 0\nmsg = 313233343030\nresult = invalid\nsig = 7f04560acea95c8b3df67a74fb2b32d904e5c59b43b10b11519e796efa77c0c9b14beaf1ba1308a65fee50e7862289d46a3cfe79f423e7d9201dfc7428bec7f304228508b7e8e5af4dbabbb3958d1f48dae4016cf699421b7a9a0b1dc1c806a7b19cf65fb7d4465a031bd8c24071b397dc1f6987cddc8b69f5f3dde25fa36c2ad6e030c64413bf3eb39176bc003c909e37d28d5a040c15bb4a73c74c39c4d132d09fd565abd7b63d81115ecc8a151786f6ea50882e50db362cced39702ae1ecc176cece9509ff071b87f142547ca3aab04bec1a7d0c6ff35060420b99e285515eec016ec419caf75cf11af56a395187fe6575786998b6b4348561a0dd68878cf\n\n# tcId = 89\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 1c029185061385643943dca8adefc5666ca039765d29f8baa20dc3cc43981ebe1e6d1f09a617559955437323e50f6464a69950baf23c7463b1b1c6761b50bba89c81299d4543f76e3e4ca4e30ce710a20707b18dee5d2ac9e0d9330148526f193439cb33238ef9d82424fc1287097e7626bae0130b735a22cb6ef08ba4d840b370c9e8658f83267e52b8d56ae0ada9dc5114920f97884d6bf529bbd7c81b2f9a700e4df4c71a8ce3141f9f4be31c9d639619b20f725f55475b38ce36faee929864a5c7793ec26dd6d1c4b75f111feba3765d0d35a272fc52fdb85f2c0bd1bd22cfb47bd0ba58d00af119759e1f4d5763f15cba4e788fc6f8a221dbdeb32c484a\n\n# tcId = 90\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 0594a2a0f3d10857e8e2a89d72df80c8b37977bf2c390087d1df7672fca50d21b7a3b24453b55afee4c6fb2adf83e6b3e6a63db31b685ca956bda1f3074eb53364d9bbb9ad16883b56ceb66cae51712d592e10f851c4431a4f7b3625c774808bf7c694c582f1f20c2f51ca9f781c6172d05201e1e0ad96f7231c2786e039cdafcc4045bb078c2f432d3409dcaf25d8c0549de03d7964606aa0fbda333a0eac26e5f3ba13b1d6dc710c01a17e1a24241bd741d51db4cafbaca518fe32feb0ed5cb916c8c094c41f092cecb7a9cc0818351b5c8b6563bba32fb8e86b4c81f4f57c24a880e91daf31cd1911aa6690c8e45f00dd62986369bfa5824b785c1c56fdbb\n\n# tcId = 91\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 10bc1d1d1fdd4a8f74b17f2c8258078ef5c4f5fb973a2505060b126504c9366a4578e2a333b1a9c580239ee959d17017664631982cb8554fae8cedae07eb7e2fb69cb702db93d948d0d0e4654d9eb49192ef87e92f4d229ba56f165a8ad4769d0c707111b9be90c6cc29cb3389a9ae4d5045d8a69234cd5e57fabb76e5d1869d83cd2f3ea8f0419194cc54c398a288aaa35f765ca8e0e264865b709d5a21c9d807c4c0751f9e4e68c9cdc61d93113e5bb811c2e217f31eb14f010aad77abed3e4305e7bdb1066879237849883c3ef099b85c78352b32374dd244e173edc3824924098cfce9d729166ccfccadae8871266927763ae6a5e750f49b837b60682aa9\n\n# tcId = 92\n# signature is 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 93\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 94\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4\n\n# tcId = 95\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5\n\n# tcId = 96\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 00005e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e",
     "1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f\n\n# tcId = 97\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f0000\n\n# tcId = 98\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848\n\n# tcId = 99\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 100\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 1758eb94588e6fc4f50c1be1afcaa41027869f304cad513b1fb12c2f446d63cdc05c4830a7e3e630da7b2da4f7867cc173bf6420f9732277282596de41ded32e21d0cc31441174da8765f57419c7764ea758f55bc17646eb100c435d1ac0eed6fc7ba6de5f832094ee2f479979765e05ac9976788db3c241a9e32a0da864f0019a87646ba623d63f4411af5dee1be9ec488c7e3e1b231479de70b9ac5f78a17b1f4120aece45f26c07e7bb345fdfeb05e14bcaacc614672a465fc523624cb19f66f9c6c3f642b832ca44cb25176d679f0e05606c3fed022cac24c2bf960a406d48818e3eb7ed53b0446032469047dfed95fc18088c92d91d93722c47f88163a8\n\n",
 };
-static const size_t kLen159 = 61423;
+static const size_t kLen175 = 61423;
 
-static const char *kData159[] = {
+static const char *kData175[] = {
     "# Imported from Wycheproof's rsa_pss_2048_sha256_mgf1_32_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5]\n[sLen = 32]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 4f01e0c12b08625ecac89a69231906edf826380f37c959a96690d046316d68ffce9d5c471694fcebfc6b45534864689256e4fc81c78e583f675d0c94b449647451e81beff01a11a516d5e5ce3f1a910437cb8a3a5096b19fb15f4524a35b23d89cdba12cf5b71aac1047b28c562df7c5542c34ce23a182cf7e0e231934b17294799d44877a1d68ef1b8f073619b7618e6b7c22db20030d98cf591ffc3d4da5f58613ecd5ecfc3b40a1d02f40891ca43695cd4c088b05a8054c89c595a47e274816f35384226f74459ee63e25a1bfc03c360490552ec38343f8ace502f065303b00bc0ec320711b211fde92e57feb9013c3609342495ec0d7cabdec21e54acc38\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 0658c68fe0895646056d9bca422a64fe48813b4e14f0c8c4122e56d345b6813dc6286ffde014617e351c7af0a0d2c0f285def79cb734e1e055a25fa6fddc1c07da17b4b235c637413b1849c24311fa72331f4c0458c364a4916de8619b884d7e37288fad12926fc091f4851686a04fd0a504dbce3db370663a6ea6128fea86c2ca94c63e0d34d7f2c845b5d71d9a5e544451f524a451acb85c49bba7864e0a34a48613a819caf3dfd0d510c940f1df21c3373915be1f3509a557fa4d5a4e9f273e85467961133e2482c0907386454228fb0246638616fc31bbb6fa7c2361b8035994eec69a923f4c0bb0ba8696dfe8b1400c2398d7b343fdf498b1116c8de602\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 401eb03cdb47ca88033e3030f6bdecbac8f5c8fc1dd6a13d23d379ed9a2b309891d13d74fea9d21d159b9e6d8f37efa2489962e24555f56dd434ff1d31ce4f9f5abd3f22cbea8b691d6a11e44efb83e2bca155e6a164325e0fde2a8865afd5c9f51161a9d615f62af7ec2e31b3e5ab649c164490d31d88cfae35b84aea7925690f929a144b6d2f48e8fb894a52deecd1b9a6496990c4ecf1588699a42cacd10c53af350514e4291ea9a058e77f101e32c1c0cefa61d945f7bc931f8bd19e7ba3169358a60e5a8b0123bc3199b9fdcafe8e519c41ba675491a27b85e44ef2d77277c10fe107293c8290186913bc9a99b640d8da041b64f31eab1d35920985f4a5\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 599724adc1bae31e84eb6e1399cd90cd67f48b432c63719b600402384aaea9b21ee864cdcf259029180877c847a223912b0647f066a59a65df6c2d3a6675b1450f0b05185cee486bfac56cfded182babcefe60568a6954f026cb2f59002a2f755e9bce49793f280d89822c9bd3a06a7ad2209c3d6cab7c1f74c8bbf4bf374e7ae8a539fccb83a78cff96a4f538adeba0869659d0e9647d98f96cb55d9cb7e58440c4c9d85b8e9dc602e909e29e45f2b82ded44f40e9ceb1292da20063967e3a116f4aeb202863cea523f215b8ec7fc4f6a22cd8652ed661e33803f3fa1be966fa8754cc7b0fa894cee0f045efba14c4f4a1d7cb837cea69e30522526b8a5878f\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 4e68a8375e086990bde05fc4bbde2d368f8d96a5bbcf16d9239fcdd45942d764fc2317d90f4f62ec80059490240be8f32dfc32414a427c7e34be25ed0dcaee6927881e797db97a0341fdde459b9cc915d0a348e15dcbfe1b0780472f52a887faffc988a9ceb677e1cf5638e44a9d6f2532417ed0bde5d67f5dc9229ef1f3cfd9cb46c695738fd006cc62d02f5df76996270223060f72505ccfbdf4e88d961e2e7763705480335148ecdd23d1202c26a963860dc769a43e44c72285092ba7f24d81844e612bf03f9c2ddd4e5960622f71672f4e42b8a8f36c6847a05f70400207471c575d6a960fac1de809118efb52903ca37f12d40f6de74decb9a5b8a415d4\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 8bdd6db90323f3bf26a36a4ab5b92180c96881bd32b66317c4b48c2ba1421f8434000c06adde4264c6ea2d5346468c6d5e97cb13d3cb932e523ac57b59c814fa0397ca6dcc9bec4be1147d77abcd318a6aba1af46ede2f5640da06511a006fd1bd5fb8e04be22789956adc47bbec7988be477150f9b24a07dff51530e8f0c14cfef7d25ca141f512939987b7eb0825633d41a48742bd7f56d4db9733d92ac0f36b4041f51332695f551ec91076da2301120c438eb9ec197cbe318d4571b6b79098d17eded0ca47747a143e34f882ad6e3f490f3a710ff7ec1bffce022027165d96281e593180c67f44aeda9ce6605e6b8e5eac1347695dab211a965bb3d3f928\n\n# tcId = 8\nmsg = 343236343739373234\nresult = valid\nsig = 3a52bec84b5b41e09358a7fe24bb7ae0cb39364374c911e0d3f011f2c4c79667f43eb700fcb33e44533654b3efdb37e627eaf1352d21a187a70a86b79b2c34ae3eef944e3e61d361c3baa446dd465f2ddc0b2ae7bc8beec1761922fb5d7aa6cc4fab9d1a0835f15cd71ccb3fcb57c578a46a7197dab478b7d1ed7c6235dea3b117472c334c3a18fb8a574922f511d7ebf030201dd7457a3860a6af6252ddaf90d07d90aca03f7037223400c066db1d7feb91d84815af2430190a2170ac7eeff898ebd5c4c7e9bed19aa86293aa257a9ad0a5146be80e7ce6081c8906d269d06bf037e34ee18aba113dcfc98eca70abed7249dc9a49f971648e58d7db2282ed6a\n\n# tcId = 9\nmsg = 37313338363834383931\nresult = valid\nsig = 0b47d3bfedac89323cef0d273035674b937f4106355c0baabf6664a57b3064a789592ec5ec4a63997b6f3dd81b0514a78b8824edb2b0ffaf45f8ae6432ce3521bf77e01912df0da5d6fad9f554a3d69b402866526e6914b5c78af847233d3482598143dd6fc65a81df92cfe119f38b0d4f9d1a51a99aa569e42cdec9b42a0598f5f0bbaa1bcd44c19c7614202e0aebaaefff7f3d197635e490bba81927ce491a5810952593f8fd57a80f60bc3c0b2a7b10a0f9dd4930db8172bcb1642f6d03332a7d90ce1edc1f8054b5bd4f4760996bcd565bddd2c6dc8f54fc6da5e6fe80a2248f920216b1bb836d7885a023d92edad5d20b0e47cf5beb2cbb1393c624eb3a\n\n# tcId = 10\nmsg = 3130333539333331363638\nresult = valid\nsig = 20c9d447ee65a4cf7883ab724df0c454814029c8178ddd25eaafab34344d6e06877d5a7121af22c7e5333e2d4f2bdf42450b7b735c335ebdfb461f7b20dbb77c68c449b7826ad14668e2103b636b300a675a9b3b1aca936420cf3fd8deb2ac8aec6528409f6419d8d5ac9ec2757ad4781e9cbda98912f4304710d3a89053ebfa7a84353c86b0c48eea5a541af4644ffa21b766e738f0d94cc796004b625f244f63c41666b2213317f778f0d9d7d09a1003cbe1b2bfef585f1580f941398059a09ec07ae35bb690728ce85c2e192d423a71b513008c29582b37df1f83e40a699c88048aadd81211322b3c9bb449addb037c553551d7835e90d53f1a1883766d5b\n\n# tcId = 11\nmsg = 33393439343031323135\nresult = valid\nsig = 7c5e135d7670a57d8fd7a1c9c7b33a6e07a57d957f7a5d9594200eaa9647a1d460bbebc40e0036a7d7665ebaca9ffe3a166fa1411c704049975a5e46b4d4fa03adbf69d1a18adf59505e6d2cfbb82d5d32b7e3dceb8542e9ed8c7ac248f9f7a84abf3f16e862726a4dd189c61d6979d85ba982db3a5b2903f38d2558cc115d6481952506182a09e04ec257b19235f6c6e2c6587bedb90709298c142fa31742f401f22e2b4b446f9642b598cf43d4d29bd0934f4853ef70ec72b97f6bfb084f45ea439c4dd8242d059bc3c1a851c67d94357f93587014b2860d7f195f7b",
     "6bfb39afa712338c684f68501c5fb9a67dbb36544e6bae5f72dcc85815c2d4d70b5baa\n\n# tcId = 12\nmsg = 31333434323933303739\nresult = valid\nsig = 80ff5c8258bc0c74993dbdc0ba644e050cf47213a6a19bc83d5e4b2080adcca763a55918a7e19d85a0da38c5cc4c0b958884fc79578d4c91bc403756c6dc353740df2d0330f32e1ca91136933f2491c6e7e9a01ea7bcc87088d7863e048fe9796d955ec7cf1d166ac36a431e4f858d93d8caebc6ff60a678d38ffc0c88e8ee0ea655d4c1a46345556e4633ffdce68914c75a55f071d4e59a2eb0d6fb6fe4f28b63adfc590a4f5fc72812dacc547fa0c4985620d4019083eef115dbddd673847b79540a4bee6dc4ee8de267057e321c44aae047d7bef2302369cff291f6efa90dde97672ec3cdf4953f27f26ce62e77251fbf5077fa986dab5213f1f94b19e127\n\n# tcId = 13\nmsg = 33373036323131373132\nresult = valid\nsig = 70eddb0b9cdacf82add0c58a154ff2c0ca5cbe2877dbac3e5596de69c686ac2710a78caaf6492af18b42956c450dc4eb1a3e6fd669100d55e06b3428c6285254291fab9c80634c6f9c874db77c2107db37720b43982d9763cf34f79283265dd70f03e444158e82709555db72fd7d13a004290140c80511985fc5ad275a72abfa7ab878cf043e6694340ec6b3cbef5728f2c3c63747ff75906673be53800a7eac17a47debac1c5a9dd36eebba9c23575ffe1ed4ccd2fd3a4b9902f563b17f2bd9638d2348af175e1cb918a0681691a84444751750463325ebef2c40493f049c655077a70bf420b50917906315657178e7cfe607e9c22a23e67fb88590b753411c\n\n# tcId = 14\nmsg = 333433363838373132\nresult = valid\nsig = 0ff6e37a9aa03391e6ec8270b926c123c7e6853e01e4530382ae1e9067c2c447f2d21ea4f6b8cffea5cdead0e7bbf4c26c07418397f7dd85f4bbac0376aa099574dbd3142081428762e0092388142b351483b67fd8abfb5b73f10383d33fc21aeedc6a0e6f8a3d47f11c8b319425f9768cbbf498adee29e7d52611feff8596b1ef21ebd203397d5842cacf570d79cf0b4308a32d0951a7fbf794b84e540cb52bb076972f003ad59a35deb7af887bedfd26cc7b2bf334e242518978ff2e48224f89c7894737bb835bc353f4c0139553d3aa4722d0cb15c5e0aca5f5eb91dc9f4639aa81314038367c2779ba5521b250b5ada48ea3d2bc41a1680900bcf3cf66bb\n\n# tcId = 15\nmsg = 31333531353330333730\nresult = valid\nsig = 22bee45100f26f64d7d994187841d9eed5ae1af0601604b72ea005fae6e28cf0ac2ddd9761046eda1ee55949820c5545a0af3fced402bdd463f43070da8a4dff41531a0ce09b2eaa14bbd3713b79bdf00a144167cd2142df7aa8c5a24be69c4c1a728cd04421183658726c5765b36701f0d61d26d062baec16eb59b1594a185363d8eff993ab9c6d5a5899199169ada44b77eba624c53bd7b745b053c55355da88e6b83e74069d7d7e51964a0ad666ff027ec4792c6f139f1baaee769debc55abdcbfd22fe84d6d6c70a1cd14597e7e3c218b36f35f57d4b4dae3f1c1dee433259e961cf69c3e019438ab60dbdbae050519fc3620ff677d5ce9ed6fc43868e1b\n\n# tcId = 16\nmsg = 36353533323033313236\nresult = valid\nsig = 1b41b1021b3bd5fc186eed5c1d2a69f7e648d75a03b0fbd62104442c55a707812ef635c7269cfcb124f464d6532f28880b26f91b4f3f826207c0b25401ba1eed2b4895737080085ade80f13620c20bce004a157e708f450bc615fd35c1d248ed0f9cbfdc77222d847fa8143e85f3eddcddbb137bc7bdb2ceabadbff8aadee86aaaa217a3533939fef1d6f5f3b5277d7f8ef1ca07194730edee92cc3fc9ade2faa603117e5ab812ad5a375429ebb913fb370eeeff362727c9bf2901cdf34c6d3f03ca5adc849759ec2c8dd64fa24716af610749ce462f189a5c3c947e4cc65d66983ea9efa2927dd4d9054c2e0b969428b18aab616d3f95d24d8a725d2686d10c\n\n# tcId = 17\nmsg = 31353634333436363033\nresult = valid\nsig = 52449f163676b9a8249b63d0340d82305cf36a920f173389f304044503b3f5dbb503b8c09cae20a24cb6253a16d2e63559e0746f05c6ddd8fd657c34c2de6fee62cfd2d4c6c4258b138b7e827326110812b1a04573989b969c769d29c888e1e64546419d17a16ce9abebc2bc00f8822401ee1ecfb9aae39f35792338f607791acd3d7dfd3e6b584dc9382f558990607d26f1f461c5b57879d2b0d1b6f50d8ba23b37015da559c41fad4ba3607b5cb40d18c2131091102a4295555ea37e9ce92cc7dd2f41bb5eb30d02c305116c0f65464e8e9584d1757f4be2aa2814ce6b387cdd7ae78aa0032ad5935d74d4d56659e804342aea3a785d6bfb70c0cb44897903\n\n# tcId = 18\nmsg = 34343239353339313137\nresult = valid\nsig = 33c76df07a9ae7335f5e31b3d14d7412cc79c8761ffc7fb5528ade2e5088d3be3e269962088f356830f6dbb460c73a526057d57648cbc709c14c23d85f85c11ad5c6cc7e3ceb5238be9e8380bd789106cd10e034036873ba7b8ac9470a01cf4048b488782587e2e5d7b4d2116e34b94f9c3d22983115c0fe96b42063b4f6fef5943fbc891a320f09e62f36cb1a6d83752a1c4fa6b62899afff5118af7102e123fe9c7b2a51cf3056670848240be93aaa0385ed093da763c91726debaf1bb9a48df4be342a3cb9c335d2b3ef999da4eab94d15ba37b07d049f885572f47e7dc33b5d481b5ce1a3f8b3a4237befbf04f015a97217dae6b16e7d855b9413d7c2271\n\n# tcId = 19\nmsg = 3130393533323631333531\nresult = valid\nsig = 2daebad5dc34fd919164e3ef95bbad50efca0ef2364b6db55dddc8fd703cd046e12d2d2181002d3e6c79a3671e2c7ce180176c3482baacc90076da7727c9b0c958ac40f547376b44e4f266df35419779a4fd30603c0042fc473d4a37ca3f069a915d2d0ab95b81bee5366c053b99d156cc31b2f3d68b0ea5f98da4848eb8a4dfce8ba1e167cba0ae2584757e5c1e46398d4695dd7a96412e2e1c7e62b3475a6689c5a80cc6b7c4be01a3cce6045a43aab732530898e60f55aff427afb201e85694b61e81ee86e58959a174ea87dd7f244d29c616b85cb426e7473bf568a2649f1efc40592b700499314bc809d4d9668946d60e27af852c02f6c7210dbf96ac82\n\n# tcId = 20\nmsg = 35393837333530303431\nresult = valid\nsig = 5c4799e86c698d3e09d8c806104ca3e7cb604d922d4373d7119324e95befda0669732294666e9009f9c7711b130ce531b1cd16ca5a147490a39f8726b3482cb3f2683a8a14d04ed59012005df79d2500730360dfd40f6d7f90ec71c101a686f02cf38c598efc33a60bd5d9c6d4b2c084258f865b8e77e802dc85fa8c2f59d4530fbd1e2aee005c3d446ff8f59c807f0664e5e62f38eee7be9b2eea3f8f98eb2b44a0848a7076271ca986de8599830a59a1289734774118a967e70f63df1bb82374a1a08fd91222ec77117f2af9706abb91230b06d5022e2a8784919344647a3b2660cb5a689f062ac84c3613278043be9204a4239169fd14fa05c34d8a6a6e64\n\n# tcId = 21\nmsg = 33343633303036383738\nresult = valid\nsig = 32753c1f0fff11b1aae620f21f4b25ee32eb5319413c201a71da0503d32077c911e40fae8a14d944bc57b36b05d85a9b4e2d92f260f6cde67739b6d252e4800c8e5c9499f603eced7f97651e1ee878654c0bb205ba39b59285a695619963f7f36dfdb7a2040552bba7ff13d047d273f0fc1ca3892e7692609d43adc0de6e3191f2ee58f3069531509a94de113fc10c3e5d4c886108394a55dbc2fa4baab0623db347cd0f6e6306af8973f0f166558c31901c9458ef274332c15ed9c4a6ff8df090becb7841ce5cdc40705b799277825f029582eb21890e23712837088826c108341028c96b4c6a0dd7b37defcd82622bde64a2d54e4749b065db7da5a515eff6\n\n# tcId = 22\nmsg = 39383137333230323837\nresult = valid\nsig = a2226016f848d96442f82bbc33bfbf098c4cad85b07915dcbc323baad479bd971f81faa49b063776147c448210d4adef7f06fef44baddc672501e0444fe8a28f871f49f6ec634bf4f49d13e4f73c832c978bd227bc1e85804122157885c8744d31f777168a8cdbe7a4742366cdcf0bce50a0f550cc1729f2089c927990d94f73cc962af25d70a1fc4da6df8457ddb5a4969bfca4d2b1964bae88226ab11047da7b6e7adf8f96dbd772747f29bd9b9361244a04b7558df62d84828f7aad2e562f2306a96973a068b176008b0c7534eebf0ae9f7979a0902212d4e20dcf162ab51cd55944d9bc07692348f8306ca90a80306d404d21724a28efbdd228e2080dc89\n\n# tcId = 23\nmsg = 33323232303431303436\nresult = valid\nsig = 6b9a45ec517bf838a535ed93fb36bb027471b11d20d0bf6b1edaaeefa25bccdf5881f34409a042dadbe4a7b3c41bf24abe66c1f7f37b92b9658f59c55fa88aa1632465ba8245c5f0c98d082fcabb5e9fb834d727a354f8f8a7fcdb8d3230725472a6a4ecb6f3d97540773e53eb45383acbe4bc81168e244fe769b1a7d5220dbcaf831e46c93f6ea7ca2ee30ce9281dd9674fccdc796fd6147be4bd99c53a12eacfd4b9b00972b0539e3d94b85911694ea98f27496b567a29fd3087842ba01402901d1bb1ba6b3c7931f1329ff5644989bdc1f7025059d0d069517fbb682c0be049ec7e38b614af1cf9cc37eab74e20e6bca468f93d3f13749557b70129ef95e5\n\n# tcId = 24\nmsg = 36363636333037313034\nresult = valid\nsig = 01926cbf92190fe7ccd7f858c260036a7a9d554bf636a82d43edd3d2cf0f5f7006c2e0d6dc43c7c427e49940cdc5c397df66841897d3e118cfa86f5188c54409ffc169e8f192c3a84896931d98ae8a9e83075e6dabe4d28a56f0a9282432511ab09a1a0ed420be665521936a1c9834a456997c0e5e2c1fc56ab45927b6042d3571163ba59d994b902aa5ed416ceff4313fb1c67334ed7be715d2e96c045d6c0bfd20f2f5040e09fbb077a01f982384ccd883cfa2fa25d35320746728ae530bb796f5ae6ec2c36aad3344ce69045b793052cf3a569293a2d232eab378853dc4030b91e1f08c31348224b774e8b71a7e23e77403cb26d1f2b1bb800c772860451d\n\n# tcId = 25\nmsg = 31303335393531383938\nresult = valid\nsig = 363ca23ec7d980a83a5f367cba3e9a2225b3a3ecaf6434b5a347e3baa5ce5ea27824fec727ec7b3ba2d41cdc9723f5cff3e75dc7f7b9200baaa2c02b4d8399b1760a1011231e2b26bad9326204c5079ac1c1303ac08fbae42f6a4032407e87915fa3759c43b29ca07a1a3259fbee4274b63a52860c6351246f8c1c84538e5e6f6add7ff6152acca4dedddab146a25bbdf0076e2879ecf93baf9d647b32cf32a9e62718eec599cd7b51510a70fd989a77426049092621c2386a82771b06a4c5b86bc28fdd630e76fe43f21c5d22fa63001da300ef9777c9dc4121158840bd084394d600a6db284b1e771112b56b63364f007cd71666902cac56323c6e5494d50c\n\n# tcId = 26\nmsg = 31383436353937313935\nresult = valid\nsig = 4a2dc205db899d51447b689d",
     "3ad601003eafb70a51051ae4e570c5125afae66427056fc2c9f71bc42610ef85ba0f49a2721247d4a77c6dc9f01429c2d9b909fc84dfb049bd351872301a7736195596a1c49ccb1b367544a190d188e4e66749731a760d76aa116fa4a189665a98975b7ec803e2695fef42eae7c7f8e274e4fb1c99ab0eebc76ad6bc8d768d2dfd5969181e78b3ee72fa900c31510f071a1da8b7589e49e254de8850db02b1be841af478045a847f2db9126a4281887e02beb58f1f0bbe67c9c7acfb49b5e4ec4fc76ef30654b5d3ffcfcdf7cc912c5e1f2b20d91bdd6114d25405ab65215c05c4ad2b6fae6662ae5130d17652ce42c0ce86c153\n\n# tcId = 27\nmsg = 33313336303436313839\nresult = valid\nsig = 45a2550893820ad511eabae35039a13457350df7ec21cedc1484530dc37ad332a170af8bb305e4bd6da78cfa4382045ddfbe2499a19d51838b3a553d7a849c49e284093e1f2fe4b269295a75f12dcd0e727a79c1f0e9cd2a89e295a355a52da7ee1dc2547fa43d96abef1a3b5121bca67cf450cd087c9d904cf797834057334f788c96763a4ff0a899068363621d90136eb530c32041ef3ede97a44be137d08c2a7019f31f8e27e156e509227860c723e3aef19685a5e3a10b78df66b38f299d60b2338bc6a943bc1b2f9261977ef4e08d1b6b42de17c4c652099d377a7ab983ff983c3bbbca99f79c8148f2afa9b0f1bee51e322ffc05b051e17d132a6e90c4\n\n# tcId = 28\nmsg = 32363633373834323534\nresult = valid\nsig = 258d169322a9546caa2b68089b481bd38348159fa9ed192d2eb60839029552a420d5b24644c3381a5ffbf2ed46072974918d777f1c53ad51f9ce8a91aff95dbcd817f50ef13ebfc9efb6c36987dfaaa96e37aa89dd7a32348906bcc22f4d0b5104c42181f76974651e3ced20d5412f70467d834cb49b1b7e1532ff417f91dcf653f18c43a6ad9ff4469600890f836c553963bc2379d5bd79ad338035f7f4aa6a27fbd924b5bc8d8b5373de7f4cdac75cbe0b8abd3961db17b819d46ccb4cceddcdb3636309d6754c6d82a61f5d9b9bfabd0c948777264c1138c6fb6064fdd5a797e551c1d0e545d1d32d63e1ebdfcb78275692cb50717910312da9917052cf53\n\n# tcId = 29\nmsg = 31363532313030353234\nresult = valid\nsig = 824d0372c40297e3a0059236a93f60db3d2514defe409bfaa2890f4d04cb21043ba1871b8374fa51f1c4d7392d0e244222b1eccd118009e46bbfd2a84bac9e84ddc5102eb4508f5b9d77450f7aed31cbf5b6a4032bb44fd808bad403e8b78af3756f472563e050526527debc1ec49ecf5d5c10f279d06a5dbb7cca188ba212be9fd36c7eef8b187405da50dfea140c4b604dc313f28941f2c4447143a1420b31cd23663252ec0426c8465ade55cecbb9b9cf4f88e2b4b7c86cc5e2c6a4fb25c55835a2eca1780fbdbb8b354ba512d412e84e73764e055514e10d7ea32ad7e1a3c20dfc53732d85fae40ca951b5fc18f9ab21c9001dae67c6200b9cfc6d142565\n\n# tcId = 30\nmsg = 35373438303831363936\nresult = valid\nsig = 8367893d5ad77be24a739cffdaa7bd414d66442357db9bb339a7ce862b400363d9e7014aa1ced3a8c31d65f247e96ba5649df636fb759df04b7a62da27a64025bbb9719c7ab1d74d63d2ad5a324db8718742e5438b780ae630499bea065e2215df9313fd45a57941e9632ce66fe13a5359900a0ad5de9261aef6a11c3b98be765c94a6d24fb7c88fdec9d6fa52ffe975917d3b3d68794c6fc899b0f6901173fa91345df15f1d08dbaa0ed77e692f9de80d6670a95bce1b014beeba77543baf4092f4b2158a1f27b62cedb0bd3f2cdd381d9a46bae1aa34c2b8c36a65d4e44fa5aab1cd188d4202227d6fd537776980ebe636dd81d3bc0775bab23ccd9623d423\n\n# tcId = 31\nmsg = 36333433393133343638\nresult = valid\nsig = 99f149e9940d2a6eb2e824b48838d56f383e4503cea71e9ececaf2a6e9d616c1e941fc0f8994a0373ca6325f6de2b76be043e4812d361d89cce166e7c0f4ae8e0c2c8aa053ebe4568e0c5434acb6535902dd13901446a38d7905eefa51a22bb5b2a05b242b061643a8b1538c342255438d46824c43c5df1fb84631147b9cc689d7b828f2bd5abfb48bd40a1b0ff6866eadfd9588a0361d9bc6a076b978b9f855a36732207816c8b3c426914c73c9613ca53ef8261fc30dc7a15cf7c858609265946626000a1465d41b076ac9ded93b86e95de58c1a4d2b5cfed5d311b6f24cbf257fb03c47e443cabaf1e766167f524e6fb665e42ee046144f25544d46d34efa\n\n# tcId = 32\nmsg = 31353431313033353938\nresult = valid\nsig = 20d044f045bdddb0bfe994a34b5437e61446f9568f3c7d09137430cfa17e3929ab8b849ec7cd632079a88f994c0f4a0ce23f2976595df198b4f1431205c29b3fa1d37980855446d25327ee669324c3666022c0100cf1bf855c8774f3aa4898dace7a16693c614eac00cb337f05ec2588f670370c3ee40f29e8e900da16d1dd28aaeb098f8f3b918c562f8c2512af238ed4ecb3be4ae39374eb638b021419a3e00890a4eff70876fabd74eea1bd56de05dca208928d434e7342e9179471e958e235a298f35edcf9ad77411f824d5c53b4308cd08b0443b58fc5a868399538e5294dcbd2e94d02c719aa91ac12c3839bea47cec649620b73235f368fd5d977e033\n\n# tcId = 33\nmsg = 3130343738353830313238\nresult = valid\nsig = 4c8d64aeabd2e12c8f2e3d31ac3f4b861723ab8f9a52cb8910b298fa3a735bf91284e9ad92bef3995a1058fdb0f696143d92a99c69c233f60f64873882c1c9ca8e54cd03350804aac319747c5cb8ec6e42f6100474158111b30548519e02ae9ab39507efe50b8b212caa82305d9f2d2c43b2f75c5538b0ffe9423e1044b5fa05bd675e1afbe6d22e73ced8dddb3a00ef37211136838bfcd37655203bf2c830a62f2c707030e2b964443df1ea24ab1271fd06b3d6c1ab78b13374c086edab36267ac065bf5ad799d2f27a6f4bae708be1103841aaf21ff547474634e94c7ffec8b4bdf81cd00cf0f0e6f234cf2d208e2af2e2fec001944e9444b005c8ed919903\n\n# tcId = 34\nmsg = 3130353336323835353638\nresult = valid\nsig = 0e97e294583f528af631e44c02563344657ed47783c119a9d28d6c0f39b6ebea40e1847b9f2fe2708bedf44d2037ef4ba7464c630b8ea5bfe1c66d4b8729b20ffd22fb5721199e884b3b314ed1a6b8abf11c72314dce375aca1d02aab773d88830d1b56e86f45b1862482242d9ff57a1473876c476c33fb8228420f3a6a31f85b77aec3a8d60b383eed4f07dbade1020f5afcc08132d0423319e85f51235b4aa5e16c0b183e0fd653e594c6b17f25d055b410b78c890f29c7966a8096cc248906084176e090af500c9c5d9235a2d35f231bae74deb9b860a541d2bb933ff0a200ccff8ea3642e3350562cf29dc2c1100401a9ae0c0f5e1e6420b219e34416254\n\n# tcId = 35\nmsg = 393533393034313035\nresult = valid\nsig = 80aa94e49ee824191050c8bbaa73b352fea2311893d8b8e00e61a2d14701783d364e15fc09035482747711fa1fa72629460fafdb23474564527447e0c05be2ba895e2dd1853b9e6079afc1464f7c8689b2ad74f8cd2bbbc7690c91bfe2671bf3fdb1a43927c5e73123f4dcddb8dff9f06bf254ca2cda0a039939ceaf2e196f2cb268eea37c515d0082e5e9b4a82719c6f5ddd6e6a779054325c1ac45d6c2599f2c83def50881cd9d3a8508749646c9296ae2429a96f580d7cfc54b2f08726ed3caf7c3e5ab37d32aff309b1f34c1b8d77e2da69b619e3804ae6ce439e796f86340dd0bbbe7ea823857d9e4eb1aeb7604fa16f4b0683f78a8253d00fedb5b6024\n\n# tcId = 36\nmsg = 393738383438303339\nresult = valid\nsig = 1e10e4135796443ff3a815be4c873f9f61675c85137ff4397f600f4f5ff79634aa4ffde2195419fc78ac82eb7be206f91443b12d743457cf7fdbfac6d7f66fabe26fba464d7f984c6a502b19c8d4b634cded91d4289bd84ea7b2fdf2e6229bf47b40feb368692f60277eef9c0228bd315a3237458107c8fbfde830f8c32acc4d172e8eeccfac19e99021cf8122487f93175981bf9b797ff869153b8addaaed1f184a677fd694d88ee0eda3959bb3a0d8f66c361658359eb117eaa91f02c6c0889f69f9a14fad91d2fa443d2bb17f3aaa41928546e163ec2d09ec5cc9758c7cda12fb29692f09abb987a135892f17afac78014624298b1af79a523fc0cbdeb120\n\n# tcId = 37\nmsg = 33363130363732343432\nresult = valid\nsig = 73e39468a5640718bb56f26939ca18406995013cd10a7a72e65d2e6b1df2e841c1a7394135ce0e5da4a830bdfaac5bc5b2d8ddbe6b5098a3d9de96cc639823f7a1b23f769ba18d0d4772c1e989891a4d60a95bcd42160a78931361522da1ce1f10204f57c519a10c2cc9ee3145a0a2ac31c37b3b5e5572aaffda559f05a684402bb5c3b28c6a2ae263214073999508d96a96c30bf02fde3de162d937c4f2b31ffdebc42f9267e621855fd18eb97c0cfa4977c1a3765b4ebce955a9c87130baef1853497407b1922be2f43b6deaf7910d6f8fbfa97d870f16e17a3b9c133be1391e847e103096fee4905f246facbbe8c95f62d15f302cb27e8d4b69ec249af4bd\n\n# tcId = 38\nmsg = 31303534323430373035\nresult = valid\nsig = 40e3504284c59620caf145dd9f2425c39c66bb4e0d7abddd694b810be4a9e2f728d706531019e7e07293066de0dd6c7c68ccf32ff2d91dea74c592c504916148551c99ddd5e4ea0a906500341b1f7f6a03c4901827fabddffaf1f028139db5292554186b867a012520d554bbc42b1d73d52b397a7c310e7d195037f15fb1fe729f577d1847894436b9828eca4fe881945c1a38a40805365dddf6cf7708cba2948a15b756757d6246dad90985222e4baecc7823e4e7e99d568a9da144a5b556220aae30b8a8d916a050a869c70368607dd0092ca9b5a00865d3bc1ee0ec06df53f9828327127f33a97796f6b0b255f1cee34328cfd2ca1ea3e692d0a94e457ecd\n\n# tcId = 39\nmsg = 35313734343438313937\nresult = valid\nsig = 72f7f4bf01a6784face7d31b19c19ba1c75b16eff419f81b39c1c17cd489ecafffdb2dfeb33045cf679a455336bd6869ae61109043687293bf98ef7ad03afe6e71ce4d43319743c07c313b12a728c8a98256bd1fd735152d1d2c83de2b8b57cf9bed4691ade15eabd261377c8e26bab03d0da055086dc4ca5870bdcd9ef3e7e0973be871738a3e389d774d5d04d71ae0a3be03746aa4b7f20afbb3a44d9163cbf4e675e36d01f016087d4e7c68b2e3020f6fad363948804b0494d7b38d2ad4ee1288bfc5166b59ae3db2c2c03971fd42d04e6fecbd36cba6390fdd878b67a2c6565a7826671144712108e37adbe8198a2bb3a371c90d8c6880dbcc948cb4f775\n\n# tcId = 40\nmsg = 31393637353631323531\nresult = valid\nsig = 084cf6628f8f96ad842105198bc30a72bc3ea4aa4bb01176780f384f9f4ef2dc9b591d042c56c898e48d468226a9a361a9c8e0b27986fe6499112d9f425e08c778d01d3b221dc110411006373ff903d78678b5b04319b5f96ad1",
@@ -3961,9 +4060,9 @@
     "79d321ff88830d47d4842c0b032c27a181ac06a42cd0bfedaf75f2daa53f64eacb5986545bcf150b8d433e66b698f2553f9da259bec319d8c0cec05d9c320e7300463d41eb077028c1e0a7d6d87d4dddf54c5b78d6a15e4527e37110b9b9ad2f3b2dd0db591227d41cc9f26f2349581dd89e0ba639d0cf9f8c86fe819dbadc688522b58d7284caabf843e7143395255e9a0d710ffbef6ad13f6a9361e20d2f6f5a414f5\n\n# tcId = 83\n# last byte of ps modified\nmsg = 313233343030\nresult = invalid\nsig = 5798785187910703680cb2109f492c3f0a91b4a8f11d3da775aba891eedec3d76fd30a939f5d7a2baf7290c573e886cec8ecec0b1598f2cd169d53b4abf8accc09709187f32a12c80fdb42ed98d9e98b0923828f0e38acc338234f7b7a0ee377644a655f48816ea4a5bff0f6d63c3945dc3aaf921e9404864594bc323c1f3ef42f9361ed6cb8fcff2994293e17865e2fad2d885277251fa24d7e7aacebc48d61c3b48047dd7c99826b3105d2f820cd62404cad5d758da461af67677e39e55086d8fa52ea0334bc3b77f95191ffacd28ead07a34e4672577c4c65b5bb9d5f9cab6e1f1242216291b69a0c98714452f01f37722ff26589734cf6020c5ac9196374\n\n# tcId = 84\n# all bytes of ps changed to 0xff\nmsg = 313233343030\nresult = invalid\nsig = 3747c7c116cf30567e24fd4213c126ec84366a26eb304a65d144dd9b453054df4e5036c861b5807137934b1cef351411e40654bae5df6fbe3c42d763407f273d3dbe059fc6412a366775603e064b1561a58e70860edf954dbe666f8fe44f44f87df3b0e3f3e19c904966ada52f00806f975f256d4a855cee973e20f33c31f9f2b3792fcf326f075f86f275d8ef8df2dd0abac83d491d485fc167cd40f3802f66036df4fd64fc441ac8a25b405d5ef960127623c269ca836671a66a6bf2f39c0792dade17564d31863c7e0161ee0bb88522ac0c9054bebcedb603a2d18ddb0f64a91ca5a2f0086afd0d8c07cb0c1e7f24d12f866cdcde46d663c1d4dc7f7c6f62\n\n# tcId = 85\n# all bytes of ps changed to 0x80\nmsg = 313233343030\nresult = invalid\nsig = 1377d4997c03d885e4b95f0350b1c8091a4d9beef9533dc6abd194a1439c383622b9dca5a49da247cd55c02186829f695ebb007ef0535c4757baad057d7bf76dcfe37cb9181b0c290db16d0abc51ff32d03b6a8e56ecd270dac231c81e50c7e0203d22b991291fec650b9904b2539a8a330172843bcff0cf46f06e32f55bec1f5a734e70ec8e4e8883e3c22eab7561d9c76737025352b5c9fa9c76eaacb909d23d0d7d7b6f1094ccec8ba94f149f81946faedb39ac557cc28817c9114a89a6f720d849f90cb23ad202ed4682036b3cb70b6fd5df0225900eaec7a21e39fd433d3200aed4bb4abc3b531393fa462fbc920c918f1938d33ca86e7ca3bbf1d34d74\n\n# tcId = 86\n# ps followed by 0\nmsg = 313233343030\nresult = invalid\nsig = 7d0f3cebb4372569e8f02df9f42222151cc31659df8d5078e9ee8e91030735d27e66da8c87039a27ac28588e8431d7ad1583534e8570318cbb2554c07016bfb02fe59af00576b7908286f4b27e36f768a118c3f3a1ceaeffee03a1b67270c3e489cce5c5f1171e0a8734553403047faff680dbcd70bf0fc1f0f4461bd4e68c6c0978da3490a137ddd8f62bd79c6a1daf70f7a9a3e90056ccd41c62f04915bf128f74dabcc47cba85b0fae47a04da32e17799ca150814d27793816e6a198390c35d1f35abf6816761a5ff0c28b1e60eeed244b1f24934174a1d2c469475f3eb8842eb9f5c6224386994aff9579f26ea7d73c668a113ef7dee8b2bda576135d452\n\n# tcId = 87\n# ps followed by 0xff\nmsg = 313233343030\nresult = invalid\nsig = 53f2db262358c21792eca635806ea1c1ad041d9334e977a25c1de0fc8233ec6f01737adcf1fb4dbedbd0078406ecad921e37c77d4585b5eb5ecc74c07ada1864a3c13acaba9372f852aef55ff2dc42c0aaef74bb656b8e0beccb7b9eae587fdf3b52eb678af1032e60ad12321c9c10c445448df523856ad262208a06b8817ee229df825f080a72d5e1a43f222215824a8ea6d455c80b2563c65be1eaa0455714ae576ae67e46d006934cf0c137b8c9900af9ed716391ce96ec43296e83a5a10390ed91f2e6753ed0254f0290ad899462b3b7af42c3c5f0893863a3b5e6052d3a6dee554746960a07fb6ecdf781e47b96023ba01cfde4c7214611a1be5735e2fd\n\n# tcId = 88\n# shifted salt\nmsg = 313233343030\nresult = invalid\nsig = 11e8938238a20f0e6947015987380dfd88a1661606bd05bbe4298f4746e81e3bbf34aeceba5360f1839ee0d7d7fe3e578cacc2d24b15eefe2064edb1fd04ff9a44c0a600ebf00f64fbb1ead4246e5ffbad0c22441ed073462f26e30b61a0a9142b4f993d1b26fa32e11382da33b9eb5855cef6736bec2f4f5bc6bf82fdf7da62346a4d9696c53e1cfa789667b721f32f7779daf7df85474096a9e9a7291afc76df3a66c7a0b997b41bfb71fedbdb4e65095efe1a81d35b66be55432e0a6e33905475b46a94e05bce7fee84645f500d8ebd7c0282c35f22774e7089262210f83ed485cd2b045acd5d62b4bb53dcbeb2588dc6535518189cb0220a7c9406e454d6\n\n# tcId = 89\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 39a8e947c919ecfad7ee28bb708c1f9e825036374ea0f610bf5531d89b813d506fd00bdc15850b250ac50fc556a676c894fb641dc650999eb6239b91e2c755126bbb9fef5783a5ab834e0ad91c60e720e80e096c091167a2a1dae838a16fe0ebaa8efb3573c89ac5d8e0584b5ec4e2168ef097f937ef0f0d2a2f964a8e6a810dd15b9c27b234d788af3c4f54dc97035657ff19f2835555dbafd02c4ed3c76654fa868babb71534bfe84674eeddbfc2b27a517f666bd03a27d8173bb92826a231cd9a241c171445b416934ebec5f7eea4fb41a61937d9a98f61b2fd1ca8e2be125e85cc8d16d553b114ab72395e86fea52f54edd853e9c5156557e38f621b975a\n\n# tcId = 90\n# bit 7 of masked_db not cleared\nmsg = 313233343030\nresult = invalid\nsig = 9c13d877ac2bd8c02c11e29ffcc0c1046dbc9870177e843c30b499c2bf7fd09daa43469caf2b8c3e955ded95e4d62209f7571bb45593f4cd8b0c7bc9470a8a693837248b5a7854dc8e37e752d949479272642994182061d7af80b0ac6f6e984874c8cdc6a5d7d17dc9e9de5ad12120cdb9f6c0d09c0e11b87b3423e37ba9437a4f76cc1e6124579e5f79832b89710de1968ce46e3e69fa185c0a924e8cb5f996ee5963f6826dd37714de264d75545e8509caf8735330cde7ed4228e5779471827b83757c466022117c45d598f5a4a7fed7be4e1b4d320f894879061a75d1a41efd8dcaf3c61733ed8ca2cc2f83714f8fdbc7a97cd6d6b97ea3d36ebd69890633\n\n# tcId = 91\n# first byte of masked_db changed to 0\nmsg = 313233343030\nresult = invalid\nsig = 00566c95524ad0995eda7d668fa08e8f75bea868b60972d6488cbe8939bbde68fa5206e671f35555f628fa707ce7ba0f468cfa8b9737e0ef64e0e23c901e4965ccaaeefa9b84363a3037cf5f9e044e295fe57f32c1125ca70c639b22732aa4c4b3e5562690bc1d7e7e74dd01c674212dcb63c58fa23333d45e1e4ccffa5d186443cc785c5ece3f2d7a8995e25de6a171cbc960c272c2899f6f87ceadb72eea1be085245669ac08993591e72bb9aff8bc29388b35c99f1ba7477af9d16754894a50d4caea4bc80e2aef2ced27f4a1c88be284bbb40cb8ae279b4e38a4cd8a51a92a279a799b3316c2938e1386043ae7ab1d8605cd310d7239c805a07a19c7b17d\n\n# tcId = 92\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 2b46a0aab5f573e32ffbcb411cd99d2f90aa9b1abbc600b0cda0d824f79020aab47a2494caea20fc93017e77b99eb73a1f8a550b611e2747ad29207772629c2ec40918c07adef1c90c99a15cddb9eac88955b4093a9e743d2420b4647e167bff8ddb07ce197db89d8a7d3f327058a41cc459ed4f6d5d23dfc015479d95e195da37f5b1fc318a3f74a0ac5fe2b9569c7fd99b8eb3ed3967a5eda1d246a3b225548f67ff860202033e7164d4b99dcf95f4232d18a7913f7258a33179133a6fb4ab5a4937b642eacb92908cf79495745abc583524cb0236fbfadd2c7e8b0a6597017912b4737fc01432625a508355869670bef25d32afe6753c38cfd96ec38953fb\n\n# tcId = 93\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 3b65975357ab2a410c2fae7f2f0381e6c40951260451f2eff05f0dc707abd013a996fc10658a6963f462877a808f61ad0362b9f640750b19debf3d59692134e357a49ed3693f50924b7c8a1824ccafcb4b93f7679dd892823cd479895d41fd1c40fb89fb1da19bc1fdc72eb038782f24ba3326428cfb166a475a9fd27f94d1a0ca6fa0e6a0d2c2883db3eeb2c0a59474da36211695fb811b9e8bc7f05ccb1f50d26d71a2dd209b0d269a736610c7dc1f7343a4736fa2b8c27827dfcad49bc4a86822cde1579dfbd646474f11e1a60f5e4ac2f2a3a5421a7baa9dea5d24be03cb6fee771dd808b67f886b37be5a300f6551d7e7636e9997b3255ceed5187ebcc0\n\n# tcId = 94\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 4516c8a39b8544d1c65d96472fea0b2753060330e76e6f90f41ab349953d26ab1b95fd87484535b68c0afcf1542a9b966a9bf98b89a53bb28877b34d168a4ba8201215c55f9e86d30b7159093517682e6e956078947e54e3f3a779da032af7dc6bcab1c0b2a6693fe0eeb9de0d158bcc125293a6f10ccaf1499b6ad912ed5912537e3c3c5f18eb0ab8e701056d7b973b8b61af918858b87152b6c40671bf96735ab1a112972346e771e7cd9482f6f59d320b8798a271cf21779747f964281afa1303142eb3e1841772de825b4b5e68024dea014193c4e1c206bdc6121a8f2d41837be3d13833ed615d5b9df4ac4c86cd25344fe1022df0adabfe2d46f7d9f0d0\n\n# tcId = 95\n# signature is 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 96\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000",
     "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 97\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4\n\n# tcId = 98\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5\n\n# tcId = 99\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 000068caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36\n\n# tcId = 100\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d360000\n\n# tcId = 101\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c\n\n# tcId = 102\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 103\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 1758eb94588e6fc4f50c1be1afcaa41027869f304cad513b1fb12c2f446d63cdc05c4830a7e3e630da7b2da4f7867cc173bf6420f9732277282596de41ded32e21d0cc31441174da8765f57419c7764ea758f55bc17646eb100c435d1ac0eed6fc7ba6de5f832094ee2f479979765e05ac9976788db3c241a9e32a0da864f0019a87646ba623d63f4411af5dee1be9ec488c7e3e1b231479de70b9ac5f78a17b1f4120aece45f26c07e7bb345fdfeb05e14bcaacc614672a465fc523624cb19f66f9c6c3f642b832ca44cb25176d679f0e05606c3fed022cac24c2bf960a406d48818e3eb7ed53b0446032469047dfed95fc18088c92d91d93722c47f88163a8\n\n",
 };
-static const size_t kLen160 = 88303;
+static const size_t kLen176 = 88303;
 
-static const char *kData160[] = {
+static const char *kData176[] = {
     "# Imported from Wycheproof's rsa_pss_3072_sha256_mgf1_32_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001]\n[keyDer = 308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001]\n[keysize = 3072]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203]\n[sLen = 32]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = b520065682633ba54c9b713b2ef19cdc1fcf275ba1744c2350da7307a20971cc30eefa37d1667d23d20001a674f0e00df4f9b9e1d5fe7eb85cc45cab5dd625759de83017995c93d48b126df03aa74ef87daea0c1652dd370ad5d663598a383cac217a208b22c7cf0e448cc7ae0555f892ccb8ded6894cfb0c328cb542be0485d860ca77203081f3b04c6f55c5689b1a66b1c24819a4a7ea55f32e00f61accf4b411bb320a96c990173b63ccd74e7da7df5ceaf33a39a8acb89a845a594b164ec6e22cce940eb06f2d487a8bc4574451878c2bbf57d241f76586e0703bf5f86bee832d05b75fabaed6accadfc1ec2cd6e619dbb29b65d6e6f5e118ad52d82a955d21005ecd63fb382f32bb8e2e1e57220b345cd6422bdd84a91495d0ab5775b08139edee960dab1b4ffd9ea5b27398b58e6e35211c3581501e99bf5e3f17fd79381528d28a4927e28082f45bfa9519f98ea663dc84c50317adf0bd5da98b01459011cec61800534dd5afc5a567c19e4a400f06dee74112083b5322615c144ce3b\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 8e10f23f49011d761946b283d7152e851ee76e5caa1741b0901eea317d8945f2a0368551b3f2b3a6a0d6a939aebded8fea0a96dd1d037be33b1c35ce78dc89693918a99d547a1d892f4047c09fff7a6523acb0cb0cddebcd4a6fdcc309a466ca9580fedf032bf56154f8d79d5c4686abfd2c7abd342b37e5373b59a07fa865b118c44f2c44b851306dc97eaeeb638f14bafbb09c81996beabaaec28c19f06ffd59dbe3080e0124e2386418052735f541d496322c03ebee6e4dcaba24dde9772a9f079973df26e854c255eb48df50c01d49831e54b64d0ff862d03fb4d82ff204d303b537176c50ea56761a83d0aed8ed2deecbbba981c8aacd1300051a864d1efdc897f31383ccd6f181bf976a75e7a7613b60b3cb2a6f7ab8636f672990c13017f2981c11ba36096cbea898f016c581ee859e950bec195cc4e376e134341b2fd3e3d6181ba4d377b2aab6a148c6ea8cca9ee3478297e901856ab18f61c0233c899841e5da125516cf5274dc1b22e2a51c922daeeccfad0f2a8bf84e531bc4f8\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 22915cfa1d7dd30f50b4c0e4cee42c5f0aa1b7a6644f8a11e611b2db042b122af8211ffc1dc220b435d8919cf64d715b54ff8a762f702b365cbdab455509b97d9b310011467d4186647b957e2efa404aed3b84840529bdef7746348385a1c6a2ecdb88d1cc2b40b36c346386739c39d2815938e463a35348426f17d32d633b873d6124d8b49a726743af7c0e56d63394155b63089c63ed8897f8af2a2260d33499afab11c911faa754ced5acdac2de571f39c2768716e4308244a99d1e65da7061d2feb8ec8b4e517bd5e19cac626698479ab2019257cf83ad7b641db2345b38006d63f84b41772b90037778389cc30ed6aba6af212d9326792af746d7bca9211fa344fdc2798a490aed3a2840620c2a85e3d9b9c38f2330072663e16dd26bc414c7d68f6b11d2cd3e0387c1834c5e2262a9e2dc1bf7c0108b4e2052566c7a941ef6b38c8687fd7abe6add2b745c2c2d680ae3e5646ce2e717ef9899c7f3fb1e3088e8c0587d86546f752771819595a7a3d422820ceaa12e3ee671a456dac673\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d558\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 6e471c9342aaa27bddf64b02e8805611a13770b22cc3d24cdfa9a2fc14865f59344c288cf15d4c8785089968a12e9d3e63b8179489568743448f698f316640146322ef3b611fc98396cf4a4757e48ce6701f123fc0bb8df80b63cd2371522f8ed929f7bdb709d424af6eab2eab212b43afe537fec7bbb9dd02e64f116e02ad1214ae931a6fe28a5982029088a27bb95ef2ee46ad212083719327acab5ee51c82d94d5b14f6dffd2242ddf9fbbb2d03f945796a3e35346f2334ca6b4ec5d9ed6f1584688e661951e948cb95fc5cc04e90cad98c861ddff514c60275650ae3003185efe0c04356b07f361f7dc7e17c5de479cbf119c2910aaffa032aaa81ec9eb9f7e1ad21a410ffce2502e4829404d01ae090ef289bc28c9c3f37d3fcae33e1523b3c9b81e301f51d046196fc15c90d58bd35a1fb11fa04621b32cb61e718a434a0aaefcb676cbca888554d1e84d43b108fc1cb123cd2d300da630fb77a3ce29a0f53af32a5ce81c5ad772a199d1180a9e2f090847cd87ddf7b39aeec89a6b492\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 39f7dc9010bf3c200df551499404ca40346e58ce0c56271e2eb7835187ae57a7b9a0688c9b088ad85e128f56c0299c437a1a9a9104f3f51aab7043d5714963e46ace5d8e435fd3e416dd61474e9dcac3ffa6c3f0ebc4ada987c4313ec36f2c43d2dc749e496fbfad639dc811304388990b98cf10ff616a866bf5d98cd5199bb74704ae4ef365424130738b9d81f893a5e2316ee6daea185c170f69ebd2ad455b56676ebda9d0bb0bf4d3357475ed8166a3d2dfe6e093c3a4bc5bc2fc2275e6779d809107b621138fc629a6767d5809c85bf88b46b14a8e4ee9e310db746f4c0a79a3d36f6e305125642dbf823474fb913a9967a6d120e82a79ace48c501fed8dd6edb9634df909fe6775f8f6fc5b79f5881e1f13b7cde37c7c3f97319cd612f8ad2b1ac921079f18213e5facba0b83c17887e69501a6d2eb37661f03590af1a15646165eb785f467cad0c625947e8a8a4a68f8938077d5ef7f1b8b4da0d09ad5874bcb22ccc4ee36b9341b974a51a1d6ca009ded4ace9faa99d924a23421aabb\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = ae8472e987806e5110beae330056ff974abfce7ea9927979cdd14346747414cdce06a9c78eb1846c75dc288d7da531531da49ba7651d3a1f79e3297fe37aa73e075cfe5ac004b166526cba55f914e0d2fb1f12a60a3222dac434fa378c2e7b0ea9c2cb5e22cc343ea624ad6cf5545a61364cd67d6dc23d22e4888a253e940ff0e0ce0207c1feedccdfa10f50d2363bdbdf10893e3967d7555fba157f9a450d6bbe63ff31777bdfd402afa72c3a2181e5cc025443cec30d253653db7e82eb7dd488e6491fd25001723eae2e3106c7b50c2b73c142a4a31ec4",
     "3edc9ec9011383c99a095b36258a0a77aac2af19b26af8a166b130f7f57f03a0e8007d5ac0eea9ecbe14fb7885538a22c13de5771bfdf523fef9c9b5f52ebc2af7902a0baf2a33923b0d0622b8fd5c938214aea4b9e7f0a647c5520c3a94a29737b95cc623f20bba8eaa3e9db60116fe1760d9b7ac1841e7586aec9708212a5bef2ff67c74462883062e052ab9fd90ffca0f0a6166b71a93bd289a1d4acd2d6ce72ae0b91cdde72e\n\n# tcId = 8\nmsg = 343236343739373234\nresult = valid\nsig = 5ce99063bb6c6bf8e46772e8701b63abb2feb5f88c5b76b76c00c719402ccb399d6c6d8c67ed5b6fb0f1dfeb8f8dcc5bae03ad57c1b0f53033dd2503b9604fdc40eba51e4b03c91a8d12b1a3b929b1ff1e8e79cb58d788114d53f7e07d87a885f6dd4d26560583986f7a84dc466ba981db06beddb1fa80b0a444b9a56c82f98a927977da9fa1ca83aebaf2c43692cef61b12995d8dd0f3bd6bf061025ddd34af3e0257203390a80765ef706acf7df6f43210a7928673d260f2f3c30a9bba9b08735dd9aa3ff2fc27a2ee9e130c88ba367c3d1428f173ea08e273886bc153c11e24b05cdbf9b00573b013170417fd96b0106f72c073f1216ba872eccc9f56ff9e3e08bfde64041d996b117a114b723cd97f70e07068ece643f58d5ee5cadca7e24a18b0a66ab724fb653a01c5749d51d4bf5408d2d2008b30eb3dc20b0e14510c06402f789276b6237802d608ab49378001ed6f3604abca038e3c7e057d95e85c9e668f397bcce18765132142d6b0f118c511e57defcb316fe41dec06b988d911\n\n# tcId = 9\nmsg = 37313338363834383931\nresult = valid\nsig = a7e0ad7ec64a600e37b70dcaba9036bb3ea95508c961668c4e051c8f3faa454496ce6c009ae9cfeaa2c194c5c9278e46b75bab40c52f077a4fea175b2679121d30b706139cde7ab571c89f4d19abe07c67c70afd3e4c2c05d60c92bb2a639ba389826088899605f1707ecacd88e42491debc78295b44f4e09791f9d541823ad5c48952bd3151ef98ace7e251d12ebcc9370bc205a1688c9a5e9190cd082da1ae94f22eb2b0b46b2a5eb2273b0b324215de187d685471a07f673d43e58f36c1e0f074765dc59c1ebce449229361d07522c7f03f27eda57ab8bc89ac683d27ff4f95a328892507952f14d9e3d8643d805c327eef8bdf13ab7e6634a103fe92cbe9e7b00f9bdf8efa740866c044735799d59245aafb8d04e8bd55b66fea31c9fce4cedd4abe68444fc8a6dd550c3c8f1d6597bde001fb977b7802e0263b7319ad7a6c1c4a6c558774641b204b6d3eb2a2aeedbf4a38de6584031102a1958fab6fbea9976793bd1ea6c9aeaafe81515b954c7615f8c45538f40a22adf0ce6f2c977d\n\n# tcId = 10\nmsg = 3130333539333331363638\nresult = valid\nsig = 6c60107dd182d5cbf4550e7a6e3a652f731503d8fafba3a7aa52e7ac93d4de4e03d911e058ade448285bb9c3452b60897c099fd4ba22ff4194eef1a3fcc3250cb9ae270c33ee767b2b4f18852612e27c4ab31d8ea6ccbf122a357a6d6e527191a36e0aa2aa925f68e158c8d5decfbf8484d16c2ce906826dc4773d59fd1a4032c2f576a1ae8374a13cc24abe15ac1403452ac7cd8a643dfe18c911ae34f773520fa94472c596dbd6f5b93227951ebbcbacf60b18e5a60330eba9bce0d8a732cfc27c7c0b9e22070670a165846d9d7e9b24dc6ee9759347f5c6320b63789d5ccbe9566d9f3c534e152f2686631a41aa85801a31a7f31cabf959cdc93755a3acdfcf0ddbbc5298e91fbbb2675565912e5fd95cd59b5744833222247aaaa5a5868da4d1d1af590b8633dfe6105e0a6abded2497ac7e46650432cbf0b784b9447770b20f75b2618fb7e6cc6fc5cadb022980f78943fa9f784e5f0c8fb5192239dbd3293a38e6dade27a07e08b54597029f92a8b29b700f842fda55aeb3e0dda79405\n\n# tcId = 11\nmsg = 33393439343031323135\nresult = valid\nsig = 2264d276cce22aec8d109ced7a048ea44d627aee577f1117998316af911e98139085bc92f120827b304c4ca519743a33f7be05d8a49a28cd716ca65f6b976513b33a440b6e8ec5daeb85d6a5926dc5015a2d24d94ff1f87a073867bea137a7217254b9bd040273664c58d61e618ace6bc942c446401c721565f74fad5bf31475093752e3a67fb32231ec8d26649594f32c5d453f0baae51b20dcc24f0e5e82eee71d85aa77f33ab01cb588420cf672461c490db52dc2fdcc7a22ccb2b92fe8de0e3f8110c93e5890076db8292b76f6fe80ecf3120b4f3824f77e538551ecd435922c7d433f0467b445026d0371a49a73fb2ee900c094fcb8ecc4c01b330dde0561fcde6bf2dfb6d26f3c3d9b897342d8079e29226828a39d8fec96b53e060a771fee75b482b2e0e262069316bd50e8e210078ce56476f70f149bfb356fe1e490ea642ce85a8664e50d0b3f350806d9de3926c8b2d417facd926741022fafa2f7b10781397cf012697442ea742c11f23a5b5ef5fd10369207cca693fc8af57d22\n\n# tcId = 12\nmsg = 31333434323933303739\nresult = valid\nsig = 677dd6918bf4c96934e329a114002460d67d1e8f729eea9d2e8bae78f4442f1a480ff1e5d20c1bd81e61e5f92e5e42881cb1fc22bb7da3a4d21060bb23bb17c234a85c76f7591fb54ce0ef70ee7556905eb670830b9d10905d100f0c255b944689f23e1313b0448777c52ba80b767e07108818aa5131f8b75c84fd2d7b4035e0df9a213afa8cb913482ae0af76a997aaa0c8cb63975bf9c006d89fe4ea6ef035cdb4137103585b9d05150b086d7f329b70efcb428ddf76ca36d44af742326aa05039382af67216c12f7eb2dcf01595f3b78235341be0bf7ea30f6294239c7a4b1ead8f98bac805e88caeb482b13c5bc552329a47f1e26233cd24a3b4bfb6be6d9e3ae8e58f06c95b513ccd5c61685ad0aef627bebab0b72bca3bc374f49645e403bbeaa255b501dce3f1f46f9d74d1aac2f6ec5eedc5440e3dd9f264bcb1d98b855d1cc788d796919d014ae215dfe2361a1d13aa55a7163f4164cff38c5f62c00f59eb20efec26e0fcf66d37f12c7a9d23dde68f25620df1a4d5e5e55ca94634\n\n# tcId = 13\nmsg = 33373036323131373132\nresult = valid\nsig = ad825df96215ebac22f37e5948fdb2281bb7ca69fbd9ed6d3f4d2fb21cc6f9d07cf7779a264dd427a863f0cc36a812f125d6ed9bccf6c233ae8958299cfe645b17331131c32459377524326f2e9eb43124e2e2fb7a025e0ec3de6551b7ec0aff5d1b4c4c03e454efcd250a7c9711f21e71f6e347b5e7400cef50eed93426b43cd11cf55c34a9d6d1d54314b1f0869febf3b92b8db421c4fa000e98ab0f891120d7c0a91bf50e307fb2cafa596c800a05e6f42c577a02aa2169cdbebca14c41d10ee1bd415785d7594347f46e700f62bcaa5cd728025247f39c40edc0977015604e196fa30b1a49d84132469d1a870a57d272c98ed93d8645a7bb92a4476057bf2b134ca20e45da22cca2961fd52d65f840b07a87aa4ad104af67d7bbc53ea95016883e3ee087f39582b13e274df32aa419eabe12a9eeb08868425c0a1ad06798d0f7da987340313cd4254a4140a62f3bb1b76bf57a2c0712ef2105f4de0819f6c724e0a2d92f87683a2734bedb4fcecc75ff26291ad862fc3397a9f02e6eddf4\n\n# tcId = 14\nmsg = 333433363838373132\nresult = valid\nsig = b3c301918f5d1becd6c88ef04f908509e9b62acd207cb0c03e968b56d4237b4a23cead6fa5a72ea6472af47ef3854766376bedaf67c14a7913d48a74aa6521f8ac814f01e3bcb073e3b85f315bf51468c28444231402a77cbebd0cbfc98b06fe925f5d59b4353c21abb324696bd5d402e7cc5435bccd8eec3eeb8e7e4b5d4f8f719adc00eae9180cb3cce9dd89231b637651a76d87c0311d0f9de0f7c9bd7f6485d7d600bbf105e1fc6d3744e83528fe761c2ab0fa0cd5c386d2ee44b0967ce2dac3abf1c723868569f43ae09f1a5ee32245b11569fb2dfff08f6f40c0cf45d2bc7fc524a82779328f850ffaedcd9de27db5e1bd372a76fb60fbbcf88a14a2d820647f660a894f5420c7246d9d9401ad56d577b56907d9fd3b69e35faa40000207d704087e3a7011cc343cc94f99ba653da6451485a9fc17bbad2688b511ee68cd90288e4f5e83ab742a54be006b51fd75e9ea3ad09ef7112f793b61d5470aa16255db34a8abd5963b53a940c890ce89f27b8f7e535489e965f33a4b9798c301\n\n# tcId = 15\nmsg = 31333531353330333730\nresult = valid\nsig = 602883fa2f9a6ca35437d377fffa5cf5a5643898763960c7722d5a5b808fdfb4a09a0cd3bbc8c5d2fc8a603229a5de18866aa0c5d88c2272784784c883918fcbf47ac62f5e7523d65d6ab486c68ca245199e1acad7f087b4e822669105f4f45a50c1a43722fbac7a9b88ef7bcbe5796ac9601a09d3fd6201c77ee09f591a9d37f48b3e93fb6ee5d9683d3ef4d581fb2ad9e5cb2896bacbd078952f9dd04540fbeeecf6d8d9fa45e791ccf3027130d1f1ec551fb35ebba6ff329c7d31c5bedd65303d56b58f826f38917b3f79d82b442f4668ad479b7e108e2e59d88640c1da8ecdf719156ddcad93d568d9593dfc7bf0bda2519454cd2b1dafefd556091a2a13ff80c75bbe9ddb04b1e55f7edccb8a0832ef03079564cc367cf5b696be4e193001d8c3bc5124227359c7616381a473b07f31d6494c062b2a9151420b828b830f250e66ec570e38bc44e26bb83d45c7f794a9460b4b6d746c888d084a754ac7d75ab1bff232be49dd1fb73efd76fbda26e6411b3b1de8671518f937b8ce3ba8c0\n\n# tcId = 16\nmsg = 36353533323033313236\nresult = valid\nsig = b259676e6b9b49edc04cf3f6b06267a6af924d278c21f5994c2190d0cb667d641291361a8bfaee8236360a4dffbd5ec4f1f8d9f85b54c1bbe3c9dc35332443c2509f0ad7d5ec42571d755af814cc0ef48e514dc5342ca7653d535789c8c21fee5e547ac3c247c9be6b792199db48a17299b5f9d3bb9881ca95751132fac76d776ad02872279bd77dcb43b0cae7673e40907c1bc321e14637f224481f58b90f875cdc08c49515b4be482147fcf2e62126fe4c0310c0677eb7eccd9352a9cc0902b54e4b3454f3ffd69666d16469be958a54aad1d2a58eb561b4b222a4ca5edcb5612d03b8bd2f7f26302b51567b83fe1d59eeed36bd2ef128cf476ccbabe4eb55d8c4ec91a0bda8445972fb3d74a4bcee2ecf5e90f5bc19d4e9908e7aa284cdbc37d22ff4ea70479e8e2a9d2bf0a6f02b3a2d2643a34d7d4f93782df0607c806177f61963b60c08e4154a074e92b26c4f2c678c9da7cd9d16307c7309559a3935a8eff9593b5454a1cd60c388c995df971075c5397feb77f36ed8b9987b8ef3db\n\n# tcId = 17\nmsg = 31353634333436363033\nresult = valid\nsig = 57765fb30e12f08143d72d7a4232c91583d60afbd8dfe01c3b50d861140d3c5bd0a17c3a51dfad96d8ce0716348dc6f62c12c16bab5401a1fa90950e96801064dab2537a4cd0b5227708618ed2e34e2eab8a557a316a5a7c42b6b297cfa646cf8a90af59730fe5d34df9a2d4a9bb0d8bb1d8e5decffdda6f50863bde347c17ed88e232c4d3235b00ce5db088e514f3490f8d459eba993d31f99bb24a097c0e322454e6c6",
     "8e6c9cb0042a8fe1a5897458d097ee68e5c79163f05ee0817499a98f2af038aaf02c488fad86ee0c157fbd1cfb91a17bc00971326d15e1c02ab440c46b07c807dad0822e2dce9505ea75dcea6ba134b58ee9eb79bb70c2045c1a4e6206ee9e12909b1c3a7a386cde5fb1965101159dd34c586170491b3b8cca3a9b4f1d0b7438aede0efb1cdc9e7712abe0675ea9ee87e2cd8200cb08bbb85a3f87695c3147092e153c292e5a32475bc4800fa2e3d037070bc6f130e5234f5cd74c9109d2cca14eb83bf61747712b4b9c90933d2c25d876ba1bf7a8e601b472c154c5\n\n# tcId = 18\nmsg = 34343239353339313137\nresult = valid\nsig = 27c677b2b0b546f23d5c3ceaed4007cfff9fc1e0843de43e7ddee8ba32274954d79d9fad43c10e890266123f247abd2ca351a15b196a340b7753d4cd3756a091271a25fbf7834b05ee9c5db4a8a355d5746ff9b0ff61061ac4670bfc9468a4101917ca61bf6da1b029872bc3fe14a306d4d43794deb2a1ae0a4aa5f432e9f33e536f39c249fc3ffc294a466e7bd7b3d35e7ce5f15a3564df9351770fe66b1312e69437a028d07fe31ab3644fa6d16d9e377fc3b8820f79d220b03012add369c630c7c01c123dfe1be97d8d71d491dc38e7781635139636213eda7655eb2ab9bf8c44af43d3c098667c6887be8e7f29cc72dbbbfd5c43ece1a0bdfbd01aaaad107700ed7d9468138638afe7c7ec64e66738e188400e8a71f89526f8170fb56a200f69dc9e4664fc24f40c80e117f3666f91ccbaf8dfae5fa145c9a94ad64219643a66c93a682a365bf082661a00bc8b0a663a6f2efbdae29744c735937c0f0d7f6faf7eacd068cd02c016cd16741d49170bc40e2fe3565cf3866db6fc1d528959\n\n# tcId = 19\nmsg = 3130393533323631333531\nresult = valid\nsig = 9849c3250c03095ecc9ad404f9ee412c4ee797ef0a0f0e806247225fe03b3ca5381157476b44bb8909d1cfb24504010873333dc969f035e08d552c2b9e2da82159619a75aaee04f20c5359450b6d85dbdc98e3174010395bba07cf3e64cd1ee44f81754a64cab4efe7c019e05ba8b3577333fa692858c3dadcb0f7047cdb1d2bf75b34493988ad84794517f18c934d95a7ed5ffe75aa5b3b5608462f18bf5c656e6f1e626d0e2ae4ab7c69da07a2616c515b88fe33feba7cab21eb9869ffa01cde1cf3b318e4b7c7089ec2d3748f93ce3ebcad0d75bc2e5f9bd20f10d6d946ee112be25dd97793f7295cf6862ec116f306d5328759c304329178a50a01ee76b5c5352ae160e0e7116f6e9640d7be77287c3910c929bc3a2a5ce1cbe08e48d5a27a11062d74442c5ec8a92be9bd8aa82db17bec86b2e141500fc5edaad589bcc0a0bc152a69857420bd5f6483aa3db9d1fa4ce7f6a1e20964b1620e8a3a13839311a61031e31bdbbd3e1350d1773ed132355eaa3adc8a292437293c26fc428844\n\n# tcId = 20\nmsg = 35393837333530303431\nresult = valid\nsig = 9d81ba9fff8a9e27c1af56efb4b48088785b9677397843f335f038b46e863045c5c48fc689ec046f87d7c2a1e22308558181a1dd95711088ba84db74ebe33398f77b760c693371a403d8988e3e90d025aede1e7b9d428ee4ce4502a307bd151cdec1ae148c6e0d36d50d3c19eb1266714b0111ace612dd8abdaef969c32cf3bae1bdd4b14cd53b3ffbe59ca75d279be3a933eb3496e0cc5d9b639a5899accc4c91f820cfcc4609630cd47f0f321a349f049cfeb5a74dd1dca0f898a36491cc3752c2a8c30d39c24f9cbfa21cfca15600e4ae161a9834f839878bbe66e201b8c8aa8a430913e157c3c7d74bcd901de43108d6049805bc85ac0b29869184fd587fe46d47eb740a86009940240480d3ba700a7130207637a438746084011f9039e52c1f6aa5c99d7093d14e3b4da4148f825a222fb8b1c35e5946d02ced55443cf0736f72011b129a40632caaefb78c44fcfc31fb2449f2d46c7aa53966b7966eba8d143b3220045991f66b1efe10f696d5d568ea87598ab5fd6655db506bee18be\n\n# tcId = 21\nmsg = 33343633303036383738\nresult = valid\nsig = 8f0c4086ce839242b6696e7e0fe63be07b1da1b77447520172fcccb41f341ba944927acc17cf1ca0686692130be5bfde236385628b0e99bd0b3ac5fcf2b64bb6fd0c8ca734febbd00dcc9b99887dbd4a8c5f7bc97031a7e18f6143d561b29ef3e25449559c5563a9169592efa534fb9b75cacb7ca67b3a8ff76f5642dfbffa93e4ba7e51e8a5919afdbb1c3ec91c9cba076902383614b2b1906e6192b451239870afb863e158f8ec61127f8a7a9442610c1ca47e5a9c8a0f460548320727ef1633cf9092cee65e373ef16322faddcdb4f671d91305ae8b3e4dc9ec65f5069667d462f429b025ee6f05cc38f8ea53f4cf0d81b4ea90f7e078e3b8c804ad2cc7525253fa81ebf50e8e62bd6841f28727214d183665a108bcf8e6f99b284a86b3f6adb5f5df71acda60cb6864970cc22769c1b1ec94abd1fbdd1c21edf2c375bb167ef66538dedde6b6b3c7f8634443ff163482250f1c8e97748cbe8ba0370662b1a10fb58b1ab595e228af813d3fbb852e9b8014a98afd6d96b2e27c0eb7688595\n\n# tcId = 22\nmsg = 39383137333230323837\nresult = valid\nsig = 2b1f093b09ddb27d5c25518781409db471c83e84e50332c47a183a657ce60fd44ad9a786b4d6ae9506e591a449dc0c46f65d9de5165079bf5bb776b70eeb826e3c58dd7a916e37d83b7ea6aef7a12f1aae1462844b0bab4acd4a5c9cffeec5c52b0a6d36ebb34facdef9c3dfc46d8a115d3835cea32775434e78dcdbc3e5444c82c0fa23f52fcaab3b8dec372ef7b19a0b391ffa8110e77fbfb6fea8a8def46a5f6ce20566af9e0918404df4446d6a69300eeadac1b0f5b81625f44cb9abb1876572815c2363e5d36691e070c19baf8c654e6440572739c468ab7589d262d3992fcdb2947d6f18e4be55572437e955d7f8b60ff4b1f1dc9d0c5e6bdedf913225fc65b0acbe8b6baede362cb615e86fa2335eb818878d3dd7bf689dd448205cdf14f69ca5925df66cf421da220035bebe9a78ec5fda4c0e4f49a456f9fefc791fa9109eaacb521e27aee95c120f4f9cde093b7a802dac80810b9d4d5793416672b58ca19273284a581ade84fd6d9bfa31a3b5254bece875a56fb3ad6451b1a661\n\n# tcId = 23\nmsg = 33323232303431303436\nresult = valid\nsig = 2b04d224788e2e94204486c111c0b07540b8e7324a8d57257841ecdb77d6ac906ac795dda72d51b054b5ce6c5232e061a18d67d64c7c1b1ef1b601cce28b84ed3645afc616eed7d1ed7c21fa348a418fc7417449bd997340e99c672a5b83dc43003fff82771a30b7b666fee40e078dfbc7af969d1aadec237ccde38959a0b5852ba0aeb15d8864ac41dacad460e9e69cea0374cb90fe2df0468011409cbbec5085f31684142100c13521742a47af6962e7a38d682f591c8b63fe3f629618afa3902590904f3c99bbd3f2681f42196714cb6e59a6422262b5d6c8220f6564cf35b3873e356015ae3dc6fbd243c29a8b4043a367a49a0dd44b921d98005a7bb0478371710c4a867a0022742449d594a321727776d906e636c4f1c798a65df8184d7c8261413b16a4544c37a8bfd4a3fcc4dd0cca3c3049c0446dc0e27e334c70f66787d8bfce5bd9dc2cc5811ad92518e679e8d219926321b0e7c77d4743db318ac1e47f6a5dbf3f6c53831a2ec8829a07125f5afca4f9f27a968fe5d269d5d427\n\n# tcId = 24\nmsg = 36363636333037313034\nresult = valid\nsig = 3ed79e7805fd64fffe1863e6e9233a502bdf1e35622799a3fd4da76a23a80e3e6fcab61e5c3f621474e91b90a43b36ede27a8627460d04a74677ae0994e949b7b93e01868c5413af61dcb5a9290f921fdc24073e5c7a85ce910016c2872ea410c239af0a33730ed89579f8d1f0743ebec1e55600fea2a3a98e49ac1c5ae12e3c27c32df9ea5fefeb5c4d004cedbcdd30cbfc00fc21b4aa5b172e87d34920c6dd31d9c80db40cadcac6341634ecf8c28fdb3cbae6c236a71322b81abb9137baaa83f65826f1d66e511f727935e01f16cc70c5ab78451f2fc199c02051789c3683bc573190adecfc041405c9a3aa8a6e36b5b4f016589d214da8bbb2e7456b50599ece0d8b61f106955cdd38eb737db4fd52783d60676af30c0d58bcb44655210d2d53f1d7001c925f74754041e94b9251d950784bbde135ef9108ffaf59170fe76d072011ad7fd1cf1ae2763140376be701a5210b29faef9e2501cb3e2769955230bceff7ca53afce8109b7cdd3812f412482f8157d55acdeadea7d9a3b314365\n\n# tcId = 25\nmsg = 31303335393531383938\nresult = valid\nsig = 072389935994033eb7a1bd07c3ddeb07f64589180bb5a0445f7c36412de2021cf7715254528c7ba95605045d2195499e095beea826d0f86da9386078b83a64c4e3dabd43415f68a1b4f08381ed290182727102e875bdc2854a28a725a8b9934dea06a8799c46463a21a9949f8bc19f87b5c0eabebd25200c1aea8eb8ae35be9b153ae54e11f348be421127b4bfa8982cb7db0a122a7b68c0f4496766c9250252c75ffc317e6c2a819edf70609a8a5935fc8e06554b84f31a5a2e1ca855f96c86acc12459cfe92b613573af365502365a3a3f7cd047ff3a227fc09c5494036d39c7887bf1f11dae79f83c0d4fe7cfa02c8e11561f351f86b691a14af945353284f9c7c0ea73d5389049ca0195cb103fa81f45ca01a17c7a857a142223f67c8551303478cf791f0f638e02e60c7f9452f848ebf0b6d6d8d0059bf8a2d513221c385ce075e8abe3ae0a7df9e65090ca2785286b245cf5ce734e4dd2a25774583a4aec4fc1ced402f25c2353bde80c2ef3eedcb5b761a7f2b87c201f3d5f9c08d3a5\n\n# tcId = 26\nmsg = 31383436353937313935\nresult = valid\nsig = 9c43688f7ccc4286e104c653c87979abfb36869a82ff4bc2c6cbeb4ddcd4c51b833367ac00098a84ceef062af0a0c0dec46b54d726f37df117762f83872611aa495a88e69fe0e31e58cee91e3b70987ff17f703a39a7af95ee4121b5bc092bb4a1306435d094a93153ee22dc50d4d4845c60aa065aa03ca6f327ddb3c870ac693b5679ab3390e6782dac49b76f71a0dd6354240184f8dd9400dd84bc2959234a3c9aea08b4ce781d38405eead754b8f3cf4c5bdd0cbf3a15017ef4bb5813bc9bd557fe288cbe32e6f6659ddcb01ee10a48a9f9d33cb5e57164fa77784c89b6e9a55ba65999f7cd61170d826f89e3cbae123ddebe1d2bcf2dac72a798ee9d2a47e80f1e73ad28c6516b271012733e3d8c3db695429d0d67302e5333f1afabe6c36cabac97c4f302e28b3a0821db915b10c1e5bedb64bc5b88d99b7fbd32d3af00b06201c64fa66f38fcf41903a7ef1df4265c0e120d1accb631c43b7b8fd49f8f77e228b550656ff7caeb79378dc3b868ba63d8e97b832ba18224d08cc87e67cf\n\n# tcId = 27\nmsg = 33313336303436313839\nresult = valid\nsig = 807f9a9f0fe0f04c59cdb1f87be60f510dfef3afbf5fc8d13aa735778a4c8823e82804650a837afac849e78c8d1fd81b364e98589da3f2092bae5f7c041ec0c399b994cfa89bc3c301ec3980f7bfc789a7838d212866a500763b5d29094f112ad572b2a825f19510869c5c6e67",
@@ -3976,9 +4075,9 @@
     "714c5d78ca53d36728919a7c4e7069ce97bf215da1d02cf14068c16100f8f78baba2d19abd306e\n\n# tcId = 86\n# ps followed by 0\nmsg = 313233343030\nresult = invalid\nsig = 8574a80f36973bf6b986c7b81bc6d289b118caafffc31d2c99d2dccc1e6611d598dda3fd7c22cf10c7729fa84a87e3f19ff4bf11a96018694b7d829bc003009eb104e8955e8a8717f2fa89220281fed0878b9febf77e5b81e93515a8541d7a4b8a4c008a298d317e7b82c826b5d67bf04d459a5d5fd7f69389dfbb25146c4805cab1aadd009d7b00956ba93f6d02f5266d8b06e28b346b06f1c3501cef04a1c607d7f85ee037178e6f2b0dde307eb6f5f88229541cb3d37e495cb5997264a0c1342713e8548e318681a783381dec9d6524f5c80c437b997f2fb95c80ca7158d0ebd531b4c9bafb19ad9ea0542217c1ad965ee6f1afa5a48becbf65b380f1946dcc85fbcd82fb90011e650dd1e507dd19037ec1f2ac98a87c25a6f588aa6b6f93d35b83c1e8e09152470dae2af8afc1fb2146cd426fe8d3cae5a80c1a63c7fc42825226bec26d57fb62bd048fcd921b8be7aa8d024926fe3cf5c5e3e7f5b2f50b33dea547389e40fd67a8523cd5facb29e97583f26a34f1ed880869800a4b35d6\n\n# tcId = 87\n# ps followed by 0xff\nmsg = 313233343030\nresult = invalid\nsig = 7857b1fe06fcc417c07766a9892ae30eaca65df7474575a70d8e286fc22e3092dcd23446b101cf27951eeb2cf879d320b2bd12f45b79c10018178532d8fc4d708583adb4d7d7469cd5362c074c519106c761228557d4280dadd907b27675e318033ad32ea71e001c3e7f68f6dc07509396a61db29a9ad376f406ff35aeaebf8c6fd0bf7df4bb721c91dfdffa933f37db0bee5d4f7d34f3df2a3a0f383e443647838d7c02ca87d9d79814ee9d5b2860fdfea5577702dbc829610ee1eb13f6e6f0636f39c5ec537c0695bca4971dcab6907e907650b92b96d5d64c6de52c4d986d458f0195345b1e84fbeaa483e3c926167a0d1a977024aef2474c31752515b55021048d2fc23ecc5ec5126c57b18a1656ed49aa90e0cb51e77e56507d7fc60b1f761354423b110d44c67664781e5caecb5da5475b01ab2356993378491c2ce4fbc41badf110c33bd0b78cd19540d8aaf27bc9f3450ce7579c87ee40a454133093ad89b29b99b4b15c21f072bd2f5c991e6a98a23fefc06121ba81540cad7e2a34\n\n# tcId = 88\n# shifted salt\nmsg = 313233343030\nresult = invalid\nsig = 9393a9989ba865a8be0fee265ee6b5b3cb9380019e3c4377521a729a968dee0374b547e94e6b12d860bdfd5197787d35208ae3e8d6a689d031072f6b993b7a8900a278fbf1c07dadcba6b4074375c666e035c2f12d158f626277d7d4b781c8b6bd71a97f575f08c4520b2d66588756b9fc8603a346cec73eba4e8350d7570e923cf84c1b33ad7bdd507d87c3ddf01084703f47d423a5abacb7a6caf5bf7ac4c61cfc91ba9483e7b3cbf9a094aae25b17468fb3a3b6a42d23225bd4859d2279037de2ff446eb441de7060a675b61b3e591a4f854265ffe937bcf575ea85b84046af568a298902774ad9a888847f3d20496d8c570da907686e3441998857e3927feebbf5540d734fc7093263b0efdc33f32f93b936d8f81b920745c2c854266059c92120435b3f41d7a3a5a7d2c3571a15db2136362f736e099e893785876f0ff0b51d3006417235129ba4480c4164329f1f9c6aaf48c93411e388f00cd8b6b125f4f1d3fbf21ee7ad4355a416101cd857f6ae91958aa88b31134a7b6906aa184d\n\n# tcId = 89\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = b77b9c5862c9fd0f4e4d72fb7bcb23b2a5d2124f13aa7001275451a10148993a3e846e0b29157aa3a1a8ae643e2ee84a459b033201692697eff53b3606e85c6649d76c8288899499f2751918879a034d616543c0b7cfb215744b8dd03e50ce4eeda2891ddb8ca9c568ccf98b3128be25e191a4462f6458c718b33e5f519e3de152b0ec691f2f5b8f3cc150ce37814095001cd60b3dc6e694a3df5aab7a0c1b2dc152c26901294b01cba43b74e4e28d14a9a614d0198c30fe578831c8d1b51b1db0dc34f6c47de0d38d20efd1afc8d385e6bffeae43280f62a5f2715af79af64f04d126e1dd36067bb44d01ebc78769766bd4332a43dba1b124a4cbed381ccb43952ee4cc19201f05558c11f51ab5e76b76b01fcd036a949ec9e4d7153fb25a1aafdc8e0f1754bb59ffecb9a6fd9cb05d527661bc013cb73cec4ad1ab046e1e94b6d518604c7ce7bae1dd1319b612cde529a6ae588c4c6a6a7669e82e141ba6352e4552fdf05d9d1e3fa217ac5b38629d81ed749629ec53f3b30f29df883fa68e\n\n# tcId = 90\n# bit 7 of masked_db not cleared\nmsg = 313233343030\nresult = invalid\nsig = 6ae7425610f6d9b6cf5a358bdff3bdd00802d55cdaba2201794738b900489dfeb11d921d87449ef9d1e5b0deae4bdb26cc13c9916a767cde8e0ef67de6f8042e1d5f600bf707f65380f971222d37088edaafa4909ed566694601e25bec8c3128dd61e664688b5ce2ed2f626a5b618bb10d12cc78ebbb0f3cd6883b6476fe4f89008d9e8feb7e835fa873f2d6d9973412abcf12d2646723b1a5ab4e3b206d49ab6f47789010cf902adf720a02c7677847925487634f81e163819f286da4d42437e66ead9278a088d9a2628aec137be60eac2eb30306e598b9459f0ee1c79dc132248f013f15fb80ba713703b66848612d8f4e5d6bc444e166998f3107b459efc73ebe1bdc0b98e4d57bb960d6db0540f68b96212da6ffb05bac7ace76db7b3bb69188715c091f14354fbb8a02cf2b2d77e7f2e8db505e93603bbfff2f33ba54be38630dba291befeca45c76c67f344b9daf7a7b0712b5a49e7b6af29734516570cac32d02074a74cc0e49797508e1aff2af9f20a7163440fd962bbcc5269d8f13\n\n# tcId = 91\n# first byte of masked_db changed to 0\nmsg = 313233343030\nresult = invalid\nsig = b9bde8fc005ab0b6b0317aadbef7d6e8abb69391bd7ea43fba5a49ffec02979f89d0a9efeacfccabae271c998ad7fbff4442367c07e49a892b9632bf4f30de3e95583875f3069fd3299a30bc21e74526cc51cb10dafe22b06d3a412a6509daa83d337e18c5dee6591a11262e008c3b562a18a9ada3169267eaa849b16a377b195ca6f83df0d2c2945a3d3fc2b872bc2ba965ef4186ad1e7ea5b56fb689fada3f377e0897e5cf86906dd2d894848a6f3d64d96a5523fd74d2e8418809fcefe5b9bf12f5ae7189e2aad268e835b5a701073e26be131c9dac06203142d93c95af3d00acec603aae2a24bff3d5481c7e71be5f63a1c47eef680a00991008ca0047c7bef7812c9b823a64e6cb40d0fb4472b702bf4f1c9483f835812eb3f70808e3dec7ab2ce2d8cf1c0dede8521780513140f10d84727d4f14ae06f65276feba1857a7e879e9c4f59c80760b117e1c4083e342018da1c42adc6c5255404adaf8460d122d3c670aa29b58c087d118643eace86667e6bad6c07f078f9cdb8618b48e92\n\n# tcId = 92\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 872f410815926494669ff81dc7114e096f007790f6a4ae3a946b64984eb28bf28351616cc82ed34172f1d1d0a8918f87d64258328db63b72127fbd26320a21c114a7f0b6c88ef717d949f57a28e66244b1fbaaa942d3ab2245ac76f0cc4bafcc119a64f7d167e3e2a64dc9a004464b28bfdcac00a24ed7e3689ca1ed23480c1a0625601c4e7f1e374b54c1c1fbed91e0967b40a3920210b84619c23217c2a6a39734320607abee432c7ad2bb0a8b735400bf775256a61324d4c4ee743ffe99a7bcd13a27b0fa33c0dfbe0cf9663116997573a59204c62aa497e98a698b5dd19314de9ef95cb8bdad0e07b722eb6795f6ea8098b7b092f7bdf73aa459dd85843b310d71e0400470ac14db383940519c060d111f0b80896083b6fb305ee6d9d7879d177f7cfd85c913d226fd6c75f38519d7e8f6d32bce50e85901fe6bdfc74997862a3b809e5ed5793013cd19af9efca616a9ac3e346136142374f58ca823b6a6b2870bfec41207b0a8f58d72c119e319a3934cbd40451f0a1e26b447a5687b9a\n\n# tcId = 93\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 5e0a2f627d11c2f5c2a61cec6b9ab6ea6f2620085e52ab1d162365a2c7040178b3e6222503efdbc66eff0cb892be95abee6ae02af0a29436de4ecd2ff63eb7e082d51ab31d358309747ce61e30df4ab3382341b88eb2da84406ae20fb3bf9a968cf5ccc871be02f6cd9f2a89ffc6f3a69a589526e8a4f1a8c049286ffca8359e81cb3173a2d2e2cc76a4829edebdd3dbda327a92dd35202b597bdf077d7ac2924f8cfb29a85dc25dfd2ab6e770cc80120a7bd594e020392e58acca9d7356773e58aacfabd66c2d9a888379b73868d07e3d14af1dadc1843f2a6c8e14c93b3b29134169c5ae3b293ee6f6a475f20c7c159258a8cf1a1cede602afa9fe7c61a3218c34024a87bdf4a64ef12c78a11a50bc1521836bc4d84eba90ab1db1b17ef0e6e95d7c9de5d6b84e11dd5422a869ecc7f90f952794f6093df89fb664aae86669c63bd46de5972388d81908fe56c6bd029e393047c52924a97aa55c07d482f98b784e6d39cbc280330a34ac4a8a72733235e66234903a4505228a3fc8e1146034\n\n# tcId = 94\n# last byte in em modified\nmsg = 313233343030\nresult = invalid\nsig = 07f0772411cdb1e02802f8ca699bf55bebadd254c9aadc16e1d6d4af3e12670bfd2adc2dbe80195f065d75fa4a25ef757766fffa4d902b386a9c7f247206f60c744938f50d6f840170ae94c6792299c386a1d6d7aeb73fecd5b72a28249a2ad771a5518fb694f54924e15cecb2d755da44b54535dc6f8fce0e91ea160ea942c9e34eef5d7367c9065f5ac270ef11a35bcedf663183f74cd2d504410b97b4034a59d201333f235f59924aad30fa877a31e0c1573f62e7be41f961e9c31ec334153d83adb0ef38963f0f5e20c90b67ae5c5e2ef8520587587c22e869881abc6bfcecd62a1f878115e6cbca7259e8b9e116fdeed841f1d698e85f65c7ae07421cf3096f6b31a07e251944bd7e2cf50ccf69a18de7c17700b25786d29ed74fe8d5757d4dabe2d6fbffc2227448ee8d5559f992a3b635cd74a68c329f1785e743ce9d3bee57b997f9ae2deb531f8994ada98d9a3536b074814c2d5003d6a3d50a9e56287f3aee8ed87104c19656a6057515fe17bb2a72a53a7c19b7a814252c8bee61\n\n# tcId = 95\n# signature is 0\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 96\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 97\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202\n\n# tcId = 98\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203\n\n# tcId = 99\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 00008f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d558\n\n# tcId = 100\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d5580000\n\n# tcId = 101\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1\n\n# tcId = 102\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 103\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 636d31d8d5dfe0fc6ab01ef2ccd4602dfea62d386b002c429e7e846e7a98d0cb1d448d25be039d5158887ab46a9dd49c41537a89036a065fc10329df051e5f2e5c1d4436e84790ff6db4d3f31575e5f0fbdfcaee625722c5492fceaa3fb29d0a865200dec06e117b04753ca9450a7ca7f7d1a1176cc38ecab721864413a0d7a22d8fc1595b6cd0032fbf154fbbb31b56d3bf963761ce8ec9fb38bba3419716d0d39e976857e79b1faefd5f5a2ce0ebd94968da1ec3a387804694d90f37b34033c7f70ccfb26beffaafb7bf56c1b8385d489217458e0a68b5d680f9fa45382fd1c227ff3c11e3ec82426ec648a564f0e886e5b12e695dd2fc8465bd9d08731fb140084c79be64d915bcb4ba10f1edb4c37e35231753be2d9f339d37d7b5f22c91584a68a973f9cc469a23d3b5800157dbd72a8405fef4e444ff01f7fd23efa143c1887504e81773743843d8a73209a1deb66c5f305df539bc30e871332e82330e5b66fa6ea253b2b64b4c9781011d20e80ddd8cb83916834eb8fa696b0a4b6bcd\n\n",
 };
-static const size_t kLen161 = 115183;
+static const size_t kLen177 = 115183;
 
-static const char *kData161[] = {
+static const char *kData177[] = {
     "# Imported from Wycheproof's rsa_pss_4096_sha256_mgf1_32_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001]\n[keyDer = 30820222300d06092a864886f70d01010105000382020f003082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-256]\n[n = 00956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed]\n[sLen = 32]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 492e60b828a9847501c7ff46a4a304ee7bf61ae87dd88cd5598c76289a70ab3afb7fa9efa3228a1e826241c13c2e120d22cd3a38a9b9ec5826a9711bdb119748e0f7080ccf917e8cb53f6f21ed19f4ffad9efd94c66e329226a811eef928816b5edb3b10d1f483b64bcad9b055dc78e99491560f59a598001e76a0bff0ddad4ebfd565495e2b523b02dc80050b64db4a200b5ca9efd8a1339d6cdff6a82dcbf769d3b0ed7ae53ea8f1788eb025e186a5eac02e3e1fb1f0aeec29b2929c7a718c32159609f973109d4a876bcecdeee6c6418df27fa46eb5cd238e274f94ab571c968b2c4a838cd812aa90e4657b95c0ccd68d60bd7d33b6e291a6a13f68e046cd41ecfc2bbe35fa9b4a0c17d89a708f89f975bf5a5eb9abc812b0c498d93d2d161f5c7969afbcf798029f3c14efc3f7c265b93fda572d265e9e116ffa9416e111aad32072f61943e9f0754f6e116ab5119ed09bbe245022b6e8bfe35dcee4a53ed375f5451c43f38f6eb55b48e386030cfb76c408c81f606886c81aacc76a999735682413069cc016f6e390ea2df7e8e74d088fb0643aebf4899ee8177a4a5faea3889181612ffdffcdb3fc699d578eba383e23e1beb68824c0bc7f920afbbea8ce7bf2b7c3bb40f33c6b7c8fb6cf73e6e2f3679669f235ddfebeeafa872918581d99c84d6dc37ff85949449d3994982d332cb9f9b8aca691651c4b63e58f6b38\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3731df2cf46de010d06775044db5ad8c98fcb8bf2be357fd39af55a864395bd24fe7cf104374159cfff1b537bb26ecd67a0488ba7a124d8273ee0b3cee00bf94c5d34900c4ccd6e200cac6e90d97d8b4197ea78ad36be7a4fea6e1b43b1ed954c737bd6ec6960945f24308b085e255c1142c61af876995bb5736ae19ca0e1cd9b319634ff7103a4dc89eaa41c00cd173236c275c463a1cbb67f65e45b1bcc4e10c7f3456911e4f9ac4cee8b43651980dc2e8c332e5452e35f256463b96bb21799e22f4349846e8a2583763226b3278134b9313757163ce6ce0628376001fca63c535d384a6aa7cfecc29ebbb5cf6be9d2b211464e02a09c089fa63cdd9571f3fc559bd2b92b7a5a724d3b88fb4e42079add87ae188a983c11fb769d3ce65fc5aa27dc17b6914283971278a749101e38d3b92ed2817ce2b37d4dbdec14f44f2b015433cd6e5a5de6d803e95b8b8196bcc4a77ff6a8419f5c78b4dcfdae0f9f98e8ab792cdc18645a14604a604a417abcee8051aff0eab887f235b1c6143327a0db2e00a63e4c6b8e002f21c86163de68e49c766fa91ad956c12d36856cf58324d417b4898aaa6db3eac372f06ef21d7a7e86b540972dd4e3f7afae7caec8a692f31386e7b3e8b934499a945cdf556eae3010cb1ece6a08d0dea9500157e78117d0f4cdff096fba973f7c04f79bf42a54e4a82e5456f065bbe9382605c444d21cf\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 2b981b661e1e244b67e1892bdab545edc9ef68b50b4572a536dd4a40f31195648b8180454faa8765ba19b7ac6a59176c1a2c621e6f4131af96beb4ea47252d7617b9d8b432b5cd900f7b328b0013364a520ce46ae66a63b7181ab60b514839ec8f6bb63ec2f83a2a142d8ce532f63ebdd3f29ce26797f46f68481818ff1e00c47df1e7e8d809737307a63902c94d9c2ee5c69f1fa0602eeedab4d7f6d0032de1a8294c117ad2aa34f1175544f2bc1d466c5965ae5796bae216cee8bf7b91f9746a97749cce0388f8f443d14317e825cba2ea278045826835dfab50091cc988fc12d4913920cd625ac321df4d89175ba3f49f89d372318bc222643ab888246f8e5ad64f227be043bec3828cea0bc0229be6e71a035dca97bfe0c2f34ce03c1ee9d084d19a6d6c301168129a6589cee1119cee84e35b561d1f658b2e4f16c2b4ac2ded8ed5757ebec2d5ed59c66f7bd932d64c58af7fc16af4d3f6bc42897114c9ec537f8b7ea86752a2a26133a7b8085f4d438ba643f7a389a1c6811c2ee4eda48060d27e6299b44c8d504d280ca56ca49c246b5c4c897d3e1d352e047f735cb7e30ce87061ef267bd9c50e7de77032a162ac9a026e684bb4d0e8131a90240494418fbe471c9900a6b322306e47915f83cdd8e525566e8a71dfc869ee5c7e74d33ac8646d7c170ff82f2f3e5d319dc61cad06235145c031d03cd420fc370adb3e\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f44\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 66381e10ca91edb043adc721883b8c005eaac4daf040379f4d69a2bd7ded69cc6e85d80a6f3ce8aad523a5d185cbb2fcebece5210feb0318065ced244ff73830cbc628d79572f7f0961c111883b9c40336d110cdd4dc4b9a04ae4a0380e8b17f0667b71b2c5bdd1c9b48c4e83694820d4cf4200051bf3101559625c0d06fd0996b759e9f4c689610e41655b262957457a4d8341c65bd89dd438025699dda37aa2d05",
     "1cd3c974103aafb092e865b1397661be3eee3f95d7a75d9a2ebd74e6d2cfa54ff0d8753130eca1555eac4bea45e90a6a37d7d057ccde4c32e43c7499d5c38754ce950308fcff69d42aa4a4fa85e6d92bd20d605823e198e94af5ad65ca4c2fb919391f919aa5fe048ff51a506f63063cc5f777fa70b20cf759a0b812b2527265fc7f32a40cc275ef94ebb4a0410280ad658e67c34d581b5e7a17c5629be34ceb70ca68f40aedaa3c9b7dbcf34f30f12789909a3540512044bd812760c3f76dbc644b89760b54d9e090dd9cbab935597c55fdc6793f8ef007f732732e3d1fcc3e3ed253689aa29acfcf85847acb74a722533b0b5debfbcd0b5388f6b19e8b9ac47753f8a616ed9a7e4163ce8669437c62271bad3497edf3b655e4d1523cd8f3448c5d07c48dcfaf1e1f8310baf3d3707ea23288911fdf91d7379738ba8fee9ce525ca0b9c4c03bf1bbcd7d1369c0d2f5e0127ce2d1f95322c94d4c309f2e8\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 134d55894c80eefab7744abbc9fc5cbc087072da8243236fda9df5ddedd81d23f0998061ceec59d1bd4fa2f404547056f9616f77843330bc65a2d2386574ec9198b2abcadee4139074c3208e2f09eec1e527e26b78b8773121f852bb8480e22b34c0e1cafe9bb224ce6243c46c03cfbd0fdaf28041dba177ced1a2ad70ca2f1e7dddd6cd137732f4a774e47eb59d8225d4c6a507f8f273b600a5b6449d63924b3a0cefe987cb5998dffef835dfe3a675442c90d02067c9b3ff0e3f1d84ce8801bf366e040710ad2c08c9f379bd07797ed954d3e15ef1350ffef88e9bce7174466358effd2494d7e174ae88b04e17c5ffa7b63bb6cf194d007b3ac22113fe3a1dc0c97d3853aa67c892d7d6bc5b0be6681e18004640416587452c856644ae6c07d135afae80fb80132c1faf56c5b224923cef5abe9969b807023fb84146a62e19bb6d8e5af0475e07f48b469ba3178c99741af6e57aefcb766ead4ea6cb3d172532704818fd82e12132b6329dbdc62e4c9da1fee2cb19e4f60ebfebc681a5b892afb812e82029123a7414f56f57e09731fe107f682f10a5c31fdec1d60118cc3646b0284e1948b2bd37c280135ab587960fd0769629860d17c4349271267a89c26c5f5debfdf40d843428af1010f87ab73648ac1c698898717889c38be7a06b7dfe9f63a9c7a19a77d61e3235ceaccad99cce004d6a870b27cd13414383ef4aff\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 7a7848548b15bf23e4dc1908e5b3aa8989936c498e77d587e64ebc9b335ce6f400a3965c027c6c248afcda5c80efe8d1f1bd9e71a5c459aa428a4ae1d1cef91ae48788f361dd440fb3cf745c9935664e43b81e9f860985418b61c3afe63b85cbd07e7dd3601c8ef8b7467694e3221ba4ace737c3134a8bd7f7ecd84d1382a93e5c9a6b69c9a8f12cbd612e48e5145972a1ad4f92cb0a57f44e0fde4548d231a5ee0efa8698154c66ddfd8fdbdd41d1476bb5d8852663e4b7891755ef9fa7b5d508b190d59270d32a0a7f32b1a28570a7e52592324fc461a32bde7e2cd14b04129a400274e4183cbe44aa4bea3b4680061b119a97da65c6ed4bff5f2f59193ccdfa8d021816a2b5d32ac52414d1c51f8c198f4c03e0993f8e47c268598d665c2b624cb66ff02219a9100adb3ca9674ca1b63d77d6156307efe953a489529a1701ceac83ef1134e7cc7aaa578fa4909e9c4c0220a5c882433dd3f0af1d87bede7ad979ecc9999cccaec3c4d39265efad3c39809ad3f24fed3982dc74c57ff8cf1578d940f9c6d351aff9cdaa2481d0f355054389ab2a6edb6b5455677d828453cd6aa21000adda95644125cdc6b4a4f95cb69a1abd23b46603485e696dc419cbeba767b2fa7081e1641c4b2daa44f5fb2b9a6513dd12d6f12f0f1cf7da5a74223da8dc390468e46af16583faacb7fc0ef4c095c641af4d76be03e880d4f4e2c8a3\n\n# tcId = 8\nmsg = 343236343739373234\nresult = valid\nsig = 303afbfa17c9c8d18b64867e7293f22c8a139a6b106ac86e9a59b590f085d572a0b1bc177a35e3ba74d66e3c6d9f7b5daef34e03080d13951fc2e73cd1c7cef4a815071a089964c35afca9745ae54c1dc2443c79ddb9f111182c501177fd6351dfa8a980f1ba2c99b489b78c3e31002007b00850c52e5db7f6cfab31ac0a6c8f6d0516e19304e8376088aae408ba6f69b2f70ebecd64a53e3da851ec36cccdb7e317a4f4a337781a7e9b0c168af765431e7342f53164c50c12d1e33b5f026a6cf1925b76869252d290ed048ad6c88b0010ab293f6d15d05c884f5c830fd09d107bced6a0697215afd121bc137438ebffda18b1a6f607625813ca9a93b54d8ad6be5ad5aab808d5fb5293ccf6bd18dc920fd72c258572b660fc2072251488c8623e3d2bf988a72fb289be8046975828e210217fd04d82c5694031be9a9f2932aba449da9d21738705a513a5dda2f277ba9a017c6363da9042838aff0c9ae4b5655580e74a95459666108fd5d870486b7ce4187f057fca8fbb0c877e1fb3ffacc26732c26a50c581537adfd596baf30563d7d23af2d68395f774f52abc238738a2fd15d1ff2046e07c382d176d6fca5348c1a44b44bf89883ca569b7cb9d7b8550e65229c4fb21e3dedb80ed3ec51b378c77750617741976d5b2f764c7db5e103651782df4841789b6993c5b73840038cad16b03a368dd6684b7a90ede21a2ed2b\n\n# tcId = 9\nmsg = 37313338363834383931\nresult = valid\nsig = 245258fbe3957df086cf99d113f5297d5287f6809236e97e398a4a66d43236dc93c5ff7b089260ceeb8312ed7c7fc2a0faa6b5933adb453e0619ef06601d5b2e2ba8b43c76704c29f45416d0085d209911db798c0aaaee221d795fac94d66d9bc01eb43fd9caa23b5e34d33cecb735319133696aadaf316424a9bd445a6b8bd779791edb302f352b1460a69a25fd14432cf043fcc4f1ae1b7bcfe6955da3a89d6abbfa08e703372b977c57a84ba81f7cb51bd58a9929a8b8dff805aec99b03a46ce82a16d25f6f30e501a9bd0fb8a47105893c2b361f80f2ae872e5358290770198cd2b5139c234e70b80aa18cea9d9b94e2b3c46e9311b2fc513e28a5dc83a4b1603d59ba12f695656fc40bc6f890731e9d990242fb79f5fd2111ed7b7019c0f22c1b84e382fff744e9f0476e4eef7259730ace36cd7b1747856fde8d1c6883df62b20eaa58d18febd316091acbd323903a9351016d089ba51df67f5cd14114b8530049478883d53f0376ccdc8ec472af2907a5463c320c066ecd8aa6ee8cfac58f67bc051685f0d38bd2649442aadfd87749e22acabb6c396e018d623540edd2977842ebc518e3b2954a8555de5d4b675027488b52f8ce32ae864b9e965163b0780b53e8e227e914c139f91afb662b9c4fbf21bcb7b43040113155b97571806c112aae1e9da34743df2ceea812f3b931f33bb103d9c5239c92c701c0565fb0\n\n# tcId = 10\nmsg = 3130333539333331363638\nresult = valid\nsig = 3f4d6ad95e3b937372ffe704d32b54c879f04e85dda332b360b2106942c45c7bcd2c7ace3c7cd0b585182a83e89a34809fcd72687c007c9a2ae07359449ff983bb1b5c3a0fb44cc694eee28b87d961847fd9a3067697c3283d4e8b79fc086ce77eccbde90a7960d9112ac4e9f0ce5ba897bc564b3bb6fe023dc369c01724455eb40170d92071b3cb08de7cb55300b244992e80c2e181d854c9974fb76bcffd3b9389f37f39dc0c0df15584fb6ca4c29b1fe1dabb1570a235f5b17a283969958cc7eed4a1d15eacf84f8cd7214b063b79c976887039adb9a1456f022c11c4966c32dd4c7782a187eeff40865ac926cfe97a8640ecae28c5448e8dcbb50279232f0dc597b58dfc4ce53d9530584a808cc7a20dcdc90024931732b92ad17bee31b60e7e3d6667d809e4bb02caa28d3676a7eb5fccc841385a010597b02fdc728715fda89cfca37c72cec44b6befa8093b99a4cf0a81a23e484a671b589437b4e6a953e27e7339e00cf0762b9ba9aad64170b8f07c76f2729771b8d406936fb219d3decb9fa075f51ca804f7ea59dae8f663e49f6b007a0300a28bb54707cd891439207104463907bdb7f7ce2c7861888ced5527f91e6f52003fce1090d9231a07303a416138118be8c49fc919450247a9004164030bbc69534dc7f61867f494682884314dd0fd6573af2cdc3e86ce5c9dd6af71dee512c78f8cd5eb4cce3967e349\n\n# tcId = 11\nmsg = 33393439343031323135\nresult = valid\nsig = 8732ca98efa135da433f00d9f4f5d76ab711876cdcd965598e243a7e68565eba7d60a95a5838dab1a3e35051cdc1ad7be6a6a872ec631c8f23c84ff831a25a01f3f8a49547ed98ecd7672ff561c438aa86c5a8a7fbc07ca1f6437d6e30b695ed81111365f721fffc36979ca2d1a55818f5a0fcc922dde87ed5b76fc47d5f4ef219f05668feb398b77573f9b1232f090647a2632dbfa3ee02c585660d76f2e3504a682382606a766e214c51a2813b730a93013ddf4a7ef08028c8e444da2b8d1f583780bba7148a010314f2588310da17845a0ee37dd6308d1f8d9b87a88df57cb1d530441c6a2c7a18fd47b4b7f89353d3108e91bb584c2c98a74e413e8e3be7c8273d0822dbabf96970c61b104ceed8306038a215c61f15bb4743dcbd80de6ef1458923213f7b27abff0614b6e1c3b02c4011ba2a6590fc9577687a2bc5267762367d7b62b03110bfe5b8023ff6a7c46e46a5deb7a5fb5f7b50207760e449655bb7ad84638091119729758e11c30c7dac2f0bac200f0d62e0c603a9a6a4110dfc70ba838bc76aed762cc9a7c3830428f0c8c68f7972a3ed68f9895ed0fdb7a7d6f206e8cf44100bdceb126ff8a5bf21b1e6dce17c3bd3b8908a8f4aa1d7f16800185d96332be6d5c3c5dbe0324d1cc809ce72f1cb1696c5574b13430687b2ddf1970c5b45fa3c4df55b46c88603677f29fddc4eb302e2490fa09af3b14d8f9e\n\n# tcId = 12\nmsg = 31333434323933303739\nresult = valid\nsig = 4e3b548219cbdba85f3ca9e739a153e8fc69a4974648806eb92cf2484b00dc272b4ae4b88db9b38a5e4320332c2ea62448c08e44968fc1ea1390f66469ba52d4633ea98bd3b6204e813bfa3353dbbee7c0c659279d7bc78770290c444ad6105ea2634fcb66ae0535900ef9cc458ff9da86e40dfd4e51f6bdc7b221641f6783d14213b6507ffddcda844ae38b323c6f22415dced537575e175633997557af0990589f019ab5ae99e32557f82b1b9c1c54e9ce289cbc98fafacda9ebbddf5fb3d99fb73e4ccb3d2f2ba889bc47207887f646d529bd1cf78ec915efb3086d6d4d664e8b07d094bc88d8e9fbf6b2ef22e56dcc7ea634aa021efaa4b85aa517b748322a8e0ee3c53324865a8bbc545008a5b855e9813418db9f74b178c1aad20e52bd7679d2a651760c6c195de92bfc27fec2405bb4b267152cbde712ce658a58700eafd2b0d3f06ead2cca73ec56cf4e55b5cb112263bdd8636b51779fa27847b2b658b39cc023df2d67143922dbcbbd07796d7702aeb831bcac758fa50d578996b5da3ecdf9799bf27989e5895bc1d86e99cc8ee5629479e99f2c0a038d0531aa2fd6cffc52bafa4406df74e0f33ed33fde3b4f4caccd06b68febad7f59e7e9",
     "51c95c24a588ce25d5e92b9b411d8b25af54e87553264faa6c5773d6d59a01252bcc05a40f3bbcb995615cb85dd1771cf05b75305b5dbc9ccc8571c0290905c22bf0\n\n# tcId = 13\nmsg = 33373036323131373132\nresult = valid\nsig = 456c58e80907cd7723f351425750bfbb8fbcd7a42794063f9c3093180a79c9b289b0c2e7db35cf0e90af75f3d830cf27ab4fd739e1db1e51d32baf5c2c219e2db5b856b5f0fc49fe33b32cb53f6201b47b320bac4f8e26d461ac6bb4c54a8cb3666717f9fdfcf148410ee6e2468394ebaa58a23fa3c7349ede819045d13a082d0304e5d0dfcef237c661884663dc956be112d47bbe627a1e66deaea251aac624ff45b15a6cd49c50445fc6f3e8a15caf4f9d082fac7b788695e3401b5b80fade651c1fc2404f5ad45ed632bddd1d02acaa6467f0da107202ab964844dbf00a48716e28d84176aa98ecb76ab52c631ddb9e1f06e6655cfb9fa1bccf05e9ea3aa773e540d0e7937f78e754a8ae4b57b0ea7d3e7cf42686f229e425f00cacf766d0c56de3151a151e12204c04d97a1470903e78cbaa74ab12955e1b2cb162acb07aca887507a661987e83fa9b0606f2b0d1303a709f407cb6866a560fad21f60a65bc4db2440b1a0b349cc29668a9f32a6d6e4ca7ff2bee3d670402fcfc05a51b988deaef45b6504689fbed8793f5061e50b803ba73843f3d8ba4ef097ff361a7cb58e95bc740d93a8420f81c13ea40f2f4ec44a0195d010577fdc42fdcc9b17a0c273dc79b48bd417c980258689026d292508c0c21346b6d9959f900cb3d7edc5acb5ef2e1f75eb3560c82a20e7bfe4c151792b3531c708744149faaea51a9e8bc\n\n# tcId = 14\nmsg = 333433363838373132\nresult = valid\nsig = 70aeb4087275eb488c13af70b3bd01ed728cbaa7e9d23227b4852d07bdbddbccd7e7e45cbf67a3609cc5d916f090bcc003ca86943a56b99482cba553f54a6c30f9cd09832caae0eebc61ac2824d1adaa448e3ceb6678da38629b2e3dbed14937881cd9887b23b0971b9ad2b30d63f553bd6d8235185b43f7a1db62952c4d0aaab7b598777a3c6406c5fdde2664f0112269f8a02dbaac936674f08330dd7ad49d7aa7a43926f9a40824a386ef0002963b2697e23db3bc227d12730271e2842ade151db6db670cf849ed14279b1378291d32fcc4b76d918ee5a0b64f6b5bd43d84fd5258f53d908f9bfee9b9de510f6e94ab4209ead7d48d4b1bdfc13afbded36d85de2adaae2e72beebd2b83208b7171d1618a66016e3c5f89364c9c4b8e5c33129f85fafe0e48080b6b78ac0f898f73f9635d8e72939a039d56e59b359f5f7e891f81c59369dc97da667b8e2a2d86f84ac9dbe98eed74c4f3d73809037ba17467825fa21aaffd18daf6bce69b8a7b88974565012f9ec01a51646884c1e64346012448940c4b3af1c9f86bcf656ba5efb0b1e65e8f9bafe42295bca712030ef6cef2d8dbb300ee57af3cc40e19dc1ee4138e78cfbf6f98bb8ef278dfda3b2464bb0bb6c9cdfd19e1b70004c994d4ea2962c4cb66e4fde4ce9c62b05cea744414da3cdf41e6285c1134ca53dc8581c6090f2f4b649455cab26912571dd03fc4ba4\n\n# tcId = 15\nmsg = 31333531353330333730\nresult = valid\nsig = 27b2c163e957b544022b487423bafdcd96b0d6b8b91f3df95e1b57679a5ab1c046de6dfa0f6a898a6aa1b5a81dc8eeb113fc992f4c64486e29b733fb4bf040afbf2a033eebf837d0823c46a70806de28a2a2ff3e39116e726afc7d400864bdefab2edde98662e1b6b036266fefcbc6040f95ed6c316c0969bdd3aa93db59d9e51a5172adf71f1af70daf873485523d9235c217407240938d5746dcee5b978aab3213b66fb75fb685d99f99160f23290baf90e9de690e1baefe716f119163653d35d7d638af70712fc97def6fe88ce8520e695f8a7b28a1ce73f0b9d6ce433ac0ed5446656a9b31dec1712d3c0fb6dab5f8cfb7fa3858bccb01033d9ec092a2f7f0caf68867f90a0318dbee1d40edc4c8ec0fea960ba04262dd7b2e48a3200285705ab150988f0b4fce4fd313d45f109d1f4a7c1c184d9123e896981b81afd280106917dec36f5b0ef5d3a71bb37a0e9c42491cc28bb82c70256775a5f2cc5bafcc15a8852b41ac59b1c7f654ca8d80375bc49e2e6b415458628d965d4ef4a751701abd20cc9f45e3cea908ad75e3bc258b36f584e60502e7cd02d2d4f8976bcc52695adf1bd6325e06ffe0ca161be992b4fce04d2440d6035164b09a8b955673e201f473c0f759b27e892c7fa61483743e25af670833f6fd49bd606aa04369295355a93163faaaec789400ce03067bae206dc58c8c7b4157251e63d683257c27\n\n# tcId = 16\nmsg = 36353533323033313236\nresult = valid\nsig = 675b9dfbd81c45913b46533153fa93161adc71cebdcd218b534c43f24b59df6fe8311da886898300e818ccfb8911d740cf619edb42643938185db0e2749e1bf4d6ae5a5c2d7c4139c339ca64e8dab0bbaf762c5a6cf9b6e04c86e476a6aec56c110a94c9ba0545f6f7fdfd08510f555cd67a9a8fe12f8d04bc00634bb3f84fc92587a3d4a9bb121762d8bd21c85462ab0f33de235498516ca63e0c4e157fd3031d78da7117f46256fd99cdd5cb18ac82d85c4ee1fa954e603dc09367a979d452450a63995eb83bae1d371b33cac539083eb52894f534d06d3e091e8e6a1dc8dfbafd4abd4df3fd5aaf8b93bbd1ff1d26ba7d1aae04e25a1fffb6aa7c02a4e75dc099d0e3d8381d7df70bd2558113c52ca8f839487ff5571c2a12c4c8596b023a0f9cf90958b69e513e59ebb5bb892b9b48c8e79887551e9df73f8f1357947f9cb43583c0b775ab9ec0d89a700cbbf935ab3ec00061b8d462b83c496a4b8abfb0dee0c11b4d5e3b6912a33599b014b7c381c2d8e82d06197cf2c40698730881de5df4e7202fcad15bce63c6d08573cd7712551404cf830967976e258f903aa518d7ee967d1c7c319bbca1a24420ed6beac83719c43214b9617144c1daf762b66f22bc34b8667dccb5b3bc980090ea22fa61c68e9119fd5f3d88c84e2ea9f83f0dd7dfc76b7535205fe0c4f7798e14f5559263dfc3666e9536e8c79445674dccf1\n\n# tcId = 17\nmsg = 31353634333436363033\nresult = valid\nsig = 1d1824029de39c7907288499362efe10d06179a8211e200f73889c1b9b68f7bf0ceb17ff58dfe494654e108864a2859075adf2ad2bb2e66a061ac9330ca9fddc525b3be8761f01a9c3eb7c9286215612962882b42ef74a2328e8e4511d3a589653bf0e46f299a52bd72a697fc6f09c4ee62c2d34d5487ad8c723faf42669583f2c7418c5c3f4897a193a19511c19840eb5c2c71b81023c0df8b1c6d3f27a880547dac9b12e094dc90904d47473dba66cf61207c709cc57791b0786148f62c591f72e46754e3d6e6f838c97397c5bc90e6079bed3dee5cfaf3520f50e127be6ba35cd9783b46424ad907a5c04edec02560c3d72179a6ee5cbbc9cc2331ef0fb157ed60ba4effbaa9a208ef03e1a4659d2d9a77f36fa783aa9e6dfa72015f6d6a586223a4640e04fe01b003aa395297c8d9579cd3b8e0134a06ac361819ea8499e010615478cf3d883b8f6a1ed2cd83cda71c7a595b3582ace4cab76a387f9f1f30aba9f5fc6ead0ad95343156a734645abf5b2771299dbe5daf2e2be5d4f1e6db93e92ee5202b7419b47ed5539d14d30d099d39f504a4162bf8a16a986c5cbec2a7d56ae06d815c4b91301d235a3d7e5536086699b44e5b92fd723804caf6acefa2fd58a9dde0c0524cb8d5a6288b05490b1153792bad9fd99ee696aa3b83d8f04f965242e98b1e6a96cc13f5de46a2fcbce6bdf33022f7860faaaf6d1ff0a5cb\n\n# tcId = 18\nmsg = 34343239353339313137\nresult = valid\nsig = 7eba46db8935bb9f29f3e5009b8ea19022f177fbdff7b5c11ac0fe7fc31ed63cd12685096956be4cea1ca37f738104144ae4a62591a467cfaa68b7e45c76bff4719026f4a5b1ad2e1a587bff308a27647c93cd869445d23043f87fb1bf0730e6f620864a61a097bc494eff10ae87fa270180ad0642ba638bcd53d753d2b8ecd1f70dee4eb0c90d1108677ef19a13c5bbfa2b1a4fecccdd54e15909fc73e2947677bbb4cfd097b3933facbb3d4b608e600d06d5ad53ce537efae69a5c6ac257c850eaf211aa58a3836368a21498bc63aa271ad5e8bf169ee149eb7f761393061ecf567856c64ef7575a9785d2c482cbd9a2999cc6499cd39103ec8d91ad3cb8cac0b4588ea1cbb8a61cf622bb638db4f0ad7ca8b1eaf9d7c60f9c7427e08cccc25057f497bd444aa11da061daaae0e5cea7e6aca793a51010be4b4c500af433abdb21dab5f79a84c302d290aa296f03fc1a4ede683762b72bfd2694beb537d06c750fddc312eb9ffcffd25558d88ddcd2509ff2f2615c5f9e29e6d1bab5145c6dadf490aa978530eb2358bca9759434f765c07130749d3b14ef7c2c5e45547d6a458fd3c1f80ae725a24b72f896f55d40da4a21b3612849d18119d52b962302eacc6620f3951e2d41f544801d4f1007479f89521e023989e9eb9865989fbc18234a0d07a89c9f9b8d051ff1eb5d41d394ea8045f94980020cd1c1992cdeaf5a27\n\n# tcId = 19\nmsg = 3130393533323631333531\nresult = valid\nsig = 90462930f56f9abaa7d7cd95bb07bcd9108fb5eb9c0595e5a370507c457e188d2b6d4fea1f6d6ab5e3b96c1fa140ef5ecb43cd48f942387fa155d2a73a19f759c681858150a1379cbeed487e39bc74a72d48d8a8ae1b40e894c6dff19f4e2e5116b3cdf078eb2e30393e3580bce971ba0187c4d90203de37a1c13c3ea40cddcada0b15ab8c963c95a8ee80ff1fe44fae72d18ad0f3af1567e5ce04b4722f93b581fa42731215b515f572cb98446a53614c93afd5f8d6742e0b1d7f449dd39ef1734cf8e04e61fdf0b7b2a4ad44615f88f7e1d4fe105fccf397f9531f3833f0ed49679b91b067b4f9ca35d53c4e6930b75bdd03f3cbfcdcabe7f688f69e88a76b31bcc3e200cb5ece2a90d77b97f4f1b192694d92904def232ce4d7775b94956c75ce8820dced0786c820c2324b400c951561970e769b616e605eb9b5f873a71c168e38285ddb572200903c24f8dcca7a6deca91c27d053d87d3405dc5f7169cd7b54c935f8c90b3cec4046077d1d84d8acdf05d7a0cdd92ef6ee59edfd067cf00e7bf4e911b877f60b957b88f0e71665727944ff95748c47ebcafe04009a3f356c3edbc423c7a31a9e8345dd9041926d388dc0436b6d514d10a3dd13bc0321f1e6f56297294d4e7e2d77ecbbed84dda2d03eb9a846b3ab9402711d72af55face368da74ecb263ea9522d9a7ebbad4063a3030c3bcd4b7c9eccd8eceb34af0047\n\n# tcId = 20\nmsg = 35393837333530303431\nresult = valid\nsig = 6a411380c1d5066a8555fddf5d4827fcfb0db89b1c60e071e24bb86773f951b5300fe423238ab7df1c109d854f6804aba4901ab6701ea545a8469500dcf95e7fc9e1bf9fa79b5031f130f583d91ead61ad11fa2c5a97d990909eb337fd48eb3bba09c761f0dcbd48cbb2bb6c778131c3c6e73403ac7c0006139fabaec0d91c4eb1adc39e6b0504a77140e685f60f5ceda237f47a5ee4ab5383f9d579ddde74886a0daf3c8efbdb7666532a44b7856d13a5f75d1656e5c6a9167d26a110c902e9b3c8274e01f0",
@@ -3995,9 +4094,9 @@
     "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 96\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 97\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = 956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ec\n\n# tcId = 98\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = 956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed\n\n# tcId = 99\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 000075fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f44\n\n# tcId = 100\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f440000\n\n# tcId = 101\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de7010309093\n\n# tcId = 102\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 103\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 0e207de1295caadb15098f51f5db90f9f000776055b107be58bd24d52a01d4171cb9e47a40790254f86a8a56c8ae38252f909aa3b9bbe7b7e1fed008105690d9afa647067ac122a272d30ac28213d2cd37b45cf81dc48d59e87d9ffaef6e1c9cf6ddf4ea5ff6123523c9cc885344b7e1ef4c8096bb542bc0fa5c47abaabca9a58ca85bcf092924741503a0f3c54c725c48855dc434b09d761f729051fb15af5612bdd387b4cd5019577327bb2e64edb065f713d50ff4285f1d184fe709207f809b9c38d064722897a868f8a09bfe1d33c80be0693e98d7e85600befb643e9f713584c716306731d7f8087dff66be1c4f6dddbc51b6ffe6034845cf0f88749e039ec314887c94648154f",
     "7c97235323bf78041ec2c8ee98ea7c553ecfec1f9fe89279c9c91ac6acd12ebe969da4c67fa6534ef9ace4b629c7b1de8c4ce1dc2b0f5bd7d416db6eb512a4dc8eda0322138cb7c65b9a58d712284e4aaf059db80af5785af4d83d391b7d8bdc4071636712410d1dde662478eada1a2f1f35786b78eec77b2788536108e7463d676814a91f81fd5e2084a8c1b1cc33988e73184110c6e6b0ef1de874104602eb33b5276ebbac95d91b943e25de6dfc66b31d8091961c78dcddd358de7f25584d9f74dc6271ff31294bee2cc9b2f97a2583c9b33243600500bc723b05d65839de7442895bd57a1dd508651a20e20f264d8dcb59d485247\n\n",
 };
-static const size_t kLen162 = 189086;
+static const size_t kLen178 = 189086;
 
-static const char *kData162[] = {
+static const char *kData178[] = {
     "# Imported from Wycheproof's rsa_pss_4096_sha512_mgf1_32_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001]\n[keyDer = 30820222300d06092a864886f70d01010105000382020f003082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001]\n[keysize = 4096]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3]\n[sLen = 32]\n[sha = SHA-512]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 8d4444ab233739c9d1441e99cb4f71581ed78fb996ba1257fffcd9e3c74ff60d6be352f002f959ff66bc6ed0c987a070097e5d57d8bd89b4452a9d2ca121eb6a283e8d0ef6f5f67875b6cbb8f04e6d242900d73d5bd7b59de4b9466ccbe53874ed422610e411fe3e026f47e47b8686b9c891c7226b4ca560a840e1734eb4f6fe877e559c9a9299dbbcaeebaf7eecfce6fe43ffbc483514fa3aabd6959e5aaa3977e23a9f97edf406d396e96c3c830164b10abc680bbaa6d99d19765d7c7e77946ef6ae240b5fef0249e7062792b15c8f9157da95971afb315c9c015c74a2e79ea2d0cc46992704872c340781f052b4b2cb5ded8f5cadd9b5e3edce128ef2354bd0411074d6515251f5231453bd530222f730ec736a86f721744267ba52652289ff6a207a5a7c45c20ec451948d6bd7b10f1af7282afed9f5df43e4a0d0f2e8fc6d3dd3130d4ff6fbc11f0ea460089856df29d1b7b111095754a7de9bc03029c6c397b6994674775fd29cd22ffb03dcd90c51096b18a6c174f2b48d50e94856f5a22adae64915d69c5528dac0345017c24e8aba401c6e9a0a268057a0fea237dbf0c88906796eea0d1bc3c2347cfcd812217e26015825e9f0fac404c22c26272443ccaf30b294c7c467497ee561a2a5f6d219973cffde9aed8e4486faa3de3d17405445e2f78a768dcac1efd01596486c2495f5bb1f830a4984041e03a7bcd77a\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3a58fc64a234dbd7be958d7c34abcba7d780ca636c4f2b2bb7fd3d4e4faaea0e17226c85debf8dc9b1a79e152a3bd83b13f43b1e92be81b37e908d04b717251e32a2d49e2cb5f2e7dc18e74cf9fcf0c0e246d473f76c79c3d50e878a2f89bc4eb6ecdda96c166d6a825a1df569d11384a78d7052782ace5878c41361f148c54528288088716f935d3e5b5d556a0fc9b62c0de31d9ddf4893f82365111043ad7fca010d1fe9187bde48f78cf465657e184857451d64564a16a166743870033e64125ca3f20ba80c065b259666871fcfcf71e711aa34cb70ad9a2ac6051fc02c96149d4e3c1741c4d44663ee0b49e1ba60a80b4c2d389ce3ba953d68bec835432bfe170429951f82ff51f408aff052c934d51526117b3d57ed1f2a912b37cacdb5a980d30d223d79faee7948c5f4986c1df5ed42923a3f4342da02a41872db49aa09d2d48c3b3e1cca7114a9a34e76b747ae6c99141c9f856e41d98456b3fde7d26bf842d6a421b3d4cceda4da1aa4d1298b624159a1c83b6fe5cb89982eba5e7d6005489d39233f156817c00c04511b98463696f8b6b3962ca3f4ef76b37300dda1d368c237250baa057e38658882f482d024c26163dc1fdac29904bc6424130837b8928f764bc939f006913ab1e968c85016dd812dba264520e6380872587265d827557eeac6498db8137dd2ae029fd83250ab7dcd764d018ca05ac9db8f95e2\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 7c838ba65f923660aa4ac47465eb1df4df51d6fa2be26389757de8c6dfc7746aa5164d909b69b7c04758d256e13e3520e77e75b4094d8b0d60da0030b9c991969f6e892ff03ffba9b9f95ca991a279e7cded611a2879e6e6602f411a122c8d11cd333de5d2f7f367e38ee0491380e8796e113487ec7bc05ec1b1261aff871ef82cdd12f4e3d8f239cd49b2f53d57255dfe6ef29038831cdebe9cb1a76dc9ed79578e129b063724ccb3c7b3269f5dd3d9669a405582255cb56b1efe6d61a376df3a141014c3d660b66f9d1b266b5fd3c5472534df778e6e022a8f5a6cab501dde611e07c0c8eb5718962692e8e3773bfd25f1d3b63a20a251ef0c296f01f4a17814e18dfc029f2ed0ce073e83777cff44471f9348434fcc12b0420bf2de1c9018f0282ee21f09302b178f8c772c8f8962f6a29291c63532e1ae9301e7ac55781876965f425619a92559f33737d5e11b282f9434e27d9b27eb2fb0fce4e3e90ca9eaafef170644b00e512537bd779fd2207ee73020aaec07e6cd44103a14940c9499b013c42440d2f27a3def34f3509cd8631db1cc8633ac15180272c824369e1d3c8a6cdca511748361cb60e022173f95ad06e7c79d59e03934854a9f9827f3593d87c34d3fc44beec58e107d454ce04b55c96effce612aef0e5d55c31e367c9fc0166f2c9d450e86d79323d4da8fb409f97adc7af2ec6772ab290f622fe1fa61\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea144143\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 3d90ff4e36188b451116227e189a71734571b72cc6fe53dec4eec59e67e98111e96fcd906509fade9922f2de6a13a4faa23c7efaadde6dfd0acf150541eca973c7e38a49c597d741e99ef7575b6e2c8de0974bc868a5567f0890052c4df54d12198ea09a12bdb2b6ffc14a1d874e165ed12caab58b28aee171fa7f1839e36e23ecdee2633616791179084eaf98cc23d2f6ff479df0ba46ed933beedf07cc0cad4dea",
     "0f0b48f4a063488ac67519e1fb83c7b7e86e3644b0846383ecbb1b1189743036b271fbf121e2199601a3ffa8e8cab00a6b9b5527d62dc2a398e4a42c1e5a62f8aae35b629755119c54cba5e860b421845f9b4422f20d896abfa962ece5d116f7d4170db8dd0784b7625ab2a384c7d424c69901f59d03b144241f8f6556da8e3bfe07c17eae91c50ef2c53e71072c3ff16e642cf126feab904e09a2febebd282a2540389bb60b145cb332658d6a69e03a0a8419eec0f204d6e592e04df01b92f58236989b6b92eb0344255914c25dcd0a611c9fb77e435e2ef9bbe3c74efe144171ca95d1bb7de814f76be54cdd8c11db8af8d20af4451a4dd3b62387bac37cb79755afe91d0d9a2163d299ff61ee4fc4d5267eb8c5252371b0a83dea738f6383e085e992b3567ae170780f3b83e15d895ad4ea668a6304f10f0914ca3b2900fab1364c8b352dfa8d5a3993d5628f4d2264c412210798c18aa2ed6aee516c\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 07440a61252a8906a9264ff58cebad6217ad710833105369b7a858216f1d5a5f5dedbe3eb8128b34dc0f0243faacb64034d21b656a278abb26ced174f76a22637b755b768564db6ed4e4fba0d5784a22be30d088fa965307430982f84476907d55435ca3d4abdbf689e76f2d4b78d99bcc742e0b757b897c4fdb13d15c5057e6816e32c3e294a947374c998550173cc657ce33f9fcc18b2d14e1b448acaaef683ff84b086f545a05414589b1c23210290ed5ebbc25af614129212d3853ff728ec01128d37c4268975ef870a1e4fa00c3c98b39c3110c2c11af10333e25db027448fa8f219a7dca7c8bfb490912bd5040f1f348b2fb437a8a9f407ab7e8af1c6e29594f557f2e03fe74e4fbfd2f935e68ed824a510fc39bb4be0a2e091feb265fd2d7a33d2f238e70b153700f5bd5046aad7a6fc02a5e23dc36f67278fdb904d05f2efd0cabe9e4baf4e16af0f7ba9edad706d67c67221ca0630238d6f688174d66c1b152f8f921e2c6c08a19e870eab76a77371b42458dff1c36b0ae97b811e900f6c09e792c89644448f1d0b97b53b9818d1d8f3d7a37bcb1bd3e3a5bc022039f00a0ef7de19657c4c9e06daa2ecec2de30db3b7b84107bb74e164956eb26edc9bcc57e5e1c4ed875b02f0545383602faf9525f094c72f682995d4e2d71d03e11134495f637a3b1b022153689751b63521b1a16b3c3e269a2499a4be1aff9b8\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 2686029fb11cd033724e57dc1835da4f9321eef330747c3500a4893586429ebf02cb4424ee5a0b91a70eb35cb05ef60cf6b3635d4f2ef5eb647f398fd44f67fcd2969b629a7c54f1094f9827f9f27457509730f50c9ecd2dc83bd13f1268d93f0f61c29c5c27eb821c68edcdf1b01f79d1f261dd7f2f283db197ab56cae0ea3b3c1cfaf3fbd4c1ed1f6d313f0b919e5fddcb97b23f0bf64e36bdb6f7cce8ad9cf362953e66c644f8b8b64bddff1e850298f5531f121e6821a393f9658237280c2a53c7c658319bc7d38f93f2d7723ef6728008843f89f61f7ecf5949a2cce6a9fd9dbbc501ef25a53ca02486b61a5de0130149d9d246925f26e1a9a74287439592a4554a872ceca53e54d1c1f4c4e18a4977939a6c37eeaab5c8d0cb5686b44d84c86d736ee8e0d97421f4c8935e926419dd68fd4e5fe9999eef75d0d0f9494cbb0297fa066b3aaca55cc229a36659be310c1e328d0b52f7747c62b1102a2d0a4acbadf0acf621a45e5695ce1393b3eb05a69ca5318e6f6b7ae5c4ed3f6072f8ae99db9af66da6a98d675a35acfe0a7612e9d5f29690870d81114279010bf7bb3d458f630f10f81a785f671e6735d7bdddf4da375d2e6d48ceecaee741a33ec1e8f9e0ce0755bec28315c6f9df363c800ee147bd412c5ea7aeb89e7a354fcd3a2c8474aed04f9a2a5fd2983380f3c00a4558c46ca472a4c15887c07d4bc8a698\n\n# tcId = 8\nmsg = 33393439313934313732\nresult = valid\nsig = 69b292ceb8e8eb52e374140501389ae251d8451b64b9efbeeaa16ab24126f38f2a7d4e21981aee6b672df3afec1a9e167686b6238b2d3617c659ca1331470e95234e2c04c308cd6bdcef7631b74c36a752eb4187bee2dd33c59f3fed55bee29ebef7ea61d26e6c052a2b519702282de7652a500fc50956091b35f9ef03fc9bfcc72f02dd55b25f88b60bf22aa785f674791e4dc02f9f2f7f04a577f860ea1761d0d8d3a0082350551786c62789b48fb21e85ab6b05f56ba504f7f0ecf8625aedee4de0c95c4f97fda57929c399b6d4865b78eb2d1da433f2488b4134fa043aa26386b47f551d7778bba8b6f379cad3b4894e106fae90a2b391e859fe8bef5e545ca3d0d908133285273fec3616798b83a6f7136faed77ac31e13a3745de44bab641f559ef5487890261ea80cd9bc67c58c7e14e9821867ecfb473b47e95bdb0003cce856f9192e39b86f551b0e3b7342598cb34d8905e117cf85b828ce0aeeb55407785e27a9687b59b8c5fe011c95638c8f1549e95658de4ec73199e3bce9a14860a0ac64ebf20ce5f0083594f40d6c2a12a07a512a191072487d8741766af953365f240335db17d4fc57390ee0562e4f8dad03dabb113a665b5b9174c1c128190c335cb748469ba2bfcaee5bcd25c845bdec81508fbc519a8837c059427cb3e0d1ba0bbb6e79849fb6a2e7f29c7d778f957a7e26fb28534ddd85ae59498996\n\n# tcId = 9\nmsg = 35333637363431383737\nresult = valid\nsig = 28dea73d9efb0b7893b1493264c30a72708c1a28f10fa9b8c7af7e0f52fc5f533012c7b87c7005857f9c55386e81ec54a94f71364798a5d31297a13dfadab5b032052ed34124191d2a94023e27a7e6cd948e21ccd33bedd37769024e97ff90db92225b6b5c0643357d80ca155a69b3173755b88fa83a4367355f1921474f97fd2e1337ae93e2f535d81423177725404acb230144a9d86b74ba3c1a6e724a5420a12f2a19b4ad6984c043ff63eb14a0cd494c0072c40f54f4d931804fe63d9bfb97ee7de83e943e12693bdda14325de9d7ad605e7efa7f42b14657fdc2a2e8fa3de31bfe2560a034aaa6de4b4ba00b056ee9d060982ff77b5e2acabbee33f3df9e58b2782e2f99a6d8f1c6b827862b5b04a02641bd1331c73804e1322dd2edb621508aed4f997458a3f52380d2ef83e8c289a996dc2407f16f6c848074d12bcda0b5050140051301371b51e808f374685f728e24ae3e937ca9d5ef890e0727375e4832c8c07cfadc05b098fd50014d6be7a0aa2a35ac990026f5550427db3b2345866d72d3085594e2161871a4ece9c55bbfbccf854a7bae0631ff101d887681006388a37228dab83350e5a15c96f7d0397cc62c388e8ce6e13b6ac727df4b1dba0691b7b96574d0d024cdb0e329e94a128924772ebed4eedb41138e7dd99d347ba50b83d1547d80b85f98ea544aa63dd725f4ec61b1b3b522409a1369b5a9d4b\n\n# tcId = 10\nmsg = 35363731343831303935\nresult = valid\nsig = 19085093b94a6bbc8f27edfc375a736a9e086f98b1d6e4280e6a6f6e8dce1f878b4007ef9c55d3e4bbfce9a6fde2c6e07ba94c55bbe8053a3a3c08c5fb981960e82221fb66a95553448a4d2f8a1cc588bd1e9c4064e9b6346bf48b153262035db57ee6cc5453483501af3668a645a930332738782f55f4524b1de5787b4cf94c2042b43f47989295c8dc1e0bb9df8a28fa321c16637e20fb409f55a21ea3e29e515f833e18485b501442269ce5426a20b77bc3a797a8fe461b1e02ab4d2fdeccc84ab2b9a2f0f5fc68218dcaf140dfacc70a990b2157f71815049d86e43c094b956e6a1915ddcd3023e6805f9267e96318c466985fcc3eb84db972dca08c84a347aba687053871956edc2bee98207fa1e984b1bd05ff115e24bbfc706ca9fbc916565a3984533a281e665dfb6c8ef40852059993aa6d87d5d1faabab4e0143f1080a4ae9c8afd4886aa21ab3a487e316fa95dbcb0b67ad4dc8992c2beaa48cd274f3506b863b33d761d8369ee1e1ca85f5c86adc826d9adca6ac77fb586423eba20ccae5976f9feea127c720ecd881bdfec17ab1c6f539195838ea99d4b8e612933cbf8c7daf928e99c603e0f633e5d89bec797eb33d782769e03c75d04c6f64f90ae54a47f9fd3835a263ebe8c61df8987443ad8ad327aa2b9facf647409828fc9716da00f9ac1d932555c9138b6b9d23d9c6d1726d63c1e42527bfae0354bb\n\n# tcId = 11\nmsg = 3131323037313732393039\nresult = valid\nsig = 882a00befcdf655539171cfc51083a011e676653b03498c5f05a4894cc3ee7963997cb440e279acc5ba37f0f675b7de685d3f29aafa58fddd4feca007c1e96d0891f9e7407030fe288ea91d579d3d6e5062f9ce14aaf9b507b7405000a0a4ae6f207f756677276ab25352699fc3beb4892ee2c4fd416e59379732e1fc2af9e37bb6c49d4a9538f9cecbddb571a5e3f28d266a1a2eb3d477bb3f13ccf776101a5bb37ce0dab135f4a5976647ee50fb8c8fd829812c5f686012a48a6ef6af6a88c5e805cc95b5d0c90ce568b596b2ae2e5934d1c2dfd7b2966e52fa145ecc3d94cb7cfe3dfa4cd8b3b42b780a212678299a2ad2c920f386fee15085cfe225798f9ea233b5528915d8a4d530f80dfe6b20fd4fae2a80ad0ac3c3f45d99313801c1a06cfcd311fff3cc409ef375f0c2486cb5331a6f56f693f48596edaac25c10fd3f985b565e657570cac4ab291cc963ed196455f7285368f6877cf8c74ee7fb784ff192638415e4519abf74d82daf72cd6794b9e82258bc1b73f08c01941bf304385a3a80085898b0ef5ec929da0cb2f27fc75153c11d0699bad1fe8b1d357ee601d5de2489166447ece43d84212a88ee665c0890347e361f362f68a195184b224f3c2f0228350e326216b043a56efb4779aece7d5bb512e3113d611db9767639934778e442f838e9bcf2455f3aa66f5c038ba28a3a8838d2302384ffff1cb6131\n\n# tcId = 12\nmsg = 3131323938303334323336\nresult = valid\nsig = ba12cba0e650918ffed25cfa35075c29f2704a11d2698311965905bafa47ac53f0cd688647e298e3bd3cd380558b6d42e1ec16dc58f6175ad2341f93700703f9dc8617e321e5246c15d371845d4e67cf04f7e51b5328ed5a86464ab669330eb97749a10ed6ca4e052a21fda6ef70de6b49fccd8d6db530beb55588d85fa05f1643a79d5ad09003ae2e5413a06a189df2633b742bf43a8ab4a473bced22e6ff46a687b5a43d6d1e1d1b2d1fd96cc99e967b83c9841f4e2934a7e044606a73f8217455beef7926f0c65714cf50d2b5e06f59abbb95a489e8dd1725b9ba6d5b6092fd660091eb0c4f47e8a9844dec0e10cc1a61d50792e1f931071188af1e800784d202f99edf2b7fbe28a120b692ba476aa431765208cf493253d73763d36c795359c7146b2c82b635b4d6ca0c1a007cddc0385ede1c589cef90f02178e302bd731b37f66fde283777b7e02b77803edf808af7c1c71d0a321b7d090e299917aa21be4a9a82ece8bca006917fc0d126cea0e7e64f6073e10c589aaf3ea25211417f2c3d12d7066aefe4c2675d8022fac6506d12e8eb19af5a2c82829bf64abc4b52846191cd6dc555585c17aee1d50d82ab3a580d616d988de71bc7ed96",
     "5a6cb90702ee4ea29af392e4dcabb97f7dd7148b811a93724b40bf40a40ecd3729b99af580484958e1884e4947cfeddd5b3df5b810f65dff9d460ce273987f58ca57a03a\n\n# tcId = 13\nmsg = 39383736303239363833\nresult = valid\nsig = 39de8c150be0071d220697d5ec83166e42d608d83841cd01eecb5b63ef1a6638befb87269077ac7ebbedd0e368e3e3a87c63163ff84ba38e51cd346a4d0617704c1ce5780e1e1ca4d2fbe72b82429ba00f9311d2ee26075e8c045ba3f4f4e11c5454819353b951e684c829756be54da216d8d0585d23573720516ae900a197ba2ddd95c76a660726780213060c0a527e4e1e70eb4a377f7766237925fff87ce798349b4ba0fd3a0c89a7403b9e8ad657078166aa427ca530afae4b66233b1c601bf043c1358a73bb85fb5b4b7f2fe24fe532400a99f778f27a81352ae27d2ca9f3af99da7c9156871b7b4f0f649a3bbec0156e638f270af6e2e3730fee4500be694b0eb4e3066d2b5fe29fd91f1bf55747e6ef9cf106eb3bbc3772a8b181d6a4878531586022415f6be2541cba38f7b950f805b4b8d673355797ef0b5e58cb9e3dcb97d6cfc182ab493c5e04f239caf2c925ec2391700d501e5d4a7a7ea08b6fc9ed56c27460e7d717aa9f8100d76b57b4fe485fddbf8e81dee4b1616e0e0ce2eae4134ac6a96c1853cd3975f770f05f077eb4781ca935e58f7dfb618d855010cfccb3a5f3243853ee413ab695753329948e772aab3c1799b8ade5f9f4b0d041815842f7745d71d6ead2c83bdd2e654f445b469e5fee1f091e708cc50e8441eb38e0a035d58aa4bb9310468b38a8342d9ba9a346d64b25b4fb6143bb72155ff3\n\n# tcId = 14\nmsg = 3230323034323936353139\nresult = valid\nsig = 67f05d7cfb5ebb3fa6f34a32e859395de916efc318bb58cee0d5dee9457e458cfbb97fbda6909ebf85394095732353b221a1bcf502b9b2cfabb4d67eac73a6720733d5d76224fc6835fcd8937c259d7ed7bb1ebcc7517c3b6b0fb67a4998838f529b8be2abcc8c2cf10b60a19b9fd4139756b766827bc3cae375709ebd821abcd97bb4d2e5f42f56888d67cc159b9d54910316042a4acdda5c507c66a055f55281f1eb4b0a1fced99560878109be3c04eb62633bf069d86f1a7496b5008e7009eeb225d1d4d0b377ccd4029717fc7e55a26575059e4b90fc735f8dcc45fce928ebd5c116afdb631f6c302a213a71aa75d427cc805ef5c9cfed95a1e3470dfc1897860e459f50f98958bc4ba630aa855dbf5799dd564c7dc8c67797dc1eaf51396e4984e345b847bde407541c68c13fd29af83eb6e15bfd092641c46da3dc7537d07d83c343cc8bc8c6064f8e4f61915c555bb86b37ba73dece8f9a0203da68ca9ce7c874c2c1fe516952acf953b61b70c5424b17123020fcc64bbfd7b5ed9c4740971fefc1743beab357e466a35a14bc5b928a625c607799206c76a0aec7df6d9988f2dd266d41cfcc654fa23343d39196b3a10f651d8f9cbbdb410a629fa10efd840b85da03839d96e5744a0ba785d5f90e0e797a053b8762dd7ecf805abc99d648e97d603fc4890119942d3b9b9ad4e9391fe453002ea2059dd01ad7edbb73\n\n# tcId = 15\nmsg = 31343531363639313830\nresult = valid\nsig = 5b382b1f8b912347b40629ee86f870ef85da6ba37f8fe661b6a6af3e4ce714e2be967f149e1bd52224315c87e184a62537ba262072879a4c8f13c8534aefd892c074bd214c7b915e87fdba67287bc0e3737a13f69ea9c18fb9329ae08fd35b692eb7721d2816568f5fbeed25da9df0ccc0ed69a9cf2e299245b4be49ef11c956f182587062c75cc87a3befb1882386ed503b658756300adce5268270959fb270add0a61421c066aa8ffaef45428885176a466792ccd4af9b4ac03381b4e368eebb4a75ba4507e61137dabe41aab8239cdd9759766db0ba6420c967f008dccfd4537528c51dd7b9e95135fce34664ca0556a30e9bbb531f39bae4f6e15ae266efb39dbd7d9894c3022e8e5cec3808d8f465115f85b411f0b6e276dc5c6f2b676d6ffe8427112b3af2cd99137d25b109839c7661d8376e3252e1f8bf9c5baa524c1bd82eabe0228b2c8f2b186898a151d25192fa6266bbaeece357117b46dbbcbf4818de758c5892ac548a47c8631d4754d4ff1d13cfa3a707edb5dd8fc405545a84f2a860f4f59d587658dd5ef20681fd590c91245740d575d127a1173ca8969c4f69ab10bc67cdc3ef5718fc317cc7915bda8e97a5d674ae63da735abf9e119869fd76e816b2d9eb868cbcdcecfb7d3a22db60e686033227483de816fb80dbc3d0abeda3d3169f298aa72fc20e305d2c6df1092c8b406e48143a3a6211020bc6\n\n# tcId = 16\nmsg = 31303933363835393531\nresult = valid\nsig = 3d85ed8630bf31cdadca8fa4ec06e69ca8e9edca84ef2b5a9d689fc77ac3819fe5f1ce370a060e294425ac97c4ee2abd4c45e8566d5467ad19c2eae4ec85f3e25d0888ca4f739ab93cfe16c034295e075083702baa6f283428deca6d24c8083935c80c08e68a1c622697ac1989a6bdb26bf88403ec06685eee11976108c3abfa602b64e6dc62d53241600b71c85c0c9d5f30a1379b312c2cdd6051febe6e343ca99fccfdb53f0852730d2bb5585d3c344d9091cbffdc529f780ee7aa8d807e54c0a49fdfce3b2cf659c6cc214e2f3a8329bcc4156408db4a49071bc36a4e018872c6d8f138da58e0877307fde9650a94b98882e5686fcea8524ea07d9d67ccc6f17d914da6ce80f0ca32757cd5cb4357f419a1726006a2b8e5a3a5a2d93e3af8a8af38d12e409ed8cc118ddbf7028a4baaca589a5b937997097189160f36b9e38bc29723d2f8f3844963de7f0742dc6c7f3a183d0729efc785d280cde8c1879eb75a53556f2c064eb114a24bd36e498216e43f60f16dc231130f5a393ee13048c1e7830e2c9453381c238b730db88b186447174bccd5f297bd2b3343309df6ad047e6734980aac77ee15122e887d4109735a932401a9be4b02423171f26cc3c0c59ae1870a5d3561df937e344dce45ff2c03bd8ed634e61cb0a6655d8e5945d77e119f955103c7b121105e993389f44ae306d901ad9a568a90eaf0b6eb503fc8\n\n# tcId = 17\nmsg = 36323139353630323031\nresult = valid\nsig = 3ebc127c8ce530268e26be059e0db2f580109f0179c7694d384ad01f257effa13dd90dd760e011546e8f8185fa754d7f8f89718675c818d8b22d94f4410ba577778ff90207602e19dd66f7296548600ed4fd03ca80e706624b715c52dda105df29661759c39c3844a469f52cb187a4f51640c2feedeb9411d96bc9f79700fa5ffbdcb87183d5652718a7dc63f0fa5885f2b2a95e0a79294289caf3b998a747590bfd2f0054e844f79c57807cad58bc664d6c4daa96a6262f4d110e3bc456948ac157f067f7a999d789e1462af0c59bff7e6fd128ad3b04d3bc0863e7343ecd43c01b16e549a4d684f1ae5c069f5f48eb63d64b8c4e53decf1caeb545a7e3f7b62de1ea5cde0c77bfd03ed690c15b9ea122255d34252b5a59a3464d5c4e4187caa9143506088b62778d614a01cfeb6ae07cbb91ac1ce5e63769afd6d3746ca90bf387d86780e1bf86c6653112a0dd193ec8bfe26a2824694f28dab211e28262a45c54ba8e1e94e21e61cc282a3b9131709e0fe5132e27f3d8bb20e69ea99c972bc780da5c58448844635090da5aecef1683a663a7d8c3f65ed98568dcb3c5199c5a10ab41ae60a5ae31968f5ffddbdc30a475b02f18d97b0d0ea03ece8c9f06be97b3b76418cb57427b988cbc2f8c13607c8fb97f30f209683c2b25b1582b7fa99619fd62f36481147f4b1296b1e19c4e867d2f240671475d730c7c6e19b5b5a9\n\n# tcId = 18\nmsg = 35363832343734333033\nresult = valid\nsig = 2484f823b830036277b6c888a551a134afc4456e0f11c90c7de87443f115615a2c3b5cadfab075aeb8d5b044420b8b2a98a58b1601d4a179bdd2c28299386bfa8bfa23db3c0a32214a8f99d2d2bbd202ebd5d6a7ef645fb823ea7e07f1f0f8123099386a011d78b8f7d74391cc4c1e82d5f5e448e44b62d091d0c923aeaeb3dc0ebfacfab71956d6d05ebfb6b384a5ca850b4efbed24bc02410b68f72218bb57ef7d3831c777cf48e5ae455bd0fbff0533399708c02a3813413e877bd0d1f0ffc21489800bfc70f6d3f8e77dd2f3bed5d298a1677e75bcd2886e84b5eb2884642a560826269e0445c80d695ff1ff72496dbb5853f72affad202a780978d5bc18f87bf2562021016f6d6a6b94dc7161ba220088f1e9a6000b2424716ca33d3e0e68e332778e19297934634803cfd5ec4aec3de2f6c8606b217717cfc296bea23fdd61827508643cb5fe505ea14c2e6a61544362d4d541fc41912ba7dce58ddd928ce8b8ce465cfffb97904a3e961711a24a019d25f2bba8d65413b3de82cbb04f2975b87a95502c76921b550f545e6a659afc83c1731dd8bda533b154129883d9aea6af532adf3625712aa44ded67ffe6d90bc95357d446a673cb32487195ad20ae184250abdc7d3a08d3051044fd9eb1049272b89a2e98f1a35b2e0505793a8fcb7448c03c8f46aeec03d1cbc3eca5a27880c8b43a2d255132703c40413b2446\n\n# tcId = 19\nmsg = 33373336353331373836\nresult = valid\nsig = 76d929733914162395018b1641129388337fe075f1ef22857bf1fca62902ded0a7f6ea25a0b33196b1a51145dcafd1545c09daf6d4d453660c79b61993df7b3c3207b828920ee1fd030a29233e35fda6d8f96990acf3cb5715b769b4f8d1bcbe3d686527fed6ad66343012e8c9ca8217c7c3dd8a8efdd052652f7c9a89090e598a6a60753b2c8d9ab67eedb3b3ccf8fd755d116eb1b089b108f85ce2b3be6ce8b11340e57dbd8c9b3acdceddfb53e6ec145f7622e184dbfb35ae46d75ff43a197703b183196d8778bd06d5d245e79f6c2e0afaf9771babb9a88ff06d0300be38a6f4dd00a627df186147c91be1d2ee4dd1096985e37cd2754002c776223ec0aadb08a3279b0839c67e9e2053344bd45d487f65ddc1a526900e909cf1ab63908375a5e0811a084e481c1f149e58078a3fe8abc9ca195587bad6bfbda20beea9c87b122b55cac6f6f65635e655cc0187d63aff5a026915232490b43f35ae2b96d7a73747d958aead23b60784eacc6a7e6bc471f850adecf8e2b53f5f93c4b8a40a27420466abbcf5e554a35d40a2f0ce4447c23580193df8aba421fdafbea91a92f74f2f9d8a565251dccbf07133225b40ae28c33ecf8cf6ebd2703a135cc6420628304d13e5b65bfbf7aacec056664694126dbcfb2ec2334f04bf4e4d9227444b07737a4d7d7ef4762b53973b900320e589a08d0e6563086534b6fc6d939e0dfa\n\n# tcId = 20\nmsg = 34373935393033373932\nresult = valid\nsig = 757959f7d8edcc8d2b843027b0e7be51ef30769b79e7393a550ce13ff36088c49e062c19646b68a82fbff82d8f54efdef5e4a412faa075936fe83bab9d5ba4c16be9b50a45a8196769c899a4fda1351e0bfbc0d3778ba2f3cad6853e9b59fe1d5c2b6ccd3ea320300e55337991ecea2623f2fd2088c1a152acc9930b57aded1bcbc7d615e43b3f03f2568248b11fd0a7c8706acda54ed825a8a26dc5b745f26dcf0f6c6f6185170c7bcc94e0917160346a54b6f16596bc5b53d19824b77440ffeff031",
@@ -4023,9 +4122,9 @@
     "3343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 164\n# signature is 1\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 165\n# signature is n-1\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2\n\n# tcId = 166\n# signature is n\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3\n\n# tcId = 167\n# prepending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 00004a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea144143\n\n# tcId = 168\n# appending 0's to signature\nmsg = 313233343030\nresult = invalid\nsig = 4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea1441430000\n\n# tcId = 169\n# truncated signature\nmsg = 313233343030\nresult = invalid\nsig = 4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea14\n\n# tcId = 170\n# empty signature\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 171\n# PKCS #1 v1.5 signature\nmsg = 313233343030\nresult = invalid\nsig = 12813153b37fa6c0fd755a1c7c409bb8169c5a39d045dff2da02b2f8e8897b0cdc6c2d40e6945b97006f18e1b26983f77b70bf2961b5e5f2759241daee8c56fca7c53c81f69d3a0341720d9761a4f7be8c068464e881c85a2c39e0ac6f74f6f5cb42df8c3713f66a282d7fba85b7a09a6af83a068b78bfe83ab25841e4bc67c9e40cf2a0974f8875fb81cc6a115b91f922419c44ea82b33187521a7e1f46c0ab9459b4e97a3f4a1d9e92403a37168826fa0e",
     "e914232afb6c4d7dd082d0c58885e356d0efb8aa9ae33d045f24b4b3182d5c54556f5838c449d31a49a3ac4ba568c248ed72c111b5ffabd991ebf5c48efbca33cb38996d584992c4abdcc7b93700ca03619412a355b41b000a32f6cc4935f942209b56a23cfb7b788dceb692343995f77daffa25e44d672f8bc451f776560b415d0d1bfe9925af1c2567a8e9bd15b8554d93377c62b0addabd27e8d9e0859f498ba8e03094e1d86d41e69f7606d9f1fac04744c3b7b8fc4942a846e2a3649bd9416d500b9895455fb6741ed8ed4f426f20ab40d8ab2e6cf6c63f5c290fc011768b317bde49753efbdfd12583f1ca79287225f9c3d3ed0c4530815e4f5e7ed78d14aec0d04142d0ac0fa3bb5d73b4bfda2fe7103a2ab40672abf08ef4d9e537b9f856d32450e2e41d9277be62ad0675d1a530709f2747f51f17aba10381fdc70c626bab45d51166b6f6ad978d2dee\n\n",
 };
-static const size_t kLen163 = 350237;
+static const size_t kLen179 = 350237;
 
-static const char *kData163[] = {
+static const char *kData179[] = {
     "# Imported from Wycheproof's rsa_pss_misc_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PSS\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 0]\n[sha = SHA-1]\n\n# tcId = 1\nmsg = 313233343030\nresult = acceptable\nsig = 88f4676b502e365dfd82805ac1db27d1107d1516431ab4f71107b62625b6275af4a5dbfd8314fae255820c0cb577ee2457f510851d2678e4ed3e6839848aca8b67c9ce52c5bf57a01b6683828d03470034b136e6ab1914adbb1d918fdc31f7cef6f44b0b0ba0dbd6c1d3c8d7699ce374dc86c28beb3bee8f81f41162344e688af0d91297da0dd5e8104a5440add89bdc6c05d20a164c0f079b78654f038d443743f94bc45762501034a32b5d05bb86e75dd9a171c81dbe43edf50b2e1fc24297375331d78a8f0399d4aebbeeed911f6d964049e67d89eec0e95443af2ceb37125ea8431cbad2d8416fc15fb9cbed9142fb8cb06dc7ceafac056cc1f6696e3d93\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 20]\n[sha = SHA-1]\n\n# tcId = 2\nmsg = 313233343030\nresult = acceptable\nsig = a85f06875b529ca61b60df404652e79a499f81a0591bafa3377b80d8e300cbae679a941832eb5569fb88c9f8629e3c2ebf5f32ffe43767d1eaf59016f5904de3f7d39cb470dfc5fb5678fcd7b55d1a30f716b7f04c2568f3c1a2bc780e974a363adc622e679902e966af183d874b35396423d1a263bb1c6e7330179671644c6953cd795a19e2fe4208e7da5244e4760dde142313a781a55b0baf866dc158812a723d74911c8717a512d722669193f8883b1cffac98de8473b7a77198e20560c0c21207e00fc7dd14385fabdd530d568d143ddbee8d1b502f7b194b9827eee9472f2be8b2a541124405582bff393412f6aba9c42e5824d7c24bdd4d82d925d066\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 28]\n[sha = SHA-1]\n\n# tcId = 3\nmsg = 313233343030\nresult = acceptable\nsig = 8189776015db3a51805f6bf71aa1214ee07f7e385510ea95a0d4c3d53bc0d59f07ca39af40fe8c3138cf6f4ba0f72a3397df6ffda9cf49e467a34d92ec772f6b6d51d52cef86d16f74bea798a85aac873cd4d5d3a0fbbb618998f4b2b691bc14fe1f235601c51a76c4eacd1a33975d9c3cdf1daf579fb943556f0febd948d1b1e15cc85edf486b00499fa9032b6b801b5ae4454c94d7f89dc1fa6dd6a927969b14a4bdf51caf7cc8a87ae05d41e1933849acc5fcb0f478f1e23a0f476372837ade82f8ed1809e2245062009b8e683f563029ddb9892a398dbc2df594c12fb4a0f0c551abdf2fee4cb325fe9800ea741f7b2f2b4db370939bc7e3ea95ab539b10\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b95489",
     "1cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 32]\n[sha = SHA-1]\n\n# tcId = 4\nmsg = 313233343030\nresult = acceptable\nsig = 49e060ccb577eb614274db1ad34249490d1cab2b8d3ae2b708b93c8a8ead302e6efb8d26644d5caa5f62b89f3949942d07470c37d8878eb5cc9c154701feea36ac66d0a9723fb316f7ad6226f634346c17ef47b3e19c7b9979d60118959a5b35cc188200c8f9b2723046f480d95a9a0af07e648225dc35114d8199a431ccf4f44fe8e8c9c0130aa819aeecb09f95eea8f6d89981c05cc82716fe7ea499c55460c95e99871aba1ad3ac3bdbc96850863b23e3e6659ca346ee0e186ad717a8ec9c7a548d8fed0e7b79f896722659ec7e1335de12f361d5e6c65c791441c3c0020de48e60f200c3ab79fe0179513b2c1592e2f0064ba4799f6a0eea199da77d174a\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 48]\n[sha = SHA-1]\n\n# tcId = 5\nmsg = 313233343030\nresult = acceptable\nsig = 2d4216f277e50736d41cda2191faa97fa99d9e325b34926a363f8dd73c901153f087ac206cf3cb25001dffbb6200b7b35565b466f46f23aafb872e5c39d26156d36d1bab19382e5f15873022e64b58c129d38eee8126130f6210fa5ffb697bb3dcddbd99a9b60b53b25d094f9ec9b7a1cdcd0cc74a3ac478c7a34cc22c7e30e952bfac85638678b8aa2341fb1f108114d43dc849d91a3b174b0dd62f6dfb96459d4c76ab5fb6479d68d690d4a5c120c42a4bf82a8a7e9e7aba127fd5fda3f4c6ffbf2e4eeb72ee695cfeb286ec99e7cee8cf300e4e149cf17e70cf9f2bdb6421087916e945bca42a70a88b1a87e7ca3ac0a1bf2ab1a65ebab7726994a6c9597e\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-1]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 64]\n[sha = SHA-1]\n\n# tcId = 6\nmsg = 313233343030\nresult = acceptable\nsig = b66294f7b1e1a673e566c59f9abf264860200763860cbd666e476dbbd61fc39136353ab74299cbfb64bff88ed51cf9a20694e832fd97235d31ec6aef386ad44487d3753cc1224dbd59a34babc3eb8b538c10705775a27fa88ae35c0f618e0b3c6b91d999fdec5b86f15d1e462feea3af6fa12a5234d526e82039e1df013ef1cc6056221b81d755a13b70c618cefc6dedcc3361b5a910fcd4a812ae48382fddd75d5b51ca3d243dac021aeeaf6e2bd4aed75d7ff6d81c9aaee2356e3d12192b5e75d006b124275b0daec06b5af29b0d3e85f057db59db4b887fdd2bd0a33865eb87e8f3e37b4d8621e2e41c760a973f1ba03722d42bf5b921380b71fea949cf0b\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 0]\n[sha = SHA-1]\n\n# tcId = 7\nmsg = 313233343030\nresult = acceptable\nsig = 513db066bc72893653d1f7fa3f19546281b6239bc8390c4984999121a1dd75aa94004c3874beb6327205f2ecf8f6eb93eab018de3a6c71ea8b2d3a628188d4aa2b1cd6bab169f3e78229e4383ab68aea4635935e0eabbe9dc1d671416945f1867782900da53451369ccbd548c8f756e7221ee7e1ff28dba099b8f28d1f3aad2ef8bd816a53dfa9bc88e4e3983b0de955e647caf71a607ffea2",
     "0a9677e687cdda29219c7daa839276de3fe436b96b2c68db64c170ab9e300ced00e72a9c0fdc321a517aa113cdec8e2713f8b54ee2d78820f6f86b2f6e6222493d15cbe8ee9815ef2e7ca9a6ceb55955049db35b1af188b99f2c4bce38f130a75780f41b852917\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 20]\n[sha = SHA-1]\n\n# tcId = 8\nmsg = 313233343030\nresult = acceptable\nsig = b3e943f3982a29d0c1e241890ebdd9e734baf85bd32de80c6240e34dd1f7f0ca4f37fff2c373f9718e7e900df224d155c4463c66badc8fc3563f36309568436bcbef1d83c63e393d9e1432d50541d45e54b7af1b18cc819d9eaaa65a4b1e4f37ae16ec75e9f44a07262cf3e2dab85a066d92b750ba1cd2a1d42493868123f18017bd9faf1de1a4f87a3f9cf744da1eafc761b7e24c9929d3dfd15d1b08db1e3fc64932816095cea495e0dbb82842b5f3ca90dc7b78895c1f12ba991f3bef6f16451a84880fa31cdfda6b9624a77a3a0489fcfdf6e07b89c0689b5b7b7052372a2b1e06a3457b027285c3b160c0de1dba4910c0162ae8e737a3d7dd1e05c77ace\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 28]\n[sha = SHA-1]\n\n# tcId = 9\nmsg = 313233343030\nresult = acceptable\nsig = a9b9eef8197c973d6a73bdc165f40f0f53b05848c93957aec2785fa92a9cc6397418a71870f1bbc21a39b244526b4a39a538d149cde62bf8f21f3eabca932751da83120136c48073792c55e2eff4e29e6973cd3f1090c5bf3ced02a1ba4c145addc674d33b0a285d73d14bcd6f374f60c95c4184e2d57388e9c73f697ac0af5116ddbf5081a8f99ace11027835cb3df8ae785491f42850de04b3e01b9317bd04ed488ad72e787c728b4516c7d839d388a2fd7b21994ff3f5b7f264413bedd3d8a5258d2b39e60411de1ee69fe05f4e76b23a9f50b49f7043f9812aeb81cd54cc1dd9ffdc6e73580e2cae821579ba3642ff7793a3995b136e057d2d2ca7aefae4\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-224]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 32]\n[sha = SHA-1]\n\n# tcId = 10\nmsg = 313233343030\nresult = acceptable\nsig = 899a49ab1511bef8727d1ed7093bf7e6a77fa8750d047b203740324d18fc45b587d3392bb7abbe7e6bed7bf2be2fa5e355f8ac5452e675027dbec1835555d059a4ec44120f499e4951cc3fab33d3e8154a4340d29c69fb50728c60eaa58d61b75cfe7efadbff55fc0edffb4af9719cd1a3b2a240936eb6c2ad70b10b72aab7e64d9fb17ba8fadb6f4f0036bc22d5779705b02d261b8c9be700b65c066c27be02db353f4ebcab1ccb41c4bbcfef39abfa8999196951209558463aab1c6d4917ae97006199daaf963666d85c133817035f36ea321714a6b20dadb355a226257fc0abff10c9afac551bb7c3ba9e44737f45ad4f9b7f2db002afb7ad61cda0d96538\nflags = WeakHash\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afa",
@@ -4070,9 +4169,9 @@
     "b0976593ab6c6635d8258a7dae326dbe65d203951209f8ece46a4132efcb640bcbd7990a6f0c138b456688d268150396eed52b5553f091f4888642b18580977d80680bb9c1194968bed4b0198cf72d1ed4631a6c16f6ea562c6cf344b3f8d1c2fddbcede647c91d01312b3609345d3e32df899fb981f070ed1c0740d79eb19f6d54725c006c0cfd961a2943391baa2a32e4da6dff7ed0a2a61fded39a85ee642c1e219d9ccf93faf80e2c2135b0de494f8cbcec5bb77f75148e83ba408\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 0]\n[sha = SHA-512]\n\n# tcId = 145\nmsg = 313233343030\nresult = valid\nsig = a289625f9fe684d186604fa08140f7d522dbec8ae6266ce83fba2b6bc6305e2e27bbfb346165b4e110e1b3e9445ffa8933e5417dbd87e3084835b8677ae439609616f7b755bbbad33ed0257a170a3964b85b3cdfbce43ea3c550354a92ec8e75642b039e2b4d9bc77b84c6bc7f2f2a43a0a403a1992e008786b5e9e43fbe71bee787ecd99501f1204921f61ec0ca83f1a8fb7862efe69b104d822ff5170802d510fd55cba7dcc2b695db905bce4c07a702cdecf24381f49a9b95d4805f1eb51704ea198653f43c3f124a4347ea1becd138cc3fd43e813ed823c373a35eb9060bcbb8fefb1c453c72f1f6198747577aef14ad3fe144b7d8de1bd6a123bd9f3f96\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 20]\n[sha = SHA-512]\n\n# tcId = 146\nmsg = 313233343030\nresult = valid\nsig = 740cc94a43653655eabe5a2c9f883a3784cbc5b13161e05ac0849cee39b2e8a42a0f53d14b47ff61d143584797ad0889b26de17b0c27c79a69a356e2e3eaee2b8675b0aaf68dfe682df23463b9b780f5b4d6681c00b27277e4e7839a333b022a16e7b75418fae9d5f5b3b996427d518eb1a696ac83ce6c5107efae577859b814100f19c52708481ed03d038a4cf6039f91bf72f4788dba51179e3c95c750a9432af1044f7cc758572ff11c537add14a6618d0fc1064f762485a0ffebfb0cfaceff4602367a231cee6ea2c8407bcc88267f42189c02e3438e62e3825d8667d1ae221494d4e29626caea3a7f5d2284f18862512cdd4cd9cfe1d8d57cedc9960299\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 28]\n[sha = SHA-512]\n\n# tcId = 147\nmsg = 313233343030\nresult = valid\nsig = 9a8092d3e759eac9374356b3bda80d87c6cd1f1188dc894f48bfcc2d15e99c65ffb6353510998a360f28bd636c61edda93ebb903029feae9b2c3935b2870f9a3f29e044f3ccba9a08357226d48f760158cbe5bfc0d7c0a2eaca0b1b167745bf26ea1e008e7377a085f4bd685fd5ada6602758e27541e6f270adf6d5b1a2b6c65a3757c5b3c4c29284e7cadbd39f4cfcb4253e959945651c60eab57ac0170da7ccb0c8d72e760e603c755a1b1e1356e968989cec1b9e1273ec2c572ed7dd0d0d29c0ad1e77692b0d79ec60657fc21b746168dcdf0d05a3ef1f37a4ebfb199cc167d94cc2c9b75dddf113048326797a6cfd6c9a764a6c71131e5f5654a93fc83a7\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba78",
     "65dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 32]\n[sha = SHA-512]\n\n# tcId = 148\nmsg = 313233343030\nresult = valid\nsig = 3522943f158039aa68354e3c51eb6d9a496f5c7e7c33bfe9a20cf98caa710b88b18ecb6d73177787479d5064ce3deddc13f98998a7207118de77029e8fd5f012a9e056b972a974cb5b087b6564821af89ce3b64348095accdea8ad7d05cf3d21d6208365a1d2fcce7cd964295c963e5fd495448c0926de0950d12c42e056595295c4376484fd7d0dc6feef3dcb41ec5a0dd21eef375e65523bcf5af70a92331beb0c6b5ac445d6a06cbebeed0083b746b3d667aa366c647313389a2d9b61d41eaed8cf2db8b4938115700967432dcc4f383278b4a397afac04bdb7c2f5f6051854174d85fb96525c2ab7bb58c0ffb481efc29d08e4ad1a86ccfcbdcd98974862\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 48]\n[sha = SHA-512]\n\n# tcId = 149\nmsg = 313233343030\nresult = valid\nsig = 45d8ed4982ba484e0bcfca14537d607fb6c3f8f444425bca05cf29bd5f92945f0ac211ccbc78d934f6fd24131ae88483547aef01b4e70acd6f84eef74d4a2de40b4d15d38a0807087a54ece36f268a60b70c500b72fe0ff49920c63c0cbde6e0d9100f4e50ea3b5e11a595f3755878bb1e03c295d3e73f1ec32d24d629f2fb469cea48346c057abd64f6bae4cbd0fb89076a1e42bd5260cc5691fee46762136f936aed35cdb6e1579d586fc4e166fe252778a379c134562175e17eecf758c11eca66ad259aa9e51e504d0d317b1715bd224706d65418a4601612e482bf95c1e9e9278e5401bdf1ed24118b908a8e42c562a76896563fe4c04d62b8abdb61e4cb\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[mgf = MGF1]\n[mgfSha = SHA-512]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sLen = 64]\n[sha = SHA-512]\n\n# tcId = 150\nmsg = 313233343030\nresult = valid\nsig = 63942e89a56b634787dbf074e75b0525e8bd3b7b8172f2c27499272b939a812ce2f501eb95a64603f9bc7c2120ef2f7133c3b2a4bf6445e2257b59e57022c879f8d60667ab8e28dc972846670858fc0d5bdbfa71dff870aac96492214533383d8740d84ddf61d46f852c6bf0bfb2d10c2e4d41ce7eeaee028333dfe77650b53e66cd2c2991b80c32faa33aae27b1c30c0ae2abd759c59eb22e0d0597b6dd63491e0c95048c074b1d64d8f356e637669d90974f4eb29ca184468bc1e2d24cfcd36e395c41cf3703cdb1a5c206fbdd4763154e5569d04d75998e6f425bd42f80e0dcd8deeebc3322aa6f50aa873345d7c9a0522154b6de2387664ae33764ffb2a9\n\n",
 };
-static const size_t kLen164 = 236014;
+static const size_t kLen180 = 236014;
 
-static const char *kData164[] = {
+static const char *kData180[] = {
     "# Imported from Wycheproof's rsa_sig_gen_misc_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[d = 5ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801]\n[e = 010001]\n[keyAsn = 30818902818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d90203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d0030818902818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d90203010001]\n[keysize = 1024]\n[n = 00d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9]\n[privateKeyPkcs8 = 30820277020100300d06092a864886f70d0101010500048202613082025d02010002818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d902030100010281805ff4a47e690ea338573e3d8b3fea5c32378ff4296855a51017cba86a9f3de9b1dc0fbe36c76b9bbd1c4a170a5f448c2a8489b3f3ac858be4aacb3daaa14dccc183622eedd3ae6f0427a2a298b51b97818a5430f13705f42d8b25476f939c935e389e30d9ade5d0180920135f5aef0c5fecd15f00b83b51dab8ba930d88826801024100e882d12d5f0be26a80359f13c08210bdcbf759dfee695313efa8886919659b064e3c656a267af6275ed1af89a5dfe9e25b31a02bafbd59445b7507a22989a681024100e5a65cfa668bd857d59135a78c18c8adb7c222368e9d74abad8e83299f7ac3c2ad7aa44ddb05deea6d9b20dbaf09a8615284a17c72d3723240334685ea7e2559024100a327c8e8f19d4150428f5e055a3ceaca846a19e30d45534ad60d894b56caf9b1bf0c9a8d965b0a882dfd2e1485154ee5cbe052e8d4f525c2d5fa9554b1992a0102410091f17ceb411a247e056287f79787f498b9cc2d1400e43dce10b91dcfe8e30adf80820d42d12b54f4247dce8eee193421cd602e843930f944c81a0dfa730081d9024075915a454770b49082423761244ccec65a6e48ae9966344b675610facad9162fa5bd1cc5108c322c2fb3c144f807773a2c7d097f63e5c8d3bd8ce8efac2ade04]\n[sha = SHA-1]\n\n# tcId = 1\nmsg = \nresult = acceptable\nsig = 03e64d148e05201b021fb5d3d72ab6abd4294be6c1673277ba5822ad2fe7ce4bb29ac547b2fdf09c2894ea0e31e76f1b3e1937db91c389467e9a8ac7be0a4f674456f01c5b4fa4277a26028b49b16e25689827d0a4b9f1c25a63350dc15131da908a05c7cfa8c08a67ac9efe3b0cd04aba7db12064cbc36729eaaec540c4bc12\nflags = SmallModulus,WeakHash\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nsig = 1d19763e80121e228ac4dbb3be8448560aac613ec74b168efe1d8a8335b77e6d8c3cc0f641de8c8e26a2aff9d32a4ab77340912fec0e60e89257b5b6b19c8deb866c2d2349fe63a06ac6b72397b478cdd4198ead64f8d36b9df29651e95ac7b886978cffbb5f7498f136b1ded7580cbcbb31620415eb71cdb5bd615b47eff813\nflags = SmallModulus,WeakHash\n\n# tcId = 3\nmsg = 54657374\nresult = acceptable\nsig = 0891ef2061c4d3377744cd7243ccc444619df533f4eadee216f7ffb9244e86d3e0162fc82c0b9502dc7aeebaf7884067e5f18f21b395c43bbfce5559ae84157ffde2aa457b7f44675e706af443acd9e38070428dfc6471a24cdc0d44f9283ac158704ad114375f10c24e3adbd12c55dabb78b8c41d3938124acc74126c82bb0b\nflags = SmallModulus,WeakHash\n\n# tcId = 4\nmsg = 313233343030\nresult = acceptable\nsig = 8277e8984d536f81667feeee7e24068ca5bb8b815210b3e9fa82294e11cae92c45164c9dd5683be4650e4b7709eb8879f793ae804620750b26032894e53333158f6afa6b52318e6c730a4a55d5a0fca6d029744f2ecaa2e00d3d6dffa0716acefd5c91afeda74b7f1a1bd7e635283bfa2142ace513da24eb8f25f3578a401ba7\nflags = SmallModulus,WeakHash\n\n# tcId = 5\nmsg = 4d657373616765\nresult = acceptable\nsig = b41191a7a1d11e973600e9a28c8d6e6d1513f7d970cb05ad50c686bd6fc42b7848559b2b3073a8cc9839f464d82f8a7d864cbc9698cc1a4b5b8c8103d07e9d79e5d24e1b3ab69053461bd76ac3b62935c31ef9f0c44120bf5c0a012eeedbd2a39d347cf6676ee8c81a88eb87eef2708edd793ebb79d6fced626e6475681fe73d\nflags = SmallModulus,WeakHash\n\n# tcId = 6\nmsg = 61\nresult = acceptable\nsig = 29f69d320ea3221cd0704300f456295becf54e877c2b9b2704dc47ef992588c7dcc1648d17172d8c76362c488aadb3437be488fe667a192c5db1440f70d102361d7e85ffab370c7bdaceba0d15b1f32ba0801ccddc9fbaed1323834a60d19ff13ecd46a27f06e79cb0d3aefdefc0c69d8e85fbe8761d83f35e362355ba675933\nflags = SmallModulus,WeakHash\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nsig = 9aa3040e7df724bf506881f6a92a133ff76f6a168f0f3ced70b3363835ed6b655fae6f39416555af4071c16262da7556412d9905279d666f9e15fb8a813b313d00007cef3ed2be306b9e29e6b69c2c5bebe36aa057feba44ccb6c8619076a5b23f39729ef78bd6478249f34ee99f3abeef37c504410910d1ad3f1a712c8d697e\nflags = SmallModulus,WeakHash\n\n# tcId = 8\nmsg = 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f1011121314151617\nresult = acceptable\nsig = 1fd0610221104c3f1e7f49d4c77c48bc169e630d5471e41100ba58dbf0ee0d4731a3d5b3c8cf9b07ad116e6cf65787650fb90bc85a9c4fe9940f4754316772c4946022178a3becbaa3d9b6252ed1353f7de834e0ac6d95d5a1f81453e89650f5690dc078df80dfe8ab614ca4881e7b001f9a11a4464b1004bb537f2b99624deb\nflags = SmallModulus,WeakHash\n\n[d = 50f854da7dec301ab50d81761a575b0436ee7a6445ef359b7bf3ef374ab323883dfcd6e6c2c43fcc1d71d0d6408faf1f5992c69846911fd2a438068fba46fea5c108f95e307fdf3904c1cba6f014c6555a79679b843e5397e2dffc5e349d7b8666bc3c5e411f39f0f2585bc7bda70b84b8f5b08c9260b39d3e8603c88d128fc1]\n[e = 010001]\n[keyAsn = 30818902818100dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b0203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d0030818902818100dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b0203010001]\n[keysize = 1024]\n[n = 00dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b]\n[privateKeyPkcs8 = 30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b020301000102818050f854da7dec301ab50d81761a575b0436ee7a6445ef359b7bf3ef374ab323883dfcd6e6c2c43fcc1d71d0d6408faf1f5992c69846911fd2a438068fba46fea5c108f95e307fdf3904c1cba6f014c6555a79679b843e5397e2dffc5e349d7b8666bc3c5e411f39f0f2585bc7bda70b84b8f5b08c9260b39d3e8603c88d128fc1024100f002a2625626ade6f48c6f981017968124de0e2a8fa38d6bc4853e1bd0b48ac327610f5e566f017bd74bd5134cc9fedc2625f0f7370f42249663e31dd58c4ce1024100eea660e905c086faf3d3ea3a94f2f9716a0fa760c170edc81b64a05cd5289ba8def634500068682dde0600531b41cc3565e9d6ec3b4ca3f3385e85a843e936eb0240667ac979318ddc6d23f81ee20fe4f2777c1570790dd1e8dd9e10c27f3ff306d8e324975a518f",
     "9e53918f2890d015e3c37e6a6ee42fd74d07b04b403b89e619210240609d72f663a1c203aedac824d75056b417a026bf01115af27c448cb788845c204dc397021c68286509519ca8088ce6c36772f7d3c35e0fb1d3cc5088029653e9024100b1bde8f7c203566e12f11e23319aaf9cd671e25579a22d6d153eeec123b5ffbe7fd6ae6a0630ef956640805b9231d9b5da97a0d1d83b55374c22885ebff7229f]\n[sha = SHA-224]\n\n# tcId = 9\nmsg = \nresult = acceptable\nsig = 507e6233a3c80971daa07c13f34a532d53441e196d642fd6564b347fdceb865c55dd47330587622a30f8d4ee66bf8f163c626f8dd26b313bb4095ea1ae9d6a96a24365f4c20056998eb9d1e3f2e1c78257361e5c21e5ba76320997e8cb30021e8f11a580000891bca3537d7a2c0972e06844f1a01a1dbc9a3f8b8a2955f7005f\nflags = SmallModulus\n\n# tcId = 10\nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nsig = 414de39059daab523a725efe437d688824a43689766b33136aa3e6da0a2fcf1c2aeff952605c2f1a12a29e36f282e59631f442af96c7659e0717bb24807835aa06f034906670b042f8db1cdcbf3c54e25472383b6b9097a09bfbd73b2e7c10e18731c6bad47af591bdb2d376680f6cb62048a97c19f23a70e98ddedf02786efc\nflags = SmallModulus\n\n# tcId = 11\nmsg = 54657374\nresult = acceptable\nsig = aa5d174e95f9a1ff88c1ce60b3aed1d39e256e28b0512cc4b52be1d41b8ccfa2a739945aefb5b697886f4f08cef365d18bdd8151acc588fd4ebf2aede9bdd904aa3481822206f3fedc5889c9f9889a8dd4d160d65e587ee228f9ef155108cb283c4e2a697a1e739827cb4a9790f96023e6ad24cabe51741a7c7cea8c52f08cdc\nflags = SmallModulus\n\n# tcId = 12\nmsg = 313233343030\nresult = acceptable\nsig = 54a81c62bed2f716feb2939f504db144c1c3b70485a1f35b2871ede567ffcdeb8d2ed0c57c56f21b70388d631be05b4c738e67f160f34ec42f236cef92b03d3dc8e50145b33e634a6fad8e87f84624e96feefeeaa91ddbb003c3969017dd2d102da2e7d5de8ed298139d5e503e0aaab136fb583b99ece2e6b1681699a04b977e\nflags = SmallModulus\n\n# tcId = 13\nmsg = 4d657373616765\nresult = acceptable\nsig = 11890613a8ae298c21bda95fbe4059c37426f41ceccb7bd79598c72ab4662e012f08b7009c15155b5ae9d132b4ede565963e6014241305279d60662f57df7119e5d4088d32bfc7e0847036f41ca71f9a92660f90ec13ee9e19717d0b567ec5a6b5978a11337d5ee4e9147352fb954817be04fb767ef35c07babb03fd04a31338\nflags = SmallModulus\n\n# tcId = 14\nmsg = 61\nresult = acceptable\nsig = 0fd461012145fe0ae9362eef22ee35dac0d4751a037ce4cf0792012bb179d101f9a9752e5ebc5454b18684fa1b557f3136ae68edc087dbfa4bbfaa59be42d0daa84b574a9f23238d4d538ae3e6c32f8dbd98b1138b545badcc10b184428fe2707aec73206367f147196f7b83f358377562e8c7d9f1d396a1cd9aa74f8a78cb1d\nflags = SmallModulus\n\n# tcId = 15\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nsig = 307e421e06bdec1fc1750d53529f5f007eddcc991af8351477e1d67169409e3acc93367fadc412a4554854004c4a29c8af4af09793e55967ed439645034cc9e9ae565edfc861e04c763d058ff3aa29bef3942277b4c971d830be1259aa30c125a6ede65971b0120758c2a6eb21f238ff18228f344155ff9109a0f9656cae2351\nflags = SmallModulus\n\n# tcId = 16\nmsg = 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f1011121314151617\nresult = acceptable\nsig = 019682b9c934a37ec166efae16b5ec75671fbc6322cdc91bf56a6f557001b8914050852ed7f13e96cb47fc5932a311ee677ffc05c1cf6589201b1a806f2ead9ff3c7cf327c391044fee073527a791a451a0571e50bb1e4b4f7e40847dba751f2d73f2ab2f5ab11724be81c9fcfded5a2535b593287e120870138e5534292104a\nflags = SmallModulus\n\n[d = 008505d47c271560aaf6cf65da6d5594a69c86f01622ea194071606fde369b65f5a751bce06052409c3a04c6a8b2be935bc0d084829dea8ea0998398fd2a0b0719ac1a1ae2d133fcc72d9df27b377b9a0109ef1a564e92b66963356b8da48f88fcdbc20658f74b542582925ec5cd03fb5e9a527c670465f792a69c1f6c7c5e1841]\n[e = 010001]\n[keyAsn = 30818902818100ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf0203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d0030818902818100ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf0203010001]\n[keysize = 1024]\n[n = 00ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf]\n[privateKeyPkcs8 = 30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf0203010001028181008505d47c271560aaf6cf65da6d5594a69c86f01622ea194071606fde369b65f5a751bce06052409c3a04c6a8b2be935bc0d084829dea8ea0998398fd2a0b0719ac1a1ae2d133fcc72d9df27b377b9a0109ef1a564e92b66963356b8da48f88fcdbc20658f74b542582925ec5cd03fb5e9a527c670465f792a69c1f6c7c5e1841024100d397dcfab4919db23bb6b88c4511516f6135e1118277e496130f0cab3a75661010cc98ec8f40cdb0c1ab612c03bbe3b023d891f46185788fb114437c8a9ae71d024100d0c7805159509ddad70f35b9a76c7c2bd95a844d36b76d96138cfc7a2a55f88072e8b10ac37463caf9bf8d1014c93a001214d7ce230c8332fb58dadb05d52f8b0240762d3c4b7dac5292284dbe3701a051864e99e4117e77ede06fd698f1cd5da25a58b79cb58ab0dbf0dbca17249915486ea9269d260b8d9b2f4dec8e60b19d2075024062a4f06eff4944dc6262905ae0cd343a2f9f42058d85cb646e665de086e249e0beea4cc42e276f03374f9721f30044c445c6cd545b610d186883ca1c543c2f1302403cfcf044035c1854475e1dba480ac50d2a059f32d18e819c96a3199b1e3855a653ec0e5577e4d7677d6e0b7a55fc418b13202ee19430228c4bf9d28af8851c9b]\n[sha = SHA-256]\n\n# tcId = 17\nmsg = \nresult = acceptable\nsig = a0abd165a5ef8733ba111fa0fa092630222d809d8ae811f24f8bead4968b7533af31019663713ba134e7dd345c38e7166a037025eb34adcd6891c9ec941d2e3eb1e4bded1d269272b602cb9b53568b992ddb5103914e6424c75505701a37996c8318b0b6f8640cb6b6e770ac44314b866a7c683a6903f7bba07b6f197ec554fc\nflags = SmallModulus\n\n# tcId = 18\nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nsig = 41339884a9b3940e8488d666bb158063c6a2a2717cae7f564834a876fcbf7098ecf3acbfabf37d38a8e6127b1e313744f1f896e165efdaea0b2e7673867842b9e94db0868ed9a92bcdcb370a4e20ff275c82595e4400a8b9e9f12482f014846b48216f321266ae6ae6338dbcdc41b711e483e6e3e728772e7f9f5ef95c30196b\nflags = SmallModulus\n\n# tcId = 19\nmsg = 54657374\nresult = acceptable\nsig = 8883676becdc27878ccdff53dda011e5e2f886e31e1e88d520bb161cd63aa001fded9f0656109c1507bd1ba5d3bb3e725029a236b4c3c0420a1fcfffe348c5277d6aa51bf75d9af26fdc15fc49d637b078a8b0478b5b0a9c428756d260068e5e622f193b9f9a2c1d979e3322d7f3edc32053541c6efa2485e42e99a804f94388\nflags = SmallModulus\n\n# tcId = 20\nmsg = 313233343030\nresult = acceptable\nsig = 9f2e01b92bc9dd32dcf24aee91467797396649a3255bac943dd0e03c9ef416f349c0cbb728704730f3c7a7c244066a94b229a6e86bde7753c8940129626307b542cc7f596583932b4fe6ea9384d5353e08654e966a64b63bd6745503f7e4383dcef74ad4516ac25c8790db6702ac5b8b057a8fae75669b6a9e689e9211a337b9\nflags = SmallModulus\n\n# tcId = 21\nmsg = 4d657373616765\nresult = acceptable\nsig = 3cb9557d9fe49b889319e0d41efc00cba34277caeed2b2c54fc89772c669200dd63f02f340cb6ed579a379a3fd6a568ca9d4bce206655ae4586850638ee6bffaae2bed7c7afe7353d22418d7e4f6b15e198c85b649d3e5a67f00702dd9fefed7dc72136bb4440fac58e64453e4ee63a81de4270446571b192f414116e165efc0\nflags = SmallModulus\n\n# tcId = 22\nmsg = 61\nresult = acceptable\nsig = 06e6fb568e366fa20d48704be40e991a291d47a464296a49c37718c1153b0fea17ac18a01ff97b32a92d07635dfb9143d011d003c9153020f5ef7fd3ef258cfe92a7a2120718fcc85c73acd34cbd50670c2e044dc3b82fca29b1017912b65d8a844515655308367d8797ae5b7fb91042df573f32de69c1842a128ac88937c0e9\nflags = SmallModulus\n\n# tcId = 23\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0",
     "f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nsig = 327238fd701dc4a829827550aad98f9bcd75e9f3831c3679998c869c1dd8381bc6b74b721e9d3377034e059d6637690ba3a184ffd98af951d43a22105a51838f72cf592d658af01adeedf721cf2eb2bb2c90c68311cb267f0cfacca903c1a2a73f7228badb5d86976f5d3371fe9b00cca048a7a0b0fc4b03da11c5a098045e07\nflags = SmallModulus\n\n# tcId = 24\nmsg = 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f1011121314151617\nresult = acceptable\nsig = 65fd6547b4c27c06da21cfd067accbdede11ab8ddf16899d3acfd61134bbc4ed3269198733093062476906f36598a565ab32cb4b4f90e8c2acdab870bfd7f97726771050c4c67768d98514e51c28739067ca1a7890a846f6fb142d720df3c98ceb833a8cd8cc6129d22d0c5de9120c127e69e8d7b1548a474acf505897fd9f8d\nflags = SmallModulus\n\n[d = 5683206e498cd4867f94b062adaf2d3d7498150709d45ae03790731a58303b74a30d9b37b728f1c56fc34c2abf9c21e18adcf3952416d539934809cb1b516a62d80e1082b3e4d2ce749f58c7a1c0e5907fb7c6b9c9f971c80b890bfe101c5e8a83156bd4a55283a72d0634550a9bd674b771b9e1e00619eb43d6e35112e15031]\n[e = 010001]\n[keyAsn = 30818902818100a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed010203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d0030818902818100a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed010203010001]\n[keysize = 1024]\n[n = 00a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed01]\n[privateKeyPkcs8 = 30820275020100300d06092a864886f70d01010105000482025f3082025b02010002818100a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed0102030100010281805683206e498cd4867f94b062adaf2d3d7498150709d45ae03790731a58303b74a30d9b37b728f1c56fc34c2abf9c21e18adcf3952416d539934809cb1b516a62d80e1082b3e4d2ce749f58c7a1c0e5907fb7c6b9c9f971c80b890bfe101c5e8a83156bd4a55283a72d0634550a9bd674b771b9e1e00619eb43d6e35112e15031024100d55f5ac3627e7d4bb07c530cb26b3e0ec6cfc7753986e009c9f53d84b6940923d293f8c55b5e9820b56dc6eb008ee779a156a7c8a0b4fa5b6117a4f64233a38b024100c227f5cd75d8865f75ab467ef5f8d43ee0707250450d523230fa3786a6632dbb893ec9cf1039058521b4280529644315f9d37409915f6f5e86365ab82827d323024028403bb3fe01948b51b8b24603e65d2796739dd1cc4f5836208605dbe2415cd4082667d87b1b0621ad780efd47f6ad4df194924433a4d051aaa836334a5bc96f02402fec0d0f9976c833e7a74ecf2787335c11a9af8d807db93c0a3ab859d3d7c701f2ee3c818f4f83bd48845f1c670b0843f455ecde2fb38e999626f45d600bf46102402efab8b9b528803fe02e6dbad575d57824b794dbd9ae0b4d6b43acc1b22a42ce2ffc12ff9339af3da08387cbe73e1bd326725487eb97c71ba6f960e5dddf4207]\n[sha = SHA-384]\n\n# tcId = 25\nmsg = \nresult = acceptable\nsig = 8bda47e85848bb1d98eab90bd5f1880540204c8753a17b2552ee4778405e4c42cc3d25a4d869eb38f1e6fd122a2f52fa8685c3ef40400ade2017555ae88fa892a1ad2793f7c23762f0e54db0852cfdb2e52ebd02c8acf81b9a1e78accb5fbb57a29391cf4fa9aa298111c7b94fe240f0f576b1b52853853fce13da155f16e81d\nflags = SmallModulus\n\n# tcId = 26\nmsg = 0000000000000000000000000000000000000000\nresult = acceptable\nsig = 74b9a7b9548a281c5a258520c879e0e64d8a28812a7b6461c6e418e0502b61008a8e535a5b55fb64529a6a6df2f60ef33c1844b27f81532be2bc2992d0eb5e524112da90bf40adefcf206469639ff3895a9826674ee1acbdd623842ab0a9a36d48da13ba17c4ee069254da2ea418d5a8f135e2a414c0654a266d538621917545\nflags = SmallModulus\n\n# tcId = 27\nmsg = 54657374\nresult = acceptable\nsig = 10d9c8b0bf55586e985799be60a17979eb0461daca00ea6defcc62fe720ea502e7e486c02a48f5ca41ecd96c67b5c762a067c465c35a8e416748897ede3ee2cd3c3e1b1199da5c7f0dd0f036774a1730e63ba781d6ee43d78b067608e831a16dbec6075c8ec90e81a4d8e2ac2587b0ae43f7445478b03ab7eba2e63d4043c2e1\nflags = SmallModulus\n\n# tcId = 28\nmsg = 313233343030\nresult = acceptable\nsig = 2cb15eb09030fade89eabc41794d288275c456f12cb0d414311e5edb551a51c3e1354f134b27aecae50536379a871a4ce6ab2e1b999c0308f5fed2ec48d97d68885b37a1e3e26b841db103b64f720f9aef265632f4f4a207ddffe19092e8b16144b0a3443d779c0b648077d3b04b72dd4f4051ac232261ac9df65974764b97a9\nflags = SmallModulus\n\n# tcId = 29\nmsg = 4d657373616765\nresult = acceptable\nsig = 9c80154e3087b443fe6d9bc24faa7ea009330a210f2f1063ea1b61261507a5e3853079a0287d5b27983bd751ac782b1a5c31130978d3f2a8a95101c4ed87eacee964953ad32cd2cd4caeb7c37330d1650d7ca19dfa6e8f1c184d3dd9a3a759d6badc700b7063d2c579b336c5e141c200614ba613d9bb6493e87d26978b438573\nflags = SmallModulus\n\n# tcId = 30\nmsg = 61\nresult = acceptable\nsig = 99fc12c90f67dff9600c30c9f81bbf335492151345c809c05771d59ef73d438f88c5c43ba507a3cad6633641d70ec3f3c38f67cf7f2566489f59422a2dad1f647e790bbd28acc290ab392d48ce7a140184bb71023f8c9c5dcd9469ebe848063d96bad26fbd390974b38459d51727eb8c0a5b8a8ef1d3394b6f852dd2b22cd22c\nflags = SmallModulus\n\n# tcId = 31\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = acceptable\nsig = 869b42bb93624a139bb98c043cba8fe12d612aef040e3085994824a480274c0cca24d08d178321acb048055b777d897e267cd50809bc7e9f86c276beeb8a8d59d82aa2091c66c71e41ca59738b0e18f055f9c75a01e87aaad446e64ac0183c002ea2080415ebb4f85a590622bfa4e701a6e37d0b33bd78d5ff874d8d28fda263\nflags = SmallModulus\n\n# tcId = 32\nmsg = 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f1011121314151617\nresult = acceptable\nsig = 1d1d3424bfc646c0e3668ab4e9eddbf993c5efe63ee6ccc966dd467c466225bf587b9d7508a7dab8079c50cb3086b9f0fa3c6e77236744618fd651d39bed94bdf47a2a77897341f16da3db9557b2377f151375a74d9af8204e155abbb62dc7e2f6effee3ffe936b360e45ab750ce69e29f29e915baf8578017f66d85192ded04\nflags = SmallModulus\n\n[d = 00ad5144c6c266314d11dca0af34b8684a77cab12be2ffc8fd213e9289ff83eeadb70e4b6af5bdc7dd72659753ef1f84c2f8039fb13ced41f12af77bcb1cbb0333e26dcf0b27187216910d3de289487ddc843c8b66f1f662037e181dae36d6aaa3b509dd33892ed4851ddcaa4d02ec210262947517a38da2e9ed35e5801901bb6e82043bae88aa951f4a56cf454b4dcf2a9dc425525ee4b6e199320d1b080625fdc8af4e44592e87cab8753316fe933ccf044380880b1984f662c638ed8c3158f1]\n[e = 010001]\n[keyAsn = 3081c90281c100b8be129638e9c805359e6169b263265e2a8ec4b849101f2a321ce523665e399954ac3865ee8c85d14f3d3f24fbd583664bf09394cbc7f7ffc98aadc94eda35ca4b9614fd2d773c782086a1ea9ca23f357cb2cdc465fb85100172845d6b2906dc9315a542d204bcc4dce68d90484198e2350cd682eef9313a13df3607669aa4dd186f563ba0ae3ee054f857a92985f2694a54e1a87ed7327acbfda3e61ecbfecfdd1b7b2d08dd306122fd44268f08463306760f40dfb7634e71d7a72f1224e6110203010001]\n[keyDer = 3081df300d06092a864886f70d01010105000381cd003081c90281c100b8be129638e9c805359e6169b263265e2a8ec4b849101f2a321ce523665e399954ac3865ee8c85d14f3d3f24fbd583664bf09394cbc7f7ffc98aadc94eda35ca4b9614fd2d773c782086a1ea9ca23f357cb2cdc465fb85100172845d6b2906dc9315a542d204bcc4dce68d90484198e2350cd682eef9313a13df3607669aa4dd186f563ba0ae3ee054f857a92985f2694a54e1a87ed7",
@@ -4103,9 +4202,9 @@
     "f875bf217a98fd573918edb2f8a19ba14637931e2041336f1221beb354d3032e5076d52037d18c03592ec334665a34152dab9f97836f72b808b444ca2fe5402a085782a1344ba6c96f1472896418e3383754ddedbf58d0308dd28dc18242c1cf34980107028201002cfe71b7d15c072e0ac71c7aef80e8e40823a92ffdcdba8977450a5e58b154b019c9d9e7a602015c41b7909389afe686a101e223da9e752638c244b31e298aa451e24857c97fc984998f276b6f4c69575f306376cd2870124488f518ede6ab3f43f0c68b133c5c278028d3d824163e22cc5a7f3fff478d502af055ecb5ab5039a94c9eea95db34ad163f1b0c4e5b66aa4fe75a4503df915c1431d6965e70c931fcd6e768b06e57653e7261f4b95ebe428ffd2bcf904f91fabe16c974b4f5ab10ebb66ee3e2a95b369946b2dc0a30f0e9653eaeb681fea81bc47adbe1f50d1e30c0bd85fd0a98fc4869dbd00f2d61571203411fa7f008c0e43cef14f6ed1ecc70]\n[sha = SHA-256]\n\n# tcId = 156\n# short signature\nmsg = 34333630\nresult = acceptable\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a21abeac8409398319e65c8656f8f72e179dd1e99358c7531fddc037e47c1e688cd70eafd6eea01c823516bc79f89d7e52ee1eb4ffdeaad1d550dc0a47185bc9c42e47fce5503c3370a60510f834b4691152ef668deca633cf3873ce6613951784aa7dafde118f37f1cdf1a687ac236d5c956bced564b73cf202e3bace59667\nflags = SmallPublicKey\n\n[d = 5a227bd7284e2c0f51db10b911d24bd931add424b8cf6aad5f77f70bf94faebd2b6c8753ecb0bce16128569ead41ab428481b5748311fd02cc821a2379f3def60eadae0d46777eca8a98f50e653012867f0116768d9f04286b6921d77c812947fa838c22159a9743b030fefe695a25dc6e51a293700e545b52c01ccbd297d110a03719ee437ac4b220d7dbb058adef86b949ca4de07276101deb7b61b2e5e8fad8bc6bf2dacf8f90060aabf2696c7f1cafa101ec562ae5572fd592dd7cb1f5fec11473dd398f7effc7981ff96fea4269561f21fa87bb5c2ebbecb441a13098b6ff7b8aec3fb7f483f48f80bd8b531f4a99bb27cbdec584cd7c0114ec972380f333f1fe4849ba118e5c3895f9865b806733cb764b66e99703e35dd49bdc4372d8520f069237dfa06c72fe78ee267184cb3b14fbdeb1ebdadf31ba6bb57b469e6242bc0d1fa391e0e8edc94d01b5fdbb2010f7d8e4c5cdeab865b1a2f08643dd0ac0f7bc151b6ccb0c835202f07a9ee5b73db9c4ece4fe4cc2069379414ed6552b]\n[e = 03]\n[keyAsn = 3082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keyDer = 308201a0300d06092a864886f70d01010105000382018d003082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keysize = 3072]\n[n = 008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01]\n[privateKeyPkcs8 = 3082073d020100300d06092a864886f70d0101010500048207273082072302010002820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103028201805a227bd7284e2c0f51db10b911d24bd931add424b8cf6aad5f77f70bf94faebd2b6c8753ecb0bce16128569ead41ab428481b5748311fd02cc821a2379f3def60eadae0d46777eca8a98f50e653012867f0116768d9f04286b6921d77c812947fa838c22159a9743b030fefe695a25dc6e51a293700e545b52c01ccbd297d110a03719ee437ac4b220d7dbb058adef86b949ca4de07276101deb7b61b2e5e8fad8bc6bf2dacf8f90060aabf2696c7f1cafa101ec562ae5572fd592dd7cb1f5fec11473dd398f7effc7981ff96fea4269561f21fa87bb5c2ebbecb441a13098b6ff7b8aec3fb7f483f48f80bd8b531f4a99bb27cbdec584cd7c0114ec972380f333f1fe4849ba118e5c3895f9865b806733cb764b66e99703e35dd49bdc4372d8520f069237dfa06c72fe78ee267184cb3b14fbdeb1ebdadf31ba6bb57b469e6242bc0d1fa391e0e8edc94d01b5fdbb2010f7d8e4c5cdeab865b1a2f08643dd0ac0f7bc151b6ccb0c835202f07a9ee5b73db9c4ece4fe4cc2069379414ed6552b0282010044f592b4a5d5d2abfcbb235ed9c890ed4c393a58511d213477c92be7c44cc170a2476f6c9f836aea06b0d584c6b0d6eff344e20a58cd94b601b98ef3ec8ac8a7415430653450bde8b8e26ad2608814ee56bfe3ff1099d195c9c76edd82b1ffa50ed7b67f5cec464534ac99c8f043f57078a8752617abb04d4861031993efdcdda9df505b500c9dfda99f422ca3be309985b4a3ebe48cc37227e802298f9dfc937f3c419c156df8492b52cc24a1daeb355829836689fd0dd8c3057fc1d473942de38480e8ab6f16268cde71af49badce2cfd07524e8f90c301a6152129ad4d578f4cff93a042db9ffae0be5136c1ae5d8e49813d9dfc1703d14fc507846a8b45902818101f5ea5d7dd210be18585cc8f9118dcdd91e0587209ede4b419552064988741c3c76ff276ff952d104db1f6c0fec6c4a745e7340c2d000dde533258c29e5594566e240fe9a7981c5e7f6d6f42202590e759f34146e61de89f7370a15c0403ffd9469ca8e5b527b2d86cb52350e2e79dab865b9cb35fa88487d8190885a567d86e9028201002df90c786e8e8c72a87cc23f3bdb0b48dd7b7c3ae0be1622fa861d452d8880f5c184f4f315024746af208e588475e49ff783415c3b33b879567bb4a29db1db1a2b8d7598cd8b2945d096f1e195b00df439d542aa0b113663dbda49e901cbffc35f3a79aa3df2d98378731130a02d4e4afb1af8c40fc7cade3040acbbb7f53de91bea3592355dbea91bbf817317d42066592317f2985dd7a16ff001710a69530cff7d8112b8f3fadb723732c31691f223901bacef06a8b3e5d758ffd68da262c9425855f0724a0ec45de9a11f867c9341dfe04e189b50b2cabc40e161bc8de3a5f88aa626ad73d1551eb298b79d6743e5edbab7e6952ba028b8a835a58470783b028181014e9c3e53e1607ebae59330a60bb3de90beae5a15bf3edcd6638c043105a2bd7da4aa1a4aa63736033cbf9d5ff2f2dc4d944cd5d73555e943776e5d714390d8ef4180a9bc51012e9aa48f4d6c0190b44e6a22b84996945bfa24b163d5802aa90d9bdc5ee78c521e59dce178b41efbe7259926877951b03053abb5b03c39a9049b028201000a481e3baffb3d30fa9e49395e7fd986d58e804befc9bad0799b2e86389792a2e6e47449b23b9e15c9139dce384aae4f08bcffa353bea9ef2fe2639a35a1bc3f9ac38",
     "963f1b605d785bda5b7c5b17e66560d336cdec31b70709b43ce064d7e521df466c8015a1593453fb90f3d43713b5d5066f5c7a4abb817b874065a7a117be1df350320a5555fb39d78d178d17e37a288da8761853c40ee99590d87f21c133fe06d09f40f9c1765eddfa7e865b6a4b369470163aa681d85223f37a868e97e264f371dbcbd9cef8a17601f7b29b4e76f2ff77b538722695dd1fbf92e940b6e24c1f33b490b1aada82875596aacf074c36e1e8cac178e8690be9f54956bc1ac]\n[sha = SHA-512]\n\n# tcId = 157\n# short signature\nmsg = 36313237\nresult = acceptable\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdd0c9e451b5b3e5513a94492dbee1ada9ea87e65a8cd95cceb4d304294ce34bf09a212f14908f5b865c7a34a72e68e389794a2d1c5767ba17829e2044108ac7842b6bfe0a5663b433d656f4e38522c5a5a23c460b898833828d257350e5814291b54cf13089080f84998edcacf0fe5fca0c1f8b176b172c5f9989491a039bef\nflags = SmallPublicKey\n\n[d = 61d4ba892aa781fc663a897a56f278364b09a89485a37255bdabc5e0f543fede724713cf3613d20c059983e7a38442c776c9accbe8ff714aa45d4d5cc35005adf8b8c76a91bd14fc975341a1689495fd85fae6f45ee5f010764c45a01d7fe521b0463c5838ced4fdf17f2df3056cc3f1d1f76753b563848ad5eac21b40e286e5e847932fdbe9a7a569c0542ca2e072763516ff44f67817739a3ee721dbc88f5d3d4ea704e53798eb8c0e7195070f313b800d65827a4057f62ceff11b160a8419054f99fe6b7cbdfa62a9f07ff7313b8cbc2b338bdf9517b1150de81212f9d6bde36a5b16eb82aabcd0157d2caaea6e0b02c784bbf9a00c7cd12e708723909f93]\n[e = 03]\n[keyAsn = 30820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d0030820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keysize = 2048]\n[n = 0092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d]\n[privateKeyPkcs8 = 308204e3020100300d06092a864886f70d0101010500048204cd308204c9020100028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d0201030282010061d4ba892aa781fc663a897a56f278364b09a89485a37255bdabc5e0f543fede724713cf3613d20c059983e7a38442c776c9accbe8ff714aa45d4d5cc35005adf8b8c76a91bd14fc975341a1689495fd85fae6f45ee5f010764c45a01d7fe521b0463c5838ced4fdf17f2df3056cc3f1d1f76753b563848ad5eac21b40e286e5e847932fdbe9a7a569c0542ca2e072763516ff44f67817739a3ee721dbc88f5d3d4ea704e53798eb8c0e7195070f313b800d65827a4057f62ceff11b160a8419054f99fe6b7cbdfa62a9f07ff7313b8cbc2b338bdf9517b1150de81212f9d6bde36a5b16eb82aabcd0157d2caaea6e0b02c784bbf9a00c7cd12e708723909f930281ab0c0f4f3c24bf8d0185bfe3f5be0fd9d94045abc59ed9082ebab4615c4fe5e74a26d2d3824276b90631aedbe4e2795873adaaf909fb454f7cc4eb6403c226a8d4fe96c429018c6500d227af70236f30ac3e299e502b0a9423ddccffb7e2987aa6889611896f3ca767a5d536f9815cd21fefa7f8f177ddb32b9a8c3599c3f37ef910e37e9048e61d0cf79dc14f14c242d0f0e350045ad6b54f278abca959b59c771e68c312aed3e33a71a73302560c2b1123368fcab3690929caa41f19b4e7e973c9696a6e1fd13e66b61ca9bb63cc30cbac1a8735206aa639fc8dbaca40f273e6b6320752fe2f0b4b5089d932ca0422ba3830eb74e462a7dad66f31491c321ad7f861df0281ab080a34d2c32a5e0103d542a3d40a913b802e7283bf3b5ac9d1cd963d8a9944dc19e1e256d6f9d0aecbc9e7edec50e5a273c750b1522e34fdd89ced57d6c4708dff0f2d70abb2ee008c1a74f56cf4cb1d7ec6698ac75c62c293ddffcfec65a719b0640bb0f4d31a451938cf5100e88c154a6ffb4ba53e7772670823bbd7f7a9fb6097a9b585eebe08a513d634b88181e0a0978aad91e478df6fb1d31b9123bda4bef0820c748d4226f66f770256081cb61779b531ccf0b0c6871814bbcdeff0f7db9b9c496a8b7eef24131bd242882087c811af78c047197bfdb3d1dc2b4c4d447976af8ca974b23235b13b7731581726d0209cf89841c53c8ef4cb8612cc11e550413f0281ab094cdf234ade11daf48b0df60628ad6846140b65d68783caf13171f4c2772e7a2f7576fc8ba0d5689074568ebfae719a4f2faee5159f17bbec294029f4b0d7ef85f5e7980a872ee5db8f6a39cf6871373abe90c894fc8cd96399a3a28f643752ea6bff28a919e88d85fe720ca359aa5d4c828f2530665ad9810d7dcecc0888bdce4d71e05c3a8579845fbe985ff6d0608fb2dfa1121c7b7e4ebd7209ce7fe2593ecfa2a061fb4e7b2773cf]\n[sha = SHA-256]\n\n# tcId = 158\n# signature is close to n\nmsg = 32353934\nresult = acceptable\nsig = 92bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240b8bf4bb1a6d0616fd5be2f081dc9ef741a9a4ae7274418b791432de470c4556463108388e8e8ed5dcebf3558e4650c2ac97c86fa682176f09b5dd8cfbf15d19c3fe4f961f4607c12cb3dfad9b6a0e59c92faa1fc8622\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen165 = 145457;
+static const size_t kLen181 = 145457;
 
-static const char *kData165[] = {
+static const char *kData181[] = {
     "# Imported from Wycheproof's rsa_signature_2048_sha224_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001]\n[keysize = 2048]\n[n = 00c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5]\n[sha = SHA-224]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 19c576f191c273306ec6ee9e26c673bdcf3f821adaf13a0759df7787511ddb096e964f5dc199ccc5cf131f855065d6ff0a6c720651477d9026bed82d201f6e84a23b37725fd24f5b75aedc2afa24524e7222c0dd7c6d2742430bab3ec46d12204a94a533e2a9147723d087d619e07873a4261c420226ec1869abd70117c787d4b1827fe98779287451086354292bbb90617ceb391122efe70887710c5cb4549d163d37e79b33c1b336826cb53b648689e6da54241d20df822cf7770d7beaef4bb00068252786580a88cd00e93f5ef42b69efa7c364b98749fe734ee7bd13d0aca585d84e4fe4b29478697170280a5921278997ef9856f7372b6995d7eb43ce0c\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = ab2e758c8de97282a7ede3401680ead187cc08658be0041f108851149a9b9d2588d5ca544039533eebd0305c07f394504d91a578f5764267149d4ef70b88a2a3f8cf0b1061d06882af53a88bef195aac87294dc833d80f42d942f3a59bb242b187e23bb89a068bb4c8a215247d04aec57f81f75c14e711b5878b04863e715d0f359ad13f008b79342b7a4ca095fd021f639e8f48860c1eafe6fa19162c2632a2d3a05330d149f3ea6c9aed9f89fa3f7bcb2cf2a3d1af0484178710c21c046a812f3b8d68027173ff5aeb1ad19ea6639e2d886eabf8149a8fb491d2c36ccfc4da2a9785a992046f24a93d2dd7765a171cd8ecb68b94ee70b0e5bf791967267251\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 61c702c72b0177ac857e52707c1a40b84a1859bf1d7d1cdbda643f924e8bab7c3d3eb2065aff837e92f93836fd54ea52e085e19cb0cb59fa58afad48480c2dac579315340883886e78456ce750fc55b6c188b716bda7957ff547222f0cc1462344de4bf078ec19f1ba5901a0e5f40d93dbae4aac407834b272a2be82c8da085a3e1e9e0a57d3f43d26462566f0aeade04ee8981fec8d7e34c916fe78c0c5c43781bab2fecab654fa55ac99182545d0ddf070d41f67efe0737d8ecab3411720c84862606c8e4b53e60faa1c9a98386e92b03d676b53e3fdbca3bdf0187ddc50086cf82ca6052be55fbb7f3bdb6c6c0432defa5634797c23b494c3880846169b67\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 965f82f0649a338ef14387a7f3335b9e2d5d3b4009eecfd26c0110344a30117bde6bad668cf083beb28242460fbb96adf9754b9a4d4505f6412e677bf3349868fd5b5268786308a5293f2cb2f7ffda76104351f10381e504e72d27435d5bea0517d20ebec0afa531e520e5fe484475a330a40ba1109c204fabc44ec099878a5e31342a650047c299a5f2322f057b9586cd9eebeed1f3d2d94aac24f9d7b2f05c6f28bc49cb2b00f5e56870fa099cfb2c3e276381adf5a030ab6ffd9cb96fe309061d44c2ca5ccdd76a69458be561e3f0ef603ebe9ecd533333584236970dc7414124ace98357c496369bf94123bf0d4e57b03aee567c2f83a9e6378e62a42fed\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 105c68d221aa579ab6206d23be01d0c91f98fb67ed8d2044b6278916223758aa346bd6d5c7282d23a2bf702e0facdfb884e0b389202a5073a715fa80158e31d1e3588af30d2fd8b61233499ab7952f0761c84912b700fec807937d00a021eaa84d96f59760cc7733236138cb4ff1fb04c7d4621331b5c729f9694555b6f9c324e74db4a7a8b72f2853dfd0b9fe63759b3468bc66017bd6c1aada2070dc8643b5e581f12cad170d9fe754c65dfd0a5925cfe846a8413d729103e9d7e8825affc20f477d5bd3860947c2665ca4170fc44f2670bc33b51d42e5df78134919bf4660cfbc092c1cdcc09c8fda1ec9383512abe253cd1a470271832e0c7de5a6d9a7c2\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 3662fc9bc91b00d457bce2fbc667dbb31ce7fa451acdbad95b4b418782b8af67d2fbaf1424be2c99e95e2637d8d39e751d757f89711ae165fe5bf142fd88b284df696e948ee714e3f2062c5d01d04bb6c0387aa5ff1511552dd066bda861e1c5cbfe73dd8c6bc3039b729c700c8f297f48ba2a36aecbb626b5c9f9b3c04102f55ee65ef5477d8d1d14d9b7b048cdac54d7239177e702d0629d3617de2a9fa556a6d4ec37fe38a46b768e39f1d8a380484ffe0cef59abb7e20ffdb7c11b14a42ee3cedda99ef9f71eae7cf760fd81172e03a3f2a9f7e42a813db3b089c11528350e93b131641b8d023d47447f58aeb9f3f38760df8a9b1ad4b8d43ba0c9018e02\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 8392c4d888e7c63ae2a3d53d560ccbc226dbb1d9f69100fd86a19ef30a83981371169deb4ef87aafcfb4186c5ebf8d83764470acc8c9cbe36a9b15037e25b1dfc63e929b0bb3891be2d1804b8c6a0bf65891943e4c0fd21e7df55c134dde69682244d22510dac2b304c10a2e31adc134ab27ed186568fa9091df16f1c9f4e7044ddef6675269de710774ed124b52fbac9bed285b4be5ef9f2fd50e1d95383e145553762fb87a1da173b8b89a7eb9e947d08b5303ef0992bf4e3783c30253a43b373d90a75bd52fc53ee4fb86bfa1bad035a8177f8c0a9f53a6214ec950c2a07cea7f908c55c24dc31799867f819af18fa30f304ea001ce9cc87eb703ab578f5b\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 00a3e40c77eae1f17fbf23c0218bb5baabb4adc424ec585b499a0e28ac21e664a0a8030026a161b1c3eb96cb5d0e498023561f11cb4ecdbca633f5d6087784106683a804301a16911bd7f8fd44c66a1c890c70fdaebb68267253329280f60fd617594194c96714126ad30547a813ce57f4fd14b1907172986c8a525abd130977a8e0a4af8007bb1e9b7cd83865b6f1b0e40b1709663a25bf118aeabb0af179cf61f034fe23d505c86f9f2be08b4dbd9e9c465c71edc0ee7f6236c1b52ec2e01904c14a3da0a426f39a8a5c462bcbf6edc04febbacde1dfe30495fc5c9726fb103f19d30d9d49d69ffe9190f5d448ac2d063ec4bdb8e07aceddb17202dbc25823\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 1da09f538311c3b591f0c28ff1ba3d0888fd583f78c1bbdb93cd44c17640ea658a62e41adcc74bf8d7509e7d46764b33fa02f74cab9db364101857870003caf2f6df6f4c366997d1d00e891a30275554db7690b267c56eda3a279a1c2d9271cace128f8f3449f2590e4f30befa9f374009c7d4d75dc9101e63c7a102fd7ef19c9d8cc8214c7d8960332be27270e913e2906e55d3e55085c792f2e34cfbc6e017fa7211d3d2aa0dbf9f664d7cd0252247f8d9859eb7d738985e2785d1ddc21a156824dc323b272c04ac36015061888de8cf026afd575257f4fb482d5807d5ca41ee8128b2c9bfb22900a6e60f03b3fa99621f2b7990421a070d89d0eb981de5c2\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 22b094143d7c0e14529739d6e712202114a04053f0ab81f2b9ff357e6866fc58ec238d225ad4dc6ec877db71152395ca3747f72c20de76aa4bc04b1a61babb5d3a08017978de1144c3810ab5e371e0236fe14fce95d79fedc74b3108c0713940d4be0da190a7e7b7b90440e91fa1770b56754b4e7a8024ca5918aba59afbc2fda4d60745665abbc2ce2d9ef7aa9a4894e14c150c98b7855f9c015b90a245b491f5c4f74900737692adb05900d590e617ba6ac8e951166f5c6ca69b1e627ac7cf09d73d84eac332cdb3b6372575a2db2531a4e1342f68b91bf6ab49523d5b29f99515fa6af1e2f5d02ed7a7ecf8aa3884a656dd026b29864762bb85e55e4a8e39\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 1addb77d2c6e825936e498fd1210c2b6fca811a99896ad40375567647012f3601f9657617876c62d1314731ea4609d03dc3681e6b53a93ec3ff0d49af491ed906692ac9278dcd0e0d051eacedaab7a038a6a8ec4d2de08103025a726568271ef9561db94f44ce4bda7210057f6d9d70ab71bef8599226349a88161de5e8035b671505b6b476f2cf39589030148c1bebffddff6d025870a4859866d63e8945a10c2cb2fe575f667",
     "6051c9f38140969c0162d87edcd0abd564e92e7389b223895ee92e35add16fb745ad493d269bb1c691cd1dfeebbde8e343da7051dd6d5afaf7aa4ee78200916ea2497043d07dfa25ffad324549902dbda79f4d9f02817a88ae\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = be516056260537514e69b25f482b4c22c1ff3ee12ca49b7f40e676a48cb424af3ca4bcb4d81b806c9c666ce066063efb1ba00f5b4dabae471e23e3eee7bbfb6ab5d505a725aadb6822a34d12ae00cb8e1a900a25cf236f3b1fe3b576162fcc8f33efd9bc6bc1c44d3c09e5e68c8aad9288a5a94cf86942231a413ced5bd61b4c6ebd83ccdbf52ab886f89d570d78c91d4b2afc3862569570e2d1b5469efb0be9b2c126c32dddac5c34d8f340b52cbcb38b1134c6b22109e7124411522b843c2bc3e575e60b35e7a440156770b85181c95488d82c0a725e02e90ca3dc4d41c8639d110d4bec80827140ffd1fe6e8d0c945de1e1b326a26e2998a2b03d86fbd7a2\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a9698fed4f4dd3d10ce7b039bd40b4a81bbd6a5eb82a71ba710094469479c14c1cb0cc13699fc8ccaf0c10382e1b03771a6d05670e22949c28965318acafde1331600f7337be8c19209b532958c5869c89b8384923a065df377de37b9e5cc7e5c8f6d0fd8664691dd9c97739194e5b2dd6d4330cef0aa0d873dce1405e7a435993fd84b339fb3574c78ed93fdc6fe604a3d9cf15c114e5fccbbbded2ae606fb9943a9a45461069e8b2dfdf882e9898a0eb59c4fadc3d86bf92b8dc537b1792be81b662b9c60db2938d513a7bb4878899df96a59334432d07a42b5de4a6d7c4b6449e3f469cd5f60857875bd1a617a2a8de8f9c0777fcf2e3e43499d90f3772a2\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 89d42ba026f51a31c27e079279cdded5cefe75069ce04bead266af39e266dfd8e9df16a3b9972e03f4afd3f561c931e815c66c2e81dafa56a8e6ff148f37e1ef4e98370c0a2b2e10ba47f7bdd4f433e8af206c107efdde39de9d8816bba196d52ace92335c34b15496c15f89bc087a16799059a556da9e96dafdb835b5553c5dc2c1b007a6ec1176e31a021da8c5106947e7a2316d3874a66b8a4ce2b237775365ec6f0842ade6f2a1b1e7d349189f6d2799c9dd40bd9d32056bfba10d14cd7d25fd260b1790f6ac6ff77631d4a5466c7c976c251f2d4b3fe943a344e75cfab3b8e30aff2ecb34014b906e1f1eb3f55dc8e4233a40cdd5364070ecb1f2b15682\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 712651f84c12fcbe98958b629326bb8aa9cf8e96cd8d06ebc68713e0241d2499b181b9216bb777e48d1191cae390d14dc63f0a09b5236fe6cb73f47d6043063ec1960e1fa5abb3631294e3c7fe3fa155864963a69ae9ad7f1b233a00e4b3b256fa0e28a431ff898155cbec008ec8367757b9290fc847bcad3a71d2026cd583b59401b7e66d552d9b59a010235785e6075cfa5f8a6588c957b66ce339882244311d9d0e33cf277134c0bf72c21683183ef12cff0ca9d3f517ee56acc4d89c74b0e81a7e1a26f14649766b0194b933649ec1fb72ebc78dd9645827e78843d31f503eebc40748a290b5fa5c1545d0801b63d753f0c0fb89e11e387d03c5dc465b2e\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = b23e98890d5806f743eed29a2f972bf2ef5e53bcd20e4e7f8beae79a4e7074ccc4ee9c38bd2122fc1ff4a94a22f25092024dd3aa598c70278c93d70e932402cc0bc7153d87c59c5fe15c50f13eaf4d0c468caba84e43c925c634a5c4518610e836da434a4743824139610d6ebacc07ef9438dbd860be879fa84f3cbc5ef4aaa140b581f7085cfbb343ea32dfd30546f559759df095853ab2d5dc9026f4f51f86a3621bd22b161215088a58233a42f64b1688244ce2a170b8c6656e33b697abf6a72d57662c5ba8e14cca9ac502392f4942f734670bd9addbc1033a33c1e7af3ec7dac7565a8fa50ddb8e220bc2426746bc0b05a9988aaf3b83103ef3a3902a74\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 98053fe9f2dfa6624379b11904fefed76adc19b8446cea727737fa452851deb44ea5a864300736b1c9a3ce27caed3fea4511e9bb9401d3a98b0892fb086a5dc04ae9e1d8ff6407914d0bb730507ceda69efb840219084c8ea2528b4146fc3420eaedaf45c0d8450192c7af36c3d6dc38f1604ea69fa9b2c38baf7e7cd4e0f5c151cc9db3590d505fd73e9c6363ac77aea87c7558582ff3a7b7ea08c4b4ef655984224c2bd9709d34d9b8662e48a2df5bbab3e9df9e5fb8db8411721c73ab50ac3d5a8b31bc64131415cc08daf6c34faae6abbf1b340dd4f3b1b0ab0d64cfa33b501bca552c950ddb7bb5f59562f73c51fd97f2d6d750b30ff19502516f5210f3\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a25aa3f523066ded870d269c7d26ef45ba35f386097015e0ef59a9de4710e88bffc62a16f8fb02eb18704c562bfb0ab9230d525e23b596a804707d98dce426d3e3a1278c29f342b9dc310b5c7da5aaa5584b84e922a385fedbe78ba432adee58f51b2570b7889fe854de8ba2654d52390217fc1f5f6f35f4a75cae85f388640db87e96908fe2a7b78c91f0fad3c118e75965ff2edc0cc9228cc81700069c6e71d4c7b527869e7a3dc63cf74c7f4aab9ecf0b2498d30765ed719ac0987cd5fa1058c81e57cacb3d489866f96d5962b1fba9f48ff298f89f8261e8fc4dacae06576c550421b419e5c5159a64b6b67eb7c709f145fd4ffbe4bf9d46b0b7d70d2e11\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3f0770de907f40310ecfa536486f77d721aa07371f7e3c77849fb84166389876f4bd2c1730ec69ea95951582f9f7fb9b7ca388689062f50ebf2202893842891edff2bf0449f9fd9d9b5b26a6c96033700230d740dc585e64e0365079df974d12fd96cacddf2f114caa5ded4181f63380f30a696b13000554fb963b6b073891ccedde00ca3701baae4818f5e74838f6824b7590263228e7b31d614432bf06e78247cc82f88c63ad0514868cde210e2625fe5b9162781b4ac32a53d52bd673a257863b0c137bccb2f86e481430d4ae570bca908f62c27746a1e8e1bd051fa2de935bc40278c00901e5974756f94b3824b40e695296dfa730c2493ce257fcd7f00a\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5e4895d00312302559c490c304dcd4fc4a10398cb8d545976d6b700edadac5605c44cb0c0c7c7738fcd77dd5830d0601d65f4b1211b365705f3d5fc36fd713ce5b75e18232557046efb632da5186399a1de3dfd0236e2a4244d72637ccfc39132a642e4d467b15140a32550ce67d602d06e40c4a39085f63b4e382d4ab9bd55e070eb498cf3dce7f315c28b7d83ed704dabcabe0159a7254295755c7cc0ef757614e4d04be52ac43f4586535373780cecc58d07511b310fdb3e858489269968751e25c0641519547127bd99233e0dbb82b0c1b984a7856fd28ade5eddb5df6ece6c252283d66c3477c2a5a631f0e032e5330ed8e097426426502bfdfe1434b29\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 1feb9e7455e16c9b7c572b6b0e095fae2a86e99fa92a8d65ed37f00450a20c3582dcb34c049d82c22200988da67eb45c2fe9d390161d50c3269250dd7e0f6f20a175fc4edaa6fc149a2fca18b3693b7779b686073e3c64f430c7578181389b813700da244d3725df2d63e0bff0b59d3894b646f94587e9431da3f508f23832b0eb69c825685bd1b9381d8127431d7efe2000bcfa5c507bba21b538780aabfe5aa9cbd8a075c91b487b29da70e18c48a9baa411f4f1d14ade15b09aafd0a3984013b376b2355ac9aac22b2695cd608cd9b9983821f1d570f523d3acbf119633af972fd5b311233fd0c7444c10d8b964b8372989640571ad80bf3f67dd1882d98f\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 43de19d59bba7bc49d2971d66a98e6eb34324705a3a860f74bff5edc1b41bb7b168cb7fe3639d7dd7766cfda9c8cb725c79c66cdf7b1fcfbf97e24ef45134b23e1028bdd8a3f6a50564970d9c8cdfa2e52defdc919a4c915104ec63b122323c9f37878017b5c2005af3249018417efdec9ac2cfe176a0f54b5b1b5cd949be1bf64e7e2b1d22e485bd215c61dc3b50af335e52ac5a9be0d5e3fdf6ead6e25146c429d7d4e0153a52e91504edf9e48ae8ebcbcbd753f06ebe111b72d7e24b80d5225daf8eec2bcc7d484a2fbb9d59c17cd5ab718557a452b848fc605b7f07a6a053049bc1221214932ac0892621b95dcabf0f9b2321a6af61fb4f47fa499d9f085\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 81d561d769770756f1120220a1b8abc6054560f2797778bd433e53e256419f4f58b0ad1356c2cfade14a7a081d1b93b37b5edf2cca3f51ca82c683781e25f2df36f20af9a67491b302cb12f8b96c49ded82557999ea30638fc5b3aaf546e7e81675c79299c1994ab1b3ebbe6adf6f91a4b5fe15af92f05c4f9a63339dd53675e843f50d5e74c47ef3a9f471a7b5966c7995e1dc9bbb3f14187636c8aa1e1d3bf70d24642396765333b72a2d450d839a6582c7a285db440734e2488baa416ddfdebd7b6dbab4b21146c9adde2a14f69cc69aca5bd0a80f285a4aba56b2f5abe0122edfea4b75404ff0eb6304e10886adaabee2b778e36527f38335ae0932f9d11\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3b8ef79b1e78c674f827a66f305d67324d31847c0855cbc993fe9159f7a5e310ac2b30621646dacf58e57bc7b44a139c0834b3252f9c06ba6de582bd90de6e94211431820de2e00b9b0ab100239a5a75bbbcbb1761d85a3570dda4889bf37c8d3cc0faad74baa8c83124394cd10131351defb1673cbac952c4d968a4af71a28fc776f6f070b087f69a4d924dea561722f1029dd0c78bea40575b7faa5e8f96d3ac66acaa75aa5f74d11fed5070eaeb9f05892b7faabc4709ebc8b1748fc4d97e1452dc4dec40ab4789df166f68a4c8de218abbffba4b7b1733f81c47b3bf371a35114fff099b7db6fbbcaf37f7fe5d25a0399723a273e2c94f78cd21b4e534a7\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 89721e40d6e14639991bdefaab28735bdf50739f2583cb9ab34f4298ecf8070b5badd7d818fba03bace4d54fa050117cae3f5",
     "75a97cb31859473040360b994866918ff6b83356ccf53ef6ea900a1a8ee77f31cd5cf25245c9c543463d09c4ecdcd9886513f630c9bee91ae0fd054cce64199a3e43ec3ecccf68a155f2bf1086c59ca0a3be47cec1d8638b9120b67d7ba03ebdd066493092297a6bf597ba63062dfbbd428bcd9725afd10586f1d6320738362e551ccb8631d802541ae74348dfb02f8662ff237daa10ca4efbe33cefdacfae2e6d86d96d7d06503c06375ca1abd2196bfae5c2ba9a2f4b1cc2cdcd59ac24451742edb3152852a89e5386c16bf37\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 10264b9667483464d2bff8d643de5bbc3482da0563fe1e77f11977c6c0c0b9c8699ab5b0ea87d123f8a73f4aefaade654f550a0e5197468246e5f8fe96704172ab6e50da24f48793f1de62bebf8fc54a2ddbd11304678f75831da77f3177b458f3ef73852fceb0c25fb91c1b99e865dac0deb6bfec1d924ceab739da876e7641cc3e3faf530d4a47b283b7a6954e943d0ab1435e217687ce7c0d0664c08b307401f7473e732a5edb1e5b76960283a29df5e39abae0a4ac89247c82a828273415189858f280a98ac509303e2a94c01f5e28aa4f04468744c9279858de3d3e81e534816eadd8d2188624f83135529544205e03f9aa256ef31c00cb5bb4cb69607b\n\n# tcId = 27\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 6cc03e058bdf3761fa04a89069f97bb0654b41d00d825152cd00db635d7844d75596d33685fd02f4a1bf36040ad71d5c448d1e2a95d23dc150463d85394709f95d7e37aa44fe300e3cb6c59967cceb81e5741bdecfd1d877e5e02a543e4acac44c4563df5d5d2bcb20e68c26ba032928c5019b3030457f4a828b19d37c3bc5f341f00e15f14ac1184239ddfc66ad568682620ef099c08d088d5bd0a95935401fc1091bfa2a120e94d25a54cde34c455cadf6b5f784392e3d8a687a9c56f5348fe9e5082432b29f64ddcc292e445f51ee0af42a595e860b88eca2aa486e8c3998c00a3475ba04d740cb1cd3f8f436531271df58bd2f84c8dd20cf45ba4db256ab\n\n# tcId = 28\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 177e1f3535ebf19016eefcc188271b53387292eed25eab416ef324d58b7c26bccd05e5843e49b5ea573ec7557fa3662159318994595a878bf162f5206729bb960c502e248a1bc85bb60025ef41d9aaccc040d99d3b178b609a40c1581251cce8e6f410b082d5635f94dfbd06885f2935fcfbde23ae0ae509af1f39d77c2d94c0454cb173ea29381ebdedc4983e34efef635f954f6d911968c4f79b6487b28ef427805f4c3d14d2b8ab72f5d736cd48fae65ab3565d8d3b7af61b56f691c064146e424bd6db124ac9e5fb82e9a84e2d7da8ca953fb8db2a845640e6d48532adc426c4761315bbc2639bcde29f420cb553d6ebff0a496ede669b413c80aa63553b\n\n# tcId = 29\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2a0d24c903c732f2ad18dc96c7e58289a1ed5887006f1ff7eedcbeb28b517171a25e48bd161b33f8c620fc42f23cc0a4b3ec0c03e42748355650baafe1e03cb1e6dca25bed0afaf5a56f016372dae8b3d92e21e9a5dd7b56b26c9ada092805bdd6933cf2a9017bb258cc19cdb04b2ae507894527d93a1bc85ef0b8f3c2e6fb9671c75cba20986ecccae16470d2a0fd8534fd879d65e62233d0e6450e503912569db3ec382210f8173753b32c8302137f0b3a60faadbd5a2a5c7d117f248797ed44345ed43284adf7655e7f70a0d94c4b05f484553761ec8b7be2ab5bd66d3110b4fed00d83dde2f5e0c6e0dfad1f084a851b07fb097481517805affc7e5abb72\n\n# tcId = 30\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 28d582ef90052ede462304fb54653941f2b45d26998ae7af80f058646d2dd472d7ae738fe4ec226e2937366e759d2cf741b72cdc85f49004a143a68dd4c820985a5656b583e95dfdf48afe5895f6e02d8ad5131a522d8bb005303005ffe99fce9374cc538cc78d4f383dfe8b95cdee1938a91c847ad0c29345c99efb03424a4a04e52e5f955eac56fe5ddbb9c103223e0b3883ef4b1b787ccac10d9de11b85cfb8d3f675d18144ad64ebc59823653d54b85696bb6989c54dd368f0a130d8cdba7945216b7dc1da1f0a85e73f1458e009884d02106a2ed5b66d9871b5d1143d0ab5cf09b76e98d4f03675ff3e74af40e4fba4f9c0b87653455da30e4dd0897cb0\n\n# tcId = 31\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 2ea2f54a8bb688cfc16d6566f6b94d3170cdd93451316e89bef148e70cd85e185e5e19f23f4a8e7a5e65d938a43002ad4be43b3be2e409aca1b69292928d98830945784abd1ceb0cec45984a5496d0ccf9958efeac39842ba50a1cad7130ef5b227fe93040ab7f4226d5005647cc1b0259373e08ffcd242b77f9037797cfafc0254a96edfae31c4f7ee08833c0490082bd33ea25a2138593cc88fcfd7668a82f0cd26f4e1dc65c4e010c113bb2678c91254de5eeb689b582601b79ad08198072c51987602fc78bee6bb4754361bf5be123aa9c1f8c0d8b2a804102962c8da772529947bf2dd36456f6ff6132a0c6ee7347afc5680e705ad3b8e81c9a04f6a807\n\n# tcId = 32\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 0bc548744c7474e5d904c1a21dcf938ef8abc3fd1a0e20d94564432dae05550449d4b6ade94503073f6269bb71afd2b3207b809d39a2828a6f14774bfc04624255c1a2f28a722925e28115c98b20e98016fca0f8c4b3e2947e555113d7bc88d5586bd5a0c361d290b4dccbd1cce03a6df3dacc1baa516b1664608e6b9b097e64eaed352c8dc9b8864b0111581b97bd62a0f1b9396a385de650690e36818fc38d042574401c9dafb28b81ecd14d1b9e64ba867b4bf29f8e78fd919ba2b00f0896ab7d7df12fe4a8f525cb5b9a5b1c13ea609cc7d09b6ee57db3858e62270602662e8b160d7d4b76f2d128c901ecd74a0e2188aeea9c40325c18937e0ab67ea4ed\n\n# tcId = 33\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = bf13c64caf9726506b5cf9605c68252c38c9151064fc85666c7572145a72fa04dfe0fa5aa12f020f4581f1b199025e44aee682d65b1d6f78d52b03466fb52c6c8bc2adf65a0e20cf39f4e9d62cbb6746de236279dedb71e4c3b27fa7b4263911ef7ee2164384ea9b47ab8efe33c7c41a785b3b8c3aeb329248a3ad4fe443828b73b7da87475b1ac102b582ef16d45678000dc625fbcff5fc6509f3b42e0b097617af91c63bdb661a6b92f72cb1ea33a6ef2b6d23782bb87d069f9726c8c91a7b412461d59433a85f04f01a94b7db2e6b493505f6ab51dd2cf37c22cb5b3b9cff2316fc4a7433af2f6ad4946bd3faffaf03fafc1921ba7dc135f3d06f76ab31d1\n\n# tcId = 34\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 4789ffe0c9ae08e5b4a13e8e94fc0609c0485dd09c3d10621187aca1a503b0ad3e74ca519bc90f171f2de9246967b16ff69730a4fe9073685d35105633300f8af20b543f281fc7c2580a7d90e5977b13e20e3598daed7d1164f99999c49a90d50350e5e5e134c3692bdabb75fde51fe7f09bda5af6d98eadd4396bd90782579b02a0d60bcfab72ba3ff4414cd500360b21f9cfab420ccb67465967bf5a77efc2baf38b97759c28aa1df3443713c2967223e014182699c82169375388fb204b8bd609df94f5c14de98c4c4a97ef52bc4a26907e5610e249aeca9c951b5559ab1a63235cdd50ad991efeeb5cc87c2f270f3ef916c76beb90dd0fe380ef1d7f54ac\n\n# tcId = 35\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3316b766710c2c54ce3c42fe05188c41bfd22cd91282464930c763ff3325bdf4cefe9328e6a6a9eaa0392422cc000a78903552649146773612a9becb4d7b4cdf2c6e468bf11b2ced75dcfb3f5811b596894c8dc7948d88093face5963356ef5dfe93a0839c0a3bde0ee33319fbf28949e9bf8710b988c6300beb0b04cbc841a9018a6a2fd6cad033fbb8e22c8cddf713fcbd096d5c498310a11863c276ba69d81a2327a0972bef0db5303e3d55dc4ccfdbac75885f337867e81994ce7e890dd52a0174639167b53718ad2dc59f75bb111461b713bedbb1fe00c790fed6984b630ead97647648bb09b65db20d2bdbf63b1101068d82a1ec3b2891f932ffa918cf\n\n# tcId = 36\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 4f3eb885b1033c3f5cdbf48b6fdcbd092972a466af821ebbd6f8b8a2508240ef14957e9cca82bcc1b3124828f9e2154353292ba3339f19e5e35bc6f6a678bb0296b2b5f54dcf9fb4b19fad1451c61539f5b2a3c0e94a738f25309ef87b273cfc3495c79a3937ea0cf56d3bce104b9b1ce30561dfa64867ff722c37973afefea4b5a79073f8ea6b0af36c9f49e61998381d0dbbdf9243838a987c7c446bfee0f18fd90ca023c03576c1ee24d8e2706d337f126775f6bd3ac3c5985592209b2d15f5ddb8dda0a432a5992d784dccb4d84f91e8edca9eabc4376411cde969c703eb1b61f0a8b82cce96dbf4bd97d574efb97e60c4a2b50808963c36c20baffb0ea5\n\n# tcId = 37\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 2d481e02fd9cb19356afe5a88342998ef96ef107f5b365c55e24073b815907f3ef9a628146f13101dc8305089ed0487576fa5b149ec6d80a0d1e6e8d874d1aa15f0261605105a63e41c05ba80aebb417a7fad72cbae383a26470e3ed867943a2a697b0e89ae5f2a9fa46edac74bbafec445a5d3f7ff8b010b6e0e0dd815f5a915d867c1345f39a3ff33e49e02c10dc0c87c1fbe3adfe8c21024573fe22e8f6700e9b577ba0c494eb96b55ac1fd6cc041f17f834c6b8b6ddc1c4087b6313012532365bf3771ef37bebc694fff80ae7682452d732da71a30cdee5af3f437451aae30d6b240752d87bfebf1141130d24a470fd991bd06bdc7fc1bc428380311dd86\n\n# tcId = 38\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 421326a7fb2b1c3ccef84998301905f4f7ea1c3b9a0edee378edf33a555bc379399ba64c970fd8c41a72f6d7f6149908d22700f3836fc0baa11f88a15ef9aba5337c3d5ba081715749b04c3a05d026f17ff8c781af9526add7d138e3899651e28544f21dac75fedb70d1a38f48eb711afb66dbd275ff82fa2cba43d265f07b2087821d63a5467c9ec363bef9a55b65537e15fa0b2015d8e3cebcf096c63733cb418336e8f04a86ef9f430d28b78352043151deacf135b27805fccd9ae4bd6e62b10c11173b22ab155555a88960f3d1cb8ec761c56d6d5aa63bad6b0cbb47a981e283f3c494411a4c3f27d26013e3d09bdb7efb",
@@ -4125,9 +4224,9 @@
     "d145d522428c2e9e71be74af29f8e04d88ef46ac6b6dcddf2cb91156278f8b9151d7d5fec55224acc9b4a015762c9cc7327a16ed21a060b1f17b47d23ad66a2e5276524af9acc652e48d350409a119abdc73235d9de02a26964dff902aa1bcaefcb2b3e1a8394a50acf4c6fb503da872e9a65a220b7c1d31496ef10c2e27c00b7694648c60dfc5f238c7ca3063cd91d96d6617d76b0fed8da990838cb7a33561a7b61507deeebb95cb6a455b441305629ffde7979ac76c44601081f8cc425b346b08171752d4b3f711bf979a657e075e4924b73f011a0ba10d034934f8199c3c\n\n# tcId = 218\n# wrong hash in signature\nmsg = 313233343030\nresult = invalid\nsig = bac5e1663853e0a4088543eaf4cdf36e8b1ec7b52fef42081d31e3f294dffb31276834807c4719a1cfb8c7ff8db7020b72058d4dc481da66ab60f40db119cb57b66726329194f8a8e2a22499bb53c1346778b9a02f92e015b82b4ef432a13c51f93999fd3bba3723698bb0724b2cc5f91dcda79e29c5eddad80b7d4a08e3c549170952eeb03188dac1c81bf37dde0378f66fb81102aef841a9a69743f4c78a8e31556fadf5af56d81afa825d37d2f6d8516795abb7d5804ebeab2fe2fbafd5ae355dfb9864c996b147bb5f1d8c1b4ccc3040b42876a27c83df2068f1ae264ba557a6f1c5e0436c04fae398ad4200f5d1d5a872f771934d4a22a1c7785d4bf347\n\n# tcId = 219\n# wrong hash in signature\nmsg = 313233343030\nresult = invalid\nsig = 83a66a917fd062478353636c8a55eef1bbd99fe82af9305ef6e9049d8e96758d856191bc2fa3226166670502552d6a9e2a62a26d449b31f5905a34c1199b2de9fa37ba9970d1a00baf6b070b92a59054b12d83517d3fe5ea4b07f7e234b3cce16b2783771d9d6cca2b7c6477d695fbc2566e55feae9c6dfc183f99b7e27a964a6169e6a27b16c6e51e1e4e1becb49f48d3f225214db85f5b8f729f3811ff4497b517c4bc0111396692e4f438c9a8437e62ccc5fc44ba85d6315a63dce77d13e54832835281982e722d3eee4f4ccc4c4112e881df0900433ef46cc6134dfa75ce7da8c6f96729760172cc613cfcc89ae90edf1e8126f39ca5db76f45eab8c20c9\n\n# tcId = 220\n# wrong hash in signature\nmsg = 313233343030\nresult = invalid\nsig = 60ed20bd7d6f5a7e30cfce9c7cb5686507fcadec04b8c8aaae94353f83a5a857b305aa837eb818e11a350d1c1f1d3b40581118771f57e987f1b9fbfe5335a5dec435982fa37a7921af79cf52d638a79fa13fd6007deaaf9cfb5425b7bb99269d464e4a342abef1be23f5c6383750c6563caafa863e82ceb3aac7d66e38eba4811944dcaf6bc75e56bffaa2d1070202c898b381cdec53dce38601c196b40e1dcaa5ad76d7936be573fd2bedaa6ab98dd5cdb1428d36ff98e1784adaa39d3019ba7685c4ccecb18dcd7d120579b8c7dbfa3334a65d4fa7620c6d57ed256a6ef49dd5a317675c6fdf27d6e58000195c65f5b41ad81f866859e2c6adfe7a8b444865\n\n# tcId = 221\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = 5c206e08becf1abf756f632e5a19959a8f91a57bcf02a9f826555d924cc084efa07cb56d0ac67921f8d7c40155137685cdaf3fd92938866210ab9674cd451ab7ffe6c6e6c4c079cfb14df12a169540f3561a410a83f31eeccf0b2ffa5ad426c8218de9c11685a4352aaf076c815a8cb750e7dc3906eabac30e7179657054cb11f04a70e9c07ed8ec499a274001c9790ed86a3ee1060bafde5c2ecb6545d2e19dcb2eba4cb16e0ac45723849cc5ac4d5fbe9dafd47db853964b90b4f20ba2cd1786ece2e8a34da5d5d63cd5e535672b34158ba66adc480c5b78e70cfa9b05b506abb83e03c7f3efb25013aaa0c35beed9a020dac6e8bf79ca43adaa4eb482f0a1\n\n# tcId = 222\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = 6e838ff1c850eee3039e4ea545d9197b3f4bb810463d20759b7d5bf82bca07f8f82066aed8370c848ee55474fe61b8e0d83594d97a499123b468277c6b8eff5b9f124f43766e2314172a9c6864580fd24f4cac27d254c0638b15c0984008066340105d339418aba4c25e604992b70da5930533e830ba1a0cb9cb95505b25d4dce8b7e62975cb9f5a3a6bdebbe01a868048665ddf64262d55d21de69c6cff62aa7b316993876609eb1842f56279e88c238836ab6360520f1a81ac2642950293aafc945b2b9d967aa6e0ae09a0f9859a773b0f7ac0d74adcce5aff16b450317b2441a8b6cdc3c0c2c527ccca0f2a1e7870ec6e582f0b068e60a105f4c54f014433\n\n# tcId = 223\n# using PKCS#1 encryption padding: 0002ff...00<asn wrapped hash>\nmsg = 313233343030\nresult = invalid\nsig = 5f4e316d08081fb15f407f929883188cd7ed34b98fa2fcf2cd79ca01d83c86af4b122c300f4e4075cbe94c8b10b573e8f32f8dd24b5ba74f7ceb9583c562bd966d3071a56d4b815c285e16d15572f26ad3656bd86465cc2d1adcb4ffb0b323c1c77b3d4957523d76d82b25be35aa6a4c18e53ce056166aebc8ce5538f4e3ef33be60373f797fab945368e946fe6ac51516ce38ca46d86077c594e38f5a80e2475f3b929ed320ec43c12c12c297a6f15d90aa9d82321ca9a4ea7d147328ec2ab031ed9486dd889460f800a94a99ed2ee7a09c88f4dbafa1b462cdf42840db943b0b952f574a92c972af4ba04eb59540a2a02c538007f147769e238356a218ea09\n\n# tcId = 224\n# using PKCS#1 encryption padding: 0002ff...00<hash>\nmsg = 313233343030\nresult = invalid\nsig = 7cce1a56772b4dcaf1b2fc68dc8300b8ba9cab26f96841934b207590f868a2d5b0ab94d9e31e2edb1fa2b8785c5255d175f7c5eb3ad81d20bdf20bc6f8cc622529ab26688c74015d74257c76fbb3faf101db3823f6cd164bcf6ad60c3a80ab95dc400d275348d7d6a1f946c37b8b8f38c44ab05198c5e5ac32cee8b8e9b4efe4692ccbde4acfce1ab26cd1d8d10c31929d8ae3b0d24b91e2094ae967a42393ab198259230b07651476208350a0a83de06c588f77e4a6b401bed5339749ec26231e7fbbeb690d3d29b3aaea38214b3ebc3707dc1742fa373da53d98a47f3199d0e948f285edaa9d79fe819f8c37d51aa8a60a8059fce71e80f3b95364a0365823\n\n# tcId = 225\n# using PKCS#1 encryption padding: 0002ff...00<message>\nmsg = 313233343030\nresult = invalid\nsig = 654fe698ff8d93bd6ef88c6aabe684521c451e4dafac0a762b4dcff7c159c410ce7f1ad7748b40ee4a97a72368edc33d94f024d83a2eb1188e48fd355dcb77dee4255c28a04e2b3c355e0032380336dc7e2de43ef670e578d1bf75cc25a3bbc169fe70b3d92d187d8eea1ad894ed1caef719353236e9a0813fdebef43f39fef0961d606106fcd476f0f51be3c202555bf96c4d32bdbf019e96b4935c03d0ccca0e62830bfa344339ebc679d90f9bad3eba617b60877acfd9563b413e4b7764ce9c746134c57cb40b7d4160fa26a5c8fa44f2f12d8a1c934ee6bd140bfcd61c560a3f8186da83d26f0d733028c6e4abcd8f223faf6ee371b97d765cb799e0c1ef\n\n# tcId = 226\n# using PKCS#1 encryption padding: 0002ff...00\nmsg = 313233343030\nresult = invalid\nsig = 61250794cd149921ecc1e182bac8a1c378462f8054be355d6bbd7159eee35718da038516172d30ea1806a674358a0474bfad792d1b99e014871f5d3ea1b818a1f42750aeac438b37e265119f9ec2ee6c6d26fdc17e080b2d7ad1ac5c0da61bc55ec89a2c78897ebfad49dbe9d6a0d6eea9acfc083551675b0468f78e5fe302298e97280995317a9ccfcd60fce9f6afd9e465b7934a2fbae4fc63cfcfce903e02f40b52978ed8ed01511576c54d9fa33efb708aae9854ef793a0abdf39a68f330423f79448de62ddba7bc8480186a2afea384d66b58c71b1c1b1aa905af314db3ac9f20b1449d2e5099c4a17ea0f131d3fb93fbfd79757025ed7c96d14ddbce12\n\n# tcId = 227\n# invalid PKCS#1 signature padding: 0001ff...ee00\nmsg = 313233343030\nresult = invalid\nsig = 1927a8ca62884d8515e9df565abc521a1c40ee409a7aaf19368bdc2c24f9e0cbd1f6a144109273acd712cb0e34d367d76800dc5f0ca9145feda1c518cdf7d07dbef73c189db35220e78c46339fbfdd63070d47e2bc1fd8dfa8b5bb08db1266960951da2ddd16a345c3d34f8bc59622e940a8317685a98f5883ce155471d6c96605b285b754032f998f2e6cd62139f75cd66b1822dce1a10b5af8c22d0931bab50ea1a47230a2dcdf77b720411bcc64c88efc0dacbe8610c359575a1dad37f923a6ff44b493a3b5ea1ddf22c205484cbe07ee665b04e26f9bd7ed62a66286b32a209fda6b5df0d7df048c400f27c493a2504bb1b10a20fc7a5566d2c0bbb3783b\n\n# tcId = 228\n# PKCS#1 padding too short: 000001ff...\nmsg = 313233343030\nresult = invalid\nsig = 89c981b36b3a8db41f0282f14fd9cad08d7c088b56aa16eeac5f643e83ff68d165ec6790a5c195bd37ca3e6d23f8da5187e866ef44c401b338337bd4f9312e8e87b019e89814fd5e24d322630555cdf628b56f93ef81c435be13cba6cf91db2c32eb6927c9db7f856a4f86dd127e9cac8159a990cc816edee7e8c39f06eff4c72c8128d2be37d2eb2247a9d709797af04bcd744d54741b14ec0a5b7b1583f9e12063521d1e7143690fbfda7cea18451599e76e7c2bea000ba9ffd5b8c547c4c23e8975bc6ae22eec79937929487e0d1166dc7ea9f6a1e71cef41e704e89f2d01b7a81baaeda1738756265573528a3a495919dc65abc36c9aa246691fe0aede70\n\n# tcId = 229\n# CVE-2017-11185: signature=n\nmsg = 313233343030\nresult = invalid\nsig = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5\n\n# tcId = 230\n# the signature is 2 bytes too long\nmsg = 313233343030\nresult = invalid\nsig = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb0",
     "0b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50000\n\n# tcId = 231\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 232\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 233\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 234\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 235\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f4\n\n# tcId = 236\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f6\n\n# tcId = 237\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 32f5b016f20c499f3cbe5d57253f464bed824eb521d191f3dc668eb9da87c8725a012e7969756a5ed530266f109a4666997fcc27419c208ab0b40cf42d5ae972f2dcb10fc3c8cb60f10ceb8f44394d8e66633f7846f1abb11c581a4827d5606558bbd7fcb6263b4c877e1682773fa94f1a1dba167befc444b89975daa7f8d30c6dfdfc397c21db569f887a9caf74bd8810c6bf8a80f38d2267295c3e05afc3699abe11cfa69dd385de7da73871e4c16abfd1ba60abedeb54eec3763cdaa533abe970f75d63d2e936e75bca2d1b467e42490065644843a509d2dd58d178e28a435ef4c48f2017c5f7244b4d8a74fe024b513cfb36dd2d2dada6fd5e8975da1595\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 3fa351c977a5fee02f875bb284a25bbde9175cddb79e53ad79b76b6e376a8967ac81e6ffe8b5091b4d4ffc3bb4394850eb912d2c98f60ab4fbd24e0b5b28b47e456d36aec7c11fedfb52ad0307ec24380ba1a2323e7f5786f655a6f6f6048a0bbf6e4257c22decd00d55556d06bcc138eecf2d51f2353df2c82c29227890f235cf84495febac0b074c35a072cd97ff206e3fb534de0315afcb4c36918ed8e39e84c6a1bed4941ea9ade58d45ea215174b0d45700918e9a3b44c1cb91bfa52d663ffd04dbd70889b126f030ce53e613d47f7cd3324856f1c41286d6ee16217b0fbbfc3ffa4ad4f2d323ab36fff4129cda11e42560791141ea22000ead1e2538cf\n\n# tcId = 240\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 199e5b886bbbac2fca6542b31726326be09fa9b865fdff482ef32ca5e91ab9b8a594ad1fca636c08d5ba242ee503d0500574fc07dfeaa2ccd6b0ce2cec51f3d97512e89494d6a33084095e1e3afcfd013f95952e3910b74f467d8d574917d5e0086973dacdd005d96e0cef0f6f518994335391238cadadb5871095cb399e2b5af51e06c00d2b78ac3b10d16e2a39628435e523f54873265b97874ea8f3c44c0bb331167b66ad055cbb6e236eed72a80081ace11bae8aaf39297587e5be4338f3baaa2a6623a9624162ab581371fe58f0ea58efd68465451502ae27596cd58fe40a841be295a81df636bfaee16afdafb01dcc717cd02b6065c1e99bc918f90786\n\n# tcId = 241\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 7e6af5ca287a5546bc76afcf42b1d5a8e4b3c3e276f6a56bb643cf3d84995437e830bca498c651b873b48c39493e71c6fd23eb76bd0d7523e092ea4c8f106a505f52605930b8ec244ac9b02dc14a089882462cd947d6e851d6c5999ab7b5325afb1e7c3a75f72064f6a66307dcfd98f86d8e705ac5d44d5a62023d97ebf9a759c6c657ea29039ee63370344610a2a072aa459b5309fa1ed4e1569ec40c57578166ad80a5da0f3b6d4f48a9c5cde4435d8edd5d909fa76228d8d7ae71ec5709ad08c24dd49280308e41339611df6f2e339215a70b901f189aa747be01867b8fdc08ba7fb0a867f3ff0e0aadb123747000db8d171b9864bb95885e912f76b3b21d\n\n",
 };
-static const size_t kLen166 = 148331;
+static const size_t kLen182 = 148331;
 
-static const char *kData166[] = {
+static const char *kData182[] = {
     "# Imported from Wycheproof's rsa_signature_2048_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001]\n[keysize = 2048]\n[n = 00a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 840f5dac53106dd1f9c57219224cf51289290c42f20466875ba8e830ac5690e541536fcc8ab03b731f82bf66d83f194e7e180b3963ec7a2f3f7904a7ce49aed47da4d4b79421eaf937d301b3e696169297b797c32c076a12be4de0b58e003c5123051a84a10c62f8dac2f42a8640008eb3c7cccd6760ff5b51b689763922582845f048fb8150e5a7a6ca2eccc7bdc85349ad5b26c52137a79fa3fe5c29ab5cd7615013219c1941b6708e9c3c23feff5febaf0c8ebca5750b54e3e6e99a3e876b396f27860b7f3ec4e9191703c6332d944f6f69751167680c79c4f6b57f1cc8755d24b6ec158ccdbacdb23107a33cb6b332516c13274d1f9dccc21dced869e486\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 8a1b220cb2ab415dc760eb7f5bb10335a3cca269d7dbbf7d0962ba79f9cf7b43a5fc09c99a1584f07403473d6c189a836897a5b6f8ea9fa22d601e6ba5f7411fe27c638b81b1a22363583a80fce8c7df3e40fb51bd0e60d0a6653f79f3bcb7ec3e9dc14cfb5b31ab1735bca692d50ac03f979dda92747c6430f8045efa3513ba6e0ce3e9e35570e1c30c8ebe589b44192e1344ca83dfa576fc6fdc7bf1cd7cee875b001c8c02ce8d602769e4bd9d241c4857182a0089a8b67644e73eef105c550efa47a40874289395ac0c4e02fd4ba98e130a4c2d1b95521c6af4a002ac3bdc6e52122ae4c08cc3da1c896e059acbddec574ac0432f6103dd97273d8803c102\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 264491e844c119f14e425c03282139a558dcdaeb82a4628173cd407fd319f9076eaebc0dd87a1c22e4d17839096886d58a9d5b7f7aeb63efec56c45ac7bead4203b6886e1faa90e028ec0ae094d46bf3f97efdd19045cfbc25a1abda2432639f9876405c0d68f8edbf047c12a454f7681d5d5a2b54bd3723d193dbad4338baad753264006e2d08931c4b8bb79aa1c9cad10eb6605f87c5831f6e2b08e002f9c6f21141f5841d92727dd3e1d99c36bc560da3c9067df99fcaf818941f72588be33032bad22caf6704223bb114d575b6d02d9d222b580005d930e8f40cce9f672eebb634a20177d84351627964b83f2053d736a84ab1a005f63bd5ba943de6205c\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 1758eb94588e6fc4f50c1be1afcaa41027869f304cad513b1fb12c2f446d63cdc05c4830a7e3e630da7b2da4f7867cc173bf6420f9732277282596de41ded32e21d0cc31441174da8765f57419c7764ea758f55bc17646eb100c435d1ac0eed6fc7ba6de5f832094ee2f479979765e05ac9976788db3c241a9e32a0da864f0019a87646ba623d63f4411af5dee1be9ec488c7e3e1b231479de70b9ac5f78a17b1f4120aece45f26c07e7bb345fdfeb05e14bcaacc614672a465fc523624cb19f66f9c6c3f642b832ca44cb25176d679f0e05606c3fed022cac24c2bf960a406d48818e3eb7ed53b0446032469047dfed95fc18088c92d91d93722c47f88163a8\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 513a5abde16b5e0ecb8659d3ca0845800adf75cfc4437d42fa34e7aafbbe35fc5984d3560cba938f9a622e932bb6162b7fbb6cd8c1cf8815f28c495995ac18cdbe8fabfdce29c17aa021df192ac02d080d7c5eda6bd4c99154178a9d5e1cf3ff4177106315f4e6d74c991b601069acd60b55b3bb4dbf6316c35096a487d6756181d3394944f1c742a2f4d608ce4f6abbfb72347ad7d342ae15dd6d1049fbd0ff55f4d7c43ab805f81ff1fbe9256b5c78c2de6beb787f4b6d66d290a3d4c4857368aea5f7ebaa1296020c8f9e3670441a08038bb810e853a654e44316a4e52428745123ce2714020d00e55a9eb82f7fb41c73d852a82b003670246c6ca2045fc8\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 38c042a00d6f27742a46f1f963a7b2e04f0eac637849631a491b8e4e58fc721c6ce620d5e705dc8e73409c3909c1c68b6bdb2b30f882cf2797e65030b38c4e7daf6fef9d1f115c890086cf54ca3e7c2b21dcbfd1250ed1d925810970f17dbf482d1784f296adee9ace6979075c1e12f5580cfb322e8737db9d127d38e1b99ed87ec49448a18a6fee650d3c27e4a2a86a3d6e3ce4fe64120be60872fa07a3f78a112715c167fb6c900698ba1afd824087a4cf733335c4a6d5120e3b29bc42f3b3d5db79973e4e321e0910a288d18cdba172d060283c4f4c6656e9175a18b756b7d06251e9060bbfcab04978853eec6032850a0e757bc0c61ad38aa4eb6bb6d907\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 2ae8d95b19cbd64d0e343ff413fffb85d8e6713c06ac8a1ceba7f3924fa740f8d2b3e120fd71f22711e795cd6468c5e263b1a5ba6ac6b8fa9e23d2d6e7243f510592a61d134e68b8ead00612dbf38c5b7302abc3bf33f23e6d4816a6e3ddcea6482566e84f57464f7d56de4cef0b2256ef21874dda4c131a47292ff8ef853f93804483c8e6373d39ca3a22552e75427b812b861de6a310ff4c366f6f6604116efd9770170aa423554c4ebbd2b5c0698950e66bb5b7c5c346285d9f5c35146255736b6e818e8e77983c93b21e7f60b04a7a525598e7fd8049b181000bffc7f3753a504370f6bb70617ac8e914deb05a198a5758a459c9fcd2fce1aede48e8a852\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 095dad1fd82bcd36652a381b7f4dd656bd89b40aa58b56da4f6aa8247874b935e65d2b86752d537df7103884d39dd9ad3d65f87404526b09094c5615c6249979b0dc58d2199ae8696a5b76b4bb03eaf08c2ab6aec686c6b1b289c9b44f648bd30cb1ac6a64a73d68e59cd05e7aa1b780f4bfd7b83dfe3b884ec11821a93dc5bbb47a00eea4557b6b96b5656276001f1f295ddbbbc511a99b9a665b9c2674c8af0d812286d0be3ce74817ba2cad283757de35dfb149f2835f60cb03ff155524a57f78b148feceb84cd20b0ae22e3e48f433fbd9bfd60be8afec93165ee0310be961d3695f309d031320c830aa6ba08b5a51d943797097c57630be391bd23736cc\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 8a0e82d4f334aca72a718b6f8f643f69c6048d619d5eba71263a5d2d3ac7a7af133b780c7595ca2c982c006e861948f543cd0210c758691f9626842c25de2843ea314ca8eff285d47e0cffa54180af416004017034962a80a5959c3d3f1bfc154a4824462a93c014f6dfe920824f414a6e30e0e5944d480b99949ec7bf64c4a7461575933b17d7d6b0178b5192392ace3ed8469e8ac1dacae51ad5d3ad73dcb213e056d04596e64d8c0703def3110c7cecc93ba8ac8059f0f3d66b89d8712c62b41d407e4b4a104f4569558b0290c213cad6d0653898b9df8f4a453ab07d13bfb7598d505abbd0c4987e4f1ac66e1a523e113e370ab7cf990f0cc63f50f4f0a4\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3a380c29ce2f304f33a08aed4bd92cc6e8cf56596928fbde6b640cfdbe1dca564cb01421789c7fbb49856bbafb34da6e1c8351fb12f79a4614c33e50197939e237e0b987efdbc042bdd09073f02624c520f1e9524ec1cd10e917b9237166e3689afb710e6c4ef644e08ce866da6dc8849e0b2b4c6615b0aa803bf112e9a4883c8e60660935c43fbae9d939fdce49af603dceea05246b220a5cf99044f0c09dc98f3640eb23fa218d1421adea7898563144085f2c2d1c113e7046f80ff359b2f65742c58551ad62eb6dc6e7465553f7080fe100fcf1aad89fb079bfed32c8c4c15c84d2193de22385df91e9825717feb5209f1dbb47962df24f3b43c114417ae2\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 8d9c25235cdcdcc7ca2558c0be14f83afeb303f00c13106ac5affc952af527a0585cf4801104a7d019fa2e63fd0b923c061a24b8be7c3105443c8eedf4a033d3de802adfd80f872d3c505f41e3feb116f5d5f31f04df3e448bc7e7cbc2343f7dd4f4c3d2670ed3d3c66f91d626bb12a2001160a123d03b77d2a6ec53445db517147171e3ba3cd7dde902c486c74e8d8d33d4f7699791179d1df4fac78cda67da9138c18f2cc886",
     "3018e1739fb309408c62051b715096512602c5c4c7e7c394282593ec087832fd48b4f353d8046600e4152c2092632a79bf05497a13840e171047d79c23a76896235e9d5f0f56a78d3fe472fded2899e228f714690b40b66ee7\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 884b4b6838fb629fe42914cf15257111b502385d71dae543d03597a46cb10a6122f6d539ab411161ee278f16cd3b5f4bb7dfea0f907256d96cbdad1f1fb40093e9f5c97880814d86091bfa080bfaa5a955af9d15e9460610d4c859332c5beafc24fc9e02848e951eee2797246bef20dfb89e8e949ed52af39663f5f088690f1a24abf8a8e221582282127344bf740308d146d6d16b127d1639071037fdcfd630342ac134ec24791cb8905b77dccf45eb3ed7e9b2e72e60b5e19367fbb5d1c41853d79965530b3181e4cc7c24b198a61bcc2e63806cb6b3c76757737e35066b7f1bf0dd709216fcdab4f35d550b31ccfbda9eb8165aa78ba4b4e66e316ee07282\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 9947c137ebf7013ea9e41f1ce93fd29022e340e6ade56c1119cd826430acf9833bbc1ed05c1899757a79d3104c9b4133ff0aef7e1cbeaafc2ada2422bdf9e29926626527f947124d5549d9f4fddb809f84923aa335d331c392a5ae5e29cb0f503e230ce7bff114206d5dfd51b812f9ed5448d9100125a8cc2324e560c69f4a492988045c97ab90a2806df900c3b95ab95bd634dd0a50edc5312eeef6463bc4b62e54261cc67e9cb9caa9a0a7550183c9e03f26bd5c8718dd77f54290b3a27a054d7d3e39e8cb45529d585ac0e507b8688219d2b8032268020b68d2284f9f743debab5cd47fb3fbd77fdfe3a9d7984b11a37cce190ac89a472578a3332b150f5d\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 259cc7e43882850415f4d7f2321fde08212490f6e9929c37c6a60cf686eec1dee385fc513f5e4105f19f2d63565b2d3762080634306b4ca87f857912bc062f31de6cccae9b48213c1b661ec9874d426d74e4c23c0ca53abc8f7bfdfb9d32dc6b5559f6aec33a5b9445ec4490302af6893890f57969de00287203d8df9a511b678caee2a7d666d9fca912826216ae3c62a37f12dac1412100c966ec7c8ff347eb79566784ef86943e999d0d1aa46fc9e5b90e9b91f4d16bfc2d5b9ffd4515f1d23cd0ce9612d19c28079702e1bc96b98cd86a5708b9000a5d61777a92d7d033557492f9ab1a4aee6719dbb14e6c3b4998480a8d49013898a5418bc8c63c41c5f1\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 8965489287b5c6732e9269f3ea349830169f9ab644076423519bd18d744e9547dfa82d9bba9a8cf4e1ff5bcd79ce2c4168a8b6b1c7931bf4eff64dd18a1728715274a735b9f529a2fe7b02cdc2a8740c2f16bed7e0ef2ef003089a30937f04c2d0617f70db8d67ae9f6200b8279200a21a7862b7cdb406d4855d8fc950a10d5430424e4872714cbe07ea03f36689f756ae0bc09b08cf1f3343cac1e1ae6f943b5d0b2a3df116b0bbf2d433a8c03fe27c6cf2de2c0603b2fbe174a6a4d0009248c0a04ee4b6f393195955ba0818d5e3abea276d9eac469b5eccf6b37d42e38d840513d7130009bb93fc3d208b89429d053ec1fb5b635e6240b3f0021c7a243640\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2503d3586cf23777bcf02ac28f32daa1664ffd2e2bc3c34377d80718cd02195de3de6d10cbb057db69ca2bac07881497189bcd66b181972aa8def94a879dfcc1175aca14781a2abb39cd71569b721e69e9d9504b4ed54a58a4d8baa5f17bcaa8ca9524ed86cde37a86139bd62502afa770f4eef4293a0ba157968e42e77dd690a3920311d24013522295cb726e006a2e7f26dc287fd2754087f784151ac30188937c99cb20ae8d26db527d5dd3020742e8964f518bf13bf2cd36d99eacb1c81a6a9a46155894153d3c1a98e7671233febbf4f30bfad312e0dc4a9520a97098c634966c204aeffe7e55543a436ed003ce0772d9f57c8b0d3164ddb785639314a4\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 129990973396b70468d380897ccbe6930a485460bfc199c7c8efeedf81c7fc6a98f47c0afc29546c92d3ac2d93d8b1c6909642757fa52de1375867a197dac0ee58c5b62f12182a5b4e703ca981ad344411e2dc3aa6c456dc69651cde35bfe136ca323753137b4a28571eccf8d1f0cc4cb4977238dc33827f1bf670d938f5b902e6389c10b564608b396feb0cdca57f5bc3ad6bbb2cd324d531b0c5538de37482a09ce103ef6399cdfb404021c836151c81adf6f852f9a96919e4e78ce76aec77a48bc5eb224a3fc404373e28f07a1488ce2fb3181075b852a87941bd11735b3cd6f5bc0b660031fbf7671d3bb4f8c9f653b8c36e89320f7532ac0fab23dfadb0\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 2a004204ec4ec1515b855f1dd802299780835fbf7430f8f5861a4c6d86adaf38159858810d8645a3076fad16d6daac69b942890d6cadfbd12affcc3d3fad8f07e90c2b1e5aecfd9716ac9a12349e4a4b29eedd9bf59d875cbf028bc9a1a0cb4f5ea77b7ad026f09a208d3d39477a1ab59329cb64e9edb6e7e552b8875a73490551df742ab300f254b7805b4a9ad72b650ca944289a9c7c5223d760baad3dea1fc36d2b5961684840939fab0ffaf7fbb7e181ce3b92d9f7eb833235d97431b76891ef910827d110ca9fc88f7e4f98e84d00a98a1b5c6c70d86d89f56bb4f33cc88936db2b7f8127d11cf94d91f56a07aa7880f6a7c3c25b0df691d8657c330a5e\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 002faa1b204fd30ee0d3d6d79274f3b498f736bf6e6b34c0ec6eb418b7a4c105c1a75669c092f52fb1d39b2247a8d5692aaa44d4a4d70b8f9e636dfef370db9315fc1b35434af3ca21afd366c3295424bc1230a898186105a07788b92bd42c56d5b66a336fca64fbe58a843f391fcb58588466e0ba484502aa26c50ae35585eb95fe0ebf248b7a57782373cbac21a00928a091455347127910eb0b9ac35c1bac4a99eee0b718550ad282b4210eabe0602823209902b2bfac9283baac38940800515877366117a2d383e8f0cd09de7c946cff1eada4f1f97c44cbb3bf3562ce21af7f499af8ff40e13b907e5f4d1696dd52e3726570228095b89d4ed958e618a4\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 6d8de4a2cc01e33812da2d364cf3cb4fea7c6f37b4314c123eccbb2e4e9ec5d593934c60dadd5fef2a273d01447519573f701d398cfbb72b0c19937e9f7805fc4d354e292c5d0fc18bb872f6843a9211802f5980538ec6b100e3b2b744693a9b8d07654d2655414550a1645f047c865291ea8043137758a13dfb1652ef7dd42182603ba597eace857f39a0b7ea0c9a987326f55358910cb51e4141653e9f3c3d73f09686463433520ef0786163efc39bba3c62cd5c3599678a28b90470bb6f19fa1a56cf60e8c3465f8d7082728c20730227a2a3d2a6a4cc50fe0217f35a45459809de1f921ac5b6aa833a85bda15e288abe640829bc4a0af1aa9b3692a414a0\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 4c698321f4342f64a87fe6b199d5800af12d39725e449c79706e9af98b51a2d0d724663ab87618b06c49d3c1b98d97db35fbd8746c1d9a61f31ead8893ecc072057ad4004a53009703f66bc2b4fa7fa6826f54e8b873c79bc19ef71fe61a182a8be6cdb6dd35d87d1f46746022f98360f3870f49aceac4bb1a839977af2096539a2d182dfc4bd97af34ea075ba96c39c4a85b3ca83002f97e992c110d40cb6c668eb9fd022a4ef89988095e8c513153f99e37d9cce75a7ffa0a55af6b7d8314de4690934d55895b99cb0882adb346feb8af0480a4fc46251649d6cb2e4358dbadecf27ac713dfda9b8f40cfecb642b39bc1cca681d5628f4fd30e8788635e937\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 43fe92f5ab6b2583fbba40b493ce45f9eb5f9e0254c6e2547ed4b9543a2c3a927d5b9c1c12525f4f94fcddcc4c586f4e16626ef48fb0688e07eccf77dc65a26c28f374aa4bcca05c72555e7f54d896065f3d44a728bd2ef9c8adfa698b963c16b13c1d5346457beb6a66c964330e0945dafc5bf75f4ff26e84c0a8bbc854c6c877ffad409b11627ba951181939ba9a2e28764de34704a5575f43f70c3f4bc5d74f4d651e25f32fe238f193d4ca55c04463dafcc2bfe50e017fe9d3bd319311bd2d972f5e04d8324a4b26842fd66115ebd139440fe89bdd55d10e14aea5d9e3f6a5c5fac4acada9d9e2006e6a0c36f4b94956493c9a582eab35c69c9add972d40\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 64401a452e3b56bebb1d5f3cdcac3dbb0a6f6e81bf2fe938143b9df7e8f6380687249a0c30a2bc5ba0fdb1e4d0fdecfdfc74064d365fb8dbca0cefeec0ba6fb4f775b4650839f03dc681c1f78d298f6c789ef4734d0a3ceed09ba8850671911e5e68af41ba2f37f3e56f7864fe4775ccc6af928876290ffcd20b988540c0146db97e333da0eadd4772cf15cb494e366f1f3bae740dbc69cd339a5d1f8a5e608cd61eafed4e85886796520ec5ad7240d11f1ce25463b57d0723509fc368f8f81a6c63ed2c61a216629dcdb9fd226215f8b248e2dbab5cd4f62600fbf921f4fb666384333d92251578dbdc5dcecfacc2c4435a211cc984346bf254b7cd52aa2bf5\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 8998ed832b496be462a431b1b32c3696374d816bbdd2e348d98795a5ad27b02766aca9b161d8e8c94370fa38c56ab0ea9aeaa0bb37fee33a7bc27024024d321b25504874343cbd50dc31ef1429b16e2ecf53deeef15b4a8e5a447cc3f1b212179ccc5ae4a62e5af2127c02e53e8a23cec5f1863ed53e62f472ea65d599272a5e4c0a0802553f31dd22103b7fb7155fc8ef4a3a7061f78f6e72c265e561436159722da4b8850204a7d85f7d45c18f5ed4e452cb146c47963e38cd29f2dd3652720fd4206bf96ba2c7601895c8771d1b73f03fa88ecf81b8a8f2f290094d85521048ae0c097460cf8340ab32262115b5332abd75950d46ae77ff03cb618dd69e52\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 09634aaa108980fb190dbaa425d9908a4237a2531c6471ad47dced90ff65e217baa0d9a8b5167d1c07fb414c88214e6caeeb6",
     "a1809cbf28f9c6083bd54cb2fea79296ad2dc1e27de2e96c056842ad7694391b40c6b6a6693c64fc1e3dab13185f8c1406ad4d2c39a04c3f6437519489b3d6185d9415d97e9cc405dcafcd488cc4b93a9df5100c1fa8dd31c60575dc64067f2fcd26d1f5c44919a4e28ae00688487c279130d087161137d6fd480111d45b03057bfb7f79ae75362439775f28e84839156b9f1fd1aac698f1b1874ca19964d30a725e92d4ab784b8da18258291f86e0116c9d3d4be6931568c109068ec52af3a26aed5ec136abadab1688f06488a\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 4e63d527dd005236fbe35e838f51ffb09afd2669b684d9bf7488ba49730154be9147a63dd33473ebf547272cb6105b114f72f544e4568d45dc814a3c5250acbcbcab008dcaed3458e02159bf5be9e4b20420f9e4c075d27bb980748528327a1bbbc93f63db57ab03e7fd86c61db3ff8c39bf7d818a26d573fe57f5010718021e45299624e25a2f5acabcb3a1ca608fbde28d13cf74a3f58d283fa5a41e875854cc480c5948d2c0d57f2b857988a28e34a7dc5159c86ae1f970f3e318e9dc9d29641a521eabc66353ff0dbea4f237bce4ae546b8d05f6ad19a4ad8d4cd086b22458b311eb970ca33c484f0b9dc544ed4ddd88e7f70edc32702d66ba570b749428\n\n# tcId = 27\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 467e9fdad9a1f83ffaf7622a156384920eae46b89f63c3fa61c5066786c34108ff73213ffc7ee9102f367726854aebdd9eaed49b32c88517e136778dcdd7e231716bd618261615d029241a77f148c1e5e39777a9f85fc3d4e9320f2455cdfd3280184ae17e35bd9be0a0a0d1c2a2d321a3bc86588fce12d929de1a2f473026e0920b1cb8b6dbadbe3810af22a3e95dabc9553733afa026e0c7847493182aa1f3057a3b227775a3d7ba139c1724b3196f6300ca4ef457c2bb3f09bb2be6fb4e7caee6d4502c962291da0e499213209a28cbf2c4adf5d559e44075631c3035990aceca49bf6161203390509a80bcec1d274f1e9a1bf26c9f59244a695adb2c5fb0\n\n# tcId = 28\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 063b7dddb7483a77af978f1f09180b98557643574b40522da25e8636d5e5a71888c79ebc5de9ba6ac0e4c30c8dbcc4399661b117e4252d980822cee7cbd4d2aed3a10f91011d11ff92228d02393cadac68030123f52529d76ca2d41546cbfbfd28a43c5d52026ff582a6bcdd10a3dd944fd7232bb950ed162f8827a5625ff322bf98e079dedc770e4d586a7f28b4e19452a353eef2defdf56e0d07dc2fe5625d91651629c5b7bf6e180dd27a1cb51787ff264f0138b46bbbd32c5e1ea63722b4baa8e235f27e283ba6c46f1af28bd744e2db92e326ee7139b9e5370fa5b5e2c2bb79b60c9f9e305a8acaf29340edabf7531d17fffca6f43ff07ef5cccb50eb32\n\n# tcId = 29\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5afcf0d327a427f6d51b87aec24789fd7ebaca9c4eebcc307664aa6e92b6acc22b112faa3918ea3ef24552665965842639a532a09b914bcb3b953a0726d5f88eeac1bf65bbdec56d55bbdac534da0f83e182dc8cfd6e9a59095bc82b5f0f5f56a1163f716ce722d80394a712bf0d5d24cc13961079082e4598c8df5510e20febb3d1a778fc5876c65a3e1d3700ea537c8d67f7534780fa8d1cb0ef9c39e439dcb8a4c8b76a723ff8309e3f3cf39e6cdd6e52edca5308aa6be2628608d5206e82251f9f7cd711183f3604d83e1c23ba71041b92d33a695225b1a3f61fc742f969726d79504b224be259e9115f1988bca3c1e2b61541527227c3d629b22a95791a\n\n# tcId = 30\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 543ffa8db719767c9eaeacdee487311bd4c1d3b6bca2a07c6a3989eaad5f39042dae40b45a9b5aff326a2994f36f0a2a59ff3d46a3d4abc705d26afa3cd35a35bb662292c6ae3a47cea9b32de37cdadf797cf72c7c62f7c9b61024ad8c7c82f5efa27c8dfac28840677116183f1f0721fa36ccfc13ee5863589b0433b20b6e1c954cca97b3796232a3b0b2b6205382de80db8487bd00b620a4b423acfcaad649a683b915de7caa65a4efa6b0a1249a6d90348171b816deb0cf8c99013ffd84b8ebdc660866b56545de6dc4aa23156cd86c5bf3d5765ab48d8d601f43dc898ea6e05fc0460a28bfa2a776e8917c59f02f1c8e1cc454558658768acfd717718c6b\n\n# tcId = 31\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 5f912ddc495c20f1975219b0b5cdf0629585a98d5565e8ef2c98fd945cd851d703be32da38e6a376c1269734de5e72734cc685cded8a31d430f526dc3788dc2b54de838ce6514ef970afecb8bcc0b2cfe0c5e8de29d2a6c009813050114374e1db8d7f4cb714ab291a6095b7e2713a28b5dffdbe3ef127307e10155e0386e3af886cbc8e1b9b66086dc9c48d07e460fa4cf66197414a4e1a72f6bf09ca94964d668666ec1daeffc52a3384cb61abe1a4ee0c26674df776c7769fd0c89667a421855de0b060b169eeab02ce0005a1e7d7a126c8583da8a4900f14fbce7ec1b4120994ebebd3e97e0d9465bfb53f2ebef725a10fccd0359a2724a9ca18b2b7f715\n\n# tcId = 32\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 5dec8ec2a5ccc79cec9d4455a2479f562c049430d572b98e5bd44b83ccf6a08d94cffe4699dd29568dbecddbd28c92c771e37e2ce716ab7455e4a92ad87f9e5b76aa1ef1a08e3a77633bc71b3756e3ac956eb8d5974cb50b88a6f49f36d5d0e84bfc4d379621fde3bdfebfd9cd916e1294c854330218d50aef788aaff97e68f7cdb2e7a12e8350dedad00a0ede2d72fe294effd152ec33f95d66fdc648904c657eaf6fb0c322f5881bdc1f16305c3ef90c3df597a0e75222b82d79f5d6dfd913b2f9620092f418a3e67c48823b85e96b1fe85d306f3653a799811a1ed3dc612461383a6c1eeac737dbd2c6c20fbb56567bf544d199a474bdc38621c8b9bc7920\n\n# tcId = 33\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = a2ada8ff1c1821fadf49dfc156293dd59ac8f51367633f73d2200bbb65bd960f7b888d1a843920044ce98528773f3d3df57de92f129c03e1f6d425d39ac83978c7c8ed7cdcc8d47a778350f99f8fde4f6028d5ea77d46091f98f72279c59fb39ff8f73b35ab1c6748970d325c65ff49fdf833e8c2f40621bb770f2dcbdfc34fb22422f0105f5f582c90be73e664c215cc6d89419a8909f0d13f6535182aa567d4e16a2f7ce1e562a6cda4582304a5cef821c538de46c68509f3936166c109da8ef13f2000117644024ee1ec10e8ee4056879c07a6604956e1d03828dae5ae0eb60c322dbc6ff183a57b258c06a2b837021d4df94baab66be636b505a5a5b2697\n\n# tcId = 34\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 743209d44a3c907ca08c0b236b9cbabcaf210bf522de862005c977bf7099cb7a38eb9fb15b765a044703c9410082b6a35a7866821f33bc2e2a58ca8bde08b78ff6b3c53e771f8d7fb43503d8060a884ff6012101278564edd6d64fabb6add5f4d4c62707c2ffc45f904acb43ca2ab5609a23daf9cdc58aaaa638f6325a54a5e272b253bd57246d0935bcd19c7aa31f878c474c8298ec567b6a7e165c2e7eedcc80748953c90d20699ab8303062580d4693c058ac761678df6c875bd91d465430afc93cf0bce027ed00a35842ad560d79bb640cf3ea55d8ade362c258fa707397663fec6787d44ec075d857a6fc55c50f8df898da77252d8903220641005177e5\n\n# tcId = 35\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 098464aad869fbb37c36f56d750ba97ba6bbcf96c9e25d92fbd5778fcf214f6a24d1fa276a14b5945320eeb37dc9ce4cfdae21ba57185246052ae26718b549a59a81cf26387356b3d3fe39a45cf303741587e664244233fa2263cfc6f209f796112d61ca5e9f16e362765b0651e8e197920137a3842483772428b1088e7c1a7aec2152b62688c5655410ebc4907680753079706931359e893ac76ebce92a3572c7eb32c58b386d7ab0f3af24acc5047258b5b7c0db4c1ea4a4b64203d65aaf6c879ed89bf046ce5ffb1c647e95630ca485acc9fcd6beb6a5d17bd54fb518cbfa226d9738beb55325f1883ceebed860d54f5db3f1670ca910762d877f78af80d7\n\n# tcId = 36\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 498209f59a0679a1f926eccf3056da2cba553d7ab3064e7c41ad1d739f038249f02f5ad12ee246073d101bc3cdb563e8b6be61562056422b7e6c16ad53deb12af5de744197753a35859833f41bb59c6597f3980132b7478fd0b95fd27dfad64a20fd5c25312bbd41a85286cd2a83c8df5efa0779158d01b0747ff165b055eb2880ea27095700a295593196d8c5922cf6aa9d7e29b5056db5ded5eb20aeb31b8942e26b15a5188a4934cd7e39cfe379a197f49a204343a493452deebca436ee614f4daf989e355544489f7e69ffa8ccc6a1e81cf0ab33c3e6d7591091485a6a31bda3b33946490057b9a3003d3fd9daf7c4778b43fd46144d945d815f12628ff4\n\n# tcId = 37\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 4da37914ee4ecf0c0973cc89f9476e2d872eeb2fdb3eddf6fcbcad9b21b8eeff2dde26be6a26d5d5aae6300b4caf4f77f2ab7907af2434026c3369d76268c88b1a4c555c9d54723b17ac48ca1118d94e147a4c63c2c4baefd244235cde4f9c254bce8c8c21b45b7a2fd9d5971b21abad1bef74b9d5583d352ef67483ee611ff3f97198c023cfc56c667c81ef03bda4729b2eff85c24e75aafdaaa4c0f47419d8a63fb2ff72c074ffe985ec7f88bb0e93cfd375c656137722fc6aa45069771c6c66d4b109a5dfd8500331d8d840edf9a5c8024b2520daa56641ead240033b0aa300ff3f951009ac46a97ab9311f8af9467b8ecbde36c9744e44168314f092529d\n\n# tcId = 38\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 1aff9b9ad34e142421069661c71e35b98108a8f976191b45a97cf12e8ae8ebccd64c0fc6a795f4ed798fa4a2f79746c57a86f894110c1a5402dd72577c2bd9817a9e7a1b0b7e389527428140d53f4918b305e154f7c143011dc27ddb874c52b57758a3f4ee4395108897f0cf7b4fd7136ebf991dd9758bd2cb85cdc6f9d96a40f8e6a0c12970c18325d5742b80ae499da45655f972f33a80373a93572fe302dca03cf7e004690618c5b725e3b9be6e05dfd0ab8f28b8b994ea202875268837d3876681a63e88a410a0bf4a4c41f7336be2799c6e62514a5ee0422cb6d5c57c2e45e9f96d667f8629e0987421f01a9391a3334d",
@@ -4148,9 +4247,9 @@
     "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d6\n\n# tcId = 235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 57e8cc1dc00c07383d89a79b5c8e4f5bde2a2ba55a3c7201b3291c4d805b1b2eb36f8f326b542342da180abe508669bb6cc2dd54e327bc70c1e317ba93a0fd21e7fce22a0c597c7420d1d5602ac43d9348ba3eba561f250e301ab955b0dc33e4abde32946b9b3e86c8bf07a44646ca595960bb988fef04b2824967e9da8b0264f1da0659373935313a574b5380f0b54ce1bc0dde423bd3a54f6ae5fafa772a55c1c44eb6edffecf13e6e5e1edaf87a79e338577304141fbc44f0e9eeb286f553f879addd6e12e436fa3af51ad53a72f2679f0ed102d504ee08706fe111eaee49d880d1a0b91924b3b79968ed0f9bff446dac199ee89b158c074927d27b864498\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36\n\n[e = 03]\n[keyAsn = 30820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d0030820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103]\n[keysize = 2048]\n[n = 0090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1]\n[sha = SHA-256]\n\n# tcId = 239\n# short signature\nmsg = 33363730\nresult = acceptable\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000989e7ff72e67e680bd21d5f966e4ad8a48c3592dbacc4a2f035b4ef4d17a2f25f8a9fef7e78eb99d76d68629ed02d67c43c4b7ec8c3badc32e3d0a524c326537739b0fde156723b27c23ae2b09895e470c64d700f5c\nflags = SmallPublicKey\n\n[e = 03]\n[keyAsn = 30820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d0030820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keysize = 2048]\n[n = 0092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c26712",
     "89bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d]\n[sha = SHA-256]\n\n# tcId = 240\n# signature is close to n\nmsg = 32353934\nresult = acceptable\nsig = 92bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240b8bf4bb1a6d0616fd5be2f081dc9ef741a9a4ae7274418b791432de470c4556463108388e8e8ed5dcebf3558e4650c2ac97c86fa682176f09b5dd8cfbf15d19c3fe4f961f4607c12cb3dfad9b6a0e59c92faa1fc8622\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen167 = 152041;
+static const size_t kLen183 = 152041;
 
-static const char *kData167[] = {
+static const char *kData183[] = {
     "# Imported from Wycheproof's rsa_signature_2048_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8rc16\n\n[e = 010001]\n[keyAsn = 3082010a0282010100cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f0203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f0203010001]\n[keysize = 2048]\n[n = 00cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f]\n[sha = SHA-384]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = c5b6f5fd8ea320880e9e27b0026b1d63bcd1152c72855853294b7683a759dee042be8bb0c350b0c31aea76e1ba2c6d79920c3e21b6e97b6cf46fabf92a701a7555540dd7c325e7c657fd9a079bc5a58923d2ccaef51014acd6fc6e5296960362a94688f2cb2675d5062c5101c3875399b95143511e6ea156ebbdd32c9ef8b061dc66e2c912bf2ae37e3ddcfd5f32a72412db8ba7a1ce3b44ea4c6e2a858b3f3cb198cf41914e4970b03edb1bf81f8abea6371b469d2e80883d7760c0707dac808fb55e588b285153b8ee5c32ffe90197991a567499d5ed62a6b810581901cf8abf086ddf84c10b03ad6845c977ec72d02028308cbd19daea2668865f00a23ab5\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 0e8742af2a1d82e99038a99a09bc182e21317b690004fcf8fac5a4b39c6c4c6f32ee0395a42b8aee31a7af7cc0b0205087b4cbe18e791c1d5454faa5dc220d3b21e44822d39beefa5e90654fae46205631c4691d3e78221f48edc14e342ad42dbeccfede07420b9352af9e0a009c49cac2b4564732d94495457dcbd2f67fb60fd77080631cf38b784a3373b66cc2d1ae971a7422562c2df5f2476983263f6559a8fed69c2c76806f8553b5f1f2239677f1a4a3f5f55a00f8391174fabd2852503c9dc130ba219d145709a4f045bf62b2278d1c9c5c2e7a81f47769b2a11b18bb8648a32eb984ff7aeed9c0ee1023886e6a402812ae6552b03419b4da25cbf3bb\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 943aaab06755ab012b4e062210ac3e2c1a455ca30f1c65beee0f7d54384e4e0d4e390208332690fef5ba0cfceffbfe28e6b05a1ecd8bca3a50f9542f17c39d28195a50203c7885195c7e84da26436bc9fe7fa98a5070e0a1b6f51d8ac7d2734fdb5e0b32da0df6c6c98311bc4d458b4e970412c67732effe67e083123bfc69ed164090be3d41a37bde52119da16a4fc7fba5d8d3ab905bca7b1bccf4699a8abea19d0ba0659fb6c94b4ec6d06fd086958f443a74a783b7440f6060f01cb9dee89f32c2f6fee61e3d61548fb6b3a0f6b649cd8bd5d5a5bbc016f4c737889c79d45c41b5406129066e259dfa06fa2ec05cf9330dec66ed4cf89b80b0f5dcd22c4f\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 682272b36ee1a6c7d4d73f0f3f153d8e84e2fa4ac812581fdda214a7b45d6ff7b7b3db0c89da96ce2e651fcfe25596761982799289b9fd2d69cf122e08404c9db0bdf6f8240b1545e76302a5a401ad56522e0a6158157dc1f9445f8cafc161b25423d35671d9ef714c5d33f7fc155424ab2ac34e0cc93bf2ce385721dacdc6251c7e3a5618bdffc8ef3f278477083a96de83303b9d286e64d8297ef0948b996616d34036bdee5538ca0c06fa08c72f03739fbc578814b402671f5d625dc9050d61b389d1f0a32011ac0dbb53b9c2980d315bc16e2272206a1a955ee870df725e78a7c6e9f793f5428af92c670df8e3bb0d567699714b04fede399f49fe19d0e7\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = c86aa0513ca2e6bb14892ae983212cb21cfaf702eafa5adcf17dfcb7ff53c1fc87d65001c639a20167ec97448463ada9b20d40d3e13db23d8048e38e5c05aa42ecb10d1683e3f64d42837274e1e021b3523cf763d32ee69f92180a9e3e6c6ff891b4c0f9f30a7840fe2524bdc0e82b0e19acd041554f4050f6d917a4677155c6e7841639cf86b8439a4a1edcb24ea272775dd9287291cbdaa79e97ecdbd97522e250db7c8d32658891a0dfe7fd079ca5a5284097ad505c83bbcfa82c0ba6cd91abfa0e21178981cd5c635433cffce413a3e03c7afcfc2fca37c7bd7a5287c13813afe3aa5d051d386e4250ef1617c0a58a24caa33e5855c32b457b1436d11d94\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 801ec289191d6f6e2ed3d7ba7d8cd78db3add3022c8387f592080705eaec1dca415a04e09d55aa6a8c90f11730e9eace7f0ef892f44377085fa8e72236b160382fb3bca71b71d775e4acd75c0ac133645c64517909530e0175a8f06236839de7f7704f39afdc4720a2d94c258188cf9f0794c279c777e5ef604a31412262cf871e3cff8a0fd7efec06eb1db05b50910733dc8d8783a24c07871908e711b27d0d1ebde4e418ce1216a5bc1c8c85d82fdd2b8bb9f0b047e8b38fcfb80771b019d154a510f2231c6c5becbff35f2c5b1f1a5d5280d0d8b0309db5294fd99b1afe576bbb85e980c4e9ea49327343084a6c29743d3e48316df0623776e98acbc84382\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 6ec812ff1115eb60ad2cc1f641479aca46c41da5d8f7b9e59b2dbdb8956f5c3ada3fe162c54bd5835f5e043ed3906a10a982e177f5f68c94ba367e4541b75117dbe18b7acabce6bf7bad0bddc4a1f98382272a655e0222ce4a87dac7f6a2099ad9996603479cf8454102e7ff703d11623cd59e3eb2df8a303732851a119d6c75f7503acc10c57f2cc418863e1b2a5305688c03fc9971334ba06541cb8b3cd192bbebfd5e9252517b17d2b8a3ddfa1533784d6f672e14737c4b6bfc38162ecfee2e97f0a29c98bc6709c922f42ed959bc3cf43764627a9beb32e53d2b35da63942006787476ce89abb7a82ee02e6c9c80ab777af86c1a99c65423ed75fe82acb1\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 127eca0852f26d216ffd2779159e3e3b742a830e3d4f29e9aebf4d8bbd45eda195002aac8ae5d10cebbf849b026caa37e988a7d5c6e3c0bf4f6da974b31a8139a85cbe62e0aed71b9c50a5e3bbfee50cc465d9a5173a33cc2952893e89815b3d68a2269c78dd91d3b8a9d9fb74bed451481267b797b28460358adaa90b82304a6182a5d79e113808adf31100d0bd943608a3a58c2561468aa379127cf8891ba61c2de46e66a9e4d86da3c007cebbc2ca0b8bb66f29b2205a3a45ca7303c0db32efc1e0e254e0735953a91f4927901cd78ab0ed2d047c822dafd5bdaf34cbbcc227e7711267785b68c2f9ba47ba108ff7633d6de61d453acf48fad092b28cb70e\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3c1d887865eccd6eb7d794756f93819c8126fb018d483b6cea67e10364d2455505e228c95106d493538c60d1203ca317aef7926e09e088a39e198915fcaaf316346db4ce62908464838efb7bca14041ce4477fd55422b94396dd79883f9024d46b8f9838ca7b5851e2d935329365c917ca03e1c44443a9602ae1cfb95ef89d9c7315f7e0b287a39d8133243c75ec0303339d88e937504b118ecedef756f746c6a8b244d86ad9e02d02b24ee5e616455deea86beb334af9e294289cee20a7a135448739dcd48400da80f15e060c312d4b981d63dba827ddb2751a89bc421ca600dbd5cc8915a1da43baa34d09e668d2cf5847cd55b705d5e7fb7d355c42c88d4a\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 47eb6558bc35fae214cf871eb167e0760a9b51309c805d7439bebca18ba163972f2fdecf5d1593933341553971b3f529e82850f519cd60597dad8a5920e567263995f7e7f348414920442fd9e4b0ec3b95fab248261913e773b05206e832ce35e5035d6f023a3d768e85b9588d9c5ac4c7beeb56ee14cea7744daa600064e9be391999bebc1786d3d2fd0a7d4ab0bb47ffcb0f3802503a0b3124797866c5d9c446025e21622f4d1cedfce4ad930aceff37e2e1f95dbeb1d4f162e542d1e6e47486766b8d6e0db3e336b8eba57a22f4e44a646ed6ff8bef24394c23059c8c6bd9ccc28a355d87d9a39270ca88834a8f0baa50af19a44aae9d5fe3961e25a9a070\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 4b09bdf2e03a21c695d457aaff214b4736034dca0fb9cf76763d623d16f49f2735fe831f9990f9b84171ebc39f5d533130a9b8b04adf332078b48a7aef60355683bafff862da9e30852e1e3a323bc09838679b687a6615df4b9a71dce533aec693345c1ceefdba7246eeb49b64848359b060fd08be04d4446241573d3445abd6bfdea24d490a14690e50920948998cfff43ba080dc20691841a739f6f134285eeb6c87f4e1b67",
     "0f2556b83b99ff76d873033fcc3953cdc9857a7352d3766217d987b03fa8fe6f90a4b7cf8bd55ab44d800a0c245ab25e91b54c0dcde0b3adf40e3f2bc8776f501fd419713a5445ddc0cd0e9c414ff30f8987071857050a12837\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 756305930024f3b1e17696ca04fdf72445291c2c4737277f9cbbd6c8e2036c3705e1630d47a6a4b5fe2cb1fd071303e4c70ec49378530cd811ee2dfb5f1da6aa66cb57d62e9a96d88c6628e23e1daf8ce536da9acca8d1068e1e430e43b469a55e311fe794767131f53e250ea99e5eb6a5f09e37a0d886ec92e0dd635ae4eb1bdecfc9a4b45b8fcc16245fbc5fee4e876944cf663a56bcc68f3e6cb79d96571eec6057922dd0841aaa126c6db7daf00c373ffe23d8dc7f14c2a294ff0704e5d7636c9108b05ebee13574b63362b547e4173ad37328241fa5cebb7ddb6a99dc52a4be44d3f2e0cbb823f02352fbbe31a3646e0b3988ef0f77445f4e5cea12434e\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 8f9c83a3a017383a5cab106589fe076c15802729be880120b956dd69d36b822022f58f6486cbc9009fceadb83b92883b281e3bd998115e522a1a3199b5773845aeb54331bed863baca87d6de45f387629bf6f328e8f3b0698fe2e96e4faa95d61d7afe105c15f6c3d11ab561bdefdeca453f87e75945ab1746fcc559fedad0be2a494b7b9b9c0089e131f86eb6a0a422da225390ada5559bc64d1990f94ffbe77d00aa19cf1a1676a2362596b32187229180e5e8944173606f54a627ae4457e748c481c3cbfa7416f381157684eabf87490ea96a8a032b1c0c316f99eb18b9c30192094fc8606bb86bf5445c10fc5e9025737fd52b779a008ae60e504b92c3c2\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3adba4b8e5c7ab81ff38544b299ee14cdbdc7d44aa4592fd32295a0e20ebf23d20cde4d26e752e3fc02a67bbd3b7fe927d2388d27f8d9d399ebdbceca97df4b5f1a4d5cc27fa5af84a8e39a32511f36707e8b23b6e38cec3526a15e557719aba13237620222b205992907f1e0b7a52cefcdd63d7f9d951ba528e707d179be671728708c1730096743494fb0bfe319fea4b8f02595c70dd831690c3e692c7b4f18f77e20e063d9d634b966cf14f4d110af8d7db642ad1f952c498d78f27838b84bfe0a9f89fea32cc243ac65e0cef7be743330a19c51a13a747e81d341d17a9204d167cb4006210cd8c7d6cb43d347cf80351041f98efe1379cfba9654d4a3e54\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = bdca4de4dd3bba08516ed45291cac24222f7978f0cad43c92cc3e11b3812ec5ccc196a59af3eea5217d66527776f630cc648d01803767bf1d97e341d6e89f2a4c0bb4ddf4bbec6e68b0e608119d3b41a2fd41da75e157bc3d7f76fbd29d9a6e60e1c383995dedecca3e5095d20978e7be11789137f940ddc8d3bf06eaa2013334530ed945cc3970e83d66f0f181e18c5bbe2440e0f04f472d1b259ad7af78ce7d670292a2894591d5055d5a0339e3321471f48043d92990fb6c3fbe41a3fe92597202e0ec85d0ecf6bfd88db54711cddee648540dc7f2cf1bfa9e0d96773c6c03884285d28fcba88e93e9238bbea7d07dcd36d251e39345c28bddfe365e04f12\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 648eed9f390fe7fc14589904bd72247c3a81dfbb0e84ca13796fbf4d248dd45763b2dbc687ae99a8594101260fd0b3a398ff2b6ec9bbd82099b5b44201a5bbbe8421a686bab7423663d45cea77321e16a155612af9443b94c7c287f73c6c5d3e0139823c081b91f4302da9a75f0e79633fca4175c2fe9f6d4657467ba38eefa1700b94f4f7882892e60954fada4483c99ae0b05d0ba46f774832a7e9fc8b35c81ef4a7fa073ad62fa2ea25143367c4d4df39090d34b40d48ec28f58073339b8677455bec559fc011320a53303c7484bdb3f7f2858262a6420412396f68c3a9f826d5e889d2c8599acbfa6705a7d22f1aef07560932e742a831a23f53d93d20bc\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 28a0905a6461f258c617cbd3cfa963ab3b137fc270296a7b5541c0e01aaa856a348383617dc987011ea42b58e19c49268b1f527ca54acce5e928ff5f122d0366f2e6f656765a73aa7ded1f2d0053015fc6e2d68155c6cd8819e7a6e51c485fc0a620f1c2c2973b21ad463603dee7954fb8fe83ad4ec7d4d860309d498e8d8c3f429df3defa7ec5ded39fee1d5a9aa75ae8ec9dd4b66e52f711e2bed712c43b5fd06e0fdbfbcfac5878d989102dae62307dabd0214f184fe768583e06311d8e8b30738703e11d52919fc72625e418749043df757d01b405cbb01eb2458c09d21b2c472015aec4fba7f88146cd72a2d0a3d80ae1adcb5c29416f538ead8249fb87\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 0167ceab6b14960f1160f13ecbdc8efa965049c1db8acfc8b487b363b7ae7a95b34c51bb54c69ff8a08f7b98fcf63eb200d2dceb5834487b843e9312e75940317d4b507501e46cb23000a12f7042548b8934315b247d4cb443485b39f208487110cf08a1f95a90869c63cc8c52fda64f86a37cd9c562be1e8a813906da82a5dfd72c96c8770b08959d5a7ce72bed149c2d74db3f57c3d67c1e2fc31cd2f2eba59348bca4111176ae050d8ba565a71ccc131d92f9ebe95a32a4f37512bc43edc02a9d65d45a59ae431163a5e4e2b237c0023ebf6aca27af938d3fe855543cf61c5e17e0bfff32c2da92b54a3ab8b196479a66a2962fba50cbb8365879b8618662\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 4b0a379baccf3147b547ffbb3c6023332620a2722e373b8261abbfa31165224fc85c1e41fc495e197f921a8db2d51282325bda21acd2b2fae56b4dd48da9dfe85b7c2f83e75972c22275f8af6c2c8edc544983cf5a783e74793978cb9717c39271613937505814f1862c4dbe2fb7ec577e4bd41e3fa6740319f15042eb4655aacf1b4a45473090910c179fa942e1a0876162f162f44b17bf554e65b291e7ef1eecc0377004c871f74628e2c069ef85d942da5cbe319a2489a5f6d16c421765451615c987f6d84acbd919013ded88bdf1408ed2c0ac1fd701fcc1df6da43a6a802368c11965c62aaa798efcdb699dc715e5f10bee9355d14afb732f270559fab5\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 6dbe87fa8707ec43fb4a4c51f6ca422ddd0051726dac648e1985b5146f54cffc78a2b0335b5d621f3a4f3eb5add994e1e68a4223e9e79616eb06eb421183729f4fedeab5fa291aaab3e83af7fa021b56aa02384752bfdb73ebcd540953695127d8adad2914426f5e9ac30ab4f5feb36e4ec9d7c7cf0a9f50c33979cdca2f7952ac8fccc4180c8beda3772250d6c5a5ef2ca99b9eeeb90a81e2346b465d24a8a8c47dad4a67d4e6a28a46a3ffe432af8c7ffc85c1eaaaa26f1ebf495474d96ec04b5fcdf09a25d8cdf45d8f348805b9558abe525f2c95d3cd97900e62aca25b744b779b14195f53d555808d3c15c0c3aabfdd50801356310deb29346a445d5a93\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 49b6dde9c7ccceaf49528a6f74c41d83fc3473ada4896eb0bc239c62efca50b33bea31e500b48ebabab16a35182651c38f72803654e1440e30215b0c54738772dad70b8883ebe60680103fb328d1a990547269cc470e9b06e208268220ab46c39411b7f2b5d3eb20ad723978d13d0970ea57a96237242e9892381c02674f349b0211b03bef1ab568abdb1fa28cd913fbda24d94af8ef79efb7d76bede1b43db2f45b9a522368cb9027a6d1f2c40581647b85a99334f05400e95e2ad4a414e032a560dd2321387f3f2deca9d3a4a34d40be2dad57650ae12390f28d2e4cb0ee8bad7ddcb9d7f8850c75c99c6cc4e154d4c8b741e972cedb373b9ca64eadc0e5db\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = befa74da01ad7d06b1464c2684576dffc25bdeaaa766683710934a8ac4aa2282320fcecb5f512e94dfc84289b2da3fc73afbe9239540f1066bec52bc8baafaa5830e85a5c8f31cf89a8e548604169d7e43d94fafb67b3d031b994af3f3741fb0aa02db1aa12e674e1e7fd0662fe06c8ee641029bf9fea3e997c15a7308fd65661a10be4ee1c8a4510b27794a3f5870bc83c6db63cefd008ccdf4206ad7ab6686c8047a52cf913adfe5d17b4d3b38a7e1e4f21bab174f2afa9268dfec1e6c9a611bba07273b4f65a33db419b18304f3ca920a4b1c655a76b5a5eb920b9123a1160b4855ce807a62c8bea9a9b8c38f592284afcfbb550d79ef085f1fc9edfacca1\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 814446f1d99803bae8290074bfa3b562eeb7fc2bdb5ae95524a8f31694e166163f89d2a22d37636b320867abb881467f0426fe948a774e349b72564a3215e117e7c14e54a7da4eaf67363723afa19886ba47998389f8069b3a752a2cb9e7e688ca273b260312562ffc124fb6529906dd397028762ca34a8313c99b648c25822191ca6ee3e956d98ab813ded5bc298ea65a9bf949f0a229fbe0000eadd2429ea40ff66238201a2f54e93b560e36e8a207a7f4624c782359437e5139d8ccd2a366a9d948780148daec600de8a0c516f0f93303067d12dcd8d5ba0b484d7c87cae1e63e4868c0c829cb4efa8650fba081c649014b3ada38dcc1c1471f93def8f7b4\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = c68048e66a376c5ac3c6a5eca4f1a73fef1cc0a1db91fa078d5334b80db31f339dd74ea3e975893c4dc26290bce8053a928321280ae60ffed3437072a562dd30442e5d3a5b046d1f4f3bce820604999b087d3d02130ec4bcf6cdc19df28ca9c61d44b9bf11b8d7d48b6d535dcdb52316da25dab87f747082a83118d7d1cb515641177f2453e2391345b893367f6bd8063a24d78d041e9eafd6543c9d4acc3f4e7ccd45bdada5b7b046a86b1bb0954397afd12650dc1d6bde119d7bc681c3c6cb1122cd2c523bf27f017faaaa1f5aee8f010f4c562f81d67a04e817d4fdd32bc032b8978864a9a6cde55958c0c6863690f2f3507aa53fcf7e3f932e460b09668b\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = bb7545df9dd8b0c768d7989248106c242e0e441dc1de681b22fd50b576a3afe9c6c19d52c77976343a529cd6bd95783a7c24",
     "4ff0d3fc701eb18297b52a3c0a6f7fdc3f991c1c2d47a413263ff67f83e042bc98991620ee16f08b9f9fbe47ce37a90062848a0d0ad96a54d4f8077e41d03953a10fbbe15a8366a88fc12f82f2cc1ed63fb5c295c4b0b3f7c87e95a2b76d649fe839979b1352fea3b0dc112d46c7fa72623932f1d3197b0da93d0b87f40a8ff1575dbf53dcc69c800d2f616cc7b80e942c6b3501858a6ebca6972fa3d4f3c16bbc165ac91f61b679fa33f2b2f909b63fa88bca231297145968bbf1c74814fd691249705140dd89dd32a49116aa9d\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = c5514a3811c53e0f8372a945ef0e3641acbb60f6321f67d9dbddb04e1287f1b42d97eaaeb7957e22de05abcd9f85d829b43ac766c9907271a1157c811d429d5c7c8cc36d19ac2dd24a036a16be2b6368da44cdc80bf21ffac73c0224b6f176218f70f0cb70e864224df7aea9724b61943dac5a0d0def579c342ff1fe0810b6edde9be8f9bf3d36cd75edad327d60c5dcdaa0f410ad7e74760bf56b93e0d5b9caac25ba319aefc510d26d44e57cd8e89a7355eb3c6d5ded4be863ab4c60e6c754fbcbd086fcb3ec64a1d4f40d3c1d00b65e93f2d09ed45eaa295a5c8b09268aa292096a5c41b86618e493d2f683682b10b25ac9032448e9e0b76bcb6f6664042c\n\n# tcId = 27\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 6acd858e30ee15fc5c1e8d73f0ef784690e047b0152938993e3e0db02c61f04f21ecbb7cd154b98aaccece5d4948e26260e0b19f759a5107cd4c365bb2ff6e5be93274ff6fafa1df4f26ca73d995f5604e847d635de7d6631e23397d95246310d884c7082893baacb46b6426f08884b0eb4b0bddcd01ee97b8182c55ab80b67f73ee0507206a5563f79167e9045a7ba9a8c9d6a1ebb85f53922d4a5514f4bb13a5f69154a2db4287e8aa95612fd7cb7addefc7516609c1b93844f254d630a2924cbd7b7ce0b623812fe4edc7edacaaa449ea949aefebb2e4b924b5ab893d5bcca76fd20dcfbdd04ebc6bdbb1d7407f710bcb2f23c7d50a4fd49eb6acc7d4ab97\n\n# tcId = 28\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 4df3f6eb5fb1049fd74877577a1ef69216df191af5858a661ff8edf68c8ffb5554d2c0e3b7adbc7d10da656c1c788e381d43e9eba5b0a84a92431df56eb81d7b19fe0e87404d16608f387e4b961dc13d336fab669195f357291e1287f9bff838f4b2c79b75536e6af0b5adbd750135ec166377c6c8ef6a9f80c575b1ae95da834a2d129313c096faafb641b46bd093cd1464c20821f4ced6b4dbf5922c44297fab04dcc286b68ab98bdf03de215c4b8ee1b46ea93d8f910e1c8976f3f040972f62901fa1fb24c59bebe201d3e5ac0615da8106c6b28310382fcb6c6acac7ca3255eb3d529863d939cd876d88741944ef06fd8ff9939184bc417200d361d1f1ee\n\n# tcId = 29\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 55e7afb895f743e418302ce73e8fd49aadbd0a4c27a9469406e0a801753d5a4cb96fffa47ce3af3a3f2dc0d816e6ec61a764455f2427cfcefbfb9452ed8401671607c8cea3bf105fda04abfbba07ebcccd141306c129b36f9014b4970f4e8ad6cf3f7b66c21ba1b56ec96ffc6b6500f8f38c00b7c4aaa0a0515272fdd0fffb43a4c4e8eecff7922b0891457df27029eba35c86191cd7d9775cc7223354d89118ce1b92490558b2f3a151fa1b8f9371db8f8fa0f156134f5d78d7897849d60414a7d0565535f271fc9172ed6c3eef2ff62e638da46ed4f507ae3c63a6d308a20ecad814232e39eeb7bdab898b18e37b57c10b19905c0d3d01fd8e7c390be1b218\n\n# tcId = 30\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 89c7b4912157be3be42558074cf23b8693d38dca6205289c9fd347369dd92534d2d2ec8e9d6fdb0a2ccb7e398c90deb5566763e4802e747e9dc593237d5a5e1d52bc3c43d89ac484445e3798a16a00bfd498f42d88a4110cb7e4745c5f1e6359ee8b6e81b42e85dea2e00e80f1c17dba13d586c6f6f9d3e24f5523bf9a0f21d82f150a227a718123c5f7c934c2040628e2660c6392fb4db3f7ce09e1c403d479e4858adaa6d798c34c4af771994129386594f0b9aa687706bd463a92d47ece2d4dea43192f8971ed7786ca2b6dbda7c449c2c2d428178d8de5c3a10bbc7533296ddf9fcae3019e85a22d9fe9fa23942912187bdb11365bd37114fafc9e88d4e1\n\n# tcId = 31\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 2f64360a55c3d64c3a5391d6c3ded718786ee654c97b6910f4741315fd7d9ab021999638b88b4751736a13faefa6a18339371e2f892f68913dbd426415cd34f499b755b10376fe11896694f1ed703d840a5e6faae1e6f75c7d6dbbfcd3dfd8e818499ad7d03878f8148d85e325e7d2aadd6f9ca675d7f0b8813112e83d3235bf5f9a33b14bccc774aef67517529593439397413e322d02ab7259b98ae549fee758b02adb6116e563d2fc8347dc5b5bb07d573d51024de583baaf8e982b3a8c742f03d7d739ae804e8de6198c75a556318fb372e2d1e6187bece98a5f39640ad28fe014e823a380c83fef85cee7bd788941bd04284d32961bf3582c4c3ae488cb\n\n# tcId = 32\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 325cb004062247e5f293ceede0066fdaa89f37f2b73464a14fdddc045f5395e7ab3710a9ad3eab03e9c2fb15818b551b1d8755f454dfb5fb6ddac75dad79563d9824a213ffd5865bcdb9e82a1bde2b94756a7877b91be30d58d48700dcdab15210fb17613bb9dc4f7cd95e1b33f4de328b4d166f78c992121e7e409acc1fc893771265ce9b01b5e21aba04278bab10be21dddf8a9375bf4ea0dd4a608a186f0889b9c0d132b022de4e903786789d0a5a960edd05b63ac4c08ffe57f6c5afab772bbc7e77f82ecb119022f96a6f42c5a5b958b88d0d6b17d3314adb050bf863a88782aa78a8efc50434c21e1077ccdca9b9c7676369bb8972f290bd5a7d85a635\n\n# tcId = 33\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 4b043dfcb768599364cd876ee5f6456b8a270dcafa679ae2199793578b26c42b30ef14fd8cc4ab045dabb55b938bb8c8af337386de8ea009a3a19ff74b6ab8ff038d6685b17e7dc5089ebd1c8565f48dc699770b48a6ab5d9353e26472b3a57dc74634435bb7b04681bb69dd3e7396adb569d6cc8ad07aae13387a17ff862b40af23be43bd74c9fa24f07d3c0afa47a063412eaa2016647b84a95b67f0d18efe75c2c9be7240d748c2bea9f25921233010079028e608a85362cccf7fe1bef5a71a5142f1dbc72224f5d983d7fb3b0d1a6303f017d9ab77b5d6ec4281a5df521d3528c6caf9508d65f07a6676d8d4cc9fc796efc6c5dc2aef6ff516ae55212671\n\n# tcId = 34\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 2f7659bd4b043c5e74d9e3a6bb3841351335881091ccc4d0e2de1efa168ba11ec04ccc71a0cdbf84d88a54a9b5e8e5e0ddac7fdc7c221e87bdf70969f98857ff91bd6d4c9f8afe28f5394660c959ebc8e4a09ec3e0d9ee0d6c9831dc0f31807bb8ebac2c9e74fbbd38d0dcdcdddca714b771aa73abf3d2c3174553ae3b30597604e4b33f8a6adcbc42c4e49e04a6bb0e6d5dd36b519d5de172c5513f8317c16cf39c89ceeb5cb698ff18cb8e149b8350815cd8c619aaff2ae5302cc683863e3c5e5588607237fac82a01c028e572fa77b30e60bb5a2874715065a2596af49cbad2926bdef2c81b5d031a46113a178a92f4d69c97f9ef311ecc7a2f058ec7be42\n\n# tcId = 35\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 241cebed86cc3a251f62e6dac6a4cdc7ade20ed6f879942e18185c85729f6874d4b0c0d8eabaaf1ba722891d35ebabf4b549278d14815db39f9e3c3dc7856ad29f60292318c808675079e2ec94984bdf0966a33590f47ed05058fdb91b6fe11456e592c9df76e4ff56df480a83fd2890b088e14dd59e7d6bd0fa1f009affdbc07161f091947b9b9b8342684a0bcc746d853cc52164740f08c364c2855455b82aaccbb80488143f59614be4b6a1c4f70cd1e006c775498df75cb0d700b8fdf164d0cf97e860bc8e153c85fdb6f5834b79efdd0902e02ddbde4b515afa360aa25632c19fe7349247bb528e617d34333120014eca9b549fcb1b541d3ef6fb5e1010\n\n# tcId = 36\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 8e694aaee29d01d26ca0fecbb8cb2bb49cc8ac8e1a01e327ca9dad1ed741032dad845602b2752f8637ca9152d36f120e81f37b6f4d6e5b5468158be2ca3acd469e3f532d9731eb6e7247f97d28366a652d747b21b732c875fe22867adeb88e42729eac1077fe7e6255cd643fd33050ed087b01e07df5efa7c182d266ae8b33a667fe88e5dc95e1751787de699be68857470cd4b0ab989ba7483f9ae375c693aca41ffa9faedbc669a9f4a0856a809d7406207f4ba4ecdf882993a2d774ae4f35a12d5f24c79aff5c00e89b7fe99a8d93fce6b1305e91a3d553ff0433f1bb989fe8923e1296f775118b17bbb3ac22d4744815e647547cfa03a515c20a33b431ce\n\n# tcId = 37\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 4abd84f5455855d18a88df8808a009b6a470964a82604d5e562200b4ee22a6537b31ed57bfc60151922715eac7804f1aa4501721e242bf553509eefd5e34fbb1f4b6fb6d6e3caad4c1b7d12db028e42f4a52efefc88bcda58c567c24fbafd2b3165d768947ed7fe69f0bc55b9add57638bdf7b44c0aef8bd104fdc80f32084466ff0dc97d37cde2499a498b77cedd01d389a5a4063d9efcf6a2ea6b4ec3d28768297865220dfdf379ecb3546949ccf7687beec862c72c3faf80a944d71f888821f079bde045fbf1f11e4e813bbf81b102cc5417af8dc93f24a7c3200395c824b9c4a2b643fbce4af95cf22afe146f8b66ce38d76bd8821a3aed81ed05039a097\n\n# tcId = 38\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = c9dc8b821879fbad44e3b5827c1d0f096dadd16908d3d7f3b6a63052f897e2728a855ebbc04d2af9c2cc1cf87f0d67f2599f134358626f52f2fe0dfca954c4e7445e604f347e3f5442e0ecff1e81f4593d2ce920c94bda5a3c75022c303df0930be672a7648f68294dd62d4299bf750eda9af0322a17f66de12ce87876e51b4c6141c2e09f7369b76c51ae9a200bcf110ccb938d789f3265f8766ec8c40f1fde02e64937724156d367b1a7761eff40f301d1b610f4f1720b38191ec71c8753064291cf3446723b8a7a9c0a188a7cc9e09538b8ac54a04b9082a299131e49ba733eea7f86eba7ca0ccdcd8edeb6575181b78fe",
@@ -4171,9 +4270,9 @@
     "88df0548430ff4f0a8dcfbe466508fd93a138ddb9dee83b9cdafb794ded\n\n# tcId = 231\n# wrong hash in signature: SHA-512/224\nmsg = 313233343030\nresult = invalid\nsig = 1c153e1a94bd76b0c5d51d1c91d38afee4db20a10ccc44bd46bbc4a40974c02180ca0b3a53377d694de9c34d168a7466b0bf5954952a98031104934fb319936185dd8e795bed92ec7f8d1487dd9393ffe476c377e406fcbf65011c96a34ec627b7093cf6c0ad4576506d559c74cffdd73700c83ae8c4b6b8189b4b5d4119bc4b720bfb2a6acbd8a560c2642e25f6e8a4ab5ac6ff0ab19226fdfeb02e6f97943227df82b251e6826028460f33b7c6aad633d663fa06aa048b5e3c7226af2feac31d00bbde8965ceaa0d3ba2d268cb2d6c3fea67ab672c7f16f8775b3b41d573b8b99a71fe60331c6243dcee7438a30a8161099a7dcbd9933562eb40bd7d587383\n\n# tcId = 232\n# wrong hash in signature: SHA-512/256\nmsg = 313233343030\nresult = invalid\nsig = 34e2223e4f00809c5128c2dd2611956e8b3177859bd30ba86765df75b2aac2241c6e6fd836970fe68ed723f1399cf1c7a8f04560d776c572d2e53b2d0edb65fa5dd813915236b278c058f4fca84c6dc75de97fa7d32b30d6f54d6aa8318105e58391508dcdc1d15cf235d238a70b085c8007a65e0df54962dc31b098a9a7d06108f07ece64a70426d5d749c3e329d1779125a7c60207a1c99b892022703229cfe852b426a2a46d9407806f911cbacfd98168e8e4f1322b4572bd1f0634c8337b5160c2150dfc37d30f671bfdb2c3acd89646ac37a0ebfee5e1d2a078fa1b4c980a87f83a6b098bd09c865305bee5bbacd3865e38b4414daf5fcc3bbbb1655157\n\n# tcId = 233\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = 4a2bd5ed1e053d5421808f7d2636779c7c1e6e1d94c47ae2520332113333f0c3f229554db384561cc4be4615d2f9b36d7a1cfebb85333c0a070a8379293d5e46af0d5c34d71b4cecfee2a190a9bad3baac34aaa8881d048cd2e9b8a74c67a5be02fc27368e5417b4fb6d928254d645bdc95577fb1ba79bc169a9e24466427db64406a98a8589e3e164a5889d205ab861acd9ea5551cdc06515813e4455d202b08b829463dda47a55729961dfd2130ee03c4ca92a8579b30478c2b479646c242a7e9ff0547c7e774a29469eaa49157d53425e0afe0dca68c88cc71aad8a8a00bbfe8f39c36fa3ecc168f605d7333626b0afeaa7465d78862d4d44ad64a4f7a0cb\n\n# tcId = 234\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = 5e47e74f1eaa0c542173139c91fc3684c52a3e0624ebffab2ed2bc007a3c7fea826b4400a9145c7893573d73340789f32c3f6770e1b646e814846690a941846578afd0455e9f016631475149bab5a150469acadc1d0486da5fd766a75f2b6be6e7ee56bd350913acdc08e06806a3db60ecb9c1caf58db36b92f13b3ebad4c67f7be7f16156520691dcc37b10c9c3d0215f3e2c0558cfb8d4944e936816d38ea6e3829b736b68cc6156e86f505236f366b5928572826be1bf0b42885f1ea822ebcf79b7008d14b23a1f76a2730848c077fddc5b8982ceee4768ba7733864a4cc0525640f1fda07c6cfd92c7f32715a6edbfc4366e2b62673fea9116a18e600458\n\n# tcId = 235\n# using PKCS#1 encryption padding: 0002ff...00<hash>\nmsg = 313233343030\nresult = invalid\nsig = c1d45424fc88ebc3de2cb0f6fef91042822f857835b014e6362b986496d1d0dbf3ef50d71ee2dff5567027dd00fad1e826216bb34c95954ba3a9ee3fe646f9f690484c2586b96946efff54d6591024d251cfed885d6e8d36baa14757d7621e75ad521adea55a217ba7e6ea0a8294651d688ed395920975d52f607d542126db2283f00d9ebf48e395bb83901350843cd7812072b67472d16cbdc2cef414ed57e33bc725d53c5d78bb3282116bd3ee672842191e9a5794d78d4f2bb9cf600d6ef8f3d538881c9efb80c7f4318f62c091b0a3d13f485923bd0561bacfd7e08f75c26a60c8116b37524f4e4b40cf488035a796bd19d3ae5cba8bcee923e021a78183\n\n# tcId = 236\n# using PKCS#1 encryption padding: 0002ff...00<message>\nmsg = 313233343030\nresult = invalid\nsig = 20835e06ad227e3e7868ba812b0361062e5e7204e2a0febf12eb0efcc5cec87328a0c0c39539c177f3f81e50f8f731c6651c03d865cb1ae667c2083132841ea3bd9749a54fed4a9d04b9f4a36ecc11c31202b79f5c7e2bbe0499eadbbc7781e22c6b182d5eedca6591af8e4a7665883666e30a927959ce67a149a7d03c7a863c16eaa980e7ffacf844daf83b5958c50c502d742e638f97067be25eb0c0c1f26ae9da1e65924bbc3a963dfcaae959300bae2240881d9f528d14a9f025a7feeadde1301096479d8ef77bf722dda463ff63dbdb4d7e5fefb4a0428544e2a8e9b1622b9971f71671cf32b0c066a26372c46294a66796d80a498282f6da546ab095e6\n\n# tcId = 237\n# invalid PKCS#1 signature padding: 0001ff...ee00\nmsg = 313233343030\nresult = invalid\nsig = b386c91fe71bfe594a2de2b2a0db0eb097178076afca8fec5913337edee509eb6b470eab1e4553b3b346d85c8f2fb31b6afc301d4a545cd3fa2b7c4157d501207518728819579b51d15d59318e8eeac0b903cf3e770660dd7350336ea6431057ff68e47c9cd471d616f25043d099c8a1aa11a9588e5b9275e3b1b93c71746307c277b74dc429d9ca2ec87145636778a95707296d980cd8c430e5cf1faea6b62a66b2362c9aa74d6391ba7bfca88aac9747cb4b29df1ea6bb22e5cff500c746e26a95ba0b442b468d1663bbcbd9d0162aabe84c02d002e760e77f766938880776e903ab5e09844829296515d89bc68f8c3ccc748c35dd285676c13877f44f2ece\n\n# tcId = 238\n# PKCS#1 padding too short: 000001ff...\nmsg = 313233343030\nresult = invalid\nsig = bbde1e1373cb938add41e6ceeee683908f3c575c6a15e38481ce6e83a5d95fa3d2a4b0b6e95e1abf165cdfd5ba308497640f58cc4642298100e9ff639951446951e67aec55ab8e7b9f05abd8870ed3bba86ab875e03d935803d13236fd66887069a72d14375a4f17e9fc274cbeedfdfa7c8b77c0b62fc570dc5bd30dd6f9f23f309ca58e004495472f2c4e5095202c47f24ee8a10474144e1d101ae173c387dc92647a93618d779ff040ae424d75b22262146f457e704240cdad3bff67d086d82b4dba7f8308e1e392691065b28be33e52dcc20787997817104d2d23bb67469d21d5e3cb84c035a1d75e6b699cfe363db10d52b9c0b4c82573cb1de5a5cd6cfe\n\n# tcId = 239\n# empty padding: 000001ff...ff\nmsg = 313233343030\nresult = invalid\nsig = 27e5a5c4d9f86f7de7d7220a783c26afc2a6614bbe8e2685171481f928b230abcff5b37f3ef2e384db521187566c70b09d75399385bf2358204fd38c1dfa1fb84fa78c1d5d5e5a869063d544ea812a3f1db8a1f0224fe7e21c5ee25e75a0cf2ae5d6db16172455bad2418c81235bcfe2319def91de16a7e3de8dffd74122bed90dc53e7fef8f77e832f30b2a33efbb35522fb620ea326455339fe22a81fed5b58d9a5b103188bd530439c4855e2db8cd9f98a8129c76a335cd45923ab67100dc2b02f31e0e5282fe526f9cba163715026071b61a2aeb93a5a58b4a8499b3c078cfa303ef0a107bca6d2922ac8220fff175e2b4e87a7a9669a1560aafe3ae99b5\n\n# tcId = 240\n# CVE-2017-11185: signature=n\nmsg = 313233343030\nresult = invalid\nsig = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f\n\n# tcId = 241\n# the signature is 2 bytes too long\nmsg = 313233343030\nresult = invalid\nsig = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7f0000\n\n# tcId = 242\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 243\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 244\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 245\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 246\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b7e\n\n# tcId = 247\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = cda6fa5ca76bfe0492ec57e0a3bfff7272dc8d1e25ad1fb338aa050f02c104e63133d6b5b7c4985ebbae9ac036a5b9c03074d60aec8e25baf392a0c430ff05b88e948805d3dd74511d8885250a7b574215ada015c559076686e253ccc96c0815b1291ee787cc3363b4f77d930eb998d7c582b24cea9ce21de9722791989863a27ebc80a00de5bd2f9228775e5a4ceb054d58c9be36a054336971a13642dd9510dd696aa268db3aab2299d5d88f8e562434d1427094d3df8e72d1ef69b4ed34d12bac375223b2a25cf227f735f816e85e17239304769a6082154cd15899fc1eaefb69b748a3e5ed24d38372597de3e4e2a27b951d6ac7db182d6809d8ff511b80\n\n# tcId = 248\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 249\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 69a1af712699465ff84ed85dbb35323df339f7627310b2b3cf2b8b9fd4fa5cb0f536680d7bf905347a642c1960c3e17495770bf939b7b3d426ed2209b5e47a6029af076a8e95f9a7fc959041d2e221d433f3836e37b6075a8388a2a6aed1785528cc79348d4dead276988f7f49d827c0ebbbfe7aae9d946f16c7a3598da587710a8d9fc72ca537534959c76a35c91ea90989dd0fce6bbb0d0f8c439188e51e0c82debfab4ac1dd7df3c3e48627039a9d3829a7f08432da36b6ca6d9ba0f9a15f6a61afa09c1ad305c3182e0a88e128192d8d064af7037950574cfd21b1ddb5f562ceecefed4e62c6d12f82135aab2c0a6dba9a181945f56943b4a81faa42fff0\n\n# tcId = 250\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 8c8001352b612c2a8ce94e15aabcf7e077a4135a6cb9f128870ce3f7ed11b74df002a93e9c7929b504f9c33d6bb1c8193dfaab4a808057380c3a142cdad876290bd68472ab37133d50d3805b6037c855d145d75151c42b6fe5121ccb44c7a624e897b298694566698f49289ae0ea09795450ab9d17dd30170b27fa65d54ca4a07835b3d772dc27ca21e8049dc5751522530169aed63009013091fa7621583d6487029c45eaffcf0c9e7e9fea1cee27da0f623b3e4cb8f73db62ef1a818244a4d00165e4328cb2b1af117eb8daa5cd808fe06e6e2058b7db69569e7db51b072381fa6acb7683e4ad9164b2e29bb3c72e99e0f585787a77c69f8a58084eec664e9\n\n# tcId = 251\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 5bec85b7d892bd8bf5452d477c53eab4c930828493ee9092e4abf42f905580413a6ad458f82e78a839a47016b2c6131899abffa563f54d49b07c3f56ba5e4975d216be7a591c6466e472ae46edf2a15c72b649f7089f4f1147cdfbdd1334b07303320a95c6bf8426cb9e6452d3f8695b4e376058db6805a7ad304462ede8d89543a5360749e83ff7cdaa6379941d28a44a60bc36353cf8ed7cf1e3db091d136372d489602ebb1c4a41a6a15663a809e2fd3905a6e62f49a4df64594e0b13737de6c7e38bc16b349c9a71fa9d8c519b6aed9cbad2984e13a0d75a6d24854823e6c8d64d891cbd64cfbbbab9157f4a015bcf9b6bd1465e5badfc462e51fdaaf698\n\n# tcId = 252\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 9bc2fc58e6db83a04d327571189b835a63df65aa3a41918aebd7f97c069cd499978370e4a4e46b1c27165b51f703beb3beb1c0a3a83ed6613dc840b58612a996dee3a10e1907bbceb5960e4f7a0fa9cce69a3ac34cbbf10b404b685763ae3fbafb42f125a060626e1136742d4ccdb469b3a6b58fbb4cacd3f5fe88da8838e2d2645d11618067edc8eb6bf6f96e1055122cff85c423d113cb4e9e1303c268dd5ceca5a201bc17d582a84ffc14f7f5e654a25a89486d54991f85bd24a6112849f38ccff768d1ca3c44e3e6e6a23e177426d26bb1173cba60a7938bde64b02432db83fab73c3fd4f10578f826ac3cea04172aaf43d60455c2632ae06c7665ef4537\n\n",
 };
-static const size_t kLen168 = 146586;
+static const size_t kLen184 = 146586;
 
-static const char *kData168[] = {
+static const char *kData184[] = {
     "# Imported from Wycheproof's rsa_signature_2048_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001]\n[keysize = 2048]\n[n = 00c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749]\n[sha = SHA-512]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = b03dd72dc84b305ea811267a489aba10a1dc54b59f92e58546a2f0b6883f543512d621951352ef12abafe4bd6e10c2e5b0eabbbbf1d081b66e535fc9b8ad379040c3c71ec8f2b4f5d319f5d2a0240a767ddb4de1fbc878b2c5e8e1e260217bbd70971789fedb8c677fc8193f67e4637239607c7b9d3511868ccc0df372374abc685c9b4b74b2c5f11758f809b19bb3b5c464db870fea61ddfa5e18be2c4106f3e165fe85a7f8241db2806d0fc3c45d8a7f1eb4ca411a46ac411b81c04fd8c4ced5eff497da6bcb8e2fbe1f95cf4c3e761fc3037c82276f7ebfb7e6cc8534cb4fd34192074f580c6e31008df4f1404ae8dbcb111503d4bdfe6e7107a1ab5cd8c6\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 4de4dbf82607b36a5c6778ae6351d83b7ef5b4af64c3788889eb10ef1838822847ceb531914392360b92dee055796f73e3cdb8b3d50910a537dd2244fd7f922780356ea3f01e99e5bebcb1b6ef398d2399bd02472a871417daec3bbe6f89f45f1af0bf819a446dcbbb75c56958d34ba27c8120cee6ff97242921ccf58de9216995fa0c49cb3e6d60e46411b2df3b01b78fa81ca145ce8be594ee009031eda672eb097ba5ed6687a703b154ef616757f94237f4275f54738cb59d36b20a9c84ae133bd715747952f0222573a91faf740e4b7eb4e88abaa91004e72a1709b401616b2edb2784e491f671fcf5ebe326b669facaa5d8a0f6f8469ea995c4db772f06\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = a0f46582cde6be215351bb7b29e8ff24398816fad9e7e2ed6ccf1d0b5296bad827316c18b1565253291fa1c0baea9a735357cff8920e1024ae5707dd2f0cfcc9e6cc81402217d9b4f51e10def2bc2f4924e7d22c022fc87d6c3e772f4952050d027b003ab4267ff227a15cc7c884cdb46bbc7eb38852d0e6d8a12f485ccb0312157097687debb6feaf2b6dac998224c6047c1d5727195bb8ce05a59669034e88de0e4815af00c65def5b9748d017455056cc1ac6d3a77e31fcea4e726eda6be7bd33e509696e54d1d1858a1165fa9ece5d62e493c1a33ab3c94d294838a19f367fb799d6b69161bd9532a6ef317deb919923d78e33309f14a97b68023d600b4d\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 9922f7bd01d7ba6b2de255b91209631af92e5537a4554b3b7a50e39f2fe9b6085a7e418084213d445794ebc19be43782d9f80df1daa7498a1c67d935ec00dac6b7a194033a14431320acd1d7f3d4c2b7b5b1649dd93931c49f538c94e34f44fdcb8dac9d31539f87e6720dc887c6605284a6a0408e244325e35917b1e1ccdf5959ca87091827c8157bdaa31239e2103ca8a112cc76a8e7e90f352fb8cb3a3381e52cedf4d4188bf881054b80387605e7041ab149cccea1ac2bb6560b45000601c33ebc31cebdd499c0b8fdafa7c1691d6dcc48edc98519d55d126a757b2a753eda4f2bf35cb191face371c9c34b2ab57242053b9ecddc91e4b621e650432adc8\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 99996fc01a53bca03382b96e9ad83a3139bfacc5d37b180a099fb5d515a7b78a5c21a339ae6bd2bee8e0f503ba2bf892c1885ad5f4940a99d8d49df6f4623da16c337a011fb895c006100286aed82977be3fda054d1e935a872939b704750c3e2871c33768946e65a737184efa50060c6898247a6472854884fdbfc2533c936fe9c922d881bd5f093851b46693cf633e25f27efd6db65da3ad96f2e8154ac39f2a9859f15c919a92c8cd22285c1f9e87444e61769f6833bd0d56106f87825e472e59caaca1fedd8d4065fad9dbbc252a84c196bf5d6c40bd8660600bc6c825bc7470aaf4ad118c6c139a5c6fefd5223ef490d4afa6c06269ea8c0054aa1f368d\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 7930ceed4b191365ccac54cc8a5bd38498c0d0c1fa5a862b6c0744edf9bf1969ec4f3c7c42aec737438acc797b8301aa8b30be2a4a4c1323be0427411dc8be84881036e9062a55fa2334176049305a44b97f90ed0b3becf56f8c9f164ef0bb45729f9fab1d459f690c58f07ef5ef89f21b15da14a235f3012e6f83a7f226e118d3b7fdc9356c39667e1cea5c667b54ec5ca6a0d58ad933484f447c670e5bd3647361c81831dc710360a90692eb7e4a57ad225b2516d9c3bcc77323a9354d1b92d0b3f5ade911f5faac4e4bdbead32f3349840ee66f4010789a84f0934182c2b0cb7d6e72e2b2a6839d03d7c9f681bb7148449161ed50b4466d60002cdb7492fa\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 16b5ecefcd0167682fbb3601a016bfa8bce9dd5855bf305ff00b45d97e50fecd27716997c37ebf8efd8b269558385b3ecaf2b6e38313508a7a14546107b75afb450b1a0e39cd0760151b666451bab43d7fdbd93771e9d98152ac889bf1abbe1c3f62049c4735602ebd6a90a0361dfa08417ba03c55fc6b7bfabb136851ab01eacf528abb1129bef47f2b04e2aa24c0341720f728bc9fe12cfa5d4248976aaf7035d19c18302fb9ae2443286a71198b500034d48113b705c83e64561762c583dc013cc099c7e5bfecbfaa7b971c8f1a4d3868fe0a4ad518372ca68c65bdefbb726b1fd92ad92ab739d2bd1af97724dc076ba011a9f32db3979ca4cf94c5370b77\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = b73d6d97834d8d14bb4536b050dbe47db349dcf6847586f80624425065e10360f9ce491c38ae5e48f6640bd3a314eb097f08c859625d3b7e8198b0b9dda03920ce5fc4937adf8c16af3dea2cc3137c2c200cb8538baba5bf36c9913784e079d8cde826f615313cad093d53110ed616591e5c38f32e2873225634ab10fbc7393dcabe742ebae9ea3802031ffdd6356a30aee51d126064584db555657f11cf742b8ee1ee41119b5c2e65c740219bfc36e6f65fe8db8d16684ba4cd7a12b5bf22551192fa75362b142b95a0b0d786eb26c07547e73ee3f3a3f0b2f2f37ba562f61e86c4bb25e7e059ea504f0ea8f5883382d7b17c95c5297a934479b4d40b632e99\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 93611a697f527bb2d6e4193ea34e079e0b8ec8e4a516962a74cc91c157528bcf4654beb487f5eac5ed445f858fcf8461e63fc657a57bd8226d980b212fb5e61111e0c654e0a6aa0c959f20001f6345a60ab14b8ef5631a81cdc552a04ad3f17eef287b011ce401be17900e79b4b045c12a90412a852131a1b9ae7c31051e8fe6f066b4f7e1d8e9997aef10a8c516fa3d782c9aed73dcbaa1d9794de7300c607c17607740f091c2dde354b58c0ed9d4b8fdc43e249847b494821bc9560fbc3c57f363e5d2bfcc488c041f123fc379c7bc80a9ea6ae98b7fb76058f9260c0f5fa1000a7f865e5a63d1d279fc7f452775186608cae1f3b640594d4b3fd8af4a5a4c\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a98a9744f1f1893343ba5b702d7d431e40900a3e3948d3e6630fdc0a8f391eabe2f4b5521a2bb03a16053e87a15015d5bfbfb0e7ea4877a05f491bb8df5893c867070256e8bc348f896ca2c8ce4e0ab6a9adf10ab98412e4ab6a4fb8440243fd34749596855cc14745d7096842c48db0647fbd71361ebba7fc263a2d191d719d23e727b1ce36e543cccd521b540cc42e01120994a06a95f43cb83ea51f73dcdb9d5a90683f627a070ba8afe67f9e29b003800479b6b8ecaeb6f2e68bf19f1eb568b170e56d70a8ae41d2524a0e76bfd0f4d27ac8cde9b00900b49577c55384e948c6c6dce081d277c3623b1e749748488e648d9349b9f17cbf072d7083c377ed\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 1075928172057bdc681a626808436b13f556883057c93b452326c7f51316939cef89fe3072c6f1365120eceabaa0c12ce4ce05762843a09debccfa01ccb9a85f8b0f1f7f030ed2a0c1514ef1c25cce22557d30627cecbac23f9f1fb645776883fbdf502894cc373e18ac6bf47d655894b528369a341ec1e56c2801a30f4c93e5219a24f727b5d41c0789d01b868742dc9225f5bf3b588e5836aed54bb009e44b9598a96bb36df4",
     "bf3521cdfd792c2bf9647b01f77e80f8063299ee26a9a36aae9594536b7b3d3ab2fa8df3dfd7e4380eabec23ea09b046d9bd07a11f084107bb6caeaf32559685611791912513f50b0fca6bbc37f93b4c0048a41758228539e0\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 7a21f13f8af98f47bd62b03985a2e91ffb3c7c3a5af6ec75c2269e3ab11d859cd45a214b48310c7fd7983c8577d839cf63d3c3815302ea649a17f813d6cdc75803a6caf2195fe17a5e84d8a59eac0651232dc793d9b7554eb1123e3594e1f6a57a72e2bfa6b1ed9f1f9a6168aaa83ba2d8b408f3c709354a278b991751207075e7e5548f0c0f764d58775db3143191a210e702b69dfa8d8946b1a65d67b3da6f3451f70a65d29314ce5b7ff13b95cf7ae68854f586140d97a0e9de4ede07be81fe20a5b6330bd9c63f15a3d4904b3a4596951ef5c591007ee2f6ff94fa90abd1093d4dec45a9904eb656713a110faaeec429fea9d1b8c47133787ff6aad3f938\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a7db33f68fd972b3e122e2dc8c749561d14e513e7df9b03f285422015879de35021689bccca37b31aa7d156f39399063a06fc9590c58cee25d83e1debe90037a8713eb0c58194e7b54ddaa86baa0e9f83b604afb5585aa1e1a45fe24f38576e644eedbbb86f57031cb43f3ef1428a33998c1decf44011b63763e47d2b2fbdaa90deae270455607b928645b3f5ac39553feab8f5115c9e2f26497155076c13d76d95af3ef342bd1828e382949a63c54cd0d4c4c53cb00ff4b8e285034e78ee0f7dccf9017839c189ccb3bb8b92f515beb63345c9973e77dfb388b373b8076578e41aa3bf3e86bbd4e1875996ad19c8d618c8d69f4eb06b4103cceb2b8ccbd8a58\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 72eeb72c3c87040a35b98244d6d93cd309b65bcc793bf9b10d5f7501bcc4dd8030eea73c4670de7ed9605b3210dee4e53e758fe7741c6410dcdda4769df6351ee82380b5b2387c1cc8935a60d58408fa1a51b485949e0a4d4a82a27e8b2265ee634815b8fbe3778a00fcdef0201179bc4999ae16e1849027ecf92d53f53ae3e04c9d7a39e71f9be774036d40d38777fd6e115d0bb7d8b538e57cbf16bb4d5748ffac01e1b20347bd688b0b45448fb5028fdeaa190e3c288df6dae55ad078b50cd64adc36d471f0c31b574fe86680afac6a61ea7c2fa5942687e1a4027833655f88a123b50e7ccafb7cbb73c8ebcee7f915258b8ebc47a792832242176e2713ca\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = c280a6067d62ed84b0f9f44bfb322bad0ed92fd26f5c8ec7e91d9a115eec2dd6f5a589c124b50b732bc5f4e382ad344a3498ba280d70a8e7beb9759972fe31da8ba57b29a13c17004e4336207109385a5e27d53f12abd5bb6059fa917afbd45ca8a4322928cccc776cfbdefd7559eaa86326c21cdd6ae4c40c40b1659016520e5d34b1b63b7cf744a37bb795ffb86d853dec82a7c2c57ec5b14f68535c12279841fccacb94b35049a5feed59496db1ed372f968a4de1d70dd98c64e3e17e541d0fcc971a735cc610b9504680cb615301440cb211a73b6bb9355a677be77de6330dbdebcf6abf3ca83d457dbb951f3189d017022c354d08fd7a5d0f8f63aac308\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = bb7d11eff4ebfc47082969640c3883ae3b2a95efc08f0a4c4cd59c61fa5f15e1235a3e53a9653186f09c21e11757a016a671db51ab597959a437f26dd1f864ab7c67306fbc578dcf614c304f8ebf6b745967c71b8093485f74348f81865bcbadb39075497e1ed9de3f9e21209d21ce609d2d11c3fe837dc7381ef8aebf4680e680276cfcca5506d3c1eb5fce1655b566ed63cfa69e4e186140580ec9c7a51aab286a54fb674cbc1b527ef6d778ad228109a93ec4a7dd39c30c5879e2517a540ce7c0f4989b7a930899c1ff51143e7d2d3802c2328000331b9c6e9c887fe8242d2dfbff5f828f604050268c450d74779f8a512dd0632b90c9b5870c541b45d163\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 4988c316c1057404e4b0b1aa3d0aa039e0b4dee3917449c0cb816c7d738db50c5e62275770f2ac0372fa84e88a20a23b9c36970c6065c599ab4c23b5b28d260e95b7f020d760e7b7e00f0e7f7bba51ba104ef62205fafc6226c95c0f483486980eb163497d7c33aa1b856ff77bc1dcf94c57442edd91923417afa48fe718285f358a24bc7bba48707155e41145d16d9e37a12b8821ff29c581dbb2f3fb64172633c6d7c1ff6b78debd5fa8faa4623fa3fa93352834c7948f7b68311fd8f2189e54420d73dd5190ab34dc3a8efc9bb7787603f6030f0ea2eca2aa7e87c4373c9b0b3c8d9fe16afa3922639501b62459c34012313c160c8707f740330870ac2273\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 8f9a07ec03306424540f913dfd03eff0567cd419dbc5be4a28b3dfae5de126a01d1fe4c6147aa4f1a2f57fd50be2566ef8ef52ad8ff816abb114060d6efcfa64abb0864e613907ee142a4f96d965b3aeacc6c870bdfc316c72d43a5c9172fd2a5ba0de6c521fd82023c511c40700f7b7651e8e98a0a20d84f7be365ee540a403c9afc6087dd5ae8473006fe4203a790db4723520be38fa3b9247075c93e6b5499fe8ab997c7267e495d1a99d5865333acda265c02569040787d5aed0bd4e492e3f76605120bd41840473da0e4fe1a388cadca7b4d543f5beec4be9c3fbccd0442dd0b11f9d79c6e910177aa1c997028d675980c439e61571011ff9b26818a69c\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 22f3151da8a6c4d0b32ed9d6fc8fe090e218f18289b5a7d780b9cd78618f57415b49ed7a2ad1064cbeb8a20dcca021cff65e5d51a6d662f947dd2286e4734ea6923ff40acd41cbe4e6b33e4661966a8de0673e59958f71fdc191b24a9ca7b08a78bc318de1330ec7025f526cc6704faa7923c042e561f83719a7edcae9a3cc6ecd91d86a94416d2ef60ab3e74e1f587c0b5c26fbc4e2f67983d4845f907e58866936c80b3159d352383d1deffbb9bbd67a2eabdcc43450ebfda73495618c6b5b8093d49e1c0c32445f5e945227de1e8ce1cec611cbee43cd6956944d6554b5e120ff63899755836df131feba79d7fb06fc3a3b0feda121243ee00cf8965d4acf\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = ae0ea39ab7ce7af3075d67f8edd5862508eff6170b43c02e4f592c9101a7da1dd7ef2e4be53ba3449dd6c2a6c1837884f12fa29dbe8e9d40c677d1edb6122f61205b203ab0f342f21ef8cd45839b9fe9f61738e7ed0915ff398a679a983124009fd37fd5bc9891d33f4830aa6f89cf30b59dc3d84cf955ef960a0980f524c686cc8123dcff7bb9dc7e7e1bfb3585bec3aafacd5a0c7ba63f6af332dcd1b5215f95f06d2307cd75dbafff2ac5cdcf4587a68eab0d3d277ac6e999ede44a551a0d266f9358074715931a7787f4ca26a94ece1c963a96f6558a6c8611fef31a5d459635bc2781ecb35e75837829864001074dd585d70b7e5fa6abe2a6e28b67d48a\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = ae177278bf000f22063be4bbe62c28840bf0d293096cdbda95eb2794930c96544817c7af9e92f22dc81ef2b64f43fc50243ac91a99ff41d05a5e38005a32c519473de62f05a5250643412d6339b44fcc3ff2eb671da073ef72832cd9a4e892fa67c59f8dbdb1b5564f1c8b93ec9e9a1080670e649450b006afac18937a62142e2041cc5394f87325e723fee67bea8385eb8847058fc56bad33419314e4097852994286c2094e4d0360870aee0a6fa2a3823d27eb3650e727845df9dc1af0e475a8325cb9a39f0a9ebb2104a3b66214a7cc02b2ad3be12f91fa434553927dac42aec55b8fe2b5230b0951d738b42b73063b97eb6cf1fbebf76f5f7f5619c730c1\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 1037912266d26bbb66bc872403272075ebc3c0352ee5201b189db701f64ef193dc2facec45af460a38b8d2a71d1ccb17dd0f8532bd87e5d7f6b8e1414367b5128e3f6035b26054d3331ece1f926c2685f5c286ad0befce4be76df6c26bae8a6df520ad073a058eedaff3d5fc6906e8e1c864d5b989ce9319e87fb121623a27432e2c06e936d151b7657d6500a08e8a3c71a0b491cd3908811b18d00add825f848d6a0290f4c0ee2e289274cbac8c8ee00168631d43e7e637609444c18aa4cc0a887bc104d6ec9f699119840a99a9e6b7ee3dec0d0b4a1f6a1e022a44721066b0fbd6a7c6b4f51401036e755924845bc94de315f494c5c19901b23e62e9db6aef\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 47fc62936a9113548699f3133f7252e4d2b060969d2a992e4e83e2cc6330f4d3c9e5cc2005ab49f26cebe2834b7febf478cd01d0338a56f262955f61c70bf662a55ecb8848374f38bbb16b0b25bc012197e2b92d62b5c38bc7b2b570b376f6aaab95a134cf6d0805f3e5823bfbc5f57b69cd84fc103d7f3fd7f87186a08dade4522cd32a7cca292d25c02c90ea0a44f6c38c13eb58b71a54b58e42f17245f1881087d32df31be3e83a2716ff9487e3b389e2398d79ed80c0cb355322358bd908d397b7365185ec4f55a50a5879bfa87e248d31a6ff51617b282dd2c07e228510790babe57b466e5d7e7ea6491dd720e98c77124354b3e544d064895ac845c35f\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 389f60a3f7e33801cc6067cae353b16263aa75279d0cfed16c122b4ed81350538039fe7f43859a1f76bff62b613bc8abbac257ee6eb3e5088e6ec33815281d6f6702f05ff75f2c6260c8791e43dc168f69eedf1d33d42fa5da0ddc9d2f071ab3f9dc0654ff1a3db8c855cdd9941e6c6609aa29d69f6b1b1254c3437196fa871f443fed2b2beb113257da4bde8aa7bf232fd9c0ae7e7419bf977f14c4f2c4d128e5f79f6f5c63939e7fcec231ba64145f8fcf6f43b821b41776811a848d613b5da4cb8418a1a95402c3ee5bd7195666e8d5b13f12b08cbd730938c7ddea9d65ca45683e9de28d618af1b618aa0bc88e3d1db4521dd069be105b3145e54004eccc\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 7528546f84b9a056e49a848644d876452449b0e228681cf1a83c82aed6d1d68da0da6b880e31d71eeadd4ff2f59cd55340d63",
     "0c6c548b4b9c600de0cc4b18d0e6144a5a294216e4c9901250ec8a6897eb39517212fcb0ba823ed763427e477308194927c7ceef49c440c690f5ed33375cf29d697da0fec04e4bcb0d2bd0f52a3bcd209218605eec678ad665e8adc2ba55caf883d14fc6cedb87634a36b0fb6019849693fe47b0e5ab62bfee78b415397887cc3ab293b170b5cb4217f912e13ffaa27f8ae6bdd4210dffa0179d723a53ecf6d4996992ea0ac9ed6b10064bc793256bfb4ac5aab69858d9ec4cf9bcf13c1bca969831639fe8bc372ca67b7603fd4\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = a736d77611787cfc46ef5e49ca0d39f9a1249326fa77b50e024c657c791da09ea1d363657fb7b9d5978dd9b75a2b7593528e3c19e6e41abbe0e71273cda50382921ec6b366b07f0edc0aedb048484d51b603d062aaa18c404d6bdbd61a7bdbcb32e917a79bd95799cdf43a992ee3d93193f9a20fd113cbe168df7f884067825b79fa73c72b9168f7b83002096fdaf613919ecc40422317fd14b5ef8d2561639a3bcab462c3ef8e0f59929c43e23cf21911be969afe3548c1b449baeab90a8f6b52be5f6cfe47b941a625d4020785e8180eed315b7a6840986b33b6ad6d519c53179a2c3cb180583808dbd3ab5acd90e4ee01687d0946578ed9d7558ab8de8a8c\n\n# tcId = 27\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = bea793e3475943e123a0f811de9b3066d85d6cf394e1e8494741d8449ec11eed7b3d796ac69a5a3ee4279362f4a69decdcb1dbf397c7e0e46b9b855feb3b125f3ee8c735f79282a9efd6fb25bef533a9f3641f47d1ee3bd647e4b8e0c1bcb48ca35468302cbb32ece10135a63b4d4e14300d0a30b3eed9412b24139134c84cc2231dcaf505a15ebbb8cdffb96ba06b24f8e85e4274588f20454175752d94b0c71aa8d50a776ad13662c8badce5ba74f4d086aab60f12cfed831ee562d3b9d9bbf4cab8b53071dae0ce35644b425202595f155eed25a8d651349a2dc734130e0bff2f09b12750977fec65c79449b95957e3602104b4b0936d8e41d5fdfd1e2c72\n\n# tcId = 28\n# length of sequence = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 9740ab49e35c355c40c6eb4839c47c85a27231b2b96133015267e10a7b0f786130308be8255c68584aa3f6d4c1ac2c304130b5bced81ce26cf6a0a0bac293f23b31e2f04f5f91d98ff17750b299dc521cfc946134cfc76ab629f9abf5275739befee3fcc9c217e6e7c81a71dae3cf3407e5362ca0c0db20386ea943466d59ffb9e512022df97d666cb15c35b0d1a0cc532e408727e8f76cf9955587bfc1e327dd5f58d1f7edab6fbc7232d1d2afb9616fb5a5de1795cf6e93896a55285f793edec78ded83560b34b4102f505c4f2ab8f15f603a7fc73b75cbbad2bff29c374fbbd9e1d1a6a1dc10a09140bf0cd5aad2ba8a0926b29b3d830959e6c45e8d8fe32\n\n# tcId = 29\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = b5f76f1fd7a6e786981f7a4fa8430dddd9a27ac86f683d4c7abc383932e57e5b15a30d6efc79cd266acac752fa73ff06e3f2169807133d3f9813932cdb7c83de7e57ee196f1785c12341142cc3af2048ea81b4b265ad16408a764b412b7ad96dd29fbf899d8343b01e74b63faba19c36ec825102941acfdb55f8388e7d429a89a5d10e96e2e612e231f8cd857127f6b19c7766e6d0f79d54e9ef54bcf5bcdb457509154eb5cb0640de286e2d4fcdc6941aa4d97f67fa99a1213deda89c78e5373e40a0fce38e71e57da2030575271012c4fe96eae29f65462ce293943952db34a93abb2719226592cd3c651d3d4ee6a36f8082a3f325290869bc3ca5f02de629\n\n# tcId = 30\n# incorrect length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 1c41cc918d7f45458e0bcf5a8e4ba5eecf39beffac05fc670adfca933f8e997061fb546a2faacf4cbc92f7b6da6b7ec97bc142b41f38476458836df716b9b7597072f11848bffaf7ade3871435f2b06fa0baeb08d3be31466d6c10409e3871c92df4a6a5346b5d7c3e82b90539033d170e4950320169c7d9db5159201bb5457e9b3c02c9aa6fbf2b5359f4b657702d37f34bb0ea2841e46c73f6d30ac546c1cc8a83c72319bcabf4ac741a542f2c45fbdbde6f4d8be88906a24efa7f62cd5e7697ef02a76c3fc827c1d2969d8c4ef05658ac4de9ea06dac8c6c0a65bc3d05ae3517428883a0c219084486c8793e2d546be6c8cffe00e07eb7b82a07449c726c4\n\n# tcId = 31\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 1b80690c323802241d2b9fd1b024571fce1ba770566018753d6434d0927336d9d4441a845d629ca275502d14bf818ae7a58ff7af427c3b8ec88997473537cc564267270bb2be0030e0cd934c417f814091831fcf776331daa9e73b7e426f73f0ca9c1733d015f37cce5893723f1ce9fb2fa0bfc3df6fe7ac28549983fed2f05b70eae4648011da36855f892dc65c06c909ffa179a8950501f4e650fc6a1b05ab988edd59aef685d5b05224445d9603d5b816f1ea3b3743fde547de72f15ca60c305c6f493310d22e84523b036bd71b1fc3e38164ef7b954b0bec028fba60c4720710356d080917c1c5abce6d27d3ff35d63baaf685db37dc76568e3b35147d54\n\n# tcId = 32\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 596d8e9730030342f72f0a850fa5ef746f63b89a1e0c48b67a817f775ac937454936cd8400653f4d1f82e315597b9e5146ff3fe4f9412f81cf6f8516d9d440c9c01c6a8e0a56838e2a206216b2f3e419e5fcfeaacc7c9be4fffc7586ec21d8bca6b49a2efe44d66266f298a3b70c4310eb22e64366bbd5f324a1c9c667cf0d970ecb37190bf7c98977f180100d3d6c63e3dbfe382e406128eadcbb99e45407a858dc6a443bdfef2c9531bd2461186ce21ed34cf5715b764c5bb4d4cca9fb59c7f90d9f71f43eafbb256906095edc27679b8c752b6232ad374c668d4ef2c55bc6fad362f8538b553ecea8658adf73fbee8c6c47289d9ac5c4471f74847697ed26\n\n# tcId = 33\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 766027246bf7d6eb5d4a137dfc5d537fe2446156834428d928f6c2c927f8e911fd57db474d55b4e8007a0cc65d40e7f3b13c16ab4c106550e5a89059862a86d95b2de4dae32d29f7fa0ab67bccdb74f90708153e5c726614ac33d61b3ff90c90a2c8b7277dc33e677647cfdd303462ed192c145264f253cfc403bd55a48855ea683b3e0d39b866c9408f149f76beee227a9b22720cb5eafe4ccab94dcda783ce5a15c29905c2d932b57eaf359e1e066ee4e41f97ee2338bd61f01bc0516463a6189cbddbd083e61f82e6ed918942242ca178de8ec45d9c3abbe0d6a621fd395114ec2f53683cfce25c5d5c5758f81bda5f2323c4f5897e7bdb5e0b1c9a2691cd\n\n# tcId = 34\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 7465093e55ef94f127a95582587d4096c69391e5fd935f9679cd2423d5e4e2edb53e1c6106f12e57fb372f0ad6f0795fc9619651568834be5f78d4614498b79615f894058d5e9be91138895fc5f38f4dea435ee9d8f9a43cf3bd98778b1c6d17ad4285338b26ac1288b97c4b2fd1ad27d02c152f38e2cab73677de734e56e6d48f1cb5c8bb5cdce8597952fb63ab5801d60acde502e5583825173646d4ad4a7f47dfe060eb7eaf34e44a45f621a57c6afe57a4fa2bf785b09f0ccaa2d6179f4169b65bd8d71b1ddb3ec92807708354cb10d10a4f198dcd1eaf8210079b12ec50a0b759e0f32103f46d256156e8635c99c973a03f70f31e32ed7c441dd4d7e36d\n\n# tcId = 35\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 7925db05fc296b0d369a6695038c4196ef66d47f0a389ea05f0904eb9c048eeb464516de247437b2c8aba8fa6f95b563c982d21f5141505d2676b7691454a5f0c9c9d07d19b81c901b01f9c1cf5bd9b0d5e0b2e244b8475a1931efd5676bc18f84a8bf97031e2fadea1160ed8437c2dfd9a8f7fa918e93dc8803de821a067b0eeda6a6ba7c0a74f403b3fde78b182c7a22b6ca779513e0955a8fcc69d9a6d7d1e7960c032539f17322cc40e8698c146df8448ec2a430203dbe53421f2cf19158bfaba36840a5336a775200395dd1feb4363a4df2d115b6508fb2a52a7e1896a85fc778af2e014d485bd270de8727640d7e878fee0ca41b552241a83c1531fcff\n\n# tcId = 36\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 7255b2ff2dcd7241daf5c0973f37f460e2ac85bd20d4310c2797f2e263f4f8df1a70eed714bf5fb19ccecd66391abf0d3d6266313cf28b828694ceeb9846e9adaace75f691f9af5818e05fdccb2e2dc0c9cbef64aee2e058a0954ec3ac9d5146073796fee6f1fbaca676a5cb70b00bd0023b7d171e4f79d22d16fa3d6886f7695ebf19ef51d0d6e193ca73939c620c632881a26d61a354184e00e805e20326173fc14f1e0ad0e85c74272138f58345c365e4e46623c624995bda7eb6be14be0d276d6b6ab770b1d1e424aeba562e80bec509fe3c3646f455ad9f3ce1db8f8b923aed9ac89a72505e608f3ec9e58be7bd130e81c1e7d3b0bcfd20bdcda9e0945f\n\n# tcId = 37\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = 9cfcb1b8abbfd5ca02379491ae39e3982ac9fe8bdf9577957ae39cc3b7c82815063a179822657aee3670e4b37436d47d7c24b79f5ac06d14a9ef51d5d48be524d09d1b8068b1af518ec4c80e2da596d9cc5f0fcd261a366ddfb191d0767e02371184ebe7b5999879ca805a79c428315ebc350ebe3d832fa0bca87248be57b1c1ce72df271cd7826888c43dbc4f187640ee5cde3ee3f004b530bfcddfc0eec7884998255351c7cfb7ae5d8356fbce910df9ec471ecfd15c3666b7943ddbbf3c688289ce3375bfa8a0fbf3f6078376c5f310690872c7e608b87b680be66d91630c8f3a71e44906c75560855ef3f341bd8cfcc1e49cbf77b58222ee1288b6979ad5\n\n# tcId = 38\n# lonely sequence tag\nmsg = 313233343030\nresult = invalid\nsig = 67c3f8293b514637ca21417422cad5f3c5f39fa97cffafd617ac72649a9026047e6d8ad968e48a9523d0883666dcf1d7745e2bca246f01dc285c34b87c10bae061e8e9e9b27c673e43c311bd23531443960f132d78e667ea8d22e118ada4efeb34a84d147b9206a5c462f89c49c34785416575e7ec1d61c0cddcb4aaca309b44cd5a5d0a0266e7dd71171e160b761dc3f12024b2508196caaba0102ae74c7dd1cf1c1f45127cf532f274489e9af63c02b2d5664375faaf1b7ba2b556d46b145c28a8d123b5c88c0151698f7771b790c00c17e75bd63d48406b4b245827364fcafd4fadf605bc5f68a78323d362189ce601a791",
@@ -4193,9 +4292,9 @@
     "a5916a6c0ef2dccfd5ac7397e76a301096732584e8442f20ae80627588961cdf97e344e131d79e6894be6fd51b72122bc2654d00f943683a8db630d35c6874ea56f908eea64902f18c0a548905b3c13114e3526f3d6ed39061724c8e9df498545ac7f455c37d2e05beecd47c15181161873925049bfb4a671e4d1901a75099c7edd6499268229353073a598174fc937f856fe85f950e9059496348d0a1d9f98aa94208d66ff3f58792ab0afe27075b241a636f1b5835f4a4b330c6f9e032a736119a1d8feb99f6c22f3490a82a65710abc3767e81ad70a230ac4b1db9a327ede40\n\n# tcId = 218\n# wrong hash in signature\nmsg = 313233343030\nresult = invalid\nsig = 60899366735cff786b22572d67c50af5f644bcdfd50c559d989018efb91cc888398ce3b556d8ed134627827e7af0ffd5106795ddf96f988e581d8498ac2c2ac9ac5195d7c15bca548ccaa070924c6bc8de828fc08f5e74b8eb7cf94477310436b9d139e54e97a9764d0750182867e00f0f9e5b4b6122137bbb65271bda16add4bfb9bddb3d8ebc063296d9ca073c377e56993cd5f3f1bf229e0f40ad3efee00fde0a9ef1604f01a24c20d67fee04fe8848cd245a5b0e69d619dffea08fe1afb6cf075c2594d00cc6a21353656b1aed51af47159ef88b61891842a6eed6c3d294c1d226009d457e4c54108f8ebf4305d0dcacb07e60b51976c35d9dd5aa10b9a1\n\n# tcId = 219\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = bfa56d1f9db006144a2714fd66a633ac3d27e7033ad9d59967f816ee45277095689203f3b257c8fb64b3b1d16b6e424f1347076b6009ae56ae193075b82d5ece6e643f0e645b1675fa0b7998c6f5414511d2acedfcecd0324543f92a462b9f9f79223931e7ead2c2915a1dcccafaccbd374669caf1e2f50d45aa986e4511674fa9a5bebeac29760bb055acff67026ba83a977aee4d6bcc7b247a76bb77a345ceb97996750b77fcf979adcffb71e734c461adf3e23b708591f4987d59ca8983e0d10ff5a78199a02f02ee171c26b373160efbb51a23451bd326a7a6dcb66e4d9bd02ad30acb4719478b0908831d5cdf4012efe94aa8d87290f9e94d430e9095f0\n\n# tcId = 220\n# message not hashed\nmsg = 313233343030\nresult = invalid\nsig = 7859342f4b0977d970fd2c30ca94e898545f8dc398e37949a58146a203d191a6124cc2e0de5d3311587b4a54a83e5855486aeebe867584d7fe2d6b559f5bf2bdcf990062c2f04db9705f06fec4a3aa3db300cf080d1493a60c63df1ffb98e1c82440b8143b816244403c7d806bec0481264219fa263c62852ad9315db8f03b255e7e329caa6288beaf7a34ce3273ff39e8c8ba449a979253b60e48b66124cce678112cdb13d28d805c6b3a5fe55cab2df194287fc060442fade432473aaf96fa331fd16544c0fb801c30f63b0864ccf559432f98d1fe42215c050bc71616145b1fbb33a4842bd3222bad53bfba487101147c3119071513a49ba753c8b2307fd4\n\n# tcId = 221\n# using PKCS#1 encryption padding: 0002ff...00<asn wrapped hash>\nmsg = 313233343030\nresult = invalid\nsig = a5521057430948701805207688507441e3ee85b3e8ef9334922c8ae9a9a8485f95f5747778b2f7db8ed3df6655e57b03022bc1244d04961d6ee57e62c762040b581bacefe7e5beee3fd1613a142baa6ad106e720206cb119c1884f41b90e3acca402b18deb5593c3f2d9d841e23b2f9443c13d450463b4e272a08fded7f00d26029f7c0478af557d41e7285c48d9a0ae3719a95a14bf8b9e25351c7513a5ddd86a2e6c124a54be07f29660bb09da8fa8e484c0c930833fd727b429ddd2b8a6e1626d05f6265bd88eb88e9783123a7720068f590d566d16bf19b474d58ab5ca9f718eb5d432d11f6c65e9325a2378c6588c5c6ee89edf7ac708c93bb9b04a1f80\n\n# tcId = 222\n# using PKCS#1 encryption padding: 0002ff...00<hash>\nmsg = 313233343030\nresult = invalid\nsig = 9c0eb700b26efe50ee6aafb76f0a996890ea71533c374286ded0c21a567afc5bb212e81cf80cfd6f2d26a3b27fd7f17a4c976f093b240fac274a2a22969d119ebcb26f81ae0bf5641dcef96510757de9b0e7b02db74efc1ae55c55e8135320156ee9152dd05c922066aa895319708bda1c7a9db1890ef7cdfe7de3925f4c9852a8679f4d71714cabf8fe834ff442794ba96c2f1df73641eef076b172ea846d7649e9a42bded0a7da4647e07ed4ad8c1f2d7858f416fdba4d63b7ad80241d8fd60012b3a77e7e0a759091274d350f688c8a73334a6c0f2cece789042cbc16585cc84150278bc3465b3df701533674d272c33d06ac852cc4ce6648e35cfe60da60\n\n# tcId = 223\n# using PKCS#1 encryption padding: 0002ff...00<message>\nmsg = 313233343030\nresult = invalid\nsig = 4ca9a8f3f2a187234daaa149e463d1e27d78edb054e999ed19e63024e41e267a51bafc7c863b4f2802b09f1aa0dd3d6a42fb0306ac38fedfa3cc642eebb6f4748e55ab41d86e3fdc392b1a9f9b01c55215543b39e96d8603d80e223700521bf4b3030fe4f2a53dbace1d668d99cc4e57098732a05b99dfdd3326a218a11c195af7f09b829ef806ef71f3b139d1c2ab00d488cdc75576e7ccf75fad3ce9724495aca667dc41df1efa59974cb52b040fe7d578c7a4f2e71384ae347fd7dbc6f6076a86797198e989fc87878ce926fa39d23175de35b1d09862a62512fb58eacc669e11fee9aa0c08f351f4da30170a6e3bb47929edcb81ac0132bc6ca77b3f09f8\n\n# tcId = 224\n# using PKCS#1 encryption padding: 0002ff...00\nmsg = 313233343030\nresult = invalid\nsig = 89c5da365d5d2c22a961187ac62c26bd5b88cccebe46285c654dfc31f44b7268f38d9e2902424b09f35b7094a39ee937ab6140895acd30e63bb927f3a0e017e68a2fde529af3e1a2359ad2ca5df7c94e9e91843160922ecac8ba64d38ba0fbeed8e8fc7f2ff86888e0657805fdab834a6cef5920ff70929d66676eba288233427ab5ce9e44462e03f71225d9ba2e1b4898e56fb7949e6f788fc0b76c0b738366ebd32c58731e8d551f8f52b433bf45d6fd668548e59c41943684203697bfc0cf2c53274836aff5f346eb7ca753b3856ab4d9128efb0db77ca05274b393579ba78624fb356cb3360ea05bd5f9f9d642b74211f258fed6bb940577dddb2d807eee\n\n# tcId = 225\n# invalid PKCS#1 signature padding: 0001ff...ee00\nmsg = 313233343030\nresult = invalid\nsig = 084fc83861c80ca0f3c7d5f063916b2de3a1b3f93d11a5289ceb608ed3246bdf1fd79b7bbe22bf40ca7462d6689f1f50a53c0fff60b4899cbf86825f8e834171aad934a06687787c7c833cb4c6a2172002445389583edee72ba4d31a6c5cd09b1bcc18c3358faf548369af125a915d47affcfcd30f934b739a62ce37ee0060e568211ac255ed9481f6a3a871812ca2e86417b807e6d352b0aa0ca078c75319a64bdf4323a34f379dc2699201b1d6ab1599ad02c2e103499dd7cdfe0545716e73e400ea298005481288d384b76f1bff69dab1486921622fcabf0733c0bb392c3a9876d168e0a0ed453d0e020bcdc0432aa00ebcdab36538d616d93cd01ab3a63e\n\n# tcId = 226\n# PKCS#1 padding too short: 000001ff...\nmsg = 313233343030\nresult = invalid\nsig = 471eccd41ca3c301cc79447afec99925611ea09e5701fbba0ea0458be7d77b35e798452fd19865903b33e2121d4f21cbd0a2df7e2d10e8d20ddad3b9f0194cdac071a3c4f4f879ccd88fd03d761d4cf0770abeecc946a3dcac65e1f4152b833d4a43b65777bb146099800ae324479d98f623c5321cf9d0aca42ea93cd9df23f5bf27cc128f20ff41d9a5f4048357397ea45463f04ee665bf4e10630a006f57833ddae1b3704a6f50f5e2766b3f0c700c21160b24e0666c54eb3661f13cad3fac33b0d63860262e6759632204f0f87a3e1e039e38c15359c99cf89942cea589d78fd3710a83b5e9ab09f1630fd7f9d7a8857efd763d361e158bed5cc85b3776e6\n\n# tcId = 227\n# CVE-2017-11185: signature=n\nmsg = 313233343030\nresult = invalid\nsig = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749\n\n# tcId = 228\n# the signature is 2 bytes too long\nmsg = 313233343030\nresult = invalid\nsig = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
     "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba748\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba74a\n\n# tcId = 235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = b6e6752a6f99a6dbc43817850a139bf61d3b983821b022758da22187af9cc02a33cc4e7b59586fa829582374031a34d8d7f3ead4d9f7e42d3e50ffa74ea085b4cd884bf637039152d05de1fb6611c66b26bb4f4543eb4680dba24249aa0e31ba17b6fb4a26994b85bb1b79bd77c59ed18bcd4d4da04e45655c0d981af616a8ef5c193135a58c9a61857e1fd4c6afa60b23d214f58a968d31486c57d483dfcf7a59d49039bca4d0a7b3469eb47cb2db77dd9fcaec9d906bd206fad6533efe9b06a39e61dc1e901fe552fa086fde96f03e58cf3d6b65bf1c4eb9a8b48b218189ff4b0008c99aed899a787cc0d4ad447093db347161ce79d1de880d653b1380b4ff\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 58c3e57605deefef20c57f260b790664b8b215b3dc82d33177b8054e5a990df72fb27c3e7554f76ca5e42ee8b2eee410a6a6c8eea3634a527232d6c8098056bdbdf90feab1d123e22f8fea82f42f9b4c8d65f5febd38fb8357b295586d63c3fe689f89695638679ec3807c76e097a76be05720320a525c3911602704382854c0222e2a51384a08b98df7eed637a5dfcbb8c49156848cfa4b8b36f00562f4ceb5d7e7c6237d9d0c1dcffe3847605d1607c1665e956666b4a28df99fd7342336ba119556c6c7b162208f160ce950e7ff41c6452bedcfd5eede9bd34da77749b8df8c6925e24ebb04175611f0027253e7ceb028c6fcc82d87fbee1e2017ea43b6a3\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 8ddfa621e73504de33ee75ca1498cd7daa0fa625b7dea0756392f2421cc84ce10f0032632bd7d2b74c60d55fd2278bb86185af3c187953ebf6415f643974e53d34d8cfafecafd20dc4767001fccbd197a38222dcb1dba53ac8fea54427bbfc25a858e52b1b2f8a778b1034318c5f76d0f81b91267a4e37ee7014e50753956740c33796f8161fa72899c00643c010314440f026bed963bc3b5362124f2e31221151dd6273a28b21c3955ef6bfbe48eeca51f454173d01f7d4dded623fd2ee69442affbad43a648c82c99e8bd05affcd805814dc1e1f96f301421ed9ef6a3ec2c6bd6af61d5cdbae31acd48218badc1da7d14c07f018edaec3537d4462999550ef\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 53385d184121d3b7cb41d86ae31d9945bf8057e126c847b69d2799eaffc133877a51cf8196ed85e3d22e37c1f7df932f796753798abe3d3b08b03b5574ea201eb6caab2dd1a6e112fc75c92285243bc3ffc7bb20e8b1bd872c55c6f1e4935582b2653cfb7e1cd343429d693589b516c8381b324e27d16ea1569930295fbcd94c8a75f2d0d380006f0ba9702b2089394d678065540de715c7219dc16897201d61cc0ddeb2148ae691e92348c91e9c45118ce9a3d5d10edbc2081918e879c7234be129b480d5c46b5490eaef51d3e38403a36baa961d4d0e4dc9a045342488abaad93666a41bbf90039ab189b6b9cdabdd00e11fe0bdc9d52cfff469aba22080a7\n\n[e = 03]\n[keyAsn = 308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d00308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103]\n[keysize = 2048]\n[n = 00f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f]\n[sha = SHA-512]\n\n# tcId = 240\n# short signature\nmsg = 38343432\nresult = acceptable\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e7a1269086f0bbc0778ded8d7108ff4edcc2313425088117b2d5c53e9d9971950a5fe8b2b67d2bcd1be74f6b557a3f90650a96d7e4dbd63c05b94f73337eea682417c058d66ce523e4461065ac8ba990c4ecd04932\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen169 = 208470;
+static const size_t kLen185 = 208470;
 
-static const char *kData169[] = {
+static const char *kData185[] = {
     "# Imported from Wycheproof's rsa_signature_3072_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001]\n[keyDer = 308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001]\n[keysize = 3072]\n[n = 00c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 157ffb942b1363b5989ec4beb93fb0187ef016de4ce055620825d13c3dafd4fff621c71920e884ba28c5e98b328baac29ad4bfc4d2cae2f0ecb9d1b6c9fbdfc385aa565aaf6c5b3150e085e0316e21d7d440a873074e5d2700d961114ed420478647a4769d832691f7a004d934a89dc249c9343341902d5d0c3d1a623001265634216beacd5f756821f21c3b58111790657690918a2eafa9e85ab1ee44edd3d8bb89e892acf411ba9eaaeef88eca37dffbda72751c117364fd1b38c840d7b42318fcd011a4449aeffc2de32836d3a4f704d4c8ad4e078315d0d1758f098f2ea749ccce62aac592ac4041b5e733ba0431b88332a39a2af7f68f9bb1f469a793b280b964f285ce5cd1ff3adcd7dbd464a7c9414ed45791073f08415be2dd9f01dc2fec8c3a26fe97d9778e2b2fccf71a1ea5e9ce017d2d46778d7e37bb832ebd5825b3257a7852db5cb6c132bcf9ba3522a670b0e866585444ed3601fd32a922818ef6611626eee3ea99cfcfeeaa4c370567cc65e0479bd35e091b772d7445cade\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 631cb4bed6b79dcd3827879f6d64de3ae17e0fdb022be013e733bbfe0031cf204f0508ab87a2e2bbdfaa16cf24acc96b3fd2e72bc4a224428e515d6f1e0ea6927eba6ed7282a959e5df5e52eb3be9a39cfe139ea2fa45c21eb81b3197eff655b918f7c5fff6abab33945557a922063f9600a372ae7701db686f7e1fe4a6e804a0f624331fbb59536733bed3710dcacd22ec74b1a1386d045372853cac91130703ecafad7f6f42ec1aade5cb865339743c83e882f248b0db0855f487a6d3b55442f67773611a11813ff46a58c762b1bd70b5e870c3095507f23758e90b3c84526f47a825f0ae787acfd3ed349ca6786a2e84ec500c6042a9027a994c328c7a6868e6a81481b294383edda62773fd224af46e782ea3f00468515f6100486d94e818afca1bdb81851e62b3bf4f9236f061afafb3e399b93e6f6a295ae200c9bba5ff5aabcac8361c84f2e69aff8a8a21720b900d52ea4bddcfbaba3a231bb9b0dd48f0a4ef1cdd255b3524ca0633d04907ab672314c5e3173108313ff4a97df3772\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 5819a699691c01a7f35f0bb1831a1cb65631ef693f7c9ef89f1e8460ee2ec312f6fd38fe382b3bf4db8f5d208146c32c5ed2d3b13105743767a73529bfddb5753c8cc13148d41db97f69ea1dee0ef1e1de990ff565f633bd3cfd315a7dafc70aa7f27d4f6486a2f1e2711e7919c5c73c518069338c0ac984d75f58b00fb0eee0f7da6c9c84d97955137417df8f20c02b7893b5cd929ba37f6b3278a1bd35748e14086c5f7100abf2edebeab5f767bb83d999a61cc27531bb67e44a92004fba9944b9c5f770bc66671d2efc74e01fbbd2885c5175a1fd72b91937c324b8d99d3592bfb73efb9641b87949266de441b61d180e141de510ae0cdefc2160df918c08c53799f050ca4eeb3a8b6b5ed35b8b59d3acd13a600a8a137eb1b8c1abbf55f3e99cf52d7092d1e3acc08583b04aa25a052668bc982abf060ffb17c1782daf76fbd69e7fc9510c5c6a68bd525719be5b81d0f2a8b961f1aeac7dc13aeeeef9986c7a47b34f8b96167d79f7ec458fef7345c1c31bba599d09b3fe33e738bc7da1\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 636d31d8d5dfe0fc6ab01ef2ccd4602dfea62d386b002c429e7e846e7a98d0cb1d448d25be039d5158887ab46a9dd49c41537a89036a065fc10329df051e5f2e5c1d4436e84790ff6db4d3f31575e5f0fbdfcaee625722c5492fceaa3fb29d0a865200dec06e117b04753ca9450a7ca7f7d1a1176cc38ecab721864413a0d7a22d8fc1595b6cd0032fbf154fbbb31b56d3bf963761ce8ec9fb38bba3419716d0d39e976857e79b1faefd5f5a2ce0ebd94968da1ec3a387804694d90f37b34033c7f70ccfb26beffaafb7bf56c1b8385d489217458e0a68b5d680f9fa45382fd1c227ff3c11e3ec82426ec648a564f0e886e5b12e695dd2fc8465bd9d08731fb140084c79be64d915bcb4ba10f1edb4c37e35231753be2d9f339d37d7b5f22c91584a68a973f9cc469a23d3b5800157dbd72a8405fef4e444ff01f7fd23efa143c1887504e81773743843d8a73209a1deb66c5f305df539bc30e871332e82330e5b66fa6ea253b2b64b4c9781011d20e80ddd8cb83916834eb8fa696b0a4b6bcd\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 08e0ae3dc0d16c927c423f12a87313afd1d66fbd5d09f48a4dd1a8b52102bbdd208284cdd692932869803a5c7f041a4492ac2e664bb6dd981c370e0c79ee3f7c5c6dd37018986fc2cc618139fe3eb85c0616f0673403c4afe7cbca49c1eff27bbf6d7e541b285ffff20b80bf61dcebcc4250068e25ef5a8e7c3306e49fcc2a1ee0f500a3ec603b472082f12ce4a6a12a6ac66cd4da8b6efac0796e9dcdc66c095a6282ae9a32ad274efe63f43e725410e6ed4c480828ed876b76b71b1cb8c142d0c7a51dc202af796d7bb55cf544dbde2f564f31994911ec7307015b0da2c51abe265a04a74b9afd0791a68e725cd7d8b473296c5d948157c10bc4682f74d843ce72e9ee8719a7a49d9de2f982c5d4490451eaed62c305eae3d0f9cb3493bff056a0dbca8579b7b41dc8deb1becfd5abb455634569d58c5b5535ff1356ccfaddd14e0f9f7f69a7ae9cb9f4c0c9f661fde349facd21f0021423d3a9ee5031855dd242f27009090ff0c15d1655317383231799b18c01fad231385aa5020990f41e\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 9858e2557c6b99fbd84bc7eac3e31283a4efb351ff019343760a1e282368938e29ad902d3eb6cb29b35a036dfbcc7e06d2f1d15548df59ced35326295375bacd7a9d28a01b4e8acfb676d80b6295e19c6b7a259df56456e1df72f6a746e9cd31fed9b79b35d7a30a7aa257e9e8ac60ea886042b9194e7a383d1c9f71c84511faf6c96f7ae0e690112b26bb60cf7bb10f684e4fbe2a3a1b1c0caa9b1bdc79fde23fb758c2ba57880a4de461ecd2bc696689438183e2b9724fa68258f461bb4405425620a4d95c87ddd83e04be381bc743b05d26ede2ceff8a858636baadf56ef1dab54080da0f516307c579833717def053c8906d4f102448ab22693e7f52d5850193a40ccf0d68d1303953771a73924e4bcddd8486e1477d96250bf6b480a5f4b822822183694c52a2edacb331564444f0335d3b17d511ece59889b6d961767a3192d7f081caf7e671addb3757451776d4bd3b03f7b689843dcd59019ae4f292dba54738a88b86cc6ce3b123c61a446f4878b627a7f3585d8ab7bca9b258f10b\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 1294490626bdb36a31c93fa7853d93152d920b022f1b473bde3083a99e11aeba8c03218fa07d6c4a5f8b2504d2cb54505c40130fef5a2412f7a5ddfec5e2c8b5058f7cbde7ace0ac01c7ba8a1bd897e8974d991ad2b95c2f03100a34ff408a788c70ab5ec73b5356a4e3c7beb44fcb9e2f3f25d1c974ed962b148167684351dc2a223a174c9744b092071d58dfd39c38364f47d292651e7806ad7962bbedb64739d7ea298f0254244790e3971c15b861c95f00f65532aa1c77fba5c04ad078525128e92ed2b4f1269ae744547e3efd4ebb63e9df844df152a098c47fa492bfe0f1917ec973867c7491f64c1",
     "72cf3ea1bc3f97b42a397e6ad88d12e150d3dbe360071a3285d6a68ee6e736eb4d7d637c649c2f545259ecd430b25b38a1618d69a4602ca8a2a151066f12c3807f5dc7cbd06bf095711e4483cb0a89c26dd9e4b0b03e05beca349f601c894f9a245aca3204584a9bd844772dd87b83d481c8df18b615307eaf643cbe856488c160e077458e899755301749d2d27bc190d68a5da11\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 8b889902d581f3be759dab7e53cf3419d5dcfc825d203c736a374f37ac5570da2b87239c938bd299691a46387fb47ca656bb9ab639f6736207e19680ad1a0c7a7818f2498ec98e4693c51bfe414fcecff4bae7afc6db0d72cb9dc447e2ce4ce9ff435b9daa98cb125d77b7c7d2fe2e39ba15122da11bf19d341b9878de33d3cc134bcb77b9963d19a3037a67458b17eec462eb0d7eb7ce69b71f41287d3b104b45757c76440f370dedb720a0c721c08c055c5b815650737fa478898246d36f7722e913c0913612e753908400bf6b456f269538102b778257af0c7c14339d0ae1ddcbaa357369a065c0b3627cade311a627e1e3179514cd3761463eab7f9485f6651793cdff282daba9b16c2f79adbd24ba54ce4890a9685ca78d73e8785d722825c9fd22ff327b97f38d5e0b95f449928114ee9756aef5213eb95cc40774fa1733fd02bf37cf5243e7ca76f88e7e3fa8d28a754b5adaedf31a91e6911688a6149ecb52eab8024e72e1bc3a98579d9eb242e08fc42bd491e3b0924b03fb95bd1d\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 46da0267738cab66df530dbea6fbbebbe904ad3d6ea7e7a06e39a3b5f3e38bf5856624185080fc756941b226a52c8e6126d07714deb781f6f7944f47147c680aeb0dce310c7d6f429429ac73e562510678c23042b635116174a2c2f4e8e8becfee1e4ba3cfbf4e2ee541c7f7c27b1916a2aa165cdeeaafb9f81c84e9754d196c3a9bdc777fc55d86b6bbd16270bc4d3cc75c2960f2a7a661105184b436a31de2cefad722a14abc1cd2f2c75738b2c81580fecff78d7d385b20d1a03d4aa2c21a168e13da18fd628e34be16d821b48136b6dcf7594ab3e1243c0a2a9e785fe40436cc6fc460879b673b068cd35a9114b59c2dc61fb875310e103610b74aa5e3620c51a257dcc3b9b0adbe774426ede0f779ea9d370f18a19d8844ed9f5d90ebfc4e0607a467645711da2b500840d4851e3de63723283bda8d08acc51a012699df0e8f5aabe269206f93ba4ca6597e17cdc01d2ead46b5dd2433b82237da01518ee3168b133b6a42e9a73194fcf9162b71d08528254c34b20d692e141c657c969d\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 39c1fd7fd0bc4578c3370787ea5a133e8a34ec9702dc1456c1ca7f8c3cda7bdcb8beed72e4098de5ab3e467f325141a324ff55af1390ff6f3d0cdf680f4319378f099604c9044025e04ed1af1ba5c74805265d8963684c7555cb835e8b1bfc162812698679e47b96744809002c805b75bcc5233f378fdfdf3e56593bfd6b0228f416f58b4c32ec0c2d32fe113cf7f3c347425b69e8bda1a2c5bbc3cfd0c1bbc609086d91175fab0adf050a8b3e904fc4a700d747500433fb72c55cdc25bd283d1bfa1db93604f18b8960127e9b7080227235e6ce234880de8e3c49d5edfa205140b8ea383e546e0bbd4c5dc59d0c058670ed91a02a3bee241ccceac20d434a442bf35ec6d5922196d78b080b1c14aca63b827434679d7b6e666db10dd9a85b2da60c6b47fc97979974f11b6051fe9378d96c78328ccf4e5cf5c120c2641b3f6b7abdfd0832fbcf59fd3787100032ae65aef2b076631788e7be1019feed9b863f39759525be659f3ec50dd7e9724bf6d09d8b771bc60e8a8e788ced8d945c89ab\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 530bfb86fd2a4b31587767d5809e5ec2002cbdd9121e135391392c242354844a9b4c8993ae61bd85810a0ed240203cc4be48ded5997832570875a7b775206460067b30df7c3b7f7af9d98e436f0007ce0d6360de0c1a4e75912b885d1154ebc25df90465ecb5f07a6cc477e44d3579f3a629bb49b7a19a619f44e6b630b684f3ac4daee5eb386dea0386593be825a696656e130ec0e4a4bd5411c45ade6ddb4a6284f343b0a746bbaeaf03cef31120f19f2845dd9a7fb818406b0cba91598ece880836e0b17e6f375b8941381d0b301d0ed1bf746c992649b40899d2ed2b39d488981970cea6da2453b5fc85f23c8d671a3c7544f4a7133fb500f5448da44d4c405bb70e85aa3aa399204148c01d1a79de3f784dc5a9141dcb41872461e62deca48dc567b984ee80097a099290e413e575411faa54f7f3387cd7759f71b8013ddcf9ff2079503ef802c54fb731e3131316c93182dead523f41551bdd3a96a4261bf6c3dc72a952ed4b7cc95d116741c653494b5ba8ed9aa565ee57ad22a4dc83\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 94e0075930de07ea37f0eca5023be15c472a674513654d837befcf17765225c73d17e93ac4c69d855027747c7ab81c6bfb3080ccd5b6dbdd41e2ea4871fe30131bf2dbc143ddad0292dd4156c60cfe5172fd9703729daf99b2067334af23a2aaffd0f74d574955c406ef8ccb1796189c140d1a45701c993737b9de11e44112c4df9a5b2c7ac827c9329c5f63f4bd740f3f1baf69a8fb6b69ddf500272beccfc2f24902c592b91de99783242fbe9767f3809b38368f04b02d973c761fd999b0c69eab43a2187d6de4fe5455e070e20bec5bcb8ffa5e439b04e3883804a5dbeeae652260a405ef5e2e6b9b7bf7e8018065a900cd831b05674a093650644c42341c3f5429d59fa3aa93737a6b525a80e0748518cfe19e6a4de792d3bf842e2a864f04da31a8ecd0b191ea656f1c2987a1973ba1b10e16b09524a3cd07c96814b395b29ae1a434e76bde8e0b6e4e29ea3c6871ca447fddf077f53a4c2c3499c7e96dc6de112cf28ba83d8d274ec03fcd1d570b74e22ddddece554b7645380a2a7483\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3e65342b3d9322ee9b0473f54f0c3be5a17f56f2cfa5a8168bcf3001ca1256be867d3a575b07c3d7d020037590aa10d75dd764a1d57a123976116286ced29b68e3b625c3ce0c235a629e27e4f8011afe4b383117a8bfc927a7718bd81ec4a156ef6ec5cb206c2f23941b595ab3e8e4a3eed825c8e2af444cc7b0ae0e303c8f109cc149fed6e8a2679c55a2f483dc64642170d0f62f0f20a5387a80c5ee3e72d275a8c3e18c65de6f9af8a7ce886b83d84cd0270bddbca64db5d6de42619ab0f37ec18594a09a80c0183d44dd3ec6b46ca4846daab73effe1d5e2d8ce302db26708ae9223369ba5c488bd11ad27751abbf994e2bd18cc999dfff0f65e8c6d6d04e229252a5d6704483458d7d094dfdc96cd5a7b0573a2e0b50fc14a8d291fc856e63d82343534b75b25298c6ab7af401ce1215cebedf87635ec80d0cc228831d26c40efa5997105fe4b3786d0a44c17be443a67181d35a5ee56da18b7e97db573879686a406c3bf340851d12d8ed57c0530433d655aea85eb3211bb7f128c91c0\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a7ecbb2fac0916fc1bc793f4503d496cf2683d1529632eaeeee4fc89bb8174e7797a8d78faa95a52da0c4c887585d61c680fc4d1224e02d3a0dd2b33031120a14be8ad16e267656c683c179d261f6aa6089a14122168748a4bfccb59ecb086c0b7edd342bc61d2a9a2f5aab2f4558d458971ca04672e513d3db5784db83fdb93816bf8f1b443470973d96ed20a7d85adf93bcb497ae07022db0f939028b9387a1d448b3fab2408c2754478621640cae0ee6af76fb6e653e4d418e83d431f7967e435b748e8c7a26384addf77115e0dbbf7cb5be6ec0d11b183edd6def81d0554a2e7fffe692e3cdaa6c138cd73bff960f047c0226ff0ce1abf9d16ecca4c3b998ae8ab1fd1e35f80b04979ecf0338497d1df5cea3108bdcb1d0bbb6636ae234cd81e6f2df123d263ae38924783a2a11c85b7605808e84433dfd72d9ae5b9d82fc6a8cf385b0994d32afabf3ba62e8578ffac2073d81d69c808a2c9f46b1115ce7f26885d1be3052ca23e2cfd05e92469795bbb274c4cca1b992612d0610c27f0\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 7c2c6b135814accef0caafe8a22b8cbdb832a30c997edfd33e01a9578e309988322f08c64704080dbec0469274fcbfb131b4388cc1181ae2004a63cfec1080087dbd3b9e7409fc0f960ca721d456755f1bce99bc91ba36c65e747e4cb693ec4253f0ca37d8b9d64d5f7d0526ab809a4f476e6537263adc00f20d4261d78e5b6f22896706c665e885d5283716dd959400d2a7cb35974a3a3adb1a4bf3bf36e9773ca539787c0f6a05d17b75837452e247f065803513eb8c6c995e989a52a5d48bec77930a91cdfc1f373c58b344cb1700b7707a1801a758246267c8ce932035f8a93241f57e9ea8c4d2dab3ff4c5fe06caf37e5c996e60e7bcc4f3a6176a69e61df24f8cc080b7489bfd8395d30b6a4cde92ede49a26a0a03c766cef25ca6bf982fc3126ed7b1b1b2bf4a7ad9ddbe1a3a456a6720953460cebe6e1bd5c333b9ab2812f9b47452b2759436137424832753d8a97fd456603c5585620342fa1dd056be6247297d5758529c152d24fa2644e613244dbb66815278385be78cfa4224b5\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 27b9f6f0a34cfa0a71fe15c15c910b7c8f2096225213e7021649aa3689ccccd5e2041578ab5be9d110a05456fdc516c5675561dc82a23fca94cd66df6dbd4b0805ab85b57734f5dd2d6efcb1a0bd8c3da6f8ae7a68f54e015a324212b916a0eae4095975f76f509ea383edc4fd888217abb893693f821f4a3c72dff39dfb0fa7abace8c16151d01bb81be374122f0e479748df2c82ec87b443325ba908bd00b2cab985e64c7f6a1edc62787c64b84410d93ffaf6d9a33bf3164e4348d7e1afeb6cc7d3e8a51d723ba6ff27ff5ef1358001ffb8eaf651cf48ca5534bf5d86650e73b540226fc2a2c1a7c52e6003d89a108a65e1c9df183b47d1753ea697f05e77b3a13cbeba8daf25683a6bd423b2b7acefa66eb5e6d08ac1984007aedb7df5d4fa1da1aa3c6ea5f383571aebfa42ae1d42060d996cd9dcbcbfa605f002dd7ae653e7c295eb3c3d03c9f6c479068456a8b0087f0c61492ff7c125e3bffe30cc45a136d72c75b047b246dba18ebb41f3fb9ad0216a09d888885b4402200291e6f1\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 39c7a8c06ac4835655fa719be214556e0adc5a00ab466d88d33e694c30882e7c41",
     "d7fdefde724fb8255a44ec4bdbbd03d1ed528b4ea980bde20717349c0f2eb78141ed6f4490173e62cb2c48b76357c7816d1b0eb5f85391143d04cf6a100ed6917c46ec661a35860b3210ebf71bd7e6b8e4b8909914226ebe925c99a7a5a66f1d02c876f25d80ad4482899193d9a444a8a1d0ad8d5afa912b53995dc36ea89599f4f181241a6f4fbe698de8c7c794a82f1f576c255e701751d3815f5b6fe93efe9a678d2422ec9a4a5d090beef2e552db07a4d146f90bb4cdf1ea6fb844ffa1948542bdaaece102fa3359d2bd23c6447ddd64dfd7e4c94c801c2b6ae17b07b07a4dc79bd69ce5ec46aca637845a0185a372feb8adb7d60996133b9c37c32a9ad869ff5534f39aad8701e3487e1e6c8fb9ddaf71a1c34374a09ffb85fe44790ddea79439bae8eb51ce12e5abed6af335ad1ddbda07a8507b6df0d0f3ce80dec487968d29d92a139eb1d5ede5c28240320c5ad9cd0edefb69fd156f0626f6d45d\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 4c8a79462d5c62f418c83b35e67899db78b04883afddd506855ba23e7ef8c5336c1492faeaf1d57444d1049bd008c317fe7249d5decc09fb4f39d7858edd097c3949c53bca1a439674a61b355ff5a9388a60b7d5c7255961af7079e72c07fade552d0b77c36ea3d2f0c7c9985b8ce478df8658de208dbf4690299db7f1d32660585b918af94bbedbbde7ae9444972abcca2f6b3c4004e3c87940793f1a625d932ba14e715dc1b5f9231e0f34956b2920eaced888b3a320ec8376b059fd48ff369beb1ebfd32b9e9c9623d28b54856919b3af12239df425a055cf43e448541af94b88a223a90580977a72782b831ba0a88877cad65f8fb49c68d5e3b2f6224637e61f4b356fda8b8ab916cc31b18e6f92d33e0e27971a480491fde857715cc55388b281e7d313ebb0abe3337f7d4544ef9d144e402f49c2b71eed30f8ffe8e600c31de5960947bb07fcc4e15ac0d7bf00bee0920c9f092c8bed16ad9ab7d752433a96dbe49ac2cf33445257a51dd347dd77dd5ae0d08b223c457db3b57d727f52\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 93391857ce1fae6df31b1ad972189803a1fc3ae91b89a264ff86246d6efbdc599003bb7c35814a4215dfdd3932834d4064b497f464fa93054363f1fa5e365825d1b87881e125a50deaf22d75aae32fc0fe1e8f3115f7cab6af0c2aca54d6f21f5a72fa77a0731c9f8ea82ac2e31155fe56a7950f61fc1b22c274203ea91b28a4bba0a925ecaaa017b9258e1d0f492c24336334e328054a12df916e1e4108d0b7e5d8b2bdb3d4a10282cc1653b9df2a24a7ecbd753cc7677c88c2acb7f741e3d56d670c226a827fd6b19aefa445bd277eed60dd13619427a048616dd26770ce76a3031bf5856b50f0ceacc7bbef257d86f6e9fae62aa6af550c9d526a6076d1de77a9097acc15728cbab9fedd1428c33a89e07c0a49dc89822558da1da6db6f8f738ae309fec8f033ceda8773ed3eb5bf6203fed189c3b7a774cc5f44073dd0db9e4a614bf7c8005d5c6e022fda36b82dcfe66f4679eea23269ff39213851798e63e42c1ec5be20b3cb5e20787597b43248d4fadd1c10cc94d066639736b7781e\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 1d9a1575ce2cd06e5f160063d03199cac5e912cea51439f738d98ede05aaf7b821d8b26082ecaf4d12fd01d0f64be9ea2e1831388cdb5e7c7564b73146de8f9b5314ad6738d98e1053ad0d7d594425043ece575c75128888d0d7b090ba5d5e008be46abadbea23c9b7741a023151ef281d99fdfd684408992a8aa9f2c85376a40e53d9d223ef4ced563fca832ef03bef29a47bf381eb6728830ba37c69a99568494efc85370e8e9c3fcaace1a59d6c98afd03a0e8bd5da2f5c909df5710e385ceac35ab0fab92a6cd918ca8d32cd5d4bfee5dd644e0adb3d188a5d0e7a20a305bda34ec10bb65c922a0c074e8427cec78a590c095a0c670cea6d34bc7a88b2f1f06b00b368b8009cbfe6a14b18bdf2b01caab7041d46e6b76fbb1f63e9b309f60fdb4f1a6033a11dd7dc1eb15d7faf922b3fdde28796c44e226633813a969ae1fc54388525d0a125414060862718bd0ee1337de2133fc773d06bf83987a22e4d2e883765e3affe55ff8d92771da79ea0898258f0d7e858fa3937ff24f122669d\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = c0177318feee842e802480dbe0dcfc6215d75431a30bb8492cfb1cb84f7ebc73dc37f56cd0dbca1f6a6516c6eee3de3addbcbd569bbc79d533a4f5955d95babc717cd4c8f5039ce49ce7dd20aa44bdb96a394f8499172079f8ed20c4ed780ffbe11cb00d04aeab80c882eac517c153993892549f2d4203d8e3fdc719fd745b06103b49f54ad51b6dfd0f4c94b08b7059875073ac11701e16af0b73d7b305d9a420fcb560b490d01c4afcc52b9b21a467e95bce62da8f559527066116c602bbcc29a434ca04ea3227a25a07d733f1b867040ad1c85b001904c749505166635c217d8858e637cbd74ebd1b86a400961f2713cd00e64947c2b5d2b97a4ef795822eae56328bc4bf8e8c9c8bb8d759a3743cbe9d368d985299d8338796ad6e24df7eb7db18147450d2db91000c8667681b47aa9f0f2e08b48aebadaeeca32976dd03ba94ae72950803a07f566e091670c83c8ad01cf1a2a921467010c20975e1b9653a7b56d2137799eee863a576a2275c33320445307670bc62fa039c7cdc8094c1\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 5675e16b96e961dd428de891451ed0d23706165d65392d277eaf846e24f0c4388536b2b52e519c07d0e10686a164bed5a05314249a77f77d140dd16d42fba947bbed204ef4c8a958e49f3aa4e62438ee333812d6a9719ff166839e467080d8762a4268fb575a33070209013741ae8ea0c757bb44d12450579ac8e22870569c6892edf1fdd0bc12a7823b695c4c90e93c3cea57c2fa004eb3306d13ba60cfa7aa3f1465a232c3f4cbb765a82bd59551d0f130137829871bd35cea7c59cfa12f188c91dfc214d8102810a7deccce40f204562993633ba4669f4d7d02418d5a66db59af8ad001884969b8e00951492bd846ad7db619d623b3466cfa062ae9282a1cddf150e761c90a3413e92f2f1fb2b5b62d410cdaf6bd8885d635f05f20331416fc3808fccd342764b7c244c1aaf78fa7a1166b1b204058a16ab750ac3fafbafdb2610f52164f75e7cff8a4c3cb899ebd5fbe1834682ee94e6cd810a4015ed7f0fea7f1494c5a477b572d172056629320307e8ece3f72de5dc0652e688d79d154\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 562cb29e3b27d68a9f8741a57006296a943bee15c1e0cff97e8748ad822a321234a15fb3b89f4e07c1756d693507461172981189e9191e0175c71accbc258d3e79bbc627365c95f19fa416aaabf223bf22fbfd46cb8022a88600fdaf84aee70e9c8939e24de4e8a5fb2536c4fda5e3e3d71adc377708c1f4d7982c0c2267265d4f85d9e27f689de2c216a21239d6d4f95dd30ce102da43ec1b3e72ee5696db8c63cf06d94b8ccba75e197b2d26350d35336475f66de615daf8c1900ba37d7699ea881c0f7af84e936c402c08e15d3923733aad0894b4e78216225911ceae7f4c770a17d90fd7178a196050bef7218d7e0fe7fd22eb5c3854c806a5cd179e3a82b59d9b4e9e2dd1d4cd998ed32ffbf19a91cb19149c948b74861fd0e92174c2f35c82c9232a8413adeee723fe489dffc8aded50c7716403c02549802e083f16584b05e3f67a4e726dd8ec6d4adcfedc0695a47ab75e6d0b0486e946b6485f89162349eeeb88f20dc3095ec5f45bae1c2b7af4352138e864e6fec18b9bbe98fbf4\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 2302f69cbfe30dbdfb830918913fb556f2634e268210efcd0afff8bc527fe30ea1dc36833b01fc1b7b1d8781913a5004a24c2412b9e0713b84f228b6b08349eaec2ac6908861157576c89bcf472572be53c0075e48534d335b954f46aa456c90653912e07137a418f8eb59329996e86fbcab8e585d80b7a8f97e7aacad3d08d24dbe30a76ef8f47788d36926e74c0f24df942f73fbdfd649ffe9a952acddf3fd8ed9aad055c3a950e749dfce25d0c45114f40dae0a449f23d7915dea8ee1f6f163849affa4b7b8105badbbffc5690190fce192f4a647b81b14101b4fd9b1f0379b08379901f0908ccb48d5c88e8a3d0b6563bf01117ebcecbd84dd61e6bf05b77dd2a3c63d9c36a394843df28b8184de81cde4f381eea84822002008938d3549550cdeafe31606fcc282ef2c2a4ab90b437d0975a6d576fb705e26131bd07add5bcd34887496b653f3e9c2a7760eb367935cc8052ea896c6f2023f0d2a5bf3267835cb4adb079019b8974426953ef1447069a79cdb51fe8c32fff14a9bb8f78e\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 92218f94fc3552f215e98d21758992429cb17fc3313f780feea3f482d0e32cf97fc8832205e74286e69a1fa35062b984635687692d15e6050376afd8e8501b4a07e8c61006a2fa6eb27e2a4c310f54b907808027eaf9cb0530f8ade781c4fa9095a41bb6630c1e0973783eab65cb0849f9c8e89f3c997ea3ab930b4fc629028dda3d5e0e7dcd99b2951282c31b8e3739b6724a414dbc254802e63a1a6a268e7fc6a91934cbb27d9cf0ec994fd02334a7451c3658e7ab13aa5dd27e81736c9cb316679eb9a3d3f87c3739ca07a7be08a0402ab2883d860867a4eccd2476c8d9e37e2ec214d6895664bdda7ce7344c95622791cdfaca32508c8b7388391846b720659de2aea7bbb84520fae9edea66638270e735677f175f115c582f8d76185e8edb3d105e3d6c0f490ec486f7ba41f750add6d50997ec85ed351a2b14a4c328a41faf70ff3e50fd4ddfae6f9c74fd72a7c1bc0df045e31fd72f04b6a797e0cced07bf2fce788d75ef6d783cd6e4eff98c49e99487c76ccd4e08ea26d36c29aae1\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 55a36002b43d9b5a2f99ba0acf767cb04b54b7849fc2443d123bae5b6c6b6fb666d7ffb96e09580462df5fc560cbe9744c166f8f43be98b7b61ab71b86323d771eb6aed87ca4261b4e4d76af84813173c01cd82a87fda653c47f3700fc2110a852def8c785da96dbc779615335ec871a31ac3590562e8f50972b5e217d45089a217e8b0b1905693e7dcd121542d11c0083b967b04a8927211ce89262329ba2f7875412b8785ebe47693b8f3b76f98192bdadd3f4359999d48d751290e87264a5f2e53ef5814225931b253b451a3246f22ee3fc7295806ead7992bee92e74b19dba84b1228a8fcec6fc0729f4840d2b467956f86a916129c57025c7465fbfd760e0ddfb480f74",
@@ -4223,9 +4322,9 @@
     "fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1204\n\n# tcId = 235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 4e28f546283f9ac74cc99c6bca79bc208e47220cfb0717aabc521ac55119ec6bbcac880bed0007c04eef92a24b091d9a09ee5d3b5be790abdb2c98a07313d505fc876adcbb1089026940e03dfc10fb46a0c2a764ebe86e51ecc2ab489f56daf38764fc0a36a9cb4529367c9880bfd7631c340fb7fbac0edd2e1def00d65bd52e597e2eba1be1e41bd89a00f5c66fbc18b93e9cc1b5be962780f6d7a9c6d375a28556114f37a8a3606dcd68c8128bf7a7e5f1205778bcf3048bd4f7c10cbdb4ae759954c4e4db0a9fe4df270c41bb86885dbdd8cb7e72a33322238a2d29615a2f01e9fc59c230c2cce58ad096c2de5071e020f76c8c39874f1de677dd5d2f96ab4dc145098d25b740b5279f05713daff54ba695f950039882059cfc2f86c35a0501b8d0914aa59a806e8d1403fb2eef163ba1d6e3d1e18dc99c622f8c2d360bfab2c9e8fd9d74a027e466fbcf4fa56777ee0fea7e04ae1901e65b5361f97146d7f4a550adf77539fabb7135967dc16f8ca99e8283dd69627cf27cb9d2df20bbbb\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 78d3509284dc06b54583e11ddf2507d9e50bdbf079fc319d107bc2527c1b742f4c759320fa22435d74e94253feb4a379128e7f33c5f3462fbfb92ff40c10b23f8bdc5890114757364207768014380fc16ebeaf22a7b1a9366f3fbbbb912347f1ef595d742a976b69377533e7b61d3237c3693cf43b34f92773497b8df7ac0660f67439aaa66fe179b34d9dd4d013e8fab958fbe2a27ce84b6d1c3c2998a50d41b6b38000191673c23792db2fe47e4ddd3b5396c65dc44812e55298b8b50b5a2a01d508b9d215986113b099717c3a4ee930f479308c20c26630aa5419c2589c8cbbafa7eaebd71fca9e751793629d767be8709fef9177d6631a48731f5e59fc7e98cd466375e8775ba935f12b45575819ecef4d78d85b6e984d90d41c93bb03c832fe415fb567a1d951f7dbdf407beef8caa3a741ca7c7729c8d8ba98896dbe52d9785feb49332e646771e7d84b75476aafa0a54512806339cb54ec1c70943beb508966741eba4d39c2fe535aa82a9cb92eec99d38540efa3e39fbc02d757ad74\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720",
     "074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d558\n\n[e = 03]\n[keyAsn = 308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103]\n[keyDer = 308201a0300d06092a864886f70d01010105000382018d00308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103]\n[keysize = 3072]\n[n = 00ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83]\n[sha = SHA-256]\n\n# tcId = 239\n# short signature\nmsg = 34333630\nresult = acceptable\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a21abeac8409398319e65c8656f8f72e179dd1e99358c7531fddc037e47c1e688cd70eafd6eea01c823516bc79f89d7e52ee1eb4ffdeaad1d550dc0a47185bc9c42e47fce5503c3370a60510f834b4691152ef668deca633cf3873ce6613951784aa7dafde118f37f1cdf1a687ac236d5c956bced564b73cf202e3bace59667\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen170 = 205965;
+static const size_t kLen186 = 205965;
 
-static const char *kData170[] = {
+static const char *kData186[] = {
     "# Imported from Wycheproof's rsa_signature_3072_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001]\n[keyDer = 308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001]\n[keysize = 3072]\n[n = 00a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1769]\n[sha = SHA-384]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 473432cf11b6f96b1dd41e1742ace21cd10e8dad89a3e00ec68f3b45411059d0bbc6c8a3f077bfb4b12da60aca86dd856934061aa8e4c3221a019b7ed3d4e70ed8bf53fa140d3c31877a135a6ae140e021bea9408ee61fe7f32e60cd18932282b1aef1019f9a39789cb48991e535568b55eb26cf96e9bab35d03121f6be9f0d65079b064cff923edb5639cf08f48ecaec0670ab37b03e4cc2e604582e1cccef79f262c8b3d146887303c542ae7c455b0f68e882c5e2259ecd9f76cd3706e9894766089b267ed3bdec29df5b57e6a6f8deff21e093ce611724ba1012cf63aa2c62e7267af4b1df5ef030e6cba7b217d46fe43fab255f41ce086bec5e4f604718c95acdbd5c56bf8b68541ac0dde0a5e0f2336ea608864abdc5324b29b9f7bd35c514373efde38bb593b8d4b249535984662bf4b397b2a584ca15624416537320fdef81133d6038edd99ee19af9567c9fa536474effa925555c9c2fcea525fe2da935b791ec1d7d3bde33a58f80dd1e587e1c433239c65332e94d66d3c79bfd190\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 69d89aee9a1b9827228c40c3f3bdb9479ed36bedd2c77b3f5dca19917a5cde9636b9f6ede29718a391224ab58f464c9052b5e6786178194a90ec04d2d2b7513b19df2799b0e7a2d6d1ef2c49ec6870fb8cae45ee1103692da8d211bf61f656d304f69adf68c0227c7af5ceb8c2db4a3668bb6a1b8cc3a437b9df79bc0dd650d6e3a42295b4a6e23d40b3a9b7548f3760e0faf69200df230d2c143807b2f35fa449cfa73792844dff5d2ae50adc272c0dbacacd60eb0b7964012a5c1981cb2f358ff53509f90b0ec41259fef321e9a306a08363ed194e51ab6dbc00ceee576c048c02704a19f8f357250adc70cdd2819157d71af04ab0cc63ac9c6fa4b5799eae521e275f26ce53302017510826f96c4a2889deaef19fdedacc70a6598aa89e2bcf373239bed98d1f2267fa7c2436add13df68d9ea296fab52fed0f5ee46874f48735fe32c61ed2b1c977ff1862ccce093bdf7d84a6b03c3007c4c926d1e52d81dcc0bc2a553a12be363b764f6a322e41a8318ea7408c18e33c260aa05d039625\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 259332bd5a274bc347ffa3e8a31c8b27f216cc865d32c917a5d7e4c06abd44b6c024f44eba997862c812d8ebaf7caccbb234293178e44b2532478e8bebf6af5f83318ebe398e0850e929a89cda860cd18ec94554e4e0d45a9ec2d9acd83fbef2b5d31dd7b2f3c12e791afd3e39a9437fda7724c9426194bcfdc6bd52036f62aeea7853db2c8c498103eb60180281170aa0fae8139417974d917090dba8f9061665e92d953827dff4d450f5566d2c5b753b65c9b522a0c4da868629569a666b7c292b22060e92acf4ed65e51245403a4f162c8b504b85a810906ecaca2956d395c163a7f6f23573156968ecf62ef46b72b9ce39303681e354e91c5d7944cd3288b2a84a1ea28e7e6f260bc5f8d92be419ad649a8f55a2195ca46130922d82759f9bc030c8b122211d952c3ee7851f09f30c2fecd1070656c69c2598584b55cbe6567dd2719305dc52dfda03ea289a5db920fc2c777e7081cfd92864316d3fca9aaf8e2218ed8a5235e746e5cd9bcc856b0c615b901dc610f0193171869202e845\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 1f32b36eb43f87b18e569fcfe7021763bea0ca576cd273c0b20352906ed8484428d250241709c825704518ff9e97103bb70cd26f437f87754bd40407034a9653d00e868a759a190f3067ce5efce9ab17c8b46000d88e2d9e68b8dae0a0eaa4a31d3bb51c8c8d0fc839b0b273c83dad57016b1b5c1d8eccff1c753e5c6d189ed07b801f0a54a1144c142011fd3226451faea43d52597b003f9256cedb0d7d7f56d86dfeef50179a794f0b0de97da1926e9491f025bb3c3e8e031661e0ead860c8914f0b294bf8cfea2d5ccc726ad0743e192510732dc84301eee15eca3c6a5213ba66d0871789315f8537a44b727bd8a10d6e54636b345715fc0b6f5b5116f22557b0af9f948558b0ff4a3b0faf1de7da1965b977aaaf039c5b7b09b4f03efeeab3189d2a09fddc3983e4815df35ddd1c2198b695cffc35aa6662839f82468cb676b677d53ee4857ab9be7bd99e1749c811e2d6584427cbce14d2ca15df061165e85502420602666993463733b43c1c1ebae8d37780470b8cf5cae31cd7427799\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 7e3165358b5d09ab1ad1599935bbdab27abc32486910382a0ae630f725b5dca5ffaa9e606e2e555122c1e0f3409d7d915ea00d8784b814a6721d0dd117297c951c8d225a484a549e488fb80f996ad65490a09defb0b46f9cfca2e952b04dfd5418da920dfb2968e48dba8f0729b16fa32a832fd8b789bfebc63f01a1190813cfd55ace949d802afffbe9a1ec1e6a5df196e5ffb241c918d712e466f30c66c0bddd48b57ba4d0baa0c2ba9bcf519c3a26140df6aa5efbdd5ac9beff48613f92d247b35efbd6014f3d714705933e47d582f4a5da05b15a79bcacba1aa15a5fd6ddb228bbe4c5236f9ac607f41a492e6b1c92bd68ce30659eb5b27a5b2f76a5867dafbf85a9dfddfdd476c383fd03e38e81f2e1434553643e652cc006e5df7313272335f122a7fd9cae6f2f5a7da65865698d6d08d688000a730c90919e1826bfa1db85d5607ff9d76cb100ea1649442cefc4251a8cc1d823215e0ad1abfb2976bc4a6b2bbd793ebf9c7770957dba1e2a8583d9a82a072386d0957789b450993c77\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 8bc948c5c16603ab63e75e18bc7f062ea4c675ebf98dcacc1a9826b0eeab0004e2592b07525fca53bd288bb56b5961aea93b548771068f5b0cef467c387e2d62c91e045872922b516dd6c5b8ac3615c986a9c8b5211a05f63e82387175e8749709951273cd9d8b2eccf678284761c72285be5c189c4400629c26f87bf18ebfe5e56f2057fd91fc9209ec48a872d6d23bc330f1c81ede7fc5a0e2b09c3a4735eff9c8adf73152b3406a62656897c1eef075c4fb02244ecd93912dd36fbe0d358a71e02d2b302dbebd28ba50860e4a963071f0a890a2e400c18f530cf9440a897eb2781ceb17bbc58f61828a6456b93c86df972c42d082b913c4d8807b7563aafb7b330ec39dc988674a5c3b36f6bbdd096201f1c7c25ca9ea8f28e923ba46dbe93910268d6e35cfb605b92ecf98699ae9b09dd4634d1280586c5e6bb0b1a4b5e5e22b225453f5c66f9a7ed7fff83ecb201eb157c76c9beff95227b495c8516bbc7118f011cf9237b6e794bd7a9ba19e35d0a650dbf7c06a0c9ddc95f108a78246\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 09ee821221ce7bbeb4d66ea3ec88387bb5c5bfb055b8beb36ccba4c2ce9666b1a09935689db1cc2312d797ac8b6f62643de736f38269a81f969308eb616cf41960341fa8edd3501f4edf73736806b6fc1387df4ef3e1e26c03249f3db6471ed580699e8ac77d0fd9a78972347e8657b6cdfe172fda324eea00d60d38b47e066c4a6fc0e33f75d1d4ecdf46efd966ca9aef80d22e43dfc2cd0af37fa70d6df7c637c3c18a219bf58dc1e7bfc941a235bfe81ee7101530a2c264527608d7148dd91325b7895817ae50d774e8dcd2def8a476a9592d55be743c62c1192f0ad69981fdc8651c1db828097ff8088",
     "b720c637c60c771b5091f9d9e174bc823115a1f7dbf086f9ad36a403c2d710c47af4753fe6e43c675c30219abc2b8560bd18c25aac719546ce7a74080fcf22bd4e6cffc270e57baedcf2739c5cf4fc5fac18f5dd023301caac1b1faf4dcc65327255ccf54f5fbd3cf82801a8685c2eef3c5e7f608cf6f747b8307f617fce148347b76facf0e1f7895aeeb11e3225e3a6066a244ca\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 3b1a01f69afa77d96c1b7bfdff94d58e346746f3712b2bf2705d771b6ee082c7dd9d2c8a87de6a684177edd8038ea1b9bfdd6722a1453d68204e4d6effa584a1b9520561982f0181f102de2d62108418778b4976b4933a79c6a981bd48f84711a3f7cc26ddbf06c59aa669d56d60a741407f86e6a645dbdb1f7927dbc0acf996736899dd9aa367ec7bb157ed121da15f25bb21807293ccf6d3a66e18713d80763cd153cdef58b1e6e31b348cc514b8f2d357d14af7cbaae39993d7871bbd0cb9c136936b292dd368ef1d826000d3ca13ab48b659d231c95c02163d2e11e33152e69f6f3f08694918d89f9a04ad6a01c0887309654a4ea8a848422dc924f990cb65ba2550ce166b6a001cce4767a3f1cce74649876624d2a1111436a9a6b06dfdbafeaf329886d5e7482ce3e81a33b69a9fa7d82981aabd81c2650c3c2b34778f99efa2d3843b386c24377fe17483c490a63c6896212f8beeeee04a3959eeef47a00fec8061845d84fe7d7afa206074b41ff001be315a7e32c2cfabdc861eec45\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 7835e135188e97973f3cd0a05a102e888fa51ce232062c9856d134b30ff32b513093e07b7571b251f5b3618364b830b1af01169b0a19c203e079083c4ef85827f1a4095f0a6cfb9ea0c6ea4ad1bcbe27188f90b8c66a9ba0258d3baa49b97d0f8150370bbe9926e1471772f1f37dd85b37a5b9a4e15d32c02b427313407fa9ed693e0f444fc6f10dc1564072c360f9e5433fe985fa699860d6c9fc528aa82cd7b503854a975524b132eeed5f94015ed1b2d85d9dfc6b10b529e140bd611d316cb54f31f9d7d06b6deef9b63519c14ffe3d9694077bd0bbb3482b09a490b10ca2c6b510532f38dc2bfce51cfbf2ff8a43181fe2852e6876b760558129c3066a4f2f6e0f2f4e95c85f40ccdd81e795d5d2987c92013d542d99764bd0cac97024adacefc81ce89b36311ec4ee304b2307cf1e10d1f171f0ce7413cc03d5bd2c2233e0f80d98034e91d8b575e1ecab76d708c0899f27bfa1fee102e9a5f393ad18293d3ba93c7af3bb62e17311e79e02214dc9b62a85e6fe270be98a72391ba14e18\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 0e0e316e9d6d1e5f7333789d42f3761598bbb76da7847d5b75c376ad884ac2b61a0394bb2f65e1dbb986c26fa3837f905bda324dc65545fcc6d949ca4b8bd49f9ef7cc5b1c0c593bc34e02a56a0b2fcde4ced168a504ebd4ef1565cfb400cec0d86275af35afb01a5ed32263bc264a2c8a45a84f348c2ab7c7f74711e4e295323e2b9b76a7ba7475d8f8d72943b10ba64eb084c832ac9b2a984e1a2ce1bfb50b97f64bb754bf5d5832499479a198baef88d9dd21240cc95568c64664a704a359eb56534e241b106cd8d301b047448c9e83d0e3d9632da4641581ce53c8829e49701ed297d815c46f85528d2fc531a7813eeae45c0d249eea00dc69da92550ddd9e04787a1cbb76d7c6f4bf35b7d8582ce2f2e4c1184f79d3d7473d7637f42215ad4b9bebf143f958f3d0295b529d3b3db192dcdf4419d42ae219bd81a716f7d6472a6a86328e2728c5ed4c08cfc6f9c3277e42df22d15d7d46c442af610a45668de66d735e09abcbb638ac39cda905dab0cd802f5a542951df3233aa8732111d\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 02e31b3b6f1200f93fbe8426cf433575cf01030fa1284ab8bf74428acef25759df587be26a5260789cde2aae7b133d249783b1cae14796658d4b6a4aa24321f5afe684788efaae848b693846a457737694d1a7af6985890ffa7384769864064eca91ece6c03298f5ebfa7a18bf731ec9a7cb23025b7072ad4c06bbbfe33655654422cd4b97a9be3aff016000a6c7303ccfc73cbd908e82c930dd410c3ab2ace258bcd05e91e94e4a616a6ded7a4c64b00dc5cf202689a0ef3583a31e066337b1971cdd909c20a1ffc7c006944b81a89a5c96cf43a6def4d745134056becdb9c9275b2f2a97cfe0163bea5ac8dc32d0fa7b24dda4ec0c88f61cae77fac4c19a67c46fd26a03b990c5737ebeebde402879a02cde56728688394d577e5fc7c347a8cf66702b3b255084eb224436ca5c861b6886db60590a783c2d32beacbcecdfacfe6b6e520586856596b25cd918d586642db9acda72986078511bceddbea5239f229f1aee80cfb9d851ef9e84056141d026ff50abe0c83d2eba6288722457f916\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 0ea7aa33781b897d17e849f3967ff8f99b2f027a2f3d46bb979e5d4e58398f2b6798b6c6ff4e83df0a320cc964dfbd6542c0441668156e108d2eb5c7cd4947b4c310456fbe342a00ad7ec2be365d0e6c71abeba20f701b0b55c833e52e30ea9cde21bb1d23372b9ebf920e1c163703a484960872c2b5ec4e4840843447d108cc76a37474a9b7f2ba09e406ae26722b424f3de7a0c9b68ecd71fb1cbf3e87163dc780fbb8f0a16f06e05cd31a0b6de0c79912df07296bd059ff327fb5f860ddde50c3a28ccef959e89808120cb1298ca5f6f7bcb7366564981bf90161453df0bd8268e8cb34209c969bb5c7028476eb212baa30990526fd57b36c66b71c59180ccd26b02990906e0de5fb386bce5ac1b3d2d23e1893220f698b5d075ec0bd871843f473555df877bed9bb22cbe69cd7004d9eae7feec60808ec74db9f257ccdde2d20ff5eea9a4a8c3b89bd281286864d62e4997db92df8ae0d2a1fc3dfd9aebce9f7093c129c426b5b74e5dabb7fa2bbf8a59fa2e4b1aef9d69ff7ad653c2546\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 556a31f90b1879a1374cc4f2922dd41cb2313a61fc526e889fc9a20868458ad5cd26d6b3d3a0106193d44be3a22d1384084a949e5d1388f1e671f638da0dd1ab90d9d316ce66a25840a332bc2ca312dd9fde87ba57ca718f99f1851b36be9e023e24b9984062828211a581127b0d81e4b1bf5977f23d1c70da7887c09830c0e3c5a4cb66bc8035da055596ee7cbc1ed4ea76d7712708330385e5a9359fa8e3a0f6e63a569e5d2db4e867812b40da15d3015dcf31ffa887fa7faf478a0cfad3125fad16d38a57fac2262e01217d6d7adc50a3af804d8881e61dedb535001d999b82e2d9250ebaac07c4e695e946b5f42c86b546ff18f1a16a946963c9234d56d44a78c4b0ba0adea30b17528ae91fc326f1f976891de26e9320bdbca32f3709f731009da45b0b09ed5ee788278f18baa5a97d039448785a4751b77a7b061489adb289eb85459e663d85f3bb300be43a185283bbb94336c41e08f50ef7ba378e525e48a844e3a165bd484b882db08284e5a51b392727d54f913d4bb9b7c153b884\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3e5d3c3c140ee9a1443428aa0612506da862e56b1add3a86b13f4a014b65ab0be390c5b6be0aa14caa77c0e0a9116c543f3ae0ecb927924833838993d02cde56819fb5293b84b9a00ee84233c42cf993ca79a9af5dc7fb1d0074b9a9f895bf48f8d9f79f5d8535748196734790ded7f5e1cff092ba949bb70756835d1ff2472c82069aecb50ef4eb2078e59877ee8ebe42d90d8629580813f3ee4b9fe08960615c7b4c59acd071df543fdeb7440499ad473621dfcae3c14a2971f85e233925215ab08f7f2ee3cf70427e94be6c895cc11e2a3ba569d7a530d36e33f00cf76bb7f60b4fe7349cad86f09225a5ce0092b8fa2162b3ed556a7eba89e48461d32a241c4fc7016ed77a097ffb289ed34b88bc471d35a931a75b0309021dcfde235169d8b3f18de671444cc5a86acaccdaf62945fd39f71c833a58521f591c5ba04af3287444d6975d128f090c1030ae4de3100094c24e262481de1ff346da67ea73c410b80758273dcbd83e127524eb93a703bb982930644297545ea36000df500e7d\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 79184f204ed24bea8e2e768a55ced92dbc0b5d59ff9013db7d8b6828d9c631f47e1fea91d383b7c00a64a3a3e553e7953288cfdaa78affed5e7acd78f48878b507b02e85479c9fc529879e9c8c252a0e559543d78f0cde0e3b797d87fdfdbf960a8ec3bd49adf6ea370a10ee8caba7f8edaa44d36430163f1be74bb06a6e6b689aac34ec48c3dad3f95d21d5a453ea55d472331d56e2272765747a06909d8cba8d1543488cba40015af45608cd11dee21c22e76670693498ed7943732fc3bd4c3f5b78821f1d3481a1ecb73c878b190094b5b5094c54f68a017918768d9162c15e1e15e2623019e7773e6815bd6cfdc37560336619980829a61e950d34e87fcca3b5143ca26d55d6b9c896a28eaafd1d77320e18c46ea1933f681d32828486d2703903079633a61d2a828fadff6c617bcec466570da7d9d0a447e50d49beacb46a4488b65743fe8200cf6a0b44bc675ef6c6acb7c96fbaffb7b8ab0ffb6bee5d3d5bf94b6aaee4346307bc65be6e96de1fc84c52e8ccf2b81f65785f097f9bb9\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 11ad49205eb560672ca173d10d16e9f196ae3ae43350069549b74ff6c8c4aa71b31e017ba2abb0d8b6e8154652fe186a83fc34844beff934852a9c278286bf60166b6f99a30081a344e11c655a0fb51e1fc7a3ad700676ebaeb0557a2c8140686d5a803bc8e5ccc80f688bd0550bee603ea5f59705cf3add97712642f0b65e517a183b4637da5c7ac78665cc5ec07515fc4cd84c885ca673c35f33b01b9727342ddf269f4be73686b05d8fdbf83a149232f5c7e674d4079b8021dc314afcf3c5561915e03fef780f51eb5acb78ae14e84c82a1efe444330ac4638e3f9918ddc97b89ccfff94538d0031807ea147e068e5df45e7fa3592fec60fbb15a88094d491bf94394e0201a865b40516e1669695bc32813a443aa868de58f60b60617230f871f9923c2aabb9106c39b88650f150ac935485a246f559437a9f687104785630a6b18d5544a1eadeb259228e0a047ef829d9fc5c9ce907a344a89c5afc51408f8f23438be6885ac746a334e797213fb6f854e58dfb58baabaf05a4f2070244a\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 135943bd12689bfe04cc1c0a8860d7c18f13b4bf0a82c334b44ada2c5e82fc32b0",
     "ae99c048c94e3508f59855c53e6b42bcc041c219fd6465d21582f4f99cba4b88ec1844ae5a89f3215caf458547f0d147c0fa1db67453465e593ad2bfbac8ea9238d672368d32ccb681663fd8b023115c4f41345551d5f2bfd387117830323a4d061fcbb6aa13f2dc0c5a317e6b7339f6cce5c543291154ed7b118fb8c55e8942d0ee9acba4ec3c9106278c982a8cda67a2f3cf74eef8a37fef7a256e27ab43f5b6f6a5645544bc7d766e4aeb439d255d144330fea4c10438d2b801b477da861f6f13eeaf61bf5ad0b79669dd1c795e03bb826627fc3797846005aa975553343c91deac0c777ba9e253da8f3b925abf5cbb0c317fc2ea6f8d750bdce9cf149ebf623314de480daab1139f882af161750d3b74ca437df8bd7c9570c23d0d896d4a70aa4e464d0a836c7bbc22306aae10058d1dfd81303dfe07b9231c651fe30e0ceb328570802e30dfb5910cbb0739c6f74c6088b2ff20088b7b91fdbbe96068\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5513c16ec53402c0546785ed2febd651c1370352c121289d2a1fc9d4db74f99041af22d59c407d60769174e5976159ad64e84a3dd841c04a16b6f740067b50385cd31956d917372187d04bc169ac0d55555dda949bd422d39ca03e40817a3388a4ae03668af3148dd08e6faf1eaa170d4d8d9d1fd607ebc4f72c3eac163024dd2f86afdcd6b448c7c5d09f2594e95ef97b5fe6a38a265c06c12dda0665393ecbf64770be7cba42563293626c305eb840b54387d40fb371047014a058ed0082be31f59259971a27dc4de18a403bc26c7b4279e390844bfc13215365375fdec2f3c3873b1ff8f87f60506c55b7ccf03f3b3ca2534a4f686145536f65bd1f11bf7eca54f327c6bc120192fe4975657f54b962f0da0444c6650984213ea2b531b0b8432525a416e2de1790efb83a224d29d5d8153279d45f990e36c839ab7ef3cebab0dbae382b096a87075b5fe000a4369bae1335b22edccced1085f7c1fdc7f71c6ec16afc96df26df65bcab54321d91d59f7024ca5d65e4791f8a1589f094b797\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 62b1fd9511766e69a94d61d38e4b02f1c6b39a3c28e8e390175cd61df62001b189a0e44e7726cd8de44b0518dadd7aa360ebbffcf293c5ff749230066a63cc5e393ac443e73a345d79e4b54637ab3d1625a3d1e7d3d0c5bbcedb65be1c85317035cea9f73b282554f355350513a7f8564d5c2ebf93723f943d579878c89b63d25be92293538bb9d80793505b20c958da5ffde894c71c392453c506649b3891be55d69c607b6e4179d5a91a332f84a44ed32767bb189fdb7145bc13f128a0790b333be81288d4b52493cefb118d770aa5622a4318f5d37ba40cbea11d2433bf51d10d6f0d48f856ac1a87376c6a008ad9507d64103cf2e12d4f903f9dc7bd08c1c6e56a5710c01040a30575e755b8dabbdd83abbf53c9c0e53f184680a5d95526252f9ec04b03ba99731ff15e07d8566366ec78d3eea0f723c6df1cc32e0f906cf33b1967077f61ed045058f040746e4d414584d0c231cde7c28a108e15ccbf5e89744e3ba1f7bd3ec92934101be8af0bc0705690043261e98692ef737ed78e5b\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 1b035a14cae3a8c4311b879f4ed000debbe72f9847fa91cffe371d2cc3e5e5853542eeec362006e7bb8fe2528d325071a8d8564ec9d60eea7655ff33bcb698d65cc30753084f773ddc3347e934942afcff23da35628dcb2751337afddf1fd900e2d83f528a96d4a5ebd4636aa7ce0f20b181176973c440b014d203b24b03a92531a79c7fc802cd10b7f633fc238e9ff3e184bbae1db31a8e70a69dbbebf925467e5684218e5651fdcb9ab2379b2cbb398363c410192c1ff0397e9e23eddd8e3cb473ed39dd9ad142a7806c2e753310efb1254edb928d781e70211d0483bcef6b7c43b52d04b96ed56de631343e29c99f4c115d11c0b74880c4d6a1235c55d0601b07b23530c9f619ce12289bc1b3efd4f0a5d1d2f7f46f9d58f0b93f659420cea287532e0f3b6c92d65084c5e188c998857989d5a2056bb973a7cec9f8a25b260963bcc2d4f74f8701aeb9ca92fe7551c006b21dbca74f481b8ca1640e251b98ffa768ef2ec7924cd708931b15752858d6f7dc0890fae266181b52ccedc87446\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 0d6c8e033994b6ecedf22c5f544f2e3b688db8b2235a00dfc8f1b2bfd1391faf649be65815533d6ee94098a4382072beddc2a2f439837dc6df0c9826ec49c3c529b71e9cad2ce717fa047cebf81e0788ea71f8005a0c7ad1a8d59c27efc334c826b40c3f4ec0354633e7e6d71654509460e7d5eef7a44f4894f07e652d9d7860c78ba7facd161b65e5b8c47fd3df85816ee5af4ed35c03f9bf08c2d95d56bce82954f17da0195e95558dfc49d7d545ba004afc59e8f17236cb6f0d8d7d288f8bfc41122ac5e803ef855b3d02d11dd214a7f1e90617435b2840583acdee0feb145a37a8b8c9f5feef750d9a950a605b59841370a47f59a3aeaad2753f6b1ef1c4327133fd59895b627b7da0dcf5f9bb7660cb9002692ab94711db9c15d3bc5fb4cb0e62b36beff03bda7746a0161b4199366d3e2a3a9c7a762b6bf15ec1fa27585aa22d428e7c7ae7dfe8b8010a7df9f07a060d9115d235287ace863596e1e01fbf3551d9995e5442de650953cd2951c561317d331df010d1c6fcace9f8b05145\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 7bbba09b554cdbeb72016995325649ab9c9d0a9bdecb5fc44ff0057bf619df2ca2bbd0c3b13dec3126a0545dc4936c043f200d7df11d87c390dfa1b0dd4e20c19877f283f62d6e20e0ff2f0d561589a683034bffb5fb2be9ce2be2a3f9f86667b53cb0901cdf40c23ee67746a49ba1ac576b2075bf1ff7f48941dd8bb9604d5369c9077d766776f265baa4db5dc3fe7a2643fc644a01f14c40a7a96d95713927b7cae6fd55faa5c802added32c5ff6f7026adef607a2f2abf59f2f0a8edd35547db4ace0b8d81961480412b02b5d51f1e7f0420086fb506b7d617605414a59db8d7f1374398efe6d38dfa39a0568a53fb58e1b71ced8e3c126db99b02c0a7b3e27a4d1493f2c077f51f5b9ae73bc89399b18c270e6e5766b69577283e084ce3b2522a77a994fe0e4a192eb997cb5b4bbd7592d24ec4fb1977809440c7e0dea07c384169e9cccb23c1fdca7773afee4ed804f63aa556492b7a4063a0699ddffe2b583230b826a320e1e26677adfc11d185a1992d38e4946631053330a542fe594\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 7e13964d767f2f286807be50118481f2651e9da08d93d850bba4297890e79673480d7dc10f5435b5e0e318adc9af3dd5d99e0339f9bbfe21891f2bee35b9462b442ddd764fc278f77e7c17d017779888fd552537f8d7a9bee63dbddc10903c665e975cbb01cc1ddd0349afa100f325e3dad303b707f22ad2c120083e4e304eb1d12abdcee41f6d1cb276f58eb09cba643444697e43a899c5bd3b1d10ac939e618db4bc12ce6d822a29c205ad748d3f632b147a7232f799c14678ebaa0124a9ec16168e32df41d21fc31a2d87c3b6008b2cd90f51230e1dec00311faff09c2fc07acd78b57e39271a8912a0c5b76e3cdfd5915c6362f1559c28c95479750b72c4f0b79ef5f9a25d9022051eb1d9de1ac764fe683958ca8a6980098939b473d2ba58a4041ba3db8b5a6cd19b4a2212744e1e2179d6c94ddcfb770d55abe3e5d7a81032809767dda95683f1ea60054d19b61779f17346b7642a92b57da96c5d5421bd77b49c0cc75e6294354e307453718335f5c1d87f5179c9fc74f0b10de00f9e\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 31140fb3b755d517fa660fdc5b940ba6c8fcb667ea633605c730fa47a3b52c0641829f275d2f8d9b8ccfa16e546146561d53a4d16a88bfc7ebf5fc3f81882e9e563346e19944727ccdf53b2f71c30a108ef2a43dba5be533fb0f05ba0ff302cf18e77d2df46d903476a9f7fabfb0a4e8a23e040359326612fdd9411910899900c3987a4b59d2e8ada6d6db45ef7f420b8e8faac28c6b9b55806dcf44f0b2137084035be8475ac6e5c6bbac67069530a36892e1d6bff9c594dad9b7e9bb604200c9320abffedc8ed3a568acb8e83411e6d28e0561848776c18f8822a150c68aa8279b90422f39432b44a9f843a843d4b970ca608b15f54c42057e17b406f939db847113fc6949090b203b35bfe53e3f414837dc0e2dcd58d5f7b829adfbbc60e41a8c9ed4a9fd15f31a7795c4fb93d88f640b20842281e966098060eef25b2ea3df4d8da8b8dbd9454022bed7f33539761303b46bf810b33253ef1a5887a9e4175cff852772101b27d1bc266e8b2924fb37917aaba4a1ffcc9fc444ccad469260\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 7b4bbdd6a446be7d5ff306171d91aad0f94e7996c01b12f2e402ef415b06ea2483a39fc4db755f3e7667f474bfa282dfb8af30c26a561f499b506a9ac15500d8b994e6ec5dd7c0b6963dea7f0bf1e5df5ede5740e41b8f71ba6ff56fea051e44b441df0264d730514e3cb74e8e0ac5d4e0be7e3621be53a41a12c12d0966ce64c524c16f4e1dd04dff3077b50ef54f2f4bb1da42fe79aa81d1604ef346e24321a7d9355c7e3e64d83aedfdcc02038ee483d6c46fc9a2290a8d75c87ac56e04da09e661df1f6adbb1ddc19087a3d7a96896cb803068c496ed93ab184d8377cb277032d627cb5f89aefc574d799445232292382d70e13234e4342825ce75dc08501878f4d3d219442cec45c5c6bcda2a70047d671aac7593c746850d8491a4fc9f17ff16fda341ed97ce8fc9d3d8cfd889dd752eef198914c4dbb78646674a5c88da0f6dbc3083dd5453a520a68ef79a97b580b87ddc7b7761277108eebab138b7eb73fb6d73e8827f0d7b7f4411136cae3ee2f172adad6b5f3fe3acb478cf7ec2\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 56edf756f30417735f334309157c56b1918947f55978e684fc98f2b1a528e45f162ea4dc2463bc3dea7e31e0ae19a8114689ac76464efb2ff7e3a2258ed9dc074d5bfc47d6d0f95b71efbe8dbdfbb0cf6a9f3f96978597b6e2ed5c5cfd365ab5607419c529dd315302a753939c920351e2d1501f63ac2b8e1e3064eb7571cc4fd2d6af08c6a6e54eac092f80304ace2d717d9cc75efcdb714d7c86460f73f962ff221a76a9345aa92a17afb7faf5ee30a9351259a304f8430dc6c063de9547774f1df890756e4a797bbd1faae7f2145940ad316dfdeee42bdc5ffea9bcb19dd329b4f84c48318d63476f09f8de7b88db07634289ed42c546b2998b583e19912092b1895a086a",
@@ -4253,9 +4352,9 @@
     "96b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1768\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d176a\n\n# tcId = 235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 627e76d9ab46ec144d942afcb5fe8f677eb9b1a51c047f7b8974f1a6697c5f4ed1c616ce304bef814ce307d4d6a8ad96a704e71c2bbe7fea47db502e59ec985a69405d9a606ca5ee7bc1e131783452cbd7afebebc6cc4ecdaf119ff16986f561ee4405a0bba05707da66de70f25c1b6e7bdde656eafb70d3ecbe2ff3bee66e3f0663a55feed8c501827a34f5916d0dff22fd7baccb87db47a472a21625c1af097264b5964d05368a19004ac9c5e11bd3129327f476b66abbe5b59e7df1cdad9660c52bd13c86b5a721de476f6662cbcc64db4c6e93c8ad7561326947192501050d4cf6e62adc42e5f3c0c605e3a1b1a1cb8486dbbb6fb070426013e9e1a5a2d1d8b0481ffcc9235a99d154e1991e8f15cd453e609be6bd008187b1f3066fb8d5348f08b2784f8fff31306dbfca2c59e1f48d40d70f7db16b89cc8506cf0137e2a617e27d529450f25ad8a7c502d197cf146e85fcbdf6e57e4703408754817a06fc8a60008560890d1e72a6751a43903c0f00a47ad383a28ec7bb469b178d5ecc\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 4b417241f14720559c1e8cfcadb9e0d6b7de849b16c80dfdbc867fc33e4b81d56915190fcaaecbb8f6481c177cc68e26813d8a93ff45ccc41b795714c7d486ff3b929800f88063cdac7b7100d917c2288094cecbe5d6f2ee20edf36dc646464958cb1cfcdabed57f329561ec6a8a00ea2011d2f9215f65ff6afa8ac692aba8328a04c9f9fc59c8d8f22e309d403fe04acf5a31de007a5f0f402efdb2c83c0c5aa57379163b14429146f9521ace54189c5445f80076b2d43214035c2b0e175ae0c463253796ec66477e1571bb6ac57722105b58fb507922974ed770eb898bd584d00a2267d8bcfc66055e7cd7eb7e7497149076e1d287b31671298076f1aa6d3f1ae1e3fd62eb8714f9fc38bc6413b2a15064da7b6b589ca5ca539d0d01a58f999935f1a8e6a0d89d440a510ba9cb71a87be0cb81cb1e05b73f8402d684c768ad86c98cd3bc904a59ec88c385835fb46b4ab46e3e026eae14e54a00f0e55b5cc26920682f9713d48c7946e1b0ab22a6fd6cd3e833666cdda12e31c05240a94c80\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 338c3b8b3ca15e0fd12433c5b18347d79d344871aeca17dc93389f3c5fc123ac9f9fe95c97dca7583e3fe3c2a319d0cb409367aa7573c7ad75b118ede506631f52aa861c2b0e31a9d8c435416e8e67059dfb4ceff533c214c4243f5451f449ba7b75667acdbeae22afe959287fd9f0ad3e4e7709de5c90a6e23996a7ad643ef0c3aae54934c31d79619c04b4cb85fa5069fc9b90231debe3e59da0ffa2873dcf9e53b8481e215b585b1115c02f63bfa6143e2b900a0ac71773a0439bb5d86a78b4ddaa5e2b9e44f7192d9451a6bb8e4635948212b17173b0695d4f518189714dc0b51",
     "ace3b9068f5fedda3b4ba4e24baf901b313366f64cd54fc2fa3db8bb8f1e81e06effd580fc4974a3cdae688297b4ac423d81dbd342b3067e6b4d7558ac8f4fd1c1d8f5fc94854adfb0ef8a69ec43b375ea724932b391ca5c04e7e75fdb952d671c315a7f86a28ba954db126cda3a39ef213b5f9531a8a159dd9e5698ac7ec8fe7df2a2316798742b2fb5271fabad932542bc98af6e99d231a1b5fbb09eb\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 7bf4d4739c1ce0e13aabe610a110ffe79dc689db3f9fdcbe29b56212f7ec0b3cdb96ea7052a277327107a992d40c5c5d03ee11476f328a83d2c3a1bcad5c9d9ea2928fda571850a2a9988a0078429631f6097b2fa9a85aaa1ed9ac0934a5b9d00fe6fc106342e2b03d4123e09e2ac61c1343f88047daff5f511c8fa3d66f76406b79b8f4f0475ab14313968e56ca9d2e8672d3bec27a5d536cef54220cf44a4a698fb7cbb8035eb5516ae4b44aec19da40fc788f2546d5da54b7e1110d13d3e3ae97671cdba93a6f5946b2cee22c4318b7343a0c6b0a32000c6ecd08c6913901b79dc2bf38707fdf14261581b656af1fc4e1d5d6234f9a5578869cc8b920d7020fffeb95977bc3d154b1127f454bae63f7b1ca377c3ef42b0ceb75c96b3f54ab8a5831d59ee8ebf4457f540550a6113584ca4782a53d7b62bd5c5decf44e005d2c46cf3e0691963730708ccd6bdfb29e7c099f1e91494a14a938b3f5fb08ac40bf93a10cbcef007fb6a99b432472ce3bc883714eecc76e002bace4b0394041e7\n\n",
 };
-static const size_t kLen171 = 209306;
+static const size_t kLen187 = 209306;
 
-static const char *kData171[] = {
+static const char *kData187[] = {
     "# Imported from Wycheproof's rsa_signature_3072_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001]\n[keyDer = 308201a2300d06092a864886f70d01010105000382018f003082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001]\n[keysize = 3072]\n[n = 00fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245]\n[sha = SHA-512]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = ebf3c64e4c19fcb0fd920e65554a552cc1e652312c2e0e51cdb3b92c94b2b41ee201f61f434a6aa4703e87416388f4661c04fdc2e459e199af3ea208c61b99d746f4b00d82105caf4f0196f1305e806bc13b4c6e6bf581962862dcb0eb15a0ffcb0fe6b36502320011b540799e1432baf2a56a428fad64811afb57d210d859a1201ec057dd8d2a68784b48dd07357162f21e4c82f8d5e385b1f72834dd4c0d85ffd333410f08ff28fdb7365e408a60af177c80298726940bf4c40efcddceee3945b1d921b9d04080dfb12d3ae61863ad2e3e302370f5a8858a1213dfcd500269ebef76f4ebf0982a751d8ade1aeed95f41d4560084711362774b11b6240c0ba6ee4ca634ba8298f6e63ef560a39047481b9eaa546178e69e4daf5651c66c6235ba97c231241c63ad16efe59b7b5505d9c3f1818368b9462cda71849e431648be9757620c15f99ca78f4e250afc41ffdcdc52693a1fd43506274c431caf34a4d37321f5ccf04971a25c5010b9ada07596bf9a20bf307db9d5e86146226081b25f\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = b9bb1751f2336ef5126508541b949d40f1719bd23c2f0fed64a7b73ebe1819377e6e4262f8440a3a3cd456f5eec0b1c0956bf6989add2c3d1c7ba4acf7a617d198179dd974051fa7a14ecd8093ad572d7e233daa2a9a46fe59bcf7e01c6ad8d68c0afa89a58247ce257566edcedd799173e2babadac15405e2812ad12ad900ad997035966a05a02988e11133c21e111a8e06d7ce509de1e0c11de55379482cfa072348fb41c05083529c2db86aebee92095e7450a75d97fce7b3103ef1f8598459651dcb9b6e90f299c9efc95d7ced2f6e91526ab3788238e2b5e109d3ea984189ea13939d58fd4ab896c76bca4f6a92fd3bc124dddfabef1f286583a1415d1fdb8c80de8e7583fd6d52836a22c3926f69723301904532b9fac2a37d0cedccd4b3d0ddf3550377191f813d4f92a5c126ae91e03fbffbcf59637ebbf1f30acba1dfcb0f93285381cec6da60bbcc62074075c71300f8424e0f964422dfac19d205251f227614bc13568f408284b6b53bebd7dc4adfb7e242953564763292d9c01a\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 1cc02717a3321a83da62deb3ed0b9706cf7ca9fdf3674617fcdc3364a697825b910d54b891b5f8eba197049047cf0048ffba6425d47374ec24a84f1f7f04716b7ec54daccd04aff858e2e7c8830e4420b5f99df756018083abe46d3fbce2da6e8ce6c893fc11ce5967a5f367159f9ad38d957078dbfbd32e818a26b49ae00151350044d22b58a4a61a35fadef67e3f8247f407f026eb17b8dd4ab29d388bfb271a1ec606e141cef3fe57e2e55ae8b40fb076a06f5898362b695545124e9c185c50647cc5b83f09f406e780f626ec60462fb50caf8560aa72fbe174111142029b19f2d681f771a774afedfe2500fd8b1bdd437fc41709253ffdedc302f47afa774f5ad23777a57fe44067182f4b35a28923edc82255cce11d2fbe91acbce29289b4e0e8f5e99e906e6607637b05eab4028d85e91d060fc1fee052a09baeea759917b34855e09b8e5b67ad60f45851e991cf01dd528b100327961eefd0c29f1d1d8771bbf3bb1e7f048d9c2e1dc5e652e6ac4f6a2aef86245b83f611700bedd07a\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = a0de9c2df76523499c6c344173d944b8e02ee1520f90759fa3c27ce284091f80215a9a26c9fcebc125171da556bb732a0645cd64b05c7cbcd8c187d3995e3c86cd59468118e9278ecdb8e791badca8785e56f33478ba03eca721591930db01bc1a5da5e193b2dc9022e98948644a406138a4c7971ad8ade585a3d72e6c9de50320b9fca1ac0e054835005cd39c96400c491e1b706eca22ae2e9f1b844284226fdcdab1f2cc942a8280f7786e0f2cd069b9ae99f04aae424a6d24eb023e064513931b2e4f7629151af6bf83f4c5c58616960f080c6f96eeab07a87b6d7cef3fe6b071e49ed340b48867a5bea30dee332cb89e1a54d9e3a9a8bbb87179c6ad206fd48dab07104b1f887a02160b59f9ddac6d1f8801c1a8df507ec199e970e02058c749475b7636ba2def322160b11b21773fdf904cc665eb5eda887ecb6d9be245d3dbd85cde107d082cc6d8492a087166e23835a379ac69f5a996ad9032cc41e205078c5ec9c50f85c396822c057b25595a35471a2fc3bdd3f75eb8ecf2d1189d\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = ddad8eeace34f1eb1b0dd28db89ba710ee68aabb54b0a826c2d69355f63acf0f2f2e0dcb96f388d44d0940774d7d55fe81ba6a8a880aeee8ce842101c7e8837fbf2704971341d38bf3289dfc61a6b3b557588db93eef2789d3735000c8e2d830a32070626d079e710c943082a8bd1c0cfb64b2dd911eea76001f8e08cdc01cb072f027fbd9c72331b857d07c1c2f3090eca53accef8b3b015438942e8d2fd3406cbc54c7ec3797a163b13878881f7b4ef5ca45056e16e0c2a76c3d5108c6f0f48803d27eb4b0d55e90b19b6fe372dceaa61270b9efe2800bb259dbead955635ca44ff979bb054b5cdf86d4914ee553d7d5b1a49fb8e49f3f761224802858458f702aa4428964a32a45bed5738224517489f2be075f9ec7234a019005be922b8265bd78abdeb1d1633fe7e5aeb37b61d36b1a03a06847a812e50ed551853d3cdebffaba8b056b788a1bc452ebdb5a3f043a116e5a3d262c745fc15897ad4ad955595292a79eb85373d552d6079ad77e469f7d3a60330702125127b1ee770225cd\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 2ecc537edc397ae5c3c789638204ba3393bff5cd9c1f0552db515a8258a311b6bdc88325f9072d2ae67bcf132a92c0b4d01ef0f2916349adc6d8f1b415c86bce6b5afcf4cf2d3137897d0f8a33063a0ff69965a5d2ef00dc3e010094ec8214c95c064313c8e90bd84e34c86b2e19b056539bdb3c83eec23722b3e380a53826bbb31cc97ebb8ca77cfd96d3e6a2da59baaace3883c652a92e79653941c5615bd30c77aa38ad74c49d36ceb9f76544835d57f0cd14999c2c0cf3debbee17a8aba6d777ebd9ffd44b09e093f1a894a8aee80301c3a5a59626a79e445254cb1df1174450bee22a7518afeeb15495d663af289dbb09216543bccd136abf2646bac573551cfd04e6a35b5cdf9729c8b14d34c06660a42b3ab365a42ffe470b69062d0f305c733c43844565b0b94d49d2019933de9686088d219d57b256170c137a21475d03f2a7e0783af11426fc6e64895fb92da117702e4487558e8bd21db82f263c4bdc64065c4f66d87c87889ec5aa9cee02c95d001b08636dc3420f817c228dc7\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = b9b492d4796fa2cb7066069a00e36aab8b8755f9dc8294401137efb3e2681c9b57930c0ba87b45c9d70e214979cca91a06562f710a2427660547006ead7b3e619cf4652131fd84999c5ff1c9a1cf057363b8ac62501bbfb1fae840cc963a95169c658add96c6c969d415c10bec5e2457a5c3fa4fe81e7de1afdec6f4e59e3fea185c7cd1bee4b8a42d2f22c7bad7d4933621a0cfacf0136abffc3ac54ea37c63af719425084cade944999aca3f43c7625d22af10149f39acef32ed7c92f781809aaa945b2f446a03e66150a524c7d88b7bec587ba7d6fe2db4ebb7a8c3bd46e7fa1cae291ff502acf33f003",
     "dfd1417fc60674501728e52490476d813f0079f56a9456909ccee3b76b30aca26fd4487527f4ee6283bdb2e72393d661ec0c35b2d1675f679f823fd28e044fed090721ba4c6be46da3eab26e5eb356d17d04fc3ac31425a6f6a50474e2725bd4dc30da74fd3767a122ced21671e47b1fb33bb7018349f7cbc916c6c7f4ca7334735a0e0ec18e01735107bd2ff02cd9508fa5832dd\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 7d550b35998d60a62393379e47dc02b1a4530bf60c892c4e559acf9b9a61208dd9ec054c865018aa2fcd11a88493b54935039d0fdf5371436da96ccc342bc1440afdc46eb7bfb6595303b013037537e695787324cf9593dc156881bd0dffe8d2d22d4e90c1bcc801c9bcf12cba9efb7979a293dc2ed17ef787515e2bac8011286c939c418234df353ff9a5e0617615acfd7bccf9aa31c6681950947df67690e36369c3c3bf6c466e9748da0582acc76bf15760e8ceead43b5c2e98d87eb502d5a823ca69702b6936cbe36295b5714fed51b35fad66c819cf1191b3708f398fbe8274f1ce219e8cc77690f30bb7643f9ea472811e6216253c58fbba5d19ab738d6fecad309999a4d814c19620c4ae998a5f0061fa616ec0ab96e3760dc5d3450ec376a1a0292899212828768bbec07a0e1ffdaf4d6e5fd1ef5a2e0567341b2fc0a4944fe8bca36369fdc0177885d5169747103418e2af807c4715d94c2bef45f5eefabe8980f90a11acc01ffe0453e1fed8a7986b07d8f6daae2fdf0cd266c587\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a31ac04a54a8b6ff7e56a0fd57b356d1f854de8e0f9001cb216b859819279bd80d8584bf603999215ba8debd1e9e93fba985427be8e2169924a3954a43b58521e0c79e7a858a77081439beda623bb7b96ea46176fdd040682da77916fbeb77290e7c93b2e8a1d3722587a70ba56b8de3b2e9599bea708568ed88d2f09d7b9d0ebf9be2345b81d9b343c7392701d35d1f3400f343763af8d9233e40228aaff22ace45920af56956e07cd010af64e01e1f8f63a9dcc3b7b205de730199fad3e3b2f139c556748d704876af986b98785fa5686d5d2410cdd95f1c80a8ab8e24c23f06d5c40ea5f2be6f980db62b6d9b22cf7aed0ec00125e1900e50db95269148f6165f563b8ccc0d35c9867412c21f627ed436769842662c856392d3d0daef99bc47ba8f2738b4ea9d068b20c249d43dc01a067aaa8c249d43e110ce40de060c7c68866639bdd3c6d7b7b635b7ba71b44b71e7f68651b203ee07b914d65a2165791cf2f6d5dcbeddef7bdd7f786f812d9c5515f846eed933248b4f40a00b7735fb\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 693fb14d0d6089db3aae22e292e43627af0cbd67234983ddc1b077b4baaadc45bcf0ea0f36ffdaf970f99ec5ed8ae8a58b7e94db9028963e14c2f624bed16bf24bbc5aafd472915d643e690f6e981287ee7856fd0f14ace63a790676457ac09692bafca0014b2866c870227a976fff547812641a70993da32acb962a3ea050845dc533390175900c668a5f36ffd495ab7917b768c68407f4cfe1d20bedfaca38f9f609e74d9e432829da2487f957069dcc290da513d8a453cca27c8253bebba2653f82f676e663db0248af2a310b254b00219c5969f05d04fbdb9ea0cfbd746050ab25cd10de42a02a0ddf223d40e233c6a6597992576f2d105b72cfd77b2f319fe3525da8a8f084c305b14e090e3bea5c5eedac3360d366c47fe9cd60c6bdeba472d408a79031343bce42bb1ef5d6f4e0e63cb7ad0cd22e4270392ce711d7c8efbf0feb888c74793f2dd903e3ce894ec758d69644f654c5a75378b0e5c63a5f9ae05e0f4818e2aea7286416aff545c1048eb4d359ce1bcd0b26a28f55695b56\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 0783d81e403f352d1140b99d6cbdf63f413a55ef9a64fe1fe019adfe807b5fa59a18e63d455e0f8fd61edbeccd392a01e09dedfe28600d1c7507b1d81bc814d1e835a95219cefaf7525fc0d03bf211bc99397bc8fcce685445263a3db61184a8e44edfe7ee48e2a7a5e3c8c7f28158a308db3fc35d822ef6cc00e8df43ab1b0a7ec2c92e3fb7fccf8f8b35e68ff6d31657aafd756782996785bee97d3ca5c37d22b44f8a1a44ed6afe5b80b9659336f3a39870b5de2385630f3fe7ce3c91bb269ecef7b3fa999a79518aa3a06fb626a5a1e48db98199c1c4d7a139497ed8e9682cdcf343dd03b4a5a056edda9e7101d2da5ed8d5b953e765bd6585cab5a27030a8c909ef69e61c0ffe9cefd2ffbc6f7cb26f64de674ec5f4395f7627adc72203fd6362c17bb1f262c430e502a258edf86076336499fa89efe7e1298c7c932b0893088430a30d7309282cc4a58c5ff05fa3f1dd664b00139c309831b8084e9f3065816844fc3074d7e8bbaa638dfc2fc0aaa74380a1282e65c7934be1cb7cdffe\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 162e2eb2457e28016b961ece8cd8aa9d4d2f4b06a9ab069cb79238f5870075de2a9755fadc5c78c28c82441c474718ee905a8d7700ff2601d7c56d7eb5a9d7019e92db6897c823925cfa75b5608c7a79e24af37abc09c89008be7b2ceb70170c6d1404a892d0804cf9abde53f9aedd13815459c3c6a1b37f7dbfee6e4b9e25143d9c64a6a817550337d0c74bb5cb6c7b5db2bbb770c67037729341cf25aa880b14d39d71e66cba9b62e1ff89c348eaf4efc79c0de4734171406295e346e9ce7562be7a5462834f1a00da1d4d54d7fd7fb12430b4096610fc96ff1bdfb88609d6a961338bae78991b05f2c80d2a131de5eb3477946d0d6f5f500a0fd93d57e0be3518b60e5688d8ba5b25c2343e894326129173b86dc315fa183a0d96845464f24cc020dfbc341f4623d6732ef699b3af9274fb504422bdbcb491c8cfc63f6cf6adbafd4f2bb671b92b6f4316ea456d9d87b8f3b2228e37b0f34f2d1ff70cfb0ed16d14ad3ab5e89985d4e30e51e4eafe69c0cf6ee5cd1ddae25b5585622a8b45\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = b17c7e6b49469e75e489f9647112354316bf3ce3a58aa9ae41544f73c8e1e56c284667381eda58b3466d3ef16962a2619d718f93edab9aa12e5be05f73cbfd4d8e546bc936ff9043d5c048f93794d68c9f8d99805f85665797a27b84a3e97883e74ea14c180aa2e5c0785af69275d484e14dffb50a4ccee742e809a03da229e70ce529d0166439cad74ec6457016b92df8e53f8ed68cc71229a1e1732b15175aff54ee34de4e908e9b6f9e720417d1a619ba9c1ed70a55e4f5d9bd940532b2f58700f404cee86c8ad9c72ad7731b8c2a063efbdb96c7b35d641d5027d55e8cf6c317613373dc303cf84a469b54df3c2ecf5cc8d1bb3882dda48e41b9e5a3dae95ded93f230959c547ef59131fed18c269a0d5c2be16891071299cf1bf77573fde1535836cec1daaf7cbcc50c563d08a79725d66d3720ecbbe1db7edf85ed3c4a9160350fe94326e3f0440619df346e33aab6333c1e38b9f34139a26778d0b0e64b8c4746e5879fc56eaa4c4641171f79f4f3fa711b9b0548cffdbc39929b4ae3\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 38f8952c63cb832a35b8808ca9255ab12fb5c27573f29d585cc30b94b050fc9e179f87821a2cf8d23f10d3ed6f2a8f461bd098eb5f6ab98923647f87594e2cec18a776af433cdf2b77dce0cd853651b50700c9812d2fec7a9760388f4c26da6bee3b768574644c4069775ce21e81446a9e7aa2c97865f4b953daf7acfaac13e75e079800bc5ffc94090ed6842960e03e95753be39e94dafbeea1745fa7a4fefe777ff5d278a8444c07e3c8526e80960f6e2146900ea86720fe35c881a61e3f23a32a6bbfbddf049084d9a6d1b32b9c2492161d1aec9479a8891c7b651d13e34e784e5a8d3cb2f5412d322689591a98b41ef9b010190e732a5ed0d28b695f6ab06870ebd23fee44845cc64d4ba39017047c7eadbc16a1e35788a9d2c2ff02b48badb7bc4605225b7b631913b19683b6f90e634582ed64c25bb6157f28102c4560945b6baa91dcc551b4a6bf2b5cd2adb8a0aa87e29c502b5b70bc4cce2e197479f9923c3ca35e5437c849d5264dc18cdd3f6bc7b88fd9182bed11f0cba3cc68b5\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = b24733b208d83a92b4a7c6d64209fa2ac1dbf615954eb99704ba9b6eed2a545aad13253234d88e0afa81277321a8662a1c9c59a7ff932c6b2889e44ee47e25e730427665a98f02b8897b24ee3036febef294a8ba02ce60b9fcd6aeb592f32daa1a79afe2a48f5097971f3a72ed3680433d93da0e3f19aa7d37082880b0c3745b86be89d184162287bb6354158ced89bbef14faac68649d995a4ba8576266bf5464106a82cafc07e4ae4dfb4ff3f6f0e8c713d3fb73673e75deb3fd04098c7c939f91594e45323432f30029122afd4e812475f69ec05248d6e2deec18e7dd02c7e9cf89cfdfca8b3412410b1e271023725272ef0d9fc72f35a94a484bdb0c1167c282dfda53a86b72922506d51adfab81df9dd257787aa5fb6033bd7fe61a577a7abe5b48174a3b2f7bf276ad6a6735593440867739851c91bb30fb2f6d279f35aced179d231dd9c5267cffd6b184bcd710a365b29957eb98aa81f10db84deb3448e2bd8ab50dcab06fdb3a2b1290eac0e60dbc4114243540585ec78473fe9297\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a336c6c475b3ddb4f9e58bda547d867c25b155b19d14746f8fe9b22cafabc05aca001d019352e8e96cb0afbadb7bf16998e5052b834a0045e861f646fcfc07347079822e64dfd5e72c2f996f0d5ae5d31596b93c77fee310b046d9c461ae9637ca21020e48c6745feb9b7a8f7e98e47be68214405b55d81d190d0bcdce483b2915544108bc8daaac9563483399a69c19c644d4cc36be4333fa9e9221f17b0ebd2885e57e84d31bd615e438aaa7a1742f0d6f3779c55ea3dedce1940e819cc140cf887edde8506b4c919edf3fb6505293921889c3d6704ca6aef24e620d87d6073c0e9f8a8c43f98fbba9e84fc9c445bff081acf6f6559dc0a49c9acd49c1adeb11ac31e38fe8319389541144dabfff498addb55d974082988503adc422d78f3e6c1764baf174c451eccb13e0e2f9791512e9a949478109176671f56cb3b8b841fb55207bdb7dfee0b7d76ae95a76de6f6ba4e953ad0431bbd23311ef17da7f4272a7ec4a34c08501d01965c4ab325420f6464dfdf471fba6f59ee78bedc28524\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 84d3cf49f14eb7e6d625614743859b9c1ef5a79c23d3c16e25c492c85df8c3d8f5",
     "ed0a6e548c042a71135bfac1d209cf434700e8a6247f8d9bd3f1527ae63a5b797880edd6b3112928b9878a890cb1d0aec6e84cd5da2d3191d590a57a82577c8db2cc51e8eff17c64a6f445ba202c9f13af6b20d5974c88f88bcac534ee80eae451d72bac360511ed77d9a09952937129790dbaebcc92014bde155de59c13ce95784ccec3b4e9ff0a08281fd30f5180f62667f3a2575e67550281c2f3ee42af8b9cd94721713cc95841311f81cfd5d50883d063425b8a307f8bab6bc19441eb5eb256b6cee8126586707eec75465bf8fed4bf010f00633f2d2a216af178f3439fe0857921a92a642b83c7edf45b8b7f0e280cb362fef1e6b77144465aa06968971861a03c8f6e6b0cc77f713a1417ee76934d441784fe9df0e65aa5f439a0cf9889c9366a213fa2f9302d8a70b4d9cf7707687cd2214d720eddf7a61eb0edbe679df5fdef79f2a8df50e90f26be5e156ccad330a3f81b998df0b610383fce24\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = f3d8e162aa3662eb0648048acd70eada84b12a7d15476e58e47f7720bca89a0f467f7bc2c6cfb17273d0ee66c82c2e82c7cb184d073af6a601cfa7c8df3c7eff348fd32973f8b3502d5257639016ebb24cb6011deb8ed816ffc44f262f03799b122a0c3bd7d69df064a34b166d7f138982fcb4bc2332384207117986d92bae3a5afafb0836a892a6c9403cf7054bf02a82851b35768ea77498b4d12a6e85018aa59623644e18fd9ebb4cf3490e8577994836a84ce6bca85ed3fce977e0fdac1eedc81e4aef60b9de47900b9dfd1b67a0c89b0be88ae67a5307576ff84a7f99f3f030e2133a51bf7af75142f59330e2492973373e64f34a05ba7f2262ebb91f144a89cd82906358e5a8bfdb5e7da91c2ca95d0e45cd2bca9912b27af36f45d4cc5535b0aa95e75d330cb01bcb01e23438d0bcc4207a2a7fbed4d762d6a81822993bdb42baab84a3b9cdec3dec31729c831cc28dec111605924ae0ce6d6c16ea9a605171a82cb11102bcab108229271e2167ba6ae715500038d1186204ae2fe685\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = bbb3dba33bbc56a859bfe0cab3ef7ee4fd1b9b8196f5bf02f55c3fa70ab8eca32d5e2d95e3166d5137b7136d21ee17fe5d790b37f51b030521fba37b0e1aaaf5bffd62db0421bc82798e58f6b94046519adbe859675acdc9efd050792a3ececaccc3dbd774a9cf426c5e58527021cbe8212c9158baf67a8d3ca0361364d0fd486f0402e8b5a94894b3af023ecc6b9c0ec8c9b717736dab8ae1da1c1913df84b6a5b7e6019e3e53efba2bead981e49316f671816b7222deeb8f3f4875cca353351d810f271d3c2a6663e34a8ee083d80a861338e22ff97e542878760ec0fcb8dbb390834409754b95f902210be72d7104abbe1a87979c0460dcccd2cfa5a13470855ead59d0d7554eb6b5a12611c5c1ec9db3ec7d3dd795acce3a2c4c71bd55c15986562689e808683442ddbc8ccb048eb2b154a66e6e19af41c233d6196155912bb1a020fabd6e803f04fab88fc677162b0d98c42500977c002774341c3fa455b6092d8848958c94de4641a43a269cc6903e512ceea3512351a05c52bcc2ac18\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 4ff317feb7f29b39f43c6dfe386347e057a97c5063007322c8ccea1761e5285a14a25cc84af041407130fde5e7e94d5196cefefc485d1c793432e62a8063557a0764305b40a7619b8e9aa9b395acd64a1c1321fed36e2187ade19b9a25e52373666cea888f5c699da92a59f2b2db76fa29b8e9d9b78e6fe42fe9d722c524a59a3ac8d7551ad5c5838c4ea92685ec6dbb23b6b69eb07e8a187ab78af4ea81c2d14977be336faf8169cc189eaac340c9578dc6d98148a14844c220ac1085a80c5e3e4c6f04a472cf1a4b893aad0f3370d56468ee1cef675b5fb77da481f128ce8aea30c67fdaad92f26db2df4c45000ef581e1a0f323ffb69e45981a6c1c8e45ffde22b4cfc0045fcb60e127820f4f1b2568797dc34ae29e916030ddc55d78629534f926a230c4144543d383aba05fd3fd1787bd70bb9fb8046d26c4d7034546452a682de60bac900337e5a27978e5b709475f4e01a1d57a00190b5e829d81e82f38450d3a21b5b6eb83ec0c491cd17cc91b6c0553d857a55fac7e8dbe378c95e5\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = c3d7c56f39e387328b551f8e33f1a8f6ebcd8375bf8a4ab92df72c732e73919778388f0a3aceec9f6753133626887c3a5793cfa2e8340466e8c0d602663cfc169643a46eccd913085dd1dd1efff1046dd441b1dd071a558c629573ba36631105ad76d89561f284c6321c9f35b1c4d5e588cc93be7c62b2db5b8c52526c8815c9dc5b755431de7abf8b2ae5750dea20823de561f92ec3630f80606a0638a18a7aa71d24a6e19f6ac3fa16eb77f769da4b27ca1b2bde187d10e297f6c8ae8c5aebd84e75948942bb64504ca0230a6801e58b23a7aeb2ae1458b5750a894cf6c5dbf3c60b86ee988bcef8e30f21afa7197e4103fa6f4f1a87680eec6173f480c94e11f8db980597e38c71f36e3c68215d810504ead6ff1b1291ffa5d178708ed3b0e5b9f5651fd1df9c18b21deaf20b1a8bc6de73de6e7337315bfd428156fac738542b38d03bcf1403ec210f67753e5b73db07d363ee85a595c205bf25827231df2bd576167e84c659e9276c7611a92fcc1e06af925543c4b11bac35df7ad14f34\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = b2b73525c8a556fac8a98c717231601636d1ef1f6d52265bdf3da2236b35d6e673277bfa2b2b1222d6a90b50a30877447573210c87fd85a48469185198af8bfef4393e0b46b416ac0cb7fff2be11860209c340e470bd59d84dfa598b3635a5bdefebeb35feb4251157ec940a0c0fc6fd5ab97493c3e9c663dc943bfee7854f2da6f9b91a9dfacfb88bd21c15a488bf2b08bd00e311de4bb2aff850de3dbd9be9e73b9ae4af9a2dd0a7a3cea94f1badd56ae6679f5cb87cd3eb7ee6ddf7ff426686e551d846eb8399124e23d6b87897bcbbc0242cfaf48f8e08e9d5957b30bbb4dc942bced416ef50388b25208c5f4824ca875c4ee75eb1a705c1b5b693dac65e447e06f41251b295e05d4c5137bb7c0f451a19adb61bcf1282ce729b3ad581596d99c5876db7cd4a614112bc9d5557187b824a266434276c3ba8bd30c7f1541844a262ae8d4c09419c6e21881a3f4b0a8c3d958abd7ac0a9d0e7f1770d229177ad8afba36e324d254d36119d13cf1a47c93f0bedfb7d1776acca7c9f14cd56e3\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 32506bd08dd88da1d3a3172ed17a6d1393f40413bbf2a7fa4f9393314b7d158a905c1e528d4f0b0c47417d20234f55e58fb9fd87344773b311fe4a77137a829d3a80dc77dac5170e32be53c212404d2802e1cdf982cf57261ae64d402790a7ed8efa42d9d807698884d23187c3f239beb3007b014e324e9f5f070cc225ede15115d07da064665f8dcf5a439cd6ab2aaa86cb4b7bd0f8d97c1c9a1eb3b416702b534ffdad74f447428c04073335bfc96b6f0528b0ba541ddc7aca70e37ba0b9acdb8acc1410bf82d5e6a8effc291f5701565d468c1578025f529be0cc7a2ae473eba843dd72ea8a6f9b3022c79d05e52964287ec9c2156745d4a14b304ad7d52da8a45a854becb8095917a4c7196afb2d73d35a7ef65748138a46c69253f0f67970daa38e0d435fd8f8763e9eca8d3be5ac96618629e30d285db481f23906e8a145f70fc8eaa71e451421501c579446c9545a1d7d033bd9ddf62e587b97ad7925b60a5a69ef383405126e4e0061b0349f9cf292641bb2050a86fbb505a68d321e\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = c0eb720b105f53c191b4e62f76d6e49a1c2319c89f4223f1849b0ce95872363e782531d8a1a5a45e4422ce872327a49651df41705ea48087d797e68c1fefe0b25cfc01b457361ac2f98f2b6d675c04a62aa32f18aef7c488205cd1d82c6bbd14708125d86fba57f2c54a667a31a32af54d8df6906c07595d2dd3147fe4ed42da82377c88f44b7d29c8c1daec6230fed36b4e57191d950ac98c78fcbc6e9405645b3c5fdd69111f9e3badb199888d0dfeb69ebef4a4a39465cf9fbc784c59c2fcee8e367387554148ee6318b8a23d3526266206de788c7ec4d93e60e537bc3a13a99add8087f5a33e6c8904050a9b9e2ed7efac91db3e4672a192b6d11f38ffa57f5420043da23c4c1fcaf46adf4f7ee4efaa5f72ab4560953a1e9435f93b00a8dd4b5865d714ce5d026a0ebe9dd56ba7d4b35f33fd764c04850c5dfa91fd6cad03d71d41845eda65f9c36c7117497e82988aa49f553a510e812ac475a0c510eb03e0d5d531edcee01c475b7cfe94a77bf45a22e06307a9f6c6953d0117e3892d\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = a90662e02c0b8f5452f56d7343ba207ac0a8141977c46b74923a68f9dc155abd0230dadf771262b1c02db06de7bf78dc40904834e01b7b8bd07d48cb1f0dc9adc5dd140234b7ea8eb51ae64b84ce799b3948a8c7e3601328c3ff520b712fbe037d4ca78353d8b518660a0c0f61d3141f7b6a010e2f7b644665a2038a63174156d67f00fcddff3315d76dba6daee07d8315e518a376b3d4f695576670546656e538d7eb8851497c6e8428dfa0a5a10e3e7834a23968021c7cf17d2610254d411d2a9996fc8052c38c322004fb359bec00b4a781e4dfb66eb842054fa7ada84797010f1dff65a0729554266086e4767dbe7c174b8540f5da25578a3865caea12915e4cacf0284495c208dcc5096f861997d45ed89e534207c79737bf420dd5c9d6a6e81a5064c72c3cfcdd25d8a3dcaf2a9968aa97f8189a37db4a228ac26894f3218c1466343ad41d6b292621e795289bbcb5e80740ff91283012a7f747e0220ab94a8ce96fb54c417e0ff6fb1795f078ef6039939c24b9dd32d31c4b68069537\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = d8436c155e096de5d22e627bff7f42869fb228581273e9eadc0c3f35be02077b3d37c8c6e4fb39300a1093af1fe0cb42440caa0564f7a78295bd1f8946a218051f7257323aeb227d80f3430576da12a54687c96dda4c2ef7e359d5fd17b7d77a2fffb09480d17a60c80f30c4e06724783706b210212ec11cdaaf91cb1a7648b3d197a4c2f4b79380f356a06f026358a5381a4c975eefab6e9546619cf4df87ec106066448644a415820af3136deb86d34b61337b4b0e3a53ec136ce8b26f949a6741bf067ad69da068af1291451b0b882544ba72b74248f6f7df5186ac7da1946c4faf1e1e0f08ccafa7bae6c9224d1ccb6a5fdb778ac4e55ae414be393de1da87424b59de23",
@@ -4283,9 +4382,9 @@
     "66de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5244\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5246\n\n# tcId = 235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 78caf448aa52e0fe470ef9082842a2f99079164744e63b4d3637e5ff0760088ff4f3f0e047475bfd023ad8b50f0f3d83d0fafbbb5db1e5edabbbd72253e2b696cb35705567079eadfb5ee3b442a7d13ffd92976c7bbc64e91d924c87e409e8dbe460e0808a5f31737c4a379b27b42c01e2b85fb703cb326e4b7a76d9446a17c406ecb2bffb48a501bc9e98646e94394edf7ac02a4c141c76bdef99cf52d4680e0c23296684ee7d0e935fbdfdac76299afb3f7a221fe45a07be79396631b8db97e358a0f4c4b29163d19f76c771d9fc7ebb68547e40f95f10f93ed199da7cc776f23c29b44a749bf6bcc8d4e3d50ac3aa6a9d13064caf8d81a526055faa2926324f46eb1ea5d1aca239f2d41523292bfeba89db64bb20e3681820f03b5b0f7c4ae5ebf7657c626debe58a8615b95a873c7bf306ad6e9ad18b6337f0f24d89384556eaf59c1eaab679c7299fcd80edb656cb3bbcee67e43e230f30f704f4a3e25aff07bb636865ab9fdfd830df834609d07719cff33ea0528497947ccf398b4a09\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = f2e40f94959e63e5cf5722139fc63dbac2712e0485718b153041e8c24af9ff96025b7da26810c78c4601fe6d3576ea33f3c041c911e8c7384ac86f062b0c77ddd03cf5cf91b35448326e04d65ab01102dff37c5a2158c5390febb0338c1c4ccdbd2510243f2f4ed3b762cc6f1430b7e0edf7da7b582bd963daf4d11416756309fba9ebca7eed8def4c538e081c966b11d1f2a3a7c52a9b134e92622397549e53a882f4e641071683633217cf7b0bbd4305559c40a3c5f3785c555705e6b67acbf7887d919c69b165b56e301367825e8394a54520a99c7742356ffb2fec914f968cf9c80af3beb72263f843aaeb5b32f476915ca6369984246ea453fa0d57c3dfffc76f8a072404b9aa5de9f8a5a60389f539d3de4c9e095f7fa97c1ba4253b7a3f0e61715774df20a73dd5acf30abccc2a05b3e418caf1b96baab1234a187c5c80ddd0ca0e35ae4f5afb7f9c56c7bbef028c79158d0d57c1dde1fd4c8e0252c372f684aa438a33669f4e18d087ac0fb36c780404ad22153d6de4f46f9081cecb\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 7acc8cc66f2c221df076ca4fa898f98c46bb0809a612920c0a7b9e2beee738e4403ffd34b35911ff20a9a23def8d0067b34177d1ebf02486dc699133e4fdd0a58b7bb29a971cda32617b4b234a10ffeb5e154adbcd83c478a00b9fa657b264dcc998d01abac58829c208120aa5f78beb0594ec507b9f7ac5657ca6596662b018cbb582277af76b9630b30e6fcffffb32ada6d256bba86077802db41f2424421b18bb906c18fc081ec6066dcbfc5805a729994d839601741e7ccb7a5b6564be1033824fdd5172aa4621c6cce3af870ab7ea9d538f5ec3f7f2adf54d1f56468be03689c",
     "715cfcbd8457f3b477490a55733d582ac7df3f087461112bd91c859d327f0cbbda4ba399fc7fcba66fc99f58e01fc6fdc7e77f6b10b7a624155b24fe2e1d9679400217ec9092ff6a037b1de3aabf66d3c997e46eb062fe64ab88433bcc3b471df2fe600e48b3056bdcd61be1ec01385402b33ae9ac55d8108b4b9ee1b15eae4f9f6471079d34daa33c24fabc5dafd18b86ce365003dad36c043bb56d5a7\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = dcd190da293f545fb08432ae90fd77e4974e5817ba8e7e858d95df30f90296bcd3e4ba1ba7a8e5b2fda5613b22cbf03681753eddb9dc975971ebf211c46196630501c5ef582a0cdbb58b8091ef5c4af1df4df49942d1077dfba75c73f4920231507b1b55ec73d1f1cb87accb52e46a0842199234f66b6489f050bd5b0a4da862801446242697802f23a221f352908e4a1d400f7f066f4560c8201c8854bc0ddaee5b45a1f1165dc8053e2527623c9321a412dab7c9e2f35db2b7f3a8f59f7bd4818e03598625be2033ddc81835308005f64d240d7253c1eea264426e49d4170acfbbd95abc48174d6c13959e3d8fea723eaf0623e4785ef6cf7621a4c65865605f1cab622a1a1add8d7f11266a7084f24c9fa1073b5607b90df4b786a9279eae72e300d1eeeb72700de66765d81f997d3635cc031eb8a962355efdc3937fd7fe3349994c5ed289d3656d50dd3844b24c3787785bd06527bc0d958850aa86c2a3a16eb41bb7de9ac214fe351f9424e3aaab67f5fd680622e690bb25ba967b311d\n\n[e = 03]\n[keyAsn = 3082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keyDer = 308201a0300d06092a864886f70d01010105000382018d003082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keysize = 3072]\n[n = 008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01]\n[sha = SHA-512]\n\n# tcId = 240\n# short signature\nmsg = 36313237\nresult = acceptable\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdd0c9e451b5b3e5513a94492dbee1ada9ea87e65a8cd95cceb4d304294ce34bf09a212f14908f5b865c7a34a72e68e389794a2d1c5767ba17829e2044108ac7842b6bfe0a5663b433d656f4e38522c5a5a23c460b898833828d257350e5814291b54cf13089080f84998edcacf0fe5fca0c1f8b176b172c5f9989491a039bef\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen172 = 267661;
+static const size_t kLen188 = 267661;
 
-static const char *kData172[] = {
+static const char *kData188[] = {
     "# Imported from Wycheproof's rsa_signature_4096_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001]\n[keyDer = 30820222300d06092a864886f70d01010105000382020f003082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001]\n[keysize = 4096]\n[n = 00e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed1]\n[sha = SHA-384]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = a454390b04bfdd69c4be2ad1bad96ec901639f0bb60df268415b4a93b4cd53510fe64f394b319e66ca8605d7d5f7a05dae5eff827060013503d857a977c09ef742525e43b7e69d3802a58206e696848a87ee17b2b9de6829044349036554c659c8f8866c401fe85869c0a5ea90739c4983a1561a84e4f0bceb00015a671f5283f41f0bb8599774829b6a2de24f14d83351c96e35ae1475c8b4bcd2cf66889237a206d147b0e949f2b2028ead379c74203017904ac09a5561a8ec343be22cf46c3bc2a87b12cf9cf6e8fb22de884bdd9677626b757a005d3745f387d296347d3852ddc2c4258cf572dc40df3ff6a8a5f9d8b1b410c54739b9ae182611ec01805c80b445d058ce2afc4bd58d87c03fc9500fba237bcbedb0960a1a02efef52b97cddac63b5eb0481c0c0991375735338ac84c0505415ad2bf8e7a819ad269460668ba8f8c879f521ec9dc709e406de023fc0f9129a3a94eb1f3af08d33eed6273e5166f31110097f5558d8d9028ff558e627c9c0db2454b134a82a9dacca5b4032bc0e27c4d41cf55e9d89cf51528bb4f08c6ee5ce651af3772f008a44863c851933a57cac8e29a84756c9fa7f80435b3b78486f9908512902d5461964918239c76b6790b780e09d2f1d3db1c59b275d20bb24fa4f518b25af3254b61d34ed8b444d3ca736ceffdddaf767bdc92b4543f68b25421cb8c1328f2f253e446be46d10\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 909c1f13b544933ccf3bc73ff5053a8a65a8f01b447d4b40f109cbde29d866368aaebf46c19051092063993862b32fd166006bdd4d988794d4e9a77821fc9e684fab1366a2d988eaca60e4fa8ea947dbc4b8438a9fc036691107d3d0be52c46c61342ef8fb7e08032921c1b455c55de28d58c77c1eaea03f13c26c4cea73d14acfa8ac2907f6a775273e7686ecf4b882b88a42cba11cd1efa5b985cf5a227654e54cdc9e2d283b80d250cce553fda636279336ba13f7f3659d70b5b2995a2ac7b60f329c62790d8eed1c3dacccd0df468a91e767c190be41a028d4efc1c5ed5e6f3a77930f50217fde9ce9ccb66b75731957959834839fa3bdc1a769fabebab03d3f0e605a12aa9fccb2a9421591a7427d82068623582de592935904b59a42e59b50419cd12d71da871862149a6500ec6870d989423346879551e506fada7c0c01b328244ac5f2e2c5bcbf4b5b09a4512a0edc90fee4d4dd9eb88582bfe37b49b8d8189051b32cccbc4d300284f9e523674a601b1a725722695d5ef438b770b575b6d0955edc761250bcc6a30e8d5c7287093236f223c2da8d9ab7d6b58e5d0e9167f2e8c58255ed16b63789ea16046bd0f987b156e9898076d444cc7a4aadc76699a2e3a442d63ca4c3f92da9f3b2c4ae13edf9d4e28ad206ed0cbd2df2a46920e298abd1904877b75c1a9ff80c5bf05bc5d1ab94d379d064fad894918ce326\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 65956121a818b842d861d0dbcbdef22aa05c7e94ce5d748308663e142881feadb85dc4421d9d01833b8b4c2713842c77949cee8b853286107c655de7778a5acca11afbf1d9dad429eb6a281c1e8ae1cfd37cdf530fd4f2b765c352bcea26ce44e2165c36553318d89b1e06ffd8a210cb988cbfc916a9401fbdaa56a1a2a4cb66ef00a3176182d33dec5f3625b760c37c82cf618cd2875079a36015af21d060dffeb5c9e1f4255d7fea64386d8d860c6868cd79ef6d7a87927753a78bdb63c4845306de1d73c5d7dccbb6cca9b65aef19a7b9e53d9c02a4a2bd6910e076959f9f40c30eaa0a6ef783c0b73f05566e4492e16b832729e03fc939e54bf0336d376a3b4cda534bee446dad3fe51d20bb8a135103e7e12220484bbe02e99c5803282ab90d11063e5243297f80d3f24ab08fe8f2fb62702b0543f0203972d35287ba64facbc635cb438a888c83c7028a325555f07521c3095bc4e38bd0f60eb90828319777fea2276e0bc76f2c13ebf92f802a08844209ccddd2aac1f2700e8a5107e86426e6ab76288fa01de18b8a63551fbe8705824d16e5190c559c7bbe8a17031e7d352a681b0418cb36423632ec48a8d3861136b250ad2fc72388e771b41849893cdbffe04aac4037209944ff3174f86f7a88414b1666727c960b1e54a2cdb82e39cf9f2661f4ad6e22f330b350eae7f588a623524617b1846486fe9f04abbf5e\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 3b35a042a4791dc1ac1561ad1038750bb9a575a7ff72db2ee60ba027f8994bcbabe41fed36417bd139a286ed0aa6c3ef2868a7251442d060c1cc67d4470c3ab7c307acb0c0641218a45b9cdde05546653850c2168a59f1788cd55dacd40afe38eb941ff08ffa8bbe609f2aa795c73c0368f482d53d691980891ba43b69f5791c2e6f70e17a996a299e60ce1c9d44ebb9f29e700e9ae216df749149f6c222d1e1733953553a792745c382d44f52ff404ed5ee04c41ac8acc97c250f9a5e3cc6d70902d51e8ac000d05e36279d83491dfe6a40f222bc1dfcfa7fa5e0197cf47528f77719e007b65ca39dae17bd0f323b00ee63b66401e2ec5f8917ef600a41c3a61571a4d922c0b0ad0a290ee054ad15e63f1a0cafb749f80cae6cbeb06be62e1608b502182d247bc6a37abe5fd750ead8b7216a35e74b969005309b14be36a31c5e6c2266701d5afdb5ca2314e2f32ae17387d8284ad2c7225fa63ed47e7245a65b74f53a5bd22654b3878ed09b1e5e070bc20eefac6c95b006b8f3e613b19f518c48ee6781a12bd08ad36ba384d03d3ea3c4e0b1facc39741f9ec73d0335d2ee735355955ed12cf8b999d155d389b1a3caebdfbba32c883ef7d0e112d86e6149a3328b63b9385c68fe8a7b679e8436aef7466067a8e8bb49e31675729b3f448e7dd3c048973d2a5f8f7173c4428f3982a99361fa691d1588e39cd4485c450158\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 09d8512c4667994623530a2317bbda738eb8917bc80c84b64793351463da171bccc88b95049a57ccd917a4687da3be63db21b0ad0972ed9ed182f4ecc8e06647675340192a57e6591eacbf15d2f5fbdcab568b16ed86e668144d9e676e55ec4df1dce61f672de9f53d1743b72993a5d21ffeb7ab58e0f83e297cccbf25ed68c70dd8441c119afb6c07fb1d83edd9bc1ac34046733c8b827d002c3b6072d74a6c2cf7f1d968e9f7b0873de8ee5adf902dc68fbc93171",
     "f763c425964ea6e3af6691f1a303ff7837adb07a09f728de3377fff74adb34c959d363db650fa5c3035febfe8c62a0cde3d006a9d34d51c5b2c4a1dd4f2423c532c6b5fddf03e0a05fdf8d857f98787d6f55f0ce1d0ca95a37177657035ee48bd4f39f7d520ccc48ee999777868b4c3876e2242f59b725798bca28ae66c267c507cd65fde612c1fdc9362994ee31134d5561ad7c3f523858f43611c249cca3c134d00ed966a82b800da11add213731b58caf232fb2094e9dd42ceaffc7002f1592e79b85eb6e39ed5de8484f5509e0f54166426095e8522f88363fd0dd7bf64414011a710c7834958c0aa308189819cd4488588b84729dafe163e79856b913ef55afed55e83ee5b812579b87cdb80d5bc9ffa02ec32a0d97b0a56bfaead58a438cee53d40dd197fa2eeef4aff98eb5590163e68b5f3de443909769080c8a6bf87e3808bf265a41a3b79f8\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 798f597e9ad4ba8b3d00a9527f4e785af5c55994e2953046a1b9062945e8dfa35eedb1e31af3daf1955d7b0afe74fbc53739b1aa02fa2dba629c31b211cd513e2248ed847dd579406ab603d3369de3bb07143a581734fd8b1ca0358c4fda639045be1f192b233efb8848bb2c544e4e188e0c7ce311bb4841077d15051c6f6b31998ddd8a7bd30d75b7b3c824358bccb35f8ffa8c0fc5ac37ed71cdd48ed3c0269a638317756bdc9287043be1b4f3c6ef6423f1d0d38857c195e7be81c3778648ab889474109ff3c7be0fec790d3f5f50b966e3df40c566f572f8f252d09e97d4c90442badf820c7db74d6fbb004bd7eb53c0b1a871bb9f480821bbb48b363c85c9866bf8a86de9c6732a3136f2c80e88a29540a9036b72fb8f4c898e7b487c41d0f693c91309bb3bc06f1e3b2fa9918c31ba2a4b82a37a927784a7c7d2aadc3301524ce2708774c3e2189ca188b3d85a33348d28ed6f080a06452bf8316d483e6a5e28b831797f85a8ca5ca922bcd94b9045f588ea9e15f2a20dd26817eeb80b3421c5de72db98843dc719cfb1aff1f927ee1df1bb718732159bec70d5b6d0f98a3fd5d42c31ecf4124cb1759f183838d676eca2cadb4d57f2d6a52cd0115ffec0fd79c99aa78df8c6b54797a590bfefd4c34e4c3f39750ba47f4d8002a131b870ff8e65c6c37b75e5c54c8a2bc2fdacedb41f30ed8bc9029819b7064b6514a1\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 41fa907da9f78e107b58ff6c4ac0e92a9bbc7f5b510260572fce4ef047c73cab3fb0d00b353b4cb9256dddad432c5815652bd83c78e657075781140de56189ecfbe1601f24bdce05c63f511a3d04673d24c4e943695d7812aad66f374a74a906177dc729090070cb5d6d518e7045f4cdece06ce2ae42e1177c46856a8425e60bb06040400c8ba0efb8d4f395a4377d4c2c128c68e6b30e358a73d9904d7aa1e517ef396526cb64d39b3b36ed7204b3bab1d91b23ca95b2ca1da3eee91c7d27b4e4e658fbf5060a79cce69be1d95252b0d7d7220797a53982dc371372969d4e06556507e7e7870a9efd9e03766702f217be1c8f7f80006c08d13e175040cf28b215deac6a1ebf3520a3ad9e91f9072dfe50c69d1aa5a0df73ad63f72831b055f2367ea35cfe676a4f7970bc85e2b58917d1bd449ed3d274ac40f7a515e261df3d067a277ae610e4ee4cf68b3a947ae8c8339c818ed10e73b6480577b2a13722023cbb09d3b378cfb71f6c86bd481ee09a1fcbb807338e968aa5af993697eab562aa4975562eea6b1169e86c75ef13e877cfcd4608994eadedea3eba55af19a7a55b19e92b974450a593cde717bf0d7ddbf0bbe8fef90816fecf86ec522a2d06a04ebbc50a1eafd67aa461a8a9cd705ece0bbb46cf773689cc19cd69607594fd2ebde06aaa1e34ebec001edf318fa22245876461fc46126172db41ae9ecd74700e\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 174f3644f5380c9d804287d8b58435cf141283eebfeb4e376493b401b812b525dca70833fdf626b043e70a71a9a54974be4b77b8fac0c8cd8b5141eb4c8a906cb16584b385124f2d339035906572e446d230cb60a0604e53454d8d0cfc588c0491190e2c26f46234bce081aab2c2cf15cd1d764baf46fd8b154e75e8be85d54c0b9062ee266e2ec781f7dbbe8764eccd13da5c107b46829590f6f28f595ef4de3744050fa2f721c3fbe1afe8250069d815c63273cfceb77505fec5844c21ad8e60a73149e5d7c3018895967abe471d7cc0800030c70760bd0d3d48d61e7eb12a0a27a91677216d0095a2a95a37f3c86942c1981dde4f7897a4190a270e962e2ba427b4e630e3187ab42cbb3f9aacc9c0f2eac9a8c44f6d73f96eab34b74dbba066c9dd56d32ba7df087dba9e479582bf73d5941cc107cad55c6596d4e25e39a7ee3704228ef978307605f2872eae23d8f2fc5d8c088b482e15adeda22a7cab9d00578d143d53af27b04416a1c3841aa88de6dc4f16b8dd320897d1498e4effb58a6d87b8ddcdcfaeee75ecb9ef64e3db62c232965f556ee3f74d73d2b19993e9a9b8d6ba56cc87fbbe3b7fb7ddcb35184ee2b881d55e55a7803ab2dcddcd3572cb8921bedf958185ee7046b12ef4e6190a314012006f8003aca93f430d121df1ada316ffe0b1ef85706e36ad2164cd1e40389b2f36cf10735e68e15022097884\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 34e01ccf88b7b25ed56f5fafc89ddcb9b6fade81ed2446b0c133f6949e73a1d68134973f59a551582bb3c28651b34fff77f97e91d947a96f269baef355697e15f4999d3b8b173c66c86eaa546b44f1aa42251df45584a938b40c6f1b5e1f8c58ff74f96257a044b10a70bc5075f9769c3c949dcde889e3b9c6d32d4eee6e312dfa2c74318954770556677d1937265e896bf044b3c0a03ac6ef1d82888a5a010787dc4a65a855368532b092a5f6c985dd720966fcd407d465b33426cd6e56ac30feff073bd4c55115bdbaef71c14f180fb559fa4860d7bc94b52aac8d121d0c0ae4c2a64ee32d1a1086efdb4264f4f93f4e8db096724f52d608bc686eb55f3e2820abc4384af6e4e4a8f9eca4cb3e52c43a67e673f2610ded69df520fec76d3aa50b9a6556fcec204cb959a0ebfa6dfb868068f583338e57cdcc2d2603acedc48c59500453522bfa8165c8e2c63e4ac97b3d4d70075c857beffb5db8df58247ec4842fda08a093df5ddae1cad03e374a350a87961408bf4fa99e5511ba42a9059a0ed73c1c9618ae0a300399347ee194003fb81f6e905f0286e1467fc0eef2c5691c0d05a480e52ec578f77d2616503061530de1346d1a424facd2cbb9a7c8da38d870e5f4b8cd406d41421c959101c6eeee60e092b2a5dc717f2caf292c8622d903856a266e31c7c342bbf09f8bc37f67f576a3e8b963b88ebda9aa31d093fd9\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5da09302fd2e6eb0695f2d027893f42d71476bd0ad8e1783f3015fda3d1b5d4fac1b56fbf133144bf82f874160a3a248e2c6a4da691a7db2110e4bd095d536e72fbde3b47ce0bdcca2fc9050aaaf2395686f98b8da83a7ad152b2f517125843b8306828a0d5ef8d4b3abb874373644e81755e7a929a33e98069c4d4d0a732b65c5b836c2b7ffc6a914ce02c2ac0d4bd5e67f7a395da04d8f24031d1bdad73eed9d08982216aac5a067d90311bffc2b109f9dc3ab4ee2c051e23880a675fab15a3ceebf15f114d79523ea5780d62a0785caddd3d345697b8a1a785b1488eaecbb863f8ba22a307bc835f3c832ce37de47a416136b8c2e559b38fe8d2b94c4cd376fbe209130206b53271f69789bd0f2596b85d9ccb000a15e3f2e7c50e8820dabdb36b1dfac83cf0a307ee46eca142eb747dd72972f0e824e9107f318036e83274ade55d53fb47069cc49cc51460f982cb712074082559bef436c501c968e1b73fae4adae5f2d7111a1741d1299869b5f5d6c831c69c4ab323c4e04227e435cf3cbfba1a3a9e6e6a64368027d5c385acbab0012f385ffa331db5decd358d44afe4d7d047ca4ec9b8f888930c1c6ca1a01106c8f7482ed80cecf0e244ee76e28527d8464f41395e949eda74e233282f50b6fcceddd3478be8b7825ac05f0f1f09617f31f79eacf10d90be50711b8d2c0a4e1f2062a3d6d4ab9ed05c0f6678f94e7\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 10877ae7a63a66b8249e34557c24145c4a5bbce1b2d7191ed8a6b194b5a14c6f0c75e157772c90553632c4a58636aec356e50bb15035b7409084ba68e91d09cfa3d090e1b4e17c08c56a3d20fbebd483df984b5f800c7724c52c19339db62ff9b13b2cb38b1187c5927ffe5728b8c7a66d3f209db3e2a490b115e6e854bb8b5fb6e390aedb5ac7fc93921399824120a24c6dfe8b084845e4921c5bdc04f0d3f9dcd7896632252b69727996b325e99a07fddaf055328685035b629c001078c8182e4bc79155405aac2324790497ca082e0d9e6b2707a011a9530fed0fb0e2568a05ab26e3cd1e613d6cf4f10ee619f97bebff59df634427584e26fa81cf8efe07c40eb910a7cbe463eb568cbc0cb1992146fbd7280064a8189d22ee23283f661b9e980d2403e70753c1bca7505ec92c1d688200fe001d597874968d14a8f3d8edbe436a6f7328218b69957b1526d22eea70992ed14526a0415e12534af443a1d8100578be888bad5e2fa18638d77dc5eb177fbb12045d6bb2fc70bd4ac3d9f3a202503611ef6b55b005f6a39cf45e3a896c5a726f8eec1ad5b68624347be0b4561df68afcbbd665935b4b5219d75af0252849ae4bdc9ae89636f7d0bd9533b0a18f94fa2ec5b4c4fcb63a0880619a887b710cb92b3376a407fbc6fbc43d5794dd243c7d235a14e8cc3e4f786c3bd57f391393d05c283bd9c62104fe04cef29c75\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = bd9586f52f2e14b0694a447fc111086141f8864f0d2464ed83adeeb0b702cc0dc501b899f0c1ba5acb0c0163191dc8f46e26631fa236289902949c087ef4968585a9daddac00fdf4430561fd81605f7f3568222da3c4cdddb9047dd529527a5d370c343dd2058d3dd3885157e4594d7af160e2443297a3c87c4214ae3ae2fb3c13a8ff39e1e804fbb39f3097b097a7d2dd568d885a5abdc3d1bb012349758e96b608050285ad3c80132390ae5fc9eddac40ca98d6db6463b8f10f79e4c4a98d2aa91b7d8d6b9c2536d8131a3d447a9622467e7170c66c72495df3f8cec11951db3cc6407ce75ef398581677753773bceb6aece44f40292d8de15e020523644acf0afc79e1381875b6a67168bf566665c4a4aab1a8c6a2a384437f4cd2b242acc8d8385cb39764dab2c73e2476200c2136e4904f8ba0479e5a6ece38ac8b4e99b6be4a2f12310b265a8470628f9d198d897cace6efd9cc2b8bd299696654ae205e1470521ec7ec74d2cfffd058a1bd1f84d72a5e13d2bf4",
     "4aa8306d78319569635d492c639397d886222d5de46f82dcc5bd9736d401ba2920577bc71e7cee77b9395732317b849d22ea98bd5c6ee461d8275df4fa8a9acaadc3db528d7c53e8b7e797e6647ddf9e2259af83b4c56d63bca901e1f0ce5414b5609fc1edcd2a6a7121b41a2f3082a7ba6fcc630fbc7fff4bc2535920d6e8345e0aa8d6240a5f04f1\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 23da245bc1defff09dc4a0adc58347ce419109e3002fd1300331a8dfbde68f4b17d7e65b8ecaaa69abc14134422b76036f4917b7d991e0f51d168074722a2f1ccd1b30bbd6f3139f147d29ef11a0da1204d4ad115df67a66d4d10509abeafd2502a6b671a40746861751e7e5912e23db05d0b3ebfa95f0f3fff8876b6f01af3dc3d5e94ccc7582536def9d40facb2c6d91e0eaef3ef7753fa8830c71e6e583fa21d423cdac47189337f8cca61044e492b073caee975cd3cd33ebd548eee68d7220fce78ba2db17ef8ae487d2ff06e94d3d4ae67e3ff9d3d78256403744dfc18c5649d529f3283b51edd7817cc3ee9a3d417d4e2e583f13a36bddc93f078cdfbdfba1c8cc486b50e8104f4dc862d4cfffc7c9209143d43fd7d55918d326f022db836d6d3ae155897aa4a12af78846c94e1bb42025a796d594920011945aa7d7f41eac8c0a42252286267433c0409371d20e312423062dea435283d3857a56d1b47248190b73b358ecbc998e7dfaa4f4b89acd10b05b58a172fa58fd37f07b707a978aa4e26d471726240edce522d4083477db37e4e230031cf06096d373d65e4e7fda47d421e4d000b722da6326d9e8fa5f09f2685f6af3a51f5649e99a67010bfb695f3f5bd8a6027ab1eb759ef0a022f5bd6775e5fe96aa22d9d76b375377e2b556199c940f0567f09899874e02e8b972940fc7d7fd632efa97a617c1d4767e\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = bec4ecc1e9935d26a8a448266a6d450ef1926d3e0353bb61f7d84934d7c66d66b4441d21b54abaf9200257fca89ad352fb0247b5b65fc952f4d75fdfd2c04a8b440817cf351c4c09493191ede4d73ca55d4142f1c8abd1982278c60c2f9f5f2adf4a0d1e0ad8ea2e3aa1778a846a91bcf4ba4b9637e4a2ae49ed91379c2127dce0fe03048e78dc9c37b700089ab84b84cff7872fe08d0d773818e158b896bbd6075af6df1a751909dd1e5dad968ecc91bc6219c613a4ab902de6b0acc46748a30fef9fb33a335820d737fdb353f9e8e5378e9ceced5b8809906ddb710038c6f2c4e3c80158f5ea4ab1e2357bee7f01e2dd2dc81e9912d8b260ef4ad38e181d7f2d5b07287659e03351e4cee0f0cd4e4ca477415504a8e59168937958e3eadda0a9e366fc370c308ad78505a8faca416e94b7f27f60f40709959fe26c1c6ab985a1141537d1fa110cce115ae45a10a3498591800e81102097ff514551819abfab67d876df37e1d04557ca98ac6d9c14cde0bd2e0f9ccfd6e2571750b3a69519ff2630c5f1a08f22767e9500727433126a7da85d992cd14d4d946aafeb596f7aa8ea2239d1d5fc0556584669a8fe968c7d1ec9f35a601afc7d8c5e2620af5bb95fd922dfb3b8d013f5b87c3cb1da4b3349ab13135a13d45de49b4991eefe8c6f6b1bd409b2f827288986e986cf08c643420b160a642dc47afb7af321d9eee89af7\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 6e5a44b4fe52c8104eb60e7d96e697c2fb0c7610fe17fe8c6d10fabc509cd3cb16bb4428935ec58fac84db83542ba166991f923a9889ee78088f0886deee107c1d0852ebcb295561c3977b2d69aa069e1c15e41d5ac47050b2221962413f9b5111a536a0a6c1762d04dd8ad96318964e34b8230564509e62d63b4bfd0dccafefc31bc44a0086daae5da89baf990e454f390343f1755f7db2bceaef0a310d07b7817a29371485d5abce1cb9b1e556b830e15b35de0b0aa977aeb1b6a54117bd787f7f9a64452123a3f29fc2e87256395102b6ac86bfde21c05a5aebd4862008be79eae34faaf324db09b5bc57e7e2650ba2d5a11851ef8c864dc5c04c58b132c208b7c579673b7419557d4bbdb47b2281129c72072d906e0e63f4e6dd55f3d3b2fc386a81a7b746a991a751d49d91a76fa4876b3c93c4b8e6bd9326957994354ce4d93dc93df5c5a8d115897d263857c702f2a95ff4a714d402c88b07caa43d4876ae5c37780a7a22a01e8f5a89ee1b50185a27318120a6d3dad156811ee818fa2d7b051d57c5a4f9b93a99dbe9630b3e301e94b04ff6bfd4361abcd95d86fc89046f66da80e29073365fcbbef0e7f29ea799e33302ee3a29792742f4a078f6cf86494c97e8b1dc2018d4a65ffaca21af43675a6461a4a8519e95f4320e2ce904f88ee8bfcc5d10a980684a2038b3dc8b34b5131995c684c89d01095b41b713be\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 856accc6420e940cb6ae49009afc46bc43ce4853098a25631d172c30b2d94b71268949c8ecb721a24f1d9b1dd0448f2825268c3f62c39a97d40bbb36cc93f36f9e78c1e87ae7e217a3f0f3b96c20b99c96d10d8a06b40dab75e7045f484bd6537610f423345df4b9235be70874c3754dc9131ad5041da7ce7c61ede789d87adac85dc9318b82985c83143ea1194c07386ecf2e3af4c1a72722c19649875378b43e85b8251e769e42405f70ae26d94e7b7492dc761accf9d793f5b9e3619a8192d8166ecc53679dc2bd1b8ff609d698bf92c75ac92895653c650ab205a9233237c5ef111d71cd13ae2cabe6c71f5164e896e9659afe547ed1321a6cf84734bccc19b9b93d796b54ee6f3f5355bf1a8f681854ada63ca8beaf9695c5da9adb1705ef06b3bfcf2d35be7793c48c8d8d32a1e2273714c314670447c51065619558c8ae80ef286048ced7e53d3c7b5293d1145b337a0ec34b21dbd3e2bac4897bc657737044c9ebf8c9d8ce82a33a56785a2f21c296b18435895005d1a5bef8c496a36c4608b9f7dff13bc7a741217b54b8293e8b754e1f1d98f9ad74bd3334f381726f405130509b815bcb09f34b3c34b3340870e7702b54dfab81fe68c20e1d6ec9f64ddbb73ef0768f3ed80babbfca7eafe69ccbe1bc8db50ed35614f1b883e702c04612af87fe3cf48063068abc42f3dfbe6499b8faa57ab75384bbc47c0a83bb\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 7658eabf44cbf5777f121c459c87744aee55b520f3163f9753d7c21d6487dabccbdd6a54bd8186cc5cd68fde76e6eaba46443ec0a750a1824e7f8e7581f7b57949cc6c44b5a6bc08d61178617c4ee99ec700053562efee3d8c7d532082cea526f6e0949b686399f15658771949cf6ea8eb455587fd328de1315180df149bf764ce52536c82b2d1e924e7b7cdc09d11f7e8e8e1279cfebd39b8dd64902206e3fe437697b0cde2620da6f3252d09e2ceb52a6bb1a63b407d3ef1a0ec2d6dfe7a413dd8e899b8da238032241514b44add07e2a3cf37cee9cbd50bbdecd386226b08020652bb651e292fb4ddf6a0cf8c3acf9ba13ad90e74055418d6cf0ec2dee44fba207a2052474c6e397a7eb30a021d2e44b343624657d4753706df893b031395d0cfd831eae47775b2a4ee21bb36f294f26a1ba1011d16d5a889edfdf0f69e3bcc10d85dd89f54318aa6403ffa0dd3711516a0d13771f04a23c7679a2fead20c57f067e9feb5f43729bf6351ee3bda720d5f01d56688ec2bd5f760977beab14b22bb72885e2b7f43572c0bfda433eb65e8f8c7da81414f96454fde33ceb6775ae73ee119e25a8f54a9cf33922fb06def12c6c6e3cdf01134a62a81412acb67b7e63778d675d110d8fbeef33db054737c9c99b86041e96a13bf064264d3abbde65af598cd60aa827f4f7416d3f3b0c622c038c7fb63ea7c10691e4900f0505a05\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5bdf25b34b0452928d5616140daed62cb7916283165722a98f344e2fb86028f4a5a6459227502f558ab0e6d0591f28bbafc7fbab5a5411167acd7183936d072c3192d73aaf5f02ad4d31d0afec686a6c6c73cb0426c4320b57b73cf6dccc2a376d0cdaa2b0f86f9aac6bdc3700e5df7a75fe69881e3e0573167f3b8faba3d7be21635e7dd10ce82c7cb74e97611415f7e283bdac4b186f7b0c4e9e803a9f19220f686657300e4ec312229ff8cf69fb780964d14c3654df79903fae9969058533a7d0fc29f417f98c1c62aee7eb260a318404e64164699d18a16bdb934e5beaad513d6bb7bdf1f30c89eebc2cc02e623aa7f52532f2e89122f50ad8be9cd3d6476d815e721b789f148be254731e4d5236a678a5894b939de88067a8f70c3ff5355b7a10c2a624d09fadffe29c97e6c2b655b22cbc8f99a1912539d034537f29c343e94d762496ed93072940bc2d56bc419dc584e0f984bcdb4681920d650eac7bac0cf2ad14457566dcb2c4165813aee4d2891adf8979bf38e6d7a3b80073ba04c35b2d161575edba17520fa709e2f1ad8ee43ff5327fb8f40935b7563c0a1487701e964b282c3e5e294b5d5cb570d18108c2d8fb9f9e2419bc154e1f865b2512bcff2424a690afb6d0f582f4b84a41e4a211fe57ac406db5908ac95a5a26d7de6c3d7b4b27d4a7919c8362293e8c8dfe21675e800794d31cb96d9a400c15df4b\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 20dc09d6978139edbfb570a17a39704a662b77fe4047037275064346e761f2e198046a42ba19087fbf5f44977615a8c3d26950acb99ef1aabb32a99a5a069ba7008a0f8594c4fbd7010ddcdd71c2f5bd2ac972d4f2434cc662443e280f2e241f0c36ed47c276563763d09591c80d1c77fb1fd2ca278448f3d183fdc16f1d9acdbdf94c7a2408ebb7bd3883767ffd5f7a392ba1945c2ab9b03da850e745432f0a09c7c02e7065c8b55c3ff86b171b78b13c3ab933ea1a76c332a2690c852f4bc39e7e8cbff8d71f1d2e614c611e4ac5b9f6340fad1db3a3484fb7a295f9e7673bbaa8ed675da4915eaaf0b3cb882e9b9055ae4bb8ca513762c73a78f12f42bf3cc42c8e37eec06f7caf1da5cad92cda284d07de75aae9681cc4cc9974e2683d4a56a6af6c792f26a281e72df45ee3b2beeb7667e2b254405c3af92889e6add37aacd2e6f1ddb106d1e7de901f285ec7097b15898443d8f368a0756c2c937ef1ec177736e94043689d6ab04abcd7829d58e888335fc64d19783ef08544fae0ef5cda771e481217c09ebbc12e41981f56b68c4c9078172f575928c7003606f69c3d75ef2b397dddb856ad5625035c274b5bfdd6ee91045eb8aef15004160b98846c817cbbe8e608fb1426daff941e9f0d358abef9d8b52b59d3d25ff41a44cd1168e6ac32f09e86569adf3dd11c632ad14c43a4545575f4461bcc29122cbfaf5440\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 380c5334185962bef9ee8ad0672b4b997f",
@@ -4320,9 +4419,9 @@
     "935914f2a6d79090a79465c69239eef14adf66a32117709528fec892619c26f59e234b5755530d1c10c59973b40a55c289b85f5e5f34c5e147af44c84460e2ee834f0a4798f49aa61a16148c8a36fad5fc255bd02621b5f51212908d73089b10936d778b6882c031eda9e26c7fc8bdbbc4eb808e318090e89cd6daabb75c1d55d638d603b60d51d3f3a82ac56663a0e4df5d9cbf323e1ee7b1531e97a2129f\n\n# tcId = 227\n# CVE-2017-11185: signature=n\nmsg = 313233343030\nresult = invalid\nsig = e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed1\n\n# tcId = 228\n# the signature is 2 bytes too long\nmsg = 313233343030\nresult = invalid\nsig = e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed0\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed2\n\n# tcId = ",
     "235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 556bb026d73b4d8949c94db2740b6cfbb17137b69cf269ba5f1be736ab6eb0746cb7ffbc5d7d11995b2053227013d5102b9484c59f521853d99f961e46611974f47f3932a8e1f82a3f5eb047cf7c7bfc63b5dcf86effae34ba216287fa23d5d79e7ea2439aad07fd751e190111308d9b49a524db7c3b0c939d9012f9c2f3edd9534176ab2096d4e3d1195566d072e3deef214539bd70223f712ec45f8a28060604e29ccf6e5031432c9623190dd194a79bea16a1b51745f2fc33f2d4229cd543a1d197813525c655b34def9990fcf75deabf65b325815f80d544528a0639383cbad12d18d4103abfb634a7b9dd68d416600aa4bee19bbedff26f81ed91e119bdcde3ca52792e2a5eb20a4c927f96b238bb478ab31230901eb99f856d0c92915fba339393d1acd7f29270b728d3f26614c6c894c11693d2d52a89da376530f3356cda798f1ff98277e8f469895e66fdcd8e685d663e9a4b9b25874626ccec38e1acdf1762e20852727854cdfda4682951000c6b412a1d0344aa4f7a13ac1a6af8d34bd7881c8449e645940df870292dc70493149f609db2624ad3ec293d8666bd8e6d8deb62b16fb88e662ca32f99ab3a7a99247f9baf9ebaa3cb2dd05b110d5288550042ddacf603388efca1493da1c9bb92cac856f5eacb8c7fb5650e9288635b6c44a47b5d6fd36c41637a6de1eceb135871e747318c27fd341fd5d3ebab70\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = af875eda2f4243accd942bf9abf7eb89260c365d64e610997961b3278914c330e607ca8342847b02c9ca916b1f51c2afdd95229c9c3e1d33dcdba370f472060a3f7ee1d74c8667bb8945b6f10bdecec96a9699895f2fc58f21e235d54f2988cf78d27b65037b7b46552412d30ea2b4e1d96167b9f720f4704bff09e3bf6e2ba899445debdb09cc9e06078f4dbf1794813662d522c25c0e3346132c53e31b02723cd0252ac0932e0171ecf11cef73ecf8eee9ce23f3ce66fa6301050c8e8ea96ad136968926753fbd09a4da0176e8e3d9f572d4857962d04aaf33145fd4613329fc4b3b50c28f4d43d54317752f983dea5432ca88efd035ce839d09867e0d84ed57e331eb7ed2de74ddcd625d13f3bb586bb4dbdbfba34eb0d72130a62ac10079807cdafb40c6383f08af4109472d2ee6430c3c301bd6bc1a983ddced8618b08db2fd4ddca07c9f48b668c9d6f2cb2755a29e19ca0c8d037d3db7919450900d217fe426f054443aaad6be22285faa923cf719350cdaedc8733ece6d62264bf4a0dc1bb88646f157686a4053111aafdefd412d3d7f59a2544829ed429038f1452ff36d4e8b297d0b43148090a995944b4225bdf519a6315d62df555d2337f7ef07975f0fddecef82ef0ca5bb41444d89860405fc06a8dc6c93bd23663a977c68ff8890bcd20988efc44df6891b9daea3af083137a21f3776f2e85443b359ed13e7\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = cfbad304e05807af505f5590a49eca630fc43df9950e5f43b2128a45d7271f2ddc86d8374af08bb478bc2ee3873f883ca0dd41f5aa853bc442dcf5b6fb1fed395d8d7d71f19a47e27cdc790e63f4bb6d17faad0f58efff1a36044448db8883325b290308caf5272255be1d15276fba4039206762ffa3b63cfd07c82ecbe0f8b68345f748c42729ef05ee87d7d5d83bf6f708658d7c45a7f457c3187f76e2e2e69bc74e60bb729acbd1bfac5b79ecd895ada4b2c9ba433ee513b651168fc23709bc75f27ac8f79336543d44af3910ccf66fff78113b103de9d3d0665157ebc14355e9048e04cba51882db9d70f41505e5343dd82894ff277417fc6b9524904b32655ff0dbd8899671b64b8f4e6b3878553d21da3ab842c12c0cc4cd88bc131bee41896d0337ea887dc729874922f4cf5b242296787db9709b237cf0b9a7712ca722ecc6842c11612dd79dba6b3fda11597baacd44a00519bf864fbdd3b4eebb923b7eee29aaa968d074cb45efb3304cb923b247867f819bb6145186cbf779b5c4d8b95add1b649b38ce306479e8684beda55cf68b2aa23359a9034c6b37e54262bf54e6cc3c959f3c7b8906ea15864c488e33bbec8b5d465054602798359eedb80c9dff2463fb16d153b0200aa01222fb3b2dd844f915efb05612a8f1f0371b2d668a68768a168d507af7765ae805ba3edc1f81e0dfc495d824212d1cb00012a7\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 92528f459c1bd0775d8c4655fb2fd5e8040f3265bb57fe1ee553c48f34738f3d5ad2ae40d6037f02a23989669e0ee9835f3fc7444213558f2eda9bb9485c3b81d99fe1ae4e26b22cd5ea7268d489d291d4f5e47f5cac8fad31027cc56138d5b55b3e45b05cc858afd6ed92bec181e1176b84ec33f134801aba8620b294b2238165b8182dd30c1831307ec35944e1611469a458ed3eeec14805562f88eba7e952beb9c19a8ec9c6a0c7e2418d0ade519c1675ee3b029bfad20c434ecf2b1105e76592bfb0341380adc413d566e62c9308f59d6ee717d25c5a2887af1c8341127b690156186a7d265fecb99a08421c89c8da829c6e242f561876919b229e73cea2f0694d8bff282231ad9b010e4d1c65483c2acfe70e0d840ab25e5d181ed7ff884f45d48c45934a60ffa6cbeefcff85d4bb3b6187a7d1454a2c08c5fa222715bbfbf707a492ac8fa2a709686acf466966823473d82a7d7366e253a41372fa2200cd4f3cc4d78a4bc2c425a53d1580f0e3ecc17b48bc55a8185688f3362a5ef7cb547ef4524606ad3e317f0d1027059bea88a0ed7fdf44515838e3a03fe059a804534b482801e5b1cc35ee6bbdcd4c6af53899cc97457224b8470cb72c4c41cb180ca639e18d45a9cdb38d27d9a82c04157c70d5ac18b623e79eeb9ff747289b8580257356e7a2488f0811509190aff1c7dfe3e28019f5f861543af0004f897ee7\n\n",
 };
-static const size_t kLen173 = 267661;
+static const size_t kLen189 = 267661;
 
-static const char *kData173[] = {
+static const char *kData189[] = {
     "# Imported from Wycheproof's rsa_signature_4096_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001]\n[keyDer = 30820222300d06092a864886f70d01010105000382020f003082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001]\n[keysize = 4096]\n[n = 00c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3]\n[sha = SHA-512]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 9cd28bf41b99fa4df2852d86536257fe111f63f01815146c057dc3bda9b6633e49495d38822392b6b901e6ac69c4f09623a524e49246c3710c85a1957943d89c8399b0c2a649938bb07340f14c6981a0da0fd35163bc7eedac80ad1cbf06a4c32a4a08523554256eb221395c76e1f79a5e3c5b9636673db3ba27eebf8315468888671f8441324e092124df31d396ad8367eb7c9d0afa44dae85d56208ba21ec7c1f0ed6a3678f5d97ba7089422c662d86cd514fe853f38481632197c1ba07e4d92735eef3b75afc25ffa900769c74ba34f2d157e74bbab64cf413bc858cf6c393e8afe24f9e71168e97db96717d0081d88a27257d8c692dd0e001f3fdc2090512550ad38725c10a201fc50f8dc89ecf363b4d21a7d815eb78557d42e657cb44bfc785203e8de00f9e18af1c8e12953a33b0717af215d9b04b71fc320bdf4d558faf55d03d30844237551e35ed6606bc706ca43a47e6c493e14719049065eb8e00760283ee72c1ae3ce019ce3263a90b8340d1a47b49b78d5cae9602539b379186e5c1e847b69c75152036c8d9ef3c77ecd151bdae7ff36a459d0bbc1dfa33ce3dcd94ee2cf6ee08a77485746306ed987eebaae2baa544b543b5afe143e4122ade5adfa4fd463a246f29482dce7a51573aa18fce87f7edde842e7f21ff9e40c4101b922616ee4c14ea1af3c4d417fe8876af381027d837fc40dc684e81b9eecd4\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 659ffcbf6b22f5d201fa4114077aa7df32b513a1fa5948ee01f6e21c1862a2b91863f7aa53d1aadcab9347955210a91829a5f7c86b3e2850bd1f76b3c4f4333615ceb22830a7a9d7a13436683a48995bfd62f528ef4959d30b6ddcc8ed2a431c06c337250f8274417f6369b7a08b927885df52bd7370d3675094bf1bd32a7f5b0ca9a399a59f868cfb78f87b8647ab37d0d7a58d6f4a58f3e3df7ae88ddfa6470050229754f4ccfa265cec0635f0360c485d8f81974c6b8a11adce3775dd01936b82db37641ecf5f43cb8538055a053d4085c38a8a1c4e0c8af961448a779288c5efaab1eb4401c8f388c0b729e42243d935df1ad3705c1c5a7ffb6ea8ce77a69481a3b930f95ff118cd0fdb17393a37139b3b5a9c275c6bbbc819e18f49c369153bf1f7807b450e54fc28065a6ab6d5b0ee91d0a9302ebc0bccd35c2fb2fefc341a954b67e91f6d8f3f7b62c5fbe504508594f357b1ed951fcac7043a082b9bbf41ccf609881861e2de15ee99d373c0e99027ff240c0b6fa52be2e199967860baffbe25b3254fcd375da7152bb94ce8dd01465290fbcdea0838a69576e97e63cb636db79c2799a26f94a9fb044e3bf66c520895b4683bd799e6b04ab62f621dc00f20a4adb131606f127b84025269466c760181d7dd9ffd0aa5381180b541e5e933e1841d6386ec55a63bd9d8674a775526d30dbe34e4db87067a9326c6dba0\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 46eaa4624a4d2c1f1043eb3d17b48d977819a8796f48f20174c50da624c657e64d3154dcfa2a5b1d8c6d2ed07cf1f1c19aaa611d6466f7e7ec73df5ee786573adc5a9e3c1d0a25559dad282db26e889807764115a05a23959acf48d23b3b33a93d8b6c7de3ee446f113eef96055d285fdfd27888e569c50f022d5e8abafc874dd5a61df6258e85268bff66cc5643107f7d9097496caedc185b37311ab6979f273e5670f143146b68e44b49389554772c1ca7bb7a12fcf67d67a1fd0c245bb4cbb924276ae756098599392cde076a1c0edc8096d9125e5a5d30c2a93d00fe2e0362e98592c8fd31ab5b4c3b34e65d38ca0c25874eb394e04969982b70932616b75ee2912c6a07f20ec70e52be630ebe024c0622aed125e00bc84980416b80cba7752eb90af2b8215c4b559880d2e1c577b7374531038083725d23d02d4fa5d8b5a4c68e9ea5e11fe2d9e03c1b8a4db0b053097b5a175b1131e8beef5d559bcc3f17ed2e6f6304c0e4650a2bb675aa8de44af8a2e301734584eea145c4b389f6180e6395412ae70e57f488ed15d45895be580bd87cd916b8f20e46ad2fff0367dda54266778bb444c6e4fdd45fa62cae3aeb54b6a7a6b4d8068e3a4d0730f0260340a6c32c3c5d33f514612c941bb63d730df5584933e12546500495b5ed3ba3631a3db871d17353d4c16676a0332ba4c4c4c68cdb6ff21ff737ee249be153c1d9\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 12813153b37fa6c0fd755a1c7c409bb8169c5a39d045dff2da02b2f8e8897b0cdc6c2d40e6945b97006f18e1b26983f77b70bf2961b5e5f2759241daee8c56fca7c53c81f69d3a0341720d9761a4f7be8c068464e881c85a2c39e0ac6f74f6f5cb42df8c3713f66a282d7fba85b7a09a6af83a068b78bfe83ab25841e4bc67c9e40cf2a0974f8875fb81cc6a115b91f922419c44ea82b33187521a7e1f46c0ab9459b4e97a3f4a1d9e92403a37168826fa0ee914232afb6c4d7dd082d0c58885e356d0efb8aa9ae33d045f24b4b3182d5c54556f5838c449d31a49a3ac4ba568c248ed72c111b5ffabd991ebf5c48efbca33cb38996d584992c4abdcc7b93700ca03619412a355b41b000a32f6cc4935f942209b56a23cfb7b788dceb692343995f77daffa25e44d672f8bc451f776560b415d0d1bfe9925af1c2567a8e9bd15b8554d93377c62b0addabd27e8d9e0859f498ba8e03094e1d86d41e69f7606d9f1fac04744c3b7b8fc4942a846e2a3649bd9416d500b9895455fb6741ed8ed4f426f20ab40d8ab2e6cf6c63f5c290fc011768b317bde49753efbdfd12583f1ca79287225f9c3d3ed0c4530815e4f5e7ed78d14aec0d04142d0ac0fa3bb5d73b4bfda2fe7103a2ab40672abf08ef4d9e537b9f856d32450e2e41d9277be62ad0675d1a530709f2747f51f17aba10381fdc70c626bab45d51166b6f6ad978d2dee\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 27a042625f50673fe9edab9aa2fb4c60dcae0be2e8b75662bdddec7b1d698065510a193e17981bb0b1c32e46d237e15915afe2e2d4890c09907e1866095c19763524b6c8d2dbb7814ac5047f0a082f7fed4109741f4719e12ebb91f27a3cda71e80ec8a7f6c882ea5b3de3c9f156cff033a0d3cf787f9a8a833a29d0c96f0b68ccf55ffc62098e21f0df1832b70878dc94ef1a3260ec2fa56dd3c4fece5d855644d26012f56d2af85a0771d61367b7e266577e44c44",
     "4347970908ab6cfae42069e2ceedf63679c2bd03697957e287d156b2717a416f0e4ad96868e1c7b80eb84e99778f670ca39c15e1f901def1efd824ea5f7bbe127dce8c8f53d849fe1172a1254caec13b10b0612e72d3f8e7206eee2620e8e3c0ea176deb4b1fdf5d8d37b57af553cf7628ead74443f98655b5166cdc08190d7e3b134d71c21bfacde3e4673529e6d8a9c7a8b419451e7ecc6c16a44b8e1b3f2c9d1c822df8f2b51d8fd027074ab2d1c52d16aab0a266c7d9ec03df7e631052e67a28963bf8560e89326168bb7c8f5a152f7ac54a46e88190c62a938628950df881a4be4136a55bad4f608d39ff37907a6f99bdee065e5ccd2921f8f1a2ebafcb336fc6ca96a207a5a0a7873420a2ea383a5f1c604c93b6c0ac69244f05d54cab184c6592e9bc4069df60d3cbcbf16729dc2f3f3540474890abef29e1b21dee8af0386ab61784d7af8d79c\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 2e642b8a5208890b52187729c43a1a308cf6b846ba1c2fff152ff4a1b051753f14ab035c2f3f732d5a9df7c2cb732d09f8147509bf02df8ad26924eeb04dded8467b66c5e3eae384568f624e55c81cfd8e3204422677ab62d919a176471b1fa8bae44bcc8d4d116a6afe5ea2773ac52a24186d6a4374171ce0516bba8733c59f38d622b7b6b7ca7ed2123f7f46b6c06b02f4c7506c46327d7cd908ddd503fd42be3cc896008eb9202bbd7af08b9908121a8b27fa44747217ef72a8c549444232e9209ca1345ee017010409527faf0722e3f13641ede5730639bf560c8a655e2f96cbba7b2811da8a1fc3e5125c92754ea7b823f394998b8890602b1713c2a4d352066e01f55ea86fe3da71f9119300d84874b667a6538a90ab24aec2bdfd9ba9a5f0c3072d549653b16f4a4319ca398147e6753f9a048b5b250c64d599115bb717ce85c8370df62c93da7e10fe705a12482e6f25e6ef1f4851a305aa4dc21b08791885867fc10c5503a769a6d6794ab5a9cc5da68cfc3546b0e848ed8629ecded620ee3fa6dc1236b59874916c45f9c409c9889bb85d7b289ee5f45f6d33262dea83b32c071417d3759cf650b9d43468ff0c2e922632e8d73feb4c55fe4233dc1f0cc6f6e522fbc9e9362f1d69441d56ee5f3252dc0559339335901f539ba274cc3640ec776a12c5c7e5c1cfeddedccce36884ea01071c2bcfae7ebfb5b874e6\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 811dec041124d3ed9d5eaa9c760ca5756e42525687d4af701231671e8f7f4448ea9b9eaacbd9c99659ee3c175277d30cdede73e1b332ffe41b8b737150ce1f1c67aa6b22ff801077c4241a6ff4af8f4db9462c70c13e1da86edec4042a70be9d08384d932681dae48fdb83149170472564a5bc68cbe952c76e476b99c8a5a1ecaae809690a014b28224ddb9c9dce0d4f6a77fa2888a71f3aa9b5deda0af40ad0464d9adbd26fde242523c096106124048bafe824f733b0af480056de2314f5e27db5aa3fd15705777e14efd2ac43beb12f8f496d09103ab377971cdd45e9afee8baa874c23d3942ee3a505bbc3901dd4cf55ea8a30fac0cb754793fb2d8f4edc29afd51b99140a8d03aa0614169428205fcd66c1047d3366fb32f1c2b1bcfed8ae23580ed254c3dcb127daf16aec1892714ee05a1ceb4e561a1e9c8fd4118ef8cc9e063bd86c55d28b8acc9d5b4c589583e7c6b78fd518d8ca85b88517f10c27aca2f0bcfa54ba5bb94ed5b005e3d871b68b86e96adf12588037adc97cbef59c05f0d2162db2e4cce41227df11eab5449d612be56ef6fc522452573340d4d68af0178d4f19db6a0ded521f1a982bc5567dbde2036f74d6d67b806ccc7c7f70d3092c22c9c1acf307b751d994fa5259a5046668a047afe4c3302e908bf70bc6b55c39726bf24ceca809357c623b89fbf0eaf8b5d18823337e7e0245d865574cb9\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 313233343030\nresult = acceptable\nsig = 47dd8953f9fef033d428958a32a4b30983d7eb9950c3d9acd167d50d9445cafe2bd02f44db5f7c5f6f999d3e1cae5b7458cd3220034132a3195481fbe5ba6b878d85c6f8ec53769f28245dacf66b562bec12399919265b3ce99c5f2217c3f5b33228a7300a0e87174675b379ffcd8a048467f04df2b5b7a7b8e3b8ffeb2dcd408a9363891518988a2a09453e98f7cd73aee8be03acb0bc8d67f7f944b62a717a7a5dc9869ac3d30e7fdf68cef439eabb8220c6923016f00b353ce5209ace5d387a7f50dbe09a7d2e521f1ce57251c48883229dfcea220e31810aff68da93744715f0720d49d8a5f3df2ce56d8fa42c02300729e8099df6e8d39bcfed502a5ef910b024e09031e141266e5493e64202a77c661da8c363f713b78247d8962b271e6ce968810775b6e76b577f01c24daeb7f765e9aa0118168103a51870dacbb4144389cb0e221e6529f9692005a2828e68936c339c96f7bcb4ae61494d03a3ff46adde34aec671b5aaff2fb61dc6011f53f9dd9a19bb6f0180ed90a4ed44ec0ecf97fc50c15607d1c6e42d35e36526f3a39278a7afa2601ba7610292bd6f04bff85f8c4f32f32b42379085b461eaee65de85ef2fbdce1d0dc39120f5670ee2ba5b12902878d2eae39290909dc55d64d1d6b03cfb4b144dab9e7bd8cbfe8500576e1a9f300818abce002ffedb4e8f2f0f58eab36f5c81929b50578d4ca3626b87fe\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 17ac14ac21d38aaa857542a9d871f7d81a829c39aa26cbe7db722f68e4397a7c758b11a0154edd42e1cc6b64047238ce4177558a0caac2a6c66136c8347ba058d6aadfa3630b4c44fa7205e0b8a9582eb5d904cdc7d25e5b9fc83bb4fc5723b3171834c07d59876f9ac771ee66ee17dae152dcfd86095fcd908697008ec1776536724d9e4322b6f7cfa59949a0b9be7990ada56722e6536b8e1442e0f0d8799ebb36e7881ccd52ddcd8a8033cfaf6d3e2a5f2d5aaa04291ab11e48e745c4de3fcad3120261d01eca03f502b69ea1d5d6f5556e9a198d663b05b7d631dc975cb7368b8f34fac47c621e60163914144b2e98e2f993606f1961d2f176a1b1eb17e119d48fd2249889a89be68ac78a415a8752f0425f1baa1cc5de9a4e0b51bed081ebdb538a70be96cf7519eeda55bccfa7ec5fc82acf88036af913cd8b30f182646d9f7f02daa27306f0ea2fdf436a40bace578ec2166a4080c7cef4a862804820020d9bdccfb2289c99ae61ee3fb3b3a9d3f6df672c4690e8c943f2fe23b5718a199439c5b2dc65b63d37e00440fbba51660242550484c94c8b6f504b0bb4e2579f1f560042b721db7d2ec2ea175401c14899062f9022fc0d8e4775c8d10c63cef61e9c649f771351b94620a3305f2d4b681c11089b5fddfbbdd291ccf9e1a997c1b2e6ab3cb1e1bdb428590ced534cd4da5a9548f3d8a6edc20139115d459853\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 15850012d1a5af88b5d1105aa0aacf404c2417de3dec04484cac687f6bec531cd569074e5c44ba15b27ebd131d018c2a4b463ae029bef8295e89c594c23ac9878e6d7a03276cb7c0b5231e887fa7e0fc3529c11e2580e329e65c669c346998d687fbf7e76b3539605753c3cd708dc19a072331d77290d810311b23a76137ddb50737436fa31f078852bc0d546364a28456c4048bae337ccc0fd8713c02713a987f89f9868cb64658ab1b8298846bd36b8efbbca088b6489d69a674aef11191c3409ea5b6428c2d847833db1563c77727706d2657ae8f249a75e23a1782024f23383330d11f1b91ca7b0ebfbe3f4a5fc6b2d37210b16049a2aa61030ed1c15b5d2ebd1a0ece36de2f53b36323a0eb25d4f77ea3582591e13f00e836a87a1fd2fd432f074fdca1a27e97dfb62f1666277bef1404958601d4e6b8b24125b4a86c9dfb260c3eb84750ba00930a1f7772510fdc0b265efeafb5de8c2525f5706fdf52a6e813bdd18cf683dbe94a6df2464366707bec34cfebb097b2f025011a0c4b5f263d30fc0c67c6e5a65f2281b463988ceb9b072718802a0a80a52f90af1aeadc8fb290bcdfea333a90b55c1a73839665df30f5b42f3e795ff1f57cdd7edfdee1dcbc81155bc3be1e264084ee3d7af4fe8d9a5be9cb2692674f1f608139b9707dc4c4b5b6968d4081236946f4c6ed2c8836769a03f9e87efd1c555f4ac1013882\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = b053f20b91837472425746c5cb3c26f4aa24bb58482556b418aad3aa6df71b9f67fb66855b83ee57e7a62aba93167d9a0aadb514c7d9f4c6e0000fea8525aee39ebcd59017fe5e58ba751c89daa976c158d9de60192230c0ce85f832882fb3db671ae091c886559dce66ad1d6ac0a5d1b2ebf2e1c30d88c46d43f9ffce192ad1cef57a7f0c437f6d25db071b74b49faee3b9732e9e0c7fef58e5b9971277411fff636aa2393ddc82202319f2aa5b2d14024609310f9c4fb6b8641504151f07ec1db8f729ecbbadd5a1d21969cdca6d4c9e7995de673ef79e95384f83900303c157ac79bcb681d2601e9b2f97a9438cef3a8ccb72a740750a2cdecd1b1b0df4a313e912701e82d76d4af9c8e18ad175345ef59968ea8c5dc62a8afb39f52515d6e8527902a03dab09419208636a3b0eeda8148d2ddce169ad3389776e10ac3a88b1e57f0f5da8e12bb1339f1cbfd367b221fc2754c185fd52897deacfadfa401eba9d55521592311ca3441c4228896a09c080443f78144e3e5d8068a946fa0d30b2187cea28085913ac86051e77f84873ff2b150455fc2486edad521ccd0b58a9055b049664d1156f4eb4ed393bf73a5d3d09cf7d163b4ef5df618dc6a57d2983024b779eb6a3331cbca72094052a8621d24d76db741a9f57dc42f41712b474cd8ad90fb348a2646f456c6ffd8a30657e344e57bcf890bd0a2d199bec9e2d5be5\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 4d8feae269696ba5aa750a49b64e7346de9e11ce331a3c7bf917c5467bb077099150b760541fce35521073fc68a5c638a5884fff577e97f0d78faab8161ca4c766ee4cd89e26d8b747671d84bba1865fd133e51a7e81e8986f0c95400ecb58c8b0af8aabc9ab352a675041e7bccd972c2be01080ad175c76e431ff670780e4b63d34aa69e3227696d8736a6d6fc2e20015180a680117a6f04f8f56836d907fd9efe10a7fb5a0f57f6461fb527494e9678568e168a83ad61b8c5cc9872f27a80e159f8547849186ebc43a54c41bd49c0dbc48fa2ce3781cec1d6623017035cf7425d7fd8a8562d3ab36c9e605738f82b5a77fc65afd217963e710a1e3a4e30862c8a8f18c97b095f68ae0878ce3cf1d062dd440764e19868c5b98f08575d65e0b944ce83b35028da466051d082ba66c2650eaca9ea9d83804f41437a3ea43932ddc217fee2c59765b5e862e85bed19e9ba0de41d64e518dd1c7c2f2f0b4bf44b40b26eeae0911d0c63b1b2cbbf3cb8e24a1ec6ddd70b9d4",
     "42313e47fd36d1f1624d071de53d76384aeeedde697c206dd27cb1d54e513621351444a4d139cee2fd04ff760d08d6aa949fe9f2c2ebcecda4f8478900503eaf172a63d4d6deeac67b3b880cf20f8472394451caad83af1e8de2e29c0bf904f288d74b73fb330fb3a50b63ecafee8ad9701361db09a1026146bbd0ffc4f0375488e5a178af304b6301\n\n# tcId = 13\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 5113288772030fec77b5bcea9a599a9502d8dc6b2b13832ae23c34e4be89eeefc4cdce3311fc6520ef8164ac409e9c2a8f6b3f7ae54788bd652f73cb8902be3f0f95c64b7135a231d8b0ac9dbb82441408eae432106aecd8167e0d3ff56fedfdd0facdaf1478183fc35a522e34933ec07844f21dcf76ed0eef71559769ee6b5a6bfb14f654528e6e24cd3f331634e88862f2b37e25cd61549a7ce207aabf6550292c21b187a30707eb0a463be2bc8ca7532f1b00f7bf3e7b561f685c91f6492c5b728ff2fa26865e6f1bc85ad84d44728fb549fc9d1ef6cc0fce603c3fd94ba8bf795fdf1b347a9f5ac58f1d922bc7cc3754cf427287a8458d075a148f6a336a0fde617f771789cdaf7223a2dab71448cfe2c2ffabd43eb839c5eca84538785e3c6f1cb0a19e532b5efebbdab5b98260f26190a359c378983548497cd746d4ee0021f148a6c7b5ae97e96d72565521b9d9ea066a3bbfba1427d40099ca367e378b227616d3d679ab5832b2dc93d2eb4993ade501059cfa8b916158aa8238bd5e1cd83e4a2ee676dfcb85051906f94a8861f5e2679912df5b48ba309b90fb383e213a70ebba0964b00f7df451c6d60ec38350e260861f5b5e86af8fadfd09d66d8d1c4955fc8dabba82b937ddea4003f9c39d4e7b152c4d13fd2e54fc95cd3c3e1bf20a065fb6a78d161e80bc4bc00c5bd93acfac027c94d21accbc423c2932db\n\n# tcId = 14\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 78e1817f4671f8c737dd45ca7d069a572d73010927e5957dd6f05ecede34487e8b4168e666305a80ead3f6f5701d350397ee730ffb6a320161c9743db09cdfa272683383271287908eb5a61b0e72cb783b4b0f341f042973247e525330201eed0b0ad881582de9ca70aa66e5171fc08ae22a89a6d5bf61f056ec02fb5207a82ca0270da42d44afb79f299782da7fc8156320e837269c9170dec5a767451edf0543361c5e5ef4f6a165cde8b0f6c6b6c62ceddd73bbab815d08340046579482e39a216d2dc8069fea722937ba5333cd47905497e512b904db8731a88006aa6b650841f636cb75c1b6d0be32b955389eb1f6ab5df19bdeb9ec19f090d7a46b1d45063126037b9f8f025816bc79d33b983cb576392ae135bcef786665522b65a6afcae3e345c06d551d5a122b305b413144cda4a58012d539bc7f9326f1a80ff70b5cde353622577dd23d10f75d206839274c771f2c6e4da1eb7b93c3c0640ebf7d3d8010e22a2d58281b8f811cf8f99725542fc9059228fd7e01113b9c3c8956badeb798d89606f481e99c222ea1918a26aca49a9ce98bd4fd658ded3c5a2c946643ff312d418b7b0da0e8d96ce91da8cc037c16280632083ee0032ef65532ecdc45589dddac1fab52f8ed55e35c261425701d9778ae53caf595d7b32510f7dfa8a7c86af4e358fe08b8efc19835e0e9c40dda2f1ac05613a26520f0ca5a126e95\n\n# tcId = 15\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 246873df5e978483ab6bde2bf90219bfce3d2b6dd6db3a32d5f3da3808e5ad945f1dcdf1186f066ef8860c8854cc80ea794758a84dcf399c9ecfc54f184de1397d48b2a15432422c60d50ae42ca8203be687f4a51fb27f46ae5c8ffe354b708d9e7007af22b42a2662a61ce1001761f3935cd6649efcf5049e4ecc0dadf8424dc3be83a299902ec387e42a79207170bea5db24c729d811b6ae9480065809aa0956760d40fe0759024af27620c12a9ce2f842b429d005848857a904ed62cca6752cb5be1935c6562c3319d42efddd490705eaff46c822f81a28c6dc44dc9e08893ffda5e044217a6e01fcb0f6e55ef1a6393ced7049657d4c37b3dca55f5ed8ca383a4a72c3a6ea6f096d1cdb63c767d0c5f4900006ced15e0d39a1a6c2d36f69af25b2a324fe6568e4665b4ca9730f50aea9ac98bb2a8aca25132e614a70c20533cc0b78c1092988482dd42cd13e4a3adabf45f811d638915214b184692ea09b83975a5e0c3384c9b37db667cf321f3d297c0f4fea1c80ed2fdc218c0b7db9cf8da370cec25549f2a0e5be001df317f0d1f6f36b4dbbe4a499e5e5c004a51bc88435872e4c4e34115619659b94bacada61e7d3283bf5a23e6c548bd089a6553524e430285e2ee278768242952b041732fc7091260537b0801d50e01891cdadab05c671a39dd46db4d9988e03593f7b4002b3ed4b0ce1b0e6d5253c423f59bf6e\n\n# tcId = 16\n# wrong length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 0d93eb247bbcf1003b3360fd8ab063378baf9ca43df1ed46aac03429ad1d817071522cc56dfe61e96db6ee747a5ebfcbe2ae6ca7571b17b9e8e2a3f5fd8879f167d3f9c20fed72058c00801a4058446122ef04d8685a16804ff91c0073efa697ba4d6639fd789a3fef6a53fa5eb062c82c974bf8206dcd5617ed1851f537643ae16b58e368456636b56f4fcda9c81041def1cfc854203af0a5ad581ea126bee84a4452c58602a2eed0ee082ef19f4ac75f8a7ba52d927f35a3bdcfc64183238adf1174dddc29c49ae4e1e3388fb08d28d9cbb379dd6c83903f096f395ad3bef4fa245e6aa7af5533ab6bedff2775649e5cbe89513a18b00ba726954ef0ed94865a7d9aad1e845415cbc19e039b3f7a7e4fb8a0b47edffd9c6eb2834331f0b636fb5eca42925b5dab4ba08078a71a6e44896abd06276f6f2e41f122848b94e2a22baf2d262a06498e0084f700ed1d23faa7b2ba9f7a71673f4f8c2a9a00e611f53c2095c43d9e78c1a9dd73cdcf0b74aadb47127a990ce7dc335ee26f4c13fee45a1eb44b99b2325fdc30e33fd675fb991d487efd478ac79c8d7a57dd210c5cb9c6fcc7be1a7e4a86f2ddde1ec8e4ac687b61231646d9457b4bac5dd5eba2eecfadcc5852dd2f1f7b9a14a0d346c6effce2549c9fe552bf1f21b99e5a013d41b5693059fb905bc30eb40b075ea8da092fab2024e6c03c4630f53e31b8e78be253\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3fe3db1dfbb41a675e4768562c60dc2c2ed3c43022b54f4c9fa8e99de6a93ce650984c6c27b7bc5524c0b032c9115fae2cd23ac7b03e496c6f4785e7045b24d226b2ac535b7eb605cf8b56906ab95ab0e2e6cb3e2b3df71b714c66685a2433244ed153a8f526bad60a530c97ea9a238fca6fc5aac295a257b32fa6fdc68f9216d8118907f282df1fb2085644cd8c51d1be9f6dfa9f3eaaa57acc75d1bd29c3a59f167215c90603e790c5658b2d7887254ff80630122ab5578083556351edf1cffb7e42775a5ef79b2ff6cad7a1b8f32a7704bdaad7d63844b7cb7a295155fd8643044c3a83f867d427511e352079f578f00fa55575445e4af5c6e42500d0e4ffeb718e13076d9531195bcc36333960060830496256702c20df4759c74cba389ad73001f166a3b6c2d9e69d2b3bf86a5f929c79d17483164d76cb43f8723cda7648cd37e5d9d3aaa5cf9d077a6f3a1135e3e62feac9d0a0d8c15d6cade7ed6d2b568f89f74d6892d645c89bbf1429cce33e525c4d151a0a4e9192fb6737f151d5b460c4915ba57e3fec3b537aed97ca425f58a81beb3144b5898e27905ae56539c97b9994cffdb9e4bd91a600dd02c2ab3c9d8c668ee077a2f1f58c8ab7d0db0333190c59d37ad615dc3029faed93f31a4334a1ea29bf7b53f3d9415b8b760891a4a649a92781eb0568d5442b65e574193f040af56e5d33d2e6a47da09b7bb8c2\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 34e1788aadfc237f7896f530426725bf06a553fad96003cf7f6dc90dc6ecf745ea1c6ed5facf0fed6a0b88f9eaea6895b6bdd4a6e79f114a75a01be620eb5eb782431bb58feef95956cfea2b5fbfcbca452f65ea049663639e996e35ef37c27987015ed3af600598543f1faef183199ceaecf01ef86b026e974721a94a549aff6545f42197df772729797f4b6c6dc7f500106a793993216d5a356104a72c880f8e55343bc4593f13f988834c03c45101a4c1b27ef8ade0b56c4df4592654c32289a706d7afd7095e7f8a7846d2607d12a409c67fff8a3997e4d6963abb979d51dba6c5be5e58b105738744acbffb6ebf7428ae4599318948767b40c831ea810f5d11cd3de09a066093205e852ebc663b0b970497c64081d1ac6a418289f7ac2eb755cad07390c553bdd82ff5dacd2937bedec7d84f820e054a3ec16ba447a8c25325c0f1cf1b8df93443c56947f5c9c8ba2eed73d379583fd6c57ecf4f70e1b899cdbff6c6d80834e8e88440cc8bb2596cb26df266544326c5a15b4e6fcd6f3296994ff3887898d95a0d32f92d179c3d1dedac8e2eab8e097770a0b35e886c2fe65fbf9766e397b746a2819d1e1d4f8eec4f7354e504310241bf6becf0b84d21a2b41ac6fa5ada51cde86b8151c409d642bde0307fc732de16476995628f79bf02295929e220e2a16dc17c6b271be629cbdd43823e0ac5a25c4596400b0b2f2a\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = a79151876e4e870920cd837bdf756398cf9929bc47dd5d082916cb622c05b52f2d02406960c2eccbd387b722303d5de1edb4f0a2ec2ac82fe2842dc6b321bb1ac772270997594460bb14d9ac27c3fa7c17ffc987035a30784e0817b4a90fdbcbecddfcbdda814b2296b2fa976199c2cfe8e2567a56b100aeadc571b8172f05eabfe8e10b302fb3dca6079c387914430e64f32c5267dd41782fda4e134e691eb4455656f740048640e3bb1226d47f04c973236a2c0a864cb1bf0dd354f47df45486c60ee8fd931328d8298aa77dc561c394dc337b418d4c41040fc3f15fe72d3b6ef9d3c582c939b6a33692b8032ef32e025683b015c276161e526c19c3e4223e71460918c03c31496e8eae68fa97850b051208e2a989a8e53beff882484992fe9b5c47a4f72849aa8d7896adf4592736e31940c714f8198101d123b72c2715a18e8d58d2c3d7d0d3a36c303f62ffa1abb5f8ca057aa5c4030af66b931fc6bf80389d84dfc1af44dd69e73bfe22f76ae6c0da7f936f06f652a9432697a94bdc2f869f8ce2338cc938cbc2c7809a4000666002bc351ffbce64a860d7e00bfb1083c47a2cde7ba67ba5829769b0bd63d0f2277f000faec93e225234e3cdf1a3c41c8a327f67d41eacea3a7ba3dac55072429f47226d95c235857739027b85a9462e7a9906d8908e5c7f25f0efe596ee4c05a22b611a33580054686f6dc17e930a41\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 313233343030\nresult = invalid\nsig = 18318a9ed077357126cea3c22f6dddd974",
@@ -4357,9 +4456,9 @@
     "53c9c132c0ff27435a6baf40d77b7a52ad8e8ee7ed6f0d6524cdf060e3e843b538e586facd8a5f5f3dd97712ef426f229d803ac6d6ee6567ebd0ccc467b2301f567c92e1c4731a4134c18edc00c55779d7a34a6c155823320914157fe9d7226907a7750bb78f7b6b61b134c18133de7dd4357a7763f88fd3886d95d47449a6385243cde3bfb975738e96078cf8759d516b31268c0052045635ce50f8805ff0\n\n# tcId = 227\n# CVE-2017-11185: signature=n\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3\n\n# tcId = 228\n# the signature is 2 bytes too long\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30000\n\n# tcId = 229\n# the signature is empty\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 230\n# the signature has value 0\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 231\n# the signature has value 1\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 232\n# the signature has value 2\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 233\n# the signature has value n-1\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2\n\n# tcId = 234\n# the signature has value n+1\nmsg = 313233343030\nresult = invalid\nsig = c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d4\n\n# tcId = ",
     "235\n# the signature has value -1\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 236\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 9e591980e9ec3d62e2edc3163ac8206fc09fe026a2f7e622dc5a6d02976d30ecf141295335008d91a223ee98a143541494ccf7cb06a1aa61de524fb5bb4b379a67ed2ced447c7b395c57a625f835dec6844c3b67a85aaae10e273d3902f5f30539711f98d73f86beccd798b98541a84a03ccb3379e8eff88c19c88aac7b7ea99758194ffa6660153d4f22c1252dd1b7b574e19b3492f28cc097d3ee3f30f6b88576bc6299512f9f8749e0b297295bc275ca59f8056decfca9f3980e6f8d6e07b73e1a8ae8b3847556cd67ab77b96618979ed37744be2d6bc9f2b671615f1d4c4c1b419f05036148182ad4c6375f9e3c7cb37bb75d16c4486e97c0ac5685995cd8e5d76452934b26105be9074b2f8daeb1add13c9b127dca2858e5c80e686791a6f98cd98e540bdf27d21b2dc9fc84e09561df968d73c190b3081293d666be7d991761f4722450ac249a6eb4bcdf190c214630c85243a6c5970184e257c00c5a2a18bcd20195fd041887f001e06d4a6049e210cce62356f99853f3da2522d3d63739fbb2ff315e68ab4a05ba1e29e5b93808df51aeaced52539d7b956db2f229999ac09a6d4c2ef8714ef9d4783f538559f29af9d850bf71b001f231270874fb8dc60f1d1554f60fa69cd657112530e22563fcde26c3c86137e476a2fc1d8ba4a15dda42d4d8a20fbbad7586f472b716d6ea2ee30f1c111bdbb3db8e5e2d933a8\n\n# tcId = 237\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 23e198d582d048874ce4e6e69f5a81234ca08be1fc9cf0f7be05454997fad87da8f05c2faf7285a7a9ca7aa50f772b8175479b7bec85919162b8a7eb7cd4c1b8f0aaa64a8f371e23ec2c3428d7d83411f24bbd4b80762a75fa0e5de468a71dbe9bac382b4072241e3c7085ed2b9e72ec3779c1f70bbd0f246834f3e81ebffee13312d133e1ddaeb58b84d1ac1b441f311ee1e2c9693e300862cdf5b4a5d820dfde870da22746be0b12dfb943780c0ba928c657c54bea0d84db37fe50f0965ceab905f2ec3ff177421b11c30e846ad93212485e7f6e52d7d51af1c96f31fef174ab38cfb1b1fb5961cfadac518a6a4991ff2d561a7d8dadc5ad430c94b40c04a297012f81e6e84ca02879fd82b73744c4372ec02f141ae6c4ce75595559f3f4cc9e4b7a7a6d93636487e34938082b3fd5f09366a062484d1820586a720a9618ec18d980c969a28d74c81fe4fe7bb61986769a89716c965a7f056aff60e9175527778210eae23e53e244b973b2452f40ab375222621a89e1f5f2abfe5039708f2a659553582f760f0d264f854840d069e8c4db0246738af1697b05980c1f53a1ba4eef8e08583781c13a93d03eb19db75e71bdd0602b91908a885b41f0b8d9588d6e05796c8a6f8d220922ef9bcdb026af9bb328ac7d96d4078205ba1abf00eea45b9c260e3b55da036864bf5bc0cc2d3944fdbcc7e64539a45238bb2061210514\n\n# tcId = 238\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea144143\n\n# tcId = 239\n# RSASSA-PSS signature\nmsg = 313233343030\nresult = invalid\nsig = 727f107d20a02c2a2e530a78fdcc8ee88816badea1204d4c6a3b116776217f86f6fce6612cacb44aa288991146675cc0907094b5f90a06f0e940c886c07b5157605102c670aa9927fd0f2222b737890d1cb905f0fe4b47e67d254e6fef0f2004be64c94ba630839199b3656abe2c6eb59e84584bb652a181a64895d52d46aaebcb46bdd5eca4655eee4c340649a49a5eed60a2d3c95762bf825f622bc48d05fd6813393d39021c0db5b2104186f5cd00b203b43ca839c192755b40a8d946d1db6b0d2d7df6ec6929e5655396d935ce9d45bd7364b1e8e2bbc316918d33caf6a08ff1c8404fb66cc679f03f9ed6c5997f72e52da5df41af58893129bccf2fe3f2ab7173fa227f24c30438e064c0c1e99d3ab9bcc929391893187b9683cc1026546b6d21c02fed28fe1c43bf1eb679faa560375d445af434fdc2794ea44fea6445a8e89ed6c14379f756070227b20cc2c0add3a6709be39680eee5efac9697f45d2122a51ee64f9ae310c6a9b85d0b300528b858581d59e59c7755a0764c59cb81d355396042cf8150c91376660bc737d33144fa7b6d7231fbd43c16a79d06de0fd18a53415acb352065cf169e82abf94a3337e6b525ddc3d25eb6516208e9f832168faf3c3a224612c9791369ba2ab85a701e8332b738bf2942cd20975d2edac2ece8568d101ab8602d58fbdf652580b5008b499aa06062bb99697c41ce8e34bb\n\n",
 };
-static const size_t kLen174 = 275879;
+static const size_t kLen190 = 275879;
 
-static const char *kData174[] = {
+static const char *kData190[] = {
     "# Imported from Wycheproof's rsa_signature_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASSA-PKCS1-v1_5\n# Generator version: 0.8r12\n\n[e = 010001]\n[keyAsn = 3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keyDer = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001]\n[keysize = 2048]\n[n = 00bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7]\n[sha = SHA-256]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = 9f420516e9d063e5e2961accd80e3eb0198b10f4d64e749b5bd39a80f7356d2ca0fdbbfe5f5b2bba92da7616a83912b449e69f8ce6e35a27e9e553279d6a9317a1d07d897dddd9a8291321359c6a8a31a4ad7dbb54432bebaffbe8940e40cc875d941ecaa10196e1aa68b83e0db67e34f3937dc1dd11cc0e5b40cdb0b90ecdcad793d7279dc5b5f6cb356b805e6357baa1b3659dbbdfc9a0f042131760fe1b78202f289699e04b5c55f3ec26fa25460ce3de5aeff0b1f5c435e022e1168f9fb86147e7a8b0f11cd988d59c81c3fe74116b350e0396b1cdb2b4e0326b5c90dc384529c7f794c4c2f40958f97ea203d76a75076d5360228e7ddf166842b9165e8e\n\n# tcId = 2\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = b4e0a273bbf6e942cb22ae5ccbfd9d843400ba451c5e086fce9b3b1f90bd892fadc54ac45b61f3b3b37aca67d835fda1b37d5bec427382be2348062716d4592c7eb5c9107cf391e1cec01c74d64dfa5cb7052f2f8e442a09d21c22ef5484cb045c25a05b3057b266335f619ea8dc43b72e9abf38c19b5d71c21b9bf2eb8b63f2fe0fa868f7dbc9deae9745adb1fc26027bf5e2770b2d250c7507faf2fa63fabc67eeada9f2ed8f724dbd99d43294e5ec11d1575101d32af1a308abb56f7f15f544204b533fbd96fd3fe9174db3bc2af67c35401cc4003bbce360a7898dc831011ff0582c0658663a8c2e7c0e7a0df7f3c8ef95175bc136c3b49eb7a65023b08f\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 9f74957ef2ec67062c5064143d096610d04af16f23189bf010f560d49bd793d619f70125dbef4edb4d4c923f8447e48a744428d8b463745d84a718d3c5592cdf6f611a735c7e04fe3f89920cc61e0113df20b93c719df7cf62013a2db3b497c033704352519dd51975eb156ee733d7bb342093bf494e6d7c8e92537adaf8b9170c0a2f0d76af847f716ecc87e8cd3545151387cafe062d5a2db83c5463b84d13b1ede8656efb3ae9509b449f4676084042b7c9091fb75476c8a866bbdbe57e125d7c64f2f7f1d4f732666bc7ac09c8e767d145f22243dd1f10943aa61b75e85256c52c522426c1dafde98af977c8538f7441ccdbb4eabff1990304c087070b12\n\n# tcId = 4\nmsg = 313233343030\nresult = valid\nsig = 257d5214d02f48bf63a6a1f2604824bef64108af97a6032d9eab48b7964642e104f13c462289fa889109274360dfedaec2ace0f5f190d2e9ba0d2d522dc763dd60fcee52d513bf9ca7c0b29de279ca8b401bc2016c10d837cca56498dd644e4d350315819767e2908c1c33b71acecd0143e2913f9eec1978a900a3326bd8bb7574521c39efa2e987327c9343b9da06b304d1e4688ef80e6c285a6dfb64b57ffbfc786f69a2a1c0948ee6781dae288089a5dcb7fcb1e53a74b828b34867b8d7fb5a0151e43076772bd53a537937f8ad6e44adcf96a18181b460b63e530edc56a773fa3adb252cfc8bb664ca560a054f374c2a03d7532ac8986377b76ad0a4f1d6\n\n# tcId = 5\nmsg = 4d657373616765\nresult = valid\nsig = 339b527aeec23ed9319d5c5ee671e8e92fde09932648734b1ded4eeae420e113a7ff1119686aef90c0bea5248ee1d50f5081515fba7a68a7ac8e2ba9828ebd58237d211c8212267f2a82363ffe790e3ad5282bef3842ead902cd98194d440cd1a53cc34121862034670dffd82aff9bda7f867a3893c2ba2d60cd3d5a3ae1c446c718e99bda195e8b19af734786c62908e1e18b155dbf791283c1bf3e02ce009e08415444d56f5defe78200557d513c8d93414228c4b746a10262cc4dc573da6801f624c5d99c200bd5731142e49d69f9cc9d6d914be18d09bcff4411f62bf028223ea559a41c71a970f5e0010ae487db94461a662d56e124d7b275e8266e55f0\n\n# tcId = 6\nmsg = 61\nresult = valid\nsig = 6ea7297a28c575e4348878b928d6e938a2e3d77dc46a785611a64817fa0e9c8ec71728bc7e8f9eb3268aae0f3bfa23dcb73d503e0147432b4003400167ddf2f9fc8d09464e0b91a44de12c1efc8c38732e1ed87f91cebae036610c43a3b8bcd5bb4beac4f9fb5e39f193cfd4bc00d4c7a3a98d00c4efcd1bd64f260a2a957fc730df6dba68d622441901c51f5788d6c3636299ed3eaf0bc23000650ca97ed62d367a844f23649bdc23efd0349dc8d58cdbcf655aad1f9d3a21afa02930d68a2c2db68e364b0966b005c460b682717035fd43f0cb0e7008a3d841a90c0449de8d154082703313cd9abdcc836e6c1ae5b1887f75d2e4b6387e7971128790a62c00\n\n# tcId = 7\nmsg = e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\nresult = valid\nsig = 5a7186589cda0f9fb081dad864032ffd26a775fb33c7dae0ac080aebdd4ab53bc3ed37cc09f0a1b1edee78f0790ce0d1b656e4a788172db08900bb1474159937ad29a7899d6bbc87c743945c798307e61141ac21542af06bc2f435a47b505b2aad2619800a97396392f141772cfa97d762c42ee8afdef27617dc8056fe75b23ede6c8f4e9abe31c8344edd2c73e5304621283021ae7003cd760c3e34caec5b4b5cc6d291cff1ea80e5b9b68c5b7b045c04714d3dc73e150eb770d3d3ed788a4ed039117881ed5cd03eb3db6e4084679e09078110630aa6895029e7a6dd19d5b77952bbb06de26c2179fb06c64d184caee0079287c7b18f5ae7843e3cd01eae28\n\n# tcId = 8\n# Legacy:missing NULL\nmsg = 54657374\nresult = acceptable\nsig = 38e80b028443d96685ed76d4574b36c43cf9722e5fbcf08bc974385454316dee326a308c935a6e612ed26ef4e470e5f3f19a223e2866a2f1c805f74c804e2184f5620c1e84f894b890be7d46420178a2a5ad97b4bd3d31db24828281587207041a96792d8ee57889c666719c769f759c2175361434b18f188de387c8c13f6fb3a7e96f1abbb6124e94fbb4c6bc1d88caf54136b8f01c9eedfd614bc35375f33277d2e71a4dc5f65254179bbe75634e9dfe05aff9e1f1d792f4e6caf88e4299ed90d212d3d7ac9bfc71a8ac85ffbf2f49f77b41d36a64bccd3fe8948054cbad480451b0ca5f7fe35b0f6c772d64b70346f469808dc0057ba1c25c6ae7ac8450e9\nflags = MissingNull\n\n# tcId = 9\n# long form encoding of length of sequence\nmsg = 54657374\nresult = invalid\nsig = 33a82ebc17f79f56f79073afbe0ff3f984f868684c529ecfffb3bfffaf52a99bfc057b196c3faeae3cf722c386c224ac235f781d9025ff8c9dcf10c4cc7f93c1f1aa5e1db9b166a71ac7350134ae1a1e5537a67f846f8c6970c269c4b91bc59ec783b7710afbd763ae42b1125eb9d0fc28b4045071c72320448a474006eefb256bb403b30a67c253028a2a0af7e4e36e85aa70ea73541ee2694d2bbe1415b37d2210def5ec77ba23c6f5cbe31ee21e072b49313e6e18bc6d6f2ffbd6b28267a5cdda24a62edd2151bff87ea6858db5b863c13a8e2a6445d8d31fd6b3ce8fa5a31060f97545f1e04df6819648a1933b1bcfa2470bb14844963f53175f1b26b612\n\n# tcId = 10\n# long form encoding of length of sequence\nmsg = 54657374\nresult = invalid\nsig = 37c62aaa10e8cb4bcce5fe466ac8688431e8ad2105dc12c6b7a0dfe8657ef3dbd027d04847c7d708c2099d7d38ca2b21aa5146ec0ffc7fd1a44c91c24689fa37475013e5b30c92c3565e3d53afa73fcf269dcf3b2bfc48a2ff026130bc008a724cd29ffc546d1aea5aeefc8cd13779b3b821d78bc7b7664fc7a89ce0273a8eed1e4a683c739005640c2edb756ea95f48d9c91d1ae9f57f24f6ce3193cedbcc52d05eb0dc8a9634a0ca8e12a446e9ac3378cfabc37b498aa4a1a9d1d3a6fb308411566f9c68063c0bc8e78621fed3a22073260aa87c76c5768c3db7f674f84d8826381fc3491f46d417a73ab88587d905d1c090e37913c99cfe29dae491841d31\n\n# tcId = 11\n# length of sequence contains leading 0\nmsg = 54657374\nresult = invalid\nsig = ac3c440334308e0eef1b3c3afb42dd050c77f1bfe9f3c3c83d466a46bf708502f1866f423d52866147554a5c9f86f10c079d2bd47192dce0968e8aefd5f43a2892ad21b0bdb92be45bc380c11565ac7c01be00cb1e294048a1efb4cbb19be44fa4b542e0bbf9a47549d09e456f58ff377adafbd68ef8d86dc2d7d56c5d3be08ec6cf12c0d04bb7c64c13f08f75377ba896bece7f409d50809521b7f6496c992c90ce15a70a8f8096f8f2cbd3e575acb618c87f5632",
     "4885cea1a6ded33d2f09d684f8d5a98c78f94853d74b9e6ab503918fea323e5534d3e45d51b3097e082c5da614d03a5ac422e5dcc3b764bbc02aa633a517bbe391d2662d71ab851e4eb3f5\n\n# tcId = 12\n# length of sequence contains leading 0\nmsg = 54657374\nresult = invalid\nsig = 65fa4957fe03c0eb8a6680ede12f009178d3ce357927c8586ae056f209e0ab0c110871fdf0b95a2ff684748beb4e5a6a73ca3c657b23bfa06d362a300f260f4d60d459a066c9f5311d634bf96ac7ee4c80ffec2fca27eca7dbd37025bae76122a1fed1914da70f2bfb6bf2e1bf3a624acf2a6377606fbf06044a21a39ccd55b2cc1f0ff184d9df95bd73942a190f30028e770139d38ef3156f64fc3eec68ed5170c41f09f110f5a0fd195cd42c4dd8e394f32d195c159c7c2b69943ea966039b20c7ca17cec610be60aaf7ecdf3511590a662b74a181fb89135604d84cf9c4d6cb6cc0b4c24f4b5e7e9e9cd969855cdb92e3b399f32cb31319ac81701d056e84\n\n# tcId = 13\n# wrong length of sequence\nmsg = 54657374\nresult = invalid\nsig = 36f62f546a36d5215548e6a770a14fc6edd4a9353ff8ed6231369cbb6598d25d86018b8cea9f1a87c150fda18c7e89b2c907f0ce485c8c321be467a97febc05dce335db88cabdb99ebc4c187a04fdc8e879487f03c2aeccb6ddaf006f0613d32b197c79b2a8cfae015909e02746fecb9ae9da3f07ee91ba70c0356984dd15d078cd0b93dd9e3c1cc03d6f255c1383e6e949e529ca4408f0f453e7e94c17e9b47f841f73dd62e5be047c44e1d9d7eee0d9f2a56bab13d4397494812793a49e8dc0d237242bf134aaead8f303226e532afd0c2e9748be08d7b7fd74f6f1806cfc4092af39d6eada4e0b6d7aa6f06592f6cd7dd26c1fcc84fdff1bf3086e8e2c81b\n\n# tcId = 14\n# wrong length of sequence\nmsg = 54657374\nresult = invalid\nsig = 6e18d86059eb2f05c0c1277abcd8d2380ea39ea0c4587ae140d2f709363eaa2b0b7f801a75fbe15aa329129c4abe43ec0fd84f552a3aff7e4de40a5943ef13cc3b2d02a1ad90309e8091d5c2c6fe3b6dc2472c94116cd9adf367e575720906a9fe41068a86c15214e3dae39ac41b84f5fb824dbf5c911c8c640254cd19910e15a6488c2a59179f271dbde468d540cb33dd5add9a864780e27a3e55c87402d9e2c0e12d70c9a41681bda6f9f337e7a26dd2ec06580e6fd9cd4db40a62002feaf5a4c93dfe05dc392b63809d4caebdcdac74a7a240260a6eb8db8dcbf25527d4297e4c6145decb0a888817b4f949fb66ee63e5cb2c2477a9373d1e30b4d71cd7c1\n\n# tcId = 15\n# wrong length of sequence\nmsg = 54657374\nresult = invalid\nsig = 61a6e5ea6b3c5241d75dbf0cb397da7cd9d5b2c23ffefa183ddd1d34b6cf116b127045f4681877fd58907c1209528a6b45266cfd5bf4e95361b9036c77fd6cc7891cb2417d081ed897ab97588dfcf975992ac9c0239aa9fc19dcf6d6d0f3e4bf72da5ab09cdd4b205b41a27e6b36dff608a638925d13e3ad7143b1ea9a2758c787a2f33790ad423749c1b79b3239d1f96fc4690b19a0b8edbeff446b148fbf39a890ed8e4a18ea09d5e50c25855e1a4a4c28c5437c906d1a9c371569936c858c29bd16e98af749edf2f048933d706068928e81ac7e219fc923f6dee8a411f40ede593468ada31e5c647d4a576ddb68a335bd50cdf7446dc722ee711b5c71ae93\n\n# tcId = 16\n# wrong length of sequence\nmsg = 54657374\nresult = invalid\nsig = 6494a47f97d18199ce0948b2ddf81e408e2d4acd58705059454b728b1be79842ca8b9e197a29347bfc02a6830aa7189ccd84469e696daed24fd3e45a403af6d38a2bf3e5e8005b9535a00a5b1520a9665676aa51a1b274a3c0270a20b86a5168e08000fc4cc60673604564f8620e9a2a2374ae148ec6fdbf7e880fb8be7bd85131a3b2cc08e85ff3270a4b433a6f58583a16e5b18eb2a093e6249e0e5e27c13e1cfc3fb8e078ede70034f52f4540f5fc69dc9124671200c5dc6961aee740d39bb5b6ea9f9325f2dc9eb85be46b998b29ed3dd9c7169d58e33efc212c9cc0b09e356e65463b9becc52e7654cb22a374832ad6d4e219e0fc5eddec8debf779031f\n\n# tcId = 17\n# uint32 overflow in length of sequence\nmsg = 54657374\nresult = invalid\nsig = 55d1cee3129381d3c8526661a5f2c9b59bef9972a8d3ecbddd3cd859db06be0971a181d9deb7a7333b3f40eab2e93a67342da7880961fa3b931b3ee94cfa5eb7cc76ca8f6f013bda5b1dff7a7d8ec7afa76fc6acb7809b411e8d77e97fd11f4d13af1033a04b949ce35efdc52e125394759df4f7658fb4c807823f80c01b74c5424744a39193c901a8b7238f77c330f0c37877cdfb493228a600dbb5694ccaf9521b0e2921cf84fb0a778d6616ea76f79d89ddb344834bb34a033f2399289c35ba4b5b70b1aa6d504db3f15cd1be6215678f01f3df03a3a38cd2f6e9d18755c484b4b4ee514c976a7a3edb9d93f475c4fcfa6fec43e6f815095d4dda75a5ec81\n\n# tcId = 18\n# uint32 overflow in length of sequence\nmsg = 54657374\nresult = invalid\nsig = 759135e8b8f94d853d92e75bed21033eaa80c88e1cfa202aeaeee96fc9dd8f5430da9baa436062c843e2a6d06801e4397c93a7643b52e4e33c298638f546be9f8b2961c0da08a172ab2a9185eec9b9b859a8b46cb240317e66469882269a53b34c9db60ba080e1831942db3ad65d3779c7205aaa366c00b6372496d71fd5cebc14b885303fb7c9e968f7d4f9f0511bac5f273608c8803db4ce582eddb0c672d579b4d1d67cb5aaa4fcaa14d744acb8124f3715bb82417ca020cb1b2a597f149364f859d5f1dc17dde4181628b96438df017e9b96b87f45d40383badf6b6a89620adf601c9c4fee15b1a868f8bf7ed6f59d1f9a960fcc1d961c8d010002e238f3\n\n# tcId = 19\n# uint64 overflow in length of sequence\nmsg = 54657374\nresult = invalid\nsig = 8fcf0a72c6fd0f9b505effcd2c074051f1d25840f8803a68f1c149dc43af6b94a114efa7ce2b399a91aba823470b9f32a70fb6631dfef593dd312801062c7f64d7c7b8724bcd36b05df16838f9e2ef209c2dfa180717d9d1bb59c10d30bdf6a0c0041ff395d4eee8a1c60af17b8152906a58786ab39840909508f7a8f3a05096e92eb57b31c07e79500091f119698bf31bd14399e122e16c3f0083d0a9a6f6413a8427dd27dd5473a9060450349f51ac265030778dbb04d4a35aa98dd72ea38a548be905717b46a1e31cc0b2c9247b7a64d26c027b7d09fdc5f2c6f3f625ecc3a5e07e37d2623b099aa776c48c66d62764def44896651c6b0ab10f1db7105f8c\n\n# tcId = 20\n# uint64 overflow in length of sequence\nmsg = 54657374\nresult = invalid\nsig = a34534b9e1b82be8c7a70d643c85664cb3919ced9c6b6cbf470f4aa8c62194d3e287077d3dc03e9e49d9069b69a4fc2caa5c9fc0ff1f08cb9b8370d044baa4be1b5918174997d74579c791a4c9d53f0348d33b6dd9151ec11823fa765a04cf03791f9d8f89048bd702f03247e3d9ea4e9882d9c768166e60b2db47a1bd76dd8cde45933dd1e4c3fd2bd46bbb8b2fbd6a2630f9db7e09dc342a3e279927a68f3da34192d0a283e2df7530b06a42ad1680b4a33c8b4bed2a8e799ff39ce4c5853a2f9d016610e58ce819771cd0ca5cc286134fafdcf36eb6c0f198e312e0e2cf722c47487a43cf4630c0703e65f5cc23972d5c16012b0e338aa6bbaa9a6110bb7b\n\n# tcId = 21\n# length of sequence = 2**31 - 1\nmsg = 54657374\nresult = invalid\nsig = 87bff62986cb2cd250de8d56fb4674c65cafd441da9dd4e42b1e7e14231519b63fa59608cd70d3ad761fdba810993ab3da3ba5d182dabefdce2c383e153df2b21c4cd4b58ea94e353d8c02bcfef4d565cda92975610207c9c30754cbe22bfe0f7cebaad0b6fe1d470d9119090adde8587d15cf27965f525d92ccb2c8778261f9d126ffdd8b90bd00acbe648979567a3ecb1fb5ceae06bbfb1df595e2155889ce62b3b47bce372a7527fd59ab5dca37378d0a90f4487690385acadea3766fa407d277ce4e76416daaeeba1591aa31dc601efd0d9e29b50ccc68d1511581b00f75de4c05d145b7ce0f74ccc509748fb1f8c636e1a56c9c412142d5c9a95efd0b8d\n\n# tcId = 22\n# length of sequence = 2**31 - 1\nmsg = 54657374\nresult = invalid\nsig = 2fadb8a429803ec2956ae6012289f15f7ed8d535c07412994204ade72d2e7a5548024390e1356d432b7e68c1a8738382f5aef3cc7739f926b44f9b9905222323a97fe7b303c130eb4147a5a4c69a031bd0c459779f7c3bc00bd5ad616421d14aa90ff3f5f4f700efd19826d89c80c6c4ab4ec81ec05498bb543be74acb3f61e6e1bef48e61646ab962da08502fb092961c5fb324026a52abfd1c47b9ea76187f5134916c5dbfc18668933c2a562a02c102b6efb9ca2df40869e920e84f8e73668a73c1cea83bc8600f7dbadeb5babfa74b99a3d02794b924b01dbf087da3d8d579514647633d8d6922a59a3f5625687a4b1c3b5cc67858e9b78ebbc7adc20aa7\n\n# tcId = 23\n# length of sequence = 2**32 - 1\nmsg = 54657374\nresult = invalid\nsig = 85ec33234ac05061985a24bd9e5e13de3fc8e8c246f75d85abf8021cd993f97c38ec6b73d713c6417effc7a751530feff849a5591ca0c4e6dc5bf6bf97c34bace7faa2e448bbc81e3d8551d4f82f7ed095ecdb19e91498e357909f090fd8c215f830b2741a4a4af518341c312bd6f7fef9c1b563cd4284f785430c538234f6bd3fceb2b49ab872cb481447b2d45a37d45dafad4d6de26246634b99b926e37832a8302d24b35e315f0b971cf52c60ac486460d7678152beff5369441c84ed54f16177f5ae560eacac13d7f94f14764ecd42adeaa0599a1a47e7f500e6b14e0a3b198aaa18fdc6d9141932bb28b20e71f69c173c2b841fa042a3fa0a388e164fd3\n\n# tcId = 24\n# length of sequence = 2**32 - 1\nmsg = 54657374\nresult = invalid\nsig = 4d28f0c7915b1eb63badbd931675ecf29f8d69b4b2e1b1fad776fa5adbccdc17bde98029059d46b197de49e061ec57cce2cb77a63deec3c75c2cc14fc9bb4a2ac29d5f4a05e6b4ff97ecbcc26a0dce39760423740141e675b52878a83aa044f68e84d9abd0ea6bfc5e6fc3acd971af258b7b9a01079010e68e70bd7bd31a9f9bdbb70598758ba274fb8feeb8ff46a4b2331a4da03330cf55910e6ce940c1a95b6bee9adec351354774139e3b213627a6d7e8381656362b4c6f83e97f93630939d22763f0850f1b4d38a8e3ed213d2febeeb125ec03854a4b276fb59087904ffabe83cfa66c1af413af6ecde5efcbc5241d5b958425b66ccd31500ceb9b80d793\n\n# tcId = 25\n# length of sequence = 2**40 - 1\nmsg = 54657374\nresult = invalid\nsig = 02d431509bae6e097fffb5e719b16a296b81fcfc9fc6a64b85b337c88049fed54971ef61e635388c2653554685e652059c769c5947af49858439d9c388a40703a016f73cf231726853f498f94a0a9a98e14e0cf8f0c8284b4d992f00c",
     "bb8dde41b07679c7bb7a2b4b7b307f2edda65fe3e002c7235eb85dd2ba41483b26131c997793ed64fe92a9fa9198eead1e8506385db0c3c4dfb93b87e2cfc09d9d3b00937cfc0a35bc211cc8efa4de83745c5eb0bb28ae52a22ae4ec8712be72bcf420476fdada50b618f0e9576e3e7ad8df5a0ebab78b1bfcdcef594cb7ff56a895b5ab5e0a30f82453880d394bad6ddb92231e44aa275f945ba6220d9f226da4d0aaf\n\n# tcId = 26\n# length of sequence = 2**40 - 1\nmsg = 54657374\nresult = invalid\nsig = 665e80a08c78f4c8a2768d1ba374bdd5e5101e61a594300a18a071d7c98c68cdb73acf32831ea077734e2486f1b13f76cd779a80fedbd76716fd022006a6faee19cb9789359e5b7013a59cd671a2a91c8328f4a1697e14a085c897eb45692d0bec074b400ded2820c6a5dbee2feac84cb6a37baece0ce763dfa7ca3b3fd4a82863a0eb35fcff709ca401c0bbb73f27f251b627cc442dd43eea634942bcd8bd72f1e8f192ae8dec1b7275c7739db254ced8b57332407f8a85285a190c94ea7f1c9318b7fcf67369ed23243c2454dd2ffa153ef12074a842878b38695336e8acfebf2d56d3560e43cdb039c27b207ae35f7a527b05baffc73fe76e57813b484f00\n\n# tcId = 27\n# length of sequence = 2**64 - 1\nmsg = 54657374\nresult = invalid\nsig = 58bb9a11f29ec8bc8ec7bba4c056e09087fcc881d8fe8e5dc58fa74d979676a20e00468e16238d8e2a53e40b4952ae47cc857807558b12224b3ab06ae355fbbd35180e555d7d468c23c6466ae74c8003d2b1591fbd529cc479e7469f5645787b8d7baaedb089efacf7f4395cc1382a3068770530ae97729089100960f22a13d73883a3a5ce6867c77a9e833d60f8f3c79fc2f36e63cbde5a02cdb7e226f387588456b9161814abb84c638aafb44f293e19f1bd5093e36d68386e365a5ab076b64275880823bb77502924d26bf443e94e45921866c68edaf5e66b24df38155b6faa25e531eb1af900780413cf5d5d903146a9cfe9350a3a1509beb679d7b75cd6\n\n# tcId = 28\n# length of sequence = 2**64 - 1\nmsg = 54657374\nresult = invalid\nsig = ab35fb3939affc42b2ac00248105dbd3da37b59db5d489d1ab1962418e6bec3b6fb4dbc03fb47c2a64cd09fee70acd723a50402b47cc2a3411c716a1f380138511d693751e37a0bf23751488293a68382a909202b7d18dc3721521f9c8fa3554dac15b20ce5ff9638edeba6ae89afaa100cfc92f51326b82e8fea27ca216b8b953afe00d0a02c0df5ec76ac494c1ed3398144a2654570d8daebfb27dc698bb5fc3a69e7b3759c1f1c7d5e807f509185a17b642f8b24934b5efef55287dff737fe633f19e0d1af46a0b4675b300583f96a3670b1e50f1c27441b5e601b8c4cee015854d680ab544900e65f4e205e2666ac0087586012d8ae52711a9cda02ee520\n\n# tcId = 29\n# incorrect length of sequence\nmsg = 54657374\nresult = invalid\nsig = 3f9ed26d39ea6b13377ba941923d1c55544c4ef8c9187dc6430eb1e7c8b86292e528fbc74b7876016ff3cf8014da3d85f37e975810c0a7a8996c91533567e40b0c8464de887b18c9adf84571f7703147cee96c81e5eaa61cb3c40840d21cc0a280991173d5fb1cce01514003bec10e28420ba01819ff003d9ca8658f41a6e02c3295a53613adac27ddbe959d90faa58e33c3326c4b5b6a5a015955541531fc62ea216a4dc54878b65e6a12e0fd548046e103d8dd4516bcebf008ae4d5b971e9e2eecc8379356ebf76b69943b6f0d87ccdc19036007f7c79f363ace8e85bb97c40f7b59bbeacba0325decf642cc8cb8e51efb55a7296bb23bb12a3a1b334f5ca8\n\n# tcId = 30\n# incorrect length of sequence\nmsg = 54657374\nresult = invalid\nsig = 748e7f86340f83dfe05a19e73449b7814398c6951a649029509c3072b6ce053e6176453d9046677e4996ea9a490fd602d8a735042b29d2a17f997817c6d9600bea2d5f7d7129a361bac6b7f76df520f4971790d250fbf89df5c22bb9e7a510bb6fcbd18251fcc5b77d61128f27adb3784c9c363eedd2c0acf9fbff65c9b4c67d631c98ec6ad6ce56389420a9f7e78973e3b55c90b3c3a6b37ffaa74ced4889cf306eb75e87d4b34519a349d1b7842f81eb588c3137e80895fbb98d67fda3621c7510815a5d5ae512e6566088dc333107a3a6f4309d6dda5417bfa795c72d4e70253775afeda3940d4bedb9a094502e1bd90084cae6f66c5f0369d3ca6a00d4f0\n\n# tcId = 31\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 672bf0ea5541b809287c9e2b6a584da21271f24d58eb68cf2dca42f604bf3d62fa9d5a52ea20e234002ceda5bd919ee8ff344c8f84e2cf4d8efc511560e03f930b6533cce2ebaf14203401317fa8b0fd17807389b3c5449ba24a8a1f16d143ad06c1dc62c5c40facabe64faf0a9816d51a831b648ae9c99b465535b342085ebb1aa44ad23c08bf4dd9e0838209d4805f48cb16d9bca302d161ec3f6e66ac734f001e232c3133558c4b89c00eba40bd53c37c5b03ff6fb3f323d0b79510592141946a7a7b16abfa78ab81d886d7c4d4090bdcb782efbf0c4a76b47abb18e1fc9259cee098929a1843a04ba52704bc9be25a2b96779a2b647d3ba7c11e2a8dfe48\n\n# tcId = 32\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 94818574cddac115d352d1740c4e5581ce36f1eac658a7cc9c0fa26a1d6f5f43279c9f2af313b3e0df805ac1e24976d58aee16e2a4616cbe421e46f5263ce46e301d8c295cb8a807a9c65610b176c61ae03229fc6601cfcffcf90d53edcfe869a1bc692dcdf88ce84f23b34733f9c8046d1cb7df77f1eb29cddcd4b420dcc8761169f3c7dab4f04e2eccbc046b0b26007406dec7505a38273e3bab522a81a054241afea6b6576cb1fdab2569cfa605c0cfcea0f4665f489273b92d2fcaae21be8f2d37dc40a38d847c56c3df5a2d5cab476753c91bb4e2dfbf2bd9ded2010e202976055c78de4fb2ec3f2a6a44d6816c7cbb829c83646156941418b4f060e196\n\n# tcId = 33\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 5c54c39c0a079e7a842c8b7f5c6bc63f4b90873e1379132fc1a52fb78fe6eb46aece7f5ebeeaf2df8862622442f0a470d2a8ae252c5c5d71702033c6b5e6e983cf44ac0e818d9453b86b91b5d99a1af0fa5ed8aff718d49864c093e4cd5be4db1fd44b6ed38e58df96e70cab32fae1889e091be25eb9f15c07ad2c304e0ccb881cdbb1e45ba993b95e169358a169c70e7d0915ba34955bf20fe1df2c7aae78fb78c893d184c85a56524643dfdfc41e62539da005751409a18fb4e59d2877c6cc45a4b832fbfa8ad2880775d9fe92b6516f8458bb52cd5820710bc16ca32cd7bb3998af0299778a2dab50d62d73415294a857d92bc5bad97248e70cdacd50dd5d\n\n# tcId = 34\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 9b91890eb53272fe7542c2067a4e9295b8c7b8ddf1c9ece6a75fcde79c9af2cbcbcef38d342032b85ccff9d6c82d3cfd68a7b27a38eaa45c78a17741c230391b3df0bd79dcc3447c8717b7207fa1fd04e917b5282e3a7dad48e8f2f6d1360f6c720f9eaf1d1d59f061d71daac1548538c0a06fa65b2ac87abc9e6fed3a6e15f48422bd9c4c681fa98a27c873d7efc5c100e708d58141b60e5a691747df4036162456bb11f92f2a391170233ca1c03e1786a32fe9ab8a94246dc643a884ad59edc40e2eb873713e84816e4a7f7857126da3f063cb9a3dda0547207c426f7cc985b5a3b6374cfff51d0d542ce9f82ffc07ad24c106363ffaed12c97526394a84ff\n\n# tcId = 35\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 0f07dc8786a46a7ae2fe2bd534715044f46ad17b836b00370996258aa90bddf563b5f3e7eb1500ed0604f9380491a5a6c6c004b560b0f280a2de30d191928bf5aa0378fd6beda830beb1db8b6b1c8846079b6013cf586e384be0e1163c62b526fbf8e26992afba6ef5e5f15755ec7b5287a149b19e577e79bff6526d72616e28d921661752e8cd0e4b950d7ee9f2414e45b3069a80a2e089e46d0b3da5cc0352c07305f8dfef2e1e928e85bb76c5a0f1516383143184f66f31c69adc0b8219f11809501927744fa37d1c8cc1e2a6712d54ed66dd177714b7cbd005e6a6f83db92041b595dd934b0b19fce5db369e504fb45c9df1e645e81bef62cd4da3497e9d\n\n# tcId = 36\n# removing sequence\nmsg = 54657374\nresult = invalid\nsig = 70f9515388762b320cf84e90eb571b27eee58a43ebd4773573bffbce8b162bf17e6c0317636b211b2bc56aafa99b968ec950466ae5cd7b10d94c993dabace14b94bed501dacc0b40feb8a89586eb1a792e92115ba5430ce1183ffc6f538ca657fed3ea684a1b9d998c0d9ff004e150a0a32d20455176e8db3d96b5063a60106a7bf6c9d0baa8879ddb77d9a3037400348ed1ee4b88f8256e8e632b15b0dc2611da3a9faab929a0bd4881418d7fd8fc7760c523e1ca4cd3f25c8243b8bcdcd51e96a3840de589744bb8d655851b9cdbd8b7f2d47a57144d9c2a7ea07d49c0d141cf918a4eb1507f8a7b11cbaa28c1a35745209a5fad2bd1e66f7929fe0223d505\n\n# tcId = 37\n# removing sequence\nmsg = 54657374\nresult = invalid\nsig = 8804d661bb17ffa73e371d134984ee95e426d7c12af978d9ad00ce746db4a3bad36546709f029d2c9ed13e6d27123cb7a1954f1f65f3fa46eeb56f449ba6b5e0736e5dd2586d642711d98aa19595d9da1c4ec20953009e2711738263170b487072566558de1301e0d0253f8fc14d12c8cfb4644b50aeb3d3a9fe1a26fd3bccd72986cbaff34fc4fa38ce52e65821f169d54b78037b8ddcba141ffc72797023c802564989a20b07b9a2ba6a256647e937b1c16df2081cb61bc6e6a2ec6ca9939db91ec2ae62c4b2d0d7f61a0bf0c693165175c91b100c195f3611c3ecb797c531439655ace9aae18e53a69e66698fb593f48084117ba288a134fd0389ee0f7544\n\n# tcId = 38\n# lonely sequence tag\nmsg = 54657374\nresult = invalid\nsig = 47004cf187bd2a34c6ed89f6f8eb9f67a401a40d66a95c8cddd98fa0faa829bbfc9e62a854788e4d23015a68f098a77cc5daac7e23c6ba56167518753187a8ead68edc686c393940f77255fc8092c4c65a01aa6901c0af96830c05747791e511c8c01da4358feb38bf5507543184fe887c5821c4af048c5082bed56c7934985d86de2402b37e16a6f3e23d5a1e838992bef2a46d4fa87971f0cb01a470e185654a6b174d9bba81117e8df24b19a7be0d1f8e3906d3029b5ad4f0d8c152375dfc4fa490f9fa3a5b52fb929a7d41a84d61bbf60d80162b16334b4958ec879bbc0098962d5d3220169c8ccb338d31c664c23144cc85bc371b2d9da61a69f0b4b658\n\n# tcId = 39\n# lonely sequence tag\nmsg = 54657374\nresult = invalid\nsig = 24bc364503e9aa28177f9fe7ebda884cbe94",
@@ -4395,9 +4494,9 @@
     "1ed9064323c12b6ebde15ae8c05a0e5205c91f57f5753815ff39c918\nflags = SmallModulus,SmallPublicKey\n\n[e = 03]\n[keyAsn = 30820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d0030820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103]\n[keysize = 2048]\n[n = 0090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1]\n[sha = SHA-256]\n\n# tcId = 373\n# short signature\nmsg = 33363730\nresult = acceptable\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000989e7ff72e67e680bd21d5f966e4ad8a48c3592dbacc4a2f035b4ef4d17a2f25f8a9fef7e78eb99d76d68629ed02d67c43c4b7ec8c3badc32e3d0a524c326537739b0fde156723b27c23ae2b09895e470c64d700f5c\nflags = SmallPublicKey\n\n[e = 03]\n[keyAsn = 308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d00308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103]\n[keysize = 2048]\n[n = 00f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f]\n[sha = SHA-512]\n\n# tcId = 374\n# short signature\nmsg = 38343432\nresult = acceptable\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e7a1269086f0bbc0778ded8d7108ff4edcc2313425088117b2d5c53e9d9971950a5fe8b2b67d2bcd1be74f6b557a3f90650a96d7e4dbd63c05b94f73337eea682417c058d66ce523e4461065ac8ba990c4ecd04932\nflags = SmallPublicKey\n\n[e = 03]\n[keyAsn = 308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103]\n[keyDer = 308201a0300d06092a864886f70d01010105000382018d00308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103]\n[keysize = 3072]\n[n = 00ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83]\n[sha = SHA-256]\n\n# tcId = 375\n# short signature\nmsg = 34333630\nresult = acceptable\nsig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a21abeac8409398319e65c8656f8f72e179dd1e99358c7531fddc037e47c1e688cd70eafd6eea01c823516bc79f89d7e52ee1eb4ffdeaad1d550dc0a47185bc9c42e47fce5503c3370a60510f834b4691152ef668deca633cf3873ce6613951784aa7dafde118f37f1cdf1a687ac236d5c956bced564b73cf202e3bace59667\nflags = SmallPublicKey\n\n[e = 03]\n[keyAsn = 3082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81",
     "ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keyDer = 308201a0300d06092a864886f70d01010105000382018d003082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103]\n[keysize = 3072]\n[n = 008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01]\n[sha = SHA-512]\n\n# tcId = 376\n# short signature\nmsg = 36313237\nresult = acceptable\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdd0c9e451b5b3e5513a94492dbee1ada9ea87e65a8cd95cceb4d304294ce34bf09a212f14908f5b865c7a34a72e68e389794a2d1c5767ba17829e2044108ac7842b6bfe0a5663b433d656f4e38522c5a5a23c460b898833828d257350e5814291b54cf13089080f84998edcacf0fe5fca0c1f8b176b172c5f9989491a039bef\nflags = SmallPublicKey\n\n[e = 03]\n[keyAsn = 30820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keyDer = 30820120300d06092a864886f70d01010105000382010d0030820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103]\n[keysize = 2048]\n[n = 0092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d]\n[sha = SHA-256]\n\n# tcId = 377\n# signature is close to n\nmsg = 32353934\nresult = acceptable\nsig = 92bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240b8bf4bb1a6d0616fd5be2f081dc9ef741a9a4ae7274418b791432de470c4556463108388e8e8ed5dcebf3558e4650c2ac97c86fa682176f09b5dd8cfbf15d19c3fe4f961f4607c12cb3dfad9b6a0e59c92faa1fc8622\nflags = SmallPublicKey\n\n",
 };
-static const size_t kLen175 = 157296;
+static const size_t kLen191 = 157296;
 
-static const char *kData175[] = {
+static const char *kData191[] = {
     "# Imported from Wycheproof's x25519_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: XDH\n# Generator version: 0.8r12\n\n[curve = curve25519]\n\n# tcId = 1\n# normal case\nprivate = c8a9d5a91091ad851c668b0736c1c9a02936c0d3ad62670858088047ba057475\npublic = 504a36999f489cd2fdbc08baff3d88fa00569ba986cba22548ffde80f9806829\nresult = valid\nshared = 436a2c040cf45fea9b29a0cb81b1f41458f863d0d61b453d0a982720d6d61320\n\n# tcId = 2\n# public key on twist\nprivate = d85d8c061a50804ac488ad774ac716c3f5ba714b2712e048491379a500211958\npublic = 63aa40c6e38346c5caf23a6df0a5e6c80889a08647e551b3563449befcfc9733\nresult = acceptable\nshared = 279df67a7c4611db4708a0e8282b195e5ac0ed6f4b2f292c6fbd0acac30d1332\nflags = Twist\n\n# tcId = 3\n# public key on twist\nprivate = c8b45bfd32e55325d9fd648cb302848039000b390e44d521e58aab3b29a6964b\npublic = 0f83c36fded9d32fadf4efa3ae93a90bb5cfa66893bc412c43fa7287dbb99779\nresult = acceptable\nshared = 4bc7e01e7d83d6cf67632bf90033487a5fc29eba5328890ea7b1026d23b9a45f\nflags = Twist\n\n# tcId = 4\n# public key on twist\nprivate = f876e34bcbe1f47fbc0fddfd7c1e1aa53d57bfe0f66d243067b424bb6210be51\npublic = 0b8211a2b6049097f6871c6c052d3c5fc1ba17da9e32ae458403b05bb283092a\nresult = acceptable\nshared = 119d37ed4b109cbd6418b1f28dea83c836c844715cdf98a3a8c362191debd514\nflags = Twist\n\n# tcId = 5\n# public key on twist\nprivate = 006ac1f3a653a4cdb1d37bba94738f8b957a57beb24d646e994dc29a276aad45\npublic = 343ac20a3b9c6a27b1008176509ad30735856ec1c8d8fcae13912d08d152f46c\nresult = acceptable\nshared = cc4873aed3fcee4b3aaea7f0d20716b4276359081f634b7bea4b705bfc8a4d3e\nflags = Twist\n\n# tcId = 6\n# public key on twist\nprivate = 08da77b26d06dff9d9f7fd4c5b3769f8cdd5b30516a5ab806be324ff3eb69e60\npublic = fa695fc7be8d1be5bf704898f388c452bafdd3b8eae805f8681a8d15c2d4e142\nresult = acceptable\nshared = b6f8e2fcb1affc79e2ff798319b2701139b95ad6dd07f05cbac78bd83edfd92e\nflags = Twist\n\n# tcId = 7\n# public key on twist\nprivate = d03edde9f3e7b799045f9ac3793d4a9277dadeadc41bec0290f81f744f73775f\npublic = 0200000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = b87a1722cc6c1e2feecb54e97abd5a22acc27616f78f6e315fd2b73d9f221e57\nflags = Twist\n\n# tcId = 8\n# public key on twist\nprivate = e09d57a914e3c29036fd9a442ba526b5cdcdf28216153e636c10677acab6bd6a\npublic = 0300000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = a29d8dad28d590cd3017aa97a4761f851bf1d3672b042a4256a45881e2ad9035\nflags = Twist\n\n# tcId = 9\n# public key on twist\nprivate = e0ed78e6ee02f08bec1c15d66fbbe5b83ffc37ea14e1512cc1bd4b2ea6d8066f\npublic = ff00000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = e703bc8aa94b7d87ba34e2678353d12cdaaa1a97b5ca3e1b8c060c4636087f07\nflags = Twist\n\n# tcId = 10\n# public key on twist\nprivate = a8a1a2ec9fa9915ae7aace6a37c68591d39e15995c4ef5ebd3561c02f72dda41\npublic = ffff000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = ff5cf041e924dbe1a64ac9bdba96bdcdfaf7d59d91c7e33e76ed0e4c8c836446\nflags = Twist\n\n# tcId = 11\n# public key on twist\nprivate = a8c9df5820eb399d471dfa3215d96055b3c7d0f4ea49f8ab028d6a6e3194517b\npublic = 0000010000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = a92a96fa029960f9530e6fe37e2429cd113be4d8f3f4431f8546e6c76351475d\nflags = Twist\n\n# tcId = 12\n# public key on twist\nprivate = d0d31c491cbd39271859b4a63a316826507b1db8c701709fd0ffe3eb21c4467c\npublic = ffffff0f00000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 9f8954868158ec62b6b586b8cae1d67d1b9f4c03d5b3ca0393cee71accc9ab65\nflags = Twist\n\n# tcId = 13\n# public key on twist\nprivate = d053e7bf1902619cd61c9c739e09d54c4147f46d190720966f7de1d9cffbbd4e\npublic = ffffffff00000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 6cbf1dc9af97bc148513a18be4a257de1a3b065584df94e8b43c1ab89720b110\nflags = Twist\n\n# tcId = 14\n# public key on twist\nprivate = a021d75009a4596e5a33f12921c10f3670933bc80dde3bba22881b6120582144\npublic = 0000000000001000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 38284b7086095a9406028c1f800c071ea106039ad7a1d7f82fe00906fd90594b\nflags = Twist\n\n# tcId = 15\n# public key on twist\nprivate = a89c6687f99bd569a01fd8bd438236160d15ce2c57c1d71ebaa3f2da88233863\npublic = 0000000000000001000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = c721041df0244071794a8db06b9f7eaeec690c257265343666f4416f4166840f\nflags = Twist\n\n# tcId = 16\n# public key on twist\nprivate = 68964bca51465bf0f5ba524b1482ceff0e960a1ed9f48dcc30f1608d0e501a50\npublic = ffffffffffffffff000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 25ff9a6631b143dbdbdc207b38e38f832ae079a52a618c534322e77345fd9049\nflags = Twist\n\n# tcId = 17\n# public key on twist\nprivate = a8e56bb13a9f2b33b8e6750b4a6e6621dc26ae8c5c624a0992c8f0d5b910f170\npublic = 0000000000000000000000000000000000000000000000000100000000000000\nresult = acceptable\nshared = f294e7922c6cea587aefe72911630d50f2456a2ba7f21207d57f1ecce04f6213\nflags = Twist\n\n# tcId = 18\n# public key on twist\nprivate = e045f55c159451e97814d747050fd7769bd478434a01876a56e553f66384a74c\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000\nresult = acceptable\nshared = ff4715bd8cf847b77c244ce2d9b008b19efaa8e845feb85ce4889b5b2c6a4b4d\nflags = Twist\n\n# tcId = 19\n# public key on twist\nprivate = 105d621e1ef339c3d99245cfb77cd3a5bd0c4427a0e4d8752c3b51f045889b4f\npublic = ffffff030000f8ffff1f0000c0ffffff000000feffff070000f0ffff3f000000\nresult = acceptable\nshared = 61eace52da5f5ecefafa4f199b077ff64f2e3d2a6ece6f8ec0497826b212ef5f\nflags = Twist\n\n# tcId = 20\n# public key on twist\nprivate = d88a441e706f606ae7f630f8b21f3c2554739e3e549f804118c03771f608017b\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000\nresult = acceptable\nshared = ff1b509a0a1a54726086f1e1c0acf040ab463a2a542e5d54e92c6df8126cf636\nflags = Twist\n\n# tcId = 21\n# public key on twist\nprivate = 80bbad168222276200aafd36f7f25fdc025632d8bf9f6354bb762e06fb63e250\npublic = 0000000000000000000000000000000000000000000000000000000000800000\nresult = acceptable\nshared = f134e6267bf93903085117b99932cc0c7ba26f25fca12102a26d7533d9c4272a\nflags = Twist\n\n# tcId = 22\n# public key on twist\nprivate = 68e134092e94e622c8a0cd18aff55be23dabd994ebdee982d90601f6f0f4b369\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f\nresult = acceptable\nshared = 74bfc15e5597e9f5193f941e10a5c008fc89f051392723886a4a8fe5093a7354\nflags = Twist\n\n# tcId = 23\n# public key on twist\nprivate = e8e43fc1ebac0bbc9b99c8035ee1ac59b90f19a16c42c0b90f96adfcc5fdee78\npublic = 0000000000000000000000000000000000000000000000000000000000000020\nresult = acceptable\nshared = 0d41a5b3af770bf2fcd34ff7972243a0e2cf4d34f2046a144581ae1ec68df03b\nflags = Twist\n\n# tcId = 24\n# public key on twist\nprivate = 18bffb16f92680a9e267473e43c464476d5372ddd1f664f3d0678efe7c98bc79\npublic = 000000fcffff070000e0ffff3f000000ffffff010000f8ffff0f0000c0ffff7f\nresult = acceptable\nshared = 5894e0963583ae14a0b80420894167f4b759c8d2eb9b69cb675543f66510f646\nflags = Twist\n\n# tcId = 25\n# public key on twist\nprivate = 300305eb002bf86c71fe9c0b311993727b9dc618d0ce7251d0dfd8552d17905d\npublic = ffffffffffffff00000000000000ffffffffffffff00000000000000ffffff7f\nresult = acceptable\nshared = f8624d6e35e6c548ac47832f2e5d151a8e53b9290363b28d2ab8d84ab7cb6a72\nflags = Twist\n\n# tcId = 26\n# public key on twist\nprivate = 80da9f02842247d4ade5ddbac51dbce55ea7dca2844e7f97ab8987ce7fd8bc71\npublic = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffff7f\nresult = acceptable\nshared = bfe183ba3d4157a7b53ef178613db619e27800f85359c0b39a9fd6e32152c208\nflags = Twist\n\n# tcId = 27\n# public key on twist\nprivate = 806e7f26ca3246de8182946cbed09f52b95da626c823c7b50450001a47b7b252\npublic = edfffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = bca4a0724f5c1feb184078448c898c8620e7caf81f64cca746f557dff2498859\nflags = Twist\n\n# tcId = 28\n# public key on twist\nprivate = 58354fd64bc022cba3a71b2ae64281e4ea7bf6d65fdbaead1440eeb18604fe62\npublic = edfffffffffffffefffffffffffffffffffff",
     "fffffffffffffffffffffffff7f\nresult = acceptable\nshared = b3418a52464c15ab0cacbbd43887a1199206d59229ced49202300638d7a40f04\nflags = Twist\n\n# tcId = 29\n# public key on twist\nprivate = f0019cf05159794cc8052b00c2e75b7f46fb6693c4b38c02b12a4fe272e8556a\npublic = edffffffffffefffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = fcde6e0a3d5fd5b63f10c2d3aad4efa05196f26bc0cb26fd6d9d3bd015eaa74f\nflags = Twist\n\n# tcId = 30\n# public key on twist\nprivate = d0fca64cc5f3a0c8e75c824e8b09d1615aa79aeba139bb7302e2bb2fcbe54b40\npublic = edfeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 7d62f189444c6231a48afab10a0af2eee4a52e431ea05ff781d616af2114672f\nflags = Twist\n\n# tcId = 31\n# public key on twist\nprivate = d02456e456911d3c6cd054933199807732dfdc958642ad1aebe900c793bef24a\npublic = eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 07ba5fcbda21a9a17845c401492b10e6de0a168d5c94b606694c11bac39bea41\nflags = Twist\n\n# tcId = 32\n# public key = 0\nprivate = 88227494038f2bb811d47805bcdf04a2ac585ada7f2f23389bfd4658f9ddd45e\npublic = 0000000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = SmallPublicKey,LowOrderPublic,ZeroSharedSecret\n\n# tcId = 33\n# public key = 1\nprivate = 48232e8972b61c7e61930eb9450b5070eae1c670475685541f0476217e48184f\npublic = 0100000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = SmallPublicKey,LowOrderPublic,ZeroSharedSecret\n\n# tcId = 34\n# edge case public key\nprivate = a8386f7f16c50731d64f82e6a170b142a4e34f31fd7768fcb8902925e7d1e25a\npublic = 0400000000000000000000000000000000000000000000000000000000000000\nresult = valid\nshared = 34b7e4fa53264420d9f943d15513902342b386b172a0b0b7c8b8f2dd3d669f59\n\n# tcId = 35\n# edge case public key\nprivate = d05abd08bf5e62538cb9a5ed105dbedd6de38d07940085072b4311c2678ed77d\npublic = 0001000000000000000000000000000000000000000000000000000000000000\nresult = valid\nshared = 3aa227a30781ed746bd4b3365e5f61461b844d09410c70570abd0d75574dfc77\n\n# tcId = 36\n# edge case public key\nprivate = f0b8b0998c8394364d7dcb25a3885e571374f91615275440db0645ee7c0a6f6b\npublic = 0000001000000000000000000000000000000000000000000000000000000000\nresult = valid\nshared = 97755e7e775789184e176847ffbc2f8ef98799d46a709c6a1c0ffd29081d7039\n\n# tcId = 37\n# edge case public key\nprivate = d00c35dc17460f360bfae7b94647bc4e9a7ad9ce82abeadb50a2f1a0736e2175\npublic = 0000000001000000000000000000000000000000000000000000000000000000\nresult = valid\nshared = c212bfceb91f8588d46cd94684c2c9ee0734087796dc0a9f3404ff534012123d\n\n# tcId = 38\n# edge case public key\nprivate = 385fc8058900a85021dd92425d2fb39a62d4e23aef1d5104c4c2d88712d39e4d\npublic = ffffffffffff0f00000000000000000000000000000000000000000000000000\nresult = valid\nshared = 388faffb4a85d06702ba3e479c6b216a8f33efce0542979bf129d860f93b9f02\n\n# tcId = 39\n# edge case public key\nprivate = e0614b0c408af24d9d24c0a72f9137fbd6b16f02ccc94797ea3971ab16073a7f\npublic = ffffffffffffff00000000000000000000000000000000000000000000000000\nresult = valid\nshared = 877fec0669d8c1a5c866641420eea9f6bd1dfd38d36a5d55a8c0ab2bf3105c68\n\n# tcId = 40\n# edge case public key\nprivate = f004b8fd05d9fffd853cdc6d2266389b737e8dfc296ad00b5a69b2a9dcf72956\npublic = 0000000000000000010000000000000000000000000000000000000000000000\nresult = valid\nshared = 180373ea0f23ea73447e5a90398a97d490b541c69320719d7dd733fb80d5480f\n\n# tcId = 41\n# edge case public key\nprivate = e80bf0e609bf3b035b552f9db7e9ecbc44a04b7910b1493661a524f46c3c2277\npublic = ffffffffffffffffffffffffffff000000000000000000000000000000000000\nresult = valid\nshared = 208142350af938aba52a156dce19d3c27ab1628729683cf4ef2667c3dc60cf38\n\n# tcId = 42\n# edge case public key\nprivate = 48890e95d1b03e603bcb51fdf6f296f1f1d10f5df10e00b8a25c9809f9aa1a54\npublic = 0000000000000000000000000000010000000000000000000000000000000000\nresult = valid\nshared = 1c3263890f7a081cefe50cb92abd496582d90dcc2b9cb858bd286854aa6b0a7e\n\n# tcId = 43\n# edge case public key\nprivate = a806f1e39b742615a7dde3b29415ed827c68f07d4a47a4d9595c40c7fccb9263\npublic = ffffffffffffffffffffffffffffffff00000000000000000000000000000000\nresult = valid\nshared = 56128e78d7c66f48e863e7e6f2caa9c0988fd439deac11d4aac9664083087f7a\n\n# tcId = 44\n# edge case public key\nprivate = 9899d5e265e1fc7c32345227d6699a6d6b5517cf33b43ab156ee20df4878794e\npublic = 0000000000000000000000000000000001000000000000000000000000000000\nresult = valid\nshared = 30eca56f1f1c2e8ff780134e0e9382c5927d305d86b53477e9aeca79fc9ced05\n\n# tcId = 45\n# edge case public key\nprivate = d842316e5476aeaee838204258a06f15de011ba40b9962705e7f6e889fe71f40\npublic = ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000\nresult = valid\nshared = cb21b7aa3f992ecfc92954849154b3af6b96a01f17bf21c612da748db38eb364\n\n# tcId = 46\n# edge case public key\nprivate = a0933ee30512b25ee4e900aaa07f73e507a8ec53b53a44626e0f589af4e0356c\npublic = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000\nresult = valid\nshared = c5caf8cabc36f086deaf1ab226434098c222abdf8acd3ce75c75e9debb271524\n\n# tcId = 47\n# edge case public key\nprivate = 38d6403e1377734cdce98285e820f256ad6b769d6b5612bcf42cf2b97945c073\npublic = 0000000000000000000000000000000000000000000000000000000001000000\nresult = valid\nshared = 4d46052c7eabba215df8d91327e0c4610421d2d9129b1486d914c766cf104c27\n\n# tcId = 48\n# edge case public key\nprivate = 182191b7052e9cd630ef08007fc6b43bc7652913be6774e2fd271b71b962a641\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03\nresult = valid\nshared = a0e0315175788362d4ebe05e6ac76d52d40187bd687492af05abc7ba7c70197d\n\n# tcId = 49\n# edge case public key\nprivate = 106221fe5694a710d6e147696c5d5b93d6887d584f24f228182ebe1b1d2db85d\npublic = ffffff0f000000ffffff0f000000ffffff0f000000ffffff0f000000ffffff0f\nresult = valid\nshared = 5e64924b91873b499a5402fa64337c65d4b2ed54beeb3fa5d7347809e43aef1c\n\n# tcId = 50\n# edge case public key\nprivate = d035de9456080d85a912083b2e3c7ddd7971f786f25a96c5e782cf6f4376e362\npublic = 000000fcffff030000e0ffff1f000000ffffff000000f8ffff070000c0ffff3f\nresult = valid\nshared = c052466f9712d9ec4ef40f276bb7e6441c5434a83efd8e41d20ce83f2dbf5952\n\n# tcId = 51\n# edge case public key\nprivate = a8f37318a4c760f3cb2d894822918735683cb1edacf3e666e15694154978fd6d\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\nresult = valid\nshared = d151b97cba9c25d48e6d576338b97d53dd8b25e84f65f7a2091a17016317c553\n\n# tcId = 52\n# edge case public key\nprivate = 20d4d624cf732f826f09e8088017742f13f2da98f4dcf4b40519adb790cebf64\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f\nresult = valid\nshared = 5716296baf2b1a6b9cd15b23ba86829743d60b0396569be1d5b40014c06b477d\n\n# tcId = 53\n# edge case public key\nprivate = d806a735d138efb3b404683c9d84485ab4af540d0af253b574323d8913003c66\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fff7f\nresult = valid\nshared = ddbd56d0454b794c1d1d4923f023a51f6f34ef3f4868e3d6659307c683c74126\n\n# tcId = 54\n# edge case public key\nprivate = 184198c6228177f3ef41dc9a341258f8181ae365fe9ec98d93639b0bbee1467d\npublic = fffffffffeffff7ffffffffffeffff7ffffffffffeffff7ffffffffffeffff7f\nresult = valid\nshared = 8039eebed1a4f3b811ea92102a6267d4da412370f3f0d6b70f1faaa2e8d5236d\n\n# tcId = 55\n# edge case public key\nprivate = f0a46a7f4b989fe515edc441109346ba746ec1516896ec5b7e4f4d903064b463\npublic = edfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffff7f\nresult = valid\nshared = b69524e3955da23df6ad1a7cd38540047f50860f1c8fded9b1fdfcc9e812a035\n\n# tcId = 56\n# edge case public key\nprivate = 881874fda3a99c0f0216e1172fbd07ab1c7df78602cc6b11264e57aab5f23a49\npublic = edfffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff7f\nresult = valid\nshared = e417bb8854f3b4f70ecea557454c5c4e5f3804ae537960a8097b9f338410d757\n\n# tcId = 57\n# edge case public key\nprivate = b8d0f1ae05a5072831443150e202ac6db00322cdf341f467e9f296588b04db72\npublic = edfffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff7f\nresult = valid\nshared = afca72bb8ef72",
     "7b60c530c937a2f7d06bb39c39b903a7f4435b3f5d8fc1ca810\n\n# tcId = 58\n# edge case public key\nprivate = c8619ba988859db7d6f20fbf3ffb8b113418cc278065b4e8bb6d4e5b3e7cb569\npublic = edfffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = 7e41c2886fed4af04c1641a59af93802f25af0f9cba7a29ae72e2a92f35a1e5a\n\n# tcId = 59\n# edge case public key\nprivate = f8d4ca1f37a30ec9acd6dbe5a6e150e5bc447d22b355d80ba002c5b05c26935d\npublic = edfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = dd3abd4746bf4f2a0d93c02a7d19f76d921c090d07e6ea5abae7f28848355947\n\n# tcId = 60\n# edge case public key\nprivate = 88037ac8e33c72c2c51037c7c8c5288bba9265c82fd8c31796dd7ea5df9aaa4a\npublic = edffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = 8c27b3bff8d3c1f6daf2d3b7b3479cf9ad2056e2002be247992a3b29de13a625\n\n# tcId = 61\n# edge case public key\nprivate = 5034ee7bf83a13d9167df86b0640294f3620f4f4d9030e5e293f9190824ae562\npublic = edfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = 8e1d2207b47432f881677448b9d426a30de1a1f3fd38cad6f4b23dbdfe8a2901\n\n# tcId = 62\n# edge case public key\nprivate = 40bd4e1caf39d9def7663823502dad3e7d30eb6eb01e9b89516d4f2f45b7cd7f\npublic = ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = 2cf6974b0c070e3707bf92e721d3ea9de3db6f61ed810e0a23d72d433365f631\n\n# tcId = 63\n# public key with low order\nprivate = e0f978dfcd3a8f1a5093418de54136a584c20b7b349afdf6c0520886f95b1272\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 64\n# public key with low order\nprivate = 387355d995616090503aafad49da01fb3dc3eda962704eaee6b86f9e20c92579\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 65\n# public key with low order\nprivate = c8fe0df92ae68a03023fc0c9adb9557d31be7feed0d3ab36c558143daf4dbb40\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,Twist,ZeroSharedSecret\n\n# tcId = 66\n# public key with low order\nprivate = c8d74acde5934e64b9895d5ff7afbffd7f704f7dfccff7ac28fa62a1e6410347\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,NonCanonicalPublic,Twist,ZeroSharedSecret\n\n# tcId = 67\n# public key with low order\nprivate = b85649d5120e01e8ccaf7b2fb8d81b62e8ad6f3d5c0553fdde1906cb9d79c050\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,NonCanonicalPublic,Twist,ZeroSharedSecret\n\n# tcId = 68\n# public key with low order\nprivate = 2064b2f4c9dc97ec7cf58932fdfa3265ba6ea4d11f0259b8efc8afb35db88c48\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,NonCanonicalPublic,ZeroSharedSecret\n\n# tcId = 69\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 0000000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 70\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 0100000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 71\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 72\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 73\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 74\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 75\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 76\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 0000000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 77\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 0100000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 78\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 79\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 80\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 81\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 82\n# public key with low order\nprivate = 786a33a4f7af297a20e7642925932bf509e7070fa1bc36986af1eb13f4f50b55\npublic = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\nflags = LowOrderPublic,ZeroSharedSecret\n\n# tcId = 83\n# public key =\n# 57896044618658097711785492504343953926634992332820282019728792003956564819949\nprivate = 40ff586e73d61f0960dc2d763ac19e98225f1194f6fe43d5dd97ad55b3d35961\npublic = edfffffffffffffffffffff",
@@ -4419,9 +4518,9 @@
     "n multiplication by 8\nprivate = a898af8138e11ae45bbcefa737182a571885f92d515c32056c7cb0d7deac4741\npublic = 0cad7545ade2fd93fcae007c97648348f26d85829bdb7223a63eccb84e56d475\nresult = valid\nshared = c8085877800c175e949cdd88e196eb9c4841da2ac446dfed9085bda5bbec265d\n\n# tcId = 487\n# special case for AA in multiplication by 9\nprivate = b0bfef6ec095b5a1f93917d32f16a21d0462c1fde17446f5a590232d9c895f4a\npublic = 60f27ed0a27804ced237cf3c1cc776650fb320bae6d5acb564e97b56cba25210\nresult = valid\nshared = 4c300895827382a9d1079028bd6f694a7a12ddac9c76abac6fdf5d29457a3310\n\n# tcId = 488\n# special case for AA in multiplication by 9\nprivate = 60497d4464ed8823c50fbc6b68620826c4f629c1d9193058df6bf857c6aecc4b\npublic = f93a73270ac19194b8e4ffd02be4b1438525f84a76224688ea89a9dd6a1bd623\nresult = acceptable\nshared = 7285fbb3f76340a979ab6e288727a2113332cf933809b018b8739a796a09d00b\nflags = Twist\n\n# tcId = 489\n# special case for AA in multiplication by 9\nprivate = 08c6cbe03792a3829f06e8ad54c55db113236ac0dcc9ab6a9a6b10eed1041b48\npublic = cf80c30fcbfd535666ca1da499e2e99cc537063e2de19458fcf92f5ee34acf47\nresult = acceptable\nshared = dabc3bd49f19cf7071802e43c863ed0b1d93a841588098b98a0c581bf4fe0a11\nflags = Twist\n\n# tcId = 490\n# special case for AA in multiplication by 9\nprivate = 50044da3315dd082e9dfb6a1994aabb331f53e0d1c12633383b2a3c8678cfe4c\npublic = 698effe0ad42e15ee1f46fde6fc5074ffda183bcf1b2db8647f561ddd191dd60\nresult = valid\nshared = a61a3b150b4770532373676298c9a5da28adcc4365b06fe07c959ca80e477a57\n\n# tcId = 491\n# special case for AA in multiplication by 9\nprivate = 285640da7a48252e35ddce60c14addb73097fbc9ac2f87c8d2772ce89aa6be4d\npublic = bd1565b4a3f8515dff577be6dcb414511d3d4ec2de15e0bd45b28e9cc4caef60\nresult = valid\nshared = 916ab4f3bfc8321e1087d9c5444f8f7a43e9ca6d29e7ba98a19dc05fff34ed4c\n\n# tcId = 492\n# special case for AA in multiplication by 9\nprivate = 783271c21199ba2e94ead92cd9dd79f70aab378b59497455d327a5907dafcb4a\npublic = b8649e13843f80cf5702398e4a9a8c378f29da96dfd6579f1eb4f7ea34df6765\nresult = acceptable\nshared = 844a5dd5139554ca7b41cbe6a4796193912e7aa4e201cc68944ce2a55774a10f\nflags = Twist\n\n# tcId = 493\n# special case for AA in multiplication by 9\nprivate = d0676a0b9a046c62d5b2e740d9cc43fa37965dea93c23254f7bf569f2bebaa4a\npublic = c396938737abdf791e09a97eba577c437d9b67c2dae94e13eab7296ec0fc737e\nresult = valid\nshared = 10780333b2a6170136265bb5ebc6c818817f2e48ae372528c8f34433fdd6215a\n\n# tcId = 494\n# special case for DA - CB in multiplication by 9\nprivate = 608c84d2b76fccda579e974db3d3b2ce39a6bc0dad440599db22411b60467849\npublic = 557b825012d98f065bb95a2ab9b2d2d8b83fd2037912508c263f86d7e36c4f24\nresult = acceptable\nshared = 5ce84842dbae8b795b3d545343558045508f271383bfb3dd3943f4101398c864\nflags = Twist\n\n# tcId = 495\n# special case for z_2 in multiplication by 9\nprivate = 80f233936a8821936d39114c84d929e79760b27680779e5009e1709410dd8e4f\npublic = ae98296d4a2fbcbb40b472f4063231608bb1465c226c8a4a2dff29afd915882a\nresult = valid\nshared = 4f11aa0c313195f96f25cadcbf49f06a932d8b051879ea537d1c6dfee7f36d35\n\n# tcId = 496\n# special case for z_2 in multiplication by 9\nprivate = c8d80b1a34f21194f047a6f0328bb947e2e7aff6a043553aa07f2abf99aaf048\npublic = 8b9d249829fbe81333d85050da88998f63fac665679e27dbbe21b745dd14e145\nresult = valid\nshared = 1d619070bf5626064be10025e74e336c81ef3166b743f99c751fb90587c31d7e\n\n# tcId = 497\n# special case for z_2 in multiplication by 9\nprivate = 9021477b452361580059364c6f94f4981ee94ea3f9b7d37439bc82ae45816f4d\npublic = 61896093e2697c78230afdda12639cbe4342827b8d2b093281f148eb60b9034b\nresult = valid\nshared = 532e797861db56b9d5db8825fb72f8629c2422f8abea721ad2d7b9e77a95b576\n\n# tcId = 498\n# special case for z_2 in multiplication by 9\nprivate = 6079dae04c40a59ea4e0c8c17092e4c85ea9133d143307363487836df4e30349\npublic = ccc1dc186229dba9a9360a0f7ff00247a3732625acaacd18ea13a9a8b40fac4f\nresult = acceptable\nshared = 4f678b64fd1f85cbbd5f7e7f3c8ac95ec7500e102e9006d6d42f48fb2473ab02\nflags = Twist\n\n# tcId = 499\n# special case for z_2 in multiplication by 9\nprivate = 281db6a5ac9a47d4a7b2b91a87f6536ce62d4e5129b8d647b97f9c504014894c\npublic = 69e368c0b7e78eb9f3a53bf458f6e79dc4883bf9458f04a8c12c4ddd94d62151\nresult = valid\nshared = e069fd06702f10f33adb8cf0766880634865b510e2da409241fb5f178050514a\n\n# tcId = 500\n# special case for z_2 in multiplication by 9\nprivate = d830f3c4785829a0f945857e0e85e0ae723702b57783b933cd2a2ad05484fe49\npublic = f21f9badd98dd8a103cc2ab5484fac6c2bfdd2671ee6e674134a86b89cee9160\nresult = valid\nshared = fee218eb1f92864486e83c1731f04bb8c7e6d7143e3915bcbf80fe03ff69dc77\n\n# tcId = 501\n# special case for E in multiplication by 9\nprivate = 10230bd0721f4c8c4b921881dd88c603af501ee80e2102f8acc30cf8b2acd349\npublic = e853062b2d6f38d021d645163ea208d0e193a479f11f99971b98e21188fd0b2c\nresult = acceptable\nshared = 64bdfa0207a174ca17eeba8df74d79b25f54510e6174923034a4d6ee0c167e7b\nflags = Twist\n\n# tcId = 502\n# special case for E in multiplication by 9\nprivate = f0a34d6d76896e17cb8f66feda23115ffb96f246b823bb63dec08335787de74c\npublic = 362eb92dab9fb29f7ed0e03843dcc15797928c2b4e51ec260204179c1c12945f\nresult = valid\nshared = d7f4583ee4fe86af3a3f1dfcb295ba3a3e37bced7b9c6f000a95336530318902\n\n# tcId = 503\n# special case for E in multiplication by 9\nprivate = 9073c1d0a173c7ff02dc966a165993d9c4c9357514f7a6bb7aaa4b0827718948\npublic = ff543f1e81996e88631f030ceba7e603b13033efd205e68bd36b28468134aa73\nresult = acceptable\nshared = c1b5e5f4401c98fa14eba8aafae30a641bfd8fb132be03413f3bf29290d49e0b\nflags = Twist\n\n# tcId = 504\n# special case for x_2 in multiplication by 9\nprivate = b0c1822566e016c12ae35ec035edd09af3cb7a48f55c9028e05e1178a8c3824e\npublic = 90ef70844ead1613f69df7d78c057813f866c0d95e6d22caee4a012b9c1c4b33\nresult = valid\nshared = 9369ebb3d2b744341cba77302719a4b2d63aff612872f86d9877a76bc919ca1c\n\n# tcId = 505\n# special case for x_2 in multiplication by 9\nprivate = e06fe64e2117796f997bbcd3bcad3067cf1291640a3a643fb359809a4016834d\npublic = 88c1ae575ad073dda66c6eacb7b7f436e1f8ad72a0db5c04e5660b7b719e4c4b\nresult = acceptable\nshared = 335394be9c154901c0b4063300001804b1cd01b27fa562e44f3302168837166e\nflags = Twist\n\n# tcId = 506\n# special case for x_2 in multiplication by 9\nprivate = 707ee81f113a244c9d87608b12158c50f9ac1f2c8948d170ad16ab0ad866d74b\npublic = dcffc4c1e1fba5fda9d5c98421d99c257afa90921bc212a046d90f6683e8a467\nresult = acceptable\nshared = 7ecdd54c5e15f7b4061be2c30b5a4884a0256581f87df60d579a3345653eb641\nflags = Twist\n\n# tcId = 507\n# special case for BB in multiplication by 9\nprivate = 7089654baacbb65bd00cd8cb9de4680e748075e8842ca69d448fb50fea85e74e\npublic = 6c0044cd10578c5aff1ff4917b041b76c9a9ae23664eb8cf978bd7aa192cf249\nresult = valid\nshared = 0d8c21fa800ee63ce5e473d4c2975495062d8afa655091122cb41799d374594f\n\n# tcId = 508\n# special case for BB in multiplication by 9\nprivate = 8089784c52cd67e4536e568218c7b7033b28413f942fca24ed69e43496efa14b\npublic = d9089de902e143dcd9107e5a3393a3f7fe05d926c357b47e307a236cb590fd64\nresult = valid\nshared = db6fec44bf118316a6bdfbae9af447baede4d82daa16bed596ea6f05d4a51400\n\n# tcId = 509\n# special case for BB in multiplication by 9\nprivate = 00e73e4e013148b9f05273bad626bb126a40ec4558f5425096b48947e0a9de4a\npublic = 8c4a26aa319c2cc4a4158c2bc69a0d5b340b60628a14cf31bb0ae5ddc38ae866\nresult = valid\nshared = ecc1204bc753c4cec4c9059fd7b504944ebf995ab1b1d49f0b3b325353be3a15\n\n# tcId = 510\n# special case for BB in multiplication by 9\nprivate = 78ed4c9bf9f44db8d93388985191ecf59226b9c1205fe7e762c327581c75884e\npublic = ce7295d1227c9062aab9cf02fc5671fb81632e725367f131d4122824a6132d68\nresult = valid\nshared = 3740de297ff0122067951e8985247123440e0f27171da99e263d5b4450f59f3d\n\n# tcId = 511\n# private key == -1 (mod order)\nprivate = a023cdd083ef5bb82f10d62e59e15a6800000000000000000000000000000050\npublic = 6c05871352a451dbe182ed5e6ba554f2034456ffe041a054ff9cc56b8e946376\nresult = valid\nshared = 6c05871352a451dbe182ed5e6ba554f2034456ffe041a054ff9cc56b8e946376\n\n# tcId = 512\n# private key == 1 (mod order) on twist\nprivate = 58083dd261ad91eff952322ec824c682ffffffffffffffffffffffffffffff5f\npublic = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035\nresult = acceptable\nshared = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035\nflags = Twist\n\n# tcId = 513\n# special cas",
     "e private key\nprivate = 4855555555555555555555555555555555555555555555555555555555555555\npublic = 3e3e7708ef72a6dd78d858025089765b1c30a19715ac19e8d917067d208e0666\nresult = valid\nshared = 63ef7d1c586476ec78bb7f747e321e01102166bf967a9ea9ba9741f49d439510\n\n# tcId = 514\n# special case private key\nprivate = 4855555555555555555555555555555555555555555555555555555555555555\npublic = 9f40bb30f68ab67b1c4b8b664982fdab04ff385cd850deac732f7fb705e6013a\nresult = valid\nshared = 8b98ef4d6bf30df7f88e58d51505d37ed6845a969fe598747c033dcd08014065\n\n# tcId = 515\n# special case private key\nprivate = 4855555555555555555555555555555555555555555555555555555555555555\npublic = be3b3edeffaf83c54ae526379b23dd79f1cb41446e3687fef347eb9b5f0dc308\nresult = valid\nshared = cfa83e098829fe82fd4c14355f70829015219942c01e2b85bdd9ac4889ec2921\n\n# tcId = 516\n# special case private key\nprivate = b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6a\npublic = 3e3e7708ef72a6dd78d858025089765b1c30a19715ac19e8d917067d208e0666\nresult = valid\nshared = 4782036d6b136ca44a2fd7674d8afb0169943230ac8eab5160a212376c06d778\n\n# tcId = 517\n# special case private key\nprivate = b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6a\npublic = 9f40bb30f68ab67b1c4b8b664982fdab04ff385cd850deac732f7fb705e6013a\nresult = valid\nshared = 65fc1e7453a3f8c7ebcd577ade4b8efe1035efc181ab3bdb2fcc7484cbcf1e4e\n\n# tcId = 518\n# special case private key\nprivate = b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6a\npublic = be3b3edeffaf83c54ae526379b23dd79f1cb41446e3687fef347eb9b5f0dc308\nresult = valid\nshared = e3c649beae7cc4a0698d519a0a61932ee5493cbb590dbe14db0274cc8611f914\n\n",
 };
-static const size_t kLen176 = 129059;
+static const size_t kLen192 = 129059;
 
-static const char *kData176[] = {
+static const char *kData192[] = {
     "# Imported from Wycheproof's xchacha20_poly1305_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: XCHACHA20-POLY1305\n# Generator version: 0.8r12\n\n[ivSize = 192]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 1\n# draft-arciszewski-xchacha-02\naad = 50515253c0c1c2c3c4c5c6c7\nct = bd6d179d3e83d43b9576579493c0e939572a1700252bfaccbed2902c21396cbb731c7f1b0b4aa6440bf3a82f4eda7e39ae64c6708c54c216cb96b72e1213b4522f8c9ba40db5d945b11b69b982c1bb9e3f3fac2bc369488f76b2383565d3fff921f9664c97637da9768812f615c68b13b52e\niv = 404142434445464748494a4b4c4d4e4f5051525354555657\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e\nresult = valid\ntag = c0875924c1c7987947deafd8780acf49\n\n# tcId = 2\naad = \nct = \niv = 6a5e0c4617e07091b605a4de2c02dde117de2ebd53b23497\nkey = ab1562faea9f47af3ae1c3d6d030e3af230255dff3df583ced6fbbcbf9d606a9\nmsg = \nresult = valid\ntag = e2697ea6877aba39d9555a00e14db041\n\n# tcId = 3\naad = 8780fb400f94c55d\nct = \niv = 3ec3f7c45e687d75a895bf5e71809e7cdac32158bb48ec0d\nkey = d821dce9b890ea37ae1c89e7cb6aeae9371b8179add0d08f5494718322ae0071\nmsg = \nresult = valid\ntag = 966c22d655b9e56326024f028cf887ad\n\n# tcId = 4\naad = \nct = 45\niv = 05188738844ab90a8b11beef38eaec3e100d8f4f85ae7a41\nkey = 303ccb2e1567c3d9f629a5c632dbc62a9a82c525674f67988b31bd1dee990538\nmsg = 62\nresult = valid\ntag = d15734f984d749fa3f0550a70c43dddf\n\n# tcId = 5\naad = 6384f4714ff18c18\nct = b0\niv = cd78f4533c94648feacd5aef0291b00b454ee3dcdb76dcc8\nkey = 697c197c9e0023c8eee42ddf08c12c46718a436561b0c66d998c81879f7cb74c\nmsg = e1\nresult = valid\ntag = e5e35f5332f91bdd2d28e59d68a0b141\n\n# tcId = 6\naad = \nct = 5e03\niv = b60ca1ab736deebe4d9da78bc7cbbab91be14a2f884240b7\nkey = c11213bcff39a88b0e3ecc47b23acf6c3014e4708d80dcca162da7377b316ab3\nmsg = 57f9\nresult = valid\ntag = eed21c2cd3f395538d677602964ed578\n\n# tcId = 7\naad = 322f82a87ee82997\nct = b56a\niv = 4fd76cbf27cb387502a706461564e5a5c14e027d40bc6eef\nkey = b0f51b8227013464943370e926b6ed1c9fb45b5994af829ff3a9f998b77d822c\nmsg = ab8c\nresult = valid\ntag = edcafa2c9032aff695e427fc2a344767\n\n# tcId = 8\naad = \nct = 31a461\niv = 737e3e7699f788c4136938c0f65310684eacbb5f96ecd98d\nkey = 17afb080753f2aa0af0a7f4821f6ab2709a6b2b5b9f2f262910e3b27b82c6c1c\nmsg = 2af96a\nresult = valid\ntag = 2b745098b154bb90903b0240c3bc95e9\n\n# tcId = 9\naad = 9d53316bd2aa3e3d\nct = d41c02\niv = 1436f36466fce5db337a73ec18e269e6e985d91035128183\nkey = b720aea3df85fb3fb00583eddbebc5c545bcdcb7f6f2a94c1087950e16d68278\nmsg = 4799c4\nresult = valid\ntag = 8faa889d7f189cd9473e19200ef03920\n\n# tcId = 10\naad = \nct = a3b405bb\niv = 7c39999d498286d974d266b2f027a26d7fbcd330869d9f93\nkey = d7704e505826124ab02935e7349a4e13391e6dc020fee95cd30654cdc5d5f393\nmsg = c44efab6\nresult = valid\ntag = c50e2ddb97df1ee58561c97a7b746c24\n\n# tcId = 11\naad = 8e0ac97934605052\nct = 9406a621\niv = eb4e36c637d1908db2c2ae9c72cfbae50655cb5f6504c4b6\nkey = c70ef9ee59259019960c918bfc91237ed6786c73f2b62427e4cbd4d8096a1f03\nmsg = 2738c9d0\nresult = valid\ntag = 916b78ee04b20b8cd90f00b81bb8091c\n\n# tcId = 12\naad = \nct = 2a01d08fe2\niv = 49875536d4946af49288f36684e25ff35998d50be6bcfcc2\nkey = 7fac2a879ffddf5e36e04e3edcb8aa6be18a8326b28f76b15623307badc1ece2\nmsg = 2c4c38f435\nresult = valid\ntag = 9cbe5f3e782f57a33a45b1f4aeeeea6e\n\n# tcId = 13\naad = 5cbdd482f3429a27\nct = fb5daf8c6e\niv = 88ccb58d435ea760f19e1fa6172139a071c0c5143959a56c\nkey = 48f1389d9222a80898ca26b5cfef5dc82dfc0af7cf66ea1e01bc5279e7414247\nmsg = 945a1fd040\nresult = valid\ntag = ec1682b61957493c2eb758d7a2b7a179\n\n# tcId = 14\naad = \nct = 856c300cfceb\niv = 89c9806ad153b805f1bf5b50738319011d5fc070bb551ee1\nkey = 737cdaa2ce1e4740e75af4aaf68c0296c1607bde871d2452e628f1456239c753\nmsg = fae858dd3150\nresult = valid\ntag = aaa9875ebd42a11d12cf0aca26021f4a\n\n# tcId = 15\naad = 71b29930f84a572d\nct = 6438fc8f8788\niv = 5cbdc34772b54fb4fba9eca1e2745e0e3704d9d7b5c78fb4\nkey = 9f7cd632bd5eb5f017b898590d645571ef56e521024eda36eff893a6ad04b935\nmsg = 53abb8943ada\nresult = valid\ntag = af05a4def2ad39a195a7b8c222050111\n\n# tcId = 16\naad = \nct = 843f1039531fe1\niv = a020b016d952a5948a3d226bb1b73efc39d46845f3bf0ca5\nkey = ecf60cd2af8c7155c0be848ecdaa5baddad6bd5f254a2d98f47bef83999f60ee\nmsg = ea30907da57d78\nresult = valid\ntag = efd99acdab540690ec91a7ad5697cb33\n\n# tcId = 17\naad = 0c87cc97c49e166a\nct = f99f3fb49ec920\niv = b1f05bb66d29bcddf7412f6a556ff7540aac452457dd69e6\nkey = a9376583c47176728d7b2ed1039f0b12b2c7a97563937f7fe976ce4548f7cb00\nmsg = 4a3d9926dc9757\nresult = valid\ntag = 91c3356ee6601ae7073673d2ef30293b\n\n# tcId = 18\naad = \nct = 5b596bab0890286e\niv = f4f3484cacdce37cf5134a12f57903096acd3553607eb682\nkey = bf9ae8ceceb8d3001da7652c4cec02adda8696294a4ab542b41b5ba86c096a75\nmsg = 6eb5e11b358c0ab1\nresult = valid\ntag = d4474d9520f7178e9811f624209721ea\n\n# tcId = 19\naad = 06947c3afa797e99\nct = 80c8e9ac2cec97ce\niv = cc4781134455e89c836f7433bd0426776f945d82f6358276\nkey = d447796ed4ceb2e43942700e7759e335f67afa8653748db95f924c94488195db\nmsg = 77c46ada19c81849\nresult = valid\ntag = 9b62dcc8076098affcb6e7995aaa99a6\n\n# tcId = 20\naad = \nct = 37d696264f781338c9\niv = 200a30270bc911dd3b8a8ea2a6e6ce75be9cfb0f5431db3d\nkey = 08eb57d7bc113f7fbdda1b32237cdd06cccd52ef4a89a831c5e0564370c885ad\nmsg = 704df23a31893799ee\nresult = valid\ntag = 5fddaf74438159acc3c5667b5e84af13\n\n# tcId = 21\naad = 00fc4f61d9777504\nct = a55cbb308f81e449e9\niv = a613e0b17fafb47c79614d39959b986ba2c97b0215676d41\nkey = 9f093b6bb75f1609ab1e00a4bf4667961d885f01deb6520c5bb16ec21e033766\nmsg = 472578ece9fe828dc6\nresult = valid\ntag = 8174bd595da1be72cc226e74c46a4af5\n\n# tcId = 22\naad = \nct = 8bd51b64fcd244f0b3aa\niv = 21b40036745f64b2aab3e89665cf4dab2b690d88721fe9a3\nkey = e421bb3269130c731d1947e7b5d233c11d195ceed1d08634743db9c252bfefa5\nmsg = 1155c7f0ee3e1faa641e\nresult = valid\ntag = dbdd1558934b83ae4393ade73e9edadb\n\n# tcId = 23\naad = e7c9d1dda90b699e\nct = e5aad5c055dc6df73cf0\niv = 33dfa71a0cb2aca008e4c8e8a72dbda4c407bbadd5d7e1a5\nkey = 8a275c90eb8688c5d9e82b74331cf104a2c8757d6257079b1d8035bb40d6a8d9\nmsg = 3c2da491f244acfbd1dc\nresult = valid\ntag = 96fc30292cc8381c345d5f2964ba5626\n\n# tcId = 24\naad = \nct = 2a41cc14a6a65bbb153758\niv = 5a44801d2baabfe8cbee6da52bb51b5297856065fbf33944\nkey = 2d97a35e4b6617e5f4a0f50dcda7622f321cad936a246d9beada9d75e142ef3d\nmsg = b94df0d444dac848ffcad4\nresult = valid\ntag = 1044cd75f2e61cbecbf3a7a77c13ef01\n\n# tcId = 25\naad = d78dcb5431ef5669\nct = 5b3193405830b6840a4474\niv = 07590877a1e1df3a78fe4d04dd64b6cb79f1df45de17685b\nkey = 70d11ca92903865c6a6d8ba497f5a2d65f23b72198d7fc7fdaeda6c2632f7e46\nmsg = f61bb0dd66e5905f1a7ea1\nresult = valid\ntag = 4b10bef8e8a3c2e6ae87fb8fb2a8bdd5\n\n# tcId = 26\naad = \nct = 528dfb79ea182945f13bafb7\niv = 94f86b0fd8a6ed90d3780eca23a82f4387da82b0894ae317\nkey = 05c7317f07a0e89ce1b5ac41df8064faa9fd569ee1c357cd01a2872076477ac5\nmsg = b63e50c9bcd01406b6f78f86\nresult = valid\ntag = 4fc22f4491449bb4ffe6a1eb266e2a91\n\n# tcId = 27\naad = a67a57310055b193\nct = 2345bfc502f9c62d64ad87f9\niv = 829cb09e40c2cc5f7648adc177e56ef53a58bfa16a859338\nkey = 924aafdb5b8a206b3e49aefe8944918cdcc8ccb5bb4b8c4ee81b847aa6fa52a0\nmsg = 68576b935acaab8b33ab62e3\nresult = valid\ntag = 6736f095a28b887238f80dc562eaa25c\n\n# tcId = 28\naad = \nct = d1f725ace69f7899ef51c11dd3\niv = 016dac89c624a9d425ae377132421c37c4486895bef270f0\nkey = 332b7ec9bf4a983eb02af7efee8ffaf5627b66f29e3e4728f50894fe176788d8\nmsg = 8289397a58921bb3201b29c505\nresult = valid\ntag = 0d2858cc30497107a035929fdf2eb6af\n\n# tcId = 29\naad = 4dc711c827a6f626\nct = 6c0e9d31b8e45591726f4cfc63\niv = e8252b018f9e0c3fbd4a6ad0d06346302b8ed7dcb206c3ad\nkey = b75fd9dd7ecca4f3eab36c36a176530dd3ffc825c202613740311d11cd501804\nmsg = 9800f8b835c4ff490ebd764914\nresult = valid\ntag = 2ce700f1f3dc7d3f60607058ac3b817e\n\n# tcId = 30\naad = \nct = 23a49dbe4b699d481621d9fc2db6\niv = e698d39b3cec2634dbe035a55b8fce3b0041aabe4156f713\nkey = 2bddfb332f74ac31fcf91d652c7b41fbcb26a10f2792ecf8075478e645042f87\nmsg = 813974b924c7618c63070d0247f0\nresult = valid\ntag = ef2cfb8423ae6f9faaec81025e6e274b\n\n# tcId = 31\naad = 0b9df4ffd1c9ccbe\nct = 0596f5709407a62fffce84240346\niv = d025b0",
     "188edc9c40a8d6fc807cead97749016c9016d62ea5\nkey = ea029c829c13a580b66aca21133a16933235c11c42905a640104a2ae9bb5cf82\nmsg = a67e672df18cfbe125b212d63ec8\nresult = valid\ntag = 893772def69053b0aaf3bf1c21144ebf\n\n# tcId = 32\naad = \nct = c5aa0caf82b963f1e9b84a789a77d3\niv = 9ce202557c11a57cb14e7e4bd7986f1cf6232196672d25ea\nkey = 1c838d9f68e687fbdddc6dff7f2e44b277bfeb316ae5d11b3e935889b48539d8\nmsg = 37905d98be9839e02923d119a88d56\nresult = valid\ntag = 59c3e2e43cc098ed413ece9d9a6fd47a\n\n# tcId = 33\naad = a2e44e165e7ca5f7\nct = f91d01453f568774115f75b5dad642\niv = ffdca5c51a0852ab18dd484af6664b63ab4097d303450837\nkey = 51a99f0646767fbc01d7736df0340191acfbb5ae0288ed6fff2d34f0ea31470f\nmsg = 93553954f0be4e24185601ce5c3c34\nresult = valid\ntag = 8fc36af6ae5ee3e05b38ed43598bbfcd\n\n# tcId = 34\naad = \nct = 732715c60018fb0ed55c14c1fa9a5273\niv = 25dc279923c1bcdaa7a36e7b884b51f62343abad71986037\nkey = 6a1f808358461e75072a054e2fc4e4c3e7f882c57920dda3278d0c860ca704e3\nmsg = f242209c67698ea32c2152f8785b7d82\nresult = valid\ntag = afe3c4f050bf001e1dfcb2313dd8edd2\n\n# tcId = 35\naad = 8981c7260d514ab6\nct = a7eb11bfaa0d1c2ce457598049399575\niv = c02c8c595064ac303b1be5df6ab43048856e97ae9962fb8f\nkey = 7fb18b56f3f5122585754a3b6c6a4e523036e66793db569c3e8e28032e916eb6\nmsg = 6e8c0bb3361908f5b33e059408651ae3\nresult = valid\ntag = 485a94f61aa5f47a3036e85a57effd2f\n\n# tcId = 36\naad = \nct = 0fd7386b41396e0558495c45cdba029062\niv = 9a61cf35aecbd40a65b35a64b516896f3de7f977b5c9901d\nkey = 3b11469dc670f5dfbe0aad7d15ee4862c92cb07842e5dcc48fa8e5fc817f1749\nmsg = 540731e4ba3e4e2fd623a1a13233736ee7\nresult = valid\ntag = 29f601a11f6a1072342c60b631de6085\n\n# tcId = 37\naad = 23230be73ba2a6fb\nct = 86d0fd1a325d501fe9efe83d3a3f62e346\niv = 6570889af7acab7f555337bdce05499e8eb0d8d3d1a77660\nkey = e6d9fc8a9e3fa6ecadd9faffbb6ff387aa96502e60adadab029a9146ee39de28\nmsg = deec95974eeef6e2b99739bed2f4a74771\nresult = valid\ntag = 1ed9a79616c787a8de2ff5cdac6af0c9\n\n# tcId = 38\naad = \nct = daea40da316b8e78254a737c57063c4ad8b7\niv = f3d84207ab5574e4bc74ae61b17ccaccc7c46eb3471e0e53\nkey = cbaa654cd4ad70ae96d3412680e60522807e9b887ec6dbfcd6e71e917e29ce62\nmsg = f55aaf5a55432c20fb782c552e5ae096eb23\nresult = valid\ntag = e13ff7a7e2c85b1abb5350134dfa7f9b\n\n# tcId = 39\naad = b6bea5c60f288109\nct = eef62d53545698255648a483708c9cc93937\niv = de1e034363b0daec9828159e7996faff33a5f63eb552eb5f\nkey = 5b51ea4943ce173baa53f84a6ef59cb1e25b794768508b8dd8dcbfbc1744c18a\nmsg = 953939dd7601f17071b2bf776e4b1ed629ce\nresult = valid\ntag = 182529b1d07dbcb4bd89b3c5e4c8fac9\n\n# tcId = 40\naad = \nct = 03dfbb3407a55ab0dbc451d0289de44acb5f33\niv = 74533cbe3ff9ec5a66604c88f5dae4d7efe4f604111f79fc\nkey = c5d3917ffb42b0508296cb245d468b04bbaa2c8c8c32e845415a911ea85f95f1\nmsg = 0afab6dbab51f929332d743ccfbb9f34877bc9\nresult = valid\ntag = a050def2e06a9ed3d10be180bafa636d\n\n# tcId = 41\naad = 880ac1004984fb3e\nct = 95a9bd7bf7e9836e5f8a75393c70da0d9b1d97\niv = 562f3b788783bbb72e465c9d04eb555f366c66de32356e7b\nkey = 77cbd62759966c03b4487ce7cb3fca652c30198cdc0de5d447256e979e041c87\nmsg = 0e677082f7dd9c56bd365310c15a18de78df6d\nresult = valid\ntag = f028003066f8902c5d74ca6bc526e346\n\n# tcId = 42\naad = \nct = 4ad85a75f1a975bbf3ee5302b71949036e3a2198\niv = 5fb9a00843c4b192bf6c3bc29451c237f30a607d3c637b85\nkey = 40e231268005ff28c36bd00167ea39131d262f3a591b0d1508c11b00ed04a0b6\nmsg = d34b950a1c4f2ae5c94a1fddd6574c5d9c0ab18f\nresult = valid\ntag = b82c05b09328949aa70bb537e871cd70\n\n# tcId = 43\naad = 043cd9069dbd8cb5\nct = dfca9d845c21093f43348a4f6e72e324e9673129\niv = 7ade1bc01148ac071bfbe9870fe2023a7769b92312f45e0a\nkey = d66e92c86712132b1e3f5ba3a4cd006b9de1fa444246d99ef02e5b190a73089d\nmsg = 1cf9f2a93cb056fa4222c5850872d9989bc8c185\nresult = valid\ntag = 9defc3de90d493be2a1945d11c569095\n\n# tcId = 44\naad = \nct = 74634f111539fac80bb29d76ba656e5af90fd37f8e\niv = 45ccb4a19073c79a4ac1e052d4664d0dd1c730a6a2e87fe8\nkey = 841404f7e07cdebeb48efd25a75444b6de170995cd460e38ff5930dc9cf5eba2\nmsg = 5d583f68421d00cd8d95896a091b9bb10b744c61c4\nresult = valid\ntag = c04ce25d27416ae5f181238acf9508bc\n\n# tcId = 45\naad = 91b46ee1f7a9361b\nct = 0c1afa5419abb32e479b181a6e51cd99eb041bc37d\niv = 89248df60acfa757945d12647a14cc5bc6508bb2b9e4999c\nkey = 77a812cdbce2b7327dbbaecf6f81340b0ac97589676939d1ff0e69c3373326a3\nmsg = 2573f8f0276ce3b2b38fb727575f376a2eeb305758\nresult = valid\ntag = 6c0b51ea2fc63841893216b03eb47be0\n\n# tcId = 46\naad = \nct = 59d9c3f18cbc59a3c04cdc6904cb860aae69a5485147\niv = ec272b052c33c84a611512a483c3fcec40501240eb7a42ee\nkey = f2f9bdba59206e8c31a3338213d6a46a40aee237f631906aff076fe2d29d3b85\nmsg = 408c4cac91b4bd3ce25c8971b1ed8adb20ed667f8393\nresult = valid\ntag = 63e55e220873e295a5b86543334b1715\n\n# tcId = 47\naad = 1bc37fc6729b401d\nct = d5a1f87dae98ab385d5d34626c295cca0ed6931635f4\niv = a131b4b0582be36dcce56beb036ec4fc31147efed7ff4718\nkey = d9aa0213bfac5ee89f9ef2c6f616d8f71c3725dafe7926504e18b141192c33b0\nmsg = 081280932efbce0a5500d76d41c7dd2ddbc3311dc0cd\nresult = valid\ntag = 25f2fa45c86c4cb0f02f99050e9d5ab7\n\n# tcId = 48\naad = \nct = 93034cdc9298d0086b8e8bbf3aea637484454015cf544d\niv = df72b7fe00eb070276ba1b0de6b17a6100fe0d660bf3c6c7\nkey = d7b0b278c5ede48da2db2f6ec6f8b23282d3c940bd1eb59f7102bf69c683298d\nmsg = 0f44c184d297c0a66467d54ac982f922b119d5b4c8b238\nresult = valid\ntag = b1e1dcf03663a995c6c14991b5558159\n\n# tcId = 49\naad = 04e0e991fb5a465e\nct = 83a8bbe26ad18129459f66f6dc771c653a3dbb88a00b11\niv = 0378f12d4891c68477d90f16f2ff59287c81922b73cec608\nkey = bd5040047cd7bd0bd1ca22164058a2901feb383c1ccba5c71c853f186d4e2b9e\nmsg = 29b7080f92c860ca4dd501f18b041c5cbc5c131783a720\nresult = valid\ntag = 791971c0f5ba2c8b7635924267c68f32\n\n# tcId = 50\naad = \nct = 1a0bc208b17fb629200e805da495db70c599ecb3c3b9cc94\niv = c9f5d4dfd5dd2276d68b25c6178d9ef2f38756df4be9d4b3\nkey = 3b96dbe28ee07208cdf703f1488f478134147363da1502249e025e0efe5cb663\nmsg = 8f37fd7e3e2f6563a9883d4adb92b5c37242a56b73a6fb7e\nresult = valid\ntag = 08b9477bc98543019ddaa7ae380f83dd\n\n# tcId = 51\naad = e1b2f309ce5fabe8\nct = e9dd13d48dd7258682311bfec967e1a1ebc562855f224f41\niv = 90b932e3464c8b66d3d2fec2bc9097289f147e05f18a9867\nkey = 53fc679ebe23b70714ab4ce6c8b0de5df656dca27177512654da31f6848dbe6b\nmsg = 8b0b4038c0eebea97fa1f93b7c2f3576898e7cdc9fd702d0\nresult = valid\ntag = d9038207dbfc82a9a9d507fe254d57c2\n\n# tcId = 52\naad = \nct = 666f807a6e5d0253fe1967d45efea42cf1f421789b7f48e0dc\niv = d758776af8d089ef14a075ddf683e6669ed8109fe5681833\nkey = 275ac60ffa734bf86601c951d0bd263b9651181c32f41fce90d59cb8d59da081\nmsg = 1fa3b565515a429f78fb36e93e048425ffb64bc9e9e68336b3\nresult = valid\ntag = 5d423636988dd257e5cbd40ee28ae94e\n\n# tcId = 53\naad = bbcbfa1779f4122c\nct = 369a80f75ad28fd05cb3c944e0a8c8b37ce65bbd1f6d4b355a\niv = 9628e46f25d08b206371449e7321d6bf5d811629e01ef32b\nkey = ec4d4b14860a36fe8afb2861c1376db8004cc2d37eb1ebb609343daf24bc39fb\nmsg = 201ec6c1d0675e818cb7a4e583ea1aa1afde1bbda1f0f549e1\nresult = valid\ntag = 3ca5005eda0b99d6566ac841340ad23a\n\n# tcId = 54\naad = \nct = b6faccf43dabd8965cb231fe96a2bdf2cb51e0b9afb6445c21eb\niv = ec3dae28ec71ceba5b97a933d30b9fb98a40d4c92e6f54ef\nkey = 53f9c2c335c1c5cde744e890f6bd291e4484925aaa036f1e74f0144603322648\nmsg = 00f4f6a8c09ecbff3e6e825ca676a5cb8373d4915ecaf5d317a1\nresult = valid\ntag = ee91b39d01a114f80a7c5e7e1a0b2868\n\n# tcId = 55\naad = a6d7d9034512781c\nct = c97a4ba644788bfdeeb0a5de228948902a57359879c82cf8ead9\niv = a7f4c26140ba7d8a884de794fb23a50c6647627fa85ef9f7\nkey = 9bb8bc991f01fb26df610032e1bf6ed0e2652629a6726aec9c23df4fefbdb594\nmsg = ebcb0777bd1c3385376270e543521e11f4bac00d0f9c0192581e\nresult = valid\ntag = bf51aa205497db895f008d828040150f\n\n# tcId = 56\naad = \nct = 28cf032caf586255ee3f3f70492d33458a7b42473b8e354d983dfd\niv = 7e4c8d0e24ab24f500053964774c92f808bafc42be0f6a34\nkey = 69b8b0846c47226dbb278f83082b75476e89a77444bfa06de69395f16c6eed01\nmsg = 3b406d4c07f2ef751ac701fe944b2392bd59fb0ee4b32e6cbf8958\nresult = valid\ntag = 58896a5d7618837701ed8dda9b18d82c\n\n# tcId = 57\naad = f5fa84749ff438f4\nct = be95d62d6acb3e5344f6b4ddbddfb45fa479c2d1577a42967dc0ad\niv = 26b2165f4b22415df4c052564b87d62c4c2c01df47c82cd8\nkey = aa6d2da8fe7ce3228f15e09ae8c7f3d1b0220679a3e0e13e7523060b5b8d09b6\nmsg = 92763e759a5c0b8c4d40d6398fa9e257900ff4b1f31000dbd9a15e\nresult = valid\ntag = 61ac094fefb1237c9d44ab7f4bbbf5f9\n\n# tcId = 58\naad = \nct = 2248e5332ed42c42fcb6a029e3d8f9f96cbc32d34fa5f302fabf1bf3\niv ",
     "= b595d9204461e311915cc17df51a3bbfa55c3a98aafbbaee\nkey = 31b9e848dfd3dd1ec05410975190109f550ee6e5235f040ce6faf6c380fba49d\nmsg = 95272cdea7a15889059b4e1de058c869e1776384159539470b542ed8\nresult = valid\ntag = b777e88479292944c5d6ace1ffd24ac2\n\n# tcId = 59\naad = 96fc6284d7eeb53c\nct = b10f9fbd87f51ebeae1942b9afb59749987b1575babd8008b281a662\niv = bc101b6d01bda7e13d402aa0023f0507ab02aa58758cb6aa\nkey = da132c34b2291a15777d3ebda2ed0078028c215038c2410d822578dcc869ea8d\nmsg = 331f3d53965bfee2edb463c5b21751eb445289287fada2aedae99258\nresult = valid\ntag = 54ad4e664b86333223fca6869c501dc2\n\n# tcId = 60\naad = \nct = ffb587ec97c7d11ca75629f066881f6b2c392fa71b73fc4cb4559a645d\niv = 4adcd5ecf1506fe7a38adf5634b454bf90278c9ebffbac87\nkey = d7e5e9c008af44266c876fa6b02a453854703c1a4fd221573c382c8d512a982d\nmsg = f8b3ae84d6502d353d57c970da5f9bc53de7a5c6262ba7a7b2220d0ee1\nresult = valid\ntag = ec9db510c3bb11831c20684d82e45053\n\n# tcId = 61\naad = cec8c976f2e25979\nct = 5d3ce03a6f43eab32a91b6eb87666af14e5e28d98d23c49c56557497d5\niv = 055776b422138960f6631e3c58f3ba0688082747de4ae5f6\nkey = 1e72be02d7ebf3c78b400efd005f5b6b983ede08443541475808d43e6d30eab8\nmsg = f2654733ca29af4bb29347f7a6508ed87913e0faa885505928ac1ee86e\nresult = valid\ntag = b324b10851d159bd3822705a9d638038\n\n# tcId = 62\naad = \nct = aa6edcb0f49535b2d2fa2e5f0b29343ba0c9c1667c401c78a3a8b8a61ad2\niv = cb52ad5674aff0762ef49fb3bed4722dcef2bcbc4f3c316a\nkey = 98362eff7af1e38d3d77d4a013bb6bf3fb3690568bf897651c578b21572fd37e\nmsg = a40610eaf3a823c06936293473ca36a2952d0eb5e5bbc18be123a07f8bc8\nresult = valid\ntag = 98d5e90a5a64e411c98d7c9e91557f5c\n\n# tcId = 63\naad = f5203e702570c4b1\nct = 3d1add00e51e60b16825272790ff47c0d533bfe65484d105ee7a69896c48\niv = f2f09c3469e2cf73b07620e461d7b1ad999c5f7d54867d21\nkey = 8f0e3dc43b86943ed4b0361fa5aa49999f24bc1e102bf3afb439e44f9ce43504\nmsg = dba4ed2a7938826c43548f6976d8f0ec1838fe71cc535b2a5d56e4d3d5ca\nresult = valid\ntag = a018e2629d5656920f1202e65624b056\n\n# tcId = 64\naad = \nct = 1ca6389e16c2f43e9e89447991d1472c8283a8dd94fdf61c4f5aee746cb537\niv = 17d6ff40ad135ac9df55fa5c0eaf03e5d91cdac63c684e8e\nkey = 16a376d68b3105262a07558e5e448ecdcbe075770cf60e7b7db1420f4fa4e36d\nmsg = bdb5500794edd38a398f18f83de03e16f135ea960d3b8c6578abc541aa1d03\nresult = valid\ntag = 33107bbbc06e563abf48979dbc7c66b6\n\n# tcId = 65\naad = 3fe9ad465d0aa3fa\nct = e8ae311bf2e80d696c543cd272d3e50dc968a0ab47259c461e0dec35f77530\niv = c306b69443bfdbedb5ce9f9bb6088132a88e8a175d3bd769\nkey = 8e1fb8cc57ca60ae091d27e292923272439c37f2dede36b2c2aaee96439d5a31\nmsg = 1d884a83a5f9b00b8951ef81778bd7c991cdc911127eee9dfeff82c48ca937\nresult = valid\ntag = 906de4c31eb2ce283eeb95388b0d83ce\n\n# tcId = 66\naad = \nct = d34c1778d105d0e80d429c86b879d52835cf8aebc5a04a9084cff1f9646e040a\niv = 0140f2791eb81fd4b69edf2d9ba4b2d62eab1d296741583f\nkey = 2ed460a56867ee1a2877a8f3d2d98fb886cfcc8913e31c3d08f42374ba37ebb1\nmsg = 318cc4bf151c3baaee5a783ec091ab618f2ecacf38c962ba9c32c323696cc94c\nresult = valid\ntag = ac8a68605a0567c559442342b764b964\n\n# tcId = 67\naad = 1264b91e71865033\nct = cc24cfa62063d11b2c31cf25ceb7308ca376feb1dd6bc102ed7db8ed46b06759\niv = 97438f178419732feaade58a5d5c21bed14d04c4add50465\nkey = b43328e39cc6f6e94ea601fbebadb4b41cfe6a52c3a4d5eeabaa9853db45ccb1\nmsg = 63cb5c20c9edf36757b795921437d3fd228af1fcdbb329505cbdde12afaf9f84\nresult = valid\ntag = dda7fc160e23f57e8392809f1e3b5ee8\n\n# tcId = 68\naad = \nct = 82be237be008228a8a9ff1a506d5b893cf9dcaa1dd33c0523b13582bcade4629ef\niv = daca1f50a4c0d9b77151c75f2e58ce404847d0aab493086d\nkey = 92b9b40c00480a50ee16a86349a46e37b02d5ba74d2e5a67eaf333e467fa0152\nmsg = c857f3c55da61d72563912a2534e01b6426ba41bf417c15b725086d31a1645c94d\nresult = valid\ntag = 723437af0b684b6e04024352206cbaf9\n\n# tcId = 69\naad = aaefd84240ade0ed\nct = ff98ead89d45d70f09b9e3f31f4ff56ae8b8cad1517294a8af3c962bad24a92efe\niv = ffcaddf85da09293c4352c81cbb5dd82e30b0f9e7623e92a\nkey = 5c271bac09a0454c83d158bcc9ec331ca92e62726903b7bb5799adff47d671ee\nmsg = 7c716a5b6cf0b8b0e1ff825ff9324bb5715b0d40af5338d5337f66de681932d423\nresult = valid\ntag = 4b8a06a1613737d0f8e3fb88184b23e4\n\n# tcId = 70\naad = \nct = d0e84c6450f348d887c49c4b44ac38721d4a1742e72095c330249c7348bade49dc776d449272e0f3dd5422c2a6ab18\niv = 64cc9f3cc334abce364cec9efe8ad54117ff0bbb03e3e8b9\nkey = c28403cce44ff256d055c2cbc84bb2d9773346e0d51bd38e80cebd861b03fa30\nmsg = f9e8f60b70044b03a189c26f1c8fd246239bc23f8adf0f88516f88d73d11c9290882bb6ad49d956b10c9f848180065\nresult = valid\ntag = 28c72dea441cffac2f7811286f8ea5dd\n\n# tcId = 71\naad = 7185f9cbf59d2095\nct = 4093dcbca1555835b78140fe7a3798a77bd97a01b0a7c1f7157fedb27c40d9d16cc3e935f649faf0dcf431636cd539\niv = 7b97c8b1c06b69b99220042ab2ac65b88d8b4294b76b4bd1\nkey = 7c72c748ea0010c90e1dfbde8e91edf6ead2474148cf234e0559dcd881cc3b2b\nmsg = 9a1f6c42a8a0f3032e8dfa36e0f5750479276866c920672a0454c41bfae5dd74fbf0fbcc8e6fbf4843f20d06440837\nresult = valid\ntag = c7c9133ff17a296c987d72885182874d\n\n# tcId = 72\naad = \nct = 764ab84b844b57b0564f63ec70ad12d81dc3a0e65233a9bf06d6b2c653787eb991bc37a885a04509690ab49fd8dedcabe3c346df9036d735de3bf73ab03f5ba7\niv = 8052acef0423bb07a6fbaf8f63039f1eaa2cdefc61b31b18\nkey = 7948151a374363d07dfb12869b7f90502f2de8117d3d72d5133b9b3e3dc78ef7\nmsg = 76e03034be5514561e99c32ab58901eabac0f67b40c366202ac8a08ee3f68c3b283c1adeefee6f5544330d4771e5148c5231ec27b3f3f9d81a3dca52e115e1b5\nresult = valid\ntag = 075248c91d1f246aebaa96c86627d18e\n\n# tcId = 73\naad = dc514d540551b9dc\nct = de03f775aee744e4148e008dfefa7156ce2a23a613d4d9cae99c3164f54a173f895a9466ef046c020179383d70c813e765f207860c79dcf627f17663ea76af20\niv = f357e3b3d3d5e4187e34da08afd4817635adde91b676da1d\nkey = 50a1b2b155150936609d45596e9175f3271be548574405f827593fc5a0578c3a\nmsg = e854b8531ace95c975a5b1497f3dec6d80b29ca673690411abe277bbfd29fa00133ee17570805c1c605452d648581be8db878e782f217b481b1268591593efc0\nresult = valid\ntag = b473a9f1d5312d556bd0b62d84bb0803\n\n# tcId = 74\naad = \nct = 98fc26e0cfd5a75b5bcd9e046e89c6e9dc5aaefdd5e8ea7e4d286dcdaca0fe6ae744d244678f91c9ccf6e294bd5586be671645ae87d3435836a5ab383b253602c25a6cc04353c076725b4fc4aff9b4dc9bd194fe92ef0a920f15d6b8fea9f19065\niv = 6d609141e3e4331f55344c1f5e6fad589b39ec1d12b9fbf0\nkey = 92570a01d2b6123b67055400c8a9b0cb948e32c9b8520758cd1abd73f83c8507\nmsg = e86fc97c194d37a5e1345d139fe82dd669b6350c435cb446fcbdcc90fe5859bb2ef1f69d930e29dc343b57dfd7ff3c382652939bbd1c978a790ed1dbe5ad1fcbe157925ab4335c649c2f80c19d541e9e7eb4feb64e596bc6d7df8aa3476e0a9f7e\nresult = valid\ntag = 03bb49593f116a30a8390f96380a9888\n\n# tcId = 75\naad = e40cb55a18f2885f\nct = 7042beb6e4f08e583752f23048e2f3433e0821423d72a7e531b86684b57b32c5bdcc11164db0b8516d7b463cf7f8b0e3ed8a7d584345934ef184e4f8fee31e126601f08558c725aaa23d38c8017b07adbf1e742128795b03458b581b8cd9100bd9\niv = 1a80def5bd8be8eef5f6643a5c1aed9947c3ee5ca0cb56df\nkey = 4a3bc8f5c4aab87c20772404a291c1d6d68eb12e5f3c82e582564d6300fc28c9\nmsg = 2b0815f7eb0a83b9617e4f0906e9179b600b0c822bfb56c5012103aecb4550a57099dcebae00b6c06f3537fb1550c78b249d00a4007d23b882cb5511fdd53482575554028e9db437b8224368ead730d157a64d5571c706cbd9c0d2b10b3b14c3e2\nresult = valid\ntag = b5e3df83f18cbc0bd99427b9a172bf1b\n\n# tcId = 76\naad = \nct = cf2e17f9d8c6562de6d3e8c8bc30ba2904cf5c3616d15ea77667186ee45f444ea264327dcf210b6735a39005b62529d557480ed0462e49d982cf5962e5ee6d8ccc388d5de102e676a55426ce5a873d2e84a2d841e7b30c7ab19035274886b3c5c979d065bdde9b0b9e466b22559e30a5a5abc4817312e15d2c0dcdd99d867361\niv = 3507ec4cd1a6c2eaf081ec32888e08839481f35b3b0f7872\nkey = 2e89767b15f18b855d04c0b6b47c1f8facc9a058e2194ad2ad901ef940ab54cb\nmsg = eff2e375228756f995b8ab52213177c4b7ca92bc81114f5c23aa64dd7eaff7b86ee2e674984c4b65bf4c5ff402e23902c005e05de25b3c6e8a64323aeafe04ec6cd1f6c851be39e55208d76476d3ed7100042eccb72cf1349ea101253b7a5a4a8677c1d6df5a54e9c24558e2d68c3f50acbd1ebbb4773884b0ff23d95a4ff60d\nresult = valid\ntag = c844d555bb43a83b4aa735b2aa1d566a\n\n# tcId = 77\naad = e2f0d2f16704527e\nct = 4f0e805a2b3f2e1bfe3c06c83f5c77b9c4e562514a78f9f2cbf3206f68f686923656885878087d17da261666e798649d74841753525875f425e82a4795fdf8dfb629a8b1d2faa5594557d62f421f4e6a5dbb9f8336875f2fe2e2a4a1d0084358d9583e6b6662895a07c924c0a7cdba07be8a020e1b8ef3a0b5d007ec47a8e8cf\niv = 0a5914f29abb1cb48dc686159f09480370477f6069018e18\nkey = 6357cd94e2d9503288eaf3abf9604b050d4a483350a828029baaa9cae184f075\nmsg = bb266ddea2f88c2f0fea7f0cf4a1a3336334",
@@ -4467,522 +4566,570 @@
   if (strcmp(path, "crypto/cipher_extra/test/aes_128_ccm_bluetooth_8_tests.txt") == 0) {
     return AssembleString(kData4, kLen4);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt") == 0) {
     return AssembleString(kData5, kLen5);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt") == 0) {
     return AssembleString(kData6, kLen6);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt") == 0) {
     return AssembleString(kData7, kLen7);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt") == 0) {
     return AssembleString(kData8, kLen8);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_192_gcm_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_128_gcm_tests.txt") == 0) {
     return AssembleString(kData9, kLen9);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_192_gcm_tests.txt") == 0) {
     return AssembleString(kData10, kLen10);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt") == 0) {
     return AssembleString(kData11, kLen11);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_ctr_hmac_sha256.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_tests.txt") == 0) {
     return AssembleString(kData12, kLen12);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_randnonce_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_ctr_hmac_sha256.txt") == 0) {
     return AssembleString(kData13, kLen13);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_randnonce_tests.txt") == 0) {
     return AssembleString(kData14, kLen14);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt") == 0) {
     return AssembleString(kData15, kLen15);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/chacha20_poly1305_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/aes_256_gcm_tests.txt") == 0) {
     return AssembleString(kData16, kLen16);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/xchacha20_poly1305_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/chacha20_poly1305_tests.txt") == 0) {
     return AssembleString(kData17, kLen17);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/cipher_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/xchacha20_poly1305_tests.txt") == 0) {
     return AssembleString(kData18, kLen18);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/cipher_tests.txt") == 0) {
     return AssembleString(kData19, kLen19);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt") == 0) {
     return AssembleString(kData20, kLen20);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_tests.txt") == 0) {
     return AssembleString(kData21, kLen21);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt") == 0) {
     return AssembleString(kData22, kLen22);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_gcm.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt") == 0) {
     return AssembleString(kData23, kLen23);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_128_gcm.txt") == 0) {
     return AssembleString(kData24, kLen24);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt") == 0) {
     return AssembleString(kData25, kLen25);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt") == 0) {
     return AssembleString(kData26, kLen26);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt") == 0) {
     return AssembleString(kData27, kLen27);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_gcm.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt") == 0) {
     return AssembleString(kData28, kLen28);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/aes_256_gcm.txt") == 0) {
     return AssembleString(kData29, kLen29);
   }
-  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt") == 0) {
     return AssembleString(kData30, kLen30);
   }
-  if (strcmp(path, "crypto/curve25519/ed25519_tests.txt") == 0) {
+  if (strcmp(path, "crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt") == 0) {
     return AssembleString(kData31, kLen31);
   }
-  if (strcmp(path, "crypto/cmac/cavp_3des_cmac_tests.txt") == 0) {
+  if (strcmp(path, "crypto/curve25519/ed25519_tests.txt") == 0) {
     return AssembleString(kData32, kLen32);
   }
-  if (strcmp(path, "crypto/cmac/cavp_aes128_cmac_tests.txt") == 0) {
+  if (strcmp(path, "crypto/ecdh_extra/ecdh_tests.txt") == 0) {
     return AssembleString(kData33, kLen33);
   }
-  if (strcmp(path, "crypto/cmac/cavp_aes192_cmac_tests.txt") == 0) {
+  if (strcmp(path, "crypto/evp/evp_tests.txt") == 0) {
     return AssembleString(kData34, kLen34);
   }
-  if (strcmp(path, "crypto/cmac/cavp_aes256_cmac_tests.txt") == 0) {
+  if (strcmp(path, "crypto/evp/scrypt_tests.txt") == 0) {
     return AssembleString(kData35, kLen35);
   }
-  if (strcmp(path, "crypto/ecdh_extra/ecdh_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/aes/aes_tests.txt") == 0) {
     return AssembleString(kData36, kLen36);
   }
-  if (strcmp(path, "crypto/evp/evp_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/bn/bn_tests.txt") == 0) {
     return AssembleString(kData37, kLen37);
   }
-  if (strcmp(path, "crypto/evp/scrypt_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/bn/miller_rabin_tests.txt") == 0) {
     return AssembleString(kData38, kLen38);
   }
-  if (strcmp(path, "crypto/fipsmodule/aes/aes_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt") == 0) {
     return AssembleString(kData39, kLen39);
   }
-  if (strcmp(path, "crypto/fipsmodule/bn/bn_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt") == 0) {
     return AssembleString(kData40, kLen40);
   }
-  if (strcmp(path, "crypto/fipsmodule/bn/miller_rabin_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt") == 0) {
     return AssembleString(kData41, kLen41);
   }
-  if (strcmp(path, "crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt") == 0) {
     return AssembleString(kData42, kLen42);
   }
-  if (strcmp(path, "crypto/fipsmodule/ec/p256-x86_64_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt") == 0) {
     return AssembleString(kData43, kLen43);
   }
-  if (strcmp(path, "crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/ec/p256-nistz_tests.txt") == 0) {
     return AssembleString(kData44, kLen44);
   }
-  if (strcmp(path, "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt") == 0) {
     return AssembleString(kData45, kLen45);
   }
-  if (strcmp(path, "crypto/fipsmodule/modes/gcm_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt") == 0) {
     return AssembleString(kData46, kLen46);
   }
-  if (strcmp(path, "crypto/fipsmodule/rand/ctrdrbg_vectors.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/modes/gcm_tests.txt") == 0) {
     return AssembleString(kData47, kLen47);
   }
-  if (strcmp(path, "crypto/hmac_extra/hmac_tests.txt") == 0) {
+  if (strcmp(path, "crypto/fipsmodule/rand/ctrdrbg_vectors.txt") == 0) {
     return AssembleString(kData48, kLen48);
   }
-  if (strcmp(path, "crypto/hpke/hpke_test_vectors.txt") == 0) {
+  if (strcmp(path, "crypto/hmac_extra/hmac_tests.txt") == 0) {
     return AssembleString(kData49, kLen49);
   }
-  if (strcmp(path, "crypto/pkcs8/test/empty_password.p12") == 0) {
+  if (strcmp(path, "crypto/hpke/hpke_test_vectors.txt") == 0) {
     return AssembleString(kData50, kLen50);
   }
-  if (strcmp(path, "crypto/pkcs8/test/no_encryption.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/empty_password.p12") == 0) {
     return AssembleString(kData51, kLen51);
   }
-  if (strcmp(path, "crypto/pkcs8/test/nss.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/no_encryption.p12") == 0) {
     return AssembleString(kData52, kLen52);
   }
-  if (strcmp(path, "crypto/pkcs8/test/null_password.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/nss.p12") == 0) {
     return AssembleString(kData53, kLen53);
   }
-  if (strcmp(path, "crypto/pkcs8/test/openssl.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/null_password.p12") == 0) {
     return AssembleString(kData54, kLen54);
   }
-  if (strcmp(path, "crypto/pkcs8/test/pbes2_sha1.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/openssl.p12") == 0) {
     return AssembleString(kData55, kLen55);
   }
-  if (strcmp(path, "crypto/pkcs8/test/pbes2_sha256.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/pbes2_sha1.p12") == 0) {
     return AssembleString(kData56, kLen56);
   }
-  if (strcmp(path, "crypto/pkcs8/test/unicode_password.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/pbes2_sha256.p12") == 0) {
     return AssembleString(kData57, kLen57);
   }
-  if (strcmp(path, "crypto/pkcs8/test/windows.p12") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/unicode_password.p12") == 0) {
     return AssembleString(kData58, kLen58);
   }
-  if (strcmp(path, "crypto/poly1305/poly1305_tests.txt") == 0) {
+  if (strcmp(path, "crypto/pkcs8/test/windows.p12") == 0) {
     return AssembleString(kData59, kLen59);
   }
-  if (strcmp(path, "crypto/siphash/siphash_tests.txt") == 0) {
+  if (strcmp(path, "crypto/poly1305/poly1305_tests.txt") == 0) {
     return AssembleString(kData60, kLen60);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_ca.pem") == 0) {
+  if (strcmp(path, "crypto/siphash/siphash_tests.txt") == 0) {
     return AssembleString(kData61, kLen61);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_0.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_ca.pem") == 0) {
     return AssembleString(kData62, kLen62);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_1.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_0.pem") == 0) {
     return AssembleString(kData63, kLen63);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_10.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_1.pem") == 0) {
     return AssembleString(kData64, kLen64);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_leaf.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_ca_pathlen_10.pem") == 0) {
     return AssembleString(kData65, kLen65);
   }
-  if (strcmp(path, "crypto/x509/test/basic_constraints_none.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_leaf.pem") == 0) {
     return AssembleString(kData66, kLen66);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/basic_constraints_none.pem") == 0) {
     return AssembleString(kData67, kLen67);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_authority_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate.pem") == 0) {
     return AssembleString(kData68, kLen68);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_basic_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_authority_key_identifier.pem") == 0) {
     return AssembleString(kData69, kLen69);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_ext_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_basic_constraints.pem") == 0) {
     return AssembleString(kData70, kLen70);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_ext_key_usage.pem") == 0) {
     return AssembleString(kData71, kLen71);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_name_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_key_usage.pem") == 0) {
     return AssembleString(kData72, kLen72);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_subject_alt_name.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_name_constraints.pem") == 0) {
     return AssembleString(kData73, kLen73);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_subject_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_subject_alt_name.pem") == 0) {
     return AssembleString(kData74, kLen74);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_intermediate_subject_key_identifier.pem") == 0) {
     return AssembleString(kData75, kLen75);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_authority_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf.pem") == 0) {
     return AssembleString(kData76, kLen76);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_basic_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_authority_key_identifier.pem") == 0) {
     return AssembleString(kData77, kLen77);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_ext_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_basic_constraints.pem") == 0) {
     return AssembleString(kData78, kLen78);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_ext_key_usage.pem") == 0) {
     return AssembleString(kData79, kLen79);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_name_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_key_usage.pem") == 0) {
     return AssembleString(kData80, kLen80);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_subject_alt_name.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_name_constraints.pem") == 0) {
     return AssembleString(kData81, kLen81);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_subject_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_subject_alt_name.pem") == 0) {
     return AssembleString(kData82, kLen82);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_leaf_subject_key_identifier.pem") == 0) {
     return AssembleString(kData83, kLen83);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_authority_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root.pem") == 0) {
     return AssembleString(kData84, kLen84);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_basic_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_authority_key_identifier.pem") == 0) {
     return AssembleString(kData85, kLen85);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_ext_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_basic_constraints.pem") == 0) {
     return AssembleString(kData86, kLen86);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_ext_key_usage.pem") == 0) {
     return AssembleString(kData87, kLen87);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_name_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_key_usage.pem") == 0) {
     return AssembleString(kData88, kLen88);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_subject_alt_name.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_name_constraints.pem") == 0) {
     return AssembleString(kData89, kLen89);
   }
-  if (strcmp(path, "crypto/x509/test/invalid_extension_root_subject_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_subject_alt_name.pem") == 0) {
     return AssembleString(kData90, kLen90);
   }
-  if (strcmp(path, "crypto/x509/test/many_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/invalid_extension_root_subject_key_identifier.pem") == 0) {
     return AssembleString(kData91, kLen91);
   }
-  if (strcmp(path, "crypto/x509/test/many_names1.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/many_constraints.pem") == 0) {
     return AssembleString(kData92, kLen92);
   }
-  if (strcmp(path, "crypto/x509/test/many_names2.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/many_names1.pem") == 0) {
     return AssembleString(kData93, kLen93);
   }
-  if (strcmp(path, "crypto/x509/test/many_names3.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/many_names2.pem") == 0) {
     return AssembleString(kData94, kLen94);
   }
-  if (strcmp(path, "crypto/x509/test/some_names1.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/many_names3.pem") == 0) {
     return AssembleString(kData95, kLen95);
   }
-  if (strcmp(path, "crypto/x509/test/some_names2.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha1_explicit.pem") == 0) {
     return AssembleString(kData96, kLen96);
   }
-  if (strcmp(path, "crypto/x509/test/some_names3.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha1_mgf1_syntax_error.pem") == 0) {
     return AssembleString(kData97, kLen97);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_authority_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha1.pem") == 0) {
     return AssembleString(kData98, kLen98);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_basic_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha224.pem") == 0) {
     return AssembleString(kData99, kLen99);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_ext_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_explicit_trailer.pem") == 0) {
     return AssembleString(kData100, kLen100);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_key_usage.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_mgf1_sha384.pem") == 0) {
     return AssembleString(kData101, kLen101);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_name_constraints.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_mgf1_syntax_error.pem") == 0) {
     return AssembleString(kData102, kLen102);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_subject_alt_name.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_omit_nulls.pem") == 0) {
     return AssembleString(kData103, kLen103);
   }
-  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_salt_overflow.pem") == 0) {
     return AssembleString(kData104, kLen104);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_salt31.pem") == 0) {
     return AssembleString(kData105, kLen105);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/aes_cmac_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_unknown_mgf.pem") == 0) {
     return AssembleString(kData106, kLen106);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/aes_gcm_siv_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256_wrong_trailer.pem") == 0) {
     return AssembleString(kData107, kLen107);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/aes_gcm_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha256.pem") == 0) {
     return AssembleString(kData108, kLen108);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/chacha20_poly1305_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha384.pem") == 0) {
     return AssembleString(kData109, kLen109);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/dsa_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/pss_sha512.pem") == 0) {
     return AssembleString(kData110, kLen110);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/some_names1.pem") == 0) {
     return AssembleString(kData111, kLen111);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/some_names2.pem") == 0) {
     return AssembleString(kData112, kLen112);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/some_names3.pem") == 0) {
     return AssembleString(kData113, kLen113);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp521r1_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_authority_key_identifier.pem") == 0) {
     return AssembleString(kData114, kLen114);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha224_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_basic_constraints.pem") == 0) {
     return AssembleString(kData115, kLen115);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha256_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_ext_key_usage.pem") == 0) {
     return AssembleString(kData116, kLen116);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha512_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_key_usage.pem") == 0) {
     return AssembleString(kData117, kLen117);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp256r1_sha256_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_name_constraints.pem") == 0) {
     return AssembleString(kData118, kLen118);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp256r1_sha512_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_subject_alt_name.pem") == 0) {
     return AssembleString(kData119, kLen119);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha384_test.txt") == 0) {
+  if (strcmp(path, "crypto/x509/test/trailing_data_leaf_subject_key_identifier.pem") == 0) {
     return AssembleString(kData120, kLen120);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt") == 0) {
     return AssembleString(kData121, kLen121);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/aes_cmac_test.txt") == 0) {
     return AssembleString(kData122, kLen122);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/eddsa_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/aes_gcm_siv_test.txt") == 0) {
     return AssembleString(kData123, kLen123);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/aes_gcm_test.txt") == 0) {
     return AssembleString(kData124, kLen124);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/chacha20_poly1305_test.txt") == 0) {
     return AssembleString(kData125, kLen125);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/dsa_test.txt") == 0) {
     return AssembleString(kData126, kLen126);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp224r1_test.txt") == 0) {
     return AssembleString(kData127, kLen127);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp256r1_test.txt") == 0) {
     return AssembleString(kData128, kLen128);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha224_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp384r1_test.txt") == 0) {
     return AssembleString(kData129, kLen129);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdh_secp521r1_test.txt") == 0) {
     return AssembleString(kData130, kLen130);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha224_test.txt") == 0) {
     return AssembleString(kData131, kLen131);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha256_test.txt") == 0) {
     return AssembleString(kData132, kLen132);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/kwp_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp224r1_sha512_test.txt") == 0) {
     return AssembleString(kData133, kLen133);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/kw_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp256r1_sha256_test.txt") == 0) {
     return AssembleString(kData134, kLen134);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/primality_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp256r1_sha512_test.txt") == 0) {
     return AssembleString(kData135, kLen135);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha384_test.txt") == 0) {
     return AssembleString(kData136, kLen136);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp384r1_sha512_test.txt") == 0) {
     return AssembleString(kData137, kLen137);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha224_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/ecdsa_secp521r1_sha512_test.txt") == 0) {
     return AssembleString(kData138, kLen138);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha256_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/eddsa_test.txt") == 0) {
     return AssembleString(kData139, kLen139);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha256_mgf1sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha1_test.txt") == 0) {
     return AssembleString(kData140, kLen140);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha384_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha256_test.txt") == 0) {
     return AssembleString(kData141, kLen141);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha384_mgf1sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha384_test.txt") == 0) {
     return AssembleString(kData142, kLen142);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha512_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hkdf_sha512_test.txt") == 0) {
     return AssembleString(kData143, kLen143);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha512_mgf1sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha1_test.txt") == 0) {
     return AssembleString(kData144, kLen144);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha256_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha224_test.txt") == 0) {
     return AssembleString(kData145, kLen145);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha256_mgf1sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha256_test.txt") == 0) {
     return AssembleString(kData146, kLen146);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha512_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha384_test.txt") == 0) {
     return AssembleString(kData147, kLen147);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha512_mgf1sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/hmac_sha512_test.txt") == 0) {
     return AssembleString(kData148, kLen148);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha256_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/kwp_test.txt") == 0) {
     return AssembleString(kData149, kLen149);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha256_mgf1sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/kw_test.txt") == 0) {
     return AssembleString(kData150, kLen150);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/primality_test.txt") == 0) {
     return AssembleString(kData151, kLen151);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha1_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData152, kLen152);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData153, kLen153);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha224_mgf1sha224_test.txt") == 0) {
     return AssembleString(kData154, kLen154);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha256_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData155, kLen155);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha256_mgf1sha256_test.txt") == 0) {
     return AssembleString(kData156, kLen156);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha384_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData157, kLen157);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha384_mgf1sha384_test.txt") == 0) {
     return AssembleString(kData158, kLen158);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_32_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha512_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData159, kLen159);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_3072_sha256_mgf1_32_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_2048_sha512_mgf1sha512_test.txt") == 0) {
     return AssembleString(kData160, kLen160);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha256_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData161, kLen161);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha256_mgf1sha256_test.txt") == 0) {
     return AssembleString(kData162, kLen162);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_misc_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha512_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData163, kLen163);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_3072_sha512_mgf1sha512_test.txt") == 0) {
     return AssembleString(kData164, kLen164);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha256_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData165, kLen165);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha256_mgf1sha256_test.txt") == 0) {
     return AssembleString(kData166, kLen166);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha1_test.txt") == 0) {
     return AssembleString(kData167, kLen167);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_4096_sha512_mgf1sha512_test.txt") == 0) {
     return AssembleString(kData168, kLen168);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_oaep_misc_test.txt") == 0) {
     return AssembleString(kData169, kLen169);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_2048_test.txt") == 0) {
     return AssembleString(kData170, kLen170);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_3072_test.txt") == 0) {
     return AssembleString(kData171, kLen171);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pkcs1_4096_test.txt") == 0) {
     return AssembleString(kData172, kLen172);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha1_mgf1_20_test.txt") == 0) {
     return AssembleString(kData173, kLen173);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_0_test.txt") == 0) {
     return AssembleString(kData174, kLen174);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/x25519_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_2048_sha256_mgf1_32_test.txt") == 0) {
     return AssembleString(kData175, kLen175);
   }
-  if (strcmp(path, "third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt") == 0) {
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_3072_sha256_mgf1_32_test.txt") == 0) {
     return AssembleString(kData176, kLen176);
   }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_4096_sha256_mgf1_32_test.txt") == 0) {
+    return AssembleString(kData177, kLen177);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_4096_sha512_mgf1_32_test.txt") == 0) {
+    return AssembleString(kData178, kLen178);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_pss_misc_test.txt") == 0) {
+    return AssembleString(kData179, kLen179);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_sig_gen_misc_test.txt") == 0) {
+    return AssembleString(kData180, kLen180);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha224_test.txt") == 0) {
+    return AssembleString(kData181, kLen181);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha256_test.txt") == 0) {
+    return AssembleString(kData182, kLen182);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha384_test.txt") == 0) {
+    return AssembleString(kData183, kLen183);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_2048_sha512_test.txt") == 0) {
+    return AssembleString(kData184, kLen184);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha256_test.txt") == 0) {
+    return AssembleString(kData185, kLen185);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha384_test.txt") == 0) {
+    return AssembleString(kData186, kLen186);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_3072_sha512_test.txt") == 0) {
+    return AssembleString(kData187, kLen187);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_4096_sha384_test.txt") == 0) {
+    return AssembleString(kData188, kLen188);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_4096_sha512_test.txt") == 0) {
+    return AssembleString(kData189, kLen189);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/rsa_signature_test.txt") == 0) {
+    return AssembleString(kData190, kLen190);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/x25519_test.txt") == 0) {
+    return AssembleString(kData191, kLen191);
+  }
+  if (strcmp(path, "third_party/wycheproof_testvectors/xchacha20_poly1305_test.txt") == 0) {
+    return AssembleString(kData192, kLen192);
+  }
   fprintf(stderr, "File not embedded: %s.\n", path);
   abort();
 }
diff --git a/err_data.c b/err_data.c
index 98bc22a..7991be6 100644
--- a/err_data.c
+++ b/err_data.c
@@ -16,224 +16,227 @@
 
 #include <openssl/base.h>
 #include <openssl/err.h>
-#include <openssl/type_check.h>
 
+#include <assert.h>
 
-OPENSSL_STATIC_ASSERT(ERR_LIB_NONE == 1, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_SYS == 2, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_BN == 3, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_RSA == 4, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_DH == 5, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_EVP == 6, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_BUF == 7, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_OBJ == 8, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_PEM == 9, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_DSA == 10, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_X509 == 11, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_ASN1 == 12, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_CONF == 13, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_CRYPTO == 14, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_EC == 15, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_SSL == 16, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_BIO == 17, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_PKCS7 == 18, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_PKCS8 == 19, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_X509V3 == 20, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_RAND == 21, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_ENGINE == 22, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_OCSP == 23, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_UI == 24, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_COMP == 25, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_ECDSA == 26, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_ECDH == 27, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_HMAC == 28, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_DIGEST == 29, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_CIPHER == 30, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_HKDF == 31, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_TRUST_TOKEN == 32, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_LIB_USER == 33, "library value changed");
-OPENSSL_STATIC_ASSERT(ERR_NUM_LIBS == 34, "number of libraries changed");
+static_assert(ERR_LIB_NONE == 1, "library value changed");
+static_assert(ERR_LIB_SYS == 2, "library value changed");
+static_assert(ERR_LIB_BN == 3, "library value changed");
+static_assert(ERR_LIB_RSA == 4, "library value changed");
+static_assert(ERR_LIB_DH == 5, "library value changed");
+static_assert(ERR_LIB_EVP == 6, "library value changed");
+static_assert(ERR_LIB_BUF == 7, "library value changed");
+static_assert(ERR_LIB_OBJ == 8, "library value changed");
+static_assert(ERR_LIB_PEM == 9, "library value changed");
+static_assert(ERR_LIB_DSA == 10, "library value changed");
+static_assert(ERR_LIB_X509 == 11, "library value changed");
+static_assert(ERR_LIB_ASN1 == 12, "library value changed");
+static_assert(ERR_LIB_CONF == 13, "library value changed");
+static_assert(ERR_LIB_CRYPTO == 14, "library value changed");
+static_assert(ERR_LIB_EC == 15, "library value changed");
+static_assert(ERR_LIB_SSL == 16, "library value changed");
+static_assert(ERR_LIB_BIO == 17, "library value changed");
+static_assert(ERR_LIB_PKCS7 == 18, "library value changed");
+static_assert(ERR_LIB_PKCS8 == 19, "library value changed");
+static_assert(ERR_LIB_X509V3 == 20, "library value changed");
+static_assert(ERR_LIB_RAND == 21, "library value changed");
+static_assert(ERR_LIB_ENGINE == 22, "library value changed");
+static_assert(ERR_LIB_OCSP == 23, "library value changed");
+static_assert(ERR_LIB_UI == 24, "library value changed");
+static_assert(ERR_LIB_COMP == 25, "library value changed");
+static_assert(ERR_LIB_ECDSA == 26, "library value changed");
+static_assert(ERR_LIB_ECDH == 27, "library value changed");
+static_assert(ERR_LIB_HMAC == 28, "library value changed");
+static_assert(ERR_LIB_DIGEST == 29, "library value changed");
+static_assert(ERR_LIB_CIPHER == 30, "library value changed");
+static_assert(ERR_LIB_HKDF == 31, "library value changed");
+static_assert(ERR_LIB_TRUST_TOKEN == 32, "library value changed");
+static_assert(ERR_LIB_USER == 33, "library value changed");
+static_assert(ERR_NUM_LIBS == 34, "number of libraries changed");
 
 const uint32_t kOpenSSLReasonValues[] = {
-    0xc320862,
-    0xc32887c,
-    0xc33088b,
-    0xc33889b,
-    0xc3408aa,
-    0xc3488c3,
-    0xc3508cf,
-    0xc3588ec,
-    0xc36090c,
-    0xc36891a,
-    0xc37092a,
-    0xc378937,
-    0xc380947,
-    0xc388952,
-    0xc390968,
-    0xc398977,
-    0xc3a098b,
-    0xc3a886f,
+    0xc320885,
+    0xc32889f,
+    0xc3308ae,
+    0xc3388be,
+    0xc3408cd,
+    0xc3488e6,
+    0xc3508f2,
+    0xc35890f,
+    0xc36092f,
+    0xc36893d,
+    0xc37094d,
+    0xc37895a,
+    0xc38096a,
+    0xc388975,
+    0xc39098b,
+    0xc39899a,
+    0xc3a09ae,
+    0xc3a8892,
     0xc3b00f7,
-    0xc3b88fe,
-    0x1032086f,
-    0x103295e5,
-    0x103315f1,
-    0x1033960a,
-    0x1034161d,
-    0x10348f4f,
-    0x10350c88,
-    0x10359630,
-    0x1036165a,
-    0x1036966d,
-    0x1037168c,
-    0x103796a5,
-    0x103816ba,
-    0x103896d8,
-    0x103916e7,
-    0x10399703,
-    0x103a171e,
-    0x103a972d,
-    0x103b1749,
-    0x103b9764,
-    0x103c178a,
+    0xc3b8921,
+    0x10320892,
+    0x10329620,
+    0x1033162c,
+    0x10339645,
+    0x10341658,
+    0x10348f72,
+    0x10350cab,
+    0x1035966b,
+    0x10361695,
+    0x103696a8,
+    0x103716c7,
+    0x103796e0,
+    0x103816f5,
+    0x10389713,
+    0x10391722,
+    0x1039973e,
+    0x103a1759,
+    0x103a9768,
+    0x103b1784,
+    0x103b979f,
+    0x103c17c5,
     0x103c80f7,
-    0x103d179b,
-    0x103d97af,
-    0x103e17ce,
-    0x103e97dd,
-    0x103f17f4,
-    0x103f9807,
-    0x10400c4c,
-    0x1040981a,
-    0x10411838,
-    0x1041984b,
-    0x10421865,
-    0x10429875,
-    0x10431889,
-    0x1043989f,
-    0x104418b7,
-    0x104498cc,
-    0x104518e0,
-    0x104598f2,
-    0x10460625,
-    0x10468977,
-    0x10471907,
-    0x1047991e,
-    0x10481933,
-    0x10489941,
-    0x10490e9b,
-    0x1049977b,
-    0x104a1645,
-    0x14320c2f,
-    0x14328c3d,
-    0x14330c4c,
-    0x14338c5e,
+    0x103d17d6,
+    0x103d97ea,
+    0x103e1809,
+    0x103e9818,
+    0x103f182f,
+    0x103f9842,
+    0x10400c6f,
+    0x10409855,
+    0x10411873,
+    0x10419886,
+    0x104218a0,
+    0x104298b0,
+    0x104318c4,
+    0x104398da,
+    0x104418f2,
+    0x10449907,
+    0x1045191b,
+    0x1045992d,
+    0x10460635,
+    0x1046899a,
+    0x10471942,
+    0x10479959,
+    0x1048196e,
+    0x1048997c,
+    0x10490ebe,
+    0x104997b6,
+    0x104a1680,
+    0x14320c52,
+    0x14328c60,
+    0x14330c6f,
+    0x14338c81,
     0x143400b9,
     0x143480f7,
     0x18320090,
-    0x18328fa5,
+    0x18328fc8,
     0x183300b9,
-    0x18338fbb,
-    0x18340fcf,
+    0x18338fde,
+    0x18340ff2,
     0x183480f7,
-    0x18350fee,
-    0x18359006,
-    0x1836101b,
-    0x1836902f,
-    0x18371067,
-    0x1837907d,
-    0x18381091,
-    0x183890a1,
-    0x18390a9d,
-    0x183990b1,
-    0x183a10d7,
-    0x183a90fd,
-    0x183b0ca7,
-    0x183b914c,
-    0x183c115e,
-    0x183c9169,
-    0x183d1179,
-    0x183d918a,
-    0x183e119b,
-    0x183e91ad,
-    0x183f11d6,
-    0x183f91ef,
-    0x18401207,
-    0x184086fd,
-    0x18411120,
-    0x184190eb,
-    0x1842110a,
-    0x18428c94,
-    0x184310c6,
-    0x18439132,
-    0x18440fe4,
-    0x18449053,
-    0x20321241,
-    0x2032922e,
-    0x2432124d,
-    0x243289bd,
-    0x2433125f,
-    0x2433926c,
-    0x24341279,
-    0x2434928b,
-    0x2435129a,
-    0x243592b7,
-    0x243612c4,
-    0x243692d2,
-    0x243712e0,
-    0x243792ee,
-    0x243812f7,
-    0x24389304,
-    0x24391317,
-    0x28320c7c,
-    0x28328ca7,
-    0x28330c4c,
-    0x28338cba,
-    0x28340c88,
+    0x18351011,
+    0x18359029,
+    0x1836103e,
+    0x18369052,
+    0x1837108a,
+    0x183790a0,
+    0x183810b4,
+    0x183890c4,
+    0x18390ac0,
+    0x183990d4,
+    0x183a10fa,
+    0x183a9120,
+    0x183b0cca,
+    0x183b916f,
+    0x183c1181,
+    0x183c918c,
+    0x183d119c,
+    0x183d91ad,
+    0x183e11be,
+    0x183e91d0,
+    0x183f11f9,
+    0x183f9212,
+    0x1840122a,
+    0x1840870d,
+    0x18411143,
+    0x1841910e,
+    0x1842112d,
+    0x18428cb7,
+    0x184310e9,
+    0x18439155,
+    0x18441007,
+    0x18449076,
+    0x20321264,
+    0x20329251,
+    0x24321270,
+    0x243289e0,
+    0x24331282,
+    0x2433928f,
+    0x2434129c,
+    0x243492ae,
+    0x243512bd,
+    0x243592da,
+    0x243612e7,
+    0x243692f5,
+    0x24371303,
+    0x24379311,
+    0x2438131a,
+    0x24389327,
+    0x2439133a,
+    0x28320c9f,
+    0x28328cca,
+    0x28330c6f,
+    0x28338cdd,
+    0x28340cab,
     0x283480b9,
     0x283500f7,
-    0x28358c94,
-    0x2c323286,
-    0x2c32932e,
-    0x2c333294,
-    0x2c33b2a6,
-    0x2c3432ba,
-    0x2c34b2cc,
-    0x2c3532e7,
-    0x2c35b2f9,
-    0x2c363329,
+    0x28358cb7,
+    0x2c3232bf,
+    0x2c329351,
+    0x2c3332cd,
+    0x2c33b2df,
+    0x2c3432f3,
+    0x2c34b305,
+    0x2c353320,
+    0x2c35b332,
+    0x2c363362,
     0x2c36833a,
-    0x2c373336,
-    0x2c37b362,
-    0x2c383387,
-    0x2c38b39e,
-    0x2c3933bc,
-    0x2c39b3cc,
-    0x2c3a33de,
-    0x2c3ab3f2,
-    0x2c3b3403,
-    0x2c3bb422,
-    0x2c3c1340,
-    0x2c3c9356,
-    0x2c3d3436,
-    0x2c3d936f,
-    0x2c3e3453,
-    0x2c3eb461,
-    0x2c3f3479,
-    0x2c3fb491,
-    0x2c4034bb,
-    0x2c409241,
-    0x2c4134cc,
-    0x2c41b4df,
-    0x2c421207,
-    0x2c42b4f0,
-    0x2c43074a,
-    0x2c43b414,
-    0x2c443375,
-    0x2c44b49e,
-    0x2c45330c,
-    0x2c45b348,
-    0x2c4633ac,
+    0x2c37336f,
+    0x2c37b39b,
+    0x2c3833c0,
+    0x2c38b3d7,
+    0x2c3933f5,
+    0x2c39b405,
+    0x2c3a3417,
+    0x2c3ab42b,
+    0x2c3b343c,
+    0x2c3bb45b,
+    0x2c3c1363,
+    0x2c3c9379,
+    0x2c3d34a0,
+    0x2c3d9392,
+    0x2c3e34ca,
+    0x2c3eb4d8,
+    0x2c3f34f0,
+    0x2c3fb508,
+    0x2c403532,
+    0x2c409264,
+    0x2c413543,
+    0x2c41b556,
+    0x2c42122a,
+    0x2c42b567,
+    0x2c43076d,
+    0x2c43b44d,
+    0x2c4433ae,
+    0x2c44b515,
+    0x2c453345,
+    0x2c45b381,
+    0x2c4633e5,
+    0x2c46b46f,
+    0x2c473484,
+    0x2c47b4bd,
     0x30320000,
     0x30328015,
     0x3033001f,
@@ -278,528 +281,531 @@
     0x3046833a,
     0x30470372,
     0x30478384,
-    0x30480392,
-    0x304883a3,
-    0x304903b2,
-    0x304983ca,
-    0x304a03dc,
-    0x304a83f0,
-    0x304b0408,
-    0x304b841b,
-    0x304c0426,
-    0x304c8437,
-    0x304d0443,
-    0x304d8459,
-    0x304e0467,
-    0x304e847d,
-    0x304f048f,
-    0x304f84a1,
-    0x305004c4,
-    0x305084d7,
-    0x305104e8,
-    0x305184f8,
-    0x30520510,
-    0x30528525,
-    0x3053053d,
-    0x30538551,
-    0x30540569,
-    0x30548582,
-    0x3055059b,
-    0x305585b8,
-    0x305605c3,
-    0x305685db,
-    0x305705eb,
-    0x305785fc,
-    0x3058060f,
-    0x30588625,
-    0x3059062e,
-    0x30598643,
-    0x305a0656,
-    0x305a8665,
-    0x305b0685,
-    0x305b8694,
-    0x305c06b5,
-    0x305c86d1,
-    0x305d06dd,
-    0x305d86fd,
-    0x305e0719,
-    0x305e872a,
-    0x305f0740,
-    0x305f874a,
-    0x306004b4,
+    0x304803a2,
+    0x304883b3,
+    0x304903c2,
+    0x304983da,
+    0x304a03ec,
+    0x304a8400,
+    0x304b0418,
+    0x304b842b,
+    0x304c0436,
+    0x304c8447,
+    0x304d0453,
+    0x304d8469,
+    0x304e0477,
+    0x304e848d,
+    0x304f049f,
+    0x304f84b1,
+    0x305004d4,
+    0x305084e7,
+    0x305104f8,
+    0x30518508,
+    0x30520520,
+    0x30528535,
+    0x3053054d,
+    0x30538561,
+    0x30540579,
+    0x30548592,
+    0x305505ab,
+    0x305585c8,
+    0x305605d3,
+    0x305685eb,
+    0x305705fb,
+    0x3057860c,
+    0x3058061f,
+    0x30588635,
+    0x3059063e,
+    0x30598653,
+    0x305a0666,
+    0x305a8675,
+    0x305b0695,
+    0x305b86a4,
+    0x305c06c5,
+    0x305c86e1,
+    0x305d06ed,
+    0x305d870d,
+    0x305e0729,
+    0x305e874d,
+    0x305f0763,
+    0x305f876d,
+    0x306004c4,
     0x3060804a,
     0x30610357,
-    0x34320b8d,
-    0x34328ba1,
-    0x34330bbe,
-    0x34338bd1,
-    0x34340be0,
-    0x34348c19,
-    0x34350bfd,
+    0x3061873a,
+    0x30620392,
+    0x34320bb0,
+    0x34328bc4,
+    0x34330be1,
+    0x34338bf4,
+    0x34340c03,
+    0x34348c3c,
+    0x34350c20,
     0x3c320090,
-    0x3c328ce4,
-    0x3c330cfd,
-    0x3c338d18,
-    0x3c340d35,
-    0x3c348d5f,
-    0x3c350d7a,
-    0x3c358da0,
-    0x3c360db9,
-    0x3c368dd1,
-    0x3c370de2,
-    0x3c378df0,
-    0x3c380dfd,
-    0x3c388e11,
-    0x3c390ca7,
-    0x3c398e34,
-    0x3c3a0e48,
-    0x3c3a8937,
-    0x3c3b0e58,
-    0x3c3b8e73,
-    0x3c3c0e85,
-    0x3c3c8eb8,
-    0x3c3d0ec2,
-    0x3c3d8ed6,
-    0x3c3e0ee4,
-    0x3c3e8f09,
-    0x3c3f0cd0,
-    0x3c3f8ef2,
+    0x3c328d07,
+    0x3c330d20,
+    0x3c338d3b,
+    0x3c340d58,
+    0x3c348d82,
+    0x3c350d9d,
+    0x3c358dc3,
+    0x3c360ddc,
+    0x3c368df4,
+    0x3c370e05,
+    0x3c378e13,
+    0x3c380e20,
+    0x3c388e34,
+    0x3c390cca,
+    0x3c398e57,
+    0x3c3a0e6b,
+    0x3c3a895a,
+    0x3c3b0e7b,
+    0x3c3b8e96,
+    0x3c3c0ea8,
+    0x3c3c8edb,
+    0x3c3d0ee5,
+    0x3c3d8ef9,
+    0x3c3e0f07,
+    0x3c3e8f2c,
+    0x3c3f0cf3,
+    0x3c3f8f15,
     0x3c4000b9,
     0x3c4080f7,
-    0x3c410d50,
-    0x3c418d8f,
-    0x3c420e9b,
-    0x3c428e25,
-    0x403219d3,
-    0x403299e9,
-    0x40331a17,
-    0x40339a21,
-    0x40341a38,
-    0x40349a56,
-    0x40351a66,
-    0x40359a78,
-    0x40361a85,
-    0x40369a91,
-    0x40371aa6,
-    0x40379ab8,
-    0x40381ac3,
-    0x40389ad5,
-    0x40390f4f,
-    0x40399ae5,
-    0x403a1af8,
-    0x403a9b19,
-    0x403b1b2a,
-    0x403b9b3a,
+    0x3c410d73,
+    0x3c418db2,
+    0x3c420ebe,
+    0x3c428e48,
+    0x40321a0e,
+    0x40329a24,
+    0x40331a52,
+    0x40339a5c,
+    0x40341a73,
+    0x40349a91,
+    0x40351aa1,
+    0x40359ab3,
+    0x40361ac0,
+    0x40369acc,
+    0x40371ae1,
+    0x40379af3,
+    0x40381afe,
+    0x40389b10,
+    0x40390f72,
+    0x40399b20,
+    0x403a1b33,
+    0x403a9b54,
+    0x403b1b65,
+    0x403b9b75,
     0x403c0071,
     0x403c8090,
-    0x403d1b9b,
-    0x403d9bb1,
-    0x403e1bc0,
-    0x403e9bf8,
-    0x403f1c12,
-    0x403f9c3a,
-    0x40401c4f,
-    0x40409c63,
-    0x40411c9e,
-    0x40419cb9,
-    0x40421cd2,
-    0x40429ce5,
-    0x40431cf9,
-    0x40439d27,
-    0x40441d3e,
+    0x403d1bd6,
+    0x403d9bec,
+    0x403e1bfb,
+    0x403e9c33,
+    0x403f1c4d,
+    0x403f9c75,
+    0x40401c8a,
+    0x40409c9e,
+    0x40411cd9,
+    0x40419cf4,
+    0x40421d0d,
+    0x40429d20,
+    0x40431d34,
+    0x40439d62,
+    0x40441d79,
     0x404480b9,
-    0x40451d53,
-    0x40459d65,
-    0x40461d89,
-    0x40469da9,
-    0x40471db7,
-    0x40479dde,
-    0x40481e4f,
-    0x40489f09,
-    0x40491f20,
-    0x40499f3a,
-    0x404a1f51,
-    0x404a9f6f,
-    0x404b1f87,
-    0x404b9fb4,
-    0x404c1fca,
-    0x404c9fdc,
-    0x404d1ffd,
-    0x404da036,
-    0x404e204a,
-    0x404ea057,
-    0x404f20f1,
-    0x404fa167,
-    0x405021be,
-    0x4050a1d2,
-    0x40512205,
-    0x40522215,
-    0x4052a239,
-    0x40532251,
-    0x4053a264,
-    0x40542279,
-    0x4054a29c,
-    0x405522c7,
-    0x4055a304,
-    0x40562329,
-    0x4056a342,
-    0x4057235a,
-    0x4057a36d,
-    0x40582382,
-    0x4058a3a9,
-    0x405923d8,
-    0x4059a405,
-    0x405a2419,
-    0x405aa429,
-    0x405b2441,
-    0x405ba452,
-    0x405c2465,
-    0x405ca4a4,
-    0x405d24b1,
-    0x405da4d6,
-    0x405e2514,
-    0x405e8adb,
-    0x405f254f,
-    0x405fa55c,
-    0x4060256a,
-    0x4060a58c,
-    0x406125ed,
-    0x4061a625,
-    0x4062263c,
-    0x4062a64d,
-    0x4063269a,
-    0x4063a6af,
-    0x406426c6,
-    0x4064a6f2,
-    0x4065270d,
-    0x4065a724,
-    0x4066273c,
-    0x4066a766,
-    0x40672791,
-    0x4067a7d6,
-    0x4068281e,
-    0x4068a83f,
-    0x40692871,
-    0x4069a89f,
-    0x406a28c0,
-    0x406aa8e0,
-    0x406b2a68,
-    0x406baa8b,
-    0x406c2aa1,
-    0x406cadab,
-    0x406d2dda,
-    0x406dae02,
-    0x406e2e30,
-    0x406eae7d,
-    0x406f2ed6,
-    0x406faf0e,
-    0x40702f21,
-    0x4070af3e,
-    0x4071082a,
-    0x4071af50,
-    0x40722f63,
-    0x4072af99,
-    0x40732fb1,
-    0x40739540,
-    0x40742fc5,
-    0x4074afdf,
-    0x40752ff0,
-    0x4075b004,
-    0x40763012,
-    0x40769304,
-    0x40773037,
-    0x4077b077,
-    0x40783092,
-    0x4078b0cb,
-    0x407930e2,
-    0x4079b0f8,
-    0x407a3124,
-    0x407ab137,
-    0x407b314c,
-    0x407bb15e,
-    0x407c318f,
-    0x407cb198,
-    0x407d285a,
-    0x407da177,
-    0x407e30a7,
-    0x407ea3b9,
-    0x407f1dcb,
-    0x407f9f9e,
-    0x40802101,
-    0x40809df3,
-    0x40812227,
-    0x4081a0a5,
-    0x40822e1b,
-    0x40829b46,
-    0x40832394,
-    0x4083a6d7,
-    0x40841e07,
-    0x4084a3f1,
-    0x40852476,
-    0x4085a5b4,
-    0x408624f6,
-    0x4086a191,
-    0x40872e61,
-    0x4087a602,
-    0x40881b84,
-    0x4088a7e9,
-    0x40891bd3,
-    0x40899b60,
-    0x408a2ad9,
-    0x408a9958,
-    0x408b3173,
-    0x408baeeb,
-    0x408c2486,
-    0x408c9990,
-    0x408d1eef,
-    0x408d9e39,
-    0x408e201f,
-    0x408ea2e4,
-    0x408f27fd,
-    0x408fa5d0,
-    0x409027b2,
-    0x4090a4c8,
-    0x40912ac1,
-    0x409199b6,
-    0x40921c20,
-    0x4092ae9c,
-    0x40932f7c,
-    0x4093a1a2,
-    0x40941e1b,
-    0x4094aaf2,
-    0x4095265e,
-    0x4095b104,
-    0x40962e48,
-    0x4096a11a,
-    0x409721ed,
-    0x4097a06e,
-    0x40981c80,
-    0x4098a672,
-    0x40992eb8,
-    0x4099a311,
-    0x409a22aa,
-    0x409a9974,
-    0x409b1e75,
-    0x409b9ea0,
-    0x409c3059,
-    0x409c9ec8,
-    0x409d20d6,
-    0x409da0bb,
-    0x409e1d11,
-    0x409ea14f,
-    0x409f2137,
-    0x409f9e68,
-    0x40a02535,
-    0x40a0a088,
-    0x41f42993,
-    0x41f92a25,
-    0x41fe2918,
-    0x41feabce,
-    0x41ff2cfc,
-    0x420329ac,
-    0x420829ce,
-    0x4208aa0a,
-    0x420928fc,
-    0x4209aa44,
-    0x420a2953,
-    0x420aa933,
-    0x420b2973,
-    0x420ba9ec,
-    0x420c2d18,
-    0x420cab02,
-    0x420d2bb5,
-    0x420dabec,
-    0x42122c1f,
-    0x42172cdf,
-    0x4217ac61,
-    0x421c2c83,
-    0x421f2c3e,
-    0x42212d90,
-    0x42262cc2,
-    0x422b2d6e,
-    0x422bab90,
-    0x422c2d50,
-    0x422cab43,
-    0x422d2b1c,
-    0x422dad2f,
-    0x422e2b6f,
-    0x42302c9e,
-    0x4230ac06,
-    0x44320755,
-    0x44328764,
-    0x44330770,
-    0x4433877e,
-    0x44340791,
-    0x443487a2,
-    0x443507a9,
-    0x443587b3,
-    0x443607c6,
-    0x443687dc,
-    0x443707ee,
-    0x443787fb,
-    0x4438080a,
-    0x44388812,
-    0x4439082a,
-    0x44398838,
-    0x443a084b,
-    0x4832132e,
-    0x48329340,
-    0x48331356,
-    0x4833936f,
-    0x4c321394,
-    0x4c3293a4,
-    0x4c3313b7,
-    0x4c3393d7,
+    0x40451d8e,
+    0x40459da0,
+    0x40461dc4,
+    0x40469de4,
+    0x40471df2,
+    0x40479e19,
+    0x40481e8a,
+    0x40489f44,
+    0x40491f5b,
+    0x40499f75,
+    0x404a1f8c,
+    0x404a9faa,
+    0x404b1fc2,
+    0x404b9fef,
+    0x404c2005,
+    0x404ca017,
+    0x404d2038,
+    0x404da071,
+    0x404e2085,
+    0x404ea092,
+    0x404f212c,
+    0x404fa1a2,
+    0x40502211,
+    0x4050a225,
+    0x40512258,
+    0x40522268,
+    0x4052a28c,
+    0x405322a4,
+    0x4053a2b7,
+    0x405422cc,
+    0x4054a2ef,
+    0x4055231a,
+    0x4055a357,
+    0x4056237c,
+    0x4056a395,
+    0x405723ad,
+    0x4057a3c0,
+    0x405823d5,
+    0x4058a3fc,
+    0x4059242b,
+    0x4059a458,
+    0x405a246c,
+    0x405aa47c,
+    0x405b2494,
+    0x405ba4a5,
+    0x405c24b8,
+    0x405ca4f7,
+    0x405d2504,
+    0x405da529,
+    0x405e2567,
+    0x405e8afe,
+    0x405f2588,
+    0x405fa595,
+    0x406025a3,
+    0x4060a5c5,
+    0x40612626,
+    0x4061a65e,
+    0x40622675,
+    0x4062a686,
+    0x406326d3,
+    0x4063a6e8,
+    0x406426ff,
+    0x4064a72b,
+    0x40652746,
+    0x4065a75d,
+    0x40662775,
+    0x4066a79f,
+    0x406727ca,
+    0x4067a80f,
+    0x40682857,
+    0x4068a878,
+    0x406928aa,
+    0x4069a8d8,
+    0x406a28f9,
+    0x406aa919,
+    0x406b2aa1,
+    0x406baac4,
+    0x406c2ada,
+    0x406cade4,
+    0x406d2e13,
+    0x406dae3b,
+    0x406e2e69,
+    0x406eaeb6,
+    0x406f2f0f,
+    0x406faf47,
+    0x40702f5a,
+    0x4070af77,
+    0x4071084d,
+    0x4071af89,
+    0x40722f9c,
+    0x4072afd2,
+    0x40732fea,
+    0x4073957b,
+    0x40742ffe,
+    0x4074b018,
+    0x40753029,
+    0x4075b03d,
+    0x4076304b,
+    0x40769327,
+    0x40773070,
+    0x4077b0b0,
+    0x407830cb,
+    0x4078b104,
+    0x4079311b,
+    0x4079b131,
+    0x407a315d,
+    0x407ab170,
+    0x407b3185,
+    0x407bb197,
+    0x407c31c8,
+    0x407cb1d1,
+    0x407d2893,
+    0x407da1ca,
+    0x407e30e0,
+    0x407ea40c,
+    0x407f1e06,
+    0x407f9fd9,
+    0x4080213c,
+    0x40809e2e,
+    0x4081227a,
+    0x4081a0e0,
+    0x40822e54,
+    0x40829b81,
+    0x408323e7,
+    0x4083a710,
+    0x40841e42,
+    0x4084a444,
+    0x408524c9,
+    0x4085a5ed,
+    0x40862549,
+    0x4086a1e4,
+    0x40872e9a,
+    0x4087a63b,
+    0x40881bbf,
+    0x4088a822,
+    0x40891c0e,
+    0x40899b9b,
+    0x408a2b12,
+    0x408a9993,
+    0x408b31ac,
+    0x408baf24,
+    0x408c24d9,
+    0x408c99cb,
+    0x408d1f2a,
+    0x408d9e74,
+    0x408e205a,
+    0x408ea337,
+    0x408f2836,
+    0x408fa609,
+    0x409027eb,
+    0x4090a51b,
+    0x40912afa,
+    0x409199f1,
+    0x40921c5b,
+    0x4092aed5,
+    0x40932fb5,
+    0x4093a1f5,
+    0x40941e56,
+    0x4094ab2b,
+    0x40952697,
+    0x4095b13d,
+    0x40962e81,
+    0x4096a155,
+    0x40972240,
+    0x4097a0a9,
+    0x40981cbb,
+    0x4098a6ab,
+    0x40992ef1,
+    0x4099a364,
+    0x409a22fd,
+    0x409a99af,
+    0x409b1eb0,
+    0x409b9edb,
+    0x409c3092,
+    0x409c9f03,
+    0x409d2111,
+    0x409da0f6,
+    0x409e1d4c,
+    0x409ea18a,
+    0x409f2172,
+    0x409f9ea3,
+    0x40a021b2,
+    0x40a0a0c3,
+    0x41f429cc,
+    0x41f92a5e,
+    0x41fe2951,
+    0x41feac07,
+    0x41ff2d35,
+    0x420329e5,
+    0x42082a07,
+    0x4208aa43,
+    0x42092935,
+    0x4209aa7d,
+    0x420a298c,
+    0x420aa96c,
+    0x420b29ac,
+    0x420baa25,
+    0x420c2d51,
+    0x420cab3b,
+    0x420d2bee,
+    0x420dac25,
+    0x42122c58,
+    0x42172d18,
+    0x4217ac9a,
+    0x421c2cbc,
+    0x421f2c77,
+    0x42212dc9,
+    0x42262cfb,
+    0x422b2da7,
+    0x422babc9,
+    0x422c2d89,
+    0x422cab7c,
+    0x422d2b55,
+    0x422dad68,
+    0x422e2ba8,
+    0x42302cd7,
+    0x4230ac3f,
+    0x44320778,
+    0x44328787,
+    0x44330793,
+    0x443387a1,
+    0x443407b4,
+    0x443487c5,
+    0x443507cc,
+    0x443587d6,
+    0x443607e9,
+    0x443687ff,
+    0x44370811,
+    0x4437881e,
+    0x4438082d,
+    0x44388835,
+    0x4439084d,
+    0x4439885b,
+    0x443a086e,
+    0x48321351,
+    0x48329363,
+    0x48331379,
+    0x48339392,
+    0x4c3213cf,
+    0x4c3293df,
+    0x4c3313f2,
+    0x4c339412,
     0x4c3400b9,
     0x4c3480f7,
-    0x4c3513e3,
-    0x4c3593f1,
-    0x4c36140d,
-    0x4c369433,
-    0x4c371442,
-    0x4c379450,
-    0x4c381465,
-    0x4c389471,
-    0x4c391491,
-    0x4c3994bb,
-    0x4c3a14d4,
-    0x4c3a94ed,
-    0x4c3b0625,
-    0x4c3b9506,
-    0x4c3c1518,
-    0x4c3c9527,
-    0x4c3d1540,
-    0x4c3d8c6f,
-    0x4c3e15ad,
-    0x4c3e954f,
-    0x4c3f15cf,
-    0x4c3f9304,
-    0x4c401565,
-    0x4c409380,
-    0x4c41159d,
-    0x4c419420,
-    0x4c421589,
-    0x50323502,
-    0x5032b511,
-    0x5033351c,
-    0x5033b52c,
-    0x50343545,
-    0x5034b55f,
-    0x5035356d,
-    0x5035b583,
-    0x50363595,
-    0x5036b5ab,
-    0x503735c4,
-    0x5037b5d7,
-    0x503835ef,
-    0x5038b600,
-    0x50393615,
-    0x5039b629,
-    0x503a3649,
-    0x503ab65f,
-    0x503b3677,
-    0x503bb689,
-    0x503c36a5,
-    0x503cb6bc,
-    0x503d36d5,
-    0x503db6eb,
-    0x503e36f8,
-    0x503eb70e,
-    0x503f3720,
-    0x503f83a3,
-    0x50403733,
-    0x5040b743,
-    0x5041375d,
-    0x5041b76c,
-    0x50423786,
-    0x5042b7a3,
-    0x504337b3,
-    0x5043b7c3,
-    0x504437e0,
-    0x50448459,
-    0x504537f4,
-    0x5045b812,
-    0x50463825,
-    0x5046b83b,
-    0x5047384d,
-    0x5047b862,
-    0x50483888,
-    0x5048b896,
-    0x504938a9,
-    0x5049b8be,
-    0x504a38d4,
-    0x504ab8e4,
-    0x504b3904,
-    0x504bb917,
-    0x504c393a,
-    0x504cb968,
-    0x504d3995,
-    0x504db9b2,
-    0x504e39cd,
-    0x504eb9e9,
-    0x504f39fb,
-    0x504fba12,
-    0x50503a21,
-    0x50508719,
-    0x50513a34,
-    0x5051b7d2,
-    0x5052397a,
-    0x58320f8d,
-    0x68320f4f,
-    0x68328ca7,
-    0x68330cba,
-    0x68338f5d,
-    0x68340f6d,
+    0x4c35141e,
+    0x4c35942c,
+    0x4c361448,
+    0x4c36946e,
+    0x4c37147d,
+    0x4c37948b,
+    0x4c3814a0,
+    0x4c3894ac,
+    0x4c3914cc,
+    0x4c3994f6,
+    0x4c3a150f,
+    0x4c3a9528,
+    0x4c3b0635,
+    0x4c3b9541,
+    0x4c3c1553,
+    0x4c3c9562,
+    0x4c3d157b,
+    0x4c3d8c92,
+    0x4c3e15e8,
+    0x4c3e958a,
+    0x4c3f160a,
+    0x4c3f9327,
+    0x4c4015a0,
+    0x4c4093bb,
+    0x4c4115d8,
+    0x4c41945b,
+    0x4c4215c4,
+    0x4c4293a3,
+    0x50323579,
+    0x5032b588,
+    0x50333593,
+    0x5033b5a3,
+    0x503435bc,
+    0x5034b5d6,
+    0x503535e4,
+    0x5035b5fa,
+    0x5036360c,
+    0x5036b622,
+    0x5037363b,
+    0x5037b64e,
+    0x50383666,
+    0x5038b677,
+    0x5039368c,
+    0x5039b6a0,
+    0x503a36c0,
+    0x503ab6d6,
+    0x503b36ee,
+    0x503bb700,
+    0x503c371c,
+    0x503cb733,
+    0x503d374c,
+    0x503db762,
+    0x503e376f,
+    0x503eb785,
+    0x503f3797,
+    0x503f83b3,
+    0x504037aa,
+    0x5040b7ba,
+    0x504137d4,
+    0x5041b7e3,
+    0x504237fd,
+    0x5042b81a,
+    0x5043382a,
+    0x5043b83a,
+    0x50443857,
+    0x50448469,
+    0x5045386b,
+    0x5045b889,
+    0x5046389c,
+    0x5046b8b2,
+    0x504738c4,
+    0x5047b8d9,
+    0x504838ff,
+    0x5048b90d,
+    0x50493920,
+    0x5049b935,
+    0x504a394b,
+    0x504ab95b,
+    0x504b397b,
+    0x504bb98e,
+    0x504c39b1,
+    0x504cb9df,
+    0x504d3a0c,
+    0x504dba29,
+    0x504e3a44,
+    0x504eba60,
+    0x504f3a72,
+    0x504fba89,
+    0x50503a98,
+    0x50508729,
+    0x50513aab,
+    0x5051b849,
+    0x505239f1,
+    0x58320fb0,
+    0x68320f72,
+    0x68328cca,
+    0x68330cdd,
+    0x68338f80,
+    0x68340f90,
     0x683480f7,
-    0x6c320f15,
-    0x6c328c5e,
-    0x6c330f20,
-    0x6c338f39,
-    0x74320a43,
+    0x6c320f38,
+    0x6c328c81,
+    0x6c330f43,
+    0x6c338f5c,
+    0x74320a66,
     0x743280b9,
-    0x74330c6f,
-    0x783209a8,
-    0x783289bd,
-    0x783309c9,
+    0x74330c92,
+    0x783209cb,
+    0x783289e0,
+    0x783309ec,
     0x78338090,
-    0x783409d8,
-    0x783489ed,
-    0x78350a0c,
-    0x78358a2e,
-    0x78360a43,
-    0x78368a59,
-    0x78370a69,
-    0x78378a8a,
-    0x78380a9d,
-    0x78388aaf,
-    0x78390abc,
-    0x78398adb,
-    0x783a0af0,
-    0x783a8afe,
-    0x783b0b08,
-    0x783b8b1c,
-    0x783c0b33,
-    0x783c8b48,
-    0x783d0b5f,
-    0x783d8b74,
-    0x783e0aca,
-    0x783e8a7c,
-    0x7c32121d,
-    0x80321433,
+    0x783409fb,
+    0x78348a10,
+    0x78350a2f,
+    0x78358a51,
+    0x78360a66,
+    0x78368a7c,
+    0x78370a8c,
+    0x78378aad,
+    0x78380ac0,
+    0x78388ad2,
+    0x78390adf,
+    0x78398afe,
+    0x783a0b13,
+    0x783a8b21,
+    0x783b0b2b,
+    0x783b8b3f,
+    0x783c0b56,
+    0x783c8b6b,
+    0x783d0b82,
+    0x783d8b97,
+    0x783e0aed,
+    0x783e8a9f,
+    0x7c321240,
+    0x8032146e,
     0x80328090,
-    0x80333255,
+    0x8033328e,
     0x803380b9,
-    0x80343264,
-    0x8034b1cc,
-    0x803531ea,
-    0x8035b278,
-    0x8036322c,
-    0x8036b1db,
-    0x8037321e,
-    0x8037b1b9,
-    0x8038323f,
-    0x8038b1fb,
-    0x80393210,
+    0x8034329d,
+    0x8034b205,
+    0x80353223,
+    0x8035b2b1,
+    0x80363265,
+    0x8036b214,
+    0x80373257,
+    0x8037b1f2,
+    0x80383278,
+    0x8038b234,
+    0x80393249,
 };
 
 const size_t kOpenSSLReasonValuesLen = sizeof(kOpenSSLReasonValues) / sizeof(kOpenSSLReasonValues[0]);
@@ -851,6 +857,7 @@
     "INVALID_BIT_STRING_PADDING\0"
     "INVALID_BMPSTRING\0"
     "INVALID_DIGIT\0"
+    "INVALID_INTEGER\0"
     "INVALID_MODIFIER\0"
     "INVALID_NUMBER\0"
     "INVALID_OBJECT_ENCODING\0"
@@ -897,6 +904,7 @@
     "UNSUPPORTED_ANY_DEFINED_BY_TYPE\0"
     "UNSUPPORTED_PUBLIC_KEY_TYPE\0"
     "UNSUPPORTED_TYPE\0"
+    "WRONG_INTEGER_TYPE\0"
     "WRONG_PUBLIC_KEY_TYPE\0"
     "WRONG_TAG\0"
     "WRONG_TYPE\0"
@@ -1066,6 +1074,7 @@
     "NOT_PKCS7_SIGNED_DATA\0"
     "NO_CERTIFICATES_INCLUDED\0"
     "NO_CRLS_INCLUDED\0"
+    "AMBIGUOUS_FRIENDLY_NAME\0"
     "BAD_ITERATION_COUNT\0"
     "BAD_PKCS12_DATA\0"
     "BAD_PKCS12_VERSION\0"
@@ -1223,6 +1232,7 @@
     "INVALID_ECH_CONFIG_LIST\0"
     "INVALID_ECH_PUBLIC_NAME\0"
     "INVALID_MESSAGE\0"
+    "INVALID_OUTER_EXTENSION\0"
     "INVALID_OUTER_RECORD_TYPE\0"
     "INVALID_SCT_LIST\0"
     "INVALID_SIGNATURE_ALGORITHM\0"
@@ -1266,7 +1276,6 @@
     "OLD_SESSION_CIPHER_NOT_RETURNED\0"
     "OLD_SESSION_PRF_HASH_MISMATCH\0"
     "OLD_SESSION_VERSION_NOT_RETURNED\0"
-    "OUTER_EXTENSION_NOT_FOUND\0"
     "PARSE_TLSEXT\0"
     "PATH_TOO_LONG\0"
     "PEER_DID_NOT_RETURN_A_CERTIFICATE\0"
@@ -1417,7 +1426,10 @@
     "LOADING_DEFAULTS\0"
     "NAME_TOO_LONG\0"
     "NEWER_CRL_NOT_NEWER\0"
+    "NO_CERTIFICATE_FOUND\0"
+    "NO_CERTIFICATE_OR_CRL_FOUND\0"
     "NO_CERT_SET_FOR_US_TO_VERIFY\0"
+    "NO_CRL_FOUND\0"
     "NO_CRL_NUMBER\0"
     "PUBLIC_KEY_DECODE_ERROR\0"
     "PUBLIC_KEY_ENCODE_ERROR\0"
diff --git a/linux-aarch64/crypto/chacha/chacha-armv8.S b/linux-aarch64/crypto/chacha/chacha-armv8.S
index e7f019c..4392111 100644
--- a/linux-aarch64/crypto/chacha/chacha-armv8.S
+++ b/linux-aarch64/crypto/chacha/chacha-armv8.S
@@ -66,7 +66,7 @@
 	ldp	x24,x25,[x3]		// load key
 	ldp	x26,x27,[x3,#16]
 	ldp	x28,x30,[x4]		// load counter
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x24,x24,#32
 	ror	x25,x25,#32
 	ror	x26,x26,#32
@@ -227,7 +227,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -284,7 +284,7 @@
 	add	x15,x15,x16,lsl#32
 	add	x17,x17,x19,lsl#32
 	add	x20,x20,x21,lsl#32
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -350,7 +350,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -648,7 +648,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -728,7 +728,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -846,7 +846,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -1359,7 +1359,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -1873,7 +1873,7 @@
 	add	x1,x1,#64
 	add	v21.4s,v21.4s,v25.4s
 
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
diff --git a/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
new file mode 100644
index 0000000..69e1296
--- /dev/null
+++ b/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
@@ -0,0 +1,3020 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include <openssl/arm_arch.h>
+.section	.rodata
+
+.align	7
+.Lchacha20_consts:
+.byte	'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k'
+.Linc:
+.long	1,2,3,4
+.Lrol8:
+.byte	3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14
+.Lclamp:
+.quad	0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC
+
+.text
+
+.type	.Lpoly_hash_ad_internal,%function
+.align	6
+.Lpoly_hash_ad_internal:
+.cfi_startproc
+	cbnz	x4, .Lpoly_hash_intro
+	ret
+
+.Lpoly_hash_intro:
+	cmp	x4, #16
+	b.lt	.Lpoly_hash_ad_tail
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	.Lpoly_hash_ad_internal
+
+.Lpoly_hash_ad_tail:
+	cbz	x4, .Lpoly_hash_ad_ret
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the AAD
+	sub	x4, x4, #1
+
+.Lpoly_hash_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, x4]
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.ge	.Lpoly_hash_tail_16_compose
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+.Lpoly_hash_ad_ret:
+	ret
+.cfi_endproc
+.size	.Lpoly_hash_ad_internal, .-.Lpoly_hash_ad_internal
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_seal(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *seal_data);
+//
+.globl	chacha20_poly1305_seal
+.hidden	chacha20_poly1305_seal
+.type	chacha20_poly1305_seal,%function
+.align	6
+chacha20_poly1305_seal:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, .Lchacha20_consts
+	add	x11, x11, :lo12:.Lchacha20_consts
+
+	ld1	{v24.16b - v27.16b}, [x11] // .Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	ldr	x12, [x5, #56]   // The total cipher text length includes extra_in_len
+	add	x12, x12, x2
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x12
+
+	cmp	x2, #128
+	b.le	.Lseal_128 // Optimization for smaller buffers
+
+    // Initially we prepare 5 ChaCha20 blocks. Four to encrypt up to 4 blocks (256 bytes) of plaintext,
+    // and one for the Poly1305 R and S keys. The first four blocks (A0-A3..D0-D3) are computed vertically,
+    // the fifth block (A4-D4) horizontally.
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	sub	x5, x5, #32
+
+	mov	x6, #10
+
+.align	5
+.Lseal_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.hi	.Lseal_init_rounds
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #4
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	and	v4.16b, v4.16b, v27.16b
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	mov	x16, v4.d[0] // Move the R key to GPRs
+	mov	x17, v4.d[1]
+	mov	v27.16b, v9.16b // Store the S key
+
+	bl	.Lpoly_hash_ad_internal
+
+	mov	x3, x0
+	cmp	x2, #256
+	b.le	.Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #256
+
+	mov	x6, #4 // In the first run of the loop we need to hash 256 bytes, therefore we hash one block for the first 4 rounds
+	mov	x7, #6 // and two blocks for the remaining 6, for a total of (1 * 4 + 2 * 6) * 16 = 256
+
+.Lseal_main_loop:
+	adrp	x11, .Lchacha20_consts
+	add	x11, x11, :lo12:.Lchacha20_consts
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	sub	x5, x5, #32
+.align	5
+.Lseal_main_loop_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.ge	.Lseal_main_loop_rounds
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	subs	x7, x7, #1
+	b.gt	.Lseal_main_loop_rounds
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+	cmp	x2, #320
+	b.le	.Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #320
+
+	mov	x6, #0
+	mov	x7, #10 // For the remainder of the loop we always hash and encrypt 320 bytes per iteration
+
+	b	.Lseal_main_loop
+
+.Lseal_tail:
+    // This part of the function handles the storage and authentication of the last [0,320) bytes
+    // We assume A0-A4 ... D0-D4 hold at least inl (320 max) bytes of the stream data.
+	cmp	x2, #64
+	b.lt	.Lseal_tail_64
+
+    // Store and authenticate 64B blocks per iteration
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+    // Shift the state left by 64 bytes for the next iteration of the loop
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+	mov	v1.16b, v2.16b
+	mov	v6.16b, v7.16b
+	mov	v11.16b, v12.16b
+	mov	v16.16b, v17.16b
+
+	mov	v2.16b, v3.16b
+	mov	v7.16b, v8.16b
+	mov	v12.16b, v13.16b
+	mov	v17.16b, v18.16b
+
+	mov	v3.16b, v4.16b
+	mov	v8.16b, v9.16b
+	mov	v13.16b, v14.16b
+	mov	v18.16b, v19.16b
+
+	b	.Lseal_tail
+
+.Lseal_tail_64:
+	ldp	x3, x4, [x5, #48] // extra_in_len and extra_in_ptr
+
+    // Here we handle the last [0,64) bytes of plaintext
+	cmp	x2, #16
+	b.lt	.Lseal_tail_16
+    // Each iteration encrypt and authenticate a 16B block
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b}, [x0], #16
+
+	sub	x2, x2, #16
+
+    // Shift the state left by 16 bytes for the next iteration of the loop
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+
+	b	.Lseal_tail_64
+
+.Lseal_tail_16:
+    // Here we handle the last [0,16) bytes of ciphertext that require a padded block
+	cbz	x2, .Lseal_hash_extra
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the plaintext/extra in
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask that will only mask the ciphertext bytes
+	not	v22.16b, v20.16b
+
+	mov	x6, x2
+	add	x1, x1, x2
+
+	cbz	x4, .Lseal_tail_16_compose // No extra data to pad with, zero padding
+
+	mov	x7, #16          // We need to load some extra_in first for padding
+	sub	x7, x7, x2
+	cmp	x4, x7
+	csel	x7, x4, x7, lt // .Load the minimum of extra_in_len and the amount needed to fill the register
+	mov	x12, x7
+	add	x3, x3, x7
+	sub	x4, x4, x7
+
+.Lseal_tail16_compose_extra_in:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x7, x7, #1
+	b.gt	.Lseal_tail16_compose_extra_in
+
+	add	x3, x3, x12
+
+.Lseal_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x1, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	.Lseal_tail_16_compose
+
+	and	v0.16b, v0.16b, v21.16b
+	eor	v20.16b, v20.16b, v0.16b
+	mov	v21.16b, v20.16b
+
+.Lseal_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	.Lseal_tail_16_store
+
+    // Hash in the final ct block concatenated with extra_in
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+.Lseal_hash_extra:
+	cbz	x4, .Lseal_finalize
+
+.Lseal_hash_extra_loop:
+	cmp	x4, #16
+	b.lt	.Lseal_hash_extra_tail
+	ld1	{v20.16b}, [x3], #16
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	.Lseal_hash_extra_loop
+
+.Lseal_hash_extra_tail:
+	cbz	x4, .Lseal_finalize
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the remaining extra ciphertext
+	add	x3, x3, x4
+
+.Lseal_hash_extra_load:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.gt	.Lseal_hash_extra_load
+
+    // Hash in the final padded extra_in blcok
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+.Lseal_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.Lseal_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+.Lseal_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	.Lseal_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+    // Only the first 32 bytes of the third block (counter = 0) are needed,
+    // so skip updating v12 and v17.
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	.Lpoly_hash_ad_internal
+	b	.Lseal_tail
+.cfi_endproc
+.size	chacha20_poly1305_seal,.-chacha20_poly1305_seal
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_open(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *aead_data);
+//
+.globl	chacha20_poly1305_open
+.hidden	chacha20_poly1305_open
+.type	chacha20_poly1305_open,%function
+.align	6
+chacha20_poly1305_open:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, .Lchacha20_consts
+	add	x11, x11, :lo12:.Lchacha20_consts
+
+	ld1	{v24.16b - v27.16b}, [x11] // .Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x2
+
+	cmp	x2, #128
+	b.le	.Lopen_128 // Optimization for smaller buffers
+
+    // Initially we prepare a single ChaCha20 block for the Poly1305 R and S keys
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+
+	mov	x6, #10
+
+.align	5
+.Lopen_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.hi	.Lopen_init_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+
+	and	v0.16b, v0.16b, v27.16b
+	mov	x16, v0.d[0] // Move the R key to GPRs
+	mov	x17, v0.d[1]
+	mov	v27.16b, v5.16b // Store the S key
+
+	bl	.Lpoly_hash_ad_internal
+
+.Lopen_ad_done:
+	mov	x3, x1
+
+// Each iteration of the loop hash 320 bytes, and prepare stream for 320 bytes
+.Lopen_main_loop:
+
+	cmp	x2, #192
+	b.lt	.Lopen_tail
+
+	adrp	x11, .Lchacha20_consts
+	add	x11, x11, :lo12:.Lchacha20_consts
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	sub	x5, x5, #32
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash, will always be at least 12
+	sub	x4, x4, #10
+
+	mov	x7, #10
+	subs	x6, x7, x4
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 320 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are full
+
+	cbz	x7, .Lopen_main_loop_rounds_short
+
+.align	5
+.Lopen_main_loop_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+.Lopen_main_loop_rounds_short:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x7, x7, #1
+	b.gt	.Lopen_main_loop_rounds
+	subs	x6, x6, #1
+	b.ge	.Lopen_main_loop_rounds_short
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+    // We can always safely store 192 bytes
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #192
+
+	mov	v0.16b, v3.16b
+	mov	v5.16b, v8.16b
+	mov	v10.16b, v13.16b
+	mov	v15.16b, v18.16b
+
+	cmp	x2, #64
+	b.lt	.Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v4.16b
+	mov	v5.16b, v9.16b
+	mov	v10.16b, v14.16b
+	mov	v15.16b, v19.16b
+
+	cmp	x2, #64
+	b.lt	.Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+	b	.Lopen_main_loop
+
+.Lopen_tail:
+
+	cbz	x2, .Lopen_finalize
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash
+
+	cmp	x2, #64
+	b.le	.Lopen_tail_64
+	cmp	x2, #128
+	b.le	.Lopen_tail_128
+
+.Lopen_tail_192:
+     // We need three more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	mov	v17.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v21.16b, v21.16b, v21.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v21.d[0], x15
+
+	add	v22.4s, v23.4s, v21.4s
+	add	v21.4s, v22.4s, v21.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	mov	x7, #10
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 160 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are hashing
+	sub	x4, x4, x7
+
+	cbz	x7, .Lopen_tail_192_rounds_no_hash
+
+.Lopen_tail_192_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+.Lopen_tail_192_rounds_no_hash:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x7, x7, #1
+	b.gt	.Lopen_tail_192_rounds
+	subs	x6, x6, #1
+	b.ge	.Lopen_tail_192_rounds_no_hash
+
+    // We hashed 160 bytes at most, may still have 32 bytes left
+.Lopen_tail_192_hash:
+	cbz	x4, .Lopen_tail_192_hash_done
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	.Lopen_tail_192_hash
+
+.Lopen_tail_192_hash_done:
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #128
+	b	.Lopen_tail_64_store
+
+.Lopen_tail_128:
+     // We need two more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v22.16b, v22.16b, v22.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v22.d[0], x15
+	add	v22.4s, v22.4s, v23.4s
+
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+.Lopen_tail_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #4
+	subs	x6, x6, #1
+	b.gt	.Lopen_tail_128_rounds
+	cbz	x4, .Lopen_tail_128_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	.Lopen_tail_128_rounds
+
+.Lopen_tail_128_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+	b	.Lopen_tail_64_store
+
+.Lopen_tail_64:
+    // We just need a single block
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	ins	v23.s[0], v25.s[0]
+	add	v15.4s, v15.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+.Lopen_tail_64_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.gt	.Lopen_tail_64_rounds
+	cbz	x4, .Lopen_tail_64_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	.Lopen_tail_64_rounds
+
+.Lopen_tail_64_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v15.4s, v15.4s, v23.4s
+
+.Lopen_tail_64_store:
+	cmp	x2, #16
+	b.lt	.Lopen_tail_16
+
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	st1	{v20.16b}, [x0], #16
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+	sub	x2, x2, #16
+	b	.Lopen_tail_64_store
+
+.Lopen_tail_16:
+    // Here we handle the last [0,16) bytes that require a padded block
+	cbz	x2, .Lopen_finalize
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the ciphertext
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask
+	not	v22.16b, v20.16b
+
+	add	x7, x1, x2
+	mov	x6, x2
+
+.Lopen_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x7, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	.Lopen_tail_16_compose
+
+	and	v20.16b, v20.16b, v21.16b
+    // Hash in the final padded block
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	eor	v20.16b, v20.16b, v0.16b
+
+.Lopen_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	.Lopen_tail_16_store
+
+.Lopen_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.Lopen_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+.Lopen_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	.Lopen_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	.Lpoly_hash_ad_internal
+
+.Lopen_128_store:
+	cmp	x2, #64
+	b.lt	.Lopen_128_store_64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+.Lopen_128_store_64:
+
+	lsr	x4, x2, #4
+	mov	x3, x1
+
+.Lopen_128_hash_64:
+	cbz	x4, .Lopen_tail_64_store
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	.Lopen_128_hash_64
+.cfi_endproc
+.size	chacha20_poly1305_open,.-chacha20_poly1305_open
+#endif
+#endif  // !OPENSSL_NO_ASM
+.section	.note.GNU-stack,"",%progbits
diff --git a/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S b/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
index f8cd03d..4949ba3 100644
--- a/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
+++ b/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
@@ -635,7 +635,7 @@
 	//
 	// [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice
 	// [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev	w8, w8
 #endif
 	add	w10, w8, #1
diff --git a/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S
index 9480a38..4544cee 100644
--- a/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+++ b/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S
@@ -120,7 +120,7 @@
 	movi	v19.16b,#0xe1
 	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
 	shl	v19.2d,v19.2d,#57
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v3.16b,v17.16b,v17.16b,#8
@@ -145,7 +145,7 @@
 	eor	v18.16b,v18.16b,v2.16b
 	eor	v0.16b,v0.16b,v18.16b
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -184,14 +184,14 @@
 	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
 	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
 	b.lo	.Lodd_tail_v8		//x3 was less than 32
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v7.16b,v17.16b,v17.16b,#8
@@ -223,13 +223,13 @@
 	eor	v18.16b,v0.16b,v2.16b
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 #endif
 	eor	v1.16b,v1.16b,v18.16b
 	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ins	v2.d[0],v1.d[1]
@@ -279,7 +279,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 
 .Ldone_v8:
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -298,7 +298,7 @@
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
 
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
@@ -342,7 +342,7 @@
 	eor	v16.16b,v4.16b,v0.16b
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
 	ext	v3.16b,v16.16b,v16.16b,#8
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v7.16b,v7.16b
@@ -425,7 +425,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d,v6.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v4.16b,v4.16b
@@ -477,7 +477,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v4.16b,v4.16b
 #endif
@@ -520,7 +520,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v4.16b,v4.16b
 #endif
 
@@ -560,7 +560,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 	ext	v0.16b,v0.16b,v0.16b,#8
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	st1	{v0.2d},[x0]		//write out Xi
diff --git a/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S
new file mode 100644
index 0000000..3efcccb
--- /dev/null
+++ b/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S
@@ -0,0 +1,1713 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.align	5
+.Lpoly:
+.quad	0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001
+.LRR:	//	2^512 mod P precomputed for NIST P256 polynomial
+.quad	0x0000000000000003,0xfffffffbffffffff,0xfffffffffffffffe,0x00000004fffffffd
+.Lone_mont:
+.quad	0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe
+.Lone:
+.quad	1,0,0,0
+.Lord:
+.quad	0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000
+.LordK:
+.quad	0xccd1c8aaee00bc4f
+.byte	69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.align	2
+
+// void	ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4],
+//					     const BN_ULONG x2[4]);
+.globl	ecp_nistz256_mul_mont
+.hidden	ecp_nistz256_mul_mont
+.type	ecp_nistz256_mul_mont,%function
+.align	4
+ecp_nistz256_mul_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	bl	__ecp_nistz256_mul_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
+
+// void	ecp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_sqr_mont
+.hidden	ecp_nistz256_sqr_mont
+.type	ecp_nistz256_sqr_mont,%function
+.align	4
+ecp_nistz256_sqr_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	bl	__ecp_nistz256_sqr_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
+
+// void	ecp_nistz256_div_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_div_by_2
+.hidden	ecp_nistz256_div_by_2
+.type	ecp_nistz256_div_by_2,%function
+.align	4
+ecp_nistz256_div_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	bl	__ecp_nistz256_div_by_2
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
+
+// void	ecp_nistz256_mul_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_2
+.hidden	ecp_nistz256_mul_by_2
+.type	ecp_nistz256_mul_by_2,%function
+.align	4
+ecp_nistz256_mul_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
+
+// void	ecp_nistz256_mul_by_3(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_3
+.hidden	ecp_nistz256_mul_by_3
+.type	ecp_nistz256_mul_by_3,%function
+.align	4
+ecp_nistz256_mul_by_3:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	mov	x8,x4
+	mov	x9,x5
+	mov	x10,x6
+	mov	x11,x7
+
+	bl	__ecp_nistz256_add_to	// ret += a	// 2*a+a=3*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
+
+// void	ecp_nistz256_sub(BN_ULONG x0[4],const BN_ULONG x1[4],
+//				        const BN_ULONG x2[4]);
+.globl	ecp_nistz256_sub
+.hidden	ecp_nistz256_sub
+.type	ecp_nistz256_sub,%function
+.align	4
+ecp_nistz256_sub:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_sub,.-ecp_nistz256_sub
+
+// void	ecp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_neg
+.hidden	ecp_nistz256_neg
+.type	ecp_nistz256_neg,%function
+.align	4
+ecp_nistz256_neg:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	mov	x2,x1
+	mov	x14,xzr		// a = 0
+	mov	x15,xzr
+	mov	x16,xzr
+	mov	x17,xzr
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_neg,.-ecp_nistz256_neg
+
+// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded
+// to x4-x7 and b[0] - to x3
+.type	__ecp_nistz256_mul_mont,%function
+.align	4
+__ecp_nistz256_mul_mont:
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x11,x7,x3
+	ldr	x3,[x2,#8]		// b[1]
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adc	x19,xzr,x11
+	mov	x20,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(1+1)]	// b[1+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(2+1)]	// b[2+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	// last reduction
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adcs	x17,x19,x11
+	adc	x19,x20,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont
+
+// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded
+// to x4-x7
+.type	__ecp_nistz256_sqr_mont,%function
+.align	4
+__ecp_nistz256_sqr_mont:
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x2,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	lsl	x8,x14,#32
+	adcs	x1,x1,x11
+	lsr	x9,x14,#32
+	adc	x2,x2,x7
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adc	x17,x11,xzr		// can't overflow
+
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x2
+	adc	x19,xzr,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont
+
+// Note that __ecp_nistz256_add_to expects both input vectors pre-loaded to
+// x4-x7 and x8-x11. This is done because it's used in multiple
+// contexts, e.g. in multiplication by 2 and 3...
+.type	__ecp_nistz256_add_to,%function
+.align	4
+__ecp_nistz256_add_to:
+	adds	x14,x14,x8		// ret = a+b
+	adcs	x15,x15,x9
+	adcs	x16,x16,x10
+	adcs	x17,x17,x11
+	adc	x1,xzr,xzr		// zap x1
+
+	adds	x8,x14,#1		// subs	x8,x4,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x1,xzr		// did subtraction borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_add_to,.-__ecp_nistz256_add_to
+
+.type	__ecp_nistz256_sub_from,%function
+.align	4
+__ecp_nistz256_sub_from:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x14,x8		// ret = a-b
+	sbcs	x15,x15,x9
+	sbcs	x16,x16,x10
+	sbcs	x17,x17,x11
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from
+
+.type	__ecp_nistz256_sub_morf,%function
+.align	4
+__ecp_nistz256_sub_morf:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x8,x14		// ret = b-a
+	sbcs	x15,x9,x15
+	sbcs	x16,x10,x16
+	sbcs	x17,x11,x17
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf
+
+.type	__ecp_nistz256_div_by_2,%function
+.align	4
+__ecp_nistz256_div_by_2:
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = a+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adcs	x11,x17,x13
+	adc	x1,xzr,xzr		// zap x1
+	tst	x14,#1		// is a even?
+
+	csel	x14,x14,x8,eq	// ret = even ? a : a+modulus
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	csel	x17,x17,x11,eq
+	csel	x1,xzr,x1,eq
+
+	lsr	x14,x14,#1		// ret >>= 1
+	orr	x14,x14,x15,lsl#63
+	lsr	x15,x15,#1
+	orr	x15,x15,x16,lsl#63
+	lsr	x16,x16,#1
+	orr	x16,x16,x17,lsl#63
+	lsr	x17,x17,#1
+	stp	x14,x15,[x0]
+	orr	x17,x17,x1,lsl#63
+	stp	x16,x17,[x0,#16]
+
+	ret
+.size	__ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2
+.globl	ecp_nistz256_point_double
+.hidden	ecp_nistz256_point_double
+.type	ecp_nistz256_point_double,%function
+.align	5
+ecp_nistz256_point_double:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	sub	sp,sp,#32*4
+
+.Ldouble_shortcut:
+	ldp	x14,x15,[x1,#32]
+	mov	x21,x0
+	ldp	x16,x17,[x1,#48]
+	mov	x22,x1
+	ldr	x12,.Lpoly+8
+	mov	x8,x14
+	ldr	x13,.Lpoly+24
+	mov	x9,x15
+	ldp	x4,x5,[x22,#64]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[x22,#64+16]
+	add	x0,sp,#0
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(S, in_y);
+
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Zsqr, in_z);
+
+	ldp	x8,x9,[x22]
+	ldp	x10,x11,[x22,#16]
+	mov	x4,x14		// put Zsqr aside for p256_sub
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to	// p256_add(M, Zsqr, in_x);
+
+	add	x2,x22,#0
+	mov	x14,x4		// restore Zsqr
+	mov	x15,x5
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x16,x6
+	mov	x17,x7
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sub_morf	// p256_sub(Zsqr, in_x, Zsqr);
+
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(S, S);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[x22,#64]
+	ldp	x6,x7,[x22,#64+16]
+	add	x2,x22,#32
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(tmp0, in_z, in_y);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,x21,#64
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(res_z, tmp0);
+
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(tmp0, S);
+
+	ldr	x3,[sp,#64]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,x21,#32
+	bl	__ecp_nistz256_div_by_2	// p256_div_by_2(res_y, tmp0);
+
+	add	x2,sp,#64
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(M, M, Zsqr);
+
+	mov	x8,x14		// duplicate M
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14		// put M aside
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to
+	mov	x8,x4			// restore M
+	mov	x9,x5
+	ldr	x3,[x22]		// forward load for p256_mul_mont
+	mov	x10,x6
+	ldp	x4,x5,[sp,#0]
+	mov	x11,x7
+	ldp	x6,x7,[sp,#0+16]
+	bl	__ecp_nistz256_add_to	// p256_mul_by_3(M, M);
+
+	add	x2,x22,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, in_x);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#32]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(tmp0, S);
+
+	add	x0,x21,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(res_x, M);
+
+	add	x2,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_x, res_x, tmp0);
+
+	add	x2,sp,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(S, S, res_x);
+
+	ldr	x3,[sp,#32]
+	mov	x4,x14		// copy S
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x2,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, M);
+
+	add	x2,x21,#32
+	add	x0,x21,#32
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, S, res_y);
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_double,.-ecp_nistz256_point_double
+.globl	ecp_nistz256_point_add
+.hidden	ecp_nistz256_point_add
+.type	ecp_nistz256_point_add,%function
+.align	5
+ecp_nistz256_point_add:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	sub	sp,sp,#32*12
+
+	ldp	x4,x5,[x2,#64]	// in2_z
+	ldp	x6,x7,[x2,#64+16]
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x25,x8,x10
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z2sqr, in2_z);
+
+	ldp	x4,x5,[x22,#64]	// in1_z
+	ldp	x6,x7,[x22,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x2,x23,#64
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, Z2sqr, in2_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x22,#64
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x2,x22,#32
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, S1, in1_y);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#352]
+	ldp	x6,x7,[sp,#352+16]
+	add	x2,x23,#32
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,sp,#320
+	ldr	x3,[sp,#192]	// forward load for p256_mul_mont
+	ldp	x4,x5,[x22]
+	ldp	x6,x7,[x22,#16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, S1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x26,x14,x16	// ~is_equal(S1,S2)
+
+	add	x2,sp,#192
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U1, in1_x, Z2sqr);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[x23]
+	ldp	x6,x7,[x23,#16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in2_x, Z1sqr);
+
+	add	x2,sp,#256
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, U1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x14,x14,x16	// ~is_equal(U1,U2)
+
+	mvn	x27,x24	// -1/0 -> 0/-1
+	mvn	x28,x25	// -1/0 -> 0/-1
+	orr	x14,x14,x27
+	orr	x14,x14,x28
+	orr	x14,x14,x26
+	cbnz	x14,.Ladd_proceed	// if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2))
+
+.Ladd_double:
+	mov	x1,x22
+	mov	x0,x21
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	add	sp,sp,#256	// #256 is from #32*(12-4). difference in stack frames
+	b	.Ldouble_shortcut
+
+.align	4
+.Ladd_proceed:
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#64]
+	ldp	x6,x7,[sp,#64+16]
+	add	x2,x23,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, res_z, in2_z);
+
+	ldr	x3,[sp,#96]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,sp,#96
+	add	x0,sp,#224
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, U1, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#128
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#192
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#224
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#288
+	ldr	x3,[sp,#224]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,sp,#224
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S1, Hcub);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#160
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#352
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+.Ladd_done:
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_add,.-ecp_nistz256_point_add
+.globl	ecp_nistz256_point_add_affine
+.hidden	ecp_nistz256_point_add_affine
+.type	ecp_nistz256_point_add_affine,%function
+.align	5
+ecp_nistz256_point_add_affine:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-80]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	sub	sp,sp,#32*10
+
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,.Lpoly+8
+	ldr	x13,.Lpoly+24
+
+	ldp	x4,x5,[x1,#64]	// in1_z
+	ldp	x6,x7,[x1,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+
+	ldp	x14,x15,[x2]	// in2_x
+	ldp	x16,x17,[x2,#16]
+	ldp	x8,x9,[x2,#32]	// in2_y
+	ldp	x10,x11,[x2,#48]
+	orr	x14,x14,x15
+	orr	x16,x16,x17
+	orr	x8,x8,x9
+	orr	x10,x10,x11
+	orr	x14,x14,x16
+	orr	x8,x8,x10
+	orr	x25,x14,x8
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	ldr	x3,[x23]
+	add	x2,x23,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, Z1sqr, in2_x);
+
+	add	x2,x22,#0
+	ldr	x3,[x22,#64]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, in1_x);
+
+	add	x2,x22,#64
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#160]
+	ldp	x6,x7,[sp,#160+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x23,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,x22,#32
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, in1_y);
+
+	add	x0,sp,#224
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x0,sp,#288
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,sp,#160
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[x22]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,x22,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in1_x, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#224
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#288
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#256
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#96
+	ldr	x3,[x22,#32]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,x22,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, in1_y, Hcub);
+
+	ldr	x3,[sp,#192]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#192
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#128
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	adr	x23,.Lone_mont-64
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x29,x30,[sp],#80
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_mul_mont(uint64_t res[4], uint64_t a[4],
+//                                uint64_t b[4]);
+.globl	ecp_nistz256_ord_mul_mont
+.hidden	ecp_nistz256_ord_mul_mont
+.type	ecp_nistz256_ord_mul_mont,%function
+.align	4
+ecp_nistz256_ord_mul_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,.Lord
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x19,x7,x3
+
+	mul	x24,x14,x23
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adc	x19,x19,xzr
+	mov	x20,xzr
+	ldr	x3,[x2,#8*1]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*2]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*3]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	lsl	x8,x24,#32		// last reduction
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+.size	ecp_nistz256_ord_mul_mont,.-ecp_nistz256_ord_mul_mont
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
+//                                int rep);
+.globl	ecp_nistz256_ord_sqr_mont
+.hidden	ecp_nistz256_ord_sqr_mont
+.type	ecp_nistz256_ord_sqr_mont,%function
+.align	4
+ecp_nistz256_ord_sqr_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,.Lord
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+	b	.Loop_ord_sqr
+
+.align	4
+.Loop_ord_sqr:
+	sub	x2,x2,#1
+	////////////////////////////////////////////////////////////////
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x3,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	mul	x24,x14,x23
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	adcs	x1,x1,x11
+	adc	x3,x3,x7
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	mul	x24,x14,x23
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x3
+	adc	x19,xzr,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x4,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x5,x15,x9,lo
+	csel	x6,x16,x10,lo
+	csel	x7,x17,x11,lo
+
+	cbnz	x2,.Loop_ord_sqr
+
+	stp	x4,x5,[x0]
+	stp	x6,x7,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+.size	ecp_nistz256_ord_sqr_mont,.-ecp_nistz256_ord_sqr_mont
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w5
+.hidden	ecp_nistz256_select_w5
+.type	ecp_nistz256_select_w5,%function
+.align	4
+ecp_nistz256_select_w5:
+	AARCH64_VALID_CALL_TARGET
+
+    // x10 := x0
+    // w9 := 0; loop counter and incremented internal index
+	mov	x10, x0
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+	movi	v20.16b, #0
+	movi	v21.16b, #0
+
+.Lselect_w5_loop:
+    // Loop 16 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v27] := Load a (3*256-bit = 6*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // continue loading ...
+	ld1	{v26.2d, v27.2d}, [x1],#32
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+	bit	v20.16b, v26.16b, v3.16b
+	bit	v21.16b, v27.16b, v3.16b
+
+    // If bit #4 is not 0 (i.e. idx_ctr < 16) loop back
+	tbz	w9, #4, .Lselect_w5_loop
+
+    // Write [v16-v21] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x10],#64
+	st1	{v20.2d, v21.2d}, [x10]
+
+	ret
+.size	ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w7
+.hidden	ecp_nistz256_select_w7
+.type	ecp_nistz256_select_w7,%function
+.align	4
+ecp_nistz256_select_w7:
+	AARCH64_VALID_CALL_TARGET
+
+    // w9 := 0; loop counter and incremented internal index
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+
+.Lselect_w7_loop:
+    // Loop 64 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v25] := Load a (2*256-bit = 4*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+    // If bit #6 is not 0 (i.e. idx_ctr < 64) loop back
+	tbz	w9, #6, .Lselect_w7_loop
+
+    // Write [v16-v19] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x0]
+
+	ret
+.size	ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
+#endif
+#endif  // !OPENSSL_NO_ASM
+.section	.note.GNU-stack,"",%progbits
diff --git a/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
new file mode 100644
index 0000000..9243b8b
--- /dev/null
+++ b/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
@@ -0,0 +1,320 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.globl	beeu_mod_inverse_vartime
+.hidden	beeu_mod_inverse_vartime
+.type	beeu_mod_inverse_vartime, %function
+.align	4
+beeu_mod_inverse_vartime:
+    // Reserve enough space for 14 8-byte registers on the stack
+    // in the first stp call for x29, x30.
+    // Then store the remaining callee-saved registers.
+    //
+    //    | x29 | x30 | x19 | x20 | ... | x27 | x28 |  x0 |  x2 |
+    //    ^                                                     ^
+    //    sp  <------------------- 112 bytes ----------------> old sp
+    //   x29 (FP)
+    //
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-112]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	stp	x0,x2,[sp,#96]
+
+    // B = b3..b0 := a
+	ldp	x25,x26,[x1]
+	ldp	x27,x28,[x1,#16]
+
+    // n3..n0 := n
+    // Note: the value of input params are changed in the following.
+	ldp	x0,x1,[x2]
+	ldp	x2,x30,[x2,#16]
+
+    // A = a3..a0 := n
+	mov	x21, x0
+	mov	x22, x1
+	mov	x23, x2
+	mov	x24, x30
+
+    // X = x4..x0 := 1
+	mov	x3, #1
+	eor	x4, x4, x4
+	eor	x5, x5, x5
+	eor	x6, x6, x6
+	eor	x7, x7, x7
+
+    // Y = y4..y0 := 0
+	eor	x8, x8, x8
+	eor	x9, x9, x9
+	eor	x10, x10, x10
+	eor	x11, x11, x11
+	eor	x12, x12, x12
+
+.Lbeeu_loop:
+    // if B == 0, jump to .Lbeeu_loop_end
+	orr	x14, x25, x26
+	orr	x14, x14, x27
+
+    // reverse the bit order of x25. This is needed for clz after this macro
+	rbit	x15, x25
+
+	orr	x14, x14, x28
+	cbz	x14,.Lbeeu_loop_end
+
+
+    // 0 < B < |n|,
+    // 0 < A <= |n|,
+    // (1)      X*a  ==  B   (mod |n|),
+    // (2) (-1)*Y*a  ==  A   (mod |n|)
+
+    // Now divide B by the maximum possible power of two in the
+    // integers, and divide X by the same value mod |n|.
+    // When we're done, (1) still holds.
+
+    // shift := number of trailing 0s in x25
+    // (      = number of leading 0s in x15; see the "rbit" instruction in TEST_B_ZERO)
+	clz	x13, x15
+
+    // If there is no shift, goto shift_A_Y
+	cbz	x13, .Lbeeu_shift_A_Y
+
+    // Shift B right by "x13" bits
+	neg	x14, x13
+	lsr	x25, x25, x13
+	lsl	x15, x26, x14
+
+	lsr	x26, x26, x13
+	lsl	x19, x27, x14
+
+	orr	x25, x25, x15
+
+	lsr	x27, x27, x13
+	lsl	x20, x28, x14
+
+	orr	x26, x26, x19
+
+	lsr	x28, x28, x13
+
+	orr	x27, x27, x20
+
+
+    // Shift X right by "x13" bits, adding n whenever X becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+.Lbeeu_shift_loop_X:
+	tbz	x3, #0, .Lshift1_0
+	adds	x3, x3, x0
+	adcs	x4, x4, x1
+	adcs	x5, x5, x2
+	adcs	x6, x6, x30
+	adc	x7, x7, x14
+.Lshift1_0:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x3, x4, x3, #1
+	extr	x4, x5, x4, #1
+	extr	x5, x6, x5, #1
+	extr	x6, x7, x6, #1
+	lsr	x7, x7, #1
+
+	subs	x13, x13, #1
+	bne	.Lbeeu_shift_loop_X
+
+    // Note: the steps above perform the same sequence as in p256_beeu-x86_64-asm.pl
+    // with the following differences:
+    // - "x13" is set directly to the number of trailing 0s in B
+    //   (using rbit and clz instructions)
+    // - The loop is only used to call SHIFT1(X)
+    //   and x13 is decreased while executing the X loop.
+    // - SHIFT256(B, x13) is performed before right-shifting X; they are independent
+
+.Lbeeu_shift_A_Y:
+    // Same for A and Y.
+    // Afterwards, (2) still holds.
+    // Reverse the bit order of x21
+    // x13 := number of trailing 0s in x21 (= number of leading 0s in x15)
+	rbit	x15, x21
+	clz	x13, x15
+
+    // If there is no shift, goto |B-A|, X+Y update
+	cbz	x13, .Lbeeu_update_B_X_or_A_Y
+
+    // Shift A right by "x13" bits
+	neg	x14, x13
+	lsr	x21, x21, x13
+	lsl	x15, x22, x14
+
+	lsr	x22, x22, x13
+	lsl	x19, x23, x14
+
+	orr	x21, x21, x15
+
+	lsr	x23, x23, x13
+	lsl	x20, x24, x14
+
+	orr	x22, x22, x19
+
+	lsr	x24, x24, x13
+
+	orr	x23, x23, x20
+
+
+    // Shift Y right by "x13" bits, adding n whenever Y becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+.Lbeeu_shift_loop_Y:
+	tbz	x8, #0, .Lshift1_1
+	adds	x8, x8, x0
+	adcs	x9, x9, x1
+	adcs	x10, x10, x2
+	adcs	x11, x11, x30
+	adc	x12, x12, x14
+.Lshift1_1:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x8, x9, x8, #1
+	extr	x9, x10, x9, #1
+	extr	x10, x11, x10, #1
+	extr	x11, x12, x11, #1
+	lsr	x12, x12, #1
+
+	subs	x13, x13, #1
+	bne	.Lbeeu_shift_loop_Y
+
+.Lbeeu_update_B_X_or_A_Y:
+    // Try T := B - A; if cs, continue with B > A (cs: carry set = no borrow)
+    // Note: this is a case of unsigned arithmetic, where T fits in 4 64-bit words
+    //       without taking a sign bit if generated. The lack of a carry would
+    //       indicate a negative result. See, for example,
+    //       https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/condition-codes-1-condition-flags-and-codes
+	subs	x14, x25, x21
+	sbcs	x15, x26, x22
+	sbcs	x19, x27, x23
+	sbcs	x20, x28, x24
+	bcs	.Lbeeu_B_greater_than_A
+
+    // Else A > B =>
+    // A := A - B; Y := Y + X; goto beginning of the loop
+	subs	x21, x21, x25
+	sbcs	x22, x22, x26
+	sbcs	x23, x23, x27
+	sbcs	x24, x24, x28
+
+	adds	x8, x8, x3
+	adcs	x9, x9, x4
+	adcs	x10, x10, x5
+	adcs	x11, x11, x6
+	adc	x12, x12, x7
+	b	.Lbeeu_loop
+
+.Lbeeu_B_greater_than_A:
+    // Continue with B > A =>
+    // B := B - A; X := X + Y; goto beginning of the loop
+	mov	x25, x14
+	mov	x26, x15
+	mov	x27, x19
+	mov	x28, x20
+
+	adds	x3, x3, x8
+	adcs	x4, x4, x9
+	adcs	x5, x5, x10
+	adcs	x6, x6, x11
+	adc	x7, x7, x12
+	b	.Lbeeu_loop
+
+.Lbeeu_loop_end:
+    // The Euclid's algorithm loop ends when A == gcd(a,n);
+    // this would be 1, when a and n are co-prime (i.e. do not have a common factor).
+    // Since (-1)*Y*a == A (mod |n|), Y>0
+    // then out = -Y mod n
+
+    // Verify that A = 1 ==> (-1)*Y*a = A = 1  (mod |n|)
+    // Is A-1 == 0?
+    // If not, fail.
+	sub	x14, x21, #1
+	orr	x14, x14, x22
+	orr	x14, x14, x23
+	orr	x14, x14, x24
+	cbnz	x14, .Lbeeu_err
+
+    // If Y>n ==> Y:=Y-n
+.Lbeeu_reduction_loop:
+    // x_i := y_i - n_i (X is no longer needed, use it as temp)
+    // (x14 = 0 from above)
+	subs	x3, x8, x0
+	sbcs	x4, x9, x1
+	sbcs	x5, x10, x2
+	sbcs	x6, x11, x30
+	sbcs	x7, x12, x14
+
+    // If result is non-negative (i.e., cs = carry set = no borrow),
+    // y_i := x_i; goto reduce again
+    // else
+    // y_i := y_i; continue
+	csel	x8, x3, x8, cs
+	csel	x9, x4, x9, cs
+	csel	x10, x5, x10, cs
+	csel	x11, x6, x11, cs
+	csel	x12, x7, x12, cs
+	bcs	.Lbeeu_reduction_loop
+
+    // Now Y < n (Y cannot be equal to n, since the inverse cannot be 0)
+    // out = -Y = n-Y
+	subs	x8, x0, x8
+	sbcs	x9, x1, x9
+	sbcs	x10, x2, x10
+	sbcs	x11, x30, x11
+
+    // Save Y in output (out (x0) was saved on the stack)
+	ldr	x3, [sp,#96]
+	stp	x8, x9, [x3]
+	stp	x10, x11, [x3,#16]
+    // return 1 (success)
+	mov	x0, #1
+	b	.Lbeeu_finish
+
+.Lbeeu_err:
+    // return 0 (error)
+	eor	x0, x0, x0
+
+.Lbeeu_finish:
+    // Restore callee-saved registers, except x0, x2
+	add	sp,x29,#0
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldp	x25,x26,[sp,#64]
+	ldp	x27,x28,[sp,#80]
+	ldp	x29,x30,[sp],#112
+
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	beeu_mod_inverse_vartime,.-beeu_mod_inverse_vartime
+#endif
+#endif  // !OPENSSL_NO_ASM
+.section	.note.GNU-stack,"",%progbits
diff --git a/linux-aarch64/crypto/fipsmodule/sha1-armv8.S b/linux-aarch64/crypto/fipsmodule/sha1-armv8.S
index 838ec32..d7a8795 100644
--- a/linux-aarch64/crypto/fipsmodule/sha1-armv8.S
+++ b/linux-aarch64/crypto/fipsmodule/sha1-armv8.S
@@ -52,7 +52,7 @@
 	movz	w28,#0x7999
 	sub	x2,x2,#1
 	movk	w28,#0x5a82,lsl#16
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x3,x3,#32
 #else
 	rev32	x3,x3
@@ -70,7 +70,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w4	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x5,x5,#32
 #else
 	rev32	x5,x5
@@ -95,7 +95,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w6	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x7,x7,#32
 #else
 	rev32	x7,x7
@@ -120,7 +120,7 @@
 	ror	w22,w22,#2
 	add	w24,w24,w8	// future e+=X[i]
 	add	w20,w20,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x9,x9,#32
 #else
 	rev32	x9,x9
@@ -145,7 +145,7 @@
 	ror	w20,w20,#2
 	add	w22,w22,w10	// future e+=X[i]
 	add	w23,w23,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x11,x11,#32
 #else
 	rev32	x11,x11
@@ -170,7 +170,7 @@
 	ror	w23,w23,#2
 	add	w20,w20,w12	// future e+=X[i]
 	add	w21,w21,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x13,x13,#32
 #else
 	rev32	x13,x13
@@ -195,7 +195,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w14	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x15,x15,#32
 #else
 	rev32	x15,x15
@@ -220,7 +220,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w16	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x17,x17,#32
 #else
 	rev32	x17,x17
diff --git a/linux-aarch64/crypto/fipsmodule/sha256-armv8.S b/linux-aarch64/crypto/fipsmodule/sha256-armv8.S
index a4f170e..c777ec8 100644
--- a/linux-aarch64/crypto/fipsmodule/sha256-armv8.S
+++ b/linux-aarch64/crypto/fipsmodule/sha256-armv8.S
@@ -13,7 +13,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -41,6 +41,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -49,7 +50,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -101,7 +102,7 @@
 	ldr	w19,[x30],#4			// *K++
 	eor	w28,w21,w22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w3,w3			// 0
 #endif
 	ror	w16,w24,#6
@@ -124,7 +125,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w4,w4			// 1
 #endif
 	ldp	w5,w6,[x1],#2*4
@@ -149,7 +150,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w5,w5			// 2
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -173,7 +174,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w6,w6			// 3
 #endif
 	ldp	w7,w8,[x1],#2*4
@@ -198,7 +199,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w7,w7			// 4
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -222,7 +223,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w8,w8			// 5
 #endif
 	ldp	w9,w10,[x1],#2*4
@@ -247,7 +248,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w9,w9			// 6
 #endif
 	add	w22,w22,w17			// h+=Sigma0(a)
@@ -271,7 +272,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w10,w10			// 7
 #endif
 	ldp	w11,w12,[x1],#2*4
@@ -296,7 +297,7 @@
 	add	w20,w20,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w20,w20,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w11,w11			// 8
 #endif
 	add	w20,w20,w17			// h+=Sigma0(a)
@@ -320,7 +321,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w12,w12			// 9
 #endif
 	ldp	w13,w14,[x1],#2*4
@@ -345,7 +346,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w13,w13			// 10
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -369,7 +370,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w14,w14			// 11
 #endif
 	ldp	w15,w0,[x1],#2*4
@@ -395,7 +396,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w15,w15			// 12
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -420,7 +421,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w0,w0			// 13
 #endif
 	ldp	w1,w2,[x1]
@@ -446,7 +447,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w1,w1			// 14
 #endif
 	ldr	w6,[sp,#12]
@@ -472,7 +473,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w2,w2			// 15
 #endif
 	ldr	w7,[sp,#0]
diff --git a/linux-aarch64/crypto/fipsmodule/sha512-armv8.S b/linux-aarch64/crypto/fipsmodule/sha512-armv8.S
index 98b7a7e..a3b458a 100644
--- a/linux-aarch64/crypto/fipsmodule/sha512-armv8.S
+++ b/linux-aarch64/crypto/fipsmodule/sha512-armv8.S
@@ -13,7 +13,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -41,6 +41,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -49,7 +50,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -65,6 +66,17 @@
 .type	sha512_block_data_order,%function
 .align	6
 sha512_block_data_order:
+	AARCH64_VALID_CALL_TARGET
+#ifndef	__KERNEL__
+#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
+	adrp	x16,:pg_hi21_nc:OPENSSL_armcap_P
+#else
+	adrp	x16,OPENSSL_armcap_P
+#endif
+	ldr	w16,[x16,:lo12:OPENSSL_armcap_P]
+	tst	w16,#ARMV8_SHA512
+	b.ne	.Lv8_entry
+#endif
 	AARCH64_SIGN_LINK_REGISTER
 	stp	x29,x30,[sp,#-128]!
 	add	x29,sp,#0
@@ -90,7 +102,7 @@
 	ldr	x19,[x30],#8			// *K++
 	eor	x28,x21,x22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x3,x3			// 0
 #endif
 	ror	x16,x24,#14
@@ -113,7 +125,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x4,x4			// 1
 #endif
 	ldp	x5,x6,[x1],#2*8
@@ -138,7 +150,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x5,x5			// 2
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -162,7 +174,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x6,x6			// 3
 #endif
 	ldp	x7,x8,[x1],#2*8
@@ -187,7 +199,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x7,x7			// 4
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -211,7 +223,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x8,x8			// 5
 #endif
 	ldp	x9,x10,[x1],#2*8
@@ -236,7 +248,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x9,x9			// 6
 #endif
 	add	x22,x22,x17			// h+=Sigma0(a)
@@ -260,7 +272,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x10,x10			// 7
 #endif
 	ldp	x11,x12,[x1],#2*8
@@ -285,7 +297,7 @@
 	add	x20,x20,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x20,x20,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x11,x11			// 8
 #endif
 	add	x20,x20,x17			// h+=Sigma0(a)
@@ -309,7 +321,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x12,x12			// 9
 #endif
 	ldp	x13,x14,[x1],#2*8
@@ -334,7 +346,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x13,x13			// 10
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -358,7 +370,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x14,x14			// 11
 #endif
 	ldp	x15,x0,[x1],#2*8
@@ -384,7 +396,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x15,x15			// 12
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -409,7 +421,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x0,x0			// 13
 #endif
 	ldp	x1,x2,[x1]
@@ -435,7 +447,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x1,x1			// 14
 #endif
 	ldr	x6,[sp,#24]
@@ -461,7 +473,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x2,x2			// 15
 #endif
 	ldr	x7,[sp,#0]
@@ -1079,6 +1091,527 @@
 .byte	83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 .align	2
 .align	2
+.text
+#ifndef	__KERNEL__
+.type	sha512_block_armv8,%function
+.align	6
+sha512_block_armv8:
+.Lv8_entry:
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ld1	{v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64	// load input
+	ld1	{v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
+
+	ld1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// load context
+	adrp	x3,.LK512
+	add	x3,x3,:lo12:.LK512
+
+	rev64	v16.16b,v16.16b
+	rev64	v17.16b,v17.16b
+	rev64	v18.16b,v18.16b
+	rev64	v19.16b,v19.16b
+	rev64	v20.16b,v20.16b
+	rev64	v21.16b,v21.16b
+	rev64	v22.16b,v22.16b
+	rev64	v23.16b,v23.16b
+	b	.Loop_hw
+
+.align	4
+.Loop_hw:
+	ld1	{v24.2d},[x3],#16
+	subs	x2,x2,#1
+	sub	x4,x1,#128
+	orr	v26.16b,v0.16b,v0.16b			// offload
+	orr	v27.16b,v1.16b,v1.16b
+	orr	v28.16b,v2.16b,v2.16b
+	orr	v29.16b,v3.16b,v3.16b
+	csel	x1,x1,x4,ne			// conditional rewind
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.inst	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.inst	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.inst	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.inst	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.inst	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v16.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v16.16b,v16.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v17.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v17.16b,v17.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v18.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v18.16b,v18.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v19.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+	rev64	v19.16b,v19.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.inst	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v20.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+	rev64	v20.16b,v20.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.inst	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v21.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v21.16b,v21.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.inst	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v22.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v22.16b,v22.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.inst	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	sub	x3,x3,#80*8	// rewind
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v23.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.inst	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v23.16b,v23.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.inst	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v0.2d,v0.2d,v26.2d			// accumulate
+	add	v1.2d,v1.2d,v27.2d
+	add	v2.2d,v2.2d,v28.2d
+	add	v3.2d,v3.2d,v29.2d
+
+	cbnz	x2,.Loop_hw
+
+	st1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// store context
+
+	ldr	x29,[sp],#16
+	ret
+.size	sha512_block_armv8,.-sha512_block_armv8
+#endif
 #endif
 #endif  // !OPENSSL_NO_ASM
 .section	.note.GNU-stack,"",%progbits
diff --git a/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S b/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
index a09764a..6ce216f 100644
--- a/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
@@ -25,6 +25,8 @@
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
+	testl	$536870912,%r11d
+	jnz	.Lshaext_shortcut
 	andl	$1073741824,%r9d
 	andl	$268435968,%r10d
 	orl	%r9d,%r10d
@@ -1781,6 +1783,215 @@
 .long	0xffffffff,0xffffffff,0x03020100,0x0b0a0908
 .long	0xffffffff,0xffffffff,0x03020100,0x0b0a0908
 .byte	83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.type	sha256_block_data_order_shaext,@function
+.align	64
+sha256_block_data_order_shaext:
+.cfi_startproc	
+.Lshaext_shortcut:
+	leaq	K256+128(%rip),%rcx
+	movdqu	(%rdi),%xmm1
+	movdqu	16(%rdi),%xmm2
+	movdqa	512-128(%rcx),%xmm7
+
+	pshufd	$0x1b,%xmm1,%xmm0
+	pshufd	$0xb1,%xmm1,%xmm1
+	pshufd	$0x1b,%xmm2,%xmm2
+	movdqa	%xmm7,%xmm8
+.byte	102,15,58,15,202,8
+	punpcklqdq	%xmm0,%xmm2
+	jmp	.Loop_shaext
+
+.align	16
+.Loop_shaext:
+	movdqu	(%rsi),%xmm3
+	movdqu	16(%rsi),%xmm4
+	movdqu	32(%rsi),%xmm5
+.byte	102,15,56,0,223
+	movdqu	48(%rsi),%xmm6
+
+	movdqa	0-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	102,15,56,0,231
+	movdqa	%xmm2,%xmm10
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	nop
+	movdqa	%xmm1,%xmm9
+.byte	15,56,203,202
+
+	movdqa	32-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	102,15,56,0,239
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	leaq	64(%rsi),%rsi
+.byte	15,56,204,220
+.byte	15,56,203,202
+
+	movdqa	64-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	102,15,56,0,247
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+
+	movdqa	96-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	128-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	160-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+	nop
+	paddd	%xmm7,%xmm6
+.byte	15,56,204,220
+.byte	15,56,203,202
+	movdqa	192-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,205,245
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+	movdqa	224-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	256-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	288-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+	nop
+	paddd	%xmm7,%xmm6
+.byte	15,56,204,220
+.byte	15,56,203,202
+	movdqa	320-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,205,245
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm6,%xmm7
+.byte	102,15,58,15,253,4
+	nop
+	paddd	%xmm7,%xmm3
+.byte	15,56,204,229
+.byte	15,56,203,202
+	movdqa	352-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+.byte	15,56,205,222
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm3,%xmm7
+.byte	102,15,58,15,254,4
+	nop
+	paddd	%xmm7,%xmm4
+.byte	15,56,204,238
+.byte	15,56,203,202
+	movdqa	384-128(%rcx),%xmm0
+	paddd	%xmm3,%xmm0
+.byte	15,56,205,227
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm4,%xmm7
+.byte	102,15,58,15,251,4
+	nop
+	paddd	%xmm7,%xmm5
+.byte	15,56,204,243
+.byte	15,56,203,202
+	movdqa	416-128(%rcx),%xmm0
+	paddd	%xmm4,%xmm0
+.byte	15,56,205,236
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	movdqa	%xmm5,%xmm7
+.byte	102,15,58,15,252,4
+.byte	15,56,203,202
+	paddd	%xmm7,%xmm6
+
+	movdqa	448-128(%rcx),%xmm0
+	paddd	%xmm5,%xmm0
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+.byte	15,56,205,245
+	movdqa	%xmm8,%xmm7
+.byte	15,56,203,202
+
+	movdqa	480-128(%rcx),%xmm0
+	paddd	%xmm6,%xmm0
+	nop
+.byte	15,56,203,209
+	pshufd	$0x0e,%xmm0,%xmm0
+	decq	%rdx
+	nop
+.byte	15,56,203,202
+
+	paddd	%xmm10,%xmm2
+	paddd	%xmm9,%xmm1
+	jnz	.Loop_shaext
+
+	pshufd	$0xb1,%xmm2,%xmm2
+	pshufd	$0x1b,%xmm1,%xmm7
+	pshufd	$0xb1,%xmm1,%xmm1
+	punpckhqdq	%xmm2,%xmm1
+.byte	102,15,58,15,215,8
+
+	movdqu	%xmm1,(%rdi)
+	movdqu	%xmm2,16(%rdi)
+	.byte	0xf3,0xc3
+.cfi_endproc	
+.size	sha256_block_data_order_shaext,.-sha256_block_data_order_shaext
 .type	sha256_block_data_order_ssse3,@function
 .align	64
 sha256_block_data_order_ssse3:
diff --git a/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S b/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S
index 55cc781..59367b6 100644
--- a/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S
+++ b/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S
@@ -2067,187 +2067,6 @@
 	.byte	0xf3,0xc3
 .cfi_endproc	
 .size	__bn_post4x_internal,.-__bn_post4x_internal
-.globl	bn_from_montgomery
-.hidden bn_from_montgomery
-.type	bn_from_montgomery,@function
-.align	32
-bn_from_montgomery:
-.cfi_startproc	
-	testl	$7,%r9d
-	jz	bn_from_mont8x
-	xorl	%eax,%eax
-	.byte	0xf3,0xc3
-.cfi_endproc	
-.size	bn_from_montgomery,.-bn_from_montgomery
-
-.type	bn_from_mont8x,@function
-.align	32
-bn_from_mont8x:
-.cfi_startproc	
-.byte	0x67
-	movq	%rsp,%rax
-.cfi_def_cfa_register	%rax
-	pushq	%rbx
-.cfi_offset	%rbx,-16
-	pushq	%rbp
-.cfi_offset	%rbp,-24
-	pushq	%r12
-.cfi_offset	%r12,-32
-	pushq	%r13
-.cfi_offset	%r13,-40
-	pushq	%r14
-.cfi_offset	%r14,-48
-	pushq	%r15
-.cfi_offset	%r15,-56
-.Lfrom_prologue:
-
-	shll	$3,%r9d
-	leaq	(%r9,%r9,2),%r10
-	negq	%r9
-	movq	(%r8),%r8
-
-
-
-
-
-
-
-
-	leaq	-320(%rsp,%r9,2),%r11
-	movq	%rsp,%rbp
-	subq	%rdi,%r11
-	andq	$4095,%r11
-	cmpq	%r11,%r10
-	jb	.Lfrom_sp_alt
-	subq	%r11,%rbp
-	leaq	-320(%rbp,%r9,2),%rbp
-	jmp	.Lfrom_sp_done
-
-.align	32
-.Lfrom_sp_alt:
-	leaq	4096-320(,%r9,2),%r10
-	leaq	-320(%rbp,%r9,2),%rbp
-	subq	%r10,%r11
-	movq	$0,%r10
-	cmovcq	%r10,%r11
-	subq	%r11,%rbp
-.Lfrom_sp_done:
-	andq	$-64,%rbp
-	movq	%rsp,%r11
-	subq	%rbp,%r11
-	andq	$-4096,%r11
-	leaq	(%r11,%rbp,1),%rsp
-	movq	(%rsp),%r10
-	cmpq	%rbp,%rsp
-	ja	.Lfrom_page_walk
-	jmp	.Lfrom_page_walk_done
-
-.Lfrom_page_walk:
-	leaq	-4096(%rsp),%rsp
-	movq	(%rsp),%r10
-	cmpq	%rbp,%rsp
-	ja	.Lfrom_page_walk
-.Lfrom_page_walk_done:
-
-	movq	%r9,%r10
-	negq	%r9
-
-
-
-
-
-
-
-
-
-
-	movq	%r8,32(%rsp)
-	movq	%rax,40(%rsp)
-.cfi_escape	0x0f,0x05,0x77,0x28,0x06,0x23,0x08
-.Lfrom_body:
-	movq	%r9,%r11
-	leaq	48(%rsp),%rax
-	pxor	%xmm0,%xmm0
-	jmp	.Lmul_by_1
-
-.align	32
-.Lmul_by_1:
-	movdqu	(%rsi),%xmm1
-	movdqu	16(%rsi),%xmm2
-	movdqu	32(%rsi),%xmm3
-	movdqa	%xmm0,(%rax,%r9,1)
-	movdqu	48(%rsi),%xmm4
-	movdqa	%xmm0,16(%rax,%r9,1)
-.byte	0x48,0x8d,0xb6,0x40,0x00,0x00,0x00
-	movdqa	%xmm1,(%rax)
-	movdqa	%xmm0,32(%rax,%r9,1)
-	movdqa	%xmm2,16(%rax)
-	movdqa	%xmm0,48(%rax,%r9,1)
-	movdqa	%xmm3,32(%rax)
-	movdqa	%xmm4,48(%rax)
-	leaq	64(%rax),%rax
-	subq	$64,%r11
-	jnz	.Lmul_by_1
-
-.byte	102,72,15,110,207
-.byte	102,72,15,110,209
-.byte	0x67
-	movq	%rcx,%rbp
-.byte	102,73,15,110,218
-	leaq	OPENSSL_ia32cap_P(%rip),%r11
-	movl	8(%r11),%r11d
-	andl	$0x80108,%r11d
-	cmpl	$0x80108,%r11d
-	jne	.Lfrom_mont_nox
-
-	leaq	(%rax,%r9,1),%rdi
-	call	__bn_sqrx8x_reduction
-	call	__bn_postx4x_internal
-
-	pxor	%xmm0,%xmm0
-	leaq	48(%rsp),%rax
-	jmp	.Lfrom_mont_zero
-
-.align	32
-.Lfrom_mont_nox:
-	call	__bn_sqr8x_reduction
-	call	__bn_post4x_internal
-
-	pxor	%xmm0,%xmm0
-	leaq	48(%rsp),%rax
-	jmp	.Lfrom_mont_zero
-
-.align	32
-.Lfrom_mont_zero:
-	movq	40(%rsp),%rsi
-.cfi_def_cfa	%rsi,8
-	movdqa	%xmm0,0(%rax)
-	movdqa	%xmm0,16(%rax)
-	movdqa	%xmm0,32(%rax)
-	movdqa	%xmm0,48(%rax)
-	leaq	64(%rax),%rax
-	subq	$32,%r9
-	jnz	.Lfrom_mont_zero
-
-	movq	$1,%rax
-	movq	-48(%rsi),%r15
-.cfi_restore	%r15
-	movq	-40(%rsi),%r14
-.cfi_restore	%r14
-	movq	-32(%rsi),%r13
-.cfi_restore	%r13
-	movq	-24(%rsi),%r12
-.cfi_restore	%r12
-	movq	-16(%rsi),%rbp
-.cfi_restore	%rbp
-	movq	-8(%rsi),%rbx
-.cfi_restore	%rbx
-	leaq	(%rsi),%rsp
-.cfi_def_cfa_register	%rsp
-.Lfrom_epilogue:
-	.byte	0xf3,0xc3
-.cfi_endproc	
-.size	bn_from_mont8x,.-bn_from_mont8x
 .type	bn_mulx4x_mont_gather5,@function
 .align	32
 bn_mulx4x_mont_gather5:
diff --git a/sources.json b/sources.json
index cb63767..6b73d73 100644
--- a/sources.json
+++ b/sources.json
@@ -8,7 +8,6 @@
     "src/crypto/asn1/a_bool.c", 
     "src/crypto/asn1/a_d2i_fp.c", 
     "src/crypto/asn1/a_dup.c", 
-    "src/crypto/asn1/a_enum.c", 
     "src/crypto/asn1/a_gentm.c", 
     "src/crypto/asn1/a_i2d_fp.c", 
     "src/crypto/asn1/a_int.c", 
@@ -27,13 +26,13 @@
     "src/crypto/asn1/asn_pack.c", 
     "src/crypto/asn1/f_int.c", 
     "src/crypto/asn1/f_string.c", 
+    "src/crypto/asn1/posix_time.c", 
     "src/crypto/asn1/tasn_dec.c", 
     "src/crypto/asn1/tasn_enc.c", 
     "src/crypto/asn1/tasn_fre.c", 
     "src/crypto/asn1/tasn_new.c", 
     "src/crypto/asn1/tasn_typ.c", 
     "src/crypto/asn1/tasn_utl.c", 
-    "src/crypto/asn1/time_support.c", 
     "src/crypto/base64/base64.c", 
     "src/crypto/bio/bio.c", 
     "src/crypto/bio/bio_mem.c", 
@@ -57,27 +56,28 @@
     "src/crypto/chacha/chacha.c", 
     "src/crypto/cipher_extra/cipher_extra.c", 
     "src/crypto/cipher_extra/derive_key.c", 
-    "src/crypto/cipher_extra/e_aesccm.c", 
     "src/crypto/cipher_extra/e_aesctrhmac.c", 
     "src/crypto/cipher_extra/e_aesgcmsiv.c", 
     "src/crypto/cipher_extra/e_chacha20poly1305.c", 
+    "src/crypto/cipher_extra/e_des.c", 
     "src/crypto/cipher_extra/e_null.c", 
     "src/crypto/cipher_extra/e_rc2.c", 
     "src/crypto/cipher_extra/e_rc4.c", 
     "src/crypto/cipher_extra/e_tls.c", 
     "src/crypto/cipher_extra/tls_cbc.c", 
-    "src/crypto/cmac/cmac.c", 
     "src/crypto/conf/conf.c", 
-    "src/crypto/cpu-aarch64-fuchsia.c", 
-    "src/crypto/cpu-aarch64-linux.c", 
-    "src/crypto/cpu-aarch64-win.c", 
-    "src/crypto/cpu-arm-linux.c", 
-    "src/crypto/cpu-arm.c", 
-    "src/crypto/cpu-intel.c", 
-    "src/crypto/cpu-ppc64le.c", 
+    "src/crypto/cpu_aarch64_apple.c", 
+    "src/crypto/cpu_aarch64_fuchsia.c", 
+    "src/crypto/cpu_aarch64_linux.c", 
+    "src/crypto/cpu_aarch64_win.c", 
+    "src/crypto/cpu_arm.c", 
+    "src/crypto/cpu_arm_linux.c", 
+    "src/crypto/cpu_intel.c", 
+    "src/crypto/cpu_ppc64le.c", 
     "src/crypto/crypto.c", 
     "src/crypto/curve25519/curve25519.c", 
     "src/crypto/curve25519/spake25519.c", 
+    "src/crypto/des/des.c", 
     "src/crypto/dh_extra/dh_asn1.c", 
     "src/crypto/dh_extra/params.c", 
     "src/crypto/digest_extra/digest_extra.c", 
@@ -90,7 +90,6 @@
     "src/crypto/ecdsa_extra/ecdsa_asn1.c", 
     "src/crypto/engine/engine.c", 
     "src/crypto/err/err.c", 
-    "src/crypto/evp/digestsign.c", 
     "src/crypto/evp/evp.c", 
     "src/crypto/evp/evp_asn1.c", 
     "src/crypto/evp/evp_ctx.c", 
@@ -99,6 +98,7 @@
     "src/crypto/evp/p_ec_asn1.c", 
     "src/crypto/evp/p_ed25519.c", 
     "src/crypto/evp/p_ed25519_asn1.c", 
+    "src/crypto/evp/p_hkdf.c", 
     "src/crypto/evp/p_rsa.c", 
     "src/crypto/evp/p_rsa_asn1.c", 
     "src/crypto/evp/p_x25519.c", 
@@ -204,7 +204,6 @@
     "src/crypto/x509/x_x509a.c", 
     "src/crypto/x509v3/pcy_cache.c", 
     "src/crypto/x509v3/pcy_data.c", 
-    "src/crypto/x509v3/pcy_lib.c", 
     "src/crypto/x509v3/pcy_map.c", 
     "src/crypto/x509v3/pcy_node.c", 
     "src/crypto/x509v3/pcy_tree.c", 
@@ -234,6 +233,70 @@
     "src/crypto/x509v3/v3_skey.c", 
     "src/crypto/x509v3/v3_utl.c"
   ], 
+  "crypto_apple_aarch64": [
+    "apple-aarch64/crypto/chacha/chacha-armv8.S", 
+    "apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", 
+    "apple-aarch64/crypto/fipsmodule/aesv8-armx64.S", 
+    "apple-aarch64/crypto/fipsmodule/armv8-mont.S", 
+    "apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", 
+    "apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S", 
+    "apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S", 
+    "apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", 
+    "apple-aarch64/crypto/fipsmodule/sha1-armv8.S", 
+    "apple-aarch64/crypto/fipsmodule/sha256-armv8.S", 
+    "apple-aarch64/crypto/fipsmodule/sha512-armv8.S", 
+    "apple-aarch64/crypto/fipsmodule/vpaes-armv8.S", 
+    "apple-aarch64/crypto/test/trampoline-armv8.S"
+  ], 
+  "crypto_apple_arm": [
+    "apple-arm/crypto/chacha/chacha-armv4.S", 
+    "apple-arm/crypto/fipsmodule/aesv8-armx32.S", 
+    "apple-arm/crypto/fipsmodule/armv4-mont.S", 
+    "apple-arm/crypto/fipsmodule/bsaes-armv7.S", 
+    "apple-arm/crypto/fipsmodule/ghash-armv4.S", 
+    "apple-arm/crypto/fipsmodule/ghashv8-armx32.S", 
+    "apple-arm/crypto/fipsmodule/sha1-armv4-large.S", 
+    "apple-arm/crypto/fipsmodule/sha256-armv4.S", 
+    "apple-arm/crypto/fipsmodule/sha512-armv4.S", 
+    "apple-arm/crypto/fipsmodule/vpaes-armv7.S", 
+    "apple-arm/crypto/test/trampoline-armv4.S"
+  ], 
+  "crypto_apple_x86": [
+    "apple-x86/crypto/chacha/chacha-x86.S", 
+    "apple-x86/crypto/fipsmodule/aesni-x86.S", 
+    "apple-x86/crypto/fipsmodule/bn-586.S", 
+    "apple-x86/crypto/fipsmodule/co-586.S", 
+    "apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S", 
+    "apple-x86/crypto/fipsmodule/ghash-x86.S", 
+    "apple-x86/crypto/fipsmodule/md5-586.S", 
+    "apple-x86/crypto/fipsmodule/sha1-586.S", 
+    "apple-x86/crypto/fipsmodule/sha256-586.S", 
+    "apple-x86/crypto/fipsmodule/sha512-586.S", 
+    "apple-x86/crypto/fipsmodule/vpaes-x86.S", 
+    "apple-x86/crypto/fipsmodule/x86-mont.S", 
+    "apple-x86/crypto/test/trampoline-x86.S"
+  ], 
+  "crypto_apple_x86_64": [
+    "apple-x86_64/crypto/chacha/chacha-x86_64.S", 
+    "apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S", 
+    "apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/aesni-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/ghash-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/md5-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S", 
+    "apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S", 
+    "apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/rsaz-avx2.S", 
+    "apple-x86_64/crypto/fipsmodule/sha1-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/sha256-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/sha512-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S", 
+    "apple-x86_64/crypto/fipsmodule/x86_64-mont.S", 
+    "apple-x86_64/crypto/fipsmodule/x86_64-mont5.S", 
+    "apple-x86_64/crypto/test/trampoline-x86_64.S"
+  ], 
   "crypto_headers": [
     "src/include/openssl/aead.h", 
     "src/include/openssl/aes.h", 
@@ -257,6 +320,7 @@
     "src/include/openssl/conf.h", 
     "src/include/openssl/cpu.h", 
     "src/include/openssl/crypto.h", 
+    "src/include/openssl/ctrdrbg.h", 
     "src/include/openssl/curve25519.h", 
     "src/include/openssl/des.h", 
     "src/include/openssl/dh.h", 
@@ -277,6 +341,7 @@
     "src/include/openssl/hpke.h", 
     "src/include/openssl/hrss.h", 
     "src/include/openssl/is_boringssl.h", 
+    "src/include/openssl/kdf.h", 
     "src/include/openssl/lhash.h", 
     "src/include/openssl/md4.h", 
     "src/include/openssl/md5.h", 
@@ -299,6 +364,7 @@
     "src/include/openssl/ripemd.h", 
     "src/include/openssl/rsa.h", 
     "src/include/openssl/safestack.h", 
+    "src/include/openssl/service_indicator.h", 
     "src/include/openssl/sha.h", 
     "src/include/openssl/siphash.h", 
     "src/include/openssl/span.h", 
@@ -311,7 +377,6 @@
     "src/include/openssl/x509v3.h"
   ], 
   "crypto_internal_headers": [
-    "src/crypto/asn1/charmap.h", 
     "src/crypto/asn1/internal.h", 
     "src/crypto/bio/internal.h", 
     "src/crypto/bytestring/internal.h", 
@@ -319,9 +384,10 @@
     "src/crypto/cipher_extra/internal.h", 
     "src/crypto/conf/conf_def.h", 
     "src/crypto/conf/internal.h", 
-    "src/crypto/cpu-arm-linux.h", 
+    "src/crypto/cpu_arm_linux.h", 
     "src/crypto/curve25519/curve25519_tables.h", 
     "src/crypto/curve25519/internal.h", 
+    "src/crypto/des/internal.h", 
     "src/crypto/dsa/internal.h", 
     "src/crypto/ec_extra/internal.h", 
     "src/crypto/err/internal.h", 
@@ -331,12 +397,12 @@
     "src/crypto/fipsmodule/bn/rsaz_exp.h", 
     "src/crypto/fipsmodule/cipher/internal.h", 
     "src/crypto/fipsmodule/delocate.h", 
-    "src/crypto/fipsmodule/des/internal.h", 
+    "src/crypto/fipsmodule/dh/internal.h", 
     "src/crypto/fipsmodule/digest/internal.h", 
     "src/crypto/fipsmodule/digest/md32_common.h", 
     "src/crypto/fipsmodule/ec/internal.h", 
-    "src/crypto/fipsmodule/ec/p256-x86_64-table.h", 
-    "src/crypto/fipsmodule/ec/p256-x86_64.h", 
+    "src/crypto/fipsmodule/ec/p256-nistz-table.h", 
+    "src/crypto/fipsmodule/ec/p256-nistz.h", 
     "src/crypto/fipsmodule/ec/p256_table.h", 
     "src/crypto/fipsmodule/ecdsa/internal.h", 
     "src/crypto/fipsmodule/md5/internal.h", 
@@ -345,6 +411,7 @@
     "src/crypto/fipsmodule/rand/getrandom_fillin.h", 
     "src/crypto/fipsmodule/rand/internal.h", 
     "src/crypto/fipsmodule/rsa/internal.h", 
+    "src/crypto/fipsmodule/service_indicator/internal.h", 
     "src/crypto/fipsmodule/sha/internal.h", 
     "src/crypto/fipsmodule/tls/internal.h", 
     "src/crypto/hrss/internal.h", 
@@ -364,37 +431,15 @@
     "src/third_party/fiat/p256_32.h", 
     "src/third_party/fiat/p256_64.h"
   ], 
-  "crypto_ios_aarch64": [
-    "ios-aarch64/crypto/chacha/chacha-armv8.S", 
-    "ios-aarch64/crypto/fipsmodule/aesv8-armx64.S", 
-    "ios-aarch64/crypto/fipsmodule/armv8-mont.S", 
-    "ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", 
-    "ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S", 
-    "ios-aarch64/crypto/fipsmodule/sha1-armv8.S", 
-    "ios-aarch64/crypto/fipsmodule/sha256-armv8.S", 
-    "ios-aarch64/crypto/fipsmodule/sha512-armv8.S", 
-    "ios-aarch64/crypto/fipsmodule/vpaes-armv8.S", 
-    "ios-aarch64/crypto/test/trampoline-armv8.S"
-  ], 
-  "crypto_ios_arm": [
-    "ios-arm/crypto/chacha/chacha-armv4.S", 
-    "ios-arm/crypto/fipsmodule/aesv8-armx32.S", 
-    "ios-arm/crypto/fipsmodule/armv4-mont.S", 
-    "ios-arm/crypto/fipsmodule/bsaes-armv7.S", 
-    "ios-arm/crypto/fipsmodule/ghash-armv4.S", 
-    "ios-arm/crypto/fipsmodule/ghashv8-armx32.S", 
-    "ios-arm/crypto/fipsmodule/sha1-armv4-large.S", 
-    "ios-arm/crypto/fipsmodule/sha256-armv4.S", 
-    "ios-arm/crypto/fipsmodule/sha512-armv4.S", 
-    "ios-arm/crypto/fipsmodule/vpaes-armv7.S", 
-    "ios-arm/crypto/test/trampoline-armv4.S"
-  ], 
   "crypto_linux_aarch64": [
     "linux-aarch64/crypto/chacha/chacha-armv8.S", 
+    "linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", 
     "linux-aarch64/crypto/fipsmodule/aesv8-armx64.S", 
     "linux-aarch64/crypto/fipsmodule/armv8-mont.S", 
     "linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", 
     "linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S", 
+    "linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S", 
+    "linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", 
     "linux-aarch64/crypto/fipsmodule/sha1-armv8.S", 
     "linux-aarch64/crypto/fipsmodule/sha256-armv8.S", 
     "linux-aarch64/crypto/fipsmodule/sha512-armv8.S", 
@@ -458,42 +503,6 @@
     "linux-x86_64/crypto/test/trampoline-x86_64.S", 
     "src/crypto/hrss/asm/poly_rq_mul.S"
   ], 
-  "crypto_mac_x86": [
-    "mac-x86/crypto/chacha/chacha-x86.S", 
-    "mac-x86/crypto/fipsmodule/aesni-x86.S", 
-    "mac-x86/crypto/fipsmodule/bn-586.S", 
-    "mac-x86/crypto/fipsmodule/co-586.S", 
-    "mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S", 
-    "mac-x86/crypto/fipsmodule/ghash-x86.S", 
-    "mac-x86/crypto/fipsmodule/md5-586.S", 
-    "mac-x86/crypto/fipsmodule/sha1-586.S", 
-    "mac-x86/crypto/fipsmodule/sha256-586.S", 
-    "mac-x86/crypto/fipsmodule/sha512-586.S", 
-    "mac-x86/crypto/fipsmodule/vpaes-x86.S", 
-    "mac-x86/crypto/fipsmodule/x86-mont.S", 
-    "mac-x86/crypto/test/trampoline-x86.S"
-  ], 
-  "crypto_mac_x86_64": [
-    "mac-x86_64/crypto/chacha/chacha-x86_64.S", 
-    "mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S", 
-    "mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/aesni-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/ghash-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/md5-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S", 
-    "mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S", 
-    "mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/rsaz-avx2.S", 
-    "mac-x86_64/crypto/fipsmodule/sha1-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/sha256-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/sha512-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S", 
-    "mac-x86_64/crypto/fipsmodule/x86_64-mont.S", 
-    "mac-x86_64/crypto/fipsmodule/x86_64-mont5.S", 
-    "mac-x86_64/crypto/test/trampoline-x86_64.S"
-  ], 
   "crypto_test": [
     "crypto_test_data.cc", 
     "src/crypto/abi_self_test.cc", 
@@ -506,11 +515,10 @@
     "src/crypto/chacha/chacha_test.cc", 
     "src/crypto/cipher_extra/aead_test.cc", 
     "src/crypto/cipher_extra/cipher_test.cc", 
-    "src/crypto/cmac/cmac_test.cc", 
     "src/crypto/compiler_test.cc", 
     "src/crypto/conf/conf_test.cc", 
     "src/crypto/constant_time_test.cc", 
-    "src/crypto/cpu-arm-linux_test.cc", 
+    "src/crypto/cpu_arm_linux_test.cc", 
     "src/crypto/crypto_test.cc", 
     "src/crypto/curve25519/ed25519_test.cc", 
     "src/crypto/curve25519/spake25519_test.cc", 
@@ -526,13 +534,15 @@
     "src/crypto/evp/scrypt_test.cc", 
     "src/crypto/fipsmodule/aes/aes_test.cc", 
     "src/crypto/fipsmodule/bn/bn_test.cc", 
+    "src/crypto/fipsmodule/cmac/cmac_test.cc", 
     "src/crypto/fipsmodule/ec/ec_test.cc", 
-    "src/crypto/fipsmodule/ec/p256-x86_64_test.cc", 
+    "src/crypto/fipsmodule/ec/p256-nistz_test.cc", 
     "src/crypto/fipsmodule/ecdsa/ecdsa_test.cc", 
     "src/crypto/fipsmodule/md5/md5_test.cc", 
     "src/crypto/fipsmodule/modes/gcm_test.cc", 
     "src/crypto/fipsmodule/rand/ctrdrbg_test.cc", 
     "src/crypto/fipsmodule/rand/fork_detect_test.cc", 
+    "src/crypto/fipsmodule/service_indicator/service_indicator_test.cc", 
     "src/crypto/fipsmodule/sha/sha_test.cc", 
     "src/crypto/hkdf/hkdf_test.cc", 
     "src/crypto/hmac_extra/hmac_test.cc", 
@@ -560,8 +570,7 @@
     "src/crypto/trust_token/trust_token_test.cc", 
     "src/crypto/x509/x509_test.cc", 
     "src/crypto/x509/x509_time_test.cc", 
-    "src/crypto/x509v3/tab_test.cc", 
-    "src/crypto/x509v3/v3name_test.cc"
+    "src/crypto/x509v3/tab_test.cc"
   ], 
   "crypto_test_data": [
     "src/crypto/blake2/blake2b256_tests.txt", 
@@ -569,6 +578,7 @@
     "src/crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt", 
     "src/crypto/cipher_extra/test/aes_128_ccm_bluetooth_8_tests.txt", 
     "src/crypto/cipher_extra/test/aes_128_ccm_bluetooth_tests.txt", 
+    "src/crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt", 
     "src/crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt", 
     "src/crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt", 
     "src/crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", 
@@ -595,10 +605,6 @@
     "src/crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt", 
     "src/crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt", 
     "src/crypto/cipher_extra/test/xchacha20_poly1305_tests.txt", 
-    "src/crypto/cmac/cavp_3des_cmac_tests.txt", 
-    "src/crypto/cmac/cavp_aes128_cmac_tests.txt", 
-    "src/crypto/cmac/cavp_aes192_cmac_tests.txt", 
-    "src/crypto/cmac/cavp_aes256_cmac_tests.txt", 
     "src/crypto/curve25519/ed25519_tests.txt", 
     "src/crypto/ecdh_extra/ecdh_tests.txt", 
     "src/crypto/evp/evp_tests.txt", 
@@ -606,8 +612,12 @@
     "src/crypto/fipsmodule/aes/aes_tests.txt", 
     "src/crypto/fipsmodule/bn/bn_tests.txt", 
     "src/crypto/fipsmodule/bn/miller_rabin_tests.txt", 
+    "src/crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt", 
+    "src/crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt", 
+    "src/crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt", 
+    "src/crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt", 
     "src/crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt", 
-    "src/crypto/fipsmodule/ec/p256-x86_64_tests.txt", 
+    "src/crypto/fipsmodule/ec/p256-nistz_tests.txt", 
     "src/crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt", 
     "src/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", 
     "src/crypto/fipsmodule/modes/gcm_tests.txt", 
@@ -659,6 +669,21 @@
     "src/crypto/x509/test/many_names1.pem", 
     "src/crypto/x509/test/many_names2.pem", 
     "src/crypto/x509/test/many_names3.pem", 
+    "src/crypto/x509/test/pss_sha1.pem", 
+    "src/crypto/x509/test/pss_sha1_explicit.pem", 
+    "src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem", 
+    "src/crypto/x509/test/pss_sha224.pem", 
+    "src/crypto/x509/test/pss_sha256.pem", 
+    "src/crypto/x509/test/pss_sha256_explicit_trailer.pem", 
+    "src/crypto/x509/test/pss_sha256_mgf1_sha384.pem", 
+    "src/crypto/x509/test/pss_sha256_mgf1_syntax_error.pem", 
+    "src/crypto/x509/test/pss_sha256_omit_nulls.pem", 
+    "src/crypto/x509/test/pss_sha256_salt31.pem", 
+    "src/crypto/x509/test/pss_sha256_salt_overflow.pem", 
+    "src/crypto/x509/test/pss_sha256_unknown_mgf.pem", 
+    "src/crypto/x509/test/pss_sha256_wrong_trailer.pem", 
+    "src/crypto/x509/test/pss_sha384.pem", 
+    "src/crypto/x509/test/pss_sha512.pem", 
     "src/crypto/x509/test/some_names1.pem", 
     "src/crypto/x509/test/some_names2.pem", 
     "src/crypto/x509/test/some_names3.pem", 
@@ -744,10 +769,13 @@
   ], 
   "crypto_win_aarch64": [
     "win-aarch64/crypto/chacha/chacha-armv8.S", 
+    "win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", 
     "win-aarch64/crypto/fipsmodule/aesv8-armx64.S", 
     "win-aarch64/crypto/fipsmodule/armv8-mont.S", 
     "win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", 
     "win-aarch64/crypto/fipsmodule/ghashv8-armx64.S", 
+    "win-aarch64/crypto/fipsmodule/p256-armv8-asm.S", 
+    "win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", 
     "win-aarch64/crypto/fipsmodule/sha1-armv8.S", 
     "win-aarch64/crypto/fipsmodule/sha256-armv8.S", 
     "win-aarch64/crypto/fipsmodule/sha512-armv8.S", 
@@ -819,19 +847,20 @@
     "src/crypto/fipsmodule/cipher/aead.c", 
     "src/crypto/fipsmodule/cipher/cipher.c", 
     "src/crypto/fipsmodule/cipher/e_aes.c", 
-    "src/crypto/fipsmodule/cipher/e_des.c", 
-    "src/crypto/fipsmodule/des/des.c", 
+    "src/crypto/fipsmodule/cipher/e_aesccm.c", 
+    "src/crypto/fipsmodule/cmac/cmac.c", 
     "src/crypto/fipsmodule/dh/check.c", 
     "src/crypto/fipsmodule/dh/dh.c", 
     "src/crypto/fipsmodule/digest/digest.c", 
     "src/crypto/fipsmodule/digest/digests.c", 
+    "src/crypto/fipsmodule/digestsign/digestsign.c", 
     "src/crypto/fipsmodule/ec/ec.c", 
     "src/crypto/fipsmodule/ec/ec_key.c", 
     "src/crypto/fipsmodule/ec/ec_montgomery.c", 
     "src/crypto/fipsmodule/ec/felem.c", 
     "src/crypto/fipsmodule/ec/oct.c", 
     "src/crypto/fipsmodule/ec/p224-64.c", 
-    "src/crypto/fipsmodule/ec/p256-x86_64.c", 
+    "src/crypto/fipsmodule/ec/p256-nistz.c", 
     "src/crypto/fipsmodule/ec/p256.c", 
     "src/crypto/fipsmodule/ec/scalar.c", 
     "src/crypto/fipsmodule/ec/simple.c", 
@@ -860,6 +889,7 @@
     "src/crypto/fipsmodule/rsa/rsa_impl.c", 
     "src/crypto/fipsmodule/self_check/fips.c", 
     "src/crypto/fipsmodule/self_check/self_check.c", 
+    "src/crypto/fipsmodule/service_indicator/service_indicator.c", 
     "src/crypto/fipsmodule/sha/sha1-altivec.c", 
     "src/crypto/fipsmodule/sha/sha1.c", 
     "src/crypto/fipsmodule/sha/sha256.c", 
@@ -873,6 +903,7 @@
     "src/fuzz/cert.cc", 
     "src/fuzz/client.cc", 
     "src/fuzz/decode_client_hello_inner.cc", 
+    "src/fuzz/der_roundtrip.cc", 
     "src/fuzz/dtls_client.cc", 
     "src/fuzz/dtls_server.cc", 
     "src/fuzz/pkcs12.cc", 
diff --git a/src/.clang-format b/src/.clang-format
index 0098935..0ab585e 100644
--- a/src/.clang-format
+++ b/src/.clang-format
@@ -38,6 +38,7 @@
   - "IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname"
   - "IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname"
   - "IMPLEMENT_ASN1_DUP_FUNCTION"
+  - "IMPLEMENT_ASN1_DUP_FUNCTION_const"
   - "IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname"
   - "IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname"
   - "IMPLEMENT_ASN1_FUNCTIONS"
@@ -46,6 +47,7 @@
   - "IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name"
   - "IMPLEMENT_ASN1_FUNCTIONS_fname"
   - "IMPLEMENT_ASN1_FUNCTIONS_name"
+  - "IMPLEMENT_ASN1_TYPE_ex"
   - "IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS"
   - "IMPLEMENT_PEM_read"
   - "IMPLEMENT_PEM_read_bio"
@@ -65,3 +67,13 @@
   - "IMPLEMENT_PEM_write_const"
   - "IMPLEMENT_PEM_write_fp"
   - "IMPLEMENT_PEM_write_fp_const"
+  - "ASN1_ADB_END"
+  - "ASN1_CHOICE_END"
+  - "ASN1_ITEM_TEMPLATE_END"
+  - "ASN1_SEQUENCE_END"
+  - "ASN1_SEQUENCE_END_cb"
+  - "ASN1_SEQUENCE_END_enc"
+  - "ASN1_SEQUENCE_END_ref"
+  # This isn't quite right, but it causes clang-format to do a slightly better
+  # job with this macro.
+  - "ASN1_EX_TEMPLATE_TYPE"
diff --git a/src/.gitignore b/src/.gitignore
index 08d99a1..ab8580c 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -7,13 +7,14 @@
 *.swo
 doc/*.html
 doc/doc.css
+rust/Cargo.lock
+rust/target
 
 util/bot/android_ndk
 util/bot/android_sdk/public
 util/bot/cmake-linux64
 util/bot/cmake-mac
 util/bot/cmake-win32
-util/bot/cmake-win32.zip
 util/bot/golang
 util/bot/libFuzzer
 util/bot/libcxx
@@ -23,7 +24,7 @@
 util/bot/perl-win32
 util/bot/perl-win32.zip
 util/bot/sde-linux64
-util/bot/sde-linux64.tar.bz2
+util/bot/sde-linux64.tar.xz
 util/bot/sde-win32
-util/bot/sde-win32.tar.bz2
+util/bot/sde-win32.tar.xz
 util/bot/win_toolchain.json
diff --git a/src/BUILDING.md b/src/BUILDING.md
index 08f004c..73bc29c 100644
--- a/src/BUILDING.md
+++ b/src/BUILDING.md
@@ -10,7 +10,7 @@
 [Abseil guidelines](https://abseil.io/about/compatibility). If in doubt, use the
 most recent stable version of each tool.
 
-  * [CMake](https://cmake.org/download/) 3.5 or later is required.
+  * [CMake](https://cmake.org/download/) 3.8 or later is required.
 
   * A recent version of Perl is required. On Windows,
     [Active State Perl](http://www.activestate.com/activeperl/) has been
@@ -30,12 +30,11 @@
     by CMake, it may be configured explicitly by setting
     `CMAKE_ASM_NASM_COMPILER`.
 
-  * C and C++ compilers with C++11 support are required. On Windows, MSVC 14
-    (Visual Studio 2015) or later with Platform SDK 8.1 or later are supported,
-    but newer versions are recommended. We will drop support for Visual Studio
-    2015 in March 2022, five years after the release of Visual Studio 2017.
-    Recent versions of GCC (6.1+) and Clang should work on non-Windows
-    platforms, and maybe on Windows too.
+  * C and C++ compilers with C++14 support are required. If using a C compiler
+    other than MSVC, C11 support is also requried. On Windows, MSVC from
+    Visual Studio 2017 or later with Platform SDK 8.1 or later are supported,
+    but newer versions are recommended. Recent versions of GCC (6.1+) and Clang
+    should work on non-Windows platforms, and maybe on Windows too.
 
   * The most recent stable version of [Go](https://golang.org/dl/) is required.
     Note Go is exempt from the five year support window. If not found by CMake,
@@ -163,22 +162,19 @@
     don't have steps for assembling the assembly language source files, so they
     currently cannot be used to build BoringSSL.
 
-## Embedded ARM
+## ARM CPU Capabilities
 
-ARM, unlike Intel, does not have an instruction that allows applications to
-discover the capabilities of the processor. Instead, the capability information
-has to be provided by the operating system somehow.
+ARM, unlike Intel, does not have a userspace instruction that allows
+applications to discover the capabilities of the processor. Instead, the
+capability information has to be provided by a combination of compile-time
+information and the operating system.
 
-By default, on Linux-based systems, BoringSSL will try to use `getauxval` and
-`/proc` to discover the capabilities. But some environments don't support that
-sort of thing and, for them, it's possible to configure the CPU capabilities at
-compile time.
-
-On iOS or builds which define `OPENSSL_STATIC_ARMCAP`, features will be
-determined based on the `__ARM_NEON__` and `__ARM_FEATURE_CRYPTO` preprocessor
-symbols reported by the compiler. These values are usually controlled by the
-`-march` flag. You can also define any of the following to enable the
-corresponding ARM feature.
+BoringSSL determines capabilities at compile-time based on `__ARM_NEON`,
+`__ARM_FEATURE_AES`, and other preprocessor symbols defined in
+[Arm C Language Extensions (ACLE)](https://developer.arm.com/architectures/system-architectures/software-standards/acle).
+These values are usually controlled by the `-march` flag. You can also define
+any of the following to enable the corresponding ARM feature, but using the ACLE
+symbols via `-march` is recommended.
 
   * `OPENSSL_STATIC_ARMCAP_NEON`
   * `OPENSSL_STATIC_ARMCAP_AES`
@@ -186,8 +182,16 @@
   * `OPENSSL_STATIC_ARMCAP_SHA256`
   * `OPENSSL_STATIC_ARMCAP_PMULL`
 
-Note that if a feature is enabled in this way, but not actually supported at
-run-time, BoringSSL will likely crash.
+The resulting binary will assume all such features are always present. This can
+reduce code size, by allowing the compiler to omit fallbacks. However, if the
+feature is not actually supported at runtime, BoringSSL will likely crash.
+
+BoringSSL will additionally query the operating system at runtime for additional
+features, e.g. with `getauxval` on Linux. This allows a single binary to use
+newer instructions when present, but still function on CPUs without them. But
+some environments don't support runtime queries. If building for those, define
+`OPENSSL_STATIC_ARMCAP` to limit BoringSSL to compile-time capabilities. If not
+defined, the target operating system must be known to BoringSSL.
 
 ## Binary Size
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ce74106..0864958 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,8 +1,14 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.8)
 
 # Defer enabling C and CXX languages.
 project(BoringSSL NONE)
 
+# Don't install BoringSSL to system directories by default; it has no stable
+# ABI. Instead, default to an "install" directory under the source.
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "" FORCE)
+endif()
+
 if(WIN32)
   # On Windows, prefer cl over gcc if both are available. By default most of
   # the CMake generators prefer gcc, even on Windows.
@@ -14,6 +20,8 @@
 enable_language(C)
 enable_language(CXX)
 
+include(GNUInstallDirs)
+
 # This is a dummy target which all other targets depend on (manually - see other
 # CMakeLists.txt files). This gives us a hook to add any targets which need to
 # run before all other targets.
@@ -114,6 +122,13 @@
   set(EMSCRIPTEN 1)
 endif()
 
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+if(MSVC AND NOT CLANG)
+  set(CMAKE_C_STANDARD 11)
+  set(CMAKE_C_STANDARD_REQUIRED ON)
+endif()
+
 if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
   # Note clang-cl is odd and sets both CLANG and MSVC. We base our configuration
   # primarily on our normal Clang one.
@@ -145,21 +160,19 @@
     set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wno-free-nonheap-object")
   endif()
 
-  if(CLANG OR NOT "7.0.0" VERSION_GREATER CMAKE_C_COMPILER_VERSION)
+  if(CLANG OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0")
     set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wimplicit-fallthrough")
   endif()
 
+  if(CMAKE_COMPILER_IS_GNUCXX)
+    set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wformat-signedness")
+  endif()
+
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_CXX_FLAGS} -Wmissing-prototypes -Wold-style-definition -Wstrict-prototypes")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_CXX_FLAGS} -Wmissing-declarations")
 
-  if(NOT MSVC)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-    if(APPLE)
-      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
-    endif()
-    if(NOT BORINGSSL_ALLOW_CXX_RUNTIME)
-      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
-    endif()
+  if(NOT MSVC AND NOT BORINGSSL_ALLOW_CXX_RUNTIME)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
   endif()
 
   # In GCC, -Wmissing-declarations is the C++ spelling of -Wmissing-prototypes
@@ -249,12 +262,11 @@
   add_definitions("-D_STL_EXTRA_DISABLED_WARNINGS=4774 4987")
 endif()
 
-if(CMAKE_COMPILER_IS_GNUCXX)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
-endif()
-
-# pthread_rwlock_t requires a feature flag.
-if(NOT WIN32)
+# pthread_rwlock_t on Linux requires a feature flag. We limit this to Linux
+# because, on Apple platforms, it instead disables APIs we use. See compat(5)
+# and sys/cdefs.h. Reportedly, FreeBSD also breaks when this is set. See
+# https://crbug.com/boringssl/471.
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700")
 endif()
 
@@ -394,10 +406,13 @@
 
 function(go_executable dest package)
   set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go")
-  if(CMAKE_VERSION VERSION_LESS "3.7" OR NOT CMAKE_GENERATOR STREQUAL "Ninja")
-    # The DEPFILE parameter to add_custom_command is new as of CMake 3.7 and
-    # only works with Ninja. Query the sources at configure time. Additionally,
-    # everything depends on go.mod. That affects what external packages to use.
+  if(NOT CMAKE_GENERATOR STREQUAL "Ninja")
+    # The DEPFILE parameter to add_custom_command only works with Ninja. Query
+    # the sources at configure time. Additionally, everything depends on go.mod.
+    # That affects what external packages to use.
+    #
+    # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting
+    # 3.21, it works with Visual Studio and Xcode too.
     execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake
                             -pkg ${package}
                     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
@@ -482,6 +497,8 @@
   set(ARCH "generic")
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
   set(ARCH "ppc64le")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64")
+  set(ARCH "riscv64")
 else()
   message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR})
 endif()
@@ -534,6 +551,7 @@
   set_target_properties(libcxxabi PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes -Wno-implicit-fallthrough")
   # libc++abi depends on libc++ internal headers.
   set_property(TARGET libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/util/bot/libcxx/src")
+  install(TARGETS libcxxabi EXPORT OpenSSLTargets)
 
   add_library(libcxx ${LIBCXX_SOURCES})
   if(ASAN OR MSAN OR TSAN)
@@ -549,6 +567,7 @@
     -DLIBCXX_BUILDING_LIBCXXABI
   )
   target_link_libraries(libcxx libcxxabi)
+  install(TARGETS libcxx EXPORT OpenSSLTargets DESTINATION ${CMAKE_INSTALL_LIBDIR})
 endif()
 
 # Add minimal googletest targets. The provided one has many side-effects, and
@@ -586,7 +605,7 @@
 add_subdirectory(ssl)
 add_subdirectory(ssl/test)
 add_subdirectory(tool)
-add_subdirectory(util/fipstools/cavp)
+add_subdirectory(util/fipstools)
 add_subdirectory(util/fipstools/acvp/modulewrapper)
 add_subdirectory(decrepit)
 
@@ -602,7 +621,16 @@
   add_subdirectory(fuzz)
 endif()
 
-if(UNIX AND NOT APPLE AND NOT ANDROID)
+if(RUST_BINDINGS)
+  find_program(BINDGEN_EXECUTABLE bindgen)
+  if(NOT BINDGEN_EXECUTABLE)
+    message(FATAL_ERROR "Could not find bindgen but was asked to generate Rust bindings.")
+  else()
+    add_subdirectory(rust)
+  endif()
+endif()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
   set(HANDSHAKER_ARGS "-handshaker-path" $<TARGET_FILE:handshaker>)
 endif()
 
@@ -640,3 +668,12 @@
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
     DEPENDS all_tests bssl_shim handshaker fips_specific_tests_if_any
     USES_TERMINAL)
+
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+install(EXPORT OpenSSLTargets
+  FILE OpenSSLTargets.cmake
+  NAMESPACE OpenSSL::
+  DESTINATION lib/cmake/OpenSSL
+)
+install(FILES OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL)
diff --git a/src/CONTRIBUTING.md b/src/CONTRIBUTING.md
index 8907cc9..5e161e8 100644
--- a/src/CONTRIBUTING.md
+++ b/src/CONTRIBUTING.md
@@ -22,7 +22,10 @@
 If you have not done so on this machine, you will need to set up a password for
 Gerrit. Sign in with a Google account, visit
 [this link](https://boringssl.googlesource.com/), and click the "Generate
-Password" link in the top right. You will also need to prepare your checkout to
+Password" link in the top right. You must also have a Gerrit account associated with
+your Google account.  To do this visit the [Gerrit review server](https://boringssl-review.googlesource.com)
+and click "Sign in" (top right).
+You will also need to prepare your checkout to
 [add Change-Ids](https://gerrit-review.googlesource.com/Documentation/cmd-hook-commit-msg.html)
 on commit. Run:
 
diff --git a/src/OpenSSLConfig.cmake b/src/OpenSSLConfig.cmake
new file mode 100644
index 0000000..3ebaf19
--- /dev/null
+++ b/src/OpenSSLConfig.cmake
@@ -0,0 +1,32 @@
+include(${CMAKE_CURRENT_LIST_DIR}/OpenSSLTargets.cmake)
+
+# Recursively collect dependency locations for the imported targets.
+macro(_openssl_config_libraries libraries target)
+  get_property(_DEPS TARGET ${target} PROPERTY INTERFACE_LINK_LIBRARIES)
+  foreach(_DEP ${_DEPS})
+    if(TARGET ${_DEP})
+      _openssl_config_libraries(${libraries} ${_DEP})
+    else()
+      list(APPEND ${libraries} ${_DEP})
+    endif()
+  endforeach()
+  get_property(_LOC TARGET ${target} PROPERTY LOCATION)
+  list(APPEND ${libraries} ${_LOC})
+endmacro()
+
+set(OPENSSL_FOUND YES)
+get_property(OPENSSL_INCLUDE_DIR TARGET OpenSSL::SSL PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+get_property(OPENSSL_CRYPTO_LIBRARY TARGET OpenSSL::Crypto PROPERTY LOCATION)
+_openssl_config_libraries(OPENSSL_CRYPTO_LIBRARIES OpenSSL::Crypto)
+list(REMOVE_DUPLICATES OPENSSL_CRYPTO_LIBRARIES)
+
+get_property(OPENSSL_SSL_LIBRARY TARGET OpenSSL::Crypto PROPERTY LOCATION)
+_openssl_config_libraries(OPENSSL_SSL_LIBRARIES OpenSSL::SSL)
+list(REMOVE_DUPLICATES OPENSSL_SSL_LIBRARIES)
+
+set(OPENSSL_LIBRARIES ${OPENSSL_CRYPTO_LIBRARIES} ${OPENSSL_SSL_LIBRARIES})
+list(REMOVE_DUPLICATES OPENSSL_LIBRARIES)
+
+set(_DEP)
+set(_DEPS)
+set(_LOC)
diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt
index 9c724b7..d769efd 100644
--- a/src/crypto/CMakeLists.txt
+++ b/src/crypto/CMakeLists.txt
@@ -121,6 +121,7 @@
 
     chacha/chacha-armv8.${ASM_EXT}
     test/trampoline-armv8.${ASM_EXT}
+    cipher_extra/chacha20_poly1305_armv8.${ASM_EXT}
   )
 endif()
 
@@ -159,6 +160,7 @@
 perlasm(chacha/chacha-x86_64.${ASM_EXT} chacha/asm/chacha-x86_64.pl)
 perlasm(cipher_extra/aes128gcmsiv-x86_64.${ASM_EXT} cipher_extra/asm/aes128gcmsiv-x86_64.pl)
 perlasm(cipher_extra/chacha20_poly1305_x86_64.${ASM_EXT} cipher_extra/asm/chacha20_poly1305_x86_64.pl)
+perlasm(cipher_extra/chacha20_poly1305_armv8.${ASM_EXT} cipher_extra/asm/chacha20_poly1305_armv8.pl)
 perlasm(test/trampoline-armv4.${ASM_EXT} test/asm/trampoline-armv4.pl)
 perlasm(test/trampoline-armv8.${ASM_EXT} test/asm/trampoline-armv8.pl)
 perlasm(test/trampoline-ppc.${ASM_EXT} test/asm/trampoline-ppc.pl)
@@ -203,7 +205,6 @@
   asn1/a_bool.c
   asn1/a_d2i_fp.c
   asn1/a_dup.c
-  asn1/a_enum.c
   asn1/a_gentm.c
   asn1/a_i2d_fp.c
   asn1/a_int.c
@@ -228,7 +229,7 @@
   asn1/tasn_new.c
   asn1/tasn_typ.c
   asn1/tasn_utl.c
-  asn1/time_support.c
+  asn1/posix_time.c
   base64/base64.c
   bio/bio.c
   bio/bio_mem.c
@@ -252,27 +253,28 @@
   chacha/chacha.c
   cipher_extra/cipher_extra.c
   cipher_extra/derive_key.c
-  cipher_extra/e_aesccm.c
   cipher_extra/e_aesctrhmac.c
   cipher_extra/e_aesgcmsiv.c
   cipher_extra/e_chacha20poly1305.c
+  cipher_extra/e_des.c
   cipher_extra/e_null.c
   cipher_extra/e_rc2.c
   cipher_extra/e_rc4.c
   cipher_extra/e_tls.c
   cipher_extra/tls_cbc.c
-  cmac/cmac.c
   conf/conf.c
-  cpu-aarch64-fuchsia.c
-  cpu-aarch64-linux.c
-  cpu-aarch64-win.c
-  cpu-arm-linux.c
-  cpu-arm.c
-  cpu-intel.c
-  cpu-ppc64le.c
+  cpu_aarch64_apple.c
+  cpu_aarch64_fuchsia.c
+  cpu_aarch64_linux.c
+  cpu_aarch64_win.c
+  cpu_arm_linux.c
+  cpu_arm.c
+  cpu_intel.c
+  cpu_ppc64le.c
   crypto.c
   curve25519/curve25519.c
   curve25519/spake25519.c
+  des/des.c
   dh_extra/params.c
   dh_extra/dh_asn1.c
   digest_extra/digest_extra.c
@@ -286,7 +288,6 @@
   err/err.c
   err_data.c
   engine/engine.c
-  evp/digestsign.c
   evp/evp.c
   evp/evp_asn1.c
   evp/evp_ctx.c
@@ -295,6 +296,7 @@
   evp/p_ec_asn1.c
   evp/p_ed25519.c
   evp/p_ed25519_asn1.c
+  evp/p_hkdf.c
   evp/p_rsa.c
   evp/p_rsa_asn1.c
   evp/p_x25519.c
@@ -398,7 +400,6 @@
   x509/x_x509a.c
   x509v3/pcy_cache.c
   x509v3/pcy_data.c
-  x509v3/pcy_lib.c
   x509v3/pcy_map.c
   x509v3/pcy_node.c
   x509v3/pcy_tree.c
@@ -433,19 +434,25 @@
   ${CRYPTO_ARCH_SOURCES}
   ${CRYPTO_FIPS_OBJECTS}
 )
+target_include_directories(crypto INTERFACE
+ $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:include>
+)
+install(TARGETS crypto EXPORT OpenSSLTargets
+  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+set_property(TARGET crypto PROPERTY EXPORT_NAME Crypto)
 
 if(FIPS_SHARED)
-  set(EXTRA_INJECT_HASH_ARGS)
-  if(ANDROID)
-    set(EXTRA_INJECT_HASH_ARGS "-sha256")
-  endif()
   # Rewrite libcrypto.so to inject the correct module hash value. This assumes
   # UNIX-style library naming, but we only support FIPS mode on Linux anyway.
   add_custom_command(
     TARGET crypto POST_BUILD
     COMMAND ${GO_EXECUTABLE} run
     ${CMAKE_CURRENT_SOURCE_DIR}/../util/fipstools/inject_hash/inject_hash.go
-    -o libcrypto.so -in-object libcrypto.so ${EXTRA_INJECT_HASH_ARGS}
+    -o libcrypto.so -in-object libcrypto.so
     # The DEPENDS argument to a POST_BUILD rule appears to be ignored. Thus
     # go_executable isn't used (as it doesn't get built), but we list this
     # dependency anyway in case it starts working in some CMake version.
@@ -462,8 +469,9 @@
 
 SET_TARGET_PROPERTIES(crypto PROPERTIES LINKER_LANGUAGE C)
 
-if(NOT WIN32 AND NOT ANDROID)
-  target_link_libraries(crypto pthread)
+if(NOT ANDROID)
+  find_package(Threads REQUIRED)
+  target_link_libraries(crypto Threads::Threads)
 endif()
 
 # Every target depends on crypto, so we add libcxx as a dependency here to
@@ -499,11 +507,10 @@
   chacha/chacha_test.cc
   cipher_extra/aead_test.cc
   cipher_extra/cipher_test.cc
-  cmac/cmac_test.cc
   compiler_test.cc
   conf/conf_test.cc
   constant_time_test.cc
-  cpu-arm-linux_test.cc
+  cpu_arm_linux_test.cc
   crypto_test.cc
   curve25519/ed25519_test.cc
   curve25519/spake25519_test.cc
@@ -519,13 +526,15 @@
   evp/scrypt_test.cc
   fipsmodule/aes/aes_test.cc
   fipsmodule/bn/bn_test.cc
+  fipsmodule/cmac/cmac_test.cc
   fipsmodule/ec/ec_test.cc
-  fipsmodule/ec/p256-x86_64_test.cc
+  fipsmodule/ec/p256-nistz_test.cc
   fipsmodule/ecdsa/ecdsa_test.cc
   fipsmodule/md5/md5_test.cc
   fipsmodule/modes/gcm_test.cc
   fipsmodule/rand/ctrdrbg_test.cc
   fipsmodule/rand/fork_detect_test.cc
+  fipsmodule/service_indicator/service_indicator_test.cc
   fipsmodule/sha/sha_test.cc
   hkdf/hkdf_test.cc
   hpke/hpke_test.cc
@@ -552,7 +561,6 @@
   x509/x509_test.cc
   x509/x509_time_test.cc
   x509v3/tab_test.cc
-  x509v3/v3name_test.cc
 
   $<TARGET_OBJECTS:crypto_test_data>
   $<TARGET_OBJECTS:boringssl_gtest_main>
diff --git a/src/crypto/abi_self_test.cc b/src/crypto/abi_self_test.cc
index c48818b..9681498 100644
--- a/src/crypto/abi_self_test.cc
+++ b/src/crypto/abi_self_test.cc
@@ -58,9 +58,10 @@
 #if defined(OPENSSL_WINDOWS)
     // The invalid epilog makes Windows believe the epilog starts later than it
     // actually does. As a result, immediately after the popq, it does not
-    // realize the stack has been unwound and repeats the work.
-    EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_epilog),
-                            "unwound past starting frame");
+    // realize the stack has been unwound and repeats the popq. This will result
+    // in reading the wrong return address and fail to unwind. The exact failure
+    // may vary depending on what was on the stack before.
+    EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_epilog), "");
     CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_epilog);
 #endif  // OPENSSL_WINDOWS
   }
diff --git a/src/crypto/asn1/a_bitstr.c b/src/crypto/asn1/a_bitstr.c
index 1bb58e2..9c50857 100644
--- a/src/crypto/asn1/a_bitstr.c
+++ b/src/crypto/asn1/a_bitstr.c
@@ -66,219 +66,216 @@
 #include "internal.h"
 
 
-int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, const unsigned char *d, int len)
-{
-    return ASN1_STRING_set(x, d, len);
+int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, const unsigned char *d, int len) {
+  return ASN1_STRING_set(x, d, len);
 }
 
 int asn1_bit_string_length(const ASN1_BIT_STRING *str,
                            uint8_t *out_padding_bits) {
-    int len = str->length;
-    if (str->flags & ASN1_STRING_FLAG_BITS_LEFT) {
-        // If the string is already empty, it cannot have padding bits.
-        *out_padding_bits = len == 0 ? 0 : str->flags & 0x07;
-        return len;
-    }
-
-    // TODO(https://crbug.com/boringssl/447): If we move this logic to
-    // |ASN1_BIT_STRING_set_bit|, can we remove this representation?
-    while (len > 0 && str->data[len - 1] == 0) {
-        len--;
-    }
-    uint8_t padding_bits = 0;
-    if (len > 0) {
-        uint8_t last = str->data[len - 1];
-        assert(last != 0);
-        for (; padding_bits < 7; padding_bits++) {
-            if (last & (1 << padding_bits)) {
-                break;
-            }
-        }
-    }
-    *out_padding_bits = padding_bits;
+  int len = str->length;
+  if (str->flags & ASN1_STRING_FLAG_BITS_LEFT) {
+    // If the string is already empty, it cannot have padding bits.
+    *out_padding_bits = len == 0 ? 0 : str->flags & 0x07;
     return len;
+  }
+
+  // TODO(https://crbug.com/boringssl/447): If we move this logic to
+  // |ASN1_BIT_STRING_set_bit|, can we remove this representation?
+  while (len > 0 && str->data[len - 1] == 0) {
+    len--;
+  }
+  uint8_t padding_bits = 0;
+  if (len > 0) {
+    uint8_t last = str->data[len - 1];
+    assert(last != 0);
+    for (; padding_bits < 7; padding_bits++) {
+      if (last & (1 << padding_bits)) {
+        break;
+      }
+    }
+  }
+  *out_padding_bits = padding_bits;
+  return len;
 }
 
 int ASN1_BIT_STRING_num_bytes(const ASN1_BIT_STRING *str, size_t *out) {
-    uint8_t padding_bits;
-    int len = asn1_bit_string_length(str, &padding_bits);
-    if (padding_bits != 0) {
-        return 0;
-    }
-    *out = len;
-    return 1;
+  uint8_t padding_bits;
+  int len = asn1_bit_string_length(str, &padding_bits);
+  if (padding_bits != 0) {
+    return 0;
+  }
+  *out = len;
+  return 1;
 }
 
-int i2c_ASN1_BIT_STRING(const ASN1_BIT_STRING *a, unsigned char **pp)
-{
-    if (a == NULL) {
-        return 0;
-    }
+int i2c_ASN1_BIT_STRING(const ASN1_BIT_STRING *a, unsigned char **pp) {
+  if (a == NULL) {
+    return 0;
+  }
 
-    uint8_t bits;
-    int len = asn1_bit_string_length(a, &bits);
-    int ret = 1 + len;
-    if (pp == NULL) {
-        return ret;
-    }
+  uint8_t bits;
+  int len = asn1_bit_string_length(a, &bits);
+  int ret = 1 + len;
+  if (pp == NULL) {
+    return ret;
+  }
 
-    uint8_t *p = *pp;
-    *(p++) = bits;
-    OPENSSL_memcpy(p, a->data, len);
-    if (len > 0) {
-        p[len - 1] &= (0xff << bits);
-    }
-    p += len;
-    *pp = p;
-    return (ret);
+  uint8_t *p = *pp;
+  *(p++) = bits;
+  OPENSSL_memcpy(p, a->data, len);
+  if (len > 0) {
+    p[len - 1] &= (0xff << bits);
+  }
+  p += len;
+  *pp = p;
+  return ret;
 }
 
 ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
-                                     const unsigned char **pp, long len)
-{
-    ASN1_BIT_STRING *ret = NULL;
-    const unsigned char *p;
-    unsigned char *s;
-    int padding;
+                                     const unsigned char **pp, long len) {
+  ASN1_BIT_STRING *ret = NULL;
+  const unsigned char *p;
+  unsigned char *s;
+  int padding;
 
-    if (len < 1) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT);
-        goto err;
+  if (len < 1) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT);
+    goto err;
+  }
+
+  if (len > INT_MAX) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG);
+    goto err;
+  }
+
+  if ((a == NULL) || ((*a) == NULL)) {
+    if ((ret = ASN1_BIT_STRING_new()) == NULL) {
+      return NULL;
     }
+  } else {
+    ret = (*a);
+  }
 
-    if (len > INT_MAX) {
-      OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG);
+  p = *pp;
+  padding = *(p++);
+  len--;
+  if (padding > 7) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
+    goto err;
+  }
+
+  // Unused bits in a BIT STRING must be zero.
+  uint8_t padding_mask = (1 << padding) - 1;
+  if (padding != 0 && (len < 1 || (p[len - 1] & padding_mask) != 0)) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_PADDING);
+    goto err;
+  }
+
+  // We do this to preserve the settings.  If we modify the settings, via
+  // the _set_bit function, we will recalculate on output
+  ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);    // clear
+  ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding);  // set
+
+  if (len > 0) {
+    s = OPENSSL_memdup(p, len);
+    if (s == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
       goto err;
     }
+    p += len;
+  } else {
+    s = NULL;
+  }
 
-    if ((a == NULL) || ((*a) == NULL)) {
-        if ((ret = ASN1_BIT_STRING_new()) == NULL)
-            return (NULL);
-    } else
-        ret = (*a);
+  ret->length = (int)len;
+  OPENSSL_free(ret->data);
+  ret->data = s;
+  ret->type = V_ASN1_BIT_STRING;
+  if (a != NULL) {
+    (*a) = ret;
+  }
+  *pp = p;
+  return ret;
+err:
+  if ((ret != NULL) && ((a == NULL) || (*a != ret))) {
+    ASN1_BIT_STRING_free(ret);
+  }
+  return NULL;
+}
 
-    p = *pp;
-    padding = *(p++);
-    len--;
-    if (padding > 7) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
-        goto err;
+// These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
+int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) {
+  int w, v, iv;
+  unsigned char *c;
+
+  w = n / 8;
+  v = 1 << (7 - (n & 0x07));
+  iv = ~v;
+  if (!value) {
+    v = 0;
+  }
+
+  if (a == NULL) {
+    return 0;
+  }
+
+  a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);  // clear, set on write
+
+  if ((a->length < (w + 1)) || (a->data == NULL)) {
+    if (!value) {
+      return 1;  // Don't need to set
     }
-
-    /* Unused bits in a BIT STRING must be zero. */
-    uint8_t padding_mask = (1 << padding) - 1;
-    if (padding != 0 &&
-        (len < 1 || (p[len - 1] & padding_mask) != 0)) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_PADDING);
-        goto err;
-    }
-
-    /*
-     * We do this to preserve the settings.  If we modify the settings, via
-     * the _set_bit function, we will recalculate on output
-     */
-    ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear */
-    ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding); /* set */
-
-    if (len > 0) {
-        s = OPENSSL_memdup(p, len);
-        if (s == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        p += len;
+    if (a->data == NULL) {
+      c = (unsigned char *)OPENSSL_malloc(w + 1);
     } else {
-        s = NULL;
+      c = (unsigned char *)OPENSSL_realloc(a->data, w + 1);
     }
-
-    ret->length = (int)len;
-    OPENSSL_free(ret->data);
-    ret->data = s;
-    ret->type = V_ASN1_BIT_STRING;
-    if (a != NULL)
-        (*a) = ret;
-    *pp = p;
-    return (ret);
- err:
-    if ((ret != NULL) && ((a == NULL) || (*a != ret)))
-        ASN1_BIT_STRING_free(ret);
-    return (NULL);
+    if (c == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+    if (w + 1 - a->length > 0) {
+      OPENSSL_memset(c + a->length, 0, w + 1 - a->length);
+    }
+    a->data = c;
+    a->length = w + 1;
+  }
+  a->data[w] = ((a->data[w]) & iv) | v;
+  while ((a->length > 0) && (a->data[a->length - 1] == 0)) {
+    a->length--;
+  }
+  return 1;
 }
 
-/*
- * These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
- */
-int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value)
-{
-    int w, v, iv;
-    unsigned char *c;
+int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n) {
+  int w, v;
 
-    w = n / 8;
-    v = 1 << (7 - (n & 0x07));
-    iv = ~v;
-    if (!value)
-        v = 0;
-
-    if (a == NULL)
-        return 0;
-
-    a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear, set on write */
-
-    if ((a->length < (w + 1)) || (a->data == NULL)) {
-        if (!value)
-            return (1);         /* Don't need to set */
-        if (a->data == NULL)
-            c = (unsigned char *)OPENSSL_malloc(w + 1);
-        else
-            c = (unsigned char *)OPENSSL_realloc(a->data, w + 1);
-        if (c == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return 0;
-        }
-        if (w + 1 - a->length > 0)
-            OPENSSL_memset(c + a->length, 0, w + 1 - a->length);
-        a->data = c;
-        a->length = w + 1;
-    }
-    a->data[w] = ((a->data[w]) & iv) | v;
-    while ((a->length > 0) && (a->data[a->length - 1] == 0))
-        a->length--;
-    return (1);
+  w = n / 8;
+  v = 1 << (7 - (n & 0x07));
+  if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL)) {
+    return 0;
+  }
+  return ((a->data[w] & v) != 0);
 }
 
-int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n)
-{
-    int w, v;
+// Checks if the given bit string contains only bits specified by
+// the flags vector. Returns 0 if there is at least one bit set in 'a'
+// which is not specified in 'flags', 1 otherwise.
+// 'len' is the length of 'flags'.
+int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, const unsigned char *flags,
+                          int flags_len) {
+  int i, ok;
+  // Check if there is one bit set at all.
+  if (!a || !a->data) {
+    return 1;
+  }
 
-    w = n / 8;
-    v = 1 << (7 - (n & 0x07));
-    if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL))
-        return (0);
-    return ((a->data[w] & v) != 0);
-}
-
-/*
- * Checks if the given bit string contains only bits specified by
- * the flags vector. Returns 0 if there is at least one bit set in 'a'
- * which is not specified in 'flags', 1 otherwise.
- * 'len' is the length of 'flags'.
- */
-int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a,
-                          const unsigned char *flags, int flags_len)
-{
-    int i, ok;
-    /* Check if there is one bit set at all. */
-    if (!a || !a->data)
-        return 1;
-
-    /*
-     * Check each byte of the internal representation of the bit string.
-     */
-    ok = 1;
-    for (i = 0; i < a->length && ok; ++i) {
-        unsigned char mask = i < flags_len ? ~flags[i] : 0xff;
-        /* We are done if there is an unneeded bit set. */
-        ok = (a->data[i] & mask) == 0;
-    }
-    return ok;
+  // Check each byte of the internal representation of the bit string.
+  ok = 1;
+  for (i = 0; i < a->length && ok; ++i) {
+    unsigned char mask = i < flags_len ? ~flags[i] : 0xff;
+    // We are done if there is an unneeded bit set.
+    ok = (a->data[i] & mask) == 0;
+  }
+  return ok;
 }
diff --git a/src/crypto/asn1/a_bool.c b/src/crypto/asn1/a_bool.c
index 3f32e80..2a4448c 100644
--- a/src/crypto/asn1/a_bool.c
+++ b/src/crypto/asn1/a_bool.c
@@ -59,64 +59,62 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp)
-{
-    int r;
-    unsigned char *p, *allocated = NULL;
+int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp) {
+  int r;
+  unsigned char *p, *allocated = NULL;
 
-    r = ASN1_object_size(0, 1, V_ASN1_BOOLEAN);
-    if (pp == NULL)
-        return (r);
-
-    if (*pp == NULL) {
-        if ((p = allocated = OPENSSL_malloc(r)) == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return -1;
-        }
-    } else {
-        p = *pp;
-    }
-
-    ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL);
-    *p = a ? 0xff : 0x00;
-
-    /*
-     * If a new buffer was allocated, just return it back.
-     * If not, return the incremented buffer pointer.
-     */
-    *pp = allocated != NULL ? allocated : p + 1;
+  r = ASN1_object_size(0, 1, V_ASN1_BOOLEAN);
+  if (pp == NULL) {
     return r;
+  }
+
+  if (*pp == NULL) {
+    if ((p = allocated = OPENSSL_malloc(r)) == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return -1;
+    }
+  } else {
+    p = *pp;
+  }
+
+  ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL);
+  *p = a ? 0xff : 0x00;
+
+  // If a new buffer was allocated, just return it back.
+  // If not, return the incremented buffer pointer.
+  *pp = allocated != NULL ? allocated : p + 1;
+  return r;
 }
 
 ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *a, const unsigned char **pp,
                               long length) {
-    const unsigned char *p = *pp;
-    long len;
-    int inf, tag, xclass;
-    inf = ASN1_get_object(&p, &len, &tag, &xclass, length);
-    if (inf & 0x80) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
-        return -1;
-    }
+  const unsigned char *p = *pp;
+  long len;
+  int inf, tag, xclass;
+  inf = ASN1_get_object(&p, &len, &tag, &xclass, length);
+  if (inf & 0x80) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
+    return -1;
+  }
 
-    if (inf & V_ASN1_CONSTRUCTED) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
-        return -1;
-    }
+  if (inf & V_ASN1_CONSTRUCTED) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
+    return -1;
+  }
 
-    if (tag != V_ASN1_BOOLEAN || xclass != V_ASN1_UNIVERSAL) {
-      OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_A_BOOLEAN);
-      return -1;
-    }
+  if (tag != V_ASN1_BOOLEAN || xclass != V_ASN1_UNIVERSAL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_A_BOOLEAN);
+    return -1;
+  }
 
-    if (len != 1) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
-        return -1;
-    }
-    ASN1_BOOLEAN ret = (ASN1_BOOLEAN)*(p++);
-    if (a != NULL) {
-        (*a) = ret;
-    }
-    *pp = p;
-    return ret;
+  if (len != 1) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
+    return -1;
+  }
+  ASN1_BOOLEAN ret = (ASN1_BOOLEAN) * (p++);
+  if (a != NULL) {
+    (*a) = ret;
+  }
+  *pp = p;
+  return ret;
 }
diff --git a/src/crypto/asn1/a_d2i_fp.c b/src/crypto/asn1/a_d2i_fp.c
index d0d6d03..36c9d69 100644
--- a/src/crypto/asn1/a_d2i_fp.c
+++ b/src/crypto/asn1/a_d2i_fp.c
@@ -63,29 +63,27 @@
 #include <openssl/mem.h>
 
 
-void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x)
-{
-    uint8_t *data;
-    size_t len;
-    // Historically, this function did not impose a limit in OpenSSL and is used
-    // to read CRLs, so we leave this without an external bound.
-    if (!BIO_read_asn1(in, &data, &len, INT_MAX)) {
-        return NULL;
-    }
-    const uint8_t *ptr = data;
-    void *ret = ASN1_item_d2i(x, &ptr, len, it);
-    OPENSSL_free(data);
-    return ret;
+void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x) {
+  uint8_t *data;
+  size_t len;
+  // Historically, this function did not impose a limit in OpenSSL and is used
+  // to read CRLs, so we leave this without an external bound.
+  if (!BIO_read_asn1(in, &data, &len, INT_MAX)) {
+    return NULL;
+  }
+  const uint8_t *ptr = data;
+  void *ret = ASN1_item_d2i(x, &ptr, len, it);
+  OPENSSL_free(data);
+  return ret;
 }
 
-void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x)
-{
-    BIO *b = BIO_new_fp(in, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB);
-        return NULL;
-    }
-    void *ret = ASN1_item_d2i_bio(it, b, x);
-    BIO_free(b);
-    return ret;
+void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x) {
+  BIO *b = BIO_new_fp(in, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB);
+    return NULL;
+  }
+  void *ret = ASN1_item_d2i_bio(it, b, x);
+  BIO_free(b);
+  return ret;
 }
diff --git a/src/crypto/asn1/a_dup.c b/src/crypto/asn1/a_dup.c
index 9ede851..8ee0c7e 100644
--- a/src/crypto/asn1/a_dup.c
+++ b/src/crypto/asn1/a_dup.c
@@ -59,29 +59,27 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-/*
- * ASN1_ITEM version of dup: this follows the model above except we don't
- * need to allocate the buffer. At some point this could be rewritten to
- * directly dup the underlying structure instead of doing and encode and
- * decode.
- */
-void *ASN1_item_dup(const ASN1_ITEM *it, void *x)
-{
-    unsigned char *b = NULL;
-    const unsigned char *p;
-    long i;
-    void *ret;
+// ASN1_ITEM version of dup: this follows the model above except we don't
+// need to allocate the buffer. At some point this could be rewritten to
+// directly dup the underlying structure instead of doing and encode and
+// decode.
+void *ASN1_item_dup(const ASN1_ITEM *it, void *x) {
+  unsigned char *b = NULL;
+  const unsigned char *p;
+  long i;
+  void *ret;
 
-    if (x == NULL)
-        return (NULL);
+  if (x == NULL) {
+    return NULL;
+  }
 
-    i = ASN1_item_i2d(x, &b, it);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return (NULL);
-    }
-    p = b;
-    ret = ASN1_item_d2i(NULL, &p, i, it);
-    OPENSSL_free(b);
-    return (ret);
+  i = ASN1_item_i2d(x, &b, it);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  p = b;
+  ret = ASN1_item_d2i(NULL, &p, i, it);
+  OPENSSL_free(b);
+  return ret;
 }
diff --git a/src/crypto/asn1/a_enum.c b/src/crypto/asn1/a_enum.c
deleted file mode 100644
index d7a7357..0000000
--- a/src/crypto/asn1/a_enum.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.] */
-
-#include <openssl/asn1.h>
-
-#include <limits.h>
-#include <string.h>
-
-#include <openssl/err.h>
-#include <openssl/mem.h>
-
-#include "../internal.h"
-
-
-/*
- * Code for ENUMERATED type: identical to INTEGER apart from a different tag.
- * for comments on encoding see a_int.c
- */
-
-int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v)
-{
-    int j, k;
-    unsigned int i;
-    unsigned char buf[sizeof(long) + 1];
-    long d;
-
-    a->type = V_ASN1_ENUMERATED;
-    if (a->length < (int)(sizeof(long) + 1)) {
-        if (a->data != NULL)
-            OPENSSL_free(a->data);
-        if ((a->data =
-             (unsigned char *)OPENSSL_malloc(sizeof(long) + 1)) != NULL)
-            OPENSSL_memset((char *)a->data, 0, sizeof(long) + 1);
-    }
-    if (a->data == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return (0);
-    }
-    d = v;
-    if (d < 0) {
-        d = -d;
-        a->type = V_ASN1_NEG_ENUMERATED;
-    }
-
-    for (i = 0; i < sizeof(long); i++) {
-        if (d == 0)
-            break;
-        buf[i] = (int)d & 0xff;
-        d >>= 8;
-    }
-    j = 0;
-    for (k = i - 1; k >= 0; k--)
-        a->data[j++] = buf[k];
-    a->length = j;
-    return (1);
-}
-
-long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a)
-{
-    int neg = 0, i;
-
-    if (a == NULL)
-        return (0L);
-    i = a->type;
-    if (i == V_ASN1_NEG_ENUMERATED)
-        neg = 1;
-    else if (i != V_ASN1_ENUMERATED)
-        return -1;
-
-    OPENSSL_STATIC_ASSERT(sizeof(uint64_t) >= sizeof(long),
-                          "long larger than uint64_t");
-
-    if (a->length > (int)sizeof(uint64_t)) {
-        /* hmm... a bit ugly */
-        return -1;
-    }
-
-    uint64_t r64 = 0;
-    if (a->data != NULL) {
-      for (i = 0; i < a->length; i++) {
-          r64 <<= 8;
-          r64 |= (unsigned char)a->data[i];
-      }
-
-      if (r64 > LONG_MAX) {
-          return -1;
-      }
-    }
-
-    long r = (long) r64;
-    if (neg)
-        r = -r;
-
-    return r;
-}
-
-ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai)
-{
-    ASN1_ENUMERATED *ret;
-    int len, j;
-
-    if (ai == NULL)
-        ret = ASN1_ENUMERATED_new();
-    else
-        ret = ai;
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-        goto err;
-    }
-    if (BN_is_negative(bn))
-        ret->type = V_ASN1_NEG_ENUMERATED;
-    else
-        ret->type = V_ASN1_ENUMERATED;
-    j = BN_num_bits(bn);
-    len = ((j == 0) ? 0 : ((j / 8) + 1));
-    if (ret->length < len + 4) {
-        unsigned char *new_data = OPENSSL_realloc(ret->data, len + 4);
-        if (!new_data) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        ret->data = new_data;
-    }
-
-    ret->length = BN_bn2bin(bn, ret->data);
-    return (ret);
- err:
-    if (ret != ai)
-        ASN1_ENUMERATED_free(ret);
-    return (NULL);
-}
-
-BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn)
-{
-    BIGNUM *ret;
-
-    if ((ret = BN_bin2bn(ai->data, ai->length, bn)) == NULL)
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BN_LIB);
-    else if (ai->type == V_ASN1_NEG_ENUMERATED)
-        BN_set_negative(ret, 1);
-    return (ret);
-}
diff --git a/src/crypto/asn1/a_gentm.c b/src/crypto/asn1/a_gentm.c
index 3e6f14e..283ff7d 100644
--- a/src/crypto/asn1/a_gentm.c
+++ b/src/crypto/asn1/a_gentm.c
@@ -55,212 +55,94 @@
  * [including the GNU Public Licence.] */
 
 #include <openssl/asn1.h>
+#include <openssl/bytestring.h>
+#include <openssl/err.h>
+#include <openssl/mem.h>
 
 #include <string.h>
 #include <time.h>
 
-#include <openssl/err.h>
-#include <openssl/mem.h>
-
 #include "internal.h"
 
-int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d)
-{
-    static const int min[9] = { 0, 0, 1, 1, 0, 0, 0, 0, 0 };
-    static const int max[9] = { 99, 99, 12, 31, 23, 59, 59, 12, 59 };
-    char *a;
-    int n, i, l, o;
-
-    if (d->type != V_ASN1_GENERALIZEDTIME)
-        return (0);
-    l = d->length;
-    a = (char *)d->data;
-    o = 0;
-    /*
-     * GENERALIZEDTIME is similar to UTCTIME except the year is represented
-     * as YYYY. This stuff treats everything as a two digit field so make
-     * first two fields 00 to 99
-     */
-    if (l < 13)
-        goto err;
-    for (i = 0; i < 7; i++) {
-        if ((i == 6) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
-            i++;
-            if (tm)
-                tm->tm_sec = 0;
-            break;
-        }
-        if ((a[o] < '0') || (a[o] > '9'))
-            goto err;
-        n = a[o] - '0';
-        if (++o > l)
-            goto err;
-
-        if ((a[o] < '0') || (a[o] > '9'))
-            goto err;
-        n = (n * 10) + a[o] - '0';
-        if (++o > l)
-            goto err;
-
-        if ((n < min[i]) || (n > max[i]))
-            goto err;
-        if (tm) {
-            switch (i) {
-            case 0:
-                tm->tm_year = n * 100 - 1900;
-                break;
-            case 1:
-                tm->tm_year += n;
-                break;
-            case 2:
-                tm->tm_mon = n - 1;
-                break;
-            case 3:
-                tm->tm_mday = n;
-                break;
-            case 4:
-                tm->tm_hour = n;
-                break;
-            case 5:
-                tm->tm_min = n;
-                break;
-            case 6:
-                tm->tm_sec = n;
-                break;
-            }
-        }
-    }
-    /*
-     * Optional fractional seconds: decimal point followed by one or more
-     * digits.
-     */
-    if (a[o] == '.') {
-        if (++o > l)
-            goto err;
-        i = o;
-        while ((a[o] >= '0') && (a[o] <= '9') && (o <= l))
-            o++;
-        /* Must have at least one digit after decimal point */
-        if (i == o)
-            goto err;
-    }
-
-    if (a[o] == 'Z')
-        o++;
-    else if ((a[o] == '+') || (a[o] == '-')) {
-        int offsign = a[o] == '-' ? 1 : -1, offset = 0;
-        o++;
-        if (o + 4 > l)
-            goto err;
-        for (i = 7; i < 9; i++) {
-            if ((a[o] < '0') || (a[o] > '9'))
-                goto err;
-            n = a[o] - '0';
-            o++;
-            if ((a[o] < '0') || (a[o] > '9'))
-                goto err;
-            n = (n * 10) + a[o] - '0';
-            if ((n < min[i]) || (n > max[i]))
-                goto err;
-            if (tm) {
-                if (i == 7)
-                    offset = n * 3600;
-                else if (i == 8)
-                    offset += n * 60;
-            }
-            o++;
-        }
-        if (offset && !OPENSSL_gmtime_adj(tm, 0, offset * offsign))
-            return 0;
-    } else if (a[o]) {
-        /* Missing time zone information. */
-        goto err;
-    }
-    return (o == l);
- err:
-    return (0);
+int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d) {
+  if (d->type != V_ASN1_GENERALIZEDTIME) {
+    return 0;
+  }
+  CBS cbs;
+  CBS_init(&cbs, d->data, (size_t)d->length);
+  if (!CBS_parse_generalized_time(&cbs, tm, /*allow_timezone_offset=*/0)) {
+    return 0;
+  }
+  return 1;
 }
 
-int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *d)
-{
-    return asn1_generalizedtime_to_tm(NULL, d);
+int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *d) {
+  return asn1_generalizedtime_to_tm(NULL, d);
 }
 
-int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str)
-{
-    ASN1_GENERALIZEDTIME t;
+int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) {
+  ASN1_GENERALIZEDTIME t;
 
-    t.type = V_ASN1_GENERALIZEDTIME;
-    t.length = strlen(str);
-    t.data = (unsigned char *)str;
-    if (ASN1_GENERALIZEDTIME_check(&t)) {
-        if (s != NULL) {
-            if (!ASN1_STRING_set((ASN1_STRING *)s,
-                                 (unsigned char *)str, t.length))
-                return 0;
-            s->type = V_ASN1_GENERALIZEDTIME;
-        }
-        return (1);
-    } else
-        return (0);
+  t.type = V_ASN1_GENERALIZEDTIME;
+  t.length = strlen(str);
+  t.data = (unsigned char *)str;
+  if (ASN1_GENERALIZEDTIME_check(&t)) {
+    if (s != NULL) {
+      if (!ASN1_STRING_set((ASN1_STRING *)s, (unsigned char *)str, t.length)) {
+        return 0;
+      }
+      s->type = V_ASN1_GENERALIZEDTIME;
+    }
+    return 1;
+  } else {
+    return 0;
+  }
 }
 
 ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,
-                                               time_t t)
-{
-    return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0);
+                                               time_t t) {
+  return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0);
 }
 
 ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s,
                                                time_t t, int offset_day,
-                                               long offset_sec)
-{
-    char *p;
-    struct tm *ts;
-    struct tm data;
-    size_t len = 20;
-    ASN1_GENERALIZEDTIME *tmps = NULL;
-
-    if (s == NULL)
-        tmps = ASN1_GENERALIZEDTIME_new();
-    else
-        tmps = s;
-    if (tmps == NULL)
-        return NULL;
-
-    ts = OPENSSL_gmtime(&t, &data);
-    if (ts == NULL)
-        goto err;
-
-    if (offset_day || offset_sec) {
-        if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
-            goto err;
-    }
-
-    if (ts->tm_year < 0 - 1900 || ts->tm_year > 9999 - 1900) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
-        goto err;
-    }
-
-    p = (char *)tmps->data;
-    if ((p == NULL) || ((size_t)tmps->length < len)) {
-        p = OPENSSL_malloc(len);
-        if (p == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        OPENSSL_free(tmps->data);
-        tmps->data = (unsigned char *)p;
-    }
-
-    BIO_snprintf(p, len, "%04d%02d%02d%02d%02d%02dZ", ts->tm_year + 1900,
-                 ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
-                 ts->tm_sec);
-    tmps->length = strlen(p);
-    tmps->type = V_ASN1_GENERALIZEDTIME;
-    return tmps;
- err:
-    if (s == NULL)
-        ASN1_GENERALIZEDTIME_free(tmps);
+                                               long offset_sec) {
+  struct tm data;
+  if (!OPENSSL_gmtime(&t, &data)) {
     return NULL;
+  }
+
+  if (offset_day || offset_sec) {
+    if (!OPENSSL_gmtime_adj(&data, offset_day, offset_sec)) {
+      return NULL;
+    }
+  }
+
+  if (data.tm_year < 0 - 1900 || data.tm_year > 9999 - 1900) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
+    return NULL;
+  }
+
+  char buf[16];
+  BIO_snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+               data.tm_year + 1900, data.tm_mon + 1, data.tm_mday, data.tm_hour,
+               data.tm_min, data.tm_sec);
+
+  int free_s = 0;
+  if (s == NULL) {
+    free_s = 1;
+    s = ASN1_UTCTIME_new();
+    if (s == NULL) {
+      return NULL;
+    }
+  }
+
+  if (!ASN1_STRING_set(s, buf, strlen(buf))) {
+    if (free_s) {
+      ASN1_UTCTIME_free(s);
+    }
+    return NULL;
+  }
+  s->type = V_ASN1_GENERALIZEDTIME;
+  return s;
 }
diff --git a/src/crypto/asn1/a_i2d_fp.c b/src/crypto/asn1/a_i2d_fp.c
index db0d812..4a14f2b 100644
--- a/src/crypto/asn1/a_i2d_fp.c
+++ b/src/crypto/asn1/a_i2d_fp.c
@@ -61,28 +61,26 @@
 #include <openssl/mem.h>
 
 
-int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x)
-{
-    BIO *b = BIO_new_fp(out, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = ASN1_item_i2d_bio(it, b, x);
-    BIO_free(b);
-    return ret;
+int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x) {
+  BIO *b = BIO_new_fp(out, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = ASN1_item_i2d_bio(it, b, x);
+  BIO_free(b);
+  return ret;
 }
 
-int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x)
-{
-    unsigned char *b = NULL;
-    int n = ASN1_item_i2d(x, &b, it);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
+int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x) {
+  unsigned char *b = NULL;
+  int n = ASN1_item_i2d(x, &b, it);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
 
-    int ret = BIO_write_all(out, b, n);
-    OPENSSL_free(b);
-    return ret;
+  int ret = BIO_write_all(out, b, n);
+  OPENSSL_free(b);
+  return ret;
 }
diff --git a/src/crypto/asn1/a_int.c b/src/crypto/asn1/a_int.c
index 1695fd0..78d1f09 100644
--- a/src/crypto/asn1/a_int.c
+++ b/src/crypto/asn1/a_int.c
@@ -56,365 +56,408 @@
 
 #include <openssl/asn1.h>
 
-#include <string.h>
+#include <assert.h>
 #include <limits.h>
+#include <string.h>
 
+#include <openssl/bytestring.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
 #include "../internal.h"
 
 
-ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x)
-{
-    return ASN1_STRING_dup(x);
+ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x) {
+  return ASN1_STRING_dup(x);
 }
 
-int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y)
-{
-    int neg, ret;
-    /* Compare signs */
-    neg = x->type & V_ASN1_NEG;
-    if (neg != (y->type & V_ASN1_NEG)) {
-        if (neg)
-            return -1;
-        else
-            return 1;
-    }
+int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y) {
+  // Compare signs.
+  int neg = x->type & V_ASN1_NEG;
+  if (neg != (y->type & V_ASN1_NEG)) {
+    return neg ? -1 : 1;
+  }
 
-    ret = ASN1_STRING_cmp(x, y);
-
-    if (neg)
-        return -ret;
-    else
-        return ret;
-}
-
-/*
- * This converts an ASN1 INTEGER into its content encoding.
- * The internal representation is an ASN1_STRING whose data is a big endian
- * representation of the value, ignoring the sign. The sign is determined by
- * the type: V_ASN1_INTEGER for positive and V_ASN1_NEG_INTEGER for negative.
- *
- * Positive integers are no problem: they are almost the same as the DER
- * encoding, except if the first byte is >= 0x80 we need to add a zero pad.
- *
- * Negative integers are a bit trickier...
- * The DER representation of negative integers is in 2s complement form.
- * The internal form is converted by complementing each octet and finally
- * adding one to the result. This can be done less messily with a little trick.
- * If the internal form has trailing zeroes then they will become FF by the
- * complement and 0 by the add one (due to carry) so just copy as many trailing
- * zeros to the destination as there are in the source. The carry will add one
- * to the last none zero octet: so complement this octet and add one and finally
- * complement any left over until you get to the start of the string.
- *
- * Padding is a little trickier too. If the first bytes is > 0x80 then we pad
- * with 0xff. However if the first byte is 0x80 and one of the following bytes
- * is non-zero we pad with 0xff. The reason for this distinction is that 0x80
- * followed by optional zeros isn't padded.
- */
-
-int i2c_ASN1_INTEGER(const ASN1_INTEGER *a, unsigned char **pp)
-{
-    int pad = 0, ret, i, neg;
-    unsigned char *p, *n, pb = 0;
-
-    if (a == NULL)
-        return (0);
-    neg = a->type & V_ASN1_NEG;
-    if (a->length == 0)
-        ret = 1;
-    else {
-        ret = a->length;
-        i = a->data[0];
-        if (ret == 1 && i == 0)
-            neg = 0;
-        if (!neg && (i > 127)) {
-            pad = 1;
-            pb = 0;
-        } else if (neg) {
-            if (i > 128) {
-                pad = 1;
-                pb = 0xFF;
-            } else if (i == 128) {
-                /*
-                 * Special case: if any other bytes non zero we pad:
-                 * otherwise we don't.
-                 */
-                for (i = 1; i < a->length; i++)
-                    if (a->data[i]) {
-                        pad = 1;
-                        pb = 0xFF;
-                        break;
-                    }
-            }
-        }
-        ret += pad;
-    }
-    if (pp == NULL)
-        return (ret);
-    p = *pp;
-
-    if (pad)
-        *(p++) = pb;
-    if (a->length == 0)
-        *(p++) = 0;
-    else if (!neg)
-        OPENSSL_memcpy(p, a->data, (unsigned int)a->length);
-    else {
-        /* Begin at the end of the encoding */
-        n = a->data + a->length - 1;
-        p += a->length - 1;
-        i = a->length;
-        /* Copy zeros to destination as long as source is zero */
-        while (!*n && i > 1) {
-            *(p--) = 0;
-            n--;
-            i--;
-        }
-        /* Complement and increment next octet */
-        *(p--) = ((*(n--)) ^ 0xff) + 1;
-        i--;
-        /* Complement any octets left */
-        for (; i > 0; i--)
-            *(p--) = *(n--) ^ 0xff;
-    }
-
-    *pp += ret;
-    return (ret);
-}
-
-/* Convert just ASN1 INTEGER content octets to ASN1_INTEGER structure */
-
-ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp,
-                               long len)
-{
-    ASN1_INTEGER *ret = NULL;
-    const unsigned char *p, *pend;
-    unsigned char *to, *s;
-    int i;
-
-    /*
-     * This function can handle lengths up to INT_MAX - 1, but the rest of the
-     * legacy ASN.1 code mixes integer types, so avoid exposing it to
-     * ASN1_INTEGERS with larger lengths.
-     */
-    if (len < 0 || len > INT_MAX / 2) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
-        return NULL;
-    }
-
-    if ((a == NULL) || ((*a) == NULL)) {
-        if ((ret = ASN1_INTEGER_new()) == NULL)
-            return (NULL);
-        ret->type = V_ASN1_INTEGER;
-    } else
-        ret = (*a);
-
-    p = *pp;
-    pend = p + len;
-
-    /*
-     * We must OPENSSL_malloc stuff, even for 0 bytes otherwise it signifies
-     * a missing NULL parameter.
-     */
-    s = (unsigned char *)OPENSSL_malloc((int)len + 1);
-    if (s == NULL) {
-        i = ERR_R_MALLOC_FAILURE;
-        goto err;
-    }
-    to = s;
-    if (!len) {
-        /*
-         * Strictly speaking this is an illegal INTEGER but we tolerate it.
-         */
-        ret->type = V_ASN1_INTEGER;
-    } else if (*p & 0x80) {     /* a negative number */
-        ret->type = V_ASN1_NEG_INTEGER;
-        if ((*p == 0xff) && (len != 1)) {
-            p++;
-            len--;
-        }
-        i = len;
-        p += i - 1;
-        to += i - 1;
-        while ((!*p) && i) {
-            *(to--) = 0;
-            i--;
-            p--;
-        }
-        /*
-         * Special case: if all zeros then the number will be of the form FF
-         * followed by n zero bytes: this corresponds to 1 followed by n zero
-         * bytes. We've already written n zeros so we just append an extra
-         * one and set the first byte to a 1. This is treated separately
-         * because it is the only case where the number of bytes is larger
-         * than len.
-         */
-        if (!i) {
-            *s = 1;
-            s[len] = 0;
-            len++;
-        } else {
-            *(to--) = (*(p--) ^ 0xff) + 1;
-            i--;
-            for (; i > 0; i--)
-                *(to--) = *(p--) ^ 0xff;
-        }
+  int ret = ASN1_STRING_cmp(x, y);
+  if (neg) {
+    // This could be |-ret|, but |ASN1_STRING_cmp| is not forbidden from
+    // returning |INT_MIN|.
+    if (ret < 0) {
+      return 1;
+    } else if (ret > 0) {
+      return -1;
     } else {
-        ret->type = V_ASN1_INTEGER;
-        if ((*p == 0) && (len != 1)) {
-            p++;
-            len--;
-        }
-        OPENSSL_memcpy(s, p, (int)len);
+      return 0;
     }
+  }
 
-    if (ret->data != NULL)
-        OPENSSL_free(ret->data);
-    ret->data = s;
-    ret->length = (int)len;
-    if (a != NULL)
-        (*a) = ret;
-    *pp = pend;
-    return (ret);
- err:
-    OPENSSL_PUT_ERROR(ASN1, i);
-    if ((ret != NULL) && ((a == NULL) || (*a != ret)))
-        ASN1_INTEGER_free(ret);
-    return (NULL);
+  return ret;
 }
 
-int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
-{
-    if (v >= 0) {
-        return ASN1_INTEGER_set_uint64(a, (uint64_t) v);
-    }
-
-    if (!ASN1_INTEGER_set_uint64(a, 0 - (uint64_t) v)) {
-        return 0;
-    }
-
-    a->type = V_ASN1_NEG_INTEGER;
-    return 1;
+// negate_twos_complement negates |len| bytes from |buf| in-place, interpreted
+// as a signed, big-endian two's complement value.
+static void negate_twos_complement(uint8_t *buf, size_t len) {
+  uint8_t borrow = 0;
+  for (size_t i = len - 1; i < len; i--) {
+    uint8_t t = buf[i];
+    buf[i] = 0u - borrow - t;
+    borrow |= t != 0;
+  }
 }
 
-int ASN1_INTEGER_set_uint64(ASN1_INTEGER *out, uint64_t v)
-{
-    uint8_t *const newdata = OPENSSL_malloc(sizeof(uint64_t));
-    if (newdata == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return 0;
+static int is_all_zeros(const uint8_t *in, size_t len) {
+  for (size_t i = 0; i < len; i++) {
+    if (in[i] != 0) {
+      return 0;
     }
-
-    OPENSSL_free(out->data);
-    out->data = newdata;
-    v = CRYPTO_bswap8(v);
-    memcpy(out->data, &v, sizeof(v));
-
-    out->type = V_ASN1_INTEGER;
-
-    size_t leading_zeros;
-    for (leading_zeros = 0; leading_zeros < sizeof(uint64_t) - 1;
-         leading_zeros++) {
-        if (out->data[leading_zeros] != 0) {
-            break;
-        }
-    }
-
-    out->length = sizeof(uint64_t) - leading_zeros;
-    OPENSSL_memmove(out->data, out->data + leading_zeros, out->length);
-
-    return 1;
+  }
+  return 1;
 }
 
-long ASN1_INTEGER_get(const ASN1_INTEGER *a)
-{
-    int neg = 0, i;
+int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) {
+  if (in == NULL) {
+    return 0;
+  }
 
-    if (a == NULL)
-        return (0L);
-    i = a->type;
-    if (i == V_ASN1_NEG_INTEGER)
-        neg = 1;
-    else if (i != V_ASN1_INTEGER)
-        return -1;
+  // |ASN1_INTEGER|s should be represented minimally, but it is possible to
+  // construct invalid ones. Skip leading zeros so this does not produce an
+  // invalid encoding or break invariants.
+  int start = 0;
+  while (start < in->length && in->data[start] == 0) {
+    start++;
+  }
 
-    OPENSSL_STATIC_ASSERT(sizeof(uint64_t) >= sizeof(long),
-                          "long larger than uint64_t");
+  int is_negative = (in->type & V_ASN1_NEG) != 0;
+  int pad;
+  if (start >= in->length) {
+    // Zero is represented as a single byte.
+    is_negative = 0;
+    pad = 1;
+  } else if (is_negative) {
+    // 0x80...01 through 0xff...ff have a two's complement of 0x7f...ff
+    // through 0x00...01 and need an extra byte to be negative.
+    // 0x01...00 through 0x80...00 have a two's complement of 0xfe...ff
+    // through 0x80...00 and can be negated as-is.
+    pad = in->data[start] > 0x80 ||
+          (in->data[start] == 0x80 &&
+           !is_all_zeros(in->data + start + 1, in->length - start - 1));
+  } else {
+    // If the high bit is set, the signed representation needs an extra
+    // byte to be positive.
+    pad = (in->data[start] & 0x80) != 0;
+  }
 
-    if (a->length > (int)sizeof(uint64_t)) {
-        /* hmm... a bit ugly, return all ones */
-        return -1;
-    }
+  if (in->length - start > INT_MAX - pad) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW);
+    return 0;
+  }
+  int len = pad + in->length - start;
+  assert(len > 0);
+  if (outp == NULL) {
+    return len;
+  }
 
-    uint64_t r64 = 0;
-    if (a->data != NULL) {
-      for (i = 0; i < a->length; i++) {
-          r64 <<= 8;
-          r64 |= (unsigned char)a->data[i];
-      }
-
-      if (r64 > LONG_MAX) {
-          return -1;
-      }
-    }
-
-    long r = (long) r64;
-    if (neg)
-        r = -r;
-
-    return r;
+  if (pad) {
+    (*outp)[0] = 0;
+  }
+  OPENSSL_memcpy(*outp + pad, in->data + start, in->length - start);
+  if (is_negative) {
+    negate_twos_complement(*outp, len);
+    assert((*outp)[0] >= 0x80);
+  } else {
+    assert((*outp)[0] < 0x80);
+  }
+  *outp += len;
+  return len;
 }
 
-ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai)
-{
-    ASN1_INTEGER *ret;
-    int len, j;
+ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **out, const unsigned char **inp,
+                               long len) {
+  // This function can handle lengths up to INT_MAX - 1, but the rest of the
+  // legacy ASN.1 code mixes integer types, so avoid exposing it to
+  // ASN1_INTEGERS with larger lengths.
+  if (len < 0 || len > INT_MAX / 2) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
+    return NULL;
+  }
 
-    if (ai == NULL)
-        ret = ASN1_INTEGER_new();
-    else
-        ret = ai;
+  CBS cbs;
+  CBS_init(&cbs, *inp, (size_t)len);
+  int is_negative;
+  if (!CBS_is_valid_asn1_integer(&cbs, &is_negative)) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_INTEGER);
+    return NULL;
+  }
+
+  ASN1_INTEGER *ret = NULL;
+  if (out == NULL || *out == NULL) {
+    ret = ASN1_INTEGER_new();
     if (ret == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-        goto err;
+      return NULL;
     }
-    if (BN_is_negative(bn) && !BN_is_zero(bn))
-        ret->type = V_ASN1_NEG_INTEGER;
-    else
-        ret->type = V_ASN1_INTEGER;
-    j = BN_num_bits(bn);
-    len = ((j == 0) ? 0 : ((j / 8) + 1));
-    if (ret->length < len + 4) {
-        unsigned char *new_data = OPENSSL_realloc(ret->data, len + 4);
-        if (!new_data) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        ret->data = new_data;
+  } else {
+    ret = *out;
+  }
+
+  // Convert to |ASN1_INTEGER|'s sign-and-magnitude representation. First,
+  // determine the size needed for a minimal result.
+  if (is_negative) {
+    // 0xff00...01 through 0xff7f..ff have a two's complement of 0x00ff...ff
+    // through 0x000100...001 and need one leading zero removed. 0x8000...00
+    // through 0xff00...00 have a two's complement of 0x8000...00 through
+    // 0x0100...00 and will be minimally-encoded as-is.
+    if (CBS_len(&cbs) > 0 && CBS_data(&cbs)[0] == 0xff &&
+        !is_all_zeros(CBS_data(&cbs) + 1, CBS_len(&cbs) - 1)) {
+      CBS_skip(&cbs, 1);
     }
-    ret->length = BN_bn2bin(bn, ret->data);
-    /* Correct zero case */
-    if (!ret->length) {
-        ret->data[0] = 0;
-        ret->length = 1;
+  } else {
+    // Remove the leading zero byte, if any.
+    if (CBS_len(&cbs) > 0 && CBS_data(&cbs)[0] == 0x00) {
+      CBS_skip(&cbs, 1);
     }
-    return (ret);
- err:
-    if (ret != ai)
-        ASN1_INTEGER_free(ret);
-    return (NULL);
+  }
+
+  if (!ASN1_STRING_set(ret, CBS_data(&cbs), CBS_len(&cbs))) {
+    goto err;
+  }
+
+  if (is_negative) {
+    ret->type = V_ASN1_NEG_INTEGER;
+    negate_twos_complement(ret->data, ret->length);
+  } else {
+    ret->type = V_ASN1_INTEGER;
+  }
+
+  // The value should be minimally-encoded.
+  assert(ret->length == 0 || ret->data[0] != 0);
+  // Zero is not negative.
+  assert(!is_negative || ret->length > 0);
+
+  *inp += len;
+  if (out != NULL) {
+    *out = ret;
+  }
+  return ret;
+
+err:
+  if (ret != NULL && (out == NULL || *out != ret)) {
+    ASN1_INTEGER_free(ret);
+  }
+  return NULL;
 }
 
-BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn)
-{
-    BIGNUM *ret;
+int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t v) {
+  if (v >= 0) {
+    return ASN1_INTEGER_set_uint64(a, (uint64_t)v);
+  }
 
-    if ((ret = BN_bin2bn(ai->data, ai->length, bn)) == NULL)
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BN_LIB);
-    else if (ai->type == V_ASN1_NEG_INTEGER)
-        BN_set_negative(ret, 1);
-    return (ret);
+  if (!ASN1_INTEGER_set_uint64(a, 0 - (uint64_t)v)) {
+    return 0;
+  }
+
+  a->type = V_ASN1_NEG_INTEGER;
+  return 1;
+}
+
+int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t v) {
+  if (v >= 0) {
+    return ASN1_ENUMERATED_set_uint64(a, (uint64_t)v);
+  }
+
+  if (!ASN1_ENUMERATED_set_uint64(a, 0 - (uint64_t)v)) {
+    return 0;
+  }
+
+  a->type = V_ASN1_NEG_ENUMERATED;
+  return 1;
+}
+
+int ASN1_INTEGER_set(ASN1_INTEGER *a, long v) {
+  static_assert(sizeof(long) <= sizeof(int64_t), "long fits in int64_t");
+  return ASN1_INTEGER_set_int64(a, v);
+}
+
+int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v) {
+  static_assert(sizeof(long) <= sizeof(int64_t), "long fits in int64_t");
+  return ASN1_ENUMERATED_set_int64(a, v);
+}
+
+static int asn1_string_set_uint64(ASN1_STRING *out, uint64_t v, int type) {
+  uint8_t buf[sizeof(uint64_t)];
+  CRYPTO_store_u64_be(buf, v);
+  size_t leading_zeros;
+  for (leading_zeros = 0; leading_zeros < sizeof(buf); leading_zeros++) {
+    if (buf[leading_zeros] != 0) {
+      break;
+    }
+  }
+
+  if (!ASN1_STRING_set(out, buf + leading_zeros, sizeof(buf) - leading_zeros)) {
+    return 0;
+  }
+  out->type = type;
+  return 1;
+}
+
+int ASN1_INTEGER_set_uint64(ASN1_INTEGER *out, uint64_t v) {
+  return asn1_string_set_uint64(out, v, V_ASN1_INTEGER);
+}
+
+int ASN1_ENUMERATED_set_uint64(ASN1_ENUMERATED *out, uint64_t v) {
+  return asn1_string_set_uint64(out, v, V_ASN1_ENUMERATED);
+}
+
+static int asn1_string_get_abs_uint64(uint64_t *out, const ASN1_STRING *a,
+                                      int type) {
+  if ((a->type & ~V_ASN1_NEG) != type) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_INTEGER_TYPE);
+    return 0;
+  }
+  uint8_t buf[sizeof(uint64_t)] = {0};
+  if (a->length > (int)sizeof(buf)) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_INTEGER);
+    return 0;
+  }
+  OPENSSL_memcpy(buf + sizeof(buf) - a->length, a->data, a->length);
+  *out = CRYPTO_load_u64_be(buf);
+  return 1;
+}
+
+static int asn1_string_get_uint64(uint64_t *out, const ASN1_STRING *a,
+                                  int type) {
+  if (!asn1_string_get_abs_uint64(out, a, type)) {
+    return 0;
+  }
+  if (a->type & V_ASN1_NEG) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_INTEGER);
+    return 0;
+  }
+  return 1;
+}
+
+int ASN1_INTEGER_get_uint64(uint64_t *out, const ASN1_INTEGER *a) {
+  return asn1_string_get_uint64(out, a, V_ASN1_INTEGER);
+}
+
+int ASN1_ENUMERATED_get_uint64(uint64_t *out, const ASN1_ENUMERATED *a) {
+  return asn1_string_get_uint64(out, a, V_ASN1_ENUMERATED);
+}
+
+static int asn1_string_get_int64(int64_t *out, const ASN1_STRING *a, int type) {
+  uint64_t v;
+  if (!asn1_string_get_abs_uint64(&v, a, type)) {
+    return 0;
+  }
+  int64_t i64;
+  int fits_in_i64;
+  // Check |v != 0| to handle manually-constructed negative zeros.
+  if ((a->type & V_ASN1_NEG) && v != 0) {
+    i64 = (int64_t)(0u - v);
+    fits_in_i64 = i64 < 0;
+  } else {
+    i64 = (int64_t)v;
+    fits_in_i64 = i64 >= 0;
+  }
+  if (!fits_in_i64) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_INTEGER);
+    return 0;
+  }
+  *out = i64;
+  return 1;
+}
+
+int ASN1_INTEGER_get_int64(int64_t *out, const ASN1_INTEGER *a) {
+  return asn1_string_get_int64(out, a, V_ASN1_INTEGER);
+}
+
+int ASN1_ENUMERATED_get_int64(int64_t *out, const ASN1_ENUMERATED *a) {
+  return asn1_string_get_int64(out, a, V_ASN1_ENUMERATED);
+}
+
+static long asn1_string_get_long(const ASN1_STRING *a, int type) {
+  if (a == NULL) {
+    return 0;
+  }
+
+  int64_t v;
+  if (!asn1_string_get_int64(&v, a, type) ||  //
+      v < LONG_MIN || v > LONG_MAX) {
+    // This function's return value does not distinguish overflow from -1.
+    ERR_clear_error();
+    return -1;
+  }
+
+  return (long)v;
+}
+
+long ASN1_INTEGER_get(const ASN1_INTEGER *a) {
+  return asn1_string_get_long(a, V_ASN1_INTEGER);
+}
+
+long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a) {
+  return asn1_string_get_long(a, V_ASN1_ENUMERATED);
+}
+
+static ASN1_STRING *bn_to_asn1_string(const BIGNUM *bn, ASN1_STRING *ai,
+                                      int type) {
+  ASN1_INTEGER *ret;
+  if (ai == NULL) {
+    ret = ASN1_STRING_type_new(type);
+  } else {
+    ret = ai;
+  }
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+    goto err;
+  }
+
+  if (BN_is_negative(bn) && !BN_is_zero(bn)) {
+    ret->type = type | V_ASN1_NEG;
+  } else {
+    ret->type = type;
+  }
+
+  int len = BN_num_bytes(bn);
+  if (!ASN1_STRING_set(ret, NULL, len) ||
+      !BN_bn2bin_padded(ret->data, len, bn)) {
+    goto err;
+  }
+  return ret;
+
+err:
+  if (ret != ai) {
+    ASN1_STRING_free(ret);
+  }
+  return NULL;
+}
+
+ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai) {
+  return bn_to_asn1_string(bn, ai, V_ASN1_INTEGER);
+}
+
+ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai) {
+  return bn_to_asn1_string(bn, ai, V_ASN1_ENUMERATED);
+}
+
+static BIGNUM *asn1_string_to_bn(const ASN1_STRING *ai, BIGNUM *bn, int type) {
+  if ((ai->type & ~V_ASN1_NEG) != type) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_INTEGER_TYPE);
+    return NULL;
+  }
+
+  BIGNUM *ret;
+  if ((ret = BN_bin2bn(ai->data, ai->length, bn)) == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_BN_LIB);
+  } else if (ai->type & V_ASN1_NEG) {
+    BN_set_negative(ret, 1);
+  }
+  return ret;
+}
+
+BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn) {
+  return asn1_string_to_bn(ai, bn, V_ASN1_INTEGER);
+}
+
+BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn) {
+  return asn1_string_to_bn(ai, bn, V_ASN1_ENUMERATED);
 }
diff --git a/src/crypto/asn1/a_mbstr.c b/src/crypto/asn1/a_mbstr.c
index 5853b72..c53d6d5 100644
--- a/src/crypto/asn1/a_mbstr.c
+++ b/src/crypto/asn1/a_mbstr.c
@@ -63,22 +63,19 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-#include "internal.h"
 #include "../bytestring/internal.h"
+#include "internal.h"
 
-/*
- * These functions take a string in UTF8, ASCII or multibyte form and a mask
- * of permissible ASN1 string types. It then works out the minimal type
- * (using the order Printable < IA5 < T61 < BMP < Universal < UTF8) and
- * creates a string of the correct type with the supplied data. Yes this is
- * horrible: it has to be :-( The 'ncopy' form checks minimum and maximum
- * size limits too.
- */
+// These functions take a string in UTF8, ASCII or multibyte form and a mask
+// of permissible ASN1 string types. It then works out the minimal type
+// (using the order Printable < IA5 < T61 < BMP < Universal < UTF8) and
+// creates a string of the correct type with the supplied data. Yes this is
+// horrible: it has to be :-( The 'ncopy' form checks minimum and maximum
+// size limits too.
 
 int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len,
-                       int inform, unsigned long mask)
-{
-    return ASN1_mbstring_ncopy(out, in, len, inform, mask, 0, 0);
+                       int inform, unsigned long mask) {
+  return ASN1_mbstring_ncopy(out, in, len, inform, mask, 0, 0);
 }
 
 OPENSSL_DECLARE_ERROR_REASON(ASN1, INVALID_BMPSTRING)
@@ -86,213 +83,211 @@
 OPENSSL_DECLARE_ERROR_REASON(ASN1, INVALID_UTF8STRING)
 
 int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
-                        int inform, unsigned long mask,
-                        long minsize, long maxsize)
-{
-    int str_type;
-    char free_out;
-    ASN1_STRING *dest;
-    size_t nchar = 0;
-    char strbuf[32];
-    if (len == -1)
-        len = strlen((const char *)in);
-    if (!mask)
-        mask = DIRSTRING_TYPE;
+                        int inform, unsigned long mask, long minsize,
+                        long maxsize) {
+  int str_type;
+  char free_out;
+  ASN1_STRING *dest;
+  size_t nchar = 0;
+  char strbuf[32];
+  if (len == -1) {
+    len = strlen((const char *)in);
+  }
+  if (!mask) {
+    mask = DIRSTRING_TYPE;
+  }
 
-    int (*decode_func)(CBS *, uint32_t*);
-    int error;
-    switch (inform) {
+  int (*decode_func)(CBS *, uint32_t *);
+  int error;
+  switch (inform) {
     case MBSTRING_BMP:
-        decode_func = cbs_get_ucs2_be;
-        error = ASN1_R_INVALID_BMPSTRING;
-        break;
+      decode_func = cbs_get_ucs2_be;
+      error = ASN1_R_INVALID_BMPSTRING;
+      break;
 
     case MBSTRING_UNIV:
-        decode_func = cbs_get_utf32_be;
-        error = ASN1_R_INVALID_UNIVERSALSTRING;
-        break;
+      decode_func = cbs_get_utf32_be;
+      error = ASN1_R_INVALID_UNIVERSALSTRING;
+      break;
 
     case MBSTRING_UTF8:
-        decode_func = cbs_get_utf8;
-        error = ASN1_R_INVALID_UTF8STRING;
-        break;
+      decode_func = cbs_get_utf8;
+      error = ASN1_R_INVALID_UTF8STRING;
+      break;
 
     case MBSTRING_ASC:
-        decode_func = cbs_get_latin1;
-        error = ERR_R_INTERNAL_ERROR;  // Latin-1 inputs are never invalid.
-        break;
+      decode_func = cbs_get_latin1;
+      error = ERR_R_INTERNAL_ERROR;  // Latin-1 inputs are never invalid.
+      break;
 
     default:
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
-        return -1;
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
+      return -1;
+  }
+
+  // Check |minsize| and |maxsize| and work out the minimal type, if any.
+  CBS cbs;
+  CBS_init(&cbs, in, len);
+  size_t utf8_len = 0;
+  while (CBS_len(&cbs) != 0) {
+    uint32_t c;
+    if (!decode_func(&cbs, &c)) {
+      OPENSSL_PUT_ERROR(ASN1, error);
+      return -1;
+    }
+    if (nchar == 0 && (inform == MBSTRING_BMP || inform == MBSTRING_UNIV) &&
+        c == 0xfeff) {
+      // Reject byte-order mark. We could drop it but that would mean
+      // adding ambiguity around whether a BOM was included or not when
+      // matching strings.
+      //
+      // For a little-endian UCS-2 string, the BOM will appear as 0xfffe
+      // and will be rejected as noncharacter, below.
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
+      return -1;
     }
 
-    /* Check |minsize| and |maxsize| and work out the minimal type, if any. */
-    CBS cbs;
-    CBS_init(&cbs, in, len);
-    size_t utf8_len = 0;
-    while (CBS_len(&cbs) != 0) {
-        uint32_t c;
-        if (!decode_func(&cbs, &c)) {
-            OPENSSL_PUT_ERROR(ASN1, error);
-            return -1;
-        }
-        if (nchar == 0 &&
-            (inform == MBSTRING_BMP || inform == MBSTRING_UNIV) &&
-            c == 0xfeff) {
-            /* Reject byte-order mark. We could drop it but that would mean
-             * adding ambiguity around whether a BOM was included or not when
-             * matching strings.
-             *
-             * For a little-endian UCS-2 string, the BOM will appear as 0xfffe
-             * and will be rejected as noncharacter, below. */
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
-            return -1;
-        }
-
-        /* Update which output formats are still possible. */
-        if ((mask & B_ASN1_PRINTABLESTRING) && !asn1_is_printable(c)) {
-            mask &= ~B_ASN1_PRINTABLESTRING;
-        }
-        if ((mask & B_ASN1_IA5STRING) && (c > 127)) {
-            mask &= ~B_ASN1_IA5STRING;
-        }
-        if ((mask & B_ASN1_T61STRING) && (c > 0xff)) {
-            mask &= ~B_ASN1_T61STRING;
-        }
-        if ((mask & B_ASN1_BMPSTRING) && (c > 0xffff)) {
-            mask &= ~B_ASN1_BMPSTRING;
-        }
-        if (!mask) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
-            return -1;
-        }
-
-        nchar++;
-        utf8_len += cbb_get_utf8_len(c);
+    // Update which output formats are still possible.
+    if ((mask & B_ASN1_PRINTABLESTRING) && !asn1_is_printable(c)) {
+      mask &= ~B_ASN1_PRINTABLESTRING;
+    }
+    if ((mask & B_ASN1_IA5STRING) && (c > 127)) {
+      mask &= ~B_ASN1_IA5STRING;
+    }
+    if ((mask & B_ASN1_T61STRING) && (c > 0xff)) {
+      mask &= ~B_ASN1_T61STRING;
+    }
+    if ((mask & B_ASN1_BMPSTRING) && (c > 0xffff)) {
+      mask &= ~B_ASN1_BMPSTRING;
+    }
+    if (!mask) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
+      return -1;
     }
 
-    if (minsize > 0 && nchar < (size_t)minsize) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT);
-        BIO_snprintf(strbuf, sizeof strbuf, "%ld", minsize);
-        ERR_add_error_data(2, "minsize=", strbuf);
-        return -1;
-    }
+    nchar++;
+    utf8_len += cbb_get_utf8_len(c);
+  }
 
-    if (maxsize > 0 && nchar > (size_t)maxsize) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG);
-        BIO_snprintf(strbuf, sizeof strbuf, "%ld", maxsize);
-        ERR_add_error_data(2, "maxsize=", strbuf);
-        return -1;
-    }
-
-    /* Now work out output format and string type */
-    int (*encode_func)(CBB *, uint32_t) = cbb_add_latin1;
-    size_t size_estimate = nchar;
-    int outform = MBSTRING_ASC;
-    if (mask & B_ASN1_PRINTABLESTRING) {
-        str_type = V_ASN1_PRINTABLESTRING;
-    } else if (mask & B_ASN1_IA5STRING) {
-        str_type = V_ASN1_IA5STRING;
-    } else if (mask & B_ASN1_T61STRING) {
-        str_type = V_ASN1_T61STRING;
-    } else if (mask & B_ASN1_BMPSTRING) {
-        str_type = V_ASN1_BMPSTRING;
-        outform = MBSTRING_BMP;
-        encode_func = cbb_add_ucs2_be;
-        size_estimate = 2 * nchar;
-    } else if (mask & B_ASN1_UNIVERSALSTRING) {
-        str_type = V_ASN1_UNIVERSALSTRING;
-        encode_func = cbb_add_utf32_be;
-        size_estimate = 4 * nchar;
-        outform = MBSTRING_UNIV;
-    } else if (mask & B_ASN1_UTF8STRING) {
-        str_type = V_ASN1_UTF8STRING;
-        outform = MBSTRING_UTF8;
-        encode_func = cbb_add_utf8;
-        size_estimate = utf8_len;
-    } else {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
-        return -1;
-    }
-
-    if (!out)
-        return str_type;
-    if (*out) {
-        free_out = 0;
-        dest = *out;
-        if (dest->data) {
-            dest->length = 0;
-            OPENSSL_free(dest->data);
-            dest->data = NULL;
-        }
-        dest->type = str_type;
-    } else {
-        free_out = 1;
-        dest = ASN1_STRING_type_new(str_type);
-        if (!dest) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return -1;
-        }
-        *out = dest;
-    }
-
-    /* If both the same type just copy across */
-    if (inform == outform) {
-        if (!ASN1_STRING_set(dest, in, len)) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return -1;
-        }
-        return str_type;
-    }
-
-    CBB cbb;
-    if (!CBB_init(&cbb, size_estimate + 1)) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    CBS_init(&cbs, in, len);
-    while (CBS_len(&cbs) != 0) {
-        uint32_t c;
-        if (!decode_func(&cbs, &c) ||
-            !encode_func(&cbb, c)) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
-            goto err;
-        }
-    }
-    uint8_t *data = NULL;
-    size_t data_len;
-    if (/* OpenSSL historically NUL-terminated this value with a single byte,
-         * even for |MBSTRING_BMP| and |MBSTRING_UNIV|. */
-        !CBB_add_u8(&cbb, 0) ||
-        !CBB_finish(&cbb, &data, &data_len) ||
-        data_len < 1 ||
-        data_len > INT_MAX) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
-        OPENSSL_free(data);
-        goto err;
-    }
-    dest->length = (int)(data_len - 1);
-    dest->data = data;
-    return str_type;
-
- err:
-    if (free_out)
-        ASN1_STRING_free(dest);
-    CBB_cleanup(&cbb);
+  if (minsize > 0 && nchar < (size_t)minsize) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT);
+    BIO_snprintf(strbuf, sizeof strbuf, "%ld", minsize);
+    ERR_add_error_data(2, "minsize=", strbuf);
     return -1;
+  }
+
+  if (maxsize > 0 && nchar > (size_t)maxsize) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG);
+    BIO_snprintf(strbuf, sizeof strbuf, "%ld", maxsize);
+    ERR_add_error_data(2, "maxsize=", strbuf);
+    return -1;
+  }
+
+  // Now work out output format and string type
+  int (*encode_func)(CBB *, uint32_t) = cbb_add_latin1;
+  size_t size_estimate = nchar;
+  int outform = MBSTRING_ASC;
+  if (mask & B_ASN1_PRINTABLESTRING) {
+    str_type = V_ASN1_PRINTABLESTRING;
+  } else if (mask & B_ASN1_IA5STRING) {
+    str_type = V_ASN1_IA5STRING;
+  } else if (mask & B_ASN1_T61STRING) {
+    str_type = V_ASN1_T61STRING;
+  } else if (mask & B_ASN1_BMPSTRING) {
+    str_type = V_ASN1_BMPSTRING;
+    outform = MBSTRING_BMP;
+    encode_func = cbb_add_ucs2_be;
+    size_estimate = 2 * nchar;
+  } else if (mask & B_ASN1_UNIVERSALSTRING) {
+    str_type = V_ASN1_UNIVERSALSTRING;
+    encode_func = cbb_add_utf32_be;
+    size_estimate = 4 * nchar;
+    outform = MBSTRING_UNIV;
+  } else if (mask & B_ASN1_UTF8STRING) {
+    str_type = V_ASN1_UTF8STRING;
+    outform = MBSTRING_UTF8;
+    encode_func = cbb_add_utf8;
+    size_estimate = utf8_len;
+  } else {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
+    return -1;
+  }
+
+  if (!out) {
+    return str_type;
+  }
+  if (*out) {
+    free_out = 0;
+    dest = *out;
+    if (dest->data) {
+      dest->length = 0;
+      OPENSSL_free(dest->data);
+      dest->data = NULL;
+    }
+    dest->type = str_type;
+  } else {
+    free_out = 1;
+    dest = ASN1_STRING_type_new(str_type);
+    if (!dest) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return -1;
+    }
+    *out = dest;
+  }
+
+  // If both the same type just copy across
+  if (inform == outform) {
+    if (!ASN1_STRING_set(dest, in, len)) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return -1;
+    }
+    return str_type;
+  }
+
+  CBB cbb;
+  if (!CBB_init(&cbb, size_estimate + 1)) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  CBS_init(&cbs, in, len);
+  while (CBS_len(&cbs) != 0) {
+    uint32_t c;
+    if (!decode_func(&cbs, &c) || !encode_func(&cbb, c)) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
+      goto err;
+    }
+  }
+  uint8_t *data = NULL;
+  size_t data_len;
+  if (// OpenSSL historically NUL-terminated this value with a single byte,
+      // even for |MBSTRING_BMP| and |MBSTRING_UNIV|.
+      !CBB_add_u8(&cbb, 0) || !CBB_finish(&cbb, &data, &data_len) ||
+      data_len < 1 || data_len > INT_MAX) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
+    OPENSSL_free(data);
+    goto err;
+  }
+  dest->length = (int)(data_len - 1);
+  dest->data = data;
+  return str_type;
+
+err:
+  if (free_out) {
+    ASN1_STRING_free(dest);
+  }
+  CBB_cleanup(&cbb);
+  return -1;
 }
 
-int asn1_is_printable(uint32_t value)
-{
-    if (value > 0x7f) {
-        return 0;
-    }
-    /* Note we cannot use |isalnum| because it is locale-dependent. */
-    return ('a' <= value && value <= 'z') ||  //
-           ('A' <= value && value <= 'Z') ||  //
-           ('0' <= value && value <= '9') ||  //
-           value == ' ' || value == '\'' || value == '(' || value == ')' ||
-           value == '+' || value == ',' || value == '-' || value == '.' ||
-           value == '/' || value == ':' || value == '=' || value == '?';
+int asn1_is_printable(uint32_t value) {
+  if (value > 0x7f) {
+    return 0;
+  }
+  // Note we cannot use |isalnum| because it is locale-dependent.
+  return ('a' <= value && value <= 'z') ||  //
+         ('A' <= value && value <= 'Z') ||  //
+         ('0' <= value && value <= '9') ||  //
+         value == ' ' || value == '\'' || value == '(' || value == ')' ||
+         value == '+' || value == ',' || value == '-' || value == '.' ||
+         value == '/' || value == ':' || value == '=' || value == '?';
 }
diff --git a/src/crypto/asn1/a_object.c b/src/crypto/asn1/a_object.c
index 30a656d..c854fb8 100644
--- a/src/crypto/asn1/a_object.c
+++ b/src/crypto/asn1/a_object.c
@@ -67,233 +67,224 @@
 #include "internal.h"
 
 
-int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp)
-{
-    if (a == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_PASSED_NULL_PARAMETER);
-        return -1;
-    }
+int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp) {
+  if (a == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_PASSED_NULL_PARAMETER);
+    return -1;
+  }
 
-    if (a->length == 0) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
-        return -1;
-    }
+  if (a->length == 0) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
+    return -1;
+  }
 
-    int objsize = ASN1_object_size(0, a->length, V_ASN1_OBJECT);
-    if (pp == NULL || objsize == -1) {
-        return objsize;
-    }
-
-    unsigned char *p, *allocated = NULL;
-    if (*pp == NULL) {
-        if ((p = allocated = OPENSSL_malloc(objsize)) == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return -1;
-        }
-    } else {
-        p = *pp;
-    }
-
-    ASN1_put_object(&p, 0, a->length, V_ASN1_OBJECT, V_ASN1_UNIVERSAL);
-    OPENSSL_memcpy(p, a->data, a->length);
-
-    /*
-     * If a new buffer was allocated, just return it back.
-     * If not, return the incremented buffer pointer.
-     */
-    *pp = allocated != NULL ? allocated : p + a->length;
+  int objsize = ASN1_object_size(0, a->length, V_ASN1_OBJECT);
+  if (pp == NULL || objsize == -1) {
     return objsize;
+  }
+
+  unsigned char *p, *allocated = NULL;
+  if (*pp == NULL) {
+    if ((p = allocated = OPENSSL_malloc(objsize)) == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return -1;
+    }
+  } else {
+    p = *pp;
+  }
+
+  ASN1_put_object(&p, 0, a->length, V_ASN1_OBJECT, V_ASN1_UNIVERSAL);
+  OPENSSL_memcpy(p, a->data, a->length);
+
+  // If a new buffer was allocated, just return it back.
+  // If not, return the incremented buffer pointer.
+  *pp = allocated != NULL ? allocated : p + a->length;
+  return objsize;
 }
 
-int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a)
-{
-    return OBJ_obj2txt(buf, buf_len, a, 0);
+int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a) {
+  return OBJ_obj2txt(buf, buf_len, a, 0);
 }
 
-static int write_str(BIO *bp, const char *str)
-{
-    int len = strlen(str);
-    return BIO_write(bp, str, len) == len ? len : -1;
+static int write_str(BIO *bp, const char *str) {
+  int len = strlen(str);
+  return BIO_write(bp, str, len) == len ? len : -1;
 }
 
-int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a)
-{
-    if (a == NULL || a->data == NULL) {
-        return write_str(bp, "NULL");
-    }
+int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a) {
+  if (a == NULL || a->data == NULL) {
+    return write_str(bp, "NULL");
+  }
 
-    char buf[80], *allocated = NULL;
-    const char *str = buf;
-    int len = i2t_ASN1_OBJECT(buf, sizeof(buf), a);
-    if (len > (int)sizeof(buf) - 1) {
-        /* The input was truncated. Allocate a buffer that fits. */
-        allocated = OPENSSL_malloc(len + 1);
-        if (allocated == NULL) {
-            return -1;
-        }
-        len = i2t_ASN1_OBJECT(allocated, len + 1, a);
-        str = allocated;
+  char buf[80], *allocated = NULL;
+  const char *str = buf;
+  int len = i2t_ASN1_OBJECT(buf, sizeof(buf), a);
+  if (len > (int)sizeof(buf) - 1) {
+    // The input was truncated. Allocate a buffer that fits.
+    allocated = OPENSSL_malloc(len + 1);
+    if (allocated == NULL) {
+      return -1;
     }
-    if (len <= 0) {
-        str = "<INVALID>";
-    }
+    len = i2t_ASN1_OBJECT(allocated, len + 1, a);
+    str = allocated;
+  }
+  if (len <= 0) {
+    str = "<INVALID>";
+  }
 
-    int ret = write_str(bp, str);
-    OPENSSL_free(allocated);
-    return ret;
+  int ret = write_str(bp, str);
+  OPENSSL_free(allocated);
+  return ret;
 }
 
 ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
-                             long length)
-{
-    long len;
-    int tag, xclass;
-    const unsigned char *p = *pp;
-    int inf = ASN1_get_object(&p, &len, &tag, &xclass, length);
-    if (inf & 0x80) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
-        return NULL;
-    }
+                             long length) {
+  long len;
+  int tag, xclass;
+  const unsigned char *p = *pp;
+  int inf = ASN1_get_object(&p, &len, &tag, &xclass, length);
+  if (inf & 0x80) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
+    return NULL;
+  }
 
-    if (inf & V_ASN1_CONSTRUCTED) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
-        return NULL;
-    }
+  if (inf & V_ASN1_CONSTRUCTED) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
+    return NULL;
+  }
 
-    if (tag != V_ASN1_OBJECT || xclass != V_ASN1_UNIVERSAL) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_AN_OBJECT);
-        return NULL;
-    }
-    ASN1_OBJECT *ret = c2i_ASN1_OBJECT(a, &p, len);
-    if (ret) {
-        *pp = p;
-    }
-    return ret;
+  if (tag != V_ASN1_OBJECT || xclass != V_ASN1_UNIVERSAL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_AN_OBJECT);
+    return NULL;
+  }
+  ASN1_OBJECT *ret = c2i_ASN1_OBJECT(a, &p, len);
+  if (ret) {
+    *pp = p;
+  }
+  return ret;
 }
 
 ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
-                             long len)
-{
-    ASN1_OBJECT *ret = NULL;
-    const unsigned char *p;
-    unsigned char *data;
-    int i, length;
+                             long len) {
+  ASN1_OBJECT *ret = NULL;
+  const unsigned char *p;
+  unsigned char *data;
+  int i, length;
 
-    /*
-     * Sanity check OID encoding. Need at least one content octet. MSB must
-     * be clear in the last octet. can't have leading 0x80 in subidentifiers,
-     * see: X.690 8.19.2
-     */
-    if (len <= 0 || len > INT_MAX || pp == NULL || (p = *pp) == NULL ||
-        p[len - 1] & 0x80) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
-        return NULL;
+  // Sanity check OID encoding. Need at least one content octet. MSB must
+  // be clear in the last octet. can't have leading 0x80 in subidentifiers,
+  // see: X.690 8.19.2
+  if (len <= 0 || len > INT_MAX || pp == NULL || (p = *pp) == NULL ||
+      p[len - 1] & 0x80) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
+    return NULL;
+  }
+  // Now 0 < len <= INT_MAX, so the cast is safe.
+  length = (int)len;
+  for (i = 0; i < length; i++, p++) {
+    if (*p == 0x80 && (!i || !(p[-1] & 0x80))) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
+      return NULL;
     }
-    /* Now 0 < len <= INT_MAX, so the cast is safe. */
-    length = (int)len;
-    for (i = 0; i < length; i++, p++) {
-        if (*p == 0x80 && (!i || !(p[-1] & 0x80))) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
-            return NULL;
-        }
-    }
+  }
 
-    if ((a == NULL) || ((*a) == NULL) ||
-        !((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) {
-        if ((ret = ASN1_OBJECT_new()) == NULL)
-            return (NULL);
-    } else {
-        ret = (*a);
+  if ((a == NULL) || ((*a) == NULL) ||
+      !((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) {
+    if ((ret = ASN1_OBJECT_new()) == NULL) {
+      return NULL;
     }
+  } else {
+    ret = (*a);
+  }
 
-    p = *pp;
-    /* detach data from object */
-    data = (unsigned char *)ret->data;
-    ret->data = NULL;
-    /* once detached we can change it */
-    if ((data == NULL) || (ret->length < length)) {
-        ret->length = 0;
-        if (data != NULL)
-            OPENSSL_free(data);
-        data = (unsigned char *)OPENSSL_malloc(length);
-        if (data == NULL) {
-            i = ERR_R_MALLOC_FAILURE;
-            goto err;
-        }
-        ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
-    }
-    OPENSSL_memcpy(data, p, length);
-    /* If there are dynamic strings, free them here, and clear the flag */
-    if ((ret->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) != 0) {
-        OPENSSL_free((char *)ret->sn);
-        OPENSSL_free((char *)ret->ln);
-        ret->flags &= ~ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
-    }
-    /* reattach data to object, after which it remains const */
-    ret->data = data;
-    ret->length = length;
-    ret->sn = NULL;
-    ret->ln = NULL;
-    p += length;
-
-    if (a != NULL)
-        (*a) = ret;
-    *pp = p;
-    return (ret);
- err:
-    OPENSSL_PUT_ERROR(ASN1, i);
-    if ((ret != NULL) && ((a == NULL) || (*a != ret)))
-        ASN1_OBJECT_free(ret);
-    return (NULL);
-}
-
-ASN1_OBJECT *ASN1_OBJECT_new(void)
-{
-    ASN1_OBJECT *ret;
-
-    ret = (ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT));
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return (NULL);
-    }
+  p = *pp;
+  // detach data from object
+  data = (unsigned char *)ret->data;
+  ret->data = NULL;
+  // once detached we can change it
+  if ((data == NULL) || (ret->length < length)) {
     ret->length = 0;
-    ret->data = NULL;
-    ret->nid = 0;
-    ret->sn = NULL;
-    ret->ln = NULL;
-    ret->flags = ASN1_OBJECT_FLAG_DYNAMIC;
-    return (ret);
+    OPENSSL_free(data);
+    data = (unsigned char *)OPENSSL_malloc(length);
+    if (data == NULL) {
+      i = ERR_R_MALLOC_FAILURE;
+      goto err;
+    }
+    ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
+  }
+  OPENSSL_memcpy(data, p, length);
+  // If there are dynamic strings, free them here, and clear the flag
+  if ((ret->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) != 0) {
+    OPENSSL_free((char *)ret->sn);
+    OPENSSL_free((char *)ret->ln);
+    ret->flags &= ~ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
+  }
+  // reattach data to object, after which it remains const
+  ret->data = data;
+  ret->length = length;
+  ret->sn = NULL;
+  ret->ln = NULL;
+  p += length;
+
+  if (a != NULL) {
+    (*a) = ret;
+  }
+  *pp = p;
+  return ret;
+err:
+  OPENSSL_PUT_ERROR(ASN1, i);
+  if ((ret != NULL) && ((a == NULL) || (*a != ret))) {
+    ASN1_OBJECT_free(ret);
+  }
+  return NULL;
 }
 
-void ASN1_OBJECT_free(ASN1_OBJECT *a)
-{
-    if (a == NULL)
-        return;
-    if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) {
-        OPENSSL_free((void *)a->sn);
-        OPENSSL_free((void *)a->ln);
-        a->sn = a->ln = NULL;
-    }
-    if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA) {
-        OPENSSL_free((void *)a->data);
-        a->data = NULL;
-        a->length = 0;
-    }
-    if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC)
-        OPENSSL_free(a);
+ASN1_OBJECT *ASN1_OBJECT_new(void) {
+  ASN1_OBJECT *ret;
+
+  ret = (ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT));
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  ret->length = 0;
+  ret->data = NULL;
+  ret->nid = 0;
+  ret->sn = NULL;
+  ret->ln = NULL;
+  ret->flags = ASN1_OBJECT_FLAG_DYNAMIC;
+  return ret;
+}
+
+void ASN1_OBJECT_free(ASN1_OBJECT *a) {
+  if (a == NULL) {
+    return;
+  }
+  if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) {
+    OPENSSL_free((void *)a->sn);
+    OPENSSL_free((void *)a->ln);
+    a->sn = a->ln = NULL;
+  }
+  if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA) {
+    OPENSSL_free((void *)a->data);
+    a->data = NULL;
+    a->length = 0;
+  }
+  if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC) {
+    OPENSSL_free(a);
+  }
 }
 
 ASN1_OBJECT *ASN1_OBJECT_create(int nid, const unsigned char *data, int len,
-                                const char *sn, const char *ln)
-{
-    ASN1_OBJECT o;
+                                const char *sn, const char *ln) {
+  ASN1_OBJECT o;
 
-    o.sn = sn;
-    o.ln = ln;
-    o.data = data;
-    o.nid = nid;
-    o.length = len;
-    o.flags = ASN1_OBJECT_FLAG_DYNAMIC | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS |
-        ASN1_OBJECT_FLAG_DYNAMIC_DATA;
-    return (OBJ_dup(&o));
+  o.sn = sn;
+  o.ln = ln;
+  o.data = data;
+  o.nid = nid;
+  o.length = len;
+  o.flags = ASN1_OBJECT_FLAG_DYNAMIC | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS |
+            ASN1_OBJECT_FLAG_DYNAMIC_DATA;
+  return (OBJ_dup(&o));
 }
diff --git a/src/crypto/asn1/a_octet.c b/src/crypto/asn1/a_octet.c
index 312993b..f9c3379 100644
--- a/src/crypto/asn1/a_octet.c
+++ b/src/crypto/asn1/a_octet.c
@@ -59,19 +59,16 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *x)
-{
-    return ASN1_STRING_dup(x);
+ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *x) {
+  return ASN1_STRING_dup(x);
 }
 
 int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a,
-                          const ASN1_OCTET_STRING *b)
-{
-    return ASN1_STRING_cmp(a, b);
+                          const ASN1_OCTET_STRING *b) {
+  return ASN1_STRING_cmp(a, b);
 }
 
 int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *x, const unsigned char *d,
-                          int len)
-{
-    return ASN1_STRING_set(x, d, len);
+                          int len) {
+  return ASN1_STRING_set(x, d, len);
 }
diff --git a/src/crypto/asn1/a_print.c b/src/crypto/asn1/a_print.c
index c7efede..a5be164 100644
--- a/src/crypto/asn1/a_print.c
+++ b/src/crypto/asn1/a_print.c
@@ -61,23 +61,22 @@
 #include "internal.h"
 
 
-int ASN1_PRINTABLE_type(const unsigned char *s, int len)
-{
-    if (len < 0) {
-        len = strlen((const char *)s);
-    }
+int ASN1_PRINTABLE_type(const unsigned char *s, int len) {
+  if (len < 0) {
+    len = strlen((const char *)s);
+  }
 
-    int printable = 1;
-    for (int i = 0; i < len; i++) {
-        unsigned char c = s[i];
-        if (c & 0x80) {
-            /* No need to continue iterating. */
-            return V_ASN1_T61STRING;
-        }
-        if (!asn1_is_printable(c)) {
-            printable = 0;
-        }
+  int printable = 1;
+  for (int i = 0; i < len; i++) {
+    unsigned char c = s[i];
+    if (c & 0x80) {
+      // No need to continue iterating.
+      return V_ASN1_T61STRING;
     }
+    if (!asn1_is_printable(c)) {
+      printable = 0;
+    }
+  }
 
-    return printable ? V_ASN1_PRINTABLESTRING : V_ASN1_IA5STRING;
+  return printable ? V_ASN1_PRINTABLESTRING : V_ASN1_IA5STRING;
 }
diff --git a/src/crypto/asn1/a_strex.c b/src/crypto/asn1/a_strex.c
index 7829d67..fd08b02 100644
--- a/src/crypto/asn1/a_strex.c
+++ b/src/crypto/asn1/a_strex.c
@@ -56,595 +56,408 @@
 
 #include <openssl/asn1.h>
 
+#include <assert.h>
 #include <ctype.h>
 #include <inttypes.h>
 #include <string.h>
+#include <time.h>
 
 #include <openssl/bio.h>
+#include <openssl/bytestring.h>
 #include <openssl/mem.h>
 
-#include "charmap.h"
+#include "../bytestring/internal.h"
 #include "internal.h"
 
 
-// These flags must be distinct from |ESC_FLAGS| and fit in a byte.
+#define ESC_FLAGS                                                           \
+  (ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_QUOTE | ASN1_STRFLGS_ESC_CTRL | \
+   ASN1_STRFLGS_ESC_MSB)
 
-// Character is a valid PrintableString character
-#define CHARTYPE_PRINTABLESTRING 0x10
-// Character needs escaping if it is the first character
-#define CHARTYPE_FIRST_ESC_2253 0x20
-// Character needs escaping if it is the last character
-#define CHARTYPE_LAST_ESC_2253 0x40
-
-#define CHARTYPE_BS_ESC         (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253)
-
-#define ESC_FLAGS (ASN1_STRFLGS_ESC_2253 | \
-                  ASN1_STRFLGS_ESC_QUOTE | \
-                  ASN1_STRFLGS_ESC_CTRL | \
-                  ASN1_STRFLGS_ESC_MSB)
-
-static int maybe_write(BIO *out, const void *buf, int len)
-{
-    /* If |out| is NULL, ignore the output but report the length. */
-    return out == NULL || BIO_write(out, buf, len) == len;
+static int maybe_write(BIO *out, const void *buf, int len) {
+  // If |out| is NULL, ignore the output but report the length.
+  return out == NULL || BIO_write(out, buf, len) == len;
 }
 
-/*
- * This function handles display of strings, one character at a time. It is
- * passed an unsigned long for each character because it could come from 2 or
- * even 4 byte forms.
- */
+static int is_control_character(unsigned char c) { return c < 32 || c == 127; }
 
-#define HEX_SIZE(type) (sizeof(type)*2)
-
-static int do_esc_char(uint32_t c, unsigned char flags, char *do_quotes,
-                       BIO *out)
-{
-    unsigned char chflgs, chtmp;
-    char tmphex[HEX_SIZE(uint32_t) + 3];
-
-    if (c > 0xffff) {
-        BIO_snprintf(tmphex, sizeof tmphex, "\\W%08" PRIX32, c);
-        if (!maybe_write(out, tmphex, 10))
-            return -1;
-        return 10;
-    }
-    if (c > 0xff) {
-        BIO_snprintf(tmphex, sizeof tmphex, "\\U%04" PRIX32, c);
-        if (!maybe_write(out, tmphex, 6))
-            return -1;
-        return 6;
-    }
-    chtmp = (unsigned char)c;
-    if (chtmp > 0x7f)
-        chflgs = flags & ASN1_STRFLGS_ESC_MSB;
-    else
-        chflgs = char_type[chtmp] & flags;
-    if (chflgs & CHARTYPE_BS_ESC) {
-        /* If we don't escape with quotes, signal we need quotes */
-        if (chflgs & ASN1_STRFLGS_ESC_QUOTE) {
-            if (do_quotes)
-                *do_quotes = 1;
-            if (!maybe_write(out, &chtmp, 1))
-                return -1;
-            return 1;
+static int do_esc_char(uint32_t c, unsigned long flags, char *do_quotes,
+                       BIO *out, int is_first, int is_last) {
+  // |c| is a |uint32_t| because, depending on |ASN1_STRFLGS_UTF8_CONVERT|,
+  // we may be escaping bytes or Unicode codepoints.
+  char buf[16];  // Large enough for "\\W01234567".
+  unsigned char u8 = (unsigned char)c;
+  if (c > 0xffff) {
+    BIO_snprintf(buf, sizeof(buf), "\\W%08" PRIX32, c);
+  } else if (c > 0xff) {
+    BIO_snprintf(buf, sizeof(buf), "\\U%04" PRIX32, c);
+  } else if ((flags & ASN1_STRFLGS_ESC_MSB) && c > 0x7f) {
+    BIO_snprintf(buf, sizeof(buf), "\\%02X", c);
+  } else if ((flags & ASN1_STRFLGS_ESC_CTRL) && is_control_character(c)) {
+    BIO_snprintf(buf, sizeof(buf), "\\%02X", c);
+  } else if (flags & ASN1_STRFLGS_ESC_2253) {
+    // See RFC 2253, sections 2.4 and 4.
+    if (c == '\\' || c == '"') {
+      // Quotes and backslashes are always escaped, quoted or not.
+      BIO_snprintf(buf, sizeof(buf), "\\%c", (int)c);
+    } else if (c == ',' || c == '+' || c == '<' || c == '>' || c == ';' ||
+               (is_first && (c == ' ' || c == '#')) ||
+               (is_last && (c == ' '))) {
+      if (flags & ASN1_STRFLGS_ESC_QUOTE) {
+        // No need to escape, just tell the caller to quote.
+        if (do_quotes != NULL) {
+          *do_quotes = 1;
         }
-        if (!maybe_write(out, "\\", 1))
-            return -1;
-        if (!maybe_write(out, &chtmp, 1))
-            return -1;
-        return 2;
+        return maybe_write(out, &u8, 1) ? 1 : -1;
+      }
+      BIO_snprintf(buf, sizeof(buf), "\\%c", (int)c);
+    } else {
+      return maybe_write(out, &u8, 1) ? 1 : -1;
     }
-    if (chflgs & (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB)) {
-        BIO_snprintf(tmphex, 11, "\\%02X", chtmp);
-        if (!maybe_write(out, tmphex, 3))
-            return -1;
-        return 3;
-    }
-    /*
-     * If we get this far and do any escaping at all must escape the escape
-     * character itself: backslash.
-     */
-    if (chtmp == '\\' && flags & ESC_FLAGS) {
-        if (!maybe_write(out, "\\\\", 2))
-            return -1;
-        return 2;
-    }
-    if (!maybe_write(out, &chtmp, 1))
-        return -1;
-    return 1;
+  } else if ((flags & ESC_FLAGS) && c == '\\') {
+    // If any escape flags are set, also escape backslashes.
+    BIO_snprintf(buf, sizeof(buf), "\\%c", (int)c);
+  } else {
+    return maybe_write(out, &u8, 1) ? 1 : -1;
+  }
+
+  int len = strlen(buf);
+  return maybe_write(out, buf, len) ? len : -1;
 }
 
-#define BUF_TYPE_WIDTH_MASK     0x7
-#define BUF_TYPE_CONVUTF8       0x8
+// This function sends each character in a buffer to do_esc_char(). It
+// interprets the content formats and converts to or from UTF8 as
+// appropriate.
 
-/*
- * This function sends each character in a buffer to do_esc_char(). It
- * interprets the content formats and converts to or from UTF8 as
- * appropriate.
- */
+static int do_buf(const unsigned char *buf, int buflen, int encoding,
+                  unsigned long flags, char *quotes, BIO *out) {
+  int (*get_char)(CBS *cbs, uint32_t *out);
+  int get_char_error;
+  switch (encoding) {
+    case MBSTRING_UNIV:
+      get_char = cbs_get_utf32_be;
+      get_char_error = ASN1_R_INVALID_UNIVERSALSTRING;
+      break;
+    case MBSTRING_BMP:
+      get_char = cbs_get_ucs2_be;
+      get_char_error = ASN1_R_INVALID_BMPSTRING;
+      break;
+    case MBSTRING_ASC:
+      get_char = cbs_get_latin1;
+      get_char_error = ERR_R_INTERNAL_ERROR;  // Should not be possible.
+      break;
+    case MBSTRING_UTF8:
+      get_char = cbs_get_utf8;
+      get_char_error = ASN1_R_INVALID_UTF8STRING;
+      break;
+    default:
+      assert(0);
+      return -1;
+  }
 
-static int do_buf(unsigned char *buf, int buflen,
-                  int type, unsigned char flags, char *quotes, BIO *out)
-{
-    int i, outlen, len, charwidth;
-    unsigned char orflags, *p, *q;
+  CBS cbs;
+  CBS_init(&cbs, buf, buflen);
+  int outlen = 0;
+  while (CBS_len(&cbs) != 0) {
+    const int is_first = CBS_data(&cbs) == buf;
     uint32_t c;
+    if (!get_char(&cbs, &c)) {
+      OPENSSL_PUT_ERROR(ASN1, get_char_error);
+      return -1;
+    }
+    const int is_last = CBS_len(&cbs) == 0;
+    if (flags & ASN1_STRFLGS_UTF8_CONVERT) {
+      unsigned char utfbuf[6];
+      int utflen;
+      utflen = UTF8_putc(utfbuf, sizeof(utfbuf), c);
+      for (int i = 0; i < utflen; i++) {
+        int len = do_esc_char(utfbuf[i], flags, quotes, out, is_first && i == 0,
+                              is_last && i == utflen - 1);
+        if (len < 0) {
+          return -1;
+        }
+        outlen += len;
+      }
+    } else {
+      int len = do_esc_char(c, flags, quotes, out, is_first, is_last);
+      if (len < 0) {
+        return -1;
+      }
+      outlen += len;
+    }
+  }
+  return outlen;
+}
+
+// This function hex dumps a buffer of characters
+
+static int do_hex_dump(BIO *out, unsigned char *buf, int buflen) {
+  static const char hexdig[] = "0123456789ABCDEF";
+  unsigned char *p, *q;
+  char hextmp[2];
+  if (out) {
     p = buf;
     q = buf + buflen;
-    outlen = 0;
-    charwidth = type & BUF_TYPE_WIDTH_MASK;
-
-    switch (charwidth) {
-    case 4:
-        if (buflen & 3) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_UNIVERSALSTRING);
-            return -1;
-        }
-        break;
-    case 2:
-        if (buflen & 1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BMPSTRING);
-            return -1;
-        }
-        break;
-    default:
-        break;
-    }
-
     while (p != q) {
-        if (p == buf && flags & ASN1_STRFLGS_ESC_2253)
-            orflags = CHARTYPE_FIRST_ESC_2253;
-        else
-            orflags = 0;
-        /* TODO(davidben): Replace this with |cbs_get_ucs2_be|, etc., to check
-         * for invalid codepoints. */
-        switch (charwidth) {
-        case 4:
-            c = ((uint32_t)*p++) << 24;
-            c |= ((uint32_t)*p++) << 16;
-            c |= ((uint32_t)*p++) << 8;
-            c |= *p++;
-            break;
-
-        case 2:
-            c = ((uint32_t)*p++) << 8;
-            c |= *p++;
-            break;
-
-        case 1:
-            c = *p++;
-            break;
-
-        case 0:
-            i = UTF8_getc(p, buflen, &c);
-            if (i < 0)
-                return -1;      /* Invalid UTF8String */
-            buflen -= i;
-            p += i;
-            break;
-        default:
-            return -1;          /* invalid width */
-        }
-        if (p == q && flags & ASN1_STRFLGS_ESC_2253)
-            orflags = CHARTYPE_LAST_ESC_2253;
-        if (type & BUF_TYPE_CONVUTF8) {
-            unsigned char utfbuf[6];
-            int utflen;
-            utflen = UTF8_putc(utfbuf, sizeof utfbuf, c);
-            for (i = 0; i < utflen; i++) {
-                /*
-                 * We don't need to worry about setting orflags correctly
-                 * because if utflen==1 its value will be correct anyway
-                 * otherwise each character will be > 0x7f and so the
-                 * character will never be escaped on first and last.
-                 */
-                len = do_esc_char(utfbuf[i], (unsigned char)(flags | orflags),
-                                  quotes, out);
-                if (len < 0)
-                    return -1;
-                outlen += len;
-            }
-        } else {
-            len = do_esc_char(c, (unsigned char)(flags | orflags), quotes, out);
-            if (len < 0)
-                return -1;
-            outlen += len;
-        }
+      hextmp[0] = hexdig[*p >> 4];
+      hextmp[1] = hexdig[*p & 0xf];
+      if (!maybe_write(out, hextmp, 2)) {
+        return -1;
+      }
+      p++;
     }
-    return outlen;
+  }
+  return buflen << 1;
 }
 
-/* This function hex dumps a buffer of characters */
+// "dump" a string. This is done when the type is unknown, or the flags
+// request it. We can either dump the content octets or the entire DER
+// encoding. This uses the RFC 2253 #01234 format.
 
-static int do_hex_dump(BIO *out, unsigned char *buf, int buflen)
-{
-    static const char hexdig[] = "0123456789ABCDEF";
-    unsigned char *p, *q;
-    char hextmp[2];
-    if (out) {
-        p = buf;
-        q = buf + buflen;
-        while (p != q) {
-            hextmp[0] = hexdig[*p >> 4];
-            hextmp[1] = hexdig[*p & 0xf];
-            if (!maybe_write(out, hextmp, 2))
-                return -1;
-            p++;
-        }
-    }
-    return buflen << 1;
-}
+static int do_dump(unsigned long flags, BIO *out, const ASN1_STRING *str) {
+  if (!maybe_write(out, "#", 1)) {
+    return -1;
+  }
 
-/*
- * "dump" a string. This is done when the type is unknown, or the flags
- * request it. We can either dump the content octets or the entire DER
- * encoding. This uses the RFC 2253 #01234 format.
- */
-
-static int do_dump(unsigned long lflags, BIO *out, const ASN1_STRING *str)
-{
-    if (!maybe_write(out, "#", 1)) {
-        return -1;
-    }
-
-    /* If we don't dump DER encoding just dump content octets */
-    if (!(lflags & ASN1_STRFLGS_DUMP_DER)) {
-        int outlen = do_hex_dump(out, str->data, str->length);
-        if (outlen < 0) {
-            return -1;
-        }
-        return outlen + 1;
-    }
-
-    /*
-     * Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
-     * to readily obtained.
-     */
-    ASN1_TYPE t;
-    t.type = str->type;
-    /* Negative INTEGER and ENUMERATED values are the only case where
-     * |ASN1_STRING| and |ASN1_TYPE| types do not match.
-     *
-     * TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
-     * not correspond to |ASN1_STRING|. It is unclear whether those are allowed
-     * in |ASN1_STRING| at all, or what the space of allowed types is.
-     * |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
-     * this is an invalid input. But this corner of the library in general
-     * should be more robust. */
-    if (t.type == V_ASN1_NEG_INTEGER) {
-      t.type = V_ASN1_INTEGER;
-    } else if (t.type == V_ASN1_NEG_ENUMERATED) {
-      t.type = V_ASN1_ENUMERATED;
-    }
-    t.value.asn1_string = (ASN1_STRING *)str;
-    unsigned char *der_buf = NULL;
-    int der_len = i2d_ASN1_TYPE(&t, &der_buf);
-    if (der_len < 0) {
-        return -1;
-    }
-    int outlen = do_hex_dump(out, der_buf, der_len);
-    OPENSSL_free(der_buf);
+  // If we don't dump DER encoding just dump content octets
+  if (!(flags & ASN1_STRFLGS_DUMP_DER)) {
+    int outlen = do_hex_dump(out, str->data, str->length);
     if (outlen < 0) {
-        return -1;
+      return -1;
     }
     return outlen + 1;
+  }
+
+  // Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
+  // to readily obtained.
+  ASN1_TYPE t;
+  t.type = str->type;
+  // Negative INTEGER and ENUMERATED values are the only case where
+  // |ASN1_STRING| and |ASN1_TYPE| types do not match.
+  //
+  // TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
+  // not correspond to |ASN1_STRING|. It is unclear whether those are allowed
+  // in |ASN1_STRING| at all, or what the space of allowed types is.
+  // |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
+  // this is an invalid input. But this corner of the library in general
+  // should be more robust.
+  if (t.type == V_ASN1_NEG_INTEGER) {
+    t.type = V_ASN1_INTEGER;
+  } else if (t.type == V_ASN1_NEG_ENUMERATED) {
+    t.type = V_ASN1_ENUMERATED;
+  }
+  t.value.asn1_string = (ASN1_STRING *)str;
+  unsigned char *der_buf = NULL;
+  int der_len = i2d_ASN1_TYPE(&t, &der_buf);
+  if (der_len < 0) {
+    return -1;
+  }
+  int outlen = do_hex_dump(out, der_buf, der_len);
+  OPENSSL_free(der_buf);
+  if (outlen < 0) {
+    return -1;
+  }
+  return outlen + 1;
 }
 
-/*
- * Lookup table to convert tags to character widths, 0 = UTF8 encoded, -1 is
- * used for non string types otherwise it is the number of bytes per
- * character
- */
+// string_type_to_encoding returns the |MBSTRING_*| constant for the encoding
+// used by the |ASN1_STRING| type |type|, or -1 if |tag| is not a string
+// type.
+static int string_type_to_encoding(int type) {
+  // This function is sometimes passed ASN.1 universal types and sometimes
+  // passed |ASN1_STRING| type values
+  switch (type) {
+    case V_ASN1_UTF8STRING:
+      return MBSTRING_UTF8;
+    case V_ASN1_NUMERICSTRING:
+    case V_ASN1_PRINTABLESTRING:
+    case V_ASN1_T61STRING:
+    case V_ASN1_IA5STRING:
+    case V_ASN1_UTCTIME:
+    case V_ASN1_GENERALIZEDTIME:
+    case V_ASN1_ISO64STRING:
+      // |MBSTRING_ASC| refers to Latin-1, not ASCII.
+      return MBSTRING_ASC;
+    case V_ASN1_UNIVERSALSTRING:
+      return MBSTRING_UNIV;
+    case V_ASN1_BMPSTRING:
+      return MBSTRING_BMP;
+  }
+  return -1;
+}
 
-static const signed char tag2nbyte[] = {
-    -1, -1, -1, -1, -1,         /* 0-4 */
-    -1, -1, -1, -1, -1,         /* 5-9 */
-    -1, -1, 0, -1,              /* 10-13 */
-    -1, -1, -1, -1,             /* 15-17 */
-    1, 1, 1,                    /* 18-20 */
-    -1, 1, 1, 1,                /* 21-24 */
-    -1, 1, -1,                  /* 25-27 */
-    4, -1, 2                    /* 28-30 */
-};
+// This is the main function, print out an ASN1_STRING taking note of various
+// escape and display options. Returns number of characters written or -1 if
+// an error occurred.
 
-/*
- * This is the main function, print out an ASN1_STRING taking note of various
- * escape and display options. Returns number of characters written or -1 if
- * an error occurred.
- */
-
-int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long lflags)
-{
-    int outlen, len;
-    int type;
-    char quotes;
-    unsigned char flags;
-    quotes = 0;
-    /* Keep a copy of escape flags */
-    flags = (unsigned char)(lflags & ESC_FLAGS);
-
-    type = str->type;
-
-    outlen = 0;
-
-    if (lflags & ASN1_STRFLGS_SHOW_TYPE) {
-        const char *tagname;
-        tagname = ASN1_tag2str(type);
-        outlen += strlen(tagname);
-        if (!maybe_write(out, tagname, outlen) || !maybe_write(out, ":", 1))
-            return -1;
-        outlen++;
+int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str,
+                         unsigned long flags) {
+  int type = str->type;
+  int outlen = 0;
+  if (flags & ASN1_STRFLGS_SHOW_TYPE) {
+    const char *tagname = ASN1_tag2str(type);
+    outlen += strlen(tagname);
+    if (!maybe_write(out, tagname, outlen) || !maybe_write(out, ":", 1)) {
+      return -1;
     }
+    outlen++;
+  }
 
-    /* Decide what to do with type, either dump content or display it */
-
-    /* Dump everything */
-    if (lflags & ASN1_STRFLGS_DUMP_ALL)
-        type = -1;
-    /* Ignore the string type */
-    else if (lflags & ASN1_STRFLGS_IGNORE_TYPE)
-        type = 1;
-    else {
-        /* Else determine width based on type */
-        if ((type > 0) && (type < 31))
-            type = tag2nbyte[type];
-        else
-            type = -1;
-        if ((type == -1) && !(lflags & ASN1_STRFLGS_DUMP_UNKNOWN))
-            type = 1;
+  // Decide what to do with |str|, either dump the contents or display it.
+  int encoding;
+  if (flags & ASN1_STRFLGS_DUMP_ALL) {
+    // Dump everything.
+    encoding = -1;
+  } else if (flags & ASN1_STRFLGS_IGNORE_TYPE) {
+    // Ignore the string type and interpret the contents as Latin-1.
+    encoding = MBSTRING_ASC;
+  } else {
+    encoding = string_type_to_encoding(type);
+    if (encoding == -1 && (flags & ASN1_STRFLGS_DUMP_UNKNOWN) == 0) {
+      encoding = MBSTRING_ASC;
     }
+  }
 
-    if (type == -1) {
-        len = do_dump(lflags, out, str);
-        if (len < 0)
-            return -1;
-        outlen += len;
-        return outlen;
+  if (encoding == -1) {
+    int len = do_dump(flags, out, str);
+    if (len < 0) {
+      return -1;
     }
-
-    if (lflags & ASN1_STRFLGS_UTF8_CONVERT) {
-        /*
-         * Note: if string is UTF8 and we want to convert to UTF8 then we
-         * just interpret it as 1 byte per character to avoid converting
-         * twice.
-         */
-        if (!type)
-            type = 1;
-        else
-            type |= BUF_TYPE_CONVUTF8;
-    }
-
-    len = do_buf(str->data, str->length, type, flags, &quotes, NULL);
-    if (len < 0)
-        return -1;
     outlen += len;
-    if (quotes)
-        outlen += 2;
-    if (!out)
-        return outlen;
-    if (quotes && !maybe_write(out, "\"", 1))
-        return -1;
-    if (do_buf(str->data, str->length, type, flags, NULL, out) < 0)
-        return -1;
-    if (quotes && !maybe_write(out, "\"", 1))
-        return -1;
     return outlen;
+  }
+
+  // Measure the length.
+  char quotes = 0;
+  int len = do_buf(str->data, str->length, encoding, flags, &quotes, NULL);
+  if (len < 0) {
+    return -1;
+  }
+  outlen += len;
+  if (quotes) {
+    outlen += 2;
+  }
+  if (!out) {
+    return outlen;
+  }
+
+  // Encode the value.
+  if ((quotes && !maybe_write(out, "\"", 1)) ||
+      do_buf(str->data, str->length, encoding, flags, NULL, out) < 0 ||
+      (quotes && !maybe_write(out, "\"", 1))) {
+    return -1;
+  }
+  return outlen;
 }
 
 int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str,
-                            unsigned long flags)
-{
-    BIO *bio = NULL;
-    if (fp != NULL) {
-        /* If |fp| is NULL, this function returns the number of bytes without
-         * writing. */
-        bio = BIO_new_fp(fp, BIO_NOCLOSE);
-        if (bio == NULL) {
-            return -1;
-        }
+                            unsigned long flags) {
+  BIO *bio = NULL;
+  if (fp != NULL) {
+    // If |fp| is NULL, this function returns the number of bytes without
+    // writing.
+    bio = BIO_new_fp(fp, BIO_NOCLOSE);
+    if (bio == NULL) {
+      return -1;
     }
-    int ret = ASN1_STRING_print_ex(bio, str, flags);
-    BIO_free(bio);
+  }
+  int ret = ASN1_STRING_print_ex(bio, str, flags);
+  BIO_free(bio);
+  return ret;
+}
+
+int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in) {
+  if (!in) {
+    return -1;
+  }
+  int mbflag = string_type_to_encoding(in->type);
+  if (mbflag == -1) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG);
+    return -1;
+  }
+  ASN1_STRING stmp, *str = &stmp;
+  stmp.data = NULL;
+  stmp.length = 0;
+  stmp.flags = 0;
+  int ret =
+      ASN1_mbstring_copy(&str, in->data, in->length, mbflag, B_ASN1_UTF8STRING);
+  if (ret < 0) {
     return ret;
+  }
+  *out = stmp.data;
+  return stmp.length;
 }
 
-int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in)
-{
-    ASN1_STRING stmp, *str = &stmp;
-    int mbflag, type, ret;
-    if (!in)
-        return -1;
-    type = in->type;
-    if ((type < 0) || (type > 30))
-        return -1;
-    mbflag = tag2nbyte[type];
-    if (mbflag == -1)
-        return -1;
-    mbflag |= MBSTRING_FLAG;
-    stmp.data = NULL;
-    stmp.length = 0;
-    stmp.flags = 0;
-    ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag,
-                             B_ASN1_UTF8STRING);
-    if (ret < 0)
-        return ret;
-    *out = stmp.data;
-    return stmp.length;
-}
+int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v) {
+  int i, n;
+  char buf[80];
+  const char *p;
 
-int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
-{
-    int i, n;
-    char buf[80];
-    const char *p;
-
-    if (v == NULL)
-        return (0);
-    n = 0;
-    p = (const char *)v->data;
-    for (i = 0; i < v->length; i++) {
-        if ((p[i] > '~') || ((p[i] < ' ') &&
-                             (p[i] != '\n') && (p[i] != '\r')))
-            buf[n] = '.';
-        else
-            buf[n] = p[i];
-        n++;
-        if (n >= 80) {
-            if (BIO_write(bp, buf, n) <= 0)
-                return (0);
-            n = 0;
-        }
-    }
-    if (n > 0)
-        if (BIO_write(bp, buf, n) <= 0)
-            return (0);
-    return (1);
-}
-
-int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)
-{
-    if (tm->type == V_ASN1_UTCTIME)
-        return ASN1_UTCTIME_print(bp, tm);
-    if (tm->type == V_ASN1_GENERALIZEDTIME)
-        return ASN1_GENERALIZEDTIME_print(bp, tm);
-    BIO_write(bp, "Bad time value", 14);
-    return (0);
-}
-
-static const char *const mon[12] = {
-    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)
-{
-    char *v;
-    int gmt = 0;
-    int i;
-    int y = 0, M = 0, d = 0, h = 0, m = 0, s = 0;
-    char *f = NULL;
-    int f_len = 0;
-
-    i = tm->length;
-    v = (char *)tm->data;
-
-    if (i < 12)
-        goto err;
-    if (v[i - 1] == 'Z')
-        gmt = 1;
-    for (i = 0; i < 12; i++)
-        if ((v[i] > '9') || (v[i] < '0'))
-            goto err;
-    y = (v[0] - '0') * 1000 + (v[1] - '0') * 100 + (v[2] - '0') * 10 + (v[3] -
-                                                                        '0');
-    M = (v[4] - '0') * 10 + (v[5] - '0');
-    if ((M > 12) || (M < 1))
-        goto err;
-    d = (v[6] - '0') * 10 + (v[7] - '0');
-    h = (v[8] - '0') * 10 + (v[9] - '0');
-    m = (v[10] - '0') * 10 + (v[11] - '0');
-    if (tm->length >= 14 &&
-        (v[12] >= '0') && (v[12] <= '9') &&
-        (v[13] >= '0') && (v[13] <= '9')) {
-        s = (v[12] - '0') * 10 + (v[13] - '0');
-        /* Check for fractions of seconds. */
-        if (tm->length >= 15 && v[14] == '.') {
-            int l = tm->length;
-            f = &v[14];         /* The decimal point. */
-            f_len = 1;
-            while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9')
-                ++f_len;
-        }
-    }
-
-    if (BIO_printf(bp, "%s %2d %02d:%02d:%02d%.*s %d%s",
-                   mon[M - 1], d, h, m, s, f_len, f, y,
-                   (gmt) ? " GMT" : "") <= 0)
-        return (0);
-    else
-        return (1);
- err:
-    BIO_write(bp, "Bad time value", 14);
-    return (0);
-}
-
-// consume_two_digits is a helper function for ASN1_UTCTIME_print. If |*v|,
-// assumed to be |*len| bytes long, has two leading digits, updates |*out| with
-// their value, updates |v| and |len|, and returns one. Otherwise, returns
-// zero.
-static int consume_two_digits(int* out, const char **v, int *len) {
-  if (*len < 2|| !isdigit((*v)[0]) || !isdigit((*v)[1])) {
+  if (v == NULL) {
     return 0;
   }
-  *out = ((*v)[0] - '0') * 10 + ((*v)[1] - '0');
-  *len -= 2;
-  *v += 2;
+  n = 0;
+  p = (const char *)v->data;
+  for (i = 0; i < v->length; i++) {
+    if ((p[i] > '~') || ((p[i] < ' ') && (p[i] != '\n') && (p[i] != '\r'))) {
+      buf[n] = '.';
+    } else {
+      buf[n] = p[i];
+    }
+    n++;
+    if (n >= 80) {
+      if (BIO_write(bp, buf, n) <= 0) {
+        return 0;
+      }
+      n = 0;
+    }
+  }
+  if (n > 0) {
+    if (BIO_write(bp, buf, n) <= 0) {
+      return 0;
+    }
+  }
   return 1;
 }
 
-// consume_zulu_timezone is a helper function for ASN1_UTCTIME_print. If |*v|,
-// assumed to be |*len| bytes long, starts with "Z" then it updates |*v| and
-// |*len| and returns one. Otherwise returns zero.
-static int consume_zulu_timezone(const char **v, int *len) {
-  if (*len == 0 || (*v)[0] != 'Z') {
+int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm) {
+  if (tm->type == V_ASN1_UTCTIME) {
+    return ASN1_UTCTIME_print(bp, tm);
+  }
+  if (tm->type == V_ASN1_GENERALIZEDTIME) {
+    return ASN1_GENERALIZEDTIME_print(bp, tm);
+  }
+  BIO_puts(bp, "Bad time value");
+  return 0;
+}
+
+static const char *const mon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                                    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm) {
+  CBS cbs;
+  CBS_init(&cbs, tm->data, tm->length);
+  struct tm utc;
+  if (!CBS_parse_generalized_time(&cbs, &utc, /*allow_timezone_offset=*/0)) {
+    BIO_puts(bp, "Bad time value");
     return 0;
   }
 
-  *len -= 1;
-  *v += 1;
-  return 1;
+  return BIO_printf(bp, "%s %2d %02d:%02d:%02d %d GMT", mon[utc.tm_mon],
+                    utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec,
+                    utc.tm_year + 1900) > 0;
 }
 
 int ASN1_UTCTIME_print(BIO *bp, const ASN1_UTCTIME *tm) {
-  const char *v = (const char *)tm->data;
-  int len = tm->length;
-  int Y = 0, M = 0, D = 0, h = 0, m = 0, s = 0;
-
-  // YYMMDDhhmm are required to be present.
-  if (!consume_two_digits(&Y, &v, &len) ||
-      !consume_two_digits(&M, &v, &len) ||
-      !consume_two_digits(&D, &v, &len) ||
-      !consume_two_digits(&h, &v, &len) ||
-      !consume_two_digits(&m, &v, &len)) {
-    goto err;
-  }
-  // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires seconds
-  // to be present, but historically this code has forgiven its absence.
-  consume_two_digits(&s, &v, &len);
-
-  // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, specifies this
-  // interpretation of the year.
-  if (Y < 50) {
-    Y += 2000;
-  } else {
-    Y += 1900;
-  }
-  if (M > 12 || M == 0) {
-    goto err;
-  }
-  if (D > 31 || D == 0) {
-    goto err;
-  }
-  if (h > 23 || m > 59 || s > 60) {
-    goto err;
+  CBS cbs;
+  CBS_init(&cbs, tm->data, tm->length);
+  struct tm utc;
+  if (!CBS_parse_utc_time(&cbs, &utc, /*allow_timezone_offset=*/0)) {
+    BIO_puts(bp, "Bad time value");
+    return 0;
   }
 
-  // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, requires the "Z"
-  // to be present, but historically this code has forgiven its absence.
-  const int is_gmt = consume_zulu_timezone(&v, &len);
-
-  // https://tools.ietf.org/html/rfc5280, section 4.1.2.5.1, does not permit
-  // the specification of timezones using the +hhmm / -hhmm syntax, which is
-  // the only other thing that might legitimately be found at the end.
-  if (len) {
-    goto err;
-  }
-
-  return BIO_printf(bp, "%s %2d %02d:%02d:%02d %d%s", mon[M - 1], D, h, m, s, Y,
-                    is_gmt ? " GMT" : "") > 0;
-
-err:
-  BIO_write(bp, "Bad time value", 14);
-  return 0;
+  return BIO_printf(bp, "%s %2d %02d:%02d:%02d %d GMT", mon[utc.tm_mon],
+                    utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec,
+                    utc.tm_year + 1900) > 0;
 }
diff --git a/src/crypto/asn1/a_strnid.c b/src/crypto/asn1/a_strnid.c
index bc9226a..3be266e 100644
--- a/src/crypto/asn1/a_strnid.c
+++ b/src/crypto/asn1/a_strnid.c
@@ -74,68 +74,55 @@
 static LHASH_OF(ASN1_STRING_TABLE) *string_tables = NULL;
 static struct CRYPTO_STATIC_MUTEX string_tables_lock = CRYPTO_STATIC_MUTEX_INIT;
 
-void ASN1_STRING_set_default_mask(unsigned long mask)
-{
-}
+void ASN1_STRING_set_default_mask(unsigned long mask) {}
 
-unsigned long ASN1_STRING_get_default_mask(void)
-{
-    return B_ASN1_UTF8STRING;
-}
+unsigned long ASN1_STRING_get_default_mask(void) { return B_ASN1_UTF8STRING; }
 
-int ASN1_STRING_set_default_mask_asc(const char *p)
-{
-    return 1;
-}
+int ASN1_STRING_set_default_mask_asc(const char *p) { return 1; }
 
 static const ASN1_STRING_TABLE *asn1_string_table_get(int nid);
 
-/*
- * The following function generates an ASN1_STRING based on limits in a
- * table. Frequently the types and length of an ASN1_STRING are restricted by
- * a corresponding OID. For example certificates and certificate requests.
- */
+// The following function generates an ASN1_STRING based on limits in a
+// table. Frequently the types and length of an ASN1_STRING are restricted by
+// a corresponding OID. For example certificates and certificate requests.
 
 ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in,
-                                    int len, int inform, int nid)
-{
-    ASN1_STRING *str = NULL;
-    int ret;
-    if (!out) {
-        out = &str;
+                                    int len, int inform, int nid) {
+  ASN1_STRING *str = NULL;
+  int ret;
+  if (!out) {
+    out = &str;
+  }
+  const ASN1_STRING_TABLE *tbl = asn1_string_table_get(nid);
+  if (tbl != NULL) {
+    unsigned long mask = tbl->mask;
+    if (!(tbl->flags & STABLE_NO_MASK)) {
+      mask &= B_ASN1_UTF8STRING;
     }
-    const ASN1_STRING_TABLE *tbl = asn1_string_table_get(nid);
-    if (tbl != NULL) {
-        unsigned long mask = tbl->mask;
-        if (!(tbl->flags & STABLE_NO_MASK)) {
-            mask &= B_ASN1_UTF8STRING;
-        }
-        ret = ASN1_mbstring_ncopy(out, in, len, inform, mask, tbl->minsize,
-                                  tbl->maxsize);
-    } else {
-        ret = ASN1_mbstring_copy(out, in, len, inform, B_ASN1_UTF8STRING);
-    }
-    if (ret <= 0) {
-        return NULL;
-    }
-    return *out;
+    ret = ASN1_mbstring_ncopy(out, in, len, inform, mask, tbl->minsize,
+                              tbl->maxsize);
+  } else {
+    ret = ASN1_mbstring_copy(out, in, len, inform, B_ASN1_UTF8STRING);
+  }
+  if (ret <= 0) {
+    return NULL;
+  }
+  return *out;
 }
 
-/*
- * Now the tables and helper functions for the string table:
- */
+// Now the tables and helper functions for the string table:
 
-/* See RFC 5280. */
-#define ub_name                         32768
-#define ub_common_name                  64
-#define ub_locality_name                128
-#define ub_state_name                   128
-#define ub_organization_name            64
-#define ub_organization_unit_name       64
-#define ub_email_address                128
-#define ub_serial_number                64
+// See RFC 5280.
+#define ub_name 32768
+#define ub_common_name 64
+#define ub_locality_name 128
+#define ub_state_name 128
+#define ub_organization_name 64
+#define ub_organization_unit_name 64
+#define ub_email_address 128
+#define ub_serial_number 64
 
-/* This table must be kept in NID order */
+// This table must be kept in NID order
 
 static const ASN1_STRING_TABLE tbl_standard[] = {
     {NID_commonName, 1, ub_common_name, DIRSTRING_TYPE, 0},
@@ -159,108 +146,100 @@
     {NID_name, 1, ub_name, DIRSTRING_TYPE, 0},
     {NID_dnQualifier, -1, -1, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
     {NID_domainComponent, 1, -1, B_ASN1_IA5STRING, STABLE_NO_MASK},
-    {NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK}
-};
+    {NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK}};
 
-static int table_cmp(const ASN1_STRING_TABLE *a, const ASN1_STRING_TABLE *b)
-{
-    if (a->nid < b->nid) {
-        return -1;
-    }
-    if (a->nid > b->nid) {
-        return 1;
-    }
-    return 0;
+static int table_cmp(const ASN1_STRING_TABLE *a, const ASN1_STRING_TABLE *b) {
+  if (a->nid < b->nid) {
+    return -1;
+  }
+  if (a->nid > b->nid) {
+    return 1;
+  }
+  return 0;
 }
 
-static int table_cmp_void(const void *a, const void *b)
-{
-    return table_cmp(a, b);
+static int table_cmp_void(const void *a, const void *b) {
+  return table_cmp(a, b);
 }
 
-static uint32_t table_hash(const ASN1_STRING_TABLE *tbl)
-{
-    return OPENSSL_hash32(&tbl->nid, sizeof(tbl->nid));   
+static uint32_t table_hash(const ASN1_STRING_TABLE *tbl) {
+  return OPENSSL_hash32(&tbl->nid, sizeof(tbl->nid));
 }
 
-static const ASN1_STRING_TABLE *asn1_string_table_get(int nid)
-{
-    ASN1_STRING_TABLE key;
-    key.nid = nid;
-    const ASN1_STRING_TABLE *tbl =
-        bsearch(&key, tbl_standard, OPENSSL_ARRAY_SIZE(tbl_standard),
-                sizeof(ASN1_STRING_TABLE), table_cmp_void);
-    if (tbl != NULL) {
-        return tbl;
-    }
-
-    CRYPTO_STATIC_MUTEX_lock_read(&string_tables_lock);
-    if (string_tables != NULL) {
-        tbl = lh_ASN1_STRING_TABLE_retrieve(string_tables, &key);
-    }
-    CRYPTO_STATIC_MUTEX_unlock_read(&string_tables_lock);
-    /* Note returning |tbl| without the lock is only safe because
-     * |ASN1_STRING_TABLE_add| cannot modify or delete existing entries. If we
-     * wish to support that, this function must copy the result under a lock. */
+static const ASN1_STRING_TABLE *asn1_string_table_get(int nid) {
+  ASN1_STRING_TABLE key;
+  key.nid = nid;
+  const ASN1_STRING_TABLE *tbl =
+      bsearch(&key, tbl_standard, OPENSSL_ARRAY_SIZE(tbl_standard),
+              sizeof(ASN1_STRING_TABLE), table_cmp_void);
+  if (tbl != NULL) {
     return tbl;
+  }
+
+  CRYPTO_STATIC_MUTEX_lock_read(&string_tables_lock);
+  if (string_tables != NULL) {
+    tbl = lh_ASN1_STRING_TABLE_retrieve(string_tables, &key);
+  }
+  CRYPTO_STATIC_MUTEX_unlock_read(&string_tables_lock);
+  // Note returning |tbl| without the lock is only safe because
+  // |ASN1_STRING_TABLE_add| cannot modify or delete existing entries. If we
+  // wish to support that, this function must copy the result under a lock.
+  return tbl;
 }
 
 int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize,
-                          unsigned long mask, unsigned long flags)
-{
-    /* Existing entries cannot be overwritten. */
-    if (asn1_string_table_get(nid) != NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-        return 0;
-    }
+                          unsigned long mask, unsigned long flags) {
+  // Existing entries cannot be overwritten.
+  if (asn1_string_table_get(nid) != NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
 
-    int ret = 0;
-    CRYPTO_STATIC_MUTEX_lock_write(&string_tables_lock);
+  int ret = 0;
+  CRYPTO_STATIC_MUTEX_lock_write(&string_tables_lock);
 
+  if (string_tables == NULL) {
+    string_tables = lh_ASN1_STRING_TABLE_new(table_hash, table_cmp);
     if (string_tables == NULL) {
-        string_tables = lh_ASN1_STRING_TABLE_new(table_hash, table_cmp);
-        if (string_tables == NULL) {
-            goto err;
-        }
-    } else {
-        /* Check again for an existing entry. One may have been added while
-         * unlocked. */
-        ASN1_STRING_TABLE key;
-        key.nid = nid;
-        if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-            goto err;
-        }
+      goto err;
     }
+  } else {
+    // Check again for an existing entry. One may have been added while
+    // unlocked.
+    ASN1_STRING_TABLE key;
+    key.nid = nid;
+    if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      goto err;
+    }
+  }
 
-    ASN1_STRING_TABLE *tbl = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE));
-    if (tbl == NULL) {
-        goto err;
-    }
-    tbl->nid = nid;
-    tbl->flags = flags;
-    tbl->minsize = minsize;
-    tbl->maxsize = maxsize;
-    tbl->mask = mask;
-    ASN1_STRING_TABLE *old_tbl;
-    if (!lh_ASN1_STRING_TABLE_insert(string_tables, &old_tbl, tbl)) {
-        OPENSSL_free(tbl);
-        goto err;
-    }
-    assert(old_tbl == NULL);
-    ret = 1;
+  ASN1_STRING_TABLE *tbl = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE));
+  if (tbl == NULL) {
+    goto err;
+  }
+  tbl->nid = nid;
+  tbl->flags = flags;
+  tbl->minsize = minsize;
+  tbl->maxsize = maxsize;
+  tbl->mask = mask;
+  ASN1_STRING_TABLE *old_tbl;
+  if (!lh_ASN1_STRING_TABLE_insert(string_tables, &old_tbl, tbl)) {
+    OPENSSL_free(tbl);
+    goto err;
+  }
+  assert(old_tbl == NULL);
+  ret = 1;
 
 err:
-    CRYPTO_STATIC_MUTEX_unlock_write(&string_tables_lock);
-    return ret;
+  CRYPTO_STATIC_MUTEX_unlock_write(&string_tables_lock);
+  return ret;
 }
 
-void ASN1_STRING_TABLE_cleanup(void)
-{
-}
+void ASN1_STRING_TABLE_cleanup(void) {}
 
 void asn1_get_string_table_for_testing(const ASN1_STRING_TABLE **out_ptr,
                                        size_t *out_len) {
-    *out_ptr = tbl_standard;
-    *out_len = OPENSSL_ARRAY_SIZE(tbl_standard);
+  *out_ptr = tbl_standard;
+  *out_len = OPENSSL_ARRAY_SIZE(tbl_standard);
 }
diff --git a/src/crypto/asn1/a_time.c b/src/crypto/asn1/a_time.c
index 1195569..5082969 100644
--- a/src/crypto/asn1/a_time.c
+++ b/src/crypto/asn1/a_time.c
@@ -65,148 +65,180 @@
 
 #include "internal.h"
 
-/*
- * This is an implementation of the ASN1 Time structure which is: Time ::=
- * CHOICE { utcTime UTCTime, generalTime GeneralizedTime } written by Steve
- * Henson.
- */
+// This is an implementation of the ASN1 Time structure which is: Time ::=
+// CHOICE { utcTime UTCTime, generalTime GeneralizedTime } written by Steve
+// Henson.
 
 IMPLEMENT_ASN1_MSTRING(ASN1_TIME, B_ASN1_TIME)
 
 IMPLEMENT_ASN1_FUNCTIONS_const(ASN1_TIME)
 
-ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t)
-{
-    return ASN1_TIME_adj(s, t, 0, 0);
+ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t) {
+  return ASN1_TIME_adj(s, t, 0, 0);
 }
 
-ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t,
-                         int offset_day, long offset_sec)
-{
-    struct tm *ts;
-    struct tm data;
+ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day,
+                         long offset_sec) {
+  struct tm *ts;
+  struct tm data;
 
-    ts = OPENSSL_gmtime(&t, &data);
-    if (ts == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ERROR_GETTING_TIME);
-        return NULL;
-    }
-    if (offset_day || offset_sec) {
-        if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
-            return NULL;
-    }
-    if ((ts->tm_year >= 50) && (ts->tm_year < 150))
-        return ASN1_UTCTIME_adj(s, t, offset_day, offset_sec);
-    return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec);
-}
-
-int ASN1_TIME_check(const ASN1_TIME *t)
-{
-    if (t->type == V_ASN1_GENERALIZEDTIME)
-        return ASN1_GENERALIZEDTIME_check(t);
-    else if (t->type == V_ASN1_UTCTIME)
-        return ASN1_UTCTIME_check(t);
-    return 0;
-}
-
-/* Convert an ASN1_TIME structure to GeneralizedTime */
-ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t,
-                                                   ASN1_GENERALIZEDTIME **out)
-{
-    ASN1_GENERALIZEDTIME *ret = NULL;
-    char *str;
-    int newlen;
-
-    if (!ASN1_TIME_check(t))
-        return NULL;
-
-    if (!out || !*out) {
-        if (!(ret = ASN1_GENERALIZEDTIME_new()))
-            goto err;
-    } else {
-        ret = *out;
-    }
-
-    /* If already GeneralizedTime just copy across */
-    if (t->type == V_ASN1_GENERALIZEDTIME) {
-        if (!ASN1_STRING_set(ret, t->data, t->length))
-            goto err;
-        goto done;
-    }
-
-    /* grow the string */
-    if (!ASN1_STRING_set(ret, NULL, t->length + 2))
-        goto err;
-    /* ASN1_STRING_set() allocated 'len + 1' bytes. */
-    newlen = t->length + 2 + 1;
-    str = (char *)ret->data;
-    /* Work out the century and prepend */
-    if (t->data[0] >= '5')
-        OPENSSL_strlcpy(str, "19", newlen);
-    else
-        OPENSSL_strlcpy(str, "20", newlen);
-
-    OPENSSL_strlcat(str, (char *)t->data, newlen);
-
- done:
-   if (out != NULL && *out == NULL)
-       *out = ret;
-   return ret;
-
- err:
-    if (out == NULL || *out != ret)
-        ASN1_GENERALIZEDTIME_free(ret);
+  ts = OPENSSL_gmtime(&t, &data);
+  if (ts == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ERROR_GETTING_TIME);
     return NULL;
+  }
+  if (offset_day || offset_sec) {
+    if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec)) {
+      return NULL;
+    }
+  }
+  if ((ts->tm_year >= 50) && (ts->tm_year < 150)) {
+    return ASN1_UTCTIME_adj(s, t, offset_day, offset_sec);
+  }
+  return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec);
+}
+
+int ASN1_TIME_check(const ASN1_TIME *t) {
+  if (t->type == V_ASN1_GENERALIZEDTIME) {
+    return ASN1_GENERALIZEDTIME_check(t);
+  } else if (t->type == V_ASN1_UTCTIME) {
+    return ASN1_UTCTIME_check(t);
+  }
+  return 0;
+}
+
+// Convert an ASN1_TIME structure to GeneralizedTime
+ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t,
+                                                   ASN1_GENERALIZEDTIME **out) {
+  ASN1_GENERALIZEDTIME *ret = NULL;
+  char *str;
+  int newlen;
+
+  if (!ASN1_TIME_check(t)) {
+    return NULL;
+  }
+
+  if (!out || !*out) {
+    if (!(ret = ASN1_GENERALIZEDTIME_new())) {
+      goto err;
+    }
+  } else {
+    ret = *out;
+  }
+
+  // If already GeneralizedTime just copy across
+  if (t->type == V_ASN1_GENERALIZEDTIME) {
+    if (!ASN1_STRING_set(ret, t->data, t->length)) {
+      goto err;
+    }
+    goto done;
+  }
+
+  // grow the string
+  if (!ASN1_STRING_set(ret, NULL, t->length + 2)) {
+    goto err;
+  }
+  // ASN1_STRING_set() allocated 'len + 1' bytes.
+  newlen = t->length + 2 + 1;
+  str = (char *)ret->data;
+  // Work out the century and prepend
+  if (t->data[0] >= '5') {
+    OPENSSL_strlcpy(str, "19", newlen);
+  } else {
+    OPENSSL_strlcpy(str, "20", newlen);
+  }
+
+  OPENSSL_strlcat(str, (char *)t->data, newlen);
+
+done:
+  if (out != NULL && *out == NULL) {
+    *out = ret;
+  }
+  return ret;
+
+err:
+  if (out == NULL || *out != ret) {
+    ASN1_GENERALIZEDTIME_free(ret);
+  }
+  return NULL;
 }
 
 
-int ASN1_TIME_set_string(ASN1_TIME *s, const char *str)
-{
-    ASN1_TIME t;
+int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) {
+  ASN1_TIME t;
 
-    t.length = strlen(str);
-    t.data = (unsigned char *)str;
-    t.flags = 0;
+  t.length = strlen(str);
+  t.data = (unsigned char *)str;
+  t.flags = 0;
 
-    t.type = V_ASN1_UTCTIME;
+  t.type = V_ASN1_UTCTIME;
 
+  if (!ASN1_TIME_check(&t)) {
+    t.type = V_ASN1_GENERALIZEDTIME;
     if (!ASN1_TIME_check(&t)) {
-        t.type = V_ASN1_GENERALIZEDTIME;
-        if (!ASN1_TIME_check(&t))
-            return 0;
+      return 0;
     }
+  }
 
-    if (s && !ASN1_STRING_copy((ASN1_STRING *)s, (ASN1_STRING *)&t))
-        return 0;
-
-    return 1;
-}
-
-static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *t)
-{
-    if (t == NULL) {
-        time_t now_t;
-        time(&now_t);
-        if (OPENSSL_gmtime(&now_t, tm))
-            return 1;
-        return 0;
-    }
-
-    if (t->type == V_ASN1_UTCTIME)
-        return asn1_utctime_to_tm(tm, t);
-    else if (t->type == V_ASN1_GENERALIZEDTIME)
-        return asn1_generalizedtime_to_tm(tm, t);
-
+  if (s && !ASN1_STRING_copy((ASN1_STRING *)s, (ASN1_STRING *)&t)) {
     return 0;
+  }
+
+  return 1;
 }
 
-int ASN1_TIME_diff(int *out_days, int *out_seconds,
-                   const ASN1_TIME *from, const ASN1_TIME *to)
-{
-    struct tm tm_from, tm_to;
-    if (!asn1_time_to_tm(&tm_from, from))
-        return 0;
-    if (!asn1_time_to_tm(&tm_to, to))
-        return 0;
-    return OPENSSL_gmtime_diff(out_days, out_seconds, &tm_from, &tm_to);
+static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *t,
+                           int allow_timezone_offset) {
+  if (t == NULL) {
+    time_t now_t;
+    time(&now_t);
+    if (OPENSSL_gmtime(&now_t, tm)) {
+      return 1;
+    }
+    return 0;
+  }
+
+  if (t->type == V_ASN1_UTCTIME) {
+    return asn1_utctime_to_tm(tm, t, allow_timezone_offset);
+  } else if (t->type == V_ASN1_GENERALIZEDTIME) {
+    return asn1_generalizedtime_to_tm(tm, t);
+  }
+
+  return 0;
+}
+
+int ASN1_TIME_diff(int *out_days, int *out_seconds, const ASN1_TIME *from,
+                   const ASN1_TIME *to) {
+  struct tm tm_from, tm_to;
+  if (!asn1_time_to_tm(&tm_from, from, /*allow_timezone_offset=*/1)) {
+    return 0;
+  }
+  if (!asn1_time_to_tm(&tm_to, to, /*allow_timezone_offset=*/1)) {
+    return 0;
+  }
+  return OPENSSL_gmtime_diff(out_days, out_seconds, &tm_from, &tm_to);
+}
+
+// The functions below do *not* permissively allow the use of four digit
+// timezone offsets in UTC times, as is done elsewhere in the code. They are
+// both new API, and used internally to X509_cmp_time. This is to discourage the
+// use of nonstandard times in new code, and to ensure that this code behaves
+// correctly in X509_cmp_time which historically did its own time validations
+// slightly different than the many other copies of X.509 time validation
+// sprinkled through the codebase. The custom checks in X509_cmp_time meant that
+// it did not allow four digit timezone offsets in UTC times.
+int ASN1_TIME_to_time_t(const ASN1_TIME *t, time_t *out_time) {
+  struct tm tm;
+  if (!asn1_time_to_tm(&tm, t, /*allow_timezone_offset=*/0)) {
+    return 0;
+  }
+  return OPENSSL_timegm(&tm, out_time);
+}
+
+int ASN1_TIME_to_posix(const ASN1_TIME *t, int64_t *out_time) {
+  struct tm tm;
+  if (!asn1_time_to_tm(&tm, t, /*allow_timezone_offset=*/0)) {
+    return 0;
+  }
+  return OPENSSL_tm_to_posix(&tm, out_time);
 }
diff --git a/src/crypto/asn1/a_type.c b/src/crypto/asn1/a_type.c
index c63030b..d59fdba 100644
--- a/src/crypto/asn1/a_type.c
+++ b/src/crypto/asn1/a_type.c
@@ -64,76 +64,75 @@
 #include "internal.h"
 
 
-int ASN1_TYPE_get(const ASN1_TYPE *a)
-{
-    if (a->type == V_ASN1_BOOLEAN || a->type == V_ASN1_NULL ||
-        a->value.ptr != NULL) {
-        return a->type;
-    }
-    return 0;
+int ASN1_TYPE_get(const ASN1_TYPE *a) {
+  if (a->type == V_ASN1_BOOLEAN || a->type == V_ASN1_NULL ||
+      a->value.ptr != NULL) {
+    return a->type;
+  }
+  return 0;
 }
 
-const void *asn1_type_value_as_pointer(const ASN1_TYPE *a)
-{
-    if (a->type == V_ASN1_BOOLEAN) {
-        return a->value.boolean ? (void *)0xff : NULL;
-    }
-    if (a->type == V_ASN1_NULL) {
-        return NULL;
-    }
-    return a->value.ptr;
+const void *asn1_type_value_as_pointer(const ASN1_TYPE *a) {
+  if (a->type == V_ASN1_BOOLEAN) {
+    return a->value.boolean ? (void *)0xff : NULL;
+  }
+  if (a->type == V_ASN1_NULL) {
+    return NULL;
+  }
+  return a->value.ptr;
 }
 
-void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value)
-{
-    ASN1_TYPE **tmp_a = &a;
-    ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL);
-    a->type = type;
-    if (type == V_ASN1_BOOLEAN)
-        a->value.boolean = value ? 0xff : 0;
-    else
-        a->value.ptr = value;
+void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value) {
+  ASN1_TYPE **tmp_a = &a;
+  ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL);
+  a->type = type;
+  if (type == V_ASN1_BOOLEAN) {
+    a->value.boolean = value ? 0xff : 0;
+  } else {
+    a->value.ptr = value;
+  }
 }
 
-int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value)
-{
-    if (!value || (type == V_ASN1_BOOLEAN)) {
-        void *p = (void *)value;
-        ASN1_TYPE_set(a, type, p);
-    } else if (type == V_ASN1_OBJECT) {
-        ASN1_OBJECT *odup;
-        odup = OBJ_dup(value);
-        if (!odup)
-            return 0;
-        ASN1_TYPE_set(a, type, odup);
-    } else {
-        ASN1_STRING *sdup;
-        sdup = ASN1_STRING_dup(value);
-        if (!sdup)
-            return 0;
-        ASN1_TYPE_set(a, type, sdup);
+int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value) {
+  if (!value || (type == V_ASN1_BOOLEAN)) {
+    void *p = (void *)value;
+    ASN1_TYPE_set(a, type, p);
+  } else if (type == V_ASN1_OBJECT) {
+    ASN1_OBJECT *odup;
+    odup = OBJ_dup(value);
+    if (!odup) {
+      return 0;
     }
-    return 1;
+    ASN1_TYPE_set(a, type, odup);
+  } else {
+    ASN1_STRING *sdup;
+    sdup = ASN1_STRING_dup(value);
+    if (!sdup) {
+      return 0;
+    }
+    ASN1_TYPE_set(a, type, sdup);
+  }
+  return 1;
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
-int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b)
-{
-    int result = -1;
+// Returns 0 if they are equal, != 0 otherwise.
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b) {
+  int result = -1;
 
-    if (!a || !b || a->type != b->type)
-        return -1;
+  if (!a || !b || a->type != b->type) {
+    return -1;
+  }
 
-    switch (a->type) {
+  switch (a->type) {
     case V_ASN1_OBJECT:
-        result = OBJ_cmp(a->value.object, b->value.object);
-        break;
+      result = OBJ_cmp(a->value.object, b->value.object);
+      break;
     case V_ASN1_NULL:
-        result = 0;             /* They do not have content. */
-        break;
+      result = 0;  // They do not have content.
+      break;
     case V_ASN1_BOOLEAN:
-        result = a->value.boolean - b->value.boolean;
-        break;
+      result = a->value.boolean - b->value.boolean;
+      break;
     case V_ASN1_INTEGER:
     case V_ASN1_ENUMERATED:
     case V_ASN1_BIT_STRING:
@@ -155,9 +154,9 @@
     case V_ASN1_UTF8STRING:
     case V_ASN1_OTHER:
     default:
-        result = ASN1_STRING_cmp(a->value.asn1_string, b->value.asn1_string);
-        break;
-    }
+      result = ASN1_STRING_cmp(a->value.asn1_string, b->value.asn1_string);
+      break;
+  }
 
-    return result;
+  return result;
 }
diff --git a/src/crypto/asn1/a_utctm.c b/src/crypto/asn1/a_utctm.c
index 21ea2cc..201c654 100644
--- a/src/crypto/asn1/a_utctm.c
+++ b/src/crypto/asn1/a_utctm.c
@@ -55,210 +55,123 @@
  * [including the GNU Public Licence.] */
 
 #include <openssl/asn1.h>
+#include <openssl/bytestring.h>
+#include <openssl/err.h>
+#include <openssl/mem.h>
 
 #include <string.h>
 #include <time.h>
 
-#include <openssl/err.h>
-#include <openssl/mem.h>
-
 #include "internal.h"
 
-
-int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d)
-{
-    static const int min[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
-    static const int max[8] = { 99, 12, 31, 23, 59, 59, 12, 59 };
-    char *a;
-    int n, i, l, o;
-
-    if (d->type != V_ASN1_UTCTIME)
-        return (0);
-    l = d->length;
-    a = (char *)d->data;
-    o = 0;
-
-    if (l < 11)
-        goto err;
-    for (i = 0; i < 6; i++) {
-        if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
-            i++;
-            if (tm)
-                tm->tm_sec = 0;
-            break;
-        }
-        if ((a[o] < '0') || (a[o] > '9'))
-            goto err;
-        n = a[o] - '0';
-        if (++o > l)
-            goto err;
-
-        if ((a[o] < '0') || (a[o] > '9'))
-            goto err;
-        n = (n * 10) + a[o] - '0';
-        if (++o > l)
-            goto err;
-
-        if ((n < min[i]) || (n > max[i]))
-            goto err;
-        if (tm) {
-            switch (i) {
-            case 0:
-                tm->tm_year = n < 50 ? n + 100 : n;
-                break;
-            case 1:
-                tm->tm_mon = n - 1;
-                break;
-            case 2:
-                tm->tm_mday = n;
-                break;
-            case 3:
-                tm->tm_hour = n;
-                break;
-            case 4:
-                tm->tm_min = n;
-                break;
-            case 5:
-                tm->tm_sec = n;
-                break;
-            }
-        }
-    }
-    if (a[o] == 'Z')
-        o++;
-    else if ((a[o] == '+') || (a[o] == '-')) {
-        int offsign = a[o] == '-' ? 1 : -1, offset = 0;
-        o++;
-        if (o + 4 > l)
-            goto err;
-        for (i = 6; i < 8; i++) {
-            if ((a[o] < '0') || (a[o] > '9'))
-                goto err;
-            n = a[o] - '0';
-            o++;
-            if ((a[o] < '0') || (a[o] > '9'))
-                goto err;
-            n = (n * 10) + a[o] - '0';
-            if ((n < min[i]) || (n > max[i]))
-                goto err;
-            if (tm) {
-                if (i == 6)
-                    offset = n * 3600;
-                else if (i == 7)
-                    offset += n * 60;
-            }
-            o++;
-        }
-        if (offset && !OPENSSL_gmtime_adj(tm, 0, offset * offsign))
-            return 0;
-    }
-    return o == l;
- err:
+int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d,
+                       int allow_timezone_offset) {
+  if (d->type != V_ASN1_UTCTIME) {
     return 0;
+  }
+  CBS cbs;
+  CBS_init(&cbs, d->data, (size_t)d->length);
+  if (!CBS_parse_utc_time(&cbs, tm, allow_timezone_offset)) {
+    return 0;
+  }
+  return 1;
 }
 
-int ASN1_UTCTIME_check(const ASN1_UTCTIME *d)
-{
-    return asn1_utctime_to_tm(NULL, d);
+int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) {
+  return asn1_utctime_to_tm(NULL, d, /*allow_timezone_offset=*/1);
 }
 
-int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str)
-{
-    ASN1_UTCTIME t;
+int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) {
+  ASN1_UTCTIME t;
 
-    t.type = V_ASN1_UTCTIME;
-    t.length = strlen(str);
-    t.data = (unsigned char *)str;
-    if (ASN1_UTCTIME_check(&t)) {
-        if (s != NULL) {
-            if (!ASN1_STRING_set((ASN1_STRING *)s,
-                                 (unsigned char *)str, t.length))
-                return 0;
-            s->type = V_ASN1_UTCTIME;
-        }
-        return (1);
-    } else
-        return (0);
-}
-
-ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
-{
-    return ASN1_UTCTIME_adj(s, t, 0, 0);
-}
-
-ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
-                               int offset_day, long offset_sec)
-{
-    char *p;
-    struct tm *ts;
-    struct tm data;
-    size_t len = 20;
-    int free_s = 0;
-
-    if (s == NULL) {
-        free_s = 1;
-        s = ASN1_UTCTIME_new();
+  t.type = V_ASN1_UTCTIME;
+  t.length = strlen(str);
+  t.data = (unsigned char *)str;
+  if (ASN1_UTCTIME_check(&t)) {
+    if (s != NULL) {
+      if (!ASN1_STRING_set((ASN1_STRING *)s, (unsigned char *)str, t.length)) {
+        return 0;
+      }
+      s->type = V_ASN1_UTCTIME;
     }
-    if (s == NULL)
-        goto err;
+    return 1;
+  } else {
+    return 0;
+  }
+}
 
-    ts = OPENSSL_gmtime(&t, &data);
-    if (ts == NULL)
-        goto err;
+ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t) {
+  return ASN1_UTCTIME_adj(s, t, 0, 0);
+}
 
-    if (offset_day || offset_sec) {
-        if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
-            goto err;
-    }
-
-    if ((ts->tm_year < 50) || (ts->tm_year >= 150))
-        goto err;
-
-    p = (char *)s->data;
-    if ((p == NULL) || ((size_t)s->length < len)) {
-        p = OPENSSL_malloc(len);
-        if (p == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        if (s->data != NULL)
-            OPENSSL_free(s->data);
-        s->data = (unsigned char *)p;
-    }
-
-    BIO_snprintf(p, len, "%02d%02d%02d%02d%02d%02dZ", ts->tm_year % 100,
-                 ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
-                 ts->tm_sec);
-    s->length = strlen(p);
-    s->type = V_ASN1_UTCTIME;
-    return (s);
- err:
-    if (free_s && s)
-        ASN1_UTCTIME_free(s);
+ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day,
+                               long offset_sec) {
+  struct tm data;
+  if (!OPENSSL_gmtime(&t, &data)) {
     return NULL;
+  }
+
+  if (offset_day || offset_sec) {
+    if (!OPENSSL_gmtime_adj(&data, offset_day, offset_sec)) {
+      return NULL;
+    }
+  }
+
+  if (data.tm_year < 50 || data.tm_year >= 150) {
+    return NULL;
+  }
+
+  char buf[14];
+  BIO_snprintf(buf, sizeof(buf), "%02d%02d%02d%02d%02d%02dZ",
+               data.tm_year % 100, data.tm_mon + 1, data.tm_mday, data.tm_hour,
+               data.tm_min, data.tm_sec);
+
+  int free_s = 0;
+  if (s == NULL) {
+    free_s = 1;
+    s = ASN1_UTCTIME_new();
+    if (s == NULL) {
+      return NULL;
+    }
+  }
+
+  if (!ASN1_STRING_set(s, buf, strlen(buf))) {
+    if (free_s) {
+      ASN1_UTCTIME_free(s);
+    }
+    return NULL;
+  }
+  s->type = V_ASN1_UTCTIME;
+  return s;
 }
 
-int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
-{
-    struct tm stm, ttm;
-    int day, sec;
+int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) {
+  struct tm stm, ttm;
+  int day, sec;
 
-    if (!asn1_utctime_to_tm(&stm, s))
-        return -2;
+  if (!asn1_utctime_to_tm(&stm, s, /*allow_timezone_offset=*/1)) {
+    return -2;
+  }
 
-    if (!OPENSSL_gmtime(&t, &ttm))
-        return -2;
+  if (!OPENSSL_gmtime(&t, &ttm)) {
+    return -2;
+  }
 
-    if (!OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm))
-        return -2;
+  if (!OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm)) {
+    return -2;
+  }
 
-    if (day > 0)
-        return 1;
-    if (day < 0)
-        return -1;
-    if (sec > 0)
-        return 1;
-    if (sec < 0)
-        return -1;
-    return 0;
+  if (day > 0) {
+    return 1;
+  }
+  if (day < 0) {
+    return -1;
+  }
+  if (sec > 0) {
+    return 1;
+  }
+  if (sec < 0) {
+    return -1;
+  }
+  return 0;
 }
diff --git a/src/crypto/asn1/a_utf8.c b/src/crypto/asn1/a_utf8.c
index 922a780..02c1d56 100644
--- a/src/crypto/asn1/a_utf8.c
+++ b/src/crypto/asn1/a_utf8.c
@@ -61,176 +61,82 @@
 
 #include "internal.h"
 
-/* UTF8 utilities */
+// UTF8 utilities
 
-/*
- * This parses a UTF8 string one character at a time. It is passed a pointer
- * to the string and the length of the string. It sets 'value' to the value
- * of the current character. It returns the number of characters read or a
- * negative error code: -1 = string too short -2 = illegal character -3 =
- * subsequent characters not of the form 10xxxxxx -4 = character encoded
- * incorrectly (not minimal length).
- */
+// This takes a character 'value' and writes the UTF8 encoded value in 'str'
+// where 'str' is a buffer containing 'len' characters. Returns the number of
+// characters written or -1 if 'len' is too small. 'str' can be set to NULL
+// in which case it just returns the number of characters. It will need at
+// most 6 characters.
 
-int UTF8_getc(const unsigned char *str, int len, uint32_t *val)
-{
-    const unsigned char *p;
-    uint32_t value;
-    int ret;
-    if (len <= 0)
-        return 0;
-    p = str;
-
-    /* Check syntax and work out the encoded value (if correct) */
-    if ((*p & 0x80) == 0) {
-        value = *p++ & 0x7f;
-        ret = 1;
-    } else if ((*p & 0xe0) == 0xc0) {
-        if (len < 2)
-            return -1;
-        if ((p[1] & 0xc0) != 0x80)
-            return -3;
-        value = (*p++ & 0x1f) << 6;
-        value |= *p++ & 0x3f;
-        if (value < 0x80)
-            return -4;
-        ret = 2;
-    } else if ((*p & 0xf0) == 0xe0) {
-        if (len < 3)
-            return -1;
-        if (((p[1] & 0xc0) != 0x80)
-            || ((p[2] & 0xc0) != 0x80))
-            return -3;
-        value = (*p++ & 0xf) << 12;
-        value |= (*p++ & 0x3f) << 6;
-        value |= *p++ & 0x3f;
-        if (value < 0x800)
-            return -4;
-        ret = 3;
-    } else if ((*p & 0xf8) == 0xf0) {
-        if (len < 4)
-            return -1;
-        if (((p[1] & 0xc0) != 0x80)
-            || ((p[2] & 0xc0) != 0x80)
-            || ((p[3] & 0xc0) != 0x80))
-            return -3;
-        value = ((uint32_t)(*p++ & 0x7)) << 18;
-        value |= (*p++ & 0x3f) << 12;
-        value |= (*p++ & 0x3f) << 6;
-        value |= *p++ & 0x3f;
-        if (value < 0x10000)
-            return -4;
-        ret = 4;
-    } else if ((*p & 0xfc) == 0xf8) {
-        if (len < 5)
-            return -1;
-        if (((p[1] & 0xc0) != 0x80)
-            || ((p[2] & 0xc0) != 0x80)
-            || ((p[3] & 0xc0) != 0x80)
-            || ((p[4] & 0xc0) != 0x80))
-            return -3;
-        value = ((uint32_t)(*p++ & 0x3)) << 24;
-        value |= ((uint32_t)(*p++ & 0x3f)) << 18;
-        value |= ((uint32_t)(*p++ & 0x3f)) << 12;
-        value |= (*p++ & 0x3f) << 6;
-        value |= *p++ & 0x3f;
-        if (value < 0x200000)
-            return -4;
-        ret = 5;
-    } else if ((*p & 0xfe) == 0xfc) {
-        if (len < 6)
-            return -1;
-        if (((p[1] & 0xc0) != 0x80)
-            || ((p[2] & 0xc0) != 0x80)
-            || ((p[3] & 0xc0) != 0x80)
-            || ((p[4] & 0xc0) != 0x80)
-            || ((p[5] & 0xc0) != 0x80))
-            return -3;
-        value = ((uint32_t)(*p++ & 0x1)) << 30;
-        value |= ((uint32_t)(*p++ & 0x3f)) << 24;
-        value |= ((uint32_t)(*p++ & 0x3f)) << 18;
-        value |= ((uint32_t)(*p++ & 0x3f)) << 12;
-        value |= (*p++ & 0x3f) << 6;
-        value |= *p++ & 0x3f;
-        if (value < 0x4000000)
-            return -4;
-        ret = 6;
-    } else
-        return -2;
-    *val = value;
-    return ret;
-}
-
-/*
- * This takes a character 'value' and writes the UTF8 encoded value in 'str'
- * where 'str' is a buffer containing 'len' characters. Returns the number of
- * characters written or -1 if 'len' is too small. 'str' can be set to NULL
- * in which case it just returns the number of characters. It will need at
- * most 6 characters.
- */
-
-int UTF8_putc(unsigned char *str, int len, uint32_t value)
-{
-    if (!str)
-        len = 6;                /* Maximum we will need */
-    else if (len <= 0)
-        return -1;
-    if (value < 0x80) {
-        if (str)
-            *str = (unsigned char)value;
-        return 1;
-    }
-    if (value < 0x800) {
-        if (len < 2)
-            return -1;
-        if (str) {
-            *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0);
-            *str = (unsigned char)((value & 0x3f) | 0x80);
-        }
-        return 2;
-    }
-    if (value < 0x10000) {
-        if (len < 3)
-            return -1;
-        if (str) {
-            *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0);
-            *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
-            *str = (unsigned char)((value & 0x3f) | 0x80);
-        }
-        return 3;
-    }
-    if (value < 0x200000) {
-        if (len < 4)
-            return -1;
-        if (str) {
-            *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0);
-            *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
-            *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
-            *str = (unsigned char)((value & 0x3f) | 0x80);
-        }
-        return 4;
-    }
-    if (value < 0x4000000) {
-        if (len < 5)
-            return -1;
-        if (str) {
-            *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8);
-            *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
-            *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
-            *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
-            *str = (unsigned char)((value & 0x3f) | 0x80);
-        }
-        return 5;
-    }
-    if (len < 6)
-        return -1;
+int UTF8_putc(unsigned char *str, int len, uint32_t value) {
+  if (!str) {
+    len = 6;  // Maximum we will need
+  } else if (len <= 0) {
+    return -1;
+  }
+  if (value < 0x80) {
     if (str) {
-        *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc);
-        *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80);
-        *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
-        *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
-        *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
-        *str = (unsigned char)((value & 0x3f) | 0x80);
+      *str = (unsigned char)value;
     }
-    return 6;
+    return 1;
+  }
+  if (value < 0x800) {
+    if (len < 2) {
+      return -1;
+    }
+    if (str) {
+      *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0);
+      *str = (unsigned char)((value & 0x3f) | 0x80);
+    }
+    return 2;
+  }
+  if (value < 0x10000) {
+    if (len < 3) {
+      return -1;
+    }
+    if (str) {
+      *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0);
+      *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+      *str = (unsigned char)((value & 0x3f) | 0x80);
+    }
+    return 3;
+  }
+  if (value < 0x200000) {
+    if (len < 4) {
+      return -1;
+    }
+    if (str) {
+      *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0);
+      *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+      *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+      *str = (unsigned char)((value & 0x3f) | 0x80);
+    }
+    return 4;
+  }
+  if (value < 0x4000000) {
+    if (len < 5) {
+      return -1;
+    }
+    if (str) {
+      *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8);
+      *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
+      *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+      *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+      *str = (unsigned char)((value & 0x3f) | 0x80);
+    }
+    return 5;
+  }
+  if (len < 6) {
+    return -1;
+  }
+  if (str) {
+    *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc);
+    *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80);
+    *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
+    *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+    *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+    *str = (unsigned char)((value & 0x3f) | 0x80);
+  }
+  return 6;
 }
diff --git a/src/crypto/asn1/asn1_lib.c b/src/crypto/asn1/asn1_lib.c
index fbf4d68..98061db 100644
--- a/src/crypto/asn1/asn1_lib.c
+++ b/src/crypto/asn1/asn1_lib.c
@@ -59,7 +59,7 @@
 #include <limits.h>
 #include <string.h>
 
-#include <openssl/asn1_mac.h>
+#include <openssl/bytestring.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
@@ -67,19 +67,17 @@
 #include "internal.h"
 
 
-/* Cross-module errors from crypto/x509/i2d_pr.c. */
+// Cross-module errors from crypto/x509/i2d_pr.c.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNSUPPORTED_PUBLIC_KEY_TYPE)
 
-/* Cross-module errors from crypto/x509/algorithm.c. */
+// Cross-module errors from crypto/x509/algorithm.c.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, CONTEXT_NOT_INITIALISED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, DIGEST_AND_KEY_TYPE_NOT_SUPPORTED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNKNOWN_MESSAGE_DIGEST_ALGORITHM)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNKNOWN_SIGNATURE_ALGORITHM)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, WRONG_PUBLIC_KEY_TYPE)
-/*
- * Cross-module errors from crypto/x509/asn1_gen.c. TODO(davidben): Remove
- * these once asn1_gen.c is gone.
- */
+// Cross-module errors from crypto/x509/asn1_gen.c. TODO(davidben): Remove
+// these once asn1_gen.c is gone.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, DEPTH_EXCEEDED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, ILLEGAL_BITSTRING_FORMAT)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, ILLEGAL_BOOLEAN)
@@ -104,349 +102,289 @@
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNKNOWN_TAG)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNSUPPORTED_TYPE)
 
-static int asn1_get_length(const unsigned char **pp, long *rl, long max);
 static void asn1_put_length(unsigned char **pp, int length);
 
-int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag,
-                    int *pclass, long omax)
-{
-    int i, ret;
-    long l;
-    const unsigned char *p = *pp;
-    int tag, xclass;
-    long max = omax;
-
-    if (!max)
-        goto err;
-    ret = (*p & V_ASN1_CONSTRUCTED);
-    xclass = (*p & V_ASN1_PRIVATE);
-    i = *p & V_ASN1_PRIMITIVE_TAG;
-    if (i == V_ASN1_PRIMITIVE_TAG) { /* high-tag */
-        p++;
-        if (--max == 0)
-            goto err;
-        l = 0;
-        while (*p & 0x80) {
-            l <<= 7L;
-            l |= *(p++) & 0x7f;
-            if (--max == 0)
-                goto err;
-            if (l > (INT_MAX >> 7L))
-                goto err;
-        }
-        l <<= 7L;
-        l |= *(p++) & 0x7f;
-        tag = (int)l;
-        if (--max == 0)
-            goto err;
-    } else {
-        tag = i;
-        p++;
-        if (--max == 0)
-            goto err;
-    }
-
-    /* To avoid ambiguity with V_ASN1_NEG, impose a limit on universal tags. */
-    if (xclass == V_ASN1_UNIVERSAL && tag > V_ASN1_MAX_UNIVERSAL)
-        goto err;
-
-    *ptag = tag;
-    *pclass = xclass;
-    if (!asn1_get_length(&p, plength, max))
-        goto err;
-
-    if (*plength > (omax - (p - *pp))) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
-        return 0x80;
-    }
-    *pp = p;
-    return ret;
- err:
+int ASN1_get_object(const unsigned char **inp, long *out_len, int *out_tag,
+                    int *out_class, long in_len) {
+  if (in_len < 0) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_HEADER_TOO_LONG);
     return 0x80;
+  }
+
+  // TODO(https://crbug.com/boringssl/354): This should use |CBS_get_asn1| to
+  // reject non-minimal lengths, which are only allowed in BER. However,
+  // Android sometimes needs allow a non-minimal length in certificate
+  // signature fields (see b/18228011). Make this only apply to that field,
+  // while requiring DER elsewhere. Better yet, it should be limited to an
+  // preprocessing step in that part of Android.
+  unsigned tag;
+  size_t header_len;
+  int indefinite;
+  CBS cbs, body;
+  CBS_init(&cbs, *inp, (size_t)in_len);
+  if (!CBS_get_any_ber_asn1_element(&cbs, &body, &tag, &header_len,
+                                    /*out_ber_found=*/NULL, &indefinite) ||
+      indefinite || !CBS_skip(&body, header_len) ||
+      // Bound the length to comfortably fit in an int. Lengths in this
+      // module often switch between int and long without overflow checks.
+      CBS_len(&body) > INT_MAX / 2) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_HEADER_TOO_LONG);
+    return 0x80;
+  }
+
+  // Convert between tag representations.
+  int tag_class = (tag & CBS_ASN1_CLASS_MASK) >> CBS_ASN1_TAG_SHIFT;
+  int constructed = (tag & CBS_ASN1_CONSTRUCTED) >> CBS_ASN1_TAG_SHIFT;
+  int tag_number = tag & CBS_ASN1_TAG_NUMBER_MASK;
+
+  // To avoid ambiguity with V_ASN1_NEG, impose a limit on universal tags.
+  if (tag_class == V_ASN1_UNIVERSAL && tag_number > V_ASN1_MAX_UNIVERSAL) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_HEADER_TOO_LONG);
+    return 0x80;
+  }
+
+  *inp = CBS_data(&body);
+  *out_len = CBS_len(&body);
+  *out_tag = tag_number;
+  *out_class = tag_class;
+  return constructed;
 }
 
-static int asn1_get_length(const unsigned char **pp, long *rl, long max)
-{
-    const unsigned char *p = *pp;
-    unsigned long ret = 0;
-    unsigned long i;
-
-    if (max-- < 1) {
-        return 0;
-    }
-    if (*p == 0x80) {
-        /* We do not support BER indefinite-length encoding. */
-        return 0;
-    }
-    i = *p & 0x7f;
-    if (*(p++) & 0x80) {
-        if (i > sizeof(ret) || max < (long)i)
-            return 0;
-        while (i-- > 0) {
-            ret <<= 8L;
-            ret |= *(p++);
-        }
-    } else {
-        ret = i;
-    }
-    /*
-     * Bound the length to comfortably fit in an int. Lengths in this module
-     * often switch between int and long without overflow checks.
-     */
-    if (ret > INT_MAX / 2)
-        return 0;
-    *pp = p;
-    *rl = (long)ret;
-    return 1;
-}
-
-/*
- * class 0 is constructed constructed == 2 for indefinite length constructed
- */
+// class 0 is constructed constructed == 2 for indefinite length constructed
 void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
-                     int xclass)
-{
-    unsigned char *p = *pp;
-    int i, ttag;
+                     int xclass) {
+  unsigned char *p = *pp;
+  int i, ttag;
 
-    i = (constructed) ? V_ASN1_CONSTRUCTED : 0;
-    i |= (xclass & V_ASN1_PRIVATE);
-    if (tag < 31)
-        *(p++) = i | (tag & V_ASN1_PRIMITIVE_TAG);
-    else {
-        *(p++) = i | V_ASN1_PRIMITIVE_TAG;
-        for (i = 0, ttag = tag; ttag > 0; i++)
-            ttag >>= 7;
-        ttag = i;
-        while (i-- > 0) {
-            p[i] = tag & 0x7f;
-            if (i != (ttag - 1))
-                p[i] |= 0x80;
-            tag >>= 7;
-        }
-        p += ttag;
+  i = (constructed) ? V_ASN1_CONSTRUCTED : 0;
+  i |= (xclass & V_ASN1_PRIVATE);
+  if (tag < 31) {
+    *(p++) = i | (tag & V_ASN1_PRIMITIVE_TAG);
+  } else {
+    *(p++) = i | V_ASN1_PRIMITIVE_TAG;
+    for (i = 0, ttag = tag; ttag > 0; i++) {
+      ttag >>= 7;
     }
-    if (constructed == 2)
-        *(p++) = 0x80;
-    else
-        asn1_put_length(&p, length);
-    *pp = p;
+    ttag = i;
+    while (i-- > 0) {
+      p[i] = tag & 0x7f;
+      if (i != (ttag - 1)) {
+        p[i] |= 0x80;
+      }
+      tag >>= 7;
+    }
+    p += ttag;
+  }
+  if (constructed == 2) {
+    *(p++) = 0x80;
+  } else {
+    asn1_put_length(&p, length);
+  }
+  *pp = p;
 }
 
-int ASN1_put_eoc(unsigned char **pp)
-{
-    /* This function is no longer used in the library, but some external code
-     * uses it. */
-    unsigned char *p = *pp;
-    *p++ = 0;
-    *p++ = 0;
-    *pp = p;
-    return 2;
+int ASN1_put_eoc(unsigned char **pp) {
+  // This function is no longer used in the library, but some external code
+  // uses it.
+  unsigned char *p = *pp;
+  *p++ = 0;
+  *p++ = 0;
+  *pp = p;
+  return 2;
 }
 
-static void asn1_put_length(unsigned char **pp, int length)
-{
-    unsigned char *p = *pp;
-    int i, l;
-    if (length <= 127)
-        *(p++) = (unsigned char)length;
-    else {
-        l = length;
-        for (i = 0; l > 0; i++)
-            l >>= 8;
-        *(p++) = i | 0x80;
-        l = i;
-        while (i-- > 0) {
-            p[i] = length & 0xff;
-            length >>= 8;
-        }
-        p += l;
+static void asn1_put_length(unsigned char **pp, int length) {
+  unsigned char *p = *pp;
+  int i, l;
+  if (length <= 127) {
+    *(p++) = (unsigned char)length;
+  } else {
+    l = length;
+    for (i = 0; l > 0; i++) {
+      l >>= 8;
     }
-    *pp = p;
+    *(p++) = i | 0x80;
+    l = i;
+    while (i-- > 0) {
+      p[i] = length & 0xff;
+      length >>= 8;
+    }
+    p += l;
+  }
+  *pp = p;
 }
 
-int ASN1_object_size(int constructed, int length, int tag)
-{
-    int ret = 1;
-    if (length < 0)
-        return -1;
-    if (tag >= 31) {
-        while (tag > 0) {
-            tag >>= 7;
-            ret++;
-        }
+int ASN1_object_size(int constructed, int length, int tag) {
+  int ret = 1;
+  if (length < 0) {
+    return -1;
+  }
+  if (tag >= 31) {
+    while (tag > 0) {
+      tag >>= 7;
+      ret++;
     }
-    if (constructed == 2) {
-        ret += 3;
-    } else {
+  }
+  if (constructed == 2) {
+    ret += 3;
+  } else {
+    ret++;
+    if (length > 127) {
+      int tmplen = length;
+      while (tmplen > 0) {
+        tmplen >>= 8;
         ret++;
-        if (length > 127) {
-            int tmplen = length;
-            while (tmplen > 0) {
-                tmplen >>= 8;
-                ret++;
-            }
-        }
+      }
     }
-    if (ret >= INT_MAX - length)
-        return -1;
-    return ret + length;
+  }
+  if (ret >= INT_MAX - length) {
+    return -1;
+  }
+  return ret + length;
 }
 
-int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str)
-{
-    if (str == NULL)
-        return 0;
-    if (!ASN1_STRING_set(dst, str->data, str->length))
-        return 0;
-    dst->type = str->type;
-    dst->flags = str->flags;
-    return 1;
-}
-
-ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str)
-{
-    ASN1_STRING *ret;
-    if (!str)
-        return NULL;
-    ret = ASN1_STRING_new();
-    if (!ret)
-        return NULL;
-    if (!ASN1_STRING_copy(ret, str)) {
-        ASN1_STRING_free(ret);
-        return NULL;
-    }
-    return ret;
-}
-
-int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
-{
-    unsigned char *c;
-    const char *data = _data;
-
-    if (len < 0) {
-        if (data == NULL)
-            return (0);
-        else
-            len = strlen(data);
-    }
-    if ((str->length <= len) || (str->data == NULL)) {
-        c = str->data;
-        if (c == NULL)
-            str->data = OPENSSL_malloc(len + 1);
-        else
-            str->data = OPENSSL_realloc(c, len + 1);
-
-        if (str->data == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            str->data = c;
-            return (0);
-        }
-    }
-    str->length = len;
-    if (data != NULL) {
-        OPENSSL_memcpy(str->data, data, len);
-        /* an allowance for strings :-) */
-        str->data[len] = '\0';
-    }
-    return (1);
-}
-
-void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len)
-{
-    OPENSSL_free(str->data);
-    str->data = data;
-    str->length = len;
-}
-
-ASN1_STRING *ASN1_STRING_new(void)
-{
-    return (ASN1_STRING_type_new(V_ASN1_OCTET_STRING));
-}
-
-ASN1_STRING *ASN1_STRING_type_new(int type)
-{
-    ASN1_STRING *ret;
-
-    ret = (ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING));
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return (NULL);
-    }
-    ret->length = 0;
-    ret->type = type;
-    ret->data = NULL;
-    ret->flags = 0;
-    return (ret);
-}
-
-void ASN1_STRING_free(ASN1_STRING *str)
-{
-    if (str == NULL)
-        return;
-    OPENSSL_free(str->data);
-    OPENSSL_free(str);
-}
-
-int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b)
-{
-    /* Capture padding bits and implicit truncation in BIT STRINGs. */
-    int a_length = a->length, b_length = b->length;
-    uint8_t a_padding = 0, b_padding = 0;
-    if (a->type == V_ASN1_BIT_STRING) {
-        a_length = asn1_bit_string_length(a, &a_padding);
-    }
-    if (b->type == V_ASN1_BIT_STRING) {
-        b_length = asn1_bit_string_length(b, &b_padding);
-    }
-
-    if (a_length < b_length) {
-        return -1;
-    }
-    if (a_length > b_length) {
-        return 1;
-    }
-    /* In a BIT STRING, the number of bits is 8 * length - padding. Invert this
-     * comparison so we compare by lengths. */
-    if (a_padding > b_padding) {
-        return -1;
-    }
-    if (a_padding < b_padding) {
-        return 1;
-    }
-
-    int ret = OPENSSL_memcmp(a->data, b->data, a_length);
-    if (ret != 0) {
-        return ret;
-    }
-
-    /* Comparing the type first is more natural, but this matches OpenSSL. */
-    if (a->type < b->type) {
-        return -1;
-    }
-    if (a->type > b->type) {
-        return 1;
-    }
+int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) {
+  if (str == NULL) {
     return 0;
+  }
+  if (!ASN1_STRING_set(dst, str->data, str->length)) {
+    return 0;
+  }
+  dst->type = str->type;
+  dst->flags = str->flags;
+  return 1;
 }
 
-int ASN1_STRING_length(const ASN1_STRING *str)
-{
-    return str->length;
+ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) {
+  ASN1_STRING *ret;
+  if (!str) {
+    return NULL;
+  }
+  ret = ASN1_STRING_new();
+  if (!ret) {
+    return NULL;
+  }
+  if (!ASN1_STRING_copy(ret, str)) {
+    ASN1_STRING_free(ret);
+    return NULL;
+  }
+  return ret;
 }
 
-int ASN1_STRING_type(const ASN1_STRING *str)
-{
-    return str->type;
+int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len) {
+  unsigned char *c;
+  const char *data = _data;
+
+  if (len < 0) {
+    if (data == NULL) {
+      return 0;
+    } else {
+      len = strlen(data);
+    }
+  }
+  if ((str->length <= len) || (str->data == NULL)) {
+    c = str->data;
+    if (c == NULL) {
+      str->data = OPENSSL_malloc(len + 1);
+    } else {
+      str->data = OPENSSL_realloc(c, len + 1);
+    }
+
+    if (str->data == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      str->data = c;
+      return 0;
+    }
+  }
+  str->length = len;
+  if (data != NULL) {
+    OPENSSL_memcpy(str->data, data, len);
+    // an allowance for strings :-)
+    str->data[len] = '\0';
+  }
+  return 1;
 }
 
-unsigned char *ASN1_STRING_data(ASN1_STRING *str)
-{
-    return str->data;
+void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len) {
+  OPENSSL_free(str->data);
+  str->data = data;
+  str->length = len;
 }
 
-const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *str)
-{
-    return str->data;
+ASN1_STRING *ASN1_STRING_new(void) {
+  return (ASN1_STRING_type_new(V_ASN1_OCTET_STRING));
+}
+
+ASN1_STRING *ASN1_STRING_type_new(int type) {
+  ASN1_STRING *ret;
+
+  ret = (ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING));
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  ret->length = 0;
+  ret->type = type;
+  ret->data = NULL;
+  ret->flags = 0;
+  return ret;
+}
+
+void ASN1_STRING_free(ASN1_STRING *str) {
+  if (str == NULL) {
+    return;
+  }
+  OPENSSL_free(str->data);
+  OPENSSL_free(str);
+}
+
+int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) {
+  // Capture padding bits and implicit truncation in BIT STRINGs.
+  int a_length = a->length, b_length = b->length;
+  uint8_t a_padding = 0, b_padding = 0;
+  if (a->type == V_ASN1_BIT_STRING) {
+    a_length = asn1_bit_string_length(a, &a_padding);
+  }
+  if (b->type == V_ASN1_BIT_STRING) {
+    b_length = asn1_bit_string_length(b, &b_padding);
+  }
+
+  if (a_length < b_length) {
+    return -1;
+  }
+  if (a_length > b_length) {
+    return 1;
+  }
+  // In a BIT STRING, the number of bits is 8 * length - padding. Invert this
+  // comparison so we compare by lengths.
+  if (a_padding > b_padding) {
+    return -1;
+  }
+  if (a_padding < b_padding) {
+    return 1;
+  }
+
+  int ret = OPENSSL_memcmp(a->data, b->data, a_length);
+  if (ret != 0) {
+    return ret;
+  }
+
+  // Comparing the type first is more natural, but this matches OpenSSL.
+  if (a->type < b->type) {
+    return -1;
+  }
+  if (a->type > b->type) {
+    return 1;
+  }
+  return 0;
+}
+
+int ASN1_STRING_length(const ASN1_STRING *str) { return str->length; }
+
+int ASN1_STRING_type(const ASN1_STRING *str) { return str->type; }
+
+unsigned char *ASN1_STRING_data(ASN1_STRING *str) { return str->data; }
+
+const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *str) {
+  return str->data;
 }
diff --git a/src/crypto/asn1/asn1_par.c b/src/crypto/asn1/asn1_par.c
index 282ad23..d065e20 100644
--- a/src/crypto/asn1/asn1_par.c
+++ b/src/crypto/asn1/asn1_par.c
@@ -57,24 +57,47 @@
 #include <openssl/asn1.h>
 
 
-const char *ASN1_tag2str(int tag)
-{
-    static const char *const tag2str[] = {
-        "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", /* 0-4 */
-        "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", /* 5-9 */
-        "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>", /* 10-13 */
-        "<ASN1 14>", "<ASN1 15>", "SEQUENCE", "SET", /* 15-17 */
-        "NUMERICSTRING", "PRINTABLESTRING", "T61STRING", /* 18-20 */
-        "VIDEOTEXSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME", /* 21-24
-                                                                      */
-        "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", /* 25-27 */
-        "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING" /* 28-30 */
-    };
+const char *ASN1_tag2str(int tag) {
+  static const char *const tag2str[] = {
+      "EOC",
+      "BOOLEAN",
+      "INTEGER",
+      "BIT STRING",
+      "OCTET STRING",
+      "NULL",
+      "OBJECT",
+      "OBJECT DESCRIPTOR",
+      "EXTERNAL",
+      "REAL",
+      "ENUMERATED",
+      "<ASN1 11>",
+      "UTF8STRING",
+      "<ASN1 13>",
+      "<ASN1 14>",
+      "<ASN1 15>",
+      "SEQUENCE",
+      "SET",
+      "NUMERICSTRING",
+      "PRINTABLESTRING",
+      "T61STRING",
+      "VIDEOTEXSTRING",
+      "IA5STRING",
+      "UTCTIME",
+      "GENERALIZEDTIME",
+      "GRAPHICSTRING",
+      "VISIBLESTRING",
+      "GENERALSTRING",
+      "UNIVERSALSTRING",
+      "<ASN1 29>",
+      "BMPSTRING",
+  };
 
-    if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
-        tag &= ~V_ASN1_NEG;
+  if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED)) {
+    tag &= ~V_ASN1_NEG;
+  }
 
-    if (tag < 0 || tag > 30)
-        return "(unknown)";
-    return tag2str[tag];
+  if (tag < 0 || tag > 30) {
+    return "(unknown)";
+  }
+  return tag2str[tag];
 }
diff --git a/src/crypto/asn1/asn1_test.cc b/src/crypto/asn1/asn1_test.cc
index ab9cb01..2f0ec76 100644
--- a/src/crypto/asn1/asn1_test.cc
+++ b/src/crypto/asn1/asn1_test.cc
@@ -15,6 +15,7 @@
 #include <limits.h>
 #include <stdio.h>
 
+#include <map>
 #include <string>
 #include <vector>
 
@@ -22,6 +23,7 @@
 
 #include <openssl/asn1.h>
 #include <openssl/asn1t.h>
+#include <openssl/bio.h>
 #include <openssl/bytestring.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
@@ -76,33 +78,6 @@
                                     obj->value.asn1_string->length));
 }
 
-TEST(ASN1Test, IntegerSetting) {
-  bssl::UniquePtr<ASN1_INTEGER> by_bn(ASN1_INTEGER_new());
-  bssl::UniquePtr<ASN1_INTEGER> by_long(ASN1_INTEGER_new());
-  bssl::UniquePtr<ASN1_INTEGER> by_uint64(ASN1_INTEGER_new());
-  bssl::UniquePtr<BIGNUM> bn(BN_new());
-
-  const std::vector<int64_t> kValues = {
-      LONG_MIN, -2, -1, 0, 1, 2, 0xff, 0x100, 0xffff, 0x10000, LONG_MAX,
-  };
-  for (const auto &i : kValues) {
-    SCOPED_TRACE(i);
-
-    ASSERT_EQ(1, ASN1_INTEGER_set(by_long.get(), i));
-    const uint64_t abs = i < 0 ? (0 - (uint64_t) i) : i;
-    ASSERT_TRUE(BN_set_u64(bn.get(), abs));
-    BN_set_negative(bn.get(), i < 0);
-    ASSERT_TRUE(BN_to_ASN1_INTEGER(bn.get(), by_bn.get()));
-
-    EXPECT_EQ(0, ASN1_INTEGER_cmp(by_bn.get(), by_long.get()));
-
-    if (i >= 0) {
-      ASSERT_EQ(1, ASN1_INTEGER_set_uint64(by_uint64.get(), i));
-      EXPECT_EQ(0, ASN1_INTEGER_cmp(by_bn.get(), by_uint64.get()));
-    }
-  }
-}
-
 // |obj| and |i2d_func| require different template parameters because C++ may
 // deduce, say, |ASN1_STRING*| via |obj| and |const ASN1_STRING*| via
 // |i2d_func|. Template argument deduction then fails. The language is not able
@@ -131,6 +106,410 @@
   EXPECT_EQ(Bytes(expected), Bytes(buf));
 }
 
+static bssl::UniquePtr<BIGNUM> BIGNUMPow2(unsigned bit) {
+  bssl::UniquePtr<BIGNUM> bn(BN_new());
+  if (!bn ||
+      !BN_set_bit(bn.get(), bit)) {
+    return nullptr;
+  }
+  return bn;
+}
+
+TEST(ASN1Test, Integer) {
+  bssl::UniquePtr<BIGNUM> int64_min = BIGNUMPow2(63);
+  ASSERT_TRUE(int64_min);
+  BN_set_negative(int64_min.get(), 1);
+
+  bssl::UniquePtr<BIGNUM> int64_max = BIGNUMPow2(63);
+  ASSERT_TRUE(int64_max);
+  ASSERT_TRUE(BN_sub_word(int64_max.get(), 1));
+
+  bssl::UniquePtr<BIGNUM> int32_min = BIGNUMPow2(31);
+  ASSERT_TRUE(int32_min);
+  BN_set_negative(int32_min.get(), 1);
+
+  bssl::UniquePtr<BIGNUM> int32_max = BIGNUMPow2(31);
+  ASSERT_TRUE(int32_max);
+  ASSERT_TRUE(BN_sub_word(int32_max.get(), 1));
+
+  struct {
+    // der is the DER encoding of the INTEGER, including the tag and length.
+    std::vector<uint8_t> der;
+    // type and data are the corresponding fields of the |ASN1_STRING|
+    // representation.
+    int type;
+    std::vector<uint8_t> data;
+    // bn_asc is the |BIGNUM| representation, as parsed by the |BN_asc2bn|
+    // function.
+    const char *bn_asc;
+  } kTests[] = {
+      // -2^64 - 1
+      {{0x02, 0x09, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_NEG_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       "-0x10000000000000001"},
+      // -2^64
+      {{0x02, 0x09, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_NEG_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       "-0x10000000000000000"},
+      // -2^64 + 1
+      {{0x02, 0x09, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       V_ASN1_NEG_INTEGER,
+       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       "-0xffffffffffffffff"},
+      // -2^63 - 1
+      {{0x02, 0x09, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_NEG_INTEGER,
+       {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       "-0x8000000000000001"},
+      // -2^63 (INT64_MIN)
+      {{0x02, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_NEG_INTEGER,
+       {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       "-0x8000000000000000"},
+      // -2^63 + 1
+      {{0x02, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       V_ASN1_NEG_INTEGER,
+       {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       "-0x7fffffffffffffff"},
+      // -2^32 - 1
+      {{0x02, 0x05, 0xfe, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_NEG_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x01},
+       "-0x100000001"},
+      // -2^32
+      {{0x02, 0x05, 0xff, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_NEG_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00},
+       "-0x100000000"},
+      // -2^32 + 1
+      {{0x02, 0x05, 0xff, 0x00, 0x00, 0x00, 0x01},
+       V_ASN1_NEG_INTEGER,
+       {0xff, 0xff, 0xff, 0xff},
+       "-0xffffffff"},
+      // -2^31 - 1
+      {{0x02, 0x05, 0xff, 0x7f, 0xff, 0xff, 0xff},
+       V_ASN1_NEG_INTEGER,
+       {0x80, 0x00, 0x00, 0x01},
+       "-0x80000001"},
+      // -2^31 (INT32_MIN)
+      {{0x02, 0x04, 0x80, 0x00, 0x00, 0x00},
+       V_ASN1_NEG_INTEGER,
+       {0x80, 0x00, 0x00, 0x00},
+       "-0x80000000"},
+      // -2^31 + 1
+      {{0x02, 0x04, 0x80, 0x00, 0x00, 0x01},
+       V_ASN1_NEG_INTEGER,
+       {0x7f, 0xff, 0xff, 0xff},
+       "-0x7fffffff"},
+      // -257
+      {{0x02, 0x02, 0xfe, 0xff}, V_ASN1_NEG_INTEGER, {0x01, 0x01}, "-257"},
+      // -256
+      {{0x02, 0x02, 0xff, 0x00}, V_ASN1_NEG_INTEGER, {0x01, 0x00}, "-256"},
+      // -255
+      {{0x02, 0x02, 0xff, 0x01}, V_ASN1_NEG_INTEGER, {0xff}, "-255"},
+      // -129
+      {{0x02, 0x02, 0xff, 0x7f}, V_ASN1_NEG_INTEGER, {0x81}, "-129"},
+      // -128
+      {{0x02, 0x01, 0x80}, V_ASN1_NEG_INTEGER, {0x80}, "-128"},
+      // -127
+      {{0x02, 0x01, 0x81}, V_ASN1_NEG_INTEGER, {0x7f}, "-127"},
+      // -1
+      {{0x02, 0x01, 0xff}, V_ASN1_NEG_INTEGER, {0x01}, "-1"},
+      // 0
+      {{0x02, 0x01, 0x00}, V_ASN1_INTEGER, {}, "0"},
+      // 1
+      {{0x02, 0x01, 0x01}, V_ASN1_INTEGER, {0x01}, "1"},
+      // 127
+      {{0x02, 0x01, 0x7f}, V_ASN1_INTEGER, {0x7f}, "127"},
+      // 128
+      {{0x02, 0x02, 0x00, 0x80}, V_ASN1_INTEGER, {0x80}, "128"},
+      // 129
+      {{0x02, 0x02, 0x00, 0x81}, V_ASN1_INTEGER, {0x81}, "129"},
+      // 255
+      {{0x02, 0x02, 0x00, 0xff}, V_ASN1_INTEGER, {0xff}, "255"},
+      // 256
+      {{0x02, 0x02, 0x01, 0x00}, V_ASN1_INTEGER, {0x01, 0x00}, "256"},
+      // 257
+      {{0x02, 0x02, 0x01, 0x01}, V_ASN1_INTEGER, {0x01, 0x01}, "257"},
+      // 2^31 - 2
+      {{0x02, 0x04, 0x7f, 0xff, 0xff, 0xfe},
+       V_ASN1_INTEGER,
+       {0x7f, 0xff, 0xff, 0xfe},
+       "0x7ffffffe"},
+      // 2^31 - 1 (INT32_MAX)
+      {{0x02, 0x04, 0x7f, 0xff, 0xff, 0xff},
+       V_ASN1_INTEGER,
+       {0x7f, 0xff, 0xff, 0xff},
+       "0x7fffffff"},
+      // 2^31
+      {{0x02, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00},
+       V_ASN1_INTEGER,
+       {0x80, 0x00, 0x00, 0x00},
+       "0x80000000"},
+      // 2^32 - 2
+      {{0x02, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfe},
+       V_ASN1_INTEGER,
+       {0xff, 0xff, 0xff, 0xfe},
+       "0xfffffffe"},
+      // 2^32 - 1 (UINT32_MAX)
+      {{0x02, 0x05, 0x00, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_INTEGER,
+       {0xff, 0xff, 0xff, 0xff},
+       "0xffffffff"},
+      // 2^32
+      {{0x02, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00},
+       "0x100000000"},
+      // 2^63 - 2
+      {{0x02, 0x08, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
+       V_ASN1_INTEGER,
+       {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
+       "0x7ffffffffffffffe"},
+      // 2^63 - 1 (INT64_MAX)
+      {{0x02, 0x08, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_INTEGER,
+       {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       "0x7fffffffffffffff"},
+      // 2^63
+      {{0x02, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_INTEGER,
+       {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       "0x8000000000000000"},
+      // 2^64 - 2
+      {{0x02, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
+       V_ASN1_INTEGER,
+       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
+       "0xfffffffffffffffe"},
+      // 2^64 - 1 (UINT64_MAX)
+      {{0x02, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       V_ASN1_INTEGER,
+       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+       "0xffffffffffffffff"},
+      // 2^64
+      {{0x02, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       V_ASN1_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+       "0x10000000000000000"},
+      // 2^64 + 1
+      {{0x02, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       V_ASN1_INTEGER,
+       {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+       "0x10000000000000001"},
+  };
+
+  for (const auto &t : kTests) {
+    SCOPED_TRACE(t.bn_asc);
+    // Collect a map of different ways to construct the integer. The key is the
+    // method used and is only retained to aid debugging.
+    std::map<std::string, bssl::UniquePtr<ASN1_INTEGER>> objs;
+
+    // Construct |ASN1_INTEGER| by setting the type and data manually.
+    bssl::UniquePtr<ASN1_INTEGER> by_data(ASN1_STRING_type_new(t.type));
+    ASSERT_TRUE(by_data);
+    ASSERT_TRUE(ASN1_STRING_set(by_data.get(), t.data.data(), t.data.size()));
+    objs["data"] = std::move(by_data);
+
+    // Construct |ASN1_INTEGER| from a |BIGNUM|.
+    BIGNUM *bn_raw = nullptr;
+    ASSERT_TRUE(BN_asc2bn(&bn_raw, t.bn_asc));
+    bssl::UniquePtr<BIGNUM> bn(bn_raw);
+    bssl::UniquePtr<ASN1_INTEGER> by_bn(BN_to_ASN1_INTEGER(bn.get(), nullptr));
+    ASSERT_TRUE(by_bn);
+    objs["bn"] = std::move(by_bn);
+
+    // Construct |ASN1_INTEGER| from decoding.
+    const uint8_t *ptr = t.der.data();
+    bssl::UniquePtr<ASN1_INTEGER> by_der(
+        d2i_ASN1_INTEGER(nullptr, &ptr, t.der.size()));
+    ASSERT_TRUE(by_der);
+    EXPECT_EQ(ptr, t.der.data() + t.der.size());
+    objs["der"] = std::move(by_der);
+
+    // Construct |ASN1_INTEGER| from various C types, if it fits.
+    bool fits_in_long = false, fits_in_i64 = false, fits_in_u64 = false;
+    uint64_t u64 = 0;
+    int64_t i64 = 0;
+    long l = 0;
+    uint64_t abs_u64;
+    if (BN_get_u64(bn.get(), &abs_u64)) {
+      fits_in_u64 = !BN_is_negative(bn.get());
+      if (fits_in_u64) {
+        u64 = abs_u64;
+        bssl::UniquePtr<ASN1_INTEGER> by_u64(ASN1_INTEGER_new());
+        ASSERT_TRUE(by_u64);
+        ASSERT_TRUE(ASN1_INTEGER_set_uint64(by_u64.get(), u64));
+        objs["u64"] = std::move(by_u64);
+      }
+
+      fits_in_i64 = BN_cmp(int64_min.get(), bn.get()) <= 0 &&
+                    BN_cmp(bn.get(), int64_max.get()) <= 0;
+      if (fits_in_i64) {
+        if (BN_is_negative(bn.get())) {
+          i64 = static_cast<int64_t>(0u - abs_u64);
+        } else {
+          i64 = static_cast<int64_t>(abs_u64);
+        }
+        bssl::UniquePtr<ASN1_INTEGER> by_i64(ASN1_INTEGER_new());
+        ASSERT_TRUE(by_i64);
+        ASSERT_TRUE(ASN1_INTEGER_set_int64(by_i64.get(), i64));
+        objs["i64"] = std::move(by_i64);
+      }
+
+      if (sizeof(long) == 8) {
+        fits_in_long = fits_in_i64;
+      } else {
+        ASSERT_EQ(4u, sizeof(long));
+        fits_in_long = BN_cmp(int32_min.get(), bn.get()) <= 0 &&
+                       BN_cmp(bn.get(), int32_max.get()) <= 0;
+      }
+      if (fits_in_long) {
+        l = static_cast<long>(i64);
+        bssl::UniquePtr<ASN1_INTEGER> by_long(ASN1_INTEGER_new());
+        ASSERT_TRUE(by_long);
+        ASSERT_TRUE(ASN1_INTEGER_set(by_long.get(), l));
+        objs["long"] = std::move(by_long);
+      }
+    }
+
+    // Default construction should return the zero |ASN1_INTEGER|.
+    if (BN_is_zero(bn.get())) {
+      bssl::UniquePtr<ASN1_INTEGER> by_default(ASN1_INTEGER_new());
+      ASSERT_TRUE(by_default);
+      objs["default"] = std::move(by_default);
+    }
+
+    // Test that every |ASN1_INTEGER| constructed behaves as expected.
+    for (const auto &pair : objs) {
+      // The fields should be as expected.
+      SCOPED_TRACE(pair.first);
+      const ASN1_INTEGER *obj = pair.second.get();
+      EXPECT_EQ(t.type, ASN1_STRING_type(obj));
+      EXPECT_EQ(Bytes(t.data), Bytes(ASN1_STRING_get0_data(obj),
+                                     ASN1_STRING_length(obj)));
+
+      // The object should encode correctly.
+      TestSerialize(obj, i2d_ASN1_INTEGER, t.der);
+
+      bssl::UniquePtr<BIGNUM> bn2(ASN1_INTEGER_to_BN(obj, nullptr));
+      ASSERT_TRUE(bn2);
+      EXPECT_EQ(0, BN_cmp(bn.get(), bn2.get()));
+
+      if (fits_in_u64) {
+        uint64_t v;
+        ASSERT_TRUE(ASN1_INTEGER_get_uint64(&v, obj));
+        EXPECT_EQ(v, u64);
+      } else {
+        uint64_t v;
+        EXPECT_FALSE(ASN1_INTEGER_get_uint64(&v, obj));
+      }
+
+      if (fits_in_i64) {
+        int64_t v;
+        ASSERT_TRUE(ASN1_INTEGER_get_int64(&v, obj));
+        EXPECT_EQ(v, i64);
+      } else {
+        int64_t v;
+        EXPECT_FALSE(ASN1_INTEGER_get_int64(&v, obj));
+      }
+
+      if (fits_in_long) {
+        EXPECT_EQ(l, ASN1_INTEGER_get(obj));
+      } else {
+        EXPECT_EQ(-1, ASN1_INTEGER_get(obj));
+      }
+
+      // All variations of integers should compare as equal to each other, as
+      // strings or integers. (Functions like |ASN1_TYPE_cmp| rely on
+      // string-based comparison.)
+      for (const auto &pair2 : objs) {
+        SCOPED_TRACE(pair2.first);
+        EXPECT_EQ(0, ASN1_INTEGER_cmp(obj, pair2.second.get()));
+        EXPECT_EQ(0, ASN1_STRING_cmp(obj, pair2.second.get()));
+      }
+    }
+
+    // Although our parsers will never output non-minimal |ASN1_INTEGER|s, it is
+    // possible to construct them manually. They should encode correctly.
+    std::vector<uint8_t> data = t.data;
+    const int kMaxExtraBytes = 5;
+    for (int i = 0; i < kMaxExtraBytes; i++) {
+      data.insert(data.begin(), 0x00);
+      SCOPED_TRACE(Bytes(data));
+
+      bssl::UniquePtr<ASN1_INTEGER> non_minimal(ASN1_STRING_type_new(t.type));
+      ASSERT_TRUE(non_minimal);
+      ASSERT_TRUE(ASN1_STRING_set(non_minimal.get(), data.data(), data.size()));
+
+      TestSerialize(non_minimal.get(), i2d_ASN1_INTEGER, t.der);
+    }
+  }
+
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTests); i++) {
+    SCOPED_TRACE(Bytes(kTests[i].der));
+    const uint8_t *ptr = kTests[i].der.data();
+    bssl::UniquePtr<ASN1_INTEGER> a(
+        d2i_ASN1_INTEGER(nullptr, &ptr, kTests[i].der.size()));
+    ASSERT_TRUE(a);
+    for (size_t j = 0; j < OPENSSL_ARRAY_SIZE(kTests); j++) {
+      SCOPED_TRACE(Bytes(kTests[j].der));
+      ptr = kTests[j].der.data();
+      bssl::UniquePtr<ASN1_INTEGER> b(
+          d2i_ASN1_INTEGER(nullptr, &ptr, kTests[j].der.size()));
+      ASSERT_TRUE(b);
+
+      // |ASN1_INTEGER_cmp| should compare numerically. |ASN1_STRING_cmp| does
+      // not but should preserve equality.
+      if (i < j) {
+        EXPECT_LT(ASN1_INTEGER_cmp(a.get(), b.get()), 0);
+        EXPECT_NE(ASN1_STRING_cmp(a.get(), b.get()), 0);
+      } else if (i > j) {
+        EXPECT_GT(ASN1_INTEGER_cmp(a.get(), b.get()), 0);
+        EXPECT_NE(ASN1_STRING_cmp(a.get(), b.get()), 0);
+      } else {
+        EXPECT_EQ(ASN1_INTEGER_cmp(a.get(), b.get()), 0);
+        EXPECT_EQ(ASN1_STRING_cmp(a.get(), b.get()), 0);
+      }
+    }
+  }
+
+  std::vector<uint8_t> kInvalidTests[] = {
+      // The empty string is not an integer.
+      {0x02, 0x00},
+      // Integers must be minimally-encoded.
+      {0x02, 0x02, 0x00, 0x00},
+      {0x02, 0x02, 0x00, 0x7f},
+      {0x02, 0x02, 0xff, 0xff},
+      {0x02, 0x02, 0xff, 0x80},
+  };
+  for (const auto &invalid : kInvalidTests) {
+    SCOPED_TRACE(Bytes(invalid));
+
+    const uint8_t *ptr = invalid.data();
+    bssl::UniquePtr<ASN1_INTEGER> integer(
+        d2i_ASN1_INTEGER(nullptr, &ptr, invalid.size()));
+    EXPECT_FALSE(integer);
+  }
+
+  // Callers expect |ASN1_INTEGER_get| and |ASN1_ENUMERATED_get| to return zero
+  // given NULL.
+  EXPECT_EQ(0, ASN1_INTEGER_get(nullptr));
+  EXPECT_EQ(0, ASN1_ENUMERATED_get(nullptr));
+}
+
+// Although invalid, a negative zero should encode correctly.
+TEST(ASN1Test, NegativeZero) {
+  bssl::UniquePtr<ASN1_INTEGER> neg_zero(
+      ASN1_STRING_type_new(V_ASN1_NEG_INTEGER));
+  ASSERT_TRUE(neg_zero);
+  EXPECT_EQ(0, ASN1_INTEGER_get(neg_zero.get()));
+
+  static const uint8_t kDER[] = {0x02, 0x01, 0x00};
+  TestSerialize(neg_zero.get(), i2d_ASN1_INTEGER, kDER);
+}
+
 TEST(ASN1Test, SerializeObject) {
   static const uint8_t kDER[] = {0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
                                  0xf7, 0x0d, 0x01, 0x01, 0x01};
@@ -512,6 +891,8 @@
       {{0, 0, 0xfd, 0xd5}, V_ASN1_UNIVERSALSTRING, nullptr},
       // BMPString is UCS-2, not UTF-16, so surrogate pairs are invalid.
       {{0xd8, 0, 0xdc, 1}, V_ASN1_BMPSTRING, nullptr},
+      // INTEGERs are stored as strings, but cannot be converted to UTF-8.
+      {{0x01}, V_ASN1_INTEGER, nullptr},
   };
 
   for (const auto &test : kTests) {
@@ -540,44 +921,91 @@
                      ASN1_STRING_get0_data(str) + ASN1_STRING_length(str));
 }
 
+static bool ASN1Time_check_time_t(const ASN1_TIME *s, time_t t) {
+  struct tm stm, ttm;
+  int day, sec;
+
+  switch (ASN1_STRING_type(s)) {
+    case V_ASN1_GENERALIZEDTIME:
+      if (!asn1_generalizedtime_to_tm(&stm, s)) {
+        return false;
+      }
+      break;
+    case V_ASN1_UTCTIME:
+      if (!asn1_utctime_to_tm(&stm, s, /*allow_timezone_offset=*/1)) {
+        return false;
+      }
+      break;
+    default:
+      return false;
+  }
+  if (!OPENSSL_gmtime(&t, &ttm) ||
+      !OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm)) {
+    return false;
+  }
+  return day == 0 && sec ==0;
+}
+
+static std::string PrintStringToBIO(const ASN1_STRING *str,
+                                    int (*print_func)(BIO *,
+                                                      const ASN1_STRING *)) {
+  const uint8_t *data;
+  size_t len;
+  bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
+  if (!bio ||  //
+      !print_func(bio.get(), str) ||
+      !BIO_mem_contents(bio.get(), &data, &len)) {
+    ADD_FAILURE() << "Could not print to BIO";
+    return "";
+  }
+  return std::string(data, data + len);
+}
+
 TEST(ASN1Test, SetTime) {
   static const struct {
     time_t time;
     const char *generalized;
     const char *utc;
+    const char *printed;
   } kTests[] = {
-    {-631152001, "19491231235959Z", nullptr},
-    {-631152000, "19500101000000Z", "500101000000Z"},
-    {0, "19700101000000Z", "700101000000Z"},
-    {981173106, "20010203040506Z", "010203040506Z"},
+    {-631152001, "19491231235959Z", nullptr, "Dec 31 23:59:59 1949 GMT"},
+    {-631152000, "19500101000000Z", "500101000000Z",
+     "Jan  1 00:00:00 1950 GMT"},
+    {0, "19700101000000Z", "700101000000Z", "Jan  1 00:00:00 1970 GMT"},
+    {981173106, "20010203040506Z", "010203040506Z", "Feb  3 04:05:06 2001 GMT"},
+    {951804000, "20000229060000Z", "000229060000Z", "Feb 29 06:00:00 2000 GMT"},
+    // NASA says this is the correct time for posterity.
+    {-16751025, "19690621025615Z", "690621025615Z", "Jun 21 02:56:15 1969 GMT"},
+    // -1 is sometimes used as an error value. Ensure we correctly handle it.
+    {-1, "19691231235959Z", "691231235959Z", "Dec 31 23:59:59 1969 GMT"},
 #if defined(OPENSSL_64_BIT)
     // TODO(https://crbug.com/boringssl/416): These cases overflow 32-bit
     // |time_t| and do not consistently work on 32-bit platforms. For now,
     // disable the tests on 32-bit. Re-enable them once the bug is fixed.
-    {2524607999, "20491231235959Z", "491231235959Z"},
-    {2524608000, "20500101000000Z", nullptr},
+    {2524607999, "20491231235959Z", "491231235959Z",
+     "Dec 31 23:59:59 2049 GMT"},
+    {2524608000, "20500101000000Z", nullptr, "Jan  1 00:00:00 2050 GMT"},
     // Test boundary conditions.
-    {-62167219200, "00000101000000Z", nullptr},
-    {-62167219201, nullptr, nullptr},
-    {253402300799, "99991231235959Z", nullptr},
-    {253402300800, nullptr, nullptr},
+    {-62167219200, "00000101000000Z", nullptr, "Jan  1 00:00:00 0 GMT"},
+    {-62167219201, nullptr, nullptr, nullptr},
+    {253402300799, "99991231235959Z", nullptr, "Dec 31 23:59:59 9999 GMT"},
+    {253402300800, nullptr, nullptr, nullptr},
 #endif
   };
   for (const auto &t : kTests) {
+    time_t tt;
     SCOPED_TRACE(t.time);
-#if defined(OPENSSL_WINDOWS)
-    // Windows |time_t| functions can only handle 1970 through 3000. See
-    // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/gmtime-s-gmtime32-s-gmtime64-s?view=msvc-160
-    if (t.time < 0 || int64_t{t.time} > 32535215999) {
-      continue;
-    }
-#endif
 
     bssl::UniquePtr<ASN1_UTCTIME> utc(ASN1_UTCTIME_set(nullptr, t.time));
     if (t.utc) {
       ASSERT_TRUE(utc);
       EXPECT_EQ(V_ASN1_UTCTIME, ASN1_STRING_type(utc.get()));
       EXPECT_EQ(t.utc, ASN1StringToStdString(utc.get()));
+      EXPECT_TRUE(ASN1Time_check_time_t(utc.get(), t.time));
+      EXPECT_EQ(ASN1_TIME_to_time_t(utc.get(), &tt), 1);
+      EXPECT_EQ(tt, t.time);
+      EXPECT_EQ(PrintStringToBIO(utc.get(), &ASN1_UTCTIME_print), t.printed);
+      EXPECT_EQ(PrintStringToBIO(utc.get(), &ASN1_TIME_print), t.printed);
     } else {
       EXPECT_FALSE(utc);
     }
@@ -588,6 +1016,14 @@
       ASSERT_TRUE(generalized);
       EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(generalized.get()));
       EXPECT_EQ(t.generalized, ASN1StringToStdString(generalized.get()));
+      EXPECT_TRUE(ASN1Time_check_time_t(generalized.get(), t.time));
+      EXPECT_EQ(ASN1_TIME_to_time_t(generalized.get(), &tt), 1);
+      EXPECT_EQ(tt, t.time);
+      EXPECT_EQ(
+          PrintStringToBIO(generalized.get(), &ASN1_GENERALIZEDTIME_print),
+          t.printed);
+      EXPECT_EQ(PrintStringToBIO(generalized.get(), &ASN1_TIME_print),
+                t.printed);
     } else {
       EXPECT_FALSE(generalized);
     }
@@ -602,6 +1038,9 @@
         EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(choice.get()));
         EXPECT_EQ(t.generalized, ASN1StringToStdString(choice.get()));
       }
+      EXPECT_TRUE(ASN1Time_check_time_t(choice.get(), t.time));
+      EXPECT_EQ(ASN1_TIME_to_time_t(choice.get(), &tt), 1);
+      EXPECT_EQ(tt, t.time);
     } else {
       EXPECT_FALSE(choice);
     }
@@ -682,6 +1121,8 @@
       {V_ASN1_T61STRING, StringToVector("   "), 0, ASN1_STRFLGS_ESC_2253,
        "\\  \\ "},
       {V_ASN1_T61STRING, StringToVector("   "), 0,
+       ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_UTF8_CONVERT, "\\  \\ "},
+      {V_ASN1_T61STRING, StringToVector("   "), 0,
        ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_QUOTE, "\"   \""},
 
       // RFC 2253 only escapes # at the start of a string.
@@ -860,11 +1301,23 @@
     int str_flags;
     unsigned long flags;
   } kUnprintableTests[] = {
-      // When decoding strings, invalid codepoints are errors.
+      // It is an error if the string cannot be decoded.
       {V_ASN1_UTF8STRING, {0xff}, 0, ASN1_STRFLGS_ESC_MSB},
       {V_ASN1_BMPSTRING, {0xff}, 0, ASN1_STRFLGS_ESC_MSB},
       {V_ASN1_BMPSTRING, {0xff}, 0, ASN1_STRFLGS_ESC_MSB},
       {V_ASN1_UNIVERSALSTRING, {0xff}, 0, ASN1_STRFLGS_ESC_MSB},
+      // Invalid codepoints are errors.
+      {V_ASN1_UTF8STRING, {0xed, 0xa0, 0x80}, 0, ASN1_STRFLGS_ESC_MSB},
+      {V_ASN1_BMPSTRING, {0xd8, 0x00}, 0, ASN1_STRFLGS_ESC_MSB},
+      {V_ASN1_UNIVERSALSTRING,
+       {0x00, 0x00, 0xd8, 0x00},
+       0,
+       ASN1_STRFLGS_ESC_MSB},
+      // Even when re-encoding UTF-8 back into UTF-8, we should check validity.
+      {V_ASN1_UTF8STRING,
+       {0xff},
+       0,
+       ASN1_STRFLGS_ESC_MSB | ASN1_STRFLGS_UTF8_CONVERT},
   };
   for (const auto &t : kUnprintableTests) {
     SCOPED_TRACE(t.type);
@@ -1700,7 +2153,7 @@
             std::string(reinterpret_cast<const char *>(bio_data), bio_len));
 }
 
-TEST(ASN1, GetObject) {
+TEST(ASN1Test, GetObject) {
   // The header is valid, but there are not enough bytes for the length.
   static const uint8_t kTruncated[] = {0x30, 0x01};
   const uint8_t *ptr = kTruncated;
@@ -1716,6 +2169,163 @@
                                   sizeof(kIndefinite)));
 }
 
+template <typename T>
+void ExpectNoParse(T *(*d2i)(T **, const uint8_t **, long),
+                   const std::vector<uint8_t> &in) {
+  SCOPED_TRACE(Bytes(in));
+  const uint8_t *ptr = in.data();
+  bssl::UniquePtr<T> obj(d2i(nullptr, &ptr, in.size()));
+  EXPECT_FALSE(obj);
+}
+
+// The zero tag, constructed or primitive, is reserved and should rejected by
+// the parser.
+TEST(ASN1Test, ZeroTag) {
+  ExpectNoParse(d2i_ASN1_TYPE, {0x00, 0x00});
+  ExpectNoParse(d2i_ASN1_TYPE, {0x00, 0x10, 0x00});
+  ExpectNoParse(d2i_ASN1_TYPE, {0x20, 0x00});
+  ExpectNoParse(d2i_ASN1_TYPE, {0x20, 0x00});
+  ExpectNoParse(d2i_ASN1_SEQUENCE_ANY, {0x30, 0x02, 0x00, 0x00});
+  ExpectNoParse(d2i_ASN1_SET_ANY, {0x31, 0x02, 0x00, 0x00});
+  // SEQUENCE {
+  //   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.1 }
+  //   [UNIVERSAL 0 PRIMITIVE] {}
+  // }
+  ExpectNoParse(d2i_X509_ALGOR,
+                {0x30, 0x10, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
+                 0x04, 0x01, 0x84, 0xb7, 0x09, 0x01, 0x00, 0x00});
+  // SEQUENCE {
+  //   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.1 }
+  //   [UNIVERSAL 0 CONSTRUCTED] {}
+  // }
+  ExpectNoParse(d2i_X509_ALGOR,
+                {0x30, 0x10, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
+                 0x04, 0x01, 0x84, 0xb7, 0x09, 0x01, 0x20, 0x00});
+  // SEQUENCE {
+  //   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.1 }
+  //   [UNIVERSAL 0 PRIMITIVE] { "a" }
+  // }
+  ExpectNoParse(d2i_X509_ALGOR,
+                {0x30, 0x11, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
+                 0x04, 0x01, 0x84, 0xb7, 0x09, 0x01, 0x00, 0x01, 0x61});
+}
+
+TEST(ASN1Test, StringEncoding) {
+  const struct {
+    ASN1_STRING *(*d2i)(ASN1_STRING **out, const uint8_t **inp, long len);
+    std::vector<uint8_t> in;
+    bool valid;
+  } kTests[] = {
+      // All OCTET STRINGs are valid.
+      {d2i_ASN1_OCTET_STRING, {0x04, 0x00}, true},
+      {d2i_ASN1_OCTET_STRING, {0x04, 0x01, 0x00}, true},
+
+      // UTF8String must be valid UTF-8.
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x00}, true},
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x01, 'a'}, true},
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x03, 0xe2, 0x98, 0x83}, true},
+      // Non-minimal, two-byte UTF-8.
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x02, 0xc0, 0x81}, false},
+      // Truncated, four-byte UTF-8.
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x03, 0xf0, 0x80, 0x80}, false},
+      // Low-surrogate value.
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x03, 0xed, 0xa0, 0x80}, false},
+      // High-surrogate value.
+      {d2i_ASN1_UTF8STRING, {0x0c, 0x03, 0xed, 0xb0, 0x81}, false},
+
+      // BMPString must be valid UCS-2.
+      {d2i_ASN1_BMPSTRING, {0x1e, 0x00}, true},
+      {d2i_ASN1_BMPSTRING, {0x1e, 0x02, 0x00, 'a'}, true},
+      // Truncated code unit.
+      {d2i_ASN1_BMPSTRING, {0x1e, 0x01, 'a'}, false},
+      // Lone surrogate.
+      {d2i_ASN1_BMPSTRING, {0x1e, 0x02, 0xd8, 0}, false},
+      // BMPString is UCS-2, not UTF-16, so surrogate pairs are also invalid.
+      {d2i_ASN1_BMPSTRING, {0x1e, 0x04, 0xd8, 0, 0xdc, 1}, false},
+
+      // UniversalString must be valid UTF-32.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x00}, true},
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x00, 0x00, 'a'}, true},
+      // Maximum code point.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x10, 0xff, 0xfd}, true},
+      // Reserved.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x10, 0xff, 0xfe}, false},
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x10, 0xff, 0xff}, false},
+      // Too high.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x11, 0x00, 0x00}, false},
+      // Surrogates are not characters.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x04, 0x00, 0x00, 0xd8, 0}, false},
+      // Truncated codepoint.
+      {d2i_ASN1_UNIVERSALSTRING, {0x1c, 0x03, 0x00, 0x00, 0x00}, false},
+
+      // We interpret T61String as Latin-1, so all inputs are valid.
+      {d2i_ASN1_T61STRING, {0x14, 0x00}, true},
+      {d2i_ASN1_T61STRING, {0x14, 0x01, 0x00}, true},
+  };
+  for (const auto& t : kTests) {
+    SCOPED_TRACE(Bytes(t.in));
+    const uint8_t *inp;
+
+    if (t.d2i != nullptr) {
+      inp = t.in.data();
+      bssl::UniquePtr<ASN1_STRING> str(t.d2i(nullptr, &inp, t.in.size()));
+      EXPECT_EQ(t.valid, str != nullptr);
+    }
+
+    // Also test with the ANY parser.
+    inp = t.in.data();
+    bssl::UniquePtr<ASN1_TYPE> any(d2i_ASN1_TYPE(nullptr, &inp, t.in.size()));
+    EXPECT_EQ(t.valid, any != nullptr);
+  }
+}
+
+// Exhaustively test POSIX time conversions for every day across the millenium.
+TEST(ASN1Test, POSIXTime) {
+  const int kDaysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+  // Test the epoch explicitly, to confirm our baseline is correct.
+  struct tm civil_time;
+  ASSERT_TRUE(OPENSSL_posix_to_tm(0, &civil_time));
+  ASSERT_EQ(civil_time.tm_year + 1900, 1970);
+  ASSERT_EQ(civil_time.tm_mon + 1, 1);
+  ASSERT_EQ(civil_time.tm_mday, 1);
+  ASSERT_EQ(civil_time.tm_hour, 0);
+  ASSERT_EQ(civil_time.tm_min, 0);
+  ASSERT_EQ(civil_time.tm_sec, 0);
+
+  int64_t posix_time = -11676096000;  // Sat, 01 Jan 1600 00:00:00 +0000
+  for (int year = 1600; year < 3000; year++) {
+    SCOPED_TRACE(year);
+    bool is_leap_year = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
+    for (int month = 1; month <= 12; month++) {
+      SCOPED_TRACE(month);
+      int days = kDaysInMonth[month - 1];
+      if (month == 2 && is_leap_year) {
+        days++;
+      }
+      for (int day = 1; day <= days; day++) {
+        SCOPED_TRACE(day);
+        SCOPED_TRACE(posix_time);
+
+        ASSERT_TRUE(OPENSSL_posix_to_tm(posix_time, &civil_time));
+        ASSERT_EQ(civil_time.tm_year + 1900, year);
+        ASSERT_EQ(civil_time.tm_mon + 1, month);
+        ASSERT_EQ(civil_time.tm_mday, day);
+        ASSERT_EQ(civil_time.tm_hour, 0);
+        ASSERT_EQ(civil_time.tm_min, 0);
+        ASSERT_EQ(civil_time.tm_sec, 0);
+
+        int64_t posix_time_computed;
+        ASSERT_TRUE(OPENSSL_tm_to_posix(&civil_time, &posix_time_computed));
+        ASSERT_EQ(posix_time_computed, posix_time);
+
+        // Advance to the next day.
+        posix_time += 24 * 60 * 60;
+      }
+    }
+  }
+}
+
 // The ASN.1 macros do not work on Windows shared library builds, where usage of
 // |OPENSSL_EXPORT| is a bit stricter.
 #if !defined(OPENSSL_WINDOWS) || !defined(BORINGSSL_SHARED_LIBRARY)
diff --git a/src/crypto/asn1/asn_pack.c b/src/crypto/asn1/asn_pack.c
index 9124f23..069cef0 100644
--- a/src/crypto/asn1/asn_pack.c
+++ b/src/crypto/asn1/asn_pack.c
@@ -60,42 +60,40 @@
 #include <openssl/mem.h>
 
 
-ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **out)
-{
-    uint8_t *new_data = NULL;
-    int len = ASN1_item_i2d(obj, &new_data, it);
-    if (len <= 0) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ENCODE_ERROR);
-        return NULL;
-    }
+ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **out) {
+  uint8_t *new_data = NULL;
+  int len = ASN1_item_i2d(obj, &new_data, it);
+  if (len <= 0) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ENCODE_ERROR);
+    return NULL;
+  }
 
-    ASN1_STRING *ret = NULL;
-    if (out == NULL || *out == NULL) {
-        ret = ASN1_STRING_new();
-        if (ret == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            OPENSSL_free(new_data);
-            return NULL;
-        }
-    } else {
-        ret = *out;
+  ASN1_STRING *ret = NULL;
+  if (out == NULL || *out == NULL) {
+    ret = ASN1_STRING_new();
+    if (ret == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      OPENSSL_free(new_data);
+      return NULL;
     }
+  } else {
+    ret = *out;
+  }
 
-    ASN1_STRING_set0(ret, new_data, len);
-    if (out != NULL) {
-        *out = ret;
-    }
-    return ret;
+  ASN1_STRING_set0(ret, new_data, len);
+  if (out != NULL) {
+    *out = ret;
+  }
+  return ret;
 }
 
-void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it)
-{
-    const unsigned char *p = oct->data;
-    void *ret = ASN1_item_d2i(NULL, &p, oct->length, it);
-    if (ret == NULL || p != oct->data + oct->length) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR);
-        ASN1_item_free(ret, it);
-        return NULL;
-    }
-    return ret;
+void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it) {
+  const unsigned char *p = oct->data;
+  void *ret = ASN1_item_d2i(NULL, &p, oct->length, it);
+  if (ret == NULL || p != oct->data + oct->length) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR);
+    ASN1_item_free(ret, it);
+    return NULL;
+  }
+  return ret;
 }
diff --git a/src/crypto/asn1/charmap.h b/src/crypto/asn1/charmap.h
deleted file mode 100644
index 3305ad1..0000000
--- a/src/crypto/asn1/charmap.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Auto generated with chartype.pl script. Mask of various character
- * properties
- */
-
-static const unsigned char char_type[] = {
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    120, 0, 1, 40, 0, 0, 0, 16, 16, 16, 0, 25, 25, 16, 16, 16,
-    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 9, 9, 16, 9, 16,
-    0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 0, 0, 0,
-    0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 2
-};
diff --git a/src/crypto/asn1/charmap.pl b/src/crypto/asn1/charmap.pl
deleted file mode 100644
index 117ed32..0000000
--- a/src/crypto/asn1/charmap.pl
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/local/bin/perl -w
-
-# Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
-# 2000.
-#
-# ====================================================================
-# Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in
-#    the documentation and/or other materials provided with the
-#    distribution.
-#
-# 3. All advertising materials mentioning features or use of this
-#    software must display the following acknowledgment:
-#    "This product includes software developed by the OpenSSL Project
-#    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
-#
-# 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
-#    endorse or promote products derived from this software without
-#    prior written permission. For written permission, please contact
-#    licensing@OpenSSL.org.
-#
-# 5. Products derived from this software may not be called "OpenSSL"
-#    nor may "OpenSSL" appear in their names without prior written
-#    permission of the OpenSSL Project.
-#
-# 6. Redistributions of any form whatsoever must retain the following
-#    acknowledgment:
-#    "This product includes software developed by the OpenSSL Project
-#    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
-#
-# THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
-# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
-# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-# OF THE POSSIBILITY OF SUCH DAMAGE.
-# ====================================================================
-#
-# This product includes cryptographic software written by Eric Young
-# (eay@cryptsoft.com).  This product includes software written by Tim
-# Hudson (tjh@cryptsoft.com).
-
-use strict;
-
-my ($i, @arr);
-
-# Set up an array with the type of ASCII characters
-# Each set bit represents a character property.
-
-# RFC 2253 character properties
-my $RFC2253_ESC = 1;	# Character escaped with \
-my $ESC_CTRL	= 2;	# Escaped control character
-# These are used with RFC 1779 quoting using "
-my $NOESC_QUOTE	= 8;	# Not escaped if quoted
-my $PSTRING_CHAR = 0x10;	# Valid PrintableString character
-my $RFC2253_FIRST_ESC = 0x20; # Escaped with \ if first character
-my $RFC2253_LAST_ESC = 0x40;  # Escaped with \ if last character
-
-for($i = 0; $i < 128; $i++) {
-	# Set the RFC 2253 escape characters (control)
-	$arr[$i] = 0;
-	if(($i < 32) || ($i > 126)) {
-		$arr[$i] |= $ESC_CTRL;
-	}
-
-	# Some PrintableString characters
-	if(		   ( ( $i >= ord("a")) && ( $i <= ord("z")) )
-			|| (  ( $i >= ord("A")) && ( $i <= ord("Z")) )
-			|| (  ( $i >= ord("0")) && ( $i <= ord("9")) )  ) {
-		$arr[$i] |= $PSTRING_CHAR;
-	}
-}
-
-# Now setup the rest
-
-# Remaining RFC 2253 escaped characters
-
-$arr[ord(" ")] |= $NOESC_QUOTE | $RFC2253_FIRST_ESC | $RFC2253_LAST_ESC;
-$arr[ord("#")] |= $NOESC_QUOTE | $RFC2253_FIRST_ESC;
-
-$arr[ord(",")] |= $NOESC_QUOTE | $RFC2253_ESC;
-$arr[ord("+")] |= $NOESC_QUOTE | $RFC2253_ESC;
-$arr[ord("\"")] |= $RFC2253_ESC;
-$arr[ord("\\")] |= $RFC2253_ESC;
-$arr[ord("<")] |= $NOESC_QUOTE | $RFC2253_ESC;
-$arr[ord(">")] |= $NOESC_QUOTE | $RFC2253_ESC;
-$arr[ord(";")] |= $NOESC_QUOTE | $RFC2253_ESC;
-
-# Remaining PrintableString characters
-
-$arr[ord(" ")] |= $PSTRING_CHAR;
-$arr[ord("'")] |= $PSTRING_CHAR;
-$arr[ord("(")] |= $PSTRING_CHAR;
-$arr[ord(")")] |= $PSTRING_CHAR;
-$arr[ord("+")] |= $PSTRING_CHAR;
-$arr[ord(",")] |= $PSTRING_CHAR;
-$arr[ord("-")] |= $PSTRING_CHAR;
-$arr[ord(".")] |= $PSTRING_CHAR;
-$arr[ord("/")] |= $PSTRING_CHAR;
-$arr[ord(":")] |= $PSTRING_CHAR;
-$arr[ord("=")] |= $PSTRING_CHAR;
-$arr[ord("?")] |= $PSTRING_CHAR;
-
-# Now generate the C code
-
-print <<EOF;
-/* Auto generated with chartype.pl script.
- * Mask of various character properties
- */
-
-static const unsigned char char_type[] = {
-EOF
-
-for($i = 0; $i < 128; $i++) {
-	print("\n") if($i && (($i % 16) == 0));
-	printf("%2d", $arr[$i]);
-	print(",") if ($i != 127);
-}
-print("\n};\n\n");
-
diff --git a/src/crypto/asn1/f_int.c b/src/crypto/asn1/f_int.c
index c259788..047fcac 100644
--- a/src/crypto/asn1/f_int.c
+++ b/src/crypto/asn1/f_int.c
@@ -58,45 +58,48 @@
 
 #include <openssl/bio.h>
 
-int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a)
-{
-    int i, n = 0;
-    static const char *h = "0123456789ABCDEF";
-    char buf[2];
+int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a) {
+  int i, n = 0;
+  static const char *h = "0123456789ABCDEF";
+  char buf[2];
 
-    if (a == NULL)
-        return (0);
+  if (a == NULL) {
+    return 0;
+  }
 
-    if (a->type & V_ASN1_NEG) {
-        if (BIO_write(bp, "-", 1) != 1)
-            goto err;
-        n = 1;
+  if (a->type & V_ASN1_NEG) {
+    if (BIO_write(bp, "-", 1) != 1) {
+      goto err;
     }
+    n = 1;
+  }
 
-    if (a->length == 0) {
-        if (BIO_write(bp, "00", 2) != 2)
-            goto err;
-        n += 2;
-    } else {
-        for (i = 0; i < a->length; i++) {
-            if ((i != 0) && (i % 35 == 0)) {
-                if (BIO_write(bp, "\\\n", 2) != 2)
-                    goto err;
-                n += 2;
-            }
-            buf[0] = h[((unsigned char)a->data[i] >> 4) & 0x0f];
-            buf[1] = h[((unsigned char)a->data[i]) & 0x0f];
-            if (BIO_write(bp, buf, 2) != 2)
-                goto err;
-            n += 2;
+  if (a->length == 0) {
+    if (BIO_write(bp, "00", 2) != 2) {
+      goto err;
+    }
+    n += 2;
+  } else {
+    for (i = 0; i < a->length; i++) {
+      if ((i != 0) && (i % 35 == 0)) {
+        if (BIO_write(bp, "\\\n", 2) != 2) {
+          goto err;
         }
+        n += 2;
+      }
+      buf[0] = h[((unsigned char)a->data[i] >> 4) & 0x0f];
+      buf[1] = h[((unsigned char)a->data[i]) & 0x0f];
+      if (BIO_write(bp, buf, 2) != 2) {
+        goto err;
+      }
+      n += 2;
     }
-    return (n);
- err:
-    return (-1);
+  }
+  return n;
+err:
+  return -1;
 }
 
-int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a)
-{
-    return i2a_ASN1_INTEGER(bp, a);
+int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a) {
+  return i2a_ASN1_INTEGER(bp, a);
 }
diff --git a/src/crypto/asn1/f_string.c b/src/crypto/asn1/f_string.c
index 01d9dec..4bc8110 100644
--- a/src/crypto/asn1/f_string.c
+++ b/src/crypto/asn1/f_string.c
@@ -58,34 +58,37 @@
 
 #include <openssl/bio.h>
 
-int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type)
-{
-    int i, n = 0;
-    static const char *h = "0123456789ABCDEF";
-    char buf[2];
+int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type) {
+  int i, n = 0;
+  static const char *h = "0123456789ABCDEF";
+  char buf[2];
 
-    if (a == NULL)
-        return (0);
+  if (a == NULL) {
+    return 0;
+  }
 
-    if (a->length == 0) {
-        if (BIO_write(bp, "0", 1) != 1)
-            goto err;
-        n = 1;
-    } else {
-        for (i = 0; i < a->length; i++) {
-            if ((i != 0) && (i % 35 == 0)) {
-                if (BIO_write(bp, "\\\n", 2) != 2)
-                    goto err;
-                n += 2;
-            }
-            buf[0] = h[((unsigned char)a->data[i] >> 4) & 0x0f];
-            buf[1] = h[((unsigned char)a->data[i]) & 0x0f];
-            if (BIO_write(bp, buf, 2) != 2)
-                goto err;
-            n += 2;
-        }
+  if (a->length == 0) {
+    if (BIO_write(bp, "0", 1) != 1) {
+      goto err;
     }
-    return (n);
- err:
-    return (-1);
+    n = 1;
+  } else {
+    for (i = 0; i < a->length; i++) {
+      if ((i != 0) && (i % 35 == 0)) {
+        if (BIO_write(bp, "\\\n", 2) != 2) {
+          goto err;
+        }
+        n += 2;
+      }
+      buf[0] = h[((unsigned char)a->data[i] >> 4) & 0x0f];
+      buf[1] = h[((unsigned char)a->data[i]) & 0x0f];
+      if (BIO_write(bp, buf, 2) != 2) {
+        goto err;
+      }
+      n += 2;
+    }
+  }
+  return n;
+err:
+  return -1;
 }
diff --git a/src/crypto/asn1/internal.h b/src/crypto/asn1/internal.h
index 5bdaac8..3d78dd6 100644
--- a/src/crypto/asn1/internal.h
+++ b/src/crypto/asn1/internal.h
@@ -69,42 +69,64 @@
 #endif
 
 
-/* Wrapper functions for time functions. */
+// Wrapper functions for time functions.
 
-/* OPENSSL_gmtime wraps |gmtime_r|. See the manual page for that function. */
-struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result);
+// OPENSSL_posix_to_tm converts a int64_t POSIX time value in |time| whuch must
+// be in the range of year 0000 to 9999 to a broken out time value in |tm|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int OPENSSL_posix_to_tm(int64_t time, struct tm *out_tm);
 
-/* OPENSSL_gmtime_adj updates |tm| by adding |offset_day| days and |offset_sec|
- * seconds. */
+// OPENSSL_tm_to_posix converts a time value between the years 0 and 9999 in
+// |tm| to a POSIX time value in |out|. One is returned on success, zero is
+// returned on failure. It is a failure if the tm contains out of range values.
+OPENSSL_EXPORT int OPENSSL_tm_to_posix(const struct tm *tm, int64_t *out);
+
+// OPENSSL_gmtime converts a time_t value in |time| which must be in the range
+// of year 0000 to 9999 to a broken out time value in |tm|. On success |tm| is
+// returned. On failure NULL is returned.
+OPENSSL_EXPORT struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result);
+
+// OPENSSL_timegm converts a time value between the years 0 and 9999 in |tm| to
+// a time_t value in |out|. One is returned on success, zero is returned on
+// failure. It is a failure if the converted time can not be represented in a
+// time_t, or if the tm contains out of range values.
+OPENSSL_EXPORT int OPENSSL_timegm(const struct tm *tm, time_t *out);
+
+// OPENSSL_gmtime_adj returns one on success, and updates |tm| by adding
+// |offset_day| days and |offset_sec| seconds. It returns zero on failure. |tm|
+// must be in the range of year 0000 to 9999 both before and after the update or
+// a failure will be returned.
 int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec);
 
-/* OPENSSL_gmtime_diff calculates the difference between |from| and |to| and
- * outputs the difference as a number of days and seconds in |*out_days| and
- * |*out_secs|. */
-int OPENSSL_gmtime_diff(int *out_days, int *out_secs, const struct tm *from,
-                        const struct tm *to);
+// OPENSSL_gmtime_diff calculates the difference between |from| and |to|. It
+// returns one, and outputs the difference as a number of days and seconds in
+// |*out_days| and |*out_secs| on success. It returns zero on failure.  Both
+// |from| and |to| must be in the range of year 0000 to 9999 or a failure will
+// be returned.
+OPENSSL_EXPORT int OPENSSL_gmtime_diff(int *out_days, int *out_secs,
+                                       const struct tm *from,
+                                       const struct tm *to);
 
+// Internal ASN1 structures and functions: not for application use
 
-/* Internal ASN1 structures and functions: not for application use */
+// These are used internally in the ASN1_OBJECT to keep track of
+// whether the names and data need to be free()ed
+#define ASN1_OBJECT_FLAG_DYNAMIC 0x01          // internal use
+#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04  // internal use
+#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08     // internal use
 
-/* These are used internally in the ASN1_OBJECT to keep track of
- * whether the names and data need to be free()ed */
-#define ASN1_OBJECT_FLAG_DYNAMIC 0x01         /* internal use */
-#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 /* internal use */
-#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08    /* internal use */
-
-/* An asn1_object_st (aka |ASN1_OBJECT|) represents an ASN.1 OBJECT IDENTIFIER.
- * Note: Mutating an |ASN1_OBJECT| is only permitted when initializing it. The
- * library maintains a table of static |ASN1_OBJECT|s, which may be referenced
- * by non-const |ASN1_OBJECT| pointers. Code which receives an |ASN1_OBJECT|
- * pointer externally must assume it is immutable, even if the pointer is not
- * const. */
+// An asn1_object_st (aka |ASN1_OBJECT|) represents an ASN.1 OBJECT IDENTIFIER.
+// Note: Mutating an |ASN1_OBJECT| is only permitted when initializing it. The
+// library maintains a table of static |ASN1_OBJECT|s, which may be referenced
+// by non-const |ASN1_OBJECT| pointers. Code which receives an |ASN1_OBJECT|
+// pointer externally must assume it is immutable, even if the pointer is not
+// const.
 struct asn1_object_st {
   const char *sn, *ln;
   int nid;
   int length;
-  const unsigned char *data; /* data remains const after init */
-  int flags;                 /* Should we free this one */
+  const unsigned char *data;  // data remains const after init
+  int flags;                  // Should we free this one
 };
 
 ASN1_OBJECT *ASN1_OBJECT_new(void);
@@ -126,13 +148,14 @@
   unsigned alias_only_on_next_parse : 1;
 } ASN1_ENCODING;
 
-int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d);
-int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d);
+OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d,
+                                      int allow_timezone_offset);
+OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm,
+                                              const ASN1_GENERALIZEDTIME *d);
 
 void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
                             int combine);
 
-int UTF8_getc(const unsigned char *str, int len, uint32_t *val);
 int UTF8_putc(unsigned char *str, int len, uint32_t value);
 
 int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
@@ -143,31 +166,31 @@
                      const ASN1_ITEM *it, int tag, int aclass, char opt,
                      ASN1_TLC *ctx);
 
-/* ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the
- * i2d output convention. It returns a non-zero length on success and -1 on
- * error. If |tag| is -1. the tag and class come from |it|. Otherwise, the tag
- * number is |tag| and the class is |aclass|. This is used for implicit tagging.
- * This function treats a missing value as an error, not an optional field. */
+// ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the
+// i2d output convention. It returns a non-zero length on success and -1 on
+// error. If |tag| is -1. the tag and class come from |it|. Otherwise, the tag
+// number is |tag| and the class is |aclass|. This is used for implicit tagging.
+// This function treats a missing value as an error, not an optional field.
 int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                      const ASN1_ITEM *it, int tag, int aclass);
 
 void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
-/* asn1_get_choice_selector returns the CHOICE selector value for |*pval|, which
- * must of type |it|. */
+// asn1_get_choice_selector returns the CHOICE selector value for |*pval|, which
+// must of type |it|.
 int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
 int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it);
 
-/* asn1_get_field_ptr returns a pointer to the field in |*pval| corresponding to
- * |tt|. */
+// asn1_get_field_ptr returns a pointer to the field in |*pval| corresponding to
+// |tt|.
 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
 
-/* asn1_do_adb returns the |ASN1_TEMPLATE| for the ANY DEFINED BY field |tt|,
- * based on the selector INTEGER or OID in |*pval|. If |tt| is not an ADB field,
- * it returns |tt|. If the selector does not match any value, it returns NULL.
- * If |nullerr| is non-zero, it will additionally push an error to the error
- * queue when there is no match. */
+// asn1_do_adb returns the |ASN1_TEMPLATE| for the ANY DEFINED BY field |tt|,
+// based on the selector INTEGER or OID in |*pval|. If |tt| is not an ADB field,
+// it returns |tt|. If the selector does not match any value, it returns NULL.
+// If |nullerr| is non-zero, it will additionally push an error to the error
+// queue when there is no match.
 const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,
                                  int nullerr);
 
@@ -177,29 +200,29 @@
 void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
 void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
-/* asn1_enc_restore, if |*pval| has a saved encoding, writes it to |out| under
- * the i2d output convention, sets |*len| to the length, and returns one. If it
- * has no saved encoding, it returns zero. */
+// asn1_enc_restore, if |*pval| has a saved encoding, writes it to |out| under
+// the i2d output convention, sets |*len| to the length, and returns one. If it
+// has no saved encoding, it returns zero.
 int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval,
                      const ASN1_ITEM *it);
 
 int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen,
                   const ASN1_ITEM *it);
 
-/* asn1_type_value_as_pointer returns |a|'s value in pointer form. This is
- * usually the value object but, for BOOLEAN values, is 0 or 0xff cast to
- * a pointer. */
+// asn1_type_value_as_pointer returns |a|'s value in pointer form. This is
+// usually the value object but, for BOOLEAN values, is 0 or 0xff cast to
+// a pointer.
 const void *asn1_type_value_as_pointer(const ASN1_TYPE *a);
 
-/* asn1_is_printable returns one if |value| is a valid Unicode codepoint for an
- * ASN.1 PrintableString, and zero otherwise. */
+// asn1_is_printable returns one if |value| is a valid Unicode codepoint for an
+// ASN.1 PrintableString, and zero otherwise.
 int asn1_is_printable(uint32_t value);
 
-/* asn1_bit_string_length returns the number of bytes in |str| and sets
- * |*out_padding_bits| to the number of padding bits.
- *
- * This function should be used instead of |ASN1_STRING_length| to correctly
- * handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case. */
+// asn1_bit_string_length returns the number of bytes in |str| and sets
+// |*out_padding_bits| to the number of padding bits.
+//
+// This function should be used instead of |ASN1_STRING_length| to correctly
+// handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case.
 int asn1_bit_string_length(const ASN1_BIT_STRING *str,
                            uint8_t *out_padding_bits);
 
@@ -211,14 +234,14 @@
   unsigned long flags;
 } ASN1_STRING_TABLE;
 
-/* asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table
- * of built-in |ASN1_STRING_TABLE| values. It is exported for testing. */
+// asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table
+// of built-in |ASN1_STRING_TABLE| values. It is exported for testing.
 OPENSSL_EXPORT void asn1_get_string_table_for_testing(
     const ASN1_STRING_TABLE **out_ptr, size_t *out_len);
 
 
 #if defined(__cplusplus)
-}  /* extern C */
+}  // extern C
 #endif
 
-#endif  /* OPENSSL_HEADER_ASN1_ASN1_LOCL_H */
+#endif  // OPENSSL_HEADER_ASN1_ASN1_LOCL_H
diff --git a/src/crypto/asn1/posix_time.c b/src/crypto/asn1/posix_time.c
new file mode 100644
index 0000000..81fbe83
--- /dev/null
+++ b/src/crypto/asn1/posix_time.c
@@ -0,0 +1,227 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+// Time conversion to/from POSIX time_t and struct tm, with no support
+// for time zones other than UTC
+
+#include <assert.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <string.h>
+#include <time.h>
+
+#include "internal.h"
+
+#define SECS_PER_HOUR (60 * 60)
+#define SECS_PER_DAY (24 * SECS_PER_HOUR)
+
+
+// Is a year/month/day combination valid, in the range from year 0000
+// to 9999?
+static int is_valid_date(int year, int month, int day) {
+  if (day < 1 || month < 1 || year < 0 || year > 9999) {
+    return 0;
+  }
+  switch (month) {
+    case 1:
+    case 3:
+    case 5:
+    case 7:
+    case 8:
+    case 10:
+    case 12:
+      return day > 0 && day <= 31;
+    case 4:
+    case 6:
+    case 9:
+    case 11:
+      return day > 0 && day <= 30;
+    case 2:
+      if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
+        return day > 0 && day <= 29;
+      } else {
+        return day > 0 && day <= 28;
+      }
+    default:
+      return 0;
+  }
+}
+
+// Is a time valid? Leap seconds of 60 are not considered valid, as
+// the POSIX time in seconds does not include them.
+static int is_valid_time(int hours, int minutes, int seconds) {
+  if (hours < 0 || minutes < 0 || seconds < 0 || hours > 23 || minutes > 59 ||
+      seconds > 59) {
+    return 0;
+  }
+  return 1;
+}
+
+// Is a int64 time representing a time within our expected range?
+static int is_valid_epoch_time(int64_t time) {
+  // 0000-01-01 00:00:00 UTC to 9999-12-31 23:59:59 UTC
+  return (int64_t)-62167219200 <= time && time <= (int64_t)253402300799;
+}
+
+// Inspired by algorithms presented in
+// https://howardhinnant.github.io/date_algorithms.html
+// (Public Domain)
+static int posix_time_from_utc(int year, int month, int day, int hours,
+                               int minutes, int seconds, int64_t *out_time) {
+  if (!is_valid_date(year, month, day) ||
+      !is_valid_time(hours, minutes, seconds)) {
+    return 0;
+  }
+  if (month <= 2) {
+    year--;  // Start years on Mar 1, so leap days always finish a year.
+  }
+  // At this point year will be in the range -1 and 9999.
+  assert(-1 <= year && year <= 9999);
+  int64_t era = (year >= 0 ? year : year - 399) / 400;
+  int64_t year_of_era = year - era * 400;
+  int64_t day_of_year =
+      (153 * (month > 2 ? month - 3 : month + 9) + 2) / 5 + day - 1;
+  int64_t day_of_era =
+      year_of_era * 365 + year_of_era / 4 - year_of_era / 100 + day_of_year;
+  int64_t posix_days = era * 146097 + day_of_era - 719468;
+  *out_time = posix_days * SECS_PER_DAY + hours * SECS_PER_HOUR + minutes * 60 +
+              seconds;
+  return 1;
+}
+
+// Inspired by algorithms presented in
+// https://howardhinnant.github.io/date_algorithms.html
+// (Public Domain)
+static int utc_from_posix_time(int64_t time, int *out_year, int *out_month,
+                               int *out_day, int *out_hours, int *out_minutes,
+                               int *out_seconds) {
+  if (!is_valid_epoch_time(time)) {
+    return 0;
+  }
+  int64_t days = time / SECS_PER_DAY;
+  int64_t leftover_seconds = time % SECS_PER_DAY;
+  if (leftover_seconds < 0) {
+    days--;
+    leftover_seconds += SECS_PER_DAY;
+  }
+  days += 719468;  // Shift to starting epoch of Mar 1 0000.
+  // At this point, days will be in the range -61 and 3652364.
+  assert(-61 <= days && days <= 3652364);
+  int64_t era = (days > 0 ? days : days - 146096) / 146097;
+  int64_t day_of_era = days - era * 146097;
+  int64_t year_of_era = (day_of_era - day_of_era / 1460 + day_of_era / 36524 -
+                         day_of_era / 146096) /
+                        365;
+  *out_year = (int)(year_of_era + era * 400);  // Year starting on Mar 1.
+  int64_t day_of_year =
+      day_of_era - (365 * year_of_era + year_of_era / 4 - year_of_era / 100);
+  int64_t month_of_year = (5 * day_of_year + 2) / 153;
+  *out_month =
+      (int)(month_of_year < 10 ? month_of_year + 3 : month_of_year - 9);
+  if (*out_month <= 2) {
+    (*out_year)++;  // Adjust year back to Jan 1 start of year.
+  }
+  *out_day = (int)(day_of_year - (153 * month_of_year + 2) / 5 + 1);
+  *out_hours = (int)(leftover_seconds / SECS_PER_HOUR);
+  leftover_seconds %= SECS_PER_HOUR;
+  *out_minutes = (int)(leftover_seconds / 60);
+  *out_seconds = (int)(leftover_seconds % 60);
+  return 1;
+}
+
+int OPENSSL_tm_to_posix(const struct tm *tm, int64_t *out) {
+  return posix_time_from_utc(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+                             tm->tm_hour, tm->tm_min, tm->tm_sec, out);
+}
+
+int OPENSSL_posix_to_tm(int64_t time, struct tm *out_tm) {
+  memset(out_tm, 0, sizeof(struct tm));
+  if (!utc_from_posix_time(time, &out_tm->tm_year, &out_tm->tm_mon,
+                           &out_tm->tm_mday, &out_tm->tm_hour, &out_tm->tm_min,
+                           &out_tm->tm_sec)) {
+    return 0;
+  }
+  out_tm->tm_year -= 1900;
+  out_tm->tm_mon -= 1;
+
+  return 1;
+}
+
+int OPENSSL_timegm(const struct tm *tm, time_t *out) {
+  static_assert(
+      sizeof(time_t) == sizeof(int32_t) || sizeof(time_t) == sizeof(int64_t),
+      "time_t is broken");
+  int64_t posix_time;
+  if (!OPENSSL_tm_to_posix(tm, &posix_time)) {
+    return 0;
+  }
+  if (sizeof(time_t) == sizeof(int32_t) &&
+      (posix_time > INT32_MAX || posix_time < INT32_MIN)) {
+    return 0;
+  }
+  *out = (time_t)posix_time;
+  return 1;
+}
+
+struct tm *OPENSSL_gmtime(const time_t *time, struct tm *out_tm) {
+  static_assert(
+      sizeof(time_t) == sizeof(int32_t) || sizeof(time_t) == sizeof(int64_t),
+      "time_t is broken");
+  int64_t posix_time = *time;
+  if (!OPENSSL_posix_to_tm(posix_time, out_tm)) {
+    return NULL;
+  }
+  return out_tm;
+}
+
+int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) {
+  int64_t posix_time;
+  if (!posix_time_from_utc(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+                           tm->tm_hour, tm->tm_min, tm->tm_sec, &posix_time)) {
+    return 0;
+  }
+  if (!utc_from_posix_time(posix_time + off_day * SECS_PER_DAY + offset_sec,
+                           &tm->tm_year, &tm->tm_mon, &tm->tm_mday,
+                           &tm->tm_hour, &tm->tm_min, &tm->tm_sec)) {
+    return 0;
+  }
+  tm->tm_year -= 1900;
+  tm->tm_mon -= 1;
+
+  return 1;
+}
+
+int OPENSSL_gmtime_diff(int *out_days, int *out_secs, const struct tm *from,
+                        const struct tm *to) {
+  int64_t time_to;
+  if (!posix_time_from_utc(to->tm_year + 1900, to->tm_mon + 1, to->tm_mday,
+                           to->tm_hour, to->tm_min, to->tm_sec, &time_to)) {
+    return 0;
+  }
+  int64_t time_from;
+  if (!posix_time_from_utc(from->tm_year + 1900, from->tm_mon + 1,
+                           from->tm_mday, from->tm_hour, from->tm_min,
+                           from->tm_sec, &time_from)) {
+    return 0;
+  }
+  int64_t timediff = time_to - time_from;
+  int64_t daydiff = timediff / SECS_PER_DAY;
+  timediff %= SECS_PER_DAY;
+  if (daydiff > INT_MAX || daydiff < INT_MIN) {
+    return 0;
+  }
+  *out_secs = (int)timediff;
+  *out_days = (int)daydiff;
+  return 1;
+}
diff --git a/src/crypto/asn1/tasn_dec.c b/src/crypto/asn1/tasn_dec.c
index beb9a0b..de87791 100644
--- a/src/crypto/asn1/tasn_dec.c
+++ b/src/crypto/asn1/tasn_dec.c
@@ -55,758 +55,731 @@
  * [including the GNU Public Licence.] */
 
 #include <openssl/asn1.h>
+#include <openssl/asn1t.h>
+#include <openssl/bytestring.h>
+#include <openssl/err.h>
+#include <openssl/mem.h>
 
 #include <limits.h>
 #include <string.h>
 
-#include <openssl/asn1t.h>
-#include <openssl/err.h>
-#include <openssl/mem.h>
-
+#include "../bytestring/internal.h"
 #include "../internal.h"
 #include "internal.h"
 
-/*
- * Constructed types with a recursive definition (such as can be found in PKCS7)
- * could eventually exceed the stack given malicious input with excessive
- * recursion. Therefore we limit the stack depth. This is the maximum number of
- * recursive invocations of asn1_item_embed_d2i().
- */
+// Constructed types with a recursive definition (such as can be found in PKCS7)
+// could eventually exceed the stack given malicious input with excessive
+// recursion. Therefore we limit the stack depth. This is the maximum number of
+// recursive invocations of asn1_item_embed_d2i().
 #define ASN1_MAX_CONSTRUCTED_NEST 30
 
-static int asn1_check_eoc(const unsigned char **in, long len);
-
 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
                            char *cst, const unsigned char **in, long len,
-                           int exptag, int expclass, char opt, ASN1_TLC *ctx);
+                           int exptag, int expclass, char opt);
 
-static int asn1_template_ex_d2i(ASN1_VALUE **pval,
-                                const unsigned char **in, long len,
-                                const ASN1_TEMPLATE *tt, char opt,
-                                ASN1_TLC *ctx, int depth);
-static int asn1_template_noexp_d2i(ASN1_VALUE **val,
-                                   const unsigned char **in, long len,
-                                   const ASN1_TEMPLATE *tt, char opt,
-                                   ASN1_TLC *ctx, int depth);
+static int asn1_template_ex_d2i(ASN1_VALUE **pval, const unsigned char **in,
+                                long len, const ASN1_TEMPLATE *tt, char opt,
+                                int depth);
+static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in,
+                                   long len, const ASN1_TEMPLATE *tt, char opt,
+                                   int depth);
 static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
                        int utype, const ASN1_ITEM *it);
-static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
-                                 const unsigned char **in, long len,
-                                 const ASN1_ITEM *it,
-                                 int tag, int aclass, char opt,
-                                 ASN1_TLC *ctx);
+static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in,
+                                 long len, const ASN1_ITEM *it, int tag,
+                                 int aclass, char opt);
+static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in,
+                            long len, const ASN1_ITEM *it, int tag, int aclass,
+                            char opt, int depth);
 
-/* Table to convert tags to bit values, used for MSTRING type */
-static const unsigned long tag2bit[32] = {
-    0, 0, 0, B_ASN1_BIT_STRING, /* tags 0 - 3 */
-    B_ASN1_OCTET_STRING, 0, 0, B_ASN1_UNKNOWN, /* tags 4- 7 */
-    B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, /* tags
-                                                                     * 8-11 */
-    B_ASN1_UTF8STRING, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, /* tags
-                                                                        * 12-15
-                                                                        */
-    B_ASN1_SEQUENCE, 0, B_ASN1_NUMERICSTRING, B_ASN1_PRINTABLESTRING, /* tags
-                                                                       * 16-19
-                                                                       */
-    B_ASN1_T61STRING, B_ASN1_VIDEOTEXSTRING, B_ASN1_IA5STRING, /* tags 20-22 */
-    B_ASN1_UTCTIME, B_ASN1_GENERALIZEDTIME, /* tags 23-24 */
-    B_ASN1_GRAPHICSTRING, B_ASN1_ISO64STRING, B_ASN1_GENERALSTRING, /* tags
-                                                                     * 25-27 */
-    B_ASN1_UNIVERSALSTRING, B_ASN1_UNKNOWN, B_ASN1_BMPSTRING, B_ASN1_UNKNOWN, /* tags
-                                                                               * 28-31
-                                                                               */
+// Table to convert tags to bit values, used for MSTRING type
+static const unsigned long tag2bit[31] = {
+    0,  // (reserved)
+    0,  // BOOLEAN
+    0,  // INTEGER
+    B_ASN1_BIT_STRING,
+    B_ASN1_OCTET_STRING,
+    0,               // NULL
+    0,               // OBJECT IDENTIFIER
+    B_ASN1_UNKNOWN,  // ObjectDescriptor
+    B_ASN1_UNKNOWN,  // EXTERNAL
+    B_ASN1_UNKNOWN,  // REAL
+    B_ASN1_UNKNOWN,  // ENUMERATED
+    B_ASN1_UNKNOWN,  // EMBEDDED PDV
+    B_ASN1_UTF8STRING,
+    B_ASN1_UNKNOWN,  // RELATIVE-OID
+    B_ASN1_UNKNOWN,  // TIME
+    B_ASN1_UNKNOWN,  // (reserved)
+    B_ASN1_SEQUENCE,
+    0,  // SET
+    B_ASN1_NUMERICSTRING,
+    B_ASN1_PRINTABLESTRING,
+    B_ASN1_T61STRING,
+    B_ASN1_VIDEOTEXSTRING,
+    B_ASN1_IA5STRING,
+    B_ASN1_UTCTIME,
+    B_ASN1_GENERALIZEDTIME,
+    B_ASN1_GRAPHICSTRING,
+    B_ASN1_ISO64STRING,
+    B_ASN1_GENERALSTRING,
+    B_ASN1_UNIVERSALSTRING,
+    B_ASN1_UNKNOWN,  // CHARACTER STRING
+    B_ASN1_BMPSTRING,
 };
 
-unsigned long ASN1_tag2bit(int tag)
-{
-    if ((tag < 0) || (tag > 30))
-        return 0;
-    return tag2bit[tag];
+unsigned long ASN1_tag2bit(int tag) {
+  if (tag < 0 || tag > 30) {
+    return 0;
+  }
+  return tag2bit[tag];
 }
 
-/* Macro to initialize and invalidate the cache */
+// Macro to initialize and invalidate the cache
 
-#define asn1_tlc_clear(c)       if (c) (c)->valid = 0
-/* Version to avoid compiler warning about 'c' always non-NULL */
-#define asn1_tlc_clear_nc(c)    (c)->valid = 0
+// Decode an ASN1 item, this currently behaves just like a standard 'd2i'
+// function. 'in' points to a buffer to read the data from, in future we
+// will have more advanced versions that can input data a piece at a time and
+// this will simply be a special case.
 
-/*
- * Decode an ASN1 item, this currently behaves just like a standard 'd2i'
- * function. 'in' points to a buffer to read the data from, in future we
- * will have more advanced versions that can input data a piece at a time and
- * this will simply be a special case.
- */
+ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
+                          const ASN1_ITEM *it) {
+  ASN1_VALUE *ptmpval = NULL;
+  if (!pval) {
+    pval = &ptmpval;
+  }
 
-ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval,
-                          const unsigned char **in, long len,
-                          const ASN1_ITEM *it)
-{
-    ASN1_TLC c;
-    ASN1_VALUE *ptmpval = NULL;
-    if (!pval)
-        pval = &ptmpval;
-    asn1_tlc_clear_nc(&c);
-    if (ASN1_item_ex_d2i(pval, in, len, it, -1, 0, 0, &c) > 0)
-        return *pval;
-    return NULL;
+  if (asn1_item_ex_d2i(pval, in, len, it, -1, 0, 0, 0) > 0) {
+    return *pval;
+  }
+  return NULL;
 }
 
-/*
- * Decode an item, taking care of IMPLICIT tagging, if any. If 'opt' set and
- * tag mismatch return -1 to handle OPTIONAL
- */
+// Decode an item, taking care of IMPLICIT tagging, if any. If 'opt' set and
+// tag mismatch return -1 to handle OPTIONAL
 
 static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in,
                             long len, const ASN1_ITEM *it, int tag, int aclass,
-                            char opt, ASN1_TLC *ctx, int depth)
-{
-    const ASN1_TEMPLATE *tt, *errtt = NULL;
-    const ASN1_EXTERN_FUNCS *ef;
-    const unsigned char *p = NULL, *q;
-    unsigned char oclass;
-    char cst, isopt;
-    int i;
-    int otag;
-    int ret = 0;
-    ASN1_VALUE **pchptr;
-    int combine = aclass & ASN1_TFLG_COMBINE;
-    aclass &= ~ASN1_TFLG_COMBINE;
-    if (!pval)
-        return 0;
+                            char opt, int depth) {
+  const ASN1_TEMPLATE *tt, *errtt = NULL;
+  const ASN1_EXTERN_FUNCS *ef;
+  const unsigned char *p = NULL, *q;
+  unsigned char oclass;
+  char cst, isopt;
+  int i;
+  int otag;
+  int ret = 0;
+  ASN1_VALUE **pchptr;
+  int combine = aclass & ASN1_TFLG_COMBINE;
+  aclass &= ~ASN1_TFLG_COMBINE;
+  if (!pval) {
+    return 0;
+  }
 
-    /*
-     * Bound |len| to comfortably fit in an int. Lengths in this module often
-     * switch between int and long without overflow checks.
-     */
-    if (len > INT_MAX/2) {
-        len = INT_MAX/2;
-    }
+  // Bound |len| to comfortably fit in an int. Lengths in this module often
+  // switch between int and long without overflow checks.
+  if (len > INT_MAX / 2) {
+    len = INT_MAX / 2;
+  }
 
-    if (++depth > ASN1_MAX_CONSTRUCTED_NEST) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_TOO_DEEP);
-        goto err;
-    }
+  if (++depth > ASN1_MAX_CONSTRUCTED_NEST) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_TOO_DEEP);
+    goto err;
+  }
 
-    switch (it->itype) {
+  switch (it->itype) {
     case ASN1_ITYPE_PRIMITIVE:
-        if (it->templates) {
-            /*
-             * tagging or OPTIONAL is currently illegal on an item template
-             * because the flags can't get passed down. In practice this
-             * isn't a problem: we include the relevant flags from the item
-             * template in the template itself.
-             */
-            if ((tag != -1) || opt) {
-                OPENSSL_PUT_ERROR(ASN1,
-                                  ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE);
-                goto err;
-            }
-            return asn1_template_ex_d2i(pval, in, len,
-                                        it->templates, opt, ctx, depth);
+      if (it->templates) {
+        // tagging or OPTIONAL is currently illegal on an item template
+        // because the flags can't get passed down. In practice this
+        // isn't a problem: we include the relevant flags from the item
+        // template in the template itself.
+        if ((tag != -1) || opt) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE);
+          goto err;
         }
-        return asn1_d2i_ex_primitive(pval, in, len, it,
-                                     tag, aclass, opt, ctx);
-        break;
+        return asn1_template_ex_d2i(pval, in, len, it->templates, opt, depth);
+      }
+      return asn1_d2i_ex_primitive(pval, in, len, it, tag, aclass, opt);
+      break;
 
     case ASN1_ITYPE_MSTRING:
-        /*
-         * It never makes sense for multi-strings to have implicit tagging, so
-         * if tag != -1, then this looks like an error in the template.
-         */
-        if (tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            goto err;
-        }
+      // It never makes sense for multi-strings to have implicit tagging, so
+      // if tag != -1, then this looks like an error in the template.
+      if (tag != -1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+        goto err;
+      }
 
-        p = *in;
-        /* Just read in tag and class */
-        ret = asn1_check_tlen(NULL, &otag, &oclass, NULL,
-                              &p, len, -1, 0, 1, ctx);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
-        }
+      p = *in;
+      // Just read in tag and class
+      ret = asn1_check_tlen(NULL, &otag, &oclass, NULL, &p, len, -1, 0, 1);
+      if (!ret) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      }
 
-        /* Must be UNIVERSAL class */
-        if (oclass != V_ASN1_UNIVERSAL) {
-            /* If OPTIONAL, assume this is OK */
-            if (opt)
-                return -1;
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL);
-            goto err;
+      // Must be UNIVERSAL class
+      if (oclass != V_ASN1_UNIVERSAL) {
+        // If OPTIONAL, assume this is OK
+        if (opt) {
+          return -1;
         }
-        /* Check tag matches bit map */
-        if (!(ASN1_tag2bit(otag) & it->utype)) {
-            /* If OPTIONAL, assume this is OK */
-            if (opt)
-                return -1;
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_WRONG_TAG);
-            goto err;
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL);
+        goto err;
+      }
+      // Check tag matches bit map
+      if (!(ASN1_tag2bit(otag) & it->utype)) {
+        // If OPTIONAL, assume this is OK
+        if (opt) {
+          return -1;
         }
-        return asn1_d2i_ex_primitive(pval, in, len, it, otag, 0, 0, ctx);
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_WRONG_TAG);
+        goto err;
+      }
+      return asn1_d2i_ex_primitive(pval, in, len, it, otag, 0, 0);
 
     case ASN1_ITYPE_EXTERN:
-        /* Use new style d2i */
-        ef = it->funcs;
-        return ef->asn1_ex_d2i(pval, in, len, it, tag, aclass, opt, ctx);
+      // Use new style d2i
+      ef = it->funcs;
+      return ef->asn1_ex_d2i(pval, in, len, it, tag, aclass, opt, NULL);
 
     case ASN1_ITYPE_CHOICE: {
-        /*
-         * It never makes sense for CHOICE types to have implicit tagging, so if
-         * tag != -1, then this looks like an error in the template.
-         */
-        if (tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            goto err;
-        }
+      // It never makes sense for CHOICE types to have implicit tagging, so if
+      // tag != -1, then this looks like an error in the template.
+      if (tag != -1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+        goto err;
+      }
 
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL))
-            goto auxerr;
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) {
+        goto auxerr;
+      }
 
-        if (*pval) {
-            /* Free up and zero CHOICE value if initialised */
-            i = asn1_get_choice_selector(pval, it);
-            if ((i >= 0) && (i < it->tcount)) {
-                tt = it->templates + i;
-                pchptr = asn1_get_field_ptr(pval, tt);
-                ASN1_template_free(pchptr, tt);
-                asn1_set_choice_selector(pval, -1, it);
-            }
-        } else if (!ASN1_item_ex_new(pval, it)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
+      if (*pval) {
+        // Free up and zero CHOICE value if initialised
+        i = asn1_get_choice_selector(pval, it);
+        if ((i >= 0) && (i < it->tcount)) {
+          tt = it->templates + i;
+          pchptr = asn1_get_field_ptr(pval, tt);
+          ASN1_template_free(pchptr, tt);
+          asn1_set_choice_selector(pval, -1, it);
         }
-        /* CHOICE type, try each possibility in turn */
-        p = *in;
-        for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
-            pchptr = asn1_get_field_ptr(pval, tt);
-            /*
-             * We mark field as OPTIONAL so its absence can be recognised.
-             */
-            ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, ctx, depth);
-            /* If field not present, try the next one */
-            if (ret == -1)
-                continue;
-            /* If positive return, read OK, break loop */
-            if (ret > 0)
-                break;
-            /* Otherwise must be an ASN1 parsing error */
-            errtt = tt;
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
+      } else if (!ASN1_item_ex_new(pval, it)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      }
+      // CHOICE type, try each possibility in turn
+      p = *in;
+      for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
+        pchptr = asn1_get_field_ptr(pval, tt);
+        // We mark field as OPTIONAL so its absence can be recognised.
+        ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, depth);
+        // If field not present, try the next one
+        if (ret == -1) {
+          continue;
         }
+        // If positive return, read OK, break loop
+        if (ret > 0) {
+          break;
+        }
+        // Otherwise must be an ASN1 parsing error
+        errtt = tt;
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      }
 
-        /* Did we fall off the end without reading anything? */
-        if (i == it->tcount) {
-            /* If OPTIONAL, this is OK */
-            if (opt) {
-                /* Free and zero it */
-                ASN1_item_ex_free(pval, it);
-                return -1;
-            }
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
-            goto err;
+      // Did we fall off the end without reading anything?
+      if (i == it->tcount) {
+        // If OPTIONAL, this is OK
+        if (opt) {
+          // Free and zero it
+          ASN1_item_ex_free(pval, it);
+          return -1;
         }
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
+        goto err;
+      }
 
-        asn1_set_choice_selector(pval, i, it);
-        if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
-            goto auxerr;
-        *in = p;
-        return 1;
+      asn1_set_choice_selector(pval, i, it);
+      if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL)) {
+        goto auxerr;
+      }
+      *in = p;
+      return 1;
     }
 
     case ASN1_ITYPE_SEQUENCE: {
-        p = *in;
+      p = *in;
 
-        /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
-        if (tag == -1) {
-            tag = V_ASN1_SEQUENCE;
-            aclass = V_ASN1_UNIVERSAL;
+      // If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL
+      if (tag == -1) {
+        tag = V_ASN1_SEQUENCE;
+        aclass = V_ASN1_UNIVERSAL;
+      }
+      // Get SEQUENCE length and update len, p
+      ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, len, tag, aclass, opt);
+      if (!ret) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      } else if (ret == -1) {
+        return -1;
+      }
+      if (!cst) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_NOT_CONSTRUCTED);
+        goto err;
+      }
+
+      if (!*pval && !ASN1_item_ex_new(pval, it)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      }
+
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) {
+        goto auxerr;
+      }
+
+      // Free up and zero any ADB found
+      for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
+        if (tt->flags & ASN1_TFLG_ADB_MASK) {
+          const ASN1_TEMPLATE *seqtt;
+          ASN1_VALUE **pseqval;
+          seqtt = asn1_do_adb(pval, tt, 0);
+          if (seqtt == NULL) {
+            continue;
+          }
+          pseqval = asn1_get_field_ptr(pval, seqtt);
+          ASN1_template_free(pseqval, seqtt);
         }
-        /* Get SEQUENCE length and update len, p */
-        ret = asn1_check_tlen(&len, NULL, NULL, &cst,
-                              &p, len, tag, aclass, opt, ctx);
+      }
+
+      // Get each field entry
+      for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
+        const ASN1_TEMPLATE *seqtt;
+        ASN1_VALUE **pseqval;
+        seqtt = asn1_do_adb(pval, tt, 1);
+        if (seqtt == NULL) {
+          goto err;
+        }
+        pseqval = asn1_get_field_ptr(pval, seqtt);
+        // Have we ran out of data?
+        if (!len) {
+          break;
+        }
+        q = p;
+        // This determines the OPTIONAL flag value. The field cannot be
+        // omitted if it is the last of a SEQUENCE and there is still
+        // data to be read. This isn't strictly necessary but it
+        // increases efficiency in some cases.
+        if (i == (it->tcount - 1)) {
+          isopt = 0;
+        } else {
+          isopt = (char)(seqtt->flags & ASN1_TFLG_OPTIONAL);
+        }
+        // attempt to read in field, allowing each to be OPTIONAL
+
+        ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, depth);
         if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
-        } else if (ret == -1)
-            return -1;
-        if (!cst) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_NOT_CONSTRUCTED);
-            goto err;
+          errtt = seqtt;
+          goto err;
+        } else if (ret == -1) {
+          // OPTIONAL component absent. Free and zero the field.
+          ASN1_template_free(pseqval, seqtt);
+          continue;
         }
+        // Update length
+        len -= p - q;
+      }
 
-        if (!*pval && !ASN1_item_ex_new(pval, it)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
+      // Check all data read
+      if (len) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH);
+        goto err;
+      }
+
+      // If we get here we've got no more data in the SEQUENCE, however we
+      // may not have read all fields so check all remaining are OPTIONAL
+      // and clear any that are.
+      for (; i < it->tcount; tt++, i++) {
+        const ASN1_TEMPLATE *seqtt;
+        seqtt = asn1_do_adb(pval, tt, 1);
+        if (seqtt == NULL) {
+          goto err;
         }
-
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL))
-            goto auxerr;
-
-        /* Free up and zero any ADB found */
-        for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
-            if (tt->flags & ASN1_TFLG_ADB_MASK) {
-                const ASN1_TEMPLATE *seqtt;
-                ASN1_VALUE **pseqval;
-                seqtt = asn1_do_adb(pval, tt, 0);
-                if (seqtt == NULL)
-                    continue;
-                pseqval = asn1_get_field_ptr(pval, seqtt);
-                ASN1_template_free(pseqval, seqtt);
-            }
+        if (seqtt->flags & ASN1_TFLG_OPTIONAL) {
+          ASN1_VALUE **pseqval;
+          pseqval = asn1_get_field_ptr(pval, seqtt);
+          ASN1_template_free(pseqval, seqtt);
+        } else {
+          errtt = seqtt;
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_FIELD_MISSING);
+          goto err;
         }
-
-        /* Get each field entry */
-        for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
-            const ASN1_TEMPLATE *seqtt;
-            ASN1_VALUE **pseqval;
-            seqtt = asn1_do_adb(pval, tt, 1);
-            if (seqtt == NULL)
-                goto err;
-            pseqval = asn1_get_field_ptr(pval, seqtt);
-            /* Have we ran out of data? */
-            if (!len)
-                break;
-            q = p;
-            /* TODO(https://crbug.com/boringssl/455): Although we've removed
-             * indefinite-length support, this check is not quite a no-op.
-             * Reject [UNIVERSAL 0] in the tag parsers themselves. */
-            if (asn1_check_eoc(&p, len)) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNEXPECTED_EOC);
-                goto err;
-            }
-            /*
-             * This determines the OPTIONAL flag value. The field cannot be
-             * omitted if it is the last of a SEQUENCE and there is still
-             * data to be read. This isn't strictly necessary but it
-             * increases efficiency in some cases.
-             */
-            if (i == (it->tcount - 1))
-                isopt = 0;
-            else
-                isopt = (char)(seqtt->flags & ASN1_TFLG_OPTIONAL);
-            /*
-             * attempt to read in field, allowing each to be OPTIONAL
-             */
-
-            ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, ctx,
-                                       depth);
-            if (!ret) {
-                errtt = seqtt;
-                goto err;
-            } else if (ret == -1) {
-                /*
-                 * OPTIONAL component absent. Free and zero the field.
-                 */
-                ASN1_template_free(pseqval, seqtt);
-                continue;
-            }
-            /* Update length */
-            len -= p - q;
-        }
-
-        /* Check all data read */
-        if (len) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH);
-            goto err;
-        }
-
-        /*
-         * If we get here we've got no more data in the SEQUENCE, however we
-         * may not have read all fields so check all remaining are OPTIONAL
-         * and clear any that are.
-         */
-        for (; i < it->tcount; tt++, i++) {
-            const ASN1_TEMPLATE *seqtt;
-            seqtt = asn1_do_adb(pval, tt, 1);
-            if (seqtt == NULL)
-                goto err;
-            if (seqtt->flags & ASN1_TFLG_OPTIONAL) {
-                ASN1_VALUE **pseqval;
-                pseqval = asn1_get_field_ptr(pval, seqtt);
-                ASN1_template_free(pseqval, seqtt);
-            } else {
-                errtt = seqtt;
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_FIELD_MISSING);
-                goto err;
-            }
-        }
-        /* Save encoding */
-        if (!asn1_enc_save(pval, *in, p - *in, it))
-            goto auxerr;
-        if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
-            goto auxerr;
-        *in = p;
-        return 1;
+      }
+      // Save encoding
+      if (!asn1_enc_save(pval, *in, p - *in, it)) {
+        goto auxerr;
+      }
+      if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL)) {
+        goto auxerr;
+      }
+      *in = p;
+      return 1;
     }
 
     default:
-        return 0;
-    }
- auxerr:
-    OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
- err:
-    if (combine == 0)
-        ASN1_item_ex_free(pval, it);
-    if (errtt)
-        ERR_add_error_data(4, "Field=", errtt->field_name,
-                           ", Type=", it->sname);
-    else
-        ERR_add_error_data(2, "Type=", it->sname);
-    return 0;
+      return 0;
+  }
+auxerr:
+  OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
+err:
+  if (combine == 0) {
+    ASN1_item_ex_free(pval, it);
+  }
+  if (errtt) {
+    ERR_add_error_data(4, "Field=", errtt->field_name, ", Type=", it->sname);
+  } else {
+    ERR_add_error_data(2, "Type=", it->sname);
+  }
+  return 0;
 }
 
 int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
-                     const ASN1_ITEM *it,
-                     int tag, int aclass, char opt, ASN1_TLC *ctx)
-{
-    return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, ctx, 0);
+                     const ASN1_ITEM *it, int tag, int aclass, char opt,
+                     ASN1_TLC *ctx) {
+  return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, 0);
 }
 
-/*
- * Templates are handled with two separate functions. One handles any
- * EXPLICIT tag and the other handles the rest.
- */
+// Templates are handled with two separate functions. One handles any
+// EXPLICIT tag and the other handles the rest.
 
-static int asn1_template_ex_d2i(ASN1_VALUE **val,
-                                const unsigned char **in, long inlen,
-                                const ASN1_TEMPLATE *tt, char opt,
-                                ASN1_TLC *ctx, int depth)
-{
-    int flags, aclass;
-    int ret;
-    long len;
-    const unsigned char *p, *q;
-    if (!val)
-        return 0;
-    flags = tt->flags;
-    aclass = flags & ASN1_TFLG_TAG_CLASS;
-
-    p = *in;
-
-    /* Check if EXPLICIT tag expected */
-    if (flags & ASN1_TFLG_EXPTAG) {
-        char cst;
-        /*
-         * Need to work out amount of data available to the inner content and
-         * where it starts: so read in EXPLICIT header to get the info.
-         */
-        ret = asn1_check_tlen(&len, NULL, NULL, &cst,
-                              &p, inlen, tt->tag, aclass, opt, ctx);
-        q = p;
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            return 0;
-        } else if (ret == -1)
-            return -1;
-        if (!cst) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED);
-            return 0;
-        }
-        /* We've found the field so it can't be OPTIONAL now */
-        ret = asn1_template_noexp_d2i(val, &p, len, tt, 0, ctx, depth);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            return 0;
-        }
-        /* We read the field in OK so update length */
-        len -= p - q;
-        /* Check for trailing data. */
-        if (len) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH);
-            goto err;
-        }
-    } else
-        return asn1_template_noexp_d2i(val, in, inlen, tt, opt, ctx, depth);
-
-    *in = p;
-    return 1;
-
- err:
-    ASN1_template_free(val, tt);
+static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in,
+                                long inlen, const ASN1_TEMPLATE *tt, char opt,
+                                int depth) {
+  int flags, aclass;
+  int ret;
+  long len;
+  const unsigned char *p, *q;
+  if (!val) {
     return 0;
-}
+  }
+  flags = tt->flags;
+  aclass = flags & ASN1_TFLG_TAG_CLASS;
 
-static int asn1_template_noexp_d2i(ASN1_VALUE **val,
-                                   const unsigned char **in, long len,
-                                   const ASN1_TEMPLATE *tt, char opt,
-                                   ASN1_TLC *ctx, int depth)
-{
-    int flags, aclass;
-    int ret;
-    const unsigned char *p;
-    if (!val)
-        return 0;
-    flags = tt->flags;
-    aclass = flags & ASN1_TFLG_TAG_CLASS;
+  p = *in;
 
-    p = *in;
-
-    if (flags & ASN1_TFLG_SK_MASK) {
-        /* SET OF, SEQUENCE OF */
-        int sktag, skaclass;
-        /* First work out expected inner tag value */
-        if (flags & ASN1_TFLG_IMPTAG) {
-            sktag = tt->tag;
-            skaclass = aclass;
-        } else {
-            skaclass = V_ASN1_UNIVERSAL;
-            if (flags & ASN1_TFLG_SET_OF)
-                sktag = V_ASN1_SET;
-            else
-                sktag = V_ASN1_SEQUENCE;
-        }
-        /* Get the tag */
-        ret = asn1_check_tlen(&len, NULL, NULL, NULL,
-                              &p, len, sktag, skaclass, opt, ctx);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            return 0;
-        } else if (ret == -1)
-            return -1;
-        if (!*val)
-            *val = (ASN1_VALUE *)sk_ASN1_VALUE_new_null();
-        else {
-            /*
-             * We've got a valid STACK: free up any items present
-             */
-            STACK_OF(ASN1_VALUE) *sktmp = (STACK_OF(ASN1_VALUE) *)*val;
-            ASN1_VALUE *vtmp;
-            while (sk_ASN1_VALUE_num(sktmp) > 0) {
-                vtmp = sk_ASN1_VALUE_pop(sktmp);
-                ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item));
-            }
-        }
-
-        if (!*val) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-
-        /* Read as many items as we can */
-        while (len > 0) {
-            ASN1_VALUE *skfield;
-            const unsigned char *q = p;
-            /* TODO(https://crbug.com/boringssl/455): Although we've removed
-             * indefinite-length support, this check is not quite a no-op.
-             * Reject [UNIVERSAL 0] in the tag parsers themselves. */
-            if (asn1_check_eoc(&p, len)) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNEXPECTED_EOC);
-                goto err;
-            }
-            skfield = NULL;
-             if (!asn1_item_ex_d2i(&skfield, &p, len, ASN1_ITEM_ptr(tt->item),
-                                   -1, 0, 0, ctx, depth)) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-                goto err;
-            }
-            len -= p - q;
-            if (!sk_ASN1_VALUE_push((STACK_OF(ASN1_VALUE) *)*val, skfield)) {
-                ASN1_item_ex_free(&skfield, ASN1_ITEM_ptr(tt->item));
-                OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-                goto err;
-            }
-        }
-    } else if (flags & ASN1_TFLG_IMPTAG) {
-        /* IMPLICIT tagging */
-        ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), tt->tag,
-                               aclass, opt, ctx, depth);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
-        } else if (ret == -1)
-            return -1;
-    } else {
-        /* Nothing special */
-        ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item),
-                               -1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx,
-                               depth);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            goto err;
-        } else if (ret == -1)
-            return -1;
-    }
-
-    *in = p;
-    return 1;
-
- err:
-    ASN1_template_free(val, tt);
-    return 0;
-}
-
-static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
-                                 const unsigned char **in, long inlen,
-                                 const ASN1_ITEM *it,
-                                 int tag, int aclass, char opt, ASN1_TLC *ctx)
-{
-    int ret = 0, utype;
-    long plen;
+  // Check if EXPLICIT tag expected
+  if (flags & ASN1_TFLG_EXPTAG) {
     char cst;
-    const unsigned char *p;
-    const unsigned char *cont = NULL;
-    long len;
-    if (!pval) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL);
-        return 0;               /* Should never happen */
-    }
-
-    if (it->itype == ASN1_ITYPE_MSTRING) {
-        utype = tag;
-        tag = -1;
-    } else
-        utype = it->utype;
-
-    if (utype == V_ASN1_ANY) {
-        /* If type is ANY need to figure out type from tag */
-        unsigned char oclass;
-        if (tag >= 0) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TAGGED_ANY);
-            return 0;
-        }
-        if (opt) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY);
-            return 0;
-        }
-        p = *in;
-        ret = asn1_check_tlen(NULL, &utype, &oclass, NULL,
-                              &p, inlen, -1, 0, 0, ctx);
-        if (!ret) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-            return 0;
-        }
-        if (oclass != V_ASN1_UNIVERSAL)
-            utype = V_ASN1_OTHER;
-    }
-    if (tag == -1) {
-        tag = utype;
-        aclass = V_ASN1_UNIVERSAL;
-    }
-    p = *in;
-    /* Check header */
-    ret = asn1_check_tlen(&plen, NULL, NULL, &cst,
-                          &p, inlen, tag, aclass, opt, ctx);
+    // Need to work out amount of data available to the inner content and
+    // where it starts: so read in EXPLICIT header to get the info.
+    ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, inlen, tt->tag, aclass,
+                          opt);
+    q = p;
     if (!ret) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
-        return 0;
-    } else if (ret == -1)
-        return -1;
-    ret = 0;
-    /* SEQUENCE, SET and "OTHER" are left in encoded form */
-    if ((utype == V_ASN1_SEQUENCE)
-        || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) {
-        /*
-         * Clear context cache for type OTHER because the auto clear when we
-         * have a exact match wont work
-         */
-        if (utype == V_ASN1_OTHER) {
-            asn1_tlc_clear(ctx);
-        }
-        /* SEQUENCE and SET must be constructed */
-        else if (!cst) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED);
-            return 0;
-        }
-
-        cont = *in;
-        len = p - cont + plen;
-        p += plen;
-    } else if (cst) {
-        /* This parser historically supported BER constructed strings. We no
-         * longer do and will gradually tighten this parser into a DER
-         * parser. BER types should use |CBS_asn1_ber_to_der|. */
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
-        return 0;
-    } else {
-        cont = p;
-        len = plen;
-        p += plen;
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      return 0;
+    } else if (ret == -1) {
+      return -1;
     }
+    if (!cst) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED);
+      return 0;
+    }
+    // We've found the field so it can't be OPTIONAL now
+    ret = asn1_template_noexp_d2i(val, &p, len, tt, 0, depth);
+    if (!ret) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      return 0;
+    }
+    // We read the field in OK so update length
+    len -= p - q;
+    // Check for trailing data.
+    if (len) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH);
+      goto err;
+    }
+  } else {
+    return asn1_template_noexp_d2i(val, in, inlen, tt, opt, depth);
+  }
 
-    /* We now have content length and type: translate into a structure */
-    if (!asn1_ex_c2i(pval, cont, len, utype, it))
-        goto err;
+  *in = p;
+  return 1;
 
-    *in = p;
-    ret = 1;
- err:
-    return ret;
+err:
+  ASN1_template_free(val, tt);
+  return 0;
 }
 
-/* Translate ASN1 content octets into a structure */
+static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in,
+                                   long len, const ASN1_TEMPLATE *tt, char opt,
+                                   int depth) {
+  int flags, aclass;
+  int ret;
+  const unsigned char *p;
+  if (!val) {
+    return 0;
+  }
+  flags = tt->flags;
+  aclass = flags & ASN1_TFLG_TAG_CLASS;
+
+  p = *in;
+
+  if (flags & ASN1_TFLG_SK_MASK) {
+    // SET OF, SEQUENCE OF
+    int sktag, skaclass;
+    // First work out expected inner tag value
+    if (flags & ASN1_TFLG_IMPTAG) {
+      sktag = tt->tag;
+      skaclass = aclass;
+    } else {
+      skaclass = V_ASN1_UNIVERSAL;
+      if (flags & ASN1_TFLG_SET_OF) {
+        sktag = V_ASN1_SET;
+      } else {
+        sktag = V_ASN1_SEQUENCE;
+      }
+    }
+    // Get the tag
+    ret =
+        asn1_check_tlen(&len, NULL, NULL, NULL, &p, len, sktag, skaclass, opt);
+    if (!ret) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      return 0;
+    } else if (ret == -1) {
+      return -1;
+    }
+    if (!*val) {
+      *val = (ASN1_VALUE *)sk_ASN1_VALUE_new_null();
+    } else {
+      // We've got a valid STACK: free up any items present
+      STACK_OF(ASN1_VALUE) *sktmp = (STACK_OF(ASN1_VALUE) *)*val;
+      ASN1_VALUE *vtmp;
+      while (sk_ASN1_VALUE_num(sktmp) > 0) {
+        vtmp = sk_ASN1_VALUE_pop(sktmp);
+        ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item));
+      }
+    }
+
+    if (!*val) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+
+    // Read as many items as we can
+    while (len > 0) {
+      ASN1_VALUE *skfield;
+      const unsigned char *q = p;
+      skfield = NULL;
+      if (!asn1_item_ex_d2i(&skfield, &p, len, ASN1_ITEM_ptr(tt->item), -1, 0,
+                            0, depth)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+        goto err;
+      }
+      len -= p - q;
+      if (!sk_ASN1_VALUE_push((STACK_OF(ASN1_VALUE) *)*val, skfield)) {
+        ASN1_item_ex_free(&skfield, ASN1_ITEM_ptr(tt->item));
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        goto err;
+      }
+    }
+  } else if (flags & ASN1_TFLG_IMPTAG) {
+    // IMPLICIT tagging
+    ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), tt->tag,
+                           aclass, opt, depth);
+    if (!ret) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      goto err;
+    } else if (ret == -1) {
+      return -1;
+    }
+  } else {
+    // Nothing special
+    ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1,
+                           tt->flags & ASN1_TFLG_COMBINE, opt, depth);
+    if (!ret) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      goto err;
+    } else if (ret == -1) {
+      return -1;
+    }
+  }
+
+  *in = p;
+  return 1;
+
+err:
+  ASN1_template_free(val, tt);
+  return 0;
+}
+
+static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in,
+                                 long inlen, const ASN1_ITEM *it, int tag,
+                                 int aclass, char opt) {
+  int ret = 0, utype;
+  long plen;
+  char cst;
+  const unsigned char *p;
+  const unsigned char *cont = NULL;
+  long len;
+  if (!pval) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL);
+    return 0;  // Should never happen
+  }
+
+  if (it->itype == ASN1_ITYPE_MSTRING) {
+    utype = tag;
+    tag = -1;
+  } else {
+    utype = it->utype;
+  }
+
+  if (utype == V_ASN1_ANY) {
+    // If type is ANY need to figure out type from tag
+    unsigned char oclass;
+    if (tag >= 0) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TAGGED_ANY);
+      return 0;
+    }
+    if (opt) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY);
+      return 0;
+    }
+    p = *in;
+    ret = asn1_check_tlen(NULL, &utype, &oclass, NULL, &p, inlen, -1, 0, 0);
+    if (!ret) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+      return 0;
+    }
+    if (oclass != V_ASN1_UNIVERSAL) {
+      utype = V_ASN1_OTHER;
+    }
+  }
+  if (tag == -1) {
+    tag = utype;
+    aclass = V_ASN1_UNIVERSAL;
+  }
+  p = *in;
+  // Check header
+  ret = asn1_check_tlen(&plen, NULL, NULL, &cst, &p, inlen, tag, aclass, opt);
+  if (!ret) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
+    return 0;
+  } else if (ret == -1) {
+    return -1;
+  }
+  ret = 0;
+  // SEQUENCE, SET and "OTHER" are left in encoded form
+  if ((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) ||
+      (utype == V_ASN1_OTHER)) {
+    // SEQUENCE and SET must be constructed
+    if (utype != V_ASN1_OTHER && !cst) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED);
+      return 0;
+    }
+
+    cont = *in;
+    len = p - cont + plen;
+    p += plen;
+  } else if (cst) {
+    // This parser historically supported BER constructed strings. We no
+    // longer do and will gradually tighten this parser into a DER
+    // parser. BER types should use |CBS_asn1_ber_to_der|.
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
+    return 0;
+  } else {
+    cont = p;
+    len = plen;
+    p += plen;
+  }
+
+  // We now have content length and type: translate into a structure
+  if (!asn1_ex_c2i(pval, cont, len, utype, it)) {
+    goto err;
+  }
+
+  *in = p;
+  ret = 1;
+err:
+  return ret;
+}
+
+// Translate ASN1 content octets into a structure
 
 static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
-                       int utype, const ASN1_ITEM *it)
-{
-    ASN1_VALUE **opval = NULL;
-    ASN1_STRING *stmp;
-    ASN1_TYPE *typ = NULL;
-    int ret = 0;
-    ASN1_INTEGER **tint;
+                       int utype, const ASN1_ITEM *it) {
+  ASN1_VALUE **opval = NULL;
+  ASN1_STRING *stmp;
+  ASN1_TYPE *typ = NULL;
+  int ret = 0;
+  ASN1_INTEGER **tint;
 
-    /* Historically, |it->funcs| for primitive types contained an
-     * |ASN1_PRIMITIVE_FUNCS| table of callbacks. */
-    assert(it->funcs == NULL);
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of callbacks.
+  assert(it->funcs == NULL);
 
-    /* If ANY type clear type and set pointer to internal value */
-    if (it->utype == V_ASN1_ANY) {
-        if (!*pval) {
-            typ = ASN1_TYPE_new();
-            if (typ == NULL)
-                goto err;
-            *pval = (ASN1_VALUE *)typ;
-        } else
-            typ = (ASN1_TYPE *)*pval;
-
-        if (utype != typ->type)
-            ASN1_TYPE_set(typ, utype, NULL);
-        opval = pval;
-        pval = &typ->value.asn1_value;
+  // If ANY type clear type and set pointer to internal value
+  if (it->utype == V_ASN1_ANY) {
+    if (!*pval) {
+      typ = ASN1_TYPE_new();
+      if (typ == NULL) {
+        goto err;
+      }
+      *pval = (ASN1_VALUE *)typ;
+    } else {
+      typ = (ASN1_TYPE *)*pval;
     }
-    switch (utype) {
+
+    if (utype != typ->type) {
+      ASN1_TYPE_set(typ, utype, NULL);
+    }
+    opval = pval;
+    pval = &typ->value.asn1_value;
+  }
+  switch (utype) {
     case V_ASN1_OBJECT:
-        if (!c2i_ASN1_OBJECT((ASN1_OBJECT **)pval, &cont, len))
-            goto err;
-        break;
+      if (!c2i_ASN1_OBJECT((ASN1_OBJECT **)pval, &cont, len)) {
+        goto err;
+      }
+      break;
 
     case V_ASN1_NULL:
-        if (len) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH);
-            goto err;
-        }
-        *pval = (ASN1_VALUE *)1;
-        break;
+      if (len) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH);
+        goto err;
+      }
+      *pval = (ASN1_VALUE *)1;
+      break;
 
     case V_ASN1_BOOLEAN:
-        if (len != 1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
-            goto err;
-        } else {
-            ASN1_BOOLEAN *tbool;
-            tbool = (ASN1_BOOLEAN *)pval;
-            *tbool = *cont;
-        }
-        break;
+      if (len != 1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
+        goto err;
+      } else {
+        ASN1_BOOLEAN *tbool;
+        tbool = (ASN1_BOOLEAN *)pval;
+        *tbool = *cont;
+      }
+      break;
 
     case V_ASN1_BIT_STRING:
-        if (!c2i_ASN1_BIT_STRING((ASN1_BIT_STRING **)pval, &cont, len))
-            goto err;
-        break;
+      if (!c2i_ASN1_BIT_STRING((ASN1_BIT_STRING **)pval, &cont, len)) {
+        goto err;
+      }
+      break;
 
     case V_ASN1_INTEGER:
     case V_ASN1_ENUMERATED:
-        tint = (ASN1_INTEGER **)pval;
-        if (!c2i_ASN1_INTEGER(tint, &cont, len))
-            goto err;
-        /* Fixup type to match the expected form */
-        (*tint)->type = utype | ((*tint)->type & V_ASN1_NEG);
-        break;
+      tint = (ASN1_INTEGER **)pval;
+      if (!c2i_ASN1_INTEGER(tint, &cont, len)) {
+        goto err;
+      }
+      // Fixup type to match the expected form
+      (*tint)->type = utype | ((*tint)->type & V_ASN1_NEG);
+      break;
 
     case V_ASN1_OCTET_STRING:
     case V_ASN1_NUMERICSTRING:
@@ -825,145 +798,132 @@
     case V_ASN1_OTHER:
     case V_ASN1_SET:
     case V_ASN1_SEQUENCE:
-    default:
-        if (utype == V_ASN1_BMPSTRING && (len & 1)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BMPSTRING_IS_WRONG_LENGTH);
+    default: {
+      CBS cbs;
+      CBS_init(&cbs, cont, (size_t)len);
+      if (utype == V_ASN1_BMPSTRING) {
+        while (CBS_len(&cbs) != 0) {
+          uint32_t c;
+          if (!cbs_get_ucs2_be(&cbs, &c)) {
+            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BMPSTRING);
             goto err;
+          }
         }
-        if (utype == V_ASN1_UNIVERSALSTRING && (len & 3)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH);
+      }
+      if (utype == V_ASN1_UNIVERSALSTRING) {
+        while (CBS_len(&cbs) != 0) {
+          uint32_t c;
+          if (!cbs_get_utf32_be(&cbs, &c)) {
+            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_UNIVERSALSTRING);
             goto err;
+          }
         }
-        /* All based on ASN1_STRING and handled the same */
-        if (!*pval) {
-            stmp = ASN1_STRING_type_new(utype);
-            if (!stmp) {
-                OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-                goto err;
-            }
-            *pval = (ASN1_VALUE *)stmp;
-        } else {
-            stmp = (ASN1_STRING *)*pval;
-            stmp->type = utype;
-        }
-        if (!ASN1_STRING_set(stmp, cont, len)) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            ASN1_STRING_free(stmp);
-            *pval = NULL;
+      }
+      if (utype == V_ASN1_UTF8STRING) {
+        while (CBS_len(&cbs) != 0) {
+          uint32_t c;
+          if (!cbs_get_utf8(&cbs, &c)) {
+            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_UTF8STRING);
             goto err;
+          }
         }
-        break;
-    }
-    /* If ASN1_ANY and NULL type fix up value */
-    if (typ && (utype == V_ASN1_NULL))
-        typ->value.ptr = NULL;
+      }
+      if (utype == V_ASN1_UTCTIME) {
+        if (!CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1)) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_TIME_FORMAT);
+          goto err;
+        }
+      }
+      if (utype == V_ASN1_GENERALIZEDTIME) {
+        if (!CBS_parse_generalized_time(&cbs, NULL,
+                                        /*allow_timezone_offset=*/0)) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_TIME_FORMAT);
+          goto err;
+        }
+      }
+      // TODO(https://crbug.com/boringssl/427): Check other string types.
 
-    ret = 1;
- err:
-    if (!ret) {
-        ASN1_TYPE_free(typ);
-        if (opval)
-            *opval = NULL;
+      // All based on ASN1_STRING and handled the same
+      if (!*pval) {
+        stmp = ASN1_STRING_type_new(utype);
+        if (!stmp) {
+          OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+          goto err;
+        }
+        *pval = (ASN1_VALUE *)stmp;
+      } else {
+        stmp = (ASN1_STRING *)*pval;
+        stmp->type = utype;
+      }
+      if (!ASN1_STRING_set(stmp, cont, len)) {
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        ASN1_STRING_free(stmp);
+        *pval = NULL;
+        goto err;
+      }
+      break;
     }
-    return ret;
+  }
+  // If ASN1_ANY and NULL type fix up value
+  if (typ && (utype == V_ASN1_NULL)) {
+    typ->value.ptr = NULL;
+  }
+
+  ret = 1;
+err:
+  if (!ret) {
+    ASN1_TYPE_free(typ);
+    if (opval) {
+      *opval = NULL;
+    }
+  }
+  return ret;
 }
 
-/* Check for ASN1 EOC and swallow it if found */
-
-static int asn1_check_eoc(const unsigned char **in, long len)
-{
-    const unsigned char *p;
-    if (len < 2)
-        return 0;
-    p = *in;
-    if (!p[0] && !p[1]) {
-        *in += 2;
-        return 1;
-    }
-    return 0;
-}
-
-/*
- * Check an ASN1 tag and length: a bit like ASN1_get_object but it handles
- * the ASN1_TLC cache and checks the expected tag.
- */
+// Check an ASN1 tag and length: a bit like ASN1_get_object but it
+// checks the expected tag.
 
 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
                            char *cst, const unsigned char **in, long len,
-                           int exptag, int expclass, char opt, ASN1_TLC *ctx)
-{
-    int i;
-    int ptag, pclass;
-    long plen;
-    const unsigned char *p, *q;
-    p = *in;
-    q = p;
+                           int exptag, int expclass, char opt) {
+  int i;
+  int ptag, pclass;
+  long plen;
+  const unsigned char *p;
+  p = *in;
 
-    if (ctx && ctx->valid) {
-        i = ctx->ret;
-        plen = ctx->plen;
-        pclass = ctx->pclass;
-        ptag = ctx->ptag;
-        p += ctx->hdrlen;
-    } else {
-        i = ASN1_get_object(&p, &plen, &ptag, &pclass, len);
-        if (ctx) {
-            ctx->ret = i;
-            ctx->plen = plen;
-            ctx->pclass = pclass;
-            ctx->ptag = ptag;
-            ctx->hdrlen = p - q;
-            ctx->valid = 1;
-            /*
-             * If no error, length + header can't exceed total amount of data
-             * available.
-             *
-             * TODO(davidben): Is this check necessary? |ASN1_get_object|
-             * should already guarantee this.
-             */
-            if (!(i & 0x80) && ((plen + ctx->hdrlen) > len)) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
-                asn1_tlc_clear(ctx);
-                return 0;
-            }
-        }
+  i = ASN1_get_object(&p, &plen, &ptag, &pclass, len);
+  if (i & 0x80) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
+    return 0;
+  }
+  if (exptag >= 0) {
+    if ((exptag != ptag) || (expclass != pclass)) {
+      // If type is OPTIONAL, not an error: indicate missing type.
+      if (opt) {
+        return -1;
+      }
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TAG);
+      return 0;
     }
+  }
 
-    if (i & 0x80) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
-        asn1_tlc_clear(ctx);
-        return 0;
-    }
-    if (exptag >= 0) {
-        if ((exptag != ptag) || (expclass != pclass)) {
-            /*
-             * If type is OPTIONAL, not an error: indicate missing type.
-             */
-            if (opt)
-                return -1;
-            asn1_tlc_clear(ctx);
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TAG);
-            return 0;
-        }
-        /*
-         * We have a tag and class match: assume we are going to do something
-         * with it
-         */
-        asn1_tlc_clear(ctx);
-    }
+  if (cst) {
+    *cst = i & V_ASN1_CONSTRUCTED;
+  }
 
-    if (cst)
-        *cst = i & V_ASN1_CONSTRUCTED;
+  if (olen) {
+    *olen = plen;
+  }
 
-    if (olen)
-        *olen = plen;
+  if (oclass) {
+    *oclass = pclass;
+  }
 
-    if (oclass)
-        *oclass = pclass;
+  if (otag) {
+    *otag = ptag;
+  }
 
-    if (otag)
-        *otag = ptag;
-
-    *in = p;
-    return 1;
+  *in = p;
+  return 1;
 }
diff --git a/src/crypto/asn1/tasn_enc.c b/src/crypto/asn1/tasn_enc.c
index 0af9e9d..39a3d52 100644
--- a/src/crypto/asn1/tasn_enc.c
+++ b/src/crypto/asn1/tasn_enc.c
@@ -80,603 +80,586 @@
 static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                                 const ASN1_TEMPLATE *tt, int tag, int aclass);
 
-/*
- * Top level i2d equivalents
- */
+// Top level i2d equivalents
 
-int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it)
-{
-    if (out && !*out) {
-        unsigned char *p, *buf;
-        int len = ASN1_item_ex_i2d(&val, NULL, it, /*tag=*/-1, /*aclass=*/0);
-        if (len <= 0) {
-            return len;
-        }
-        buf = OPENSSL_malloc(len);
-        if (!buf) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            return -1;
-        }
-        p = buf;
-        int len2 = ASN1_item_ex_i2d(&val, &p, it, /*tag=*/-1, /*aclass=*/0);
-        if (len2 <= 0) {
-            return len2;
-        }
-        assert(len == len2);
-        *out = buf;
-        return len;
+int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it) {
+  if (out && !*out) {
+    unsigned char *p, *buf;
+    int len = ASN1_item_ex_i2d(&val, NULL, it, /*tag=*/-1, /*aclass=*/0);
+    if (len <= 0) {
+      return len;
     }
+    buf = OPENSSL_malloc(len);
+    if (!buf) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      return -1;
+    }
+    p = buf;
+    int len2 = ASN1_item_ex_i2d(&val, &p, it, /*tag=*/-1, /*aclass=*/0);
+    if (len2 <= 0) {
+      return len2;
+    }
+    assert(len == len2);
+    *out = buf;
+    return len;
+  }
 
-    return ASN1_item_ex_i2d(&val, out, it, /*tag=*/-1, /*aclass=*/0);
+  return ASN1_item_ex_i2d(&val, out, it, /*tag=*/-1, /*aclass=*/0);
 }
 
-/*
- * Encode an item, taking care of IMPLICIT tagging (if any). This function
- * performs the normal item handling: it can be used in external types.
- */
+// Encode an item, taking care of IMPLICIT tagging (if any). This function
+// performs the normal item handling: it can be used in external types.
 
 int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
-                     const ASN1_ITEM *it, int tag, int aclass)
-{
-    int ret = asn1_item_ex_i2d_opt(pval, out, it, tag, aclass, /*optional=*/0);
-    assert(ret != 0);
-    return ret;
+                     const ASN1_ITEM *it, int tag, int aclass) {
+  int ret = asn1_item_ex_i2d_opt(pval, out, it, tag, aclass, /*optional=*/0);
+  assert(ret != 0);
+  return ret;
 }
 
-/* asn1_item_ex_i2d_opt behaves like |ASN1_item_ex_i2d| but, if |optional| is
- * non-zero and |*pval| is omitted, it returns zero and writes no bytes. */
+// asn1_item_ex_i2d_opt behaves like |ASN1_item_ex_i2d| but, if |optional| is
+// non-zero and |*pval| is omitted, it returns zero and writes no bytes.
 int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out,
                          const ASN1_ITEM *it, int tag, int aclass,
-                         int optional)
-{
-    const ASN1_TEMPLATE *tt = NULL;
-    int i, seqcontlen, seqlen;
+                         int optional) {
+  const ASN1_TEMPLATE *tt = NULL;
+  int i, seqcontlen, seqlen;
 
-    /* Historically, |aclass| was repurposed to pass additional flags into the
-     * encoding process. */
-    assert((aclass & ASN1_TFLG_TAG_CLASS) == aclass);
-    /* If not overridding the tag, |aclass| is ignored and should be zero. */
-    assert(tag != -1 || aclass == 0);
+  // Historically, |aclass| was repurposed to pass additional flags into the
+  // encoding process.
+  assert((aclass & ASN1_TFLG_TAG_CLASS) == aclass);
+  // If not overridding the tag, |aclass| is ignored and should be zero.
+  assert(tag != -1 || aclass == 0);
 
-    /* All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s.
-     * Optional primitives are handled later. */
-    if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval) {
-        if (optional) {
-            return 0;
-        }
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
-        return -1;
+  // All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s.
+  // Optional primitives are handled later.
+  if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval) {
+    if (optional) {
+      return 0;
     }
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
+    return -1;
+  }
 
-    switch (it->itype) {
-
+  switch (it->itype) {
     case ASN1_ITYPE_PRIMITIVE:
-        if (it->templates) {
-            if (it->templates->flags & ASN1_TFLG_OPTIONAL) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-                return -1;
-            }
-            return asn1_template_ex_i2d(pval, out, it->templates, tag, aclass);
+      if (it->templates) {
+        if (it->templates->flags & ASN1_TFLG_OPTIONAL) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+          return -1;
         }
-        return asn1_i2d_ex_primitive(pval, out, it, tag, aclass, optional);
+        return asn1_template_ex_i2d(pval, out, it->templates, tag, aclass);
+      }
+      return asn1_i2d_ex_primitive(pval, out, it, tag, aclass, optional);
 
     case ASN1_ITYPE_MSTRING:
-        /*
-         * It never makes sense for multi-strings to have implicit tagging, so
-         * if tag != -1, then this looks like an error in the template.
-         */
-        if (tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            return -1;
-        }
-        return asn1_i2d_ex_primitive(pval, out, it, -1, 0, optional);
+      // It never makes sense for multi-strings to have implicit tagging, so
+      // if tag != -1, then this looks like an error in the template.
+      if (tag != -1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+        return -1;
+      }
+      return asn1_i2d_ex_primitive(pval, out, it, -1, 0, optional);
 
     case ASN1_ITYPE_CHOICE: {
-        /*
-         * It never makes sense for CHOICE types to have implicit tagging, so if
-         * tag != -1, then this looks like an error in the template.
-         */
-        if (tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            return -1;
-        }
-        i = asn1_get_choice_selector(pval, it);
-        if (i < 0 || i >= it->tcount) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
-            return -1;
-        }
-        const ASN1_TEMPLATE *chtt = it->templates + i;
-        if (chtt->flags & ASN1_TFLG_OPTIONAL) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            return -1;
-        }
-        ASN1_VALUE **pchval = asn1_get_field_ptr(pval, chtt);
-        return asn1_template_ex_i2d(pchval, out, chtt, -1, 0);
+      // It never makes sense for CHOICE types to have implicit tagging, so if
+      // tag != -1, then this looks like an error in the template.
+      if (tag != -1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+        return -1;
+      }
+      i = asn1_get_choice_selector(pval, it);
+      if (i < 0 || i >= it->tcount) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
+        return -1;
+      }
+      const ASN1_TEMPLATE *chtt = it->templates + i;
+      if (chtt->flags & ASN1_TFLG_OPTIONAL) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+        return -1;
+      }
+      ASN1_VALUE **pchval = asn1_get_field_ptr(pval, chtt);
+      return asn1_template_ex_i2d(pchval, out, chtt, -1, 0);
     }
 
     case ASN1_ITYPE_EXTERN: {
-        /* If new style i2d it does all the work */
-        const ASN1_EXTERN_FUNCS *ef = it->funcs;
-        int ret = ef->asn1_ex_i2d(pval, out, it, tag, aclass);
-        if (ret == 0) {
-            /* |asn1_ex_i2d| should never return zero. We have already checked
-             * for optional values generically, and |ASN1_ITYPE_EXTERN| fields
-             * must be pointers. */
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
-            return -1;
-        }
-        return ret;
+      // If new style i2d it does all the work
+      const ASN1_EXTERN_FUNCS *ef = it->funcs;
+      int ret = ef->asn1_ex_i2d(pval, out, it, tag, aclass);
+      if (ret == 0) {
+        // |asn1_ex_i2d| should never return zero. We have already checked
+        // for optional values generically, and |ASN1_ITYPE_EXTERN| fields
+        // must be pointers.
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
+        return -1;
+      }
+      return ret;
     }
 
     case ASN1_ITYPE_SEQUENCE: {
-        i = asn1_enc_restore(&seqcontlen, out, pval, it);
-        /* An error occurred */
-        if (i < 0)
-            return -1;
-        /* We have a valid cached encoding... */
-        if (i > 0)
-            return seqcontlen;
-        /* Otherwise carry on */
-        seqcontlen = 0;
-        /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
-        if (tag == -1) {
-            tag = V_ASN1_SEQUENCE;
-            aclass = V_ASN1_UNIVERSAL;
+      i = asn1_enc_restore(&seqcontlen, out, pval, it);
+      // An error occurred
+      if (i < 0) {
+        return -1;
+      }
+      // We have a valid cached encoding...
+      if (i > 0) {
+        return seqcontlen;
+      }
+      // Otherwise carry on
+      seqcontlen = 0;
+      // If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL
+      if (tag == -1) {
+        tag = V_ASN1_SEQUENCE;
+        aclass = V_ASN1_UNIVERSAL;
+      }
+      // First work out sequence content length
+      for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
+        const ASN1_TEMPLATE *seqtt;
+        ASN1_VALUE **pseqval;
+        int tmplen;
+        seqtt = asn1_do_adb(pval, tt, 1);
+        if (!seqtt) {
+          return -1;
         }
-        /* First work out sequence content length */
-        for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
-            const ASN1_TEMPLATE *seqtt;
-            ASN1_VALUE **pseqval;
-            int tmplen;
-            seqtt = asn1_do_adb(pval, tt, 1);
-            if (!seqtt)
-                return -1;
-            pseqval = asn1_get_field_ptr(pval, seqtt);
-            tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0);
-            if (tmplen == -1 || (tmplen > INT_MAX - seqcontlen))
-                return -1;
-            seqcontlen += tmplen;
+        pseqval = asn1_get_field_ptr(pval, seqtt);
+        tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0);
+        if (tmplen == -1 || (tmplen > INT_MAX - seqcontlen)) {
+          return -1;
         }
+        seqcontlen += tmplen;
+      }
 
-        seqlen = ASN1_object_size(/*constructed=*/1, seqcontlen, tag);
-        if (!out || seqlen == -1)
-            return seqlen;
-        /* Output SEQUENCE header */
-        ASN1_put_object(out, /*constructed=*/1, seqcontlen, tag, aclass);
-        for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
-            const ASN1_TEMPLATE *seqtt;
-            ASN1_VALUE **pseqval;
-            seqtt = asn1_do_adb(pval, tt, 1);
-            if (!seqtt)
-                return -1;
-            pseqval = asn1_get_field_ptr(pval, seqtt);
-            if (asn1_template_ex_i2d(pseqval, out, seqtt, -1, 0) < 0) {
-                return -1;
-            }
-        }
+      seqlen = ASN1_object_size(/*constructed=*/1, seqcontlen, tag);
+      if (!out || seqlen == -1) {
         return seqlen;
+      }
+      // Output SEQUENCE header
+      ASN1_put_object(out, /*constructed=*/1, seqcontlen, tag, aclass);
+      for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
+        const ASN1_TEMPLATE *seqtt;
+        ASN1_VALUE **pseqval;
+        seqtt = asn1_do_adb(pval, tt, 1);
+        if (!seqtt) {
+          return -1;
+        }
+        pseqval = asn1_get_field_ptr(pval, seqtt);
+        if (asn1_template_ex_i2d(pseqval, out, seqtt, -1, 0) < 0) {
+          return -1;
+        }
+      }
+      return seqlen;
     }
 
     default:
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-        return -1;
-    }
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+      return -1;
+  }
 }
 
-/* asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an
- * |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an
- * |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of
- * taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag. */
+// asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an
+// |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an
+// |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of
+// taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag.
 static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
-                                const ASN1_TEMPLATE *tt, int tag, int iclass)
-{
-    int i, ret, flags, ttag, tclass;
-    size_t j;
-    flags = tt->flags;
+                                const ASN1_TEMPLATE *tt, int tag, int iclass) {
+  int i, ret, flags, ttag, tclass;
+  size_t j;
+  flags = tt->flags;
 
-    /* Historically, |iclass| was repurposed to pass additional flags into the
-     * encoding process. */
-    assert((iclass & ASN1_TFLG_TAG_CLASS) == iclass);
-    /* If not overridding the tag, |iclass| is ignored and should be zero. */
-    assert(tag != -1 || iclass == 0);
+  // Historically, |iclass| was repurposed to pass additional flags into the
+  // encoding process.
+  assert((iclass & ASN1_TFLG_TAG_CLASS) == iclass);
+  // If not overridding the tag, |iclass| is ignored and should be zero.
+  assert(tag != -1 || iclass == 0);
 
-    /*
-     * Work out tag and class to use: tagging may come either from the
-     * template or the arguments, not both because this would create
-     * ambiguity.
-     */
-    if (flags & ASN1_TFLG_TAG_MASK) {
-        /* Error if argument and template tagging */
-        if (tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
-            return -1;
-        }
-        /* Get tagging from template */
-        ttag = tt->tag;
-        tclass = flags & ASN1_TFLG_TAG_CLASS;
-    } else if (tag != -1) {
-        /* No template tagging, get from arguments */
-        ttag = tag;
-        tclass = iclass & ASN1_TFLG_TAG_CLASS;
+  // Work out tag and class to use: tagging may come either from the
+  // template or the arguments, not both because this would create
+  // ambiguity.
+  if (flags & ASN1_TFLG_TAG_MASK) {
+    // Error if argument and template tagging
+    if (tag != -1) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
+      return -1;
+    }
+    // Get tagging from template
+    ttag = tt->tag;
+    tclass = flags & ASN1_TFLG_TAG_CLASS;
+  } else if (tag != -1) {
+    // No template tagging, get from arguments
+    ttag = tag;
+    tclass = iclass & ASN1_TFLG_TAG_CLASS;
+  } else {
+    ttag = -1;
+    tclass = 0;
+  }
+
+  const int optional = (flags & ASN1_TFLG_OPTIONAL) != 0;
+
+  // At this point 'ttag' contains the outer tag to use, and 'tclass' is the
+  // class.
+
+  if (flags & ASN1_TFLG_SK_MASK) {
+    // SET OF, SEQUENCE OF
+    STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
+    int isset, sktag, skaclass;
+    int skcontlen, sklen;
+    ASN1_VALUE *skitem;
+
+    if (!*pval) {
+      if (optional) {
+        return 0;
+      }
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
+      return -1;
+    }
+
+    if (flags & ASN1_TFLG_SET_OF) {
+      isset = 1;
+      // Historically, types with both bits set were mutated when
+      // serialized to apply the sort. We no longer support this.
+      assert((flags & ASN1_TFLG_SEQUENCE_OF) == 0);
     } else {
-        ttag = -1;
-        tclass = 0;
+      isset = 0;
     }
 
-    const int optional = (flags & ASN1_TFLG_OPTIONAL) != 0;
-
-    /*
-     * At this point 'ttag' contains the outer tag to use, and 'tclass' is the
-     * class.
-     */
-
-    if (flags & ASN1_TFLG_SK_MASK) {
-        /* SET OF, SEQUENCE OF */
-        STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
-        int isset, sktag, skaclass;
-        int skcontlen, sklen;
-        ASN1_VALUE *skitem;
-
-        if (!*pval) {
-            if (optional) {
-                return 0;
-            }
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
-            return -1;
-        }
-
-        if (flags & ASN1_TFLG_SET_OF) {
-            isset = 1;
-            /* Historically, types with both bits set were mutated when
-             * serialized to apply the sort. We no longer support this. */
-            assert((flags & ASN1_TFLG_SEQUENCE_OF) == 0);
-        } else {
-            isset = 0;
-        }
-
-        /*
-         * Work out inner tag value: if EXPLICIT or no tagging use underlying
-         * type.
-         */
-        if ((ttag != -1) && !(flags & ASN1_TFLG_EXPTAG)) {
-            sktag = ttag;
-            skaclass = tclass;
-        } else {
-            skaclass = V_ASN1_UNIVERSAL;
-            if (isset)
-                sktag = V_ASN1_SET;
-            else
-                sktag = V_ASN1_SEQUENCE;
-        }
-
-        /* Determine total length of items */
-        skcontlen = 0;
-        for (j = 0; j < sk_ASN1_VALUE_num(sk); j++) {
-            int tmplen;
-            skitem = sk_ASN1_VALUE_value(sk, j);
-            tmplen = ASN1_item_ex_i2d(&skitem, NULL, ASN1_ITEM_ptr(tt->item),
-                                      -1, 0);
-            if (tmplen == -1 || (skcontlen > INT_MAX - tmplen))
-                return -1;
-            skcontlen += tmplen;
-        }
-        sklen = ASN1_object_size(/*constructed=*/1, skcontlen, sktag);
-        if (sklen == -1)
-            return -1;
-        /* If EXPLICIT need length of surrounding tag */
-        if (flags & ASN1_TFLG_EXPTAG)
-            ret = ASN1_object_size(/*constructed=*/1, sklen, ttag);
-        else
-            ret = sklen;
-
-        if (!out || ret == -1)
-            return ret;
-
-        /* Now encode this lot... */
-        /* EXPLICIT tag */
-        if (flags & ASN1_TFLG_EXPTAG)
-            ASN1_put_object(out, /*constructed=*/1, sklen, ttag, tclass);
-        /* SET or SEQUENCE and IMPLICIT tag */
-        ASN1_put_object(out, /*constructed=*/1, skcontlen, sktag, skaclass);
-        /* And the stuff itself */
-        if (!asn1_set_seq_out(sk, out, skcontlen, ASN1_ITEM_ptr(tt->item),
-                              isset)) {
-            return -1;
-        }
-        return ret;
+    // Work out inner tag value: if EXPLICIT or no tagging use underlying
+    // type.
+    if ((ttag != -1) && !(flags & ASN1_TFLG_EXPTAG)) {
+      sktag = ttag;
+      skaclass = tclass;
+    } else {
+      skaclass = V_ASN1_UNIVERSAL;
+      if (isset) {
+        sktag = V_ASN1_SET;
+      } else {
+        sktag = V_ASN1_SEQUENCE;
+      }
     }
 
+    // Determine total length of items
+    skcontlen = 0;
+    for (j = 0; j < sk_ASN1_VALUE_num(sk); j++) {
+      int tmplen;
+      skitem = sk_ASN1_VALUE_value(sk, j);
+      tmplen = ASN1_item_ex_i2d(&skitem, NULL, ASN1_ITEM_ptr(tt->item), -1, 0);
+      if (tmplen == -1 || (skcontlen > INT_MAX - tmplen)) {
+        return -1;
+      }
+      skcontlen += tmplen;
+    }
+    sklen = ASN1_object_size(/*constructed=*/1, skcontlen, sktag);
+    if (sklen == -1) {
+      return -1;
+    }
+    // If EXPLICIT need length of surrounding tag
     if (flags & ASN1_TFLG_EXPTAG) {
-        /* EXPLICIT tagging */
-        /* Find length of tagged item */
-        i = asn1_item_ex_i2d_opt(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, 0,
-                                 optional);
-        if (i <= 0)
-            return i;
-        /* Find length of EXPLICIT tag */
-        ret = ASN1_object_size(/*constructed=*/1, i, ttag);
-        if (out && ret != -1) {
-            /* Output tag and item */
-            ASN1_put_object(out, /*constructed=*/1, i, ttag, tclass);
-            if (ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item), -1,
-                                 0) < 0) {
-                return -1;
-            }
-        }
-        return ret;
+      ret = ASN1_object_size(/*constructed=*/1, sklen, ttag);
+    } else {
+      ret = sklen;
     }
 
-    /* Either normal or IMPLICIT tagging */
-    return asn1_item_ex_i2d_opt(pval, out, ASN1_ITEM_ptr(tt->item),
-                                ttag, tclass, optional);
+    if (!out || ret == -1) {
+      return ret;
+    }
 
+    // Now encode this lot...
+    // EXPLICIT tag
+    if (flags & ASN1_TFLG_EXPTAG) {
+      ASN1_put_object(out, /*constructed=*/1, sklen, ttag, tclass);
+    }
+    // SET or SEQUENCE and IMPLICIT tag
+    ASN1_put_object(out, /*constructed=*/1, skcontlen, sktag, skaclass);
+    // And the stuff itself
+    if (!asn1_set_seq_out(sk, out, skcontlen, ASN1_ITEM_ptr(tt->item), isset)) {
+      return -1;
+    }
+    return ret;
+  }
+
+  if (flags & ASN1_TFLG_EXPTAG) {
+    // EXPLICIT tagging
+    // Find length of tagged item
+    i = asn1_item_ex_i2d_opt(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, 0,
+                             optional);
+    if (i <= 0) {
+      return i;
+    }
+    // Find length of EXPLICIT tag
+    ret = ASN1_object_size(/*constructed=*/1, i, ttag);
+    if (out && ret != -1) {
+      // Output tag and item
+      ASN1_put_object(out, /*constructed=*/1, i, ttag, tclass);
+      if (ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item), -1, 0) < 0) {
+        return -1;
+      }
+    }
+    return ret;
+  }
+
+  // Either normal or IMPLICIT tagging
+  return asn1_item_ex_i2d_opt(pval, out, ASN1_ITEM_ptr(tt->item), ttag, tclass,
+                              optional);
 }
 
-/* Temporary structure used to hold DER encoding of items for SET OF */
+// Temporary structure used to hold DER encoding of items for SET OF
 
 typedef struct {
-    unsigned char *data;
-    int length;
+  unsigned char *data;
+  int length;
 } DER_ENC;
 
-static int der_cmp(const void *a, const void *b)
-{
-    const DER_ENC *d1 = a, *d2 = b;
-    int cmplen, i;
-    cmplen = (d1->length < d2->length) ? d1->length : d2->length;
-    i = OPENSSL_memcmp(d1->data, d2->data, cmplen);
-    if (i)
-        return i;
-    return d1->length - d2->length;
+static int der_cmp(const void *a, const void *b) {
+  const DER_ENC *d1 = a, *d2 = b;
+  int cmplen, i;
+  cmplen = (d1->length < d2->length) ? d1->length : d2->length;
+  i = OPENSSL_memcmp(d1->data, d2->data, cmplen);
+  if (i) {
+    return i;
+  }
+  return d1->length - d2->length;
 }
 
-/* asn1_set_seq_out writes |sk| to |out| under the i2d output convention,
- * excluding the tag and length. It returns one on success and zero on error.
- * |skcontlen| must be the total encoded size. If |do_sort| is non-zero, the
- * elements are sorted for a SET OF type. Each element of |sk| has type
- * |item|. */
+// asn1_set_seq_out writes |sk| to |out| under the i2d output convention,
+// excluding the tag and length. It returns one on success and zero on error.
+// |skcontlen| must be the total encoded size. If |do_sort| is non-zero, the
+// elements are sorted for a SET OF type. Each element of |sk| has type
+// |item|.
 static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out,
-                            int skcontlen, const ASN1_ITEM *item, int do_sort)
-{
-    /* No need to sort if there are fewer than two items. */
-    if (!do_sort || sk_ASN1_VALUE_num(sk) < 2) {
-        for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
-            ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
-            if (ASN1_item_ex_i2d(&skitem, out, item, -1, 0) < 0) {
-                return 0;
-            }
-        }
-        return 1;
-    }
-
-    if (sk_ASN1_VALUE_num(sk) > ((size_t)-1) / sizeof(DER_ENC)) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW);
+                            int skcontlen, const ASN1_ITEM *item, int do_sort) {
+  // No need to sort if there are fewer than two items.
+  if (!do_sort || sk_ASN1_VALUE_num(sk) < 2) {
+    for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
+      ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
+      if (ASN1_item_ex_i2d(&skitem, out, item, -1, 0) < 0) {
         return 0;
+      }
     }
+    return 1;
+  }
 
-    int ret = 0;
-    unsigned char *const buf = OPENSSL_malloc(skcontlen);
-    DER_ENC *encoded = OPENSSL_malloc(sk_ASN1_VALUE_num(sk) * sizeof(*encoded));
-    if (encoded == NULL || buf == NULL) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        goto err;
+  if (sk_ASN1_VALUE_num(sk) > ((size_t)-1) / sizeof(DER_ENC)) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW);
+    return 0;
+  }
+
+  int ret = 0;
+  unsigned char *const buf = OPENSSL_malloc(skcontlen);
+  DER_ENC *encoded = OPENSSL_malloc(sk_ASN1_VALUE_num(sk) * sizeof(*encoded));
+  if (encoded == NULL || buf == NULL) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+
+  // Encode all the elements into |buf| and populate |encoded|.
+  unsigned char *p = buf;
+  for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
+    ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
+    encoded[i].data = p;
+    encoded[i].length = ASN1_item_ex_i2d(&skitem, &p, item, -1, 0);
+    if (encoded[i].length < 0) {
+      goto err;
     }
+    assert(p - buf <= skcontlen);
+  }
 
-    /* Encode all the elements into |buf| and populate |encoded|. */
-    unsigned char *p = buf;
-    for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
-        ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
-        encoded[i].data = p;
-        encoded[i].length = ASN1_item_ex_i2d(&skitem, &p, item, -1, 0);
-        if (encoded[i].length < 0) {
-            goto err;
-        }
-        assert(p - buf <= skcontlen);
-    }
+  qsort(encoded, sk_ASN1_VALUE_num(sk), sizeof(*encoded), der_cmp);
 
-    qsort(encoded, sk_ASN1_VALUE_num(sk), sizeof(*encoded), der_cmp);
+  // Output the elements in sorted order.
+  p = *out;
+  for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
+    OPENSSL_memcpy(p, encoded[i].data, encoded[i].length);
+    p += encoded[i].length;
+  }
+  *out = p;
 
-    /* Output the elements in sorted order. */
-    p = *out;
-    for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
-        OPENSSL_memcpy(p, encoded[i].data, encoded[i].length);
-        p += encoded[i].length;
-    }
-    *out = p;
-
-    ret = 1;
+  ret = 1;
 
 err:
-    OPENSSL_free(encoded);
-    OPENSSL_free(buf);
-    return ret;
+  OPENSSL_free(encoded);
+  OPENSSL_free(buf);
+  return ret;
 }
 
-/* asn1_i2d_ex_primitive behaves like |ASN1_item_ex_i2d| but |item| must be a
- * a PRIMITIVE or MSTRING type that is not an |ASN1_ITEM_TEMPLATE|. */
+// asn1_i2d_ex_primitive behaves like |ASN1_item_ex_i2d| but |item| must be a
+// a PRIMITIVE or MSTRING type that is not an |ASN1_ITEM_TEMPLATE|.
 static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
                                  const ASN1_ITEM *it, int tag, int aclass,
-                                 int optional)
-{
-    /* Get length of content octets and maybe find out the underlying type. */
-    int omit;
-    int utype = it->utype;
-    int len = asn1_ex_i2c(pval, NULL, &omit, &utype, it);
-    if (len < 0) {
-        return -1;
+                                 int optional) {
+  // Get length of content octets and maybe find out the underlying type.
+  int omit;
+  int utype = it->utype;
+  int len = asn1_ex_i2c(pval, NULL, &omit, &utype, it);
+  if (len < 0) {
+    return -1;
+  }
+  if (omit) {
+    if (optional) {
+      return 0;
     }
-    if (omit) {
-        if (optional) {
-            return 0;
-        }
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
-        return -1;
-    }
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
+    return -1;
+  }
 
-    /*
-     * If SEQUENCE, SET or OTHER then header is included in pseudo content
-     * octets so don't include tag+length. We need to check here because the
-     * call to asn1_ex_i2c() could change utype.
-     */
-    int usetag = utype != V_ASN1_SEQUENCE && utype != V_ASN1_SET &&
-                 utype != V_ASN1_OTHER;
+  // If SEQUENCE, SET or OTHER then header is included in pseudo content
+  // octets so don't include tag+length. We need to check here because the
+  // call to asn1_ex_i2c() could change utype.
+  int usetag =
+      utype != V_ASN1_SEQUENCE && utype != V_ASN1_SET && utype != V_ASN1_OTHER;
 
-    /* If not implicitly tagged get tag from underlying type */
-    if (tag == -1)
-        tag = utype;
+  // If not implicitly tagged get tag from underlying type
+  if (tag == -1) {
+    tag = utype;
+  }
 
-    /* Output tag+length followed by content octets */
-    if (out) {
-        if (usetag) {
-            ASN1_put_object(out, /*constructed=*/0, len, tag, aclass);
-        }
-        int len2 = asn1_ex_i2c(pval, *out, &omit, &utype, it);
-        if (len2 < 0) {
-          return -1;
-        }
-        assert(len == len2);
-        assert(!omit);
-        *out += len;
-    }
-
+  // Output tag+length followed by content octets
+  if (out) {
     if (usetag) {
-        return ASN1_object_size(/*constructed=*/0, len, tag);
+      ASN1_put_object(out, /*constructed=*/0, len, tag, aclass);
     }
-    return len;
+    int len2 = asn1_ex_i2c(pval, *out, &omit, &utype, it);
+    if (len2 < 0) {
+      return -1;
+    }
+    assert(len == len2);
+    assert(!omit);
+    *out += len;
+  }
+
+  if (usetag) {
+    return ASN1_object_size(/*constructed=*/0, len, tag);
+  }
+  return len;
 }
 
-/* asn1_ex_i2c writes the |*pval| to |cout| under the i2d output convention,
- * excluding the tag and length. It returns the number of bytes written,
- * possibly zero, on success or -1 on error. If |*pval| should be omitted, it
- * returns zero and sets |*out_omit| to true.
- *
- * If |it| is an MSTRING or ANY type, it gets the underlying type from |*pval|,
- * which must be an |ASN1_STRING| or |ASN1_TYPE|, respectively. It then updates
- * |*putype| with the tag number of type used, or |V_ASN1_OTHER| if it was not a
- * universal type. If |*putype| is set to |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or
- * |V_ASN1_OTHER|, it additionally outputs the tag and length, so the caller
- * must not do so.
- *
- * Otherwise, |*putype| must contain |it->utype|.
- *
- * WARNING: Unlike most functions in this file, |asn1_ex_i2c| can return zero
- * without omitting the element. ASN.1 values may have empty contents. */
+// asn1_ex_i2c writes the |*pval| to |cout| under the i2d output convention,
+// excluding the tag and length. It returns the number of bytes written,
+// possibly zero, on success or -1 on error. If |*pval| should be omitted, it
+// returns zero and sets |*out_omit| to true.
+//
+// If |it| is an MSTRING or ANY type, it gets the underlying type from |*pval|,
+// which must be an |ASN1_STRING| or |ASN1_TYPE|, respectively. It then updates
+// |*putype| with the tag number of type used, or |V_ASN1_OTHER| if it was not a
+// universal type. If |*putype| is set to |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or
+// |V_ASN1_OTHER|, it additionally outputs the tag and length, so the caller
+// must not do so.
+//
+// Otherwise, |*putype| must contain |it->utype|.
+//
+// WARNING: Unlike most functions in this file, |asn1_ex_i2c| can return zero
+// without omitting the element. ASN.1 values may have empty contents.
 static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit,
-                       int *putype, const ASN1_ITEM *it)
-{
-    ASN1_BOOLEAN *tbool = NULL;
-    ASN1_STRING *strtmp;
-    ASN1_OBJECT *otmp;
-    int utype;
-    const unsigned char *cont;
-    unsigned char c;
-    int len;
+                       int *putype, const ASN1_ITEM *it) {
+  ASN1_BOOLEAN *tbool = NULL;
+  ASN1_STRING *strtmp;
+  ASN1_OBJECT *otmp;
+  int utype;
+  const unsigned char *cont;
+  unsigned char c;
+  int len;
 
-    /* Historically, |it->funcs| for primitive types contained an
-     * |ASN1_PRIMITIVE_FUNCS| table of callbacks. */
-    assert(it->funcs == NULL);
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of callbacks.
+  assert(it->funcs == NULL);
 
-    *out_omit = 0;
+  *out_omit = 0;
 
-    /* Should type be omitted? */
-    if ((it->itype != ASN1_ITYPE_PRIMITIVE)
-        || (it->utype != V_ASN1_BOOLEAN)) {
-        if (!*pval) {
-            *out_omit = 1;
-            return 0;
-        }
+  // Should type be omitted?
+  if ((it->itype != ASN1_ITYPE_PRIMITIVE) || (it->utype != V_ASN1_BOOLEAN)) {
+    if (!*pval) {
+      *out_omit = 1;
+      return 0;
     }
+  }
 
-    if (it->itype == ASN1_ITYPE_MSTRING) {
-        /* If MSTRING type set the underlying type */
-        strtmp = (ASN1_STRING *)*pval;
-        utype = strtmp->type;
-        if (utype < 0 && utype != V_ASN1_OTHER) {
-            /* MSTRINGs can have type -1 when default-constructed. */
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
-            return -1;
-        }
-        /* Negative INTEGER and ENUMERATED values use |ASN1_STRING| type values
-         * that do not match their corresponding utype values. INTEGERs cannot
-         * participate in MSTRING types, but ENUMERATEDs can.
-         *
-         * TODO(davidben): Is this a bug? Although arguably one of the MSTRING
-         * types should contain more values, rather than less. See
-         * https://crbug.com/boringssl/412. But it is not possible to fit all
-         * possible ANY values into an |ASN1_STRING|, so matching the spec here
-         * is somewhat hopeless. */
-        if (utype == V_ASN1_NEG_INTEGER) {
-            utype = V_ASN1_INTEGER;
-        } else if (utype == V_ASN1_NEG_ENUMERATED) {
-            utype = V_ASN1_ENUMERATED;
-        }
-        *putype = utype;
-    } else if (it->utype == V_ASN1_ANY) {
-        /* If ANY set type and pointer to value */
-        ASN1_TYPE *typ;
-        typ = (ASN1_TYPE *)*pval;
-        utype = typ->type;
-        if (utype < 0 && utype != V_ASN1_OTHER) {
-            /* |ASN1_TYPE|s can have type -1 when default-constructed. */
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
-            return -1;
-        }
-        *putype = utype;
-        pval = &typ->value.asn1_value;
-    } else
-        utype = *putype;
+  if (it->itype == ASN1_ITYPE_MSTRING) {
+    // If MSTRING type set the underlying type
+    strtmp = (ASN1_STRING *)*pval;
+    utype = strtmp->type;
+    if (utype < 0 && utype != V_ASN1_OTHER) {
+      // MSTRINGs can have type -1 when default-constructed.
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+      return -1;
+    }
+    // Negative INTEGER and ENUMERATED values use |ASN1_STRING| type values
+    // that do not match their corresponding utype values. INTEGERs cannot
+    // participate in MSTRING types, but ENUMERATEDs can.
+    //
+    // TODO(davidben): Is this a bug? Although arguably one of the MSTRING
+    // types should contain more values, rather than less. See
+    // https://crbug.com/boringssl/412. But it is not possible to fit all
+    // possible ANY values into an |ASN1_STRING|, so matching the spec here
+    // is somewhat hopeless.
+    if (utype == V_ASN1_NEG_INTEGER) {
+      utype = V_ASN1_INTEGER;
+    } else if (utype == V_ASN1_NEG_ENUMERATED) {
+      utype = V_ASN1_ENUMERATED;
+    }
+    *putype = utype;
+  } else if (it->utype == V_ASN1_ANY) {
+    // If ANY set type and pointer to value
+    ASN1_TYPE *typ;
+    typ = (ASN1_TYPE *)*pval;
+    utype = typ->type;
+    if (utype < 0 && utype != V_ASN1_OTHER) {
+      // |ASN1_TYPE|s can have type -1 when default-constructed.
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+      return -1;
+    }
+    *putype = utype;
+    pval = &typ->value.asn1_value;
+  } else {
+    utype = *putype;
+  }
 
-    switch (utype) {
+  switch (utype) {
     case V_ASN1_OBJECT:
-        otmp = (ASN1_OBJECT *)*pval;
-        cont = otmp->data;
-        len = otmp->length;
-        if (len == 0) {
-            /* Some |ASN1_OBJECT|s do not have OIDs and cannot be serialized. */
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
-            return -1;
-        }
-        break;
+      otmp = (ASN1_OBJECT *)*pval;
+      cont = otmp->data;
+      len = otmp->length;
+      if (len == 0) {
+        // Some |ASN1_OBJECT|s do not have OIDs and cannot be serialized.
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
+        return -1;
+      }
+      break;
 
     case V_ASN1_NULL:
-        cont = NULL;
-        len = 0;
-        break;
+      cont = NULL;
+      len = 0;
+      break;
 
     case V_ASN1_BOOLEAN:
-        tbool = (ASN1_BOOLEAN *)pval;
-        if (*tbool == -1) {
-            *out_omit = 1;
-            return 0;
+      tbool = (ASN1_BOOLEAN *)pval;
+      if (*tbool == -1) {
+        *out_omit = 1;
+        return 0;
+      }
+      if (it->utype != V_ASN1_ANY) {
+        // Default handling if value == size field then omit
+        if ((*tbool && (it->size > 0)) || (!*tbool && !it->size)) {
+          *out_omit = 1;
+          return 0;
         }
-        if (it->utype != V_ASN1_ANY) {
-            /*
-             * Default handling if value == size field then omit
-             */
-            if ((*tbool && (it->size > 0)) ||
-                (!*tbool && !it->size)) {
-                *out_omit = 1;
-                return 0;
-            }
-        }
-        c = *tbool ? 0xff : 0x00;
-        cont = &c;
-        len = 1;
-        break;
+      }
+      c = *tbool ? 0xff : 0x00;
+      cont = &c;
+      len = 1;
+      break;
 
     case V_ASN1_BIT_STRING: {
-        int ret = i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval,
-                                      cout ? &cout : NULL);
-        /* |i2c_ASN1_BIT_STRING| returns zero on error instead of -1. */
-        return ret <= 0 ? -1 : ret;
+      int ret =
+          i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval, cout ? &cout : NULL);
+      // |i2c_ASN1_BIT_STRING| returns zero on error instead of -1.
+      return ret <= 0 ? -1 : ret;
     }
 
     case V_ASN1_INTEGER:
     case V_ASN1_ENUMERATED: {
-        /* |i2c_ASN1_INTEGER| also handles ENUMERATED. */
-        int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL);
-        /* |i2c_ASN1_INTEGER| returns zero on error instead of -1. */
-        return ret <= 0 ? -1 : ret;
+      // |i2c_ASN1_INTEGER| also handles ENUMERATED.
+      int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL);
+      // |i2c_ASN1_INTEGER| returns zero on error instead of -1.
+      return ret <= 0 ? -1 : ret;
     }
 
     case V_ASN1_OCTET_STRING:
@@ -696,15 +679,15 @@
     case V_ASN1_SEQUENCE:
     case V_ASN1_SET:
     default:
-        /* All based on ASN1_STRING and handled the same */
-        strtmp = (ASN1_STRING *)*pval;
-        cont = strtmp->data;
-        len = strtmp->length;
+      // All based on ASN1_STRING and handled the same
+      strtmp = (ASN1_STRING *)*pval;
+      cont = strtmp->data;
+      len = strtmp->length;
 
-        break;
-
-    }
-    if (cout && len)
-        OPENSSL_memcpy(cout, cont, len);
-    return len;
+      break;
+  }
+  if (cout && len) {
+    OPENSSL_memcpy(cout, cont, len);
+  }
+  return len;
 }
diff --git a/src/crypto/asn1/tasn_fre.c b/src/crypto/asn1/tasn_fre.c
index b847901..3da1fa6 100644
--- a/src/crypto/asn1/tasn_fre.c
+++ b/src/crypto/asn1/tasn_fre.c
@@ -63,171 +63,179 @@
 
 #include "internal.h"
 
-/* Free up an ASN1 structure */
+// Free up an ASN1 structure
 
-void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
-{
-    asn1_item_combine_free(&val, it, 0);
+void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it) {
+  asn1_item_combine_free(&val, it, 0);
 }
 
-void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    asn1_item_combine_free(pval, it, 0);
+void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  asn1_item_combine_free(pval, it, 0);
 }
 
-void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine)
-{
-    const ASN1_TEMPLATE *tt = NULL, *seqtt;
-    const ASN1_EXTERN_FUNCS *ef;
-    int i;
-    if (!pval)
-        return;
-    if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval)
-        return;
+void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
+                            int combine) {
+  const ASN1_TEMPLATE *tt = NULL, *seqtt;
+  const ASN1_EXTERN_FUNCS *ef;
+  int i;
+  if (!pval) {
+    return;
+  }
+  if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval) {
+    return;
+  }
 
-    switch (it->itype) {
-
+  switch (it->itype) {
     case ASN1_ITYPE_PRIMITIVE:
-        if (it->templates)
-            ASN1_template_free(pval, it->templates);
-        else
-            ASN1_primitive_free(pval, it);
-        break;
+      if (it->templates) {
+        ASN1_template_free(pval, it->templates);
+      } else {
+        ASN1_primitive_free(pval, it);
+      }
+      break;
 
     case ASN1_ITYPE_MSTRING:
-        ASN1_primitive_free(pval, it);
-        break;
+      ASN1_primitive_free(pval, it);
+      break;
 
     case ASN1_ITYPE_CHOICE: {
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb) {
-            i = asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL);
-            if (i == 2)
-                return;
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb) {
+        i = asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL);
+        if (i == 2) {
+          return;
         }
-        i = asn1_get_choice_selector(pval, it);
-        if ((i >= 0) && (i < it->tcount)) {
-            ASN1_VALUE **pchval;
-            tt = it->templates + i;
-            pchval = asn1_get_field_ptr(pval, tt);
-            ASN1_template_free(pchval, tt);
-        }
-        if (asn1_cb)
-            asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
-        if (!combine) {
-            OPENSSL_free(*pval);
-            *pval = NULL;
-        }
-        break;
+      }
+      i = asn1_get_choice_selector(pval, it);
+      if ((i >= 0) && (i < it->tcount)) {
+        ASN1_VALUE **pchval;
+        tt = it->templates + i;
+        pchval = asn1_get_field_ptr(pval, tt);
+        ASN1_template_free(pchval, tt);
+      }
+      if (asn1_cb) {
+        asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
+      }
+      if (!combine) {
+        OPENSSL_free(*pval);
+        *pval = NULL;
+      }
+      break;
     }
 
     case ASN1_ITYPE_EXTERN:
-        ef = it->funcs;
-        if (ef && ef->asn1_ex_free)
-            ef->asn1_ex_free(pval, it);
-        break;
+      ef = it->funcs;
+      if (ef && ef->asn1_ex_free) {
+        ef->asn1_ex_free(pval, it);
+      }
+      break;
 
     case ASN1_ITYPE_SEQUENCE: {
-        if (!asn1_refcount_dec_and_test_zero(pval, it))
-            return;
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb) {
-            i = asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL);
-            if (i == 2)
-                return;
+      if (!asn1_refcount_dec_and_test_zero(pval, it)) {
+        return;
+      }
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb) {
+        i = asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL);
+        if (i == 2) {
+          return;
         }
-        asn1_enc_free(pval, it);
-        /*
-         * If we free up as normal we will invalidate any ANY DEFINED BY
-         * field and we wont be able to determine the type of the field it
-         * defines. So free up in reverse order.
-         */
-        tt = it->templates + it->tcount - 1;
-        for (i = 0; i < it->tcount; tt--, i++) {
-            ASN1_VALUE **pseqval;
-            seqtt = asn1_do_adb(pval, tt, 0);
-            if (!seqtt)
-                continue;
-            pseqval = asn1_get_field_ptr(pval, seqtt);
-            ASN1_template_free(pseqval, seqtt);
+      }
+      asn1_enc_free(pval, it);
+      // If we free up as normal we will invalidate any ANY DEFINED BY
+      // field and we wont be able to determine the type of the field it
+      // defines. So free up in reverse order.
+      tt = it->templates + it->tcount - 1;
+      for (i = 0; i < it->tcount; tt--, i++) {
+        ASN1_VALUE **pseqval;
+        seqtt = asn1_do_adb(pval, tt, 0);
+        if (!seqtt) {
+          continue;
         }
-        if (asn1_cb)
-            asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
-        if (!combine) {
-            OPENSSL_free(*pval);
-            *pval = NULL;
-        }
-        break;
-    }
-    }
-}
-
-void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
-{
-    size_t i;
-    if (tt->flags & ASN1_TFLG_SK_MASK) {
-        STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
-        for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
-            ASN1_VALUE *vtmp;
-            vtmp = sk_ASN1_VALUE_value(sk, i);
-            asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0);
-        }
-        sk_ASN1_VALUE_free(sk);
+        pseqval = asn1_get_field_ptr(pval, seqtt);
+        ASN1_template_free(pseqval, seqtt);
+      }
+      if (asn1_cb) {
+        asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
+      }
+      if (!combine) {
+        OPENSSL_free(*pval);
         *pval = NULL;
-    } else
-        asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item),
-                               tt->flags & ASN1_TFLG_COMBINE);
+      }
+      break;
+    }
+  }
 }
 
-void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    int utype;
-    /* Historically, |it->funcs| for primitive types contained an
-     * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
-    assert(it == NULL || it->funcs == NULL);
-    /* Special case: if 'it' is NULL free contents of ASN1_TYPE */
-    if (!it) {
-        ASN1_TYPE *typ = (ASN1_TYPE *)*pval;
-        utype = typ->type;
-        pval = &typ->value.asn1_value;
-        if (utype != V_ASN1_BOOLEAN && !*pval)
-            return;
-    } else if (it->itype == ASN1_ITYPE_MSTRING) {
-        utype = -1;
-        if (!*pval)
-            return;
-    } else {
-        utype = it->utype;
-        if ((utype != V_ASN1_BOOLEAN) && !*pval)
-            return;
+void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
+  size_t i;
+  if (tt->flags & ASN1_TFLG_SK_MASK) {
+    STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
+    for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
+      ASN1_VALUE *vtmp;
+      vtmp = sk_ASN1_VALUE_value(sk, i);
+      asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0);
     }
+    sk_ASN1_VALUE_free(sk);
+    *pval = NULL;
+  } else {
+    asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item),
+                           tt->flags & ASN1_TFLG_COMBINE);
+  }
+}
 
-    switch (utype) {
+void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  int utype;
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
+  assert(it == NULL || it->funcs == NULL);
+  // Special case: if 'it' is NULL free contents of ASN1_TYPE
+  if (!it) {
+    ASN1_TYPE *typ = (ASN1_TYPE *)*pval;
+    utype = typ->type;
+    pval = &typ->value.asn1_value;
+    if (utype != V_ASN1_BOOLEAN && !*pval) {
+      return;
+    }
+  } else if (it->itype == ASN1_ITYPE_MSTRING) {
+    utype = -1;
+    if (!*pval) {
+      return;
+    }
+  } else {
+    utype = it->utype;
+    if ((utype != V_ASN1_BOOLEAN) && !*pval) {
+      return;
+    }
+  }
+
+  switch (utype) {
     case V_ASN1_OBJECT:
-        ASN1_OBJECT_free((ASN1_OBJECT *)*pval);
-        break;
+      ASN1_OBJECT_free((ASN1_OBJECT *)*pval);
+      break;
 
     case V_ASN1_BOOLEAN:
-        if (it)
-            *(ASN1_BOOLEAN *)pval = it->size;
-        else
-            *(ASN1_BOOLEAN *)pval = -1;
-        return;
+      if (it) {
+        *(ASN1_BOOLEAN *)pval = it->size;
+      } else {
+        *(ASN1_BOOLEAN *)pval = -1;
+      }
+      return;
 
     case V_ASN1_NULL:
-        break;
+      break;
 
     case V_ASN1_ANY:
-        ASN1_primitive_free(pval, NULL);
-        OPENSSL_free(*pval);
-        break;
+      ASN1_primitive_free(pval, NULL);
+      OPENSSL_free(*pval);
+      break;
 
     default:
-        ASN1_STRING_free((ASN1_STRING *)*pval);
-        *pval = NULL;
-        break;
-    }
-    *pval = NULL;
+      ASN1_STRING_free((ASN1_STRING *)*pval);
+      *pval = NULL;
+      break;
+  }
+  *pval = NULL;
 }
diff --git a/src/crypto/asn1/tasn_new.c b/src/crypto/asn1/tasn_new.c
index eea219d..97411c5 100644
--- a/src/crypto/asn1/tasn_new.c
+++ b/src/crypto/asn1/tasn_new.c
@@ -63,8 +63,8 @@
 #include <openssl/mem.h>
 #include <openssl/obj.h>
 
-#include "internal.h"
 #include "../internal.h"
+#include "internal.h"
 
 
 static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
@@ -75,258 +75,266 @@
 static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
 static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
-ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
-{
-    ASN1_VALUE *ret = NULL;
-    if (ASN1_item_ex_new(&ret, it) > 0)
-        return ret;
-    return NULL;
+ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it) {
+  ASN1_VALUE *ret = NULL;
+  if (ASN1_item_ex_new(&ret, it) > 0) {
+    return ret;
+  }
+  return NULL;
 }
 
-/* Allocate an ASN1 structure */
+// Allocate an ASN1 structure
 
-int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    return asn1_item_ex_combine_new(pval, it, 0);
+int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  return asn1_item_ex_combine_new(pval, it, 0);
 }
 
 static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
-                                    int combine)
-{
-    const ASN1_TEMPLATE *tt = NULL;
-    const ASN1_EXTERN_FUNCS *ef;
-    ASN1_VALUE **pseqval;
-    int i;
+                                    int combine) {
+  const ASN1_TEMPLATE *tt = NULL;
+  const ASN1_EXTERN_FUNCS *ef;
+  ASN1_VALUE **pseqval;
+  int i;
 
-    switch (it->itype) {
-
+  switch (it->itype) {
     case ASN1_ITYPE_EXTERN:
-        ef = it->funcs;
-        if (ef && ef->asn1_ex_new) {
-            if (!ef->asn1_ex_new(pval, it))
-                goto memerr;
+      ef = it->funcs;
+      if (ef && ef->asn1_ex_new) {
+        if (!ef->asn1_ex_new(pval, it)) {
+          goto memerr;
         }
-        break;
+      }
+      break;
 
     case ASN1_ITYPE_PRIMITIVE:
-        if (it->templates) {
-            if (!ASN1_template_new(pval, it->templates))
-                goto memerr;
-        } else if (!ASN1_primitive_new(pval, it))
-            goto memerr;
-        break;
+      if (it->templates) {
+        if (!ASN1_template_new(pval, it->templates)) {
+          goto memerr;
+        }
+      } else if (!ASN1_primitive_new(pval, it)) {
+        goto memerr;
+      }
+      break;
 
     case ASN1_ITYPE_MSTRING:
-        if (!ASN1_primitive_new(pval, it))
-            goto memerr;
-        break;
+      if (!ASN1_primitive_new(pval, it)) {
+        goto memerr;
+      }
+      break;
 
     case ASN1_ITYPE_CHOICE: {
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb) {
-            i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
-            if (!i)
-                goto auxerr;
-            if (i == 2) {
-                return 1;
-            }
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb) {
+        i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
+        if (!i) {
+          goto auxerr;
         }
-        if (!combine) {
-            *pval = OPENSSL_malloc(it->size);
-            if (!*pval)
-                goto memerr;
-            OPENSSL_memset(*pval, 0, it->size);
+        if (i == 2) {
+          return 1;
         }
-        asn1_set_choice_selector(pval, -1, it);
-        if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
-            goto auxerr2;
-        break;
+      }
+      if (!combine) {
+        *pval = OPENSSL_malloc(it->size);
+        if (!*pval) {
+          goto memerr;
+        }
+        OPENSSL_memset(*pval, 0, it->size);
+      }
+      asn1_set_choice_selector(pval, -1, it);
+      if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) {
+        goto auxerr2;
+      }
+      break;
     }
 
     case ASN1_ITYPE_SEQUENCE: {
-        const ASN1_AUX *aux = it->funcs;
-        ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
-        if (asn1_cb) {
-            i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
-            if (!i)
-                goto auxerr;
-            if (i == 2) {
-                return 1;
-            }
+      const ASN1_AUX *aux = it->funcs;
+      ASN1_aux_cb *asn1_cb = aux != NULL ? aux->asn1_cb : NULL;
+      if (asn1_cb) {
+        i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
+        if (!i) {
+          goto auxerr;
         }
-        if (!combine) {
-            *pval = OPENSSL_malloc(it->size);
-            if (!*pval)
-                goto memerr;
-            OPENSSL_memset(*pval, 0, it->size);
-            asn1_refcount_set_one(pval, it);
-            asn1_enc_init(pval, it);
+        if (i == 2) {
+          return 1;
         }
-        for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
-            pseqval = asn1_get_field_ptr(pval, tt);
-            if (!ASN1_template_new(pseqval, tt))
-                goto memerr2;
+      }
+      if (!combine) {
+        *pval = OPENSSL_malloc(it->size);
+        if (!*pval) {
+          goto memerr;
         }
-        if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
-            goto auxerr2;
-        break;
+        OPENSSL_memset(*pval, 0, it->size);
+        asn1_refcount_set_one(pval, it);
+        asn1_enc_init(pval, it);
+      }
+      for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
+        pseqval = asn1_get_field_ptr(pval, tt);
+        if (!ASN1_template_new(pseqval, tt)) {
+          goto memerr2;
+        }
+      }
+      if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) {
+        goto auxerr2;
+      }
+      break;
     }
-    }
-    return 1;
+  }
+  return 1;
 
- memerr2:
-    asn1_item_combine_free(pval, it, combine);
- memerr:
-    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-    return 0;
+memerr2:
+  asn1_item_combine_free(pval, it, combine);
+memerr:
+  OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+  return 0;
 
- auxerr2:
-    asn1_item_combine_free(pval, it, combine);
- auxerr:
-    OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
-    return 0;
-
+auxerr2:
+  asn1_item_combine_free(pval, it, combine);
+auxerr:
+  OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
+  return 0;
 }
 
-static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    const ASN1_EXTERN_FUNCS *ef;
+static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  const ASN1_EXTERN_FUNCS *ef;
 
-    switch (it->itype) {
-
+  switch (it->itype) {
     case ASN1_ITYPE_EXTERN:
-        ef = it->funcs;
-        if (ef && ef->asn1_ex_clear)
-            ef->asn1_ex_clear(pval, it);
-        else
-            *pval = NULL;
-        break;
+      ef = it->funcs;
+      if (ef && ef->asn1_ex_clear) {
+        ef->asn1_ex_clear(pval, it);
+      } else {
+        *pval = NULL;
+      }
+      break;
 
     case ASN1_ITYPE_PRIMITIVE:
-        if (it->templates)
-            asn1_template_clear(pval, it->templates);
-        else
-            asn1_primitive_clear(pval, it);
-        break;
+      if (it->templates) {
+        asn1_template_clear(pval, it->templates);
+      } else {
+        asn1_primitive_clear(pval, it);
+      }
+      break;
 
     case ASN1_ITYPE_MSTRING:
-        asn1_primitive_clear(pval, it);
-        break;
+      asn1_primitive_clear(pval, it);
+      break;
 
     case ASN1_ITYPE_CHOICE:
     case ASN1_ITYPE_SEQUENCE:
-        *pval = NULL;
-        break;
-    }
+      *pval = NULL;
+      break;
+  }
 }
 
-static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
-{
-    const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item);
-    int ret;
-    if (tt->flags & ASN1_TFLG_OPTIONAL) {
-        asn1_template_clear(pval, tt);
-        return 1;
-    }
-    /* If ANY DEFINED BY nothing to do */
+static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
+  const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item);
+  int ret;
+  if (tt->flags & ASN1_TFLG_OPTIONAL) {
+    asn1_template_clear(pval, tt);
+    return 1;
+  }
+  // If ANY DEFINED BY nothing to do
 
-    if (tt->flags & ASN1_TFLG_ADB_MASK) {
-        *pval = NULL;
-        return 1;
+  if (tt->flags & ASN1_TFLG_ADB_MASK) {
+    *pval = NULL;
+    return 1;
+  }
+  // If SET OF or SEQUENCE OF, its a STACK
+  if (tt->flags & ASN1_TFLG_SK_MASK) {
+    STACK_OF(ASN1_VALUE) *skval;
+    skval = sk_ASN1_VALUE_new_null();
+    if (!skval) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      ret = 0;
+      goto done;
     }
-    /* If SET OF or SEQUENCE OF, its a STACK */
-    if (tt->flags & ASN1_TFLG_SK_MASK) {
-        STACK_OF(ASN1_VALUE) *skval;
-        skval = sk_ASN1_VALUE_new_null();
-        if (!skval) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            ret = 0;
-            goto done;
-        }
-        *pval = (ASN1_VALUE *)skval;
-        ret = 1;
-        goto done;
-    }
-    /* Otherwise pass it back to the item routine */
-    ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
- done:
-    return ret;
+    *pval = (ASN1_VALUE *)skval;
+    ret = 1;
+    goto done;
+  }
+  // Otherwise pass it back to the item routine
+  ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
+done:
+  return ret;
 }
 
-static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
-{
-    /* If ADB or STACK just NULL the field */
-    if (tt->flags & (ASN1_TFLG_ADB_MASK | ASN1_TFLG_SK_MASK))
-        *pval = NULL;
-    else
-        asn1_item_clear(pval, ASN1_ITEM_ptr(tt->item));
+static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
+  // If ADB or STACK just NULL the field
+  if (tt->flags & (ASN1_TFLG_ADB_MASK | ASN1_TFLG_SK_MASK)) {
+    *pval = NULL;
+  } else {
+    asn1_item_clear(pval, ASN1_ITEM_ptr(tt->item));
+  }
 }
 
-/*
- * NB: could probably combine most of the real XXX_new() behaviour and junk
- * all the old functions.
- */
+// NB: could probably combine most of the real XXX_new() behaviour and junk
+// all the old functions.
 
-static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    ASN1_TYPE *typ;
-    int utype;
+static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  ASN1_TYPE *typ;
+  int utype;
 
-    if (!it)
-        return 0;
+  if (!it) {
+    return 0;
+  }
 
-    /* Historically, |it->funcs| for primitive types contained an
-     * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
-    assert(it->funcs == NULL);
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
+  assert(it->funcs == NULL);
 
-    if (it->itype == ASN1_ITYPE_MSTRING)
-        utype = -1;
-    else
-        utype = it->utype;
-    switch (utype) {
+  if (it->itype == ASN1_ITYPE_MSTRING) {
+    utype = -1;
+  } else {
+    utype = it->utype;
+  }
+  switch (utype) {
     case V_ASN1_OBJECT:
-        *pval = (ASN1_VALUE *)OBJ_nid2obj(NID_undef);
-        return 1;
+      *pval = (ASN1_VALUE *)OBJ_nid2obj(NID_undef);
+      return 1;
 
     case V_ASN1_BOOLEAN:
-        *(ASN1_BOOLEAN *)pval = it->size;
-        return 1;
+      *(ASN1_BOOLEAN *)pval = it->size;
+      return 1;
 
     case V_ASN1_NULL:
-        *pval = (ASN1_VALUE *)1;
-        return 1;
+      *pval = (ASN1_VALUE *)1;
+      return 1;
 
     case V_ASN1_ANY:
-        typ = OPENSSL_malloc(sizeof(ASN1_TYPE));
-        if (!typ)
-            return 0;
-        typ->value.ptr = NULL;
-        typ->type = -1;
-        *pval = (ASN1_VALUE *)typ;
-        break;
+      typ = OPENSSL_malloc(sizeof(ASN1_TYPE));
+      if (!typ) {
+        return 0;
+      }
+      typ->value.ptr = NULL;
+      typ->type = -1;
+      *pval = (ASN1_VALUE *)typ;
+      break;
 
     default:
-        *pval = (ASN1_VALUE *)ASN1_STRING_type_new(utype);
-        break;
-    }
-    if (*pval)
-        return 1;
-    return 0;
+      *pval = (ASN1_VALUE *)ASN1_STRING_type_new(utype);
+      break;
+  }
+  if (*pval) {
+    return 1;
+  }
+  return 0;
 }
 
-static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    int utype;
-    /* Historically, |it->funcs| for primitive types contained an
-     * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
-    assert(it == NULL || it->funcs == NULL);
-    if (!it || (it->itype == ASN1_ITYPE_MSTRING))
-        utype = -1;
-    else
-        utype = it->utype;
-    if (utype == V_ASN1_BOOLEAN)
-        *(ASN1_BOOLEAN *)pval = it->size;
-    else
-        *pval = NULL;
+static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  int utype;
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
+  assert(it == NULL || it->funcs == NULL);
+  if (!it || (it->itype == ASN1_ITYPE_MSTRING)) {
+    utype = -1;
+  } else {
+    utype = it->utype;
+  }
+  if (utype == V_ASN1_BOOLEAN) {
+    *(ASN1_BOOLEAN *)pval = it->size;
+  } else {
+    *pval = NULL;
+  }
 }
diff --git a/src/crypto/asn1/tasn_typ.c b/src/crypto/asn1/tasn_typ.c
index 5cfdd57..abfac93 100644
--- a/src/crypto/asn1/tasn_typ.c
+++ b/src/crypto/asn1/tasn_typ.c
@@ -58,19 +58,13 @@
 
 #include <openssl/asn1t.h>
 
-/* Declarations for string types */
+// Declarations for string types
 
-#define IMPLEMENT_ASN1_STRING_FUNCTIONS(sname) \
-        IMPLEMENT_ASN1_TYPE(sname) \
-        IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(sname, sname, sname) \
-        sname *sname##_new(void) \
-        { \
-                return ASN1_STRING_type_new(V_##sname); \
-        } \
-        void sname##_free(sname *x) \
-        { \
-                ASN1_STRING_free(x); \
-        }
+#define IMPLEMENT_ASN1_STRING_FUNCTIONS(sname)                         \
+  IMPLEMENT_ASN1_TYPE(sname)                                           \
+  IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(sname, sname, sname)     \
+  sname *sname##_new(void) { return ASN1_STRING_type_new(V_##sname); } \
+  void sname##_free(sname *x) { ASN1_STRING_free(x); }
 
 IMPLEMENT_ASN1_STRING_FUNCTIONS(ASN1_OCTET_STRING)
 IMPLEMENT_ASN1_STRING_FUNCTIONS(ASN1_INTEGER)
@@ -94,12 +88,12 @@
 
 IMPLEMENT_ASN1_TYPE(ASN1_ANY)
 
-/* Just swallow an ASN1_SEQUENCE in an ASN1_STRING */
+// Just swallow an ASN1_SEQUENCE in an ASN1_STRING
 IMPLEMENT_ASN1_TYPE(ASN1_SEQUENCE)
 
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE)
 
-/* Multistring types */
+// Multistring types
 
 IMPLEMENT_ASN1_MSTRING(ASN1_PRINTABLE, B_ASN1_PRINTABLE)
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, ASN1_PRINTABLE,
@@ -112,20 +106,21 @@
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, DIRECTORYSTRING,
                                      DIRECTORYSTRING)
 
-/* Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE */
+// Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE
 IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, -1)
 IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, 1)
 IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, 0)
 
-/* Special, OCTET STRING with indefinite length constructed support */
-
 ASN1_ITEM_TEMPLATE(ASN1_SEQUENCE_ANY) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, ASN1_SEQUENCE_ANY, ASN1_ANY)
+    ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, ASN1_SEQUENCE_ANY, ASN1_ANY)
 ASN1_ITEM_TEMPLATE_END(ASN1_SEQUENCE_ANY)
 
-ASN1_ITEM_TEMPLATE(ASN1_SET_ANY) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0, ASN1_SET_ANY, ASN1_ANY)
+ASN1_ITEM_TEMPLATE(ASN1_SET_ANY) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0,
+                                                         ASN1_SET_ANY, ASN1_ANY)
 ASN1_ITEM_TEMPLATE_END(ASN1_SET_ANY)
 
-IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY)
-IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(ASN1_SEQUENCE_ANY, ASN1_SET_ANY, ASN1_SET_ANY)
+IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(ASN1_SEQUENCE_ANY,
+                                            ASN1_SEQUENCE_ANY,
+                                            ASN1_SEQUENCE_ANY)
+IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(ASN1_SEQUENCE_ANY, ASN1_SET_ANY,
+                                            ASN1_SET_ANY)
diff --git a/src/crypto/asn1/tasn_utl.c b/src/crypto/asn1/tasn_utl.c
index 9b1da0b..4a97574 100644
--- a/src/crypto/asn1/tasn_utl.c
+++ b/src/crypto/asn1/tasn_utl.c
@@ -60,27 +60,27 @@
 #include <string.h>
 
 #include <openssl/asn1t.h>
+#include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/obj.h>
-#include <openssl/err.h>
 #include <openssl/thread.h>
 
 #include "../internal.h"
 #include "internal.h"
 
 
-/* Utility functions for manipulating fields and offsets */
+// Utility functions for manipulating fields and offsets
 
-/* Add 'offset' to 'addr' */
+// Add 'offset' to 'addr'
 #define offset2ptr(addr, offset) (void *)(((char *)(addr)) + (offset))
 
-/* Given an ASN1_ITEM CHOICE type return the selector value */
+// Given an ASN1_ITEM CHOICE type return the selector value
 int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   int *sel = offset2ptr(*pval, it->utype);
   return *sel;
 }
 
-/* Given an ASN1_ITEM CHOICE type set the selector value, return old value. */
+// Given an ASN1_ITEM CHOICE type set the selector value, return old value.
 int asn1_set_choice_selector(ASN1_VALUE **pval, int value,
                              const ASN1_ITEM *it) {
   int *sel, ret;
@@ -146,7 +146,7 @@
   ASN1_ENCODING *enc;
   enc = asn1_get_enc_ptr(pval, it);
   if (enc) {
-    if (enc->enc && !enc->alias_only) {
+    if (!enc->alias_only) {
       OPENSSL_free(enc->enc);
     }
     enc->enc = NULL;
@@ -173,7 +173,7 @@
   enc->alias_only_on_next_parse = 0;
 
   if (enc->alias_only) {
-    enc->enc = (uint8_t *) in;
+    enc->enc = (uint8_t *)in;
   } else {
     enc->enc = OPENSSL_malloc(inlen);
     if (!enc->enc) {
@@ -205,38 +205,37 @@
   return 1;
 }
 
-/* Given an ASN1_TEMPLATE get a pointer to a field */
+// Given an ASN1_TEMPLATE get a pointer to a field
 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
   ASN1_VALUE **pvaltmp;
   if (tt->flags & ASN1_TFLG_COMBINE) {
     return pval;
   }
   pvaltmp = offset2ptr(*pval, tt->offset);
-  /* NOTE for BOOLEAN types the field is just a plain int so we can't return
-   * int **, so settle for (int *). */
+  // NOTE for BOOLEAN types the field is just a plain int so we can't return
+  // int **, so settle for (int *).
   return pvaltmp;
 }
 
-/* Handle ANY DEFINED BY template, find the selector, look up the relevant
- * ASN1_TEMPLATE in the table and return it. */
+// Handle ANY DEFINED BY template, find the selector, look up the relevant
+// ASN1_TEMPLATE in the table and return it.
 const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,
                                  int nullerr) {
   const ASN1_ADB *adb;
   const ASN1_ADB_TABLE *atbl;
-  long selector;
   ASN1_VALUE **sfld;
   int i;
   if (!(tt->flags & ASN1_TFLG_ADB_MASK)) {
     return tt;
   }
 
-  /* Else ANY DEFINED BY ... get the table */
+  // Else ANY DEFINED BY ... get the table
   adb = ASN1_ADB_ptr(tt->item);
 
-  /* Get the selector field */
+  // Get the selector field
   sfld = offset2ptr(*pval, adb->offset);
 
-  /* Check if NULL */
+  // Check if NULL
   if (*sfld == NULL) {
     if (!adb->null_tt) {
       goto err;
@@ -244,19 +243,16 @@
     return adb->null_tt;
   }
 
-  /* Convert type to a long:
-   * NB: don't check for NID_undef here because it
-   * might be a legitimate value in the table */
-  if (tt->flags & ASN1_TFLG_ADB_OID) {
-    selector = OBJ_obj2nid((ASN1_OBJECT *)*sfld);
-  } else {
-    selector = ASN1_INTEGER_get((ASN1_INTEGER *)*sfld);
-  }
+  // Convert type to a NID:
+  // NB: don't check for NID_undef here because it
+  // might be a legitimate value in the table
+  assert(tt->flags & ASN1_TFLG_ADB_OID);
+  int selector = OBJ_obj2nid((ASN1_OBJECT *)*sfld);
 
-  /* Try to find matching entry in table Maybe should check application types
-   * first to allow application override? Might also be useful to have a flag
-   * which indicates table is sorted and we can do a binary search. For now
-   * stick to a linear search. */
+  // Try to find matching entry in table Maybe should check application types
+  // first to allow application override? Might also be useful to have a flag
+  // which indicates table is sorted and we can do a binary search. For now
+  // stick to a linear search.
 
   for (atbl = adb->tbl, i = 0; i < adb->tblcount; i++, atbl++) {
     if (atbl->value == selector) {
@@ -264,16 +260,16 @@
     }
   }
 
-  /* FIXME: need to search application table too */
+  // FIXME: need to search application table too
 
-  /* No match, return default type */
+  // No match, return default type
   if (!adb->default_tt) {
     goto err;
   }
   return adb->default_tt;
 
 err:
-  /* FIXME: should log the value or OID of unsupported type */
+  // FIXME: should log the value or OID of unsupported type
   if (nullerr) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE);
   }
diff --git a/src/crypto/asn1/time_support.c b/src/crypto/asn1/time_support.c
deleted file mode 100644
index e748ad7..0000000
--- a/src/crypto/asn1/time_support.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
- * project 2001.
- * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
- * project 2008.
- */
-/* ====================================================================
- * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com). */
-
-#if !defined(_POSIX_C_SOURCE)
-#define _POSIX_C_SOURCE 201410L  /* for gmtime_r */
-#endif
-
-#include "internal.h"
-
-#include <time.h>
-
-
-#define SECS_PER_DAY (24 * 60 * 60)
-
-struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result) {
-#if defined(OPENSSL_WINDOWS)
-  if (gmtime_s(result, time)) {
-    return NULL;
-  }
-  return result;
-#else
-  return gmtime_r(time, result);
-#endif
-}
-
-/* Convert date to and from julian day Uses Fliegel & Van Flandern algorithm */
-static long date_to_julian(int y, int m, int d) {
-  return (1461 * (y + 4800 + (m - 14) / 12)) / 4 +
-         (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 -
-         (3 * ((y + 4900 + (m - 14) / 12) / 100)) / 4 + d - 32075;
-}
-
-static void julian_to_date(long jd, int *y, int *m, int *d) {
-  long L = jd + 68569;
-  long n = (4 * L) / 146097;
-  long i, j;
-
-  L = L - (146097 * n + 3) / 4;
-  i = (4000 * (L + 1)) / 1461001;
-  L = L - (1461 * i) / 4 + 31;
-  j = (80 * L) / 2447;
-  *d = L - (2447 * j) / 80;
-  L = j / 11;
-  *m = j + 2 - (12 * L);
-  *y = 100 * (n - 49) + i + L;
-}
-
-/* Convert tm structure and offset into julian day and seconds */
-static int julian_adj(const struct tm *tm, int off_day, long offset_sec,
-                      long *pday, int *psec) {
-  int offset_hms, offset_day;
-  long time_jd;
-  int time_year, time_month, time_day;
-  /* split offset into days and day seconds */
-  offset_day = offset_sec / SECS_PER_DAY;
-  /* Avoid sign issues with % operator */
-  offset_hms = offset_sec - (offset_day * SECS_PER_DAY);
-  offset_day += off_day;
-  /* Add current time seconds to offset */
-  offset_hms += tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec;
-  /* Adjust day seconds if overflow */
-  if (offset_hms >= SECS_PER_DAY) {
-    offset_day++;
-    offset_hms -= SECS_PER_DAY;
-  } else if (offset_hms < 0) {
-    offset_day--;
-    offset_hms += SECS_PER_DAY;
-  }
-
-  /* Convert date of time structure into a Julian day number. */
-
-  time_year = tm->tm_year + 1900;
-  time_month = tm->tm_mon + 1;
-  time_day = tm->tm_mday;
-
-  time_jd = date_to_julian(time_year, time_month, time_day);
-
-  /* Work out Julian day of new date */
-  time_jd += offset_day;
-
-  if (time_jd < 0) {
-    return 0;
-  }
-
-  *pday = time_jd;
-  *psec = offset_hms;
-  return 1;
-}
-
-int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) {
-  int time_sec, time_year, time_month, time_day;
-  long time_jd;
-
-  /* Convert time and offset into julian day and seconds */
-  if (!julian_adj(tm, off_day, offset_sec, &time_jd, &time_sec)) {
-    return 0;
-  }
-
-  /* Convert Julian day back to date */
-
-  julian_to_date(time_jd, &time_year, &time_month, &time_day);
-
-  if (time_year < 1900 || time_year > 9999) {
-    return 0;
-  }
-
-  /* Update tm structure */
-
-  tm->tm_year = time_year - 1900;
-  tm->tm_mon = time_month - 1;
-  tm->tm_mday = time_day;
-
-  tm->tm_hour = time_sec / 3600;
-  tm->tm_min = (time_sec / 60) % 60;
-  tm->tm_sec = time_sec % 60;
-
-  return 1;
-}
-
-int OPENSSL_gmtime_diff(int *out_days, int *out_secs, const struct tm *from,
-                        const struct tm *to) {
-  int from_sec, to_sec, diff_sec;
-  long from_jd, to_jd, diff_day;
-
-  if (!julian_adj(from, 0, 0, &from_jd, &from_sec)) {
-    return 0;
-  }
-  if (!julian_adj(to, 0, 0, &to_jd, &to_sec)) {
-    return 0;
-  }
-
-  diff_day = to_jd - from_jd;
-  diff_sec = to_sec - from_sec;
-  /* Adjust differences so both positive or both negative */
-  if (diff_day > 0 && diff_sec < 0) {
-    diff_day--;
-    diff_sec += SECS_PER_DAY;
-  }
-  if (diff_day < 0 && diff_sec > 0) {
-    diff_day++;
-    diff_sec -= SECS_PER_DAY;
-  }
-
-  if (out_days) {
-    *out_days = (int)diff_day;
-  }
-  if (out_secs) {
-    *out_secs = diff_sec;
-  }
-
-  return 1;
-}
diff --git a/src/crypto/base64/base64.c b/src/crypto/base64/base64.c
index 6ce6007..d2b1e58 100644
--- a/src/crypto/base64/base64.c
+++ b/src/crypto/base64/base64.c
@@ -60,8 +60,6 @@
 #include <limits.h>
 #include <string.h>
 
-#include <openssl/type_check.h>
-
 #include "../internal.h"
 
 
@@ -98,8 +96,8 @@
   return ret;
 }
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0,
-                      "data length must be a multiple of base64 chunk size");
+static_assert(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0,
+              "data length must be a multiple of base64 chunk size");
 
 int EVP_EncodedLength(size_t *out_len, size_t len) {
   if (len + 2 < len) {
diff --git a/src/crypto/bio/connect.c b/src/crypto/bio/connect.c
index 3b65acf..9b86e51 100644
--- a/src/crypto/bio/connect.c
+++ b/src/crypto/bio/connect.c
@@ -117,7 +117,8 @@
 // split_host_and_port sets |*out_host| and |*out_port| to the host and port
 // parsed from |name|. It returns one on success or zero on error. Even when
 // successful, |*out_port| may be NULL on return if no port was specified.
-static int split_host_and_port(char **out_host, char **out_port, const char *name) {
+static int split_host_and_port(char **out_host, char **out_port,
+                               const char *name) {
   const char *host, *port = NULL;
   size_t host_len = 0;
 
@@ -466,8 +467,7 @@
     case BIO_CTRL_FLUSH:
       break;
     case BIO_CTRL_GET_CALLBACK: {
-      int (**fptr)(const BIO *bio, int state, int xret);
-      fptr = (int (**)(const BIO *bio, int state, int xret))ptr;
+      int (**fptr)(const BIO *bio, int state, int xret) = ptr;
       *fptr = data->info_callback;
     } break;
     default:
@@ -485,7 +485,13 @@
 
   switch (cmd) {
     case BIO_CTRL_SET_CALLBACK:
+      // This is the actual type signature of |fp|. The caller is expected to
+      // cast it to |bio_info_cb| due to the |BIO_callback_ctrl| calling
+      // convention.
+      OPENSSL_MSVC_PRAGMA(warning(push))
+      OPENSSL_MSVC_PRAGMA(warning(disable : 4191))
       data->info_callback = (int (*)(const struct bio_st *, int, int))fp;
+      OPENSSL_MSVC_PRAGMA(warning(pop))
       break;
     default:
       ret = 0;
diff --git a/src/crypto/bio/file.c b/src/crypto/bio/file.c
index 835d661..66278e5 100644
--- a/src/crypto/bio/file.c
+++ b/src/crypto/bio/file.c
@@ -308,4 +308,10 @@
                   BIO_CLOSE | BIO_FP_READ | BIO_FP_WRITE, (char *)filename);
 }
 
+long BIO_tell(BIO *bio) { return BIO_ctrl(bio, BIO_C_FILE_TELL, 0, NULL); }
+
+long BIO_seek(BIO *bio, long offset) {
+  return BIO_ctrl(bio, BIO_C_FILE_SEEK, offset, NULL);
+}
+
 #endif  // OPENSSL_TRUSTY
diff --git a/src/crypto/bio/printf.c b/src/crypto/bio/printf.c
index 4f9d8a1..253546b 100644
--- a/src/crypto/bio/printf.c
+++ b/src/crypto/bio/printf.c
@@ -71,18 +71,6 @@
   va_start(args, format);
   out_len = vsnprintf(buf, sizeof(buf), format, args);
   va_end(args);
-
-#if defined(OPENSSL_WINDOWS)
-  // On Windows, vsnprintf returns -1 rather than the requested length on
-  // truncation
-  if (out_len < 0) {
-    va_start(args, format);
-    out_len = _vscprintf(format, args);
-    va_end(args);
-    assert(out_len >= (int)sizeof(buf));
-  }
-#endif
-
   if (out_len < 0) {
     return -1;
   }
diff --git a/src/crypto/bio/socket_helper.c b/src/crypto/bio/socket_helper.c
index fc751fd..4cd7825 100644
--- a/src/crypto/bio/socket_helper.c
+++ b/src/crypto/bio/socket_helper.c
@@ -12,8 +12,10 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
+#if defined(__linux__)
 #undef _POSIX_C_SOURCE
 #define _POSIX_C_SOURCE 200112L
+#endif
 
 #include <openssl/bio.h>
 #include <openssl/err.h>
diff --git a/src/crypto/blake2/blake2.c b/src/crypto/blake2/blake2.c
index 096d61d..5c6b17e 100644
--- a/src/crypto/blake2/blake2.c
+++ b/src/crypto/blake2/blake2.c
@@ -14,7 +14,7 @@
 
 #include <openssl/blake2.h>
 
-#include <openssl/type_check.h>
+#include <assert.h>
 
 #include "../internal.h"
 
@@ -61,7 +61,7 @@
     size_t num_bytes, int is_final_block) {
   // https://tools.ietf.org/html/rfc7693#section-3.2
   uint64_t v[16];
-  OPENSSL_STATIC_ASSERT(sizeof(v) == sizeof(b2b->h) + sizeof(kIV), "");
+  static_assert(sizeof(v) == sizeof(b2b->h) + sizeof(kIV), "");
   OPENSSL_memcpy(v, b2b->h, sizeof(b2b->h));
   OPENSSL_memcpy(&v[8], kIV, sizeof(kIV));
 
@@ -97,7 +97,7 @@
 void BLAKE2B256_Init(BLAKE2B_CTX *b2b) {
   OPENSSL_memset(b2b, 0, sizeof(BLAKE2B_CTX));
 
-  OPENSSL_STATIC_ASSERT(sizeof(kIV) == sizeof(b2b->h), "");
+  static_assert(sizeof(kIV) == sizeof(b2b->h), "");
   OPENSSL_memcpy(&b2b->h, kIV, sizeof(kIV));
 
   // https://tools.ietf.org/html/rfc7693#section-2.5
@@ -143,7 +143,7 @@
                  sizeof(b2b->block.bytes) - b2b->block_used);
   blake2b_transform(b2b, b2b->block.words, b2b->block_used,
                     /*is_final_block=*/1);
-  OPENSSL_STATIC_ASSERT(BLAKE2B256_DIGEST_LENGTH <= sizeof(b2b->h), "");
+  static_assert(BLAKE2B256_DIGEST_LENGTH <= sizeof(b2b->h), "");
   memcpy(out, b2b->h, BLAKE2B256_DIGEST_LENGTH);
 }
 
diff --git a/src/crypto/bytestring/ber.c b/src/crypto/bytestring/ber.c
index e7f67dd..dc707b9 100644
--- a/src/crypto/bytestring/ber.c
+++ b/src/crypto/bytestring/ber.c
@@ -69,9 +69,9 @@
     CBS contents;
     unsigned tag;
     size_t header_len;
-
+    int indefinite;
     if (!CBS_get_any_ber_asn1_element(&in, &contents, &tag, &header_len,
-                                      ber_found)) {
+                                      ber_found, &indefinite)) {
       return 0;
     }
     if (*ber_found) {
@@ -93,11 +93,14 @@
   return 1;
 }
 
-// is_eoc returns true if |header_len| and |contents|, as returned by
-// |CBS_get_any_ber_asn1_element|, indicate an "end of contents" (EOC) value.
-static char is_eoc(size_t header_len, CBS *contents) {
-  return header_len == 2 && CBS_len(contents) == 2 &&
-         OPENSSL_memcmp(CBS_data(contents), "\x00\x00", 2) == 0;
+// cbs_get_eoc returns one if |cbs| begins with an "end of contents" (EOC) value
+// and zero otherwise. If an EOC was found, it advances |cbs| past it.
+static int cbs_get_eoc(CBS *cbs) {
+  if (CBS_len(cbs) >= 2 &&
+      CBS_data(cbs)[0] == 0 && CBS_data(cbs)[1] == 0) {
+    return CBS_skip(cbs, 2);
+  }
+  return 0;
 }
 
 // cbs_convert_ber reads BER data from |in| and writes DER data to |out|. If
@@ -116,21 +119,20 @@
   }
 
   while (CBS_len(in) > 0) {
+    if (looking_for_eoc && cbs_get_eoc(in)) {
+      return 1;
+    }
+
     CBS contents;
     unsigned tag, child_string_tag = string_tag;
     size_t header_len;
-    int ber_found;
+    int indefinite;
     CBB *out_contents, out_contents_storage;
-
     if (!CBS_get_any_ber_asn1_element(in, &contents, &tag, &header_len,
-                                      &ber_found)) {
+                                      /*out_ber_found=*/NULL, &indefinite)) {
       return 0;
     }
 
-    if (is_eoc(header_len, &contents)) {
-      return looking_for_eoc;
-    }
-
     if (string_tag != 0) {
       // This is part of a constructed string. All elements must match
       // |string_tag| up to the constructed bit and get appended to |out|
@@ -153,11 +155,9 @@
       out_contents = &out_contents_storage;
     }
 
-    if (CBS_len(&contents) == header_len && header_len > 0 &&
-        CBS_data(&contents)[header_len - 1] == 0x80) {
-      // This is an indefinite length element.
+    if (indefinite) {
       if (!cbs_convert_ber(in, out_contents, child_string_tag,
-                           1 /* looking for eoc */, depth + 1) ||
+                           /*looking_for_eoc=*/1, depth + 1) ||
           !CBB_flush(out)) {
         return 0;
       }
@@ -171,7 +171,7 @@
     if (tag & CBS_ASN1_CONSTRUCTED) {
       // Recurse into children.
       if (!cbs_convert_ber(&contents, out_contents, child_string_tag,
-                           0 /* not looking for eoc */, depth + 1)) {
+                           /*looking_for_eoc=*/0, depth + 1)) {
         return 0;
       }
     } else {
diff --git a/src/crypto/bytestring/bytestring_test.cc b/src/crypto/bytestring/bytestring_test.cc
index 985e38c..27aae79 100644
--- a/src/crypto/bytestring/bytestring_test.cc
+++ b/src/crypto/bytestring/bytestring_test.cc
@@ -24,9 +24,9 @@
 #include <openssl/crypto.h>
 #include <openssl/span.h>
 
-#include "internal.h"
 #include "../internal.h"
 #include "../test/test_util.h"
+#include "internal.h"
 
 
 TEST(CBSTest, Skip) {
@@ -693,29 +693,43 @@
   const char *in_hex;
   bool ok;
   bool ber_found;
+  bool indefinite;
   unsigned tag;
 };
 
 static const BERTest kBERTests[] = {
-  // Trivial cases, also valid DER.
-  {"0000", true, false, 0},
-  {"0100", true, false, 1},
-  {"020101", true, false, 2},
+    // Trivial cases, also valid DER.
+    {"0100", true, false, false, 1},
+    {"020101", true, false, false, 2},
 
-  // Non-minimally encoded lengths.
-  {"02810101", true, true, 2},
-  {"0282000101", true, true, 2},
-  {"028300000101", true, true, 2},
-  {"02840000000101", true, true, 2},
-  // Technically valid BER, but not handled.
-  {"02850000000101", false, false, 0},
+    // Non-minimally encoded lengths.
+    {"02810101", true, true, false, 2},
+    {"0282000101", true, true, false, 2},
+    {"028300000101", true, true, false, 2},
+    {"02840000000101", true, true, false, 2},
+    // Technically valid BER, but not handled.
+    {"02850000000101", false, false, false, 0},
 
-  {"0280", false, false, 0},  // Indefinite length, but not constructed.
-  {"2280", true, true, CBS_ASN1_CONSTRUCTED | 2},  // Indefinite length.
-  {"3f0000", false, false, 0},  // Invalid extended tag zero (X.690 8.1.2.4.2.c)
-  {"1f0100", false, false, 0},  // Should be a low-number tag form, even in BER.
-  {"1f4000", true, false, 0x40},
-  {"1f804000", false, false, 0},  // Non-minimal tags are invalid, even in BER.
+    // Indefinite length, but not constructed.
+    {"0280", false, false, false, 0},
+    // Indefinite length.
+    {"2280", true, true, true, CBS_ASN1_CONSTRUCTED | 2},
+    // Indefinite length with multi-byte tag.
+    {"bf1f80", true, true, true,
+     CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 31},
+    // Invalid extended tag zero (X.690 8.1.2.4.2.c)
+    {"3f0000", false, false, false, 0},
+    // Should be a low-number tag form, even in BER.
+    {"1f0100", false, false, false, 0},
+    {"1f4000", true, false, false, 0x40},
+    // Non-minimal tags are invalid, even in BER.
+    {"1f804000", false, false, false, 0},
+
+    // EOCs and other forms of tag [UNIVERSAL 0] are rejected as elements.
+    {"0000", false, false, false, 0},
+    {"000100", false, false, false, 0},
+    {"00800000", false, false, false, 0},
+    {"2000", false, false, false, 0},
 };
 
 TEST(CBSTest, BERElementTest) {
@@ -729,14 +743,16 @@
     unsigned tag;
     size_t header_len;
     int ber_found;
-    int ok =
-        CBS_get_any_ber_asn1_element(&in, &out, &tag, &header_len, &ber_found);
+    int indefinite;
+    int ok = CBS_get_any_ber_asn1_element(&in, &out, &tag, &header_len,
+                                          &ber_found, &indefinite);
     ASSERT_TRUE((ok == 1) == test.ok);
     if (!test.ok) {
       continue;
     }
 
-    EXPECT_TRUE((ber_found == 1) == test.ber_found);
+    EXPECT_EQ(test.ber_found ? 1 : 0, ber_found);
+    EXPECT_EQ(test.indefinite ? 1 : 0, indefinite);
     EXPECT_LE(header_len, in_bytes.size());
     EXPECT_EQ(CBS_len(&out), in_bytes.size());
     EXPECT_EQ(CBS_len(&in), 0u);
@@ -846,12 +862,28 @@
     EXPECT_EQ(0, is_negative);
     EXPECT_TRUE(CBS_is_unsigned_asn1_integer(&child));
 
-    bssl::ScopedCBB cbb;
-    ASSERT_TRUE(CBB_init(cbb.get(), 0));
-    ASSERT_TRUE(CBB_add_asn1_uint64(cbb.get(), test.value));
-    ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
-    bssl::UniquePtr<uint8_t> scoper(out);
-    EXPECT_EQ(Bytes(test.encoding, test.encoding_len), Bytes(out, len));
+    {
+      bssl::ScopedCBB cbb;
+      ASSERT_TRUE(CBB_init(cbb.get(), 0));
+      ASSERT_TRUE(CBB_add_asn1_uint64(cbb.get(), test.value));
+      ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
+      bssl::UniquePtr<uint8_t> scoper(out);
+      EXPECT_EQ(Bytes(test.encoding, test.encoding_len), Bytes(out, len));
+    }
+
+    {
+      // Overwrite the tag.
+      bssl::ScopedCBB cbb;
+      ASSERT_TRUE(CBB_init(cbb.get(), 0));
+      ASSERT_TRUE(CBB_add_asn1_uint64_with_tag(cbb.get(), test.value,
+                                               CBS_ASN1_CONTEXT_SPECIFIC | 1));
+      ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
+      bssl::UniquePtr<uint8_t> scoper(out);
+      std::vector<uint8_t> expected(test.encoding,
+                                    test.encoding + test.encoding_len);
+      expected[0] = 0x81;
+      EXPECT_EQ(Bytes(expected), Bytes(out, len));
+    }
   }
 
   for (const ASN1InvalidUint64Test &test : kASN1InvalidUint64Tests) {
@@ -936,12 +968,28 @@
     EXPECT_EQ(test.value < 0, !!is_negative);
     EXPECT_EQ(test.value >= 0, !!CBS_is_unsigned_asn1_integer(&child));
 
-    bssl::ScopedCBB cbb;
-    ASSERT_TRUE(CBB_init(cbb.get(), 0));
-    ASSERT_TRUE(CBB_add_asn1_int64(cbb.get(), test.value));
-    ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
-    bssl::UniquePtr<uint8_t> scoper(out);
-    EXPECT_EQ(Bytes(test.encoding, test.encoding_len), Bytes(out, len));
+    {
+      bssl::ScopedCBB cbb;
+      ASSERT_TRUE(CBB_init(cbb.get(), 0));
+      ASSERT_TRUE(CBB_add_asn1_int64(cbb.get(), test.value));
+      ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
+      bssl::UniquePtr<uint8_t> scoper(out);
+      EXPECT_EQ(Bytes(test.encoding, test.encoding_len), Bytes(out, len));
+    }
+
+    {
+      // Overwrite the tag.
+      bssl::ScopedCBB cbb;
+      ASSERT_TRUE(CBB_init(cbb.get(), 0));
+      ASSERT_TRUE(CBB_add_asn1_int64_with_tag(cbb.get(), test.value,
+                                              CBS_ASN1_CONTEXT_SPECIFIC | 1));
+      ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
+      bssl::UniquePtr<uint8_t> scoper(out);
+      std::vector<uint8_t> expected(test.encoding,
+                                    test.encoding + test.encoding_len);
+      expected[0] = 0x81;
+      EXPECT_EQ(Bytes(expected), Bytes(out, len));
+    }
   }
 
   for (const ASN1InvalidInt64Test &test : kASN1InvalidInt64Tests) {
@@ -1477,3 +1525,127 @@
   EXPECT_EQ(4u, cbb_get_utf8_len(0x10000));
   EXPECT_EQ(4u, cbb_get_utf8_len(0x10ffff));
 }
+
+TEST(CBSTest, BogusTime) {
+  static const struct {
+    const char *timestring;
+  } kBogusTimeTests[] = {
+      {""},
+      {"invalidtimesZ"},
+      {"Z"},
+      {"0000"},
+      {"9999Z"},
+      {"00000000000000000000000000000Z"},
+      {"19491231235959"},
+      {"500101000000.001Z"},
+      {"500101000000+6"},
+      {"-1970010100000Z"},
+      {"7a0101000000Z"},
+      {"20500101000000-6"},
+      {"20500101000000.001"},
+      {"20500229000000Z"},
+      {"220229000000Z"},
+      {"20500132000000Z"},
+      {"220132000000Z"},
+      {"20500332000000Z"},
+      {"220332000000Z"},
+      {"20500532000000Z"},
+      {"220532000000Z"},
+      {"20500732000000Z"},
+      {"220732000000Z"},
+      {"20500832000000Z"},
+      {"220832000000Z"},
+      {"20501032000000Z"},
+      {"221032000000Z"},
+      {"20501232000000Z"},
+      {"221232000000Z"},
+      {"20500431000000Z"},
+      {"220431000000Z"},
+      {"20500631000000Z"},
+      {"220631000000Z"},
+      {"20500931000000Z"},
+      {"220931000000Z"},
+      {"20501131000000Z"},
+      {"221131000000Z"},
+      {"20501100000000Z"},
+      {"221100000000Z"},
+      {"19500101000000+0600"},
+  };
+  for (const auto &t : kBogusTimeTests) {
+    SCOPED_TRACE(t.timestring);
+    CBS cbs;
+    CBS_init(&cbs, (const uint8_t *)t.timestring, strlen(t.timestring));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/0));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1));
+  }
+  static const struct {
+    const char *timestring;
+  } kUTCTZTests[] = {
+      {"480711220333-0700"},
+      {"140704000000-0700"},
+      {"480222202332-0500"},
+      {"480726113216-0000"},
+      {"480726113216-2359"},
+  };
+  for (const auto &t : kUTCTZTests) {
+    SCOPED_TRACE(t.timestring);
+    CBS cbs;
+    CBS_init(&cbs, (const uint8_t *)t.timestring, strlen(t.timestring));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/0));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/1));
+    EXPECT_TRUE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/0));
+  }
+  static const struct {
+    const char *timestring;
+  } kBogusUTCTZTests[] = {
+      {"480711220333-0160"},
+      {"140704000000-9999"},
+      {"480222202332-2400"},
+  };
+  for (const auto &t : kBogusUTCTZTests) {
+    SCOPED_TRACE(t.timestring);
+    CBS cbs;
+    CBS_init(&cbs, (const uint8_t *)t.timestring, strlen(t.timestring));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/0));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1));
+  }
+  static const struct {
+    const char *timestring;
+  } kGenTZTests[] = {
+      {"20480711220333-0000"},
+      {"20140704000000-0100"},
+      {"20460311174630-0300"},
+      {"20140704000000-2359"},
+  };
+  for (const auto &t : kGenTZTests) {
+    SCOPED_TRACE(t.timestring);
+    CBS cbs;
+    CBS_init(&cbs, (const uint8_t *)t.timestring, strlen(t.timestring));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/0));
+    EXPECT_TRUE(CBS_parse_generalized_time(&cbs, NULL,
+                                           /*allow_timezone_offset=*/1));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/0));
+  }
+  static const struct {
+    const char *timestring;
+  } kBogusGenTZTests[] = {
+      {"20480222202332-2400"},
+      {"20140704000000-9999"},
+      {"20480726113216-0160"},
+  };
+  for (const auto &t : kBogusGenTZTests) {
+    SCOPED_TRACE(t.timestring);
+    CBS cbs;
+    CBS_init(&cbs, (const uint8_t *)t.timestring, strlen(t.timestring));
+    EXPECT_FALSE(CBS_parse_generalized_time(&cbs, NULL,
+                                            /*allow_timezone_offset=*/0));
+    EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1));
+  }
+}
diff --git a/src/crypto/bytestring/cbb.c b/src/crypto/bytestring/cbb.c
index 12587cd..100c713 100644
--- a/src/crypto/bytestring/cbb.c
+++ b/src/crypto/bytestring/cbb.c
@@ -503,13 +503,16 @@
 }
 
 int CBB_add_asn1_uint64(CBB *cbb, uint64_t value) {
-  CBB child;
-  int started = 0;
+  return CBB_add_asn1_uint64_with_tag(cbb, value, CBS_ASN1_INTEGER);
+}
 
-  if (!CBB_add_asn1(cbb, &child, CBS_ASN1_INTEGER)) {
+int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value, unsigned tag) {
+  CBB child;
+  if (!CBB_add_asn1(cbb, &child, tag)) {
     return 0;
   }
 
+  int started = 0;
   for (size_t i = 0; i < 8; i++) {
     uint8_t byte = (value >> 8*(7-i)) & 0xff;
     if (!started) {
@@ -538,27 +541,28 @@
 }
 
 int CBB_add_asn1_int64(CBB *cbb, int64_t value) {
+  return CBB_add_asn1_int64_with_tag(cbb, value, CBS_ASN1_INTEGER);
+}
+
+int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value, unsigned tag) {
   if (value >= 0) {
-    return CBB_add_asn1_uint64(cbb, value);
+    return CBB_add_asn1_uint64_with_tag(cbb, (uint64_t)value, tag);
   }
 
-  union {
-    int64_t i;
-    uint8_t bytes[sizeof(int64_t)];
-  } u;
-  u.i = value;
+  uint8_t bytes[sizeof(int64_t)];
+  memcpy(bytes, &value, sizeof(value));
   int start = 7;
   // Skip leading sign-extension bytes unless they are necessary.
-  while (start > 0 && (u.bytes[start] == 0xff && (u.bytes[start - 1] & 0x80))) {
+  while (start > 0 && (bytes[start] == 0xff && (bytes[start - 1] & 0x80))) {
     start--;
   }
 
   CBB child;
-  if (!CBB_add_asn1(cbb, &child, CBS_ASN1_INTEGER)) {
+  if (!CBB_add_asn1(cbb, &child, tag)) {
     return 0;
   }
   for (int i = start; i >= 0; i--) {
-    if (!CBB_add_u8(&child, u.bytes[i])) {
+    if (!CBB_add_u8(&child, bytes[i])) {
       return 0;
     }
   }
diff --git a/src/crypto/bytestring/cbs.c b/src/crypto/bytestring/cbs.c
index 803c97a..4e7f379 100644
--- a/src/crypto/bytestring/cbs.c
+++ b/src/crypto/bytestring/cbs.c
@@ -12,15 +12,18 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/mem.h>
+#include <openssl/asn1.h>
 #include <openssl/bytestring.h>
+#include <openssl/mem.h>
 
 #include <assert.h>
+#include <ctype.h>
 #include <inttypes.h>
 #include <string.h>
 
-#include "internal.h"
+#include "../asn1/internal.h"
 #include "../internal.h"
+#include "internal.h"
 
 
 void CBS_init(CBS *cbs, const uint8_t *data, size_t len) {
@@ -279,13 +282,20 @@
 
   tag |= tag_number;
 
+  // Tag [UNIVERSAL 0] is reserved for use by the encoding. Reject it here to
+  // avoid some ambiguity around ANY values and BER indefinite-length EOCs. See
+  // https://crbug.com/boringssl/455.
+  if ((tag & ~CBS_ASN1_CONSTRUCTED) == 0) {
+    return 0;
+  }
+
   *out = tag;
   return 1;
 }
 
 static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
                                     size_t *out_header_len, int *out_ber_found,
-                                    int ber_ok) {
+                                    int *out_indefinite, int ber_ok) {
   CBS header = *cbs;
   CBS throwaway;
 
@@ -294,6 +304,10 @@
   }
   if (ber_ok) {
     *out_ber_found = 0;
+    *out_indefinite = 0;
+  } else {
+    assert(out_ber_found == NULL);
+    assert(out_indefinite == NULL);
   }
 
   unsigned tag;
@@ -333,6 +347,7 @@
         *out_header_len = header_len;
       }
       *out_ber_found = 1;
+      *out_indefinite = 1;
       return CBS_get_bytes(cbs, out, header_len);
     }
 
@@ -395,16 +410,18 @@
 
 int CBS_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
                                     size_t *out_header_len) {
-  return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len,
-                                  NULL, 0 /* DER only */);
+  return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len, NULL, NULL,
+                                  /*ber_ok=*/0);
 }
 
 int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
-                                 size_t *out_header_len, int *out_ber_found) {
+                                 size_t *out_header_len, int *out_ber_found,
+                                 int *out_indefinite) {
   int ber_found_temp;
   return cbs_get_any_asn1_element(
       cbs, out, out_tag, out_header_len,
-      out_ber_found ? out_ber_found : &ber_found_temp, 1 /* BER allowed */);
+      out_ber_found ? out_ber_found : &ber_found_temp, out_indefinite,
+      /*ber_ok=*/1);
 }
 
 static int cbs_get_asn1(CBS *cbs, CBS *out, unsigned tag_value,
@@ -482,15 +499,12 @@
   if (len > sizeof(int64_t)) {
     return 0;
   }
-  union {
-    int64_t i;
-    uint8_t bytes[sizeof(int64_t)];
-  } u;
-  memset(u.bytes, is_negative ? 0xff : 0, sizeof(u.bytes));  // Sign-extend.
+  uint8_t sign_extend[sizeof(int64_t)];
+  memset(sign_extend, is_negative ? 0xff : 0, sizeof(sign_extend));
   for (size_t i = 0; i < len; i++) {
-    u.bytes[i] = data[len - i - 1];
+    sign_extend[i] = data[len - i - 1];
   }
-  *out = u.i;
+  memcpy(out, sign_extend, sizeof(sign_extend));
   return 1;
 }
 
@@ -709,3 +723,161 @@
   CBB_cleanup(&cbb);
   return NULL;
 }
+
+static int cbs_get_two_digits(CBS *cbs, int *out) {
+  uint8_t first_digit, second_digit;
+  if (!CBS_get_u8(cbs, &first_digit)) {
+    return 0;
+  }
+  if (!isdigit(first_digit)) {
+    return 0;
+  }
+  if (!CBS_get_u8(cbs, &second_digit)) {
+    return 0;
+  }
+  if (!isdigit(second_digit)) {
+    return 0;
+  }
+  *out = (first_digit - '0') * 10 + (second_digit - '0');
+  return 1;
+}
+
+static int is_valid_day(int year, int month, int day) {
+  if (day < 1) {
+    return 0;
+  }
+  switch (month) {
+    case 1:
+    case 3:
+    case 5:
+    case 7:
+    case 8:
+    case 10:
+    case 12:
+      return day <= 31;
+    case 4:
+    case 6:
+    case 9:
+    case 11:
+      return day <= 30;
+    case 2:
+      if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
+        return day <= 29;
+      } else {
+        return day <= 28;
+      }
+    default:
+      return 0;
+  }
+}
+
+static int CBS_parse_rfc5280_time_internal(const CBS *cbs, int is_gentime,
+                                           int allow_timezone_offset,
+                                           struct tm *out_tm) {
+  int year, month, day, hour, min, sec, tmp;
+  CBS copy = *cbs;
+  uint8_t tz;
+
+  if (is_gentime) {
+    if (!cbs_get_two_digits(&copy, &tmp)) {
+      return 0;
+    }
+    year = tmp * 100;
+    if (!cbs_get_two_digits(&copy, &tmp)) {
+      return 0;
+    }
+      year += tmp;
+  } else {
+    year = 1900;
+    if (!cbs_get_two_digits(&copy, &tmp)) {
+      return 0;
+    }
+    year += tmp;
+    if (year < 1950) {
+      year += 100;
+    }
+    if (year >= 2050) {
+      return 0;  // A Generalized time must be used.
+    }
+  }
+  if (!cbs_get_two_digits(&copy, &month) || month < 1 ||
+      month > 12 ||  // Reject invalid months.
+      !cbs_get_two_digits(&copy, &day) ||
+      !is_valid_day(year, month, day) ||  // Reject invalid days.
+      !cbs_get_two_digits(&copy, &hour) ||
+      hour > 23 ||  // Reject invalid hours.
+      !cbs_get_two_digits(&copy, &min) ||
+      min > 59 ||  // Reject invalid minutes.
+      !cbs_get_two_digits(&copy, &sec) || sec > 59 || !CBS_get_u8(&copy, &tz)) {
+    return 0;
+  }
+
+  int offset_sign = 0;
+  switch (tz) {
+    case 'Z':
+      break;  // We correctly have 'Z' on the end as per spec.
+    case '+':
+      offset_sign = 1;
+      break;  // Should not be allowed per RFC 5280.
+    case '-':
+      offset_sign = -1;
+      break;  // Should not be allowed per RFC 5280.
+    default:
+      return 0;  // Reject anything else after the time.
+  }
+
+  // If allow_timezone_offset is non-zero, allow for a four digit timezone
+  // offset to be specified even though this is not allowed by RFC 5280. We are
+  // permissive of this for UTCTimes due to the unfortunate existence of
+  // artisinally rolled long lived certificates that were baked into places that
+  // are now difficult to change. These certificates were generated with the
+  // 'openssl' command that permissively allowed the creation of certificates
+  // with notBefore and notAfter times specified as strings for direct
+  // certificate inclusion on the command line. For context see cl/237068815.
+  //
+  // TODO(bbe): This has been expunged from public web-pki as the ecosystem has
+  // managed to encourage CA compliance with standards. We should find a way to
+  // get rid of this or make it off by default.
+  int offset_seconds = 0;
+  if (offset_sign != 0) {
+    if (!allow_timezone_offset) {
+      return 0;
+    }
+    int offset_hours, offset_minutes;
+    if (!cbs_get_two_digits(&copy, &offset_hours) ||
+        offset_hours > 23 ||  // Reject invalid hours.
+        !cbs_get_two_digits(&copy, &offset_minutes) ||
+        offset_minutes > 59) {  // Reject invalid minutes.
+      return 0;
+    }
+    offset_seconds = offset_sign * (offset_hours * 3600 + offset_minutes * 60);
+  }
+
+  if (CBS_len(&copy) != 0) {
+    return 0;  // Reject invalid lengths.
+  }
+
+  if (out_tm != NULL) {
+    // Fill in the tm fields corresponding to what we validated.
+    out_tm->tm_year = year - 1900;
+    out_tm->tm_mon = month - 1;
+    out_tm->tm_mday = day;
+    out_tm->tm_hour = hour;
+    out_tm->tm_min = min;
+    out_tm->tm_sec = sec;
+    if (offset_seconds && !OPENSSL_gmtime_adj(out_tm, 0, offset_seconds)) {
+      return 0;
+    }
+  }
+  return 1;
+}
+
+int CBS_parse_generalized_time(const CBS *cbs, struct tm *out_tm,
+                               int allow_timezone_offset) {
+  return CBS_parse_rfc5280_time_internal(cbs, 1, allow_timezone_offset, out_tm);
+}
+
+int CBS_parse_utc_time(const CBS *cbs, struct tm *out_tm,
+                       int allow_timezone_offset) {
+  return CBS_parse_rfc5280_time_internal(cbs, 0, allow_timezone_offset, out_tm);
+}
diff --git a/src/crypto/chacha/asm/chacha-armv8.pl b/src/crypto/chacha/asm/chacha-armv8.pl
index 608db66..c3a3653 100755
--- a/src/crypto/chacha/asm/chacha-armv8.pl
+++ b/src/crypto/chacha/asm/chacha-armv8.pl
@@ -171,7 +171,7 @@
 	ldp	@d[2],@d[3],[$key]		// load key
 	ldp	@d[4],@d[5],[$key,#16]
 	ldp	@d[6],@d[7],[$ctr]		// load counter
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	@d[2],@d[2],#32
 	ror	@d[3],@d[3],#32
 	ror	@d[4],@d[4],#32
@@ -240,7 +240,7 @@
 	add	@x[14],@x[14],@x[15],lsl#32
 	ldp	@x[13],@x[15],[$inp,#48]
 	add	$inp,$inp,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
@@ -297,7 +297,7 @@
 	add	@x[10],@x[10],@x[11],lsl#32
 	add	@x[12],@x[12],@x[13],lsl#32
 	add	@x[14],@x[14],@x[15],lsl#32
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
@@ -402,7 +402,7 @@
 	ldp	@d[6],@d[7],[$ctr]		// load counter
 	ld1	{@K[3]},[$ctr]
 	ld1	{$ONE},[@x[0]]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	@K[0],@K[0]
 	ror	@d[2],@d[2],#32
 	ror	@d[3],@d[3],#32
@@ -519,7 +519,7 @@
 	add	@x[14],@x[14],@x[15],lsl#32
 	ldp	@x[13],@x[15],[$inp,#48]
 	add	$inp,$inp,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
@@ -599,7 +599,7 @@
 	add	@x[14],@x[14],@x[15],lsl#32
 	ldp	@x[13],@x[15],[$inp,#48]
 	add	$inp,$inp,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
@@ -724,7 +724,7 @@
 	ldp	@d[6],@d[7],[$ctr]		// load counter
 	ld1	{@K[3]},[$ctr]
 	ld1	{$ONE},[@x[0]]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	@K[0],@K[0]
 	ror	@d[2],@d[2],#32
 	ror	@d[3],@d[3],#32
@@ -866,7 +866,7 @@
 	add	@x[14],@x[14],@x[15],lsl#32
 	ldp	@x[13],@x[15],[$inp,#48]
 	add	$inp,$inp,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
@@ -1007,7 +1007,7 @@
 	add	$inp,$inp,#64
 	 add	$B5,$B5,@K[1]
 
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	@x[0],@x[0]
 	rev	@x[2],@x[2]
 	rev	@x[4],@x[4]
diff --git a/src/crypto/chacha/chacha.c b/src/crypto/chacha/chacha.c
index 64ca1c4..1092b7a 100644
--- a/src/crypto/chacha/chacha.c
+++ b/src/crypto/chacha/chacha.c
@@ -19,8 +19,6 @@
 #include <assert.h>
 #include <string.h>
 
-#include <openssl/cpu.h>
-
 #include "../internal.h"
 #include "internal.h"
 
diff --git a/src/crypto/cipher_extra/aead_test.cc b/src/crypto/cipher_extra/aead_test.cc
index 9e5dcee..506db26 100644
--- a/src/crypto/cipher_extra/aead_test.cc
+++ b/src/crypto/cipher_extra/aead_test.cc
@@ -154,6 +154,9 @@
 
     {"AES_128_CCM_BLUETOOTH_8", EVP_aead_aes_128_ccm_bluetooth_8,
      "aes_128_ccm_bluetooth_8_tests.txt", 0},
+
+    {"AES_128_CCM_Matter", EVP_aead_aes_128_ccm_matter,
+     "aes_128_ccm_matter_tests.txt", 0},
 };
 
 class PerAEADTest : public testing::TestWithParam<KnownAEAD> {
@@ -1008,3 +1011,7 @@
         RunWycheproofTestCase(t, EVP_aead_xchacha20_poly1305());
       });
 }
+
+TEST(AEADTest, FreeNull) {
+  EVP_AEAD_CTX_free(nullptr);
+}
diff --git a/src/crypto/cipher_extra/asm/chacha20_poly1305_armv8.pl b/src/crypto/cipher_extra/asm/chacha20_poly1305_armv8.pl
new file mode 100644
index 0000000..9bd7f49
--- /dev/null
+++ b/src/crypto/cipher_extra/asm/chacha20_poly1305_armv8.pl
@@ -0,0 +1,1644 @@
+#!/usr/bin/env perl
+
+# Copyright (c) 2020, CloudFlare Ltd.
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+##############################################################################
+#                                                                            #
+# Author:  Vlad Krasnov                                                      #
+#                                                                            #
+##############################################################################
+
+$flavour = shift;
+while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
+( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+die "can't locate arm-xlate.pl";
+
+open OUT,"| \"$^X\" $xlate $flavour $output";
+*STDOUT=*OUT;
+
+my ($oup,$inp,$inl,$adp,$adl,$keyp,$itr1,$itr2) = ("x0","x1","x2","x3","x4","x5","x6","x7");
+my ($acc0,$acc1,$acc2) = map("x$_",(8..10));
+my ($t0,$t1,$t2,$t3) = map("x$_",(11..14));
+my ($one, $r0, $r1) = ("x15","x16","x17");
+my ($t0w) = $t0 =~ s/x/w/r;
+
+my ($A0,$A1,$A2,$A3,$A4,$B0,$B1,$B2,$B3,$B4,$C0,$C1,$C2,$C3,$C4,$D0,$D1,$D2,$D3,$D4) = map("v$_",(0..19));
+my ($T0,$T1,$T2,$T3) = map("v$_",(20..23));
+
+my $CONSTS = "v24";
+my $INC = "v25";
+my $ROL8 = "v26";
+my $CLAMP = "v27";
+
+my ($B_STORE, $C_STORE, $D_STORE) = map("v$_",(28..30));
+
+my $S_STORE = $CLAMP;
+my $LEN_STORE = "v31";
+
+sub chacha_qr {
+my ($a,$b,$c,$d,$t,$dir)=@_;
+my ($shift_b,$shift_d) = $dir =~ /left/ ? ("#4","#12") : ("#12","#4");
+$code.=<<___;
+    add   $a.4s, $a.4s, $b.4s
+    eor   $d.16b, $d.16b, $a.16b
+    rev32 $d.8h, $d.8h
+
+    add   $c.4s, $c.4s, $d.4s
+    eor   $b.16b, $b.16b, $c.16b
+    ushr  $t.4s, $b.4s, #20
+    sli   $t.4s, $b.4s, #12
+___
+    ($t,$b) = ($b,$t);
+$code.=<<___;
+    add   $a.4s, $a.4s, $b.4s
+    eor   $d.16b, $d.16b, $a.16b
+    tbl   $d.16b, {$d.16b}, $ROL8.16b
+
+    add   $c.4s, $c.4s, $d.4s
+    eor   $b.16b, $b.16b, $c.16b
+    ushr  $t.4s, $b.4s, #25
+    sli   $t.4s, $b.4s, #7
+___
+    ($t,$b) = ($b,$t);
+$code.=<<___;
+    ext $b.16b, $b.16b, $b.16b, $shift_b
+    ext $c.16b, $c.16b, $c.16b, #8
+    ext $d.16b, $d.16b, $d.16b, $shift_d
+___
+}
+
+sub poly_add {
+my ($src)=@_;
+$code.="ldp  $t0, $t1, [$src], 16
+        adds $acc0, $acc0, $t0
+        adcs $acc1, $acc1, $t1
+        adc  $acc2, $acc2, $one\n";
+}
+
+sub poly_add_vec {
+my ($src)=@_;
+$code.="mov  $t0, $src.d[0]
+        mov  $t1, $src.d[1]
+        adds $acc0, $acc0, $t0
+        adcs $acc1, $acc1, $t1
+        adc  $acc2, $acc2, $one\n";
+}
+
+sub poly_stage1 {
+$code.="mul   $t0, $acc0, $r0     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+        umulh $t1, $acc0, $r0
+        mul   $t2, $acc1, $r0
+        umulh $t3, $acc1, $r0
+        adds  $t1, $t1, $t2
+        mul   $t2, $acc2, $r0
+        adc   $t2, $t2, $t3\n";
+}
+
+sub poly_stage2 {
+$code.="mul   $t3, $acc0, $r1       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+        umulh $acc0, $acc0, $r1
+        adds  $t1, $t1, $t3
+        mul   $t3, $acc1, $r1
+        umulh $acc1, $acc1, $r1
+        adcs  $t3, $t3, $acc0
+        mul   $acc2, $acc2, $r1
+        adc   $acc2, $acc2, $acc1
+        adds  $t2, $t2, $t3
+        adc   $t3, $acc2, xzr\n";
+}
+
+# At the beginning of the reduce stage t = [t3:t2:t1:t0] is a product of
+# r = [r1:r0] and acc = [acc2:acc1:acc0]
+# r is 124 bits at most (due to clamping) and acc is 131 bits at most
+# (acc2 is at most 4 before the addition and can be at most 6 when we add in
+# the next block) therefore t is at most 255 bits big, and t3 is 63 bits.
+sub poly_reduce_stage {
+$code.="and  $acc2, $t2, #3         // At this point acc2 is 2 bits at most (value of 3)
+        and  $acc0, $t2, #-4
+        extr $t2, $t3, $t2, #2
+        adds $acc0, $acc0, $t0
+        lsr  $t0, $t3, #2
+        adc  $acc1, $t3, $t0        // No carry out since t0 is 61 bits and t3 is 63 bits
+        adds $acc0, $acc0, $t2
+        adcs $acc1, $acc1, $t1
+        adc  $acc2, $acc2, xzr      // At this point acc2 has the value of 4 at most \n";
+}
+
+sub poly_mul {
+    &poly_stage1();
+    &poly_stage2();
+    &poly_reduce_stage();
+}
+
+sub chacha_qr_x3 {
+my ($dir)=@_;
+my ($shift_b,$shift_d) = $dir =~ /left/ ? ("#4","#12") : ("#12","#4");
+$code.=<<___;
+    add   $A0.4s, $A0.4s, $B0.4s
+    add   $A1.4s, $A1.4s, $B1.4s
+    add   $A2.4s, $A2.4s, $B2.4s
+    eor   $D0.16b, $D0.16b, $A0.16b
+    eor   $D1.16b, $D1.16b, $A1.16b
+    eor   $D2.16b, $D2.16b, $A2.16b
+    rev32 $D0.8h, $D0.8h
+    rev32 $D1.8h, $D1.8h
+    rev32 $D2.8h, $D2.8h
+
+    add   $C0.4s, $C0.4s, $D0.4s
+    add   $C1.4s, $C1.4s, $D1.4s
+    add   $C2.4s, $C2.4s, $D2.4s
+    eor   $B0.16b, $B0.16b, $C0.16b
+    eor   $B1.16b, $B1.16b, $C1.16b
+    eor   $B2.16b, $B2.16b, $C2.16b
+    ushr  $T0.4s, $B0.4s, #20
+    sli   $T0.4s, $B0.4s, #12
+    ushr  $B0.4s, $B1.4s, #20
+    sli   $B0.4s, $B1.4s, #12
+    ushr  $B1.4s, $B2.4s, #20
+    sli   $B1.4s, $B2.4s, #12
+
+    add   $A0.4s, $A0.4s, $T0.4s
+    add   $A1.4s, $A1.4s, $B0.4s
+    add   $A2.4s, $A2.4s, $B1.4s
+    eor   $D0.16b, $D0.16b, $A0.16b
+    eor   $D1.16b, $D1.16b, $A1.16b
+    eor   $D2.16b, $D2.16b, $A2.16b
+    tbl   $D0.16b, {$D0.16b}, $ROL8.16b
+    tbl   $D1.16b, {$D1.16b}, $ROL8.16b
+    tbl   $D2.16b, {$D2.16b}, $ROL8.16b
+
+    add   $C0.4s, $C0.4s, $D0.4s
+    add   $C1.4s, $C1.4s, $D1.4s
+    add   $C2.4s, $C2.4s, $D2.4s
+    eor   $T0.16b, $T0.16b, $C0.16b
+    eor   $B0.16b, $B0.16b, $C1.16b
+    eor   $B1.16b, $B1.16b, $C2.16b
+    ushr  $B2.4s, $B1.4s, #25
+    sli   $B2.4s, $B1.4s, #7
+    ushr  $B1.4s, $B0.4s, #25
+    sli   $B1.4s, $B0.4s, #7
+    ushr  $B0.4s, $T0.4s, #25
+    sli   $B0.4s, $T0.4s, #7
+
+    ext $B0.16b, $B0.16b, $B0.16b, $shift_b
+    ext $B1.16b, $B1.16b, $B1.16b, $shift_b
+    ext $B2.16b, $B2.16b, $B2.16b, $shift_b
+
+    ext $C0.16b, $C0.16b, $C0.16b, #8
+    ext $C1.16b, $C1.16b, $C1.16b, #8
+    ext $C2.16b, $C2.16b, $C2.16b, #8
+
+    ext $D0.16b, $D0.16b, $D0.16b, $shift_d
+    ext $D1.16b, $D1.16b, $D1.16b, $shift_d
+    ext $D2.16b, $D2.16b, $D2.16b, $shift_d
+___
+}
+
+# When preparing 5 ChaCha20 blocks in parallel, we operate on 4 blocks vertically as introduced by Andrew Moon
+# the fifth block is done horizontally
+sub chacha_qr_x5 {
+my ($dir)=@_;
+my ($a0,$a1,$a2,$a3) = $dir =~ /left/ ? ($A0,$A1,$A2,$A3) : ($A0,$A1,$A2,$A3);
+my ($b0,$b1,$b2,$b3) = $dir =~ /left/ ? ($B0,$B1,$B2,$B3) : ($B1,$B2,$B3,$B0);
+my ($c0,$c1,$c2,$c3) = $dir =~ /left/ ? ($C0,$C1,$C2,$C3) : ($C2,$C3,$C0,$C1);
+my ($d0,$d1,$d2,$d3) = $dir =~ /left/ ? ($D0,$D1,$D2,$D3) : ($D3,$D0,$D1,$D2);
+my ($shift_b,$shift_d) = $dir =~ /left/ ? ("#4","#12") : ("#12","#4");
+$code.=<<___;
+    add   $a0.4s, $a0.4s, $b0.4s
+    add   $a1.4s, $a1.4s, $b1.4s
+    add   $a2.4s, $a2.4s, $b2.4s
+    add   $a3.4s, $a3.4s, $b3.4s
+    add   $A4.4s, $A4.4s, $B4.4s
+
+    eor   $d0.16b, $d0.16b, $a0.16b
+    eor   $d1.16b, $d1.16b, $a1.16b
+    eor   $d2.16b, $d2.16b, $a2.16b
+    eor   $d3.16b, $d3.16b, $a3.16b
+    eor   $D4.16b, $D4.16b, $A4.16b
+
+    rev32 $d0.8h, $d0.8h
+    rev32 $d1.8h, $d1.8h
+    rev32 $d2.8h, $d2.8h
+    rev32 $d3.8h, $d3.8h
+    rev32 $D4.8h, $D4.8h
+
+    add   $c0.4s, $c0.4s, $d0.4s
+    add   $c1.4s, $c1.4s, $d1.4s
+    add   $c2.4s, $c2.4s, $d2.4s
+    add   $c3.4s, $c3.4s, $d3.4s
+    add   $C4.4s, $C4.4s, $D4.4s
+
+    eor   $b0.16b, $b0.16b, $c0.16b
+    eor   $b1.16b, $b1.16b, $c1.16b
+    eor   $b2.16b, $b2.16b, $c2.16b
+    eor   $b3.16b, $b3.16b, $c3.16b
+    eor   $B4.16b, $B4.16b, $C4.16b
+
+    ushr  $T0.4s, $b0.4s, #20
+    sli   $T0.4s, $b0.4s, #12
+    ushr  $b0.4s, $b1.4s, #20
+    sli   $b0.4s, $b1.4s, #12
+    ushr  $b1.4s, $b2.4s, #20
+    sli   $b1.4s, $b2.4s, #12
+    ushr  $b2.4s, $b3.4s, #20
+    sli   $b2.4s, $b3.4s, #12
+    ushr  $b3.4s, $B4.4s, #20
+    sli   $b3.4s, $B4.4s, #12
+
+    add   $a0.4s, $a0.4s, $T0.4s
+    add   $a1.4s, $a1.4s, $b0.4s
+    add   $a2.4s, $a2.4s, $b1.4s
+    add   $a3.4s, $a3.4s, $b2.4s
+    add   $A4.4s, $A4.4s, $b3.4s
+
+    eor   $d0.16b, $d0.16b, $a0.16b
+    eor   $d1.16b, $d1.16b, $a1.16b
+    eor   $d2.16b, $d2.16b, $a2.16b
+    eor   $d3.16b, $d3.16b, $a3.16b
+    eor   $D4.16b, $D4.16b, $A4.16b
+
+    tbl   $d0.16b, {$d0.16b}, $ROL8.16b
+    tbl   $d1.16b, {$d1.16b}, $ROL8.16b
+    tbl   $d2.16b, {$d2.16b}, $ROL8.16b
+    tbl   $d3.16b, {$d3.16b}, $ROL8.16b
+    tbl   $D4.16b, {$D4.16b}, $ROL8.16b
+
+    add   $c0.4s, $c0.4s, $d0.4s
+    add   $c1.4s, $c1.4s, $d1.4s
+    add   $c2.4s, $c2.4s, $d2.4s
+    add   $c3.4s, $c3.4s, $d3.4s
+    add   $C4.4s, $C4.4s, $D4.4s
+
+    eor   $T0.16b, $T0.16b, $c0.16b
+    eor   $b0.16b, $b0.16b, $c1.16b
+    eor   $b1.16b, $b1.16b, $c2.16b
+    eor   $b2.16b, $b2.16b, $c3.16b
+    eor   $b3.16b, $b3.16b, $C4.16b
+
+    ushr  $B4.4s, $b3.4s, #25
+    sli   $B4.4s, $b3.4s, #7
+    ushr  $b3.4s, $b2.4s, #25
+    sli   $b3.4s, $b2.4s, #7
+    ushr  $b2.4s, $b1.4s, #25
+    sli   $b2.4s, $b1.4s, #7
+    ushr  $b1.4s, $b0.4s, #25
+    sli   $b1.4s, $b0.4s, #7
+    ushr  $b0.4s, $T0.4s, #25
+    sli   $b0.4s, $T0.4s, #7
+
+    ext $B4.16b, $B4.16b, $B4.16b, $shift_b
+    ext $C4.16b, $C4.16b, $C4.16b, #8
+    ext $D4.16b, $D4.16b, $D4.16b, $shift_d
+___
+}
+
+{
+$code.=<<___;
+#include <openssl/arm_arch.h>
+.section .rodata
+
+.align 7
+.Lchacha20_consts:
+.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k'
+.Linc:
+.long 1,2,3,4
+.Lrol8:
+.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14
+.Lclamp:
+.quad 0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC
+
+.text
+
+.type   .Lpoly_hash_ad_internal,%function
+.align  6
+.Lpoly_hash_ad_internal:
+    .cfi_startproc
+    cbnz $adl, .Lpoly_hash_intro
+    ret
+
+.Lpoly_hash_intro:
+    cmp $adl, #16
+    b.lt .Lpoly_hash_ad_tail
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+        sub $adl, $adl, #16
+        b .Lpoly_hash_ad_internal
+
+.Lpoly_hash_ad_tail:
+    cbz $adl, .Lpoly_hash_ad_ret
+
+    eor $T0.16b, $T0.16b, $T0.16b // Use T0 to load the AAD
+    sub $adl, $adl, #1
+
+.Lpoly_hash_tail_16_compose:
+        ext  $T0.16b, $T0.16b, $T0.16b, #15
+        ldrb $t0w, [$adp, $adl]
+        mov  $T0.b[0], $t0w
+        subs $adl, $adl, #1
+        b.ge .Lpoly_hash_tail_16_compose
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+$code.=<<___;
+
+.Lpoly_hash_ad_ret:
+    ret
+    .cfi_endproc
+.size .Lpoly_hash_ad_internal, .-.Lpoly_hash_ad_internal
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_seal(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *seal_data);
+//
+.globl  chacha20_poly1305_seal
+.type   chacha20_poly1305_seal,%function
+.align  6
+chacha20_poly1305_seal:
+    AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+    stp x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset 80
+.cfi_offset w30, -72
+.cfi_offset w29, -80
+    mov x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+    stp d8, d9, [sp, #16]
+    stp d10, d11, [sp, #32]
+    stp d12, d13, [sp, #48]
+    stp d14, d15, [sp, #64]
+.cfi_offset b15, -8
+.cfi_offset b14, -16
+.cfi_offset b13, -24
+.cfi_offset b12, -32
+.cfi_offset b11, -40
+.cfi_offset b10, -48
+.cfi_offset b9, -56
+.cfi_offset b8, -64
+
+    adrp $t0, :pg_hi21:.Lchacha20_consts
+    add  $t0, $t0, :lo12:.Lchacha20_consts
+
+    ld1 {$CONSTS.16b - $CLAMP.16b}, [$t0] // Load the CONSTS, INC, ROL8 and CLAMP values
+    ld1 {$B_STORE.16b - $D_STORE.16b}, [$keyp]
+
+    mov $one, #1 // Prepare the Poly1305 state
+    mov $acc0, #0
+    mov $acc1, #0
+    mov $acc2, #0
+
+    ldr $t1, [$keyp, #56]   // The total cipher text length includes extra_in_len
+    add $t1, $t1, $inl
+    mov $LEN_STORE.d[0], $adl  // Store the input and aad lengths
+    mov $LEN_STORE.d[1], $t1
+
+    cmp $inl, #128
+    b.le .Lseal_128 // Optimization for smaller buffers
+
+    // Initially we prepare 5 ChaCha20 blocks. Four to encrypt up to 4 blocks (256 bytes) of plaintext,
+    // and one for the Poly1305 R and S keys. The first four blocks (A0-A3..D0-D3) are computed vertically,
+    // the fifth block (A4-D4) horizontally.
+    ld4r {$A0.4s-$A3.4s}, [$t0]
+    mov $A4.16b, $CONSTS.16b
+
+    ld4r {$B0.4s-$B3.4s}, [$keyp], #16
+    mov $B4.16b, $B_STORE.16b
+
+    ld4r {$C0.4s-$C3.4s}, [$keyp], #16
+    mov $C4.16b, $C_STORE.16b
+
+    ld4r {$D0.4s-$D3.4s}, [$keyp]
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $D4.16b, $D_STORE.16b
+
+    sub $keyp, $keyp, #32
+
+    mov  $itr1, #10
+
+.align 5
+.Lseal_init_rounds:
+___
+        &chacha_qr_x5("left");
+        &chacha_qr_x5("right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+    b.hi .Lseal_init_rounds
+
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $t0, #4
+    dup $T0.4s, $t0w
+    add $INC.4s, $INC.4s, $T0.4s
+
+    zip1 $T0.4s, $A0.4s, $A1.4s
+    zip2 $T1.4s, $A0.4s, $A1.4s
+    zip1 $T2.4s, $A2.4s, $A3.4s
+    zip2 $T3.4s, $A2.4s, $A3.4s
+
+    zip1 $A0.2d, $T0.2d, $T2.2d
+    zip2 $A1.2d, $T0.2d, $T2.2d
+    zip1 $A2.2d, $T1.2d, $T3.2d
+    zip2 $A3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $B0.4s, $B1.4s
+    zip2 $T1.4s, $B0.4s, $B1.4s
+    zip1 $T2.4s, $B2.4s, $B3.4s
+    zip2 $T3.4s, $B2.4s, $B3.4s
+
+    zip1 $B0.2d, $T0.2d, $T2.2d
+    zip2 $B1.2d, $T0.2d, $T2.2d
+    zip1 $B2.2d, $T1.2d, $T3.2d
+    zip2 $B3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $C0.4s, $C1.4s
+    zip2 $T1.4s, $C0.4s, $C1.4s
+    zip1 $T2.4s, $C2.4s, $C3.4s
+    zip2 $T3.4s, $C2.4s, $C3.4s
+
+    zip1 $C0.2d, $T0.2d, $T2.2d
+    zip2 $C1.2d, $T0.2d, $T2.2d
+    zip1 $C2.2d, $T1.2d, $T3.2d
+    zip2 $C3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $D0.4s, $D1.4s
+    zip2 $T1.4s, $D0.4s, $D1.4s
+    zip1 $T2.4s, $D2.4s, $D3.4s
+    zip2 $T3.4s, $D2.4s, $D3.4s
+
+    zip1 $D0.2d, $T0.2d, $T2.2d
+    zip2 $D1.2d, $T0.2d, $T2.2d
+    zip1 $D2.2d, $T1.2d, $T3.2d
+    zip2 $D3.2d, $T1.2d, $T3.2d
+
+    add $A4.4s, $A4.4s, $CONSTS.4s
+    add $B4.4s, $B4.4s, $B_STORE.4s
+    and $A4.16b, $A4.16b, $CLAMP.16b
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+
+    add $A2.4s, $A2.4s, $CONSTS.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+    add $C2.4s, $C2.4s, $C_STORE.4s
+    add $D2.4s, $D2.4s, $D_STORE.4s
+
+    add $A3.4s, $A3.4s, $CONSTS.4s
+    add $B3.4s, $B3.4s, $B_STORE.4s
+    add $C3.4s, $C3.4s, $C_STORE.4s
+    add $D3.4s, $D3.4s, $D_STORE.4s
+
+    mov $r0, $A4.d[0] // Move the R key to GPRs
+    mov $r1, $A4.d[1]
+    mov $S_STORE.16b, $B4.16b // Store the S key
+
+    bl  .Lpoly_hash_ad_internal
+
+    mov $adp, $oup
+    cmp $inl, #256
+    b.le .Lseal_tail
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A0.16b
+    eor $T1.16b, $T1.16b, $B0.16b
+    eor $T2.16b, $T2.16b, $C0.16b
+    eor $T3.16b, $T3.16b, $D0.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A1.16b
+    eor $T1.16b, $T1.16b, $B1.16b
+    eor $T2.16b, $T2.16b, $C1.16b
+    eor $T3.16b, $T3.16b, $D1.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A2.16b
+    eor $T1.16b, $T1.16b, $B2.16b
+    eor $T2.16b, $T2.16b, $C2.16b
+    eor $T3.16b, $T3.16b, $D2.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A3.16b
+    eor $T1.16b, $T1.16b, $B3.16b
+    eor $T2.16b, $T2.16b, $C3.16b
+    eor $T3.16b, $T3.16b, $D3.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #256
+
+    mov $itr1, #4 // In the first run of the loop we need to hash 256 bytes, therefore we hash one block for the first 4 rounds
+    mov $itr2, #6 // and two blocks for the remaining 6, for a total of (1 * 4 + 2 * 6) * 16 = 256
+
+.Lseal_main_loop:
+    adrp $t0, :pg_hi21:.Lchacha20_consts
+    add  $t0, $t0, :lo12:.Lchacha20_consts
+
+    ld4r {$A0.4s-$A3.4s}, [$t0]
+    mov $A4.16b, $CONSTS.16b
+
+    ld4r {$B0.4s-$B3.4s}, [$keyp], #16
+    mov $B4.16b, $B_STORE.16b
+
+    ld4r {$C0.4s-$C3.4s}, [$keyp], #16
+    mov $C4.16b, $C_STORE.16b
+
+    ld4r {$D0.4s-$D3.4s}, [$keyp]
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $D4.16b, $D_STORE.16b
+
+    eor $T0.16b, $T0.16b, $T0.16b //zero
+    not $T1.16b, $T0.16b // -1
+    sub $T1.4s, $INC.4s, $T1.4s // Add +1
+    ext $T0.16b, $T1.16b, $T0.16b, #12 // Get the last element (counter)
+    add $D4.4s, $D4.4s, $T0.4s
+
+    sub $keyp, $keyp, #32
+.align 5
+.Lseal_main_loop_rounds:
+___
+        &chacha_qr_x5("left");
+        &poly_add($adp);
+        &poly_mul();
+        &chacha_qr_x5("right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+        b.ge .Lseal_main_loop_rounds
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+        subs $itr2, $itr2, #1
+        b.gt .Lseal_main_loop_rounds
+
+    eor $T0.16b, $T0.16b, $T0.16b //zero
+    not $T1.16b, $T0.16b // -1
+    sub $T1.4s, $INC.4s, $T1.4s // Add +1
+    ext $T0.16b, $T1.16b, $T0.16b, #12 // Get the last element (counter)
+    add $D4.4s, $D4.4s, $T0.4s
+
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $t0, #5
+    dup $T0.4s, $t0w
+    add $INC.4s, $INC.4s, $T0.4s
+
+    zip1 $T0.4s, $A0.4s, $A1.4s
+    zip2 $T1.4s, $A0.4s, $A1.4s
+    zip1 $T2.4s, $A2.4s, $A3.4s
+    zip2 $T3.4s, $A2.4s, $A3.4s
+
+    zip1 $A0.2d, $T0.2d, $T2.2d
+    zip2 $A1.2d, $T0.2d, $T2.2d
+    zip1 $A2.2d, $T1.2d, $T3.2d
+    zip2 $A3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $B0.4s, $B1.4s
+    zip2 $T1.4s, $B0.4s, $B1.4s
+    zip1 $T2.4s, $B2.4s, $B3.4s
+    zip2 $T3.4s, $B2.4s, $B3.4s
+
+    zip1 $B0.2d, $T0.2d, $T2.2d
+    zip2 $B1.2d, $T0.2d, $T2.2d
+    zip1 $B2.2d, $T1.2d, $T3.2d
+    zip2 $B3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $C0.4s, $C1.4s
+    zip2 $T1.4s, $C0.4s, $C1.4s
+    zip1 $T2.4s, $C2.4s, $C3.4s
+    zip2 $T3.4s, $C2.4s, $C3.4s
+
+    zip1 $C0.2d, $T0.2d, $T2.2d
+    zip2 $C1.2d, $T0.2d, $T2.2d
+    zip1 $C2.2d, $T1.2d, $T3.2d
+    zip2 $C3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $D0.4s, $D1.4s
+    zip2 $T1.4s, $D0.4s, $D1.4s
+    zip1 $T2.4s, $D2.4s, $D3.4s
+    zip2 $T3.4s, $D2.4s, $D3.4s
+
+    zip1 $D0.2d, $T0.2d, $T2.2d
+    zip2 $D1.2d, $T0.2d, $T2.2d
+    zip1 $D2.2d, $T1.2d, $T3.2d
+    zip2 $D3.2d, $T1.2d, $T3.2d
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+
+    add $A2.4s, $A2.4s, $CONSTS.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+    add $C2.4s, $C2.4s, $C_STORE.4s
+    add $D2.4s, $D2.4s, $D_STORE.4s
+
+    add $A3.4s, $A3.4s, $CONSTS.4s
+    add $B3.4s, $B3.4s, $B_STORE.4s
+    add $C3.4s, $C3.4s, $C_STORE.4s
+    add $D3.4s, $D3.4s, $D_STORE.4s
+
+    add $A4.4s, $A4.4s, $CONSTS.4s
+    add $B4.4s, $B4.4s, $B_STORE.4s
+    add $C4.4s, $C4.4s, $C_STORE.4s
+    add $D4.4s, $D4.4s, $D_STORE.4s
+
+    cmp $inl, #320
+    b.le .Lseal_tail
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A0.16b
+    eor $T1.16b, $T1.16b, $B0.16b
+    eor $T2.16b, $T2.16b, $C0.16b
+    eor $T3.16b, $T3.16b, $D0.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A1.16b
+    eor $T1.16b, $T1.16b, $B1.16b
+    eor $T2.16b, $T2.16b, $C1.16b
+    eor $T3.16b, $T3.16b, $D1.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A2.16b
+    eor $T1.16b, $T1.16b, $B2.16b
+    eor $T2.16b, $T2.16b, $C2.16b
+    eor $T3.16b, $T3.16b, $D2.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A3.16b
+    eor $T1.16b, $T1.16b, $B3.16b
+    eor $T2.16b, $T2.16b, $C3.16b
+    eor $T3.16b, $T3.16b, $D3.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A4.16b
+    eor $T1.16b, $T1.16b, $B4.16b
+    eor $T2.16b, $T2.16b, $C4.16b
+    eor $T3.16b, $T3.16b, $D4.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #320
+
+    mov $itr1, #0
+    mov $itr2, #10 // For the remainder of the loop we always hash and encrypt 320 bytes per iteration
+
+    b .Lseal_main_loop
+
+.Lseal_tail:
+    // This part of the function handles the storage and authentication of the last [0,320) bytes
+    // We assume A0-A4 ... D0-D4 hold at least inl (320 max) bytes of the stream data.
+    cmp $inl, #64
+    b.lt .Lseal_tail_64
+
+    // Store and authenticate 64B blocks per iteration
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+
+    eor $T0.16b, $T0.16b, $A0.16b
+    eor $T1.16b, $T1.16b, $B0.16b
+    eor $T2.16b, $T2.16b, $C0.16b
+    eor $T3.16b, $T3.16b, $D0.16b
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+    &poly_add_vec($T1);
+    &poly_mul();
+    &poly_add_vec($T2);
+    &poly_mul();
+    &poly_add_vec($T3);
+    &poly_mul();
+$code.=<<___;
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+    sub $inl, $inl, #64
+
+    // Shift the state left by 64 bytes for the next iteration of the loop
+    mov $A0.16b, $A1.16b
+    mov $B0.16b, $B1.16b
+    mov $C0.16b, $C1.16b
+    mov $D0.16b, $D1.16b
+
+    mov $A1.16b, $A2.16b
+    mov $B1.16b, $B2.16b
+    mov $C1.16b, $C2.16b
+    mov $D1.16b, $D2.16b
+
+    mov $A2.16b, $A3.16b
+    mov $B2.16b, $B3.16b
+    mov $C2.16b, $C3.16b
+    mov $D2.16b, $D3.16b
+
+    mov $A3.16b, $A4.16b
+    mov $B3.16b, $B4.16b
+    mov $C3.16b, $C4.16b
+    mov $D3.16b, $D4.16b
+
+    b .Lseal_tail
+
+.Lseal_tail_64:
+    ldp $adp, $adl, [$keyp, #48] // extra_in_len and extra_in_ptr
+
+    // Here we handle the last [0,64) bytes of plaintext
+    cmp $inl, #16
+    b.lt .Lseal_tail_16
+    // Each iteration encrypt and authenticate a 16B block
+    ld1 {$T0.16b}, [$inp], #16
+    eor $T0.16b, $T0.16b, $A0.16b
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+$code.=<<___;
+    st1 {$T0.16b}, [$oup], #16
+
+    sub $inl, $inl, #16
+
+    // Shift the state left by 16 bytes for the next iteration of the loop
+    mov $A0.16b, $B0.16b
+    mov $B0.16b, $C0.16b
+    mov $C0.16b, $D0.16b
+
+    b .Lseal_tail_64
+
+.Lseal_tail_16:
+    // Here we handle the last [0,16) bytes of ciphertext that require a padded block
+    cbz $inl, .Lseal_hash_extra
+
+    eor $T0.16b, $T0.16b, $T0.16b // Use T0 to load the plaintext/extra in
+    eor $T1.16b, $T1.16b, $T1.16b // Use T1 to generate an AND mask that will only mask the ciphertext bytes
+    not $T2.16b, $T0.16b
+
+    mov $itr1, $inl
+    add $inp, $inp, $inl
+
+    cbz $adl, .Lseal_tail_16_compose // No extra data to pad with, zero padding
+
+    mov $itr2, #16          // We need to load some extra_in first for padding
+    sub $itr2, $itr2, $inl
+    cmp $adl, $itr2
+    csel $itr2, $adl, $itr2, lt // Load the minimum of extra_in_len and the amount needed to fill the register
+    mov $t1, $itr2
+    add $adp, $adp, $itr2
+    sub $adl, $adl, $itr2
+
+.Lseal_tail16_compose_extra_in:
+        ext  $T0.16b, $T0.16b, $T0.16b, #15
+        ldrb $t0w, [$adp, #-1]!
+        mov  $T0.b[0], $t0w
+        subs $itr2, $itr2, #1
+        b.gt .Lseal_tail16_compose_extra_in
+
+    add $adp, $adp, $t1
+
+.Lseal_tail_16_compose:
+        ext  $T0.16b, $T0.16b, $T0.16b, #15
+        ldrb $t0w, [$inp, #-1]!
+        mov  $T0.b[0], $t0w
+        ext  $T1.16b, $T2.16b, $T1.16b, #15
+        subs $inl, $inl, #1
+        b.gt .Lseal_tail_16_compose
+
+    and $A0.16b, $A0.16b, $T1.16b
+    eor $T0.16b, $T0.16b, $A0.16b
+    mov $T1.16b, $T0.16b
+
+.Lseal_tail_16_store:
+        umov $t0w, $T0.b[0]
+        strb $t0w, [$oup], #1
+        ext  $T0.16b, $T0.16b, $T0.16b, #1
+        subs $itr1, $itr1, #1
+        b.gt .Lseal_tail_16_store
+
+    // Hash in the final ct block concatenated with extra_in
+___
+    &poly_add_vec($T1);
+    &poly_mul();
+$code.=<<___;
+
+.Lseal_hash_extra:
+    cbz $adl, .Lseal_finalize
+
+.Lseal_hash_extra_loop:
+    cmp $adl, #16
+    b.lt .Lseal_hash_extra_tail
+    ld1 {$T0.16b}, [$adp], #16
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+$code.=<<___;
+    sub $adl, $adl, #16
+    b .Lseal_hash_extra_loop
+
+.Lseal_hash_extra_tail:
+    cbz $adl, .Lseal_finalize
+    eor $T0.16b, $T0.16b, $T0.16b // Use T0 to load the remaining extra ciphertext
+    add $adp, $adp, $adl
+
+.Lseal_hash_extra_load:
+        ext  $T0.16b, $T0.16b, $T0.16b, #15
+        ldrb $t0w, [$adp, #-1]!
+        mov  $T0.b[0], $t0w
+        subs $adl, $adl, #1
+        b.gt .Lseal_hash_extra_load
+
+    // Hash in the final padded extra_in blcok
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+$code.=<<___;
+
+.Lseal_finalize:
+___
+    &poly_add_vec($LEN_STORE);
+    &poly_mul();
+$code.=<<___;
+    // Final reduction step
+    sub  $t1, xzr, $one
+    orr  $t2, xzr, #3
+    subs $t0, $acc0, #-5
+    sbcs $t1, $acc1, $t1
+    sbcs $t2, $acc2, $t2
+    csel $acc0, $t0, $acc0, cs
+    csel $acc1, $t1, $acc1, cs
+    csel $acc2, $t2, $acc2, cs
+___
+    &poly_add_vec($S_STORE);
+$code.=<<___;
+
+    stp  $acc0, $acc1, [$keyp]
+
+    ldp d8, d9, [sp, #16]
+    ldp d10, d11, [sp, #32]
+    ldp d12, d13, [sp, #48]
+    ldp d14, d15, [sp, #64]
+.cfi_restore b15
+.cfi_restore b14
+.cfi_restore b13
+.cfi_restore b12
+.cfi_restore b11
+.cfi_restore b10
+.cfi_restore b9
+.cfi_restore b8
+    ldp x29, x30, [sp], 80
+.cfi_restore w29
+.cfi_restore w30
+.cfi_def_cfa_offset 0
+    AARCH64_VALIDATE_LINK_REGISTER
+    ret
+
+.Lseal_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+    eor $INC.16b, $INC.16b, $INC.16b
+    mov $t0, #1
+    mov $INC.s[0], $t0w
+    mov $A0.16b, $CONSTS.16b
+    mov $A1.16b, $CONSTS.16b
+    mov $A2.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $B1.16b, $B_STORE.16b
+    mov $B2.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $C1.16b, $C_STORE.16b
+    mov $C2.16b, $C_STORE.16b
+    mov $D2.16b, $D_STORE.16b
+    add $D0.4s, $D2.4s, $INC.4s
+    add $D1.4s, $D0.4s, $INC.4s
+
+    mov  $itr1, #10
+
+.Lseal_128_rounds:
+___
+        &chacha_qr_x3("left");
+        &chacha_qr_x3("right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+    b.hi .Lseal_128_rounds
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $A2.4s, $A2.4s, $CONSTS.4s
+
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+
+    // Only the first 32 bytes of the third block (counter = 0) are needed,
+    // so skip updating $C2 and $D2.
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+
+    add $D_STORE.4s, $D_STORE.4s, $INC.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+    add $D_STORE.4s, $D_STORE.4s, $INC.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+
+    and $A2.16b, $A2.16b, $CLAMP.16b
+    mov $r0, $A2.d[0] // Move the R key to GPRs
+    mov $r1, $A2.d[1]
+    mov $S_STORE.16b, $B2.16b // Store the S key
+
+    bl  .Lpoly_hash_ad_internal
+    b   .Lseal_tail
+.cfi_endproc
+.size chacha20_poly1305_seal,.-chacha20_poly1305_seal
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_open(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *aead_data);
+//
+.globl	chacha20_poly1305_open
+.type	chacha20_poly1305_open,%function
+.align	6
+chacha20_poly1305_open:
+    AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+    stp x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset 80
+.cfi_offset w30, -72
+.cfi_offset w29, -80
+    mov x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+    stp	d8, d9, [sp, #16]
+    stp	d10, d11, [sp, #32]
+    stp	d12, d13, [sp, #48]
+    stp	d14, d15, [sp, #64]
+.cfi_offset b15, -8
+.cfi_offset b14, -16
+.cfi_offset b13, -24
+.cfi_offset b12, -32
+.cfi_offset b11, -40
+.cfi_offset b10, -48
+.cfi_offset b9, -56
+.cfi_offset b8, -64
+
+    adrp $t0, :pg_hi21:.Lchacha20_consts
+    add  $t0, $t0, :lo12:.Lchacha20_consts
+
+    ld1 {$CONSTS.16b - $CLAMP.16b}, [$t0] // Load the CONSTS, INC, ROL8 and CLAMP values
+    ld1 {$B_STORE.16b - $D_STORE.16b}, [$keyp]
+
+    mov $one, #1 // Prepare the Poly1305 state
+    mov $acc0, #0
+    mov $acc1, #0
+    mov $acc2, #0
+
+    mov $LEN_STORE.d[0], $adl  // Store the input and aad lengths
+    mov $LEN_STORE.d[1], $inl
+
+    cmp $inl, #128
+    b.le .Lopen_128 // Optimization for smaller buffers
+
+    // Initially we prepare a single ChaCha20 block for the Poly1305 R and S keys
+    mov $A0.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $D0.16b, $D_STORE.16b
+
+    mov  $itr1, #10
+
+.align 5
+.Lopen_init_rounds:
+___
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "left");
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+    b.hi .Lopen_init_rounds
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+
+    and $A0.16b, $A0.16b, $CLAMP.16b
+    mov $r0, $A0.d[0] // Move the R key to GPRs
+    mov $r1, $A0.d[1]
+    mov $S_STORE.16b, $B0.16b // Store the S key
+
+    bl  .Lpoly_hash_ad_internal
+
+.Lopen_ad_done:
+    mov $adp, $inp
+
+// Each iteration of the loop hash 320 bytes, and prepare stream for 320 bytes
+.Lopen_main_loop:
+
+    cmp $inl, #192
+    b.lt .Lopen_tail
+
+    adrp $t0, :pg_hi21:.Lchacha20_consts
+    add  $t0, $t0, :lo12:.Lchacha20_consts
+
+    ld4r {$A0.4s-$A3.4s}, [$t0]
+    mov $A4.16b, $CONSTS.16b
+
+    ld4r {$B0.4s-$B3.4s}, [$keyp], #16
+    mov $B4.16b, $B_STORE.16b
+
+    ld4r {$C0.4s-$C3.4s}, [$keyp], #16
+    mov $C4.16b, $C_STORE.16b
+
+    ld4r {$D0.4s-$D3.4s}, [$keyp]
+    sub $keyp, $keyp, #32
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $D4.16b, $D_STORE.16b
+
+    eor $T0.16b, $T0.16b, $T0.16b //zero
+    not $T1.16b, $T0.16b // -1
+    sub $T1.4s, $INC.4s, $T1.4s // Add +1
+    ext $T0.16b, $T1.16b, $T0.16b, #12 // Get the last element (counter)
+    add $D4.4s, $D4.4s, $T0.4s
+
+    lsr $adl, $inl, #4 // How many whole blocks we have to hash, will always be at least 12
+    sub $adl, $adl, #10
+
+    mov $itr2, #10
+    subs $itr1, $itr2, $adl
+    subs $itr1, $itr2, $adl // itr1 can be negative if we have more than 320 bytes to hash
+    csel $itr2, $itr2, $adl, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are full
+
+    cbz $itr2, .Lopen_main_loop_rounds_short
+
+.align 5
+.Lopen_main_loop_rounds:
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+.Lopen_main_loop_rounds_short:
+___
+        &chacha_qr_x5("left");
+        &poly_add($adp);
+        &poly_mul();
+        &chacha_qr_x5("right");
+$code.=<<___;
+        subs $itr2, $itr2, #1
+        b.gt .Lopen_main_loop_rounds
+        subs $itr1, $itr1, #1
+        b.ge .Lopen_main_loop_rounds_short
+___
+$code.=<<___;
+
+    eor $T0.16b, $T0.16b, $T0.16b //zero
+    not $T1.16b, $T0.16b // -1
+    sub $T1.4s, $INC.4s, $T1.4s // Add +1
+    ext $T0.16b, $T1.16b, $T0.16b, #12 // Get the last element (counter)
+    add $D4.4s, $D4.4s, $T0.4s
+
+    add $D0.4s, $D0.4s, $INC.4s
+    mov $t0, #5
+    dup $T0.4s, $t0w
+    add $INC.4s, $INC.4s, $T0.4s
+
+    zip1 $T0.4s, $A0.4s, $A1.4s
+    zip2 $T1.4s, $A0.4s, $A1.4s
+    zip1 $T2.4s, $A2.4s, $A3.4s
+    zip2 $T3.4s, $A2.4s, $A3.4s
+
+    zip1 $A0.2d, $T0.2d, $T2.2d
+    zip2 $A1.2d, $T0.2d, $T2.2d
+    zip1 $A2.2d, $T1.2d, $T3.2d
+    zip2 $A3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $B0.4s, $B1.4s
+    zip2 $T1.4s, $B0.4s, $B1.4s
+    zip1 $T2.4s, $B2.4s, $B3.4s
+    zip2 $T3.4s, $B2.4s, $B3.4s
+
+    zip1 $B0.2d, $T0.2d, $T2.2d
+    zip2 $B1.2d, $T0.2d, $T2.2d
+    zip1 $B2.2d, $T1.2d, $T3.2d
+    zip2 $B3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $C0.4s, $C1.4s
+    zip2 $T1.4s, $C0.4s, $C1.4s
+    zip1 $T2.4s, $C2.4s, $C3.4s
+    zip2 $T3.4s, $C2.4s, $C3.4s
+
+    zip1 $C0.2d, $T0.2d, $T2.2d
+    zip2 $C1.2d, $T0.2d, $T2.2d
+    zip1 $C2.2d, $T1.2d, $T3.2d
+    zip2 $C3.2d, $T1.2d, $T3.2d
+
+    zip1 $T0.4s, $D0.4s, $D1.4s
+    zip2 $T1.4s, $D0.4s, $D1.4s
+    zip1 $T2.4s, $D2.4s, $D3.4s
+    zip2 $T3.4s, $D2.4s, $D3.4s
+
+    zip1 $D0.2d, $T0.2d, $T2.2d
+    zip2 $D1.2d, $T0.2d, $T2.2d
+    zip1 $D2.2d, $T1.2d, $T3.2d
+    zip2 $D3.2d, $T1.2d, $T3.2d
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+
+    add $A2.4s, $A2.4s, $CONSTS.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+    add $C2.4s, $C2.4s, $C_STORE.4s
+    add $D2.4s, $D2.4s, $D_STORE.4s
+
+    add $A3.4s, $A3.4s, $CONSTS.4s
+    add $B3.4s, $B3.4s, $B_STORE.4s
+    add $C3.4s, $C3.4s, $C_STORE.4s
+    add $D3.4s, $D3.4s, $D_STORE.4s
+
+    add $A4.4s, $A4.4s, $CONSTS.4s
+    add $B4.4s, $B4.4s, $B_STORE.4s
+    add $C4.4s, $C4.4s, $C_STORE.4s
+    add $D4.4s, $D4.4s, $D_STORE.4s
+
+    // We can always safely store 192 bytes
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A0.16b
+    eor $T1.16b, $T1.16b, $B0.16b
+    eor $T2.16b, $T2.16b, $C0.16b
+    eor $T3.16b, $T3.16b, $D0.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A1.16b
+    eor $T1.16b, $T1.16b, $B1.16b
+    eor $T2.16b, $T2.16b, $C1.16b
+    eor $T3.16b, $T3.16b, $D1.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A2.16b
+    eor $T1.16b, $T1.16b, $B2.16b
+    eor $T2.16b, $T2.16b, $C2.16b
+    eor $T3.16b, $T3.16b, $D2.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #192
+
+    mov $A0.16b, $A3.16b
+    mov $B0.16b, $B3.16b
+    mov $C0.16b, $C3.16b
+    mov $D0.16b, $D3.16b
+
+    cmp $inl, #64
+    b.lt .Lopen_tail_64_store
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A3.16b
+    eor $T1.16b, $T1.16b, $B3.16b
+    eor $T2.16b, $T2.16b, $C3.16b
+    eor $T3.16b, $T3.16b, $D3.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #64
+
+    mov $A0.16b, $A4.16b
+    mov $B0.16b, $B4.16b
+    mov $C0.16b, $C4.16b
+    mov $D0.16b, $D4.16b
+
+    cmp $inl, #64
+    b.lt .Lopen_tail_64_store
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+    eor $T0.16b, $T0.16b, $A4.16b
+    eor $T1.16b, $T1.16b, $B4.16b
+    eor $T2.16b, $T2.16b, $C4.16b
+    eor $T3.16b, $T3.16b, $D4.16b
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #64
+    b .Lopen_main_loop
+
+.Lopen_tail:
+
+    cbz $inl, .Lopen_finalize
+
+    lsr $adl, $inl, #4 // How many whole blocks we have to hash
+
+    cmp $inl, #64
+    b.le .Lopen_tail_64
+    cmp $inl, #128
+    b.le .Lopen_tail_128
+
+.Lopen_tail_192:
+     // We need three more blocks
+    mov $A0.16b, $CONSTS.16b
+    mov $A1.16b, $CONSTS.16b
+    mov $A2.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $B1.16b, $B_STORE.16b
+    mov $B2.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $C1.16b, $C_STORE.16b
+    mov $C2.16b, $C_STORE.16b
+    mov $D0.16b, $D_STORE.16b
+    mov $D1.16b, $D_STORE.16b
+    mov $D2.16b, $D_STORE.16b
+    eor $T3.16b, $T3.16b, $T3.16b
+    eor $T1.16b, $T1.16b, $T1.16b
+    ins $T3.s[0], $INC.s[0]
+    ins $T1.d[0], $one
+
+    add $T2.4s, $T3.4s, $T1.4s
+    add $T1.4s, $T2.4s, $T1.4s
+
+    add $D0.4s, $D0.4s, $T1.4s
+    add $D1.4s, $D1.4s, $T3.4s
+    add $D2.4s, $D2.4s, $T2.4s
+
+    mov $itr2, #10
+    subs $itr1, $itr2, $adl // itr1 can be negative if we have more than 160 bytes to hash
+    csel $itr2, $itr2, $adl, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are hashing
+    sub $adl, $adl, $itr2
+
+    cbz $itr2, .Lopen_tail_192_rounds_no_hash
+
+.Lopen_tail_192_rounds:
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+.Lopen_tail_192_rounds_no_hash:
+___
+        &chacha_qr_x3("left");
+        &chacha_qr_x3("right");
+$code.=<<___;
+        subs $itr2, $itr2, #1
+        b.gt .Lopen_tail_192_rounds
+        subs $itr1, $itr1, #1
+        b.ge .Lopen_tail_192_rounds_no_hash
+
+    // We hashed 160 bytes at most, may still have 32 bytes left
+.Lopen_tail_192_hash:
+    cbz $adl, .Lopen_tail_192_hash_done
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+    sub $adl, $adl, #1
+    b .Lopen_tail_192_hash
+
+.Lopen_tail_192_hash_done:
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $A2.4s, $A2.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+    add $C2.4s, $C2.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+    add $D2.4s, $D2.4s, $D_STORE.4s
+
+    add $D0.4s, $D0.4s, $T1.4s
+    add $D1.4s, $D1.4s, $T3.4s
+    add $D2.4s, $D2.4s, $T2.4s
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+
+    eor $T0.16b, $T0.16b, $A1.16b
+    eor $T1.16b, $T1.16b, $B1.16b
+    eor $T2.16b, $T2.16b, $C1.16b
+    eor $T3.16b, $T3.16b, $D1.16b
+
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+
+    eor $T0.16b, $T0.16b, $A2.16b
+    eor $T1.16b, $T1.16b, $B2.16b
+    eor $T2.16b, $T2.16b, $C2.16b
+    eor $T3.16b, $T3.16b, $D2.16b
+
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #128
+    b .Lopen_tail_64_store
+
+.Lopen_tail_128:
+     // We need two more blocks
+    mov $A0.16b, $CONSTS.16b
+    mov $A1.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $B1.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $C1.16b, $C_STORE.16b
+    mov $D0.16b, $D_STORE.16b
+    mov $D1.16b, $D_STORE.16b
+    eor $T3.16b, $T3.16b, $T3.16b
+    eor $T2.16b, $T2.16b, $T2.16b
+    ins $T3.s[0], $INC.s[0]
+    ins $T2.d[0], $one
+    add $T2.4s, $T2.4s, $T3.4s
+
+    add $D0.4s, $D0.4s, $T2.4s
+    add $D1.4s, $D1.4s, $T3.4s
+
+    mov $itr1, #10
+    sub $itr1, $itr1, $adl
+
+.Lopen_tail_128_rounds:
+___
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "left");
+        &chacha_qr($A1, $B1, $C1, $D1, $T0, "left");
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "right");
+        &chacha_qr($A1, $B1, $C1, $D1, $T0, "right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+        b.gt .Lopen_tail_128_rounds
+        cbz $adl, .Lopen_tail_128_rounds_done
+        subs $adl, $adl, #1
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+    b .Lopen_tail_128_rounds
+
+.Lopen_tail_128_rounds_done:
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+    add $D0.4s, $D0.4s, $T2.4s
+    add $D1.4s, $D1.4s, $T3.4s
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+
+    eor $T0.16b, $T0.16b, $A1.16b
+    eor $T1.16b, $T1.16b, $B1.16b
+    eor $T2.16b, $T2.16b, $C1.16b
+    eor $T3.16b, $T3.16b, $D1.16b
+
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+    sub $inl, $inl, #64
+
+    b .Lopen_tail_64_store
+
+.Lopen_tail_64:
+    // We just need a single block
+    mov $A0.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $D0.16b, $D_STORE.16b
+    eor $T3.16b, $T3.16b, $T3.16b
+    ins $T3.s[0], $INC.s[0]
+    add $D0.4s, $D0.4s, $T3.4s
+
+    mov $itr1, #10
+    sub $itr1, $itr1, $adl
+
+.Lopen_tail_64_rounds:
+___
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "left");
+        &chacha_qr($A0, $B0, $C0, $D0, $T0, "right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+        b.gt .Lopen_tail_64_rounds
+        cbz $adl, .Lopen_tail_64_rounds_done
+        subs $adl, $adl, #1
+___
+        &poly_add($adp);
+        &poly_mul();
+$code.=<<___;
+    b .Lopen_tail_64_rounds
+
+.Lopen_tail_64_rounds_done:
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+    add $D0.4s, $D0.4s, $T3.4s
+
+.Lopen_tail_64_store:
+    cmp $inl, #16
+    b.lt .Lopen_tail_16
+
+    ld1 {$T0.16b}, [$inp], #16
+    eor $T0.16b, $T0.16b, $A0.16b
+    st1 {$T0.16b}, [$oup], #16
+    mov $A0.16b, $B0.16b
+    mov $B0.16b, $C0.16b
+    mov $C0.16b, $D0.16b
+    sub $inl, $inl, #16
+    b .Lopen_tail_64_store
+
+.Lopen_tail_16:
+    // Here we handle the last [0,16) bytes that require a padded block
+    cbz $inl, .Lopen_finalize
+
+    eor $T0.16b, $T0.16b, $T0.16b // Use T0 to load the ciphertext
+    eor $T1.16b, $T1.16b, $T1.16b // Use T1 to generate an AND mask
+    not $T2.16b, $T0.16b
+
+    add $itr2, $inp, $inl
+    mov $itr1, $inl
+
+.Lopen_tail_16_compose:
+    ext  $T0.16b, $T0.16b, $T0.16b, #15
+    ldrb $t0w, [$itr2, #-1]!
+    mov  $T0.b[0], $t0w
+    ext  $T1.16b, $T2.16b, $T1.16b, #15
+    subs $inl, $inl, #1
+    b.gt .Lopen_tail_16_compose
+
+    and $T0.16b, $T0.16b, $T1.16b
+    // Hash in the final padded block
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+$code.=<<___;
+    eor $T0.16b, $T0.16b, $A0.16b
+
+.Lopen_tail_16_store:
+    umov $t0w, $T0.b[0]
+    strb $t0w, [$oup], #1
+    ext  $T0.16b, $T0.16b, $T0.16b, #1
+    subs $itr1, $itr1, #1
+    b.gt .Lopen_tail_16_store
+
+.Lopen_finalize:
+___
+    &poly_add_vec($LEN_STORE);
+    &poly_mul();
+$code.=<<___;
+    // Final reduction step
+    sub  $t1, xzr, $one
+    orr  $t2, xzr, #3
+    subs $t0, $acc0, #-5
+    sbcs $t1, $acc1, $t1
+    sbcs $t2, $acc2, $t2
+    csel $acc0, $t0, $acc0, cs
+    csel $acc1, $t1, $acc1, cs
+    csel $acc2, $t2, $acc2, cs
+___
+    &poly_add_vec($S_STORE);
+$code.=<<___;
+
+    stp  $acc0, $acc1, [$keyp]
+
+    ldp	d8, d9, [sp, #16]
+    ldp	d10, d11, [sp, #32]
+    ldp	d12, d13, [sp, #48]
+    ldp	d14, d15, [sp, #64]
+.cfi_restore b15
+.cfi_restore b14
+.cfi_restore b13
+.cfi_restore b12
+.cfi_restore b11
+.cfi_restore b10
+.cfi_restore b9
+.cfi_restore b8
+    ldp x29, x30, [sp], 80
+.cfi_restore w29
+.cfi_restore w30
+.cfi_def_cfa_offset 0
+    AARCH64_VALIDATE_LINK_REGISTER
+    ret
+
+.Lopen_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+    eor $INC.16b, $INC.16b, $INC.16b
+    mov $t0, #1
+    mov $INC.s[0], $t0w
+    mov $A0.16b, $CONSTS.16b
+    mov $A1.16b, $CONSTS.16b
+    mov $A2.16b, $CONSTS.16b
+    mov $B0.16b, $B_STORE.16b
+    mov $B1.16b, $B_STORE.16b
+    mov $B2.16b, $B_STORE.16b
+    mov $C0.16b, $C_STORE.16b
+    mov $C1.16b, $C_STORE.16b
+    mov $C2.16b, $C_STORE.16b
+    mov $D2.16b, $D_STORE.16b
+    add $D0.4s, $D2.4s, $INC.4s
+    add $D1.4s, $D0.4s, $INC.4s
+
+    mov  $itr1, #10
+
+.Lopen_128_rounds:
+___
+        &chacha_qr_x3("left");
+        &chacha_qr_x3("right");
+$code.=<<___;
+        subs $itr1, $itr1, #1
+    b.hi .Lopen_128_rounds
+
+    add $A0.4s, $A0.4s, $CONSTS.4s
+    add $A1.4s, $A1.4s, $CONSTS.4s
+    add $A2.4s, $A2.4s, $CONSTS.4s
+
+    add $B0.4s, $B0.4s, $B_STORE.4s
+    add $B1.4s, $B1.4s, $B_STORE.4s
+    add $B2.4s, $B2.4s, $B_STORE.4s
+
+    add $C0.4s, $C0.4s, $C_STORE.4s
+    add $C1.4s, $C1.4s, $C_STORE.4s
+
+    add $D_STORE.4s, $D_STORE.4s, $INC.4s
+    add $D0.4s, $D0.4s, $D_STORE.4s
+    add $D_STORE.4s, $D_STORE.4s, $INC.4s
+    add $D1.4s, $D1.4s, $D_STORE.4s
+
+    and $A2.16b, $A2.16b, $CLAMP.16b
+    mov $r0, $A2.d[0] // Move the R key to GPRs
+    mov $r1, $A2.d[1]
+    mov $S_STORE.16b, $B2.16b // Store the S key
+
+    bl  .Lpoly_hash_ad_internal
+
+.Lopen_128_store:
+    cmp $inl, #64
+    b.lt .Lopen_128_store_64
+
+    ld1 {$T0.16b - $T3.16b}, [$inp], #64
+
+___
+    &poly_add_vec($T0);
+    &poly_mul();
+    &poly_add_vec($T1);
+    &poly_mul();
+    &poly_add_vec($T2);
+    &poly_mul();
+    &poly_add_vec($T3);
+    &poly_mul();
+$code.=<<___;
+
+    eor $T0.16b, $T0.16b, $A0.16b
+    eor $T1.16b, $T1.16b, $B0.16b
+    eor $T2.16b, $T2.16b, $C0.16b
+    eor $T3.16b, $T3.16b, $D0.16b
+
+    st1 {$T0.16b - $T3.16b}, [$oup], #64
+
+    sub $inl, $inl, #64
+
+    mov $A0.16b, $A1.16b
+    mov $B0.16b, $B1.16b
+    mov $C0.16b, $C1.16b
+    mov $D0.16b, $D1.16b
+
+.Lopen_128_store_64:
+
+    lsr $adl, $inl, #4
+    mov $adp, $inp
+
+.Lopen_128_hash_64:
+    cbz $adl, .Lopen_tail_64_store
+___
+    &poly_add($adp);
+    &poly_mul();
+$code.=<<___;
+    sub $adl, $adl, #1
+    b .Lopen_128_hash_64
+.cfi_endproc
+.size chacha20_poly1305_open,.-chacha20_poly1305_open
+___
+}
+
+foreach (split("\n",$code)) {
+	s/\`([^\`]*)\`/eval $1/ge;
+
+	print $_,"\n";
+}
+close STDOUT or die "error closing STDOUT";
diff --git a/src/crypto/cipher_extra/derive_key.c b/src/crypto/cipher_extra/derive_key.c
index 45b4963..4b84c4e 100644
--- a/src/crypto/cipher_extra/derive_key.c
+++ b/src/crypto/cipher_extra/derive_key.c
@@ -69,12 +69,12 @@
                    unsigned count, uint8_t *key, uint8_t *iv) {
   EVP_MD_CTX c;
   uint8_t md_buf[EVP_MAX_MD_SIZE];
-  unsigned niv, nkey, addmd = 0;
+  unsigned addmd = 0;
   unsigned mds = 0, i;
   int rv = 0;
 
-  nkey = type->key_len;
-  niv = type->iv_len;
+  unsigned nkey = EVP_CIPHER_key_length(type);
+  unsigned niv = EVP_CIPHER_iv_length(type);
 
   assert(nkey <= EVP_MAX_KEY_LENGTH);
   assert(niv <= EVP_MAX_IV_LENGTH);
@@ -143,7 +143,7 @@
       break;
     }
   }
-  rv = type->key_len;
+  rv = EVP_CIPHER_key_length(type);
 
 err:
   EVP_MD_CTX_cleanup(&c);
diff --git a/src/crypto/cipher_extra/e_aesctrhmac.c b/src/crypto/cipher_extra/e_aesctrhmac.c
index 8c45c81..32b42d2 100644
--- a/src/crypto/cipher_extra/e_aesctrhmac.c
+++ b/src/crypto/cipher_extra/e_aesctrhmac.c
@@ -13,6 +13,9 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
 #include <openssl/aead.h>
+
+#include <assert.h>
+
 #include <openssl/cipher.h>
 #include <openssl/crypto.h>
 #include <openssl/err.h>
@@ -35,14 +38,12 @@
   SHA256_CTX outer_init_state;
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_ctr_hmac_sha256_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_ctr_hmac_sha256_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_ctr_hmac_sha256_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_ctr_hmac_sha256_ctx),
+              "AEAD state has insufficient alignment");
 
 static void hmac_init(SHA256_CTX *out_inner, SHA256_CTX *out_outer,
                       const uint8_t hmac_key[32]) {
diff --git a/src/crypto/cipher_extra/e_aesgcmsiv.c b/src/crypto/cipher_extra/e_aesgcmsiv.c
index d717572..15601e1 100644
--- a/src/crypto/cipher_extra/e_aesgcmsiv.c
+++ b/src/crypto/cipher_extra/e_aesgcmsiv.c
@@ -17,11 +17,11 @@
 #include <assert.h>
 
 #include <openssl/cipher.h>
-#include <openssl/cpu.h>
 #include <openssl/crypto.h>
 #include <openssl/err.h>
 
 #include "../fipsmodule/cipher/internal.h"
+#include "../internal.h"
 
 
 #define EVP_AEAD_AES_GCM_SIV_NONCE_LEN 12
@@ -42,13 +42,11 @@
 
 // The assembly code assumes 8-byte alignment of the EVP_AEAD_CTX's state, and
 // aligns to 16 bytes itself.
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) + 8 >=
-                          sizeof(struct aead_aes_gcm_siv_asm_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >= 8,
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) + 8 >=
+                  sizeof(struct aead_aes_gcm_siv_asm_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >= 8,
+              "AEAD state has insufficient alignment");
 
 // asm_ctx_from_ctx returns a 16-byte aligned context pointer from |ctx|.
 static struct aead_aes_gcm_siv_asm_ctx *asm_ctx_from_ctx(
@@ -262,17 +260,10 @@
     aesgcmsiv_polyval_horner(out_tag, auth_key, scratch, 1);
   }
 
-  union {
-    uint8_t c[16];
-    struct {
-      uint64_t ad;
-      uint64_t in;
-    } bitlens;
-  } length_block;
-
-  length_block.bitlens.ad = ad_len * 8;
-  length_block.bitlens.in = in_len * 8;
-  aesgcmsiv_polyval_horner(out_tag, auth_key, length_block.c, 1);
+  uint8_t length_block[16];
+  CRYPTO_store_u64_le(length_block, ad_len * 8);
+  CRYPTO_store_u64_le(length_block + 8, in_len * 8);
+  aesgcmsiv_polyval_horner(out_tag, auth_key, length_block, 1);
 
   for (size_t i = 0; i < 12; i++) {
     out_tag[i] ^= nonce[i];
@@ -289,18 +280,15 @@
     int is_128_bit, uint8_t *out, const uint8_t *in, size_t in_len,
     const uint8_t tag[16],
     const struct aead_aes_gcm_siv_asm_ctx *enc_key_expanded) {
-  alignas(16) union {
-    uint8_t c[16];
-    uint32_t u32[4];
-  } counter;
+  alignas(16) uint8_t counter[16];
   OPENSSL_memcpy(&counter, tag, sizeof(counter));
-  counter.c[15] |= 0x80;
-  counter.u32[0] += in_len / 16;
+  counter[15] |= 0x80;
+  CRYPTO_store_u32_le(counter, CRYPTO_load_u32_le(counter) + in_len / 16);
 
   if (is_128_bit) {
-    aes128gcmsiv_ecb_enc_block(&counter.c[0], &counter.c[0], enc_key_expanded);
+    aes128gcmsiv_ecb_enc_block(counter, counter, enc_key_expanded);
   } else {
-    aes256gcmsiv_ecb_enc_block(&counter.c[0], &counter.c[0], enc_key_expanded);
+    aes256gcmsiv_ecb_enc_block(counter, counter, enc_key_expanded);
   }
 
   const size_t last_bytes_offset = in_len & ~15;
@@ -308,7 +296,7 @@
   uint8_t *last_bytes_out = &out[last_bytes_offset];
   const uint8_t *last_bytes_in = &in[last_bytes_offset];
   for (size_t i = 0; i < last_bytes_len; i++) {
-    last_bytes_out[i] = last_bytes_in[i] ^ counter.c[i];
+    last_bytes_out[i] = last_bytes_in[i] ^ counter[i];
   }
 }
 
@@ -489,18 +477,11 @@
                              scratch, 1);
   }
 
-  union {
-    uint8_t c[16];
-    struct {
-      uint64_t ad;
-      uint64_t in;
-    } bitlens;
-  } length_block;
-
-  length_block.bitlens.ad = ad_len * 8;
-  length_block.bitlens.in = plaintext_len * 8;
+  uint8_t length_block[16];
+  CRYPTO_store_u64_le(length_block, ad_len * 8);
+  CRYPTO_store_u64_le(length_block + 8, plaintext_len * 8);
   aesgcmsiv_polyval_horner(calculated_tag, (const uint8_t *)record_auth_key,
-                           length_block.c, 1);
+                           length_block, 1);
 
   for (size_t i = 0; i < 12; i++) {
     calculated_tag[i] ^= nonce[i];
@@ -569,14 +550,12 @@
   unsigned is_256:1;
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_gcm_siv_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_gcm_siv_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_gcm_siv_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_gcm_siv_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_aes_gcm_siv_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                                  size_t key_len, size_t tag_len) {
@@ -619,18 +598,15 @@
 static void gcm_siv_crypt(uint8_t *out, const uint8_t *in, size_t in_len,
                           const uint8_t initial_counter[AES_BLOCK_SIZE],
                           block128_f enc_block, const AES_KEY *key) {
-  union {
-    uint32_t w[4];
-    uint8_t c[16];
-  } counter;
+  uint8_t counter[16];
 
-  OPENSSL_memcpy(counter.c, initial_counter, AES_BLOCK_SIZE);
-  counter.c[15] |= 0x80;
+  OPENSSL_memcpy(counter, initial_counter, AES_BLOCK_SIZE);
+  counter[15] |= 0x80;
 
   for (size_t done = 0; done < in_len;) {
     uint8_t keystream[AES_BLOCK_SIZE];
-    enc_block(counter.c, keystream, key);
-    counter.w[0]++;
+    enc_block(counter, keystream, key);
+    CRYPTO_store_u32_le(counter, CRYPTO_load_u32_le(counter) + 1);
 
     size_t todo = AES_BLOCK_SIZE;
     if (in_len - done < todo) {
@@ -670,17 +646,10 @@
     CRYPTO_POLYVAL_update_blocks(&polyval_ctx, scratch, sizeof(scratch));
   }
 
-  union {
-    uint8_t c[16];
-    struct {
-      uint64_t ad;
-      uint64_t in;
-    } bitlens;
-  } length_block;
-
-  length_block.bitlens.ad = ad_len * 8;
-  length_block.bitlens.in = in_len * 8;
-  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, length_block.c,
+  uint8_t length_block[16];
+  CRYPTO_store_u64_le(length_block, ad_len * 8);
+  CRYPTO_store_u64_le(length_block + 8, in_len * 8);
+  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, length_block,
                                sizeof(length_block));
 
   CRYPTO_POLYVAL_finish(&polyval_ctx, out_tag);
@@ -857,22 +826,15 @@
 
 #if defined(AES_GCM_SIV_ASM)
 
-static char avx_aesni_capable(void) {
-  const uint32_t ecx = OPENSSL_ia32cap_P[1];
-
-  return (ecx & (1 << (57 - 32))) != 0 /* AESNI */ &&
-         (ecx & (1 << 28)) != 0 /* AVX */;
-}
-
 const EVP_AEAD *EVP_aead_aes_128_gcm_siv(void) {
-  if (avx_aesni_capable()) {
+  if (CRYPTO_is_AVX_capable() && CRYPTO_is_AESNI_capable()) {
     return &aead_aes_128_gcm_siv_asm;
   }
   return &aead_aes_128_gcm_siv;
 }
 
 const EVP_AEAD *EVP_aead_aes_256_gcm_siv(void) {
-  if (avx_aesni_capable()) {
+  if (CRYPTO_is_AVX_capable() && CRYPTO_is_AESNI_capable()) {
     return &aead_aes_256_gcm_siv_asm;
   }
   return &aead_aes_256_gcm_siv;
diff --git a/src/crypto/cipher_extra/e_chacha20poly1305.c b/src/crypto/cipher_extra/e_chacha20poly1305.c
index 1650188..4a46a1d 100644
--- a/src/crypto/cipher_extra/e_chacha20poly1305.c
+++ b/src/crypto/cipher_extra/e_chacha20poly1305.c
@@ -14,6 +14,7 @@
 
 #include <openssl/aead.h>
 
+#include <assert.h>
 #include <string.h>
 
 #include <openssl/chacha.h>
@@ -21,7 +22,6 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/poly1305.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../chacha/internal.h"
@@ -32,14 +32,12 @@
   uint8_t key[32];
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_chacha20_poly1305_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_chacha20_poly1305_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_chacha20_poly1305_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_chacha20_poly1305_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_chacha20_poly1305_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                                        size_t key_len, size_t tag_len) {
diff --git a/src/crypto/fipsmodule/cipher/e_des.c b/src/crypto/cipher_extra/e_des.c
similarity index 63%
rename from src/crypto/fipsmodule/cipher/e_des.c
rename to src/crypto/cipher_extra/e_des.c
index e77363b..300ec00 100644
--- a/src/crypto/fipsmodule/cipher/e_des.c
+++ b/src/crypto/cipher_extra/e_des.c
@@ -58,8 +58,8 @@
 #include <openssl/des.h>
 #include <openssl/nid.h>
 
+#include "../fipsmodule/cipher/internal.h"
 #include "internal.h"
-#include "../delocate.h"
 
 
 typedef struct {
@@ -88,17 +88,21 @@
   return 1;
 }
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_cbc) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_cbc;
-  out->block_size = 8;
-  out->key_len = 8;
-  out->iv_len = 8;
-  out->ctx_size = sizeof(EVP_DES_KEY);
-  out->flags = EVP_CIPH_CBC_MODE;
-  out->init = des_init_key;
-  out->cipher = des_cbc_cipher;
-}
+static const EVP_CIPHER evp_des_cbc = {
+    /* nid = */ NID_des_cbc,
+    /* block_size = */ 8,
+    /* key_len = */ 8,
+    /* iv_len = */ 8,
+    /* ctx_size = */ sizeof(EVP_DES_KEY),
+    /* flags = */ EVP_CIPH_CBC_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_init_key,
+    /* cipher = */ des_cbc_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
+
+const EVP_CIPHER *EVP_des_cbc(void) { return &evp_des_cbc; }
 
 static int des_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in,
                           size_t in_len) {
@@ -107,25 +111,29 @@
   }
   in_len -= ctx->cipher->block_size;
 
-  EVP_DES_KEY *dat = (EVP_DES_KEY *) ctx->cipher_data;
+  EVP_DES_KEY *dat = (EVP_DES_KEY *)ctx->cipher_data;
   for (size_t i = 0; i <= in_len; i += ctx->cipher->block_size) {
-    DES_ecb_encrypt((DES_cblock *) (in + i), (DES_cblock *) (out + i),
+    DES_ecb_encrypt((DES_cblock *)(in + i), (DES_cblock *)(out + i),
                     &dat->ks.ks, ctx->encrypt);
   }
   return 1;
 }
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ecb) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_ecb;
-  out->block_size = 8;
-  out->key_len = 8;
-  out->iv_len = 0;
-  out->ctx_size = sizeof(EVP_DES_KEY);
-  out->flags = EVP_CIPH_ECB_MODE;
-  out->init = des_init_key;
-  out->cipher = des_ecb_cipher;
-}
+static const EVP_CIPHER evp_des_ecb = {
+    /* nid = */ NID_des_ecb,
+    /* block_size = */ 8,
+    /* key_len = */ 8,
+    /* iv_len = */ 0,
+    /* ctx_size = */ sizeof(EVP_DES_KEY),
+    /* flags = */ EVP_CIPH_ECB_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_init_key,
+    /* cipher = */ des_ecb_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
+
+const EVP_CIPHER *EVP_des_ecb(void) { return &evp_des_ecb; }
 
 typedef struct {
   union {
@@ -137,7 +145,7 @@
 static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
                              const uint8_t *iv, int enc) {
   DES_cblock *deskey = (DES_cblock *)key;
-  DES_EDE_KEY *dat = (DES_EDE_KEY*) ctx->cipher_data;
+  DES_EDE_KEY *dat = (DES_EDE_KEY *)ctx->cipher_data;
 
   DES_set_key(&deskey[0], &dat->ks.ks[0]);
   DES_set_key(&deskey[1], &dat->ks.ks[1]);
@@ -147,8 +155,8 @@
 }
 
 static int des_ede3_cbc_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out,
-                              const uint8_t *in, size_t in_len) {
-  DES_EDE_KEY *dat = (DES_EDE_KEY*) ctx->cipher_data;
+                               const uint8_t *in, size_t in_len) {
+  DES_EDE_KEY *dat = (DES_EDE_KEY *)ctx->cipher_data;
 
   DES_ede3_cbc_encrypt(in, out, in_len, &dat->ks.ks[0], &dat->ks.ks[1],
                        &dat->ks.ks[2], (DES_cblock *)ctx->iv, ctx->encrypt);
@@ -156,22 +164,26 @@
   return 1;
 }
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede3_cbc) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_ede3_cbc;
-  out->block_size = 8;
-  out->key_len = 24;
-  out->iv_len = 8;
-  out->ctx_size = sizeof(DES_EDE_KEY);
-  out->flags = EVP_CIPH_CBC_MODE;
-  out->init = des_ede3_init_key;
-  out->cipher = des_ede3_cbc_cipher;
-}
+static const EVP_CIPHER evp_des_ede3_cbc = {
+    /* nid = */ NID_des_ede3_cbc,
+    /* block_size = */ 8,
+    /* key_len = */ 24,
+    /* iv_len = */ 8,
+    /* ctx_size = */ sizeof(DES_EDE_KEY),
+    /* flags = */ EVP_CIPH_CBC_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_ede3_init_key,
+    /* cipher = */ des_ede3_cbc_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
+
+const EVP_CIPHER *EVP_des_ede3_cbc(void) { return &evp_des_ede3_cbc; }
 
 static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
-                             const uint8_t *iv, int enc) {
-  DES_cblock *deskey = (DES_cblock *) key;
-  DES_EDE_KEY *dat = (DES_EDE_KEY *) ctx->cipher_data;
+                            const uint8_t *iv, int enc) {
+  DES_cblock *deskey = (DES_cblock *)key;
+  DES_EDE_KEY *dat = (DES_EDE_KEY *)ctx->cipher_data;
 
   DES_set_key(&deskey[0], &dat->ks.ks[0]);
   DES_set_key(&deskey[1], &dat->ks.ks[1]);
@@ -180,17 +192,21 @@
   return 1;
 }
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede_cbc) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_ede_cbc;
-  out->block_size = 8;
-  out->key_len = 16;
-  out->iv_len = 8;
-  out->ctx_size = sizeof(DES_EDE_KEY);
-  out->flags = EVP_CIPH_CBC_MODE;
-  out->init = des_ede_init_key;
-  out->cipher = des_ede3_cbc_cipher;
-}
+static const EVP_CIPHER evp_des_ede_cbc = {
+    /* nid = */ NID_des_ede_cbc,
+    /* block_size = */ 8,
+    /* key_len = */ 16,
+    /* iv_len = */ 8,
+    /* ctx_size = */ sizeof(DES_EDE_KEY),
+    /* flags = */ EVP_CIPH_CBC_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_ede_init_key,
+    /* cipher = */ des_ede3_cbc_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
+
+const EVP_CIPHER *EVP_des_ede_cbc(void) { return &evp_des_ede_cbc; }
 
 static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out,
                               const uint8_t *in, size_t in_len) {
@@ -208,30 +224,36 @@
   return 1;
 }
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_ede_ecb;
-  out->block_size = 8;
-  out->key_len = 16;
-  out->iv_len = 0;
-  out->ctx_size = sizeof(DES_EDE_KEY);
-  out->flags = EVP_CIPH_ECB_MODE;
-  out->init = des_ede_init_key;
-  out->cipher = des_ede_ecb_cipher;
-}
+static const EVP_CIPHER evp_des_ede = {
+    /* nid = */ NID_des_ede_ecb,
+    /* block_size = */ 8,
+    /* key_len = */ 16,
+    /* iv_len = */ 0,
+    /* ctx_size = */ sizeof(DES_EDE_KEY),
+    /* flags = */ EVP_CIPH_ECB_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_ede_init_key,
+    /* cipher = */ des_ede_ecb_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
 
-DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede3) {
-  memset(out, 0, sizeof(EVP_CIPHER));
-  out->nid = NID_des_ede3_ecb;
-  out->block_size = 8;
-  out->key_len = 24;
-  out->iv_len = 0;
-  out->ctx_size = sizeof(DES_EDE_KEY);
-  out->flags = EVP_CIPH_ECB_MODE;
-  out->init = des_ede3_init_key;
-  out->cipher = des_ede_ecb_cipher;
-}
+const EVP_CIPHER *EVP_des_ede(void) { return &evp_des_ede; }
 
-const EVP_CIPHER* EVP_des_ede3_ecb(void) {
-  return EVP_des_ede3();
-}
+static const EVP_CIPHER evp_des_ede3 = {
+    /* nid = */ NID_des_ede3_ecb,
+    /* block_size = */ 8,
+    /* key_len = */ 24,
+    /* iv_len = */ 0,
+    /* ctx_size = */ sizeof(DES_EDE_KEY),
+    /* flags = */ EVP_CIPH_ECB_MODE,
+    /* app_data = */ NULL,
+    /* init = */ des_ede3_init_key,
+    /* cipher = */ des_ede_ecb_cipher,
+    /* cleanup = */ NULL,
+    /* ctrl = */ NULL,
+};
+
+const EVP_CIPHER *EVP_des_ede3(void) { return &evp_des_ede3; }
+
+const EVP_CIPHER *EVP_des_ede3_ecb(void) { return EVP_des_ede3(); }
diff --git a/src/crypto/cipher_extra/e_null.c b/src/crypto/cipher_extra/e_null.c
index f5fe8fb..e9ee8ad 100644
--- a/src/crypto/cipher_extra/e_null.c
+++ b/src/crypto/cipher_extra/e_null.c
@@ -60,6 +60,7 @@
 
 #include <openssl/nid.h>
 
+#include "../fipsmodule/cipher/internal.h"
 #include "../internal.h"
 
 
diff --git a/src/crypto/cipher_extra/e_rc2.c b/src/crypto/cipher_extra/e_rc2.c
index 221a9c9..ffc5e6b 100644
--- a/src/crypto/cipher_extra/e_rc2.c
+++ b/src/crypto/cipher_extra/e_rc2.c
@@ -57,6 +57,7 @@
 #include <openssl/cipher.h>
 #include <openssl/nid.h>
 
+#include "../fipsmodule/cipher/internal.h"
 #include "../internal.h"
 
 
diff --git a/src/crypto/cipher_extra/e_rc4.c b/src/crypto/cipher_extra/e_rc4.c
index e7c2cca..2f4f9bb 100644
--- a/src/crypto/cipher_extra/e_rc4.c
+++ b/src/crypto/cipher_extra/e_rc4.c
@@ -61,6 +61,8 @@
 #include <openssl/nid.h>
 #include <openssl/rc4.h>
 
+#include "../fipsmodule/cipher/internal.h"
+
 
 static int rc4_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
                         const uint8_t *iv, int enc) {
diff --git a/src/crypto/cipher_extra/e_tls.c b/src/crypto/cipher_extra/e_tls.c
index 6d84f7f..cfaf95d 100644
--- a/src/crypto/cipher_extra/e_tls.c
+++ b/src/crypto/cipher_extra/e_tls.c
@@ -23,7 +23,6 @@
 #include <openssl/md5.h>
 #include <openssl/mem.h>
 #include <openssl/sha.h>
-#include <openssl/type_check.h>
 
 #include "../fipsmodule/cipher/internal.h"
 #include "../internal.h"
@@ -42,17 +41,12 @@
   char implicit_iv;
 } AEAD_TLS_CTX;
 
-OPENSSL_STATIC_ASSERT(EVP_MAX_MD_SIZE < 256,
-                      "mac_key_len does not fit in uint8_t");
+static_assert(EVP_MAX_MD_SIZE < 256, "mac_key_len does not fit in uint8_t");
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(AEAD_TLS_CTX),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(AEAD_TLS_CTX),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >= sizeof(AEAD_TLS_CTX),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >= alignof(AEAD_TLS_CTX),
+              "AEAD state has insufficient alignment");
 
 static void aead_tls_cleanup(EVP_AEAD_CTX *ctx) {
   AEAD_TLS_CTX *tls_ctx = (AEAD_TLS_CTX *)&ctx->state;
diff --git a/src/crypto/cipher_extra/internal.h b/src/crypto/cipher_extra/internal.h
index a2ec30b..76a0314 100644
--- a/src/crypto/cipher_extra/internal.h
+++ b/src/crypto/cipher_extra/internal.h
@@ -57,11 +57,10 @@
 #ifndef OPENSSL_HEADER_CIPHER_EXTRA_INTERNAL_H
 #define OPENSSL_HEADER_CIPHER_EXTRA_INTERNAL_H
 
+#include <assert.h>
 #include <stdlib.h>
 
 #include <openssl/base.h>
-#include <openssl/cpu.h>
-#include <openssl/type_check.h>
 
 #include "../internal.h"
 
@@ -164,19 +163,23 @@
   } out;
 };
 
-#if defined(OPENSSL_X86_64) && !defined(OPENSSL_NO_ASM)
+#if (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&  \
+    !defined(OPENSSL_NO_ASM)
 
-OPENSSL_STATIC_ASSERT(sizeof(union chacha20_poly1305_open_data) == 48,
-                      "wrong chacha20_poly1305_open_data size");
-OPENSSL_STATIC_ASSERT(sizeof(union chacha20_poly1305_seal_data) == 48 + 8 + 8,
-                      "wrong chacha20_poly1305_seal_data size");
+static_assert(sizeof(union chacha20_poly1305_open_data) == 48,
+              "wrong chacha20_poly1305_open_data size");
+static_assert(sizeof(union chacha20_poly1305_seal_data) == 48 + 8 + 8,
+              "wrong chacha20_poly1305_seal_data size");
 
 OPENSSL_INLINE int chacha20_poly1305_asm_capable(void) {
-  const int sse41_capable = (OPENSSL_ia32cap_P[1] & (1 << 19)) != 0;
-  return sse41_capable;
+#if defined(OPENSSL_X86_64)
+  return CRYPTO_is_SSE4_1_capable();
+#elif defined(OPENSSL_AARCH64)
+  return CRYPTO_is_NEON_capable();
+#endif
 }
 
-// chacha20_poly1305_open is defined in chacha20_poly1305_x86_64.pl. It decrypts
+// chacha20_poly1305_open is defined in chacha20_poly1305_*.pl. It decrypts
 // |plaintext_len| bytes from |ciphertext| and writes them to |out_plaintext|.
 // Additional input parameters are passed in |aead_data->in|. On exit, it will
 // write calculated tag value to |aead_data->out.tag|, which the caller must
@@ -187,7 +190,7 @@
                                    size_t ad_len,
                                    union chacha20_poly1305_open_data *data);
 
-// chacha20_poly1305_open is defined in chacha20_poly1305_x86_64.pl. It encrypts
+// chacha20_poly1305_open is defined in chacha20_poly1305_*.pl. It encrypts
 // |plaintext_len| bytes from |plaintext| and writes them to |out_ciphertext|.
 // Additional input parameters are passed in |aead_data->in|. The calculated tag
 // value is over the computed ciphertext concatenated with |extra_ciphertext|
diff --git a/src/crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt b/src/crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt
new file mode 100644
index 0000000..7cff4fb
--- /dev/null
+++ b/src/crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt
@@ -0,0 +1,92 @@
+# These test vectors were derived from those found in
+# the Bluetooth Mesh Profile Specification v1.0. That document doesn't use
+# 16-byte tags, so the tags have been updated here. Note that the first four or
+# eight bytes of the tag is not equal to the tag from those vectors because CCM
+# authenticates the expected tag length.
+
+KEY: 0953fa93e7caac9638f58820220a398e
+NONCE: 00800000011201000012345678
+IN: fffd034b50057e400000010000
+AD:
+CT: b5e5bfdacbaf6cb7fb6bff871f
+TAG: b0d6dd827d35bf372fa6425dcd17d356
+
+# Section 8.3.2
+KEY: 0953fa93e7caac9638f58820220a398e
+NONCE: 00800148202345000012345678
+IN: 120104320308ba072f
+AD:
+CT: 79d7dbc0c9b4d43eeb
+TAG: 281508e50d58dbbd27c39597800f4733
+
+# Section 8.3.3.
+KEY: 0953fa93e7caac9638f58820220a398e
+NONCE: 00802b38322fe3000012345678
+IN: 120104fa0205a6000a
+AD:
+CT: 53273086b8c5ee00bd
+TAG: d52b87a8ce6290a772d472b8c62bdc13
+
+# Section 8.3.4.
+KEY: be635105434859f484fc798e043ce40e
+NONCE: 00800000021201000012345678
+IN: 23450100
+AD:
+CT: b0e5d0ad
+TAG: 6078e0ddbb7cd43faea57c7051e5b4ae
+
+# Section 8.3.5.
+KEY: be635105434859f484fc798e043ce40e
+NONCE: 00800148342345000012345678
+IN: 120102001234567800
+AD:
+CT: 5c39da1792b1fee9ec
+TAG: a9233958aced64f2343b9d610e876440
+
+# Section 8.3.7.
+KEY: 0953fa93e7caac9638f58820220a398e
+NONCE: 008b0148352345000012345678
+IN: 000300a6ac00000002
+AD:
+CT: 0d0d730f94d7f3509d
+TAG: dda1694adb791652fb6ae04682f19b29
+
+# Section 8.3.9.
+KEY: 0953fa93e7caac9638f58820220a398e
+NONCE: 008b0148362345000012345678
+IN: 000300a6ac00000003
+AD:
+CT: d85d806bbed248614f
+TAG: ef7f4d55e47d21522ebe3d5bc735a5c5
+
+# Section 8.3.10.
+KEY: be635105434859f484fc798e043ce40e
+NONCE: 00800000031201000012345678
+IN: 23450101
+AD:
+CT: 7777ed35
+TAG: 35d84e18784c4bf3cb1b4c191dc555cc
+
+# Section 8.3.12.
+KEY: be635105434859f484fc798e043ce40e
+NONCE: 00800000041201000012345678
+IN: 23450101
+AD:
+CT: ae214660
+TAG: d146b28beafe7f984f9430502d07aafe
+
+# Section 8.3.14.
+KEY: be635105434859f484fc798e043ce40e
+NONCE: 00800000051201000012345678
+IN: 23450100
+AD:
+CT: 7d3ae62a
+TAG: 52ee03ab84e1a33365e8a61275665f71
+
+# Section 8.3.24.
+KEY: 63964771734fbd76e3b40519d1d94a48
+NONCE: 010007080d1234973612345677
+IN: ea0a00576f726c64
+AD: f4a002c7fb1e4ca0a469a021de0db875
+CT: de1547118463123e
+TAG: 14604c1ddb4f5987064b1736f3923962
diff --git a/src/crypto/conf/conf.c b/src/crypto/conf/conf.c
index c1e4e96..620b104 100644
--- a/src/crypto/conf/conf.c
+++ b/src/crypto/conf/conf.c
@@ -766,7 +766,7 @@
 }
 
 int CONF_parse_list(const char *list, char sep, int remove_whitespace,
-                    int (*list_cb)(const char *elem, int len, void *usr),
+                    int (*list_cb)(const char *elem, size_t len, void *usr),
                     void *arg) {
   int ret;
   const char *lstart, *tmpend, *p;
diff --git a/src/crypto/conf/conf_test.cc b/src/crypto/conf/conf_test.cc
index 65938e1..fe03c5f 100644
--- a/src/crypto/conf/conf_test.cc
+++ b/src/crypto/conf/conf_test.cc
@@ -12,11 +12,16 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
+#include <string>
+#include <vector>
+
 #include <openssl/bio.h>
 #include <openssl/conf.h>
 
 #include <gtest/gtest.h>
 
+#include "internal.h"
+
 
 TEST(ConfTest, Parse) {
   // Check that basic parsing works. (We strongly recommend that people don't
@@ -42,3 +47,54 @@
   EXPECT_STREQ(NCONF_get_string(conf.get(), "section_name", "key"), "value2");
   EXPECT_STREQ(NCONF_get_string(conf.get(), "other_section", "key"), nullptr);
 }
+
+TEST(ConfTest, ParseList) {
+  const struct {
+    const char *list;
+    char sep;
+    bool remove_whitespace;
+    std::vector<std::string> expected;
+  } kTests[] = {
+      {"", ',', /*remove_whitespace=*/0, {""}},
+      {"", ',', /*remove_whitespace=*/1, {""}},
+
+      {" ", ',', /*remove_whitespace=*/0, {" "}},
+      {" ", ',', /*remove_whitespace=*/1, {""}},
+
+      {"hello world", ',', /*remove_whitespace=*/0, {"hello world"}},
+      {"hello world", ',', /*remove_whitespace=*/1, {"hello world"}},
+
+      {" hello world ", ',', /*remove_whitespace=*/0, {" hello world "}},
+      {" hello world ", ',', /*remove_whitespace=*/1, {"hello world"}},
+
+      {"hello,world", ',', /*remove_whitespace=*/0, {"hello", "world"}},
+      {"hello,world", ',', /*remove_whitespace=*/1, {"hello", "world"}},
+
+      {"hello,,world", ',', /*remove_whitespace=*/0, {"hello", "", "world"}},
+      {"hello,,world", ',', /*remove_whitespace=*/1, {"hello", "", "world"}},
+
+      {"\tab cd , , ef gh ",
+       ',',
+       /*remove_whitespace=*/0,
+       {"\tab cd ", " ", " ef gh "}},
+      {"\tab cd , , ef gh ",
+       ',',
+       /*remove_whitespace=*/1,
+       {"ab cd", "", "ef gh"}},
+  };
+  for (const auto& t : kTests) {
+    SCOPED_TRACE(t.list);
+    SCOPED_TRACE(t.sep);
+    SCOPED_TRACE(t.remove_whitespace);
+
+    std::vector<std::string> result;
+    auto append_to_vector = [](const char *elem, size_t len, void *arg) -> int {
+      auto *vec = static_cast<std::vector<std::string> *>(arg);
+      vec->push_back(std::string(elem, len));
+      return 1;
+    };
+    ASSERT_TRUE(CONF_parse_list(t.list, t.sep, t.remove_whitespace,
+                                append_to_vector, &result));
+    EXPECT_EQ(result, t.expected);
+  }
+}
diff --git a/src/crypto/conf/internal.h b/src/crypto/conf/internal.h
index 3e0e57d..6075548 100644
--- a/src/crypto/conf/internal.h
+++ b/src/crypto/conf/internal.h
@@ -15,6 +15,8 @@
 #ifndef OPENSSL_HEADER_CRYPTO_CONF_INTERNAL_H
 #define OPENSSL_HEADER_CRYPTO_CONF_INTERNAL_H
 
+#include <openssl/base.h>
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -23,6 +25,16 @@
 // CONF_VALUE_new returns a freshly allocated and zeroed |CONF_VALUE|.
 CONF_VALUE *CONF_VALUE_new(void);
 
+// CONF_parse_list takes a list separated by 'sep' and calls |list_cb| giving
+// the start and length of each member, optionally stripping leading and
+// trailing whitespace. This can be used to parse comma separated lists for
+// example. If |list_cb| returns <= 0, then the iteration is halted and that
+// value is returned immediately. Otherwise it returns one. Note that |list_cb|
+// may be called on an empty member.
+OPENSSL_EXPORT int CONF_parse_list(
+    const char *list, char sep, int remove_whitespace,
+    int (*list_cb)(const char *elem, size_t len, void *usr), void *arg);
+
 
 #if defined(__cplusplus)
 }  // extern C
diff --git a/src/crypto/cpu_aarch64_apple.c b/src/crypto/cpu_aarch64_apple.c
new file mode 100644
index 0000000..f6c7173
--- /dev/null
+++ b/src/crypto/cpu_aarch64_apple.c
@@ -0,0 +1,74 @@
+/* Copyright (c) 2021, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include "internal.h"
+
+#if defined(OPENSSL_AARCH64) && defined(OPENSSL_APPLE) && \
+    !defined(OPENSSL_STATIC_ARMCAP)
+
+#include <sys/sysctl.h>
+#include <sys/types.h>
+
+#include <openssl/arm_arch.h>
+
+
+extern uint32_t OPENSSL_armcap_P;
+
+static int has_hw_feature(const char *name) {
+  int value;
+  size_t len = sizeof(value);
+  if (sysctlbyname(name, &value, &len, NULL, 0) != 0) {
+    return 0;
+  }
+  if (len != sizeof(int)) {
+    // This should not happen. All the values queried should be integer-valued.
+    assert(0);
+    return 0;
+  }
+
+  // Per sys/sysctl.h:
+  //
+  //   Selectors that return errors are not support on the system. Supported
+  //   features will return 1 if they are recommended or 0 if they are supported
+  //   but are not expected to help performance. Future versions of these
+  //   selectors may return larger values as necessary so it is best to test for
+  //   non zero.
+  return value != 0;
+}
+
+void OPENSSL_cpuid_setup(void) {
+  // Apple ARM64 platforms have NEON and cryptography extensions available
+  // statically, so we do not need to query them. In particular, there sometimes
+  // are no sysctls corresponding to such features. See below.
+#if !defined(__ARM_NEON) || !defined(__ARM_FEATURE_AES) || \
+    !defined(__ARM_FEATURE_SHA2)
+#error "NEON and crypto extensions should be statically available."
+#endif
+  OPENSSL_armcap_P =
+      ARMV7_NEON | ARMV8_AES | ARMV8_PMULL | ARMV8_SHA1 | ARMV8_SHA256;
+
+  // See Apple's documentation for sysctl names:
+  // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
+  //
+  // The new feature names, e.g. "hw.optional.arm.FEAT_SHA512", are only
+  // available in macOS 12. For compatibility with macOS 11, we also support
+  // the old names. The old names don't have values for features like FEAT_AES,
+  // so instead we detect them statically above.
+  if (has_hw_feature("hw.optional.arm.FEAT_SHA512") ||
+      has_hw_feature("hw.optional.armv8_2_sha512")) {
+    OPENSSL_armcap_P |= ARMV8_SHA512;
+  }
+}
+
+#endif  // OPENSSL_AARCH64 && OPENSSL_APPLE && !OPENSSL_STATIC_ARMCAP
diff --git a/src/crypto/cpu-aarch64-fuchsia.c b/src/crypto/cpu_aarch64_fuchsia.c
similarity index 81%
rename from src/crypto/cpu-aarch64-fuchsia.c
rename to src/crypto/cpu_aarch64_fuchsia.c
index 98303a0..64bc448 100644
--- a/src/crypto/cpu-aarch64-fuchsia.c
+++ b/src/crypto/cpu_aarch64_fuchsia.c
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include "internal.h"
 
 #if defined(OPENSSL_AARCH64) && defined(OPENSSL_FUCHSIA) && \
     !defined(OPENSSL_STATIC_ARMCAP)
@@ -23,16 +23,14 @@
 
 #include <openssl/arm_arch.h>
 
-#include "internal.h"
-
 extern uint32_t OPENSSL_armcap_P;
 
 void OPENSSL_cpuid_setup(void) {
   uint32_t hwcap;
   zx_status_t rc = zx_system_get_features(ZX_FEATURE_KIND_CPU, &hwcap);
   if (rc != ZX_OK || (hwcap & ZX_ARM64_FEATURE_ISA_ASIMD) == 0) {
-    // Matching OpenSSL, if NEON/ASIMD is missing, don't report other features
-    // either.
+    // If NEON/ASIMD is missing, don't report other features either. This
+    // matches OpenSSL, and the other features depend on SIMD registers.
     return;
   }
 
@@ -47,9 +45,12 @@
   if (hwcap & ZX_ARM64_FEATURE_ISA_SHA1) {
     OPENSSL_armcap_P |= ARMV8_SHA1;
   }
-  if (hwcap & ZX_ARM64_FEATURE_ISA_SHA2) {
+  if (hwcap & ZX_ARM64_FEATURE_ISA_SHA256) {
     OPENSSL_armcap_P |= ARMV8_SHA256;
   }
+  if (hwcap & ZX_ARM64_FEATURE_ISA_SHA512) {
+    OPENSSL_armcap_P |= ARMV8_SHA512;
+  }
 }
 
-#endif  // OPENSSL_AARCH64 && !OPENSSL_STATIC_ARMCAP
+#endif  // OPENSSL_AARCH64 && OPENSSL_FUCHSIA && !OPENSSL_STATIC_ARMCAP
diff --git a/src/crypto/cpu-aarch64-linux.c b/src/crypto/cpu_aarch64_linux.c
similarity index 90%
rename from src/crypto/cpu-aarch64-linux.c
rename to src/crypto/cpu_aarch64_linux.c
index 0184dd4..4222711 100644
--- a/src/crypto/cpu-aarch64-linux.c
+++ b/src/crypto/cpu_aarch64_linux.c
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include "internal.h"
 
 #if defined(OPENSSL_AARCH64) && defined(OPENSSL_LINUX) && \
     !defined(OPENSSL_STATIC_ARMCAP)
@@ -21,8 +21,6 @@
 
 #include <openssl/arm_arch.h>
 
-#include "internal.h"
-
 
 extern uint32_t OPENSSL_armcap_P;
 
@@ -36,6 +34,7 @@
   static const unsigned long kPMULL = 1 << 4;
   static const unsigned long kSHA1 = 1 << 5;
   static const unsigned long kSHA256 = 1 << 6;
+  static const unsigned long kSHA512 = 1 << 21;
 
   if ((hwcap & kNEON) == 0) {
     // Matching OpenSSL, if NEON is missing, don't report other features
@@ -57,6 +56,9 @@
   if (hwcap & kSHA256) {
     OPENSSL_armcap_P |= ARMV8_SHA256;
   }
+  if (hwcap & kSHA512) {
+    OPENSSL_armcap_P |= ARMV8_SHA512;
+  }
 }
 
-#endif  // OPENSSL_AARCH64 && !OPENSSL_STATIC_ARMCAP
+#endif  // OPENSSL_AARCH64 && OPENSSL_LINUX && !OPENSSL_STATIC_ARMCAP
diff --git a/src/crypto/cpu-aarch64-win.c b/src/crypto/cpu_aarch64_win.c
similarity index 87%
rename from src/crypto/cpu-aarch64-win.c
rename to src/crypto/cpu_aarch64_win.c
index ee7f8e0..0630f96 100644
--- a/src/crypto/cpu-aarch64-win.c
+++ b/src/crypto/cpu_aarch64_win.c
@@ -13,7 +13,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include "internal.h"
 
 #if defined(OPENSSL_AARCH64) && defined(OPENSSL_WINDOWS) && \
     !defined(OPENSSL_STATIC_ARMCAP)
@@ -22,8 +22,6 @@
 
 #include <openssl/arm_arch.h>
 
-#include "internal.h"
-
 extern uint32_t OPENSSL_armcap_P;
 void OPENSSL_cpuid_setup(void) {
   // We do not need to check for the presence of NEON, as Armv8-A always has it
@@ -36,6 +34,8 @@
     OPENSSL_armcap_P |= ARMV8_SHA1;
     OPENSSL_armcap_P |= ARMV8_SHA256;
   }
+  // As of writing, Windows does not have a |PF_*| value for ARMv8.2 SHA-512
+  // extensions. When it does, add it here.
 }
 
-#endif
+#endif  // OPENSSL_AARCH64 && OPENSSL_WINDOWS && !OPENSSL_STATIC_ARMCAP
diff --git a/src/crypto/cpu-arm.c b/src/crypto/cpu_arm.c
similarity index 97%
rename from src/crypto/cpu-arm.c
rename to src/crypto/cpu_arm.c
index e8596ac..3325908 100644
--- a/src/crypto/cpu-arm.c
+++ b/src/crypto/cpu_arm.c
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include "internal.h"
 
 #if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
     !defined(OPENSSL_STATIC_ARMCAP)
diff --git a/src/crypto/cpu-arm-linux.c b/src/crypto/cpu_arm_linux.c
similarity index 96%
rename from src/crypto/cpu-arm-linux.c
rename to src/crypto/cpu_arm_linux.c
index 962a4a5..67e6a1b 100644
--- a/src/crypto/cpu-arm-linux.c
+++ b/src/crypto/cpu_arm_linux.c
@@ -12,9 +12,10 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include "internal.h"
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_STATIC_ARMCAP)
+#if defined(OPENSSL_ARM) && defined(OPENSSL_LINUX) && \
+    !defined(OPENSSL_STATIC_ARMCAP)
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/types.h>
@@ -23,7 +24,7 @@
 #include <openssl/arm_arch.h>
 #include <openssl/mem.h>
 
-#include "cpu-arm-linux.h"
+#include "cpu_arm_linux.h"
 
 #define AT_HWCAP 16
 #define AT_HWCAP2 26
@@ -226,4 +227,4 @@
 
 int CRYPTO_needs_hwcap2_workaround(void) { return g_needs_hwcap2_workaround; }
 
-#endif  // OPENSSL_ARM && !OPENSSL_STATIC_ARMCAP
+#endif  // OPENSSL_ARM && OPENSSL_LINUX && !OPENSSL_STATIC_ARMCAP
diff --git a/src/crypto/cpu-arm-linux.h b/src/crypto/cpu_arm_linux.h
similarity index 100%
rename from src/crypto/cpu-arm-linux.h
rename to src/crypto/cpu_arm_linux.h
diff --git a/src/crypto/cpu-arm-linux_test.cc b/src/crypto/cpu_arm_linux_test.cc
similarity index 99%
rename from src/crypto/cpu-arm-linux_test.cc
rename to src/crypto/cpu_arm_linux_test.cc
index 0472537..019b579 100644
--- a/src/crypto/cpu-arm-linux_test.cc
+++ b/src/crypto/cpu_arm_linux_test.cc
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include "cpu-arm-linux.h"
+#include "cpu_arm_linux.h"
 
 #include <string.h>
 
diff --git a/src/crypto/cpu-intel.c b/src/crypto/cpu_intel.c
similarity index 99%
rename from src/crypto/cpu-intel.c
rename to src/crypto/cpu_intel.c
index 53ece95..fa96a7f 100644
--- a/src/crypto/cpu-intel.c
+++ b/src/crypto/cpu_intel.c
@@ -54,8 +54,7 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
-#include <openssl/cpu.h>
-
+#include <openssl/base.h>
 
 #if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_X86) || defined(OPENSSL_X86_64))
 
diff --git a/src/crypto/cpu-ppc64le.c b/src/crypto/cpu_ppc64le.c
similarity index 97%
rename from src/crypto/cpu-ppc64le.c
rename to src/crypto/cpu_ppc64le.c
index 6cc8aee..a802e37 100644
--- a/src/crypto/cpu-ppc64le.c
+++ b/src/crypto/cpu_ppc64le.c
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/cpu.h>
+#include <openssl/base.h>
 
 #if defined(OPENSSL_PPC64LE)
 
diff --git a/src/crypto/crypto.c b/src/crypto/crypto.c
index 6886aa4..af7e560 100644
--- a/src/crypto/crypto.c
+++ b/src/crypto/crypto.c
@@ -14,8 +14,6 @@
 
 #include <openssl/crypto.h>
 
-#include <openssl/cpu.h>
-
 #include "fipsmodule/rand/fork_detect.h"
 #include "fipsmodule/rand/internal.h"
 #include "internal.h"
@@ -88,22 +86,31 @@
 
 #if defined(OPENSSL_STATIC_ARMCAP)
 
+// See ARM ACLE for the definitions of these macros. Note |__ARM_FEATURE_AES|
+// covers both AES and PMULL and |__ARM_FEATURE_SHA2| covers SHA-1 and SHA-256.
+// https://developer.arm.com/architectures/system-architectures/software-standards/acle
+// https://github.com/ARM-software/acle/issues/152
+//
+// TODO(davidben): Do we still need |OPENSSL_STATIC_ARMCAP_*| or are the
+// standard flags and -march sufficient?
 HIDDEN uint32_t OPENSSL_armcap_P =
-#if defined(OPENSSL_STATIC_ARMCAP_NEON) || \
-    (defined(__ARM_NEON__) || defined(__ARM_NEON))
+#if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON)
     ARMV7_NEON |
 #endif
-#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_CRYPTO)
+#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_AES)
     ARMV8_AES |
 #endif
-#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_CRYPTO)
+#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_AES)
+    ARMV8_PMULL |
+#endif
+#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_SHA2)
     ARMV8_SHA1 |
 #endif
-#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_CRYPTO)
+#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_SHA2)
     ARMV8_SHA256 |
 #endif
-#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO)
-    ARMV8_PMULL |
+#if defined(__ARM_FEATURE_SHA512)
+    ARMV8_SHA512 |
 #endif
     0;
 
diff --git a/src/crypto/crypto_test.cc b/src/crypto/crypto_test.cc
index 7f15a23..caccba5 100644
--- a/src/crypto/crypto_test.cc
+++ b/src/crypto/crypto_test.cc
@@ -138,3 +138,23 @@
 }
 
 #endif  // BORINGSSL_FIPS_COUNTERS
+
+TEST(Crypto, QueryAlgorithmStatus) {
+#if defined(BORINGSSL_FIPS)
+  const bool is_fips_build = true;
+#else
+  const bool is_fips_build = false;
+#endif
+
+  EXPECT_EQ(FIPS_query_algorithm_status("AES-GCM"), is_fips_build);
+  EXPECT_EQ(FIPS_query_algorithm_status("AES-ECB"), is_fips_build);
+
+  EXPECT_FALSE(FIPS_query_algorithm_status("FakeEncrypt"));
+  EXPECT_FALSE(FIPS_query_algorithm_status(""));
+}
+
+#if defined(BORINGSSL_FIPS) && !defined(OPENSSL_ASAN)
+TEST(Crypto, OnDemandIntegrityTest) {
+  BORINGSSL_integrity_test();
+}
+#endif
diff --git a/src/crypto/curve25519/curve25519.c b/src/crypto/curve25519/curve25519.c
index ea48810..17740b8 100644
--- a/src/crypto/curve25519/curve25519.c
+++ b/src/crypto/curve25519/curve25519.c
@@ -24,11 +24,9 @@
 #include <assert.h>
 #include <string.h>
 
-#include <openssl/cpu.h>
 #include <openssl/mem.h>
 #include <openssl/rand.h>
 #include <openssl/sha.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../internal.h"
@@ -37,6 +35,10 @@
 // Various pre-computed constants.
 #include "./curve25519_tables.h"
 
+#if defined(OPENSSL_NO_ASM)
+#define FIAT_25519_NO_ASM
+#endif
+
 #if defined(BORINGSSL_CURVE25519_64BIT)
 #include "../../third_party/fiat/curve25519_64.h"
 #else
@@ -148,8 +150,8 @@
 
 #endif  // BORINGSSL_CURVE25519_64BIT
 
-OPENSSL_STATIC_ASSERT(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS,
-                      "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe");
+static_assert(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS,
+              "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe");
 
 static void fe_frombytes_strict(fe *h, const uint8_t s[32]) {
   // |fiat_25519_from_bytes| requires the top-most bit be clear.
@@ -312,8 +314,7 @@
 }
 
 static void fe_copy_lt(fe_loose *h, const fe *f) {
-  OPENSSL_STATIC_ASSERT(sizeof(fe_loose) == sizeof(fe),
-                        "fe and fe_loose mismatch");
+  static_assert(sizeof(fe_loose) == sizeof(fe), "fe and fe_loose mismatch");
   OPENSSL_memmove(h, f, sizeof(fe));
 }
 #if !defined(OPENSSL_SMALL)
@@ -503,27 +504,21 @@
 int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t s[32]) {
   fe u;
   fe_loose v;
-  fe v3;
+  fe w;
   fe vxx;
   fe_loose check;
 
   fe_frombytes(&h->Y, s);
   fe_1(&h->Z);
-  fe_sq_tt(&v3, &h->Y);
-  fe_mul_ttt(&vxx, &v3, &d);
-  fe_sub(&v, &v3, &h->Z);  // u = y^2-1
+  fe_sq_tt(&w, &h->Y);
+  fe_mul_ttt(&vxx, &w, &d);
+  fe_sub(&v, &w, &h->Z);  // u = y^2-1
   fe_carry(&u, &v);
   fe_add(&v, &vxx, &h->Z);  // v = dy^2+1
 
-  fe_sq_tl(&v3, &v);
-  fe_mul_ttl(&v3, &v3, &v);  // v3 = v^3
-  fe_sq_tt(&h->X, &v3);
-  fe_mul_ttl(&h->X, &h->X, &v);
-  fe_mul_ttt(&h->X, &h->X, &u);  // x = uv^7
-
-  fe_pow22523(&h->X, &h->X);  // x = (uv^7)^((q-5)/8)
-  fe_mul_ttt(&h->X, &h->X, &v3);
-  fe_mul_ttt(&h->X, &h->X, &u);  // x = uv^3(uv^7)^((q-5)/8)
+  fe_mul_ttl(&w, &u, &v);  // w = u*v
+  fe_pow22523(&h->X, &w);  // x = w^((q-5)/8)
+  fe_mul_ttt(&h->X, &h->X, &u);  // x = u*w^((q-5)/8)
 
   fe_sq_tt(&vxx, &h->X);
   fe_mul_ttl(&vxx, &vxx, &v);
@@ -1939,11 +1934,8 @@
   OPENSSL_memcpy(pkcopy, public_key, 32);
   uint8_t rcopy[32];
   OPENSSL_memcpy(rcopy, signature, 32);
-  union {
-    uint64_t u64[4];
-    uint8_t u8[32];
-  } scopy;
-  OPENSSL_memcpy(&scopy.u8[0], signature + 32, 32);
+  uint8_t scopy[32];
+  OPENSSL_memcpy(scopy, signature + 32, 32);
 
   // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in
   // the range [0, order) in order to prevent signature malleability.
@@ -1956,9 +1948,10 @@
     UINT64_C(0x1000000000000000),
   };
   for (size_t i = 3;; i--) {
-    if (scopy.u64[i] > kOrder[i]) {
+    uint64_t word = CRYPTO_load_u64_le(scopy + i * 8);
+    if (word > kOrder[i]) {
       return 0;
-    } else if (scopy.u64[i] < kOrder[i]) {
+    } else if (word < kOrder[i]) {
       break;
     } else if (i == 0) {
       return 0;
@@ -1976,7 +1969,7 @@
   x25519_sc_reduce(h);
 
   ge_p2 R;
-  ge_double_scalarmult_vartime(&R, h, &A, scopy.u8);
+  ge_double_scalarmult_vartime(&R, h, &A, scopy);
 
   uint8_t rcheck[32];
   x25519_ge_tobytes(rcheck, &R);
diff --git a/src/crypto/curve25519/spake25519.c b/src/crypto/curve25519/spake25519.c
index f750911..c45d15a 100644
--- a/src/crypto/curve25519/spake25519.c
+++ b/src/crypto/curve25519/spake25519.c
@@ -22,6 +22,7 @@
 #include <openssl/rand.h>
 #include <openssl/sha.h>
 
+#include "../fipsmodule/bn/internal.h"
 #include "../internal.h"
 #include "./internal.h"
 
@@ -314,46 +315,30 @@
   }
 }
 
-typedef union {
-  uint8_t bytes[32];
-  uint32_t words[8];
+typedef struct {
+  BN_ULONG words[32 / sizeof(BN_ULONG)];
 } scalar;
 
-// kOrder is the order of the prime-order subgroup of curve25519 in
-// little-endian order.
-static const scalar kOrder = {{0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
-                               0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
-                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}};
+// kOrder is the order of the prime-order subgroup of curve25519.
+static const scalar kOrder = {
+    {TOBN(0x5812631a, 0x5cf5d3ed), TOBN(0x14def9de, 0xa2f79cd6),
+     TOBN(0x00000000, 0x00000000), TOBN(0x10000000, 0x00000000)}};
 
 // scalar_cmov copies |src| to |dest| if |mask| is all ones.
 static void scalar_cmov(scalar *dest, const scalar *src, crypto_word_t mask) {
-  for (size_t i = 0; i < 8; i++) {
-    dest->words[i] =
-        constant_time_select_w(mask, src->words[i], dest->words[i]);
-  }
+  bn_select_words(dest->words, mask, src->words, dest->words,
+                  OPENSSL_ARRAY_SIZE(dest->words));
 }
 
 // scalar_double sets |s| to |2×s|.
 static void scalar_double(scalar *s) {
-  uint32_t carry = 0;
-
-  for (size_t i = 0; i < 8; i++) {
-    const uint32_t carry_out = s->words[i] >> 31;
-    s->words[i] = (s->words[i] << 1) | carry;
-    carry = carry_out;
-  }
+  bn_add_words(s->words, s->words, s->words, OPENSSL_ARRAY_SIZE(s->words));
 }
 
 // scalar_add sets |dest| to |dest| plus |src|.
 static void scalar_add(scalar *dest, const scalar *src) {
-  uint32_t carry = 0;
-
-  for (size_t i = 0; i < 8; i++) {
-    uint64_t tmp = ((uint64_t)dest->words[i] + src->words[i]) + carry;
-    dest->words[i] = (uint32_t)tmp;
-    carry = (uint32_t)(tmp >> 32);
-  }
+  bn_add_words(dest->words, dest->words, src->words,
+               OPENSSL_ARRAY_SIZE(dest->words));
 }
 
 int SPAKE2_generate_msg(SPAKE2_CTX *ctx, uint8_t *out, size_t *out_len,
@@ -412,25 +397,25 @@
 
     OPENSSL_memset(&tmp, 0, sizeof(tmp));
     scalar_cmov(&tmp, &order,
-                constant_time_eq_w(password_scalar.bytes[0] & 1, 1));
+                constant_time_eq_w(password_scalar.words[0] & 1, 1));
     scalar_add(&password_scalar, &tmp);
 
     scalar_double(&order);
     OPENSSL_memset(&tmp, 0, sizeof(tmp));
     scalar_cmov(&tmp, &order,
-                constant_time_eq_w(password_scalar.bytes[0] & 2, 2));
+                constant_time_eq_w(password_scalar.words[0] & 2, 2));
     scalar_add(&password_scalar, &tmp);
 
     scalar_double(&order);
     OPENSSL_memset(&tmp, 0, sizeof(tmp));
     scalar_cmov(&tmp, &order,
-                constant_time_eq_w(password_scalar.bytes[0] & 4, 4));
+                constant_time_eq_w(password_scalar.words[0] & 4, 4));
     scalar_add(&password_scalar, &tmp);
 
-    assert((password_scalar.bytes[0] & 7) == 0);
+    assert((password_scalar.words[0] & 7) == 0);
   }
 
-  OPENSSL_memcpy(ctx->password_scalar, password_scalar.bytes,
+  OPENSSL_memcpy(ctx->password_scalar, password_scalar.words,
                  sizeof(ctx->password_scalar));
 
   ge_p3 mask;
diff --git a/src/crypto/fipsmodule/des/des.c b/src/crypto/des/des.c
similarity index 100%
rename from src/crypto/fipsmodule/des/des.c
rename to src/crypto/des/des.c
diff --git a/src/crypto/fipsmodule/des/internal.h b/src/crypto/des/internal.h
similarity index 99%
rename from src/crypto/fipsmodule/des/internal.h
rename to src/crypto/des/internal.h
index 3e3992e..2124fd5 100644
--- a/src/crypto/fipsmodule/des/internal.h
+++ b/src/crypto/des/internal.h
@@ -59,7 +59,7 @@
 
 #include <openssl/base.h>
 
-#include "../../internal.h"
+#include "../internal.h"
 
 #if defined(__cplusplus)
 extern "C" {
diff --git a/src/crypto/dh_extra/dh_asn1.c b/src/crypto/dh_extra/dh_asn1.c
index 9d32180..de01077 100644
--- a/src/crypto/dh_extra/dh_asn1.c
+++ b/src/crypto/dh_extra/dh_asn1.c
@@ -63,6 +63,7 @@
 #include <openssl/err.h>
 
 #include "../bytestring/internal.h"
+#include "../fipsmodule/dh/internal.h"
 
 
 static int parse_integer(CBS *cbs, BIGNUM **out) {
diff --git a/src/crypto/dh_extra/dh_test.cc b/src/crypto/dh_extra/dh_test.cc
index 7933a8c..b88702b 100644
--- a/src/crypto/dh_extra/dh_test.cc
+++ b/src/crypto/dh_extra/dh_test.cc
@@ -70,6 +70,7 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
+#include "../fipsmodule/dh/internal.h"
 #include "../internal.h"
 #include "../test/test_util.h"
 
@@ -134,42 +135,36 @@
   }
 
   printf("\np    = ");
-  BN_print_fp(stdout, a->p);
+  BN_print_fp(stdout, DH_get0_p(a.get()));
   printf("\ng    = ");
-  BN_print_fp(stdout, a->g);
+  BN_print_fp(stdout, DH_get0_g(a.get()));
   printf("\n");
 
-  bssl::UniquePtr<DH> b(DH_new());
+  bssl::UniquePtr<DH> b(DHparams_dup(a.get()));
   if (!b) {
     return false;
   }
 
-  b->p = BN_dup(a->p);
-  b->g = BN_dup(a->g);
-  if (b->p == nullptr || b->g == nullptr) {
-    return false;
-  }
-
   if (!DH_generate_key(a.get())) {
     return false;
   }
   printf("pri1 = ");
-  BN_print_fp(stdout, a->priv_key);
+  BN_print_fp(stdout, DH_get0_priv_key(a.get()));
   printf("\npub1 = ");
-  BN_print_fp(stdout, a->pub_key);
+  BN_print_fp(stdout, DH_get0_pub_key(a.get()));
   printf("\n");
 
   if (!DH_generate_key(b.get())) {
     return false;
   }
   printf("pri2 = ");
-  BN_print_fp(stdout, b->priv_key);
+  BN_print_fp(stdout, DH_get0_priv_key(b.get()));
   printf("\npub2 = ");
-  BN_print_fp(stdout, b->pub_key);
+  BN_print_fp(stdout, DH_get0_pub_key(b.get()));
   printf("\n");
 
   std::vector<uint8_t> key1(DH_size(a.get()));
-  int ret = DH_compute_key(key1.data(), b->pub_key, a.get());
+  int ret = DH_compute_key(key1.data(), DH_get0_pub_key(b.get()), a.get());
   if (ret < 0) {
     return false;
   }
@@ -182,7 +177,7 @@
   printf("\n");
 
   std::vector<uint8_t> key2(DH_size(b.get()));
-  ret = DH_compute_key(key2.data(), a->pub_key, b.get());
+  ret = DH_compute_key(key2.data(), DH_get0_pub_key(a.get()), b.get());
   if (ret < 0) {
     return false;
   }
@@ -343,9 +338,9 @@
   bssl::UniquePtr<DH> dh(DH_parse_parameters(&cbs));
   if (!dh || CBS_len(&cbs) != 0 ||
       !BIGNUMEqualsHex(
-          dh->p,
+          DH_get0_p(dh.get()),
           "d72034a3274fdfbf04fd246825b656d8ab2a412d740a52087c40714ed2579313") ||
-      !BIGNUMEqualsHex(dh->g, "2") || dh->priv_length != 0) {
+      !BIGNUMEqualsHex(DH_get0_g(dh.get()), "2") || dh->priv_length != 0) {
     return false;
   }
 
@@ -383,11 +378,11 @@
   CBS_init(&cbs, kParamsDSA, sizeof(kParamsDSA));
   dh.reset(DH_parse_parameters(&cbs));
   if (!dh || CBS_len(&cbs) != 0 ||
-      !BIGNUMEqualsHex(dh->p,
+      !BIGNUMEqualsHex(DH_get0_p(dh.get()),
                        "93f3c11801e662b6d1469a2c72ea31d91810302863e2347d80caee8"
                        "22b193c19bb42830270dddb8c03abe99cc4004d705f5203312ca467"
                        "3451952aac11e26a55") ||
-      !BIGNUMEqualsHex(dh->g,
+      !BIGNUMEqualsHex(DH_get0_g(dh.get()),
                        "44c8105344323163d8d18c75c898533b5b4a2a0a09e7d03c5372a86"
                        "b70419c267144fc7f0875e102ab7441e82a3d3c263309e48bb441ec"
                        "a6a8ba1a078a77f55f") ||
diff --git a/src/crypto/dh_extra/params.c b/src/crypto/dh_extra/params.c
index 6023ab1..0e76747 100644
--- a/src/crypto/dh_extra/params.c
+++ b/src/crypto/dh_extra/params.c
@@ -57,10 +57,29 @@
 #include <openssl/mem.h>
 
 #include "../fipsmodule/bn/internal.h"
+#include "../fipsmodule/dh/internal.h"
 
 
+static BIGNUM *get_params(BIGNUM *ret, const BN_ULONG *words, size_t num_words) {
+  BIGNUM *alloc = NULL;
+  if (ret == NULL) {
+    alloc = BN_new();
+    if (alloc == NULL) {
+      return NULL;
+    }
+    ret = alloc;
+  }
+
+  if (!bn_set_words(ret, words, num_words)) {
+    BN_free(alloc);
+    return NULL;
+  }
+
+  return ret;
+}
+
 BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret) {
-  static const BN_ULONG kPrime1536Data[] = {
+  static const BN_ULONG kWords[] = {
       TOBN(0xffffffff, 0xffffffff), TOBN(0xf1746c08, 0xca237327),
       TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
       TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
@@ -74,24 +93,221 @@
       TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
       TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
   };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
+}
 
-  static const BIGNUM kPrime1536BN = STATIC_BIGNUM(kPrime1536Data);
+BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret) {
+  static const BN_ULONG kWords[] = {
+      TOBN(0xffffffff, 0xffffffff), TOBN(0x15728e5a, 0x8aacaa68),
+      TOBN(0x15d22618, 0x98fa0510), TOBN(0x3995497c, 0xea956ae5),
+      TOBN(0xde2bcbf6, 0x95581718), TOBN(0xb5c55df0, 0x6f4c52c9),
+      TOBN(0x9b2783a2, 0xec07a28f), TOBN(0xe39e772c, 0x180e8603),
+      TOBN(0x32905e46, 0x2e36ce3b), TOBN(0xf1746c08, 0xca18217c),
+      TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
+      TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
+      TOBN(0x69163fa8, 0xfd24cf5f), TOBN(0x98da4836, 0x1c55d39a),
+      TOBN(0xc2007cb8, 0xa163bf05), TOBN(0x49286651, 0xece45b3d),
+      TOBN(0xae9f2411, 0x7c4b1fe6), TOBN(0xee386bfb, 0x5a899fa5),
+      TOBN(0x0bff5cb6, 0xf406b7ed), TOBN(0xf44c42e9, 0xa637ed6b),
+      TOBN(0xe485b576, 0x625e7ec6), TOBN(0x4fe1356d, 0x6d51c245),
+      TOBN(0x302b0a6d, 0xf25f1437), TOBN(0xef9519b3, 0xcd3a431b),
+      TOBN(0x514a0879, 0x8e3404dd), TOBN(0x020bbea6, 0x3b139b22),
+      TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
+      TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
+  };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
+}
 
-  BIGNUM *alloc = NULL;
-  if (ret == NULL) {
-    alloc = BN_new();
-    if (alloc == NULL) {
-      return NULL;
-    }
-    ret = alloc;
-  }
+BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret) {
+  static const BN_ULONG kWords[] = {
+      TOBN(0xffffffff, 0xffffffff), TOBN(0x4b82d120, 0xa93ad2ca),
+      TOBN(0x43db5bfc, 0xe0fd108e), TOBN(0x08e24fa0, 0x74e5ab31),
+      TOBN(0x770988c0, 0xbad946e2), TOBN(0xbbe11757, 0x7a615d6c),
+      TOBN(0x521f2b18, 0x177b200c), TOBN(0xd8760273, 0x3ec86a64),
+      TOBN(0xf12ffa06, 0xd98a0864), TOBN(0xcee3d226, 0x1ad2ee6b),
+      TOBN(0x1e8c94e0, 0x4a25619d), TOBN(0xabf5ae8c, 0xdb0933d7),
+      TOBN(0xb3970f85, 0xa6e1e4c7), TOBN(0x8aea7157, 0x5d060c7d),
+      TOBN(0xecfb8504, 0x58dbef0a), TOBN(0xa85521ab, 0xdf1cba64),
+      TOBN(0xad33170d, 0x04507a33), TOBN(0x15728e5a, 0x8aaac42d),
+      TOBN(0x15d22618, 0x98fa0510), TOBN(0x3995497c, 0xea956ae5),
+      TOBN(0xde2bcbf6, 0x95581718), TOBN(0xb5c55df0, 0x6f4c52c9),
+      TOBN(0x9b2783a2, 0xec07a28f), TOBN(0xe39e772c, 0x180e8603),
+      TOBN(0x32905e46, 0x2e36ce3b), TOBN(0xf1746c08, 0xca18217c),
+      TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
+      TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
+      TOBN(0x69163fa8, 0xfd24cf5f), TOBN(0x98da4836, 0x1c55d39a),
+      TOBN(0xc2007cb8, 0xa163bf05), TOBN(0x49286651, 0xece45b3d),
+      TOBN(0xae9f2411, 0x7c4b1fe6), TOBN(0xee386bfb, 0x5a899fa5),
+      TOBN(0x0bff5cb6, 0xf406b7ed), TOBN(0xf44c42e9, 0xa637ed6b),
+      TOBN(0xe485b576, 0x625e7ec6), TOBN(0x4fe1356d, 0x6d51c245),
+      TOBN(0x302b0a6d, 0xf25f1437), TOBN(0xef9519b3, 0xcd3a431b),
+      TOBN(0x514a0879, 0x8e3404dd), TOBN(0x020bbea6, 0x3b139b22),
+      TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
+      TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
+  };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
+}
 
-  if (!BN_copy(ret, &kPrime1536BN)) {
-    BN_free(alloc);
-    return NULL;
-  }
+BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret) {
+  static const BN_ULONG kWords[] = {
+      TOBN(0xffffffff, 0xffffffff), TOBN(0x4df435c9, 0x34063199),
+      TOBN(0x86ffb7dc, 0x90a6c08f), TOBN(0x93b4ea98, 0x8d8fddc1),
+      TOBN(0xd0069127, 0xd5b05aa9), TOBN(0xb81bdd76, 0x2170481c),
+      TOBN(0x1f612970, 0xcee2d7af), TOBN(0x233ba186, 0x515be7ed),
+      TOBN(0x99b2964f, 0xa090c3a2), TOBN(0x287c5947, 0x4e6bc05d),
+      TOBN(0x2e8efc14, 0x1fbecaa6), TOBN(0xdbbbc2db, 0x04de8ef9),
+      TOBN(0x2583e9ca, 0x2ad44ce8), TOBN(0x1a946834, 0xb6150bda),
+      TOBN(0x99c32718, 0x6af4e23c), TOBN(0x88719a10, 0xbdba5b26),
+      TOBN(0x1a723c12, 0xa787e6d7), TOBN(0x4b82d120, 0xa9210801),
+      TOBN(0x43db5bfc, 0xe0fd108e), TOBN(0x08e24fa0, 0x74e5ab31),
+      TOBN(0x770988c0, 0xbad946e2), TOBN(0xbbe11757, 0x7a615d6c),
+      TOBN(0x521f2b18, 0x177b200c), TOBN(0xd8760273, 0x3ec86a64),
+      TOBN(0xf12ffa06, 0xd98a0864), TOBN(0xcee3d226, 0x1ad2ee6b),
+      TOBN(0x1e8c94e0, 0x4a25619d), TOBN(0xabf5ae8c, 0xdb0933d7),
+      TOBN(0xb3970f85, 0xa6e1e4c7), TOBN(0x8aea7157, 0x5d060c7d),
+      TOBN(0xecfb8504, 0x58dbef0a), TOBN(0xa85521ab, 0xdf1cba64),
+      TOBN(0xad33170d, 0x04507a33), TOBN(0x15728e5a, 0x8aaac42d),
+      TOBN(0x15d22618, 0x98fa0510), TOBN(0x3995497c, 0xea956ae5),
+      TOBN(0xde2bcbf6, 0x95581718), TOBN(0xb5c55df0, 0x6f4c52c9),
+      TOBN(0x9b2783a2, 0xec07a28f), TOBN(0xe39e772c, 0x180e8603),
+      TOBN(0x32905e46, 0x2e36ce3b), TOBN(0xf1746c08, 0xca18217c),
+      TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
+      TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
+      TOBN(0x69163fa8, 0xfd24cf5f), TOBN(0x98da4836, 0x1c55d39a),
+      TOBN(0xc2007cb8, 0xa163bf05), TOBN(0x49286651, 0xece45b3d),
+      TOBN(0xae9f2411, 0x7c4b1fe6), TOBN(0xee386bfb, 0x5a899fa5),
+      TOBN(0x0bff5cb6, 0xf406b7ed), TOBN(0xf44c42e9, 0xa637ed6b),
+      TOBN(0xe485b576, 0x625e7ec6), TOBN(0x4fe1356d, 0x6d51c245),
+      TOBN(0x302b0a6d, 0xf25f1437), TOBN(0xef9519b3, 0xcd3a431b),
+      TOBN(0x514a0879, 0x8e3404dd), TOBN(0x020bbea6, 0x3b139b22),
+      TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
+      TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
+  };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
+}
 
-  return ret;
+BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret) {
+  static const BN_ULONG kWords[] = {
+      TOBN(0xffffffff, 0xffffffff), TOBN(0xe694f91e, 0x6dcc4024),
+      TOBN(0x12bf2d5b, 0x0b7474d6), TOBN(0x043e8f66, 0x3f4860ee),
+      TOBN(0x387fe8d7, 0x6e3c0468), TOBN(0xda56c9ec, 0x2ef29632),
+      TOBN(0xeb19ccb1, 0xa313d55c), TOBN(0xf550aa3d, 0x8a1fbff0),
+      TOBN(0x06a1d58b, 0xb7c5da76), TOBN(0xa79715ee, 0xf29be328),
+      TOBN(0x14cc5ed2, 0x0f8037e0), TOBN(0xcc8f6d7e, 0xbf48e1d8),
+      TOBN(0x4bd407b2, 0x2b4154aa), TOBN(0x0f1d45b7, 0xff585ac5),
+      TOBN(0x23a97a7e, 0x36cc88be), TOBN(0x59e7c97f, 0xbec7e8f3),
+      TOBN(0xb5a84031, 0x900b1c9e), TOBN(0xd55e702f, 0x46980c82),
+      TOBN(0xf482d7ce, 0x6e74fef6), TOBN(0xf032ea15, 0xd1721d03),
+      TOBN(0x5983ca01, 0xc64b92ec), TOBN(0x6fb8f401, 0x378cd2bf),
+      TOBN(0x33205151, 0x2bd7af42), TOBN(0xdb7f1447, 0xe6cc254b),
+      TOBN(0x44ce6cba, 0xced4bb1b), TOBN(0xda3edbeb, 0xcf9b14ed),
+      TOBN(0x179727b0, 0x865a8918), TOBN(0xb06a53ed, 0x9027d831),
+      TOBN(0xe5db382f, 0x413001ae), TOBN(0xf8ff9406, 0xad9e530e),
+      TOBN(0xc9751e76, 0x3dba37bd), TOBN(0xc1d4dcb2, 0x602646de),
+      TOBN(0x36c3fab4, 0xd27c7026), TOBN(0x4df435c9, 0x34028492),
+      TOBN(0x86ffb7dc, 0x90a6c08f), TOBN(0x93b4ea98, 0x8d8fddc1),
+      TOBN(0xd0069127, 0xd5b05aa9), TOBN(0xb81bdd76, 0x2170481c),
+      TOBN(0x1f612970, 0xcee2d7af), TOBN(0x233ba186, 0x515be7ed),
+      TOBN(0x99b2964f, 0xa090c3a2), TOBN(0x287c5947, 0x4e6bc05d),
+      TOBN(0x2e8efc14, 0x1fbecaa6), TOBN(0xdbbbc2db, 0x04de8ef9),
+      TOBN(0x2583e9ca, 0x2ad44ce8), TOBN(0x1a946834, 0xb6150bda),
+      TOBN(0x99c32718, 0x6af4e23c), TOBN(0x88719a10, 0xbdba5b26),
+      TOBN(0x1a723c12, 0xa787e6d7), TOBN(0x4b82d120, 0xa9210801),
+      TOBN(0x43db5bfc, 0xe0fd108e), TOBN(0x08e24fa0, 0x74e5ab31),
+      TOBN(0x770988c0, 0xbad946e2), TOBN(0xbbe11757, 0x7a615d6c),
+      TOBN(0x521f2b18, 0x177b200c), TOBN(0xd8760273, 0x3ec86a64),
+      TOBN(0xf12ffa06, 0xd98a0864), TOBN(0xcee3d226, 0x1ad2ee6b),
+      TOBN(0x1e8c94e0, 0x4a25619d), TOBN(0xabf5ae8c, 0xdb0933d7),
+      TOBN(0xb3970f85, 0xa6e1e4c7), TOBN(0x8aea7157, 0x5d060c7d),
+      TOBN(0xecfb8504, 0x58dbef0a), TOBN(0xa85521ab, 0xdf1cba64),
+      TOBN(0xad33170d, 0x04507a33), TOBN(0x15728e5a, 0x8aaac42d),
+      TOBN(0x15d22618, 0x98fa0510), TOBN(0x3995497c, 0xea956ae5),
+      TOBN(0xde2bcbf6, 0x95581718), TOBN(0xb5c55df0, 0x6f4c52c9),
+      TOBN(0x9b2783a2, 0xec07a28f), TOBN(0xe39e772c, 0x180e8603),
+      TOBN(0x32905e46, 0x2e36ce3b), TOBN(0xf1746c08, 0xca18217c),
+      TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
+      TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
+      TOBN(0x69163fa8, 0xfd24cf5f), TOBN(0x98da4836, 0x1c55d39a),
+      TOBN(0xc2007cb8, 0xa163bf05), TOBN(0x49286651, 0xece45b3d),
+      TOBN(0xae9f2411, 0x7c4b1fe6), TOBN(0xee386bfb, 0x5a899fa5),
+      TOBN(0x0bff5cb6, 0xf406b7ed), TOBN(0xf44c42e9, 0xa637ed6b),
+      TOBN(0xe485b576, 0x625e7ec6), TOBN(0x4fe1356d, 0x6d51c245),
+      TOBN(0x302b0a6d, 0xf25f1437), TOBN(0xef9519b3, 0xcd3a431b),
+      TOBN(0x514a0879, 0x8e3404dd), TOBN(0x020bbea6, 0x3b139b22),
+      TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
+      TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
+  };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
+}
+
+BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret) {
+  static const BN_ULONG kWords[] = {
+      TOBN(0xffffffff, 0xffffffff), TOBN(0x60c980dd, 0x98edd3df),
+      TOBN(0xc81f56e8, 0x80b96e71), TOBN(0x9e3050e2, 0x765694df),
+      TOBN(0x9558e447, 0x5677e9aa), TOBN(0xc9190da6, 0xfc026e47),
+      TOBN(0x889a002e, 0xd5ee382b), TOBN(0x4009438b, 0x481c6cd7),
+      TOBN(0x359046f4, 0xeb879f92), TOBN(0xfaf36bc3, 0x1ecfa268),
+      TOBN(0xb1d510bd, 0x7ee74d73), TOBN(0xf9ab4819, 0x5ded7ea1),
+      TOBN(0x64f31cc5, 0x0846851d), TOBN(0x4597e899, 0xa0255dc1),
+      TOBN(0xdf310ee0, 0x74ab6a36), TOBN(0x6d2a13f8, 0x3f44f82d),
+      TOBN(0x062b3cf5, 0xb3a278a6), TOBN(0x79683303, 0xed5bdd3a),
+      TOBN(0xfa9d4b7f, 0xa2c087e8), TOBN(0x4bcbc886, 0x2f8385dd),
+      TOBN(0x3473fc64, 0x6cea306b), TOBN(0x13eb57a8, 0x1a23f0c7),
+      TOBN(0x22222e04, 0xa4037c07), TOBN(0xe3fdb8be, 0xfc848ad9),
+      TOBN(0x238f16cb, 0xe39d652d), TOBN(0x3423b474, 0x2bf1c978),
+      TOBN(0x3aab639c, 0x5ae4f568), TOBN(0x2576f693, 0x6ba42466),
+      TOBN(0x741fa7bf, 0x8afc47ed), TOBN(0x3bc832b6, 0x8d9dd300),
+      TOBN(0xd8bec4d0, 0x73b931ba), TOBN(0x38777cb6, 0xa932df8c),
+      TOBN(0x74a3926f, 0x12fee5e4), TOBN(0xe694f91e, 0x6dbe1159),
+      TOBN(0x12bf2d5b, 0x0b7474d6), TOBN(0x043e8f66, 0x3f4860ee),
+      TOBN(0x387fe8d7, 0x6e3c0468), TOBN(0xda56c9ec, 0x2ef29632),
+      TOBN(0xeb19ccb1, 0xa313d55c), TOBN(0xf550aa3d, 0x8a1fbff0),
+      TOBN(0x06a1d58b, 0xb7c5da76), TOBN(0xa79715ee, 0xf29be328),
+      TOBN(0x14cc5ed2, 0x0f8037e0), TOBN(0xcc8f6d7e, 0xbf48e1d8),
+      TOBN(0x4bd407b2, 0x2b4154aa), TOBN(0x0f1d45b7, 0xff585ac5),
+      TOBN(0x23a97a7e, 0x36cc88be), TOBN(0x59e7c97f, 0xbec7e8f3),
+      TOBN(0xb5a84031, 0x900b1c9e), TOBN(0xd55e702f, 0x46980c82),
+      TOBN(0xf482d7ce, 0x6e74fef6), TOBN(0xf032ea15, 0xd1721d03),
+      TOBN(0x5983ca01, 0xc64b92ec), TOBN(0x6fb8f401, 0x378cd2bf),
+      TOBN(0x33205151, 0x2bd7af42), TOBN(0xdb7f1447, 0xe6cc254b),
+      TOBN(0x44ce6cba, 0xced4bb1b), TOBN(0xda3edbeb, 0xcf9b14ed),
+      TOBN(0x179727b0, 0x865a8918), TOBN(0xb06a53ed, 0x9027d831),
+      TOBN(0xe5db382f, 0x413001ae), TOBN(0xf8ff9406, 0xad9e530e),
+      TOBN(0xc9751e76, 0x3dba37bd), TOBN(0xc1d4dcb2, 0x602646de),
+      TOBN(0x36c3fab4, 0xd27c7026), TOBN(0x4df435c9, 0x34028492),
+      TOBN(0x86ffb7dc, 0x90a6c08f), TOBN(0x93b4ea98, 0x8d8fddc1),
+      TOBN(0xd0069127, 0xd5b05aa9), TOBN(0xb81bdd76, 0x2170481c),
+      TOBN(0x1f612970, 0xcee2d7af), TOBN(0x233ba186, 0x515be7ed),
+      TOBN(0x99b2964f, 0xa090c3a2), TOBN(0x287c5947, 0x4e6bc05d),
+      TOBN(0x2e8efc14, 0x1fbecaa6), TOBN(0xdbbbc2db, 0x04de8ef9),
+      TOBN(0x2583e9ca, 0x2ad44ce8), TOBN(0x1a946834, 0xb6150bda),
+      TOBN(0x99c32718, 0x6af4e23c), TOBN(0x88719a10, 0xbdba5b26),
+      TOBN(0x1a723c12, 0xa787e6d7), TOBN(0x4b82d120, 0xa9210801),
+      TOBN(0x43db5bfc, 0xe0fd108e), TOBN(0x08e24fa0, 0x74e5ab31),
+      TOBN(0x770988c0, 0xbad946e2), TOBN(0xbbe11757, 0x7a615d6c),
+      TOBN(0x521f2b18, 0x177b200c), TOBN(0xd8760273, 0x3ec86a64),
+      TOBN(0xf12ffa06, 0xd98a0864), TOBN(0xcee3d226, 0x1ad2ee6b),
+      TOBN(0x1e8c94e0, 0x4a25619d), TOBN(0xabf5ae8c, 0xdb0933d7),
+      TOBN(0xb3970f85, 0xa6e1e4c7), TOBN(0x8aea7157, 0x5d060c7d),
+      TOBN(0xecfb8504, 0x58dbef0a), TOBN(0xa85521ab, 0xdf1cba64),
+      TOBN(0xad33170d, 0x04507a33), TOBN(0x15728e5a, 0x8aaac42d),
+      TOBN(0x15d22618, 0x98fa0510), TOBN(0x3995497c, 0xea956ae5),
+      TOBN(0xde2bcbf6, 0x95581718), TOBN(0xb5c55df0, 0x6f4c52c9),
+      TOBN(0x9b2783a2, 0xec07a28f), TOBN(0xe39e772c, 0x180e8603),
+      TOBN(0x32905e46, 0x2e36ce3b), TOBN(0xf1746c08, 0xca18217c),
+      TOBN(0x670c354e, 0x4abc9804), TOBN(0x9ed52907, 0x7096966d),
+      TOBN(0x1c62f356, 0x208552bb), TOBN(0x83655d23, 0xdca3ad96),
+      TOBN(0x69163fa8, 0xfd24cf5f), TOBN(0x98da4836, 0x1c55d39a),
+      TOBN(0xc2007cb8, 0xa163bf05), TOBN(0x49286651, 0xece45b3d),
+      TOBN(0xae9f2411, 0x7c4b1fe6), TOBN(0xee386bfb, 0x5a899fa5),
+      TOBN(0x0bff5cb6, 0xf406b7ed), TOBN(0xf44c42e9, 0xa637ed6b),
+      TOBN(0xe485b576, 0x625e7ec6), TOBN(0x4fe1356d, 0x6d51c245),
+      TOBN(0x302b0a6d, 0xf25f1437), TOBN(0xef9519b3, 0xcd3a431b),
+      TOBN(0x514a0879, 0x8e3404dd), TOBN(0x020bbea6, 0x3b139b22),
+      TOBN(0x29024e08, 0x8a67cc74), TOBN(0xc4c6628b, 0x80dc1cd1),
+      TOBN(0xc90fdaa2, 0x2168c234), TOBN(0xffffffff, 0xffffffff),
+  };
+  return get_params(ret, kWords, OPENSSL_ARRAY_SIZE(kWords));
 }
 
 int DH_generate_parameters_ex(DH *dh, int prime_bits, int generator,
@@ -237,23 +453,10 @@
     return 1;
   }
 
-  if (!int_dh_bn_cpy(&to->q, from->q) ||
-      !int_dh_bn_cpy(&to->j, from->j)) {
+  if (!int_dh_bn_cpy(&to->q, from->q)) {
     return 0;
   }
 
-  OPENSSL_free(to->seed);
-  to->seed = NULL;
-  to->seedlen = 0;
-
-  if (from->seed) {
-    to->seed = OPENSSL_memdup(from->seed, from->seedlen);
-    if (!to->seed) {
-      return 0;
-    }
-    to->seedlen = from->seedlen;
-  }
-
   return 1;
 }
 
diff --git a/src/crypto/dsa/dsa.c b/src/crypto/dsa/dsa.c
index 8e77ea3..f1fc02f 100644
--- a/src/crypto/dsa/dsa.c
+++ b/src/crypto/dsa/dsa.c
@@ -74,6 +74,7 @@
 
 #include "internal.h"
 #include "../fipsmodule/bn/internal.h"
+#include "../fipsmodule/dh/internal.h"
 #include "../internal.h"
 
 
@@ -130,6 +131,8 @@
   return 1;
 }
 
+unsigned DSA_bits(const DSA *dsa) { return BN_num_bits(dsa->p); }
+
 const BIGNUM *DSA_get0_pub_key(const DSA *dsa) { return dsa->pub_key; }
 
 const BIGNUM *DSA_get0_priv_key(const DSA *dsa) { return dsa->priv_key; }
diff --git a/src/crypto/dsa/dsa_test.cc b/src/crypto/dsa/dsa_test.cc
index 4682131..cee783d 100644
--- a/src/crypto/dsa/dsa_test.cc
+++ b/src/crypto/dsa/dsa_test.cc
@@ -243,7 +243,7 @@
     fprintf(out, "%02X%02X%02X%02X ", seed[i], seed[i + 1], seed[i + 2],
             seed[i + 3]);
   }
-  fprintf(out, "\ncounter=%d h=%ld\n", counter, h);
+  fprintf(out, "\ncounter=%d h=%lu\n", counter, h);
 
   if (counter != 105) {
     fprintf(stderr, "counter should be 105\n");
diff --git a/src/crypto/ec_extra/hash_to_curve.c b/src/crypto/ec_extra/hash_to_curve.c
index 9c82454..fa7ff59 100644
--- a/src/crypto/ec_extra/hash_to_curve.c
+++ b/src/crypto/ec_extra/hash_to_curve.c
@@ -17,7 +17,6 @@
 #include <openssl/digest.h>
 #include <openssl/err.h>
 #include <openssl/nid.h>
-#include <openssl/type_check.h>
 
 #include <assert.h>
 
@@ -61,7 +60,7 @@
   EVP_MD_CTX_init(&ctx);
 
   // Long DSTs are hashed down to size. See section 5.3.3.
-  OPENSSL_STATIC_ASSERT(EVP_MAX_MD_SIZE < 256, "hashed DST still too large");
+  static_assert(EVP_MAX_MD_SIZE < 256, "hashed DST still too large");
   uint8_t dst_buf[EVP_MAX_MD_SIZE];
   if (dst_len >= 256) {
     static const char kPrefix[] = "H2C-OVERSIZE-DST-";
diff --git a/src/crypto/err/asn1.errordata b/src/crypto/err/asn1.errordata
index 9344621..8ba7cf6 100644
--- a/src/crypto/err/asn1.errordata
+++ b/src/crypto/err/asn1.errordata
@@ -44,6 +44,7 @@
 ASN1,194,INVALID_BIT_STRING_PADDING
 ASN1,142,INVALID_BMPSTRING
 ASN1,143,INVALID_DIGIT
+ASN1,196,INVALID_INTEGER
 ASN1,144,INVALID_MODIFIER
 ASN1,145,INVALID_NUMBER
 ASN1,146,INVALID_OBJECT_ENCODING
@@ -90,6 +91,7 @@
 ASN1,186,UNSUPPORTED_ANY_DEFINED_BY_TYPE
 ASN1,187,UNSUPPORTED_PUBLIC_KEY_TYPE
 ASN1,188,UNSUPPORTED_TYPE
+ASN1,195,WRONG_INTEGER_TYPE
 ASN1,189,WRONG_PUBLIC_KEY_TYPE
 ASN1,190,WRONG_TAG
 ASN1,191,WRONG_TYPE
diff --git a/src/crypto/err/err.c b/src/crypto/err/err.c
index 4aab75b..9b6d238 100644
--- a/src/crypto/err/err.c
+++ b/src/crypto/err/err.c
@@ -745,6 +745,22 @@
   err_set_error_data(buf);
 }
 
+void ERR_set_error_data(char *data, int flags) {
+  if (!(flags & ERR_FLAG_STRING)) {
+    // We do not support non-string error data.
+    assert(0);
+    return;
+  }
+  if (flags & ERR_FLAG_MALLOCED) {
+    err_set_error_data(data);
+  } else {
+    char *copy = OPENSSL_strdup(data);
+    if (copy != NULL) {
+      err_set_error_data(copy);
+    }
+  }
+}
+
 int ERR_set_mark(void) {
   ERR_STATE *const state = err_get_state();
 
diff --git a/src/crypto/err/err_data_generate.go b/src/crypto/err/err_data_generate.go
index e8aefd8..963964c 100644
--- a/src/crypto/err/err_data_generate.go
+++ b/src/crypto/err/err_data_generate.go
@@ -270,15 +270,15 @@
 
 #include <openssl/base.h>
 #include <openssl/err.h>
-#include <openssl/type_check.h>
 
+#include <assert.h>
 
 `)
 
 	for i, name := range libraryNames {
-		fmt.Fprintf(out, "OPENSSL_STATIC_ASSERT(ERR_LIB_%s == %d, \"library value changed\");\n", name, i+1)
+		fmt.Fprintf(out, "static_assert(ERR_LIB_%s == %d, \"library value changed\");\n", name, i+1)
 	}
-	fmt.Fprintf(out, "OPENSSL_STATIC_ASSERT(ERR_NUM_LIBS == %d, \"number of libraries changed\");\n", len(libraryNames)+1)
+	fmt.Fprintf(out, "static_assert(ERR_NUM_LIBS == %d, \"number of libraries changed\");\n", len(libraryNames)+1)
 	out.WriteString("\n")
 
 	e.reasons.WriteTo(out, "Reason")
diff --git a/src/crypto/err/err_test.cc b/src/crypto/err/err_test.cc
index b41f8dd..5dbe776 100644
--- a/src/crypto/err/err_test.cc
+++ b/src/crypto/err/err_test.cc
@@ -75,6 +75,17 @@
   EXPECT_EQ(1, ERR_GET_LIB(packed_error));
   EXPECT_EQ(2, ERR_GET_REASON(packed_error));
   EXPECT_STREQ("testing", data);
+
+  ERR_put_error(1, 0 /* unused */, 2, "test", 4);
+  ERR_set_error_data(const_cast<char *>("testing"), ERR_FLAG_STRING);
+  packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
+  EXPECT_STREQ("testing", data);
+
+  ERR_put_error(1, 0 /* unused */, 2, "test", 4);
+  bssl::UniquePtr<char> str(OPENSSL_strdup("testing"));
+  ERR_set_error_data(str.release(), ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
+  packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
+  EXPECT_STREQ("testing", data);
 }
 
 TEST(ErrTest, ClearError) {
diff --git a/src/crypto/err/pkcs8.errordata b/src/crypto/err/pkcs8.errordata
index 9aac7e2..02a3fe3 100644
--- a/src/crypto/err/pkcs8.errordata
+++ b/src/crypto/err/pkcs8.errordata
@@ -1,3 +1,4 @@
+PKCS8,133,AMBIGUOUS_FRIENDLY_NAME
 PKCS8,129,BAD_ITERATION_COUNT
 PKCS8,100,BAD_PKCS12_DATA
 PKCS8,101,BAD_PKCS12_VERSION
diff --git a/src/crypto/err/ssl.errordata b/src/crypto/err/ssl.errordata
index 6879134..4205402 100644
--- a/src/crypto/err/ssl.errordata
+++ b/src/crypto/err/ssl.errordata
@@ -90,6 +90,7 @@
 SSL,318,INVALID_ECH_CONFIG_LIST
 SSL,317,INVALID_ECH_PUBLIC_NAME
 SSL,159,INVALID_MESSAGE
+SSL,320,INVALID_OUTER_EXTENSION
 SSL,251,INVALID_OUTER_RECORD_TYPE
 SSL,269,INVALID_SCT_LIST
 SSL,295,INVALID_SIGNATURE_ALGORITHM
@@ -133,7 +134,6 @@
 SSL,187,OLD_SESSION_CIPHER_NOT_RETURNED
 SSL,268,OLD_SESSION_PRF_HASH_MISMATCH
 SSL,188,OLD_SESSION_VERSION_NOT_RETURNED
-SSL,320,OUTER_EXTENSION_NOT_FOUND
 SSL,189,OUTPUT_ALIASES_INPUT
 SSL,190,PARSE_TLSEXT
 SSL,191,PATH_TOO_LONG
diff --git a/src/crypto/err/x509.errordata b/src/crypto/err/x509.errordata
index ffa4267..65181bf 100644
--- a/src/crypto/err/x509.errordata
+++ b/src/crypto/err/x509.errordata
@@ -25,8 +25,11 @@
 X509,119,NEWER_CRL_NOT_NEWER
 X509,120,NOT_PKCS7_SIGNED_DATA
 X509,121,NO_CERTIFICATES_INCLUDED
+X509,141,NO_CERTIFICATE_FOUND
+X509,142,NO_CERTIFICATE_OR_CRL_FOUND
 X509,122,NO_CERT_SET_FOR_US_TO_VERIFY
 X509,123,NO_CRLS_INCLUDED
+X509,143,NO_CRL_FOUND
 X509,124,NO_CRL_NUMBER
 X509,125,PUBLIC_KEY_DECODE_ERROR
 X509,126,PUBLIC_KEY_ENCODE_ERROR
diff --git a/src/crypto/evp/evp_ctx.c b/src/crypto/evp/evp_ctx.c
index 9ca2c55..5f31ddb 100644
--- a/src/crypto/evp/evp_ctx.c
+++ b/src/crypto/evp/evp_ctx.c
@@ -71,6 +71,7 @@
     &ec_pkey_meth,
     &ed25519_pkey_meth,
     &x25519_pkey_meth,
+    &hkdf_pkey_meth,
 };
 
 static const EVP_PKEY_METHOD *evp_pkey_meth_find(int type) {
@@ -83,26 +84,9 @@
   return NULL;
 }
 
-static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id) {
-  EVP_PKEY_CTX *ret;
-  const EVP_PKEY_METHOD *pmeth;
-
-  if (id == -1) {
-    if (!pkey || !pkey->ameth) {
-      return NULL;
-    }
-    id = pkey->ameth->pkey_id;
-  }
-
-  pmeth = evp_pkey_meth_find(id);
-
-  if (pmeth == NULL) {
-    OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM);
-    ERR_add_error_dataf("algorithm %d", id);
-    return NULL;
-  }
-
-  ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
+static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e,
+                                      const EVP_PKEY_METHOD *pmeth) {
+  EVP_PKEY_CTX *ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
   if (!ret) {
     OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
     return NULL;
@@ -130,11 +114,30 @@
 }
 
 EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) {
-  return evp_pkey_ctx_new(pkey, e, -1);
+  if (pkey == NULL || pkey->ameth == NULL) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_PASSED_NULL_PARAMETER);
+    return NULL;
+  }
+
+  const EVP_PKEY_METHOD *pkey_method = pkey->ameth->pkey_method;
+  if (pkey_method == NULL) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM);
+    ERR_add_error_dataf("algorithm %d", pkey->ameth->pkey_id);
+    return NULL;
+  }
+
+  return evp_pkey_ctx_new(pkey, e, pkey_method);
 }
 
 EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) {
-  return evp_pkey_ctx_new(NULL, e, id);
+  const EVP_PKEY_METHOD *pkey_method = evp_pkey_meth_find(id);
+  if (pkey_method == NULL) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM);
+    ERR_add_error_dataf("algorithm %d", id);
+    return NULL;
+  }
+
+  return evp_pkey_ctx_new(NULL, e, pkey_method);
 }
 
 void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx) {
diff --git a/src/crypto/evp/internal.h b/src/crypto/evp/internal.h
index 8b6a583..0037de8 100644
--- a/src/crypto/evp/internal.h
+++ b/src/crypto/evp/internal.h
@@ -71,6 +71,8 @@
   uint8_t oid[9];
   uint8_t oid_len;
 
+  const EVP_PKEY_METHOD *pkey_method;
+
   // pub_decode decodes |params| and |key| as a SubjectPublicKeyInfo
   // and writes the result into |out|. It returns one on success and zero on
   // error. |params| is the AlgorithmIdentifier after the OBJECT IDENTIFIER
@@ -178,6 +180,11 @@
 #define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 11)
 #define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12)
 #define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 13)
+#define EVP_PKEY_CTRL_HKDF_MODE (EVP_PKEY_ALG_CTRL + 14)
+#define EVP_PKEY_CTRL_HKDF_MD (EVP_PKEY_ALG_CTRL + 15)
+#define EVP_PKEY_CTRL_HKDF_KEY (EVP_PKEY_ALG_CTRL + 16)
+#define EVP_PKEY_CTRL_HKDF_SALT (EVP_PKEY_ALG_CTRL + 17)
+#define EVP_PKEY_CTRL_HKDF_INFO (EVP_PKEY_ALG_CTRL + 18)
 
 struct evp_pkey_ctx_st {
   // Method associated with this operation
@@ -232,18 +239,16 @@
 } /* EVP_PKEY_METHOD */;
 
 typedef struct {
-  union {
-    uint8_t priv[64];
-    struct {
-      // Shift the location of the public key to align with where it is in the
-      // private key representation.
-      uint8_t pad[32];
-      uint8_t value[32];
-    } pub;
-  } key;
+  // key is the concatenation of the private seed and public key. It is stored
+  // as a single 64-bit array to allow passing to |ED25519_sign|. If
+  // |has_private| is false, the first 32 bytes are uninitialized and the public
+  // key is in the last 32 bytes.
+  uint8_t key[64];
   char has_private;
 } ED25519_KEY;
 
+#define ED25519_PUBLIC_KEY_OFFSET 32
+
 typedef struct {
   uint8_t pub[32];
   uint8_t priv[32];
@@ -260,6 +265,7 @@
 extern const EVP_PKEY_METHOD ec_pkey_meth;
 extern const EVP_PKEY_METHOD ed25519_pkey_meth;
 extern const EVP_PKEY_METHOD x25519_pkey_meth;
+extern const EVP_PKEY_METHOD hkdf_pkey_meth;
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/evp/p_dsa_asn1.c b/src/crypto/evp/p_dsa_asn1.c
index ac91127..98615b7 100644
--- a/src/crypto/evp/p_dsa_asn1.c
+++ b/src/crypto/evp/p_dsa_asn1.c
@@ -252,6 +252,8 @@
   // 1.2.840.10040.4.1
   {0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01}, 7,
 
+  NULL /* pkey_method */,
+
   dsa_pub_decode,
   dsa_pub_encode,
   dsa_pub_cmp,
@@ -275,3 +277,15 @@
 
   int_dsa_free,
 };
+
+int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx, int nbits) {
+  // BoringSSL does not support DSA in |EVP_PKEY_CTX|.
+  OPENSSL_PUT_ERROR(EVP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+  return 0;
+}
+
+int EVP_PKEY_CTX_set_dsa_paramgen_q_bits(EVP_PKEY_CTX *ctx, int qbits) {
+  // BoringSSL does not support DSA in |EVP_PKEY_CTX|.
+  OPENSSL_PUT_ERROR(EVP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+  return 0;
+}
diff --git a/src/crypto/evp/p_ec.c b/src/crypto/evp/p_ec.c
index 9767541..ddb64a4 100644
--- a/src/crypto/evp/p_ec.c
+++ b/src/crypto/evp/p_ec.c
@@ -179,18 +179,18 @@
   EC_PKEY_CTX *dctx = ctx->data;
 
   switch (type) {
-    case EVP_PKEY_CTRL_MD:
-      if (EVP_MD_type((const EVP_MD *)p2) != NID_sha1 &&
-          EVP_MD_type((const EVP_MD *)p2) != NID_ecdsa_with_SHA1 &&
-          EVP_MD_type((const EVP_MD *)p2) != NID_sha224 &&
-          EVP_MD_type((const EVP_MD *)p2) != NID_sha256 &&
-          EVP_MD_type((const EVP_MD *)p2) != NID_sha384 &&
-          EVP_MD_type((const EVP_MD *)p2) != NID_sha512) {
+    case EVP_PKEY_CTRL_MD: {
+      const EVP_MD *md = p2;
+      int md_type = EVP_MD_type(md);
+      if (md_type != NID_sha1 && md_type != NID_sha224 &&
+          md_type != NID_sha256 && md_type != NID_sha384 &&
+          md_type != NID_sha512) {
         OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_DIGEST_TYPE);
         return 0;
       }
-      dctx->md = p2;
+      dctx->md = md;
       return 1;
+    }
 
     case EVP_PKEY_CTRL_GET_MD:
       *(const EVP_MD **)p2 = dctx->md;
diff --git a/src/crypto/evp/p_ec_asn1.c b/src/crypto/evp/p_ec_asn1.c
index dedc5e0..dd42121 100644
--- a/src/crypto/evp/p_ec_asn1.c
+++ b/src/crypto/evp/p_ec_asn1.c
@@ -230,6 +230,8 @@
   // 1.2.840.10045.2.1
   {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01}, 7,
 
+  &ec_pkey_meth,
+
   eckey_pub_decode,
   eckey_pub_encode,
   eckey_pub_cmp,
diff --git a/src/crypto/evp/p_ed25519.c b/src/crypto/evp/p_ed25519.c
index 9149afb..b3d8cc9 100644
--- a/src/crypto/evp/p_ed25519.c
+++ b/src/crypto/evp/p_ed25519.c
@@ -37,7 +37,7 @@
   }
 
   uint8_t pubkey_unused[32];
-  ED25519_keypair(pubkey_unused, key->key.priv);
+  ED25519_keypair(pubkey_unused, key->key);
   key->has_private = 1;
 
   OPENSSL_free(pkey->pkey.ptr);
@@ -64,7 +64,7 @@
     return 0;
   }
 
-  if (!ED25519_sign(sig, tbs, tbslen, key->key.priv)) {
+  if (!ED25519_sign(sig, tbs, tbslen, key->key)) {
     return 0;
   }
 
@@ -77,7 +77,7 @@
                                        size_t tbslen) {
   ED25519_KEY *key = ctx->pkey->pkey.ptr;
   if (siglen != 64 ||
-      !ED25519_verify(tbs, tbslen, sig, key->key.pub.value)) {
+      !ED25519_verify(tbs, tbslen, sig, key->key + ED25519_PUBLIC_KEY_OFFSET)) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_SIGNATURE);
     return 0;
   }
diff --git a/src/crypto/evp/p_ed25519_asn1.c b/src/crypto/evp/p_ed25519_asn1.c
index 1f996cf..f823c0d 100644
--- a/src/crypto/evp/p_ed25519_asn1.c
+++ b/src/crypto/evp/p_ed25519_asn1.c
@@ -43,7 +43,7 @@
   // The RFC 8032 encoding stores only the 32-byte seed, so we must recover the
   // full representation which we use from it.
   uint8_t pubkey_unused[32];
-  ED25519_keypair_from_seed(pubkey_unused, key->key.priv, in);
+  ED25519_keypair_from_seed(pubkey_unused, key->key, in);
   key->has_private = 1;
 
   ed25519_free(pkey);
@@ -63,7 +63,7 @@
     return 0;
   }
 
-  OPENSSL_memcpy(key->key.pub.value, in, 32);
+  OPENSSL_memcpy(key->key + ED25519_PUBLIC_KEY_OFFSET, in, 32);
   key->has_private = 0;
 
   ed25519_free(pkey);
@@ -90,7 +90,7 @@
   }
 
   // The raw private key format is the first 32 bytes of the private key.
-  OPENSSL_memcpy(out, key->key.priv, 32);
+  OPENSSL_memcpy(out, key->key, 32);
   *out_len = 32;
   return 1;
 }
@@ -108,7 +108,7 @@
     return 0;
   }
 
-  OPENSSL_memcpy(out, key->key.pub.value, 32);
+  OPENSSL_memcpy(out, key->key + ED25519_PUBLIC_KEY_OFFSET, 32);
   *out_len = 32;
   return 1;
 }
@@ -136,7 +136,8 @@
       !CBB_add_bytes(&oid, ed25519_asn1_meth.oid, ed25519_asn1_meth.oid_len) ||
       !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) ||
       !CBB_add_u8(&key_bitstring, 0 /* padding */) ||
-      !CBB_add_bytes(&key_bitstring, key->key.pub.value, 32) ||
+      !CBB_add_bytes(&key_bitstring, key->key + ED25519_PUBLIC_KEY_OFFSET,
+                     32) ||
       !CBB_flush(out)) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR);
     return 0;
@@ -148,7 +149,8 @@
 static int ed25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) {
   const ED25519_KEY *a_key = a->pkey.ptr;
   const ED25519_KEY *b_key = b->pkey.ptr;
-  return OPENSSL_memcmp(a_key->key.pub.value, b_key->key.pub.value, 32) == 0;
+  return OPENSSL_memcmp(a_key->key + ED25519_PUBLIC_KEY_OFFSET,
+                        b_key->key + ED25519_PUBLIC_KEY_OFFSET, 32) == 0;
 }
 
 static int ed25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) {
@@ -185,7 +187,7 @@
       !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) ||
       // The PKCS#8 encoding stores only the 32-byte seed which is the first 32
       // bytes of the private key.
-      !CBB_add_bytes(&inner, key->key.priv, 32) ||
+      !CBB_add_bytes(&inner, key->key, 32) ||
       !CBB_flush(out)) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR);
     return 0;
@@ -202,6 +204,7 @@
     EVP_PKEY_ED25519,
     {0x2b, 0x65, 0x70},
     3,
+    &ed25519_pkey_meth,
     ed25519_pub_decode,
     ed25519_pub_encode,
     ed25519_pub_cmp,
diff --git a/src/crypto/evp/p_hkdf.c b/src/crypto/evp/p_hkdf.c
new file mode 100644
index 0000000..932372d
--- /dev/null
+++ b/src/crypto/evp/p_hkdf.c
@@ -0,0 +1,241 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <openssl/evp.h>
+
+#include <openssl/bytestring.h>
+#include <openssl/err.h>
+#include <openssl/hkdf.h>
+#include <openssl/kdf.h>
+#include <openssl/mem.h>
+
+#include "../internal.h"
+#include "internal.h"
+
+
+typedef struct {
+  int mode;
+  const EVP_MD *md;
+  uint8_t *key;
+  size_t key_len;
+  uint8_t *salt;
+  size_t salt_len;
+  CBB info;
+} HKDF_PKEY_CTX;
+
+static int pkey_hkdf_init(EVP_PKEY_CTX *ctx) {
+  HKDF_PKEY_CTX *hctx = OPENSSL_malloc(sizeof(HKDF_PKEY_CTX));
+  if (hctx == NULL) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  OPENSSL_memset(hctx, 0, sizeof(HKDF_PKEY_CTX));
+  if (!CBB_init(&hctx->info, 0)) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+    OPENSSL_free(hctx);
+    return 0;
+  }
+
+  ctx->data = hctx;
+  return 1;
+}
+
+static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) {
+  if (!pkey_hkdf_init(dst)) {
+    return 0;
+  }
+
+  HKDF_PKEY_CTX *hctx_dst = dst->data;
+  const HKDF_PKEY_CTX *hctx_src = src->data;
+  hctx_dst->mode = hctx_src->mode;
+  hctx_dst->md = hctx_src->md;
+
+  if (hctx_src->key_len != 0) {
+    hctx_dst->key = OPENSSL_memdup(hctx_src->key, hctx_src->key_len);
+    if (hctx_src->key == NULL) {
+      OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+    hctx_dst->key_len = hctx_src->key_len;
+  }
+
+  if (hctx_src->salt_len != 0) {
+    hctx_dst->salt = OPENSSL_memdup(hctx_src->salt, hctx_src->salt_len);
+    if (hctx_src->salt == NULL) {
+      OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+    hctx_dst->salt_len = hctx_src->salt_len;
+  }
+
+  if (!CBB_add_bytes(&hctx_dst->info, CBB_data(&hctx_src->info),
+                     CBB_len(&hctx_src->info))) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  return 1;
+}
+
+static void pkey_hkdf_cleanup(EVP_PKEY_CTX *ctx) {
+  HKDF_PKEY_CTX *hctx = ctx->data;
+  if (hctx != NULL) {
+    OPENSSL_free(hctx->key);
+    OPENSSL_free(hctx->salt);
+    CBB_cleanup(&hctx->info);
+    OPENSSL_free(hctx);
+    ctx->data = NULL;
+  }
+}
+
+static int pkey_hkdf_derive(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len) {
+  HKDF_PKEY_CTX *hctx = ctx->data;
+  if (hctx->md == NULL) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS);
+    return 0;
+  }
+  if (hctx->key_len == 0) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET);
+    return 0;
+  }
+
+  if (out == NULL) {
+    if (hctx->mode == EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) {
+      *out_len = EVP_MD_size(hctx->md);
+    }
+    // HKDF-Expand is variable-length and returns |*out_len| bytes. "Output" the
+    // input length by leaving it alone.
+    return 1;
+  }
+
+  switch (hctx->mode) {
+    case EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND:
+      return HKDF(out, *out_len, hctx->md, hctx->key, hctx->key_len, hctx->salt,
+                  hctx->salt_len, CBB_data(&hctx->info), CBB_len(&hctx->info));
+
+    case EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY:
+      if (*out_len < EVP_MD_size(hctx->md)) {
+        OPENSSL_PUT_ERROR(EVP, EVP_R_BUFFER_TOO_SMALL);
+        return 0;
+      }
+      return HKDF_extract(out, out_len, hctx->md, hctx->key, hctx->key_len,
+                          hctx->salt, hctx->salt_len);
+
+    case EVP_PKEY_HKDEF_MODE_EXPAND_ONLY:
+      return HKDF_expand(out, *out_len, hctx->md, hctx->key, hctx->key_len,
+                         CBB_data(&hctx->info), CBB_len(&hctx->info));
+  }
+  OPENSSL_PUT_ERROR(EVP, ERR_R_INTERNAL_ERROR);
+  return 0;
+}
+
+static int pkey_hkdf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) {
+  HKDF_PKEY_CTX *hctx = ctx->data;
+  switch (type) {
+    case EVP_PKEY_CTRL_HKDF_MODE:
+      if (p1 != EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND &&
+          p1 != EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY &&
+          p1 != EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
+        OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_OPERATION);
+        return 0;
+      }
+      hctx->mode = p1;
+      return 1;
+    case EVP_PKEY_CTRL_HKDF_MD:
+      hctx->md = p2;
+      return 1;
+    case EVP_PKEY_CTRL_HKDF_KEY: {
+      const CBS *key = p2;
+      if (!CBS_stow(key, &hctx->key, &hctx->key_len)) {
+        OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+        return 0;
+      }
+      return 1;
+    }
+    case EVP_PKEY_CTRL_HKDF_SALT: {
+      const CBS *salt = p2;
+      if (!CBS_stow(salt, &hctx->salt, &hctx->salt_len)) {
+        OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+        return 0;
+      }
+      return 1;
+    }
+    case EVP_PKEY_CTRL_HKDF_INFO: {
+      const CBS *info = p2;
+      // |EVP_PKEY_CTX_add1_hkdf_info| appends to the info string, rather than
+      // replacing it.
+      if (!CBB_add_bytes(&hctx->info, CBS_data(info), CBS_len(info))) {
+        OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+        return 0;
+      }
+      return 1;
+    }
+    default:
+      OPENSSL_PUT_ERROR(EVP, EVP_R_COMMAND_NOT_SUPPORTED);
+      return 0;
+  }
+}
+
+const EVP_PKEY_METHOD hkdf_pkey_meth = {
+    EVP_PKEY_HKDF,
+    pkey_hkdf_init,
+    pkey_hkdf_copy,
+    pkey_hkdf_cleanup,
+    /*keygen=*/NULL,
+    /*sign=*/NULL,
+    /*sign_message=*/NULL,
+    /*verify=*/NULL,
+    /*verify_message=*/NULL,
+    /*verify_recover=*/NULL,
+    /*encrypt=*/NULL,
+    /*decrypt=*/NULL,
+    pkey_hkdf_derive,
+    /*paramgen=*/NULL,
+    pkey_hkdf_ctrl,
+};
+
+int EVP_PKEY_CTX_hkdf_mode(EVP_PKEY_CTX *ctx, int mode) {
+  return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE,
+                           EVP_PKEY_CTRL_HKDF_MODE, mode, NULL);
+}
+
+int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) {
+  return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE,
+                           EVP_PKEY_CTRL_HKDF_MD, 0, (void *)md);
+}
+
+int EVP_PKEY_CTX_set1_hkdf_key(EVP_PKEY_CTX *ctx, const uint8_t *key,
+                               size_t key_len) {
+  CBS cbs;
+  CBS_init(&cbs, key, key_len);
+  return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE,
+                           EVP_PKEY_CTRL_HKDF_KEY, 0, &cbs);
+}
+
+int EVP_PKEY_CTX_set1_hkdf_salt(EVP_PKEY_CTX *ctx, const uint8_t *salt,
+                                size_t salt_len) {
+  CBS cbs;
+  CBS_init(&cbs, salt, salt_len);
+  return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE,
+                           EVP_PKEY_CTRL_HKDF_SALT, 0, &cbs);
+}
+
+int EVP_PKEY_CTX_add1_hkdf_info(EVP_PKEY_CTX *ctx, const uint8_t *info,
+                                size_t info_len) {
+  CBS cbs;
+  CBS_init(&cbs, info, info_len);
+  return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_HKDF, EVP_PKEY_OP_DERIVE,
+                           EVP_PKEY_CTRL_HKDF_INFO, 0, &cbs);
+}
diff --git a/src/crypto/evp/p_rsa_asn1.c b/src/crypto/evp/p_rsa_asn1.c
index c097103..2e4942a 100644
--- a/src/crypto/evp/p_rsa_asn1.c
+++ b/src/crypto/evp/p_rsa_asn1.c
@@ -171,6 +171,8 @@
   // 1.2.840.113549.1.1.1
   {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}, 9,
 
+  &rsa_pkey_meth,
+
   rsa_pub_decode,
   rsa_pub_encode,
   rsa_pub_cmp,
diff --git a/src/crypto/evp/p_x25519_asn1.c b/src/crypto/evp/p_x25519_asn1.c
index 99b4cc9..182f6a2 100644
--- a/src/crypto/evp/p_x25519_asn1.c
+++ b/src/crypto/evp/p_x25519_asn1.c
@@ -199,6 +199,7 @@
     EVP_PKEY_X25519,
     {0x2b, 0x65, 0x6e},
     3,
+    &x25519_pkey_meth,
     x25519_pub_decode,
     x25519_pub_encode,
     x25519_pub_cmp,
diff --git a/src/crypto/evp/print.c b/src/crypto/evp/print.c
index 3621d5f..0f4b65e 100644
--- a/src/crypto/evp/print.c
+++ b/src/crypto/evp/print.c
@@ -253,7 +253,7 @@
 
   if (priv_key) {
     if (!BIO_indent(bp, off, 128) ||
-        BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p)) <= 0) {
+        BIO_printf(bp, "%s: (%u bit)\n", ktype, BN_num_bits(x->p)) <= 0) {
       goto err;
     }
   }
@@ -368,7 +368,7 @@
   }
   order = BN_new();
   if (order == NULL || !EC_GROUP_get_order(group, order, NULL) ||
-      BIO_printf(bp, "%s: (%d bit)\n", ecstr, BN_num_bits(order)) <= 0) {
+      BIO_printf(bp, "%s: (%u bit)\n", ecstr, BN_num_bits(order)) <= 0) {
     goto err;
   }
 
diff --git a/src/crypto/evp/scrypt.c b/src/crypto/evp/scrypt.c
index 7ec6244..14a5e02 100644
--- a/src/crypto/evp/scrypt.c
+++ b/src/crypto/evp/scrypt.c
@@ -13,7 +13,6 @@
 
 #include <openssl/err.h>
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 #include "../internal.h"
 
@@ -30,7 +29,7 @@
 // A block_t is a Salsa20 block.
 typedef struct { uint32_t words[16]; } block_t;
 
-OPENSSL_STATIC_ASSERT(sizeof(block_t) == 64, "block_t has padding");
+static_assert(sizeof(block_t) == 64, "block_t has padding");
 
 // salsa208_word_specification implements the Salsa20/8 core function, also
 // described in RFC 7914, section 3. It modifies the block at |inout|
@@ -171,7 +170,7 @@
 
   // Allocate and divide up the scratch space. |max_mem| fits in a size_t, which
   // is no bigger than uint64_t, so none of these operations may overflow.
-  OPENSSL_STATIC_ASSERT(UINT64_MAX >= ((size_t)-1), "size_t exceeds uint64_t");
+  static_assert(UINT64_MAX >= ((size_t)-1), "size_t exceeds uint64_t");
   size_t B_blocks = p * 2 * r;
   size_t B_bytes = B_blocks * sizeof(block_t);
   size_t T_blocks = 2 * r;
diff --git a/src/crypto/fipsmodule/CMakeLists.txt b/src/crypto/fipsmodule/CMakeLists.txt
index 73f8a02..a04ef6a 100644
--- a/src/crypto/fipsmodule/CMakeLists.txt
+++ b/src/crypto/fipsmodule/CMakeLists.txt
@@ -64,6 +64,8 @@
     armv8-mont.${ASM_EXT}
     ghash-neon-armv8.${ASM_EXT}
     ghashv8-armx.${ASM_EXT}
+    p256-armv8-asm.${ASM_EXT}
+    p256_beeu-armv8-asm.${ASM_EXT}
     sha1-armv8.${ASM_EXT}
     sha256-armv8.${ASM_EXT}
     sha512-armv8.${ASM_EXT}
@@ -102,6 +104,8 @@
 perlasm(md5-x86_64.${ASM_EXT} md5/asm/md5-x86_64.pl)
 perlasm(p256-x86_64-asm.${ASM_EXT} ec/asm/p256-x86_64-asm.pl)
 perlasm(p256_beeu-x86_64-asm.${ASM_EXT} ec/asm/p256_beeu-x86_64-asm.pl)
+perlasm(p256-armv8-asm.${ASM_EXT} ec/asm/p256-armv8-asm.pl)
+perlasm(p256_beeu-armv8-asm.${ASM_EXT} ec/asm/p256_beeu-armv8-asm.pl)
 perlasm(rdrand-x86_64.${ASM_EXT} rand/asm/rdrand-x86_64.pl)
 perlasm(rsaz-avx2.${ASM_EXT} bn/asm/rsaz-avx2.pl)
 perlasm(sha1-586.${ASM_EXT} sha/asm/sha1-586.pl)
@@ -198,19 +202,11 @@
   set_target_properties(bcm_hashunset PROPERTIES POSITION_INDEPENDENT_CODE ON)
   set_target_properties(bcm_hashunset PROPERTIES LINKER_LANGUAGE C)
 
-  set(MAYBE_INJECT_HASH_SHA256_FLAG "")
-  # If building with OPENSSL_NO_ASM then ARCH will be "generic", but we still
-  # need to use SHA-256. Since this only matters for FIPS, we only need to
-  # worry about the Linux spelling of AArch64.
-  if (ARCH STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
-    set(MAYBE_INJECT_HASH_SHA256_FLAG "-sha256")
-  endif()
-
   go_executable(inject_hash
                 boringssl.googlesource.com/boringssl/util/fipstools/inject_hash)
   add_custom_command(
     OUTPUT bcm.o
-    COMMAND ./inject_hash -o bcm.o -in-archive $<TARGET_FILE:bcm_hashunset> ${MAYBE_INJECT_HASH_SHA256_FLAG}
+    COMMAND ./inject_hash -o bcm.o -in-archive $<TARGET_FILE:bcm_hashunset>
     DEPENDS bcm_hashunset inject_hash
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
   )
diff --git a/src/crypto/fipsmodule/FIPS.md b/src/crypto/fipsmodule/FIPS.md
index d3b3890..bc5708f 100644
--- a/src/crypto/fipsmodule/FIPS.md
+++ b/src/crypto/fipsmodule/FIPS.md
@@ -12,30 +12,21 @@
 1. 2018-07-30: certificate [#3318](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3318), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx) (in docx format).
 1. 2019-08-08: certificate [#3678](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3678), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20190808.docx) (in docx format).
 1. 2019-10-20: certificate [#3753](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3753), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20191020.docx) (in docx format).
+1. 2021-01-28: certificate [#4156](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/4156), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20210319.docx) (in docx format).
 
-## Running CAVP tests
+## Running ACVP tests
 
-CAVP results are calculated by `util/fipstools/cavp`, but that binary is almost always run by `util/fipstools/run_cavp.go`. The latter knows the set of tests to be processed and the flags needed to configure `cavp` for each one. It must be run from the top of a CAVP directory and needs the following options:
+See `util/fipstools/acvp/ACVP.md` for details of how ACVP testing is done.
 
-1. `-oracle-bin`: points to the location of `util/fipstools/cavp`
-2. `-no-fax`: this is needed to suppress checking of the FAX files, which are only included in sample sets.
+## Breaking known-answer and continuous tests
 
-## Breaking power-on and continuous tests
+Each known-answer test (KAT) uses a unique, random input value. `util/fipstools/break-kat.go` contains a listing of those values and can be used to corrupt a given test in a binary. Since changes to the KAT input values will invalidate the integrity test, `BORINGSSL_FIPS_BREAK_TESTS` can be defined in `fips_break_tests.h` to disable it for the purposes of testing.
 
-In order to demonstrate failures of the various FIPS 140 tests, BoringSSL can be built in ways that will trigger such failures. This is controlled by passing `-DFIPS_BREAK_TEST=`(test to break) to CMake, where the following tests can be specified:
+Some FIPS tests cannot be broken by replacing a known string in the binary. For those, when `BORINGSSL_FIPS_BREAK_TESTS` is defined, the environment variable `BORINGSSL_FIPS_BREAK_TEST` can be set to one of a number of values in order to break the corresponding test:
 
-1. AES\_CBC
-1. AES\_GCM
-1. DES
-1. SHA\_1
-1. SHA\_256
-1. SHA\_512
-1. RSA\_SIG
-1. ECDSA\_SIG
-1. DRBG
-1. RSA\_PWCT
-1. ECDSA\_PWCT
-1. TLS\_KDF
+1. `RSA_PWCT`
+1. `ECDSA_PWCT`
+1. `CRNG`
 
 ## Breaking the integrity test
 
@@ -61,12 +52,6 @@
 
 FIPS requires that RNG state be zeroed when the process exits. In order to implement this, all per-thread RNG states are tracked in a linked list and a destructor function is included which clears them. In order for this to be safe in the presence of threads, a lock is used to stop all other threads from using the RNG once this process has begun. Thus the main thread exiting may cause other threads to deadlock, and drawing on entropy in a destructor function may also deadlock.
 
-## Self-test optimisation
-
-On Android, the self-tests are optimised in line with [IG](https://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/fips140-2/fips1402ig.pdf) section 9.11. The module will always perform the integrity test at power-on, but the self-tests will test for the presence of a file named after the hex encoded, HMAC-SHA-256 hash of the module in `/dev/boringssl/selftest/`. If such a file is found then the self-tests are skipped. Otherwise, after the self-tests complete successfully, that file will be written. Any I/O errors are ignored and, if they occur when testing for the presence of the file, the module acts as if it's not present.
-
-It is intended that a `tmpfs` be mounted at that location in order to skip running the self tests for every process once they have already passed in a given instance of the operating system.
-
 ## Integrity Test
 
 FIPS-140 mandates that a module calculate an HMAC of its own code in a constructor function and compare the result to a known-good value. Typical code produced by a C compiler includes large numbers of relocations: places in the machine code where the linker needs to resolve and inject the final value of a symbolic expression. These relocations mean that the bytes that make up any specific bit of code generally aren't known until the final link has completed.
diff --git a/src/crypto/fipsmodule/aes/aes.c b/src/crypto/fipsmodule/aes/aes.c
index f60281d..60f3545 100644
--- a/src/crypto/fipsmodule/aes/aes.c
+++ b/src/crypto/fipsmodule/aes/aes.c
@@ -50,8 +50,6 @@
 
 #include <assert.h>
 
-#include <openssl/cpu.h>
-
 #include "internal.h"
 #include "../modes/internal.h"
 
diff --git a/src/crypto/fipsmodule/aes/aes_nohw.c b/src/crypto/fipsmodule/aes/aes_nohw.c
index 12cabcb..c5dec0e 100644
--- a/src/crypto/fipsmodule/aes/aes_nohw.c
+++ b/src/crypto/fipsmodule/aes/aes_nohw.c
@@ -18,6 +18,7 @@
 #include <string.h>
 
 #include "../../internal.h"
+#include "internal.h"
 
 #if defined(OPENSSL_SSE2)
 #include <emmintrin.h>
@@ -151,10 +152,10 @@
 }
 #endif  // OPENSSL_SSE2
 
-OPENSSL_STATIC_ASSERT(AES_NOHW_BATCH_SIZE * 128 == 8 * 8 * sizeof(aes_word_t),
-                      "batch size does not match word size");
-OPENSSL_STATIC_ASSERT(AES_NOHW_WORD_SIZE == sizeof(aes_word_t),
-                      "AES_NOHW_WORD_SIZE is incorrect");
+static_assert(AES_NOHW_BATCH_SIZE * 128 == 8 * 8 * sizeof(aes_word_t),
+              "batch size does not match word size");
+static_assert(AES_NOHW_WORD_SIZE == sizeof(aes_word_t),
+              "AES_NOHW_WORD_SIZE is incorrect");
 
 
 // Block representations.
@@ -1181,29 +1182,27 @@
   aes_nohw_expand_round_keys(&sched, key);
 
   // Make |AES_NOHW_BATCH_SIZE| copies of |ivec|.
-  alignas(AES_NOHW_WORD_SIZE) union {
-    uint32_t u32[AES_NOHW_BATCH_SIZE * 4];
-    uint8_t u8[AES_NOHW_BATCH_SIZE * 16];
-  } ivs, enc_ivs;
+  alignas(AES_NOHW_WORD_SIZE) uint8_t ivs[AES_NOHW_BATCH_SIZE * 16];
+  alignas(AES_NOHW_WORD_SIZE) uint8_t enc_ivs[AES_NOHW_BATCH_SIZE * 16];
   for (size_t i = 0; i < AES_NOHW_BATCH_SIZE; i++) {
-    memcpy(ivs.u8 + 16 * i, ivec, 16);
+    memcpy(ivs + 16 * i, ivec, 16);
   }
 
-  uint32_t ctr = CRYPTO_bswap4(ivs.u32[3]);
+  uint32_t ctr = CRYPTO_load_u32_be(ivs + 12);
   for (;;) {
     // Update counters.
     for (size_t i = 0; i < AES_NOHW_BATCH_SIZE; i++) {
-      ivs.u32[4 * i + 3] = CRYPTO_bswap4(ctr + i);
+      CRYPTO_store_u32_be(ivs + 16 * i + 12, ctr + (uint32_t)i);
     }
 
     size_t todo = blocks >= AES_NOHW_BATCH_SIZE ? AES_NOHW_BATCH_SIZE : blocks;
     AES_NOHW_BATCH batch;
-    aes_nohw_to_batch(&batch, ivs.u8, todo);
+    aes_nohw_to_batch(&batch, ivs, todo);
     aes_nohw_encrypt_batch(&sched, key->rounds, &batch);
-    aes_nohw_from_batch(enc_ivs.u8, todo, &batch);
+    aes_nohw_from_batch(enc_ivs, todo, &batch);
 
     for (size_t i = 0; i < todo; i++) {
-      aes_nohw_xor_block(out + 16 * i, in + 16 * i, enc_ivs.u8 + 16 * i);
+      aes_nohw_xor_block(out + 16 * i, in + 16 * i, enc_ivs + 16 * i);
     }
 
     blocks -= todo;
diff --git a/src/crypto/fipsmodule/aes/aes_test.cc b/src/crypto/fipsmodule/aes/aes_test.cc
index eef2567..dd3b374 100644
--- a/src/crypto/fipsmodule/aes/aes_test.cc
+++ b/src/crypto/fipsmodule/aes/aes_test.cc
@@ -289,7 +289,7 @@
     }
 
     if (bsaes_capable()) {
-      vpaes_set_encrypt_key(kKey, bits, &key);
+      ASSERT_EQ(vpaes_set_encrypt_key(kKey, bits, &key), 0);
       CHECK_ABI(vpaes_encrypt_key_to_bsaes, &key, &key);
       for (size_t blocks : block_counts) {
         SCOPED_TRACE(blocks);
@@ -298,7 +298,7 @@
         }
       }
 
-      vpaes_set_decrypt_key(kKey, bits, &key);
+      ASSERT_EQ(vpaes_set_decrypt_key(kKey, bits, &key), 0);
       CHECK_ABI(vpaes_decrypt_key_to_bsaes, &key, &key);
       for (size_t blocks : block_counts) {
         SCOPED_TRACE(blocks);
@@ -308,7 +308,7 @@
     }
 
     if (vpaes_capable()) {
-      CHECK_ABI(vpaes_set_encrypt_key, kKey, bits, &key);
+      ASSERT_EQ(CHECK_ABI(vpaes_set_encrypt_key, kKey, bits, &key), 0);
       CHECK_ABI(vpaes_encrypt, block, block, &key);
       for (size_t blocks : block_counts) {
         SCOPED_TRACE(blocks);
@@ -321,7 +321,7 @@
 #endif
       }
 
-      CHECK_ABI(vpaes_set_decrypt_key, kKey, bits, &key);
+      ASSERT_EQ(CHECK_ABI(vpaes_set_decrypt_key, kKey, bits, &key), 0);
       CHECK_ABI(vpaes_decrypt, block, block, &key);
 #if defined(VPAES_CBC)
       for (size_t blocks : block_counts) {
@@ -333,7 +333,7 @@
     }
 
     if (hwaes_capable()) {
-      CHECK_ABI(aes_hw_set_encrypt_key, kKey, bits, &key);
+      ASSERT_EQ(CHECK_ABI(aes_hw_set_encrypt_key, kKey, bits, &key), 0);
       CHECK_ABI(aes_hw_encrypt, block, block, &key);
       for (size_t blocks : block_counts) {
         SCOPED_TRACE(blocks);
@@ -346,7 +346,7 @@
 #endif
       }
 
-      CHECK_ABI(aes_hw_set_decrypt_key, kKey, bits, &key);
+      ASSERT_EQ(CHECK_ABI(aes_hw_set_decrypt_key, kKey, bits, &key), 0);
       CHECK_ABI(aes_hw_decrypt, block, block, &key);
       for (size_t blocks : block_counts) {
         SCOPED_TRACE(blocks);
@@ -559,6 +559,10 @@
 
 
 TEST(AESTest, VPAESToBSAESConvert) {
+  if (!vpaes_capable()) {
+    GTEST_SKIP();
+  }
+
   const int kNumIterations = 1000;
   for (int i = 0; i < kNumIterations; i++) {
     uint8_t key[256 / 8];
diff --git a/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl b/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
index 82022c7..9f62232 100644
--- a/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
+++ b/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
@@ -975,6 +975,9 @@
 	s/\.[ui]?64//o and s/\.16b/\.2d/go;
 	s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o;
 
+	# Switch preprocessor checks to aarch64 versions.
+	s/__ARME([BL])__/__AARCH64E$1__/go;
+
 	print $_,"\n";
     }
 } else {				######## 32-bit code
diff --git a/src/crypto/fipsmodule/aes/internal.h b/src/crypto/fipsmodule/aes/internal.h
index 5b80695..0685bc4 100644
--- a/src/crypto/fipsmodule/aes/internal.h
+++ b/src/crypto/fipsmodule/aes/internal.h
@@ -17,7 +17,7 @@
 
 #include <stdlib.h>
 
-#include <openssl/cpu.h>
+#include "../../internal.h"
 
 #if defined(__cplusplus)
 extern "C" {
@@ -30,18 +30,14 @@
 #define HWAES
 #define HWAES_ECB
 
-OPENSSL_INLINE int hwaes_capable(void) {
-  return (OPENSSL_ia32cap_get()[1] & (1 << (57 - 32))) != 0;
-}
+OPENSSL_INLINE int hwaes_capable(void) { return CRYPTO_is_AESNI_capable(); }
 
 #define VPAES
 #if defined(OPENSSL_X86_64)
 #define VPAES_CTR32
 #endif
 #define VPAES_CBC
-OPENSSL_INLINE int vpaes_capable(void) {
-  return (OPENSSL_ia32cap_get()[1] & (1 << (41 - 32))) != 0;
-}
+OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_SSSE3_capable(); }
 
 #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
 #define HWAES
diff --git a/src/crypto/fipsmodule/aes/key_wrap.c b/src/crypto/fipsmodule/aes/key_wrap.c
index 9a5b28d..95b12d2 100644
--- a/src/crypto/fipsmodule/aes/key_wrap.c
+++ b/src/crypto/fipsmodule/aes/key_wrap.c
@@ -55,6 +55,7 @@
 #include <openssl/mem.h>
 
 #include "../../internal.h"
+#include "../service_indicator/internal.h"
 
 
 // kDefaultIV is the default IV value given in RFC 3394, 2.2.3.1.
@@ -98,6 +99,7 @@
   }
 
   OPENSSL_memcpy(out, A, 8);
+  FIPS_service_indicator_update_state();
   return (int)in_len + 8;
 }
 
@@ -151,6 +153,7 @@
     return -1;
   }
 
+  FIPS_service_indicator_update_state();
   return (int)in_len - 8;
 }
 
@@ -161,10 +164,8 @@
 int AES_wrap_key_padded(const AES_KEY *key, uint8_t *out, size_t *out_len,
                         size_t max_out, const uint8_t *in, size_t in_len) {
   // See https://tools.ietf.org/html/rfc5649#section-4.1
-  const uint32_t in_len32_be = CRYPTO_bswap4(in_len);
   const uint64_t in_len64 = in_len;
   const size_t padded_len = (in_len + 7) & ~7;
-
   *out_len = 0;
   if (in_len == 0 || in_len64 > 0xffffffffu || in_len + 7 < in_len ||
       padded_len + 8 < padded_len || max_out < padded_len + 8) {
@@ -173,7 +174,7 @@
 
   uint8_t block[AES_BLOCK_SIZE];
   memcpy(block, kPaddingConstant, sizeof(kPaddingConstant));
-  memcpy(block + 4, &in_len32_be, sizeof(in_len32_be));
+  CRYPTO_store_u32_be(block + 4, (uint32_t)in_len);
 
   if (in_len <= 8) {
     memset(block + 8, 0, 8);
@@ -190,12 +191,15 @@
   assert(padded_len >= 8);
   memset(padded_in + padded_len - 8, 0, 8);
   memcpy(padded_in, in, in_len);
+  FIPS_service_indicator_lock_state();
   const int ret = AES_wrap_key(key, block, out, padded_in, padded_len);
+  FIPS_service_indicator_unlock_state();
   OPENSSL_free(padded_in);
   if (ret < 0) {
     return 0;
   }
   *out_len = ret;
+  FIPS_service_indicator_update_state();
   return 1;
 }
 
@@ -220,9 +224,7 @@
   crypto_word_t ok = constant_time_eq_int(
       CRYPTO_memcmp(iv, kPaddingConstant, sizeof(kPaddingConstant)), 0);
 
-  uint32_t claimed_len32;
-  memcpy(&claimed_len32, iv + 4, sizeof(claimed_len32));
-  const size_t claimed_len = CRYPTO_bswap4(claimed_len32);
+  const size_t claimed_len = CRYPTO_load_u32_be(iv + 4);
   ok &= ~constant_time_is_zero_w(claimed_len);
   ok &= constant_time_eq_w((claimed_len - 1) >> 3, (in_len - 9) >> 3);
 
@@ -232,5 +234,9 @@
   }
 
   *out_len = constant_time_select_w(ok, claimed_len, 0);
-  return ok & 1;
+  const int ret = ok & 1;
+  if (ret) {
+    FIPS_service_indicator_update_state();
+  }
+  return ret;
 }
diff --git a/src/crypto/fipsmodule/aes/mode_wrappers.c b/src/crypto/fipsmodule/aes/mode_wrappers.c
index d29fb27..10d98a6 100644
--- a/src/crypto/fipsmodule/aes/mode_wrappers.c
+++ b/src/crypto/fipsmodule/aes/mode_wrappers.c
@@ -52,6 +52,7 @@
 
 #include "../aes/internal.h"
 #include "../modes/internal.h"
+#include "../service_indicator/internal.h"
 
 
 void AES_ctr128_encrypt(const uint8_t *in, uint8_t *out, size_t len,
@@ -74,6 +75,8 @@
     CRYPTO_ctr128_encrypt_ctr32(in, out, len, key, ivec, ecount_buf, num,
                                 aes_nohw_ctr32_encrypt_blocks);
   }
+
+  FIPS_service_indicator_update_state();
 }
 
 void AES_ecb_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key,
@@ -86,24 +89,23 @@
   } else {
     AES_decrypt(in, out, key);
   }
+
+  FIPS_service_indicator_update_state();
 }
 
 void AES_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
                      const AES_KEY *key, uint8_t *ivec, const int enc) {
   if (hwaes_capable()) {
     aes_hw_cbc_encrypt(in, out, len, key, ivec, enc);
-    return;
-  }
-
-  if (!vpaes_capable()) {
+  } else if (!vpaes_capable()) {
     aes_nohw_cbc_encrypt(in, out, len, key, ivec, enc);
-    return;
-  }
-  if (enc) {
+  } else if (enc) {
     CRYPTO_cbc128_encrypt(in, out, len, key, ivec, AES_encrypt);
   } else {
     CRYPTO_cbc128_decrypt(in, out, len, key, ivec, AES_decrypt);
   }
+
+  FIPS_service_indicator_update_state();
 }
 
 void AES_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t length,
diff --git a/src/crypto/fipsmodule/bcm.c b/src/crypto/fipsmodule/bcm.c
index 3a1ad15..1792134 100644
--- a/src/crypto/fipsmodule/bcm.c
+++ b/src/crypto/fipsmodule/bcm.c
@@ -58,12 +58,13 @@
 #include "cipher/aead.c"
 #include "cipher/cipher.c"
 #include "cipher/e_aes.c"
-#include "cipher/e_des.c"
-#include "des/des.c"
+#include "cipher/e_aesccm.c"
+#include "cmac/cmac.c"
 #include "dh/check.c"
 #include "dh/dh.c"
 #include "digest/digest.c"
 #include "digest/digests.c"
+#include "digestsign/digestsign.c"
 #include "ecdh/ecdh.c"
 #include "ecdsa/ecdsa.c"
 #include "ec/ec.c"
@@ -73,7 +74,7 @@
 #include "ec/oct.c"
 #include "ec/p224-64.c"
 #include "ec/p256.c"
-#include "ec/p256-x86_64.c"
+#include "ec/p256-nistz.c"
 #include "ec/scalar.c"
 #include "ec/simple.c"
 #include "ec/simple_mul.c"
@@ -99,6 +100,7 @@
 #include "rsa/rsa_impl.c"
 #include "self_check/fips.c"
 #include "self_check/self_check.c"
+#include "service_indicator/service_indicator.c"
 #include "sha/sha1-altivec.c"
 #include "sha/sha1.c"
 #include "sha/sha256.c"
@@ -171,6 +173,23 @@
 #if !defined(OPENSSL_ASAN)
   // Integrity tests cannot run under ASAN because it involves reading the full
   // .text section, which triggers the global-buffer overflow detection.
+  if (!BORINGSSL_integrity_test()) {
+    goto err;
+  }
+#endif  // OPENSSL_ASAN
+
+  if (!boringssl_self_test_startup()) {
+    goto err;
+  }
+
+  return;
+
+err:
+  BORINGSSL_FIPS_abort();
+}
+
+#if !defined(OPENSSL_ASAN)
+int BORINGSSL_integrity_test(void) {
   const uint8_t *const start = BORINGSSL_bcm_text_start;
   const uint8_t *const end = BORINGSSL_bcm_text_end;
 
@@ -192,17 +211,15 @@
 #endif
 
   assert_within(rodata_start, kPrimes, rodata_end);
-  assert_within(rodata_start, des_skb, rodata_end);
   assert_within(rodata_start, kP256Params, rodata_end);
   assert_within(rodata_start, kPKCS1SigPrefixes, rodata_end);
 
-#if defined(OPENSSL_AARCH64) || defined(OPENSSL_ANDROID)
   uint8_t result[SHA256_DIGEST_LENGTH];
   const EVP_MD *const kHashFunction = EVP_sha256();
-#else
-  uint8_t result[SHA512_DIGEST_LENGTH];
-  const EVP_MD *const kHashFunction = EVP_sha512();
-#endif
+  if (!boringssl_self_test_sha256() ||
+      !boringssl_self_test_hmac_sha256()) {
+    return 0;
+  }
 
   static const uint8_t kHMACKey[64] = {0};
   unsigned result_len;
@@ -211,7 +228,7 @@
   if (!HMAC_Init_ex(&hmac_ctx, kHMACKey, sizeof(kHMACKey), kHashFunction,
                     NULL /* no ENGINE */)) {
     fprintf(stderr, "HMAC_Init_ex failed.\n");
-    goto err;
+    return 0;
   }
 
   BORINGSSL_maybe_set_module_text_permissions(PROT_READ | PROT_EXEC);
@@ -231,30 +248,22 @@
   if (!HMAC_Final(&hmac_ctx, result, &result_len) ||
       result_len != sizeof(result)) {
     fprintf(stderr, "HMAC failed.\n");
-    goto err;
+    return 0;
   }
-  HMAC_CTX_cleanup(&hmac_ctx);
+  HMAC_CTX_cleanse(&hmac_ctx); // FIPS 140-3, AS05.10.
 
   const uint8_t *expected = BORINGSSL_bcm_text_hash;
 
   if (!check_test(expected, result, sizeof(result), "FIPS integrity test")) {
-    goto err;
+#if !defined(BORINGSSL_FIPS_BREAK_TESTS)
+    return 0;
+#endif
   }
 
-  if (!boringssl_fips_self_test(BORINGSSL_bcm_text_hash, sizeof(result))) {
-    goto err;
-  }
-#else
-  if (!BORINGSSL_self_test()) {
-    goto err;
-  }
-#endif  // OPENSSL_ASAN
-
-  return;
-
-err:
-  BORINGSSL_FIPS_abort();
+  OPENSSL_cleanse(result, sizeof(result)); // FIPS 140-3, AS05.10.
+  return 1;
 }
+#endif  // OPENSSL_ASAN
 
 void BORINGSSL_FIPS_abort(void) {
   for (;;) {
diff --git a/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl b/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl
index 54335cc..012e7aa 100755
--- a/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl
+++ b/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl
@@ -2088,194 +2088,6 @@
 .size	__bn_post4x_internal,.-__bn_post4x_internal
 ___
 }
-{
-$code.=<<___;
-.globl	bn_from_montgomery
-.type	bn_from_montgomery,\@abi-omnipotent
-.align	32
-bn_from_montgomery:
-.cfi_startproc
-	testl	\$7,`($win64?"48(%rsp)":"%r9d")`
-	jz	bn_from_mont8x
-	xor	%eax,%eax
-	ret
-.cfi_endproc
-.size	bn_from_montgomery,.-bn_from_montgomery
-
-.type	bn_from_mont8x,\@function,6
-.align	32
-bn_from_mont8x:
-.cfi_startproc
-	.byte	0x67
-	mov	%rsp,%rax
-.cfi_def_cfa_register	%rax
-	push	%rbx
-.cfi_push	%rbx
-	push	%rbp
-.cfi_push	%rbp
-	push	%r12
-.cfi_push	%r12
-	push	%r13
-.cfi_push	%r13
-	push	%r14
-.cfi_push	%r14
-	push	%r15
-.cfi_push	%r15
-.Lfrom_prologue:
-
-	shl	\$3,${num}d		# convert $num to bytes
-	lea	($num,$num,2),%r10	# 3*$num in bytes
-	neg	$num
-	mov	($n0),$n0		# *n0
-
-	##############################################################
-	# Ensure that stack frame doesn't alias with $rptr+3*$num
-	# modulo 4096, which covers ret[num], am[num] and n[num]
-	# (see bn_exp.c). The stack is allocated to aligned with
-	# bn_power5's frame, and as bn_from_montgomery happens to be
-	# last operation, we use the opportunity to cleanse it.
-	#
-	lea	-320(%rsp,$num,2),%r11
-	mov	%rsp,%rbp
-	sub	$rptr,%r11
-	and	\$4095,%r11
-	cmp	%r11,%r10
-	jb	.Lfrom_sp_alt
-	sub	%r11,%rbp		# align with $aptr
-	lea	-320(%rbp,$num,2),%rbp	# future alloca(frame+2*$num*8+256)
-	jmp	.Lfrom_sp_done
-
-.align	32
-.Lfrom_sp_alt:
-	lea	4096-320(,$num,2),%r10
-	lea	-320(%rbp,$num,2),%rbp	# future alloca(frame+2*$num*8+256)
-	sub	%r10,%r11
-	mov	\$0,%r10
-	cmovc	%r10,%r11
-	sub	%r11,%rbp
-.Lfrom_sp_done:
-	and	\$-64,%rbp
-	mov	%rsp,%r11
-	sub	%rbp,%r11
-	and	\$-4096,%r11
-	lea	(%rbp,%r11),%rsp
-	mov	(%rsp),%r10
-	cmp	%rbp,%rsp
-	ja	.Lfrom_page_walk
-	jmp	.Lfrom_page_walk_done
-
-.Lfrom_page_walk:
-	lea	-4096(%rsp),%rsp
-	mov	(%rsp),%r10
-	cmp	%rbp,%rsp
-	ja	.Lfrom_page_walk
-.Lfrom_page_walk_done:
-
-	mov	$num,%r10
-	neg	$num
-
-	##############################################################
-	# Stack layout
-	#
-	# +0	saved $num, used in reduction section
-	# +8	&t[2*$num], used in reduction section
-	# +32	saved *n0
-	# +40	saved %rsp
-	# +48	t[2*$num]
-	#
-	mov	$n0,  32(%rsp)
-	mov	%rax, 40(%rsp)		# save original %rsp
-.cfi_cfa_expression	%rsp+40,deref,+8
-.Lfrom_body:
-	mov	$num,%r11
-	lea	48(%rsp),%rax
-	pxor	%xmm0,%xmm0
-	jmp	.Lmul_by_1
-
-.align	32
-.Lmul_by_1:
-	movdqu	($aptr),%xmm1
-	movdqu	16($aptr),%xmm2
-	movdqu	32($aptr),%xmm3
-	movdqa	%xmm0,(%rax,$num)
-	movdqu	48($aptr),%xmm4
-	movdqa	%xmm0,16(%rax,$num)
-	.byte	0x48,0x8d,0xb6,0x40,0x00,0x00,0x00	# lea	64($aptr),$aptr
-	movdqa	%xmm1,(%rax)
-	movdqa	%xmm0,32(%rax,$num)
-	movdqa	%xmm2,16(%rax)
-	movdqa	%xmm0,48(%rax,$num)
-	movdqa	%xmm3,32(%rax)
-	movdqa	%xmm4,48(%rax)
-	lea	64(%rax),%rax
-	sub	\$64,%r11
-	jnz	.Lmul_by_1
-
-	movq	$rptr,%xmm1
-	movq	$nptr,%xmm2
-	.byte	0x67
-	mov	$nptr,%rbp
-	movq	%r10, %xmm3		# -num
-___
-$code.=<<___ if ($addx);
-	leaq	OPENSSL_ia32cap_P(%rip),%r11
-	mov	8(%r11),%r11d
-	and	\$0x80108,%r11d
-	cmp	\$0x80108,%r11d		# check for AD*X+BMI2+BMI1
-	jne	.Lfrom_mont_nox
-
-	lea	(%rax,$num),$rptr
-	call	__bn_sqrx8x_reduction
-	call	__bn_postx4x_internal
-
-	pxor	%xmm0,%xmm0
-	lea	48(%rsp),%rax
-	jmp	.Lfrom_mont_zero
-
-.align	32
-.Lfrom_mont_nox:
-___
-$code.=<<___;
-	call	__bn_sqr8x_reduction
-	call	__bn_post4x_internal
-
-	pxor	%xmm0,%xmm0
-	lea	48(%rsp),%rax
-	jmp	.Lfrom_mont_zero
-
-.align	32
-.Lfrom_mont_zero:
-	mov	40(%rsp),%rsi		# restore %rsp
-.cfi_def_cfa	%rsi,8
-	movdqa	%xmm0,16*0(%rax)
-	movdqa	%xmm0,16*1(%rax)
-	movdqa	%xmm0,16*2(%rax)
-	movdqa	%xmm0,16*3(%rax)
-	lea	16*4(%rax),%rax
-	sub	\$32,$num
-	jnz	.Lfrom_mont_zero
-
-	mov	\$1,%rax
-	mov	-48(%rsi),%r15
-.cfi_restore	%r15
-	mov	-40(%rsi),%r14
-.cfi_restore	%r14
-	mov	-32(%rsi),%r13
-.cfi_restore	%r13
-	mov	-24(%rsi),%r12
-.cfi_restore	%r12
-	mov	-16(%rsi),%rbp
-.cfi_restore	%rbp
-	mov	-8(%rsi),%rbx
-.cfi_restore	%rbx
-	lea	(%rsi),%rsp
-.cfi_def_cfa_register	%rsp
-.Lfrom_epilogue:
-	ret
-.cfi_endproc
-.size	bn_from_mont8x,.-bn_from_mont8x
-___
-}
 }}}
 
 if ($addx) {{{
@@ -3864,10 +3676,6 @@
 	.rva	.LSEH_begin_bn_power5
 	.rva	.LSEH_end_bn_power5
 	.rva	.LSEH_info_bn_power5
-
-	.rva	.LSEH_begin_bn_from_mont8x
-	.rva	.LSEH_end_bn_from_mont8x
-	.rva	.LSEH_info_bn_from_mont8x
 ___
 $code.=<<___ if ($addx);
 	.rva	.LSEH_begin_bn_mulx4x_mont_gather5
@@ -3899,11 +3707,6 @@
 	.byte	9,0,0,0
 	.rva	mul_handler
 	.rva	.Lpower5_prologue,.Lpower5_body,.Lpower5_epilogue	# HandlerData[]
-.align	8
-.LSEH_info_bn_from_mont8x:
-	.byte	9,0,0,0
-	.rva	mul_handler
-	.rva	.Lfrom_prologue,.Lfrom_body,.Lfrom_epilogue		# HandlerData[]
 ___
 $code.=<<___ if ($addx);
 .align	8
diff --git a/src/crypto/fipsmodule/bn/bn.c b/src/crypto/fipsmodule/bn/bn.c
index 424d462..f3fbb7a 100644
--- a/src/crypto/fipsmodule/bn/bn.c
+++ b/src/crypto/fipsmodule/bn/bn.c
@@ -56,6 +56,7 @@
 
 #include <openssl/bn.h>
 
+#include <assert.h>
 #include <limits.h>
 #include <string.h>
 
@@ -66,6 +67,11 @@
 #include "../delocate.h"
 
 
+// BN_MAX_WORDS is the maximum number of words allowed in a |BIGNUM|. It is
+// sized so byte and bit counts of a |BIGNUM| always fit in |int|, with room to
+// spare.
+#define BN_MAX_WORDS (INT_MAX / (4 * BN_BITS2))
+
 BIGNUM *BN_new(void) {
   BIGNUM *bn = OPENSSL_malloc(sizeof(BIGNUM));
 
@@ -80,6 +86,8 @@
   return bn;
 }
 
+BIGNUM *BN_secure_new(void) { return BN_new(); }
+
 void BN_init(BIGNUM *bn) {
   OPENSSL_memset(bn, 0, sizeof(BIGNUM));
 }
@@ -289,8 +297,9 @@
   }
   bn->d = (BN_ULONG *)words;
 
-  bn->width = num;
-  bn->dmax = num;
+  assert(num <= BN_MAX_WORDS);
+  bn->width = (int)num;
+  bn->dmax = (int)num;
   bn->neg = 0;
   bn->flags |= BN_FLG_STATIC_DATA;
 }
@@ -343,7 +352,7 @@
     return 1;
   }
 
-  if (words > (INT_MAX / (4 * BN_BITS2))) {
+  if (words > BN_MAX_WORDS) {
     OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
     return 0;
   }
@@ -400,7 +409,7 @@
     }
     OPENSSL_memset(bn->d + bn->width, 0,
                    (words - bn->width) * sizeof(BN_ULONG));
-    bn->width = words;
+    bn->width = (int)words;
     return 1;
   }
 
@@ -409,15 +418,15 @@
     OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
     return 0;
   }
-  bn->width = words;
+  bn->width = (int)words;
   return 1;
 }
 
 void bn_select_words(BN_ULONG *r, BN_ULONG mask, const BN_ULONG *a,
                      const BN_ULONG *b, size_t num) {
   for (size_t i = 0; i < num; i++) {
-    OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                          "crypto_word_t is too small");
+    static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                  "crypto_word_t is too small");
     r[i] = constant_time_select_w(mask, a[i], b[i]);
   }
 }
diff --git a/src/crypto/fipsmodule/bn/bn_test.cc b/src/crypto/fipsmodule/bn/bn_test.cc
index 72ec8c2..3bcdd63 100644
--- a/src/crypto/fipsmodule/bn/bn_test.cc
+++ b/src/crypto/fipsmodule/bn/bn_test.cc
@@ -2712,6 +2712,22 @@
   EXPECT_FALSE(BN_is_negative(r.get()));
 }
 
+TEST_F(BNTest, ModSqrtInvalid) {
+  bssl::UniquePtr<BIGNUM> bn2140141 = ASCIIToBIGNUM("2140141");
+  ASSERT_TRUE(bn2140141);
+  bssl::UniquePtr<BIGNUM> bn2140142 = ASCIIToBIGNUM("2140142");
+  ASSERT_TRUE(bn2140142);
+  bssl::UniquePtr<BIGNUM> bn4588033 = ASCIIToBIGNUM("4588033");
+  ASSERT_TRUE(bn4588033);
+
+  // |BN_mod_sqrt| may fail or return an arbitrary value, so we do not use
+  // |TestModSqrt| or |TestNotModSquare|. We only promise it will not crash or
+  // infinite loop. (For some invalid inputs, it may even be non-deterministic.)
+  // See CVE-2022-0778.
+  BN_free(BN_mod_sqrt(nullptr, bn2140141.get(), bn4588033.get(), ctx()));
+  BN_free(BN_mod_sqrt(nullptr, bn2140142.get(), bn4588033.get(), ctx()));
+}
+
 #if defined(OPENSSL_BN_ASM_MONT) && defined(SUPPORTS_ABI_TEST)
 TEST_F(BNTest, BNMulMontABI) {
   for (size_t words : {4, 5, 6, 7, 8, 16, 32}) {
@@ -2772,15 +2788,6 @@
                 words, 13);
       CHECK_ABI(bn_power5, r.data(), a.data(), table.data(), m->d, mont->n0,
                 words, 13);
-      EXPECT_EQ(1, CHECK_ABI(bn_from_montgomery, r.data(), r.data(), nullptr,
-                             m->d, mont->n0, words));
-      EXPECT_EQ(1, CHECK_ABI(bn_from_montgomery, r.data(), a.data(), nullptr,
-                             m->d, mont->n0, words));
-    } else {
-      EXPECT_EQ(0, CHECK_ABI(bn_from_montgomery, r.data(), r.data(), nullptr,
-                             m->d, mont->n0, words));
-      EXPECT_EQ(0, CHECK_ABI(bn_from_montgomery, r.data(), a.data(), nullptr,
-                             m->d, mont->n0, words));
     }
   }
 }
diff --git a/src/crypto/fipsmodule/bn/bn_tests.txt b/src/crypto/fipsmodule/bn/bn_tests.txt
index b4ad32c..9a1a5db 100644
--- a/src/crypto/fipsmodule/bn/bn_tests.txt
+++ b/src/crypto/fipsmodule/bn/bn_tests.txt
@@ -5355,6 +5355,18 @@
 Square = 1
 A = 1
 
+# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb
+# Test vectors from commit message.
+
+Square = 15c72e32605a3061d11b10123c1874836df96999bd0c22bad3e7d4374724a82f912c5e616a187efe8f7c47fcf6945fe575be8e3d97ed17d47950b4653cb32899
+A = 4aaac91962056c84fba7334e1a6be678022181bafd3aa878899b2346ee210f45
+
+Square = 48a699fe82f8b62bd2ed18878133575be8e3d97ed17d47950b4653cb32899
+A = 22181bafd3aa878899b2346ee210f45
+
+Square = 15c72e32272c4471392debf018c679c8b85496496bf8254cd0204f36611e2be10cdb3db8f3c081d8c94ba0e1bacc5061191b83d47ff929f65be0aebfc13ae68d3eea7a7fdf2f575842f7ec656cab3cb56a28095be34756f264f24687bf37de062822309cd1d292f96fa698c972372f09771e97d3a868cda0dc421e8a00000001
+A = 4aaac9190000000062056c8400000000fba7334e000000001a6be67800000000022181ba00000000fd3aa87800000000899b234635dad283ee210f4500000001
+
 
 # Product tests.
 #
@@ -10584,6 +10596,82 @@
 E = d7e6df5d755284929b986cd9b61c9c2c8843f24c711fbdbae1a468edcae159400943725570726cdc92b3ea94f9f206729516fdda83e31d815b0c7720e7598a91d992273e3bd8ac413b441d8f1dfe5aa7c3bf3ef573adc38292676217467731e6cf440a59611b8110af88d3e62f60209b513b01fbb69a097458ad02096b5e38f0
 M = e4e784aa1fa88625a43ba0185a153a929663920be7fe674a4d33c943d3b898cff051482e7050a070cede53be5e89f31515772c7aea637576f99f82708f89d9e244f6ad3a24a02cbe5c0ff7bcf2dad5491f53db7c3f2698a7c41b44f086652f17bb05fe4c5c0a92433c34086b49d7e1825b28bab6c5a9bd0bc95b53d659afa0d7
 
+# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb.
+# OpenSSL's test vectors do not include the expected value, so ModExp was
+# computed with Python 3.
+ModExp = ccb051a34f9e26e381e50445632cbbd4abe56bc912020f3edd2db144aedb470095c4c33e3342d1dc4bb4056ba3078366af4cee507e85bb1b2e499ef25a933810f14faa8b1a9ce5e8d58f2789e27c887a4ff87fa59ff682727a3912a99aae6db8b3b8947d76c8454cffc6fb3f2422dca106c3845b0db68a06e5e9d7b90e552506579d812e7d96bfc6324feec90ea0800463346148f120e7caf403788539f5d87ee45aa5b313c340e0a323029f3a0bdb675510aefec171c01e2a94960cd507e461214028c86ed4e9fce31e7dbdf1a75fd6f973e2aed4a039e53a60a7aa62be8ee1f80a113833ab402d07e17151021cec29fa5b2e628ef9f2d7aa4bc86b6eec8faf
+A = 95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b58f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad9852d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300eda021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465
+E = f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d312cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a55df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a47bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5
+M = fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f19009503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bcc633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280cb7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b
+
+# The following inputs trigger an edge case between Montgomery reduction and the
+# "almost" reduction variant from https://eprint.iacr.org/2011/239
+
+ModExp = 00
+A = 19c7bc9b97c6083cd7b8d1cd001452c9b67983247169c6532047eb7fc8933014dbf69fee7a358769f1429802c8ea89d4f9ca6ba6f368fbdb1fa5717b4a00
+E = bbc7e09147408571050e8d0c634682c5863b7e8a573626648902cff12e590c74f5a23ecce39732266bc15b8afbd6c48a48c83fbdc33947515cc0b6e4fb98ae2cd730e58f951fec8be7e2e3c74f4506c7fd7e29bdb28675fe8a59789ab1148e931a2ebd2d36f78bc241682a3d8083d8ff538858cd240c5a693936e5a391dc9d77118062a3f868c058440a4192267faaaba91112f45eee5842060febbf9353a6d3e7f7996573209136a5506062ea23d74067f08c613f3ff74bade25f8c3368e6dba84eae672eac11be1137fc514924fcab8c82e46d092bd047dcbadaa48c67a096ec1a04f392a8511e6acbad9954949b703e71ff837337b594055ae6f3c0fc154447a687c9ac8a2cdfd64a2e680c6ff21254735af7f5eb6b43f0bce86bda55a04143a991711081435ed4f4a89b23fc3a588022b7a8543db4bf5c8ac93603367c750ff2191f59a716340fab49bb7544759c8d846465eec1438e76395f73e7b5e945f31f1b87fefa854a0d208846eaab5fa27144fd039911608bab0eaee80f1d3553dfa2d9ba95268479b97a059613660df5ad79796e0b272244aca90ccc13449ec15c206eeed7b60405a4c5cfdf5da5d136c27fa9385d810ad198dfe794ffce9955e10520efea1e2eb794e379401b9affd863b9566ce941c4726755574a1b1946acf0090bfb93f37dd55f524485bbba7fa84b53addfde01ae1de9c57fe50d4b708dd0fa45d02af398b3d05c6d17f84c11e9aacdbe0b146cad6ddbd877731e26a17f3ebed459560d12ed7a6abc2ea6fe922e69d2622ef11b6b245b9ba8f0940faaa671a4beb727be5393a94dafaeff7221b29183e7418f4c5bb95a6a586c93dbc8ce0236d9dbe26c40513611b4141fed66599adbfb20fc30e09a4815e4159f65a6708f34584a7a77b3843941cd61a6917dcc3d07a3dfb5a2cb108bacea7e782f2111b4d22ecaaeff469ecd0da371df1ac5e9bf6df6ccba2d3a9f393d597499eaca2c206bfb81c3426c5fe45bcf16e38aecd246a319a1f37041c638b75a4839517e43a6d01bee7d85eaeedbce13cd15699d3ee42c7414cfed576590e4fb6ddb6edd3e1957efaf039bfe8b9dc75869b1f93abff15cae8b234161070fa3542303c2ed35ca66083d0ac299b81182317a2a3985269602b1fa1e822fcbda48e686d80b273f06b0a702ca7f42cbbbd2fc2b3601422c8bff6302eda3c61b293049636002649b16f3c1f0be2b6599d66493a4497cd795b10a2ab8220fafad24fa90e1bfcf39ecce337e705695c7a224bf9f445a287d6aab221341659ca4be7861f6ac4c9d33dac811e6
+M = 519b6e57781d40d897ec0c1b648d195526726b295438c9a70928ac25979563d72db91c8c42298a33b572edecdf40904c68a23337aa5341b56e92b0da5041
+
+# To fully exercise BN_mod_exp_mont_consttime codepaths, we generate inputs at
+# different bitwidths. rsaz-avx2.pl only runs at 1024-bit moduli, and
+# x86_64-mont5.pl unrolls 8 64-bit words at a time, so we want to capture both
+# multiples of 512- and non-multiples. Also include moduli that are not quite a
+# full word.
+
+# 512-bit
+ModExp = 00
+A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 8f42c9e9e351ba9b32ab0cf69da43f4acf7028d19cff6e5059ea0e3fcc97c97f36a31470044737d4c0c933ac441ecb29e32c81401523afdac7de9c3fd8493c97
+
+# 1024-bit
+ModExp = 00
+A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 9da8dc26fdf4d2e49833b240ee552beb7a6e251caa91bfb5d6cafaf8ed9461877fda8f6ac299036d35806bc1ae7872e54eaac1ec6bee6d02c6621a9cf8883b3abc33c49b3e601203e0e86ef8f0562412cc689ee2670704583909ca6d7774c9f9f9f4d77d37fedef9cb51d207cb629ec02fa03b526fd6594bfa8f2da71238a0b7
+
+# 1025-bit
+ModExp = 00
+A = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 010223abfdda02e84e11cec8ee7fc784fa135733935f7b9054bb70f1f06d234d76dcf3beed55c7f39e955dc1fef2b65009240fd02f7a1b27a78fc2867144bf666efb929856db9f671c356c4c67a068a70fe83c52eebda03668872fd270d0794f0771d217fb6b93b12529a944f7f0496a9158757c55b8ee14f803f1d2d887e2f561
+
+# 1088-bit
+ModExp = 00
+A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = e91f6d748773cb212a23aa348125615123b1800c9ea222c9374c757702ae4140fa333790ed8f6bf60a1d7dda65c2767cc5f33e32e333d19fbfb5a2b85795757c9ca070268763a618e9d33873d28a89bf88acd209efbb15b80cd33b92a6b3a682e1c91782fc24fb86ddff4f809219c977b54b99359094bbcc51dfe17b992ab24b74a17950ad754281
+
+# 1472-bit
+ModExp = 00
+A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = a8770362f4bfe4fc1ab0e52705c11a9b6ba235d5a5f22197c2d68e27ed18426ede3316af706aa79bcf943dbd51459eb15ae1f9386216b3f3a847f94440a65b97659bc5ba2adb67173714ecaa886c0b926d7a64ea45576f9d2171784ce7e801724d5b0abfd93357d538ea7ad3ad89a74f4660bdb66dfb5f684dcf00402e3cdf0ab58afd867c943c8f47b80268a789456aa7c50a619dd2f9f5e3f74b5d810f0f8dadbf4ad5b917cdcb156c4c132611c8b3b035118a9e03551f
+
+# 1536-bit
+ModExp = 00
+A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 878cd000778f927b2f1a4b8bac86efd282079a7ac0d25e09ffd2f72fbc282e65e233929d2457c7b1d63c56fb706cdfa04fb87e654c578c98d7cf59c2293dc5641086b68db4867105981daaf147a0ee91f6932ef064deae4142c19e58d50c0686f0eaf778be72450f89a98b4680bbc5ffab942195e44dd20616150fd1deca058068ca31ab2f861e99082588f17a2025bf5e536150142fca3187a259c791fc721430f24d7e338f8dc02e693a7e694d42775e80f7f7c03600b6ae86b4aba2b0e991
+
+# 2048-bit
+ModExp = 00
+A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 9f40a7535c561208ecb38e17c9336d9bc8484d335901b2cd42759cf03689227f6992f10cb6b586d767fbcdf30e9d82a0eda60d2694ccd0194fa96b50b56e0cdeec1951ea9e58b07e334a7f108841a0ab28256917fecea561388807ed124a17386a7a7b501f9cbf3404247a76948d0561e48137d3f9669e36f175731796aeaf78851f7d866917f661422186a4814aa35c066b5a90b9cfc918af769a9f0bb30c12581027df64ac328a0f07dbd20adb704479f6d0f233a131828c71bab19c3c34795ea4fb68aa632c6f688e5b3b84413c9031d8dc251003a590dec0dd09bfa6109ed4570701439b6f265b84ac2170c317357b5fbe5535e2bbdd93c1aacfdaa28c85
+
+# 3072-bit
+ModExp = 00
+A = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = c23dfd244a58a668d514498a705c8f8f548311b24f0f98b023d2d33632534c2ae948d6641d41fd7a29fbbd594bfc7fdd6e8162cbb3056af3075347b6fc8876458d33a9d0ffdbcdf482de0c73d1310fd8fa8f9f92dd0dbb0e2034e98a30f6c11b482f7476c5b593f673a322b1130daa4314e9074270dce1076436f0d56cf196afcbb235a9a7b3ac85b9062e85fc0e63a12c468c787019f6805f9faab64fc6a0babc80785d88740243f11366bffb40ccbe8b2bb7a99a2c8238a6f656bb0117d7b2602aa400f4d77de5f93c673f13264ca70de949454e3e3f261993c1aa427e8ef4f507af744f71f3b4aaf3c981d44cc1bfb1eb1151168762b242b740573df698e500d99612e17dc760f7b3bf7c235e39e81ad7edbe6c07dbb8b139745bb394d61cb799bcafec5de074932b0b2d74797e779ac8d81f63a2b2e9baa229dfaa7f90f34ffade1d2ad022a3407d35eb2d7477c6ae8ad100f6e95c05b4f947c1fabfb11a17add384e6b4cd3a02fd9b43f46805c6c74e366b74aa3b766be7a5fbbd67fa81
+
+# 4096-bit
+ModExp = 00
+A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
+E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+M = 8030411ecbddcb0fe4e76fd6b5bf542e8b015d1610cf96130ded12ba2cda0641bd9692080f218ea8b0d751845b519d95b843542ec8d2a07f1f93afe3189b69a4f35c983011c7f7928c3df458cc3eae85c36e6934a4b1bc0a67c8a521de336642c49e10a7ffa8d0af911aacc19e3900449161940f139220e099a150dcaf0ff96ffff6e726c1ac139969103cf6a828ac3adf0301506aa02787b4f570d5dde53a34acab8fec6fa94760abf16ee99954371ad65a6e899daab87b95811d069404991de9abe064ebbddf886e970f10d260c899dda940191a82d4c8bd36651363aff5493f4f59e700007dcadf37ebea7fcfd7600d16617ffea0d9ae659446d851d93c564e50e558f734c894d735fa273770703dab62844d9f01badf632f3d14a00f739c022c9be95f54e9cea46ec6da7cb11f4602e06962951c48204726b7f120ddbd0eb3566dc8d1e6f195a9196e96db33322d088b43aecffe9b4df182dd016aca0bd14f1c56cd1a18b89165c027029862b09ffd78e92ab614349c4fd67f49cb12cd33d0728930d0538bda57acef1365a73cc8fbac7d463b9e3c3bae0bb6224b080cdb8b5cd47d546d53111fdc22b7ff679bcfe27192920ee163b2be337d8cccc93b4de7d2d31934b9c0e97af291dcc1135b4a473bd37114eec3ba75c411887b57799d3188e7353f33a4d31735ebfc9fcfc044985148dd96da3876a5ab7ea7a404b411
+
 
 # RSAZ 512-bit.
 #
diff --git a/src/crypto/fipsmodule/bn/bytes.c b/src/crypto/fipsmodule/bn/bytes.c
index 56241e3..da27426 100644
--- a/src/crypto/fipsmodule/bn/bytes.c
+++ b/src/crypto/fipsmodule/bn/bytes.c
@@ -61,19 +61,38 @@
 
 #include "internal.h"
 
+void bn_big_endian_to_words(BN_ULONG *out, size_t out_len, const uint8_t *in,
+                            size_t in_len) {
+  for (size_t i = 0; i < out_len; i++) {
+    if (in_len < sizeof(BN_ULONG)) {
+      // Load the last partial word.
+      BN_ULONG word = 0;
+      for (size_t j = 0; j < in_len; j++) {
+        word = (word << 8) | in[j];
+      }
+      in_len = 0;
+      out[i] = word;
+      // Fill the remainder with zeros.
+      OPENSSL_memset(out + i + 1, 0, (out_len - i - 1) * sizeof(BN_ULONG));
+      break;
+    }
 
-BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret) {
-  size_t num_words;
-  unsigned m;
-  BN_ULONG word = 0;
-  BIGNUM *bn = NULL;
-
-  if (ret == NULL) {
-    ret = bn = BN_new();
+    in_len -= sizeof(BN_ULONG);
+    out[i] = CRYPTO_load_word_be(in + in_len);
   }
 
+  // The caller should have sized the output to avoid truncation.
+  assert(in_len == 0);
+}
+
+BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret) {
+  BIGNUM *bn = NULL;
   if (ret == NULL) {
-    return NULL;
+    bn = BN_new();
+    if (bn == NULL) {
+      return NULL;
+    }
+    ret = bn;
   }
 
   if (len == 0) {
@@ -81,12 +100,9 @@
     return ret;
   }
 
-  num_words = ((len - 1) / BN_BYTES) + 1;
-  m = (len - 1) % BN_BYTES;
+  size_t num_words = ((len - 1) / BN_BYTES) + 1;
   if (!bn_wexpand(ret, num_words)) {
-    if (bn) {
-      BN_free(bn);
-    }
+    BN_free(bn);
     return NULL;
   }
 
@@ -96,15 +112,7 @@
   ret->width = (int)num_words;
   ret->neg = 0;
 
-  while (len--) {
-    word = (word << 8) | *(in++);
-    if (m-- == 0) {
-      ret->d[--num_words] = word;
-      word = 0;
-      m = BN_BYTES - 1;
-    }
-  }
-
+  bn_big_endian_to_words(ret->d, ret->width, in, len);
   return ret;
 }
 
@@ -112,13 +120,12 @@
   BIGNUM *bn = NULL;
   if (ret == NULL) {
     bn = BN_new();
+    if (bn == NULL) {
+      return NULL;
+    }
     ret = bn;
   }
 
-  if (ret == NULL) {
-    return NULL;
-  }
-
   if (len == 0) {
     ret->width = 0;
     ret->neg = 0;
@@ -131,7 +138,7 @@
     BN_free(bn);
     return NULL;
   }
-  ret->width = num_words;
+  ret->width = (int)num_words;
 
   // Make sure the top bytes will be zeroed.
   ret->d[num_words - 1] = 0;
@@ -142,38 +149,58 @@
   return ret;
 }
 
-size_t BN_bn2bin(const BIGNUM *in, uint8_t *out) {
-  size_t n, i;
-  BN_ULONG l;
-
-  n = i = BN_num_bytes(in);
-  while (i--) {
-    l = in->d[i / BN_BYTES];
-    *(out++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
-  }
-  return n;
-}
-
-static int fits_in_bytes(const uint8_t *bytes, size_t num_bytes, size_t len) {
+// fits_in_bytes returns one if the |num_words| words in |words| can be
+// represented in |num_bytes| bytes.
+static int fits_in_bytes(const BN_ULONG *words, size_t num_words,
+                         size_t num_bytes) {
+  const uint8_t *bytes = (const uint8_t *)words;
+  size_t tot_bytes = num_words * sizeof(BN_ULONG);
   uint8_t mask = 0;
-  for (size_t i = len; i < num_bytes; i++) {
+  for (size_t i = num_bytes; i < tot_bytes; i++) {
     mask |= bytes[i];
   }
   return mask == 0;
 }
 
+void bn_words_to_big_endian(uint8_t *out, size_t out_len, const BN_ULONG *in,
+                            size_t in_len) {
+  // The caller should have selected an output length without truncation.
+  assert(fits_in_bytes(in, in_len, out_len));
+
+  // We only support little-endian platforms, so the internal representation is
+  // also little-endian as bytes. We can simply copy it in reverse.
+  const uint8_t *bytes = (const uint8_t *)in;
+  size_t num_bytes = in_len * sizeof(BN_ULONG);
+  if (out_len < num_bytes) {
+    num_bytes = out_len;
+  }
+
+  for (size_t i = 0; i < num_bytes; i++) {
+    out[out_len - i - 1] = bytes[i];
+  }
+  // Pad out the rest of the buffer with zeroes.
+  OPENSSL_memset(out, 0, out_len - num_bytes);
+}
+
+size_t BN_bn2bin(const BIGNUM *in, uint8_t *out) {
+  size_t n = BN_num_bytes(in);
+  bn_words_to_big_endian(out, n, in->d, in->width);
+  return n;
+}
+
 int BN_bn2le_padded(uint8_t *out, size_t len, const BIGNUM *in) {
-  const uint8_t *bytes = (const uint8_t *)in->d;
-  size_t num_bytes = in->width * BN_BYTES;
-  if (len < num_bytes) {
-    if (!fits_in_bytes(bytes, num_bytes, len)) {
-      return 0;
-    }
-    num_bytes = len;
+  if (!fits_in_bytes(in->d, in->width, len)) {
+    return 0;
   }
 
   // We only support little-endian platforms, so we can simply memcpy into the
   // internal representation.
+  const uint8_t *bytes = (const uint8_t *)in->d;
+  size_t num_bytes = in->width * BN_BYTES;
+  if (len < num_bytes) {
+    num_bytes = len;
+  }
+
   OPENSSL_memcpy(out, bytes, num_bytes);
   // Pad out the rest of the buffer with zeroes.
   OPENSSL_memset(out + num_bytes, 0, len - num_bytes);
@@ -181,22 +208,11 @@
 }
 
 int BN_bn2bin_padded(uint8_t *out, size_t len, const BIGNUM *in) {
-  const uint8_t *bytes = (const uint8_t *)in->d;
-  size_t num_bytes = in->width * BN_BYTES;
-  if (len < num_bytes) {
-    if (!fits_in_bytes(bytes, num_bytes, len)) {
-      return 0;
-    }
-    num_bytes = len;
+  if (!fits_in_bytes(in->d, in->width, len)) {
+    return 0;
   }
 
-  // We only support little-endian platforms, so we can simply write the buffer
-  // in reverse.
-  for (size_t i = 0; i < num_bytes; i++) {
-    out[len - i - 1] = bytes[i];
-  }
-  // Pad out the rest of the buffer with zeroes.
-  OPENSSL_memset(out, 0, len - num_bytes);
+  bn_words_to_big_endian(out, len, in->d, in->width);
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/bn/cmp.c b/src/crypto/fipsmodule/bn/cmp.c
index fe478b6..84456a2 100644
--- a/src/crypto/fipsmodule/bn/cmp.c
+++ b/src/crypto/fipsmodule/bn/cmp.c
@@ -56,8 +56,9 @@
 
 #include <openssl/bn.h>
 
+#include <assert.h>
+
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../../internal.h"
@@ -65,8 +66,8 @@
 
 static int bn_cmp_words_consttime(const BN_ULONG *a, size_t a_len,
                                   const BN_ULONG *b, size_t b_len) {
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
   int ret = 0;
   // Process the common words in little-endian order.
   size_t min = a_len < b_len ? a_len : b_len;
diff --git a/src/crypto/fipsmodule/bn/div.c b/src/crypto/fipsmodule/bn/div.c
index 02b9931..6de5a43 100644
--- a/src/crypto/fipsmodule/bn/div.c
+++ b/src/crypto/fipsmodule/bn/div.c
@@ -552,7 +552,7 @@
     return NULL;
   }
   ret->neg = 0;
-  ret->width = width;
+  ret->width = (int)width;
   return ret;
 }
 
diff --git a/src/crypto/fipsmodule/bn/div_extra.c b/src/crypto/fipsmodule/bn/div_extra.c
index 7f03f28..141f7da 100644
--- a/src/crypto/fipsmodule/bn/div_extra.c
+++ b/src/crypto/fipsmodule/bn/div_extra.c
@@ -70,7 +70,7 @@
   // This operation is not constant-time, but |p| and |d| are public values.
   // Note that |p| is at most 16, so the computation fits in |uint64_t|.
   assert(p <= 16);
-  uint32_t m = ((UINT64_C(1) << (32 + p)) + d - 1) / d;
+  uint32_t m = (uint32_t)(((UINT64_C(1) << (32 + p)) + d - 1) / d);
 
   uint16_t ret = 0;
   for (int i = bn->width - 1; i >= 0; i--) {
diff --git a/src/crypto/fipsmodule/bn/exponentiation.c b/src/crypto/fipsmodule/bn/exponentiation.c
index a0f2549..9b609b3 100644
--- a/src/crypto/fipsmodule/bn/exponentiation.c
+++ b/src/crypto/fipsmodule/bn/exponentiation.c
@@ -112,7 +112,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <openssl/cpu.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
@@ -980,13 +979,13 @@
 #if defined(OPENSSL_BN_ASM_MONT5)
   if (window >= 5) {
     window = 5;  // ~5% improvement for RSA2048 sign, and even for RSA4096
-    // reserve space for mont->N.d[] copy
+    // Reserve space for the |mont->N| copy.
     powerbufLen += top * sizeof(mont->N.d[0]);
   }
 #endif
 
   // Allocate a buffer large enough to hold all of the pre-computed
-  // powers of am, am itself and tmp.
+  // powers of |am|, |am| itself, and |tmp|.
   numPowers = 1 << window;
   powerbufLen +=
       sizeof(m->d[0]) *
@@ -1009,7 +1008,7 @@
   }
   OPENSSL_memset(powerbuf, 0, powerbufLen);
 
-  // lay down tmp and am right after powers table
+  // Place |tmp| and |am| right after powers table.
   tmp.d = powerbuf + top * numPowers;
   am.d = tmp.d + top;
   tmp.width = am.width = 0;
@@ -1017,71 +1016,66 @@
   tmp.neg = am.neg = 0;
   tmp.flags = am.flags = BN_FLG_STATIC_DATA;
 
-  if (!bn_one_to_montgomery(&tmp, mont, ctx)) {
+  if (!bn_one_to_montgomery(&tmp, mont, ctx) ||
+      !bn_resize_words(&tmp, top)) {
     goto err;
   }
 
-  // prepare a^1 in Montgomery domain
+  // Prepare a^1 in the Montgomery domain.
   assert(!a->neg);
   assert(BN_ucmp(a, m) < 0);
-  if (!BN_to_montgomery(&am, a, mont, ctx)) {
+  if (!BN_to_montgomery(&am, a, mont, ctx) ||
+      !bn_resize_words(&am, top)) {
     goto err;
   }
 
 #if defined(OPENSSL_BN_ASM_MONT5)
-  // This optimization uses ideas from http://eprint.iacr.org/2011/239,
-  // specifically optimization of cache-timing attack countermeasures
-  // and pre-computation optimization.
-
-  // Dedicated window==4 case improves 512-bit RSA sign by ~15%, but as
-  // 512-bit RSA is hardly relevant, we omit it to spare size...
+  // This optimization uses ideas from https://eprint.iacr.org/2011/239,
+  // specifically optimization of cache-timing attack countermeasures,
+  // pre-computation optimization, and Almost Montgomery Multiplication.
+  //
+  // The paper discusses a 4-bit window to optimize 512-bit modular
+  // exponentiation, used in RSA-1024 with CRT, but RSA-1024 is no longer
+  // important.
+  //
+  // |bn_mul_mont_gather5| and |bn_power5| implement the "almost" reduction
+  // variant, so the values here may not be fully reduced. They are bounded by R
+  // (i.e. they fit in |top| words), not |m|. Additionally, we pass these
+  // "almost" reduced inputs into |bn_mul_mont|, which implements the normal
+  // reduction variant. Given those inputs, |bn_mul_mont| may not give reduced
+  // output, but it will still produce "almost" reduced output.
+  //
+  // TODO(davidben): Using "almost" reduction complicates analysis of this code,
+  // and its interaction with other parts of the project. Determine whether this
+  // is actually necessary for performance.
   if (window == 5 && top > 1) {
-    const BN_ULONG *n0 = mont->n0;
-    BN_ULONG *np;
-
-    // BN_to_montgomery can contaminate words above .top
-    // [in BN_DEBUG[_DEBUG] build]...
-    for (i = am.width; i < top; i++) {
-      am.d[i] = 0;
-    }
-    for (i = tmp.width; i < top; i++) {
-      tmp.d[i] = 0;
-    }
-
-    // copy mont->N.d[] to improve cache locality
-    for (np = am.d + top, i = 0; i < top; i++) {
+    // Copy |mont->N| to improve cache locality.
+    BN_ULONG *np = am.d + top;
+    for (i = 0; i < top; i++) {
       np[i] = mont->N.d[i];
     }
 
+    // Fill |powerbuf| with the first 32 powers of |am|.
+    const BN_ULONG *n0 = mont->n0;
     bn_scatter5(tmp.d, top, powerbuf, 0);
     bn_scatter5(am.d, am.width, powerbuf, 1);
     bn_mul_mont(tmp.d, am.d, am.d, np, n0, top);
     bn_scatter5(tmp.d, top, powerbuf, 2);
 
-    // same as above, but uses squaring for 1/2 of operations
+    // Square to compute powers of two.
     for (i = 4; i < 32; i *= 2) {
       bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
       bn_scatter5(tmp.d, top, powerbuf, i);
     }
-    for (i = 3; i < 8; i += 2) {
-      int j;
+    // Compute odd powers |i| based on |i - 1|, then all powers |i * 2^j|.
+    for (i = 3; i < 32; i += 2) {
       bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, i - 1);
       bn_scatter5(tmp.d, top, powerbuf, i);
-      for (j = 2 * i; j < 32; j *= 2) {
+      for (int j = 2 * i; j < 32; j *= 2) {
         bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
         bn_scatter5(tmp.d, top, powerbuf, j);
       }
     }
-    for (; i < 16; i += 2) {
-      bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, i - 1);
-      bn_scatter5(tmp.d, top, powerbuf, i);
-      bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top);
-      bn_scatter5(tmp.d, top, powerbuf, 2 * i);
-    }
-    for (; i < 32; i += 2) {
-      bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, i - 1);
-      bn_scatter5(tmp.d, top, powerbuf, i);
-    }
 
     bits--;
     for (wvalue = 0, i = bits % 5; i >= 0; i--, bits--) {
@@ -1138,15 +1132,15 @@
         bn_power5(tmp.d, tmp.d, powerbuf, np, n0, top, val);
       }
     }
-
-    ret = bn_from_montgomery(tmp.d, tmp.d, NULL, np, n0, top);
-    tmp.width = top;
-    if (ret) {
-      if (!BN_copy(rr, &tmp)) {
-        ret = 0;
-      }
-      goto err;  // non-zero ret means it's not error
-    }
+    // The result is now in |tmp| in Montgomery form, but it may not be fully
+    // reduced. This is within bounds for |BN_from_montgomery| (tmp < R <= m*R)
+    // so it will, when converting from Montgomery form, produce a fully reduced
+    // result.
+    //
+    // This differs from Figure 2 of the paper, which uses AMM(h, 1) to convert
+    // from Montgomery form with unreduced output, followed by an extra
+    // reduction step. In the paper's terminology, we replace steps 9 and 10
+    // with MM(h, 1).
   } else
 #endif
   {
@@ -1207,7 +1201,11 @@
     }
   }
 
-  // Convert the final result from montgomery to standard format
+  // Convert the final result from Montgomery to standard format. If we used the
+  // |OPENSSL_BN_ASM_MONT5| codepath, |tmp| may not be fully reduced. It is only
+  // bounded by R rather than |m|. However, that is still within bounds for
+  // |BN_from_montgomery|, which implements full Montgomery reduction, not
+  // "almost" Montgomery reduction.
   if (!BN_from_montgomery(rr, &tmp, mont, ctx)) {
     goto err;
   }
diff --git a/src/crypto/fipsmodule/bn/gcd_extra.c b/src/crypto/fipsmodule/bn/gcd_extra.c
index 53ab170..b4fe00e 100644
--- a/src/crypto/fipsmodule/bn/gcd_extra.c
+++ b/src/crypto/fipsmodule/bn/gcd_extra.c
@@ -240,8 +240,10 @@
 
   // Each loop iteration halves at least one of |u| and |v|. Thus we need at
   // most the combined bit width of inputs for at least one value to be zero.
-  unsigned a_bits = a_width * BN_BITS2, n_bits = n_width * BN_BITS2;
-  unsigned num_iters = a_bits + n_bits;
+  // |a_bits| and |n_bits| cannot overflow because |bn_wexpand| ensures bit
+  // counts fit in even |int|.
+  size_t a_bits = a_width * BN_BITS2, n_bits = n_width * BN_BITS2;
+  size_t num_iters = a_bits + n_bits;
   if (num_iters < a_bits) {
     OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG);
     goto err;
@@ -260,7 +262,7 @@
   //
   // After each loop iteration, u and v only get smaller, and at least one of
   // them shrinks by at least a factor of two.
-  for (unsigned i = 0; i < num_iters; i++) {
+  for (size_t i = 0; i < num_iters; i++) {
     BN_ULONG both_odd = word_is_odd_mask(u->d[0]) & word_is_odd_mask(v->d[0]);
 
     // If both |u| and |v| are odd, subtract the smaller from the larger.
diff --git a/src/crypto/fipsmodule/bn/internal.h b/src/crypto/fipsmodule/bn/internal.h
index cab9a81..f7c181e 100644
--- a/src/crypto/fipsmodule/bn/internal.h
+++ b/src/crypto/fipsmodule/bn/internal.h
@@ -353,6 +353,9 @@
 // corresponding field in |BN_MONT_CTX|. It returns one if |bn_mul_mont| handles
 // inputs of this size and zero otherwise.
 //
+// If at least one of |ap| or |bp| is fully reduced, |rp| will be fully reduced.
+// If neither is fully-reduced, the output may not be either.
+//
 // TODO(davidben): The x86_64 implementation expects a 32-bit input and masks
 // off upper bits. The aarch64 implementation expects a 64-bit input and does
 // not. |size_t| is the safer option but not strictly correct for x86_64. But
@@ -372,6 +375,10 @@
 // by |ap| modulo |np|, and stores the result in |rp|. The values are |num|
 // words long and represented in Montgomery form. |n0| is a pointer to the
 // corresponding field in |BN_MONT_CTX|.
+//
+// WARNING: This function implements Almost Montgomery Multiplication from
+// https://eprint.iacr.org/2011/239. The inputs do not need to be fully reduced.
+// However, even if they are fully reduced, the output may not be.
 void bn_mul_mont_gather5(BN_ULONG *rp, const BN_ULONG *ap,
                          const BN_ULONG *table, const BN_ULONG *np,
                          const BN_ULONG *n0, int num, int power);
@@ -384,23 +391,19 @@
 
 // bn_gather5 loads index |power| of |table| and stores it in |out|. |out| and
 // each entry of |table| are |num| words long. |power| must be less than 32.
-void bn_gather5(BN_ULONG *out, size_t num, BN_ULONG *table, size_t power);
+void bn_gather5(BN_ULONG *out, size_t num, const BN_ULONG *table, size_t power);
 
 // bn_power5 squares |ap| five times and multiplies it by the value stored at
 // index |power| of |table|, modulo |np|. It stores the result in |rp|. The
 // values are |num| words long and represented in Montgomery form. |n0| is a
 // pointer to the corresponding field in |BN_MONT_CTX|. |num| must be divisible
 // by 8.
+//
+// WARNING: This function implements Almost Montgomery Multiplication from
+// https://eprint.iacr.org/2011/239. The inputs do not need to be fully reduced.
+// However, even if they are fully reduced, the output may not be.
 void bn_power5(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *table,
                const BN_ULONG *np, const BN_ULONG *n0, int num, int power);
-
-// bn_from_montgomery converts |ap| from Montgomery form modulo |np| and writes
-// the result in |rp|, each of which is |num| words long. It returns one on
-// success and zero if it cannot handle inputs of length |num|. |n0| is a
-// pointer to the corresponding field in |BN_MONT_CTX|.
-int bn_from_montgomery(BN_ULONG *rp, const BN_ULONG *ap,
-                       const BN_ULONG *not_used, const BN_ULONG *np,
-                       const BN_ULONG *n0, int num);
 #endif  // !OPENSSL_NO_ASM && OPENSSL_X86_64
 
 uint64_t bn_mont_n0(const BIGNUM *n);
@@ -436,7 +439,7 @@
 
 // bn_is_bit_set_words returns one if bit |bit| is set in |a| and zero
 // otherwise.
-int bn_is_bit_set_words(const BN_ULONG *a, size_t num, unsigned bit);
+int bn_is_bit_set_words(const BN_ULONG *a, size_t num, size_t bit);
 
 // bn_one_to_montgomery sets |r| to one in Montgomery form. It returns one on
 // success and zero on error. This function treats the bit width of the modulus
@@ -708,6 +711,25 @@
                                       size_t num, const BN_MONT_CTX *mont);
 
 
+// Word-based byte conversion functions.
+
+// bn_big_endian_to_words interprets |in_len| bytes from |in| as a big-endian,
+// unsigned integer and writes the result to |out_len| words in |out|. |out_len|
+// must be large enough to represent any |in_len|-byte value. That is, |out_len|
+// must be at least |BN_BYTES * in_len|.
+void bn_big_endian_to_words(BN_ULONG *out, size_t out_len, const uint8_t *in,
+                            size_t in_len);
+
+// bn_words_to_big_endian represents |in_len| words from |in| as a big-endian,
+// unsigned integer in |out_len| bytes. It writes the result to |out|. |out_len|
+// must be large enough to represent |in| without truncation.
+//
+// Note |out_len| may be less than |BN_BYTES * in_len| if |in| is known to have
+// leading zeros.
+void bn_words_to_big_endian(uint8_t *out, size_t out_len, const BN_ULONG *in,
+                            size_t in_len);
+
+
 #if defined(__cplusplus)
 }  // extern C
 #endif
diff --git a/src/crypto/fipsmodule/bn/montgomery.c b/src/crypto/fipsmodule/bn/montgomery.c
index e9fa08f..d04e91a 100644
--- a/src/crypto/fipsmodule/bn/montgomery.c
+++ b/src/crypto/fipsmodule/bn/montgomery.c
@@ -116,7 +116,6 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/thread.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../../internal.h"
@@ -190,11 +189,10 @@
   // others, we could use a shorter R value and use faster |BN_ULONG|-based
   // math instead of |uint64_t|-based math, which would be double-precision.
   // However, currently only the assembler files know which is which.
-  OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2,
-                        "BN_MONT_CTX_N0_LIMBS value is invalid");
-  OPENSSL_STATIC_ASSERT(
-      sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t),
-      "uint64_t is insufficient precision for n0");
+  static_assert(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2,
+                "BN_MONT_CTX_N0_LIMBS value is invalid");
+  static_assert(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t),
+                "uint64_t is insufficient precision for n0");
   uint64_t n0 = bn_mont_n0(&mont->N);
   mont->n0[0] = (BN_ULONG)n0;
 #if BN_MONT_CTX_N0_LIMBS == 2
diff --git a/src/crypto/fipsmodule/bn/montgomery_inv.c b/src/crypto/fipsmodule/bn/montgomery_inv.c
index c80873f..137af1d 100644
--- a/src/crypto/fipsmodule/bn/montgomery_inv.c
+++ b/src/crypto/fipsmodule/bn/montgomery_inv.c
@@ -22,11 +22,10 @@
 
 static uint64_t bn_neg_inv_mod_r_u64(uint64_t n);
 
-OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2,
-                      "BN_MONT_CTX_N0_LIMBS value is invalid");
-OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS ==
-                          sizeof(uint64_t),
-                      "uint64_t is insufficient precision for n0");
+static_assert(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2,
+              "BN_MONT_CTX_N0_LIMBS value is invalid");
+static_assert(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t),
+              "uint64_t is insufficient precision for n0");
 
 // LG_LITTLE_R is log_2(r).
 #define LG_LITTLE_R (BN_MONT_CTX_N0_LIMBS * BN_BITS2)
diff --git a/src/crypto/fipsmodule/bn/mul.c b/src/crypto/fipsmodule/bn/mul.c
index 6e1c3ca..fe4e4d7 100644
--- a/src/crypto/fipsmodule/bn/mul.c
+++ b/src/crypto/fipsmodule/bn/mul.c
@@ -62,7 +62,6 @@
 
 #include <openssl/err.h>
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../../internal.h"
@@ -281,8 +280,8 @@
   BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
   BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
   bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
   c = constant_time_select_w(neg, c_neg, c_pos);
 
   // We now have our three components. Add them together.
@@ -395,8 +394,8 @@
   BN_ULONG c_neg = c - bn_sub_words(&t[n2 * 2], t, &t[n2], n2);
   BN_ULONG c_pos = c + bn_add_words(&t[n2], t, &t[n2], n2);
   bn_select_words(&t[n2], neg, &t[n2 * 2], &t[n2], n2);
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
   c = constant_time_select_w(neg, c_neg, c_pos);
 
   // We now have our three components. Add them together.
diff --git a/src/crypto/fipsmodule/bn/prime.c b/src/crypto/fipsmodule/bn/prime.c
index 2e58cae..0578558 100644
--- a/src/crypto/fipsmodule/bn/prime.c
+++ b/src/crypto/fipsmodule/bn/prime.c
@@ -359,6 +359,18 @@
 static int probable_prime_dh_safe(BIGNUM *rnd, int bits, const BIGNUM *add,
                                   const BIGNUM *rem, BN_CTX *ctx);
 
+BN_GENCB *BN_GENCB_new(void) {
+  BN_GENCB *callback = OPENSSL_malloc(sizeof(BN_GENCB));
+  if (callback == NULL) {
+    OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  OPENSSL_memset(callback, 0, sizeof(BN_GENCB));
+  return callback;
+}
+
+void BN_GENCB_free(BN_GENCB *callback) { OPENSSL_free(callback); }
+
 void BN_GENCB_set(BN_GENCB *callback,
                   int (*f)(int event, int n, struct bn_gencb_st *),
                   void *arg) {
@@ -374,6 +386,8 @@
   return callback->callback(event, n, callback);
 }
 
+void *BN_GENCB_get_arg(const BN_GENCB *callback) { return callback->arg; }
+
 int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add,
                          const BIGNUM *rem, BN_GENCB *cb) {
   BIGNUM *t;
diff --git a/src/crypto/fipsmodule/bn/random.c b/src/crypto/fipsmodule/bn/random.c
index f6812f1..2500cc1 100644
--- a/src/crypto/fipsmodule/bn/random.c
+++ b/src/crypto/fipsmodule/bn/random.c
@@ -108,16 +108,17 @@
 
 #include <openssl/bn.h>
 
+#include <assert.h>
 #include <limits.h>
 #include <string.h>
 
 #include <openssl/err.h>
 #include <openssl/rand.h>
-#include <openssl/type_check.h>
 
-#include "internal.h"
 #include "../../internal.h"
 #include "../rand/internal.h"
+#include "../service_indicator/internal.h"
+#include "internal.h"
 
 
 int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) {
@@ -155,7 +156,10 @@
     return 0;
   }
 
+  FIPS_service_indicator_lock_state();
   RAND_bytes((uint8_t *)rnd->d, words * sizeof(BN_ULONG));
+  FIPS_service_indicator_unlock_state();
+
   rnd->d[words - 1] &= mask;
   if (top != BN_RAND_TOP_ANY) {
     if (top == BN_RAND_TOP_TWO && bits > 1) {
@@ -195,8 +199,8 @@
   }
 
   // |a| < |b| iff a[1..len-1] are all zero and a[0] < b.
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
   crypto_word_t mask = 0;
   for (size_t i = 1; i < len; i++) {
     mask |= a[i];
@@ -270,8 +274,10 @@
 
     // Steps 4 and 5. Use |words| and |mask| together to obtain a string of N
     // bits, where N is the bit length of |max_exclusive|.
+    FIPS_service_indicator_lock_state();
     RAND_bytes_with_additional_data((uint8_t *)out, words * sizeof(BN_ULONG),
                                     additional_data);
+    FIPS_service_indicator_unlock_state();
     out[words - 1] &= mask;
 
     // If out >= max_exclusive or out < min_inclusive, retry. This implements
@@ -313,7 +319,9 @@
   }
 
   // Select a uniform random number with num_bits(max_exclusive) bits.
+  FIPS_service_indicator_lock_state();
   RAND_bytes((uint8_t *)r->d, words * sizeof(BN_ULONG));
+  FIPS_service_indicator_unlock_state();
   r->d[words - 1] &= mask;
 
   // Check, in constant-time, if the value is in range.
@@ -328,7 +336,7 @@
   assert(bn_in_range_words(r->d, min_inclusive, max_exclusive->d, words));
 
   r->neg = 0;
-  r->width = words;
+  r->width = (int)words;
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/bn/rsaz_exp.c b/src/crypto/fipsmodule/bn/rsaz_exp.c
index 7e15aaf..7b455b5 100644
--- a/src/crypto/fipsmodule/bn/rsaz_exp.c
+++ b/src/crypto/fipsmodule/bn/rsaz_exp.c
@@ -18,6 +18,8 @@
 
 #include <openssl/mem.h>
 
+#include <assert.h>
+
 #include "internal.h"
 #include "../../internal.h"
 
@@ -38,8 +40,8 @@
                             const BN_ULONG m_norm[16], const BN_ULONG RR[16],
                             BN_ULONG k0,
                             BN_ULONG storage[MOD_EXP_CTIME_STORAGE_LEN]) {
-  OPENSSL_STATIC_ASSERT(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH % 64 == 0,
-                        "MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH is too small");
+  static_assert(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH % 64 == 0,
+                "MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH is too small");
   assert((uintptr_t)storage % 64 == 0);
 
   BN_ULONG *a_inv, *m, *result, *table_s = storage + 40 * 3, *R2 = table_s;
@@ -66,23 +68,14 @@
   // R2 = 2^3052 * 2^80 / 2^1044 = 2^2088 = (2^1044)^2
 
   // table[0] = 1
-  rsaz_1024_mul_avx2(result, R2, one, m, k0);
   // table[1] = a_inv^1
+  rsaz_1024_mul_avx2(result, R2, one, m, k0);
   rsaz_1024_mul_avx2(a_inv, a_inv, R2, m, k0);
-
   rsaz_1024_scatter5_avx2(table_s, result, 0);
   rsaz_1024_scatter5_avx2(table_s, a_inv, 1);
-
   // table[2] = a_inv^2
   rsaz_1024_sqr_avx2(result, a_inv, m, k0, 1);
   rsaz_1024_scatter5_avx2(table_s, result, 2);
-#if 0
-  // This is almost 2x smaller and less than 1% slower.
-  for (int index = 3; index < 32; index++) {
-    rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-    rsaz_1024_scatter5_avx2(table_s, result, index);
-  }
-#else
   // table[4] = a_inv^4
   rsaz_1024_sqr_avx2(result, result, m, k0, 1);
   rsaz_1024_scatter5_avx2(table_s, result, 4);
@@ -92,109 +85,25 @@
   // table[16] = a_inv^16
   rsaz_1024_sqr_avx2(result, result, m, k0, 1);
   rsaz_1024_scatter5_avx2(table_s, result, 16);
-  // table[17] = a_inv^17
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 17);
+  for (int i = 3; i < 32; i += 2) {
+    // table[i] = table[i-1] * a_inv = a_inv^i
+    rsaz_1024_gather5_avx2(result, table_s, i - 1);
+    rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
+    rsaz_1024_scatter5_avx2(table_s, result, i);
+    for (int j = 2 * i; j < 32; j *= 2) {
+      // table[j] = table[j/2]^2 = a_inv^j
+      rsaz_1024_sqr_avx2(result, result, m, k0, 1);
+      rsaz_1024_scatter5_avx2(table_s, result, j);
+    }
+  }
 
-  // table[3]
-  rsaz_1024_gather5_avx2(result, table_s, 2);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 3);
-  // table[6]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 6);
-  // table[12]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 12);
-  // table[24]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 24);
-  // table[25]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 25);
-
-  // table[5]
-  rsaz_1024_gather5_avx2(result, table_s, 4);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 5);
-  // table[10]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 10);
-  // table[20]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 20);
-  // table[21]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 21);
-
-  // table[7]
-  rsaz_1024_gather5_avx2(result, table_s, 6);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 7);
-  // table[14]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 14);
-  // table[28]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 28);
-  // table[29]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 29);
-
-  // table[9]
-  rsaz_1024_gather5_avx2(result, table_s, 8);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 9);
-  // table[18]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 18);
-  // table[19]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 19);
-
-  // table[11]
-  rsaz_1024_gather5_avx2(result, table_s, 10);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 11);
-  // table[22]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 22);
-  // table[23]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 23);
-
-  // table[13]
-  rsaz_1024_gather5_avx2(result, table_s, 12);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 13);
-  // table[26]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 26);
-  // table[27]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 27);
-
-  // table[15]
-  rsaz_1024_gather5_avx2(result, table_s, 14);
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 15);
-  // table[30]
-  rsaz_1024_sqr_avx2(result, result, m, k0, 1);
-  rsaz_1024_scatter5_avx2(table_s, result, 30);
-  // table[31]
-  rsaz_1024_mul_avx2(result, result, a_inv, m, k0);
-  rsaz_1024_scatter5_avx2(table_s, result, 31);
-#endif
-
+  // Load the first window.
   const uint8_t *p_str = (const uint8_t *)exponent;
-
-  // load first window
   int wvalue = p_str[127] >> 3;
   rsaz_1024_gather5_avx2(result, table_s, wvalue);
 
   int index = 1014;
   while (index > -1) {  // Loop for the remaining 127 windows.
-
     rsaz_1024_sqr_avx2(result, result, m, k0, 5);
 
     uint16_t wvalue_16;
@@ -219,6 +128,8 @@
   rsaz_1024_mul_avx2(result, result, one, m, k0);
 
   rsaz_1024_red2norm_avx2(result_norm, result);
+  BN_ULONG scratch[16];
+  bn_reduce_once_in_place(result_norm, /*carry=*/0, m_norm, scratch, 16);
 
   OPENSSL_cleanse(storage, MOD_EXP_CTIME_STORAGE_LEN * sizeof(BN_ULONG));
 }
diff --git a/src/crypto/fipsmodule/bn/rsaz_exp.h b/src/crypto/fipsmodule/bn/rsaz_exp.h
index 3b06192..bc7a439 100644
--- a/src/crypto/fipsmodule/bn/rsaz_exp.h
+++ b/src/crypto/fipsmodule/bn/rsaz_exp.h
@@ -16,9 +16,9 @@
 #define OPENSSL_HEADER_BN_RSAZ_EXP_H
 
 #include <openssl/bn.h>
-#include <openssl/cpu.h>
 
 #include "internal.h"
+#include "../../internal.h"
 
 #if defined(__cplusplus)
 extern "C" {
@@ -41,18 +41,17 @@
                             BN_ULONG storage_words[MOD_EXP_CTIME_STORAGE_LEN]);
 
 OPENSSL_INLINE int rsaz_avx2_capable(void) {
-  const uint32_t *cap = OPENSSL_ia32cap_get();
-  return (cap[2] & (1 << 5)) != 0;  // AVX2
+  return CRYPTO_is_AVX2_capable();
 }
 
 OPENSSL_INLINE int rsaz_avx2_preferred(void) {
-  const uint32_t *cap = OPENSSL_ia32cap_get();
-  static const uint32_t kBMI2AndADX = (1 << 8) | (1 << 19);
-  if ((cap[2] & kBMI2AndADX) == kBMI2AndADX) {
-    // If BMI2 and ADX are available, x86_64-mont5.pl is faster.
+  if (CRYPTO_is_BMI1_capable() && CRYPTO_is_BMI2_capable() &&
+      CRYPTO_is_ADX_capable()) {
+    // If BMI1, BMI2, and ADX are available, x86_64-mont5.pl is faster. See the
+    // .Lmulx4x_enter and .Lpowerx5_enter branches.
     return 0;
   }
-  return (cap[2] & (1 << 5)) != 0;  // AVX2
+  return CRYPTO_is_AVX2_capable();
 }
 
 
@@ -91,7 +90,11 @@
                             int i);
 
 // rsaz_1024_red2norm_avx2 converts |red| from RSAZ to |BIGNUM| representation
-// and writes the result to |norm|.
+// and writes the result to |norm|. The result will be <= the modulus.
+//
+// WARNING: The result of this operation may not be fully reduced. |norm| may be
+// the modulus instead of zero. This function should be followed by a call to
+// |bn_reduce_once|.
 void rsaz_1024_red2norm_avx2(BN_ULONG norm[16], const BN_ULONG red[40]);
 
 
diff --git a/src/crypto/fipsmodule/bn/shift.c b/src/crypto/fipsmodule/bn/shift.c
index 523da67..6960e57 100644
--- a/src/crypto/fipsmodule/bn/shift.c
+++ b/src/crypto/fipsmodule/bn/shift.c
@@ -56,10 +56,10 @@
 
 #include <openssl/bn.h>
 
+#include <assert.h>
 #include <string.h>
 
 #include <openssl/err.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 
@@ -258,9 +258,9 @@
   return 1;
 }
 
-int bn_is_bit_set_words(const BN_ULONG *a, size_t num, unsigned bit) {
-  unsigned i = bit / BN_BITS2;
-  unsigned j = bit % BN_BITS2;
+int bn_is_bit_set_words(const BN_ULONG *a, size_t num, size_t bit) {
+  size_t i = bit / BN_BITS2;
+  size_t j = bit % BN_BITS2;
   if (i >= num) {
     return 0;
   }
@@ -296,15 +296,14 @@
 }
 
 static int bn_count_low_zero_bits_word(BN_ULONG l) {
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
-  OPENSSL_STATIC_ASSERT(sizeof(int) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
-  OPENSSL_STATIC_ASSERT(BN_BITS2 == sizeof(BN_ULONG) * 8,
-                        "BN_ULONG has padding bits");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
+  static_assert(sizeof(int) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
+  static_assert(BN_BITS2 == sizeof(BN_ULONG) * 8, "BN_ULONG has padding bits");
   // C has very bizarre rules for types smaller than an int.
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) >= sizeof(int),
-                        "BN_ULONG gets promoted to int");
+  static_assert(sizeof(BN_ULONG) >= sizeof(int),
+                "BN_ULONG gets promoted to int");
 
   crypto_word_t mask;
   int bits = 0;
@@ -342,10 +341,10 @@
 }
 
 int BN_count_low_zero_bits(const BIGNUM *bn) {
-  OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
-  OPENSSL_STATIC_ASSERT(sizeof(int) <= sizeof(crypto_word_t),
-                        "crypto_word_t is too small");
+  static_assert(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
+  static_assert(sizeof(int) <= sizeof(crypto_word_t),
+                "crypto_word_t is too small");
 
   int ret = 0;
   crypto_word_t saw_nonzero = 0;
diff --git a/src/crypto/fipsmodule/bn/sqrt.c b/src/crypto/fipsmodule/bn/sqrt.c
index db88829..9180d54 100644
--- a/src/crypto/fipsmodule/bn/sqrt.c
+++ b/src/crypto/fipsmodule/bn/sqrt.c
@@ -306,8 +306,7 @@
   }
 
   // x := a^((q-1)/2)
-  if (BN_is_zero(t))  // special case: p = 2^e + 1
-  {
+  if (BN_is_zero(t)) {  // special case: p = 2^e + 1
     if (!BN_nnmod(t, A, p, ctx)) {
       goto end;
     }
@@ -350,7 +349,6 @@
     // We have  a*b = x^2,
     //    y^2^(e-1) = -1,
     //    b^2^(e-1) = 1.
-
     if (BN_is_one(b)) {
       if (!BN_copy(ret, x)) {
         goto end;
@@ -359,23 +357,26 @@
       goto vrfy;
     }
 
-
-    // find smallest  i  such that  b^(2^i) = 1
-    i = 1;
-    if (!BN_mod_sqr(t, b, p, ctx)) {
+    // Find the smallest i, 0 < i < e, such that b^(2^i) = 1
+    for (i = 1; i < e; i++) {
+      if (i == 1) {
+        if (!BN_mod_sqr(t, b, p, ctx)) {
+          goto end;
+        }
+      } else {
+        if (!BN_mod_mul(t, t, t, p, ctx)) {
+          goto end;
+        }
+      }
+      if (BN_is_one(t)) {
+        break;
+      }
+    }
+    // If not found, a is not a square or p is not a prime.
+    if (i >= e) {
+      OPENSSL_PUT_ERROR(BN, BN_R_NOT_A_SQUARE);
       goto end;
     }
-    while (!BN_is_one(t)) {
-      i++;
-      if (i == e) {
-        OPENSSL_PUT_ERROR(BN, BN_R_NOT_A_SQUARE);
-        goto end;
-      }
-      if (!BN_mod_mul(t, t, t, p, ctx)) {
-        goto end;
-      }
-    }
-
 
     // t := y^2^(e - i - 1)
     if (!BN_copy(t, y)) {
@@ -391,14 +392,15 @@
         !BN_mod_mul(b, b, y, p, ctx)) {
       goto end;
     }
+
+    // e decreases each iteration, so this loop will terminate.
+    assert(i < e);
     e = i;
   }
 
 vrfy:
   if (!err) {
-    // verify the result -- the input might have been not a square
-    // (test added in 0.9.8)
-
+    // Verify the result. The input might have been not a square.
     if (!BN_mod_sqr(x, ret, p, ctx)) {
       err = 1;
     }
diff --git a/src/crypto/fipsmodule/cipher/aead.c b/src/crypto/fipsmodule/cipher/aead.c
index 8d2ad04..97f0b0d 100644
--- a/src/crypto/fipsmodule/cipher/aead.c
+++ b/src/crypto/fipsmodule/cipher/aead.c
@@ -51,6 +51,9 @@
 }
 
 void EVP_AEAD_CTX_free(EVP_AEAD_CTX *ctx) {
+  if (ctx == NULL) {
+    return;
+  }
   EVP_AEAD_CTX_cleanup(ctx);
   OPENSSL_free(ctx);
 }
diff --git a/src/crypto/fipsmodule/cipher/cipher.c b/src/crypto/fipsmodule/cipher/cipher.c
index 64ee544..ee45578 100644
--- a/src/crypto/fipsmodule/cipher/cipher.c
+++ b/src/crypto/fipsmodule/cipher/cipher.c
@@ -65,6 +65,7 @@
 #include <openssl/nid.h>
 
 #include "internal.h"
+#include "../service_indicator/internal.h"
 #include "../../internal.h"
 
 
@@ -103,6 +104,11 @@
     return 0;
   }
 
+  if (in->poisoned) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
+
   EVP_CIPHER_CTX_cleanup(out);
   OPENSSL_memcpy(out, in, sizeof(EVP_CIPHER_CTX));
 
@@ -225,6 +231,9 @@
 
   ctx->buf_len = 0;
   ctx->final_used = 0;
+  // Clear the poisoned flag to permit re-use of a CTX that previously had a
+  // failed operation.
+  ctx->poisoned = 0;
   return 1;
 }
 
@@ -249,6 +258,15 @@
 
 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
                       const uint8_t *in, int in_len) {
+  if (ctx->poisoned) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
+  // If the first call to |cipher| succeeds and the second fails, |ctx| may be
+  // left in an indeterminate state. We set a poison flag on failure to ensure
+  // callers do not continue to use the object in that case.
+  ctx->poisoned = 1;
+
   // Ciphers that use blocks may write up to |bl| extra bytes. Ensure the output
   // does not overflow |*out_len|.
   int bl = ctx->cipher->block_size;
@@ -264,17 +282,23 @@
     } else {
       *out_len = ret;
     }
+    ctx->poisoned = 0;
     return 1;
   }
 
   if (in_len <= 0) {
     *out_len = 0;
-    return in_len == 0;
+    if (in_len == 0) {
+      ctx->poisoned = 0;
+      return 1;
+    }
+    return 0;
   }
 
   if (ctx->buf_len == 0 && block_remainder(ctx, in_len) == 0) {
     if (ctx->cipher->cipher(ctx, out, in, in_len)) {
       *out_len = in_len;
+      ctx->poisoned = 0;
       return 1;
     } else {
       *out_len = 0;
@@ -289,6 +313,7 @@
       OPENSSL_memcpy(&ctx->buf[i], in, in_len);
       ctx->buf_len += in_len;
       *out_len = 0;
+      ctx->poisoned = 0;
       return 1;
     } else {
       int j = bl - i;
@@ -318,28 +343,36 @@
     OPENSSL_memcpy(ctx->buf, &in[in_len], i);
   }
   ctx->buf_len = i;
+  ctx->poisoned = 0;
   return 1;
 }
 
 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len) {
-  int n, ret;
+  int n;
   unsigned int i, b, bl;
 
+  if (ctx->poisoned) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
+
   if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
-    ret = ctx->cipher->cipher(ctx, out, NULL, 0);
-    if (ret < 0) {
+    // When EVP_CIPH_FLAG_CUSTOM_CIPHER is set, the return value of |cipher| is
+    // the number of bytes written, or -1 on error. Otherwise the return value
+    // is one on success and zero on error.
+    const int num_bytes = ctx->cipher->cipher(ctx, out, NULL, 0);
+    if (num_bytes < 0) {
       return 0;
-    } else {
-      *out_len = ret;
     }
-    return 1;
+    *out_len = num_bytes;
+    goto out;
   }
 
   b = ctx->cipher->block_size;
   assert(b <= sizeof(ctx->buf));
   if (b == 1) {
     *out_len = 0;
-    return 1;
+    goto out;
   }
 
   bl = ctx->buf_len;
@@ -349,24 +382,30 @@
       return 0;
     }
     *out_len = 0;
-    return 1;
+    goto out;
   }
 
   n = b - bl;
   for (i = bl; i < b; i++) {
     ctx->buf[i] = n;
   }
-  ret = ctx->cipher->cipher(ctx, out, ctx->buf, b);
-
-  if (ret) {
-    *out_len = b;
+  if (!ctx->cipher->cipher(ctx, out, ctx->buf, b)) {
+    return 0;
   }
+  *out_len = b;
 
-  return ret;
+out:
+  EVP_Cipher_verify_service_indicator(ctx);
+  return 1;
 }
 
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
                       const uint8_t *in, int in_len) {
+  if (ctx->poisoned) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
+
   // Ciphers that use blocks may write up to |bl| extra bytes. Ensure the output
   // does not overflow |*out_len|.
   unsigned int b = ctx->cipher->block_size;
@@ -429,6 +468,11 @@
   unsigned int b;
   *out_len = 0;
 
+  if (ctx->poisoned) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    return 0;
+  }
+
   if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
     i = ctx->cipher->cipher(ctx, out, NULL, 0);
     if (i < 0) {
@@ -436,7 +480,7 @@
     } else {
       *out_len = i;
     }
-    return 1;
+    goto out;
   }
 
   b = ctx->cipher->block_size;
@@ -446,7 +490,7 @@
       return 0;
     }
     *out_len = 0;
-    return 1;
+    goto out;
   }
 
   if (b > 1) {
@@ -480,12 +524,30 @@
     *out_len = 0;
   }
 
+out:
+  EVP_Cipher_verify_service_indicator(ctx);
   return 1;
 }
 
 int EVP_Cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in,
                size_t in_len) {
-  return ctx->cipher->cipher(ctx, out, in, in_len);
+  const int ret = ctx->cipher->cipher(ctx, out, in, in_len);
+
+  // |EVP_CIPH_FLAG_CUSTOM_CIPHER| never sets the FIPS indicator via
+  // |EVP_Cipher| because it's complicated whether the operation has completed
+  // or not. E.g. AES-GCM with a non-NULL |in| argument hasn't completed an
+  // operation. Callers should use the |EVP_AEAD| API or, at least,
+  // |EVP_CipherUpdate| etc.
+  //
+  // This call can't be pushed into |EVP_Cipher_verify_service_indicator|
+  // because whether |ret| indicates success or not depends on whether
+  // |EVP_CIPH_FLAG_CUSTOM_CIPHER| is set. (This unreasonable, but matches
+  // OpenSSL.)
+  if (!(ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) && ret) {
+    EVP_Cipher_verify_service_indicator(ctx);
+  }
+
+  return ret;
 }
 
 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len,
diff --git a/src/crypto/fipsmodule/cipher/e_aes.c b/src/crypto/fipsmodule/cipher/e_aes.c
index 76f4066..5f23793 100644
--- a/src/crypto/fipsmodule/cipher/e_aes.c
+++ b/src/crypto/fipsmodule/cipher/e_aes.c
@@ -47,12 +47,12 @@
  * ==================================================================== */
 
 #include <assert.h>
+#include <limits.h>
 #include <string.h>
 
 #include <openssl/aead.h>
 #include <openssl/aes.h>
 #include <openssl/cipher.h>
-#include <openssl/cpu.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/nid.h>
@@ -62,6 +62,7 @@
 #include "../../internal.h"
 #include "../aes/internal.h"
 #include "../modes/internal.h"
+#include "../service_indicator/internal.h"
 #include "../delocate.h"
 
 
@@ -99,16 +100,13 @@
   out += 16 * bsaes_blocks;
   blocks -= bsaes_blocks;
 
-  union {
-    uint32_t u32[4];
-    uint8_t u8[16];
-  } new_ivec;
-  memcpy(new_ivec.u8, ivec, 16);
-  uint32_t ctr = CRYPTO_bswap4(new_ivec.u32[3]) + bsaes_blocks;
-  new_ivec.u32[3] = CRYPTO_bswap4(ctr);
+  uint8_t new_ivec[16];
+  memcpy(new_ivec, ivec, 12);
+  uint32_t ctr = CRYPTO_load_u32_be(ivec + 12) + bsaes_blocks;
+  CRYPTO_store_u32_be(new_ivec + 12, ctr);
 
   // Finish any remaining blocks with |vpaes_ctr32_encrypt_blocks|.
-  vpaes_ctr32_encrypt_blocks(in, out, blocks, key, new_ivec.u8);
+  vpaes_ctr32_encrypt_blocks(in, out, blocks, key, new_ivec);
 }
 #endif  // BSAES
 
@@ -292,8 +290,10 @@
 ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_KEY *gcm_key,
                          block128_f *out_block, const uint8_t *key,
                          size_t key_bytes) {
+  // This function assumes the key length was previously validated.
+  assert(key_bytes == 128 / 8 || key_bytes == 192 / 8 || key_bytes == 256 / 8);
   if (hwaes_capable()) {
-    aes_hw_set_encrypt_key(key, key_bytes * 8, aes_key);
+    aes_hw_set_encrypt_key(key, (int)key_bytes * 8, aes_key);
     if (gcm_key != NULL) {
       CRYPTO_gcm128_init_key(gcm_key, aes_key, aes_hw_encrypt, 1);
     }
@@ -304,7 +304,7 @@
   }
 
   if (vpaes_capable()) {
-    vpaes_set_encrypt_key(key, key_bytes * 8, aes_key);
+    vpaes_set_encrypt_key(key, (int)key_bytes * 8, aes_key);
     if (out_block) {
       *out_block = vpaes_encrypt;
     }
@@ -321,7 +321,7 @@
 #endif
   }
 
-  aes_nohw_set_encrypt_key(key, key_bytes * 8, aes_key);
+  aes_nohw_set_encrypt_key(key, (int)key_bytes * 8, aes_key);
   if (gcm_key != NULL) {
     CRYPTO_gcm128_init_key(gcm_key, aes_key, aes_nohw_encrypt, 0);
   }
@@ -338,11 +338,9 @@
 #endif
 
 static EVP_AES_GCM_CTX *aes_gcm_from_cipher_ctx(EVP_CIPHER_CTX *ctx) {
-#if defined(__GNUC__) || defined(__clang__)
-  OPENSSL_STATIC_ASSERT(
+  static_assert(
       alignof(EVP_AES_GCM_CTX) <= 16,
       "EVP_AES_GCM_CTX needs more alignment than this function provides");
-#endif
 
   // |malloc| guarantees up to 4-byte alignment on 32-bit and 8-byte alignment
   // on 64-bit systems, so we need to adjust to reach 16-byte alignment.
@@ -486,8 +484,13 @@
       if (arg) {
         OPENSSL_memcpy(gctx->iv, ptr, arg);
       }
-      if (c->encrypt && !RAND_bytes(gctx->iv + arg, gctx->ivlen - arg)) {
-        return 0;
+      if (c->encrypt) {
+        // |RAND_bytes| calls within the fipsmodule should be wrapped with state
+        // lock functions to avoid updating the service indicator with the DRBG
+        // functions.
+        FIPS_service_indicator_lock_state();
+        RAND_bytes(gctx->iv + arg, gctx->ivlen - arg);
+        FIPS_service_indicator_unlock_state();
       }
       gctx->iv_gen = 1;
       return 1;
@@ -552,6 +555,14 @@
     return -1;
   }
 
+  if (len > INT_MAX) {
+    // This function signature can only express up to |INT_MAX| bytes encrypted.
+    //
+    // TODO(https://crbug.com/boringssl/494): Make the internal |EVP_CIPHER|
+    // calling convention |size_t|-clean.
+    return -1;
+  }
+
   if (in) {
     if (out == NULL) {
       if (!CRYPTO_gcm128_aad(&gctx->gcm, in, len)) {
@@ -580,7 +591,7 @@
         }
       }
     }
-    return len;
+    return (int)len;
   } else {
     if (!ctx->encrypt) {
       if (gctx->taglen < 0 ||
@@ -598,7 +609,7 @@
   }
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_cbc_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_128_cbc) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_128_cbc;
@@ -611,7 +622,7 @@
   out->cipher = aes_cbc_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_ctr_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_128_ctr) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_128_ctr;
@@ -636,7 +647,7 @@
   out->cipher = aes_ecb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_ofb_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_128_ofb) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_128_ofb128;
@@ -649,7 +660,7 @@
   out->cipher = aes_ofb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_gcm_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_128_gcm) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_128_gcm;
@@ -666,7 +677,7 @@
   out->ctrl = aes_gcm_ctrl;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_cbc_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_192_cbc) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_192_cbc;
@@ -679,7 +690,7 @@
   out->cipher = aes_cbc_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_ctr_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_192_ctr) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_192_ctr;
@@ -704,7 +715,7 @@
   out->cipher = aes_ecb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_ofb_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_192_ofb) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_192_ofb128;
@@ -717,7 +728,7 @@
   out->cipher = aes_ofb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_gcm_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_192_gcm) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_192_gcm;
@@ -734,7 +745,7 @@
   out->ctrl = aes_gcm_ctrl;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_cbc_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_256_cbc) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_256_cbc;
@@ -747,7 +758,7 @@
   out->cipher = aes_cbc_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_ctr_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_256_ctr) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_256_ctr;
@@ -772,7 +783,7 @@
   out->cipher = aes_ecb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_ofb_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_256_ofb) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_256_ofb128;
@@ -785,7 +796,7 @@
   out->cipher = aes_ofb_cipher;
 }
 
-DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_gcm_generic) {
+DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_aes_256_gcm) {
   memset(out, 0, sizeof(EVP_CIPHER));
 
   out->nid = NID_aes_256_gcm;
@@ -870,26 +881,6 @@
 
 #endif  // HWAES_ECB
 
-#define EVP_CIPHER_FUNCTION(keybits, mode)             \
-  const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \
-    return aes_##keybits##_##mode##_generic();         \
-  }
-
-EVP_CIPHER_FUNCTION(128, cbc)
-EVP_CIPHER_FUNCTION(128, ctr)
-EVP_CIPHER_FUNCTION(128, ofb)
-EVP_CIPHER_FUNCTION(128, gcm)
-
-EVP_CIPHER_FUNCTION(192, cbc)
-EVP_CIPHER_FUNCTION(192, ctr)
-EVP_CIPHER_FUNCTION(192, ofb)
-EVP_CIPHER_FUNCTION(192, gcm)
-
-EVP_CIPHER_FUNCTION(256, cbc)
-EVP_CIPHER_FUNCTION(256, ctr)
-EVP_CIPHER_FUNCTION(256, ofb)
-EVP_CIPHER_FUNCTION(256, gcm)
-
 EVP_ECB_CIPHER_FUNCTION(128)
 EVP_ECB_CIPHER_FUNCTION(192)
 EVP_ECB_CIPHER_FUNCTION(256)
@@ -941,14 +932,12 @@
   return 1;
 }
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_gcm_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_gcm_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_gcm_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_gcm_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_aes_gcm_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                              size_t key_len, size_t requested_tag_len) {
@@ -1100,9 +1089,14 @@
                                     const uint8_t *in_tag, size_t in_tag_len,
                                     const uint8_t *ad, size_t ad_len) {
   struct aead_aes_gcm_ctx *gcm_ctx = (struct aead_aes_gcm_ctx *)&ctx->state;
-  return aead_aes_gcm_open_gather_impl(gcm_ctx, out, nonce, nonce_len, in,
-                                       in_len, in_tag, in_tag_len, ad, ad_len,
-                                       ctx->tag_len);
+  if (!aead_aes_gcm_open_gather_impl(gcm_ctx, out, nonce, nonce_len, in, in_len,
+                                     in_tag, in_tag_len, ad, ad_len,
+                                     ctx->tag_len)) {
+    return 0;
+  }
+
+  AEAD_GCM_verify_service_indicator(ctx);
+  return 1;
 }
 
 DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm) {
@@ -1187,7 +1181,12 @@
     return 0;
   }
 
+  // |RAND_bytes| calls within the fipsmodule should be wrapped with state lock
+  // functions to avoid updating the service indicator with the DRBG functions.
+  FIPS_service_indicator_lock_state();
   RAND_bytes(nonce, sizeof(nonce));
+  FIPS_service_indicator_unlock_state();
+
   const struct aead_aes_gcm_ctx *gcm_ctx =
       (const struct aead_aes_gcm_ctx *)&ctx->state;
   if (!aead_aes_gcm_seal_scatter_impl(gcm_ctx, out, out_tag, out_tag_len,
@@ -1202,6 +1201,7 @@
   memcpy(out_tag + *out_tag_len, nonce, sizeof(nonce));
   *out_tag_len += sizeof(nonce);
 
+  AEAD_GCM_verify_service_indicator(ctx);
   return 1;
 }
 
@@ -1224,10 +1224,15 @@
 
   const struct aead_aes_gcm_ctx *gcm_ctx =
       (const struct aead_aes_gcm_ctx *)&ctx->state;
-  return aead_aes_gcm_open_gather_impl(
+  if (!aead_aes_gcm_open_gather_impl(
       gcm_ctx, out, nonce, AES_GCM_NONCE_LENGTH, in, in_len, in_tag,
       in_tag_len - AES_GCM_NONCE_LENGTH, ad, ad_len,
-      ctx->tag_len - AES_GCM_NONCE_LENGTH);
+      ctx->tag_len - AES_GCM_NONCE_LENGTH)) {
+    return 0;
+  }
+
+  AEAD_GCM_verify_service_indicator(ctx);
+  return 1;
 }
 
 DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm_randnonce) {
@@ -1265,14 +1270,12 @@
   uint64_t min_next_nonce;
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_gcm_tls12_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_gcm_tls12_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_gcm_tls12_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_gcm_tls12_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_aes_gcm_tls12_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                                    size_t key_len, size_t requested_tag_len) {
@@ -1305,21 +1308,23 @@
   }
 
   // The given nonces must be strictly monotonically increasing.
-  uint64_t given_counter;
-  OPENSSL_memcpy(&given_counter, nonce + nonce_len - sizeof(given_counter),
-                 sizeof(given_counter));
-  given_counter = CRYPTO_bswap8(given_counter);
-  if (given_counter == UINT64_MAX ||
-      given_counter < gcm_ctx->min_next_nonce) {
+  uint64_t given_counter =
+      CRYPTO_load_u64_be(nonce + nonce_len - sizeof(uint64_t));
+  if (given_counter == UINT64_MAX || given_counter < gcm_ctx->min_next_nonce) {
     OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_INVALID_NONCE);
     return 0;
   }
 
   gcm_ctx->min_next_nonce = given_counter + 1;
 
-  return aead_aes_gcm_seal_scatter(ctx, out, out_tag, out_tag_len,
-                                   max_out_tag_len, nonce, nonce_len, in,
-                                   in_len, extra_in, extra_in_len, ad, ad_len);
+  if (!aead_aes_gcm_seal_scatter(ctx, out, out_tag, out_tag_len,
+                                 max_out_tag_len, nonce, nonce_len, in, in_len,
+                                 extra_in, extra_in_len, ad, ad_len)) {
+    return 0;
+  }
+
+  AEAD_GCM_verify_service_indicator(ctx);
+  return 1;
 }
 
 DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm_tls12) {
@@ -1359,14 +1364,12 @@
   uint8_t first;
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_gcm_tls13_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_gcm_tls13_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_gcm_tls13_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_gcm_tls13_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_aes_gcm_tls13_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                                    size_t key_len, size_t requested_tag_len) {
@@ -1402,10 +1405,8 @@
   // The given nonces must be strictly monotonically increasing. See
   // https://tools.ietf.org/html/rfc8446#section-5.3 for details of the TLS 1.3
   // nonce construction.
-  uint64_t given_counter;
-  OPENSSL_memcpy(&given_counter, nonce + nonce_len - sizeof(given_counter),
-                 sizeof(given_counter));
-  given_counter = CRYPTO_bswap8(given_counter);
+  uint64_t given_counter =
+      CRYPTO_load_u64_be(nonce + nonce_len - sizeof(uint64_t));
 
   if (gcm_ctx->first) {
     // In the first call the sequence number will be zero and therefore the
@@ -1423,9 +1424,14 @@
 
   gcm_ctx->min_next_nonce = given_counter + 1;
 
-  return aead_aes_gcm_seal_scatter(ctx, out, out_tag, out_tag_len,
-                                   max_out_tag_len, nonce, nonce_len, in,
-                                   in_len, extra_in, extra_in_len, ad, ad_len);
+  if (!aead_aes_gcm_seal_scatter(ctx, out, out_tag, out_tag_len,
+                                 max_out_tag_len, nonce, nonce_len, in, in_len,
+                                 extra_in, extra_in_len, ad, ad_len)) {
+    return 0;
+  }
+
+  AEAD_GCM_verify_service_indicator(ctx);
+  return 1;
 }
 
 DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm_tls13) {
diff --git a/src/crypto/cipher_extra/e_aesccm.c b/src/crypto/fipsmodule/cipher/e_aesccm.c
similarity index 88%
rename from src/crypto/cipher_extra/e_aesccm.c
rename to src/crypto/fipsmodule/cipher/e_aesccm.c
index e9e9e16..c00bf61 100644
--- a/src/crypto/cipher_extra/e_aesccm.c
+++ b/src/crypto/fipsmodule/cipher/e_aesccm.c
@@ -50,12 +50,13 @@
 
 #include <assert.h>
 
-#include <openssl/cpu.h>
 #include <openssl/cipher.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-#include "../fipsmodule/cipher/internal.h"
+#include "../delocate.h"
+#include "../service_indicator/internal.h"
+#include "internal.h"
 
 
 struct ccm128_context {
@@ -275,14 +276,12 @@
   struct ccm128_context ccm;
 };
 
-OPENSSL_STATIC_ASSERT(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
-                          sizeof(struct aead_aes_ccm_ctx),
-                      "AEAD state is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(union evp_aead_ctx_st_state) >=
-                          alignof(struct aead_aes_ccm_ctx),
-                      "AEAD state has insufficient alignment");
-#endif
+static_assert(sizeof(((EVP_AEAD_CTX *)NULL)->state) >=
+                  sizeof(struct aead_aes_ccm_ctx),
+              "AEAD state is too small");
+static_assert(alignof(union evp_aead_ctx_st_state) >=
+                  alignof(struct aead_aes_ccm_ctx),
+              "AEAD state has insufficient alignment");
 
 static int aead_aes_ccm_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
                              size_t key_len, size_t tag_len, unsigned M,
@@ -351,6 +350,7 @@
   }
 
   *out_tag_len = ctx->tag_len;
+  AEAD_CCM_verify_service_indicator(ctx);
   return 1;
 }
 
@@ -391,6 +391,7 @@
     return 0;
   }
 
+  AEAD_CCM_verify_service_indicator(ctx);
   return 1;
 }
 
@@ -399,25 +400,18 @@
   return aead_aes_ccm_init(ctx, key, key_len, tag_len, 4, 2);
 }
 
-static const EVP_AEAD aead_aes_128_ccm_bluetooth = {
-    16,  // key length (AES-128)
-    13,  // nonce length
-    4,   // overhead
-    4,   // max tag length
-    0,   // seal_scatter_supports_extra_in
+DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_ccm_bluetooth) {
+  memset(out, 0, sizeof(EVP_AEAD));
 
-    aead_aes_ccm_bluetooth_init,
-    NULL /* init_with_direction */,
-    aead_aes_ccm_cleanup,
-    NULL /* open */,
-    aead_aes_ccm_seal_scatter,
-    aead_aes_ccm_open_gather,
-    NULL /* get_iv */,
-    NULL /* tag_len */,
-};
+  out->key_len = 16;
+  out->nonce_len = 13;
+  out->overhead = 4;
+  out->max_tag_len = 4;
 
-const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth(void) {
-  return &aead_aes_128_ccm_bluetooth;
+  out->init = aead_aes_ccm_bluetooth_init;
+  out->cleanup = aead_aes_ccm_cleanup;
+  out->seal_scatter = aead_aes_ccm_seal_scatter;
+  out->open_gather = aead_aes_ccm_open_gather;
 }
 
 static int aead_aes_ccm_bluetooth_8_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
@@ -425,23 +419,35 @@
   return aead_aes_ccm_init(ctx, key, key_len, tag_len, 8, 2);
 }
 
-static const EVP_AEAD aead_aes_128_ccm_bluetooth_8 = {
-    16,  // key length (AES-128)
-    13,  // nonce length
-    8,   // overhead
-    8,   // max tag length
-    0,   // seal_scatter_supports_extra_in
+DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_ccm_bluetooth_8) {
+  memset(out, 0, sizeof(EVP_AEAD));
 
-    aead_aes_ccm_bluetooth_8_init,
-    NULL /* init_with_direction */,
-    aead_aes_ccm_cleanup,
-    NULL /* open */,
-    aead_aes_ccm_seal_scatter,
-    aead_aes_ccm_open_gather,
-    NULL /* get_iv */,
-    NULL /* tag_len */,
-};
+  out->key_len = 16;
+  out->nonce_len = 13;
+  out->overhead = 8;
+  out->max_tag_len = 8;
 
-const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth_8(void) {
-  return &aead_aes_128_ccm_bluetooth_8;
+  out->init = aead_aes_ccm_bluetooth_8_init;
+  out->cleanup = aead_aes_ccm_cleanup;
+  out->seal_scatter = aead_aes_ccm_seal_scatter;
+  out->open_gather = aead_aes_ccm_open_gather;
+}
+
+static int aead_aes_ccm_matter_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
+                                    size_t key_len, size_t tag_len) {
+  return aead_aes_ccm_init(ctx, key, key_len, tag_len, 16, 2);
+}
+
+DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_ccm_matter) {
+  memset(out, 0, sizeof(EVP_AEAD));
+
+  out->key_len = 16;
+  out->nonce_len = 13;
+  out->overhead = 16;
+  out->max_tag_len = 16;
+
+  out->init = aead_aes_ccm_matter_init;
+  out->cleanup = aead_aes_ccm_cleanup;
+  out->seal_scatter = aead_aes_ccm_seal_scatter;
+  out->open_gather = aead_aes_ccm_open_gather;
 }
diff --git a/src/crypto/fipsmodule/cipher/internal.h b/src/crypto/fipsmodule/cipher/internal.h
index 68efe33..6ec9a3b 100644
--- a/src/crypto/fipsmodule/cipher/internal.h
+++ b/src/crypto/fipsmodule/cipher/internal.h
@@ -112,6 +112,45 @@
                     size_t extra_in_len);
 };
 
+struct evp_cipher_st {
+  // type contains a NID identifying the cipher. (e.g. NID_aes_128_gcm.)
+  int nid;
+
+  // block_size contains the block size, in bytes, of the cipher, or 1 for a
+  // stream cipher.
+  unsigned block_size;
+
+  // key_len contains the key size, in bytes, for the cipher. If the cipher
+  // takes a variable key size then this contains the default size.
+  unsigned key_len;
+
+  // iv_len contains the IV size, in bytes, or zero if inapplicable.
+  unsigned iv_len;
+
+  // ctx_size contains the size, in bytes, of the per-key context for this
+  // cipher.
+  unsigned ctx_size;
+
+  // flags contains the OR of a number of flags. See |EVP_CIPH_*|.
+  uint32_t flags;
+
+  // app_data is a pointer to opaque, user data.
+  void *app_data;
+
+  int (*init)(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv,
+              int enc);
+
+  int (*cipher)(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in,
+                size_t inl);
+
+  // cleanup, if non-NULL, releases memory associated with the context. It is
+  // called if |EVP_CTRL_INIT| succeeds. Note that |init| may not have been
+  // called at this point.
+  void (*cleanup)(EVP_CIPHER_CTX *);
+
+  int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr);
+};
+
 // aes_ctr_set_key initialises |*aes_key| using |key_bytes| bytes from |key|,
 // where |key_bytes| must either be 16, 24 or 32. If not NULL, |*out_block| is
 // set to a function that encrypts single blocks. If not NULL, |*gcm_key| is
diff --git a/src/crypto/cmac/cavp_3des_cmac_tests.txt b/src/crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt
similarity index 100%
rename from src/crypto/cmac/cavp_3des_cmac_tests.txt
rename to src/crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt
diff --git a/src/crypto/cmac/cavp_aes128_cmac_tests.txt b/src/crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt
similarity index 100%
rename from src/crypto/cmac/cavp_aes128_cmac_tests.txt
rename to src/crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt
diff --git a/src/crypto/cmac/cavp_aes192_cmac_tests.txt b/src/crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt
similarity index 100%
rename from src/crypto/cmac/cavp_aes192_cmac_tests.txt
rename to src/crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt
diff --git a/src/crypto/cmac/cavp_aes256_cmac_tests.txt b/src/crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt
similarity index 100%
rename from src/crypto/cmac/cavp_aes256_cmac_tests.txt
rename to src/crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt
diff --git a/src/crypto/cmac/cmac.c b/src/crypto/fipsmodule/cmac/cmac.c
similarity index 83%
rename from src/crypto/cmac/cmac.c
rename to src/crypto/fipsmodule/cmac/cmac.c
index b6a10f7..efffe5f 100644
--- a/src/crypto/cmac/cmac.c
+++ b/src/crypto/fipsmodule/cmac/cmac.c
@@ -49,13 +49,15 @@
 #include <openssl/cmac.h>
 
 #include <assert.h>
+#include <limits.h>
 #include <string.h>
 
 #include <openssl/aes.h>
 #include <openssl/cipher.h>
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
+#include "../service_indicator/internal.h"
 
 
 struct cmac_ctx_st {
@@ -85,6 +87,8 @@
              const uint8_t *in, size_t in_len) {
   const EVP_CIPHER *cipher;
   switch (key_len) {
+    // WARNING: this code assumes that all supported key sizes are FIPS
+    // Approved.
     case 16:
       cipher = EVP_aes_128_cbc();
       break;
@@ -99,10 +103,17 @@
   CMAC_CTX ctx;
   CMAC_CTX_init(&ctx);
 
+  // We have to verify that all the CMAC services actually succeed before
+  // updating the indicator state, so we lock the state here.
+  FIPS_service_indicator_lock_state();
   const int ok = CMAC_Init(&ctx, key, key_len, cipher, NULL /* engine */) &&
                  CMAC_Update(&ctx, in, in_len) &&
                  CMAC_Final(&ctx, out, &scratch_out_len);
+  FIPS_service_indicator_unlock_state();
 
+  if (ok) {
+    FIPS_service_indicator_update_state();
+  }
   CMAC_CTX_cleanup(&ctx);
   return ok;
 }
@@ -173,8 +184,13 @@
 
 int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t key_len,
               const EVP_CIPHER *cipher, ENGINE *engine) {
+  int ret = 0;
   uint8_t scratch[AES_BLOCK_SIZE];
 
+  // We have to avoid the underlying AES-CBC |EVP_CIPHER| services updating the
+  // indicator state, so we lock the state here.
+  FIPS_service_indicator_lock_state();
+
   size_t block_size = EVP_CIPHER_block_size(cipher);
   if ((block_size != AES_BLOCK_SIZE && block_size != 8 /* 3-DES */) ||
       EVP_CIPHER_key_length(cipher) != key_len ||
@@ -182,7 +198,7 @@
       !EVP_Cipher(&ctx->cipher_ctx, scratch, kZeroIV, block_size) ||
       // Reset context again ready for first data.
       !EVP_EncryptInit_ex(&ctx->cipher_ctx, NULL, NULL, NULL, kZeroIV)) {
-    return 0;
+    goto out;
   }
 
   if (block_size == AES_BLOCK_SIZE) {
@@ -193,8 +209,11 @@
     binary_field_mul_x_64(ctx->k2, ctx->k1);
   }
   ctx->block_used = 0;
+  ret = 1;
 
-  return 1;
+out:
+  FIPS_service_indicator_unlock_state();
+  return ret;
 }
 
 int CMAC_Reset(CMAC_CTX *ctx) {
@@ -203,6 +222,12 @@
 }
 
 int CMAC_Update(CMAC_CTX *ctx, const uint8_t *in, size_t in_len) {
+  int ret = 0;
+
+  // We have to avoid the underlying AES-CBC |EVP_Cipher| services updating the
+  // indicator state, so we lock the state here.
+  FIPS_service_indicator_lock_state();
+
   size_t block_size = EVP_CIPHER_CTX_block_size(&ctx->cipher_ctx);
   assert(block_size <= AES_BLOCK_SIZE);
   uint8_t scratch[AES_BLOCK_SIZE];
@@ -224,38 +249,51 @@
     // case we don't want to process this block now because it might be the last
     // block and that block is treated specially.
     if (in_len == 0) {
-      return 1;
+      ret = 1;
+      goto out;
     }
 
     assert(ctx->block_used == block_size);
 
     if (!EVP_Cipher(&ctx->cipher_ctx, scratch, ctx->block, block_size)) {
-      return 0;
+      goto out;
     }
   }
 
   // Encrypt all but one of the remaining blocks.
   while (in_len > block_size) {
     if (!EVP_Cipher(&ctx->cipher_ctx, scratch, in, block_size)) {
-      return 0;
+      goto out;
     }
     in += block_size;
     in_len -= block_size;
   }
 
   OPENSSL_memcpy(ctx->block, in, in_len);
-  ctx->block_used = in_len;
+  // |in_len| is bounded by |block_size|, which fits in |unsigned|.
+  static_assert(EVP_MAX_BLOCK_LENGTH < UINT_MAX,
+                "EVP_MAX_BLOCK_LENGTH is too large");
+  ctx->block_used = (unsigned)in_len;
+  ret = 1;
 
-  return 1;
+out:
+  FIPS_service_indicator_unlock_state();
+  return ret;
 }
 
 int CMAC_Final(CMAC_CTX *ctx, uint8_t *out, size_t *out_len) {
+  int ret = 0;
   size_t block_size = EVP_CIPHER_CTX_block_size(&ctx->cipher_ctx);
   assert(block_size <= AES_BLOCK_SIZE);
 
+  // We have to avoid the underlying AES-CBC |EVP_Cipher| services updating the
+  // indicator state, so we lock the state here.
+  FIPS_service_indicator_lock_state();
+
   *out_len = block_size;
   if (out == NULL) {
-    return 1;
+    ret = 1;
+    goto out;
   }
 
   const uint8_t *mask = ctx->k1;
@@ -273,6 +311,12 @@
   for (unsigned i = 0; i < block_size; i++) {
     out[i] = ctx->block[i] ^ mask[i];
   }
+  ret = EVP_Cipher(&ctx->cipher_ctx, out, out, block_size);
 
-  return EVP_Cipher(&ctx->cipher_ctx, out, out, block_size);
+out:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    FIPS_service_indicator_update_state();
+  }
+  return ret;
 }
diff --git a/src/crypto/cmac/cmac_test.cc b/src/crypto/fipsmodule/cmac/cmac_test.cc
similarity index 94%
rename from src/crypto/cmac/cmac_test.cc
rename to src/crypto/fipsmodule/cmac/cmac_test.cc
index e8a220a..9e3744e 100644
--- a/src/crypto/cmac/cmac_test.cc
+++ b/src/crypto/fipsmodule/cmac/cmac_test.cc
@@ -23,9 +23,9 @@
 #include <openssl/cmac.h>
 #include <openssl/mem.h>
 
-#include "../test/file_test.h"
-#include "../test/test_util.h"
-#include "../test/wycheproof_util.h"
+#include "../../test/file_test.h"
+#include "../../test/test_util.h"
+#include "../../test/wycheproof_util.h"
 
 
 static void test(const char *name, const uint8_t *key, size_t key_len,
@@ -248,20 +248,21 @@
 }
 
 TEST(CMACTest, CAVPAES128) {
-  RunCAVPTest("crypto/cmac/cavp_aes128_cmac_tests.txt", EVP_aes_128_cbc(),
-              false);
+  RunCAVPTest("crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt",
+              EVP_aes_128_cbc(), false);
 }
 
 TEST(CMACTest, CAVPAES192) {
-  RunCAVPTest("crypto/cmac/cavp_aes192_cmac_tests.txt", EVP_aes_192_cbc(),
-              false);
+  RunCAVPTest("crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt",
+              EVP_aes_192_cbc(), false);
 }
 
 TEST(CMACTest, CAVPAES256) {
-  RunCAVPTest("crypto/cmac/cavp_aes256_cmac_tests.txt", EVP_aes_256_cbc(),
-              false);
+  RunCAVPTest("crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt",
+              EVP_aes_256_cbc(), false);
 }
 
 TEST(CMACTest, CAVP3DES) {
-  RunCAVPTest("crypto/cmac/cavp_3des_cmac_tests.txt", EVP_des_ede3_cbc(), true);
+  RunCAVPTest("crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt",
+              EVP_des_ede3_cbc(), true);
 }
diff --git a/src/crypto/fipsmodule/dh/check.c b/src/crypto/fipsmodule/dh/check.c
index 5b6e03a..0c82c17 100644
--- a/src/crypto/fipsmodule/dh/check.c
+++ b/src/crypto/fipsmodule/dh/check.c
@@ -58,6 +58,8 @@
 
 #include <openssl/bn.h>
 
+#include "internal.h"
+
 
 int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *out_flags) {
   *out_flags = 0;
@@ -165,9 +167,6 @@
     if (!BN_is_one(t2)) {
       *out_flags |= DH_CHECK_INVALID_Q_VALUE;
     }
-    if (dh->j && BN_cmp(dh->j, t1)) {
-      *out_flags |= DH_CHECK_INVALID_J_VALUE;
-    }
   } else if (BN_is_word(dh->g, DH_GENERATOR_2)) {
     l = BN_mod_word(dh->p, 24);
     if (l == (BN_ULONG)-1) {
diff --git a/src/crypto/fipsmodule/dh/dh.c b/src/crypto/fipsmodule/dh/dh.c
index ab596e9..11dbfc2 100644
--- a/src/crypto/fipsmodule/dh/dh.c
+++ b/src/crypto/fipsmodule/dh/dh.c
@@ -66,6 +66,8 @@
 
 #include "../../internal.h"
 #include "../bn/internal.h"
+#include "../service_indicator/internal.h"
+#include "internal.h"
 
 
 #define OPENSSL_DH_MAX_MODULUS_BITS 10000
@@ -99,9 +101,6 @@
   BN_clear_free(dh->p);
   BN_clear_free(dh->g);
   BN_clear_free(dh->q);
-  BN_clear_free(dh->j);
-  OPENSSL_free(dh->seed);
-  BN_clear_free(dh->counter);
   BN_clear_free(dh->pub_key);
   BN_clear_free(dh->priv_key);
   CRYPTO_MUTEX_cleanup(&dh->method_mont_p_lock);
@@ -109,6 +108,8 @@
   OPENSSL_free(dh);
 }
 
+unsigned DH_bits(const DH *dh) { return BN_num_bits(dh->p); }
+
 const BIGNUM *DH_get0_pub_key(const DH *dh) { return dh->pub_key; }
 
 const BIGNUM *DH_get0_priv_key(const DH *dh) { return dh->priv_key; }
@@ -186,6 +187,8 @@
 }
 
 int DH_generate_key(DH *dh) {
+  boringssl_ensure_ffdh_self_test();
+
   int ok = 0;
   int generate_new_key = 0;
   BN_CTX *ctx = NULL;
@@ -322,7 +325,8 @@
   return ret;
 }
 
-int DH_compute_key_padded(unsigned char *out, const BIGNUM *peers_key, DH *dh) {
+int dh_compute_key_padded_no_self_test(unsigned char *out,
+                                       const BIGNUM *peers_key, DH *dh) {
   BN_CTX *ctx = BN_CTX_new();
   if (ctx == NULL) {
     return -1;
@@ -343,7 +347,15 @@
   return ret;
 }
 
+int DH_compute_key_padded(unsigned char *out, const BIGNUM *peers_key, DH *dh) {
+  boringssl_ensure_ffdh_self_test();
+
+  return dh_compute_key_padded_no_self_test(out, peers_key, dh);
+}
+
 int DH_compute_key(unsigned char *out, const BIGNUM *peers_key, DH *dh) {
+  boringssl_ensure_ffdh_self_test();
+
   BN_CTX *ctx = BN_CTX_new();
   if (ctx == NULL) {
     return -1;
@@ -353,7 +365,8 @@
   int ret = -1;
   BIGNUM *shared_key = BN_CTX_get(ctx);
   if (shared_key && dh_compute_key(dh, shared_key, peers_key, ctx)) {
-    ret = BN_bn2bin(shared_key, out);
+    // A |BIGNUM|'s byte count fits in |int|.
+    ret = (int)BN_bn2bin(shared_key, out);
   }
 
   BN_CTX_end(ctx);
@@ -371,6 +384,8 @@
     return 0;
   }
 
+  FIPS_service_indicator_lock_state();
+
   int ret = 0;
   const size_t dh_len = DH_size(dh);
   uint8_t *shared_bytes = OPENSSL_malloc(dh_len);
@@ -392,6 +407,7 @@
   ret = 1;
 
  err:
+  FIPS_service_indicator_unlock_state();
   OPENSSL_free(shared_bytes);
   return ret;
 }
diff --git a/src/crypto/fipsmodule/dh/internal.h b/src/crypto/fipsmodule/dh/internal.h
new file mode 100644
index 0000000..fb525d4
--- /dev/null
+++ b/src/crypto/fipsmodule/dh/internal.h
@@ -0,0 +1,56 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_CRYPTO_FIPSMODULE_DH_INTERNAL_H
+#define OPENSSL_HEADER_CRYPTO_FIPSMODULE_DH_INTERNAL_H
+
+#include <openssl/base.h>
+
+#include <openssl/thread.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+struct dh_st {
+  BIGNUM *p;
+  BIGNUM *g;
+  BIGNUM *q;
+  BIGNUM *pub_key;   // g^x mod p
+  BIGNUM *priv_key;  // x
+
+  // priv_length contains the length, in bits, of the private value. If zero,
+  // the private value will be the same length as |p|.
+  unsigned priv_length;
+
+  CRYPTO_MUTEX method_mont_p_lock;
+  BN_MONT_CTX *method_mont_p;
+
+  int flags;
+  CRYPTO_refcount_t references;
+};
+
+// dh_compute_key_padded_no_self_test does the same as |DH_compute_key_padded|,
+// but doesn't try to run the self-test first. This is for use in the self tests
+// themselves, to prevent an infinite loop.
+int dh_compute_key_padded_no_self_test(unsigned char *out,
+                                       const BIGNUM *peers_key, DH *dh);
+
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif  // OPENSSL_HEADER_CRYPTO_FIPSMODULE_DH_INTERNAL_H
diff --git a/src/crypto/fipsmodule/digest/digest.c b/src/crypto/fipsmodule/digest/digest.c
index 059d72c..cb723d6 100644
--- a/src/crypto/fipsmodule/digest/digest.c
+++ b/src/crypto/fipsmodule/digest/digest.c
@@ -106,6 +106,11 @@
   return 1;
 }
 
+void EVP_MD_CTX_cleanse(EVP_MD_CTX *ctx) {
+  OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
+  EVP_MD_CTX_cleanup(ctx);
+}
+
 void EVP_MD_CTX_free(EVP_MD_CTX *ctx) {
   if (!ctx) {
     return;
diff --git a/src/crypto/evp/digestsign.c b/src/crypto/fipsmodule/digestsign/digestsign.c
similarity index 82%
rename from src/crypto/evp/digestsign.c
rename to src/crypto/fipsmodule/digestsign/digestsign.c
index 6e4d305..e5b6bc7 100644
--- a/src/crypto/evp/digestsign.c
+++ b/src/crypto/fipsmodule/digestsign/digestsign.c
@@ -57,8 +57,10 @@
 
 #include <openssl/err.h>
 
-#include "internal.h"
-#include "../fipsmodule/digest/internal.h"
+#include "../../evp/internal.h"
+#include "../delocate.h"
+#include "../digest/internal.h"
+#include "../service_indicator/internal.h"
 
 
 enum evp_sign_verify_t {
@@ -66,9 +68,9 @@
   evp_verify,
 };
 
-static const struct evp_md_pctx_ops md_pctx_ops = {
-  EVP_PKEY_CTX_free,
-  EVP_PKEY_CTX_dup,
+DEFINE_LOCAL_DATA(struct evp_md_pctx_ops, md_pctx_ops) {
+  out->free = EVP_PKEY_CTX_free;
+  out->dup = EVP_PKEY_CTX_dup;
 };
 
 static int uses_prehash(EVP_MD_CTX *ctx, enum evp_sign_verify_t op) {
@@ -85,7 +87,7 @@
   if (ctx->pctx == NULL) {
     return 0;
   }
-  ctx->pctx_ops = &md_pctx_ops;
+  ctx->pctx_ops = md_pctx_ops();
 
   if (op == evp_verify) {
     if (!EVP_PKEY_verify_init(ctx->pctx)) {
@@ -159,11 +161,17 @@
     uint8_t md[EVP_MAX_MD_SIZE];
     unsigned int mdlen;
 
+    FIPS_service_indicator_lock_state();
     EVP_MD_CTX_init(&tmp_ctx);
     ret = EVP_MD_CTX_copy_ex(&tmp_ctx, ctx) &&
           EVP_DigestFinal_ex(&tmp_ctx, md, &mdlen) &&
           EVP_PKEY_sign(ctx->pctx, out_sig, out_sig_len, md, mdlen);
     EVP_MD_CTX_cleanup(&tmp_ctx);
+    FIPS_service_indicator_unlock_state();
+
+    if (ret) {
+      EVP_DigestSign_verify_service_indicator(ctx);
+    }
 
     return ret;
   } else {
@@ -184,48 +192,76 @@
   uint8_t md[EVP_MAX_MD_SIZE];
   unsigned int mdlen;
 
+  FIPS_service_indicator_lock_state();
   EVP_MD_CTX_init(&tmp_ctx);
   ret = EVP_MD_CTX_copy_ex(&tmp_ctx, ctx) &&
         EVP_DigestFinal_ex(&tmp_ctx, md, &mdlen) &&
         EVP_PKEY_verify(ctx->pctx, sig, sig_len, md, mdlen);
+  FIPS_service_indicator_unlock_state();
   EVP_MD_CTX_cleanup(&tmp_ctx);
 
+  if (ret) {
+    EVP_DigestVerify_verify_service_indicator(ctx);
+  }
+
   return ret;
 }
 
 int EVP_DigestSign(EVP_MD_CTX *ctx, uint8_t *out_sig, size_t *out_sig_len,
                    const uint8_t *data, size_t data_len) {
+  FIPS_service_indicator_lock_state();
+  int ret = 0;
+
   if (uses_prehash(ctx, evp_sign)) {
     // If |out_sig| is NULL, the caller is only querying the maximum output
     // length. |data| should only be incorporated in the final call.
     if (out_sig != NULL &&
         !EVP_DigestSignUpdate(ctx, data, data_len)) {
-      return 0;
+      goto end;
     }
 
-    return EVP_DigestSignFinal(ctx, out_sig, out_sig_len);
+    ret = EVP_DigestSignFinal(ctx, out_sig, out_sig_len);
+    goto end;
   }
 
   if (ctx->pctx->pmeth->sign_message == NULL) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
-    return 0;
+    goto end;
   }
 
-  return ctx->pctx->pmeth->sign_message(ctx->pctx, out_sig, out_sig_len, data,
-                                        data_len);
+  ret = ctx->pctx->pmeth->sign_message(ctx->pctx, out_sig, out_sig_len, data,
+                                       data_len);
+
+end:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    EVP_DigestSign_verify_service_indicator(ctx);
+  }
+  return ret;
 }
 
 int EVP_DigestVerify(EVP_MD_CTX *ctx, const uint8_t *sig, size_t sig_len,
                      const uint8_t *data, size_t len) {
+  FIPS_service_indicator_lock_state();
+  int ret = 0;
+
   if (uses_prehash(ctx, evp_verify)) {
-    return EVP_DigestVerifyUpdate(ctx, data, len) &&
-           EVP_DigestVerifyFinal(ctx, sig, sig_len);
+    ret = EVP_DigestVerifyUpdate(ctx, data, len) &&
+          EVP_DigestVerifyFinal(ctx, sig, sig_len);
+    goto end;
   }
 
   if (ctx->pctx->pmeth->verify_message == NULL) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
-    return 0;
+    goto end;
   }
 
-  return ctx->pctx->pmeth->verify_message(ctx->pctx, sig, sig_len, data, len);
+  ret = ctx->pctx->pmeth->verify_message(ctx->pctx, sig, sig_len, data, len);
+
+end:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    EVP_DigestVerify_verify_service_indicator(ctx);
+  }
+  return ret;
 }
diff --git a/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl b/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl
new file mode 100644
index 0000000..0d628e7
--- /dev/null
+++ b/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl
@@ -0,0 +1,1652 @@
+#! /usr/bin/env perl
+# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+
+# ====================================================================
+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
+# project. The module is, however, dual licensed under OpenSSL and
+# CRYPTOGAMS licenses depending on where you obtain it. For further
+# details see http://www.openssl.org/~appro/cryptogams/.
+# ====================================================================
+#
+# ECP_NISTZ256 module for ARMv8.
+#
+# February 2015.
+#
+# Original ECP_NISTZ256 submission targeting x86_64 is detailed in
+# http://eprint.iacr.org/2013/816.
+#
+#			with/without -DECP_NISTZ256_ASM
+# Apple A7		+190-360%
+# Cortex-A53		+190-400%
+# Cortex-A57		+190-350%
+# Denver		+230-400%
+#
+# Ranges denote minimum and maximum improvement coefficients depending
+# on benchmark. Lower coefficients are for ECDSA sign, server-side
+# operation. Keep in mind that +400% means 5x improvement.
+
+# The first two arguments should always be the flavour and output file path.
+if ($#ARGV < 1) { die "Not enough arguments provided.
+  Two arguments are necessary: the flavour and the output file path."; }
+
+$flavour = shift;
+$output = shift;
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
+( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
+die "can't locate arm-xlate.pl";
+
+open OUT,"| \"$^X\" $xlate $flavour $output";
+*STDOUT=*OUT;
+
+{
+my ($rp,$ap,$bp,$bi,$a0,$a1,$a2,$a3,$t0,$t1,$t2,$t3,$poly1,$poly3,
+    $acc0,$acc1,$acc2,$acc3,$acc4,$acc5) =
+    map("x$_",(0..17,19,20));
+
+my ($acc6,$acc7)=($ap,$bp);	# used in __ecp_nistz256_sqr_mont
+
+$code.=<<___;
+#include "openssl/arm_arch.h"
+
+.text
+.align	5
+.Lpoly:
+.quad	0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001
+.LRR:	// 2^512 mod P precomputed for NIST P256 polynomial
+.quad	0x0000000000000003,0xfffffffbffffffff,0xfffffffffffffffe,0x00000004fffffffd
+.Lone_mont:
+.quad	0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe
+.Lone:
+.quad	1,0,0,0
+.Lord:
+.quad	0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000
+.LordK:
+.quad	0xccd1c8aaee00bc4f
+.asciz	"ECP_NISTZ256 for ARMv8, CRYPTOGAMS by <appro\@openssl.org>"
+
+// void	ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4],
+//					     const BN_ULONG x2[4]);
+.globl	ecp_nistz256_mul_mont
+.type	ecp_nistz256_mul_mont,%function
+.align	4
+ecp_nistz256_mul_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldr	$bi,[$bp]		// bp[0]
+	ldp	$a0,$a1,[$ap]
+	ldp	$a2,$a3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	bl	__ecp_nistz256_mul_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
+
+// void	ecp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_sqr_mont
+.type	ecp_nistz256_sqr_mont,%function
+.align	4
+ecp_nistz256_sqr_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldp	$a0,$a1,[$ap]
+	ldp	$a2,$a3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	bl	__ecp_nistz256_sqr_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
+
+// void	ecp_nistz256_div_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_div_by_2
+.type	ecp_nistz256_div_by_2,%function
+.align	4
+ecp_nistz256_div_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	$acc0,$acc1,[$ap]
+	ldp	$acc2,$acc3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	bl	__ecp_nistz256_div_by_2
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
+
+// void	ecp_nistz256_mul_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_2
+.type	ecp_nistz256_mul_by_2,%function
+.align	4
+ecp_nistz256_mul_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	$acc0,$acc1,[$ap]
+	ldp	$acc2,$acc3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
+
+// void	ecp_nistz256_mul_by_3(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_3
+.type	ecp_nistz256_mul_by_3,%function
+.align	4
+ecp_nistz256_mul_by_3:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	$acc0,$acc1,[$ap]
+	ldp	$acc2,$acc3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	mov	$a0,$acc0
+	mov	$a1,$acc1
+	mov	$a2,$acc2
+	mov	$a3,$acc3
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	mov	$t0,$a0
+	mov	$t1,$a1
+	mov	$t2,$a2
+	mov	$t3,$a3
+
+	bl	__ecp_nistz256_add_to	// ret += a	// 2*a+a=3*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
+
+// void	ecp_nistz256_sub(BN_ULONG x0[4],const BN_ULONG x1[4],
+//				        const BN_ULONG x2[4]);
+.globl	ecp_nistz256_sub
+.type	ecp_nistz256_sub,%function
+.align	4
+ecp_nistz256_sub:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	$acc0,$acc1,[$ap]
+	ldp	$acc2,$acc3,[$ap,#16]
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_sub,.-ecp_nistz256_sub
+
+// void	ecp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_neg
+.type	ecp_nistz256_neg,%function
+.align	4
+ecp_nistz256_neg:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	mov	$bp,$ap
+	mov	$acc0,xzr		// a = 0
+	mov	$acc1,xzr
+	mov	$acc2,xzr
+	mov	$acc3,xzr
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_neg,.-ecp_nistz256_neg
+
+// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded
+// to $a0-$a3 and b[0] - to $bi
+.type	__ecp_nistz256_mul_mont,%function
+.align	4
+__ecp_nistz256_mul_mont:
+	mul	$acc0,$a0,$bi		// a[0]*b[0]
+	umulh	$t0,$a0,$bi
+
+	mul	$acc1,$a1,$bi		// a[1]*b[0]
+	umulh	$t1,$a1,$bi
+
+	mul	$acc2,$a2,$bi		// a[2]*b[0]
+	umulh	$t2,$a2,$bi
+
+	mul	$acc3,$a3,$bi		// a[3]*b[0]
+	umulh	$t3,$a3,$bi
+	ldr	$bi,[$bp,#8]		// b[1]
+
+	adds	$acc1,$acc1,$t0		// accumulate high parts of multiplication
+	 lsl	$t0,$acc0,#32
+	adcs	$acc2,$acc2,$t1
+	 lsr	$t1,$acc0,#32
+	adcs	$acc3,$acc3,$t2
+	adc	$acc4,xzr,$t3
+	mov	$acc5,xzr
+___
+for($i=1;$i<4;$i++) {
+        # Reduction iteration is normally performed by accumulating
+        # result of multiplication of modulus by "magic" digit [and
+        # omitting least significant word, which is guaranteed to
+        # be 0], but thanks to special form of modulus and "magic"
+        # digit being equal to least significant word, it can be
+        # performed with additions and subtractions alone. Indeed:
+        #
+        #            ffff0001.00000000.0000ffff.ffffffff
+        # *                                     abcdefgh
+        # + xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh
+        #
+        # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
+        # rewrite above as:
+        #
+        #   xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh
+        # + abcdefgh.abcdefgh.0000abcd.efgh0000.00000000
+        # - 0000abcd.efgh0000.00000000.00000000.abcdefgh
+        #
+        # or marking redundant operations:
+        #
+        #   xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.--------
+        # + abcdefgh.abcdefgh.0000abcd.efgh0000.--------
+        # - 0000abcd.efgh0000.--------.--------.--------
+
+$code.=<<___;
+	subs	$t2,$acc0,$t0		// "*0xffff0001"
+	sbc	$t3,$acc0,$t1
+	adds	$acc0,$acc1,$t0		// +=acc[0]<<96 and omit acc[0]
+	 mul	$t0,$a0,$bi		// lo(a[0]*b[i])
+	adcs	$acc1,$acc2,$t1
+	 mul	$t1,$a1,$bi		// lo(a[1]*b[i])
+	adcs	$acc2,$acc3,$t2		// +=acc[0]*0xffff0001
+	 mul	$t2,$a2,$bi		// lo(a[2]*b[i])
+	adcs	$acc3,$acc4,$t3
+	 mul	$t3,$a3,$bi		// lo(a[3]*b[i])
+	adc	$acc4,$acc5,xzr
+
+	adds	$acc0,$acc0,$t0		// accumulate low parts of multiplication
+	 umulh	$t0,$a0,$bi		// hi(a[0]*b[i])
+	adcs	$acc1,$acc1,$t1
+	 umulh	$t1,$a1,$bi		// hi(a[1]*b[i])
+	adcs	$acc2,$acc2,$t2
+	 umulh	$t2,$a2,$bi		// hi(a[2]*b[i])
+	adcs	$acc3,$acc3,$t3
+	 umulh	$t3,$a3,$bi		// hi(a[3]*b[i])
+	adc	$acc4,$acc4,xzr
+___
+$code.=<<___	if ($i<3);
+	ldr	$bi,[$bp,#8*($i+1)]	// b[$i+1]
+___
+$code.=<<___;
+	adds	$acc1,$acc1,$t0		// accumulate high parts of multiplication
+	 lsl	$t0,$acc0,#32
+	adcs	$acc2,$acc2,$t1
+	 lsr	$t1,$acc0,#32
+	adcs	$acc3,$acc3,$t2
+	adcs	$acc4,$acc4,$t3
+	adc	$acc5,xzr,xzr
+___
+}
+$code.=<<___;
+	// last reduction
+	subs	$t2,$acc0,$t0		// "*0xffff0001"
+	sbc	$t3,$acc0,$t1
+	adds	$acc0,$acc1,$t0		// +=acc[0]<<96 and omit acc[0]
+	adcs	$acc1,$acc2,$t1
+	adcs	$acc2,$acc3,$t2		// +=acc[0]*0xffff0001
+	adcs	$acc3,$acc4,$t3
+	adc	$acc4,$acc5,xzr
+
+	adds	$t0,$acc0,#1		// subs	$t0,$acc0,#-1 // tmp = ret-modulus
+	sbcs	$t1,$acc1,$poly1
+	sbcs	$t2,$acc2,xzr
+	sbcs	$t3,$acc3,$poly3
+	sbcs	xzr,$acc4,xzr		// did it borrow?
+
+	csel	$acc0,$acc0,$t0,lo	// ret = borrow ? ret : ret-modulus
+	csel	$acc1,$acc1,$t1,lo
+	csel	$acc2,$acc2,$t2,lo
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,lo
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont
+
+// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded
+// to $a0-$a3
+.type	__ecp_nistz256_sqr_mont,%function
+.align	4
+__ecp_nistz256_sqr_mont:
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	$acc1,$a1,$a0		// a[1]*a[0]
+	umulh	$t1,$a1,$a0
+	mul	$acc2,$a2,$a0		// a[2]*a[0]
+	umulh	$t2,$a2,$a0
+	mul	$acc3,$a3,$a0		// a[3]*a[0]
+	umulh	$acc4,$a3,$a0
+
+	adds	$acc2,$acc2,$t1		// accumulate high parts of multiplication
+	 mul	$t0,$a2,$a1		// a[2]*a[1]
+	 umulh	$t1,$a2,$a1
+	adcs	$acc3,$acc3,$t2
+	 mul	$t2,$a3,$a1		// a[3]*a[1]
+	 umulh	$t3,$a3,$a1
+	adc	$acc4,$acc4,xzr		// can't overflow
+
+	mul	$acc5,$a3,$a2		// a[3]*a[2]
+	umulh	$acc6,$a3,$a2
+
+	adds	$t1,$t1,$t2		// accumulate high parts of multiplication
+	 mul	$acc0,$a0,$a0		// a[0]*a[0]
+	adc	$t2,$t3,xzr		// can't overflow
+
+	adds	$acc3,$acc3,$t0		// accumulate low parts of multiplication
+	 umulh	$a0,$a0,$a0
+	adcs	$acc4,$acc4,$t1
+	 mul	$t1,$a1,$a1		// a[1]*a[1]
+	adcs	$acc5,$acc5,$t2
+	 umulh	$a1,$a1,$a1
+	adc	$acc6,$acc6,xzr		// can't overflow
+
+	adds	$acc1,$acc1,$acc1	// acc[1-6]*=2
+	 mul	$t2,$a2,$a2		// a[2]*a[2]
+	adcs	$acc2,$acc2,$acc2
+	 umulh	$a2,$a2,$a2
+	adcs	$acc3,$acc3,$acc3
+	 mul	$t3,$a3,$a3		// a[3]*a[3]
+	adcs	$acc4,$acc4,$acc4
+	 umulh	$a3,$a3,$a3
+	adcs	$acc5,$acc5,$acc5
+	adcs	$acc6,$acc6,$acc6
+	adc	$acc7,xzr,xzr
+
+	adds	$acc1,$acc1,$a0		// +a[i]*a[i]
+	adcs	$acc2,$acc2,$t1
+	adcs	$acc3,$acc3,$a1
+	adcs	$acc4,$acc4,$t2
+	adcs	$acc5,$acc5,$a2
+	 lsl	$t0,$acc0,#32
+	adcs	$acc6,$acc6,$t3
+	 lsr	$t1,$acc0,#32
+	adc	$acc7,$acc7,$a3
+___
+for($i=0;$i<3;$i++) {			# reductions, see commentary in
+					# multiplication for details
+$code.=<<___;
+	subs	$t2,$acc0,$t0		// "*0xffff0001"
+	sbc	$t3,$acc0,$t1
+	adds	$acc0,$acc1,$t0		// +=acc[0]<<96 and omit acc[0]
+	adcs	$acc1,$acc2,$t1
+	 lsl	$t0,$acc0,#32
+	adcs	$acc2,$acc3,$t2		// +=acc[0]*0xffff0001
+	 lsr	$t1,$acc0,#32
+	adc	$acc3,$t3,xzr		// can't overflow
+___
+}
+$code.=<<___;
+	subs	$t2,$acc0,$t0		// "*0xffff0001"
+	sbc	$t3,$acc0,$t1
+	adds	$acc0,$acc1,$t0		// +=acc[0]<<96 and omit acc[0]
+	adcs	$acc1,$acc2,$t1
+	adcs	$acc2,$acc3,$t2		// +=acc[0]*0xffff0001
+	adc	$acc3,$t3,xzr		// can't overflow
+
+	adds	$acc0,$acc0,$acc4	// accumulate upper half
+	adcs	$acc1,$acc1,$acc5
+	adcs	$acc2,$acc2,$acc6
+	adcs	$acc3,$acc3,$acc7
+	adc	$acc4,xzr,xzr
+
+	adds	$t0,$acc0,#1		// subs	$t0,$acc0,#-1 // tmp = ret-modulus
+	sbcs	$t1,$acc1,$poly1
+	sbcs	$t2,$acc2,xzr
+	sbcs	$t3,$acc3,$poly3
+	sbcs	xzr,$acc4,xzr		// did it borrow?
+
+	csel	$acc0,$acc0,$t0,lo	// ret = borrow ? ret : ret-modulus
+	csel	$acc1,$acc1,$t1,lo
+	csel	$acc2,$acc2,$t2,lo
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,lo
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont
+
+// Note that __ecp_nistz256_add_to expects both input vectors pre-loaded to
+// $a0-$a3 and $t0-$t3. This is done because it's used in multiple
+// contexts, e.g. in multiplication by 2 and 3...
+.type	__ecp_nistz256_add_to,%function
+.align	4
+__ecp_nistz256_add_to:
+	adds	$acc0,$acc0,$t0		// ret = a+b
+	adcs	$acc1,$acc1,$t1
+	adcs	$acc2,$acc2,$t2
+	adcs	$acc3,$acc3,$t3
+	adc	$ap,xzr,xzr		// zap $ap
+
+	adds	$t0,$acc0,#1		// subs	$t0,$a0,#-1 // tmp = ret-modulus
+	sbcs	$t1,$acc1,$poly1
+	sbcs	$t2,$acc2,xzr
+	sbcs	$t3,$acc3,$poly3
+	sbcs	xzr,$ap,xzr		// did subtraction borrow?
+
+	csel	$acc0,$acc0,$t0,lo	// ret = borrow ? ret : ret-modulus
+	csel	$acc1,$acc1,$t1,lo
+	csel	$acc2,$acc2,$t2,lo
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,lo
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_add_to,.-__ecp_nistz256_add_to
+
+.type	__ecp_nistz256_sub_from,%function
+.align	4
+__ecp_nistz256_sub_from:
+	ldp	$t0,$t1,[$bp]
+	ldp	$t2,$t3,[$bp,#16]
+	subs	$acc0,$acc0,$t0		// ret = a-b
+	sbcs	$acc1,$acc1,$t1
+	sbcs	$acc2,$acc2,$t2
+	sbcs	$acc3,$acc3,$t3
+	sbc	$ap,xzr,xzr		// zap $ap
+
+	subs	$t0,$acc0,#1		// adds	$t0,$a0,#-1 // tmp = ret+modulus
+	adcs	$t1,$acc1,$poly1
+	adcs	$t2,$acc2,xzr
+	adc	$t3,$acc3,$poly3
+	cmp	$ap,xzr			// did subtraction borrow?
+
+	csel	$acc0,$acc0,$t0,eq	// ret = borrow ? ret+modulus : ret
+	csel	$acc1,$acc1,$t1,eq
+	csel	$acc2,$acc2,$t2,eq
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,eq
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from
+
+.type	__ecp_nistz256_sub_morf,%function
+.align	4
+__ecp_nistz256_sub_morf:
+	ldp	$t0,$t1,[$bp]
+	ldp	$t2,$t3,[$bp,#16]
+	subs	$acc0,$t0,$acc0		// ret = b-a
+	sbcs	$acc1,$t1,$acc1
+	sbcs	$acc2,$t2,$acc2
+	sbcs	$acc3,$t3,$acc3
+	sbc	$ap,xzr,xzr		// zap $ap
+
+	subs	$t0,$acc0,#1		// adds	$t0,$a0,#-1 // tmp = ret+modulus
+	adcs	$t1,$acc1,$poly1
+	adcs	$t2,$acc2,xzr
+	adc	$t3,$acc3,$poly3
+	cmp	$ap,xzr			// did subtraction borrow?
+
+	csel	$acc0,$acc0,$t0,eq	// ret = borrow ? ret+modulus : ret
+	csel	$acc1,$acc1,$t1,eq
+	csel	$acc2,$acc2,$t2,eq
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,eq
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf
+
+.type	__ecp_nistz256_div_by_2,%function
+.align	4
+__ecp_nistz256_div_by_2:
+	subs	$t0,$acc0,#1		// adds	$t0,$a0,#-1 // tmp = a+modulus
+	adcs	$t1,$acc1,$poly1
+	adcs	$t2,$acc2,xzr
+	adcs	$t3,$acc3,$poly3
+	adc	$ap,xzr,xzr		// zap $ap
+	tst	$acc0,#1		// is a even?
+
+	csel	$acc0,$acc0,$t0,eq	// ret = even ? a : a+modulus
+	csel	$acc1,$acc1,$t1,eq
+	csel	$acc2,$acc2,$t2,eq
+	csel	$acc3,$acc3,$t3,eq
+	csel	$ap,xzr,$ap,eq
+
+	lsr	$acc0,$acc0,#1		// ret >>= 1
+	orr	$acc0,$acc0,$acc1,lsl#63
+	lsr	$acc1,$acc1,#1
+	orr	$acc1,$acc1,$acc2,lsl#63
+	lsr	$acc2,$acc2,#1
+	orr	$acc2,$acc2,$acc3,lsl#63
+	lsr	$acc3,$acc3,#1
+	stp	$acc0,$acc1,[$rp]
+	orr	$acc3,$acc3,$ap,lsl#63
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ret
+.size	__ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2
+___
+########################################################################
+# following subroutines are "literal" implementation of those found in
+# ecp_nistz256.c
+#
+########################################################################
+# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp);
+#
+{
+my ($S,$M,$Zsqr,$tmp0)=map(32*$_,(0..3));
+# above map() describes stack layout with 4 temporary
+# 256-bit vectors on top.
+my ($rp_real,$ap_real) = map("x$_",(21,22));
+
+$code.=<<___;
+.globl	ecp_nistz256_point_double
+.type	ecp_nistz256_point_double,%function
+.align	5
+ecp_nistz256_point_double:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	sub	sp,sp,#32*4
+
+.Ldouble_shortcut:
+	ldp	$acc0,$acc1,[$ap,#32]
+	 mov	$rp_real,$rp
+	ldp	$acc2,$acc3,[$ap,#48]
+	 mov	$ap_real,$ap
+	 ldr	$poly1,.Lpoly+8
+	mov	$t0,$acc0
+	 ldr	$poly3,.Lpoly+24
+	mov	$t1,$acc1
+	 ldp	$a0,$a1,[$ap_real,#64]	// forward load for p256_sqr_mont
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	 ldp	$a2,$a3,[$ap_real,#64+16]
+	add	$rp,sp,#$S
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(S, in_y);
+
+	add	$rp,sp,#$Zsqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Zsqr, in_z);
+
+	ldp	$t0,$t1,[$ap_real]
+	ldp	$t2,$t3,[$ap_real,#16]
+	mov	$a0,$acc0		// put Zsqr aside for p256_sub
+	mov	$a1,$acc1
+	mov	$a2,$acc2
+	mov	$a3,$acc3
+	add	$rp,sp,#$M
+	bl	__ecp_nistz256_add_to	// p256_add(M, Zsqr, in_x);
+
+	add	$bp,$ap_real,#0
+	mov	$acc0,$a0		// restore Zsqr
+	mov	$acc1,$a1
+	 ldp	$a0,$a1,[sp,#$S]	// forward load for p256_sqr_mont
+	mov	$acc2,$a2
+	mov	$acc3,$a3
+	 ldp	$a2,$a3,[sp,#$S+16]
+	add	$rp,sp,#$Zsqr
+	bl	__ecp_nistz256_sub_morf	// p256_sub(Zsqr, in_x, Zsqr);
+
+	add	$rp,sp,#$S
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(S, S);
+
+	ldr	$bi,[$ap_real,#32]
+	ldp	$a0,$a1,[$ap_real,#64]
+	ldp	$a2,$a3,[$ap_real,#64+16]
+	add	$bp,$ap_real,#32
+	add	$rp,sp,#$tmp0
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(tmp0, in_z, in_y);
+
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	 ldp	$a0,$a1,[sp,#$S]	// forward load for p256_sqr_mont
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	 ldp	$a2,$a3,[sp,#$S+16]
+	add	$rp,$rp_real,#64
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(res_z, tmp0);
+
+	add	$rp,sp,#$tmp0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(tmp0, S);
+
+	 ldr	$bi,[sp,#$Zsqr]		// forward load for p256_mul_mont
+	 ldp	$a0,$a1,[sp,#$M]
+	 ldp	$a2,$a3,[sp,#$M+16]
+	add	$rp,$rp_real,#32
+	bl	__ecp_nistz256_div_by_2	// p256_div_by_2(res_y, tmp0);
+
+	add	$bp,sp,#$Zsqr
+	add	$rp,sp,#$M
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(M, M, Zsqr);
+
+	mov	$t0,$acc0		// duplicate M
+	mov	$t1,$acc1
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	mov	$a0,$acc0		// put M aside
+	mov	$a1,$acc1
+	mov	$a2,$acc2
+	mov	$a3,$acc3
+	add	$rp,sp,#$M
+	bl	__ecp_nistz256_add_to
+	mov	$t0,$a0			// restore M
+	mov	$t1,$a1
+	 ldr	$bi,[$ap_real]		// forward load for p256_mul_mont
+	mov	$t2,$a2
+	 ldp	$a0,$a1,[sp,#$S]
+	mov	$t3,$a3
+	 ldp	$a2,$a3,[sp,#$S+16]
+	bl	__ecp_nistz256_add_to	// p256_mul_by_3(M, M);
+
+	add	$bp,$ap_real,#0
+	add	$rp,sp,#$S
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, in_x);
+
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	 ldp	$a0,$a1,[sp,#$M]	// forward load for p256_sqr_mont
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	 ldp	$a2,$a3,[sp,#$M+16]
+	add	$rp,sp,#$tmp0
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(tmp0, S);
+
+	add	$rp,$rp_real,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(res_x, M);
+
+	add	$bp,sp,#$tmp0
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_x, res_x, tmp0);
+
+	add	$bp,sp,#$S
+	add	$rp,sp,#$S
+	bl	__ecp_nistz256_sub_morf	// p256_sub(S, S, res_x);
+
+	ldr	$bi,[sp,#$M]
+	mov	$a0,$acc0		// copy S
+	mov	$a1,$acc1
+	mov	$a2,$acc2
+	mov	$a3,$acc3
+	add	$bp,sp,#$M
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, M);
+
+	add	$bp,$rp_real,#32
+	add	$rp,$rp_real,#32
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, S, res_y);
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_double,.-ecp_nistz256_point_double
+___
+}
+
+########################################################################
+# void ecp_nistz256_point_add(P256_POINT *out,const P256_POINT *in1,
+#			      const P256_POINT *in2);
+{
+my ($res_x,$res_y,$res_z,
+    $H,$Hsqr,$R,$Rsqr,$Hcub,
+    $U1,$U2,$S1,$S2)=map(32*$_,(0..11));
+my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
+# above map() describes stack layout with 12 temporary
+# 256-bit vectors on top.
+my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp0,$temp1,$temp2)=map("x$_",(21..28));
+
+$code.=<<___;
+.globl	ecp_nistz256_point_add
+.type	ecp_nistz256_point_add,%function
+.align	5
+ecp_nistz256_point_add:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	sub	sp,sp,#32*12
+
+	ldp	$a0,$a1,[$bp,#64]	// in2_z
+	ldp	$a2,$a3,[$bp,#64+16]
+	 mov	$rp_real,$rp
+	 mov	$ap_real,$ap
+	 mov	$bp_real,$bp
+	 ldr	$poly1,.Lpoly+8
+	 ldr	$poly3,.Lpoly+24
+	orr	$t0,$a0,$a1
+	orr	$t2,$a2,$a3
+	orr	$in2infty,$t0,$t2
+	cmp	$in2infty,#0
+	csetm	$in2infty,ne		// ~in2infty
+	add	$rp,sp,#$Z2sqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z2sqr, in2_z);
+
+	ldp	$a0,$a1,[$ap_real,#64]	// in1_z
+	ldp	$a2,$a3,[$ap_real,#64+16]
+	orr	$t0,$a0,$a1
+	orr	$t2,$a2,$a3
+	orr	$in1infty,$t0,$t2
+	cmp	$in1infty,#0
+	csetm	$in1infty,ne		// ~in1infty
+	add	$rp,sp,#$Z1sqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	ldr	$bi,[$bp_real,#64]
+	ldp	$a0,$a1,[sp,#$Z2sqr]
+	ldp	$a2,$a3,[sp,#$Z2sqr+16]
+	add	$bp,$bp_real,#64
+	add	$rp,sp,#$S1
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, Z2sqr, in2_z);
+
+	ldr	$bi,[$ap_real,#64]
+	ldp	$a0,$a1,[sp,#$Z1sqr]
+	ldp	$a2,$a3,[sp,#$Z1sqr+16]
+	add	$bp,$ap_real,#64
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	$bi,[$ap_real,#32]
+	ldp	$a0,$a1,[sp,#$S1]
+	ldp	$a2,$a3,[sp,#$S1+16]
+	add	$bp,$ap_real,#32
+	add	$rp,sp,#$S1
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, S1, in1_y);
+
+	ldr	$bi,[$bp_real,#32]
+	ldp	$a0,$a1,[sp,#$S2]
+	ldp	$a2,$a3,[sp,#$S2+16]
+	add	$bp,$bp_real,#32
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	$bp,sp,#$S1
+	 ldr	$bi,[sp,#$Z2sqr]	// forward load for p256_mul_mont
+	 ldp	$a0,$a1,[$ap_real]
+	 ldp	$a2,$a3,[$ap_real,#16]
+	add	$rp,sp,#$R
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, S1);
+
+	orr	$acc0,$acc0,$acc1	// see if result is zero
+	orr	$acc2,$acc2,$acc3
+	orr	$temp0,$acc0,$acc2	// ~is_equal(S1,S2)
+
+	add	$bp,sp,#$Z2sqr
+	add	$rp,sp,#$U1
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U1, in1_x, Z2sqr);
+
+	ldr	$bi,[sp,#$Z1sqr]
+	ldp	$a0,$a1,[$bp_real]
+	ldp	$a2,$a3,[$bp_real,#16]
+	add	$bp,sp,#$Z1sqr
+	add	$rp,sp,#$U2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in2_x, Z1sqr);
+
+	add	$bp,sp,#$U1
+	 ldp	$a0,$a1,[sp,#$R]	// forward load for p256_sqr_mont
+	 ldp	$a2,$a3,[sp,#$R+16]
+	add	$rp,sp,#$H
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, U1);
+
+	orr	$acc0,$acc0,$acc1	// see if result is zero
+	orr	$acc2,$acc2,$acc3
+	orr	$acc0,$acc0,$acc2	// ~is_equal(U1,U2)
+
+	mvn	$temp1,$in1infty	// -1/0 -> 0/-1
+	mvn	$temp2,$in2infty	// -1/0 -> 0/-1
+	orr	$acc0,$acc0,$temp1
+	orr	$acc0,$acc0,$temp2
+	orr	$acc0,$acc0,$temp0
+	cbnz	$acc0,.Ladd_proceed	// if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2))
+
+.Ladd_double:
+	mov	$ap,$ap_real
+	mov	$rp,$rp_real
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	add	sp,sp,#256	// #256 is from #32*(12-4). difference in stack frames
+	b	.Ldouble_shortcut
+
+.align	4
+.Ladd_proceed:
+	add	$rp,sp,#$Rsqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	$bi,[$ap_real,#64]
+	ldp	$a0,$a1,[sp,#$H]
+	ldp	$a2,$a3,[sp,#$H+16]
+	add	$bp,$ap_real,#64
+	add	$rp,sp,#$res_z
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldp	$a0,$a1,[sp,#$H]
+	ldp	$a2,$a3,[sp,#$H+16]
+	add	$rp,sp,#$Hsqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldr	$bi,[$bp_real,#64]
+	ldp	$a0,$a1,[sp,#$res_z]
+	ldp	$a2,$a3,[sp,#$res_z+16]
+	add	$bp,$bp_real,#64
+	add	$rp,sp,#$res_z
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, res_z, in2_z);
+
+	ldr	$bi,[sp,#$H]
+	ldp	$a0,$a1,[sp,#$Hsqr]
+	ldp	$a2,$a3,[sp,#$Hsqr+16]
+	add	$bp,sp,#$H
+	add	$rp,sp,#$Hcub
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	$bi,[sp,#$Hsqr]
+	ldp	$a0,$a1,[sp,#$U1]
+	ldp	$a2,$a3,[sp,#$U1+16]
+	add	$bp,sp,#$Hsqr
+	add	$rp,sp,#$U2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, U1, Hsqr);
+
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	add	$rp,sp,#$Hsqr
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	$bp,sp,#$Rsqr
+	add	$rp,sp,#$res_x
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	$bp,sp,#$Hcub
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	$bp,sp,#$U2
+	 ldr	$bi,[sp,#$Hcub]		// forward load for p256_mul_mont
+	 ldp	$a0,$a1,[sp,#$S1]
+	 ldp	$a2,$a3,[sp,#$S1+16]
+	add	$rp,sp,#$res_y
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	$bp,sp,#$Hcub
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S1, Hcub);
+
+	ldr	$bi,[sp,#$R]
+	ldp	$a0,$a1,[sp,#$res_y]
+	ldp	$a2,$a3,[sp,#$res_y+16]
+	add	$bp,sp,#$R
+	add	$rp,sp,#$res_y
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	$bp,sp,#$S2
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	$a0,$a1,[sp,#$res_x]		// res
+	ldp	$a2,$a3,[sp,#$res_x+16]
+	ldp	$t0,$t1,[$bp_real]		// in2
+	ldp	$t2,$t3,[$bp_real,#16]
+___
+for($i=0;$i<64;$i+=32) {		# conditional moves
+$code.=<<___;
+	ldp	$acc0,$acc1,[$ap_real,#$i]	// in1
+	cmp	$in1infty,#0			// ~$in1intfy, remember?
+	ldp	$acc2,$acc3,[$ap_real,#$i+16]
+	csel	$t0,$a0,$t0,ne
+	csel	$t1,$a1,$t1,ne
+	ldp	$a0,$a1,[sp,#$res_x+$i+32]	// res
+	csel	$t2,$a2,$t2,ne
+	csel	$t3,$a3,$t3,ne
+	cmp	$in2infty,#0			// ~$in2intfy, remember?
+	ldp	$a2,$a3,[sp,#$res_x+$i+48]
+	csel	$acc0,$t0,$acc0,ne
+	csel	$acc1,$t1,$acc1,ne
+	ldp	$t0,$t1,[$bp_real,#$i+32]	// in2
+	csel	$acc2,$t2,$acc2,ne
+	csel	$acc3,$t3,$acc3,ne
+	ldp	$t2,$t3,[$bp_real,#$i+48]
+	stp	$acc0,$acc1,[$rp_real,#$i]
+	stp	$acc2,$acc3,[$rp_real,#$i+16]
+___
+}
+$code.=<<___;
+	ldp	$acc0,$acc1,[$ap_real,#$i]	// in1
+	cmp	$in1infty,#0			// ~$in1intfy, remember?
+	ldp	$acc2,$acc3,[$ap_real,#$i+16]
+	csel	$t0,$a0,$t0,ne
+	csel	$t1,$a1,$t1,ne
+	csel	$t2,$a2,$t2,ne
+	csel	$t3,$a3,$t3,ne
+	cmp	$in2infty,#0			// ~$in2intfy, remember?
+	csel	$acc0,$t0,$acc0,ne
+	csel	$acc1,$t1,$acc1,ne
+	csel	$acc2,$t2,$acc2,ne
+	csel	$acc3,$t3,$acc3,ne
+	stp	$acc0,$acc1,[$rp_real,#$i]
+	stp	$acc2,$acc3,[$rp_real,#$i+16]
+
+.Ladd_done:
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_add,.-ecp_nistz256_point_add
+___
+}
+
+########################################################################
+# void ecp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1,
+#				     const P256_POINT_AFFINE *in2);
+{
+my ($res_x,$res_y,$res_z,
+    $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..9));
+my $Z1sqr = $S2;
+# above map() describes stack layout with 10 temporary
+# 256-bit vectors on top.
+my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp)=map("x$_",(21..26));
+
+$code.=<<___;
+.globl	ecp_nistz256_point_add_affine
+.type	ecp_nistz256_point_add_affine,%function
+.align	5
+ecp_nistz256_point_add_affine:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-80]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	sub	sp,sp,#32*10
+
+	mov	$rp_real,$rp
+	mov	$ap_real,$ap
+	mov	$bp_real,$bp
+	ldr	$poly1,.Lpoly+8
+	ldr	$poly3,.Lpoly+24
+
+	ldp	$a0,$a1,[$ap,#64]	// in1_z
+	ldp	$a2,$a3,[$ap,#64+16]
+	orr	$t0,$a0,$a1
+	orr	$t2,$a2,$a3
+	orr	$in1infty,$t0,$t2
+	cmp	$in1infty,#0
+	csetm	$in1infty,ne		// ~in1infty
+
+	ldp	$acc0,$acc1,[$bp]	// in2_x
+	ldp	$acc2,$acc3,[$bp,#16]
+	ldp	$t0,$t1,[$bp,#32]	// in2_y
+	ldp	$t2,$t3,[$bp,#48]
+	orr	$acc0,$acc0,$acc1
+	orr	$acc2,$acc2,$acc3
+	orr	$t0,$t0,$t1
+	orr	$t2,$t2,$t3
+	orr	$acc0,$acc0,$acc2
+	orr	$t0,$t0,$t2
+	orr	$in2infty,$acc0,$t0
+	cmp	$in2infty,#0
+	csetm	$in2infty,ne		// ~in2infty
+
+	add	$rp,sp,#$Z1sqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	mov	$a0,$acc0
+	mov	$a1,$acc1
+	mov	$a2,$acc2
+	mov	$a3,$acc3
+	ldr	$bi,[$bp_real]
+	add	$bp,$bp_real,#0
+	add	$rp,sp,#$U2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, Z1sqr, in2_x);
+
+	add	$bp,$ap_real,#0
+	 ldr	$bi,[$ap_real,#64]	// forward load for p256_mul_mont
+	 ldp	$a0,$a1,[sp,#$Z1sqr]
+	 ldp	$a2,$a3,[sp,#$Z1sqr+16]
+	add	$rp,sp,#$H
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, in1_x);
+
+	add	$bp,$ap_real,#64
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	$bi,[$ap_real,#64]
+	ldp	$a0,$a1,[sp,#$H]
+	ldp	$a2,$a3,[sp,#$H+16]
+	add	$bp,$ap_real,#64
+	add	$rp,sp,#$res_z
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldr	$bi,[$bp_real,#32]
+	ldp	$a0,$a1,[sp,#$S2]
+	ldp	$a2,$a3,[sp,#$S2+16]
+	add	$bp,$bp_real,#32
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	$bp,$ap_real,#32
+	 ldp	$a0,$a1,[sp,#$H]	// forward load for p256_sqr_mont
+	 ldp	$a2,$a3,[sp,#$H+16]
+	add	$rp,sp,#$R
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, in1_y);
+
+	add	$rp,sp,#$Hsqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldp	$a0,$a1,[sp,#$R]
+	ldp	$a2,$a3,[sp,#$R+16]
+	add	$rp,sp,#$Rsqr
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	$bi,[sp,#$H]
+	ldp	$a0,$a1,[sp,#$Hsqr]
+	ldp	$a2,$a3,[sp,#$Hsqr+16]
+	add	$bp,sp,#$H
+	add	$rp,sp,#$Hcub
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	$bi,[$ap_real]
+	ldp	$a0,$a1,[sp,#$Hsqr]
+	ldp	$a2,$a3,[sp,#$Hsqr+16]
+	add	$bp,$ap_real,#0
+	add	$rp,sp,#$U2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in1_x, Hsqr);
+
+	mov	$t0,$acc0
+	mov	$t1,$acc1
+	mov	$t2,$acc2
+	mov	$t3,$acc3
+	add	$rp,sp,#$Hsqr
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	$bp,sp,#$Rsqr
+	add	$rp,sp,#$res_x
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	$bp,sp,#$Hcub
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	$bp,sp,#$U2
+	 ldr	$bi,[$ap_real,#32]	// forward load for p256_mul_mont
+	 ldp	$a0,$a1,[sp,#$Hcub]
+	 ldp	$a2,$a3,[sp,#$Hcub+16]
+	add	$rp,sp,#$res_y
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	$bp,$ap_real,#32
+	add	$rp,sp,#$S2
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, in1_y, Hcub);
+
+	ldr	$bi,[sp,#$R]
+	ldp	$a0,$a1,[sp,#$res_y]
+	ldp	$a2,$a3,[sp,#$res_y+16]
+	add	$bp,sp,#$R
+	add	$rp,sp,#$res_y
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	$bp,sp,#$S2
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	$a0,$a1,[sp,#$res_x]		// res
+	ldp	$a2,$a3,[sp,#$res_x+16]
+	ldp	$t0,$t1,[$bp_real]		// in2
+	ldp	$t2,$t3,[$bp_real,#16]
+___
+for($i=0;$i<64;$i+=32) {		# conditional moves
+$code.=<<___;
+	ldp	$acc0,$acc1,[$ap_real,#$i]	// in1
+	cmp	$in1infty,#0			// ~$in1intfy, remember?
+	ldp	$acc2,$acc3,[$ap_real,#$i+16]
+	csel	$t0,$a0,$t0,ne
+	csel	$t1,$a1,$t1,ne
+	ldp	$a0,$a1,[sp,#$res_x+$i+32]	// res
+	csel	$t2,$a2,$t2,ne
+	csel	$t3,$a3,$t3,ne
+	cmp	$in2infty,#0			// ~$in2intfy, remember?
+	ldp	$a2,$a3,[sp,#$res_x+$i+48]
+	csel	$acc0,$t0,$acc0,ne
+	csel	$acc1,$t1,$acc1,ne
+	ldp	$t0,$t1,[$bp_real,#$i+32]	// in2
+	csel	$acc2,$t2,$acc2,ne
+	csel	$acc3,$t3,$acc3,ne
+	ldp	$t2,$t3,[$bp_real,#$i+48]
+	stp	$acc0,$acc1,[$rp_real,#$i]
+	stp	$acc2,$acc3,[$rp_real,#$i+16]
+___
+$code.=<<___	if ($i == 0);
+	adr	$bp_real,.Lone_mont-64
+___
+}
+$code.=<<___;
+	ldp	$acc0,$acc1,[$ap_real,#$i]	// in1
+	cmp	$in1infty,#0			// ~$in1intfy, remember?
+	ldp	$acc2,$acc3,[$ap_real,#$i+16]
+	csel	$t0,$a0,$t0,ne
+	csel	$t1,$a1,$t1,ne
+	csel	$t2,$a2,$t2,ne
+	csel	$t3,$a3,$t3,ne
+	cmp	$in2infty,#0			// ~$in2intfy, remember?
+	csel	$acc0,$t0,$acc0,ne
+	csel	$acc1,$t1,$acc1,ne
+	csel	$acc2,$t2,$acc2,ne
+	csel	$acc3,$t3,$acc3,ne
+	stp	$acc0,$acc1,[$rp_real,#$i]
+	stp	$acc2,$acc3,[$rp_real,#$i+16]
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x29,x30,[sp],#80
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+.size	ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
+___
+}
+if (1) {
+my ($ord0,$ord1) = ($poly1,$poly3);
+my ($ord2,$ord3,$ordk,$t4) = map("x$_",(21..24));
+my $acc7 = $bi;
+
+$code.=<<___;
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_mul_mont(uint64_t res[4], uint64_t a[4],
+//                                uint64_t b[4]);
+.globl	ecp_nistz256_ord_mul_mont
+.type	ecp_nistz256_ord_mul_mont,%function
+.align	4
+ecp_nistz256_ord_mul_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	$ordk,.Lord
+	ldr	$bi,[$bp]		// bp[0]
+	ldp	$a0,$a1,[$ap]
+	ldp	$a2,$a3,[$ap,#16]
+
+	ldp	$ord0,$ord1,[$ordk,#0]
+	ldp	$ord2,$ord3,[$ordk,#16]
+	ldr	$ordk,[$ordk,#32]
+
+	mul	$acc0,$a0,$bi		// a[0]*b[0]
+	umulh	$t0,$a0,$bi
+
+	mul	$acc1,$a1,$bi		// a[1]*b[0]
+	umulh	$t1,$a1,$bi
+
+	mul	$acc2,$a2,$bi		// a[2]*b[0]
+	umulh	$t2,$a2,$bi
+
+	mul	$acc3,$a3,$bi		// a[3]*b[0]
+	umulh	$acc4,$a3,$bi
+
+	mul	$t4,$acc0,$ordk
+
+	adds	$acc1,$acc1,$t0		// accumulate high parts of multiplication
+	adcs	$acc2,$acc2,$t1
+	adcs	$acc3,$acc3,$t2
+	adc	$acc4,$acc4,xzr
+	mov	$acc5,xzr
+___
+for ($i=1;$i<4;$i++) {
+	################################################################
+	#            ffff0000.ffffffff.yyyyyyyy.zzzzzzzz
+	# *                                     abcdefgh
+	# + xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
+	#
+	# Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we
+	# rewrite above as:
+	#
+	#   xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
+	# - 0000abcd.efgh0000.abcdefgh.00000000.00000000
+	# + abcdefgh.abcdefgh.yzayzbyz.cyzdyzey.zfyzgyzh
+$code.=<<___;
+	ldr	$bi,[$bp,#8*$i]		// b[i]
+
+	lsl	$t0,$t4,#32
+	subs	$acc2,$acc2,$t4
+	lsr	$t1,$t4,#32
+	sbcs	$acc3,$acc3,$t0
+	sbcs	$acc4,$acc4,$t1
+	sbc	$acc5,$acc5,xzr
+
+	subs	xzr,$acc0,#1
+	umulh	$t1,$ord0,$t4
+	mul	$t2,$ord1,$t4
+	umulh	$t3,$ord1,$t4
+
+	adcs	$t2,$t2,$t1
+	 mul	$t0,$a0,$bi
+	adc	$t3,$t3,xzr
+	 mul	$t1,$a1,$bi
+
+	adds	$acc0,$acc1,$t2
+	 mul	$t2,$a2,$bi
+	adcs	$acc1,$acc2,$t3
+	 mul	$t3,$a3,$bi
+	adcs	$acc2,$acc3,$t4
+	adcs	$acc3,$acc4,$t4
+	adc	$acc4,$acc5,xzr
+
+	adds	$acc0,$acc0,$t0		// accumulate low parts
+	umulh	$t0,$a0,$bi
+	adcs	$acc1,$acc1,$t1
+	umulh	$t1,$a1,$bi
+	adcs	$acc2,$acc2,$t2
+	umulh	$t2,$a2,$bi
+	adcs	$acc3,$acc3,$t3
+	umulh	$t3,$a3,$bi
+	adc	$acc4,$acc4,xzr
+	mul	$t4,$acc0,$ordk
+	adds	$acc1,$acc1,$t0		// accumulate high parts
+	adcs	$acc2,$acc2,$t1
+	adcs	$acc3,$acc3,$t2
+	adcs	$acc4,$acc4,$t3
+	adc	$acc5,xzr,xzr
+___
+}
+$code.=<<___;
+	lsl	$t0,$t4,#32		// last reduction
+	subs	$acc2,$acc2,$t4
+	lsr	$t1,$t4,#32
+	sbcs	$acc3,$acc3,$t0
+	sbcs	$acc4,$acc4,$t1
+	sbc	$acc5,$acc5,xzr
+
+	subs	xzr,$acc0,#1
+	umulh	$t1,$ord0,$t4
+	mul	$t2,$ord1,$t4
+	umulh	$t3,$ord1,$t4
+
+	adcs	$t2,$t2,$t1
+	adc	$t3,$t3,xzr
+
+	adds	$acc0,$acc1,$t2
+	adcs	$acc1,$acc2,$t3
+	adcs	$acc2,$acc3,$t4
+	adcs	$acc3,$acc4,$t4
+	adc	$acc4,$acc5,xzr
+
+	subs	$t0,$acc0,$ord0		// ret -= modulus
+	sbcs	$t1,$acc1,$ord1
+	sbcs	$t2,$acc2,$ord2
+	sbcs	$t3,$acc3,$ord3
+	sbcs	xzr,$acc4,xzr
+
+	csel	$acc0,$acc0,$t0,lo	// ret = borrow ? ret : ret-modulus
+	csel	$acc1,$acc1,$t1,lo
+	csel	$acc2,$acc2,$t2,lo
+	stp	$acc0,$acc1,[$rp]
+	csel	$acc3,$acc3,$t3,lo
+	stp	$acc2,$acc3,[$rp,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+.size	ecp_nistz256_ord_mul_mont,.-ecp_nistz256_ord_mul_mont
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
+//                                int rep);
+.globl	ecp_nistz256_ord_sqr_mont
+.type	ecp_nistz256_ord_sqr_mont,%function
+.align	4
+ecp_nistz256_ord_sqr_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	$ordk,.Lord
+	ldp	$a0,$a1,[$ap]
+	ldp	$a2,$a3,[$ap,#16]
+
+	ldp	$ord0,$ord1,[$ordk,#0]
+	ldp	$ord2,$ord3,[$ordk,#16]
+	ldr	$ordk,[$ordk,#32]
+	b	.Loop_ord_sqr
+
+.align	4
+.Loop_ord_sqr:
+	sub	$bp,$bp,#1
+	////////////////////////////////////////////////////////////////
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	$acc1,$a1,$a0		// a[1]*a[0]
+	umulh	$t1,$a1,$a0
+	mul	$acc2,$a2,$a0		// a[2]*a[0]
+	umulh	$t2,$a2,$a0
+	mul	$acc3,$a3,$a0		// a[3]*a[0]
+	umulh	$acc4,$a3,$a0
+
+	adds	$acc2,$acc2,$t1		// accumulate high parts of multiplication
+	 mul	$t0,$a2,$a1		// a[2]*a[1]
+	 umulh	$t1,$a2,$a1
+	adcs	$acc3,$acc3,$t2
+	 mul	$t2,$a3,$a1		// a[3]*a[1]
+	 umulh	$t3,$a3,$a1
+	adc	$acc4,$acc4,xzr		// can't overflow
+
+	mul	$acc5,$a3,$a2		// a[3]*a[2]
+	umulh	$acc6,$a3,$a2
+
+	adds	$t1,$t1,$t2		// accumulate high parts of multiplication
+	 mul	$acc0,$a0,$a0		// a[0]*a[0]
+	adc	$t2,$t3,xzr		// can't overflow
+
+	adds	$acc3,$acc3,$t0		// accumulate low parts of multiplication
+	 umulh	$a0,$a0,$a0
+	adcs	$acc4,$acc4,$t1
+	 mul	$t1,$a1,$a1		// a[1]*a[1]
+	adcs	$acc5,$acc5,$t2
+	 umulh	$a1,$a1,$a1
+	adc	$acc6,$acc6,xzr		// can't overflow
+
+	adds	$acc1,$acc1,$acc1	// acc[1-6]*=2
+	 mul	$t2,$a2,$a2		// a[2]*a[2]
+	adcs	$acc2,$acc2,$acc2
+	 umulh	$a2,$a2,$a2
+	adcs	$acc3,$acc3,$acc3
+	 mul	$t3,$a3,$a3		// a[3]*a[3]
+	adcs	$acc4,$acc4,$acc4
+	 umulh	$a3,$a3,$a3
+	adcs	$acc5,$acc5,$acc5
+	adcs	$acc6,$acc6,$acc6
+	adc	$acc7,xzr,xzr
+
+	adds	$acc1,$acc1,$a0		// +a[i]*a[i]
+	 mul	$t4,$acc0,$ordk
+	adcs	$acc2,$acc2,$t1
+	adcs	$acc3,$acc3,$a1
+	adcs	$acc4,$acc4,$t2
+	adcs	$acc5,$acc5,$a2
+	adcs	$acc6,$acc6,$t3
+	adc	$acc7,$acc7,$a3
+___
+for($i=0; $i<4; $i++) {			# reductions
+$code.=<<___;
+	subs	xzr,$acc0,#1
+	umulh	$t1,$ord0,$t4
+	mul	$t2,$ord1,$t4
+	umulh	$t3,$ord1,$t4
+
+	adcs	$t2,$t2,$t1
+	adc	$t3,$t3,xzr
+
+	adds	$acc0,$acc1,$t2
+	adcs	$acc1,$acc2,$t3
+	adcs	$acc2,$acc3,$t4
+	adc	$acc3,xzr,$t4		// can't overflow
+___
+$code.=<<___	if ($i<3);
+	mul	$t3,$acc0,$ordk
+___
+$code.=<<___;
+	lsl	$t0,$t4,#32
+	subs	$acc1,$acc1,$t4
+	lsr	$t1,$t4,#32
+	sbcs	$acc2,$acc2,$t0
+	sbc	$acc3,$acc3,$t1		// can't borrow
+___
+	($t3,$t4) = ($t4,$t3);
+}
+$code.=<<___;
+	adds	$acc0,$acc0,$acc4	// accumulate upper half
+	adcs	$acc1,$acc1,$acc5
+	adcs	$acc2,$acc2,$acc6
+	adcs	$acc3,$acc3,$acc7
+	adc	$acc4,xzr,xzr
+
+	subs	$t0,$acc0,$ord0		// ret -= modulus
+	sbcs	$t1,$acc1,$ord1
+	sbcs	$t2,$acc2,$ord2
+	sbcs	$t3,$acc3,$ord3
+	sbcs	xzr,$acc4,xzr
+
+	csel	$a0,$acc0,$t0,lo	// ret = borrow ? ret : ret-modulus
+	csel	$a1,$acc1,$t1,lo
+	csel	$a2,$acc2,$t2,lo
+	csel	$a3,$acc3,$t3,lo
+
+	cbnz	$bp,.Loop_ord_sqr
+
+	stp	$a0,$a1,[$rp]
+	stp	$a2,$a3,[$rp,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+.size	ecp_nistz256_ord_sqr_mont,.-ecp_nistz256_ord_sqr_mont
+___
+}	}
+
+########################################################################
+# select subroutines
+# These select functions are similar to those in p256-x86_64-asm.pl
+# They load all points in the lookup table
+# keeping in the output only the one corresponding to the input index.
+{
+my ($val,$in_t)=map("x$_",(0..1));
+my ($index)=("w2");
+my ($Idx_ctr,$Val_in, $Mask_64)=("w9", "x10", "x11");
+my ($Mask)=("v3");
+my ($Ra,$Rb,$Rc,$Rd,$Re,$Rf)=map("v$_",(16..21));
+my ($T0a,$T0b,$T0c,$T0d,$T0e,$T0f)=map("v$_",(22..27));
+$code.=<<___;
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w5
+.type	ecp_nistz256_select_w5,%function
+.align	4
+ecp_nistz256_select_w5:
+    AARCH64_VALID_CALL_TARGET
+
+    // $Val_in := $val
+    // $Idx_ctr := 0; loop counter and incremented internal index
+    mov     $Val_in, $val
+    mov     $Idx_ctr, #0
+
+    // [$Ra-$Rf] := 0
+    movi    $Ra.16b, #0
+    movi    $Rb.16b, #0
+    movi    $Rc.16b, #0
+    movi    $Rd.16b, #0
+    movi    $Re.16b, #0
+    movi    $Rf.16b, #0
+
+.Lselect_w5_loop:
+    // Loop 16 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+    add $Idx_ctr, $Idx_ctr, #1
+
+    // [$T0a-$T0f] := Load a (3*256-bit = 6*128-bit) table entry starting at $in_t
+    //  and advance $in_t to point to the next entry
+    ld1     {$T0a.2d, $T0b.2d, $T0c.2d, $T0d.2d}, [$in_t],#64
+
+    // $Mask_64 := ($Idx_ctr == $index)? All 1s : All 0s
+    cmp     $Idx_ctr, $index
+    csetm   $Mask_64, eq
+
+    // continue loading ...
+    ld1     {$T0e.2d, $T0f.2d}, [$in_t],#32
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+    dup     $Mask.2d, $Mask_64
+
+    // [$Ra-$Rd] := (Mask == all 1s)? [$T0a-$T0d] : [$Ra-$Rd]
+    // i.e., values in output registers will remain the same if $Idx_ctr != $index
+    bit     $Ra.16b, $T0a.16b, $Mask.16b
+    bit     $Rb.16b, $T0b.16b, $Mask.16b
+
+    bit     $Rc.16b, $T0c.16b, $Mask.16b
+    bit     $Rd.16b, $T0d.16b, $Mask.16b
+
+    bit     $Re.16b, $T0e.16b, $Mask.16b
+    bit     $Rf.16b, $T0f.16b, $Mask.16b
+
+    // If bit #4 is not 0 (i.e. idx_ctr < 16) loop back
+    tbz    $Idx_ctr, #4, .Lselect_w5_loop
+
+    // Write [$Ra-$Rf] to memory at the output pointer
+    st1     {$Ra.2d, $Rb.2d, $Rc.2d, $Rd.2d}, [$Val_in],#64
+    st1     {$Re.2d, $Rf.2d}, [$Val_in]
+
+	ret
+.size	ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w7
+.type	ecp_nistz256_select_w7,%function
+.align	4
+ecp_nistz256_select_w7:
+    AARCH64_VALID_CALL_TARGET
+
+    // $Idx_ctr := 0; loop counter and incremented internal index
+    mov     $Idx_ctr, #0
+
+    // [$Ra-$Rf] := 0
+    movi    $Ra.16b, #0
+    movi    $Rb.16b, #0
+    movi    $Rc.16b, #0
+    movi    $Rd.16b, #0
+
+.Lselect_w7_loop:
+    // Loop 64 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+    add $Idx_ctr, $Idx_ctr, #1
+
+    // [$T0a-$T0d] := Load a (2*256-bit = 4*128-bit) table entry starting at $in_t
+    //  and advance $in_t to point to the next entry
+    ld1     {$T0a.2d, $T0b.2d, $T0c.2d, $T0d.2d}, [$in_t],#64
+
+    // $Mask_64 := ($Idx_ctr == $index)? All 1s : All 0s
+    cmp     $Idx_ctr, $index
+    csetm   $Mask_64, eq
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+    dup     $Mask.2d, $Mask_64
+
+    // [$Ra-$Rd] := (Mask == all 1s)? [$T0a-$T0d] : [$Ra-$Rd]
+    // i.e., values in output registers will remain the same if $Idx_ctr != $index
+    bit     $Ra.16b, $T0a.16b, $Mask.16b
+    bit     $Rb.16b, $T0b.16b, $Mask.16b
+
+    bit     $Rc.16b, $T0c.16b, $Mask.16b
+    bit     $Rd.16b, $T0d.16b, $Mask.16b
+
+    // If bit #6 is not 0 (i.e. idx_ctr < 64) loop back
+    tbz    $Idx_ctr, #6, .Lselect_w7_loop
+
+    // Write [$Ra-$Rd] to memory at the output pointer
+    st1     {$Ra.2d, $Rb.2d, $Rc.2d, $Rd.2d}, [$val]
+
+	ret
+.size	ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
+___
+}
+
+foreach (split("\n",$code)) {
+	s/\`([^\`]*)\`/eval $1/ge;
+
+	print $_,"\n";
+}
+close STDOUT or die "error closing STDOUT: $!";	# enforce flush
diff --git a/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl b/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl
new file mode 100644
index 0000000..e259aef
--- /dev/null
+++ b/src/crypto/fipsmodule/ec/asm/p256_beeu-armv8-asm.pl
@@ -0,0 +1,455 @@
+# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+#
+#
+# This code is based on p256_beeu-x86_64-asm.pl (which is based on BN_mod_inverse_odd).
+#
+
+# The first two arguments should always be the flavour and output file path.
+if ($#ARGV < 1) { die "Not enough arguments provided.
+  Two arguments are necessary: the flavour and the output file path."; }
+
+$flavour = shift;
+$output  = shift;
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
+( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
+die "can't locate arm-xlate.pl";
+
+open OUT,"| \"$^X\" $xlate $flavour $output";
+*STDOUT=*OUT;
+#############################################################################
+# extern int beeu_mod_inverse_vartime(BN_ULONG out[P256_LIMBS],
+#                                     BN_ULONG a[P256_LIMBS],
+#                                     BN_ULONG n[P256_LIMBS]);
+#
+# (Binary Extended GCD (Euclidean) Algorithm.
+#  See A. Menezes, P. vanOorschot, and S. Vanstone's Handbook of Applied Cryptography,
+#  Chapter 14, Algorithm 14.61 and Note 14.64
+#  http://cacr.uwaterloo.ca/hac/about/chap14.pdf)
+
+# Assumption 1: n is odd for the BEEU
+# Assumption 2: 1 < a < n < 2^256
+
+# Details
+# The inverse of x modulo y can be calculated using Alg. 14.61, where "a" would be that inverse.
+# In other words,
+# ax == 1 (mod y) (where the symbol “==“ denotes ”congruent“)
+#  a == x^{-1} (mod y)
+#
+# It can be shown that throughout all the iterations of the algorithm, the following holds:
+#    u = Ax + By
+#    v = Cx + Dy
+# The values B and D are not of interest in this case, so they need not be computed by the algorithm.
+# This means the following congruences hold through the iterations of the algorithm.
+#    Ax == u (mod y)
+#    Cx == v (mod y)
+
+# Now we will modify the notation to match that of BN_mod_inverse_odd()
+# on which beeu_mod_inverse_vartime() in `p256_beeu-x86_64-asm` is based.
+# In those functions:
+#    x, y -> a, n
+#    u, v -> B, A
+#    A, C -> X, Y’, where Y’ = -Y
+# Hence, the following holds throughout the algorithm iterations
+#    Xa == B (mod n)
+#   -Ya == A (mod n)
+#
+# Same algorithm in Python:
+# def beeu(a, n):
+#     X = 1
+#     Y = 0
+#     B = a
+#     A = n
+#     while (B != 0):
+#         while (B % 2) == 0:
+#             B >>= 1
+#             if (X % 2) == 1:
+#                 X = X + n
+#             X >>= 1
+#         while (A % 2) == 0:
+#             A >>= 1
+#             if (Y % 2) == 1:
+#                 Y = Y + n
+#             Y >>= 1
+#         if (B >= A):
+#             B = B - A
+#             X = X + Y
+#         else:
+#             A = A - B
+#             Y = Y + X
+#     if (A != 1):
+#         # error
+#         return 0
+#     else:
+#         while (Y > n):
+#             Y = Y - n
+#         Y = n - Y
+#         return Y
+
+
+# For the internal variables,
+# x0-x2, x30 are used to hold the modulus n. The input parameters passed in
+# x1,x2 are copied first before corrupting them. x0 (out) is stored on the stack.
+# x3-x7 are used for parameters, which is not the case in this function, so they are corruptible
+# x8 is corruptible here
+# (the function doesn't return a struct, hence x8 doesn't contain a passed-in address
+#  for that struct).
+# x9-x15 are corruptible registers
+# x19-x28 are callee-saved registers
+
+# X/Y will hold the inverse parameter
+# Assumption: a,n,X,Y < 2^(256)
+# Initially, X := 1, Y := 0
+#            A := n, B := a
+
+# Function parameters (as per the Procedure Call Standard)
+my($out, $a_in, $n_in)=map("x$_",(0..2));
+# Internal variables
+my($n0, $n1, $n2, $n3)=map("x$_",(0..2,30));
+my($x0, $x1, $x2, $x3, $x4)=map("x$_",(3..7));
+my($y0, $y1, $y2, $y3, $y4)=map("x$_",(8..12));
+my($shift)=("x13");
+my($t0, $t1, $t2, $t3)=map("x$_",(14,15,19,20));
+my($a0, $a1, $a2, $a3)=map("x$_",(21..24));
+my($b0, $b1, $b2, $b3)=map("x$_",(25..28));
+
+# if B == 0, jump to end of loop
+sub TEST_B_ZERO {
+  return <<___;
+    orr     $t0, $b0, $b1
+    orr     $t0, $t0, $b2
+
+    // reverse the bit order of $b0. This is needed for clz after this macro
+    rbit     $t1, $b0
+
+    orr     $t0, $t0, $b3
+    cbz     $t0,.Lbeeu_loop_end
+___
+}
+
+# Shift right by 1 bit, adding the modulus first if the variable is odd
+# if least_sig_bit(var0) == 0,
+#     goto shift1_<ctr>
+# else
+#     add n and goto shift1_<ctr>
+# Prerequisite: t0 = 0
+$g_next_label = 0;
+sub SHIFT1 {
+  my ($var0, $var1, $var2, $var3, $var4) = @_;
+  my $label = ".Lshift1_${g_next_label}";
+  $g_next_label++;
+  return <<___;
+    tbz     $var0, #0, $label
+    adds    $var0, $var0, $n0
+    adcs    $var1, $var1, $n1
+    adcs    $var2, $var2, $n2
+    adcs    $var3, $var3, $n3
+    adc     $var4, $var4, $t0
+$label:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+    extr    $var0, $var1, $var0, #1
+    extr    $var1, $var2, $var1, #1
+    extr    $var2, $var3, $var2, #1
+    extr    $var3, $var4, $var3, #1
+    lsr     $var4, $var4, #1
+___
+}
+
+# compilation by clang 10.0.0 with -O2/-O3 of
+#      a[0] = (a[0] >> count) | (a[1] << (64-count));
+#      a[1] = (a[1] >> count) | (a[2] << (64-count));
+#      a[2] = (a[2] >> count) | (a[3] << (64-count));
+#      a[3] >>= count;
+# Note: EXTR instruction used in SHIFT1 is similar to x86_64's SHRDQ
+# except that the second source operand of EXTR is only immediate;
+# that's why it cannot be used here where $shift is a variable
+#
+# In the following,
+# t0 := 0 - shift
+#
+# then var0, for example, will be shifted right as follows:
+# var0 := (var0 >> (uint(shift) mod 64)) | (var1 << (uint(t0) mod 64))
+# "uint() mod 64" is from the definition of LSL and LSR instructions.
+#
+# What matters here is the order of instructions relative to certain other
+# instructions, i.e.
+# - lsr and lsl must precede orr of the corresponding registers.
+# - lsl must preced the lsr of the same register afterwards.
+# The chosen order of the instructions overall is to try and maximize
+# the pipeline usage.
+sub SHIFT256 {
+  my ($var0, $var1, $var2, $var3) = @_;
+  return <<___;
+    neg $t0, $shift
+    lsr $var0, $var0, $shift
+    lsl $t1, $var1, $t0
+
+    lsr $var1, $var1, $shift
+    lsl $t2, $var2, $t0
+
+    orr $var0, $var0, $t1
+
+    lsr $var2, $var2, $shift
+    lsl $t3, $var3, $t0
+
+    orr $var1, $var1, $t2
+
+    lsr $var3, $var3, $shift
+
+    orr $var2, $var2, $t3
+___
+}
+
+$code.=<<___;
+#include "openssl/arm_arch.h"
+
+.text
+.globl  beeu_mod_inverse_vartime
+.type   beeu_mod_inverse_vartime, %function
+.align  4
+beeu_mod_inverse_vartime:
+    // Reserve enough space for 14 8-byte registers on the stack
+    // in the first stp call for x29, x30.
+    // Then store the remaining callee-saved registers.
+    //
+    //    | x29 | x30 | x19 | x20 | ... | x27 | x28 |  x0 |  x2 |
+    //    ^                                                     ^
+    //    sp  <------------------- 112 bytes ----------------> old sp
+    //   x29 (FP)
+    //
+    AARCH64_SIGN_LINK_REGISTER
+    stp     x29,x30,[sp,#-112]!
+    add     x29,sp,#0
+    stp     x19,x20,[sp,#16]
+    stp     x21,x22,[sp,#32]
+    stp     x23,x24,[sp,#48]
+    stp     x25,x26,[sp,#64]
+    stp     x27,x28,[sp,#80]
+    stp     x0,x2,[sp,#96]
+
+    // B = b3..b0 := a
+    ldp     $b0,$b1,[$a_in]
+    ldp     $b2,$b3,[$a_in,#16]
+
+    // n3..n0 := n
+    // Note: the value of input params are changed in the following.
+    ldp     $n0,$n1,[$n_in]
+    ldp     $n2,$n3,[$n_in,#16]
+
+    // A = a3..a0 := n
+    mov     $a0, $n0
+    mov     $a1, $n1
+    mov     $a2, $n2
+    mov     $a3, $n3
+
+    // X = x4..x0 := 1
+    mov     $x0, #1
+    eor     $x1, $x1, $x1
+    eor     $x2, $x2, $x2
+    eor     $x3, $x3, $x3
+    eor     $x4, $x4, $x4
+
+    // Y = y4..y0 := 0
+    eor     $y0, $y0, $y0
+    eor     $y1, $y1, $y1
+    eor     $y2, $y2, $y2
+    eor     $y3, $y3, $y3
+    eor     $y4, $y4, $y4
+
+.Lbeeu_loop:
+    // if B == 0, jump to .Lbeeu_loop_end
+    ${\TEST_B_ZERO}
+
+    // 0 < B < |n|,
+    // 0 < A <= |n|,
+    // (1)      X*a  ==  B   (mod |n|),
+    // (2) (-1)*Y*a  ==  A   (mod |n|)
+
+    // Now divide B by the maximum possible power of two in the
+    // integers, and divide X by the same value mod |n|.
+    // When we're done, (1) still holds.
+
+    // shift := number of trailing 0s in $b0
+    // (      = number of leading 0s in $t1; see the "rbit" instruction in TEST_B_ZERO)
+    clz     $shift, $t1
+
+    // If there is no shift, goto shift_A_Y
+    cbz     $shift, .Lbeeu_shift_A_Y
+
+    // Shift B right by "$shift" bits
+    ${\SHIFT256($b0, $b1, $b2, $b3)}
+
+    // Shift X right by "$shift" bits, adding n whenever X becomes odd.
+    // $shift--;
+    // $t0 := 0; needed in the addition to the most significant word in SHIFT1
+    eor     $t0, $t0, $t0
+.Lbeeu_shift_loop_X:
+    ${\SHIFT1($x0, $x1, $x2, $x3, $x4)}
+    subs    $shift, $shift, #1
+    bne     .Lbeeu_shift_loop_X
+
+    // Note: the steps above perform the same sequence as in p256_beeu-x86_64-asm.pl
+    // with the following differences:
+    // - "$shift" is set directly to the number of trailing 0s in B
+    //   (using rbit and clz instructions)
+    // - The loop is only used to call SHIFT1(X)
+    //   and $shift is decreased while executing the X loop.
+    // - SHIFT256(B, $shift) is performed before right-shifting X; they are independent
+
+.Lbeeu_shift_A_Y:
+    // Same for A and Y.
+    // Afterwards, (2) still holds.
+    // Reverse the bit order of $a0
+    // $shift := number of trailing 0s in $a0 (= number of leading 0s in $t1)
+    rbit    $t1, $a0
+    clz     $shift, $t1
+
+    // If there is no shift, goto |B-A|, X+Y update
+    cbz     $shift, .Lbeeu_update_B_X_or_A_Y
+
+    // Shift A right by "$shift" bits
+    ${\SHIFT256($a0, $a1, $a2, $a3)}
+
+    // Shift Y right by "$shift" bits, adding n whenever Y becomes odd.
+    // $shift--;
+    // $t0 := 0; needed in the addition to the most significant word in SHIFT1
+    eor     $t0, $t0, $t0
+.Lbeeu_shift_loop_Y:
+    ${\SHIFT1($y0, $y1, $y2, $y3, $y4)}
+    subs    $shift, $shift, #1
+    bne     .Lbeeu_shift_loop_Y
+
+.Lbeeu_update_B_X_or_A_Y:
+    // Try T := B - A; if cs, continue with B > A (cs: carry set = no borrow)
+    // Note: this is a case of unsigned arithmetic, where T fits in 4 64-bit words
+    //       without taking a sign bit if generated. The lack of a carry would
+    //       indicate a negative result. See, for example,
+    //       https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/condition-codes-1-condition-flags-and-codes
+    subs    $t0, $b0, $a0
+    sbcs    $t1, $b1, $a1
+    sbcs    $t2, $b2, $a2
+    sbcs    $t3, $b3, $a3
+    bcs     .Lbeeu_B_greater_than_A
+
+    // Else A > B =>
+    // A := A - B; Y := Y + X; goto beginning of the loop
+    subs    $a0, $a0, $b0
+    sbcs    $a1, $a1, $b1
+    sbcs    $a2, $a2, $b2
+    sbcs    $a3, $a3, $b3
+
+    adds    $y0, $y0, $x0
+    adcs    $y1, $y1, $x1
+    adcs    $y2, $y2, $x2
+    adcs    $y3, $y3, $x3
+    adc     $y4, $y4, $x4
+    b       .Lbeeu_loop
+
+.Lbeeu_B_greater_than_A:
+    // Continue with B > A =>
+    // B := B - A; X := X + Y; goto beginning of the loop
+    mov     $b0, $t0
+    mov     $b1, $t1
+    mov     $b2, $t2
+    mov     $b3, $t3
+
+    adds    $x0, $x0, $y0
+    adcs    $x1, $x1, $y1
+    adcs    $x2, $x2, $y2
+    adcs    $x3, $x3, $y3
+    adc     $x4, $x4, $y4
+    b       .Lbeeu_loop
+
+.Lbeeu_loop_end:
+    // The Euclid's algorithm loop ends when A == gcd(a,n);
+    // this would be 1, when a and n are co-prime (i.e. do not have a common factor).
+    // Since (-1)*Y*a == A (mod |n|), Y>0
+    // then out = -Y mod n
+
+    // Verify that A = 1 ==> (-1)*Y*a = A = 1  (mod |n|)
+    // Is A-1 == 0?
+    // If not, fail.
+    sub     $t0, $a0, #1
+    orr     $t0, $t0, $a1
+    orr     $t0, $t0, $a2
+    orr     $t0, $t0, $a3
+    cbnz    $t0, .Lbeeu_err
+
+    // If Y>n ==> Y:=Y-n
+.Lbeeu_reduction_loop:
+    // x_i := y_i - n_i (X is no longer needed, use it as temp)
+    // ($t0 = 0 from above)
+    subs    $x0, $y0, $n0
+    sbcs    $x1, $y1, $n1
+    sbcs    $x2, $y2, $n2
+    sbcs    $x3, $y3, $n3
+    sbcs    $x4, $y4, $t0
+
+    // If result is non-negative (i.e., cs = carry set = no borrow),
+    // y_i := x_i; goto reduce again
+    // else
+    // y_i := y_i; continue
+    csel    $y0, $x0, $y0, cs
+    csel    $y1, $x1, $y1, cs
+    csel    $y2, $x2, $y2, cs
+    csel    $y3, $x3, $y3, cs
+    csel    $y4, $x4, $y4, cs
+    bcs     .Lbeeu_reduction_loop
+
+    // Now Y < n (Y cannot be equal to n, since the inverse cannot be 0)
+    // out = -Y = n-Y
+    subs    $y0, $n0, $y0
+    sbcs    $y1, $n1, $y1
+    sbcs    $y2, $n2, $y2
+    sbcs    $y3, $n3, $y3
+
+    // Save Y in output (out (x0) was saved on the stack)
+    ldr     x3, [sp,#96]
+    stp     $y0, $y1, [x3]
+    stp     $y2, $y3, [x3,#16]
+    // return 1 (success)
+    mov     x0, #1
+    b       .Lbeeu_finish
+
+.Lbeeu_err:
+    // return 0 (error)
+    eor     x0, x0, x0
+
+.Lbeeu_finish:
+    // Restore callee-saved registers, except x0, x2
+    add     sp,x29,#0
+    ldp     x19,x20,[sp,#16]
+    ldp     x21,x22,[sp,#32]
+    ldp     x23,x24,[sp,#48]
+    ldp     x25,x26,[sp,#64]
+    ldp     x27,x28,[sp,#80]
+    ldp     x29,x30,[sp],#112
+
+    AARCH64_VALIDATE_LINK_REGISTER
+    ret
+.size beeu_mod_inverse_vartime,.-beeu_mod_inverse_vartime
+___
+
+
+foreach (split("\n",$code)) {
+    s/\`([^\`]*)\`/eval $1/ge;
+
+    print $_,"\n";
+}
+close STDOUT or die "error closing STDOUT: $!"; # enforce flush
diff --git a/src/crypto/fipsmodule/ec/ec.c b/src/crypto/fipsmodule/ec/ec.c
index 1f03e15..4e632e1 100644
--- a/src/crypto/fipsmodule/ec/ec.c
+++ b/src/crypto/fipsmodule/ec/ec.c
@@ -246,7 +246,8 @@
   out->curves[2].param_len = 32;
   out->curves[2].params = kP256Params;
   out->curves[2].method =
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
+#if !defined(OPENSSL_NO_ASM) && \
+    (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&   \
     !defined(OPENSSL_SMALL)
       EC_GFp_nistz256_method();
 #else
@@ -943,8 +944,9 @@
   return ok;
 }
 
-int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
-                 const EC_POINT *p, const BIGNUM *p_scalar, BN_CTX *ctx) {
+int ec_point_mul_no_self_test(const EC_GROUP *group, EC_POINT *r,
+                              const BIGNUM *g_scalar, const EC_POINT *p,
+                              const BIGNUM *p_scalar, BN_CTX *ctx) {
   // Previously, this function set |r| to the point at infinity if there was
   // nothing to multiply. But, nobody should be calling this function with
   // nothing to multiply in the first place.
@@ -1010,6 +1012,13 @@
   return ret;
 }
 
+int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
+                 const EC_POINT *p, const BIGNUM *p_scalar, BN_CTX *ctx) {
+  boringssl_ensure_ecc_self_test();
+
+  return ec_point_mul_no_self_test(group, r, g_scalar, p, p_scalar, ctx);
+}
+
 int ec_point_mul_scalar_public(const EC_GROUP *group, EC_RAW_POINT *r,
                                const EC_SCALAR *g_scalar, const EC_RAW_POINT *p,
                                const EC_SCALAR *p_scalar) {
@@ -1146,8 +1155,8 @@
 
 void ec_precomp_select(const EC_GROUP *group, EC_PRECOMP *out, BN_ULONG mask,
                        const EC_PRECOMP *a, const EC_PRECOMP *b) {
-  OPENSSL_STATIC_ASSERT(sizeof(out->comb) == sizeof(*out),
-                        "out->comb does not span the entire structure");
+  static_assert(sizeof(out->comb) == sizeof(*out),
+                "out->comb does not span the entire structure");
   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(out->comb); i++) {
     ec_affine_select(group, &out->comb[i], mask, &a->comb[i], &b->comb[i]);
   }
@@ -1166,15 +1175,12 @@
     return 0;
   }
 
-  // For simplicity, in case of width mismatches between |group->field| and
-  // |group->order|, zero any untouched words in |out|.
-  OPENSSL_memset(out, 0, sizeof(EC_SCALAR));
-  for (size_t i = 0; i < len; i++) {
-    out->bytes[len - i - 1] = bytes[i];
-  }
-
-  // We must have p < 2×order, assuming p is not tiny (p >= 17). Thus rather we
-  // can reduce by performing at most one subtraction.
+  // The x-coordinate is bounded by p, but we need a scalar, bounded by the
+  // order. These may not have the same size. However, we must have p < 2×order,
+  // assuming p is not tiny (p >= 17).
+  //
+  // Thus |bytes| will fit in |order.width + 1| words, and we can reduce by
+  // performing at most one subtraction.
   //
   // Proof: We only work with prime order curves, so the number of points on
   // the curve is the order. Thus Hasse's theorem gives:
@@ -1188,14 +1194,11 @@
   //
   // Additionally, one can manually check this property for built-in curves. It
   // is enforced for legacy custom curves in |EC_GROUP_set_generator|.
-
-  // The above does not guarantee |group->field| is not one word larger than
-  // |group->order|, so read one extra carry word.
-  BN_ULONG tmp[EC_MAX_WORDS];
-  BN_ULONG carry =
-      group->order.width < EC_MAX_WORDS ? out->words[group->order.width] : 0;
-  bn_reduce_once_in_place(out->words, carry, group->order.d, tmp,
-                          group->order.width);
+  const BIGNUM *order = &group->order;
+  BN_ULONG words[EC_MAX_WORDS + 1];
+  bn_big_endian_to_words(words, order->width + 1, bytes, len);
+  bn_reduce_once(out->words, words, /*carry=*/words[order->width], order->d,
+                 order->width);
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/ec/ec_key.c b/src/crypto/fipsmodule/ec/ec_key.c
index 7a6daab..e676e3c 100644
--- a/src/crypto/fipsmodule/ec/ec_key.c
+++ b/src/crypto/fipsmodule/ec/ec_key.c
@@ -79,6 +79,7 @@
 
 #include "internal.h"
 #include "../delocate.h"
+#include "../service_indicator/internal.h"
 #include "../../internal.h"
 
 
@@ -308,6 +309,9 @@
   }
 
   // Check the public and private keys match.
+  //
+  // NOTE: this is a FIPS pair-wise consistency check for the ECDH case. See SP
+  // 800-56Ar3, page 36.
   if (eckey->priv_key != NULL) {
     EC_RAW_POINT point;
     if (!ec_point_mul_scalar_base(eckey->group, &point,
@@ -326,32 +330,43 @@
 }
 
 int EC_KEY_check_fips(const EC_KEY *key) {
+  int ret = 0;
+  FIPS_service_indicator_lock_state();
+
   if (EC_KEY_is_opaque(key)) {
     // Opaque keys can't be checked.
     OPENSSL_PUT_ERROR(EC, EC_R_PUBLIC_KEY_VALIDATION_FAILED);
-    return 0;
+    goto end;
   }
 
   if (!EC_KEY_check_key(key)) {
-    return 0;
+    goto end;
   }
 
   if (key->priv_key) {
     uint8_t data[16] = {0};
     ECDSA_SIG *sig = ECDSA_do_sign(data, sizeof(data), key);
-#if defined(BORINGSSL_FIPS_BREAK_ECDSA_PWCT)
-    data[0] = ~data[0];
-#endif
+    if (boringssl_fips_break_test("ECDSA_PWCT")) {
+      data[0] = ~data[0];
+    }
     int ok = sig != NULL &&
              ECDSA_do_verify(data, sizeof(data), sig, key);
     ECDSA_SIG_free(sig);
     if (!ok) {
       OPENSSL_PUT_ERROR(EC, EC_R_PUBLIC_KEY_VALIDATION_FAILED);
-      return 0;
+      goto end;
     }
   }
 
-  return 1;
+  ret = 1;
+
+end:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    EC_KEY_keygen_verify_service_indicator(key);
+  }
+
+  return ret;
 }
 
 int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, const BIGNUM *x,
@@ -439,6 +454,8 @@
 }
 
 int EC_KEY_generate_key_fips(EC_KEY *eckey) {
+  boringssl_ensure_ecc_self_test();
+
   if (EC_KEY_generate_key(eckey) && EC_KEY_check_fips(eckey)) {
     return 1;
   }
diff --git a/src/crypto/fipsmodule/ec/internal.h b/src/crypto/fipsmodule/ec/internal.h
index 289c3aa..f6c8e8a 100644
--- a/src/crypto/fipsmodule/ec/internal.h
+++ b/src/crypto/fipsmodule/ec/internal.h
@@ -70,10 +70,11 @@
 
 #include <openssl/base.h>
 
+#include <assert.h>
+
 #include <openssl/bn.h>
 #include <openssl/ec.h>
 #include <openssl/ex_data.h>
-#include <openssl/type_check.h>
 
 #include "../bn/internal.h"
 
@@ -91,8 +92,8 @@
 #define EC_MAX_BYTES 66
 #define EC_MAX_WORDS ((EC_MAX_BYTES + BN_BYTES - 1) / BN_BYTES)
 
-OPENSSL_STATIC_ASSERT(EC_MAX_WORDS <= BN_SMALL_MAX_WORDS,
-                      "bn_*_small functions not usable");
+static_assert(EC_MAX_WORDS <= BN_SMALL_MAX_WORDS,
+              "bn_*_small functions not usable");
 
 
 // Scalars.
@@ -100,9 +101,7 @@
 // An EC_SCALAR is an integer fully reduced modulo the order. Only the first
 // |order->width| words are used. An |EC_SCALAR| is specific to an |EC_GROUP|
 // and must not be mixed between groups.
-typedef union {
-  // bytes is the representation of the scalar in little-endian order.
-  uint8_t bytes[EC_MAX_BYTES];
+typedef struct {
   BN_ULONG words[EC_MAX_WORDS];
 } EC_SCALAR;
 
@@ -192,9 +191,7 @@
 // are used. An |EC_FELEM| is specific to an |EC_GROUP| and must not be mixed
 // between groups. Additionally, the representation (whether or not elements are
 // represented in Montgomery-form) may vary between |EC_METHOD|s.
-typedef union {
-  // bytes is the representation of the field element in little-endian order.
-  uint8_t bytes[EC_MAX_BYTES];
+typedef struct {
   BN_ULONG words[EC_MAX_WORDS];
 } EC_FELEM;
 
@@ -301,6 +298,13 @@
 int ec_point_set_affine_coordinates(const EC_GROUP *group, EC_AFFINE *out,
                                     const EC_FELEM *x, const EC_FELEM *y);
 
+// ec_point_mul_no_self_test does the same as |EC_POINT_mul|, but doesn't try to
+// run the self-test first. This is for use in the self tests themselves, to
+// prevent an infinite loop.
+int ec_point_mul_no_self_test(const EC_GROUP *group, EC_POINT *r,
+                              const BIGNUM *g_scalar, const EC_POINT *p,
+                              const BIGNUM *p_scalar, BN_CTX *ctx);
+
 // ec_point_mul_scalar sets |r| to |p| * |scalar|. Both inputs are considered
 // secret.
 int ec_point_mul_scalar(const EC_GROUP *group, EC_RAW_POINT *r,
diff --git a/src/crypto/fipsmodule/ec/make_p256-x86_64-tests.go b/src/crypto/fipsmodule/ec/make_p256-nistz-tests.go
similarity index 96%
rename from src/crypto/fipsmodule/ec/make_p256-x86_64-tests.go
rename to src/crypto/fipsmodule/ec/make_p256-nistz-tests.go
index 958a97a..36194e6 100644
--- a/src/crypto/fipsmodule/ec/make_p256-x86_64-tests.go
+++ b/src/crypto/fipsmodule/ec/make_p256-nistz-tests.go
@@ -69,7 +69,7 @@
 
 func isAffineInfinity(x, y *big.Int) bool {
 	// Infinity, in affine coordinates, is represented as (0, 0) by
-	// both Go and p256-x86_64-asm.pl.
+	// both Go, p256-x86_64-asm.pl and p256-armv8-asm.pl.
 	return x.Sign() == 0 && y.Sign() == 0
 }
 
@@ -107,8 +107,8 @@
 		// arbitrary X and Y and include the special case. We also have
 		// not verified that add and double preserve this
 		// property. Thus, generate test vectors with unrelated X and Y,
-		// to test that p256-x86_64-asm.pl correctly handles
-		// unconstrained representations of infinity.
+		// to test that p256-x86_64-asm.pl and p256-armv8-asm.pl correctly
+		// handle unconstrained representations of infinity.
 		x = randNonZeroInt(p)
 		y = randNonZeroInt(p)
 		z = zero
diff --git a/src/crypto/fipsmodule/ec/make_tables.go b/src/crypto/fipsmodule/ec/make_tables.go
index 34e8c23..dbcaab0 100644
--- a/src/crypto/fipsmodule/ec/make_tables.go
+++ b/src/crypto/fipsmodule/ec/make_tables.go
@@ -23,8 +23,8 @@
 )
 
 func main() {
-	if err := writeP256X86_64Table("p256-x86_64-table.h"); err != nil {
-		fmt.Fprintf(os.Stderr, "Error writing p256-x86_64-table.h: %s\n", err)
+	if err := writeP256NistzTable("p256-nistz-table.h"); err != nil {
+		fmt.Fprintf(os.Stderr, "Error writing p256-nistz-table.h: %s\n", err)
 		os.Exit(1)
 	}
 
@@ -34,7 +34,7 @@
 	}
 }
 
-func writeP256X86_64Table(path string) error {
+func writeP256NistzTable(path string) error {
 	curve := elliptic.P256()
 	tables := make([][][2]*big.Int, 0, 37)
 	for shift := 0; shift < 256; shift += 7 {
@@ -59,7 +59,7 @@
  */
 
 // This is the precomputed constant time access table for the code in
-// p256-x86_64.c, for the default generator. The table consists of 37
+// p256-nistz.c, for the default generator. The table consists of 37
 // subtables, each subtable contains 64 affine points. The affine points are
 // encoded as eight uint64's, four for the x coordinate and four for the y.
 // Both values are in little-endian order. There are 37 tables because a
diff --git a/src/crypto/fipsmodule/ec/p224-64.c b/src/crypto/fipsmodule/ec/p224-64.c
index da4308c..0f51970 100644
--- a/src/crypto/fipsmodule/ec/p224-64.c
+++ b/src/crypto/fipsmodule/ec/p224-64.c
@@ -52,11 +52,6 @@
 typedef p224_limb p224_felem[4];
 typedef p224_widelimb p224_widefelem[7];
 
-// Field element represented as a byte arrary. 28*8 = 224 bits is also the
-// group order size for the elliptic curve, and we also use this type for
-// scalars for point multiplication.
-typedef uint8_t p224_felem_bytearray[28];
-
 // Precomputed multiples of the standard generator
 // Points are given in coordinates (X, Y, Z) where Z normally is 1
 // (0 for the point at infinity).
@@ -180,31 +175,16 @@
       {0x32477c61b6e8c6, 0xb46a97570f018b, 0x91176d0a7e95d1, 0x3df90fbc4c7d0e},
       {1, 0, 0, 0}}}};
 
-static uint64_t p224_load_u64(const uint8_t in[8]) {
-  uint64_t ret;
-  OPENSSL_memcpy(&ret, in, sizeof(ret));
-  return ret;
-}
 
 // Helper functions to convert field elements to/from internal representation
-static void p224_bin28_to_felem(p224_felem out, const uint8_t in[28]) {
-  out[0] = p224_load_u64(in) & 0x00ffffffffffffff;
-  out[1] = p224_load_u64(in + 7) & 0x00ffffffffffffff;
-  out[2] = p224_load_u64(in + 14) & 0x00ffffffffffffff;
-  out[3] = p224_load_u64(in + 20) >> 8;
-}
-
-static void p224_felem_to_bin28(uint8_t out[28], const p224_felem in) {
-  for (size_t i = 0; i < 7; ++i) {
-    out[i] = in[0] >> (8 * i);
-    out[i + 7] = in[1] >> (8 * i);
-    out[i + 14] = in[2] >> (8 * i);
-    out[i + 21] = in[3] >> (8 * i);
-  }
-}
 
 static void p224_generic_to_felem(p224_felem out, const EC_FELEM *in) {
-  p224_bin28_to_felem(out, in->bytes);
+  // |p224_felem|'s minimal representation uses four 56-bit words. |EC_FELEM|
+  // uses four 64-bit words. (The top-most word only has 32 bits.)
+  out[0] = in->words[0] & 0x00ffffffffffffff;
+  out[1] = ((in->words[0] >> 56) | (in->words[1] << 8)) & 0x00ffffffffffffff;
+  out[2] = ((in->words[1] >> 48) | (in->words[2] << 16)) & 0x00ffffffffffffff;
+  out[3] = ((in->words[2] >> 40) | (in->words[3] << 24)) & 0x00ffffffffffffff;
 }
 
 // Requires 0 <= in < 2*p (always call p224_felem_reduce first)
@@ -256,9 +236,12 @@
   tmp2[2] = tmp[2];
   tmp2[3] = tmp[3];
 
-  p224_felem_to_bin28(out->bytes, tmp2);
-  // 224 is not a multiple of 64, so zero the remaining bytes.
-  OPENSSL_memset(out->bytes + 28, 0, 32 - 28);
+  // |p224_felem|'s minimal representation uses four 56-bit words. |EC_FELEM|
+  // uses four 64-bit words. (The top-most word only has 32 bits.)
+  out->words[0] = tmp2[0] | (tmp2[1] << 56);
+  out->words[1] = (tmp2[1] >> 8) | (tmp2[2] << 48);
+  out->words[2] = (tmp2[2] >> 16) | (tmp2[3] << 40);
+  out->words[3] = tmp2[3] >> 24;
 }
 
 
@@ -865,12 +848,13 @@
   }
 }
 
-// p224_get_bit returns the |i|th bit in |in|
-static crypto_word_t p224_get_bit(const p224_felem_bytearray in, size_t i) {
+// p224_get_bit returns the |i|th bit in |in|.
+static crypto_word_t p224_get_bit(const EC_SCALAR *in, size_t i) {
   if (i >= 224) {
     return 0;
   }
-  return (in[i >> 3] >> (i & 7)) & 1;
+  static_assert(sizeof(in->words[0]) == 8, "BN_ULONG is not 64-bit");
+  return (in->words[i >> 6] >> (i & 63)) & 1;
 }
 
 // Takes the Jacobian coordinates (X, Y, Z) of a point and returns
@@ -977,12 +961,12 @@
 
     // Add every 5 doublings.
     if (i % 5 == 0) {
-      crypto_word_t bits = p224_get_bit(scalar->bytes, i + 4) << 5;
-      bits |= p224_get_bit(scalar->bytes, i + 3) << 4;
-      bits |= p224_get_bit(scalar->bytes, i + 2) << 3;
-      bits |= p224_get_bit(scalar->bytes, i + 1) << 2;
-      bits |= p224_get_bit(scalar->bytes, i) << 1;
-      bits |= p224_get_bit(scalar->bytes, i - 1);
+      crypto_word_t bits = p224_get_bit(scalar, i + 4) << 5;
+      bits |= p224_get_bit(scalar, i + 3) << 4;
+      bits |= p224_get_bit(scalar, i + 2) << 3;
+      bits |= p224_get_bit(scalar, i + 1) << 2;
+      bits |= p224_get_bit(scalar, i) << 1;
+      bits |= p224_get_bit(scalar, i - 1);
       crypto_word_t sign, digit;
       ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
 
@@ -1022,10 +1006,10 @@
     }
 
     // First, look 28 bits upwards.
-    crypto_word_t bits = p224_get_bit(scalar->bytes, i + 196) << 3;
-    bits |= p224_get_bit(scalar->bytes, i + 140) << 2;
-    bits |= p224_get_bit(scalar->bytes, i + 84) << 1;
-    bits |= p224_get_bit(scalar->bytes, i + 28);
+    crypto_word_t bits = p224_get_bit(scalar, i + 196) << 3;
+    bits |= p224_get_bit(scalar, i + 140) << 2;
+    bits |= p224_get_bit(scalar, i + 84) << 1;
+    bits |= p224_get_bit(scalar, i + 28);
     // Select the point to add, in constant time.
     p224_select_point(bits, 16, g_p224_pre_comp[1], tmp);
 
@@ -1038,10 +1022,10 @@
     }
 
     // Second, look at the current position/
-    bits = p224_get_bit(scalar->bytes, i + 168) << 3;
-    bits |= p224_get_bit(scalar->bytes, i + 112) << 2;
-    bits |= p224_get_bit(scalar->bytes, i + 56) << 1;
-    bits |= p224_get_bit(scalar->bytes, i);
+    bits = p224_get_bit(scalar, i + 168) << 3;
+    bits |= p224_get_bit(scalar, i + 112) << 2;
+    bits |= p224_get_bit(scalar, i + 56) << 1;
+    bits |= p224_get_bit(scalar, i);
     // Select the point to add, in constant time.
     p224_select_point(bits, 16, g_p224_pre_comp[0], tmp);
     p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
@@ -1080,10 +1064,10 @@
     // Add multiples of the generator.
     if (i <= 27) {
       // First, look 28 bits upwards.
-      crypto_word_t bits = p224_get_bit(g_scalar->bytes, i + 196) << 3;
-      bits |= p224_get_bit(g_scalar->bytes, i + 140) << 2;
-      bits |= p224_get_bit(g_scalar->bytes, i + 84) << 1;
-      bits |= p224_get_bit(g_scalar->bytes, i + 28);
+      crypto_word_t bits = p224_get_bit(g_scalar, i + 196) << 3;
+      bits |= p224_get_bit(g_scalar, i + 140) << 2;
+      bits |= p224_get_bit(g_scalar, i + 84) << 1;
+      bits |= p224_get_bit(g_scalar, i + 28);
 
       size_t index = (size_t)bits;
       p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
@@ -1092,10 +1076,10 @@
       assert(!skip);
 
       // Second, look at the current position.
-      bits = p224_get_bit(g_scalar->bytes, i + 168) << 3;
-      bits |= p224_get_bit(g_scalar->bytes, i + 112) << 2;
-      bits |= p224_get_bit(g_scalar->bytes, i + 56) << 1;
-      bits |= p224_get_bit(g_scalar->bytes, i);
+      bits = p224_get_bit(g_scalar, i + 168) << 3;
+      bits |= p224_get_bit(g_scalar, i + 112) << 2;
+      bits |= p224_get_bit(g_scalar, i + 56) << 1;
+      bits |= p224_get_bit(g_scalar, i);
       index = (size_t)bits;
       p224_point_add(nq[0], nq[1], nq[2], nq[0], nq[1], nq[2], 1 /* mixed */,
                      g_p224_pre_comp[0][index][0], g_p224_pre_comp[0][index][1],
@@ -1104,12 +1088,12 @@
 
     // Incorporate |p_scalar| every 5 doublings.
     if (i % 5 == 0) {
-      crypto_word_t bits = p224_get_bit(p_scalar->bytes, i + 4) << 5;
-      bits |= p224_get_bit(p_scalar->bytes, i + 3) << 4;
-      bits |= p224_get_bit(p_scalar->bytes, i + 2) << 3;
-      bits |= p224_get_bit(p_scalar->bytes, i + 1) << 2;
-      bits |= p224_get_bit(p_scalar->bytes, i) << 1;
-      bits |= p224_get_bit(p_scalar->bytes, i - 1);
+      crypto_word_t bits = p224_get_bit(p_scalar, i + 4) << 5;
+      bits |= p224_get_bit(p_scalar, i + 3) << 4;
+      bits |= p224_get_bit(p_scalar, i + 2) << 3;
+      bits |= p224_get_bit(p_scalar, i + 1) << 2;
+      bits |= p224_get_bit(p_scalar, i) << 1;
+      bits |= p224_get_bit(p_scalar, i - 1);
       crypto_word_t sign, digit;
       ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
 
diff --git a/src/crypto/fipsmodule/ec/p256-x86_64-table.h b/src/crypto/fipsmodule/ec/p256-nistz-table.h
similarity index 99%
rename from src/crypto/fipsmodule/ec/p256-x86_64-table.h
rename to src/crypto/fipsmodule/ec/p256-nistz-table.h
index 3af0b01..b81480b 100644
--- a/src/crypto/fipsmodule/ec/p256-x86_64-table.h
+++ b/src/crypto/fipsmodule/ec/p256-nistz-table.h
@@ -9,7 +9,7 @@
  */
 
 // This is the precomputed constant time access table for the code in
-// p256-x86_64.c, for the default generator. The table consists of 37
+// p256-nistz.c, for the default generator. The table consists of 37
 // subtables, each subtable contains 64 affine points. The affine points are
 // encoded as eight uint64's, four for the x coordinate and four for the y.
 // Both values are in little-endian order. There are 37 tables because a
diff --git a/src/crypto/fipsmodule/ec/p256-x86_64.c b/src/crypto/fipsmodule/ec/p256-nistz.c
similarity index 88%
rename from src/crypto/fipsmodule/ec/p256-x86_64.c
rename to src/crypto/fipsmodule/ec/p256-nistz.c
index 29ae193..996c2fe 100644
--- a/src/crypto/fipsmodule/ec/p256-x86_64.c
+++ b/src/crypto/fipsmodule/ec/p256-nistz.c
@@ -23,7 +23,6 @@
 #include <string.h>
 
 #include <openssl/bn.h>
-#include <openssl/cpu.h>
 #include <openssl/crypto.h>
 #include <openssl/err.h>
 
@@ -31,10 +30,10 @@
 #include "../delocate.h"
 #include "../../internal.h"
 #include "internal.h"
-#include "p256-x86_64.h"
+#include "p256-nistz.h"
 
-
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
+#if !defined(OPENSSL_NO_ASM) &&  \
+    (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&    \
     !defined(OPENSSL_SMALL)
 
 typedef P256_POINT_AFFINE PRECOMP256_ROW[64];
@@ -46,7 +45,7 @@
 };
 
 // Precomputed tables for the default generator
-#include "p256-x86_64-table.h"
+#include "p256-nistz-table.h"
 
 // Recode window to a signed digit, see |ec_GFp_nistp_recode_scalar_bits| in
 // util.c for details
@@ -202,7 +201,7 @@
   // ~1599 ((96 * 16) + 63) bytes of stack space.
   alignas(64) P256_POINT table[16];
   uint8_t p_str[33];
-  OPENSSL_memcpy(p_str, p_scalar->bytes, 32);
+  OPENSSL_memcpy(p_str, p_scalar->words, 32);
   p_str[32] = 0;
 
   // table[0] is implicitly (0,0,0) (the point at infinity), therefore it is
@@ -278,11 +277,6 @@
   ecp_nistz256_point_add(r, r, &h);
 }
 
-typedef union {
-  P256_POINT p;
-  P256_POINT_AFFINE a;
-} p256_point_union_t;
-
 static crypto_word_t calc_first_wvalue(size_t *index, const uint8_t p_str[33]) {
   static const size_t kWindowSize = 7;
   static const crypto_word_t kMask = (1 << (7 /* kWindowSize */ + 1)) - 1;
@@ -319,43 +313,46 @@
 
 static void ecp_nistz256_point_mul_base(const EC_GROUP *group, EC_RAW_POINT *r,
                                         const EC_SCALAR *scalar) {
-  alignas(32) p256_point_union_t t, p;
-
   uint8_t p_str[33];
-  OPENSSL_memcpy(p_str, scalar->bytes, 32);
+  OPENSSL_memcpy(p_str, scalar->words, 32);
   p_str[32] = 0;
 
   // First window
   size_t index = 0;
   crypto_word_t wvalue = calc_first_wvalue(&index, p_str);
 
-  ecp_nistz256_select_w7(&p.a, ecp_nistz256_precomputed[0], wvalue >> 1);
-  ecp_nistz256_neg(p.p.Z, p.p.Y);
-  copy_conditional(p.p.Y, p.p.Z, wvalue & 1);
+  alignas(32) P256_POINT_AFFINE t;
+  alignas(32) P256_POINT p;
+  ecp_nistz256_select_w7(&t, ecp_nistz256_precomputed[0], wvalue >> 1);
+  ecp_nistz256_neg(p.Z, t.Y);
+  copy_conditional(t.Y, p.Z, wvalue & 1);
 
-  // Convert |p| from affine to Jacobian coordinates. We set Z to zero if |p|
-  // is infinity and |ONE| otherwise. |p| was computed from the table, so it
+  // Convert |t| from affine to Jacobian coordinates. We set Z to zero if |t|
+  // is infinity and |ONE| otherwise. |t| was computed from the table, so it
   // is infinity iff |wvalue >> 1| is zero.
-  OPENSSL_memset(p.p.Z, 0, sizeof(p.p.Z));
-  copy_conditional(p.p.Z, ONE, is_not_zero(wvalue >> 1));
+  OPENSSL_memcpy(p.X, t.X, sizeof(p.X));
+  OPENSSL_memcpy(p.Y, t.Y, sizeof(p.Y));
+  OPENSSL_memset(p.Z, 0, sizeof(p.Z));
+  copy_conditional(p.Z, ONE, is_not_zero(wvalue >> 1));
 
   for (int i = 1; i < 37; i++) {
     wvalue = calc_wvalue(&index, p_str);
 
-    ecp_nistz256_select_w7(&t.a, ecp_nistz256_precomputed[i], wvalue >> 1);
+    ecp_nistz256_select_w7(&t, ecp_nistz256_precomputed[i], wvalue >> 1);
 
-    ecp_nistz256_neg(t.p.Z, t.a.Y);
-    copy_conditional(t.a.Y, t.p.Z, wvalue & 1);
+    alignas(32) BN_ULONG neg_Y[P256_LIMBS];
+    ecp_nistz256_neg(neg_Y, t.Y);
+    copy_conditional(t.Y, neg_Y, wvalue & 1);
 
-    // Note |ecp_nistz256_point_add_affine| does not work if |p.p| and |t.a|
-    // are the same non-infinity point.
-    ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
+    // Note |ecp_nistz256_point_add_affine| does not work if |p| and |t| are the
+    // same non-infinity point.
+    ecp_nistz256_point_add_affine(&p, &p, &t);
   }
 
   assert(group->field.width == P256_LIMBS);
-  OPENSSL_memcpy(r->X.words, p.p.X, P256_LIMBS * sizeof(BN_ULONG));
-  OPENSSL_memcpy(r->Y.words, p.p.Y, P256_LIMBS * sizeof(BN_ULONG));
-  OPENSSL_memcpy(r->Z.words, p.p.Z, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->X.words, p.X, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->Y.words, p.Y, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->Z.words, p.Z, P256_LIMBS * sizeof(BN_ULONG));
 }
 
 static void ecp_nistz256_points_mul_public(const EC_GROUP *group,
@@ -365,9 +362,9 @@
                                            const EC_SCALAR *p_scalar) {
   assert(p_ != NULL && p_scalar != NULL && g_scalar != NULL);
 
-  alignas(32) p256_point_union_t t, p;
+  alignas(32) P256_POINT p;
   uint8_t p_str[33];
-  OPENSSL_memcpy(p_str, g_scalar->bytes, 32);
+  OPENSSL_memcpy(p_str, g_scalar->words, 32);
   p_str[32] = 0;
 
   // First window
@@ -378,45 +375,48 @@
   // is infinity and |ONE| otherwise. |p| was computed from the table, so it
   // is infinity iff |wvalue >> 1| is zero.
   if ((wvalue >> 1) != 0) {
-    OPENSSL_memcpy(&p.a, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1],
-                   sizeof(p.a));
-    OPENSSL_memcpy(&p.p.Z, ONE, sizeof(p.p.Z));
+    OPENSSL_memcpy(p.X, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1].X,
+                   sizeof(p.X));
+    OPENSSL_memcpy(p.Y, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1].Y,
+                   sizeof(p.Y));
+    OPENSSL_memcpy(p.Z, ONE, sizeof(p.Z));
   } else {
-    OPENSSL_memset(&p.a, 0, sizeof(p.a));
-    OPENSSL_memset(p.p.Z, 0, sizeof(p.p.Z));
+    OPENSSL_memset(p.X, 0, sizeof(p.X));
+    OPENSSL_memset(p.Y, 0, sizeof(p.Y));
+    OPENSSL_memset(p.Z, 0, sizeof(p.Z));
   }
 
   if ((wvalue & 1) == 1) {
-    ecp_nistz256_neg(p.p.Y, p.p.Y);
+    ecp_nistz256_neg(p.Y, p.Y);
   }
 
   for (int i = 1; i < 37; i++) {
     wvalue = calc_wvalue(&index, p_str);
-
     if ((wvalue >> 1) == 0) {
       continue;
     }
 
-    OPENSSL_memcpy(&t.a, &ecp_nistz256_precomputed[i][(wvalue >> 1) - 1],
-                   sizeof(p.a));
-
+    alignas(32) P256_POINT_AFFINE t;
+    OPENSSL_memcpy(&t, &ecp_nistz256_precomputed[i][(wvalue >> 1) - 1],
+                   sizeof(t));
     if ((wvalue & 1) == 1) {
-      ecp_nistz256_neg(t.a.Y, t.a.Y);
+      ecp_nistz256_neg(t.Y, t.Y);
     }
 
-    // Note |ecp_nistz256_point_add_affine| does not work if |p.p| and |t.a|
-    // are the same non-infinity point, so it is important that we compute the
+    // Note |ecp_nistz256_point_add_affine| does not work if |p| and |t| are
+    // the same non-infinity point, so it is important that we compute the
     // |g_scalar| term before the |p_scalar| term.
-    ecp_nistz256_point_add_affine(&p.p, &p.p, &t.a);
+    ecp_nistz256_point_add_affine(&p, &p, &t);
   }
 
-  ecp_nistz256_windowed_mul(group, &t.p, p_, p_scalar);
-  ecp_nistz256_point_add(&p.p, &p.p, &t.p);
+  alignas(32) P256_POINT tmp;
+  ecp_nistz256_windowed_mul(group, &tmp, p_, p_scalar);
+  ecp_nistz256_point_add(&p, &p, &tmp);
 
   assert(group->field.width == P256_LIMBS);
-  OPENSSL_memcpy(r->X.words, p.p.X, P256_LIMBS * sizeof(BN_ULONG));
-  OPENSSL_memcpy(r->Y.words, p.p.Y, P256_LIMBS * sizeof(BN_ULONG));
-  OPENSSL_memcpy(r->Z.words, p.p.Z, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->X.words, p.X, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->Y.words, p.Y, P256_LIMBS * sizeof(BN_ULONG));
+  OPENSSL_memcpy(r->Z.words, p.Z, P256_LIMBS * sizeof(BN_ULONG));
 }
 
 static int ecp_nistz256_get_affine(const EC_GROUP *group,
@@ -555,10 +555,12 @@
 static int ecp_nistz256_scalar_to_montgomery_inv_vartime(const EC_GROUP *group,
                                                  EC_SCALAR *out,
                                                  const EC_SCALAR *in) {
-  if ((OPENSSL_ia32cap_get()[1] & (1 << 28)) == 0) {
+#if defined(OPENSSL_X86_64)
+  if (!CRYPTO_is_AVX_capable()) {
     // No AVX support; fallback to generic code.
     return ec_simple_scalar_to_montgomery_inv_vartime(group, out, in);
   }
+#endif
 
   assert(group->order.width == P256_LIMBS);
   if (!beeu_mod_inverse_vartime(out->words, in->words, group->order.d)) {
@@ -629,5 +631,6 @@
   out->cmp_x_coordinate = ecp_nistz256_cmp_x_coordinate;
 }
 
-#endif /* !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
+#endif /* !defined(OPENSSL_NO_ASM) && \
+          (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&  \
           !defined(OPENSSL_SMALL) */
diff --git a/src/crypto/fipsmodule/ec/p256-x86_64.h b/src/crypto/fipsmodule/ec/p256-nistz.h
similarity index 87%
rename from src/crypto/fipsmodule/ec/p256-x86_64.h
rename to src/crypto/fipsmodule/ec/p256-nistz.h
index 5deb81a..3f5ea02 100644
--- a/src/crypto/fipsmodule/ec/p256-x86_64.h
+++ b/src/crypto/fipsmodule/ec/p256-nistz.h
@@ -30,7 +30,8 @@
 #endif
 
 
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
+#if !defined(OPENSSL_NO_ASM) && \
+    (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&   \
     !defined(OPENSSL_SMALL)
 
 // P-256 field operations.
@@ -63,16 +64,6 @@
   ecp_nistz256_mul_mont(res, in, ONE);
 }
 
-// ecp_nistz256_to_mont sets |res| to |in|, converted to Montgomery domain
-// by multiplying with RR = 2^512 mod P precomputed for NIST P256 curve.
-static inline void ecp_nistz256_to_mont(BN_ULONG res[P256_LIMBS],
-                                        const BN_ULONG in[P256_LIMBS]) {
-  static const BN_ULONG RR[P256_LIMBS] = {
-      TOBN(0x00000000, 0x00000003), TOBN(0xfffffffb, 0xffffffff),
-      TOBN(0xffffffff, 0xfffffffe), TOBN(0x00000004, 0xfffffffd)};
-  ecp_nistz256_mul_mont(res, in, RR);
-}
-
 
 // P-256 scalar operations.
 //
@@ -142,8 +133,9 @@
 void ecp_nistz256_point_add_affine(P256_POINT *r, const P256_POINT *a,
                                    const P256_POINT_AFFINE *b);
 
-#endif /* !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
-           !defined(OPENSSL_SMALL) */
+#endif /* !defined(OPENSSL_NO_ASM) && \
+          (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&   \
+          !defined(OPENSSL_SMALL) */
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/fipsmodule/ec/p256-x86_64_test.cc b/src/crypto/fipsmodule/ec/p256-nistz_test.cc
similarity index 97%
rename from src/crypto/fipsmodule/ec/p256-x86_64_test.cc
rename to src/crypto/fipsmodule/ec/p256-nistz_test.cc
index f699fc8..6aa51e8 100644
--- a/src/crypto/fipsmodule/ec/p256-x86_64_test.cc
+++ b/src/crypto/fipsmodule/ec/p256-nistz_test.cc
@@ -20,7 +20,6 @@
 #include <gtest/gtest.h>
 
 #include <openssl/bn.h>
-#include <openssl/cpu.h>
 #include <openssl/ec.h>
 #include <openssl/mem.h>
 #include <openssl/nid.h>
@@ -31,15 +30,16 @@
 #include "../../test/abi_test.h"
 #include "../../test/file_test.h"
 #include "../../test/test_util.h"
-#include "p256-x86_64.h"
+#include "p256-nistz.h"
 
 
 // Disable tests if BORINGSSL_SHARED_LIBRARY is defined. These tests need access
 // to internal functions.
-#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
+#if !defined(OPENSSL_NO_ASM) &&  \
+    (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) &&  \
     !defined(OPENSSL_SMALL) && !defined(BORINGSSL_SHARED_LIBRARY)
 
-TEST(P256_X86_64Test, SelectW5) {
+TEST(P256_NistzTest, SelectW5) {
   // Fill a table with some garbage input.
   alignas(64) P256_POINT table[16];
   for (size_t i = 0; i < 16; i++) {
@@ -69,7 +69,7 @@
   CHECK_ABI(ecp_nistz256_select_w5, &val, table, 7);
 }
 
-TEST(P256_X86_64Test, SelectW7) {
+TEST(P256_NistzTest, SelectW7) {
   // Fill a table with some garbage input.
   alignas(64) P256_POINT_AFFINE table[64];
   for (size_t i = 0; i < 64; i++) {
@@ -98,11 +98,13 @@
   CHECK_ABI(ecp_nistz256_select_w7, &val, table, 42);
 }
 
-TEST(P256_X86_64Test, BEEU) {
-  if ((OPENSSL_ia32cap_P[1] & (1 << 28)) == 0) {
+TEST(P256_NistzTest, BEEU) {
+#if defined(OPENSSL_X86_64)
+  if (!CRYPTO_is_AVX_capable()) {
     // No AVX support; cannot run the BEEU code.
     return;
   }
+#endif
 
   bssl::UniquePtr<EC_GROUP> group(
       EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1));
@@ -147,8 +149,8 @@
     EXPECT_TRUE(bn_less_than_words(out, order_words, P256_LIMBS));
 
     // Calculate out*in and confirm that it equals one, modulo the order.
-    OPENSSL_memcpy(in_scalar.bytes, in, sizeof(in));
-    OPENSSL_memcpy(out_scalar.bytes, out, sizeof(out));
+    OPENSSL_memcpy(in_scalar.words, in, sizeof(in));
+    OPENSSL_memcpy(out_scalar.words, out, sizeof(out));
     ec_scalar_to_montgomery(group.get(), &in_scalar, &in_scalar);
     ec_scalar_to_montgomery(group.get(), &out_scalar, &out_scalar);
     ec_scalar_mul_montgomery(group.get(), &result, &in_scalar, &out_scalar);
@@ -484,8 +486,8 @@
   }
 }
 
-TEST(P256_X86_64Test, TestVectors) {
-  return FileTestGTest("crypto/fipsmodule/ec/p256-x86_64_tests.txt",
+TEST(P256_NistzTest, TestVectors) {
+  return FileTestGTest("crypto/fipsmodule/ec/p256-nistz_tests.txt",
                        [](FileTest *t) {
     if (t->GetParameter() == "Negate") {
       TestNegate(t);
@@ -504,7 +506,7 @@
 }
 
 // Instrument the functions covered in TestVectors for ABI checking.
-TEST(P256_X86_64Test, ABI) {
+TEST(P256_NistzTest, ABI) {
   BN_ULONG a[P256_LIMBS], b[P256_LIMBS], c[P256_LIMBS];
   OPENSSL_memset(a, 0x01, sizeof(a));
   // These functions are all constant-time, so it is only necessary to
diff --git a/src/crypto/fipsmodule/ec/p256-x86_64_tests.txt b/src/crypto/fipsmodule/ec/p256-nistz_tests.txt
similarity index 100%
rename from src/crypto/fipsmodule/ec/p256-x86_64_tests.txt
rename to src/crypto/fipsmodule/ec/p256-nistz_tests.txt
diff --git a/src/crypto/fipsmodule/ec/p256.c b/src/crypto/fipsmodule/ec/p256.c
index 9f5694c..816e6f1 100644
--- a/src/crypto/fipsmodule/ec/p256.c
+++ b/src/crypto/fipsmodule/ec/p256.c
@@ -22,7 +22,6 @@
 #include <openssl/ec.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 #include <assert.h>
 #include <string.h>
@@ -31,8 +30,10 @@
 #include "../delocate.h"
 #include "./internal.h"
 
+#if defined(OPENSSL_NO_ASM)
+#define FIAT_P256_NO_ASM
+#endif
 
-// MSVC does not implement uint128_t, and crashes with intrinsics
 #if defined(BORINGSSL_HAS_UINT128)
 #define BORINGSSL_NISTP256_64BIT 1
 #include "../../../third_party/fiat/p256_64.h"
@@ -79,17 +80,22 @@
   fiat_p256_selectznz(out, !!t, z, nz);
 }
 
+static void fiat_p256_from_words(fiat_p256_felem out,
+                                 const BN_ULONG in[32 / sizeof(BN_ULONG)]) {
+  // Typically, |BN_ULONG| and |fiat_p256_limb_t| will be the same type, but on
+  // 64-bit platforms without |uint128_t|, they are different. However, on
+  // little-endian systems, |uint64_t[4]| and |uint32_t[8]| have the same
+  // layout.
+  OPENSSL_memcpy(out, in, 32);
+}
+
 static void fiat_p256_from_generic(fiat_p256_felem out, const EC_FELEM *in) {
-  fiat_p256_from_bytes(out, in->bytes);
+  fiat_p256_from_words(out, in->words);
 }
 
 static void fiat_p256_to_generic(EC_FELEM *out, const fiat_p256_felem in) {
-  // This works because 256 is a multiple of 64, so there are no excess bytes to
-  // zero when rounding up to |BN_ULONG|s.
-  OPENSSL_STATIC_ASSERT(
-      256 / 8 == sizeof(BN_ULONG) * ((256 + BN_BITS2 - 1) / BN_BITS2),
-      "fiat_p256_to_bytes leaves bytes uninitialized");
-  fiat_p256_to_bytes(out->bytes, in);
+  // See |fiat_p256_from_words|.
+  OPENSSL_memcpy(out->words, in, 32);
 }
 
 // fiat_p256_inv_square calculates |out| = |in|^{-2}
@@ -392,12 +398,18 @@
   }
 }
 
-// fiat_p256_get_bit returns the |i|th bit in |in|
-static crypto_word_t fiat_p256_get_bit(const uint8_t *in, int i) {
+// fiat_p256_get_bit returns the |i|th bit in |in|.
+static crypto_word_t fiat_p256_get_bit(const EC_SCALAR *in, int i) {
   if (i < 0 || i >= 256) {
     return 0;
   }
-  return (in[i >> 3] >> (i & 7)) & 1;
+#if defined(OPENSSL_64_BIT)
+  static_assert(sizeof(BN_ULONG) == 8, "BN_ULONG was not 64-bit");
+  return (in->words[i >> 6] >> (i & 63)) & 1;
+#else
+  static_assert(sizeof(BN_ULONG) == 4, "BN_ULONG was not 32-bit");
+  return (in->words[i >> 5] >> (i & 31)) & 1;
+#endif
 }
 
 // OPENSSL EC_METHOD FUNCTIONS
@@ -498,12 +510,12 @@
 
     // do other additions every 5 doublings
     if (i % 5 == 0) {
-      crypto_word_t bits = fiat_p256_get_bit(scalar->bytes, i + 4) << 5;
-      bits |= fiat_p256_get_bit(scalar->bytes, i + 3) << 4;
-      bits |= fiat_p256_get_bit(scalar->bytes, i + 2) << 3;
-      bits |= fiat_p256_get_bit(scalar->bytes, i + 1) << 2;
-      bits |= fiat_p256_get_bit(scalar->bytes, i) << 1;
-      bits |= fiat_p256_get_bit(scalar->bytes, i - 1);
+      crypto_word_t bits = fiat_p256_get_bit(scalar, i + 4) << 5;
+      bits |= fiat_p256_get_bit(scalar, i + 3) << 4;
+      bits |= fiat_p256_get_bit(scalar, i + 2) << 3;
+      bits |= fiat_p256_get_bit(scalar, i + 1) << 2;
+      bits |= fiat_p256_get_bit(scalar, i) << 1;
+      bits |= fiat_p256_get_bit(scalar, i - 1);
       crypto_word_t sign, digit;
       ec_GFp_nistp_recode_scalar_bits(&sign, &digit, bits);
 
@@ -543,10 +555,10 @@
     }
 
     // First, look 32 bits upwards.
-    crypto_word_t bits = fiat_p256_get_bit(scalar->bytes, i + 224) << 3;
-    bits |= fiat_p256_get_bit(scalar->bytes, i + 160) << 2;
-    bits |= fiat_p256_get_bit(scalar->bytes, i + 96) << 1;
-    bits |= fiat_p256_get_bit(scalar->bytes, i + 32);
+    crypto_word_t bits = fiat_p256_get_bit(scalar, i + 224) << 3;
+    bits |= fiat_p256_get_bit(scalar, i + 160) << 2;
+    bits |= fiat_p256_get_bit(scalar, i + 96) << 1;
+    bits |= fiat_p256_get_bit(scalar, i + 32);
     // Select the point to add, in constant time.
     fiat_p256_select_point_affine((fiat_p256_limb_t)bits, 15,
                                   fiat_p256_g_pre_comp[1], tmp);
@@ -562,10 +574,10 @@
     }
 
     // Second, look at the current position.
-    bits = fiat_p256_get_bit(scalar->bytes, i + 192) << 3;
-    bits |= fiat_p256_get_bit(scalar->bytes, i + 128) << 2;
-    bits |= fiat_p256_get_bit(scalar->bytes, i + 64) << 1;
-    bits |= fiat_p256_get_bit(scalar->bytes, i);
+    bits = fiat_p256_get_bit(scalar, i + 192) << 3;
+    bits |= fiat_p256_get_bit(scalar, i + 128) << 2;
+    bits |= fiat_p256_get_bit(scalar, i + 64) << 1;
+    bits |= fiat_p256_get_bit(scalar, i);
     // Select the point to add, in constant time.
     fiat_p256_select_point_affine((fiat_p256_limb_t)bits, 15,
                                   fiat_p256_g_pre_comp[0], tmp);
@@ -615,10 +627,10 @@
     // constant-time lookup.
     if (i <= 31) {
       // First, look 32 bits upwards.
-      crypto_word_t bits = fiat_p256_get_bit(g_scalar->bytes, i + 224) << 3;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i + 160) << 2;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i + 96) << 1;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i + 32);
+      crypto_word_t bits = fiat_p256_get_bit(g_scalar, i + 224) << 3;
+      bits |= fiat_p256_get_bit(g_scalar, i + 160) << 2;
+      bits |= fiat_p256_get_bit(g_scalar, i + 96) << 1;
+      bits |= fiat_p256_get_bit(g_scalar, i + 32);
       if (bits != 0) {
         size_t index = (size_t)(bits - 1);
         fiat_p256_point_add(ret[0], ret[1], ret[2], ret[0], ret[1], ret[2],
@@ -629,10 +641,10 @@
       }
 
       // Second, look at the current position.
-      bits = fiat_p256_get_bit(g_scalar->bytes, i + 192) << 3;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i + 128) << 2;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i + 64) << 1;
-      bits |= fiat_p256_get_bit(g_scalar->bytes, i);
+      bits = fiat_p256_get_bit(g_scalar, i + 192) << 3;
+      bits |= fiat_p256_get_bit(g_scalar, i + 128) << 2;
+      bits |= fiat_p256_get_bit(g_scalar, i + 64) << 1;
+      bits |= fiat_p256_get_bit(g_scalar, i);
       if (bits != 0) {
         size_t index = (size_t)(bits - 1);
         fiat_p256_point_add(ret[0], ret[1], ret[2], ret[0], ret[1], ret[2],
@@ -685,7 +697,7 @@
   fiat_p256_mul(Z2_mont, Z2_mont, Z2_mont);
 
   fiat_p256_felem r_Z2;
-  fiat_p256_from_bytes(r_Z2, r->bytes);  // r < order < p, so this is valid.
+  fiat_p256_from_words(r_Z2, r->words);  // r < order < p, so this is valid.
   fiat_p256_mul(r_Z2, r_Z2, Z2_mont);
 
   fiat_p256_felem X;
diff --git a/src/crypto/fipsmodule/ec/scalar.c b/src/crypto/fipsmodule/ec/scalar.c
index e4ae9d7..036049e 100644
--- a/src/crypto/fipsmodule/ec/scalar.c
+++ b/src/crypto/fipsmodule/ec/scalar.c
@@ -54,9 +54,7 @@
 void ec_scalar_to_bytes(const EC_GROUP *group, uint8_t *out, size_t *out_len,
                         const EC_SCALAR *in) {
   size_t len = BN_num_bytes(&group->order);
-  for (size_t i = 0; i < len; i++) {
-    out[len - i - 1] = in->bytes[i];
-  }
+  bn_words_to_big_endian(out, len, in->words, group->order.width);
   *out_len = len;
 }
 
@@ -67,11 +65,7 @@
     return 0;
   }
 
-  OPENSSL_memset(out, 0, sizeof(EC_SCALAR));
-
-  for (size_t i = 0; i < len; i++) {
-    out->bytes[i] = in[len - i - 1];
-  }
+  bn_big_endian_to_words(out->words, group->order.width, in, len);
 
   if (!bn_less_than_words(out->words, group->order.d, group->order.width)) {
     OPENSSL_PUT_ERROR(EC, EC_R_INVALID_SCALAR);
diff --git a/src/crypto/fipsmodule/ec/simple.c b/src/crypto/fipsmodule/ec/simple.c
index b6d9312..58d8121 100644
--- a/src/crypto/fipsmodule/ec/simple.c
+++ b/src/crypto/fipsmodule/ec/simple.c
@@ -330,9 +330,7 @@
 void ec_GFp_simple_felem_to_bytes(const EC_GROUP *group, uint8_t *out,
                                   size_t *out_len, const EC_FELEM *in) {
   size_t len = BN_num_bytes(&group->field);
-  for (size_t i = 0; i < len; i++) {
-    out[i] = in->bytes[len - 1 - i];
-  }
+  bn_words_to_big_endian(out, len, in->words, group->field.width);
   *out_len = len;
 }
 
@@ -343,10 +341,7 @@
     return 0;
   }
 
-  OPENSSL_memset(out, 0, sizeof(EC_FELEM));
-  for (size_t i = 0; i < len; i++) {
-    out->bytes[i] = in[len - 1 - i];
-  }
+  bn_big_endian_to_words(out->words, group->field.width, in, len);
 
   if (!bn_less_than_words(out->words, group->field.d, group->field.width)) {
     OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR);
diff --git a/src/crypto/fipsmodule/ec/simple_mul.c b/src/crypto/fipsmodule/ec/simple_mul.c
index 0e6384e..024155d 100644
--- a/src/crypto/fipsmodule/ec/simple_mul.c
+++ b/src/crypto/fipsmodule/ec/simple_mul.c
@@ -202,9 +202,8 @@
 
   // Store the comb in affine coordinates to shrink the table. (This reduces
   // cache pressure and makes the constant-time selects faster.)
-  OPENSSL_STATIC_ASSERT(
-      OPENSSL_ARRAY_SIZE(comb) == OPENSSL_ARRAY_SIZE(out->comb),
-      "comb sizes did not match");
+  static_assert(OPENSSL_ARRAY_SIZE(comb) == OPENSSL_ARRAY_SIZE(out->comb),
+                "comb sizes did not match");
   return ec_jacobian_to_affine_batch(group, out->comb, comb,
                                      OPENSSL_ARRAY_SIZE(comb));
 }
diff --git a/src/crypto/fipsmodule/ecdh/ecdh.c b/src/crypto/fipsmodule/ecdh/ecdh.c
index 4e6d0bf..25d0702 100644
--- a/src/crypto/fipsmodule/ecdh/ecdh.c
+++ b/src/crypto/fipsmodule/ecdh/ecdh.c
@@ -74,11 +74,15 @@
 #include <openssl/mem.h>
 #include <openssl/sha.h>
 
+#include "../../internal.h"
 #include "../ec/internal.h"
+#include "../service_indicator/internal.h"
 
 
 int ECDH_compute_key_fips(uint8_t *out, size_t out_len, const EC_POINT *pub_key,
                           const EC_KEY *priv_key) {
+  boringssl_ensure_ecc_self_test();
+
   if (priv_key->priv_key == NULL) {
     OPENSSL_PUT_ERROR(ECDH, ECDH_R_NO_PRIVATE_VALUE);
     return 0;
@@ -100,6 +104,7 @@
     return 0;
   }
 
+  FIPS_service_indicator_lock_state();
   switch (out_len) {
     case SHA224_DIGEST_LENGTH:
       SHA224(buf, buflen, out);
@@ -115,8 +120,11 @@
       break;
     default:
       OPENSSL_PUT_ERROR(ECDH, ECDH_R_UNKNOWN_DIGEST_LENGTH);
+      FIPS_service_indicator_unlock_state();
       return 0;
   }
+  FIPS_service_indicator_unlock_state();
 
+  ECDH_verify_service_indicator(priv_key);
   return 1;
 }
diff --git a/src/crypto/fipsmodule/ecdsa/ecdsa.c b/src/crypto/fipsmodule/ecdsa/ecdsa.c
index 5d99903..95b367f 100644
--- a/src/crypto/fipsmodule/ecdsa/ecdsa.c
+++ b/src/crypto/fipsmodule/ecdsa/ecdsa.c
@@ -59,11 +59,11 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/sha.h>
-#include <openssl/type_check.h>
 
 #include "../../internal.h"
 #include "../bn/internal.h"
 #include "../ec/internal.h"
+#include "../service_indicator/internal.h"
 #include "internal.h"
 
 
@@ -78,10 +78,7 @@
   if (digest_len > num_bytes) {
     digest_len = num_bytes;
   }
-  OPENSSL_memset(out, 0, sizeof(EC_SCALAR));
-  for (size_t i = 0; i < digest_len; i++) {
-    out->bytes[i] = digest[digest_len - 1 - i];
-  }
+  bn_big_endian_to_words(out->words, order->width, digest, digest_len);
 
   // If it is still too long, truncate remaining bits with a shift.
   if (8 * digest_len > num_bits) {
@@ -151,8 +148,8 @@
   return 1;
 }
 
-int ECDSA_do_verify(const uint8_t *digest, size_t digest_len,
-                    const ECDSA_SIG *sig, const EC_KEY *eckey) {
+int ecdsa_do_verify_no_self_test(const uint8_t *digest, size_t digest_len,
+                                 const ECDSA_SIG *sig, const EC_KEY *eckey) {
   const EC_GROUP *group = EC_KEY_get0_group(eckey);
   const EC_POINT *pub_key = EC_KEY_get0_public_key(eckey);
   if (group == NULL || pub_key == NULL || sig == NULL) {
@@ -198,6 +195,13 @@
   return 1;
 }
 
+int ECDSA_do_verify(const uint8_t *digest, size_t digest_len,
+                    const ECDSA_SIG *sig, const EC_KEY *eckey) {
+  boringssl_ensure_ecc_self_test();
+
+  return ecdsa_do_verify_no_self_test(digest, digest_len, sig, eckey);
+}
+
 static ECDSA_SIG *ecdsa_sign_impl(const EC_GROUP *group, int *out_retry,
                                   const EC_SCALAR *priv_key, const EC_SCALAR *k,
                                   const uint8_t *digest, size_t digest_len) {
@@ -292,12 +296,16 @@
 ECDSA_SIG *ECDSA_sign_with_nonce_and_leak_private_key_for_testing(
     const uint8_t *digest, size_t digest_len, const EC_KEY *eckey,
     const uint8_t *nonce, size_t nonce_len) {
+  boringssl_ensure_ecc_self_test();
+
   return ecdsa_sign_with_nonce_for_known_answer_test(digest, digest_len, eckey,
                                                      nonce, nonce_len);
 }
 
 ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len,
                          const EC_KEY *eckey) {
+  boringssl_ensure_ecc_self_test();
+
   if (eckey->ecdsa_meth && eckey->ecdsa_meth->sign) {
     OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_NOT_IMPLEMENTED);
     return NULL;
@@ -313,8 +321,11 @@
 
   // Pass a SHA512 hash of the private key and digest as additional data
   // into the RBG. This is a hardening measure against entropy failure.
-  OPENSSL_STATIC_ASSERT(SHA512_DIGEST_LENGTH >= 32,
-                        "additional_data is too large for SHA-512");
+  static_assert(SHA512_DIGEST_LENGTH >= 32,
+                "additional_data is too large for SHA-512");
+
+  FIPS_service_indicator_lock_state();
+
   SHA512_CTX sha;
   uint8_t additional_data[SHA512_DIGEST_LENGTH];
   SHA512_Init(&sha);
@@ -322,17 +333,22 @@
   SHA512_Update(&sha, digest, digest_len);
   SHA512_Final(additional_data, &sha);
 
+  ECDSA_SIG *ret = NULL;
   for (;;) {
     EC_SCALAR k;
     if (!ec_random_nonzero_scalar(group, &k, additional_data)) {
-      return NULL;
+      ret = NULL;
+      goto out;
     }
 
     int retry;
-    ECDSA_SIG *sig =
-        ecdsa_sign_impl(group, &retry, priv_key, &k, digest, digest_len);
-    if (sig != NULL || !retry) {
-      return sig;
+    ret = ecdsa_sign_impl(group, &retry, priv_key, &k, digest, digest_len);
+    if (ret != NULL || !retry) {
+      goto out;
     }
   }
+
+out:
+  FIPS_service_indicator_unlock_state();
+  return ret;
 }
diff --git a/src/crypto/fipsmodule/ecdsa/internal.h b/src/crypto/fipsmodule/ecdsa/internal.h
index 5115dfa..645959f 100644
--- a/src/crypto/fipsmodule/ecdsa/internal.h
+++ b/src/crypto/fipsmodule/ecdsa/internal.h
@@ -31,6 +31,12 @@
                                                        const uint8_t *nonce,
                                                        size_t nonce_len);
 
+// ecdsa_do_verify_no_self_test does the same as |ECDSA_do_verify|, but doesn't
+// try to run the self-test first. This is for use in the self tests themselves,
+// to prevent an infinite loop.
+int ecdsa_do_verify_no_self_test(const uint8_t *digest, size_t digest_len,
+                                 const ECDSA_SIG *sig, const EC_KEY *eckey);
+
 
 #if defined(__cplusplus)
 }
diff --git a/src/crypto/fipsmodule/hmac/hmac.c b/src/crypto/fipsmodule/hmac/hmac.c
index fb57bf2..ca774bc 100644
--- a/src/crypto/fipsmodule/hmac/hmac.c
+++ b/src/crypto/fipsmodule/hmac/hmac.c
@@ -63,6 +63,7 @@
 #include <openssl/mem.h>
 
 #include "../../internal.h"
+#include "../service_indicator/internal.h"
 
 
 uint8_t *HMAC(const EVP_MD *evp_md, const void *key, size_t key_len,
@@ -70,13 +71,22 @@
               unsigned int *out_len) {
   HMAC_CTX ctx;
   HMAC_CTX_init(&ctx);
-  if (!HMAC_Init_ex(&ctx, key, key_len, evp_md, NULL) ||
-      !HMAC_Update(&ctx, data, data_len) ||
-      !HMAC_Final(&ctx, out, out_len)) {
-    out = NULL;
-  }
+
+  // The underlying hash functions should not set the FIPS service indicator
+  // until all operations have completed.
+  FIPS_service_indicator_lock_state();
+  const int ok = HMAC_Init_ex(&ctx, key, key_len, evp_md, NULL) &&
+                 HMAC_Update(&ctx, data, data_len) &&
+                 HMAC_Final(&ctx, out, out_len);
+  FIPS_service_indicator_unlock_state();
 
   HMAC_CTX_cleanup(&ctx);
+
+  if (!ok) {
+    return NULL;
+  }
+
+  HMAC_verify_service_indicator(evp_md);
   return out;
 }
 
@@ -102,6 +112,13 @@
   OPENSSL_cleanse(ctx, sizeof(HMAC_CTX));
 }
 
+void HMAC_CTX_cleanse(HMAC_CTX *ctx) {
+  EVP_MD_CTX_cleanse(&ctx->i_ctx);
+  EVP_MD_CTX_cleanse(&ctx->o_ctx);
+  EVP_MD_CTX_cleanse(&ctx->md_ctx);
+  OPENSSL_cleanse(ctx, sizeof(HMAC_CTX));
+}
+
 void HMAC_CTX_free(HMAC_CTX *ctx) {
   if (ctx == NULL) {
     return;
@@ -113,6 +130,9 @@
 
 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, size_t key_len,
                  const EVP_MD *md, ENGINE *impl) {
+  int ret = 0;
+  FIPS_service_indicator_lock_state();
+
   if (md == NULL) {
     md = ctx->md;
   }
@@ -136,7 +156,7 @@
       if (!EVP_DigestInit_ex(&ctx->md_ctx, md, impl) ||
           !EVP_DigestUpdate(&ctx->md_ctx, key, key_len) ||
           !EVP_DigestFinal_ex(&ctx->md_ctx, key_block, &key_block_len)) {
-        return 0;
+        goto out;
       }
     } else {
       assert(key_len <= sizeof(key_block));
@@ -153,7 +173,7 @@
     }
     if (!EVP_DigestInit_ex(&ctx->i_ctx, md, impl) ||
         !EVP_DigestUpdate(&ctx->i_ctx, pad, EVP_MD_block_size(md))) {
-      return 0;
+      goto out;
     }
 
     for (size_t i = 0; i < EVP_MAX_MD_BLOCK_SIZE; i++) {
@@ -161,17 +181,17 @@
     }
     if (!EVP_DigestInit_ex(&ctx->o_ctx, md, impl) ||
         !EVP_DigestUpdate(&ctx->o_ctx, pad, EVP_MD_block_size(md))) {
-      return 0;
+      goto out;
     }
 
     ctx->md = md;
   }
 
-  if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx, &ctx->i_ctx)) {
-    return 0;
-  }
+  ret = EVP_MD_CTX_copy_ex(&ctx->md_ctx, &ctx->i_ctx);
 
-  return 1;
+out:
+  FIPS_service_indicator_unlock_state();
+  return ret;
 }
 
 int HMAC_Update(HMAC_CTX *ctx, const uint8_t *data, size_t data_len) {
@@ -179,9 +199,11 @@
 }
 
 int HMAC_Final(HMAC_CTX *ctx, uint8_t *out, unsigned int *out_len) {
+  int ret = 0;
   unsigned int i;
   uint8_t buf[EVP_MAX_MD_SIZE];
 
+  FIPS_service_indicator_lock_state();
   // TODO(davidben): The only thing that can officially fail here is
   // |EVP_MD_CTX_copy_ex|, but even that should be impossible in this case.
   if (!EVP_DigestFinal_ex(&ctx->md_ctx, buf, &i) ||
@@ -189,15 +211,22 @@
       !EVP_DigestUpdate(&ctx->md_ctx, buf, i) ||
       !EVP_DigestFinal_ex(&ctx->md_ctx, out, out_len)) {
     *out_len = 0;
-    return 0;
+    goto out;
   }
 
-  return 1;
+  ret = 1;
+
+ out:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    HMAC_verify_service_indicator(ctx->md);
+  }
+  return ret;
 }
 
-size_t HMAC_size(const HMAC_CTX *ctx) {
-  return EVP_MD_size(ctx->md);
-}
+size_t HMAC_size(const HMAC_CTX *ctx) { return EVP_MD_size(ctx->md); }
+
+const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx) { return ctx->md; }
 
 int HMAC_CTX_copy_ex(HMAC_CTX *dest, const HMAC_CTX *src) {
   if (!EVP_MD_CTX_copy_ex(&dest->i_ctx, &src->i_ctx) ||
diff --git a/src/crypto/fipsmodule/modes/asm/ghashv8-armx.pl b/src/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
index 24eb773..74f4b9b 100644
--- a/src/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
+++ b/src/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
@@ -735,6 +735,9 @@
 	s/\.[uisp]?64//o and s/\.16b/\.2d/go;
 	s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o;
 
+	# Switch preprocessor checks to aarch64 versions.
+	s/__ARME([BL])__/__AARCH64E$1__/go;
+
 	print $_,"\n";
     }
 } else {				######## 32-bit code
diff --git a/src/crypto/fipsmodule/modes/cbc.c b/src/crypto/fipsmodule/modes/cbc.c
index 192580e..df8f9ce 100644
--- a/src/crypto/fipsmodule/modes/cbc.c
+++ b/src/crypto/fipsmodule/modes/cbc.c
@@ -49,8 +49,6 @@
 #include <assert.h>
 #include <string.h>
 
-#include <openssl/type_check.h>
-
 #include "internal.h"
 #include "../../internal.h"
 
@@ -116,16 +114,12 @@
   assert(inptr >= outptr || inptr + len <= outptr);
 
   size_t n;
-  union {
-    crypto_word_t t[16 / sizeof(crypto_word_t)];
-    uint8_t c[16];
-  } tmp;
-
+  alignas(16) uint8_t tmp[16];
   if ((inptr >= 32 && outptr <= inptr - 32) || inptr < outptr) {
     // If |out| is at least two blocks behind |in| or completely disjoint, there
     // is no need to decrypt to a temporary block.
-    OPENSSL_STATIC_ASSERT(16 % sizeof(crypto_word_t) == 0,
-                          "block cannot be evenly divided into words");
+    static_assert(16 % sizeof(crypto_word_t) == 0,
+                  "block cannot be evenly divided into words");
     const uint8_t *iv = ivec;
     while (len >= 16) {
       (*block)(in, out, key);
@@ -140,14 +134,14 @@
     }
     OPENSSL_memcpy(ivec, iv, 16);
   } else {
-    OPENSSL_STATIC_ASSERT(16 % sizeof(crypto_word_t) == 0,
-                          "block cannot be evenly divided into words");
+    static_assert(16 % sizeof(crypto_word_t) == 0,
+                  "block cannot be evenly divided into words");
 
     while (len >= 16) {
-      (*block)(in, tmp.c, key);
+      (*block)(in, tmp, key);
       for (n = 0; n < 16; n += sizeof(crypto_word_t)) {
         crypto_word_t c = CRYPTO_load_word_le(in + n);
-        CRYPTO_store_word_le(out + n, tmp.t[n / sizeof(crypto_word_t)] ^
+        CRYPTO_store_word_le(out + n, CRYPTO_load_word_le(tmp + n) ^
                                           CRYPTO_load_word_le(ivec + n));
         CRYPTO_store_word_le(ivec + n, c);
       }
@@ -159,10 +153,10 @@
 
   while (len) {
     uint8_t c;
-    (*block)(in, tmp.c, key);
+    (*block)(in, tmp, key);
     for (n = 0; n < 16 && n < len; ++n) {
       c = in[n];
-      out[n] = tmp.c[n] ^ ivec[n];
+      out[n] = tmp[n] ^ ivec[n];
       ivec[n] = c;
     }
     if (len <= 16) {
diff --git a/src/crypto/fipsmodule/modes/cfb.c b/src/crypto/fipsmodule/modes/cfb.c
index 283a107..37a8184 100644
--- a/src/crypto/fipsmodule/modes/cfb.c
+++ b/src/crypto/fipsmodule/modes/cfb.c
@@ -46,16 +46,13 @@
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  * ==================================================================== */
 
-#include <openssl/type_check.h>
-
 #include <assert.h>
 #include <string.h>
 
 #include "internal.h"
 
 
-OPENSSL_STATIC_ASSERT(16 % sizeof(size_t) == 0,
-                      "block cannot be divided into size_t");
+static_assert(16 % sizeof(size_t) == 0, "block cannot be divided into size_t");
 
 void CRYPTO_cfb128_encrypt(const uint8_t *in, uint8_t *out, size_t len,
                            const AES_KEY *key, uint8_t ivec[16], unsigned *num,
diff --git a/src/crypto/fipsmodule/modes/ctr.c b/src/crypto/fipsmodule/modes/ctr.c
index cea79ad..1688f82 100644
--- a/src/crypto/fipsmodule/modes/ctr.c
+++ b/src/crypto/fipsmodule/modes/ctr.c
@@ -46,8 +46,6 @@
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  * ==================================================================== */
 
-#include <openssl/type_check.h>
-
 #include <assert.h>
 #include <string.h>
 
@@ -70,8 +68,8 @@
   } while (n);
 }
 
-OPENSSL_STATIC_ASSERT(16 % sizeof(crypto_word_t) == 0,
-                      "block cannot be divided into crypto_word_t");
+static_assert(16 % sizeof(crypto_word_t) == 0,
+              "block cannot be divided into crypto_word_t");
 
 // The input encrypted as though 128bit counter mode is being used.  The extra
 // state information to record how much of the 128bit block we have used is
diff --git a/src/crypto/fipsmodule/modes/gcm.c b/src/crypto/fipsmodule/modes/gcm.c
index b010cd5..1a77ec0 100644
--- a/src/crypto/fipsmodule/modes/gcm.c
+++ b/src/crypto/fipsmodule/modes/gcm.c
@@ -52,7 +52,6 @@
 #include <string.h>
 
 #include <openssl/mem.h>
-#include <openssl/cpu.h>
 
 #include "internal.h"
 #include "../../internal.h"
@@ -138,76 +137,69 @@
                        const uint8_t gcm_key[16]) {
   *out_is_avx = 0;
 
-  union {
-    uint64_t u[2];
-    uint8_t c[16];
-  } H;
-
-  OPENSSL_memcpy(H.c, gcm_key, 16);
-
-  // H is stored in host byte order
-  H.u[0] = CRYPTO_bswap8(H.u[0]);
-  H.u[1] = CRYPTO_bswap8(H.u[1]);
-
-  OPENSSL_memcpy(out_key, H.c, 16);
+  // H is stored in host byte order.
+  uint64_t H[2] = {CRYPTO_load_u64_be(gcm_key),
+                   CRYPTO_load_u64_be(gcm_key + 8)};
+  out_key->hi = H[0];
+  out_key->lo = H[1];
 
 #if defined(GHASH_ASM_X86_64)
   if (crypto_gcm_clmul_enabled()) {
-    if (((OPENSSL_ia32cap_get()[1] >> 22) & 0x41) == 0x41) {  // AVX+MOVBE
-      gcm_init_avx(out_table, H.u);
+    if (CRYPTO_is_AVX_capable() && CRYPTO_is_MOVBE_capable()) {
+      gcm_init_avx(out_table, H);
       *out_mult = gcm_gmult_avx;
       *out_hash = gcm_ghash_avx;
       *out_is_avx = 1;
       return;
     }
-    gcm_init_clmul(out_table, H.u);
+    gcm_init_clmul(out_table, H);
     *out_mult = gcm_gmult_clmul;
     *out_hash = gcm_ghash_clmul;
     return;
   }
-  if (gcm_ssse3_capable()) {
-    gcm_init_ssse3(out_table, H.u);
+  if (CRYPTO_is_SSSE3_capable()) {
+    gcm_init_ssse3(out_table, H);
     *out_mult = gcm_gmult_ssse3;
     *out_hash = gcm_ghash_ssse3;
     return;
   }
 #elif defined(GHASH_ASM_X86)
   if (crypto_gcm_clmul_enabled()) {
-    gcm_init_clmul(out_table, H.u);
+    gcm_init_clmul(out_table, H);
     *out_mult = gcm_gmult_clmul;
     *out_hash = gcm_ghash_clmul;
     return;
   }
-  if (gcm_ssse3_capable()) {
-    gcm_init_ssse3(out_table, H.u);
+  if (CRYPTO_is_SSSE3_capable()) {
+    gcm_init_ssse3(out_table, H);
     *out_mult = gcm_gmult_ssse3;
     *out_hash = gcm_ghash_ssse3;
     return;
   }
 #elif defined(GHASH_ASM_ARM)
   if (gcm_pmull_capable()) {
-    gcm_init_v8(out_table, H.u);
+    gcm_init_v8(out_table, H);
     *out_mult = gcm_gmult_v8;
     *out_hash = gcm_ghash_v8;
     return;
   }
 
   if (gcm_neon_capable()) {
-    gcm_init_neon(out_table, H.u);
+    gcm_init_neon(out_table, H);
     *out_mult = gcm_gmult_neon;
     *out_hash = gcm_ghash_neon;
     return;
   }
 #elif defined(GHASH_ASM_PPC64LE)
   if (CRYPTO_is_PPC64LE_vcrypto_capable()) {
-    gcm_init_p8(out_table, H.u);
+    gcm_init_p8(out_table, H);
     *out_mult = gcm_gmult_p8;
     *out_hash = gcm_ghash_p8;
     return;
   }
 #endif
 
-  gcm_init_nohw(out_table, H.u);
+  gcm_init_nohw(out_table, H);
   *out_mult = gcm_gmult_nohw;
   *out_hash = gcm_ghash_nohw;
 }
@@ -723,9 +715,7 @@
 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
 int crypto_gcm_clmul_enabled(void) {
 #if defined(GHASH_ASM_X86) || defined(GHASH_ASM_X86_64)
-  const uint32_t *ia32cap = OPENSSL_ia32cap_get();
-  return (ia32cap[0] & (1 << 24)) &&  // check FXSR bit
-         (ia32cap[1] & (1 << 1));     // check PCLMULQDQ bit
+  return CRYPTO_is_FXSR_capable() && CRYPTO_is_PCLMUL_capable();
 #else
   return 0;
 #endif
diff --git a/src/crypto/fipsmodule/modes/gcm_test.cc b/src/crypto/fipsmodule/modes/gcm_test.cc
index 02ba2d1..d66d8ae 100644
--- a/src/crypto/fipsmodule/modes/gcm_test.cc
+++ b/src/crypto/fipsmodule/modes/gcm_test.cc
@@ -54,8 +54,8 @@
 #include <gtest/gtest.h>
 
 #include <openssl/aes.h>
-#include <openssl/cpu.h>
 
+#include "../../internal.h"
 #include "../../test/abi_test.h"
 #include "../../test/file_test.h"
 #include "../../test/test_util.h"
@@ -136,7 +136,7 @@
 
   alignas(16) u128 Htable[16];
 #if defined(GHASH_ASM_X86) || defined(GHASH_ASM_X86_64)
-  if (gcm_ssse3_capable()) {
+  if (CRYPTO_is_SSSE3_capable()) {
     CHECK_ABI_SEH(gcm_init_ssse3, Htable, kH);
     CHECK_ABI_SEH(gcm_gmult_ssse3, X, Htable);
     for (size_t blocks : kBlockCounts) {
@@ -152,7 +152,7 @@
     }
 
 #if defined(GHASH_ASM_X86_64)
-    if (((OPENSSL_ia32cap_get()[1] >> 22) & 0x41) == 0x41) {  // AVX+MOVBE
+    if (CRYPTO_is_AVX_capable() && CRYPTO_is_MOVBE_capable()) {
       CHECK_ABI_SEH(gcm_init_avx, Htable, kH);
       CHECK_ABI_SEH(gcm_gmult_avx, X, Htable);
       for (size_t blocks : kBlockCounts) {
diff --git a/src/crypto/fipsmodule/modes/internal.h b/src/crypto/fipsmodule/modes/internal.h
index 2fea558..0164aac 100644
--- a/src/crypto/fipsmodule/modes/internal.h
+++ b/src/crypto/fipsmodule/modes/internal.h
@@ -52,7 +52,6 @@
 #include <openssl/base.h>
 
 #include <openssl/aes.h>
-#include <openssl/cpu.h>
 
 #include <stdlib.h>
 #include <string.h>
@@ -254,10 +253,6 @@
 void gcm_ghash_clmul(uint64_t Xi[2], const u128 Htable[16], const uint8_t *inp,
                      size_t len);
 
-OPENSSL_INLINE char gcm_ssse3_capable(void) {
-  return (OPENSSL_ia32cap_get()[1] & (1 << (41 - 32))) != 0;
-}
-
 // |gcm_gmult_ssse3| and |gcm_ghash_ssse3| require |Htable| to be
 // 16-byte-aligned, but |gcm_init_ssse3| does not.
 void gcm_init_ssse3(u128 Htable[16], const uint64_t Xi[2]);
diff --git a/src/crypto/fipsmodule/modes/ofb.c b/src/crypto/fipsmodule/modes/ofb.c
index 9d73d8a..5effba6 100644
--- a/src/crypto/fipsmodule/modes/ofb.c
+++ b/src/crypto/fipsmodule/modes/ofb.c
@@ -46,16 +46,13 @@
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  * ==================================================================== */
 
-#include <openssl/type_check.h>
-
 #include <assert.h>
 #include <string.h>
 
 #include "internal.h"
 
 
-OPENSSL_STATIC_ASSERT(16 % sizeof(size_t) == 0,
-                      "block cannot be divided into size_t");
+static_assert(16 % sizeof(size_t) == 0, "block cannot be divided into size_t");
 
 void CRYPTO_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t len,
                            const AES_KEY *key, uint8_t ivec[16], unsigned *num,
diff --git a/src/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20210319.docx b/src/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20210319.docx
new file mode 100644
index 0000000..17fcd25
--- /dev/null
+++ b/src/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20210319.docx
Binary files differ
diff --git a/src/crypto/fipsmodule/rand/ctrdrbg.c b/src/crypto/fipsmodule/rand/ctrdrbg.c
index b2fda1d..805372f 100644
--- a/src/crypto/fipsmodule/rand/ctrdrbg.c
+++ b/src/crypto/fipsmodule/rand/ctrdrbg.c
@@ -12,13 +12,15 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/rand.h>
+#include <openssl/ctrdrbg.h>
 
-#include <openssl/type_check.h>
+#include <assert.h>
+
 #include <openssl/mem.h>
 
 #include "internal.h"
 #include "../cipher/internal.h"
+#include "../service_indicator/internal.h"
 
 
 // Section references in this file refer to SP 800-90Ar1:
@@ -27,6 +29,21 @@
 // See table 3.
 static const uint64_t kMaxReseedCount = UINT64_C(1) << 48;
 
+CTR_DRBG_STATE *CTR_DRBG_new(const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                             const uint8_t *personalization,
+                             size_t personalization_len) {
+  CTR_DRBG_STATE *drbg = OPENSSL_malloc(sizeof(CTR_DRBG_STATE));
+  if (drbg == NULL ||
+      !CTR_DRBG_init(drbg, entropy, personalization, personalization_len)) {
+    CTR_DRBG_free(drbg);
+    return NULL;
+  }
+
+  return drbg;
+}
+
+void CTR_DRBG_free(CTR_DRBG_STATE *state) { OPENSSL_free(state); }
+
 int CTR_DRBG_init(CTR_DRBG_STATE *drbg,
                   const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
                   const uint8_t *personalization, size_t personalization_len) {
@@ -58,20 +75,20 @@
   }
 
   drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, seed_material, 32);
-  OPENSSL_memcpy(drbg->counter.bytes, seed_material + 32, 16);
+  OPENSSL_memcpy(drbg->counter, seed_material + 32, 16);
   drbg->reseed_counter = 1;
 
   return 1;
 }
 
-OPENSSL_STATIC_ASSERT(CTR_DRBG_ENTROPY_LEN % AES_BLOCK_SIZE == 0,
-                      "not a multiple of AES block size");
+static_assert(CTR_DRBG_ENTROPY_LEN % AES_BLOCK_SIZE == 0,
+              "not a multiple of AES block size");
 
 // ctr_inc adds |n| to the last four bytes of |drbg->counter|, treated as a
 // big-endian number.
 static void ctr32_add(CTR_DRBG_STATE *drbg, uint32_t n) {
-  drbg->counter.words[3] =
-      CRYPTO_bswap4(CRYPTO_bswap4(drbg->counter.words[3]) + n);
+  uint32_t ctr = CRYPTO_load_u32_be(drbg->counter + 12);
+  CRYPTO_store_u32_be(drbg->counter + 12, ctr + n);
 }
 
 static int ctr_drbg_update(CTR_DRBG_STATE *drbg, const uint8_t *data,
@@ -86,7 +103,7 @@
   uint8_t temp[CTR_DRBG_ENTROPY_LEN];
   for (size_t i = 0; i < CTR_DRBG_ENTROPY_LEN; i += AES_BLOCK_SIZE) {
     ctr32_add(drbg, 1);
-    drbg->block(drbg->counter.bytes, temp + i, &drbg->ks);
+    drbg->block(drbg->counter, temp + i, &drbg->ks);
   }
 
   for (size_t i = 0; i < data_len; i++) {
@@ -94,7 +111,7 @@
   }
 
   drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, temp, 32);
-  OPENSSL_memcpy(drbg->counter.bytes, temp + 32, 16);
+  OPENSSL_memcpy(drbg->counter, temp + 32, 16);
 
   return 1;
 }
@@ -166,12 +183,12 @@
     if (drbg->ctr) {
       OPENSSL_memset(out, 0, todo);
       ctr32_add(drbg, 1);
-      drbg->ctr(out, out, num_blocks, &drbg->ks, drbg->counter.bytes);
-      ctr32_add(drbg, num_blocks - 1);
+      drbg->ctr(out, out, num_blocks, &drbg->ks, drbg->counter);
+      ctr32_add(drbg, (uint32_t)(num_blocks - 1));
     } else {
       for (size_t i = 0; i < todo; i += AES_BLOCK_SIZE) {
         ctr32_add(drbg, 1);
-        drbg->block(drbg->counter.bytes, out + i, &drbg->ks);
+        drbg->block(drbg->counter, out + i, &drbg->ks);
       }
     }
 
@@ -182,7 +199,7 @@
   if (out_len > 0) {
     uint8_t block[AES_BLOCK_SIZE];
     ctr32_add(drbg, 1);
-    drbg->block(drbg->counter.bytes, block, &drbg->ks);
+    drbg->block(drbg->counter, block, &drbg->ks);
 
     OPENSSL_memcpy(out, block, out_len);
   }
@@ -194,6 +211,7 @@
   }
 
   drbg->reseed_counter++;
+  FIPS_service_indicator_update_state();
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/rand/ctrdrbg_test.cc b/src/crypto/fipsmodule/rand/ctrdrbg_test.cc
index 0cc48b1..e6ebbca 100644
--- a/src/crypto/fipsmodule/rand/ctrdrbg_test.cc
+++ b/src/crypto/fipsmodule/rand/ctrdrbg_test.cc
@@ -14,7 +14,7 @@
 
 #include <gtest/gtest.h>
 
-#include <openssl/rand.h>
+#include <openssl/ctrdrbg.h>
 #include <openssl/sha.h>
 
 #include "internal.h"
@@ -60,6 +60,18 @@
   CTR_DRBG_clear(&drbg);
 }
 
+TEST(CTRDRBGTest, Allocated) {
+  const uint8_t kSeed[CTR_DRBG_ENTROPY_LEN] = {0};
+
+  CTR_DRBG_STATE *allocated = CTR_DRBG_new(kSeed, nullptr, 0);
+  ASSERT_TRUE(allocated);
+  CTR_DRBG_free(allocated);
+
+  allocated = CTR_DRBG_new(kSeed, nullptr, 1<<20);
+  ASSERT_FALSE(allocated);
+  CTR_DRBG_free(allocated);
+}
+
 TEST(CTRDRBGTest, Large) {
   const uint8_t kSeed[CTR_DRBG_ENTROPY_LEN] = {0};
 
diff --git a/src/crypto/fipsmodule/rand/fork_detect.c b/src/crypto/fipsmodule/rand/fork_detect.c
index 8dd2c95..51cf18a 100644
--- a/src/crypto/fipsmodule/rand/fork_detect.c
+++ b/src/crypto/fipsmodule/rand/fork_detect.c
@@ -21,18 +21,17 @@
 #include "fork_detect.h"
 
 #if defined(OPENSSL_LINUX)
+#include <assert.h>
 #include <sys/mman.h>
 #include <unistd.h>
 #include <stdlib.h>
 
-#include <openssl/type_check.h>
-
 #include "../delocate.h"
 #include "../../internal.h"
 
 
 #if defined(MADV_WIPEONFORK)
-OPENSSL_STATIC_ASSERT(MADV_WIPEONFORK == 18, "MADV_WIPEONFORK is not 18");
+static_assert(MADV_WIPEONFORK == 18, "MADV_WIPEONFORK is not 18");
 #else
 #define MADV_WIPEONFORK 18
 #endif
diff --git a/src/crypto/fipsmodule/rand/getrandom_fillin.h b/src/crypto/fipsmodule/rand/getrandom_fillin.h
index 9871854..c0dea35 100644
--- a/src/crypto/fipsmodule/rand/getrandom_fillin.h
+++ b/src/crypto/fipsmodule/rand/getrandom_fillin.h
@@ -32,6 +32,8 @@
 #define EXPECTED_NR_getrandom 384
 #elif defined(OPENSSL_PPC64LE)
 #define EXPECTED_NR_getrandom 359
+#elif defined(OPENSSL_RISCV64)
+#define EXPECTED_NR_getrandom 278
 #endif
 
 #if defined(EXPECTED_NR_getrandom)
diff --git a/src/crypto/fipsmodule/rand/internal.h b/src/crypto/fipsmodule/rand/internal.h
index 127e5d1..3c996f1 100644
--- a/src/crypto/fipsmodule/rand/internal.h
+++ b/src/crypto/fipsmodule/rand/internal.h
@@ -16,7 +16,7 @@
 #define OPENSSL_HEADER_CRYPTO_RAND_INTERNAL_H
 
 #include <openssl/aes.h>
-#include <openssl/cpu.h>
+#include <openssl/ctrdrbg.h>
 
 #include "../../internal.h"
 #include "../modes/internal.h"
@@ -50,10 +50,10 @@
                              int *out_used_cpu);
 
 // RAND_load_entropy supplies |entropy_len| bytes of entropy to the module. The
-// |from_cpu| parameter is true iff the entropy was obtained directly from the
-// CPU.
+// |want_additional_input| parameter is true iff the entropy was obtained from
+// a source other than the system, e.g. directly from the CPU.
 void RAND_load_entropy(const uint8_t *entropy, size_t entropy_len,
-                       int from_cpu);
+                       int want_additional_input);
 
 // RAND_need_entropy is implemented outside of the FIPS module and is called
 // when the module has stopped because it has run out of entropy.
@@ -96,20 +96,13 @@
 
 // CTR_DRBG_STATE contains the state of a CTR_DRBG based on AES-256. See SP
 // 800-90Ar1.
-typedef struct {
+struct ctr_drbg_state_st {
   AES_KEY ks;
   block128_f block;
   ctr128_f ctr;
-  union {
-    uint8_t bytes[16];
-    uint32_t words[4];
-  } counter;
+  uint8_t counter[16];
   uint64_t reseed_counter;
-} CTR_DRBG_STATE;
-
-// See SP 800-90Ar1, table 3.
-#define CTR_DRBG_ENTROPY_LEN 48
-#define CTR_DRBG_MAX_GENERATE_LENGTH 65536
+};
 
 // CTR_DRBG_init initialises |*drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of
 // entropy in |entropy| and, optionally, a personalization string up to
@@ -120,39 +113,17 @@
                                  const uint8_t *personalization,
                                  size_t personalization_len);
 
-// CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy
-// in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of
-// additional data. It returns one on success or zero on error.
-OPENSSL_EXPORT int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg,
-                                   const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
-                                   const uint8_t *additional_data,
-                                   size_t additional_data_len);
-
-// CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional
-// data (if any) and then writes |out_len| random bytes to |out|, where
-// |out_len| <= |CTR_DRBG_MAX_GENERATE_LENGTH|. It returns one on success or
-// zero on error.
-OPENSSL_EXPORT int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out,
-                                     size_t out_len,
-                                     const uint8_t *additional_data,
-                                     size_t additional_data_len);
-
-// CTR_DRBG_clear zeroises the state of |drbg|.
-OPENSSL_EXPORT void CTR_DRBG_clear(CTR_DRBG_STATE *drbg);
-
-
 #if defined(OPENSSL_X86_64) && !defined(OPENSSL_NO_ASM)
 
 OPENSSL_INLINE int have_rdrand(void) {
-  return (OPENSSL_ia32cap_get()[1] & (1u << 30)) != 0;
+  return CRYPTO_is_RDRAND_capable();
 }
 
 // have_fast_rdrand returns true if RDRAND is supported and it's reasonably
 // fast. Concretely the latter is defined by whether the chip is Intel (fast) or
 // not (assumed slow).
 OPENSSL_INLINE int have_fast_rdrand(void) {
-  const uint32_t *const ia32cap = OPENSSL_ia32cap_get();
-  return (ia32cap[1] & (1u << 30)) && (ia32cap[0] & (1u << 30));
+  return CRYPTO_is_RDRAND_capable() && CRYPTO_is_intel_cpu();
 }
 
 // CRYPTO_rdrand writes eight bytes of random data from the hardware RNG to
diff --git a/src/crypto/fipsmodule/rand/rand.c b/src/crypto/fipsmodule/rand/rand.c
index 0fc9fa1..cb1ee7d 100644
--- a/src/crypto/fipsmodule/rand/rand.c
+++ b/src/crypto/fipsmodule/rand/rand.c
@@ -23,9 +23,8 @@
 #endif
 
 #include <openssl/chacha.h>
-#include <openssl/cpu.h>
+#include <openssl/ctrdrbg.h>
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "fork_detect.h"
@@ -163,19 +162,19 @@
 #if defined(BORINGSSL_FIPS)
 
 void CRYPTO_get_seed_entropy(uint8_t *out_entropy, size_t out_entropy_len,
-                             int *out_used_cpu) {
-  *out_used_cpu = 0;
+                             int *out_want_additional_input) {
+  *out_want_additional_input = 0;
   if (have_rdrand() && rdrand(out_entropy, out_entropy_len)) {
-    *out_used_cpu = 1;
+    *out_want_additional_input = 1;
   } else {
     CRYPTO_sysrand_for_seed(out_entropy, out_entropy_len);
   }
 
-#if defined(BORINGSSL_FIPS_BREAK_CRNG)
-  // This breaks the "continuous random number generator test" defined in FIPS
-  // 140-2, section 4.9.2, and implemented in |rand_get_seed|.
-  OPENSSL_memset(out_entropy, 0, out_entropy_len);
-#endif
+  if (boringssl_fips_break_test("CRNG")) {
+    // This breaks the "continuous random number generator test" defined in FIPS
+    // 140-2, section 4.9.2, and implemented in |rand_get_seed|.
+    OPENSSL_memset(out_entropy, 0, out_entropy_len);
+  }
 }
 
 // In passive entropy mode, entropy is supplied from outside of the module via
@@ -184,20 +183,22 @@
 
 struct entropy_buffer {
   // bytes contains entropy suitable for seeding a DRBG.
-  uint8_t bytes[CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
+  uint8_t
+      bytes[CRNGT_BLOCK_SIZE + CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
   // bytes_valid indicates the number of bytes of |bytes| that contain valid
   // data.
   size_t bytes_valid;
-  // from_cpu is true if any of the contents of |bytes| were obtained directly
-  // from the CPU.
-  int from_cpu;
+  // want_additional_input is true if any of the contents of |bytes| were
+  // obtained via a method other than from the kernel. In these cases entropy
+  // from the kernel is also provided via an additional input to the DRBG.
+  int want_additional_input;
 };
 
 DEFINE_BSS_GET(struct entropy_buffer, entropy_buffer);
 DEFINE_STATIC_MUTEX(entropy_buffer_lock);
 
 void RAND_load_entropy(const uint8_t *entropy, size_t entropy_len,
-                       int from_cpu) {
+                       int want_additional_input) {
   struct entropy_buffer *const buffer = entropy_buffer_bss_get();
 
   CRYPTO_STATIC_MUTEX_lock_write(entropy_buffer_lock_bss_get());
@@ -208,14 +209,15 @@
 
   OPENSSL_memcpy(&buffer->bytes[buffer->bytes_valid], entropy, entropy_len);
   buffer->bytes_valid += entropy_len;
-  buffer->from_cpu |= from_cpu && (entropy_len != 0);
+  buffer->want_additional_input |=
+      want_additional_input && (entropy_len != 0);
   CRYPTO_STATIC_MUTEX_unlock_write(entropy_buffer_lock_bss_get());
 }
 
 // get_seed_entropy fills |out_entropy_len| bytes of |out_entropy| from the
 // global |entropy_buffer|.
 static void get_seed_entropy(uint8_t *out_entropy, size_t out_entropy_len,
-                             int *out_used_cpu) {
+                             int *out_want_additional_input) {
   struct entropy_buffer *const buffer = entropy_buffer_bss_get();
   if (out_entropy_len > sizeof(buffer->bytes)) {
     abort();
@@ -228,53 +230,66 @@
     CRYPTO_STATIC_MUTEX_lock_write(entropy_buffer_lock_bss_get());
   }
 
-  *out_used_cpu = buffer->from_cpu;
+  *out_want_additional_input = buffer->want_additional_input;
   OPENSSL_memcpy(out_entropy, buffer->bytes, out_entropy_len);
   OPENSSL_memmove(buffer->bytes, &buffer->bytes[out_entropy_len],
                   buffer->bytes_valid - out_entropy_len);
   buffer->bytes_valid -= out_entropy_len;
   if (buffer->bytes_valid == 0) {
-    buffer->from_cpu = 0;
+    buffer->want_additional_input = 0;
   }
 
   CRYPTO_STATIC_MUTEX_unlock_write(entropy_buffer_lock_bss_get());
 }
 
-// rand_get_seed fills |seed| with entropy and sets |*out_used_cpu| to one if
-// that entropy came directly from the CPU and zero otherwise.
+// rand_get_seed fills |seed| with entropy. In some cases, it will additionally
+// fill |additional_input| with entropy to supplement |seed|. It sets
+// |*out_additional_input_len| to the number of extra bytes.
 static void rand_get_seed(struct rand_thread_state *state,
                           uint8_t seed[CTR_DRBG_ENTROPY_LEN],
-                          int *out_used_cpu) {
-  if (!state->last_block_valid) {
-    int unused;
-    get_seed_entropy(state->last_block, sizeof(state->last_block), &unused);
-    state->last_block_valid = 1;
+                          uint8_t additional_input[CTR_DRBG_ENTROPY_LEN],
+                          size_t *out_additional_input_len) {
+  uint8_t entropy_bytes[sizeof(state->last_block) +
+                        CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
+  uint8_t *entropy = entropy_bytes;
+  size_t entropy_len = sizeof(entropy_bytes);
+
+  if (state->last_block_valid) {
+    // No need to fill |state->last_block| with entropy from the read.
+    entropy += sizeof(state->last_block);
+    entropy_len -= sizeof(state->last_block);
   }
 
-  uint8_t entropy[CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
-  get_seed_entropy(entropy, sizeof(entropy), out_used_cpu);
+  int want_additional_input;
+  get_seed_entropy(entropy, entropy_len, &want_additional_input);
+
+  if (!state->last_block_valid) {
+    OPENSSL_memcpy(state->last_block, entropy, sizeof(state->last_block));
+    entropy += sizeof(state->last_block);
+    entropy_len -= sizeof(state->last_block);
+  }
 
   // See FIPS 140-2, section 4.9.2. This is the “continuous random number
   // generator test” which causes the program to randomly abort. Hopefully the
   // rate of failure is small enough not to be a problem in practice.
-  if (CRYPTO_memcmp(state->last_block, entropy, CRNGT_BLOCK_SIZE) == 0) {
+  if (CRYPTO_memcmp(state->last_block, entropy, sizeof(state->last_block)) ==
+      0) {
     fprintf(stderr, "CRNGT failed.\n");
     BORINGSSL_FIPS_abort();
   }
 
-  OPENSSL_STATIC_ASSERT(sizeof(entropy) % CRNGT_BLOCK_SIZE == 0, "");
-  for (size_t i = CRNGT_BLOCK_SIZE; i < sizeof(entropy);
-       i += CRNGT_BLOCK_SIZE) {
+  assert(entropy_len % CRNGT_BLOCK_SIZE == 0);
+  for (size_t i = CRNGT_BLOCK_SIZE; i < entropy_len; i += CRNGT_BLOCK_SIZE) {
     if (CRYPTO_memcmp(entropy + i - CRNGT_BLOCK_SIZE, entropy + i,
                       CRNGT_BLOCK_SIZE) == 0) {
       fprintf(stderr, "CRNGT failed.\n");
       BORINGSSL_FIPS_abort();
     }
   }
-  OPENSSL_memcpy(state->last_block,
-                 entropy + sizeof(entropy) - CRNGT_BLOCK_SIZE,
+  OPENSSL_memcpy(state->last_block, entropy + entropy_len - CRNGT_BLOCK_SIZE,
                  CRNGT_BLOCK_SIZE);
 
+  assert(entropy_len == BORINGSSL_FIPS_OVERREAD * CTR_DRBG_ENTROPY_LEN);
   OPENSSL_memcpy(seed, entropy, CTR_DRBG_ENTROPY_LEN);
 
   for (size_t i = 1; i < BORINGSSL_FIPS_OVERREAD; i++) {
@@ -282,19 +297,30 @@
       seed[j] ^= entropy[CTR_DRBG_ENTROPY_LEN * i + j];
     }
   }
+
+  // If we used something other than system entropy then also
+  // opportunistically read from the system. This avoids solely relying on the
+  // hardware once the entropy pool has been initialized.
+  *out_additional_input_len = 0;
+  if (want_additional_input &&
+      CRYPTO_sysrand_if_available(additional_input, CTR_DRBG_ENTROPY_LEN)) {
+    *out_additional_input_len = CTR_DRBG_ENTROPY_LEN;
+  }
 }
 
 #else
 
-// rand_get_seed fills |seed| with entropy and sets |*out_used_cpu| to one if
-// that entropy came directly from the CPU and zero otherwise.
+// rand_get_seed fills |seed| with entropy. In some cases, it will additionally
+// fill |additional_input| with entropy to supplement |seed|. It sets
+// |*out_additional_input_len| to the number of extra bytes.
 static void rand_get_seed(struct rand_thread_state *state,
                           uint8_t seed[CTR_DRBG_ENTROPY_LEN],
-                          int *out_used_cpu) {
+                          uint8_t additional_input[CTR_DRBG_ENTROPY_LEN],
+                          size_t *out_additional_input_len) {
   // If not in FIPS mode, we don't overread from the system entropy source and
   // we don't depend only on the hardware RDRAND.
   CRYPTO_sysrand_for_seed(seed, CTR_DRBG_ENTROPY_LEN);
-  *out_used_cpu = 0;
+  *out_additional_input_len = 0;
 }
 
 #endif
@@ -353,20 +379,9 @@
 
     state->last_block_valid = 0;
     uint8_t seed[CTR_DRBG_ENTROPY_LEN];
-    int used_cpu;
-    rand_get_seed(state, seed, &used_cpu);
-
     uint8_t personalization[CTR_DRBG_ENTROPY_LEN] = {0};
     size_t personalization_len = 0;
-#if defined(OPENSSL_URANDOM)
-    // If we used RDRAND, also opportunistically read from the system. This
-    // avoids solely relying on the hardware once the entropy pool has been
-    // initialized.
-    if (used_cpu &&
-        CRYPTO_sysrand_if_available(personalization, sizeof(personalization))) {
-      personalization_len = sizeof(personalization);
-    }
-#endif
+    rand_get_seed(state, seed, personalization, &personalization_len);
 
     if (!CTR_DRBG_init(&state->drbg, seed, personalization,
                        personalization_len)) {
@@ -393,8 +408,10 @@
   if (state->calls >= kReseedInterval ||
       state->fork_generation != fork_generation) {
     uint8_t seed[CTR_DRBG_ENTROPY_LEN];
-    int used_cpu;
-    rand_get_seed(state, seed, &used_cpu);
+    uint8_t reseed_additional_data[CTR_DRBG_ENTROPY_LEN] = {0};
+    size_t reseed_additional_data_len = 0;
+    rand_get_seed(state, seed, reseed_additional_data,
+                  &reseed_additional_data_len);
 #if defined(BORINGSSL_FIPS)
     // Take a read lock around accesses to |state->drbg|. This is needed to
     // avoid returning bad entropy if we race with
@@ -406,7 +423,8 @@
     // kernel, syscalls made with |syscall| did not abort the transaction.
     CRYPTO_STATIC_MUTEX_lock_read(state_clear_all_lock_bss_get());
 #endif
-    if (!CTR_DRBG_reseed(&state->drbg, seed, NULL, 0)) {
+    if (!CTR_DRBG_reseed(&state->drbg, seed, reseed_additional_data,
+                         reseed_additional_data_len)) {
       abort();
     }
     state->calls = 0;
@@ -455,3 +473,10 @@
 int RAND_pseudo_bytes(uint8_t *buf, size_t len) {
   return RAND_bytes(buf, len);
 }
+
+void RAND_get_system_entropy_for_custom_prng(uint8_t *buf, size_t len) {
+  if (len > 256) {
+    abort();
+  }
+  CRYPTO_sysrand_for_seed(buf, len);
+}
diff --git a/src/crypto/fipsmodule/rand/urandom.c b/src/crypto/fipsmodule/rand/urandom.c
index fa0a333..77dad74 100644
--- a/src/crypto/fipsmodule/rand/urandom.c
+++ b/src/crypto/fipsmodule/rand/urandom.c
@@ -62,14 +62,11 @@
 #include <sys/random.h>
 #endif
 
-#if defined(OPENSSL_FREEBSD)
-#define URANDOM_BLOCKS_FOR_ENTROPY
-#if __FreeBSD__ >= 12
+#if defined(OPENSSL_FREEBSD) && __FreeBSD__ >= 12
 // getrandom is supported in FreeBSD 12 and up.
 #define FREEBSD_GETRANDOM
 #include <sys/random.h>
 #endif
-#endif
 
 #include <openssl/thread.h>
 #include <openssl/mem.h>
@@ -135,7 +132,7 @@
   }
 
   value[length] = 0;
-  if (strcasecmp(value, "true") == 0) {
+  if (OPENSSL_strcasecmp(value, "true") == 0) {
     *extra_getrandom_flags_for_seed_bss_get() = GRND_RANDOM;
   }
 #endif
@@ -190,15 +187,21 @@
   return;
 #endif
 
-  // Android FIPS builds must support getrandom.
-#if defined(BORINGSSL_FIPS) && defined(OPENSSL_ANDROID)
+  // FIPS builds must support getrandom.
+  //
+  // Historically, only Android FIPS builds required getrandom, while Linux FIPS
+  // builds had a /dev/urandom fallback which used RNDGETENTCNT as a poor
+  // approximation for getrandom's blocking behavior. This is now removed, but
+  // avoid making assumptions on this removal until March 2023, in case it needs
+  // to be restored. This comment can be deleted after March 2023.
+#if defined(BORINGSSL_FIPS)
   perror("getrandom not found");
   abort();
 #endif
 
   int fd;
   do {
-    fd = open("/dev/urandom", O_RDONLY);
+    fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
   } while (fd == -1 && errno == EINTR);
 
   if (fd < 0) {
@@ -206,20 +209,6 @@
     abort();
   }
 
-  int flags = fcntl(fd, F_GETFD);
-  if (flags == -1) {
-    // Native Client doesn't implement |fcntl|.
-    if (errno != ENOSYS) {
-      perror("failed to get flags from urandom fd");
-      abort();
-    }
-  } else {
-    flags |= FD_CLOEXEC;
-    if (fcntl(fd, F_SETFD, flags) == -1) {
-      perror("failed to set FD_CLOEXEC on urandom fd");
-      abort();
-    }
-  }
   *urandom_fd_bss_get() = fd;
 }
 
@@ -269,29 +258,6 @@
 #endif  // USE_NR_getrandom
     return;
   }
-
-#if defined(BORINGSSL_FIPS) && !defined(URANDOM_BLOCKS_FOR_ENTROPY)
-  // In FIPS mode on platforms where urandom doesn't block at startup, we ensure
-  // that the kernel has sufficient entropy before continuing. This is
-  // automatically handled by getrandom, which requires that the entropy pool
-  // has been initialised, but for urandom we have to poll.
-  for (;;) {
-    int entropy_bits;
-    if (ioctl(fd, RNDGETENTCNT, &entropy_bits)) {
-      fprintf(stderr,
-              "RNDGETENTCNT on /dev/urandom failed. We cannot continue in this "
-              "case when in FIPS mode.\n");
-      abort();
-    }
-
-    static const int kBitsNeeded = 256;
-    if (entropy_bits >= kBitsNeeded) {
-      break;
-    }
-
-    usleep(250000);
-  }
-#endif  // BORINGSSL_FIPS && !URANDOM_BLOCKS_FOR_ENTROPY
 }
 
 // fill_with_entropy writes |len| bytes of entropy into |out|. It returns one
diff --git a/src/crypto/fipsmodule/rand/urandom_test.cc b/src/crypto/fipsmodule/rand/urandom_test.cc
index b9e9007..13ac610 100644
--- a/src/crypto/fipsmodule/rand/urandom_test.cc
+++ b/src/crypto/fipsmodule/rand/urandom_test.cc
@@ -15,6 +15,7 @@
 #include <gtest/gtest.h>
 #include <stdlib.h>
 
+#include <openssl/ctrdrbg.h>
 #include <openssl/rand.h>
 
 #include "internal.h"
@@ -44,7 +45,6 @@
     kGetRandom,
     kOpen,
     kUrandomRead,
-    kUrandomIoctl,
     kAbort,
   };
 
@@ -76,11 +76,6 @@
     return e;
   }
 
-  static Event UrandomIoctl() {
-    Event e(Syscall::kUrandomIoctl);
-    return e;
-  }
-
   static Event Abort() {
     Event e(Syscall::kAbort);
     return e;
@@ -91,7 +86,7 @@
 
     switch (type) {
       case Syscall::kGetRandom:
-        snprintf(buf, sizeof(buf), "getrandom(_, %zu, %d)", length, flags);
+        snprintf(buf, sizeof(buf), "getrandom(_, %zu, %u)", length, flags);
         break;
 
       case Syscall::kOpen:
@@ -102,9 +97,6 @@
         snprintf(buf, sizeof(buf), "read(urandom_fd, _, %zu)", length);
         break;
 
-      case Syscall::kUrandomIoctl:
-        return "ioctl(urandom_fd, RNDGETENTCNT, _)";
-
       case Syscall::kAbort:
         return "abort()";
     }
@@ -138,14 +130,11 @@
 static const unsigned NO_URANDOM = 2;
 // getrandom always returns |EAGAIN| if given |GRNG_NONBLOCK|.
 static const unsigned GETRANDOM_NOT_READY = 4;
-// The ioctl on urandom returns only 255 bits of entropy the first time that
-// it's called.
-static const unsigned URANDOM_NOT_READY = 8;
 // getrandom gives |EINVAL| unless |NO_GETRANDOM| is set.
-static const unsigned GETRANDOM_ERROR = 16;
+static const unsigned GETRANDOM_ERROR = 8;
 // Reading from /dev/urandom gives |EINVAL|.
-static const unsigned URANDOM_ERROR = 32;
-static const unsigned NEXT_FLAG = 64;
+static const unsigned URANDOM_ERROR = 16;
+static const unsigned NEXT_FLAG = 32;
 
 // GetTrace runs |thunk| in a forked process and observes the resulting system
 // calls using ptrace. It simulates a variety of failures based on the contents
@@ -203,8 +192,6 @@
     const auto syscall_number = regs.orig_rax;
 
     bool is_opening_urandom = false;
-    bool is_urandom_ioctl = false;
-    uintptr_t ioctl_output_addr = 0;
     // inject_error is zero to indicate that the system call should run
     // normally. Otherwise it's, e.g. -EINVAL, to indicate that the system call
     // should not run and that error should be injected on return.
@@ -250,16 +237,6 @@
         }
         break;
       }
-
-      case __NR_ioctl: {
-        const int ioctl_fd = regs.rdi;
-        if (urandom_fd >= 0 && ioctl_fd == urandom_fd &&
-            regs.rsi == RNDGETENTCNT) {
-          out_trace->push_back(Event::UrandomIoctl());
-          is_urandom_ioctl = true;
-          ioctl_output_addr = regs.rdx;
-        }
-      }
     }
 
     if (inject_error) {
@@ -293,33 +270,6 @@
     } else if (is_opening_urandom) {
       ASSERT_EQ(0, ptrace(PTRACE_GETREGS, child_pid, nullptr, &regs));
       urandom_fd = regs.rax;
-    } else if (is_urandom_ioctl) {
-      // The result is the number of bits of entropy that the kernel currently
-      // believes that it has. urandom.c waits until 256 bits are ready.
-      int result = 256;
-
-      // If we are simulating urandom not being ready then we have the ioctl
-      // indicate one too few bits of entropy the first time it's queried.
-      if (flags & URANDOM_NOT_READY) {
-        result--;
-        flags &= ~URANDOM_NOT_READY;
-      }
-
-      // ptrace always works with ill-defined "words", which appear to be 64-bit
-      // on x86-64. Since the ioctl result is a 32-bit int, do a
-      // read-modify-write to inject the answer.
-      const uintptr_t aligned_addr = ioctl_output_addr & ~7;
-      const uintptr_t offset = ioctl_output_addr - aligned_addr;
-      union {
-        uint64_t word;
-        uint8_t bytes[8];
-      } u;
-      u.word = ptrace(PTRACE_PEEKDATA, child_pid,
-                      reinterpret_cast<void *>(aligned_addr), nullptr);
-      memcpy(&u.bytes[offset], &result, sizeof(result));
-      ASSERT_EQ(0, ptrace(PTRACE_POKEDATA, child_pid,
-                          reinterpret_cast<void *>(aligned_addr),
-                          reinterpret_cast<void *>(u.word)));
     }
   }
 }
@@ -346,7 +296,6 @@
 #endif
 
   std::vector<Event> ret;
-  bool urandom_probed = false;
   bool getrandom_ready = false;
 
   // Probe for getrandom support
@@ -355,32 +304,19 @@
   std::function<bool(bool, size_t)> sysrand;
 
   if (flags & NO_GETRANDOM) {
+    if (is_fips) {
+      // FIPS builds require getrandom.
+      ret.push_back(Event::Abort());
+      return ret;
+    }
+
     ret.push_back(Event::Open("/dev/urandom"));
     if (flags & NO_URANDOM) {
       ret.push_back(Event::Abort());
       return ret;
     }
 
-    wait_for_entropy = [&ret, &urandom_probed, flags] {
-      if (!is_fips || urandom_probed) {
-        return;
-      }
-
-      // Probe urandom for entropy.
-      ret.push_back(Event::UrandomIoctl());
-      if (flags & URANDOM_NOT_READY) {
-        // If the first attempt doesn't report enough entropy, probe
-        // repeatedly until it does, which will happen with the second attempt.
-        ret.push_back(Event::UrandomIoctl());
-      }
-
-      urandom_probed = true;
-    };
-
-    sysrand = [&ret, &wait_for_entropy, flags](bool block, size_t len) {
-      if (block) {
-        wait_for_entropy();
-      }
+    sysrand = [&ret, flags](bool block, size_t len) {
       ret.push_back(Event::UrandomRead(len));
       if (flags & URANDOM_ERROR) {
         ret.push_back(Event::Abort());
@@ -419,8 +355,7 @@
   if (!have_rdrand()) {
     if ((!have_fork_detection() && !sysrand(true, kAdditionalDataLength)) ||
         // Initialise CRNGT.
-        (is_fips && !sysrand(true, 16)) ||
-        !sysrand(true, kSeedLength) ||
+        !sysrand(true, kSeedLength + (is_fips ? 16 : 0)) ||
         // Second entropy draw.
         (!have_fork_detection() && !sysrand(true, kAdditionalDataLength))) {
       return ret;
@@ -457,11 +392,6 @@
           }
           break;
 
-        case Event::Syscall::kUrandomIoctl:
-          ADD_FAILURE() << "Urandom polling found with RDRAND: "
-                        << ToString(events);
-          break;
-
         default:
           break;
       }
@@ -483,7 +413,6 @@
     TRACE_FLAG(NO_GETRANDOM);
     TRACE_FLAG(NO_URANDOM);
     TRACE_FLAG(GETRANDOM_NOT_READY);
-    TRACE_FLAG(URANDOM_NOT_READY);
     TRACE_FLAG(GETRANDOM_ERROR);
     TRACE_FLAG(URANDOM_ERROR);
 
diff --git a/src/crypto/fipsmodule/rsa/internal.h b/src/crypto/fipsmodule/rsa/internal.h
index d9d6fac..1cb3b5f 100644
--- a/src/crypto/fipsmodule/rsa/internal.h
+++ b/src/crypto/fipsmodule/rsa/internal.h
@@ -124,6 +124,28 @@
 extern const size_t kBoringSSLRSASqrtTwoLen;
 
 
+// Functions that avoid self-tests.
+//
+// Self-tests need to call functions that don't try and ensure that the
+// self-tests have passed. These functions, in turn, need to limit themselves
+// to such functions too.
+//
+// These functions are the same as their public versions, but skip the self-test
+// check.
+
+int rsa_verify_no_self_test(int hash_nid, const uint8_t *digest,
+                            size_t digest_len, const uint8_t *sig,
+                            size_t sig_len, RSA *rsa);
+
+int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
+                                size_t max_out, const uint8_t *in,
+                                size_t in_len, int padding);
+
+int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest,
+                          unsigned digest_len, uint8_t *out, unsigned *out_len,
+                          RSA *rsa);
+
+
 #if defined(__cplusplus)
 }  // extern C
 #endif
diff --git a/src/crypto/fipsmodule/rsa/padding.c b/src/crypto/fipsmodule/rsa/padding.c
index 28f1b45..0dafed4 100644
--- a/src/crypto/fipsmodule/rsa/padding.c
+++ b/src/crypto/fipsmodule/rsa/padding.c
@@ -67,6 +67,7 @@
 #include <openssl/sha.h>
 
 #include "internal.h"
+#include "../service_indicator/internal.h"
 #include "../../internal.h"
 
 
@@ -145,20 +146,17 @@
   return 1;
 }
 
-static int rand_nonzero(uint8_t *out, size_t len) {
-  if (!RAND_bytes(out, len)) {
-    return 0;
-  }
+static void rand_nonzero(uint8_t *out, size_t len) {
+  FIPS_service_indicator_lock_state();
+  RAND_bytes(out, len);
 
   for (size_t i = 0; i < len; i++) {
     while (out[i] == 0) {
-      if (!RAND_bytes(out + i, 1)) {
-        return 0;
-      }
+      RAND_bytes(out + i, 1);
     }
   }
 
-  return 1;
+  FIPS_service_indicator_unlock_state();
 }
 
 int RSA_padding_add_PKCS1_type_2(uint8_t *to, size_t to_len,
@@ -178,10 +176,7 @@
   to[1] = 2;
 
   size_t padding_len = to_len - 3 - from_len;
-  if (!rand_nonzero(to + 2, padding_len)) {
-    return 0;
-  }
-
+  rand_nonzero(to + 2, padding_len);
   to[2 + padding_len] = 0;
   OPENSSL_memcpy(to + to_len - from_len, from, from_len);
   return 1;
@@ -275,6 +270,7 @@
   int ret = 0;
   EVP_MD_CTX ctx;
   EVP_MD_CTX_init(&ctx);
+  FIPS_service_indicator_lock_state();
 
   size_t md_len = EVP_MD_size(md);
 
@@ -310,6 +306,7 @@
 
 err:
   EVP_MD_CTX_cleanup(&ctx);
+  FIPS_service_indicator_unlock_state();
   return ret;
 }
 
@@ -346,23 +343,25 @@
   uint8_t *seed = to + 1;
   uint8_t *db = to + mdlen + 1;
 
+  uint8_t *dbmask = NULL;
+  int ret = 0;
+  FIPS_service_indicator_lock_state();
   if (!EVP_Digest(param, param_len, db, NULL, md, NULL)) {
-    return 0;
+    goto out;
   }
   OPENSSL_memset(db + mdlen, 0, emlen - from_len - 2 * mdlen - 1);
   db[emlen - from_len - mdlen - 1] = 0x01;
   OPENSSL_memcpy(db + emlen - from_len - mdlen, from, from_len);
   if (!RAND_bytes(seed, mdlen)) {
-    return 0;
+    goto out;
   }
 
-  uint8_t *dbmask = OPENSSL_malloc(emlen - mdlen);
+  dbmask = OPENSSL_malloc(emlen - mdlen);
   if (dbmask == NULL) {
     OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
-    return 0;
+    goto out;
   }
 
-  int ret = 0;
   if (!PKCS1_MGF1(dbmask, emlen - mdlen, seed, mdlen, mgf1md)) {
     goto out;
   }
@@ -381,6 +380,7 @@
 
 out:
   OPENSSL_free(dbmask);
+  FIPS_service_indicator_unlock_state();
   return ret;
 }
 
@@ -410,6 +410,7 @@
   }
 
   size_t dblen = from_len - mdlen - 1;
+  FIPS_service_indicator_lock_state();
   db = OPENSSL_malloc(dblen);
   if (db == NULL) {
     OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
@@ -470,6 +471,7 @@
   OPENSSL_memcpy(out, db + one_index, mlen);
   *out_len = mlen;
   OPENSSL_free(db);
+  FIPS_service_indicator_unlock_state();
   return 1;
 
 decoding_err:
@@ -478,6 +480,7 @@
   OPENSSL_PUT_ERROR(RSA, RSA_R_OAEP_DECODING_ERROR);
  err:
   OPENSSL_free(db);
+  FIPS_service_indicator_unlock_state();
   return 0;
 }
 
@@ -486,28 +489,23 @@
 int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash,
                               const EVP_MD *Hash, const EVP_MD *mgf1Hash,
                               const uint8_t *EM, int sLen) {
-  int i;
-  int ret = 0;
-  int maskedDBLen, MSBits, emLen;
-  size_t hLen;
-  const uint8_t *H;
-  uint8_t *DB = NULL;
-  EVP_MD_CTX ctx;
-  uint8_t H_[EVP_MAX_MD_SIZE];
-  EVP_MD_CTX_init(&ctx);
-
   if (mgf1Hash == NULL) {
     mgf1Hash = Hash;
   }
 
-  hLen = EVP_MD_size(Hash);
+  int ret = 0;
+  uint8_t *DB = NULL;
+  EVP_MD_CTX ctx;
+  EVP_MD_CTX_init(&ctx);
+  FIPS_service_indicator_lock_state();
 
   // Negative sLen has special meanings:
   //	-1	sLen == hLen
   //	-2	salt length is autorecovered from signature
   //	-N	reserved
+  size_t hLen = EVP_MD_size(Hash);
   if (sLen == -1) {
-    sLen = hLen;
+    sLen = (int)hLen;
   } else if (sLen == -2) {
     sLen = -2;
   } else if (sLen < -2) {
@@ -515,8 +513,8 @@
     goto err;
   }
 
-  MSBits = (BN_num_bits(rsa->n) - 1) & 0x7;
-  emLen = RSA_size(rsa);
+  unsigned MSBits = (BN_num_bits(rsa->n) - 1) & 0x7;
+  size_t emLen = RSA_size(rsa);
   if (EM[0] & (0xFF << MSBits)) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_FIRST_OCTET_INVALID);
     goto err;
@@ -525,8 +523,9 @@
     EM++;
     emLen--;
   }
-  if (emLen < (int)hLen + 2 || emLen < ((int)hLen + sLen + 2)) {
-    // sLen can be small negative
+  // |sLen| may be -2 for the non-standard salt length recovery mode.
+  if (emLen < hLen + 2 ||
+      (sLen >= 0 && emLen < hLen + (size_t)sLen + 2)) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
     goto err;
   }
@@ -534,8 +533,8 @@
     OPENSSL_PUT_ERROR(RSA, RSA_R_LAST_OCTET_INVALID);
     goto err;
   }
-  maskedDBLen = emLen - hLen - 1;
-  H = EM + maskedDBLen;
+  size_t maskedDBLen = emLen - hLen - 1;
+  const uint8_t *H = EM + maskedDBLen;
   DB = OPENSSL_malloc(maskedDBLen);
   if (!DB) {
     OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
@@ -544,41 +543,49 @@
   if (!PKCS1_MGF1(DB, maskedDBLen, H, hLen, mgf1Hash)) {
     goto err;
   }
-  for (i = 0; i < maskedDBLen; i++) {
+  for (size_t i = 0; i < maskedDBLen; i++) {
     DB[i] ^= EM[i];
   }
   if (MSBits) {
     DB[0] &= 0xFF >> (8 - MSBits);
   }
-  for (i = 0; DB[i] == 0 && i < (maskedDBLen - 1); i++) {
+  // This step differs slightly from EMSA-PSS-VERIFY (RFC 8017) step 10 because
+  // it accepts a non-standard salt recovery flow. DB should be some number of
+  // zeros, a one, then the salt.
+  size_t salt_start;
+  for (salt_start = 0; DB[salt_start] == 0 && salt_start < maskedDBLen - 1;
+       salt_start++) {
     ;
   }
-  if (DB[i++] != 0x1) {
+  if (DB[salt_start] != 0x1) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_SLEN_RECOVERY_FAILED);
     goto err;
   }
-  if (sLen >= 0 && (maskedDBLen - i) != sLen) {
+  salt_start++;
+  // If a salt length was specified, check it matches.
+  if (sLen >= 0 && maskedDBLen - salt_start != (size_t)sLen) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_SLEN_CHECK_FAILED);
     goto err;
   }
+  uint8_t H_[EVP_MAX_MD_SIZE];
   if (!EVP_DigestInit_ex(&ctx, Hash, NULL) ||
       !EVP_DigestUpdate(&ctx, kPSSZeroes, sizeof(kPSSZeroes)) ||
       !EVP_DigestUpdate(&ctx, mHash, hLen) ||
-      !EVP_DigestUpdate(&ctx, DB + i, maskedDBLen - i) ||
+      !EVP_DigestUpdate(&ctx, DB + salt_start, maskedDBLen - salt_start) ||
       !EVP_DigestFinal_ex(&ctx, H_, NULL)) {
     goto err;
   }
-  if (OPENSSL_memcmp(H_, H, hLen)) {
+  if (OPENSSL_memcmp(H_, H, hLen) != 0) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_SIGNATURE);
-    ret = 0;
-  } else {
-    ret = 1;
+    goto err;
   }
 
+  ret = 1;
+
 err:
   OPENSSL_free(DB);
   EVP_MD_CTX_cleanup(&ctx);
-
+  FIPS_service_indicator_unlock_state();
   return ret;
 }
 
@@ -595,6 +602,7 @@
     mgf1Hash = Hash;
   }
 
+  FIPS_service_indicator_lock_state();
   hLen = EVP_MD_size(Hash);
 
   if (BN_is_zero(rsa->n)) {
@@ -690,6 +698,7 @@
 
 err:
   OPENSSL_free(salt);
+  FIPS_service_indicator_unlock_state();
 
   return ret;
 }
diff --git a/src/crypto/fipsmodule/rsa/rsa.c b/src/crypto/fipsmodule/rsa/rsa.c
index 8f58a10..14cdae5 100644
--- a/src/crypto/fipsmodule/rsa/rsa.c
+++ b/src/crypto/fipsmodule/rsa/rsa.c
@@ -300,11 +300,12 @@
     OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW);
     return -1;
   }
-  return out_len;
+  return (int)out_len;
 }
 
-int RSA_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
-                 const uint8_t *in, size_t in_len, int padding) {
+static int rsa_sign_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
+                                     size_t max_out, const uint8_t *in,
+                                     size_t in_len, int padding) {
   if (rsa->meth->sign_raw) {
     return rsa->meth->sign_raw(rsa, out_len, out, max_out, in, in_len, padding);
   }
@@ -312,6 +313,13 @@
   return rsa_default_sign_raw(rsa, out_len, out, max_out, in, in_len, padding);
 }
 
+int RSA_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
+                 const uint8_t *in, size_t in_len, int padding) {
+  boringssl_ensure_rsa_self_test();
+  return rsa_sign_raw_no_self_test(rsa, out_len, out, max_out, in, in_len,
+                                   padding);
+}
+
 int RSA_private_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa,
                         int padding) {
   size_t out_len;
@@ -324,7 +332,7 @@
     OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW);
     return -1;
   }
-  return out_len;
+  return (int)out_len;
 }
 
 int RSA_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
@@ -339,7 +347,6 @@
 int RSA_private_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa,
                         int padding) {
   size_t out_len;
-
   if (!RSA_decrypt(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) {
     return -1;
   }
@@ -348,13 +355,12 @@
     OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW);
     return -1;
   }
-  return out_len;
+  return (int)out_len;
 }
 
 int RSA_public_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa,
                        int padding) {
   size_t out_len;
-
   if (!RSA_verify_raw(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) {
     return -1;
   }
@@ -363,15 +369,16 @@
     OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW);
     return -1;
   }
-  return out_len;
+  return (int)out_len;
 }
 
 unsigned RSA_size(const RSA *rsa) {
-  if (rsa->meth->size) {
-    return rsa->meth->size(rsa);
-  }
-
-  return rsa_default_size(rsa);
+  size_t ret = rsa->meth->size ? rsa->meth->size(rsa) : rsa_default_size(rsa);
+  // RSA modulus sizes are bounded by |BIGNUM|, which must fit in |unsigned|.
+  //
+  // TODO(https://crbug.com/boringssl/516): Should we make this return |size_t|?
+  assert(ret < UINT_MAX);
+  return (unsigned)ret;
 }
 
 int RSA_is_opaque(const RSA *rsa) {
@@ -466,8 +473,6 @@
 int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len,
                          int *is_alloced, int hash_nid, const uint8_t *digest,
                          size_t digest_len) {
-  unsigned i;
-
   if (hash_nid == NID_md5_sha1) {
     // Special case: SSL signature, just check the length.
     if (digest_len != SSL_SIG_LENGTH) {
@@ -481,7 +486,7 @@
     return 1;
   }
 
-  for (i = 0; kPKCS1SigPrefixes[i].nid != NID_undef; i++) {
+  for (size_t i = 0; kPKCS1SigPrefixes[i].nid != NID_undef; i++) {
     const struct pkcs1_sig_prefix *sig_prefix = &kPKCS1SigPrefixes[i];
     if (sig_prefix->nid != hash_nid) {
       continue;
@@ -493,17 +498,14 @@
     }
 
     const uint8_t* prefix = sig_prefix->bytes;
-    unsigned prefix_len = sig_prefix->len;
-    unsigned signed_msg_len;
-    uint8_t *signed_msg;
-
-    signed_msg_len = prefix_len + digest_len;
+    size_t prefix_len = sig_prefix->len;
+    size_t signed_msg_len = prefix_len + digest_len;
     if (signed_msg_len < prefix_len) {
       OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_LONG);
       return 0;
     }
 
-    signed_msg = OPENSSL_malloc(signed_msg_len);
+    uint8_t *signed_msg = OPENSSL_malloc(signed_msg_len);
     if (!signed_msg) {
       OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
       return 0;
@@ -523,8 +525,9 @@
   return 0;
 }
 
-int RSA_sign(int hash_nid, const uint8_t *digest, unsigned digest_len,
-             uint8_t *out, unsigned *out_len, RSA *rsa) {
+int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest,
+                          unsigned digest_len, uint8_t *out, unsigned *out_len,
+                          RSA *rsa) {
   const unsigned rsa_size = RSA_size(rsa);
   int ret = 0;
   uint8_t *signed_msg = NULL;
@@ -539,12 +542,18 @@
   if (!RSA_add_pkcs1_prefix(&signed_msg, &signed_msg_len,
                             &signed_msg_is_alloced, hash_nid, digest,
                             digest_len) ||
-      !RSA_sign_raw(rsa, &size_t_out_len, out, rsa_size, signed_msg,
-                    signed_msg_len, RSA_PKCS1_PADDING)) {
+      !rsa_sign_raw_no_self_test(rsa, &size_t_out_len, out, rsa_size,
+                                 signed_msg, signed_msg_len,
+                                 RSA_PKCS1_PADDING)) {
     goto err;
   }
 
-  *out_len = size_t_out_len;
+  if (size_t_out_len > UINT_MAX) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW);
+    goto err;
+  }
+
+  *out_len = (unsigned)size_t_out_len;
   ret = 1;
 
 err:
@@ -554,6 +563,13 @@
   return ret;
 }
 
+int RSA_sign(int hash_nid, const uint8_t *digest, unsigned digest_len,
+             uint8_t *out, unsigned *out_len, RSA *rsa) {
+  boringssl_ensure_rsa_self_test();
+
+  return rsa_sign_no_self_test(hash_nid, digest, digest_len, out, out_len, rsa);
+}
+
 int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                       const uint8_t *digest, size_t digest_len,
                       const EVP_MD *md, const EVP_MD *mgf1_md, int salt_len) {
@@ -577,8 +593,9 @@
   return ret;
 }
 
-int RSA_verify(int hash_nid, const uint8_t *digest, size_t digest_len,
-               const uint8_t *sig, size_t sig_len, RSA *rsa) {
+int rsa_verify_no_self_test(int hash_nid, const uint8_t *digest,
+                            size_t digest_len, const uint8_t *sig,
+                            size_t sig_len, RSA *rsa) {
   if (rsa->n == NULL || rsa->e == NULL) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
     return 0;
@@ -602,12 +619,9 @@
     return 0;
   }
 
-  if (!RSA_verify_raw(rsa, &len, buf, rsa_size, sig, sig_len,
-                      RSA_PKCS1_PADDING)) {
-    goto out;
-  }
-
-  if (!RSA_add_pkcs1_prefix(&signed_msg, &signed_msg_len,
+  if (!rsa_verify_raw_no_self_test(rsa, &len, buf, rsa_size, sig, sig_len,
+                                   RSA_PKCS1_PADDING) ||
+      !RSA_add_pkcs1_prefix(&signed_msg, &signed_msg_len,
                             &signed_msg_is_alloced, hash_nid, digest,
                             digest_len)) {
     goto out;
@@ -630,6 +644,13 @@
   return ret;
 }
 
+int RSA_verify(int hash_nid, const uint8_t *digest, size_t digest_len,
+               const uint8_t *sig, size_t sig_len, RSA *rsa) {
+  boringssl_ensure_rsa_self_test();
+  return rsa_verify_no_self_test(hash_nid, digest, digest_len, sig, sig_len,
+                                 rsa);
+}
+
 int RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *digest, size_t digest_len,
                         const EVP_MD *md, const EVP_MD *mgf1_md, int salt_len,
                         const uint8_t *sig, size_t sig_len) {
@@ -905,9 +926,9 @@
     ret = 0;
     goto cleanup;
   }
-#if defined(BORINGSSL_FIPS_BREAK_RSA_PWCT)
-  data[0] = ~data[0];
-#endif
+  if (boringssl_fips_break_test("RSA_PWCT")) {
+    data[0] = ~data[0];
+  }
   if (!RSA_verify(NID_sha256, data, sizeof(data), sig, sig_len, key)) {
     OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
     ret = 0;
@@ -930,6 +951,8 @@
 
 int RSA_flags(const RSA *rsa) { return rsa->flags; }
 
+int RSA_test_flags(const RSA *rsa, int flags) { return rsa->flags & flags; }
+
 int RSA_blinding_on(RSA *rsa, BN_CTX *ctx) {
   return 1;
 }
diff --git a/src/crypto/fipsmodule/rsa/rsa_impl.c b/src/crypto/fipsmodule/rsa/rsa_impl.c
index a6865c0..2bef70d 100644
--- a/src/crypto/fipsmodule/rsa/rsa_impl.c
+++ b/src/crypto/fipsmodule/rsa/rsa_impl.c
@@ -64,13 +64,13 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/thread.h>
-#include <openssl/type_check.h>
 
-#include "internal.h"
-#include "../bn/internal.h"
 #include "../../internal.h"
+#include "../bn/internal.h"
 #include "../delocate.h"
 #include "../rand/fork_detect.h"
+#include "../service_indicator/internal.h"
+#include "internal.h"
 
 
 int rsa_check_public_key(const RSA *rsa) {
@@ -261,6 +261,8 @@
 
 int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                 const uint8_t *in, size_t in_len, int padding) {
+  boringssl_ensure_rsa_self_test();
+
   if (!rsa_check_public_key(rsa)) {
     return 0;
   }
@@ -403,8 +405,8 @@
   }
 
   // Double the length of the cache.
-  OPENSSL_STATIC_ASSERT(MAX_BLINDINGS_PER_RSA < UINT_MAX / 2,
-                        "MAX_BLINDINGS_PER_RSA too large");
+  static_assert(MAX_BLINDINGS_PER_RSA < UINT_MAX / 2,
+                "MAX_BLINDINGS_PER_RSA too large");
   unsigned new_num_blindings = rsa->num_blindings * 2;
   if (new_num_blindings == 0) {
     new_num_blindings = 1;
@@ -414,9 +416,8 @@
   }
   assert(new_num_blindings > rsa->num_blindings);
 
-  OPENSSL_STATIC_ASSERT(
-      MAX_BLINDINGS_PER_RSA < UINT_MAX / sizeof(BN_BLINDING *),
-      "MAX_BLINDINGS_PER_RSA too large");
+  static_assert(MAX_BLINDINGS_PER_RSA < UINT_MAX / sizeof(BN_BLINDING *),
+                "MAX_BLINDINGS_PER_RSA too large");
   BN_BLINDING **new_blindings =
       OPENSSL_malloc(sizeof(BN_BLINDING *) * new_num_blindings);
   uint8_t *new_blindings_inuse = OPENSSL_malloc(new_num_blindings);
@@ -528,6 +529,8 @@
 
 int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                         const uint8_t *in, size_t in_len, int padding) {
+  boringssl_ensure_rsa_self_test();
+
   const unsigned rsa_size = RSA_size(rsa);
   uint8_t *buf = NULL;
   int ret = 0;
@@ -593,8 +596,9 @@
 
 static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
 
-int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
-                   const uint8_t *in, size_t in_len, int padding) {
+int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out,
+                                size_t max_out, const uint8_t *in,
+                                size_t in_len, int padding) {
   if (!rsa_check_public_key(rsa)) {
     return 0;
   }
@@ -686,6 +690,14 @@
   return ret;
 }
 
+int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out,
+                                size_t max_out, const uint8_t *in,
+                                size_t in_len, int padding) {
+  boringssl_ensure_rsa_self_test();
+  return rsa_verify_raw_no_self_test(rsa, out_len, out, max_out, in, in_len,
+                                     padding);
+}
+
 int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
                                   size_t len) {
   if (rsa->n == NULL || rsa->d == NULL) {
@@ -1324,6 +1336,8 @@
 static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits,
                                           const BIGNUM *e_value, BN_GENCB *cb,
                                           int check_fips) {
+  boringssl_ensure_rsa_self_test();
+
   RSA *tmp = NULL;
   uint32_t err;
   int ret = 0;
@@ -1404,6 +1418,10 @@
             BN_set_word(e, RSA_F4) &&
             RSA_generate_key_ex_maybe_fips(rsa, bits, e, cb, /*check_fips=*/1);
   BN_free(e);
+
+  if (ret) {
+    FIPS_service_indicator_update_state();
+  }
   return ret;
 }
 
diff --git a/src/crypto/fipsmodule/self_check/fips.c b/src/crypto/fipsmodule/self_check/fips.c
index d55c493..ce03957 100644
--- a/src/crypto/fipsmodule/self_check/fips.c
+++ b/src/crypto/fipsmodule/self_check/fips.c
@@ -28,6 +28,47 @@
 
 int FIPS_mode_set(int on) { return on == FIPS_mode(); }
 
+const char *FIPS_module_name(void) { return "BoringCrypto"; }
+
+uint32_t FIPS_version(void) {
+  return 0;
+}
+
+int FIPS_query_algorithm_status(const char *algorithm) {
+#if defined(BORINGSSL_FIPS)
+  static const char kApprovedAlgorithms[][13] = {
+    "AES-CBC",
+    "AES-CCM",
+    "AES-CTR",
+    "AES-ECB",
+    "AES-GCM",
+    "AES-KW",
+    "AES-KWP",
+    "ctrDRBG",
+    "ECC-SSC",
+    "ECDSA-sign",
+    "ECDSA-verify",
+    "FFC-SSC",
+    "HMAC",
+    "RSA-sign",
+    "RSA-verify",
+    "SHA-1",
+    "SHA2-224",
+    "SHA2-256",
+    "SHA2-384",
+    "SHA2-512",
+    "SHA2-512/256",
+  };
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kApprovedAlgorithms); i++) {
+    if (strcmp(algorithm, kApprovedAlgorithms[i]) == 0) {
+      return 1;
+    }
+  }
+#endif  // BORINGSSL_FIPS
+
+  return 0;
+}
+
 #if defined(BORINGSSL_FIPS_COUNTERS)
 
 size_t FIPS_read_counter(enum fips_counter_t counter) {
diff --git a/src/crypto/fipsmodule/self_check/self_check.c b/src/crypto/fipsmodule/self_check/self_check.c
index 94f2da7..19f5743 100644
--- a/src/crypto/fipsmodule/self_check/self_check.c
+++ b/src/crypto/fipsmodule/self_check/self_check.c
@@ -20,20 +20,24 @@
 #include <openssl/aead.h>
 #include <openssl/aes.h>
 #include <openssl/bn.h>
-#include <openssl/des.h>
+#include <openssl/ctrdrbg.h>
 #include <openssl/dh.h>
 #include <openssl/digest.h>
 #include <openssl/ec.h>
 #include <openssl/ecdsa.h>
 #include <openssl/ec_key.h>
+#include <openssl/hmac.h>
 #include <openssl/nid.h>
 #include <openssl/rsa.h>
 #include <openssl/sha.h>
 
 #include "../../internal.h"
+#include "../dh/internal.h"
 #include "../ec/internal.h"
 #include "../ecdsa/internal.h"
 #include "../rand/internal.h"
+#include "../rsa/internal.h"
+#include "../service_indicator/internal.h"
 #include "../tls/internal.h"
 
 
@@ -47,21 +51,6 @@
 
 #else
 
-#if defined(BORINGSSL_FIPS) && defined(OPENSSL_ANDROID)
-// FIPS builds on Android will test for flag files, named after the module hash,
-// in /dev/boringssl/selftest/. If such a flag file exists, it's assumed that
-// self-tests have already passed and thus do not need to be repeated. (The
-// integrity tests always run, however.)
-//
-// If self-tests complete successfully and the environment variable named in
-// |kFlagWriteEnableEnvVar| is present, then the flag file will be created. The
-// flag file isn't written without the environment variable being set in order
-// to avoid SELinux violations on Android.
-#define BORINGSSL_FIPS_SELF_TEST_FLAG_FILE
-static const char kFlagPrefix[] = "/dev/boringssl/selftest/";
-static const char kFlagWriteEnableEnvVar[] = "BORINGSSL_SELF_TEST_CREATE_FLAG";
-#endif
-
 static void hexdump(const uint8_t *in, size_t len) {
   for (size_t i = 0; i < len; i++) {
     fprintf(stderr, "%02x", in[i]);
@@ -71,7 +60,7 @@
 static int check_test(const void *expected, const void *actual,
                       size_t expected_len, const char *name) {
   if (OPENSSL_memcmp(actual, expected, expected_len) != 0) {
-    fprintf(stderr, "%s failed.\nExpected: ", name);
+    fprintf(stderr, "%s failed.\nExpected:   ", name);
     hexdump(expected, expected_len);
     fprintf(stderr, "\nCalculated: ");
     hexdump(actual, expected_len);
@@ -87,6 +76,28 @@
   return *out != NULL;
 }
 
+static int serialize_ecdsa_sig(uint8_t *out, size_t out_len,
+                               const ECDSA_SIG *sig) {
+  if ((out_len & 1) ||  //
+      !BN_bn2bin_padded(out, out_len / 2, sig->r) ||
+      !BN_bn2bin_padded(out + out_len / 2, out_len / 2, sig->s)) {
+    return 0;
+  }
+  return 1;
+}
+
+static ECDSA_SIG *parse_ecdsa_sig(const uint8_t *in, size_t in_len) {
+  ECDSA_SIG *ret = ECDSA_SIG_new();
+  if (!ret || //
+      (in_len & 1) ||
+      BN_bin2bn(in, in_len/2, ret->r) == NULL ||
+      BN_bin2bn(in + in_len/2, in_len/2, ret->s) == NULL) {
+    ECDSA_SIG_free(ret);
+    ret = NULL;
+  }
+  return ret;
+}
+
 static RSA *self_test_rsa_key(void) {
   static const uint8_t kN[] = {
       0xd3, 0x3a, 0x62, 0x9f, 0x07, 0x77, 0xb0, 0x18, 0xf3, 0xff, 0xfe, 0xcc,
@@ -289,195 +300,185 @@
   return NULL;
 }
 
-#if defined(OPENSSL_ANDROID)
-#define MODULE_DIGEST_SIZE SHA256_DIGEST_LENGTH
-#else
-#define MODULE_DIGEST_SIZE SHA512_DIGEST_LENGTH
-#endif
 
-int boringssl_fips_self_test(
-    const uint8_t *module_hash, size_t module_hash_len) {
-#if defined(BORINGSSL_FIPS_SELF_TEST_FLAG_FILE)
-  char flag_path[sizeof(kFlagPrefix) + 2 * MODULE_DIGEST_SIZE];
-  if (module_hash_len != 0) {
-    if (module_hash_len != MODULE_DIGEST_SIZE) {
-      fprintf(stderr,
-              "module hash of length %zu does not match expected length %d\n",
-              module_hash_len, MODULE_DIGEST_SIZE);
-      BORINGSSL_FIPS_abort();
-    }
+// Lazy self-tests
+//
+// Self tests that are slow are deferred until the corresponding algorithm is
+// actually exercised, in FIPS mode. (In non-FIPS mode these tests are only run
+// when requested by |BORINGSSL_self_test|.)
 
-    // Test whether the flag file exists.
-    memcpy(flag_path, kFlagPrefix, sizeof(kFlagPrefix) - 1);
-    static const char kHexTable[17] = "0123456789abcdef";
-    for (size_t i = 0; i < MODULE_DIGEST_SIZE; i++) {
-      flag_path[sizeof(kFlagPrefix) - 1 + 2 * i] =
-          kHexTable[module_hash[i] >> 4];
-      flag_path[sizeof(kFlagPrefix) - 1 + 2 * i + 1] =
-          kHexTable[module_hash[i] & 15];
-    }
-    flag_path[sizeof(flag_path) - 1] = 0;
+static int boringssl_self_test_rsa(void) {
+  int ret = 0;
+  uint8_t output[256];
 
-    if (access(flag_path, F_OK) == 0) {
-      // Flag file found. Skip self-tests.
-      return 1;
-    }
+  RSA *const rsa_key = self_test_rsa_key();
+  if (rsa_key == NULL) {
+    fprintf(stderr, "RSA key construction failed\n");
+    goto err;
   }
-#endif // BORINGSSL_FIPS_SELF_TEST_FLAG_FILE
 
-  static const uint8_t kAESKey[16] = "BoringCrypto Key";
-  static const uint8_t kAESIV[16] = {0};
-  static const uint8_t kPlaintext[64] =
-      "BoringCryptoModule FIPS KAT Encryption and Decryption Plaintext!";
-  static const uint8_t kAESCBCCiphertext[64] = {
-      0x87, 0x2d, 0x98, 0xc2, 0xcc, 0x31, 0x5b, 0x41, 0xe0, 0xfa, 0x7b,
-      0x0a, 0x71, 0xc0, 0x42, 0xbf, 0x4f, 0x61, 0xd0, 0x0d, 0x58, 0x8c,
-      0xf7, 0x05, 0xfb, 0x94, 0x89, 0xd3, 0xbc, 0xaa, 0x1a, 0x50, 0x45,
-      0x1f, 0xc3, 0x8c, 0xb8, 0x98, 0x86, 0xa3, 0xe3, 0x6c, 0xfc, 0xad,
-      0x3a, 0xb5, 0x59, 0x27, 0x7d, 0x21, 0x07, 0xca, 0x4c, 0x1d, 0x55,
-      0x34, 0xdd, 0x5a, 0x2d, 0xc4, 0xb4, 0xf5, 0xa8,
-#if !defined(BORINGSSL_FIPS_BREAK_AES_CBC)
-      0x35
-#else
-      0x00
-#endif
+  // RSA Sign KAT
+
+  static const uint8_t kRSASignDigest[32] = {
+      0xd2, 0xb5, 0x6e, 0x53, 0x30, 0x6f, 0x72, 0x0d, 0x79, 0x29, 0xd8,
+      0x70, 0x8b, 0xf4, 0x6f, 0x1c, 0x22, 0x30, 0x03, 0x05, 0x58, 0x2b,
+      0x11, 0x5b, 0xed, 0xca, 0xc7, 0x22, 0xd8, 0xaa, 0x5a, 0xb2,
   };
-  static const uint8_t kAESGCMCiphertext[80] = {
-      0x4a, 0xd8, 0xe7, 0x7d, 0x78, 0xd7, 0x7d, 0x5e, 0xb2, 0x11, 0xb6, 0xc9,
-      0xa4, 0xbc, 0xb2, 0xae, 0xbe, 0x93, 0xd1, 0xb7, 0xfe, 0x65, 0xc1, 0x82,
-      0x2a, 0xb6, 0x71, 0x5f, 0x1a, 0x7c, 0xe0, 0x1b, 0x2b, 0xe2, 0x53, 0xfa,
-      0xa0, 0x47, 0xfa, 0xd7, 0x8f, 0xb1, 0x4a, 0xc4, 0xdc, 0x89, 0xf9, 0xb4,
-      0x14, 0x4d, 0xde, 0x95, 0xea, 0x29, 0x69, 0x76, 0x81, 0xa3, 0x5c, 0x33,
-      0xd8, 0x37, 0xd8, 0xfa, 0x47, 0x19, 0x46, 0x2f, 0xf1, 0x90, 0xb7, 0x61,
-      0x8f, 0x6f, 0xdd, 0x31, 0x3f, 0x6a, 0x64,
-#if !defined(BORINGSSL_FIPS_BREAK_AES_GCM)
-      0x0d
-#else
-      0x00
-#endif
+  static const uint8_t kRSASignSignature[256] = {
+      0x64, 0xce, 0xdd, 0x91, 0x27, 0xb0, 0x4f, 0xb9, 0x14, 0xea, 0xc0, 0xb4,
+      0xa2, 0x06, 0xc5, 0xd8, 0x40, 0x0f, 0x6c, 0x54, 0xac, 0xf7, 0x02, 0xde,
+      0x26, 0xbb, 0xfd, 0x33, 0xe5, 0x2f, 0x4d, 0xb1, 0x53, 0xc4, 0xff, 0xd0,
+      0x5f, 0xea, 0x15, 0x89, 0x83, 0x4c, 0xe3, 0x80, 0x0b, 0xe9, 0x13, 0x82,
+      0x1d, 0x71, 0x92, 0x1a, 0x03, 0x60, 0x2c, 0xaf, 0xe2, 0x16, 0xc7, 0x43,
+      0x3f, 0xde, 0x6b, 0x94, 0xfd, 0x6e, 0x08, 0x7b, 0x11, 0xf1, 0x34, 0x52,
+      0xe5, 0xc0, 0x97, 0x66, 0x4a, 0xe0, 0x91, 0x45, 0xc8, 0xb1, 0x3d, 0x6a,
+      0x54, 0xc1, 0x32, 0x0f, 0x32, 0xad, 0x25, 0x11, 0x3e, 0x49, 0xad, 0x41,
+      0xce, 0x7b, 0xca, 0x95, 0x6b, 0x54, 0x5e, 0x86, 0x1b, 0xce, 0xfa, 0x2a,
+      0x60, 0xe8, 0xfa, 0xbb, 0x23, 0xb2, 0x41, 0xbc, 0x7c, 0x98, 0xec, 0x73,
+      0x20, 0xed, 0xb3, 0xcf, 0xab, 0x07, 0x24, 0x85, 0x6a, 0x2a, 0x61, 0x76,
+      0x28, 0xf8, 0x00, 0x80, 0xeb, 0xd9, 0x3a, 0x63, 0xe2, 0x01, 0xb1, 0xee,
+      0x6d, 0xe9, 0x73, 0xe9, 0xb6, 0x75, 0x2e, 0xf9, 0x81, 0xd9, 0xa8, 0x79,
+      0xf6, 0x8f, 0xe3, 0x02, 0x7d, 0xf6, 0xea, 0xdc, 0x35, 0xe4, 0x62, 0x0d,
+      0x91, 0xba, 0x3e, 0x7d, 0x8b, 0x82, 0xbf, 0x15, 0x74, 0x6a, 0x4e, 0x29,
+      0xf8, 0x9b, 0x2c, 0x94, 0x8d, 0xa7, 0x00, 0x4d, 0x7b, 0xbf, 0x35, 0x07,
+      0xeb, 0xdd, 0x10, 0xef, 0xd5, 0x2f, 0xe6, 0x98, 0x4b, 0x7e, 0x24, 0x80,
+      0xe2, 0x01, 0xf2, 0x66, 0xb7, 0xd3, 0x93, 0xfe, 0x2a, 0xb3, 0x74, 0xed,
+      0xec, 0x4b, 0xb1, 0x5f, 0x5f, 0xee, 0x85, 0x44, 0xa7, 0x26, 0xdf, 0xc1,
+      0x2e, 0x7a, 0xf3, 0xa5, 0x8f, 0xf8, 0x64, 0xda, 0x65, 0xad, 0x91, 0xe2,
+      0x90, 0x94, 0x20, 0x16, 0xb8, 0x61, 0xa5, 0x0a, 0x7d, 0xb4, 0xbf, 0xc0,
+      0x10, 0xaf, 0x72, 0x67,
   };
-  static const DES_cblock kDESKey1 = {"BCMDESK1"};
-  static const DES_cblock kDESKey2 = {"BCMDESK2"};
-  static const DES_cblock kDESKey3 = {"BCMDESK3"};
-  static const DES_cblock kDESIV = {"BCMDESIV"};
-  static const uint8_t kDESCiphertext[64] = {
-      0xa4, 0x30, 0x7a, 0x4c, 0x1f, 0x60, 0x16, 0xd7, 0x4f, 0x41, 0xe1,
-      0xbb, 0x27, 0xc4, 0x27, 0x37, 0xd4, 0x7f, 0xb9, 0x10, 0xf8, 0xbc,
-      0xaf, 0x93, 0x91, 0xb8, 0x88, 0x24, 0xb1, 0xf6, 0xf8, 0xbd, 0x31,
-      0x96, 0x06, 0x76, 0xde, 0x32, 0xcd, 0x29, 0x29, 0xba, 0x70, 0x5f,
-      0xea, 0xc0, 0xcb, 0xde, 0xc7, 0x75, 0x90, 0xe0, 0x0f, 0x5e, 0x2c,
-      0x0d, 0x49, 0x20, 0xd5, 0x30, 0x83, 0xf8, 0x08,
-#if !defined(BORINGSSL_FIPS_BREAK_DES)
-      0x5a
-#else
-      0x00
-#endif
+
+  unsigned sig_len;
+  if (!rsa_sign_no_self_test(NID_sha256, kRSASignDigest, sizeof(kRSASignDigest),
+                             output, &sig_len, rsa_key) ||
+      !check_test(kRSASignSignature, output, sizeof(kRSASignSignature),
+                  "RSA-sign KAT")) {
+    fprintf(stderr, "RSA signing test failed.\n");
+    goto err;
+  }
+
+  // RSA Verify KAT
+
+  static const uint8_t kRSAVerifyDigest[32] = {
+      0x09, 0x65, 0x2f, 0xd8, 0xed, 0x9d, 0xc2, 0x6d, 0xbc, 0xbf, 0xf2,
+      0xa7, 0xa5, 0xed, 0xe1, 0x37, 0x13, 0x78, 0x21, 0x36, 0xcf, 0x8d,
+      0x22, 0x3d, 0xab, 0x93, 0xb4, 0x12, 0xa8, 0xb5, 0x15, 0x53,
   };
-  static const uint8_t kPlaintextSHA1[20] = {
-      0xc6, 0xf8, 0xc9, 0x63, 0x1c, 0x14, 0x23, 0x62, 0x9b, 0xbd,
-      0x55, 0x82, 0xf4, 0xd6, 0x1d, 0xf2, 0xab, 0x7d, 0xc8,
-#if !defined(BORINGSSL_FIPS_BREAK_SHA_1)
-      0x28
-#else
-      0x00
-#endif
+  static const uint8_t kRSAVerifySignature[256] = {
+      0xab, 0xe2, 0xcb, 0xc1, 0x3d, 0x6b, 0xd3, 0x9d, 0x48, 0xdb, 0x53, 0x34,
+      0xdd, 0xbf, 0x8d, 0x07, 0x0a, 0x93, 0xbd, 0xcb, 0x10, 0x4e, 0x2c, 0xc5,
+      0xd0, 0xee, 0x48, 0x6e, 0xe2, 0x95, 0xf6, 0xb3, 0x1b, 0xda, 0x12, 0x6c,
+      0x41, 0x89, 0x0b, 0x98, 0xb7, 0x3e, 0x70, 0xe6, 0xb6, 0x5d, 0x82, 0xf9,
+      0x5c, 0x66, 0x31, 0x21, 0x75, 0x5a, 0x90, 0x74, 0x4c, 0x8d, 0x1c, 0x21,
+      0x14, 0x8a, 0x19, 0x60, 0xbe, 0x0e, 0xca, 0x44, 0x6e, 0x9f, 0xf4, 0x97,
+      0xf1, 0x34, 0x5c, 0x53, 0x7e, 0xf8, 0x11, 0x9b, 0x9a, 0x43, 0x98, 0xe9,
+      0x5c, 0x5c, 0x6d, 0xe2, 0xb1, 0xc9, 0x55, 0x90, 0x5c, 0x52, 0x99, 0xd8,
+      0xce, 0x7a, 0x3b, 0x6a, 0xb7, 0x63, 0x80, 0xd9, 0xba, 0xbd, 0xd1, 0x5f,
+      0x61, 0x02, 0x37, 0xe1, 0xf3, 0xf2, 0xaa, 0x1c, 0x1f, 0x1e, 0x77, 0x0b,
+      0x62, 0xfb, 0xb5, 0x96, 0x38, 0x1b, 0x2e, 0xbd, 0xd7, 0x7e, 0xce, 0xf9,
+      0xc9, 0x0d, 0x4c, 0x92, 0xf7, 0xb6, 0xb0, 0x5f, 0xed, 0x29, 0x36, 0x28,
+      0x5f, 0xa9, 0x48, 0x26, 0xe6, 0x20, 0x55, 0x32, 0x2a, 0x33, 0xb6, 0xf0,
+      0x4c, 0x74, 0xce, 0x69, 0xe5, 0xd8, 0xd7, 0x37, 0xfb, 0x83, 0x8b, 0x79,
+      0xd2, 0xd4, 0x8e, 0x3d, 0xaf, 0x71, 0x38, 0x75, 0x31, 0x88, 0x25, 0x31,
+      0xa9, 0x5a, 0xc9, 0x64, 0xd0, 0x2e, 0xa4, 0x13, 0xbf, 0x85, 0x95, 0x29,
+      0x82, 0xbb, 0xc0, 0x89, 0x52, 0x7d, 0xaf, 0xf5, 0xb8, 0x45, 0xc9, 0xa0,
+      0xf4, 0xd1, 0x4e, 0xf1, 0x95, 0x6d, 0x9c, 0x3a, 0xca, 0xe8, 0x82, 0xd1,
+      0x2d, 0xa6, 0x6d, 0xa0, 0xf3, 0x57, 0x94, 0xf5, 0xee, 0x32, 0x23, 0x23,
+      0x33, 0x51, 0x7d, 0xb9, 0x31, 0x52, 0x32, 0xa1, 0x83, 0xb9, 0x91, 0x65,
+      0x4d, 0xbe, 0xa4, 0x16, 0x15, 0x34, 0x5c, 0x88, 0x53, 0x25, 0x92, 0x67,
+      0x44, 0xa5, 0x39, 0x15,
   };
-  static const uint8_t kPlaintextSHA256[32] = {
-      0x37, 0xbd, 0x70, 0x53, 0x72, 0xfc, 0xd4, 0x03, 0x79, 0x70, 0xfb,
-      0x06, 0x95, 0xb1, 0x2a, 0x82, 0x48, 0xe1, 0x3e, 0xf2, 0x33, 0xfb,
-      0xef, 0x29, 0x81, 0x22, 0x45, 0x40, 0x43, 0x70, 0xce,
-#if !defined(BORINGSSL_FIPS_BREAK_SHA_256)
-      0x0f
-#else
-      0x00
-#endif
+  if (!rsa_verify_no_self_test(NID_sha256, kRSAVerifyDigest,
+                               sizeof(kRSAVerifyDigest), kRSAVerifySignature,
+                               sizeof(kRSAVerifySignature), rsa_key)) {
+    fprintf(stderr, "RSA-verify KAT failed.\n");
+    goto err;
+  }
+
+  ret = 1;
+
+err:
+  RSA_free(rsa_key);
+
+  return ret;
+}
+
+static int boringssl_self_test_ecc(void) {
+  int ret = 0;
+  EC_KEY *ec_key = NULL;
+  EC_GROUP *ec_group = NULL;
+  EC_POINT *ec_point_in = NULL;
+  EC_POINT *ec_point_out = NULL;
+  BIGNUM *ec_scalar = NULL;
+  ECDSA_SIG *sig = NULL;
+
+  ec_key = self_test_ecdsa_key();
+  if (ec_key == NULL) {
+    fprintf(stderr, "ECDSA KeyGen failed\n");
+    goto err;
+  }
+
+  // ECDSA Sign/Verify KAT
+
+  static const uint8_t kECDSASignDigest[32] = {
+      0x1e, 0x35, 0x93, 0x0b, 0xe8, 0x60, 0xd0, 0x94, 0x2c, 0xa7, 0xbb,
+      0xd6, 0xf6, 0xde, 0xd8, 0x7f, 0x15, 0x7e, 0x4d, 0xe2, 0x4f, 0x81,
+      0xed, 0x4b, 0x87, 0x5c, 0x0e, 0x01, 0x8e, 0x89, 0xa8, 0x1f,
   };
-  static const uint8_t kPlaintextSHA512[64] = {
-      0x08, 0x6a, 0x1c, 0x84, 0x61, 0x9d, 0x8e, 0xb3, 0xc0, 0x97, 0x4e,
-      0xa1, 0x9f, 0x9c, 0xdc, 0xaf, 0x3b, 0x5c, 0x31, 0xf0, 0xf2, 0x74,
-      0xc3, 0xbd, 0x6e, 0xd6, 0x1e, 0xb2, 0xbb, 0x34, 0x74, 0x72, 0x5c,
-      0x51, 0x29, 0x8b, 0x87, 0x3a, 0xa3, 0xf2, 0x25, 0x23, 0xd4, 0x1c,
-      0x82, 0x1b, 0xfe, 0xd3, 0xc6, 0xee, 0xb5, 0xd6, 0xaf, 0x07, 0x7b,
-      0x98, 0xca, 0xa7, 0x01, 0xf3, 0x94, 0xf3, 0x68,
-#if !defined(BORINGSSL_FIPS_BREAK_SHA_512)
-      0x14
-#else
-      0x00
-#endif
-  };
-  static const uint8_t kRSASignature[256] = {
-      0x62, 0x66, 0x4b, 0xe3, 0xb1, 0xd2, 0x83, 0xf1, 0xa8, 0x56, 0x2b, 0x33,
-      0x60, 0x1e, 0xdb, 0x1e, 0x06, 0xf7, 0xa7, 0x1e, 0xa8, 0xef, 0x03, 0x4d,
-      0x0c, 0xf6, 0x83, 0x75, 0x7a, 0xf0, 0x14, 0xc7, 0xe2, 0x94, 0x3a, 0xb5,
-      0x67, 0x56, 0xa5, 0x48, 0x7f, 0x3a, 0xa5, 0xbf, 0xf7, 0x1d, 0x44, 0xa6,
-      0x34, 0xed, 0x9b, 0xd6, 0x51, 0xaa, 0x2c, 0x4e, 0xce, 0x60, 0x5f, 0xe9,
-      0x0e, 0xd5, 0xcd, 0xeb, 0x23, 0x27, 0xf8, 0xfb, 0x45, 0xe5, 0x34, 0x63,
-      0x77, 0x7f, 0x2e, 0x80, 0xcf, 0x9d, 0x2e, 0xfc, 0xe2, 0x50, 0x75, 0x29,
-      0x46, 0xf4, 0xaf, 0x91, 0xed, 0x36, 0xe1, 0x5e, 0xef, 0x66, 0xa1, 0xff,
-      0x27, 0xfc, 0x87, 0x7e, 0x60, 0x84, 0x0f, 0x54, 0x51, 0x56, 0x0f, 0x68,
-      0x99, 0xc0, 0x3f, 0xeb, 0xa5, 0xa0, 0x46, 0xb0, 0x86, 0x02, 0xb0, 0xc8,
-      0xe8, 0x46, 0x13, 0x06, 0xcd, 0xb7, 0x8a, 0xd0, 0x3b, 0x46, 0xd0, 0x14,
-      0x64, 0x53, 0x9b, 0x5b, 0x5e, 0x02, 0x45, 0xba, 0x6e, 0x7e, 0x0a, 0xb9,
-      0x9e, 0x62, 0xb7, 0xd5, 0x7a, 0x87, 0xea, 0xd3, 0x24, 0xa5, 0xef, 0xb3,
-      0xdc, 0x05, 0x9c, 0x04, 0x60, 0x4b, 0xde, 0xa8, 0x90, 0x08, 0x7b, 0x6a,
-      0x5f, 0xb4, 0x3f, 0xda, 0xc5, 0x1f, 0x6e, 0xd6, 0x15, 0xde, 0x65, 0xa4,
-      0x6e, 0x62, 0x9d, 0x8f, 0xa8, 0xbe, 0x86, 0xf6, 0x09, 0x90, 0x40, 0xa5,
-      0xf4, 0x23, 0xc5, 0xf6, 0x38, 0x86, 0x0d, 0x1c, 0xed, 0x4a, 0x0a, 0xae,
-      0xa4, 0x26, 0xc2, 0x2e, 0xd3, 0x13, 0x66, 0x61, 0xea, 0x35, 0x01, 0x0e,
-      0x13, 0xda, 0x78, 0x20, 0xae, 0x59, 0x5f, 0x9b, 0xa9, 0x6c, 0xf9, 0x1b,
-      0xdf, 0x76, 0x53, 0xc8, 0xa7, 0xf5, 0x63, 0x6d, 0xf3, 0xff, 0xfd, 0xaf,
-      0x75, 0x4b, 0xac, 0x67, 0xb1, 0x3c, 0xbf, 0x5e, 0xde, 0x73, 0x02, 0x6d,
-      0xd2, 0x0c, 0xb1,
-#if !defined(BORINGSSL_FIPS_BREAK_RSA_SIG)
-      0x64
-#else
-      0x00
-#endif
-  };
-  const uint8_t kDRBGEntropy[48] =
-      "BCM Known Answer Test DBRG Initial Entropy      ";
-  const uint8_t kDRBGPersonalization[18] = "BCMPersonalization";
-  const uint8_t kDRBGAD[16] = "BCM DRBG KAT AD ";
-  const uint8_t kDRBGOutput[64] = {
-      0x1d, 0x63, 0xdf, 0x05, 0x51, 0x49, 0x22, 0x46, 0xcd, 0x9b, 0xc5,
-      0xbb, 0xf1, 0x5d, 0x44, 0xae, 0x13, 0x78, 0xb1, 0xe4, 0x7c, 0xf1,
-      0x96, 0x33, 0x3d, 0x60, 0xb6, 0x29, 0xd4, 0xbb, 0x6b, 0x44, 0xf9,
-      0xef, 0xd9, 0xf4, 0xa2, 0xba, 0x48, 0xea, 0x39, 0x75, 0x59, 0x32,
-      0xf7, 0x31, 0x2c, 0x98, 0x14, 0x2b, 0x49, 0xdf, 0x02, 0xb6, 0x5d,
-      0x71, 0x09, 0x50, 0xdb, 0x23, 0xdb, 0xe5, 0x22,
-#if !defined(BORINGSSL_FIPS_BREAK_DRBG)
-      0x95
-#else
-      0x00
-#endif
-  };
-  const uint8_t kDRBGEntropy2[48] =
-      "BCM Known Answer Test DBRG Reseed Entropy       ";
-  const uint8_t kDRBGReseedOutput[64] = {
-      0xa4, 0x77, 0x05, 0xdb, 0x14, 0x11, 0x76, 0x71, 0x42, 0x5b, 0xd8,
-      0xd7, 0xa5, 0x4f, 0x8b, 0x39, 0xf2, 0x10, 0x4a, 0x50, 0x5b, 0xa2,
-      0xc8, 0xf0, 0xbb, 0x3e, 0xa1, 0xa5, 0x90, 0x7d, 0x54, 0xd9, 0xc6,
-      0xb0, 0x96, 0xc0, 0x2b, 0x7e, 0x9b, 0xc9, 0xa1, 0xdd, 0x78, 0x2e,
-      0xd5, 0xa8, 0x66, 0x16, 0xbd, 0x18, 0x3c, 0xf2, 0xaa, 0x7a, 0x2b,
-      0x37, 0xf9, 0xab, 0x35, 0x64, 0x15, 0x01, 0x3f, 0xc4,
-  };
-  const uint8_t kECDSASigR[32] = {
+  static const uint8_t kECDSASignSig[64] = {
       0x67, 0x80, 0xc5, 0xfc, 0x70, 0x27, 0x5e, 0x2c, 0x70, 0x61, 0xa0,
       0xe7, 0x87, 0x7b, 0xb1, 0x74, 0xde, 0xad, 0xeb, 0x98, 0x87, 0x02,
-      0x7f, 0x3f, 0xa8, 0x36, 0x54, 0x15, 0x8b, 0xa7, 0xf5,
-#if !defined(BORINGSSL_FIPS_BREAK_ECDSA_SIG)
-      0x0c,
-#else
-      0x00,
-#endif
+      0x7f, 0x3f, 0xa8, 0x36, 0x54, 0x15, 0x8b, 0xa7, 0xf5, 0x0c, 0x68,
+      0x04, 0x73, 0x40, 0x94, 0xb2, 0xd1, 0x90, 0xac, 0x2d, 0x0c, 0xd7,
+      0xa5, 0x7f, 0x2f, 0x2e, 0xb2, 0x62, 0xb0, 0x09, 0x16, 0xe1, 0xa6,
+      0x70, 0xb5, 0xbb, 0x0d, 0xfd, 0x8e, 0x0c, 0x02, 0x3f,
   };
-  const uint8_t kECDSASigS[32] = {
-      0xa5, 0x93, 0xe0, 0x23, 0x91, 0xe7, 0x4b, 0x8d, 0x77, 0x25, 0xa6,
-      0xba, 0x4d, 0xd9, 0x86, 0x77, 0xda, 0x7d, 0x8f, 0xef, 0xc4, 0x1a,
-      0xf0, 0xcc, 0x81, 0xe5, 0xea, 0x3f, 0xc2, 0x41, 0x7f, 0xd8,
+
+  // The 'k' value for ECDSA is fixed to avoid an entropy draw.
+  uint8_t ecdsa_k[32] = {0};
+  ecdsa_k[31] = 42;
+
+  sig = ecdsa_sign_with_nonce_for_known_answer_test(
+      kECDSASignDigest, sizeof(kECDSASignDigest), ec_key, ecdsa_k,
+      sizeof(ecdsa_k));
+
+  uint8_t ecdsa_sign_output[64];
+  if (sig == NULL ||
+      !serialize_ecdsa_sig(ecdsa_sign_output, sizeof(ecdsa_sign_output), sig) ||
+      !check_test(kECDSASignSig, ecdsa_sign_output, sizeof(ecdsa_sign_output),
+                  "ECDSA-sign signature")) {
+    fprintf(stderr, "ECDSA-sign KAT failed.\n");
+    goto err;
+  }
+
+  static const uint8_t kECDSAVerifyDigest[32] = {
+      0x78, 0x7c, 0x50, 0x5c, 0x60, 0xc9, 0xe4, 0x13, 0x6c, 0xe4, 0x48,
+      0xba, 0x93, 0xff, 0x71, 0xfa, 0x9c, 0x18, 0xf4, 0x17, 0x09, 0x4f,
+      0xdf, 0x5a, 0xe2, 0x75, 0xc0, 0xcc, 0xd2, 0x67, 0x97, 0xad,
   };
+  static const uint8_t kECDSAVerifySig[64] = {
+      0x67, 0x80, 0xc5, 0xfc, 0x70, 0x27, 0x5e, 0x2c, 0x70, 0x61, 0xa0,
+      0xe7, 0x87, 0x7b, 0xb1, 0x74, 0xde, 0xad, 0xeb, 0x98, 0x87, 0x02,
+      0x7f, 0x3f, 0xa8, 0x36, 0x54, 0x15, 0x8b, 0xa7, 0xf5, 0x0c, 0x2d,
+      0x36, 0xe5, 0x79, 0x97, 0x90, 0xbf, 0xbe, 0x21, 0x83, 0xd3, 0x3e,
+      0x96, 0xf3, 0xc5, 0x1f, 0x6a, 0x23, 0x2f, 0x2a, 0x24, 0x48, 0x8c,
+      0x8e, 0x5f, 0x64, 0xc3, 0x7e, 0xa2, 0xcf, 0x05, 0x29,
+  };
+
+  ECDSA_SIG_free(sig);
+  sig = parse_ecdsa_sig(kECDSAVerifySig, sizeof(kECDSAVerifySig));
+  if (!sig ||
+      !ecdsa_do_verify_no_self_test(kECDSAVerifyDigest,
+                                    sizeof(kECDSAVerifyDigest), sig, ec_key)) {
+    fprintf(stderr, "ECDSA-verify KAT failed.\n");
+    goto err;
+  }
+
+  // Primitive Z Computation KAT (IG 9.6).
+
   // kP256Point is SHA256("Primitive Z Computation KAT")×G within P-256.
-  const uint8_t kP256Point[65] = {
+  static const uint8_t kP256Point[65] = {
       0x04, 0x4e, 0xc1, 0x94, 0x8c, 0x5c, 0xf4, 0x37, 0x35, 0x0d, 0xa3,
       0xf9, 0x55, 0xf9, 0x8b, 0x26, 0x23, 0x5c, 0x43, 0xe0, 0x83, 0x51,
       0x2b, 0x0d, 0x4b, 0x56, 0x24, 0xc3, 0xe4, 0xa5, 0xa8, 0xe2, 0xe9,
@@ -486,49 +487,63 @@
       0x79, 0x93, 0x7c, 0x0b, 0x92, 0x2b, 0x7f, 0x17, 0xa5, 0x80,
   };
   // kP256Scalar is SHA256("Primitive Z Computation KAT scalar").
-  const uint8_t kP256Scalar[32] = {
+  static const uint8_t kP256Scalar[32] = {
       0xe7, 0x60, 0x44, 0x91, 0x26, 0x9a, 0xfb, 0x5b, 0x10, 0x2d, 0x6e,
       0xa5, 0x2c, 0xb5, 0x9f, 0xeb, 0x70, 0xae, 0xde, 0x6c, 0xe3, 0xbf,
       0xb3, 0xe0, 0x10, 0x54, 0x85, 0xab, 0xd8, 0x61, 0xd7, 0x7b,
   };
   // kP256PointResult is |kP256Scalar|×|kP256Point|.
-  const uint8_t kP256PointResult[65] = {
+  static const uint8_t kP256PointResult[65] = {
       0x04, 0xf1, 0x63, 0x00, 0x88, 0xc5, 0xd5, 0xe9, 0x05, 0x52, 0xac,
       0xb6, 0xec, 0x68, 0x76, 0xb8, 0x73, 0x7f, 0x0f, 0x72, 0x34, 0xe6,
       0xbb, 0x30, 0x32, 0x22, 0x37, 0xb6, 0x2a, 0x80, 0xe8, 0x9e, 0x6e,
       0x6f, 0x36, 0x02, 0xe7, 0x21, 0xd2, 0x31, 0xdb, 0x94, 0x63, 0xb7,
       0xd8, 0x19, 0x0e, 0xc2, 0xc0, 0xa7, 0x2f, 0x15, 0x49, 0x1a, 0xa2,
-      0x7c, 0x41, 0x8f, 0xaf, 0x9c, 0x40, 0xaf, 0x2e, 0x4a,
-#if !defined(BORINGSSL_FIPS_BREAK_Z_COMPUTATION)
-      0x0c,
-#else
-      0x00,
-#endif
+      0x7c, 0x41, 0x8f, 0xaf, 0x9c, 0x40, 0xaf, 0x2e, 0x4a, 0x0c,
   };
-  const uint8_t kTLSOutput[32] = {
-      0x67, 0x85, 0xde, 0x60, 0xfc, 0x0a, 0x83, 0xe9, 0xa2, 0x2a, 0xb3,
-      0xf0, 0x27, 0x0c, 0xba, 0xf7, 0xfa, 0x82, 0x3d, 0x14, 0x77, 0x1d,
-      0x86, 0x29, 0x79, 0x39, 0x77, 0x8a, 0xd5, 0x0e, 0x9d,
-#if !defined(BORINGSSL_FIPS_BREAK_TLS_KDF)
-      0x32,
-#else
-      0x00,
-#endif
-  };
-  const uint8_t kTLSSecret[32] = {
-      0xbf, 0xe4, 0xb7, 0xe0, 0x26, 0x55, 0x5f, 0x6a, 0xdf, 0x5d, 0x27,
-      0xd6, 0x89, 0x99, 0x2a, 0xd6, 0xf7, 0x65, 0x66, 0x07, 0x4b, 0x55,
-      0x5f, 0x64, 0x55, 0xcd, 0xd5, 0x77, 0xa4, 0xc7, 0x09, 0x61,
-  };
-  const char kTLSLabel[] = "FIPS self test";
-  const uint8_t kTLSSeed1[16] = {
-      0x8f, 0x0d, 0xe8, 0xb6, 0x90, 0x8f, 0xb1, 0xd2,
-      0x6d, 0x51, 0xf4, 0x79, 0x18, 0x63, 0x51, 0x65,
-  };
-  const uint8_t kTLSSeed2[16] = {
-      0x7d, 0x24, 0x1a, 0x9d, 0x3c, 0x59, 0xbf, 0x3c,
-      0x31, 0x1e, 0x2b, 0x21, 0x41, 0x8d, 0x32, 0x81,
-  };
+
+  ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
+  if (ec_group == NULL) {
+    fprintf(stderr, "Failed to create P-256 group.\n");
+    goto err;
+  }
+  ec_point_in = EC_POINT_new(ec_group);
+  ec_point_out = EC_POINT_new(ec_group);
+  ec_scalar = BN_new();
+  uint8_t z_comp_result[65];
+  if (ec_point_in == NULL || ec_point_out == NULL || ec_scalar == NULL ||
+      !EC_POINT_oct2point(ec_group, ec_point_in, kP256Point, sizeof(kP256Point),
+                          NULL) ||
+      !BN_bin2bn(kP256Scalar, sizeof(kP256Scalar), ec_scalar) ||
+      !ec_point_mul_no_self_test(ec_group, ec_point_out, NULL, ec_point_in,
+                                 ec_scalar, NULL) ||
+      !EC_POINT_point2oct(ec_group, ec_point_out, POINT_CONVERSION_UNCOMPRESSED,
+                          z_comp_result, sizeof(z_comp_result), NULL) ||
+      !check_test(kP256PointResult, z_comp_result, sizeof(z_comp_result),
+                  "Z Computation Result")) {
+    fprintf(stderr, "Z-computation KAT failed.\n");
+    goto err;
+  }
+
+  ret = 1;
+
+err:
+  EC_KEY_free(ec_key);
+  EC_POINT_free(ec_point_in);
+  EC_POINT_free(ec_point_out);
+  EC_GROUP_free(ec_group);
+  BN_free(ec_scalar);
+  ECDSA_SIG_free(sig);
+
+  return ret;
+}
+
+static int boringssl_self_test_ffdh(void) {
+  int ret = 0;
+  DH *dh = NULL;
+  BIGNUM *ffdhe2048_value = NULL;
+
+  // FFC Diffie-Hellman KAT
 
   // kFFDHE2048PublicValueData is an arbitrary public value, mod
   // kFFDHE2048Data. (The private key happens to be 4096.)
@@ -550,8 +565,7 @@
       TOBN(0xbae7b0b3, 0x6e362dc0), TOBN(0xa57c73bd, 0xdc70fb82),
       TOBN(0xfaff50d2, 0x9d573457), TOBN(0x352bd399, 0xbe84058e),
   };
-
-  const uint8_t kDHOutput[2048 / 8] = {
+  static const uint8_t kDHOutput[2048 / 8] = {
       0x2a, 0xe6, 0xd3, 0xa6, 0x13, 0x58, 0x8e, 0xce, 0x53, 0xaa, 0xf6, 0x5d,
       0x9a, 0xae, 0x02, 0x12, 0xf5, 0x80, 0x3d, 0x06, 0x09, 0x76, 0xac, 0x57,
       0x37, 0x9e, 0xab, 0x38, 0x62, 0x25, 0x05, 0x1d, 0xf3, 0xa9, 0x39, 0x60,
@@ -573,23 +587,150 @@
       0x06, 0x80, 0x2a, 0x4e, 0x5a, 0xf0, 0x1e, 0xaa, 0xcb, 0xab, 0x06, 0x0e,
       0x27, 0x0f, 0xd9, 0x88, 0xd9, 0x01, 0xe3, 0x07, 0xeb, 0xdf, 0xc3, 0x12,
       0xe3, 0x40, 0x88, 0x7b, 0x5f, 0x59, 0x78, 0x6e, 0x26, 0x20, 0xc3, 0xdf,
-      0xc8, 0xe4, 0x5e,
-#if !defined(BORINGSSL_FIPS_BREAK_FFC_DH)
-      0xb8,
-#else
-      0x00,
-#endif
+      0xc8, 0xe4, 0x5e, 0xb8,
   };
 
+  ffdhe2048_value = BN_new();
+  if (ffdhe2048_value) {
+    bn_set_static_words(ffdhe2048_value, kFFDHE2048PublicValueData,
+                        OPENSSL_ARRAY_SIZE(kFFDHE2048PublicValueData));
+  }
+
+  dh = self_test_dh();
+  uint8_t dh_out[sizeof(kDHOutput)];
+  if (dh == NULL || ffdhe2048_value == NULL || sizeof(dh_out) != DH_size(dh) ||
+      dh_compute_key_padded_no_self_test(dh_out, ffdhe2048_value, dh) !=
+          sizeof(dh_out) ||
+      !check_test(kDHOutput, dh_out, sizeof(dh_out), "FFC DH")) {
+    fprintf(stderr, "FFDH failed.\n");
+    goto err;
+  }
+
+  ret = 1;
+
+err:
+  DH_free(dh);
+  BN_free(ffdhe2048_value);
+
+  return ret;
+}
+
+#if defined(BORINGSSL_FIPS)
+
+static void run_self_test_rsa(void) {
+  FIPS_service_indicator_lock_state();
+  if (!boringssl_self_test_rsa()) {
+    BORINGSSL_FIPS_abort();
+  }
+  FIPS_service_indicator_unlock_state();
+}
+
+DEFINE_STATIC_ONCE(g_self_test_once_rsa);
+
+void boringssl_ensure_rsa_self_test(void) {
+  CRYPTO_once(g_self_test_once_rsa_bss_get(), run_self_test_rsa);
+}
+
+static void run_self_test_ecc(void) {
+  FIPS_service_indicator_lock_state();
+  if (!boringssl_self_test_ecc()) {
+    BORINGSSL_FIPS_abort();
+  }
+  FIPS_service_indicator_unlock_state();
+}
+
+DEFINE_STATIC_ONCE(g_self_test_once_ecc);
+
+void boringssl_ensure_ecc_self_test(void) {
+  CRYPTO_once(g_self_test_once_ecc_bss_get(), run_self_test_ecc);
+}
+
+static void run_self_test_ffdh(void) {
+  FIPS_service_indicator_lock_state();
+  if (!boringssl_self_test_ffdh()) {
+    BORINGSSL_FIPS_abort();
+  }
+  FIPS_service_indicator_unlock_state();
+}
+
+DEFINE_STATIC_ONCE(g_self_test_once_ffdh);
+
+void boringssl_ensure_ffdh_self_test(void) {
+  CRYPTO_once(g_self_test_once_ffdh_bss_get(), run_self_test_ffdh);
+}
+
+#endif  // BORINGSSL_FIPS
+
+
+// Startup self tests.
+//
+// These tests are run at process start when in FIPS mode.
+
+int boringssl_self_test_sha256(void) {
+  static const uint8_t kInput[16] = {
+      0xff, 0x3b, 0x85, 0x7d, 0xa7, 0x23, 0x6a, 0x2b,
+      0xaa, 0x0f, 0x39, 0x6b, 0x51, 0x52, 0x22, 0x17,
+  };
+  static const uint8_t kPlaintextSHA256[32] = {
+      0x7f, 0xe4, 0xd5, 0xf1, 0xa1, 0xe3, 0x82, 0x87, 0xd9, 0x58, 0xf5,
+      0x11, 0xc7, 0x1d, 0x5e, 0x27, 0x5e, 0xcc, 0xd2, 0x66, 0xcf, 0xb9,
+      0xc8, 0xc6, 0x60, 0xd8, 0x92, 0x1e, 0x57, 0xfd, 0x46, 0x75,
+  };
+  uint8_t output[SHA256_DIGEST_LENGTH];
+
+  // SHA-256 KAT
+  SHA256(kInput, sizeof(kInput), output);
+  return check_test(kPlaintextSHA256, output, sizeof(kPlaintextSHA256),
+                    "SHA-256 KAT");
+}
+
+int boringssl_self_test_sha512(void) {
+  static const uint8_t kInput[16] = {
+      0x21, 0x25, 0x12, 0xf8, 0xd2, 0xad, 0x83, 0x22,
+      0x78, 0x1c, 0x6c, 0x4d, 0x69, 0xa9, 0xda, 0xa1,
+  };
+  static const uint8_t kPlaintextSHA512[64] = {
+      0x29, 0x3c, 0x94, 0x35, 0x4e, 0x98, 0x83, 0xe5, 0xc2, 0x78, 0x36,
+      0x7a, 0xe5, 0x18, 0x90, 0xbf, 0x35, 0x41, 0x01, 0x64, 0x19, 0x8d,
+      0x26, 0xeb, 0xe1, 0xf8, 0x2f, 0x04, 0x8e, 0xfa, 0x8b, 0x2b, 0xc6,
+      0xb2, 0x9d, 0x5d, 0x46, 0x76, 0x5a, 0xc8, 0xb5, 0x25, 0xa3, 0xea,
+      0x52, 0x84, 0x47, 0x6d, 0x6d, 0xf4, 0xc9, 0x71, 0xf3, 0x3d, 0x89,
+      0x4c, 0x3b, 0x20, 0x8c, 0x5b, 0x75, 0xe8, 0xf8, 0x7c,
+  };
+  uint8_t output[SHA512_DIGEST_LENGTH];
+
+  // SHA-512 KAT
+  SHA512(kInput, sizeof(kInput), output);
+  return check_test(kPlaintextSHA512, output, sizeof(kPlaintextSHA512),
+                    "SHA-512 KAT");
+}
+
+int boringssl_self_test_hmac_sha256(void) {
+  static const uint8_t kInput[16] = {
+      0xda, 0xd9, 0x12, 0x93, 0xdf, 0xcf, 0x2a, 0x7c,
+      0x8e, 0xcd, 0x13, 0xfe, 0x35, 0x3f, 0xa7, 0x5b,
+  };
+  static const uint8_t kPlaintextHMACSHA256[32] = {
+      0x36, 0x5f, 0x5b, 0xd5, 0xf5, 0xeb, 0xfd, 0xc7, 0x6e, 0x53, 0xa5,
+      0x73, 0x6d, 0x73, 0x20, 0x13, 0xaa, 0xd3, 0xbc, 0x86, 0x4b, 0xb8,
+      0x84, 0x94, 0x16, 0x46, 0x88, 0x9c, 0x48, 0xee, 0xa9, 0x0e,
+  };
+  uint8_t output[EVP_MAX_MD_SIZE];
+
+  unsigned output_len;
+  HMAC(EVP_sha256(), kInput, sizeof(kInput), kInput, sizeof(kInput), output,
+       &output_len);
+  return output_len == sizeof(kPlaintextHMACSHA256) &&
+         check_test(kPlaintextHMACSHA256, output, sizeof(kPlaintextHMACSHA256),
+                    "HMAC-SHA-256 KAT");
+}
+
+static int boringssl_self_test_fast(void) {
+  static const uint8_t kAESKey[16] = "BoringCrypto Key";
+  static const uint8_t kAESIV[16] = {0};
+
   EVP_AEAD_CTX aead_ctx;
   EVP_AEAD_CTX_zero(&aead_ctx);
-  RSA *rsa_key = NULL;
-  EC_KEY *ec_key = NULL;
-  EC_GROUP *ec_group = NULL;
-  EC_POINT *ec_point_in = NULL;
-  EC_POINT *ec_point_out = NULL;
-  BIGNUM *ec_scalar = NULL;
-  ECDSA_SIG *sig = NULL;
   int ret = 0;
 
   AES_KEY aes_key;
@@ -597,28 +738,48 @@
   uint8_t output[256];
 
   // AES-CBC Encryption KAT
+  static const uint8_t kAESCBCEncPlaintext[32] = {
+      0x07, 0x86, 0x09, 0xa6, 0xc5, 0xac, 0x25, 0x44, 0x69, 0x9a, 0xdf,
+      0x68, 0x2f, 0xa3, 0x77, 0xf9, 0xbe, 0x8a, 0xb6, 0xae, 0xf5, 0x63,
+      0xe8, 0xc5, 0x6a, 0x36, 0xb8, 0x4f, 0x55, 0x7f, 0xad, 0xd3,
+  };
+  static const uint8_t kAESCBCEncCiphertext[sizeof(kAESCBCEncPlaintext)] = {
+      0x56, 0x46, 0xc1, 0x41, 0xf4, 0x13, 0xd6, 0xff, 0x62, 0x92, 0x41,
+      0x7a, 0x26, 0xc6, 0x86, 0xbd, 0x30, 0x5f, 0xb6, 0x57, 0xa7, 0xd2,
+      0x50, 0x3a, 0xc5, 0x5e, 0x8e, 0x93, 0x40, 0xf2, 0x10, 0xd8,
+  };
   memcpy(aes_iv, kAESIV, sizeof(kAESIV));
   if (AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) != 0) {
     fprintf(stderr, "AES_set_encrypt_key failed.\n");
     goto err;
   }
-  AES_cbc_encrypt(kPlaintext, output, sizeof(kPlaintext), &aes_key, aes_iv,
-                  AES_ENCRYPT);
-  if (!check_test(kAESCBCCiphertext, output, sizeof(kAESCBCCiphertext),
-                  "AES-CBC Encryption KAT")) {
+  AES_cbc_encrypt(kAESCBCEncPlaintext, output, sizeof(kAESCBCEncPlaintext),
+                  &aes_key, aes_iv, AES_ENCRYPT);
+  if (!check_test(kAESCBCEncCiphertext, output, sizeof(kAESCBCEncCiphertext),
+                  "AES-CBC-encrypt KAT")) {
     goto err;
   }
 
   // AES-CBC Decryption KAT
+  static const uint8_t kAESCBCDecCiphertext[32] = {
+      0x34, 0x7a, 0xa5, 0xa0, 0x24, 0xb2, 0x82, 0x57, 0xb3, 0x65, 0x10,
+      0xbe, 0x58, 0x3d, 0x4f, 0x47, 0xad, 0xb7, 0xbb, 0xee, 0xdc, 0x60,
+      0x05, 0xbb, 0xbd, 0x0d, 0x0a, 0x9f, 0x06, 0xbb, 0x7b, 0x10,
+  };
+  static const uint8_t kAESCBCDecPlaintext[sizeof(kAESCBCDecCiphertext)] = {
+      0x51, 0xa7, 0xa0, 0x1f, 0x6b, 0x79, 0x6c, 0xcd, 0x48, 0x03, 0xa1,
+      0x41, 0xdc, 0x56, 0xa6, 0xc2, 0x16, 0xb5, 0xd1, 0xd3, 0xb7, 0x06,
+      0xb2, 0x25, 0x6f, 0xa6, 0xd0, 0xd2, 0x0e, 0x6f, 0x19, 0xb5,
+  };
   memcpy(aes_iv, kAESIV, sizeof(kAESIV));
   if (AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) != 0) {
     fprintf(stderr, "AES_set_decrypt_key failed.\n");
     goto err;
   }
-  AES_cbc_encrypt(kAESCBCCiphertext, output, sizeof(kAESCBCCiphertext),
+  AES_cbc_encrypt(kAESCBCDecCiphertext, output, sizeof(kAESCBCDecCiphertext),
                   &aes_key, aes_iv, AES_DECRYPT);
-  if (!check_test(kPlaintext, output, sizeof(kPlaintext),
-                  "AES-CBC Decryption KAT")) {
+  if (!check_test(kAESCBCDecPlaintext, output, sizeof(kAESCBCDecPlaintext),
+                  "AES-CBC-decrypt KAT")) {
     goto err;
   }
 
@@ -632,194 +793,115 @@
   }
 
   // AES-GCM Encryption KAT
+  static const uint8_t kAESGCMEncPlaintext[32] = {
+      0x8f, 0xcc, 0x40, 0x99, 0x80, 0x8e, 0x75, 0xca, 0xaf, 0xf5, 0x82,
+      0x89, 0x88, 0x48, 0xa8, 0x8d, 0x80, 0x8b, 0x55, 0xab, 0x4e, 0x93,
+      0x70, 0x79, 0x7d, 0x94, 0x0b, 0xe8, 0xcc, 0x1d, 0x78, 0x84,
+  };
+  static const uint8_t kAESGCMCiphertext[sizeof(kAESGCMEncPlaintext) + 16] = {
+      0x87, 0x7b, 0xd5, 0x8d, 0x96, 0x3e, 0x4b, 0xe6, 0x64, 0x94, 0x40, 0x2f,
+      0x61, 0x9b, 0x7e, 0x56, 0x52, 0x7d, 0xa4, 0x5a, 0xf9, 0xa6, 0xe2, 0xdb,
+      0x1c, 0x63, 0x2e, 0x97, 0x93, 0x0f, 0xfb, 0xed, 0xb5, 0x9e, 0x1c, 0x20,
+      0xb2, 0xb0, 0x58, 0xda, 0x48, 0x07, 0x2d, 0xbd, 0x96, 0x0d, 0x34, 0xc6,
+  };
   if (!EVP_AEAD_CTX_seal(&aead_ctx, output, &out_len, sizeof(output), nonce,
                          EVP_AEAD_nonce_length(EVP_aead_aes_128_gcm()),
-                         kPlaintext, sizeof(kPlaintext), NULL, 0) ||
+                         kAESGCMEncPlaintext, sizeof(kAESGCMEncPlaintext), NULL,
+                         0) ||
       !check_test(kAESGCMCiphertext, output, sizeof(kAESGCMCiphertext),
-                  "AES-GCM Encryption KAT")) {
+                  "AES-GCM-encrypt KAT")) {
     fprintf(stderr, "EVP_AEAD_CTX_seal for AES-128-GCM failed.\n");
     goto err;
   }
 
   // AES-GCM Decryption KAT
+  static const uint8_t kAESGCMDecCiphertext[48] = {
+      0x35, 0xf3, 0x05, 0x8f, 0x87, 0x57, 0x60, 0xff, 0x09, 0xd3, 0x12, 0x0f,
+      0x70, 0xc4, 0xbc, 0x9e, 0xd7, 0xa8, 0x68, 0x72, 0xe1, 0x34, 0x52, 0x20,
+      0x21, 0x76, 0xf7, 0x37, 0x1a, 0xe0, 0x4f, 0xaa, 0xe1, 0xdd, 0x39, 0x19,
+      0x20, 0xf5, 0xd1, 0x39, 0x53, 0xd8, 0x96, 0x78, 0x59, 0x94, 0x82, 0x3c,
+  };
+  static const uint8_t kAESGCMDecPlaintext[sizeof(kAESGCMDecCiphertext) - 16] =
+      {
+          0x3d, 0x44, 0x90, 0x9b, 0x91, 0xe7, 0x5e, 0xd3, 0xc2, 0xb2, 0xd0,
+          0xa9, 0x99, 0x17, 0x6a, 0x45, 0x05, 0x5e, 0x99, 0x83, 0x56, 0x01,
+          0xc0, 0x82, 0x40, 0x81, 0xd2, 0x48, 0x45, 0xf2, 0xcc, 0xc3,
+      };
   if (!EVP_AEAD_CTX_open(&aead_ctx, output, &out_len, sizeof(output), nonce,
                          EVP_AEAD_nonce_length(EVP_aead_aes_128_gcm()),
-                         kAESGCMCiphertext, sizeof(kAESGCMCiphertext), NULL,
-                         0) ||
-      !check_test(kPlaintext, output, sizeof(kPlaintext),
-                  "AES-GCM Decryption KAT")) {
-    fprintf(stderr, "EVP_AEAD_CTX_open for AES-128-GCM failed.\n");
-    goto err;
-  }
-
-  DES_key_schedule des1, des2, des3;
-  DES_cblock des_iv;
-  DES_set_key(&kDESKey1, &des1);
-  DES_set_key(&kDESKey2, &des2);
-  DES_set_key(&kDESKey3, &des3);
-
-  // 3DES Encryption KAT
-  memcpy(&des_iv, &kDESIV, sizeof(des_iv));
-  DES_ede3_cbc_encrypt(kPlaintext, output, sizeof(kPlaintext), &des1, &des2,
-                       &des3, &des_iv, DES_ENCRYPT);
-  if (!check_test(kDESCiphertext, output, sizeof(kDESCiphertext),
-                  "3DES Encryption KAT")) {
-    goto err;
-  }
-
-  // 3DES Decryption KAT
-  memcpy(&des_iv, &kDESIV, sizeof(des_iv));
-  DES_ede3_cbc_encrypt(kDESCiphertext, output, sizeof(kDESCiphertext), &des1,
-                       &des2, &des3, &des_iv, DES_DECRYPT);
-  if (!check_test(kPlaintext, output, sizeof(kPlaintext),
-                  "3DES Decryption KAT")) {
+                         kAESGCMDecCiphertext, sizeof(kAESGCMDecCiphertext),
+                         NULL, 0) ||
+      !check_test(kAESGCMDecPlaintext, output, sizeof(kAESGCMDecPlaintext),
+                  "AES-GCM-decrypt KAT")) {
+    fprintf(stderr,
+            "AES-GCM-decrypt KAT failed because EVP_AEAD_CTX_open failed.\n");
     goto err;
   }
 
   // SHA-1 KAT
-  SHA1(kPlaintext, sizeof(kPlaintext), output);
-  if (!check_test(kPlaintextSHA1, output, sizeof(kPlaintextSHA1),
+  static const uint8_t kSHA1Input[16] = {
+      0x13, 0x2f, 0xd9, 0xba, 0xd5, 0xc1, 0x82, 0x62,
+      0x63, 0xba, 0xfb, 0xb6, 0x99, 0xf7, 0x07, 0xa5,
+  };
+  static const uint8_t kSHA1Digest[20] = {
+      0x94, 0x19, 0x55, 0x93, 0x0a, 0x58, 0x29, 0x38, 0xeb, 0xf5,
+      0x09, 0x11, 0x6d, 0x1a, 0xfd, 0x0f, 0x1e, 0x11, 0xe3, 0xcb,
+  };
+  SHA1(kSHA1Input, sizeof(kSHA1Input), output);
+  if (!check_test(kSHA1Digest, output, sizeof(kSHA1Digest),
                   "SHA-1 KAT")) {
     goto err;
   }
 
-  // SHA-256 KAT
-  SHA256(kPlaintext, sizeof(kPlaintext), output);
-  if (!check_test(kPlaintextSHA256, output, sizeof(kPlaintextSHA256),
-                  "SHA-256 KAT")) {
-    goto err;
-  }
-
-  // SHA-512 KAT
-  SHA512(kPlaintext, sizeof(kPlaintext), output);
-  if (!check_test(kPlaintextSHA512, output, sizeof(kPlaintextSHA512),
-                  "SHA-512 KAT")) {
-    goto err;
-  }
-
-  rsa_key = self_test_rsa_key();
-  if (rsa_key == NULL) {
-    fprintf(stderr, "RSA KeyGen failed\n");
-    goto err;
-  }
-
-  // RSA Sign KAT
-  unsigned sig_len;
-
-  // Disable blinding for the power-on tests because it's not needed and
-  // triggers an entropy draw.
-  rsa_key->flags |= RSA_FLAG_NO_BLINDING;
-
-  if (!RSA_sign(NID_sha256, kPlaintextSHA256, sizeof(kPlaintextSHA256), output,
-                &sig_len, rsa_key) ||
-      !check_test(kRSASignature, output, sizeof(kRSASignature),
-                  "RSA Sign KAT")) {
-    fprintf(stderr, "RSA signing test failed.\n");
-    goto err;
-  }
-
-  // RSA Verify KAT
-  if (!RSA_verify(NID_sha256, kPlaintextSHA256, sizeof(kPlaintextSHA256),
-                  kRSASignature, sizeof(kRSASignature), rsa_key)) {
-    fprintf(stderr, "RSA Verify KAT failed.\n");
-    goto err;
-  }
-
-  ec_key = self_test_ecdsa_key();
-  if (ec_key == NULL) {
-    fprintf(stderr, "ECDSA KeyGen failed\n");
-    goto err;
-  }
-
-  // ECDSA Sign/Verify KAT
-
-  // The 'k' value for ECDSA is fixed to avoid an entropy draw.
-  uint8_t ecdsa_k[32] = {0};
-  ecdsa_k[31] = 42;
-
-  sig = ecdsa_sign_with_nonce_for_known_answer_test(
-      kPlaintextSHA256, sizeof(kPlaintextSHA256), ec_key, ecdsa_k,
-      sizeof(ecdsa_k));
-
-  uint8_t ecdsa_r_bytes[sizeof(kECDSASigR)];
-  uint8_t ecdsa_s_bytes[sizeof(kECDSASigS)];
-  if (sig == NULL ||
-      BN_num_bytes(sig->r) != sizeof(ecdsa_r_bytes) ||
-      !BN_bn2bin(sig->r, ecdsa_r_bytes) ||
-      BN_num_bytes(sig->s) != sizeof(ecdsa_s_bytes) ||
-      !BN_bn2bin(sig->s, ecdsa_s_bytes) ||
-      !check_test(kECDSASigR, ecdsa_r_bytes, sizeof(kECDSASigR), "ECDSA R") ||
-      !check_test(kECDSASigS, ecdsa_s_bytes, sizeof(kECDSASigS), "ECDSA S")) {
-    fprintf(stderr, "ECDSA signature KAT failed.\n");
-    goto err;
-  }
-
-  if (!ECDSA_do_verify(kPlaintextSHA256, sizeof(kPlaintextSHA256), sig,
-                       ec_key)) {
-    fprintf(stderr, "ECDSA verification KAT failed.\n");
-    goto err;
-  }
-
-  // Primitive Z Computation KAT (IG 9.6).
-  ec_group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
-  if (ec_group == NULL) {
-    fprintf(stderr, "Failed to create P-256 group.\n");
-    goto err;
-  }
-  ec_point_in = EC_POINT_new(ec_group);
-  ec_point_out = EC_POINT_new(ec_group);
-  ec_scalar = BN_new();
-  uint8_t z_comp_result[65];
-  if (ec_point_in == NULL || ec_point_out == NULL || ec_scalar == NULL ||
-      !EC_POINT_oct2point(ec_group, ec_point_in, kP256Point, sizeof(kP256Point),
-                          NULL) ||
-      !BN_bin2bn(kP256Scalar, sizeof(kP256Scalar), ec_scalar) ||
-      !EC_POINT_mul(ec_group, ec_point_out, NULL, ec_point_in, ec_scalar,
-                    NULL) ||
-      !EC_POINT_point2oct(ec_group, ec_point_out, POINT_CONVERSION_UNCOMPRESSED,
-                          z_comp_result, sizeof(z_comp_result), NULL) ||
-      !check_test(kP256PointResult, z_comp_result, sizeof(z_comp_result),
-                  "Z Computation Result")) {
-    fprintf(stderr, "Z Computation KAT failed.\n");
-    goto err;
-  }
-
-  // FFC Diffie-Hellman KAT
-
-  BIGNUM *const ffdhe2048_value = BN_new();
-  DH *const dh = self_test_dh();
-  int dh_ok = 0;
-  if (ffdhe2048_value && dh) {
-    bn_set_static_words(ffdhe2048_value, kFFDHE2048PublicValueData,
-                        OPENSSL_ARRAY_SIZE(kFFDHE2048PublicValueData));
-
-    uint8_t dh_out[sizeof(kDHOutput)];
-    dh_ok =
-        sizeof(dh_out) == DH_size(dh) &&
-        DH_compute_key_padded(dh_out, ffdhe2048_value, dh) == sizeof(dh_out) &&
-        check_test(kDHOutput, dh_out, sizeof(dh_out), "FFC DH");
-  }
-
-  BN_free(ffdhe2048_value);
-  DH_free(dh);
-  if (!dh_ok) {
-    fprintf(stderr, "FFDH failed.\n");
+  if (!boringssl_self_test_sha256() ||
+      !boringssl_self_test_sha512() ||
+      !boringssl_self_test_hmac_sha256()) {
     goto err;
   }
 
   // DBRG KAT
+  static const uint8_t kDRBGEntropy[48] = {
+      0xc4, 0xda, 0x07, 0x40, 0xd5, 0x05, 0xf1, 0xee, 0x28, 0x0b, 0x95, 0xe5,
+      0x8c, 0x49, 0x31, 0xac, 0x6d, 0xe8, 0x46, 0xa0, 0x15, 0x2f, 0xbb, 0x4a,
+      0x3f, 0x17, 0x4c, 0xf4, 0x78, 0x7a, 0x4f, 0x1a, 0x40, 0xc2, 0xb5, 0x0b,
+      0xab, 0xe1, 0x4a, 0xae, 0x53, 0x0b, 0xe5, 0x88, 0x6d, 0x91, 0x0a, 0x27,
+  };
+  static const uint8_t kDRBGPersonalization[18] = "BCMPersonalization";
+  static const uint8_t kDRBGAD[16] = "BCM DRBG KAT AD ";
+  static const uint8_t kDRBGOutput[64] = {
+      0x19, 0x1f, 0x2b, 0x49, 0x76, 0x85, 0xfd, 0x51, 0xb6, 0x56, 0xbc,
+      0x1c, 0x7d, 0xd5, 0xdd, 0x44, 0x76, 0xa3, 0x5e, 0x17, 0x9b, 0x8e,
+      0xb8, 0x98, 0x65, 0x12, 0xca, 0x35, 0x6c, 0xa0, 0x6f, 0xa0, 0x22,
+      0xe4, 0xf6, 0xd8, 0x43, 0xed, 0x4e, 0x2d, 0x97, 0x39, 0x43, 0x3b,
+      0x57, 0xfc, 0x23, 0x3f, 0x71, 0x0a, 0xe0, 0xed, 0xfe, 0xd5, 0xb8,
+      0x67, 0x7a, 0x00, 0x39, 0xb2, 0x6e, 0xa9, 0x25, 0x97,
+  };
+  static const uint8_t kDRBGEntropy2[48] = {
+      0xc7, 0x16, 0x1c, 0xa3, 0x6c, 0x23, 0x09, 0xb7, 0x16, 0xe9, 0x85, 0x9b,
+      0xb9, 0x6c, 0x6d, 0x49, 0xbd, 0xc8, 0x35, 0x21, 0x03, 0xa1, 0x8c, 0xd2,
+      0x4e, 0xf4, 0x2e, 0xc9, 0x7e, 0xf4, 0x6b, 0xf4, 0x46, 0xeb, 0x1a, 0x45,
+      0x76, 0xc1, 0x86, 0xe9, 0x35, 0x18, 0x03, 0x76, 0x3a, 0x79, 0x12, 0xfe,
+  };
+  static const uint8_t kDRBGReseedOutput[64] = {
+      0x00, 0xf2, 0x05, 0xaa, 0xfd, 0x11, 0x6c, 0x77, 0xbc, 0x81, 0x86,
+      0x99, 0xca, 0x51, 0xcf, 0x80, 0x15, 0x9f, 0x02, 0x9e, 0x0b, 0xcd,
+      0x26, 0xc8, 0x4b, 0x87, 0x8a, 0x15, 0x1a, 0xdd, 0xf2, 0xf3, 0xeb,
+      0x94, 0x0b, 0x08, 0xc8, 0xc9, 0x57, 0xa4, 0x0b, 0x4b, 0x0f, 0x13,
+      0xde, 0x7c, 0x0c, 0x6a, 0xac, 0x34, 0x4a, 0x9a, 0xf2, 0xd0, 0x83,
+      0x02, 0x05, 0x17, 0xc9, 0x81, 0x8f, 0x2a, 0x81, 0x92,
+  };
   CTR_DRBG_STATE drbg;
   if (!CTR_DRBG_init(&drbg, kDRBGEntropy, kDRBGPersonalization,
                      sizeof(kDRBGPersonalization)) ||
       !CTR_DRBG_generate(&drbg, output, sizeof(kDRBGOutput), kDRBGAD,
                          sizeof(kDRBGAD)) ||
       !check_test(kDRBGOutput, output, sizeof(kDRBGOutput),
-                  "DBRG Generate KAT") ||
+                  "DRBG Generate KAT") ||
       !CTR_DRBG_reseed(&drbg, kDRBGEntropy2, kDRBGAD, sizeof(kDRBGAD)) ||
       !CTR_DRBG_generate(&drbg, output, sizeof(kDRBGReseedOutput), kDRBGAD,
                          sizeof(kDRBGAD)) ||
       !check_test(kDRBGReseedOutput, output, sizeof(kDRBGReseedOutput),
-                  "DRBG Reseed KAT")) {
+                  "DRBG-reseed KAT")) {
     fprintf(stderr, "CTR-DRBG failed.\n");
     goto err;
   }
@@ -832,43 +914,59 @@
   }
 
   // TLS KDF KAT
+  static const uint8_t kTLSSecret[32] = {
+      0xab, 0xc3, 0x65, 0x7b, 0x09, 0x4c, 0x76, 0x28, 0xa0, 0xb2, 0x82,
+      0x99, 0x6f, 0xe7, 0x5a, 0x75, 0xf4, 0x98, 0x4f, 0xd9, 0x4d, 0x4e,
+      0xcc, 0x2f, 0xcf, 0x53, 0xa2, 0xc4, 0x69, 0xa3, 0xf7, 0x31,
+  };
+  static const char kTLSLabel[] = "FIPS self test";
+  static const uint8_t kTLSSeed1[16] = {
+      0x8f, 0x0d, 0xe8, 0xb6, 0x90, 0x8f, 0xb1, 0xd2,
+      0x6d, 0x51, 0xf4, 0x79, 0x18, 0x63, 0x51, 0x65,
+  };
+  static const uint8_t kTLSSeed2[16] = {
+      0x7d, 0x24, 0x1a, 0x9d, 0x3c, 0x59, 0xbf, 0x3c,
+      0x31, 0x1e, 0x2b, 0x21, 0x41, 0x8d, 0x32, 0x81,
+  };
+  static const uint8_t kTLSOutput[32] = {
+      0xe2, 0x1d, 0xd6, 0xc2, 0x68, 0xc7, 0x57, 0x03, 0x2c, 0x2c, 0xeb,
+      0xbb, 0xb8, 0xa9, 0x7d, 0xe9, 0xee, 0xe6, 0xc9, 0x47, 0x83, 0x0a,
+      0xbd, 0x11, 0x60, 0x5d, 0xd5, 0x2c, 0x47, 0xb6, 0x05, 0x88,
+  };
   uint8_t tls_output[sizeof(kTLSOutput)];
   if (!CRYPTO_tls1_prf(EVP_sha256(), tls_output, sizeof(tls_output), kTLSSecret,
                        sizeof(kTLSSecret), kTLSLabel, sizeof(kTLSLabel),
                        kTLSSeed1, sizeof(kTLSSeed1), kTLSSeed2,
                        sizeof(kTLSSeed2)) ||
-      !check_test(kTLSOutput, tls_output, sizeof(kTLSOutput), "TLS KDF KAT")) {
+      !check_test(kTLSOutput, tls_output, sizeof(kTLSOutput), "TLS-KDF KAT")) {
     fprintf(stderr, "TLS KDF failed.\n");
     goto err;
   }
 
   ret = 1;
 
-#if defined(BORINGSSL_FIPS_SELF_TEST_FLAG_FILE)
-  // Tests were successful. Write flag file if requested.
-  if (module_hash_len != 0 && getenv(kFlagWriteEnableEnvVar) != NULL) {
-    const int fd = open(flag_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-    if (fd >= 0) {
-      close(fd);
-    }
-  }
-#endif  // BORINGSSL_FIPS_SELF_TEST_FLAG_FILE
-
 err:
   EVP_AEAD_CTX_cleanup(&aead_ctx);
-  RSA_free(rsa_key);
-  EC_KEY_free(ec_key);
-  EC_POINT_free(ec_point_in);
-  EC_POINT_free(ec_point_out);
-  EC_GROUP_free(ec_group);
-  BN_free(ec_scalar);
-  ECDSA_SIG_free(sig);
 
   return ret;
 }
 
 int BORINGSSL_self_test(void) {
-  return boringssl_fips_self_test(NULL, 0);
+  if (!boringssl_self_test_fast() ||
+      // When requested to run self tests, also run the lazy tests.
+      !boringssl_self_test_rsa() ||
+      !boringssl_self_test_ecc() ||
+      !boringssl_self_test_ffdh()) {
+    return 0;
+  }
+
+  return 1;
 }
 
+#if defined(BORINGSSL_FIPS)
+int boringssl_self_test_startup(void) {
+  return boringssl_self_test_fast();
+}
+#endif
+
 #endif  // !_MSC_VER
diff --git a/src/crypto/fipsmodule/service_indicator/internal.h b/src/crypto/fipsmodule/service_indicator/internal.h
new file mode 100644
index 0000000..bbc4e4e
--- /dev/null
+++ b/src/crypto/fipsmodule/service_indicator/internal.h
@@ -0,0 +1,89 @@
+/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_SERVICE_INDICATOR_INTERNAL_H
+#define OPENSSL_HEADER_SERVICE_INDICATOR_INTERNAL_H
+
+#include <openssl/base.h>
+#include <openssl/service_indicator.h>
+
+#if defined(BORINGSSL_FIPS)
+
+// FIPS_service_indicator_update_state records that an approved service has been
+// invoked.
+void FIPS_service_indicator_update_state(void);
+
+// FIPS_service_indicator_lock_state and |FIPS_service_indicator_unlock_state|
+// stop |FIPS_service_indicator_update_state| from actually updating the service
+// indicator. This is used when a primitive calls a potentially approved
+// primitive to avoid false positives. For example, just because a key
+// generation calls |RAND_bytes| (and thus the approved DRBG) doesn't mean that
+// the key generation operation itself is approved.
+//
+// This lock nests: i.e. locking twice is fine so long as each lock is paired
+// with an unlock. If the (64-bit) counter overflows, the process aborts.
+void FIPS_service_indicator_lock_state(void);
+void FIPS_service_indicator_unlock_state(void);
+
+// The following functions may call |FIPS_service_indicator_update_state| if
+// their parameter specifies an approved operation.
+
+void AEAD_GCM_verify_service_indicator(const EVP_AEAD_CTX *ctx);
+void AEAD_CCM_verify_service_indicator(const EVP_AEAD_CTX *ctx);
+void EC_KEY_keygen_verify_service_indicator(const EC_KEY *eckey);
+void ECDH_verify_service_indicator(const EC_KEY *ec_key);
+void EVP_Cipher_verify_service_indicator(const EVP_CIPHER_CTX *ctx);
+void EVP_DigestSign_verify_service_indicator(const EVP_MD_CTX *ctx);
+void EVP_DigestVerify_verify_service_indicator(const EVP_MD_CTX *ctx);
+void HMAC_verify_service_indicator(const EVP_MD *evp_md);
+void TLSKDF_verify_service_indicator(const EVP_MD *dgst);
+
+#else
+
+// Service indicator functions are no-ops in non-FIPS builds.
+
+OPENSSL_INLINE void FIPS_service_indicator_update_state(void) {}
+OPENSSL_INLINE void FIPS_service_indicator_lock_state(void) {}
+OPENSSL_INLINE void FIPS_service_indicator_unlock_state(void) {}
+
+OPENSSL_INLINE void AEAD_GCM_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_AEAD_CTX *ctx) {}
+
+OPENSSL_INLINE void AEAD_CCM_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_AEAD_CTX *ctx) {}
+
+OPENSSL_INLINE void EC_KEY_keygen_verify_service_indicator(
+    OPENSSL_UNUSED const EC_KEY *eckey) {}
+
+OPENSSL_INLINE void ECDH_verify_service_indicator(
+    OPENSSL_UNUSED const EC_KEY *ec_key) {}
+
+OPENSSL_INLINE void EVP_Cipher_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_CIPHER_CTX *ctx) {}
+
+OPENSSL_INLINE void EVP_DigestSign_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_MD_CTX *ctx) {}
+
+OPENSSL_INLINE void EVP_DigestVerify_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_MD_CTX *ctx) {}
+
+OPENSSL_INLINE void HMAC_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_MD *evp_md) {}
+
+OPENSSL_INLINE void TLSKDF_verify_service_indicator(
+    OPENSSL_UNUSED const EVP_MD *dgst) {}
+
+#endif  // BORINGSSL_FIPS
+
+#endif  // OPENSSL_HEADER_SERVICE_INDICATOR_INTERNAL_H
diff --git a/src/crypto/fipsmodule/service_indicator/service_indicator.c b/src/crypto/fipsmodule/service_indicator/service_indicator.c
new file mode 100644
index 0000000..febe534
--- /dev/null
+++ b/src/crypto/fipsmodule/service_indicator/service_indicator.c
@@ -0,0 +1,334 @@
+/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <openssl/crypto.h>
+#include <openssl/ec.h>
+#include <openssl/ec_key.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/service_indicator.h>
+
+#include "../../evp/internal.h"
+#include "../../internal.h"
+#include "internal.h"
+
+#if defined(BORINGSSL_FIPS)
+
+#define STATE_UNLOCKED 0
+
+// fips_service_indicator_state is a thread-local structure that stores the
+// state of the FIPS service indicator.
+struct fips_service_indicator_state {
+  // lock_state records the number of times the indicator has been locked.
+  // When it is zero (i.e. |STATE_UNLOCKED|) then the indicator can be updated.
+  uint64_t lock_state;
+  // counter is the indicator state. It is incremented when an approved service
+  // completes.
+  uint64_t counter;
+};
+
+// service_indicator_get returns a pointer to the |fips_service_indicator_state|
+// for the current thread. It returns NULL on error.
+//
+// FIPS 140-3 requires that the module should provide the service indicator
+// for approved services irrespective of whether the user queries it or not.
+// Hence, it is lazily initialized in any call to an approved service.
+static struct fips_service_indicator_state *service_indicator_get(void) {
+  struct fips_service_indicator_state *indicator = CRYPTO_get_thread_local(
+      OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE);
+
+  if (indicator == NULL) {
+    indicator = OPENSSL_malloc(sizeof(struct fips_service_indicator_state));
+    if (indicator == NULL) {
+      OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE);
+      return NULL;
+    }
+
+    indicator->lock_state = STATE_UNLOCKED;
+    indicator->counter = 0;
+
+    if (!CRYPTO_set_thread_local(
+            OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE, indicator,
+            OPENSSL_free)) {
+      OPENSSL_PUT_ERROR(CRYPTO, ERR_R_INTERNAL_ERROR);
+      return NULL;
+    }
+  }
+
+  return indicator;
+}
+
+static uint64_t service_indicator_get_counter(void) {
+  struct fips_service_indicator_state *indicator = service_indicator_get();
+  if (indicator == NULL) {
+    return 0;
+  }
+  return indicator->counter;
+}
+
+uint64_t FIPS_service_indicator_before_call(void) {
+  return service_indicator_get_counter();
+}
+
+uint64_t FIPS_service_indicator_after_call(void) {
+  return service_indicator_get_counter();
+}
+
+void FIPS_service_indicator_update_state(void) {
+  struct fips_service_indicator_state *indicator = service_indicator_get();
+  if (indicator && indicator->lock_state == STATE_UNLOCKED) {
+    indicator->counter++;
+  }
+}
+
+void FIPS_service_indicator_lock_state(void) {
+  struct fips_service_indicator_state *indicator = service_indicator_get();
+  if (indicator == NULL) {
+    return;
+  }
+
+  // |FIPS_service_indicator_lock_state| and
+  // |FIPS_service_indicator_unlock_state| should not under/overflow in normal
+  // operation. They are still checked and errors added to facilitate testing in
+  // service_indicator_test.cc. This should only happen if lock/unlock are
+  // called in an incorrect order or multiple times in the same function.
+  const uint64_t new_state = indicator->lock_state + 1;
+  if (new_state < indicator->lock_state) {
+    // Overflow. This would imply that our call stack length has exceeded a
+    // |uint64_t| which impossible on a 64-bit system.
+    abort();
+  }
+
+  indicator->lock_state = new_state;
+}
+
+void FIPS_service_indicator_unlock_state(void) {
+  struct fips_service_indicator_state *indicator = service_indicator_get();
+  if (indicator == NULL) {
+    return;
+  }
+
+  if (indicator->lock_state == 0) {
+    abort();
+  }
+
+  indicator->lock_state--;
+}
+
+void AEAD_GCM_verify_service_indicator(const EVP_AEAD_CTX *ctx) {
+  const size_t key_len = EVP_AEAD_key_length(ctx->aead);
+  if (key_len == 16 || key_len == 32) {
+    FIPS_service_indicator_update_state();
+  }
+}
+
+void AEAD_CCM_verify_service_indicator(const EVP_AEAD_CTX *ctx) {
+  if (EVP_AEAD_key_length(ctx->aead) == 16 && ctx->tag_len == 4) {
+    FIPS_service_indicator_update_state();
+  }
+}
+
+// is_ec_fips_approved returns one if the curve corresponding to the given NID
+// is FIPS approved, and zero otherwise.
+static int is_ec_fips_approved(int curve_nid) {
+  switch (curve_nid) {
+    case NID_secp224r1:
+    case NID_X9_62_prime256v1:
+    case NID_secp384r1:
+    case NID_secp521r1:
+      return 1;
+    default:
+      return 0;
+  }
+}
+
+// is_md_fips_approved_for_signing returns one if the given message digest type
+// is FIPS approved for signing, and zero otherwise.
+static int is_md_fips_approved_for_signing(int md_type) {
+  switch (md_type) {
+    case NID_sha224:
+    case NID_sha256:
+    case NID_sha384:
+    case NID_sha512:
+    case NID_sha512_256:
+      return 1;
+    default:
+      return 0;
+  }
+}
+
+// is_md_fips_approved_for_verifying returns one if the given message digest
+// type is FIPS approved for verifying, and zero otherwise.
+static int is_md_fips_approved_for_verifying(int md_type) {
+  switch (md_type) {
+    case NID_sha1:
+    case NID_sha224:
+    case NID_sha256:
+    case NID_sha384:
+    case NID_sha512:
+    case NID_sha512_256:
+      return 1;
+    default:
+      return 0;
+  }
+}
+
+static void evp_md_ctx_verify_service_indicator(const EVP_MD_CTX *ctx,
+                                                int rsa_1024_ok,
+                                                int (*md_ok)(int md_type)) {
+  if (EVP_MD_CTX_md(ctx) == NULL) {
+    // Signature schemes without a prehash are currently never FIPS approved.
+    goto err;
+  }
+
+  EVP_PKEY_CTX *const pctx = ctx->pctx;
+  const EVP_PKEY *const pkey = EVP_PKEY_CTX_get0_pkey(pctx);
+  const int pkey_type = EVP_PKEY_id(pkey);
+  const int md_type = EVP_MD_CTX_type(ctx);
+
+  // EVP_PKEY_RSA_PSS SPKIs aren't supported.
+  if (pkey_type == EVP_PKEY_RSA) {
+    // Message digest used in the private key should be of the same type
+    // as the given one, so we extract the MD type from the |EVP_PKEY|
+    // and compare it with the type in |ctx|.
+    const EVP_MD *pctx_md;
+    if (!EVP_PKEY_CTX_get_signature_md(pctx, &pctx_md)) {
+      goto err;
+    }
+    if (EVP_MD_type(pctx_md) != md_type) {
+      goto err;
+    }
+
+    int padding;
+    if (!EVP_PKEY_CTX_get_rsa_padding(pctx, &padding)) {
+      goto err;
+    }
+    if (padding == RSA_PKCS1_PSS_PADDING) {
+      int salt_len;
+      const EVP_MD *mgf1_md;
+      if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pctx, &salt_len) ||
+          !EVP_PKEY_CTX_get_rsa_mgf1_md(pctx, &mgf1_md) ||
+          (salt_len != -1 && salt_len != (int)EVP_MD_size(pctx_md)) ||
+          EVP_MD_type(mgf1_md) != md_type) {
+        // Only PSS where saltLen == hashLen is tested with ACVP. Cases with
+        // non-standard padding functions are also excluded.
+        goto err;
+      }
+    }
+
+    // The approved RSA key sizes for signing are 2048, 3072 and 4096 bits.
+    // Note: |EVP_PKEY_size| returns the size in bytes.
+    size_t pkey_size = EVP_PKEY_size(ctx->pctx->pkey);
+
+    // Check if the MD type and the RSA key size are approved.
+    if (md_ok(md_type) &&
+        ((rsa_1024_ok && pkey_size == 128) || pkey_size == 256 ||
+         pkey_size == 384 || pkey_size == 512)) {
+      FIPS_service_indicator_update_state();
+    }
+  } else if (pkey_type == EVP_PKEY_EC) {
+    // Check if the MD type and the elliptic curve are approved.
+    if (md_ok(md_type) && is_ec_fips_approved(EC_GROUP_get_curve_name(
+                              ctx->pctx->pkey->pkey.ec->group))) {
+      FIPS_service_indicator_update_state();
+    }
+  }
+
+ err:
+  // Ensure that junk errors aren't left on the queue.
+  ERR_clear_error();
+}
+
+void EC_KEY_keygen_verify_service_indicator(const EC_KEY *eckey) {
+  if (is_ec_fips_approved(EC_GROUP_get_curve_name(eckey->group))) {
+    FIPS_service_indicator_update_state();
+  }
+}
+
+void ECDH_verify_service_indicator(const EC_KEY *ec_key) {
+  if (is_ec_fips_approved(EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key)))) {
+    FIPS_service_indicator_update_state();
+  }
+}
+
+void EVP_Cipher_verify_service_indicator(const EVP_CIPHER_CTX *ctx) {
+  switch (EVP_CIPHER_CTX_nid(ctx)) {
+    case NID_aes_128_ecb:
+    case NID_aes_192_ecb:
+    case NID_aes_256_ecb:
+
+    case NID_aes_128_cbc:
+    case NID_aes_192_cbc:
+    case NID_aes_256_cbc:
+
+    case NID_aes_128_ctr:
+    case NID_aes_192_ctr:
+    case NID_aes_256_ctr:
+      FIPS_service_indicator_update_state();
+  }
+}
+
+void EVP_DigestVerify_verify_service_indicator(const EVP_MD_CTX *ctx) {
+  return evp_md_ctx_verify_service_indicator(ctx, /*rsa_1024_ok=*/1,
+                                             is_md_fips_approved_for_verifying);
+}
+
+void EVP_DigestSign_verify_service_indicator(const EVP_MD_CTX *ctx) {
+  return evp_md_ctx_verify_service_indicator(ctx, /*rsa_1024_ok=*/0,
+                                             is_md_fips_approved_for_signing);
+}
+
+void HMAC_verify_service_indicator(const EVP_MD *evp_md) {
+  switch (evp_md->type) {
+    case NID_sha1:
+    case NID_sha224:
+    case NID_sha256:
+    case NID_sha384:
+    case NID_sha512:
+    case NID_sha512_256:
+      FIPS_service_indicator_update_state();
+      break;
+  }
+}
+
+void TLSKDF_verify_service_indicator(const EVP_MD *md) {
+  // HMAC-MD5, HMAC-SHA1, and HMAC-MD5/HMAC-SHA1 (both used concurrently) are
+  // approved for use in the KDF in TLS 1.0/1.1.
+  // HMAC-SHA{256, 384, 512} are approved for use in the KDF in TLS 1.2.
+  // These Key Derivation functions are to be used in the context of the TLS
+  // protocol.
+  switch (EVP_MD_type(md)) {
+    case NID_md5:
+    case NID_sha1:
+    case NID_md5_sha1:
+    case NID_sha256:
+    case NID_sha384:
+    case NID_sha512:
+      FIPS_service_indicator_update_state();
+      break;
+  }
+}
+
+#else
+
+uint64_t FIPS_service_indicator_before_call(void) { return 0; }
+
+uint64_t FIPS_service_indicator_after_call(void) {
+  // One is returned so that the return value is always greater than zero, the
+  // return value of |FIPS_service_indicator_before_call|. This makes everything
+  // report as "approved" in non-FIPS builds.
+  return 1;
+}
+
+#endif  // BORINGSSL_FIPS
diff --git a/src/crypto/fipsmodule/service_indicator/service_indicator_test.cc b/src/crypto/fipsmodule/service_indicator/service_indicator_test.cc
new file mode 100644
index 0000000..4389b98
--- /dev/null
+++ b/src/crypto/fipsmodule/service_indicator/service_indicator_test.cc
@@ -0,0 +1,2411 @@
+/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <gtest/gtest.h>
+
+#include <openssl/aead.h>
+#include <openssl/aes.h>
+#include <openssl/bn.h>
+#include <openssl/cipher.h>
+#include <openssl/cmac.h>
+#include <openssl/crypto.h>
+#include <openssl/ctrdrbg.h>
+#include <openssl/dh.h>
+#include <openssl/digest.h>
+#include <openssl/ec.h>
+#include <openssl/ecdh.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/hmac.h>
+#include <openssl/md4.h>
+#include <openssl/md5.h>
+#include <openssl/rand.h>
+#include <openssl/rsa.h>
+#include <openssl/service_indicator.h>
+
+#include "../../test/abi_test.h"
+#include "../../test/test_util.h"
+#include "../bn/internal.h"
+#include "../rand/internal.h"
+#include "../tls/internal.h"
+
+
+using bssl::FIPSStatus;
+
+static const uint8_t kAESKey[16] = {'A', 'W', 'S', '-', 'L', 'C', 'C', 'r',
+                                    'y', 'p', 't', 'o', ' ', 'K', 'e', 'y'};
+
+static const uint8_t kPlaintext[64] = {
+    'A', 'W', 'S', '-', 'L', 'C', 'C', 'r', 'y', 'p', 't', 'o', 'M',
+    'o', 'd', 'u', 'l', 'e', ' ', 'F', 'I', 'P', 'S', ' ', 'K', 'A',
+    'T', ' ', 'E', 'n', 'c', 'r', 'y', 'p', 't', 'i', 'o', 'n', ' ',
+    'a', 'n', 'd', ' ', 'D', 'e', 'c', 'r', 'y', 'p', 't', 'i', 'o',
+    'n', ' ', 'P', 'l', 'a', 'i', 'n', 't', 'e', 'x', 't', '!'};
+
+#if defined(BORINGSSL_FIPS)
+
+// kEVPKeyGenShouldCallFIPSFunctions determines whether |EVP_PKEY_keygen_*|
+// functions should call the FIPS versions of the key-generation functions.
+static const bool kEVPKeyGenShouldCallFIPSFunctions = false;
+
+// kCurveSecp256k1Supported determines whether secp256k1 tests should be run.
+static const bool kCurveSecp256k1Supported = false;
+
+// kEVPDeriveSetsServiceIndicator is true if `EVP_PKEY_derive` should set the
+// service indicator for some algorithms.
+static const bool kEVPDeriveSetsServiceIndicator = false;
+
+template <typename T>
+class TestWithNoErrors : public testing::TestWithParam<T> {
+  void TearDown() override {
+    if (ERR_peek_error() != 0) {
+      auto f = [](const char *str, size_t len, void *unused) -> int {
+        fprintf(stderr, "%s\n", str);
+        return 1;
+      };
+      ERR_print_errors_cb(f, nullptr);
+      ADD_FAILURE();
+    }
+  }
+};
+
+static const uint8_t kAESKey_192[24] = {'A', 'W', 'S', '-', 'L', 'C', 'C', 'r',
+                                        'y', 'p', 't', 'o', ' ', '1', '9', '2',
+                                        '-', 'b', 'i', 't', ' ', 'K', 'e', 'y'};
+
+static const uint8_t kAESKey_256[32] = {'A', 'W', 'S', '-', 'L', 'C', 'C', 'r',
+                                        'y', 'p', 't', 'o', ' ', '2', '5', '6',
+                                        '-', 'b', 'i', 't', ' ', 'L', 'o', 'n',
+                                        'g', ' ', 'K', 'e', 'y', '!', '!', '!'};
+
+static const uint8_t kAESIV[AES_BLOCK_SIZE] = {0};
+
+static bssl::UniquePtr<DH> GetDH() {
+  // kFFDHE2048PrivateKeyData is a 225-bit value. (225 because that's the
+  // minimum private key size in
+  // https://tools.ietf.org/html/rfc7919#appendix-A.1.)
+  static const uint8_t kFFDHE2048PrivateKey[] = {
+      0x01, 0x91, 0x17, 0x3f, 0x2a, 0x05, 0x70, 0x18, 0x7e, 0xc4,
+      0x22, 0xee, 0xb7, 0x0a, 0x15, 0x2f, 0x39, 0x64, 0x58, 0xf3,
+      0xb8, 0x18, 0x7b, 0xe3, 0x6b, 0xd3, 0x8a, 0x4f, 0xa1};
+  bssl::UniquePtr<BIGNUM> priv(
+      BN_bin2bn(kFFDHE2048PrivateKey, sizeof(kFFDHE2048PrivateKey), nullptr));
+  if (!priv) {
+    return nullptr;
+  }
+  bssl::UniquePtr<DH> dh(DH_get_rfc7919_2048());
+  if (!dh || !DH_set0_key(dh.get(), nullptr, priv.get())) {
+    return nullptr;
+  }
+  priv.release();  // |DH_set0_key| takes ownership on success.
+  return dh;
+}
+
+static void DoCipherFinal(EVP_CIPHER_CTX *ctx, std::vector<uint8_t> *out,
+                          bssl::Span<const uint8_t> in,
+                          FIPSStatus expect_approved) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  size_t max_out = in.size();
+  if (EVP_CIPHER_CTX_encrypting(ctx)) {
+    unsigned block_size = EVP_CIPHER_CTX_block_size(ctx);
+    max_out += block_size - (max_out % block_size);
+  }
+  out->resize(max_out);
+
+  size_t total = 0;
+  int len;
+  ASSERT_TRUE(EVP_CipherUpdate(ctx, out->data(), &len, in.data(), in.size()));
+  total += static_cast<size_t>(len);
+  // Check if the overall service is approved by checking |EVP_CipherFinal_ex|,
+  // which should be the last part of the service.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_CipherFinal_ex(ctx, out->data() + total, &len)));
+  total += static_cast<size_t>(len);
+  ASSERT_LE(total, max_out);
+  out->resize(total);
+
+  EXPECT_EQ(approved, expect_approved);
+}
+
+static const uint8_t kTDES_EDE3_CipherText[64] = {
+    0x2a, 0x17, 0x79, 0x5a, 0x9b, 0x1d, 0xd8, 0x72, 0x06, 0xc6, 0xe7,
+    0x55, 0x14, 0xaa, 0x7b, 0x2a, 0x6e, 0xfc, 0x71, 0x29, 0xff, 0x9b,
+    0x67, 0x73, 0x7c, 0x9e, 0x15, 0x74, 0x80, 0xc8, 0x2f, 0xca, 0x93,
+    0xaa, 0x8e, 0xba, 0x2c, 0x48, 0x88, 0x51, 0xc7, 0xa4, 0xf4, 0xe3,
+    0x2b, 0x33, 0xe5, 0xa1, 0x58, 0x0a, 0x08, 0x3c, 0xb9, 0xf6, 0xf1,
+    0x20, 0x67, 0x02, 0x49, 0xa0, 0x92, 0x18, 0xde, 0x2b};
+
+static const uint8_t kTDES_EDE3_CBCCipherText[64] = {
+    0x2a, 0x17, 0x79, 0x5a, 0x9b, 0x1d, 0xd8, 0x72, 0xbf, 0x3f, 0xfd,
+    0xe4, 0x0d, 0x66, 0x33, 0x49, 0x3b, 0x8c, 0xa6, 0xd0, 0x0a, 0x66,
+    0xae, 0xf1, 0xd9, 0xa7, 0xd6, 0xfb, 0xa2, 0x39, 0x6f, 0xf6, 0x1b,
+    0x8f, 0x67, 0xe1, 0x2b, 0x58, 0x1c, 0xb6, 0xa2, 0xec, 0xb3, 0xc2,
+    0xe6, 0xd1, 0xcc, 0x11, 0x05, 0xdd, 0xee, 0x9d, 0x87, 0x95, 0xe9,
+    0x58, 0xc7, 0xef, 0xa4, 0x6d, 0x5e, 0xd6, 0x57, 0x01};
+
+// AES-OFB is not an approved service, and is only used to test we are not
+// validating un-approved services correctly.
+static const uint8_t kAESOFBCiphertext[64] = {
+    0x49, 0xf5, 0x6a, 0x7d, 0x3e, 0xd7, 0xb2, 0x47, 0x35, 0xca, 0x54,
+    0xf5, 0xf1, 0xb8, 0xd1, 0x48, 0x8e, 0x47, 0x09, 0x95, 0xd5, 0xa0,
+    0xc6, 0xa3, 0xe4, 0x94, 0xaf, 0xd4, 0x1b, 0x64, 0x25, 0x65, 0x28,
+    0x9e, 0x82, 0xba, 0x92, 0xca, 0x75, 0xb3, 0xf3, 0x78, 0x44, 0x87,
+    0xd6, 0x11, 0xf9, 0x22, 0xa3, 0xf3, 0xc6, 0x1d, 0x30, 0x00, 0x5b,
+    0x77, 0x18, 0x38, 0x39, 0x08, 0x5e, 0x0a, 0x56, 0x6b};
+
+static const uint8_t kAESECBCiphertext[64] = {
+    0xa4, 0xc1, 0x5c, 0x51, 0x2a, 0x2e, 0x2a, 0xda, 0xd9, 0x02, 0x23,
+    0xe7, 0xa9, 0x34, 0x9d, 0xd8, 0x15, 0xc5, 0xf5, 0x55, 0x8e, 0xb0,
+    0x29, 0x95, 0x48, 0x6c, 0x7f, 0xa9, 0x47, 0x19, 0x0b, 0x54, 0xe5,
+    0x0f, 0x05, 0x76, 0xbb, 0xd0, 0x1a, 0x6c, 0xab, 0xe9, 0xfd, 0x5b,
+    0xd8, 0x0b, 0x0a, 0xbd, 0x7f, 0xea, 0xda, 0x52, 0x07, 0x65, 0x13,
+    0x6c, 0xbe, 0xfc, 0x36, 0x82, 0x4b, 0x6a, 0xc3, 0xd5};
+
+static const uint8_t kAESECBCiphertext_192[64] = {
+    0x1d, 0xc8, 0xaa, 0xa7, 0x29, 0x01, 0x17, 0x09, 0x72, 0xc6, 0xe9,
+    0x63, 0x02, 0x9d, 0xeb, 0x01, 0xeb, 0xc0, 0xda, 0x82, 0x6c, 0x30,
+    0x7d, 0x60, 0x1b, 0x3e, 0xc7, 0x7b, 0xe3, 0x18, 0xa2, 0x43, 0x59,
+    0x15, 0x4a, 0xe4, 0x8a, 0x84, 0xda, 0x16, 0x90, 0x7b, 0xfa, 0x64,
+    0x37, 0x62, 0x19, 0xf1, 0x95, 0x11, 0x61, 0x84, 0xb0, 0x70, 0x49,
+    0x72, 0x9f, 0xe7, 0x3a, 0x18, 0x99, 0x01, 0xba, 0xb0};
+
+static const uint8_t kAESECBCiphertext_256[64] = {
+    0x6f, 0x2d, 0x6d, 0x7a, 0xc1, 0x8f, 0x00, 0x9f, 0x2d, 0xcf, 0xba,
+    0xe6, 0x4f, 0xdd, 0xe0, 0x09, 0x5b, 0xf3, 0xa4, 0xaf, 0xce, 0x45,
+    0x49, 0x6e, 0x28, 0x7b, 0x48, 0x57, 0xb5, 0xf5, 0xd8, 0x05, 0x16,
+    0x0f, 0xea, 0x21, 0x0c, 0x39, 0x78, 0xee, 0x9e, 0x57, 0x3c, 0x40,
+    0x11, 0x9c, 0xd9, 0x34, 0x97, 0xb9, 0xa6, 0x06, 0x40, 0x60, 0xa2,
+    0x0c, 0x01, 0xe3, 0x9c, 0xda, 0x3e, 0xad, 0x99, 0x3d};
+
+static const uint8_t kAESCBCCiphertext[64] = {
+    0xa4, 0xc1, 0x5c, 0x51, 0x2a, 0x2e, 0x2a, 0xda, 0xd9, 0x02, 0x23,
+    0xe7, 0xa9, 0x34, 0x9d, 0xd8, 0x5c, 0xb3, 0x65, 0x54, 0x72, 0xc8,
+    0x06, 0xf1, 0x36, 0xc3, 0x97, 0x73, 0x87, 0xca, 0x44, 0x99, 0x21,
+    0xb8, 0xdb, 0x93, 0x22, 0x00, 0x89, 0x7c, 0x1c, 0xea, 0x36, 0x23,
+    0x18, 0xdb, 0xc1, 0x52, 0x8c, 0x23, 0x66, 0x11, 0x0d, 0xa8, 0xe9,
+    0xb8, 0x08, 0x8b, 0xaa, 0x81, 0x47, 0x01, 0xa4, 0x4f};
+
+static const uint8_t kAESCBCCiphertext_192[64] = {
+    0x1d, 0xc8, 0xaa, 0xa7, 0x29, 0x01, 0x17, 0x09, 0x72, 0xc6, 0xe9,
+    0x63, 0x02, 0x9d, 0xeb, 0x01, 0xb4, 0x48, 0xa8, 0x00, 0x94, 0x46,
+    0x7f, 0xe3, 0xc1, 0x24, 0xea, 0x41, 0xa0, 0x2b, 0x47, 0x2f, 0xae,
+    0x19, 0xce, 0x0d, 0xfa, 0x90, 0x45, 0x85, 0xce, 0xc4, 0x21, 0x0c,
+    0x74, 0x38, 0x13, 0xfd, 0x64, 0xba, 0x58, 0x10, 0x37, 0x53, 0x48,
+    0x66, 0x02, 0x76, 0xfb, 0xb1, 0x3a, 0x19, 0xce, 0x61};
+
+static const uint8_t kAESCBCCiphertext_256[64] = {
+    0x6f, 0x2d, 0x6d, 0x7a, 0xc1, 0x8f, 0x00, 0x9f, 0x2d, 0xcf, 0xba,
+    0xe6, 0x4f, 0xdd, 0xe0, 0x09, 0x9e, 0xa8, 0x28, 0xdc, 0x27, 0xde,
+    0x89, 0x26, 0xc7, 0x94, 0x6a, 0xbf, 0xb6, 0x94, 0x05, 0x08, 0x6c,
+    0x39, 0x07, 0x52, 0xfa, 0x7b, 0xca, 0x7d, 0x9b, 0xbf, 0xb2, 0x43,
+    0x2b, 0x69, 0xee, 0xc5, 0x68, 0x4c, 0xdd, 0x62, 0xae, 0x8d, 0x7e,
+    0x71, 0x0c, 0x8f, 0x11, 0xce, 0x1d, 0x8b, 0xee, 0x94};
+
+static const uint8_t kAESCTRCiphertext[64] = {
+    0x49, 0xf5, 0x6a, 0x7d, 0x3e, 0xd7, 0xb2, 0x47, 0x35, 0xca, 0x54,
+    0xf5, 0xf1, 0xb8, 0xd1, 0x48, 0xb0, 0x18, 0xc4, 0x5e, 0xeb, 0x42,
+    0xfd, 0x10, 0x49, 0x1f, 0x2b, 0x11, 0xe9, 0xb0, 0x07, 0xa4, 0x00,
+    0x56, 0xec, 0x25, 0x53, 0x4d, 0x70, 0x98, 0x38, 0x85, 0x5d, 0x54,
+    0xab, 0x2c, 0x19, 0x13, 0x6d, 0xf3, 0x0e, 0x6f, 0x48, 0x2f, 0xab,
+    0xe1, 0x82, 0xd4, 0x30, 0xa9, 0x16, 0x73, 0x93, 0xc3};
+
+static const uint8_t kAESCTRCiphertext_192[64] = {
+    0x72, 0x7d, 0xbb, 0xd4, 0x8b, 0x16, 0x8b, 0x19, 0xa4, 0xeb, 0xa6,
+    0xfa, 0xa0, 0xd0, 0x2b, 0xbb, 0x9b, 0x1f, 0xbf, 0x4d, 0x67, 0xfb,
+    0xea, 0x89, 0x16, 0xd7, 0xa4, 0xb6, 0xbe, 0x1a, 0x78, 0x1c, 0x3d,
+    0x44, 0x49, 0xa0, 0xf2, 0xb2, 0xb3, 0x82, 0x0f, 0xdd, 0xac, 0xd6,
+    0xea, 0x6e, 0x1f, 0x09, 0x8d, 0xa5, 0xdb, 0x4f, 0x3f, 0x97, 0x90,
+    0x26, 0xed, 0xf6, 0xbb, 0x62, 0xb3, 0x6f, 0x52, 0x67};
+
+static const uint8_t kAESCTRCiphertext_256[64] = {
+    0x4a, 0x87, 0x44, 0x09, 0xf4, 0x1d, 0x80, 0x94, 0x51, 0x9a, 0xe4,
+    0x89, 0x49, 0xcb, 0x98, 0x0d, 0x27, 0xc5, 0xba, 0x20, 0x00, 0x45,
+    0xbb, 0x29, 0x75, 0xc0, 0xb7, 0x23, 0x0d, 0x81, 0x9f, 0x43, 0xaa,
+    0x78, 0x89, 0xc0, 0xc4, 0x6d, 0x99, 0x0d, 0xb8, 0x9b, 0xc3, 0x25,
+    0xa6, 0xd1, 0x7c, 0x98, 0x3e, 0xff, 0x06, 0x59, 0x41, 0xcf, 0xb2,
+    0xd5, 0x2f, 0x95, 0xea, 0x83, 0xb1, 0x42, 0xb8, 0xb2};
+
+static const uint8_t kAESCFBCiphertext[64] = {
+    0x49, 0xf5, 0x6a, 0x7d, 0x3e, 0xd7, 0xb2, 0x47, 0x35, 0xca, 0x54,
+    0xf5, 0xf1, 0xb8, 0xd1, 0x48, 0x01, 0xdc, 0xba, 0x43, 0x3a, 0x7b,
+    0xbf, 0x84, 0x91, 0x49, 0xc5, 0xc9, 0xd6, 0xcf, 0x6a, 0x2c, 0x3a,
+    0x66, 0x99, 0x68, 0xe3, 0xd0, 0x56, 0x05, 0xe7, 0x99, 0x7f, 0xc3,
+    0xbc, 0x09, 0x13, 0xa6, 0xf0, 0xde, 0x17, 0xf4, 0x85, 0x9a, 0xee,
+    0x29, 0xc3, 0x77, 0xab, 0xc4, 0xf6, 0xdb, 0xae, 0x24};
+
+static const uint8_t kAESCCMCiphertext[64 + 4] = {
+    0x7a, 0x02, 0x5d, 0x48, 0x02, 0x44, 0x78, 0x7f, 0xb4, 0x71, 0x74, 0x7b,
+    0xec, 0x4d, 0x90, 0x29, 0x7b, 0xa7, 0x65, 0xbb, 0x3e, 0x80, 0x41, 0x7e,
+    0xab, 0xb4, 0x58, 0x22, 0x4f, 0x86, 0xcd, 0xcc, 0xc2, 0x12, 0xeb, 0x36,
+    0x39, 0x89, 0xe3, 0x66, 0x2a, 0xbf, 0xe3, 0x6c, 0x95, 0x60, 0x13, 0x9e,
+    0x93, 0xcc, 0xb4, 0x06, 0xbe, 0xaf, 0x3f, 0xba, 0x13, 0x73, 0x09, 0x92,
+    0xd1, 0x80, 0x73, 0xb3, 0xc3, 0xa3, 0xa4, 0x8b,
+};
+
+static const uint8_t kAESKWCiphertext[72] = {
+    0x44, 0xec, 0x7d, 0x92, 0x2c, 0x9f, 0xf3, 0xe8, 0xac, 0xb1, 0xea, 0x3d,
+    0x0a, 0xc7, 0x51, 0x27, 0xe8, 0x03, 0x11, 0x78, 0xe5, 0xaf, 0x8d, 0xb1,
+    0x70, 0x96, 0x2e, 0xfa, 0x05, 0x48, 0x48, 0x99, 0x1a, 0x58, 0xcc, 0xfe,
+    0x11, 0x36, 0x5d, 0x49, 0x98, 0x1e, 0xbb, 0xd6, 0x0b, 0xf5, 0xb9, 0x64,
+    0xa4, 0x30, 0x3e, 0x60, 0xf6, 0xc5, 0xff, 0x82, 0x30, 0x9a, 0xa7, 0x48,
+    0x82, 0xe2, 0x00, 0xc1, 0xe9, 0xc2, 0x73, 0x6f, 0xbc, 0x89, 0x66, 0x9d};
+
+static const uint8_t kAESKWPCiphertext[72] = {
+    0x29, 0x5e, 0xb9, 0xea, 0x96, 0xa7, 0xa5, 0xca, 0xfa, 0xeb, 0xda, 0x78,
+    0x13, 0xea, 0x83, 0xca, 0x41, 0xdb, 0x4d, 0x36, 0x7d, 0x39, 0x8a, 0xd6,
+    0xef, 0xd3, 0xd2, 0x2d, 0x3a, 0xc8, 0x55, 0xc8, 0x73, 0xd7, 0x79, 0x55,
+    0xad, 0xc0, 0xce, 0xad, 0x12, 0x54, 0x51, 0xf0, 0x70, 0x76, 0xff, 0xe7,
+    0x0c, 0xb2, 0x8e, 0xdd, 0xb6, 0x9a, 0x27, 0x74, 0x98, 0x28, 0xe0, 0xfa,
+    0x11, 0xe6, 0x3f, 0x86, 0x93, 0x23, 0xf8, 0x0d, 0xcb, 0xaf, 0x2b, 0xb7};
+
+static const uint8_t kAESCMACOutput[16] = {0xe7, 0x32, 0x43, 0xb4, 0xae, 0x79,
+                                           0x08, 0x86, 0xe7, 0x9f, 0x0d, 0x3f,
+                                           0x88, 0x3f, 0x1a, 0xfd};
+
+const uint8_t kDHOutput[2048 / 8] = {
+    0x83, 0xf0, 0xd8, 0x4f, 0xdb, 0xe7, 0x65, 0xb6, 0x80, 0x6f, 0xa3, 0x22,
+    0x9b, 0x33, 0x1c, 0x87, 0x89, 0xc8, 0x1d, 0x2c, 0xa1, 0xba, 0xa3, 0xb8,
+    0xdf, 0xad, 0x42, 0xea, 0x9a, 0x75, 0xfe, 0xbf, 0xc1, 0xa8, 0xf6, 0xda,
+    0xec, 0xdf, 0x48, 0x61, 0x7d, 0x7f, 0x3d, 0xab, 0xbd, 0xda, 0xd1, 0xd3,
+    0xd8, 0xaf, 0x44, 0x4a, 0xba, 0x3f, 0x0e, 0x99, 0x8d, 0x11, 0xdc, 0x63,
+    0xb1, 0xe0, 0x65, 0xf2, 0xb9, 0x82, 0x81, 0x8c, 0x88, 0x75, 0x8f, 0xa0,
+    0x94, 0x52, 0x2a, 0x2f, 0x2d, 0x10, 0xb1, 0xf4, 0xd2, 0xdd, 0x0f, 0x8a,
+    0x7e, 0x49, 0x7b, 0x1e, 0xfd, 0x8c, 0x78, 0xf9, 0x11, 0xdf, 0x80, 0x8b,
+    0x2e, 0x86, 0x34, 0xbf, 0x4b, 0xca, 0x13, 0x3e, 0x85, 0x63, 0xeb, 0xe4,
+    0xff, 0xec, 0xb0, 0xe8, 0x83, 0xf6, 0x2c, 0x45, 0x21, 0x90, 0x34, 0x9c,
+    0x9d, 0x9d, 0xfe, 0x1a, 0x48, 0x53, 0xef, 0x97, 0xd5, 0xea, 0x6a, 0x65,
+    0xf5, 0xe9, 0x9f, 0x91, 0x4f, 0xb4, 0x43, 0xe7, 0x1f, 0x0a, 0x2e, 0xdb,
+    0xe6, 0x84, 0x30, 0xdb, 0xad, 0xe4, 0xaf, 0x2c, 0xf9, 0x93, 0xe8, 0x0a,
+    0xab, 0x7f, 0x1c, 0xde, 0xb3, 0x80, 0xb6, 0x02, 0x42, 0xba, 0x18, 0x0d,
+    0x0f, 0xc2, 0x1d, 0xa4, 0x4b, 0x2b, 0x84, 0x74, 0x10, 0x97, 0x6d, 0xdc,
+    0xfa, 0x99, 0xdc, 0xba, 0xf2, 0xcb, 0x1b, 0xe8, 0x1a, 0xba, 0x0c, 0x67,
+    0x60, 0x07, 0x87, 0xcc, 0xc6, 0x0d, 0xef, 0x56, 0x07, 0x80, 0x55, 0xae,
+    0x03, 0xa3, 0x62, 0x31, 0x4c, 0x50, 0xf7, 0xf6, 0x87, 0xb3, 0x8d, 0xe2,
+    0x11, 0x86, 0xe7, 0x9d, 0x98, 0x3c, 0x2a, 0x6c, 0x8a, 0xf0, 0xa7, 0x73,
+    0x33, 0x07, 0x4e, 0x70, 0xee, 0x14, 0x4b, 0xa3, 0xf7, 0x4f, 0x8f, 0x1a,
+    0xa2, 0xf6, 0xd1, 0xeb, 0x4d, 0x04, 0xf9, 0x4c, 0x07, 0x36, 0xb1, 0x46,
+    0x53, 0x55, 0xb1, 0x23};
+
+static const uint8_t kOutput_md4[MD4_DIGEST_LENGTH] = {
+    0xab, 0x6b, 0xda, 0x84, 0xc0, 0x6b, 0xd0, 0x1d,
+    0x19, 0xc0, 0x08, 0x11, 0x07, 0x8d, 0xce, 0x0e};
+
+static const uint8_t kOutput_md5[MD5_DIGEST_LENGTH] = {
+    0xe9, 0x70, 0xa2, 0xf7, 0x9c, 0x55, 0x57, 0xac,
+    0x4e, 0x7f, 0x6b, 0xbc, 0xa3, 0xb9, 0xb7, 0xdb};
+
+static const uint8_t kOutput_sha1[SHA_DIGEST_LENGTH] = {
+    0xaa, 0x18, 0x71, 0x34, 0x00, 0x71, 0x67, 0x9f, 0xa1, 0x6d,
+    0x20, 0x82, 0x91, 0x0f, 0x53, 0x0a, 0xcd, 0x6e, 0xa4, 0x34};
+
+static const uint8_t kOutput_sha224[SHA224_DIGEST_LENGTH] = {
+    0x5f, 0x1a, 0x9e, 0x68, 0x4c, 0xb7, 0x42, 0x68, 0xa0, 0x8b,
+    0x87, 0xd7, 0x96, 0xb6, 0xcf, 0x1e, 0x4f, 0x85, 0x1c, 0x47,
+    0xe9, 0x29, 0xb3, 0xb2, 0x73, 0x72, 0xd2, 0x69};
+
+static const uint8_t kOutput_sha256[SHA256_DIGEST_LENGTH] = {
+    0xe7, 0x63, 0x1c, 0xbb, 0x12, 0xb5, 0xbf, 0x4f, 0x99, 0x05, 0x9d,
+    0x40, 0x15, 0x55, 0x34, 0x9c, 0x26, 0x36, 0xd2, 0xfe, 0x6a, 0xd6,
+    0x26, 0xb4, 0x9d, 0x33, 0x07, 0xf5, 0xe6, 0x29, 0x13, 0x92};
+
+static const uint8_t kOutput_sha384[SHA384_DIGEST_LENGTH] = {
+    0x15, 0x81, 0x48, 0x8d, 0x95, 0xf2, 0x66, 0x84, 0x65, 0x94, 0x3e, 0xb9,
+    0x8c, 0xda, 0x36, 0x30, 0x2a, 0x85, 0xc0, 0xcd, 0xec, 0x38, 0xa0, 0x1f,
+    0x72, 0xe2, 0x68, 0xfe, 0x4e, 0xdb, 0x27, 0x8b, 0x50, 0x15, 0xe0, 0x24,
+    0xc3, 0x65, 0xd1, 0x66, 0x2a, 0x3e, 0xe7, 0x00, 0x16, 0x51, 0xf5, 0x18};
+
+static const uint8_t kOutput_sha512[SHA512_DIGEST_LENGTH] = {
+    0x71, 0xcc, 0xec, 0x03, 0xf8, 0x76, 0xf4, 0x0b, 0xf1, 0x1b, 0x89,
+    0x27, 0x83, 0xa1, 0x70, 0x02, 0x00, 0x2b, 0xe9, 0x3c, 0x3c, 0x65,
+    0x12, 0xb9, 0xa8, 0x8c, 0xc5, 0x9d, 0xae, 0x3c, 0x73, 0x43, 0x76,
+    0x4d, 0x98, 0xed, 0xd0, 0xbe, 0xb4, 0xf9, 0x0b, 0x5c, 0x5d, 0x34,
+    0x46, 0x30, 0x18, 0xc2, 0x05, 0x88, 0x8a, 0x3c, 0x25, 0xcc, 0x06,
+    0xf8, 0x73, 0xb9, 0xe4, 0x18, 0xa8, 0xc2, 0xf0, 0xe5};
+
+static const uint8_t kOutput_sha512_256[SHA512_256_DIGEST_LENGTH] = {
+    0x1a, 0x78, 0x68, 0x6b, 0x69, 0x6d, 0x28, 0x14, 0x6b, 0x37, 0x11,
+    0x2d, 0xfb, 0x72, 0x35, 0xfa, 0xc1, 0xc4, 0x5f, 0x5c, 0x49, 0x91,
+    0x08, 0x95, 0x0b, 0x0f, 0xc9, 0x88, 0x44, 0x12, 0x01, 0x6a};
+
+static const uint8_t kHMACOutput_sha1[SHA_DIGEST_LENGTH] = {
+    0x34, 0xac, 0x50, 0x9b, 0xa9, 0x4c, 0x39, 0xef, 0x45, 0xa0,
+    0x6b, 0xdc, 0xfc, 0xbd, 0x3d, 0x42, 0xe8, 0x0a, 0x97, 0x86};
+
+static const uint8_t kHMACOutput_sha224[SHA224_DIGEST_LENGTH] = {
+    0x30, 0x62, 0x97, 0x45, 0x9e, 0xea, 0x62, 0xe4, 0x5d, 0xbb,
+    0x7d, 0x25, 0x3f, 0x77, 0x0f, 0x9d, 0xa4, 0xbd, 0x17, 0x96,
+    0x23, 0x53, 0xe1, 0x76, 0xf3, 0xf8, 0x9b, 0x74};
+
+static const uint8_t kHMACOutput_sha256[SHA256_DIGEST_LENGTH] = {
+    0x68, 0x33, 0x3e, 0x74, 0x9a, 0x49, 0xab, 0x77, 0xb4, 0x1a, 0x40,
+    0xd8, 0x55, 0x07, 0xa7, 0xb6, 0x48, 0xa1, 0xa5, 0xa9, 0xd1, 0x7b,
+    0x85, 0xe9, 0x33, 0x09, 0x16, 0x79, 0xcc, 0xe9, 0x29, 0x97};
+
+static const uint8_t kHMACOutput_sha384[SHA384_DIGEST_LENGTH] = {
+    0xcc, 0x39, 0x22, 0x0e, 0x9f, 0x2e, 0x26, 0x4a, 0xb5, 0xf8, 0x4a, 0x0f,
+    0x73, 0x51, 0x26, 0x1a, 0xf2, 0xef, 0x15, 0xf3, 0x5f, 0x77, 0xce, 0xbb,
+    0x4c, 0x69, 0x86, 0x0e, 0x1f, 0x5c, 0x4d, 0xc9, 0x96, 0xd9, 0xed, 0x74,
+    0x6c, 0x45, 0x05, 0x7a, 0x0e, 0x3f, 0x36, 0x8a, 0xda, 0x2a, 0x35, 0xf9};
+
+static const uint8_t kHMACOutput_sha512[SHA512_DIGEST_LENGTH] = {
+    0x4c, 0x09, 0x46, 0x50, 0x7c, 0xb3, 0xa1, 0xfa, 0xbc, 0xf2, 0xc4,
+    0x4f, 0x1e, 0x3d, 0xa9, 0x0b, 0x29, 0x4e, 0x12, 0x09, 0x09, 0x32,
+    0xde, 0x82, 0xa0, 0xab, 0xf6, 0x5e, 0x66, 0x19, 0xd0, 0x86, 0x9a,
+    0x92, 0xe3, 0xf9, 0x13, 0xa7, 0xe6, 0xfc, 0x1a, 0x2e, 0x50, 0xda,
+    0xf6, 0x8f, 0xb2, 0xd5, 0xb2, 0x6e, 0x97, 0x82, 0x25, 0x5a, 0x1e,
+    0xbf, 0x9b, 0x99, 0x8c, 0xf0, 0x37, 0xe6, 0x3d, 0x40};
+
+static const uint8_t kHMACOutput_sha512_256[SHA512_256_DIGEST_LENGTH] = {
+    0x9c, 0x95, 0x9c, 0x03, 0xc9, 0x8c, 0x90, 0xee, 0x7a, 0xff, 0xed,
+    0x26, 0xba, 0x75, 0x90, 0xd0, 0xb9, 0xd4, 0x09, 0xf5, 0x22, 0xd6,
+    0xb6, 0xab, 0xa8, 0xb9, 0xae, 0x01, 0x06, 0x37, 0x8f, 0xd1};
+
+static const uint8_t kDRBGEntropy[48] = {
+    'B', 'C', 'M', ' ', 'K', 'n', 'o', 'w', 'n', ' ', 'A', 'n',
+    's', 'w', 'e', 'r', ' ', 'T', 'e', 's', 't', ' ', 'D', 'B',
+    'R', 'G', ' ', 'I', 'n', 'i', 't', 'i', 'a', 'l', ' ', 'E',
+    'n', 't', 'r', 'o', 'p', 'y', ' ', ' ', ' ', ' ', ' ', ' '};
+
+static const uint8_t kDRBGPersonalization[18] = {'B', 'C', 'M', 'P', 'e', 'r',
+                                                 's', 'o', 'n', 'a', 'l', 'i',
+                                                 'z', 'a', 't', 'i', 'o', 'n'};
+
+static const uint8_t kDRBGAD[16] = {'B', 'C', 'M', ' ', 'D', 'R', 'B', 'G',
+                                    ' ', 'K', 'A', 'T', ' ', 'A', 'D', ' '};
+
+const uint8_t kDRBGOutput[64] = {
+    0x1d, 0x63, 0xdf, 0x05, 0x51, 0x49, 0x22, 0x46, 0xcd, 0x9b, 0xc5,
+    0xbb, 0xf1, 0x5d, 0x44, 0xae, 0x13, 0x78, 0xb1, 0xe4, 0x7c, 0xf1,
+    0x96, 0x33, 0x3d, 0x60, 0xb6, 0x29, 0xd4, 0xbb, 0x6b, 0x44, 0xf9,
+    0xef, 0xd9, 0xf4, 0xa2, 0xba, 0x48, 0xea, 0x39, 0x75, 0x59, 0x32,
+    0xf7, 0x31, 0x2c, 0x98, 0x14, 0x2b, 0x49, 0xdf, 0x02, 0xb6, 0x5d,
+    0x71, 0x09, 0x50, 0xdb, 0x23, 0xdb, 0xe5, 0x22, 0x95};
+
+static const uint8_t kDRBGEntropy2[48] = {
+    'B', 'C', 'M', ' ', 'K', 'n', 'o', 'w', 'n', ' ', 'A', 'n',
+    's', 'w', 'e', 'r', ' ', 'T', 'e', 's', 't', ' ', 'D', 'B',
+    'R', 'G', ' ', 'R', 'e', 's', 'e', 'e', 'd', ' ', 'E', 'n',
+    't', 'r', 'o', 'p', 'y', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
+
+static const uint8_t kDRBGReseedOutput[64] = {
+    0xa4, 0x77, 0x05, 0xdb, 0x14, 0x11, 0x76, 0x71, 0x42, 0x5b, 0xd8,
+    0xd7, 0xa5, 0x4f, 0x8b, 0x39, 0xf2, 0x10, 0x4a, 0x50, 0x5b, 0xa2,
+    0xc8, 0xf0, 0xbb, 0x3e, 0xa1, 0xa5, 0x90, 0x7d, 0x54, 0xd9, 0xc6,
+    0xb0, 0x96, 0xc0, 0x2b, 0x7e, 0x9b, 0xc9, 0xa1, 0xdd, 0x78, 0x2e,
+    0xd5, 0xa8, 0x66, 0x16, 0xbd, 0x18, 0x3c, 0xf2, 0xaa, 0x7a, 0x2b,
+    0x37, 0xf9, 0xab, 0x35, 0x64, 0x15, 0x01, 0x3f, 0xc4,
+};
+
+static const uint8_t kTLSSecret[32] = {
+    0xbf, 0xe4, 0xb7, 0xe0, 0x26, 0x55, 0x5f, 0x6a, 0xdf, 0x5d, 0x27,
+    0xd6, 0x89, 0x99, 0x2a, 0xd6, 0xf7, 0x65, 0x66, 0x07, 0x4b, 0x55,
+    0x5f, 0x64, 0x55, 0xcd, 0xd5, 0x77, 0xa4, 0xc7, 0x09, 0x61,
+};
+static const char kTLSLabel[] = "FIPS self test";
+static const uint8_t kTLSSeed1[16] = {
+    0x8f, 0x0d, 0xe8, 0xb6, 0x90, 0x8f, 0xb1, 0xd2,
+    0x6d, 0x51, 0xf4, 0x79, 0x18, 0x63, 0x51, 0x65,
+};
+static const uint8_t kTLSSeed2[16] = {
+    0x7d, 0x24, 0x1a, 0x9d, 0x3c, 0x59, 0xbf, 0x3c,
+    0x31, 0x1e, 0x2b, 0x21, 0x41, 0x8d, 0x32, 0x81,
+};
+
+static const uint8_t kTLSOutput_mdsha1[32] = {
+    0x36, 0xa9, 0x31, 0xb0, 0x43, 0xe3, 0x64, 0x72, 0xb9, 0x47, 0x54,
+    0x0d, 0x8a, 0xfc, 0xe3, 0x5c, 0x1c, 0x15, 0x67, 0x7e, 0xa3, 0x5d,
+    0xf2, 0x3a, 0x57, 0xfd, 0x50, 0x16, 0xe1, 0xa4, 0xa6, 0x37,
+};
+
+static const uint8_t kTLSOutput_md[32] = {
+    0x79, 0xef, 0x46, 0xc4, 0x35, 0xbc, 0xe5, 0xda, 0xd3, 0x66, 0x91,
+    0xdc, 0x86, 0x09, 0x41, 0x66, 0xf2, 0x0c, 0xeb, 0xe6, 0xab, 0x5c,
+    0x58, 0xf4, 0x65, 0xce, 0x2f, 0x5f, 0x4b, 0x34, 0x1e, 0xa1,
+};
+
+static const uint8_t kTLSOutput_sha1[32] = {
+    0xbb, 0x0a, 0x73, 0x52, 0xf8, 0x85, 0xd7, 0xbd, 0x12, 0x34, 0x78,
+    0x3b, 0x54, 0x4c, 0x75, 0xfe, 0xd7, 0x23, 0x6e, 0x22, 0x3f, 0x42,
+    0x34, 0x99, 0x57, 0x6b, 0x14, 0xc4, 0xc8, 0xae, 0x9f, 0x4c,
+};
+
+static const uint8_t kTLSOutput_sha224[32] = {
+    0xdd, 0xaf, 0x6f, 0xaa, 0xd9, 0x2b, 0x3d, 0xb9, 0x46, 0x4c, 0x55,
+    0x8a, 0xf7, 0xa6, 0x9b, 0x0b, 0x35, 0xcc, 0x07, 0xa7, 0x55, 0x5b,
+    0x5e, 0x39, 0x12, 0xc0, 0xd4, 0x30, 0xdf, 0x0c, 0xdf, 0x6b,
+};
+
+static const uint8_t kTLSOutput_sha256[32] = {
+    0x67, 0x85, 0xde, 0x60, 0xfc, 0x0a, 0x83, 0xe9, 0xa2, 0x2a, 0xb3,
+    0xf0, 0x27, 0x0c, 0xba, 0xf7, 0xfa, 0x82, 0x3d, 0x14, 0x77, 0x1d,
+    0x86, 0x29, 0x79, 0x39, 0x77, 0x8a, 0xd5, 0x0e, 0x9d, 0x32,
+};
+
+static const uint8_t kTLSOutput_sha384[32] = {
+    0x75, 0x15, 0x3f, 0x44, 0x7a, 0xfd, 0x34, 0xed, 0x2b, 0x67, 0xbc,
+    0xd8, 0x57, 0x96, 0xab, 0xff, 0xf4, 0x0c, 0x05, 0x94, 0x02, 0x23,
+    0x81, 0xbf, 0x0e, 0xd2, 0xec, 0x7c, 0xe0, 0xa7, 0xc3, 0x7d,
+};
+
+static const uint8_t kTLSOutput_sha512[32] = {
+    0x68, 0xb9, 0xc8, 0x4c, 0xf5, 0x51, 0xfc, 0x7a, 0x1f, 0x6c, 0xe5,
+    0x43, 0x73, 0x80, 0x53, 0x7c, 0xae, 0x76, 0x55, 0x67, 0xe0, 0x79,
+    0xbf, 0x3a, 0x53, 0x71, 0xb7, 0x9c, 0xb5, 0x03, 0x15, 0x3f,
+};
+
+static const uint8_t kAESGCMCiphertext_128[64 + 16] = {
+    0x38, 0x71, 0xcb, 0x61, 0x70, 0x60, 0x13, 0x8b, 0x2f, 0x91, 0x09, 0x7f,
+    0x83, 0x20, 0x0f, 0x1f, 0x71, 0xe2, 0x47, 0x46, 0x6f, 0x5f, 0xa8, 0xad,
+    0xa8, 0xfc, 0x0a, 0xfd, 0x36, 0x65, 0x84, 0x90, 0x28, 0x2b, 0xcb, 0x4f,
+    0x68, 0xae, 0x09, 0xba, 0xae, 0xdd, 0xdb, 0x91, 0xcc, 0x38, 0xb3, 0xad,
+    0x10, 0x84, 0xb8, 0x45, 0x36, 0xf3, 0x96, 0xb4, 0xef, 0xba, 0xda, 0x10,
+    0xf8, 0x8b, 0xf3, 0xda, 0x91, 0x1f, 0x8c, 0xd8, 0x39, 0x7b, 0x1c, 0xfd,
+    0xe7, 0x99, 0x7d, 0xb7, 0x22, 0x69, 0x67, 0xbd,
+};
+
+static const uint8_t kAESGCMCiphertext_192[64 + 16] = {
+    0x05, 0x63, 0x6e, 0xe4, 0xd1, 0x9f, 0xd0, 0x91, 0x18, 0xc9, 0xf8, 0xfd,
+    0xc2, 0x62, 0x09, 0x05, 0x91, 0xb4, 0x92, 0x66, 0x18, 0xe7, 0x93, 0x6a,
+    0xc7, 0xde, 0x81, 0x36, 0x93, 0x79, 0x45, 0x34, 0xc0, 0x6d, 0x14, 0x94,
+    0x93, 0x39, 0x2b, 0x7f, 0x4f, 0x10, 0x1c, 0xa5, 0xfe, 0x3b, 0x37, 0xd7,
+    0x0a, 0x98, 0xd7, 0xb5, 0xe0, 0xdc, 0xe4, 0x9f, 0x36, 0x40, 0xad, 0x03,
+    0xbf, 0x53, 0xe0, 0x7c, 0x3f, 0x57, 0x4f, 0x80, 0x99, 0xe6, 0x90, 0x4e,
+    0x59, 0x2e, 0xe0, 0x76, 0x53, 0x09, 0xc3, 0xd3,
+};
+
+static const uint8_t kAESGCMCiphertext_256[64 + 16] = {
+    0x92, 0x5f, 0xae, 0x84, 0xe7, 0x40, 0xfa, 0x1e, 0xaf, 0x8f, 0x97, 0x0e,
+    0x8e, 0xdd, 0x6a, 0x94, 0x22, 0xee, 0x4f, 0x70, 0x66, 0xbf, 0xb1, 0x99,
+    0x05, 0xbd, 0xd0, 0xd7, 0x91, 0x54, 0xaf, 0xe1, 0x52, 0xc9, 0x4e, 0x55,
+    0xa5, 0x23, 0x62, 0x8b, 0x23, 0x40, 0x90, 0x56, 0xe0, 0x68, 0x63, 0xe5,
+    0x7e, 0x5b, 0xbe, 0x96, 0x7b, 0xc4, 0x16, 0xf9, 0xbe, 0x18, 0x06, 0x79,
+    0x8f, 0x99, 0x35, 0xe3, 0x2a, 0x82, 0xb5, 0x5e, 0x8a, 0x06, 0xbe, 0x99,
+    0x57, 0xb1, 0x76, 0xe1, 0xc5, 0xaa, 0x82, 0xe7,
+};
+
+static const struct AEADTestVector {
+  const char *name;
+  const EVP_AEAD *aead;
+  const uint8_t *key;
+  const int key_length;
+  const uint8_t *expected_ciphertext;
+  const int cipher_text_length;
+  const FIPSStatus expect_approved;
+  const bool test_repeat_nonce;
+} kAEADTestVectors[] = {
+    // Internal IV usage of AES-GCM is approved.
+    {
+        "AES-GCM 128-bit key internal iv test",
+        EVP_aead_aes_128_gcm_randnonce(),
+        kAESKey,
+        sizeof(kAESKey),
+        nullptr,
+        0,
+        FIPSStatus::APPROVED,
+        false,
+    },
+    {
+        "AES-GCM 256-bit key internal iv test",
+        EVP_aead_aes_256_gcm_randnonce(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        nullptr,
+        0,
+        FIPSStatus::APPROVED,
+        false,
+    },
+    // External IV usage of AES-GCM is not approved unless used within a TLS
+    // context.
+    {
+        "Generic AES-GCM 128-bit key external iv test",
+        EVP_aead_aes_128_gcm(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESGCMCiphertext_128,
+        sizeof(kAESGCMCiphertext_128),
+        FIPSStatus::NOT_APPROVED,
+        false,
+    },
+    {
+        "Generic AES-GCM 192-bit key external iv test",
+        EVP_aead_aes_192_gcm(),
+        kAESKey_192,
+        24,
+        kAESGCMCiphertext_192,
+        sizeof(kAESGCMCiphertext_192),
+        FIPSStatus::NOT_APPROVED,
+        false,
+    },
+    {
+        "Generic AES-GCM 256-bit key external iv test",
+        EVP_aead_aes_256_gcm(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESGCMCiphertext_256,
+        sizeof(kAESGCMCiphertext_256),
+        FIPSStatus::NOT_APPROVED,
+        false,
+    },
+    // External IV usage of AEAD AES-GCM APIs specific for TLS is approved.
+    {
+        "TLS1.2 AES-GCM 128-bit key external iv test",
+        EVP_aead_aes_128_gcm_tls12(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESGCMCiphertext_128,
+        sizeof(kAESGCMCiphertext_128),
+        FIPSStatus::APPROVED,
+        true,
+    },
+    {
+        "TLS1.2 AES-GCM 256-bit key external iv test",
+        EVP_aead_aes_256_gcm_tls12(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESGCMCiphertext_256,
+        sizeof(kAESGCMCiphertext_256),
+        FIPSStatus::APPROVED,
+        true,
+    },
+    {
+        "TLS1.3 AES-GCM 128-bit key external iv test",
+        EVP_aead_aes_128_gcm_tls13(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESGCMCiphertext_128,
+        sizeof(kAESGCMCiphertext_128),
+        FIPSStatus::APPROVED,
+        true,
+    },
+    {
+        "TLS1.3 AES-GCM 256-bit key external iv test",
+        EVP_aead_aes_256_gcm_tls13(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESGCMCiphertext_256,
+        sizeof(kAESGCMCiphertext_256),
+        FIPSStatus::APPROVED,
+        true,
+    },
+    // 128 bit keys with 32 bit tag lengths are approved for AES-CCM.
+    {
+        "AES-CCM 128-bit key test",
+        EVP_aead_aes_128_ccm_bluetooth(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESCCMCiphertext,
+        sizeof(kAESCCMCiphertext),
+        FIPSStatus::APPROVED,
+        false,
+    },
+};
+
+class AEADServiceIndicatorTest : public TestWithNoErrors<AEADTestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, AEADServiceIndicatorTest,
+                         testing::ValuesIn(kAEADTestVectors));
+
+TEST_P(AEADServiceIndicatorTest, EVP_AEAD) {
+  const AEADTestVector &test = GetParam();
+  SCOPED_TRACE(test.name);
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::ScopedEVP_AEAD_CTX aead_ctx;
+  std::vector<uint8_t> nonce(EVP_AEAD_nonce_length(test.aead), 0);
+  std::vector<uint8_t> encrypt_output(256);
+  std::vector<uint8_t> decrypt_output(256);
+  size_t out_len;
+
+  // Test running the EVP_AEAD_CTX interfaces one by one directly, and check
+  // |EVP_AEAD_CTX_seal| and |EVP_AEAD_CTX_open| for approval at the end.
+  // |EVP_AEAD_CTX_init| should not be approved because the function does not
+  // indicate that a service has been fully completed yet.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_AEAD_CTX_init(aead_ctx.get(), test.aead, test.key,
+                                  test.key_length, 0, nullptr)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_AEAD_CTX_seal(aead_ctx.get(), encrypt_output.data(),
+                                  &out_len, encrypt_output.size(), nonce.data(),
+                                  EVP_AEAD_nonce_length(test.aead), kPlaintext,
+                                  sizeof(kPlaintext), nullptr, 0)));
+  EXPECT_EQ(approved, test.expect_approved);
+  encrypt_output.resize(out_len);
+  if (test.expected_ciphertext) {
+    EXPECT_EQ(Bytes(test.expected_ciphertext, test.cipher_text_length),
+              Bytes(encrypt_output));
+  }
+
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_AEAD_CTX_open(aead_ctx.get(), decrypt_output.data(), &out_len,
+                        decrypt_output.size(), nonce.data(), nonce.size(),
+                        encrypt_output.data(), out_len, nullptr, 0)));
+  // Decryption doesn't have nonce uniqueness requirements and so is always
+  // approved for approved key lengths.
+  EXPECT_EQ(approved, test.key_length != 24 ? FIPSStatus::APPROVED
+                                            : FIPSStatus::NOT_APPROVED);
+  decrypt_output.resize(out_len);
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(decrypt_output));
+
+  // Second call when encrypting using the same nonce for AES-GCM TLS specific
+  // functions should fail and return |FIPSStatus::NOT_APPROVED|.
+  if (test.test_repeat_nonce) {
+    ASSERT_FALSE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        EVP_AEAD_CTX_seal(aead_ctx.get(), encrypt_output.data(), &out_len,
+                          encrypt_output.size(), nonce.data(), nonce.size(),
+                          kPlaintext, sizeof(kPlaintext), nullptr, 0)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+    EXPECT_EQ(ERR_GET_REASON(ERR_get_error()), CIPHER_R_INVALID_NONCE);
+  }
+}
+
+static const struct CipherTestVector {
+  const EVP_CIPHER *cipher;
+  const uint8_t *key;
+  const int key_length;
+  const uint8_t *expected_ciphertext;
+  const int cipher_text_length;
+  const bool has_iv;
+  const FIPSStatus expect_approved;
+} kTestVectors[] = {
+    {
+        EVP_aes_128_ecb(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESECBCiphertext,
+        sizeof(kAESECBCiphertext),
+        false,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_192_ecb(),
+        kAESKey_192,
+        sizeof(kAESKey_192),
+        kAESECBCiphertext_192,
+        sizeof(kAESECBCiphertext_192),
+        false,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_256_ecb(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESECBCiphertext_256,
+        sizeof(kAESECBCiphertext_256),
+        false,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_128_cbc(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESCBCCiphertext,
+        sizeof(kAESCBCCiphertext),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_192_cbc(),
+        kAESKey_192,
+        sizeof(kAESKey_192),
+        kAESCBCCiphertext_192,
+        sizeof(kAESCBCCiphertext_192),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_256_cbc(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESCBCCiphertext_256,
+        sizeof(kAESCBCCiphertext_256),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_128_ctr(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESCTRCiphertext,
+        sizeof(kAESCTRCiphertext),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_192_ctr(),
+        kAESKey_192,
+        sizeof(kAESKey_192),
+        kAESCTRCiphertext_192,
+        sizeof(kAESCTRCiphertext_192),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_256_ctr(),
+        kAESKey_256,
+        sizeof(kAESKey_256),
+        kAESCTRCiphertext_256,
+        sizeof(kAESCTRCiphertext_256),
+        true,
+        FIPSStatus::APPROVED,
+    },
+    {
+        EVP_aes_128_ofb(),
+        kAESKey,
+        sizeof(kAESKey),
+        kAESOFBCiphertext,
+        sizeof(kAESOFBCiphertext),
+        true,
+        FIPSStatus::NOT_APPROVED,
+    },
+    {
+        EVP_des_ede3(),
+        kAESKey_192,
+        sizeof(kAESKey_192),
+        kTDES_EDE3_CipherText,
+        sizeof(kTDES_EDE3_CipherText),
+        false,
+        FIPSStatus::NOT_APPROVED,
+    },
+    {
+        EVP_des_ede3_cbc(),
+        kAESKey_192,
+        sizeof(kAESKey_192),
+        kTDES_EDE3_CBCCipherText,
+        sizeof(kTDES_EDE3_CBCCipherText),
+        false,
+        FIPSStatus::NOT_APPROVED,
+    },
+};
+
+class EVPServiceIndicatorTest : public TestWithNoErrors<CipherTestVector> {};
+
+static void TestOperation(const EVP_CIPHER *cipher, bool encrypt,
+                          const bssl::Span<const uint8_t> key,
+                          const bssl::Span<const uint8_t> plaintext,
+                          const bssl::Span<const uint8_t> ciphertext,
+                          FIPSStatus expect_approved) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  bssl::Span<const uint8_t> in, out;
+  if (encrypt) {
+    in = plaintext;
+    out = ciphertext;
+  } else {
+    in = ciphertext;
+    out = plaintext;
+  }
+
+  bssl::ScopedEVP_CIPHER_CTX ctx;
+  // Test running the EVP_Cipher interfaces one by one directly, and check
+  // |EVP_EncryptFinal_ex| and |EVP_DecryptFinal_ex| for approval at the end.
+  ASSERT_TRUE(EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr,
+                                encrypt ? 1 : 0));
+  ASSERT_LE(EVP_CIPHER_CTX_iv_length(ctx.get()), sizeof(kAESIV));
+
+  ASSERT_TRUE(EVP_CIPHER_CTX_set_key_length(ctx.get(), key.size()));
+  ASSERT_TRUE(EVP_CipherInit_ex(ctx.get(), cipher, nullptr, key.data(), kAESIV,
+                                encrypt ? 1 : 0));
+  ASSERT_TRUE(EVP_CIPHER_CTX_set_padding(ctx.get(), 0));
+  std::vector<uint8_t> encrypt_result;
+  DoCipherFinal(ctx.get(), &encrypt_result, in, expect_approved);
+  EXPECT_EQ(Bytes(out), Bytes(encrypt_result));
+
+  // Test using the one-shot |EVP_Cipher| function for approval.
+  bssl::ScopedEVP_CIPHER_CTX ctx2;
+  uint8_t output[256];
+  ASSERT_TRUE(EVP_CipherInit_ex(ctx2.get(), cipher, nullptr, key.data(), kAESIV,
+                                encrypt ? 1 : 0));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_Cipher(ctx2.get(), output, in.data(), in.size()));
+  EXPECT_EQ(approved, expect_approved);
+  EXPECT_EQ(Bytes(out), Bytes(output, in.size()));
+}
+
+INSTANTIATE_TEST_SUITE_P(All, EVPServiceIndicatorTest,
+                         testing::ValuesIn(kTestVectors));
+
+TEST_P(EVPServiceIndicatorTest, EVP_Ciphers) {
+  const CipherTestVector &test = GetParam();
+
+  const EVP_CIPHER *cipher = test.cipher;
+  std::vector<uint8_t> key(test.key, test.key + test.key_length);
+  std::vector<uint8_t> plaintext(kPlaintext, kPlaintext + sizeof(kPlaintext));
+  std::vector<uint8_t> ciphertext(
+      test.expected_ciphertext,
+      test.expected_ciphertext + test.cipher_text_length);
+
+  TestOperation(cipher, true /* encrypt */, key, plaintext, ciphertext,
+                test.expect_approved);
+  TestOperation(cipher, false /* decrypt */, key, plaintext, ciphertext,
+                test.expect_approved);
+}
+
+static const struct DigestTestVector {
+  // name is the name of the digest test.
+  const char *name;
+  // length of digest.
+  const int length;
+  // func is the digest to test.
+  const EVP_MD *(*func)();
+  // one_shot_func is the convenience one-shot version of the digest.
+  uint8_t *(*one_shot_func)(const uint8_t *, size_t, uint8_t *);
+  // expected_digest is the expected digest.
+  const uint8_t *expected_digest;
+  // expected to be approved or not.
+  const FIPSStatus expect_approved;
+} kDigestTestVectors[] = {
+    {
+        "MD4",
+        MD4_DIGEST_LENGTH,
+        &EVP_md4,
+        &MD4,
+        kOutput_md4,
+        FIPSStatus::NOT_APPROVED,
+    },
+    {
+        "MD5",
+        MD5_DIGEST_LENGTH,
+        &EVP_md5,
+        &MD5,
+        kOutput_md5,
+        FIPSStatus::NOT_APPROVED,
+    },
+    {
+        "SHA-1",
+        SHA_DIGEST_LENGTH,
+        &EVP_sha1,
+        &SHA1,
+        kOutput_sha1,
+        FIPSStatus::APPROVED,
+    },
+    {
+        "SHA-224",
+        SHA224_DIGEST_LENGTH,
+        &EVP_sha224,
+        &SHA224,
+        kOutput_sha224,
+        FIPSStatus::APPROVED,
+    },
+    {
+        "SHA-256",
+        SHA256_DIGEST_LENGTH,
+        &EVP_sha256,
+        &SHA256,
+        kOutput_sha256,
+        FIPSStatus::APPROVED,
+    },
+    {
+        "SHA-384",
+        SHA384_DIGEST_LENGTH,
+        &EVP_sha384,
+        &SHA384,
+        kOutput_sha384,
+        FIPSStatus::APPROVED,
+    },
+    {
+        "SHA-512",
+        SHA512_DIGEST_LENGTH,
+        &EVP_sha512,
+        &SHA512,
+        kOutput_sha512,
+        FIPSStatus::APPROVED,
+    },
+    {
+        "SHA-512/256",
+        SHA512_256_DIGEST_LENGTH,
+        &EVP_sha512_256,
+        &SHA512_256,
+        kOutput_sha512_256,
+        FIPSStatus::APPROVED,
+    },
+};
+
+class EVPMDServiceIndicatorTest : public TestWithNoErrors<DigestTestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, EVPMDServiceIndicatorTest,
+                         testing::ValuesIn(kDigestTestVectors));
+
+TEST_P(EVPMDServiceIndicatorTest, EVP_Digests) {
+  const DigestTestVector &test = GetParam();
+  SCOPED_TRACE(test.name);
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  bssl::ScopedEVP_MD_CTX ctx;
+  std::vector<uint8_t> digest(test.length);
+  unsigned digest_len;
+
+  // Test running the EVP_Digest interfaces one by one directly, and check
+  // |EVP_DigestFinal_ex| for approval at the end. |EVP_DigestInit_ex| and
+  // |EVP_DigestUpdate| should not be approved, because the functions do not
+  // indicate that a service has been fully completed yet.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestInit_ex(ctx.get(), test.func(), nullptr)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestUpdate(ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestFinal_ex(ctx.get(), digest.data(), &digest_len)));
+  EXPECT_EQ(approved, test.expect_approved);
+  EXPECT_EQ(Bytes(test.expected_digest, digest_len), Bytes(digest));
+
+  // Test using the one-shot |EVP_Digest| function for approval.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_Digest(kPlaintext, sizeof(kPlaintext), digest.data(),
+                           &digest_len, test.func(), nullptr)));
+  EXPECT_EQ(approved, test.expect_approved);
+  EXPECT_EQ(Bytes(test.expected_digest, test.length), Bytes(digest));
+
+  // Test using the one-shot API for approval.
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      test.one_shot_func(kPlaintext, sizeof(kPlaintext), digest.data()));
+  EXPECT_EQ(approved, test.expect_approved);
+  EXPECT_EQ(Bytes(test.expected_digest, test.length), Bytes(digest));
+}
+
+static const struct HMACTestVector {
+  // func is the hash function for HMAC to test.
+  const EVP_MD *(*func)(void);
+  // expected_digest is the expected digest.
+  const uint8_t *expected_digest;
+  // expected to be approved or not.
+  const FIPSStatus expect_approved;
+} kHMACTestVectors[] = {
+    {EVP_sha1, kHMACOutput_sha1, FIPSStatus::APPROVED},
+    {EVP_sha224, kHMACOutput_sha224, FIPSStatus::APPROVED},
+    {EVP_sha256, kHMACOutput_sha256, FIPSStatus::APPROVED},
+    {EVP_sha384, kHMACOutput_sha384, FIPSStatus::APPROVED},
+    {EVP_sha512, kHMACOutput_sha512, FIPSStatus::APPROVED},
+    {EVP_sha512_256, kHMACOutput_sha512_256, FIPSStatus::APPROVED},
+};
+
+class HMACServiceIndicatorTest : public TestWithNoErrors<HMACTestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, HMACServiceIndicatorTest,
+                         testing::ValuesIn(kHMACTestVectors));
+
+TEST_P(HMACServiceIndicatorTest, HMACTest) {
+  const HMACTestVector &test = GetParam();
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  // The key is deliberately long in order to trigger digesting it down to a
+  // block size. This tests that doing so does not cause the indicator to be
+  // mistakenly set in |HMAC_Init_ex|.
+  const uint8_t kHMACKey[512] = {0};
+  const EVP_MD *const digest = test.func();
+  const unsigned expected_mac_len = EVP_MD_size(digest);
+  std::vector<uint8_t> mac(expected_mac_len);
+
+  // Test running the HMAC interfaces one by one directly, and check
+  // |HMAC_Final| for approval at the end. |HMAC_Init_ex| and |HMAC_Update|
+  // should not be approved, because the functions do not indicate that a
+  // service has been fully completed yet.
+  unsigned mac_len;
+  bssl::ScopedHMAC_CTX ctx;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      HMAC_Init_ex(ctx.get(), kHMACKey, sizeof(kHMACKey), digest, nullptr)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, HMAC_Update(ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, HMAC_Final(ctx.get(), mac.data(), &mac_len)));
+  EXPECT_EQ(approved, test.expect_approved);
+  EXPECT_EQ(Bytes(test.expected_digest, expected_mac_len),
+            Bytes(mac.data(), mac_len));
+
+  // Test using the one-shot API for approval.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, HMAC(digest, kHMACKey, sizeof(kHMACKey), kPlaintext,
+                     sizeof(kPlaintext), mac.data(), &mac_len)));
+  EXPECT_EQ(approved, test.expect_approved);
+  EXPECT_EQ(Bytes(test.expected_digest, expected_mac_len),
+            Bytes(mac.data(), mac_len));
+}
+
+// RSA tests are not parameterized with the |kRSATestVectors| as key
+// generation for RSA is time consuming.
+TEST(ServiceIndicatorTest, RSAKeyGen) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  bssl::UniquePtr<RSA> rsa(RSA_new());
+  ASSERT_TRUE(rsa);
+
+  // |RSA_generate_key_fips| may only be used for 2048-, 3072-, and 4096-bit
+  // keys.
+  for (const size_t bits : {512, 1024, 3071, 4095}) {
+    SCOPED_TRACE(bits);
+
+    rsa.reset(RSA_new());
+    EXPECT_FALSE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, RSA_generate_key_fips(rsa.get(), bits, nullptr)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  }
+
+  // Test that we can generate keys of the supported lengths:
+  for (const size_t bits : {2048, 3072, 4096}) {
+    SCOPED_TRACE(bits);
+
+    rsa.reset(RSA_new());
+    EXPECT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, RSA_generate_key_fips(rsa.get(), bits, nullptr)));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+    EXPECT_EQ(bits, BN_num_bits(rsa->n));
+  }
+
+  // Test running the EVP_PKEY_keygen interfaces one by one directly, and check
+  // |EVP_PKEY_keygen| for approval at the end. |EVP_PKEY_keygen_init| should
+  // not be approved because it does not indicate an entire service has been
+  // completed.
+  bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr));
+  EVP_PKEY *raw = nullptr;
+  bssl::UniquePtr<EVP_PKEY> pkey(raw);
+  ASSERT_TRUE(ctx);
+
+  if (kEVPKeyGenShouldCallFIPSFunctions) {
+    // Test unapproved key sizes of RSA.
+    for (const size_t bits : {512, 1024, 3071, 4095}) {
+      SCOPED_TRACE(bits);
+      ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+          approved, EVP_PKEY_keygen_init(ctx.get())));
+      EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+      ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx.get(), bits));
+      ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+          approved, EVP_PKEY_keygen(ctx.get(), &raw)));
+      EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+      pkey.reset(raw);
+      raw = nullptr;
+    }
+
+    // Test approved key sizes of RSA.
+    for (const size_t bits : {2048, 3072, 4096}) {
+      SCOPED_TRACE(bits);
+      ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+          approved, EVP_PKEY_keygen_init(ctx.get())));
+      EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+      ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx.get(), bits));
+      ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+          approved, EVP_PKEY_keygen(ctx.get(), &raw)));
+      EXPECT_EQ(approved, FIPSStatus::APPROVED);
+      pkey.reset(raw);
+      raw = nullptr;
+    }
+  }
+}
+
+struct RSATestVector {
+  // key_size is the input rsa key size.
+  int key_size;
+  // md_func is the digest to test.
+  const EVP_MD *(*func)();
+  // whether to use pss testing or not.
+  bool use_pss;
+  // expected to be approved or not for signature generation.
+  FIPSStatus sig_gen_expect_approved;
+  // expected to be approved or not for signature verification.
+  FIPSStatus sig_ver_expect_approved;
+};
+
+static const struct RSATestVector kRSATestVectors[] = {
+    // RSA test cases that are not approved in any case.
+    {512, &EVP_sha1, false, FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    // PSS with hashLen == saltLen is not possible for 512-bit modulus.
+    {1024, &EVP_md5, false, FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {1536, &EVP_sha256, false, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED},
+    {1536, &EVP_sha512, true, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED},
+    {2048, &EVP_md5, false, FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {3071, &EVP_md5, true, FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {3071, &EVP_sha256, false, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED},
+    {3071, &EVP_sha512, true, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED},
+    {4096, &EVP_md5, false, FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+
+    // RSA test cases that are approved.
+    {1024, &EVP_sha1, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {1024, &EVP_sha256, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {1024, &EVP_sha512, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {1024, &EVP_sha1, true, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {1024, &EVP_sha256, true, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    // PSS with hashLen == saltLen is not possible for 1024-bit modulus and
+    // SHA-512.
+
+    {2048, &EVP_sha1, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha224, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha256, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha384, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha512, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha1, true, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha224, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha256, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha384, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {2048, &EVP_sha512, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+
+    {3072, &EVP_sha1, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha224, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha256, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha384, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha512, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha1, true, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha224, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha256, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha384, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {3072, &EVP_sha512, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+
+    {4096, &EVP_sha1, false, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha224, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha256, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha384, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha512, false, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha1, true, FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha224, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha256, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha384, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {4096, &EVP_sha512, true, FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+};
+
+class RSAServiceIndicatorTest : public TestWithNoErrors<RSATestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, RSAServiceIndicatorTest,
+                         testing::ValuesIn(kRSATestVectors));
+
+static std::map<unsigned, bssl::UniquePtr<RSA>> &CachedRSAKeys() {
+  static std::map<unsigned, bssl::UniquePtr<RSA>> keys;
+  return keys;
+}
+
+static RSA *GetRSAKey(unsigned bits) {
+  auto it = CachedRSAKeys().find(bits);
+  if (it != CachedRSAKeys().end()) {
+    return it->second.get();
+  }
+
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  if (!e || !BN_set_word(e.get(), RSA_F4)) {
+    abort();
+  }
+
+  bssl::UniquePtr<RSA> key(RSA_new());
+  if (!key || !RSA_generate_key_ex(key.get(), bits, e.get(), nullptr)) {
+    abort();
+  }
+
+  RSA *const ret = key.get();
+  CachedRSAKeys().emplace(static_cast<unsigned>(bits), std::move(key));
+
+  return ret;
+}
+
+TEST_P(RSAServiceIndicatorTest, RSASigGen) {
+  const RSATestVector &test = GetParam();
+  SCOPED_TRACE(test.key_size);
+
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
+  ASSERT_TRUE(pkey);
+
+  RSA *const rsa = GetRSAKey(test.key_size);
+  ASSERT_TRUE(EVP_PKEY_set1_RSA(pkey.get(), rsa));
+
+  // Test running the EVP_DigestSign interfaces one by one directly, and check
+  // |EVP_DigestSignFinal| for approval at the end. |EVP_DigestSignInit|, and
+  // |EVP_DigestSignUpdate| should not be approved because they do not indicate
+  // an entire service has been completed.
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  EVP_PKEY_CTX *pctx = nullptr;
+  size_t sig_len;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                   pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  if (test.use_pss) {
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  }
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestSignUpdate(md_ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  // Determine the size of the signature. The first call of
+  // |EVP_DigestSignFinal| should not return an approval check because no crypto
+  // is being done when |nullptr| is inputted in the |*out_sig| field.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignFinal(md_ctx.get(), nullptr, &sig_len)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  std::vector<uint8_t> signature(sig_len);
+  // The second call performs the actual operation.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignFinal(md_ctx.get(), signature.data(), &sig_len)));
+  EXPECT_EQ(approved, test.sig_gen_expect_approved);
+
+  // Test using the one-shot |EVP_DigestSign| function for approval.
+  md_ctx.Reset();
+  std::vector<uint8_t> oneshot_output(sig_len);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                   pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  if (test.use_pss) {
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  }
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSign(md_ctx.get(), oneshot_output.data(), &sig_len,
+                               kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, test.sig_gen_expect_approved);
+
+  if (test.use_pss) {
+    // Odd configurations of PSS, for example where the salt length is not equal
+    // to the hash length, are not approved.
+    md_ctx.Reset();
+    ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                   pkey.get()));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, 10));
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_DigestSign(md_ctx.get(), oneshot_output.data(), &sig_len,
+                                 kPlaintext, sizeof(kPlaintext))));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  }
+}
+
+TEST_P(RSAServiceIndicatorTest, RSASigVer) {
+  const RSATestVector &test = GetParam();
+
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
+  RSA *const rsa = GetRSAKey(test.key_size);
+
+  ASSERT_TRUE(pkey);
+  ASSERT_TRUE(EVP_PKEY_set1_RSA(pkey.get(), rsa));
+
+  std::vector<uint8_t> signature;
+  size_t sig_len;
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  EVP_PKEY_CTX *pctx = nullptr;
+  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                 pkey.get()));
+  if (test.use_pss) {
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1));
+  }
+  ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, nullptr, 0));
+  signature.resize(sig_len);
+  ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), signature.data(), &sig_len,
+                             kPlaintext, sizeof(kPlaintext)));
+  signature.resize(sig_len);
+
+  // Service Indicator approval checks for RSA signature verification.
+
+  // Test running the EVP_DigestVerify interfaces one by one directly, and check
+  // |EVP_DigestVerifyFinal| for approval at the end. |EVP_DigestVerifyInit|,
+  // |EVP_DigestVerifyUpdate| should not be approved because they do not
+  // indicate an entire service has been done.
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  md_ctx.Reset();
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestVerifyInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                     pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  if (test.use_pss) {
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1));
+  }
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerifyUpdate(md_ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerifyFinal(md_ctx.get(), signature.data(), signature.size())));
+  EXPECT_EQ(approved, test.sig_ver_expect_approved);
+
+  // Test using the one-shot |EVP_DigestVerify| function for approval.
+  md_ctx.Reset();
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestVerifyInit(md_ctx.get(), &pctx, test.func(), nullptr,
+                                     pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  if (test.use_pss) {
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)));
+    EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+    ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1));
+  }
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerify(md_ctx.get(), signature.data(), signature.size(),
+                       kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, test.sig_ver_expect_approved);
+}
+
+struct ECDSATestVector {
+  // nid is the input curve nid.
+  int nid;
+  // md_func is the digest to test.
+  const EVP_MD *(*func)();
+  // expected to be approved or not for signature generation.
+  FIPSStatus key_check_expect_approved;
+  // expected to be approved or not for signature generation.
+  FIPSStatus sig_gen_expect_approved;
+  // expected to be approved or not for signature verification.
+  FIPSStatus sig_ver_expect_approved;
+};
+
+static const struct ECDSATestVector kECDSATestVectors[] = {
+    // Only the following NIDs for |EC_GROUP| are creatable with
+    // |EC_GROUP_new_by_curve_name|, and |NID_secp256k1| will only work if
+    // |kCurveSecp256k1Supported| is true.
+    {NID_secp224r1, &EVP_sha1, FIPSStatus::APPROVED, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp224r1, &EVP_sha224, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp224r1, &EVP_sha256, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp224r1, &EVP_sha384, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp224r1, &EVP_sha512, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+
+    {NID_X9_62_prime256v1, &EVP_sha1, FIPSStatus::APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, &EVP_sha224, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, &EVP_sha256, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, &EVP_sha384, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, &EVP_sha512, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED, FIPSStatus::APPROVED},
+
+    {NID_secp384r1, &EVP_sha1, FIPSStatus::APPROVED, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp384r1, &EVP_sha224, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp384r1, &EVP_sha256, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp384r1, &EVP_sha384, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp384r1, &EVP_sha512, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+
+    {NID_secp521r1, &EVP_sha1, FIPSStatus::APPROVED, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp521r1, &EVP_sha224, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp521r1, &EVP_sha256, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp521r1, &EVP_sha384, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+    {NID_secp521r1, &EVP_sha512, FIPSStatus::APPROVED, FIPSStatus::APPROVED,
+     FIPSStatus::APPROVED},
+
+    {NID_secp256k1, &EVP_sha1, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, &EVP_sha224, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, &EVP_sha256, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, &EVP_sha384, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, &EVP_sha512, FIPSStatus::NOT_APPROVED,
+     FIPSStatus::NOT_APPROVED, FIPSStatus::NOT_APPROVED},
+};
+
+class ECDSAServiceIndicatorTest : public TestWithNoErrors<ECDSATestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, ECDSAServiceIndicatorTest,
+                         testing::ValuesIn(kECDSATestVectors));
+
+TEST_P(ECDSAServiceIndicatorTest, ECDSAKeyCheck) {
+  const ECDSATestVector &test = GetParam();
+  if (test.nid == NID_secp256k1 && !kCurveSecp256k1Supported) {
+    GTEST_SKIP();
+  }
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  // Test service indicator approval for |EC_KEY_generate_key_fips| and
+  // |EC_KEY_check_fips|.
+  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(test.nid));
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EC_KEY_generate_key_fips(key.get())));
+  EXPECT_EQ(approved, test.key_check_expect_approved);
+  ASSERT_TRUE(
+      CALL_SERVICE_AND_CHECK_APPROVED(approved, EC_KEY_check_fips(key.get())));
+  EXPECT_EQ(approved, test.key_check_expect_approved);
+
+  // See if |EC_KEY_check_fips| still returns approval with only the public
+  // component.
+  bssl::UniquePtr<EC_KEY> key_only_public(EC_KEY_new_by_curve_name(test.nid));
+  ASSERT_TRUE(EC_KEY_set_public_key(key_only_public.get(),
+                                    EC_KEY_get0_public_key(key.get())));
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EC_KEY_check_fips(key_only_public.get())));
+  EXPECT_EQ(approved, test.key_check_expect_approved);
+
+  if (kEVPKeyGenShouldCallFIPSFunctions) {
+    // Test running the EVP_PKEY_keygen interfaces one by one directly, and
+    // check |EVP_PKEY_keygen| for approval at the end. |EVP_PKEY_keygen_init|
+    // should not be approved because it does not indicate that an entire
+    // service has been completed.
+    bssl::UniquePtr<EVP_PKEY_CTX> ctx(
+        EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr));
+    EVP_PKEY *raw = nullptr;
+    ASSERT_TRUE(ctx);
+    ASSERT_TRUE(EVP_PKEY_keygen_init(ctx.get()));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx.get(), test.nid));
+    ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+        approved, EVP_PKEY_keygen(ctx.get(), &raw)));
+    EXPECT_EQ(approved, test.key_check_expect_approved);
+
+    EVP_PKEY_free(raw);
+  }
+}
+
+TEST_P(ECDSAServiceIndicatorTest, ECDSASigGen) {
+  const ECDSATestVector &test = GetParam();
+  if (test.nid == NID_secp256k1 && !kCurveSecp256k1Supported) {
+    GTEST_SKIP();
+  }
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::UniquePtr<EC_GROUP> group(EC_GROUP_new_by_curve_name(test.nid));
+  bssl::UniquePtr<EC_KEY> eckey(EC_KEY_new());
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  ASSERT_TRUE(eckey);
+  ASSERT_TRUE(EC_KEY_set_group(eckey.get(), group.get()));
+
+  // Generate a generic EC key.
+  ASSERT_TRUE(EC_KEY_generate_key(eckey.get()));
+  ASSERT_TRUE(EVP_PKEY_set1_EC_KEY(pkey.get(), eckey.get()));
+
+  // Test running the EVP_DigestSign interfaces one by one directly, and check
+  // |EVP_DigestSignFinal| for approval at the end. |EVP_DigestSignInit|,
+  // |EVP_DigestSignUpdate| should not be approved because they do not indicate
+  // an entire service has been done.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignInit(md_ctx.get(), nullptr, test.func(), nullptr,
+                                   pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestSignUpdate(md_ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  // Determine the size of the signature. The first call of
+  // |EVP_DigestSignFinal| should not return an approval check because no crypto
+  // is being done when |nullptr| is given as the |out_sig| field.
+  size_t max_sig_len;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignFinal(md_ctx.get(), nullptr, &max_sig_len)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  std::vector<uint8_t> signature(max_sig_len);
+  // The second call performs the actual operation.
+  size_t sig_len = max_sig_len;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignFinal(md_ctx.get(), signature.data(), &sig_len)));
+  ASSERT_LE(sig_len, signature.size());
+  EXPECT_EQ(approved, test.sig_gen_expect_approved);
+
+  // Test using the one-shot |EVP_DigestSign| function for approval.
+  md_ctx.Reset();
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSignInit(md_ctx.get(), nullptr, test.func(), nullptr,
+                                   pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  sig_len = max_sig_len;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestSign(md_ctx.get(), signature.data(), &sig_len,
+                               kPlaintext, sizeof(kPlaintext))));
+  ASSERT_LE(sig_len, signature.size());
+  EXPECT_EQ(approved, test.sig_gen_expect_approved);
+}
+
+TEST_P(ECDSAServiceIndicatorTest, ECDSASigVer) {
+  const ECDSATestVector &test = GetParam();
+  if (test.nid == NID_secp256k1 && !kCurveSecp256k1Supported) {
+    GTEST_SKIP();
+  }
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::UniquePtr<EC_GROUP> group(EC_GROUP_new_by_curve_name(test.nid));
+  bssl::UniquePtr<EC_KEY> eckey(EC_KEY_new());
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  ASSERT_TRUE(eckey);
+  ASSERT_TRUE(EC_KEY_set_group(eckey.get(), group.get()));
+
+  // Generate ECDSA signatures for ECDSA verification.
+  ASSERT_TRUE(EC_KEY_generate_key(eckey.get()));
+  ASSERT_TRUE(EVP_PKEY_set1_EC_KEY(pkey.get(), eckey.get()));
+  std::vector<uint8_t> signature;
+  size_t sig_len = 0;
+  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, test.func(), nullptr,
+                                 pkey.get()));
+  ASSERT_TRUE(EVP_DigestSignFinal(md_ctx.get(), nullptr, &sig_len));
+  signature.resize(sig_len);
+  ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), signature.data(), &sig_len,
+                             kPlaintext, sizeof(kPlaintext)));
+  signature.resize(sig_len);
+
+  // Service Indicator approval checks for ECDSA signature verification.
+
+  // Test running the EVP_DigestVerify interfaces one by one directly, and check
+  // |EVP_DigestVerifyFinal| for approval at the end. |EVP_DigestVerifyInit|,
+  // |EVP_DigestVerifyUpdate| should not be approved because they do not
+  // indicate an entire service has been done.
+  md_ctx.Reset();
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestVerifyInit(md_ctx.get(), nullptr, test.func(),
+                                     nullptr, pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerifyUpdate(md_ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerifyFinal(md_ctx.get(), signature.data(), signature.size())));
+  EXPECT_EQ(approved, test.sig_ver_expect_approved);
+
+  // Test using the one-shot |EVP_DigestVerify| function for approval.
+  md_ctx.Reset();
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_DigestVerifyInit(md_ctx.get(), nullptr, test.func(),
+                                     nullptr, pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_DigestVerify(md_ctx.get(), signature.data(), signature.size(),
+                       kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, test.sig_ver_expect_approved);
+}
+
+#if defined(AWSLC_FIPS)
+
+// Test that |EVP_DigestSignFinal| and |EVP_DigestSignVerify| are approved with
+// manually constructing using the context setting functions.
+TEST_P(ECDSAServiceIndicatorTest, ManualECDSASignVerify) {
+  const ECDSATestVector &test = GetParam();
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::ScopedEVP_MD_CTX ctx;
+  ASSERT_TRUE(EVP_DigestInit(ctx.get(), test.func()));
+  ASSERT_TRUE(EVP_DigestUpdate(ctx.get(), kPlaintext, sizeof(kPlaintext)));
+
+  bssl::UniquePtr<EC_GROUP> group(EC_GROUP_new_by_curve_name(test.nid));
+  bssl::UniquePtr<EC_KEY> eckey(EC_KEY_new());
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  ASSERT_TRUE(eckey);
+  ASSERT_TRUE(EC_KEY_set_group(eckey.get(), group.get()));
+
+  // Generate a generic ec key.
+  EC_KEY_generate_key(eckey.get());
+  ASSERT_TRUE(EVP_PKEY_set1_EC_KEY(pkey.get(), eckey.get()));
+
+  // Manual construction for signing.
+  bssl::UniquePtr<EVP_PKEY_CTX> pctx(EVP_PKEY_CTX_new(pkey.get(), nullptr));
+  ASSERT_TRUE(EVP_PKEY_sign_init(pctx.get()));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_signature_md(pctx.get(), test.func()));
+  EVP_MD_CTX_set_pkey_ctx(ctx.get(), pctx.get());
+  // Determine the size of the signature.
+  size_t sig_len = 0;
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, ASSERT_TRUE(EVP_DigestSignFinal(ctx.get(), nullptr, &sig_len)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  std::vector<uint8_t> sig;
+  sig.resize(sig_len);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      ASSERT_TRUE(EVP_DigestSignFinal(ctx.get(), sig.data(), &sig_len)));
+  EXPECT_EQ(approved, test.sig_gen_expect_approved);
+  sig.resize(sig_len);
+
+  // Manual construction for verification.
+  ASSERT_TRUE(EVP_PKEY_verify_init(pctx.get()));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_signature_md(pctx.get(), test.func()));
+  EVP_MD_CTX_set_pkey_ctx(ctx.get(), pctx.get());
+
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      ASSERT_TRUE(EVP_DigestVerifyFinal(ctx.get(), sig.data(), sig_len)));
+  EXPECT_EQ(approved, test.sig_ver_expect_approved);
+}
+
+#endif  // AWSLC_FIPS
+
+struct ECDHTestVector {
+  // nid is the input curve nid.
+  const int nid;
+  // digest_length is the length of the hash output to test with.
+  const int digest_length;
+  // expect_approved to be approved or not.
+  const FIPSStatus expect_approved;
+};
+
+static const struct ECDHTestVector kECDHTestVectors[] = {
+    // Only the following NIDs for |EC_GROUP| are creatable with
+    // |EC_GROUP_new_by_curve_name|.
+    // |ECDH_compute_key_fips| fails directly when an invalid hash length is
+    // inputted.
+    {NID_secp224r1, SHA224_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp224r1, SHA256_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp224r1, SHA384_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp224r1, SHA512_DIGEST_LENGTH, FIPSStatus::APPROVED},
+
+    {NID_X9_62_prime256v1, SHA224_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, SHA256_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, SHA384_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_X9_62_prime256v1, SHA512_DIGEST_LENGTH, FIPSStatus::APPROVED},
+
+    {NID_secp384r1, SHA224_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp384r1, SHA256_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp384r1, SHA384_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp384r1, SHA512_DIGEST_LENGTH, FIPSStatus::APPROVED},
+
+    {NID_secp521r1, SHA224_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp521r1, SHA256_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp521r1, SHA384_DIGEST_LENGTH, FIPSStatus::APPROVED},
+    {NID_secp521r1, SHA512_DIGEST_LENGTH, FIPSStatus::APPROVED},
+
+    {NID_secp256k1, SHA224_DIGEST_LENGTH, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, SHA256_DIGEST_LENGTH, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, SHA384_DIGEST_LENGTH, FIPSStatus::NOT_APPROVED},
+    {NID_secp256k1, SHA512_DIGEST_LENGTH, FIPSStatus::NOT_APPROVED},
+};
+
+class ECDH_ServiceIndicatorTest : public TestWithNoErrors<ECDHTestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, ECDH_ServiceIndicatorTest,
+                         testing::ValuesIn(kECDHTestVectors));
+
+TEST_P(ECDH_ServiceIndicatorTest, ECDH) {
+  const ECDHTestVector &test = GetParam();
+  if (test.nid == NID_secp256k1 && !kCurveSecp256k1Supported) {
+    GTEST_SKIP();
+  }
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::UniquePtr<EC_GROUP> group(EC_GROUP_new_by_curve_name(test.nid));
+  bssl::UniquePtr<EC_KEY> our_key(EC_KEY_new());
+  bssl::UniquePtr<EC_KEY> peer_key(EC_KEY_new());
+  bssl::ScopedEVP_MD_CTX md_ctx;
+  ASSERT_TRUE(our_key);
+  ASSERT_TRUE(peer_key);
+
+  // Generate two generic ec key pairs.
+  ASSERT_TRUE(EC_KEY_set_group(our_key.get(), group.get()));
+  ASSERT_TRUE(EC_KEY_generate_key(our_key.get()));
+  ASSERT_TRUE(EC_KEY_check_key(our_key.get()));
+
+  ASSERT_TRUE(EC_KEY_set_group(peer_key.get(), group.get()));
+  ASSERT_TRUE(EC_KEY_generate_key(peer_key.get()));
+  ASSERT_TRUE(EC_KEY_check_key(peer_key.get()));
+
+  // Test that |ECDH_compute_key_fips| has service indicator approval as
+  // expected.
+  std::vector<uint8_t> digest(test.digest_length);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, ECDH_compute_key_fips(digest.data(), digest.size(),
+                                      EC_KEY_get0_public_key(peer_key.get()),
+                                      our_key.get())));
+  EXPECT_EQ(approved, test.expect_approved);
+
+  // Test running the EVP_PKEY_derive interfaces one by one directly, and check
+  // |EVP_PKEY_derive| for approval at the end. |EVP_PKEY_derive_init| and
+  // |EVP_PKEY_derive_set_peer| should not be approved because they do not
+  // indicate an entire service has been done.
+  bssl::UniquePtr<EVP_PKEY> our_pkey(EVP_PKEY_new());
+  ASSERT_TRUE(EVP_PKEY_set1_EC_KEY(our_pkey.get(), our_key.get()));
+  bssl::UniquePtr<EVP_PKEY_CTX> our_ctx(
+      EVP_PKEY_CTX_new(our_pkey.get(), nullptr));
+  bssl::UniquePtr<EVP_PKEY> peer_pkey(EVP_PKEY_new());
+  ASSERT_TRUE(EVP_PKEY_set1_EC_KEY(peer_pkey.get(), peer_key.get()));
+
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_PKEY_derive_init(our_ctx.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_PKEY_derive_set_peer(our_ctx.get(), peer_pkey.get())));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  // Determine the size of the output key. The first call of |EVP_PKEY_derive|
+  // should not return an approval check because no crypto is being done when
+  // |nullptr| is inputted in the |*key| field
+  size_t out_len = 0;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_PKEY_derive(our_ctx.get(), nullptr, &out_len)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  std::vector<uint8_t> derive_output(out_len);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_PKEY_derive(our_ctx.get(), derive_output.data(), &out_len)));
+  EXPECT_EQ(approved, kEVPDeriveSetsServiceIndicator
+                          ? test.expect_approved
+                          : FIPSStatus::NOT_APPROVED);
+}
+
+static const struct KDFTestVector {
+  // func is the hash function for KDF to test.
+  const EVP_MD *(*func)();
+  const uint8_t *expected_output;
+  const FIPSStatus expect_approved;
+} kKDFTestVectors[] = {
+    {EVP_md5, kTLSOutput_md, FIPSStatus::APPROVED},
+    {EVP_sha1, kTLSOutput_sha1, FIPSStatus::APPROVED},
+    {EVP_md5_sha1, kTLSOutput_mdsha1, FIPSStatus::APPROVED},
+    {EVP_sha224, kTLSOutput_sha224, FIPSStatus::NOT_APPROVED},
+    {EVP_sha256, kTLSOutput_sha256, FIPSStatus::APPROVED},
+    {EVP_sha384, kTLSOutput_sha384, FIPSStatus::APPROVED},
+    {EVP_sha512, kTLSOutput_sha512, FIPSStatus::APPROVED},
+};
+
+class KDF_ServiceIndicatorTest : public TestWithNoErrors<KDFTestVector> {};
+
+INSTANTIATE_TEST_SUITE_P(All, KDF_ServiceIndicatorTest,
+                         testing::ValuesIn(kKDFTestVectors));
+
+TEST_P(KDF_ServiceIndicatorTest, TLSKDF) {
+  const KDFTestVector &test = GetParam();
+
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  uint8_t output[32];
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CRYPTO_tls1_prf(test.func(), output, sizeof(output), kTLSSecret,
+                                sizeof(kTLSSecret), kTLSLabel,
+                                sizeof(kTLSLabel), kTLSSeed1, sizeof(kTLSSeed1),
+                                kTLSSeed2, sizeof(kTLSSeed2))));
+  EXPECT_EQ(Bytes(test.expected_output, sizeof(output)),
+            Bytes(output, sizeof(output)));
+  EXPECT_EQ(approved, test.expect_approved);
+}
+
+TEST(ServiceIndicatorTest, CMAC) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::UniquePtr<CMAC_CTX> ctx(CMAC_CTX_new());
+  ASSERT_TRUE(ctx);
+
+  // Test running the CMAC interfaces one by one directly, and check
+  // |CMAC_Final| for approval at the end. |CMAC_Init| and |CMAC_Update|
+  // should not be approved, because the functions do not indicate that a
+  // service has been fully completed yet.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CMAC_Init(ctx.get(), kAESKey, sizeof(kAESKey),
+                          EVP_aes_128_cbc(), nullptr)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CMAC_Update(ctx.get(), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  uint8_t mac[16];
+  size_t out_len;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CMAC_Final(ctx.get(), mac, &out_len)));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  EXPECT_EQ(Bytes(kAESCMACOutput), Bytes(mac));
+
+  // Test using the one-shot API for approval.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_CMAC(mac, kAESKey, sizeof(kAESKey), kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(Bytes(kAESCMACOutput), Bytes(mac));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, BasicTest) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  bssl::ScopedEVP_AEAD_CTX aead_ctx;
+  ASSERT_TRUE(EVP_AEAD_CTX_init(aead_ctx.get(),
+                                EVP_aead_aes_128_gcm_randnonce(), kAESKey,
+                                sizeof(kAESKey), 0, nullptr));
+  // This test ensures that the counter gets incremented once, i.e. it was
+  // locked through the internal calls.
+  const int counter_before = FIPS_service_indicator_after_call();
+  size_t out_len;
+  uint8_t output[256];
+  EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len, sizeof(output), nullptr,
+                    0, kPlaintext, sizeof(kPlaintext), nullptr, 0);
+  const int counter_after = FIPS_service_indicator_after_call();
+  EXPECT_EQ(counter_after, counter_before + 1);
+
+  // Call an approved service.
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len,
+                                  sizeof(output), nullptr, 0, kPlaintext,
+                                  sizeof(kPlaintext), nullptr, 0));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // Fail an approved service on purpose.
+  ASSERT_FALSE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len, 0, nullptr, 0,
+                        kPlaintext, sizeof(kPlaintext), nullptr, 0)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  // Call a non-approved service.
+  uint8_t aes_iv[sizeof(kAESIV)];
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  AES_KEY aes_key;
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  int num = 0;
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ofb128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, &num));
+  EXPECT_EQ(Bytes(kAESOFBCiphertext), Bytes(output, sizeof(kAESOFBCiphertext)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+}
+
+// Test the SHA interfaces one by one and check that only |*_Final| does the
+// approval at the end.
+TEST(ServiceIndicatorTest, SHA) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  std::vector<uint8_t> digest;
+
+  digest.resize(MD4_DIGEST_LENGTH);
+  MD4_CTX md4_ctx;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(approved, MD4_Init(&md4_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, MD4_Update(&md4_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, MD4_Final(digest.data(), &md4_ctx)));
+  EXPECT_EQ(Bytes(kOutput_md4), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  digest.resize(MD5_DIGEST_LENGTH);
+  MD5_CTX md5_ctx;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(approved, MD5_Init(&md5_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, MD5_Update(&md5_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, MD5_Final(digest.data(), &md5_ctx)));
+  EXPECT_EQ(Bytes(kOutput_md5), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  digest.resize(SHA_DIGEST_LENGTH);
+  SHA_CTX sha_ctx;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(approved, SHA1_Init(&sha_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA1_Update(&sha_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA1_Final(digest.data(), &sha_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha1), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  digest.resize(SHA224_DIGEST_LENGTH);
+  SHA256_CTX sha224_ctx;
+  ASSERT_TRUE(
+      CALL_SERVICE_AND_CHECK_APPROVED(approved, SHA224_Init(&sha224_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA224_Update(&sha224_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA224_Final(digest.data(), &sha224_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha224), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  digest.resize(SHA256_DIGEST_LENGTH);
+  SHA256_CTX sha256_ctx;
+  ASSERT_TRUE(
+      CALL_SERVICE_AND_CHECK_APPROVED(approved, SHA256_Init(&sha256_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA256_Update(&sha256_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA256_Final(digest.data(), &sha256_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha256), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  digest.resize(SHA384_DIGEST_LENGTH);
+  SHA512_CTX sha384_ctx;
+  ASSERT_TRUE(
+      CALL_SERVICE_AND_CHECK_APPROVED(approved, SHA384_Init(&sha384_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA384_Update(&sha384_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA384_Final(digest.data(), &sha384_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha384), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  digest.resize(SHA512_DIGEST_LENGTH);
+  SHA512_CTX sha512_ctx;
+  ASSERT_TRUE(
+      CALL_SERVICE_AND_CHECK_APPROVED(approved, SHA512_Init(&sha512_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA512_Update(&sha512_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA512_Final(digest.data(), &sha512_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha512), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  digest.resize(SHA512_256_DIGEST_LENGTH);
+  SHA512_CTX sha512_256_ctx;
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA512_256_Init(&sha512_256_ctx)));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      SHA512_256_Update(&sha512_256_ctx, kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, SHA512_256_Final(digest.data(), &sha512_256_ctx)));
+  EXPECT_EQ(Bytes(kOutput_sha512_256), Bytes(digest));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESECB) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t output[256];
+
+  // AES-ECB Encryption KAT for 128 bit key.
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  // AES_ecb_encrypt encrypts (or decrypts) a single, 16 byte block from in to
+  // out.
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kPlaintext[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_ENCRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kAESECBCiphertext), Bytes(output, sizeof(kAESECBCiphertext)));
+
+  // AES-ECB Decryption KAT for 128 bit key.
+  ASSERT_TRUE(AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kAESECBCiphertext[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_DECRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output, sizeof(kPlaintext)));
+
+  // AES-ECB Encryption KAT for 192 bit key.
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_192, 8 * sizeof(kAESKey_192), &aes_key) == 0);
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kPlaintext[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_ENCRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kAESECBCiphertext_192),
+            Bytes(output, sizeof(kAESECBCiphertext_192)));
+
+  // AES-ECB Decryption KAT for 192 bit key.
+  ASSERT_TRUE(
+      AES_set_decrypt_key(kAESKey_192, 8 * sizeof(kAESKey_192), &aes_key) == 0);
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kAESECBCiphertext_192[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_DECRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output, sizeof(kPlaintext)));
+
+  // AES-ECB Encryption KAT for 256 bit key.
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_256, 8 * sizeof(kAESKey_256), &aes_key) == 0);
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kPlaintext[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_ENCRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kAESECBCiphertext_256),
+            Bytes(output, sizeof(kAESECBCiphertext_256)));
+
+  // AES-ECB Decryption KAT for 256 bit key.
+  ASSERT_TRUE(
+      AES_set_decrypt_key(kAESKey_256, 8 * sizeof(kAESKey_256), &aes_key) == 0);
+  for (size_t i = 0; i < sizeof(kPlaintext) / AES_BLOCK_SIZE; i++) {
+    CALL_SERVICE_AND_CHECK_APPROVED(
+        approved,
+        AES_ecb_encrypt(&kAESECBCiphertext_256[i * AES_BLOCK_SIZE],
+                        &output[i * AES_BLOCK_SIZE], &aes_key, AES_DECRYPT));
+    EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  }
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output, sizeof(kPlaintext)));
+}
+
+TEST(ServiceIndicatorTest, AESCBC) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t aes_iv[sizeof(kAESIV)];
+  uint8_t output[sizeof(kPlaintext)];
+
+  // AES-CBC Encryption KAT for 128 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cbc_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                &aes_key, aes_iv, AES_ENCRYPT));
+  EXPECT_EQ(Bytes(kAESCBCCiphertext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CBC Decryption KAT for 128 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_cbc_encrypt(kAESCBCCiphertext, output, sizeof(kAESCBCCiphertext),
+                      &aes_key, aes_iv, AES_DECRYPT));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CBC Encryption KAT for 192 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_192, 8 * sizeof(kAESKey_192), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cbc_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                &aes_key, aes_iv, AES_ENCRYPT));
+  EXPECT_EQ(Bytes(kAESCBCCiphertext_192), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CBC Decryption KAT for 192 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_decrypt_key(kAESKey_192, 8 * sizeof(kAESKey_192), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cbc_encrypt(kAESCBCCiphertext_192, output,
+                                sizeof(kAESCBCCiphertext_192), &aes_key, aes_iv,
+                                AES_DECRYPT));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CBC Encryption KAT for 256 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_256, 8 * sizeof(kAESKey_256), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cbc_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                &aes_key, aes_iv, AES_ENCRYPT));
+  EXPECT_EQ(Bytes(kAESCBCCiphertext_256), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CBC Decryption KAT for 256 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_decrypt_key(kAESKey_256, 8 * sizeof(kAESKey_256), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cbc_encrypt(kAESCBCCiphertext_256, output,
+                                sizeof(kAESCBCCiphertext_256), &aes_key, aes_iv,
+                                AES_DECRYPT));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESCTR) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t aes_iv[sizeof(kAESIV)];
+  uint8_t output[sizeof(kPlaintext)];
+  unsigned num = 0;
+  uint8_t ecount_buf[AES_BLOCK_SIZE];
+
+  // AES-CTR Encryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ctr128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kAESCTRCiphertext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CTR Decryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_ctr128_encrypt(kAESCTRCiphertext, output, sizeof(kAESCTRCiphertext),
+                         &aes_key, aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CTR Encryption KAT for 192 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_192, 8 * sizeof(kAESKey_192), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ctr128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kAESCTRCiphertext_192), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CTR Decryption KAT for 192 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ctr128_encrypt(kAESCTRCiphertext_192, output,
+                                   sizeof(kAESCTRCiphertext_192), &aes_key,
+                                   aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CTR Encryption KAT for 256 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(
+      AES_set_encrypt_key(kAESKey_256, 8 * sizeof(kAESKey_256), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ctr128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kAESCTRCiphertext_256), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-CTR Decryption KAT for 256 bit key.
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ctr128_encrypt(kAESCTRCiphertext_256, output,
+                                   sizeof(kAESCTRCiphertext_256), &aes_key,
+                                   aes_iv, ecount_buf, &num));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESOFB) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t aes_iv[sizeof(kAESIV)];
+  uint8_t output[sizeof(kPlaintext)];
+  int num = 0;
+
+  // AES-OFB Encryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_ofb128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, &num));
+  EXPECT_EQ(Bytes(kAESOFBCiphertext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  // AES-OFB Decryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_ofb128_encrypt(kAESOFBCiphertext, output, sizeof(kAESOFBCiphertext),
+                         &aes_key, aes_iv, &num));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESCFB) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t aes_iv[sizeof(kAESIV)];
+  uint8_t output[sizeof(kPlaintext)];
+  int num = 0;
+
+  // AES-CFB Encryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_cfb128_encrypt(kPlaintext, output, sizeof(kPlaintext),
+                                   &aes_key, aes_iv, &num, AES_ENCRYPT));
+  EXPECT_EQ(Bytes(kAESCFBCiphertext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+
+  // AES-CFB Decryption KAT
+  memcpy(aes_iv, kAESIV, sizeof(aes_iv));
+  CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_cfb128_encrypt(kAESCFBCiphertext, output, sizeof(kAESCFBCiphertext),
+                         &aes_key, aes_iv, &num, AES_DECRYPT));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESKW) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t output[sizeof(kPlaintext) + 8];
+  size_t outlen;
+
+  // AES-KW Encryption KAT
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  outlen = CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_wrap_key(&aes_key, nullptr, output, kPlaintext, sizeof(kPlaintext)));
+  ASSERT_EQ(outlen, sizeof(kAESKWCiphertext));
+  EXPECT_EQ(Bytes(kAESKWCiphertext), Bytes(output));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-KW Decryption KAT
+  ASSERT_TRUE(AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  outlen = CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_unwrap_key(&aes_key, nullptr, output, kAESKWCiphertext,
+                               sizeof(kAESKWCiphertext)));
+  ASSERT_EQ(outlen, sizeof(kPlaintext));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output, sizeof(kPlaintext)));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, AESKWP) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  AES_KEY aes_key;
+  uint8_t output[sizeof(kPlaintext) + 15];
+  size_t outlen;
+
+  // AES-KWP Encryption KAT
+  ASSERT_TRUE(AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, AES_wrap_key_padded(&aes_key, output, &outlen, sizeof(output),
+                                    kPlaintext, sizeof(kPlaintext))));
+  EXPECT_EQ(Bytes(kAESKWPCiphertext), Bytes(output, outlen));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // AES-KWP Decryption KAT
+  ASSERT_TRUE(AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) == 0);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      AES_unwrap_key_padded(&aes_key, output, &outlen, sizeof(output),
+                            kAESKWPCiphertext, sizeof(kAESKWPCiphertext))));
+  EXPECT_EQ(Bytes(kPlaintext), Bytes(output, outlen));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+TEST(ServiceIndicatorTest, FFDH) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+
+  // |DH_compute_key_padded| should be a non-approved service.
+  bssl::UniquePtr<DH> dh(GetDH());
+  uint8_t dh_out[sizeof(kDHOutput)];
+  ASSERT_EQ(DH_size(dh.get()), static_cast<int>(sizeof(dh_out)));
+  ASSERT_EQ(CALL_SERVICE_AND_CHECK_APPROVED(
+                approved, DH_compute_key_padded(
+                              dh_out, DH_get0_priv_key(dh.get()), dh.get())),
+            static_cast<int>(sizeof(dh_out)));
+  EXPECT_EQ(Bytes(kDHOutput), Bytes(dh_out));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+}
+
+TEST(ServiceIndicatorTest, DRBG) {
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  CTR_DRBG_STATE drbg;
+  uint8_t output[sizeof(kDRBGOutput)];
+
+  // Test running the DRBG interfaces and check |CTR_DRBG_generate| for approval
+  // at the end since it indicates a service is being done. |CTR_DRBG_init| and
+  // |CTR_DRBG_reseed| should not be approved, because the functions do not
+  // indicate that a service has been fully completed yet.
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CTR_DRBG_init(&drbg, kDRBGEntropy, kDRBGPersonalization,
+                              sizeof(kDRBGPersonalization))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CTR_DRBG_generate(&drbg, output, sizeof(kDRBGOutput), kDRBGAD,
+                                  sizeof(kDRBGAD))));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  EXPECT_EQ(Bytes(kDRBGOutput), Bytes(output));
+
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      CTR_DRBG_reseed(&drbg, kDRBGEntropy2, kDRBGAD, sizeof(kDRBGAD))));
+  EXPECT_EQ(approved, FIPSStatus::NOT_APPROVED);
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, CTR_DRBG_generate(&drbg, output, sizeof(kDRBGReseedOutput),
+                                  kDRBGAD, sizeof(kDRBGAD))));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+  EXPECT_EQ(Bytes(kDRBGReseedOutput), Bytes(output));
+
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, RAND_bytes(output, sizeof(output))));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+#else  // !BORINGSSL_FIPS
+
+// Service indicator calls should not be used in non-FIPS builds. However, if
+// used, the macro |CALL_SERVICE_AND_CHECK_APPROVED| will return
+// |FIPSStatus::APPROVED|, but the direct calls to
+// |FIPS_service_indicator_xxx| will not indicate an approved state.
+TEST(ServiceIndicatorTest, BasicTest) {
+  // Reset and check the initial state and counter.
+  FIPSStatus approved = FIPSStatus::NOT_APPROVED;
+  uint64_t before = FIPS_service_indicator_before_call();
+  ASSERT_EQ(before, (uint64_t)0);
+
+  // Call an approved service.
+  bssl::ScopedEVP_AEAD_CTX aead_ctx;
+  uint8_t nonce[EVP_AEAD_MAX_NONCE_LENGTH] = {0};
+  uint8_t output[256];
+  size_t out_len;
+  ASSERT_TRUE(EVP_AEAD_CTX_init(aead_ctx.get(),
+                                EVP_aead_aes_128_gcm_randnonce(), kAESKey,
+                                sizeof(kAESKey), 0, nullptr));
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved, EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len,
+                                  sizeof(output), nullptr, 0, kPlaintext,
+                                  sizeof(kPlaintext), nullptr, 0)));
+  // Macro should return true, to ensure FIPS/non-FIPS compatibility.
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+
+  // Call a non-approved service.
+  ASSERT_TRUE(EVP_AEAD_CTX_init(aead_ctx.get(), EVP_aead_aes_128_gcm(), kAESKey,
+                                sizeof(kAESKey), 0, nullptr));
+  ASSERT_TRUE(CALL_SERVICE_AND_CHECK_APPROVED(
+      approved,
+      EVP_AEAD_CTX_seal(aead_ctx.get(), output, &out_len, sizeof(output), nonce,
+                        EVP_AEAD_nonce_length(EVP_aead_aes_128_gcm()),
+                        kPlaintext, sizeof(kPlaintext), nullptr, 0)));
+  EXPECT_EQ(approved, FIPSStatus::APPROVED);
+}
+
+#endif  // BORINGSSL_FIPS
diff --git a/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl b/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
index 25e5234..856b819 100644
--- a/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
@@ -61,7 +61,7 @@
 	ldr	@Xx[$i+2],[$inp,#`($i+2)*4-64`]
 ___
 $code.=<<___ if ($i<14 && ($i&1));
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	@Xx[$i+1],@Xx[$i+1],#32
 #else
 	rev32	@Xx[$i+1],@Xx[$i+1]
@@ -209,7 +209,7 @@
 	movz	$K,#0x7999
 	sub	$num,$num,#1
 	movk	$K,#0x5a82,lsl#16
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	$Xx[0],@Xx[0],#32
 #else
 	rev32	@Xx[0],@Xx[0]
diff --git a/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl b/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
index ae803a9..8cb312f 100644
--- a/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
@@ -1,5 +1,5 @@
 #! /usr/bin/env perl
-# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 #
 # Licensed under the OpenSSL license (the "License").  You may not use
 # this file except in compliance with the License.  You can obtain a copy
@@ -27,6 +27,7 @@
 # Denver	2.01		10.5 (+26%)	6.70 (+8%)
 # X-Gene			20.0 (+100%)	12.8 (+300%(***))
 # Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+# Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 #
 # (*)	Software SHA256 results are of lesser relevance, presented
 #	mostly for informational purposes.
@@ -35,7 +36,7 @@
 #	on Cortex-A53 (or by 4 cycles per round).
 # (***)	Super-impressive coefficients over gcc-generated code are
 #	indication of some compiler "pathology", most notably code
-#	generated with -mgeneral-regs-only is significanty faster
+#	generated with -mgeneral-regs-only is significantly faster
 #	and the gap is only 40-90%.
 
 $output=pop;
@@ -89,7 +90,7 @@
    $T0=@X[$i+3] if ($i<11);
 
 $code.=<<___	if ($i<16);
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	@X[$i],@X[$i]			// $i
 #endif
 ___
@@ -184,8 +185,6 @@
 .type	$func,%function
 .align	6
 $func:
-___
-$code.=<<___	if ($SZ==4);
 	AARCH64_VALID_CALL_TARGET
 #ifndef	__KERNEL__
 #if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
@@ -194,11 +193,17 @@
 	adrp	x16,:pg_hi21:OPENSSL_armcap_P
 #endif
 	ldr	w16,[x16,:lo12:OPENSSL_armcap_P]
+___
+$code.=<<___	if ($SZ==4);
 	tst	w16,#ARMV8_SHA256
 	b.ne	.Lv8_entry
-#endif
+___
+$code.=<<___	if ($SZ==8);
+	tst	w16,#ARMV8_SHA512
+	b.ne	.Lv8_entry
 ___
 $code.=<<___;
+#endif
 	AARCH64_SIGN_LINK_REGISTER
 	stp	x29,x30,[sp,#-128]!
 	add	x29,sp,#0
@@ -424,6 +429,110 @@
 ___
 }
 
+if ($SZ==8) {
+my $Ktbl="x3";
+
+my @H = map("v$_.16b",(0..4));
+my ($fg,$de,$m9_10)=map("v$_.16b",(5..7));
+my @MSG=map("v$_.16b",(16..23));
+my ($W0,$W1)=("v24.2d","v25.2d");
+my ($AB,$CD,$EF,$GH)=map("v$_.16b",(26..29));
+
+$code.=<<___;
+.text
+#ifndef	__KERNEL__
+.type	sha512_block_armv8,%function
+.align	6
+sha512_block_armv8:
+.Lv8_entry:
+	stp		x29,x30,[sp,#-16]!
+	add		x29,sp,#0
+
+	ld1		{@MSG[0]-@MSG[3]},[$inp],#64	// load input
+	ld1		{@MSG[4]-@MSG[7]},[$inp],#64
+
+	ld1.64		{@H[0]-@H[3]},[$ctx]		// load context
+	adrp		$Ktbl,:pg_hi21:.LK512
+	add		$Ktbl,$Ktbl,:lo12:.LK512
+
+	rev64		@MSG[0],@MSG[0]
+	rev64		@MSG[1],@MSG[1]
+	rev64		@MSG[2],@MSG[2]
+	rev64		@MSG[3],@MSG[3]
+	rev64		@MSG[4],@MSG[4]
+	rev64		@MSG[5],@MSG[5]
+	rev64		@MSG[6],@MSG[6]
+	rev64		@MSG[7],@MSG[7]
+	b		.Loop_hw
+
+.align	4
+.Loop_hw:
+	ld1.64		{$W0},[$Ktbl],#16
+	subs		$num,$num,#1
+	sub		x4,$inp,#128
+	orr		$AB,@H[0],@H[0]			// offload
+	orr		$CD,@H[1],@H[1]
+	orr		$EF,@H[2],@H[2]
+	orr		$GH,@H[3],@H[3]
+	csel		$inp,$inp,x4,ne			// conditional rewind
+___
+for($i=0;$i<32;$i++) {
+$code.=<<___;
+	add.i64		$W0,$W0,@MSG[0]
+	ld1.64		{$W1},[$Ktbl],#16
+	ext		$W0,$W0,$W0,#8
+	ext		$fg,@H[2],@H[3],#8
+	ext		$de,@H[1],@H[2],#8
+	add.i64		@H[3],@H[3],$W0			// "T1 + H + K512[i]"
+	 sha512su0	@MSG[0],@MSG[1]
+	 ext		$m9_10,@MSG[4],@MSG[5],#8
+	sha512h		@H[3],$fg,$de
+	 sha512su1	@MSG[0],@MSG[7],$m9_10
+	add.i64		@H[4],@H[1],@H[3]		// "D + T1"
+	sha512h2	@H[3],$H[1],@H[0]
+___
+	($W0,$W1)=($W1,$W0);	push(@MSG,shift(@MSG));
+	@H = (@H[3],@H[0],@H[4],@H[2],@H[1]);
+}
+for(;$i<40;$i++) {
+$code.=<<___	if ($i<39);
+	ld1.64		{$W1},[$Ktbl],#16
+___
+$code.=<<___	if ($i==39);
+	sub		$Ktbl,$Ktbl,#$rounds*$SZ	// rewind
+___
+$code.=<<___;
+	add.i64		$W0,$W0,@MSG[0]
+	 ld1		{@MSG[0]},[$inp],#16		// load next input
+	ext		$W0,$W0,$W0,#8
+	ext		$fg,@H[2],@H[3],#8
+	ext		$de,@H[1],@H[2],#8
+	add.i64		@H[3],@H[3],$W0			// "T1 + H + K512[i]"
+	sha512h		@H[3],$fg,$de
+	 rev64		@MSG[0],@MSG[0]
+	add.i64		@H[4],@H[1],@H[3]		// "D + T1"
+	sha512h2	@H[3],$H[1],@H[0]
+___
+	($W0,$W1)=($W1,$W0);	push(@MSG,shift(@MSG));
+	@H = (@H[3],@H[0],@H[4],@H[2],@H[1]);
+}
+$code.=<<___;
+	add.i64		@H[0],@H[0],$AB			// accumulate
+	add.i64		@H[1],@H[1],$CD
+	add.i64		@H[2],@H[2],$EF
+	add.i64		@H[3],@H[3],$GH
+
+	cbnz		$num,.Loop_hw
+
+	st1.64		{@H[0]-@H[3]},[$ctx]		// store context
+
+	ldr		x29,[sp],#16
+	ret
+.size	sha512_block_armv8,.-sha512_block_armv8
+#endif
+___
+}
+
 {   my  %opcode = (
 	"sha256h"	=> 0x5e004000,	"sha256h2"	=> 0x5e005000,
 	"sha256su0"	=> 0x5e282800,	"sha256su1"	=> 0x5e006000	);
@@ -439,6 +548,21 @@
     }
 }
 
+{   my  %opcode = (
+	"sha512h"	=> 0xce608000,	"sha512h2"	=> 0xce608400,
+	"sha512su0"	=> 0xcec08000,	"sha512su1"	=> 0xce608800	);
+
+    sub unsha512 {
+	my ($mnemonic,$arg)=@_;
+
+	$arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)[^,]*(?:,\s*[qv]([0-9]+))?/o
+	&&
+	sprintf ".inst\t0x%08x\t//%s %s",
+			$opcode{$mnemonic}|$1|($2<<5)|($3<<16),
+			$mnemonic,$arg;
+    }
+}
+
 open SELF,$0;
 while(<SELF>) {
         next if (/^#!/);
@@ -449,12 +573,18 @@
 
 foreach(split("\n",$code)) {
 
-	s/\`([^\`]*)\`/eval($1)/geo;
+	s/\`([^\`]*)\`/eval($1)/ge;
 
-	s/\b(sha256\w+)\s+([qv].*)/unsha256($1,$2)/geo;
+	s/\b(sha512\w+)\s+([qv].*)/unsha512($1,$2)/ge	or
+	s/\b(sha256\w+)\s+([qv].*)/unsha256($1,$2)/ge;
 
-	s/\.\w?32\b//o		and s/\.16b/\.4s/go;
-	m/(ld|st)1[^\[]+\[0\]/o	and s/\.4s/\.s/go;
+	s/\bq([0-9]+)\b/v$1.16b/g;		# old->new registers
+
+	s/\.[ui]?8(\s)/$1/;
+	s/\.\w?64\b//		and s/\.16b/\.2d/g	or
+	s/\.\w?32\b//		and s/\.16b/\.4s/g;
+	m/\bext\b/		and s/\.2d/\.16b/g	or
+	m/(ld|st)1[^\[]+\[0\]/	and s/\.4s/\.s/g;
 
 	print $_,"\n";
 }
diff --git a/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl b/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
index 61f67cb..2abd065 100755
--- a/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
@@ -126,15 +126,12 @@
 # versions, but BoringSSL is intended to be used with pre-generated perlasm
 # output, so this isn't useful anyway.
 #
-# TODO(davidben): Enable AVX2 code after testing by setting $avx to 2. Is it
-# necessary to disable AVX2 code when SHA Extensions code is disabled? Upstream
-# did not tie them together until after $shaext was added.
+# This file also has an AVX2 implementation, controlled by setting $avx to 2.
+# For now, we intentionally disable it. While it gives a 13-16% perf boost, the
+# CFI annotations are wrong. It allocates stack in a loop and should be
+# rewritten to avoid this.
 $avx = 1;
-
-# TODO(davidben): Consider enabling the Intel SHA Extensions code once it's
-# been tested.
-$shaext=0;	### set to zero if compiling for 1.0.1
-$avx=1		if (!$shaext && $avx);
+$shaext = 1;
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
 *STDOUT=*OUT;
@@ -275,7 +272,7 @@
 ___
 $code.=<<___ if ($SZ==4 && $shaext);
 	test	\$`1<<29`,%r11d		# check for SHA
-	jnz	_shaext_shortcut
+	jnz	.Lshaext_shortcut
 ___
     # XOP codepath removed.
 $code.=<<___ if ($avx>1);
@@ -559,7 +556,8 @@
 .type	sha256_block_data_order_shaext,\@function,3
 .align	64
 sha256_block_data_order_shaext:
-_shaext_shortcut:
+.cfi_startproc
+.Lshaext_shortcut:
 ___
 $code.=<<___ if ($win64);
 	lea	`-8-5*16`(%rsp),%rsp
@@ -703,6 +701,7 @@
 ___
 $code.=<<___;
 	ret
+.cfi_endproc
 .size	sha256_block_data_order_shaext,.-sha256_block_data_order_shaext
 ___
 }}}
diff --git a/src/crypto/fipsmodule/sha/sha1.c b/src/crypto/fipsmodule/sha/sha1.c
index e482c77..f921e31 100644
--- a/src/crypto/fipsmodule/sha/sha1.c
+++ b/src/crypto/fipsmodule/sha/sha1.c
@@ -62,6 +62,7 @@
 
 #include "../../internal.h"
 #include "../digest/md32_common.h"
+#include "../service_indicator/internal.h"
 #include "internal.h"
 
 
@@ -108,6 +109,7 @@
   CRYPTO_store_u32_be(out + 8, c->h[2]);
   CRYPTO_store_u32_be(out + 12, c->h[3]);
   CRYPTO_store_u32_be(out + 16, c->h[4]);
+  FIPS_service_indicator_update_state();
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/sha/sha256.c b/src/crypto/fipsmodule/sha/sha256.c
index c187c4a..046f6e2 100644
--- a/src/crypto/fipsmodule/sha/sha256.c
+++ b/src/crypto/fipsmodule/sha/sha256.c
@@ -62,6 +62,7 @@
 
 #include "../../internal.h"
 #include "../digest/md32_common.h"
+#include "../service_indicator/internal.h"
 #include "internal.h"
 
 
@@ -132,7 +133,7 @@
   return SHA256_Update(ctx, data, len);
 }
 
-static int sha256_final_impl(uint8_t *out, SHA256_CTX *c) {
+static int sha256_final_impl(uint8_t *out, size_t md_len, SHA256_CTX *c) {
   crypto_md32_final(&sha256_block_data_order, c->h, c->data, SHA256_CBLOCK,
                     &c->num, c->Nh, c->Nl, /*is_big_endian=*/1);
 
@@ -140,16 +141,18 @@
   // 'final' function can fail. SHA-512 does not have a corresponding check.
   // These functions already misbehave if the caller arbitrarily mutates |c|, so
   // can we assume one of |SHA256_Init| or |SHA224_Init| was used?
-  if (c->md_len > SHA256_DIGEST_LENGTH) {
+  if (md_len > SHA256_DIGEST_LENGTH) {
     return 0;
   }
 
-  assert(c->md_len % 4 == 0);
-  const size_t out_words = c->md_len / 4;
+  assert(md_len % 4 == 0);
+  const size_t out_words = md_len / 4;
   for (size_t i = 0; i < out_words; i++) {
     CRYPTO_store_u32_be(out, c->h[i]);
     out += 4;
   }
+
+  FIPS_service_indicator_update_state();
   return 1;
 }
 
@@ -159,13 +162,14 @@
   // |SHA256_Final| and expects |sha->md_len| to carry the size over.
   //
   // TODO(davidben): Add an assert and fix code to match them up.
-  return sha256_final_impl(out, c);
+  return sha256_final_impl(out, c->md_len, c);
 }
+
 int SHA224_Final(uint8_t out[SHA224_DIGEST_LENGTH], SHA256_CTX *ctx) {
-  // SHA224_Init sets |ctx->md_len| to |SHA224_DIGEST_LENGTH|, so this has a
-  // smaller output.
+  // This function must be paired with |SHA224_Init|, which sets |ctx->md_len|
+  // to |SHA224_DIGEST_LENGTH|.
   assert(ctx->md_len == SHA224_DIGEST_LENGTH);
-  return sha256_final_impl(out, ctx);
+  return sha256_final_impl(out, SHA224_DIGEST_LENGTH, ctx);
 }
 
 #ifndef SHA256_ASM
diff --git a/src/crypto/fipsmodule/sha/sha512.c b/src/crypto/fipsmodule/sha/sha512.c
index d94de28..2c7ce31 100644
--- a/src/crypto/fipsmodule/sha/sha512.c
+++ b/src/crypto/fipsmodule/sha/sha512.c
@@ -60,8 +60,9 @@
 
 #include <openssl/mem.h>
 
-#include "internal.h"
 #include "../../internal.h"
+#include "../service_indicator/internal.h"
+#include "internal.h"
 
 
 // The 32-bit hash algorithms share a common byte-order neutral collector and
@@ -70,7 +71,7 @@
 // this writing, so there is no need for a common collector/padding
 // implementation yet.
 
-static int sha512_final_impl(uint8_t *out, SHA512_CTX *sha);
+static int sha512_final_impl(uint8_t *out, size_t md_len, SHA512_CTX *sha);
 
 int SHA384_Init(SHA512_CTX *sha) {
   sha->h[0] = UINT64_C(0xcbbb9d5dc1059ed8);
@@ -161,10 +162,10 @@
 
 
 int SHA384_Final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha) {
-  // |SHA384_Init| sets |sha->md_len| to |SHA384_DIGEST_LENGTH|, so this has a
-  // smaller output.
+  // This function must be paired with |SHA384_Init|, which sets |sha->md_len|
+  // to |SHA384_DIGEST_LENGTH|.
   assert(sha->md_len == SHA384_DIGEST_LENGTH);
-  return sha512_final_impl(out, sha);
+  return sha512_final_impl(out, SHA384_DIGEST_LENGTH, sha);
 }
 
 int SHA384_Update(SHA512_CTX *sha, const void *data, size_t len) {
@@ -176,10 +177,10 @@
 }
 
 int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
-  // |SHA512_256_Init| sets |sha->md_len| to |SHA512_256_DIGEST_LENGTH|, so this
-  // has a |smaller output.
+  // This function must be paired with |SHA512_256_Init|, which sets
+  // |sha->md_len| to |SHA512_256_DIGEST_LENGTH|.
   assert(sha->md_len == SHA512_256_DIGEST_LENGTH);
-  return sha512_final_impl(out, sha);
+  return sha512_final_impl(out, SHA512_256_DIGEST_LENGTH, sha);
 }
 
 void SHA512_Transform(SHA512_CTX *c, const uint8_t block[SHA512_CBLOCK]) {
@@ -240,10 +241,10 @@
   // |SHA512_Final| and expects |sha->md_len| to carry the size over.
   //
   // TODO(davidben): Add an assert and fix code to match them up.
-  return sha512_final_impl(out, sha);
+  return sha512_final_impl(out, sha->md_len, sha);
 }
 
-static int sha512_final_impl(uint8_t *out, SHA512_CTX *sha) {
+static int sha512_final_impl(uint8_t *out, size_t md_len, SHA512_CTX *sha) {
   uint8_t *p = sha->p;
   size_t n = sha->num;
 
@@ -267,13 +268,14 @@
     return 0;
   }
 
-  assert(sha->md_len % 8 == 0);
-  const size_t out_words = sha->md_len / 8;
+  assert(md_len % 8 == 0);
+  const size_t out_words = md_len / 8;
   for (size_t i = 0; i < out_words; i++) {
     CRYPTO_store_u64_be(out, sha->h[i]);
     out += 8;
   }
 
+  FIPS_service_indicator_update_state();
   return 1;
 }
 
diff --git a/src/crypto/fipsmodule/tls/kdf.c b/src/crypto/fipsmodule/tls/kdf.c
index 347e998..046cb52 100644
--- a/src/crypto/fipsmodule/tls/kdf.c
+++ b/src/crypto/fipsmodule/tls/kdf.c
@@ -58,6 +58,7 @@
 
 #include "internal.h"
 #include "../../internal.h"
+#include "../service_indicator/internal.h"
 
 
 // tls1_P_hash computes the TLS P_<hash> function as described in RFC 5246,
@@ -90,7 +91,7 @@
   }
 
   for (;;) {
-    unsigned len;
+    unsigned len_u;
     uint8_t hmac[EVP_MAX_MD_SIZE];
     if (!HMAC_CTX_copy_ex(&ctx, &ctx_init) ||
         !HMAC_Update(&ctx, A1, A1_len) ||
@@ -99,16 +100,17 @@
         !HMAC_Update(&ctx, (const uint8_t *) label, label_len) ||
         !HMAC_Update(&ctx, seed1, seed1_len) ||
         !HMAC_Update(&ctx, seed2, seed2_len) ||
-        !HMAC_Final(&ctx, hmac, &len)) {
+        !HMAC_Final(&ctx, hmac, &len_u)) {
       goto err;
     }
+    size_t len = len_u;
     assert(len == chunk);
 
     // XOR the result into |out|.
     if (len > out_len) {
       len = out_len;
     }
-    for (unsigned i = 0; i < len; i++) {
+    for (size_t i = 0; i < len; i++) {
       out[i] ^= hmac[i];
     }
     out += len;
@@ -146,12 +148,16 @@
 
   OPENSSL_memset(out, 0, out_len);
 
+  const EVP_MD *const original_digest = digest;
+  FIPS_service_indicator_lock_state();
+  int ret = 0;
+
   if (digest == EVP_md5_sha1()) {
     // If using the MD5/SHA1 PRF, |secret| is partitioned between MD5 and SHA-1.
     size_t secret_half = secret_len - (secret_len / 2);
     if (!tls1_P_hash(out, out_len, EVP_md5(), secret, secret_half, label,
                      label_len, seed1, seed1_len, seed2, seed2_len)) {
-      return 0;
+      goto end;
     }
 
     // Note that, if |secret_len| is odd, the two halves share a byte.
@@ -160,6 +166,13 @@
     digest = EVP_sha1();
   }
 
-  return tls1_P_hash(out, out_len, digest, secret, secret_len, label, label_len,
-                     seed1, seed1_len, seed2, seed2_len);
+  ret = tls1_P_hash(out, out_len, digest, secret, secret_len, label, label_len,
+                    seed1, seed1_len, seed2, seed2_len);
+
+end:
+  FIPS_service_indicator_unlock_state();
+  if (ret) {
+    TLSKDF_verify_service_indicator(original_digest);
+  }
+  return ret;
 }
diff --git a/src/crypto/hkdf/hkdf_test.cc b/src/crypto/hkdf/hkdf_test.cc
index 793506f..8aad6c8 100644
--- a/src/crypto/hkdf/hkdf_test.cc
+++ b/src/crypto/hkdf/hkdf_test.cc
@@ -14,7 +14,9 @@
 
 #include <openssl/digest.h>
 #include <openssl/err.h>
+#include <openssl/evp.h>
 #include <openssl/hkdf.h>
+#include <openssl/kdf.h>
 
 #include <gtest/gtest.h>
 
@@ -266,6 +268,108 @@
                      test->ikm_len, test->salt, test->salt_len, test->info,
                      test->info_len));
     EXPECT_EQ(Bytes(test->out, test->out_len), Bytes(buf, test->out_len));
+
+    // Repeat the test with the OpenSSL compatibility |EVP_PKEY_derive| API.
+    bssl::UniquePtr<EVP_PKEY_CTX> ctx(
+        EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr));
+    ASSERT_TRUE(ctx);
+    ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get()));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_hkdf_mode(ctx.get(), EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_hkdf_md(ctx.get(), test->md_func()));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_set1_hkdf_key(ctx.get(), test->ikm, test->ikm_len));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_set1_hkdf_salt(ctx.get(), test->salt, test->salt_len));
+    for (bool copy_ctx : {false, true}) {
+      SCOPED_TRACE(copy_ctx);
+      bssl::UniquePtr<EVP_PKEY_CTX> copy;
+      EVP_PKEY_CTX *use_ctx = ctx.get();
+      if (copy_ctx) {
+        copy.reset(EVP_PKEY_CTX_dup(ctx.get()));
+        ASSERT_TRUE(copy);
+        use_ctx = copy.get();
+      }
+
+      // A null output should report the length.
+      prk_len = 0;
+      ASSERT_TRUE(EVP_PKEY_derive(use_ctx, nullptr, &prk_len));
+      EXPECT_EQ(prk_len, test->prk_len);
+
+      // Too small of a buffer should cleanly fail.
+      prk_len = test->prk_len - 1;
+      EXPECT_FALSE(EVP_PKEY_derive(use_ctx, prk, &prk_len));
+      ERR_clear_error();
+
+      // Test the correct buffer size.
+      OPENSSL_memset(prk, 0, sizeof(prk));
+      prk_len = test->prk_len;
+      ASSERT_TRUE(EVP_PKEY_derive(use_ctx, prk, &prk_len));
+      EXPECT_EQ(Bytes(test->prk, test->prk_len), Bytes(prk, prk_len));
+
+      // Test a larger buffer than necessary.
+      OPENSSL_memset(prk, 0, sizeof(prk));
+      prk_len = test->prk_len + 1;
+      ASSERT_TRUE(EVP_PKEY_derive(use_ctx, prk, &prk_len));
+      EXPECT_EQ(Bytes(test->prk, test->prk_len), Bytes(prk, prk_len));
+    }
+
+    ctx.reset(EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr));
+    ASSERT_TRUE(ctx);
+    ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get()));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_hkdf_mode(ctx.get(), EVP_PKEY_HKDEF_MODE_EXPAND_ONLY));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_hkdf_md(ctx.get(), test->md_func()));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_set1_hkdf_key(ctx.get(), test->prk, test->prk_len));
+    // |info| can be passed in multiple parts.
+    size_t half = test->info_len / 2;
+    ASSERT_TRUE(EVP_PKEY_CTX_add1_hkdf_info(ctx.get(), test->info, half));
+    ASSERT_TRUE(EVP_PKEY_CTX_add1_hkdf_info(ctx.get(), test->info + half,
+                                            test->info_len - half));
+    for (bool copy_ctx : {false, true}) {
+      SCOPED_TRACE(copy_ctx);
+      bssl::UniquePtr<EVP_PKEY_CTX> copy;
+      EVP_PKEY_CTX *use_ctx = ctx.get();
+      if (copy_ctx) {
+        copy.reset(EVP_PKEY_CTX_dup(ctx.get()));
+        ASSERT_TRUE(copy);
+        use_ctx = copy.get();
+      }
+      OPENSSL_memset(buf, 0, sizeof(buf));
+      size_t len = test->out_len;
+      ASSERT_TRUE(EVP_PKEY_derive(use_ctx, buf, &len));
+      EXPECT_EQ(Bytes(test->out, test->out_len), Bytes(buf, len));
+    }
+
+    ctx.reset(EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr));
+    ASSERT_TRUE(ctx);
+    ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get()));
+    ASSERT_TRUE(EVP_PKEY_CTX_hkdf_mode(ctx.get(),
+                                       EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND));
+    ASSERT_TRUE(EVP_PKEY_CTX_set_hkdf_md(ctx.get(), test->md_func()));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_set1_hkdf_key(ctx.get(), test->ikm, test->ikm_len));
+    ASSERT_TRUE(
+        EVP_PKEY_CTX_set1_hkdf_salt(ctx.get(), test->salt, test->salt_len));
+    // |info| can be passed in multiple parts.
+    ASSERT_TRUE(EVP_PKEY_CTX_add1_hkdf_info(ctx.get(), test->info, half));
+    ASSERT_TRUE(EVP_PKEY_CTX_add1_hkdf_info(ctx.get(), test->info + half,
+                                            test->info_len - half));
+    for (bool copy_ctx : {false, true}) {
+      SCOPED_TRACE(copy_ctx);
+      bssl::UniquePtr<EVP_PKEY_CTX> copy;
+      EVP_PKEY_CTX *use_ctx = ctx.get();
+      if (copy_ctx) {
+        copy.reset(EVP_PKEY_CTX_dup(ctx.get()));
+        ASSERT_TRUE(copy);
+        use_ctx = copy.get();
+      }
+      OPENSSL_memset(buf, 0, sizeof(buf));
+      size_t len = test->out_len;
+      ASSERT_TRUE(EVP_PKEY_derive(use_ctx, buf, &len));
+      EXPECT_EQ(Bytes(test->out, test->out_len), Bytes(buf, len));
+    }
   }
 }
 
diff --git a/src/crypto/hpke/hpke.c b/src/crypto/hpke/hpke.c
index c71ac2a..f94b684 100644
--- a/src/crypto/hpke/hpke.c
+++ b/src/crypto/hpke/hpke.c
@@ -30,7 +30,7 @@
 #include "../internal.h"
 
 
-// This file implements draft-irtf-cfrg-hpke-12.
+// This file implements RFC 9180.
 
 #define MAX_SEED_LEN X25519_PRIVATE_KEY_LEN
 #define MAX_SHARED_SECRET_LEN SHA256_DIGEST_LENGTH
@@ -40,6 +40,7 @@
   size_t public_key_len;
   size_t private_key_len;
   size_t seed_len;
+  size_t enc_len;
   int (*init_key)(EVP_HPKE_KEY *key, const uint8_t *priv_key,
                   size_t priv_key_len);
   int (*generate_key)(EVP_HPKE_KEY *key);
@@ -115,7 +116,7 @@
 // KEM implementations.
 
 // dhkem_extract_and_expand implements the ExtractAndExpand operation in the
-// DHKEM construction. See section 4.1 of draft-irtf-cfrg-hpke-12.
+// DHKEM construction. See section 4.1 of RFC 9180.
 static int dhkem_extract_and_expand(uint16_t kem_id, const EVP_MD *hkdf_md,
                                     uint8_t *out_key, size_t out_len,
                                     const uint8_t *dh, size_t dh_len,
@@ -216,6 +217,7 @@
       /*public_key_len=*/X25519_PUBLIC_VALUE_LEN,
       /*private_key_len=*/X25519_PRIVATE_KEY_LEN,
       /*seed_len=*/X25519_PRIVATE_KEY_LEN,
+      /*enc_len=*/X25519_PUBLIC_VALUE_LEN,
       x25519_init_key,
       x25519_generate_key,
       x25519_encap_with_seed,
@@ -226,6 +228,16 @@
 
 uint16_t EVP_HPKE_KEM_id(const EVP_HPKE_KEM *kem) { return kem->id; }
 
+size_t EVP_HPKE_KEM_public_key_len(const EVP_HPKE_KEM *kem) {
+  return kem->public_key_len;
+}
+
+size_t EVP_HPKE_KEM_private_key_len(const EVP_HPKE_KEM *kem) {
+  return kem->private_key_len;
+}
+
+size_t EVP_HPKE_KEM_enc_len(const EVP_HPKE_KEM *kem) { return kem->enc_len; }
+
 void EVP_HPKE_KEY_zero(EVP_HPKE_KEY *key) {
   OPENSSL_memset(key, 0, sizeof(EVP_HPKE_KEY));
 }
@@ -315,6 +327,10 @@
 
 uint16_t EVP_HPKE_KDF_id(const EVP_HPKE_KDF *kdf) { return kdf->id; }
 
+const EVP_MD *EVP_HPKE_KDF_hkdf_md(const EVP_HPKE_KDF *kdf) {
+  return kdf->hkdf_md_func();
+}
+
 const EVP_HPKE_AEAD *EVP_hpke_aes_128_gcm(void) {
   static const EVP_HPKE_AEAD kAEAD = {EVP_HPKE_AES_128_GCM,
                                       &EVP_aead_aes_128_gcm};
@@ -351,9 +367,9 @@
                                uint8_t out[HPKE_SUITE_ID_LEN]) {
   CBB cbb;
   int ret = CBB_init_fixed(&cbb, out, HPKE_SUITE_ID_LEN) &&
-            add_label_string(&cbb, "HPKE") &&
-            CBB_add_u16(&cbb, EVP_HPKE_DHKEM_X25519_HKDF_SHA256) &&
-            CBB_add_u16(&cbb, ctx->kdf->id) &&
+            add_label_string(&cbb, "HPKE") &&   //
+            CBB_add_u16(&cbb, ctx->kem->id) &&  //
+            CBB_add_u16(&cbb, ctx->kdf->id) &&  //
             CBB_add_u16(&cbb, ctx->aead->id);
   CBB_cleanup(&cbb);
   return ret;
@@ -487,6 +503,7 @@
     size_t seed_len) {
   EVP_HPKE_CTX_zero(ctx);
   ctx->is_sender = 1;
+  ctx->kem = kem;
   ctx->kdf = kdf;
   ctx->aead = aead;
   uint8_t shared_secret[MAX_SHARED_SECRET_LEN];
@@ -509,12 +526,13 @@
                                  size_t info_len) {
   EVP_HPKE_CTX_zero(ctx);
   ctx->is_sender = 0;
+  ctx->kem = key->kem;
   ctx->kdf = kdf;
   ctx->aead = aead;
   uint8_t shared_secret[MAX_SHARED_SECRET_LEN];
   size_t shared_secret_len;
   if (!key->kem->decap(key, shared_secret, &shared_secret_len, enc, enc_len) ||
-      !hpke_key_schedule(ctx, shared_secret, sizeof(shared_secret), info,
+      !hpke_key_schedule(ctx, shared_secret, shared_secret_len, info,
                          info_len)) {
     EVP_HPKE_CTX_cleanup(ctx);
     return 0;
@@ -609,6 +627,10 @@
   return EVP_AEAD_max_overhead(EVP_AEAD_CTX_aead(&ctx->aead_ctx));
 }
 
+const EVP_HPKE_KEM *EVP_HPKE_CTX_kem(const EVP_HPKE_CTX *ctx) {
+  return ctx->kem;
+}
+
 const EVP_HPKE_AEAD *EVP_HPKE_CTX_aead(const EVP_HPKE_CTX *ctx) {
   return ctx->aead;
 }
diff --git a/src/crypto/hpke/translate_test_vectors.py b/src/crypto/hpke/translate_test_vectors.py
index a4e399b..a1fffcf 100755
--- a/src/crypto/hpke/translate_test_vectors.py
+++ b/src/crypto/hpke/translate_test_vectors.py
@@ -19,7 +19,7 @@
 Usage: translate_test_vectors.py TEST_VECTORS_JSON_FILE
 
 The TEST_VECTORS_JSON_FILE is expected to come from the JSON copy of
-draft-irtf-cfrg-hpke-12's test vectors, linked from its [TestVectors] citation.
+RFC 9180's test vectors, linked from its [TestVectors] citation.
 The output is written to "hpke_test_vectors.txt".
 """
 
diff --git a/src/crypto/hrss/hrss.c b/src/crypto/hrss/hrss.c
index 0247001..572e981 100644
--- a/src/crypto/hrss/hrss.c
+++ b/src/crypto/hrss/hrss.c
@@ -19,7 +19,6 @@
 #include <stdlib.h>
 
 #include <openssl/bn.h>
-#include <openssl/cpu.h>
 #include <openssl/hmac.h>
 #include <openssl/mem.h>
 #include <openssl/rand.h>
@@ -38,8 +37,7 @@
 #include <emmintrin.h>
 #endif
 
-#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
-    (defined(__ARM_NEON__) || defined(__ARM_NEON))
+#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && defined(__ARM_NEON)
 #include <arm_neon.h>
 #endif
 
@@ -189,8 +187,7 @@
 // compiler requires that |i| be a compile-time constant.)
 #define vec_get_word(v, i) _mm_extract_epi16(v, i)
 
-#elif (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
-    (defined(__ARM_NEON__) || defined(__ARM_NEON))
+#elif (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && defined(__ARM_NEON)
 
 #define HRSS_HAVE_VECTOR_UNIT
 typedef uint16x8_t vec_t;
@@ -929,6 +926,20 @@
 #endif
 };
 
+// poly_normalize zeros out the excess elements of |x| which are included only
+// for alignment.
+static void poly_normalize(struct poly *x) {
+  OPENSSL_memset(&x->v[N], 0, 3 * sizeof(uint16_t));
+}
+
+// poly_assert_normalized asserts that the excess elements of |x| are zeroed out
+// for the cases that case. (E.g. |poly_mul_vec|.)
+static void poly_assert_normalized(const struct poly *x) {
+  assert(x->v[N] == 0);
+  assert(x->v[N + 1] == 0);
+  assert(x->v[N + 2] == 0);
+}
+
 OPENSSL_UNUSED static void poly_print(const struct poly *p) {
   printf("[");
   for (unsigned i = 0; i < N; i++) {
@@ -1215,13 +1226,12 @@
 // poly_mul_vec sets |*out| to |x|×|y| mod (𝑥^n - 1).
 static void poly_mul_vec(struct POLY_MUL_SCRATCH *scratch, struct poly *out,
                          const struct poly *x, const struct poly *y) {
-  OPENSSL_memset((uint16_t *)&x->v[N], 0, 3 * sizeof(uint16_t));
-  OPENSSL_memset((uint16_t *)&y->v[N], 0, 3 * sizeof(uint16_t));
-
-  OPENSSL_STATIC_ASSERT(sizeof(out->v) == sizeof(vec_t) * VECS_PER_POLY,
-                        "struct poly is the wrong size");
-  OPENSSL_STATIC_ASSERT(alignof(struct poly) == alignof(vec_t),
-                        "struct poly has incorrect alignment");
+  static_assert(sizeof(out->v) == sizeof(vec_t) * VECS_PER_POLY,
+                "struct poly is the wrong size");
+  static_assert(alignof(struct poly) == alignof(vec_t),
+                "struct poly has incorrect alignment");
+  poly_assert_normalized(x);
+  poly_assert_normalized(y);
 
   vec_t *const prod = scratch->u.vec.prod;
   vec_t *const aux_scratch = scratch->u.vec.scratch;
@@ -1317,22 +1327,24 @@
 static void poly_mul(struct POLY_MUL_SCRATCH *scratch, struct poly *r,
                      const struct poly *a, const struct poly *b) {
 #if defined(POLY_RQ_MUL_ASM)
-  const int has_avx2 = (OPENSSL_ia32cap_P[2] & (1 << 5)) != 0;
-  if (has_avx2) {
+  if (CRYPTO_is_AVX2_capable()) {
     poly_Rq_mul(r->v, a->v, b->v, scratch->u.rq);
-    return;
-  }
+    poly_normalize(r);
+  } else
 #endif
 
 #if defined(HRSS_HAVE_VECTOR_UNIT)
   if (vec_capable()) {
     poly_mul_vec(scratch, r, a, b);
-    return;
-  }
+  } else
 #endif
 
   // Fallback, non-vector case.
-  poly_mul_novec(scratch, r, a, b);
+  {
+    poly_mul_novec(scratch, r, a, b);
+  }
+
+  poly_assert_normalized(r);
 }
 
 // poly_mul_x_minus_1 sets |p| to |p|×(𝑥 - 1) mod (𝑥^n - 1).
@@ -1497,6 +1509,8 @@
       shift = 0;
     }
   }
+
+  poly_normalize(out);
 }
 
 static void poly_from_poly3(struct poly *out, const struct poly3 *in) {
@@ -1521,6 +1535,8 @@
       shift = 0;
     }
   }
+
+  poly_normalize(out);
 }
 
 // Polynomial inversion
@@ -1574,6 +1590,7 @@
   assert(f.v[0] & 1);
   poly2_reverse_700(&v, &v);
   poly_from_poly2(out, &v);
+  poly_assert_normalized(out);
 }
 
 // poly_invert sets |*out| to |in^-1| (i.e. such that |*out|×|in| = 1 mod Φ(N)).
@@ -1587,6 +1604,7 @@
   for (unsigned i = 0; i < N; i++) {
     a.v[i] = -in->v[i];
   }
+  poly_normalize(&a);
 
   // b = in^-1 mod 2.
   b = out;
@@ -1599,6 +1617,8 @@
     tmp.v[0] += 2;
     poly_mul(scratch, b, b, &tmp);
   }
+
+  poly_assert_normalized(out);
 }
 
 // Marshal and unmarshal functions for various basic types.
@@ -1688,6 +1708,7 @@
   }
 
   out->v[N - 1] = (uint16_t)(0u - sum);
+  poly_normalize(out);
 
   return 1;
 }
@@ -1730,8 +1751,7 @@
 // function uses that freedom to implement a flatter distribution of values.
 static void poly_short_sample(struct poly *out,
                               const uint8_t in[HRSS_SAMPLE_BYTES]) {
-  OPENSSL_STATIC_ASSERT(HRSS_SAMPLE_BYTES == N - 1,
-                        "HRSS_SAMPLE_BYTES incorrect");
+  static_assert(HRSS_SAMPLE_BYTES == N - 1, "HRSS_SAMPLE_BYTES incorrect");
   for (size_t i = 0; i < N - 1; i++) {
     uint16_t v = mod3(in[i]);
     // Map {0, 1, 2} -> {0, 1, 0xffff}
@@ -1739,6 +1759,7 @@
     out->v[i] = v;
   }
   out->v[N - 1] = 0;
+  poly_normalize(out);
 }
 
 // poly_short_sample_plus performs the T+ sample as defined in [HRSSNIST],
@@ -1761,6 +1782,7 @@
   for (unsigned i = 0; i < N; i += 2) {
     out->v[i] = (unsigned) out->v[i] * scale;
   }
+  poly_assert_normalized(out);
 }
 
 // poly_lift computes the function discussed in [HRSS], appendix B.
@@ -1876,6 +1898,7 @@
   }
 
   poly_mul_x_minus_1(out);
+  poly_normalize(out);
 }
 
 struct public_key {
@@ -1897,7 +1920,7 @@
 // that up.)
 static struct public_key *public_key_from_external(
     struct HRSS_public_key *ext) {
-  OPENSSL_STATIC_ASSERT(
+  static_assert(
       sizeof(struct HRSS_public_key) >= sizeof(struct public_key) + 15,
       "HRSS public key too small");
 
@@ -1909,7 +1932,7 @@
 // issues.
 static struct private_key *private_key_from_external(
     struct HRSS_private_key *ext) {
-  OPENSSL_STATIC_ASSERT(
+  static_assert(
       sizeof(struct HRSS_private_key) >= sizeof(struct private_key) + 15,
       "HRSS private key too small");
 
@@ -1955,6 +1978,10 @@
     return 0;
   }
 
+#if !defined(NDEBUG)
+  OPENSSL_memset(vars, 0xff, sizeof(struct vars));
+#endif
+
   OPENSSL_memcpy(priv->hmac_key, in + 2 * HRSS_SAMPLE_BYTES,
                  sizeof(priv->hmac_key));
 
@@ -2014,6 +2041,10 @@
     return 0;
   }
 
+#if !defined(NDEBUG)
+  OPENSSL_memset(vars, 0xff, sizeof(struct vars));
+#endif
+
   poly_short_sample(&vars->m, in);
   poly_short_sample(&vars->r, in + HRSS_SAMPLE_BYTES);
   poly_lift(&vars->m_lifted, &vars->m);
@@ -2071,11 +2102,15 @@
     return 0;
   }
 
+#if !defined(NDEBUG)
+  OPENSSL_memset(vars, 0xff, sizeof(struct vars));
+#endif
+
   // This is HMAC, expanded inline rather than using the |HMAC| function so that
   // we can avoid dealing with possible allocation failures and so keep this
   // function infallible.
-  OPENSSL_STATIC_ASSERT(sizeof(priv->hmac_key) <= sizeof(vars->masked_key),
-                        "HRSS HMAC key larger than SHA-256 block size");
+  static_assert(sizeof(priv->hmac_key) <= sizeof(vars->masked_key),
+                "HRSS HMAC key larger than SHA-256 block size");
   for (size_t i = 0; i < sizeof(priv->hmac_key); i++) {
     vars->masked_key[i] = priv->hmac_key[i] ^ 0x36;
   }
@@ -2097,8 +2132,8 @@
   SHA256_Init(&vars->hash_ctx);
   SHA256_Update(&vars->hash_ctx, vars->masked_key, sizeof(vars->masked_key));
   SHA256_Update(&vars->hash_ctx, inner_digest, sizeof(inner_digest));
-  OPENSSL_STATIC_ASSERT(HRSS_KEY_BYTES == SHA256_DIGEST_LENGTH,
-                        "HRSS shared key length incorrect");
+  static_assert(HRSS_KEY_BYTES == SHA256_DIGEST_LENGTH,
+                "HRSS shared key length incorrect");
   SHA256_Final(out_shared_key, &vars->hash_ctx);
 
   // If the ciphertext is publicly invalid then a random shared key is still
@@ -2121,6 +2156,7 @@
   for (unsigned i = 0; i < N; i++) {
     vars->r.v[i] = vars->c.v[i] - vars->m_lifted.v[i];
   }
+  poly_normalize(&vars->r);
   poly_mul(&vars->scratch, &vars->r, &vars->r, &priv->ph_inverse);
   poly_mod_phiN(&vars->r);
   poly_clamp(&vars->r);
@@ -2150,8 +2186,8 @@
   // The |poly_marshal| here then is just confirming that |poly_unmarshal| is
   // strict and could be omitted.
 
-  OPENSSL_STATIC_ASSERT(HRSS_CIPHERTEXT_BYTES == POLY_BYTES,
-                        "ciphertext is the wrong size");
+  static_assert(HRSS_CIPHERTEXT_BYTES == POLY_BYTES,
+                "ciphertext is the wrong size");
   assert(ciphertext_len == sizeof(vars->expected_ciphertext));
   poly_marshal(vars->expected_ciphertext, &vars->c);
 
diff --git a/src/crypto/hrss/hrss_test.cc b/src/crypto/hrss/hrss_test.cc
index 7adbe9e..8c4d15f 100644
--- a/src/crypto/hrss/hrss_test.cc
+++ b/src/crypto/hrss/hrss_test.cc
@@ -14,10 +14,10 @@
 
 #include <gtest/gtest.h>
 
-#include <openssl/cpu.h>
 #include <openssl/hrss.h>
 #include <openssl/rand.h>
 
+#include "../internal.h"
 #include "../test/abi_test.h"
 #include "../test/test_util.h"
 #include "internal.h"
@@ -201,6 +201,33 @@
   }
 }
 
+TEST(HRSS, NoWritesToConstData) {
+  // Normalisation of some polynomials used to write into the generated keys.
+  // This is fine in a purely ephemeral setting, but triggers TSAN warnings in
+  // more complex ones.
+  uint8_t generate_key_entropy[HRSS_GENERATE_KEY_BYTES];
+  RAND_bytes(generate_key_entropy, sizeof(generate_key_entropy));
+  HRSS_public_key pub, pub_orig;
+  HRSS_private_key priv, priv_orig;
+  OPENSSL_memset(&pub, 0xa3, sizeof(pub));
+  OPENSSL_memset(&priv, 0x3a, sizeof(priv));
+  ASSERT_TRUE(HRSS_generate_key(&pub, &priv, generate_key_entropy));
+  OPENSSL_memcpy(&priv_orig, &priv, sizeof(priv));
+  OPENSSL_memcpy(&pub_orig, &pub, sizeof(pub));
+
+  uint8_t ciphertext[HRSS_CIPHERTEXT_BYTES];
+  uint8_t shared_key[HRSS_KEY_BYTES];
+  uint8_t encap_entropy[HRSS_ENCAP_BYTES];
+  RAND_bytes(encap_entropy, sizeof(encap_entropy));
+  ASSERT_TRUE(HRSS_encap(ciphertext, shared_key, &pub, encap_entropy));
+
+  ASSERT_EQ(OPENSSL_memcmp(&pub, &pub_orig, sizeof(pub)), 0);
+
+  ASSERT_TRUE(HRSS_decap(shared_key, &priv, ciphertext, sizeof(ciphertext)));
+
+  ASSERT_EQ(OPENSSL_memcmp(&priv, &priv_orig, sizeof(priv)), 0);
+}
+
 TEST(HRSS, Golden) {
   uint8_t generate_key_entropy[HRSS_GENERATE_KEY_BYTES];
   for (unsigned i = 0; i < HRSS_SAMPLE_BYTES; i++) {
@@ -453,8 +480,7 @@
 
 #if defined(POLY_RQ_MUL_ASM) && defined(SUPPORTS_ABI_TEST)
 TEST(HRSS, ABI) {
-  const bool has_avx2 = (OPENSSL_ia32cap_P[2] & (1 << 5)) != 0;
-  if (!has_avx2) {
+  if (!CRYPTO_is_AVX2_capable()) {
     fprintf(stderr, "Skipping ABI test due to lack of AVX2 support.\n");
     return;
   }
@@ -464,7 +490,7 @@
   alignas(16) uint16_t b[N + 3] = {0};
 
   uint8_t kCanary[256];
-  OPENSSL_STATIC_ASSERT(sizeof(kCanary) % 32 == 0, "needed for alignment");
+  static_assert(sizeof(kCanary) % 32 == 0, "needed for alignment");
   memset(kCanary, 42, sizeof(kCanary));
   alignas(32) uint8_t
       scratch[sizeof(kCanary) + POLY_MUL_RQ_SCRATCH_SPACE + sizeof(kCanary)];
diff --git a/src/crypto/impl_dispatch_test.cc b/src/crypto/impl_dispatch_test.cc
index 10a4d1b..631e78f 100644
--- a/src/crypto/impl_dispatch_test.cc
+++ b/src/crypto/impl_dispatch_test.cc
@@ -22,7 +22,6 @@
 
 #include <openssl/aead.h>
 #include <openssl/aes.h>
-#include <openssl/cpu.h>
 #include <openssl/mem.h>
 
 #include <gtest/gtest.h>
@@ -34,9 +33,9 @@
  public:
   void SetUp() override {
 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
-    aesni_ = OPENSSL_ia32cap_P[1] & (1 << (57 - 32));
-    avx_movbe_ = ((OPENSSL_ia32cap_P[1] >> 22) & 0x41) == 0x41;
-    ssse3_ = OPENSSL_ia32cap_P[1] & (1 << (41 - 32));
+    aesni_ = CRYPTO_is_AESNI_capable();
+    avx_movbe_ = CRYPTO_is_AVX_capable() && CRYPTO_is_MOVBE_capable();
+    ssse3_ = CRYPTO_is_SSSE3_capable();
     is_x86_64_ =
 #if defined(OPENSSL_X86_64)
         true;
diff --git a/src/crypto/internal.h b/src/crypto/internal.h
index 41c42dd..63e6a66 100644
--- a/src/crypto/internal.h
+++ b/src/crypto/internal.h
@@ -121,12 +121,28 @@
 #include <valgrind/memcheck.h>
 #endif
 
+#if defined(BORINGSSL_FIPS_BREAK_TESTS)
+#include <stdlib.h>
+#endif
+
 #if !defined(__cplusplus)
-#if defined(_MSC_VER)
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+#include <stdalign.h>
+#elif defined(_MSC_VER) && !defined(__clang__)
 #define alignas(x) __declspec(align(x))
 #define alignof __alignof
 #else
-#include <stdalign.h>
+// With the exception of MSVC, we require C11 to build the library. C11 is a
+// prerequisite for improved refcounting performance. All our supported C
+// compilers have long implemented C11 and made it default. The most likely
+// cause of pre-C11 modes is stale -std=c99 or -std=gnu99 flags in build
+// configuration. Such flags can be removed.
+//
+// TODO(davidben): In MSVC 2019 16.8 or higher (_MSC_VER >= 1928),
+// |__STDC_VERSION__| will be 201112 when passed /std:c11 and unset otherwise.
+// C11 alignas and alignof are only implemented in C11 mode. Can we mandate C11
+// mode for those versions?
+#error "BoringSSL must be built in C11 mode or higher."
 #endif
 #endif
 
@@ -636,6 +652,7 @@
   OPENSSL_THREAD_LOCAL_ERR = 0,
   OPENSSL_THREAD_LOCAL_RAND,
   OPENSSL_THREAD_LOCAL_FIPS_COUNTERS,
+  OPENSSL_THREAD_LOCAL_FIPS_SERVICE_INDICATOR_STATE,
   OPENSSL_THREAD_LOCAL_TEST,
   NUM_OPENSSL_THREAD_LOCALS,
 } thread_local_data_t;
@@ -868,6 +885,16 @@
   OPENSSL_memcpy(out, &v, sizeof(v));
 }
 
+static inline uint64_t CRYPTO_load_u64_le(const void *in) {
+  uint64_t v;
+  OPENSSL_memcpy(&v, in, sizeof(v));
+  return v;
+}
+
+static inline void CRYPTO_store_u64_le(void *out, uint64_t v) {
+  OPENSSL_memcpy(out, &v, sizeof(v));
+}
+
 static inline uint64_t CRYPTO_load_u64_be(const void *ptr) {
   uint64_t ret;
   OPENSSL_memcpy(&ret, ptr, sizeof(ret));
@@ -889,6 +916,18 @@
   OPENSSL_memcpy(out, &v, sizeof(v));
 }
 
+static inline crypto_word_t CRYPTO_load_word_be(const void *in) {
+  crypto_word_t v;
+  OPENSSL_memcpy(&v, in, sizeof(v));
+#if defined(OPENSSL_64_BIT)
+  static_assert(sizeof(v) == 8, "crypto_word_t has unexpected size");
+  return CRYPTO_bswap8(v);
+#else
+  static_assert(sizeof(v) == 4, "crypto_word_t has unexpected size");
+  return CRYPTO_bswap4(v);
+#endif
+}
+
 
 // Bit rotation functions.
 //
@@ -932,19 +971,50 @@
 // FIPS functions.
 
 #if defined(BORINGSSL_FIPS)
+
 // BORINGSSL_FIPS_abort is called when a FIPS power-on or continuous test
 // fails. It prevents any further cryptographic operations by the current
 // process.
 void BORINGSSL_FIPS_abort(void) __attribute__((noreturn));
-#endif
 
-// boringssl_fips_self_test runs the FIPS KAT-based self tests. It returns one
-// on success and zero on error. The argument is the integrity hash of the FIPS
-// module and may be used to check and write flag files to suppress duplicate
-// self-tests. If |module_hash_len| is zero then no flag file will be checked
-// nor written and tests will always be run.
-int boringssl_fips_self_test(const uint8_t *module_hash,
-                             size_t module_hash_len);
+// boringssl_self_test_startup runs all startup self tests and returns one on
+// success or zero on error. Startup self tests do not include lazy tests.
+// Call |BORINGSSL_self_test| to run every self test.
+int boringssl_self_test_startup(void);
+
+// boringssl_ensure_rsa_self_test checks whether the RSA self-test has been run
+// in this address space. If not, it runs it and crashes the address space if
+// unsuccessful.
+void boringssl_ensure_rsa_self_test(void);
+
+// boringssl_ensure_ecc_self_test checks whether the ECDSA and ECDH self-test
+// has been run in this address space. If not, it runs it and crashes the
+// address space if unsuccessful.
+void boringssl_ensure_ecc_self_test(void);
+
+// boringssl_ensure_ffdh_self_test checks whether the FFDH self-test has been
+// run in this address space. If not, it runs it and crashes the address space
+// if unsuccessful.
+void boringssl_ensure_ffdh_self_test(void);
+
+#else
+
+// Outside of FIPS mode, the lazy tests are no-ops.
+
+OPENSSL_INLINE void boringssl_ensure_rsa_self_test(void) {}
+OPENSSL_INLINE void boringssl_ensure_ecc_self_test(void) {}
+OPENSSL_INLINE void boringssl_ensure_ffdh_self_test(void) {}
+
+#endif  // FIPS
+
+// boringssl_self_test_sha256 performs a SHA-256 KAT.
+int boringssl_self_test_sha256(void);
+
+// boringssl_self_test_sha512 performs a SHA-512 KAT.
+int boringssl_self_test_sha512(void);
+
+// boringssl_self_test_hmac_sha256 performs an HMAC-SHA-256 KAT.
+int boringssl_self_test_hmac_sha256(void);
 
 #if defined(BORINGSSL_FIPS_COUNTERS)
 void boringssl_fips_inc_counter(enum fips_counter_t counter);
@@ -952,6 +1022,260 @@
 OPENSSL_INLINE void boringssl_fips_inc_counter(enum fips_counter_t counter) {}
 #endif
 
+#if defined(BORINGSSL_FIPS_BREAK_TESTS)
+OPENSSL_INLINE int boringssl_fips_break_test(const char *test) {
+  const char *const value = getenv("BORINGSSL_FIPS_BREAK_TEST");
+  return value != NULL && strcmp(value, test) == 0;
+}
+#else
+OPENSSL_INLINE int boringssl_fips_break_test(const char *test) {
+  return 0;
+}
+#endif  // BORINGSSL_FIPS_BREAK_TESTS
+
+
+// Runtime CPU feature support
+
+#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
+// OPENSSL_ia32cap_P contains the Intel CPUID bits when running on an x86 or
+// x86-64 system.
+//
+//   Index 0:
+//     EDX for CPUID where EAX = 1
+//     Bit 20 is always zero
+//     Bit 28 is adjusted to reflect whether the data cache is shared between
+//       multiple logical cores
+//     Bit 30 is used to indicate an Intel CPU
+//   Index 1:
+//     ECX for CPUID where EAX = 1
+//     Bit 11 is used to indicate AMD XOP support, not SDBG
+//   Index 2:
+//     EBX for CPUID where EAX = 7
+//   Index 3:
+//     ECX for CPUID where EAX = 7
+//
+// Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM
+// bits in XCR0, so it is not necessary to check those.
+extern uint32_t OPENSSL_ia32cap_P[4];
+
+#if defined(BORINGSSL_FIPS) && !defined(BORINGSSL_SHARED_LIBRARY)
+// The FIPS module, as a static library, requires an out-of-line version of
+// |OPENSSL_ia32cap_get| so accesses can be rewritten by delocate. Mark the
+// function const so multiple accesses can be optimized together.
+const uint32_t *OPENSSL_ia32cap_get(void) __attribute__((const));
+#else
+OPENSSL_INLINE const uint32_t *OPENSSL_ia32cap_get(void) {
+  return OPENSSL_ia32cap_P;
+}
+#endif
+
+// See Intel manual, volume 2A, table 3-11.
+
+OPENSSL_INLINE int CRYPTO_is_FXSR_capable(void) {
+#if defined(__FXSR__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[0] & (1 << 24)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_intel_cpu(void) {
+  // The reserved bit 30 is used to indicate an Intel CPU.
+  return (OPENSSL_ia32cap_get()[0] & (1 << 30)) != 0;
+}
+
+// See Intel manual, volume 2A, table 3-10.
+
+OPENSSL_INLINE int CRYPTO_is_PCLMUL_capable(void) {
+#if defined(__PCLMUL__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1 << 1)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_SSSE3_capable(void) {
+#if defined(__SSSE3__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1 << 9)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_SSE4_1_capable(void) {
+#if defined(__SSE4_1__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_P[1] & (1 << 19)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_MOVBE_capable(void) {
+#if defined(__MOVBE__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1 << 22)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_AESNI_capable(void) {
+#if defined(__AES__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1 << 25)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_AVX_capable(void) {
+#if defined(__AVX__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1 << 28)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_RDRAND_capable(void) {
+  // The GCC/Clang feature name and preprocessor symbol for RDRAND are "rdrnd"
+  // and |__RDRND__|, respectively.
+#if defined(__RDRND__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[1] & (1u << 30)) != 0;
+#endif
+}
+
+// See Intel manual, volume 2A, table 3-8.
+
+OPENSSL_INLINE int CRYPTO_is_BMI1_capable(void) {
+#if defined(__BMI1__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[2] & (1 << 3)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_AVX2_capable(void) {
+#if defined(__AVX2__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[2] & (1 << 5)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_BMI2_capable(void) {
+#if defined(__BMI2__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[2] & (1 << 8)) != 0;
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_ADX_capable(void) {
+#if defined(__ADX__)
+  return 1;
+#else
+  return (OPENSSL_ia32cap_get()[2] & (1 << 19)) != 0;
+#endif
+}
+
+#endif  // OPENSSL_X86 || OPENSSL_X86_64
+
+#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
+
+#if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM)
+// We do not detect any features at runtime for Apple's 32-bit ARM platforms. On
+// 64-bit ARM, we detect some post-ARMv8.0 features.
+#define OPENSSL_STATIC_ARMCAP
+#endif
+
+// Normalize some older feature flags to their modern ACLE values.
+// https://developer.arm.com/architectures/system-architectures/software-standards/acle
+#if defined(__ARM_NEON__) && !defined(__ARM_NEON)
+#define __ARM_NEON 1
+#endif
+#if defined(__ARM_FEATURE_CRYPTO)
+#if !defined(__ARM_FEATURE_AES)
+#define __ARM_FEATURE_AES 1
+#endif
+#if !defined(__ARM_FEATURE_SHA2)
+#define __ARM_FEATURE_SHA2 1
+#endif
+#endif
+
+#if !defined(OPENSSL_STATIC_ARMCAP)
+// CRYPTO_is_NEON_capable_at_runtime returns true if the current CPU has a NEON
+// unit. Note that |OPENSSL_armcap_P| also exists and contains the same
+// information in a form that's easier for assembly to use.
+OPENSSL_EXPORT int CRYPTO_is_NEON_capable_at_runtime(void);
+
+// CRYPTO_is_ARMv8_AES_capable_at_runtime returns true if the current CPU
+// supports the ARMv8 AES instruction.
+int CRYPTO_is_ARMv8_AES_capable_at_runtime(void);
+
+// CRYPTO_is_ARMv8_PMULL_capable_at_runtime returns true if the current CPU
+// supports the ARMv8 PMULL instruction.
+int CRYPTO_is_ARMv8_PMULL_capable_at_runtime(void);
+#endif  // !OPENSSL_STATIC_ARMCAP
+
+// CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If
+// this is known statically, it is a constant inline function.
+OPENSSL_INLINE int CRYPTO_is_NEON_capable(void) {
+#if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON)
+  return 1;
+#elif defined(OPENSSL_STATIC_ARMCAP)
+  return 0;
+#else
+  return CRYPTO_is_NEON_capable_at_runtime();
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_ARMv8_AES_capable(void) {
+#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_AES)
+  return 1;
+#elif defined(OPENSSL_STATIC_ARMCAP)
+  return 0;
+#else
+  return CRYPTO_is_ARMv8_AES_capable_at_runtime();
+#endif
+}
+
+OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) {
+#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_AES)
+  return 1;
+#elif defined(OPENSSL_STATIC_ARMCAP)
+  return 0;
+#else
+  return CRYPTO_is_ARMv8_PMULL_capable_at_runtime();
+#endif
+}
+
+#endif  // OPENSSL_ARM || OPENSSL_AARCH64
+
+#if defined(OPENSSL_PPC64LE)
+
+// CRYPTO_is_PPC64LE_vcrypto_capable returns true iff the current CPU supports
+// the Vector.AES category of instructions.
+int CRYPTO_is_PPC64LE_vcrypto_capable(void);
+
+extern unsigned long OPENSSL_ppc64le_hwcap2;
+
+#endif  // OPENSSL_PPC64LE
+
+#if defined(BORINGSSL_DISPATCH_TEST)
+// Runtime CPU dispatch testing support
+
+// BORINGSSL_function_hit is an array of flags. The following functions will
+// set these flags if BORINGSSL_DISPATCH_TEST is defined.
+//   0: aes_hw_ctr32_encrypt_blocks
+//   1: aes_hw_encrypt
+//   2: aesni_gcm_encrypt
+//   3: aes_hw_set_encrypt_key
+//   4: vpaes_encrypt
+//   5: vpaes_set_encrypt_key
+extern uint8_t BORINGSSL_function_hit[7];
+#endif  // BORINGSSL_DISPATCH_TEST
+
+
 #if defined(__cplusplus)
 }  // extern C
 #endif
diff --git a/src/crypto/lhash/internal.h b/src/crypto/lhash/internal.h
index 64dca1d..512f06d 100644
--- a/src/crypto/lhash/internal.h
+++ b/src/crypto/lhash/internal.h
@@ -157,6 +157,16 @@
                                          void *arg);
 
 #define DEFINE_LHASH_OF(type)                                                  \
+  /* We disable MSVC C4191 in this macro, which warns when pointers are cast   \
+   * to the wrong type. While the cast itself is valid, it is often a bug      \
+   * because calling it through the cast is UB. However, we never actually     \
+   * call functions as |lhash_cmp_func|. The type is just a type-erased        \
+   * function pointer. (C does not guarantee function pointers fit in          \
+   * |void*|, and GCC will warn on this.) Thus we just disable the false       \
+   * positive warning. */                                                      \
+  OPENSSL_MSVC_PRAGMA(warning(push))                                           \
+  OPENSSL_MSVC_PRAGMA(warning(disable : 4191))                                 \
+                                                                               \
   DECLARE_LHASH_OF(type)                                                       \
                                                                                \
   typedef int (*lhash_##type##_cmp_func)(const type *, const type *);          \
@@ -243,7 +253,9 @@
       LHASH_OF(type) *lh, void (*func)(type *, void *), void *arg) {           \
     LHASH_DOALL_##type cb = {func, arg};                                       \
     OPENSSL_lh_doall_arg((_LHASH *)lh, lh_##type##_call_doall_arg, &cb);       \
-  }
+  }                                                                            \
+                                                                               \
+  OPENSSL_MSVC_PRAGMA(warning(pop))
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/mem.c b/src/crypto/mem.c
index 43d3deb..af20318 100644
--- a/src/crypto/mem.c
+++ b/src/crypto/mem.c
@@ -72,8 +72,7 @@
 
 
 #define OPENSSL_MALLOC_PREFIX 8
-OPENSSL_STATIC_ASSERT(OPENSSL_MALLOC_PREFIX >= sizeof(size_t),
-                      "size_t too large");
+static_assert(OPENSSL_MALLOC_PREFIX >= sizeof(size_t), "size_t too large");
 
 #if defined(OPENSSL_ASAN)
 void __asan_poison_memory_region(const volatile void *addr, size_t size);
@@ -132,7 +131,7 @@
     0x8c, 0x62, 0x20, 0x0b, 0xd2, 0xa0, 0x72, 0x58,
     0x44, 0xa8, 0x96, 0x69, 0xad, 0x55, 0x7e, 0xec,
     // Current source iteration. Incremented ~monthly.
-    2, 0,
+    3, 0,
 };
 
 void *OPENSSL_malloc(size_t size) {
@@ -180,11 +179,18 @@
 
   size_t size = *(size_t *)ptr;
   OPENSSL_cleanse(ptr, size + OPENSSL_MALLOC_PREFIX);
+
+// ASan knows to intercept malloc and free, but not sdallocx.
+#if defined(OPENSSL_ASAN)
+  (void)sdallocx;
+  free(ptr);
+#else
   if (sdallocx) {
     sdallocx(ptr, size + OPENSSL_MALLOC_PREFIX, 0 /* flags */);
   } else {
     free(ptr);
   }
+#endif
 }
 
 void *OPENSSL_realloc(void *orig_ptr, size_t new_size) {
@@ -237,6 +243,18 @@
   OPENSSL_free(ptr);
 }
 
+int CRYPTO_secure_malloc_init(size_t size, size_t min_size) { return 0; }
+
+int CRYPTO_secure_malloc_initialized(void) { return 0; }
+
+size_t CRYPTO_secure_used(void) { return 0; }
+
+void *OPENSSL_secure_malloc(size_t size) { return OPENSSL_malloc(size); }
+
+void OPENSSL_secure_clear_free(void *ptr, size_t len) {
+  OPENSSL_clear_free(ptr, len);
+}
+
 int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) {
   const uint8_t *a = in_a;
   const uint8_t *b = in_b;
diff --git a/src/crypto/obj/obj_dat.h b/src/crypto/obj/obj_dat.h
index 778d8e3..cc185f1 100644
--- a/src/crypto/obj/obj_dat.h
+++ b/src/crypto/obj/obj_dat.h
@@ -57,7 +57,7 @@
 /* This file is generated by crypto/obj/objects.go. */
 
 
-#define NUM_NID 963
+#define NUM_NID 964
 
 static const uint8_t kObjectData[] = {
     /* NID_rsadsi */
@@ -8781,6 +8781,7 @@
     {"ED448", "ED448", NID_ED448, 3, &kObjectData[6181], 0},
     {"X448", "X448", NID_X448, 3, &kObjectData[6184], 0},
     {"SHA512-256", "sha512-256", NID_sha512_256, 9, &kObjectData[6187], 0},
+    {"HKDF", "hkdf", NID_hkdf, 0, NULL, 0},
 };
 
 static const uint16_t kNIDsInShortNameOrder[] = {
@@ -8878,6 +8879,7 @@
     949 /* ED25519 */,
     960 /* ED448 */,
     99 /* GN */,
+    963 /* HKDF */,
     855 /* HMAC */,
     780 /* HMAC-MD5 */,
     781 /* HMAC-SHA1 */,
@@ -10096,6 +10098,7 @@
     601 /* generic cryptogram */,
     99 /* givenName */,
     814 /* gost89-cnt */,
+    963 /* hkdf */,
     855 /* hmac */,
     780 /* hmac-md5 */,
     781 /* hmac-sha1 */,
diff --git a/src/crypto/obj/obj_mac.num b/src/crypto/obj/obj_mac.num
index f110ee9..6367cc3 100644
--- a/src/crypto/obj/obj_mac.num
+++ b/src/crypto/obj/obj_mac.num
@@ -951,3 +951,4 @@
 ED448		960
 X448		961
 sha512_256		962
+hkdf		963
diff --git a/src/crypto/obj/objects.txt b/src/crypto/obj/objects.txt
index 25c2430..67b76c7 100644
--- a/src/crypto/obj/objects.txt
+++ b/src/crypto/obj/objects.txt
@@ -1356,3 +1356,5 @@
 # TLS 1.3 cipher suites do not specify key exchange or authentication.
  : KxANY : kx-any
  : AuthANY : auth-any
+
+ : HKDF : hkdf
diff --git a/src/crypto/pem/pem_all.c b/src/crypto/pem/pem_all.c
index e419774..cade0a2 100644
--- a/src/crypto/pem/pem_all.c
+++ b/src/crypto/pem/pem_all.c
@@ -127,126 +127,117 @@
 IMPLEMENT_PEM_rw(X509_CRL, X509_CRL, PEM_STRING_X509_CRL, X509_CRL)
 IMPLEMENT_PEM_rw(PKCS7, PKCS7, PEM_STRING_PKCS7, PKCS7)
 
-/*
- * We treat RSA or DSA private keys as a special case. For private keys we
- * read in an EVP_PKEY structure with PEM_read_bio_PrivateKey() and extract
- * the relevant private key: this means can handle "traditional" and PKCS#8
- * formats transparently.
- */
-static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa)
-{
-    RSA *rtmp;
-    if (!key)
-        return NULL;
-    rtmp = EVP_PKEY_get1_RSA(key);
-    EVP_PKEY_free(key);
-    if (!rtmp)
-        return NULL;
-    if (rsa) {
-        RSA_free(*rsa);
-        *rsa = rtmp;
-    }
-    return rtmp;
+// We treat RSA or DSA private keys as a special case. For private keys we
+// read in an EVP_PKEY structure with PEM_read_bio_PrivateKey() and extract
+// the relevant private key: this means can handle "traditional" and PKCS#8
+// formats transparently.
+static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa) {
+  RSA *rtmp;
+  if (!key) {
+    return NULL;
+  }
+  rtmp = EVP_PKEY_get1_RSA(key);
+  EVP_PKEY_free(key);
+  if (!rtmp) {
+    return NULL;
+  }
+  if (rsa) {
+    RSA_free(*rsa);
+    *rsa = rtmp;
+  }
+  return rtmp;
 }
 
 RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **rsa, pem_password_cb *cb,
-                                void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
-    return pkey_get_rsa(pktmp, rsa);
+                                void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
+  return pkey_get_rsa(pktmp, rsa);
 }
 
-RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
-    return pkey_get_rsa(pktmp, rsa);
+RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
+  return pkey_get_rsa(pktmp, rsa);
 }
 
-IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA,
-                             RSAPrivateKey)
+IMPLEMENT_PEM_write_cb_const(RSAPrivateKey, RSA, PEM_STRING_RSA, RSAPrivateKey)
 
 
-IMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC,
-                       RSAPublicKey) IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA,
-                                                      PEM_STRING_PUBLIC,
-                                                      RSA_PUBKEY)
+IMPLEMENT_PEM_rw_const(RSAPublicKey, RSA, PEM_STRING_RSA_PUBLIC, RSAPublicKey)
+IMPLEMENT_PEM_rw(RSA_PUBKEY, RSA, PEM_STRING_PUBLIC, RSA_PUBKEY)
 #ifndef OPENSSL_NO_DSA
-static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa)
-{
-    DSA *dtmp;
-    if (!key)
-        return NULL;
-    dtmp = EVP_PKEY_get1_DSA(key);
-    EVP_PKEY_free(key);
-    if (!dtmp)
-        return NULL;
-    if (dsa) {
-        DSA_free(*dsa);
-        *dsa = dtmp;
-    }
-    return dtmp;
+static DSA *pkey_get_dsa(EVP_PKEY *key, DSA **dsa) {
+  DSA *dtmp;
+  if (!key) {
+    return NULL;
+  }
+  dtmp = EVP_PKEY_get1_DSA(key);
+  EVP_PKEY_free(key);
+  if (!dtmp) {
+    return NULL;
+  }
+  if (dsa) {
+    DSA_free(*dsa);
+    *dsa = dtmp;
+  }
+  return dtmp;
 }
 
 DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **dsa, pem_password_cb *cb,
-                                void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
-    return pkey_get_dsa(pktmp, dsa); /* will free pktmp */
+                                void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
+  return pkey_get_dsa(pktmp, dsa);  // will free pktmp
 }
 
-IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA,
-                             DSAPrivateKey)
+IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey)
 
-    IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY)
-DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
-    return pkey_get_dsa(pktmp, dsa); /* will free pktmp */
+IMPLEMENT_PEM_rw(DSA_PUBKEY, DSA, PEM_STRING_PUBLIC, DSA_PUBKEY)
+DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
+  return pkey_get_dsa(pktmp, dsa);  // will free pktmp
 }
 
 IMPLEMENT_PEM_rw_const(DSAparams, DSA, PEM_STRING_DSAPARAMS, DSAparams)
 #endif
-static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey)
-{
-    EC_KEY *dtmp;
-    if (!key)
-        return NULL;
-    dtmp = EVP_PKEY_get1_EC_KEY(key);
-    EVP_PKEY_free(key);
-    if (!dtmp)
-        return NULL;
-    if (eckey) {
-        EC_KEY_free(*eckey);
-        *eckey = dtmp;
-    }
-    return dtmp;
+static EC_KEY *pkey_get_eckey(EVP_PKEY *key, EC_KEY **eckey) {
+  EC_KEY *dtmp;
+  if (!key) {
+    return NULL;
+  }
+  dtmp = EVP_PKEY_get1_EC_KEY(key);
+  EVP_PKEY_free(key);
+  if (!dtmp) {
+    return NULL;
+  }
+  if (eckey) {
+    EC_KEY_free(*eckey);
+    *eckey = dtmp;
+  }
+  return dtmp;
 }
 
 EC_KEY *PEM_read_bio_ECPrivateKey(BIO *bp, EC_KEY **key, pem_password_cb *cb,
-                                  void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
-    return pkey_get_eckey(pktmp, key); /* will free pktmp */
+                                  void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
+  return pkey_get_eckey(pktmp, key);  // will free pktmp
 }
 
 IMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY,
                        ECPrivateKey)
 
-    IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY)
+IMPLEMENT_PEM_rw(EC_PUBKEY, EC_KEY, PEM_STRING_PUBLIC, EC_PUBKEY)
 EC_KEY *PEM_read_ECPrivateKey(FILE *fp, EC_KEY **eckey, pem_password_cb *cb,
-                              void *u)
-{
-    EVP_PKEY *pktmp;
-    pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
-    return pkey_get_eckey(pktmp, eckey); /* will free pktmp */
+                              void *u) {
+  EVP_PKEY *pktmp;
+  pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
+  return pkey_get_eckey(pktmp, eckey);  // will free pktmp
 }
 
 
-IMPLEMENT_PEM_write_const(DHparams, DH, PEM_STRING_DHPARAMS, DHparams)
+IMPLEMENT_PEM_rw_const(DHparams, DH, PEM_STRING_DHPARAMS, DHparams)
 
-    IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY)
+IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC, PUBKEY)
diff --git a/src/crypto/pem/pem_info.c b/src/crypto/pem/pem_info.c
index 3a1d0cc..04b4743 100644
--- a/src/crypto/pem/pem_info.c
+++ b/src/crypto/pem/pem_info.c
@@ -71,288 +71,195 @@
 #include <openssl/x509.h>
 
 STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk,
-                                        pem_password_cb *cb, void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return 0;
-    }
-    STACK_OF(X509_INFO) *ret = PEM_X509_INFO_read_bio(b, sk, cb, u);
-    BIO_free(b);
-    return ret;
+                                        pem_password_cb *cb, void *u) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  STACK_OF(X509_INFO) *ret = PEM_X509_INFO_read_bio(b, sk, cb, u);
+  BIO_free(b);
+  return ret;
 }
 
 enum parse_result_t {
-    parse_ok,
-    parse_error,
-    parse_new_entry,
+  parse_ok,
+  parse_error,
+  parse_new_entry,
 };
 
 static enum parse_result_t parse_x509(X509_INFO *info, const uint8_t *data,
-                                      size_t len, int key_type)
-{
-    if (info->x509 != NULL) {
-        return parse_new_entry;
-    }
-    info->x509 = d2i_X509(NULL, &data, len);
-    return info->x509 != NULL ? parse_ok : parse_error;
+                                      size_t len, int key_type) {
+  if (info->x509 != NULL) {
+    return parse_new_entry;
+  }
+  info->x509 = d2i_X509(NULL, &data, len);
+  return info->x509 != NULL ? parse_ok : parse_error;
 }
 
 static enum parse_result_t parse_x509_aux(X509_INFO *info, const uint8_t *data,
-                                          size_t len, int key_type)
-{
-    if (info->x509 != NULL) {
-        return parse_new_entry;
-    }
-    info->x509 = d2i_X509_AUX(NULL, &data, len);
-    return info->x509 != NULL ? parse_ok : parse_error;
+                                          size_t len, int key_type) {
+  if (info->x509 != NULL) {
+    return parse_new_entry;
+  }
+  info->x509 = d2i_X509_AUX(NULL, &data, len);
+  return info->x509 != NULL ? parse_ok : parse_error;
 }
 
 static enum parse_result_t parse_crl(X509_INFO *info, const uint8_t *data,
-                                     size_t len, int key_type)
-{
-    if (info->crl != NULL) {
-        return parse_new_entry;
-    }
-    info->crl = d2i_X509_CRL(NULL, &data, len);
-    return info->crl != NULL ? parse_ok : parse_error;
+                                     size_t len, int key_type) {
+  if (info->crl != NULL) {
+    return parse_new_entry;
+  }
+  info->crl = d2i_X509_CRL(NULL, &data, len);
+  return info->crl != NULL ? parse_ok : parse_error;
 }
 
 static enum parse_result_t parse_key(X509_INFO *info, const uint8_t *data,
-                                     size_t len, int key_type)
-{
-    if (info->x_pkey != NULL) {
-        return parse_new_entry;
-    }
-    info->x_pkey = X509_PKEY_new();
-    if (info->x_pkey == NULL) {
-        return parse_error;
-    }
-    info->x_pkey->dec_pkey = d2i_PrivateKey(key_type, NULL, &data, len);
-    return info->x_pkey->dec_pkey != NULL ? parse_ok : parse_error;
+                                     size_t len, int key_type) {
+  if (info->x_pkey != NULL) {
+    return parse_new_entry;
+  }
+  info->x_pkey = X509_PKEY_new();
+  if (info->x_pkey == NULL) {
+    return parse_error;
+  }
+  info->x_pkey->dec_pkey = d2i_PrivateKey(key_type, NULL, &data, len);
+  return info->x_pkey->dec_pkey != NULL ? parse_ok : parse_error;
 }
 
 STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk,
-                                            pem_password_cb *cb, void *u)
-{
-    X509_INFO *info = NULL;
-    char *name = NULL, *header = NULL;
-    unsigned char *data = NULL;
-    long len;
-    int ok = 0;
-    STACK_OF(X509_INFO) *ret = NULL;
+                                            pem_password_cb *cb, void *u) {
+  X509_INFO *info = NULL;
+  char *name = NULL, *header = NULL;
+  unsigned char *data = NULL;
+  long len;
+  int ok = 0;
+  STACK_OF(X509_INFO) *ret = NULL;
 
-    if (sk == NULL) {
-        ret = sk_X509_INFO_new_null();
-        if (ret == NULL) {
-            OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-            return NULL;
-        }
-    } else {
-        ret = sk;
+  if (sk == NULL) {
+    ret = sk_X509_INFO_new_null();
+    if (ret == NULL) {
+      OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+      return NULL;
     }
-    size_t orig_num = sk_X509_INFO_num(ret);
+  } else {
+    ret = sk;
+  }
+  size_t orig_num = sk_X509_INFO_num(ret);
 
-    info = X509_INFO_new();
-    if (info == NULL) {
-        goto err;
+  info = X509_INFO_new();
+  if (info == NULL) {
+    goto err;
+  }
+
+  for (;;) {
+    if (!PEM_read_bio(bp, &name, &header, &data, &len)) {
+      uint32_t error = ERR_peek_last_error();
+      if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
+          ERR_GET_REASON(error) == PEM_R_NO_START_LINE) {
+        ERR_clear_error();
+        break;
+      }
+      goto err;
     }
 
-    for (;;) {
-        if (!PEM_read_bio(bp, &name, &header, &data, &len)) {
-            uint32_t error = ERR_peek_last_error();
-            if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
-                ERR_GET_REASON(error) == PEM_R_NO_START_LINE) {
-                ERR_clear_error();
-                break;
-            }
-            goto err;
-        }
-
-        enum parse_result_t (*parse_function)(X509_INFO *, const uint8_t *,
-                                              size_t, int) = NULL;
-        int key_type = EVP_PKEY_NONE;
-        if (strcmp(name, PEM_STRING_X509) == 0 ||
-            strcmp(name, PEM_STRING_X509_OLD) == 0) {
-            parse_function = parse_x509;
-        } else if (strcmp(name, PEM_STRING_X509_TRUSTED) == 0) {
-            parse_function = parse_x509_aux;
-        } else if (strcmp(name, PEM_STRING_X509_CRL) == 0) {
-            parse_function = parse_crl;
-        } else if (strcmp(name, PEM_STRING_RSA) == 0) {
-            parse_function = parse_key;
-            key_type = EVP_PKEY_RSA;
-        } else if (strcmp(name, PEM_STRING_DSA) == 0) {
-            parse_function = parse_key;
-            key_type = EVP_PKEY_DSA;
-        } else if (strcmp(name, PEM_STRING_ECPRIVATEKEY) == 0) {
-            parse_function = parse_key;
-            key_type = EVP_PKEY_EC;
-        }
-
-        /* If a private key has a header, assume it is encrypted. */
-        if (key_type != EVP_PKEY_NONE && strlen(header) > 10) {
-            if (info->x_pkey != NULL) {
-                if (!sk_X509_INFO_push(ret, info)) {
-                    goto err;
-                }
-                info = X509_INFO_new();
-                if (info == NULL) {
-                    goto err;
-                }
-            }
-            /* Historically, raw entries pushed an empty key. */
-            info->x_pkey = X509_PKEY_new();
-            if (info->x_pkey == NULL ||
-                !PEM_get_EVP_CIPHER_INFO(header, &info->enc_cipher)) {
-                goto err;
-            }
-            info->enc_data = (char *)data;
-            info->enc_len = (int)len;
-            data = NULL;
-        } else if (parse_function != NULL) {
-            EVP_CIPHER_INFO cipher;
-            if (!PEM_get_EVP_CIPHER_INFO(header, &cipher) ||
-                !PEM_do_header(&cipher, data, &len, cb, u)) {
-                goto err;
-            }
-            enum parse_result_t result =
-                parse_function(info, data, len, key_type);
-            if (result == parse_new_entry) {
-                if (!sk_X509_INFO_push(ret, info)) {
-                    goto err;
-                }
-                info = X509_INFO_new();
-                if (info == NULL) {
-                    goto err;
-                }
-                result = parse_function(info, data, len, key_type);
-            }
-            if (result != parse_ok) {
-                OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
-                goto err;
-            }
-        }
-        OPENSSL_free(name);
-        OPENSSL_free(header);
-        OPENSSL_free(data);
-        name = NULL;
-        header = NULL;
-        data = NULL;
+    enum parse_result_t (*parse_function)(X509_INFO *, const uint8_t *, size_t,
+                                          int) = NULL;
+    int key_type = EVP_PKEY_NONE;
+    if (strcmp(name, PEM_STRING_X509) == 0 ||
+        strcmp(name, PEM_STRING_X509_OLD) == 0) {
+      parse_function = parse_x509;
+    } else if (strcmp(name, PEM_STRING_X509_TRUSTED) == 0) {
+      parse_function = parse_x509_aux;
+    } else if (strcmp(name, PEM_STRING_X509_CRL) == 0) {
+      parse_function = parse_crl;
+    } else if (strcmp(name, PEM_STRING_RSA) == 0) {
+      parse_function = parse_key;
+      key_type = EVP_PKEY_RSA;
+    } else if (strcmp(name, PEM_STRING_DSA) == 0) {
+      parse_function = parse_key;
+      key_type = EVP_PKEY_DSA;
+    } else if (strcmp(name, PEM_STRING_ECPRIVATEKEY) == 0) {
+      parse_function = parse_key;
+      key_type = EVP_PKEY_EC;
     }
 
-    /* Push the last entry on the stack if not empty. */
-    if (info->x509 != NULL || info->crl != NULL ||
-        info->x_pkey != NULL || info->enc_data != NULL) {
+    // If a private key has a header, assume it is encrypted.
+    if (key_type != EVP_PKEY_NONE && strlen(header) > 10) {
+      if (info->x_pkey != NULL) {
         if (!sk_X509_INFO_push(ret, info)) {
-            goto err;
+          goto err;
         }
-        info = NULL;
+        info = X509_INFO_new();
+        if (info == NULL) {
+          goto err;
+        }
+      }
+      // Historically, raw entries pushed an empty key.
+      info->x_pkey = X509_PKEY_new();
+      if (info->x_pkey == NULL ||
+          !PEM_get_EVP_CIPHER_INFO(header, &info->enc_cipher)) {
+        goto err;
+      }
+      info->enc_data = (char *)data;
+      info->enc_len = (int)len;
+      data = NULL;
+    } else if (parse_function != NULL) {
+      EVP_CIPHER_INFO cipher;
+      if (!PEM_get_EVP_CIPHER_INFO(header, &cipher) ||
+          !PEM_do_header(&cipher, data, &len, cb, u)) {
+        goto err;
+      }
+      enum parse_result_t result = parse_function(info, data, len, key_type);
+      if (result == parse_new_entry) {
+        if (!sk_X509_INFO_push(ret, info)) {
+          goto err;
+        }
+        info = X509_INFO_new();
+        if (info == NULL) {
+          goto err;
+        }
+        result = parse_function(info, data, len, key_type);
+      }
+      if (result != parse_ok) {
+        OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
+        goto err;
+      }
     }
-
-    ok = 1;
-
- err:
-    X509_INFO_free(info);
-    if (!ok) {
-        while (sk_X509_INFO_num(ret) > orig_num) {
-            X509_INFO_free(sk_X509_INFO_pop(ret));
-        }
-        if (ret != sk) {
-            sk_X509_INFO_free(ret);
-        }
-        ret = NULL;
-    }
-
     OPENSSL_free(name);
     OPENSSL_free(header);
     OPENSSL_free(data);
-    return ret;
-}
+    name = NULL;
+    header = NULL;
+    data = NULL;
+  }
 
-/* A TJH addition */
-int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc,
-                            unsigned char *kstr, int klen,
-                            pem_password_cb *cb, void *u)
-{
-    int i, ret = 0;
-    unsigned char *data = NULL;
-    const char *objstr = NULL;
-    char buf[PEM_BUFSIZE];
-    unsigned char *iv = NULL;
-    unsigned iv_len = 0;
-
-    if (enc != NULL) {
-        iv_len = EVP_CIPHER_iv_length(enc);
-        objstr = OBJ_nid2sn(EVP_CIPHER_nid(enc));
-        if (objstr == NULL) {
-            OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER);
-            goto err;
-        }
+  // Push the last entry on the stack if not empty.
+  if (info->x509 != NULL || info->crl != NULL || info->x_pkey != NULL ||
+      info->enc_data != NULL) {
+    if (!sk_X509_INFO_push(ret, info)) {
+      goto err;
     }
+    info = NULL;
+  }
 
-    /*
-     * now for the fun part ... if we have a private key then we have to be
-     * able to handle a not-yet-decrypted key being written out correctly ...
-     * if it is decrypted or it is non-encrypted then we use the base code
-     */
-    if (xi->x_pkey != NULL) {
-        if ((xi->enc_data != NULL) && (xi->enc_len > 0)) {
-            if (enc == NULL) {
-                OPENSSL_PUT_ERROR(PEM, PEM_R_CIPHER_IS_NULL);
-                goto err;
-            }
-
-            /* copy from weirdo names into more normal things */
-            iv = xi->enc_cipher.iv;
-            data = (unsigned char *)xi->enc_data;
-            i = xi->enc_len;
-
-            /*
-             * we take the encryption data from the internal stuff rather
-             * than what the user has passed us ... as we have to match
-             * exactly for some strange reason
-             */
-            objstr = OBJ_nid2sn(EVP_CIPHER_nid(xi->enc_cipher.cipher));
-            if (objstr == NULL) {
-                OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER);
-                goto err;
-            }
-
-            /* create the right magic header stuff */
-            assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
-            buf[0] = '\0';
-            PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
-            PEM_dek_info(buf, objstr, iv_len, (char *)iv);
-
-            /* use the normal code to write things out */
-            i = PEM_write_bio(bp, PEM_STRING_RSA, buf, data, i);
-            if (i <= 0)
-                goto err;
-        } else {
-            /* Add DSA/DH */
-            /* normal optionally encrypted stuff */
-            if (PEM_write_bio_RSAPrivateKey(bp,
-                                            xi->x_pkey->dec_pkey->pkey.rsa,
-                                            enc, kstr, klen, cb, u) <= 0)
-                goto err;
-        }
-    }
-
-    /* if we have a certificate then write it out now */
-    if ((xi->x509 != NULL) && (PEM_write_bio_X509(bp, xi->x509) <= 0))
-        goto err;
-
-    /*
-     * we are ignoring anything else that is loaded into the X509_INFO
-     * structure for the moment ... as I don't need it so I'm not coding it
-     * here and Eric can do it when this makes it into the base library --tjh
-     */
-
-    ret = 1;
+  ok = 1;
 
 err:
-  OPENSSL_cleanse(buf, PEM_BUFSIZE);
+  X509_INFO_free(info);
+  if (!ok) {
+    while (sk_X509_INFO_num(ret) > orig_num) {
+      X509_INFO_free(sk_X509_INFO_pop(ret));
+    }
+    if (ret != sk) {
+      sk_X509_INFO_free(ret);
+    }
+    ret = NULL;
+  }
+
+  OPENSSL_free(name);
+  OPENSSL_free(header);
+  OPENSSL_free(data);
   return ret;
 }
diff --git a/src/crypto/pem/pem_lib.c b/src/crypto/pem/pem_lib.c
index 747d694..76622ab 100644
--- a/src/crypto/pem/pem_lib.c
+++ b/src/crypto/pem/pem_lib.c
@@ -74,696 +74,727 @@
 #include "../internal.h"
 
 
-#define MIN_LENGTH      4
+#define MIN_LENGTH 4
 
 static int load_iv(char **fromp, unsigned char *to, int num);
 static int check_pem(const char *nm, const char *name);
 
-void PEM_proc_type(char *buf, int type)
-{
-    const char *str;
+void PEM_proc_type(char *buf, int type) {
+  const char *str;
 
-    if (type == PEM_TYPE_ENCRYPTED)
-        str = "ENCRYPTED";
-    else if (type == PEM_TYPE_MIC_CLEAR)
-        str = "MIC-CLEAR";
-    else if (type == PEM_TYPE_MIC_ONLY)
-        str = "MIC-ONLY";
-    else
-        str = "BAD-TYPE";
+  if (type == PEM_TYPE_ENCRYPTED) {
+    str = "ENCRYPTED";
+  } else if (type == PEM_TYPE_MIC_CLEAR) {
+    str = "MIC-CLEAR";
+  } else if (type == PEM_TYPE_MIC_ONLY) {
+    str = "MIC-ONLY";
+  } else {
+    str = "BAD-TYPE";
+  }
 
-    OPENSSL_strlcat(buf, "Proc-Type: 4,", PEM_BUFSIZE);
-    OPENSSL_strlcat(buf, str, PEM_BUFSIZE);
-    OPENSSL_strlcat(buf, "\n", PEM_BUFSIZE);
+  OPENSSL_strlcat(buf, "Proc-Type: 4,", PEM_BUFSIZE);
+  OPENSSL_strlcat(buf, str, PEM_BUFSIZE);
+  OPENSSL_strlcat(buf, "\n", PEM_BUFSIZE);
 }
 
-void PEM_dek_info(char *buf, const char *type, int len, char *str)
-{
-    static const unsigned char map[17] = "0123456789ABCDEF";
-    long i;
-    int j;
+void PEM_dek_info(char *buf, const char *type, int len, char *str) {
+  static const unsigned char map[17] = "0123456789ABCDEF";
+  long i;
+  int j;
 
-    OPENSSL_strlcat(buf, "DEK-Info: ", PEM_BUFSIZE);
-    OPENSSL_strlcat(buf, type, PEM_BUFSIZE);
-    OPENSSL_strlcat(buf, ",", PEM_BUFSIZE);
-    j = strlen(buf);
-    if (j + (len * 2) + 1 > PEM_BUFSIZE)
-        return;
-    for (i = 0; i < len; i++) {
-        buf[j + i * 2] = map[(str[i] >> 4) & 0x0f];
-        buf[j + i * 2 + 1] = map[(str[i]) & 0x0f];
-    }
-    buf[j + i * 2] = '\n';
-    buf[j + i * 2 + 1] = '\0';
+  OPENSSL_strlcat(buf, "DEK-Info: ", PEM_BUFSIZE);
+  OPENSSL_strlcat(buf, type, PEM_BUFSIZE);
+  OPENSSL_strlcat(buf, ",", PEM_BUFSIZE);
+  j = strlen(buf);
+  if (j + (len * 2) + 1 > PEM_BUFSIZE) {
+    return;
+  }
+  for (i = 0; i < len; i++) {
+    buf[j + i * 2] = map[(str[i] >> 4) & 0x0f];
+    buf[j + i * 2 + 1] = map[(str[i]) & 0x0f];
+  }
+  buf[j + i * 2] = '\n';
+  buf[j + i * 2 + 1] = '\0';
 }
 
 void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x,
-                    pem_password_cb *cb, void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return NULL;
-    }
-    void *ret = PEM_ASN1_read_bio(d2i, name, b, x, cb, u);
-    BIO_free(b);
-    return ret;
+                    pem_password_cb *cb, void *u) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return NULL;
+  }
+  void *ret = PEM_ASN1_read_bio(d2i, name, b, x, cb, u);
+  BIO_free(b);
+  return ret;
 }
 
-static int check_pem(const char *nm, const char *name)
-{
-    /* Normal matching nm and name */
-    if (!strcmp(nm, name))
-        return 1;
+static int check_pem(const char *nm, const char *name) {
+  // Normal matching nm and name
+  if (!strcmp(nm, name)) {
+    return 1;
+  }
 
-    /* Make PEM_STRING_EVP_PKEY match any private key */
+  // Make PEM_STRING_EVP_PKEY match any private key
 
-    if (!strcmp(name, PEM_STRING_EVP_PKEY)) {
-        return !strcmp(nm, PEM_STRING_PKCS8) ||
-               !strcmp(nm, PEM_STRING_PKCS8INF) ||
-               !strcmp(nm, PEM_STRING_RSA) ||
-               !strcmp(nm, PEM_STRING_EC) ||
-               !strcmp(nm, PEM_STRING_DSA);
-    }
+  if (!strcmp(name, PEM_STRING_EVP_PKEY)) {
+    return !strcmp(nm, PEM_STRING_PKCS8) || !strcmp(nm, PEM_STRING_PKCS8INF) ||
+           !strcmp(nm, PEM_STRING_RSA) || !strcmp(nm, PEM_STRING_EC) ||
+           !strcmp(nm, PEM_STRING_DSA);
+  }
 
-    /* Permit older strings */
+  // Permit older strings
 
-    if (!strcmp(nm, PEM_STRING_X509_OLD) && !strcmp(name, PEM_STRING_X509))
-        return 1;
+  if (!strcmp(nm, PEM_STRING_X509_OLD) && !strcmp(name, PEM_STRING_X509)) {
+    return 1;
+  }
 
-    if (!strcmp(nm, PEM_STRING_X509_REQ_OLD) &&
-        !strcmp(name, PEM_STRING_X509_REQ))
-        return 1;
+  if (!strcmp(nm, PEM_STRING_X509_REQ_OLD) &&
+      !strcmp(name, PEM_STRING_X509_REQ)) {
+    return 1;
+  }
 
-    /* Allow normal certs to be read as trusted certs */
-    if (!strcmp(nm, PEM_STRING_X509) &&
-        !strcmp(name, PEM_STRING_X509_TRUSTED))
-        return 1;
+  // Allow normal certs to be read as trusted certs
+  if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_X509_TRUSTED)) {
+    return 1;
+  }
 
-    if (!strcmp(nm, PEM_STRING_X509_OLD) &&
-        !strcmp(name, PEM_STRING_X509_TRUSTED))
-        return 1;
+  if (!strcmp(nm, PEM_STRING_X509_OLD) &&
+      !strcmp(name, PEM_STRING_X509_TRUSTED)) {
+    return 1;
+  }
 
-    /* Some CAs use PKCS#7 with CERTIFICATE headers */
-    if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_PKCS7))
-        return 1;
+  // Some CAs use PKCS#7 with CERTIFICATE headers
+  if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_PKCS7)) {
+    return 1;
+  }
 
-    if (!strcmp(nm, PEM_STRING_PKCS7_SIGNED) &&
-        !strcmp(name, PEM_STRING_PKCS7))
-        return 1;
+  if (!strcmp(nm, PEM_STRING_PKCS7_SIGNED) && !strcmp(name, PEM_STRING_PKCS7)) {
+    return 1;
+  }
 
 #ifndef OPENSSL_NO_CMS
-    if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_CMS))
-        return 1;
-    /* Allow CMS to be read from PKCS#7 headers */
-    if (!strcmp(nm, PEM_STRING_PKCS7) && !strcmp(name, PEM_STRING_CMS))
-        return 1;
+  if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_CMS)) {
+    return 1;
+  }
+  // Allow CMS to be read from PKCS#7 headers
+  if (!strcmp(nm, PEM_STRING_PKCS7) && !strcmp(name, PEM_STRING_CMS)) {
+    return 1;
+  }
 #endif
 
-    return 0;
+  return 0;
 }
 
-static const EVP_CIPHER *cipher_by_name(const char *name)
-{
-    /* This is similar to the (deprecated) function |EVP_get_cipherbyname|. Note
-     * the PEM code assumes that ciphers have at least 8 bytes of IV, at most 20
-     * bytes of overhead and generally behave like CBC mode. */
-    if (0 == strcmp(name, SN_des_cbc)) {
-        return EVP_des_cbc();
-    } else if (0 == strcmp(name, SN_des_ede3_cbc)) {
-        return EVP_des_ede3_cbc();
-    } else if (0 == strcmp(name, SN_aes_128_cbc)) {
-        return EVP_aes_128_cbc();
-    } else if (0 == strcmp(name, SN_aes_192_cbc)) {
-        return EVP_aes_192_cbc();
-    } else if (0 == strcmp(name, SN_aes_256_cbc)) {
-        return EVP_aes_256_cbc();
-    } else {
-        return NULL;
-    }
+static const EVP_CIPHER *cipher_by_name(const char *name) {
+  // This is similar to the (deprecated) function |EVP_get_cipherbyname|. Note
+  // the PEM code assumes that ciphers have at least 8 bytes of IV, at most 20
+  // bytes of overhead and generally behave like CBC mode.
+  if (0 == strcmp(name, SN_des_cbc)) {
+    return EVP_des_cbc();
+  } else if (0 == strcmp(name, SN_des_ede3_cbc)) {
+    return EVP_des_ede3_cbc();
+  } else if (0 == strcmp(name, SN_aes_128_cbc)) {
+    return EVP_aes_128_cbc();
+  } else if (0 == strcmp(name, SN_aes_192_cbc)) {
+    return EVP_aes_192_cbc();
+  } else if (0 == strcmp(name, SN_aes_256_cbc)) {
+    return EVP_aes_256_cbc();
+  } else {
+    return NULL;
+  }
 }
 
 int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm,
                        const char *name, BIO *bp, pem_password_cb *cb,
-                       void *u)
-{
-    EVP_CIPHER_INFO cipher;
-    char *nm = NULL, *header = NULL;
-    unsigned char *data = NULL;
-    long len;
-    int ret = 0;
+                       void *u) {
+  EVP_CIPHER_INFO cipher;
+  char *nm = NULL, *header = NULL;
+  unsigned char *data = NULL;
+  long len;
+  int ret = 0;
 
-    for (;;) {
-        if (!PEM_read_bio(bp, &nm, &header, &data, &len)) {
-            uint32_t error = ERR_peek_error();
-            if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
-                ERR_GET_REASON(error) == PEM_R_NO_START_LINE) {
-                ERR_add_error_data(2, "Expecting: ", name);
-            }
-            return 0;
-        }
-        if (check_pem(nm, name))
-            break;
-        OPENSSL_free(nm);
-        OPENSSL_free(header);
-        OPENSSL_free(data);
+  for (;;) {
+    if (!PEM_read_bio(bp, &nm, &header, &data, &len)) {
+      uint32_t error = ERR_peek_error();
+      if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
+          ERR_GET_REASON(error) == PEM_R_NO_START_LINE) {
+        ERR_add_error_data(2, "Expecting: ", name);
+      }
+      return 0;
     }
-    if (!PEM_get_EVP_CIPHER_INFO(header, &cipher))
-        goto err;
-    if (!PEM_do_header(&cipher, data, &len, cb, u))
-        goto err;
-
-    *pdata = data;
-    *plen = len;
-
-    if (pnm)
-        *pnm = nm;
-
-    ret = 1;
-
- err:
-    if (!ret || !pnm)
-        OPENSSL_free(nm);
+    if (check_pem(nm, name)) {
+      break;
+    }
+    OPENSSL_free(nm);
     OPENSSL_free(header);
-    if (!ret)
-        OPENSSL_free(data);
-    return ret;
-}
-
-int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp,
-                   void *x, const EVP_CIPHER *enc, unsigned char *kstr,
-                   int klen, pem_password_cb *callback, void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = PEM_ASN1_write_bio(i2d, name, b, x, enc, kstr, klen, callback, u);
-    BIO_free(b);
-    return ret;
-}
-
-int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp,
-                       void *x, const EVP_CIPHER *enc, unsigned char *kstr,
-                       int klen, pem_password_cb *callback, void *u)
-{
-    EVP_CIPHER_CTX ctx;
-    int dsize = 0, i, j, ret = 0;
-    unsigned char *p, *data = NULL;
-    const char *objstr = NULL;
-    char buf[PEM_BUFSIZE];
-    unsigned char key[EVP_MAX_KEY_LENGTH];
-    unsigned char iv[EVP_MAX_IV_LENGTH];
-
-    if (enc != NULL) {
-        objstr = OBJ_nid2sn(EVP_CIPHER_nid(enc));
-        if (objstr == NULL ||
-            cipher_by_name(objstr) == NULL ||
-            EVP_CIPHER_iv_length(enc) < 8) {
-            OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER);
-            goto err;
-        }
-    }
-
-    if ((dsize = i2d(x, NULL)) < 0) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
-        dsize = 0;
-        goto err;
-    }
-    /* dzise + 8 bytes are needed */
-    /* actually it needs the cipher block size extra... */
-    data = (unsigned char *)OPENSSL_malloc((unsigned int)dsize + 20);
-    if (data == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    p = data;
-    i = i2d(x, &p);
-
-    if (enc != NULL) {
-        const unsigned iv_len = EVP_CIPHER_iv_length(enc);
-
-        if (kstr == NULL) {
-            klen = 0;
-            if (!callback)
-                callback = PEM_def_callback;
-            klen = (*callback) (buf, PEM_BUFSIZE, 1, u);
-            if (klen <= 0) {
-                OPENSSL_PUT_ERROR(PEM, PEM_R_READ_KEY);
-                goto err;
-            }
-            kstr = (unsigned char *)buf;
-        }
-        assert(iv_len <= (int)sizeof(iv));
-        if (!RAND_bytes(iv, iv_len)) /* Generate a salt */
-            goto err;
-        /*
-         * The 'iv' is used as the iv and as a salt.  It is NOT taken from
-         * the BytesToKey function
-         */
-        if (!EVP_BytesToKey(enc, EVP_md5(), iv, kstr, klen, 1, key, NULL))
-            goto err;
-
-        if (kstr == (unsigned char *)buf)
-            OPENSSL_cleanse(buf, PEM_BUFSIZE);
-
-        assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
-
-        buf[0] = '\0';
-        PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
-        PEM_dek_info(buf, objstr, iv_len, (char *)iv);
-        /* k=strlen(buf); */
-
-        EVP_CIPHER_CTX_init(&ctx);
-        ret = 1;
-        if (!EVP_EncryptInit_ex(&ctx, enc, NULL, key, iv)
-            || !EVP_EncryptUpdate(&ctx, data, &j, data, i)
-            || !EVP_EncryptFinal_ex(&ctx, &(data[j]), &i))
-            ret = 0;
-        else
-            i += j;
-        EVP_CIPHER_CTX_cleanup(&ctx);
-        if (ret == 0)
-            goto err;
-    } else {
-        ret = 1;
-        buf[0] = '\0';
-    }
-    i = PEM_write_bio(bp, name, buf, data, i);
-    if (i <= 0)
-        ret = 0;
- err:
-    OPENSSL_cleanse(key, sizeof(key));
-    OPENSSL_cleanse(iv, sizeof(iv));
-    OPENSSL_cleanse((char *)&ctx, sizeof(ctx));
-    OPENSSL_cleanse(buf, PEM_BUFSIZE);
     OPENSSL_free(data);
-    return (ret);
+  }
+  if (!PEM_get_EVP_CIPHER_INFO(header, &cipher)) {
+    goto err;
+  }
+  if (!PEM_do_header(&cipher, data, &len, cb, u)) {
+    goto err;
+  }
+
+  *pdata = data;
+  *plen = len;
+
+  if (pnm) {
+    *pnm = nm;
+  }
+
+  ret = 1;
+
+err:
+  if (!ret || !pnm) {
+    OPENSSL_free(nm);
+  }
+  OPENSSL_free(header);
+  if (!ret) {
+    OPENSSL_free(data);
+  }
+  return ret;
+}
+
+int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, void *x,
+                   const EVP_CIPHER *enc, unsigned char *kstr, int klen,
+                   pem_password_cb *callback, void *u) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = PEM_ASN1_write_bio(i2d, name, b, x, enc, kstr, klen, callback, u);
+  BIO_free(b);
+  return ret;
+}
+
+int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x,
+                       const EVP_CIPHER *enc, unsigned char *kstr, int klen,
+                       pem_password_cb *callback, void *u) {
+  EVP_CIPHER_CTX ctx;
+  int dsize = 0, i, j, ret = 0;
+  unsigned char *p, *data = NULL;
+  const char *objstr = NULL;
+  char buf[PEM_BUFSIZE];
+  unsigned char key[EVP_MAX_KEY_LENGTH];
+  unsigned char iv[EVP_MAX_IV_LENGTH];
+
+  if (enc != NULL) {
+    objstr = OBJ_nid2sn(EVP_CIPHER_nid(enc));
+    if (objstr == NULL || cipher_by_name(objstr) == NULL ||
+        EVP_CIPHER_iv_length(enc) < 8) {
+      OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER);
+      goto err;
+    }
+  }
+
+  if ((dsize = i2d(x, NULL)) < 0) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
+    dsize = 0;
+    goto err;
+  }
+  // dzise + 8 bytes are needed
+  // actually it needs the cipher block size extra...
+  data = (unsigned char *)OPENSSL_malloc((unsigned int)dsize + 20);
+  if (data == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  p = data;
+  i = i2d(x, &p);
+
+  if (enc != NULL) {
+    const unsigned iv_len = EVP_CIPHER_iv_length(enc);
+
+    if (kstr == NULL) {
+      klen = 0;
+      if (!callback) {
+        callback = PEM_def_callback;
+      }
+      klen = (*callback)(buf, PEM_BUFSIZE, 1, u);
+      if (klen <= 0) {
+        OPENSSL_PUT_ERROR(PEM, PEM_R_READ_KEY);
+        goto err;
+      }
+      kstr = (unsigned char *)buf;
+    }
+    assert(iv_len <= (int)sizeof(iv));
+    if (!RAND_bytes(iv, iv_len)) {  // Generate a salt
+      goto err;
+    }
+    // The 'iv' is used as the iv and as a salt.  It is NOT taken from
+    // the BytesToKey function
+    if (!EVP_BytesToKey(enc, EVP_md5(), iv, kstr, klen, 1, key, NULL)) {
+      goto err;
+    }
+
+    if (kstr == (unsigned char *)buf) {
+      OPENSSL_cleanse(buf, PEM_BUFSIZE);
+    }
+
+    assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
+
+    buf[0] = '\0';
+    PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
+    PEM_dek_info(buf, objstr, iv_len, (char *)iv);
+    // k=strlen(buf);
+
+    EVP_CIPHER_CTX_init(&ctx);
+    ret = 1;
+    if (!EVP_EncryptInit_ex(&ctx, enc, NULL, key, iv) ||
+        !EVP_EncryptUpdate(&ctx, data, &j, data, i) ||
+        !EVP_EncryptFinal_ex(&ctx, &(data[j]), &i)) {
+      ret = 0;
+    } else {
+      i += j;
+    }
+    EVP_CIPHER_CTX_cleanup(&ctx);
+    if (ret == 0) {
+      goto err;
+    }
+  } else {
+    ret = 1;
+    buf[0] = '\0';
+  }
+  i = PEM_write_bio(bp, name, buf, data, i);
+  if (i <= 0) {
+    ret = 0;
+  }
+err:
+  OPENSSL_cleanse(key, sizeof(key));
+  OPENSSL_cleanse(iv, sizeof(iv));
+  OPENSSL_cleanse((char *)&ctx, sizeof(ctx));
+  OPENSSL_cleanse(buf, PEM_BUFSIZE);
+  OPENSSL_free(data);
+  return ret;
 }
 
 int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,
-                  pem_password_cb *callback, void *u)
-{
-    int i = 0, j, o, klen;
-    long len;
-    EVP_CIPHER_CTX ctx;
-    unsigned char key[EVP_MAX_KEY_LENGTH];
-    char buf[PEM_BUFSIZE];
+                  pem_password_cb *callback, void *u) {
+  int i = 0, j, o, klen;
+  long len;
+  EVP_CIPHER_CTX ctx;
+  unsigned char key[EVP_MAX_KEY_LENGTH];
+  char buf[PEM_BUFSIZE];
 
-    len = *plen;
+  len = *plen;
 
-    if (cipher->cipher == NULL)
-        return (1);
+  if (cipher->cipher == NULL) {
+    return 1;
+  }
 
-    klen = 0;
-    if (!callback)
-        callback = PEM_def_callback;
-    klen = callback(buf, PEM_BUFSIZE, 0, u);
-    if (klen <= 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
-        return (0);
-    }
+  klen = 0;
+  if (!callback) {
+    callback = PEM_def_callback;
+  }
+  klen = callback(buf, PEM_BUFSIZE, 0, u);
+  if (klen <= 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
+    return 0;
+  }
 
-    if (!EVP_BytesToKey(cipher->cipher, EVP_md5(), &(cipher->iv[0]),
-                        (unsigned char *)buf, klen, 1, key, NULL))
-        return 0;
+  if (!EVP_BytesToKey(cipher->cipher, EVP_md5(), &(cipher->iv[0]),
+                      (unsigned char *)buf, klen, 1, key, NULL)) {
+    return 0;
+  }
 
-    j = (int)len;
-    EVP_CIPHER_CTX_init(&ctx);
-    o = EVP_DecryptInit_ex(&ctx, cipher->cipher, NULL, key, &(cipher->iv[0]));
-    if (o)
-        o = EVP_DecryptUpdate(&ctx, data, &i, data, j);
-    if (o)
-        o = EVP_DecryptFinal_ex(&ctx, &(data[i]), &j);
-    EVP_CIPHER_CTX_cleanup(&ctx);
-    OPENSSL_cleanse((char *)buf, sizeof(buf));
-    OPENSSL_cleanse((char *)key, sizeof(key));
-    if (!o) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_DECRYPT);
-        return (0);
-    }
-    j += i;
-    *plen = j;
-    return (1);
+  j = (int)len;
+  EVP_CIPHER_CTX_init(&ctx);
+  o = EVP_DecryptInit_ex(&ctx, cipher->cipher, NULL, key, &(cipher->iv[0]));
+  if (o) {
+    o = EVP_DecryptUpdate(&ctx, data, &i, data, j);
+  }
+  if (o) {
+    o = EVP_DecryptFinal_ex(&ctx, &(data[i]), &j);
+  }
+  EVP_CIPHER_CTX_cleanup(&ctx);
+  OPENSSL_cleanse((char *)buf, sizeof(buf));
+  OPENSSL_cleanse((char *)key, sizeof(key));
+  if (!o) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_DECRYPT);
+    return 0;
+  }
+  j += i;
+  *plen = j;
+  return 1;
 }
 
-int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher)
-{
-    const EVP_CIPHER *enc = NULL;
-    char *p, c;
-    char **header_pp = &header;
+int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) {
+  const EVP_CIPHER *enc = NULL;
+  char *p, c;
+  char **header_pp = &header;
 
-    cipher->cipher = NULL;
-    OPENSSL_memset(cipher->iv, 0, sizeof(cipher->iv));
-    if ((header == NULL) || (*header == '\0') || (*header == '\n'))
-        return (1);
-    if (strncmp(header, "Proc-Type: ", 11) != 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_PROC_TYPE);
-        return (0);
-    }
-    header += 11;
-    if (*header != '4')
-        return (0);
-    header++;
-    if (*header != ',')
-        return (0);
-    header++;
-    if (strncmp(header, "ENCRYPTED", 9) != 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_ENCRYPTED);
-        return (0);
-    }
-    for (; (*header != '\n') && (*header != '\0'); header++) ;
-    if (*header == '\0') {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_SHORT_HEADER);
-        return (0);
+  cipher->cipher = NULL;
+  OPENSSL_memset(cipher->iv, 0, sizeof(cipher->iv));
+  if ((header == NULL) || (*header == '\0') || (*header == '\n')) {
+    return 1;
+  }
+  if (strncmp(header, "Proc-Type: ", 11) != 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_PROC_TYPE);
+    return 0;
+  }
+  header += 11;
+  if (*header != '4') {
+    return 0;
+  }
+  header++;
+  if (*header != ',') {
+    return 0;
+  }
+  header++;
+  if (strncmp(header, "ENCRYPTED", 9) != 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_ENCRYPTED);
+    return 0;
+  }
+  for (; (*header != '\n') && (*header != '\0'); header++) {
+    ;
+  }
+  if (*header == '\0') {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_SHORT_HEADER);
+    return 0;
+  }
+  header++;
+  if (strncmp(header, "DEK-Info: ", 10) != 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_DEK_INFO);
+    return 0;
+  }
+  header += 10;
+
+  p = header;
+  for (;;) {
+    c = *header;
+    if (!(((c >= 'A') && (c <= 'Z')) || (c == '-') ||
+          ((c >= '0') && (c <= '9')))) {
+      break;
     }
     header++;
-    if (strncmp(header, "DEK-Info: ", 10) != 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_DEK_INFO);
-        return (0);
-    }
-    header += 10;
+  }
+  *header = '\0';
+  cipher->cipher = enc = cipher_by_name(p);
+  *header = c;
+  header++;
 
-    p = header;
-    for (;;) {
-        c = *header;
-        if (!(((c >= 'A') && (c <= 'Z')) || (c == '-') ||
-              ((c >= '0') && (c <= '9'))))
-            break;
-        header++;
-    }
-    *header = '\0';
-    cipher->cipher = enc = cipher_by_name(p);
-    *header = c;
-    header++;
+  if (enc == NULL) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION);
+    return 0;
+  }
+  // The IV parameter must be at least 8 bytes long to be used as the salt in
+  // the KDF. (This should not happen given |cipher_by_name|.)
+  if (EVP_CIPHER_iv_length(enc) < 8) {
+    assert(0);
+    OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION);
+    return 0;
+  }
+  if (!load_iv(header_pp, &(cipher->iv[0]), EVP_CIPHER_iv_length(enc))) {
+    return 0;
+  }
 
-    if (enc == NULL) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION);
-        return (0);
-    }
-    // The IV parameter must be at least 8 bytes long to be used as the salt in
-    // the KDF. (This should not happen given |cipher_by_name|.)
-    if (EVP_CIPHER_iv_length(enc) < 8) {
-        assert(0);
-        OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION);
-        return 0;
-    }
-    if (!load_iv(header_pp, &(cipher->iv[0]), EVP_CIPHER_iv_length(enc)))
-        return (0);
-
-    return (1);
+  return 1;
 }
 
-static int load_iv(char **fromp, unsigned char *to, int num)
-{
-    int v, i;
-    char *from;
+static int load_iv(char **fromp, unsigned char *to, int num) {
+  int v, i;
+  char *from;
 
-    from = *fromp;
-    for (i = 0; i < num; i++)
-        to[i] = 0;
-    num *= 2;
-    for (i = 0; i < num; i++) {
-        if ((*from >= '0') && (*from <= '9'))
-            v = *from - '0';
-        else if ((*from >= 'A') && (*from <= 'F'))
-            v = *from - 'A' + 10;
-        else if ((*from >= 'a') && (*from <= 'f'))
-            v = *from - 'a' + 10;
-        else {
-            OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_IV_CHARS);
-            return (0);
-        }
-        from++;
-        to[i / 2] |= v << (long)((!(i & 1)) * 4);
+  from = *fromp;
+  for (i = 0; i < num; i++) {
+    to[i] = 0;
+  }
+  num *= 2;
+  for (i = 0; i < num; i++) {
+    if ((*from >= '0') && (*from <= '9')) {
+      v = *from - '0';
+    } else if ((*from >= 'A') && (*from <= 'F')) {
+      v = *from - 'A' + 10;
+    } else if ((*from >= 'a') && (*from <= 'f')) {
+      v = *from - 'a' + 10;
+    } else {
+      OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_IV_CHARS);
+      return 0;
     }
+    from++;
+    to[i / 2] |= v << (long)((!(i & 1)) * 4);
+  }
 
-    *fromp = from;
-    return (1);
+  *fromp = from;
+  return 1;
 }
 
 int PEM_write(FILE *fp, const char *name, const char *header,
-              const unsigned char *data, long len)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = PEM_write_bio(b, name, header, data, len);
-    BIO_free(b);
-    return (ret);
+              const unsigned char *data, long len) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = PEM_write_bio(b, name, header, data, len);
+  BIO_free(b);
+  return ret;
 }
 
 int PEM_write_bio(BIO *bp, const char *name, const char *header,
-                  const unsigned char *data, long len)
-{
-    int nlen, n, i, j, outl;
-    unsigned char *buf = NULL;
-    EVP_ENCODE_CTX ctx;
-    int reason = ERR_R_BUF_LIB;
+                  const unsigned char *data, long len) {
+  int nlen, n, i, j, outl;
+  unsigned char *buf = NULL;
+  EVP_ENCODE_CTX ctx;
+  int reason = ERR_R_BUF_LIB;
 
-    EVP_EncodeInit(&ctx);
-    nlen = strlen(name);
+  EVP_EncodeInit(&ctx);
+  nlen = strlen(name);
 
-    if ((BIO_write(bp, "-----BEGIN ", 11) != 11) ||
-        (BIO_write(bp, name, nlen) != nlen) ||
-        (BIO_write(bp, "-----\n", 6) != 6))
-        goto err;
+  if ((BIO_write(bp, "-----BEGIN ", 11) != 11) ||
+      (BIO_write(bp, name, nlen) != nlen) ||
+      (BIO_write(bp, "-----\n", 6) != 6)) {
+    goto err;
+  }
 
-    i = strlen(header);
-    if (i > 0) {
-        if ((BIO_write(bp, header, i) != i) || (BIO_write(bp, "\n", 1) != 1))
-            goto err;
+  i = strlen(header);
+  if (i > 0) {
+    if ((BIO_write(bp, header, i) != i) || (BIO_write(bp, "\n", 1) != 1)) {
+      goto err;
     }
+  }
 
-    buf = OPENSSL_malloc(PEM_BUFSIZE * 8);
-    if (buf == NULL) {
-        reason = ERR_R_MALLOC_FAILURE;
-        goto err;
-    }
+  buf = OPENSSL_malloc(PEM_BUFSIZE * 8);
+  if (buf == NULL) {
+    reason = ERR_R_MALLOC_FAILURE;
+    goto err;
+  }
 
-    i = j = 0;
-    while (len > 0) {
-        n = (int)((len > (PEM_BUFSIZE * 5)) ? (PEM_BUFSIZE * 5) : len);
-        EVP_EncodeUpdate(&ctx, buf, &outl, &(data[j]), n);
-        if ((outl) && (BIO_write(bp, (char *)buf, outl) != outl))
-            goto err;
-        i += outl;
-        len -= n;
-        j += n;
+  i = j = 0;
+  while (len > 0) {
+    n = (int)((len > (PEM_BUFSIZE * 5)) ? (PEM_BUFSIZE * 5) : len);
+    EVP_EncodeUpdate(&ctx, buf, &outl, &(data[j]), n);
+    if ((outl) && (BIO_write(bp, (char *)buf, outl) != outl)) {
+      goto err;
     }
-    EVP_EncodeFinal(&ctx, buf, &outl);
-    if ((outl > 0) && (BIO_write(bp, (char *)buf, outl) != outl))
-        goto err;
+    i += outl;
+    len -= n;
+    j += n;
+  }
+  EVP_EncodeFinal(&ctx, buf, &outl);
+  if ((outl > 0) && (BIO_write(bp, (char *)buf, outl) != outl)) {
+    goto err;
+  }
+  OPENSSL_free(buf);
+  buf = NULL;
+  if ((BIO_write(bp, "-----END ", 9) != 9) ||
+      (BIO_write(bp, name, nlen) != nlen) ||
+      (BIO_write(bp, "-----\n", 6) != 6)) {
+    goto err;
+  }
+  return i + outl;
+err:
+  if (buf) {
     OPENSSL_free(buf);
-    buf = NULL;
-    if ((BIO_write(bp, "-----END ", 9) != 9) ||
-        (BIO_write(bp, name, nlen) != nlen) ||
-        (BIO_write(bp, "-----\n", 6) != 6))
-        goto err;
-    return (i + outl);
- err:
-    if (buf) {
-        OPENSSL_free(buf);
-    }
-    OPENSSL_PUT_ERROR(PEM, reason);
-    return (0);
+  }
+  OPENSSL_PUT_ERROR(PEM, reason);
+  return 0;
 }
 
 int PEM_read(FILE *fp, char **name, char **header, unsigned char **data,
-             long *len)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = PEM_read_bio(b, name, header, data, len);
-    BIO_free(b);
-    return (ret);
+             long *len) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = PEM_read_bio(b, name, header, data, len);
+  BIO_free(b);
+  return ret;
 }
 
 int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data,
-                 long *len)
-{
-    EVP_ENCODE_CTX ctx;
-    int end = 0, i, k, bl = 0, hl = 0, nohead = 0;
-    char buf[256];
-    BUF_MEM *nameB;
-    BUF_MEM *headerB;
-    BUF_MEM *dataB, *tmpB;
+                 long *len) {
+  EVP_ENCODE_CTX ctx;
+  int end = 0, i, k, bl = 0, hl = 0, nohead = 0;
+  char buf[256];
+  BUF_MEM *nameB;
+  BUF_MEM *headerB;
+  BUF_MEM *dataB, *tmpB;
 
-    nameB = BUF_MEM_new();
-    headerB = BUF_MEM_new();
-    dataB = BUF_MEM_new();
-    if ((nameB == NULL) || (headerB == NULL) || (dataB == NULL)) {
-        BUF_MEM_free(nameB);
-        BUF_MEM_free(headerB);
-        BUF_MEM_free(dataB);
-        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-        return (0);
-    }
-
-    buf[254] = '\0';
-    for (;;) {
-        i = BIO_gets(bp, buf, 254);
-
-        if (i <= 0) {
-            OPENSSL_PUT_ERROR(PEM, PEM_R_NO_START_LINE);
-            goto err;
-        }
-
-        while ((i >= 0) && (buf[i] <= ' '))
-            i--;
-        buf[++i] = '\n';
-        buf[++i] = '\0';
-
-        if (strncmp(buf, "-----BEGIN ", 11) == 0) {
-            i = strlen(&(buf[11]));
-
-            if (strncmp(&(buf[11 + i - 6]), "-----\n", 6) != 0)
-                continue;
-            if (!BUF_MEM_grow(nameB, i + 9)) {
-                OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-                goto err;
-            }
-            OPENSSL_memcpy(nameB->data, &(buf[11]), i - 6);
-            nameB->data[i - 6] = '\0';
-            break;
-        }
-    }
-    hl = 0;
-    if (!BUF_MEM_grow(headerB, 256)) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    headerB->data[0] = '\0';
-    for (;;) {
-        i = BIO_gets(bp, buf, 254);
-        if (i <= 0)
-            break;
-
-        while ((i >= 0) && (buf[i] <= ' '))
-            i--;
-        buf[++i] = '\n';
-        buf[++i] = '\0';
-
-        if (buf[0] == '\n')
-            break;
-        if (!BUF_MEM_grow(headerB, hl + i + 9)) {
-            OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        if (strncmp(buf, "-----END ", 9) == 0) {
-            nohead = 1;
-            break;
-        }
-        OPENSSL_memcpy(&(headerB->data[hl]), buf, i);
-        headerB->data[hl + i] = '\0';
-        hl += i;
-    }
-
-    bl = 0;
-    if (!BUF_MEM_grow(dataB, 1024)) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    dataB->data[0] = '\0';
-    if (!nohead) {
-        for (;;) {
-            i = BIO_gets(bp, buf, 254);
-            if (i <= 0)
-                break;
-
-            while ((i >= 0) && (buf[i] <= ' '))
-                i--;
-            buf[++i] = '\n';
-            buf[++i] = '\0';
-
-            if (i != 65)
-                end = 1;
-            if (strncmp(buf, "-----END ", 9) == 0)
-                break;
-            if (i > 65)
-                break;
-            if (!BUF_MEM_grow_clean(dataB, i + bl + 9)) {
-                OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-                goto err;
-            }
-            OPENSSL_memcpy(&(dataB->data[bl]), buf, i);
-            dataB->data[bl + i] = '\0';
-            bl += i;
-            if (end) {
-                buf[0] = '\0';
-                i = BIO_gets(bp, buf, 254);
-                if (i <= 0)
-                    break;
-
-                while ((i >= 0) && (buf[i] <= ' '))
-                    i--;
-                buf[++i] = '\n';
-                buf[++i] = '\0';
-
-                break;
-            }
-        }
-    } else {
-        tmpB = headerB;
-        headerB = dataB;
-        dataB = tmpB;
-        bl = hl;
-    }
-    i = strlen(nameB->data);
-    if ((strncmp(buf, "-----END ", 9) != 0) ||
-        (strncmp(nameB->data, &(buf[9]), i) != 0) ||
-        (strncmp(&(buf[9 + i]), "-----\n", 6) != 0)) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_END_LINE);
-        goto err;
-    }
-
-    EVP_DecodeInit(&ctx);
-    i = EVP_DecodeUpdate(&ctx,
-                         (unsigned char *)dataB->data, &bl,
-                         (unsigned char *)dataB->data, bl);
-    if (i < 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_BASE64_DECODE);
-        goto err;
-    }
-    i = EVP_DecodeFinal(&ctx, (unsigned char *)&(dataB->data[bl]), &k);
-    if (i < 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_BASE64_DECODE);
-        goto err;
-    }
-    bl += k;
-
-    if (bl == 0)
-        goto err;
-    *name = nameB->data;
-    *header = headerB->data;
-    *data = (unsigned char *)dataB->data;
-    *len = bl;
-    OPENSSL_free(nameB);
-    OPENSSL_free(headerB);
-    OPENSSL_free(dataB);
-    return (1);
- err:
+  nameB = BUF_MEM_new();
+  headerB = BUF_MEM_new();
+  dataB = BUF_MEM_new();
+  if ((nameB == NULL) || (headerB == NULL) || (dataB == NULL)) {
     BUF_MEM_free(nameB);
     BUF_MEM_free(headerB);
     BUF_MEM_free(dataB);
-    return (0);
+    OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  buf[254] = '\0';
+  for (;;) {
+    i = BIO_gets(bp, buf, 254);
+
+    if (i <= 0) {
+      OPENSSL_PUT_ERROR(PEM, PEM_R_NO_START_LINE);
+      goto err;
+    }
+
+    while ((i >= 0) && (buf[i] <= ' ')) {
+      i--;
+    }
+    buf[++i] = '\n';
+    buf[++i] = '\0';
+
+    if (strncmp(buf, "-----BEGIN ", 11) == 0) {
+      i = strlen(&(buf[11]));
+
+      if (strncmp(&(buf[11 + i - 6]), "-----\n", 6) != 0) {
+        continue;
+      }
+      if (!BUF_MEM_grow(nameB, i + 9)) {
+        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+        goto err;
+      }
+      OPENSSL_memcpy(nameB->data, &(buf[11]), i - 6);
+      nameB->data[i - 6] = '\0';
+      break;
+    }
+  }
+  hl = 0;
+  if (!BUF_MEM_grow(headerB, 256)) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  headerB->data[0] = '\0';
+  for (;;) {
+    i = BIO_gets(bp, buf, 254);
+    if (i <= 0) {
+      break;
+    }
+
+    while ((i >= 0) && (buf[i] <= ' ')) {
+      i--;
+    }
+    buf[++i] = '\n';
+    buf[++i] = '\0';
+
+    if (buf[0] == '\n') {
+      break;
+    }
+    if (!BUF_MEM_grow(headerB, hl + i + 9)) {
+      OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    if (strncmp(buf, "-----END ", 9) == 0) {
+      nohead = 1;
+      break;
+    }
+    OPENSSL_memcpy(&(headerB->data[hl]), buf, i);
+    headerB->data[hl + i] = '\0';
+    hl += i;
+  }
+
+  bl = 0;
+  if (!BUF_MEM_grow(dataB, 1024)) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  dataB->data[0] = '\0';
+  if (!nohead) {
+    for (;;) {
+      i = BIO_gets(bp, buf, 254);
+      if (i <= 0) {
+        break;
+      }
+
+      while ((i >= 0) && (buf[i] <= ' ')) {
+        i--;
+      }
+      buf[++i] = '\n';
+      buf[++i] = '\0';
+
+      if (i != 65) {
+        end = 1;
+      }
+      if (strncmp(buf, "-----END ", 9) == 0) {
+        break;
+      }
+      if (i > 65) {
+        break;
+      }
+      if (!BUF_MEM_grow_clean(dataB, i + bl + 9)) {
+        OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
+        goto err;
+      }
+      OPENSSL_memcpy(&(dataB->data[bl]), buf, i);
+      dataB->data[bl + i] = '\0';
+      bl += i;
+      if (end) {
+        buf[0] = '\0';
+        i = BIO_gets(bp, buf, 254);
+        if (i <= 0) {
+          break;
+        }
+
+        while ((i >= 0) && (buf[i] <= ' ')) {
+          i--;
+        }
+        buf[++i] = '\n';
+        buf[++i] = '\0';
+
+        break;
+      }
+    }
+  } else {
+    tmpB = headerB;
+    headerB = dataB;
+    dataB = tmpB;
+    bl = hl;
+  }
+  i = strlen(nameB->data);
+  if ((strncmp(buf, "-----END ", 9) != 0) ||
+      (strncmp(nameB->data, &(buf[9]), i) != 0) ||
+      (strncmp(&(buf[9 + i]), "-----\n", 6) != 0)) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_END_LINE);
+    goto err;
+  }
+
+  EVP_DecodeInit(&ctx);
+  i = EVP_DecodeUpdate(&ctx, (unsigned char *)dataB->data, &bl,
+                       (unsigned char *)dataB->data, bl);
+  if (i < 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_BASE64_DECODE);
+    goto err;
+  }
+  i = EVP_DecodeFinal(&ctx, (unsigned char *)&(dataB->data[bl]), &k);
+  if (i < 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_BASE64_DECODE);
+    goto err;
+  }
+  bl += k;
+
+  if (bl == 0) {
+    goto err;
+  }
+  *name = nameB->data;
+  *header = headerB->data;
+  *data = (unsigned char *)dataB->data;
+  *len = bl;
+  OPENSSL_free(nameB);
+  OPENSSL_free(headerB);
+  OPENSSL_free(dataB);
+  return 1;
+err:
+  BUF_MEM_free(nameB);
+  BUF_MEM_free(headerB);
+  BUF_MEM_free(dataB);
+  return 0;
 }
 
-int PEM_def_callback(char *buf, int size, int rwflag, void *userdata)
-{
-    if (!buf || !userdata || size < 0) {
-        return 0;
-    }
-    size_t len = strlen((char *)userdata);
-    if (len >= (size_t)size) {
-        return 0;
-    }
-    OPENSSL_strlcpy(buf, userdata, (size_t)size);
-    return len;
+int PEM_def_callback(char *buf, int size, int rwflag, void *userdata) {
+  if (!buf || !userdata || size < 0) {
+    return 0;
+  }
+  size_t len = strlen((char *)userdata);
+  if (len >= (size_t)size) {
+    return 0;
+  }
+  OPENSSL_strlcpy(buf, userdata, (size_t)size);
+  return len;
 }
diff --git a/src/crypto/pem/pem_oth.c b/src/crypto/pem/pem_oth.c
index 797f822..8ea05be 100644
--- a/src/crypto/pem/pem_oth.c
+++ b/src/crypto/pem/pem_oth.c
@@ -60,28 +60,29 @@
 #include <stdio.h>
 
 #include <openssl/err.h>
-#include <openssl/mem.h>
 #include <openssl/evp.h>
+#include <openssl/mem.h>
 #include <openssl/obj.h>
 #include <openssl/rand.h>
 #include <openssl/x509.h>
 
-/* Handle 'other' PEMs: not private keys */
+// Handle 'other' PEMs: not private keys
 
 void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x,
-                        pem_password_cb *cb, void *u)
-{
-    const unsigned char *p = NULL;
-    unsigned char *data = NULL;
-    long len;
-    char *ret = NULL;
+                        pem_password_cb *cb, void *u) {
+  const unsigned char *p = NULL;
+  unsigned char *data = NULL;
+  long len;
+  char *ret = NULL;
 
-    if (!PEM_bytes_read_bio(&data, &len, NULL, name, bp, cb, u))
-        return NULL;
-    p = data;
-    ret = d2i(x, &p, len);
-    if (ret == NULL)
-        OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
-    OPENSSL_free(data);
-    return ret;
+  if (!PEM_bytes_read_bio(&data, &len, NULL, name, bp, cb, u)) {
+    return NULL;
+  }
+  p = data;
+  ret = d2i(x, &p, len);
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
+  }
+  OPENSSL_free(data);
+  return ret;
 }
diff --git a/src/crypto/pem/pem_pk8.c b/src/crypto/pem/pem_pk8.c
index 8a1f040..85196fa 100644
--- a/src/crypto/pem/pem_pk8.c
+++ b/src/crypto/pem/pem_pk8.c
@@ -64,187 +64,178 @@
 #include <openssl/rand.h>
 #include <openssl/x509.h>
 
-static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder,
-                      int nid, const EVP_CIPHER *enc,
-                      char *kstr, int klen, pem_password_cb *cb, void *u);
-static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder,
-                         int nid, const EVP_CIPHER *enc,
-                         char *kstr, int klen, pem_password_cb *cb, void *u);
+static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid,
+                      const EVP_CIPHER *enc, char *kstr, int klen,
+                      pem_password_cb *cb, void *u);
+static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder, int nid,
+                         const EVP_CIPHER *enc, char *kstr, int klen,
+                         pem_password_cb *cb, void *u);
 
-/*
- * These functions write a private key in PKCS#8 format: it is a "drop in"
- * replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'
- * is NULL then it uses the unencrypted private key form. The 'nid' versions
- * uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.
- */
+// These functions write a private key in PKCS#8 format: it is a "drop in"
+// replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'
+// is NULL then it uses the unencrypted private key form. The 'nid' versions
+// uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.
 
-int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,
-                                      char *kstr, int klen,
-                                      pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey(bp, x, 0, nid, NULL, kstr, klen, cb, u);
+int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr,
+                                      int klen, pem_password_cb *cb, void *u) {
+  return do_pk8pkey(bp, x, 0, nid, NULL, kstr, klen, cb, u);
 }
 
 int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
-                                  char *kstr, int klen,
-                                  pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u);
+                                  char *kstr, int klen, pem_password_cb *cb,
+                                  void *u) {
+  return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u);
 }
 
 int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
-                            char *kstr, int klen,
-                            pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u);
+                            char *kstr, int klen, pem_password_cb *cb,
+                            void *u) {
+  return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u);
 }
 
-int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid,
-                                char *kstr, int klen,
-                                pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey(bp, x, 1, nid, NULL, kstr, klen, cb, u);
+int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, char *kstr,
+                                int klen, pem_password_cb *cb, void *u) {
+  return do_pk8pkey(bp, x, 1, nid, NULL, kstr, klen, cb, u);
 }
 
 static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid,
                       const EVP_CIPHER *enc, char *kstr, int klen,
-                      pem_password_cb *cb, void *u)
-{
-    X509_SIG *p8;
-    PKCS8_PRIV_KEY_INFO *p8inf;
-    char buf[PEM_BUFSIZE];
-    int ret;
-    if (!(p8inf = EVP_PKEY2PKCS8(x))) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_ERROR_CONVERTING_PRIVATE_KEY);
+                      pem_password_cb *cb, void *u) {
+  X509_SIG *p8;
+  PKCS8_PRIV_KEY_INFO *p8inf;
+  char buf[PEM_BUFSIZE];
+  int ret;
+  if (!(p8inf = EVP_PKEY2PKCS8(x))) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_ERROR_CONVERTING_PRIVATE_KEY);
+    return 0;
+  }
+  if (enc || (nid != -1)) {
+    if (!kstr) {
+      klen = 0;
+      if (!cb) {
+        cb = PEM_def_callback;
+      }
+      klen = cb(buf, PEM_BUFSIZE, 1, u);
+      if (klen <= 0) {
+        OPENSSL_PUT_ERROR(PEM, PEM_R_READ_KEY);
+        PKCS8_PRIV_KEY_INFO_free(p8inf);
         return 0;
-    }
-    if (enc || (nid != -1)) {
-        if (!kstr) {
-            klen = 0;
-            if (!cb)
-                cb = PEM_def_callback;
-            klen = cb(buf, PEM_BUFSIZE, 1, u);
-            if (klen <= 0) {
-                OPENSSL_PUT_ERROR(PEM, PEM_R_READ_KEY);
-                PKCS8_PRIV_KEY_INFO_free(p8inf);
-                return 0;
-            }
+      }
 
-            kstr = buf;
-        }
-        p8 = PKCS8_encrypt(nid, enc, kstr, klen, NULL, 0, 0, p8inf);
-        if (kstr == buf)
-            OPENSSL_cleanse(buf, klen);
-        PKCS8_PRIV_KEY_INFO_free(p8inf);
-        if (isder)
-            ret = i2d_PKCS8_bio(bp, p8);
-        else
-            ret = PEM_write_bio_PKCS8(bp, p8);
-        X509_SIG_free(p8);
-        return ret;
-    } else {
-        if (isder)
-            ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
-        else
-            ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(bp, p8inf);
-        PKCS8_PRIV_KEY_INFO_free(p8inf);
-        return ret;
+      kstr = buf;
     }
+    p8 = PKCS8_encrypt(nid, enc, kstr, klen, NULL, 0, 0, p8inf);
+    if (kstr == buf) {
+      OPENSSL_cleanse(buf, klen);
+    }
+    PKCS8_PRIV_KEY_INFO_free(p8inf);
+    if (isder) {
+      ret = i2d_PKCS8_bio(bp, p8);
+    } else {
+      ret = PEM_write_bio_PKCS8(bp, p8);
+    }
+    X509_SIG_free(p8);
+    return ret;
+  } else {
+    if (isder) {
+      ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
+    } else {
+      ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(bp, p8inf);
+    }
+    PKCS8_PRIV_KEY_INFO_free(p8inf);
+    return ret;
+  }
 }
 
 EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb,
-                                  void *u)
-{
-    PKCS8_PRIV_KEY_INFO *p8inf = NULL;
-    X509_SIG *p8 = NULL;
-    int klen;
-    EVP_PKEY *ret;
-    char psbuf[PEM_BUFSIZE];
-    p8 = d2i_PKCS8_bio(bp, NULL);
-    if (!p8)
-        return NULL;
+                                  void *u) {
+  PKCS8_PRIV_KEY_INFO *p8inf = NULL;
+  X509_SIG *p8 = NULL;
+  int klen;
+  EVP_PKEY *ret;
+  char psbuf[PEM_BUFSIZE];
+  p8 = d2i_PKCS8_bio(bp, NULL);
+  if (!p8) {
+    return NULL;
+  }
 
-    klen = 0;
-    if (!cb)
-        cb = PEM_def_callback;
-    klen = cb(psbuf, PEM_BUFSIZE, 0, u);
-    if (klen <= 0) {
-        OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
-        X509_SIG_free(p8);
-        return NULL;
-    }
-    p8inf = PKCS8_decrypt(p8, psbuf, klen);
+  klen = 0;
+  if (!cb) {
+    cb = PEM_def_callback;
+  }
+  klen = cb(psbuf, PEM_BUFSIZE, 0, u);
+  if (klen <= 0) {
+    OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
     X509_SIG_free(p8);
-    OPENSSL_cleanse(psbuf, klen);
-    if (!p8inf)
-        return NULL;
-    ret = EVP_PKCS82PKEY(p8inf);
-    PKCS8_PRIV_KEY_INFO_free(p8inf);
-    if (!ret)
-        return NULL;
-    if (x) {
-        if (*x)
-            EVP_PKEY_free(*x);
-        *x = ret;
+    return NULL;
+  }
+  p8inf = PKCS8_decrypt(p8, psbuf, klen);
+  X509_SIG_free(p8);
+  OPENSSL_cleanse(psbuf, klen);
+  if (!p8inf) {
+    return NULL;
+  }
+  ret = EVP_PKCS82PKEY(p8inf);
+  PKCS8_PRIV_KEY_INFO_free(p8inf);
+  if (!ret) {
+    return NULL;
+  }
+  if (x) {
+    if (*x) {
+      EVP_PKEY_free(*x);
     }
-    return ret;
+    *x = ret;
+  }
+  return ret;
 }
 
 
 int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
-                           char *kstr, int klen, pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u);
+                           char *kstr, int klen, pem_password_cb *cb, void *u) {
+  return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u);
 }
 
-int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid,
-                               char *kstr, int klen,
-                               pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey_fp(fp, x, 1, nid, NULL, kstr, klen, cb, u);
+int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, char *kstr,
+                               int klen, pem_password_cb *cb, void *u) {
+  return do_pk8pkey_fp(fp, x, 1, nid, NULL, kstr, klen, cb, u);
 }
 
-int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,
-                                  char *kstr, int klen,
-                                  pem_password_cb *cb, void *u)
-{
-    return do_pk8pkey_fp(fp, x, 0, nid, NULL, kstr, klen, cb, u);
+int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, char *kstr,
+                                  int klen, pem_password_cb *cb, void *u) {
+  return do_pk8pkey_fp(fp, x, 0, nid, NULL, kstr, klen, cb, u);
 }
 
 int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
                               char *kstr, int klen, pem_password_cb *cb,
-                              void *u)
-{
-    return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u);
+                              void *u) {
+  return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u);
 }
 
 static int do_pk8pkey_fp(FILE *fp, EVP_PKEY *x, int isder, int nid,
                          const EVP_CIPHER *enc, char *kstr, int klen,
-                         pem_password_cb *cb, void *u)
-{
-    BIO *bp;
-    int ret;
-    if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return (0);
-    }
-    ret = do_pk8pkey(bp, x, isder, nid, enc, kstr, klen, cb, u);
-    BIO_free(bp);
-    return ret;
+                         pem_password_cb *cb, void *u) {
+  BIO *bp;
+  int ret;
+  if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  ret = do_pk8pkey(bp, x, isder, nid, enc, kstr, klen, cb, u);
+  BIO_free(bp);
+  return ret;
 }
 
 EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb,
-                                 void *u)
-{
-    BIO *bp;
-    EVP_PKEY *ret;
-    if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return NULL;
-    }
-    ret = d2i_PKCS8PrivateKey_bio(bp, x, cb, u);
-    BIO_free(bp);
-    return ret;
+                                 void *u) {
+  BIO *bp;
+  EVP_PKEY *ret;
+  if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return NULL;
+  }
+  ret = d2i_PKCS8PrivateKey_bio(bp, x, cb, u);
+  BIO_free(bp);
+  return ret;
 }
 
 
@@ -252,4 +243,4 @@
 
 
 IMPLEMENT_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF,
-             PKCS8_PRIV_KEY_INFO)
+                 PKCS8_PRIV_KEY_INFO)
diff --git a/src/crypto/pem/pem_pkey.c b/src/crypto/pem/pem_pkey.c
index 48d8c96..2d28d6c 100644
--- a/src/crypto/pem/pem_pkey.c
+++ b/src/crypto/pem/pem_pkey.c
@@ -69,146 +69,114 @@
 #include <openssl/x509.h>
 
 EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb,
-                                  void *u)
-{
-    char *nm = NULL;
-    const unsigned char *p = NULL;
-    unsigned char *data = NULL;
-    long len;
-    EVP_PKEY *ret = NULL;
+                                  void *u) {
+  char *nm = NULL;
+  const unsigned char *p = NULL;
+  unsigned char *data = NULL;
+  long len;
+  EVP_PKEY *ret = NULL;
 
-    if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u))
-        return NULL;
-    p = data;
+  if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u)) {
+    return NULL;
+  }
+  p = data;
 
-    if (strcmp(nm, PEM_STRING_PKCS8INF) == 0) {
-        PKCS8_PRIV_KEY_INFO *p8inf;
-        p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len);
-        if (!p8inf)
-            goto p8err;
-        ret = EVP_PKCS82PKEY(p8inf);
-        if (x) {
-            if (*x)
-                EVP_PKEY_free((EVP_PKEY *)*x);
-            *x = ret;
-        }
-        PKCS8_PRIV_KEY_INFO_free(p8inf);
-    } else if (strcmp(nm, PEM_STRING_PKCS8) == 0) {
-        PKCS8_PRIV_KEY_INFO *p8inf;
-        X509_SIG *p8;
-        int klen;
-        char psbuf[PEM_BUFSIZE];
-        p8 = d2i_X509_SIG(NULL, &p, len);
-        if (!p8)
-            goto p8err;
-
-        klen = 0;
-        if (!cb)
-            cb = PEM_def_callback;
-        klen = cb(psbuf, PEM_BUFSIZE, 0, u);
-        if (klen <= 0) {
-            OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
-            X509_SIG_free(p8);
-            goto err;
-        }
-        p8inf = PKCS8_decrypt(p8, psbuf, klen);
-        X509_SIG_free(p8);
-        OPENSSL_cleanse(psbuf, klen);
-        if (!p8inf)
-            goto p8err;
-        ret = EVP_PKCS82PKEY(p8inf);
-        if (x) {
-            if (*x)
-                EVP_PKEY_free((EVP_PKEY *)*x);
-            *x = ret;
-        }
-        PKCS8_PRIV_KEY_INFO_free(p8inf);
-    } else if (strcmp(nm, PEM_STRING_RSA) == 0) {
-        /* TODO(davidben): d2i_PrivateKey parses PKCS#8 along with the
-         * standalone format. This and the cases below probably should not
-         * accept PKCS#8. */
-        ret = d2i_PrivateKey(EVP_PKEY_RSA, x, &p, len);
-    } else if (strcmp(nm, PEM_STRING_EC) == 0) {
-        ret = d2i_PrivateKey(EVP_PKEY_EC, x, &p, len);
-    } else if (strcmp(nm, PEM_STRING_DSA) == 0) {
-        ret = d2i_PrivateKey(EVP_PKEY_DSA, x, &p, len);
+  if (strcmp(nm, PEM_STRING_PKCS8INF) == 0) {
+    PKCS8_PRIV_KEY_INFO *p8inf;
+    p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len);
+    if (!p8inf) {
+      goto p8err;
     }
- p8err:
-    if (ret == NULL)
-        OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
+    ret = EVP_PKCS82PKEY(p8inf);
+    if (x) {
+      if (*x) {
+        EVP_PKEY_free((EVP_PKEY *)*x);
+      }
+      *x = ret;
+    }
+    PKCS8_PRIV_KEY_INFO_free(p8inf);
+  } else if (strcmp(nm, PEM_STRING_PKCS8) == 0) {
+    PKCS8_PRIV_KEY_INFO *p8inf;
+    X509_SIG *p8;
+    int klen;
+    char psbuf[PEM_BUFSIZE];
+    p8 = d2i_X509_SIG(NULL, &p, len);
+    if (!p8) {
+      goto p8err;
+    }
 
- err:
-    OPENSSL_free(nm);
-    OPENSSL_free(data);
-    return (ret);
+    klen = 0;
+    if (!cb) {
+      cb = PEM_def_callback;
+    }
+    klen = cb(psbuf, PEM_BUFSIZE, 0, u);
+    if (klen <= 0) {
+      OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
+      X509_SIG_free(p8);
+      goto err;
+    }
+    p8inf = PKCS8_decrypt(p8, psbuf, klen);
+    X509_SIG_free(p8);
+    OPENSSL_cleanse(psbuf, klen);
+    if (!p8inf) {
+      goto p8err;
+    }
+    ret = EVP_PKCS82PKEY(p8inf);
+    if (x) {
+      if (*x) {
+        EVP_PKEY_free((EVP_PKEY *)*x);
+      }
+      *x = ret;
+    }
+    PKCS8_PRIV_KEY_INFO_free(p8inf);
+  } else if (strcmp(nm, PEM_STRING_RSA) == 0) {
+    // TODO(davidben): d2i_PrivateKey parses PKCS#8 along with the
+    // standalone format. This and the cases below probably should not
+    // accept PKCS#8.
+    ret = d2i_PrivateKey(EVP_PKEY_RSA, x, &p, len);
+  } else if (strcmp(nm, PEM_STRING_EC) == 0) {
+    ret = d2i_PrivateKey(EVP_PKEY_EC, x, &p, len);
+  } else if (strcmp(nm, PEM_STRING_DSA) == 0) {
+    ret = d2i_PrivateKey(EVP_PKEY_DSA, x, &p, len);
+  }
+p8err:
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
+  }
+
+err:
+  OPENSSL_free(nm);
+  OPENSSL_free(data);
+  return ret;
 }
 
 int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
-                             unsigned char *kstr, int klen,
-                             pem_password_cb *cb, void *u)
-{
-    return PEM_write_bio_PKCS8PrivateKey(bp, x, enc, (char *)kstr, klen, cb, u);
+                             unsigned char *kstr, int klen, pem_password_cb *cb,
+                             void *u) {
+  return PEM_write_bio_PKCS8PrivateKey(bp, x, enc, (char *)kstr, klen, cb, u);
 }
 
 EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb,
-                              void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return NULL;
-    }
-    EVP_PKEY *ret = PEM_read_bio_PrivateKey(b, x, cb, u);
-    BIO_free(b);
-    return ret;
+                              void *u) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return NULL;
+  }
+  EVP_PKEY *ret = PEM_read_bio_PrivateKey(b, x, cb, u);
+  BIO_free(b);
+  return ret;
 }
 
 int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
-                         unsigned char *kstr, int klen,
-                         pem_password_cb *cb, void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = PEM_write_bio_PrivateKey(b, x, enc, kstr, klen, cb, u);
-    BIO_free(b);
-    return ret;
-}
-
-
-/* Transparently read in PKCS#3 or X9.42 DH parameters */
-
-DH *PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u)
-{
-    char *nm = NULL;
-    const unsigned char *p = NULL;
-    unsigned char *data = NULL;
-    long len;
-    DH *ret = NULL;
-
-    if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_DHPARAMS, bp, cb, u))
-        return NULL;
-    p = data;
-
-    ret = d2i_DHparams(x, &p, len);
-
-    if (ret == NULL)
-        OPENSSL_PUT_ERROR(PEM, ERR_R_ASN1_LIB);
-    OPENSSL_free(nm);
-    OPENSSL_free(data);
-    return ret;
-}
-
-DH *PEM_read_DHparams(FILE *fp, DH **x, pem_password_cb *cb, void *u)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-        return NULL;
-    }
-    DH *ret = PEM_read_bio_DHparams(b, x, cb, u);
-    BIO_free(b);
-    return ret;
+                         unsigned char *kstr, int klen, pem_password_cb *cb,
+                         void *u) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = PEM_write_bio_PrivateKey(b, x, enc, kstr, klen, cb, u);
+  BIO_free(b);
+  return ret;
 }
diff --git a/src/crypto/pkcs8/pkcs12_test.cc b/src/crypto/pkcs8/pkcs12_test.cc
index e67630d..79ebae3 100644
--- a/src/crypto/pkcs8/pkcs12_test.cc
+++ b/src/crypto/pkcs8/pkcs12_test.cc
@@ -34,7 +34,7 @@
 static const char kPassword[] = "foo";
 
 // kUnicodePassword is the password for unicode_password.p12
-static const char kUnicodePassword[] = u8"Hello, 世界";
+static const char kUnicodePassword[] = "Hello, 世界";
 
 static bssl::Span<const uint8_t> StringToBytes(const std::string &str) {
   return bssl::MakeConstSpan(reinterpret_cast<const uint8_t *>(str.data()),
@@ -391,7 +391,7 @@
                 {bssl::Span<const uint8_t>(kTestCert2)}, 0, 0, 0, 0);
 
   // Test some Unicode.
-  TestRoundTrip(kPassword, u8"Hello, 世界!",
+  TestRoundTrip(kPassword, "Hello, 世界!",
                 bssl::Span<const uint8_t>(kTestKey),
                 bssl::Span<const uint8_t>(kTestCert),
                 {bssl::Span<const uint8_t>(kTestCert2)}, 0, 0, 0, 0);
@@ -599,3 +599,45 @@
   ASSERT_TRUE(PKCS12CreateVector(&p12, key1.get(), {cert2.get(), cert3.get()}));
   ExpectPKCS12Parse(p12, key1.get(), nullptr, {cert2.get(), cert3.get()});
 }
+
+TEST(PKCS12Test, CreateWithAlias) {
+  bssl::UniquePtr<EVP_PKEY> key = MakeTestKey();
+  ASSERT_TRUE(key);
+  bssl::UniquePtr<X509> cert1 = MakeTestCert(key.get());
+  ASSERT_TRUE(cert1);
+  bssl::UniquePtr<X509> cert2 = MakeTestCert(key.get());
+  ASSERT_TRUE(cert2);
+
+  std::string alias = "I'm an alias";
+  int res = X509_alias_set1(
+      cert1.get(), reinterpret_cast<const unsigned char *>(alias.data()),
+      alias.size());
+  ASSERT_EQ(res, 1);
+
+  std::vector<X509 *> certs = {cert1.get(), cert2.get()};
+  std::vector<uint8_t> der;
+  ASSERT_TRUE(PKCS12CreateVector(&der, key.get(), certs));
+
+  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(der.data(), der.size()));
+  ASSERT_TRUE(bio);
+  bssl::UniquePtr<PKCS12> p12(d2i_PKCS12_bio(bio.get(), nullptr));
+  ASSERT_TRUE(p12);
+
+  EVP_PKEY *parsed_key = nullptr;
+  X509 *parsed_cert = nullptr;
+  STACK_OF(X509) *ca_certs = nullptr;
+  ASSERT_TRUE(
+      PKCS12_parse(p12.get(), kPassword, &parsed_key, &parsed_cert, &ca_certs));
+
+  bssl::UniquePtr<EVP_PKEY> delete_key(parsed_key);
+  bssl::UniquePtr<X509> delete_cert(parsed_cert);
+  bssl::UniquePtr<STACK_OF(X509)> delete_ca_certs(ca_certs);
+  ASSERT_EQ(sk_X509_num(ca_certs), 1UL);
+
+  int alias_len = 0;
+  const unsigned char *parsed_alias =
+      X509_alias_get0(sk_X509_value(ca_certs, 0), &alias_len);
+  ASSERT_TRUE(parsed_alias);
+  ASSERT_EQ(alias, std::string(reinterpret_cast<const char *>(parsed_alias),
+                               static_cast<size_t>(alias_len)));
+}
diff --git a/src/crypto/pkcs8/pkcs8_x509.c b/src/crypto/pkcs8/pkcs8_x509.c
index e2a02e8..f7b37e9 100644
--- a/src/crypto/pkcs8/pkcs8_x509.c
+++ b/src/crypto/pkcs8/pkcs8_x509.c
@@ -90,62 +90,16 @@
   return 0 < iterations && iterations <= kIterationsLimit;
 }
 
-// Minor tweak to operation: zero private key data
-static int pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                   void *exarg) {
-  // Since the structure must still be valid use ASN1_OP_FREE_PRE
-  if (operation == ASN1_OP_FREE_PRE) {
-    PKCS8_PRIV_KEY_INFO *key = (PKCS8_PRIV_KEY_INFO *)*pval;
-    if (key->pkey) {
-      OPENSSL_cleanse(key->pkey->data, key->pkey->length);
-    }
-  }
-  return 1;
-}
+ASN1_SEQUENCE(PKCS8_PRIV_KEY_INFO) = {
+    ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, version, ASN1_INTEGER),
+    ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkeyalg, X509_ALGOR),
+    ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkey, ASN1_OCTET_STRING),
+    ASN1_IMP_SET_OF_OPT(PKCS8_PRIV_KEY_INFO, attributes, X509_ATTRIBUTE, 0),
+} ASN1_SEQUENCE_END(PKCS8_PRIV_KEY_INFO)
 
-ASN1_SEQUENCE_cb(PKCS8_PRIV_KEY_INFO, pkey_cb) = {
-  ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, version, ASN1_INTEGER),
-  ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkeyalg, X509_ALGOR),
-  ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkey, ASN1_OCTET_STRING),
-  ASN1_IMP_SET_OF_OPT(PKCS8_PRIV_KEY_INFO, attributes, X509_ATTRIBUTE, 0)
-} ASN1_SEQUENCE_END_cb(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO)
+IMPLEMENT_ASN1_FUNCTIONS_const(PKCS8_PRIV_KEY_INFO)
 
-IMPLEMENT_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)
-
-int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, int version,
-                    int ptype, void *pval, uint8_t *penc, int penclen) {
-  if (version >= 0 &&
-      !ASN1_INTEGER_set(priv->version, version)) {
-    return 0;
-  }
-
-  if (!X509_ALGOR_set0(priv->pkeyalg, aobj, ptype, pval)) {
-    return 0;
-  }
-
-  if (penc != NULL) {
-    ASN1_STRING_set0(priv->pkey, penc, penclen);
-  }
-
-  return 1;
-}
-
-int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, const uint8_t **pk, int *ppklen,
-                    X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8) {
-  if (ppkalg) {
-    *ppkalg = p8->pkeyalg->algorithm;
-  }
-  if (pk) {
-    *pk = ASN1_STRING_data(p8->pkey);
-    *ppklen = ASN1_STRING_length(p8->pkey);
-  }
-  if (pa) {
-    *pa = p8->pkeyalg;
-  }
-  return 1;
-}
-
-EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8) {
+EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8) {
   uint8_t *der = NULL;
   int der_len = i2d_PKCS8_PRIV_KEY_INFO(p8, &der);
   if (der_len < 0) {
@@ -166,7 +120,7 @@
   return ret;
 }
 
-PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey) {
+PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey) {
   CBB cbb;
   uint8_t *der = NULL;
   size_t der_len;
@@ -993,8 +947,8 @@
 
 // add_bag_attributes adds the bagAttributes field of a SafeBag structure,
 // containing the specified friendlyName and localKeyId attributes.
-static int add_bag_attributes(CBB *bag, const char *name, const uint8_t *key_id,
-                              size_t key_id_len) {
+static int add_bag_attributes(CBB *bag, const char *name, size_t name_len,
+                              const uint8_t *key_id, size_t key_id_len) {
   if (name == NULL && key_id_len == 0) {
     return 1;  // Omit the OPTIONAL SET.
   }
@@ -1003,7 +957,7 @@
   if (!CBB_add_asn1(bag, &attrs, CBS_ASN1_SET)) {
     return 0;
   }
-  if (name != NULL) {
+  if (name_len != 0) {
     // See https://tools.ietf.org/html/rfc2985, section 5.5.1.
     if (!CBB_add_asn1(&attrs, &attr, CBS_ASN1_SEQUENCE) ||
         !CBB_add_asn1(&attr, &oid, CBS_ASN1_OBJECT) ||
@@ -1014,7 +968,7 @@
     }
     // Convert the friendly name to a BMPString.
     CBS name_cbs;
-    CBS_init(&name_cbs, (const uint8_t *)name, strlen(name));
+    CBS_init(&name_cbs, (const uint8_t *)name, name_len);
     while (CBS_len(&name_cbs) != 0) {
       uint32_t c;
       if (!cbs_get_utf8(&name_cbs, &c) ||
@@ -1059,10 +1013,24 @@
   }
   uint8_t *buf;
   int len = i2d_X509(cert, NULL);
+
+  int int_name_len = 0;
+  const char *cert_name = (const char *)X509_alias_get0(cert, &int_name_len);
+  size_t name_len = int_name_len;
+  if (name) {
+    if (name_len != 0) {
+      OPENSSL_PUT_ERROR(PKCS8, PKCS8_R_AMBIGUOUS_FRIENDLY_NAME);
+      return 0;
+    }
+    name_len = strlen(name);
+  } else {
+    name = cert_name;
+  }
+
   if (len < 0 ||
       !CBB_add_space(&cert_value, &buf, (size_t)len) ||
       i2d_X509(cert, &buf) < 0 ||
-      !add_bag_attributes(&bag, name, key_id, key_id_len) ||
+      !add_bag_attributes(&bag, name, name_len, key_id, key_id_len) ||
       !CBB_flush(cbb)) {
     return 0;
   }
@@ -1323,7 +1291,11 @@
         goto err;
       }
     }
-    if (!add_bag_attributes(&bag, name, key_id, key_id_len) ||
+    size_t name_len = 0;
+    if (name) {
+      name_len = strlen(name);
+    }
+    if (!add_bag_attributes(&bag, name, name_len, key_id, key_id_len) ||
         !CBB_flush(&content_infos)) {
       goto err;
     }
diff --git a/src/crypto/poly1305/poly1305.c b/src/crypto/poly1305/poly1305.c
index c07b1e9..94853b8 100644
--- a/src/crypto/poly1305/poly1305.c
+++ b/src/crypto/poly1305/poly1305.c
@@ -18,27 +18,15 @@
 
 #include <openssl/poly1305.h>
 
+#include <assert.h>
 #include <string.h>
 
-#include <openssl/cpu.h>
-
 #include "internal.h"
 #include "../internal.h"
 
 
 #if !defined(BORINGSSL_HAS_UINT128) || !defined(OPENSSL_X86_64)
 
-// We can assume little-endian.
-static uint32_t U8TO32_LE(const uint8_t *m) {
-  uint32_t r;
-  OPENSSL_memcpy(&r, m, sizeof(r));
-  return r;
-}
-
-static void U32TO8_LE(uint8_t *m, uint32_t v) {
-  OPENSSL_memcpy(m, &v, sizeof(v));
-}
-
 static uint64_t mul32x32_64(uint32_t a, uint32_t b) { return (uint64_t)a * b; }
 
 struct poly1305_state_st {
@@ -50,7 +38,7 @@
   uint8_t key[16];
 };
 
-OPENSSL_STATIC_ASSERT(
+static_assert(
     sizeof(struct poly1305_state_st) + 63 <= sizeof(poly1305_state),
     "poly1305_state isn't large enough to hold aligned poly1305_state_st");
 
@@ -76,10 +64,10 @@
   }
 
 poly1305_donna_16bytes:
-  t0 = U8TO32_LE(in);
-  t1 = U8TO32_LE(in + 4);
-  t2 = U8TO32_LE(in + 8);
-  t3 = U8TO32_LE(in + 12);
+  t0 = CRYPTO_load_u32_le(in);
+  t1 = CRYPTO_load_u32_le(in + 4);
+  t2 = CRYPTO_load_u32_le(in + 8);
+  t3 = CRYPTO_load_u32_le(in + 12);
 
   in += 16;
   len -= 16;
@@ -142,10 +130,10 @@
   }
   len = 0;
 
-  t0 = U8TO32_LE(mp + 0);
-  t1 = U8TO32_LE(mp + 4);
-  t2 = U8TO32_LE(mp + 8);
-  t3 = U8TO32_LE(mp + 12);
+  t0 = CRYPTO_load_u32_le(mp + 0);
+  t1 = CRYPTO_load_u32_le(mp + 4);
+  t2 = CRYPTO_load_u32_le(mp + 8);
+  t3 = CRYPTO_load_u32_le(mp + 12);
 
   state->h0 += t0 & 0x3ffffff;
   state->h1 += ((((uint64_t)t1 << 32) | t0) >> 26) & 0x3ffffff;
@@ -167,10 +155,10 @@
   }
 #endif
 
-  t0 = U8TO32_LE(key + 0);
-  t1 = U8TO32_LE(key + 4);
-  t2 = U8TO32_LE(key + 8);
-  t3 = U8TO32_LE(key + 12);
+  t0 = CRYPTO_load_u32_le(key + 0);
+  t1 = CRYPTO_load_u32_le(key + 4);
+  t2 = CRYPTO_load_u32_le(key + 8);
+  t3 = CRYPTO_load_u32_le(key + 12);
 
   // precompute multipliers
   state->r0 = t0 & 0x3ffffff;
@@ -206,6 +194,11 @@
                             size_t in_len) {
   struct poly1305_state_st *state = poly1305_aligned_state(statep);
 
+  // Work around a C language bug. See https://crbug.com/1019588.
+  if (in_len == 0) {
+    return;
+  }
+
 #if defined(OPENSSL_POLY1305_NEON)
   if (CRYPTO_is_NEON_capable()) {
     CRYPTO_poly1305_update_neon(statep, in, in_len);
@@ -301,21 +294,22 @@
   state->h3 = (state->h3 & nb) | (g3 & b);
   state->h4 = (state->h4 & nb) | (g4 & b);
 
-  f0 = ((state->h0) | (state->h1 << 26)) + (uint64_t)U8TO32_LE(&state->key[0]);
+  f0 = ((state->h0) | (state->h1 << 26)) +
+       (uint64_t)CRYPTO_load_u32_le(&state->key[0]);
   f1 = ((state->h1 >> 6) | (state->h2 << 20)) +
-       (uint64_t)U8TO32_LE(&state->key[4]);
+       (uint64_t)CRYPTO_load_u32_le(&state->key[4]);
   f2 = ((state->h2 >> 12) | (state->h3 << 14)) +
-       (uint64_t)U8TO32_LE(&state->key[8]);
+       (uint64_t)CRYPTO_load_u32_le(&state->key[8]);
   f3 = ((state->h3 >> 18) | (state->h4 << 8)) +
-       (uint64_t)U8TO32_LE(&state->key[12]);
+       (uint64_t)CRYPTO_load_u32_le(&state->key[12]);
 
-  U32TO8_LE(&mac[0], f0);
+  CRYPTO_store_u32_le(&mac[0], f0);
   f1 += (f0 >> 32);
-  U32TO8_LE(&mac[4], f1);
+  CRYPTO_store_u32_le(&mac[4], f1);
   f2 += (f1 >> 32);
-  U32TO8_LE(&mac[8], f2);
+  CRYPTO_store_u32_le(&mac[8], f2);
   f3 += (f2 >> 32);
-  U32TO8_LE(&mac[12], f3);
+  CRYPTO_store_u32_le(&mac[12], f3);
 }
 
 #endif  // !BORINGSSL_HAS_UINT128 || !OPENSSL_X86_64
diff --git a/src/crypto/poly1305/poly1305_arm.c b/src/crypto/poly1305/poly1305_arm.c
index d6f034c..d01e0b7 100644
--- a/src/crypto/poly1305/poly1305_arm.c
+++ b/src/crypto/poly1305/poly1305_arm.c
@@ -17,6 +17,7 @@
 
 #include <openssl/poly1305.h>
 
+#include <assert.h>
 #include <string.h>
 
 #include "../internal.h"
@@ -183,7 +184,7 @@
   uint8_t key[16];
 };
 
-OPENSSL_STATIC_ASSERT(
+static_assert(
     sizeof(struct poly1305_state_st) + 63 <= sizeof(poly1305_state),
     "poly1305_state isn't large enough to hold aligned poly1305_state_st.");
 
diff --git a/src/crypto/poly1305/poly1305_vec.c b/src/crypto/poly1305/poly1305_vec.c
index 83f1efe..209b403 100644
--- a/src/crypto/poly1305/poly1305_vec.c
+++ b/src/crypto/poly1305/poly1305_vec.c
@@ -20,6 +20,8 @@
 
 #include <openssl/poly1305.h>
 
+#include <assert.h>
+
 #include "../internal.h"
 
 
@@ -27,22 +29,6 @@
 
 #include <emmintrin.h>
 
-static uint32_t load_u32_le(const uint8_t in[4]) {
-  uint32_t ret;
-  OPENSSL_memcpy(&ret, in, 4);
-  return ret;
-}
-
-static uint64_t load_u64_le(const uint8_t in[8]) {
-  uint64_t ret;
-  OPENSSL_memcpy(&ret, in, 8);
-  return ret;
-}
-
-static void store_u64_le(uint8_t out[8], uint64_t v) {
-  OPENSSL_memcpy(out, &v, 8);
-}
-
 typedef __m128i xmmi;
 
 static const alignas(16) uint32_t poly1305_x64_sse2_message_mask[4] = {
@@ -92,9 +78,10 @@
 } poly1305_state_internal; /* 448 bytes total + 63 bytes for
                               alignment = 511 bytes raw */
 
-OPENSSL_STATIC_ASSERT(
-    sizeof(struct poly1305_state_internal_t) + 63 <= sizeof(poly1305_state),
-    "poly1305_state isn't large enough to hold aligned poly1305_state_internal_t");
+static_assert(sizeof(struct poly1305_state_internal_t) + 63 <=
+                  sizeof(poly1305_state),
+              "poly1305_state isn't large enough to hold aligned "
+              "poly1305_state_internal_t");
 
 static inline poly1305_state_internal *poly1305_aligned_state(
     poly1305_state *state) {
@@ -112,8 +99,8 @@
   uint64_t t0, t1;
 
   // clamp key
-  t0 = load_u64_le(key + 0);
-  t1 = load_u64_le(key + 8);
+  t0 = CRYPTO_load_u64_le(key + 0);
+  t1 = CRYPTO_load_u64_le(key + 8);
   r0 = t0 & 0xffc0fffffff;
   t0 >>= 44;
   t0 |= t1 << 20;
@@ -131,10 +118,10 @@
   p->R22.d[3] = (uint32_t)(r2 >> 32);
 
   // store pad
-  p->R23.d[1] = load_u32_le(key + 16);
-  p->R23.d[3] = load_u32_le(key + 20);
-  p->R24.d[1] = load_u32_le(key + 24);
-  p->R24.d[3] = load_u32_le(key + 28);
+  p->R23.d[1] = CRYPTO_load_u32_le(key + 16);
+  p->R23.d[3] = CRYPTO_load_u32_le(key + 20);
+  p->R24.d[1] = CRYPTO_load_u32_le(key + 24);
+  p->R24.d[3] = CRYPTO_load_u32_le(key + 28);
 
   // H = 0
   st->H[0] = _mm_setzero_si128();
@@ -766,8 +753,8 @@
   }
 
 poly1305_donna_atleast16bytes:
-  t0 = load_u64_le(m + 0);
-  t1 = load_u64_le(m + 8);
+  t0 = CRYPTO_load_u64_le(m + 0);
+  t1 = CRYPTO_load_u64_le(m + 8);
   h0 += t0 & 0xfffffffffff;
   t0 = shr128_pair(t1, t0, 44);
   h1 += t0 & 0xfffffffffff;
@@ -806,8 +793,8 @@
   OPENSSL_memset(m + leftover, 0, 16 - leftover);
   leftover = 16;
 
-  t0 = load_u64_le(m + 0);
-  t1 = load_u64_le(m + 8);
+  t0 = CRYPTO_load_u64_le(m + 0);
+  t1 = CRYPTO_load_u64_le(m + 8);
   h0 += t0 & 0xfffffffffff;
   t0 = shr128_pair(t1, t0, 44);
   h1 += t0 & 0xfffffffffff;
@@ -853,8 +840,8 @@
   t1 = (t1 >> 24);
   h2 += (t1)+c;
 
-  store_u64_le(mac + 0, ((h0) | (h1 << 44)));
-  store_u64_le(mac + 8, ((h1 >> 20) | (h2 << 24)));
+  CRYPTO_store_u64_le(mac + 0, ((h0) | (h1 << 44)));
+  CRYPTO_store_u64_le(mac + 8, ((h1 >> 20) | (h2 << 24)));
 }
 
 #endif  // BORINGSSL_HAS_UINT128 && OPENSSL_X86_64
diff --git a/src/crypto/pool/internal.h b/src/crypto/pool/internal.h
index b39ee42..f9f4838 100644
--- a/src/crypto/pool/internal.h
+++ b/src/crypto/pool/internal.h
@@ -39,6 +39,7 @@
 struct crypto_buffer_pool_st {
   LHASH_OF(CRYPTO_BUFFER) *bufs;
   CRYPTO_MUTEX lock;
+  const uint64_t hash_key[2];
 };
 
 
diff --git a/src/crypto/pool/pool.c b/src/crypto/pool/pool.c
index 89bf4c2..e889f52 100644
--- a/src/crypto/pool/pool.c
+++ b/src/crypto/pool/pool.c
@@ -19,6 +19,8 @@
 
 #include <openssl/bytestring.h>
 #include <openssl/mem.h>
+#include <openssl/rand.h>
+#include <openssl/siphash.h>
 #include <openssl/thread.h>
 
 #include "../internal.h"
@@ -26,10 +28,13 @@
 
 
 static uint32_t CRYPTO_BUFFER_hash(const CRYPTO_BUFFER *buf) {
-  return OPENSSL_hash32(buf->data, buf->len);
+  return (uint32_t)SIPHASH_24(buf->pool->hash_key, buf->data, buf->len);
 }
 
 static int CRYPTO_BUFFER_cmp(const CRYPTO_BUFFER *a, const CRYPTO_BUFFER *b) {
+  // Only |CRYPTO_BUFFER|s from the same pool have compatible hashes.
+  assert(a->pool != NULL);
+  assert(a->pool == b->pool);
   if (a->len != b->len) {
     return 1;
   }
@@ -50,6 +55,7 @@
   }
 
   CRYPTO_MUTEX_init(&pool->lock);
+  RAND_bytes((uint8_t *)&pool->hash_key, sizeof(pool->hash_key));
 
   return pool;
 }
@@ -84,6 +90,7 @@
     CRYPTO_BUFFER tmp;
     tmp.data = (uint8_t *) data;
     tmp.len = len;
+    tmp.pool = pool;
 
     CRYPTO_MUTEX_lock_read(&pool->lock);
     CRYPTO_BUFFER *duplicate = lh_CRYPTO_BUFFER_retrieve(pool->bufs, &tmp);
diff --git a/src/crypto/rand_extra/passive.c b/src/crypto/rand_extra/passive.c
index a2b388f..f27803b 100644
--- a/src/crypto/rand_extra/passive.c
+++ b/src/crypto/rand_extra/passive.c
@@ -12,7 +12,8 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include <openssl/base.h>
+#include <openssl/ctrdrbg.h>
+
 #include "../fipsmodule/rand/internal.h"
 
 #if defined(BORINGSSL_FIPS)
@@ -20,15 +21,16 @@
 // RAND_need_entropy is called by the FIPS module when it has blocked because of
 // a lack of entropy. This signal is used as an indication to feed it more.
 void RAND_need_entropy(size_t bytes_needed) {
-  uint8_t buf[CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
+  uint8_t buf[/* last_block size */ 16 +
+              CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD];
   size_t todo = sizeof(buf);
   if (todo > bytes_needed) {
     todo = bytes_needed;
   }
 
-  int used_cpu;
-  CRYPTO_get_seed_entropy(buf, todo, &used_cpu);
-  RAND_load_entropy(buf, todo, used_cpu);
+  int want_additional_input;
+  CRYPTO_get_seed_entropy(buf, todo, &want_additional_input);
+  RAND_load_entropy(buf, todo, want_additional_input);
 }
 
 #endif  // FIPS
diff --git a/src/crypto/rand_extra/rand_test.cc b/src/crypto/rand_extra/rand_test.cc
index 7f7c19f..2ed1deb 100644
--- a/src/crypto/rand_extra/rand_test.cc
+++ b/src/crypto/rand_extra/rand_test.cc
@@ -18,7 +18,6 @@
 
 #include <gtest/gtest.h>
 
-#include <openssl/cpu.h>
 #include <openssl/span.h>
 
 #include "../fipsmodule/rand/fork_detect.h"
diff --git a/src/crypto/refcount_c11.c b/src/crypto/refcount_c11.c
index 0a331a4..a1781c6 100644
--- a/src/crypto/refcount_c11.c
+++ b/src/crypto/refcount_c11.c
@@ -22,8 +22,6 @@
 #include <stdatomic.h>
 #include <stdlib.h>
 
-#include <openssl/type_check.h>
-
 
 // See comment above the typedef of CRYPTO_refcount_t about these tests.
 static_assert(alignof(CRYPTO_refcount_t) == alignof(_Atomic CRYPTO_refcount_t),
diff --git a/src/crypto/refcount_lock.c b/src/crypto/refcount_lock.c
index fb1c11f..173267e 100644
--- a/src/crypto/refcount_lock.c
+++ b/src/crypto/refcount_lock.c
@@ -14,15 +14,14 @@
 
 #include "internal.h"
 
+#include <assert.h>
 #include <stdlib.h>
 
-#include <openssl/type_check.h>
-
 
 #if !defined(OPENSSL_C11_ATOMIC)
 
-OPENSSL_STATIC_ASSERT((CRYPTO_refcount_t)-1 == CRYPTO_REFCOUNT_MAX,
-                      "CRYPTO_REFCOUNT_MAX is incorrect");
+static_assert((CRYPTO_refcount_t)-1 == CRYPTO_REFCOUNT_MAX,
+              "CRYPTO_REFCOUNT_MAX is incorrect");
 
 static struct CRYPTO_STATIC_MUTEX g_refcount_lock = CRYPTO_STATIC_MUTEX_INIT;
 
diff --git a/src/crypto/siphash/siphash.c b/src/crypto/siphash/siphash.c
index bb9a0c1..0921eac 100644
--- a/src/crypto/siphash/siphash.c
+++ b/src/crypto/siphash/siphash.c
@@ -48,8 +48,7 @@
   v[3] = key[1] ^ UINT64_C(0x7465646279746573);
 
   while (input_len >= sizeof(uint64_t)) {
-    uint64_t m;
-    memcpy(&m, input, sizeof(m));
+    uint64_t m = CRYPTO_load_u64_le(input);
     v[3] ^= m;
     siphash_round(v);
     siphash_round(v);
@@ -59,18 +58,16 @@
     input_len -= sizeof(uint64_t);
   }
 
-  union {
-    uint8_t bytes[8];
-    uint64_t word;
-  } last_block;
-  last_block.word = 0;
-  OPENSSL_memcpy(last_block.bytes, input, input_len);
-  last_block.bytes[7] = orig_input_len & 0xff;
+  uint8_t last_block[8];
+  OPENSSL_memset(last_block, 0, sizeof(last_block));
+  OPENSSL_memcpy(last_block, input, input_len);
+  last_block[7] = orig_input_len & 0xff;
 
-  v[3] ^= last_block.word;
+  uint64_t last_block_word = CRYPTO_load_u64_le(last_block);
+  v[3] ^= last_block_word;
   siphash_round(v);
   siphash_round(v);
-  v[0] ^= last_block.word;
+  v[0] ^= last_block_word;
 
   v[2] ^= 0xff;
   siphash_round(v);
diff --git a/src/crypto/siphash/siphash_test.cc b/src/crypto/siphash/siphash_test.cc
index 6d8f9e7..6407e0d 100644
--- a/src/crypto/siphash/siphash_test.cc
+++ b/src/crypto/siphash/siphash_test.cc
@@ -23,14 +23,12 @@
 
 TEST(SipHash, Basic) {
   // This is the example from appendix A of the SipHash paper.
-  union {
-    uint8_t bytes[16];
-    uint64_t words[2];
-  } key;
-
+  uint8_t key_bytes[16];
   for (unsigned i = 0; i < 16; i++) {
-    key.bytes[i] = i;
+    key_bytes[i] = i;
   }
+  uint64_t key[2];
+  memcpy(key, key_bytes, sizeof(key));
 
   uint8_t input[15];
   for (unsigned i = 0; i < sizeof(input); i++) {
@@ -38,7 +36,7 @@
   }
 
   EXPECT_EQ(UINT64_C(0xa129ca6149be45e5),
-            SIPHASH_24(key.words, input, sizeof(input)));
+            SIPHASH_24(key, input, sizeof(input)));
 }
 
 TEST(SipHash, Vectors) {
diff --git a/src/crypto/stack/stack.c b/src/crypto/stack/stack.c
index 6da6e3b..fe1b513 100644
--- a/src/crypto/stack/stack.c
+++ b/src/crypto/stack/stack.c
@@ -67,7 +67,7 @@
 // stack.
 static const size_t kMinSize = 4;
 
-_STACK *sk_new(stack_cmp_func comp) {
+_STACK *sk_new(OPENSSL_sk_cmp_func comp) {
   _STACK *ret = OPENSSL_malloc(sizeof(_STACK));
   if (ret == NULL) {
     return NULL;
@@ -131,8 +131,8 @@
   OPENSSL_free(sk);
 }
 
-void sk_pop_free_ex(_STACK *sk, void (*call_free_func)(stack_free_func, void *),
-                    stack_free_func free_func) {
+void sk_pop_free_ex(_STACK *sk, OPENSSL_sk_call_free_func call_free_func,
+                    OPENSSL_sk_free_func free_func) {
   if (sk == NULL) {
     return;
   }
@@ -145,14 +145,14 @@
   sk_free(sk);
 }
 
-// Historically, |sk_pop_free| called the function as |stack_free_func|
+// Historically, |sk_pop_free| called the function as |OPENSSL_sk_free_func|
 // directly. This is undefined in C. Some callers called |sk_pop_free| directly,
 // so we must maintain a compatibility version for now.
-static void call_free_func_legacy(stack_free_func func, void *ptr) {
+static void call_free_func_legacy(OPENSSL_sk_free_func func, void *ptr) {
   func(ptr);
 }
 
-void sk_pop_free(_STACK *sk, stack_free_func free_func) {
+void sk_pop_free(_STACK *sk, OPENSSL_sk_free_func free_func) {
   sk_pop_free_ex(sk, call_free_func_legacy, free_func);
 }
 
@@ -234,8 +234,7 @@
 }
 
 int sk_find(const _STACK *sk, size_t *out_index, const void *p,
-            int (*call_cmp_func)(stack_cmp_func, const void **,
-                                 const void **)) {
+            OPENSSL_sk_call_cmp_func call_cmp_func) {
   if (sk == NULL) {
     return 0;
   }
@@ -355,24 +354,43 @@
   return NULL;
 }
 
-void sk_sort(_STACK *sk) {
+#if defined(_MSC_VER)
+struct sort_compare_ctx {
+  OPENSSL_sk_call_cmp_func call_cmp_func;
+  OPENSSL_sk_cmp_func cmp_func;
+};
+
+static int sort_compare(void *ctx_v, const void *a, const void *b) {
+  struct sort_compare_ctx *ctx = ctx_v;
+  return ctx->call_cmp_func(ctx->cmp_func, a, b);
+}
+#endif
+
+void sk_sort(_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func) {
   if (sk == NULL || sk->comp == NULL || sk->sorted) {
     return;
   }
 
-  // sk->comp is a function that takes pointers to pointers to elements, but
-  // qsort take a comparison function that just takes pointers to elements.
-  // However, since we're passing an array of pointers to qsort, we can just
-  // cast the comparison function and everything works.
-  //
-  // TODO(davidben): This is undefined behavior, but the call is in libc so,
-  // e.g., CFI does not notice. Unfortunately, |qsort| is missing a void*
-  // parameter in its callback and |qsort_s| / |qsort_r| are a mess of
-  // incompatibility.
   if (sk->num >= 2) {
+#if defined(_MSC_VER)
+    // MSVC's |qsort_s| is different from the C11 one.
+    // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/qsort-s?view=msvc-170
+    struct sort_compare_ctx ctx = {call_cmp_func, sk->comp};
+    qsort_s(sk->data, sk->num, sizeof(void *), sort_compare, &ctx);
+#else
+    // sk->comp is a function that takes pointers to pointers to elements, but
+    // qsort take a comparison function that just takes pointers to elements.
+    // However, since we're passing an array of pointers to qsort, we can just
+    // cast the comparison function and everything works.
+    //
+    // TODO(davidben): This is undefined behavior, but the call is in libc so,
+    // e.g., CFI does not notice. |qsort| is missing a void* parameter in its
+    // callback, while no one defines |qsort_r| or |qsort_s| consistently. See
+    // https://stackoverflow.com/a/39561369
     int (*comp_func)(const void *, const void *) =
         (int (*)(const void *, const void *))(sk->comp);
     qsort(sk->data, sk->num, sizeof(void *), comp_func);
+#endif
   }
   sk->sorted = 1;
 }
@@ -384,8 +402,8 @@
   return sk->sorted;
 }
 
-stack_cmp_func sk_set_cmp_func(_STACK *sk, stack_cmp_func comp) {
-  stack_cmp_func old = sk->comp;
+OPENSSL_sk_cmp_func sk_set_cmp_func(_STACK *sk, OPENSSL_sk_cmp_func comp) {
+  OPENSSL_sk_cmp_func old = sk->comp;
 
   if (sk->comp != comp) {
     sk->sorted = 0;
@@ -395,11 +413,10 @@
   return old;
 }
 
-_STACK *sk_deep_copy(const _STACK *sk,
-                     void *(*call_copy_func)(stack_copy_func, void *),
-                     stack_copy_func copy_func,
-                     void (*call_free_func)(stack_free_func, void *),
-                     stack_free_func free_func) {
+_STACK *sk_deep_copy(const _STACK *sk, OPENSSL_sk_call_copy_func call_copy_func,
+                     OPENSSL_sk_copy_func copy_func,
+                     OPENSSL_sk_call_free_func call_free_func,
+                     OPENSSL_sk_free_func free_func) {
   _STACK *ret = sk_dup(sk);
   if (ret == NULL) {
     return NULL;
diff --git a/src/crypto/test/abi_test.h b/src/crypto/test/abi_test.h
index ffe4479..1ba82b1 100644
--- a/src/crypto/test/abi_test.h
+++ b/src/crypto/test/abi_test.h
@@ -380,9 +380,9 @@
 // CheckImpl implementation. It must be specialized for void returns because we
 // call |func| directly.
 template <typename R, typename... Args>
-inline typename std::enable_if<!std::is_void<R>::value, crypto_word_t>::type
-CheckImpl(Result *out, bool /* unwind */, R (*func)(Args...),
-          typename DeductionGuard<Args>::Type... args) {
+inline std::enable_if_t<!std::is_void<R>::value, crypto_word_t> CheckImpl(
+    Result *out, bool /* unwind */, R (*func)(Args...),
+    typename DeductionGuard<Args>::Type... args) {
   *out = Result();
   return func(args...);
 }
diff --git a/src/crypto/test/file_test.cc b/src/crypto/test/file_test.cc
index 47a6f4c..e1ab2aa 100644
--- a/src/crypto/test/file_test.cc
+++ b/src/crypto/test/file_test.cc
@@ -20,6 +20,7 @@
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -377,7 +378,8 @@
       return FileTest::kReadError;
     }
 
-    if (fgets(out, len, file_) == nullptr) {
+    len = std::min(len, size_t{INT_MAX});
+    if (fgets(out, static_cast<int>(len), file_) == nullptr) {
       return feof(file_) ? FileTest::kReadEOF : FileTest::kReadError;
     }
 
diff --git a/src/crypto/test/gtest_main.cc b/src/crypto/test/gtest_main.cc
index a79f263..591cef7 100644
--- a/src/crypto/test/gtest_main.cc
+++ b/src/crypto/test/gtest_main.cc
@@ -17,7 +17,6 @@
 
 #include <gtest/gtest.h>
 
-#include <openssl/cpu.h>
 #include <openssl/rand.h>
 
 #include "abi_test.h"
diff --git a/src/crypto/test/wycheproof_util.cc b/src/crypto/test/wycheproof_util.cc
index cd870dd..9d31706 100644
--- a/src/crypto/test/wycheproof_util.cc
+++ b/src/crypto/test/wycheproof_util.cc
@@ -14,6 +14,7 @@
 
 #include "./wycheproof_util.h"
 
+#include <limits.h>
 #include <stdlib.h>
 
 #include <algorithm>
@@ -138,7 +139,8 @@
     return nullptr;
   }
   BIGNUM *bn = nullptr;
-  if (BN_hex2bn(&bn, value.c_str()) != static_cast<int>(value.size())) {
+  if (value.size() > INT_MAX ||
+      BN_hex2bn(&bn, value.c_str()) != static_cast<int>(value.size())) {
     BN_free(bn);
     t->PrintLine("Could not decode value '%s'", value.c_str());
     return nullptr;
@@ -151,8 +153,9 @@
     // https://github.com/google/wycheproof/blob/0329f5b751ef102bd6b7b7181b6e049522a887f5/java/com/google/security/wycheproof/JsonUtil.java#L62.
     if ('0' > value[0] || value[0] > '7') {
       bssl::UniquePtr<BIGNUM> tmp(BN_new());
-      if (!tmp ||
-          !BN_set_bit(tmp.get(), value.size() * 4) ||
+      if (!tmp ||  //
+          value.size() > INT_MAX / 4 ||
+          !BN_set_bit(tmp.get(), static_cast<int>(value.size() * 4)) ||
           !BN_sub(ret.get(), ret.get(), tmp.get())) {
         return nullptr;
       }
diff --git a/src/crypto/thread_pthread.c b/src/crypto/thread_pthread.c
index e873d04..08bdd5a 100644
--- a/src/crypto/thread_pthread.c
+++ b/src/crypto/thread_pthread.c
@@ -16,20 +16,18 @@
 
 #if defined(OPENSSL_PTHREADS)
 
+#include <assert.h>
 #include <pthread.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 
-OPENSSL_STATIC_ASSERT(sizeof(CRYPTO_MUTEX) >= sizeof(pthread_rwlock_t),
-                      "CRYPTO_MUTEX is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(CRYPTO_MUTEX) >= alignof(pthread_rwlock_t),
-                      "CRYPTO_MUTEX has insufficient alignment");
-#endif
+static_assert(sizeof(CRYPTO_MUTEX) >= sizeof(pthread_rwlock_t),
+              "CRYPTO_MUTEX is too small");
+static_assert(alignof(CRYPTO_MUTEX) >= alignof(pthread_rwlock_t),
+              "CRYPTO_MUTEX has insufficient alignment");
 
 void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock) {
   if (pthread_rwlock_init((pthread_rwlock_t *) lock, NULL) != 0) {
diff --git a/src/crypto/thread_win.c b/src/crypto/thread_win.c
index 49ecc12..3b61bfc 100644
--- a/src/crypto/thread_win.c
+++ b/src/crypto/thread_win.c
@@ -20,19 +20,17 @@
 #include <windows.h>
 OPENSSL_MSVC_PRAGMA(warning(pop))
 
+#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <openssl/mem.h>
-#include <openssl/type_check.h>
 
 
-OPENSSL_STATIC_ASSERT(sizeof(CRYPTO_MUTEX) >= sizeof(SRWLOCK),
-                      "CRYPTO_MUTEX is too small");
-#if defined(__GNUC__) || defined(__clang__)
-OPENSSL_STATIC_ASSERT(alignof(CRYPTO_MUTEX) >= alignof(SRWLOCK),
-                      "CRYPTO_MUTEX has insufficient alignment");
-#endif
+static_assert(sizeof(CRYPTO_MUTEX) >= sizeof(SRWLOCK),
+              "CRYPTO_MUTEX is too small");
+static_assert(alignof(CRYPTO_MUTEX) >= alignof(SRWLOCK),
+              "CRYPTO_MUTEX has insufficient alignment");
 
 static BOOL CALLBACK call_once_init(INIT_ONCE *once, void *arg, void **out) {
   void (**init)(void) = (void (**)(void))arg;
diff --git a/src/crypto/trust_token/internal.h b/src/crypto/trust_token/internal.h
index 0aa1936..31ecc49 100644
--- a/src/crypto/trust_token/internal.h
+++ b/src/crypto/trust_token/internal.h
@@ -93,6 +93,9 @@
 // functions for |TRUST_TOKENS_experiment_v1|'s PMBTokens construction which
 // uses P-384.
 int pmbtoken_exp1_generate_key(CBB *out_private, CBB *out_public);
+int pmbtoken_exp1_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                         const uint8_t *secret,
+                                         size_t secret_len);
 int pmbtoken_exp1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                         const uint8_t *in, size_t len);
 int pmbtoken_exp1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key,
@@ -118,6 +121,9 @@
 // functions for |TRUST_TOKENS_experiment_v2|'s PMBTokens construction which
 // uses P-384.
 int pmbtoken_exp2_generate_key(CBB *out_private, CBB *out_public);
+int pmbtoken_exp2_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                         const uint8_t *secret,
+                                         size_t secret_len);
 int pmbtoken_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                         const uint8_t *in, size_t len);
 int pmbtoken_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key,
@@ -153,6 +159,8 @@
 // functions for |TRUST_TOKENS_experiment_v2|'s VOPRF construction which uses
 // P-384.
 int voprf_exp2_generate_key(CBB *out_private, CBB *out_public);
+int voprf_exp2_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                      const uint8_t *secret, size_t secret_len);
 int voprf_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                      const uint8_t *in, size_t len);
 int voprf_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key,
@@ -179,6 +187,12 @@
   // zero on failure.
   int (*generate_key)(CBB *out_private, CBB *out_public);
 
+  // derive_key_from_secret deterministically derives a keypair based on
+  // |secret| and writes their serialized forms into |out_private| and
+  // |out_public|. It returns one on success and zero on failure.
+  int (*derive_key_from_secret)(CBB *out_private, CBB *out_public,
+                                  const uint8_t *secret, size_t secret_len);
+
   // client_key_from_bytes decodes a client key from |in| and sets |key|
   // to the resulting key. It returns one on success and zero
   // on failure.
diff --git a/src/crypto/trust_token/pmbtoken.c b/src/crypto/trust_token/pmbtoken.c
index a6549b9..68d8909 100644
--- a/src/crypto/trust_token/pmbtoken.c
+++ b/src/crypto/trust_token/pmbtoken.c
@@ -37,6 +37,8 @@
                              const uint8_t s[TRUST_TOKEN_NONCE_SIZE]);
 typedef int (*hash_c_func_t)(const EC_GROUP *group, EC_SCALAR *out,
                              uint8_t *buf, size_t len);
+typedef int (*hash_to_scalar_func_t)(const EC_GROUP *group, EC_SCALAR *out,
+                                     uint8_t *buf, size_t len);
 
 typedef struct {
   const EC_GROUP *group;
@@ -52,6 +54,9 @@
   // hash_c implements the H_c operation in PMBTokens. It returns one on success
   // and zero on error.
   hash_c_func_t hash_c;
+  // hash_to_scalar implements the HashToScalar operation for PMBTokens. It
+  // returns one on success and zero on error.
+  hash_to_scalar_func_t hash_to_scalar;
   int prefix_point : 1;
 } PMBTOKEN_METHOD;
 
@@ -60,7 +65,9 @@
 static int pmbtoken_init_method(PMBTOKEN_METHOD *method, int curve_nid,
                                 const uint8_t *h_bytes, size_t h_len,
                                 hash_t_func_t hash_t, hash_s_func_t hash_s,
-                                hash_c_func_t hash_c, int prefix_point) {
+                                hash_c_func_t hash_c,
+                                hash_to_scalar_func_t hash_to_scalar,
+                                int prefix_point) {
   method->group = EC_GROUP_new_by_curve_name(curve_nid);
   if (method->group == NULL) {
     return 0;
@@ -69,6 +76,7 @@
   method->hash_t = hash_t;
   method->hash_s = hash_s;
   method->hash_c = hash_c;
+  method->hash_to_scalar = hash_to_scalar;
   method->prefix_point = prefix_point;
 
   EC_AFFINE h;
@@ -85,21 +93,32 @@
   return 1;
 }
 
-// generate_keypair generates a keypair for the PMBTokens construction.
-// |out_x| and |out_y| are set to the secret half of the keypair, while
-// |*out_pub| is set to the public half of the keypair. It returns one on
-// success and zero on failure.
-static int generate_keypair(const PMBTOKEN_METHOD *method, EC_SCALAR *out_x,
-                            EC_SCALAR *out_y, EC_RAW_POINT *out_pub) {
-  if (!ec_random_nonzero_scalar(method->group, out_x, kDefaultAdditionalData) ||
-      !ec_random_nonzero_scalar(method->group, out_y, kDefaultAdditionalData) ||
-      !ec_point_mul_scalar_precomp(method->group, out_pub, &method->g_precomp,
-                                   out_x, &method->h_precomp, out_y, NULL,
-                                   NULL)) {
-    OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE);
-    return 0;
+static int derive_scalar_from_secret(const PMBTOKEN_METHOD *method,
+                                     EC_SCALAR *out, const uint8_t *secret,
+                                     size_t secret_len, uint8_t scalar_id) {
+  static const uint8_t kKeygenLabel[] = "TrustTokenPMBTokenKeyGen";
+
+  int ok = 0;
+  CBB cbb;
+  CBB_zero(&cbb);
+  uint8_t *buf = NULL;
+  size_t len;
+  if (!CBB_init(&cbb, 0) ||
+      !CBB_add_bytes(&cbb, kKeygenLabel, sizeof(kKeygenLabel)) ||
+      !CBB_add_u8(&cbb, scalar_id) ||
+      !CBB_add_bytes(&cbb, secret, secret_len) ||
+      !CBB_finish(&cbb, &buf, &len) ||
+      !method->hash_to_scalar(method->group, out, buf, len)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
+    goto err;
   }
-  return 1;
+
+  ok = 1;
+
+err:
+  CBB_cleanup(&cbb);
+  OPENSSL_free(buf);
+  return ok;
 }
 
 static int point_to_cbb(CBB *out, const EC_GROUP *group,
@@ -165,19 +184,24 @@
                                           scalars, 3);
 }
 
-static int pmbtoken_generate_key(const PMBTOKEN_METHOD *method,
-                                 CBB *out_private, CBB *out_public) {
+static int pmbtoken_compute_keys(const PMBTOKEN_METHOD *method,
+                                 CBB *out_private, CBB *out_public,
+                                 const EC_SCALAR *x0, const EC_SCALAR *y0,
+                                 const EC_SCALAR *x1, const EC_SCALAR *y1,
+                                 const EC_SCALAR *xs, const EC_SCALAR *ys) {
   const EC_GROUP *group = method->group;
   EC_RAW_POINT pub[3];
-  EC_SCALAR x0, y0, x1, y1, xs, ys;
-  if (!generate_keypair(method, &x0, &y0, &pub[0]) ||
-      !generate_keypair(method, &x1, &y1, &pub[1]) ||
-      !generate_keypair(method, &xs, &ys, &pub[2])) {
+  if (!ec_point_mul_scalar_precomp(group, &pub[0], &method->g_precomp,
+                                   x0, &method->h_precomp, y0, NULL, NULL) ||
+      !ec_point_mul_scalar_precomp(group, &pub[1], &method->g_precomp,
+                                   x1, &method->h_precomp, y1, NULL, NULL) ||
+      !ec_point_mul_scalar_precomp(method->group, &pub[2], &method->g_precomp,
+                                   xs, &method->h_precomp, ys, NULL, NULL)) {
     OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
     return 0;
   }
 
-  const EC_SCALAR *scalars[] = {&x0, &y0, &x1, &y1, &xs, &ys};
+  const EC_SCALAR *scalars[] = {x0, y0, x1, y1, xs, ys};
   size_t scalar_len = BN_num_bytes(&group->order);
   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(scalars); i++) {
     uint8_t *buf;
@@ -206,6 +230,42 @@
   return 1;
 }
 
+static int pmbtoken_generate_key(const PMBTOKEN_METHOD *method,
+                                 CBB *out_private, CBB *out_public) {
+  EC_SCALAR x0, y0, x1, y1, xs, ys;
+  if (!ec_random_nonzero_scalar(method->group, &x0, kDefaultAdditionalData) ||
+      !ec_random_nonzero_scalar(method->group, &y0, kDefaultAdditionalData) ||
+      !ec_random_nonzero_scalar(method->group, &x1, kDefaultAdditionalData) ||
+      !ec_random_nonzero_scalar(method->group, &y1, kDefaultAdditionalData) ||
+      !ec_random_nonzero_scalar(method->group, &xs, kDefaultAdditionalData) ||
+      !ec_random_nonzero_scalar(method->group, &ys, kDefaultAdditionalData)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
+    return 0;
+  }
+
+  return pmbtoken_compute_keys(method, out_private, out_public, &x0, &y0, &x1,
+                               &y1, &xs, &ys);
+}
+
+static int pmbtoken_derive_key_from_secret(const PMBTOKEN_METHOD *method,
+                                           CBB *out_private, CBB *out_public,
+                                           const uint8_t *secret,
+                                           size_t secret_len) {
+  EC_SCALAR x0, y0, x1, y1, xs, ys;
+  if (!derive_scalar_from_secret(method, &x0, secret, secret_len, 0) ||
+      !derive_scalar_from_secret(method, &y0, secret, secret_len, 1) ||
+      !derive_scalar_from_secret(method, &x1, secret, secret_len, 2) ||
+      !derive_scalar_from_secret(method, &y1, secret, secret_len, 3) ||
+      !derive_scalar_from_secret(method, &xs, secret, secret_len, 4) ||
+      !derive_scalar_from_secret(method, &ys, secret, secret_len, 5)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
+    return 0;
+  }
+
+  return pmbtoken_compute_keys(method, out_private, out_public, &x0, &y0, &x1,
+                               &y1, &xs, &ys);
+}
+
 static int pmbtoken_client_key_from_bytes(const PMBTOKEN_METHOD *method,
                                           TRUST_TOKEN_CLIENT_KEY *key,
                                           const uint8_t *in, size_t len) {
@@ -1140,6 +1200,13 @@
       group, out, kHashCLabel, sizeof(kHashCLabel), buf, len);
 }
 
+static int pmbtoken_exp1_hash_to_scalar(const EC_GROUP *group, EC_SCALAR *out,
+                                        uint8_t *buf, size_t len) {
+  const uint8_t kHashLabel[] = "PMBTokens Experiment V1 HashToScalar";
+  return ec_hash_to_scalar_p384_xmd_sha512_draft07(
+      group, out, kHashLabel, sizeof(kHashLabel), buf, len);
+}
+
 static int pmbtoken_exp1_ok = 0;
 static PMBTOKEN_METHOD pmbtoken_exp1_method;
 static CRYPTO_once_t pmbtoken_exp1_method_once = CRYPTO_ONCE_INIT;
@@ -1159,10 +1226,10 @@
       0x87, 0xc3, 0x95, 0xd0, 0x13, 0xb7, 0x0b, 0x5c, 0xc7,
   };
 
-  pmbtoken_exp1_ok =
-      pmbtoken_init_method(&pmbtoken_exp1_method, NID_secp384r1, kH, sizeof(kH),
-                           pmbtoken_exp1_hash_t, pmbtoken_exp1_hash_s,
-                           pmbtoken_exp1_hash_c, 1);
+  pmbtoken_exp1_ok = pmbtoken_init_method(
+      &pmbtoken_exp1_method, NID_secp384r1, kH, sizeof(kH),
+      pmbtoken_exp1_hash_t, pmbtoken_exp1_hash_s, pmbtoken_exp1_hash_c,
+      pmbtoken_exp1_hash_to_scalar, 1);
 }
 
 static int pmbtoken_exp1_init_method(void) {
@@ -1182,6 +1249,17 @@
   return pmbtoken_generate_key(&pmbtoken_exp1_method, out_private, out_public);
 }
 
+int pmbtoken_exp1_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                         const uint8_t *secret,
+                                         size_t secret_len) {
+  if (!pmbtoken_exp1_init_method()) {
+    return 0;
+  }
+
+  return pmbtoken_derive_key_from_secret(&pmbtoken_exp1_method, out_private,
+                                         out_public, secret, secret_len);
+}
+
 int pmbtoken_exp1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                         const uint8_t *in, size_t len) {
   if (!pmbtoken_exp1_init_method()) {
@@ -1290,6 +1368,13 @@
       group, out, kHashCLabel, sizeof(kHashCLabel), buf, len);
 }
 
+static int pmbtoken_exp2_hash_to_scalar(const EC_GROUP *group, EC_SCALAR *out,
+                                        uint8_t *buf, size_t len) {
+  const uint8_t kHashLabel[] = "PMBTokens Experiment V2 HashToScalar";
+  return ec_hash_to_scalar_p384_xmd_sha512_draft07(
+      group, out, kHashLabel, sizeof(kHashLabel), buf, len);
+}
+
 static int pmbtoken_exp2_ok = 0;
 static PMBTOKEN_METHOD pmbtoken_exp2_method;
 static CRYPTO_once_t pmbtoken_exp2_method_once = CRYPTO_ONCE_INIT;
@@ -1309,10 +1394,10 @@
       0x25, 0x62, 0xbf, 0x59, 0xb2, 0xd2, 0x3d, 0x71, 0xff
   };
 
-  pmbtoken_exp2_ok =
-      pmbtoken_init_method(&pmbtoken_exp2_method, NID_secp384r1, kH, sizeof(kH),
-                           pmbtoken_exp2_hash_t, pmbtoken_exp2_hash_s,
-                           pmbtoken_exp2_hash_c, 0);
+  pmbtoken_exp2_ok = pmbtoken_init_method(
+      &pmbtoken_exp2_method, NID_secp384r1, kH, sizeof(kH),
+      pmbtoken_exp2_hash_t, pmbtoken_exp2_hash_s, pmbtoken_exp2_hash_c,
+      pmbtoken_exp2_hash_to_scalar, 0);
 }
 
 static int pmbtoken_exp2_init_method(void) {
@@ -1332,6 +1417,18 @@
   return pmbtoken_generate_key(&pmbtoken_exp2_method, out_private, out_public);
 }
 
+
+int pmbtoken_exp2_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                         const uint8_t *secret,
+                                         size_t secret_len) {
+  if (!pmbtoken_exp2_init_method()) {
+    return 0;
+  }
+
+  return pmbtoken_derive_key_from_secret(&pmbtoken_exp2_method, out_private,
+                                         out_public, secret, secret_len);
+}
+
 int pmbtoken_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                         const uint8_t *in, size_t len) {
   if (!pmbtoken_exp2_init_method()) {
diff --git a/src/crypto/trust_token/trust_token.c b/src/crypto/trust_token/trust_token.c
index 3334fba..5afb487 100644
--- a/src/crypto/trust_token/trust_token.c
+++ b/src/crypto/trust_token/trust_token.c
@@ -30,6 +30,7 @@
 const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v1(void) {
   static const TRUST_TOKEN_METHOD kMethod = {
       pmbtoken_exp1_generate_key,
+      pmbtoken_exp1_derive_key_from_secret,
       pmbtoken_exp1_client_key_from_bytes,
       pmbtoken_exp1_issuer_key_from_bytes,
       pmbtoken_exp1_blind,
@@ -46,6 +47,7 @@
 const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v2_voprf(void) {
   static const TRUST_TOKEN_METHOD kMethod = {
       voprf_exp2_generate_key,
+      voprf_exp2_derive_key_from_secret,
       voprf_exp2_client_key_from_bytes,
       voprf_exp2_issuer_key_from_bytes,
       voprf_exp2_blind,
@@ -62,6 +64,7 @@
 const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v2_pmb(void) {
   static const TRUST_TOKEN_METHOD kMethod = {
       pmbtoken_exp2_generate_key,
+      pmbtoken_exp2_derive_key_from_secret,
       pmbtoken_exp2_client_key_from_bytes,
       pmbtoken_exp2_issuer_key_from_bytes,
       pmbtoken_exp2_blind,
@@ -140,6 +143,43 @@
   return ret;
 }
 
+int TRUST_TOKEN_derive_key_from_secret(
+    const TRUST_TOKEN_METHOD *method, uint8_t *out_priv_key,
+    size_t *out_priv_key_len, size_t max_priv_key_len, uint8_t *out_pub_key,
+    size_t *out_pub_key_len, size_t max_pub_key_len, uint32_t id,
+    const uint8_t *secret, size_t secret_len) {
+  // Prepend the key ID in front of the PMBTokens format.
+  int ret = 0;
+  CBB priv_cbb, pub_cbb;
+  CBB_zero(&priv_cbb);
+  CBB_zero(&pub_cbb);
+  if (!CBB_init_fixed(&priv_cbb, out_priv_key, max_priv_key_len) ||
+      !CBB_init_fixed(&pub_cbb, out_pub_key, max_pub_key_len) ||
+      !CBB_add_u32(&priv_cbb, id) ||
+      !CBB_add_u32(&pub_cbb, id)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL);
+    goto err;
+  }
+
+  if (!method->derive_key_from_secret(&priv_cbb, &pub_cbb, secret,
+                                        secret_len)) {
+    goto err;
+  }
+
+  if (!CBB_finish(&priv_cbb, NULL, out_priv_key_len) ||
+      !CBB_finish(&pub_cbb, NULL, out_pub_key_len)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL);
+    goto err;
+  }
+
+  ret = 1;
+
+err:
+  CBB_cleanup(&priv_cbb);
+  CBB_cleanup(&pub_cbb);
+  return ret;
+}
+
 TRUST_TOKEN_CLIENT *TRUST_TOKEN_CLIENT_new(const TRUST_TOKEN_METHOD *method,
                                            size_t max_batchsize) {
   if (max_batchsize > 0xffff) {
diff --git a/src/crypto/trust_token/trust_token_test.cc b/src/crypto/trust_token/trust_token_test.cc
index f9f183d..5ab80cd 100644
--- a/src/crypto/trust_token/trust_token_test.cc
+++ b/src/crypto/trust_token/trust_token_test.cc
@@ -54,6 +54,73 @@
       TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001));
   ASSERT_EQ(292u, priv_key_len);
   ASSERT_EQ(301u, pub_key_len);
+
+  const uint8_t kKeygenSecret[] = "SEED";
+  ASSERT_TRUE(TRUST_TOKEN_derive_key_from_secret(
+      TRUST_TOKEN_experiment_v1(), priv_key, &priv_key_len,
+      TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE, pub_key, &pub_key_len,
+      TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001, kKeygenSecret,
+      sizeof(kKeygenSecret) - 1));
+
+  const uint8_t kExpectedPriv[] = {
+      0x00, 0x00, 0x00, 0x01, 0x98, 0xaa, 0x32, 0xfc, 0x5f, 0x83, 0x35, 0xea,
+      0x57, 0x4f, 0x9e, 0x61, 0x48, 0x6e, 0x89, 0x9d, 0x3d, 0xaa, 0x38, 0x5d,
+      0xd0, 0x06, 0x96, 0x62, 0xe8, 0x0b, 0xd6, 0x5f, 0x12, 0xa4, 0xcc, 0xa9,
+      0xb5, 0x20, 0x1b, 0x13, 0x8c, 0x1c, 0xaf, 0x36, 0x1b, 0xab, 0x0c, 0xc6,
+      0xac, 0x38, 0xae, 0x96, 0x3d, 0x14, 0x9d, 0xb8, 0x8d, 0xf4, 0x7f, 0xe2,
+      0x7d, 0xeb, 0x17, 0xc2, 0xbc, 0x63, 0x42, 0x93, 0x94, 0xe4, 0x97, 0xbf,
+      0x97, 0xea, 0x02, 0x40, 0xac, 0xb6, 0xa5, 0x03, 0x4c, 0x6b, 0x4c, 0xb8,
+      0x8c, 0xf4, 0x66, 0x1b, 0x4e, 0x02, 0x45, 0xf9, 0xcd, 0xb6, 0x0f, 0x59,
+      0x09, 0x21, 0x03, 0x7e, 0x92, 0x1f, 0x3f, 0x40, 0x83, 0x50, 0xe3, 0xdc,
+      0x9e, 0x6f, 0x65, 0xc5, 0xbd, 0x2c, 0x7d, 0xab, 0x74, 0x49, 0xc8, 0xa2,
+      0x3c, 0xab, 0xcb, 0x4d, 0x63, 0x73, 0x81, 0x2b, 0xb2, 0x1e, 0x00, 0x8f,
+      0x00, 0xb8, 0xd8, 0xb4, 0x5d, 0xc4, 0x3f, 0x3d, 0xa8, 0x4f, 0x4c, 0x72,
+      0x0e, 0x20, 0x17, 0x4b, 0xac, 0x14, 0x8f, 0xb2, 0xa5, 0x20, 0x41, 0x2b,
+      0xf7, 0x62, 0x25, 0x6a, 0xd6, 0x41, 0x26, 0x62, 0x10, 0xc1, 0xbc, 0x42,
+      0xac, 0x54, 0x1b, 0x75, 0x05, 0xd6, 0x53, 0xb1, 0x7b, 0x84, 0x6a, 0x7b,
+      0x5b, 0x2a, 0x34, 0x6e, 0x43, 0x4b, 0x43, 0xcc, 0x6c, 0xdb, 0x1d, 0x02,
+      0x34, 0x7f, 0xd1, 0xe8, 0xfd, 0x42, 0x2c, 0xd9, 0x14, 0xdb, 0xd6, 0xf4,
+      0xad, 0xb5, 0xe4, 0xac, 0xdd, 0x7e, 0xb5, 0x4c, 0x3f, 0x59, 0x24, 0xfa,
+      0x04, 0xd9, 0xb6, 0xd2, 0xb7, 0x7d, 0xf1, 0xfa, 0x13, 0xc0, 0x4d, 0xd5,
+      0xca, 0x3a, 0x4e, 0xa8, 0xdd, 0xa9, 0xfc, 0xcb, 0x06, 0xb2, 0xde, 0x4b,
+      0x2a, 0x86, 0xbb, 0x0d, 0x41, 0xb6, 0x3d, 0xfb, 0x49, 0xc8, 0xdf, 0x9a,
+      0x48, 0xe5, 0x68, 0x8a, 0xfc, 0x86, 0x9c, 0x79, 0x5a, 0x79, 0xc1, 0x09,
+      0x33, 0x53, 0xdc, 0x3d, 0xe9, 0x93, 0x7c, 0x5b, 0x72, 0xf7, 0xa0, 0x8a,
+      0x1f, 0x07, 0x6c, 0x38, 0x3c, 0x99, 0x0b, 0xe4, 0x4e, 0xa4, 0xbd, 0x41,
+      0x1f, 0x83, 0xa6, 0xd3
+  };
+  ASSERT_EQ(Bytes(kExpectedPriv, sizeof(kExpectedPriv)),
+            Bytes(priv_key, priv_key_len));
+
+  const uint8_t kExpectedPub[] = {
+      0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0x04, 0x5e, 0x06, 0x6b, 0x7b, 0xfd,
+      0x54, 0x01, 0xe0, 0xd2, 0xb5, 0x12, 0xce, 0x48, 0x16, 0x66, 0xb2, 0xdf,
+      0xfd, 0xa8, 0x38, 0x7c, 0x1f, 0x45, 0x1a, 0xb8, 0x21, 0x52, 0x17, 0x25,
+      0xbb, 0x0b, 0x00, 0xd4, 0xa1, 0xbc, 0x28, 0xd9, 0x08, 0x36, 0x98, 0xb2,
+      0x17, 0xd3, 0xb5, 0xad, 0xb6, 0x4e, 0x03, 0x5f, 0xd3, 0x66, 0x2c, 0x58,
+      0x1c, 0xcc, 0xc6, 0x23, 0xa4, 0xf9, 0xa2, 0x7e, 0xb0, 0xe4, 0xd3, 0x95,
+      0x41, 0x6f, 0xba, 0x23, 0x4a, 0x82, 0x93, 0x29, 0x73, 0x75, 0x38, 0x85,
+      0x64, 0x9c, 0xaa, 0x12, 0x6d, 0x7d, 0xcd, 0x52, 0x02, 0x91, 0x9f, 0xa9,
+      0xee, 0x4b, 0xfd, 0x68, 0x97, 0x40, 0xdc, 0x00, 0x61, 0x04, 0x14, 0x16,
+      0x39, 0xf9, 0x63, 0x66, 0x94, 0x03, 0xfa, 0x0b, 0xbf, 0xca, 0x5a, 0x39,
+      0x9f, 0x27, 0x5b, 0x3f, 0x69, 0x7a, 0xc9, 0xf7, 0x25, 0x7c, 0x84, 0x9e,
+      0x1d, 0x61, 0x5a, 0x24, 0x53, 0xf2, 0x4a, 0x9d, 0xe9, 0x05, 0x53, 0xfd,
+      0x12, 0x01, 0x2d, 0x9a, 0x69, 0x50, 0x74, 0x82, 0xa3, 0x45, 0x73, 0xdc,
+      0x34, 0x36, 0x31, 0x44, 0x07, 0x0c, 0xda, 0x13, 0xbe, 0x94, 0x37, 0x65,
+      0xa0, 0xab, 0x16, 0x52, 0x90, 0xe5, 0x8a, 0x03, 0xe5, 0x98, 0x79, 0x14,
+      0x79, 0xd5, 0x17, 0xee, 0xd4, 0xb8, 0xda, 0x77, 0x76, 0x03, 0x20, 0x2a,
+      0x7e, 0x3b, 0x76, 0x0b, 0x23, 0xb7, 0x72, 0x77, 0xb2, 0xeb, 0x00, 0x61,
+      0x04, 0x68, 0x18, 0x4d, 0x23, 0x23, 0xf4, 0x45, 0xb8, 0x81, 0x0d, 0xa4,
+      0x5d, 0x0b, 0x9e, 0x08, 0xfb, 0x45, 0xfb, 0x96, 0x29, 0x43, 0x2f, 0xab,
+      0x93, 0x04, 0x4c, 0x04, 0xb6, 0x5e, 0x27, 0xf5, 0x39, 0x66, 0x94, 0x15,
+      0x1d, 0xb1, 0x1c, 0x7c, 0x27, 0x6f, 0xa5, 0x19, 0x0c, 0x30, 0x12, 0xcc,
+      0x77, 0x7f, 0x10, 0xa9, 0x7c, 0xe4, 0x08, 0x77, 0x3c, 0xd3, 0x6f, 0xa4,
+      0xf4, 0xaf, 0xf1, 0x9d, 0x14, 0x1d, 0xd0, 0x02, 0x33, 0x50, 0x55, 0x00,
+      0x6a, 0x47, 0x96, 0xe1, 0x8b, 0x4e, 0x44, 0x41, 0xad, 0xb3, 0xea, 0x0d,
+      0x0d, 0xd5, 0x73, 0x8e, 0x62, 0x67, 0x8a, 0xb4, 0xe7, 0x5d, 0x17, 0xa9,
+      0x24};
+  ASSERT_EQ(Bytes(kExpectedPub, sizeof(kExpectedPub)),
+            Bytes(pub_key, pub_key_len));
 }
 
 TEST(TrustTokenTest, KeyGenExp2VOPRF) {
@@ -66,6 +133,37 @@
       TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001));
   ASSERT_EQ(52u, priv_key_len);
   ASSERT_EQ(101u, pub_key_len);
+
+  const uint8_t kKeygenSecret[] = "SEED";
+  ASSERT_TRUE(TRUST_TOKEN_derive_key_from_secret(
+      TRUST_TOKEN_experiment_v2_voprf(), priv_key, &priv_key_len,
+      TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE, pub_key, &pub_key_len,
+      TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001, kKeygenSecret,
+      sizeof(kKeygenSecret) - 1));
+
+  const uint8_t kExpectedPriv[] = {
+      0x00, 0x00, 0x00, 0x01, 0x0b, 0xe2, 0xc4, 0x73, 0x92, 0xe7, 0xf8,
+      0x3e, 0xba, 0xab, 0x85, 0xa7, 0x77, 0xd7, 0x0a, 0x02, 0xc5, 0x36,
+      0xfe, 0x62, 0xa3, 0xca, 0x01, 0x75, 0xc7, 0x62, 0x19, 0xc7, 0xf0,
+      0x30, 0xc5, 0x14, 0x60, 0x13, 0x97, 0x4f, 0x63, 0x05, 0x37, 0x92,
+      0x7b, 0x76, 0x8e, 0x9f, 0xd0, 0x1a, 0x74, 0x44
+  };
+  ASSERT_EQ(Bytes(kExpectedPriv, sizeof(kExpectedPriv)),
+            Bytes(priv_key, priv_key_len));
+
+  const uint8_t kExpectedPub[] = {
+      0x00, 0x00, 0x00, 0x01, 0x04, 0x2c, 0x9c, 0x11, 0xc1, 0xe5, 0x52, 0x59,
+      0x0b, 0x6d, 0x88, 0x8b, 0x6e, 0x28, 0xe8, 0xc5, 0xa3, 0xbe, 0x48, 0x18,
+      0xf7, 0x1d, 0x31, 0xcf, 0xa2, 0x6e, 0x2a, 0xd6, 0xcb, 0x83, 0x26, 0x04,
+      0xbd, 0x93, 0x67, 0xe4, 0x53, 0xf6, 0x11, 0x7d, 0x45, 0xe9, 0xfe, 0x27,
+      0x33, 0x90, 0xdb, 0x1b, 0xfc, 0x9b, 0x31, 0x4d, 0x39, 0x1f, 0x1f, 0x8c,
+      0x43, 0x06, 0x70, 0x2c, 0x84, 0xdc, 0x23, 0x18, 0xc7, 0x6a, 0x58, 0xcf,
+      0x9e, 0xc1, 0xfa, 0xf2, 0x30, 0xdd, 0xad, 0x62, 0x24, 0xde, 0x11, 0xc1,
+      0xba, 0x8d, 0xc3, 0x4f, 0xfb, 0xe5, 0xa5, 0xd4, 0x37, 0xba, 0x3b, 0x70,
+      0xc0, 0xc3, 0xef, 0x20, 0x43
+  };
+  ASSERT_EQ(Bytes(kExpectedPub, sizeof(kExpectedPub)),
+            Bytes(pub_key, pub_key_len));
 }
 
 TEST(TrustTokenTest, KeyGenExp2PMB) {
@@ -78,6 +176,73 @@
       TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001));
   ASSERT_EQ(292u, priv_key_len);
   ASSERT_EQ(295u, pub_key_len);
+
+  const uint8_t kKeygenSecret[] = "SEED";
+  ASSERT_TRUE(TRUST_TOKEN_derive_key_from_secret(
+      TRUST_TOKEN_experiment_v2_pmb(), priv_key, &priv_key_len,
+      TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE, pub_key, &pub_key_len,
+      TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE, 0x0001, kKeygenSecret,
+      sizeof(kKeygenSecret) - 1));
+
+  const uint8_t kExpectedPriv[] = {
+      0x00, 0x00, 0x00, 0x01, 0x1b, 0x74, 0xdc, 0xf0, 0xa9, 0xa7, 0x6c, 0xfb,
+      0x41, 0xef, 0xfa, 0x65, 0x52, 0xc9, 0x86, 0x4e, 0xfb, 0x16, 0x9d, 0xea,
+      0x62, 0x3f, 0x47, 0xab, 0x1f, 0x1b, 0x05, 0xf2, 0x4f, 0x05, 0xfe, 0x64,
+      0xb7, 0xe8, 0xcd, 0x2a, 0x10, 0xfa, 0xa2, 0x48, 0x3f, 0x0e, 0x8b, 0x94,
+      0x39, 0xf1, 0xe7, 0x53, 0xe9, 0x50, 0x29, 0xe2, 0xb7, 0x0e, 0xc0, 0x94,
+      0xa9, 0xd3, 0xef, 0x64, 0x10, 0x1d, 0x08, 0xd0, 0x60, 0xcb, 0x6d, 0x97,
+      0x68, 0xc7, 0x04, 0x92, 0x07, 0xb2, 0x22, 0x83, 0xf7, 0xd9, 0x9b, 0x2c,
+      0xf2, 0x52, 0x34, 0x0c, 0x42, 0x31, 0x47, 0x41, 0x19, 0xb9, 0xee, 0xfc,
+      0x46, 0xbd, 0x14, 0xce, 0x42, 0xd7, 0x43, 0xc8, 0x32, 0x3b, 0x24, 0xed,
+      0xdc, 0x69, 0xa3, 0x8e, 0x29, 0x01, 0xbe, 0xae, 0x24, 0x39, 0x14, 0xa7,
+      0x52, 0xe5, 0xd5, 0xff, 0x9a, 0xc4, 0x15, 0x79, 0x29, 0x4c, 0x9b, 0x4e,
+      0xfc, 0x61, 0xf2, 0x12, 0x6f, 0x4f, 0xd3, 0x96, 0x28, 0xb0, 0x79, 0xf0,
+      0x4e, 0x6e, 0x7d, 0x56, 0x19, 0x1b, 0xc2, 0xd7, 0xf9, 0x3a, 0x58, 0x06,
+      0xe5, 0xec, 0xa4, 0x33, 0x14, 0x1c, 0x78, 0x0c, 0x83, 0x94, 0x34, 0x22,
+      0x5a, 0x8e, 0x2e, 0xa1, 0x72, 0x4a, 0x03, 0x35, 0xfe, 0x46, 0x92, 0x41,
+      0x6b, 0xe6, 0x4b, 0x3f, 0xf0, 0xe7, 0x0b, 0xb5, 0xf3, 0x66, 0x6c, 0xc6,
+      0x14, 0xcf, 0xce, 0x32, 0x0a, 0x2c, 0x28, 0xba, 0x4e, 0xb9, 0x75, 0x4a,
+      0xa9, 0x2d, 0xb0, 0x8c, 0xd0, 0x62, 0x52, 0x29, 0x1f, 0x12, 0xfd, 0xfb,
+      0xd3, 0x2a, 0x36, 0x0f, 0x89, 0x32, 0x86, 0x25, 0x56, 0xb9, 0xe7, 0x3c,
+      0xeb, 0xb4, 0x84, 0x41, 0x2b, 0xa8, 0xf3, 0xa5, 0x3d, 0xfe, 0x56, 0x94,
+      0x5b, 0x74, 0xb3, 0x5b, 0x27, 0x3f, 0xe7, 0xcf, 0xe4, 0xf8, 0x15, 0x95,
+      0x2a, 0xd2, 0x5f, 0x92, 0xb4, 0x6a, 0x89, 0xa5, 0x54, 0xbd, 0x27, 0x5e,
+      0xeb, 0x43, 0x07, 0x9b, 0x2b, 0x8b, 0x22, 0x59, 0x13, 0x4b, 0x9c, 0x56,
+      0xd8, 0x63, 0xd9, 0xe6, 0x85, 0x15, 0x2c, 0x82, 0x52, 0x40, 0x8f, 0xb1,
+      0xe7, 0x56, 0x07, 0x98
+  };
+  ASSERT_EQ(Bytes(kExpectedPriv, sizeof(kExpectedPriv)),
+            Bytes(priv_key, priv_key_len));
+
+  const uint8_t kExpectedPub[] = {
+      0x00, 0x00, 0x00, 0x01, 0x04, 0x48, 0xb1, 0x2d, 0xdd, 0x03, 0x32, 0xeb,
+      0x93, 0x31, 0x3d, 0x59, 0x74, 0xf0, 0xcf, 0xaa, 0xa5, 0x39, 0x5f, 0x53,
+      0xc4, 0x94, 0x98, 0xbe, 0x8f, 0x22, 0xd7, 0x30, 0xde, 0x1e, 0xb4, 0xf3,
+      0x32, 0x23, 0x90, 0x0b, 0xa6, 0x37, 0x4a, 0x4b, 0x44, 0xb3, 0x26, 0x52,
+      0x93, 0x7b, 0x4b, 0xa4, 0x79, 0xe8, 0x77, 0x6a, 0x19, 0x81, 0x2a, 0xdd,
+      0x91, 0xfb, 0x90, 0x8b, 0x24, 0xb5, 0xbe, 0x20, 0x2e, 0xe8, 0xbc, 0xd3,
+      0x83, 0x6c, 0xa8, 0xc5, 0xa1, 0x9a, 0x5b, 0x5e, 0x60, 0xda, 0x45, 0x2e,
+      0x31, 0x7f, 0x54, 0x0e, 0x14, 0x40, 0xd2, 0x4d, 0x40, 0x2e, 0x21, 0x79,
+      0xfc, 0x77, 0xdd, 0xc7, 0x2d, 0x04, 0xfe, 0xc6, 0xe3, 0xcf, 0x99, 0xef,
+      0x88, 0xab, 0x76, 0x86, 0x16, 0x14, 0xed, 0x72, 0x35, 0xa7, 0x05, 0x13,
+      0x9f, 0x2c, 0x53, 0xd5, 0xdf, 0x66, 0x75, 0x2e, 0x68, 0xdc, 0xd4, 0xc4,
+      0x00, 0x36, 0x08, 0x6d, 0xb7, 0x15, 0xf7, 0xe5, 0x32, 0x59, 0x81, 0x16,
+      0x57, 0xaa, 0x72, 0x06, 0xf0, 0xad, 0xd1, 0x85, 0xa0, 0x04, 0xd4, 0x11,
+      0x95, 0x1d, 0xac, 0x0b, 0x25, 0xbe, 0x59, 0xa2, 0xb3, 0x30, 0xee, 0x97,
+      0x07, 0x2a, 0x51, 0x15, 0xc1, 0x8d, 0xa8, 0xa6, 0x57, 0x9a, 0x4e, 0xbf,
+      0xd7, 0x2d, 0x35, 0x07, 0x6b, 0xd6, 0xc9, 0x3c, 0xe4, 0xcf, 0x0b, 0x14,
+      0x3e, 0x10, 0x51, 0x77, 0xd6, 0x84, 0x04, 0xbe, 0xd1, 0xd5, 0xa8, 0xf3,
+      0x9d, 0x1d, 0x4f, 0xc1, 0xc9, 0xf1, 0x0c, 0x6d, 0xb6, 0xcb, 0xe2, 0x05,
+      0x0b, 0x9c, 0x7a, 0x3a, 0x9a, 0x99, 0xe9, 0xa1, 0x93, 0xdc, 0x72, 0x2e,
+      0xef, 0xf3, 0x8d, 0xb9, 0x7b, 0xb0, 0x19, 0x24, 0x95, 0x0d, 0x68, 0xa7,
+      0xe0, 0xaa, 0x0b, 0xb1, 0xd1, 0xcc, 0x52, 0x14, 0xf9, 0x6c, 0x91, 0x59,
+      0xe4, 0xe1, 0x9b, 0xf9, 0x12, 0x39, 0xb1, 0x79, 0xbb, 0x21, 0x92, 0x00,
+      0xa4, 0x89, 0xf5, 0xbd, 0xd7, 0x89, 0x27, 0x40, 0xdc, 0xb1, 0x09, 0x38,
+      0x63, 0x91, 0x8c, 0xa5, 0x27, 0x27, 0x97, 0x39, 0x35, 0xfa, 0x1a, 0x8a,
+      0xa7, 0xe5, 0xc4, 0xd8, 0xbf, 0xe7, 0xbe
+  };
+  ASSERT_EQ(Bytes(kExpectedPub, sizeof(kExpectedPub)),
+            Bytes(pub_key, pub_key_len));
 }
 
 // Test that H in |TRUST_TOKEN_experiment_v1| was computed correctly.
@@ -854,7 +1019,7 @@
                           &key->key.y1, &key->key.xs, &key->key.ys};
 
   // Corrupt private key scalar.
-  scalars[corrupted_key()]->bytes[0] ^= 42;
+  scalars[corrupted_key()]->words[0] ^= 42;
 
   size_t tokens_issued;
   ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(
diff --git a/src/crypto/trust_token/voprf.c b/src/crypto/trust_token/voprf.c
index f93ee9c..cedee1e 100644
--- a/src/crypto/trust_token/voprf.c
+++ b/src/crypto/trust_token/voprf.c
@@ -110,20 +110,18 @@
   return 1;
 }
 
-static int voprf_generate_key(const VOPRF_METHOD *method, CBB *out_private,
-                              CBB *out_public) {
+static int voprf_calculate_key(const VOPRF_METHOD *method, CBB *out_private,
+                               CBB *out_public, const EC_SCALAR *priv) {
   const EC_GROUP *group = method->group;
   EC_RAW_POINT pub;
-  EC_SCALAR priv;
   EC_AFFINE pub_affine;
-  if (!ec_random_nonzero_scalar(group, &priv, kDefaultAdditionalData) ||
-      !ec_point_mul_scalar_base(group, &pub, &priv) ||
+  if (!ec_point_mul_scalar_base(group, &pub, priv) ||
       !ec_jacobian_to_affine(group, &pub_affine, &pub)) {
     OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
     return 0;
   }
 
-  if (!scalar_to_cbb(out_private, group, &priv) ||
+  if (!scalar_to_cbb(out_private, group, priv) ||
       !cbb_add_point(out_public, group, &pub_affine)) {
     OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL);
     return 0;
@@ -132,6 +130,46 @@
   return 1;
 }
 
+
+static int voprf_generate_key(const VOPRF_METHOD *method, CBB *out_private,
+                              CBB *out_public) {
+  EC_SCALAR priv;
+  if (!ec_random_nonzero_scalar(method->group, &priv, kDefaultAdditionalData)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
+    return 0;
+  }
+  return voprf_calculate_key(method, out_private, out_public, &priv);
+}
+
+static int voprf_derive_key_from_secret(const VOPRF_METHOD *method,
+                                        CBB *out_private, CBB *out_public,
+                                        const uint8_t *secret,
+                                        size_t secret_len) {
+  static const uint8_t kKeygenLabel[] = "TrustTokenVOPRFKeyGen";
+
+  EC_SCALAR priv;
+  int ok = 0;
+  CBB cbb;
+  CBB_zero(&cbb);
+  uint8_t *buf = NULL;
+  size_t len;
+  if (!CBB_init(&cbb, 0) ||
+      !CBB_add_bytes(&cbb, kKeygenLabel, sizeof(kKeygenLabel)) ||
+      !CBB_add_bytes(&cbb, secret, secret_len) ||
+      !CBB_finish(&cbb, &buf, &len) ||
+      !method->hash_to_scalar(method->group, &priv, buf, len)) {
+    OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_KEYGEN_FAILURE);
+    goto err;
+  }
+
+  ok = voprf_calculate_key(method, out_private, out_public, &priv);
+
+err:
+  CBB_cleanup(&cbb);
+  OPENSSL_free(buf);
+  return ok;
+}
+
 static int voprf_client_key_from_bytes(const VOPRF_METHOD *method,
                                        TRUST_TOKEN_CLIENT_KEY *key,
                                        const uint8_t *in, size_t len) {
@@ -711,6 +749,17 @@
   return voprf_generate_key(&voprf_exp2_method, out_private, out_public);
 }
 
+int voprf_exp2_derive_key_from_secret(CBB *out_private, CBB *out_public,
+                                      const uint8_t *secret,
+                                      size_t secret_len) {
+  if (!voprf_exp2_init_method()) {
+    return 0;
+  }
+
+  return voprf_derive_key_from_secret(&voprf_exp2_method, out_private,
+                                      out_public, secret, secret_len);
+}
+
 int voprf_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key,
                                      const uint8_t *in, size_t len) {
   if (!voprf_exp2_init_method()) {
diff --git a/src/crypto/x509/a_digest.c b/src/crypto/x509/a_digest.c
index b88d6ac..d7dcecc 100644
--- a/src/crypto/x509/a_digest.c
+++ b/src/crypto/x509/a_digest.c
@@ -62,35 +62,34 @@
 #include <openssl/mem.h>
 
 int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
-                unsigned char *md, unsigned int *len)
-{
-    int i, ret;
-    unsigned char *str, *p;
+                unsigned char *md, unsigned int *len) {
+  int i, ret;
+  unsigned char *str, *p;
 
-    i = i2d(data, NULL);
-    if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return (0);
-    }
-    p = str;
-    i2d(data, &p);
+  i = i2d(data, NULL);
+  if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  p = str;
+  i2d(data, &p);
 
-    ret = EVP_Digest(str, i, md, len, type, NULL);
-    OPENSSL_free(str);
-    return ret;
+  ret = EVP_Digest(str, i, md, len, type, NULL);
+  OPENSSL_free(str);
+  return ret;
 }
 
 int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *asn,
-                     unsigned char *md, unsigned int *len)
-{
-    int i, ret;
-    unsigned char *str = NULL;
+                     unsigned char *md, unsigned int *len) {
+  int i, ret;
+  unsigned char *str = NULL;
 
-    i = ASN1_item_i2d(asn, &str, it);
-    if (!str)
-        return (0);
+  i = ASN1_item_i2d(asn, &str, it);
+  if (!str) {
+    return 0;
+  }
 
-    ret = EVP_Digest(str, i, md, len, type, NULL);
-    OPENSSL_free(str);
-    return ret;
+  ret = EVP_Digest(str, i, md, len, type, NULL);
+  OPENSSL_free(str);
+  return ret;
 }
diff --git a/src/crypto/x509/a_sign.c b/src/crypto/x509/a_sign.c
index 6c7f713..3711a00 100644
--- a/src/crypto/x509/a_sign.c
+++ b/src/crypto/x509/a_sign.c
@@ -64,65 +64,65 @@
 
 #include "internal.h"
 
-int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1,
-                   X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *asn,
-                   EVP_PKEY *pkey, const EVP_MD *type)
-{
-    EVP_MD_CTX ctx;
-    EVP_MD_CTX_init(&ctx);
-    if (!EVP_DigestSignInit(&ctx, NULL, type, NULL, pkey)) {
-        EVP_MD_CTX_cleanup(&ctx);
-        return 0;
-    }
-    return ASN1_item_sign_ctx(it, algor1, algor2, signature, asn, &ctx);
+int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2,
+                   ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey,
+                   const EVP_MD *type) {
+  if (signature->type != V_ASN1_BIT_STRING) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+    return 0;
+  }
+  EVP_MD_CTX ctx;
+  EVP_MD_CTX_init(&ctx);
+  if (!EVP_DigestSignInit(&ctx, NULL, type, NULL, pkey)) {
+    EVP_MD_CTX_cleanup(&ctx);
+    return 0;
+  }
+  return ASN1_item_sign_ctx(it, algor1, algor2, signature, asn, &ctx);
 }
 
-int ASN1_item_sign_ctx(const ASN1_ITEM *it,
-                       X509_ALGOR *algor1, X509_ALGOR *algor2,
-                       ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx)
-{
-    EVP_PKEY *pkey;
-    unsigned char *buf_in = NULL, *buf_out = NULL;
-    size_t inl = 0, outl = 0;
+int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1,
+                       X509_ALGOR *algor2, ASN1_BIT_STRING *signature,
+                       void *asn, EVP_MD_CTX *ctx) {
+  EVP_PKEY *pkey;
+  unsigned char *buf_in = NULL, *buf_out = NULL;
+  size_t inl = 0, outl = 0;
 
-    pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
+  if (signature->type != V_ASN1_BIT_STRING) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+    goto err;
+  }
 
-    /* Write out the requested copies of the AlgorithmIdentifier. */
-    if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) {
-        goto err;
-    }
-    if (algor2 && !x509_digest_sign_algorithm(ctx, algor2)) {
-        goto err;
-    }
+  pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
 
-    inl = ASN1_item_i2d(asn, &buf_in, it);
-    outl = EVP_PKEY_size(pkey);
-    buf_out = OPENSSL_malloc((unsigned int)outl);
-    if ((buf_in == NULL) || (buf_out == NULL)) {
-        outl = 0;
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
+  // Write out the requested copies of the AlgorithmIdentifier.
+  if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) {
+    goto err;
+  }
+  if (algor2 && !x509_digest_sign_algorithm(ctx, algor2)) {
+    goto err;
+  }
 
-    if (!EVP_DigestSign(ctx, buf_out, &outl, buf_in, inl)) {
-        outl = 0;
-        OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
-        goto err;
-    }
-    if (signature->data != NULL)
-        OPENSSL_free(signature->data);
-    signature->data = buf_out;
-    buf_out = NULL;
-    signature->length = outl;
-    /*
-     * In the interests of compatibility, I'll make sure that the bit string
-     * has a 'not-used bits' value of 0
-     */
-    signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
-    signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
- err:
-    EVP_MD_CTX_cleanup(ctx);
-    OPENSSL_free(buf_in);
-    OPENSSL_free(buf_out);
-    return (outl);
+  inl = ASN1_item_i2d(asn, &buf_in, it);
+  outl = EVP_PKEY_size(pkey);
+  buf_out = OPENSSL_malloc((unsigned int)outl);
+  if ((buf_in == NULL) || (buf_out == NULL)) {
+    outl = 0;
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+
+  if (!EVP_DigestSign(ctx, buf_out, &outl, buf_in, inl)) {
+    outl = 0;
+    OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
+    goto err;
+  }
+  ASN1_STRING_set0(signature, buf_out, outl);
+  buf_out = NULL;
+  signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+  signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+err:
+  EVP_MD_CTX_cleanup(ctx);
+  OPENSSL_free(buf_in);
+  OPENSSL_free(buf_out);
+  return outl;
 }
diff --git a/src/crypto/x509/a_verify.c b/src/crypto/x509/a_verify.c
index ec671c0..af2c914 100644
--- a/src/crypto/x509/a_verify.c
+++ b/src/crypto/x509/a_verify.c
@@ -57,7 +57,6 @@
 #include <openssl/x509.h>
 
 #include <stdio.h>
-#include <time.h>
 #include <sys/types.h>
 
 #include <openssl/bn.h>
@@ -72,47 +71,47 @@
 int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *a,
                      const ASN1_BIT_STRING *signature, void *asn,
                      EVP_PKEY *pkey) {
-    if (!pkey) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-        return 0;
+  if (!pkey) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
+    return 0;
+  }
+
+  size_t sig_len;
+  if (signature->type == V_ASN1_BIT_STRING) {
+    if (!ASN1_BIT_STRING_num_bytes(signature, &sig_len)) {
+      OPENSSL_PUT_ERROR(X509, X509_R_INVALID_BIT_STRING_BITS_LEFT);
+      return 0;
     }
+  } else {
+    sig_len = (size_t)ASN1_STRING_length(signature);
+  }
 
-    size_t sig_len;
-    if (signature->type == V_ASN1_BIT_STRING) {
-        if (!ASN1_BIT_STRING_num_bytes(signature, &sig_len)) {
-            OPENSSL_PUT_ERROR(X509, X509_R_INVALID_BIT_STRING_BITS_LEFT);
-            return 0;
-        }
-    } else {
-        sig_len = (size_t)ASN1_STRING_length(signature);
-    }
+  EVP_MD_CTX ctx;
+  uint8_t *buf_in = NULL;
+  int ret = 0, inl = 0;
+  EVP_MD_CTX_init(&ctx);
 
-    EVP_MD_CTX ctx;
-    uint8_t *buf_in = NULL;
-    int ret = 0, inl = 0;
-    EVP_MD_CTX_init(&ctx);
+  if (!x509_digest_verify_init(&ctx, a, pkey)) {
+    goto err;
+  }
 
-    if (!x509_digest_verify_init(&ctx, a, pkey)) {
-        goto err;
-    }
+  inl = ASN1_item_i2d(asn, &buf_in, it);
 
-    inl = ASN1_item_i2d(asn, &buf_in, it);
+  if (buf_in == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
 
-    if (buf_in == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
+  if (!EVP_DigestVerify(&ctx, ASN1_STRING_get0_data(signature), sig_len, buf_in,
+                        inl)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
+    goto err;
+  }
 
-    if (!EVP_DigestVerify(&ctx, ASN1_STRING_get0_data(signature), sig_len,
-                          buf_in, inl)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
-        goto err;
-    }
-
-    ret = 1;
+  ret = 1;
 
 err:
-    OPENSSL_free(buf_in);
-    EVP_MD_CTX_cleanup(&ctx);
-    return ret;
+  OPENSSL_free(buf_in);
+  EVP_MD_CTX_cleanup(&ctx);
+  return ret;
 }
diff --git a/src/crypto/x509/algorithm.c b/src/crypto/x509/algorithm.c
index 7f90480..16235ee 100644
--- a/src/crypto/x509/algorithm.c
+++ b/src/crypto/x509/algorithm.c
@@ -64,6 +64,15 @@
 
 #include "internal.h"
 
+// Restrict the digests that are allowed in X509 certificates
+static int x509_digest_nid_ok(const int digest_nid) {
+  switch (digest_nid) {
+    case NID_md4:
+    case NID_md5:
+      return 0;
+  }
+  return 1;
+}
 
 int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) {
   EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
@@ -77,7 +86,7 @@
     if (!EVP_PKEY_CTX_get_rsa_padding(ctx->pctx, &pad_mode)) {
       return 0;
     }
-    /* RSA-PSS has special signature algorithm logic. */
+    // RSA-PSS has special signature algorithm logic.
     if (pad_mode == RSA_PKCS1_PSS_PADDING) {
       return x509_rsa_ctx_to_pss(ctx, algor);
     }
@@ -87,23 +96,24 @@
     return X509_ALGOR_set0(algor, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, NULL);
   }
 
-  /* Default behavior: look up the OID for the algorithm/hash pair and encode
-   * that. */
+  // Default behavior: look up the OID for the algorithm/hash pair and encode
+  // that.
   const EVP_MD *digest = EVP_MD_CTX_md(ctx);
   if (digest == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_CONTEXT_NOT_INITIALISED);
     return 0;
   }
 
+  const int digest_nid = EVP_MD_type(digest);
   int sign_nid;
-  if (!OBJ_find_sigid_by_algs(&sign_nid, EVP_MD_type(digest),
-                              EVP_PKEY_id(pkey))) {
+  if (!x509_digest_nid_ok(digest_nid) ||
+      !OBJ_find_sigid_by_algs(&sign_nid, digest_nid, EVP_PKEY_id(pkey))) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED);
     return 0;
   }
 
-  /* RSA signature algorithms include an explicit NULL parameter. Others omit
-   * it. */
+  // RSA signature algorithms include an explicit NULL parameter. Others omit
+  // it.
   int paramtype =
       (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) ? V_ASN1_NULL : V_ASN1_UNDEF;
   X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, NULL);
@@ -112,7 +122,7 @@
 
 int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                             EVP_PKEY *pkey) {
-  /* Convert the signature OID into digest and public key OIDs. */
+  // Convert the signature OID into digest and public key OIDs.
   int sigalg_nid = OBJ_obj2nid(sigalg->algorithm);
   int digest_nid, pkey_nid;
   if (!OBJ_find_sigid_algs(sigalg_nid, &digest_nid, &pkey_nid)) {
@@ -120,13 +130,19 @@
     return 0;
   }
 
-  /* Check the public key OID matches the public key type. */
+  // Check the public key OID matches the public key type.
   if (pkey_nid != EVP_PKEY_id(pkey)) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE);
     return 0;
   }
 
-  /* NID_undef signals that there are custom parameters to set. */
+  // Check for permitted digest algorithms
+  if (!x509_digest_nid_ok(digest_nid)) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED);
+    return 0;
+  }
+
+  // NID_undef signals that there are custom parameters to set.
   if (digest_nid == NID_undef) {
     if (sigalg_nid == NID_rsassaPss) {
       return x509_rsa_pss_to_ctx(ctx, sigalg, pkey);
@@ -142,17 +158,17 @@
     return 0;
   }
 
-  /* The parameter should be an explicit NULL for RSA and omitted for ECDSA. For
-   * compatibility, we allow either for both algorithms. See b/167375496.
-   *
-   * TODO(davidben): Chromium's verifier allows both forms for RSA, but enforces
-   * ECDSA more strictly. Align with Chromium and add a flag for b/167375496. */
+  // The parameter should be an explicit NULL for RSA and omitted for ECDSA. For
+  // compatibility, we allow either for both algorithms. See b/167375496.
+  //
+  // TODO(davidben): Chromium's verifier allows both forms for RSA, but enforces
+  // ECDSA more strictly. Align with Chromium and add a flag for b/167375496.
   if (sigalg->parameter != NULL && sigalg->parameter->type != V_ASN1_NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PARAMETER);
     return 0;
   }
 
-  /* Otherwise, initialize with the digest from the OID. */
+  // Otherwise, initialize with the digest from the OID.
   const EVP_MD *digest = EVP_get_digestbynid(digest_nid);
   if (digest == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
diff --git a/src/crypto/x509/asn1_gen.c b/src/crypto/x509/asn1_gen.c
index cd8185b..8107995 100644
--- a/src/crypto/x509/asn1_gen.c
+++ b/src/crypto/x509/asn1_gen.c
@@ -64,657 +64,641 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
+#include "../conf/internal.h"
 #include "../internal.h"
 #include "../x509v3/internal.h"
 #include "internal.h"
 
-/*
- * Although this file is in crypto/x509 for layering purposes, it emits
- * errors from the ASN.1 module for OpenSSL compatibility.
- */
+// Although this file is in crypto/x509 for layering purposes, it emits
+// errors from the ASN.1 module for OpenSSL compatibility.
 
-#define ASN1_GEN_FLAG           0x10000
-#define ASN1_GEN_FLAG_IMP       (ASN1_GEN_FLAG|1)
-#define ASN1_GEN_FLAG_EXP       (ASN1_GEN_FLAG|2)
-#define ASN1_GEN_FLAG_TAG       (ASN1_GEN_FLAG|3)
-#define ASN1_GEN_FLAG_BITWRAP   (ASN1_GEN_FLAG|4)
-#define ASN1_GEN_FLAG_OCTWRAP   (ASN1_GEN_FLAG|5)
-#define ASN1_GEN_FLAG_SEQWRAP   (ASN1_GEN_FLAG|6)
-#define ASN1_GEN_FLAG_SETWRAP   (ASN1_GEN_FLAG|7)
-#define ASN1_GEN_FLAG_FORMAT    (ASN1_GEN_FLAG|8)
+#define ASN1_GEN_FLAG 0x10000
+#define ASN1_GEN_FLAG_IMP (ASN1_GEN_FLAG | 1)
+#define ASN1_GEN_FLAG_EXP (ASN1_GEN_FLAG | 2)
+#define ASN1_GEN_FLAG_TAG (ASN1_GEN_FLAG | 3)
+#define ASN1_GEN_FLAG_BITWRAP (ASN1_GEN_FLAG | 4)
+#define ASN1_GEN_FLAG_OCTWRAP (ASN1_GEN_FLAG | 5)
+#define ASN1_GEN_FLAG_SEQWRAP (ASN1_GEN_FLAG | 6)
+#define ASN1_GEN_FLAG_SETWRAP (ASN1_GEN_FLAG | 7)
+#define ASN1_GEN_FLAG_FORMAT (ASN1_GEN_FLAG | 8)
 
-#define ASN1_GEN_STR(str,val)   {str, sizeof(str) - 1, val}
+#define ASN1_GEN_STR(str, val) \
+  { str, sizeof(str) - 1, val }
 
-#define ASN1_FLAG_EXP_MAX       20
-/* Maximum number of nested sequences */
-#define ASN1_GEN_SEQ_MAX_DEPTH  50
+#define ASN1_FLAG_EXP_MAX 20
+// Maximum number of nested sequences
+#define ASN1_GEN_SEQ_MAX_DEPTH 50
 
-/* Input formats */
+// Input formats
 
-/* ASCII: default */
-#define ASN1_GEN_FORMAT_ASCII   1
-/* UTF8 */
-#define ASN1_GEN_FORMAT_UTF8    2
-/* Hex */
-#define ASN1_GEN_FORMAT_HEX     3
-/* List of bits */
+// ASCII: default
+#define ASN1_GEN_FORMAT_ASCII 1
+// UTF8
+#define ASN1_GEN_FORMAT_UTF8 2
+// Hex
+#define ASN1_GEN_FORMAT_HEX 3
+// List of bits
 #define ASN1_GEN_FORMAT_BITLIST 4
 
 struct tag_name_st {
-    const char *strnam;
-    int len;
-    int tag;
+  const char *strnam;
+  size_t len;
+  int tag;
 };
 
 typedef struct {
-    int exp_tag;
-    int exp_class;
-    int exp_constructed;
-    int exp_pad;
-    long exp_len;
+  int exp_tag;
+  int exp_class;
+  int exp_constructed;
+  int exp_pad;
+  long exp_len;
 } tag_exp_type;
 
 typedef struct {
-    int imp_tag;
-    int imp_class;
-    int utype;
-    int format;
-    const char *str;
-    tag_exp_type exp_list[ASN1_FLAG_EXP_MAX];
-    int exp_count;
+  int imp_tag;
+  int imp_class;
+  int utype;
+  int format;
+  const char *str;
+  tag_exp_type exp_list[ASN1_FLAG_EXP_MAX];
+  int exp_count;
 } tag_exp_arg;
 
 static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,
                               int *perr);
-static int bitstr_cb(const char *elem, int len, void *bitstr);
-static int asn1_cb(const char *elem, int len, void *bitstr);
+static int bitstr_cb(const char *elem, size_t len, void *bitstr);
+static int asn1_cb(const char *elem, size_t len, void *bitstr);
 static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,
                       int exp_constructed, int exp_pad, int imp_ok);
-static int parse_tagging(const char *vstart, int vlen, int *ptag,
+static int parse_tagging(const char *vstart, size_t vlen, int *ptag,
                          int *pclass);
 static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,
                              int depth, int *perr);
 static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype);
-static int asn1_str2tag(const char *tagstr, int len);
+static int asn1_str2tag(const char *tagstr, size_t len);
 
-ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf)
-{
-    int err = 0;
-    ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err);
-    if (err)
-        OPENSSL_PUT_ERROR(ASN1, err);
-    return ret;
+ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf) {
+  int err = 0;
+  ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err);
+  if (err) {
+    OPENSSL_PUT_ERROR(ASN1, err);
+  }
+  return ret;
 }
 
 static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,
-                              int *perr)
-{
-    ASN1_TYPE *ret;
-    tag_exp_arg asn1_tags;
-    tag_exp_type *etmp;
+                              int *perr) {
+  ASN1_TYPE *ret;
+  tag_exp_arg asn1_tags;
+  tag_exp_type *etmp;
 
-    int i, len;
+  int i, len;
 
-    unsigned char *orig_der = NULL, *new_der = NULL;
-    const unsigned char *cpy_start;
-    unsigned char *p;
-    const unsigned char *cp;
-    int cpy_len;
-    long hdr_len = 0;
-    int hdr_constructed = 0, hdr_tag, hdr_class;
-    int r;
+  unsigned char *orig_der = NULL, *new_der = NULL;
+  const unsigned char *cpy_start;
+  unsigned char *p;
+  const unsigned char *cp;
+  int cpy_len;
+  long hdr_len = 0;
+  int hdr_constructed = 0, hdr_tag, hdr_class;
+  int r;
 
-    asn1_tags.imp_tag = -1;
-    asn1_tags.imp_class = -1;
-    asn1_tags.format = ASN1_GEN_FORMAT_ASCII;
-    asn1_tags.exp_count = 0;
-    if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) {
-        *perr = ASN1_R_UNKNOWN_TAG;
-        return NULL;
+  asn1_tags.imp_tag = -1;
+  asn1_tags.imp_class = -1;
+  asn1_tags.format = ASN1_GEN_FORMAT_ASCII;
+  asn1_tags.exp_count = 0;
+  if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) {
+    *perr = ASN1_R_UNKNOWN_TAG;
+    return NULL;
+  }
+
+  if ((asn1_tags.utype == V_ASN1_SEQUENCE) || (asn1_tags.utype == V_ASN1_SET)) {
+    if (!cnf) {
+      *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG;
+      return NULL;
     }
-
-    if ((asn1_tags.utype == V_ASN1_SEQUENCE)
-        || (asn1_tags.utype == V_ASN1_SET)) {
-        if (!cnf) {
-            *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG;
-            return NULL;
-        }
-        if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) {
-            *perr = ASN1_R_ILLEGAL_NESTED_TAGGING;
-            return NULL;
-        }
-        ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr);
-    } else
-        ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype);
-
-    if (!ret)
-        return NULL;
-
-    /* If no tagging return base type */
-    if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0))
-        return ret;
-
-    /* Generate the encoding */
-    cpy_len = i2d_ASN1_TYPE(ret, &orig_der);
-    ASN1_TYPE_free(ret);
-    ret = NULL;
-    /* Set point to start copying for modified encoding */
-    cpy_start = orig_der;
-
-    /* Do we need IMPLICIT tagging? */
-    if (asn1_tags.imp_tag != -1) {
-        /* If IMPLICIT we will replace the underlying tag */
-        /* Skip existing tag+len */
-        r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class,
-                            cpy_len);
-        if (r & 0x80)
-            goto err;
-        /* Update copy length */
-        cpy_len -= cpy_start - orig_der;
-        /*
-         * For IMPLICIT tagging the length should match the original length
-         * and constructed flag should be consistent.
-         */
-        hdr_constructed = r & V_ASN1_CONSTRUCTED;
-        /*
-         * Work out new length with IMPLICIT tag: ignore constructed because
-         * it will mess up if indefinite length
-         */
-        len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag);
-    } else
-        len = cpy_len;
-
-    /* Work out length in any EXPLICIT, starting from end */
-
-    for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1;
-         i < asn1_tags.exp_count; i++, etmp--) {
-        /* Content length: number of content octets + any padding */
-        len += etmp->exp_pad;
-        etmp->exp_len = len;
-        /* Total object length: length including new header */
-        len = ASN1_object_size(0, len, etmp->exp_tag);
+    if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) {
+      *perr = ASN1_R_ILLEGAL_NESTED_TAGGING;
+      return NULL;
     }
+    ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr);
+  } else {
+    ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype);
+  }
 
-    /* Allocate buffer for new encoding */
+  if (!ret) {
+    return NULL;
+  }
 
-    new_der = OPENSSL_malloc(len);
-    if (!new_der)
-        goto err;
-
-    /* Generate tagged encoding */
-
-    p = new_der;
-
-    /* Output explicit tags first */
-
-    for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count;
-         i++, etmp++) {
-        ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len,
-                        etmp->exp_tag, etmp->exp_class);
-        if (etmp->exp_pad)
-            *p++ = 0;
-    }
-
-    /* If IMPLICIT, output tag */
-
-    if (asn1_tags.imp_tag != -1) {
-        if (asn1_tags.imp_class == V_ASN1_UNIVERSAL
-            && (asn1_tags.imp_tag == V_ASN1_SEQUENCE
-                || asn1_tags.imp_tag == V_ASN1_SET))
-            hdr_constructed = V_ASN1_CONSTRUCTED;
-        ASN1_put_object(&p, hdr_constructed, hdr_len,
-                        asn1_tags.imp_tag, asn1_tags.imp_class);
-    }
-
-    /* Copy across original encoding */
-    OPENSSL_memcpy(p, cpy_start, cpy_len);
-
-    cp = new_der;
-
-    /* Obtain new ASN1_TYPE structure */
-    ret = d2i_ASN1_TYPE(NULL, &cp, len);
-
- err:
-    if (orig_der)
-        OPENSSL_free(orig_der);
-    if (new_der)
-        OPENSSL_free(new_der);
-
+  // If no tagging return base type
+  if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0)) {
     return ret;
+  }
 
+  // Generate the encoding
+  cpy_len = i2d_ASN1_TYPE(ret, &orig_der);
+  ASN1_TYPE_free(ret);
+  ret = NULL;
+  // Set point to start copying for modified encoding
+  cpy_start = orig_der;
+
+  // Do we need IMPLICIT tagging?
+  if (asn1_tags.imp_tag != -1) {
+    // If IMPLICIT we will replace the underlying tag
+    // Skip existing tag+len
+    r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class, cpy_len);
+    if (r & 0x80) {
+      goto err;
+    }
+    // Update copy length
+    cpy_len -= cpy_start - orig_der;
+    // For IMPLICIT tagging the length should match the original length
+    // and constructed flag should be consistent.
+    hdr_constructed = r & V_ASN1_CONSTRUCTED;
+    // Work out new length with IMPLICIT tag: ignore constructed because
+    // it will mess up if indefinite length
+    len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag);
+  } else {
+    len = cpy_len;
+  }
+
+  // Work out length in any EXPLICIT, starting from end
+
+  for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1;
+       i < asn1_tags.exp_count; i++, etmp--) {
+    // Content length: number of content octets + any padding
+    len += etmp->exp_pad;
+    etmp->exp_len = len;
+    // Total object length: length including new header
+    len = ASN1_object_size(0, len, etmp->exp_tag);
+  }
+
+  // Allocate buffer for new encoding
+
+  new_der = OPENSSL_malloc(len);
+  if (!new_der) {
+    goto err;
+  }
+
+  // Generate tagged encoding
+
+  p = new_der;
+
+  // Output explicit tags first
+
+  for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count; i++, etmp++) {
+    ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len, etmp->exp_tag,
+                    etmp->exp_class);
+    if (etmp->exp_pad) {
+      *p++ = 0;
+    }
+  }
+
+  // If IMPLICIT, output tag
+
+  if (asn1_tags.imp_tag != -1) {
+    if (asn1_tags.imp_class == V_ASN1_UNIVERSAL &&
+        (asn1_tags.imp_tag == V_ASN1_SEQUENCE ||
+         asn1_tags.imp_tag == V_ASN1_SET)) {
+      hdr_constructed = V_ASN1_CONSTRUCTED;
+    }
+    ASN1_put_object(&p, hdr_constructed, hdr_len, asn1_tags.imp_tag,
+                    asn1_tags.imp_class);
+  }
+
+  // Copy across original encoding
+  OPENSSL_memcpy(p, cpy_start, cpy_len);
+
+  cp = new_der;
+
+  // Obtain new ASN1_TYPE structure
+  ret = d2i_ASN1_TYPE(NULL, &cp, len);
+
+err:
+  OPENSSL_free(orig_der);
+  OPENSSL_free(new_der);
+  return ret;
 }
 
-static int asn1_cb(const char *elem, int len, void *bitstr)
-{
-    tag_exp_arg *arg = bitstr;
-    int i;
-    int utype;
-    int vlen = 0;
-    const char *p, *vstart = NULL;
+static int asn1_cb(const char *elem, size_t len, void *bitstr) {
+  tag_exp_arg *arg = bitstr;
+  if (elem == NULL) {
+    return -1;
+  }
 
-    int tmp_tag, tmp_class;
+  // Look for the ':' in name:value pairs.
+  const char *vstart = NULL;
+  size_t vlen = 0;
+  const char *colon = OPENSSL_memchr(elem, ':', len);
+  if (colon != NULL) {
+    vstart = colon + 1;
+    vlen = len - (vstart - elem);
+    len = colon - elem;
+  }
 
-    if (elem == NULL)
-        return -1;
+  int utype = asn1_str2tag(elem, len);
+  if (utype == -1) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG);
+    ERR_add_error_data(2, "tag=", elem);
+    return -1;
+  }
 
-    for (i = 0, p = elem; i < len; p++, i++) {
-        /* Look for the ':' in name value pairs */
-        if (*p == ':') {
-            vstart = p + 1;
-            vlen = len - (vstart - elem);
-            len = p - elem;
-            break;
-        }
+  // If this is not a modifier mark end of string and exit
+  if (!(utype & ASN1_GEN_FLAG)) {
+    arg->utype = utype;
+    arg->str = vstart;
+    // If no value and not end of string, error
+    if (!vstart && elem[len]) {
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
+      return -1;
     }
+    return 0;
+  }
 
-    utype = asn1_str2tag(elem, len);
-
-    if (utype == -1) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG);
-        ERR_add_error_data(2, "tag=", elem);
-        return -1;
-    }
-
-    /* If this is not a modifier mark end of string and exit */
-    if (!(utype & ASN1_GEN_FLAG)) {
-        arg->utype = utype;
-        arg->str = vstart;
-        /* If no value and not end of string, error */
-        if (!vstart && elem[len]) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
-            return -1;
-        }
-        return 0;
-    }
-
-    switch (utype) {
-
+  switch (utype) {
     case ASN1_GEN_FLAG_IMP:
-        /* Check for illegal multiple IMPLICIT tagging */
-        if (arg->imp_tag != -1) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
-            return -1;
-        }
-        if (!parse_tagging(vstart, vlen, &arg->imp_tag, &arg->imp_class))
-            return -1;
-        break;
+      // Check for illegal multiple IMPLICIT tagging
+      if (arg->imp_tag != -1) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
+        return -1;
+      }
+      if (!parse_tagging(vstart, vlen, &arg->imp_tag, &arg->imp_class)) {
+        return -1;
+      }
+      break;
 
-    case ASN1_GEN_FLAG_EXP:
-
-        if (!parse_tagging(vstart, vlen, &tmp_tag, &tmp_class))
-            return -1;
-        if (!append_exp(arg, tmp_tag, tmp_class, 1, 0, 0))
-            return -1;
-        break;
+    case ASN1_GEN_FLAG_EXP: {
+      int tmp_tag, tmp_class;
+      if (!parse_tagging(vstart, vlen, &tmp_tag, &tmp_class)) {
+        return -1;
+      }
+      if (!append_exp(arg, tmp_tag, tmp_class, 1, 0, 0)) {
+        return -1;
+      }
+      break;
+    }
 
     case ASN1_GEN_FLAG_SEQWRAP:
-        if (!append_exp(arg, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, 1, 0, 1))
-            return -1;
-        break;
+      if (!append_exp(arg, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, 1, 0, 1)) {
+        return -1;
+      }
+      break;
 
     case ASN1_GEN_FLAG_SETWRAP:
-        if (!append_exp(arg, V_ASN1_SET, V_ASN1_UNIVERSAL, 1, 0, 1))
-            return -1;
-        break;
+      if (!append_exp(arg, V_ASN1_SET, V_ASN1_UNIVERSAL, 1, 0, 1)) {
+        return -1;
+      }
+      break;
 
     case ASN1_GEN_FLAG_BITWRAP:
-        if (!append_exp(arg, V_ASN1_BIT_STRING, V_ASN1_UNIVERSAL, 0, 1, 1))
-            return -1;
-        break;
+      if (!append_exp(arg, V_ASN1_BIT_STRING, V_ASN1_UNIVERSAL, 0, 1, 1)) {
+        return -1;
+      }
+      break;
 
     case ASN1_GEN_FLAG_OCTWRAP:
-        if (!append_exp(arg, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL, 0, 0, 1))
-            return -1;
-        break;
+      if (!append_exp(arg, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL, 0, 0, 1)) {
+        return -1;
+      }
+      break;
 
     case ASN1_GEN_FLAG_FORMAT:
-        if (!vstart) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
-            return -1;
-        }
-        if (!strncmp(vstart, "ASCII", 5))
-            arg->format = ASN1_GEN_FORMAT_ASCII;
-        else if (!strncmp(vstart, "UTF8", 4))
-            arg->format = ASN1_GEN_FORMAT_UTF8;
-        else if (!strncmp(vstart, "HEX", 3))
-            arg->format = ASN1_GEN_FORMAT_HEX;
-        else if (!strncmp(vstart, "BITLIST", 7))
-            arg->format = ASN1_GEN_FORMAT_BITLIST;
-        else {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
-            return -1;
-        }
+      if (!vstart) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
+        return -1;
+      }
+      if (!strncmp(vstart, "ASCII", 5)) {
+        arg->format = ASN1_GEN_FORMAT_ASCII;
+      } else if (!strncmp(vstart, "UTF8", 4)) {
+        arg->format = ASN1_GEN_FORMAT_UTF8;
+      } else if (!strncmp(vstart, "HEX", 3)) {
+        arg->format = ASN1_GEN_FORMAT_HEX;
+      } else if (!strncmp(vstart, "BITLIST", 7)) {
+        arg->format = ASN1_GEN_FORMAT_BITLIST;
+      } else {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT);
+        return -1;
+      }
+      break;
+  }
+
+  return 1;
+}
+
+static int parse_tagging(const char *vstart, size_t vlen, int *ptag,
+                         int *pclass) {
+  char erch[2];
+  long tag_num;
+  char *eptr;
+  if (!vstart) {
+    return 0;
+  }
+  tag_num = strtoul(vstart, &eptr, 10);
+  // Check we haven't gone past max length: should be impossible
+  if (eptr && *eptr && (eptr > vstart + vlen)) {
+    return 0;
+  }
+  if (tag_num < 0) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
+    return 0;
+  }
+  *ptag = tag_num;
+  // If we have non numeric characters, parse them
+  if (eptr) {
+    vlen -= eptr - vstart;
+  } else {
+    vlen = 0;
+  }
+  if (vlen) {
+    switch (*eptr) {
+      case 'U':
+        *pclass = V_ASN1_UNIVERSAL;
         break;
 
-    }
+      case 'A':
+        *pclass = V_ASN1_APPLICATION;
+        break;
 
-    return 1;
+      case 'P':
+        *pclass = V_ASN1_PRIVATE;
+        break;
 
-}
-
-static int parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass)
-{
-    char erch[2];
-    long tag_num;
-    char *eptr;
-    if (!vstart)
-        return 0;
-    tag_num = strtoul(vstart, &eptr, 10);
-    /* Check we haven't gone past max length: should be impossible */
-    if (eptr && *eptr && (eptr > vstart + vlen))
-        return 0;
-    if (tag_num < 0) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
-        return 0;
-    }
-    *ptag = tag_num;
-    /* If we have non numeric characters, parse them */
-    if (eptr)
-        vlen -= eptr - vstart;
-    else
-        vlen = 0;
-    if (vlen) {
-        switch (*eptr) {
-
-        case 'U':
-            *pclass = V_ASN1_UNIVERSAL;
-            break;
-
-        case 'A':
-            *pclass = V_ASN1_APPLICATION;
-            break;
-
-        case 'P':
-            *pclass = V_ASN1_PRIVATE;
-            break;
-
-        case 'C':
-            *pclass = V_ASN1_CONTEXT_SPECIFIC;
-            break;
-
-        default:
-            erch[0] = *eptr;
-            erch[1] = 0;
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER);
-            ERR_add_error_data(2, "Char=", erch);
-            return 0;
-            break;
-
-        }
-    } else
+      case 'C':
         *pclass = V_ASN1_CONTEXT_SPECIFIC;
+        break;
 
-    return 1;
+      default:
+        erch[0] = *eptr;
+        erch[1] = 0;
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER);
+        ERR_add_error_data(2, "Char=", erch);
+        return 0;
+        break;
+    }
+  } else {
+    *pclass = V_ASN1_CONTEXT_SPECIFIC;
+  }
 
+  return 1;
 }
 
-/* Handle multiple types: SET and SEQUENCE */
+// Handle multiple types: SET and SEQUENCE
 
 static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,
-                             int depth, int *perr)
-{
-    ASN1_TYPE *ret = NULL;
-    STACK_OF(ASN1_TYPE) *sk = NULL;
-    STACK_OF(CONF_VALUE) *sect = NULL;
-    unsigned char *der = NULL;
-    int derlen;
-    size_t i;
-    sk = sk_ASN1_TYPE_new_null();
-    if (!sk)
-        goto bad;
-    if (section) {
-        if (!cnf)
-            goto bad;
-        sect = X509V3_get_section(cnf, (char *)section);
-        if (!sect)
-            goto bad;
-        for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {
-            ASN1_TYPE *typ =
-                generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf,
-                            depth + 1, perr);
-            if (!typ)
-                goto bad;
-            if (!sk_ASN1_TYPE_push(sk, typ))
-                goto bad;
-        }
+                             int depth, int *perr) {
+  ASN1_TYPE *ret = NULL;
+  STACK_OF(ASN1_TYPE) *sk = NULL;
+  STACK_OF(CONF_VALUE) *sect = NULL;
+  unsigned char *der = NULL;
+  int derlen;
+  size_t i;
+  sk = sk_ASN1_TYPE_new_null();
+  if (!sk) {
+    goto bad;
+  }
+  if (section) {
+    if (!cnf) {
+      goto bad;
     }
-
-    /*
-     * Now we has a STACK of the components, convert to the correct form
-     */
-
-    if (utype == V_ASN1_SET)
-        derlen = i2d_ASN1_SET_ANY(sk, &der);
-    else
-        derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der);
-
-    if (derlen < 0)
+    sect = X509V3_get_section(cnf, (char *)section);
+    if (!sect) {
+      goto bad;
+    }
+    for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {
+      ASN1_TYPE *typ = generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf,
+                                   depth + 1, perr);
+      if (!typ) {
         goto bad;
-
-    if (!(ret = ASN1_TYPE_new()))
+      }
+      if (!sk_ASN1_TYPE_push(sk, typ)) {
         goto bad;
+      }
+    }
+  }
 
-    if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype)))
-        goto bad;
+  // Now we has a STACK of the components, convert to the correct form
 
-    ret->type = utype;
+  if (utype == V_ASN1_SET) {
+    derlen = i2d_ASN1_SET_ANY(sk, &der);
+  } else {
+    derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der);
+  }
 
-    ret->value.asn1_string->data = der;
-    ret->value.asn1_string->length = derlen;
+  if (derlen < 0) {
+    goto bad;
+  }
 
-    der = NULL;
+  if (!(ret = ASN1_TYPE_new())) {
+    goto bad;
+  }
 
- bad:
+  if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype))) {
+    goto bad;
+  }
 
-    if (der)
-        OPENSSL_free(der);
+  ret->type = utype;
 
-    if (sk)
-        sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
-    if (sect)
-        X509V3_section_free(cnf, sect);
+  ret->value.asn1_string->data = der;
+  ret->value.asn1_string->length = derlen;
 
-    return ret;
+  der = NULL;
+
+bad:
+  OPENSSL_free(der);
+  sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
+  X509V3_section_free(cnf, sect);
+  return ret;
 }
 
 static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,
-                      int exp_constructed, int exp_pad, int imp_ok)
-{
-    tag_exp_type *exp_tmp;
-    /* Can only have IMPLICIT if permitted */
-    if ((arg->imp_tag != -1) && !imp_ok) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG);
-        return 0;
-    }
+                      int exp_constructed, int exp_pad, int imp_ok) {
+  tag_exp_type *exp_tmp;
+  // Can only have IMPLICIT if permitted
+  if ((arg->imp_tag != -1) && !imp_ok) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG);
+    return 0;
+  }
 
-    if (arg->exp_count == ASN1_FLAG_EXP_MAX) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_DEPTH_EXCEEDED);
-        return 0;
-    }
+  if (arg->exp_count == ASN1_FLAG_EXP_MAX) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_DEPTH_EXCEEDED);
+    return 0;
+  }
 
-    exp_tmp = &arg->exp_list[arg->exp_count++];
+  exp_tmp = &arg->exp_list[arg->exp_count++];
 
-    /*
-     * If IMPLICIT set tag to implicit value then reset implicit tag since it
-     * has been used.
-     */
-    if (arg->imp_tag != -1) {
-        exp_tmp->exp_tag = arg->imp_tag;
-        exp_tmp->exp_class = arg->imp_class;
-        arg->imp_tag = -1;
-        arg->imp_class = -1;
-    } else {
-        exp_tmp->exp_tag = exp_tag;
-        exp_tmp->exp_class = exp_class;
-    }
-    exp_tmp->exp_constructed = exp_constructed;
-    exp_tmp->exp_pad = exp_pad;
+  // If IMPLICIT set tag to implicit value then reset implicit tag since it
+  // has been used.
+  if (arg->imp_tag != -1) {
+    exp_tmp->exp_tag = arg->imp_tag;
+    exp_tmp->exp_class = arg->imp_class;
+    arg->imp_tag = -1;
+    arg->imp_class = -1;
+  } else {
+    exp_tmp->exp_tag = exp_tag;
+    exp_tmp->exp_class = exp_class;
+  }
+  exp_tmp->exp_constructed = exp_constructed;
+  exp_tmp->exp_pad = exp_pad;
 
-    return 1;
+  return 1;
 }
 
-static int asn1_str2tag(const char *tagstr, int len)
-{
-    unsigned int i;
-    static const struct tag_name_st *tntmp, tnst[] = {
-        ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN),
-        ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN),
-        ASN1_GEN_STR("NULL", V_ASN1_NULL),
-        ASN1_GEN_STR("INT", V_ASN1_INTEGER),
-        ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER),
-        ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED),
-        ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED),
-        ASN1_GEN_STR("OID", V_ASN1_OBJECT),
-        ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT),
-        ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME),
-        ASN1_GEN_STR("UTC", V_ASN1_UTCTIME),
-        ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME),
-        ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME),
-        ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING),
-        ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING),
-        ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING),
-        ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING),
-        ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING),
-        ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING),
-        ASN1_GEN_STR("IA5", V_ASN1_IA5STRING),
-        ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING),
-        ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING),
-        ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING),
-        ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING),
-        ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING),
-        ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING),
-        ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING),
-        ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING),
-        ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING),
-        ASN1_GEN_STR("T61", V_ASN1_T61STRING),
-        ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING),
-        ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING),
-        ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING),
-        ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING),
-        ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING),
-        ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING),
+static int asn1_str2tag(const char *tagstr, size_t len) {
+  static const struct tag_name_st tnst[] = {
+      ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN),
+      ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN),
+      ASN1_GEN_STR("NULL", V_ASN1_NULL),
+      ASN1_GEN_STR("INT", V_ASN1_INTEGER),
+      ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER),
+      ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED),
+      ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED),
+      ASN1_GEN_STR("OID", V_ASN1_OBJECT),
+      ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT),
+      ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME),
+      ASN1_GEN_STR("UTC", V_ASN1_UTCTIME),
+      ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME),
+      ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME),
+      ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING),
+      ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING),
+      ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING),
+      ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING),
+      ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING),
+      ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING),
+      ASN1_GEN_STR("IA5", V_ASN1_IA5STRING),
+      ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING),
+      ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING),
+      ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING),
+      ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING),
+      ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING),
+      ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING),
+      ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING),
+      ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING),
+      ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING),
+      ASN1_GEN_STR("T61", V_ASN1_T61STRING),
+      ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING),
+      ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING),
+      ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING),
+      ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING),
+      ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING),
+      ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING),
 
-        /* Special cases */
-        ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),
-        ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),
-        ASN1_GEN_STR("SET", V_ASN1_SET),
-        /* type modifiers */
-        /* Explicit tag */
-        ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),
-        ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),
-        /* Implicit tag */
-        ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),
-        ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),
-        /* OCTET STRING wrapper */
-        ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),
-        /* SEQUENCE wrapper */
-        ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),
-        /* SET wrapper */
-        ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),
-        /* BIT STRING wrapper */
-        ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),
-        ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),
-        ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),
-    };
+      // Special cases
+      ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),
+      ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),
+      ASN1_GEN_STR("SET", V_ASN1_SET),
+      // type modifiers
+      // Explicit tag
+      ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),
+      ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),
+      // Implicit tag
+      ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),
+      ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),
+      // OCTET STRING wrapper
+      ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),
+      // SEQUENCE wrapper
+      ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),
+      // SET wrapper
+      ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),
+      // BIT STRING wrapper
+      ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),
+      ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),
+      ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),
+  };
 
-    if (len == -1)
-        len = strlen(tagstr);
-
-    tntmp = tnst;
-    for (i = 0; i < sizeof(tnst) / sizeof(struct tag_name_st); i++, tntmp++) {
-        if ((len == tntmp->len) && !strncmp(tntmp->strnam, tagstr, len))
-            return tntmp->tag;
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(tnst); i++) {
+    if (len == tnst[i].len && strncmp(tnst[i].strnam, tagstr, len) == 0) {
+      return tnst[i].tag;
     }
+  }
 
-    return -1;
+  return -1;
 }
 
-static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype)
-{
-    ASN1_TYPE *atmp = NULL;
+static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype) {
+  ASN1_TYPE *atmp = NULL;
 
-    CONF_VALUE vtmp;
+  CONF_VALUE vtmp;
 
-    unsigned char *rdata;
-    long rdlen;
+  unsigned char *rdata;
+  long rdlen;
 
-    int no_unused = 1;
+  int no_unused = 1;
 
-    if (!(atmp = ASN1_TYPE_new())) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
+  if (!(atmp = ASN1_TYPE_new())) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
 
-    if (!str)
-        str = "";
+  if (!str) {
+    str = "";
+  }
 
-    switch (utype) {
-
+  switch (utype) {
     case V_ASN1_NULL:
-        if (str && *str) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL_VALUE);
-            goto bad_form;
-        }
-        break;
+      if (str && *str) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL_VALUE);
+        goto bad_form;
+      }
+      break;
 
     case V_ASN1_BOOLEAN:
-        if (format != ASN1_GEN_FORMAT_ASCII) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ASCII_FORMAT);
-            goto bad_form;
-        }
-        vtmp.name = NULL;
-        vtmp.section = NULL;
-        vtmp.value = (char *)str;
-        if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BOOLEAN);
-            goto bad_str;
-        }
-        break;
+      if (format != ASN1_GEN_FORMAT_ASCII) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ASCII_FORMAT);
+        goto bad_form;
+      }
+      vtmp.name = NULL;
+      vtmp.section = NULL;
+      vtmp.value = (char *)str;
+      if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BOOLEAN);
+        goto bad_str;
+      }
+      break;
 
     case V_ASN1_INTEGER:
     case V_ASN1_ENUMERATED:
-        if (format != ASN1_GEN_FORMAT_ASCII) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT);
-            goto bad_form;
-        }
-        if (!(atmp->value.integer = s2i_ASN1_INTEGER(NULL, (char *)str))) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER);
-            goto bad_str;
-        }
-        break;
+      if (format != ASN1_GEN_FORMAT_ASCII) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT);
+        goto bad_form;
+      }
+      if (!(atmp->value.integer = s2i_ASN1_INTEGER(NULL, (char *)str))) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER);
+        goto bad_str;
+      }
+      break;
 
     case V_ASN1_OBJECT:
-        if (format != ASN1_GEN_FORMAT_ASCII) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT);
-            goto bad_form;
-        }
-        if (!(atmp->value.object = OBJ_txt2obj(str, 0))) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
-            goto bad_str;
-        }
-        break;
+      if (format != ASN1_GEN_FORMAT_ASCII) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT);
+        goto bad_form;
+      }
+      if (!(atmp->value.object = OBJ_txt2obj(str, 0))) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
+        goto bad_str;
+      }
+      break;
 
     case V_ASN1_UTCTIME:
     case V_ASN1_GENERALIZEDTIME:
-        if (format != ASN1_GEN_FORMAT_ASCII) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT);
-            goto bad_form;
-        }
-        if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto bad_str;
-        }
-        if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto bad_str;
-        }
-        atmp->value.asn1_string->type = utype;
-        if (!ASN1_TIME_check(atmp->value.asn1_string)) {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
-            goto bad_str;
-        }
+      if (format != ASN1_GEN_FORMAT_ASCII) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT);
+        goto bad_form;
+      }
+      if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        goto bad_str;
+      }
+      if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) {
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        goto bad_str;
+      }
+      atmp->value.asn1_string->type = utype;
+      if (!ASN1_TIME_check(atmp->value.asn1_string)) {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE);
+        goto bad_str;
+      }
 
-        break;
+      break;
 
     case V_ASN1_BMPSTRING:
     case V_ASN1_PRINTABLESTRING:
@@ -726,101 +710,98 @@
     case V_ASN1_GENERALSTRING:
     case V_ASN1_NUMERICSTRING:
 
-        if (format == ASN1_GEN_FORMAT_ASCII)
-            format = MBSTRING_ASC;
-        else if (format == ASN1_GEN_FORMAT_UTF8)
-            format = MBSTRING_UTF8;
-        else {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_FORMAT);
-            goto bad_form;
-        }
+      if (format == ASN1_GEN_FORMAT_ASCII) {
+        format = MBSTRING_ASC;
+      } else if (format == ASN1_GEN_FORMAT_UTF8) {
+        format = MBSTRING_UTF8;
+      } else {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_FORMAT);
+        goto bad_form;
+      }
 
-        if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str,
-                               -1, format, ASN1_tag2bit(utype)) <= 0) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto bad_str;
-        }
+      if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str, -1,
+                             format, ASN1_tag2bit(utype)) <= 0) {
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        goto bad_str;
+      }
 
-        break;
+      break;
 
     case V_ASN1_BIT_STRING:
 
     case V_ASN1_OCTET_STRING:
 
-        if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto bad_form;
+      if (!(atmp->value.asn1_string = ASN1_STRING_new())) {
+        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+        goto bad_form;
+      }
+
+      if (format == ASN1_GEN_FORMAT_HEX) {
+        if (!(rdata = x509v3_hex_to_bytes((char *)str, &rdlen))) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX);
+          goto bad_str;
         }
 
-        if (format == ASN1_GEN_FORMAT_HEX) {
+        atmp->value.asn1_string->data = rdata;
+        atmp->value.asn1_string->length = rdlen;
+        atmp->value.asn1_string->type = utype;
 
-            if (!(rdata = x509v3_hex_to_bytes((char *)str, &rdlen))) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX);
-                goto bad_str;
-            }
-
-            atmp->value.asn1_string->data = rdata;
-            atmp->value.asn1_string->length = rdlen;
-            atmp->value.asn1_string->type = utype;
-
-        } else if (format == ASN1_GEN_FORMAT_ASCII)
-            ASN1_STRING_set(atmp->value.asn1_string, str, -1);
-        else if ((format == ASN1_GEN_FORMAT_BITLIST)
-                 && (utype == V_ASN1_BIT_STRING)) {
-            if (!CONF_parse_list
-                (str, ',', 1, bitstr_cb, atmp->value.bit_string)) {
-                OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR);
-                goto bad_str;
-            }
-            no_unused = 0;
-
-        } else {
-            OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT);
-            goto bad_form;
+      } else if (format == ASN1_GEN_FORMAT_ASCII) {
+        ASN1_STRING_set(atmp->value.asn1_string, str, -1);
+      } else if ((format == ASN1_GEN_FORMAT_BITLIST) &&
+                 (utype == V_ASN1_BIT_STRING)) {
+        if (!CONF_parse_list(str, ',', 1, bitstr_cb, atmp->value.bit_string)) {
+          OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR);
+          goto bad_str;
         }
+        no_unused = 0;
 
-        if ((utype == V_ASN1_BIT_STRING) && no_unused) {
-            atmp->value.asn1_string->flags
-                &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
-            atmp->value.asn1_string->flags |= ASN1_STRING_FLAG_BITS_LEFT;
-        }
+      } else {
+        OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT);
+        goto bad_form;
+      }
 
-        break;
+      if ((utype == V_ASN1_BIT_STRING) && no_unused) {
+        atmp->value.asn1_string->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+        atmp->value.asn1_string->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+      }
+
+      break;
 
     default:
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_TYPE);
-        goto bad_str;
-        break;
-    }
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_TYPE);
+      goto bad_str;
+      break;
+  }
 
-    atmp->type = utype;
-    return atmp;
+  atmp->type = utype;
+  return atmp;
 
- bad_str:
-    ERR_add_error_data(2, "string=", str);
- bad_form:
+bad_str:
+  ERR_add_error_data(2, "string=", str);
+bad_form:
 
-    ASN1_TYPE_free(atmp);
-    return NULL;
-
+  ASN1_TYPE_free(atmp);
+  return NULL;
 }
 
-static int bitstr_cb(const char *elem, int len, void *bitstr)
-{
-    long bitnum;
-    char *eptr;
-    if (!elem)
-        return 0;
-    bitnum = strtoul(elem, &eptr, 10);
-    if (eptr && *eptr && (eptr != elem + len))
-        return 0;
-    if (bitnum < 0) {
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
-        return 0;
-    }
-    if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) {
-        OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
-    return 1;
+static int bitstr_cb(const char *elem, size_t len, void *bitstr) {
+  long bitnum;
+  char *eptr;
+  if (!elem) {
+    return 0;
+  }
+  bitnum = strtoul(elem, &eptr, 10);
+  if (eptr && *eptr && (eptr != elem + len)) {
+    return 0;
+  }
+  if (bitnum < 0) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER);
+    return 0;
+  }
+  if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) {
+    OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  return 1;
 }
diff --git a/src/crypto/x509/by_dir.c b/src/crypto/x509/by_dir.c
index a630cdf..47ccd6b 100644
--- a/src/crypto/x509/by_dir.c
+++ b/src/crypto/x509/by_dir.c
@@ -71,19 +71,19 @@
 #include "internal.h"
 
 typedef struct lookup_dir_hashes_st {
-    unsigned long hash;
-    int suffix;
+  unsigned long hash;
+  int suffix;
 } BY_DIR_HASH;
 
 typedef struct lookup_dir_entry_st {
-    char *dir;
-    int dir_type;
-    STACK_OF(BY_DIR_HASH) *hashes;
+  char *dir;
+  int dir_type;
+  STACK_OF(BY_DIR_HASH) *hashes;
 } BY_DIR_ENTRY;
 
 typedef struct lookup_dir_st {
-    BUF_MEM *buffer;
-    STACK_OF(BY_DIR_ENTRY) *dirs;
+  BUF_MEM *buffer;
+  STACK_OF(BY_DIR_ENTRY) *dirs;
 } BY_DIR;
 
 DEFINE_STACK_OF(BY_DIR_HASH)
@@ -98,362 +98,339 @@
                                X509_OBJECT *ret);
 static X509_LOOKUP_METHOD x509_dir_lookup = {
     "Load certs from files in a directory",
-    new_dir,                    /* new */
-    free_dir,                   /* free */
-    NULL,                       /* init */
-    NULL,                       /* shutdown */
-    dir_ctrl,                   /* ctrl */
-    get_cert_by_subject,        /* get_by_subject */
-    NULL,                       /* get_by_issuer_serial */
-    NULL,                       /* get_by_fingerprint */
-    NULL,                       /* get_by_alias */
+    new_dir,              // new
+    free_dir,             // free
+    NULL,                 // init
+    NULL,                 // shutdown
+    dir_ctrl,             // ctrl
+    get_cert_by_subject,  // get_by_subject
 };
 
-X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void)
-{
-    return (&x509_dir_lookup);
-}
+X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { return &x509_dir_lookup; }
 
 static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
-                    char **retp)
-{
-    int ret = 0;
-    BY_DIR *ld;
-    char *dir = NULL;
+                    char **retp) {
+  int ret = 0;
+  char *dir = NULL;
 
-    ld = (BY_DIR *)ctx->method_data;
+  BY_DIR *ld = ctx->method_data;
 
-    switch (cmd) {
+  switch (cmd) {
     case X509_L_ADD_DIR:
-        if (argl == X509_FILETYPE_DEFAULT) {
-            dir = (char *)getenv(X509_get_default_cert_dir_env());
-            if (dir)
-                ret = add_cert_dir(ld, dir, X509_FILETYPE_PEM);
-            else
-                ret = add_cert_dir(ld, X509_get_default_cert_dir(),
-                                   X509_FILETYPE_PEM);
-            if (!ret) {
-                OPENSSL_PUT_ERROR(X509, X509_R_LOADING_CERT_DIR);
-            }
-        } else
-            ret = add_cert_dir(ld, argp, (int)argl);
-        break;
-    }
-    return (ret);
-}
-
-static int new_dir(X509_LOOKUP *lu)
-{
-    BY_DIR *a;
-
-    if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL)
-        return (0);
-    if ((a->buffer = BUF_MEM_new()) == NULL) {
-        OPENSSL_free(a);
-        return (0);
-    }
-    a->dirs = NULL;
-    lu->method_data = (char *)a;
-    return (1);
-}
-
-static void by_dir_hash_free(BY_DIR_HASH *hash)
-{
-    OPENSSL_free(hash);
-}
-
-static int by_dir_hash_cmp(const BY_DIR_HASH **a, const BY_DIR_HASH **b)
-{
-    if ((*a)->hash > (*b)->hash)
-        return 1;
-    if ((*a)->hash < (*b)->hash)
-        return -1;
-    return 0;
-}
-
-static void by_dir_entry_free(BY_DIR_ENTRY *ent)
-{
-    if (ent->dir)
-        OPENSSL_free(ent->dir);
-    if (ent->hashes)
-        sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free);
-    OPENSSL_free(ent);
-}
-
-static void free_dir(X509_LOOKUP *lu)
-{
-    BY_DIR *a;
-
-    a = (BY_DIR *)lu->method_data;
-    if (a->dirs != NULL)
-        sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
-    if (a->buffer != NULL)
-        BUF_MEM_free(a->buffer);
-    OPENSSL_free(a);
-}
-
-static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
-{
-    size_t j, len;
-    const char *s, *ss, *p;
-
-    if (dir == NULL || !*dir) {
-        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_DIRECTORY);
-        return 0;
-    }
-
-    s = dir;
-    p = s;
-    do {
-        if ((*p == ':') || (*p == '\0')) {
-            BY_DIR_ENTRY *ent;
-            ss = s;
-            s = p + 1;
-            len = p - ss;
-            if (len == 0)
-                continue;
-            for (j = 0; j < sk_BY_DIR_ENTRY_num(ctx->dirs); j++) {
-                ent = sk_BY_DIR_ENTRY_value(ctx->dirs, j);
-                if (strlen(ent->dir) == len &&
-                    strncmp(ent->dir, ss, len) == 0)
-                    break;
-            }
-            if (j < sk_BY_DIR_ENTRY_num(ctx->dirs))
-                continue;
-            if (ctx->dirs == NULL) {
-                ctx->dirs = sk_BY_DIR_ENTRY_new_null();
-                if (!ctx->dirs) {
-                    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-                    return 0;
-                }
-            }
-            ent = OPENSSL_malloc(sizeof(BY_DIR_ENTRY));
-            if (!ent)
-                return 0;
-            ent->dir_type = type;
-            ent->hashes = sk_BY_DIR_HASH_new(by_dir_hash_cmp);
-            ent->dir = OPENSSL_malloc(len + 1);
-            if (!ent->dir || !ent->hashes) {
-                by_dir_entry_free(ent);
-                return 0;
-            }
-            OPENSSL_strlcpy(ent->dir, ss, len + 1);
-            if (!sk_BY_DIR_ENTRY_push(ctx->dirs, ent)) {
-                by_dir_entry_free(ent);
-                return 0;
-            }
+      if (argl == X509_FILETYPE_DEFAULT) {
+        dir = (char *)getenv(X509_get_default_cert_dir_env());
+        if (dir) {
+          ret = add_cert_dir(ld, dir, X509_FILETYPE_PEM);
+        } else {
+          ret =
+              add_cert_dir(ld, X509_get_default_cert_dir(), X509_FILETYPE_PEM);
         }
-    } while (*p++ != '\0');
-    return 1;
+        if (!ret) {
+          OPENSSL_PUT_ERROR(X509, X509_R_LOADING_CERT_DIR);
+        }
+      } else {
+        ret = add_cert_dir(ld, argp, (int)argl);
+      }
+      break;
+  }
+  return ret;
 }
 
-/*
- * g_ent_hashes_lock protects the |hashes| member of all |BY_DIR_ENTRY|
- * objects.
- */
-static struct CRYPTO_STATIC_MUTEX g_ent_hashes_lock =
-    CRYPTO_STATIC_MUTEX_INIT;
+static int new_dir(X509_LOOKUP *lu) {
+  BY_DIR *a;
+
+  if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL) {
+    return 0;
+  }
+  if ((a->buffer = BUF_MEM_new()) == NULL) {
+    OPENSSL_free(a);
+    return 0;
+  }
+  a->dirs = NULL;
+  lu->method_data = a;
+  return 1;
+}
+
+static void by_dir_hash_free(BY_DIR_HASH *hash) { OPENSSL_free(hash); }
+
+static int by_dir_hash_cmp(const BY_DIR_HASH **a, const BY_DIR_HASH **b) {
+  if ((*a)->hash > (*b)->hash) {
+    return 1;
+  }
+  if ((*a)->hash < (*b)->hash) {
+    return -1;
+  }
+  return 0;
+}
+
+static void by_dir_entry_free(BY_DIR_ENTRY *ent) {
+  if (ent != NULL) {
+    OPENSSL_free(ent->dir);
+    sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free);
+    OPENSSL_free(ent);
+  }
+}
+
+static void free_dir(X509_LOOKUP *lu) {
+  BY_DIR *a = lu->method_data;
+  if (a != NULL) {
+    sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
+    BUF_MEM_free(a->buffer);
+    OPENSSL_free(a);
+  }
+}
+
+static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) {
+  size_t j, len;
+  const char *s, *ss, *p;
+
+  if (dir == NULL || !*dir) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_DIRECTORY);
+    return 0;
+  }
+
+  s = dir;
+  p = s;
+  do {
+    if ((*p == ':') || (*p == '\0')) {
+      BY_DIR_ENTRY *ent;
+      ss = s;
+      s = p + 1;
+      len = p - ss;
+      if (len == 0) {
+        continue;
+      }
+      for (j = 0; j < sk_BY_DIR_ENTRY_num(ctx->dirs); j++) {
+        ent = sk_BY_DIR_ENTRY_value(ctx->dirs, j);
+        if (strlen(ent->dir) == len && strncmp(ent->dir, ss, len) == 0) {
+          break;
+        }
+      }
+      if (j < sk_BY_DIR_ENTRY_num(ctx->dirs)) {
+        continue;
+      }
+      if (ctx->dirs == NULL) {
+        ctx->dirs = sk_BY_DIR_ENTRY_new_null();
+        if (!ctx->dirs) {
+          OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+          return 0;
+        }
+      }
+      ent = OPENSSL_malloc(sizeof(BY_DIR_ENTRY));
+      if (!ent) {
+        return 0;
+      }
+      ent->dir_type = type;
+      ent->hashes = sk_BY_DIR_HASH_new(by_dir_hash_cmp);
+      ent->dir = OPENSSL_malloc(len + 1);
+      if (!ent->dir || !ent->hashes) {
+        by_dir_entry_free(ent);
+        return 0;
+      }
+      OPENSSL_strlcpy(ent->dir, ss, len + 1);
+      if (!sk_BY_DIR_ENTRY_push(ctx->dirs, ent)) {
+        by_dir_entry_free(ent);
+        return 0;
+      }
+    }
+  } while (*p++ != '\0');
+  return 1;
+}
+
+// g_ent_hashes_lock protects the |hashes| member of all |BY_DIR_ENTRY|
+// objects.
+static struct CRYPTO_STATIC_MUTEX g_ent_hashes_lock = CRYPTO_STATIC_MUTEX_INIT;
 
 static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
-                               X509_OBJECT *ret)
-{
-    BY_DIR *ctx;
-    union {
-        struct {
-            X509 st_x509;
-            X509_CINF st_x509_cinf;
-        } x509;
-        struct {
-            X509_CRL st_crl;
-            X509_CRL_INFO st_crl_info;
-        } crl;
-    } data;
-    int ok = 0;
-    size_t i;
-    int j, k;
-    unsigned long h;
-    unsigned long hash_array[2];
-    int hash_index;
-    BUF_MEM *b = NULL;
-    X509_OBJECT stmp, *tmp;
-    const char *postfix = "";
+                               X509_OBJECT *ret) {
+  union {
+    struct {
+      X509 st_x509;
+      X509_CINF st_x509_cinf;
+    } x509;
+    struct {
+      X509_CRL st_crl;
+      X509_CRL_INFO st_crl_info;
+    } crl;
+  } data;
+  int ok = 0;
+  size_t i;
+  int j, k;
+  unsigned long h;
+  unsigned long hash_array[2];
+  int hash_index;
+  BUF_MEM *b = NULL;
+  X509_OBJECT stmp, *tmp;
+  const char *postfix = "";
 
-    if (name == NULL)
-        return (0);
+  if (name == NULL) {
+    return 0;
+  }
 
-    stmp.type = type;
-    if (type == X509_LU_X509) {
-        data.x509.st_x509.cert_info = &data.x509.st_x509_cinf;
-        data.x509.st_x509_cinf.subject = name;
-        stmp.data.x509 = &data.x509.st_x509;
-        postfix = "";
-    } else if (type == X509_LU_CRL) {
-        data.crl.st_crl.crl = &data.crl.st_crl_info;
-        data.crl.st_crl_info.issuer = name;
-        stmp.data.crl = &data.crl.st_crl;
-        postfix = "r";
-    } else {
-        OPENSSL_PUT_ERROR(X509, X509_R_WRONG_LOOKUP_TYPE);
+  stmp.type = type;
+  if (type == X509_LU_X509) {
+    data.x509.st_x509.cert_info = &data.x509.st_x509_cinf;
+    data.x509.st_x509_cinf.subject = name;
+    stmp.data.x509 = &data.x509.st_x509;
+    postfix = "";
+  } else if (type == X509_LU_CRL) {
+    data.crl.st_crl.crl = &data.crl.st_crl_info;
+    data.crl.st_crl_info.issuer = name;
+    stmp.data.crl = &data.crl.st_crl;
+    postfix = "r";
+  } else {
+    OPENSSL_PUT_ERROR(X509, X509_R_WRONG_LOOKUP_TYPE);
+    goto finish;
+  }
+
+  if ((b = BUF_MEM_new()) == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
+    goto finish;
+  }
+
+  BY_DIR *ctx = xl->method_data;
+
+  hash_array[0] = X509_NAME_hash(name);
+  hash_array[1] = X509_NAME_hash_old(name);
+  for (hash_index = 0; hash_index < 2; ++hash_index) {
+    h = hash_array[hash_index];
+    for (i = 0; i < sk_BY_DIR_ENTRY_num(ctx->dirs); i++) {
+      BY_DIR_ENTRY *ent;
+      size_t idx;
+      BY_DIR_HASH htmp, *hent;
+      ent = sk_BY_DIR_ENTRY_value(ctx->dirs, i);
+      j = strlen(ent->dir) + 1 + 8 + 6 + 1 + 1;
+      if (!BUF_MEM_grow(b, j)) {
+        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
         goto finish;
-    }
-
-    if ((b = BUF_MEM_new()) == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
-        goto finish;
-    }
-
-    ctx = (BY_DIR *)xl->method_data;
-
-    hash_array[0] = X509_NAME_hash(name);
-    hash_array[1] = X509_NAME_hash_old(name);
-    for (hash_index = 0; hash_index < 2; ++hash_index) {
-        h = hash_array[hash_index];
-        for (i = 0; i < sk_BY_DIR_ENTRY_num(ctx->dirs); i++) {
-            BY_DIR_ENTRY *ent;
-            size_t idx;
-            BY_DIR_HASH htmp, *hent;
-            ent = sk_BY_DIR_ENTRY_value(ctx->dirs, i);
-            j = strlen(ent->dir) + 1 + 8 + 6 + 1 + 1;
-            if (!BUF_MEM_grow(b, j)) {
-                OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-                goto finish;
-            }
-            if (type == X509_LU_CRL && ent->hashes) {
-                htmp.hash = h;
-                CRYPTO_STATIC_MUTEX_lock_read(&g_ent_hashes_lock);
-                if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp)) {
-                    hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
-                    k = hent->suffix;
-                } else {
-                    hent = NULL;
-                    k = 0;
-                }
-                CRYPTO_STATIC_MUTEX_unlock_read(&g_ent_hashes_lock);
-            } else {
-                k = 0;
-                hent = NULL;
-            }
-            for (;;) {
-                char c = '/';
-#ifdef OPENSSL_SYS_VMS
-                c = ent->dir[strlen(ent->dir) - 1];
-                if (c != ':' && c != '>' && c != ']') {
-                    /*
-                     * If no separator is present, we assume the directory
-                     * specifier is a logical name, and add a colon.  We
-                     * really should use better VMS routines for merging
-                     * things like this, but this will do for now... --
-                     * Richard Levitte
-                     */
-                    c = ':';
-                } else {
-                    c = '\0';
-                }
-#endif
-                if (c == '\0') {
-                    /*
-                     * This is special.  When c == '\0', no directory
-                     * separator should be added.
-                     */
-                    BIO_snprintf(b->data, b->max,
-                                 "%s%08lx.%s%d", ent->dir, h, postfix, k);
-                } else {
-                    BIO_snprintf(b->data, b->max,
-                                 "%s%c%08lx.%s%d", ent->dir, c, h,
-                                 postfix, k);
-                }
-#ifndef OPENSSL_NO_POSIX_IO
-# if defined(_WIN32) && !defined(stat)
-#  define stat _stat
-# endif
-                {
-                    struct stat st;
-                    if (stat(b->data, &st) < 0)
-                        break;
-                }
-#endif
-                /* found one. */
-                if (type == X509_LU_X509) {
-                    if ((X509_load_cert_file(xl, b->data,
-                                             ent->dir_type)) == 0)
-                        break;
-                } else if (type == X509_LU_CRL) {
-                    if ((X509_load_crl_file(xl, b->data, ent->dir_type)) == 0)
-                        break;
-                }
-                /* else case will caught higher up */
-                k++;
-            }
-
-            /*
-             * we have added it to the cache so now pull it out again
-             */
-            CRYPTO_MUTEX_lock_write(&xl->store_ctx->objs_lock);
-            tmp = NULL;
-            sk_X509_OBJECT_sort(xl->store_ctx->objs);
-            if (sk_X509_OBJECT_find(xl->store_ctx->objs, &idx, &stmp)) {
-                tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, idx);
-            }
-            CRYPTO_MUTEX_unlock_write(&xl->store_ctx->objs_lock);
-
-            /*
-             * If a CRL, update the last file suffix added for this
-             */
-
-            if (type == X509_LU_CRL) {
-                CRYPTO_STATIC_MUTEX_lock_write(&g_ent_hashes_lock);
-                /*
-                 * Look for entry again in case another thread added an entry
-                 * first.
-                 */
-                if (!hent) {
-                    htmp.hash = h;
-                    sk_BY_DIR_HASH_sort(ent->hashes);
-                    if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp))
-                        hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
-                }
-                if (!hent) {
-                    hent = OPENSSL_malloc(sizeof(BY_DIR_HASH));
-                    if (hent == NULL) {
-                        CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
-                        ok = 0;
-                        goto finish;
-                    }
-                    hent->hash = h;
-                    hent->suffix = k;
-                    if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
-                        CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
-                        OPENSSL_free(hent);
-                        ok = 0;
-                        goto finish;
-                    }
-                    sk_BY_DIR_HASH_sort(ent->hashes);
-                } else if (hent->suffix < k)
-                    hent->suffix = k;
-
-                CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
-            }
-
-            if (tmp != NULL) {
-                ok = 1;
-                ret->type = tmp->type;
-                OPENSSL_memcpy(&ret->data, &tmp->data, sizeof(ret->data));
-                /*
-                 * If we were going to up the reference count, we would need
-                 * to do it on a perl 'type' basis
-                 */
-                /*
-                 * CRYPTO_add(&tmp->data.x509->references,1,
-                 * CRYPTO_LOCK_X509);
-                 */
-                goto finish;
-            }
+      }
+      if (type == X509_LU_CRL && ent->hashes) {
+        htmp.hash = h;
+        CRYPTO_STATIC_MUTEX_lock_read(&g_ent_hashes_lock);
+        if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp)) {
+          hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
+          k = hent->suffix;
+        } else {
+          hent = NULL;
+          k = 0;
         }
+        CRYPTO_STATIC_MUTEX_unlock_read(&g_ent_hashes_lock);
+      } else {
+        k = 0;
+        hent = NULL;
+      }
+      for (;;) {
+        char c = '/';
+#ifdef OPENSSL_SYS_VMS
+        c = ent->dir[strlen(ent->dir) - 1];
+        if (c != ':' && c != '>' && c != ']') {
+          // If no separator is present, we assume the directory
+          // specifier is a logical name, and add a colon.  We
+          // really should use better VMS routines for merging
+          // things like this, but this will do for now... --
+          // Richard Levitte
+          c = ':';
+        } else {
+          c = '\0';
+        }
+#endif
+        if (c == '\0') {
+          // This is special.  When c == '\0', no directory
+          // separator should be added.
+          BIO_snprintf(b->data, b->max, "%s%08lx.%s%d", ent->dir, h, postfix,
+                       k);
+        } else {
+          BIO_snprintf(b->data, b->max, "%s%c%08lx.%s%d", ent->dir, c, h,
+                       postfix, k);
+        }
+#ifndef OPENSSL_NO_POSIX_IO
+#if defined(_WIN32) && !defined(stat)
+#define stat _stat
+#endif
+        {
+          struct stat st;
+          if (stat(b->data, &st) < 0) {
+            break;
+          }
+        }
+#endif
+        // found one.
+        if (type == X509_LU_X509) {
+          if ((X509_load_cert_file(xl, b->data, ent->dir_type)) == 0) {
+            break;
+          }
+        } else if (type == X509_LU_CRL) {
+          if ((X509_load_crl_file(xl, b->data, ent->dir_type)) == 0) {
+            break;
+          }
+        }
+        // else case will caught higher up
+        k++;
+      }
+
+      // we have added it to the cache so now pull it out again
+      CRYPTO_MUTEX_lock_write(&xl->store_ctx->objs_lock);
+      tmp = NULL;
+      sk_X509_OBJECT_sort(xl->store_ctx->objs);
+      if (sk_X509_OBJECT_find(xl->store_ctx->objs, &idx, &stmp)) {
+        tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, idx);
+      }
+      CRYPTO_MUTEX_unlock_write(&xl->store_ctx->objs_lock);
+
+      // If a CRL, update the last file suffix added for this
+
+      if (type == X509_LU_CRL) {
+        CRYPTO_STATIC_MUTEX_lock_write(&g_ent_hashes_lock);
+        // Look for entry again in case another thread added an entry
+        // first.
+        if (!hent) {
+          htmp.hash = h;
+          sk_BY_DIR_HASH_sort(ent->hashes);
+          if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp)) {
+            hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
+          }
+        }
+        if (!hent) {
+          hent = OPENSSL_malloc(sizeof(BY_DIR_HASH));
+          if (hent == NULL) {
+            CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
+            ok = 0;
+            goto finish;
+          }
+          hent->hash = h;
+          hent->suffix = k;
+          if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
+            CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
+            OPENSSL_free(hent);
+            ok = 0;
+            goto finish;
+          }
+          sk_BY_DIR_HASH_sort(ent->hashes);
+        } else if (hent->suffix < k) {
+          hent->suffix = k;
+        }
+
+        CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
+      }
+
+      if (tmp != NULL) {
+        ok = 1;
+        ret->type = tmp->type;
+        OPENSSL_memcpy(&ret->data, &tmp->data, sizeof(ret->data));
+
+        // Clear any errors that might have been raised processing empty
+        // or malformed files.
+        ERR_clear_error();
+
+        // If we were going to up the reference count, we would need
+        // to do it on a perl 'type' basis
+        goto finish;
+      }
     }
- finish:
-    if (b != NULL)
-        BUF_MEM_free(b);
-    return (ok);
+  }
+finish:
+  BUF_MEM_free(b);
+  return ok;
 }
 
 #endif  // OPENSSL_TRUSTY
diff --git a/src/crypto/x509/by_file.c b/src/crypto/x509/by_file.c
index 1614c8c..4c388eb 100644
--- a/src/crypto/x509/by_file.c
+++ b/src/crypto/x509/by_file.c
@@ -65,213 +65,219 @@
 
 #ifndef OPENSSL_NO_STDIO
 
-static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
-                        long argl, char **ret);
+static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
+                        char **ret);
 static X509_LOOKUP_METHOD x509_file_lookup = {
     "Load file into cache",
-    NULL,                       /* new */
-    NULL,                       /* free */
-    NULL,                       /* init */
-    NULL,                       /* shutdown */
-    by_file_ctrl,               /* ctrl */
-    NULL,                       /* get_by_subject */
-    NULL,                       /* get_by_issuer_serial */
-    NULL,                       /* get_by_fingerprint */
-    NULL,                       /* get_by_alias */
+    NULL,          // new
+    NULL,          // free
+    NULL,          // init
+    NULL,          // shutdown
+    by_file_ctrl,  // ctrl
+    NULL,          // get_by_subject
 };
 
-X509_LOOKUP_METHOD *X509_LOOKUP_file(void)
-{
-    return (&x509_file_lookup);
-}
+X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return &x509_file_lookup; }
 
-static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp,
-                        long argl, char **ret)
-{
-    int ok = 0;
-    const char *file;
+static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
+                        char **ret) {
+  int ok = 0;
+  const char *file;
 
-    switch (cmd) {
+  switch (cmd) {
     case X509_L_FILE_LOAD:
-        if (argl == X509_FILETYPE_DEFAULT) {
-            file = getenv(X509_get_default_cert_file_env());
-            if (file)
-                ok = (X509_load_cert_crl_file(ctx, file,
-                                              X509_FILETYPE_PEM) != 0);
+      if (argl == X509_FILETYPE_DEFAULT) {
+        file = getenv(X509_get_default_cert_file_env());
+        if (file) {
+          ok = (X509_load_cert_crl_file(ctx, file, X509_FILETYPE_PEM) != 0);
+        }
 
-            else
-                ok = (X509_load_cert_crl_file
-                      (ctx, X509_get_default_cert_file(),
-                       X509_FILETYPE_PEM) != 0);
+        else {
+          ok = (X509_load_cert_crl_file(ctx, X509_get_default_cert_file(),
+                                        X509_FILETYPE_PEM) != 0);
+        }
 
-            if (!ok) {
-                OPENSSL_PUT_ERROR(X509, X509_R_LOADING_DEFAULTS);
-            }
+        if (!ok) {
+          OPENSSL_PUT_ERROR(X509, X509_R_LOADING_DEFAULTS);
+        }
+      } else {
+        if (argl == X509_FILETYPE_PEM) {
+          ok = (X509_load_cert_crl_file(ctx, argp, X509_FILETYPE_PEM) != 0);
         } else {
-            if (argl == X509_FILETYPE_PEM)
-                ok = (X509_load_cert_crl_file(ctx, argp,
-                                              X509_FILETYPE_PEM) != 0);
-            else
-                ok = (X509_load_cert_file(ctx, argp, (int)argl) != 0);
+          ok = (X509_load_cert_file(ctx, argp, (int)argl) != 0);
         }
-        break;
-    }
-    return (ok);
+      }
+      break;
+  }
+  return ok;
 }
 
-int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
-{
-    int ret = 0;
-    BIO *in = NULL;
-    int i, count = 0;
-    X509 *x = NULL;
+int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) {
+  int ret = 0;
+  BIO *in = NULL;
+  int i, count = 0;
+  X509 *x = NULL;
 
-    if (file == NULL)
-        return (1);
-    in = BIO_new(BIO_s_file());
+  in = BIO_new(BIO_s_file());
 
-    if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
-        goto err;
-    }
+  if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
+    goto err;
+  }
 
-    if (type == X509_FILETYPE_PEM) {
-        for (;;) {
-            x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL);
-            if (x == NULL) {
-                uint32_t error = ERR_peek_last_error();
-                if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
-                    ERR_GET_REASON(error) == PEM_R_NO_START_LINE &&
-                    count > 0) {
-                    ERR_clear_error();
-                    break;
-                }
-                OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
-                goto err;
-            }
-            i = X509_STORE_add_cert(ctx->store_ctx, x);
-            if (!i)
-                goto err;
-            count++;
-            X509_free(x);
-            x = NULL;
+  if (type == X509_FILETYPE_PEM) {
+    for (;;) {
+      x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL);
+      if (x == NULL) {
+        uint32_t error = ERR_peek_last_error();
+        if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
+            ERR_GET_REASON(error) == PEM_R_NO_START_LINE && count > 0) {
+          ERR_clear_error();
+          break;
         }
-        ret = count;
-    } else if (type == X509_FILETYPE_ASN1) {
-        x = d2i_X509_bio(in, NULL);
-        if (x == NULL) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
-            goto err;
-        }
-        i = X509_STORE_add_cert(ctx->store_ctx, x);
-        if (!i)
-            goto err;
-        ret = i;
-    } else {
-        OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
-        goto err;
-    }
- err:
-    if (x != NULL)
-        X509_free(x);
-    if (in != NULL)
-        BIO_free(in);
-    return (ret);
-}
-
-int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
-{
-    int ret = 0;
-    BIO *in = NULL;
-    int i, count = 0;
-    X509_CRL *x = NULL;
-
-    if (file == NULL)
-        return (1);
-    in = BIO_new(BIO_s_file());
-
-    if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
-        goto err;
-    }
-
-    if (type == X509_FILETYPE_PEM) {
-        for (;;) {
-            x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
-            if (x == NULL) {
-                uint32_t error = ERR_peek_last_error();
-                if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
-                    ERR_GET_REASON(error) == PEM_R_NO_START_LINE &&
-                    count > 0) {
-                    ERR_clear_error();
-                    break;
-                }
-                OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
-                goto err;
-            }
-            i = X509_STORE_add_crl(ctx->store_ctx, x);
-            if (!i)
-                goto err;
-            count++;
-            X509_CRL_free(x);
-            x = NULL;
-        }
-        ret = count;
-    } else if (type == X509_FILETYPE_ASN1) {
-        x = d2i_X509_CRL_bio(in, NULL);
-        if (x == NULL) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
-            goto err;
-        }
-        i = X509_STORE_add_crl(ctx->store_ctx, x);
-        if (!i)
-            goto err;
-        ret = i;
-    } else {
-        OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
-        goto err;
-    }
- err:
-    if (x != NULL)
-        X509_CRL_free(x);
-    if (in != NULL)
-        BIO_free(in);
-    return (ret);
-}
-
-int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type)
-{
-    STACK_OF(X509_INFO) *inf;
-    X509_INFO *itmp;
-    BIO *in;
-    size_t i;
-    int count = 0;
-    if (type != X509_FILETYPE_PEM)
-        return X509_load_cert_file(ctx, file, type);
-    in = BIO_new_file(file, "r");
-    if (!in) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
-        return 0;
-    }
-    inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
-    BIO_free(in);
-    if (!inf) {
         OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
-        return 0;
+        goto err;
+      }
+      i = X509_STORE_add_cert(ctx->store_ctx, x);
+      if (!i) {
+        goto err;
+      }
+      count++;
+      X509_free(x);
+      x = NULL;
     }
-    for (i = 0; i < sk_X509_INFO_num(inf); i++) {
-        itmp = sk_X509_INFO_value(inf, i);
-        if (itmp->x509) {
-            X509_STORE_add_cert(ctx->store_ctx, itmp->x509);
-            count++;
-        }
-        if (itmp->crl) {
-            X509_STORE_add_crl(ctx->store_ctx, itmp->crl);
-            count++;
-        }
+    ret = count;
+  } else if (type == X509_FILETYPE_ASN1) {
+    x = d2i_X509_bio(in, NULL);
+    if (x == NULL) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
+      goto err;
     }
-    sk_X509_INFO_pop_free(inf, X509_INFO_free);
-    return count;
+    i = X509_STORE_add_cert(ctx->store_ctx, x);
+    if (!i) {
+      goto err;
+    }
+    ret = i;
+  } else {
+    OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
+    goto err;
+  }
+
+  if (ret == 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NO_CERTIFICATE_FOUND);
+  }
+
+err:
+  X509_free(x);
+  BIO_free(in);
+  return ret;
 }
 
-#endif                          /* OPENSSL_NO_STDIO */
+int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) {
+  int ret = 0;
+  BIO *in = NULL;
+  int i, count = 0;
+  X509_CRL *x = NULL;
+
+  in = BIO_new(BIO_s_file());
+
+  if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
+    goto err;
+  }
+
+  if (type == X509_FILETYPE_PEM) {
+    for (;;) {
+      x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
+      if (x == NULL) {
+        uint32_t error = ERR_peek_last_error();
+        if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
+            ERR_GET_REASON(error) == PEM_R_NO_START_LINE && count > 0) {
+          ERR_clear_error();
+          break;
+        }
+        OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
+        goto err;
+      }
+      i = X509_STORE_add_crl(ctx->store_ctx, x);
+      if (!i) {
+        goto err;
+      }
+      count++;
+      X509_CRL_free(x);
+      x = NULL;
+    }
+    ret = count;
+  } else if (type == X509_FILETYPE_ASN1) {
+    x = d2i_X509_CRL_bio(in, NULL);
+    if (x == NULL) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
+      goto err;
+    }
+    i = X509_STORE_add_crl(ctx->store_ctx, x);
+    if (!i) {
+      goto err;
+    }
+    ret = i;
+  } else {
+    OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
+    goto err;
+  }
+
+  if (ret == 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NO_CRL_FOUND);
+  }
+
+err:
+  X509_CRL_free(x);
+  BIO_free(in);
+  return ret;
+}
+
+int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type) {
+  STACK_OF(X509_INFO) *inf;
+  X509_INFO *itmp;
+  BIO *in;
+  size_t i;
+  int count = 0;
+
+  if (type != X509_FILETYPE_PEM) {
+    return X509_load_cert_file(ctx, file, type);
+  }
+  in = BIO_new_file(file, "r");
+  if (!in) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
+    return 0;
+  }
+  inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
+  BIO_free(in);
+  if (!inf) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
+    return 0;
+  }
+  for (i = 0; i < sk_X509_INFO_num(inf); i++) {
+    itmp = sk_X509_INFO_value(inf, i);
+    if (itmp->x509) {
+      if (!X509_STORE_add_cert(ctx->store_ctx, itmp->x509)) {
+        goto err;
+      }
+      count++;
+    }
+    if (itmp->crl) {
+      if (!X509_STORE_add_crl(ctx->store_ctx, itmp->crl)) {
+        goto err;
+      }
+      count++;
+    }
+  }
+
+  if (count == 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NO_CERTIFICATE_OR_CRL_FOUND);
+  }
+
+err:
+  sk_X509_INFO_pop_free(inf, X509_INFO_free);
+  return count;
+}
+
+#endif  // OPENSSL_NO_STDIO
diff --git a/src/crypto/x509/i2d_pr.c b/src/crypto/x509/i2d_pr.c
index c3fb8a8..3c8887f 100644
--- a/src/crypto/x509/i2d_pr.c
+++ b/src/crypto/x509/i2d_pr.c
@@ -56,28 +56,25 @@
  * [including the GNU Public Licence.] */
 
 #include <openssl/asn1.h>
+#include <openssl/dsa.h>
 #include <openssl/ec_key.h>
 #include <openssl/err.h>
 #include <openssl/evp.h>
 #include <openssl/rsa.h>
-#include <openssl/dsa.h>
 
 
-int i2d_PrivateKey(const EVP_PKEY *a, uint8_t **pp)
-{
-    switch (EVP_PKEY_id(a)) {
+int i2d_PrivateKey(const EVP_PKEY *a, uint8_t **pp) {
+  switch (EVP_PKEY_id(a)) {
     case EVP_PKEY_RSA:
-        return i2d_RSAPrivateKey(a->pkey.rsa, pp);
+      return i2d_RSAPrivateKey(a->pkey.rsa, pp);
     case EVP_PKEY_EC:
-        return i2d_ECPrivateKey(a->pkey.ec, pp);
+      return i2d_ECPrivateKey(a->pkey.ec, pp);
     case EVP_PKEY_DSA:
-        return i2d_DSAPrivateKey(a->pkey.dsa, pp);
+      return i2d_DSAPrivateKey(a->pkey.dsa, pp);
     default:
-        /*
-         * Although this file is in crypto/x509 for layering reasons, it emits
-         * an error code from ASN1 for OpenSSL compatibility.
-         */
-        OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);
-        return -1;
-    }
+      // Although this file is in crypto/x509 for layering reasons, it emits
+      // an error code from ASN1 for OpenSSL compatibility.
+      OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);
+      return -1;
+  }
 }
diff --git a/src/crypto/x509/internal.h b/src/crypto/x509/internal.h
index 4592087..edba75c 100644
--- a/src/crypto/x509/internal.h
+++ b/src/crypto/x509/internal.h
@@ -70,14 +70,17 @@
 #endif
 
 
-/* Internal structures. */
+// Internal structures.
+
+typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE;
+typedef struct X509_POLICY_TREE_st X509_POLICY_TREE;
 
 typedef struct X509_val_st {
   ASN1_TIME *notBefore;
   ASN1_TIME *notAfter;
 } X509_VAL;
 
-DECLARE_ASN1_FUNCTIONS(X509_VAL)
+DECLARE_ASN1_FUNCTIONS_const(X509_VAL)
 
 struct X509_pubkey_st {
   X509_ALGOR *algor;
@@ -106,13 +109,14 @@
   STACK_OF(ASN1_TYPE) *set;
 } /* X509_ATTRIBUTE */;
 
-struct x509_cert_aux_st {
+typedef struct x509_cert_aux_st {
   STACK_OF(ASN1_OBJECT) *trust;   // trusted uses
   STACK_OF(ASN1_OBJECT) *reject;  // rejected uses
   ASN1_UTF8STRING *alias;         // "friendly name"
   ASN1_OCTET_STRING *keyid;       // key id of private key
-  STACK_OF(X509_ALGOR) *other;    // other unspecified info
-} /* X509_CERT_AUX */;
+} X509_CERT_AUX;
+
+DECLARE_ASN1_FUNCTIONS_const(X509_CERT_AUX)
 
 struct X509_extension_st {
   ASN1_OBJECT *object;
@@ -134,6 +138,8 @@
   ASN1_ENCODING enc;
 } X509_CINF;
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(X509_CINF)
 
 struct x509_st {
@@ -155,7 +161,7 @@
   STACK_OF(DIST_POINT) *crldp;
   STACK_OF(GENERAL_NAME) *altname;
   NAME_CONSTRAINTS *nc;
-  unsigned char sha1_hash[SHA_DIGEST_LENGTH];
+  unsigned char cert_hash[SHA256_DIGEST_LENGTH];
   X509_CERT_AUX *aux;
   CRYPTO_BUFFER *buf;
   CRYPTO_MUTEX lock;
@@ -170,15 +176,26 @@
   STACK_OF(X509_ATTRIBUTE) *attributes;  // [ 0 ]
 } X509_REQ_INFO;
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO)
 
 struct X509_req_st {
   X509_REQ_INFO *req_info;
   X509_ALGOR *sig_alg;
   ASN1_BIT_STRING *signature;
-  CRYPTO_refcount_t references;
 } /* X509_REQ */;
 
+struct x509_revoked_st {
+  ASN1_INTEGER *serialNumber;
+  ASN1_TIME *revocationDate;
+  STACK_OF(X509_EXTENSION) /* optional */ *extensions;
+  // Set up if indirect CRL
+  STACK_OF(GENERAL_NAME) *issuer;
+  // Revocation reason
+  int reason;
+} /* X509_REVOKED */;
+
 typedef struct {
   ASN1_INTEGER *version;
   X509_ALGOR *sig_alg;
@@ -190,6 +207,8 @@
   ASN1_ENCODING enc;
 } X509_CRL_INFO;
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO)
 
 struct X509_crl_st {
@@ -208,10 +227,8 @@
   // CRL and base CRL numbers for delta processing
   ASN1_INTEGER *crl_number;
   ASN1_INTEGER *base_crl_number;
-  unsigned char sha1_hash[SHA_DIGEST_LENGTH];
+  unsigned char crl_hash[SHA256_DIGEST_LENGTH];
   STACK_OF(GENERAL_NAMES) *issuers;
-  const X509_CRL_METHOD *meth;
-  void *meth_data;
 } /* X509_CRL */;
 
 struct X509_VERIFY_PARAM_st {
@@ -256,12 +273,6 @@
               char **ret);
   int (*get_by_subject)(X509_LOOKUP *ctx, int type, X509_NAME *name,
                         X509_OBJECT *ret);
-  int (*get_by_issuer_serial)(X509_LOOKUP *ctx, int type, X509_NAME *name,
-                              ASN1_INTEGER *serial, X509_OBJECT *ret);
-  int (*get_by_fingerprint)(X509_LOOKUP *ctx, int type, unsigned char *bytes,
-                            int len, X509_OBJECT *ret);
-  int (*get_by_alias)(X509_LOOKUP *ctx, int type, char *str, int len,
-                      X509_OBJECT *ret);
 } /* X509_LOOKUP_METHOD */;
 
 // This is used to hold everything.  It is used for all certificate
@@ -301,7 +312,7 @@
   int init;                    // have we been started
   int skip;                    // don't use us.
   X509_LOOKUP_METHOD *method;  // the functions
-  char *method_data;           // method data
+  void *method_data;           // method data
 
   X509_STORE *store_ctx;  // who owns us
 } /* X509_LOOKUP */;
@@ -360,45 +371,47 @@
 
 ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf);
 
+int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent);
 
-/* RSA-PSS functions. */
 
-/* x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
- * signature algorithm parameters in |sigalg| (which must have type
- * |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
- * error. */
+// RSA-PSS functions.
+
+// x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
+// signature algorithm parameters in |sigalg| (which must have type
+// |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
+// error.
 int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                         EVP_PKEY *pkey);
 
-/* x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
- * |ctx|, which must have been configured for an RSA-PSS signing operation. It
- * returns one on success and zero on error. */
+// x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
+// |ctx|, which must have been configured for an RSA-PSS signing operation. It
+// returns one on success and zero on error.
 int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor);
 
-/* x509_print_rsa_pss_params prints a human-readable representation of RSA-PSS
- * parameters in |sigalg| to |bp|. It returns one on success and zero on
- * error. */
+// x509_print_rsa_pss_params prints a human-readable representation of RSA-PSS
+// parameters in |sigalg| to |bp|. It returns one on success and zero on
+// error.
 int x509_print_rsa_pss_params(BIO *bp, const X509_ALGOR *sigalg, int indent,
                               ASN1_PCTX *pctx);
 
 
-/* Signature algorithm functions. */
+// Signature algorithm functions.
 
-/* x509_digest_sign_algorithm encodes the signing parameters of |ctx| as an
- * AlgorithmIdentifer and saves the result in |algor|. It returns one on
- * success, or zero on error. */
+// x509_digest_sign_algorithm encodes the signing parameters of |ctx| as an
+// AlgorithmIdentifer and saves the result in |algor|. It returns one on
+// success, or zero on error.
 int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor);
 
-/* x509_digest_verify_init sets up |ctx| for a signature verification operation
- * with public key |pkey| and parameters from |algor|. The |ctx| argument must
- * have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
- * zero on error. */
+// x509_digest_verify_init sets up |ctx| for a signature verification operation
+// with public key |pkey| and parameters from |algor|. The |ctx| argument must
+// have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
+// zero on error.
 int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                             EVP_PKEY *pkey);
 
 
 #if defined(__cplusplus)
-}  /* extern C */
+}  // extern C
 #endif
 
-#endif  /* OPENSSL_HEADER_X509_INTERNAL_H */
+#endif  // OPENSSL_HEADER_X509_INTERNAL_H
diff --git a/src/crypto/x509/name_print.c b/src/crypto/x509/name_print.c
index b5523c0..29207cc 100644
--- a/src/crypto/x509/name_print.c
+++ b/src/crypto/x509/name_print.c
@@ -64,183 +64,186 @@
 #include <openssl/obj.h>
 
 
-static int maybe_write(BIO *out, const void *buf, int len)
-{
-    /* If |out| is NULL, ignore the output but report the length. */
-    return out == NULL || BIO_write(out, buf, len) == len;
+static int maybe_write(BIO *out, const void *buf, int len) {
+  // If |out| is NULL, ignore the output but report the length.
+  return out == NULL || BIO_write(out, buf, len) == len;
 }
 
-/* do_indent prints |indent| spaces to |out|. */
-static int do_indent(BIO *out, int indent)
-{
-    for (int i = 0; i < indent; i++) {
-        if (!maybe_write(out, " ", 1)) {
-            return 0;
-        }
+// do_indent prints |indent| spaces to |out|.
+static int do_indent(BIO *out, int indent) {
+  for (int i = 0; i < indent; i++) {
+    if (!maybe_write(out, " ", 1)) {
+      return 0;
     }
-    return 1;
+  }
+  return 1;
 }
 
-#define FN_WIDTH_LN     25
-#define FN_WIDTH_SN     10
+#define FN_WIDTH_LN 25
+#define FN_WIDTH_SN 10
 
 static int do_name_ex(BIO *out, const X509_NAME *n, int indent,
-                      unsigned long flags)
-{
-    int i, prev = -1, orflags, cnt;
-    int fn_opt, fn_nid;
-    ASN1_OBJECT *fn;
-    ASN1_STRING *val;
-    X509_NAME_ENTRY *ent;
-    char objtmp[80];
-    const char *objbuf;
-    int outlen, len;
-    const char *sep_dn, *sep_mv, *sep_eq;
-    int sep_dn_len, sep_mv_len, sep_eq_len;
-    if (indent < 0)
-        indent = 0;
-    outlen = indent;
-    if (!do_indent(out, indent))
-        return -1;
-    switch (flags & XN_FLAG_SEP_MASK) {
+                      unsigned long flags) {
+  int i, prev = -1, orflags, cnt;
+  int fn_opt, fn_nid;
+  char objtmp[80];
+  const char *objbuf;
+  int outlen, len;
+  const char *sep_dn, *sep_mv, *sep_eq;
+  int sep_dn_len, sep_mv_len, sep_eq_len;
+  if (indent < 0) {
+    indent = 0;
+  }
+  outlen = indent;
+  if (!do_indent(out, indent)) {
+    return -1;
+  }
+  switch (flags & XN_FLAG_SEP_MASK) {
     case XN_FLAG_SEP_MULTILINE:
-        sep_dn = "\n";
-        sep_dn_len = 1;
-        sep_mv = " + ";
-        sep_mv_len = 3;
-        break;
+      sep_dn = "\n";
+      sep_dn_len = 1;
+      sep_mv = " + ";
+      sep_mv_len = 3;
+      break;
 
     case XN_FLAG_SEP_COMMA_PLUS:
-        sep_dn = ",";
-        sep_dn_len = 1;
-        sep_mv = "+";
-        sep_mv_len = 1;
-        indent = 0;
-        break;
+      sep_dn = ",";
+      sep_dn_len = 1;
+      sep_mv = "+";
+      sep_mv_len = 1;
+      indent = 0;
+      break;
 
     case XN_FLAG_SEP_CPLUS_SPC:
-        sep_dn = ", ";
-        sep_dn_len = 2;
-        sep_mv = " + ";
-        sep_mv_len = 3;
-        indent = 0;
-        break;
+      sep_dn = ", ";
+      sep_dn_len = 2;
+      sep_mv = " + ";
+      sep_mv_len = 3;
+      indent = 0;
+      break;
 
     case XN_FLAG_SEP_SPLUS_SPC:
-        sep_dn = "; ";
-        sep_dn_len = 2;
-        sep_mv = " + ";
-        sep_mv_len = 3;
-        indent = 0;
-        break;
+      sep_dn = "; ";
+      sep_dn_len = 2;
+      sep_mv = " + ";
+      sep_mv_len = 3;
+      indent = 0;
+      break;
 
     default:
-        return -1;
-    }
+      return -1;
+  }
 
-    if (flags & XN_FLAG_SPC_EQ) {
-        sep_eq = " = ";
-        sep_eq_len = 3;
+  if (flags & XN_FLAG_SPC_EQ) {
+    sep_eq = " = ";
+    sep_eq_len = 3;
+  } else {
+    sep_eq = "=";
+    sep_eq_len = 1;
+  }
+
+  fn_opt = flags & XN_FLAG_FN_MASK;
+
+  cnt = X509_NAME_entry_count(n);
+  for (i = 0; i < cnt; i++) {
+    const X509_NAME_ENTRY *ent;
+    if (flags & XN_FLAG_DN_REV) {
+      ent = X509_NAME_get_entry(n, cnt - i - 1);
     } else {
-        sep_eq = "=";
-        sep_eq_len = 1;
+      ent = X509_NAME_get_entry(n, i);
+    }
+    if (prev != -1) {
+      if (prev == X509_NAME_ENTRY_set(ent)) {
+        if (!maybe_write(out, sep_mv, sep_mv_len)) {
+          return -1;
+        }
+        outlen += sep_mv_len;
+      } else {
+        if (!maybe_write(out, sep_dn, sep_dn_len)) {
+          return -1;
+        }
+        outlen += sep_dn_len;
+        if (!do_indent(out, indent)) {
+          return -1;
+        }
+        outlen += indent;
+      }
+    }
+    prev = X509_NAME_ENTRY_set(ent);
+    const ASN1_OBJECT *fn = X509_NAME_ENTRY_get_object(ent);
+    const ASN1_STRING *val = X509_NAME_ENTRY_get_data(ent);
+    fn_nid = OBJ_obj2nid(fn);
+    if (fn_opt != XN_FLAG_FN_NONE) {
+      int objlen, fld_len;
+      if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
+        OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1);
+        fld_len = 0;  // XXX: what should this be?
+        objbuf = objtmp;
+      } else {
+        if (fn_opt == XN_FLAG_FN_SN) {
+          fld_len = FN_WIDTH_SN;
+          objbuf = OBJ_nid2sn(fn_nid);
+        } else if (fn_opt == XN_FLAG_FN_LN) {
+          fld_len = FN_WIDTH_LN;
+          objbuf = OBJ_nid2ln(fn_nid);
+        } else {
+          fld_len = 0;  // XXX: what should this be?
+          objbuf = "";
+        }
+      }
+      objlen = strlen(objbuf);
+      if (!maybe_write(out, objbuf, objlen)) {
+        return -1;
+      }
+      if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
+        if (!do_indent(out, fld_len - objlen)) {
+          return -1;
+        }
+        outlen += fld_len - objlen;
+      }
+      if (!maybe_write(out, sep_eq, sep_eq_len)) {
+        return -1;
+      }
+      outlen += objlen + sep_eq_len;
+    }
+    // If the field name is unknown then fix up the DER dump flag. We
+    // might want to limit this further so it will DER dump on anything
+    // other than a few 'standard' fields.
+    if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS)) {
+      orflags = ASN1_STRFLGS_DUMP_ALL;
+    } else {
+      orflags = 0;
     }
 
-    fn_opt = flags & XN_FLAG_FN_MASK;
-
-    cnt = X509_NAME_entry_count(n);
-    for (i = 0; i < cnt; i++) {
-        if (flags & XN_FLAG_DN_REV)
-            ent = X509_NAME_get_entry(n, cnt - i - 1);
-        else
-            ent = X509_NAME_get_entry(n, i);
-        if (prev != -1) {
-            if (prev == X509_NAME_ENTRY_set(ent)) {
-                if (!maybe_write(out, sep_mv, sep_mv_len))
-                    return -1;
-                outlen += sep_mv_len;
-            } else {
-                if (!maybe_write(out, sep_dn, sep_dn_len))
-                    return -1;
-                outlen += sep_dn_len;
-                if (!do_indent(out, indent))
-                    return -1;
-                outlen += indent;
-            }
-        }
-        prev = X509_NAME_ENTRY_set(ent);
-        fn = X509_NAME_ENTRY_get_object(ent);
-        val = X509_NAME_ENTRY_get_data(ent);
-        fn_nid = OBJ_obj2nid(fn);
-        if (fn_opt != XN_FLAG_FN_NONE) {
-            int objlen, fld_len;
-            if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
-                OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1);
-                fld_len = 0;    /* XXX: what should this be? */
-                objbuf = objtmp;
-            } else {
-                if (fn_opt == XN_FLAG_FN_SN) {
-                    fld_len = FN_WIDTH_SN;
-                    objbuf = OBJ_nid2sn(fn_nid);
-                } else if (fn_opt == XN_FLAG_FN_LN) {
-                    fld_len = FN_WIDTH_LN;
-                    objbuf = OBJ_nid2ln(fn_nid);
-                } else {
-                    fld_len = 0; /* XXX: what should this be? */
-                    objbuf = "";
-                }
-            }
-            objlen = strlen(objbuf);
-            if (!maybe_write(out, objbuf, objlen))
-                return -1;
-            if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
-                if (!do_indent(out, fld_len - objlen))
-                    return -1;
-                outlen += fld_len - objlen;
-            }
-            if (!maybe_write(out, sep_eq, sep_eq_len))
-                return -1;
-            outlen += objlen + sep_eq_len;
-        }
-        /*
-         * If the field name is unknown then fix up the DER dump flag. We
-         * might want to limit this further so it will DER dump on anything
-         * other than a few 'standard' fields.
-         */
-        if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS))
-            orflags = ASN1_STRFLGS_DUMP_ALL;
-        else
-            orflags = 0;
-
-        len = ASN1_STRING_print_ex(out, val, flags | orflags);
-        if (len < 0)
-            return -1;
-        outlen += len;
+    len = ASN1_STRING_print_ex(out, val, flags | orflags);
+    if (len < 0) {
+      return -1;
     }
-    return outlen;
+    outlen += len;
+  }
+  return outlen;
 }
 
 int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
-                       unsigned long flags)
-{
-    if (flags == XN_FLAG_COMPAT)
-        return X509_NAME_print(out, nm, indent);
-    return do_name_ex(out, nm, indent, flags);
+                       unsigned long flags) {
+  if (flags == XN_FLAG_COMPAT) {
+    return X509_NAME_print(out, nm, indent);
+  }
+  return do_name_ex(out, nm, indent, flags);
 }
 
 int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent,
-                          unsigned long flags)
-{
-    BIO *bio = NULL;
-    if (fp != NULL) {
-        /* If |fp| is NULL, this function returns the number of bytes without
-         * writing. */
-        bio = BIO_new_fp(fp, BIO_NOCLOSE);
-        if (bio == NULL) {
-            return -1;
-        }
+                          unsigned long flags) {
+  BIO *bio = NULL;
+  if (fp != NULL) {
+    // If |fp| is NULL, this function returns the number of bytes without
+    // writing.
+    bio = BIO_new_fp(fp, BIO_NOCLOSE);
+    if (bio == NULL) {
+      return -1;
     }
-    int ret = X509_NAME_print_ex(bio, nm, indent, flags);
-    BIO_free(bio);
-    return ret;
+  }
+  int ret = X509_NAME_print_ex(bio, nm, indent, flags);
+  BIO_free(bio);
+  return ret;
 }
diff --git a/src/crypto/x509/rsa_pss.c b/src/crypto/x509/rsa_pss.c
index 21a6bea..606fffd 100644
--- a/src/crypto/x509/rsa_pss.c
+++ b/src/crypto/x509/rsa_pss.c
@@ -9,7 +9,7 @@
  * are met:
  *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
+ *    notice, this list of conditions and the following disclaimer.
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
@@ -56,12 +56,13 @@
 #include <openssl/x509.h>
 
 #include <assert.h>
+#include <limits.h>
 
 #include <openssl/asn1.h>
 #include <openssl/asn1t.h>
 #include <openssl/bio.h>
-#include <openssl/evp.h>
 #include <openssl/err.h>
+#include <openssl/evp.h>
 #include <openssl/obj.h>
 
 #include "internal.h"
@@ -77,19 +78,19 @@
 }
 
 ASN1_SEQUENCE_cb(RSA_PSS_PARAMS, rsa_pss_cb) = {
-  ASN1_EXP_OPT(RSA_PSS_PARAMS, hashAlgorithm, X509_ALGOR,0),
-  ASN1_EXP_OPT(RSA_PSS_PARAMS, maskGenAlgorithm, X509_ALGOR,1),
-  ASN1_EXP_OPT(RSA_PSS_PARAMS, saltLength, ASN1_INTEGER,2),
-  ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER,3),
+    ASN1_EXP_OPT(RSA_PSS_PARAMS, hashAlgorithm, X509_ALGOR, 0),
+    ASN1_EXP_OPT(RSA_PSS_PARAMS, maskGenAlgorithm, X509_ALGOR, 1),
+    ASN1_EXP_OPT(RSA_PSS_PARAMS, saltLength, ASN1_INTEGER, 2),
+    ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER, 3),
 } ASN1_SEQUENCE_END_cb(RSA_PSS_PARAMS, RSA_PSS_PARAMS)
 
-IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS)
+IMPLEMENT_ASN1_FUNCTIONS_const(RSA_PSS_PARAMS)
 
 
-/* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
-static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg) {
-  if (alg == NULL || alg->parameter == NULL ||
-      OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
+// Given an MGF1 Algorithm ID decode to an Algorithm Identifier
+static X509_ALGOR *rsa_mgf1_decode(const X509_ALGOR *alg) {
+  if (OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
+      alg->parameter == NULL ||
       alg->parameter->type != V_ASN1_SEQUENCE) {
     return NULL;
   }
@@ -99,30 +100,27 @@
   return d2i_X509_ALGOR(NULL, &p, plen);
 }
 
-static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
-                                      X509_ALGOR **pmaskHash) {
-  *pmaskHash = NULL;
-
+static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg) {
   if (alg->parameter == NULL || alg->parameter->type != V_ASN1_SEQUENCE) {
     return NULL;
   }
 
   const uint8_t *p = alg->parameter->value.sequence->data;
   int plen = alg->parameter->value.sequence->length;
-  RSA_PSS_PARAMS *pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen);
-  if (pss == NULL) {
-    return NULL;
-  }
-
-  *pmaskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
-  return pss;
+  return d2i_RSA_PSS_PARAMS(NULL, &p, plen);
 }
 
-/* allocate and set algorithm ID from EVP_MD, default SHA1 */
+static int is_allowed_pss_md(const EVP_MD *md) {
+  int md_type = EVP_MD_type(md);
+  return md_type == NID_sha256 || md_type == NID_sha384 ||
+         md_type == NID_sha512;
+}
+
+// rsa_md_to_algor sets |*palg| to an |X509_ALGOR| describing the digest |md|,
+// which must be an allowed PSS digest.
 static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md) {
-  if (EVP_MD_type(md) == NID_sha1) {
-    return 1;
-  }
+  // SHA-1 should be omitted (DEFAULT), but we do not allow SHA-1.
+  assert(is_allowed_pss_md(md));
   *palg = X509_ALGOR_new();
   if (*palg == NULL) {
     return 0;
@@ -131,16 +129,14 @@
   return 1;
 }
 
-/* Allocate and set MGF1 algorithm ID from EVP_MD */
+// rsa_md_to_mgf1 sets |*palg| to an |X509_ALGOR| describing MGF-1 with the
+// digest |mgf1md|, which must be an allowed PSS digest.
 static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md) {
+  // SHA-1 should be omitted (DEFAULT), but we do not allow SHA-1.
+  assert(is_allowed_pss_md(mgf1md));
   X509_ALGOR *algtmp = NULL;
   ASN1_STRING *stmp = NULL;
-  *palg = NULL;
-
-  if (EVP_MD_type(mgf1md) == NID_sha1) {
-    return 1;
-  }
-  /* need to embed algorithm ID inside another */
+  // need to embed algorithm ID inside another
   if (!rsa_md_to_algor(&algtmp, mgf1md) ||
       !ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp)) {
     goto err;
@@ -162,38 +158,35 @@
   return 0;
 }
 
-/* convert algorithm ID to EVP_MD, default SHA1 */
-static const EVP_MD *rsa_algor_to_md(X509_ALGOR *alg) {
-  const EVP_MD *md;
+static const EVP_MD *rsa_algor_to_md(const X509_ALGOR *alg) {
   if (!alg) {
-    return EVP_sha1();
-  }
-  md = EVP_get_digestbyobj(alg->algorithm);
-  if (md == NULL) {
+    // If omitted, PSS defaults to SHA-1, which we do not allow.
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
+    return NULL;
+  }
+  const EVP_MD *md = EVP_get_digestbyobj(alg->algorithm);
+  if (md == NULL || !is_allowed_pss_md(md)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
+    return NULL;
   }
   return md;
 }
 
-/* convert MGF1 algorithm ID to EVP_MD, default SHA1 */
-static const EVP_MD *rsa_mgf1_to_md(const X509_ALGOR *alg,
-                                    X509_ALGOR *maskHash) {
-  const EVP_MD *md;
+static const EVP_MD *rsa_mgf1_to_md(const X509_ALGOR *alg) {
   if (!alg) {
-    return EVP_sha1();
-  }
-  /* Check mask and lookup mask hash algorithm */
-  if (OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
-      maskHash == NULL) {
+    // If omitted, PSS defaults to MGF-1 with SHA-1, which we do not allow.
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     return NULL;
   }
-  md = EVP_get_digestbyobj(maskHash->algorithm);
-  if (md == NULL) {
+  // Check mask and lookup mask hash algorithm.
+  X509_ALGOR *maskHash = rsa_mgf1_decode(alg);
+  if (maskHash == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     return NULL;
   }
-  return md;
+  const EVP_MD *ret = rsa_algor_to_md(maskHash);
+  X509_ALGOR_free(maskHash);
+  return ret;
 }
 
 int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor) {
@@ -205,18 +198,14 @@
     return 0;
   }
 
-  EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
+  if (sigmd != mgf1md || !is_allowed_pss_md(sigmd)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
+    return 0;
+  }
+  int md_len = EVP_MD_size(sigmd);
   if (saltlen == -1) {
-    saltlen = EVP_MD_size(sigmd);
-  } else if (saltlen == -2) {
-    // TODO(davidben): Forbid this mode. The world has largely standardized on
-    // salt length matching hash length.
-    saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
-    if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0) {
-      saltlen--;
-    }
-  } else if (saltlen != (int)EVP_MD_size(sigmd)) {
-    // We only allow salt length matching hash length and, for now, the -2 case.
+    saltlen = md_len;
+  } else if (saltlen != md_len) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     return 0;
   }
@@ -228,12 +217,12 @@
     goto err;
   }
 
-  if (saltlen != 20) {
-    pss->saltLength = ASN1_INTEGER_new();
-    if (!pss->saltLength ||
-        !ASN1_INTEGER_set(pss->saltLength, saltlen)) {
-      goto err;
-    }
+  // The DEFAULT value is 20, but this does not match any supported digest.
+  assert(saltlen != 20);
+  pss->saltLength = ASN1_INTEGER_new();
+  if (!pss->saltLength ||  //
+      !ASN1_INTEGER_set_int64(pss->saltLength, saltlen)) {
+    goto err;
   }
 
   if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd) ||
@@ -241,7 +230,7 @@
     goto err;
   }
 
-  /* Finally create string with pss parameter encoding. */
+  // Finally create string with pss parameter encoding.
   if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os)) {
     goto err;
   }
@@ -260,35 +249,40 @@
                         EVP_PKEY *pkey) {
   assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
 
-  /* Decode PSS parameters */
+  // Decode PSS parameters
   int ret = 0;
-  X509_ALGOR *maskHash;
-  RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg, &maskHash);
+  RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg);
   if (pss == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     goto err;
   }
 
-  const EVP_MD *mgf1md = rsa_mgf1_to_md(pss->maskGenAlgorithm, maskHash);
+  const EVP_MD *mgf1md = rsa_mgf1_to_md(pss->maskGenAlgorithm);
   const EVP_MD *md = rsa_algor_to_md(pss->hashAlgorithm);
   if (mgf1md == NULL || md == NULL) {
     goto err;
   }
 
-  int saltlen = 20;
-  if (pss->saltLength != NULL) {
-    saltlen = ASN1_INTEGER_get(pss->saltLength);
-
-    /* Could perform more salt length sanity checks but the main
-     * RSA routines will trap other invalid values anyway. */
-    if (saltlen < 0) {
-      OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
-      goto err;
-    }
+  // We require the MGF-1 and signing hashes to match.
+  if (mgf1md != md) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
+    goto err;
   }
 
-  /* low-level routines support only trailer field 0xbc (value 1)
-   * and PKCS#1 says we should reject any other value anyway. */
+  // We require the salt length be the hash length. The DEFAULT value is 20, but
+  // this does not match any supported salt length.
+  uint64_t salt_len = 0;
+  if (pss->saltLength == NULL ||
+      !ASN1_INTEGER_get_uint64(&salt_len, pss->saltLength) ||
+      salt_len != EVP_MD_size(md)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
+    goto err;
+  }
+  assert(salt_len <= INT_MAX);
+
+  // The trailer field must be 1 (0xbc). This value is DEFAULT, so the structure
+  // is required to omit it in DER. Although a syntax error, we also tolerate an
+  // explicitly-encoded value. See the certificates in cl/362617931.
   if (pss->trailerField != NULL && ASN1_INTEGER_get(pss->trailerField) != 1) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     goto err;
@@ -297,7 +291,7 @@
   EVP_PKEY_CTX *pctx;
   if (!EVP_DigestVerifyInit(ctx, &pctx, md, NULL, pkey) ||
       !EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
-      !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, saltlen) ||
+      !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, (int)salt_len) ||
       !EVP_PKEY_CTX_set_rsa_mgf1_md(pctx, mgf1md)) {
     goto err;
   }
@@ -306,7 +300,6 @@
 
 err:
   RSA_PSS_PARAMS_free(pss);
-  X509_ALGOR_free(maskHash);
   return ret;
 }
 
@@ -315,8 +308,8 @@
   assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
 
   int rv = 0;
-  X509_ALGOR *maskHash;
-  RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg, &maskHash);
+  X509_ALGOR *maskHash = NULL;
+  RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg);
   if (!pss) {
     if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0) {
       goto err;
@@ -325,8 +318,8 @@
     goto err;
   }
 
-  if (BIO_puts(bp, "\n") <= 0 ||
-      !BIO_indent(bp, indent, 128) ||
+  if (BIO_puts(bp, "\n") <= 0 ||       //
+      !BIO_indent(bp, indent, 128) ||  //
       BIO_puts(bp, "Hash Algorithm: ") <= 0) {
     goto err;
   }
@@ -339,31 +332,31 @@
     goto err;
   }
 
-  if (BIO_puts(bp, "\n") <= 0 ||
-      !BIO_indent(bp, indent, 128) ||
+  if (BIO_puts(bp, "\n") <= 0 ||       //
+      !BIO_indent(bp, indent, 128) ||  //
       BIO_puts(bp, "Mask Algorithm: ") <= 0) {
     goto err;
   }
 
   if (pss->maskGenAlgorithm) {
-    if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0 ||
-        BIO_puts(bp, " with ") <= 0) {
-      goto err;
-    }
-
-    if (maskHash) {
-      if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) {
+    maskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
+    if (maskHash == NULL) {
+      if (BIO_puts(bp, "INVALID") <= 0) {
         goto err;
       }
-    } else if (BIO_puts(bp, "INVALID") <= 0) {
-      goto err;
+    } else {
+      if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0 ||
+          BIO_puts(bp, " with ") <= 0 ||
+          i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) {
+        goto err;
+      }
     }
   } else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) {
     goto err;
   }
   BIO_puts(bp, "\n");
 
-  if (!BIO_indent(bp, indent, 128) ||
+  if (!BIO_indent(bp, indent, 128) ||  //
       BIO_puts(bp, "Salt Length: 0x") <= 0) {
     goto err;
   }
@@ -377,7 +370,7 @@
   }
   BIO_puts(bp, "\n");
 
-  if (!BIO_indent(bp, indent, 128) ||
+  if (!BIO_indent(bp, indent, 128) ||  //
       BIO_puts(bp, "Trailer Field: 0x") <= 0) {
     goto err;
   }
diff --git a/src/crypto/x509/t_crl.c b/src/crypto/x509/t_crl.c
index d924f85..1957e31 100644
--- a/src/crypto/x509/t_crl.c
+++ b/src/crypto/x509/t_crl.c
@@ -54,6 +54,8 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
+#include <assert.h>
+
 #include <openssl/asn1.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
@@ -61,70 +63,83 @@
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
-int X509_CRL_print_fp(FILE *fp, X509_CRL *x)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = X509_CRL_print(b, x);
-    BIO_free(b);
-    return ret;
+int X509_CRL_print_fp(FILE *fp, X509_CRL *x) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = X509_CRL_print(b, x);
+  BIO_free(b);
+  return ret;
 }
 
-int X509_CRL_print(BIO *out, X509_CRL *x)
-{
-    STACK_OF(X509_REVOKED) *rev;
-    X509_REVOKED *r;
-    long l;
-    size_t i;
-    char *p;
+int X509_CRL_print(BIO *out, X509_CRL *x) {
+  long version = X509_CRL_get_version(x);
+  assert(X509_CRL_VERSION_1 <= version && version <= X509_CRL_VERSION_2);
+  const X509_ALGOR *sig_alg;
+  const ASN1_BIT_STRING *signature;
+  X509_CRL_get0_signature(x, &signature, &sig_alg);
+  if (BIO_printf(out, "Certificate Revocation List (CRL):\n") <= 0 ||
+      BIO_printf(out, "%8sVersion %ld (0x%lx)\n", "", version + 1,
+                 (unsigned long)version) <= 0 ||
+      // Note this and the other |X509_signature_print| call both print the
+      // outer signature algorithm, rather than printing the inner and outer
+      // ones separately. This matches OpenSSL, though it was probably a bug.
+      !X509_signature_print(out, sig_alg, NULL)) {
+    return 0;
+  }
 
-    BIO_printf(out, "Certificate Revocation List (CRL):\n");
-    l = X509_CRL_get_version(x);
-    BIO_printf(out, "%8sVersion %lu (0x%lx)\n", "", l + 1, l);
-    const X509_ALGOR *sig_alg;
-    const ASN1_BIT_STRING *signature;
-    X509_CRL_get0_signature(x, &signature, &sig_alg);
-    // Note this and the other |X509_signature_print| call print the outer
-    // signature algorithm twice, rather than both the inner and outer ones.
-    // This matches OpenSSL, though it was probably a bug.
-    X509_signature_print(out, sig_alg, NULL);
-    p = X509_NAME_oneline(X509_CRL_get_issuer(x), NULL, 0);
-    BIO_printf(out, "%8sIssuer: %s\n", "", p);
-    OPENSSL_free(p);
-    BIO_printf(out, "%8sLast Update: ", "");
-    ASN1_TIME_print(out, X509_CRL_get0_lastUpdate(x));
-    BIO_printf(out, "\n%8sNext Update: ", "");
-    if (X509_CRL_get0_nextUpdate(x))
-        ASN1_TIME_print(out, X509_CRL_get0_nextUpdate(x));
-    else
-        BIO_printf(out, "NONE");
-    BIO_printf(out, "\n");
+  char *issuer = X509_NAME_oneline(X509_CRL_get_issuer(x), NULL, 0);
+  int ok = issuer != NULL && BIO_printf(out, "%8sIssuer: %s\n", "", issuer) > 0;
+  OPENSSL_free(issuer);
+  if (!ok) {
+    return 0;
+  }
 
-    X509V3_extensions_print(out, "CRL extensions", X509_CRL_get0_extensions(x),
-                            0, 8);
-
-    rev = X509_CRL_get_REVOKED(x);
-
-    if (sk_X509_REVOKED_num(rev) > 0)
-        BIO_printf(out, "Revoked Certificates:\n");
-    else
-        BIO_printf(out, "No Revoked Certificates.\n");
-
-    for (i = 0; i < sk_X509_REVOKED_num(rev); i++) {
-        r = sk_X509_REVOKED_value(rev, i);
-        BIO_printf(out, "    Serial Number: ");
-        i2a_ASN1_INTEGER(out, r->serialNumber);
-        BIO_printf(out, "\n        Revocation Date: ");
-        ASN1_TIME_print(out, r->revocationDate);
-        BIO_printf(out, "\n");
-        X509V3_extensions_print(out, "CRL entry extensions",
-                                r->extensions, 0, 8);
+  if (BIO_printf(out, "%8sLast Update: ", "") <= 0 ||
+      !ASN1_TIME_print(out, X509_CRL_get0_lastUpdate(x)) ||
+      BIO_printf(out, "\n%8sNext Update: ", "") <= 0) {
+    return 0;
+  }
+  if (X509_CRL_get0_nextUpdate(x)) {
+    if (!ASN1_TIME_print(out, X509_CRL_get0_nextUpdate(x))) {
+      return 0;
     }
-    X509_signature_print(out, sig_alg, signature);
+  } else {
+    if (BIO_printf(out, "NONE") <= 0) {
+      return 0;
+    }
+  }
 
-    return 1;
+  if (BIO_printf(out, "\n") <= 0 ||
+      !X509V3_extensions_print(out, "CRL extensions",
+                               X509_CRL_get0_extensions(x), 0, 8)) {
+    return 0;
+  }
 
+  const STACK_OF(X509_REVOKED) *rev = X509_CRL_get_REVOKED(x);
+  if (sk_X509_REVOKED_num(rev) > 0) {
+    if (BIO_printf(out, "Revoked Certificates:\n") <= 0) {
+      return 0;
+    }
+  } else {
+    if (BIO_printf(out, "No Revoked Certificates.\n") <= 0) {
+      return 0;
+    }
+  }
+
+  for (size_t i = 0; i < sk_X509_REVOKED_num(rev); i++) {
+    const X509_REVOKED *r = sk_X509_REVOKED_value(rev, i);
+    if (BIO_printf(out, "    Serial Number: ") <= 0 ||
+        i2a_ASN1_INTEGER(out, X509_REVOKED_get0_serialNumber(r)) <= 0 ||
+        BIO_printf(out, "\n        Revocation Date: ") <= 0 ||
+        !ASN1_TIME_print(out, X509_REVOKED_get0_revocationDate(r)) ||
+        BIO_printf(out, "\n") <= 0 ||
+        !X509V3_extensions_print(out, "CRL entry extensions",
+                                 X509_REVOKED_get0_extensions(r), 0, 8)) {
+    }
+  }
+
+  return X509_signature_print(out, sig_alg, signature);
 }
diff --git a/src/crypto/x509/t_req.c b/src/crypto/x509/t_req.c
index 8202664..e9287d5 100644
--- a/src/crypto/x509/t_req.c
+++ b/src/crypto/x509/t_req.c
@@ -54,6 +54,7 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
+#include <assert.h>
 #include <stdio.h>
 
 #include <openssl/bn.h>
@@ -81,7 +82,7 @@
                       unsigned long cflag) {
   long l;
   EVP_PKEY *pkey;
-  STACK_OF(X509_ATTRIBUTE) * sk;
+  STACK_OF(X509_ATTRIBUTE) *sk;
   char mlch = ' ';
 
   int nmindent = 0;
@@ -104,7 +105,11 @@
   }
   if (!(cflag & X509_FLAG_NO_VERSION)) {
     l = X509_REQ_get_version(x);
-    if (BIO_printf(bio, "%8sVersion: %ld (0x%lx)\n", "", l + 1, l) <= 0) {
+    // Only zero, |X509_REQ_VERSION_1|, is valid but our parser accepts some
+    // invalid values for compatibility.
+    assert(0 <= l && l <= 2);
+    if (BIO_printf(bio, "%8sVersion: %ld (0x%lx)\n", "", l + 1,
+                   (unsigned long)l) <= 0) {
       goto err;
     }
   }
@@ -184,10 +189,8 @@
             goto err;
           }
 
-          if (type == V_ASN1_PRINTABLESTRING ||
-              type == V_ASN1_UTF8STRING ||
-              type == V_ASN1_IA5STRING ||
-              type == V_ASN1_T61STRING) {
+          if (type == V_ASN1_PRINTABLESTRING || type == V_ASN1_UTF8STRING ||
+              type == V_ASN1_IA5STRING || type == V_ASN1_T61STRING) {
             if (BIO_write(bio, (char *)bs->data, bs->length) != bs->length) {
               goto err;
             }
@@ -205,13 +208,12 @@
     if (exts) {
       BIO_printf(bio, "%8sRequested Extensions:\n", "");
 
-      size_t i;
-      for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
-        X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i);
+      for (size_t i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
+        const X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i);
         if (BIO_printf(bio, "%12s", "") <= 0) {
           goto err;
         }
-        ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex);
+        const ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex);
         i2a_ASN1_OBJECT(bio, obj);
         const int is_critical = X509_EXTENSION_get_critical(ex);
         if (BIO_printf(bio, ": %s\n", is_critical ? "critical" : "") <= 0) {
diff --git a/src/crypto/x509/t_x509.c b/src/crypto/x509/t_x509.c
index 7c32a87..6694e3d 100644
--- a/src/crypto/x509/t_x509.c
+++ b/src/crypto/x509/t_x509.c
@@ -54,6 +54,8 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
+#include <assert.h>
+
 #include <openssl/asn1.h>
 #include <openssl/bio.h>
 #include <openssl/digest.h>
@@ -68,298 +70,271 @@
 
 
 int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag,
-                     unsigned long cflag)
-{
-    BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
-    if (b == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
-        return 0;
-    }
-    int ret = X509_print_ex(b, x, nmflag, cflag);
-    BIO_free(b);
-    return ret;
+                     unsigned long cflag) {
+  BIO *b = BIO_new_fp(fp, BIO_NOCLOSE);
+  if (b == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
+    return 0;
+  }
+  int ret = X509_print_ex(b, x, nmflag, cflag);
+  BIO_free(b);
+  return ret;
 }
 
-int X509_print_fp(FILE *fp, X509 *x)
-{
-    return X509_print_ex_fp(fp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
+int X509_print_fp(FILE *fp, X509 *x) {
+  return X509_print_ex_fp(fp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
 }
 
-int X509_print(BIO *bp, X509 *x)
-{
-    return X509_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
+int X509_print(BIO *bp, X509 *x) {
+  return X509_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
 }
 
 int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags,
-                  unsigned long cflag)
-{
-    long l;
-    int ret = 0, i;
-    char *m = NULL, mlch = ' ';
-    int nmindent = 0;
-    X509_CINF *ci;
-    ASN1_INTEGER *bs;
-    EVP_PKEY *pkey = NULL;
-    const char *neg;
+                  unsigned long cflag) {
+  long l;
+  int ret = 0, i;
+  char *m = NULL, mlch = ' ';
+  int nmindent = 0;
+  X509_CINF *ci;
+  EVP_PKEY *pkey = NULL;
+  const char *neg;
 
-    if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
-        mlch = '\n';
-        nmindent = 12;
+  if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
+    mlch = '\n';
+    nmindent = 12;
+  }
+
+  if (nmflags == X509_FLAG_COMPAT) {
+    nmindent = 16;
+  }
+
+  ci = x->cert_info;
+  if (!(cflag & X509_FLAG_NO_HEADER)) {
+    if (BIO_write(bp, "Certificate:\n", 13) <= 0) {
+      goto err;
+    }
+    if (BIO_write(bp, "    Data:\n", 10) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_VERSION)) {
+    l = X509_get_version(x);
+    assert(X509_VERSION_1 <= l && l <= X509_VERSION_3);
+    if (BIO_printf(bp, "%8sVersion: %ld (0x%lx)\n", "", l + 1,
+                   (unsigned long)l) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_SERIAL)) {
+    if (BIO_write(bp, "        Serial Number:", 22) <= 0) {
+      goto err;
     }
 
-    if (nmflags == X509_FLAG_COMPAT)
-        nmindent = 16;
+    const ASN1_INTEGER *serial = X509_get0_serialNumber(x);
+    uint64_t serial_u64;
+    if (ASN1_INTEGER_get_uint64(&serial_u64, serial)) {
+      assert(serial->type != V_ASN1_NEG_INTEGER);
+      if (BIO_printf(bp, " %" PRIu64 " (0x%" PRIx64 ")\n", serial_u64,
+                     serial_u64) <= 0) {
+        goto err;
+      }
+    } else {
+      ERR_clear_error();  // Clear |ASN1_INTEGER_get_uint64|'s error.
+      neg = (serial->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : "";
+      if (BIO_printf(bp, "\n%12s%s", "", neg) <= 0) {
+        goto err;
+      }
 
-    ci = x->cert_info;
-    if (!(cflag & X509_FLAG_NO_HEADER)) {
-        if (BIO_write(bp, "Certificate:\n", 13) <= 0)
-            goto err;
-        if (BIO_write(bp, "    Data:\n", 10) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_VERSION)) {
-        l = X509_get_version(x);
-        if (BIO_printf(bp, "%8sVersion: %lu (0x%lx)\n", "", l + 1, l) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_SERIAL)) {
-
-        if (BIO_write(bp, "        Serial Number:", 22) <= 0)
-            goto err;
-
-        bs = X509_get_serialNumber(x);
-        if (bs->length < (int)sizeof(long)
-            || (bs->length == sizeof(long) && (bs->data[0] & 0x80) == 0)) {
-            l = ASN1_INTEGER_get(bs);
-            if (bs->type == V_ASN1_NEG_INTEGER) {
-                l = -l;
-                neg = "-";
-            } else
-                neg = "";
-            if (BIO_printf(bp, " %s%lu (%s0x%lx)\n", neg, l, neg, l) <= 0)
-                goto err;
-        } else {
-            neg = (bs->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : "";
-            if (BIO_printf(bp, "\n%12s%s", "", neg) <= 0)
-                goto err;
-
-            for (i = 0; i < bs->length; i++) {
-                if (BIO_printf(bp, "%02x%c", bs->data[i],
-                               ((i + 1 == bs->length) ? '\n' : ':')) <= 0)
-                    goto err;
-            }
+      for (i = 0; i < serial->length; i++) {
+        if (BIO_printf(bp, "%02x%c", serial->data[i],
+                       ((i + 1 == serial->length) ? '\n' : ':')) <= 0) {
+          goto err;
         }
+      }
+    }
+  }
 
+  if (!(cflag & X509_FLAG_NO_SIGNAME)) {
+    if (X509_signature_print(bp, ci->signature, NULL) <= 0) {
+      goto err;
+    }
+  }
+
+  if (!(cflag & X509_FLAG_NO_ISSUER)) {
+    if (BIO_printf(bp, "        Issuer:%c", mlch) <= 0) {
+      goto err;
+    }
+    if (X509_NAME_print_ex(bp, X509_get_issuer_name(x), nmindent, nmflags) <
+        0) {
+      goto err;
+    }
+    if (BIO_write(bp, "\n", 1) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_VALIDITY)) {
+    if (BIO_write(bp, "        Validity\n", 17) <= 0) {
+      goto err;
+    }
+    if (BIO_write(bp, "            Not Before: ", 24) <= 0) {
+      goto err;
+    }
+    if (!ASN1_TIME_print(bp, X509_get_notBefore(x))) {
+      goto err;
+    }
+    if (BIO_write(bp, "\n            Not After : ", 25) <= 0) {
+      goto err;
+    }
+    if (!ASN1_TIME_print(bp, X509_get_notAfter(x))) {
+      goto err;
+    }
+    if (BIO_write(bp, "\n", 1) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_SUBJECT)) {
+    if (BIO_printf(bp, "        Subject:%c", mlch) <= 0) {
+      goto err;
+    }
+    if (X509_NAME_print_ex(bp, X509_get_subject_name(x), nmindent, nmflags) <
+        0) {
+      goto err;
+    }
+    if (BIO_write(bp, "\n", 1) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_PUBKEY)) {
+    if (BIO_write(bp, "        Subject Public Key Info:\n", 33) <= 0) {
+      goto err;
+    }
+    if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0) {
+      goto err;
+    }
+    if (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0) {
+      goto err;
+    }
+    if (BIO_puts(bp, "\n") <= 0) {
+      goto err;
     }
 
-    if (!(cflag & X509_FLAG_NO_SIGNAME)) {
-        if (X509_signature_print(bp, ci->signature, NULL) <= 0)
-            goto err;
+    pkey = X509_get_pubkey(x);
+    if (pkey == NULL) {
+      BIO_printf(bp, "%12sUnable to load Public Key\n", "");
+      ERR_print_errors(bp);
+    } else {
+      EVP_PKEY_print_public(bp, pkey, 16, NULL);
+      EVP_PKEY_free(pkey);
     }
+  }
 
-    if (!(cflag & X509_FLAG_NO_ISSUER)) {
-        if (BIO_printf(bp, "        Issuer:%c", mlch) <= 0)
-            goto err;
-        if (X509_NAME_print_ex(bp, X509_get_issuer_name(x), nmindent, nmflags)
-            < 0)
-            goto err;
-        if (BIO_write(bp, "\n", 1) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_VALIDITY)) {
-        if (BIO_write(bp, "        Validity\n", 17) <= 0)
-            goto err;
-        if (BIO_write(bp, "            Not Before: ", 24) <= 0)
-            goto err;
-        if (!ASN1_TIME_print(bp, X509_get_notBefore(x)))
-            goto err;
-        if (BIO_write(bp, "\n            Not After : ", 25) <= 0)
-            goto err;
-        if (!ASN1_TIME_print(bp, X509_get_notAfter(x)))
-            goto err;
-        if (BIO_write(bp, "\n", 1) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_SUBJECT)) {
-        if (BIO_printf(bp, "        Subject:%c", mlch) <= 0)
-            goto err;
-        if (X509_NAME_print_ex
-            (bp, X509_get_subject_name(x), nmindent, nmflags) < 0)
-            goto err;
-        if (BIO_write(bp, "\n", 1) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_PUBKEY)) {
-        if (BIO_write(bp, "        Subject Public Key Info:\n", 33) <= 0)
-            goto err;
-        if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0)
-            goto err;
-        if (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0)
-            goto err;
-        if (BIO_puts(bp, "\n") <= 0)
-            goto err;
-
-        pkey = X509_get_pubkey(x);
-        if (pkey == NULL) {
-            BIO_printf(bp, "%12sUnable to load Public Key\n", "");
-            ERR_print_errors(bp);
-        } else {
-            EVP_PKEY_print_public(bp, pkey, 16, NULL);
-            EVP_PKEY_free(pkey);
-        }
-    }
-
-    if (!(cflag & X509_FLAG_NO_IDS)) {
-        if (ci->issuerUID) {
-            if (BIO_printf(bp, "%8sIssuer Unique ID: ", "") <= 0)
-                goto err;
-            if (!X509_signature_dump(bp, ci->issuerUID, 12))
-                goto err;
-        }
-        if (ci->subjectUID) {
-            if (BIO_printf(bp, "%8sSubject Unique ID: ", "") <= 0)
-                goto err;
-            if (!X509_signature_dump(bp, ci->subjectUID, 12))
-                goto err;
-        }
-    }
-
-    if (!(cflag & X509_FLAG_NO_EXTENSIONS))
-        X509V3_extensions_print(bp, "X509v3 extensions",
-                                ci->extensions, cflag, 8);
-
-    if (!(cflag & X509_FLAG_NO_SIGDUMP)) {
-        if (X509_signature_print(bp, x->sig_alg, x->signature) <= 0)
-            goto err;
-    }
-    if (!(cflag & X509_FLAG_NO_AUX)) {
-        if (!X509_CERT_AUX_print(bp, x->aux, 0))
-            goto err;
-    }
-    ret = 1;
- err:
-    if (m != NULL)
-        OPENSSL_free(m);
-    return (ret);
-}
-
-int X509_ocspid_print(BIO *bp, X509 *x)
-{
-    unsigned char *der = NULL;
-    unsigned char *dertmp;
-    int derlen;
-    int i;
-    unsigned char SHA1md[SHA_DIGEST_LENGTH];
-
-    /*
-     * display the hash of the subject as it would appear in OCSP requests
-     */
-    if (BIO_printf(bp, "        Subject OCSP hash: ") <= 0)
+  if (!(cflag & X509_FLAG_NO_IDS)) {
+    if (ci->issuerUID) {
+      if (BIO_printf(bp, "%8sIssuer Unique ID: ", "") <= 0) {
         goto err;
-    derlen = i2d_X509_NAME(x->cert_info->subject, NULL);
-    if ((der = dertmp = (unsigned char *)OPENSSL_malloc(derlen)) == NULL)
+      }
+      if (!X509_signature_dump(bp, ci->issuerUID, 12)) {
         goto err;
-    i2d_X509_NAME(x->cert_info->subject, &dertmp);
-
-    if (!EVP_Digest(der, derlen, SHA1md, NULL, EVP_sha1(), NULL))
-        goto err;
-    for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
-        if (BIO_printf(bp, "%02X", SHA1md[i]) <= 0)
-            goto err;
+      }
     }
-    OPENSSL_free(der);
-    der = NULL;
-
-    /*
-     * display the hash of the public key as it would appear in OCSP requests
-     */
-    if (BIO_printf(bp, "\n        Public key OCSP hash: ") <= 0)
+    if (ci->subjectUID) {
+      if (BIO_printf(bp, "%8sSubject Unique ID: ", "") <= 0) {
         goto err;
-
-    if (!EVP_Digest(x->cert_info->key->public_key->data,
-                    x->cert_info->key->public_key->length,
-                    SHA1md, NULL, EVP_sha1(), NULL))
+      }
+      if (!X509_signature_dump(bp, ci->subjectUID, 12)) {
         goto err;
-    for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
-        if (BIO_printf(bp, "%02X", SHA1md[i]) <= 0)
-            goto err;
+      }
     }
-    BIO_printf(bp, "\n");
+  }
 
-    return (1);
- err:
-    if (der != NULL)
-        OPENSSL_free(der);
-    return (0);
+  if (!(cflag & X509_FLAG_NO_EXTENSIONS)) {
+    X509V3_extensions_print(bp, "X509v3 extensions", ci->extensions, cflag, 8);
+  }
+
+  if (!(cflag & X509_FLAG_NO_SIGDUMP)) {
+    if (X509_signature_print(bp, x->sig_alg, x->signature) <= 0) {
+      goto err;
+    }
+  }
+  if (!(cflag & X509_FLAG_NO_AUX)) {
+    if (!X509_CERT_AUX_print(bp, x->aux, 0)) {
+      goto err;
+    }
+  }
+  ret = 1;
+err:
+  if (m != NULL) {
+    OPENSSL_free(m);
+  }
+  return ret;
 }
 
 int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg,
-                         const ASN1_STRING *sig)
-{
-    if (BIO_puts(bp, "    Signature Algorithm: ") <= 0)
-        return 0;
-    if (i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0)
-        return 0;
+                         const ASN1_STRING *sig) {
+  if (BIO_puts(bp, "    Signature Algorithm: ") <= 0) {
+    return 0;
+  }
+  if (i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) {
+    return 0;
+  }
 
-    /* RSA-PSS signatures have parameters to print. */
-    int sig_nid = OBJ_obj2nid(sigalg->algorithm);
-    if (sig_nid == NID_rsassaPss &&
-        !x509_print_rsa_pss_params(bp, sigalg, 9, 0)) {
-        return 0;
-    }
+  // RSA-PSS signatures have parameters to print.
+  int sig_nid = OBJ_obj2nid(sigalg->algorithm);
+  if (sig_nid == NID_rsassaPss &&
+      !x509_print_rsa_pss_params(bp, sigalg, 9, 0)) {
+    return 0;
+  }
 
-    if (sig)
-        return X509_signature_dump(bp, sig, 9);
-    else if (BIO_puts(bp, "\n") <= 0)
-        return 0;
-    return 1;
+  if (sig) {
+    return X509_signature_dump(bp, sig, 9);
+  } else if (BIO_puts(bp, "\n") <= 0) {
+    return 0;
+  }
+  return 1;
 }
 
-int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase)
-{
-    char *s, *c, *b;
-    int ret = 0, l, i;
+int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase) {
+  char *s, *c, *b;
+  int ret = 0, i;
 
-    l = 80 - 2 - obase;
-
-    b = X509_NAME_oneline(name, NULL, 0);
-    if (!b)
-        return 0;
-    if (!*b) {
-        OPENSSL_free(b);
-        return 1;
-    }
-    s = b + 1;                  /* skip the first slash */
-
-    c = s;
-    for (;;) {
-        if (((*s == '/') &&
-             ((s[1] >= 'A') && (s[1] <= 'Z') && ((s[2] == '=') ||
-                                                 ((s[2] >= 'A')
-                                                  && (s[2] <= 'Z')
-                                                  && (s[3] == '='))
-              ))) || (*s == '\0')) {
-            i = s - c;
-            if (BIO_write(bp, c, i) != i)
-                goto err;
-            c = s + 1;          /* skip following slash */
-            if (*s != '\0') {
-                if (BIO_write(bp, ", ", 2) != 2)
-                    goto err;
-            }
-            l--;
-        }
-        if (*s == '\0')
-            break;
-        s++;
-        l--;
-    }
-
-    ret = 1;
-    if (0) {
- err:
-        OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
-    }
+  b = X509_NAME_oneline(name, NULL, 0);
+  if (!b) {
+    return 0;
+  }
+  if (!*b) {
     OPENSSL_free(b);
-    return (ret);
+    return 1;
+  }
+  s = b + 1;  // skip the first slash
+
+  c = s;
+  for (;;) {
+    if (((*s == '/') && ((s[1] >= 'A') && (s[1] <= 'Z') &&
+                         ((s[2] == '=') || ((s[2] >= 'A') && (s[2] <= 'Z') &&
+                                            (s[3] == '='))))) ||
+        (*s == '\0')) {
+      i = s - c;
+      if (BIO_write(bp, c, i) != i) {
+        goto err;
+      }
+      c = s + 1;  // skip following slash
+      if (*s != '\0') {
+        if (BIO_write(bp, ", ", 2) != 2) {
+          goto err;
+        }
+      }
+    }
+    if (*s == '\0') {
+      break;
+    }
+    s++;
+  }
+
+  ret = 1;
+  if (0) {
+  err:
+    OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
+  }
+  OPENSSL_free(b);
+  return ret;
 }
diff --git a/src/crypto/x509/t_x509a.c b/src/crypto/x509/t_x509a.c
index 4c7b212..956b9a0 100644
--- a/src/crypto/x509/t_x509a.c
+++ b/src/crypto/x509/t_x509a.c
@@ -63,54 +63,59 @@
 #include "internal.h"
 
 
-/* X509_CERT_AUX and string set routines */
+// X509_CERT_AUX and string set routines
 
-int X509_CERT_AUX_print(BIO *out, X509_CERT_AUX *aux, int indent)
-{
-    char oidstr[80], first;
-    size_t i;
-    int j;
-    if (!aux)
-        return 1;
-    if (aux->trust) {
-        first = 1;
-        BIO_printf(out, "%*sTrusted Uses:\n%*s", indent, "", indent + 2, "");
-        for (i = 0; i < sk_ASN1_OBJECT_num(aux->trust); i++) {
-            if (!first)
-                BIO_puts(out, ", ");
-            else
-                first = 0;
-            OBJ_obj2txt(oidstr, sizeof oidstr,
-                        sk_ASN1_OBJECT_value(aux->trust, i), 0);
-            BIO_puts(out, oidstr);
-        }
-        BIO_puts(out, "\n");
-    } else
-        BIO_printf(out, "%*sNo Trusted Uses.\n", indent, "");
-    if (aux->reject) {
-        first = 1;
-        BIO_printf(out, "%*sRejected Uses:\n%*s", indent, "", indent + 2, "");
-        for (i = 0; i < sk_ASN1_OBJECT_num(aux->reject); i++) {
-            if (!first)
-                BIO_puts(out, ", ");
-            else
-                first = 0;
-            OBJ_obj2txt(oidstr, sizeof oidstr,
-                        sk_ASN1_OBJECT_value(aux->reject, i), 0);
-            BIO_puts(out, oidstr);
-        }
-        BIO_puts(out, "\n");
-    } else
-        BIO_printf(out, "%*sNo Rejected Uses.\n", indent, "");
-    if (aux->alias) {
-        BIO_printf(out, "%*sAlias: %.*s\n", indent, "", aux->alias->length,
-                   aux->alias->data);
-    }
-    if (aux->keyid) {
-        BIO_printf(out, "%*sKey Id: ", indent, "");
-        for (j = 0; j < aux->keyid->length; j++)
-            BIO_printf(out, "%s%02X", j ? ":" : "", aux->keyid->data[j]);
-        BIO_write(out, "\n", 1);
-    }
+int X509_CERT_AUX_print(BIO *out, X509_CERT_AUX *aux, int indent) {
+  char oidstr[80], first;
+  size_t i;
+  int j;
+  if (!aux) {
     return 1;
+  }
+  if (aux->trust) {
+    first = 1;
+    BIO_printf(out, "%*sTrusted Uses:\n%*s", indent, "", indent + 2, "");
+    for (i = 0; i < sk_ASN1_OBJECT_num(aux->trust); i++) {
+      if (!first) {
+        BIO_puts(out, ", ");
+      } else {
+        first = 0;
+      }
+      OBJ_obj2txt(oidstr, sizeof oidstr, sk_ASN1_OBJECT_value(aux->trust, i),
+                  0);
+      BIO_puts(out, oidstr);
+    }
+    BIO_puts(out, "\n");
+  } else {
+    BIO_printf(out, "%*sNo Trusted Uses.\n", indent, "");
+  }
+  if (aux->reject) {
+    first = 1;
+    BIO_printf(out, "%*sRejected Uses:\n%*s", indent, "", indent + 2, "");
+    for (i = 0; i < sk_ASN1_OBJECT_num(aux->reject); i++) {
+      if (!first) {
+        BIO_puts(out, ", ");
+      } else {
+        first = 0;
+      }
+      OBJ_obj2txt(oidstr, sizeof oidstr, sk_ASN1_OBJECT_value(aux->reject, i),
+                  0);
+      BIO_puts(out, oidstr);
+    }
+    BIO_puts(out, "\n");
+  } else {
+    BIO_printf(out, "%*sNo Rejected Uses.\n", indent, "");
+  }
+  if (aux->alias) {
+    BIO_printf(out, "%*sAlias: %.*s\n", indent, "", aux->alias->length,
+               aux->alias->data);
+  }
+  if (aux->keyid) {
+    BIO_printf(out, "%*sKey Id: ", indent, "");
+    for (j = 0; j < aux->keyid->length; j++) {
+      BIO_printf(out, "%s%02X", j ? ":" : "", aux->keyid->data[j]);
+    }
+    BIO_write(out, "\n", 1);
+  }
+  return 1;
 }
diff --git a/src/crypto/x509/test/pss_sha1.pem b/src/crypto/x509/test/pss_sha1.pem
new file mode 100644
index 0000000..1ab90d4
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha1.pem
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICpTCCAY2gAwIBAgIBADANBgkqhkiG9w0BAQowADAUMRIwEAYDVQQDDAlCb3Jp
+bmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAG
+A1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+ugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkW
+f6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQS
+jHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy
+8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50
++UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk
+7ZE1QJQQ1L4iKmPeQistuQIDAQABMA0GCSqGSIb3DQEBCjAAA4IBAQAQvYDcDDNx
+QPctGNiZTH9N2I2wdVXHmsybRW7tXWVYm+yE8IzfVUUBkCL5WvbLxlujMAbQpHp8
+EnKECVsNAklHAAQ6KFDTngyDAjdyGiNKKMm37UW/I7BkdFZE+jBYKoVU5xeLSPm1
+jNKQWqjGnaZ+wV7Fl8Zy+QOr7Z35zrDNbCF/EkzoE6+i/bbqXIgu5x14rj9c4JAs
+aKPpTtpDI1zt9BfGMPsBxsxeckqnG8OlNc6YI8svAK849naTAPx93jDWmDBYqfsb
+MeZOo9+AfUP7pjoDZHsQCmPdmlDgAtMvi8K1oFbw4BBTu+CaCzhNS5xEbITef09i
+tjiySH0Q5r01
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha1_explicit.pem b/src/crypto/x509/test/pss_sha1_explicit.pem
new file mode 100644
index 0000000..7847916
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha1_explicit.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIC/TCCAbmgAwIBAgIBADA5BgkqhkiG9w0BAQowLKALMAkGBSsOAwIaBQChGDAW
+BgkqhkiG9w0BAQgwCQYFKw4DAhoFAKIDAgEUMBQxEjAQBgNVBAMMCUJvcmluZ1NT
+TDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkxMjMxMjM1OTU5WjAUMRIwEAYDVQQD
+DAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6C9qE
+GRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPhCm3DLnv4RayxkFwemtnkGRZ/o94Z
+nsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARIhIQcSLGiJcLN6kGuG2nlRBKMcPgP
+iEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyKj32neWpnUCTL5o2VwyPoxjLxT5gU
+R69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRTzNv+ZHNh4izZHrktR25MvnT5QyBq
+32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEmgyvU9M6CeYRPX1Ykfg+sXCTtkTVA
+lBDUviIqY95CKy25AgMBAAEwOQYJKoZIhvcNAQEKMCygCzAJBgUrDgMCGgUAoRgw
+FgYJKoZIhvcNAQEIMAkGBSsOAwIaBQCiAwIBFAOCAQEATo0Z3YqPt4fzBXz22vyH
+7Ckr1cicKTeE3lV8LYHII4easVkueN7HrfrpTPu04kn4Y8pjprh0gRj9vcf6i6Sj
+khPnfmXTTbeFxHs763BQVAOoutgteyUhBZ5UjqaXnnF7PYhyG/0ykxWryvius+dz
+ujhW9T0aPo95GWITtj1NHzGmCjQYqUSrfkJynC8c/juTo3MLWrMnirDsAYizTg4W
+CWBfeMKRfAH6aOybSBNZh7/KU+ZiFPKJi+NKPPaZNZa0l1JZ46LL1NWVq6bybZH8
+ncNZpooQKTfCaK221pbqxx4YIJT0NoICU8291LSNLz8/5uBkjUo744cF4tuNFZ4k
+sg==
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem b/src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem
new file mode 100644
index 0000000..3ba32f1
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICxzCCAZ6gAwIBAgIBADAeBgkqhkiG9w0BAQowEaEPMA0GCSqGSIb3DQEBCDAA
+MBQxEjAQBgNVBAMMCUJvcmluZ1NTTDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkx
+MjMxMjM1OTU5WjAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQC6C9qEGRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPh
+Cm3DLnv4RayxkFwemtnkGRZ/o94ZnsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARI
+hIQcSLGiJcLN6kGuG2nlRBKMcPgPiEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyK
+j32neWpnUCTL5o2VwyPoxjLxT5gUR69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRT
+zNv+ZHNh4izZHrktR25MvnT5QyBq32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEm
+gyvU9M6CeYRPX1Ykfg+sXCTtkTVAlBDUviIqY95CKy25AgMBAAEwHgYJKoZIhvcN
+AQEKMBGhDzANBgkqhkiG9w0BAQgwAAOCAQEANdpvRLqZLsYfruBHXjviZaKoHeoQ
+1ixqeSLzcP0KzWRT3H3tX46KuYABaMurK0yPMDfW6oLCfJa3fUFt0FYJYnf/w7mp
+MsmOf+7aaY8oYqI6wRwtAB0JQcC2tKsio+UEiI6hZq2ghhGa5c+YLXhN4Dt+/cK9
+UkisKL4O61jKulfaErOsUSaYTo9/PJpPcUhE/zVtsfAGJH0ojSCrSpEYv4TNO9Qm
+WOJ4hMreEOLVxw4xC65wRmOWl4JpGxle1mNzjsL4kOcDwsnepEOcpAqJronQ+HnI
+1RCR04oEnOOWYAtFxuWzTds3BjszGPRSu3srGZpaI1j/kB+a3g/7hXufOA==
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha224.pem b/src/crypto/x509/test/pss_sha224.pem
new file mode 100644
index 0000000..422615d
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha224.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCBAUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCBAUAogMCARwwFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCBAUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCBAUAogMCARwDggEB
+AHttVo+XfLdlRXHc59yGAr7wQgqIbWOD6QSo4Tb4XbAh4nc9MQhccfT4YOMyHa9I
+i1VyE9e2dna8gt9VfIyCeTnNS1RYbKagaUzo2dt/G0lQjfXRVkB1yobJEaAzZ8kg
+cbknjlrlMEtHW+ET2vTHKvOjHjHXy3GYt8ynSldnotikqVobW5Kd/nYR7s9SR1Yz
+VhweDRcWeb3IYSAx953t1voky/7pTltcyb5FfJLIPmj2AsoFSRnXrj1Sx0K+S68m
+E0TdKwOTr2QN9nmHrIbCIeiAVeBlIOY6jH8TjobwFV2Y3RlqC+8S+Vgje/Hg/jrV
+Q9fS9+RIVSOFZiOgW/1hjAA=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256.pem b/src/crypto/x509/test/pss_sha256.pem
new file mode 100644
index 0000000..fc8ce18
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggEB
+ALVhRTv78XF2RjMusWAuTknDWkju6uvtq+iTpwCWaJO2QA2L3spEiUw52PsW9gQW
+AIOttLlgQFPD3dt3OL0FBK5y79Rh/h/mrOpwbVoMOHSsgikVZhbQ0D30Y8LQYMTD
+cxDYgPbnI4Q1VatdcCR8aavSDfV4JGPpJPkz8QX6HaFAoCUAz5UhiiS3MT8IzucO
+nNOV7AH9yfWDfvCWDGyuIYphjFZ761VjZFFIGJuXZ9uDXDDjNxlLwO7sci/pwO89
+OiRM40RxkS9vl8MjIsFSMGXOR+mf+FNtQ2vF1ZqCVxPWFuHHwmXycqrLuY3fOboF
+tF5Q3O1V7sh5Bs47h29KbQU=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_explicit_trailer.pem b/src/crypto/x509/test/pss_sha256_explicit_trailer.pem
new file mode 100644
index 0000000..52820b7
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_explicit_trailer.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFzCCAcagAwIBAgIBADBGBgkqhkiG9w0BAQowOaAPMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASCjAwIBATAUMRIwEAYD
+VQQDDAlCb3JpbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1
+OVowFDESMBAGA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWs
+sZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXC
+zepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Ak
+y+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs
+2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmE
+T19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABMEYGCSqGSIb3DQEBCjA5oA8w
+DQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIB
+IKMDAgEBA4IBAQA6p/W2ZA06aYzRXL1v/VnU11udk5+UIbGAuhSVv9a+zJ4/79UX
+Xk4/otg74fq/Ayy3hPm9lcOTGbXYHSgY4eFR8J1VS/P2ZPRCyypXwLSYg+Yt5Fdc
+SaA2JVF2jrgMbIAzBsyz4CCOzajcF/he8+NmH7pDZhLGv4pIWaFqAPrGntIpPwVW
+Qib62z9qzeexXIm+1Jp3nh21sXLbWdBM5tt5NNqST+cgzzrRnPtwQTbdcKk9i4Jh
+3/BairkWclVHxibtNPoLvhU91tJw61rES29x3vG//7WwEoT2aLCkp9/ZHrM5ukpe
+RxWXU+JZXiO59WWDCdK0YAuoteozepn4Cwei
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_mgf1_sha384.pem b/src/crypto/x509/test/pss_sha256_mgf1_sha384.pem
new file mode 100644
index 0000000..dd3b4e9
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_mgf1_sha384.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCASAwFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCASADggEB
+AFMuNrMzLKfCvjDw35e5aoOPsTHKmkreUl4yHjUxX3i0heSkvy3FFcXhGjOscySF
+hBoAZU1DJaIHGzq2/k9Z3pk+NFhLg6tlHvLgcySHl4kR4sqTceJeOgy4RHJU04Gv
+wFAfRXx8QTJr1d00EPBoSnj7afDtvcRkzDSsgQ+YiQ9zjvt+uzuhZ25CUw8KY+Xy
+CZqQYE5yIMMRoKZExPcXuWTD8Ho5pVxjeLv2+nEO73NaAP0FwisCuY98ng0ffTgG
+5biORaDLzoTQv0QXtHS5TRUd6ycQ7nW28M4U1ZP9s9gj1zl+emvmi1UjNs3bcRW3
+Jk0lRwKo8awDUhfWJ/YPIns=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_mgf1_syntax_error.pem b/src/crypto/x509/test/pss_sha256_mgf1_syntax_error.pem
new file mode 100644
index 0000000..5d77bf2
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_mgf1_syntax_error.pem
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIIC8zCCAbSgAwIBAgIBADA0BgkqhkiG9w0BAQowJ6APMA0GCWCGSAFlAwQCAQUA
+oQ8wDQYJKoZIhvcNAQEIMACiAwIBIDAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwIhgP
+MDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAGA1UEAwwJQm9y
+aW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAugvahBkSAUF1
+fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkWf6PeGZ7F5AX1
+PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQSjHD4D4hKtgdM
+gVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy8U+YFEevb/V0
+lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50+UMgat9ocewI
+2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk7ZE1QJQQ1L4i
+KmPeQistuQIDAQABMDQGCSqGSIb3DQEBCjAnoA8wDQYJYIZIAWUDBAIBBQChDzAN
+BgkqhkiG9w0BAQgwAKIDAgEgA4IBAQAJ0RuKq+OgFlcm2EMk+VXH8hSo87N3wcyK
+9SzLwONh2uVYR3W1ig+/EwqK0M9w5UwvSVNdFa3m2qVXApprUm7eCJ2c7rWiBkQy
+sVCHwWVCseItZ8ipJHHz0uC5k3EFBSVbsbRdTJ8FPbRDBXXn2iSz6OzUJVZ5PfV1
+XRC81Aoi8DbhFwNga7/mJ80Ru4UGEePT6SsyUU5sgZ0w37r+5VPQgL4oOMO2NKz+
+O060CbcDcOXrCm1x0BXIOc7gZEao5mriJTFQTq4PsuMnJ9a7aU+PYPfTxptr/VxB
+yJJSi0sjTpqmWKStBjeZlEYq57nWZLmueA9xf8T1Ah6WRDRFo8m1
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_omit_nulls.pem b/src/crypto/x509/test/pss_sha256_omit_nulls.pem
new file mode 100644
index 0000000..c5b025b
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_omit_nulls.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDBTCCAb2gAwIBAgIBADA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa
+MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDAUMRIwEAYDVQQDDAlCb3Jp
+bmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowFDESMBAG
+A1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+ugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWssZBcHprZ5BkW
+f6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXCzepBrhtp5UQS
+jHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Aky+aNlcMj6MYy
+8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs2R65LUduTL50
++UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmET19WJH4PrFwk
+7ZE1QJQQ1L4iKmPeQistuQIDAQABMD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUD
+BAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIDAgEgA4IBAQAss/sOR0J5
+rAmctg1qnUYeUKr3RN2MTAb58ZsbE9Gvjr4lgdRo4ADIwqfKYcEe3Xms0WO8gAle
+efbzrcqM1wZ6wjdcZEI9xz2L5moX0lD40Jd18OFe4wrmt7eMCaz+gTdHx+5uQy53
+4H+Vw6IUeO9m1K1wqDkwsiPWv22FqKghD07wKiNR7bkPnQDERRRN6UliCFfMEXOx
+h9IbYJQUIVvBFqkI9C/lKbrmxdS7fv3wFnu61knkh7JNIXXWNdYHHRDqNDZOhakn
+0wf3qY359CofKk+9kg/9cj1lP8HwgATxL69pBmSvM7O6ybDRhp4+/oySQCbcOIfs
+IOo8AoyPo4u2
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_salt31.pem b/src/crypto/x509/test/pss_sha256_salt31.pem
new file mode 100644
index 0000000..964df20
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_salt31.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCAR8wFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCAR8DggEB
+ACRCt8NtcKkDg86ub1PiWSws4b/5v9ujPbatTrocCOXnob3Z4dnHKpjeUC0et/ex
+s4hlluZ9WHb+WgR5LP7I1eIE5C1RIL5aVLguSBi8/qQICNVgeMvZSgv/mDJ0eiv2
+xztcYlDwANPIh2RDpVyD6qUphvH8W6vrd6mo3aYgegigaDr/8d01MZh5s4120iWn
++8XKXNep8YqLhYemn3WeXtvK4vEEdFln6WeRRlGKevX9LqOegshs8HgKjjYRH++I
+c5HtwRZFkkMnXOV0XyG5zPrsx0qDcJCGHrC20bM+ZZz60QOtb1BSMIS5KjMy5OPQ
+bueM0YwX72tPKox+3lJgXAk=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_salt_overflow.pem b/src/crypto/x509/test/pss_sha256_salt_overflow.pem
new file mode 100644
index 0000000..85f5f3a
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_salt_overflow.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDGzCCAcigAwIBAgIBADBIBgkqhkiG9w0BAQowO6APMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogoCCEAAAAAAAAAgMBQxEjAQ
+BgNVBAMMCUJvcmluZ1NTTDAiGA8wMDAwMDEwMTAwMDAwMFoYDzk5OTkxMjMxMjM1
+OTU5WjAUMRIwEAYDVQQDDAlCb3JpbmdTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQC6C9qEGRIBQXV8Lj29vVu+U+tyXzSSinWIumK5ijPhCm3DLnv4
+RayxkFwemtnkGRZ/o94ZnsXkBfU/IlsYdkuq8wK9WI/ql3gwWjH+KARIhIQcSLGi
+JcLN6kGuG2nlRBKMcPgPiEq2B0yBXFf4tG3CBbeae7+8G7uvOmv8NLyKj32neWpn
+UCTL5o2VwyPoxjLxT5gUR69v9XSVFj2irCZbsEedeKSb++LqyMhLfnRTzNv+ZHNh
+4izZHrktR25MvnT5QyBq32hx7AjZ2/xo70OmH7w10a2DwsVjJNMdxTEmgyvU9M6C
+eYRPX1Ykfg+sXCTtkTVAlBDUviIqY95CKy25AgMBAAEwSAYJKoZIhvcNAQEKMDug
+DzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIK
+AghAAAAAAAAAIAOCAQEAn7ufGUhwZUfP13AEXFZGo7tpWYKbiDpVnHTtj/21/SWd
+TXP1LJWIJuo8pGs/ZsXI+XoXJMk01G1wVPPUny/D7T9WXLW191UFzIGO0bJZIfv2
+M9YbRkTsCiAYUuyFUlwwSLMqMXrZjRXlgulv3DjWrDHrAqfst847Ety24P1uYG7C
+m4JV8Sa0SIKRntd00YYmk6oUZNgEzUps7moLsOEox3U2s6wTipl/++9H5CI5mQTS
+fdGMRzEsuJRfXkgMccEfDw2wvNfmNzILGDsvxjCilkEisuMPxlRptSk5agYFujAW
+D3QjJGCgGlSXhN3JuH9S2/0N5gRQpN/98beTTXpxvg==
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_unknown_mgf.pem b/src/crypto/x509/test/pss_sha256_unknown_mgf.pem
new file mode 100644
index 0000000..e296652
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_unknown_mgf.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAcSgAwIBAgIBADBEBgkqhkiG9w0BAQowN6APMA0GCWCGSAFlAwQCAQUA
+oR8wHQYMKoZIhvcSBAGEtwkAMA0GCWCGSAFlAwQCAQUAogMCASAwFDESMBAGA1UE
+AwwJQm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTla
+MBQxEjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQ
+XB6a2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3q
+Qa4baeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvm
+jZXDI+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNke
+uS1Hbky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9f
+ViR+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBEBgkqhkiG9w0BAQowN6APMA0G
+CWCGSAFlAwQCAQUAoR8wHQYMKoZIhvcSBAGEtwkAMA0GCWCGSAFlAwQCAQUAogMC
+ASADggEBACdP7ToiiM+6TqeAbKRqsPuFX9Q0qJtjX8mGVyzOEy402hEhglMeL9il
+FFFKCgo/wux4VIbw7BVLFDfYPcj8E7snj+J0mITIFt5oCwXG+MrJUnfklBEEyelF
+kVyr1ZVIwsk/lWSaOcQocbx8/szRRhwwVTT7BySnMV4e/y7Z9beye6tl7lg4373K
+E4akVubalnkoTHP5fZ6f0AfOXJEnLw2Mn0zjwrZmasMyXxLH8ApUVruPBQHY7IQB
+sMAURzkRtcCyzhQniJFcu7oMmkj+v8FVG02792DOWP+Y/yC0ccmHcvDbdzJW5SDm
+rBvNkmnPt6sYs7/RLRaVky7cRMAQrFs=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha256_wrong_trailer.pem b/src/crypto/x509/test/pss_sha256_wrong_trailer.pem
new file mode 100644
index 0000000..dda8501
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha256_wrong_trailer.pem
@@ -0,0 +1,22 @@
+This certificate has a trailerField of 2, but the signature was still
+generated with the standard 0xbc suffix.
+
+-----BEGIN CERTIFICATE-----
+MIIDFzCCAcagAwIBAgIBADBGBgkqhkiG9w0BAQowOaAPMA0GCWCGSAFlAwQCAQUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASCjAwIBAjAUMRIwEAYD
+VQQDDAlCb3JpbmdTU0wwIhgPMDAwMDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1
+OVowFDESMBAGA1UEAwwJQm9yaW5nU1NMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAugvahBkSAUF1fC49vb1bvlPrcl80kop1iLpiuYoz4Qptwy57+EWs
+sZBcHprZ5BkWf6PeGZ7F5AX1PyJbGHZLqvMCvViP6pd4MFox/igESISEHEixoiXC
+zepBrhtp5UQSjHD4D4hKtgdMgVxX+LRtwgW3mnu/vBu7rzpr/DS8io99p3lqZ1Ak
+y+aNlcMj6MYy8U+YFEevb/V0lRY9oqwmW7BHnXikm/vi6sjIS350U8zb/mRzYeIs
+2R65LUduTL50+UMgat9ocewI2dv8aO9Dph+8NdGtg8LFYyTTHcUxJoMr1PTOgnmE
+T19WJH4PrFwk7ZE1QJQQ1L4iKmPeQistuQIDAQABMEYGCSqGSIb3DQEBCjA5oA8w
+DQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIB
+IKMDAgECA4IBAQCVtDpbDRnbn7UQd8sPq+XSHk2nwvlhwSKZ0XZ0vwBGkNuhO/SY
+BhVUez+uGxXnJE+MkVAAh3NOdEQV6apEX5tymCyB0vqwLQB86gANOt82kF/tOW4M
+Sv5f6L8GJbYtpTd/cyAMEs7U/X9O5W1G9sLINWeukUYHPVKjj/tE3NfLCE8SWlw4
+SCnbuhs5WXnEgUP/9JgL8xyI6bxn9E2OUvqD+U24k0PbtAdk09697gUYUDQlmxi6
+MRoQYKTezNJt4DXRhqUlokWiF5D42MaMz5WXtLQaBfbqQB6n1Ln+hTaGwWP6xNSm
+Mip0TYOwAQdcTvr8UoQUJR/90SX+S4m6cu4d
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha384.pem b/src/crypto/x509/test/pss_sha384.pem
new file mode 100644
index 0000000..faf59b8
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha384.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAgUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCAgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATADggEB
+AASUWBIEjb0TkXJKhj3RNRRe0D+KWFpyAn/kdBgDce/LEQVywj8IeS+s9z9TcGEK
+iKr8tPIsNUM1agj3gd1zWuM5rbUABQyGzeWcfjmhmhK5mnCSOu/OD+DJjWqyHpQq
+/Qf2djrpXJXKVNoSBzci4KUpFIfKMT4KjnUKY9L8lxfl9zaPeIaFeXgtyhHYnpjX
+vyomoLaL3cXeeKIffgPa9s9QZGx2fKOnFmcS3eKL9pIcj4Z6K8+Nchg6Z2qYKWtM
+hH1ZFlNDC3VOPgNkHoBrU6gE5fQv6lO64egL9pM0bpaOi7drhHKjkw2URi4C9KGK
+P9GfRmqV9Y9UlJsLSGIghxs=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/test/pss_sha512.pem b/src/crypto/x509/test/pss_sha512.pem
new file mode 100644
index 0000000..1beb991
--- /dev/null
+++ b/src/crypto/x509/test/pss_sha512.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDDTCCAcGgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAwUA
+oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUAwFDESMBAGA1UEAwwJ
+Qm9yaW5nU1NMMCIYDzAwMDAwMTAxMDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMBQx
+EjAQBgNVBAMMCUJvcmluZ1NTTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALoL2oQZEgFBdXwuPb29W75T63JfNJKKdYi6YrmKM+EKbcMue/hFrLGQXB6a
+2eQZFn+j3hmexeQF9T8iWxh2S6rzAr1Yj+qXeDBaMf4oBEiEhBxIsaIlws3qQa4b
+aeVEEoxw+A+ISrYHTIFcV/i0bcIFt5p7v7wbu686a/w0vIqPfad5amdQJMvmjZXD
+I+jGMvFPmBRHr2/1dJUWPaKsJluwR514pJv74urIyEt+dFPM2/5kc2HiLNkeuS1H
+bky+dPlDIGrfaHHsCNnb/GjvQ6YfvDXRrYPCxWMk0x3FMSaDK9T0zoJ5hE9fViR+
+D6xcJO2RNUCUENS+Iipj3kIrLbkCAwEAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCG
+SAFlAwQCAwUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAwUAogMCAUADggEB
+ADwQHPC6MMvgBBfgYHRvcdQqfzPb3I9HJa+Y01BAIAeICadmyB389cjhv9X1mFi9
+xJOhsuek71D4YrOghExMbGXIAlalAq/rQHTzXV6cqiSrbUmmvsLmlilOeODIjuUC
+z3Ldc5LvwU8nima46jP/ryMYaIjCpbNsH/MzAbYO/CNm8osjeJoKhGyozkj9tr2T
+JaSFe5icta2WHfjfLP7wSkIf3NdfXNkBIBKMdHCuiEgeUeSColpgAFfngFKIJ3EG
+EbgptjPoePJ0T6VOdwzSX+QhGLabaOiX0ptrhAwuCNHVAKuf5wCWKvl6mYgBaDfB
+YFmL46BAX2ghB+WM/FSizPs=
+-----END CERTIFICATE-----
diff --git a/src/crypto/x509/x509.c b/src/crypto/x509/x509.c
index 9049a35..f6b8fab 100644
--- a/src/crypto/x509/x509.c
+++ b/src/crypto/x509/x509.c
@@ -61,8 +61,8 @@
 #include <openssl/mem.h>
 
 
-/* |X509_R_UNSUPPORTED_ALGORITHM| is no longer emitted, but continue to define
- * it to avoid downstream churn. */
+// |X509_R_UNSUPPORTED_ALGORITHM| is no longer emitted, but continue to define
+// it to avoid downstream churn.
 OPENSSL_DECLARE_ERROR_REASON(X509, UNSUPPORTED_ALGORITHM)
 
 int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent) {
@@ -73,8 +73,7 @@
   s = sig->data;
   for (i = 0; i < n; i++) {
     if ((i % 18) == 0) {
-      if (BIO_write(bp, "\n", 1) <= 0 ||
-          BIO_indent(bp, indent, indent) <= 0) {
+      if (BIO_write(bp, "\n", 1) <= 0 || BIO_indent(bp, indent, indent) <= 0) {
         return 0;
       }
     }
diff --git a/src/crypto/x509/x509_att.c b/src/crypto/x509/x509_att.c
index e2a5121..d1c8f56 100644
--- a/src/crypto/x509/x509_att.c
+++ b/src/crypto/x509/x509_att.c
@@ -66,293 +66,304 @@
 #include "internal.h"
 
 
-int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
-{
-    return sk_X509_ATTRIBUTE_num(x);
+int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x) {
+  return sk_X509_ATTRIBUTE_num(x);
 }
 
 int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
-                           int lastpos)
-{
-    const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        return -1;
-    }
-    return X509at_get_attr_by_OBJ(x, obj, lastpos);
+                           int lastpos) {
+  const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    return -1;
+  }
+  return X509at_get_attr_by_OBJ(x, obj, lastpos);
 }
 
 int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk,
-                           const ASN1_OBJECT *obj, int lastpos)
-{
-    int n;
-    X509_ATTRIBUTE *ex;
+                           const ASN1_OBJECT *obj, int lastpos) {
+  int n;
+  X509_ATTRIBUTE *ex;
 
-    if (sk == NULL)
-        return (-1);
-    lastpos++;
-    if (lastpos < 0)
-        lastpos = 0;
-    n = sk_X509_ATTRIBUTE_num(sk);
-    for (; lastpos < n; lastpos++) {
-        ex = sk_X509_ATTRIBUTE_value(sk, lastpos);
-        if (OBJ_cmp(ex->object, obj) == 0)
-            return (lastpos);
+  if (sk == NULL) {
+    return -1;
+  }
+  lastpos++;
+  if (lastpos < 0) {
+    lastpos = 0;
+  }
+  n = sk_X509_ATTRIBUTE_num(sk);
+  for (; lastpos < n; lastpos++) {
+    ex = sk_X509_ATTRIBUTE_value(sk, lastpos);
+    if (OBJ_cmp(ex->object, obj) == 0) {
+      return lastpos;
     }
-    return (-1);
+  }
+  return -1;
 }
 
-X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
-{
-    if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc)
-        return NULL;
-    else
-        return sk_X509_ATTRIBUTE_value(x, loc);
+X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc) {
+  if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc) {
+    return NULL;
+  } else {
+    return sk_X509_ATTRIBUTE_value(x, loc);
+  }
 }
 
-X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
-{
-    X509_ATTRIBUTE *ret;
+X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc) {
+  X509_ATTRIBUTE *ret;
 
-    if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc)
-        return (NULL);
-    ret = sk_X509_ATTRIBUTE_delete(x, loc);
-    return (ret);
+  if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc) {
+    return NULL;
+  }
+  ret = sk_X509_ATTRIBUTE_delete(x, loc);
+  return ret;
 }
 
 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
-                                           X509_ATTRIBUTE *attr)
-{
-    X509_ATTRIBUTE *new_attr = NULL;
-    STACK_OF(X509_ATTRIBUTE) *sk = NULL;
+                                           X509_ATTRIBUTE *attr) {
+  X509_ATTRIBUTE *new_attr = NULL;
+  STACK_OF(X509_ATTRIBUTE) *sk = NULL;
 
-    if (x == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-        goto err2;
+  if (x == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
+    goto err2;
+  }
+
+  if (*x == NULL) {
+    if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL) {
+      goto err;
     }
+  } else {
+    sk = *x;
+  }
 
-    if (*x == NULL) {
-        if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL)
-            goto err;
-    } else
-        sk = *x;
-
-    if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL)
-        goto err2;
-    if (!sk_X509_ATTRIBUTE_push(sk, new_attr))
-        goto err;
-    if (*x == NULL)
-        *x = sk;
-    return (sk);
- err:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
- err2:
-    if (new_attr != NULL)
-        X509_ATTRIBUTE_free(new_attr);
-    if (sk != NULL)
-        sk_X509_ATTRIBUTE_free(sk);
-    return (NULL);
+  if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL) {
+    goto err2;
+  }
+  if (!sk_X509_ATTRIBUTE_push(sk, new_attr)) {
+    goto err;
+  }
+  if (*x == NULL) {
+    *x = sk;
+  }
+  return sk;
+err:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+err2:
+  if (new_attr != NULL) {
+    X509_ATTRIBUTE_free(new_attr);
+  }
+  if (sk != NULL) {
+    sk_X509_ATTRIBUTE_free(sk);
+  }
+  return NULL;
 }
 
-STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE)
-                                                  **x, const ASN1_OBJECT *obj,
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
+                                                  const ASN1_OBJECT *obj,
                                                   int type,
                                                   const unsigned char *bytes,
-                                                  int len)
-{
-    X509_ATTRIBUTE *attr;
-    STACK_OF(X509_ATTRIBUTE) *ret;
-    attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len);
-    if (!attr)
-        return 0;
-    ret = X509at_add1_attr(x, attr);
-    X509_ATTRIBUTE_free(attr);
-    return ret;
+                                                  int len) {
+  X509_ATTRIBUTE *attr;
+  STACK_OF(X509_ATTRIBUTE) *ret;
+  attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len);
+  if (!attr) {
+    return 0;
+  }
+  ret = X509at_add1_attr(x, attr);
+  X509_ATTRIBUTE_free(attr);
+  return ret;
 }
 
-STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE)
-                                                  **x, int nid, int type,
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x,
+                                                  int nid, int type,
                                                   const unsigned char *bytes,
-                                                  int len)
-{
-    X509_ATTRIBUTE *attr;
-    STACK_OF(X509_ATTRIBUTE) *ret;
-    attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len);
-    if (!attr)
-        return 0;
-    ret = X509at_add1_attr(x, attr);
-    X509_ATTRIBUTE_free(attr);
-    return ret;
+                                                  int len) {
+  X509_ATTRIBUTE *attr;
+  STACK_OF(X509_ATTRIBUTE) *ret;
+  attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len);
+  if (!attr) {
+    return 0;
+  }
+  ret = X509at_add1_attr(x, attr);
+  X509_ATTRIBUTE_free(attr);
+  return ret;
 }
 
-STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE)
-                                                  **x, const char *attrname,
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x,
+                                                  const char *attrname,
                                                   int type,
                                                   const unsigned char *bytes,
-                                                  int len)
-{
-    X509_ATTRIBUTE *attr;
-    STACK_OF(X509_ATTRIBUTE) *ret;
-    attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len);
-    if (!attr)
-        return 0;
-    ret = X509at_add1_attr(x, attr);
-    X509_ATTRIBUTE_free(attr);
-    return ret;
+                                                  int len) {
+  X509_ATTRIBUTE *attr;
+  STACK_OF(X509_ATTRIBUTE) *ret;
+  attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len);
+  if (!attr) {
+    return 0;
+  }
+  ret = X509at_add1_attr(x, attr);
+  X509_ATTRIBUTE_free(attr);
+  return ret;
 }
 
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
                                              int attrtype, const void *data,
-                                             int len)
-{
-    const ASN1_OBJECT *obj;
+                                             int len) {
+  const ASN1_OBJECT *obj;
 
-    obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
-        return (NULL);
-    }
-    return X509_ATTRIBUTE_create_by_OBJ(attr, obj, attrtype, data, len);
+  obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
+    return NULL;
+  }
+  return X509_ATTRIBUTE_create_by_OBJ(attr, obj, attrtype, data, len);
 }
 
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
                                              const ASN1_OBJECT *obj,
                                              int attrtype, const void *data,
-                                             int len)
-{
-    X509_ATTRIBUTE *ret;
+                                             int len) {
+  X509_ATTRIBUTE *ret;
 
-    if ((attr == NULL) || (*attr == NULL)) {
-        if ((ret = X509_ATTRIBUTE_new()) == NULL) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-            return (NULL);
-        }
-    } else
-        ret = *attr;
+  if ((attr == NULL) || (*attr == NULL)) {
+    if ((ret = X509_ATTRIBUTE_new()) == NULL) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+      return NULL;
+    }
+  } else {
+    ret = *attr;
+  }
 
-    if (!X509_ATTRIBUTE_set1_object(ret, obj))
-        goto err;
-    if (!X509_ATTRIBUTE_set1_data(ret, attrtype, data, len))
-        goto err;
+  if (!X509_ATTRIBUTE_set1_object(ret, obj)) {
+    goto err;
+  }
+  if (!X509_ATTRIBUTE_set1_data(ret, attrtype, data, len)) {
+    goto err;
+  }
 
-    if ((attr != NULL) && (*attr == NULL))
-        *attr = ret;
-    return (ret);
- err:
-    if ((attr == NULL) || (ret != *attr))
-        X509_ATTRIBUTE_free(ret);
-    return (NULL);
+  if ((attr != NULL) && (*attr == NULL)) {
+    *attr = ret;
+  }
+  return ret;
+err:
+  if ((attr == NULL) || (ret != *attr)) {
+    X509_ATTRIBUTE_free(ret);
+  }
+  return NULL;
 }
 
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
                                              const char *attrname, int type,
                                              const unsigned char *bytes,
-                                             int len)
-{
-    ASN1_OBJECT *obj;
-    X509_ATTRIBUTE *nattr;
+                                             int len) {
+  ASN1_OBJECT *obj;
+  X509_ATTRIBUTE *nattr;
 
-    obj = OBJ_txt2obj(attrname, 0);
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
-        ERR_add_error_data(2, "name=", attrname);
-        return (NULL);
-    }
-    nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len);
-    ASN1_OBJECT_free(obj);
-    return nattr;
+  obj = OBJ_txt2obj(attrname, 0);
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
+    ERR_add_error_data(2, "name=", attrname);
+    return NULL;
+  }
+  nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len);
+  ASN1_OBJECT_free(obj);
+  return nattr;
 }
 
-int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)
-{
-    if ((attr == NULL) || (obj == NULL))
-        return (0);
-    ASN1_OBJECT_free(attr->object);
-    attr->object = OBJ_dup(obj);
-    return attr->object != NULL;
+int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj) {
+  if ((attr == NULL) || (obj == NULL)) {
+    return 0;
+  }
+  ASN1_OBJECT_free(attr->object);
+  attr->object = OBJ_dup(obj);
+  return attr->object != NULL;
 }
 
 int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
-                             const void *data, int len)
-{
-    ASN1_TYPE *ttmp = NULL;
-    ASN1_STRING *stmp = NULL;
-    int atype = 0;
-    if (!attr)
-        return 0;
-    if (attrtype & MBSTRING_FLAG) {
-        stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,
-                                      OBJ_obj2nid(attr->object));
-        if (!stmp) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
-            return 0;
-        }
-        atype = stmp->type;
-    } else if (len != -1) {
-        if (!(stmp = ASN1_STRING_type_new(attrtype)))
-            goto err;
-        if (!ASN1_STRING_set(stmp, data, len))
-            goto err;
-        atype = attrtype;
-    }
-    /*
-     * This is a bit naughty because the attribute should really have at
-     * least one value but some types use and zero length SET and require
-     * this.
-     */
-    if (attrtype == 0) {
-        ASN1_STRING_free(stmp);
-        return 1;
-    }
-    if (!(ttmp = ASN1_TYPE_new()))
-        goto err;
-    if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
-        if (!ASN1_TYPE_set1(ttmp, attrtype, data))
-            goto err;
-    } else {
-        ASN1_TYPE_set(ttmp, atype, stmp);
-        stmp = NULL;
-    }
-    if (!sk_ASN1_TYPE_push(attr->set, ttmp))
-        goto err;
-    return 1;
- err:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    ASN1_TYPE_free(ttmp);
-    ASN1_STRING_free(stmp);
+                             const void *data, int len) {
+  ASN1_TYPE *ttmp = NULL;
+  ASN1_STRING *stmp = NULL;
+  int atype = 0;
+  if (!attr) {
     return 0;
-}
-
-int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr)
-{
-    return sk_ASN1_TYPE_num(attr->set);
-}
-
-ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)
-{
-    if (attr == NULL)
-        return (NULL);
-    return (attr->object);
-}
-
-void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
-                               int attrtype, void *unused)
-{
-    ASN1_TYPE *ttmp;
-    ttmp = X509_ATTRIBUTE_get0_type(attr, idx);
-    if (!ttmp)
-        return NULL;
-    if (attrtype != ASN1_TYPE_get(ttmp)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_WRONG_TYPE);
-        return NULL;
+  }
+  if (attrtype & MBSTRING_FLAG) {
+    stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,
+                                  OBJ_obj2nid(attr->object));
+    if (!stmp) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
+      return 0;
     }
-    return (void *)asn1_type_value_as_pointer(ttmp);
+    atype = stmp->type;
+  } else if (len != -1) {
+    if (!(stmp = ASN1_STRING_type_new(attrtype))) {
+      goto err;
+    }
+    if (!ASN1_STRING_set(stmp, data, len)) {
+      goto err;
+    }
+    atype = attrtype;
+  }
+  // This is a bit naughty because the attribute should really have at
+  // least one value but some types use and zero length SET and require
+  // this.
+  if (attrtype == 0) {
+    ASN1_STRING_free(stmp);
+    return 1;
+  }
+  if (!(ttmp = ASN1_TYPE_new())) {
+    goto err;
+  }
+  if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
+    if (!ASN1_TYPE_set1(ttmp, attrtype, data)) {
+      goto err;
+    }
+  } else {
+    ASN1_TYPE_set(ttmp, atype, stmp);
+    stmp = NULL;
+  }
+  if (!sk_ASN1_TYPE_push(attr->set, ttmp)) {
+    goto err;
+  }
+  return 1;
+err:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+  ASN1_TYPE_free(ttmp);
+  ASN1_STRING_free(stmp);
+  return 0;
 }
 
-ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
-{
-    if (attr == NULL)
-        return NULL;
-    if (idx >= X509_ATTRIBUTE_count(attr))
-        return NULL;
-    return sk_ASN1_TYPE_value(attr->set, idx);
+int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr) {
+  return sk_ASN1_TYPE_num(attr->set);
+}
+
+ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) {
+  if (attr == NULL) {
+    return NULL;
+  }
+  return attr->object;
+}
+
+void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int attrtype,
+                               void *unused) {
+  ASN1_TYPE *ttmp;
+  ttmp = X509_ATTRIBUTE_get0_type(attr, idx);
+  if (!ttmp) {
+    return NULL;
+  }
+  if (attrtype != ASN1_TYPE_get(ttmp)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_WRONG_TYPE);
+    return NULL;
+  }
+  return (void *)asn1_type_value_as_pointer(ttmp);
+}
+
+ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx) {
+  if (attr == NULL) {
+    return NULL;
+  }
+  if (idx >= X509_ATTRIBUTE_count(attr)) {
+    return NULL;
+  }
+  return sk_ASN1_TYPE_value(attr->set, idx);
 }
diff --git a/src/crypto/x509/x509_cmp.c b/src/crypto/x509/x509_cmp.c
index 5811f44..c9966e9 100644
--- a/src/crypto/x509/x509_cmp.c
+++ b/src/crypto/x509/x509_cmp.c
@@ -71,391 +71,225 @@
 #include "internal.h"
 
 
-int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b)
-{
-    int i;
-    X509_CINF *ai, *bi;
-
-    ai = a->cert_info;
-    bi = b->cert_info;
-    i = ASN1_INTEGER_cmp(ai->serialNumber, bi->serialNumber);
-    if (i)
-        return (i);
-    return (X509_NAME_cmp(ai->issuer, bi->issuer));
+int X509_issuer_name_cmp(const X509 *a, const X509 *b) {
+  return (X509_NAME_cmp(a->cert_info->issuer, b->cert_info->issuer));
 }
 
-int X509_issuer_name_cmp(const X509 *a, const X509 *b)
-{
-    return (X509_NAME_cmp(a->cert_info->issuer, b->cert_info->issuer));
+int X509_subject_name_cmp(const X509 *a, const X509 *b) {
+  return (X509_NAME_cmp(a->cert_info->subject, b->cert_info->subject));
 }
 
-int X509_subject_name_cmp(const X509 *a, const X509 *b)
-{
-    return (X509_NAME_cmp(a->cert_info->subject, b->cert_info->subject));
+int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b) {
+  return (X509_NAME_cmp(a->crl->issuer, b->crl->issuer));
 }
 
-int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b)
-{
-    return (X509_NAME_cmp(a->crl->issuer, b->crl->issuer));
+int X509_CRL_match(const X509_CRL *a, const X509_CRL *b) {
+  return OPENSSL_memcmp(a->crl_hash, b->crl_hash, SHA256_DIGEST_LENGTH);
 }
 
-int X509_CRL_match(const X509_CRL *a, const X509_CRL *b)
-{
-    return OPENSSL_memcmp(a->sha1_hash, b->sha1_hash, 20);
+X509_NAME *X509_get_issuer_name(const X509 *a) {
+  return a->cert_info->issuer;
 }
 
-X509_NAME *X509_get_issuer_name(const X509 *a)
-{
-    return (a->cert_info->issuer);
+unsigned long X509_issuer_name_hash(X509 *x) {
+  return (X509_NAME_hash(x->cert_info->issuer));
 }
 
-unsigned long X509_issuer_name_hash(X509 *x)
-{
-    return (X509_NAME_hash(x->cert_info->issuer));
+unsigned long X509_issuer_name_hash_old(X509 *x) {
+  return (X509_NAME_hash_old(x->cert_info->issuer));
 }
 
-unsigned long X509_issuer_name_hash_old(X509 *x)
-{
-    return (X509_NAME_hash_old(x->cert_info->issuer));
+X509_NAME *X509_get_subject_name(const X509 *a) {
+  return a->cert_info->subject;
 }
 
-X509_NAME *X509_get_subject_name(const X509 *a)
-{
-    return (a->cert_info->subject);
+ASN1_INTEGER *X509_get_serialNumber(X509 *a) {
+  return a->cert_info->serialNumber;
 }
 
-ASN1_INTEGER *X509_get_serialNumber(X509 *a)
-{
-    return (a->cert_info->serialNumber);
+const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509) {
+  return x509->cert_info->serialNumber;
 }
 
-const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509)
-{
-    return x509->cert_info->serialNumber;
+unsigned long X509_subject_name_hash(X509 *x) {
+  return (X509_NAME_hash(x->cert_info->subject));
 }
 
-unsigned long X509_subject_name_hash(X509 *x)
-{
-    return (X509_NAME_hash(x->cert_info->subject));
+unsigned long X509_subject_name_hash_old(X509 *x) {
+  return (X509_NAME_hash_old(x->cert_info->subject));
 }
 
-unsigned long X509_subject_name_hash_old(X509 *x)
-{
-    return (X509_NAME_hash_old(x->cert_info->subject));
+// Compare two certificates: they must be identical for this to work. NB:
+// Although "cmp" operations are generally prototyped to take "const"
+// arguments (eg. for use in STACKs), the way X509 handling is - these
+// operations may involve ensuring the hashes are up-to-date and ensuring
+// certain cert information is cached. So this is the point where the
+// "depth-first" constification tree has to halt with an evil cast.
+int X509_cmp(const X509 *a, const X509 *b) {
+  // Fill in the |cert_hash| fields.
+  //
+  // TODO(davidben): This may fail, in which case the the hash will be all
+  // zeros. This produces a consistent comparison (failures are sticky), but
+  // not a good one. OpenSSL now returns -2, but this is not a consistent
+  // comparison and may cause misbehaving sorts by transitivity. For now, we
+  // retain the old OpenSSL behavior, which was to ignore the error. See
+  // https://crbug.com/boringssl/355.
+  x509v3_cache_extensions((X509 *)a);
+  x509v3_cache_extensions((X509 *)b);
+
+  return OPENSSL_memcmp(a->cert_hash, b->cert_hash, SHA256_DIGEST_LENGTH);
 }
 
-/*
- * Compare two certificates: they must be identical for this to work. NB:
- * Although "cmp" operations are generally prototyped to take "const"
- * arguments (eg. for use in STACKs), the way X509 handling is - these
- * operations may involve ensuring the hashes are up-to-date and ensuring
- * certain cert information is cached. So this is the point where the
- * "depth-first" constification tree has to halt with an evil cast.
- */
-int X509_cmp(const X509 *a, const X509 *b)
-{
-    /* Fill in the |sha1_hash| fields.
-     *
-     * TODO(davidben): This may fail, in which case the the hash will be all
-     * zeros. This produces a consistent comparison (failures are sticky), but
-     * not a good one. OpenSSL now returns -2, but this is not a consistent
-     * comparison and may cause misbehaving sorts by transitivity. For now, we
-     * retain the old OpenSSL behavior, which was to ignore the error. See
-     * https://crbug.com/boringssl/355. */
-    x509v3_cache_extensions((X509 *)a);
-    x509v3_cache_extensions((X509 *)b);
+int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b) {
+  int ret;
 
-    int rv = OPENSSL_memcmp(a->sha1_hash, b->sha1_hash, SHA_DIGEST_LENGTH);
-    if (rv)
-        return rv;
-    /* Check for match against stored encoding too */
-    if (!a->cert_info->enc.modified && !b->cert_info->enc.modified) {
-        rv = (int)(a->cert_info->enc.len - b->cert_info->enc.len);
-        if (rv)
-            return rv;
-        return OPENSSL_memcmp(a->cert_info->enc.enc, b->cert_info->enc.enc,
-                              a->cert_info->enc.len);
+  // Ensure canonical encoding is present and up to date
+
+  if (!a->canon_enc || a->modified) {
+    ret = i2d_X509_NAME((X509_NAME *)a, NULL);
+    if (ret < 0) {
+      return -2;
     }
-    return rv;
-}
+  }
 
-int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
-{
-    int ret;
-
-    /* Ensure canonical encoding is present and up to date */
-
-    if (!a->canon_enc || a->modified) {
-        ret = i2d_X509_NAME((X509_NAME *)a, NULL);
-        if (ret < 0)
-            return -2;
+  if (!b->canon_enc || b->modified) {
+    ret = i2d_X509_NAME((X509_NAME *)b, NULL);
+    if (ret < 0) {
+      return -2;
     }
+  }
 
-    if (!b->canon_enc || b->modified) {
-        ret = i2d_X509_NAME((X509_NAME *)b, NULL);
-        if (ret < 0)
-            return -2;
-    }
+  ret = a->canon_enclen - b->canon_enclen;
 
-    ret = a->canon_enclen - b->canon_enclen;
-
-    if (ret)
-        return ret;
-
-    return OPENSSL_memcmp(a->canon_enc, b->canon_enc, a->canon_enclen);
-
-}
-
-unsigned long X509_NAME_hash(X509_NAME *x)
-{
-    unsigned long ret = 0;
-    unsigned char md[SHA_DIGEST_LENGTH];
-
-    /* Make sure X509_NAME structure contains valid cached encoding */
-    i2d_X509_NAME(x, NULL);
-    if (!EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, EVP_sha1(),
-                    NULL))
-        return 0;
-
-    ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
-           ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
-        ) & 0xffffffffL;
-    return (ret);
-}
-
-/*
- * I now DER encode the name and hash it.  Since I cache the DER encoding,
- * this is reasonably efficient.
- */
-
-unsigned long X509_NAME_hash_old(X509_NAME *x)
-{
-    EVP_MD_CTX md_ctx;
-    unsigned long ret = 0;
-    unsigned char md[16];
-
-    /* Make sure X509_NAME structure contains valid cached encoding */
-    i2d_X509_NAME(x, NULL);
-    EVP_MD_CTX_init(&md_ctx);
-    /* EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); */
-    if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL)
-        && EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length)
-        && EVP_DigestFinal_ex(&md_ctx, md, NULL))
-        ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
-               ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
-            ) & 0xffffffffL;
-    EVP_MD_CTX_cleanup(&md_ctx);
-
-    return (ret);
-}
-
-/* Search a stack of X509 for a match */
-X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name,
-                                     ASN1_INTEGER *serial)
-{
-    size_t i;
-    X509_CINF cinf;
-    X509 x, *x509 = NULL;
-
-    if (!sk)
-        return NULL;
-
-    x.cert_info = &cinf;
-    cinf.serialNumber = serial;
-    cinf.issuer = name;
-
-    for (i = 0; i < sk_X509_num(sk); i++) {
-        x509 = sk_X509_value(sk, i);
-        if (X509_issuer_and_serial_cmp(x509, &x) == 0)
-            return (x509);
-    }
-    return (NULL);
-}
-
-X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name)
-{
-    X509 *x509;
-    size_t i;
-
-    for (i = 0; i < sk_X509_num(sk); i++) {
-        x509 = sk_X509_value(sk, i);
-        if (X509_NAME_cmp(X509_get_subject_name(x509), name) == 0)
-            return (x509);
-    }
-    return (NULL);
-}
-
-EVP_PKEY *X509_get_pubkey(X509 *x)
-{
-    if ((x == NULL) || (x->cert_info == NULL))
-        return (NULL);
-    return (X509_PUBKEY_get(x->cert_info->key));
-}
-
-ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x)
-{
-    if (!x)
-        return NULL;
-    return x->cert_info->key->public_key;
-}
-
-int X509_check_private_key(X509 *x, const EVP_PKEY *k)
-{
-    EVP_PKEY *xk;
-    int ret;
-
-    xk = X509_get_pubkey(x);
-
-    if (xk)
-        ret = EVP_PKEY_cmp(xk, k);
-    else
-        ret = -2;
-
-    switch (ret) {
-    case 1:
-        break;
-    case 0:
-        OPENSSL_PUT_ERROR(X509, X509_R_KEY_VALUES_MISMATCH);
-        break;
-    case -1:
-        OPENSSL_PUT_ERROR(X509, X509_R_KEY_TYPE_MISMATCH);
-        break;
-    case -2:
-        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
-    }
-    if (xk)
-        EVP_PKEY_free(xk);
-    if (ret > 0)
-        return 1;
-    return 0;
-}
-
-/*
- * Check a suite B algorithm is permitted: pass in a public key and the NID
- * of its signature (or 0 if no signature). The pflags is a pointer to a
- * flags field which must contain the suite B verification flags.
- */
-
-static int check_suite_b(EVP_PKEY *pkey, int sign_nid, unsigned long *pflags)
-{
-    const EC_GROUP *grp = NULL;
-    int curve_nid;
-    if (pkey && pkey->type == EVP_PKEY_EC)
-        grp = EC_KEY_get0_group(pkey->pkey.ec);
-    if (!grp)
-        return X509_V_ERR_SUITE_B_INVALID_ALGORITHM;
-    curve_nid = EC_GROUP_get_curve_name(grp);
-    /* Check curve is consistent with LOS */
-    if (curve_nid == NID_secp384r1) { /* P-384 */
-        /*
-         * Check signature algorithm is consistent with curve.
-         */
-        if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA384)
-            return X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM;
-        if (!(*pflags & X509_V_FLAG_SUITEB_192_LOS))
-            return X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED;
-        /* If we encounter P-384 we cannot use P-256 later */
-        *pflags &= ~X509_V_FLAG_SUITEB_128_LOS_ONLY;
-    } else if (curve_nid == NID_X9_62_prime256v1) { /* P-256 */
-        if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA256)
-            return X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM;
-        if (!(*pflags & X509_V_FLAG_SUITEB_128_LOS_ONLY))
-            return X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED;
-    } else
-        return X509_V_ERR_SUITE_B_INVALID_CURVE;
-
-    return X509_V_OK;
-}
-
-int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
-                            unsigned long flags)
-{
-    int rv, sign_nid;
-    size_t i;
-    EVP_PKEY *pk = NULL;
-    unsigned long tflags;
-    if (!(flags & X509_V_FLAG_SUITEB_128_LOS))
-        return X509_V_OK;
-    tflags = flags;
-    /* If no EE certificate passed in must be first in chain */
-    if (x == NULL) {
-        x = sk_X509_value(chain, 0);
-        i = 1;
-    } else
-        i = 0;
-
-    if (X509_get_version(x) != X509_VERSION_3) {
-        rv = X509_V_ERR_SUITE_B_INVALID_VERSION;
-        /* Correct error depth */
-        i = 0;
-        goto end;
-    }
-
-    pk = X509_get_pubkey(x);
-    /* Check EE key only */
-    rv = check_suite_b(pk, -1, &tflags);
-    if (rv != X509_V_OK) {
-        /* Correct error depth */
-        i = 0;
-        goto end;
-    }
-    for (; i < sk_X509_num(chain); i++) {
-        sign_nid = X509_get_signature_nid(x);
-        x = sk_X509_value(chain, i);
-        if (X509_get_version(x) != X509_VERSION_3) {
-            rv = X509_V_ERR_SUITE_B_INVALID_VERSION;
-            goto end;
-        }
-        EVP_PKEY_free(pk);
-        pk = X509_get_pubkey(x);
-        rv = check_suite_b(pk, sign_nid, &tflags);
-        if (rv != X509_V_OK)
-            goto end;
-    }
-
-    /* Final check: root CA signature */
-    rv = check_suite_b(pk, X509_get_signature_nid(x), &tflags);
- end:
-    if (pk)
-        EVP_PKEY_free(pk);
-    if (rv != X509_V_OK) {
-        /* Invalid signature or LOS errors are for previous cert */
-        if ((rv == X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM
-             || rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED) && i)
-            i--;
-        /*
-         * If we have LOS error and flags changed then we are signing P-384
-         * with P-256. Use more meaninggul error.
-         */
-        if (rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED && flags != tflags)
-            rv = X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256;
-        if (perror_depth)
-            *perror_depth = i;
-    }
-    return rv;
-}
-
-int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags)
-{
-    int sign_nid;
-    if (!(flags & X509_V_FLAG_SUITEB_128_LOS))
-        return X509_V_OK;
-    sign_nid = OBJ_obj2nid(crl->crl->sig_alg->algorithm);
-    return check_suite_b(pk, sign_nid, &flags);
-}
-
-/*
- * Not strictly speaking an "up_ref" as a STACK doesn't have a reference
- * count but it has the same effect by duping the STACK and upping the ref of
- * each X509 structure.
- */
-STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain)
-{
-    STACK_OF(X509) *ret;
-    size_t i;
-    ret = sk_X509_dup(chain);
-    for (i = 0; i < sk_X509_num(ret); i++) {
-        X509_up_ref(sk_X509_value(ret, i));
-    }
+  if (ret) {
     return ret;
+  }
+
+  return OPENSSL_memcmp(a->canon_enc, b->canon_enc, a->canon_enclen);
+}
+
+unsigned long X509_NAME_hash(X509_NAME *x) {
+  unsigned long ret = 0;
+  unsigned char md[SHA_DIGEST_LENGTH];
+
+  // Make sure X509_NAME structure contains valid cached encoding
+  i2d_X509_NAME(x, NULL);
+  if (!EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, EVP_sha1(), NULL)) {
+    return 0;
+  }
+
+  ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
+         ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)) &
+        0xffffffffL;
+  return ret;
+}
+
+// I now DER encode the name and hash it.  Since I cache the DER encoding,
+// this is reasonably efficient.
+
+unsigned long X509_NAME_hash_old(X509_NAME *x) {
+  EVP_MD_CTX md_ctx;
+  unsigned long ret = 0;
+  unsigned char md[16];
+
+  // Make sure X509_NAME structure contains valid cached encoding
+  i2d_X509_NAME(x, NULL);
+  EVP_MD_CTX_init(&md_ctx);
+  // EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+  if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL) &&
+      EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length) &&
+      EVP_DigestFinal_ex(&md_ctx, md, NULL)) {
+    ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
+           ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)) &
+          0xffffffffL;
+  }
+  EVP_MD_CTX_cleanup(&md_ctx);
+
+  return ret;
+}
+
+X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, X509_NAME *name,
+                                     const ASN1_INTEGER *serial) {
+  if (serial->type != V_ASN1_INTEGER && serial->type != V_ASN1_NEG_INTEGER) {
+    return NULL;
+  }
+
+  for (size_t i = 0; i < sk_X509_num(sk); i++) {
+    X509 *x509 = sk_X509_value(sk, i);
+    if (ASN1_INTEGER_cmp(X509_get0_serialNumber(x509), serial) == 0 &&
+        X509_NAME_cmp(X509_get_issuer_name(x509), name) == 0) {
+      return x509;
+    }
+  }
+  return NULL;
+}
+
+X509 *X509_find_by_subject(const STACK_OF(X509) *sk, X509_NAME *name) {
+  for (size_t i = 0; i < sk_X509_num(sk); i++) {
+    X509 *x509 = sk_X509_value(sk, i);
+    if (X509_NAME_cmp(X509_get_subject_name(x509), name) == 0) {
+      return x509;
+    }
+  }
+  return NULL;
+}
+
+EVP_PKEY *X509_get_pubkey(X509 *x) {
+  if ((x == NULL) || (x->cert_info == NULL)) {
+    return NULL;
+  }
+  return (X509_PUBKEY_get(x->cert_info->key));
+}
+
+ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x) {
+  if (!x) {
+    return NULL;
+  }
+  return x->cert_info->key->public_key;
+}
+
+int X509_check_private_key(X509 *x, const EVP_PKEY *k) {
+  EVP_PKEY *xk;
+  int ret;
+
+  xk = X509_get_pubkey(x);
+
+  if (xk) {
+    ret = EVP_PKEY_cmp(xk, k);
+  } else {
+    ret = -2;
+  }
+
+  switch (ret) {
+    case 1:
+      break;
+    case 0:
+      OPENSSL_PUT_ERROR(X509, X509_R_KEY_VALUES_MISMATCH);
+      break;
+    case -1:
+      OPENSSL_PUT_ERROR(X509, X509_R_KEY_TYPE_MISMATCH);
+      break;
+    case -2:
+      OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
+  }
+  if (xk) {
+    EVP_PKEY_free(xk);
+  }
+  if (ret > 0) {
+    return 1;
+  }
+  return 0;
+}
+
+// Not strictly speaking an "up_ref" as a STACK doesn't have a reference
+// count but it has the same effect by duping the STACK and upping the ref of
+// each X509 structure.
+STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain) {
+  STACK_OF(X509) *ret;
+  size_t i;
+  ret = sk_X509_dup(chain);
+  for (i = 0; i < sk_X509_num(ret); i++) {
+    X509_up_ref(sk_X509_value(ret, i));
+  }
+  return ret;
 }
diff --git a/src/crypto/x509/x509_d2.c b/src/crypto/x509/x509_d2.c
index 69ae54e..da08f24 100644
--- a/src/crypto/x509/x509_d2.c
+++ b/src/crypto/x509/x509_d2.c
@@ -59,48 +59,53 @@
 #include <openssl/x509.h>
 
 #ifndef OPENSSL_NO_STDIO
-int X509_STORE_set_default_paths(X509_STORE *ctx)
-{
-    X509_LOOKUP *lookup;
+int X509_STORE_set_default_paths(X509_STORE *ctx) {
+  X509_LOOKUP *lookup;
 
-    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
-    if (lookup == NULL)
-        return (0);
-    X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
+  lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
+  if (lookup == NULL) {
+    return 0;
+  }
+  X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
 
-    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
-    if (lookup == NULL)
-        return (0);
-    X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
+  lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
+  if (lookup == NULL) {
+    return 0;
+  }
+  X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
 
-    /* clear any errors */
-    ERR_clear_error();
+  // clear any errors
+  ERR_clear_error();
 
-    return (1);
+  return 1;
 }
 
 int X509_STORE_load_locations(X509_STORE *ctx, const char *file,
-                              const char *path)
-{
-    X509_LOOKUP *lookup;
+                              const char *path) {
+  X509_LOOKUP *lookup;
 
-    if (file != NULL) {
-        lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
-        if (lookup == NULL)
-            return (0);
-        if (X509_LOOKUP_load_file(lookup, file, X509_FILETYPE_PEM) != 1)
-            return (0);
+  if (file != NULL) {
+    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
+    if (lookup == NULL) {
+      return 0;
     }
-    if (path != NULL) {
-        lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
-        if (lookup == NULL)
-            return (0);
-        if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1)
-            return (0);
+    if (X509_LOOKUP_load_file(lookup, file, X509_FILETYPE_PEM) != 1) {
+      return 0;
     }
-    if ((path == NULL) && (file == NULL))
-        return (0);
-    return (1);
+  }
+  if (path != NULL) {
+    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
+    if (lookup == NULL) {
+      return 0;
+    }
+    if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1) {
+      return 0;
+    }
+  }
+  if ((path == NULL) && (file == NULL)) {
+    return 0;
+  }
+  return 1;
 }
 
 #endif
diff --git a/src/crypto/x509/x509_def.c b/src/crypto/x509/x509_def.c
index d2bc3e5..a6489c6 100644
--- a/src/crypto/x509/x509_def.c
+++ b/src/crypto/x509/x509_def.c
@@ -57,7 +57,7 @@
 
 #include <openssl/x509.h>
 
-/* TODO(fork): cleanup */
+// TODO(fork): cleanup
 
 #if defined(OPENSSL_FUCHSIA)
 #define OPENSSLDIR "/config/ssl"
@@ -65,39 +65,23 @@
 #define OPENSSLDIR "/etc/ssl"
 #endif
 
-#define X509_CERT_AREA          OPENSSLDIR
-#define X509_CERT_DIR           OPENSSLDIR "/certs"
-#define X509_CERT_FILE          OPENSSLDIR "/cert.pem"
-#define X509_PRIVATE_DIR        OPENSSLDIR "/private"
-#define X509_CERT_DIR_EVP        "SSL_CERT_DIR"
-#define X509_CERT_FILE_EVP       "SSL_CERT_FILE"
+#define X509_CERT_AREA OPENSSLDIR
+#define X509_CERT_DIR OPENSSLDIR "/certs"
+#define X509_CERT_FILE OPENSSLDIR "/cert.pem"
+#define X509_PRIVATE_DIR OPENSSLDIR "/private"
+#define X509_CERT_DIR_EVP "SSL_CERT_DIR"
+#define X509_CERT_FILE_EVP "SSL_CERT_FILE"
 
-const char *X509_get_default_private_dir(void)
-{
-    return (X509_PRIVATE_DIR);
-}
+const char *X509_get_default_private_dir(void) { return X509_PRIVATE_DIR; }
 
-const char *X509_get_default_cert_area(void)
-{
-    return (X509_CERT_AREA);
-}
+const char *X509_get_default_cert_area(void) { return X509_CERT_AREA; }
 
-const char *X509_get_default_cert_dir(void)
-{
-    return (X509_CERT_DIR);
-}
+const char *X509_get_default_cert_dir(void) { return X509_CERT_DIR; }
 
-const char *X509_get_default_cert_file(void)
-{
-    return (X509_CERT_FILE);
-}
+const char *X509_get_default_cert_file(void) { return X509_CERT_FILE; }
 
-const char *X509_get_default_cert_dir_env(void)
-{
-    return (X509_CERT_DIR_EVP);
-}
+const char *X509_get_default_cert_dir_env(void) { return X509_CERT_DIR_EVP; }
 
-const char *X509_get_default_cert_file_env(void)
-{
-    return (X509_CERT_FILE_EVP);
+const char *X509_get_default_cert_file_env(void) {
+  return X509_CERT_FILE_EVP;
 }
diff --git a/src/crypto/x509/x509_ext.c b/src/crypto/x509/x509_ext.c
index a08e2a8..8ab1926 100644
--- a/src/crypto/x509/x509_ext.c
+++ b/src/crypto/x509/x509_ext.c
@@ -64,149 +64,120 @@
 
 #include "internal.h"
 
-int X509_CRL_get_ext_count(const X509_CRL *x)
-{
-    return (X509v3_get_ext_count(x->crl->extensions));
+int X509_CRL_get_ext_count(const X509_CRL *x) {
+  return (X509v3_get_ext_count(x->crl->extensions));
 }
 
-int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos)
-{
-    return (X509v3_get_ext_by_NID(x->crl->extensions, nid, lastpos));
+int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos) {
+  return (X509v3_get_ext_by_NID(x->crl->extensions, nid, lastpos));
 }
 
 int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj,
-                            int lastpos)
-{
-    return (X509v3_get_ext_by_OBJ(x->crl->extensions, obj, lastpos));
+                            int lastpos) {
+  return (X509v3_get_ext_by_OBJ(x->crl->extensions, obj, lastpos));
 }
 
-int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos)
-{
-    return (X509v3_get_ext_by_critical(x->crl->extensions, crit, lastpos));
+int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos) {
+  return (X509v3_get_ext_by_critical(x->crl->extensions, crit, lastpos));
 }
 
-X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc)
-{
-    return (X509v3_get_ext(x->crl->extensions, loc));
+X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc) {
+  return (X509v3_get_ext(x->crl->extensions, loc));
 }
 
-X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc)
-{
-    return (X509v3_delete_ext(x->crl->extensions, loc));
+X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc) {
+  return (X509v3_delete_ext(x->crl->extensions, loc));
 }
 
 void *X509_CRL_get_ext_d2i(const X509_CRL *crl, int nid, int *out_critical,
-                           int *out_idx)
-{
-    return X509V3_get_d2i(crl->crl->extensions, nid, out_critical, out_idx);
+                           int *out_idx) {
+  return X509V3_get_d2i(crl->crl->extensions, nid, out_critical, out_idx);
 }
 
 int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit,
-                          unsigned long flags)
-{
-    return X509V3_add1_i2d(&x->crl->extensions, nid, value, crit, flags);
+                          unsigned long flags) {
+  return X509V3_add1_i2d(&x->crl->extensions, nid, value, crit, flags);
 }
 
-int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc)
-{
-    return (X509v3_add_ext(&(x->crl->extensions), ex, loc) != NULL);
+int X509_CRL_add_ext(X509_CRL *x, const X509_EXTENSION *ex, int loc) {
+  return (X509v3_add_ext(&(x->crl->extensions), ex, loc) != NULL);
 }
 
-int X509_get_ext_count(const X509 *x)
-{
-    return (X509v3_get_ext_count(x->cert_info->extensions));
+int X509_get_ext_count(const X509 *x) {
+  return (X509v3_get_ext_count(x->cert_info->extensions));
 }
 
-int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos)
-{
-    return (X509v3_get_ext_by_NID(x->cert_info->extensions, nid, lastpos));
+int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos) {
+  return (X509v3_get_ext_by_NID(x->cert_info->extensions, nid, lastpos));
 }
 
-int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos)
-{
-    return (X509v3_get_ext_by_OBJ(x->cert_info->extensions, obj, lastpos));
+int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos) {
+  return (X509v3_get_ext_by_OBJ(x->cert_info->extensions, obj, lastpos));
 }
 
-int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos)
-{
-    return (X509v3_get_ext_by_critical
-            (x->cert_info->extensions, crit, lastpos));
+int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos) {
+  return (X509v3_get_ext_by_critical(x->cert_info->extensions, crit, lastpos));
 }
 
-X509_EXTENSION *X509_get_ext(const X509 *x, int loc)
-{
-    return (X509v3_get_ext(x->cert_info->extensions, loc));
+X509_EXTENSION *X509_get_ext(const X509 *x, int loc) {
+  return (X509v3_get_ext(x->cert_info->extensions, loc));
 }
 
-X509_EXTENSION *X509_delete_ext(X509 *x, int loc)
-{
-    return (X509v3_delete_ext(x->cert_info->extensions, loc));
+X509_EXTENSION *X509_delete_ext(X509 *x, int loc) {
+  return (X509v3_delete_ext(x->cert_info->extensions, loc));
 }
 
-int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc)
-{
-    return (X509v3_add_ext(&(x->cert_info->extensions), ex, loc) != NULL);
+int X509_add_ext(X509 *x, const X509_EXTENSION *ex, int loc) {
+  return (X509v3_add_ext(&(x->cert_info->extensions), ex, loc) != NULL);
 }
 
 void *X509_get_ext_d2i(const X509 *x509, int nid, int *out_critical,
-                       int *out_idx)
-{
-    return X509V3_get_d2i(x509->cert_info->extensions, nid, out_critical,
-                          out_idx);
+                       int *out_idx) {
+  return X509V3_get_d2i(x509->cert_info->extensions, nid, out_critical,
+                        out_idx);
 }
 
 int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
-                      unsigned long flags)
-{
-    return X509V3_add1_i2d(&x->cert_info->extensions, nid, value, crit,
-                           flags);
+                      unsigned long flags) {
+  return X509V3_add1_i2d(&x->cert_info->extensions, nid, value, crit, flags);
 }
 
-int X509_REVOKED_get_ext_count(const X509_REVOKED *x)
-{
-    return (X509v3_get_ext_count(x->extensions));
+int X509_REVOKED_get_ext_count(const X509_REVOKED *x) {
+  return (X509v3_get_ext_count(x->extensions));
 }
 
-int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos)
-{
-    return (X509v3_get_ext_by_NID(x->extensions, nid, lastpos));
+int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos) {
+  return (X509v3_get_ext_by_NID(x->extensions, nid, lastpos));
 }
 
 int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj,
-                                int lastpos)
-{
-    return (X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos));
+                                int lastpos) {
+  return (X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos));
 }
 
 int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit,
-                                     int lastpos)
-{
-    return (X509v3_get_ext_by_critical(x->extensions, crit, lastpos));
+                                     int lastpos) {
+  return (X509v3_get_ext_by_critical(x->extensions, crit, lastpos));
 }
 
-X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc)
-{
-    return (X509v3_get_ext(x->extensions, loc));
+X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc) {
+  return (X509v3_get_ext(x->extensions, loc));
 }
 
-X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc)
-{
-    return (X509v3_delete_ext(x->extensions, loc));
+X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc) {
+  return (X509v3_delete_ext(x->extensions, loc));
 }
 
-int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc)
-{
-    return (X509v3_add_ext(&(x->extensions), ex, loc) != NULL);
+int X509_REVOKED_add_ext(X509_REVOKED *x, const X509_EXTENSION *ex, int loc) {
+  return (X509v3_add_ext(&(x->extensions), ex, loc) != NULL);
 }
 
 void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *revoked, int nid,
-                               int *out_critical, int *out_idx)
-{
-    return X509V3_get_d2i(revoked->extensions, nid, out_critical, out_idx);
+                               int *out_critical, int *out_idx) {
+  return X509V3_get_d2i(revoked->extensions, nid, out_critical, out_idx);
 }
 
 int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit,
-                              unsigned long flags)
-{
-    return X509V3_add1_i2d(&x->extensions, nid, value, crit, flags);
+                              unsigned long flags) {
+  return X509V3_add1_i2d(&x->extensions, nid, value, crit, flags);
 }
diff --git a/src/crypto/x509/x509_lu.c b/src/crypto/x509/x509_lu.c
index 041a5fd..d02aef8 100644
--- a/src/crypto/x509/x509_lu.c
+++ b/src/crypto/x509/x509_lu.c
@@ -66,765 +66,683 @@
 #include "../internal.h"
 #include "internal.h"
 
-X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method)
-{
-    X509_LOOKUP *ret;
+X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method) {
+  X509_LOOKUP *ret;
 
-    ret = (X509_LOOKUP *)OPENSSL_malloc(sizeof(X509_LOOKUP));
-    if (ret == NULL)
-        return NULL;
+  ret = (X509_LOOKUP *)OPENSSL_malloc(sizeof(X509_LOOKUP));
+  if (ret == NULL) {
+    return NULL;
+  }
 
-    ret->init = 0;
-    ret->skip = 0;
-    ret->method = method;
-    ret->method_data = NULL;
-    ret->store_ctx = NULL;
-    if ((method->new_item != NULL) && !method->new_item(ret)) {
-        OPENSSL_free(ret);
-        return NULL;
-    }
-    return ret;
+  ret->init = 0;
+  ret->skip = 0;
+  ret->method = method;
+  ret->method_data = NULL;
+  ret->store_ctx = NULL;
+  if ((method->new_item != NULL) && !method->new_item(ret)) {
+    OPENSSL_free(ret);
+    return NULL;
+  }
+  return ret;
 }
 
-void X509_LOOKUP_free(X509_LOOKUP *ctx)
-{
-    if (ctx == NULL)
-        return;
-    if ((ctx->method != NULL) && (ctx->method->free != NULL))
-        (*ctx->method->free) (ctx);
-    OPENSSL_free(ctx);
+void X509_LOOKUP_free(X509_LOOKUP *ctx) {
+  if (ctx == NULL) {
+    return;
+  }
+  if ((ctx->method != NULL) && (ctx->method->free != NULL)) {
+    (*ctx->method->free)(ctx);
+  }
+  OPENSSL_free(ctx);
 }
 
-int X509_LOOKUP_init(X509_LOOKUP *ctx)
-{
-    if (ctx->method == NULL)
-        return 0;
-    if (ctx->method->init != NULL)
-        return ctx->method->init(ctx);
-    else
-        return 1;
+int X509_LOOKUP_init(X509_LOOKUP *ctx) {
+  if (ctx->method == NULL) {
+    return 0;
+  }
+  if (ctx->method->init != NULL) {
+    return ctx->method->init(ctx);
+  } else {
+    return 1;
+  }
 }
 
-int X509_LOOKUP_shutdown(X509_LOOKUP *ctx)
-{
-    if (ctx->method == NULL)
-        return 0;
-    if (ctx->method->shutdown != NULL)
-        return ctx->method->shutdown(ctx);
-    else
-        return 1;
+int X509_LOOKUP_shutdown(X509_LOOKUP *ctx) {
+  if (ctx->method == NULL) {
+    return 0;
+  }
+  if (ctx->method->shutdown != NULL) {
+    return ctx->method->shutdown(ctx);
+  } else {
+    return 1;
+  }
 }
 
 int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
-                     char **ret)
-{
-    if (ctx->method == NULL)
-        return -1;
-    if (ctx->method->ctrl != NULL)
-        return ctx->method->ctrl(ctx, cmd, argc, argl, ret);
-    else
-        return 1;
+                     char **ret) {
+  if (ctx->method == NULL) {
+    return -1;
+  }
+  if (ctx->method->ctrl != NULL) {
+    return ctx->method->ctrl(ctx, cmd, argc, argl, ret);
+  } else {
+    return 1;
+  }
 }
 
 int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
-                           X509_OBJECT *ret)
-{
-    if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL))
-        return 0;
-    if (ctx->skip)
-        return 0;
-    return ctx->method->get_by_subject(ctx, type, name, ret) > 0;
+                           X509_OBJECT *ret) {
+  if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL)) {
+    return 0;
+  }
+  if (ctx->skip) {
+    return 0;
+  }
+  return ctx->method->get_by_subject(ctx, type, name, ret) > 0;
 }
 
-int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
-                                 ASN1_INTEGER *serial, X509_OBJECT *ret)
-{
-    if ((ctx->method == NULL) || (ctx->method->get_by_issuer_serial == NULL))
-        return 0;
-    return ctx->method->get_by_issuer_serial(ctx, type, name, serial, ret) > 0;
-}
+static int x509_object_cmp(const X509_OBJECT **a, const X509_OBJECT **b) {
+  int ret;
 
-int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
-                               unsigned char *bytes, int len,
-                               X509_OBJECT *ret)
-{
-    if ((ctx->method == NULL) || (ctx->method->get_by_fingerprint == NULL))
-        return 0;
-    return ctx->method->get_by_fingerprint(ctx, type, bytes, len, ret) > 0;
-}
-
-int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len,
-                         X509_OBJECT *ret)
-{
-    if ((ctx->method == NULL) || (ctx->method->get_by_alias == NULL))
-        return 0;
-    return ctx->method->get_by_alias(ctx, type, str, len, ret) > 0;
-}
-
-static int x509_object_cmp(const X509_OBJECT **a, const X509_OBJECT **b)
-{
-    int ret;
-
-    ret = ((*a)->type - (*b)->type);
-    if (ret)
-        return ret;
-    switch ((*a)->type) {
+  ret = ((*a)->type - (*b)->type);
+  if (ret) {
+    return ret;
+  }
+  switch ((*a)->type) {
     case X509_LU_X509:
-        ret = X509_subject_name_cmp((*a)->data.x509, (*b)->data.x509);
-        break;
+      ret = X509_subject_name_cmp((*a)->data.x509, (*b)->data.x509);
+      break;
     case X509_LU_CRL:
-        ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl);
-        break;
+      ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl);
+      break;
     default:
-        /* abort(); */
-        return 0;
-    }
-    return ret;
+      // abort();
+      return 0;
+  }
+  return ret;
 }
 
-X509_STORE *X509_STORE_new(void)
-{
-    X509_STORE *ret;
+X509_STORE *X509_STORE_new(void) {
+  X509_STORE *ret;
 
-    if ((ret = (X509_STORE *)OPENSSL_malloc(sizeof(X509_STORE))) == NULL)
-        return NULL;
-    OPENSSL_memset(ret, 0, sizeof(*ret));
-    CRYPTO_MUTEX_init(&ret->objs_lock);
-    ret->objs = sk_X509_OBJECT_new(x509_object_cmp);
-    if (ret->objs == NULL)
-        goto err;
-    ret->cache = 1;
-    ret->get_cert_methods = sk_X509_LOOKUP_new_null();
-    if (ret->get_cert_methods == NULL)
-        goto err;
-    ret->param = X509_VERIFY_PARAM_new();
-    if (ret->param == NULL)
-        goto err;
-
-    ret->references = 1;
-    return ret;
- err:
-    if (ret) {
-        CRYPTO_MUTEX_cleanup(&ret->objs_lock);
-        if (ret->param)
-            X509_VERIFY_PARAM_free(ret->param);
-        if (ret->get_cert_methods)
-            sk_X509_LOOKUP_free(ret->get_cert_methods);
-        if (ret->objs)
-            sk_X509_OBJECT_free(ret->objs);
-        OPENSSL_free(ret);
-    }
+  if ((ret = (X509_STORE *)OPENSSL_malloc(sizeof(X509_STORE))) == NULL) {
     return NULL;
-}
+  }
+  OPENSSL_memset(ret, 0, sizeof(*ret));
+  CRYPTO_MUTEX_init(&ret->objs_lock);
+  ret->objs = sk_X509_OBJECT_new(x509_object_cmp);
+  if (ret->objs == NULL) {
+    goto err;
+  }
+  ret->cache = 1;
+  ret->get_cert_methods = sk_X509_LOOKUP_new_null();
+  if (ret->get_cert_methods == NULL) {
+    goto err;
+  }
+  ret->param = X509_VERIFY_PARAM_new();
+  if (ret->param == NULL) {
+    goto err;
+  }
 
-int X509_STORE_up_ref(X509_STORE *store)
-{
-    CRYPTO_refcount_inc(&store->references);
-    return 1;
-}
-
-static void cleanup(X509_OBJECT *a)
-{
-    if (a == NULL) {
-        return;
+  ret->references = 1;
+  return ret;
+err:
+  if (ret) {
+    CRYPTO_MUTEX_cleanup(&ret->objs_lock);
+    if (ret->param) {
+      X509_VERIFY_PARAM_free(ret->param);
     }
-    if (a->type == X509_LU_X509) {
-        X509_free(a->data.x509);
-    } else if (a->type == X509_LU_CRL) {
-        X509_CRL_free(a->data.crl);
+    if (ret->get_cert_methods) {
+      sk_X509_LOOKUP_free(ret->get_cert_methods);
+    }
+    if (ret->objs) {
+      sk_X509_OBJECT_free(ret->objs);
+    }
+    OPENSSL_free(ret);
+  }
+  return NULL;
+}
+
+int X509_STORE_up_ref(X509_STORE *store) {
+  CRYPTO_refcount_inc(&store->references);
+  return 1;
+}
+
+static void cleanup(X509_OBJECT *a) {
+  if (a == NULL) {
+    return;
+  }
+  if (a->type == X509_LU_X509) {
+    X509_free(a->data.x509);
+  } else if (a->type == X509_LU_CRL) {
+    X509_CRL_free(a->data.crl);
+  } else {
+    // abort();
+  }
+
+  OPENSSL_free(a);
+}
+
+void X509_STORE_free(X509_STORE *vfy) {
+  size_t j;
+  STACK_OF(X509_LOOKUP) *sk;
+  X509_LOOKUP *lu;
+
+  if (vfy == NULL) {
+    return;
+  }
+
+  if (!CRYPTO_refcount_dec_and_test_zero(&vfy->references)) {
+    return;
+  }
+
+  CRYPTO_MUTEX_cleanup(&vfy->objs_lock);
+
+  sk = vfy->get_cert_methods;
+  for (j = 0; j < sk_X509_LOOKUP_num(sk); j++) {
+    lu = sk_X509_LOOKUP_value(sk, j);
+    X509_LOOKUP_shutdown(lu);
+    X509_LOOKUP_free(lu);
+  }
+  sk_X509_LOOKUP_free(sk);
+  sk_X509_OBJECT_pop_free(vfy->objs, cleanup);
+
+  if (vfy->param) {
+    X509_VERIFY_PARAM_free(vfy->param);
+  }
+  OPENSSL_free(vfy);
+}
+
+X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) {
+  size_t i;
+  STACK_OF(X509_LOOKUP) *sk;
+  X509_LOOKUP *lu;
+
+  sk = v->get_cert_methods;
+  for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
+    lu = sk_X509_LOOKUP_value(sk, i);
+    if (m == lu->method) {
+      return lu;
+    }
+  }
+  // a new one
+  lu = X509_LOOKUP_new(m);
+  if (lu == NULL) {
+    return NULL;
+  } else {
+    lu->store_ctx = v;
+    if (sk_X509_LOOKUP_push(v->get_cert_methods, lu)) {
+      return lu;
     } else {
-        /* abort(); */
+      X509_LOOKUP_free(lu);
+      return NULL;
     }
-
-    OPENSSL_free(a);
-}
-
-void X509_STORE_free(X509_STORE *vfy)
-{
-    size_t j;
-    STACK_OF(X509_LOOKUP) *sk;
-    X509_LOOKUP *lu;
-
-    if (vfy == NULL)
-        return;
-
-    if (!CRYPTO_refcount_dec_and_test_zero(&vfy->references)) {
-        return;
-    }
-
-    CRYPTO_MUTEX_cleanup(&vfy->objs_lock);
-
-    sk = vfy->get_cert_methods;
-    for (j = 0; j < sk_X509_LOOKUP_num(sk); j++) {
-        lu = sk_X509_LOOKUP_value(sk, j);
-        X509_LOOKUP_shutdown(lu);
-        X509_LOOKUP_free(lu);
-    }
-    sk_X509_LOOKUP_free(sk);
-    sk_X509_OBJECT_pop_free(vfy->objs, cleanup);
-
-    if (vfy->param)
-        X509_VERIFY_PARAM_free(vfy->param);
-    OPENSSL_free(vfy);
-}
-
-X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m)
-{
-    size_t i;
-    STACK_OF(X509_LOOKUP) *sk;
-    X509_LOOKUP *lu;
-
-    sk = v->get_cert_methods;
-    for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
-        lu = sk_X509_LOOKUP_value(sk, i);
-        if (m == lu->method) {
-            return lu;
-        }
-    }
-    /* a new one */
-    lu = X509_LOOKUP_new(m);
-    if (lu == NULL)
-        return NULL;
-    else {
-        lu->store_ctx = v;
-        if (sk_X509_LOOKUP_push(v->get_cert_methods, lu))
-            return lu;
-        else {
-            X509_LOOKUP_free(lu);
-            return NULL;
-        }
-    }
+  }
 }
 
 int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name,
-                              X509_OBJECT *ret)
-{
-    X509_STORE *ctx = vs->ctx;
-    X509_LOOKUP *lu;
-    X509_OBJECT stmp, *tmp;
-    int i;
+                              X509_OBJECT *ret) {
+  X509_STORE *ctx = vs->ctx;
+  X509_LOOKUP *lu;
+  X509_OBJECT stmp, *tmp;
+  int i;
 
-    CRYPTO_MUTEX_lock_write(&ctx->objs_lock);
-    tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name);
-    CRYPTO_MUTEX_unlock_write(&ctx->objs_lock);
+  CRYPTO_MUTEX_lock_write(&ctx->objs_lock);
+  tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name);
+  CRYPTO_MUTEX_unlock_write(&ctx->objs_lock);
 
-    if (tmp == NULL || type == X509_LU_CRL) {
-        for (i = 0; i < (int)sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
-            lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i);
-            if (X509_LOOKUP_by_subject(lu, type, name, &stmp)) {
-                tmp = &stmp;
-                break;
-            }
-        }
-        if (tmp == NULL)
-            return 0;
+  if (tmp == NULL || type == X509_LU_CRL) {
+    for (i = 0; i < (int)sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
+      lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i);
+      if (X509_LOOKUP_by_subject(lu, type, name, &stmp)) {
+        tmp = &stmp;
+        break;
+      }
     }
+    if (tmp == NULL) {
+      return 0;
+    }
+  }
 
-    /*
-     * if (ret->data.ptr != NULL) X509_OBJECT_free_contents(ret);
-     */
+  // if (ret->data.ptr != NULL) X509_OBJECT_free_contents(ret);
 
-    ret->type = tmp->type;
-    ret->data.ptr = tmp->data.ptr;
+  ret->type = tmp->type;
+  ret->data.ptr = tmp->data.ptr;
 
-    X509_OBJECT_up_ref_count(ret);
+  X509_OBJECT_up_ref_count(ret);
 
-    return 1;
+  return 1;
 }
 
-int X509_STORE_add_cert(X509_STORE *ctx, X509 *x)
-{
-    X509_OBJECT *obj;
-    int ret = 1;
+static int x509_store_add(X509_STORE *ctx, void *x, int is_crl) {
+  if (x == NULL) {
+    return 0;
+  }
 
-    if (x == NULL)
-        return 0;
-    obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT));
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
-    obj->type = X509_LU_X509;
-    obj->data.x509 = x;
+  X509_OBJECT *const obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT));
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
 
-    CRYPTO_MUTEX_lock_write(&ctx->objs_lock);
-
-    X509_OBJECT_up_ref_count(obj);
-
-    if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
-        X509_OBJECT_free_contents(obj);
-        OPENSSL_free(obj);
-        OPENSSL_PUT_ERROR(X509, X509_R_CERT_ALREADY_IN_HASH_TABLE);
-        ret = 0;
-    } else if (!sk_X509_OBJECT_push(ctx->objs, obj)) {
-        X509_OBJECT_free_contents(obj);
-        OPENSSL_free(obj);
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        ret = 0;
-    }
-
-    CRYPTO_MUTEX_unlock_write(&ctx->objs_lock);
-
-    return ret;
-}
-
-int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x)
-{
-    X509_OBJECT *obj;
-    int ret = 1;
-
-    if (x == NULL)
-        return 0;
-    obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT));
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
+  if (is_crl) {
     obj->type = X509_LU_CRL;
-    obj->data.crl = x;
+    obj->data.crl = (X509_CRL *)x;
+  } else {
+    obj->type = X509_LU_X509;
+    obj->data.x509 = (X509 *)x;
+  }
+  X509_OBJECT_up_ref_count(obj);
 
-    CRYPTO_MUTEX_lock_write(&ctx->objs_lock);
+  CRYPTO_MUTEX_lock_write(&ctx->objs_lock);
 
-    X509_OBJECT_up_ref_count(obj);
+  int ret = 1;
+  int added = 0;
+  // Duplicates are silently ignored
+  if (!X509_OBJECT_retrieve_match(ctx->objs, obj)) {
+    ret = added = (sk_X509_OBJECT_push(ctx->objs, obj) != 0);
+  }
 
-    if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
-        X509_OBJECT_free_contents(obj);
-        OPENSSL_free(obj);
-        OPENSSL_PUT_ERROR(X509, X509_R_CERT_ALREADY_IN_HASH_TABLE);
-        ret = 0;
-    } else if (!sk_X509_OBJECT_push(ctx->objs, obj)) {
-        X509_OBJECT_free_contents(obj);
-        OPENSSL_free(obj);
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        ret = 0;
-    }
+  CRYPTO_MUTEX_unlock_write(&ctx->objs_lock);
 
-    CRYPTO_MUTEX_unlock_write(&ctx->objs_lock);
+  if (!added) {
+    X509_OBJECT_free_contents(obj);
+    OPENSSL_free(obj);
+  }
 
-    return ret;
+  return ret;
 }
 
-int X509_OBJECT_up_ref_count(X509_OBJECT *a)
-{
-    switch (a->type) {
+int X509_STORE_add_cert(X509_STORE *ctx, X509 *x) {
+  return x509_store_add(ctx, x, /*is_crl=*/0);
+}
+
+int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) {
+  return x509_store_add(ctx, x, /*is_crl=*/1);
+}
+
+int X509_OBJECT_up_ref_count(X509_OBJECT *a) {
+  switch (a->type) {
     case X509_LU_X509:
-        X509_up_ref(a->data.x509);
-        break;
+      X509_up_ref(a->data.x509);
+      break;
     case X509_LU_CRL:
-        X509_CRL_up_ref(a->data.crl);
-        break;
-    }
-    return 1;
+      X509_CRL_up_ref(a->data.crl);
+      break;
+  }
+  return 1;
 }
 
-void X509_OBJECT_free_contents(X509_OBJECT *a)
-{
-    switch (a->type) {
+void X509_OBJECT_free_contents(X509_OBJECT *a) {
+  switch (a->type) {
     case X509_LU_X509:
-        X509_free(a->data.x509);
-        break;
+      X509_free(a->data.x509);
+      break;
     case X509_LU_CRL:
-        X509_CRL_free(a->data.crl);
-        break;
-    }
+      X509_CRL_free(a->data.crl);
+      break;
+  }
 }
 
-int X509_OBJECT_get_type(const X509_OBJECT *a)
-{
-    return a->type;
-}
+int X509_OBJECT_get_type(const X509_OBJECT *a) { return a->type; }
 
-X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a)
-{
-    if (a == NULL || a->type != X509_LU_X509) {
-        return NULL;
-    }
-    return a->data.x509;
+X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a) {
+  if (a == NULL || a->type != X509_LU_X509) {
+    return NULL;
+  }
+  return a->data.x509;
 }
 
 static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type,
-                               X509_NAME *name, int *pnmatch)
-{
-    X509_OBJECT stmp;
-    X509 x509_s;
-    X509_CINF cinf_s;
-    X509_CRL crl_s;
-    X509_CRL_INFO crl_info_s;
+                               X509_NAME *name, int *pnmatch) {
+  X509_OBJECT stmp;
+  X509 x509_s;
+  X509_CINF cinf_s;
+  X509_CRL crl_s;
+  X509_CRL_INFO crl_info_s;
 
-    stmp.type = type;
-    switch (type) {
+  stmp.type = type;
+  switch (type) {
     case X509_LU_X509:
-        stmp.data.x509 = &x509_s;
-        x509_s.cert_info = &cinf_s;
-        cinf_s.subject = name;
-        break;
+      stmp.data.x509 = &x509_s;
+      x509_s.cert_info = &cinf_s;
+      cinf_s.subject = name;
+      break;
     case X509_LU_CRL:
-        stmp.data.crl = &crl_s;
-        crl_s.crl = &crl_info_s;
-        crl_info_s.issuer = name;
-        break;
+      stmp.data.crl = &crl_s;
+      crl_s.crl = &crl_info_s;
+      crl_info_s.issuer = name;
+      break;
     default:
-        /* abort(); */
-        return -1;
+      // abort();
+      return -1;
+  }
+
+  size_t idx;
+  sk_X509_OBJECT_sort(h);
+  if (!sk_X509_OBJECT_find(h, &idx, &stmp)) {
+    return -1;
+  }
+
+  if (pnmatch != NULL) {
+    int tidx;
+    const X509_OBJECT *tobj, *pstmp;
+    *pnmatch = 1;
+    pstmp = &stmp;
+    for (tidx = idx + 1; tidx < (int)sk_X509_OBJECT_num(h); tidx++) {
+      tobj = sk_X509_OBJECT_value(h, tidx);
+      if (x509_object_cmp(&tobj, &pstmp)) {
+        break;
+      }
+      (*pnmatch)++;
     }
+  }
 
-    size_t idx;
-    sk_X509_OBJECT_sort(h);
-    if (!sk_X509_OBJECT_find(h, &idx, &stmp))
-        return -1;
-
-    if (pnmatch != NULL) {
-        int tidx;
-        const X509_OBJECT *tobj, *pstmp;
-        *pnmatch = 1;
-        pstmp = &stmp;
-        for (tidx = idx + 1; tidx < (int)sk_X509_OBJECT_num(h); tidx++) {
-            tobj = sk_X509_OBJECT_value(h, tidx);
-            if (x509_object_cmp(&tobj, &pstmp))
-                break;
-            (*pnmatch)++;
-        }
-    }
-
-    return idx;
+  return idx;
 }
 
 int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
-                               X509_NAME *name)
-{
-    return x509_object_idx_cnt(h, type, name, NULL);
+                               X509_NAME *name) {
+  return x509_object_idx_cnt(h, type, name, NULL);
 }
 
-X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,
-                                             int type, X509_NAME *name)
-{
-    int idx;
-    idx = X509_OBJECT_idx_by_subject(h, type, name);
-    if (idx == -1)
-        return NULL;
-    return sk_X509_OBJECT_value(h, idx);
+X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, int type,
+                                             X509_NAME *name) {
+  int idx;
+  idx = X509_OBJECT_idx_by_subject(h, type, name);
+  if (idx == -1) {
+    return NULL;
+  }
+  return sk_X509_OBJECT_value(h, idx);
 }
 
-STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *st)
-{
-    return st->objs;
+STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *st) {
+  return st->objs;
 }
 
-STACK_OF (X509) * X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm)
-{
-    int i, idx, cnt;
-    STACK_OF(X509) *sk;
-    X509 *x;
-    X509_OBJECT *obj;
-    sk = sk_X509_new_null();
-    if (sk == NULL)
-        return NULL;
-    CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
-    idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
-    if (idx < 0) {
-        /*
-         * Nothing found in cache: do lookup to possibly add new objects to
-         * cache
-         */
-        X509_OBJECT xobj;
-        CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-        if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) {
-            sk_X509_free(sk);
-            return NULL;
-        }
-        X509_OBJECT_free_contents(&xobj);
-        CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
-        idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
-        if (idx < 0) {
-            CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-            sk_X509_free(sk);
-            return NULL;
-        }
-    }
-    for (i = 0; i < cnt; i++, idx++) {
-        obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
-        x = obj->data.x509;
-        if (!sk_X509_push(sk, x)) {
-            CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-            sk_X509_pop_free(sk, X509_free);
-            return NULL;
-        }
-        X509_up_ref(x);
-    }
+STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) {
+  int i, idx, cnt;
+  STACK_OF(X509) *sk;
+  X509 *x;
+  X509_OBJECT *obj;
+  sk = sk_X509_new_null();
+  if (sk == NULL) {
+    return NULL;
+  }
+  CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
+  idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
+  if (idx < 0) {
+    // Nothing found in cache: do lookup to possibly add new objects to
+    // cache
+    X509_OBJECT xobj;
     CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-    return sk;
-
-}
-
-STACK_OF (X509_CRL) * X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
-{
-    int i, idx, cnt;
-    STACK_OF(X509_CRL) *sk;
-    X509_CRL *x;
-    X509_OBJECT *obj, xobj;
-    sk = sk_X509_CRL_new_null();
-    if (sk == NULL)
-        return NULL;
-
-    /* Always do lookup to possibly add new CRLs to cache. */
-    if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) {
-        sk_X509_CRL_free(sk);
-        return NULL;
+    if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) {
+      sk_X509_free(sk);
+      return NULL;
     }
     X509_OBJECT_free_contents(&xobj);
     CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
-    idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
+    idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
     if (idx < 0) {
-        CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-        sk_X509_CRL_free(sk);
-        return NULL;
+      CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+      sk_X509_free(sk);
+      return NULL;
     }
+  }
+  for (i = 0; i < cnt; i++, idx++) {
+    obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
+    x = obj->data.x509;
+    if (!sk_X509_push(sk, x)) {
+      CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+      sk_X509_pop_free(sk, X509_free);
+      return NULL;
+    }
+    X509_up_ref(x);
+  }
+  CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+  return sk;
+}
 
-    for (i = 0; i < cnt; i++, idx++) {
-        obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
-        x = obj->data.crl;
-        X509_CRL_up_ref(x);
-        if (!sk_X509_CRL_push(sk, x)) {
-            CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-            X509_CRL_free(x);
-            sk_X509_CRL_pop_free(sk, X509_CRL_free);
-            return NULL;
-        }
-    }
+STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm) {
+  int i, idx, cnt;
+  STACK_OF(X509_CRL) *sk;
+  X509_CRL *x;
+  X509_OBJECT *obj, xobj;
+  sk = sk_X509_CRL_new_null();
+  if (sk == NULL) {
+    return NULL;
+  }
+
+  // Always do lookup to possibly add new CRLs to cache.
+  if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) {
+    sk_X509_CRL_free(sk);
+    return NULL;
+  }
+  X509_OBJECT_free_contents(&xobj);
+  CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
+  idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
+  if (idx < 0) {
     CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-    return sk;
+    sk_X509_CRL_free(sk);
+    return NULL;
+  }
+
+  for (i = 0; i < cnt; i++, idx++) {
+    obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
+    x = obj->data.crl;
+    X509_CRL_up_ref(x);
+    if (!sk_X509_CRL_push(sk, x)) {
+      CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+      X509_CRL_free(x);
+      sk_X509_CRL_pop_free(sk, X509_CRL_free);
+      return NULL;
+    }
+  }
+  CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+  return sk;
 }
 
 X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h,
-                                        X509_OBJECT *x)
-{
-    size_t idx, i;
-    X509_OBJECT *obj;
+                                        X509_OBJECT *x) {
+  size_t idx, i;
+  X509_OBJECT *obj;
 
-    sk_X509_OBJECT_sort(h);
-    if (!sk_X509_OBJECT_find(h, &idx, x)) {
-        return NULL;
-    }
-    if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL))
-        return sk_X509_OBJECT_value(h, idx);
-    for (i = idx; i < sk_X509_OBJECT_num(h); i++) {
-        obj = sk_X509_OBJECT_value(h, i);
-        if (x509_object_cmp
-            ((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x))
-            return NULL;
-        if (x->type == X509_LU_X509) {
-            if (!X509_cmp(obj->data.x509, x->data.x509))
-                return obj;
-        } else if (x->type == X509_LU_CRL) {
-            if (!X509_CRL_match(obj->data.crl, x->data.crl))
-                return obj;
-        } else
-            return obj;
-    }
+  sk_X509_OBJECT_sort(h);
+  if (!sk_X509_OBJECT_find(h, &idx, x)) {
     return NULL;
-}
-
-/*
- * Try to get issuer certificate from store. Due to limitations of the API
- * this can only retrieve a single certificate matching a given subject name.
- * However it will fill the cache with all matching certificates, so we can
- * examine the cache for all matches. Return values are: 1 lookup
- * successful.  0 certificate not found. -1 some other error.
- */
-int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
-{
-    X509_NAME *xn;
-    X509_OBJECT obj, *pobj;
-    int idx, ret;
-    size_t i;
-    xn = X509_get_issuer_name(x);
-    if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, xn, &obj))
-        return 0;
-    /* If certificate matches all OK */
-    if (ctx->check_issued(ctx, x, obj.data.x509)) {
-        *issuer = obj.data.x509;
-        return 1;
+  }
+  if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL)) {
+    return sk_X509_OBJECT_value(h, idx);
+  }
+  for (i = idx; i < sk_X509_OBJECT_num(h); i++) {
+    obj = sk_X509_OBJECT_value(h, i);
+    if (x509_object_cmp((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x)) {
+      return NULL;
     }
-    X509_OBJECT_free_contents(&obj);
-
-    /* Else find index of first cert accepted by 'check_issued' */
-    ret = 0;
-    CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
-    idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn);
-    if (idx != -1) {            /* should be true as we've had at least one
-                                 * match */
-        /* Look through all matching certs for suitable issuer */
-        for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) {
-            pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i);
-            /* See if we've run past the matches */
-            if (pobj->type != X509_LU_X509)
-                break;
-            if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509)))
-                break;
-            if (ctx->check_issued(ctx, x, pobj->data.x509)) {
-                *issuer = pobj->data.x509;
-                X509_OBJECT_up_ref_count(pobj);
-                ret = 1;
-                break;
-            }
-        }
+    if (x->type == X509_LU_X509) {
+      if (!X509_cmp(obj->data.x509, x->data.x509)) {
+        return obj;
+      }
+    } else if (x->type == X509_LU_CRL) {
+      if (!X509_CRL_match(obj->data.crl, x->data.crl)) {
+        return obj;
+      }
+    } else {
+      return obj;
     }
-    CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
-    return ret;
+  }
+  return NULL;
 }
 
-int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags)
-{
-    return X509_VERIFY_PARAM_set_flags(ctx->param, flags);
-}
-
-int X509_STORE_set_depth(X509_STORE *ctx, int depth)
-{
-    X509_VERIFY_PARAM_set_depth(ctx->param, depth);
+// Try to get issuer certificate from store. Due to limitations of the API
+// this can only retrieve a single certificate matching a given subject name.
+// However it will fill the cache with all matching certificates, so we can
+// examine the cache for all matches. Return values are: 1 lookup
+// successful.  0 certificate not found. -1 some other error.
+int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) {
+  X509_NAME *xn;
+  X509_OBJECT obj, *pobj;
+  int idx, ret;
+  size_t i;
+  xn = X509_get_issuer_name(x);
+  if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, xn, &obj)) {
+    return 0;
+  }
+  // If certificate matches all OK
+  if (ctx->check_issued(ctx, x, obj.data.x509)) {
+    *issuer = obj.data.x509;
     return 1;
+  }
+  X509_OBJECT_free_contents(&obj);
+
+  // Else find index of first cert accepted by 'check_issued'
+  ret = 0;
+  CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
+  idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn);
+  if (idx != -1) {  // should be true as we've had at least one
+                    // match
+    // Look through all matching certs for suitable issuer
+    for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) {
+      pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i);
+      // See if we've run past the matches
+      if (pobj->type != X509_LU_X509) {
+        break;
+      }
+      if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509))) {
+        break;
+      }
+      if (ctx->check_issued(ctx, x, pobj->data.x509)) {
+        *issuer = pobj->data.x509;
+        X509_OBJECT_up_ref_count(pobj);
+        ret = 1;
+        break;
+      }
+    }
+  }
+  CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
+  return ret;
 }
 
-int X509_STORE_set_purpose(X509_STORE *ctx, int purpose)
-{
-    return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose);
+int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) {
+  return X509_VERIFY_PARAM_set_flags(ctx->param, flags);
 }
 
-int X509_STORE_set_trust(X509_STORE *ctx, int trust)
-{
-    return X509_VERIFY_PARAM_set_trust(ctx->param, trust);
+int X509_STORE_set_depth(X509_STORE *ctx, int depth) {
+  X509_VERIFY_PARAM_set_depth(ctx->param, depth);
+  return 1;
 }
 
-int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param)
-{
-    return X509_VERIFY_PARAM_set1(ctx->param, param);
+int X509_STORE_set_purpose(X509_STORE *ctx, int purpose) {
+  return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose);
 }
 
-X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx)
-{
-    return ctx->param;
+int X509_STORE_set_trust(X509_STORE *ctx, int trust) {
+  return X509_VERIFY_PARAM_set_trust(ctx->param, trust);
 }
 
-void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify)
-{
-    ctx->verify = verify;
+int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param) {
+  return X509_VERIFY_PARAM_set1(ctx->param, param);
 }
 
-X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx)
-{
-    return ctx->verify;
+X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx) { return ctx->param; }
+
+void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify) {
+  ctx->verify = verify;
+}
+
+X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx) {
+  return ctx->verify;
 }
 
 void X509_STORE_set_verify_cb(X509_STORE *ctx,
-                              X509_STORE_CTX_verify_cb verify_cb)
-{
-    ctx->verify_cb = verify_cb;
+                              X509_STORE_CTX_verify_cb verify_cb) {
+  ctx->verify_cb = verify_cb;
 }
 
-X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx)
-{
-    return ctx->verify_cb;
+X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx) {
+  return ctx->verify_cb;
 }
 
 void X509_STORE_set_get_issuer(X509_STORE *ctx,
-                               X509_STORE_CTX_get_issuer_fn get_issuer)
-{
-    ctx->get_issuer = get_issuer;
+                               X509_STORE_CTX_get_issuer_fn get_issuer) {
+  ctx->get_issuer = get_issuer;
 }
 
-X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx)
-{
-    return ctx->get_issuer;
+X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx) {
+  return ctx->get_issuer;
 }
 
 void X509_STORE_set_check_issued(X509_STORE *ctx,
-                                 X509_STORE_CTX_check_issued_fn check_issued)
-{
-    ctx->check_issued = check_issued;
+                                 X509_STORE_CTX_check_issued_fn check_issued) {
+  ctx->check_issued = check_issued;
 }
 
-X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx)
-{
-    return ctx->check_issued;
+X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx) {
+  return ctx->check_issued;
 }
 
-void X509_STORE_set_check_revocation(X509_STORE *ctx,
-                                     X509_STORE_CTX_check_revocation_fn check_revocation)
-{
-    ctx->check_revocation = check_revocation;
+void X509_STORE_set_check_revocation(
+    X509_STORE *ctx, X509_STORE_CTX_check_revocation_fn check_revocation) {
+  ctx->check_revocation = check_revocation;
 }
 
-X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(X509_STORE *ctx)
-{
-    return ctx->check_revocation;
+X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(
+    X509_STORE *ctx) {
+  return ctx->check_revocation;
 }
 
 void X509_STORE_set_get_crl(X509_STORE *ctx,
-                            X509_STORE_CTX_get_crl_fn get_crl)
-{
-    ctx->get_crl = get_crl;
+                            X509_STORE_CTX_get_crl_fn get_crl) {
+  ctx->get_crl = get_crl;
 }
 
-X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx)
-{
-    return ctx->get_crl;
+X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx) {
+  return ctx->get_crl;
 }
 
 void X509_STORE_set_check_crl(X509_STORE *ctx,
-                              X509_STORE_CTX_check_crl_fn check_crl)
-{
-    ctx->check_crl = check_crl;
+                              X509_STORE_CTX_check_crl_fn check_crl) {
+  ctx->check_crl = check_crl;
 }
 
-X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx)
-{
-    return ctx->check_crl;
+X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx) {
+  return ctx->check_crl;
 }
 
 void X509_STORE_set_cert_crl(X509_STORE *ctx,
-                             X509_STORE_CTX_cert_crl_fn cert_crl)
-{
-    ctx->cert_crl = cert_crl;
+                             X509_STORE_CTX_cert_crl_fn cert_crl) {
+  ctx->cert_crl = cert_crl;
 }
 
-X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx)
-{
-    return ctx->cert_crl;
+X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx) {
+  return ctx->cert_crl;
 }
 
 void X509_STORE_set_lookup_certs(X509_STORE *ctx,
-                                 X509_STORE_CTX_lookup_certs_fn lookup_certs)
-{
-    ctx->lookup_certs = lookup_certs;
+                                 X509_STORE_CTX_lookup_certs_fn lookup_certs) {
+  ctx->lookup_certs = lookup_certs;
 }
 
-X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx)
-{
-    return ctx->lookup_certs;
+X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx) {
+  return ctx->lookup_certs;
 }
 
 void X509_STORE_set_lookup_crls(X509_STORE *ctx,
-                                X509_STORE_CTX_lookup_crls_fn lookup_crls)
-{
-    ctx->lookup_crls = lookup_crls;
+                                X509_STORE_CTX_lookup_crls_fn lookup_crls) {
+  ctx->lookup_crls = lookup_crls;
 }
 
-X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx)
-{
-    return ctx->lookup_crls;
+X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx) {
+  return ctx->lookup_crls;
 }
 
 void X509_STORE_set_cleanup(X509_STORE *ctx,
-                            X509_STORE_CTX_cleanup_fn ctx_cleanup)
-{
-    ctx->cleanup = ctx_cleanup;
+                            X509_STORE_CTX_cleanup_fn ctx_cleanup) {
+  ctx->cleanup = ctx_cleanup;
 }
 
-X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx)
-{
-    return ctx->cleanup;
+X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx) {
+  return ctx->cleanup;
 }
 
-X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx)
-{
-    return ctx->ctx;
-}
+X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx) { return ctx->ctx; }
diff --git a/src/crypto/x509/x509_obj.c b/src/crypto/x509/x509_obj.c
index df54f77..d247314 100644
--- a/src/crypto/x509/x509_obj.c
+++ b/src/crypto/x509/x509_obj.c
@@ -67,133 +67,143 @@
 #include "internal.h"
 
 
-/*
- * Limit to ensure we don't overflow: much greater than
- * anything enountered in practice.
- */
+// Limit to ensure we don't overflow: much greater than
+// anything enountered in practice.
 
-#define NAME_ONELINE_MAX    (1024 * 1024)
+#define NAME_ONELINE_MAX (1024 * 1024)
 
-char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len)
-{
-    X509_NAME_ENTRY *ne;
-    size_t i;
-    int n, lold, l, l1, l2, num, j, type;
-    const char *s;
-    char *p;
-    unsigned char *q;
-    BUF_MEM *b = NULL;
-    static const char hex[17] = "0123456789ABCDEF";
-    int gs_doit[4];
-    char tmp_buf[80];
+char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) {
+  X509_NAME_ENTRY *ne;
+  size_t i;
+  int n, lold, l, l1, l2, num, j, type;
+  const char *s;
+  char *p;
+  unsigned char *q;
+  BUF_MEM *b = NULL;
+  static const char hex[17] = "0123456789ABCDEF";
+  int gs_doit[4];
+  char tmp_buf[80];
 
-    if (buf == NULL) {
-        if ((b = BUF_MEM_new()) == NULL)
-            goto err;
-        if (!BUF_MEM_grow(b, 200))
-            goto err;
-        b->data[0] = '\0';
-        len = 200;
-    } else if (len <= 0) {
-        return NULL;
+  if (buf == NULL) {
+    if ((b = BUF_MEM_new()) == NULL) {
+      goto err;
     }
-    if (a == NULL) {
-        if (b) {
-            buf = b->data;
-            OPENSSL_free(b);
+    if (!BUF_MEM_grow(b, 200)) {
+      goto err;
+    }
+    b->data[0] = '\0';
+    len = 200;
+  } else if (len <= 0) {
+    return NULL;
+  }
+  if (a == NULL) {
+    if (b) {
+      buf = b->data;
+      OPENSSL_free(b);
+    }
+    OPENSSL_strlcpy(buf, "NO X509_NAME", len);
+    return buf;
+  }
+
+  len--;  // space for '\0'
+  l = 0;
+  for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
+    ne = sk_X509_NAME_ENTRY_value(a->entries, i);
+    n = OBJ_obj2nid(ne->object);
+    if ((n == NID_undef) || ((s = OBJ_nid2sn(n)) == NULL)) {
+      i2t_ASN1_OBJECT(tmp_buf, sizeof(tmp_buf), ne->object);
+      s = tmp_buf;
+    }
+    l1 = strlen(s);
+
+    type = ne->value->type;
+    num = ne->value->length;
+    if (num > NAME_ONELINE_MAX) {
+      OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG);
+      goto end;
+    }
+    q = ne->value->data;
+
+    if ((type == V_ASN1_GENERALSTRING) && ((num % 4) == 0)) {
+      gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 0;
+      for (j = 0; j < num; j++) {
+        if (q[j] != 0) {
+          gs_doit[j & 3] = 1;
         }
-        OPENSSL_strlcpy(buf, "NO X509_NAME", len);
-        return buf;
+      }
+
+      if (gs_doit[0] | gs_doit[1] | gs_doit[2]) {
+        gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
+      } else {
+        gs_doit[0] = gs_doit[1] = gs_doit[2] = 0;
+        gs_doit[3] = 1;
+      }
+    } else {
+      gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
     }
 
-    len--;                      /* space for '\0' */
-    l = 0;
-    for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
-        ne = sk_X509_NAME_ENTRY_value(a->entries, i);
-        n = OBJ_obj2nid(ne->object);
-        if ((n == NID_undef) || ((s = OBJ_nid2sn(n)) == NULL)) {
-            i2t_ASN1_OBJECT(tmp_buf, sizeof(tmp_buf), ne->object);
-            s = tmp_buf;
-        }
-        l1 = strlen(s);
+    for (l2 = j = 0; j < num; j++) {
+      if (!gs_doit[j & 3]) {
+        continue;
+      }
+      l2++;
+      if ((q[j] < ' ') || (q[j] > '~')) {
+        l2 += 3;
+      }
+    }
 
-        type = ne->value->type;
-        num = ne->value->length;
-        if (num > NAME_ONELINE_MAX) {
-            OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG);
-            goto end;
-        }
-        q = ne->value->data;
-
-        if ((type == V_ASN1_GENERALSTRING) && ((num % 4) == 0)) {
-            gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 0;
-            for (j = 0; j < num; j++)
-                if (q[j] != 0)
-                    gs_doit[j & 3] = 1;
-
-            if (gs_doit[0] | gs_doit[1] | gs_doit[2])
-                gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
-            else {
-                gs_doit[0] = gs_doit[1] = gs_doit[2] = 0;
-                gs_doit[3] = 1;
-            }
-        } else
-            gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
-
-        for (l2 = j = 0; j < num; j++) {
-            if (!gs_doit[j & 3])
-                continue;
-            l2++;
-            if ((q[j] < ' ') || (q[j] > '~'))
-                l2 += 3;
-        }
-
-        lold = l;
-        l += 1 + l1 + 1 + l2;
-        if (l > NAME_ONELINE_MAX) {
-            OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG);
-            goto end;
-        }
-        if (b != NULL) {
-            if (!BUF_MEM_grow(b, l + 1))
-                goto err;
-            p = &(b->data[lold]);
-        } else if (l > len) {
-            break;
-        } else
-            p = &(buf[lold]);
-        *(p++) = '/';
-        OPENSSL_memcpy(p, s, (unsigned int)l1);
-        p += l1;
-        *(p++) = '=';
-
-        q = ne->value->data;
-
-        for (j = 0; j < num; j++) {
-            if (!gs_doit[j & 3])
-                continue;
-            n = q[j];
-            if ((n < ' ') || (n > '~')) {
-                *(p++) = '\\';
-                *(p++) = 'x';
-                *(p++) = hex[(n >> 4) & 0x0f];
-                *(p++) = hex[n & 0x0f];
-            } else
-                *(p++) = n;
-        }
-        *p = '\0';
+    lold = l;
+    l += 1 + l1 + 1 + l2;
+    if (l > NAME_ONELINE_MAX) {
+      OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG);
+      goto end;
     }
     if (b != NULL) {
-        p = b->data;
-        OPENSSL_free(b);
-    } else
-        p = buf;
-    if (i == 0)
-        *p = '\0';
-    return (p);
- err:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
- end:
-    BUF_MEM_free(b);
-    return (NULL);
+      if (!BUF_MEM_grow(b, l + 1)) {
+        goto err;
+      }
+      p = &(b->data[lold]);
+    } else if (l > len) {
+      break;
+    } else {
+      p = &(buf[lold]);
+    }
+    *(p++) = '/';
+    OPENSSL_memcpy(p, s, (unsigned int)l1);
+    p += l1;
+    *(p++) = '=';
+
+    q = ne->value->data;
+
+    for (j = 0; j < num; j++) {
+      if (!gs_doit[j & 3]) {
+        continue;
+      }
+      n = q[j];
+      if ((n < ' ') || (n > '~')) {
+        *(p++) = '\\';
+        *(p++) = 'x';
+        *(p++) = hex[(n >> 4) & 0x0f];
+        *(p++) = hex[n & 0x0f];
+      } else {
+        *(p++) = n;
+      }
+    }
+    *p = '\0';
+  }
+  if (b != NULL) {
+    p = b->data;
+    OPENSSL_free(b);
+  } else {
+    p = buf;
+  }
+  if (i == 0) {
+    *p = '\0';
+  }
+  return p;
+err:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+end:
+  BUF_MEM_free(b);
+  return NULL;
 }
diff --git a/src/crypto/x509/x509_req.c b/src/crypto/x509/x509_req.c
index 99eabfe..6cd250d 100644
--- a/src/crypto/x509/x509_req.c
+++ b/src/crypto/x509/x509_req.c
@@ -68,237 +68,176 @@
 #include "internal.h"
 
 
-X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
-{
-    X509_REQ *ret;
-    X509_REQ_INFO *ri;
-    int i;
-    EVP_PKEY *pktmp;
-
-    ret = X509_REQ_new();
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-
-    ri = ret->req_info;
-
-    ri->version->length = 1;
-    ri->version->data = (unsigned char *)OPENSSL_malloc(1);
-    if (ri->version->data == NULL)
-        goto err;
-    ri->version->data[0] = 0;   /* version == 0 */
-
-    if (!X509_REQ_set_subject_name(ret, X509_get_subject_name(x)))
-        goto err;
-
-    pktmp = X509_get_pubkey(x);
-    if (pktmp == NULL)
-        goto err;
-    i = X509_REQ_set_pubkey(ret, pktmp);
-    EVP_PKEY_free(pktmp);
-    if (!i)
-        goto err;
-
-    if (pkey != NULL) {
-        if (!X509_REQ_sign(ret, pkey, md))
-            goto err;
-    }
-    return (ret);
- err:
-    X509_REQ_free(ret);
-    return (NULL);
+long X509_REQ_get_version(const X509_REQ *req) {
+  return ASN1_INTEGER_get(req->req_info->version);
 }
 
-long X509_REQ_get_version(const X509_REQ *req)
-{
-    return ASN1_INTEGER_get(req->req_info->version);
+X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req) {
+  return req->req_info->subject;
 }
 
-X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req)
-{
-    return req->req_info->subject;
+EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req) {
+  if ((req == NULL) || (req->req_info == NULL)) {
+    return NULL;
+  }
+  return (X509_PUBKEY_get(req->req_info->pubkey));
 }
 
-EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req)
-{
-    if ((req == NULL) || (req->req_info == NULL))
-        return (NULL);
-    return (X509_PUBKEY_get(req->req_info->pubkey));
-}
+int X509_REQ_check_private_key(X509_REQ *x, EVP_PKEY *k) {
+  EVP_PKEY *xk = NULL;
+  int ok = 0;
 
-int X509_REQ_check_private_key(X509_REQ *x, EVP_PKEY *k)
-{
-    EVP_PKEY *xk = NULL;
-    int ok = 0;
-
-    xk = X509_REQ_get_pubkey(x);
-    switch (EVP_PKEY_cmp(xk, k)) {
+  xk = X509_REQ_get_pubkey(x);
+  switch (EVP_PKEY_cmp(xk, k)) {
     case 1:
-        ok = 1;
-        break;
+      ok = 1;
+      break;
     case 0:
-        OPENSSL_PUT_ERROR(X509, X509_R_KEY_VALUES_MISMATCH);
-        break;
+      OPENSSL_PUT_ERROR(X509, X509_R_KEY_VALUES_MISMATCH);
+      break;
     case -1:
-        OPENSSL_PUT_ERROR(X509, X509_R_KEY_TYPE_MISMATCH);
-        break;
+      OPENSSL_PUT_ERROR(X509, X509_R_KEY_TYPE_MISMATCH);
+      break;
     case -2:
-        if (k->type == EVP_PKEY_EC) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_EC_LIB);
-            break;
-        }
-        if (k->type == EVP_PKEY_DH) {
-            /* No idea */
-            OPENSSL_PUT_ERROR(X509, X509_R_CANT_CHECK_DH_KEY);
-            break;
-        }
-        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
-    }
+      if (k->type == EVP_PKEY_EC) {
+        OPENSSL_PUT_ERROR(X509, ERR_R_EC_LIB);
+        break;
+      }
+      if (k->type == EVP_PKEY_DH) {
+        // No idea
+        OPENSSL_PUT_ERROR(X509, X509_R_CANT_CHECK_DH_KEY);
+        break;
+      }
+      OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE);
+  }
 
-    EVP_PKEY_free(xk);
-    return (ok);
+  EVP_PKEY_free(xk);
+  return ok;
 }
 
-int X509_REQ_extension_nid(int req_nid)
-{
-    return req_nid == NID_ext_req || req_nid == NID_ms_ext_req;
+int X509_REQ_extension_nid(int req_nid) {
+  return req_nid == NID_ext_req || req_nid == NID_ms_ext_req;
 }
 
-STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req)
-{
-    if (req == NULL || req->req_info == NULL) {
-        return NULL;
-    }
+STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req) {
+  if (req == NULL || req->req_info == NULL) {
+    return NULL;
+  }
 
-    int idx = X509_REQ_get_attr_by_NID(req, NID_ext_req, -1);
-    if (idx == -1) {
-        idx = X509_REQ_get_attr_by_NID(req, NID_ms_ext_req, -1);
-    }
-    if (idx == -1) {
-        return NULL;
-    }
+  int idx = X509_REQ_get_attr_by_NID(req, NID_ext_req, -1);
+  if (idx == -1) {
+    idx = X509_REQ_get_attr_by_NID(req, NID_ms_ext_req, -1);
+  }
+  if (idx == -1) {
+    return NULL;
+  }
 
-    X509_ATTRIBUTE *attr = X509_REQ_get_attr(req, idx);
-    ASN1_TYPE *ext = X509_ATTRIBUTE_get0_type(attr, 0);
-    if (!ext || ext->type != V_ASN1_SEQUENCE) {
-        return NULL;
-    }
-    const unsigned char *p = ext->value.sequence->data;
-    return (STACK_OF(X509_EXTENSION) *)
-        ASN1_item_d2i(NULL, &p, ext->value.sequence->length,
-                      ASN1_ITEM_rptr(X509_EXTENSIONS));
+  X509_ATTRIBUTE *attr = X509_REQ_get_attr(req, idx);
+  ASN1_TYPE *ext = X509_ATTRIBUTE_get0_type(attr, 0);
+  if (!ext || ext->type != V_ASN1_SEQUENCE) {
+    return NULL;
+  }
+  const unsigned char *p = ext->value.sequence->data;
+  return (STACK_OF(X509_EXTENSION) *)ASN1_item_d2i(
+      NULL, &p, ext->value.sequence->length, ASN1_ITEM_rptr(X509_EXTENSIONS));
 }
 
-/*
- * Add a STACK_OF extensions to a certificate request: allow alternative OIDs
- * in case we want to create a non standard one.
- */
+// Add a STACK_OF extensions to a certificate request: allow alternative OIDs
+// in case we want to create a non standard one.
 
 int X509_REQ_add_extensions_nid(X509_REQ *req,
-                                const STACK_OF(X509_EXTENSION) *exts, int nid)
-{
-    /* Generate encoding of extensions */
-    unsigned char *ext = NULL;
-    int ext_len = ASN1_item_i2d((ASN1_VALUE *)exts, &ext,
-                                ASN1_ITEM_rptr(X509_EXTENSIONS));
-    if (ext_len <= 0) {
-        return 0;
-    }
-    int ret = X509_REQ_add1_attr_by_NID(req, nid, V_ASN1_SEQUENCE, ext,
-                                        ext_len);
-    OPENSSL_free(ext);
-    return ret;
+                                const STACK_OF(X509_EXTENSION) *exts, int nid) {
+  // Generate encoding of extensions
+  unsigned char *ext = NULL;
+  int ext_len =
+      ASN1_item_i2d((ASN1_VALUE *)exts, &ext, ASN1_ITEM_rptr(X509_EXTENSIONS));
+  if (ext_len <= 0) {
+    return 0;
+  }
+  int ret = X509_REQ_add1_attr_by_NID(req, nid, V_ASN1_SEQUENCE, ext, ext_len);
+  OPENSSL_free(ext);
+  return ret;
 }
 
-/* This is the normal usage: use the "official" OID */
+// This is the normal usage: use the "official" OID
 int X509_REQ_add_extensions(X509_REQ *req,
-                            const STACK_OF(X509_EXTENSION) *exts)
-{
-    return X509_REQ_add_extensions_nid(req, exts, NID_ext_req);
+                            const STACK_OF(X509_EXTENSION) *exts) {
+  return X509_REQ_add_extensions_nid(req, exts, NID_ext_req);
 }
 
-/* Request attribute functions */
+// Request attribute functions
 
-int X509_REQ_get_attr_count(const X509_REQ *req)
-{
-    return X509at_get_attr_count(req->req_info->attributes);
+int X509_REQ_get_attr_count(const X509_REQ *req) {
+  return X509at_get_attr_count(req->req_info->attributes);
 }
 
-int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos)
-{
-    return X509at_get_attr_by_NID(req->req_info->attributes, nid, lastpos);
+int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos) {
+  return X509at_get_attr_by_NID(req->req_info->attributes, nid, lastpos);
 }
 
 int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj,
-                             int lastpos)
-{
-    return X509at_get_attr_by_OBJ(req->req_info->attributes, obj, lastpos);
+                             int lastpos) {
+  return X509at_get_attr_by_OBJ(req->req_info->attributes, obj, lastpos);
 }
 
-X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc)
-{
-    return X509at_get_attr(req->req_info->attributes, loc);
+X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc) {
+  return X509at_get_attr(req->req_info->attributes, loc);
 }
 
-X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc)
-{
-    return X509at_delete_attr(req->req_info->attributes, loc);
+X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc) {
+  return X509at_delete_attr(req->req_info->attributes, loc);
 }
 
-int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr)
-{
-    if (X509at_add1_attr(&req->req_info->attributes, attr))
-        return 1;
-    return 0;
+int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr) {
+  if (X509at_add1_attr(&req->req_info->attributes, attr)) {
+    return 1;
+  }
+  return 0;
 }
 
-int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
-                              const ASN1_OBJECT *obj, int attrtype,
-                              const unsigned char *data, int len)
-{
-    if (X509at_add1_attr_by_OBJ(&req->req_info->attributes, obj,
-                                attrtype, data, len))
-        return 1;
-    return 0;
+int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, const ASN1_OBJECT *obj,
+                              int attrtype, const unsigned char *data,
+                              int len) {
+  if (X509at_add1_attr_by_OBJ(&req->req_info->attributes, obj, attrtype, data,
+                              len)) {
+    return 1;
+  }
+  return 0;
 }
 
-int X509_REQ_add1_attr_by_NID(X509_REQ *req,
-                              int nid, int attrtype,
-                              const unsigned char *data, int len)
-{
-    if (X509at_add1_attr_by_NID(&req->req_info->attributes, nid,
-                                attrtype, data, len))
-        return 1;
-    return 0;
+int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, int attrtype,
+                              const unsigned char *data, int len) {
+  if (X509at_add1_attr_by_NID(&req->req_info->attributes, nid, attrtype, data,
+                              len)) {
+    return 1;
+  }
+  return 0;
 }
 
-int X509_REQ_add1_attr_by_txt(X509_REQ *req,
-                              const char *attrname, int attrtype,
-                              const unsigned char *data, int len)
-{
-    if (X509at_add1_attr_by_txt(&req->req_info->attributes, attrname,
-                                attrtype, data, len))
-        return 1;
-    return 0;
+int X509_REQ_add1_attr_by_txt(X509_REQ *req, const char *attrname, int attrtype,
+                              const unsigned char *data, int len) {
+  if (X509at_add1_attr_by_txt(&req->req_info->attributes, attrname, attrtype,
+                              data, len)) {
+    return 1;
+  }
+  return 0;
 }
 
 void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig,
-                             const X509_ALGOR **palg)
-{
-    if (psig != NULL)
-        *psig = req->signature;
-    if (palg != NULL)
-        *palg = req->sig_alg;
+                             const X509_ALGOR **palg) {
+  if (psig != NULL) {
+    *psig = req->signature;
+  }
+  if (palg != NULL) {
+    *palg = req->sig_alg;
+  }
 }
 
-int X509_REQ_get_signature_nid(const X509_REQ *req)
-{
-    return OBJ_obj2nid(req->sig_alg->algorithm);
+int X509_REQ_get_signature_nid(const X509_REQ *req) {
+  return OBJ_obj2nid(req->sig_alg->algorithm);
 }
 
-int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp)
-{
-    req->req_info->enc.modified = 1;
-    return i2d_X509_REQ_INFO(req->req_info, pp);
+int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp) {
+  req->req_info->enc.modified = 1;
+  return i2d_X509_REQ_INFO(req->req_info, pp);
 }
diff --git a/src/crypto/x509/x509_set.c b/src/crypto/x509/x509_set.c
index 93bb6a3..bfc3ae0 100644
--- a/src/crypto/x509/x509_set.c
+++ b/src/crypto/x509/x509_set.c
@@ -63,178 +63,178 @@
 #include "internal.h"
 
 
-long X509_get_version(const X509 *x509)
-{
-    // The default version is v1(0).
-    if (x509->cert_info->version == NULL) {
-        return X509_VERSION_1;
-    }
-    return ASN1_INTEGER_get(x509->cert_info->version);
+long X509_get_version(const X509 *x509) {
+  // The default version is v1(0).
+  if (x509->cert_info->version == NULL) {
+    return X509_VERSION_1;
+  }
+  return ASN1_INTEGER_get(x509->cert_info->version);
 }
 
-int X509_set_version(X509 *x, long version)
-{
-    // TODO(davidben): Reject invalid version numbers.
-    if (x == NULL)
-        return (0);
-    if (version == 0) {
-        ASN1_INTEGER_free(x->cert_info->version);
-        x->cert_info->version = NULL;
-        return (1);
-    }
+int X509_set_version(X509 *x, long version) {
+  if (x == NULL) {
+    return 0;
+  }
+
+  if (version < X509_VERSION_1 || version > X509_VERSION_3) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+    return 0;
+  }
+
+  // v1(0) is default and is represented by omitting the version.
+  if (version == X509_VERSION_1) {
+    ASN1_INTEGER_free(x->cert_info->version);
+    x->cert_info->version = NULL;
+    return 1;
+  }
+
+  if (x->cert_info->version == NULL) {
+    x->cert_info->version = ASN1_INTEGER_new();
     if (x->cert_info->version == NULL) {
-        if ((x->cert_info->version = ASN1_INTEGER_new()) == NULL)
-            return (0);
+      return 0;
     }
-    return (ASN1_INTEGER_set(x->cert_info->version, version));
+  }
+  return ASN1_INTEGER_set_int64(x->cert_info->version, version);
 }
 
-int X509_set_serialNumber(X509 *x, const ASN1_INTEGER *serial)
-{
-    ASN1_INTEGER *in;
+int X509_set_serialNumber(X509 *x, const ASN1_INTEGER *serial) {
+  if (serial->type != V_ASN1_INTEGER && serial->type != V_ASN1_NEG_INTEGER) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+    return 0;
+  }
 
-    if (x == NULL)
-        return (0);
-    in = x->cert_info->serialNumber;
-    if (in != serial) {
-        in = ASN1_INTEGER_dup(serial);
-        if (in != NULL) {
-            ASN1_INTEGER_free(x->cert_info->serialNumber);
-            x->cert_info->serialNumber = in;
-        }
+  ASN1_INTEGER *in;
+  if (x == NULL) {
+    return 0;
+  }
+  in = x->cert_info->serialNumber;
+  if (in != serial) {
+    in = ASN1_INTEGER_dup(serial);
+    if (in != NULL) {
+      ASN1_INTEGER_free(x->cert_info->serialNumber);
+      x->cert_info->serialNumber = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-int X509_set_issuer_name(X509 *x, X509_NAME *name)
-{
-    if ((x == NULL) || (x->cert_info == NULL))
-        return (0);
-    return (X509_NAME_set(&x->cert_info->issuer, name));
+int X509_set_issuer_name(X509 *x, X509_NAME *name) {
+  if ((x == NULL) || (x->cert_info == NULL)) {
+    return 0;
+  }
+  return (X509_NAME_set(&x->cert_info->issuer, name));
 }
 
-int X509_set_subject_name(X509 *x, X509_NAME *name)
-{
-    if ((x == NULL) || (x->cert_info == NULL))
-        return (0);
-    return (X509_NAME_set(&x->cert_info->subject, name));
+int X509_set_subject_name(X509 *x, X509_NAME *name) {
+  if ((x == NULL) || (x->cert_info == NULL)) {
+    return 0;
+  }
+  return (X509_NAME_set(&x->cert_info->subject, name));
 }
 
-int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm)
-{
-    ASN1_TIME *in;
+int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm) {
+  ASN1_TIME *in;
 
-    if ((x == NULL) || (x->cert_info->validity == NULL))
-        return (0);
-    in = x->cert_info->validity->notBefore;
-    if (in != tm) {
-        in = ASN1_STRING_dup(tm);
-        if (in != NULL) {
-            ASN1_TIME_free(x->cert_info->validity->notBefore);
-            x->cert_info->validity->notBefore = in;
-        }
+  if ((x == NULL) || (x->cert_info->validity == NULL)) {
+    return 0;
+  }
+  in = x->cert_info->validity->notBefore;
+  if (in != tm) {
+    in = ASN1_STRING_dup(tm);
+    if (in != NULL) {
+      ASN1_TIME_free(x->cert_info->validity->notBefore);
+      x->cert_info->validity->notBefore = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-int X509_set_notBefore(X509 *x, const ASN1_TIME *tm)
-{
-    return X509_set1_notBefore(x, tm);
+int X509_set_notBefore(X509 *x, const ASN1_TIME *tm) {
+  return X509_set1_notBefore(x, tm);
 }
 
-const ASN1_TIME *X509_get0_notBefore(const X509 *x)
-{
-    return x->cert_info->validity->notBefore;
+const ASN1_TIME *X509_get0_notBefore(const X509 *x) {
+  return x->cert_info->validity->notBefore;
 }
 
-ASN1_TIME *X509_getm_notBefore(X509 *x)
-{
-    // Note this function takes a const |X509| pointer in OpenSSL. We require
-    // non-const as this allows mutating |x|. If it comes up for compatibility,
-    // we can relax this.
-    return x->cert_info->validity->notBefore;
+ASN1_TIME *X509_getm_notBefore(X509 *x) {
+  // Note this function takes a const |X509| pointer in OpenSSL. We require
+  // non-const as this allows mutating |x|. If it comes up for compatibility,
+  // we can relax this.
+  return x->cert_info->validity->notBefore;
 }
 
-ASN1_TIME *X509_get_notBefore(const X509 *x509)
-{
-    // In OpenSSL, this function is an alias for |X509_getm_notBefore|, but our
-    // |X509_getm_notBefore| is const-correct. |X509_get_notBefore| was
-    // originally a macro, so it needs to capture both get0 and getm use cases.
-    return x509->cert_info->validity->notBefore;
+ASN1_TIME *X509_get_notBefore(const X509 *x509) {
+  // In OpenSSL, this function is an alias for |X509_getm_notBefore|, but our
+  // |X509_getm_notBefore| is const-correct. |X509_get_notBefore| was
+  // originally a macro, so it needs to capture both get0 and getm use cases.
+  return x509->cert_info->validity->notBefore;
 }
 
-int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm)
-{
-    ASN1_TIME *in;
+int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm) {
+  ASN1_TIME *in;
 
-    if ((x == NULL) || (x->cert_info->validity == NULL))
-        return (0);
-    in = x->cert_info->validity->notAfter;
-    if (in != tm) {
-        in = ASN1_STRING_dup(tm);
-        if (in != NULL) {
-            ASN1_TIME_free(x->cert_info->validity->notAfter);
-            x->cert_info->validity->notAfter = in;
-        }
+  if ((x == NULL) || (x->cert_info->validity == NULL)) {
+    return 0;
+  }
+  in = x->cert_info->validity->notAfter;
+  if (in != tm) {
+    in = ASN1_STRING_dup(tm);
+    if (in != NULL) {
+      ASN1_TIME_free(x->cert_info->validity->notAfter);
+      x->cert_info->validity->notAfter = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-int X509_set_notAfter(X509 *x, const ASN1_TIME *tm)
-{
-    return X509_set1_notAfter(x, tm);
+int X509_set_notAfter(X509 *x, const ASN1_TIME *tm) {
+  return X509_set1_notAfter(x, tm);
 }
 
-const ASN1_TIME *X509_get0_notAfter(const X509 *x)
-{
-    return x->cert_info->validity->notAfter;
+const ASN1_TIME *X509_get0_notAfter(const X509 *x) {
+  return x->cert_info->validity->notAfter;
 }
 
-ASN1_TIME *X509_getm_notAfter(X509 *x)
-{
-    // Note this function takes a const |X509| pointer in OpenSSL. We require
-    // non-const as this allows mutating |x|. If it comes up for compatibility,
-    // we can relax this.
-    return x->cert_info->validity->notAfter;
+ASN1_TIME *X509_getm_notAfter(X509 *x) {
+  // Note this function takes a const |X509| pointer in OpenSSL. We require
+  // non-const as this allows mutating |x|. If it comes up for compatibility,
+  // we can relax this.
+  return x->cert_info->validity->notAfter;
 }
 
-ASN1_TIME *X509_get_notAfter(const X509 *x509)
-{
-    // In OpenSSL, this function is an alias for |X509_getm_notAfter|, but our
-    // |X509_getm_notAfter| is const-correct. |X509_get_notAfter| was
-    // originally a macro, so it needs to capture both get0 and getm use cases.
-    return x509->cert_info->validity->notAfter;
+ASN1_TIME *X509_get_notAfter(const X509 *x509) {
+  // In OpenSSL, this function is an alias for |X509_getm_notAfter|, but our
+  // |X509_getm_notAfter| is const-correct. |X509_get_notAfter| was
+  // originally a macro, so it needs to capture both get0 and getm use cases.
+  return x509->cert_info->validity->notAfter;
 }
 
 void X509_get0_uids(const X509 *x509, const ASN1_BIT_STRING **out_issuer_uid,
-                    const ASN1_BIT_STRING **out_subject_uid)
-{
-    if (out_issuer_uid != NULL) {
-        *out_issuer_uid = x509->cert_info->issuerUID;
-    }
-    if (out_subject_uid != NULL) {
-        *out_subject_uid = x509->cert_info->subjectUID;
-    }
+                    const ASN1_BIT_STRING **out_subject_uid) {
+  if (out_issuer_uid != NULL) {
+    *out_issuer_uid = x509->cert_info->issuerUID;
+  }
+  if (out_subject_uid != NULL) {
+    *out_subject_uid = x509->cert_info->subjectUID;
+  }
 }
 
-int X509_set_pubkey(X509 *x, EVP_PKEY *pkey)
-{
-    if ((x == NULL) || (x->cert_info == NULL))
-        return (0);
-    return (X509_PUBKEY_set(&(x->cert_info->key), pkey));
+int X509_set_pubkey(X509 *x, EVP_PKEY *pkey) {
+  if ((x == NULL) || (x->cert_info == NULL)) {
+    return 0;
+  }
+  return (X509_PUBKEY_set(&(x->cert_info->key), pkey));
 }
 
-const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x)
-{
-    return x->cert_info->extensions;
+const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x) {
+  return x->cert_info->extensions;
 }
 
-const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x)
-{
-    return x->cert_info->signature;
+const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x) {
+  return x->cert_info->signature;
 }
 
-X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509)
-{
-    return x509->cert_info->key;
+X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509) {
+  return x509->cert_info->key;
 }
diff --git a/src/crypto/x509/x509_test.cc b/src/crypto/x509/x509_test.cc
index 77c383a..dc48c27 100644
--- a/src/crypto/x509/x509_test.cc
+++ b/src/crypto/x509/x509_test.cc
@@ -184,26 +184,6 @@
 -----END CERTIFICATE-----
 )";
 
-// kExamplePSSCert is an example RSA-PSS self-signed certificate, signed with
-// the default hash functions.
-static const char kExamplePSSCert[] = R"(
------BEGIN CERTIFICATE-----
-MIICYjCCAcagAwIBAgIJAI3qUyT6SIfzMBIGCSqGSIb3DQEBCjAFogMCAWowRTEL
-MAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVy
-bmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xNDEwMDkxOTA5NTVaFw0xNTEwMDkxOTA5
-NTVaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK
-DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
-MIGJAoGBAPi4bIO0vNmoV8CltFl2jFQdeesiUgR+0zfrQf2D+fCmhRU0dXFahKg8
-0u9aTtPel4rd/7vPCqqGkr64UOTNb4AzMHYTj8p73OxaymPHAyXvqIqDWHYg+hZ3
-13mSYwFIGth7Z/FSVUlO1m5KXNd6NzYM3t2PROjCpywrta9kS2EHAgMBAAGjUDBO
-MB0GA1UdDgQWBBTQQfuJQR6nrVrsNF1JEflVgXgfEzAfBgNVHSMEGDAWgBTQQfuJ
-QR6nrVrsNF1JEflVgXgfEzAMBgNVHRMEBTADAQH/MBIGCSqGSIb3DQEBCjAFogMC
-AWoDgYEASUy2RZcgNbNQZA0/7F+V1YTLEXwD16bm+iSVnzGwtexmQVEYIZG74K/w
-xbdZQdTbpNJkp1QPjPfh0zsatw6dmt5QoZ8K8No0DjR9dgf+Wvv5WJvJUIQBoAVN
-Z0IL+OQFz6+LcTHxD27JJCebrATXZA0wThGTQDm7crL+a+SujBY=
------END CERTIFICATE-----
-)";
-
 // kBadPSSCertPEM is a self-signed RSA-PSS certificate with bad parameters.
 static const char kBadPSSCertPEM[] = R"(
 -----BEGIN CERTIFICATE-----
@@ -1047,7 +1027,7 @@
 -----END CERTIFICATE-----
 )";
 
-// CertFromPEM parses the given, NUL-terminated pem block and returns an
+// CertFromPEM parses the given, NUL-terminated PEM block and returns an
 // |X509*|.
 static bssl::UniquePtr<X509> CertFromPEM(const char *pem) {
   bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
@@ -1055,7 +1035,7 @@
       PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
 }
 
-// CRLFromPEM parses the given, NUL-terminated pem block and returns an
+// CRLFromPEM parses the given, NUL-terminated PEM block and returns an
 // |X509_CRL*|.
 static bssl::UniquePtr<X509_CRL> CRLFromPEM(const char *pem) {
   bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
@@ -1063,7 +1043,15 @@
       PEM_read_bio_X509_CRL(bio.get(), nullptr, nullptr, nullptr));
 }
 
-// PrivateKeyFromPEM parses the given, NUL-terminated pem block and returns an
+// CSRFromPEM parses the given, NUL-terminated PEM block and returns an
+// |X509_REQ*|.
+static bssl::UniquePtr<X509_REQ> CSRFromPEM(const char *pem) {
+  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
+  return bssl::UniquePtr<X509_REQ>(
+      PEM_read_bio_X509_REQ(bio.get(), nullptr, nullptr, nullptr));
+}
+
+// PrivateKeyFromPEM parses the given, NUL-terminated PEM block and returns an
 // |EVP_PKEY*|.
 static bssl::UniquePtr<EVP_PKEY> PrivateKeyFromPEM(const char *pem) {
   bssl::UniquePtr<BIO> bio(
@@ -1137,7 +1125,7 @@
     return X509_V_ERR_UNSPECIFIED;
   }
 
-  X509_STORE_CTX_trusted_stack(ctx.get(), roots_stack.get());
+  X509_STORE_CTX_set0_trusted_stack(ctx.get(), roots_stack.get());
   X509_STORE_CTX_set0_crls(ctx.get(), crls_stack.get());
 
   X509_VERIFY_PARAM *param = X509_STORE_CTX_get0_param(ctx.get());
@@ -1462,6 +1450,23 @@
             Verify(leaf.get(), {root.get()}, {root.get()},
                    {algorithm_mismatch_crl2.get()}, X509_V_FLAG_CRL_CHECK));
 
+  // The CRL is valid for a month.
+  EXPECT_EQ(X509_V_ERR_CRL_HAS_EXPIRED,
+            Verify(leaf.get(), {root.get()}, {root.get()}, {basic_crl.get()},
+                   X509_V_FLAG_CRL_CHECK, [](X509_VERIFY_PARAM *param) {
+                     X509_VERIFY_PARAM_set_time(
+                         param, kReferenceTime + 2 * 30 * 24 * 3600);
+                   }));
+
+  // X509_V_FLAG_NO_CHECK_TIME suppresses the validity check.
+  EXPECT_EQ(X509_V_OK,
+            Verify(leaf.get(), {root.get()}, {root.get()}, {basic_crl.get()},
+                   X509_V_FLAG_CRL_CHECK | X509_V_FLAG_NO_CHECK_TIME,
+                   [](X509_VERIFY_PARAM *param) {
+                     X509_VERIFY_PARAM_set_time(
+                         param, kReferenceTime + 2 * 30 * 24 * 3600);
+                   }));
+
   // Parsing kBadExtensionCRL should fail.
   EXPECT_FALSE(CRLFromPEM(kBadExtensionCRL));
 }
@@ -1725,13 +1730,46 @@
 }
 
 TEST(X509Test, TestPSS) {
-  bssl::UniquePtr<X509> cert(CertFromPEM(kExamplePSSCert));
-  ASSERT_TRUE(cert);
+  static const char *kGoodCerts[] = {
+      "crypto/x509/test/pss_sha256.pem",
+      "crypto/x509/test/pss_sha384.pem",
+      "crypto/x509/test/pss_sha512.pem",
+      // We accept inputs with and without explicit NULLs. See RFC 4055,
+      // section 2.1.
+      "crypto/x509/test/pss_sha256_omit_nulls.pem",
+      // Although invalid, we tolerate an explicit trailerField value. See the
+      // certificates in cl/362617931.
+      "crypto/x509/test/pss_sha256_explicit_trailer.pem",
+  };
+  for (const char *path : kGoodCerts) {
+    SCOPED_TRACE(path);
+    bssl::UniquePtr<X509> cert = CertFromPEM(GetTestData(path).c_str());
+    ASSERT_TRUE(cert);
+    bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
+    ASSERT_TRUE(pkey);
+    EXPECT_TRUE(X509_verify(cert.get(), pkey.get()));
+  }
 
-  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
-  ASSERT_TRUE(pkey);
-
-  ASSERT_TRUE(X509_verify(cert.get(), pkey.get()));
+  static const char *kBadCerts[] = {
+      "crypto/x509/test/pss_sha1_explicit.pem",
+      "crypto/x509/test/pss_sha1_mgf1_syntax_error.pem",
+      "crypto/x509/test/pss_sha1.pem",
+      "crypto/x509/test/pss_sha224.pem",
+      "crypto/x509/test/pss_sha256_mgf1_sha384.pem",
+      "crypto/x509/test/pss_sha256_mgf1_syntax_error.pem",
+      "crypto/x509/test/pss_sha256_salt_overflow.pem",
+      "crypto/x509/test/pss_sha256_salt31.pem",
+      "crypto/x509/test/pss_sha256_unknown_mgf.pem",
+      "crypto/x509/test/pss_sha256_wrong_trailer.pem",
+  };
+  for (const char *path : kBadCerts) {
+    SCOPED_TRACE(path);
+    bssl::UniquePtr<X509> cert = CertFromPEM(GetTestData(path).c_str());
+    ASSERT_TRUE(cert);
+    bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
+    ASSERT_TRUE(pkey);
+    EXPECT_FALSE(X509_verify(cert.get(), pkey.get()));
+  }
 }
 
 TEST(X509Test, TestPSSBadParameters) {
@@ -1804,6 +1842,30 @@
   return bssl::UniquePtr<X509>(d2i_X509(nullptr, &inp, len));
 }
 
+static bssl::UniquePtr<X509_CRL> ReencodeCRL(X509_CRL *crl) {
+  uint8_t *der = nullptr;
+  int len = i2d_X509_CRL(crl, &der);
+  bssl::UniquePtr<uint8_t> free_der(der);
+  if (len <= 0) {
+    return nullptr;
+  }
+
+  const uint8_t *inp = der;
+  return bssl::UniquePtr<X509_CRL>(d2i_X509_CRL(nullptr, &inp, len));
+}
+
+static bssl::UniquePtr<X509_REQ> ReencodeCSR(X509_REQ *req) {
+  uint8_t *der = nullptr;
+  int len = i2d_X509_REQ(req, &der);
+  bssl::UniquePtr<uint8_t> free_der(der);
+  if (len <= 0) {
+    return nullptr;
+  }
+
+  const uint8_t *inp = der;
+  return bssl::UniquePtr<X509_REQ>(d2i_X509_REQ(nullptr, &inp, len));
+}
+
 static bool SignatureRoundTrips(EVP_MD_CTX *md_ctx, EVP_PKEY *pkey) {
   // Make a certificate like signed with |md_ctx|'s settings.'
   bssl::UniquePtr<X509> cert(CertFromPEM(kLeafPEM));
@@ -1832,18 +1894,10 @@
       EVP_DigestSignInit(md_ctx.get(), NULL, EVP_sha256(), NULL, pkey.get()));
   ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
 
-  // Test RSA-PSS with custom parameters.
-  md_ctx.Reset();
-  EVP_PKEY_CTX *pkey_ctx;
-  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
-                                 pkey.get()));
-  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
-  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, EVP_sha512()));
-  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
-
   // RSA-PSS with salt length matching hash length should work when passing in
   // -1 or the value explicitly.
   md_ctx.Reset();
+  EVP_PKEY_CTX *pkey_ctx;
   ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
                                  pkey.get()));
   ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
@@ -1856,6 +1910,37 @@
   ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
   ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, 32));
   ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
+
+  // RSA-PSS with SHA-1 is not supported.
+  md_ctx.Reset();
+  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha1(), NULL,
+                                 pkey.get()));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1));
+  bssl::UniquePtr<X509> cert = CertFromPEM(kLeafPEM);
+  ASSERT_TRUE(cert);
+  EXPECT_FALSE(X509_sign_ctx(cert.get(), md_ctx.get()));
+
+  // RSA-PSS with mismatched hashes is not supported.
+  md_ctx.Reset();
+  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
+                                 pkey.get()));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, EVP_sha512()));
+  cert = CertFromPEM(kLeafPEM);
+  ASSERT_TRUE(cert);
+  EXPECT_FALSE(X509_sign_ctx(cert.get(), md_ctx.get()));
+
+  // RSA-PSS with the wrong salt length is not supported.
+  md_ctx.Reset();
+  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
+                                 pkey.get()));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING));
+  ASSERT_TRUE(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, 33));
+  cert = CertFromPEM(kLeafPEM);
+  ASSERT_TRUE(cert);
+  EXPECT_FALSE(X509_sign_ctx(cert.get(), md_ctx.get()));
 }
 
 // Test the APIs for manually signing a certificate.
@@ -1872,7 +1957,7 @@
 
   // Test certificates made both from other certificates and |X509_new|, in case
   // there are bugs in filling in fields from different states. (Parsed
-  // certificate contain a TBSCertificate cache, and |X509_new| initializes
+  // certificates contain a TBSCertificate cache, and |X509_new| initializes
   // fields based on complex ASN.1 template logic.)
   for (bool new_cert : {true, false}) {
     SCOPED_TRACE(new_cert);
@@ -1880,9 +1965,10 @@
     bssl::UniquePtr<X509> cert;
     if (new_cert) {
       cert.reset(X509_new());
+      ASSERT_TRUE(cert);
       // Fill in some fields for the certificate arbitrarily.
       EXPECT_TRUE(X509_set_version(cert.get(), X509_VERSION_3));
-      EXPECT_TRUE(ASN1_INTEGER_set(X509_get_serialNumber(cert.get()), 1));
+      EXPECT_TRUE(ASN1_INTEGER_set_int64(X509_get_serialNumber(cert.get()), 1));
       EXPECT_TRUE(X509_gmtime_adj(X509_getm_notBefore(cert.get()), 0));
       EXPECT_TRUE(
           X509_gmtime_adj(X509_getm_notAfter(cert.get()), 60 * 60 * 24));
@@ -1935,6 +2021,182 @@
   }
 }
 
+// Test the APIs for manually signing a CSR.
+TEST(X509Test, RSASignCRLManual) {
+  const int kSignatureNID = NID_sha384WithRSAEncryption;
+  const EVP_MD *kSignatureHash = EVP_sha384();
+
+  bssl::UniquePtr<EVP_PKEY> pkey(PrivateKeyFromPEM(kRSAKey));
+  ASSERT_TRUE(pkey);
+  bssl::UniquePtr<X509_ALGOR> algor(X509_ALGOR_new());
+  ASSERT_TRUE(algor);
+  ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID),
+                              V_ASN1_NULL, nullptr));
+
+  // Test CRLs made both from other CRLs and |X509_CRL_new|, in case there are
+  // bugs in filling in fields from different states. (Parsed CRLs contain a
+  // TBSCertList cache, and |X509_CRL_new| initializes fields based on complex
+  // ASN.1 template logic.)
+  for (bool new_crl : {true, false}) {
+    SCOPED_TRACE(new_crl);
+
+    bssl::UniquePtr<X509_CRL> crl;
+    if (new_crl) {
+      crl.reset(X509_CRL_new());
+      ASSERT_TRUE(crl);
+      // Fill in some fields for the certificate arbitrarily.
+      ASSERT_TRUE(X509_CRL_set_version(crl.get(), X509_CRL_VERSION_2));
+      bssl::UniquePtr<ASN1_TIME> last_update(ASN1_TIME_new());
+      ASSERT_TRUE(last_update);
+      ASSERT_TRUE(ASN1_TIME_set(last_update.get(), kReferenceTime));
+      ASSERT_TRUE(X509_CRL_set1_lastUpdate(crl.get(), last_update.get()));
+      bssl::UniquePtr<X509_NAME> issuer(X509_NAME_new());
+      ASSERT_TRUE(issuer);
+      ASSERT_TRUE(X509_NAME_add_entry_by_txt(
+          issuer.get(), "CN", MBSTRING_ASC,
+          reinterpret_cast<const uint8_t *>("Test"), -1, -1, 0));
+      EXPECT_TRUE(X509_CRL_set_issuer_name(crl.get(), issuer.get()));
+    } else {
+      // Extract fields from a parsed CRL.
+      crl = CRLFromPEM(kBasicCRL);
+      ASSERT_TRUE(crl);
+
+      // We should test with a different algorithm from what is already in the
+      // CRL.
+      EXPECT_NE(kSignatureNID, X509_CRL_get_signature_nid(crl.get()));
+    }
+
+    // Fill in the signature algorithm.
+    ASSERT_TRUE(X509_CRL_set1_signature_algo(crl.get(), algor.get()));
+
+    // Extract the TBSCertList.
+    uint8_t *tbs = nullptr;
+    int tbs_len = i2d_re_X509_CRL_tbs(crl.get(), &tbs);
+    bssl::UniquePtr<uint8_t> free_tbs(tbs);
+    ASSERT_GT(tbs_len, 0);
+
+    // Generate a signature externally and fill it in.
+    bssl::ScopedEVP_MD_CTX md_ctx;
+    ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash,
+                                   nullptr, pkey.get()));
+    size_t sig_len;
+    ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len));
+    std::vector<uint8_t> sig(sig_len);
+    ASSERT_TRUE(
+        EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len));
+    sig.resize(sig_len);
+    ASSERT_TRUE(
+        X509_CRL_set1_signature_value(crl.get(), sig.data(), sig.size()));
+
+    // Check the signature.
+    EXPECT_TRUE(X509_CRL_verify(crl.get(), pkey.get()));
+
+    // Re-encode the CRL. X509_CRL objects contain a cached TBSCertList encoding
+    // and |i2d_re_X509_tbs| should have refreshed that cache.
+    bssl::UniquePtr<X509_CRL> copy = ReencodeCRL(crl.get());
+    ASSERT_TRUE(copy);
+    EXPECT_TRUE(X509_CRL_verify(copy.get(), pkey.get()));
+  }
+}
+
+static const char kTestCSR[] = R"(
+-----BEGIN CERTIFICATE REQUEST-----
+MIICVDCCATwCAQAwDzENMAsGA1UEAwwEVGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAK+UkwcNJfRhg5MzIQzxDdrqF9a76jNoK/BwCflKYFX7QEqf
+rsLkI0J+m60fUD0v50LnKwbGoMFKZ1R/3cBNXLcdXb7ZP/ZJ7A7QwUrL+W9n3sov
+U8/HSU3rHbg+V5L6egSZYuhDHoXKi33HDOL4DVUzMoU1ykmP4QwF1wUXHLqvqjbU
+teQBoJWO53/XOGQu8bX04muCFnHZWT2Ubqol70JwPU2PqDU1EBlgUFO79NEmflev
+b++H8tu42UCDUZXD9k5weftjneO4cud3IsUX6mDsyf7k1e2mxsS4TSZsJcG0iLBX
+HSr1udXazQsjlAKjJkoI3cWshF6LGRWssAtbGiUCAwEAAaAAMA0GCSqGSIb3DQEB
+CwUAA4IBAQAniYZL+amXu+wED+AwBZz+zPuxY16bveF27/gxcs/jq6hVpEQvMxfO
+jfAGeDRtAU7DMxdJPjvWwwNe2JlTMSRoVDMYaiKqB5yxIYa2cjQvp7swSxuFJwbG
+T8h7/d7yqem6NYYzgYsNOE5QJyNu/PsIEdvzrysfDAnREiT2ituOcVpiqUZq3DTj
+NaTd1GNG3j4E87ZUmayUJD5nH91UNzKvJbpfo+bLyfy73x4QeU0SRitsZmbSBTAi
+s9+zmCErxzMlAdJHGzxPkXmtvBnUzGRIsAD5h/DjYNUmQJkB60yplt84ZgThhx54
+rZGEJG3+X9OuhczVKGJyg+3gU7oDbecc
+-----END CERTIFICATE REQUEST-----
+)";
+
+// Test the APIs for manually signing a certificate.
+TEST(X509Test, RSASignCSRManual) {
+  const int kSignatureNID = NID_sha384WithRSAEncryption;
+  const EVP_MD *kSignatureHash = EVP_sha384();
+
+  bssl::UniquePtr<EVP_PKEY> pkey(PrivateKeyFromPEM(kRSAKey));
+  ASSERT_TRUE(pkey);
+  bssl::UniquePtr<X509_ALGOR> algor(X509_ALGOR_new());
+  ASSERT_TRUE(algor);
+  ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID),
+                              V_ASN1_NULL, nullptr));
+
+  // Test CSRs made both from other CSRs and |X509_REQ_new|, in case there are
+  // bugs in filling in fields from different states. (Parsed CSRs contain a
+  // CertificationRequestInfo cache, and |X509_REQ_new| initializes fields based
+  // on complex ASN.1 template logic.)
+  for (bool new_csr : {true, false}) {
+    SCOPED_TRACE(new_csr);
+
+    bssl::UniquePtr<X509_REQ> csr;
+    if (new_csr) {
+      csr.reset(X509_REQ_new());
+      ASSERT_TRUE(csr);
+      bssl::UniquePtr<X509_NAME> subject(X509_NAME_new());
+      ASSERT_TRUE(subject);
+      ASSERT_TRUE(X509_NAME_add_entry_by_txt(
+          subject.get(), "CN", MBSTRING_ASC,
+          reinterpret_cast<const uint8_t *>("New CSR"), -1, -1, 0));
+      EXPECT_TRUE(X509_REQ_set_subject_name(csr.get(), subject.get()));
+    } else {
+      // Extract fields from a parsed CSR.
+      csr = CSRFromPEM(kTestCSR);
+      ASSERT_TRUE(csr);
+    }
+
+    // Override the public key from the CSR unconditionally. Unlike certificates
+    // and CRLs, CSRs do not contain a signed copy of the signature algorithm,
+    // so we use a different field to confirm |i2d_re_X509_REQ_tbs| clears the
+    // cache as expected.
+    EXPECT_TRUE(X509_REQ_set_pubkey(csr.get(), pkey.get()));
+
+    // Fill in the signature algorithm.
+    ASSERT_TRUE(X509_REQ_set1_signature_algo(csr.get(), algor.get()));
+
+    // Extract the CertificationRequestInfo.
+    uint8_t *tbs = nullptr;
+    int tbs_len = i2d_re_X509_REQ_tbs(csr.get(), &tbs);
+    bssl::UniquePtr<uint8_t> free_tbs(tbs);
+    ASSERT_GT(tbs_len, 0);
+
+    // Generate a signature externally and fill it in.
+    bssl::ScopedEVP_MD_CTX md_ctx;
+    ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash,
+                                   nullptr, pkey.get()));
+    size_t sig_len;
+    ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len));
+    std::vector<uint8_t> sig(sig_len);
+    ASSERT_TRUE(
+        EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len));
+    sig.resize(sig_len);
+    ASSERT_TRUE(
+        X509_REQ_set1_signature_value(csr.get(), sig.data(), sig.size()));
+
+    // Check the signature.
+    EXPECT_TRUE(X509_REQ_verify(csr.get(), pkey.get()));
+
+    // Re-encode the CSR. X509_REQ objects contain a cached
+    // CertificationRequestInfo encoding and |i2d_re_X509_REQ_tbs| should have
+    // refreshed that cache.
+    bssl::UniquePtr<X509_REQ> copy = ReencodeCSR(csr.get());
+    ASSERT_TRUE(copy);
+    EXPECT_TRUE(X509_REQ_verify(copy.get(), pkey.get()));
+
+    // Check the signature was over the new public key.
+    bssl::UniquePtr<EVP_PKEY> copy_pubkey(X509_REQ_get_pubkey(copy.get()));
+    ASSERT_TRUE(copy_pubkey);
+    EXPECT_EQ(1, EVP_PKEY_cmp(pkey.get(), copy_pubkey.get()));
+  }
+}
+
 TEST(X509Test, Ed25519Sign) {
   uint8_t pub_bytes[32], priv_bytes[64];
   ED25519_keypair(pub_bytes, priv_bytes);
@@ -2027,7 +2289,7 @@
   ASSERT_TRUE(root);
 
   bssl::UniquePtr<ASN1_INTEGER> fourty_two(ASN1_INTEGER_new());
-  ASN1_INTEGER_set(fourty_two.get(), 42);
+  ASN1_INTEGER_set_int64(fourty_two.get(), 42);
   X509_set_serialNumber(root.get(), fourty_two.get());
 
   ASSERT_EQ(static_cast<long>(data_len), i2d_X509(root.get(), nullptr));
@@ -2121,10 +2383,10 @@
     {"000000000000Z", "Bad time value"},
     {"999999999999Z", "Bad time value"},
 
-    // Missing components. Not legal RFC 5280, but permitted.
-    {"090303125425", "Mar  3 12:54:25 2009"},
-    {"9003031254", "Mar  3 12:54:00 1990"},
-    {"9003031254Z", "Mar  3 12:54:00 1990 GMT"},
+    // Missing components.
+    {"090303125425", "Bad time value"},
+    {"9003031254", "Bad time value"},
+    {"9003031254Z", "Bad time value"},
 
     // GENERALIZEDTIME confused for UTCTIME.
     {"20090303125425Z", "Bad time value"},
@@ -2871,12 +3133,81 @@
 -----END CERTIFICATE-----
 )";
 
-// Test that the X.509 parser enforces versions are valid and match the fields
+// kV1CRLWithExtensionsPEM is a v1 CRL with extensions.
+static const char kV1CRLWithExtensionsPEM[] = R"(
+-----BEGIN X509 CRL-----
+MIIBpDCBjTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwK
+Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJQm9y
+aW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNVHRQE
+AwIBATANBgkqhkiG9w0BAQsFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LNZEAc
++a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWoeOkq
+0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4osdsAR
+eBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vvdiyu
+0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho/vBb
+hl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==
+-----END X509 CRL-----
+)";
+
+// kExplicitDefaultVersionCRLPEM is a v1 CRL with an explicitly-encoded version
+// field.
+static const char kExplicitDefaultVersionCRLPEM[] = R"(
+-----BEGIN X509 CRL-----
+MIIBlzCBgAIBADANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
+Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaMA0GCSqGSIb3
+DQEBCwUAA4IBAQCesEoqC933H3PAr2u1S9V4V4nv4s1kQBz5rmjGk80SwnHqFegC
+lgRvNczG5YFCgKzmIQHJxIa51y3bUv4xV/bszfwqtah46SrRrayKpWJBk7YVv9JQ
+VHST3NvzGXzpl/rmWA+mUAu6fRtX8dPswlyXThNziix2wBF4GzmepMY0R3kCULWI
+oe9BmQz/8wPnUOykqcOmwOJRWLniH0LVKl9mZfwfZW92LK7R9n9s8AzdUAZrBq1/
+9LJZ8EzIqmg9cQbf2gDOaOM6Px6fzamyfubjvggZqGj+8FuGXWazmpCItg+ObhgQ
+u2ddCgXILva0GNt0V39kT2TgI0oNvEVRcVuT
+-----END X509 CRL-----
+)";
+
+// kV3CRLPEM is a v3 CRL. CRL versions only go up to v2.
+static const char kV3CRLPEM[] = R"(
+-----BEGIN X509 CRL-----
+MIIBpzCBkAIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
+Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV
+HRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LN
+ZEAc+a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWo
+eOkq0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4os
+dsAReBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vv
+diyu0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho
+/vBbhl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==
+-----END X509 CRL-----
+)";
+
+// kV2CSRPEM is a v2 CSR. CSR versions only go up to v1.
+static const char kV2CSRPEM[] = R"(
+-----BEGIN CERTIFICATE REQUEST-----
+MIHJMHECAQEwDzENMAsGA1UEAwwEVGVzdDBZMBMGByqGSM49AgEGCCqGSM49AwEH
+A0IABJjsayyAQod1J7UJYNT8AH4WWxLdKV0ozhrIz6hCzBAze7AqXWOSH8G+1EWC
+pSfL3oMQNtBdJS0kpXXaUqEAgTSgADAKBggqhkjOPQQDAgNIADBFAiAUXVaEYATg
+4Cc917T73KBImxh6xyhsA5pKuYpq1S4m9wIhAK+G93HR4ur7Ghel6+zUTvIAsj9e
+rsn4lSYsqI4OI4ei
+-----END CERTIFICATE REQUEST-----
+)";
+
+// kV3CSRPEM is a v3 CSR. CSR versions only go up to v1.
+static const char kV3CSRPEM[] = R"(
+-----BEGIN CERTIFICATE REQUEST-----
+MIHJMHECAQIwDzENMAsGA1UEAwwEVGVzdDBZMBMGByqGSM49AgEGCCqGSM49AwEH
+A0IABJjsayyAQod1J7UJYNT8AH4WWxLdKV0ozhrIz6hCzBAze7AqXWOSH8G+1EWC
+pSfL3oMQNtBdJS0kpXXaUqEAgTSgADAKBggqhkjOPQQDAgNIADBFAiAUXVaEYATg
+4Cc917T73KBImxh6xyhsA5pKuYpq1S4m9wIhAK+G93HR4ur7Ghel6+zUTvIAsj9e
+rsn4lSYsqI4OI4ei
+-----END CERTIFICATE REQUEST-----
+)";
+
+// Test that the library enforces versions are valid and match the fields
 // present.
 TEST(X509Test, InvalidVersion) {
   // kExplicitDefaultVersionPEM is invalid but, for now, we accept it. See
   // https://crbug.com/boringssl/364.
   EXPECT_TRUE(CertFromPEM(kExplicitDefaultVersionPEM));
+  EXPECT_TRUE(CRLFromPEM(kExplicitDefaultVersionCRLPEM));
 
   EXPECT_FALSE(CertFromPEM(kNegativeVersionPEM));
   EXPECT_FALSE(CertFromPEM(kFutureVersionPEM));
@@ -2885,6 +3216,31 @@
   EXPECT_FALSE(CertFromPEM(kV2WithExtensionsPEM));
   EXPECT_FALSE(CertFromPEM(kV1WithIssuerUniqueIDPEM));
   EXPECT_FALSE(CertFromPEM(kV1WithSubjectUniqueIDPEM));
+  EXPECT_FALSE(CRLFromPEM(kV1CRLWithExtensionsPEM));
+  EXPECT_FALSE(CRLFromPEM(kV3CRLPEM));
+  EXPECT_FALSE(CSRFromPEM(kV2CSRPEM));
+
+  // kV3CSRPEM is invalid but, for now, we accept it. See
+  // https://github.com/certbot/certbot/pull/9334
+  EXPECT_TRUE(CSRFromPEM(kV3CSRPEM));
+
+  bssl::UniquePtr<X509> x509(X509_new());
+  ASSERT_TRUE(x509);
+  EXPECT_FALSE(X509_set_version(x509.get(), -1));
+  EXPECT_FALSE(X509_set_version(x509.get(), X509_VERSION_3 + 1));
+  EXPECT_FALSE(X509_set_version(x509.get(), 9999));
+
+  bssl::UniquePtr<X509_CRL> crl(X509_CRL_new());
+  ASSERT_TRUE(crl);
+  EXPECT_FALSE(X509_CRL_set_version(crl.get(), -1));
+  EXPECT_FALSE(X509_CRL_set_version(crl.get(), X509_CRL_VERSION_2 + 1));
+  EXPECT_FALSE(X509_CRL_set_version(crl.get(), 9999));
+
+  bssl::UniquePtr<X509_REQ> req(X509_REQ_new());
+  ASSERT_TRUE(req);
+  EXPECT_FALSE(X509_REQ_set_version(req.get(), -1));
+  EXPECT_FALSE(X509_REQ_set_version(req.get(), X509_REQ_VERSION_1 + 1));
+  EXPECT_FALSE(X509_REQ_set_version(req.get(), 9999));
 }
 
 // Unlike upstream OpenSSL, we require a non-null store in
@@ -3464,6 +3820,95 @@
              }));
 }
 
+// Test that notBefore and notAfter checks work correctly.
+TEST(X509Test, Expiry) {
+  bssl::UniquePtr<EVP_PKEY> key = PrivateKeyFromPEM(kP256Key);
+  ASSERT_TRUE(key);
+
+  // The following are measured in seconds relative to kReferenceTime. The
+  // validity periods are staggered so we can independently test both leaf and
+  // root time checks.
+  const time_t kSecondsInDay = 24 * 3600;
+  const time_t kRootStart = -30 * kSecondsInDay;
+  const time_t kIntermediateStart = -20 * kSecondsInDay;
+  const time_t kLeafStart = -10 * kSecondsInDay;
+  const time_t kIntermediateEnd = 10 * kSecondsInDay;
+  const time_t kLeafEnd = 20 * kSecondsInDay;
+  const time_t kRootEnd = 30 * kSecondsInDay;
+
+  bssl::UniquePtr<X509> root =
+      MakeTestCert("Root", "Root", key.get(), /*is_ca=*/true);
+  ASSERT_TRUE(root);
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notBefore(root.get()), kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kRootStart));
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notAfter(root.get()), kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kRootEnd));
+  ASSERT_TRUE(X509_sign(root.get(), key.get(), EVP_sha256()));
+
+  bssl::UniquePtr<X509> intermediate =
+      MakeTestCert("Root", "Intermediate", key.get(), /*is_ca=*/true);
+  ASSERT_TRUE(intermediate);
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notBefore(intermediate.get()),
+                            kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kIntermediateStart));
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notAfter(intermediate.get()),
+                            kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kIntermediateEnd));
+  ASSERT_TRUE(X509_sign(intermediate.get(), key.get(), EVP_sha256()));
+
+  bssl::UniquePtr<X509> leaf =
+      MakeTestCert("Intermediate", "Leaf", key.get(), /*is_ca=*/false);
+  ASSERT_TRUE(leaf);
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notBefore(leaf.get()), kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kLeafStart));
+  ASSERT_TRUE(ASN1_TIME_adj(X509_getm_notAfter(leaf.get()), kReferenceTime,
+                            /*offset_day=*/0,
+                            /*offset_sec=*/kLeafEnd));
+  ASSERT_TRUE(X509_sign(leaf.get(), key.get(), EVP_sha256()));
+
+  struct VerifyAt {
+    time_t time;
+    void operator()(X509_VERIFY_PARAM *param) const {
+      X509_VERIFY_PARAM_set_time(param, time);
+    }
+  };
+
+  for (bool check_time : {true, false}) {
+    SCOPED_TRACE(check_time);
+    unsigned long flags = check_time ? 0 : X509_V_FLAG_NO_CHECK_TIME;
+    int not_yet_valid = check_time ? X509_V_ERR_CERT_NOT_YET_VALID : X509_V_OK;
+    int has_expired = check_time ? X509_V_ERR_CERT_HAS_EXPIRED : X509_V_OK;
+
+    EXPECT_EQ(not_yet_valid,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kRootStart - 1}));
+    EXPECT_EQ(not_yet_valid,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kIntermediateStart - 1}));
+    EXPECT_EQ(not_yet_valid,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kLeafStart - 1}));
+
+    EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {intermediate.get()},
+                                {}, flags, VerifyAt{kReferenceTime}));
+
+    EXPECT_EQ(has_expired,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kRootEnd + 1}));
+    EXPECT_EQ(has_expired,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kIntermediateEnd + 1}));
+    EXPECT_EQ(has_expired,
+              Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, flags,
+                     VerifyAt{kReferenceTime + kLeafEnd + 1}));
+  }
+}
+
 // kConstructedBitString is an X.509 certificate where the signature is encoded
 // as a BER constructed BIT STRING. Note that, while OpenSSL's parser accepts
 // this input, it interprets the value incorrectly.
@@ -3524,6 +3969,20 @@
 -----END CERTIFICATE-----
 )";
 
+// kHighTagNumber is an X.509 certificate where the outermost SEQUENCE tag uses
+// high tag number form.
+static const char kHighTagNumber[] = R"(
+-----BEGIN CERTIFICATE-----
+PxCCASAwgcagAwIBAgICBNIwCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEVGVzdDAg
+Fw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsGA1UEAxMEVGVz
+dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWXa7ep
+Hg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsGjEDAO
+MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKnSIhfmzfQpeOKFHiAq
+cml3ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh4qnk
+soBsxWI=
+-----END CERTIFICATE-----
+)";
+
 TEST(X509Test, BER) {
   // Constructed strings are forbidden in DER.
   EXPECT_FALSE(CertFromPEM(kConstructedBitString));
@@ -3532,4 +3991,1041 @@
   EXPECT_FALSE(CertFromPEM(kIndefiniteLength));
   // Padding bits in BIT STRINGs must be zero in BER.
   EXPECT_FALSE(CertFromPEM(kNonZeroPadding));
+  // Tags must be minimal in both BER and DER, though many BER decoders
+  // incorrectly support non-minimal tags.
+  EXPECT_FALSE(CertFromPEM(kHighTagNumber));
+}
+
+TEST(X509Test, Names) {
+  bssl::UniquePtr<EVP_PKEY> key = PrivateKeyFromPEM(kP256Key);
+  ASSERT_TRUE(key);
+  bssl::UniquePtr<X509> root =
+      MakeTestCert("Root", "Root", key.get(), /*is_ca=*/true);
+  ASSERT_TRUE(root);
+  ASSERT_TRUE(X509_sign(root.get(), key.get(), EVP_sha256()));
+
+  struct {
+    std::vector<std::pair<int, std::string>> cert_subject;
+    std::vector<std::string> cert_dns_names;
+    std::vector<std::string> cert_emails;
+    std::vector<std::string> valid_dns_names;
+    std::vector<std::string> invalid_dns_names;
+    std::vector<std::string> valid_emails;
+    std::vector<std::string> invalid_emails;
+    unsigned flags;
+  } kTests[] = {
+      // DNS names only match DNS names and do so case-insensitively.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{"example.com", "WWW.EXAMPLE.COM"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/
+          {"example.com", "EXAMPLE.COM", "www.example.com", "WWW.EXAMPLE.COM"},
+          /*invalid_dns_names=*/{"test.example.com", "example.org"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{"test@example.com", "example.com"},
+          /*flags=*/0,
+      },
+
+      // DNS wildcards match exactly one component.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{"*.example.com", "*.EXAMPLE.ORG"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/
+          {"www.example.com", "WWW.EXAMPLE.COM", "www.example.org",
+           "WWW.EXAMPLE.ORG"},
+          /*invalid_dns_names=*/{"example.com", "test.www.example.com"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{"test@example.com", "www.example.com"},
+          /*flags=*/0,
+      },
+
+      // DNS wildcards can be disabled.
+      // TODO(davidben): Can we remove this feature? Does anyone use it?
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{"example.com", "*.example.com"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{"example.com"},
+          /*invalid_dns_names=*/{"www.example.com"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/X509_CHECK_FLAG_NO_WILDCARDS,
+      },
+
+      // Invalid DNS wildcards do not match.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/
+          {"a.*", "**.b.example", "*c.example", "d*.example", "e*e.example",
+           "*", ".", "..", "*."},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/
+          {"a.example", "test.b.example", "cc.example", "dd.example",
+           "eee.example", "f", "g."},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // IDNs match like any other DNS labels.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/
+          {"xn--rger-koa.a.example", "*.xn--rger-koa.b.example",
+           "www.xn--rger-koa.c.example"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/
+          {"xn--rger-koa.a.example", "www.xn--rger-koa.b.example",
+           "www.xn--rger-koa.c.example"},
+          /*invalid_dns_names=*/
+          {"www.xn--rger-koa.a.example", "xn--rger-koa.b.example",
+           "www.xn--rger-koa.d.example"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // For now, DNS names are also extracted out of the common name, but only
+      // there is no SAN list.
+      // TODO(https://crbug.com/boringssl/464): Remove this.
+      {
+          /*cert_subject=*/{{NID_commonName, "a.example"},
+                            {NID_commonName, "*.b.example"}},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/
+          {"a.example", "A.EXAMPLE", "test.b.example", "TEST.B.EXAMPLE"},
+          /*invalid_dns_names=*/{},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+      {
+          /*cert_subject=*/{{NID_commonName, "a.example"},
+                            {NID_commonName, "*.b.example"}},
+          /*cert_dns_names=*/{"example.com"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/
+          {"a.example", "A.EXAMPLE", "test.b.example", "TEST.B.EXAMPLE"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // Other subject RDNs do not provide DNS names.
+      {
+          /*cert_subject=*/{{NID_organizationName, "example.com"}},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/{"example.com"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // Input DNS names cannot have wildcards.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{"www.example.com"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/{"*.example.com"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // OpenSSL has some non-standard wildcard syntax for input DNS names. We
+      // do not support this.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{"www.a.example", "*.b.test"},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/
+          {".www.a.example", ".www.b.test", ".a.example", ".b.test", ".example",
+           ".test"},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+
+      // Emails match case-sensitively before the '@' and case-insensitively
+      // after. They do not match DNS names.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{"test@a.example", "TEST@B.EXAMPLE"},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/{"a.example", "b.example"},
+          /*valid_emails=*/
+          {"test@a.example", "test@A.EXAMPLE", "TEST@b.example",
+           "TEST@B.EXAMPLE"},
+          /*invalid_emails=*/
+          {"TEST@a.example", "test@B.EXAMPLE", "another-test@a.example",
+           "est@a.example"},
+          /*flags=*/0,
+      },
+
+      // Emails may also be found in the subject.
+      {
+          /*cert_subject=*/{{NID_pkcs9_emailAddress, "test@a.example"},
+                            {NID_pkcs9_emailAddress, "TEST@B.EXAMPLE"}},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/{"a.example", "b.example"},
+          /*valid_emails=*/
+          {"test@a.example", "test@A.EXAMPLE", "TEST@b.example",
+           "TEST@B.EXAMPLE"},
+          /*invalid_emails=*/
+          {"TEST@a.example", "test@B.EXAMPLE", "another-test@a.example",
+           "est@a.example"},
+          /*flags=*/0,
+      },
+
+      // There are no email wildcard names.
+      {
+          /*cert_subject=*/{},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{"test@*.a.example", "@b.example", "*@c.example"},
+          /*valid_dns_names=*/{},
+          /*invalid_dns_names=*/{},
+          /*valid_emails=*/{},
+          /*invalid_emails=*/
+          {"test@test.a.example", "test@b.example", "test@c.example"},
+          /*flags=*/0,
+      },
+
+      // Unrelated RDNs can be skipped when looking in the subject.
+      {
+          /*cert_subject=*/{{NID_organizationName, "Acme Corporation"},
+                            {NID_commonName, "a.example"},
+                            {NID_pkcs9_emailAddress, "test@b.example"},
+                            {NID_countryName, "US"}},
+          /*cert_dns_names=*/{},
+          /*cert_emails=*/{},
+          /*valid_dns_names=*/{"a.example"},
+          /*invalid_dns_names=*/{},
+          /*valid_emails=*/{"test@b.example"},
+          /*invalid_emails=*/{},
+          /*flags=*/0,
+      },
+  };
+
+  size_t i = 0;
+  for (const auto &t : kTests) {
+    SCOPED_TRACE(i++);
+
+    // Issue a test certificate.
+    bssl::UniquePtr<X509> cert =
+        MakeTestCert("Root", "Leaf", key.get(), /*is_ca=*/false);
+    ASSERT_TRUE(cert);
+    if (!t.cert_subject.empty()) {
+      bssl::UniquePtr<X509_NAME> subject(X509_NAME_new());
+      ASSERT_TRUE(subject);
+      for (const auto &entry : t.cert_subject) {
+        ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+            subject.get(), entry.first, MBSTRING_ASC,
+            reinterpret_cast<const unsigned char *>(entry.second.data()),
+            entry.second.size(), /*loc=*/-1, /*set=*/0));
+      }
+      ASSERT_TRUE(X509_set_subject_name(cert.get(), subject.get()));
+    }
+    bssl::UniquePtr<GENERAL_NAMES> sans(sk_GENERAL_NAME_new_null());
+    ASSERT_TRUE(sans);
+    for (const auto &dns : t.cert_dns_names) {
+      bssl::UniquePtr<GENERAL_NAME> name(GENERAL_NAME_new());
+      ASSERT_TRUE(name);
+      name->type = GEN_DNS;
+      name->d.dNSName = ASN1_IA5STRING_new();
+      ASSERT_TRUE(name->d.dNSName);
+      ASSERT_TRUE(ASN1_STRING_set(name->d.dNSName, dns.data(), dns.size()));
+      ASSERT_TRUE(bssl::PushToStack(sans.get(), std::move(name)));
+    }
+    for (const auto &email : t.cert_emails) {
+      bssl::UniquePtr<GENERAL_NAME> name(GENERAL_NAME_new());
+      ASSERT_TRUE(name);
+      name->type = GEN_EMAIL;
+      name->d.rfc822Name = ASN1_IA5STRING_new();
+      ASSERT_TRUE(name->d.rfc822Name);
+      ASSERT_TRUE(
+          ASN1_STRING_set(name->d.rfc822Name, email.data(), email.size()));
+      ASSERT_TRUE(bssl::PushToStack(sans.get(), std::move(name)));
+    }
+    if (sk_GENERAL_NAME_num(sans.get()) != 0) {
+      ASSERT_TRUE(X509_add1_ext_i2d(cert.get(), NID_subject_alt_name,
+                                    sans.get(), /*crit=*/0, /*flags=*/0));
+    }
+    ASSERT_TRUE(X509_sign(cert.get(), key.get(), EVP_sha256()));
+
+    for (const auto &dns : t.valid_dns_names) {
+      SCOPED_TRACE(dns);
+      EXPECT_EQ(1, X509_check_host(cert.get(), dns.data(), dns.size(), t.flags,
+                                   /*peername=*/nullptr));
+      EXPECT_EQ(X509_V_OK,
+                Verify(cert.get(), {root.get()}, /*intermediates=*/{},
+                       /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
+                         ASSERT_TRUE(X509_VERIFY_PARAM_set1_host(
+                             param, dns.data(), dns.size()));
+                         X509_VERIFY_PARAM_set_hostflags(param, t.flags);
+                       }));
+    }
+
+    for (const auto &dns : t.invalid_dns_names) {
+      SCOPED_TRACE(dns);
+      EXPECT_EQ(0, X509_check_host(cert.get(), dns.data(), dns.size(), t.flags,
+                                   /*peername=*/nullptr));
+      EXPECT_EQ(X509_V_ERR_HOSTNAME_MISMATCH,
+                Verify(cert.get(), {root.get()}, /*intermediates=*/{},
+                       /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
+                         ASSERT_TRUE(X509_VERIFY_PARAM_set1_host(
+                             param, dns.data(), dns.size()));
+                         X509_VERIFY_PARAM_set_hostflags(param, t.flags);
+                       }));
+    }
+
+    for (const auto &email : t.valid_emails) {
+      SCOPED_TRACE(email);
+      EXPECT_EQ(
+          1, X509_check_email(cert.get(), email.data(), email.size(), t.flags));
+      EXPECT_EQ(X509_V_OK,
+                Verify(cert.get(), {root.get()}, /*intermediates=*/{},
+                       /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
+                         ASSERT_TRUE(X509_VERIFY_PARAM_set1_email(
+                             param, email.data(), email.size()));
+                         X509_VERIFY_PARAM_set_hostflags(param, t.flags);
+                       }));
+    }
+
+    for (const auto &email : t.invalid_emails) {
+      SCOPED_TRACE(email);
+      EXPECT_EQ(
+          0, X509_check_email(cert.get(), email.data(), email.size(), t.flags));
+      EXPECT_EQ(X509_V_ERR_EMAIL_MISMATCH,
+                Verify(cert.get(), {root.get()}, /*intermediates=*/{},
+                       /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
+                         ASSERT_TRUE(X509_VERIFY_PARAM_set1_email(
+                             param, email.data(), email.size()));
+                         X509_VERIFY_PARAM_set_hostflags(param, t.flags);
+                       }));
+    }
+  }
+}
+
+TEST(X509Test, AddDuplicates) {
+  bssl::UniquePtr<X509_STORE> store(X509_STORE_new());
+  bssl::UniquePtr<X509> a(CertFromPEM(kCrossSigningRootPEM));
+  bssl::UniquePtr<X509> b(CertFromPEM(kRootCAPEM));
+
+  ASSERT_TRUE(store);
+  ASSERT_TRUE(a);
+  ASSERT_TRUE(b);
+
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), a.get()));
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), b.get()));
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), a.get()));
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), b.get()));
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), a.get()));
+  EXPECT_TRUE(X509_STORE_add_cert(store.get(), b.get()));
+
+  EXPECT_EQ(sk_X509_OBJECT_num(X509_STORE_get0_objects(store.get())), 2u);
+}
+
+TEST(X509Test, BytesToHex) {
+  struct {
+    std::vector<uint8_t> bytes;
+    const char *hex;
+  } kTests[] = {
+      {{}, ""},
+      {{0x00}, "00"},
+      {{0x00, 0x11, 0x22}, "00:11:22"},
+      {{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
+       "01:23:45:67:89:AB:CD:EF"},
+  };
+  for (const auto &t : kTests) {
+    SCOPED_TRACE(Bytes(t.bytes));
+    bssl::UniquePtr<char> hex(
+        x509v3_bytes_to_hex(t.bytes.data(), t.bytes.size()));
+    ASSERT_TRUE(hex);
+    EXPECT_STREQ(hex.get(), t.hex);
+  }
+}
+
+TEST(X509Test, NamePrint) {
+  // kTestName is a DER-encoded X.509 that covers many cases.
+  //
+  // SEQUENCE {
+  //   SET {
+  //     SEQUENCE {
+  //       # countryName
+  //       OBJECT_IDENTIFIER { 2.5.4.6 }
+  //       PrintableString { "US" }
+  //     }
+  //   }
+  //   # Sets may be multi-valued, with different attributes. Try to keep this
+  //   # in DER set order, in case we ever enforce this in the parser.
+  //   SET {
+  //     SEQUENCE {
+  //       # stateOrProvinceName
+  //       OBJECT_IDENTIFIER { 2.5.4.8 }
+  //       PrintableString { "Some State" }
+  //     }
+  //     SEQUENCE {
+  //       # stateOrProvinceName
+  //       OBJECT_IDENTIFIER { 2.5.4.8 }
+  //       UTF8String { "Some Other State \xe2\x98\x83" }
+  //     }
+  //     SEQUENCE {
+  //       # stateOrProvinceName
+  //       OBJECT_IDENTIFIER { 2.5.4.8 }
+  //       BMPString { u"Another State \u2603" }
+  //     }
+  //     SEQUENCE {
+  //       # A custom OID
+  //       OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2 }
+  //       UniversalString { U"\u2603" }
+  //     }
+  //   }
+  //   # Custom OIDs may have non-string values.
+  //   SET {
+  //     SEQUENCE {
+  //       OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.3 }
+  //       SEQUENCE { INTEGER { 1 } INTEGER { 2 } }
+  //     }
+  //   }
+  //   SET {
+  //     SEQUENCE {
+  //       # organizationName
+  //       OBJECT_IDENTIFIER { 2.5.4.10 }
+  //       PrintableString { "Org Name" }
+  //     }
+  //   }
+  //   SET {
+  //     SEQUENCE {
+  //       # commonName
+  //       OBJECT_IDENTIFIER { 2.5.4.3 }
+  //       # Embed common delimiter forms to test how well they get escaped.
+  //       UTF8String { "Common
+  //       Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\nCN=A\n" }
+  //     }
+  //   }
+  //   SET {
+  //   SEQUENCE {
+  //     # commonName
+  //     OBJECT_IDENTIFIER { 2.5.4.3 }
+  //     # Test escaping of leading and trailing spaces.
+  //     UTF8String { " spaces " }
+  //   }
+  // }
+  static const uint8_t kTestName[] = {
+      0x30, 0x82, 0x01, 0x00, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+      0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x6d, 0x30, 0x11, 0x06, 0x03, 0x55,
+      0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61,
+      0x74, 0x65, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x14, 0x53,
+      0x6f, 0x6d, 0x65, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x53, 0x74,
+      0x61, 0x74, 0x65, 0x20, 0xe2, 0x98, 0x83, 0x30, 0x25, 0x06, 0x03, 0x55,
+      0x04, 0x08, 0x1e, 0x1e, 0x00, 0x41, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74,
+      0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74,
+      0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x26, 0x03, 0x30, 0x14,
+      0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7,
+      0x09, 0x02, 0x1c, 0x04, 0x00, 0x00, 0x26, 0x03, 0x31, 0x18, 0x30, 0x16,
+      0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7,
+      0x09, 0x03, 0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x31, 0x11,
+      0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x4f, 0x72, 0x67,
+      0x20, 0x4e, 0x61, 0x6d, 0x65, 0x31, 0x42, 0x30, 0x40, 0x06, 0x03, 0x55,
+      0x04, 0x03, 0x0c, 0x39, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x4e,
+      0x61, 0x6d, 0x65, 0x2f, 0x43, 0x4e, 0x3d, 0x41, 0x2f, 0x43, 0x4e, 0x3d,
+      0x42, 0x2c, 0x43, 0x4e, 0x3d, 0x41, 0x2c, 0x43, 0x4e, 0x3d, 0x42, 0x2b,
+      0x43, 0x4e, 0x3d, 0x41, 0x2b, 0x43, 0x4e, 0x3d, 0x42, 0x3b, 0x43, 0x4e,
+      0x3d, 0x41, 0x3b, 0x43, 0x4e, 0x3d, 0x42, 0x0a, 0x43, 0x4e, 0x3d, 0x41,
+      0x0a, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08,
+      0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20};
+
+  const uint8_t *ptr = kTestName;
+  bssl::UniquePtr<X509_NAME> name(
+      d2i_X509_NAME(nullptr, &ptr, sizeof(kTestName)));
+  ASSERT_TRUE(name);
+  EXPECT_EQ(ptr, kTestName + sizeof(kTestName));
+
+  struct {
+    int indent;
+    unsigned long flags;
+    std::string printed;
+  } kTests[] = {
+      // RFC 2253 uses , and + separators and encodes the RDNs in reverse.
+      // OpenSSL's implementation additionally happens to reverse the values
+      // within each RDN. RFC 2253 says any order is permissible.
+      {/*indent=*/0,
+       /*flags=*/XN_FLAG_RFC2253,
+       "CN=\\ spaces\\ ,"
+       "CN=Common "
+       "Name/CN=A/CN=B\\,CN=A\\,CN=B\\+CN=A\\+CN=B\\;CN=A\\;CN=B\\0ACN=A\\0A,"
+       "O=Org Name,"
+       "1.2.840.113554.4.1.72585.3=#3006020101020102,"
+       "1.2.840.113554.4.1.72585.2=#1C0400002603+"
+       "ST=Another State \\E2\\98\\83+"
+       "ST=Some Other State \\E2\\98\\83+"
+       "ST=Some State,"
+       "C=US"},
+      {/*indent=*/2,
+       /*flags=*/XN_FLAG_RFC2253,
+       "  "
+       "CN=\\ spaces\\ ,"
+       "CN=Common "
+       "Name/CN=A/CN=B\\,CN=A\\,CN=B\\+CN=A\\+CN=B\\;CN=A\\;CN=B\\0ACN=A\\0A,"
+       "O=Org Name,"
+       "1.2.840.113554.4.1.72585.3=#3006020101020102,"
+       "1.2.840.113554.4.1.72585.2=#1C0400002603+"
+       "ST=Another State \\E2\\98\\83+"
+       "ST=Some Other State \\E2\\98\\83+"
+       "ST=Some State,"
+       "C=US"},
+      // |XN_FLAG_ONELINE| is an OpenSSL-specific single-line format. It also
+      // omits |XN_FLAG_DUMP_UNKNOWN_FIELDS|, so unknown OIDs that use known
+      // string types will still be decoded. (This may drop important
+      // information if the unknown OID distinguishes between string types.) It
+      // also passes |ASN1_STRFLGS_ESC_QUOTE|.
+      {/*indent=*/0,
+       /*flags=*/XN_FLAG_ONELINE,
+       "C = US, "
+       "ST = Some State + "
+       "ST = Some Other State \\E2\\98\\83 + "
+       "ST = Another State \\E2\\98\\83 + "
+       "1.2.840.113554.4.1.72585.2 = \\E2\\98\\83, "
+       "1.2.840.113554.4.1.72585.3 = #3006020101020102, "
+       "O = Org Name, "
+       "CN = \"Common "
+       "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\", "
+       "CN = \" spaces \""},
+      // |XN_FLAG_MULTILINE| is an OpenSSL-specific multi-line format that tries
+      // to vertically align the equal sizes. The vertical alignment doesn't
+      // quite handle multi-valued RDNs right and uses a non-RFC-2253 escaping.
+      {/*indent=*/0,
+       /*flags=*/XN_FLAG_MULTILINE,
+       "countryName               = US\n"
+       "stateOrProvinceName       = Some State + "
+       "stateOrProvinceName       = Some Other State \\U2603 + "
+       "stateOrProvinceName       = Another State \\U2603 + "
+       "1.2.840.113554.4.1.72585.2 = \\U2603\n"
+       "1.2.840.113554.4.1.72585.3 = 0\\06\\02\\01\\01\\02\\01\\02\n"
+       "organizationName          = Org Name\n"
+       "commonName                = Common "
+       "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\n"
+       "commonName                =  spaces "},
+      // The multiline format indents every line.
+      {/*indent=*/2,
+       /*flags=*/XN_FLAG_MULTILINE,
+       "  countryName               = US\n"
+       "  stateOrProvinceName       = Some State + "
+       "stateOrProvinceName       = Some Other State \\U2603 + "
+       "stateOrProvinceName       = Another State \\U2603 + "
+       "1.2.840.113554.4.1.72585.2 = \\U2603\n"
+       "  1.2.840.113554.4.1.72585.3 = 0\\06\\02\\01\\01\\02\\01\\02\n"
+       "  organizationName          = Org Name\n"
+       "  commonName                = Common "
+       "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\n"
+       "  commonName                =  spaces "},
+      // Callers can also customize the output, wuith both |XN_FLAG_*| and
+      // |ASN1_STRFLGS_*|. |XN_FLAG_SEP_SPLUS_SPC| uses semicolon separators and
+      // |XN_FLAG_FN_OID| forces OIDs.
+      {/*indent=*/0,
+       /*flags=*/XN_FLAG_SEP_SPLUS_SPC | XN_FLAG_FN_OID | ASN1_STRFLGS_RFC2253 |
+           ASN1_STRFLGS_ESC_QUOTE,
+       "2.5.4.6=US; "
+       "2.5.4.8=Some State + "
+       "2.5.4.8=Some Other State \\E2\\98\\83 + "
+       "2.5.4.8=Another State \\E2\\98\\83 + "
+       "1.2.840.113554.4.1.72585.2=\\E2\\98\\83; "
+       "1.2.840.113554.4.1.72585.3=#3006020101020102; "
+       "2.5.4.10=Org Name; "
+       "2.5.4.3=\"Common "
+       "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\"; "
+       "2.5.4.3=\" spaces \""},
+      // |XN_FLAG_COMPAT| matches |X509_NAME_print|, rather than
+      // |X509_NAME_print_ex|.
+      //
+      // TODO(davidben): This works by post-processing the output of
+      // |X509_NAME_oneline|, which uses "/"" separators, and replacing with
+      // ", ". The escaping is ambiguous and the post-processing is buggy, so
+      // some of the trailing slashes are still present and some internal
+      // slashes are mis-converted.
+      {/*indent=*/0,
+       /*flags=*/XN_FLAG_COMPAT,
+       "C=US, "
+       "ST=Some State, "
+       "ST=Some Other State \\xE2\\x98\\x83, "
+       "ST=\\x00A\\x00n\\x00o\\x00t\\x00h\\x00e\\x00r\\x00 "
+       "\\x00S\\x00t\\x00a\\x00t\\x00e\\x00 &\\x03/"
+       "1.2.840.113554.4.1.72585.2=\\x00\\x00&\\x03/"
+       "1.2.840.113554.4.1.72585.3=0\\x06\\x02\\x01\\x01\\x02\\x01\\x02, "
+       "O=Org Name, "
+       "CN=Common Name, "
+       "CN=A, CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\x0ACN=A\\x0A, "
+       "CN= spaces "},
+  };
+  for (const auto &t : kTests) {
+    SCOPED_TRACE(t.printed);
+    bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
+    ASSERT_TRUE(bio);
+    int len = X509_NAME_print_ex(bio.get(), name.get(), t.indent, t.flags);
+    ASSERT_GT(len, 0);
+
+    const uint8_t *printed;
+    size_t printed_len;
+    ASSERT_TRUE(BIO_mem_contents(bio.get(), &printed, &printed_len));
+    EXPECT_EQ(std::string(printed, printed + printed_len), t.printed);
+    if (t.flags != XN_FLAG_COMPAT) {
+      // TODO(davidben): |XN_FLAG_COMPAT| does not return the length.
+      EXPECT_EQ(static_cast<size_t>(len), printed_len);
+
+      // Passing a null |BIO| measures the output instead.
+      len = X509_NAME_print_ex(nullptr, name.get(), t.indent, t.flags);
+      EXPECT_GT(len, 0);
+      EXPECT_EQ(static_cast<size_t>(len), printed_len);
+    }
+  }
+
+  // TODO(davidben): This escapes the underlying bytes in the string, but that
+  // is ambiguous without capturing the type. Should this escape like
+  // |ASN1_STRFLGS_UTF8_CONVERT| instead?
+  static const char *kOnelineComponents[] = {
+      "/C=US",
+      "/ST=Some State",
+      "/ST=Some Other State \\xE2\\x98\\x83",
+      "/ST=\\x00A\\x00n\\x00o\\x00t\\x00h\\x00e\\x00r\\x00 "
+      "\\x00S\\x00t\\x00a\\x00t\\x00e\\x00 &\\x03",
+      "/1.2.840.113554.4.1.72585.2=\\x00\\x00&\\x03",
+      "/1.2.840.113554.4.1.72585.3=0\\x06\\x02\\x01\\x01\\x02\\x01\\x02",
+      "/O=Org Name",
+      "/CN=Common Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\x0ACN=A\\x0A",
+      "/CN= spaces ",
+  };
+  std::string oneline_expected;
+  for (const auto& component : kOnelineComponents) {
+    oneline_expected += component;
+  }
+
+  // Given null buffer, |X509_NAME_oneline| allocates a new output.
+  bssl::UniquePtr<char> oneline(X509_NAME_oneline(name.get(), nullptr, 0));
+  ASSERT_TRUE(oneline);
+  EXPECT_EQ(oneline.get(), oneline_expected);
+
+  // Otherwise it writes to the specified buffer. Note one extra byte is needed
+  // for the trailing NUL.
+  char buf[1024];
+  ASSERT_GE(sizeof(buf), oneline_expected.size() + 2);
+  ASSERT_EQ(buf,
+            X509_NAME_oneline(name.get(), buf, oneline_expected.size() + 1));
+  EXPECT_EQ(buf, oneline_expected);
+
+  memset(buf, 'a', sizeof(buf));
+  ASSERT_EQ(buf,
+            X509_NAME_oneline(name.get(), buf, oneline_expected.size() + 2));
+  EXPECT_EQ(buf, oneline_expected);
+
+  // If the length is too small, |X509_NAME_oneline| truncates at name
+  // entry boundaries.
+  EXPECT_EQ(nullptr, X509_NAME_oneline(name.get(), buf, 0));
+  for (size_t len = 1; len < oneline_expected.size(); len++) {
+    SCOPED_TRACE(len);
+    memset(buf, 'a', sizeof(buf));
+    EXPECT_EQ(buf, X509_NAME_oneline(name.get(), buf, len));
+
+    std::string truncated;
+    for (const auto& component : kOnelineComponents) {
+      if (truncated.size() + strlen(component) + 1 > len) {
+        break;
+      }
+      truncated += component;
+    }
+    EXPECT_EQ(buf, truncated);
+  }
+}
+
+// kLargeSerialPEM is a certificate with a large serial number.
+static const char kLargeSerialPEM[] = R"(
+-----BEGIN CERTIFICATE-----
+MIICZjCCAc+gAwIBAgIQASNFZ4mrze8BI0VniavN7zANBgkqhkiG9w0BAQsFADA2
+MRowGAYDVQQKExFCb3JpbmdTU0wgVEVTVElORzEYMBYGA1UEAxMPSW50ZXJtZWRp
+YXRlIENBMCAXDTE1MDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAyMRowGAYD
+VQQKExFCb3JpbmdTU0wgVEVTVElORzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wgZ8w
+DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMPRTRliCpKEnug6OzI0rJVcQep5p+aT
+9sCg+pj+HVyg/DYTwqZ6qJRKhM+MbkhdJuU7FyqlsBeCeM/OjwMjcY0yEB/xJg1i
+ygfuBztTLuPnHxtSuKwae5MeqSofp3j97sRMnuLcKlHxu8rXoOCAS9BO50uKnPwU
+Ee1iEVqR92FPAgMBAAGjdzB1MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggr
+BgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAZBgNVHQ4EEgQQo3mm9u6v
+uaVeN4wRgDTidTAbBgNVHSMEFDASgBCMGmiotXbbXVd7H40UsgajMA0GCSqGSIb3
+DQEBCwUAA4GBAGP+n4kKGn/8uddYLWTXbUsz+KLuEXNDMyu3vRufLjTpIbP2MCNo
+85fhLeC3fzKuGOk+6QGVLOBBcWDrrLqrmqnWdBMPULDo2QoF71a4GVjeJh+ax/tZ
+PyeGVPUK21TE0LDIxf2a11d1CJw582MgZQIPk4tXk+AcU9EqIceKgECG
+-----END CERTIFICATE-----
+)";
+
+TEST(X509Test, Print) {
+  bssl::UniquePtr<X509> cert(CertFromPEM(kLargeSerialPEM));
+  ASSERT_TRUE(cert);
+
+  bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
+  ASSERT_TRUE(bio);
+  EXPECT_TRUE(X509_print_ex(bio.get(), cert.get(), 0, 0));
+  // Nothing should be left in the error queue.
+  EXPECT_EQ(0u, ERR_peek_error());
+
+  // This output is not guaranteed to be stable, but we assert on it to make
+  // sure something is printed.
+  const uint8_t *data;
+  size_t data_len;
+  ASSERT_TRUE(BIO_mem_contents(bio.get(), &data, &data_len));
+  std::string print(reinterpret_cast<const char*>(data), data_len);
+  EXPECT_EQ(print, R"(Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: O=BoringSSL TESTING, CN=Intermediate CA
+        Validity
+            Not Before: Jan  1 00:00:00 2015 GMT
+            Not After : Jan  1 00:00:00 2100 GMT
+        Subject: O=BoringSSL TESTING, CN=example.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (1024 bit)
+                Modulus:
+                    00:c3:d1:4d:19:62:0a:92:84:9e:e8:3a:3b:32:34:
+                    ac:95:5c:41:ea:79:a7:e6:93:f6:c0:a0:fa:98:fe:
+                    1d:5c:a0:fc:36:13:c2:a6:7a:a8:94:4a:84:cf:8c:
+                    6e:48:5d:26:e5:3b:17:2a:a5:b0:17:82:78:cf:ce:
+                    8f:03:23:71:8d:32:10:1f:f1:26:0d:62:ca:07:ee:
+                    07:3b:53:2e:e3:e7:1f:1b:52:b8:ac:1a:7b:93:1e:
+                    a9:2a:1f:a7:78:fd:ee:c4:4c:9e:e2:dc:2a:51:f1:
+                    bb:ca:d7:a0:e0:80:4b:d0:4e:e7:4b:8a:9c:fc:14:
+                    11:ed:62:11:5a:91:f7:61:4f
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Key Usage: critical
+                Digital Signature, Key Encipherment
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Basic Constraints: critical
+                CA:FALSE
+            X509v3 Subject Key Identifier: 
+                A3:79:A6:F6:EE:AF:B9:A5:5E:37:8C:11:80:34:E2:75
+            X509v3 Authority Key Identifier: 
+                keyid:8C:1A:68:A8:B5:76:DB:5D:57:7B:1F:8D:14:B2:06:A3
+
+    Signature Algorithm: sha256WithRSAEncryption
+         63:fe:9f:89:0a:1a:7f:fc:b9:d7:58:2d:64:d7:6d:4b:33:f8:
+         a2:ee:11:73:43:33:2b:b7:bd:1b:9f:2e:34:e9:21:b3:f6:30:
+         23:68:f3:97:e1:2d:e0:b7:7f:32:ae:18:e9:3e:e9:01:95:2c:
+         e0:41:71:60:eb:ac:ba:ab:9a:a9:d6:74:13:0f:50:b0:e8:d9:
+         0a:05:ef:56:b8:19:58:de:26:1f:9a:c7:fb:59:3f:27:86:54:
+         f5:0a:db:54:c4:d0:b0:c8:c5:fd:9a:d7:57:75:08:9c:39:f3:
+         63:20:65:02:0f:93:8b:57:93:e0:1c:53:d1:2a:21:c7:8a:80:
+         40:86
+)");
+}
+
+TEST(X509Test, AddExt) {
+  bssl::UniquePtr<X509> x509(X509_new());
+  ASSERT_TRUE(x509);
+
+  struct Extension {
+    int nid;
+    bool critical;
+    std::vector<uint8_t> data;
+  };
+  auto expect_extensions = [&](const std::vector<Extension> &exts) {
+    ASSERT_EQ(static_cast<size_t>(X509_get_ext_count(x509.get())), exts.size());
+    for (size_t i = 0; i < exts.size(); i++) {
+      SCOPED_TRACE(i);
+      const X509_EXTENSION *ext = X509_get_ext(x509.get(), static_cast<int>(i));
+      EXPECT_EQ(OBJ_obj2nid(X509_EXTENSION_get_object(ext)), exts[i].nid);
+      EXPECT_EQ(X509_EXTENSION_get_critical(ext), exts[i].critical ? 1 : 0);
+      const ASN1_OCTET_STRING *data = X509_EXTENSION_get_data(ext);
+      EXPECT_EQ(Bytes(ASN1_STRING_get0_data(data), ASN1_STRING_length(data)),
+                Bytes(exts[i].data));
+    }
+  };
+
+  // Make a few sample extensions.
+
+  // SEQUENCE {}
+  std::vector<uint8_t> basic1_der = {0x30, 0x00};
+  const uint8_t *inp = basic1_der.data();
+  bssl::UniquePtr<BASIC_CONSTRAINTS> basic1_obj(
+      d2i_BASIC_CONSTRAINTS(nullptr, &inp, basic1_der.size()));
+  EXPECT_EQ(inp, basic1_der.data() + basic1_der.size());
+
+  // SEQUENCE { BOOLEAN { TRUE } }
+  std::vector<uint8_t> basic2_der = {0x30, 0x03, 0x01, 0x01, 0xff};
+  inp = basic2_der.data();
+  bssl::UniquePtr<BASIC_CONSTRAINTS> basic2_obj(
+      d2i_BASIC_CONSTRAINTS(nullptr, &inp, basic2_der.size()));
+  EXPECT_EQ(inp, basic2_der.data() + basic2_der.size());
+
+  // OCTET_STRING {}
+  std::vector<uint8_t> skid1_der = {0x04, 0x00};
+  inp = skid1_der.data();
+  bssl::UniquePtr<ASN1_OCTET_STRING> skid1_obj(
+      d2i_ASN1_OCTET_STRING(nullptr, &inp, skid1_der.size()));
+  EXPECT_EQ(inp, skid1_der.data() + skid1_der.size());
+
+  // OCTET_STRING { "a" }
+  std::vector<uint8_t> skid2_der = {0x04, 0x01, 0x61};
+  inp = skid2_der.data();
+  bssl::UniquePtr<ASN1_OCTET_STRING> skid2_obj(
+      d2i_ASN1_OCTET_STRING(nullptr, &inp, skid2_der.size()));
+  EXPECT_EQ(inp, skid2_der.data() + skid2_der.size());
+
+  // Initially, the extension list is empty.
+  expect_extensions({});
+
+  // Adding extensions works with the default settings.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic1_obj.get(),
+                           /*crit=*/1, X509V3_ADD_DEFAULT));
+  expect_extensions({{NID_basic_constraints, true, basic1_der}});
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_subject_key_identifier,
+                                 skid1_obj.get(),
+                                 /*crit=*/0, X509V3_ADD_DEFAULT));
+  expect_extensions({{NID_basic_constraints, true, basic1_der},
+                     {NID_subject_key_identifier, false, skid1_der}});
+
+  // By default, we cannot add duplicates.
+  EXPECT_EQ(
+      0, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic2_obj.get(),
+                           /*crit=*/0, X509V3_ADD_DEFAULT));
+  expect_extensions({{NID_basic_constraints, true, basic1_der},
+                     {NID_subject_key_identifier, false, skid1_der}});
+
+  // |X509V3_ADD_KEEP_EXISTING| silently keeps the existing extension if already
+  // present.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic2_obj.get(),
+                           /*crit=*/0, X509V3_ADD_KEEP_EXISTING));
+  expect_extensions({{NID_basic_constraints, true, basic1_der},
+                     {NID_subject_key_identifier, false, skid1_der}});
+
+  // |X509V3_ADD_REPLACE| replaces it.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic2_obj.get(),
+                           /*crit=*/0, X509V3_ADD_REPLACE));
+  expect_extensions({{NID_basic_constraints, false, basic2_der},
+                     {NID_subject_key_identifier, false, skid1_der}});
+
+  // |X509V3_ADD_REPLACE_EXISTING| also replaces matches.
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_subject_key_identifier,
+                                 skid2_obj.get(),
+                                 /*crit=*/1, X509V3_ADD_REPLACE_EXISTING));
+  expect_extensions({{NID_basic_constraints, false, basic2_der},
+                     {NID_subject_key_identifier, true, skid2_der}});
+
+  // |X509V3_ADD_DELETE| ignores the value and deletes the extension.
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+
+  // Not finding an extension to delete is an error.
+  EXPECT_EQ(0, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+
+  // |X509V3_ADD_REPLACE_EXISTING| fails if it cannot find a match.
+  EXPECT_EQ(
+      0, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic1_obj.get(),
+                           /*crit=*/1, X509V3_ADD_REPLACE_EXISTING));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+
+  // |X509V3_ADD_REPLACE| adds a new extension if not preseent.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic1_obj.get(),
+                           /*crit=*/1, X509V3_ADD_REPLACE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der},
+                     {NID_basic_constraints, true, basic1_der}});
+
+  // Delete the extension again.
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+
+  // |X509V3_ADD_KEEP_EXISTING| adds a new extension if not preseent.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic1_obj.get(),
+                           /*crit=*/1, X509V3_ADD_KEEP_EXISTING));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der},
+                     {NID_basic_constraints, true, basic1_der}});
+
+  // Delete the extension again.
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+
+  // |X509V3_ADD_APPEND| adds a new extension if not present.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic1_obj.get(),
+                           /*crit=*/1, X509V3_ADD_APPEND));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der},
+                     {NID_basic_constraints, true, basic1_der}});
+
+  // |X509V3_ADD_APPEND| keeps adding duplicates (invalid) even if present.
+  EXPECT_EQ(
+      1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, basic2_obj.get(),
+                           /*crit=*/0, X509V3_ADD_APPEND));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der},
+                     {NID_basic_constraints, true, basic1_der},
+                     {NID_basic_constraints, false, basic2_der}});
+
+  // |X509V3_ADD_DELETE| only deletes one extension at a time.
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der},
+                     {NID_basic_constraints, false, basic2_der}});
+  EXPECT_EQ(1, X509_add1_ext_i2d(x509.get(), NID_basic_constraints, nullptr, 0,
+                                 X509V3_ADD_DELETE));
+  expect_extensions({{NID_subject_key_identifier, true, skid2_der}});
+}
+
+TEST(X509Test, NameEntry) {
+  bssl::UniquePtr<X509_NAME> name(X509_NAME_new());
+  ASSERT_TRUE(name);
+
+  auto check_name = [&](const char *expected_rfc2253) {
+    // Check RDN indices are self-consistent.
+    int num = X509_NAME_entry_count(name.get());
+    if (num > 0) {
+      // RDN indices must start at zero.
+      EXPECT_EQ(0, X509_NAME_ENTRY_set(X509_NAME_get_entry(name.get(), 0)));
+    }
+    for (int i = 1; i < num; i++) {
+      int prev = X509_NAME_ENTRY_set(X509_NAME_get_entry(name.get(), i - 1));
+      int current = X509_NAME_ENTRY_set(X509_NAME_get_entry(name.get(), i));
+      // RDN indices must increase consecutively.
+      EXPECT_TRUE(prev == current || prev + 1 == current)
+          << "Entry " << i << " has RDN index " << current
+          << " which is inconsistent with previous index " << prev;
+    }
+
+    // Check the name based on the RFC 2253 serialization. Note the RFC 2253
+    // serialization is in reverse.
+    bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
+    ASSERT_TRUE(bio);
+    EXPECT_GE(X509_NAME_print_ex(bio.get(), name.get(), 0, XN_FLAG_RFC2253), 0);
+    const uint8_t *data;
+    size_t len;
+    ASSERT_TRUE(BIO_mem_contents(bio.get(), &data, &len));
+    EXPECT_EQ(expected_rfc2253, std::string(data, data + len));
+  };
+
+  check_name("");
+
+  // |loc| = -1, |set| = 0 appends as new RDNs.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_organizationName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Org"), /*len=*/-1, /*loc=*/-1,
+      /*set=*/0));
+  check_name("O=Org");
+
+  // |loc| = -1, |set| = 0 appends as new RDNs.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_commonName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Name"), /*len=*/-1, /*loc=*/-1,
+      /*set=*/0));
+  check_name("CN=Name,O=Org");
+
+  // Inserting in the middle of the set, but with |set| = 0 inserts a new RDN
+  // and fixes the "set" values as needed.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_organizationalUnitName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Unit"), /*len=*/-1, /*loc=*/1,
+      /*set=*/0));
+  check_name("CN=Name,OU=Unit,O=Org");
+
+  // |set = -1| adds to the previous entry's RDN. (Although putting O and OU at
+  // the same level makes little sense, the test is written this way to check
+  // the function isn't using attribute types to order things.)
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_organizationName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Org2"), /*len=*/-1, /*loc=*/2,
+      /*set=*/-1));
+  check_name("CN=Name,O=Org2+OU=Unit,O=Org");
+
+  // |set| = 1 adds to the next entry's RDN.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_commonName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Name2"), /*len=*/-1, /*loc=*/2,
+      /*set=*/-1));
+  check_name("CN=Name,O=Org2+CN=Name2+OU=Unit,O=Org");
+
+  // If there is no previous RDN, |set| = -1 makes a new RDN.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_countryName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("US"), /*len=*/-1, /*loc=*/0,
+      /*set=*/-1));
+  check_name("CN=Name,O=Org2+CN=Name2+OU=Unit,O=Org,C=US");
+
+  // Likewise if there is no next RDN.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_commonName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Name3"), /*len=*/-1, /*loc=*/-1,
+      /*set=*/1));
+  check_name("CN=Name3,CN=Name,O=Org2+CN=Name2+OU=Unit,O=Org,C=US");
+
+  // If |set| = 0 and we insert in the middle of an existing RDN, it adds an
+  // RDN boundary after the entry but not before. This is a quirk of how the
+  // function is implemented and hopefully not something any caller depends on.
+  ASSERT_TRUE(X509_NAME_add_entry_by_NID(
+      name.get(), NID_commonName, MBSTRING_UTF8,
+      reinterpret_cast<const unsigned char *>("Name4"), /*len=*/-1, /*loc=*/3,
+      /*set=*/0));
+  check_name("CN=Name3,CN=Name,O=Org2+CN=Name2,CN=Name4+OU=Unit,O=Org,C=US");
+
+  // Entries may be deleted.
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 7));
+  check_name("CN=Name,O=Org2+CN=Name2,CN=Name4+OU=Unit,O=Org,C=US");
+
+  // When deleting the only attribute in an RDN, index invariants should still
+  // hold.
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 0));
+  check_name("CN=Name,O=Org2+CN=Name2,CN=Name4+OU=Unit,O=Org");
+
+  // Index invariants also hold when deleting attributes from non-singular RDNs.
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 1));
+  check_name("CN=Name,O=Org2+CN=Name2,CN=Name4,O=Org");
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 1));
+  check_name("CN=Name,O=Org2+CN=Name2,O=Org");
+
+  // Same as above, but delete the second attribute first.
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 2));
+  check_name("CN=Name,CN=Name2,O=Org");
+  X509_NAME_ENTRY_free(X509_NAME_delete_entry(name.get(), 1));
+  check_name("CN=Name,O=Org");
+}
+
+// Tests that non-integer types are rejected when passed as an argument to
+// X509_set_serialNumber().
+TEST(X509Test, SetSerialNumberChecksASN1StringType) {
+  bssl::UniquePtr<X509> root = CertFromPEM(kRootCAPEM);
+  ASSERT_TRUE(root);
+
+  // Passing an IA5String to X509_set_serialNumber() should fail.
+  bssl::UniquePtr<ASN1_IA5STRING> str(ASN1_IA5STRING_new());
+  ASSERT_TRUE(str);
+  EXPECT_FALSE(X509_set_serialNumber(root.get(), str.get()));
+
+  // Passing a negative serial number is allowed. While invalid, we do accept
+  // them and some callers rely in this for tests.
+  bssl::UniquePtr<ASN1_INTEGER> serial(ASN1_INTEGER_new());
+  ASSERT_TRUE(serial);
+  ASSERT_TRUE(ASN1_INTEGER_set_int64(serial.get(), -1));
+  ASSERT_TRUE(X509_set_serialNumber(root.get(), serial.get()));
+  int64_t val;
+  ASSERT_TRUE(ASN1_INTEGER_get_int64(&val, X509_get0_serialNumber(root.get())));
+  EXPECT_EQ(-1, val);
 }
diff --git a/src/crypto/x509/x509_trs.c b/src/crypto/x509/x509_trs.c
index c95d6fc..49c66c1 100644
--- a/src/crypto/x509/x509_trs.c
+++ b/src/crypto/x509/x509_trs.c
@@ -71,13 +71,10 @@
 static int trust_compat(X509_TRUST *trust, X509 *x, int flags);
 
 static int obj_trust(int id, X509 *x, int flags);
-static int (*default_trust) (int id, X509 *x, int flags) = obj_trust;
 
-/*
- * WARNING: the following table should be kept in order of trust and without
- * any gaps so we can just subtract the minimum trust value to get an index
- * into the table
- */
+// WARNING: the following table should be kept in order of trust and without
+// any gaps so we can just subtract the minimum trust value to get an index
+// into the table
 
 static X509_TRUST trstandard[] = {
     {X509_TRUST_COMPAT, 0, trust_compat, (char *)"compatible", 0, NULL},
@@ -94,238 +91,224 @@
     {X509_TRUST_OCSP_REQUEST, 0, trust_1oid, (char *)"OCSP request",
      NID_ad_OCSP, NULL},
     {X509_TRUST_TSA, 0, trust_1oidany, (char *)"TSA server", NID_time_stamp,
-     NULL}
-};
+     NULL}};
 
-#define X509_TRUST_COUNT        (sizeof(trstandard)/sizeof(X509_TRUST))
+#define X509_TRUST_COUNT (sizeof(trstandard) / sizeof(X509_TRUST))
 
 static STACK_OF(X509_TRUST) *trtable = NULL;
 
-static int tr_cmp(const X509_TRUST **a, const X509_TRUST **b)
-{
-    return (*a)->trust - (*b)->trust;
+static int tr_cmp(const X509_TRUST **a, const X509_TRUST **b) {
+  return (*a)->trust - (*b)->trust;
 }
 
-int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *,
-                                                                int) {
-    int (*oldtrust) (int, X509 *, int);
-    oldtrust = default_trust;
-    default_trust = trust;
-    return oldtrust;
-}
-
-int X509_check_trust(X509 *x, int id, int flags)
-{
-    X509_TRUST *pt;
-    int idx;
-    if (id == -1)
-        return 1;
-    /* We get this as a default value */
-    if (id == 0) {
-        int rv;
-        rv = obj_trust(NID_anyExtendedKeyUsage, x, 0);
-        if (rv != X509_TRUST_UNTRUSTED)
-            return rv;
-        return trust_compat(NULL, x, 0);
-    }
-    idx = X509_TRUST_get_by_id(id);
-    if (idx == -1)
-        return default_trust(id, x, flags);
-    pt = X509_TRUST_get0(idx);
-    return pt->check_trust(pt, x, flags);
-}
-
-int X509_TRUST_get_count(void)
-{
-    if (!trtable)
-        return X509_TRUST_COUNT;
-    return sk_X509_TRUST_num(trtable) + X509_TRUST_COUNT;
-}
-
-X509_TRUST *X509_TRUST_get0(int idx)
-{
-    if (idx < 0)
-        return NULL;
-    if (idx < (int)X509_TRUST_COUNT)
-        return trstandard + idx;
-    return sk_X509_TRUST_value(trtable, idx - X509_TRUST_COUNT);
-}
-
-int X509_TRUST_get_by_id(int id)
-{
-    X509_TRUST tmp;
-    size_t idx;
-
-    if ((id >= X509_TRUST_MIN) && (id <= X509_TRUST_MAX))
-        return id - X509_TRUST_MIN;
-    tmp.trust = id;
-    if (!trtable)
-        return -1;
-    sk_X509_TRUST_sort(trtable);
-    if (!sk_X509_TRUST_find(trtable, &idx, &tmp)) {
-        return -1;
-    }
-    return idx + X509_TRUST_COUNT;
-}
-
-int X509_TRUST_set(int *t, int trust)
-{
-    if (X509_TRUST_get_by_id(trust) == -1) {
-        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_TRUST);
-        return 0;
-    }
-    *t = trust;
+int X509_check_trust(X509 *x, int id, int flags) {
+  X509_TRUST *pt;
+  int idx;
+  if (id == -1) {
     return 1;
+  }
+  // We get this as a default value
+  if (id == 0) {
+    int rv;
+    rv = obj_trust(NID_anyExtendedKeyUsage, x, 0);
+    if (rv != X509_TRUST_UNTRUSTED) {
+      return rv;
+    }
+    return trust_compat(NULL, x, 0);
+  }
+  idx = X509_TRUST_get_by_id(id);
+  if (idx == -1) {
+    return obj_trust(id, x, flags);
+  }
+  pt = X509_TRUST_get0(idx);
+  return pt->check_trust(pt, x, flags);
 }
 
-int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int),
-                   char *name, int arg1, void *arg2)
-{
-    int idx;
-    X509_TRUST *trtmp;
-    char *name_dup;
+int X509_TRUST_get_count(void) {
+  if (!trtable) {
+    return X509_TRUST_COUNT;
+  }
+  return sk_X509_TRUST_num(trtable) + X509_TRUST_COUNT;
+}
 
-    /*
-     * This is set according to what we change: application can't set it
-     */
-    flags &= ~X509_TRUST_DYNAMIC;
-    /* This will always be set for application modified trust entries */
-    flags |= X509_TRUST_DYNAMIC_NAME;
-    /* Get existing entry if any */
-    idx = X509_TRUST_get_by_id(id);
-    /* Need a new entry */
+X509_TRUST *X509_TRUST_get0(int idx) {
+  if (idx < 0) {
+    return NULL;
+  }
+  if (idx < (int)X509_TRUST_COUNT) {
+    return trstandard + idx;
+  }
+  return sk_X509_TRUST_value(trtable, idx - X509_TRUST_COUNT);
+}
+
+int X509_TRUST_get_by_id(int id) {
+  X509_TRUST tmp;
+  size_t idx;
+
+  if ((id >= X509_TRUST_MIN) && (id <= X509_TRUST_MAX)) {
+    return id - X509_TRUST_MIN;
+  }
+  tmp.trust = id;
+  if (!trtable) {
+    return -1;
+  }
+  sk_X509_TRUST_sort(trtable);
+  if (!sk_X509_TRUST_find(trtable, &idx, &tmp)) {
+    return -1;
+  }
+  return idx + X509_TRUST_COUNT;
+}
+
+int X509_TRUST_set(int *t, int trust) {
+  if (X509_TRUST_get_by_id(trust) == -1) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_TRUST);
+    return 0;
+  }
+  *t = trust;
+  return 1;
+}
+
+int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
+                   char *name, int arg1, void *arg2) {
+  int idx;
+  X509_TRUST *trtmp;
+  char *name_dup;
+
+  // This is set according to what we change: application can't set it
+  flags &= ~X509_TRUST_DYNAMIC;
+  // This will always be set for application modified trust entries
+  flags |= X509_TRUST_DYNAMIC_NAME;
+  // Get existing entry if any
+  idx = X509_TRUST_get_by_id(id);
+  // Need a new entry
+  if (idx == -1) {
+    if (!(trtmp = OPENSSL_malloc(sizeof(X509_TRUST)))) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+    trtmp->flags = X509_TRUST_DYNAMIC;
+  } else {
+    trtmp = X509_TRUST_get0(idx);
+  }
+
+  // Duplicate the supplied name.
+  name_dup = OPENSSL_strdup(name);
+  if (name_dup == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
     if (idx == -1) {
-        if (!(trtmp = OPENSSL_malloc(sizeof(X509_TRUST)))) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-            return 0;
-        }
-        trtmp->flags = X509_TRUST_DYNAMIC;
-    } else
-        trtmp = X509_TRUST_get0(idx);
-
-    /* Duplicate the supplied name. */
-    name_dup = OPENSSL_strdup(name);
-    if (name_dup == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        if (idx == -1)
-            OPENSSL_free(trtmp);
-        return 0;
+      OPENSSL_free(trtmp);
     }
+    return 0;
+  }
 
-    /* OPENSSL_free existing name if dynamic */
-    if (trtmp->flags & X509_TRUST_DYNAMIC_NAME)
-        OPENSSL_free(trtmp->name);
-    trtmp->name = name_dup;
-    /* Keep the dynamic flag of existing entry */
-    trtmp->flags &= X509_TRUST_DYNAMIC;
-    /* Set all other flags */
-    trtmp->flags |= flags;
+  // OPENSSL_free existing name if dynamic
+  if (trtmp->flags & X509_TRUST_DYNAMIC_NAME) {
+    OPENSSL_free(trtmp->name);
+  }
+  trtmp->name = name_dup;
+  // Keep the dynamic flag of existing entry
+  trtmp->flags &= X509_TRUST_DYNAMIC;
+  // Set all other flags
+  trtmp->flags |= flags;
 
-    trtmp->trust = id;
-    trtmp->check_trust = ck;
-    trtmp->arg1 = arg1;
-    trtmp->arg2 = arg2;
+  trtmp->trust = id;
+  trtmp->check_trust = ck;
+  trtmp->arg1 = arg1;
+  trtmp->arg2 = arg2;
 
-    /* If its a new entry manage the dynamic table */
-    if (idx == -1) {
-        if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-            trtable_free(trtmp);
-            return 0;
-        }
-        if (!sk_X509_TRUST_push(trtable, trtmp)) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-            trtable_free(trtmp);
-            return 0;
-        }
+  // If its a new entry manage the dynamic table
+  if (idx == -1) {
+    if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+      trtable_free(trtmp);
+      return 0;
     }
-    return 1;
-}
-
-static void trtable_free(X509_TRUST *p)
-{
-    if (!p)
-        return;
-    if (p->flags & X509_TRUST_DYNAMIC) {
-        if (p->flags & X509_TRUST_DYNAMIC_NAME)
-            OPENSSL_free(p->name);
-        OPENSSL_free(p);
+    if (!sk_X509_TRUST_push(trtable, trtmp)) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+      trtable_free(trtmp);
+      return 0;
     }
+  }
+  return 1;
 }
 
-void X509_TRUST_cleanup(void)
-{
-    unsigned int i;
-    for (i = 0; i < X509_TRUST_COUNT; i++)
-        trtable_free(trstandard + i);
-    sk_X509_TRUST_pop_free(trtable, trtable_free);
-    trtable = NULL;
+static void trtable_free(X509_TRUST *p) {
+  if (!p) {
+    return;
+  }
+  if (p->flags & X509_TRUST_DYNAMIC) {
+    if (p->flags & X509_TRUST_DYNAMIC_NAME) {
+      OPENSSL_free(p->name);
+    }
+    OPENSSL_free(p);
+  }
 }
 
-int X509_TRUST_get_flags(const X509_TRUST *xp)
-{
-    return xp->flags;
+void X509_TRUST_cleanup(void) {
+  unsigned int i;
+  for (i = 0; i < X509_TRUST_COUNT; i++) {
+    trtable_free(trstandard + i);
+  }
+  sk_X509_TRUST_pop_free(trtable, trtable_free);
+  trtable = NULL;
 }
 
-char *X509_TRUST_get0_name(const X509_TRUST *xp)
-{
-    return xp->name;
+int X509_TRUST_get_flags(const X509_TRUST *xp) { return xp->flags; }
+
+char *X509_TRUST_get0_name(const X509_TRUST *xp) { return xp->name; }
+
+int X509_TRUST_get_trust(const X509_TRUST *xp) { return xp->trust; }
+
+static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags) {
+  if (x->aux && (x->aux->trust || x->aux->reject)) {
+    return obj_trust(trust->arg1, x, flags);
+  }
+  // we don't have any trust settings: for compatibility we return trusted
+  // if it is self signed
+  return trust_compat(trust, x, flags);
 }
 
-int X509_TRUST_get_trust(const X509_TRUST *xp)
-{
-    return xp->trust;
+static int trust_1oid(X509_TRUST *trust, X509 *x, int flags) {
+  if (x->aux) {
+    return obj_trust(trust->arg1, x, flags);
+  }
+  return X509_TRUST_UNTRUSTED;
 }
 
-static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
-{
-    if (x->aux && (x->aux->trust || x->aux->reject))
-        return obj_trust(trust->arg1, x, flags);
-    /*
-     * we don't have any trust settings: for compatibility we return trusted
-     * if it is self signed
-     */
-    return trust_compat(trust, x, flags);
-}
-
-static int trust_1oid(X509_TRUST *trust, X509 *x, int flags)
-{
-    if (x->aux)
-        return obj_trust(trust->arg1, x, flags);
+static int trust_compat(X509_TRUST *trust, X509 *x, int flags) {
+  if (!x509v3_cache_extensions(x)) {
     return X509_TRUST_UNTRUSTED;
+  }
+  if (x->ex_flags & EXFLAG_SS) {
+    return X509_TRUST_TRUSTED;
+  } else {
+    return X509_TRUST_UNTRUSTED;
+  }
 }
 
-static int trust_compat(X509_TRUST *trust, X509 *x, int flags)
-{
-    if (!x509v3_cache_extensions(x))
-        return X509_TRUST_UNTRUSTED;
-    if (x->ex_flags & EXFLAG_SS)
+static int obj_trust(int id, X509 *x, int flags) {
+  ASN1_OBJECT *obj;
+  size_t i;
+  X509_CERT_AUX *ax;
+  ax = x->aux;
+  if (!ax) {
+    return X509_TRUST_UNTRUSTED;
+  }
+  if (ax->reject) {
+    for (i = 0; i < sk_ASN1_OBJECT_num(ax->reject); i++) {
+      obj = sk_ASN1_OBJECT_value(ax->reject, i);
+      if (OBJ_obj2nid(obj) == id) {
+        return X509_TRUST_REJECTED;
+      }
+    }
+  }
+  if (ax->trust) {
+    for (i = 0; i < sk_ASN1_OBJECT_num(ax->trust); i++) {
+      obj = sk_ASN1_OBJECT_value(ax->trust, i);
+      if (OBJ_obj2nid(obj) == id) {
         return X509_TRUST_TRUSTED;
-    else
-        return X509_TRUST_UNTRUSTED;
-}
-
-static int obj_trust(int id, X509 *x, int flags)
-{
-    ASN1_OBJECT *obj;
-    size_t i;
-    X509_CERT_AUX *ax;
-    ax = x->aux;
-    if (!ax)
-        return X509_TRUST_UNTRUSTED;
-    if (ax->reject) {
-        for (i = 0; i < sk_ASN1_OBJECT_num(ax->reject); i++) {
-            obj = sk_ASN1_OBJECT_value(ax->reject, i);
-            if (OBJ_obj2nid(obj) == id)
-                return X509_TRUST_REJECTED;
-        }
+      }
     }
-    if (ax->trust) {
-        for (i = 0; i < sk_ASN1_OBJECT_num(ax->trust); i++) {
-            obj = sk_ASN1_OBJECT_value(ax->trust, i);
-            if (OBJ_obj2nid(obj) == id)
-                return X509_TRUST_TRUSTED;
-        }
-    }
-    return X509_TRUST_UNTRUSTED;
+  }
+  return X509_TRUST_UNTRUSTED;
 }
diff --git a/src/crypto/x509/x509_txt.c b/src/crypto/x509/x509_txt.c
index 17e14a6..45e8322 100644
--- a/src/crypto/x509/x509_txt.c
+++ b/src/crypto/x509/x509_txt.c
@@ -56,149 +56,134 @@
 
 #include <openssl/x509.h>
 
-const char *X509_verify_cert_error_string(long err)
-{
-    switch (err) {
+const char *X509_verify_cert_error_string(long err) {
+  switch (err) {
     case X509_V_OK:
-        return "ok";
+      return "ok";
     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
-        return "unable to get issuer certificate";
+      return "unable to get issuer certificate";
     case X509_V_ERR_UNABLE_TO_GET_CRL:
-        return "unable to get certificate CRL";
+      return "unable to get certificate CRL";
     case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
-        return "unable to decrypt certificate's signature";
+      return "unable to decrypt certificate's signature";
     case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
-        return "unable to decrypt CRL's signature";
+      return "unable to decrypt CRL's signature";
     case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
-        return "unable to decode issuer public key";
+      return "unable to decode issuer public key";
     case X509_V_ERR_CERT_SIGNATURE_FAILURE:
-        return "certificate signature failure";
+      return "certificate signature failure";
     case X509_V_ERR_CRL_SIGNATURE_FAILURE:
-        return "CRL signature failure";
+      return "CRL signature failure";
     case X509_V_ERR_CERT_NOT_YET_VALID:
-        return "certificate is not yet valid";
+      return "certificate is not yet valid";
     case X509_V_ERR_CRL_NOT_YET_VALID:
-        return "CRL is not yet valid";
+      return "CRL is not yet valid";
     case X509_V_ERR_CERT_HAS_EXPIRED:
-        return "certificate has expired";
+      return "certificate has expired";
     case X509_V_ERR_CRL_HAS_EXPIRED:
-        return "CRL has expired";
+      return "CRL has expired";
     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
-        return "format error in certificate's notBefore field";
+      return "format error in certificate's notBefore field";
     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
-        return "format error in certificate's notAfter field";
+      return "format error in certificate's notAfter field";
     case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
-        return "format error in CRL's lastUpdate field";
+      return "format error in CRL's lastUpdate field";
     case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
-        return "format error in CRL's nextUpdate field";
+      return "format error in CRL's nextUpdate field";
     case X509_V_ERR_OUT_OF_MEM:
-        return "out of memory";
+      return "out of memory";
     case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
-        return "self signed certificate";
+      return "self signed certificate";
     case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
-        return "self signed certificate in certificate chain";
+      return "self signed certificate in certificate chain";
     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
-        return "unable to get local issuer certificate";
+      return "unable to get local issuer certificate";
     case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
-        return "unable to verify the first certificate";
+      return "unable to verify the first certificate";
     case X509_V_ERR_CERT_CHAIN_TOO_LONG:
-        return "certificate chain too long";
+      return "certificate chain too long";
     case X509_V_ERR_CERT_REVOKED:
-        return "certificate revoked";
+      return "certificate revoked";
     case X509_V_ERR_INVALID_CA:
-        return "invalid CA certificate";
+      return "invalid CA certificate";
     case X509_V_ERR_INVALID_NON_CA:
-        return "invalid non-CA certificate (has CA markings)";
+      return "invalid non-CA certificate (has CA markings)";
     case X509_V_ERR_PATH_LENGTH_EXCEEDED:
-        return "path length constraint exceeded";
+      return "path length constraint exceeded";
     case X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED:
-        return "proxy path length constraint exceeded";
+      return "proxy path length constraint exceeded";
     case X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED:
-        return
-            "proxy certificates not allowed, please set the appropriate flag";
+      return "proxy certificates not allowed, please set the appropriate flag";
     case X509_V_ERR_INVALID_PURPOSE:
-        return "unsupported certificate purpose";
+      return "unsupported certificate purpose";
     case X509_V_ERR_CERT_UNTRUSTED:
-        return "certificate not trusted";
+      return "certificate not trusted";
     case X509_V_ERR_CERT_REJECTED:
-        return "certificate rejected";
+      return "certificate rejected";
     case X509_V_ERR_APPLICATION_VERIFICATION:
-        return "application verification failure";
+      return "application verification failure";
     case X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
-        return "subject issuer mismatch";
+      return "subject issuer mismatch";
     case X509_V_ERR_AKID_SKID_MISMATCH:
-        return "authority and subject key identifier mismatch";
+      return "authority and subject key identifier mismatch";
     case X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH:
-        return "authority and issuer serial number mismatch";
+      return "authority and issuer serial number mismatch";
     case X509_V_ERR_KEYUSAGE_NO_CERTSIGN:
-        return "key usage does not include certificate signing";
+      return "key usage does not include certificate signing";
     case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
-        return "unable to get CRL issuer certificate";
+      return "unable to get CRL issuer certificate";
     case X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION:
-        return "unhandled critical extension";
+      return "unhandled critical extension";
     case X509_V_ERR_KEYUSAGE_NO_CRL_SIGN:
-        return "key usage does not include CRL signing";
+      return "key usage does not include CRL signing";
     case X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE:
-        return "key usage does not include digital signature";
+      return "key usage does not include digital signature";
     case X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION:
-        return "unhandled critical CRL extension";
+      return "unhandled critical CRL extension";
     case X509_V_ERR_INVALID_EXTENSION:
-        return "invalid or inconsistent certificate extension";
+      return "invalid or inconsistent certificate extension";
     case X509_V_ERR_INVALID_POLICY_EXTENSION:
-        return "invalid or inconsistent certificate policy extension";
+      return "invalid or inconsistent certificate policy extension";
     case X509_V_ERR_NO_EXPLICIT_POLICY:
-        return "no explicit policy";
+      return "no explicit policy";
     case X509_V_ERR_DIFFERENT_CRL_SCOPE:
-        return "Different CRL scope";
+      return "Different CRL scope";
     case X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE:
-        return "Unsupported extension feature";
+      return "Unsupported extension feature";
     case X509_V_ERR_UNNESTED_RESOURCE:
-        return "RFC 3779 resource not subset of parent's resources";
+      return "RFC 3779 resource not subset of parent's resources";
 
     case X509_V_ERR_PERMITTED_VIOLATION:
-        return "permitted subtree violation";
+      return "permitted subtree violation";
     case X509_V_ERR_EXCLUDED_VIOLATION:
-        return "excluded subtree violation";
+      return "excluded subtree violation";
     case X509_V_ERR_SUBTREE_MINMAX:
-        return "name constraints minimum and maximum not supported";
+      return "name constraints minimum and maximum not supported";
     case X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE:
-        return "unsupported name constraint type";
+      return "unsupported name constraint type";
     case X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX:
-        return "unsupported or invalid name constraint syntax";
+      return "unsupported or invalid name constraint syntax";
     case X509_V_ERR_UNSUPPORTED_NAME_SYNTAX:
-        return "unsupported or invalid name syntax";
+      return "unsupported or invalid name syntax";
     case X509_V_ERR_CRL_PATH_VALIDATION_ERROR:
-        return "CRL path validation error";
-
-    case X509_V_ERR_SUITE_B_INVALID_VERSION:
-        return "Suite B: certificate version invalid";
-    case X509_V_ERR_SUITE_B_INVALID_ALGORITHM:
-        return "Suite B: invalid public key algorithm";
-    case X509_V_ERR_SUITE_B_INVALID_CURVE:
-        return "Suite B: invalid ECC curve";
-    case X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM:
-        return "Suite B: invalid signature algorithm";
-    case X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED:
-        return "Suite B: curve not allowed for this LOS";
-    case X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256:
-        return "Suite B: cannot sign P-384 with P-256";
+      return "CRL path validation error";
 
     case X509_V_ERR_HOSTNAME_MISMATCH:
-        return "Hostname mismatch";
+      return "Hostname mismatch";
     case X509_V_ERR_EMAIL_MISMATCH:
-        return "Email address mismatch";
+      return "Email address mismatch";
     case X509_V_ERR_IP_ADDRESS_MISMATCH:
-        return "IP address mismatch";
+      return "IP address mismatch";
 
     case X509_V_ERR_INVALID_CALL:
-        return "Invalid certificate verification context";
+      return "Invalid certificate verification context";
     case X509_V_ERR_STORE_LOOKUP:
-        return "Issuer certificate lookup error";
+      return "Issuer certificate lookup error";
 
     case X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS:
-        return "Issuer has name constraints but leaf has no SANs";
+      return "Issuer has name constraints but leaf has no SANs";
 
     default:
-        return "unknown certificate verification error";
-    }
+      return "unknown certificate verification error";
+  }
 }
diff --git a/src/crypto/x509/x509_v3.c b/src/crypto/x509/x509_v3.c
index 985161d..4b88ea7 100644
--- a/src/crypto/x509/x509_v3.c
+++ b/src/crypto/x509/x509_v3.c
@@ -65,217 +65,228 @@
 #include "internal.h"
 
 
-int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x)
-{
-    if (x == NULL)
-        return (0);
-    return (sk_X509_EXTENSION_num(x));
+int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x) {
+  if (x == NULL) {
+    return 0;
+  }
+  return (sk_X509_EXTENSION_num(x));
 }
 
 int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid,
-                          int lastpos)
-{
-    const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        return -1;
-    }
-    return X509v3_get_ext_by_OBJ(x, obj, lastpos);
+                          int lastpos) {
+  const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    return -1;
+  }
+  return X509v3_get_ext_by_OBJ(x, obj, lastpos);
 }
 
 int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk,
-                          const ASN1_OBJECT *obj, int lastpos)
-{
-    int n;
-    X509_EXTENSION *ex;
+                          const ASN1_OBJECT *obj, int lastpos) {
+  int n;
+  X509_EXTENSION *ex;
 
-    if (sk == NULL)
-        return (-1);
-    lastpos++;
-    if (lastpos < 0)
-        lastpos = 0;
-    n = sk_X509_EXTENSION_num(sk);
-    for (; lastpos < n; lastpos++) {
-        ex = sk_X509_EXTENSION_value(sk, lastpos);
-        if (OBJ_cmp(ex->object, obj) == 0)
-            return (lastpos);
+  if (sk == NULL) {
+    return -1;
+  }
+  lastpos++;
+  if (lastpos < 0) {
+    lastpos = 0;
+  }
+  n = sk_X509_EXTENSION_num(sk);
+  for (; lastpos < n; lastpos++) {
+    ex = sk_X509_EXTENSION_value(sk, lastpos);
+    if (OBJ_cmp(ex->object, obj) == 0) {
+      return lastpos;
     }
-    return (-1);
+  }
+  return -1;
 }
 
 int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit,
-                               int lastpos)
-{
-    if (sk == NULL) {
-        return -1;
-    }
-
-    lastpos++;
-    if (lastpos < 0) {
-        lastpos = 0;
-    }
-
-    crit = !!crit;
-    int n = sk_X509_EXTENSION_num(sk);
-    for (; lastpos < n; lastpos++) {
-        const X509_EXTENSION *ex = sk_X509_EXTENSION_value(sk, lastpos);
-        if (X509_EXTENSION_get_critical(ex) == crit) {
-            return lastpos;
-        }
-    }
+                               int lastpos) {
+  if (sk == NULL) {
     return -1;
+  }
+
+  lastpos++;
+  if (lastpos < 0) {
+    lastpos = 0;
+  }
+
+  crit = !!crit;
+  int n = sk_X509_EXTENSION_num(sk);
+  for (; lastpos < n; lastpos++) {
+    const X509_EXTENSION *ex = sk_X509_EXTENSION_value(sk, lastpos);
+    if (X509_EXTENSION_get_critical(ex) == crit) {
+      return lastpos;
+    }
+  }
+  return -1;
 }
 
-X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc)
-{
-    if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc)
-        return NULL;
-    else
-        return sk_X509_EXTENSION_value(x, loc);
+X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc) {
+  if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) {
+    return NULL;
+  } else {
+    return sk_X509_EXTENSION_value(x, loc);
+  }
 }
 
-X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc)
-{
-    X509_EXTENSION *ret;
+X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc) {
+  X509_EXTENSION *ret;
 
-    if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc)
-        return (NULL);
-    ret = sk_X509_EXTENSION_delete(x, loc);
-    return (ret);
+  if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) {
+    return NULL;
+  }
+  ret = sk_X509_EXTENSION_delete(x, loc);
+  return ret;
 }
 
 STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
-                                         X509_EXTENSION *ex, int loc)
-{
-    X509_EXTENSION *new_ex = NULL;
-    int n;
-    STACK_OF(X509_EXTENSION) *sk = NULL;
+                                         const X509_EXTENSION *ex, int loc) {
+  X509_EXTENSION *new_ex = NULL;
+  int n;
+  STACK_OF(X509_EXTENSION) *sk = NULL;
 
-    if (x == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-        goto err2;
+  if (x == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
+    goto err2;
+  }
+
+  if (*x == NULL) {
+    if ((sk = sk_X509_EXTENSION_new_null()) == NULL) {
+      goto err;
     }
+  } else {
+    sk = *x;
+  }
 
-    if (*x == NULL) {
-        if ((sk = sk_X509_EXTENSION_new_null()) == NULL)
-            goto err;
-    } else
-        sk = *x;
+  n = sk_X509_EXTENSION_num(sk);
+  if (loc > n) {
+    loc = n;
+  } else if (loc < 0) {
+    loc = n;
+  }
 
-    n = sk_X509_EXTENSION_num(sk);
-    if (loc > n)
-        loc = n;
-    else if (loc < 0)
-        loc = n;
-
-    if ((new_ex = X509_EXTENSION_dup(ex)) == NULL)
-        goto err2;
-    if (!sk_X509_EXTENSION_insert(sk, new_ex, loc))
-        goto err;
-    if (*x == NULL)
-        *x = sk;
-    return (sk);
- err:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
- err2:
-    X509_EXTENSION_free(new_ex);
-    sk_X509_EXTENSION_free(sk);
-    return NULL;
+  if ((new_ex = X509_EXTENSION_dup(ex)) == NULL) {
+    goto err2;
+  }
+  if (!sk_X509_EXTENSION_insert(sk, new_ex, loc)) {
+    goto err;
+  }
+  if (*x == NULL) {
+    *x = sk;
+  }
+  return sk;
+err:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+err2:
+  X509_EXTENSION_free(new_ex);
+  sk_X509_EXTENSION_free(sk);
+  return NULL;
 }
 
 X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid,
                                              int crit,
-                                             const ASN1_OCTET_STRING *data)
-{
-    const ASN1_OBJECT *obj;
-    X509_EXTENSION *ret;
+                                             const ASN1_OCTET_STRING *data) {
+  const ASN1_OBJECT *obj;
+  X509_EXTENSION *ret;
 
-    obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
-        return (NULL);
-    }
-    ret = X509_EXTENSION_create_by_OBJ(ex, obj, crit, data);
-    return (ret);
+  obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
+    return NULL;
+  }
+  ret = X509_EXTENSION_create_by_OBJ(ex, obj, crit, data);
+  return ret;
 }
 
 X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
                                              const ASN1_OBJECT *obj, int crit,
-                                             const ASN1_OCTET_STRING *data)
-{
-    X509_EXTENSION *ret;
+                                             const ASN1_OCTET_STRING *data) {
+  X509_EXTENSION *ret;
 
-    if ((ex == NULL) || (*ex == NULL)) {
-        if ((ret = X509_EXTENSION_new()) == NULL) {
-            OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-            return (NULL);
-        }
-    } else
-        ret = *ex;
+  if ((ex == NULL) || (*ex == NULL)) {
+    if ((ret = X509_EXTENSION_new()) == NULL) {
+      OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+      return NULL;
+    }
+  } else {
+    ret = *ex;
+  }
 
-    if (!X509_EXTENSION_set_object(ret, obj))
-        goto err;
-    if (!X509_EXTENSION_set_critical(ret, crit))
-        goto err;
-    if (!X509_EXTENSION_set_data(ret, data))
-        goto err;
+  if (!X509_EXTENSION_set_object(ret, obj)) {
+    goto err;
+  }
+  if (!X509_EXTENSION_set_critical(ret, crit)) {
+    goto err;
+  }
+  if (!X509_EXTENSION_set_data(ret, data)) {
+    goto err;
+  }
 
-    if ((ex != NULL) && (*ex == NULL))
-        *ex = ret;
-    return (ret);
- err:
-    if ((ex == NULL) || (ret != *ex))
-        X509_EXTENSION_free(ret);
-    return (NULL);
+  if ((ex != NULL) && (*ex == NULL)) {
+    *ex = ret;
+  }
+  return ret;
+err:
+  if ((ex == NULL) || (ret != *ex)) {
+    X509_EXTENSION_free(ret);
+  }
+  return NULL;
 }
 
-int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj)
-{
-    if ((ex == NULL) || (obj == NULL))
-        return (0);
-    ASN1_OBJECT_free(ex->object);
-    ex->object = OBJ_dup(obj);
-    return ex->object != NULL;
-}
-
-int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit)
-{
-    if (ex == NULL)
-        return (0);
-    ex->critical = (crit) ? 0xFF : -1;
-    return (1);
-}
-
-int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data)
-{
-    int i;
-
-    if (ex == NULL)
-        return (0);
-    i = ASN1_OCTET_STRING_set(ex->value, data->data, data->length);
-    if (!i)
-        return (0);
-    return (1);
-}
-
-ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex)
-{
-    if (ex == NULL)
-        return (NULL);
-    return (ex->object);
-}
-
-ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ex)
-{
-    if (ex == NULL)
-        return (NULL);
-    return (ex->value);
-}
-
-int X509_EXTENSION_get_critical(const X509_EXTENSION *ex)
-{
-    if (ex == NULL)
-        return (0);
-    if (ex->critical > 0)
-        return 1;
+int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj) {
+  if ((ex == NULL) || (obj == NULL)) {
     return 0;
+  }
+  ASN1_OBJECT_free(ex->object);
+  ex->object = OBJ_dup(obj);
+  return ex->object != NULL;
+}
+
+int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit) {
+  if (ex == NULL) {
+    return 0;
+  }
+  ex->critical = (crit) ? 0xFF : -1;
+  return 1;
+}
+
+int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data) {
+  int i;
+
+  if (ex == NULL) {
+    return 0;
+  }
+  i = ASN1_OCTET_STRING_set(ex->value, data->data, data->length);
+  if (!i) {
+    return 0;
+  }
+  return 1;
+}
+
+ASN1_OBJECT *X509_EXTENSION_get_object(const X509_EXTENSION *ex) {
+  if (ex == NULL) {
+    return NULL;
+  }
+  return ex->object;
+}
+
+ASN1_OCTET_STRING *X509_EXTENSION_get_data(const X509_EXTENSION *ex) {
+  if (ex == NULL) {
+    return NULL;
+  }
+  return ex->value;
+}
+
+int X509_EXTENSION_get_critical(const X509_EXTENSION *ex) {
+  if (ex == NULL) {
+    return 0;
+  }
+  if (ex->critical > 0) {
+    return 1;
+  }
+  return 0;
 }
diff --git a/src/crypto/x509/x509_vfy.c b/src/crypto/x509/x509_vfy.c
index 2dfdce2..7d445f7 100644
--- a/src/crypto/x509/x509_vfy.c
+++ b/src/crypto/x509/x509_vfy.c
@@ -67,50 +67,51 @@
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
-#include "internal.h"
 #include "../internal.h"
 #include "../x509v3/internal.h"
+#include "internal.h"
 
 static CRYPTO_EX_DATA_CLASS g_ex_data_class =
     CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA;
 
-/* CRL score values */
+// CRL score values
 
-/* No unhandled critical extensions */
+// No unhandled critical extensions
 
-#define CRL_SCORE_NOCRITICAL    0x100
+#define CRL_SCORE_NOCRITICAL 0x100
 
-/* certificate is within CRL scope */
+// certificate is within CRL scope
 
-#define CRL_SCORE_SCOPE         0x080
+#define CRL_SCORE_SCOPE 0x080
 
-/* CRL times valid */
+// CRL times valid
 
-#define CRL_SCORE_TIME          0x040
+#define CRL_SCORE_TIME 0x040
 
-/* Issuer name matches certificate */
+// Issuer name matches certificate
 
-#define CRL_SCORE_ISSUER_NAME   0x020
+#define CRL_SCORE_ISSUER_NAME 0x020
 
-/* If this score or above CRL is probably valid */
+// If this score or above CRL is probably valid
 
-#define CRL_SCORE_VALID (CRL_SCORE_NOCRITICAL|CRL_SCORE_TIME|CRL_SCORE_SCOPE)
+#define CRL_SCORE_VALID \
+  (CRL_SCORE_NOCRITICAL | CRL_SCORE_TIME | CRL_SCORE_SCOPE)
 
-/* CRL issuer is certificate issuer */
+// CRL issuer is certificate issuer
 
-#define CRL_SCORE_ISSUER_CERT   0x018
+#define CRL_SCORE_ISSUER_CERT 0x018
 
-/* CRL issuer is on certificate path */
+// CRL issuer is on certificate path
 
-#define CRL_SCORE_SAME_PATH     0x008
+#define CRL_SCORE_SAME_PATH 0x008
 
-/* CRL issuer matches CRL AKID */
+// CRL issuer matches CRL AKID
 
-#define CRL_SCORE_AKID          0x004
+#define CRL_SCORE_AKID 0x004
 
-/* Have a delta CRL with valid times */
+// Have a delta CRL with valid times
 
-#define CRL_SCORE_TIME_DELTA    0x002
+#define CRL_SCORE_TIME_DELTA 0x002
 
 static int null_callback(int ok, X509_STORE_CTX *e);
 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
@@ -125,2332 +126,2241 @@
 
 static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
                          unsigned int *preasons, X509_CRL *crl, X509 *x);
-static int get_crl_delta(X509_STORE_CTX *ctx,
-                         X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x);
-static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl,
-                         int *pcrl_score, X509_CRL *base,
-                         STACK_OF(X509_CRL) *crls);
+static int get_crl_delta(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl,
+                         X509 *x);
+static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pcrl_score,
+                         X509_CRL *base, STACK_OF(X509_CRL) *crls);
 static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer,
                            int *pcrl_score);
 static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score,
                            unsigned int *preasons);
 static int check_crl_path(X509_STORE_CTX *ctx, X509 *x);
-static int check_crl_chain(X509_STORE_CTX *ctx,
-                           STACK_OF(X509) *cert_path,
+static int check_crl_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *cert_path,
                            STACK_OF(X509) *crl_path);
 
 static int internal_verify(X509_STORE_CTX *ctx);
 
-static int null_callback(int ok, X509_STORE_CTX *e)
-{
-    return ok;
+static int null_callback(int ok, X509_STORE_CTX *e) { return ok; }
+
+// cert_self_signed checks if |x| is self-signed. If |x| is valid, it returns
+// one and sets |*out_is_self_signed| to the result. If |x| is invalid, it
+// returns zero.
+static int cert_self_signed(X509 *x, int *out_is_self_signed) {
+  if (!x509v3_cache_extensions(x)) {
+    return 0;
+  }
+  *out_is_self_signed = (x->ex_flags & EXFLAG_SS) != 0;
+  return 1;
 }
 
-/* cert_self_signed checks if |x| is self-signed. If |x| is valid, it returns
- * one and sets |*out_is_self_signed| to the result. If |x| is invalid, it
- * returns zero. */
-static int cert_self_signed(X509 *x, int *out_is_self_signed)
-{
-    if (!x509v3_cache_extensions(x)) {
-        return 0;
+// Given a certificate try and find an exact match in the store
+
+static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x) {
+  STACK_OF(X509) *certs;
+  X509 *xtmp = NULL;
+  size_t i;
+  // Lookup all certs with matching subject name
+  certs = ctx->lookup_certs(ctx, X509_get_subject_name(x));
+  if (certs == NULL) {
+    return NULL;
+  }
+  // Look for exact match
+  for (i = 0; i < sk_X509_num(certs); i++) {
+    xtmp = sk_X509_value(certs, i);
+    if (!X509_cmp(xtmp, x)) {
+      break;
     }
-    *out_is_self_signed = (x->ex_flags & EXFLAG_SS) != 0;
-    return 1;
+  }
+  if (i < sk_X509_num(certs)) {
+    X509_up_ref(xtmp);
+  } else {
+    xtmp = NULL;
+  }
+  sk_X509_pop_free(certs, X509_free);
+  return xtmp;
 }
 
-/* Given a certificate try and find an exact match in the store */
+int X509_verify_cert(X509_STORE_CTX *ctx) {
+  X509 *x, *xtmp, *xtmp2, *chain_ss = NULL;
+  int bad_chain = 0;
+  X509_VERIFY_PARAM *param = ctx->param;
+  int depth, i, ok = 0;
+  int num, j, retry, trust;
+  STACK_OF(X509) *sktmp = NULL;
 
-static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x)
-{
-    STACK_OF(X509) *certs;
-    X509 *xtmp = NULL;
-    size_t i;
-    /* Lookup all certs with matching subject name */
-    certs = ctx->lookup_certs(ctx, X509_get_subject_name(x));
-    if (certs == NULL)
-        return NULL;
-    /* Look for exact match */
-    for (i = 0; i < sk_X509_num(certs); i++) {
-        xtmp = sk_X509_value(certs, i);
-        if (!X509_cmp(xtmp, x))
-            break;
+  if (ctx->cert == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
+    ctx->error = X509_V_ERR_INVALID_CALL;
+    return -1;
+  }
+  if (ctx->chain != NULL) {
+    // This X509_STORE_CTX has already been used to verify a cert. We
+    // cannot do another one.
+    OPENSSL_PUT_ERROR(X509, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+    ctx->error = X509_V_ERR_INVALID_CALL;
+    return -1;
+  }
+
+  // first we make sure the chain we are going to build is present and that
+  // the first entry is in place
+  ctx->chain = sk_X509_new_null();
+  if (ctx->chain == NULL || !sk_X509_push(ctx->chain, ctx->cert)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    ctx->error = X509_V_ERR_OUT_OF_MEM;
+    goto end;
+  }
+  X509_up_ref(ctx->cert);
+  ctx->last_untrusted = 1;
+
+  // We use a temporary STACK so we can chop and hack at it.
+  if (ctx->untrusted != NULL && (sktmp = sk_X509_dup(ctx->untrusted)) == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    ctx->error = X509_V_ERR_OUT_OF_MEM;
+    goto end;
+  }
+
+  num = sk_X509_num(ctx->chain);
+  x = sk_X509_value(ctx->chain, num - 1);
+  depth = param->depth;
+
+  for (;;) {
+    // If we have enough, we break
+    if (depth < num) {
+      break;  // FIXME: If this happens, we should take
+              // note of it and, if appropriate, use the
+              // X509_V_ERR_CERT_CHAIN_TOO_LONG error code
+              // later.
     }
-    if (i < sk_X509_num(certs))
+
+    int is_self_signed;
+    if (!cert_self_signed(x, &is_self_signed)) {
+      ctx->error = X509_V_ERR_INVALID_EXTENSION;
+      goto end;
+    }
+
+    // If we are self signed, we break
+    if (is_self_signed) {
+      break;
+    }
+    // If asked see if we can find issuer in trusted store first
+    if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) {
+      ok = ctx->get_issuer(&xtmp, ctx, x);
+      if (ok < 0) {
+        ctx->error = X509_V_ERR_STORE_LOOKUP;
+        goto end;
+      }
+      // If successful for now free up cert so it will be picked up
+      // again later.
+      if (ok > 0) {
+        X509_free(xtmp);
+        break;
+      }
+    }
+
+    // If we were passed a cert chain, use it first
+    if (sktmp != NULL) {
+      xtmp = find_issuer(ctx, sktmp, x);
+      if (xtmp != NULL) {
+        if (!sk_X509_push(ctx->chain, xtmp)) {
+          OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+          ctx->error = X509_V_ERR_OUT_OF_MEM;
+          ok = 0;
+          goto end;
+        }
         X509_up_ref(xtmp);
-    else
-        xtmp = NULL;
-    sk_X509_pop_free(certs, X509_free);
-    return xtmp;
+        (void)sk_X509_delete_ptr(sktmp, xtmp);
+        ctx->last_untrusted++;
+        x = xtmp;
+        num++;
+        // reparse the full chain for the next one
+        continue;
+      }
+    }
+    break;
+  }
+
+  // Remember how many untrusted certs we have
+  j = num;
+  // at this point, chain should contain a list of untrusted certificates.
+  // We now need to add at least one trusted one, if possible, otherwise we
+  // complain.
+
+  do {
+    // Examine last certificate in chain and see if it is self signed.
+    i = sk_X509_num(ctx->chain);
+    x = sk_X509_value(ctx->chain, i - 1);
+
+    int is_self_signed;
+    if (!cert_self_signed(x, &is_self_signed)) {
+      ctx->error = X509_V_ERR_INVALID_EXTENSION;
+      goto end;
+    }
+
+    if (is_self_signed) {
+      // we have a self signed certificate
+      if (sk_X509_num(ctx->chain) == 1) {
+        // We have a single self signed certificate: see if we can
+        // find it in the store. We must have an exact match to avoid
+        // possible impersonation.
+        ok = ctx->get_issuer(&xtmp, ctx, x);
+        if ((ok <= 0) || X509_cmp(x, xtmp)) {
+          ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
+          ctx->current_cert = x;
+          ctx->error_depth = i - 1;
+          if (ok == 1) {
+            X509_free(xtmp);
+          }
+          bad_chain = 1;
+          ok = ctx->verify_cb(0, ctx);
+          if (!ok) {
+            goto end;
+          }
+        } else {
+          // We have a match: replace certificate with store
+          // version so we get any trust settings.
+          X509_free(x);
+          x = xtmp;
+          (void)sk_X509_set(ctx->chain, i - 1, x);
+          ctx->last_untrusted = 0;
+        }
+      } else {
+        // extract and save self signed certificate for later use
+        chain_ss = sk_X509_pop(ctx->chain);
+        ctx->last_untrusted--;
+        num--;
+        j--;
+        x = sk_X509_value(ctx->chain, num - 1);
+      }
+    }
+    // We now lookup certs from the certificate store
+    for (;;) {
+      // If we have enough, we break
+      if (depth < num) {
+        break;
+      }
+      if (!cert_self_signed(x, &is_self_signed)) {
+        ctx->error = X509_V_ERR_INVALID_EXTENSION;
+        goto end;
+      }
+      // If we are self signed, we break
+      if (is_self_signed) {
+        break;
+      }
+      ok = ctx->get_issuer(&xtmp, ctx, x);
+
+      if (ok < 0) {
+        ctx->error = X509_V_ERR_STORE_LOOKUP;
+        goto end;
+      }
+      if (ok == 0) {
+        break;
+      }
+      x = xtmp;
+      if (!sk_X509_push(ctx->chain, x)) {
+        X509_free(xtmp);
+        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+        ctx->error = X509_V_ERR_OUT_OF_MEM;
+        ok = 0;
+        goto end;
+      }
+      num++;
+    }
+
+    // we now have our chain, lets check it...
+    trust = check_trust(ctx);
+
+    // If explicitly rejected error
+    if (trust == X509_TRUST_REJECTED) {
+      ok = 0;
+      goto end;
+    }
+    // If it's not explicitly trusted then check if there is an alternative
+    // chain that could be used. We only do this if we haven't already
+    // checked via TRUSTED_FIRST and the user hasn't switched off alternate
+    // chain checking
+    retry = 0;
+    if (trust != X509_TRUST_TRUSTED &&
+        !(ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) &&
+        !(ctx->param->flags & X509_V_FLAG_NO_ALT_CHAINS)) {
+      while (j-- > 1) {
+        xtmp2 = sk_X509_value(ctx->chain, j - 1);
+        ok = ctx->get_issuer(&xtmp, ctx, xtmp2);
+        if (ok < 0) {
+          goto end;
+        }
+        // Check if we found an alternate chain
+        if (ok > 0) {
+          // Free up the found cert we'll add it again later
+          X509_free(xtmp);
+
+          // Dump all the certs above this point - we've found an
+          // alternate chain
+          while (num > j) {
+            xtmp = sk_X509_pop(ctx->chain);
+            X509_free(xtmp);
+            num--;
+          }
+          ctx->last_untrusted = sk_X509_num(ctx->chain);
+          retry = 1;
+          break;
+        }
+      }
+    }
+  } while (retry);
+
+  // If not explicitly trusted then indicate error unless it's a single
+  // self signed certificate in which case we've indicated an error already
+  // and set bad_chain == 1
+  if (trust != X509_TRUST_TRUSTED && !bad_chain) {
+    if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss)) {
+      if (ctx->last_untrusted >= num) {
+        ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
+      } else {
+        ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
+      }
+      ctx->current_cert = x;
+    } else {
+      sk_X509_push(ctx->chain, chain_ss);
+      num++;
+      ctx->last_untrusted = num;
+      ctx->current_cert = chain_ss;
+      ctx->error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
+      chain_ss = NULL;
+    }
+
+    ctx->error_depth = num - 1;
+    bad_chain = 1;
+    ok = ctx->verify_cb(0, ctx);
+    if (!ok) {
+      goto end;
+    }
+  }
+
+  // We have the chain complete: now we need to check its purpose
+  ok = check_chain_extensions(ctx);
+
+  if (!ok) {
+    goto end;
+  }
+
+  ok = check_id(ctx);
+
+  if (!ok) {
+    goto end;
+  }
+
+  // Check revocation status: we do this after copying parameters because
+  // they may be needed for CRL signature verification.
+
+  ok = ctx->check_revocation(ctx);
+  if (!ok) {
+    goto end;
+  }
+
+  // At this point, we have a chain and need to verify it
+  if (ctx->verify != NULL) {
+    ok = ctx->verify(ctx);
+  } else {
+    ok = internal_verify(ctx);
+  }
+  if (!ok) {
+    goto end;
+  }
+
+  // Check name constraints
+
+  ok = check_name_constraints(ctx);
+  if (!ok) {
+    goto end;
+  }
+
+  // If we get this far evaluate policies
+  if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK)) {
+    ok = ctx->check_policy(ctx);
+  }
+
+end:
+  if (sktmp != NULL) {
+    sk_X509_free(sktmp);
+  }
+  if (chain_ss != NULL) {
+    X509_free(chain_ss);
+  }
+
+  // Safety net, error returns must set ctx->error
+  if (ok <= 0 && ctx->error == X509_V_OK) {
+    ctx->error = X509_V_ERR_UNSPECIFIED;
+  }
+  return ok;
 }
 
-int X509_verify_cert(X509_STORE_CTX *ctx)
-{
-    X509 *x, *xtmp, *xtmp2, *chain_ss = NULL;
-    int bad_chain = 0;
-    X509_VERIFY_PARAM *param = ctx->param;
-    int depth, i, ok = 0;
-    int num, j, retry, trust;
-    int (*cb) (int xok, X509_STORE_CTX *xctx);
-    STACK_OF(X509) *sktmp = NULL;
-    if (ctx->cert == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
-        ctx->error = X509_V_ERR_INVALID_CALL;
-        return -1;
-    }
-    if (ctx->chain != NULL) {
-        /*
-         * This X509_STORE_CTX has already been used to verify a cert. We
-         * cannot do another one.
-         */
-        OPENSSL_PUT_ERROR(X509, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-        ctx->error = X509_V_ERR_INVALID_CALL;
-        return -1;
-    }
+// Given a STACK_OF(X509) find the issuer of cert (if any)
 
-    cb = ctx->verify_cb;
+static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x) {
+  size_t i;
+  X509 *issuer;
+  for (i = 0; i < sk_X509_num(sk); i++) {
+    issuer = sk_X509_value(sk, i);
+    if (ctx->check_issued(ctx, x, issuer)) {
+      return issuer;
+    }
+  }
+  return NULL;
+}
 
-    /*
-     * first we make sure the chain we are going to build is present and that
-     * the first entry is in place
-     */
-    ctx->chain = sk_X509_new_null();
-    if (ctx->chain == NULL || !sk_X509_push(ctx->chain, ctx->cert)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        ctx->error = X509_V_ERR_OUT_OF_MEM;
+// Given a possible certificate and issuer check them
+
+static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer) {
+  int ret;
+  ret = X509_check_issued(issuer, x);
+  if (ret == X509_V_OK) {
+    return 1;
+  }
+  // If we haven't asked for issuer errors don't set ctx
+  if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK)) {
+    return 0;
+  }
+
+  ctx->error = ret;
+  ctx->current_cert = x;
+  ctx->current_issuer = issuer;
+  return ctx->verify_cb(0, ctx);
+}
+
+// Alternative lookup method: look from a STACK stored in other_ctx
+
+static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) {
+  *issuer = find_issuer(ctx, ctx->other_ctx, x);
+  if (*issuer) {
+    X509_up_ref(*issuer);
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+// Check a certificate chains extensions for consistency with the supplied
+// purpose
+
+static int check_chain_extensions(X509_STORE_CTX *ctx) {
+  int i, ok = 0, plen = 0;
+  X509 *x;
+  int proxy_path_length = 0;
+  int purpose;
+  int allow_proxy_certs;
+
+  enum {
+    // ca_or_leaf allows either type of certificate so that direct use of
+    // self-signed certificates works.
+    ca_or_leaf,
+    must_be_ca,
+    must_not_be_ca,
+  } ca_requirement;
+
+  // CRL path validation
+  if (ctx->parent) {
+    allow_proxy_certs = 0;
+    purpose = X509_PURPOSE_CRL_SIGN;
+  } else {
+    allow_proxy_certs = !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS);
+    purpose = ctx->param->purpose;
+  }
+
+  ca_requirement = ca_or_leaf;
+
+  // Check all untrusted certificates
+  for (i = 0; i < ctx->last_untrusted; i++) {
+    int ret;
+    x = sk_X509_value(ctx->chain, i);
+    if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) &&
+        (x->ex_flags & EXFLAG_CRITICAL)) {
+      ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
+      ctx->error_depth = i;
+      ctx->current_cert = x;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
         goto end;
+      }
     }
-    X509_up_ref(ctx->cert);
-    ctx->last_untrusted = 1;
-
-    /* We use a temporary STACK so we can chop and hack at it. */
-    if (ctx->untrusted != NULL
-        && (sktmp = sk_X509_dup(ctx->untrusted)) == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        ctx->error = X509_V_ERR_OUT_OF_MEM;
+    if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY)) {
+      ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED;
+      ctx->error_depth = i;
+      ctx->current_cert = x;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
         goto end;
+      }
     }
 
-    num = sk_X509_num(ctx->chain);
-    x = sk_X509_value(ctx->chain, num - 1);
-    depth = param->depth;
-
-    for (;;) {
-        /* If we have enough, we break */
-        if (depth < num)
-            break;              /* FIXME: If this happens, we should take
-                                 * note of it and, if appropriate, use the
-                                 * X509_V_ERR_CERT_CHAIN_TOO_LONG error code
-                                 * later. */
-
-        int is_self_signed;
-        if (!cert_self_signed(x, &is_self_signed)) {
-            ctx->error = X509_V_ERR_INVALID_EXTENSION;
-            goto end;
+    switch (ca_requirement) {
+      case ca_or_leaf:
+        ret = 1;
+        break;
+      case must_not_be_ca:
+        if (X509_check_ca(x)) {
+          ret = 0;
+          ctx->error = X509_V_ERR_INVALID_NON_CA;
+        } else {
+          ret = 1;
         }
+        break;
+      case must_be_ca:
+        if (!X509_check_ca(x)) {
+          ret = 0;
+          ctx->error = X509_V_ERR_INVALID_CA;
+        } else {
+          ret = 1;
+        }
+        break;
+      default:
+        // impossible.
+        ret = 0;
+    }
 
-        /* If we are self signed, we break */
-        if (is_self_signed)
+    if (ret == 0) {
+      ctx->error_depth = i;
+      ctx->current_cert = x;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
+        goto end;
+      }
+    }
+    if (ctx->param->purpose > 0) {
+      ret = X509_check_purpose(x, purpose, ca_requirement == must_be_ca);
+      if (ret != 1) {
+        ret = 0;
+        ctx->error = X509_V_ERR_INVALID_PURPOSE;
+        ctx->error_depth = i;
+        ctx->current_cert = x;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto end;
+        }
+      }
+    }
+    // Check pathlen if not self issued
+    if ((i > 1) && !(x->ex_flags & EXFLAG_SI) && (x->ex_pathlen != -1) &&
+        (plen > (x->ex_pathlen + proxy_path_length + 1))) {
+      ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
+      ctx->error_depth = i;
+      ctx->current_cert = x;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
+        goto end;
+      }
+    }
+    // Increment path length if not self issued
+    if (!(x->ex_flags & EXFLAG_SI)) {
+      plen++;
+    }
+    // If this certificate is a proxy certificate, the next certificate
+    // must be another proxy certificate or a EE certificate.  If not,
+    // the next certificate must be a CA certificate.
+    if (x->ex_flags & EXFLAG_PROXY) {
+      if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) {
+        ctx->error = X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
+        ctx->error_depth = i;
+        ctx->current_cert = x;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto end;
+        }
+      }
+      proxy_path_length++;
+      ca_requirement = must_not_be_ca;
+    } else {
+      ca_requirement = must_be_ca;
+    }
+  }
+  ok = 1;
+end:
+  return ok;
+}
+
+static int reject_dns_name_in_common_name(X509 *x509) {
+  const X509_NAME *name = X509_get_subject_name(x509);
+  int i = -1;
+  for (;;) {
+    i = X509_NAME_get_index_by_NID(name, NID_commonName, i);
+    if (i == -1) {
+      return X509_V_OK;
+    }
+
+    const X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i);
+    const ASN1_STRING *common_name = X509_NAME_ENTRY_get_data(entry);
+    unsigned char *idval;
+    int idlen = ASN1_STRING_to_UTF8(&idval, common_name);
+    if (idlen < 0) {
+      return X509_V_ERR_OUT_OF_MEM;
+    }
+    // Only process attributes that look like host names. Note it is
+    // important that this check be mirrored in |X509_check_host|.
+    int looks_like_dns = x509v3_looks_like_dns_name(idval, (size_t)idlen);
+    OPENSSL_free(idval);
+    if (looks_like_dns) {
+      return X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS;
+    }
+  }
+}
+
+static int check_name_constraints(X509_STORE_CTX *ctx) {
+  int i, j, rv;
+  int has_name_constraints = 0;
+  // Check name constraints for all certificates
+  for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--) {
+    X509 *x = sk_X509_value(ctx->chain, i);
+    // Ignore self issued certs unless last in chain
+    if (i && (x->ex_flags & EXFLAG_SI)) {
+      continue;
+    }
+    // Check against constraints for all certificates higher in chain
+    // including trust anchor. Trust anchor not strictly speaking needed
+    // but if it includes constraints it is to be assumed it expects them
+    // to be obeyed.
+    for (j = sk_X509_num(ctx->chain) - 1; j > i; j--) {
+      NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc;
+      if (nc) {
+        has_name_constraints = 1;
+        rv = NAME_CONSTRAINTS_check(x, nc);
+        switch (rv) {
+          case X509_V_OK:
+            continue;
+          case X509_V_ERR_OUT_OF_MEM:
+            ctx->error = rv;
+            return 0;
+          default:
+            ctx->error = rv;
+            ctx->error_depth = i;
+            ctx->current_cert = x;
+            if (!ctx->verify_cb(0, ctx)) {
+              return 0;
+            }
             break;
-        /*
-         * If asked see if we can find issuer in trusted store first
-         */
-        if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) {
-            ok = ctx->get_issuer(&xtmp, ctx, x);
-            if (ok < 0) {
-                ctx->error = X509_V_ERR_STORE_LOOKUP;
-                goto end;
-            }
-            /*
-             * If successful for now free up cert so it will be picked up
-             * again later.
-             */
-            if (ok > 0) {
-                X509_free(xtmp);
-                break;
-            }
         }
+      }
+    }
+  }
 
-        /* If we were passed a cert chain, use it first */
-        if (sktmp != NULL) {
-            xtmp = find_issuer(ctx, sktmp, x);
-            if (xtmp != NULL) {
-                if (!sk_X509_push(ctx->chain, xtmp)) {
-                    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-                    ctx->error = X509_V_ERR_OUT_OF_MEM;
-                    ok = 0;
-                    goto end;
-                }
-                X509_up_ref(xtmp);
-                (void)sk_X509_delete_ptr(sktmp, xtmp);
-                ctx->last_untrusted++;
-                x = xtmp;
-                num++;
-                /*
-                 * reparse the full chain for the next one
-                 */
-                continue;
-            }
+  // Name constraints do not match against the common name, but
+  // |X509_check_host| still implements the legacy behavior where, on
+  // certificates lacking a SAN list, DNS-like names in the common name are
+  // checked instead.
+  //
+  // While we could apply the name constraints to the common name, name
+  // constraints are rare enough that can hold such certificates to a higher
+  // standard. Note this does not make "DNS-like" heuristic failures any
+  // worse. A decorative common-name misidentified as a DNS name would fail
+  // the name constraint anyway.
+  X509 *leaf = sk_X509_value(ctx->chain, 0);
+  if (has_name_constraints && leaf->altname == NULL) {
+    rv = reject_dns_name_in_common_name(leaf);
+    switch (rv) {
+      case X509_V_OK:
+        break;
+      case X509_V_ERR_OUT_OF_MEM:
+        ctx->error = rv;
+        return 0;
+      default:
+        ctx->error = rv;
+        ctx->error_depth = i;
+        ctx->current_cert = leaf;
+        if (!ctx->verify_cb(0, ctx)) {
+          return 0;
         }
         break;
     }
+  }
 
-    /* Remember how many untrusted certs we have */
-    j = num;
-    /*
-     * at this point, chain should contain a list of untrusted certificates.
-     * We now need to add at least one trusted one, if possible, otherwise we
-     * complain.
-     */
+  return 1;
+}
 
-    do {
-        /*
-         * Examine last certificate in chain and see if it is self signed.
-         */
-        i = sk_X509_num(ctx->chain);
-        x = sk_X509_value(ctx->chain, i - 1);
+static int check_id_error(X509_STORE_CTX *ctx, int errcode) {
+  ctx->error = errcode;
+  ctx->current_cert = ctx->cert;
+  ctx->error_depth = 0;
+  return ctx->verify_cb(0, ctx);
+}
 
-        int is_self_signed;
-        if (!cert_self_signed(x, &is_self_signed)) {
-            ctx->error = X509_V_ERR_INVALID_EXTENSION;
-            goto end;
-        }
+static int check_hosts(X509 *x, X509_VERIFY_PARAM *param) {
+  size_t i;
+  size_t n = sk_OPENSSL_STRING_num(param->hosts);
+  char *name;
 
-        if (is_self_signed) {
-            /* we have a self signed certificate */
-            if (sk_X509_num(ctx->chain) == 1) {
-                /*
-                 * We have a single self signed certificate: see if we can
-                 * find it in the store. We must have an exact match to avoid
-                 * possible impersonation.
-                 */
-                ok = ctx->get_issuer(&xtmp, ctx, x);
-                if ((ok <= 0) || X509_cmp(x, xtmp)) {
-                    ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
-                    ctx->current_cert = x;
-                    ctx->error_depth = i - 1;
-                    if (ok == 1)
-                        X509_free(xtmp);
-                    bad_chain = 1;
-                    ok = cb(0, ctx);
-                    if (!ok)
-                        goto end;
-                } else {
-                    /*
-                     * We have a match: replace certificate with store
-                     * version so we get any trust settings.
-                     */
-                    X509_free(x);
-                    x = xtmp;
-                    (void)sk_X509_set(ctx->chain, i - 1, x);
-                    ctx->last_untrusted = 0;
-                }
-            } else {
-                /*
-                 * extract and save self signed certificate for later use
-                 */
-                chain_ss = sk_X509_pop(ctx->chain);
-                ctx->last_untrusted--;
-                num--;
-                j--;
-                x = sk_X509_value(ctx->chain, num - 1);
-            }
-        }
-        /* We now lookup certs from the certificate store */
-        for (;;) {
-            /* If we have enough, we break */
-            if (depth < num)
-                break;
-            if (!cert_self_signed(x, &is_self_signed)) {
-                ctx->error = X509_V_ERR_INVALID_EXTENSION;
-                goto end;
-            }
-            /* If we are self signed, we break */
-            if (is_self_signed)
-                break;
-            ok = ctx->get_issuer(&xtmp, ctx, x);
-
-            if (ok < 0) {
-                ctx->error = X509_V_ERR_STORE_LOOKUP;
-                goto end;
-            }
-            if (ok == 0)
-                break;
-            x = xtmp;
-            if (!sk_X509_push(ctx->chain, x)) {
-                X509_free(xtmp);
-                OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-                ctx->error = X509_V_ERR_OUT_OF_MEM;
-                ok = 0;
-                goto end;
-            }
-            num++;
-        }
-
-        /* we now have our chain, lets check it... */
-        trust = check_trust(ctx);
-
-        /* If explicitly rejected error */
-        if (trust == X509_TRUST_REJECTED) {
-            ok = 0;
-            goto end;
-        }
-        /*
-         * If it's not explicitly trusted then check if there is an alternative
-         * chain that could be used. We only do this if we haven't already
-         * checked via TRUSTED_FIRST and the user hasn't switched off alternate
-         * chain checking
-         */
-        retry = 0;
-        if (trust != X509_TRUST_TRUSTED
-            && !(ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST)
-            && !(ctx->param->flags & X509_V_FLAG_NO_ALT_CHAINS)) {
-            while (j-- > 1) {
-                xtmp2 = sk_X509_value(ctx->chain, j - 1);
-                ok = ctx->get_issuer(&xtmp, ctx, xtmp2);
-                if (ok < 0)
-                    goto end;
-                /* Check if we found an alternate chain */
-                if (ok > 0) {
-                    /*
-                     * Free up the found cert we'll add it again later
-                     */
-                    X509_free(xtmp);
-
-                    /*
-                     * Dump all the certs above this point - we've found an
-                     * alternate chain
-                     */
-                    while (num > j) {
-                        xtmp = sk_X509_pop(ctx->chain);
-                        X509_free(xtmp);
-                        num--;
-                    }
-                    ctx->last_untrusted = sk_X509_num(ctx->chain);
-                    retry = 1;
-                    break;
-                }
-            }
-        }
-    } while (retry);
-
-    /*
-     * If not explicitly trusted then indicate error unless it's a single
-     * self signed certificate in which case we've indicated an error already
-     * and set bad_chain == 1
-     */
-    if (trust != X509_TRUST_TRUSTED && !bad_chain) {
-        if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss)) {
-            if (ctx->last_untrusted >= num)
-                ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
-            else
-                ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
-            ctx->current_cert = x;
-        } else {
-
-            sk_X509_push(ctx->chain, chain_ss);
-            num++;
-            ctx->last_untrusted = num;
-            ctx->current_cert = chain_ss;
-            ctx->error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
-            chain_ss = NULL;
-        }
-
-        ctx->error_depth = num - 1;
-        bad_chain = 1;
-        ok = cb(0, ctx);
-        if (!ok)
-            goto end;
+  if (param->peername != NULL) {
+    OPENSSL_free(param->peername);
+    param->peername = NULL;
+  }
+  for (i = 0; i < n; ++i) {
+    name = sk_OPENSSL_STRING_value(param->hosts, i);
+    if (X509_check_host(x, name, strlen(name), param->hostflags,
+                        &param->peername) > 0) {
+      return 1;
     }
+  }
+  return n == 0;
+}
 
-    /* We have the chain complete: now we need to check its purpose */
-    ok = check_chain_extensions(ctx);
-
-    if (!ok)
-        goto end;
-
-    ok = check_id(ctx);
-
-    if (!ok)
-        goto end;
-
-    /*
-     * Check revocation status: we do this after copying parameters because
-     * they may be needed for CRL signature verification.
-     */
-
-    ok = ctx->check_revocation(ctx);
-    if (!ok)
-        goto end;
-
-    int err = X509_chain_check_suiteb(&ctx->error_depth, NULL, ctx->chain,
-                                      ctx->param->flags);
-    if (err != X509_V_OK) {
-        ctx->error = err;
-        ctx->current_cert = sk_X509_value(ctx->chain, ctx->error_depth);
-        ok = cb(0, ctx);
-        if (!ok)
-            goto end;
+static int check_id(X509_STORE_CTX *ctx) {
+  X509_VERIFY_PARAM *vpm = ctx->param;
+  X509 *x = ctx->cert;
+  if (vpm->poison) {
+    if (!check_id_error(ctx, X509_V_ERR_INVALID_CALL)) {
+      return 0;
     }
-
-    /* At this point, we have a chain and need to verify it */
-    if (ctx->verify != NULL)
-        ok = ctx->verify(ctx);
-    else
-        ok = internal_verify(ctx);
-    if (!ok)
-        goto end;
-
-    /* Check name constraints */
-
-    ok = check_name_constraints(ctx);
-    if (!ok)
-        goto end;
-
-    /* If we get this far evaluate policies */
-    if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK))
-        ok = ctx->check_policy(ctx);
-
- end:
-    if (sktmp != NULL)
-        sk_X509_free(sktmp);
-    if (chain_ss != NULL)
-        X509_free(chain_ss);
-
-    /* Safety net, error returns must set ctx->error */
-    if (ok <= 0 && ctx->error == X509_V_OK)
-        ctx->error = X509_V_ERR_UNSPECIFIED;
-    return ok;
-}
-
-/*
- * Given a STACK_OF(X509) find the issuer of cert (if any)
- */
-
-static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x)
-{
-    size_t i;
-    X509 *issuer;
-    for (i = 0; i < sk_X509_num(sk); i++) {
-        issuer = sk_X509_value(sk, i);
-        if (ctx->check_issued(ctx, x, issuer))
-            return issuer;
+  }
+  if (vpm->hosts && check_hosts(x, vpm) <= 0) {
+    if (!check_id_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH)) {
+      return 0;
     }
-    return NULL;
+  }
+  if (vpm->email && X509_check_email(x, vpm->email, vpm->emaillen, 0) <= 0) {
+    if (!check_id_error(ctx, X509_V_ERR_EMAIL_MISMATCH)) {
+      return 0;
+    }
+  }
+  if (vpm->ip && X509_check_ip(x, vpm->ip, vpm->iplen, 0) <= 0) {
+    if (!check_id_error(ctx, X509_V_ERR_IP_ADDRESS_MISMATCH)) {
+      return 0;
+    }
+  }
+  return 1;
 }
 
-/* Given a possible certificate and issuer check them */
+static int check_trust(X509_STORE_CTX *ctx) {
+  size_t i;
+  int ok;
+  X509 *x = NULL;
+  // Check all trusted certificates in chain
+  for (i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) {
+    x = sk_X509_value(ctx->chain, i);
+    ok = X509_check_trust(x, ctx->param->trust, 0);
+    // If explicitly trusted return trusted
+    if (ok == X509_TRUST_TRUSTED) {
+      return X509_TRUST_TRUSTED;
+    }
+    // If explicitly rejected notify callback and reject if not
+    // overridden.
+    if (ok == X509_TRUST_REJECTED) {
+      ctx->error_depth = i;
+      ctx->current_cert = x;
+      ctx->error = X509_V_ERR_CERT_REJECTED;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
+        return X509_TRUST_REJECTED;
+      }
+    }
+  }
+  // If we accept partial chains and have at least one trusted certificate
+  // return success.
+  if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
+    X509 *mx;
+    if (ctx->last_untrusted < (int)sk_X509_num(ctx->chain)) {
+      return X509_TRUST_TRUSTED;
+    }
+    x = sk_X509_value(ctx->chain, 0);
+    mx = lookup_cert_match(ctx, x);
+    if (mx) {
+      (void)sk_X509_set(ctx->chain, 0, mx);
+      X509_free(x);
+      ctx->last_untrusted = 0;
+      return X509_TRUST_TRUSTED;
+    }
+  }
 
-static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer)
-{
-    int ret;
-    ret = X509_check_issued(issuer, x);
-    if (ret == X509_V_OK)
-        return 1;
-    /* If we haven't asked for issuer errors don't set ctx */
-    if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK))
-        return 0;
-
-    ctx->error = ret;
-    ctx->current_cert = x;
-    ctx->current_issuer = issuer;
-    return ctx->verify_cb(0, ctx);
+  // If no trusted certs in chain at all return untrusted and allow
+  // standard (no issuer cert) etc errors to be indicated.
+  return X509_TRUST_UNTRUSTED;
 }
 
-/* Alternative lookup method: look from a STACK stored in other_ctx */
-
-static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
-{
-    *issuer = find_issuer(ctx, ctx->other_ctx, x);
-    if (*issuer) {
-        X509_up_ref(*issuer);
-        return 1;
-    } else
-        return 0;
-}
-
-/*
- * Check a certificate chains extensions for consistency with the supplied
- * purpose
- */
-
-static int check_chain_extensions(X509_STORE_CTX *ctx)
-{
-    int i, ok = 0, plen = 0;
-    X509 *x;
-    int (*cb) (int xok, X509_STORE_CTX *xctx);
-    int proxy_path_length = 0;
-    int purpose;
-    int allow_proxy_certs;
-    cb = ctx->verify_cb;
-
-    enum {
-        // ca_or_leaf allows either type of certificate so that direct use of
-        // self-signed certificates works.
-        ca_or_leaf,
-        must_be_ca,
-        must_not_be_ca,
-    } ca_requirement;
-
-    /* CRL path validation */
+static int check_revocation(X509_STORE_CTX *ctx) {
+  int i, last, ok;
+  if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK)) {
+    return 1;
+  }
+  if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL) {
+    last = sk_X509_num(ctx->chain) - 1;
+  } else {
+    // If checking CRL paths this isn't the EE certificate
     if (ctx->parent) {
-        allow_proxy_certs = 0;
-        purpose = X509_PURPOSE_CRL_SIGN;
+      return 1;
+    }
+    last = 0;
+  }
+  for (i = 0; i <= last; i++) {
+    ctx->error_depth = i;
+    ok = check_cert(ctx);
+    if (!ok) {
+      return ok;
+    }
+  }
+  return 1;
+}
+
+static int check_cert(X509_STORE_CTX *ctx) {
+  X509_CRL *crl = NULL, *dcrl = NULL;
+  X509 *x;
+  int ok = 0, cnum;
+  unsigned int last_reasons;
+  cnum = ctx->error_depth;
+  x = sk_X509_value(ctx->chain, cnum);
+  ctx->current_cert = x;
+  ctx->current_issuer = NULL;
+  ctx->current_crl_score = 0;
+  ctx->current_reasons = 0;
+  while (ctx->current_reasons != CRLDP_ALL_REASONS) {
+    last_reasons = ctx->current_reasons;
+    // Try to retrieve relevant CRL
+    if (ctx->get_crl) {
+      ok = ctx->get_crl(ctx, &crl, x);
     } else {
-        allow_proxy_certs =
-            ! !(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS);
-        purpose = ctx->param->purpose;
+      ok = get_crl_delta(ctx, &crl, &dcrl, x);
+    }
+    // If error looking up CRL, nothing we can do except notify callback
+    if (!ok) {
+      ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
+      ok = ctx->verify_cb(0, ctx);
+      goto err;
+    }
+    ctx->current_crl = crl;
+    ok = ctx->check_crl(ctx, crl);
+    if (!ok) {
+      goto err;
     }
 
-    ca_requirement = ca_or_leaf;
-
-    /* Check all untrusted certificates */
-    for (i = 0; i < ctx->last_untrusted; i++) {
-        int ret;
-        x = sk_X509_value(ctx->chain, i);
-        if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
-            && (x->ex_flags & EXFLAG_CRITICAL)) {
-            ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
-            ctx->error_depth = i;
-            ctx->current_cert = x;
-            ok = cb(0, ctx);
-            if (!ok)
-                goto end;
-        }
-        if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY)) {
-            ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED;
-            ctx->error_depth = i;
-            ctx->current_cert = x;
-            ok = cb(0, ctx);
-            if (!ok)
-                goto end;
-        }
-
-        switch (ca_requirement) {
-        case ca_or_leaf:
-            ret = 1;
-            break;
-        case must_not_be_ca:
-            if (X509_check_ca(x)) {
-                ret = 0;
-                ctx->error = X509_V_ERR_INVALID_NON_CA;
-            } else
-                ret = 1;
-            break;
-        case must_be_ca:
-            if (!X509_check_ca(x)) {
-                ret = 0;
-                ctx->error = X509_V_ERR_INVALID_CA;
-            } else
-                ret = 1;
-            break;
-        default:
-            // impossible.
-            ret = 0;
-        }
-
-        if (ret == 0) {
-            ctx->error_depth = i;
-            ctx->current_cert = x;
-            ok = cb(0, ctx);
-            if (!ok)
-                goto end;
-        }
-        if (ctx->param->purpose > 0) {
-            ret = X509_check_purpose(x, purpose, ca_requirement == must_be_ca);
-            if (ret != 1) {
-                ret = 0;
-                ctx->error = X509_V_ERR_INVALID_PURPOSE;
-                ctx->error_depth = i;
-                ctx->current_cert = x;
-                ok = cb(0, ctx);
-                if (!ok)
-                    goto end;
-            }
-        }
-        /* Check pathlen if not self issued */
-        if ((i > 1) && !(x->ex_flags & EXFLAG_SI)
-            && (x->ex_pathlen != -1)
-            && (plen > (x->ex_pathlen + proxy_path_length + 1))) {
-            ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
-            ctx->error_depth = i;
-            ctx->current_cert = x;
-            ok = cb(0, ctx);
-            if (!ok)
-                goto end;
-        }
-        /* Increment path length if not self issued */
-        if (!(x->ex_flags & EXFLAG_SI))
-            plen++;
-        /*
-         * If this certificate is a proxy certificate, the next certificate
-         * must be another proxy certificate or a EE certificate.  If not,
-         * the next certificate must be a CA certificate.
-         */
-        if (x->ex_flags & EXFLAG_PROXY) {
-            if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) {
-                ctx->error = X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
-                ctx->error_depth = i;
-                ctx->current_cert = x;
-                ok = cb(0, ctx);
-                if (!ok)
-                    goto end;
-            }
-            proxy_path_length++;
-            ca_requirement = must_not_be_ca;
-        } else {
-            ca_requirement = must_be_ca;
-        }
-    }
-    ok = 1;
- end:
-    return ok;
-}
-
-static int reject_dns_name_in_common_name(X509 *x509)
-{
-    X509_NAME *name = X509_get_subject_name(x509);
-    int i = -1;
-    for (;;) {
-        i = X509_NAME_get_index_by_NID(name, NID_commonName, i);
-        if (i == -1) {
-            return X509_V_OK;
-        }
-
-        X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, i);
-        ASN1_STRING *common_name = X509_NAME_ENTRY_get_data(entry);
-        unsigned char *idval;
-        int idlen = ASN1_STRING_to_UTF8(&idval, common_name);
-        if (idlen < 0) {
-            return X509_V_ERR_OUT_OF_MEM;
-        }
-        /* Only process attributes that look like host names. Note it is
-         * important that this check be mirrored in |X509_check_host|. */
-        int looks_like_dns = x509v3_looks_like_dns_name(idval, (size_t)idlen);
-        OPENSSL_free(idval);
-        if (looks_like_dns) {
-            return X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS;
-        }
-    }
-}
-
-static int check_name_constraints(X509_STORE_CTX *ctx)
-{
-    int i, j, rv;
-    int has_name_constraints = 0;
-    /* Check name constraints for all certificates */
-    for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--) {
-        X509 *x = sk_X509_value(ctx->chain, i);
-        /* Ignore self issued certs unless last in chain */
-        if (i && (x->ex_flags & EXFLAG_SI))
-            continue;
-        /*
-         * Check against constraints for all certificates higher in chain
-         * including trust anchor. Trust anchor not strictly speaking needed
-         * but if it includes constraints it is to be assumed it expects them
-         * to be obeyed.
-         */
-        for (j = sk_X509_num(ctx->chain) - 1; j > i; j--) {
-            NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc;
-            if (nc) {
-                has_name_constraints = 1;
-                rv = NAME_CONSTRAINTS_check(x, nc);
-                switch (rv) {
-                case X509_V_OK:
-                    continue;
-                case X509_V_ERR_OUT_OF_MEM:
-                    ctx->error = rv;
-                    return 0;
-                default:
-                    ctx->error = rv;
-                    ctx->error_depth = i;
-                    ctx->current_cert = x;
-                    if (!ctx->verify_cb(0, ctx))
-                        return 0;
-                    break;
-                }
-            }
-        }
+    if (dcrl) {
+      ok = ctx->check_crl(ctx, dcrl);
+      if (!ok) {
+        goto err;
+      }
+      ok = ctx->cert_crl(ctx, dcrl, x);
+      if (!ok) {
+        goto err;
+      }
+    } else {
+      ok = 1;
     }
 
-    /* Name constraints do not match against the common name, but
-     * |X509_check_host| still implements the legacy behavior where, on
-     * certificates lacking a SAN list, DNS-like names in the common name are
-     * checked instead.
-     *
-     * While we could apply the name constraints to the common name, name
-     * constraints are rare enough that can hold such certificates to a higher
-     * standard. Note this does not make "DNS-like" heuristic failures any
-     * worse. A decorative common-name misidentified as a DNS name would fail
-     * the name constraint anyway. */
-    X509 *leaf = sk_X509_value(ctx->chain, 0);
-    if (has_name_constraints && leaf->altname == NULL) {
-        rv = reject_dns_name_in_common_name(leaf);
-        switch (rv) {
-        case X509_V_OK:
-            break;
-        case X509_V_ERR_OUT_OF_MEM:
-            ctx->error = rv;
-            return 0;
-        default:
-            ctx->error = rv;
-            ctx->error_depth = i;
-            ctx->current_cert = leaf;
-            if (!ctx->verify_cb(0, ctx))
-                return 0;
-            break;
-        }
+    // Don't look in full CRL if delta reason is removefromCRL
+    if (ok != 2) {
+      ok = ctx->cert_crl(ctx, crl, x);
+      if (!ok) {
+        goto err;
+      }
     }
 
-    return 1;
-}
-
-static int check_id_error(X509_STORE_CTX *ctx, int errcode)
-{
-    ctx->error = errcode;
-    ctx->current_cert = ctx->cert;
-    ctx->error_depth = 0;
-    return ctx->verify_cb(0, ctx);
-}
-
-static int check_hosts(X509 *x, X509_VERIFY_PARAM *param)
-{
-    size_t i;
-    size_t n = sk_OPENSSL_STRING_num(param->hosts);
-    char *name;
-
-    if (param->peername != NULL) {
-        OPENSSL_free(param->peername);
-        param->peername = NULL;
-    }
-    for (i = 0; i < n; ++i) {
-        name = sk_OPENSSL_STRING_value(param->hosts, i);
-        if (X509_check_host(x, name, strlen(name), param->hostflags,
-                            &param->peername) > 0)
-            return 1;
-    }
-    return n == 0;
-}
-
-static int check_id(X509_STORE_CTX *ctx)
-{
-    X509_VERIFY_PARAM *vpm = ctx->param;
-    X509 *x = ctx->cert;
-    if (vpm->poison) {
-        if (!check_id_error(ctx, X509_V_ERR_INVALID_CALL))
-            return 0;
-    }
-    if (vpm->hosts && check_hosts(x, vpm) <= 0) {
-        if (!check_id_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH))
-            return 0;
-    }
-    if (vpm->email && X509_check_email(x, vpm->email, vpm->emaillen, 0) <= 0) {
-        if (!check_id_error(ctx, X509_V_ERR_EMAIL_MISMATCH))
-            return 0;
-    }
-    if (vpm->ip && X509_check_ip(x, vpm->ip, vpm->iplen, 0) <= 0) {
-        if (!check_id_error(ctx, X509_V_ERR_IP_ADDRESS_MISMATCH))
-            return 0;
-    }
-    return 1;
-}
-
-static int check_trust(X509_STORE_CTX *ctx)
-{
-    size_t i;
-    int ok;
-    X509 *x = NULL;
-    int (*cb) (int xok, X509_STORE_CTX *xctx);
-    cb = ctx->verify_cb;
-    /* Check all trusted certificates in chain */
-    for (i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) {
-        x = sk_X509_value(ctx->chain, i);
-        ok = X509_check_trust(x, ctx->param->trust, 0);
-        /* If explicitly trusted return trusted */
-        if (ok == X509_TRUST_TRUSTED)
-            return X509_TRUST_TRUSTED;
-        /*
-         * If explicitly rejected notify callback and reject if not
-         * overridden.
-         */
-        if (ok == X509_TRUST_REJECTED) {
-            ctx->error_depth = i;
-            ctx->current_cert = x;
-            ctx->error = X509_V_ERR_CERT_REJECTED;
-            ok = cb(0, ctx);
-            if (!ok)
-                return X509_TRUST_REJECTED;
-        }
-    }
-    /*
-     * If we accept partial chains and have at least one trusted certificate
-     * return success.
-     */
-    if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
-        X509 *mx;
-        if (ctx->last_untrusted < (int)sk_X509_num(ctx->chain))
-            return X509_TRUST_TRUSTED;
-        x = sk_X509_value(ctx->chain, 0);
-        mx = lookup_cert_match(ctx, x);
-        if (mx) {
-            (void)sk_X509_set(ctx->chain, 0, mx);
-            X509_free(x);
-            ctx->last_untrusted = 0;
-            return X509_TRUST_TRUSTED;
-        }
-    }
-
-    /*
-     * If no trusted certs in chain at all return untrusted and allow
-     * standard (no issuer cert) etc errors to be indicated.
-     */
-    return X509_TRUST_UNTRUSTED;
-}
-
-static int check_revocation(X509_STORE_CTX *ctx)
-{
-    int i, last, ok;
-    if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
-        return 1;
-    if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
-        last = sk_X509_num(ctx->chain) - 1;
-    else {
-        /* If checking CRL paths this isn't the EE certificate */
-        if (ctx->parent)
-            return 1;
-        last = 0;
-    }
-    for (i = 0; i <= last; i++) {
-        ctx->error_depth = i;
-        ok = check_cert(ctx);
-        if (!ok)
-            return ok;
-    }
-    return 1;
-}
-
-static int check_cert(X509_STORE_CTX *ctx)
-{
-    X509_CRL *crl = NULL, *dcrl = NULL;
-    X509 *x;
-    int ok = 0, cnum;
-    unsigned int last_reasons;
-    cnum = ctx->error_depth;
-    x = sk_X509_value(ctx->chain, cnum);
-    ctx->current_cert = x;
-    ctx->current_issuer = NULL;
-    ctx->current_crl_score = 0;
-    ctx->current_reasons = 0;
-    while (ctx->current_reasons != CRLDP_ALL_REASONS) {
-        last_reasons = ctx->current_reasons;
-        /* Try to retrieve relevant CRL */
-        if (ctx->get_crl)
-            ok = ctx->get_crl(ctx, &crl, x);
-        else
-            ok = get_crl_delta(ctx, &crl, &dcrl, x);
-        /*
-         * If error looking up CRL, nothing we can do except notify callback
-         */
-        if (!ok) {
-            ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
-            ok = ctx->verify_cb(0, ctx);
-            goto err;
-        }
-        ctx->current_crl = crl;
-        ok = ctx->check_crl(ctx, crl);
-        if (!ok)
-            goto err;
-
-        if (dcrl) {
-            ok = ctx->check_crl(ctx, dcrl);
-            if (!ok)
-                goto err;
-            ok = ctx->cert_crl(ctx, dcrl, x);
-            if (!ok)
-                goto err;
-        } else
-            ok = 1;
-
-        /* Don't look in full CRL if delta reason is removefromCRL */
-        if (ok != 2) {
-            ok = ctx->cert_crl(ctx, crl, x);
-            if (!ok)
-                goto err;
-        }
-
-        X509_CRL_free(crl);
-        X509_CRL_free(dcrl);
-        crl = NULL;
-        dcrl = NULL;
-        /*
-         * If reasons not updated we wont get anywhere by another iteration,
-         * so exit loop.
-         */
-        if (last_reasons == ctx->current_reasons) {
-            ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
-            ok = ctx->verify_cb(0, ctx);
-            goto err;
-        }
-    }
- err:
     X509_CRL_free(crl);
     X509_CRL_free(dcrl);
+    crl = NULL;
+    dcrl = NULL;
+    // If reasons not updated we wont get anywhere by another iteration,
+    // so exit loop.
+    if (last_reasons == ctx->current_reasons) {
+      ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
+      ok = ctx->verify_cb(0, ctx);
+      goto err;
+    }
+  }
+err:
+  X509_CRL_free(crl);
+  X509_CRL_free(dcrl);
 
-    ctx->current_crl = NULL;
-    return ok;
-
+  ctx->current_crl = NULL;
+  return ok;
 }
 
-/* Check CRL times against values in X509_STORE_CTX */
+// Check CRL times against values in X509_STORE_CTX
 
-static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify)
-{
-    time_t *ptime;
-    int i;
-    if (notify)
-        ctx->current_crl = crl;
-    if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
-        ptime = &ctx->param->check_time;
-    else
-        ptime = NULL;
-
-    i = X509_cmp_time(X509_CRL_get0_lastUpdate(crl), ptime);
-    if (i == 0) {
-        if (!notify)
-            return 0;
-        ctx->error = X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    if (i > 0) {
-        if (!notify)
-            return 0;
-        ctx->error = X509_V_ERR_CRL_NOT_YET_VALID;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    if (X509_CRL_get0_nextUpdate(crl)) {
-        i = X509_cmp_time(X509_CRL_get0_nextUpdate(crl), ptime);
-
-        if (i == 0) {
-            if (!notify)
-                return 0;
-            ctx->error = X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
-            if (!ctx->verify_cb(0, ctx))
-                return 0;
-        }
-        /* Ignore expiry of base CRL is delta is valid */
-        if ((i < 0) && !(ctx->current_crl_score & CRL_SCORE_TIME_DELTA)) {
-            if (!notify)
-                return 0;
-            ctx->error = X509_V_ERR_CRL_HAS_EXPIRED;
-            if (!ctx->verify_cb(0, ctx))
-                return 0;
-        }
-    }
-
-    if (notify)
-        ctx->current_crl = NULL;
-
+static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) {
+  if (ctx->param->flags & X509_V_FLAG_NO_CHECK_TIME) {
     return 1;
+  }
+
+  if (notify) {
+    ctx->current_crl = crl;
+  }
+  time_t *ptime;
+  if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) {
+    ptime = &ctx->param->check_time;
+  } else {
+    ptime = NULL;
+  }
+
+  int i = X509_cmp_time(X509_CRL_get0_lastUpdate(crl), ptime);
+  if (i == 0) {
+    if (!notify) {
+      return 0;
+    }
+    ctx->error = X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  if (i > 0) {
+    if (!notify) {
+      return 0;
+    }
+    ctx->error = X509_V_ERR_CRL_NOT_YET_VALID;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  if (X509_CRL_get0_nextUpdate(crl)) {
+    i = X509_cmp_time(X509_CRL_get0_nextUpdate(crl), ptime);
+
+    if (i == 0) {
+      if (!notify) {
+        return 0;
+      }
+      ctx->error = X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
+      if (!ctx->verify_cb(0, ctx)) {
+        return 0;
+      }
+    }
+    // Ignore expiry of base CRL is delta is valid
+    if ((i < 0) && !(ctx->current_crl_score & CRL_SCORE_TIME_DELTA)) {
+      if (!notify) {
+        return 0;
+      }
+      ctx->error = X509_V_ERR_CRL_HAS_EXPIRED;
+      if (!ctx->verify_cb(0, ctx)) {
+        return 0;
+      }
+    }
+  }
+
+  if (notify) {
+    ctx->current_crl = NULL;
+  }
+
+  return 1;
 }
 
 static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl,
                       X509 **pissuer, int *pscore, unsigned int *preasons,
-                      STACK_OF(X509_CRL) *crls)
-{
-    int crl_score, best_score = *pscore;
-    size_t i;
-    unsigned int reasons, best_reasons = 0;
-    X509 *x = ctx->current_cert;
-    X509_CRL *crl, *best_crl = NULL;
-    X509 *crl_issuer = NULL, *best_crl_issuer = NULL;
+                      STACK_OF(X509_CRL) *crls) {
+  int crl_score, best_score = *pscore;
+  size_t i;
+  unsigned int reasons, best_reasons = 0;
+  X509 *x = ctx->current_cert;
+  X509_CRL *crl, *best_crl = NULL;
+  X509 *crl_issuer = NULL, *best_crl_issuer = NULL;
 
-    for (i = 0; i < sk_X509_CRL_num(crls); i++) {
-        crl = sk_X509_CRL_value(crls, i);
-        reasons = *preasons;
-        crl_score = get_crl_score(ctx, &crl_issuer, &reasons, crl, x);
-        if (crl_score < best_score || crl_score == 0)
-            continue;
-        /* If current CRL is equivalent use it if it is newer */
-        if (crl_score == best_score && best_crl != NULL) {
-            int day, sec;
-            if (ASN1_TIME_diff(&day, &sec, X509_CRL_get0_lastUpdate(best_crl),
-                               X509_CRL_get0_lastUpdate(crl)) == 0)
-                continue;
-            /*
-             * ASN1_TIME_diff never returns inconsistent signs for |day|
-             * and |sec|.
-             */
-            if (day <= 0 && sec <= 0)
-                continue;
-        }
-        best_crl = crl;
-        best_crl_issuer = crl_issuer;
-        best_score = crl_score;
-        best_reasons = reasons;
+  for (i = 0; i < sk_X509_CRL_num(crls); i++) {
+    crl = sk_X509_CRL_value(crls, i);
+    reasons = *preasons;
+    crl_score = get_crl_score(ctx, &crl_issuer, &reasons, crl, x);
+    if (crl_score < best_score || crl_score == 0) {
+      continue;
     }
-
-    if (best_crl) {
-        if (*pcrl)
-            X509_CRL_free(*pcrl);
-        *pcrl = best_crl;
-        *pissuer = best_crl_issuer;
-        *pscore = best_score;
-        *preasons = best_reasons;
-        X509_CRL_up_ref(best_crl);
-        if (*pdcrl) {
-            X509_CRL_free(*pdcrl);
-            *pdcrl = NULL;
-        }
-        get_delta_sk(ctx, pdcrl, pscore, best_crl, crls);
+    // If current CRL is equivalent use it if it is newer
+    if (crl_score == best_score && best_crl != NULL) {
+      int day, sec;
+      if (ASN1_TIME_diff(&day, &sec, X509_CRL_get0_lastUpdate(best_crl),
+                         X509_CRL_get0_lastUpdate(crl)) == 0) {
+        continue;
+      }
+      // ASN1_TIME_diff never returns inconsistent signs for |day|
+      // and |sec|.
+      if (day <= 0 && sec <= 0) {
+        continue;
+      }
     }
+    best_crl = crl;
+    best_crl_issuer = crl_issuer;
+    best_score = crl_score;
+    best_reasons = reasons;
+  }
 
-    if (best_score >= CRL_SCORE_VALID)
-        return 1;
+  if (best_crl) {
+    if (*pcrl) {
+      X509_CRL_free(*pcrl);
+    }
+    *pcrl = best_crl;
+    *pissuer = best_crl_issuer;
+    *pscore = best_score;
+    *preasons = best_reasons;
+    X509_CRL_up_ref(best_crl);
+    if (*pdcrl) {
+      X509_CRL_free(*pdcrl);
+      *pdcrl = NULL;
+    }
+    get_delta_sk(ctx, pdcrl, pscore, best_crl, crls);
+  }
 
-    return 0;
-}
-
-/*
- * Compare two CRL extensions for delta checking purposes. They should be
- * both present or both absent. If both present all fields must be identical.
- */
-
-static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid)
-{
-    ASN1_OCTET_STRING *exta, *extb;
-    int i;
-    i = X509_CRL_get_ext_by_NID(a, nid, -1);
-    if (i >= 0) {
-        /* Can't have multiple occurrences */
-        if (X509_CRL_get_ext_by_NID(a, nid, i) != -1)
-            return 0;
-        exta = X509_EXTENSION_get_data(X509_CRL_get_ext(a, i));
-    } else
-        exta = NULL;
-
-    i = X509_CRL_get_ext_by_NID(b, nid, -1);
-
-    if (i >= 0) {
-
-        if (X509_CRL_get_ext_by_NID(b, nid, i) != -1)
-            return 0;
-        extb = X509_EXTENSION_get_data(X509_CRL_get_ext(b, i));
-    } else
-        extb = NULL;
-
-    if (!exta && !extb)
-        return 1;
-
-    if (!exta || !extb)
-        return 0;
-
-    if (ASN1_OCTET_STRING_cmp(exta, extb))
-        return 0;
-
+  if (best_score >= CRL_SCORE_VALID) {
     return 1;
+  }
+
+  return 0;
 }
 
-/* See if a base and delta are compatible */
+// Compare two CRL extensions for delta checking purposes. They should be
+// both present or both absent. If both present all fields must be identical.
 
-static int check_delta_base(X509_CRL *delta, X509_CRL *base)
-{
-    /* Delta CRL must be a delta */
-    if (!delta->base_crl_number)
-        return 0;
-    /* Base must have a CRL number */
-    if (!base->crl_number)
-        return 0;
-    /* Issuer names must match */
-    if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(delta)))
-        return 0;
-    /* AKID and IDP must match */
-    if (!crl_extension_match(delta, base, NID_authority_key_identifier))
-        return 0;
-    if (!crl_extension_match(delta, base, NID_issuing_distribution_point))
-        return 0;
-    /* Delta CRL base number must not exceed Full CRL number. */
-    if (ASN1_INTEGER_cmp(delta->base_crl_number, base->crl_number) > 0)
-        return 0;
-    /* Delta CRL number must exceed full CRL number */
-    if (ASN1_INTEGER_cmp(delta->crl_number, base->crl_number) > 0)
-        return 1;
+static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid) {
+  const ASN1_OCTET_STRING *exta, *extb;
+  int i;
+  i = X509_CRL_get_ext_by_NID(a, nid, -1);
+  if (i >= 0) {
+    // Can't have multiple occurrences
+    if (X509_CRL_get_ext_by_NID(a, nid, i) != -1) {
+      return 0;
+    }
+    exta = X509_EXTENSION_get_data(X509_CRL_get_ext(a, i));
+  } else {
+    exta = NULL;
+  }
+
+  i = X509_CRL_get_ext_by_NID(b, nid, -1);
+
+  if (i >= 0) {
+    if (X509_CRL_get_ext_by_NID(b, nid, i) != -1) {
+      return 0;
+    }
+    extb = X509_EXTENSION_get_data(X509_CRL_get_ext(b, i));
+  } else {
+    extb = NULL;
+  }
+
+  if (!exta && !extb) {
+    return 1;
+  }
+
+  if (!exta || !extb) {
     return 0;
+  }
+
+  if (ASN1_OCTET_STRING_cmp(exta, extb)) {
+    return 0;
+  }
+
+  return 1;
 }
 
-/*
- * For a given base CRL find a delta... maybe extend to delta scoring or
- * retrieve a chain of deltas...
- */
+// See if a base and delta are compatible
+
+static int check_delta_base(X509_CRL *delta, X509_CRL *base) {
+  // Delta CRL must be a delta
+  if (!delta->base_crl_number) {
+    return 0;
+  }
+  // Base must have a CRL number
+  if (!base->crl_number) {
+    return 0;
+  }
+  // Issuer names must match
+  if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(delta))) {
+    return 0;
+  }
+  // AKID and IDP must match
+  if (!crl_extension_match(delta, base, NID_authority_key_identifier)) {
+    return 0;
+  }
+  if (!crl_extension_match(delta, base, NID_issuing_distribution_point)) {
+    return 0;
+  }
+  // Delta CRL base number must not exceed Full CRL number.
+  if (ASN1_INTEGER_cmp(delta->base_crl_number, base->crl_number) > 0) {
+    return 0;
+  }
+  // Delta CRL number must exceed full CRL number
+  if (ASN1_INTEGER_cmp(delta->crl_number, base->crl_number) > 0) {
+    return 1;
+  }
+  return 0;
+}
+
+// For a given base CRL find a delta... maybe extend to delta scoring or
+// retrieve a chain of deltas...
 
 static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pscore,
-                         X509_CRL *base, STACK_OF(X509_CRL) *crls)
-{
-    X509_CRL *delta;
-    size_t i;
-    if (!(ctx->param->flags & X509_V_FLAG_USE_DELTAS))
-        return;
-    if (!((ctx->current_cert->ex_flags | base->flags) & EXFLAG_FRESHEST))
-        return;
-    for (i = 0; i < sk_X509_CRL_num(crls); i++) {
-        delta = sk_X509_CRL_value(crls, i);
-        if (check_delta_base(delta, base)) {
-            if (check_crl_time(ctx, delta, 0))
-                *pscore |= CRL_SCORE_TIME_DELTA;
-            X509_CRL_up_ref(delta);
-            *dcrl = delta;
-            return;
-        }
+                         X509_CRL *base, STACK_OF(X509_CRL) *crls) {
+  X509_CRL *delta;
+  size_t i;
+  if (!(ctx->param->flags & X509_V_FLAG_USE_DELTAS)) {
+    return;
+  }
+  if (!((ctx->current_cert->ex_flags | base->flags) & EXFLAG_FRESHEST)) {
+    return;
+  }
+  for (i = 0; i < sk_X509_CRL_num(crls); i++) {
+    delta = sk_X509_CRL_value(crls, i);
+    if (check_delta_base(delta, base)) {
+      if (check_crl_time(ctx, delta, 0)) {
+        *pscore |= CRL_SCORE_TIME_DELTA;
+      }
+      X509_CRL_up_ref(delta);
+      *dcrl = delta;
+      return;
     }
-    *dcrl = NULL;
+  }
+  *dcrl = NULL;
 }
 
-/*
- * For a given CRL return how suitable it is for the supplied certificate
- * 'x'. The return value is a mask of several criteria. If the issuer is not
- * the certificate issuer this is returned in *pissuer. The reasons mask is
- * also used to determine if the CRL is suitable: if no new reasons the CRL
- * is rejected, otherwise reasons is updated.
- */
+// For a given CRL return how suitable it is for the supplied certificate
+// 'x'. The return value is a mask of several criteria. If the issuer is not
+// the certificate issuer this is returned in *pissuer. The reasons mask is
+// also used to determine if the CRL is suitable: if no new reasons the CRL
+// is rejected, otherwise reasons is updated.
 
 static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
-                         unsigned int *preasons, X509_CRL *crl, X509 *x)
-{
+                         unsigned int *preasons, X509_CRL *crl, X509 *x) {
+  int crl_score = 0;
+  unsigned int tmp_reasons = *preasons, crl_reasons;
 
-    int crl_score = 0;
-    unsigned int tmp_reasons = *preasons, crl_reasons;
+  // First see if we can reject CRL straight away
 
-    /* First see if we can reject CRL straight away */
-
-    /* Invalid IDP cannot be processed */
-    if (crl->idp_flags & IDP_INVALID)
-        return 0;
-    /* Reason codes or indirect CRLs need extended CRL support */
-    if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) {
-        if (crl->idp_flags & (IDP_INDIRECT | IDP_REASONS))
-            return 0;
-    } else if (crl->idp_flags & IDP_REASONS) {
-        /* If no new reasons reject */
-        if (!(crl->idp_reasons & ~tmp_reasons))
-            return 0;
+  // Invalid IDP cannot be processed
+  if (crl->idp_flags & IDP_INVALID) {
+    return 0;
+  }
+  // Reason codes or indirect CRLs need extended CRL support
+  if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) {
+    if (crl->idp_flags & (IDP_INDIRECT | IDP_REASONS)) {
+      return 0;
     }
-    /* Don't process deltas at this stage */
-    else if (crl->base_crl_number)
-        return 0;
-    /* If issuer name doesn't match certificate need indirect CRL */
-    if (X509_NAME_cmp(X509_get_issuer_name(x), X509_CRL_get_issuer(crl))) {
-        if (!(crl->idp_flags & IDP_INDIRECT))
-            return 0;
-    } else
-        crl_score |= CRL_SCORE_ISSUER_NAME;
-
-    if (!(crl->flags & EXFLAG_CRITICAL))
-        crl_score |= CRL_SCORE_NOCRITICAL;
-
-    /* Check expiry */
-    if (check_crl_time(ctx, crl, 0))
-        crl_score |= CRL_SCORE_TIME;
-
-    /* Check authority key ID and locate certificate issuer */
-    crl_akid_check(ctx, crl, pissuer, &crl_score);
-
-    /* If we can't locate certificate issuer at this point forget it */
-
-    if (!(crl_score & CRL_SCORE_AKID))
-        return 0;
-
-    /* Check cert for matching CRL distribution points */
-
-    if (crl_crldp_check(x, crl, crl_score, &crl_reasons)) {
-        /* If no new reasons reject */
-        if (!(crl_reasons & ~tmp_reasons))
-            return 0;
-        tmp_reasons |= crl_reasons;
-        crl_score |= CRL_SCORE_SCOPE;
+  } else if (crl->idp_flags & IDP_REASONS) {
+    // If no new reasons reject
+    if (!(crl->idp_reasons & ~tmp_reasons)) {
+      return 0;
     }
+  }
+  // Don't process deltas at this stage
+  else if (crl->base_crl_number) {
+    return 0;
+  }
+  // If issuer name doesn't match certificate need indirect CRL
+  if (X509_NAME_cmp(X509_get_issuer_name(x), X509_CRL_get_issuer(crl))) {
+    if (!(crl->idp_flags & IDP_INDIRECT)) {
+      return 0;
+    }
+  } else {
+    crl_score |= CRL_SCORE_ISSUER_NAME;
+  }
 
-    *preasons = tmp_reasons;
+  if (!(crl->flags & EXFLAG_CRITICAL)) {
+    crl_score |= CRL_SCORE_NOCRITICAL;
+  }
 
-    return crl_score;
+  // Check expiry
+  if (check_crl_time(ctx, crl, 0)) {
+    crl_score |= CRL_SCORE_TIME;
+  }
 
+  // Check authority key ID and locate certificate issuer
+  crl_akid_check(ctx, crl, pissuer, &crl_score);
+
+  // If we can't locate certificate issuer at this point forget it
+
+  if (!(crl_score & CRL_SCORE_AKID)) {
+    return 0;
+  }
+
+  // Check cert for matching CRL distribution points
+
+  if (crl_crldp_check(x, crl, crl_score, &crl_reasons)) {
+    // If no new reasons reject
+    if (!(crl_reasons & ~tmp_reasons)) {
+      return 0;
+    }
+    tmp_reasons |= crl_reasons;
+    crl_score |= CRL_SCORE_SCOPE;
+  }
+
+  *preasons = tmp_reasons;
+
+  return crl_score;
 }
 
-static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl,
-                           X509 **pissuer, int *pcrl_score)
-{
-    X509 *crl_issuer = NULL;
-    X509_NAME *cnm = X509_CRL_get_issuer(crl);
-    int cidx = ctx->error_depth;
-    size_t i;
+static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer,
+                           int *pcrl_score) {
+  X509 *crl_issuer = NULL;
+  X509_NAME *cnm = X509_CRL_get_issuer(crl);
+  int cidx = ctx->error_depth;
+  size_t i;
 
-    if ((size_t)cidx != sk_X509_num(ctx->chain) - 1)
-        cidx++;
+  if ((size_t)cidx != sk_X509_num(ctx->chain) - 1) {
+    cidx++;
+  }
 
+  crl_issuer = sk_X509_value(ctx->chain, cidx);
+
+  if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
+    if (*pcrl_score & CRL_SCORE_ISSUER_NAME) {
+      *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_ISSUER_CERT;
+      *pissuer = crl_issuer;
+      return;
+    }
+  }
+
+  for (cidx++; cidx < (int)sk_X509_num(ctx->chain); cidx++) {
     crl_issuer = sk_X509_value(ctx->chain, cidx);
-
+    if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm)) {
+      continue;
+    }
     if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
-        if (*pcrl_score & CRL_SCORE_ISSUER_NAME) {
-            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_ISSUER_CERT;
-            *pissuer = crl_issuer;
-            return;
-        }
+      *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_SAME_PATH;
+      *pissuer = crl_issuer;
+      return;
     }
+  }
 
-    for (cidx++; cidx < (int)sk_X509_num(ctx->chain); cidx++) {
-        crl_issuer = sk_X509_value(ctx->chain, cidx);
-        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
-            continue;
-        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
-            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_SAME_PATH;
-            *pissuer = crl_issuer;
-            return;
-        }
+  // Anything else needs extended CRL support
+
+  if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) {
+    return;
+  }
+
+  // Otherwise the CRL issuer is not on the path. Look for it in the set of
+  // untrusted certificates.
+  for (i = 0; i < sk_X509_num(ctx->untrusted); i++) {
+    crl_issuer = sk_X509_value(ctx->untrusted, i);
+    if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm)) {
+      continue;
     }
-
-    /* Anything else needs extended CRL support */
-
-    if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT))
-        return;
-
-    /*
-     * Otherwise the CRL issuer is not on the path. Look for it in the set of
-     * untrusted certificates.
-     */
-    for (i = 0; i < sk_X509_num(ctx->untrusted); i++) {
-        crl_issuer = sk_X509_value(ctx->untrusted, i);
-        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
-            continue;
-        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
-            *pissuer = crl_issuer;
-            *pcrl_score |= CRL_SCORE_AKID;
-            return;
-        }
+    if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
+      *pissuer = crl_issuer;
+      *pcrl_score |= CRL_SCORE_AKID;
+      return;
     }
+  }
 }
 
-/*
- * Check the path of a CRL issuer certificate. This creates a new
- * X509_STORE_CTX and populates it with most of the parameters from the
- * parent. This could be optimised somewhat since a lot of path checking will
- * be duplicated by the parent, but this will rarely be used in practice.
- */
+// Check the path of a CRL issuer certificate. This creates a new
+// X509_STORE_CTX and populates it with most of the parameters from the
+// parent. This could be optimised somewhat since a lot of path checking will
+// be duplicated by the parent, but this will rarely be used in practice.
 
-static int check_crl_path(X509_STORE_CTX *ctx, X509 *x)
-{
-    X509_STORE_CTX crl_ctx;
-    int ret;
-    /* Don't allow recursive CRL path validation */
-    if (ctx->parent)
+static int check_crl_path(X509_STORE_CTX *ctx, X509 *x) {
+  X509_STORE_CTX crl_ctx;
+  int ret;
+  // Don't allow recursive CRL path validation
+  if (ctx->parent) {
+    return 0;
+  }
+  if (!X509_STORE_CTX_init(&crl_ctx, ctx->ctx, x, ctx->untrusted)) {
+    return -1;
+  }
+
+  crl_ctx.crls = ctx->crls;
+  // Copy verify params across
+  X509_STORE_CTX_set0_param(&crl_ctx, ctx->param);
+
+  crl_ctx.parent = ctx;
+  crl_ctx.verify_cb = ctx->verify_cb;
+
+  // Verify CRL issuer
+  ret = X509_verify_cert(&crl_ctx);
+
+  if (ret <= 0) {
+    goto err;
+  }
+
+  // Check chain is acceptable
+
+  ret = check_crl_chain(ctx, ctx->chain, crl_ctx.chain);
+err:
+  X509_STORE_CTX_cleanup(&crl_ctx);
+  return ret;
+}
+
+// RFC 3280 says nothing about the relationship between CRL path and
+// certificate path, which could lead to situations where a certificate could
+// be revoked or validated by a CA not authorised to do so. RFC 5280 is more
+// strict and states that the two paths must end in the same trust anchor,
+// though some discussions remain... until this is resolved we use the
+// RFC 5280 version
+
+static int check_crl_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *cert_path,
+                           STACK_OF(X509) *crl_path) {
+  X509 *cert_ta, *crl_ta;
+  cert_ta = sk_X509_value(cert_path, sk_X509_num(cert_path) - 1);
+  crl_ta = sk_X509_value(crl_path, sk_X509_num(crl_path) - 1);
+  if (!X509_cmp(cert_ta, crl_ta)) {
+    return 1;
+  }
+  return 0;
+}
+
+// Check for match between two dist point names: three separate cases. 1.
+// Both are relative names and compare X509_NAME types. 2. One full, one
+// relative. Compare X509_NAME to GENERAL_NAMES. 3. Both are full names and
+// compare two GENERAL_NAMES. 4. One is NULL: automatic match.
+
+static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b) {
+  X509_NAME *nm = NULL;
+  GENERAL_NAMES *gens = NULL;
+  GENERAL_NAME *gena, *genb;
+  size_t i, j;
+  if (!a || !b) {
+    return 1;
+  }
+  if (a->type == 1) {
+    if (!a->dpname) {
+      return 0;
+    }
+    // Case 1: two X509_NAME
+    if (b->type == 1) {
+      if (!b->dpname) {
         return 0;
-    if (!X509_STORE_CTX_init(&crl_ctx, ctx->ctx, x, ctx->untrusted))
-        return -1;
-
-    crl_ctx.crls = ctx->crls;
-    /* Copy verify params across */
-    X509_STORE_CTX_set0_param(&crl_ctx, ctx->param);
-
-    crl_ctx.parent = ctx;
-    crl_ctx.verify_cb = ctx->verify_cb;
-
-    /* Verify CRL issuer */
-    ret = X509_verify_cert(&crl_ctx);
-
-    if (ret <= 0)
-        goto err;
-
-    /* Check chain is acceptable */
-
-    ret = check_crl_chain(ctx, ctx->chain, crl_ctx.chain);
- err:
-    X509_STORE_CTX_cleanup(&crl_ctx);
-    return ret;
-}
-
-/*
- * RFC 3280 says nothing about the relationship between CRL path and
- * certificate path, which could lead to situations where a certificate could
- * be revoked or validated by a CA not authorised to do so. RFC 5280 is more
- * strict and states that the two paths must end in the same trust anchor,
- * though some discussions remain... until this is resolved we use the
- * RFC 5280 version
- */
-
-static int check_crl_chain(X509_STORE_CTX *ctx,
-                           STACK_OF(X509) *cert_path,
-                           STACK_OF(X509) *crl_path)
-{
-    X509 *cert_ta, *crl_ta;
-    cert_ta = sk_X509_value(cert_path, sk_X509_num(cert_path) - 1);
-    crl_ta = sk_X509_value(crl_path, sk_X509_num(crl_path) - 1);
-    if (!X509_cmp(cert_ta, crl_ta))
+      }
+      if (!X509_NAME_cmp(a->dpname, b->dpname)) {
         return 1;
-    return 0;
-}
-
-/*
- * Check for match between two dist point names: three separate cases. 1.
- * Both are relative names and compare X509_NAME types. 2. One full, one
- * relative. Compare X509_NAME to GENERAL_NAMES. 3. Both are full names and
- * compare two GENERAL_NAMES. 4. One is NULL: automatic match.
- */
-
-static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b)
-{
-    X509_NAME *nm = NULL;
-    GENERAL_NAMES *gens = NULL;
-    GENERAL_NAME *gena, *genb;
-    size_t i, j;
-    if (!a || !b)
-        return 1;
-    if (a->type == 1) {
-        if (!a->dpname)
-            return 0;
-        /* Case 1: two X509_NAME */
-        if (b->type == 1) {
-            if (!b->dpname)
-                return 0;
-            if (!X509_NAME_cmp(a->dpname, b->dpname))
-                return 1;
-            else
-                return 0;
-        }
-        /* Case 2: set name and GENERAL_NAMES appropriately */
-        nm = a->dpname;
-        gens = b->name.fullname;
-    } else if (b->type == 1) {
-        if (!b->dpname)
-            return 0;
-        /* Case 2: set name and GENERAL_NAMES appropriately */
-        gens = a->name.fullname;
-        nm = b->dpname;
-    }
-
-    /* Handle case 2 with one GENERAL_NAMES and one X509_NAME */
-    if (nm) {
-        for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
-            gena = sk_GENERAL_NAME_value(gens, i);
-            if (gena->type != GEN_DIRNAME)
-                continue;
-            if (!X509_NAME_cmp(nm, gena->d.directoryName))
-                return 1;
-        }
+      } else {
         return 0;
+      }
     }
-
-    /* Else case 3: two GENERAL_NAMES */
-
-    for (i = 0; i < sk_GENERAL_NAME_num(a->name.fullname); i++) {
-        gena = sk_GENERAL_NAME_value(a->name.fullname, i);
-        for (j = 0; j < sk_GENERAL_NAME_num(b->name.fullname); j++) {
-            genb = sk_GENERAL_NAME_value(b->name.fullname, j);
-            if (!GENERAL_NAME_cmp(gena, genb))
-                return 1;
-        }
+    // Case 2: set name and GENERAL_NAMES appropriately
+    nm = a->dpname;
+    gens = b->name.fullname;
+  } else if (b->type == 1) {
+    if (!b->dpname) {
+      return 0;
     }
+    // Case 2: set name and GENERAL_NAMES appropriately
+    gens = a->name.fullname;
+    nm = b->dpname;
+  }
 
-    return 0;
-
-}
-
-static int crldp_check_crlissuer(DIST_POINT *dp, X509_CRL *crl, int crl_score)
-{
-    size_t i;
-    X509_NAME *nm = X509_CRL_get_issuer(crl);
-    /* If no CRLissuer return is successful iff don't need a match */
-    if (!dp->CRLissuer)
-        return ! !(crl_score & CRL_SCORE_ISSUER_NAME);
-    for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i);
-        if (gen->type != GEN_DIRNAME)
-            continue;
-        if (!X509_NAME_cmp(gen->d.directoryName, nm))
-            return 1;
+  // Handle case 2 with one GENERAL_NAMES and one X509_NAME
+  if (nm) {
+    for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
+      gena = sk_GENERAL_NAME_value(gens, i);
+      if (gena->type != GEN_DIRNAME) {
+        continue;
+      }
+      if (!X509_NAME_cmp(nm, gena->d.directoryName)) {
+        return 1;
+      }
     }
     return 0;
+  }
+
+  // Else case 3: two GENERAL_NAMES
+
+  for (i = 0; i < sk_GENERAL_NAME_num(a->name.fullname); i++) {
+    gena = sk_GENERAL_NAME_value(a->name.fullname, i);
+    for (j = 0; j < sk_GENERAL_NAME_num(b->name.fullname); j++) {
+      genb = sk_GENERAL_NAME_value(b->name.fullname, j);
+      if (!GENERAL_NAME_cmp(gena, genb)) {
+        return 1;
+      }
+    }
+  }
+
+  return 0;
 }
 
-/* Check CRLDP and IDP */
+static int crldp_check_crlissuer(DIST_POINT *dp, X509_CRL *crl, int crl_score) {
+  size_t i;
+  X509_NAME *nm = X509_CRL_get_issuer(crl);
+  // If no CRLissuer return is successful iff don't need a match
+  if (!dp->CRLissuer) {
+    return !!(crl_score & CRL_SCORE_ISSUER_NAME);
+  }
+  for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i);
+    if (gen->type != GEN_DIRNAME) {
+      continue;
+    }
+    if (!X509_NAME_cmp(gen->d.directoryName, nm)) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+// Check CRLDP and IDP
 
 static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score,
-                           unsigned int *preasons)
-{
-    size_t i;
-    if (crl->idp_flags & IDP_ONLYATTR)
-        return 0;
-    if (x->ex_flags & EXFLAG_CA) {
-        if (crl->idp_flags & IDP_ONLYUSER)
-            return 0;
-    } else {
-        if (crl->idp_flags & IDP_ONLYCA)
-            return 0;
-    }
-    *preasons = crl->idp_reasons;
-    for (i = 0; i < sk_DIST_POINT_num(x->crldp); i++) {
-        DIST_POINT *dp = sk_DIST_POINT_value(x->crldp, i);
-        if (crldp_check_crlissuer(dp, crl, crl_score)) {
-            if (!crl->idp || idp_check_dp(dp->distpoint, crl->idp->distpoint)) {
-                *preasons &= dp->dp_reasons;
-                return 1;
-            }
-        }
-    }
-    if ((!crl->idp || !crl->idp->distpoint)
-        && (crl_score & CRL_SCORE_ISSUER_NAME))
-        return 1;
+                           unsigned int *preasons) {
+  size_t i;
+  if (crl->idp_flags & IDP_ONLYATTR) {
     return 0;
-}
-
-/*
- * Retrieve CRL corresponding to current certificate. If deltas enabled try
- * to find a delta CRL too
- */
-
-static int get_crl_delta(X509_STORE_CTX *ctx,
-                         X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x)
-{
-    int ok;
-    X509 *issuer = NULL;
-    int crl_score = 0;
-    unsigned int reasons;
-    X509_CRL *crl = NULL, *dcrl = NULL;
-    STACK_OF(X509_CRL) *skcrl;
-    X509_NAME *nm = X509_get_issuer_name(x);
-    reasons = ctx->current_reasons;
-    ok = get_crl_sk(ctx, &crl, &dcrl,
-                    &issuer, &crl_score, &reasons, ctx->crls);
-
-    if (ok)
-        goto done;
-
-    /* Lookup CRLs from store */
-
-    skcrl = ctx->lookup_crls(ctx, nm);
-
-    /* If no CRLs found and a near match from get_crl_sk use that */
-    if (!skcrl && crl)
-        goto done;
-
-    get_crl_sk(ctx, &crl, &dcrl, &issuer, &crl_score, &reasons, skcrl);
-
-    sk_X509_CRL_pop_free(skcrl, X509_CRL_free);
-
- done:
-
-    /* If we got any kind of CRL use it and return success */
-    if (crl) {
-        ctx->current_issuer = issuer;
-        ctx->current_crl_score = crl_score;
-        ctx->current_reasons = reasons;
-        *pcrl = crl;
-        *pdcrl = dcrl;
+  }
+  if (x->ex_flags & EXFLAG_CA) {
+    if (crl->idp_flags & IDP_ONLYUSER) {
+      return 0;
+    }
+  } else {
+    if (crl->idp_flags & IDP_ONLYCA) {
+      return 0;
+    }
+  }
+  *preasons = crl->idp_reasons;
+  for (i = 0; i < sk_DIST_POINT_num(x->crldp); i++) {
+    DIST_POINT *dp = sk_DIST_POINT_value(x->crldp, i);
+    if (crldp_check_crlissuer(dp, crl, crl_score)) {
+      if (!crl->idp || idp_check_dp(dp->distpoint, crl->idp->distpoint)) {
+        *preasons &= dp->dp_reasons;
         return 1;
+      }
     }
-
-    return 0;
-}
-
-/* Check CRL validity */
-static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl)
-{
-    X509 *issuer = NULL;
-    EVP_PKEY *ikey = NULL;
-    int ok = 0, chnum, cnum;
-    cnum = ctx->error_depth;
-    chnum = sk_X509_num(ctx->chain) - 1;
-    /* if we have an alternative CRL issuer cert use that */
-    if (ctx->current_issuer)
-        issuer = ctx->current_issuer;
-
-    /*
-     * Else find CRL issuer: if not last certificate then issuer is next
-     * certificate in chain.
-     */
-    else if (cnum < chnum)
-        issuer = sk_X509_value(ctx->chain, cnum + 1);
-    else {
-        issuer = sk_X509_value(ctx->chain, chnum);
-        /* If not self signed, can't check signature */
-        if (!ctx->check_issued(ctx, issuer, issuer)) {
-            ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
-            ok = ctx->verify_cb(0, ctx);
-            if (!ok)
-                goto err;
-        }
-    }
-
-    if (issuer) {
-        /*
-         * Skip most tests for deltas because they have already been done
-         */
-        if (!crl->base_crl_number) {
-            /* Check for cRLSign bit if keyUsage present */
-            if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
-                !(issuer->ex_kusage & KU_CRL_SIGN)) {
-                ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
-                ok = ctx->verify_cb(0, ctx);
-                if (!ok)
-                    goto err;
-            }
-
-            if (!(ctx->current_crl_score & CRL_SCORE_SCOPE)) {
-                ctx->error = X509_V_ERR_DIFFERENT_CRL_SCOPE;
-                ok = ctx->verify_cb(0, ctx);
-                if (!ok)
-                    goto err;
-            }
-
-            if (!(ctx->current_crl_score & CRL_SCORE_SAME_PATH)) {
-                if (check_crl_path(ctx, ctx->current_issuer) <= 0) {
-                    ctx->error = X509_V_ERR_CRL_PATH_VALIDATION_ERROR;
-                    ok = ctx->verify_cb(0, ctx);
-                    if (!ok)
-                        goto err;
-                }
-            }
-
-            if (crl->idp_flags & IDP_INVALID) {
-                ctx->error = X509_V_ERR_INVALID_EXTENSION;
-                ok = ctx->verify_cb(0, ctx);
-                if (!ok)
-                    goto err;
-            }
-
-        }
-
-        if (!(ctx->current_crl_score & CRL_SCORE_TIME)) {
-            ok = check_crl_time(ctx, crl, 1);
-            if (!ok)
-                goto err;
-        }
-
-        /* Attempt to get issuer certificate public key */
-        ikey = X509_get_pubkey(issuer);
-
-        if (!ikey) {
-            ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
-            ok = ctx->verify_cb(0, ctx);
-            if (!ok)
-                goto err;
-        } else {
-            int rv;
-            rv = X509_CRL_check_suiteb(crl, ikey, ctx->param->flags);
-            if (rv != X509_V_OK) {
-                ctx->error = rv;
-                ok = ctx->verify_cb(0, ctx);
-                if (!ok)
-                    goto err;
-            }
-            /* Verify CRL signature */
-            if (X509_CRL_verify(crl, ikey) <= 0) {
-                ctx->error = X509_V_ERR_CRL_SIGNATURE_FAILURE;
-                ok = ctx->verify_cb(0, ctx);
-                if (!ok)
-                    goto err;
-            }
-        }
-    }
-
-    ok = 1;
-
- err:
-    EVP_PKEY_free(ikey);
-    return ok;
-}
-
-/* Check certificate against CRL */
-static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x)
-{
-    int ok;
-    X509_REVOKED *rev;
-    /*
-     * The rules changed for this... previously if a CRL contained unhandled
-     * critical extensions it could still be used to indicate a certificate
-     * was revoked. This has since been changed since critical extension can
-     * change the meaning of CRL entries.
-     */
-    if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
-        && (crl->flags & EXFLAG_CRITICAL)) {
-        ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
-        ok = ctx->verify_cb(0, ctx);
-        if (!ok)
-            return 0;
-    }
-    /*
-     * Look for serial number of certificate in CRL If found make sure reason
-     * is not removeFromCRL.
-     */
-    if (X509_CRL_get0_by_cert(crl, &rev, x)) {
-        if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
-            return 2;
-        ctx->error = X509_V_ERR_CERT_REVOKED;
-        ok = ctx->verify_cb(0, ctx);
-        if (!ok)
-            return 0;
-    }
-
+  }
+  if ((!crl->idp || !crl->idp->distpoint) &&
+      (crl_score & CRL_SCORE_ISSUER_NAME)) {
     return 1;
+  }
+  return 0;
 }
 
-static int check_policy(X509_STORE_CTX *ctx)
-{
-    int ret;
-    if (ctx->parent)
-        return 1;
-    ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
-                            ctx->param->policies, ctx->param->flags);
-    if (ret == 0) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        ctx->error = X509_V_ERR_OUT_OF_MEM;
-        return 0;
-    }
-    /* Invalid or inconsistent extensions */
-    if (ret == -1) {
-        /*
-         * Locate certificates with bad extensions and notify callback.
-         */
-        X509 *x;
-        size_t i;
-        for (i = 1; i < sk_X509_num(ctx->chain); i++) {
-            x = sk_X509_value(ctx->chain, i);
-            if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
-                continue;
-            ctx->current_cert = x;
-            ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
-            if (!ctx->verify_cb(0, ctx))
-                return 0;
-        }
-        return 1;
-    }
-    if (ret == -2) {
-        ctx->current_cert = NULL;
-        ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
-        return ctx->verify_cb(0, ctx);
-    }
+// Retrieve CRL corresponding to current certificate. If deltas enabled try
+// to find a delta CRL too
 
-    if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY) {
-        ctx->current_cert = NULL;
-        /*
-         * Verification errors need to be "sticky", a callback may have allowed
-         * an SSL handshake to continue despite an error, and we must then
-         * remain in an error state.  Therefore, we MUST NOT clear earlier
-         * verification errors by setting the error to X509_V_OK.
-         */
-        if (!ctx->verify_cb(2, ctx))
-            return 0;
-    }
+static int get_crl_delta(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl,
+                         X509 *x) {
+  int ok;
+  X509 *issuer = NULL;
+  int crl_score = 0;
+  unsigned int reasons;
+  X509_CRL *crl = NULL, *dcrl = NULL;
+  STACK_OF(X509_CRL) *skcrl;
+  X509_NAME *nm = X509_get_issuer_name(x);
+  reasons = ctx->current_reasons;
+  ok = get_crl_sk(ctx, &crl, &dcrl, &issuer, &crl_score, &reasons, ctx->crls);
 
+  if (ok) {
+    goto done;
+  }
+
+  // Lookup CRLs from store
+
+  skcrl = ctx->lookup_crls(ctx, nm);
+
+  // If no CRLs found and a near match from get_crl_sk use that
+  if (!skcrl && crl) {
+    goto done;
+  }
+
+  get_crl_sk(ctx, &crl, &dcrl, &issuer, &crl_score, &reasons, skcrl);
+
+  sk_X509_CRL_pop_free(skcrl, X509_CRL_free);
+
+done:
+
+  // If we got any kind of CRL use it and return success
+  if (crl) {
+    ctx->current_issuer = issuer;
+    ctx->current_crl_score = crl_score;
+    ctx->current_reasons = reasons;
+    *pcrl = crl;
+    *pdcrl = dcrl;
     return 1;
+  }
+
+  return 0;
 }
 
-static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)
-{
-    time_t *ptime;
-    int i;
+// Check CRL validity
+static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl) {
+  X509 *issuer = NULL;
+  EVP_PKEY *ikey = NULL;
+  int ok = 0, chnum, cnum;
+  cnum = ctx->error_depth;
+  chnum = sk_X509_num(ctx->chain) - 1;
+  // if we have an alternative CRL issuer cert use that
+  if (ctx->current_issuer) {
+    issuer = ctx->current_issuer;
+  }
 
-    if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
-        ptime = &ctx->param->check_time;
-    else
-        ptime = NULL;
-
-    i = X509_cmp_time(X509_get_notBefore(x), ptime);
-    if (i == 0) {
-        ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
-        ctx->current_cert = x;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    if (i > 0) {
-        ctx->error = X509_V_ERR_CERT_NOT_YET_VALID;
-        ctx->current_cert = x;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    i = X509_cmp_time(X509_get_notAfter(x), ptime);
-    if (i == 0) {
-        ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
-        ctx->current_cert = x;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    if (i < 0) {
-        ctx->error = X509_V_ERR_CERT_HAS_EXPIRED;
-        ctx->current_cert = x;
-        if (!ctx->verify_cb(0, ctx))
-            return 0;
-    }
-
-    return 1;
-}
-
-static int internal_verify(X509_STORE_CTX *ctx)
-{
-    int ok = 0, n;
-    X509 *xs, *xi;
-    EVP_PKEY *pkey = NULL;
-    int (*cb) (int xok, X509_STORE_CTX *xctx);
-
-    cb = ctx->verify_cb;
-
-    n = sk_X509_num(ctx->chain);
-    ctx->error_depth = n - 1;
-    n--;
-    xi = sk_X509_value(ctx->chain, n);
-
-    if (ctx->check_issued(ctx, xi, xi))
-        xs = xi;
-    else {
-        if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
-            xs = xi;
-            goto check_cert;
-        }
-        if (n <= 0) {
-            ctx->error = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
-            ctx->current_cert = xi;
-            ok = cb(0, ctx);
-            goto end;
-        } else {
-            n--;
-            ctx->error_depth = n;
-            xs = sk_X509_value(ctx->chain, n);
-        }
-    }
-
-/*      ctx->error=0;  not needed */
-    while (n >= 0) {
-        ctx->error_depth = n;
-
-        /*
-         * Skip signature check for self signed certificates unless
-         * explicitly asked for. It doesn't add any security and just wastes
-         * time.
-         */
-        if (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)) {
-            if ((pkey = X509_get_pubkey(xi)) == NULL) {
-                ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
-                ctx->current_cert = xi;
-                ok = (*cb) (0, ctx);
-                if (!ok)
-                    goto end;
-            } else if (X509_verify(xs, pkey) <= 0) {
-                ctx->error = X509_V_ERR_CERT_SIGNATURE_FAILURE;
-                ctx->current_cert = xs;
-                ok = (*cb) (0, ctx);
-                if (!ok) {
-                    EVP_PKEY_free(pkey);
-                    goto end;
-                }
-            }
-            EVP_PKEY_free(pkey);
-            pkey = NULL;
-        }
-
- check_cert:
-        ok = check_cert_time(ctx, xs);
-        if (!ok)
-            goto end;
-
-        /* The last error (if any) is still in the error value */
-        ctx->current_issuer = xi;
-        ctx->current_cert = xs;
-        ok = (*cb) (1, ctx);
-        if (!ok)
-            goto end;
-
-        n--;
-        if (n >= 0) {
-            xi = xs;
-            xs = sk_X509_value(ctx->chain, n);
-        }
-    }
-    ok = 1;
- end:
-    return ok;
-}
-
-int X509_cmp_current_time(const ASN1_TIME *ctm)
-{
-    return X509_cmp_time(ctm, NULL);
-}
-
-int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
-{
-    static const size_t utctime_length = sizeof("YYMMDDHHMMSSZ") - 1;
-    static const size_t generalizedtime_length = sizeof("YYYYMMDDHHMMSSZ") - 1;
-    ASN1_TIME *asn1_cmp_time = NULL;
-    int i, day, sec, ret = 0;
-
-    /*
-     * Note that ASN.1 allows much more slack in the time format than RFC 5280.
-     * In RFC 5280, the representation is fixed:
-     * UTCTime: YYMMDDHHMMSSZ
-     * GeneralizedTime: YYYYMMDDHHMMSSZ
-     *
-     * We do NOT currently enforce the following RFC 5280 requirement:
-     * "CAs conforming to this profile MUST always encode certificate
-     *  validity dates through the year 2049 as UTCTime; certificate validity
-     *  dates in 2050 or later MUST be encoded as GeneralizedTime."
-     */
-    switch (ctm->type) {
-    case V_ASN1_UTCTIME:
-        if (ctm->length != (int)(utctime_length))
-            return 0;
-        break;
-    case V_ASN1_GENERALIZEDTIME:
-        if (ctm->length != (int)(generalizedtime_length))
-            return 0;
-        break;
-    default:
-        return 0;
-    }
-
-    /**
-     * Verify the format: the ASN.1 functions we use below allow a more
-     * flexible format than what's mandated by RFC 5280.
-     * Digit and date ranges will be verified in the conversion methods.
-     */
-    for (i = 0; i < ctm->length - 1; i++) {
-        if (!isdigit(ctm->data[i]))
-            return 0;
-    }
-    if (ctm->data[ctm->length - 1] != 'Z')
-        return 0;
-
-    /*
-     * There is ASN1_UTCTIME_cmp_time_t but no
-     * ASN1_GENERALIZEDTIME_cmp_time_t or ASN1_TIME_cmp_time_t,
-     * so we go through ASN.1
-     */
-    asn1_cmp_time = X509_time_adj(NULL, 0, cmp_time);
-    if (asn1_cmp_time == NULL)
+  // Else find CRL issuer: if not last certificate then issuer is next
+  // certificate in chain.
+  else if (cnum < chnum) {
+    issuer = sk_X509_value(ctx->chain, cnum + 1);
+  } else {
+    issuer = sk_X509_value(ctx->chain, chnum);
+    // If not self signed, can't check signature
+    if (!ctx->check_issued(ctx, issuer, issuer)) {
+      ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
         goto err;
-    if (!ASN1_TIME_diff(&day, &sec, ctm, asn1_cmp_time))
+      }
+    }
+  }
+
+  if (issuer) {
+    // Skip most tests for deltas because they have already been done
+    if (!crl->base_crl_number) {
+      // Check for cRLSign bit if keyUsage present
+      if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
+          !(issuer->ex_kusage & KU_CRL_SIGN)) {
+        ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto err;
+        }
+      }
+
+      if (!(ctx->current_crl_score & CRL_SCORE_SCOPE)) {
+        ctx->error = X509_V_ERR_DIFFERENT_CRL_SCOPE;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto err;
+        }
+      }
+
+      if (!(ctx->current_crl_score & CRL_SCORE_SAME_PATH)) {
+        if (check_crl_path(ctx, ctx->current_issuer) <= 0) {
+          ctx->error = X509_V_ERR_CRL_PATH_VALIDATION_ERROR;
+          ok = ctx->verify_cb(0, ctx);
+          if (!ok) {
+            goto err;
+          }
+        }
+      }
+
+      if (crl->idp_flags & IDP_INVALID) {
+        ctx->error = X509_V_ERR_INVALID_EXTENSION;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto err;
+        }
+      }
+    }
+
+    if (!(ctx->current_crl_score & CRL_SCORE_TIME)) {
+      ok = check_crl_time(ctx, crl, 1);
+      if (!ok) {
         goto err;
+      }
+    }
 
-    /*
-     * X509_cmp_time comparison is <=.
-     * The return value 0 is reserved for errors.
-     */
-    ret = (day >= 0 && sec >= 0) ? -1 : 1;
+    // Attempt to get issuer certificate public key
+    ikey = X509_get_pubkey(issuer);
 
- err:
-    ASN1_TIME_free(asn1_cmp_time);
-    return ret;
-}
-
-ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec)
-{
-    return X509_time_adj(s, offset_sec, NULL);
-}
-
-ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, time_t *in_tm)
-{
-    return X509_time_adj_ex(s, 0, offset_sec, in_tm);
-}
-
-ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s,
-                            int offset_day, long offset_sec, time_t *in_tm)
-{
-    time_t t = 0;
-
-    if (in_tm) {
-        t = *in_tm;
+    if (!ikey) {
+      ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
+      ok = ctx->verify_cb(0, ctx);
+      if (!ok) {
+        goto err;
+      }
     } else {
-        time(&t);
+      // Verify CRL signature
+      if (X509_CRL_verify(crl, ikey) <= 0) {
+        ctx->error = X509_V_ERR_CRL_SIGNATURE_FAILURE;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto err;
+        }
+      }
     }
+  }
 
-    return ASN1_TIME_adj(s, t, offset_day, offset_sec);
+  ok = 1;
+
+err:
+  EVP_PKEY_free(ikey);
+  return ok;
 }
 
-/* Make a delta CRL as the diff between two full CRLs */
-
-X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer,
-                        EVP_PKEY *skey, const EVP_MD *md, unsigned int flags)
-{
-    X509_CRL *crl = NULL;
-    int i;
-    size_t j;
-    STACK_OF(X509_REVOKED) *revs = NULL;
-    /* CRLs can't be delta already */
-    if (base->base_crl_number || newer->base_crl_number) {
-        OPENSSL_PUT_ERROR(X509, X509_R_CRL_ALREADY_DELTA);
-        return NULL;
+// Check certificate against CRL
+static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) {
+  int ok;
+  X509_REVOKED *rev;
+  // The rules changed for this... previously if a CRL contained unhandled
+  // critical extensions it could still be used to indicate a certificate
+  // was revoked. This has since been changed since critical extension can
+  // change the meaning of CRL entries.
+  if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) &&
+      (crl->flags & EXFLAG_CRITICAL)) {
+    ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
+    ok = ctx->verify_cb(0, ctx);
+    if (!ok) {
+      return 0;
     }
-    /* Base and new CRL must have a CRL number */
-    if (!base->crl_number || !newer->crl_number) {
-        OPENSSL_PUT_ERROR(X509, X509_R_NO_CRL_NUMBER);
-        return NULL;
+  }
+  // Look for serial number of certificate in CRL If found make sure reason
+  // is not removeFromCRL.
+  if (X509_CRL_get0_by_cert(crl, &rev, x)) {
+    if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) {
+      return 2;
     }
-    /* Issuer names must match */
-    if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(newer))) {
-        OPENSSL_PUT_ERROR(X509, X509_R_ISSUER_MISMATCH);
-        return NULL;
+    ctx->error = X509_V_ERR_CERT_REVOKED;
+    ok = ctx->verify_cb(0, ctx);
+    if (!ok) {
+      return 0;
     }
-    /* AKID and IDP must match */
-    if (!crl_extension_match(base, newer, NID_authority_key_identifier)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_AKID_MISMATCH);
-        return NULL;
-    }
-    if (!crl_extension_match(base, newer, NID_issuing_distribution_point)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_IDP_MISMATCH);
-        return NULL;
-    }
-    /* Newer CRL number must exceed full CRL number */
-    if (ASN1_INTEGER_cmp(newer->crl_number, base->crl_number) <= 0) {
-        OPENSSL_PUT_ERROR(X509, X509_R_NEWER_CRL_NOT_NEWER);
-        return NULL;
-    }
-    /* CRLs must verify */
-    if (skey && (X509_CRL_verify(base, skey) <= 0 ||
-                 X509_CRL_verify(newer, skey) <= 0)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_CRL_VERIFY_FAILURE);
-        return NULL;
-    }
-    /* Create new CRL */
-    crl = X509_CRL_new();
-    if (!crl || !X509_CRL_set_version(crl, X509_CRL_VERSION_2))
-        goto memerr;
-    /* Set issuer name */
-    if (!X509_CRL_set_issuer_name(crl, X509_CRL_get_issuer(newer)))
-        goto memerr;
+  }
 
-    if (!X509_CRL_set1_lastUpdate(crl, X509_CRL_get0_lastUpdate(newer)))
-        goto memerr;
-    if (!X509_CRL_set1_nextUpdate(crl, X509_CRL_get0_nextUpdate(newer)))
-        goto memerr;
+  return 1;
+}
 
-    /* Set base CRL number: must be critical */
-
-    if (!X509_CRL_add1_ext_i2d(crl, NID_delta_crl, base->crl_number, 1, 0))
-        goto memerr;
-
-    /*
-     * Copy extensions across from newest CRL to delta: this will set CRL
-     * number to correct value too.
-     */
-
-    for (i = 0; i < X509_CRL_get_ext_count(newer); i++) {
-        X509_EXTENSION *ext;
-        ext = X509_CRL_get_ext(newer, i);
-        if (!X509_CRL_add_ext(crl, ext, -1))
-            goto memerr;
-    }
-
-    /* Go through revoked entries, copying as needed */
-
-    revs = X509_CRL_get_REVOKED(newer);
-
-    for (j = 0; j < sk_X509_REVOKED_num(revs); j++) {
-        X509_REVOKED *rvn, *rvtmp;
-        rvn = sk_X509_REVOKED_value(revs, j);
-        /*
-         * Add only if not also in base. TODO: need something cleverer here
-         * for some more complex CRLs covering multiple CAs.
-         */
-        if (!X509_CRL_get0_by_serial(base, &rvtmp, rvn->serialNumber)) {
-            rvtmp = X509_REVOKED_dup(rvn);
-            if (!rvtmp)
-                goto memerr;
-            if (!X509_CRL_add0_revoked(crl, rvtmp)) {
-                X509_REVOKED_free(rvtmp);
-                goto memerr;
-            }
-        }
-    }
-    /* TODO: optionally prune deleted entries */
-
-    if (skey && md && !X509_CRL_sign(crl, skey, md))
-        goto memerr;
-
-    return crl;
-
- memerr:
+static int check_policy(X509_STORE_CTX *ctx) {
+  int ret;
+  if (ctx->parent) {
+    return 1;
+  }
+  // TODO(davidben): Historically, outputs of the |X509_policy_check| were saved
+  // on |ctx| and accessible via the public API. This has since been removed, so
+  // remove the fields from |X509_STORE_CTX|.
+  ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
+                          ctx->param->policies, ctx->param->flags);
+  if (ret == 0) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    if (crl)
-        X509_CRL_free(crl);
+    ctx->error = X509_V_ERR_OUT_OF_MEM;
+    return 0;
+  }
+  // Invalid or inconsistent extensions
+  if (ret == -1) {
+    // Locate certificates with bad extensions and notify callback.
+    X509 *x;
+    size_t i;
+    for (i = 1; i < sk_X509_num(ctx->chain); i++) {
+      x = sk_X509_value(ctx->chain, i);
+      if (!(x->ex_flags & EXFLAG_INVALID_POLICY)) {
+        continue;
+      }
+      ctx->current_cert = x;
+      ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
+      if (!ctx->verify_cb(0, ctx)) {
+        return 0;
+      }
+    }
+    return 1;
+  }
+  if (ret == -2) {
+    ctx->current_cert = NULL;
+    ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
+    return ctx->verify_cb(0, ctx);
+  }
+
+  if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY) {
+    ctx->current_cert = NULL;
+    // Verification errors need to be "sticky", a callback may have allowed
+    // an SSL handshake to continue despite an error, and we must then
+    // remain in an error state.  Therefore, we MUST NOT clear earlier
+    // verification errors by setting the error to X509_V_OK.
+    if (!ctx->verify_cb(2, ctx)) {
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) {
+  if (ctx->param->flags & X509_V_FLAG_NO_CHECK_TIME) {
+    return 1;
+  }
+
+  time_t *ptime;
+  if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) {
+    ptime = &ctx->param->check_time;
+  } else {
+    ptime = NULL;
+  }
+
+  int i = X509_cmp_time(X509_get_notBefore(x), ptime);
+  if (i == 0) {
+    ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
+    ctx->current_cert = x;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  if (i > 0) {
+    ctx->error = X509_V_ERR_CERT_NOT_YET_VALID;
+    ctx->current_cert = x;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  i = X509_cmp_time(X509_get_notAfter(x), ptime);
+  if (i == 0) {
+    ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
+    ctx->current_cert = x;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  if (i < 0) {
+    ctx->error = X509_V_ERR_CERT_HAS_EXPIRED;
+    ctx->current_cert = x;
+    if (!ctx->verify_cb(0, ctx)) {
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static int internal_verify(X509_STORE_CTX *ctx) {
+  int ok = 0, n;
+  X509 *xs, *xi;
+  EVP_PKEY *pkey = NULL;
+
+  n = sk_X509_num(ctx->chain);
+  ctx->error_depth = n - 1;
+  n--;
+  xi = sk_X509_value(ctx->chain, n);
+
+  if (ctx->check_issued(ctx, xi, xi)) {
+    xs = xi;
+  } else {
+    if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
+      xs = xi;
+      goto check_cert;
+    }
+    if (n <= 0) {
+      ctx->error = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
+      ctx->current_cert = xi;
+      ok = ctx->verify_cb(0, ctx);
+      goto end;
+    } else {
+      n--;
+      ctx->error_depth = n;
+      xs = sk_X509_value(ctx->chain, n);
+    }
+  }
+
+  //      ctx->error=0;  not needed
+  while (n >= 0) {
+    ctx->error_depth = n;
+
+    // Skip signature check for self signed certificates unless
+    // explicitly asked for. It doesn't add any security and just wastes
+    // time.
+    if (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)) {
+      if ((pkey = X509_get_pubkey(xi)) == NULL) {
+        ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
+        ctx->current_cert = xi;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          goto end;
+        }
+      } else if (X509_verify(xs, pkey) <= 0) {
+        ctx->error = X509_V_ERR_CERT_SIGNATURE_FAILURE;
+        ctx->current_cert = xs;
+        ok = ctx->verify_cb(0, ctx);
+        if (!ok) {
+          EVP_PKEY_free(pkey);
+          goto end;
+        }
+      }
+      EVP_PKEY_free(pkey);
+      pkey = NULL;
+    }
+
+  check_cert:
+    ok = check_cert_time(ctx, xs);
+    if (!ok) {
+      goto end;
+    }
+
+    // The last error (if any) is still in the error value
+    ctx->current_issuer = xi;
+    ctx->current_cert = xs;
+    ok = ctx->verify_cb(1, ctx);
+    if (!ok) {
+      goto end;
+    }
+
+    n--;
+    if (n >= 0) {
+      xi = xs;
+      xs = sk_X509_value(ctx->chain, n);
+    }
+  }
+  ok = 1;
+end:
+  return ok;
+}
+
+int X509_cmp_current_time(const ASN1_TIME *ctm) {
+  return X509_cmp_time(ctm, NULL);
+}
+
+int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time) {
+  int64_t ctm_time;
+  if (!ASN1_TIME_to_posix(ctm, &ctm_time)) {
+    return 0;
+  }
+  int64_t compare_time = (cmp_time == NULL) ? time(NULL) : *cmp_time;
+  // The return value 0 is reserved for errors.
+  return (ctm_time - compare_time <= 0) ? -1 : 1;
+}
+
+ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec) {
+  return X509_time_adj(s, offset_sec, NULL);
+}
+
+ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, time_t *in_tm) {
+  return X509_time_adj_ex(s, 0, offset_sec, in_tm);
+}
+
+ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, long offset_sec,
+                            time_t *in_tm) {
+  time_t t = 0;
+
+  if (in_tm) {
+    t = *in_tm;
+  } else {
+    time(&t);
+  }
+
+  return ASN1_TIME_adj(s, t, offset_day, offset_sec);
+}
+
+// Make a delta CRL as the diff between two full CRLs
+
+X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, EVP_PKEY *skey,
+                        const EVP_MD *md, unsigned int flags) {
+  X509_CRL *crl = NULL;
+  int i;
+  size_t j;
+  STACK_OF(X509_REVOKED) *revs = NULL;
+  // CRLs can't be delta already
+  if (base->base_crl_number || newer->base_crl_number) {
+    OPENSSL_PUT_ERROR(X509, X509_R_CRL_ALREADY_DELTA);
     return NULL;
+  }
+  // Base and new CRL must have a CRL number
+  if (!base->crl_number || !newer->crl_number) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NO_CRL_NUMBER);
+    return NULL;
+  }
+  // Issuer names must match
+  if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(newer))) {
+    OPENSSL_PUT_ERROR(X509, X509_R_ISSUER_MISMATCH);
+    return NULL;
+  }
+  // AKID and IDP must match
+  if (!crl_extension_match(base, newer, NID_authority_key_identifier)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_AKID_MISMATCH);
+    return NULL;
+  }
+  if (!crl_extension_match(base, newer, NID_issuing_distribution_point)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_IDP_MISMATCH);
+    return NULL;
+  }
+  // Newer CRL number must exceed full CRL number
+  if (ASN1_INTEGER_cmp(newer->crl_number, base->crl_number) <= 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_NEWER_CRL_NOT_NEWER);
+    return NULL;
+  }
+  // CRLs must verify
+  if (skey &&
+      (X509_CRL_verify(base, skey) <= 0 || X509_CRL_verify(newer, skey) <= 0)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_CRL_VERIFY_FAILURE);
+    return NULL;
+  }
+  // Create new CRL
+  crl = X509_CRL_new();
+  if (!crl || !X509_CRL_set_version(crl, X509_CRL_VERSION_2)) {
+    goto memerr;
+  }
+  // Set issuer name
+  if (!X509_CRL_set_issuer_name(crl, X509_CRL_get_issuer(newer))) {
+    goto memerr;
+  }
+
+  if (!X509_CRL_set1_lastUpdate(crl, X509_CRL_get0_lastUpdate(newer))) {
+    goto memerr;
+  }
+  if (!X509_CRL_set1_nextUpdate(crl, X509_CRL_get0_nextUpdate(newer))) {
+    goto memerr;
+  }
+
+  // Set base CRL number: must be critical
+
+  if (!X509_CRL_add1_ext_i2d(crl, NID_delta_crl, base->crl_number, 1, 0)) {
+    goto memerr;
+  }
+
+  // Copy extensions across from newest CRL to delta: this will set CRL
+  // number to correct value too.
+
+  for (i = 0; i < X509_CRL_get_ext_count(newer); i++) {
+    const X509_EXTENSION *ext = X509_CRL_get_ext(newer, i);
+    if (!X509_CRL_add_ext(crl, ext, -1)) {
+      goto memerr;
+    }
+  }
+
+  // Go through revoked entries, copying as needed
+
+  revs = X509_CRL_get_REVOKED(newer);
+
+  for (j = 0; j < sk_X509_REVOKED_num(revs); j++) {
+    X509_REVOKED *rvn, *rvtmp;
+    rvn = sk_X509_REVOKED_value(revs, j);
+    // Add only if not also in base. TODO: need something cleverer here
+    // for some more complex CRLs covering multiple CAs.
+    if (!X509_CRL_get0_by_serial(base, &rvtmp, rvn->serialNumber)) {
+      rvtmp = X509_REVOKED_dup(rvn);
+      if (!rvtmp) {
+        goto memerr;
+      }
+      if (!X509_CRL_add0_revoked(crl, rvtmp)) {
+        X509_REVOKED_free(rvtmp);
+        goto memerr;
+      }
+    }
+  }
+  // TODO: optionally prune deleted entries
+
+  if (skey && md && !X509_CRL_sign(crl, skey, md)) {
+    goto memerr;
+  }
+
+  return crl;
+
+memerr:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+  if (crl) {
+    X509_CRL_free(crl);
+  }
+  return NULL;
 }
 
 int X509_STORE_CTX_get_ex_new_index(long argl, void *argp,
-                                    CRYPTO_EX_unused * unused,
+                                    CRYPTO_EX_unused *unused,
                                     CRYPTO_EX_dup *dup_unused,
-                                    CRYPTO_EX_free *free_func)
-{
-    /*
-     * This function is (usually) called only once, by
-     * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c).
-     */
-    int index;
-    if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
-                                 free_func)) {
-        return -1;
-    }
-    return index;
+                                    CRYPTO_EX_free *free_func) {
+  // This function is (usually) called only once, by
+  // SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c).
+  int index;
+  if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
+                               free_func)) {
+    return -1;
+  }
+  return index;
 }
 
-int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data)
-{
-    return CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
+int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data) {
+  return CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
 }
 
-void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx)
-{
-    return CRYPTO_get_ex_data(&ctx->ex_data, idx);
+void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx) {
+  return CRYPTO_get_ex_data(&ctx->ex_data, idx);
 }
 
-int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx)
-{
-    return ctx->error;
+int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx) { return ctx->error; }
+
+void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err) {
+  ctx->error = err;
 }
 
-void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err)
-{
-    ctx->error = err;
+int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx) {
+  return ctx->error_depth;
 }
 
-int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx)
-{
-    return ctx->error_depth;
+X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx) {
+  return ctx->current_cert;
 }
 
-X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx)
-{
-    return ctx->current_cert;
+STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx) {
+  return ctx->chain;
 }
 
-STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx)
-{
-    return ctx->chain;
+STACK_OF(X509) *X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx) {
+  return ctx->chain;
 }
 
-STACK_OF(X509) *X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx)
-{
-    return ctx->chain;
+STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx) {
+  if (!ctx->chain) {
+    return NULL;
+  }
+  return X509_chain_up_ref(ctx->chain);
 }
 
-STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx)
-{
-    if (!ctx->chain)
-        return NULL;
-    return X509_chain_up_ref(ctx->chain);
+X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx) {
+  return ctx->current_issuer;
 }
 
-X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx)
-{
-    return ctx->current_issuer;
+X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx) {
+  return ctx->current_crl;
 }
 
-X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx)
-{
-    return ctx->current_crl;
+X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx) {
+  return ctx->parent;
 }
 
-X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx)
-{
-    return ctx->parent;
+void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x) { ctx->cert = x; }
+
+void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) {
+  ctx->untrusted = sk;
 }
 
-void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x)
-{
-    ctx->cert = x;
+STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx) {
+  return ctx->untrusted;
 }
 
-void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
-{
-    ctx->untrusted = sk;
+void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk) {
+  ctx->crls = sk;
 }
 
-STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx)
-{
-    return ctx->untrusted;
+int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose) {
+  return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
 }
 
-void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk)
-{
-    ctx->crls = sk;
+int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust) {
+  return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
 }
 
-int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose)
-{
-    return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
-}
-
-int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust)
-{
-    return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
-}
-
-/*
- * This function is used to set the X509_STORE_CTX purpose and trust values.
- * This is intended to be used when another structure has its own trust and
- * purpose values which (if set) will be inherited by the ctx. If they aren't
- * set then we will usually have a default purpose in mind which should then
- * be used to set the trust value. An example of this is SSL use: an SSL
- * structure will have its own purpose and trust settings which the
- * application can set: if they aren't set then we use the default of SSL
- * client/server.
- */
+// This function is used to set the X509_STORE_CTX purpose and trust values.
+// This is intended to be used when another structure has its own trust and
+// purpose values which (if set) will be inherited by the ctx. If they aren't
+// set then we will usually have a default purpose in mind which should then
+// be used to set the trust value. An example of this is SSL use: an SSL
+// structure will have its own purpose and trust settings which the
+// application can set: if they aren't set then we use the default of SSL
+// client/server.
 
 int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
-                                   int purpose, int trust)
-{
-    int idx;
-    /* If purpose not set use default */
-    if (!purpose)
-        purpose = def_purpose;
-    /* If we have a purpose then check it is valid */
-    if (purpose) {
-        X509_PURPOSE *ptmp;
-        idx = X509_PURPOSE_get_by_id(purpose);
-        if (idx == -1) {
-            OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_PURPOSE_ID);
-            return 0;
-        }
-        ptmp = X509_PURPOSE_get0(idx);
-        if (ptmp->trust == X509_TRUST_DEFAULT) {
-            idx = X509_PURPOSE_get_by_id(def_purpose);
-            if (idx == -1) {
-                OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_PURPOSE_ID);
-                return 0;
-            }
-            ptmp = X509_PURPOSE_get0(idx);
-        }
-        /* If trust not set then get from purpose default */
-        if (!trust)
-            trust = ptmp->trust;
+                                   int purpose, int trust) {
+  int idx;
+  // If purpose not set use default
+  if (!purpose) {
+    purpose = def_purpose;
+  }
+  // If we have a purpose then check it is valid
+  if (purpose) {
+    X509_PURPOSE *ptmp;
+    idx = X509_PURPOSE_get_by_id(purpose);
+    if (idx == -1) {
+      OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_PURPOSE_ID);
+      return 0;
     }
-    if (trust) {
-        idx = X509_TRUST_get_by_id(trust);
-        if (idx == -1) {
-            OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_TRUST_ID);
-            return 0;
-        }
+    ptmp = X509_PURPOSE_get0(idx);
+    if (ptmp->trust == X509_TRUST_DEFAULT) {
+      idx = X509_PURPOSE_get_by_id(def_purpose);
+      if (idx == -1) {
+        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_PURPOSE_ID);
+        return 0;
+      }
+      ptmp = X509_PURPOSE_get0(idx);
     }
+    // If trust not set then get from purpose default
+    if (!trust) {
+      trust = ptmp->trust;
+    }
+  }
+  if (trust) {
+    idx = X509_TRUST_get_by_id(trust);
+    if (idx == -1) {
+      OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_TRUST_ID);
+      return 0;
+    }
+  }
 
-    if (purpose && !ctx->param->purpose)
-        ctx->param->purpose = purpose;
-    if (trust && !ctx->param->trust)
-        ctx->param->trust = trust;
-    return 1;
+  if (purpose && !ctx->param->purpose) {
+    ctx->param->purpose = purpose;
+  }
+  if (trust && !ctx->param->trust) {
+    ctx->param->trust = trust;
+  }
+  return 1;
 }
 
-X509_STORE_CTX *X509_STORE_CTX_new(void)
-{
-    X509_STORE_CTX *ctx;
-    ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
-    if (!ctx) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    X509_STORE_CTX_zero(ctx);
-    return ctx;
+X509_STORE_CTX *X509_STORE_CTX_new(void) {
+  X509_STORE_CTX *ctx;
+  ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
+  if (!ctx) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  X509_STORE_CTX_zero(ctx);
+  return ctx;
 }
 
-void X509_STORE_CTX_zero(X509_STORE_CTX *ctx)
-{
-    OPENSSL_memset(ctx, 0, sizeof(X509_STORE_CTX));
+void X509_STORE_CTX_zero(X509_STORE_CTX *ctx) {
+  OPENSSL_memset(ctx, 0, sizeof(X509_STORE_CTX));
 }
 
-void X509_STORE_CTX_free(X509_STORE_CTX *ctx)
-{
-    if (ctx == NULL) {
-        return;
-    }
-    X509_STORE_CTX_cleanup(ctx);
-    OPENSSL_free(ctx);
+void X509_STORE_CTX_free(X509_STORE_CTX *ctx) {
+  if (ctx == NULL) {
+    return;
+  }
+  X509_STORE_CTX_cleanup(ctx);
+  OPENSSL_free(ctx);
 }
 
 int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
-                        STACK_OF(X509) *chain)
-{
-    X509_STORE_CTX_zero(ctx);
-    ctx->ctx = store;
-    ctx->cert = x509;
-    ctx->untrusted = chain;
+                        STACK_OF(X509) *chain) {
+  X509_STORE_CTX_zero(ctx);
+  ctx->ctx = store;
+  ctx->cert = x509;
+  ctx->untrusted = chain;
 
-    CRYPTO_new_ex_data(&ctx->ex_data);
+  CRYPTO_new_ex_data(&ctx->ex_data);
 
-    if (store == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-        goto err;
-    }
+  if (store == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
+    goto err;
+  }
 
-    ctx->param = X509_VERIFY_PARAM_new();
-    if (!ctx->param)
-        goto err;
+  ctx->param = X509_VERIFY_PARAM_new();
+  if (!ctx->param) {
+    goto err;
+  }
 
-    /*
-     * Inherit callbacks and flags from X509_STORE.
-     */
+  // Inherit callbacks and flags from X509_STORE.
 
+  ctx->verify_cb = store->verify_cb;
+  ctx->cleanup = store->cleanup;
+
+  if (!X509_VERIFY_PARAM_inherit(ctx->param, store->param) ||
+      !X509_VERIFY_PARAM_inherit(ctx->param,
+                                 X509_VERIFY_PARAM_lookup("default"))) {
+    goto err;
+  }
+
+  if (store->check_issued) {
+    ctx->check_issued = store->check_issued;
+  } else {
+    ctx->check_issued = check_issued;
+  }
+
+  if (store->get_issuer) {
+    ctx->get_issuer = store->get_issuer;
+  } else {
+    ctx->get_issuer = X509_STORE_CTX_get1_issuer;
+  }
+
+  if (store->verify_cb) {
     ctx->verify_cb = store->verify_cb;
-    ctx->cleanup = store->cleanup;
+  } else {
+    ctx->verify_cb = null_callback;
+  }
 
-    if (!X509_VERIFY_PARAM_inherit(ctx->param, store->param) ||
-        !X509_VERIFY_PARAM_inherit(ctx->param,
-                                   X509_VERIFY_PARAM_lookup("default"))) {
-        goto err;
-    }
+  if (store->verify) {
+    ctx->verify = store->verify;
+  } else {
+    ctx->verify = internal_verify;
+  }
 
-    if (store->check_issued)
-        ctx->check_issued = store->check_issued;
-    else
-        ctx->check_issued = check_issued;
+  if (store->check_revocation) {
+    ctx->check_revocation = store->check_revocation;
+  } else {
+    ctx->check_revocation = check_revocation;
+  }
 
-    if (store->get_issuer)
-        ctx->get_issuer = store->get_issuer;
-    else
-        ctx->get_issuer = X509_STORE_CTX_get1_issuer;
+  if (store->get_crl) {
+    ctx->get_crl = store->get_crl;
+  } else {
+    ctx->get_crl = NULL;
+  }
 
-    if (store->verify_cb)
-        ctx->verify_cb = store->verify_cb;
-    else
-        ctx->verify_cb = null_callback;
+  if (store->check_crl) {
+    ctx->check_crl = store->check_crl;
+  } else {
+    ctx->check_crl = check_crl;
+  }
 
-    if (store->verify)
-        ctx->verify = store->verify;
-    else
-        ctx->verify = internal_verify;
+  if (store->cert_crl) {
+    ctx->cert_crl = store->cert_crl;
+  } else {
+    ctx->cert_crl = cert_crl;
+  }
 
-    if (store->check_revocation)
-        ctx->check_revocation = store->check_revocation;
-    else
-        ctx->check_revocation = check_revocation;
+  if (store->lookup_certs) {
+    ctx->lookup_certs = store->lookup_certs;
+  } else {
+    ctx->lookup_certs = X509_STORE_get1_certs;
+  }
 
-    if (store->get_crl)
-        ctx->get_crl = store->get_crl;
-    else
-        ctx->get_crl = NULL;
+  if (store->lookup_crls) {
+    ctx->lookup_crls = store->lookup_crls;
+  } else {
+    ctx->lookup_crls = X509_STORE_get1_crls;
+  }
 
-    if (store->check_crl)
-        ctx->check_crl = store->check_crl;
-    else
-        ctx->check_crl = check_crl;
+  ctx->check_policy = check_policy;
 
-    if (store->cert_crl)
-        ctx->cert_crl = store->cert_crl;
-    else
-        ctx->cert_crl = cert_crl;
+  return 1;
 
-    if (store->lookup_certs)
-        ctx->lookup_certs = store->lookup_certs;
-    else
-        ctx->lookup_certs = X509_STORE_get1_certs;
+err:
+  CRYPTO_free_ex_data(&g_ex_data_class, ctx, &ctx->ex_data);
+  if (ctx->param != NULL) {
+    X509_VERIFY_PARAM_free(ctx->param);
+  }
 
-    if (store->lookup_crls)
-        ctx->lookup_crls = store->lookup_crls;
-    else
-        ctx->lookup_crls = X509_STORE_get1_crls;
-
-    ctx->check_policy = check_policy;
-
-    return 1;
-
- err:
-    CRYPTO_free_ex_data(&g_ex_data_class, ctx, &ctx->ex_data);
-    if (ctx->param != NULL) {
-        X509_VERIFY_PARAM_free(ctx->param);
-    }
-
-    OPENSSL_memset(ctx, 0, sizeof(X509_STORE_CTX));
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    return 0;
+  OPENSSL_memset(ctx, 0, sizeof(X509_STORE_CTX));
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+  return 0;
 }
 
-/*
- * Set alternative lookup method: just a STACK of trusted certificates. This
- * avoids X509_STORE nastiness where it isn't needed.
- */
+// Set alternative lookup method: just a STACK of trusted certificates. This
+// avoids X509_STORE nastiness where it isn't needed.
 
-void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
-{
-    ctx->other_ctx = sk;
-    ctx->get_issuer = get_issuer_sk;
+void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx,
+                                       STACK_OF(X509) *sk) {
+  ctx->other_ctx = sk;
+  ctx->get_issuer = get_issuer_sk;
 }
 
-void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx)
-{
-    /* We need to be idempotent because, unfortunately, |X509_STORE_CTX_free|
-     * also calls this function. */
-    if (ctx->cleanup != NULL) {
-        ctx->cleanup(ctx);
-        ctx->cleanup = NULL;
-    }
-    if (ctx->param != NULL) {
-        if (ctx->parent == NULL)
-            X509_VERIFY_PARAM_free(ctx->param);
-        ctx->param = NULL;
-    }
-    if (ctx->tree != NULL) {
-        X509_policy_tree_free(ctx->tree);
-        ctx->tree = NULL;
-    }
-    if (ctx->chain != NULL) {
-        sk_X509_pop_free(ctx->chain, X509_free);
-        ctx->chain = NULL;
-    }
-    CRYPTO_free_ex_data(&g_ex_data_class, ctx, &(ctx->ex_data));
-    OPENSSL_memset(&ctx->ex_data, 0, sizeof(CRYPTO_EX_DATA));
+void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) {
+  X509_STORE_CTX_set0_trusted_stack(ctx, sk);
 }
 
-void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth)
-{
-    X509_VERIFY_PARAM_set_depth(ctx->param, depth);
+void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx) {
+  // We need to be idempotent because, unfortunately, |X509_STORE_CTX_free|
+  // also calls this function.
+  if (ctx->cleanup != NULL) {
+    ctx->cleanup(ctx);
+    ctx->cleanup = NULL;
+  }
+  if (ctx->param != NULL) {
+    if (ctx->parent == NULL) {
+      X509_VERIFY_PARAM_free(ctx->param);
+    }
+    ctx->param = NULL;
+  }
+  if (ctx->tree != NULL) {
+    X509_policy_tree_free(ctx->tree);
+    ctx->tree = NULL;
+  }
+  if (ctx->chain != NULL) {
+    sk_X509_pop_free(ctx->chain, X509_free);
+    ctx->chain = NULL;
+  }
+  CRYPTO_free_ex_data(&g_ex_data_class, ctx, &(ctx->ex_data));
+  OPENSSL_memset(&ctx->ex_data, 0, sizeof(CRYPTO_EX_DATA));
 }
 
-void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags)
-{
-    X509_VERIFY_PARAM_set_flags(ctx->param, flags);
+void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth) {
+  X509_VERIFY_PARAM_set_depth(ctx->param, depth);
+}
+
+void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags) {
+  X509_VERIFY_PARAM_set_flags(ctx->param, flags);
 }
 
 void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags,
-                             time_t t)
-{
-    X509_VERIFY_PARAM_set_time(ctx->param, t);
+                             time_t t) {
+  X509_VERIFY_PARAM_set_time(ctx->param, t);
 }
 
-X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx)
-{
-    return ctx->cert;
-}
+X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx) { return ctx->cert; }
 
 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
-                                  int (*verify_cb) (int, X509_STORE_CTX *))
-{
-    ctx->verify_cb = verify_cb;
+                                  int (*verify_cb)(int, X509_STORE_CTX *)) {
+  ctx->verify_cb = verify_cb;
 }
 
-X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx)
-{
-    return ctx->tree;
+int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name) {
+  const X509_VERIFY_PARAM *param;
+  param = X509_VERIFY_PARAM_lookup(name);
+  if (!param) {
+    return 0;
+  }
+  return X509_VERIFY_PARAM_inherit(ctx->param, param);
 }
 
-int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx)
-{
-    return ctx->explicit_policy;
+X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx) {
+  return ctx->param;
 }
 
-int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name)
-{
-    const X509_VERIFY_PARAM *param;
-    param = X509_VERIFY_PARAM_lookup(name);
-    if (!param)
-        return 0;
-    return X509_VERIFY_PARAM_inherit(ctx->param, param);
-}
-
-X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx)
-{
-    return ctx->param;
-}
-
-void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param)
-{
-    if (ctx->param)
-        X509_VERIFY_PARAM_free(ctx->param);
-    ctx->param = param;
+void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param) {
+  if (ctx->param) {
+    X509_VERIFY_PARAM_free(ctx->param);
+  }
+  ctx->param = param;
 }
diff --git a/src/crypto/x509/x509_vpm.c b/src/crypto/x509/x509_vpm.c
index 29d5341..e594033 100644
--- a/src/crypto/x509/x509_vpm.c
+++ b/src/crypto/x509/x509_vpm.c
@@ -62,590 +62,570 @@
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
-#include "internal.h"
 #include "../internal.h"
 #include "../x509v3/internal.h"
+#include "internal.h"
 
 
-/* X509_VERIFY_PARAM functions */
+// X509_VERIFY_PARAM functions
 
 #define SET_HOST 0
 #define ADD_HOST 1
 
-static char *str_copy(char *s)
-{
-    return OPENSSL_strdup(s);
-}
+static char *str_copy(char *s) { return OPENSSL_strdup(s); }
 
-static void str_free(char *s)
-{
-    OPENSSL_free(s);
-}
+static void str_free(char *s) { OPENSSL_free(s); }
 
 #define string_stack_free(sk) sk_OPENSSL_STRING_pop_free(sk, str_free)
 
 static int int_x509_param_set_hosts(X509_VERIFY_PARAM *param, int mode,
-                                    const char *name, size_t namelen)
-{
-    char *copy;
+                                    const char *name, size_t namelen) {
+  char *copy;
 
-    if (name == NULL || namelen == 0) {
-        // Unlike OpenSSL, we reject trying to set or add an empty name.
-        return 0;
+  if (name == NULL || namelen == 0) {
+    // Unlike OpenSSL, we reject trying to set or add an empty name.
+    return 0;
+  }
+
+  // Refuse names with embedded NUL bytes.
+  // XXX: Do we need to push an error onto the error stack?
+  if (name && OPENSSL_memchr(name, '\0', namelen)) {
+    return 0;
+  }
+
+  if (mode == SET_HOST && param->hosts) {
+    string_stack_free(param->hosts);
+    param->hosts = NULL;
+  }
+
+  copy = OPENSSL_strndup(name, namelen);
+  if (copy == NULL) {
+    return 0;
+  }
+
+  if (param->hosts == NULL &&
+      (param->hosts = sk_OPENSSL_STRING_new_null()) == NULL) {
+    OPENSSL_free(copy);
+    return 0;
+  }
+
+  if (!sk_OPENSSL_STRING_push(param->hosts, copy)) {
+    OPENSSL_free(copy);
+    if (sk_OPENSSL_STRING_num(param->hosts) == 0) {
+      sk_OPENSSL_STRING_free(param->hosts);
+      param->hosts = NULL;
     }
+    return 0;
+  }
 
-    /*
-     * Refuse names with embedded NUL bytes.
-     * XXX: Do we need to push an error onto the error stack?
-     */
-    if (name && OPENSSL_memchr(name, '\0', namelen))
-        return 0;
-
-    if (mode == SET_HOST && param->hosts) {
-        string_stack_free(param->hosts);
-        param->hosts = NULL;
-    }
-
-    copy = OPENSSL_strndup(name, namelen);
-    if (copy == NULL)
-        return 0;
-
-    if (param->hosts == NULL &&
-        (param->hosts = sk_OPENSSL_STRING_new_null()) == NULL) {
-        OPENSSL_free(copy);
-        return 0;
-    }
-
-    if (!sk_OPENSSL_STRING_push(param->hosts, copy)) {
-        OPENSSL_free(copy);
-        if (sk_OPENSSL_STRING_num(param->hosts) == 0) {
-            sk_OPENSSL_STRING_free(param->hosts);
-            param->hosts = NULL;
-        }
-        return 0;
-    }
-
-    return 1;
+  return 1;
 }
 
-static void x509_verify_param_zero(X509_VERIFY_PARAM *param)
-{
-    if (!param)
-        return;
-    param->name = NULL;
-    param->purpose = 0;
-    param->trust = 0;
-    /*
-     * param->inh_flags = X509_VP_FLAG_DEFAULT;
-     */
-    param->inh_flags = 0;
-    param->flags = 0;
-    param->depth = -1;
-    if (param->policies) {
-        sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
-        param->policies = NULL;
-    }
-    if (param->hosts) {
-        string_stack_free(param->hosts);
-        param->hosts = NULL;
-    }
-    if (param->peername) {
-        OPENSSL_free(param->peername);
-        param->peername = NULL;
-    }
-    if (param->email) {
-        OPENSSL_free(param->email);
-        param->email = NULL;
-        param->emaillen = 0;
-    }
-    if (param->ip) {
-        OPENSSL_free(param->ip);
-        param->ip = NULL;
-        param->iplen = 0;
-    }
-    param->poison = 0;
+static void x509_verify_param_zero(X509_VERIFY_PARAM *param) {
+  if (!param) {
+    return;
+  }
+  param->name = NULL;
+  param->purpose = 0;
+  param->trust = 0;
+  // param->inh_flags = X509_VP_FLAG_DEFAULT;
+  param->inh_flags = 0;
+  param->flags = 0;
+  param->depth = -1;
+  if (param->policies) {
+    sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
+    param->policies = NULL;
+  }
+  if (param->hosts) {
+    string_stack_free(param->hosts);
+    param->hosts = NULL;
+  }
+  if (param->peername) {
+    OPENSSL_free(param->peername);
+    param->peername = NULL;
+  }
+  if (param->email) {
+    OPENSSL_free(param->email);
+    param->email = NULL;
+    param->emaillen = 0;
+  }
+  if (param->ip) {
+    OPENSSL_free(param->ip);
+    param->ip = NULL;
+    param->iplen = 0;
+  }
+  param->poison = 0;
 }
 
-X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void)
-{
-    X509_VERIFY_PARAM *param;
-    param = OPENSSL_malloc(sizeof(X509_VERIFY_PARAM));
-    if (!param)
-        return NULL;
-    OPENSSL_memset(param, 0, sizeof(X509_VERIFY_PARAM));
-    x509_verify_param_zero(param);
-    return param;
+X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void) {
+  X509_VERIFY_PARAM *param;
+  param = OPENSSL_malloc(sizeof(X509_VERIFY_PARAM));
+  if (!param) {
+    return NULL;
+  }
+  OPENSSL_memset(param, 0, sizeof(X509_VERIFY_PARAM));
+  x509_verify_param_zero(param);
+  return param;
 }
 
-void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
-{
-    if (param == NULL)
-        return;
-    x509_verify_param_zero(param);
-    OPENSSL_free(param);
+void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param) {
+  if (param == NULL) {
+    return;
+  }
+  x509_verify_param_zero(param);
+  OPENSSL_free(param);
 }
 
-/*-
- * This function determines how parameters are "inherited" from one structure
- * to another. There are several different ways this can happen.
- *
- * 1. If a child structure needs to have its values initialized from a parent
- *    they are simply copied across. For example SSL_CTX copied to SSL.
- * 2. If the structure should take on values only if they are currently unset.
- *    For example the values in an SSL structure will take appropriate value
- *    for SSL servers or clients but only if the application has not set new
- *    ones.
- *
- * The "inh_flags" field determines how this function behaves.
- *
- * Normally any values which are set in the default are not copied from the
- * destination and verify flags are ORed together.
- *
- * If X509_VP_FLAG_DEFAULT is set then anything set in the source is copied
- * to the destination. Effectively the values in "to" become default values
- * which will be used only if nothing new is set in "from".
- *
- * If X509_VP_FLAG_OVERWRITE is set then all value are copied across whether
- * they are set or not. Flags is still Ored though.
- *
- * If X509_VP_FLAG_RESET_FLAGS is set then the flags value is copied instead
- * of ORed.
- *
- * If X509_VP_FLAG_LOCKED is set then no values are copied.
- *
- * If X509_VP_FLAG_ONCE is set then the current inh_flags setting is zeroed
- * after the next call.
- */
+//-
+// This function determines how parameters are "inherited" from one structure
+// to another. There are several different ways this can happen.
+//
+// 1. If a child structure needs to have its values initialized from a parent
+//    they are simply copied across. For example SSL_CTX copied to SSL.
+// 2. If the structure should take on values only if they are currently unset.
+//    For example the values in an SSL structure will take appropriate value
+//    for SSL servers or clients but only if the application has not set new
+//    ones.
+//
+// The "inh_flags" field determines how this function behaves.
+//
+// Normally any values which are set in the default are not copied from the
+// destination and verify flags are ORed together.
+//
+// If X509_VP_FLAG_DEFAULT is set then anything set in the source is copied
+// to the destination. Effectively the values in "to" become default values
+// which will be used only if nothing new is set in "from".
+//
+// If X509_VP_FLAG_OVERWRITE is set then all value are copied across whether
+// they are set or not. Flags is still Ored though.
+//
+// If X509_VP_FLAG_RESET_FLAGS is set then the flags value is copied instead
+// of ORed.
+//
+// If X509_VP_FLAG_LOCKED is set then no values are copied.
+//
+// If X509_VP_FLAG_ONCE is set then the current inh_flags setting is zeroed
+// after the next call.
 
-/* Macro to test if a field should be copied from src to dest */
+// Macro to test if a field should be copied from src to dest
 
 #define test_x509_verify_param_copy(field, def) \
   (to_overwrite ||                              \
    ((src->field != (def)) && (to_default || (dest->field == (def)))))
 
-/* Macro to test and copy a field if necessary */
+// Macro to test and copy a field if necessary
 
-#define x509_verify_param_copy(field, def) \
-        if (test_x509_verify_param_copy(field, def)) \
-                dest->field = src->field
+#define x509_verify_param_copy(field, def)     \
+  if (test_x509_verify_param_copy(field, def)) \
+  dest->field = src->field
 
 int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest,
-                              const X509_VERIFY_PARAM *src)
-{
-    unsigned long inh_flags;
-    int to_default, to_overwrite;
-    if (!src)
-        return 1;
-    inh_flags = dest->inh_flags | src->inh_flags;
-
-    if (inh_flags & X509_VP_FLAG_ONCE)
-        dest->inh_flags = 0;
-
-    if (inh_flags & X509_VP_FLAG_LOCKED)
-        return 1;
-
-    if (inh_flags & X509_VP_FLAG_DEFAULT)
-        to_default = 1;
-    else
-        to_default = 0;
-
-    if (inh_flags & X509_VP_FLAG_OVERWRITE)
-        to_overwrite = 1;
-    else
-        to_overwrite = 0;
-
-    x509_verify_param_copy(purpose, 0);
-    x509_verify_param_copy(trust, 0);
-    x509_verify_param_copy(depth, -1);
-
-    /* If overwrite or check time not set, copy across */
-
-    if (to_overwrite || !(dest->flags & X509_V_FLAG_USE_CHECK_TIME)) {
-        dest->check_time = src->check_time;
-        dest->flags &= ~X509_V_FLAG_USE_CHECK_TIME;
-        /* Don't need to copy flag: that is done below */
-    }
-
-    if (inh_flags & X509_VP_FLAG_RESET_FLAGS)
-        dest->flags = 0;
-
-    dest->flags |= src->flags;
-
-    if (test_x509_verify_param_copy(policies, NULL)) {
-        if (!X509_VERIFY_PARAM_set1_policies(dest, src->policies))
-            return 0;
-    }
-
-    /* Copy the host flags if and only if we're copying the host list */
-    if (test_x509_verify_param_copy(hosts, NULL)) {
-        if (dest->hosts) {
-            string_stack_free(dest->hosts);
-            dest->hosts = NULL;
-        }
-        if (src->hosts) {
-            dest->hosts =
-                sk_OPENSSL_STRING_deep_copy(src->hosts, str_copy, str_free);
-            if (dest->hosts == NULL)
-                return 0;
-            dest->hostflags = src->hostflags;
-        }
-    }
-
-    if (test_x509_verify_param_copy(email, NULL)) {
-        if (!X509_VERIFY_PARAM_set1_email(dest, src->email, src->emaillen))
-            return 0;
-    }
-
-    if (test_x509_verify_param_copy(ip, NULL)) {
-        if (!X509_VERIFY_PARAM_set1_ip(dest, src->ip, src->iplen))
-            return 0;
-    }
-
-    dest->poison = src->poison;
-
+                              const X509_VERIFY_PARAM *src) {
+  unsigned long inh_flags;
+  int to_default, to_overwrite;
+  if (!src) {
     return 1;
+  }
+  inh_flags = dest->inh_flags | src->inh_flags;
+
+  if (inh_flags & X509_VP_FLAG_ONCE) {
+    dest->inh_flags = 0;
+  }
+
+  if (inh_flags & X509_VP_FLAG_LOCKED) {
+    return 1;
+  }
+
+  if (inh_flags & X509_VP_FLAG_DEFAULT) {
+    to_default = 1;
+  } else {
+    to_default = 0;
+  }
+
+  if (inh_flags & X509_VP_FLAG_OVERWRITE) {
+    to_overwrite = 1;
+  } else {
+    to_overwrite = 0;
+  }
+
+  x509_verify_param_copy(purpose, 0);
+  x509_verify_param_copy(trust, 0);
+  x509_verify_param_copy(depth, -1);
+
+  // If overwrite or check time not set, copy across
+
+  if (to_overwrite || !(dest->flags & X509_V_FLAG_USE_CHECK_TIME)) {
+    dest->check_time = src->check_time;
+    dest->flags &= ~X509_V_FLAG_USE_CHECK_TIME;
+    // Don't need to copy flag: that is done below
+  }
+
+  if (inh_flags & X509_VP_FLAG_RESET_FLAGS) {
+    dest->flags = 0;
+  }
+
+  dest->flags |= src->flags;
+
+  if (test_x509_verify_param_copy(policies, NULL)) {
+    if (!X509_VERIFY_PARAM_set1_policies(dest, src->policies)) {
+      return 0;
+    }
+  }
+
+  // Copy the host flags if and only if we're copying the host list
+  if (test_x509_verify_param_copy(hosts, NULL)) {
+    if (dest->hosts) {
+      string_stack_free(dest->hosts);
+      dest->hosts = NULL;
+    }
+    if (src->hosts) {
+      dest->hosts = sk_OPENSSL_STRING_deep_copy(src->hosts, str_copy, str_free);
+      if (dest->hosts == NULL) {
+        return 0;
+      }
+      dest->hostflags = src->hostflags;
+    }
+  }
+
+  if (test_x509_verify_param_copy(email, NULL)) {
+    if (!X509_VERIFY_PARAM_set1_email(dest, src->email, src->emaillen)) {
+      return 0;
+    }
+  }
+
+  if (test_x509_verify_param_copy(ip, NULL)) {
+    if (!X509_VERIFY_PARAM_set1_ip(dest, src->ip, src->iplen)) {
+      return 0;
+    }
+  }
+
+  dest->poison = src->poison;
+
+  return 1;
 }
 
 int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to,
-                           const X509_VERIFY_PARAM *from)
-{
-    unsigned long save_flags = to->inh_flags;
-    int ret;
-    to->inh_flags |= X509_VP_FLAG_DEFAULT;
-    ret = X509_VERIFY_PARAM_inherit(to, from);
-    to->inh_flags = save_flags;
-    return ret;
+                           const X509_VERIFY_PARAM *from) {
+  unsigned long save_flags = to->inh_flags;
+  int ret;
+  to->inh_flags |= X509_VP_FLAG_DEFAULT;
+  ret = X509_VERIFY_PARAM_inherit(to, from);
+  to->inh_flags = save_flags;
+  return ret;
 }
 
-static int int_x509_param_set1(char **pdest, size_t *pdestlen,
-                               const char *src, size_t srclen)
-{
-    void *tmp;
-    if (src == NULL || srclen == 0) {
-        // Unlike OpenSSL, we do not allow an empty string to disable previously
-        // configured checks.
-        return 0;
-    }
-
-    tmp = OPENSSL_memdup(src, srclen);
-    if (!tmp) {
-        return 0;
-    }
-
-    if (*pdest)
-        OPENSSL_free(*pdest);
-    *pdest = tmp;
-    if (pdestlen)
-        *pdestlen = srclen;
-    return 1;
-}
-
-int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name)
-{
-    if (param->name)
-        OPENSSL_free(param->name);
-    param->name = OPENSSL_strdup(name);
-    if (param->name)
-        return 1;
+static int int_x509_param_set1(char **pdest, size_t *pdestlen, const char *src,
+                               size_t srclen) {
+  void *tmp;
+  if (src == NULL || srclen == 0) {
+    // Unlike OpenSSL, we do not allow an empty string to disable previously
+    // configured checks.
     return 0;
+  }
+
+  tmp = OPENSSL_memdup(src, srclen);
+  if (!tmp) {
+    return 0;
+  }
+
+  if (*pdest) {
+    OPENSSL_free(*pdest);
+  }
+  *pdest = tmp;
+  if (pdestlen) {
+    *pdestlen = srclen;
+  }
+  return 1;
 }
 
-int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags)
-{
-    param->flags |= flags;
-    if (flags & X509_V_FLAG_POLICY_MASK)
-        param->flags |= X509_V_FLAG_POLICY_CHECK;
+int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name) {
+  if (param->name) {
+    OPENSSL_free(param->name);
+  }
+  param->name = OPENSSL_strdup(name);
+  if (param->name) {
     return 1;
+  }
+  return 0;
+}
+
+int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags) {
+  param->flags |= flags;
+  if (flags & X509_V_FLAG_POLICY_MASK) {
+    param->flags |= X509_V_FLAG_POLICY_CHECK;
+  }
+  return 1;
 }
 
 int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param,
-                                  unsigned long flags)
-{
-    param->flags &= ~flags;
-    return 1;
+                                  unsigned long flags) {
+  param->flags &= ~flags;
+  return 1;
 }
 
-unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param)
-{
-    return param->flags;
+unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param) {
+  return param->flags;
 }
 
-int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose)
-{
-    return X509_PURPOSE_set(&param->purpose, purpose);
+int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose) {
+  return X509_PURPOSE_set(&param->purpose, purpose);
 }
 
-int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust)
-{
-    return X509_TRUST_set(&param->trust, trust);
+int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust) {
+  return X509_TRUST_set(&param->trust, trust);
 }
 
-void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth)
-{
-    param->depth = depth;
+void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth) {
+  param->depth = depth;
 }
 
-void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t)
-{
-    param->check_time = t;
-    param->flags |= X509_V_FLAG_USE_CHECK_TIME;
+void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t) {
+  param->check_time = t;
+  param->flags |= X509_V_FLAG_USE_CHECK_TIME;
 }
 
 int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param,
-                                  ASN1_OBJECT *policy)
-{
+                                  ASN1_OBJECT *policy) {
+  if (!param->policies) {
+    param->policies = sk_ASN1_OBJECT_new_null();
     if (!param->policies) {
-        param->policies = sk_ASN1_OBJECT_new_null();
-        if (!param->policies)
-            return 0;
+      return 0;
     }
-    if (!sk_ASN1_OBJECT_push(param->policies, policy))
-        return 0;
-    return 1;
+  }
+  if (!sk_ASN1_OBJECT_push(param->policies, policy)) {
+    return 0;
+  }
+  return 1;
 }
 
 int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
-                                    STACK_OF(ASN1_OBJECT) *policies)
-{
-    size_t i;
-    ASN1_OBJECT *oid, *doid;
-    if (!param)
-        return 0;
-    if (param->policies)
-        sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
+                                    STACK_OF(ASN1_OBJECT) *policies) {
+  size_t i;
+  ASN1_OBJECT *oid, *doid;
+  if (!param) {
+    return 0;
+  }
+  if (param->policies) {
+    sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
+  }
 
-    if (!policies) {
-        param->policies = NULL;
-        return 1;
-    }
-
-    param->policies = sk_ASN1_OBJECT_new_null();
-    if (!param->policies)
-        return 0;
-
-    for (i = 0; i < sk_ASN1_OBJECT_num(policies); i++) {
-        oid = sk_ASN1_OBJECT_value(policies, i);
-        doid = OBJ_dup(oid);
-        if (!doid)
-            return 0;
-        if (!sk_ASN1_OBJECT_push(param->policies, doid)) {
-            ASN1_OBJECT_free(doid);
-            return 0;
-        }
-    }
-    param->flags |= X509_V_FLAG_POLICY_CHECK;
+  if (!policies) {
+    param->policies = NULL;
     return 1;
+  }
+
+  param->policies = sk_ASN1_OBJECT_new_null();
+  if (!param->policies) {
+    return 0;
+  }
+
+  for (i = 0; i < sk_ASN1_OBJECT_num(policies); i++) {
+    oid = sk_ASN1_OBJECT_value(policies, i);
+    doid = OBJ_dup(oid);
+    if (!doid) {
+      return 0;
+    }
+    if (!sk_ASN1_OBJECT_push(param->policies, doid)) {
+      ASN1_OBJECT_free(doid);
+      return 0;
+    }
+  }
+  param->flags |= X509_V_FLAG_POLICY_CHECK;
+  return 1;
 }
 
-int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param,
-                                const char *name, size_t namelen)
-{
-    if (!int_x509_param_set_hosts(param, SET_HOST, name, namelen)) {
-        param->poison = 1;
-        return 0;
-    }
-    return 1;
+int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, const char *name,
+                                size_t namelen) {
+  if (!int_x509_param_set_hosts(param, SET_HOST, name, namelen)) {
+    param->poison = 1;
+    return 0;
+  }
+  return 1;
 }
 
-int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param,
-                                const char *name, size_t namelen)
-{
-    if (!int_x509_param_set_hosts(param, ADD_HOST, name, namelen)) {
-        param->poison = 1;
-        return 0;
-    }
-    return 1;
+int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, const char *name,
+                                size_t namelen) {
+  if (!int_x509_param_set_hosts(param, ADD_HOST, name, namelen)) {
+    param->poison = 1;
+    return 0;
+  }
+  return 1;
 }
 
 void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param,
-                                     unsigned int flags)
-{
-    param->hostflags = flags;
+                                     unsigned int flags) {
+  param->hostflags = flags;
 }
 
-char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param)
-{
-    return param->peername;
+char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param) {
+  return param->peername;
 }
 
-int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param,
-                                 const char *email, size_t emaillen)
-{
-    if (OPENSSL_memchr(email, '\0', emaillen) != NULL ||
-        !int_x509_param_set1(&param->email, &param->emaillen,
-                               email, emaillen)) {
-        param->poison = 1;
-        return 0;
-    }
+int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email,
+                                 size_t emaillen) {
+  if (OPENSSL_memchr(email, '\0', emaillen) != NULL ||
+      !int_x509_param_set1(&param->email, &param->emaillen, email, emaillen)) {
+    param->poison = 1;
+    return 0;
+  }
 
-    return 1;
+  return 1;
 }
 
-int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param,
-                              const unsigned char *ip, size_t iplen)
-{
-    if ((iplen != 4 && iplen != 16) ||
-        !int_x509_param_set1((char **)&param->ip, &param->iplen,
-                             (char *)ip, iplen)) {
-        param->poison = 1;
-        return 0;
-    }
+int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip,
+                              size_t iplen) {
+  if ((iplen != 4 && iplen != 16) ||
+      !int_x509_param_set1((char **)&param->ip, &param->iplen, (char *)ip,
+                           iplen)) {
+    param->poison = 1;
+    return 0;
+  }
 
-    return 1;
+  return 1;
 }
 
-int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, const char *ipasc)
-{
-    unsigned char ipout[16];
-    size_t iplen;
+int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, const char *ipasc) {
+  unsigned char ipout[16];
+  size_t iplen;
 
-    iplen = (size_t)x509v3_a2i_ipadd(ipout, ipasc);
-    if (iplen == 0)
-        return 0;
-    return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen);
+  iplen = (size_t)x509v3_a2i_ipadd(ipout, ipasc);
+  if (iplen == 0) {
+    return 0;
+  }
+  return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen);
 }
 
-int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param)
-{
-    return param->depth;
+int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param) {
+  return param->depth;
 }
 
-const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param)
-{
-    return param->name;
+const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param) {
+  return param->name;
 }
 
 #define vpm_empty_id NULL, 0U, NULL, NULL, 0, NULL, 0, 0
 
-/*
- * Default verify parameters: these are used for various applications and can
- * be overridden by the user specified table. NB: the 'name' field *must* be
- * in alphabetical order because it will be searched using OBJ_search.
- */
+// Default verify parameters: these are used for various applications and can
+// be overridden by the user specified table. NB: the 'name' field *must* be
+// in alphabetical order because it will be searched using OBJ_search.
 
 static const X509_VERIFY_PARAM default_table[] = {
-    {
-     (char *)"default",         /* X509 default parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     X509_V_FLAG_TRUSTED_FIRST, /* flags */
-     0,                         /* purpose */
-     0,                         /* trust */
-     100,                       /* depth */
-     NULL,                      /* policies */
+    {(char *)"default",          // X509 default parameters
+     0,                          // Check time
+     0,                          // internal flags
+     X509_V_FLAG_TRUSTED_FIRST,  // flags
+     0,                          // purpose
+     0,                          // trust
+     100,                        // depth
+     NULL,                       // policies
      vpm_empty_id},
-    {
-     (char *)"pkcs7",           /* S/MIME sign parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     0,                         /* flags */
-     X509_PURPOSE_SMIME_SIGN,   /* purpose */
-     X509_TRUST_EMAIL,          /* trust */
-     -1,                        /* depth */
-     NULL,                      /* policies */
+    {(char *)"pkcs7",          // S/MIME sign parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SMIME_SIGN,  // purpose
+     X509_TRUST_EMAIL,         // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {
-     (char *)"smime_sign",      /* S/MIME sign parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     0,                         /* flags */
-     X509_PURPOSE_SMIME_SIGN,   /* purpose */
-     X509_TRUST_EMAIL,          /* trust */
-     -1,                        /* depth */
-     NULL,                      /* policies */
+    {(char *)"smime_sign",     // S/MIME sign parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SMIME_SIGN,  // purpose
+     X509_TRUST_EMAIL,         // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {
-     (char *)"ssl_client",      /* SSL/TLS client parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     0,                         /* flags */
-     X509_PURPOSE_SSL_CLIENT,   /* purpose */
-     X509_TRUST_SSL_CLIENT,     /* trust */
-     -1,                        /* depth */
-     NULL,                      /* policies */
+    {(char *)"ssl_client",     // SSL/TLS client parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SSL_CLIENT,  // purpose
+     X509_TRUST_SSL_CLIENT,    // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {
-     (char *)"ssl_server",      /* SSL/TLS server parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     0,                         /* flags */
-     X509_PURPOSE_SSL_SERVER,   /* purpose */
-     X509_TRUST_SSL_SERVER,     /* trust */
-     -1,                        /* depth */
-     NULL,                      /* policies */
-     vpm_empty_id}
-};
+    {(char *)"ssl_server",     // SSL/TLS server parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SSL_SERVER,  // purpose
+     X509_TRUST_SSL_SERVER,    // trust
+     -1,                       // depth
+     NULL,                     // policies
+     vpm_empty_id}};
 
 static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL;
 
-static int param_cmp(const X509_VERIFY_PARAM **a, const X509_VERIFY_PARAM **b)
-{
-    return strcmp((*a)->name, (*b)->name);
+static int param_cmp(const X509_VERIFY_PARAM **a, const X509_VERIFY_PARAM **b) {
+  return strcmp((*a)->name, (*b)->name);
 }
 
-int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
-{
-    X509_VERIFY_PARAM *ptmp;
+int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) {
+  X509_VERIFY_PARAM *ptmp;
+  if (!param_table) {
+    param_table = sk_X509_VERIFY_PARAM_new(param_cmp);
     if (!param_table) {
-        param_table = sk_X509_VERIFY_PARAM_new(param_cmp);
-        if (!param_table)
-            return 0;
-    } else {
-        size_t idx;
-
-        sk_X509_VERIFY_PARAM_sort(param_table);
-        if (sk_X509_VERIFY_PARAM_find(param_table, &idx, param)) {
-            ptmp = sk_X509_VERIFY_PARAM_value(param_table, idx);
-            X509_VERIFY_PARAM_free(ptmp);
-            (void)sk_X509_VERIFY_PARAM_delete(param_table, idx);
-        }
+      return 0;
     }
-    if (!sk_X509_VERIFY_PARAM_push(param_table, param))
-        return 0;
-    return 1;
-}
+  } else {
+    size_t idx;
 
-int X509_VERIFY_PARAM_get_count(void)
-{
-    int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
-    if (param_table)
-        num += sk_X509_VERIFY_PARAM_num(param_table);
-    return num;
-}
-
-const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id)
-{
-    int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
-    if (id < num)
-        return default_table + id;
-    return sk_X509_VERIFY_PARAM_value(param_table, id - num);
-}
-
-const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name)
-{
-    X509_VERIFY_PARAM pm;
-    unsigned i, limit;
-
-    pm.name = (char *)name;
-    if (param_table) {
-        size_t idx;
-        sk_X509_VERIFY_PARAM_sort(param_table);
-        if (sk_X509_VERIFY_PARAM_find(param_table, &idx, &pm))
-            return sk_X509_VERIFY_PARAM_value(param_table, idx);
+    sk_X509_VERIFY_PARAM_sort(param_table);
+    if (sk_X509_VERIFY_PARAM_find(param_table, &idx, param)) {
+      ptmp = sk_X509_VERIFY_PARAM_value(param_table, idx);
+      X509_VERIFY_PARAM_free(ptmp);
+      (void)sk_X509_VERIFY_PARAM_delete(param_table, idx);
     }
-
-    limit = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
-    for (i = 0; i < limit; i++) {
-        if (strcmp(default_table[i].name, name) == 0) {
-            return &default_table[i];
-        }
-    }
-    return NULL;
+  }
+  if (!sk_X509_VERIFY_PARAM_push(param_table, param)) {
+    return 0;
+  }
+  return 1;
 }
 
-void X509_VERIFY_PARAM_table_cleanup(void)
-{
-    if (param_table)
-        sk_X509_VERIFY_PARAM_pop_free(param_table, X509_VERIFY_PARAM_free);
-    param_table = NULL;
+int X509_VERIFY_PARAM_get_count(void) {
+  int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
+  if (param_table) {
+    num += sk_X509_VERIFY_PARAM_num(param_table);
+  }
+  return num;
+}
+
+const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id) {
+  int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
+  if (id < num) {
+    return default_table + id;
+  }
+  return sk_X509_VERIFY_PARAM_value(param_table, id - num);
+}
+
+const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name) {
+  X509_VERIFY_PARAM pm;
+  unsigned i, limit;
+
+  pm.name = (char *)name;
+  if (param_table) {
+    size_t idx;
+    sk_X509_VERIFY_PARAM_sort(param_table);
+    if (sk_X509_VERIFY_PARAM_find(param_table, &idx, &pm)) {
+      return sk_X509_VERIFY_PARAM_value(param_table, idx);
+    }
+  }
+
+  limit = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
+  for (i = 0; i < limit; i++) {
+    if (strcmp(default_table[i].name, name) == 0) {
+      return &default_table[i];
+    }
+  }
+  return NULL;
+}
+
+void X509_VERIFY_PARAM_table_cleanup(void) {
+  if (param_table) {
+    sk_X509_VERIFY_PARAM_pop_free(param_table, X509_VERIFY_PARAM_free);
+  }
+  param_table = NULL;
 }
diff --git a/src/crypto/x509/x509cset.c b/src/crypto/x509/x509cset.c
index 7816d73..6eba6d1 100644
--- a/src/crypto/x509/x509cset.c
+++ b/src/crypto/x509/x509cset.c
@@ -62,223 +62,215 @@
 #include "../internal.h"
 #include "internal.h"
 
-int X509_CRL_set_version(X509_CRL *x, long version)
-{
-    if (x == NULL)
-        return (0);
+int X509_CRL_set_version(X509_CRL *x, long version) {
+  if (x == NULL) {
+    return 0;
+  }
+
+  if (version < X509_CRL_VERSION_1 || version > X509_CRL_VERSION_2) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+    return 0;
+  }
+
+  // v1(0) is default and is represented by omitting the version.
+  if (version == X509_CRL_VERSION_1) {
+    ASN1_INTEGER_free(x->crl->version);
+    x->crl->version = NULL;
+    return 1;
+  }
+
+  if (x->crl->version == NULL) {
+    x->crl->version = ASN1_INTEGER_new();
     if (x->crl->version == NULL) {
-        if ((x->crl->version = ASN1_INTEGER_new()) == NULL)
-            return (0);
+      return 0;
     }
-    return (ASN1_INTEGER_set(x->crl->version, version));
+  }
+  return ASN1_INTEGER_set_int64(x->crl->version, version);
 }
 
-int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
-{
-    if ((x == NULL) || (x->crl == NULL))
-        return (0);
-    return (X509_NAME_set(&x->crl->issuer, name));
+int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) {
+  if ((x == NULL) || (x->crl == NULL)) {
+    return 0;
+  }
+  return (X509_NAME_set(&x->crl->issuer, name));
 }
 
-int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm)
-{
-    ASN1_TIME *in;
+int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) {
+  ASN1_TIME *in;
 
-    if (x == NULL)
-        return (0);
-    in = x->crl->lastUpdate;
-    if (in != tm) {
-        in = ASN1_STRING_dup(tm);
-        if (in != NULL) {
-            ASN1_TIME_free(x->crl->lastUpdate);
-            x->crl->lastUpdate = in;
-        }
+  if (x == NULL) {
+    return 0;
+  }
+  in = x->crl->lastUpdate;
+  if (in != tm) {
+    in = ASN1_STRING_dup(tm);
+    if (in != NULL) {
+      ASN1_TIME_free(x->crl->lastUpdate);
+      x->crl->lastUpdate = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm)
-{
-    ASN1_TIME *in;
+int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) {
+  ASN1_TIME *in;
 
-    if (x == NULL)
-        return (0);
-    in = x->crl->nextUpdate;
-    if (in != tm) {
-        in = ASN1_STRING_dup(tm);
-        if (in != NULL) {
-            ASN1_TIME_free(x->crl->nextUpdate);
-            x->crl->nextUpdate = in;
-        }
+  if (x == NULL) {
+    return 0;
+  }
+  in = x->crl->nextUpdate;
+  if (in != tm) {
+    in = ASN1_STRING_dup(tm);
+    if (in != NULL) {
+      ASN1_TIME_free(x->crl->nextUpdate);
+      x->crl->nextUpdate = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-int X509_CRL_sort(X509_CRL *c)
-{
-    size_t i;
-    X509_REVOKED *r;
-    /*
-     * sort the data so it will be written in serial number order
-     */
-    sk_X509_REVOKED_sort(c->crl->revoked);
-    for (i = 0; i < sk_X509_REVOKED_num(c->crl->revoked); i++) {
-        r = sk_X509_REVOKED_value(c->crl->revoked, i);
-        r->sequence = i;
-    }
-    c->crl->enc.modified = 1;
-    return 1;
+int X509_CRL_sort(X509_CRL *c) {
+  // Sort the data so it will be written in serial number order.
+  sk_X509_REVOKED_sort(c->crl->revoked);
+  c->crl->enc.modified = 1;
+  return 1;
 }
 
-int X509_CRL_up_ref(X509_CRL *crl)
-{
-    CRYPTO_refcount_inc(&crl->references);
-    return 1;
+int X509_CRL_up_ref(X509_CRL *crl) {
+  CRYPTO_refcount_inc(&crl->references);
+  return 1;
 }
 
-long X509_CRL_get_version(const X509_CRL *crl)
-{
-    return ASN1_INTEGER_get(crl->crl->version);
+long X509_CRL_get_version(const X509_CRL *crl) {
+  return ASN1_INTEGER_get(crl->crl->version);
 }
 
-const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl)
-{
-    return crl->crl->lastUpdate;
+const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl) {
+  return crl->crl->lastUpdate;
 }
 
-const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl)
-{
-    return crl->crl->nextUpdate;
+const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl) {
+  return crl->crl->nextUpdate;
 }
 
-ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl)
-{
-    return crl->crl->lastUpdate;
+ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl) {
+  return crl->crl->lastUpdate;
 }
 
-ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl)
-{
-    return crl->crl->nextUpdate;
+ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl) {
+  return crl->crl->nextUpdate;
 }
 
-X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl)
-{
-    return crl->crl->issuer;
+X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl) { return crl->crl->issuer; }
+
+STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl) {
+  return crl->crl->revoked;
 }
 
-STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl)
-{
-    return crl->crl->revoked;
-}
-
-const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl)
-{
-    return crl->crl->extensions;
+const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl) {
+  return crl->crl->extensions;
 }
 
 void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig,
-                             const X509_ALGOR **palg)
-{
-    if (psig != NULL)
-        *psig = crl->signature;
-    if (palg != NULL)
-        *palg = crl->sig_alg;
+                             const X509_ALGOR **palg) {
+  if (psig != NULL) {
+    *psig = crl->signature;
+  }
+  if (palg != NULL) {
+    *palg = crl->sig_alg;
+  }
 }
 
-int X509_CRL_get_signature_nid(const X509_CRL *crl)
-{
-    return OBJ_obj2nid(crl->sig_alg->algorithm);
+int X509_CRL_get_signature_nid(const X509_CRL *crl) {
+  return OBJ_obj2nid(crl->sig_alg->algorithm);
 }
 
-const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *revoked)
-{
-    return revoked->revocationDate;
+const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *revoked) {
+  return revoked->revocationDate;
 }
 
-int X509_REVOKED_set_revocationDate(X509_REVOKED *revoked, const ASN1_TIME *tm)
-{
-    ASN1_TIME *in;
+int X509_REVOKED_set_revocationDate(X509_REVOKED *revoked,
+                                    const ASN1_TIME *tm) {
+  ASN1_TIME *in;
 
-    if (revoked == NULL)
-        return (0);
-    in = revoked->revocationDate;
-    if (in != tm) {
-        in = ASN1_STRING_dup(tm);
-        if (in != NULL) {
-            ASN1_TIME_free(revoked->revocationDate);
-            revoked->revocationDate = in;
-        }
+  if (revoked == NULL) {
+    return 0;
+  }
+  in = revoked->revocationDate;
+  if (in != tm) {
+    in = ASN1_STRING_dup(tm);
+    if (in != NULL) {
+      ASN1_TIME_free(revoked->revocationDate);
+      revoked->revocationDate = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *revoked)
-{
-    return revoked->serialNumber;
+const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(
+    const X509_REVOKED *revoked) {
+  return revoked->serialNumber;
 }
 
 int X509_REVOKED_set_serialNumber(X509_REVOKED *revoked,
-                                  const ASN1_INTEGER *serial)
-{
-    ASN1_INTEGER *in;
+                                  const ASN1_INTEGER *serial) {
+  ASN1_INTEGER *in;
 
-    if (revoked == NULL)
-        return (0);
-    in = revoked->serialNumber;
-    if (in != serial) {
-        in = ASN1_INTEGER_dup(serial);
-        if (in != NULL) {
-            ASN1_INTEGER_free(revoked->serialNumber);
-            revoked->serialNumber = in;
-        }
+  if (serial->type != V_ASN1_INTEGER && serial->type != V_ASN1_NEG_INTEGER) {
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
+    return 0;
+  }
+
+  if (revoked == NULL) {
+    return 0;
+  }
+  in = revoked->serialNumber;
+  if (in != serial) {
+    in = ASN1_INTEGER_dup(serial);
+    if (in != NULL) {
+      ASN1_INTEGER_free(revoked->serialNumber);
+      revoked->serialNumber = in;
     }
-    return (in != NULL);
+  }
+  return in != NULL;
 }
 
-const STACK_OF(X509_EXTENSION) *
-    X509_REVOKED_get0_extensions(const X509_REVOKED *r)
-{
-    return r->extensions;
+const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(
+    const X509_REVOKED *r) {
+  return r->extensions;
 }
 
-int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp)
-{
-    crl->crl->enc.modified = 1;
-    return i2d_X509_CRL_INFO(crl->crl, outp);
+int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) {
+  crl->crl->enc.modified = 1;
+  return i2d_X509_CRL_INFO(crl->crl, outp);
 }
 
-int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp)
-{
-    return i2d_X509_CRL_INFO(crl->crl, outp);
+int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) {
+  return i2d_X509_CRL_INFO(crl->crl, outp);
 }
 
-int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo)
-{
-    /* TODO(davidben): Const-correct generated ASN.1 dup functions.
-     * Alternatively, when the types are hidden and we can embed required fields
-     * directly in structs, import |X509_ALGOR_copy| from upstream. */
-    X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
-    X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
-    if (copy1 == NULL || copy2 == NULL) {
-        X509_ALGOR_free(copy1);
-        X509_ALGOR_free(copy2);
-        return 0;
-    }
+int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo) {
+  X509_ALGOR *copy1 = X509_ALGOR_dup(algo);
+  X509_ALGOR *copy2 = X509_ALGOR_dup(algo);
+  if (copy1 == NULL || copy2 == NULL) {
+    X509_ALGOR_free(copy1);
+    X509_ALGOR_free(copy2);
+    return 0;
+  }
 
-    X509_ALGOR_free(crl->sig_alg);
-    crl->sig_alg = copy1;
-    X509_ALGOR_free(crl->crl->sig_alg);
-    crl->crl->sig_alg = copy2;
-    return 1;
+  X509_ALGOR_free(crl->sig_alg);
+  crl->sig_alg = copy1;
+  X509_ALGOR_free(crl->crl->sig_alg);
+  crl->crl->sig_alg = copy2;
+  return 1;
 }
 
 int X509_CRL_set1_signature_value(X509_CRL *crl, const uint8_t *sig,
-                                  size_t sig_len)
-{
-    if (!ASN1_STRING_set(crl->signature, sig, sig_len)) {
-      return 0;
-    }
-    crl->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
-    crl->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
-    return 1;
+                                  size_t sig_len) {
+  if (!ASN1_STRING_set(crl->signature, sig, sig_len)) {
+    return 0;
+  }
+  crl->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+  crl->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+  return 1;
 }
diff --git a/src/crypto/x509/x509name.c b/src/crypto/x509/x509name.c
index 6bc0952..fcfbc0c 100644
--- a/src/crypto/x509/x509name.c
+++ b/src/crypto/x509/x509name.c
@@ -68,321 +68,326 @@
 
 
 int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, char *buf,
-                              int len)
-{
-    const ASN1_OBJECT *obj;
+                              int len) {
+  const ASN1_OBJECT *obj;
 
-    obj = OBJ_nid2obj(nid);
-    if (obj == NULL)
-        return (-1);
-    return (X509_NAME_get_text_by_OBJ(name, obj, buf, len));
+  obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    return -1;
+  }
+  return (X509_NAME_get_text_by_OBJ(name, obj, buf, len));
 }
 
 int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
-                              char *buf, int len)
-{
-    int i;
-    ASN1_STRING *data;
-
-    i = X509_NAME_get_index_by_OBJ(name, obj, -1);
-    if (i < 0)
-        return (-1);
-    data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
-    i = (data->length > (len - 1)) ? (len - 1) : data->length;
-    if (buf == NULL)
-        return (data->length);
-    OPENSSL_memcpy(buf, data->data, i);
-    buf[i] = '\0';
-    return (i);
+                              char *buf, int len) {
+  int i = X509_NAME_get_index_by_OBJ(name, obj, -1);
+  if (i < 0) {
+    return -1;
+  }
+  const ASN1_STRING *data =
+      X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
+  i = (data->length > (len - 1)) ? (len - 1) : data->length;
+  if (buf == NULL) {
+    return data->length;
+  }
+  OPENSSL_memcpy(buf, data->data, i);
+  buf[i] = '\0';
+  return i;
 }
 
-int X509_NAME_entry_count(const X509_NAME *name)
-{
-    if (name == NULL)
-        return (0);
-    return (sk_X509_NAME_ENTRY_num(name->entries));
+int X509_NAME_entry_count(const X509_NAME *name) {
+  if (name == NULL) {
+    return 0;
+  }
+  return (sk_X509_NAME_ENTRY_num(name->entries));
 }
 
-int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos)
-{
-    const ASN1_OBJECT *obj;
+int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos) {
+  const ASN1_OBJECT *obj;
 
-    obj = OBJ_nid2obj(nid);
-    if (obj == NULL)
-        return (-2);
-    return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
+  obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    return -2;
+  }
+  return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
 }
 
-/* NOTE: you should be passsing -1, not 0 as lastpos */
+// NOTE: you should be passsing -1, not 0 as lastpos
 int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
-                               int lastpos)
-{
-    int n;
-    X509_NAME_ENTRY *ne;
-    STACK_OF(X509_NAME_ENTRY) *sk;
+                               int lastpos) {
+  int n;
+  X509_NAME_ENTRY *ne;
+  STACK_OF(X509_NAME_ENTRY) *sk;
 
-    if (name == NULL)
-        return (-1);
-    if (lastpos < 0)
-        lastpos = -1;
-    sk = name->entries;
-    n = sk_X509_NAME_ENTRY_num(sk);
-    for (lastpos++; lastpos < n; lastpos++) {
-        ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
-        if (OBJ_cmp(ne->object, obj) == 0)
-            return (lastpos);
+  if (name == NULL) {
+    return -1;
+  }
+  if (lastpos < 0) {
+    lastpos = -1;
+  }
+  sk = name->entries;
+  n = sk_X509_NAME_ENTRY_num(sk);
+  for (lastpos++; lastpos < n; lastpos++) {
+    ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
+    if (OBJ_cmp(ne->object, obj) == 0) {
+      return lastpos;
     }
-    return (-1);
+  }
+  return -1;
 }
 
-X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc)
-{
-    if (name == NULL || loc < 0
-        || sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc)
-        return (NULL);
-    else
-        return (sk_X509_NAME_ENTRY_value(name->entries, loc));
+X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc) {
+  if (name == NULL || loc < 0 ||
+      sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) {
+    return NULL;
+  } else {
+    return (sk_X509_NAME_ENTRY_value(name->entries, loc));
+  }
 }
 
-X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc)
-{
-    X509_NAME_ENTRY *ret;
-    int i, n, set_prev, set_next;
-    STACK_OF(X509_NAME_ENTRY) *sk;
+X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc) {
+  if (name == NULL || loc < 0 ||
+      sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) {
+    return NULL;
+  }
 
-    if (name == NULL || loc < 0
-        || sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc)
-        return (NULL);
-    sk = name->entries;
-    ret = sk_X509_NAME_ENTRY_delete(sk, loc);
-    n = sk_X509_NAME_ENTRY_num(sk);
-    name->modified = 1;
-    if (loc == n)
-        return (ret);
-
-    /* else we need to fixup the set field */
-    if (loc != 0)
-        set_prev = (sk_X509_NAME_ENTRY_value(sk, loc - 1))->set;
-    else
-        set_prev = ret->set - 1;
-    set_next = sk_X509_NAME_ENTRY_value(sk, loc)->set;
-
-    /*
-     * set_prev is the previous set set is the current set set_next is the
-     * following prev 1 1 1 1 1 1 1 1 set 1 1 2 2 next 1 1 2 2 2 2 3 2 so
-     * basically only if prev and next differ by 2, then re-number down by 1
-     */
-    if (set_prev + 1 < set_next)
-        for (i = loc; i < n; i++)
-            sk_X509_NAME_ENTRY_value(sk, i)->set--;
-    return (ret);
-}
-
-int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
-                               const unsigned char *bytes, int len, int loc,
-                               int set)
-{
-    X509_NAME_ENTRY *ne;
-    int ret;
-    ne = X509_NAME_ENTRY_create_by_OBJ(NULL, obj, type, bytes, len);
-    if (!ne)
-        return 0;
-    ret = X509_NAME_add_entry(name, ne, loc, set);
-    X509_NAME_ENTRY_free(ne);
+  STACK_OF(X509_NAME_ENTRY) *sk = name->entries;
+  X509_NAME_ENTRY *ret = sk_X509_NAME_ENTRY_delete(sk, loc);
+  int n = sk_X509_NAME_ENTRY_num(sk);
+  name->modified = 1;
+  if (loc == n) {
     return ret;
+  }
+
+  int set_prev;
+  if (loc != 0) {
+    set_prev = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
+  } else {
+    set_prev = ret->set - 1;
+  }
+  int set_next = sk_X509_NAME_ENTRY_value(sk, loc)->set;
+
+  // If we removed a singleton RDN, update the RDN indices so they are
+  // consecutive again.
+  if (set_prev + 1 < set_next) {
+    for (int i = loc; i < n; i++) {
+      sk_X509_NAME_ENTRY_value(sk, i)->set--;
+    }
+  }
+  return ret;
+}
+
+int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj,
+                               int type, const unsigned char *bytes, int len,
+                               int loc, int set) {
+  X509_NAME_ENTRY *ne =
+      X509_NAME_ENTRY_create_by_OBJ(NULL, obj, type, bytes, len);
+  if (!ne) {
+    return 0;
+  }
+  int ret = X509_NAME_add_entry(name, ne, loc, set);
+  X509_NAME_ENTRY_free(ne);
+  return ret;
 }
 
 int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
                                const unsigned char *bytes, int len, int loc,
-                               int set)
-{
-    X509_NAME_ENTRY *ne;
-    int ret;
-    ne = X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len);
-    if (!ne)
-        return 0;
-    ret = X509_NAME_add_entry(name, ne, loc, set);
-    X509_NAME_ENTRY_free(ne);
-    return ret;
+                               int set) {
+  X509_NAME_ENTRY *ne =
+      X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len);
+  if (!ne) {
+    return 0;
+  }
+  int ret = X509_NAME_add_entry(name, ne, loc, set);
+  X509_NAME_ENTRY_free(ne);
+  return ret;
 }
 
 int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
                                const unsigned char *bytes, int len, int loc,
-                               int set)
-{
-    X509_NAME_ENTRY *ne;
-    int ret;
-    ne = X509_NAME_ENTRY_create_by_txt(NULL, field, type, bytes, len);
-    if (!ne)
-        return 0;
-    ret = X509_NAME_add_entry(name, ne, loc, set);
-    X509_NAME_ENTRY_free(ne);
-    return ret;
+                               int set) {
+  X509_NAME_ENTRY *ne =
+      X509_NAME_ENTRY_create_by_txt(NULL, field, type, bytes, len);
+  if (!ne) {
+    return 0;
+  }
+  int ret = X509_NAME_add_entry(name, ne, loc, set);
+  X509_NAME_ENTRY_free(ne);
+  return ret;
 }
 
-/*
- * if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
- * guy we are about to stomp on.
- */
-int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
-                        int set)
-{
-    X509_NAME_ENTRY *new_name = NULL;
-    int n, i, inc;
-    STACK_OF(X509_NAME_ENTRY) *sk;
+// if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
+// guy we are about to stomp on.
+int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc,
+                        int set) {
+  X509_NAME_ENTRY *new_name = NULL;
+  int n, i, inc;
+  STACK_OF(X509_NAME_ENTRY) *sk;
 
-    if (name == NULL)
-        return (0);
-    sk = name->entries;
+  if (name == NULL) {
+    return 0;
+  }
+  sk = name->entries;
+  n = sk_X509_NAME_ENTRY_num(sk);
+  if (loc > n) {
+    loc = n;
+  } else if (loc < 0) {
+    loc = n;
+  }
+
+  inc = (set == 0);
+  name->modified = 1;
+
+  if (set == -1) {
+    if (loc == 0) {
+      set = 0;
+      inc = 1;
+    } else {
+      set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
+    }
+  } else {  // if (set >= 0)
+
+    if (loc >= n) {
+      if (loc != 0) {
+        set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set + 1;
+      } else {
+        set = 0;
+      }
+    } else {
+      set = sk_X509_NAME_ENTRY_value(sk, loc)->set;
+    }
+  }
+
+  if ((new_name = X509_NAME_ENTRY_dup(entry)) == NULL) {
+    goto err;
+  }
+  new_name->set = set;
+  if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  if (inc) {
     n = sk_X509_NAME_ENTRY_num(sk);
-    if (loc > n)
-        loc = n;
-    else if (loc < 0)
-        loc = n;
-
-    inc = (set == 0);
-    name->modified = 1;
-
-    if (set == -1) {
-        if (loc == 0) {
-            set = 0;
-            inc = 1;
-        } else {
-            set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
-        }
-    } else {                    /* if (set >= 0) */
-
-        if (loc >= n) {
-            if (loc != 0)
-                set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set + 1;
-            else
-                set = 0;
-        } else
-            set = sk_X509_NAME_ENTRY_value(sk, loc)->set;
+    for (i = loc + 1; i < n; i++) {
+      sk_X509_NAME_ENTRY_value(sk, i)->set += 1;
     }
-
-    if ((new_name = X509_NAME_ENTRY_dup(ne)) == NULL)
-        goto err;
-    new_name->set = set;
-    if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    if (inc) {
-        n = sk_X509_NAME_ENTRY_num(sk);
-        for (i = loc + 1; i < n; i++)
-            sk_X509_NAME_ENTRY_value(sk, i)->set += 1;
-    }
-    return (1);
- err:
-    if (new_name != NULL)
-        X509_NAME_ENTRY_free(new_name);
-    return (0);
+  }
+  return 1;
+err:
+  if (new_name != NULL) {
+    X509_NAME_ENTRY_free(new_name);
+  }
+  return 0;
 }
 
 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
                                                const char *field, int type,
                                                const unsigned char *bytes,
-                                               int len)
-{
-    ASN1_OBJECT *obj;
-    X509_NAME_ENTRY *nentry;
+                                               int len) {
+  ASN1_OBJECT *obj;
+  X509_NAME_ENTRY *nentry;
 
-    obj = OBJ_txt2obj(field, 0);
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
-        ERR_add_error_data(2, "name=", field);
-        return (NULL);
-    }
-    nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
-    ASN1_OBJECT_free(obj);
-    return nentry;
+  obj = OBJ_txt2obj(field, 0);
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
+    ERR_add_error_data(2, "name=", field);
+    return NULL;
+  }
+  nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
+  ASN1_OBJECT_free(obj);
+  return nentry;
 }
 
 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
                                                int type,
                                                const unsigned char *bytes,
-                                               int len)
-{
-    const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
-        return NULL;
-    }
-    return X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
+                                               int len) {
+  const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
+    OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
+    return NULL;
+  }
+  return X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
 }
 
 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
-                                               const ASN1_OBJECT *obj,
-                                               int type,
+                                               const ASN1_OBJECT *obj, int type,
                                                const unsigned char *bytes,
-                                               int len)
-{
-    X509_NAME_ENTRY *ret;
+                                               int len) {
+  X509_NAME_ENTRY *ret;
 
-    if ((ne == NULL) || (*ne == NULL)) {
-        if ((ret = X509_NAME_ENTRY_new()) == NULL)
-            return (NULL);
-    } else
-        ret = *ne;
+  if ((ne == NULL) || (*ne == NULL)) {
+    if ((ret = X509_NAME_ENTRY_new()) == NULL) {
+      return NULL;
+    }
+  } else {
+    ret = *ne;
+  }
 
-    if (!X509_NAME_ENTRY_set_object(ret, obj))
-        goto err;
-    if (!X509_NAME_ENTRY_set_data(ret, type, bytes, len))
-        goto err;
+  if (!X509_NAME_ENTRY_set_object(ret, obj)) {
+    goto err;
+  }
+  if (!X509_NAME_ENTRY_set_data(ret, type, bytes, len)) {
+    goto err;
+  }
 
-    if ((ne != NULL) && (*ne == NULL))
-        *ne = ret;
-    return (ret);
- err:
-    if ((ne == NULL) || (ret != *ne))
-        X509_NAME_ENTRY_free(ret);
-    return (NULL);
+  if ((ne != NULL) && (*ne == NULL)) {
+    *ne = ret;
+  }
+  return ret;
+err:
+  if ((ne == NULL) || (ret != *ne)) {
+    X509_NAME_ENTRY_free(ret);
+  }
+  return NULL;
 }
 
-int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj)
-{
-    if ((ne == NULL) || (obj == NULL)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-        return (0);
-    }
-    ASN1_OBJECT_free(ne->object);
-    ne->object = OBJ_dup(obj);
-    return ((ne->object == NULL) ? 0 : 1);
+int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj) {
+  if ((ne == NULL) || (obj == NULL)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
+    return 0;
+  }
+  ASN1_OBJECT_free(ne->object);
+  ne->object = OBJ_dup(obj);
+  return ((ne->object == NULL) ? 0 : 1);
 }
 
 int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
-                             const unsigned char *bytes, int len)
-{
-    int i;
+                             const unsigned char *bytes, int len) {
+  int i;
 
-    if ((ne == NULL) || ((bytes == NULL) && (len != 0)))
-        return (0);
-    if ((type > 0) && (type & MBSTRING_FLAG))
-        return ASN1_STRING_set_by_NID(&ne->value, bytes,
-                                      len, type,
-                                      OBJ_obj2nid(ne->object)) ? 1 : 0;
-    if (len < 0)
-        len = strlen((const char *)bytes);
-    i = ASN1_STRING_set(ne->value, bytes, len);
-    if (!i)
-        return (0);
-    if (type != V_ASN1_UNDEF) {
-        ne->value->type = type;
-    }
-    return (1);
+  if ((ne == NULL) || ((bytes == NULL) && (len != 0))) {
+    return 0;
+  }
+  if ((type > 0) && (type & MBSTRING_FLAG)) {
+    return ASN1_STRING_set_by_NID(&ne->value, bytes, len, type,
+                                  OBJ_obj2nid(ne->object))
+               ? 1
+               : 0;
+  }
+  if (len < 0) {
+    len = strlen((const char *)bytes);
+  }
+  i = ASN1_STRING_set(ne->value, bytes, len);
+  if (!i) {
+    return 0;
+  }
+  if (type != V_ASN1_UNDEF) {
+    ne->value->type = type;
+  }
+  return 1;
 }
 
-ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne)
-{
-    if (ne == NULL)
-        return (NULL);
-    return (ne->object);
+ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne) {
+  if (ne == NULL) {
+    return NULL;
+  }
+  return ne->object;
 }
 
-ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne)
-{
-    if (ne == NULL)
-        return (NULL);
-    return (ne->value);
+ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne) {
+  if (ne == NULL) {
+    return NULL;
+  }
+  return ne->value;
 }
diff --git a/src/crypto/x509/x509rset.c b/src/crypto/x509/x509rset.c
index 72b4148..8b8beff 100644
--- a/src/crypto/x509/x509rset.c
+++ b/src/crypto/x509/x509rset.c
@@ -62,23 +62,48 @@
 #include "internal.h"
 
 
-int X509_REQ_set_version(X509_REQ *x, long version)
-{
-    if (x == NULL)
-        return (0);
-    return (ASN1_INTEGER_set(x->req_info->version, version));
+int X509_REQ_set_version(X509_REQ *x, long version) {
+  if (x == NULL) {
+    return 0;
+  }
+  if (version != X509_REQ_VERSION_1) {
+    OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+    return 0;
+  }
+  return ASN1_INTEGER_set_int64(x->req_info->version, version);
 }
 
-int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name)
-{
-    if ((x == NULL) || (x->req_info == NULL))
-        return (0);
-    return (X509_NAME_set(&x->req_info->subject, name));
+int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name) {
+  if ((x == NULL) || (x->req_info == NULL)) {
+    return 0;
+  }
+  return (X509_NAME_set(&x->req_info->subject, name));
 }
 
-int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey)
-{
-    if ((x == NULL) || (x->req_info == NULL))
-        return (0);
-    return (X509_PUBKEY_set(&x->req_info->pubkey, pkey));
+int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey) {
+  if ((x == NULL) || (x->req_info == NULL)) {
+    return 0;
+  }
+  return (X509_PUBKEY_set(&x->req_info->pubkey, pkey));
+}
+
+int X509_REQ_set1_signature_algo(X509_REQ *req, const X509_ALGOR *algo) {
+  X509_ALGOR *copy = X509_ALGOR_dup(algo);
+  if (copy == NULL) {
+    return 0;
+  }
+
+  X509_ALGOR_free(req->sig_alg);
+  req->sig_alg = copy;
+  return 1;
+}
+
+int X509_REQ_set1_signature_value(X509_REQ *req, const uint8_t *sig,
+                                  size_t sig_len) {
+  if (!ASN1_STRING_set(req->signature, sig, sig_len)) {
+    return 0;
+  }
+  req->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+  req->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+  return 1;
 }
diff --git a/src/crypto/x509/x509spki.c b/src/crypto/x509/x509spki.c
index 4a9b95e..8251534 100644
--- a/src/crypto/x509/x509spki.c
+++ b/src/crypto/x509/x509spki.c
@@ -61,77 +61,76 @@
 #include <openssl/mem.h>
 #include <openssl/x509.h>
 
-int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey)
-{
-    if ((x == NULL) || (x->spkac == NULL))
-        return (0);
-    return (X509_PUBKEY_set(&(x->spkac->pubkey), pkey));
+int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey) {
+  if ((x == NULL) || (x->spkac == NULL)) {
+    return 0;
+  }
+  return (X509_PUBKEY_set(&(x->spkac->pubkey), pkey));
 }
 
-EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x)
-{
-    if ((x == NULL) || (x->spkac == NULL))
-        return (NULL);
-    return (X509_PUBKEY_get(x->spkac->pubkey));
+EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x) {
+  if ((x == NULL) || (x->spkac == NULL)) {
+    return NULL;
+  }
+  return (X509_PUBKEY_get(x->spkac->pubkey));
 }
 
-/* Load a Netscape SPKI from a base64 encoded string */
+// Load a Netscape SPKI from a base64 encoded string
 
-NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len)
-{
-    unsigned char *spki_der;
-    const unsigned char *p;
-    size_t spki_len;
-    NETSCAPE_SPKI *spki;
-    if (len <= 0)
-        len = strlen(str);
-    if (!EVP_DecodedLength(&spki_len, len)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR);
-        return NULL;
-    }
-    if (!(spki_der = OPENSSL_malloc(spki_len))) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    if (!EVP_DecodeBase64
-        (spki_der, &spki_len, spki_len, (const uint8_t *)str, len)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR);
-        OPENSSL_free(spki_der);
-        return NULL;
-    }
-    p = spki_der;
-    spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len);
+NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len) {
+  unsigned char *spki_der;
+  const unsigned char *p;
+  size_t spki_len;
+  NETSCAPE_SPKI *spki;
+  if (len <= 0) {
+    len = strlen(str);
+  }
+  if (!EVP_DecodedLength(&spki_len, len)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR);
+    return NULL;
+  }
+  if (!(spki_der = OPENSSL_malloc(spki_len))) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  if (!EVP_DecodeBase64(spki_der, &spki_len, spki_len, (const uint8_t *)str,
+                        len)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_BASE64_DECODE_ERROR);
     OPENSSL_free(spki_der);
-    return spki;
+    return NULL;
+  }
+  p = spki_der;
+  spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len);
+  OPENSSL_free(spki_der);
+  return spki;
 }
 
-/* Generate a base64 encoded string from an SPKI */
+// Generate a base64 encoded string from an SPKI
 
-char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki)
-{
-    unsigned char *der_spki, *p;
-    char *b64_str;
-    size_t b64_len;
-    int der_len;
-    der_len = i2d_NETSCAPE_SPKI(spki, NULL);
-    if (!EVP_EncodedLength(&b64_len, der_len)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW);
-        return NULL;
-    }
-    der_spki = OPENSSL_malloc(der_len);
-    if (der_spki == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    b64_str = OPENSSL_malloc(b64_len);
-    if (b64_str == NULL) {
-        OPENSSL_free(der_spki);
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    p = der_spki;
-    i2d_NETSCAPE_SPKI(spki, &p);
-    EVP_EncodeBlock((unsigned char *)b64_str, der_spki, der_len);
+char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) {
+  unsigned char *der_spki, *p;
+  char *b64_str;
+  size_t b64_len;
+  int der_len;
+  der_len = i2d_NETSCAPE_SPKI(spki, NULL);
+  if (!EVP_EncodedLength(&b64_len, der_len)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW);
+    return NULL;
+  }
+  der_spki = OPENSSL_malloc(der_len);
+  if (der_spki == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  b64_str = OPENSSL_malloc(b64_len);
+  if (b64_str == NULL) {
     OPENSSL_free(der_spki);
-    return b64_str;
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  p = der_spki;
+  i2d_NETSCAPE_SPKI(spki, &p);
+  EVP_EncodeBlock((unsigned char *)b64_str, der_spki, der_len);
+  OPENSSL_free(der_spki);
+  return b64_str;
 }
diff --git a/src/crypto/x509/x_algor.c b/src/crypto/x509/x_algor.c
index a454c0c..819aee5 100644
--- a/src/crypto/x509/x_algor.c
+++ b/src/crypto/x509/x_algor.c
@@ -65,89 +65,85 @@
 
 
 ASN1_SEQUENCE(X509_ALGOR) = {
-        ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT),
-        ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY)
+    ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT),
+    ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY),
 } ASN1_SEQUENCE_END(X509_ALGOR)
 
-ASN1_ITEM_TEMPLATE(X509_ALGORS) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, algorithms, X509_ALGOR)
-ASN1_ITEM_TEMPLATE_END(X509_ALGORS)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_ALGOR)
+IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ALGOR)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_ALGOR)
-IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_ALGORS, X509_ALGORS, X509_ALGORS)
-IMPLEMENT_ASN1_DUP_FUNCTION(X509_ALGOR)
-
-int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval)
-{
-    if (!alg)
-        return 0;
-    if (ptype != V_ASN1_UNDEF) {
-        if (alg->parameter == NULL)
-            alg->parameter = ASN1_TYPE_new();
-        if (alg->parameter == NULL)
-            return 0;
+int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval) {
+  if (!alg) {
+    return 0;
+  }
+  if (ptype != V_ASN1_UNDEF) {
+    if (alg->parameter == NULL) {
+      alg->parameter = ASN1_TYPE_new();
     }
-    if (alg) {
-        ASN1_OBJECT_free(alg->algorithm);
-        alg->algorithm = aobj;
+    if (alg->parameter == NULL) {
+      return 0;
     }
-    if (ptype == 0)
-        return 1;
-    if (ptype == V_ASN1_UNDEF) {
-        if (alg->parameter) {
-            ASN1_TYPE_free(alg->parameter);
-            alg->parameter = NULL;
-        }
-    } else
-        ASN1_TYPE_set(alg->parameter, ptype, pval);
+  }
+  if (alg) {
+    ASN1_OBJECT_free(alg->algorithm);
+    alg->algorithm = aobj;
+  }
+  if (ptype == 0) {
     return 1;
+  }
+  if (ptype == V_ASN1_UNDEF) {
+    if (alg->parameter) {
+      ASN1_TYPE_free(alg->parameter);
+      alg->parameter = NULL;
+    }
+  } else {
+    ASN1_TYPE_set(alg->parameter, ptype, pval);
+  }
+  return 1;
 }
 
 void X509_ALGOR_get0(const ASN1_OBJECT **out_obj, int *out_param_type,
-                     const void **out_param_value, const X509_ALGOR *alg)
-{
-    if (out_obj != NULL) {
-        *out_obj = alg->algorithm;
+                     const void **out_param_value, const X509_ALGOR *alg) {
+  if (out_obj != NULL) {
+    *out_obj = alg->algorithm;
+  }
+  if (out_param_type != NULL) {
+    int type = V_ASN1_UNDEF;
+    const void *value = NULL;
+    if (alg->parameter != NULL) {
+      type = alg->parameter->type;
+      value = asn1_type_value_as_pointer(alg->parameter);
     }
-    if (out_param_type != NULL) {
-        int type = V_ASN1_UNDEF;
-        const void *value = NULL;
-        if (alg->parameter != NULL) {
-            type = alg->parameter->type;
-            value = asn1_type_value_as_pointer(alg->parameter);
-        }
-        *out_param_type = type;
-        if (out_param_value != NULL) {
-            *out_param_value = value;
-        }
+    *out_param_type = type;
+    if (out_param_value != NULL) {
+      *out_param_value = value;
     }
+  }
 }
 
-/* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
+// Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD
 
-void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md)
-{
-    int param_type;
+void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) {
+  int param_type;
 
-    if (EVP_MD_flags(md) & EVP_MD_FLAG_DIGALGID_ABSENT)
-        param_type = V_ASN1_UNDEF;
-    else
-        param_type = V_ASN1_NULL;
+  if (EVP_MD_flags(md) & EVP_MD_FLAG_DIGALGID_ABSENT) {
+    param_type = V_ASN1_UNDEF;
+  } else {
+    param_type = V_ASN1_NULL;
+  }
 
-    X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL);
-
+  X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL);
 }
 
-/*
- * X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise.
- */
-int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
-{
-    int rv;
-    rv = OBJ_cmp(a->algorithm, b->algorithm);
-    if (rv)
-        return rv;
-    if (!a->parameter && !b->parameter)
-        return 0;
-    return ASN1_TYPE_cmp(a->parameter, b->parameter);
+// X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise.
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) {
+  int rv;
+  rv = OBJ_cmp(a->algorithm, b->algorithm);
+  if (rv) {
+    return rv;
+  }
+  if (!a->parameter && !b->parameter) {
+    return 0;
+  }
+  return ASN1_TYPE_cmp(a->parameter, b->parameter);
 }
diff --git a/src/crypto/x509/x_all.c b/src/crypto/x509/x_all.c
index 7ceff50..bad9ce6 100644
--- a/src/crypto/x509/x_all.c
+++ b/src/crypto/x509/x_all.c
@@ -69,135 +69,110 @@
 #include "internal.h"
 
 
-int X509_verify(X509 *x509, EVP_PKEY *pkey)
-{
-    if (X509_ALGOR_cmp(x509->sig_alg, x509->cert_info->signature)) {
-        OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH);
-        return 0;
-    }
-    return ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), x509->sig_alg,
-                            x509->signature, x509->cert_info, pkey);
+int X509_verify(X509 *x509, EVP_PKEY *pkey) {
+  if (X509_ALGOR_cmp(x509->sig_alg, x509->cert_info->signature)) {
+    OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH);
+    return 0;
+  }
+  return ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), x509->sig_alg,
+                          x509->signature, x509->cert_info, pkey);
 }
 
-int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey)
-{
-    return ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
-                            req->sig_alg, req->signature, req->req_info, pkey);
+int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey) {
+  return ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO), req->sig_alg,
+                          req->signature, req->req_info, pkey);
 }
 
-int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
-{
-    x->cert_info->enc.modified = 1;
-    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
-                           x->sig_alg, x->signature, x->cert_info, pkey, md));
+int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) {
+  x->cert_info->enc.modified = 1;
+  return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
+                         x->sig_alg, x->signature, x->cert_info, pkey, md));
 }
 
-int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
-{
-    x->cert_info->enc.modified = 1;
-    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
-                              x->cert_info->signature,
-                              x->sig_alg, x->signature, x->cert_info, ctx);
+int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) {
+  x->cert_info->enc.modified = 1;
+  return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
+                            x->sig_alg, x->signature, x->cert_info, ctx);
 }
 
-int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
-{
-    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL,
-                           x->signature, x->req_info, pkey, md));
+int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md) {
+  return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL,
+                         x->signature, x->req_info, pkey, md));
 }
 
-int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
-{
-    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
-                              x->sig_alg, NULL, x->signature, x->req_info,
-                              ctx);
+int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx) {
+  return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL,
+                            x->signature, x->req_info, ctx);
 }
 
-int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
-{
-    x->crl->enc.modified = 1;
-    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg,
-                           x->sig_alg, x->signature, x->crl, pkey, md));
+int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md) {
+  x->crl->enc.modified = 1;
+  return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg,
+                         x->sig_alg, x->signature, x->crl, pkey, md));
 }
 
-int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
-{
-    x->crl->enc.modified = 1;
-    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
-                              x->crl->sig_alg, x->sig_alg, x->signature,
-                              x->crl, ctx);
+int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) {
+  x->crl->enc.modified = 1;
+  return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg,
+                            x->sig_alg, x->signature, x->crl, ctx);
 }
 
-int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
-{
-    return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL,
-                           x->signature, x->spkac, pkey, md));
+int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md) {
+  return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL,
+                         x->signature, x->spkac, pkey, md));
 }
 
-int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey)
-{
-    return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), spki->sig_algor,
-                             spki->signature, spki->spkac, pkey));
+int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey) {
+  return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), spki->sig_algor,
+                           spki->signature, spki->spkac, pkey));
 }
 
-X509 *d2i_X509_fp(FILE *fp, X509 **x509)
-{
-    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
+X509 *d2i_X509_fp(FILE *fp, X509 **x509) {
+  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
 }
 
-int i2d_X509_fp(FILE *fp, X509 *x509)
-{
-    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
+int i2d_X509_fp(FILE *fp, X509 *x509) {
+  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
 }
 
-X509 *d2i_X509_bio(BIO *bp, X509 **x509)
-{
-    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
+X509 *d2i_X509_bio(BIO *bp, X509 **x509) {
+  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
 }
 
-int i2d_X509_bio(BIO *bp, X509 *x509)
-{
-    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
+int i2d_X509_bio(BIO *bp, X509 *x509) {
+  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
 }
 
-X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
-{
-    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
+X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl) {
+  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
 }
 
-int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
-{
-    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
+int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl) {
+  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
 }
 
-X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
-{
-    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
+X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl) {
+  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
 }
 
-int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
-{
-    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
+int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl) {
+  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
 }
 
-X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
-{
-    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
+X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req) {
+  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
 }
 
-int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
-{
-    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
+int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req) {
+  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
 }
 
-X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
-{
-    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
+X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req) {
+  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
 }
 
-int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
-{
-    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
+int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) {
+  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
 }
 
 
@@ -266,7 +241,6 @@
 IMPLEMENT_D2I_BIO(RSA, d2i_RSA_PUBKEY_bio, d2i_RSA_PUBKEY)
 IMPLEMENT_I2D_BIO(RSA, i2d_RSA_PUBKEY_bio, i2d_RSA_PUBKEY)
 
-#ifndef OPENSSL_NO_DSA
 IMPLEMENT_D2I_FP(DSA, d2i_DSAPrivateKey_fp, d2i_DSAPrivateKey_bio)
 IMPLEMENT_I2D_FP(DSA, i2d_DSAPrivateKey_fp, i2d_DSAPrivateKey_bio)
 
@@ -278,7 +252,6 @@
 
 IMPLEMENT_D2I_BIO(DSA, d2i_DSA_PUBKEY_bio, d2i_DSA_PUBKEY)
 IMPLEMENT_I2D_BIO(DSA, i2d_DSA_PUBKEY_bio, i2d_DSA_PUBKEY)
-#endif
 
 IMPLEMENT_D2I_FP(EC_KEY, d2i_ECPrivateKey_fp, d2i_ECPrivateKey_bio)
 IMPLEMENT_I2D_FP(EC_KEY, i2d_ECPrivateKey_fp, i2d_ECPrivateKey_bio)
@@ -292,42 +265,37 @@
 IMPLEMENT_D2I_BIO(EC_KEY, d2i_EC_PUBKEY_bio, d2i_EC_PUBKEY)
 IMPLEMENT_I2D_BIO(EC_KEY, i2d_EC_PUBKEY_bio, i2d_EC_PUBKEY)
 
-int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
-                       unsigned char *md, unsigned int *len)
-{
-    ASN1_BIT_STRING *key;
-    key = X509_get0_pubkey_bitstr(data);
-    if (!key)
-        return 0;
-    return EVP_Digest(key->data, key->length, md, len, type, NULL);
+int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
+                       unsigned int *len) {
+  ASN1_BIT_STRING *key;
+  key = X509_get0_pubkey_bitstr(data);
+  if (!key) {
+    return 0;
+  }
+  return EVP_Digest(key->data, key->length, md, len, type, NULL);
 }
 
 int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
-                unsigned int *len)
-{
-    return (ASN1_item_digest
-            (ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
+                unsigned int *len) {
+  return (ASN1_item_digest(ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
 }
 
-int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
-                    unsigned char *md, unsigned int *len)
-{
-    return (ASN1_item_digest
-            (ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
+int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
+                    unsigned int *len) {
+  return (
+      ASN1_item_digest(ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
 }
 
-int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
-                    unsigned char *md, unsigned int *len)
-{
-    return (ASN1_item_digest
-            (ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len));
+int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, unsigned char *md,
+                    unsigned int *len) {
+  return (
+      ASN1_item_digest(ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len));
 }
 
 int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
-                     unsigned char *md, unsigned int *len)
-{
-    return (ASN1_item_digest
-            (ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len));
+                     unsigned char *md, unsigned int *len) {
+  return (
+      ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len));
 }
 
 IMPLEMENT_D2I_FP(X509_SIG, d2i_PKCS8_fp, d2i_PKCS8_bio)
@@ -341,16 +309,16 @@
 IMPLEMENT_I2D_FP(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO_fp,
                  i2d_PKCS8_PRIV_KEY_INFO_bio)
 
-int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
-{
-    PKCS8_PRIV_KEY_INFO *p8inf;
-    int ret;
-    p8inf = EVP_PKEY2PKCS8(key);
-    if (!p8inf)
-        return 0;
-    ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
-    PKCS8_PRIV_KEY_INFO_free(p8inf);
-    return ret;
+int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key) {
+  PKCS8_PRIV_KEY_INFO *p8inf;
+  int ret;
+  p8inf = EVP_PKEY2PKCS8(key);
+  if (!p8inf) {
+    return 0;
+  }
+  ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
+  PKCS8_PRIV_KEY_INFO_free(p8inf);
+  return ret;
 }
 
 IMPLEMENT_D2I_FP(EVP_PKEY, d2i_PrivateKey_fp, d2i_PrivateKey_bio)
@@ -364,16 +332,16 @@
 IMPLEMENT_I2D_BIO(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO_bio,
                   i2d_PKCS8_PRIV_KEY_INFO)
 
-int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
-{
-    PKCS8_PRIV_KEY_INFO *p8inf;
-    int ret;
-    p8inf = EVP_PKEY2PKCS8(key);
-    if (!p8inf)
-        return 0;
-    ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
-    PKCS8_PRIV_KEY_INFO_free(p8inf);
-    return ret;
+int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key) {
+  PKCS8_PRIV_KEY_INFO *p8inf;
+  int ret;
+  p8inf = EVP_PKEY2PKCS8(key);
+  if (!p8inf) {
+    return 0;
+  }
+  ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
+  PKCS8_PRIV_KEY_INFO_free(p8inf);
+  return ret;
 }
 
 IMPLEMENT_D2I_BIO(EVP_PKEY, d2i_PrivateKey_bio, d2i_AutoPrivateKey)
diff --git a/src/crypto/x509/x_attrib.c b/src/crypto/x509/x_attrib.c
index 91b3ee8..14428b3 100644
--- a/src/crypto/x509/x_attrib.c
+++ b/src/crypto/x509/x_attrib.c
@@ -56,43 +56,42 @@
 
 #include <openssl/asn1.h>
 #include <openssl/asn1t.h>
-#include <openssl/x509.h>
 #include <openssl/obj.h>
+#include <openssl/x509.h>
 
 #include "internal.h"
 
 
 ASN1_SEQUENCE(X509_ATTRIBUTE) = {
-        ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT),
-        ASN1_SET_OF(X509_ATTRIBUTE, set, ASN1_ANY),
+    ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT),
+    ASN1_SET_OF(X509_ATTRIBUTE, set, ASN1_ANY),
 } ASN1_SEQUENCE_END(X509_ATTRIBUTE)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE)
-IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_ATTRIBUTE)
+IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_ATTRIBUTE)
 
-X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, void *value)
-{
-    ASN1_OBJECT *obj = OBJ_nid2obj(nid);
-    if (obj == NULL) {
-        return NULL;
-    }
-
-    X509_ATTRIBUTE *ret = X509_ATTRIBUTE_new();
-    ASN1_TYPE *val = ASN1_TYPE_new();
-    if (ret == NULL || val == NULL) {
-        goto err;
-    }
-
-    ret->object = obj;
-    if (!sk_ASN1_TYPE_push(ret->set, val)) {
-        goto err;
-    }
-
-    ASN1_TYPE_set(val, attrtype, value);
-    return ret;
-
- err:
-    X509_ATTRIBUTE_free(ret);
-    ASN1_TYPE_free(val);
+X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, void *value) {
+  ASN1_OBJECT *obj = OBJ_nid2obj(nid);
+  if (obj == NULL) {
     return NULL;
+  }
+
+  X509_ATTRIBUTE *ret = X509_ATTRIBUTE_new();
+  ASN1_TYPE *val = ASN1_TYPE_new();
+  if (ret == NULL || val == NULL) {
+    goto err;
+  }
+
+  ret->object = obj;
+  if (!sk_ASN1_TYPE_push(ret->set, val)) {
+    goto err;
+  }
+
+  ASN1_TYPE_set(val, attrtype, value);
+  return ret;
+
+err:
+  X509_ATTRIBUTE_free(ret);
+  ASN1_TYPE_free(val);
+  return NULL;
 }
diff --git a/src/crypto/x509/x_crl.c b/src/crypto/x509/x_crl.c
index 0d419ac..c153b5d 100644
--- a/src/crypto/x509/x_crl.c
+++ b/src/crypto/x509/x_crl.c
@@ -65,501 +65,412 @@
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
+#include <assert.h>
+
 #include "../internal.h"
 #include "internal.h"
 
-/*
- * Method to handle CRL access. In general a CRL could be very large (several
- * Mb) and can consume large amounts of resources if stored in memory by
- * multiple processes. This method allows general CRL operations to be
- * redirected to more efficient callbacks: for example a CRL entry database.
- */
-
-#define X509_CRL_METHOD_DYNAMIC         1
-
-struct x509_crl_method_st {
-    int flags;
-    int (*crl_init) (X509_CRL *crl);
-    int (*crl_free) (X509_CRL *crl);
-    int (*crl_lookup) (X509_CRL *crl, X509_REVOKED **ret,
-                       ASN1_INTEGER *ser, X509_NAME *issuer);
-    int (*crl_verify) (X509_CRL *crl, EVP_PKEY *pk);
-};
-
 static int X509_REVOKED_cmp(const X509_REVOKED **a, const X509_REVOKED **b);
 static int setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp);
 
 ASN1_SEQUENCE(X509_REVOKED) = {
-        ASN1_SIMPLE(X509_REVOKED,serialNumber, ASN1_INTEGER),
-        ASN1_SIMPLE(X509_REVOKED,revocationDate, ASN1_TIME),
-        ASN1_SEQUENCE_OF_OPT(X509_REVOKED,extensions, X509_EXTENSION)
+    ASN1_SIMPLE(X509_REVOKED, serialNumber, ASN1_INTEGER),
+    ASN1_SIMPLE(X509_REVOKED, revocationDate, ASN1_TIME),
+    ASN1_SEQUENCE_OF_OPT(X509_REVOKED, extensions, X509_EXTENSION),
 } ASN1_SEQUENCE_END(X509_REVOKED)
 
-static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r);
-static int def_crl_lookup(X509_CRL *crl,
-                          X509_REVOKED **ret, ASN1_INTEGER *serial,
-                          X509_NAME *issuer);
+static int crl_lookup(X509_CRL *crl, X509_REVOKED **ret, ASN1_INTEGER *serial,
+                      X509_NAME *issuer);
 
-static const X509_CRL_METHOD int_crl_meth = {
-    0,
-    0, 0,
-    def_crl_lookup,
-    def_crl_verify
-};
-
-static const X509_CRL_METHOD *default_crl_method = &int_crl_meth;
-
-/*
- * The X509_CRL_INFO structure needs a bit of customisation. Since we cache
- * the original encoding the signature wont be affected by reordering of the
- * revoked field.
- */
+// The X509_CRL_INFO structure needs a bit of customisation. Since we cache
+// the original encoding the signature wont be affected by reordering of the
+// revoked field.
 static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                      void *exarg)
-{
-    X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
+                      void *exarg) {
+  X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
 
-    if (!a || !a->revoked)
-        return 1;
-    switch (operation) {
-        /*
-         * Just set cmp function here. We don't sort because that would
-         * affect the output of X509_CRL_print().
-         */
-    case ASN1_OP_D2I_POST:
-        /* TODO(davidben): Check that default |versions| are never encoded and
-         * that |extensions| is only present in v2. */
-
-        (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
-        break;
-    }
+  if (!a || !a->revoked) {
     return 1;
+  }
+  switch (operation) {
+      // Just set cmp function here. We don't sort because that would
+      // affect the output of X509_CRL_print().
+    case ASN1_OP_D2I_POST:
+      (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
+      break;
+  }
+  return 1;
 }
 
 
 ASN1_SEQUENCE_enc(X509_CRL_INFO, enc, crl_inf_cb) = {
-        ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER),
-        ASN1_SIMPLE(X509_CRL_INFO, sig_alg, X509_ALGOR),
-        ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME),
-        ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME),
-        ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME),
-        ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED),
-        ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0)
+    ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER),
+    ASN1_SIMPLE(X509_CRL_INFO, sig_alg, X509_ALGOR),
+    ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME),
+    ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME),
+    ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME),
+    ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED),
+    ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0),
 } ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO)
 
-/*
- * Set CRL entry issuer according to CRL certificate issuer extension. Check
- * for unhandled critical CRL entry extensions.
- */
+// Set CRL entry issuer according to CRL certificate issuer extension. Check
+// for unhandled critical CRL entry extensions.
 
-static int crl_set_issuers(X509_CRL *crl)
-{
+static int crl_set_issuers(X509_CRL *crl) {
+  size_t i, k;
+  int j;
+  GENERAL_NAMES *gens, *gtmp;
+  STACK_OF(X509_REVOKED) *revoked;
 
-    size_t i, k;
-    int j;
-    GENERAL_NAMES *gens, *gtmp;
-    STACK_OF(X509_REVOKED) *revoked;
+  revoked = X509_CRL_get_REVOKED(crl);
 
-    revoked = X509_CRL_get_REVOKED(crl);
-
-    gens = NULL;
-    for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
-        X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i);
-        STACK_OF(X509_EXTENSION) *exts;
-        ASN1_ENUMERATED *reason;
-        X509_EXTENSION *ext;
-        gtmp = X509_REVOKED_get_ext_d2i(rev,
-                                        NID_certificate_issuer, &j, NULL);
-        if (!gtmp && (j != -1)) {
-            crl->flags |= EXFLAG_INVALID;
-            return 1;
-        }
-
-        if (gtmp) {
-            gens = gtmp;
-            if (!crl->issuers) {
-                crl->issuers = sk_GENERAL_NAMES_new_null();
-                if (!crl->issuers)
-                    return 0;
-            }
-            if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
-                return 0;
-        }
-        rev->issuer = gens;
-
-        reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL);
-        if (!reason && (j != -1)) {
-            crl->flags |= EXFLAG_INVALID;
-            return 1;
-        }
-
-        if (reason) {
-            rev->reason = ASN1_ENUMERATED_get(reason);
-            ASN1_ENUMERATED_free(reason);
-        } else
-            rev->reason = CRL_REASON_NONE;
-
-        /* Check for critical CRL entry extensions */
-
-        exts = rev->extensions;
-
-        for (k = 0; k < sk_X509_EXTENSION_num(exts); k++) {
-            ext = sk_X509_EXTENSION_value(exts, k);
-            if (X509_EXTENSION_get_critical(ext)) {
-              if (OBJ_obj2nid(X509_EXTENSION_get_object(ext)) ==
-                  NID_certificate_issuer)
-                continue;
-              crl->flags |= EXFLAG_CRITICAL;
-              break;
-            }
-        }
-
+  gens = NULL;
+  for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
+    X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i);
+    STACK_OF(X509_EXTENSION) *exts;
+    ASN1_ENUMERATED *reason;
+    X509_EXTENSION *ext;
+    gtmp = X509_REVOKED_get_ext_d2i(rev, NID_certificate_issuer, &j, NULL);
+    if (!gtmp && (j != -1)) {
+      crl->flags |= EXFLAG_INVALID;
+      return 1;
     }
 
-    return 1;
+    if (gtmp) {
+      gens = gtmp;
+      if (!crl->issuers) {
+        crl->issuers = sk_GENERAL_NAMES_new_null();
+        if (!crl->issuers) {
+          return 0;
+        }
+      }
+      if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp)) {
+        return 0;
+      }
+    }
+    rev->issuer = gens;
 
+    reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL);
+    if (!reason && (j != -1)) {
+      crl->flags |= EXFLAG_INVALID;
+      return 1;
+    }
+
+    if (reason) {
+      rev->reason = ASN1_ENUMERATED_get(reason);
+      ASN1_ENUMERATED_free(reason);
+    } else {
+      rev->reason = CRL_REASON_NONE;
+    }
+
+    // Check for critical CRL entry extensions
+
+    exts = rev->extensions;
+
+    for (k = 0; k < sk_X509_EXTENSION_num(exts); k++) {
+      ext = sk_X509_EXTENSION_value(exts, k);
+      if (X509_EXTENSION_get_critical(ext)) {
+        if (OBJ_obj2nid(X509_EXTENSION_get_object(ext)) ==
+            NID_certificate_issuer) {
+          continue;
+        }
+        crl->flags |= EXFLAG_CRITICAL;
+        break;
+      }
+    }
+  }
+
+  return 1;
 }
 
-/*
- * The X509_CRL structure needs a bit of customisation. Cache some extensions
- * and hash of the whole CRL.
- */
+// The X509_CRL structure needs a bit of customisation. Cache some extensions
+// and hash of the whole CRL.
 static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                  void *exarg)
-{
-    X509_CRL *crl = (X509_CRL *)*pval;
-    STACK_OF(X509_EXTENSION) *exts;
-    X509_EXTENSION *ext;
-    size_t idx;
-    int i;
+                  void *exarg) {
+  X509_CRL *crl = (X509_CRL *)*pval;
+  STACK_OF(X509_EXTENSION) *exts;
+  X509_EXTENSION *ext;
+  size_t idx;
+  int i;
 
-    switch (operation) {
+  switch (operation) {
     case ASN1_OP_NEW_POST:
-        crl->idp = NULL;
-        crl->akid = NULL;
-        crl->flags = 0;
-        crl->idp_flags = 0;
-        crl->idp_reasons = CRLDP_ALL_REASONS;
-        crl->meth = default_crl_method;
-        crl->meth_data = NULL;
-        crl->issuers = NULL;
-        crl->crl_number = NULL;
-        crl->base_crl_number = NULL;
-        break;
+      crl->idp = NULL;
+      crl->akid = NULL;
+      crl->flags = 0;
+      crl->idp_flags = 0;
+      crl->idp_reasons = CRLDP_ALL_REASONS;
+      crl->issuers = NULL;
+      crl->crl_number = NULL;
+      crl->base_crl_number = NULL;
+      break;
 
-    case ASN1_OP_D2I_POST:
-        if (!X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL)) {
-            return 0;
+    case ASN1_OP_D2I_POST: {
+      // The version must be one of v1(0) or v2(1).
+      long version = X509_CRL_VERSION_1;
+      if (crl->crl->version != NULL) {
+        version = ASN1_INTEGER_get(crl->crl->version);
+        // TODO(https://crbug.com/boringssl/364): |X509_CRL_VERSION_1|
+        // should also be rejected. This means an explicitly-encoded X.509v1
+        // version. v1 is DEFAULT, so DER requires it be omitted.
+        if (version < X509_CRL_VERSION_1 || version > X509_CRL_VERSION_2) {
+          OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+          return 0;
         }
+      }
 
-        crl->idp = X509_CRL_get_ext_d2i(crl,
-                                        NID_issuing_distribution_point, &i,
-                                        NULL);
-        if (crl->idp != NULL) {
-            if (!setup_idp(crl, crl->idp)) {
-                return 0;
-            }
-        } else if (i != -1) {
-            return 0;
+      // Per RFC 5280, section 5.1.2.1, extensions require v2.
+      if (version != X509_CRL_VERSION_2 && crl->crl->extensions != NULL) {
+        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
+        return 0;
+      }
+
+      if (!X509_CRL_digest(crl, EVP_sha256(), crl->crl_hash, NULL)) {
+        return 0;
+      }
+
+      crl->idp =
+          X509_CRL_get_ext_d2i(crl, NID_issuing_distribution_point, &i, NULL);
+      if (crl->idp != NULL) {
+        if (!setup_idp(crl, crl->idp)) {
+          return 0;
         }
+      } else if (i != -1) {
+        return 0;
+      }
 
-        crl->akid = X509_CRL_get_ext_d2i(crl,
-                                         NID_authority_key_identifier, &i,
-                                         NULL);
-        if (crl->akid == NULL && i != -1) {
-            return 0;
+      crl->akid =
+          X509_CRL_get_ext_d2i(crl, NID_authority_key_identifier, &i, NULL);
+      if (crl->akid == NULL && i != -1) {
+        return 0;
+      }
+
+      crl->crl_number = X509_CRL_get_ext_d2i(crl, NID_crl_number, &i, NULL);
+      if (crl->crl_number == NULL && i != -1) {
+        return 0;
+      }
+
+      crl->base_crl_number = X509_CRL_get_ext_d2i(crl, NID_delta_crl, &i, NULL);
+      if (crl->base_crl_number == NULL && i != -1) {
+        return 0;
+      }
+      // Delta CRLs must have CRL number
+      if (crl->base_crl_number && !crl->crl_number) {
+        OPENSSL_PUT_ERROR(X509, X509_R_DELTA_CRL_WITHOUT_CRL_NUMBER);
+        return 0;
+      }
+
+      // See if we have any unhandled critical CRL extensions and indicate
+      // this in a flag. We only currently handle IDP so anything else
+      // critical sets the flag. This code accesses the X509_CRL structure
+      // directly: applications shouldn't do this.
+
+      exts = crl->crl->extensions;
+
+      for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
+        int nid;
+        ext = sk_X509_EXTENSION_value(exts, idx);
+        nid = OBJ_obj2nid(X509_EXTENSION_get_object(ext));
+        if (nid == NID_freshest_crl) {
+          crl->flags |= EXFLAG_FRESHEST;
         }
-
-        crl->crl_number = X509_CRL_get_ext_d2i(crl,
-                                               NID_crl_number, &i, NULL);
-        if (crl->crl_number == NULL && i != -1) {
-            return 0;
+        if (X509_EXTENSION_get_critical(ext)) {
+          // We handle IDP and deltas
+          if ((nid == NID_issuing_distribution_point) ||
+              (nid == NID_authority_key_identifier) || (nid == NID_delta_crl)) {
+            continue;
+          }
+          crl->flags |= EXFLAG_CRITICAL;
+          break;
         }
+      }
 
-        crl->base_crl_number = X509_CRL_get_ext_d2i(crl, NID_delta_crl, &i,
-                                                    NULL);
-        if (crl->base_crl_number == NULL && i != -1) {
-            return 0;
-        }
-        /* Delta CRLs must have CRL number */
-        if (crl->base_crl_number && !crl->crl_number) {
-            OPENSSL_PUT_ERROR(X509, X509_R_DELTA_CRL_WITHOUT_CRL_NUMBER);
-            return 0;
-        }
+      if (!crl_set_issuers(crl)) {
+        return 0;
+      }
 
-        /*
-         * See if we have any unhandled critical CRL extensions and indicate
-         * this in a flag. We only currently handle IDP so anything else
-         * critical sets the flag. This code accesses the X509_CRL structure
-         * directly: applications shouldn't do this.
-         */
-
-        exts = crl->crl->extensions;
-
-        for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
-            int nid;
-            ext = sk_X509_EXTENSION_value(exts, idx);
-            nid = OBJ_obj2nid(X509_EXTENSION_get_object(ext));
-            if (nid == NID_freshest_crl)
-                crl->flags |= EXFLAG_FRESHEST;
-            if (X509_EXTENSION_get_critical(ext)) {
-                /* We handle IDP and deltas */
-                if ((nid == NID_issuing_distribution_point)
-                    || (nid == NID_authority_key_identifier)
-                    || (nid == NID_delta_crl))
-                    continue;
-                crl->flags |= EXFLAG_CRITICAL;
-                break;
-            }
-        }
-
-        if (!crl_set_issuers(crl))
-            return 0;
-
-        if (crl->meth->crl_init) {
-            if (crl->meth->crl_init(crl) == 0)
-                return 0;
-        }
-        break;
+      break;
+    }
 
     case ASN1_OP_FREE_POST:
-        /* |crl->meth| may be NULL if constructing the object failed before
-         * |ASN1_OP_NEW_POST| was run. */
-        if (crl->meth && crl->meth->crl_free) {
-            if (!crl->meth->crl_free(crl))
-                return 0;
-        }
-        if (crl->akid)
-            AUTHORITY_KEYID_free(crl->akid);
-        if (crl->idp)
-            ISSUING_DIST_POINT_free(crl->idp);
-        ASN1_INTEGER_free(crl->crl_number);
-        ASN1_INTEGER_free(crl->base_crl_number);
-        sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);
-        break;
-    }
-    return 1;
+      AUTHORITY_KEYID_free(crl->akid);
+      ISSUING_DIST_POINT_free(crl->idp);
+      ASN1_INTEGER_free(crl->crl_number);
+      ASN1_INTEGER_free(crl->base_crl_number);
+      sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);
+      break;
+  }
+  return 1;
 }
 
-/* Convert IDP into a more convenient form */
+// Convert IDP into a more convenient form
 
-static int setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)
-{
-    int idp_only = 0;
-    /* Set various flags according to IDP */
-    crl->idp_flags |= IDP_PRESENT;
-    if (idp->onlyuser > 0) {
-        idp_only++;
-        crl->idp_flags |= IDP_ONLYUSER;
+static int setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp) {
+  int idp_only = 0;
+  // Set various flags according to IDP
+  crl->idp_flags |= IDP_PRESENT;
+  if (idp->onlyuser > 0) {
+    idp_only++;
+    crl->idp_flags |= IDP_ONLYUSER;
+  }
+  if (idp->onlyCA > 0) {
+    idp_only++;
+    crl->idp_flags |= IDP_ONLYCA;
+  }
+  if (idp->onlyattr > 0) {
+    idp_only++;
+    crl->idp_flags |= IDP_ONLYATTR;
+  }
+
+  if (idp_only > 1) {
+    crl->idp_flags |= IDP_INVALID;
+  }
+
+  if (idp->indirectCRL > 0) {
+    crl->idp_flags |= IDP_INDIRECT;
+  }
+
+  if (idp->onlysomereasons) {
+    crl->idp_flags |= IDP_REASONS;
+    if (idp->onlysomereasons->length > 0) {
+      crl->idp_reasons = idp->onlysomereasons->data[0];
     }
-    if (idp->onlyCA > 0) {
-        idp_only++;
-        crl->idp_flags |= IDP_ONLYCA;
+    if (idp->onlysomereasons->length > 1) {
+      crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
     }
-    if (idp->onlyattr > 0) {
-        idp_only++;
-        crl->idp_flags |= IDP_ONLYATTR;
-    }
+    crl->idp_reasons &= CRLDP_ALL_REASONS;
+  }
 
-    if (idp_only > 1)
-        crl->idp_flags |= IDP_INVALID;
-
-    if (idp->indirectCRL > 0)
-        crl->idp_flags |= IDP_INDIRECT;
-
-    if (idp->onlysomereasons) {
-        crl->idp_flags |= IDP_REASONS;
-        if (idp->onlysomereasons->length > 0)
-            crl->idp_reasons = idp->onlysomereasons->data[0];
-        if (idp->onlysomereasons->length > 1)
-            crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
-        crl->idp_reasons &= CRLDP_ALL_REASONS;
-    }
-
-    return DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));
+  return DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));
 }
 
 ASN1_SEQUENCE_ref(X509_CRL, crl_cb) = {
-        ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO),
-        ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR),
-        ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING)
+    ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO),
+    ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR),
+    ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING),
 } ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED)
-
-IMPLEMENT_ASN1_DUP_FUNCTION(X509_REVOKED)
+// Although |X509_REVOKED| contains an |X509_NAME|, it can be const. It is not
+// affected by https://crbug.com/boringssl/407 because the  |X509_NAME| does
+// not participate in serialization.
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_REVOKED)
+IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_REVOKED)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO)
 IMPLEMENT_ASN1_FUNCTIONS(X509_CRL)
 IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL)
 
-static int X509_REVOKED_cmp(const X509_REVOKED **a, const X509_REVOKED **b)
-{
-    return ASN1_STRING_cmp((*a)->serialNumber, (*b)->serialNumber);
+static int X509_REVOKED_cmp(const X509_REVOKED **a, const X509_REVOKED **b) {
+  return ASN1_STRING_cmp((*a)->serialNumber, (*b)->serialNumber);
 }
 
-int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
-{
-    X509_CRL_INFO *inf;
-    inf = crl->crl;
-    if (!inf->revoked)
-        inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
-    if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
-    inf->enc.modified = 1;
-    return 1;
-}
-
-int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey)
-{
-    if (crl->meth->crl_verify)
-        return crl->meth->crl_verify(crl, pkey);
+int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev) {
+  X509_CRL_INFO *inf;
+  inf = crl->crl;
+  if (!inf->revoked) {
+    inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
+  }
+  if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
     return 0;
+  }
+  inf->enc.modified = 1;
+  return 1;
 }
 
-int X509_CRL_get0_by_serial(X509_CRL *crl,
-                            X509_REVOKED **ret, ASN1_INTEGER *serial)
-{
-    if (crl->meth->crl_lookup)
-        return crl->meth->crl_lookup(crl, ret, serial, NULL);
+int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey) {
+  if (X509_ALGOR_cmp(crl->sig_alg, crl->crl->sig_alg) != 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH);
     return 0;
+  }
+
+  return ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO), crl->sig_alg,
+                          crl->signature, crl->crl, pkey);
 }
 
-int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x)
-{
-    if (crl->meth->crl_lookup)
-        return crl->meth->crl_lookup(crl, ret,
-                                     X509_get_serialNumber(x),
-                                     X509_get_issuer_name(x));
-    return 0;
+int X509_CRL_get0_by_serial(X509_CRL *crl, X509_REVOKED **ret,
+                            ASN1_INTEGER *serial) {
+  return crl_lookup(crl, ret, serial, NULL);
 }
 
-static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r)
-{
-    if (X509_ALGOR_cmp(crl->sig_alg, crl->crl->sig_alg) != 0) {
-        OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH);
-        return 0;
-    }
-
-    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO),
-                             crl->sig_alg, crl->signature, crl->crl, r));
+int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x) {
+  return crl_lookup(crl, ret, X509_get_serialNumber(x),
+                    X509_get_issuer_name(x));
 }
 
 static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm,
-                                    X509_REVOKED *rev)
-{
-    size_t i;
+                                    X509_REVOKED *rev) {
+  size_t i;
 
-    if (!rev->issuer) {
-        if (!nm)
-            return 1;
-        if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
-            return 1;
-        return 0;
+  if (!rev->issuer) {
+    if (!nm) {
+      return 1;
     }
-
-    if (!nm)
-        nm = X509_CRL_get_issuer(crl);
-
-    for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);
-        if (gen->type != GEN_DIRNAME)
-            continue;
-        if (!X509_NAME_cmp(nm, gen->d.directoryName))
-            return 1;
+    if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl))) {
+      return 1;
     }
     return 0;
+  }
 
+  if (!nm) {
+    nm = X509_CRL_get_issuer(crl);
+  }
+
+  for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);
+    if (gen->type != GEN_DIRNAME) {
+      continue;
+    }
+    if (!X509_NAME_cmp(nm, gen->d.directoryName)) {
+      return 1;
+    }
+  }
+  return 0;
 }
 
 static struct CRYPTO_STATIC_MUTEX g_crl_sort_lock = CRYPTO_STATIC_MUTEX_INIT;
 
-static int def_crl_lookup(X509_CRL *crl,
-                          X509_REVOKED **ret, ASN1_INTEGER *serial,
-                          X509_NAME *issuer)
-{
-    X509_REVOKED rtmp, *rev;
-    size_t idx;
-    rtmp.serialNumber = serial;
-    /*
-     * Sort revoked into serial number order if not already sorted. Do this
-     * under a lock to avoid race condition.
-     */
+static int crl_lookup(X509_CRL *crl, X509_REVOKED **ret, ASN1_INTEGER *serial,
+                      X509_NAME *issuer) {
+  // Use an assert, rather than a runtime error, because returning nothing for a
+  // CRL is arguably failing open, rather than closed.
+  assert(serial->type == V_ASN1_INTEGER || serial->type == V_ASN1_NEG_INTEGER);
+  X509_REVOKED rtmp, *rev;
+  size_t idx;
+  rtmp.serialNumber = serial;
+  // Sort revoked into serial number order if not already sorted. Do this
+  // under a lock to avoid race condition.
 
-    CRYPTO_STATIC_MUTEX_lock_read(&g_crl_sort_lock);
-    const int is_sorted = sk_X509_REVOKED_is_sorted(crl->crl->revoked);
-    CRYPTO_STATIC_MUTEX_unlock_read(&g_crl_sort_lock);
+  CRYPTO_STATIC_MUTEX_lock_read(&g_crl_sort_lock);
+  const int is_sorted = sk_X509_REVOKED_is_sorted(crl->crl->revoked);
+  CRYPTO_STATIC_MUTEX_unlock_read(&g_crl_sort_lock);
 
-    if (!is_sorted) {
-        CRYPTO_STATIC_MUTEX_lock_write(&g_crl_sort_lock);
-        if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) {
-            sk_X509_REVOKED_sort(crl->crl->revoked);
-        }
-        CRYPTO_STATIC_MUTEX_unlock_write(&g_crl_sort_lock);
+  if (!is_sorted) {
+    CRYPTO_STATIC_MUTEX_lock_write(&g_crl_sort_lock);
+    if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked)) {
+      sk_X509_REVOKED_sort(crl->crl->revoked);
     }
+    CRYPTO_STATIC_MUTEX_unlock_write(&g_crl_sort_lock);
+  }
 
-    if (!sk_X509_REVOKED_find(crl->crl->revoked, &idx, &rtmp))
-        return 0;
-    /* Need to look for matching name */
-    for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
-        rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);
-        if (ASN1_INTEGER_cmp(rev->serialNumber, serial))
-            return 0;
-        if (crl_revoked_issuer_match(crl, issuer, rev)) {
-            if (ret)
-                *ret = rev;
-            if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
-                return 2;
-            return 1;
-        }
-    }
+  if (!sk_X509_REVOKED_find(crl->crl->revoked, &idx, &rtmp)) {
     return 0;
-}
-
-void X509_CRL_set_default_method(const X509_CRL_METHOD *meth)
-{
-    if (meth == NULL)
-        default_crl_method = &int_crl_meth;
-    else
-        default_crl_method = meth;
-}
-
-X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl),
-                                     int (*crl_free) (X509_CRL *crl),
-                                     int (*crl_lookup) (X509_CRL *crl,
-                                                        X509_REVOKED **ret,
-                                                        ASN1_INTEGER *ser,
-                                                        X509_NAME *issuer),
-                                     int (*crl_verify) (X509_CRL *crl,
-                                                        EVP_PKEY *pk))
-{
-    X509_CRL_METHOD *m;
-    m = OPENSSL_malloc(sizeof(X509_CRL_METHOD));
-    if (!m)
-        return NULL;
-    m->crl_init = crl_init;
-    m->crl_free = crl_free;
-    m->crl_lookup = crl_lookup;
-    m->crl_verify = crl_verify;
-    m->flags = X509_CRL_METHOD_DYNAMIC;
-    return m;
-}
-
-void X509_CRL_METHOD_free(X509_CRL_METHOD *m)
-{
-    if (!(m->flags & X509_CRL_METHOD_DYNAMIC))
-        return;
-    OPENSSL_free(m);
-}
-
-void X509_CRL_set_meth_data(X509_CRL *crl, void *dat)
-{
-    crl->meth_data = dat;
-}
-
-void *X509_CRL_get_meth_data(X509_CRL *crl)
-{
-    return crl->meth_data;
+  }
+  // Need to look for matching name
+  for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
+    rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);
+    if (ASN1_INTEGER_cmp(rev->serialNumber, serial)) {
+      return 0;
+    }
+    if (crl_revoked_issuer_match(crl, issuer, rev)) {
+      if (ret) {
+        *ret = rev;
+      }
+      if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) {
+        return 2;
+      }
+      return 1;
+    }
+  }
+  return 0;
 }
diff --git a/src/crypto/x509/x_exten.c b/src/crypto/x509/x_exten.c
index 89998ca..e181d98 100644
--- a/src/crypto/x509/x_exten.c
+++ b/src/crypto/x509/x_exten.c
@@ -63,15 +63,16 @@
 
 
 ASN1_SEQUENCE(X509_EXTENSION) = {
-        ASN1_SIMPLE(X509_EXTENSION, object, ASN1_OBJECT),
-        ASN1_OPT(X509_EXTENSION, critical, ASN1_BOOLEAN),
-        ASN1_SIMPLE(X509_EXTENSION, value, ASN1_OCTET_STRING)
+    ASN1_SIMPLE(X509_EXTENSION, object, ASN1_OBJECT),
+    ASN1_OPT(X509_EXTENSION, critical, ASN1_BOOLEAN),
+    ASN1_SIMPLE(X509_EXTENSION, value, ASN1_OCTET_STRING),
 } ASN1_SEQUENCE_END(X509_EXTENSION)
 
 ASN1_ITEM_TEMPLATE(X509_EXTENSIONS) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Extension, X509_EXTENSION)
+    ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Extension, X509_EXTENSION)
 ASN1_ITEM_TEMPLATE_END(X509_EXTENSIONS)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_EXTENSION)
-IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)
-IMPLEMENT_ASN1_DUP_FUNCTION(X509_EXTENSION)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_EXTENSION)
+IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(X509_EXTENSIONS, X509_EXTENSIONS,
+                                            X509_EXTENSIONS)
+IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_EXTENSION)
diff --git a/src/crypto/x509/x_info.c b/src/crypto/x509/x_info.c
index 177cd0e..e6f9be2 100644
--- a/src/crypto/x509/x_info.c
+++ b/src/crypto/x509/x_info.c
@@ -61,38 +61,41 @@
 #include <openssl/mem.h>
 #include <openssl/thread.h>
 
-X509_INFO *X509_INFO_new(void)
-{
-    X509_INFO *ret = NULL;
+X509_INFO *X509_INFO_new(void) {
+  X509_INFO *ret = NULL;
 
-    ret = (X509_INFO *)OPENSSL_malloc(sizeof(X509_INFO));
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        return (NULL);
-    }
+  ret = (X509_INFO *)OPENSSL_malloc(sizeof(X509_INFO));
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
 
-    ret->enc_cipher.cipher = NULL;
-    ret->enc_len = 0;
-    ret->enc_data = NULL;
+  ret->enc_cipher.cipher = NULL;
+  ret->enc_len = 0;
+  ret->enc_data = NULL;
 
-    ret->x509 = NULL;
-    ret->crl = NULL;
-    ret->x_pkey = NULL;
-    return (ret);
+  ret->x509 = NULL;
+  ret->crl = NULL;
+  ret->x_pkey = NULL;
+  return ret;
 }
 
-void X509_INFO_free(X509_INFO *x)
-{
-    if (x == NULL)
-        return;
+void X509_INFO_free(X509_INFO *x) {
+  if (x == NULL) {
+    return;
+  }
 
-    if (x->x509 != NULL)
-        X509_free(x->x509);
-    if (x->crl != NULL)
-        X509_CRL_free(x->crl);
-    if (x->x_pkey != NULL)
-        X509_PKEY_free(x->x_pkey);
-    if (x->enc_data != NULL)
-        OPENSSL_free(x->enc_data);
-    OPENSSL_free(x);
+  if (x->x509 != NULL) {
+    X509_free(x->x509);
+  }
+  if (x->crl != NULL) {
+    X509_CRL_free(x->crl);
+  }
+  if (x->x_pkey != NULL) {
+    X509_PKEY_free(x->x_pkey);
+  }
+  if (x->enc_data != NULL) {
+    OPENSSL_free(x->enc_data);
+  }
+  OPENSSL_free(x);
 }
diff --git a/src/crypto/x509/x_name.c b/src/crypto/x509/x_name.c
index 4fea082..a17d9d7 100644
--- a/src/crypto/x509/x_name.c
+++ b/src/crypto/x509/x_name.c
@@ -74,17 +74,14 @@
 typedef STACK_OF(X509_NAME_ENTRY) STACK_OF_X509_NAME_ENTRY;
 DEFINE_STACK_OF(STACK_OF_X509_NAME_ENTRY)
 
-/*
- * Maximum length of X509_NAME: much larger than anything we should
- * ever see in practice.
- */
+// Maximum length of X509_NAME: much larger than anything we should
+// ever see in practice.
 
 #define X509_NAME_MAX (1024 * 1024)
 
-static int x509_name_ex_d2i(ASN1_VALUE **val,
-                            const unsigned char **in, long len,
-                            const ASN1_ITEM *it,
-                            int tag, int aclass, char opt, ASN1_TLC *ctx);
+static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in,
+                            long len, const ASN1_ITEM *it, int tag, int aclass,
+                            char opt, ASN1_TLC *ctx);
 
 static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out,
                             const ASN1_ITEM *it, int tag, int aclass);
@@ -94,42 +91,39 @@
 static int x509_name_encode(X509_NAME *a);
 static int x509_name_canon(X509_NAME *a);
 static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in);
-static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) * intname,
+static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname,
                           unsigned char **in);
 
 ASN1_SEQUENCE(X509_NAME_ENTRY) = {
-        ASN1_SIMPLE(X509_NAME_ENTRY, object, ASN1_OBJECT),
-        ASN1_SIMPLE(X509_NAME_ENTRY, value, ASN1_PRINTABLE)
+    ASN1_SIMPLE(X509_NAME_ENTRY, object, ASN1_OBJECT),
+    ASN1_SIMPLE(X509_NAME_ENTRY, value, ASN1_PRINTABLE),
 } ASN1_SEQUENCE_END(X509_NAME_ENTRY)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_NAME_ENTRY)
-IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME_ENTRY)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_NAME_ENTRY)
+IMPLEMENT_ASN1_DUP_FUNCTION_const(X509_NAME_ENTRY)
 
-/*
- * For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
- * declare two template wrappers for this
- */
+// For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
+// declare two template wrappers for this
 
-ASN1_ITEM_TEMPLATE(X509_NAME_ENTRIES) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0, RDNS, X509_NAME_ENTRY)
+ASN1_ITEM_TEMPLATE(X509_NAME_ENTRIES) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF,
+                                                              0, RDNS,
+                                                              X509_NAME_ENTRY)
 ASN1_ITEM_TEMPLATE_END(X509_NAME_ENTRIES)
 
 ASN1_ITEM_TEMPLATE(X509_NAME_INTERNAL) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Name, X509_NAME_ENTRIES)
+    ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Name, X509_NAME_ENTRIES)
 ASN1_ITEM_TEMPLATE_END(X509_NAME_INTERNAL)
 
-/*
- * Normally that's where it would end: we'd have two nested STACK structures
- * representing the ASN1. Unfortunately X509_NAME uses a completely different
- * form and caches encodings so we have to process the internal form and
- * convert to the external form.
- */
+// Normally that's where it would end: we'd have two nested STACK structures
+// representing the ASN1. Unfortunately X509_NAME uses a completely different
+// form and caches encodings so we have to process the internal form and
+// convert to the external form.
 
 static const ASN1_EXTERN_FUNCS x509_name_ff = {
     NULL,
     x509_name_ex_new,
     x509_name_ex_free,
-    0,                          /* Default clear behaviour is OK */
+    0,  // Default clear behaviour is OK
     x509_name_ex_d2i,
     x509_name_ex_i2d,
     NULL,
@@ -141,404 +135,406 @@
 
 IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME)
 
-static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it)
-{
-    X509_NAME *ret = NULL;
-    ret = OPENSSL_malloc(sizeof(X509_NAME));
-    if (!ret)
-        goto memerr;
-    if ((ret->entries = sk_X509_NAME_ENTRY_new_null()) == NULL)
-        goto memerr;
-    if ((ret->bytes = BUF_MEM_new()) == NULL)
-        goto memerr;
-    ret->canon_enc = NULL;
-    ret->canon_enclen = 0;
-    ret->modified = 1;
-    *val = (ASN1_VALUE *)ret;
-    return 1;
+static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it) {
+  X509_NAME *ret = NULL;
+  ret = OPENSSL_malloc(sizeof(X509_NAME));
+  if (!ret) {
+    goto memerr;
+  }
+  if ((ret->entries = sk_X509_NAME_ENTRY_new_null()) == NULL) {
+    goto memerr;
+  }
+  if ((ret->bytes = BUF_MEM_new()) == NULL) {
+    goto memerr;
+  }
+  ret->canon_enc = NULL;
+  ret->canon_enclen = 0;
+  ret->modified = 1;
+  *val = (ASN1_VALUE *)ret;
+  return 1;
 
- memerr:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    if (ret) {
-        if (ret->entries)
-            sk_X509_NAME_ENTRY_free(ret->entries);
-        OPENSSL_free(ret);
+memerr:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+  if (ret) {
+    if (ret->entries) {
+      sk_X509_NAME_ENTRY_free(ret->entries);
     }
-    return 0;
+    OPENSSL_free(ret);
+  }
+  return 0;
 }
 
-static void x509_name_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
-{
-    X509_NAME *a;
-    if (!pval || !*pval)
-        return;
-    a = (X509_NAME *)*pval;
+static void x509_name_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) {
+  X509_NAME *a;
+  if (!pval || !*pval) {
+    return;
+  }
+  a = (X509_NAME *)*pval;
 
-    BUF_MEM_free(a->bytes);
-    sk_X509_NAME_ENTRY_pop_free(a->entries, X509_NAME_ENTRY_free);
-    if (a->canon_enc)
-        OPENSSL_free(a->canon_enc);
-    OPENSSL_free(a);
-    *pval = NULL;
+  BUF_MEM_free(a->bytes);
+  sk_X509_NAME_ENTRY_pop_free(a->entries, X509_NAME_ENTRY_free);
+  if (a->canon_enc) {
+    OPENSSL_free(a->canon_enc);
+  }
+  OPENSSL_free(a);
+  *pval = NULL;
 }
 
-static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne)
-{
-    sk_X509_NAME_ENTRY_free(ne);
+static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne) {
+  sk_X509_NAME_ENTRY_free(ne);
 }
 
-static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne)
-{
-    sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
+static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne) {
+  sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
 }
 
-static int x509_name_ex_d2i(ASN1_VALUE **val,
-                            const unsigned char **in, long len,
-                            const ASN1_ITEM *it, int tag, int aclass,
-                            char opt, ASN1_TLC *ctx)
-{
-    const unsigned char *p = *in, *q;
-    STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
-    X509_NAME *nm = NULL;
-    size_t i, j;
-    int ret;
-    STACK_OF(X509_NAME_ENTRY) *entries;
-    X509_NAME_ENTRY *entry;
-    /* Bound the size of an X509_NAME we are willing to parse. */
-    if (len > X509_NAME_MAX) {
-        len = X509_NAME_MAX;
-    }
-    q = p;
+static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in,
+                            long len, const ASN1_ITEM *it, int tag, int aclass,
+                            char opt, ASN1_TLC *ctx) {
+  const unsigned char *p = *in, *q;
+  STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
+  X509_NAME *nm = NULL;
+  size_t i, j;
+  int ret;
+  STACK_OF(X509_NAME_ENTRY) *entries;
+  X509_NAME_ENTRY *entry;
+  // Bound the size of an X509_NAME we are willing to parse.
+  if (len > X509_NAME_MAX) {
+    len = X509_NAME_MAX;
+  }
+  q = p;
 
-    /* Get internal representation of Name */
-    ASN1_VALUE *intname_val = NULL;
-    ret = ASN1_item_ex_d2i(&intname_val,
-                           &p, len, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
-                           tag, aclass, opt, ctx);
-    if (ret <= 0)
-        return ret;
-    intname = (STACK_OF(STACK_OF_X509_NAME_ENTRY) *)intname_val;
-
-    if (*val)
-        x509_name_ex_free(val, NULL);
-    ASN1_VALUE *nm_val = NULL;
-    if (!x509_name_ex_new(&nm_val, NULL))
-        goto err;
-    nm = (X509_NAME *)nm_val;
-    /* We've decoded it: now cache encoding */
-    if (!BUF_MEM_grow(nm->bytes, p - q))
-        goto err;
-    OPENSSL_memcpy(nm->bytes->data, q, p - q);
-
-    /* Convert internal representation to X509_NAME structure */
-    for (i = 0; i < sk_STACK_OF_X509_NAME_ENTRY_num(intname); i++) {
-        entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname, i);
-        for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) {
-            entry = sk_X509_NAME_ENTRY_value(entries, j);
-            entry->set = i;
-            if (!sk_X509_NAME_ENTRY_push(nm->entries, entry))
-                goto err;
-            (void)sk_X509_NAME_ENTRY_set(entries, j, NULL);
-        }
-    }
-    ret = x509_name_canon(nm);
-    if (!ret)
-        goto err;
-    sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
-                                         local_sk_X509_NAME_ENTRY_free);
-    nm->modified = 0;
-    *val = (ASN1_VALUE *)nm;
-    *in = p;
+  // Get internal representation of Name
+  ASN1_VALUE *intname_val = NULL;
+  ret = ASN1_item_ex_d2i(&intname_val, &p, len,
+                         ASN1_ITEM_rptr(X509_NAME_INTERNAL), tag, aclass, opt,
+                         ctx);
+  if (ret <= 0) {
     return ret;
- err:
-    X509_NAME_free(nm);
-    sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
-                                         local_sk_X509_NAME_ENTRY_pop_free);
-    OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
-    return 0;
+  }
+  intname = (STACK_OF(STACK_OF_X509_NAME_ENTRY) *)intname_val;
+
+  if (*val) {
+    x509_name_ex_free(val, NULL);
+  }
+  ASN1_VALUE *nm_val = NULL;
+  if (!x509_name_ex_new(&nm_val, NULL)) {
+    goto err;
+  }
+  nm = (X509_NAME *)nm_val;
+  // We've decoded it: now cache encoding
+  if (!BUF_MEM_grow(nm->bytes, p - q)) {
+    goto err;
+  }
+  OPENSSL_memcpy(nm->bytes->data, q, p - q);
+
+  // Convert internal representation to X509_NAME structure
+  for (i = 0; i < sk_STACK_OF_X509_NAME_ENTRY_num(intname); i++) {
+    entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname, i);
+    for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) {
+      entry = sk_X509_NAME_ENTRY_value(entries, j);
+      entry->set = i;
+      if (!sk_X509_NAME_ENTRY_push(nm->entries, entry)) {
+        goto err;
+      }
+      (void)sk_X509_NAME_ENTRY_set(entries, j, NULL);
+    }
+  }
+  ret = x509_name_canon(nm);
+  if (!ret) {
+    goto err;
+  }
+  sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free);
+  nm->modified = 0;
+  *val = (ASN1_VALUE *)nm;
+  *in = p;
+  return ret;
+err:
+  X509_NAME_free(nm);
+  sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
+                                       local_sk_X509_NAME_ENTRY_pop_free);
+  OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
+  return 0;
 }
 
 static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out,
-                            const ASN1_ITEM *it, int tag, int aclass)
-{
-    X509_NAME *a = (X509_NAME *)*val;
-    if (a->modified &&
-        (!x509_name_encode(a) ||
-         !x509_name_canon(a))) {
-        return -1;
-    }
-    int ret = a->bytes->length;
-    if (out != NULL) {
-        OPENSSL_memcpy(*out, a->bytes->data, ret);
-        *out += ret;
-    }
-    return ret;
+                            const ASN1_ITEM *it, int tag, int aclass) {
+  X509_NAME *a = (X509_NAME *)*val;
+  if (a->modified && (!x509_name_encode(a) || !x509_name_canon(a))) {
+    return -1;
+  }
+  int ret = a->bytes->length;
+  if (out != NULL) {
+    OPENSSL_memcpy(*out, a->bytes->data, ret);
+    *out += ret;
+  }
+  return ret;
 }
 
-static int x509_name_encode(X509_NAME *a)
-{
-    int len;
-    unsigned char *p;
-    STACK_OF(X509_NAME_ENTRY) *entries = NULL;
-    X509_NAME_ENTRY *entry;
-    int set = -1;
-    size_t i;
-    STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname =
-        sk_STACK_OF_X509_NAME_ENTRY_new_null();
-    if (!intname)
+static int x509_name_encode(X509_NAME *a) {
+  int len;
+  unsigned char *p;
+  STACK_OF(X509_NAME_ENTRY) *entries = NULL;
+  X509_NAME_ENTRY *entry;
+  int set = -1;
+  size_t i;
+  STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname =
+      sk_STACK_OF_X509_NAME_ENTRY_new_null();
+  if (!intname) {
+    goto memerr;
+  }
+  for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
+    entry = sk_X509_NAME_ENTRY_value(a->entries, i);
+    if (entry->set != set) {
+      entries = sk_X509_NAME_ENTRY_new_null();
+      if (!entries) {
         goto memerr;
-    for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
-        entry = sk_X509_NAME_ENTRY_value(a->entries, i);
-        if (entry->set != set) {
-            entries = sk_X509_NAME_ENTRY_new_null();
-            if (!entries)
-                goto memerr;
-            if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) {
-                sk_X509_NAME_ENTRY_free(entries);
-                goto memerr;
-            }
-            set = entry->set;
-        }
-        if (!sk_X509_NAME_ENTRY_push(entries, entry))
-            goto memerr;
+      }
+      if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) {
+        sk_X509_NAME_ENTRY_free(entries);
+        goto memerr;
+      }
+      set = entry->set;
     }
-    ASN1_VALUE *intname_val = (ASN1_VALUE *)intname;
-    len =
-        ASN1_item_ex_i2d(&intname_val, NULL, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
+    if (!sk_X509_NAME_ENTRY_push(entries, entry)) {
+      goto memerr;
+    }
+  }
+  ASN1_VALUE *intname_val = (ASN1_VALUE *)intname;
+  len = ASN1_item_ex_i2d(&intname_val, NULL, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
                          /*tag=*/-1, /*aclass=*/0);
-    if (len <= 0) {
+  if (len <= 0) {
+    goto err;
+  }
+  if (!BUF_MEM_grow(a->bytes, len)) {
+    goto memerr;
+  }
+  p = (unsigned char *)a->bytes->data;
+  if (ASN1_item_ex_i2d(&intname_val, &p, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
+                       /*tag=*/-1, /*aclass=*/0) <= 0) {
+    goto err;
+  }
+  sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free);
+  a->modified = 0;
+  return 1;
+memerr:
+  OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+err:
+  sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free);
+  return 0;
+}
+
+// This function generates the canonical encoding of the Name structure. In
+// it all strings are converted to UTF8, leading, trailing and multiple
+// spaces collapsed, converted to lower case and the leading SEQUENCE header
+// removed. In future we could also normalize the UTF8 too. By doing this
+// comparison of Name structures can be rapidly perfomed by just using
+// OPENSSL_memcmp() of the canonical encoding. By omitting the leading SEQUENCE
+// name constraints of type dirName can also be checked with a simple
+// OPENSSL_memcmp().
+
+static int x509_name_canon(X509_NAME *a) {
+  unsigned char *p;
+  STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
+  STACK_OF(X509_NAME_ENTRY) *entries = NULL;
+  X509_NAME_ENTRY *entry, *tmpentry = NULL;
+  int set = -1, ret = 0, len;
+  size_t i;
+
+  if (a->canon_enc) {
+    OPENSSL_free(a->canon_enc);
+    a->canon_enc = NULL;
+  }
+  // Special case: empty X509_NAME => null encoding
+  if (sk_X509_NAME_ENTRY_num(a->entries) == 0) {
+    a->canon_enclen = 0;
+    return 1;
+  }
+  intname = sk_STACK_OF_X509_NAME_ENTRY_new_null();
+  if (!intname) {
+    goto err;
+  }
+  for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
+    entry = sk_X509_NAME_ENTRY_value(a->entries, i);
+    if (entry->set != set) {
+      entries = sk_X509_NAME_ENTRY_new_null();
+      if (!entries) {
+        goto err;
+      }
+      if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) {
+        sk_X509_NAME_ENTRY_free(entries);
+        goto err;
+      }
+      set = entry->set;
+    }
+    tmpentry = X509_NAME_ENTRY_new();
+    if (tmpentry == NULL) {
       goto err;
     }
-    if (!BUF_MEM_grow(a->bytes, len))
-        goto memerr;
-    p = (unsigned char *)a->bytes->data;
-    if (ASN1_item_ex_i2d(&intname_val, &p, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
-                         /*tag=*/-1, /*aclass=*/0) <= 0) {
-        goto err;
+    tmpentry->object = OBJ_dup(entry->object);
+    if (!asn1_string_canon(tmpentry->value, entry->value)) {
+      goto err;
     }
-    sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
-                                         local_sk_X509_NAME_ENTRY_free);
-    a->modified = 0;
-    return 1;
- memerr:
-    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    if (!sk_X509_NAME_ENTRY_push(entries, tmpentry)) {
+      goto err;
+    }
+    tmpentry = NULL;
+  }
+
+  // Finally generate encoding
+
+  len = i2d_name_canon(intname, NULL);
+  if (len < 0) {
+    goto err;
+  }
+  a->canon_enclen = len;
+
+  p = OPENSSL_malloc(a->canon_enclen);
+
+  if (!p) {
+    goto err;
+  }
+
+  a->canon_enc = p;
+
+  i2d_name_canon(intname, &p);
+
+  ret = 1;
+
 err:
+
+  if (tmpentry) {
+    X509_NAME_ENTRY_free(tmpentry);
+  }
+  if (intname) {
     sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
-                                         local_sk_X509_NAME_ENTRY_free);
+                                         local_sk_X509_NAME_ENTRY_pop_free);
+  }
+  return ret;
+}
+
+// Bitmap of all the types of string that will be canonicalized.
+
+#define ASN1_MASK_CANON                                            \
+  (B_ASN1_UTF8STRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING | \
+   B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING |  \
+   B_ASN1_VISIBLESTRING)
+
+static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) {
+  unsigned char *to, *from;
+  int len, i;
+
+  // If type not in bitmask just copy string across
+  if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) {
+    if (!ASN1_STRING_copy(out, in)) {
+      return 0;
+    }
+    return 1;
+  }
+
+  out->type = V_ASN1_UTF8STRING;
+  out->length = ASN1_STRING_to_UTF8(&out->data, in);
+  if (out->length == -1) {
     return 0;
-}
+  }
 
-/*
- * This function generates the canonical encoding of the Name structure. In
- * it all strings are converted to UTF8, leading, trailing and multiple
- * spaces collapsed, converted to lower case and the leading SEQUENCE header
- * removed. In future we could also normalize the UTF8 too. By doing this
- * comparison of Name structures can be rapidly perfomed by just using
- * OPENSSL_memcmp() of the canonical encoding. By omitting the leading SEQUENCE name
- * constraints of type dirName can also be checked with a simple OPENSSL_memcmp().
- */
+  to = out->data;
+  from = to;
 
-static int x509_name_canon(X509_NAME *a)
-{
-    unsigned char *p;
-    STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
-    STACK_OF(X509_NAME_ENTRY) *entries = NULL;
-    X509_NAME_ENTRY *entry, *tmpentry = NULL;
-    int set = -1, ret = 0, len;
-    size_t i;
+  len = out->length;
 
-    if (a->canon_enc) {
-        OPENSSL_free(a->canon_enc);
-        a->canon_enc = NULL;
+  // Convert string in place to canonical form. Ultimately we may need to
+  // handle a wider range of characters but for now ignore anything with
+  // MSB set and rely on the isspace() and tolower() functions.
+
+  // Ignore leading spaces
+  while ((len > 0) && !(*from & 0x80) && isspace(*from)) {
+    from++;
+    len--;
+  }
+
+  to = from + len;
+
+  // Ignore trailing spaces
+  while ((len > 0) && !(to[-1] & 0x80) && isspace(to[-1])) {
+    to--;
+    len--;
+  }
+
+  to = out->data;
+
+  i = 0;
+  while (i < len) {
+    // If MSB set just copy across
+    if (*from & 0x80) {
+      *to++ = *from++;
+      i++;
     }
-    /* Special case: empty X509_NAME => null encoding */
-    if (sk_X509_NAME_ENTRY_num(a->entries) == 0) {
-        a->canon_enclen = 0;
-        return 1;
-    }
-    intname = sk_STACK_OF_X509_NAME_ENTRY_new_null();
-    if (!intname)
-        goto err;
-    for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
-        entry = sk_X509_NAME_ENTRY_value(a->entries, i);
-        if (entry->set != set) {
-            entries = sk_X509_NAME_ENTRY_new_null();
-            if (!entries)
-                goto err;
-            if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) {
-                sk_X509_NAME_ENTRY_free(entries);
-                goto err;
-            }
-            set = entry->set;
-        }
-        tmpentry = X509_NAME_ENTRY_new();
-        if (tmpentry == NULL)
-            goto err;
-        tmpentry->object = OBJ_dup(entry->object);
-        if (!asn1_string_canon(tmpentry->value, entry->value))
-            goto err;
-        if (!sk_X509_NAME_ENTRY_push(entries, tmpentry))
-            goto err;
-        tmpentry = NULL;
-    }
-
-    /* Finally generate encoding */
-
-    len = i2d_name_canon(intname, NULL);
-    if (len < 0) {
-        goto err;
-    }
-    a->canon_enclen = len;
-
-    p = OPENSSL_malloc(a->canon_enclen);
-
-    if (!p)
-        goto err;
-
-    a->canon_enc = p;
-
-    i2d_name_canon(intname, &p);
-
-    ret = 1;
-
- err:
-
-    if (tmpentry)
-        X509_NAME_ENTRY_free(tmpentry);
-    if (intname)
-        sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
-                                             local_sk_X509_NAME_ENTRY_pop_free);
-    return ret;
-}
-
-/* Bitmap of all the types of string that will be canonicalized. */
-
-#define ASN1_MASK_CANON \
-        (B_ASN1_UTF8STRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING \
-        | B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING \
-        | B_ASN1_VISIBLESTRING)
-
-static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in)
-{
-    unsigned char *to, *from;
-    int len, i;
-
-    /* If type not in bitmask just copy string across */
-    if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) {
-        if (!ASN1_STRING_copy(out, in))
-            return 0;
-        return 1;
-    }
-
-    out->type = V_ASN1_UTF8STRING;
-    out->length = ASN1_STRING_to_UTF8(&out->data, in);
-    if (out->length == -1)
-        return 0;
-
-    to = out->data;
-    from = to;
-
-    len = out->length;
-
-    /*
-     * Convert string in place to canonical form. Ultimately we may need to
-     * handle a wider range of characters but for now ignore anything with
-     * MSB set and rely on the isspace() and tolower() functions.
-     */
-
-    /* Ignore leading spaces */
-    while ((len > 0) && !(*from & 0x80) && isspace(*from)) {
+    // Collapse multiple spaces
+    else if (isspace(*from)) {
+      // Copy one space across
+      *to++ = ' ';
+      // Ignore subsequent spaces. Note: don't need to check len here
+      // because we know the last character is a non-space so we can't
+      // overflow.
+      do {
         from++;
-        len--;
+        i++;
+      } while (!(*from & 0x80) && isspace(*from));
+    } else {
+      *to++ = OPENSSL_tolower(*from);
+      from++;
+      i++;
     }
+  }
 
-    to = from + len;
+  out->length = to - out->data;
 
-    /* Ignore trailing spaces */
-    while ((len > 0) && !(to[-1] & 0x80) && isspace(to[-1])) {
-        to--;
-        len--;
-    }
-
-    to = out->data;
-
-    i = 0;
-    while (i < len) {
-        /* If MSB set just copy across */
-        if (*from & 0x80) {
-            *to++ = *from++;
-            i++;
-        }
-        /* Collapse multiple spaces */
-        else if (isspace(*from)) {
-            /* Copy one space across */
-            *to++ = ' ';
-            /*
-             * Ignore subsequent spaces. Note: don't need to check len here
-             * because we know the last character is a non-space so we can't
-             * overflow.
-             */
-            do {
-                from++;
-                i++;
-            }
-            while (!(*from & 0x80) && isspace(*from));
-        } else {
-            *to++ = OPENSSL_tolower(*from);
-            from++;
-            i++;
-        }
-    }
-
-    out->length = to - out->data;
-
-    return 1;
-
+  return 1;
 }
 
-static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) * _intname,
-                          unsigned char **in)
-{
-    int len, ltmp;
-    size_t i;
-    ASN1_VALUE *v;
-    STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname;
+static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *_intname,
+                          unsigned char **in) {
+  int len, ltmp;
+  size_t i;
+  ASN1_VALUE *v;
+  STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname;
 
-    len = 0;
-    for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) {
-        v = sk_ASN1_VALUE_value(intname, i);
-        ltmp = ASN1_item_ex_i2d(&v, in, ASN1_ITEM_rptr(X509_NAME_ENTRIES),
-                                /*tag=*/-1, /*aclass=*/0);
-        if (ltmp < 0)
-            return ltmp;
-        len += ltmp;
+  len = 0;
+  for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) {
+    v = sk_ASN1_VALUE_value(intname, i);
+    ltmp = ASN1_item_ex_i2d(&v, in, ASN1_ITEM_rptr(X509_NAME_ENTRIES),
+                            /*tag=*/-1, /*aclass=*/0);
+    if (ltmp < 0) {
+      return ltmp;
     }
-    return len;
+    len += ltmp;
+  }
+  return len;
 }
 
-int X509_NAME_set(X509_NAME **xn, X509_NAME *name)
-{
-    if ((name = X509_NAME_dup(name)) == NULL)
-        return 0;
-    X509_NAME_free(*xn);
-    *xn = name;
-    return 1;
+int X509_NAME_set(X509_NAME **xn, X509_NAME *name) {
+  if ((name = X509_NAME_dup(name)) == NULL) {
+    return 0;
+  }
+  X509_NAME_free(*xn);
+  *xn = name;
+  return 1;
 }
 
-int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
-{
-    return ne->set;
-}
+int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) { return ne->set; }
 
 int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder,
-                       size_t *pderlen)
-{
-    /* Make sure encoding is valid */
-    if (i2d_X509_NAME(nm, NULL) <= 0)
-        return 0;
-    if (pder != NULL)
-        *pder = (unsigned char *)nm->bytes->data;
-    if (pderlen != NULL)
-        *pderlen = nm->bytes->length;
-    return 1;
+                       size_t *pderlen) {
+  // Make sure encoding is valid
+  if (i2d_X509_NAME(nm, NULL) <= 0) {
+    return 0;
+  }
+  if (pder != NULL) {
+    *pder = (unsigned char *)nm->bytes->data;
+  }
+  if (pderlen != NULL) {
+    *pderlen = nm->bytes->length;
+  }
+  return 1;
 }
diff --git a/src/crypto/x509/x_pkey.c b/src/crypto/x509/x_pkey.c
index e562d73..52bc5b6 100644
--- a/src/crypto/x509/x_pkey.c
+++ b/src/crypto/x509/x_pkey.c
@@ -66,41 +66,47 @@
 #include "../internal.h"
 
 
-X509_PKEY *X509_PKEY_new(void)
-{
-    X509_PKEY *ret = OPENSSL_malloc(sizeof(X509_PKEY));
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    OPENSSL_memset(ret, 0, sizeof(X509_PKEY));
+X509_PKEY *X509_PKEY_new(void) {
+  X509_PKEY *ret = OPENSSL_malloc(sizeof(X509_PKEY));
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  OPENSSL_memset(ret, 0, sizeof(X509_PKEY));
 
-    ret->enc_algor = X509_ALGOR_new();
-    if (ret->enc_algor == NULL)
-        goto err;
-    ret->enc_pkey = ASN1_OCTET_STRING_new();
-    if (ret->enc_pkey == NULL)
-        goto err;
-    return ret;
+  ret->enc_algor = X509_ALGOR_new();
+  if (ret->enc_algor == NULL) {
+    goto err;
+  }
+  ret->enc_pkey = ASN1_OCTET_STRING_new();
+  if (ret->enc_pkey == NULL) {
+    goto err;
+  }
+  return ret;
 
- err:
-    if (ret != NULL)
-        X509_PKEY_free(ret);
-    return NULL;
+err:
+  if (ret != NULL) {
+    X509_PKEY_free(ret);
+  }
+  return NULL;
 }
 
-void X509_PKEY_free(X509_PKEY *x)
-{
-    if (x == NULL)
-        return;
+void X509_PKEY_free(X509_PKEY *x) {
+  if (x == NULL) {
+    return;
+  }
 
-    if (x->enc_algor != NULL)
-        X509_ALGOR_free(x->enc_algor);
-    if (x->enc_pkey != NULL)
-        ASN1_OCTET_STRING_free(x->enc_pkey);
-    if (x->dec_pkey != NULL)
-        EVP_PKEY_free(x->dec_pkey);
-    if ((x->key_data != NULL) && (x->key_free))
-        OPENSSL_free(x->key_data);
-    OPENSSL_free(x);
+  if (x->enc_algor != NULL) {
+    X509_ALGOR_free(x->enc_algor);
+  }
+  if (x->enc_pkey != NULL) {
+    ASN1_OCTET_STRING_free(x->enc_pkey);
+  }
+  if (x->dec_pkey != NULL) {
+    EVP_PKEY_free(x->dec_pkey);
+  }
+  if ((x->key_data != NULL) && (x->key_free)) {
+    OPENSSL_free(x->key_data);
+  }
+  OPENSSL_free(x);
 }
diff --git a/src/crypto/x509/x_pubkey.c b/src/crypto/x509/x_pubkey.c
index c283e0d..6a6a975 100644
--- a/src/crypto/x509/x_pubkey.c
+++ b/src/crypto/x509/x_pubkey.c
@@ -70,148 +70,145 @@
 #include "../internal.h"
 #include "internal.h"
 
-/* Minor tweak to operation: free up EVP_PKEY */
+// Minor tweak to operation: free up EVP_PKEY
 static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                     void *exarg)
-{
-    if (operation == ASN1_OP_FREE_POST) {
-        X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
-        EVP_PKEY_free(pubkey->pkey);
-    }
-    return 1;
+                     void *exarg) {
+  if (operation == ASN1_OP_FREE_POST) {
+    X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
+    EVP_PKEY_free(pubkey->pkey);
+  }
+  return 1;
 }
 
 ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = {
-        ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR),
-        ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING)
+    ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR),
+    ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING),
 } ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_PUBKEY)
 
-int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
-{
-    X509_PUBKEY *pk = NULL;
-    uint8_t *spki = NULL;
-    size_t spki_len;
+int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) {
+  X509_PUBKEY *pk = NULL;
+  uint8_t *spki = NULL;
+  size_t spki_len;
 
-    if (x == NULL)
-        return (0);
-
-    CBB cbb;
-    if (!CBB_init(&cbb, 0) ||
-        !EVP_marshal_public_key(&cbb, pkey) ||
-        !CBB_finish(&cbb, &spki, &spki_len) ||
-        spki_len > LONG_MAX) {
-        CBB_cleanup(&cbb);
-        OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_ENCODE_ERROR);
-        goto error;
-    }
-
-    const uint8_t *p = spki;
-    pk = d2i_X509_PUBKEY(NULL, &p, (long)spki_len);
-    if (pk == NULL || p != spki + spki_len) {
-        OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR);
-        goto error;
-    }
-
-    OPENSSL_free(spki);
-    X509_PUBKEY_free(*x);
-    *x = pk;
-
-    return 1;
- error:
-    X509_PUBKEY_free(pk);
-    OPENSSL_free(spki);
+  if (x == NULL) {
     return 0;
+  }
+
+  CBB cbb;
+  if (!CBB_init(&cbb, 0) ||  //
+      !EVP_marshal_public_key(&cbb, pkey) ||
+      !CBB_finish(&cbb, &spki, &spki_len) ||  //
+      spki_len > LONG_MAX) {
+    CBB_cleanup(&cbb);
+    OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_ENCODE_ERROR);
+    goto error;
+  }
+
+  const uint8_t *p = spki;
+  pk = d2i_X509_PUBKEY(NULL, &p, (long)spki_len);
+  if (pk == NULL || p != spki + spki_len) {
+    OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR);
+    goto error;
+  }
+
+  OPENSSL_free(spki);
+  X509_PUBKEY_free(*x);
+  *x = pk;
+
+  return 1;
+error:
+  X509_PUBKEY_free(pk);
+  OPENSSL_free(spki);
+  return 0;
 }
 
-/* g_pubkey_lock is used to protect the initialisation of the |pkey| member of
- * |X509_PUBKEY| objects. Really |X509_PUBKEY| should have a |CRYPTO_once_t|
- * inside it for this, but |CRYPTO_once_t| is private and |X509_PUBKEY| is
- * not. */
+// g_pubkey_lock is used to protect the initialisation of the |pkey| member of
+// |X509_PUBKEY| objects. Really |X509_PUBKEY| should have a |CRYPTO_once_t|
+// inside it for this, but |CRYPTO_once_t| is private and |X509_PUBKEY| is
+// not.
 static struct CRYPTO_STATIC_MUTEX g_pubkey_lock = CRYPTO_STATIC_MUTEX_INIT;
 
-EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
-{
-    EVP_PKEY *ret = NULL;
-    uint8_t *spki = NULL;
+EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) {
+  EVP_PKEY *ret = NULL;
+  uint8_t *spki = NULL;
 
-    if (key == NULL)
-        goto error;
+  if (key == NULL) {
+    goto error;
+  }
 
-    CRYPTO_STATIC_MUTEX_lock_read(&g_pubkey_lock);
-    if (key->pkey != NULL) {
-        CRYPTO_STATIC_MUTEX_unlock_read(&g_pubkey_lock);
-        EVP_PKEY_up_ref(key->pkey);
-        return key->pkey;
-    }
+  CRYPTO_STATIC_MUTEX_lock_read(&g_pubkey_lock);
+  if (key->pkey != NULL) {
     CRYPTO_STATIC_MUTEX_unlock_read(&g_pubkey_lock);
+    EVP_PKEY_up_ref(key->pkey);
+    return key->pkey;
+  }
+  CRYPTO_STATIC_MUTEX_unlock_read(&g_pubkey_lock);
 
-    /* Re-encode the |X509_PUBKEY| to DER and parse it. */
-    int spki_len = i2d_X509_PUBKEY(key, &spki);
-    if (spki_len < 0) {
-        goto error;
-    }
-    CBS cbs;
-    CBS_init(&cbs, spki, (size_t)spki_len);
-    ret = EVP_parse_public_key(&cbs);
-    if (ret == NULL || CBS_len(&cbs) != 0) {
-        OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR);
-        goto error;
-    }
+  // Re-encode the |X509_PUBKEY| to DER and parse it.
+  int spki_len = i2d_X509_PUBKEY(key, &spki);
+  if (spki_len < 0) {
+    goto error;
+  }
+  CBS cbs;
+  CBS_init(&cbs, spki, (size_t)spki_len);
+  ret = EVP_parse_public_key(&cbs);
+  if (ret == NULL || CBS_len(&cbs) != 0) {
+    OPENSSL_PUT_ERROR(X509, X509_R_PUBLIC_KEY_DECODE_ERROR);
+    goto error;
+  }
 
-    /* Check to see if another thread set key->pkey first */
-    CRYPTO_STATIC_MUTEX_lock_write(&g_pubkey_lock);
-    if (key->pkey) {
-        CRYPTO_STATIC_MUTEX_unlock_write(&g_pubkey_lock);
-        EVP_PKEY_free(ret);
-        ret = key->pkey;
-    } else {
-        key->pkey = ret;
-        CRYPTO_STATIC_MUTEX_unlock_write(&g_pubkey_lock);
-    }
-
-    OPENSSL_free(spki);
-    EVP_PKEY_up_ref(ret);
-    return ret;
-
- error:
-    OPENSSL_free(spki);
+  // Check to see if another thread set key->pkey first
+  CRYPTO_STATIC_MUTEX_lock_write(&g_pubkey_lock);
+  if (key->pkey) {
+    CRYPTO_STATIC_MUTEX_unlock_write(&g_pubkey_lock);
     EVP_PKEY_free(ret);
-    return NULL;
+    ret = key->pkey;
+  } else {
+    key->pkey = ret;
+    CRYPTO_STATIC_MUTEX_unlock_write(&g_pubkey_lock);
+  }
+
+  OPENSSL_free(spki);
+  EVP_PKEY_up_ref(ret);
+  return ret;
+
+error:
+  OPENSSL_free(spki);
+  EVP_PKEY_free(ret);
+  return NULL;
 }
 
 int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *obj, int param_type,
-                           void *param_value, uint8_t *key, int key_len)
-{
-    if (!X509_ALGOR_set0(pub->algor, obj, param_type, param_value)) {
-        return 0;
-    }
+                           void *param_value, uint8_t *key, int key_len) {
+  if (!X509_ALGOR_set0(pub->algor, obj, param_type, param_value)) {
+    return 0;
+  }
 
-    ASN1_STRING_set0(pub->public_key, key, key_len);
-    /* Set the number of unused bits to zero. */
-    pub->public_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
-    pub->public_key->flags |= ASN1_STRING_FLAG_BITS_LEFT;
-    return 1;
+  ASN1_STRING_set0(pub->public_key, key, key_len);
+  // Set the number of unused bits to zero.
+  pub->public_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+  pub->public_key->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+  return 1;
 }
 
 int X509_PUBKEY_get0_param(ASN1_OBJECT **out_obj, const uint8_t **out_key,
                            int *out_key_len, X509_ALGOR **out_alg,
-                           X509_PUBKEY *pub)
-{
-    if (out_obj != NULL) {
-        *out_obj = pub->algor->algorithm;
-    }
-    if (out_key != NULL) {
-        *out_key = pub->public_key->data;
-        *out_key_len = pub->public_key->length;
-    }
-    if (out_alg != NULL) {
-        *out_alg = pub->algor;
-    }
-    return 1;
+                           X509_PUBKEY *pub) {
+  if (out_obj != NULL) {
+    *out_obj = pub->algor->algorithm;
+  }
+  if (out_key != NULL) {
+    *out_key = pub->public_key->data;
+    *out_key_len = pub->public_key->length;
+  }
+  if (out_alg != NULL) {
+    *out_alg = pub->algor;
+  }
+  return 1;
 }
 
 const ASN1_BIT_STRING *X509_PUBKEY_get0_public_key(const X509_PUBKEY *pub) {
-    return pub->public_key;
+  return pub->public_key;
 }
diff --git a/src/crypto/x509/x_req.c b/src/crypto/x509/x_req.c
index 0e9dce1..59cfbab 100644
--- a/src/crypto/x509/x_req.c
+++ b/src/crypto/x509/x_req.c
@@ -63,43 +63,53 @@
 #include "internal.h"
 
 
-/*
- * X509_REQ_INFO is handled in an unusual way to get round invalid encodings.
- * Some broken certificate requests don't encode the attributes field if it
- * is empty. This is in violation of PKCS#10 but we need to tolerate it. We
- * do this by making the attributes field OPTIONAL then using the callback to
- * initialise it to an empty STACK. This means that the field will be
- * correctly encoded unless we NULL out the field.
- */
+// X509_REQ_INFO is handled in an unusual way to get round invalid encodings.
+// Some broken certificate requests don't encode the attributes field if it
+// is empty. This is in violation of PKCS#10 but we need to tolerate it. We
+// do this by making the attributes field OPTIONAL then using the callback to
+// initialise it to an empty STACK. This means that the field will be
+// correctly encoded unless we NULL out the field.
 
 static int rinf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                   void *exarg)
-{
-    X509_REQ_INFO *rinf = (X509_REQ_INFO *)*pval;
+                   void *exarg) {
+  X509_REQ_INFO *rinf = (X509_REQ_INFO *)*pval;
 
-    if (operation == ASN1_OP_NEW_POST) {
-        rinf->attributes = sk_X509_ATTRIBUTE_new_null();
-        if (!rinf->attributes)
-            return 0;
+  if (operation == ASN1_OP_NEW_POST) {
+    rinf->attributes = sk_X509_ATTRIBUTE_new_null();
+    if (!rinf->attributes) {
+      return 0;
     }
-    return 1;
+  }
+
+  if (operation == ASN1_OP_D2I_POST) {
+    // The only defined CSR version is v1(0). For compatibility, we also accept
+    // a hypothetical v3(2). Although not defined, older versions of certbot
+    // use it. See https://github.com/certbot/certbot/pull/9334.
+    long version = ASN1_INTEGER_get(rinf->version);
+    if (version != X509_REQ_VERSION_1 && version != 2) {
+      OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+      return 0;
+    }
+  }
+
+  return 1;
 }
 
 ASN1_SEQUENCE_enc(X509_REQ_INFO, enc, rinf_cb) = {
-        ASN1_SIMPLE(X509_REQ_INFO, version, ASN1_INTEGER),
-        ASN1_SIMPLE(X509_REQ_INFO, subject, X509_NAME),
-        ASN1_SIMPLE(X509_REQ_INFO, pubkey, X509_PUBKEY),
-        /* This isn't really OPTIONAL but it gets around invalid encodings. */
-        ASN1_IMP_SET_OF_OPT(X509_REQ_INFO, attributes, X509_ATTRIBUTE, 0)
+    ASN1_SIMPLE(X509_REQ_INFO, version, ASN1_INTEGER),
+    ASN1_SIMPLE(X509_REQ_INFO, subject, X509_NAME),
+    ASN1_SIMPLE(X509_REQ_INFO, pubkey, X509_PUBKEY),
+    // This isn't really OPTIONAL but it gets around invalid encodings.
+    ASN1_IMP_SET_OF_OPT(X509_REQ_INFO, attributes, X509_ATTRIBUTE, 0),
 } ASN1_SEQUENCE_END_enc(X509_REQ_INFO, X509_REQ_INFO)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_REQ_INFO)
 
-ASN1_SEQUENCE_ref(X509_REQ, 0) = {
-        ASN1_SIMPLE(X509_REQ, req_info, X509_REQ_INFO),
-        ASN1_SIMPLE(X509_REQ, sig_alg, X509_ALGOR),
-        ASN1_SIMPLE(X509_REQ, signature, ASN1_BIT_STRING)
-} ASN1_SEQUENCE_END_ref(X509_REQ, X509_REQ)
+ASN1_SEQUENCE(X509_REQ) = {
+    ASN1_SIMPLE(X509_REQ, req_info, X509_REQ_INFO),
+    ASN1_SIMPLE(X509_REQ, sig_alg, X509_ALGOR),
+    ASN1_SIMPLE(X509_REQ, signature, ASN1_BIT_STRING),
+} ASN1_SEQUENCE_END(X509_REQ)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_REQ)
 
diff --git a/src/crypto/x509/x_sig.c b/src/crypto/x509/x_sig.c
index 8f9a5b7..4710cae 100644
--- a/src/crypto/x509/x_sig.c
+++ b/src/crypto/x509/x_sig.c
@@ -67,11 +67,11 @@
 } /* X509_SIG */;
 
 ASN1_SEQUENCE(X509_SIG) = {
-        ASN1_SIMPLE(X509_SIG, algor, X509_ALGOR),
-        ASN1_SIMPLE(X509_SIG, digest, ASN1_OCTET_STRING)
+    ASN1_SIMPLE(X509_SIG, algor, X509_ALGOR),
+    ASN1_SIMPLE(X509_SIG, digest, ASN1_OCTET_STRING),
 } ASN1_SEQUENCE_END(X509_SIG)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_SIG)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_SIG)
 
 void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **out_alg,
                    const ASN1_OCTET_STRING **out_digest) {
diff --git a/src/crypto/x509/x_spki.c b/src/crypto/x509/x_spki.c
index 86da6dd..5899878 100644
--- a/src/crypto/x509/x_spki.c
+++ b/src/crypto/x509/x_spki.c
@@ -55,26 +55,24 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
- /*
-  * This module was send to me my Pat Richards <patr@x509.com> who wrote it.
-  * It is under my Copyright with his permission.
-  */
+// This module was send to me my Pat Richards <patr@x509.com> who wrote it.
+// It is under my Copyright with his permission.
 
-#include <openssl/x509.h>
 #include <openssl/asn1t.h>
+#include <openssl/x509.h>
 
 
 ASN1_SEQUENCE(NETSCAPE_SPKAC) = {
-        ASN1_SIMPLE(NETSCAPE_SPKAC, pubkey, X509_PUBKEY),
-        ASN1_SIMPLE(NETSCAPE_SPKAC, challenge, ASN1_IA5STRING)
+    ASN1_SIMPLE(NETSCAPE_SPKAC, pubkey, X509_PUBKEY),
+    ASN1_SIMPLE(NETSCAPE_SPKAC, challenge, ASN1_IA5STRING),
 } ASN1_SEQUENCE_END(NETSCAPE_SPKAC)
 
-IMPLEMENT_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
+IMPLEMENT_ASN1_FUNCTIONS_const(NETSCAPE_SPKAC)
 
 ASN1_SEQUENCE(NETSCAPE_SPKI) = {
-        ASN1_SIMPLE(NETSCAPE_SPKI, spkac, NETSCAPE_SPKAC),
-        ASN1_SIMPLE(NETSCAPE_SPKI, sig_algor, X509_ALGOR),
-        ASN1_SIMPLE(NETSCAPE_SPKI, signature, ASN1_BIT_STRING)
+    ASN1_SIMPLE(NETSCAPE_SPKI, spkac, NETSCAPE_SPKAC),
+    ASN1_SIMPLE(NETSCAPE_SPKI, sig_algor, X509_ALGOR),
+    ASN1_SIMPLE(NETSCAPE_SPKI, signature, ASN1_BIT_STRING),
 } ASN1_SEQUENCE_END(NETSCAPE_SPKI)
 
-IMPLEMENT_ASN1_FUNCTIONS(NETSCAPE_SPKI)
+IMPLEMENT_ASN1_FUNCTIONS_const(NETSCAPE_SPKI)
diff --git a/src/crypto/x509/x_val.c b/src/crypto/x509/x_val.c
index 006c53b..62dbf6f 100644
--- a/src/crypto/x509/x_val.c
+++ b/src/crypto/x509/x_val.c
@@ -64,8 +64,8 @@
 
 
 ASN1_SEQUENCE(X509_VAL) = {
-        ASN1_SIMPLE(X509_VAL, notBefore, ASN1_TIME),
-        ASN1_SIMPLE(X509_VAL, notAfter, ASN1_TIME)
+    ASN1_SIMPLE(X509_VAL, notBefore, ASN1_TIME),
+    ASN1_SIMPLE(X509_VAL, notAfter, ASN1_TIME),
 } ASN1_SEQUENCE_END(X509_VAL)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_VAL)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_VAL)
diff --git a/src/crypto/x509/x_x509.c b/src/crypto/x509/x_x509.c
index 9d350bd..27cbd99 100644
--- a/src/crypto/x509/x_x509.c
+++ b/src/crypto/x509/x_x509.c
@@ -74,100 +74,96 @@
 static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT;
 
 ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = {
-        ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0),
-        ASN1_SIMPLE(X509_CINF, serialNumber, ASN1_INTEGER),
-        ASN1_SIMPLE(X509_CINF, signature, X509_ALGOR),
-        ASN1_SIMPLE(X509_CINF, issuer, X509_NAME),
-        ASN1_SIMPLE(X509_CINF, validity, X509_VAL),
-        ASN1_SIMPLE(X509_CINF, subject, X509_NAME),
-        ASN1_SIMPLE(X509_CINF, key, X509_PUBKEY),
-        ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1),
-        ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2),
-        ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3)
+    ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0),
+    ASN1_SIMPLE(X509_CINF, serialNumber, ASN1_INTEGER),
+    ASN1_SIMPLE(X509_CINF, signature, X509_ALGOR),
+    ASN1_SIMPLE(X509_CINF, issuer, X509_NAME),
+    ASN1_SIMPLE(X509_CINF, validity, X509_VAL),
+    ASN1_SIMPLE(X509_CINF, subject, X509_NAME),
+    ASN1_SIMPLE(X509_CINF, key, X509_PUBKEY),
+    ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1),
+    ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2),
+    ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3),
 } ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_CINF)
-/* X509 top level structure needs a bit of customisation */
+// X509 top level structure needs a bit of customisation
 
 extern void policy_cache_free(X509_POLICY_CACHE *cache);
 
 static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                   void *exarg)
-{
-    X509 *ret = (X509 *)*pval;
+                   void *exarg) {
+  X509 *ret = (X509 *)*pval;
 
-    switch (operation) {
-
+  switch (operation) {
     case ASN1_OP_NEW_POST:
-        ret->ex_flags = 0;
-        ret->ex_pathlen = -1;
-        ret->skid = NULL;
-        ret->akid = NULL;
-        ret->aux = NULL;
-        ret->crldp = NULL;
-        ret->buf = NULL;
-        CRYPTO_new_ex_data(&ret->ex_data);
-        CRYPTO_MUTEX_init(&ret->lock);
-        break;
+      ret->ex_flags = 0;
+      ret->ex_pathlen = -1;
+      ret->skid = NULL;
+      ret->akid = NULL;
+      ret->aux = NULL;
+      ret->crldp = NULL;
+      ret->buf = NULL;
+      CRYPTO_new_ex_data(&ret->ex_data);
+      CRYPTO_MUTEX_init(&ret->lock);
+      break;
 
     case ASN1_OP_D2I_PRE:
-        CRYPTO_BUFFER_free(ret->buf);
-        ret->buf = NULL;
-        break;
+      CRYPTO_BUFFER_free(ret->buf);
+      ret->buf = NULL;
+      break;
 
     case ASN1_OP_D2I_POST: {
-        /* The version must be one of v1(0), v2(1), or v3(2). */
-        long version = 0;
-        if (ret->cert_info->version != NULL) {
-            version = ASN1_INTEGER_get(ret->cert_info->version);
-            /* TODO(https://crbug.com/boringssl/364): |version| = 0 should also
-             * be rejected. This means an explicitly-encoded X.509v1 version.
-             * v1 is DEFAULT, so DER requires it be omitted. */
-            if (version < 0 || version > 2) {
-                OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
-                return 0;
-            }
+      // The version must be one of v1(0), v2(1), or v3(2).
+      long version = X509_VERSION_1;
+      if (ret->cert_info->version != NULL) {
+        version = ASN1_INTEGER_get(ret->cert_info->version);
+        // TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should
+        // also be rejected here. This means an explicitly-encoded X.509v1
+        // version. v1 is DEFAULT, so DER requires it be omitted.
+        if (version < X509_VERSION_1 || version > X509_VERSION_3) {
+          OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
+          return 0;
         }
+      }
 
-        /* Per RFC 5280, section 4.1.2.8, these fields require v2 or v3. */
-        if (version == 0 && (ret->cert_info->issuerUID != NULL ||
-                             ret->cert_info->subjectUID != NULL)) {
-            OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
-            return 0;
-        }
+      // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3.
+      if (version == X509_VERSION_1 && (ret->cert_info->issuerUID != NULL ||
+                                        ret->cert_info->subjectUID != NULL)) {
+        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
+        return 0;
+      }
 
-        /* Per RFC 5280, section 4.1.2.9, extensions require v3. */
-        if (version != 2 && ret->cert_info->extensions != NULL) {
-            OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
-            return 0;
-        }
+      // Per RFC 5280, section 4.1.2.9, extensions require v3.
+      if (version != X509_VERSION_3 && ret->cert_info->extensions != NULL) {
+        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
+        return 0;
+      }
 
-        break;
+      break;
     }
 
     case ASN1_OP_FREE_POST:
-        CRYPTO_MUTEX_cleanup(&ret->lock);
-        CRYPTO_free_ex_data(&g_ex_data_class, ret, &ret->ex_data);
-        X509_CERT_AUX_free(ret->aux);
-        ASN1_OCTET_STRING_free(ret->skid);
-        AUTHORITY_KEYID_free(ret->akid);
-        CRL_DIST_POINTS_free(ret->crldp);
-        policy_cache_free(ret->policy_cache);
-        GENERAL_NAMES_free(ret->altname);
-        NAME_CONSTRAINTS_free(ret->nc);
-        CRYPTO_BUFFER_free(ret->buf);
-        break;
+      CRYPTO_MUTEX_cleanup(&ret->lock);
+      CRYPTO_free_ex_data(&g_ex_data_class, ret, &ret->ex_data);
+      X509_CERT_AUX_free(ret->aux);
+      ASN1_OCTET_STRING_free(ret->skid);
+      AUTHORITY_KEYID_free(ret->akid);
+      CRL_DIST_POINTS_free(ret->crldp);
+      policy_cache_free(ret->policy_cache);
+      GENERAL_NAMES_free(ret->altname);
+      NAME_CONSTRAINTS_free(ret->nc);
+      CRYPTO_BUFFER_free(ret->buf);
+      break;
+  }
 
-    }
-
-    return 1;
-
+  return 1;
 }
 
 ASN1_SEQUENCE_ref(X509, x509_cb) = {
-        ASN1_SIMPLE(X509, cert_info, X509_CINF),
-        ASN1_SIMPLE(X509, sig_alg, X509_ALGOR),
-        ASN1_SIMPLE(X509, signature, ASN1_BIT_STRING)
+    ASN1_SIMPLE(X509, cert_info, X509_CINF),
+    ASN1_SIMPLE(X509, sig_alg, X509_ALGOR),
+    ASN1_SIMPLE(X509, signature, ASN1_BIT_STRING),
 } ASN1_SEQUENCE_END_ref(X509, X509)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509)
@@ -204,191 +200,178 @@
   return ret;
 }
 
-int X509_up_ref(X509 *x)
-{
-    CRYPTO_refcount_inc(&x->references);
-    return 1;
+int X509_up_ref(X509 *x) {
+  CRYPTO_refcount_inc(&x->references);
+  return 1;
 }
 
-int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused * unused,
-                          CRYPTO_EX_dup *dup_unused, CRYPTO_EX_free *free_func)
-{
-    int index;
-    if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
-                                 free_func)) {
-        return -1;
-    }
-    return index;
+int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused *unused,
+                          CRYPTO_EX_dup *dup_unused,
+                          CRYPTO_EX_free *free_func) {
+  int index;
+  if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
+                               free_func)) {
+    return -1;
+  }
+  return index;
 }
 
-int X509_set_ex_data(X509 *r, int idx, void *arg)
-{
-    return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
+int X509_set_ex_data(X509 *r, int idx, void *arg) {
+  return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
 }
 
-void *X509_get_ex_data(X509 *r, int idx)
-{
-    return (CRYPTO_get_ex_data(&r->ex_data, idx));
+void *X509_get_ex_data(X509 *r, int idx) {
+  return (CRYPTO_get_ex_data(&r->ex_data, idx));
 }
 
-/*
- * X509_AUX ASN1 routines. X509_AUX is the name given to a certificate with
- * extra info tagged on the end. Since these functions set how a certificate
- * is trusted they should only be used when the certificate comes from a
- * reliable source such as local storage.
- */
+// X509_AUX ASN1 routines. X509_AUX is the name given to a certificate with
+// extra info tagged on the end. Since these functions set how a certificate
+// is trusted they should only be used when the certificate comes from a
+// reliable source such as local storage.
 
-X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length)
-{
-    const unsigned char *q = *pp;
-    X509 *ret;
-    int freeret = 0;
+X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length) {
+  const unsigned char *q = *pp;
+  X509 *ret;
+  int freeret = 0;
 
-    if (!a || *a == NULL)
-        freeret = 1;
-    ret = d2i_X509(a, &q, length);
-    /* If certificate unreadable then forget it */
-    if (!ret)
-        return NULL;
-    /* update length */
-    length -= q - *pp;
-    /* Parse auxiliary information if there is any. */
-    if (length > 0 && !d2i_X509_CERT_AUX(&ret->aux, &q, length))
-        goto err;
-    *pp = q;
-    return ret;
- err:
-    if (freeret) {
-        X509_free(ret);
-        if (a)
-            *a = NULL;
-    }
+  if (!a || *a == NULL) {
+    freeret = 1;
+  }
+  ret = d2i_X509(a, &q, length);
+  // If certificate unreadable then forget it
+  if (!ret) {
     return NULL;
+  }
+  // update length
+  length -= q - *pp;
+  // Parse auxiliary information if there is any.
+  if (length > 0 && !d2i_X509_CERT_AUX(&ret->aux, &q, length)) {
+    goto err;
+  }
+  *pp = q;
+  return ret;
+err:
+  if (freeret) {
+    X509_free(ret);
+    if (a) {
+      *a = NULL;
+    }
+  }
+  return NULL;
 }
 
-/*
- * Serialize trusted certificate to *pp or just return the required buffer
- * length if pp == NULL.  We ultimately want to avoid modifying *pp in the
- * error path, but that depends on similar hygiene in lower-level functions.
- * Here we avoid compounding the problem.
- */
-static int i2d_x509_aux_internal(X509 *a, unsigned char **pp)
-{
-    int length, tmplen;
-    unsigned char *start = pp != NULL ? *pp : NULL;
+// Serialize trusted certificate to *pp or just return the required buffer
+// length if pp == NULL.  We ultimately want to avoid modifying *pp in the
+// error path, but that depends on similar hygiene in lower-level functions.
+// Here we avoid compounding the problem.
+static int i2d_x509_aux_internal(X509 *a, unsigned char **pp) {
+  int length, tmplen;
+  unsigned char *start = pp != NULL ? *pp : NULL;
 
-    assert(pp == NULL || *pp != NULL);
+  assert(pp == NULL || *pp != NULL);
 
-    /*
-     * This might perturb *pp on error, but fixing that belongs in i2d_X509()
-     * not here.  It should be that if a == NULL length is zero, but we check
-     * both just in case.
-     */
-    length = i2d_X509(a, pp);
-    if (length <= 0 || a == NULL) {
-        return length;
-    }
-
-    if (a->aux != NULL) {
-        tmplen = i2d_X509_CERT_AUX(a->aux, pp);
-        if (tmplen < 0) {
-            if (start != NULL)
-                *pp = start;
-            return tmplen;
-        }
-        length += tmplen;
-    }
-
+  // This might perturb *pp on error, but fixing that belongs in i2d_X509()
+  // not here.  It should be that if a == NULL length is zero, but we check
+  // both just in case.
+  length = i2d_X509(a, pp);
+  if (length <= 0 || a == NULL) {
     return length;
+  }
+
+  if (a->aux != NULL) {
+    tmplen = i2d_X509_CERT_AUX(a->aux, pp);
+    if (tmplen < 0) {
+      if (start != NULL) {
+        *pp = start;
+      }
+      return tmplen;
+    }
+    length += tmplen;
+  }
+
+  return length;
 }
 
-/*
- * Serialize trusted certificate to *pp, or just return the required buffer
- * length if pp == NULL.
- *
- * When pp is not NULL, but *pp == NULL, we allocate the buffer, but since
- * we're writing two ASN.1 objects back to back, we can't have i2d_X509() do
- * the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the
- * allocated buffer.
- */
-int i2d_X509_AUX(X509 *a, unsigned char **pp)
-{
-    int length;
-    unsigned char *tmp;
+// Serialize trusted certificate to *pp, or just return the required buffer
+// length if pp == NULL.
+//
+// When pp is not NULL, but *pp == NULL, we allocate the buffer, but since
+// we're writing two ASN.1 objects back to back, we can't have i2d_X509() do
+// the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the
+// allocated buffer.
+int i2d_X509_AUX(X509 *a, unsigned char **pp) {
+  int length;
+  unsigned char *tmp;
 
-    /* Buffer provided by caller */
-    if (pp == NULL || *pp != NULL)
-        return i2d_x509_aux_internal(a, pp);
+  // Buffer provided by caller
+  if (pp == NULL || *pp != NULL) {
+    return i2d_x509_aux_internal(a, pp);
+  }
 
-    /* Obtain the combined length */
-    if ((length = i2d_x509_aux_internal(a, NULL)) <= 0)
-        return length;
-
-    /* Allocate requisite combined storage */
-    *pp = tmp = OPENSSL_malloc(length);
-    if (tmp == NULL)
-        return -1; /* Push error onto error stack? */
-
-    /* Encode, but keep *pp at the originally malloced pointer */
-    length = i2d_x509_aux_internal(a, &tmp);
-    if (length <= 0) {
-        OPENSSL_free(*pp);
-        *pp = NULL;
-    }
+  // Obtain the combined length
+  if ((length = i2d_x509_aux_internal(a, NULL)) <= 0) {
     return length;
+  }
+
+  // Allocate requisite combined storage
+  *pp = tmp = OPENSSL_malloc(length);
+  if (tmp == NULL) {
+    return -1;  // Push error onto error stack?
+  }
+
+  // Encode, but keep *pp at the originally malloced pointer
+  length = i2d_x509_aux_internal(a, &tmp);
+  if (length <= 0) {
+    OPENSSL_free(*pp);
+    *pp = NULL;
+  }
+  return length;
 }
 
-int i2d_re_X509_tbs(X509 *x509, unsigned char **outp)
-{
-    x509->cert_info->enc.modified = 1;
-    return i2d_X509_CINF(x509->cert_info, outp);
+int i2d_re_X509_tbs(X509 *x509, unsigned char **outp) {
+  x509->cert_info->enc.modified = 1;
+  return i2d_X509_CINF(x509->cert_info, outp);
 }
 
-int i2d_X509_tbs(X509 *x509, unsigned char **outp)
-{
-    return i2d_X509_CINF(x509->cert_info, outp);
+int i2d_X509_tbs(X509 *x509, unsigned char **outp) {
+  return i2d_X509_CINF(x509->cert_info, outp);
 }
 
-int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo)
-{
-    /* TODO(davidben): Const-correct generated ASN.1 dup functions.
-     * Alternatively, when the types are hidden and we can embed required fields
-     * directly in structs, import |X509_ALGOR_copy| from upstream. */
-    X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
-    X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
-    if (copy1 == NULL || copy2 == NULL) {
-        X509_ALGOR_free(copy1);
-        X509_ALGOR_free(copy2);
-        return 0;
-    }
+int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo) {
+  X509_ALGOR *copy1 = X509_ALGOR_dup(algo);
+  X509_ALGOR *copy2 = X509_ALGOR_dup(algo);
+  if (copy1 == NULL || copy2 == NULL) {
+    X509_ALGOR_free(copy1);
+    X509_ALGOR_free(copy2);
+    return 0;
+  }
 
-    X509_ALGOR_free(x509->sig_alg);
-    x509->sig_alg = copy1;
-    X509_ALGOR_free(x509->cert_info->signature);
-    x509->cert_info->signature = copy2;
-    return 1;
+  X509_ALGOR_free(x509->sig_alg);
+  x509->sig_alg = copy1;
+  X509_ALGOR_free(x509->cert_info->signature);
+  x509->cert_info->signature = copy2;
+  return 1;
 }
 
-int X509_set1_signature_value(X509 *x509, const uint8_t *sig, size_t sig_len)
-{
-    if (!ASN1_STRING_set(x509->signature, sig, sig_len)) {
-      return 0;
-    }
-    x509->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
-    x509->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
-    return 1;
+int X509_set1_signature_value(X509 *x509, const uint8_t *sig, size_t sig_len) {
+  if (!ASN1_STRING_set(x509->signature, sig, sig_len)) {
+    return 0;
+  }
+  x509->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
+  x509->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
+  return 1;
 }
 
 void X509_get0_signature(const ASN1_BIT_STRING **psig, const X509_ALGOR **palg,
-                         const X509 *x)
-{
-    if (psig)
-        *psig = x->signature;
-    if (palg)
-        *palg = x->sig_alg;
+                         const X509 *x) {
+  if (psig) {
+    *psig = x->signature;
+  }
+  if (palg) {
+    *palg = x->sig_alg;
+  }
 }
 
-int X509_get_signature_nid(const X509 *x)
-{
-    return OBJ_obj2nid(x->sig_alg->algorithm);
+int X509_get_signature_nid(const X509 *x) {
+  return OBJ_obj2nid(x->sig_alg->algorithm);
 }
diff --git a/src/crypto/x509/x_x509a.c b/src/crypto/x509/x_x509a.c
index fca02a6..c473f93 100644
--- a/src/crypto/x509/x_x509a.c
+++ b/src/crypto/x509/x_x509a.c
@@ -64,138 +64,146 @@
 #include "internal.h"
 
 
-/*
- * X509_CERT_AUX routines. These are used to encode additional user
- * modifiable data about a certificate. This data is appended to the X509
- * encoding when the *_X509_AUX routines are used. This means that the
- * "traditional" X509 routines will simply ignore the extra data.
- */
+// X509_CERT_AUX routines. These are used to encode additional user
+// modifiable data about a certificate. This data is appended to the X509
+// encoding when the *_X509_AUX routines are used. This means that the
+// "traditional" X509 routines will simply ignore the extra data.
 
 static X509_CERT_AUX *aux_get(X509 *x);
 
 ASN1_SEQUENCE(X509_CERT_AUX) = {
-        ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
-        ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
-        ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
-        ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
-        ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
+    ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
+    ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
+    ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
+    ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
 } ASN1_SEQUENCE_END(X509_CERT_AUX)
 
-IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
+IMPLEMENT_ASN1_FUNCTIONS_const(X509_CERT_AUX)
 
-static X509_CERT_AUX *aux_get(X509 *x)
-{
-    if (!x)
-        return NULL;
-    if (!x->aux && !(x->aux = X509_CERT_AUX_new()))
-        return NULL;
-    return x->aux;
+static X509_CERT_AUX *aux_get(X509 *x) {
+  if (!x) {
+    return NULL;
+  }
+  if (!x->aux && !(x->aux = X509_CERT_AUX_new())) {
+    return NULL;
+  }
+  return x->aux;
 }
 
-int X509_alias_set1(X509 *x, const unsigned char *name, int len)
-{
-    X509_CERT_AUX *aux;
-    if (!name) {
-        if (!x || !x->aux || !x->aux->alias)
-            return 1;
-        ASN1_UTF8STRING_free(x->aux->alias);
-        x->aux->alias = NULL;
-        return 1;
+int X509_alias_set1(X509 *x, const unsigned char *name, int len) {
+  X509_CERT_AUX *aux;
+  // TODO(davidben): Empty aliases are not meaningful in PKCS#12, and the
+  // getters cannot quite represent them. Also erase the object if |len| is
+  // zero.
+  if (!name) {
+    if (!x || !x->aux || !x->aux->alias) {
+      return 1;
     }
-    if (!(aux = aux_get(x)))
-        return 0;
-    if (!aux->alias && !(aux->alias = ASN1_UTF8STRING_new()))
-        return 0;
-    return ASN1_STRING_set(aux->alias, name, len);
+    ASN1_UTF8STRING_free(x->aux->alias);
+    x->aux->alias = NULL;
+    return 1;
+  }
+  if (!(aux = aux_get(x))) {
+    return 0;
+  }
+  if (!aux->alias && !(aux->alias = ASN1_UTF8STRING_new())) {
+    return 0;
+  }
+  return ASN1_STRING_set(aux->alias, name, len);
 }
 
-int X509_keyid_set1(X509 *x, const unsigned char *id, int len)
-{
-    X509_CERT_AUX *aux;
-    if (!id) {
-        if (!x || !x->aux || !x->aux->keyid)
-            return 1;
-        ASN1_OCTET_STRING_free(x->aux->keyid);
-        x->aux->keyid = NULL;
-        return 1;
+int X509_keyid_set1(X509 *x, const unsigned char *id, int len) {
+  X509_CERT_AUX *aux;
+  // TODO(davidben): Empty key IDs are not meaningful in PKCS#12, and the
+  // getters cannot quite represent them. Also erase the object if |len| is
+  // zero.
+  if (!id) {
+    if (!x || !x->aux || !x->aux->keyid) {
+      return 1;
     }
-    if (!(aux = aux_get(x)))
-        return 0;
-    if (!aux->keyid && !(aux->keyid = ASN1_OCTET_STRING_new()))
-        return 0;
-    return ASN1_STRING_set(aux->keyid, id, len);
+    ASN1_OCTET_STRING_free(x->aux->keyid);
+    x->aux->keyid = NULL;
+    return 1;
+  }
+  if (!(aux = aux_get(x))) {
+    return 0;
+  }
+  if (!aux->keyid && !(aux->keyid = ASN1_OCTET_STRING_new())) {
+    return 0;
+  }
+  return ASN1_STRING_set(aux->keyid, id, len);
 }
 
-unsigned char *X509_alias_get0(X509 *x, int *len)
-{
-    if (!x->aux || !x->aux->alias)
-        return NULL;
-    if (len)
-        *len = x->aux->alias->length;
-    return x->aux->alias->data;
+unsigned char *X509_alias_get0(X509 *x, int *out_len) {
+  const ASN1_UTF8STRING *alias = x->aux != NULL ? x->aux->alias : NULL;
+  if (out_len != NULL) {
+    *out_len = alias != NULL ? alias->length : 0;
+  }
+  return alias != NULL ? alias->data : NULL;
 }
 
-unsigned char *X509_keyid_get0(X509 *x, int *len)
-{
-    if (!x->aux || !x->aux->keyid)
-        return NULL;
-    if (len)
-        *len = x->aux->keyid->length;
-    return x->aux->keyid->data;
+unsigned char *X509_keyid_get0(X509 *x, int *out_len) {
+  const ASN1_OCTET_STRING *keyid = x->aux != NULL ? x->aux->keyid : NULL;
+  if (out_len != NULL) {
+    *out_len = keyid != NULL ? keyid->length : 0;
+  }
+  return keyid != NULL ? keyid->data : NULL;
 }
 
-int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj)
-{
-    ASN1_OBJECT *objtmp = OBJ_dup(obj);
-    if (objtmp == NULL)
-        goto err;
-    X509_CERT_AUX *aux = aux_get(x);
+int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj) {
+  ASN1_OBJECT *objtmp = OBJ_dup(obj);
+  if (objtmp == NULL) {
+    goto err;
+  }
+  X509_CERT_AUX *aux = aux_get(x);
+  if (aux->trust == NULL) {
+    aux->trust = sk_ASN1_OBJECT_new_null();
     if (aux->trust == NULL) {
-        aux->trust = sk_ASN1_OBJECT_new_null();
-        if (aux->trust == NULL)
-            goto err;
+      goto err;
     }
-    if (!sk_ASN1_OBJECT_push(aux->trust, objtmp))
-        goto err;
-    return 1;
+  }
+  if (!sk_ASN1_OBJECT_push(aux->trust, objtmp)) {
+    goto err;
+  }
+  return 1;
 
- err:
-    ASN1_OBJECT_free(objtmp);
-    return 0;
+err:
+  ASN1_OBJECT_free(objtmp);
+  return 0;
 }
 
-int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj)
-{
-    ASN1_OBJECT *objtmp = OBJ_dup(obj);
-    if (objtmp == NULL)
-        goto err;
-    X509_CERT_AUX *aux = aux_get(x);
+int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj) {
+  ASN1_OBJECT *objtmp = OBJ_dup(obj);
+  if (objtmp == NULL) {
+    goto err;
+  }
+  X509_CERT_AUX *aux = aux_get(x);
+  if (aux->reject == NULL) {
+    aux->reject = sk_ASN1_OBJECT_new_null();
     if (aux->reject == NULL) {
-        aux->reject = sk_ASN1_OBJECT_new_null();
-        if (aux->reject == NULL)
-            goto err;
+      goto err;
     }
-    if (!sk_ASN1_OBJECT_push(aux->reject, objtmp))
-        goto err;
-    return 1;
+  }
+  if (!sk_ASN1_OBJECT_push(aux->reject, objtmp)) {
+    goto err;
+  }
+  return 1;
 
- err:
-    ASN1_OBJECT_free(objtmp);
-    return 0;
+err:
+  ASN1_OBJECT_free(objtmp);
+  return 0;
 }
 
-void X509_trust_clear(X509 *x)
-{
-    if (x->aux && x->aux->trust) {
-        sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
-        x->aux->trust = NULL;
-    }
+void X509_trust_clear(X509 *x) {
+  if (x->aux && x->aux->trust) {
+    sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
+    x->aux->trust = NULL;
+  }
 }
 
-void X509_reject_clear(X509 *x)
-{
-    if (x->aux && x->aux->reject) {
-        sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
-        x->aux->reject = NULL;
-    }
+void X509_reject_clear(X509 *x) {
+  if (x->aux && x->aux->reject) {
+    sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
+    x->aux->reject = NULL;
+  }
 }
diff --git a/src/crypto/x509v3/ext_dat.h b/src/crypto/x509v3/ext_dat.h
index 7930126..2491431 100644
--- a/src/crypto/x509v3/ext_dat.h
+++ b/src/crypto/x509v3/ext_dat.h
@@ -54,7 +54,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* This file contains a table of "standard" extensions */
+// This file contains a table of "standard" extensions
 
 #if defined(__cplusplus)
 extern "C" {
@@ -65,10 +65,8 @@
 extern const X509V3_EXT_METHOD v3_ns_ia5_list[], v3_alt[], v3_skey_id,
     v3_akey_id;
 extern const X509V3_EXT_METHOD v3_crl_num, v3_crl_reason, v3_crl_invdate;
-extern const X509V3_EXT_METHOD v3_delta_crl, v3_cpols, v3_crld,
-    v3_freshest_crl;
-extern const X509V3_EXT_METHOD v3_ocsp_nonce, v3_ocsp_accresp,
-    v3_ocsp_acutoff;
+extern const X509V3_EXT_METHOD v3_delta_crl, v3_cpols, v3_crld, v3_freshest_crl;
+extern const X509V3_EXT_METHOD v3_ocsp_nonce, v3_ocsp_accresp, v3_ocsp_acutoff;
 extern const X509V3_EXT_METHOD v3_ocsp_crlid, v3_ocsp_nocheck,
     v3_ocsp_serviceloc;
 extern const X509V3_EXT_METHOD v3_crl_hold, v3_pci;
@@ -76,12 +74,10 @@
 extern const X509V3_EXT_METHOD v3_name_constraints, v3_inhibit_anyp, v3_idp;
 extern const X509V3_EXT_METHOD v3_addr, v3_asid;
 
-/*
- * This table will be searched using OBJ_bsearch so it *must* kept in order
- * of the ext_nid values.
- */
+// This table will be searched using OBJ_bsearch so it *must* kept in order
+// of the ext_nid values.
 
-/* TODO(fork): OCSP support */
+// TODO(fork): OCSP support
 #define OPENSSL_NO_OCSP
 
 static const X509V3_EXT_METHOD *const standard_exts[] = {
@@ -129,10 +125,11 @@
     &v3_freshest_crl,
 };
 
-/* Number of standard extensions */
+// Number of standard extensions
 
-#define STANDARD_EXTENSION_COUNT (sizeof(standard_exts)/sizeof(X509V3_EXT_METHOD *))
+#define STANDARD_EXTENSION_COUNT \
+  (sizeof(standard_exts) / sizeof(X509V3_EXT_METHOD *))
 
 #if defined(__cplusplus)
-} /* extern C */
+}  // extern C
 #endif
diff --git a/src/crypto/x509v3/internal.h b/src/crypto/x509v3/internal.h
index 3e6081b..9c9c425 100644
--- a/src/crypto/x509v3/internal.h
+++ b/src/crypto/x509v3/internal.h
@@ -65,26 +65,31 @@
 #include <openssl/stack.h>
 #include <openssl/x509v3.h>
 
+// TODO(davidben): Merge x509 and x509v3. This include is needed because some
+// internal typedefs are shared between the two, but the two modules depend on
+// each other circularly.
+#include "../x509/internal.h"
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
 
-// x509v3_bytes_to_hex encodes |len| bytes from |buffer| to hex and returns a
+// x509v3_bytes_to_hex encodes |len| bytes from |in| to hex and returns a
 // newly-allocated NUL-terminated string containing the result, or NULL on
 // allocation error.
 //
-// Note this function was historically named |hex_to_string| in OpenSSL, not
-// |string_to_hex|.
-char *x509v3_bytes_to_hex(const unsigned char *buffer, long len);
+// This function was historically named |hex_to_string| in OpenSSL. Despite the
+// name, |hex_to_string| converted to hex.
+OPENSSL_EXPORT char *x509v3_bytes_to_hex(const uint8_t *in, size_t len);
 
 // x509v3_hex_string_to_bytes decodes |str| in hex and returns a newly-allocated
 // array containing the result, or NULL on error. On success, it sets |*len| to
 // the length of the result. Colon separators between bytes in the input are
 // allowed and ignored.
 //
-// Note this function was historically named |string_to_hex| in OpenSSL, not
-// |hex_to_string|.
+// This function was historically named |string_to_hex| in OpenSSL. Despite the
+// name, |string_to_hex| converted from hex.
 unsigned char *x509v3_hex_to_bytes(const char *str, long *len);
 
 // x509v3_name_cmp returns zero if |name| is equal to |cmp| or begins with |cmp|
@@ -122,133 +127,131 @@
 int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value,
                                  STACK_OF(CONF_VALUE) **extlist);
 
+
+// Internal structures
+
+// This structure and the field names correspond to the Policy 'node' of
+// RFC 3280. NB this structure contains no pointers to parent or child data:
+// X509_POLICY_NODE contains that. This means that the main policy data can
+// be kept static and cached with the certificate.
+
 typedef struct X509_POLICY_DATA_st X509_POLICY_DATA;
+typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
+typedef struct X509_POLICY_NODE_st X509_POLICY_NODE;
 
 DEFINE_STACK_OF(X509_POLICY_DATA)
 
-/* Internal structures */
-
-/*
- * This structure and the field names correspond to the Policy 'node' of
- * RFC 3280. NB this structure contains no pointers to parent or child data:
- * X509_POLICY_NODE contains that. This means that the main policy data can
- * be kept static and cached with the certificate.
- */
-
 struct X509_POLICY_DATA_st {
-    unsigned int flags;
-    /* Policy OID and qualifiers for this data */
-    ASN1_OBJECT *valid_policy;
-    STACK_OF(POLICYQUALINFO) *qualifier_set;
-    STACK_OF(ASN1_OBJECT) *expected_policy_set;
+  unsigned int flags;
+  // Policy OID and qualifiers for this data
+  ASN1_OBJECT *valid_policy;
+  STACK_OF(POLICYQUALINFO) *qualifier_set;
+  STACK_OF(ASN1_OBJECT) *expected_policy_set;
 };
 
-/* X509_POLICY_DATA flags values */
+// X509_POLICY_DATA flags values
 
-/*
- * This flag indicates the structure has been mapped using a policy mapping
- * extension. If policy mapping is not active its references get deleted.
- */
+// This flag indicates the structure has been mapped using a policy mapping
+// extension. If policy mapping is not active its references get deleted.
 
-#define POLICY_DATA_FLAG_MAPPED                 0x1
+#define POLICY_DATA_FLAG_MAPPED 0x1
 
-/*
- * This flag indicates the data doesn't correspond to a policy in Certificate
- * Policies: it has been mapped to any policy.
- */
+// This flag indicates the data doesn't correspond to a policy in Certificate
+// Policies: it has been mapped to any policy.
 
-#define POLICY_DATA_FLAG_MAPPED_ANY             0x2
+#define POLICY_DATA_FLAG_MAPPED_ANY 0x2
 
-/* AND with flags to see if any mapping has occurred */
+// AND with flags to see if any mapping has occurred
 
-#define POLICY_DATA_FLAG_MAP_MASK               0x3
+#define POLICY_DATA_FLAG_MAP_MASK 0x3
 
-/* qualifiers are shared and shouldn't be freed */
+// qualifiers are shared and shouldn't be freed
 
-#define POLICY_DATA_FLAG_SHARED_QUALIFIERS      0x4
+#define POLICY_DATA_FLAG_SHARED_QUALIFIERS 0x4
 
-/* Parent node is an extra node and should be freed */
+// Parent node is an extra node and should be freed
 
-#define POLICY_DATA_FLAG_EXTRA_NODE             0x8
+#define POLICY_DATA_FLAG_EXTRA_NODE 0x8
 
-/* Corresponding CertificatePolicies is critical */
+// Corresponding CertificatePolicies is critical
 
-#define POLICY_DATA_FLAG_CRITICAL               0x10
+#define POLICY_DATA_FLAG_CRITICAL 0x10
 
-/* This structure is cached with a certificate */
+// This structure is cached with a certificate
 
 struct X509_POLICY_CACHE_st {
-    /* anyPolicy data or NULL if no anyPolicy */
-    X509_POLICY_DATA *anyPolicy;
-    /* other policy data */
-    STACK_OF(X509_POLICY_DATA) *data;
-    /* If InhibitAnyPolicy present this is its value or -1 if absent. */
-    long any_skip;
-    /*
-     * If policyConstraints and requireExplicitPolicy present this is its
-     * value or -1 if absent.
-     */
-    long explicit_skip;
-    /*
-     * If policyConstraints and policyMapping present this is its value or -1
-     * if absent.
-     */
-    long map_skip;
+  // anyPolicy data or NULL if no anyPolicy
+  X509_POLICY_DATA *anyPolicy;
+  // other policy data
+  STACK_OF(X509_POLICY_DATA) *data;
+  // If InhibitAnyPolicy present this is its value or -1 if absent.
+  long any_skip;
+  // If policyConstraints and requireExplicitPolicy present this is its
+  // value or -1 if absent.
+  long explicit_skip;
+  // If policyConstraints and policyMapping present this is its value or -1
+  // if absent.
+  long map_skip;
 };
 
-/*
- * #define POLICY_CACHE_FLAG_CRITICAL POLICY_DATA_FLAG_CRITICAL
- */
+// #define POLICY_CACHE_FLAG_CRITICAL POLICY_DATA_FLAG_CRITICAL
 
-/* This structure represents the relationship between nodes */
+// This structure represents the relationship between nodes
 
 struct X509_POLICY_NODE_st {
-    /* node data this refers to */
-    const X509_POLICY_DATA *data;
-    /* Parent node */
-    X509_POLICY_NODE *parent;
-    /* Number of child nodes */
-    int nchild;
+  // node data this refers to
+  const X509_POLICY_DATA *data;
+  // Parent node
+  X509_POLICY_NODE *parent;
+  // Number of child nodes
+  int nchild;
 };
 
+DEFINE_STACK_OF(X509_POLICY_NODE)
+
 struct X509_POLICY_LEVEL_st {
-    /* Cert for this level */
-    X509 *cert;
-    /* nodes at this level */
-    STACK_OF(X509_POLICY_NODE) *nodes;
-    /* anyPolicy node */
-    X509_POLICY_NODE *anyPolicy;
-    /* Extra data */
-    /*
-     * STACK_OF(X509_POLICY_DATA) *extra_data;
-     */
-    unsigned int flags;
+  // Cert for this level
+  X509 *cert;
+  // nodes at this level
+  STACK_OF(X509_POLICY_NODE) *nodes;
+  // anyPolicy node
+  X509_POLICY_NODE *anyPolicy;
+  // Extra data
+  //
+  // STACK_OF(X509_POLICY_DATA) *extra_data;
+  unsigned int flags;
 };
 
 struct X509_POLICY_TREE_st {
-    /* This is the tree 'level' data */
-    X509_POLICY_LEVEL *levels;
-    int nlevel;
-    /*
-     * Extra policy data when additional nodes (not from the certificate) are
-     * required.
-     */
-    STACK_OF(X509_POLICY_DATA) *extra_data;
-    /* This is the authority constained policy set */
-    STACK_OF(X509_POLICY_NODE) *auth_policies;
-    STACK_OF(X509_POLICY_NODE) *user_policies;
-    unsigned int flags;
+  // This is the tree 'level' data
+  X509_POLICY_LEVEL *levels;
+  int nlevel;
+  // Extra policy data when additional nodes (not from the certificate) are
+  // required.
+  STACK_OF(X509_POLICY_DATA) *extra_data;
+  // This is the authority constained policy set
+  STACK_OF(X509_POLICY_NODE) *auth_policies;
+  STACK_OF(X509_POLICY_NODE) *user_policies;
+  unsigned int flags;
 };
 
-/* Set if anyPolicy present in user policies */
-#define POLICY_FLAG_ANY_POLICY          0x2
+// Set if anyPolicy present in user policies
+#define POLICY_FLAG_ANY_POLICY 0x2
 
-/* Useful macros */
+// Useful macros
 
 #define node_data_critical(data) ((data)->flags & POLICY_DATA_FLAG_CRITICAL)
 #define node_critical(node) node_data_critical((node)->data)
 
-/* Internal functions */
+// Internal functions
+
+void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent);
+
+int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
+                      STACK_OF(X509) *certs, STACK_OF(ASN1_OBJECT) *policy_oids,
+                      unsigned int flags);
+
+void X509_policy_tree_free(X509_POLICY_TREE *tree);
 
 X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *id,
                                   int crit);
@@ -283,7 +286,7 @@
 
 
 #if defined(__cplusplus)
-}  /* extern C */
+}  // extern C
 #endif
 
-#endif  /* OPENSSL_HEADER_X509V3_INTERNAL_H */
+#endif  // OPENSSL_HEADER_X509V3_INTERNAL_H
diff --git a/src/crypto/x509v3/pcy_cache.c b/src/crypto/x509v3/pcy_cache.c
index 8303664..74f95f9 100644
--- a/src/crypto/x509v3/pcy_cache.c
+++ b/src/crypto/x509v3/pcy_cache.c
@@ -68,220 +68,228 @@
                            const X509_POLICY_DATA **b);
 static int policy_cache_set_int(long *out, ASN1_INTEGER *value);
 
-/*
- * Set cache entry according to CertificatePolicies extension. Note: this
- * destroys the passed CERTIFICATEPOLICIES structure.
- */
+// Set cache entry according to CertificatePolicies extension. Note: this
+// destroys the passed CERTIFICATEPOLICIES structure.
 
-static int policy_cache_create(X509 *x,
-                               CERTIFICATEPOLICIES *policies, int crit)
-{
-    size_t i;
-    int ret = 0;
-    X509_POLICY_CACHE *cache = x->policy_cache;
-    X509_POLICY_DATA *data = NULL;
-    POLICYINFO *policy;
-    if (sk_POLICYINFO_num(policies) == 0)
-        goto bad_policy;
-    cache->data = sk_X509_POLICY_DATA_new(policy_data_cmp);
-    if (!cache->data)
-        goto bad_policy;
-    for (i = 0; i < sk_POLICYINFO_num(policies); i++) {
-        policy = sk_POLICYINFO_value(policies, i);
-        data = policy_data_new(policy, NULL, crit);
-        if (!data)
-            goto bad_policy;
-        /*
-         * Duplicate policy OIDs are illegal: reject if matches found.
-         */
-        sk_X509_POLICY_DATA_sort(cache->data);
-        if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
-            if (cache->anyPolicy) {
-                ret = -1;
-                goto bad_policy;
-            }
-            cache->anyPolicy = data;
-        } else if (sk_X509_POLICY_DATA_find(cache->data, NULL, data)) {
-            ret = -1;
-            goto bad_policy;
-        } else if (!sk_X509_POLICY_DATA_push(cache->data, data))
-            goto bad_policy;
-        data = NULL;
+static int policy_cache_create(X509 *x, CERTIFICATEPOLICIES *policies,
+                               int crit) {
+  size_t i;
+  int ret = 0;
+  X509_POLICY_CACHE *cache = x->policy_cache;
+  X509_POLICY_DATA *data = NULL;
+  POLICYINFO *policy;
+  if (sk_POLICYINFO_num(policies) == 0) {
+    goto bad_policy;
+  }
+  cache->data = sk_X509_POLICY_DATA_new(policy_data_cmp);
+  if (!cache->data) {
+    goto bad_policy;
+  }
+  for (i = 0; i < sk_POLICYINFO_num(policies); i++) {
+    policy = sk_POLICYINFO_value(policies, i);
+    data = policy_data_new(policy, NULL, crit);
+    if (!data) {
+      goto bad_policy;
     }
-    ret = 1;
- bad_policy:
-    if (ret == -1)
-        x->ex_flags |= EXFLAG_INVALID_POLICY;
-    if (data)
-        policy_data_free(data);
-    sk_POLICYINFO_pop_free(policies, POLICYINFO_free);
-    if (ret <= 0) {
-        sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free);
-        cache->data = NULL;
+    // Duplicate policy OIDs are illegal: reject if matches found.
+    sk_X509_POLICY_DATA_sort(cache->data);
+    if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
+      if (cache->anyPolicy) {
+        ret = -1;
+        goto bad_policy;
+      }
+      cache->anyPolicy = data;
+    } else if (sk_X509_POLICY_DATA_find(cache->data, NULL, data)) {
+      ret = -1;
+      goto bad_policy;
+    } else if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
+      goto bad_policy;
     }
-    return ret;
-}
-
-static int policy_cache_new(X509 *x)
-{
-    X509_POLICY_CACHE *cache;
-    ASN1_INTEGER *ext_any = NULL;
-    POLICY_CONSTRAINTS *ext_pcons = NULL;
-    CERTIFICATEPOLICIES *ext_cpols = NULL;
-    POLICY_MAPPINGS *ext_pmaps = NULL;
-    int i;
-    cache = OPENSSL_malloc(sizeof(X509_POLICY_CACHE));
-    if (!cache)
-        return 0;
-    cache->anyPolicy = NULL;
+    data = NULL;
+  }
+  ret = 1;
+bad_policy:
+  if (ret == -1) {
+    x->ex_flags |= EXFLAG_INVALID_POLICY;
+  }
+  if (data) {
+    policy_data_free(data);
+  }
+  sk_POLICYINFO_pop_free(policies, POLICYINFO_free);
+  if (ret <= 0) {
+    sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free);
     cache->data = NULL;
-    cache->any_skip = -1;
-    cache->explicit_skip = -1;
-    cache->map_skip = -1;
+  }
+  return ret;
+}
 
-    x->policy_cache = cache;
+static int policy_cache_new(X509 *x) {
+  X509_POLICY_CACHE *cache;
+  ASN1_INTEGER *ext_any = NULL;
+  POLICY_CONSTRAINTS *ext_pcons = NULL;
+  CERTIFICATEPOLICIES *ext_cpols = NULL;
+  POLICY_MAPPINGS *ext_pmaps = NULL;
+  int i;
+  cache = OPENSSL_malloc(sizeof(X509_POLICY_CACHE));
+  if (!cache) {
+    return 0;
+  }
+  cache->anyPolicy = NULL;
+  cache->data = NULL;
+  cache->any_skip = -1;
+  cache->explicit_skip = -1;
+  cache->map_skip = -1;
 
-    /*
-     * Handle requireExplicitPolicy *first*. Need to process this even if we
-     * don't have any policies.
-     */
-    ext_pcons = X509_get_ext_d2i(x, NID_policy_constraints, &i, NULL);
+  x->policy_cache = cache;
 
-    if (!ext_pcons) {
-        if (i != -1)
-            goto bad_cache;
-    } else {
-        if (!ext_pcons->requireExplicitPolicy
-            && !ext_pcons->inhibitPolicyMapping)
-            goto bad_cache;
-        if (!policy_cache_set_int(&cache->explicit_skip,
-                                  ext_pcons->requireExplicitPolicy))
-            goto bad_cache;
-        if (!policy_cache_set_int(&cache->map_skip,
-                                  ext_pcons->inhibitPolicyMapping))
-            goto bad_cache;
+  // Handle requireExplicitPolicy *first*. Need to process this even if we
+  // don't have any policies.
+  ext_pcons = X509_get_ext_d2i(x, NID_policy_constraints, &i, NULL);
+
+  if (!ext_pcons) {
+    if (i != -1) {
+      goto bad_cache;
     }
-
-    /* Process CertificatePolicies */
-
-    ext_cpols = X509_get_ext_d2i(x, NID_certificate_policies, &i, NULL);
-    /*
-     * If no CertificatePolicies extension or problem decoding then there is
-     * no point continuing because the valid policies will be NULL.
-     */
-    if (!ext_cpols) {
-        /* If not absent some problem with extension */
-        if (i != -1)
-            goto bad_cache;
-        return 1;
+  } else {
+    if (!ext_pcons->requireExplicitPolicy && !ext_pcons->inhibitPolicyMapping) {
+      goto bad_cache;
     }
-
-    i = policy_cache_create(x, ext_cpols, i);
-
-    /* NB: ext_cpols freed by policy_cache_set_policies */
-
-    if (i <= 0)
-        return i;
-
-    ext_pmaps = X509_get_ext_d2i(x, NID_policy_mappings, &i, NULL);
-
-    if (!ext_pmaps) {
-        /* If not absent some problem with extension */
-        if (i != -1)
-            goto bad_cache;
-    } else {
-        i = policy_cache_set_mapping(x, ext_pmaps);
-        if (i <= 0)
-            goto bad_cache;
+    if (!policy_cache_set_int(&cache->explicit_skip,
+                              ext_pcons->requireExplicitPolicy)) {
+      goto bad_cache;
     }
-
-    ext_any = X509_get_ext_d2i(x, NID_inhibit_any_policy, &i, NULL);
-
-    if (!ext_any) {
-        if (i != -1)
-            goto bad_cache;
-    } else if (!policy_cache_set_int(&cache->any_skip, ext_any))
-        goto bad_cache;
-
-    if (0) {
- bad_cache:
-        x->ex_flags |= EXFLAG_INVALID_POLICY;
+    if (!policy_cache_set_int(&cache->map_skip,
+                              ext_pcons->inhibitPolicyMapping)) {
+      goto bad_cache;
     }
+  }
 
-    if (ext_pcons)
-        POLICY_CONSTRAINTS_free(ext_pcons);
+  // Process CertificatePolicies
 
-    if (ext_any)
-        ASN1_INTEGER_free(ext_any);
-
+  ext_cpols = X509_get_ext_d2i(x, NID_certificate_policies, &i, NULL);
+  // If no CertificatePolicies extension or problem decoding then there is
+  // no point continuing because the valid policies will be NULL.
+  if (!ext_cpols) {
+    // If not absent some problem with extension
+    if (i != -1) {
+      goto bad_cache;
+    }
     return 1;
+  }
 
+  i = policy_cache_create(x, ext_cpols, i);
+
+  // NB: ext_cpols freed by policy_cache_set_policies
+
+  if (i <= 0) {
+    return i;
+  }
+
+  ext_pmaps = X509_get_ext_d2i(x, NID_policy_mappings, &i, NULL);
+
+  if (!ext_pmaps) {
+    // If not absent some problem with extension
+    if (i != -1) {
+      goto bad_cache;
+    }
+  } else {
+    i = policy_cache_set_mapping(x, ext_pmaps);
+    if (i <= 0) {
+      goto bad_cache;
+    }
+  }
+
+  ext_any = X509_get_ext_d2i(x, NID_inhibit_any_policy, &i, NULL);
+
+  if (!ext_any) {
+    if (i != -1) {
+      goto bad_cache;
+    }
+  } else if (!policy_cache_set_int(&cache->any_skip, ext_any)) {
+    goto bad_cache;
+  }
+
+  if (0) {
+  bad_cache:
+    x->ex_flags |= EXFLAG_INVALID_POLICY;
+  }
+
+  if (ext_pcons) {
+    POLICY_CONSTRAINTS_free(ext_pcons);
+  }
+
+  if (ext_any) {
+    ASN1_INTEGER_free(ext_any);
+  }
+
+  return 1;
 }
 
-void policy_cache_free(X509_POLICY_CACHE *cache)
-{
-    if (!cache)
-        return;
-    if (cache->anyPolicy)
-        policy_data_free(cache->anyPolicy);
-    if (cache->data)
-        sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free);
-    OPENSSL_free(cache);
+void policy_cache_free(X509_POLICY_CACHE *cache) {
+  if (!cache) {
+    return;
+  }
+  if (cache->anyPolicy) {
+    policy_data_free(cache->anyPolicy);
+  }
+  if (cache->data) {
+    sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free);
+  }
+  OPENSSL_free(cache);
 }
 
-/*
- * g_x509_policy_cache_lock is used to protect against concurrent calls to
- * |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in
- * the |X509| structure, but |CRYPTO_once_t| isn't public.
- */
+// g_x509_policy_cache_lock is used to protect against concurrent calls to
+// |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in
+// the |X509| structure, but |CRYPTO_once_t| isn't public.
 static struct CRYPTO_STATIC_MUTEX g_x509_policy_cache_lock =
     CRYPTO_STATIC_MUTEX_INIT;
 
-const X509_POLICY_CACHE *policy_cache_set(X509 *x)
-{
-    X509_POLICY_CACHE *cache;
+const X509_POLICY_CACHE *policy_cache_set(X509 *x) {
+  X509_POLICY_CACHE *cache;
 
-    CRYPTO_STATIC_MUTEX_lock_read(&g_x509_policy_cache_lock);
-    cache = x->policy_cache;
-    CRYPTO_STATIC_MUTEX_unlock_read(&g_x509_policy_cache_lock);
+  CRYPTO_STATIC_MUTEX_lock_read(&g_x509_policy_cache_lock);
+  cache = x->policy_cache;
+  CRYPTO_STATIC_MUTEX_unlock_read(&g_x509_policy_cache_lock);
 
-    if (cache != NULL)
-        return cache;
-
-    CRYPTO_STATIC_MUTEX_lock_write(&g_x509_policy_cache_lock);
-    if (x->policy_cache == NULL)
-        policy_cache_new(x);
-    cache = x->policy_cache;
-    CRYPTO_STATIC_MUTEX_unlock_write(&g_x509_policy_cache_lock);
-
+  if (cache != NULL) {
     return cache;
+  }
+
+  CRYPTO_STATIC_MUTEX_lock_write(&g_x509_policy_cache_lock);
+  if (x->policy_cache == NULL) {
+    policy_cache_new(x);
+  }
+  cache = x->policy_cache;
+  CRYPTO_STATIC_MUTEX_unlock_write(&g_x509_policy_cache_lock);
+
+  return cache;
 }
 
 X509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache,
-                                         const ASN1_OBJECT *id)
-{
-    size_t idx;
-    X509_POLICY_DATA tmp;
+                                         const ASN1_OBJECT *id) {
+  size_t idx;
+  X509_POLICY_DATA tmp;
 
-    tmp.valid_policy = (ASN1_OBJECT *)id;
-    sk_X509_POLICY_DATA_sort(cache->data);
-    if (!sk_X509_POLICY_DATA_find(cache->data, &idx, &tmp))
-        return NULL;
-    return sk_X509_POLICY_DATA_value(cache->data, idx);
+  tmp.valid_policy = (ASN1_OBJECT *)id;
+  sk_X509_POLICY_DATA_sort(cache->data);
+  if (!sk_X509_POLICY_DATA_find(cache->data, &idx, &tmp)) {
+    return NULL;
+  }
+  return sk_X509_POLICY_DATA_value(cache->data, idx);
 }
 
 static int policy_data_cmp(const X509_POLICY_DATA **a,
-                           const X509_POLICY_DATA **b)
-{
-    return OBJ_cmp((*a)->valid_policy, (*b)->valid_policy);
+                           const X509_POLICY_DATA **b) {
+  return OBJ_cmp((*a)->valid_policy, (*b)->valid_policy);
 }
 
-static int policy_cache_set_int(long *out, ASN1_INTEGER *value)
-{
-    if (value == NULL)
-        return 1;
-    if (value->type == V_ASN1_NEG_INTEGER)
-        return 0;
-    *out = ASN1_INTEGER_get(value);
+static int policy_cache_set_int(long *out, ASN1_INTEGER *value) {
+  if (value == NULL) {
     return 1;
+  }
+  if (value->type == V_ASN1_NEG_INTEGER) {
+    return 0;
+  }
+  *out = ASN1_INTEGER_get(value);
+  return 1;
 }
diff --git a/src/crypto/x509v3/pcy_data.c b/src/crypto/x509v3/pcy_data.c
index f83795d..28a572f 100644
--- a/src/crypto/x509v3/pcy_data.c
+++ b/src/crypto/x509v3/pcy_data.c
@@ -64,69 +64,71 @@
 
 #include "internal.h"
 
-/* Policy Node routines */
+// Policy Node routines
 
-void policy_data_free(X509_POLICY_DATA *data)
-{
-    ASN1_OBJECT_free(data->valid_policy);
-    /* Don't free qualifiers if shared */
-    if (!(data->flags & POLICY_DATA_FLAG_SHARED_QUALIFIERS))
-        sk_POLICYQUALINFO_pop_free(data->qualifier_set, POLICYQUALINFO_free);
-    sk_ASN1_OBJECT_pop_free(data->expected_policy_set, ASN1_OBJECT_free);
-    OPENSSL_free(data);
+void policy_data_free(X509_POLICY_DATA *data) {
+  ASN1_OBJECT_free(data->valid_policy);
+  // Don't free qualifiers if shared
+  if (!(data->flags & POLICY_DATA_FLAG_SHARED_QUALIFIERS)) {
+    sk_POLICYQUALINFO_pop_free(data->qualifier_set, POLICYQUALINFO_free);
+  }
+  sk_ASN1_OBJECT_pop_free(data->expected_policy_set, ASN1_OBJECT_free);
+  OPENSSL_free(data);
 }
 
-/*
- * Create a data based on an existing policy. If 'id' is NULL use the oid in
- * the policy, otherwise use 'id'. This behaviour covers the two types of
- * data in RFC 3280: data with from a CertificatePolcies extension and
- * additional data with just the qualifiers of anyPolicy and ID from another
- * source.
- */
+// Create a data based on an existing policy. If 'id' is NULL use the oid in
+// the policy, otherwise use 'id'. This behaviour covers the two types of
+// data in RFC 3280: data with from a CertificatePolcies extension and
+// additional data with just the qualifiers of anyPolicy and ID from another
+// source.
 
-X509_POLICY_DATA *policy_data_new(POLICYINFO *policy,
-                                  const ASN1_OBJECT *cid, int crit)
-{
-    X509_POLICY_DATA *ret;
-    ASN1_OBJECT *id;
-    if (!policy && !cid)
-        return NULL;
-    if (cid) {
-        id = OBJ_dup(cid);
-        if (!id)
-            return NULL;
-    } else
-        id = NULL;
-    ret = OPENSSL_malloc(sizeof(X509_POLICY_DATA));
-    if (!ret) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        ASN1_OBJECT_free(id);
-        return NULL;
+X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *cid,
+                                  int crit) {
+  X509_POLICY_DATA *ret;
+  ASN1_OBJECT *id;
+  if (!policy && !cid) {
+    return NULL;
+  }
+  if (cid) {
+    id = OBJ_dup(cid);
+    if (!id) {
+      return NULL;
     }
-    ret->expected_policy_set = sk_ASN1_OBJECT_new_null();
-    if (!ret->expected_policy_set) {
-        OPENSSL_free(ret);
-        ASN1_OBJECT_free(id);
-        return NULL;
-    }
+  } else {
+    id = NULL;
+  }
+  ret = OPENSSL_malloc(sizeof(X509_POLICY_DATA));
+  if (!ret) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    ASN1_OBJECT_free(id);
+    return NULL;
+  }
+  ret->expected_policy_set = sk_ASN1_OBJECT_new_null();
+  if (!ret->expected_policy_set) {
+    OPENSSL_free(ret);
+    ASN1_OBJECT_free(id);
+    return NULL;
+  }
 
-    if (crit)
-        ret->flags = POLICY_DATA_FLAG_CRITICAL;
-    else
-        ret->flags = 0;
+  if (crit) {
+    ret->flags = POLICY_DATA_FLAG_CRITICAL;
+  } else {
+    ret->flags = 0;
+  }
 
-    if (id)
-        ret->valid_policy = id;
-    else {
-        ret->valid_policy = policy->policyid;
-        policy->policyid = NULL;
-    }
+  if (id) {
+    ret->valid_policy = id;
+  } else {
+    ret->valid_policy = policy->policyid;
+    policy->policyid = NULL;
+  }
 
-    if (policy) {
-        ret->qualifier_set = policy->qualifiers;
-        policy->qualifiers = NULL;
-    } else
-        ret->qualifier_set = NULL;
+  if (policy) {
+    ret->qualifier_set = policy->qualifiers;
+    policy->qualifiers = NULL;
+  } else {
+    ret->qualifier_set = NULL;
+  }
 
-    return ret;
+  return ret;
 }
diff --git a/src/crypto/x509v3/pcy_lib.c b/src/crypto/x509v3/pcy_lib.c
deleted file mode 100644
index 3b752dd..0000000
--- a/src/crypto/x509v3/pcy_lib.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* pcy_lib.c */
-/*
- * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
- * 2004.
- */
-/* ====================================================================
- * Copyright (c) 2004 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com). */
-
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-
-#include "internal.h"
-
-/* accessor functions */
-
-/* X509_POLICY_TREE stuff */
-
-int X509_policy_tree_level_count(const X509_POLICY_TREE *tree)
-{
-    if (!tree)
-        return 0;
-    return tree->nlevel;
-}
-
-X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree,
-                                               int i)
-{
-    if (!tree || (i < 0) || (i >= tree->nlevel))
-        return NULL;
-    return tree->levels + i;
-}
-
-STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const
-                                                           X509_POLICY_TREE
-                                                           *tree)
-{
-    if (!tree)
-        return NULL;
-    return tree->auth_policies;
-}
-
-STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const
-                                                                X509_POLICY_TREE
-                                                                *tree)
-{
-    if (!tree)
-        return NULL;
-    if (tree->flags & POLICY_FLAG_ANY_POLICY)
-        return tree->auth_policies;
-    else
-        return tree->user_policies;
-}
-
-/* X509_POLICY_LEVEL stuff */
-
-int X509_policy_level_node_count(X509_POLICY_LEVEL *level)
-{
-    int n;
-    if (!level)
-        return 0;
-    if (level->anyPolicy)
-        n = 1;
-    else
-        n = 0;
-    if (level->nodes)
-        n += sk_X509_POLICY_NODE_num(level->nodes);
-    return n;
-}
-
-X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, int i)
-{
-    if (!level)
-        return NULL;
-    if (level->anyPolicy) {
-        if (i == 0)
-            return level->anyPolicy;
-        i--;
-    }
-    return sk_X509_POLICY_NODE_value(level->nodes, i);
-}
-
-/* X509_POLICY_NODE stuff */
-
-const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node)
-{
-    if (!node)
-        return NULL;
-    return node->data->valid_policy;
-}
-
-STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const
-                                                           X509_POLICY_NODE
-                                                           *node)
-{
-    if (!node)
-        return NULL;
-    return node->data->qualifier_set;
-}
-
-const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE
-                                                     *node)
-{
-    if (!node)
-        return NULL;
-    return node->parent;
-}
diff --git a/src/crypto/x509v3/pcy_map.c b/src/crypto/x509v3/pcy_map.c
index c96777f..e4fa9a1 100644
--- a/src/crypto/x509v3/pcy_map.c
+++ b/src/crypto/x509v3/pcy_map.c
@@ -64,68 +64,66 @@
 #include "../x509/internal.h"
 #include "internal.h"
 
-/*
- * Set policy mapping entries in cache. Note: this modifies the passed
- * POLICY_MAPPINGS structure
- */
+// Set policy mapping entries in cache. Note: this modifies the passed
+// POLICY_MAPPINGS structure
 
-int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps)
-{
-    POLICY_MAPPING *map;
-    X509_POLICY_DATA *data;
-    X509_POLICY_CACHE *cache = x->policy_cache;
-    size_t i;
-    int ret = 0;
-    if (sk_POLICY_MAPPING_num(maps) == 0) {
-        ret = -1;
+int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) {
+  POLICY_MAPPING *map;
+  X509_POLICY_DATA *data;
+  X509_POLICY_CACHE *cache = x->policy_cache;
+  size_t i;
+  int ret = 0;
+  if (sk_POLICY_MAPPING_num(maps) == 0) {
+    ret = -1;
+    goto bad_mapping;
+  }
+  for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) {
+    map = sk_POLICY_MAPPING_value(maps, i);
+    // Reject if map to or from anyPolicy
+    if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy) ||
+        (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) {
+      ret = -1;
+      goto bad_mapping;
+    }
+
+    // Attempt to find matching policy data
+    data = policy_cache_find_data(cache, map->issuerDomainPolicy);
+    // If we don't have anyPolicy can't map
+    if (!data && !cache->anyPolicy) {
+      continue;
+    }
+
+    // Create a NODE from anyPolicy
+    if (!data) {
+      data =
+          policy_data_new(NULL, map->issuerDomainPolicy,
+                          cache->anyPolicy->flags & POLICY_DATA_FLAG_CRITICAL);
+      if (!data) {
         goto bad_mapping;
+      }
+      data->qualifier_set = cache->anyPolicy->qualifier_set;
+      // map->issuerDomainPolicy = NULL;
+      data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
+      data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
+      if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
+        policy_data_free(data);
+        goto bad_mapping;
+      }
+    } else {
+      data->flags |= POLICY_DATA_FLAG_MAPPED;
     }
-    for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) {
-        map = sk_POLICY_MAPPING_value(maps, i);
-        /* Reject if map to or from anyPolicy */
-        if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy)
-            || (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) {
-            ret = -1;
-            goto bad_mapping;
-        }
-
-        /* Attempt to find matching policy data */
-        data = policy_cache_find_data(cache, map->issuerDomainPolicy);
-        /* If we don't have anyPolicy can't map */
-        if (!data && !cache->anyPolicy)
-            continue;
-
-        /* Create a NODE from anyPolicy */
-        if (!data) {
-            data = policy_data_new(NULL, map->issuerDomainPolicy,
-                                   cache->anyPolicy->flags
-                                   & POLICY_DATA_FLAG_CRITICAL);
-            if (!data)
-                goto bad_mapping;
-            data->qualifier_set = cache->anyPolicy->qualifier_set;
-            /*
-             * map->issuerDomainPolicy = NULL;
-             */
-            data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
-            data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
-            if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
-                policy_data_free(data);
-                goto bad_mapping;
-            }
-        } else
-            data->flags |= POLICY_DATA_FLAG_MAPPED;
-        if (!sk_ASN1_OBJECT_push(data->expected_policy_set,
-                                 map->subjectDomainPolicy))
-            goto bad_mapping;
-        map->subjectDomainPolicy = NULL;
-
+    if (!sk_ASN1_OBJECT_push(data->expected_policy_set,
+                             map->subjectDomainPolicy)) {
+      goto bad_mapping;
     }
+    map->subjectDomainPolicy = NULL;
+  }
 
-    ret = 1;
- bad_mapping:
-    if (ret == -1)
-        x->ex_flags |= EXFLAG_INVALID_POLICY;
-    sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
-    return ret;
-
+  ret = 1;
+bad_mapping:
+  if (ret == -1) {
+    x->ex_flags |= EXFLAG_INVALID_POLICY;
+  }
+  sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
+  return ret;
 }
diff --git a/src/crypto/x509v3/pcy_node.c b/src/crypto/x509v3/pcy_node.c
index aa28056..71847f3 100644
--- a/src/crypto/x509v3/pcy_node.c
+++ b/src/crypto/x509v3/pcy_node.c
@@ -63,127 +63,125 @@
 
 #include "internal.h"
 
-static int node_cmp(const X509_POLICY_NODE **a, const X509_POLICY_NODE **b)
-{
-    return OBJ_cmp((*a)->data->valid_policy, (*b)->data->valid_policy);
+static int node_cmp(const X509_POLICY_NODE **a, const X509_POLICY_NODE **b) {
+  return OBJ_cmp((*a)->data->valid_policy, (*b)->data->valid_policy);
 }
 
-STACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void)
-{
-    return sk_X509_POLICY_NODE_new(node_cmp);
+STACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void) {
+  return sk_X509_POLICY_NODE_new(node_cmp);
 }
 
 X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes,
-                               const ASN1_OBJECT *id)
-{
-    X509_POLICY_DATA n;
-    X509_POLICY_NODE l;
-    size_t idx;
+                               const ASN1_OBJECT *id) {
+  X509_POLICY_DATA n;
+  X509_POLICY_NODE l;
+  size_t idx;
 
-    n.valid_policy = (ASN1_OBJECT *)id;
-    l.data = &n;
+  n.valid_policy = (ASN1_OBJECT *)id;
+  l.data = &n;
 
-    sk_X509_POLICY_NODE_sort(nodes);
-    if (!sk_X509_POLICY_NODE_find(nodes, &idx, &l))
-        return NULL;
+  sk_X509_POLICY_NODE_sort(nodes);
+  if (!sk_X509_POLICY_NODE_find(nodes, &idx, &l)) {
+    return NULL;
+  }
 
-    return sk_X509_POLICY_NODE_value(nodes, idx);
-
+  return sk_X509_POLICY_NODE_value(nodes, idx);
 }
 
 X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level,
                                   const X509_POLICY_NODE *parent,
-                                  const ASN1_OBJECT *id)
-{
-    X509_POLICY_NODE *node;
-    size_t i;
-    for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
-        node = sk_X509_POLICY_NODE_value(level->nodes, i);
-        if (node->parent == parent) {
-            if (!OBJ_cmp(node->data->valid_policy, id))
-                return node;
-        }
+                                  const ASN1_OBJECT *id) {
+  X509_POLICY_NODE *node;
+  size_t i;
+  for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) {
+    node = sk_X509_POLICY_NODE_value(level->nodes, i);
+    if (node->parent == parent) {
+      if (!OBJ_cmp(node->data->valid_policy, id)) {
+        return node;
+      }
     }
-    return NULL;
+  }
+  return NULL;
 }
 
 X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
                                  X509_POLICY_DATA *data,
                                  X509_POLICY_NODE *parent,
-                                 X509_POLICY_TREE *tree)
-{
-    X509_POLICY_NODE *node;
-    node = OPENSSL_malloc(sizeof(X509_POLICY_NODE));
-    if (!node)
-        return NULL;
-    node->data = data;
-    node->parent = parent;
-    node->nchild = 0;
-    if (level) {
-        if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
-            if (level->anyPolicy)
-                goto node_error;
-            level->anyPolicy = node;
-        } else {
-
-            if (!level->nodes)
-                level->nodes = policy_node_cmp_new();
-            if (!level->nodes)
-                goto node_error;
-            if (!sk_X509_POLICY_NODE_push(level->nodes, node))
-                goto node_error;
-        }
+                                 X509_POLICY_TREE *tree) {
+  X509_POLICY_NODE *node;
+  node = OPENSSL_malloc(sizeof(X509_POLICY_NODE));
+  if (!node) {
+    return NULL;
+  }
+  node->data = data;
+  node->parent = parent;
+  node->nchild = 0;
+  if (level) {
+    if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
+      if (level->anyPolicy) {
+        goto node_error;
+      }
+      level->anyPolicy = node;
+    } else {
+      if (!level->nodes) {
+        level->nodes = policy_node_cmp_new();
+      }
+      if (!level->nodes) {
+        goto node_error;
+      }
+      if (!sk_X509_POLICY_NODE_push(level->nodes, node)) {
+        goto node_error;
+      }
     }
+  }
 
-    if (tree) {
-        if (!tree->extra_data)
-            tree->extra_data = sk_X509_POLICY_DATA_new_null();
-        if (!tree->extra_data)
-            goto node_error;
-        if (!sk_X509_POLICY_DATA_push(tree->extra_data, data))
-            goto node_error;
+  if (tree) {
+    if (!tree->extra_data) {
+      tree->extra_data = sk_X509_POLICY_DATA_new_null();
     }
+    if (!tree->extra_data) {
+      goto node_error;
+    }
+    if (!sk_X509_POLICY_DATA_push(tree->extra_data, data)) {
+      goto node_error;
+    }
+  }
 
-    if (parent)
-        parent->nchild++;
+  if (parent) {
+    parent->nchild++;
+  }
 
-    return node;
+  return node;
 
- node_error:
-    policy_node_free(node);
-    return 0;
-
+node_error:
+  policy_node_free(node);
+  return 0;
 }
 
-void policy_node_free(X509_POLICY_NODE *node)
-{
-    OPENSSL_free(node);
-}
+void policy_node_free(X509_POLICY_NODE *node) { OPENSSL_free(node); }
 
-/*
- * See if a policy node matches a policy OID. If mapping enabled look through
- * expected policy set otherwise just valid policy.
- */
+// See if a policy node matches a policy OID. If mapping enabled look through
+// expected policy set otherwise just valid policy.
 
 int policy_node_match(const X509_POLICY_LEVEL *lvl,
-                      const X509_POLICY_NODE *node, const ASN1_OBJECT *oid)
-{
-    size_t i;
-    ASN1_OBJECT *policy_oid;
-    const X509_POLICY_DATA *x = node->data;
+                      const X509_POLICY_NODE *node, const ASN1_OBJECT *oid) {
+  size_t i;
+  ASN1_OBJECT *policy_oid;
+  const X509_POLICY_DATA *x = node->data;
 
-    if ((lvl->flags & X509_V_FLAG_INHIBIT_MAP)
-        || !(x->flags & POLICY_DATA_FLAG_MAP_MASK)) {
-        if (!OBJ_cmp(x->valid_policy, oid))
-            return 1;
-        return 0;
-    }
-
-    for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++) {
-        policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i);
-        if (!OBJ_cmp(policy_oid, oid))
-            return 1;
+  if ((lvl->flags & X509_V_FLAG_INHIBIT_MAP) ||
+      !(x->flags & POLICY_DATA_FLAG_MAP_MASK)) {
+    if (!OBJ_cmp(x->valid_policy, oid)) {
+      return 1;
     }
     return 0;
+  }
 
+  for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++) {
+    policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i);
+    if (!OBJ_cmp(policy_oid, oid)) {
+      return 1;
+    }
+  }
+  return 0;
 }
diff --git a/src/crypto/x509v3/pcy_tree.c b/src/crypto/x509v3/pcy_tree.c
index 9e65528..44ade30 100644
--- a/src/crypto/x509v3/pcy_tree.c
+++ b/src/crypto/x509v3/pcy_tree.c
@@ -69,406 +69,397 @@
 #include "../x509/internal.h"
 #include "internal.h"
 
-/*
- * Enable this to print out the complete policy tree at various point during
- * evaluation.
- */
+// Enable this to print out the complete policy tree at various point during
+// evaluation.
 
-/*
- * #define OPENSSL_POLICY_DEBUG
- */
+// #define OPENSSL_POLICY_DEBUG
 
 #ifdef OPENSSL_POLICY_DEBUG
 
 static void expected_print(BIO *err, X509_POLICY_LEVEL *lev,
-                           X509_POLICY_NODE *node, int indent)
-{
-    if ((lev->flags & X509_V_FLAG_INHIBIT_MAP)
-        || !(node->data->flags & POLICY_DATA_FLAG_MAP_MASK))
-        BIO_puts(err, "  Not Mapped\n");
-    else {
-        int i;
-        STACK_OF(ASN1_OBJECT) *pset = node->data->expected_policy_set;
-        ASN1_OBJECT *oid;
-        BIO_puts(err, "  Expected: ");
-        for (i = 0; i < sk_ASN1_OBJECT_num(pset); i++) {
-            oid = sk_ASN1_OBJECT_value(pset, i);
-            if (i)
-                BIO_puts(err, ", ");
-            i2a_ASN1_OBJECT(err, oid);
-        }
-        BIO_puts(err, "\n");
+                           X509_POLICY_NODE *node, int indent) {
+  if ((lev->flags & X509_V_FLAG_INHIBIT_MAP) ||
+      !(node->data->flags & POLICY_DATA_FLAG_MAP_MASK)) {
+    BIO_puts(err, "  Not Mapped\n");
+  } else {
+    int i;
+    STACK_OF(ASN1_OBJECT) *pset = node->data->expected_policy_set;
+    ASN1_OBJECT *oid;
+    BIO_puts(err, "  Expected: ");
+    for (i = 0; i < sk_ASN1_OBJECT_num(pset); i++) {
+      oid = sk_ASN1_OBJECT_value(pset, i);
+      if (i) {
+        BIO_puts(err, ", ");
+      }
+      i2a_ASN1_OBJECT(err, oid);
     }
+    BIO_puts(err, "\n");
+  }
 }
 
 static void tree_print(char *str, X509_POLICY_TREE *tree,
-                       X509_POLICY_LEVEL *curr)
-{
-    X509_POLICY_LEVEL *plev;
-    X509_POLICY_NODE *node;
-    int i;
-    BIO *err;
-    err = BIO_new_fp(stderr, BIO_NOCLOSE);
-    if (!curr)
-        curr = tree->levels + tree->nlevel;
-    else
-        curr++;
-    BIO_printf(err, "Level print after %s\n", str);
-    BIO_printf(err, "Printing Up to Level %ld\n", curr - tree->levels);
-    for (plev = tree->levels; plev != curr; plev++) {
-        BIO_printf(err, "Level %ld, flags = %x\n",
-                   plev - tree->levels, plev->flags);
-        for (i = 0; i < sk_X509_POLICY_NODE_num(plev->nodes); i++) {
-            node = sk_X509_POLICY_NODE_value(plev->nodes, i);
-            X509_POLICY_NODE_print(err, node, 2);
-            expected_print(err, plev, node, 2);
-            BIO_printf(err, "  Flags: %x\n", node->data->flags);
-        }
-        if (plev->anyPolicy)
-            X509_POLICY_NODE_print(err, plev->anyPolicy, 2);
+                       X509_POLICY_LEVEL *curr) {
+  X509_POLICY_LEVEL *plev;
+  X509_POLICY_NODE *node;
+  int i;
+  BIO *err;
+  err = BIO_new_fp(stderr, BIO_NOCLOSE);
+  if (!curr) {
+    curr = tree->levels + tree->nlevel;
+  } else {
+    curr++;
+  }
+  BIO_printf(err, "Level print after %s\n", str);
+  BIO_printf(err, "Printing Up to Level %ld\n", curr - tree->levels);
+  for (plev = tree->levels; plev != curr; plev++) {
+    BIO_printf(err, "Level %ld, flags = %x\n", plev - tree->levels,
+               plev->flags);
+    for (i = 0; i < sk_X509_POLICY_NODE_num(plev->nodes); i++) {
+      node = sk_X509_POLICY_NODE_value(plev->nodes, i);
+      X509_POLICY_NODE_print(err, node, 2);
+      expected_print(err, plev, node, 2);
+      BIO_printf(err, "  Flags: %x\n", node->data->flags);
     }
+    if (plev->anyPolicy) {
+      X509_POLICY_NODE_print(err, plev->anyPolicy, 2);
+    }
+  }
 
-    BIO_free(err);
-
+  BIO_free(err);
 }
 #else
 
-# define tree_print(a,b,c)      /* */
+#define tree_print(a, b, c)  //
 
 #endif
 
-/*-
- * Initialize policy tree. Return values:
- *  0 Some internal error occurred.
- * -1 Inconsistent or invalid extensions in certificates.
- *  1 Tree initialized OK.
- *  2 Policy tree is empty.
- *  5 Tree OK and requireExplicitPolicy true.
- *  6 Tree empty and requireExplicitPolicy true.
- */
+//-
+// Initialize policy tree. Return values:
+//  0 Some internal error occurred.
+// -1 Inconsistent or invalid extensions in certificates.
+//  1 Tree initialized OK.
+//  2 Policy tree is empty.
+//  5 Tree OK and requireExplicitPolicy true.
+//  6 Tree empty and requireExplicitPolicy true.
 
 static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
-                     unsigned int flags)
-{
-    X509_POLICY_TREE *tree;
-    X509_POLICY_LEVEL *level;
-    const X509_POLICY_CACHE *cache;
-    X509_POLICY_DATA *data = NULL;
-    X509 *x;
-    int ret = 1;
-    int i, n;
-    int explicit_policy;
-    int any_skip;
-    int map_skip;
-    *ptree = NULL;
-    n = sk_X509_num(certs);
+                     unsigned int flags) {
+  X509_POLICY_TREE *tree;
+  X509_POLICY_LEVEL *level;
+  const X509_POLICY_CACHE *cache;
+  X509_POLICY_DATA *data = NULL;
+  X509 *x;
+  int ret = 1;
+  int i, n;
+  int explicit_policy;
+  int any_skip;
+  int map_skip;
+  *ptree = NULL;
+  n = sk_X509_num(certs);
 
 #if 0
-    /* Disable policy mapping for now... */
+    // Disable policy mapping for now...
     flags |= X509_V_FLAG_INHIBIT_MAP;
 #endif
 
-    if (flags & X509_V_FLAG_EXPLICIT_POLICY)
-        explicit_policy = 0;
-    else
-        explicit_policy = n + 1;
+  if (flags & X509_V_FLAG_EXPLICIT_POLICY) {
+    explicit_policy = 0;
+  } else {
+    explicit_policy = n + 1;
+  }
 
-    if (flags & X509_V_FLAG_INHIBIT_ANY)
-        any_skip = 0;
-    else
-        any_skip = n + 1;
+  if (flags & X509_V_FLAG_INHIBIT_ANY) {
+    any_skip = 0;
+  } else {
+    any_skip = n + 1;
+  }
 
-    if (flags & X509_V_FLAG_INHIBIT_MAP)
-        map_skip = 0;
-    else
-        map_skip = n + 1;
+  if (flags & X509_V_FLAG_INHIBIT_MAP) {
+    map_skip = 0;
+  } else {
+    map_skip = n + 1;
+  }
 
-    /* Can't do anything with just a trust anchor */
-    if (n == 1)
-        return 1;
-    /*
-     * First setup policy cache in all certificates apart from the trust
-     * anchor. Note any bad cache results on the way. Also can calculate
-     * explicit_policy value at this point.
-     */
-    for (i = n - 2; i >= 0; i--) {
-        x = sk_X509_value(certs, i);
-        X509_check_purpose(x, -1, -1);
-        cache = policy_cache_set(x);
-        /* If cache NULL something bad happened: return immediately */
-        if (cache == NULL)
-            return 0;
-        /*
-         * If inconsistent extensions keep a note of it but continue
-         */
-        if (x->ex_flags & EXFLAG_INVALID_POLICY)
-            ret = -1;
-        /*
-         * Otherwise if we have no data (hence no CertificatePolicies) and
-         * haven't already set an inconsistent code note it.
-         */
-        else if ((ret == 1) && !cache->data)
-            ret = 2;
-        if (explicit_policy > 0) {
-            if (!(x->ex_flags & EXFLAG_SI))
-                explicit_policy--;
-            if ((cache->explicit_skip != -1)
-                && (cache->explicit_skip < explicit_policy))
-                explicit_policy = cache->explicit_skip;
-        }
+  // Can't do anything with just a trust anchor
+  if (n == 1) {
+    return 1;
+  }
+  // First setup policy cache in all certificates apart from the trust
+  // anchor. Note any bad cache results on the way. Also can calculate
+  // explicit_policy value at this point.
+  for (i = n - 2; i >= 0; i--) {
+    x = sk_X509_value(certs, i);
+    X509_check_purpose(x, -1, -1);
+    cache = policy_cache_set(x);
+    // If cache NULL something bad happened: return immediately
+    if (cache == NULL) {
+      return 0;
     }
-
-    if (ret != 1) {
-        if (ret == 2 && !explicit_policy)
-            return 6;
-        return ret;
+    // If inconsistent extensions keep a note of it but continue
+    if (x->ex_flags & EXFLAG_INVALID_POLICY) {
+      ret = -1;
     }
-
-    /* If we get this far initialize the tree */
-
-    tree = OPENSSL_malloc(sizeof(X509_POLICY_TREE));
-
-    if (!tree)
-        return 0;
-
-    tree->flags = 0;
-    tree->levels = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL) * n);
-    tree->nlevel = 0;
-    tree->extra_data = NULL;
-    tree->auth_policies = NULL;
-    tree->user_policies = NULL;
-
-    if (!tree->levels) {
-        OPENSSL_free(tree);
-        return 0;
+    // Otherwise if we have no data (hence no CertificatePolicies) and
+    // haven't already set an inconsistent code note it.
+    else if ((ret == 1) && !cache->data) {
+      ret = 2;
     }
-
-    OPENSSL_memset(tree->levels, 0, n * sizeof(X509_POLICY_LEVEL));
-
-    tree->nlevel = n;
-
-    level = tree->levels;
-
-    /* Root data: initialize to anyPolicy */
-
-    data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0);
-
-    if (!data || !level_add_node(level, data, NULL, tree))
-        goto bad_tree;
-
-    for (i = n - 2; i >= 0; i--) {
-        level++;
-        x = sk_X509_value(certs, i);
-        cache = policy_cache_set(x);
-        X509_up_ref(x);
-        level->cert = x;
-
-        if (!cache->anyPolicy)
-            level->flags |= X509_V_FLAG_INHIBIT_ANY;
-
-        /* Determine inhibit any and inhibit map flags */
-        if (any_skip == 0) {
-            /*
-             * Any matching allowed if certificate is self issued and not the
-             * last in the chain.
-             */
-            if (!(x->ex_flags & EXFLAG_SI) || (i == 0))
-                level->flags |= X509_V_FLAG_INHIBIT_ANY;
-        } else {
-            if (!(x->ex_flags & EXFLAG_SI))
-                any_skip--;
-            if ((cache->any_skip >= 0)
-                && (cache->any_skip < any_skip))
-                any_skip = cache->any_skip;
-        }
-
-        if (map_skip == 0)
-            level->flags |= X509_V_FLAG_INHIBIT_MAP;
-        else {
-            if (!(x->ex_flags & EXFLAG_SI))
-                map_skip--;
-            if ((cache->map_skip >= 0)
-                && (cache->map_skip < map_skip))
-                map_skip = cache->map_skip;
-        }
-
+    if (explicit_policy > 0) {
+      if (!(x->ex_flags & EXFLAG_SI)) {
+        explicit_policy--;
+      }
+      if ((cache->explicit_skip != -1) &&
+          (cache->explicit_skip < explicit_policy)) {
+        explicit_policy = cache->explicit_skip;
+      }
     }
+  }
 
-    *ptree = tree;
+  if (ret != 1) {
+    if (ret == 2 && !explicit_policy) {
+      return 6;
+    }
+    return ret;
+  }
 
-    if (explicit_policy)
-        return 1;
-    else
-        return 5;
+  // If we get this far initialize the tree
 
- bad_tree:
+  tree = OPENSSL_malloc(sizeof(X509_POLICY_TREE));
 
-    X509_policy_tree_free(tree);
-
+  if (!tree) {
     return 0;
+  }
 
+  tree->flags = 0;
+  tree->levels = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL) * n);
+  tree->nlevel = 0;
+  tree->extra_data = NULL;
+  tree->auth_policies = NULL;
+  tree->user_policies = NULL;
+
+  if (!tree->levels) {
+    OPENSSL_free(tree);
+    return 0;
+  }
+
+  OPENSSL_memset(tree->levels, 0, n * sizeof(X509_POLICY_LEVEL));
+
+  tree->nlevel = n;
+
+  level = tree->levels;
+
+  // Root data: initialize to anyPolicy
+
+  data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0);
+
+  if (!data || !level_add_node(level, data, NULL, tree)) {
+    goto bad_tree;
+  }
+
+  for (i = n - 2; i >= 0; i--) {
+    level++;
+    x = sk_X509_value(certs, i);
+    cache = policy_cache_set(x);
+    X509_up_ref(x);
+    level->cert = x;
+
+    if (!cache->anyPolicy) {
+      level->flags |= X509_V_FLAG_INHIBIT_ANY;
+    }
+
+    // Determine inhibit any and inhibit map flags
+    if (any_skip == 0) {
+      // Any matching allowed if certificate is self issued and not the
+      // last in the chain.
+      if (!(x->ex_flags & EXFLAG_SI) || (i == 0)) {
+        level->flags |= X509_V_FLAG_INHIBIT_ANY;
+      }
+    } else {
+      if (!(x->ex_flags & EXFLAG_SI)) {
+        any_skip--;
+      }
+      if ((cache->any_skip >= 0) && (cache->any_skip < any_skip)) {
+        any_skip = cache->any_skip;
+      }
+    }
+
+    if (map_skip == 0) {
+      level->flags |= X509_V_FLAG_INHIBIT_MAP;
+    } else {
+      if (!(x->ex_flags & EXFLAG_SI)) {
+        map_skip--;
+      }
+      if ((cache->map_skip >= 0) && (cache->map_skip < map_skip)) {
+        map_skip = cache->map_skip;
+      }
+    }
+  }
+
+  *ptree = tree;
+
+  if (explicit_policy) {
+    return 1;
+  } else {
+    return 5;
+  }
+
+bad_tree:
+
+  X509_policy_tree_free(tree);
+
+  return 0;
 }
 
 static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
-                                    X509_POLICY_DATA *data)
-{
-    X509_POLICY_LEVEL *last = curr - 1;
-    X509_POLICY_NODE *node;
-    int matched = 0;
-    size_t i;
-    /* Iterate through all in nodes linking matches */
-    for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) {
-        node = sk_X509_POLICY_NODE_value(last->nodes, i);
-        if (policy_node_match(last, node, data->valid_policy)) {
-            if (!level_add_node(curr, data, node, NULL))
-                return 0;
-            matched = 1;
-        }
+                                    X509_POLICY_DATA *data) {
+  X509_POLICY_LEVEL *last = curr - 1;
+  X509_POLICY_NODE *node;
+  int matched = 0;
+  size_t i;
+  // Iterate through all in nodes linking matches
+  for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) {
+    node = sk_X509_POLICY_NODE_value(last->nodes, i);
+    if (policy_node_match(last, node, data->valid_policy)) {
+      if (!level_add_node(curr, data, node, NULL)) {
+        return 0;
+      }
+      matched = 1;
     }
-    if (!matched && last->anyPolicy) {
-        if (!level_add_node(curr, data, last->anyPolicy, NULL))
-            return 0;
+  }
+  if (!matched && last->anyPolicy) {
+    if (!level_add_node(curr, data, last->anyPolicy, NULL)) {
+      return 0;
     }
-    return 1;
+  }
+  return 1;
 }
 
-/*
- * This corresponds to RFC 3280 6.1.3(d)(1): link any data from
- * CertificatePolicies onto matching parent or anyPolicy if no match.
- */
+// This corresponds to RFC 3280 6.1.3(d)(1): link any data from
+// CertificatePolicies onto matching parent or anyPolicy if no match.
 
 static int tree_link_nodes(X509_POLICY_LEVEL *curr,
-                           const X509_POLICY_CACHE *cache)
-{
-    size_t i;
-    X509_POLICY_DATA *data;
+                           const X509_POLICY_CACHE *cache) {
+  size_t i;
+  X509_POLICY_DATA *data;
 
-    for (i = 0; i < sk_X509_POLICY_DATA_num(cache->data); i++) {
-        data = sk_X509_POLICY_DATA_value(cache->data, i);
-        /*
-         * If a node is mapped any it doesn't have a corresponding
-         * CertificatePolicies entry. However such an identical node would
-         * be created if anyPolicy matching is enabled because there would be
-         * no match with the parent valid_policy_set. So we create link
-         * because then it will have the mapping flags right and we can prune
-         * it later.
-         */
+  for (i = 0; i < sk_X509_POLICY_DATA_num(cache->data); i++) {
+    data = sk_X509_POLICY_DATA_value(cache->data, i);
+    // If a node is mapped any it doesn't have a corresponding
+    // CertificatePolicies entry. However such an identical node would
+    // be created if anyPolicy matching is enabled because there would be
+    // no match with the parent valid_policy_set. So we create link
+    // because then it will have the mapping flags right and we can prune
+    // it later.
 #if 0
         if ((data->flags & POLICY_DATA_FLAG_MAPPED_ANY)
             && !(curr->flags & X509_V_FLAG_INHIBIT_ANY))
             continue;
 #endif
-        /* Look for matching nodes in previous level */
-        if (!tree_link_matching_nodes(curr, data))
-            return 0;
+    // Look for matching nodes in previous level
+    if (!tree_link_matching_nodes(curr, data)) {
+      return 0;
     }
-    return 1;
+  }
+  return 1;
 }
 
-/*
- * This corresponds to RFC 3280 6.1.3(d)(2): Create new data for any unmatched
- * policies in the parent and link to anyPolicy.
- */
+// This corresponds to RFC 3280 6.1.3(d)(2): Create new data for any unmatched
+// policies in the parent and link to anyPolicy.
 
 static int tree_add_unmatched(X509_POLICY_LEVEL *curr,
                               const X509_POLICY_CACHE *cache,
-                              const ASN1_OBJECT *id,
-                              X509_POLICY_NODE *node, X509_POLICY_TREE *tree)
-{
-    X509_POLICY_DATA *data;
-    if (id == NULL)
-        id = node->data->valid_policy;
-    /*
-     * Create a new node with qualifiers from anyPolicy and id from unmatched
-     * node.
-     */
-    data = policy_data_new(NULL, id, node_critical(node));
+                              const ASN1_OBJECT *id, X509_POLICY_NODE *node,
+                              X509_POLICY_TREE *tree) {
+  X509_POLICY_DATA *data;
+  if (id == NULL) {
+    id = node->data->valid_policy;
+  }
+  // Create a new node with qualifiers from anyPolicy and id from unmatched
+  // node.
+  data = policy_data_new(NULL, id, node_critical(node));
 
-    if (data == NULL)
-        return 0;
-    /* Curr may not have anyPolicy */
-    data->qualifier_set = cache->anyPolicy->qualifier_set;
-    data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
-    if (!level_add_node(curr, data, node, tree)) {
-        policy_data_free(data);
-        return 0;
-    }
+  if (data == NULL) {
+    return 0;
+  }
+  // Curr may not have anyPolicy
+  data->qualifier_set = cache->anyPolicy->qualifier_set;
+  data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
+  if (!level_add_node(curr, data, node, tree)) {
+    policy_data_free(data);
+    return 0;
+  }
 
-    return 1;
+  return 1;
 }
 
 static int tree_link_unmatched(X509_POLICY_LEVEL *curr,
                                const X509_POLICY_CACHE *cache,
-                               X509_POLICY_NODE *node, X509_POLICY_TREE *tree)
-{
-    const X509_POLICY_LEVEL *last = curr - 1;
-    size_t i;
+                               X509_POLICY_NODE *node, X509_POLICY_TREE *tree) {
+  const X509_POLICY_LEVEL *last = curr - 1;
+  size_t i;
 
-    if ((last->flags & X509_V_FLAG_INHIBIT_MAP)
-        || !(node->data->flags & POLICY_DATA_FLAG_MAPPED)) {
-        /* If no policy mapping: matched if one child present */
-        if (node->nchild)
-            return 1;
-        if (!tree_add_unmatched(curr, cache, NULL, node, tree))
-            return 0;
-        /* Add it */
-    } else {
-        /* If mapping: matched if one child per expected policy set */
-        STACK_OF(ASN1_OBJECT) *expset = node->data->expected_policy_set;
-        if ((size_t)node->nchild == sk_ASN1_OBJECT_num(expset))
-            return 1;
-        /* Locate unmatched nodes */
-        for (i = 0; i < sk_ASN1_OBJECT_num(expset); i++) {
-            ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(expset, i);
-            if (level_find_node(curr, node, oid))
-                continue;
-            if (!tree_add_unmatched(curr, cache, oid, node, tree))
-                return 0;
-        }
-
+  if ((last->flags & X509_V_FLAG_INHIBIT_MAP) ||
+      !(node->data->flags & POLICY_DATA_FLAG_MAPPED)) {
+    // If no policy mapping: matched if one child present
+    if (node->nchild) {
+      return 1;
     }
+    if (!tree_add_unmatched(curr, cache, NULL, node, tree)) {
+      return 0;
+    }
+    // Add it
+  } else {
+    // If mapping: matched if one child per expected policy set
+    STACK_OF(ASN1_OBJECT) *expset = node->data->expected_policy_set;
+    if ((size_t)node->nchild == sk_ASN1_OBJECT_num(expset)) {
+      return 1;
+    }
+    // Locate unmatched nodes
+    for (i = 0; i < sk_ASN1_OBJECT_num(expset); i++) {
+      ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(expset, i);
+      if (level_find_node(curr, node, oid)) {
+        continue;
+      }
+      if (!tree_add_unmatched(curr, cache, oid, node, tree)) {
+        return 0;
+      }
+    }
+  }
 
-    return 1;
-
+  return 1;
 }
 
 static int tree_link_any(X509_POLICY_LEVEL *curr,
                          const X509_POLICY_CACHE *cache,
-                         X509_POLICY_TREE *tree)
-{
-    size_t i;
-    /*
-     * X509_POLICY_DATA *data;
-     */
-    X509_POLICY_NODE *node;
-    X509_POLICY_LEVEL *last = curr - 1;
+                         X509_POLICY_TREE *tree) {
+  size_t i;
+  // X509_POLICY_DATA *data;
+  X509_POLICY_NODE *node;
+  X509_POLICY_LEVEL *last = curr - 1;
 
-    for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) {
-        node = sk_X509_POLICY_NODE_value(last->nodes, i);
+  for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) {
+    node = sk_X509_POLICY_NODE_value(last->nodes, i);
 
-        if (!tree_link_unmatched(curr, cache, node, tree))
-            return 0;
+    if (!tree_link_unmatched(curr, cache, node, tree)) {
+      return 0;
+    }
 
 #if 0
 
-        /*
-         * Skip any node with any children: we only want unmathced nodes.
-         * Note: need something better for policy mapping because each node
-         * may have multiple children
-         */
+        // Skip any node with any children: we only want unmathced nodes.
+        // Note: need something better for policy mapping because each node
+        // may have multiple children
         if (node->nchild)
             continue;
 
-        /*
-         * Create a new node with qualifiers from anyPolicy and id from
-         * unmatched node.
-         */
+        // Create a new node with qualifiers from anyPolicy and id from
+        // unmatched node.
         data = policy_data_new(NULL, node->data->valid_policy,
                                node_critical(node));
 
         if (data == NULL)
             return 0;
-        /* Curr may not have anyPolicy */
+        // Curr may not have anyPolicy
         data->qualifier_set = cache->anyPolicy->qualifier_set;
         data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
         if (!level_add_node(curr, data, node, tree)) {
@@ -476,368 +467,363 @@
             return 0;
         }
 #endif
-
+  }
+  // Finally add link to anyPolicy
+  if (last->anyPolicy) {
+    if (!level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL)) {
+      return 0;
     }
-    /* Finally add link to anyPolicy */
-    if (last->anyPolicy) {
-        if (!level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL))
-            return 0;
-    }
-    return 1;
+  }
+  return 1;
 }
 
-/*
- * Prune the tree: delete any child mapped child data on the current level
- * then proceed up the tree deleting any data with no children. If we ever
- * have no data on a level we can halt because the tree will be empty.
- */
+// Prune the tree: delete any child mapped child data on the current level
+// then proceed up the tree deleting any data with no children. If we ever
+// have no data on a level we can halt because the tree will be empty.
 
-static int tree_prune(X509_POLICY_TREE *tree, X509_POLICY_LEVEL *curr)
-{
-    STACK_OF(X509_POLICY_NODE) *nodes;
-    X509_POLICY_NODE *node;
-    int i;
+static int tree_prune(X509_POLICY_TREE *tree, X509_POLICY_LEVEL *curr) {
+  STACK_OF(X509_POLICY_NODE) *nodes;
+  X509_POLICY_NODE *node;
+  int i;
+  nodes = curr->nodes;
+  if (curr->flags & X509_V_FLAG_INHIBIT_MAP) {
+    for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) {
+      node = sk_X509_POLICY_NODE_value(nodes, i);
+      // Delete any mapped data: see RFC 3280 XXXX
+      if (node->data->flags & POLICY_DATA_FLAG_MAP_MASK) {
+        node->parent->nchild--;
+        OPENSSL_free(node);
+        (void)sk_X509_POLICY_NODE_delete(nodes, i);
+      }
+    }
+  }
+
+  for (;;) {
+    --curr;
     nodes = curr->nodes;
-    if (curr->flags & X509_V_FLAG_INHIBIT_MAP) {
-        for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) {
-            node = sk_X509_POLICY_NODE_value(nodes, i);
-            /* Delete any mapped data: see RFC 3280 XXXX */
-            if (node->data->flags & POLICY_DATA_FLAG_MAP_MASK) {
-                node->parent->nchild--;
-                OPENSSL_free(node);
-                (void)sk_X509_POLICY_NODE_delete(nodes, i);
-            }
-        }
+    for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) {
+      node = sk_X509_POLICY_NODE_value(nodes, i);
+      if (node->nchild == 0) {
+        node->parent->nchild--;
+        OPENSSL_free(node);
+        (void)sk_X509_POLICY_NODE_delete(nodes, i);
+      }
     }
-
-    for (;;) {
-        --curr;
-        nodes = curr->nodes;
-        for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) {
-            node = sk_X509_POLICY_NODE_value(nodes, i);
-            if (node->nchild == 0) {
-                node->parent->nchild--;
-                OPENSSL_free(node);
-                (void)sk_X509_POLICY_NODE_delete(nodes, i);
-            }
-        }
-        if (curr->anyPolicy && !curr->anyPolicy->nchild) {
-            if (curr->anyPolicy->parent)
-                curr->anyPolicy->parent->nchild--;
-            OPENSSL_free(curr->anyPolicy);
-            curr->anyPolicy = NULL;
-        }
-        if (curr == tree->levels) {
-            /* If we zapped anyPolicy at top then tree is empty */
-            if (!curr->anyPolicy)
-                return 2;
-            return 1;
-        }
+    if (curr->anyPolicy && !curr->anyPolicy->nchild) {
+      if (curr->anyPolicy->parent) {
+        curr->anyPolicy->parent->nchild--;
+      }
+      OPENSSL_free(curr->anyPolicy);
+      curr->anyPolicy = NULL;
     }
-
+    if (curr == tree->levels) {
+      // If we zapped anyPolicy at top then tree is empty
+      if (!curr->anyPolicy) {
+        return 2;
+      }
+      return 1;
+    }
+  }
 }
 
 static int tree_add_auth_node(STACK_OF(X509_POLICY_NODE) **pnodes,
-                              X509_POLICY_NODE *pcy)
-{
+                              X509_POLICY_NODE *pcy) {
+  if (!*pnodes) {
+    *pnodes = policy_node_cmp_new();
     if (!*pnodes) {
-        *pnodes = policy_node_cmp_new();
-        if (!*pnodes)
-            return 0;
-    } else {
-      sk_X509_POLICY_NODE_sort(*pnodes);
-      if (sk_X509_POLICY_NODE_find(*pnodes, NULL, pcy))
-        return 1;
+      return 0;
     }
-    if (!sk_X509_POLICY_NODE_push(*pnodes, pcy))
-        return 0;
+  } else {
+    sk_X509_POLICY_NODE_sort(*pnodes);
+    if (sk_X509_POLICY_NODE_find(*pnodes, NULL, pcy)) {
+      return 1;
+    }
+  }
+  if (!sk_X509_POLICY_NODE_push(*pnodes, pcy)) {
+    return 0;
+  }
 
-    return 1;
-
+  return 1;
 }
 
-/*
- * Calculate the authority set based on policy tree. The 'pnodes' parameter
- * is used as a store for the set of policy nodes used to calculate the user
- * set. If the authority set is not anyPolicy then pnodes will just point to
- * the authority set. If however the authority set is anyPolicy then the set
- * of valid policies (other than anyPolicy) is store in pnodes. The return
- * value of '2' is used in this case to indicate that pnodes should be freed.
- */
+// Calculate the authority set based on policy tree. The 'pnodes' parameter
+// is used as a store for the set of policy nodes used to calculate the user
+// set. If the authority set is not anyPolicy then pnodes will just point to
+// the authority set. If however the authority set is anyPolicy then the set
+// of valid policies (other than anyPolicy) is store in pnodes. The return
+// value of '2' is used in this case to indicate that pnodes should be freed.
 
 static int tree_calculate_authority_set(X509_POLICY_TREE *tree,
-                                        STACK_OF(X509_POLICY_NODE) **pnodes)
-{
-    X509_POLICY_LEVEL *curr;
-    X509_POLICY_NODE *node, *anyptr;
-    STACK_OF(X509_POLICY_NODE) **addnodes;
-    int i;
-    size_t j;
-    curr = tree->levels + tree->nlevel - 1;
+                                        STACK_OF(X509_POLICY_NODE) **pnodes) {
+  X509_POLICY_LEVEL *curr;
+  X509_POLICY_NODE *node, *anyptr;
+  STACK_OF(X509_POLICY_NODE) **addnodes;
+  int i;
+  size_t j;
+  curr = tree->levels + tree->nlevel - 1;
 
-    /* If last level contains anyPolicy set is anyPolicy */
-    if (curr->anyPolicy) {
-        if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy))
-            return 0;
-        addnodes = pnodes;
-    } else
-        /* Add policies to authority set */
-        addnodes = &tree->auth_policies;
-
-    curr = tree->levels;
-    for (i = 1; i < tree->nlevel; i++) {
-        /*
-         * If no anyPolicy node on this this level it can't appear on lower
-         * levels so end search.
-         */
-        if (!(anyptr = curr->anyPolicy))
-            break;
-        curr++;
-        for (j = 0; j < sk_X509_POLICY_NODE_num(curr->nodes); j++) {
-            node = sk_X509_POLICY_NODE_value(curr->nodes, j);
-            if ((node->parent == anyptr)
-                && !tree_add_auth_node(addnodes, node))
-                return 0;
-        }
+  // If last level contains anyPolicy set is anyPolicy
+  if (curr->anyPolicy) {
+    if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy)) {
+      return 0;
     }
+    addnodes = pnodes;
+  } else {
+    // Add policies to authority set
+    addnodes = &tree->auth_policies;
+  }
 
-    if (addnodes == pnodes)
-        return 2;
+  curr = tree->levels;
+  for (i = 1; i < tree->nlevel; i++) {
+    // If no anyPolicy node on this this level it can't appear on lower
+    // levels so end search.
+    if (!(anyptr = curr->anyPolicy)) {
+      break;
+    }
+    curr++;
+    for (j = 0; j < sk_X509_POLICY_NODE_num(curr->nodes); j++) {
+      node = sk_X509_POLICY_NODE_value(curr->nodes, j);
+      if ((node->parent == anyptr) && !tree_add_auth_node(addnodes, node)) {
+        return 0;
+      }
+    }
+  }
 
-    *pnodes = tree->auth_policies;
+  if (addnodes == pnodes) {
+    return 2;
+  }
 
-    return 1;
+  *pnodes = tree->auth_policies;
+
+  return 1;
 }
 
 static int tree_calculate_user_set(X509_POLICY_TREE *tree,
                                    STACK_OF(ASN1_OBJECT) *policy_oids,
-                                   STACK_OF(X509_POLICY_NODE) *auth_nodes)
-{
-    size_t i;
-    X509_POLICY_NODE *node;
-    ASN1_OBJECT *oid;
+                                   STACK_OF(X509_POLICY_NODE) *auth_nodes) {
+  size_t i;
+  X509_POLICY_NODE *node;
+  ASN1_OBJECT *oid;
 
-    X509_POLICY_NODE *anyPolicy;
-    X509_POLICY_DATA *extra;
+  X509_POLICY_NODE *anyPolicy;
+  X509_POLICY_DATA *extra;
 
-    /*
-     * Check if anyPolicy present in authority constrained policy set: this
-     * will happen if it is a leaf node.
-     */
+  // Check if anyPolicy present in authority constrained policy set: this
+  // will happen if it is a leaf node.
 
-    if (sk_ASN1_OBJECT_num(policy_oids) <= 0)
+  if (sk_ASN1_OBJECT_num(policy_oids) <= 0) {
+    return 1;
+  }
+
+  anyPolicy = tree->levels[tree->nlevel - 1].anyPolicy;
+
+  for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) {
+    oid = sk_ASN1_OBJECT_value(policy_oids, i);
+    if (OBJ_obj2nid(oid) == NID_any_policy) {
+      tree->flags |= POLICY_FLAG_ANY_POLICY;
+      return 1;
+    }
+  }
+
+  for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) {
+    oid = sk_ASN1_OBJECT_value(policy_oids, i);
+    node = tree_find_sk(auth_nodes, oid);
+    if (!node) {
+      if (!anyPolicy) {
+        continue;
+      }
+      // Create a new node with policy ID from user set and qualifiers
+      // from anyPolicy.
+      extra = policy_data_new(NULL, oid, node_critical(anyPolicy));
+      if (!extra) {
+        return 0;
+      }
+      extra->qualifier_set = anyPolicy->data->qualifier_set;
+      extra->flags =
+          POLICY_DATA_FLAG_SHARED_QUALIFIERS | POLICY_DATA_FLAG_EXTRA_NODE;
+      node = level_add_node(NULL, extra, anyPolicy->parent, tree);
+    }
+    if (!tree->user_policies) {
+      tree->user_policies = sk_X509_POLICY_NODE_new_null();
+      if (!tree->user_policies) {
         return 1;
-
-    anyPolicy = tree->levels[tree->nlevel - 1].anyPolicy;
-
-    for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) {
-        oid = sk_ASN1_OBJECT_value(policy_oids, i);
-        if (OBJ_obj2nid(oid) == NID_any_policy) {
-            tree->flags |= POLICY_FLAG_ANY_POLICY;
-            return 1;
-        }
+      }
     }
-
-    for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) {
-        oid = sk_ASN1_OBJECT_value(policy_oids, i);
-        node = tree_find_sk(auth_nodes, oid);
-        if (!node) {
-            if (!anyPolicy)
-                continue;
-            /*
-             * Create a new node with policy ID from user set and qualifiers
-             * from anyPolicy.
-             */
-            extra = policy_data_new(NULL, oid, node_critical(anyPolicy));
-            if (!extra)
-                return 0;
-            extra->qualifier_set = anyPolicy->data->qualifier_set;
-            extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS
-                | POLICY_DATA_FLAG_EXTRA_NODE;
-            node = level_add_node(NULL, extra, anyPolicy->parent, tree);
-        }
-        if (!tree->user_policies) {
-            tree->user_policies = sk_X509_POLICY_NODE_new_null();
-            if (!tree->user_policies)
-                return 1;
-        }
-        if (!sk_X509_POLICY_NODE_push(tree->user_policies, node))
-            return 0;
+    if (!sk_X509_POLICY_NODE_push(tree->user_policies, node)) {
+      return 0;
     }
-    return 1;
-
+  }
+  return 1;
 }
 
-static int tree_evaluate(X509_POLICY_TREE *tree)
-{
-    int ret, i;
-    X509_POLICY_LEVEL *curr = tree->levels + 1;
-    const X509_POLICY_CACHE *cache;
+static int tree_evaluate(X509_POLICY_TREE *tree) {
+  int ret, i;
+  X509_POLICY_LEVEL *curr = tree->levels + 1;
+  const X509_POLICY_CACHE *cache;
 
-    for (i = 1; i < tree->nlevel; i++, curr++) {
-        cache = policy_cache_set(curr->cert);
-        if (!tree_link_nodes(curr, cache))
-            return 0;
-
-        if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY)
-            && !tree_link_any(curr, cache, tree))
-            return 0;
-        tree_print("before tree_prune()", tree, curr);
-        ret = tree_prune(tree, curr);
-        if (ret != 1)
-            return ret;
+  for (i = 1; i < tree->nlevel; i++, curr++) {
+    cache = policy_cache_set(curr->cert);
+    if (!tree_link_nodes(curr, cache)) {
+      return 0;
     }
 
-    return 1;
-
-}
-
-static void exnode_free(X509_POLICY_NODE *node)
-{
-    if (node->data && (node->data->flags & POLICY_DATA_FLAG_EXTRA_NODE))
-        OPENSSL_free(node);
-}
-
-void X509_policy_tree_free(X509_POLICY_TREE *tree)
-{
-    X509_POLICY_LEVEL *curr;
-    int i;
-
-    if (!tree)
-        return;
-
-    sk_X509_POLICY_NODE_free(tree->auth_policies);
-    sk_X509_POLICY_NODE_pop_free(tree->user_policies, exnode_free);
-
-    for (i = 0, curr = tree->levels; i < tree->nlevel; i++, curr++) {
-        if (curr->cert)
-            X509_free(curr->cert);
-        if (curr->nodes)
-            sk_X509_POLICY_NODE_pop_free(curr->nodes, policy_node_free);
-        if (curr->anyPolicy)
-            policy_node_free(curr->anyPolicy);
+    if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY) &&
+        !tree_link_any(curr, cache, tree)) {
+      return 0;
     }
+    tree_print("before tree_prune()", tree, curr);
+    ret = tree_prune(tree, curr);
+    if (ret != 1) {
+      return ret;
+    }
+  }
 
-    if (tree->extra_data)
-        sk_X509_POLICY_DATA_pop_free(tree->extra_data, policy_data_free);
-
-    OPENSSL_free(tree->levels);
-    OPENSSL_free(tree);
-
+  return 1;
 }
 
-/*-
- * Application policy checking function.
- * Return codes:
- *  0   Internal Error.
- *  1   Successful.
- * -1   One or more certificates contain invalid or inconsistent extensions
- * -2   User constrained policy set empty and requireExplicit true.
- */
+static void exnode_free(X509_POLICY_NODE *node) {
+  if (node->data && (node->data->flags & POLICY_DATA_FLAG_EXTRA_NODE)) {
+    OPENSSL_free(node);
+  }
+}
+
+void X509_policy_tree_free(X509_POLICY_TREE *tree) {
+  if (!tree) {
+    return;
+  }
+
+  sk_X509_POLICY_NODE_free(tree->auth_policies);
+  sk_X509_POLICY_NODE_pop_free(tree->user_policies, exnode_free);
+
+  for (int i = 0; i < tree->nlevel; i++) {
+    X509_POLICY_LEVEL *curr = &tree->levels[i];
+    X509_free(curr->cert);
+    sk_X509_POLICY_NODE_pop_free(curr->nodes, policy_node_free);
+    policy_node_free(curr->anyPolicy);
+  }
+
+  sk_X509_POLICY_DATA_pop_free(tree->extra_data, policy_data_free);
+  OPENSSL_free(tree->levels);
+  OPENSSL_free(tree);
+}
+
+//-
+// Application policy checking function.
+// Return codes:
+//  0   Internal Error.
+//  1   Successful.
+// -1   One or more certificates contain invalid or inconsistent extensions
+// -2   User constrained policy set empty and requireExplicit true.
 
 int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
-                      STACK_OF(X509) *certs,
-                      STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags)
-{
-    int ret;
-    int calc_ret;
-    X509_POLICY_TREE *tree = NULL;
-    STACK_OF(X509_POLICY_NODE) *nodes, *auth_nodes = NULL;
-    *ptree = NULL;
+                      STACK_OF(X509) *certs, STACK_OF(ASN1_OBJECT) *policy_oids,
+                      unsigned int flags) {
+  int ret;
+  int calc_ret;
+  X509_POLICY_TREE *tree = NULL;
+  STACK_OF(X509_POLICY_NODE) *nodes, *auth_nodes = NULL;
+  *ptree = NULL;
 
-    *pexplicit_policy = 0;
-    ret = tree_init(&tree, certs, flags);
+  *pexplicit_policy = 0;
+  ret = tree_init(&tree, certs, flags);
 
-    switch (ret) {
-
-        /* Tree empty requireExplicit False: OK */
+  switch (ret) {
+      // Tree empty requireExplicit False: OK
     case 2:
-        return 1;
+      return 1;
 
-        /* Some internal error */
+      // Some internal error
     case -1:
-        return -1;
+      return -1;
 
-        /* Some internal error */
+      // Some internal error
     case 0:
-        return 0;
+      return 0;
 
-        /* Tree empty requireExplicit True: Error */
+      // Tree empty requireExplicit True: Error
 
     case 6:
-        *pexplicit_policy = 1;
-        return -2;
+      *pexplicit_policy = 1;
+      return -2;
 
-        /* Tree OK requireExplicit True: OK and continue */
+      // Tree OK requireExplicit True: OK and continue
     case 5:
-        *pexplicit_policy = 1;
-        break;
+      *pexplicit_policy = 1;
+      break;
 
-        /* Tree OK: continue */
+      // Tree OK: continue
 
     case 1:
-        if (!tree)
-            /*
-             * tree_init() returns success and a null tree
-             * if it's just looking at a trust anchor.
-             * I'm not sure that returning success here is
-             * correct, but I'm sure that reporting this
-             * as an internal error which our caller
-             * interprets as a malloc failure is wrong.
-             */
-            return 1;
-        break;
-    }
+      if (!tree) {
+        // tree_init() returns success and a null tree
+        // if it's just looking at a trust anchor.
+        // I'm not sure that returning success here is
+        // correct, but I'm sure that reporting this
+        // as an internal error which our caller
+        // interprets as a malloc failure is wrong.
+        return 1;
+      }
+      break;
+  }
 
-    if (!tree)
-        goto error;
-    ret = tree_evaluate(tree);
+  if (!tree) {
+    goto error;
+  }
+  ret = tree_evaluate(tree);
 
-    tree_print("tree_evaluate()", tree, NULL);
+  tree_print("tree_evaluate()", tree, NULL);
 
-    if (ret <= 0)
-        goto error;
+  if (ret <= 0) {
+    goto error;
+  }
 
-    /* Return value 2 means tree empty */
-    if (ret == 2) {
-        X509_policy_tree_free(tree);
-        if (*pexplicit_policy)
-            return -2;
-        else
-            return 1;
-    }
-
-    /* Tree is not empty: continue */
-
-    calc_ret = tree_calculate_authority_set(tree, &auth_nodes);
-
-    if (!calc_ret)
-        goto error;
-
-    ret = tree_calculate_user_set(tree, policy_oids, auth_nodes);
-
-    if (calc_ret == 2)
-        sk_X509_POLICY_NODE_free(auth_nodes);
-
-    if (!ret)
-        goto error;
-
-
-    if (tree)
-        *ptree = tree;
-
-    if (*pexplicit_policy) {
-        nodes = X509_policy_tree_get0_user_policies(tree);
-        if (sk_X509_POLICY_NODE_num(nodes) <= 0)
-            return -2;
-    }
-
-    return 1;
-
- error:
-
+  // Return value 2 means tree empty
+  if (ret == 2) {
     X509_policy_tree_free(tree);
+    if (*pexplicit_policy) {
+      return -2;
+    } else {
+      return 1;
+    }
+  }
 
-    return 0;
+  // Tree is not empty: continue
 
+  calc_ret = tree_calculate_authority_set(tree, &auth_nodes);
+
+  if (!calc_ret) {
+    goto error;
+  }
+
+  ret = tree_calculate_user_set(tree, policy_oids, auth_nodes);
+
+  if (calc_ret == 2) {
+    sk_X509_POLICY_NODE_free(auth_nodes);
+  }
+
+  if (!ret) {
+    goto error;
+  }
+
+
+  if (tree) {
+    *ptree = tree;
+  }
+
+  if (*pexplicit_policy) {
+    if (tree->flags & POLICY_FLAG_ANY_POLICY) {
+      nodes = tree->auth_policies;
+    } else {
+      nodes = tree->user_policies;
+    }
+    if (sk_X509_POLICY_NODE_num(nodes) <= 0) {
+      return -2;
+    }
+  }
+
+  return 1;
+
+error:
+  X509_policy_tree_free(tree);
+  return 0;
 }
diff --git a/src/crypto/x509v3/v3_akey.c b/src/crypto/x509v3/v3_akey.c
index 0aba20e..7616f4f 100644
--- a/src/crypto/x509v3/v3_akey.c
+++ b/src/crypto/x509v3/v3_akey.c
@@ -69,158 +69,156 @@
 #include "internal.h"
 
 
-static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
-                                                 AUTHORITY_KEYID *akeyid,
-                                                 STACK_OF(CONF_VALUE)
-                                                 *extlist);
-static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
-                                            X509V3_CTX *ctx,
-                                            STACK_OF(CONF_VALUE) *values);
+static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist);
+static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method,
+                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values);
 
 const X509V3_EXT_METHOD v3_akey_id = {
     NID_authority_key_identifier,
-    X509V3_EXT_MULTILINE, ASN1_ITEM_ref(AUTHORITY_KEYID),
-    0, 0, 0, 0,
-    0, 0,
-    (X509V3_EXT_I2V) i2v_AUTHORITY_KEYID,
-    (X509V3_EXT_V2I)v2i_AUTHORITY_KEYID,
-    0, 0,
-    NULL
+    X509V3_EXT_MULTILINE,
+    ASN1_ITEM_ref(AUTHORITY_KEYID),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2v_AUTHORITY_KEYID,
+    v2i_AUTHORITY_KEYID,
+    0,
+    0,
+    NULL,
 };
 
-static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
-                                                 AUTHORITY_KEYID *akeyid,
-                                                 STACK_OF(CONF_VALUE)
-                                                 *extlist)
-{
-    char *tmp = NULL;
-    int extlist_was_null = extlist == NULL;
-    if (akeyid->keyid) {
-        tmp = x509v3_bytes_to_hex(akeyid->keyid->data, akeyid->keyid->length);
-        int ok = tmp != NULL && X509V3_add_value("keyid", tmp, &extlist);
-        OPENSSL_free(tmp);
-        if (!ok) {
-            goto err;
-        }
+static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist) {
+  const AUTHORITY_KEYID *akeyid = ext;
+  int extlist_was_null = extlist == NULL;
+  if (akeyid->keyid) {
+    char *tmp = x509v3_bytes_to_hex(akeyid->keyid->data, akeyid->keyid->length);
+    int ok = tmp != NULL && X509V3_add_value("keyid", tmp, &extlist);
+    OPENSSL_free(tmp);
+    if (!ok) {
+      goto err;
     }
-    if (akeyid->issuer) {
-        STACK_OF(CONF_VALUE) *tmpextlist =
-            i2v_GENERAL_NAMES(NULL, akeyid->issuer, extlist);
-        if (tmpextlist == NULL) {
-            goto err;
-        }
-        extlist = tmpextlist;
+  }
+  if (akeyid->issuer) {
+    STACK_OF(CONF_VALUE) *tmpextlist =
+        i2v_GENERAL_NAMES(NULL, akeyid->issuer, extlist);
+    if (tmpextlist == NULL) {
+      goto err;
     }
-    if (akeyid->serial) {
-        tmp = x509v3_bytes_to_hex(akeyid->serial->data, akeyid->serial->length);
-        int ok = tmp != NULL && X509V3_add_value("serial", tmp, &extlist);
-        OPENSSL_free(tmp);
-        if (!ok) {
-            goto err;
-        }
+    extlist = tmpextlist;
+  }
+  if (akeyid->serial) {
+    if (!X509V3_add_value_int("serial", akeyid->serial, &extlist)) {
+      goto err;
     }
-    return extlist;
+  }
+  return extlist;
 
 err:
-    if (extlist_was_null) {
-        sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free);
-    }
-    return NULL;
+  if (extlist_was_null) {
+    sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free);
+  }
+  return NULL;
 }
 
-/*
- * Currently two options: keyid: use the issuers subject keyid, the value
- * 'always' means its is an error if the issuer certificate doesn't have a
- * key id. issuer: use the issuers cert issuer and serial number. The default
- * is to only use this if keyid is not present. With the option 'always' this
- * is always included.
- */
+// Currently two options: keyid: use the issuers subject keyid, the value
+// 'always' means its is an error if the issuer certificate doesn't have a
+// key id. issuer: use the issuers cert issuer and serial number. The default
+// is to only use this if keyid is not present. With the option 'always' this
+// is always included.
 
-static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
-                                            X509V3_CTX *ctx,
-                                            STACK_OF(CONF_VALUE) *values)
-{
-    char keyid = 0, issuer = 0;
-    size_t i;
-    int j;
-    CONF_VALUE *cnf;
-    ASN1_OCTET_STRING *ikeyid = NULL;
-    X509_NAME *isname = NULL;
-    GENERAL_NAMES *gens = NULL;
-    GENERAL_NAME *gen = NULL;
-    ASN1_INTEGER *serial = NULL;
-    X509_EXTENSION *ext;
-    X509 *cert;
-    AUTHORITY_KEYID *akeyid;
+static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method,
+                                 X509V3_CTX *ctx,
+                                 STACK_OF(CONF_VALUE) *values) {
+  char keyid = 0, issuer = 0;
+  size_t i;
+  int j;
+  CONF_VALUE *cnf;
+  ASN1_OCTET_STRING *ikeyid = NULL;
+  X509_NAME *isname = NULL;
+  GENERAL_NAMES *gens = NULL;
+  GENERAL_NAME *gen = NULL;
+  ASN1_INTEGER *serial = NULL;
+  X509 *cert;
+  AUTHORITY_KEYID *akeyid;
 
-    for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
-        cnf = sk_CONF_VALUE_value(values, i);
-        if (!strcmp(cnf->name, "keyid")) {
-            keyid = 1;
-            if (cnf->value && !strcmp(cnf->value, "always"))
-                keyid = 2;
-        } else if (!strcmp(cnf->name, "issuer")) {
-            issuer = 1;
-            if (cnf->value && !strcmp(cnf->value, "always"))
-                issuer = 2;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_OPTION);
-            ERR_add_error_data(2, "name=", cnf->name);
-            return NULL;
-        }
+  for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
+    cnf = sk_CONF_VALUE_value(values, i);
+    if (!strcmp(cnf->name, "keyid")) {
+      keyid = 1;
+      if (cnf->value && !strcmp(cnf->value, "always")) {
+        keyid = 2;
+      }
+    } else if (!strcmp(cnf->name, "issuer")) {
+      issuer = 1;
+      if (cnf->value && !strcmp(cnf->value, "always")) {
+        issuer = 2;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_OPTION);
+      ERR_add_error_data(2, "name=", cnf->name);
+      return NULL;
     }
+  }
 
-    if (!ctx || !ctx->issuer_cert) {
-        if (ctx && (ctx->flags == CTX_TEST))
-            return AUTHORITY_KEYID_new();
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_CERTIFICATE);
-        return NULL;
+  if (!ctx || !ctx->issuer_cert) {
+    if (ctx && (ctx->flags == CTX_TEST)) {
+      return AUTHORITY_KEYID_new();
     }
-
-    cert = ctx->issuer_cert;
-
-    if (keyid) {
-        j = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1);
-        if ((j >= 0) && (ext = X509_get_ext(cert, j)))
-            ikeyid = X509V3_EXT_d2i(ext);
-        if (keyid == 2 && !ikeyid) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID);
-            return NULL;
-        }
-    }
-
-    if ((issuer && !ikeyid) || (issuer == 2)) {
-        isname = X509_NAME_dup(X509_get_issuer_name(cert));
-        serial = ASN1_INTEGER_dup(X509_get_serialNumber(cert));
-        if (!isname || !serial) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS);
-            goto err;
-        }
-    }
-
-    if (!(akeyid = AUTHORITY_KEYID_new()))
-        goto err;
-
-    if (isname) {
-        if (!(gens = sk_GENERAL_NAME_new_null())
-            || !(gen = GENERAL_NAME_new())
-            || !sk_GENERAL_NAME_push(gens, gen)) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        gen->type = GEN_DIRNAME;
-        gen->d.dirn = isname;
-    }
-
-    akeyid->issuer = gens;
-    akeyid->serial = serial;
-    akeyid->keyid = ikeyid;
-
-    return akeyid;
-
- err:
-    X509_NAME_free(isname);
-    ASN1_INTEGER_free(serial);
-    ASN1_OCTET_STRING_free(ikeyid);
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_CERTIFICATE);
     return NULL;
+  }
+
+  cert = ctx->issuer_cert;
+
+  if (keyid) {
+    j = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1);
+    const X509_EXTENSION *ext;
+    if ((j >= 0) && (ext = X509_get_ext(cert, j))) {
+      ikeyid = X509V3_EXT_d2i(ext);
+    }
+    if (keyid == 2 && !ikeyid) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID);
+      return NULL;
+    }
+  }
+
+  if ((issuer && !ikeyid) || (issuer == 2)) {
+    isname = X509_NAME_dup(X509_get_issuer_name(cert));
+    serial = ASN1_INTEGER_dup(X509_get_serialNumber(cert));
+    if (!isname || !serial) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS);
+      goto err;
+    }
+  }
+
+  if (!(akeyid = AUTHORITY_KEYID_new())) {
+    goto err;
+  }
+
+  if (isname) {
+    if (!(gens = sk_GENERAL_NAME_new_null()) || !(gen = GENERAL_NAME_new()) ||
+        !sk_GENERAL_NAME_push(gens, gen)) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    gen->type = GEN_DIRNAME;
+    gen->d.dirn = isname;
+  }
+
+  akeyid->issuer = gens;
+  akeyid->serial = serial;
+  akeyid->keyid = ikeyid;
+
+  return akeyid;
+
+err:
+  X509_NAME_free(isname);
+  ASN1_INTEGER_free(serial);
+  ASN1_OCTET_STRING_free(ikeyid);
+  return NULL;
 }
diff --git a/src/crypto/x509v3/v3_akeya.c b/src/crypto/x509v3/v3_akeya.c
index 844dee5..f612d7c 100644
--- a/src/crypto/x509v3/v3_akeya.c
+++ b/src/crypto/x509v3/v3_akeya.c
@@ -64,9 +64,9 @@
 
 
 ASN1_SEQUENCE(AUTHORITY_KEYID) = {
-        ASN1_IMP_OPT(AUTHORITY_KEYID, keyid, ASN1_OCTET_STRING, 0),
-        ASN1_IMP_SEQUENCE_OF_OPT(AUTHORITY_KEYID, issuer, GENERAL_NAME, 1),
-        ASN1_IMP_OPT(AUTHORITY_KEYID, serial, ASN1_INTEGER, 2)
+    ASN1_IMP_OPT(AUTHORITY_KEYID, keyid, ASN1_OCTET_STRING, 0),
+    ASN1_IMP_SEQUENCE_OF_OPT(AUTHORITY_KEYID, issuer, GENERAL_NAME, 1),
+    ASN1_IMP_OPT(AUTHORITY_KEYID, serial, ASN1_INTEGER, 2),
 } ASN1_SEQUENCE_END(AUTHORITY_KEYID)
 
 IMPLEMENT_ASN1_FUNCTIONS(AUTHORITY_KEYID)
diff --git a/src/crypto/x509v3/v3_alt.c b/src/crypto/x509v3/v3_alt.c
index ce1c6e5..1f83d88 100644
--- a/src/crypto/x509v3/v3_alt.c
+++ b/src/crypto/x509v3/v3_alt.c
@@ -68,573 +68,573 @@
 #include "internal.h"
 
 
-static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
-                                      X509V3_CTX *ctx,
-                                      STACK_OF(CONF_VALUE) *nval);
-static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
-                                     X509V3_CTX *ctx,
-                                     STACK_OF(CONF_VALUE) *nval);
+static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                             STACK_OF(CONF_VALUE) *nval);
+static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                            STACK_OF(CONF_VALUE) *nval);
 static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p);
 static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens);
 static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx);
 static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx);
 
+static STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES_cb(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) {
+  return i2v_GENERAL_NAMES(method, ext, ret);
+}
+
 const X509V3_EXT_METHOD v3_alt[] = {
-    {NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
-     0, 0, 0, 0,
-     0, 0,
-     (X509V3_EXT_I2V) i2v_GENERAL_NAMES,
-     (X509V3_EXT_V2I)v2i_subject_alt,
-     NULL, NULL, NULL},
+    {NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), 0, 0, 0, 0, 0, 0,
+     i2v_GENERAL_NAMES_cb, v2i_subject_alt, NULL, NULL, NULL},
 
-    {NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
-     0, 0, 0, 0,
-     0, 0,
-     (X509V3_EXT_I2V) i2v_GENERAL_NAMES,
-     (X509V3_EXT_V2I)v2i_issuer_alt,
-     NULL, NULL, NULL},
+    {NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), 0, 0, 0, 0, 0, 0,
+     i2v_GENERAL_NAMES_cb, v2i_issuer_alt, NULL, NULL, NULL},
 
-    {NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES),
-     0, 0, 0, 0,
-     0, 0,
-     (X509V3_EXT_I2V) i2v_GENERAL_NAMES,
-     NULL, NULL, NULL, NULL},
+    {NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES), 0, 0, 0, 0, 0, 0,
+     i2v_GENERAL_NAMES_cb, NULL, NULL, NULL, NULL},
 };
 
-STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
+STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
                                         GENERAL_NAMES *gens,
-                                        STACK_OF(CONF_VALUE) *ret)
-{
-    int ret_was_null = ret == NULL;
-    for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i);
-        STACK_OF(CONF_VALUE) *tmp = i2v_GENERAL_NAME(method, gen, ret);
-        if (tmp == NULL) {
-            if (ret_was_null) {
-                sk_CONF_VALUE_pop_free(ret, X509V3_conf_free);
-            }
-            return NULL;
-        }
-        ret = tmp;
+                                        STACK_OF(CONF_VALUE) *ret) {
+  int ret_was_null = ret == NULL;
+  for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i);
+    STACK_OF(CONF_VALUE) *tmp = i2v_GENERAL_NAME(method, gen, ret);
+    if (tmp == NULL) {
+      if (ret_was_null) {
+        sk_CONF_VALUE_pop_free(ret, X509V3_conf_free);
+      }
+      return NULL;
     }
-    if (!ret)
-        return sk_CONF_VALUE_new_null();
-    return ret;
+    ret = tmp;
+  }
+  if (!ret) {
+    return sk_CONF_VALUE_new_null();
+  }
+  return ret;
 }
 
-STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
+STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method,
                                        GENERAL_NAME *gen,
-                                       STACK_OF(CONF_VALUE) *ret)
-{
-    /* Note the error-handling for this function relies on there being at most
-     * one |X509V3_add_value| call. If there were two and the second failed, we
-     * would need to sometimes free the first call's result. */
-    unsigned char *p;
-    char oline[256], htmp[5];
-    int i;
-    switch (gen->type) {
+                                       STACK_OF(CONF_VALUE) *ret) {
+  // Note the error-handling for this function relies on there being at most
+  // one |X509V3_add_value| call. If there were two and the second failed, we
+  // would need to sometimes free the first call's result.
+  unsigned char *p;
+  char oline[256], htmp[5];
+  int i;
+  switch (gen->type) {
     case GEN_OTHERNAME:
-        if (!X509V3_add_value("othername", "<unsupported>", &ret))
-            return NULL;
-        break;
-
-    case GEN_X400:
-        if (!X509V3_add_value("X400Name", "<unsupported>", &ret))
-            return NULL;
-        break;
-
-    case GEN_EDIPARTY:
-        if (!X509V3_add_value("EdiPartyName", "<unsupported>", &ret))
-            return NULL;
-        break;
-
-    case GEN_EMAIL:
-        if (!x509V3_add_value_asn1_string("email", gen->d.ia5, &ret))
-            return NULL;
-        break;
-
-    case GEN_DNS:
-        if (!x509V3_add_value_asn1_string("DNS", gen->d.ia5, &ret))
-            return NULL;
-        break;
-
-    case GEN_URI:
-        if (!x509V3_add_value_asn1_string("URI", gen->d.ia5, &ret))
-            return NULL;
-        break;
-
-    case GEN_DIRNAME:
-        if (X509_NAME_oneline(gen->d.dirn, oline, 256) == NULL
-                || !X509V3_add_value("DirName", oline, &ret))
-            return NULL;
-        break;
-
-    case GEN_IPADD:
-        p = gen->d.ip->data;
-        if (gen->d.ip->length == 4)
-            BIO_snprintf(oline, sizeof oline,
-                         "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-        else if (gen->d.ip->length == 16) {
-            oline[0] = 0;
-            for (i = 0; i < 8; i++) {
-                BIO_snprintf(htmp, sizeof htmp, "%X", p[0] << 8 | p[1]);
-                p += 2;
-                OPENSSL_strlcat(oline, htmp, sizeof(oline));
-                if (i != 7)
-                    OPENSSL_strlcat(oline, ":", sizeof(oline));
-            }
-        } else {
-            if (!X509V3_add_value("IP Address", "<invalid>", &ret))
-                return NULL;
-            break;
-        }
-        if (!X509V3_add_value("IP Address", oline, &ret))
-            return NULL;
-        break;
-
-    case GEN_RID:
-        i2t_ASN1_OBJECT(oline, 256, gen->d.rid);
-        if (!X509V3_add_value("Registered ID", oline, &ret))
-            return NULL;
-        break;
-    }
-    return ret;
-}
-
-int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen)
-{
-    unsigned char *p;
-    int i;
-    switch (gen->type) {
-    case GEN_OTHERNAME:
-        BIO_printf(out, "othername:<unsupported>");
-        break;
-
-    case GEN_X400:
-        BIO_printf(out, "X400Name:<unsupported>");
-        break;
-
-    case GEN_EDIPARTY:
-        /* Maybe fix this: it is supported now */
-        BIO_printf(out, "EdiPartyName:<unsupported>");
-        break;
-
-    case GEN_EMAIL:
-        BIO_printf(out, "email:");
-        ASN1_STRING_print(out, gen->d.ia5);
-        break;
-
-    case GEN_DNS:
-        BIO_printf(out, "DNS:");
-        ASN1_STRING_print(out, gen->d.ia5);
-        break;
-
-    case GEN_URI:
-        BIO_printf(out, "URI:");
-        ASN1_STRING_print(out, gen->d.ia5);
-        break;
-
-    case GEN_DIRNAME:
-        BIO_printf(out, "DirName: ");
-        X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE);
-        break;
-
-    case GEN_IPADD:
-        p = gen->d.ip->data;
-        if (gen->d.ip->length == 4)
-            BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-        else if (gen->d.ip->length == 16) {
-            BIO_printf(out, "IP Address");
-            for (i = 0; i < 8; i++) {
-                BIO_printf(out, ":%X", p[0] << 8 | p[1]);
-                p += 2;
-            }
-            BIO_puts(out, "\n");
-        } else {
-            BIO_printf(out, "IP Address:<invalid>");
-            break;
-        }
-        break;
-
-    case GEN_RID:
-        BIO_printf(out, "Registered ID");
-        i2a_ASN1_OBJECT(out, gen->d.rid);
-        break;
-    }
-    return 1;
-}
-
-static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
-                                     X509V3_CTX *ctx,
-                                     STACK_OF(CONF_VALUE) *nval)
-{
-    GENERAL_NAMES *gens = NULL;
-    CONF_VALUE *cnf;
-    size_t i;
-    if (!(gens = sk_GENERAL_NAME_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      if (!X509V3_add_value("othername", "<unsupported>", &ret)) {
         return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        cnf = sk_CONF_VALUE_value(nval, i);
-        if (!x509v3_name_cmp(cnf->name, "issuer") && cnf->value &&
-            !strcmp(cnf->value, "copy")) {
-            if (!copy_issuer(ctx, gens))
-                goto err;
-        } else {
-            GENERAL_NAME *gen;
-            if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
-                goto err;
-            sk_GENERAL_NAME_push(gens, gen);
+      }
+      break;
+
+    case GEN_X400:
+      if (!X509V3_add_value("X400Name", "<unsupported>", &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_EDIPARTY:
+      if (!X509V3_add_value("EdiPartyName", "<unsupported>", &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_EMAIL:
+      if (!x509V3_add_value_asn1_string("email", gen->d.ia5, &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_DNS:
+      if (!x509V3_add_value_asn1_string("DNS", gen->d.ia5, &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_URI:
+      if (!x509V3_add_value_asn1_string("URI", gen->d.ia5, &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_DIRNAME:
+      if (X509_NAME_oneline(gen->d.dirn, oline, 256) == NULL ||
+          !X509V3_add_value("DirName", oline, &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_IPADD:
+      p = gen->d.ip->data;
+      if (gen->d.ip->length == 4) {
+        BIO_snprintf(oline, sizeof(oline), "%d.%d.%d.%d", p[0], p[1], p[2],
+                     p[3]);
+      } else if (gen->d.ip->length == 16) {
+        oline[0] = 0;
+        for (i = 0; i < 8; i++) {
+          uint16_t v = ((uint16_t)p[0] << 8) | p[1];
+          BIO_snprintf(htmp, sizeof(htmp), "%X", v);
+          p += 2;
+          OPENSSL_strlcat(oline, htmp, sizeof(oline));
+          if (i != 7) {
+            OPENSSL_strlcat(oline, ":", sizeof(oline));
+          }
         }
-    }
-    return gens;
- err:
-    sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
-    return NULL;
+      } else {
+        if (!X509V3_add_value("IP Address", "<invalid>", &ret)) {
+          return NULL;
+        }
+        break;
+      }
+      if (!X509V3_add_value("IP Address", oline, &ret)) {
+        return NULL;
+      }
+      break;
+
+    case GEN_RID:
+      i2t_ASN1_OBJECT(oline, 256, gen->d.rid);
+      if (!X509V3_add_value("Registered ID", oline, &ret)) {
+        return NULL;
+      }
+      break;
+  }
+  return ret;
 }
 
-/* Append subject altname of issuer to issuer alt name of subject */
+int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) {
+  unsigned char *p;
+  int i;
+  switch (gen->type) {
+    case GEN_OTHERNAME:
+      BIO_printf(out, "othername:<unsupported>");
+      break;
 
-static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)
-{
-    if (ctx && (ctx->flags == CTX_TEST))
-        return 1;
-    if (!ctx || !ctx->issuer_cert) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_DETAILS);
-        return 0;
-    }
-    int i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);
-    if (i < 0)
-        return 1;
+    case GEN_X400:
+      BIO_printf(out, "X400Name:<unsupported>");
+      break;
 
-    int ret = 0;
-    GENERAL_NAMES *ialt = NULL;
-    X509_EXTENSION *ext;
-    if (!(ext = X509_get_ext(ctx->issuer_cert, i)) ||
-        !(ialt = X509V3_EXT_d2i(ext))) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ISSUER_DECODE_ERROR);
-        goto err;
-    }
+    case GEN_EDIPARTY:
+      // Maybe fix this: it is supported now
+      BIO_printf(out, "EdiPartyName:<unsupported>");
+      break;
 
-    for (size_t j = 0; j < sk_GENERAL_NAME_num(ialt); j++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(ialt, j);
-        if (!sk_GENERAL_NAME_push(gens, gen)) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
+    case GEN_EMAIL:
+      BIO_printf(out, "email:");
+      ASN1_STRING_print(out, gen->d.ia5);
+      break;
+
+    case GEN_DNS:
+      BIO_printf(out, "DNS:");
+      ASN1_STRING_print(out, gen->d.ia5);
+      break;
+
+    case GEN_URI:
+      BIO_printf(out, "URI:");
+      ASN1_STRING_print(out, gen->d.ia5);
+      break;
+
+    case GEN_DIRNAME:
+      BIO_printf(out, "DirName: ");
+      X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE);
+      break;
+
+    case GEN_IPADD:
+      p = gen->d.ip->data;
+      if (gen->d.ip->length == 4) {
+        BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+      } else if (gen->d.ip->length == 16) {
+        BIO_printf(out, "IP Address");
+        for (i = 0; i < 8; i++) {
+          uint16_t v = ((uint16_t)p[0] << 8) | p[1];
+          BIO_printf(out, ":%X", v);
+          p += 2;
         }
-        /* Ownership of |gen| has moved from |ialt| to |gens|. */
-        sk_GENERAL_NAME_set(ialt, j, NULL);
-    }
+        BIO_puts(out, "\n");
+      } else {
+        BIO_printf(out, "IP Address:<invalid>");
+        break;
+      }
+      break;
 
-    ret = 1;
+    case GEN_RID:
+      BIO_printf(out, "Registered ID");
+      i2a_ASN1_OBJECT(out, gen->d.rid);
+      break;
+  }
+  return 1;
+}
+
+static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                            STACK_OF(CONF_VALUE) *nval) {
+  GENERAL_NAMES *gens = NULL;
+  CONF_VALUE *cnf;
+  size_t i;
+  if (!(gens = sk_GENERAL_NAME_new_null())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    cnf = sk_CONF_VALUE_value(nval, i);
+    if (!x509v3_name_cmp(cnf->name, "issuer") && cnf->value &&
+        !strcmp(cnf->value, "copy")) {
+      if (!copy_issuer(ctx, gens)) {
+        goto err;
+      }
+    } else {
+      GENERAL_NAME *gen;
+      if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) {
+        goto err;
+      }
+      sk_GENERAL_NAME_push(gens, gen);
+    }
+  }
+  return gens;
+err:
+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+  return NULL;
+}
+
+// Append subject altname of issuer to issuer alt name of subject
+
+static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) {
+  if (ctx && (ctx->flags == CTX_TEST)) {
+    return 1;
+  }
+  if (!ctx || !ctx->issuer_cert) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_DETAILS);
+    return 0;
+  }
+  int i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);
+  if (i < 0) {
+    return 1;
+  }
+
+  int ret = 0;
+  GENERAL_NAMES *ialt = NULL;
+  X509_EXTENSION *ext;
+  if (!(ext = X509_get_ext(ctx->issuer_cert, i)) ||
+      !(ialt = X509V3_EXT_d2i(ext))) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_ISSUER_DECODE_ERROR);
+    goto err;
+  }
+
+  for (size_t j = 0; j < sk_GENERAL_NAME_num(ialt); j++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(ialt, j);
+    if (!sk_GENERAL_NAME_push(gens, gen)) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    // Ownership of |gen| has moved from |ialt| to |gens|.
+    sk_GENERAL_NAME_set(ialt, j, NULL);
+  }
+
+  ret = 1;
 
 err:
-    GENERAL_NAMES_free(ialt);
-    return ret;
+  GENERAL_NAMES_free(ialt);
+  return ret;
 }
 
-static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
-                                      X509V3_CTX *ctx,
-                                      STACK_OF(CONF_VALUE) *nval)
-{
-    GENERAL_NAMES *gens = NULL;
-    CONF_VALUE *cnf;
-    size_t i;
-    if (!(gens = sk_GENERAL_NAME_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        cnf = sk_CONF_VALUE_value(nval, i);
-        if (!x509v3_name_cmp(cnf->name, "email") && cnf->value &&
-            !strcmp(cnf->value, "copy")) {
-            if (!copy_email(ctx, gens, 0))
-                goto err;
-        } else if (!x509v3_name_cmp(cnf->name, "email") && cnf->value &&
-                   !strcmp(cnf->value, "move")) {
-            if (!copy_email(ctx, gens, 1))
-                goto err;
-        } else {
-            GENERAL_NAME *gen;
-            if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
-                goto err;
-            sk_GENERAL_NAME_push(gens, gen);
-        }
-    }
-    return gens;
- err:
-    sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                             STACK_OF(CONF_VALUE) *nval) {
+  GENERAL_NAMES *gens = NULL;
+  CONF_VALUE *cnf;
+  size_t i;
+  if (!(gens = sk_GENERAL_NAME_new_null())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    cnf = sk_CONF_VALUE_value(nval, i);
+    if (!x509v3_name_cmp(cnf->name, "email") && cnf->value &&
+        !strcmp(cnf->value, "copy")) {
+      if (!copy_email(ctx, gens, 0)) {
+        goto err;
+      }
+    } else if (!x509v3_name_cmp(cnf->name, "email") && cnf->value &&
+               !strcmp(cnf->value, "move")) {
+      if (!copy_email(ctx, gens, 1)) {
+        goto err;
+      }
+    } else {
+      GENERAL_NAME *gen;
+      if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) {
+        goto err;
+      }
+      sk_GENERAL_NAME_push(gens, gen);
+    }
+  }
+  return gens;
+err:
+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+  return NULL;
 }
 
-/*
- * Copy any email addresses in a certificate or request to GENERAL_NAMES
- */
+// Copy any email addresses in a certificate or request to GENERAL_NAMES
 
-static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
-{
-    X509_NAME *nm;
-    ASN1_IA5STRING *email = NULL;
-    X509_NAME_ENTRY *ne;
-    GENERAL_NAME *gen = NULL;
-    int i;
-    if (ctx != NULL && ctx->flags == CTX_TEST)
-        return 1;
-    if (!ctx || (!ctx->subject_cert && !ctx->subject_req)) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_SUBJECT_DETAILS);
-        goto err;
-    }
-    /* Find the subject name */
-    if (ctx->subject_cert)
-        nm = X509_get_subject_name(ctx->subject_cert);
-    else
-        nm = X509_REQ_get_subject_name(ctx->subject_req);
-
-    /* Now add any email address(es) to STACK */
-    i = -1;
-    while ((i = X509_NAME_get_index_by_NID(nm,
-                                           NID_pkcs9_emailAddress, i)) >= 0) {
-        ne = X509_NAME_get_entry(nm, i);
-        email = ASN1_STRING_dup(X509_NAME_ENTRY_get_data(ne));
-        if (move_p) {
-            X509_NAME_delete_entry(nm, i);
-            X509_NAME_ENTRY_free(ne);
-            i--;
-        }
-        if (!email || !(gen = GENERAL_NAME_new())) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        gen->d.ia5 = email;
-        email = NULL;
-        gen->type = GEN_EMAIL;
-        if (!sk_GENERAL_NAME_push(gens, gen)) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        gen = NULL;
-    }
-
+static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) {
+  X509_NAME *nm;
+  ASN1_IA5STRING *email = NULL;
+  X509_NAME_ENTRY *ne;
+  GENERAL_NAME *gen = NULL;
+  int i;
+  if (ctx != NULL && ctx->flags == CTX_TEST) {
     return 1;
+  }
+  if (!ctx || (!ctx->subject_cert && !ctx->subject_req)) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_SUBJECT_DETAILS);
+    goto err;
+  }
+  // Find the subject name
+  if (ctx->subject_cert) {
+    nm = X509_get_subject_name(ctx->subject_cert);
+  } else {
+    nm = X509_REQ_get_subject_name(ctx->subject_req);
+  }
 
- err:
-    GENERAL_NAME_free(gen);
-    ASN1_IA5STRING_free(email);
-    return 0;
+  // Now add any email address(es) to STACK
+  i = -1;
+  while ((i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i)) >= 0) {
+    ne = X509_NAME_get_entry(nm, i);
+    email = ASN1_STRING_dup(X509_NAME_ENTRY_get_data(ne));
+    if (move_p) {
+      X509_NAME_delete_entry(nm, i);
+      X509_NAME_ENTRY_free(ne);
+      i--;
+    }
+    if (!email || !(gen = GENERAL_NAME_new())) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    gen->d.ia5 = email;
+    email = NULL;
+    gen->type = GEN_EMAIL;
+    if (!sk_GENERAL_NAME_push(gens, gen)) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    gen = NULL;
+  }
 
+  return 1;
+
+err:
+  GENERAL_NAME_free(gen);
+  ASN1_IA5STRING_free(email);
+  return 0;
 }
 
 GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
-                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
-{
-    GENERAL_NAME *gen;
-    GENERAL_NAMES *gens = NULL;
-    CONF_VALUE *cnf;
-    size_t i;
-    if (!(gens = sk_GENERAL_NAME_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        cnf = sk_CONF_VALUE_value(nval, i);
-        if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
-            goto err;
-        sk_GENERAL_NAME_push(gens, gen);
-    }
-    return gens;
- err:
-    sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) {
+  GENERAL_NAME *gen;
+  GENERAL_NAMES *gens = NULL;
+  CONF_VALUE *cnf;
+  size_t i;
+  if (!(gens = sk_GENERAL_NAME_new_null())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    cnf = sk_CONF_VALUE_value(nval, i);
+    if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) {
+      goto err;
+    }
+    sk_GENERAL_NAME_push(gens, gen);
+  }
+  return gens;
+err:
+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+  return NULL;
 }
 
-GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method,
-                               X509V3_CTX *ctx, CONF_VALUE *cnf)
-{
-    return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
+GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                               CONF_VALUE *cnf) {
+  return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
 }
 
 GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
-                               const X509V3_EXT_METHOD *method,
-                               X509V3_CTX *ctx, int gen_type,
-                               const char *value, int is_nc)
-{
-    char is_string = 0;
-    GENERAL_NAME *gen = NULL;
+                               const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                               int gen_type, const char *value, int is_nc) {
+  char is_string = 0;
+  GENERAL_NAME *gen = NULL;
 
-    if (!value) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE);
-        return NULL;
+  if (!value) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE);
+    return NULL;
+  }
+
+  if (out) {
+    gen = out;
+  } else {
+    gen = GENERAL_NAME_new();
+    if (gen == NULL) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      return NULL;
     }
+  }
 
-    if (out)
-        gen = out;
-    else {
-        gen = GENERAL_NAME_new();
-        if (gen == NULL) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            return NULL;
-        }
-    }
-
-    switch (gen_type) {
+  switch (gen_type) {
     case GEN_URI:
     case GEN_EMAIL:
     case GEN_DNS:
-        is_string = 1;
-        break;
+      is_string = 1;
+      break;
 
-    case GEN_RID:
-        {
-            ASN1_OBJECT *obj;
-            if (!(obj = OBJ_txt2obj(value, 0))) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_OBJECT);
-                ERR_add_error_data(2, "value=", value);
-                goto err;
-            }
-            gen->d.rid = obj;
-        }
-        break;
+    case GEN_RID: {
+      ASN1_OBJECT *obj;
+      if (!(obj = OBJ_txt2obj(value, 0))) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_OBJECT);
+        ERR_add_error_data(2, "value=", value);
+        goto err;
+      }
+      gen->d.rid = obj;
+    } break;
 
     case GEN_IPADD:
-        if (is_nc)
-            gen->d.ip = a2i_IPADDRESS_NC(value);
-        else
-            gen->d.ip = a2i_IPADDRESS(value);
-        if (gen->d.ip == NULL) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_IP_ADDRESS);
-            ERR_add_error_data(2, "value=", value);
-            goto err;
-        }
-        break;
+      if (is_nc) {
+        gen->d.ip = a2i_IPADDRESS_NC(value);
+      } else {
+        gen->d.ip = a2i_IPADDRESS(value);
+      }
+      if (gen->d.ip == NULL) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_IP_ADDRESS);
+        ERR_add_error_data(2, "value=", value);
+        goto err;
+      }
+      break;
 
     case GEN_DIRNAME:
-        if (!do_dirname(gen, value, ctx)) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_DIRNAME_ERROR);
-            goto err;
-        }
-        break;
+      if (!do_dirname(gen, value, ctx)) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_DIRNAME_ERROR);
+        goto err;
+      }
+      break;
 
     case GEN_OTHERNAME:
-        if (!do_othername(gen, value, ctx)) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_OTHERNAME_ERROR);
-            goto err;
-        }
-        break;
-    default:
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_TYPE);
+      if (!do_othername(gen, value, ctx)) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_OTHERNAME_ERROR);
         goto err;
+      }
+      break;
+    default:
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_TYPE);
+      goto err;
+  }
+
+  if (is_string) {
+    if (!(gen->d.ia5 = ASN1_IA5STRING_new()) ||
+        !ASN1_STRING_set(gen->d.ia5, (unsigned char *)value, strlen(value))) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
     }
+  }
 
-    if (is_string) {
-        if (!(gen->d.ia5 = ASN1_IA5STRING_new()) ||
-            !ASN1_STRING_set(gen->d.ia5, (unsigned char *)value,
-                             strlen(value))) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-    }
+  gen->type = gen_type;
 
-    gen->type = gen_type;
+  return gen;
 
-    return gen;
-
- err:
-    if (!out)
-        GENERAL_NAME_free(gen);
-    return NULL;
+err:
+  if (!out) {
+    GENERAL_NAME_free(gen);
+  }
+  return NULL;
 }
 
 GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
                                   const X509V3_EXT_METHOD *method,
-                                  X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)
-{
-    int type;
+                                  X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc) {
+  int type;
 
-    char *name, *value;
+  char *name, *value;
 
-    name = cnf->name;
-    value = cnf->value;
+  name = cnf->name;
+  value = cnf->value;
 
-    if (!value) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE);
-        return NULL;
-    }
+  if (!value) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE);
+    return NULL;
+  }
 
-    if (!x509v3_name_cmp(name, "email"))
-        type = GEN_EMAIL;
-    else if (!x509v3_name_cmp(name, "URI"))
-        type = GEN_URI;
-    else if (!x509v3_name_cmp(name, "DNS"))
-        type = GEN_DNS;
-    else if (!x509v3_name_cmp(name, "RID"))
-        type = GEN_RID;
-    else if (!x509v3_name_cmp(name, "IP"))
-        type = GEN_IPADD;
-    else if (!x509v3_name_cmp(name, "dirName"))
-        type = GEN_DIRNAME;
-    else if (!x509v3_name_cmp(name, "otherName"))
-        type = GEN_OTHERNAME;
-    else {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_OPTION);
-        ERR_add_error_data(2, "name=", name);
-        return NULL;
-    }
+  if (!x509v3_name_cmp(name, "email")) {
+    type = GEN_EMAIL;
+  } else if (!x509v3_name_cmp(name, "URI")) {
+    type = GEN_URI;
+  } else if (!x509v3_name_cmp(name, "DNS")) {
+    type = GEN_DNS;
+  } else if (!x509v3_name_cmp(name, "RID")) {
+    type = GEN_RID;
+  } else if (!x509v3_name_cmp(name, "IP")) {
+    type = GEN_IPADD;
+  } else if (!x509v3_name_cmp(name, "dirName")) {
+    type = GEN_DIRNAME;
+  } else if (!x509v3_name_cmp(name, "otherName")) {
+    type = GEN_OTHERNAME;
+  } else {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_OPTION);
+    ERR_add_error_data(2, "name=", name);
+    return NULL;
+  }
 
-    return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
-
+  return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
 }
 
-static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx)
-{
-    char *objtmp = NULL;
-    const char *p;
-    int objlen;
-    if (!(p = strchr(value, ';')))
-        return 0;
-    if (!(gen->d.otherName = OTHERNAME_new()))
-        return 0;
-    /*
-     * Free this up because we will overwrite it. no need to free type_id
-     * because it is static
-     */
-    ASN1_TYPE_free(gen->d.otherName->value);
-    if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx)))
-        return 0;
-    objlen = p - value;
-    objtmp = OPENSSL_malloc(objlen + 1);
-    if (objtmp == NULL)
-        return 0;
-    OPENSSL_strlcpy(objtmp, value, objlen + 1);
-    gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0);
-    OPENSSL_free(objtmp);
-    if (!gen->d.otherName->type_id)
-        return 0;
-    return 1;
+static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx) {
+  char *objtmp = NULL;
+  const char *p;
+  int objlen;
+  if (!(p = strchr(value, ';'))) {
+    return 0;
+  }
+  if (!(gen->d.otherName = OTHERNAME_new())) {
+    return 0;
+  }
+  // Free this up because we will overwrite it. no need to free type_id
+  // because it is static
+  ASN1_TYPE_free(gen->d.otherName->value);
+  if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx))) {
+    return 0;
+  }
+  objlen = p - value;
+  objtmp = OPENSSL_malloc(objlen + 1);
+  if (objtmp == NULL) {
+    return 0;
+  }
+  OPENSSL_strlcpy(objtmp, value, objlen + 1);
+  gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0);
+  OPENSSL_free(objtmp);
+  if (!gen->d.otherName->type_id) {
+    return 0;
+  }
+  return 1;
 }
 
-static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx)
-{
-    int ret = 0;
-    STACK_OF(CONF_VALUE) *sk = NULL;
-    X509_NAME *nm = X509_NAME_new();
-    if (nm == NULL)
-        goto err;
-    sk = X509V3_get_section(ctx, value);
-    if (sk == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
-        ERR_add_error_data(2, "section=", value);
-        goto err;
-    }
-    /* FIXME: should allow other character types... */
-    if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC))
-        goto err;
-    gen->d.dirn = nm;
-    ret = 1;
+static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx) {
+  int ret = 0;
+  STACK_OF(CONF_VALUE) *sk = NULL;
+  X509_NAME *nm = X509_NAME_new();
+  if (nm == NULL) {
+    goto err;
+  }
+  sk = X509V3_get_section(ctx, value);
+  if (sk == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
+    ERR_add_error_data(2, "section=", value);
+    goto err;
+  }
+  // FIXME: should allow other character types...
+  if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC)) {
+    goto err;
+  }
+  gen->d.dirn = nm;
+  ret = 1;
 
- err:
-    if (!ret)
-        X509_NAME_free(nm);
-    X509V3_section_free(ctx, sk);
-    return ret;
+err:
+  if (!ret) {
+    X509_NAME_free(nm);
+  }
+  X509V3_section_free(ctx, sk);
+  return ret;
 }
diff --git a/src/crypto/x509v3/v3_bcons.c b/src/crypto/x509v3/v3_bcons.c
index aefefdf..19c1a5d 100644
--- a/src/crypto/x509v3/v3_bcons.c
+++ b/src/crypto/x509v3/v3_bcons.c
@@ -65,69 +65,72 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
-static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS(X509V3_EXT_METHOD *method,
-                                                   BASIC_CONSTRAINTS *bcons,
-                                                   STACK_OF(CONF_VALUE)
-                                                   *extlist);
-static BASIC_CONSTRAINTS *v2i_BASIC_CONSTRAINTS(X509V3_EXT_METHOD *method,
-                                                X509V3_CTX *ctx,
-                                                STACK_OF(CONF_VALUE) *values);
+static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist);
+static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method,
+                                   X509V3_CTX *ctx,
+                                   STACK_OF(CONF_VALUE) *values);
 
 const X509V3_EXT_METHOD v3_bcons = {
-    NID_basic_constraints, 0,
+    NID_basic_constraints,
+    0,
     ASN1_ITEM_ref(BASIC_CONSTRAINTS),
-    0, 0, 0, 0,
-    0, 0,
-    (X509V3_EXT_I2V) i2v_BASIC_CONSTRAINTS,
-    (X509V3_EXT_V2I)v2i_BASIC_CONSTRAINTS,
-    NULL, NULL,
-    NULL
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2v_BASIC_CONSTRAINTS,
+    v2i_BASIC_CONSTRAINTS,
+    NULL,
+    NULL,
+    NULL,
 };
 
 ASN1_SEQUENCE(BASIC_CONSTRAINTS) = {
-        ASN1_OPT(BASIC_CONSTRAINTS, ca, ASN1_FBOOLEAN),
-        ASN1_OPT(BASIC_CONSTRAINTS, pathlen, ASN1_INTEGER)
+    ASN1_OPT(BASIC_CONSTRAINTS, ca, ASN1_FBOOLEAN),
+    ASN1_OPT(BASIC_CONSTRAINTS, pathlen, ASN1_INTEGER),
 } ASN1_SEQUENCE_END(BASIC_CONSTRAINTS)
 
-IMPLEMENT_ASN1_FUNCTIONS(BASIC_CONSTRAINTS)
+IMPLEMENT_ASN1_FUNCTIONS_const(BASIC_CONSTRAINTS)
 
-static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS(X509V3_EXT_METHOD *method,
-                                                   BASIC_CONSTRAINTS *bcons,
-                                                   STACK_OF(CONF_VALUE)
-                                                   *extlist)
-{
-    X509V3_add_value_bool("CA", bcons->ca, &extlist);
-    X509V3_add_value_int("pathlen", bcons->pathlen, &extlist);
-    return extlist;
+static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist) {
+  const BASIC_CONSTRAINTS *bcons = ext;
+  X509V3_add_value_bool("CA", bcons->ca, &extlist);
+  X509V3_add_value_int("pathlen", bcons->pathlen, &extlist);
+  return extlist;
 }
 
-static BASIC_CONSTRAINTS *v2i_BASIC_CONSTRAINTS(X509V3_EXT_METHOD *method,
-                                                X509V3_CTX *ctx,
-                                                STACK_OF(CONF_VALUE) *values)
-{
-    BASIC_CONSTRAINTS *bcons = NULL;
-    CONF_VALUE *val;
-    size_t i;
-    if (!(bcons = BASIC_CONSTRAINTS_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
-        val = sk_CONF_VALUE_value(values, i);
-        if (!strcmp(val->name, "CA")) {
-            if (!X509V3_get_value_bool(val, &bcons->ca))
-                goto err;
-        } else if (!strcmp(val->name, "pathlen")) {
-            if (!X509V3_get_value_int(val, &bcons->pathlen))
-                goto err;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
-            X509V3_conf_err(val);
-            goto err;
-        }
-    }
-    return bcons;
- err:
-    BASIC_CONSTRAINTS_free(bcons);
+static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method,
+                                   X509V3_CTX *ctx,
+                                   STACK_OF(CONF_VALUE) *values) {
+  BASIC_CONSTRAINTS *bcons = NULL;
+  CONF_VALUE *val;
+  size_t i;
+  if (!(bcons = BASIC_CONSTRAINTS_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
+    val = sk_CONF_VALUE_value(values, i);
+    if (!strcmp(val->name, "CA")) {
+      if (!X509V3_get_value_bool(val, &bcons->ca)) {
+        goto err;
+      }
+    } else if (!strcmp(val->name, "pathlen")) {
+      if (!X509V3_get_value_int(val, &bcons->pathlen)) {
+        goto err;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
+      X509V3_conf_err(val);
+      goto err;
+    }
+  }
+  return bcons;
+err:
+  BASIC_CONSTRAINTS_free(bcons);
+  return NULL;
 }
diff --git a/src/crypto/x509v3/v3_bitst.c b/src/crypto/x509v3/v3_bitst.c
index 871b776..9562826 100644
--- a/src/crypto/x509v3/v3_bitst.c
+++ b/src/crypto/x509v3/v3_bitst.c
@@ -75,8 +75,7 @@
     {5, "SSL CA", "sslCA"},
     {6, "S/MIME CA", "emailCA"},
     {7, "Object Signing CA", "objCA"},
-    {-1, NULL, NULL}
-};
+    {-1, NULL, NULL}};
 
 static const BIT_STRING_BITNAME key_usage_type_table[] = {
     {0, "Digital Signature", "digitalSignature"},
@@ -88,57 +87,59 @@
     {6, "CRL Sign", "cRLSign"},
     {7, "Encipher Only", "encipherOnly"},
     {8, "Decipher Only", "decipherOnly"},
-    {-1, NULL, NULL}
-};
+    {-1, NULL, NULL}};
+
+static STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) {
+  const ASN1_BIT_STRING *bits = ext;
+  const BIT_STRING_BITNAME *bnam;
+  for (bnam = method->usr_data; bnam->lname; bnam++) {
+    if (ASN1_BIT_STRING_get_bit(bits, bnam->bitnum)) {
+      X509V3_add_value(bnam->lname, NULL, &ret);
+    }
+  }
+  return ret;
+}
+
+static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method,
+                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) {
+  CONF_VALUE *val;
+  ASN1_BIT_STRING *bs;
+  size_t i;
+  const BIT_STRING_BITNAME *bnam;
+  if (!(bs = ASN1_BIT_STRING_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    val = sk_CONF_VALUE_value(nval, i);
+    for (bnam = method->usr_data; bnam->lname; bnam++) {
+      if (!strcmp(bnam->sname, val->name) || !strcmp(bnam->lname, val->name)) {
+        if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) {
+          OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+          ASN1_BIT_STRING_free(bs);
+          return NULL;
+        }
+        break;
+      }
+    }
+    if (!bnam->lname) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT);
+      X509V3_conf_err(val);
+      ASN1_BIT_STRING_free(bs);
+      return NULL;
+    }
+  }
+  return bs;
+}
+
+#define EXT_BITSTRING(nid, table)                                             \
+  {                                                                           \
+    nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), 0, 0, 0, 0, 0, 0,                 \
+        i2v_ASN1_BIT_STRING, v2i_ASN1_BIT_STRING, NULL, NULL, (void *)(table) \
+  }
 
 const X509V3_EXT_METHOD v3_nscert =
-EXT_BITSTRING(NID_netscape_cert_type, ns_cert_type_table);
+    EXT_BITSTRING(NID_netscape_cert_type, ns_cert_type_table);
 const X509V3_EXT_METHOD v3_key_usage =
-EXT_BITSTRING(NID_key_usage, key_usage_type_table);
-
-STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
-                                          ASN1_BIT_STRING *bits,
-                                          STACK_OF(CONF_VALUE) *ret)
-{
-    const BIT_STRING_BITNAME *bnam;
-    for (bnam = method->usr_data; bnam->lname; bnam++) {
-        if (ASN1_BIT_STRING_get_bit(bits, bnam->bitnum))
-            X509V3_add_value(bnam->lname, NULL, &ret);
-    }
-    return ret;
-}
-
-ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
-                                     X509V3_CTX *ctx,
-                                     STACK_OF(CONF_VALUE) *nval)
-{
-    CONF_VALUE *val;
-    ASN1_BIT_STRING *bs;
-    size_t i;
-    const BIT_STRING_BITNAME *bnam;
-    if (!(bs = ASN1_BIT_STRING_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        val = sk_CONF_VALUE_value(nval, i);
-        for (bnam = method->usr_data; bnam->lname; bnam++) {
-            if (!strcmp(bnam->sname, val->name) ||
-                !strcmp(bnam->lname, val->name)) {
-                if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) {
-                    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-                    ASN1_BIT_STRING_free(bs);
-                    return NULL;
-                }
-                break;
-            }
-        }
-        if (!bnam->lname) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT);
-            X509V3_conf_err(val);
-            ASN1_BIT_STRING_free(bs);
-            return NULL;
-        }
-    }
-    return bs;
-}
+    EXT_BITSTRING(NID_key_usage, key_usage_type_table);
diff --git a/src/crypto/x509v3/v3_conf.c b/src/crypto/x509v3/v3_conf.c
index 3192752..64bed7a 100644
--- a/src/crypto/x509v3/v3_conf.c
+++ b/src/crypto/x509v3/v3_conf.c
@@ -55,7 +55,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* extension creation utilities */
+// extension creation utilities
 
 #include <ctype.h>
 #include <stdio.h>
@@ -79,390 +79,389 @@
 static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value,
                                             int crit, int type,
                                             X509V3_CTX *ctx);
-static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method,
-                                  int ext_nid, int crit, void *ext_struc);
+static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid,
+                                  int crit, void *ext_struc);
 static unsigned char *generic_asn1(const char *value, X509V3_CTX *ctx,
                                    long *ext_len);
-/* CONF *conf:  Config file    */
-/* char *name:  Name    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *name:  Name
+// char *value:  Value
 X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name,
-                                 const char *value)
-{
-    int crit;
-    int ext_type;
-    X509_EXTENSION *ret;
-    crit = v3_check_critical(&value);
-    if ((ext_type = v3_check_generic(&value)))
-        return v3_generic_extension(name, value, crit, ext_type, ctx);
-    ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value);
-    if (!ret) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ERROR_IN_EXTENSION);
-        ERR_add_error_data(4, "name=", name, ", value=", value);
-    }
-    return ret;
+                                 const char *value) {
+  int crit;
+  int ext_type;
+  X509_EXTENSION *ret;
+  crit = v3_check_critical(&value);
+  if ((ext_type = v3_check_generic(&value))) {
+    return v3_generic_extension(name, value, crit, ext_type, ctx);
+  }
+  ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value);
+  if (!ret) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_ERROR_IN_EXTENSION);
+    ERR_add_error_data(4, "name=", name, ", value=", value);
+  }
+  return ret;
 }
 
-/* CONF *conf:  Config file    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *value:  Value
 X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid,
-                                     const char *value)
-{
-    int crit;
-    int ext_type;
-    crit = v3_check_critical(&value);
-    if ((ext_type = v3_check_generic(&value)))
-        return v3_generic_extension(OBJ_nid2sn(ext_nid),
-                                    value, crit, ext_type, ctx);
-    return do_ext_nconf(conf, ctx, ext_nid, crit, value);
+                                     const char *value) {
+  int crit;
+  int ext_type;
+  crit = v3_check_critical(&value);
+  if ((ext_type = v3_check_generic(&value))) {
+    return v3_generic_extension(OBJ_nid2sn(ext_nid), value, crit, ext_type,
+                                ctx);
+  }
+  return do_ext_nconf(conf, ctx, ext_nid, crit, value);
 }
 
-/* CONF *conf:  Config file    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *value:  Value
 static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid,
-                                    int crit, const char *value)
-{
-    const X509V3_EXT_METHOD *method;
-    X509_EXTENSION *ext;
-    STACK_OF(CONF_VALUE) *nval;
-    void *ext_struc;
-    if (ext_nid == NID_undef) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME);
-        return NULL;
-    }
-    if (!(method = X509V3_EXT_get_nid(ext_nid))) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION);
-        return NULL;
-    }
-    /* Now get internal extension representation based on type */
-    if (method->v2i) {
-        if (*value == '@')
-            nval = NCONF_get_section(conf, value + 1);
-        else
-            nval = X509V3_parse_list(value);
-        if (nval == NULL || sk_CONF_VALUE_num(nval) <= 0) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_EXTENSION_STRING);
-            ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=",
-                               value);
-            if (*value != '@')
-                sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
-            return NULL;
-        }
-        ext_struc = method->v2i(method, ctx, nval);
-        if (*value != '@')
-            sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
-        if (!ext_struc)
-            return NULL;
-    } else if (method->s2i) {
-        if (!(ext_struc = method->s2i(method, ctx, value)))
-            return NULL;
-    } else if (method->r2i) {
-        if (!ctx->db || !ctx->db_meth) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE);
-            return NULL;
-        }
-        if (!(ext_struc = method->r2i(method, ctx, value)))
-            return NULL;
-    } else {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED);
-        ERR_add_error_data(2, "name=", OBJ_nid2sn(ext_nid));
-        return NULL;
-    }
-
-    ext = do_ext_i2d(method, ext_nid, crit, ext_struc);
-    if (method->it)
-        ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it));
-    else
-        method->ext_free(ext_struc);
-    return ext;
-
-}
-
-static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method,
-                                  int ext_nid, int crit, void *ext_struc)
-{
-    unsigned char *ext_der;
-    int ext_len;
-    ASN1_OCTET_STRING *ext_oct;
-    X509_EXTENSION *ext;
-    /* Convert internal representation to DER */
-    if (method->it) {
-        ext_der = NULL;
-        ext_len =
-            ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
-        if (ext_len < 0)
-            goto merr;
-    } else {
-        unsigned char *p;
-        ext_len = method->i2d(ext_struc, NULL);
-        if (!(ext_der = OPENSSL_malloc(ext_len)))
-            goto merr;
-        p = ext_der;
-        method->i2d(ext_struc, &p);
-    }
-    if (!(ext_oct = ASN1_OCTET_STRING_new()))
-        goto merr;
-    ext_oct->data = ext_der;
-    ext_oct->length = ext_len;
-
-    ext = X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct);
-    if (!ext)
-        goto merr;
-    ASN1_OCTET_STRING_free(ext_oct);
-
-    return ext;
-
- merr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+                                    int crit, const char *value) {
+  const X509V3_EXT_METHOD *method;
+  X509_EXTENSION *ext;
+  STACK_OF(CONF_VALUE) *nval;
+  void *ext_struc;
+  if (ext_nid == NID_undef) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME);
     return NULL;
-
-}
-
-/* Given an internal structure, nid and critical flag create an extension */
-
-X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc)
-{
-    const X509V3_EXT_METHOD *method;
-    if (!(method = X509V3_EXT_get_nid(ext_nid))) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION);
-        return NULL;
+  }
+  if (!(method = X509V3_EXT_get_nid(ext_nid))) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION);
+    return NULL;
+  }
+  // Now get internal extension representation based on type
+  if (method->v2i) {
+    if (*value == '@') {
+      nval = NCONF_get_section(conf, value + 1);
+    } else {
+      nval = X509V3_parse_list(value);
     }
-    return do_ext_i2d(method, ext_nid, crit, ext_struc);
+    if (nval == NULL || sk_CONF_VALUE_num(nval) <= 0) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_EXTENSION_STRING);
+      ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=", value);
+      if (*value != '@') {
+        sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
+      }
+      return NULL;
+    }
+    ext_struc = method->v2i(method, ctx, nval);
+    if (*value != '@') {
+      sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
+    }
+    if (!ext_struc) {
+      return NULL;
+    }
+  } else if (method->s2i) {
+    if (!(ext_struc = method->s2i(method, ctx, value))) {
+      return NULL;
+    }
+  } else if (method->r2i) {
+    if (!ctx->db || !ctx->db_meth) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE);
+      return NULL;
+    }
+    if (!(ext_struc = method->r2i(method, ctx, value))) {
+      return NULL;
+    }
+  } else {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED);
+    ERR_add_error_data(2, "name=", OBJ_nid2sn(ext_nid));
+    return NULL;
+  }
+
+  ext = do_ext_i2d(method, ext_nid, crit, ext_struc);
+  if (method->it) {
+    ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it));
+  } else {
+    method->ext_free(ext_struc);
+  }
+  return ext;
 }
 
-/* Check the extension string for critical flag */
-static int v3_check_critical(const char **value)
-{
-    const char *p = *value;
-    if ((strlen(p) < 9) || strncmp(p, "critical,", 9))
-        return 0;
-    p += 9;
-    while (isspace((unsigned char)*p))
-        p++;
-    *value = p;
-    return 1;
+static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid,
+                                  int crit, void *ext_struc) {
+  unsigned char *ext_der;
+  int ext_len;
+  ASN1_OCTET_STRING *ext_oct;
+  X509_EXTENSION *ext;
+  // Convert internal representation to DER
+  if (method->it) {
+    ext_der = NULL;
+    ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
+    if (ext_len < 0) {
+      goto merr;
+    }
+  } else {
+    unsigned char *p;
+    ext_len = method->i2d(ext_struc, NULL);
+    if (!(ext_der = OPENSSL_malloc(ext_len))) {
+      goto merr;
+    }
+    p = ext_der;
+    method->i2d(ext_struc, &p);
+  }
+  if (!(ext_oct = ASN1_OCTET_STRING_new())) {
+    goto merr;
+  }
+  ext_oct->data = ext_der;
+  ext_oct->length = ext_len;
+
+  ext = X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct);
+  if (!ext) {
+    goto merr;
+  }
+  ASN1_OCTET_STRING_free(ext_oct);
+
+  return ext;
+
+merr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  return NULL;
 }
 
-/* Check extension string for generic extension and return the type */
-static int v3_check_generic(const char **value)
-{
-    int gen_type = 0;
-    const char *p = *value;
-    if ((strlen(p) >= 4) && !strncmp(p, "DER:", 4)) {
-        p += 4;
-        gen_type = 1;
-    } else if ((strlen(p) >= 5) && !strncmp(p, "ASN1:", 5)) {
-        p += 5;
-        gen_type = 2;
-    } else
-        return 0;
+// Given an internal structure, nid and critical flag create an extension
 
-    while (isspace((unsigned char)*p))
-        p++;
-    *value = p;
-    return gen_type;
+X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc) {
+  const X509V3_EXT_METHOD *method;
+  if (!(method = X509V3_EXT_get_nid(ext_nid))) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION);
+    return NULL;
+  }
+  return do_ext_i2d(method, ext_nid, crit, ext_struc);
 }
 
-/* Create a generic extension: for now just handle DER type */
+// Check the extension string for critical flag
+static int v3_check_critical(const char **value) {
+  const char *p = *value;
+  if ((strlen(p) < 9) || strncmp(p, "critical,", 9)) {
+    return 0;
+  }
+  p += 9;
+  while (isspace((unsigned char)*p)) {
+    p++;
+  }
+  *value = p;
+  return 1;
+}
+
+// Check extension string for generic extension and return the type
+static int v3_check_generic(const char **value) {
+  int gen_type = 0;
+  const char *p = *value;
+  if ((strlen(p) >= 4) && !strncmp(p, "DER:", 4)) {
+    p += 4;
+    gen_type = 1;
+  } else if ((strlen(p) >= 5) && !strncmp(p, "ASN1:", 5)) {
+    p += 5;
+    gen_type = 2;
+  } else {
+    return 0;
+  }
+
+  while (isspace((unsigned char)*p)) {
+    p++;
+  }
+  *value = p;
+  return gen_type;
+}
+
+// Create a generic extension: for now just handle DER type
 static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value,
                                             int crit, int gen_type,
-                                            X509V3_CTX *ctx)
-{
-    unsigned char *ext_der = NULL;
-    long ext_len = 0;
-    ASN1_OBJECT *obj = NULL;
-    ASN1_OCTET_STRING *oct = NULL;
-    X509_EXTENSION *extension = NULL;
-    if (!(obj = OBJ_txt2obj(ext, 0))) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_NAME_ERROR);
-        ERR_add_error_data(2, "name=", ext);
-        goto err;
-    }
+                                            X509V3_CTX *ctx) {
+  unsigned char *ext_der = NULL;
+  long ext_len = 0;
+  ASN1_OBJECT *obj = NULL;
+  ASN1_OCTET_STRING *oct = NULL;
+  X509_EXTENSION *extension = NULL;
+  if (!(obj = OBJ_txt2obj(ext, 0))) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_NAME_ERROR);
+    ERR_add_error_data(2, "name=", ext);
+    goto err;
+  }
 
-    if (gen_type == 1)
-        ext_der = x509v3_hex_to_bytes(value, &ext_len);
-    else if (gen_type == 2)
-        ext_der = generic_asn1(value, ctx, &ext_len);
+  if (gen_type == 1) {
+    ext_der = x509v3_hex_to_bytes(value, &ext_len);
+  } else if (gen_type == 2) {
+    ext_der = generic_asn1(value, ctx, &ext_len);
+  }
 
-    if (ext_der == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
-        ERR_add_error_data(2, "value=", value);
-        goto err;
-    }
+  if (ext_der == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_VALUE_ERROR);
+    ERR_add_error_data(2, "value=", value);
+    goto err;
+  }
 
-    if (!(oct = ASN1_OCTET_STRING_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
+  if (!(oct = ASN1_OCTET_STRING_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
 
-    oct->data = ext_der;
-    oct->length = ext_len;
-    ext_der = NULL;
+  oct->data = ext_der;
+  oct->length = ext_len;
+  ext_der = NULL;
 
-    extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct);
+  extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct);
 
- err:
-    ASN1_OBJECT_free(obj);
-    ASN1_OCTET_STRING_free(oct);
-    if (ext_der)
-        OPENSSL_free(ext_der);
-    return extension;
-
+err:
+  ASN1_OBJECT_free(obj);
+  ASN1_OCTET_STRING_free(oct);
+  OPENSSL_free(ext_der);
+  return extension;
 }
 
 static unsigned char *generic_asn1(const char *value, X509V3_CTX *ctx,
-                                   long *ext_len)
-{
-    ASN1_TYPE *typ;
-    unsigned char *ext_der = NULL;
-    typ = ASN1_generate_v3(value, ctx);
-    if (typ == NULL)
-        return NULL;
-    *ext_len = i2d_ASN1_TYPE(typ, &ext_der);
-    ASN1_TYPE_free(typ);
-    return ext_der;
+                                   long *ext_len) {
+  ASN1_TYPE *typ;
+  unsigned char *ext_der = NULL;
+  typ = ASN1_generate_v3(value, ctx);
+  if (typ == NULL) {
+    return NULL;
+  }
+  *ext_len = i2d_ASN1_TYPE(typ, &ext_der);
+  ASN1_TYPE_free(typ);
+  return ext_der;
 }
 
-/*
- * This is the main function: add a bunch of extensions based on a config
- * file section to an extension STACK.
- */
+// This is the main function: add a bunch of extensions based on a config
+// file section to an extension STACK.
 
 int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section,
-                            STACK_OF(X509_EXTENSION) **sk)
-{
-    X509_EXTENSION *ext;
-    STACK_OF(CONF_VALUE) *nval;
-    CONF_VALUE *val;
-    size_t i;
-    if (!(nval = NCONF_get_section(conf, section)))
-        return 0;
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        val = sk_CONF_VALUE_value(nval, i);
-        if (!(ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value)))
-            return 0;
-        if (sk)
-            X509v3_add_ext(sk, ext, -1);
-        X509_EXTENSION_free(ext);
+                            STACK_OF(X509_EXTENSION) **sk) {
+  X509_EXTENSION *ext;
+  STACK_OF(CONF_VALUE) *nval;
+  CONF_VALUE *val;
+  size_t i;
+  if (!(nval = NCONF_get_section(conf, section))) {
+    return 0;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    val = sk_CONF_VALUE_value(nval, i);
+    if (!(ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value))) {
+      return 0;
     }
-    return 1;
+    if (sk) {
+      X509v3_add_ext(sk, ext, -1);
+    }
+    X509_EXTENSION_free(ext);
+  }
+  return 1;
 }
 
-/*
- * Convenience functions to add extensions to a certificate, CRL and request
- */
+// Convenience functions to add extensions to a certificate, CRL and request
 
 int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
-                         X509 *cert)
-{
-    STACK_OF(X509_EXTENSION) **sk = NULL;
-    if (cert)
-        sk = &cert->cert_info->extensions;
-    return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
+                         X509 *cert) {
+  STACK_OF(X509_EXTENSION) **sk = NULL;
+  if (cert) {
+    sk = &cert->cert_info->extensions;
+  }
+  return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
 }
 
-/* Same as above but for a CRL */
+// Same as above but for a CRL
 
 int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
-                             X509_CRL *crl)
-{
-    STACK_OF(X509_EXTENSION) **sk = NULL;
-    if (crl)
-        sk = &crl->crl->extensions;
-    return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
+                             X509_CRL *crl) {
+  STACK_OF(X509_EXTENSION) **sk = NULL;
+  if (crl) {
+    sk = &crl->crl->extensions;
+  }
+  return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
 }
 
-/* Add extensions to certificate request */
+// Add extensions to certificate request
 
 int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
-                             X509_REQ *req)
-{
-    STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL;
-    int i;
-    if (req)
-        sk = &extlist;
-    i = X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
-    if (!i || !sk)
-        return i;
-    i = X509_REQ_add_extensions(req, extlist);
-    sk_X509_EXTENSION_pop_free(extlist, X509_EXTENSION_free);
+                             X509_REQ *req) {
+  STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL;
+  int i;
+  if (req) {
+    sk = &extlist;
+  }
+  i = X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
+  if (!i || !sk) {
     return i;
+  }
+  i = X509_REQ_add_extensions(req, extlist);
+  sk_X509_EXTENSION_pop_free(extlist, X509_EXTENSION_free);
+  return i;
 }
 
-/* Config database functions */
+// Config database functions
 
-char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section)
-{
-    if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_string) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED);
-        return NULL;
-    }
-    if (ctx->db_meth->get_string)
-        return ctx->db_meth->get_string(ctx->db, name, section);
+char *X509V3_get_string(X509V3_CTX *ctx, const char *name,
+                        const char *section) {
+  if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_string) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED);
     return NULL;
+  }
+  if (ctx->db_meth->get_string) {
+    return ctx->db_meth->get_string(ctx->db, name, section);
+  }
+  return NULL;
 }
 
-STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section)
-{
-    if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_section) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED);
-        return NULL;
-    }
-    if (ctx->db_meth->get_section)
-        return ctx->db_meth->get_section(ctx->db, section);
+STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section) {
+  if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_section) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED);
     return NULL;
+  }
+  if (ctx->db_meth->get_section) {
+    return ctx->db_meth->get_section(ctx->db, section);
+  }
+  return NULL;
 }
 
-void X509V3_string_free(X509V3_CTX *ctx, char *str)
-{
-    if (!str)
-        return;
-    if (ctx->db_meth->free_string)
-        ctx->db_meth->free_string(ctx->db, str);
+void X509V3_string_free(X509V3_CTX *ctx, char *str) {
+  if (!str) {
+    return;
+  }
+  if (ctx->db_meth->free_string) {
+    ctx->db_meth->free_string(ctx->db, str);
+  }
 }
 
-void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section)
-{
-    if (!section)
-        return;
-    if (ctx->db_meth->free_section)
-        ctx->db_meth->free_section(ctx->db, section);
+void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section) {
+  if (!section) {
+    return;
+  }
+  if (ctx->db_meth->free_section) {
+    ctx->db_meth->free_section(ctx->db, section);
+  }
 }
 
-static char *nconf_get_string(void *db, const char *section, const char *value)
-{
-    /* TODO(fork): This returns a non-const pointer because |X509V3_CONF_METHOD|
-     * allows |get_string| to return caller-owned pointers, provided they're
-     * freed by |free_string|. |nconf_method| leaves |free_string| NULL, and
-     * there are no other implementations of |X509V3_CONF_METHOD|, so this can
-     * be simplified if we make it private. */
-    return (char *)NCONF_get_string(db, section, value);
+static char *nconf_get_string(void *db, const char *section,
+                              const char *value) {
+  // TODO(fork): This returns a non-const pointer because |X509V3_CONF_METHOD|
+  // allows |get_string| to return caller-owned pointers, provided they're
+  // freed by |free_string|. |nconf_method| leaves |free_string| NULL, and
+  // there are no other implementations of |X509V3_CONF_METHOD|, so this can
+  // be simplified if we make it private.
+  return (char *)NCONF_get_string(db, section, value);
 }
 
-static STACK_OF(CONF_VALUE) *nconf_get_section(void *db, const char *section)
-{
-    return NCONF_get_section(db, section);
+static STACK_OF(CONF_VALUE) *nconf_get_section(void *db, const char *section) {
+  return NCONF_get_section(db, section);
 }
 
-static const X509V3_CONF_METHOD nconf_method = {
-    nconf_get_string,
-    nconf_get_section,
-    NULL,
-    NULL
-};
+static const X509V3_CONF_METHOD nconf_method = {nconf_get_string,
+                                                nconf_get_section, NULL, NULL};
 
-void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf)
-{
-    ctx->db_meth = &nconf_method;
-    ctx->db = conf;
+void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf) {
+  ctx->db_meth = &nconf_method;
+  ctx->db = conf;
 }
 
 void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subj, X509_REQ *req,
-                    X509_CRL *crl, int flags)
-{
-    ctx->issuer_cert = issuer;
-    ctx->subject_cert = subj;
-    ctx->crl = crl;
-    ctx->subject_req = req;
-    ctx->flags = flags;
+                    X509_CRL *crl, int flags) {
+  ctx->issuer_cert = issuer;
+  ctx->subject_cert = subj;
+  ctx->crl = crl;
+  ctx->subject_req = req;
+  ctx->flags = flags;
 }
diff --git a/src/crypto/x509v3/v3_cpols.c b/src/crypto/x509v3/v3_cpols.c
index 6e3eb14..82c68a1 100644
--- a/src/crypto/x509v3/v3_cpols.c
+++ b/src/crypto/x509v3/v3_cpols.c
@@ -71,15 +71,15 @@
 
 #include "internal.h"
 
-/* Certificate policies extension support: this one is a bit complex... */
+// Certificate policies extension support: this one is a bit complex...
 
-static int i2r_certpol(X509V3_EXT_METHOD *method, STACK_OF(POLICYINFO) *pol,
-                       BIO *out, int indent);
-static STACK_OF(POLICYINFO) *r2i_certpol(X509V3_EXT_METHOD *method,
-                                         X509V3_CTX *ctx, char *value);
-static void print_qualifiers(BIO *out, STACK_OF(POLICYQUALINFO) *quals,
+static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
+                       int indent);
+static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                         const char *value);
+static void print_qualifiers(BIO *out, const STACK_OF(POLICYQUALINFO) *quals,
                              int indent);
-static void print_notice(BIO *out, USERNOTICE *notice, int indent);
+static void print_notice(BIO *out, const USERNOTICE *notice, int indent);
 static POLICYINFO *policy_section(X509V3_CTX *ctx,
                                   STACK_OF(CONF_VALUE) *polstrs, int ia5org);
 static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
@@ -87,414 +87,435 @@
 static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos);
 
 const X509V3_EXT_METHOD v3_cpols = {
-    NID_certificate_policies, 0, ASN1_ITEM_ref(CERTIFICATEPOLICIES),
-    0, 0, 0, 0,
-    0, 0,
-    0, 0,
-    (X509V3_EXT_I2R)i2r_certpol,
-    (X509V3_EXT_R2I)r2i_certpol,
-    NULL
+    NID_certificate_policies,
+    0,
+    ASN1_ITEM_ref(CERTIFICATEPOLICIES),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2r_certpol,
+    r2i_certpol,
+    NULL,
 };
 
-ASN1_ITEM_TEMPLATE(CERTIFICATEPOLICIES) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, CERTIFICATEPOLICIES, POLICYINFO)
+ASN1_ITEM_TEMPLATE(CERTIFICATEPOLICIES) = ASN1_EX_TEMPLATE_TYPE(
+    ASN1_TFLG_SEQUENCE_OF, 0, CERTIFICATEPOLICIES, POLICYINFO)
 ASN1_ITEM_TEMPLATE_END(CERTIFICATEPOLICIES)
 
-IMPLEMENT_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)
+IMPLEMENT_ASN1_FUNCTIONS_const(CERTIFICATEPOLICIES)
 
 ASN1_SEQUENCE(POLICYINFO) = {
-        ASN1_SIMPLE(POLICYINFO, policyid, ASN1_OBJECT),
-        ASN1_SEQUENCE_OF_OPT(POLICYINFO, qualifiers, POLICYQUALINFO)
+    ASN1_SIMPLE(POLICYINFO, policyid, ASN1_OBJECT),
+    ASN1_SEQUENCE_OF_OPT(POLICYINFO, qualifiers, POLICYQUALINFO),
 } ASN1_SEQUENCE_END(POLICYINFO)
 
-IMPLEMENT_ASN1_FUNCTIONS(POLICYINFO)
+IMPLEMENT_ASN1_FUNCTIONS_const(POLICYINFO)
 
-ASN1_ADB_TEMPLATE(policydefault) = ASN1_SIMPLE(POLICYQUALINFO, d.other, ASN1_ANY);
+ASN1_ADB_TEMPLATE(policydefault) = ASN1_SIMPLE(POLICYQUALINFO, d.other,
+                                               ASN1_ANY);
 
 ASN1_ADB(POLICYQUALINFO) = {
-        ADB_ENTRY(NID_id_qt_cps, ASN1_SIMPLE(POLICYQUALINFO, d.cpsuri, ASN1_IA5STRING)),
-        ADB_ENTRY(NID_id_qt_unotice, ASN1_SIMPLE(POLICYQUALINFO, d.usernotice, USERNOTICE))
+    ADB_ENTRY(NID_id_qt_cps,
+              ASN1_SIMPLE(POLICYQUALINFO, d.cpsuri, ASN1_IA5STRING)),
+    ADB_ENTRY(NID_id_qt_unotice,
+              ASN1_SIMPLE(POLICYQUALINFO, d.usernotice, USERNOTICE)),
 } ASN1_ADB_END(POLICYQUALINFO, 0, pqualid, 0, &policydefault_tt, NULL);
 
 ASN1_SEQUENCE(POLICYQUALINFO) = {
-        ASN1_SIMPLE(POLICYQUALINFO, pqualid, ASN1_OBJECT),
-        ASN1_ADB_OBJECT(POLICYQUALINFO)
+    ASN1_SIMPLE(POLICYQUALINFO, pqualid, ASN1_OBJECT),
+    ASN1_ADB_OBJECT(POLICYQUALINFO),
 } ASN1_SEQUENCE_END(POLICYQUALINFO)
 
-IMPLEMENT_ASN1_FUNCTIONS(POLICYQUALINFO)
+IMPLEMENT_ASN1_FUNCTIONS_const(POLICYQUALINFO)
 
 ASN1_SEQUENCE(USERNOTICE) = {
-        ASN1_OPT(USERNOTICE, noticeref, NOTICEREF),
-        ASN1_OPT(USERNOTICE, exptext, DISPLAYTEXT)
+    ASN1_OPT(USERNOTICE, noticeref, NOTICEREF),
+    ASN1_OPT(USERNOTICE, exptext, DISPLAYTEXT),
 } ASN1_SEQUENCE_END(USERNOTICE)
 
-IMPLEMENT_ASN1_FUNCTIONS(USERNOTICE)
+IMPLEMENT_ASN1_FUNCTIONS_const(USERNOTICE)
 
 ASN1_SEQUENCE(NOTICEREF) = {
-        ASN1_SIMPLE(NOTICEREF, organization, DISPLAYTEXT),
-        ASN1_SEQUENCE_OF(NOTICEREF, noticenos, ASN1_INTEGER)
+    ASN1_SIMPLE(NOTICEREF, organization, DISPLAYTEXT),
+    ASN1_SEQUENCE_OF(NOTICEREF, noticenos, ASN1_INTEGER),
 } ASN1_SEQUENCE_END(NOTICEREF)
 
-IMPLEMENT_ASN1_FUNCTIONS(NOTICEREF)
+IMPLEMENT_ASN1_FUNCTIONS_const(NOTICEREF)
 
-static STACK_OF(POLICYINFO) *r2i_certpol(X509V3_EXT_METHOD *method,
-                                         X509V3_CTX *ctx, char *value)
-{
-    STACK_OF(POLICYINFO) *pols = NULL;
-    char *pstr;
-    POLICYINFO *pol;
-    ASN1_OBJECT *pobj;
-    STACK_OF(CONF_VALUE) *vals;
-    CONF_VALUE *cnf;
-    size_t i;
-    int ia5org;
-    pols = sk_POLICYINFO_new_null();
-    if (pols == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    vals = X509V3_parse_list(value);
-    if (vals == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_X509V3_LIB);
-        goto err;
-    }
-    ia5org = 0;
-    for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
-        cnf = sk_CONF_VALUE_value(vals, i);
-        if (cnf->value || !cnf->name) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_POLICY_IDENTIFIER);
-            X509V3_conf_err(cnf);
-            goto err;
-        }
-        pstr = cnf->name;
-        if (!strcmp(pstr, "ia5org")) {
-            ia5org = 1;
-            continue;
-        } else if (*pstr == '@') {
-            STACK_OF(CONF_VALUE) *polsect;
-            polsect = X509V3_get_section(ctx, pstr + 1);
-            if (!polsect) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
-
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            pol = policy_section(ctx, polsect, ia5org);
-            X509V3_section_free(ctx, polsect);
-            if (!pol)
-                goto err;
-        } else {
-            if (!(pobj = OBJ_txt2obj(cnf->name, 0))) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            pol = POLICYINFO_new();
-            if (pol == NULL) {
-                OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-                ASN1_OBJECT_free(pobj);
-                goto err;
-            }
-            pol->policyid = pobj;
-        }
-        if (!sk_POLICYINFO_push(pols, pol)) {
-            POLICYINFO_free(pol);
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-    }
-    sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
-    return pols;
- err:
-    sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
-    sk_POLICYINFO_pop_free(pols, POLICYINFO_free);
+static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                         const char *value) {
+  STACK_OF(POLICYINFO) *pols = NULL;
+  char *pstr;
+  POLICYINFO *pol;
+  ASN1_OBJECT *pobj;
+  STACK_OF(CONF_VALUE) *vals;
+  CONF_VALUE *cnf;
+  size_t i;
+  int ia5org;
+  pols = sk_POLICYINFO_new_null();
+  if (pols == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     return NULL;
+  }
+  vals = X509V3_parse_list(value);
+  if (vals == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_X509V3_LIB);
+    goto err;
+  }
+  ia5org = 0;
+  for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
+    cnf = sk_CONF_VALUE_value(vals, i);
+    if (cnf->value || !cnf->name) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_POLICY_IDENTIFIER);
+      X509V3_conf_err(cnf);
+      goto err;
+    }
+    pstr = cnf->name;
+    if (!strcmp(pstr, "ia5org")) {
+      ia5org = 1;
+      continue;
+    } else if (*pstr == '@') {
+      STACK_OF(CONF_VALUE) *polsect;
+      polsect = X509V3_get_section(ctx, pstr + 1);
+      if (!polsect) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
+
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+      pol = policy_section(ctx, polsect, ia5org);
+      X509V3_section_free(ctx, polsect);
+      if (!pol) {
+        goto err;
+      }
+    } else {
+      if (!(pobj = OBJ_txt2obj(cnf->name, 0))) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+      pol = POLICYINFO_new();
+      if (pol == NULL) {
+        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+        ASN1_OBJECT_free(pobj);
+        goto err;
+      }
+      pol->policyid = pobj;
+    }
+    if (!sk_POLICYINFO_push(pols, pol)) {
+      POLICYINFO_free(pol);
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+  }
+  sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
+  return pols;
+err:
+  sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
+  sk_POLICYINFO_pop_free(pols, POLICYINFO_free);
+  return NULL;
 }
 
 static POLICYINFO *policy_section(X509V3_CTX *ctx,
-                                  STACK_OF(CONF_VALUE) *polstrs, int ia5org)
-{
-    size_t i;
-    CONF_VALUE *cnf;
-    POLICYINFO *pol;
-    POLICYQUALINFO *qual;
-    if (!(pol = POLICYINFO_new()))
-        goto merr;
-    for (i = 0; i < sk_CONF_VALUE_num(polstrs); i++) {
-        cnf = sk_CONF_VALUE_value(polstrs, i);
-        if (!strcmp(cnf->name, "policyIdentifier")) {
-            ASN1_OBJECT *pobj;
-            if (!(pobj = OBJ_txt2obj(cnf->value, 0))) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            pol->policyid = pobj;
-
-        } else if (!x509v3_name_cmp(cnf->name, "CPS")) {
-            if (!pol->qualifiers)
-                pol->qualifiers = sk_POLICYQUALINFO_new_null();
-            if (!(qual = POLICYQUALINFO_new()))
-                goto merr;
-            if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual))
-                goto merr;
-            qual->pqualid = OBJ_nid2obj(NID_id_qt_cps);
-            if (qual->pqualid == NULL) {
-                OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR);
-                goto err;
-            }
-            qual->d.cpsuri = ASN1_IA5STRING_new();
-            if (qual->d.cpsuri == NULL) {
-                goto err;
-            }
-            if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value,
-                                 strlen(cnf->value)))
-                goto merr;
-        } else if (!x509v3_name_cmp(cnf->name, "userNotice")) {
-            STACK_OF(CONF_VALUE) *unot;
-            if (*cnf->value != '@') {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXPECTED_A_SECTION_NAME);
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            unot = X509V3_get_section(ctx, cnf->value + 1);
-            if (!unot) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
-
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            qual = notice_section(ctx, unot, ia5org);
-            X509V3_section_free(ctx, unot);
-            if (!qual)
-                goto err;
-            if (!pol->qualifiers)
-                pol->qualifiers = sk_POLICYQUALINFO_new_null();
-            if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual))
-                goto merr;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OPTION);
-
-            X509V3_conf_err(cnf);
-            goto err;
-        }
-    }
-    if (!pol->policyid) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_POLICY_IDENTIFIER);
+                                  STACK_OF(CONF_VALUE) *polstrs, int ia5org) {
+  size_t i;
+  CONF_VALUE *cnf;
+  POLICYINFO *pol;
+  POLICYQUALINFO *qual;
+  if (!(pol = POLICYINFO_new())) {
+    goto merr;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(polstrs); i++) {
+    cnf = sk_CONF_VALUE_value(polstrs, i);
+    if (!strcmp(cnf->name, "policyIdentifier")) {
+      ASN1_OBJECT *pobj;
+      if (!(pobj = OBJ_txt2obj(cnf->value, 0))) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+        X509V3_conf_err(cnf);
         goto err;
+      }
+      pol->policyid = pobj;
+
+    } else if (!x509v3_name_cmp(cnf->name, "CPS")) {
+      if (!pol->qualifiers) {
+        pol->qualifiers = sk_POLICYQUALINFO_new_null();
+      }
+      if (!(qual = POLICYQUALINFO_new())) {
+        goto merr;
+      }
+      if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual)) {
+        goto merr;
+      }
+      qual->pqualid = OBJ_nid2obj(NID_id_qt_cps);
+      if (qual->pqualid == NULL) {
+        OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR);
+        goto err;
+      }
+      qual->d.cpsuri = ASN1_IA5STRING_new();
+      if (qual->d.cpsuri == NULL) {
+        goto err;
+      }
+      if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value, strlen(cnf->value))) {
+        goto merr;
+      }
+    } else if (!x509v3_name_cmp(cnf->name, "userNotice")) {
+      STACK_OF(CONF_VALUE) *unot;
+      if (*cnf->value != '@') {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXPECTED_A_SECTION_NAME);
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+      unot = X509V3_get_section(ctx, cnf->value + 1);
+      if (!unot) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
+
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+      qual = notice_section(ctx, unot, ia5org);
+      X509V3_section_free(ctx, unot);
+      if (!qual) {
+        goto err;
+      }
+      if (!pol->qualifiers) {
+        pol->qualifiers = sk_POLICYQUALINFO_new_null();
+      }
+      if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual)) {
+        goto merr;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OPTION);
+
+      X509V3_conf_err(cnf);
+      goto err;
     }
+  }
+  if (!pol->policyid) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_POLICY_IDENTIFIER);
+    goto err;
+  }
 
-    return pol;
+  return pol;
 
- merr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+merr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
 
- err:
-    POLICYINFO_free(pol);
-    return NULL;
-
+err:
+  POLICYINFO_free(pol);
+  return NULL;
 }
 
 static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
-                                      STACK_OF(CONF_VALUE) *unot, int ia5org)
-{
-    size_t i;
-    int ret;
-    CONF_VALUE *cnf;
-    USERNOTICE *not;
-    POLICYQUALINFO *qual;
-    if (!(qual = POLICYQUALINFO_new()))
+                                      STACK_OF(CONF_VALUE) *unot, int ia5org) {
+  size_t i;
+  int ret;
+  CONF_VALUE *cnf;
+  USERNOTICE * not ;
+  POLICYQUALINFO *qual;
+  if (!(qual = POLICYQUALINFO_new())) {
+    goto merr;
+  }
+  qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice);
+  if (qual->pqualid == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR);
+    goto err;
+  }
+  if (!(not = USERNOTICE_new())) {
+    goto merr;
+  }
+  qual->d.usernotice = not ;
+  for (i = 0; i < sk_CONF_VALUE_num(unot); i++) {
+    cnf = sk_CONF_VALUE_value(unot, i);
+    if (!strcmp(cnf->name, "explicitText")) {
+      not ->exptext = ASN1_VISIBLESTRING_new();
+      if (not ->exptext == NULL) {
         goto merr;
-    qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice);
-    if (qual->pqualid == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR);
-        goto err;
-    }
-    if (!(not = USERNOTICE_new()))
+      }
+      if (!ASN1_STRING_set(not ->exptext, cnf->value, strlen(cnf->value))) {
         goto merr;
-    qual->d.usernotice = not;
-    for (i = 0; i < sk_CONF_VALUE_num(unot); i++) {
-        cnf = sk_CONF_VALUE_value(unot, i);
-        if (!strcmp(cnf->name, "explicitText")) {
-            not->exptext = ASN1_VISIBLESTRING_new();
-            if (not->exptext == NULL)
-                goto merr;
-            if (!ASN1_STRING_set(not->exptext, cnf->value,
-                                 strlen(cnf->value)))
-                goto merr;
-        } else if (!strcmp(cnf->name, "organization")) {
-            NOTICEREF *nref;
-            if (!not->noticeref) {
-                if (!(nref = NOTICEREF_new()))
-                    goto merr;
-                not->noticeref = nref;
-            } else
-                nref = not->noticeref;
-            if (ia5org)
-                nref->organization->type = V_ASN1_IA5STRING;
-            else
-                nref->organization->type = V_ASN1_VISIBLESTRING;
-            if (!ASN1_STRING_set(nref->organization, cnf->value,
-                                 strlen(cnf->value)))
-                goto merr;
-        } else if (!strcmp(cnf->name, "noticeNumbers")) {
-            NOTICEREF *nref;
-            STACK_OF(CONF_VALUE) *nos;
-            if (!not->noticeref) {
-                if (!(nref = NOTICEREF_new()))
-                    goto merr;
-                not->noticeref = nref;
-            } else
-                nref = not->noticeref;
-            nos = X509V3_parse_list(cnf->value);
-            if (!nos || !sk_CONF_VALUE_num(nos)) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBERS);
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            ret = nref_nos(nref->noticenos, nos);
-            sk_CONF_VALUE_pop_free(nos, X509V3_conf_free);
-            if (!ret)
-                goto err;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OPTION);
-            X509V3_conf_err(cnf);
-            goto err;
+      }
+    } else if (!strcmp(cnf->name, "organization")) {
+      NOTICEREF *nref;
+      if (!not ->noticeref) {
+        if (!(nref = NOTICEREF_new())) {
+          goto merr;
         }
-    }
-
-    if (not->noticeref &&
-        (!not->noticeref->noticenos || !not->noticeref->organization)) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS);
+        not ->noticeref = nref;
+      } else {
+        nref = not ->noticeref;
+      }
+      if (ia5org) {
+        nref->organization->type = V_ASN1_IA5STRING;
+      } else {
+        nref->organization->type = V_ASN1_VISIBLESTRING;
+      }
+      if (!ASN1_STRING_set(nref->organization, cnf->value,
+                           strlen(cnf->value))) {
+        goto merr;
+      }
+    } else if (!strcmp(cnf->name, "noticeNumbers")) {
+      NOTICEREF *nref;
+      STACK_OF(CONF_VALUE) *nos;
+      if (!not ->noticeref) {
+        if (!(nref = NOTICEREF_new())) {
+          goto merr;
+        }
+        not ->noticeref = nref;
+      } else {
+        nref = not ->noticeref;
+      }
+      nos = X509V3_parse_list(cnf->value);
+      if (!nos || !sk_CONF_VALUE_num(nos)) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBERS);
+        X509V3_conf_err(cnf);
         goto err;
+      }
+      ret = nref_nos(nref->noticenos, nos);
+      sk_CONF_VALUE_pop_free(nos, X509V3_conf_free);
+      if (!ret) {
+        goto err;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OPTION);
+      X509V3_conf_err(cnf);
+      goto err;
     }
+  }
 
-    return qual;
+  if (not ->noticeref &&
+      (!not ->noticeref->noticenos || !not ->noticeref->organization)) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS);
+    goto err;
+  }
 
- merr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  return qual;
 
- err:
-    POLICYQUALINFO_free(qual);
-    return NULL;
+merr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+
+err:
+  POLICYQUALINFO_free(qual);
+  return NULL;
 }
 
-static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos)
-{
-    CONF_VALUE *cnf;
-    ASN1_INTEGER *aint;
+static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos) {
+  CONF_VALUE *cnf;
+  ASN1_INTEGER *aint;
 
-    size_t i;
+  size_t i;
 
-    for (i = 0; i < sk_CONF_VALUE_num(nos); i++) {
-        cnf = sk_CONF_VALUE_value(nos, i);
-        if (!(aint = s2i_ASN1_INTEGER(NULL, cnf->name))) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER);
-            goto err;
-        }
-        if (!sk_ASN1_INTEGER_push(nnums, aint))
-            goto merr;
+  for (i = 0; i < sk_CONF_VALUE_num(nos); i++) {
+    cnf = sk_CONF_VALUE_value(nos, i);
+    if (!(aint = s2i_ASN1_INTEGER(NULL, cnf->name))) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER);
+      goto err;
     }
-    return 1;
+    if (!sk_ASN1_INTEGER_push(nnums, aint)) {
+      goto merr;
+    }
+  }
+  return 1;
 
- merr:
-    ASN1_INTEGER_free(aint);
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+merr:
+  ASN1_INTEGER_free(aint);
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
 
- err:
-    return 0;
+err:
+  return 0;
 }
 
-static int i2r_certpol(X509V3_EXT_METHOD *method, STACK_OF(POLICYINFO) *pol,
-                       BIO *out, int indent)
-{
-    size_t i;
-    POLICYINFO *pinfo;
-    /* First print out the policy OIDs */
-    for (i = 0; i < sk_POLICYINFO_num(pol); i++) {
-        pinfo = sk_POLICYINFO_value(pol, i);
-        BIO_printf(out, "%*sPolicy: ", indent, "");
-        i2a_ASN1_OBJECT(out, pinfo->policyid);
-        BIO_puts(out, "\n");
-        if (pinfo->qualifiers)
-            print_qualifiers(out, pinfo->qualifiers, indent + 2);
-    }
-    return 1;
-}
-
-static void print_qualifiers(BIO *out, STACK_OF(POLICYQUALINFO) *quals,
-                             int indent)
-{
-    POLICYQUALINFO *qualinfo;
-    size_t i;
-    for (i = 0; i < sk_POLICYQUALINFO_num(quals); i++) {
-        qualinfo = sk_POLICYQUALINFO_value(quals, i);
-        switch (OBJ_obj2nid(qualinfo->pqualid)) {
-        case NID_id_qt_cps:
-            BIO_printf(out, "%*sCPS: %.*s\n", indent, "",
-                       qualinfo->d.cpsuri->length, qualinfo->d.cpsuri->data);
-            break;
-
-        case NID_id_qt_unotice:
-            BIO_printf(out, "%*sUser Notice:\n", indent, "");
-            print_notice(out, qualinfo->d.usernotice, indent + 2);
-            break;
-
-        default:
-            BIO_printf(out, "%*sUnknown Qualifier: ", indent + 2, "");
-
-            i2a_ASN1_OBJECT(out, qualinfo->pqualid);
-            BIO_puts(out, "\n");
-            break;
-        }
-    }
-}
-
-static void print_notice(BIO *out, USERNOTICE *notice, int indent)
-{
-    size_t i;
-    if (notice->noticeref) {
-        NOTICEREF *ref;
-        ref = notice->noticeref;
-        BIO_printf(out, "%*sOrganization: %.*s\n", indent, "",
-                   ref->organization->length, ref->organization->data);
-        BIO_printf(out, "%*sNumber%s: ", indent, "",
-                   sk_ASN1_INTEGER_num(ref->noticenos) > 1 ? "s" : "");
-        for (i = 0; i < sk_ASN1_INTEGER_num(ref->noticenos); i++) {
-            ASN1_INTEGER *num;
-            char *tmp;
-            num = sk_ASN1_INTEGER_value(ref->noticenos, i);
-            if (i)
-                BIO_puts(out, ", ");
-            if (num == NULL)
-                BIO_puts(out, "(null)");
-            else {
-                tmp = i2s_ASN1_INTEGER(NULL, num);
-                if (tmp == NULL)
-                    return;
-                BIO_puts(out, tmp);
-                OPENSSL_free(tmp);
-            }
-        }
-        BIO_puts(out, "\n");
-    }
-    if (notice->exptext)
-        BIO_printf(out, "%*sExplicit Text: %.*s\n", indent, "",
-                   notice->exptext->length, notice->exptext->data);
-}
-
-void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent)
-{
-    const X509_POLICY_DATA *dat = node->data;
-
+static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
+                       int indent) {
+  const STACK_OF(POLICYINFO) *pol = ext;
+  // First print out the policy OIDs
+  for (size_t i = 0; i < sk_POLICYINFO_num(pol); i++) {
+    const POLICYINFO *pinfo = sk_POLICYINFO_value(pol, i);
     BIO_printf(out, "%*sPolicy: ", indent, "");
-
-    i2a_ASN1_OBJECT(out, dat->valid_policy);
+    i2a_ASN1_OBJECT(out, pinfo->policyid);
     BIO_puts(out, "\n");
-    BIO_printf(out, "%*s%s\n", indent + 2, "",
-               node_data_critical(dat) ? "Critical" : "Non Critical");
-    if (dat->qualifier_set)
-        print_qualifiers(out, dat->qualifier_set, indent + 2);
-    else
-        BIO_printf(out, "%*sNo Qualifiers\n", indent + 2, "");
+    if (pinfo->qualifiers) {
+      print_qualifiers(out, pinfo->qualifiers, indent + 2);
+    }
+  }
+  return 1;
+}
+
+static void print_qualifiers(BIO *out, const STACK_OF(POLICYQUALINFO) *quals,
+                             int indent) {
+  for (size_t i = 0; i < sk_POLICYQUALINFO_num(quals); i++) {
+    const POLICYQUALINFO *qualinfo = sk_POLICYQUALINFO_value(quals, i);
+    switch (OBJ_obj2nid(qualinfo->pqualid)) {
+      case NID_id_qt_cps:
+        BIO_printf(out, "%*sCPS: %.*s\n", indent, "",
+                   qualinfo->d.cpsuri->length, qualinfo->d.cpsuri->data);
+        break;
+
+      case NID_id_qt_unotice:
+        BIO_printf(out, "%*sUser Notice:\n", indent, "");
+        print_notice(out, qualinfo->d.usernotice, indent + 2);
+        break;
+
+      default:
+        BIO_printf(out, "%*sUnknown Qualifier: ", indent + 2, "");
+
+        i2a_ASN1_OBJECT(out, qualinfo->pqualid);
+        BIO_puts(out, "\n");
+        break;
+    }
+  }
+}
+
+static void print_notice(BIO *out, const USERNOTICE *notice, int indent) {
+  if (notice->noticeref) {
+    NOTICEREF *ref;
+    ref = notice->noticeref;
+    BIO_printf(out, "%*sOrganization: %.*s\n", indent, "",
+               ref->organization->length, ref->organization->data);
+    BIO_printf(out, "%*sNumber%s: ", indent, "",
+               sk_ASN1_INTEGER_num(ref->noticenos) > 1 ? "s" : "");
+    for (size_t i = 0; i < sk_ASN1_INTEGER_num(ref->noticenos); i++) {
+      ASN1_INTEGER *num;
+      char *tmp;
+      num = sk_ASN1_INTEGER_value(ref->noticenos, i);
+      if (i) {
+        BIO_puts(out, ", ");
+      }
+      if (num == NULL) {
+        BIO_puts(out, "(null)");
+      } else {
+        tmp = i2s_ASN1_INTEGER(NULL, num);
+        if (tmp == NULL) {
+          return;
+        }
+        BIO_puts(out, tmp);
+        OPENSSL_free(tmp);
+      }
+    }
+    BIO_puts(out, "\n");
+  }
+  if (notice->exptext) {
+    BIO_printf(out, "%*sExplicit Text: %.*s\n", indent, "",
+               notice->exptext->length, notice->exptext->data);
+  }
+}
+
+void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent) {
+  const X509_POLICY_DATA *dat = node->data;
+
+  BIO_printf(out, "%*sPolicy: ", indent, "");
+
+  i2a_ASN1_OBJECT(out, dat->valid_policy);
+  BIO_puts(out, "\n");
+  BIO_printf(out, "%*s%s\n", indent + 2, "",
+             node_data_critical(dat) ? "Critical" : "Non Critical");
+  if (dat->qualifier_set) {
+    print_qualifiers(out, dat->qualifier_set, indent + 2);
+  } else {
+    BIO_printf(out, "%*sNo Qualifiers\n", indent + 2, "");
+  }
 }
diff --git a/src/crypto/x509v3/v3_crld.c b/src/crypto/x509v3/v3_crld.c
index 93e5b6d..68ab343 100644
--- a/src/crypto/x509v3/v3_crld.c
+++ b/src/crypto/x509v3/v3_crld.c
@@ -66,119 +66,133 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
-#include "internal.h"
 #include "../x509/internal.h"
+#include "internal.h"
 
 
-static void *v2i_crld(const X509V3_EXT_METHOD *method,
-                      X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
+static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                      STACK_OF(CONF_VALUE) *nval);
 static int i2r_crldp(const X509V3_EXT_METHOD *method, void *pcrldp, BIO *out,
                      int indent);
 
 const X509V3_EXT_METHOD v3_crld = {
-    NID_crl_distribution_points, 0, ASN1_ITEM_ref(CRL_DIST_POINTS),
-    0, 0, 0, 0,
-    0, 0,
+    NID_crl_distribution_points,
+    0,
+    ASN1_ITEM_ref(CRL_DIST_POINTS),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     0,
     v2i_crld,
-    i2r_crldp, 0,
-    NULL
+    i2r_crldp,
+    0,
+    NULL,
 };
 
 const X509V3_EXT_METHOD v3_freshest_crl = {
-    NID_freshest_crl, 0, ASN1_ITEM_ref(CRL_DIST_POINTS),
-    0, 0, 0, 0,
-    0, 0,
+    NID_freshest_crl,
+    0,
+    ASN1_ITEM_ref(CRL_DIST_POINTS),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     0,
     v2i_crld,
-    i2r_crldp, 0,
-    NULL
+    i2r_crldp,
+    0,
+    NULL,
 };
 
 static STACK_OF(GENERAL_NAME) *gnames_from_sectname(X509V3_CTX *ctx,
-                                                    char *sect)
-{
-    STACK_OF(CONF_VALUE) *gnsect;
-    STACK_OF(GENERAL_NAME) *gens;
-    if (*sect == '@')
-        gnsect = X509V3_get_section(ctx, sect + 1);
-    else
-        gnsect = X509V3_parse_list(sect);
-    if (!gnsect) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
-        return NULL;
-    }
-    gens = v2i_GENERAL_NAMES(NULL, ctx, gnsect);
-    if (*sect == '@')
-        X509V3_section_free(ctx, gnsect);
-    else
-        sk_CONF_VALUE_pop_free(gnsect, X509V3_conf_free);
-    return gens;
+                                                    char *sect) {
+  STACK_OF(CONF_VALUE) *gnsect;
+  STACK_OF(GENERAL_NAME) *gens;
+  if (*sect == '@') {
+    gnsect = X509V3_get_section(ctx, sect + 1);
+  } else {
+    gnsect = X509V3_parse_list(sect);
+  }
+  if (!gnsect) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
+    return NULL;
+  }
+  gens = v2i_GENERAL_NAMES(NULL, ctx, gnsect);
+  if (*sect == '@') {
+    X509V3_section_free(ctx, gnsect);
+  } else {
+    sk_CONF_VALUE_pop_free(gnsect, X509V3_conf_free);
+  }
+  return gens;
 }
 
 static int set_dist_point_name(DIST_POINT_NAME **pdp, X509V3_CTX *ctx,
-                               CONF_VALUE *cnf)
-{
-    STACK_OF(GENERAL_NAME) *fnm = NULL;
-    STACK_OF(X509_NAME_ENTRY) *rnm = NULL;
-    if (!strncmp(cnf->name, "fullname", 9)) {
-        fnm = gnames_from_sectname(ctx, cnf->value);
-        if (!fnm)
-            goto err;
-    } else if (!strcmp(cnf->name, "relativename")) {
-        int ret;
-        STACK_OF(CONF_VALUE) *dnsect;
-        X509_NAME *nm;
-        nm = X509_NAME_new();
-        if (!nm)
-            return -1;
-        dnsect = X509V3_get_section(ctx, cnf->value);
-        if (!dnsect) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
-            return -1;
-        }
-        ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC);
-        X509V3_section_free(ctx, dnsect);
-        rnm = nm->entries;
-        nm->entries = NULL;
-        X509_NAME_free(nm);
-        if (!ret || sk_X509_NAME_ENTRY_num(rnm) <= 0)
-            goto err;
-        /*
-         * Since its a name fragment can't have more than one RDNSequence
-         */
-        if (sk_X509_NAME_ENTRY_value(rnm,
-                                     sk_X509_NAME_ENTRY_num(rnm) - 1)->set) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_MULTIPLE_RDNS);
-            goto err;
-        }
-    } else
-        return 0;
-
-    if (*pdp) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_DISTPOINT_ALREADY_SET);
-        goto err;
+                               CONF_VALUE *cnf) {
+  STACK_OF(GENERAL_NAME) *fnm = NULL;
+  STACK_OF(X509_NAME_ENTRY) *rnm = NULL;
+  if (!strncmp(cnf->name, "fullname", 9)) {
+    fnm = gnames_from_sectname(ctx, cnf->value);
+    if (!fnm) {
+      goto err;
     }
-
-    *pdp = DIST_POINT_NAME_new();
-    if (!*pdp)
-        goto err;
-    if (fnm) {
-        (*pdp)->type = 0;
-        (*pdp)->name.fullname = fnm;
-    } else {
-        (*pdp)->type = 1;
-        (*pdp)->name.relativename = rnm;
+  } else if (!strcmp(cnf->name, "relativename")) {
+    int ret;
+    STACK_OF(CONF_VALUE) *dnsect;
+    X509_NAME *nm;
+    nm = X509_NAME_new();
+    if (!nm) {
+      return -1;
     }
+    dnsect = X509V3_get_section(ctx, cnf->value);
+    if (!dnsect) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND);
+      return -1;
+    }
+    ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC);
+    X509V3_section_free(ctx, dnsect);
+    rnm = nm->entries;
+    nm->entries = NULL;
+    X509_NAME_free(nm);
+    if (!ret || sk_X509_NAME_ENTRY_num(rnm) <= 0) {
+      goto err;
+    }
+    // Since its a name fragment can't have more than one RDNSequence
+    if (sk_X509_NAME_ENTRY_value(rnm, sk_X509_NAME_ENTRY_num(rnm) - 1)->set) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_MULTIPLE_RDNS);
+      goto err;
+    }
+  } else {
+    return 0;
+  }
 
-    return 1;
+  if (*pdp) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_DISTPOINT_ALREADY_SET);
+    goto err;
+  }
 
- err:
-    if (fnm)
-        sk_GENERAL_NAME_pop_free(fnm, GENERAL_NAME_free);
-    if (rnm)
-        sk_X509_NAME_ENTRY_pop_free(rnm, X509_NAME_ENTRY_free);
-    return -1;
+  *pdp = DIST_POINT_NAME_new();
+  if (!*pdp) {
+    goto err;
+  }
+  if (fnm) {
+    (*pdp)->type = 0;
+    (*pdp)->name.fullname = fnm;
+  } else {
+    (*pdp)->type = 1;
+    (*pdp)->name.relativename = rnm;
+  }
+
+  return 1;
+
+err:
+  sk_GENERAL_NAME_pop_free(fnm, GENERAL_NAME_free);
+  sk_X509_NAME_ENTRY_pop_free(rnm, X509_NAME_ENTRY_free);
+  return -1;
 }
 
 static const BIT_STRING_BITNAME reason_flags[] = {
@@ -191,208 +205,221 @@
     {6, "Certificate Hold", "certificateHold"},
     {7, "Privilege Withdrawn", "privilegeWithdrawn"},
     {8, "AA Compromise", "AACompromise"},
-    {-1, NULL, NULL}
-};
+    {-1, NULL, NULL}};
 
-static int set_reasons(ASN1_BIT_STRING **preas, char *value)
-{
-    STACK_OF(CONF_VALUE) *rsk = NULL;
-    const BIT_STRING_BITNAME *pbn;
-    const char *bnam;
-    size_t i;
-    int ret = 0;
-    rsk = X509V3_parse_list(value);
-    if (!rsk)
-        return 0;
-    if (*preas)
-        return 0;
-    for (i = 0; i < sk_CONF_VALUE_num(rsk); i++) {
-        bnam = sk_CONF_VALUE_value(rsk, i)->name;
-        if (!*preas) {
-            *preas = ASN1_BIT_STRING_new();
-            if (!*preas)
-                goto err;
-        }
-        for (pbn = reason_flags; pbn->lname; pbn++) {
-            if (!strcmp(pbn->sname, bnam)) {
-                if (!ASN1_BIT_STRING_set_bit(*preas, pbn->bitnum, 1))
-                    goto err;
-                break;
-            }
-        }
-        if (!pbn->lname)
-            goto err;
+static int set_reasons(ASN1_BIT_STRING **preas, char *value) {
+  STACK_OF(CONF_VALUE) *rsk = NULL;
+  const BIT_STRING_BITNAME *pbn;
+  const char *bnam;
+  size_t i;
+  int ret = 0;
+  rsk = X509V3_parse_list(value);
+  if (!rsk) {
+    return 0;
+  }
+  if (*preas) {
+    return 0;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(rsk); i++) {
+    bnam = sk_CONF_VALUE_value(rsk, i)->name;
+    if (!*preas) {
+      *preas = ASN1_BIT_STRING_new();
+      if (!*preas) {
+        goto err;
+      }
     }
-    ret = 1;
+    for (pbn = reason_flags; pbn->lname; pbn++) {
+      if (!strcmp(pbn->sname, bnam)) {
+        if (!ASN1_BIT_STRING_set_bit(*preas, pbn->bitnum, 1)) {
+          goto err;
+        }
+        break;
+      }
+    }
+    if (!pbn->lname) {
+      goto err;
+    }
+  }
+  ret = 1;
 
- err:
-    sk_CONF_VALUE_pop_free(rsk, X509V3_conf_free);
-    return ret;
+err:
+  sk_CONF_VALUE_pop_free(rsk, X509V3_conf_free);
+  return ret;
 }
 
-static int print_reasons(BIO *out, const char *rname,
-                         ASN1_BIT_STRING *rflags, int indent)
-{
-    int first = 1;
-    const BIT_STRING_BITNAME *pbn;
-    BIO_printf(out, "%*s%s:\n%*s", indent, "", rname, indent + 2, "");
-    for (pbn = reason_flags; pbn->lname; pbn++) {
-        if (ASN1_BIT_STRING_get_bit(rflags, pbn->bitnum)) {
-            if (first)
-                first = 0;
-            else
-                BIO_puts(out, ", ");
-            BIO_puts(out, pbn->lname);
-        }
+static int print_reasons(BIO *out, const char *rname, ASN1_BIT_STRING *rflags,
+                         int indent) {
+  int first = 1;
+  const BIT_STRING_BITNAME *pbn;
+  BIO_printf(out, "%*s%s:\n%*s", indent, "", rname, indent + 2, "");
+  for (pbn = reason_flags; pbn->lname; pbn++) {
+    if (ASN1_BIT_STRING_get_bit(rflags, pbn->bitnum)) {
+      if (first) {
+        first = 0;
+      } else {
+        BIO_puts(out, ", ");
+      }
+      BIO_puts(out, pbn->lname);
     }
-    if (first)
-        BIO_puts(out, "<EMPTY>\n");
-    else
-        BIO_puts(out, "\n");
-    return 1;
+  }
+  if (first) {
+    BIO_puts(out, "<EMPTY>\n");
+  } else {
+    BIO_puts(out, "\n");
+  }
+  return 1;
 }
 
 static DIST_POINT *crldp_from_section(X509V3_CTX *ctx,
-                                      STACK_OF(CONF_VALUE) *nval)
-{
-    size_t i;
-    CONF_VALUE *cnf;
-    DIST_POINT *point = NULL;
-    point = DIST_POINT_new();
-    if (!point)
-        goto err;
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        int ret;
-        cnf = sk_CONF_VALUE_value(nval, i);
-        ret = set_dist_point_name(&point->distpoint, ctx, cnf);
-        if (ret > 0)
-            continue;
-        if (ret < 0)
-            goto err;
-        if (!strcmp(cnf->name, "reasons")) {
-            if (!set_reasons(&point->reasons, cnf->value))
-                goto err;
-        } else if (!strcmp(cnf->name, "CRLissuer")) {
-            point->CRLissuer = gnames_from_sectname(ctx, cnf->value);
-            if (!point->CRLissuer)
-                goto err;
-        }
+                                      STACK_OF(CONF_VALUE) *nval) {
+  size_t i;
+  CONF_VALUE *cnf;
+  DIST_POINT *point = NULL;
+  point = DIST_POINT_new();
+  if (!point) {
+    goto err;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    int ret;
+    cnf = sk_CONF_VALUE_value(nval, i);
+    ret = set_dist_point_name(&point->distpoint, ctx, cnf);
+    if (ret > 0) {
+      continue;
     }
+    if (ret < 0) {
+      goto err;
+    }
+    if (!strcmp(cnf->name, "reasons")) {
+      if (!set_reasons(&point->reasons, cnf->value)) {
+        goto err;
+      }
+    } else if (!strcmp(cnf->name, "CRLissuer")) {
+      point->CRLissuer = gnames_from_sectname(ctx, cnf->value);
+      if (!point->CRLissuer) {
+        goto err;
+      }
+    }
+  }
 
-    return point;
+  return point;
 
- err:
-    if (point)
-        DIST_POINT_free(point);
-    return NULL;
+err:
+  DIST_POINT_free(point);
+  return NULL;
 }
 
-static void *v2i_crld(const X509V3_EXT_METHOD *method,
-                      X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
-{
-    STACK_OF(DIST_POINT) *crld = NULL;
-    GENERAL_NAMES *gens = NULL;
-    GENERAL_NAME *gen = NULL;
-    CONF_VALUE *cnf;
-    size_t i;
-    if (!(crld = sk_DIST_POINT_new_null()))
+static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                      STACK_OF(CONF_VALUE) *nval) {
+  STACK_OF(DIST_POINT) *crld = NULL;
+  GENERAL_NAMES *gens = NULL;
+  GENERAL_NAME *gen = NULL;
+  CONF_VALUE *cnf;
+  size_t i;
+  if (!(crld = sk_DIST_POINT_new_null())) {
+    goto merr;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    DIST_POINT *point;
+    cnf = sk_CONF_VALUE_value(nval, i);
+    if (!cnf->value) {
+      STACK_OF(CONF_VALUE) *dpsect;
+      dpsect = X509V3_get_section(ctx, cnf->name);
+      if (!dpsect) {
+        goto err;
+      }
+      point = crldp_from_section(ctx, dpsect);
+      X509V3_section_free(ctx, dpsect);
+      if (!point) {
+        goto err;
+      }
+      if (!sk_DIST_POINT_push(crld, point)) {
+        DIST_POINT_free(point);
         goto merr;
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        DIST_POINT *point;
-        cnf = sk_CONF_VALUE_value(nval, i);
-        if (!cnf->value) {
-            STACK_OF(CONF_VALUE) *dpsect;
-            dpsect = X509V3_get_section(ctx, cnf->name);
-            if (!dpsect)
-                goto err;
-            point = crldp_from_section(ctx, dpsect);
-            X509V3_section_free(ctx, dpsect);
-            if (!point)
-                goto err;
-            if (!sk_DIST_POINT_push(crld, point)) {
-                DIST_POINT_free(point);
-                goto merr;
-            }
-        } else {
-            if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
-                goto err;
-            if (!(gens = GENERAL_NAMES_new()))
-                goto merr;
-            if (!sk_GENERAL_NAME_push(gens, gen))
-                goto merr;
-            gen = NULL;
-            if (!(point = DIST_POINT_new()))
-                goto merr;
-            if (!sk_DIST_POINT_push(crld, point)) {
-                DIST_POINT_free(point);
-                goto merr;
-            }
-            if (!(point->distpoint = DIST_POINT_NAME_new()))
-                goto merr;
-            point->distpoint->name.fullname = gens;
-            point->distpoint->type = 0;
-            gens = NULL;
-        }
+      }
+    } else {
+      if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) {
+        goto err;
+      }
+      if (!(gens = GENERAL_NAMES_new())) {
+        goto merr;
+      }
+      if (!sk_GENERAL_NAME_push(gens, gen)) {
+        goto merr;
+      }
+      gen = NULL;
+      if (!(point = DIST_POINT_new())) {
+        goto merr;
+      }
+      if (!sk_DIST_POINT_push(crld, point)) {
+        DIST_POINT_free(point);
+        goto merr;
+      }
+      if (!(point->distpoint = DIST_POINT_NAME_new())) {
+        goto merr;
+      }
+      point->distpoint->name.fullname = gens;
+      point->distpoint->type = 0;
+      gens = NULL;
     }
-    return crld;
+  }
+  return crld;
 
- merr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
- err:
-    GENERAL_NAME_free(gen);
-    GENERAL_NAMES_free(gens);
-    sk_DIST_POINT_pop_free(crld, DIST_POINT_free);
-    return NULL;
+merr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+err:
+  GENERAL_NAME_free(gen);
+  GENERAL_NAMES_free(gens);
+  sk_DIST_POINT_pop_free(crld, DIST_POINT_free);
+  return NULL;
 }
 
 static int dpn_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
-                  void *exarg)
-{
-    DIST_POINT_NAME *dpn = (DIST_POINT_NAME *)*pval;
+                  void *exarg) {
+  DIST_POINT_NAME *dpn = (DIST_POINT_NAME *)*pval;
 
-    switch (operation) {
+  switch (operation) {
     case ASN1_OP_NEW_POST:
-        dpn->dpname = NULL;
-        break;
+      dpn->dpname = NULL;
+      break;
 
     case ASN1_OP_FREE_POST:
-        if (dpn->dpname)
-            X509_NAME_free(dpn->dpname);
-        break;
-    }
-    return 1;
+      X509_NAME_free(dpn->dpname);
+      break;
+  }
+  return 1;
 }
 
 
-ASN1_CHOICE_cb(DIST_POINT_NAME, dpn_cb) = {
+ASN1_CHOICE_cb(DIST_POINT_NAME, dpn_cb) =
+    {
         ASN1_IMP_SEQUENCE_OF(DIST_POINT_NAME, name.fullname, GENERAL_NAME, 0),
-        ASN1_IMP_SET_OF(DIST_POINT_NAME, name.relativename, X509_NAME_ENTRY, 1)
+        ASN1_IMP_SET_OF(DIST_POINT_NAME, name.relativename, X509_NAME_ENTRY, 1),
 } ASN1_CHOICE_END_cb(DIST_POINT_NAME, DIST_POINT_NAME, type)
 
 
-IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT_NAME)
+        IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT_NAME)
 
 ASN1_SEQUENCE(DIST_POINT) = {
-        ASN1_EXP_OPT(DIST_POINT, distpoint, DIST_POINT_NAME, 0),
-        ASN1_IMP_OPT(DIST_POINT, reasons, ASN1_BIT_STRING, 1),
-        ASN1_IMP_SEQUENCE_OF_OPT(DIST_POINT, CRLissuer, GENERAL_NAME, 2)
+    ASN1_EXP_OPT(DIST_POINT, distpoint, DIST_POINT_NAME, 0),
+    ASN1_IMP_OPT(DIST_POINT, reasons, ASN1_BIT_STRING, 1),
+    ASN1_IMP_SEQUENCE_OF_OPT(DIST_POINT, CRLissuer, GENERAL_NAME, 2),
 } ASN1_SEQUENCE_END(DIST_POINT)
 
 IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT)
 
-ASN1_ITEM_TEMPLATE(CRL_DIST_POINTS) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, CRLDistributionPoints, DIST_POINT)
+ASN1_ITEM_TEMPLATE(CRL_DIST_POINTS) = ASN1_EX_TEMPLATE_TYPE(
+    ASN1_TFLG_SEQUENCE_OF, 0, CRLDistributionPoints, DIST_POINT)
 ASN1_ITEM_TEMPLATE_END(CRL_DIST_POINTS)
 
 IMPLEMENT_ASN1_FUNCTIONS(CRL_DIST_POINTS)
 
 ASN1_SEQUENCE(ISSUING_DIST_POINT) = {
-        ASN1_EXP_OPT(ISSUING_DIST_POINT, distpoint, DIST_POINT_NAME, 0),
-        ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyuser, ASN1_FBOOLEAN, 1),
-        ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyCA, ASN1_FBOOLEAN, 2),
-        ASN1_IMP_OPT(ISSUING_DIST_POINT, onlysomereasons, ASN1_BIT_STRING, 3),
-        ASN1_IMP_OPT(ISSUING_DIST_POINT, indirectCRL, ASN1_FBOOLEAN, 4),
-        ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyattr, ASN1_FBOOLEAN, 5)
+    ASN1_EXP_OPT(ISSUING_DIST_POINT, distpoint, DIST_POINT_NAME, 0),
+    ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyuser, ASN1_FBOOLEAN, 1),
+    ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyCA, ASN1_FBOOLEAN, 2),
+    ASN1_IMP_OPT(ISSUING_DIST_POINT, onlysomereasons, ASN1_BIT_STRING, 3),
+    ASN1_IMP_OPT(ISSUING_DIST_POINT, indirectCRL, ASN1_FBOOLEAN, 4),
+    ASN1_IMP_OPT(ISSUING_DIST_POINT, onlyattr, ASN1_FBOOLEAN, 5),
 } ASN1_SEQUENCE_END(ISSUING_DIST_POINT)
 
 IMPLEMENT_ASN1_FUNCTIONS(ISSUING_DIST_POINT)
@@ -403,161 +430,180 @@
                      STACK_OF(CONF_VALUE) *nval);
 
 const X509V3_EXT_METHOD v3_idp = {
-    NID_issuing_distribution_point, X509V3_EXT_MULTILINE,
+    NID_issuing_distribution_point,
+    X509V3_EXT_MULTILINE,
     ASN1_ITEM_ref(ISSUING_DIST_POINT),
-    0, 0, 0, 0,
-    0, 0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     0,
     v2i_idp,
-    i2r_idp, 0,
-    NULL
+    i2r_idp,
+    0,
+    NULL,
 };
 
 static void *v2i_idp(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
-                     STACK_OF(CONF_VALUE) *nval)
-{
-    ISSUING_DIST_POINT *idp = NULL;
-    CONF_VALUE *cnf;
-    char *name, *val;
-    size_t i;
-    int ret;
-    idp = ISSUING_DIST_POINT_new();
-    if (!idp)
-        goto merr;
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        cnf = sk_CONF_VALUE_value(nval, i);
-        name = cnf->name;
-        val = cnf->value;
-        ret = set_dist_point_name(&idp->distpoint, ctx, cnf);
-        if (ret > 0)
-            continue;
-        if (ret < 0)
-            goto err;
-        if (!strcmp(name, "onlyuser")) {
-            if (!X509V3_get_value_bool(cnf, &idp->onlyuser))
-                goto err;
-        } else if (!strcmp(name, "onlyCA")) {
-            if (!X509V3_get_value_bool(cnf, &idp->onlyCA))
-                goto err;
-        } else if (!strcmp(name, "onlyAA")) {
-            if (!X509V3_get_value_bool(cnf, &idp->onlyattr))
-                goto err;
-        } else if (!strcmp(name, "indirectCRL")) {
-            if (!X509V3_get_value_bool(cnf, &idp->indirectCRL))
-                goto err;
-        } else if (!strcmp(name, "onlysomereasons")) {
-            if (!set_reasons(&idp->onlysomereasons, val))
-                goto err;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
-            X509V3_conf_err(cnf);
-            goto err;
-        }
+                     STACK_OF(CONF_VALUE) *nval) {
+  ISSUING_DIST_POINT *idp = NULL;
+  CONF_VALUE *cnf;
+  char *name, *val;
+  size_t i;
+  int ret;
+  idp = ISSUING_DIST_POINT_new();
+  if (!idp) {
+    goto merr;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    cnf = sk_CONF_VALUE_value(nval, i);
+    name = cnf->name;
+    val = cnf->value;
+    ret = set_dist_point_name(&idp->distpoint, ctx, cnf);
+    if (ret > 0) {
+      continue;
     }
-    return idp;
-
- merr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
- err:
-    ISSUING_DIST_POINT_free(idp);
-    return NULL;
-}
-
-static int print_gens(BIO *out, STACK_OF(GENERAL_NAME) *gens, int indent)
-{
-    size_t i;
-    for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
-        BIO_printf(out, "%*s", indent + 2, "");
-        GENERAL_NAME_print(out, sk_GENERAL_NAME_value(gens, i));
-        BIO_puts(out, "\n");
+    if (ret < 0) {
+      goto err;
     }
-    return 1;
-}
-
-static int print_distpoint(BIO *out, DIST_POINT_NAME *dpn, int indent)
-{
-    if (dpn->type == 0) {
-        BIO_printf(out, "%*sFull Name:\n", indent, "");
-        print_gens(out, dpn->name.fullname, indent);
+    if (!strcmp(name, "onlyuser")) {
+      if (!X509V3_get_value_bool(cnf, &idp->onlyuser)) {
+        goto err;
+      }
+    } else if (!strcmp(name, "onlyCA")) {
+      if (!X509V3_get_value_bool(cnf, &idp->onlyCA)) {
+        goto err;
+      }
+    } else if (!strcmp(name, "onlyAA")) {
+      if (!X509V3_get_value_bool(cnf, &idp->onlyattr)) {
+        goto err;
+      }
+    } else if (!strcmp(name, "indirectCRL")) {
+      if (!X509V3_get_value_bool(cnf, &idp->indirectCRL)) {
+        goto err;
+      }
+    } else if (!strcmp(name, "onlysomereasons")) {
+      if (!set_reasons(&idp->onlysomereasons, val)) {
+        goto err;
+      }
     } else {
-        X509_NAME ntmp;
-        ntmp.entries = dpn->name.relativename;
-        BIO_printf(out, "%*sRelative Name:\n%*s", indent, "", indent + 2, "");
-        X509_NAME_print_ex(out, &ntmp, 0, XN_FLAG_ONELINE);
-        BIO_puts(out, "\n");
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
+      X509V3_conf_err(cnf);
+      goto err;
     }
-    return 1;
+  }
+  return idp;
+
+merr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+err:
+  ISSUING_DIST_POINT_free(idp);
+  return NULL;
+}
+
+static int print_gens(BIO *out, STACK_OF(GENERAL_NAME) *gens, int indent) {
+  size_t i;
+  for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
+    BIO_printf(out, "%*s", indent + 2, "");
+    GENERAL_NAME_print(out, sk_GENERAL_NAME_value(gens, i));
+    BIO_puts(out, "\n");
+  }
+  return 1;
+}
+
+static int print_distpoint(BIO *out, DIST_POINT_NAME *dpn, int indent) {
+  if (dpn->type == 0) {
+    BIO_printf(out, "%*sFull Name:\n", indent, "");
+    print_gens(out, dpn->name.fullname, indent);
+  } else {
+    X509_NAME ntmp;
+    ntmp.entries = dpn->name.relativename;
+    BIO_printf(out, "%*sRelative Name:\n%*s", indent, "", indent + 2, "");
+    X509_NAME_print_ex(out, &ntmp, 0, XN_FLAG_ONELINE);
+    BIO_puts(out, "\n");
+  }
+  return 1;
 }
 
 static int i2r_idp(const X509V3_EXT_METHOD *method, void *pidp, BIO *out,
-                   int indent)
-{
-    ISSUING_DIST_POINT *idp = pidp;
-    if (idp->distpoint)
-        print_distpoint(out, idp->distpoint, indent);
-    if (idp->onlyuser > 0)
-        BIO_printf(out, "%*sOnly User Certificates\n", indent, "");
-    if (idp->onlyCA > 0)
-        BIO_printf(out, "%*sOnly CA Certificates\n", indent, "");
-    if (idp->indirectCRL > 0)
-        BIO_printf(out, "%*sIndirect CRL\n", indent, "");
-    if (idp->onlysomereasons)
-        print_reasons(out, "Only Some Reasons", idp->onlysomereasons, indent);
-    if (idp->onlyattr > 0)
-        BIO_printf(out, "%*sOnly Attribute Certificates\n", indent, "");
-    if (!idp->distpoint && (idp->onlyuser <= 0) && (idp->onlyCA <= 0)
-        && (idp->indirectCRL <= 0) && !idp->onlysomereasons
-        && (idp->onlyattr <= 0))
-        BIO_printf(out, "%*s<EMPTY>\n", indent, "");
+                   int indent) {
+  ISSUING_DIST_POINT *idp = pidp;
+  if (idp->distpoint) {
+    print_distpoint(out, idp->distpoint, indent);
+  }
+  if (idp->onlyuser > 0) {
+    BIO_printf(out, "%*sOnly User Certificates\n", indent, "");
+  }
+  if (idp->onlyCA > 0) {
+    BIO_printf(out, "%*sOnly CA Certificates\n", indent, "");
+  }
+  if (idp->indirectCRL > 0) {
+    BIO_printf(out, "%*sIndirect CRL\n", indent, "");
+  }
+  if (idp->onlysomereasons) {
+    print_reasons(out, "Only Some Reasons", idp->onlysomereasons, indent);
+  }
+  if (idp->onlyattr > 0) {
+    BIO_printf(out, "%*sOnly Attribute Certificates\n", indent, "");
+  }
+  if (!idp->distpoint && (idp->onlyuser <= 0) && (idp->onlyCA <= 0) &&
+      (idp->indirectCRL <= 0) && !idp->onlysomereasons &&
+      (idp->onlyattr <= 0)) {
+    BIO_printf(out, "%*s<EMPTY>\n", indent, "");
+  }
 
-    return 1;
+  return 1;
 }
 
 static int i2r_crldp(const X509V3_EXT_METHOD *method, void *pcrldp, BIO *out,
-                     int indent)
-{
-    STACK_OF(DIST_POINT) *crld = pcrldp;
-    DIST_POINT *point;
-    size_t i;
-    for (i = 0; i < sk_DIST_POINT_num(crld); i++) {
-        BIO_puts(out, "\n");
-        point = sk_DIST_POINT_value(crld, i);
-        if (point->distpoint)
-            print_distpoint(out, point->distpoint, indent);
-        if (point->reasons)
-            print_reasons(out, "Reasons", point->reasons, indent);
-        if (point->CRLissuer) {
-            BIO_printf(out, "%*sCRL Issuer:\n", indent, "");
-            print_gens(out, point->CRLissuer, indent);
-        }
+                     int indent) {
+  STACK_OF(DIST_POINT) *crld = pcrldp;
+  DIST_POINT *point;
+  size_t i;
+  for (i = 0; i < sk_DIST_POINT_num(crld); i++) {
+    BIO_puts(out, "\n");
+    point = sk_DIST_POINT_value(crld, i);
+    if (point->distpoint) {
+      print_distpoint(out, point->distpoint, indent);
     }
-    return 1;
+    if (point->reasons) {
+      print_reasons(out, "Reasons", point->reasons, indent);
+    }
+    if (point->CRLissuer) {
+      BIO_printf(out, "%*sCRL Issuer:\n", indent, "");
+      print_gens(out, point->CRLissuer, indent);
+    }
+  }
+  return 1;
 }
 
-int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname)
-{
-    size_t i;
-    STACK_OF(X509_NAME_ENTRY) *frag;
-    X509_NAME_ENTRY *ne;
-    if (!dpn || (dpn->type != 1))
-        return 1;
-    frag = dpn->name.relativename;
-    dpn->dpname = X509_NAME_dup(iname);
-    if (!dpn->dpname)
-        return 0;
-    for (i = 0; i < sk_X509_NAME_ENTRY_num(frag); i++) {
-        ne = sk_X509_NAME_ENTRY_value(frag, i);
-        if (!X509_NAME_add_entry(dpn->dpname, ne, -1, i ? 0 : 1)) {
-            X509_NAME_free(dpn->dpname);
-            dpn->dpname = NULL;
-            return 0;
-        }
-    }
-    /* generate cached encoding of name */
-    if (i2d_X509_NAME(dpn->dpname, NULL) < 0) {
-        X509_NAME_free(dpn->dpname);
-        dpn->dpname = NULL;
-        return 0;
-    }
+int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname) {
+  size_t i;
+  STACK_OF(X509_NAME_ENTRY) *frag;
+  X509_NAME_ENTRY *ne;
+  if (!dpn || (dpn->type != 1)) {
     return 1;
+  }
+  frag = dpn->name.relativename;
+  dpn->dpname = X509_NAME_dup(iname);
+  if (!dpn->dpname) {
+    return 0;
+  }
+  for (i = 0; i < sk_X509_NAME_ENTRY_num(frag); i++) {
+    ne = sk_X509_NAME_ENTRY_value(frag, i);
+    if (!X509_NAME_add_entry(dpn->dpname, ne, -1, i ? 0 : 1)) {
+      X509_NAME_free(dpn->dpname);
+      dpn->dpname = NULL;
+      return 0;
+    }
+  }
+  // generate cached encoding of name
+  if (i2d_X509_NAME(dpn->dpname, NULL) < 0) {
+    X509_NAME_free(dpn->dpname);
+    dpn->dpname = NULL;
+    return 0;
+  }
+  return 1;
 }
diff --git a/src/crypto/x509v3/v3_enum.c b/src/crypto/x509v3/v3_enum.c
index 9b222bb..cd93f30 100644
--- a/src/crypto/x509v3/v3_enum.c
+++ b/src/crypto/x509v3/v3_enum.c
@@ -57,8 +57,8 @@
 
 #include <stdio.h>
 
-#include <openssl/obj.h>
 #include <openssl/mem.h>
+#include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
 #include "internal.h"
@@ -73,34 +73,40 @@
     {CRL_REASON_AFFILIATION_CHANGED, "Affiliation Changed",
      "affiliationChanged"},
     {CRL_REASON_SUPERSEDED, "Superseded", "superseded"},
-    {CRL_REASON_CESSATION_OF_OPERATION,
-     "Cessation Of Operation", "cessationOfOperation"},
+    {CRL_REASON_CESSATION_OF_OPERATION, "Cessation Of Operation",
+     "cessationOfOperation"},
     {CRL_REASON_CERTIFICATE_HOLD, "Certificate Hold", "certificateHold"},
     {CRL_REASON_REMOVE_FROM_CRL, "Remove From CRL", "removeFromCRL"},
     {CRL_REASON_PRIVILEGE_WITHDRAWN, "Privilege Withdrawn",
      "privilegeWithdrawn"},
     {CRL_REASON_AA_COMPROMISE, "AA Compromise", "AACompromise"},
-    {-1, NULL, NULL}
-};
+    {-1, NULL, NULL}};
+
+static char *i2s_ASN1_ENUMERATED_TABLE(const X509V3_EXT_METHOD *method,
+                                       void *ext) {
+  const ASN1_ENUMERATED *e = ext;
+  long strval = ASN1_ENUMERATED_get(e);
+  for (const ENUMERATED_NAMES *enam = method->usr_data; enam->lname; enam++) {
+    if (strval == enam->bitnum) {
+      return OPENSSL_strdup(enam->lname);
+    }
+  }
+  return i2s_ASN1_ENUMERATED(method, e);
+}
 
 const X509V3_EXT_METHOD v3_crl_reason = {
-    NID_crl_reason, 0, ASN1_ITEM_ref(ASN1_ENUMERATED),
-    0, 0, 0, 0,
-    (X509V3_EXT_I2S)i2s_ASN1_ENUMERATED_TABLE,
+    NID_crl_reason,
     0,
-    0, 0, 0, 0,
-    (void *)crl_reasons
+    ASN1_ITEM_ref(ASN1_ENUMERATED),
+    0,
+    0,
+    0,
+    0,
+    i2s_ASN1_ENUMERATED_TABLE,
+    0,
+    0,
+    0,
+    0,
+    0,
+    (void *)crl_reasons,
 };
-
-char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *method,
-                                const ASN1_ENUMERATED *e)
-{
-    const ENUMERATED_NAMES *enam;
-    long strval;
-    strval = ASN1_ENUMERATED_get(e);
-    for (enam = method->usr_data; enam->lname; enam++) {
-        if (strval == enam->bitnum)
-            return OPENSSL_strdup(enam->lname);
-    }
-    return i2s_ASN1_ENUMERATED(method, e);
-}
diff --git a/src/crypto/x509v3/v3_extku.c b/src/crypto/x509v3/v3_extku.c
index 952e032..0305ed2 100644
--- a/src/crypto/x509v3/v3_extku.c
+++ b/src/crypto/x509v3/v3_extku.c
@@ -66,83 +66,92 @@
 static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
                                     X509V3_CTX *ctx,
                                     STACK_OF(CONF_VALUE) *nval);
-static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
-                                                    *method, void *eku, STACK_OF(CONF_VALUE)
-                                                    *extlist);
+static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(
+    const X509V3_EXT_METHOD *method, void *eku, STACK_OF(CONF_VALUE) *extlist);
 
 const X509V3_EXT_METHOD v3_ext_ku = {
-    NID_ext_key_usage, 0,
+    NID_ext_key_usage,
+    0,
     ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
-    0, 0, 0, 0,
-    0, 0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     i2v_EXTENDED_KEY_USAGE,
     v2i_EXTENDED_KEY_USAGE,
-    0, 0,
-    NULL
+    0,
+    0,
+    NULL,
 };
 
-/* NB OCSP acceptable responses also is a SEQUENCE OF OBJECT */
+// NB OCSP acceptable responses also is a SEQUENCE OF OBJECT
 const X509V3_EXT_METHOD v3_ocsp_accresp = {
-    NID_id_pkix_OCSP_acceptableResponses, 0,
+    NID_id_pkix_OCSP_acceptableResponses,
+    0,
     ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
-    0, 0, 0, 0,
-    0, 0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     i2v_EXTENDED_KEY_USAGE,
     v2i_EXTENDED_KEY_USAGE,
-    0, 0,
-    NULL
+    0,
+    0,
+    NULL,
 };
 
-ASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, EXTENDED_KEY_USAGE, ASN1_OBJECT)
+ASN1_ITEM_TEMPLATE(EXTENDED_KEY_USAGE) = ASN1_EX_TEMPLATE_TYPE(
+    ASN1_TFLG_SEQUENCE_OF, 0, EXTENDED_KEY_USAGE, ASN1_OBJECT)
 ASN1_ITEM_TEMPLATE_END(EXTENDED_KEY_USAGE)
 
-IMPLEMENT_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
+IMPLEMENT_ASN1_FUNCTIONS_const(EXTENDED_KEY_USAGE)
 
-static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD
-                                                    *method, void *a, STACK_OF(CONF_VALUE)
-                                                    *ext_list)
-{
-    EXTENDED_KEY_USAGE *eku = a;
-    size_t i;
-    ASN1_OBJECT *obj;
-    char obj_tmp[80];
-    for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
-        obj = sk_ASN1_OBJECT_value(eku, i);
-        i2t_ASN1_OBJECT(obj_tmp, 80, obj);
-        X509V3_add_value(NULL, obj_tmp, &ext_list);
-    }
-    return ext_list;
+static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE(
+    const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *ext_list) {
+  EXTENDED_KEY_USAGE *eku = a;
+  size_t i;
+  ASN1_OBJECT *obj;
+  char obj_tmp[80];
+  for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
+    obj = sk_ASN1_OBJECT_value(eku, i);
+    i2t_ASN1_OBJECT(obj_tmp, 80, obj);
+    X509V3_add_value(NULL, obj_tmp, &ext_list);
+  }
+  return ext_list;
 }
 
 static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
                                     X509V3_CTX *ctx,
-                                    STACK_OF(CONF_VALUE) *nval)
-{
-    EXTENDED_KEY_USAGE *extku;
-    char *extval;
-    ASN1_OBJECT *objtmp;
-    CONF_VALUE *val;
-    size_t i;
+                                    STACK_OF(CONF_VALUE) *nval) {
+  EXTENDED_KEY_USAGE *extku;
+  char *extval;
+  ASN1_OBJECT *objtmp;
+  CONF_VALUE *val;
+  size_t i;
 
-    if (!(extku = sk_ASN1_OBJECT_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
+  if (!(extku = sk_ASN1_OBJECT_new_null())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
 
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        val = sk_CONF_VALUE_value(nval, i);
-        if (val->value)
-            extval = val->value;
-        else
-            extval = val->name;
-        if (!(objtmp = OBJ_txt2obj(extval, 0))) {
-            sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free);
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-            X509V3_conf_err(val);
-            return NULL;
-        }
-        sk_ASN1_OBJECT_push(extku, objtmp);
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    val = sk_CONF_VALUE_value(nval, i);
+    if (val->value) {
+      extval = val->value;
+    } else {
+      extval = val->name;
     }
-    return extku;
+    if (!(objtmp = OBJ_txt2obj(extval, 0))) {
+      sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free);
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+      X509V3_conf_err(val);
+      return NULL;
+    }
+    sk_ASN1_OBJECT_push(extku, objtmp);
+  }
+  return extku;
 }
diff --git a/src/crypto/x509v3/v3_genn.c b/src/crypto/x509v3/v3_genn.c
index ae79374..fef0204 100644
--- a/src/crypto/x509v3/v3_genn.c
+++ b/src/crypto/x509v3/v3_genn.c
@@ -64,203 +64,206 @@
 
 
 ASN1_SEQUENCE(OTHERNAME) = {
-        ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT),
-        /* Maybe have a true ANY DEFINED BY later */
-        ASN1_EXP(OTHERNAME, value, ASN1_ANY, 0)
+    ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT),
+    // Maybe have a true ANY DEFINED BY later
+    ASN1_EXP(OTHERNAME, value, ASN1_ANY, 0),
 } ASN1_SEQUENCE_END(OTHERNAME)
 
-IMPLEMENT_ASN1_FUNCTIONS(OTHERNAME)
+IMPLEMENT_ASN1_FUNCTIONS_const(OTHERNAME)
 
 ASN1_SEQUENCE(EDIPARTYNAME) = {
-        /* DirectoryString is a CHOICE type, so use explicit tagging. */
-        ASN1_EXP_OPT(EDIPARTYNAME, nameAssigner, DIRECTORYSTRING, 0),
-        ASN1_EXP(EDIPARTYNAME, partyName, DIRECTORYSTRING, 1)
+    // DirectoryString is a CHOICE type, so use explicit tagging.
+    ASN1_EXP_OPT(EDIPARTYNAME, nameAssigner, DIRECTORYSTRING, 0),
+    ASN1_EXP(EDIPARTYNAME, partyName, DIRECTORYSTRING, 1),
 } ASN1_SEQUENCE_END(EDIPARTYNAME)
 
-IMPLEMENT_ASN1_FUNCTIONS(EDIPARTYNAME)
+IMPLEMENT_ASN1_FUNCTIONS_const(EDIPARTYNAME)
 
 ASN1_CHOICE(GENERAL_NAME) = {
-        ASN1_IMP(GENERAL_NAME, d.otherName, OTHERNAME, GEN_OTHERNAME),
-        ASN1_IMP(GENERAL_NAME, d.rfc822Name, ASN1_IA5STRING, GEN_EMAIL),
-        ASN1_IMP(GENERAL_NAME, d.dNSName, ASN1_IA5STRING, GEN_DNS),
-        /* Don't decode this */
-        ASN1_IMP(GENERAL_NAME, d.x400Address, ASN1_SEQUENCE, GEN_X400),
-        /* X509_NAME is a CHOICE type so use EXPLICIT */
-        ASN1_EXP(GENERAL_NAME, d.directoryName, X509_NAME, GEN_DIRNAME),
-        ASN1_IMP(GENERAL_NAME, d.ediPartyName, EDIPARTYNAME, GEN_EDIPARTY),
-        ASN1_IMP(GENERAL_NAME, d.uniformResourceIdentifier, ASN1_IA5STRING, GEN_URI),
-        ASN1_IMP(GENERAL_NAME, d.iPAddress, ASN1_OCTET_STRING, GEN_IPADD),
-        ASN1_IMP(GENERAL_NAME, d.registeredID, ASN1_OBJECT, GEN_RID)
+    ASN1_IMP(GENERAL_NAME, d.otherName, OTHERNAME, GEN_OTHERNAME),
+    ASN1_IMP(GENERAL_NAME, d.rfc822Name, ASN1_IA5STRING, GEN_EMAIL),
+    ASN1_IMP(GENERAL_NAME, d.dNSName, ASN1_IA5STRING, GEN_DNS),
+    // Don't decode this
+    ASN1_IMP(GENERAL_NAME, d.x400Address, ASN1_SEQUENCE, GEN_X400),
+    // X509_NAME is a CHOICE type so use EXPLICIT
+    ASN1_EXP(GENERAL_NAME, d.directoryName, X509_NAME, GEN_DIRNAME),
+    ASN1_IMP(GENERAL_NAME, d.ediPartyName, EDIPARTYNAME, GEN_EDIPARTY),
+    ASN1_IMP(GENERAL_NAME, d.uniformResourceIdentifier, ASN1_IA5STRING,
+             GEN_URI),
+    ASN1_IMP(GENERAL_NAME, d.iPAddress, ASN1_OCTET_STRING, GEN_IPADD),
+    ASN1_IMP(GENERAL_NAME, d.registeredID, ASN1_OBJECT, GEN_RID),
 } ASN1_CHOICE_END(GENERAL_NAME)
 
 IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAME)
 
-ASN1_ITEM_TEMPLATE(GENERAL_NAMES) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, GENERAL_NAME)
+ASN1_ITEM_TEMPLATE(GENERAL_NAMES) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF,
+                                                          0, GeneralNames,
+                                                          GENERAL_NAME)
 ASN1_ITEM_TEMPLATE_END(GENERAL_NAMES)
 
 IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAMES)
 
 IMPLEMENT_ASN1_DUP_FUNCTION(GENERAL_NAME)
 
-static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b)
-{
-    /* nameAssigner is optional and may be NULL. */
-    if (a->nameAssigner == NULL) {
-        if (b->nameAssigner != NULL) {
-            return -1;
-        }
-    } else {
-        if (b->nameAssigner == NULL ||
-            ASN1_STRING_cmp(a->nameAssigner, b->nameAssigner) != 0) {
-            return -1;
-        }
+static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) {
+  // nameAssigner is optional and may be NULL.
+  if (a->nameAssigner == NULL) {
+    if (b->nameAssigner != NULL) {
+      return -1;
     }
+  } else {
+    if (b->nameAssigner == NULL ||
+        ASN1_STRING_cmp(a->nameAssigner, b->nameAssigner) != 0) {
+      return -1;
+    }
+  }
 
-    /* partyName may not be NULL. */
-    return ASN1_STRING_cmp(a->partyName, b->partyName);
+  // partyName may not be NULL.
+  return ASN1_STRING_cmp(a->partyName, b->partyName);
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
-int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b)
-{
-    if (!a || !b || a->type != b->type)
-        return -1;
-
-    switch (a->type) {
-    case GEN_X400:
-        return ASN1_TYPE_cmp(a->d.x400Address, b->d.x400Address);
-
-    case GEN_EDIPARTY:
-        return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName);
-
-    case GEN_OTHERNAME:
-        return OTHERNAME_cmp(a->d.otherName, b->d.otherName);
-
-    case GEN_EMAIL:
-    case GEN_DNS:
-    case GEN_URI:
-        return ASN1_STRING_cmp(a->d.ia5, b->d.ia5);
-
-    case GEN_DIRNAME:
-        return X509_NAME_cmp(a->d.dirn, b->d.dirn);
-
-    case GEN_IPADD:
-        return ASN1_OCTET_STRING_cmp(a->d.ip, b->d.ip);
-
-    case GEN_RID:
-        return OBJ_cmp(a->d.rid, b->d.rid);
-    }
-
+// Returns 0 if they are equal, != 0 otherwise.
+int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) {
+  if (!a || !b || a->type != b->type) {
     return -1;
+  }
+
+  switch (a->type) {
+    case GEN_X400:
+      return ASN1_TYPE_cmp(a->d.x400Address, b->d.x400Address);
+
+    case GEN_EDIPARTY:
+      return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName);
+
+    case GEN_OTHERNAME:
+      return OTHERNAME_cmp(a->d.otherName, b->d.otherName);
+
+    case GEN_EMAIL:
+    case GEN_DNS:
+    case GEN_URI:
+      return ASN1_STRING_cmp(a->d.ia5, b->d.ia5);
+
+    case GEN_DIRNAME:
+      return X509_NAME_cmp(a->d.dirn, b->d.dirn);
+
+    case GEN_IPADD:
+      return ASN1_OCTET_STRING_cmp(a->d.ip, b->d.ip);
+
+    case GEN_RID:
+      return OBJ_cmp(a->d.rid, b->d.rid);
+  }
+
+  return -1;
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
-int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b)
-{
-    int result = -1;
+// Returns 0 if they are equal, != 0 otherwise.
+int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b) {
+  int result = -1;
 
-    if (!a || !b)
-        return -1;
-    /* Check their type first. */
-    if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0)
-        return result;
-    /* Check the value. */
-    result = ASN1_TYPE_cmp(a->value, b->value);
+  if (!a || !b) {
+    return -1;
+  }
+  // Check their type first.
+  if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) {
     return result;
+  }
+  // Check the value.
+  result = ASN1_TYPE_cmp(a->value, b->value);
+  return result;
 }
 
-void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value)
-{
-    switch (type) {
+void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value) {
+  switch (type) {
     case GEN_X400:
-        a->d.x400Address = value;
-        break;
+      a->d.x400Address = value;
+      break;
 
     case GEN_EDIPARTY:
-        a->d.ediPartyName = value;
-        break;
+      a->d.ediPartyName = value;
+      break;
 
     case GEN_OTHERNAME:
-        a->d.otherName = value;
-        break;
+      a->d.otherName = value;
+      break;
 
     case GEN_EMAIL:
     case GEN_DNS:
     case GEN_URI:
-        a->d.ia5 = value;
-        break;
+      a->d.ia5 = value;
+      break;
 
     case GEN_DIRNAME:
-        a->d.dirn = value;
-        break;
+      a->d.dirn = value;
+      break;
 
     case GEN_IPADD:
-        a->d.ip = value;
-        break;
+      a->d.ip = value;
+      break;
 
     case GEN_RID:
-        a->d.rid = value;
-        break;
-    }
-    a->type = type;
+      a->d.rid = value;
+      break;
+  }
+  a->type = type;
 }
 
-void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype)
-{
-    if (ptype)
-        *ptype = a->type;
-    switch (a->type) {
+void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype) {
+  if (ptype) {
+    *ptype = a->type;
+  }
+  switch (a->type) {
     case GEN_X400:
-        return a->d.x400Address;
+      return a->d.x400Address;
 
     case GEN_EDIPARTY:
-        return a->d.ediPartyName;
+      return a->d.ediPartyName;
 
     case GEN_OTHERNAME:
-        return a->d.otherName;
+      return a->d.otherName;
 
     case GEN_EMAIL:
     case GEN_DNS:
     case GEN_URI:
-        return a->d.ia5;
+      return a->d.ia5;
 
     case GEN_DIRNAME:
-        return a->d.dirn;
+      return a->d.dirn;
 
     case GEN_IPADD:
-        return a->d.ip;
+      return a->d.ip;
 
     case GEN_RID:
-        return a->d.rid;
+      return a->d.rid;
 
     default:
-        return NULL;
-    }
+      return NULL;
+  }
 }
 
-int GENERAL_NAME_set0_othername(GENERAL_NAME *gen,
-                                ASN1_OBJECT *oid, ASN1_TYPE *value)
-{
-    OTHERNAME *oth;
-    oth = OTHERNAME_new();
-    if (!oth)
-        return 0;
-    ASN1_TYPE_free(oth->value);
-    oth->type_id = oid;
-    oth->value = value;
-    GENERAL_NAME_set0_value(gen, GEN_OTHERNAME, oth);
-    return 1;
+int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, ASN1_OBJECT *oid,
+                                ASN1_TYPE *value) {
+  OTHERNAME *oth;
+  oth = OTHERNAME_new();
+  if (!oth) {
+    return 0;
+  }
+  ASN1_TYPE_free(oth->value);
+  oth->type_id = oid;
+  oth->value = value;
+  GENERAL_NAME_set0_value(gen, GEN_OTHERNAME, oth);
+  return 1;
 }
 
-int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen,
-                                ASN1_OBJECT **poid, ASN1_TYPE **pvalue)
-{
-    if (gen->type != GEN_OTHERNAME)
-        return 0;
-    if (poid)
-        *poid = gen->d.otherName->type_id;
-    if (pvalue)
-        *pvalue = gen->d.otherName->value;
-    return 1;
+int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, ASN1_OBJECT **poid,
+                                ASN1_TYPE **pvalue) {
+  if (gen->type != GEN_OTHERNAME) {
+    return 0;
+  }
+  if (poid) {
+    *poid = gen->d.otherName->type_id;
+  }
+  if (pvalue) {
+    *pvalue = gen->d.otherName->value;
+  }
+  return 1;
 }
diff --git a/src/crypto/x509v3/v3_ia5.c b/src/crypto/x509v3/v3_ia5.c
index 700200c..8abf40c 100644
--- a/src/crypto/x509v3/v3_ia5.c
+++ b/src/crypto/x509v3/v3_ia5.c
@@ -70,10 +70,50 @@
 #include "../internal.h"
 
 
-static char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method,
-                                ASN1_IA5STRING *ia5);
-static ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method,
-                                          X509V3_CTX *ctx, char *str);
+static char *i2s_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, void *ext) {
+  const ASN1_IA5STRING *ia5 = ext;
+  char *tmp;
+  if (!ia5 || !ia5->length) {
+    return NULL;
+  }
+  if (!(tmp = OPENSSL_malloc(ia5->length + 1))) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+  OPENSSL_memcpy(tmp, ia5->data, ia5->length);
+  tmp[ia5->length] = 0;
+  return tmp;
+}
+
+static void *s2i_ASN1_IA5STRING(const X509V3_EXT_METHOD *method,
+                                X509V3_CTX *ctx, const char *str) {
+  ASN1_IA5STRING *ia5;
+  if (!str) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
+    return NULL;
+  }
+  if (!(ia5 = ASN1_IA5STRING_new())) {
+    goto err;
+  }
+  if (!ASN1_STRING_set(ia5, str, strlen(str))) {
+    ASN1_IA5STRING_free(ia5);
+    goto err;
+  }
+  return ia5;
+err:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  return NULL;
+}
+
+#define EXT_IA5STRING(nid)                                                 \
+  {                                                                        \
+    nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), 0, 0, 0, 0, i2s_ASN1_IA5STRING, \
+        s2i_ASN1_IA5STRING, 0, 0, 0, 0, NULL                               \
+  }
+
+#define EXT_END \
+  { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+
 const X509V3_EXT_METHOD v3_ns_ia5_list[] = {
     EXT_IA5STRING(NID_netscape_base_url),
     EXT_IA5STRING(NID_netscape_revocation_url),
@@ -82,40 +122,4 @@
     EXT_IA5STRING(NID_netscape_ca_policy_url),
     EXT_IA5STRING(NID_netscape_ssl_server_name),
     EXT_IA5STRING(NID_netscape_comment),
-    EXT_END
-};
-
-static char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method,
-                                ASN1_IA5STRING *ia5)
-{
-    char *tmp;
-    if (!ia5 || !ia5->length)
-        return NULL;
-    if (!(tmp = OPENSSL_malloc(ia5->length + 1))) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    OPENSSL_memcpy(tmp, ia5->data, ia5->length);
-    tmp[ia5->length] = 0;
-    return tmp;
-}
-
-static ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method,
-                                          X509V3_CTX *ctx, char *str)
-{
-    ASN1_IA5STRING *ia5;
-    if (!str) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
-        return NULL;
-    }
-    if (!(ia5 = ASN1_IA5STRING_new()))
-        goto err;
-    if (!ASN1_STRING_set(ia5, str, strlen(str))) {
-        ASN1_IA5STRING_free(ia5);
-        goto err;
-    }
-    return ia5;
- err:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-    return NULL;
-}
+    EXT_END};
diff --git a/src/crypto/x509v3/v3_info.c b/src/crypto/x509v3/v3_info.c
index 3615c71..872346a 100644
--- a/src/crypto/x509v3/v3_info.c
+++ b/src/crypto/x509v3/v3_info.c
@@ -68,151 +68,153 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
-static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
-                                                       *method, AUTHORITY_INFO_ACCESS
-                                                       *ainfo, STACK_OF(CONF_VALUE)
-                                                       *ret);
-static AUTHORITY_INFO_ACCESS *v2i_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
-                                                        *method,
-                                                        X509V3_CTX *ctx,
-                                                        STACK_OF(CONF_VALUE)
-                                                        *nval);
+static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret);
+static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method,
+                                       X509V3_CTX *ctx,
+                                       STACK_OF(CONF_VALUE) *nval);
 
-const X509V3_EXT_METHOD v3_info = { NID_info_access, X509V3_EXT_MULTILINE,
+const X509V3_EXT_METHOD v3_info = {
+    NID_info_access,
+    X509V3_EXT_MULTILINE,
     ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS),
-    0, 0, 0, 0,
-    0, 0,
-    (X509V3_EXT_I2V) i2v_AUTHORITY_INFO_ACCESS,
-    (X509V3_EXT_V2I)v2i_AUTHORITY_INFO_ACCESS,
-    0, 0,
-    NULL
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2v_AUTHORITY_INFO_ACCESS,
+    v2i_AUTHORITY_INFO_ACCESS,
+    0,
+    0,
+    NULL,
 };
 
-const X509V3_EXT_METHOD v3_sinfo = { NID_sinfo_access, X509V3_EXT_MULTILINE,
+const X509V3_EXT_METHOD v3_sinfo = {
+    NID_sinfo_access,
+    X509V3_EXT_MULTILINE,
     ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS),
-    0, 0, 0, 0,
-    0, 0,
-    (X509V3_EXT_I2V) i2v_AUTHORITY_INFO_ACCESS,
-    (X509V3_EXT_V2I)v2i_AUTHORITY_INFO_ACCESS,
-    0, 0,
-    NULL
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2v_AUTHORITY_INFO_ACCESS,
+    v2i_AUTHORITY_INFO_ACCESS,
+    0,
+    0,
+    NULL,
 };
 
 ASN1_SEQUENCE(ACCESS_DESCRIPTION) = {
-        ASN1_SIMPLE(ACCESS_DESCRIPTION, method, ASN1_OBJECT),
-        ASN1_SIMPLE(ACCESS_DESCRIPTION, location, GENERAL_NAME)
+    ASN1_SIMPLE(ACCESS_DESCRIPTION, method, ASN1_OBJECT),
+    ASN1_SIMPLE(ACCESS_DESCRIPTION, location, GENERAL_NAME),
 } ASN1_SEQUENCE_END(ACCESS_DESCRIPTION)
 
 IMPLEMENT_ASN1_FUNCTIONS(ACCESS_DESCRIPTION)
 
-ASN1_ITEM_TEMPLATE(AUTHORITY_INFO_ACCESS) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, ACCESS_DESCRIPTION)
+ASN1_ITEM_TEMPLATE(AUTHORITY_INFO_ACCESS) = ASN1_EX_TEMPLATE_TYPE(
+    ASN1_TFLG_SEQUENCE_OF, 0, GeneralNames, ACCESS_DESCRIPTION)
 ASN1_ITEM_TEMPLATE_END(AUTHORITY_INFO_ACCESS)
 
 IMPLEMENT_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS)
 
 static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(
-    X509V3_EXT_METHOD *method, AUTHORITY_INFO_ACCESS *ainfo,
-    STACK_OF(CONF_VALUE) *ret)
-{
-    ACCESS_DESCRIPTION *desc;
-    size_t i;
-    int nlen;
-    char objtmp[80], *ntmp;
-    CONF_VALUE *vtmp;
-    STACK_OF(CONF_VALUE) *tret = ret;
+    const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) {
+  const AUTHORITY_INFO_ACCESS *ainfo = ext;
+  ACCESS_DESCRIPTION *desc;
+  int nlen;
+  char objtmp[80], *ntmp;
+  CONF_VALUE *vtmp;
+  STACK_OF(CONF_VALUE) *tret = ret;
 
-    for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) {
-        STACK_OF(CONF_VALUE) *tmp;
+  for (size_t i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) {
+    STACK_OF(CONF_VALUE) *tmp;
 
-        desc = sk_ACCESS_DESCRIPTION_value(ainfo, i);
-        tmp = i2v_GENERAL_NAME(method, desc->location, tret);
-        if (tmp == NULL)
-            goto err;
-        tret = tmp;
-        vtmp = sk_CONF_VALUE_value(tret, i);
-        i2t_ASN1_OBJECT(objtmp, sizeof objtmp, desc->method);
-        nlen = strlen(objtmp) + strlen(vtmp->name) + 5;
-        ntmp = OPENSSL_malloc(nlen);
-        if (ntmp == NULL)
-            goto err;
-        OPENSSL_strlcpy(ntmp, objtmp, nlen);
-        OPENSSL_strlcat(ntmp, " - ", nlen);
-        OPENSSL_strlcat(ntmp, vtmp->name, nlen);
-        OPENSSL_free(vtmp->name);
-        vtmp->name = ntmp;
-
+    desc = sk_ACCESS_DESCRIPTION_value(ainfo, i);
+    tmp = i2v_GENERAL_NAME(method, desc->location, tret);
+    if (tmp == NULL) {
+      goto err;
     }
-    if (ret == NULL && tret == NULL)
-        return sk_CONF_VALUE_new_null();
+    tret = tmp;
+    vtmp = sk_CONF_VALUE_value(tret, i);
+    i2t_ASN1_OBJECT(objtmp, sizeof objtmp, desc->method);
+    nlen = strlen(objtmp) + strlen(vtmp->name) + 5;
+    ntmp = OPENSSL_malloc(nlen);
+    if (ntmp == NULL) {
+      goto err;
+    }
+    OPENSSL_strlcpy(ntmp, objtmp, nlen);
+    OPENSSL_strlcat(ntmp, " - ", nlen);
+    OPENSSL_strlcat(ntmp, vtmp->name, nlen);
+    OPENSSL_free(vtmp->name);
+    vtmp->name = ntmp;
+  }
+  if (ret == NULL && tret == NULL) {
+    return sk_CONF_VALUE_new_null();
+  }
 
-    return tret;
- err:
+  return tret;
+err:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  if (ret == NULL && tret != NULL) {
+    sk_CONF_VALUE_pop_free(tret, X509V3_conf_free);
+  }
+  return NULL;
+}
+
+static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method,
+                                       X509V3_CTX *ctx,
+                                       STACK_OF(CONF_VALUE) *nval) {
+  AUTHORITY_INFO_ACCESS *ainfo = NULL;
+  ACCESS_DESCRIPTION *acc;
+  char *objtmp, *ptmp;
+  if (!(ainfo = sk_ACCESS_DESCRIPTION_new_null())) {
     OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-    if (ret == NULL && tret != NULL)
-        sk_CONF_VALUE_pop_free(tret, X509V3_conf_free);
     return NULL;
+  }
+  for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i);
+    if (!(acc = ACCESS_DESCRIPTION_new()) ||
+        !sk_ACCESS_DESCRIPTION_push(ainfo, acc)) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    ptmp = strchr(cnf->name, ';');
+    if (!ptmp) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
+      goto err;
+    }
+    int objlen = ptmp - cnf->name;
+    CONF_VALUE ctmp;
+    ctmp.name = ptmp + 1;
+    ctmp.value = cnf->value;
+    if (!v2i_GENERAL_NAME_ex(acc->location, method, ctx, &ctmp, 0)) {
+      goto err;
+    }
+    if (!(objtmp = OPENSSL_malloc(objlen + 1))) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    OPENSSL_strlcpy(objtmp, cnf->name, objlen + 1);
+    acc->method = OBJ_txt2obj(objtmp, 0);
+    if (!acc->method) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_OBJECT);
+      ERR_add_error_data(2, "value=", objtmp);
+      OPENSSL_free(objtmp);
+      goto err;
+    }
+    OPENSSL_free(objtmp);
+  }
+  return ainfo;
+err:
+  sk_ACCESS_DESCRIPTION_pop_free(ainfo, ACCESS_DESCRIPTION_free);
+  return NULL;
 }
 
-static AUTHORITY_INFO_ACCESS *v2i_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
-                                                        *method,
-                                                        X509V3_CTX *ctx,
-                                                        STACK_OF(CONF_VALUE)
-                                                        *nval)
-{
-    AUTHORITY_INFO_ACCESS *ainfo = NULL;
-    CONF_VALUE *cnf, ctmp;
-    ACCESS_DESCRIPTION *acc;
-    size_t i;
-    int objlen;
-    char *objtmp, *ptmp;
-    if (!(ainfo = sk_ACCESS_DESCRIPTION_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        cnf = sk_CONF_VALUE_value(nval, i);
-        if (!(acc = ACCESS_DESCRIPTION_new())
-            || !sk_ACCESS_DESCRIPTION_push(ainfo, acc)) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        ptmp = strchr(cnf->name, ';');
-        if (!ptmp) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
-            goto err;
-        }
-        objlen = ptmp - cnf->name;
-        ctmp.name = ptmp + 1;
-        ctmp.value = cnf->value;
-        if (!v2i_GENERAL_NAME_ex(acc->location, method, ctx, &ctmp, 0))
-            goto err;
-        if (!(objtmp = OPENSSL_malloc(objlen + 1))) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        OPENSSL_strlcpy(objtmp, cnf->name, objlen + 1);
-        acc->method = OBJ_txt2obj(objtmp, 0);
-        if (!acc->method) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_OBJECT);
-            ERR_add_error_data(2, "value=", objtmp);
-            OPENSSL_free(objtmp);
-            goto err;
-        }
-        OPENSSL_free(objtmp);
-
-    }
-    return ainfo;
- err:
-    sk_ACCESS_DESCRIPTION_pop_free(ainfo, ACCESS_DESCRIPTION_free);
-    return NULL;
-}
-
-int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a)
-{
-    i2a_ASN1_OBJECT(bp, a->method);
-#ifdef UNDEF
-    i2a_GENERAL_NAME(bp, a->location);
-#endif
-    return 2;
+int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a) {
+  i2a_ASN1_OBJECT(bp, a->method);
+  return 2;
 }
diff --git a/src/crypto/x509v3/v3_int.c b/src/crypto/x509v3/v3_int.c
index 7bde446..50cef84 100644
--- a/src/crypto/x509v3/v3_int.c
+++ b/src/crypto/x509v3/v3_int.c
@@ -60,32 +60,63 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
+
+static char *i2s_ASN1_INTEGER_cb(const X509V3_EXT_METHOD *method, void *ext) {
+  return i2s_ASN1_INTEGER(method, ext);
+}
+
+static void *s2i_asn1_int(const X509V3_EXT_METHOD *meth, X509V3_CTX *ctx,
+                          const char *value) {
+  return s2i_ASN1_INTEGER(meth, value);
+}
+
 const X509V3_EXT_METHOD v3_crl_num = {
-    NID_crl_number, 0, ASN1_ITEM_ref(ASN1_INTEGER),
-    0, 0, 0, 0,
-    (X509V3_EXT_I2S)i2s_ASN1_INTEGER,
+    NID_crl_number,
     0,
-    0, 0, 0, 0, NULL
+    ASN1_ITEM_ref(ASN1_INTEGER),
+    0,
+    0,
+    0,
+    0,
+    i2s_ASN1_INTEGER_cb,
+    0,
+    0,
+    0,
+    0,
+    0,
+    NULL,
 };
 
 const X509V3_EXT_METHOD v3_delta_crl = {
-    NID_delta_crl, 0, ASN1_ITEM_ref(ASN1_INTEGER),
-    0, 0, 0, 0,
-    (X509V3_EXT_I2S)i2s_ASN1_INTEGER,
+    NID_delta_crl,
     0,
-    0, 0, 0, 0, NULL
+    ASN1_ITEM_ref(ASN1_INTEGER),
+    0,
+    0,
+    0,
+    0,
+    i2s_ASN1_INTEGER_cb,
+    0,
+    0,
+    0,
+    0,
+    0,
+    NULL,
 };
 
-static void *s2i_asn1_int(X509V3_EXT_METHOD *meth, X509V3_CTX *ctx,
-                          char *value)
-{
-    return s2i_ASN1_INTEGER(meth, value);
-}
-
 const X509V3_EXT_METHOD v3_inhibit_anyp = {
-    NID_inhibit_any_policy, 0, ASN1_ITEM_ref(ASN1_INTEGER),
-    0, 0, 0, 0,
-    (X509V3_EXT_I2S)i2s_ASN1_INTEGER,
-    (X509V3_EXT_S2I)s2i_asn1_int,
-    0, 0, 0, 0, NULL
+    NID_inhibit_any_policy,
+    0,
+    ASN1_ITEM_ref(ASN1_INTEGER),
+    0,
+    0,
+    0,
+    0,
+    i2s_ASN1_INTEGER_cb,
+    s2i_asn1_int,
+    0,
+    0,
+    0,
+    0,
+    NULL,
 };
diff --git a/src/crypto/x509v3/v3_lib.c b/src/crypto/x509v3/v3_lib.c
index 1b57f67..51b0f37 100644
--- a/src/crypto/x509v3/v3_lib.c
+++ b/src/crypto/x509v3/v3_lib.c
@@ -74,306 +74,304 @@
 static void ext_list_free(X509V3_EXT_METHOD *ext);
 
 static int ext_stack_cmp(const X509V3_EXT_METHOD **a,
-                         const X509V3_EXT_METHOD **b)
-{
-    return ((*a)->ext_nid - (*b)->ext_nid);
+                         const X509V3_EXT_METHOD **b) {
+  return ((*a)->ext_nid - (*b)->ext_nid);
 }
 
-int X509V3_EXT_add(X509V3_EXT_METHOD *ext)
-{
-    if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_stack_cmp))) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        ext_list_free(ext);
-        return 0;
-    }
-    if (!sk_X509V3_EXT_METHOD_push(ext_list, ext)) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        ext_list_free(ext);
-        return 0;
-    }
-    return 1;
+int X509V3_EXT_add(X509V3_EXT_METHOD *ext) {
+  if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_stack_cmp))) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    ext_list_free(ext);
+    return 0;
+  }
+  if (!sk_X509V3_EXT_METHOD_push(ext_list, ext)) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    ext_list_free(ext);
+    return 0;
+  }
+  return 1;
 }
 
-static int ext_cmp(const void *void_a, const void *void_b)
-{
-    const X509V3_EXT_METHOD **a = (const X509V3_EXT_METHOD **)void_a;
-    const X509V3_EXT_METHOD **b = (const X509V3_EXT_METHOD **)void_b;
-    return ext_stack_cmp(a, b);
+static int ext_cmp(const void *void_a, const void *void_b) {
+  const X509V3_EXT_METHOD **a = (const X509V3_EXT_METHOD **)void_a;
+  const X509V3_EXT_METHOD **b = (const X509V3_EXT_METHOD **)void_b;
+  return ext_stack_cmp(a, b);
 }
 
-const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid)
-{
-    X509V3_EXT_METHOD tmp;
-    const X509V3_EXT_METHOD *t = &tmp, *const *ret;
-    size_t idx;
+const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid) {
+  X509V3_EXT_METHOD tmp;
+  const X509V3_EXT_METHOD *t = &tmp, *const * ret;
+  size_t idx;
 
-    if (nid < 0)
-        return NULL;
-    tmp.ext_nid = nid;
-    ret =
-        bsearch(&t, standard_exts, STANDARD_EXTENSION_COUNT,
+  if (nid < 0) {
+    return NULL;
+  }
+  tmp.ext_nid = nid;
+  ret = bsearch(&t, standard_exts, STANDARD_EXTENSION_COUNT,
                 sizeof(X509V3_EXT_METHOD *), ext_cmp);
-    if (ret)
-        return *ret;
-    if (!ext_list)
-        return NULL;
+  if (ret) {
+    return *ret;
+  }
+  if (!ext_list) {
+    return NULL;
+  }
 
-    sk_X509V3_EXT_METHOD_sort(ext_list);
-    if (!sk_X509V3_EXT_METHOD_find(ext_list, &idx, &tmp))
-        return NULL;
-    return sk_X509V3_EXT_METHOD_value(ext_list, idx);
+  sk_X509V3_EXT_METHOD_sort(ext_list);
+  if (!sk_X509V3_EXT_METHOD_find(ext_list, &idx, &tmp)) {
+    return NULL;
+  }
+  return sk_X509V3_EXT_METHOD_value(ext_list, idx);
 }
 
-const X509V3_EXT_METHOD *X509V3_EXT_get(const X509_EXTENSION *ext)
-{
-    int nid;
-    if ((nid = OBJ_obj2nid(ext->object)) == NID_undef)
-        return NULL;
-    return X509V3_EXT_get_nid(nid);
+const X509V3_EXT_METHOD *X509V3_EXT_get(const X509_EXTENSION *ext) {
+  int nid;
+  if ((nid = OBJ_obj2nid(ext->object)) == NID_undef) {
+    return NULL;
+  }
+  return X509V3_EXT_get_nid(nid);
 }
 
-int X509V3_EXT_free(int nid, void *ext_data)
-{
-    const X509V3_EXT_METHOD *ext_method = X509V3_EXT_get_nid(nid);
-    if (ext_method == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION);
-        return 0;
+int X509V3_EXT_free(int nid, void *ext_data) {
+  const X509V3_EXT_METHOD *ext_method = X509V3_EXT_get_nid(nid);
+  if (ext_method == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION);
+    return 0;
+  }
+
+  if (ext_method->it != NULL) {
+    ASN1_item_free(ext_data, ASN1_ITEM_ptr(ext_method->it));
+  } else if (ext_method->ext_free != NULL) {
+    ext_method->ext_free(ext_data);
+  } else {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION);
+    return 0;
+  }
+
+  return 1;
+}
+
+int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) {
+  for (; extlist->ext_nid != -1; extlist++) {
+    if (!X509V3_EXT_add(extlist)) {
+      return 0;
     }
-
-    if (ext_method->it != NULL)
-        ASN1_item_free(ext_data, ASN1_ITEM_ptr(ext_method->it));
-    else if (ext_method->ext_free != NULL)
-        ext_method->ext_free(ext_data);
-    else {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION);
-        return 0;
-    }
-
-    return 1;
+  }
+  return 1;
 }
 
-int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist)
-{
-    for (; extlist->ext_nid != -1; extlist++)
-        if (!X509V3_EXT_add(extlist))
-            return 0;
-    return 1;
+int X509V3_EXT_add_alias(int nid_to, int nid_from) {
+  const X509V3_EXT_METHOD *ext;
+  X509V3_EXT_METHOD *tmpext;
+
+  if (!(ext = X509V3_EXT_get_nid(nid_from))) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_NOT_FOUND);
+    return 0;
+  }
+  if (!(tmpext =
+            (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METHOD)))) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  *tmpext = *ext;
+  tmpext->ext_nid = nid_to;
+  tmpext->ext_flags |= X509V3_EXT_DYNAMIC;
+  return X509V3_EXT_add(tmpext);
 }
 
-int X509V3_EXT_add_alias(int nid_to, int nid_from)
-{
-    const X509V3_EXT_METHOD *ext;
-    X509V3_EXT_METHOD *tmpext;
-
-    if (!(ext = X509V3_EXT_get_nid(nid_from))) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_NOT_FOUND);
-        return 0;
-    }
-    if (!
-        (tmpext =
-         (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METHOD)))) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return 0;
-    }
-    *tmpext = *ext;
-    tmpext->ext_nid = nid_to;
-    tmpext->ext_flags |= X509V3_EXT_DYNAMIC;
-    return X509V3_EXT_add(tmpext);
+void X509V3_EXT_cleanup(void) {
+  sk_X509V3_EXT_METHOD_pop_free(ext_list, ext_list_free);
+  ext_list = NULL;
 }
 
-void X509V3_EXT_cleanup(void)
-{
-    sk_X509V3_EXT_METHOD_pop_free(ext_list, ext_list_free);
-    ext_list = NULL;
+static void ext_list_free(X509V3_EXT_METHOD *ext) {
+  if (ext->ext_flags & X509V3_EXT_DYNAMIC) {
+    OPENSSL_free(ext);
+  }
 }
 
-static void ext_list_free(X509V3_EXT_METHOD *ext)
-{
-    if (ext->ext_flags & X509V3_EXT_DYNAMIC)
-        OPENSSL_free(ext);
-}
+// Legacy function: we don't need to add standard extensions any more because
+// they are now kept in ext_dat.h.
 
-/*
- * Legacy function: we don't need to add standard extensions any more because
- * they are now kept in ext_dat.h.
- */
+int X509V3_add_standard_extensions(void) { return 1; }
 
-int X509V3_add_standard_extensions(void)
-{
-    return 1;
-}
+// Return an extension internal structure
 
-/* Return an extension internal structure */
+void *X509V3_EXT_d2i(const X509_EXTENSION *ext) {
+  const X509V3_EXT_METHOD *method;
+  const unsigned char *p;
 
-void *X509V3_EXT_d2i(const X509_EXTENSION *ext)
-{
-    const X509V3_EXT_METHOD *method;
-    const unsigned char *p;
-
-    if (!(method = X509V3_EXT_get(ext)))
-        return NULL;
-    p = ext->value->data;
-    void *ret;
+  if (!(method = X509V3_EXT_get(ext))) {
+    return NULL;
+  }
+  p = ext->value->data;
+  void *ret;
+  if (method->it) {
+    ret =
+        ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_ITEM_ptr(method->it));
+  } else {
+    ret = method->d2i(NULL, &p, ext->value->length);
+  }
+  if (ret == NULL) {
+    return NULL;
+  }
+  // Check for trailing data.
+  if (p != ext->value->data + ext->value->length) {
     if (method->it) {
-        ret = ASN1_item_d2i(NULL, &p, ext->value->length,
-                            ASN1_ITEM_ptr(method->it));
+      ASN1_item_free(ret, ASN1_ITEM_ptr(method->it));
     } else {
-        ret = method->d2i(NULL, &p, ext->value->length);
+      method->ext_free(ret);
     }
-    if (ret == NULL) {
-        return NULL;
-    }
-    /* Check for trailing data. */
-    if (p != ext->value->data + ext->value->length) {
-        if (method->it) {
-            ASN1_item_free(ret, ASN1_ITEM_ptr(method->it));
-        } else {
-            method->ext_free(ret);
-        }
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_TRAILING_DATA_IN_EXTENSION);
-        return NULL;
-    }
-    return ret;
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_TRAILING_DATA_IN_EXTENSION);
+    return NULL;
+  }
+  return ret;
 }
 
 void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, int nid,
-                     int *out_critical, int *out_idx)
-{
-    int lastpos;
-    size_t i;
-    X509_EXTENSION *ex, *found_ex = NULL;
-    if (!extensions) {
-        if (out_idx)
-            *out_idx = -1;
-        if (out_critical)
-            *out_critical = -1;
-        return NULL;
+                     int *out_critical, int *out_idx) {
+  int lastpos;
+  size_t i;
+  X509_EXTENSION *ex, *found_ex = NULL;
+  if (!extensions) {
+    if (out_idx) {
+      *out_idx = -1;
     }
-    if (out_idx)
-        lastpos = *out_idx + 1;
-    else
-        lastpos = 0;
-    if (lastpos < 0)
-        lastpos = 0;
-    for (i = lastpos; i < sk_X509_EXTENSION_num(extensions); i++) {
-        ex = sk_X509_EXTENSION_value(extensions, i);
-        if (OBJ_obj2nid(ex->object) == nid) {
-            if (out_idx) {
-                /* TODO(https://crbug.com/boringssl/379): Consistently reject
-                 * duplicate extensions. */
-                *out_idx = i;
-                found_ex = ex;
-                break;
-            } else if (found_ex) {
-                /* Found more than one */
-                if (out_critical)
-                    *out_critical = -2;
-                return NULL;
-            }
-            found_ex = ex;
-        }
+    if (out_critical) {
+      *out_critical = -1;
     }
-    if (found_ex) {
-        /* Found it */
-        if (out_critical)
-            *out_critical = X509_EXTENSION_get_critical(found_ex);
-        return X509V3_EXT_d2i(found_ex);
-    }
-
-    /* Extension not found */
-    if (out_idx)
-        *out_idx = -1;
-    if (out_critical)
-        *out_critical = -1;
     return NULL;
+  }
+  if (out_idx) {
+    lastpos = *out_idx + 1;
+  } else {
+    lastpos = 0;
+  }
+  if (lastpos < 0) {
+    lastpos = 0;
+  }
+  for (i = lastpos; i < sk_X509_EXTENSION_num(extensions); i++) {
+    ex = sk_X509_EXTENSION_value(extensions, i);
+    if (OBJ_obj2nid(ex->object) == nid) {
+      if (out_idx) {
+        // TODO(https://crbug.com/boringssl/379): Consistently reject
+        // duplicate extensions.
+        *out_idx = i;
+        found_ex = ex;
+        break;
+      } else if (found_ex) {
+        // Found more than one
+        if (out_critical) {
+          *out_critical = -2;
+        }
+        return NULL;
+      }
+      found_ex = ex;
+    }
+  }
+  if (found_ex) {
+    // Found it
+    if (out_critical) {
+      *out_critical = X509_EXTENSION_get_critical(found_ex);
+    }
+    return X509V3_EXT_d2i(found_ex);
+  }
+
+  // Extension not found
+  if (out_idx) {
+    *out_idx = -1;
+  }
+  if (out_critical) {
+    *out_critical = -1;
+  }
+  return NULL;
 }
 
-/*
- * This function is a general extension append, replace and delete utility.
- * The precise operation is governed by the 'flags' value. The 'crit' and
- * 'value' arguments (if relevant) are the extensions internal structure.
- */
+// This function is a general extension append, replace and delete utility.
+// The precise operation is governed by the 'flags' value. The 'crit' and
+// 'value' arguments (if relevant) are the extensions internal structure.
 
 int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value,
-                    int crit, unsigned long flags)
-{
-    int errcode, extidx = -1;
-    X509_EXTENSION *ext = NULL, *extmp;
-    STACK_OF(X509_EXTENSION) *ret = NULL;
-    unsigned long ext_op = flags & X509V3_ADD_OP_MASK;
+                    int crit, unsigned long flags) {
+  int errcode, extidx = -1;
+  X509_EXTENSION *ext = NULL, *extmp;
+  STACK_OF(X509_EXTENSION) *ret = NULL;
+  unsigned long ext_op = flags & X509V3_ADD_OP_MASK;
 
-    /*
-     * If appending we don't care if it exists, otherwise look for existing
-     * extension.
-     */
-    if (ext_op != X509V3_ADD_APPEND)
-        extidx = X509v3_get_ext_by_NID(*x, nid, -1);
+  // If appending we don't care if it exists, otherwise look for existing
+  // extension.
+  if (ext_op != X509V3_ADD_APPEND) {
+    extidx = X509v3_get_ext_by_NID(*x, nid, -1);
+  }
 
-    /* See if extension exists */
-    if (extidx >= 0) {
-        /* If keep existing, nothing to do */
-        if (ext_op == X509V3_ADD_KEEP_EXISTING)
-            return 1;
-        /* If default then its an error */
-        if (ext_op == X509V3_ADD_DEFAULT) {
-            errcode = X509V3_R_EXTENSION_EXISTS;
-            goto err;
-        }
-        /* If delete, just delete it */
-        if (ext_op == X509V3_ADD_DELETE) {
-            if (!sk_X509_EXTENSION_delete(*x, extidx))
-                return -1;
-            return 1;
-        }
-    } else {
-        /*
-         * If replace existing or delete, error since extension must exist
-         */
-        if ((ext_op == X509V3_ADD_REPLACE_EXISTING) ||
-            (ext_op == X509V3_ADD_DELETE)) {
-            errcode = X509V3_R_EXTENSION_NOT_FOUND;
-            goto err;
-        }
+  // See if extension exists
+  if (extidx >= 0) {
+    // If keep existing, nothing to do
+    if (ext_op == X509V3_ADD_KEEP_EXISTING) {
+      return 1;
     }
-
-    /*
-     * If we get this far then we have to create an extension: could have
-     * some flags for alternative encoding schemes...
-     */
-
-    ext = X509V3_EXT_i2d(nid, crit, value);
-
-    if (!ext) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ERROR_CREATING_EXTENSION);
-        return 0;
+    // If default then its an error
+    if (ext_op == X509V3_ADD_DEFAULT) {
+      errcode = X509V3_R_EXTENSION_EXISTS;
+      goto err;
     }
-
-    /* If extension exists replace it.. */
-    if (extidx >= 0) {
-        extmp = sk_X509_EXTENSION_value(*x, extidx);
-        X509_EXTENSION_free(extmp);
-        if (!sk_X509_EXTENSION_set(*x, extidx, ext))
-            return -1;
-        return 1;
+    // If delete, just delete it
+    if (ext_op == X509V3_ADD_DELETE) {
+      X509_EXTENSION *prev_ext = sk_X509_EXTENSION_delete(*x, extidx);
+      if (prev_ext == NULL) {
+        return -1;
+      }
+      X509_EXTENSION_free(prev_ext);
+      return 1;
     }
+  } else {
+    // If replace existing or delete, error since extension must exist
+    if ((ext_op == X509V3_ADD_REPLACE_EXISTING) ||
+        (ext_op == X509V3_ADD_DELETE)) {
+      errcode = X509V3_R_EXTENSION_NOT_FOUND;
+      goto err;
+    }
+  }
 
-    if ((ret = *x) == NULL
-         && (ret = sk_X509_EXTENSION_new_null()) == NULL)
-        goto m_fail;
-    if (!sk_X509_EXTENSION_push(ret, ext))
-        goto m_fail;
+  // If we get this far then we have to create an extension: could have
+  // some flags for alternative encoding schemes...
 
-    *x = ret;
-    return 1;
+  ext = X509V3_EXT_i2d(nid, crit, value);
 
- m_fail:
-    if (ret != *x)
-        sk_X509_EXTENSION_free(ret);
-    X509_EXTENSION_free(ext);
-    return -1;
-
- err:
-    if (!(flags & X509V3_ADD_SILENT))
-        OPENSSL_PUT_ERROR(X509V3, errcode);
+  if (!ext) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_ERROR_CREATING_EXTENSION);
     return 0;
+  }
+
+  // If extension exists replace it..
+  if (extidx >= 0) {
+    extmp = sk_X509_EXTENSION_value(*x, extidx);
+    X509_EXTENSION_free(extmp);
+    if (!sk_X509_EXTENSION_set(*x, extidx, ext)) {
+      return -1;
+    }
+    return 1;
+  }
+
+  if ((ret = *x) == NULL && (ret = sk_X509_EXTENSION_new_null()) == NULL) {
+    goto m_fail;
+  }
+  if (!sk_X509_EXTENSION_push(ret, ext)) {
+    goto m_fail;
+  }
+
+  *x = ret;
+  return 1;
+
+m_fail:
+  if (ret != *x) {
+    sk_X509_EXTENSION_free(ret);
+  }
+  X509_EXTENSION_free(ext);
+  return -1;
+
+err:
+  if (!(flags & X509V3_ADD_SILENT)) {
+    OPENSSL_PUT_ERROR(X509V3, errcode);
+  }
+  return 0;
 }
diff --git a/src/crypto/x509v3/v3_ncons.c b/src/crypto/x509v3/v3_ncons.c
index 739a59e..f923e29 100644
--- a/src/crypto/x509v3/v3_ncons.c
+++ b/src/crypto/x509v3/v3_ncons.c
@@ -70,43 +70,49 @@
 
 
 static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
-                                  X509V3_CTX *ctx,
-                                  STACK_OF(CONF_VALUE) *nval);
+                                  X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
 static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a,
                                 BIO *bp, int ind);
 static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method,
                                    STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp,
                                    int ind, const char *name);
-static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip);
+static int print_nc_ipadd(BIO *bp, const ASN1_OCTET_STRING *ip);
 
 static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc);
 static int nc_match_single(GENERAL_NAME *sub, GENERAL_NAME *gen);
 static int nc_dn(X509_NAME *sub, X509_NAME *nm);
-static int nc_dns(ASN1_IA5STRING *sub, ASN1_IA5STRING *dns);
-static int nc_email(ASN1_IA5STRING *sub, ASN1_IA5STRING *eml);
-static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base);
+static int nc_dns(const ASN1_IA5STRING *sub, const ASN1_IA5STRING *dns);
+static int nc_email(const ASN1_IA5STRING *sub, const ASN1_IA5STRING *eml);
+static int nc_uri(const ASN1_IA5STRING *uri, const ASN1_IA5STRING *base);
 
 const X509V3_EXT_METHOD v3_name_constraints = {
-    NID_name_constraints, 0,
+    NID_name_constraints,
+    0,
     ASN1_ITEM_ref(NAME_CONSTRAINTS),
-    0, 0, 0, 0,
-    0, 0,
-    0, v2i_NAME_CONSTRAINTS,
-    i2r_NAME_CONSTRAINTS, 0,
-    NULL
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    v2i_NAME_CONSTRAINTS,
+    i2r_NAME_CONSTRAINTS,
+    0,
+    NULL,
 };
 
 ASN1_SEQUENCE(GENERAL_SUBTREE) = {
-        ASN1_SIMPLE(GENERAL_SUBTREE, base, GENERAL_NAME),
-        ASN1_IMP_OPT(GENERAL_SUBTREE, minimum, ASN1_INTEGER, 0),
-        ASN1_IMP_OPT(GENERAL_SUBTREE, maximum, ASN1_INTEGER, 1)
+    ASN1_SIMPLE(GENERAL_SUBTREE, base, GENERAL_NAME),
+    ASN1_IMP_OPT(GENERAL_SUBTREE, minimum, ASN1_INTEGER, 0),
+    ASN1_IMP_OPT(GENERAL_SUBTREE, maximum, ASN1_INTEGER, 1),
 } ASN1_SEQUENCE_END(GENERAL_SUBTREE)
 
 ASN1_SEQUENCE(NAME_CONSTRAINTS) = {
-        ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees,
-                                                        GENERAL_SUBTREE, 0),
-        ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees,
-                                                        GENERAL_SUBTREE, 1),
+    ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees,
+                             GENERAL_SUBTREE, 0),
+    ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees,
+                             GENERAL_SUBTREE, 1),
 } ASN1_SEQUENCE_END(NAME_CONSTRAINTS)
 
 
@@ -114,445 +120,438 @@
 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS)
 
 static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
-                                  X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
-{
-    size_t i;
-    CONF_VALUE tval, *val;
-    STACK_OF(GENERAL_SUBTREE) **ptree = NULL;
-    NAME_CONSTRAINTS *ncons = NULL;
-    GENERAL_SUBTREE *sub = NULL;
-    ncons = NAME_CONSTRAINTS_new();
-    if (!ncons)
-        goto memerr;
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        val = sk_CONF_VALUE_value(nval, i);
-        if (!strncmp(val->name, "permitted", 9) && val->name[9]) {
-            ptree = &ncons->permittedSubtrees;
-            tval.name = val->name + 10;
-        } else if (!strncmp(val->name, "excluded", 8) && val->name[8]) {
-            ptree = &ncons->excludedSubtrees;
-            tval.name = val->name + 9;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
-            goto err;
-        }
-        tval.value = val->value;
-        sub = GENERAL_SUBTREE_new();
-        if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1))
-            goto err;
-        if (!*ptree)
-            *ptree = sk_GENERAL_SUBTREE_new_null();
-        if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub))
-            goto memerr;
-        sub = NULL;
+                                  X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) {
+  size_t i;
+  CONF_VALUE tval, *val;
+  STACK_OF(GENERAL_SUBTREE) **ptree = NULL;
+  NAME_CONSTRAINTS *ncons = NULL;
+  GENERAL_SUBTREE *sub = NULL;
+  ncons = NAME_CONSTRAINTS_new();
+  if (!ncons) {
+    goto memerr;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    val = sk_CONF_VALUE_value(nval, i);
+    if (!strncmp(val->name, "permitted", 9) && val->name[9]) {
+      ptree = &ncons->permittedSubtrees;
+      tval.name = val->name + 10;
+    } else if (!strncmp(val->name, "excluded", 8) && val->name[8]) {
+      ptree = &ncons->excludedSubtrees;
+      tval.name = val->name + 9;
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX);
+      goto err;
     }
+    tval.value = val->value;
+    sub = GENERAL_SUBTREE_new();
+    if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) {
+      goto err;
+    }
+    if (!*ptree) {
+      *ptree = sk_GENERAL_SUBTREE_new_null();
+    }
+    if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) {
+      goto memerr;
+    }
+    sub = NULL;
+  }
 
-    return ncons;
+  return ncons;
 
- memerr:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
- err:
-    if (ncons)
-        NAME_CONSTRAINTS_free(ncons);
-    if (sub)
-        GENERAL_SUBTREE_free(sub);
-
-    return NULL;
+memerr:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+err:
+  NAME_CONSTRAINTS_free(ncons);
+  GENERAL_SUBTREE_free(sub);
+  return NULL;
 }
 
 static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a,
-                                BIO *bp, int ind)
-{
-    NAME_CONSTRAINTS *ncons = a;
-    do_i2r_name_constraints(method, ncons->permittedSubtrees,
-                            bp, ind, "Permitted");
-    do_i2r_name_constraints(method, ncons->excludedSubtrees,
-                            bp, ind, "Excluded");
-    return 1;
+                                BIO *bp, int ind) {
+  NAME_CONSTRAINTS *ncons = a;
+  do_i2r_name_constraints(method, ncons->permittedSubtrees, bp, ind,
+                          "Permitted");
+  do_i2r_name_constraints(method, ncons->excludedSubtrees, bp, ind, "Excluded");
+  return 1;
 }
 
 static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method,
-                                   STACK_OF(GENERAL_SUBTREE) *trees,
-                                   BIO *bp, int ind, const char *name)
-{
-    GENERAL_SUBTREE *tree;
-    size_t i;
-    if (sk_GENERAL_SUBTREE_num(trees) > 0)
-        BIO_printf(bp, "%*s%s:\n", ind, "", name);
-    for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) {
-        tree = sk_GENERAL_SUBTREE_value(trees, i);
-        BIO_printf(bp, "%*s", ind + 2, "");
-        if (tree->base->type == GEN_IPADD)
-            print_nc_ipadd(bp, tree->base->d.ip);
-        else
-            GENERAL_NAME_print(bp, tree->base);
-        BIO_puts(bp, "\n");
+                                   STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp,
+                                   int ind, const char *name) {
+  GENERAL_SUBTREE *tree;
+  size_t i;
+  if (sk_GENERAL_SUBTREE_num(trees) > 0) {
+    BIO_printf(bp, "%*s%s:\n", ind, "", name);
+  }
+  for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) {
+    tree = sk_GENERAL_SUBTREE_value(trees, i);
+    BIO_printf(bp, "%*s", ind + 2, "");
+    if (tree->base->type == GEN_IPADD) {
+      print_nc_ipadd(bp, tree->base->d.ip);
+    } else {
+      GENERAL_NAME_print(bp, tree->base);
     }
-    return 1;
+    BIO_puts(bp, "\n");
+  }
+  return 1;
 }
 
-static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip)
-{
-    int i, len;
-    unsigned char *p;
-    p = ip->data;
-    len = ip->length;
-    BIO_puts(bp, "IP:");
-    if (len == 8) {
-        BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d",
-                   p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
-    } else if (len == 32) {
-        for (i = 0; i < 16; i++) {
-            BIO_printf(bp, "%X", p[0] << 8 | p[1]);
-            p += 2;
-            if (i == 7)
-                BIO_puts(bp, "/");
-            else if (i != 15)
-                BIO_puts(bp, ":");
-        }
-    } else
-        BIO_printf(bp, "IP Address:<invalid>");
-    return 1;
+static int print_nc_ipadd(BIO *bp, const ASN1_OCTET_STRING *ip) {
+  int i, len;
+  unsigned char *p;
+  p = ip->data;
+  len = ip->length;
+  BIO_puts(bp, "IP:");
+  if (len == 8) {
+    BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", p[0], p[1], p[2], p[3], p[4],
+               p[5], p[6], p[7]);
+  } else if (len == 32) {
+    for (i = 0; i < 16; i++) {
+      uint16_t v = ((uint16_t)p[0] << 8) | p[1];
+      BIO_printf(bp, "%X", v);
+      p += 2;
+      if (i == 7) {
+        BIO_puts(bp, "/");
+      } else if (i != 15) {
+        BIO_puts(bp, ":");
+      }
+    }
+  } else {
+    BIO_printf(bp, "IP Address:<invalid>");
+  }
+  return 1;
 }
 
-/*-
- * Check a certificate conforms to a specified set of constraints.
- * Return values:
- *   X509_V_OK: All constraints obeyed.
- *   X509_V_ERR_PERMITTED_VIOLATION: Permitted subtree violation.
- *   X509_V_ERR_EXCLUDED_VIOLATION: Excluded subtree violation.
- *   X509_V_ERR_SUBTREE_MINMAX: Min or max values present and matching type.
- *   X509_V_ERR_UNSPECIFIED: Unspecified error.
- *   X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type.
- *   X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: Bad or unsupported constraint
- *     syntax.
- *   X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name.
- */
+//-
+// Check a certificate conforms to a specified set of constraints.
+// Return values:
+//   X509_V_OK: All constraints obeyed.
+//   X509_V_ERR_PERMITTED_VIOLATION: Permitted subtree violation.
+//   X509_V_ERR_EXCLUDED_VIOLATION: Excluded subtree violation.
+//   X509_V_ERR_SUBTREE_MINMAX: Min or max values present and matching type.
+//   X509_V_ERR_UNSPECIFIED: Unspecified error.
+//   X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type.
+//   X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: Bad or unsupported constraint
+//     syntax.
+//   X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name.
 
-int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc)
-{
-    int r, i;
-    size_t j;
-    X509_NAME *nm;
+int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) {
+  int r, i;
+  size_t j;
+  X509_NAME *nm;
 
-    nm = X509_get_subject_name(x);
+  nm = X509_get_subject_name(x);
 
-    /* Guard against certificates with an excessive number of names or
-     * constraints causing a computationally expensive name constraints
-     * check. */
-    size_t name_count =
-        X509_NAME_entry_count(nm) + sk_GENERAL_NAME_num(x->altname);
-    size_t constraint_count = sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) +
-                              sk_GENERAL_SUBTREE_num(nc->excludedSubtrees);
-    size_t check_count = constraint_count * name_count;
-    if (name_count < (size_t)X509_NAME_entry_count(nm) ||
-        constraint_count < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) ||
-        (constraint_count && check_count / constraint_count != name_count) ||
-        check_count > 1 << 20) {
-      return X509_V_ERR_UNSPECIFIED;
+  // Guard against certificates with an excessive number of names or
+  // constraints causing a computationally expensive name constraints
+  // check.
+  size_t name_count =
+      X509_NAME_entry_count(nm) + sk_GENERAL_NAME_num(x->altname);
+  size_t constraint_count = sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) +
+                            sk_GENERAL_SUBTREE_num(nc->excludedSubtrees);
+  size_t check_count = constraint_count * name_count;
+  if (name_count < (size_t)X509_NAME_entry_count(nm) ||
+      constraint_count < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) ||
+      (constraint_count && check_count / constraint_count != name_count) ||
+      check_count > 1 << 20) {
+    return X509_V_ERR_UNSPECIFIED;
+  }
+
+  if (X509_NAME_entry_count(nm) > 0) {
+    GENERAL_NAME gntmp;
+    gntmp.type = GEN_DIRNAME;
+    gntmp.d.directoryName = nm;
+
+    r = nc_match(&gntmp, nc);
+
+    if (r != X509_V_OK) {
+      return r;
     }
 
-    if (X509_NAME_entry_count(nm) > 0) {
-        GENERAL_NAME gntmp;
-        gntmp.type = GEN_DIRNAME;
-        gntmp.d.directoryName = nm;
+    gntmp.type = GEN_EMAIL;
 
-        r = nc_match(&gntmp, nc);
+    // Process any email address attributes in subject name
 
-        if (r != X509_V_OK)
-            return r;
+    for (i = -1;;) {
+      i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i);
+      if (i == -1) {
+        break;
+      }
+      const X509_NAME_ENTRY *ne = X509_NAME_get_entry(nm, i);
+      gntmp.d.rfc822Name = X509_NAME_ENTRY_get_data(ne);
+      if (gntmp.d.rfc822Name->type != V_ASN1_IA5STRING) {
+        return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
+      }
 
-        gntmp.type = GEN_EMAIL;
+      r = nc_match(&gntmp, nc);
 
-        /* Process any email address attributes in subject name */
-
-        for (i = -1;;) {
-            X509_NAME_ENTRY *ne;
-            i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i);
-            if (i == -1)
-                break;
-            ne = X509_NAME_get_entry(nm, i);
-            gntmp.d.rfc822Name = X509_NAME_ENTRY_get_data(ne);
-            if (gntmp.d.rfc822Name->type != V_ASN1_IA5STRING)
-                return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
-
-            r = nc_match(&gntmp, nc);
-
-            if (r != X509_V_OK)
-                return r;
-        }
-
+      if (r != X509_V_OK) {
+        return r;
+      }
     }
+  }
 
-    for (j = 0; j < sk_GENERAL_NAME_num(x->altname); j++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, j);
-        r = nc_match(gen, nc);
-        if (r != X509_V_OK)
-            return r;
+  for (j = 0; j < sk_GENERAL_NAME_num(x->altname); j++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, j);
+    r = nc_match(gen, nc);
+    if (r != X509_V_OK) {
+      return r;
     }
+  }
 
-    return X509_V_OK;
-
+  return X509_V_OK;
 }
 
-static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc)
-{
-    GENERAL_SUBTREE *sub;
-    int r, match = 0;
-    size_t i;
+static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) {
+  GENERAL_SUBTREE *sub;
+  int r, match = 0;
+  size_t i;
 
-    /*
-     * Permitted subtrees: if any subtrees exist of matching the type at
-     * least one subtree must match.
-     */
+  // Permitted subtrees: if any subtrees exist of matching the type at
+  // least one subtree must match.
 
-    for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) {
-        sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i);
-        if (gen->type != sub->base->type)
-            continue;
-        if (sub->minimum || sub->maximum)
-            return X509_V_ERR_SUBTREE_MINMAX;
-        /* If we already have a match don't bother trying any more */
-        if (match == 2)
-            continue;
-        if (match == 0)
-            match = 1;
-        r = nc_match_single(gen, sub->base);
-        if (r == X509_V_OK)
-            match = 2;
-        else if (r != X509_V_ERR_PERMITTED_VIOLATION)
-            return r;
+  for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) {
+    sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i);
+    if (gen->type != sub->base->type) {
+      continue;
+    }
+    if (sub->minimum || sub->maximum) {
+      return X509_V_ERR_SUBTREE_MINMAX;
+    }
+    // If we already have a match don't bother trying any more
+    if (match == 2) {
+      continue;
+    }
+    if (match == 0) {
+      match = 1;
+    }
+    r = nc_match_single(gen, sub->base);
+    if (r == X509_V_OK) {
+      match = 2;
+    } else if (r != X509_V_ERR_PERMITTED_VIOLATION) {
+      return r;
+    }
+  }
+
+  if (match == 1) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+
+  // Excluded subtrees: must not match any of these
+
+  for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) {
+    sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i);
+    if (gen->type != sub->base->type) {
+      continue;
+    }
+    if (sub->minimum || sub->maximum) {
+      return X509_V_ERR_SUBTREE_MINMAX;
     }
 
-    if (match == 1)
-        return X509_V_ERR_PERMITTED_VIOLATION;
-
-    /* Excluded subtrees: must not match any of these */
-
-    for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) {
-        sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i);
-        if (gen->type != sub->base->type)
-            continue;
-        if (sub->minimum || sub->maximum)
-            return X509_V_ERR_SUBTREE_MINMAX;
-
-        r = nc_match_single(gen, sub->base);
-        if (r == X509_V_OK)
-            return X509_V_ERR_EXCLUDED_VIOLATION;
-        else if (r != X509_V_ERR_PERMITTED_VIOLATION)
-            return r;
-
+    r = nc_match_single(gen, sub->base);
+    if (r == X509_V_OK) {
+      return X509_V_ERR_EXCLUDED_VIOLATION;
+    } else if (r != X509_V_ERR_PERMITTED_VIOLATION) {
+      return r;
     }
+  }
 
-    return X509_V_OK;
-
+  return X509_V_OK;
 }
 
-static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base)
-{
-    switch (base->type) {
+static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) {
+  switch (base->type) {
     case GEN_DIRNAME:
-        return nc_dn(gen->d.directoryName, base->d.directoryName);
+      return nc_dn(gen->d.directoryName, base->d.directoryName);
 
     case GEN_DNS:
-        return nc_dns(gen->d.dNSName, base->d.dNSName);
+      return nc_dns(gen->d.dNSName, base->d.dNSName);
 
     case GEN_EMAIL:
-        return nc_email(gen->d.rfc822Name, base->d.rfc822Name);
+      return nc_email(gen->d.rfc822Name, base->d.rfc822Name);
 
     case GEN_URI:
-        return nc_uri(gen->d.uniformResourceIdentifier,
-                      base->d.uniformResourceIdentifier);
+      return nc_uri(gen->d.uniformResourceIdentifier,
+                    base->d.uniformResourceIdentifier);
 
     default:
-        return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE;
-    }
-
+      return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE;
+  }
 }
 
-/*
- * directoryName name constraint matching. The canonical encoding of
- * X509_NAME makes this comparison easy. It is matched if the subtree is a
- * subset of the name.
- */
+// directoryName name constraint matching. The canonical encoding of
+// X509_NAME makes this comparison easy. It is matched if the subtree is a
+// subset of the name.
 
-static int nc_dn(X509_NAME *nm, X509_NAME *base)
-{
-    /* Ensure canonical encodings are up to date.  */
-    if (nm->modified && i2d_X509_NAME(nm, NULL) < 0)
-        return X509_V_ERR_OUT_OF_MEM;
-    if (base->modified && i2d_X509_NAME(base, NULL) < 0)
-        return X509_V_ERR_OUT_OF_MEM;
-    if (base->canon_enclen > nm->canon_enclen)
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    if (OPENSSL_memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen))
-        return X509_V_ERR_PERMITTED_VIOLATION;
+static int nc_dn(X509_NAME *nm, X509_NAME *base) {
+  // Ensure canonical encodings are up to date.
+  if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) {
+    return X509_V_ERR_OUT_OF_MEM;
+  }
+  if (base->modified && i2d_X509_NAME(base, NULL) < 0) {
+    return X509_V_ERR_OUT_OF_MEM;
+  }
+  if (base->canon_enclen > nm->canon_enclen) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+  if (OPENSSL_memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+  return X509_V_OK;
+}
+
+static int starts_with(const CBS *cbs, uint8_t c) {
+  return CBS_len(cbs) > 0 && CBS_data(cbs)[0] == c;
+}
+
+static int equal_case(const CBS *a, const CBS *b) {
+  if (CBS_len(a) != CBS_len(b)) {
+    return 0;
+  }
+  // Note we cannot use |OPENSSL_strncasecmp| because that would stop
+  // iterating at NUL.
+  const uint8_t *a_data = CBS_data(a), *b_data = CBS_data(b);
+  for (size_t i = 0; i < CBS_len(a); i++) {
+    if (OPENSSL_tolower(a_data[i]) != OPENSSL_tolower(b_data[i])) {
+      return 0;
+    }
+  }
+  return 1;
+}
+
+static int has_suffix_case(const CBS *a, const CBS *b) {
+  if (CBS_len(a) < CBS_len(b)) {
+    return 0;
+  }
+  CBS copy = *a;
+  CBS_skip(&copy, CBS_len(a) - CBS_len(b));
+  return equal_case(&copy, b);
+}
+
+static int nc_dns(const ASN1_IA5STRING *dns, const ASN1_IA5STRING *base) {
+  CBS dns_cbs, base_cbs;
+  CBS_init(&dns_cbs, dns->data, dns->length);
+  CBS_init(&base_cbs, base->data, base->length);
+
+  // Empty matches everything
+  if (CBS_len(&base_cbs) == 0) {
     return X509_V_OK;
+  }
+
+  // If |base_cbs| begins with a '.', do a simple suffix comparison. This is
+  // not part of RFC5280, but is part of OpenSSL's original behavior.
+  if (starts_with(&base_cbs, '.')) {
+    if (has_suffix_case(&dns_cbs, &base_cbs)) {
+      return X509_V_OK;
+    }
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+
+  // Otherwise can add zero or more components on the left so compare RHS
+  // and if dns is longer and expect '.' as preceding character.
+  if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
+    uint8_t dot;
+    if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
+        !CBS_get_u8(&dns_cbs, &dot) || dot != '.') {
+      return X509_V_ERR_PERMITTED_VIOLATION;
+    }
+  }
+
+  if (!equal_case(&dns_cbs, &base_cbs)) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+
+  return X509_V_OK;
 }
 
-static int starts_with(const CBS *cbs, uint8_t c)
-{
-    return CBS_len(cbs) > 0 && CBS_data(cbs)[0] == c;
+static int nc_email(const ASN1_IA5STRING *eml, const ASN1_IA5STRING *base) {
+  CBS eml_cbs, base_cbs;
+  CBS_init(&eml_cbs, eml->data, eml->length);
+  CBS_init(&base_cbs, base->data, base->length);
+
+  // TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
+  // last one. Match them here, or perhaps do an actual parse. Looks like
+  // multiple '@'s may be allowed in quoted strings.
+  CBS eml_local, base_local;
+  if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
+    return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
+  }
+  int base_has_at = CBS_get_until_first(&base_cbs, &base_local, '@');
+
+  // Special case: initial '.' is RHS match
+  if (!base_has_at && starts_with(&base_cbs, '.')) {
+    if (has_suffix_case(&eml_cbs, &base_cbs)) {
+      return X509_V_OK;
+    }
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+
+  // If we have anything before '@' match local part
+  if (base_has_at) {
+    // TODO(davidben): This interprets a constraint of "@example.com" as
+    // "example.com", which is not part of RFC5280.
+    if (CBS_len(&base_local) > 0) {
+      // Case sensitive match of local part
+      if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
+                         CBS_len(&eml_local))) {
+        return X509_V_ERR_PERMITTED_VIOLATION;
+      }
+    }
+    // Position base after '@'
+    assert(starts_with(&base_cbs, '@'));
+    CBS_skip(&base_cbs, 1);
+  }
+
+  // Just have hostname left to match: case insensitive
+  assert(starts_with(&eml_cbs, '@'));
+  CBS_skip(&eml_cbs, 1);
+  if (!equal_case(&base_cbs, &eml_cbs)) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
+
+  return X509_V_OK;
 }
 
-static int equal_case(const CBS *a, const CBS *b)
-{
-    if (CBS_len(a) != CBS_len(b)) {
-        return 0;
+static int nc_uri(const ASN1_IA5STRING *uri, const ASN1_IA5STRING *base) {
+  CBS uri_cbs, base_cbs;
+  CBS_init(&uri_cbs, uri->data, uri->length);
+  CBS_init(&base_cbs, base->data, base->length);
+
+  // Check for foo:// and skip past it
+  CBS scheme;
+  uint8_t byte;
+  if (!CBS_get_until_first(&uri_cbs, &scheme, ':') ||
+      !CBS_skip(&uri_cbs, 1) ||  // Skip the colon
+      !CBS_get_u8(&uri_cbs, &byte) || byte != '/' ||
+      !CBS_get_u8(&uri_cbs, &byte) || byte != '/') {
+    return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
+  }
+
+  // Look for a port indicator as end of hostname first. Otherwise look for
+  // trailing slash, or the end of the string.
+  // TODO(davidben): This is not a correct URI parser and mishandles IPv6
+  // literals.
+  CBS host;
+  if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
+      !CBS_get_until_first(&uri_cbs, &host, '/')) {
+    host = uri_cbs;
+  }
+
+  if (CBS_len(&host) == 0) {
+    return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
+  }
+
+  // Special case: initial '.' is RHS match
+  if (starts_with(&base_cbs, '.')) {
+    if (has_suffix_case(&host, &base_cbs)) {
+      return X509_V_OK;
     }
-    /* Note we cannot use |OPENSSL_strncasecmp| because that would stop
-     * iterating at NUL. */
-    const uint8_t *a_data = CBS_data(a), *b_data = CBS_data(b);
-    for (size_t i = 0; i < CBS_len(a); i++) {
-        if (OPENSSL_tolower(a_data[i]) != OPENSSL_tolower(b_data[i])) {
-            return 0;
-        }
-    }
-    return 1;
-}
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
 
-static int has_suffix_case(const CBS *a, const CBS *b)
-{
-    if (CBS_len(a) < CBS_len(b)) {
-        return 0;
-    }
-    CBS copy = *a;
-    CBS_skip(&copy, CBS_len(a) - CBS_len(b));
-    return equal_case(&copy, b);
-}
+  if (!equal_case(&base_cbs, &host)) {
+    return X509_V_ERR_PERMITTED_VIOLATION;
+  }
 
-static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base)
-{
-    CBS dns_cbs, base_cbs;
-    CBS_init(&dns_cbs, dns->data, dns->length);
-    CBS_init(&base_cbs, base->data, base->length);
-
-    /* Empty matches everything */
-    if (CBS_len(&base_cbs) == 0) {
-        return X509_V_OK;
-    }
-
-    /* If |base_cbs| begins with a '.', do a simple suffix comparison. This is
-     * not part of RFC5280, but is part of OpenSSL's original behavior. */
-    if (starts_with(&base_cbs, '.')) {
-        if (has_suffix_case(&dns_cbs, &base_cbs)) {
-            return X509_V_OK;
-        }
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    /*
-     * Otherwise can add zero or more components on the left so compare RHS
-     * and if dns is longer and expect '.' as preceding character.
-     */
-    if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
-        uint8_t dot;
-        if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
-            !CBS_get_u8(&dns_cbs, &dot) ||
-            dot != '.') {
-            return X509_V_ERR_PERMITTED_VIOLATION;
-        }
-    }
-
-    if (!equal_case(&dns_cbs, &base_cbs)) {
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    return X509_V_OK;
-
-}
-
-static int nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base)
-{
-    CBS eml_cbs, base_cbs;
-    CBS_init(&eml_cbs, eml->data, eml->length);
-    CBS_init(&base_cbs, base->data, base->length);
-
-    /* TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
-     * last one. Match them here, or perhaps do an actual parse. Looks like
-     * multiple '@'s may be allowed in quoted strings. */
-    CBS eml_local, base_local;
-    if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
-        return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
-    }
-    int base_has_at = CBS_get_until_first(&base_cbs, &base_local, '@');
-
-    /* Special case: inital '.' is RHS match */
-    if (!base_has_at && starts_with(&base_cbs, '.')) {
-        if (has_suffix_case(&eml_cbs, &base_cbs)) {
-            return X509_V_OK;
-        }
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    /* If we have anything before '@' match local part */
-    if (base_has_at) {
-        /* TODO(davidben): This interprets a constraint of "@example.com" as
-         * "example.com", which is not part of RFC5280. */
-        if (CBS_len(&base_local) > 0) {
-            /* Case sensitive match of local part */
-            if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
-                               CBS_len(&eml_local))) {
-                return X509_V_ERR_PERMITTED_VIOLATION;
-            }
-        }
-        /* Position base after '@' */
-        assert(starts_with(&base_cbs, '@'));
-        CBS_skip(&base_cbs, 1);
-    }
-
-    /* Just have hostname left to match: case insensitive */
-    assert(starts_with(&eml_cbs, '@'));
-    CBS_skip(&eml_cbs, 1);
-    if (!equal_case(&base_cbs, &eml_cbs)) {
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    return X509_V_OK;
-}
-
-static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base)
-{
-    CBS uri_cbs, base_cbs;
-    CBS_init(&uri_cbs, uri->data, uri->length);
-    CBS_init(&base_cbs, base->data, base->length);
-
-    /* Check for foo:// and skip past it */
-    CBS scheme;
-    uint8_t byte;
-    if (!CBS_get_until_first(&uri_cbs, &scheme, ':') ||
-        !CBS_skip(&uri_cbs, 1) ||  // Skip the colon
-        !CBS_get_u8(&uri_cbs, &byte) || byte != '/' ||
-        !CBS_get_u8(&uri_cbs, &byte) || byte != '/') {
-        return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
-    }
-
-    /* Look for a port indicator as end of hostname first. Otherwise look for
-     * trailing slash, or the end of the string.
-     * TODO(davidben): This is not a correct URI parser and mishandles IPv6
-     * literals. */
-    CBS host;
-    if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
-        !CBS_get_until_first(&uri_cbs, &host, '/')) {
-        host = uri_cbs;
-    }
-
-    if (CBS_len(&host) == 0) {
-        return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
-    }
-
-    /* Special case: inital '.' is RHS match */
-    if (starts_with(&base_cbs, '.')) {
-        if (has_suffix_case(&host, &base_cbs)) {
-            return X509_V_OK;
-        }
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    if (!equal_case(&base_cbs, &host)) {
-        return X509_V_ERR_PERMITTED_VIOLATION;
-    }
-
-    return X509_V_OK;
-
+  return X509_V_OK;
 }
diff --git a/src/crypto/x509v3/v3_ocsp.c b/src/crypto/x509v3/v3_ocsp.c
index c63646a..b490a11 100644
--- a/src/crypto/x509v3/v3_ocsp.c
+++ b/src/crypto/x509v3/v3_ocsp.c
@@ -13,56 +13,69 @@
 #include <openssl/bio.h>
 #include <openssl/nid.h>
 
-/*
- * OCSP extensions and a couple of CRL entry extensions
- */
+// OCSP extensions and a couple of CRL entry extensions
 
 static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce,
                             BIO *out, int indent);
 
-static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method,
-                            void *nocheck, BIO *out, int indent);
-static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method,
-                              X509V3_CTX *ctx, const char *str);
+static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck,
+                            BIO *out, int indent);
+static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                              const char *str);
 
 const X509V3_EXT_METHOD v3_crl_invdate = {
-    NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME),
-    0, 0, 0, 0,
-    0, 0,
-    0, 0,
-    i2r_ocsp_acutoff, 0,
-    NULL
+    NID_invalidity_date,
+    0,
+    ASN1_ITEM_ref(ASN1_GENERALIZEDTIME),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    i2r_ocsp_acutoff,
+    0,
+    NULL,
 };
 
 const X509V3_EXT_METHOD v3_ocsp_nocheck = {
-    NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL),
-    0, 0, 0, 0,
-    0, s2i_ocsp_nocheck,
-    0, 0,
-    i2r_ocsp_nocheck, 0,
-    NULL
+    NID_id_pkix_OCSP_noCheck,
+    0,
+    ASN1_ITEM_ref(ASN1_NULL),
+    0,
+    0,
+    0,
+    0,
+    0,
+    s2i_ocsp_nocheck,
+    0,
+    0,
+    i2r_ocsp_nocheck,
+    0,
+    NULL,
 };
 
 static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff,
-                            BIO *bp, int ind)
-{
-    if (BIO_printf(bp, "%*s", ind, "") <= 0)
-        return 0;
-    if (!ASN1_GENERALIZEDTIME_print(bp, cutoff))
-        return 0;
-    return 1;
+                            BIO *bp, int ind) {
+  if (BIO_printf(bp, "%*s", ind, "") <= 0) {
+    return 0;
+  }
+  if (!ASN1_GENERALIZEDTIME_print(bp, cutoff)) {
+    return 0;
+  }
+  return 1;
 }
 
-/* Nocheck is just a single NULL. Don't print anything and always set it */
+// Nocheck is just a single NULL. Don't print anything and always set it
 
 static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck,
-                            BIO *out, int indent)
-{
-    return 1;
+                            BIO *out, int indent) {
+  return 1;
 }
 
-static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method,
-                              X509V3_CTX *ctx, const char *str)
-{
-    return ASN1_NULL_new();
+static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                              const char *str) {
+  return ASN1_NULL_new();
 }
diff --git a/src/crypto/x509v3/v3_pci.c b/src/crypto/x509v3/v3_pci.c
index 57b64ef..cafb40c 100644
--- a/src/crypto/x509v3/v3_pci.c
+++ b/src/crypto/x509v3/v3_pci.c
@@ -47,243 +47,241 @@
 #include "internal.h"
 
 
-static int i2r_pci(X509V3_EXT_METHOD *method, PROXY_CERT_INFO_EXTENSION *ext,
-                   BIO *out, int indent);
-static PROXY_CERT_INFO_EXTENSION *r2i_pci(X509V3_EXT_METHOD *method,
-                                          X509V3_CTX *ctx, char *str);
+static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
+                   int indent);
+static void *r2i_pci(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                     const char *str);
 
-const X509V3_EXT_METHOD v3_pci =
-    { NID_proxyCertInfo, 0, ASN1_ITEM_ref(PROXY_CERT_INFO_EXTENSION),
-    0, 0, 0, 0,
-    0, 0,
-    NULL, NULL,
-    (X509V3_EXT_I2R)i2r_pci,
-    (X509V3_EXT_R2I)r2i_pci,
+const X509V3_EXT_METHOD v3_pci = {
+    NID_proxyCertInfo,
+    0,
+    ASN1_ITEM_ref(PROXY_CERT_INFO_EXTENSION),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    NULL,
+    NULL,
+    i2r_pci,
+    r2i_pci,
     NULL,
 };
 
-static int i2r_pci(X509V3_EXT_METHOD *method, PROXY_CERT_INFO_EXTENSION *pci,
-                   BIO *out, int indent)
-{
-    BIO_printf(out, "%*sPath Length Constraint: ", indent, "");
-    if (pci->pcPathLengthConstraint)
-        i2a_ASN1_INTEGER(out, pci->pcPathLengthConstraint);
-    else
-        BIO_printf(out, "infinite");
-    BIO_puts(out, "\n");
-    BIO_printf(out, "%*sPolicy Language: ", indent, "");
-    i2a_ASN1_OBJECT(out, pci->proxyPolicy->policyLanguage);
-    BIO_puts(out, "\n");
-    if (pci->proxyPolicy->policy && pci->proxyPolicy->policy->data)
-        BIO_printf(out, "%*sPolicy Text: %.*s\n", indent, "",
-                   pci->proxyPolicy->policy->length,
-                   pci->proxyPolicy->policy->data);
-    return 1;
+static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
+                   int indent) {
+  const PROXY_CERT_INFO_EXTENSION *pci = ext;
+  BIO_printf(out, "%*sPath Length Constraint: ", indent, "");
+  if (pci->pcPathLengthConstraint) {
+    i2a_ASN1_INTEGER(out, pci->pcPathLengthConstraint);
+  } else {
+    BIO_printf(out, "infinite");
+  }
+  BIO_puts(out, "\n");
+  BIO_printf(out, "%*sPolicy Language: ", indent, "");
+  i2a_ASN1_OBJECT(out, pci->proxyPolicy->policyLanguage);
+  BIO_puts(out, "\n");
+  if (pci->proxyPolicy->policy && pci->proxyPolicy->policy->data) {
+    BIO_printf(out, "%*sPolicy Text: %.*s\n", indent, "",
+               pci->proxyPolicy->policy->length,
+               pci->proxyPolicy->policy->data);
+  }
+  return 1;
 }
 
-static int process_pci_value(CONF_VALUE *val,
-                             ASN1_OBJECT **language, ASN1_INTEGER **pathlen,
-                             ASN1_OCTET_STRING **policy)
-{
-    int free_policy = 0;
+static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language,
+                             ASN1_INTEGER **pathlen,
+                             ASN1_OCTET_STRING **policy) {
+  int free_policy = 0;
 
-    if (strcmp(val->name, "language") == 0) {
-        if (*language) {
-            OPENSSL_PUT_ERROR(X509V3,
-                              X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED);
-            X509V3_conf_err(val);
-            return 0;
-        }
-        if (!(*language = OBJ_txt2obj(val->value, 0))) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-            X509V3_conf_err(val);
-            return 0;
-        }
-    } else if (strcmp(val->name, "pathlen") == 0) {
-        if (*pathlen) {
-            OPENSSL_PUT_ERROR(X509V3,
-                              X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED);
-            X509V3_conf_err(val);
-            return 0;
-        }
-        if (!X509V3_get_value_int(val, pathlen)) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH);
-            X509V3_conf_err(val);
-            return 0;
-        }
-    } else if (strcmp(val->name, "policy") == 0) {
-        unsigned char *tmp_data = NULL;
-        long val_len;
-        if (!*policy) {
-            *policy = ASN1_OCTET_STRING_new();
-            if (!*policy) {
-                OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-                X509V3_conf_err(val);
-                return 0;
-            }
-            free_policy = 1;
-        }
-        if (strncmp(val->value, "hex:", 4) == 0) {
-            unsigned char *tmp_data2 =
-                x509v3_hex_to_bytes(val->value + 4, &val_len);
-
-            if (!tmp_data2) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
-                X509V3_conf_err(val);
-                goto err;
-            }
-
-            tmp_data = OPENSSL_realloc((*policy)->data,
-                                       (*policy)->length + val_len + 1);
-            if (tmp_data) {
-                (*policy)->data = tmp_data;
-                OPENSSL_memcpy(&(*policy)->data[(*policy)->length],
-                       tmp_data2, val_len);
-                (*policy)->length += val_len;
-                (*policy)->data[(*policy)->length] = '\0';
-            } else {
-                OPENSSL_free(tmp_data2);
-                /*
-                 * realloc failure implies the original data space is b0rked
-                 * too!
-                 */
-                (*policy)->data = NULL;
-                (*policy)->length = 0;
-                OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-                X509V3_conf_err(val);
-                goto err;
-            }
-            OPENSSL_free(tmp_data2);
-        } else if (strncmp(val->value, "text:", 5) == 0) {
-            val_len = strlen(val->value + 5);
-            tmp_data = OPENSSL_realloc((*policy)->data,
-                                       (*policy)->length + val_len + 1);
-            if (tmp_data) {
-                (*policy)->data = tmp_data;
-                OPENSSL_memcpy(&(*policy)->data[(*policy)->length],
-                       val->value + 5, val_len);
-                (*policy)->length += val_len;
-                (*policy)->data[(*policy)->length] = '\0';
-            } else {
-                /*
-                 * realloc failure implies the original data space is b0rked
-                 * too!
-                 */
-                (*policy)->data = NULL;
-                (*policy)->length = 0;
-                OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-                X509V3_conf_err(val);
-                goto err;
-            }
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG);
-            X509V3_conf_err(val);
-            goto err;
-        }
-        if (!tmp_data) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            X509V3_conf_err(val);
-            goto err;
-        }
+  if (strcmp(val->name, "language") == 0) {
+    if (*language) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED);
+      X509V3_conf_err(val);
+      return 0;
     }
-    return 1;
- err:
-    if (free_policy) {
-        ASN1_OCTET_STRING_free(*policy);
-        *policy = NULL;
+    if (!(*language = OBJ_txt2obj(val->value, 0))) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+      X509V3_conf_err(val);
+      return 0;
     }
-    return 0;
-}
-
-static PROXY_CERT_INFO_EXTENSION *r2i_pci(X509V3_EXT_METHOD *method,
-                                          X509V3_CTX *ctx, char *value)
-{
-    PROXY_CERT_INFO_EXTENSION *pci = NULL;
-    STACK_OF(CONF_VALUE) *vals;
-    ASN1_OBJECT *language = NULL;
-    ASN1_INTEGER *pathlen = NULL;
-    ASN1_OCTET_STRING *policy = NULL;
-    size_t i, j;
-    int nid;
-
-    vals = X509V3_parse_list(value);
-    for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
-        CONF_VALUE *cnf = sk_CONF_VALUE_value(vals, i);
-        if (!cnf->name || (*cnf->name != '@' && !cnf->value)) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING);
-            X509V3_conf_err(cnf);
-            goto err;
-        }
-        if (*cnf->name == '@') {
-            STACK_OF(CONF_VALUE) *sect;
-            int success_p = 1;
-
-            sect = X509V3_get_section(ctx, cnf->name + 1);
-            if (!sect) {
-                OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-            for (j = 0; success_p && j < sk_CONF_VALUE_num(sect); j++) {
-                success_p =
-                    process_pci_value(sk_CONF_VALUE_value(sect, j),
-                                      &language, &pathlen, &policy);
-            }
-            X509V3_section_free(ctx, sect);
-            if (!success_p)
-                goto err;
-        } else {
-            if (!process_pci_value(cnf, &language, &pathlen, &policy)) {
-                X509V3_conf_err(cnf);
-                goto err;
-            }
-        }
+  } else if (strcmp(val->name, "pathlen") == 0) {
+    if (*pathlen) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED);
+      X509V3_conf_err(val);
+      return 0;
     }
-
-    /* Language is mandatory */
-    if (!language) {
-        OPENSSL_PUT_ERROR(X509V3,
-                          X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED);
-        goto err;
+    if (!X509V3_get_value_int(val, pathlen)) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH);
+      X509V3_conf_err(val);
+      return 0;
     }
-    nid = OBJ_obj2nid(language);
-    if ((nid == NID_Independent || nid == NID_id_ppl_inheritAll) && policy) {
-        OPENSSL_PUT_ERROR(X509V3,
-                          X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY);
-        goto err;
-    }
-
-    pci = PROXY_CERT_INFO_EXTENSION_new();
-    if (!pci) {
+  } else if (strcmp(val->name, "policy") == 0) {
+    unsigned char *tmp_data = NULL;
+    long val_len;
+    if (!*policy) {
+      *policy = ASN1_OCTET_STRING_new();
+      if (!*policy) {
         OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        goto err;
+        X509V3_conf_err(val);
+        return 0;
+      }
+      free_policy = 1;
     }
+    if (strncmp(val->value, "hex:", 4) == 0) {
+      unsigned char *tmp_data2 = x509v3_hex_to_bytes(val->value + 4, &val_len);
 
-    pci->proxyPolicy->policyLanguage = language;
+      if (!tmp_data2) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
+        X509V3_conf_err(val);
+        goto err;
+      }
+
+      tmp_data =
+          OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1);
+      if (tmp_data) {
+        (*policy)->data = tmp_data;
+        OPENSSL_memcpy(&(*policy)->data[(*policy)->length], tmp_data2, val_len);
+        (*policy)->length += val_len;
+        (*policy)->data[(*policy)->length] = '\0';
+      } else {
+        OPENSSL_free(tmp_data2);
+        // realloc failure implies the original data space is b0rked
+        // too!
+        (*policy)->data = NULL;
+        (*policy)->length = 0;
+        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+        X509V3_conf_err(val);
+        goto err;
+      }
+      OPENSSL_free(tmp_data2);
+    } else if (strncmp(val->value, "text:", 5) == 0) {
+      val_len = strlen(val->value + 5);
+      tmp_data =
+          OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1);
+      if (tmp_data) {
+        (*policy)->data = tmp_data;
+        OPENSSL_memcpy(&(*policy)->data[(*policy)->length], val->value + 5,
+                       val_len);
+        (*policy)->length += val_len;
+        (*policy)->data[(*policy)->length] = '\0';
+      } else {
+        // realloc failure implies the original data space is b0rked
+        // too!
+        (*policy)->data = NULL;
+        (*policy)->length = 0;
+        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+        X509V3_conf_err(val);
+        goto err;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG);
+      X509V3_conf_err(val);
+      goto err;
+    }
+    if (!tmp_data) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      X509V3_conf_err(val);
+      goto err;
+    }
+  }
+  return 1;
+err:
+  if (free_policy) {
+    ASN1_OCTET_STRING_free(*policy);
+    *policy = NULL;
+  }
+  return 0;
+}
+
+static void *r2i_pci(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                     const char *value) {
+  PROXY_CERT_INFO_EXTENSION *pci = NULL;
+  STACK_OF(CONF_VALUE) *vals;
+  ASN1_OBJECT *language = NULL;
+  ASN1_INTEGER *pathlen = NULL;
+  ASN1_OCTET_STRING *policy = NULL;
+  size_t i, j;
+  int nid;
+
+  vals = X509V3_parse_list(value);
+  for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
+    CONF_VALUE *cnf = sk_CONF_VALUE_value(vals, i);
+    if (!cnf->name || (*cnf->name != '@' && !cnf->value)) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING);
+      X509V3_conf_err(cnf);
+      goto err;
+    }
+    if (*cnf->name == '@') {
+      STACK_OF(CONF_VALUE) *sect;
+      int success_p = 1;
+
+      sect = X509V3_get_section(ctx, cnf->name + 1);
+      if (!sect) {
+        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+      for (j = 0; success_p && j < sk_CONF_VALUE_num(sect); j++) {
+        success_p = process_pci_value(sk_CONF_VALUE_value(sect, j), &language,
+                                      &pathlen, &policy);
+      }
+      X509V3_section_free(ctx, sect);
+      if (!success_p) {
+        goto err;
+      }
+    } else {
+      if (!process_pci_value(cnf, &language, &pathlen, &policy)) {
+        X509V3_conf_err(cnf);
+        goto err;
+      }
+    }
+  }
+
+  // Language is mandatory
+  if (!language) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED);
+    goto err;
+  }
+  nid = OBJ_obj2nid(language);
+  if ((nid == NID_Independent || nid == NID_id_ppl_inheritAll) && policy) {
+    OPENSSL_PUT_ERROR(X509V3,
+                      X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY);
+    goto err;
+  }
+
+  pci = PROXY_CERT_INFO_EXTENSION_new();
+  if (!pci) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+
+  pci->proxyPolicy->policyLanguage = language;
+  language = NULL;
+  pci->proxyPolicy->policy = policy;
+  policy = NULL;
+  pci->pcPathLengthConstraint = pathlen;
+  pathlen = NULL;
+  goto end;
+err:
+  if (language) {
+    ASN1_OBJECT_free(language);
     language = NULL;
-    pci->proxyPolicy->policy = policy;
-    policy = NULL;
-    pci->pcPathLengthConstraint = pathlen;
+  }
+  if (pathlen) {
+    ASN1_INTEGER_free(pathlen);
     pathlen = NULL;
-    goto end;
- err:
-    if (language) {
-        ASN1_OBJECT_free(language);
-        language = NULL;
-    }
-    if (pathlen) {
-        ASN1_INTEGER_free(pathlen);
-        pathlen = NULL;
-    }
-    if (policy) {
-        ASN1_OCTET_STRING_free(policy);
-        policy = NULL;
-    }
-    if (pci) {
-        PROXY_CERT_INFO_EXTENSION_free(pci);
-        pci = NULL;
-    }
- end:
-    sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
-    return pci;
+  }
+  if (policy) {
+    ASN1_OCTET_STRING_free(policy);
+    policy = NULL;
+  }
+  if (pci) {
+    PROXY_CERT_INFO_EXTENSION_free(pci);
+    pci = NULL;
+  }
+end:
+  sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
+  return pci;
 }
diff --git a/src/crypto/x509v3/v3_pcia.c b/src/crypto/x509v3/v3_pcia.c
index 3f285f3..62893ed 100644
--- a/src/crypto/x509v3/v3_pcia.c
+++ b/src/crypto/x509v3/v3_pcia.c
@@ -40,18 +40,16 @@
 #include <openssl/x509v3.h>
 
 
-ASN1_SEQUENCE(PROXY_POLICY) =
-        {
-        ASN1_SIMPLE(PROXY_POLICY,policyLanguage,ASN1_OBJECT),
-        ASN1_OPT(PROXY_POLICY,policy,ASN1_OCTET_STRING)
+ASN1_SEQUENCE(PROXY_POLICY) = {
+    ASN1_SIMPLE(PROXY_POLICY, policyLanguage, ASN1_OBJECT),
+    ASN1_OPT(PROXY_POLICY, policy, ASN1_OCTET_STRING),
 } ASN1_SEQUENCE_END(PROXY_POLICY)
 
-IMPLEMENT_ASN1_FUNCTIONS(PROXY_POLICY)
+IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_POLICY)
 
-ASN1_SEQUENCE(PROXY_CERT_INFO_EXTENSION) =
-        {
-        ASN1_OPT(PROXY_CERT_INFO_EXTENSION,pcPathLengthConstraint,ASN1_INTEGER),
-        ASN1_SIMPLE(PROXY_CERT_INFO_EXTENSION,proxyPolicy,PROXY_POLICY)
+ASN1_SEQUENCE(PROXY_CERT_INFO_EXTENSION) = {
+    ASN1_OPT(PROXY_CERT_INFO_EXTENSION, pcPathLengthConstraint, ASN1_INTEGER),
+    ASN1_SIMPLE(PROXY_CERT_INFO_EXTENSION, proxyPolicy, PROXY_POLICY),
 } ASN1_SEQUENCE_END(PROXY_CERT_INFO_EXTENSION)
 
-IMPLEMENT_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION)
+IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_CERT_INFO_EXTENSION)
diff --git a/src/crypto/x509v3/v3_pcons.c b/src/crypto/x509v3/v3_pcons.c
index 1a46314..7ed778b 100644
--- a/src/crypto/x509v3/v3_pcons.c
+++ b/src/crypto/x509v3/v3_pcons.c
@@ -65,75 +65,79 @@
 #include <openssl/obj.h>
 #include <openssl/x509v3.h>
 
-static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD
-                                                    *method, void *bcons, STACK_OF(CONF_VALUE)
-                                                    *extlist);
+static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS(
+    const X509V3_EXT_METHOD *method, void *bcons,
+    STACK_OF(CONF_VALUE) *extlist);
 static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method,
                                     X509V3_CTX *ctx,
                                     STACK_OF(CONF_VALUE) *values);
 
 const X509V3_EXT_METHOD v3_policy_constraints = {
-    NID_policy_constraints, 0,
+    NID_policy_constraints,
+    0,
     ASN1_ITEM_ref(POLICY_CONSTRAINTS),
-    0, 0, 0, 0,
-    0, 0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     i2v_POLICY_CONSTRAINTS,
     v2i_POLICY_CONSTRAINTS,
-    NULL, NULL,
-    NULL
-};
+    NULL,
+    NULL,
+    NULL};
 
 ASN1_SEQUENCE(POLICY_CONSTRAINTS) = {
-        ASN1_IMP_OPT(POLICY_CONSTRAINTS, requireExplicitPolicy, ASN1_INTEGER,0),
-        ASN1_IMP_OPT(POLICY_CONSTRAINTS, inhibitPolicyMapping, ASN1_INTEGER,1)
+    ASN1_IMP_OPT(POLICY_CONSTRAINTS, requireExplicitPolicy, ASN1_INTEGER, 0),
+    ASN1_IMP_OPT(POLICY_CONSTRAINTS, inhibitPolicyMapping, ASN1_INTEGER, 1),
 } ASN1_SEQUENCE_END(POLICY_CONSTRAINTS)
 
 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS)
 
-static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD
-                                                    *method, void *a, STACK_OF(CONF_VALUE)
-                                                    *extlist)
-{
-    POLICY_CONSTRAINTS *pcons = a;
-    X509V3_add_value_int("Require Explicit Policy",
-                         pcons->requireExplicitPolicy, &extlist);
-    X509V3_add_value_int("Inhibit Policy Mapping",
-                         pcons->inhibitPolicyMapping, &extlist);
-    return extlist;
+static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS(
+    const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *extlist) {
+  POLICY_CONSTRAINTS *pcons = a;
+  X509V3_add_value_int("Require Explicit Policy", pcons->requireExplicitPolicy,
+                       &extlist);
+  X509V3_add_value_int("Inhibit Policy Mapping", pcons->inhibitPolicyMapping,
+                       &extlist);
+  return extlist;
 }
 
 static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method,
                                     X509V3_CTX *ctx,
-                                    STACK_OF(CONF_VALUE) *values)
-{
-    POLICY_CONSTRAINTS *pcons = NULL;
-    CONF_VALUE *val;
-    size_t i;
-    if (!(pcons = POLICY_CONSTRAINTS_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
-        val = sk_CONF_VALUE_value(values, i);
-        if (!strcmp(val->name, "requireExplicitPolicy")) {
-            if (!X509V3_get_value_int(val, &pcons->requireExplicitPolicy))
-                goto err;
-        } else if (!strcmp(val->name, "inhibitPolicyMapping")) {
-            if (!X509V3_get_value_int(val, &pcons->inhibitPolicyMapping))
-                goto err;
-        } else {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
-            X509V3_conf_err(val);
-            goto err;
-        }
-    }
-    if (!pcons->inhibitPolicyMapping && !pcons->requireExplicitPolicy) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_EMPTY_EXTENSION);
-        goto err;
-    }
-
-    return pcons;
- err:
-    POLICY_CONSTRAINTS_free(pcons);
+                                    STACK_OF(CONF_VALUE) *values) {
+  POLICY_CONSTRAINTS *pcons = NULL;
+  CONF_VALUE *val;
+  size_t i;
+  if (!(pcons = POLICY_CONSTRAINTS_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     return NULL;
+  }
+  for (i = 0; i < sk_CONF_VALUE_num(values); i++) {
+    val = sk_CONF_VALUE_value(values, i);
+    if (!strcmp(val->name, "requireExplicitPolicy")) {
+      if (!X509V3_get_value_int(val, &pcons->requireExplicitPolicy)) {
+        goto err;
+      }
+    } else if (!strcmp(val->name, "inhibitPolicyMapping")) {
+      if (!X509V3_get_value_int(val, &pcons->inhibitPolicyMapping)) {
+        goto err;
+      }
+    } else {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NAME);
+      X509V3_conf_err(val);
+      goto err;
+    }
+  }
+  if (!pcons->inhibitPolicyMapping && !pcons->requireExplicitPolicy) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_EMPTY_EXTENSION);
+    goto err;
+  }
+
+  return pcons;
+err:
+  POLICY_CONSTRAINTS_free(pcons);
+  return NULL;
 }
diff --git a/src/crypto/x509v3/v3_pmaps.c b/src/crypto/x509v3/v3_pmaps.c
index caacdb2..02f9716 100644
--- a/src/crypto/x509v3/v3_pmaps.c
+++ b/src/crypto/x509v3/v3_pmaps.c
@@ -65,90 +65,91 @@
 
 static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method,
                                  X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
-static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(const X509V3_EXT_METHOD
-                                                 *method, void *pmps, STACK_OF(CONF_VALUE)
-                                                 *extlist);
+static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(
+    const X509V3_EXT_METHOD *method, void *pmps, STACK_OF(CONF_VALUE) *extlist);
 
 const X509V3_EXT_METHOD v3_policy_mappings = {
-    NID_policy_mappings, 0,
+    NID_policy_mappings,
+    0,
     ASN1_ITEM_ref(POLICY_MAPPINGS),
-    0, 0, 0, 0,
-    0, 0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
     i2v_POLICY_MAPPINGS,
     v2i_POLICY_MAPPINGS,
-    0, 0,
-    NULL
+    0,
+    0,
+    NULL,
 };
 
 ASN1_SEQUENCE(POLICY_MAPPING) = {
-        ASN1_SIMPLE(POLICY_MAPPING, issuerDomainPolicy, ASN1_OBJECT),
-        ASN1_SIMPLE(POLICY_MAPPING, subjectDomainPolicy, ASN1_OBJECT)
+    ASN1_SIMPLE(POLICY_MAPPING, issuerDomainPolicy, ASN1_OBJECT),
+    ASN1_SIMPLE(POLICY_MAPPING, subjectDomainPolicy, ASN1_OBJECT),
 } ASN1_SEQUENCE_END(POLICY_MAPPING)
 
-ASN1_ITEM_TEMPLATE(POLICY_MAPPINGS) =
-        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, POLICY_MAPPINGS,
-                                                                POLICY_MAPPING)
+ASN1_ITEM_TEMPLATE(POLICY_MAPPINGS) = ASN1_EX_TEMPLATE_TYPE(
+    ASN1_TFLG_SEQUENCE_OF, 0, POLICY_MAPPINGS, POLICY_MAPPING)
 ASN1_ITEM_TEMPLATE_END(POLICY_MAPPINGS)
 
 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING)
 
-static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(const X509V3_EXT_METHOD
-                                                 *method, void *a, STACK_OF(CONF_VALUE)
-                                                 *ext_list)
-{
-    POLICY_MAPPINGS *pmaps = a;
-    POLICY_MAPPING *pmap;
-    size_t i;
-    char obj_tmp1[80];
-    char obj_tmp2[80];
-    for (i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) {
-        pmap = sk_POLICY_MAPPING_value(pmaps, i);
-        i2t_ASN1_OBJECT(obj_tmp1, 80, pmap->issuerDomainPolicy);
-        i2t_ASN1_OBJECT(obj_tmp2, 80, pmap->subjectDomainPolicy);
-        X509V3_add_value(obj_tmp1, obj_tmp2, &ext_list);
-    }
-    return ext_list;
+static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(
+    const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *ext_list) {
+  POLICY_MAPPINGS *pmaps = a;
+  POLICY_MAPPING *pmap;
+  size_t i;
+  char obj_tmp1[80];
+  char obj_tmp2[80];
+  for (i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) {
+    pmap = sk_POLICY_MAPPING_value(pmaps, i);
+    i2t_ASN1_OBJECT(obj_tmp1, 80, pmap->issuerDomainPolicy);
+    i2t_ASN1_OBJECT(obj_tmp2, 80, pmap->subjectDomainPolicy);
+    X509V3_add_value(obj_tmp1, obj_tmp2, &ext_list);
+  }
+  return ext_list;
 }
 
 static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method,
-                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
-{
-    POLICY_MAPPINGS *pmaps;
-    POLICY_MAPPING *pmap;
-    ASN1_OBJECT *obj1, *obj2;
-    CONF_VALUE *val;
-    size_t i;
+                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) {
+  POLICY_MAPPINGS *pmaps;
+  POLICY_MAPPING *pmap;
+  ASN1_OBJECT *obj1, *obj2;
+  CONF_VALUE *val;
+  size_t i;
 
-    if (!(pmaps = sk_POLICY_MAPPING_new_null())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
+  if (!(pmaps = sk_POLICY_MAPPING_new_null())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
 
-    for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
-        val = sk_CONF_VALUE_value(nval, i);
-        if (!val->value || !val->name) {
-            sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-            X509V3_conf_err(val);
-            return NULL;
-        }
-        obj1 = OBJ_txt2obj(val->name, 0);
-        obj2 = OBJ_txt2obj(val->value, 0);
-        if (!obj1 || !obj2) {
-            sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
-            X509V3_conf_err(val);
-            return NULL;
-        }
-        pmap = POLICY_MAPPING_new();
-        if (!pmap) {
-            sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            return NULL;
-        }
-        pmap->issuerDomainPolicy = obj1;
-        pmap->subjectDomainPolicy = obj2;
-        sk_POLICY_MAPPING_push(pmaps, pmap);
+  for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
+    val = sk_CONF_VALUE_value(nval, i);
+    if (!val->value || !val->name) {
+      sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+      X509V3_conf_err(val);
+      return NULL;
     }
-    return pmaps;
+    obj1 = OBJ_txt2obj(val->name, 0);
+    obj2 = OBJ_txt2obj(val->value, 0);
+    if (!obj1 || !obj2) {
+      sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
+      X509V3_conf_err(val);
+      return NULL;
+    }
+    pmap = POLICY_MAPPING_new();
+    if (!pmap) {
+      sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free);
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      return NULL;
+    }
+    pmap->issuerDomainPolicy = obj1;
+    pmap->subjectDomainPolicy = obj2;
+    sk_POLICY_MAPPING_push(pmaps, pmap);
+  }
+  return pmaps;
 }
diff --git a/src/crypto/x509v3/v3_prn.c b/src/crypto/x509v3/v3_prn.c
index ee4c482..20d2ad9 100644
--- a/src/crypto/x509v3/v3_prn.c
+++ b/src/crypto/x509v3/v3_prn.c
@@ -55,7 +55,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* X509 v3 extension utilities */
+// X509 v3 extension utilities
 
 #include <stdio.h>
 
@@ -64,167 +64,175 @@
 #include <openssl/mem.h>
 #include <openssl/x509v3.h>
 
-/* Extension printing routines */
+// Extension printing routines
 
-static int unknown_ext_print(BIO *out, X509_EXTENSION *ext,
+static int unknown_ext_print(BIO *out, const X509_EXTENSION *ext,
                              unsigned long flag, int indent, int supported);
 
-/* Print out a name+value stack */
+// Print out a name+value stack
 
-void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent,
-                        int ml)
-{
-    size_t i;
-    CONF_VALUE *nval;
-    if (!val)
-        return;
-    if (!ml || !sk_CONF_VALUE_num(val)) {
-        BIO_printf(out, "%*s", indent, "");
-        if (!sk_CONF_VALUE_num(val))
-            BIO_puts(out, "<EMPTY>\n");
+void X509V3_EXT_val_prn(BIO *out, const STACK_OF(CONF_VALUE) *val, int indent,
+                        int ml) {
+  if (!val) {
+    return;
+  }
+  if (!ml || !sk_CONF_VALUE_num(val)) {
+    BIO_printf(out, "%*s", indent, "");
+    if (!sk_CONF_VALUE_num(val)) {
+      BIO_puts(out, "<EMPTY>\n");
     }
-    for (i = 0; i < sk_CONF_VALUE_num(val); i++) {
-        if (ml)
-            BIO_printf(out, "%*s", indent, "");
-        else if (i > 0)
-            BIO_printf(out, ", ");
-        nval = sk_CONF_VALUE_value(val, i);
-        if (!nval->name)
-            BIO_puts(out, nval->value);
-        else if (!nval->value)
-            BIO_puts(out, nval->name);
-        else
-            BIO_printf(out, "%s:%s", nval->name, nval->value);
-        if (ml)
-            BIO_puts(out, "\n");
+  }
+  for (size_t i = 0; i < sk_CONF_VALUE_num(val); i++) {
+    if (ml) {
+      BIO_printf(out, "%*s", indent, "");
+    } else if (i > 0) {
+      BIO_printf(out, ", ");
     }
+    const CONF_VALUE *nval = sk_CONF_VALUE_value(val, i);
+    if (!nval->name) {
+      BIO_puts(out, nval->value);
+    } else if (!nval->value) {
+      BIO_puts(out, nval->name);
+    } else {
+      BIO_printf(out, "%s:%s", nval->name, nval->value);
+    }
+    if (ml) {
+      BIO_puts(out, "\n");
+    }
+  }
 }
 
-/* Main routine: print out a general extension */
+// Main routine: print out a general extension
 
-int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag,
-                     int indent)
-{
-    void *ext_str = NULL;
-    char *value = NULL;
-    const X509V3_EXT_METHOD *method;
-    STACK_OF(CONF_VALUE) *nval = NULL;
-    int ok = 1;
+int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, unsigned long flag,
+                     int indent) {
+  void *ext_str = NULL;
+  char *value = NULL;
+  const X509V3_EXT_METHOD *method;
+  STACK_OF(CONF_VALUE) *nval = NULL;
+  int ok = 1;
 
-    if (!(method = X509V3_EXT_get(ext)))
-        return unknown_ext_print(out, ext, flag, indent, 0);
-    const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext);
-    const unsigned char *p = ASN1_STRING_get0_data(ext_data);
-    if (method->it) {
-        ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data),
-                                ASN1_ITEM_ptr(method->it));
-    } else {
-        ext_str = method->d2i(NULL, &p, ASN1_STRING_length(ext_data));
+  if (!(method = X509V3_EXT_get(ext))) {
+    return unknown_ext_print(out, ext, flag, indent, 0);
+  }
+  const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext);
+  const unsigned char *p = ASN1_STRING_get0_data(ext_data);
+  if (method->it) {
+    ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data),
+                            ASN1_ITEM_ptr(method->it));
+  } else {
+    ext_str = method->d2i(NULL, &p, ASN1_STRING_length(ext_data));
+  }
+
+  if (!ext_str) {
+    return unknown_ext_print(out, ext, flag, indent, 1);
+  }
+
+  if (method->i2s) {
+    if (!(value = method->i2s(method, ext_str))) {
+      ok = 0;
+      goto err;
     }
+    BIO_printf(out, "%*s%s", indent, "", value);
+  } else if (method->i2v) {
+    if (!(nval = method->i2v(method, ext_str, NULL))) {
+      ok = 0;
+      goto err;
+    }
+    X509V3_EXT_val_prn(out, nval, indent,
+                       method->ext_flags & X509V3_EXT_MULTILINE);
+  } else if (method->i2r) {
+    if (!method->i2r(method, ext_str, out, indent)) {
+      ok = 0;
+    }
+  } else {
+    ok = 0;
+  }
 
-    if (!ext_str)
-        return unknown_ext_print(out, ext, flag, indent, 1);
-
-    if (method->i2s) {
-        if (!(value = method->i2s(method, ext_str))) {
-            ok = 0;
-            goto err;
-        }
-        BIO_printf(out, "%*s%s", indent, "", value);
-    } else if (method->i2v) {
-        if (!(nval = method->i2v(method, ext_str, NULL))) {
-            ok = 0;
-            goto err;
-        }
-        X509V3_EXT_val_prn(out, nval, indent,
-                           method->ext_flags & X509V3_EXT_MULTILINE);
-    } else if (method->i2r) {
-        if (!method->i2r(method, ext_str, out, indent))
-            ok = 0;
-    } else
-        ok = 0;
-
- err:
-    sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
-    if (value)
-        OPENSSL_free(value);
-    if (method->it)
-        ASN1_item_free(ext_str, ASN1_ITEM_ptr(method->it));
-    else
-        method->ext_free(ext_str);
-    return ok;
+err:
+  sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
+  if (value) {
+    OPENSSL_free(value);
+  }
+  if (method->it) {
+    ASN1_item_free(ext_str, ASN1_ITEM_ptr(method->it));
+  } else {
+    method->ext_free(ext_str);
+  }
+  return ok;
 }
 
 int X509V3_extensions_print(BIO *bp, const char *title,
                             const STACK_OF(X509_EXTENSION) *exts,
-                            unsigned long flag, int indent)
-{
-    size_t i;
-    int j;
+                            unsigned long flag, int indent) {
+  size_t i;
+  int j;
 
-    if (sk_X509_EXTENSION_num(exts) <= 0)
-        return 1;
-
-    if (title) {
-        BIO_printf(bp, "%*s%s:\n", indent, "", title);
-        indent += 4;
-    }
-
-    for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
-        ASN1_OBJECT *obj;
-        X509_EXTENSION *ex;
-        ex = sk_X509_EXTENSION_value(exts, i);
-        if (indent && BIO_printf(bp, "%*s", indent, "") <= 0)
-            return 0;
-        obj = X509_EXTENSION_get_object(ex);
-        i2a_ASN1_OBJECT(bp, obj);
-        j = X509_EXTENSION_get_critical(ex);
-        if (BIO_printf(bp, ": %s\n", j ? "critical" : "") <= 0)
-            return 0;
-        if (!X509V3_EXT_print(bp, ex, flag, indent + 4)) {
-            BIO_printf(bp, "%*s", indent + 4, "");
-            ASN1_STRING_print(bp, X509_EXTENSION_get_data(ex));
-        }
-        if (BIO_write(bp, "\n", 1) <= 0)
-            return 0;
-    }
+  if (sk_X509_EXTENSION_num(exts) <= 0) {
     return 1;
+  }
+
+  if (title) {
+    BIO_printf(bp, "%*s%s:\n", indent, "", title);
+    indent += 4;
+  }
+
+  for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
+    const X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i);
+    if (indent && BIO_printf(bp, "%*s", indent, "") <= 0) {
+      return 0;
+    }
+    const ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex);
+    i2a_ASN1_OBJECT(bp, obj);
+    j = X509_EXTENSION_get_critical(ex);
+    if (BIO_printf(bp, ": %s\n", j ? "critical" : "") <= 0) {
+      return 0;
+    }
+    if (!X509V3_EXT_print(bp, ex, flag, indent + 4)) {
+      BIO_printf(bp, "%*s", indent + 4, "");
+      ASN1_STRING_print(bp, X509_EXTENSION_get_data(ex));
+    }
+    if (BIO_write(bp, "\n", 1) <= 0) {
+      return 0;
+    }
+  }
+  return 1;
 }
 
-static int unknown_ext_print(BIO *out, X509_EXTENSION *ext,
-                             unsigned long flag, int indent, int supported)
-{
-    switch (flag & X509V3_EXT_UNKNOWN_MASK) {
-
+static int unknown_ext_print(BIO *out, const X509_EXTENSION *ext,
+                             unsigned long flag, int indent, int supported) {
+  switch (flag & X509V3_EXT_UNKNOWN_MASK) {
     case X509V3_EXT_DEFAULT:
-        return 0;
+      return 0;
 
     case X509V3_EXT_ERROR_UNKNOWN:
-        if (supported)
-            BIO_printf(out, "%*s<Parse Error>", indent, "");
-        else
-            BIO_printf(out, "%*s<Not Supported>", indent, "");
-        return 1;
+      if (supported) {
+        BIO_printf(out, "%*s<Parse Error>", indent, "");
+      } else {
+        BIO_printf(out, "%*s<Not Supported>", indent, "");
+      }
+      return 1;
 
     case X509V3_EXT_PARSE_UNKNOWN:
     case X509V3_EXT_DUMP_UNKNOWN: {
-        const ASN1_STRING *data = X509_EXTENSION_get_data(ext);
-        return BIO_hexdump(out, ASN1_STRING_get0_data(data),
-                           ASN1_STRING_length(data), indent);
+      const ASN1_STRING *data = X509_EXTENSION_get_data(ext);
+      return BIO_hexdump(out, ASN1_STRING_get0_data(data),
+                         ASN1_STRING_length(data), indent);
     }
 
     default:
-        return 1;
-    }
+      return 1;
+  }
 }
 
-int X509V3_EXT_print_fp(FILE *fp, X509_EXTENSION *ext, int flag, int indent)
-{
-    BIO *bio_tmp;
-    int ret;
-    if (!(bio_tmp = BIO_new_fp(fp, BIO_NOCLOSE)))
-        return 0;
-    ret = X509V3_EXT_print(bio_tmp, ext, flag, indent);
-    BIO_free(bio_tmp);
-    return ret;
+int X509V3_EXT_print_fp(FILE *fp, const X509_EXTENSION *ext, int flag,
+                        int indent) {
+  BIO *bio_tmp;
+  int ret;
+  if (!(bio_tmp = BIO_new_fp(fp, BIO_NOCLOSE))) {
+    return 0;
+  }
+  ret = X509V3_EXT_print(bio_tmp, ext, flag, indent);
+  BIO_free(bio_tmp);
+  return ret;
 }
diff --git a/src/crypto/x509v3/v3_purp.c b/src/crypto/x509v3/v3_purp.c
index 133839a..00c0571 100644
--- a/src/crypto/x509v3/v3_purp.c
+++ b/src/crypto/x509v3/v3_purp.c
@@ -59,8 +59,8 @@
 
 #include <string.h>
 
-#include <openssl/err.h>
 #include <openssl/digest.h>
+#include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/obj.h>
 #include <openssl/thread.h>
@@ -70,13 +70,13 @@
 #include "../x509/internal.h"
 #include "internal.h"
 
-#define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
+#define V1_ROOT (EXFLAG_V1 | EXFLAG_SS)
 #define ku_reject(x, usage) \
-        (((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
+  (((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
 #define xku_reject(x, usage) \
-        (((x)->ex_flags & EXFLAG_XKUSAGE) && !((x)->ex_xkusage & (usage)))
+  (((x)->ex_flags & EXFLAG_XKUSAGE) && !((x)->ex_xkusage & (usage)))
 #define ns_reject(x, usage) \
-        (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage)))
+  (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage)))
 
 static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x,
                                     int ca);
@@ -101,11 +101,9 @@
 
 static X509_PURPOSE xstandard[] = {
     {X509_PURPOSE_SSL_CLIENT, X509_TRUST_SSL_CLIENT, 0,
-     check_purpose_ssl_client, (char *)"SSL client", (char *)"sslclient",
-     NULL},
+     check_purpose_ssl_client, (char *)"SSL client", (char *)"sslclient", NULL},
     {X509_PURPOSE_SSL_SERVER, X509_TRUST_SSL_SERVER, 0,
-     check_purpose_ssl_server, (char *)"SSL server", (char *)"sslserver",
-     NULL},
+     check_purpose_ssl_server, (char *)"SSL server", (char *)"sslserver", NULL},
     {X509_PURPOSE_NS_SSL_SERVER, X509_TRUST_SSL_SERVER, 0,
      check_purpose_ns_ssl_server, (char *)"Netscape SSL server",
      (char *)"nssslserver", NULL},
@@ -125,805 +123,792 @@
      (char *)"timestampsign", NULL},
 };
 
-#define X509_PURPOSE_COUNT (sizeof(xstandard)/sizeof(X509_PURPOSE))
+#define X509_PURPOSE_COUNT (sizeof(xstandard) / sizeof(X509_PURPOSE))
 
 static STACK_OF(X509_PURPOSE) *xptable = NULL;
 
-static int xp_cmp(const X509_PURPOSE **a, const X509_PURPOSE **b)
-{
-    return (*a)->purpose - (*b)->purpose;
+static int xp_cmp(const X509_PURPOSE **a, const X509_PURPOSE **b) {
+  return (*a)->purpose - (*b)->purpose;
 }
 
-/*
- * As much as I'd like to make X509_check_purpose use a "const" X509* I
- * really can't because it does recalculate hashes and do other non-const
- * things.
- */
-int X509_check_purpose(X509 *x, int id, int ca)
-{
-    int idx;
-    const X509_PURPOSE *pt;
-    if (!x509v3_cache_extensions(x)) {
-        return -1;
-    }
-
-    if (id == -1)
-        return 1;
-    idx = X509_PURPOSE_get_by_id(id);
-    if (idx == -1)
-        return -1;
-    pt = X509_PURPOSE_get0(idx);
-    return pt->check_purpose(pt, x, ca);
-}
-
-int X509_PURPOSE_set(int *p, int purpose)
-{
-    if (X509_PURPOSE_get_by_id(purpose) == -1) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PURPOSE);
-        return 0;
-    }
-    *p = purpose;
-    return 1;
-}
-
-int X509_PURPOSE_get_count(void)
-{
-    if (!xptable)
-        return X509_PURPOSE_COUNT;
-    return sk_X509_PURPOSE_num(xptable) + X509_PURPOSE_COUNT;
-}
-
-X509_PURPOSE *X509_PURPOSE_get0(int idx)
-{
-    if (idx < 0)
-        return NULL;
-    if (idx < (int)X509_PURPOSE_COUNT)
-        return xstandard + idx;
-    return sk_X509_PURPOSE_value(xptable, idx - X509_PURPOSE_COUNT);
-}
-
-int X509_PURPOSE_get_by_sname(char *sname)
-{
-    int i;
-    X509_PURPOSE *xptmp;
-    for (i = 0; i < X509_PURPOSE_get_count(); i++) {
-        xptmp = X509_PURPOSE_get0(i);
-        if (!strcmp(xptmp->sname, sname))
-            return i;
-    }
+// As much as I'd like to make X509_check_purpose use a "const" X509* I
+// really can't because it does recalculate hashes and do other non-const
+// things.
+int X509_check_purpose(X509 *x, int id, int ca) {
+  int idx;
+  const X509_PURPOSE *pt;
+  if (!x509v3_cache_extensions(x)) {
     return -1;
+  }
+
+  if (id == -1) {
+    return 1;
+  }
+  idx = X509_PURPOSE_get_by_id(id);
+  if (idx == -1) {
+    return -1;
+  }
+  pt = X509_PURPOSE_get0(idx);
+  return pt->check_purpose(pt, x, ca);
 }
 
-int X509_PURPOSE_get_by_id(int purpose)
-{
-    X509_PURPOSE tmp;
-    size_t idx;
+int X509_PURPOSE_set(int *p, int purpose) {
+  if (X509_PURPOSE_get_by_id(purpose) == -1) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PURPOSE);
+    return 0;
+  }
+  *p = purpose;
+  return 1;
+}
 
-    if ((purpose >= X509_PURPOSE_MIN) && (purpose <= X509_PURPOSE_MAX))
-        return purpose - X509_PURPOSE_MIN;
-    tmp.purpose = purpose;
-    if (!xptable)
-        return -1;
+int X509_PURPOSE_get_count(void) {
+  if (!xptable) {
+    return X509_PURPOSE_COUNT;
+  }
+  return sk_X509_PURPOSE_num(xptable) + X509_PURPOSE_COUNT;
+}
 
-    sk_X509_PURPOSE_sort(xptable);
-    if (!sk_X509_PURPOSE_find(xptable, &idx, &tmp))
-        return -1;
-    return idx + X509_PURPOSE_COUNT;
+X509_PURPOSE *X509_PURPOSE_get0(int idx) {
+  if (idx < 0) {
+    return NULL;
+  }
+  if (idx < (int)X509_PURPOSE_COUNT) {
+    return xstandard + idx;
+  }
+  return sk_X509_PURPOSE_value(xptable, idx - X509_PURPOSE_COUNT);
+}
+
+int X509_PURPOSE_get_by_sname(char *sname) {
+  int i;
+  X509_PURPOSE *xptmp;
+  for (i = 0; i < X509_PURPOSE_get_count(); i++) {
+    xptmp = X509_PURPOSE_get0(i);
+    if (!strcmp(xptmp->sname, sname)) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+int X509_PURPOSE_get_by_id(int purpose) {
+  X509_PURPOSE tmp;
+  size_t idx;
+
+  if ((purpose >= X509_PURPOSE_MIN) && (purpose <= X509_PURPOSE_MAX)) {
+    return purpose - X509_PURPOSE_MIN;
+  }
+  tmp.purpose = purpose;
+  if (!xptable) {
+    return -1;
+  }
+
+  sk_X509_PURPOSE_sort(xptable);
+  if (!sk_X509_PURPOSE_find(xptable, &idx, &tmp)) {
+    return -1;
+  }
+  return idx + X509_PURPOSE_COUNT;
 }
 
 int X509_PURPOSE_add(int id, int trust, int flags,
-                     int (*ck) (const X509_PURPOSE *, const X509 *, int),
-                     char *name, char *sname, void *arg)
-{
-    int idx;
-    X509_PURPOSE *ptmp;
-    char *name_dup, *sname_dup;
+                     int (*ck)(const X509_PURPOSE *, const X509 *, int),
+                     char *name, char *sname, void *arg) {
+  int idx;
+  X509_PURPOSE *ptmp;
+  char *name_dup, *sname_dup;
 
-    /*
-     * This is set according to what we change: application can't set it
-     */
-    flags &= ~X509_PURPOSE_DYNAMIC;
-    /* This will always be set for application modified trust entries */
-    flags |= X509_PURPOSE_DYNAMIC_NAME;
-    /* Get existing entry if any */
-    idx = X509_PURPOSE_get_by_id(id);
-    /* Need a new entry */
+  // This is set according to what we change: application can't set it
+  flags &= ~X509_PURPOSE_DYNAMIC;
+  // This will always be set for application modified trust entries
+  flags |= X509_PURPOSE_DYNAMIC_NAME;
+  // Get existing entry if any
+  idx = X509_PURPOSE_get_by_id(id);
+  // Need a new entry
+  if (idx == -1) {
+    if (!(ptmp = OPENSSL_malloc(sizeof(X509_PURPOSE)))) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+    ptmp->flags = X509_PURPOSE_DYNAMIC;
+  } else {
+    ptmp = X509_PURPOSE_get0(idx);
+  }
+
+  // Duplicate the supplied names.
+  name_dup = OPENSSL_strdup(name);
+  sname_dup = OPENSSL_strdup(sname);
+  if (name_dup == NULL || sname_dup == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    if (name_dup != NULL) {
+      OPENSSL_free(name_dup);
+    }
+    if (sname_dup != NULL) {
+      OPENSSL_free(sname_dup);
+    }
     if (idx == -1) {
-        if (!(ptmp = OPENSSL_malloc(sizeof(X509_PURPOSE)))) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            return 0;
-        }
-        ptmp->flags = X509_PURPOSE_DYNAMIC;
-    } else
-        ptmp = X509_PURPOSE_get0(idx);
-
-    /* Duplicate the supplied names. */
-    name_dup = OPENSSL_strdup(name);
-    sname_dup = OPENSSL_strdup(sname);
-    if (name_dup == NULL || sname_dup == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        if (name_dup != NULL)
-            OPENSSL_free(name_dup);
-        if (sname_dup != NULL)
-            OPENSSL_free(sname_dup);
-        if (idx == -1)
-            OPENSSL_free(ptmp);
-        return 0;
+      OPENSSL_free(ptmp);
     }
-
-    /* OPENSSL_free existing name if dynamic */
-    if (ptmp->flags & X509_PURPOSE_DYNAMIC_NAME) {
-        OPENSSL_free(ptmp->name);
-        OPENSSL_free(ptmp->sname);
-    }
-    /* dup supplied name */
-    ptmp->name = name_dup;
-    ptmp->sname = sname_dup;
-    /* Keep the dynamic flag of existing entry */
-    ptmp->flags &= X509_PURPOSE_DYNAMIC;
-    /* Set all other flags */
-    ptmp->flags |= flags;
-
-    ptmp->purpose = id;
-    ptmp->trust = trust;
-    ptmp->check_purpose = ck;
-    ptmp->usr_data = arg;
-
-    /* If its a new entry manage the dynamic table */
-    if (idx == -1) {
-        if (!xptable && !(xptable = sk_X509_PURPOSE_new(xp_cmp))) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            xptable_free(ptmp);
-            return 0;
-        }
-        if (!sk_X509_PURPOSE_push(xptable, ptmp)) {
-            OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-            xptable_free(ptmp);
-            return 0;
-        }
-    }
-    return 1;
-}
-
-static void xptable_free(X509_PURPOSE *p)
-{
-    if (!p)
-        return;
-    if (p->flags & X509_PURPOSE_DYNAMIC) {
-        if (p->flags & X509_PURPOSE_DYNAMIC_NAME) {
-            OPENSSL_free(p->name);
-            OPENSSL_free(p->sname);
-        }
-        OPENSSL_free(p);
-    }
-}
-
-void X509_PURPOSE_cleanup(void)
-{
-    unsigned int i;
-    sk_X509_PURPOSE_pop_free(xptable, xptable_free);
-    for (i = 0; i < X509_PURPOSE_COUNT; i++)
-        xptable_free(xstandard + i);
-    xptable = NULL;
-}
-
-int X509_PURPOSE_get_id(const X509_PURPOSE *xp)
-{
-    return xp->purpose;
-}
-
-char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp)
-{
-    return xp->name;
-}
-
-char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp)
-{
-    return xp->sname;
-}
-
-int X509_PURPOSE_get_trust(const X509_PURPOSE *xp)
-{
-    return xp->trust;
-}
-
-static int nid_cmp(const void *void_a, const void *void_b)
-{
-    const int *a = void_a, *b = void_b;
-
-    return *a - *b;
-}
-
-int X509_supported_extension(X509_EXTENSION *ex)
-{
-    /*
-     * This table is a list of the NIDs of supported extensions: that is
-     * those which are used by the verify process. If an extension is
-     * critical and doesn't appear in this list then the verify process will
-     * normally reject the certificate. The list must be kept in numerical
-     * order because it will be searched using bsearch.
-     */
-
-    static const int supported_nids[] = {
-        NID_netscape_cert_type, /* 71 */
-        NID_key_usage,          /* 83 */
-        NID_subject_alt_name,   /* 85 */
-        NID_basic_constraints,  /* 87 */
-        NID_certificate_policies, /* 89 */
-        NID_ext_key_usage,      /* 126 */
-        NID_policy_constraints, /* 401 */
-        NID_proxyCertInfo,      /* 663 */
-        NID_name_constraints,   /* 666 */
-        NID_policy_mappings,    /* 747 */
-        NID_inhibit_any_policy  /* 748 */
-    };
-
-    int ex_nid = OBJ_obj2nid(X509_EXTENSION_get_object(ex));
-
-    if (ex_nid == NID_undef)
-        return 0;
-
-    if (bsearch
-        (&ex_nid, supported_nids, sizeof(supported_nids) / sizeof(int),
-         sizeof(int), nid_cmp) != NULL)
-        return 1;
     return 0;
+  }
+
+  // OPENSSL_free existing name if dynamic
+  if (ptmp->flags & X509_PURPOSE_DYNAMIC_NAME) {
+    OPENSSL_free(ptmp->name);
+    OPENSSL_free(ptmp->sname);
+  }
+  // dup supplied name
+  ptmp->name = name_dup;
+  ptmp->sname = sname_dup;
+  // Keep the dynamic flag of existing entry
+  ptmp->flags &= X509_PURPOSE_DYNAMIC;
+  // Set all other flags
+  ptmp->flags |= flags;
+
+  ptmp->purpose = id;
+  ptmp->trust = trust;
+  ptmp->check_purpose = ck;
+  ptmp->usr_data = arg;
+
+  // If its a new entry manage the dynamic table
+  if (idx == -1) {
+    if (!xptable && !(xptable = sk_X509_PURPOSE_new(xp_cmp))) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      xptable_free(ptmp);
+      return 0;
+    }
+    if (!sk_X509_PURPOSE_push(xptable, ptmp)) {
+      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+      xptable_free(ptmp);
+      return 0;
+    }
+  }
+  return 1;
 }
 
-static int setup_dp(X509 *x, DIST_POINT *dp)
-{
-    X509_NAME *iname = NULL;
-    size_t i;
-    if (dp->reasons) {
-        if (dp->reasons->length > 0)
-            dp->dp_reasons = dp->reasons->data[0];
-        if (dp->reasons->length > 1)
-            dp->dp_reasons |= (dp->reasons->data[1] << 8);
-        dp->dp_reasons &= CRLDP_ALL_REASONS;
-    } else
-        dp->dp_reasons = CRLDP_ALL_REASONS;
-    if (!dp->distpoint || (dp->distpoint->type != 1))
-        return 1;
-    for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) {
-        GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i);
-        if (gen->type == GEN_DIRNAME) {
-            iname = gen->d.directoryName;
-            break;
-        }
+static void xptable_free(X509_PURPOSE *p) {
+  if (!p) {
+    return;
+  }
+  if (p->flags & X509_PURPOSE_DYNAMIC) {
+    if (p->flags & X509_PURPOSE_DYNAMIC_NAME) {
+      OPENSSL_free(p->name);
+      OPENSSL_free(p->sname);
     }
-    if (!iname)
-        iname = X509_get_issuer_name(x);
-
-    return DIST_POINT_set_dpname(dp->distpoint, iname);
+    OPENSSL_free(p);
+  }
 }
 
-static int setup_crldp(X509 *x)
-{
-    int j;
-    x->crldp = X509_get_ext_d2i(x, NID_crl_distribution_points, &j, NULL);
-    if (x->crldp == NULL && j != -1) {
-        return 0;
-    }
-    for (size_t i = 0; i < sk_DIST_POINT_num(x->crldp); i++) {
-        if (!setup_dp(x, sk_DIST_POINT_value(x->crldp, i))) {
-            return 0;
-        }
-    }
+void X509_PURPOSE_cleanup(void) {
+  unsigned int i;
+  sk_X509_PURPOSE_pop_free(xptable, xptable_free);
+  for (i = 0; i < X509_PURPOSE_COUNT; i++) {
+    xptable_free(xstandard + i);
+  }
+  xptable = NULL;
+}
+
+int X509_PURPOSE_get_id(const X509_PURPOSE *xp) { return xp->purpose; }
+
+char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp) { return xp->name; }
+
+char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp) { return xp->sname; }
+
+int X509_PURPOSE_get_trust(const X509_PURPOSE *xp) { return xp->trust; }
+
+static int nid_cmp(const void *void_a, const void *void_b) {
+  const int *a = void_a, *b = void_b;
+
+  return *a - *b;
+}
+
+int X509_supported_extension(const X509_EXTENSION *ex) {
+  // This table is a list of the NIDs of supported extensions: that is
+  // those which are used by the verify process. If an extension is
+  // critical and doesn't appear in this list then the verify process will
+  // normally reject the certificate. The list must be kept in numerical
+  // order because it will be searched using bsearch.
+
+  static const int supported_nids[] = {
+      NID_netscape_cert_type,    // 71
+      NID_key_usage,             // 83
+      NID_subject_alt_name,      // 85
+      NID_basic_constraints,     // 87
+      NID_certificate_policies,  // 89
+      NID_ext_key_usage,         // 126
+      NID_policy_constraints,    // 401
+      NID_proxyCertInfo,         // 663
+      NID_name_constraints,      // 666
+      NID_policy_mappings,       // 747
+      NID_inhibit_any_policy     // 748
+  };
+
+  int ex_nid = OBJ_obj2nid(X509_EXTENSION_get_object(ex));
+
+  if (ex_nid == NID_undef) {
+    return 0;
+  }
+
+  if (bsearch(&ex_nid, supported_nids, sizeof(supported_nids) / sizeof(int),
+              sizeof(int), nid_cmp) != NULL) {
     return 1;
+  }
+  return 0;
 }
 
-int x509v3_cache_extensions(X509 *x)
-{
-    BASIC_CONSTRAINTS *bs;
-    PROXY_CERT_INFO_EXTENSION *pci;
-    ASN1_BIT_STRING *usage;
-    ASN1_BIT_STRING *ns;
-    EXTENDED_KEY_USAGE *extusage;
-    X509_EXTENSION *ex;
-    size_t i;
-    int j;
-
-    CRYPTO_MUTEX_lock_read(&x->lock);
-    const int is_set = x->ex_flags & EXFLAG_SET;
-    CRYPTO_MUTEX_unlock_read(&x->lock);
-
-    if (is_set) {
-        return (x->ex_flags & EXFLAG_INVALID) == 0;
+static int setup_dp(X509 *x, DIST_POINT *dp) {
+  X509_NAME *iname = NULL;
+  size_t i;
+  if (dp->reasons) {
+    if (dp->reasons->length > 0) {
+      dp->dp_reasons = dp->reasons->data[0];
     }
-
-    CRYPTO_MUTEX_lock_write(&x->lock);
-    if (x->ex_flags & EXFLAG_SET) {
-        CRYPTO_MUTEX_unlock_write(&x->lock);
-        return (x->ex_flags & EXFLAG_INVALID) == 0;
+    if (dp->reasons->length > 1) {
+      dp->dp_reasons |= (dp->reasons->data[1] << 8);
     }
-
-    if (!X509_digest(x, EVP_sha1(), x->sha1_hash, NULL))
-        x->ex_flags |= EXFLAG_INVALID;
-    /* V1 should mean no extensions ... */
-    if (X509_get_version(x) == X509_VERSION_1)
-        x->ex_flags |= EXFLAG_V1;
-    /* Handle basic constraints */
-    if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, &j, NULL))) {
-        if (bs->ca)
-            x->ex_flags |= EXFLAG_CA;
-        if (bs->pathlen) {
-            if ((bs->pathlen->type == V_ASN1_NEG_INTEGER)
-                || !bs->ca) {
-                x->ex_flags |= EXFLAG_INVALID;
-                x->ex_pathlen = 0;
-            } else {
-                /* TODO(davidben): |ASN1_INTEGER_get| returns -1 on overflow,
-                 * which currently acts as if the constraint isn't present. This
-                 * works (an overflowing path length constraint may as well be
-                 * infinity), but Chromium's verifier simply treats values above
-                 * 255 as an error. */
-                x->ex_pathlen = ASN1_INTEGER_get(bs->pathlen);
-            }
-        } else
-            x->ex_pathlen = -1;
-        BASIC_CONSTRAINTS_free(bs);
-        x->ex_flags |= EXFLAG_BCONS;
-    } else if (j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
+    dp->dp_reasons &= CRLDP_ALL_REASONS;
+  } else {
+    dp->dp_reasons = CRLDP_ALL_REASONS;
+  }
+  if (!dp->distpoint || (dp->distpoint->type != 1)) {
+    return 1;
+  }
+  for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) {
+    GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i);
+    if (gen->type == GEN_DIRNAME) {
+      iname = gen->d.directoryName;
+      break;
     }
-    /* Handle proxy certificates */
-    if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, &j, NULL))) {
-        if (x->ex_flags & EXFLAG_CA
-            || X509_get_ext_by_NID(x, NID_subject_alt_name, -1) >= 0
-            || X509_get_ext_by_NID(x, NID_issuer_alt_name, -1) >= 0) {
-            x->ex_flags |= EXFLAG_INVALID;
-        }
-        if (pci->pcPathLengthConstraint) {
-            x->ex_pcpathlen = ASN1_INTEGER_get(pci->pcPathLengthConstraint);
-        } else
-            x->ex_pcpathlen = -1;
-        PROXY_CERT_INFO_EXTENSION_free(pci);
-        x->ex_flags |= EXFLAG_PROXY;
-    } else if (j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    /* Handle key usage */
-    if ((usage = X509_get_ext_d2i(x, NID_key_usage, &j, NULL))) {
-        if (usage->length > 0) {
-            x->ex_kusage = usage->data[0];
-            if (usage->length > 1)
-                x->ex_kusage |= usage->data[1] << 8;
-        } else
-            x->ex_kusage = 0;
-        x->ex_flags |= EXFLAG_KUSAGE;
-        ASN1_BIT_STRING_free(usage);
-    } else if (j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    x->ex_xkusage = 0;
-    if ((extusage = X509_get_ext_d2i(x, NID_ext_key_usage, &j, NULL))) {
-        x->ex_flags |= EXFLAG_XKUSAGE;
-        for (i = 0; i < sk_ASN1_OBJECT_num(extusage); i++) {
-            switch (OBJ_obj2nid(sk_ASN1_OBJECT_value(extusage, i))) {
-            case NID_server_auth:
-                x->ex_xkusage |= XKU_SSL_SERVER;
-                break;
+  }
+  if (!iname) {
+    iname = X509_get_issuer_name(x);
+  }
 
-            case NID_client_auth:
-                x->ex_xkusage |= XKU_SSL_CLIENT;
-                break;
+  return DIST_POINT_set_dpname(dp->distpoint, iname);
+}
 
-            case NID_email_protect:
-                x->ex_xkusage |= XKU_SMIME;
-                break;
-
-            case NID_code_sign:
-                x->ex_xkusage |= XKU_CODE_SIGN;
-                break;
-
-            case NID_ms_sgc:
-            case NID_ns_sgc:
-                x->ex_xkusage |= XKU_SGC;
-                break;
-
-            case NID_OCSP_sign:
-                x->ex_xkusage |= XKU_OCSP_SIGN;
-                break;
-
-            case NID_time_stamp:
-                x->ex_xkusage |= XKU_TIMESTAMP;
-                break;
-
-            case NID_dvcs:
-                x->ex_xkusage |= XKU_DVCS;
-                break;
-
-            case NID_anyExtendedKeyUsage:
-                x->ex_xkusage |= XKU_ANYEKU;
-                break;
-            }
-        }
-        sk_ASN1_OBJECT_pop_free(extusage, ASN1_OBJECT_free);
-    } else if (j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
+static int setup_crldp(X509 *x) {
+  int j;
+  x->crldp = X509_get_ext_d2i(x, NID_crl_distribution_points, &j, NULL);
+  if (x->crldp == NULL && j != -1) {
+    return 0;
+  }
+  for (size_t i = 0; i < sk_DIST_POINT_num(x->crldp); i++) {
+    if (!setup_dp(x, sk_DIST_POINT_value(x->crldp, i))) {
+      return 0;
     }
+  }
+  return 1;
+}
 
-    if ((ns = X509_get_ext_d2i(x, NID_netscape_cert_type, &j, NULL))) {
-        if (ns->length > 0)
-            x->ex_nscert = ns->data[0];
-        else
-            x->ex_nscert = 0;
-        x->ex_flags |= EXFLAG_NSCERT;
-        ASN1_BIT_STRING_free(ns);
-    } else if (j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    x->skid = X509_get_ext_d2i(x, NID_subject_key_identifier, &j, NULL);
-    if (x->skid == NULL && j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    x->akid = X509_get_ext_d2i(x, NID_authority_key_identifier, &j, NULL);
-    if (x->akid == NULL && j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    /* Does subject name match issuer ? */
-    if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
-        x->ex_flags |= EXFLAG_SI;
-        /* If SKID matches AKID also indicate self signed */
-        if (X509_check_akid(x, x->akid) == X509_V_OK &&
-            !ku_reject(x, KU_KEY_CERT_SIGN))
-            x->ex_flags |= EXFLAG_SS;
-    }
-    x->altname = X509_get_ext_d2i(x, NID_subject_alt_name, &j, NULL);
-    if (x->altname == NULL && j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    x->nc = X509_get_ext_d2i(x, NID_name_constraints, &j, NULL);
-    if (x->nc == NULL && j != -1) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
-    if (!setup_crldp(x)) {
-        x->ex_flags |= EXFLAG_INVALID;
-    }
+int x509v3_cache_extensions(X509 *x) {
+  BASIC_CONSTRAINTS *bs;
+  PROXY_CERT_INFO_EXTENSION *pci;
+  ASN1_BIT_STRING *usage;
+  ASN1_BIT_STRING *ns;
+  EXTENDED_KEY_USAGE *extusage;
+  size_t i;
+  int j;
 
-    for (j = 0; j < X509_get_ext_count(x); j++) {
-        ex = X509_get_ext(x, j);
-        if (OBJ_obj2nid(X509_EXTENSION_get_object(ex))
-            == NID_freshest_crl)
-            x->ex_flags |= EXFLAG_FRESHEST;
-        if (!X509_EXTENSION_get_critical(ex))
-            continue;
-        if (!X509_supported_extension(ex)) {
-            x->ex_flags |= EXFLAG_CRITICAL;
-            break;
-        }
-    }
-    x->ex_flags |= EXFLAG_SET;
+  CRYPTO_MUTEX_lock_read(&x->lock);
+  const int is_set = x->ex_flags & EXFLAG_SET;
+  CRYPTO_MUTEX_unlock_read(&x->lock);
 
+  if (is_set) {
+    return (x->ex_flags & EXFLAG_INVALID) == 0;
+  }
+
+  CRYPTO_MUTEX_lock_write(&x->lock);
+  if (x->ex_flags & EXFLAG_SET) {
     CRYPTO_MUTEX_unlock_write(&x->lock);
     return (x->ex_flags & EXFLAG_INVALID) == 0;
+  }
+
+  if (!X509_digest(x, EVP_sha256(), x->cert_hash, NULL)) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  // V1 should mean no extensions ...
+  if (X509_get_version(x) == X509_VERSION_1) {
+    x->ex_flags |= EXFLAG_V1;
+  }
+  // Handle basic constraints
+  if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, &j, NULL))) {
+    if (bs->ca) {
+      x->ex_flags |= EXFLAG_CA;
+    }
+    if (bs->pathlen) {
+      if ((bs->pathlen->type == V_ASN1_NEG_INTEGER) || !bs->ca) {
+        x->ex_flags |= EXFLAG_INVALID;
+        x->ex_pathlen = 0;
+      } else {
+        // TODO(davidben): |ASN1_INTEGER_get| returns -1 on overflow,
+        // which currently acts as if the constraint isn't present. This
+        // works (an overflowing path length constraint may as well be
+        // infinity), but Chromium's verifier simply treats values above
+        // 255 as an error.
+        x->ex_pathlen = ASN1_INTEGER_get(bs->pathlen);
+      }
+    } else {
+      x->ex_pathlen = -1;
+    }
+    BASIC_CONSTRAINTS_free(bs);
+    x->ex_flags |= EXFLAG_BCONS;
+  } else if (j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  // Handle proxy certificates
+  if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, &j, NULL))) {
+    if (x->ex_flags & EXFLAG_CA ||
+        X509_get_ext_by_NID(x, NID_subject_alt_name, -1) >= 0 ||
+        X509_get_ext_by_NID(x, NID_issuer_alt_name, -1) >= 0) {
+      x->ex_flags |= EXFLAG_INVALID;
+    }
+    if (pci->pcPathLengthConstraint) {
+      x->ex_pcpathlen = ASN1_INTEGER_get(pci->pcPathLengthConstraint);
+    } else {
+      x->ex_pcpathlen = -1;
+    }
+    PROXY_CERT_INFO_EXTENSION_free(pci);
+    x->ex_flags |= EXFLAG_PROXY;
+  } else if (j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  // Handle key usage
+  if ((usage = X509_get_ext_d2i(x, NID_key_usage, &j, NULL))) {
+    if (usage->length > 0) {
+      x->ex_kusage = usage->data[0];
+      if (usage->length > 1) {
+        x->ex_kusage |= usage->data[1] << 8;
+      }
+    } else {
+      x->ex_kusage = 0;
+    }
+    x->ex_flags |= EXFLAG_KUSAGE;
+    ASN1_BIT_STRING_free(usage);
+  } else if (j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  x->ex_xkusage = 0;
+  if ((extusage = X509_get_ext_d2i(x, NID_ext_key_usage, &j, NULL))) {
+    x->ex_flags |= EXFLAG_XKUSAGE;
+    for (i = 0; i < sk_ASN1_OBJECT_num(extusage); i++) {
+      switch (OBJ_obj2nid(sk_ASN1_OBJECT_value(extusage, i))) {
+        case NID_server_auth:
+          x->ex_xkusage |= XKU_SSL_SERVER;
+          break;
+
+        case NID_client_auth:
+          x->ex_xkusage |= XKU_SSL_CLIENT;
+          break;
+
+        case NID_email_protect:
+          x->ex_xkusage |= XKU_SMIME;
+          break;
+
+        case NID_code_sign:
+          x->ex_xkusage |= XKU_CODE_SIGN;
+          break;
+
+        case NID_ms_sgc:
+        case NID_ns_sgc:
+          x->ex_xkusage |= XKU_SGC;
+          break;
+
+        case NID_OCSP_sign:
+          x->ex_xkusage |= XKU_OCSP_SIGN;
+          break;
+
+        case NID_time_stamp:
+          x->ex_xkusage |= XKU_TIMESTAMP;
+          break;
+
+        case NID_dvcs:
+          x->ex_xkusage |= XKU_DVCS;
+          break;
+
+        case NID_anyExtendedKeyUsage:
+          x->ex_xkusage |= XKU_ANYEKU;
+          break;
+      }
+    }
+    sk_ASN1_OBJECT_pop_free(extusage, ASN1_OBJECT_free);
+  } else if (j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+
+  if ((ns = X509_get_ext_d2i(x, NID_netscape_cert_type, &j, NULL))) {
+    if (ns->length > 0) {
+      x->ex_nscert = ns->data[0];
+    } else {
+      x->ex_nscert = 0;
+    }
+    x->ex_flags |= EXFLAG_NSCERT;
+    ASN1_BIT_STRING_free(ns);
+  } else if (j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  x->skid = X509_get_ext_d2i(x, NID_subject_key_identifier, &j, NULL);
+  if (x->skid == NULL && j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  x->akid = X509_get_ext_d2i(x, NID_authority_key_identifier, &j, NULL);
+  if (x->akid == NULL && j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  // Does subject name match issuer ?
+  if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
+    x->ex_flags |= EXFLAG_SI;
+    // If SKID matches AKID also indicate self signed
+    if (X509_check_akid(x, x->akid) == X509_V_OK &&
+        !ku_reject(x, KU_KEY_CERT_SIGN)) {
+      x->ex_flags |= EXFLAG_SS;
+    }
+  }
+  x->altname = X509_get_ext_d2i(x, NID_subject_alt_name, &j, NULL);
+  if (x->altname == NULL && j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  x->nc = X509_get_ext_d2i(x, NID_name_constraints, &j, NULL);
+  if (x->nc == NULL && j != -1) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+  if (!setup_crldp(x)) {
+    x->ex_flags |= EXFLAG_INVALID;
+  }
+
+  for (j = 0; j < X509_get_ext_count(x); j++) {
+    const X509_EXTENSION *ex = X509_get_ext(x, j);
+    if (OBJ_obj2nid(X509_EXTENSION_get_object(ex)) == NID_freshest_crl) {
+      x->ex_flags |= EXFLAG_FRESHEST;
+    }
+    if (!X509_EXTENSION_get_critical(ex)) {
+      continue;
+    }
+    if (!X509_supported_extension(ex)) {
+      x->ex_flags |= EXFLAG_CRITICAL;
+      break;
+    }
+  }
+  x->ex_flags |= EXFLAG_SET;
+
+  CRYPTO_MUTEX_unlock_write(&x->lock);
+  return (x->ex_flags & EXFLAG_INVALID) == 0;
 }
 
-/* check_ca returns one if |x| should be considered a CA certificate and zero
- * otherwise. */
-static int check_ca(const X509 *x)
-{
-    /* keyUsage if present should allow cert signing */
-    if (ku_reject(x, KU_KEY_CERT_SIGN))
-        return 0;
-    /* Version 1 certificates are considered CAs and don't have extensions. */
-    if ((x->ex_flags & V1_ROOT) == V1_ROOT) {
-        return 1;
-    }
-    /* Otherwise, it's only a CA if basicConstraints says so. */
-    return ((x->ex_flags & EXFLAG_BCONS) &&
-            (x->ex_flags & EXFLAG_CA));
+// check_ca returns one if |x| should be considered a CA certificate and zero
+// otherwise.
+static int check_ca(const X509 *x) {
+  // keyUsage if present should allow cert signing
+  if (ku_reject(x, KU_KEY_CERT_SIGN)) {
+    return 0;
+  }
+  // Version 1 certificates are considered CAs and don't have extensions.
+  if ((x->ex_flags & V1_ROOT) == V1_ROOT) {
+    return 1;
+  }
+  // Otherwise, it's only a CA if basicConstraints says so.
+  return ((x->ex_flags & EXFLAG_BCONS) && (x->ex_flags & EXFLAG_CA));
 }
 
-int X509_check_ca(X509 *x)
-{
-    if (!x509v3_cache_extensions(x)) {
-        return 0;
-    }
-    return check_ca(x);
+int X509_check_ca(X509 *x) {
+  if (!x509v3_cache_extensions(x)) {
+    return 0;
+  }
+  return check_ca(x);
 }
 
 static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x,
-                                    int ca)
-{
-    if (xku_reject(x, XKU_SSL_CLIENT))
-        return 0;
-    if (ca)
-        return check_ca(x);
-    /* We need to do digital signatures or key agreement */
-    if (ku_reject(x, KU_DIGITAL_SIGNATURE | KU_KEY_AGREEMENT))
-        return 0;
-    /* nsCertType if present should allow SSL client use */
-    if (ns_reject(x, NS_SSL_CLIENT))
-        return 0;
-    return 1;
+                                    int ca) {
+  if (xku_reject(x, XKU_SSL_CLIENT)) {
+    return 0;
+  }
+  if (ca) {
+    return check_ca(x);
+  }
+  // We need to do digital signatures or key agreement
+  if (ku_reject(x, KU_DIGITAL_SIGNATURE | KU_KEY_AGREEMENT)) {
+    return 0;
+  }
+  // nsCertType if present should allow SSL client use
+  if (ns_reject(x, NS_SSL_CLIENT)) {
+    return 0;
+  }
+  return 1;
 }
 
-/*
- * Key usage needed for TLS/SSL server: digital signature, encipherment or
- * key agreement. The ssl code can check this more thoroughly for individual
- * key types.
- */
-#define KU_TLS \
-        (KU_DIGITAL_SIGNATURE|KU_KEY_ENCIPHERMENT|KU_KEY_AGREEMENT)
+// Key usage needed for TLS/SSL server: digital signature, encipherment or
+// key agreement. The ssl code can check this more thoroughly for individual
+// key types.
+#define KU_TLS (KU_DIGITAL_SIGNATURE | KU_KEY_ENCIPHERMENT | KU_KEY_AGREEMENT)
 
 static int check_purpose_ssl_server(const X509_PURPOSE *xp, const X509 *x,
-                                    int ca)
-{
-    if (xku_reject(x, XKU_SSL_SERVER))
-        return 0;
-    if (ca)
-        return check_ca(x);
+                                    int ca) {
+  if (xku_reject(x, XKU_SSL_SERVER)) {
+    return 0;
+  }
+  if (ca) {
+    return check_ca(x);
+  }
 
-    if (ns_reject(x, NS_SSL_SERVER))
-        return 0;
-    if (ku_reject(x, KU_TLS))
-        return 0;
+  if (ns_reject(x, NS_SSL_SERVER)) {
+    return 0;
+  }
+  if (ku_reject(x, KU_TLS)) {
+    return 0;
+  }
 
-    return 1;
-
+  return 1;
 }
 
 static int check_purpose_ns_ssl_server(const X509_PURPOSE *xp, const X509 *x,
-                                       int ca)
-{
-    int ret;
-    ret = check_purpose_ssl_server(xp, x, ca);
-    if (!ret || ca)
-        return ret;
-    /* We need to encipher or Netscape complains */
-    if (ku_reject(x, KU_KEY_ENCIPHERMENT))
-        return 0;
+                                       int ca) {
+  int ret;
+  ret = check_purpose_ssl_server(xp, x, ca);
+  if (!ret || ca) {
     return ret;
+  }
+  // We need to encipher or Netscape complains
+  if (ku_reject(x, KU_KEY_ENCIPHERMENT)) {
+    return 0;
+  }
+  return ret;
 }
 
-/* purpose_smime returns one if |x| is a valid S/MIME leaf (|ca| is zero) or CA
- * (|ca| is one) certificate, and zero otherwise. */
-static int purpose_smime(const X509 *x, int ca)
-{
-    if (xku_reject(x, XKU_SMIME))
-        return 0;
-    if (ca) {
-        /* check nsCertType if present */
-        if ((x->ex_flags & EXFLAG_NSCERT) &&
-            (x->ex_nscert & NS_SMIME_CA) == 0) {
-          return 0;
-        }
+// purpose_smime returns one if |x| is a valid S/MIME leaf (|ca| is zero) or CA
+// (|ca| is one) certificate, and zero otherwise.
+static int purpose_smime(const X509 *x, int ca) {
+  if (xku_reject(x, XKU_SMIME)) {
+    return 0;
+  }
+  if (ca) {
+    // check nsCertType if present
+    if ((x->ex_flags & EXFLAG_NSCERT) && (x->ex_nscert & NS_SMIME_CA) == 0) {
+      return 0;
+    }
 
-        return check_ca(x);
-    }
-    if (x->ex_flags & EXFLAG_NSCERT) {
-        return (x->ex_nscert & NS_SMIME) == NS_SMIME;
-    }
-    return 1;
+    return check_ca(x);
+  }
+  if (x->ex_flags & EXFLAG_NSCERT) {
+    return (x->ex_nscert & NS_SMIME) == NS_SMIME;
+  }
+  return 1;
 }
 
 static int check_purpose_smime_sign(const X509_PURPOSE *xp, const X509 *x,
-                                    int ca)
-{
-    int ret;
-    ret = purpose_smime(x, ca);
-    if (!ret || ca)
-        return ret;
-    if (ku_reject(x, KU_DIGITAL_SIGNATURE | KU_NON_REPUDIATION))
-        return 0;
+                                    int ca) {
+  int ret;
+  ret = purpose_smime(x, ca);
+  if (!ret || ca) {
     return ret;
+  }
+  if (ku_reject(x, KU_DIGITAL_SIGNATURE | KU_NON_REPUDIATION)) {
+    return 0;
+  }
+  return ret;
 }
 
 static int check_purpose_smime_encrypt(const X509_PURPOSE *xp, const X509 *x,
-                                       int ca)
-{
-    int ret;
-    ret = purpose_smime(x, ca);
-    if (!ret || ca)
-        return ret;
-    if (ku_reject(x, KU_KEY_ENCIPHERMENT))
-        return 0;
+                                       int ca) {
+  int ret;
+  ret = purpose_smime(x, ca);
+  if (!ret || ca) {
     return ret;
+  }
+  if (ku_reject(x, KU_KEY_ENCIPHERMENT)) {
+    return 0;
+  }
+  return ret;
 }
 
 static int check_purpose_crl_sign(const X509_PURPOSE *xp, const X509 *x,
-                                  int ca)
-{
-    if (ca) {
-        return check_ca(x);
-    }
-    if (ku_reject(x, KU_CRL_SIGN))
-        return 0;
-    return 1;
+                                  int ca) {
+  if (ca) {
+    return check_ca(x);
+  }
+  if (ku_reject(x, KU_CRL_SIGN)) {
+    return 0;
+  }
+  return 1;
 }
 
-/*
- * OCSP helper: this is *not* a full OCSP check. It just checks that each CA
- * is valid. Additional checks must be made on the chain.
- */
+// OCSP helper: this is *not* a full OCSP check. It just checks that each CA
+// is valid. Additional checks must be made on the chain.
 
-static int ocsp_helper(const X509_PURPOSE *xp, const X509 *x, int ca)
-{
-    if (ca)
-        return check_ca(x);
-    /* leaf certificate is checked in OCSP_verify() */
-    return 1;
+static int ocsp_helper(const X509_PURPOSE *xp, const X509 *x, int ca) {
+  if (ca) {
+    return check_ca(x);
+  }
+  // leaf certificate is checked in OCSP_verify()
+  return 1;
 }
 
 static int check_purpose_timestamp_sign(const X509_PURPOSE *xp, const X509 *x,
-                                        int ca)
-{
-    int i_ext;
+                                        int ca) {
+  int i_ext;
 
-    /* If ca is true we must return if this is a valid CA certificate. */
-    if (ca)
-        return check_ca(x);
+  // If ca is true we must return if this is a valid CA certificate.
+  if (ca) {
+    return check_ca(x);
+  }
 
-    /*
-     * Check the optional key usage field:
-     * if Key Usage is present, it must be one of digitalSignature
-     * and/or nonRepudiation (other values are not consistent and shall
-     * be rejected).
-     */
-    if ((x->ex_flags & EXFLAG_KUSAGE)
-        && ((x->ex_kusage & ~(KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE)) ||
-            !(x->ex_kusage & (KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE))))
-        return 0;
+  // Check the optional key usage field:
+  // if Key Usage is present, it must be one of digitalSignature
+  // and/or nonRepudiation (other values are not consistent and shall
+  // be rejected).
+  if ((x->ex_flags & EXFLAG_KUSAGE) &&
+      ((x->ex_kusage & ~(KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE)) ||
+       !(x->ex_kusage & (KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE)))) {
+    return 0;
+  }
 
-    /* Only time stamp key usage is permitted and it's required. */
-    if (!(x->ex_flags & EXFLAG_XKUSAGE) || x->ex_xkusage != XKU_TIMESTAMP)
-        return 0;
+  // Only time stamp key usage is permitted and it's required.
+  if (!(x->ex_flags & EXFLAG_XKUSAGE) || x->ex_xkusage != XKU_TIMESTAMP) {
+    return 0;
+  }
 
-    /* Extended Key Usage MUST be critical */
-    i_ext = X509_get_ext_by_NID((X509 *)x, NID_ext_key_usage, -1);
-    if (i_ext >= 0) {
-        X509_EXTENSION *ext = X509_get_ext((X509 *)x, i_ext);
-        if (!X509_EXTENSION_get_critical(ext))
-            return 0;
+  // Extended Key Usage MUST be critical
+  i_ext = X509_get_ext_by_NID((X509 *)x, NID_ext_key_usage, -1);
+  if (i_ext >= 0) {
+    const X509_EXTENSION *ext = X509_get_ext((X509 *)x, i_ext);
+    if (!X509_EXTENSION_get_critical(ext)) {
+      return 0;
     }
+  }
 
-    return 1;
+  return 1;
 }
 
-static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca)
-{
-    return 1;
+static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca) { return 1; }
+
+// Various checks to see if one certificate issued the second. This can be
+// used to prune a set of possible issuer certificates which have been looked
+// up using some simple method such as by subject name. These are: 1. Check
+// issuer_name(subject) == subject_name(issuer) 2. If akid(subject) exists
+// check it matches issuer 3. If key_usage(issuer) exists check it supports
+// certificate signing returns 0 for OK, positive for reason for mismatch,
+// reasons match codes for X509_verify_cert()
+
+int X509_check_issued(X509 *issuer, X509 *subject) {
+  if (X509_NAME_cmp(X509_get_subject_name(issuer),
+                    X509_get_issuer_name(subject))) {
+    return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
+  }
+  if (!x509v3_cache_extensions(issuer) || !x509v3_cache_extensions(subject)) {
+    return X509_V_ERR_UNSPECIFIED;
+  }
+
+  if (subject->akid) {
+    int ret = X509_check_akid(issuer, subject->akid);
+    if (ret != X509_V_OK) {
+      return ret;
+    }
+  }
+
+  if (subject->ex_flags & EXFLAG_PROXY) {
+    if (ku_reject(issuer, KU_DIGITAL_SIGNATURE)) {
+      return X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE;
+    }
+  } else if (ku_reject(issuer, KU_KEY_CERT_SIGN)) {
+    return X509_V_ERR_KEYUSAGE_NO_CERTSIGN;
+  }
+  return X509_V_OK;
 }
 
-/*
- * Various checks to see if one certificate issued the second. This can be
- * used to prune a set of possible issuer certificates which have been looked
- * up using some simple method such as by subject name. These are: 1. Check
- * issuer_name(subject) == subject_name(issuer) 2. If akid(subject) exists
- * check it matches issuer 3. If key_usage(issuer) exists check it supports
- * certificate signing returns 0 for OK, positive for reason for mismatch,
- * reasons match codes for X509_verify_cert()
- */
-
-int X509_check_issued(X509 *issuer, X509 *subject)
-{
-    if (X509_NAME_cmp(X509_get_subject_name(issuer),
-                      X509_get_issuer_name(subject)))
-        return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
-    if (!x509v3_cache_extensions(issuer) ||
-        !x509v3_cache_extensions(subject)) {
-        return X509_V_ERR_UNSPECIFIED;
-    }
-
-    if (subject->akid) {
-        int ret = X509_check_akid(issuer, subject->akid);
-        if (ret != X509_V_OK)
-            return ret;
-    }
-
-    if (subject->ex_flags & EXFLAG_PROXY) {
-        if (ku_reject(issuer, KU_DIGITAL_SIGNATURE))
-            return X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE;
-    } else if (ku_reject(issuer, KU_KEY_CERT_SIGN))
-        return X509_V_ERR_KEYUSAGE_NO_CERTSIGN;
+int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid) {
+  if (!akid) {
     return X509_V_OK;
-}
+  }
 
-int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid)
-{
-
-    if (!akid)
-        return X509_V_OK;
-
-    /* Check key ids (if present) */
-    if (akid->keyid && issuer->skid &&
-        ASN1_OCTET_STRING_cmp(akid->keyid, issuer->skid))
-        return X509_V_ERR_AKID_SKID_MISMATCH;
-    /* Check serial number */
-    if (akid->serial &&
-        ASN1_INTEGER_cmp(X509_get_serialNumber(issuer), akid->serial))
-        return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;
-    /* Check issuer name */
-    if (akid->issuer) {
-        /*
-         * Ugh, for some peculiar reason AKID includes SEQUENCE OF
-         * GeneralName. So look for a DirName. There may be more than one but
-         * we only take any notice of the first.
-         */
-        GENERAL_NAMES *gens;
-        GENERAL_NAME *gen;
-        X509_NAME *nm = NULL;
-        size_t i;
-        gens = akid->issuer;
-        for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
-            gen = sk_GENERAL_NAME_value(gens, i);
-            if (gen->type == GEN_DIRNAME) {
-                nm = gen->d.dirn;
-                break;
-            }
-        }
-        if (nm && X509_NAME_cmp(nm, X509_get_issuer_name(issuer)))
-            return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;
+  // Check key ids (if present)
+  if (akid->keyid && issuer->skid &&
+      ASN1_OCTET_STRING_cmp(akid->keyid, issuer->skid)) {
+    return X509_V_ERR_AKID_SKID_MISMATCH;
+  }
+  // Check serial number
+  if (akid->serial &&
+      ASN1_INTEGER_cmp(X509_get_serialNumber(issuer), akid->serial)) {
+    return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;
+  }
+  // Check issuer name
+  if (akid->issuer) {
+    // Ugh, for some peculiar reason AKID includes SEQUENCE OF
+    // GeneralName. So look for a DirName. There may be more than one but
+    // we only take any notice of the first.
+    GENERAL_NAMES *gens;
+    GENERAL_NAME *gen;
+    X509_NAME *nm = NULL;
+    size_t i;
+    gens = akid->issuer;
+    for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
+      gen = sk_GENERAL_NAME_value(gens, i);
+      if (gen->type == GEN_DIRNAME) {
+        nm = gen->d.dirn;
+        break;
+      }
     }
-    return X509_V_OK;
-}
-
-uint32_t X509_get_extension_flags(X509 *x)
-{
-    /* Ignore the return value. On failure, |x->ex_flags| will include
-     * |EXFLAG_INVALID|. */
-    x509v3_cache_extensions(x);
-    return x->ex_flags;
-}
-
-uint32_t X509_get_key_usage(X509 *x)
-{
-    if (!x509v3_cache_extensions(x)) {
-        return 0;
+    if (nm && X509_NAME_cmp(nm, X509_get_issuer_name(issuer))) {
+      return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;
     }
-    if (x->ex_flags & EXFLAG_KUSAGE)
-        return x->ex_kusage;
-    return UINT32_MAX;
+  }
+  return X509_V_OK;
 }
 
-uint32_t X509_get_extended_key_usage(X509 *x)
-{
-    if (!x509v3_cache_extensions(x)) {
-        return 0;
-    }
-    if (x->ex_flags & EXFLAG_XKUSAGE)
-        return x->ex_xkusage;
-    return UINT32_MAX;
+uint32_t X509_get_extension_flags(X509 *x) {
+  // Ignore the return value. On failure, |x->ex_flags| will include
+  // |EXFLAG_INVALID|.
+  x509v3_cache_extensions(x);
+  return x->ex_flags;
 }
 
-const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x509)
-{
-    if (!x509v3_cache_extensions(x509)) {
-        return NULL;
-    }
-    return x509->skid;
+uint32_t X509_get_key_usage(X509 *x) {
+  if (!x509v3_cache_extensions(x)) {
+    return 0;
+  }
+  if (x->ex_flags & EXFLAG_KUSAGE) {
+    return x->ex_kusage;
+  }
+  return UINT32_MAX;
 }
 
-const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x509)
-{
-    if (!x509v3_cache_extensions(x509)) {
-        return NULL;
-    }
-    return x509->akid != NULL ? x509->akid->keyid : NULL;
+uint32_t X509_get_extended_key_usage(X509 *x) {
+  if (!x509v3_cache_extensions(x)) {
+    return 0;
+  }
+  if (x->ex_flags & EXFLAG_XKUSAGE) {
+    return x->ex_xkusage;
+  }
+  return UINT32_MAX;
 }
 
-const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x509)
-{
-    if (!x509v3_cache_extensions(x509)) {
-        return NULL;
-    }
-    return x509->akid != NULL ? x509->akid->issuer : NULL;
+const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x509) {
+  if (!x509v3_cache_extensions(x509)) {
+    return NULL;
+  }
+  return x509->skid;
 }
 
-const ASN1_INTEGER *X509_get0_authority_serial(X509 *x509)
-{
-    if (!x509v3_cache_extensions(x509)) {
-        return NULL;
-    }
-    return x509->akid != NULL ? x509->akid->serial : NULL;
+const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x509) {
+  if (!x509v3_cache_extensions(x509)) {
+    return NULL;
+  }
+  return x509->akid != NULL ? x509->akid->keyid : NULL;
 }
 
-long X509_get_pathlen(X509 *x509)
-{
-    if (!x509v3_cache_extensions(x509) ||
-        (x509->ex_flags & EXFLAG_BCONS) == 0) {
-        return -1;
-    }
-    return x509->ex_pathlen;
+const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x509) {
+  if (!x509v3_cache_extensions(x509)) {
+    return NULL;
+  }
+  return x509->akid != NULL ? x509->akid->issuer : NULL;
+}
+
+const ASN1_INTEGER *X509_get0_authority_serial(X509 *x509) {
+  if (!x509v3_cache_extensions(x509)) {
+    return NULL;
+  }
+  return x509->akid != NULL ? x509->akid->serial : NULL;
+}
+
+long X509_get_pathlen(X509 *x509) {
+  if (!x509v3_cache_extensions(x509) || (x509->ex_flags & EXFLAG_BCONS) == 0) {
+    return -1;
+  }
+  return x509->ex_pathlen;
 }
diff --git a/src/crypto/x509v3/v3_skey.c b/src/crypto/x509v3/v3_skey.c
index 1cae7e1..05c5050 100644
--- a/src/crypto/x509v3/v3_skey.c
+++ b/src/crypto/x509v3/v3_skey.c
@@ -67,90 +67,101 @@
 #include "internal.h"
 
 
-static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method,
-                                      X509V3_CTX *ctx, char *str);
-const X509V3_EXT_METHOD v3_skey_id = {
-    NID_subject_key_identifier, 0, ASN1_ITEM_ref(ASN1_OCTET_STRING),
-    0, 0, 0, 0,
-    (X509V3_EXT_I2S)i2s_ASN1_OCTET_STRING,
-    (X509V3_EXT_S2I)s2i_skey_id,
-    0, 0, 0, 0,
-    NULL
-};
-
-char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, const ASN1_OCTET_STRING *oct)
-{
-    return x509v3_bytes_to_hex(oct->data, oct->length);
+char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method,
+                            const ASN1_OCTET_STRING *oct) {
+  return x509v3_bytes_to_hex(oct->data, oct->length);
 }
 
-ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
-                                         X509V3_CTX *ctx, const char *str)
-{
-    ASN1_OCTET_STRING *oct;
-    long length;
+ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method,
+                                         X509V3_CTX *ctx, const char *str) {
+  ASN1_OCTET_STRING *oct;
+  long length;
 
-    if (!(oct = ASN1_OCTET_STRING_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
+  if (!(oct = ASN1_OCTET_STRING_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
 
-    if (!(oct->data = x509v3_hex_to_bytes(str, &length))) {
-        ASN1_OCTET_STRING_free(oct);
-        return NULL;
-    }
-
-    oct->length = length;
-
-    return oct;
-
-}
-
-static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method,
-                                      X509V3_CTX *ctx, char *str)
-{
-    ASN1_OCTET_STRING *oct;
-    ASN1_BIT_STRING *pk;
-    unsigned char pkey_dig[EVP_MAX_MD_SIZE];
-    unsigned int diglen;
-
-    if (strcmp(str, "hash"))
-        return s2i_ASN1_OCTET_STRING(method, ctx, str);
-
-    if (!(oct = ASN1_OCTET_STRING_new())) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-
-    if (ctx && (ctx->flags == CTX_TEST))
-        return oct;
-
-    if (!ctx || (!ctx->subject_req && !ctx->subject_cert)) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PUBLIC_KEY);
-        goto err;
-    }
-
-    if (ctx->subject_req)
-        pk = ctx->subject_req->req_info->pubkey->public_key;
-    else
-        pk = ctx->subject_cert->cert_info->key->public_key;
-
-    if (!pk) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PUBLIC_KEY);
-        goto err;
-    }
-
-    if (!EVP_Digest
-        (pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), NULL))
-        goto err;
-
-    if (!ASN1_OCTET_STRING_set(oct, pkey_dig, diglen)) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-
-    return oct;
-
- err:
+  if (!(oct->data = x509v3_hex_to_bytes(str, &length))) {
     ASN1_OCTET_STRING_free(oct);
     return NULL;
+  }
+
+  oct->length = length;
+
+  return oct;
 }
+
+static char *i2s_ASN1_OCTET_STRING_cb(const X509V3_EXT_METHOD *method,
+                                      void *ext) {
+  return i2s_ASN1_OCTET_STRING(method, ext);
+}
+
+static void *s2i_skey_id(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
+                         const char *str) {
+  ASN1_OCTET_STRING *oct;
+  ASN1_BIT_STRING *pk;
+  unsigned char pkey_dig[EVP_MAX_MD_SIZE];
+  unsigned int diglen;
+
+  if (strcmp(str, "hash")) {
+    return s2i_ASN1_OCTET_STRING(method, ctx, str);
+  }
+
+  if (!(oct = ASN1_OCTET_STRING_new())) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    return NULL;
+  }
+
+  if (ctx && (ctx->flags == CTX_TEST)) {
+    return oct;
+  }
+
+  if (!ctx || (!ctx->subject_req && !ctx->subject_cert)) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PUBLIC_KEY);
+    goto err;
+  }
+
+  if (ctx->subject_req) {
+    pk = ctx->subject_req->req_info->pubkey->public_key;
+  } else {
+    pk = ctx->subject_cert->cert_info->key->public_key;
+  }
+
+  if (!pk) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PUBLIC_KEY);
+    goto err;
+  }
+
+  if (!EVP_Digest(pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), NULL)) {
+    goto err;
+  }
+
+  if (!ASN1_OCTET_STRING_set(oct, pkey_dig, diglen)) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+
+  return oct;
+
+err:
+  ASN1_OCTET_STRING_free(oct);
+  return NULL;
+}
+
+const X509V3_EXT_METHOD v3_skey_id = {
+    NID_subject_key_identifier,
+    0,
+    ASN1_ITEM_ref(ASN1_OCTET_STRING),
+    0,
+    0,
+    0,
+    0,
+    i2s_ASN1_OCTET_STRING_cb,
+    s2i_skey_id,
+    0,
+    0,
+    0,
+    0,
+    NULL,
+};
diff --git a/src/crypto/x509v3/v3_utl.c b/src/crypto/x509v3/v3_utl.c
index 5d91aed..a78127b 100644
--- a/src/crypto/x509v3/v3_utl.c
+++ b/src/crypto/x509v3/v3_utl.c
@@ -63,6 +63,7 @@
 #include <string.h>
 
 #include <openssl/bn.h>
+#include <openssl/bytestring.h>
 #include <openssl/conf.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
@@ -75,1363 +76,1315 @@
 
 
 static char *strip_spaces(char *name);
-static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b);
-static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
-                                           GENERAL_NAMES *gens);
+static int sk_strcmp(const char **a, const char **b);
+static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name,
+                                           const GENERAL_NAMES *gens);
 static void str_free(OPENSSL_STRING str);
-static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email);
+static int append_ia5(STACK_OF(OPENSSL_STRING) **sk,
+                      const ASN1_IA5STRING *email);
 
 static int ipv4_from_asc(unsigned char v4[4], const char *in);
 static int ipv6_from_asc(unsigned char v6[16], const char *in);
-static int ipv6_cb(const char *elem, int len, void *usr);
-static int ipv6_hex(unsigned char *out, const char *in, int inlen);
+static int ipv6_cb(const char *elem, size_t len, void *usr);
+static int ipv6_hex(unsigned char *out, const char *in, size_t inlen);
 
-/* Add a CONF_VALUE name value pair to stack */
+// Add a CONF_VALUE name value pair to stack
 
 static int x509V3_add_len_value(const char *name, const char *value,
                                 size_t value_len, int omit_value,
-                                STACK_OF(CONF_VALUE) **extlist)
-{
-    CONF_VALUE *vtmp = NULL;
-    char *tname = NULL, *tvalue = NULL;
-    int extlist_was_null = *extlist == NULL;
-    if (name && !(tname = OPENSSL_strdup(name)))
-        goto malloc_err;
-    if (!omit_value) {
-        /* |CONF_VALUE| cannot represent strings with NULs. */
-        if (OPENSSL_memchr(value, 0, value_len)) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_VALUE);
-            goto err;
-        }
-        tvalue = OPENSSL_strndup(value, value_len);
-        if (tvalue == NULL) {
-            goto malloc_err;
-        }
+                                STACK_OF(CONF_VALUE) **extlist) {
+  CONF_VALUE *vtmp = NULL;
+  char *tname = NULL, *tvalue = NULL;
+  int extlist_was_null = *extlist == NULL;
+  if (name && !(tname = OPENSSL_strdup(name))) {
+    goto malloc_err;
+  }
+  if (!omit_value) {
+    // |CONF_VALUE| cannot represent strings with NULs.
+    if (OPENSSL_memchr(value, 0, value_len)) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_VALUE);
+      goto err;
     }
-    if (!(vtmp = CONF_VALUE_new()))
-        goto malloc_err;
-    if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null()))
-        goto malloc_err;
-    vtmp->section = NULL;
-    vtmp->name = tname;
-    vtmp->value = tvalue;
-    if (!sk_CONF_VALUE_push(*extlist, vtmp))
-        goto malloc_err;
-    return 1;
- malloc_err:
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
- err:
-    if (extlist_was_null) {
-        sk_CONF_VALUE_free(*extlist);
-        *extlist = NULL;
+    tvalue = OPENSSL_strndup(value, value_len);
+    if (tvalue == NULL) {
+      goto malloc_err;
     }
-    OPENSSL_free(vtmp);
-    OPENSSL_free(tname);
-    OPENSSL_free(tvalue);
-    return 0;
+  }
+  if (!(vtmp = CONF_VALUE_new())) {
+    goto malloc_err;
+  }
+  if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) {
+    goto malloc_err;
+  }
+  vtmp->section = NULL;
+  vtmp->name = tname;
+  vtmp->value = tvalue;
+  if (!sk_CONF_VALUE_push(*extlist, vtmp)) {
+    goto malloc_err;
+  }
+  return 1;
+malloc_err:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+err:
+  if (extlist_was_null) {
+    sk_CONF_VALUE_free(*extlist);
+    *extlist = NULL;
+  }
+  OPENSSL_free(vtmp);
+  OPENSSL_free(tname);
+  OPENSSL_free(tvalue);
+  return 0;
 }
 
 int X509V3_add_value(const char *name, const char *value,
-                     STACK_OF(CONF_VALUE) **extlist)
-{
-    return x509V3_add_len_value(name, value, value != NULL ? strlen(value) : 0,
-                                /*omit_value=*/value == NULL, extlist);
+                     STACK_OF(CONF_VALUE) **extlist) {
+  return x509V3_add_len_value(name, value, value != NULL ? strlen(value) : 0,
+                              /*omit_value=*/value == NULL, extlist);
 }
 
 int X509V3_add_value_uchar(const char *name, const unsigned char *value,
-                           STACK_OF(CONF_VALUE) **extlist)
-{
-    return X509V3_add_value(name, (const char *)value, extlist);
+                           STACK_OF(CONF_VALUE) **extlist) {
+  return X509V3_add_value(name, (const char *)value, extlist);
 }
 
 int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value,
-                                 STACK_OF(CONF_VALUE) **extlist)
-{
-    return x509V3_add_len_value(name, (const char *)value->data, value->length,
-                                /*omit_value=*/0, extlist);
+                                 STACK_OF(CONF_VALUE) **extlist) {
+  return x509V3_add_len_value(name, (const char *)value->data, value->length,
+                              /*omit_value=*/0, extlist);
 }
 
-/* Free function for STACK_OF(CONF_VALUE) */
+// Free function for STACK_OF(CONF_VALUE)
 
-void X509V3_conf_free(CONF_VALUE *conf)
-{
-    if (!conf)
-        return;
-    if (conf->name)
-        OPENSSL_free(conf->name);
-    if (conf->value)
-        OPENSSL_free(conf->value);
-    if (conf->section)
-        OPENSSL_free(conf->section);
-    OPENSSL_free(conf);
+void X509V3_conf_free(CONF_VALUE *conf) {
+  if (!conf) {
+    return;
+  }
+  OPENSSL_free(conf->name);
+  OPENSSL_free(conf->value);
+  OPENSSL_free(conf->section);
+  OPENSSL_free(conf);
 }
 
 int X509V3_add_value_bool(const char *name, int asn1_bool,
-                          STACK_OF(CONF_VALUE) **extlist)
-{
-    if (asn1_bool)
-        return X509V3_add_value(name, "TRUE", extlist);
-    return X509V3_add_value(name, "FALSE", extlist);
+                          STACK_OF(CONF_VALUE) **extlist) {
+  if (asn1_bool) {
+    return X509V3_add_value(name, "TRUE", extlist);
+  }
+  return X509V3_add_value(name, "FALSE", extlist);
 }
 
 int X509V3_add_value_bool_nf(const char *name, int asn1_bool,
-                             STACK_OF(CONF_VALUE) **extlist)
-{
-    if (asn1_bool)
-        return X509V3_add_value(name, "TRUE", extlist);
-    return 1;
+                             STACK_OF(CONF_VALUE) **extlist) {
+  if (asn1_bool) {
+    return X509V3_add_value(name, "TRUE", extlist);
+  }
+  return 1;
 }
 
-static char *bignum_to_string(const BIGNUM *bn)
-{
-    char *tmp, *ret;
-    size_t len;
+static char *bignum_to_string(const BIGNUM *bn) {
+  char *tmp, *ret;
+  size_t len;
 
-    /*
-     * Display large numbers in hex and small numbers in decimal. Converting to
-     * decimal takes quadratic time and is no more useful than hex for large
-     * numbers.
-     */
-    if (BN_num_bits(bn) < 32) {
-        return BN_bn2dec(bn);
-    }
+  // Display large numbers in hex and small numbers in decimal. Converting to
+  // decimal takes quadratic time and is no more useful than hex for large
+  // numbers.
+  if (BN_num_bits(bn) < 32) {
+    return BN_bn2dec(bn);
+  }
 
-    tmp = BN_bn2hex(bn);
-    if (tmp == NULL) {
-        return NULL;
-    }
+  tmp = BN_bn2hex(bn);
+  if (tmp == NULL) {
+    return NULL;
+  }
 
-    len = strlen(tmp) + 3;
-    ret = OPENSSL_malloc(len);
-    if (ret == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        OPENSSL_free(tmp);
-        return NULL;
-    }
-
-    /* Prepend "0x", but place it after the "-" if negative. */
-    if (tmp[0] == '-') {
-        OPENSSL_strlcpy(ret, "-0x", len);
-        OPENSSL_strlcat(ret, tmp + 1, len);
-    } else {
-        OPENSSL_strlcpy(ret, "0x", len);
-        OPENSSL_strlcat(ret, tmp, len);
-    }
+  len = strlen(tmp) + 3;
+  ret = OPENSSL_malloc(len);
+  if (ret == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
     OPENSSL_free(tmp);
-    return ret;
+    return NULL;
+  }
+
+  // Prepend "0x", but place it after the "-" if negative.
+  if (tmp[0] == '-') {
+    OPENSSL_strlcpy(ret, "-0x", len);
+    OPENSSL_strlcat(ret, tmp + 1, len);
+  } else {
+    OPENSSL_strlcpy(ret, "0x", len);
+    OPENSSL_strlcat(ret, tmp, len);
+  }
+  OPENSSL_free(tmp);
+  return ret;
 }
 
-char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *method, const ASN1_ENUMERATED *a)
-{
-    BIGNUM *bntmp = NULL;
-    char *strtmp = NULL;
-    if (!a)
-        return NULL;
-    if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
-        !(strtmp = bignum_to_string(bntmp)))
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-    BN_free(bntmp);
-    return strtmp;
+char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *method,
+                          const ASN1_ENUMERATED *a) {
+  BIGNUM *bntmp = NULL;
+  char *strtmp = NULL;
+  if (!a) {
+    return NULL;
+  }
+  if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
+      !(strtmp = bignum_to_string(bntmp))) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  }
+  BN_free(bntmp);
+  return strtmp;
 }
 
-char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *method, const ASN1_INTEGER *a)
-{
-    BIGNUM *bntmp = NULL;
-    char *strtmp = NULL;
-    if (!a)
-        return NULL;
-    if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
-        !(strtmp = bignum_to_string(bntmp)))
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-    BN_free(bntmp);
-    return strtmp;
+char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *method, const ASN1_INTEGER *a) {
+  BIGNUM *bntmp = NULL;
+  char *strtmp = NULL;
+  if (!a) {
+    return NULL;
+  }
+  if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
+      !(strtmp = bignum_to_string(bntmp))) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  }
+  BN_free(bntmp);
+  return strtmp;
 }
 
-ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, const char *value)
-{
-    BIGNUM *bn = NULL;
-    ASN1_INTEGER *aint;
-    int isneg, ishex;
-    int ret;
-    if (!value) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
-        return 0;
-    }
-    bn = BN_new();
-    if (value[0] == '-') {
-        value++;
-        isneg = 1;
-    } else
-        isneg = 0;
+ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method,
+                               const char *value) {
+  BIGNUM *bn = NULL;
+  ASN1_INTEGER *aint;
+  int isneg, ishex;
+  int ret;
+  if (!value) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
+    return 0;
+  }
+  bn = BN_new();
+  if (value[0] == '-') {
+    value++;
+    isneg = 1;
+  } else {
+    isneg = 0;
+  }
 
-    if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
-        value += 2;
-        ishex = 1;
-    } else
-        ishex = 0;
+  if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
+    value += 2;
+    ishex = 1;
+  } else {
+    ishex = 0;
+  }
 
-    if (ishex)
-        ret = BN_hex2bn(&bn, value);
-    else
-        ret = BN_dec2bn(&bn, value);
+  if (ishex) {
+    ret = BN_hex2bn(&bn, value);
+  } else {
+    ret = BN_dec2bn(&bn, value);
+  }
 
-    if (!ret || value[ret]) {
-        BN_free(bn);
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR);
-        return 0;
-    }
-
-    if (isneg && BN_is_zero(bn))
-        isneg = 0;
-
-    aint = BN_to_ASN1_INTEGER(bn, NULL);
+  if (!ret || value[ret]) {
     BN_free(bn);
-    if (!aint) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
-        return 0;
-    }
-    if (isneg)
-        aint->type |= V_ASN1_NEG;
-    return aint;
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR);
+    return 0;
+  }
+
+  if (isneg && BN_is_zero(bn)) {
+    isneg = 0;
+  }
+
+  aint = BN_to_ASN1_INTEGER(bn, NULL);
+  BN_free(bn);
+  if (!aint) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
+    return 0;
+  }
+  if (isneg) {
+    aint->type |= V_ASN1_NEG;
+  }
+  return aint;
 }
 
 int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint,
-                         STACK_OF(CONF_VALUE) **extlist)
-{
-    char *strtmp;
-    int ret;
-    if (!aint)
-        return 1;
-    if (!(strtmp = i2s_ASN1_INTEGER(NULL, aint)))
-        return 0;
-    ret = X509V3_add_value(name, strtmp, extlist);
-    OPENSSL_free(strtmp);
-    return ret;
+                         STACK_OF(CONF_VALUE) **extlist) {
+  char *strtmp;
+  int ret;
+  if (!aint) {
+    return 1;
+  }
+  if (!(strtmp = i2s_ASN1_INTEGER(NULL, aint))) {
+    return 0;
+  }
+  ret = X509V3_add_value(name, strtmp, extlist);
+  OPENSSL_free(strtmp);
+  return ret;
 }
 
-int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool)
-{
-    char *btmp;
-    if (!(btmp = value->value))
-        goto err;
-    if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
-        || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
-        || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
-        *asn1_bool = 0xff;
-        return 1;
-    } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
-               || !strcmp(btmp, "N") || !strcmp(btmp, "n")
-               || !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
-        *asn1_bool = 0;
-        return 1;
-    }
- err:
-    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING);
+int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool) {
+  char *btmp;
+  if (!(btmp = value->value)) {
+    goto err;
+  }
+  if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true") || !strcmp(btmp, "Y") ||
+      !strcmp(btmp, "y") || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
+    *asn1_bool = 0xff;
+    return 1;
+  } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false") ||
+             !strcmp(btmp, "N") || !strcmp(btmp, "n") || !strcmp(btmp, "NO") ||
+             !strcmp(btmp, "no")) {
+    *asn1_bool = 0;
+    return 1;
+  }
+err:
+  OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING);
+  X509V3_conf_err(value);
+  return 0;
+}
+
+int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint) {
+  ASN1_INTEGER *itmp;
+  if (!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
     X509V3_conf_err(value);
     return 0;
+  }
+  *aint = itmp;
+  return 1;
 }
 
-int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint)
-{
-    ASN1_INTEGER *itmp;
-    if (!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
-        X509V3_conf_err(value);
-        return 0;
-    }
-    *aint = itmp;
-    return 1;
-}
+#define HDR_NAME 1
+#define HDR_VALUE 2
 
-#define HDR_NAME        1
-#define HDR_VALUE       2
+// #define DEBUG
 
-/*
- * #define DEBUG
- */
-
-STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)
-{
-    char *p, *q, c;
-    char *ntmp, *vtmp;
-    STACK_OF(CONF_VALUE) *values = NULL;
-    char *linebuf;
-    int state;
-    /* We are going to modify the line so copy it first */
-    linebuf = OPENSSL_strdup(line);
-    if (linebuf == NULL) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        goto err;
-    }
-    state = HDR_NAME;
-    ntmp = NULL;
-    /* Go through all characters */
-    for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n');
-         p++) {
-
-        switch (state) {
-        case HDR_NAME:
-            if (c == ':') {
-                state = HDR_VALUE;
-                *p = 0;
-                ntmp = strip_spaces(q);
-                if (!ntmp) {
-                    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
-                    goto err;
-                }
-                q = p + 1;
-            } else if (c == ',') {
-                *p = 0;
-                ntmp = strip_spaces(q);
-                q = p + 1;
+STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) {
+  char *p, *q, c;
+  char *ntmp, *vtmp;
+  STACK_OF(CONF_VALUE) *values = NULL;
+  char *linebuf;
+  int state;
+  // We are going to modify the line so copy it first
+  linebuf = OPENSSL_strdup(line);
+  if (linebuf == NULL) {
+    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+    goto err;
+  }
+  state = HDR_NAME;
+  ntmp = NULL;
+  // Go through all characters
+  for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n'); p++) {
+    switch (state) {
+      case HDR_NAME:
+        if (c == ':') {
+          state = HDR_VALUE;
+          *p = 0;
+          ntmp = strip_spaces(q);
+          if (!ntmp) {
+            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
+            goto err;
+          }
+          q = p + 1;
+        } else if (c == ',') {
+          *p = 0;
+          ntmp = strip_spaces(q);
+          q = p + 1;
 #if 0
                 printf("%s\n", ntmp);
 #endif
-                if (!ntmp) {
-                    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
-                    goto err;
-                }
-                X509V3_add_value(ntmp, NULL, &values);
-            }
-            break;
+          if (!ntmp) {
+            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
+            goto err;
+          }
+          X509V3_add_value(ntmp, NULL, &values);
+        }
+        break;
 
-        case HDR_VALUE:
-            if (c == ',') {
-                state = HDR_NAME;
-                *p = 0;
-                vtmp = strip_spaces(q);
+      case HDR_VALUE:
+        if (c == ',') {
+          state = HDR_NAME;
+          *p = 0;
+          vtmp = strip_spaces(q);
 #if 0
                 printf("%s\n", ntmp);
 #endif
-                if (!vtmp) {
-                    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
-                    goto err;
-                }
-                X509V3_add_value(ntmp, vtmp, &values);
-                ntmp = NULL;
-                q = p + 1;
-            }
-
+          if (!vtmp) {
+            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
+            goto err;
+          }
+          X509V3_add_value(ntmp, vtmp, &values);
+          ntmp = NULL;
+          q = p + 1;
         }
     }
+  }
 
-    if (state == HDR_VALUE) {
-        vtmp = strip_spaces(q);
+  if (state == HDR_VALUE) {
+    vtmp = strip_spaces(q);
 #if 0
         printf("%s=%s\n", ntmp, vtmp);
 #endif
-        if (!vtmp) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
-            goto err;
-        }
-        X509V3_add_value(ntmp, vtmp, &values);
-    } else {
-        ntmp = strip_spaces(q);
+    if (!vtmp) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
+      goto err;
+    }
+    X509V3_add_value(ntmp, vtmp, &values);
+  } else {
+    ntmp = strip_spaces(q);
 #if 0
         printf("%s\n", ntmp);
 #endif
-        if (!ntmp) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
-            goto err;
-        }
-        X509V3_add_value(ntmp, NULL, &values);
+    if (!ntmp) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
+      goto err;
     }
-    OPENSSL_free(linebuf);
-    return values;
-
- err:
-    OPENSSL_free(linebuf);
-    sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
-    return NULL;
-
-}
-
-/* Delete leading and trailing spaces from a string */
-static char *strip_spaces(char *name)
-{
-    char *p, *q;
-    /* Skip over leading spaces */
-    p = name;
-    while (*p && isspace((unsigned char)*p))
-        p++;
-    if (!*p)
-        return NULL;
-    q = p + strlen(p) - 1;
-    while ((q != p) && isspace((unsigned char)*q))
-        q--;
-    if (p != q)
-        q[1] = 0;
-    if (!*p)
-        return NULL;
-    return p;
-}
-
-/* hex string utilities */
-
-/*
- * Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
- * hex representation @@@ (Contents of buffer are always kept in ASCII, also
- * on EBCDIC machines)
- */
-
-char *x509v3_bytes_to_hex(const unsigned char *buffer, long len)
-{
-    char *tmp, *q;
-    const unsigned char *p;
-    int i;
-    static const char hexdig[] = "0123456789ABCDEF";
-    if (!buffer || !len)
-        return NULL;
-    if (!(tmp = OPENSSL_malloc(len * 3 + 1))) {
-        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
-    q = tmp;
-    for (i = 0, p = buffer; i < len; i++, p++) {
-        *q++ = hexdig[(*p >> 4) & 0xf];
-        *q++ = hexdig[*p & 0xf];
-        *q++ = ':';
-    }
-    q[-1] = 0;
-
-    return tmp;
-}
-
-unsigned char *x509v3_hex_to_bytes(const char *str, long *len)
-{
-    unsigned char *hexbuf, *q;
-    unsigned char ch, cl, *p;
-    if (!str) {
-        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
-        return NULL;
-    }
-    if (!(hexbuf = OPENSSL_malloc(strlen(str) >> 1)))
-        goto err;
-    for (p = (unsigned char *)str, q = hexbuf; *p;) {
-        ch = *p++;
-        if (ch == ':')
-            continue;
-        cl = *p++;
-        if (!cl) {
-            OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS);
-            OPENSSL_free(hexbuf);
-            return NULL;
-        }
-
-        if ((ch >= '0') && (ch <= '9'))
-            ch -= '0';
-        else if ((ch >= 'a') && (ch <= 'f'))
-            ch -= 'a' - 10;
-        else if ((ch >= 'A') && (ch <= 'F'))
-            ch -= 'A' - 10;
-        else
-            goto badhex;
-
-        if ((cl >= '0') && (cl <= '9'))
-            cl -= '0';
-        else if ((cl >= 'a') && (cl <= 'f'))
-            cl -= 'a' - 10;
-        else if ((cl >= 'A') && (cl <= 'F'))
-            cl -= 'A' - 10;
-        else
-            goto badhex;
-
-        *q++ = (ch << 4) | cl;
-    }
-
-    if (len)
-        *len = q - hexbuf;
-
-    return hexbuf;
-
- err:
-    if (hexbuf)
-        OPENSSL_free(hexbuf);
-    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
-    return NULL;
-
- badhex:
-    OPENSSL_free(hexbuf);
-    OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
-    return NULL;
-
-}
-
-int x509v3_name_cmp(const char *name, const char *cmp)
-{
-    int len, ret;
-    char c;
-    len = strlen(cmp);
-    if ((ret = strncmp(name, cmp, len)))
-        return ret;
-    c = name[len];
-    if (!c || (c == '.'))
-        return 0;
-    return 1;
-}
-
-static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b)
-{
-    return strcmp(*a, *b);
-}
-
-STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
-{
-    GENERAL_NAMES *gens;
-    STACK_OF(OPENSSL_STRING) *ret;
-
-    gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
-    ret = get_email(X509_get_subject_name(x), gens);
-    sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
-    return ret;
-}
-
-STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x)
-{
-    AUTHORITY_INFO_ACCESS *info;
-    STACK_OF(OPENSSL_STRING) *ret = NULL;
-    size_t i;
-
-    info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
-    if (!info)
-        return NULL;
-    for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
-        ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
-        if (OBJ_obj2nid(ad->method) == NID_ad_OCSP) {
-            if (ad->location->type == GEN_URI) {
-                if (!append_ia5
-                    (&ret, ad->location->d.uniformResourceIdentifier))
-                    break;
-            }
-        }
-    }
-    AUTHORITY_INFO_ACCESS_free(info);
-    return ret;
-}
-
-STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x)
-{
-    GENERAL_NAMES *gens;
-    STACK_OF(X509_EXTENSION) *exts;
-    STACK_OF(OPENSSL_STRING) *ret;
-
-    exts = X509_REQ_get_extensions(x);
-    gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
-    ret = get_email(X509_REQ_get_subject_name(x), gens);
-    sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
-    sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
-    return ret;
-}
-
-static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
-                                           GENERAL_NAMES *gens)
-{
-    STACK_OF(OPENSSL_STRING) *ret = NULL;
-    X509_NAME_ENTRY *ne;
-    ASN1_IA5STRING *email;
-    GENERAL_NAME *gen;
-    int i;
-    size_t j;
-    /* Now add any email address(es) to STACK */
-    i = -1;
-    /* First supplied X509_NAME */
-    while ((i = X509_NAME_get_index_by_NID(name,
-                                           NID_pkcs9_emailAddress, i)) >= 0) {
-        ne = X509_NAME_get_entry(name, i);
-        email = X509_NAME_ENTRY_get_data(ne);
-        if (!append_ia5(&ret, email))
-            return NULL;
-    }
-    for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) {
-        gen = sk_GENERAL_NAME_value(gens, j);
-        if (gen->type != GEN_EMAIL)
-            continue;
-        if (!append_ia5(&ret, gen->d.ia5))
-            return NULL;
-    }
-    return ret;
-}
-
-static void str_free(OPENSSL_STRING str)
-{
-    OPENSSL_free(str);
-}
-
-static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
-{
-    /* First some sanity checks */
-    if (email->type != V_ASN1_IA5STRING)
-        return 1;
-    if (email->data == NULL || email->length == 0)
-        return 1;
-    /* |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not
-     * report them as outputs. */
-    if (OPENSSL_memchr(email->data, 0, email->length) != NULL)
-        return 1;
-
-    char *emtmp = NULL;
-    if (!*sk)
-        *sk = sk_OPENSSL_STRING_new(sk_strcmp);
-    if (!*sk)
-        goto err;
-
-    emtmp = OPENSSL_strndup((char *)email->data, email->length);
-    if (emtmp == NULL) {
-        goto err;
-    }
-
-    /* Don't add duplicates */
-    sk_OPENSSL_STRING_sort(*sk);
-    if (sk_OPENSSL_STRING_find(*sk, NULL, emtmp)) {
-        OPENSSL_free(emtmp);
-        return 1;
-    }
-    if (!sk_OPENSSL_STRING_push(*sk, emtmp)) {
-        goto err;
-    }
-    return 1;
+    X509V3_add_value(ntmp, NULL, &values);
+  }
+  OPENSSL_free(linebuf);
+  return values;
 
 err:
-    /* TODO(davidben): Fix the error-handling in this file. It currently relies
-     * on |append_ia5| leaving |*sk| at NULL on error. */
-    OPENSSL_free(emtmp);
-    X509_email_free(*sk);
-    *sk = NULL;
+  OPENSSL_free(linebuf);
+  sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
+  return NULL;
+}
+
+// Delete leading and trailing spaces from a string
+static char *strip_spaces(char *name) {
+  char *p, *q;
+  // Skip over leading spaces
+  p = name;
+  while (*p && isspace((unsigned char)*p)) {
+    p++;
+  }
+  if (!*p) {
+    return NULL;
+  }
+  q = p + strlen(p) - 1;
+  while ((q != p) && isspace((unsigned char)*q)) {
+    q--;
+  }
+  if (p != q) {
+    q[1] = 0;
+  }
+  if (!*p) {
+    return NULL;
+  }
+  return p;
+}
+
+// hex string utilities
+
+char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) {
+  CBB cbb;
+  if (!CBB_init(&cbb, len * 3 + 1)) {
+    goto err;
+  }
+  for (size_t i = 0; i < len; i++) {
+    static const char hex[] = "0123456789ABCDEF";
+    if ((i > 0 && !CBB_add_u8(&cbb, ':')) ||
+        !CBB_add_u8(&cbb, hex[in[i] >> 4]) ||
+        !CBB_add_u8(&cbb, hex[in[i] & 0xf])) {
+      goto err;
+    }
+  }
+  uint8_t *ret;
+  size_t unused_len;
+  if (!CBB_add_u8(&cbb, 0) || !CBB_finish(&cbb, &ret, &unused_len)) {
+    goto err;
+  }
+
+  return (char *)ret;
+
+err:
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  CBB_cleanup(&cbb);
+  return NULL;
+}
+
+unsigned char *x509v3_hex_to_bytes(const char *str, long *len) {
+  unsigned char *hexbuf, *q;
+  unsigned char ch, cl, *p;
+  if (!str) {
+    OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
+    return NULL;
+  }
+  if (!(hexbuf = OPENSSL_malloc(strlen(str) >> 1))) {
+    goto err;
+  }
+  for (p = (unsigned char *)str, q = hexbuf; *p;) {
+    ch = *p++;
+    if (ch == ':') {
+      continue;
+    }
+    cl = *p++;
+    if (!cl) {
+      OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS);
+      OPENSSL_free(hexbuf);
+      return NULL;
+    }
+
+    if ((ch >= '0') && (ch <= '9')) {
+      ch -= '0';
+    } else if ((ch >= 'a') && (ch <= 'f')) {
+      ch -= 'a' - 10;
+    } else if ((ch >= 'A') && (ch <= 'F')) {
+      ch -= 'A' - 10;
+    } else {
+      goto badhex;
+    }
+
+    if ((cl >= '0') && (cl <= '9')) {
+      cl -= '0';
+    } else if ((cl >= 'a') && (cl <= 'f')) {
+      cl -= 'a' - 10;
+    } else if ((cl >= 'A') && (cl <= 'F')) {
+      cl -= 'A' - 10;
+    } else {
+      goto badhex;
+    }
+
+    *q++ = (ch << 4) | cl;
+  }
+
+  if (len) {
+    *len = q - hexbuf;
+  }
+
+  return hexbuf;
+
+err:
+  OPENSSL_free(hexbuf);
+  OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
+  return NULL;
+
+badhex:
+  OPENSSL_free(hexbuf);
+  OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
+  return NULL;
+}
+
+int x509v3_name_cmp(const char *name, const char *cmp) {
+  int len, ret;
+  char c;
+  len = strlen(cmp);
+  if ((ret = strncmp(name, cmp, len))) {
+    return ret;
+  }
+  c = name[len];
+  if (!c || (c == '.')) {
     return 0;
+  }
+  return 1;
 }
 
-void X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
-{
-    sk_OPENSSL_STRING_pop_free(sk, str_free);
+static int sk_strcmp(const char **a, const char **b) { return strcmp(*a, *b); }
+
+STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x) {
+  GENERAL_NAMES *gens;
+  STACK_OF(OPENSSL_STRING) *ret;
+
+  gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
+  ret = get_email(X509_get_subject_name(x), gens);
+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+  return ret;
 }
 
-typedef int (*equal_fn) (const unsigned char *pattern, size_t pattern_len,
-                         const unsigned char *subject, size_t subject_len,
-                         unsigned int flags);
+STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x) {
+  AUTHORITY_INFO_ACCESS *info;
+  STACK_OF(OPENSSL_STRING) *ret = NULL;
+  size_t i;
 
-/* Skip pattern prefix to match "wildcard" subject */
-static void skip_prefix(const unsigned char **p, size_t *plen,
+  info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
+  if (!info) {
+    return NULL;
+  }
+  for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
+    ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
+    if (OBJ_obj2nid(ad->method) == NID_ad_OCSP) {
+      if (ad->location->type == GEN_URI) {
+        if (!append_ia5(&ret, ad->location->d.uniformResourceIdentifier)) {
+          break;
+        }
+      }
+    }
+  }
+  AUTHORITY_INFO_ACCESS_free(info);
+  return ret;
+}
+
+STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x) {
+  GENERAL_NAMES *gens;
+  STACK_OF(X509_EXTENSION) *exts;
+  STACK_OF(OPENSSL_STRING) *ret;
+
+  exts = X509_REQ_get_extensions(x);
+  gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
+  ret = get_email(X509_REQ_get_subject_name(x), gens);
+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
+  sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
+  return ret;
+}
+
+static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name,
+                                           const GENERAL_NAMES *gens) {
+  STACK_OF(OPENSSL_STRING) *ret = NULL;
+  // Now add any email address(es) to STACK
+  int i = -1;
+  // First supplied X509_NAME
+  while ((i = X509_NAME_get_index_by_NID(name, NID_pkcs9_emailAddress, i)) >=
+         0) {
+    const X509_NAME_ENTRY *ne = X509_NAME_get_entry(name, i);
+    const ASN1_IA5STRING *email = X509_NAME_ENTRY_get_data(ne);
+    if (!append_ia5(&ret, email)) {
+      return NULL;
+    }
+  }
+  for (size_t j = 0; j < sk_GENERAL_NAME_num(gens); j++) {
+    const GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, j);
+    if (gen->type != GEN_EMAIL) {
+      continue;
+    }
+    if (!append_ia5(&ret, gen->d.ia5)) {
+      return NULL;
+    }
+  }
+  return ret;
+}
+
+static void str_free(OPENSSL_STRING str) { OPENSSL_free(str); }
+
+static int append_ia5(STACK_OF(OPENSSL_STRING) **sk,
+                      const ASN1_IA5STRING *email) {
+  // First some sanity checks
+  if (email->type != V_ASN1_IA5STRING) {
+    return 1;
+  }
+  if (email->data == NULL || email->length == 0) {
+    return 1;
+  }
+  // |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not
+  // report them as outputs.
+  if (OPENSSL_memchr(email->data, 0, email->length) != NULL) {
+    return 1;
+  }
+
+  char *emtmp = NULL;
+  if (!*sk) {
+    *sk = sk_OPENSSL_STRING_new(sk_strcmp);
+  }
+  if (!*sk) {
+    goto err;
+  }
+
+  emtmp = OPENSSL_strndup((char *)email->data, email->length);
+  if (emtmp == NULL) {
+    goto err;
+  }
+
+  // Don't add duplicates
+  sk_OPENSSL_STRING_sort(*sk);
+  if (sk_OPENSSL_STRING_find(*sk, NULL, emtmp)) {
+    OPENSSL_free(emtmp);
+    return 1;
+  }
+  if (!sk_OPENSSL_STRING_push(*sk, emtmp)) {
+    goto err;
+  }
+  return 1;
+
+err:
+  // TODO(davidben): Fix the error-handling in this file. It currently relies
+  // on |append_ia5| leaving |*sk| at NULL on error.
+  OPENSSL_free(emtmp);
+  X509_email_free(*sk);
+  *sk = NULL;
+  return 0;
+}
+
+void X509_email_free(STACK_OF(OPENSSL_STRING) *sk) {
+  sk_OPENSSL_STRING_pop_free(sk, str_free);
+}
+
+typedef int (*equal_fn)(const unsigned char *pattern, size_t pattern_len,
                         const unsigned char *subject, size_t subject_len,
-                        unsigned int flags)
-{
-    const unsigned char *pattern = *p;
-    size_t pattern_len = *plen;
+                        unsigned int flags);
 
-    /*
-     * If subject starts with a leading '.' followed by more octets, and
-     * pattern is longer, compare just an equal-length suffix with the
-     * full subject (starting at the '.'), provided the prefix contains
-     * no NULs.
-     */
-    if ((flags & _X509_CHECK_FLAG_DOT_SUBDOMAINS) == 0)
-        return;
-
-    while (pattern_len > subject_len && *pattern) {
-        if ((flags & X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS) &&
-            *pattern == '.')
-            break;
-        ++pattern;
-        --pattern_len;
-    }
-
-    /* Skip if entire prefix acceptable */
-    if (pattern_len == subject_len) {
-        *p = pattern;
-        *plen = pattern_len;
-    }
-}
-
-/* Compare while ASCII ignoring case. */
+// Compare while ASCII ignoring case.
 static int equal_nocase(const unsigned char *pattern, size_t pattern_len,
                         const unsigned char *subject, size_t subject_len,
-                        unsigned int flags)
-{
-    skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
-    if (pattern_len != subject_len)
-        return 0;
-    while (pattern_len) {
-        unsigned char l = *pattern;
-        unsigned char r = *subject;
-        /* The pattern must not contain NUL characters. */
-        if (l == 0)
-            return 0;
-        if (l != r) {
-            if ('A' <= l && l <= 'Z')
-                l = (l - 'A') + 'a';
-            if ('A' <= r && r <= 'Z')
-                r = (r - 'A') + 'a';
-            if (l != r)
-                return 0;
-        }
-        ++pattern;
-        ++subject;
-        --pattern_len;
+                        unsigned int flags) {
+  if (pattern_len != subject_len) {
+    return 0;
+  }
+  while (pattern_len) {
+    unsigned char l = *pattern;
+    unsigned char r = *subject;
+    // The pattern must not contain NUL characters.
+    if (l == 0) {
+      return 0;
     }
-    return 1;
+    if (l != r) {
+      if ('A' <= l && l <= 'Z') {
+        l = (l - 'A') + 'a';
+      }
+      if ('A' <= r && r <= 'Z') {
+        r = (r - 'A') + 'a';
+      }
+      if (l != r) {
+        return 0;
+      }
+    }
+    ++pattern;
+    ++subject;
+    --pattern_len;
+  }
+  return 1;
 }
 
-/* Compare using OPENSSL_memcmp. */
+// Compare using OPENSSL_memcmp.
 static int equal_case(const unsigned char *pattern, size_t pattern_len,
                       const unsigned char *subject, size_t subject_len,
-                      unsigned int flags)
-{
-    skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
-    if (pattern_len != subject_len)
-        return 0;
-    return !OPENSSL_memcmp(pattern, subject, pattern_len);
+                      unsigned int flags) {
+  if (pattern_len != subject_len) {
+    return 0;
+  }
+  return !OPENSSL_memcmp(pattern, subject, pattern_len);
 }
 
-/*
- * RFC 5280, section 7.5, requires that only the domain is compared in a
- * case-insensitive manner.
- */
+// RFC 5280, section 7.5, requires that only the domain is compared in a
+// case-insensitive manner.
 static int equal_email(const unsigned char *a, size_t a_len,
                        const unsigned char *b, size_t b_len,
-                       unsigned int unused_flags)
-{
-    size_t i = a_len;
-    if (a_len != b_len)
+                       unsigned int unused_flags) {
+  size_t i = a_len;
+  if (a_len != b_len) {
+    return 0;
+  }
+  // We search backwards for the '@' character, so that we do not have to
+  // deal with quoted local-parts.  The domain part is compared in a
+  // case-insensitive manner.
+  while (i > 0) {
+    --i;
+    if (a[i] == '@' || b[i] == '@') {
+      if (!equal_nocase(a + i, a_len - i, b + i, a_len - i, 0)) {
         return 0;
-    /*
-     * We search backwards for the '@' character, so that we do not have to
-     * deal with quoted local-parts.  The domain part is compared in a
-     * case-insensitive manner.
-     */
-    while (i > 0) {
-        --i;
-        if (a[i] == '@' || b[i] == '@') {
-            if (!equal_nocase(a + i, a_len - i, b + i, a_len - i, 0))
-                return 0;
-            break;
-        }
+      }
+      break;
     }
-    if (i == 0)
-        i = a_len;
-    return equal_case(a, i, b, i, 0);
+  }
+  if (i == 0) {
+    i = a_len;
+  }
+  return equal_case(a, i, b, i, 0);
 }
 
-/*
- * Compare the prefix and suffix with the subject, and check that the
- * characters in-between are valid.
- */
+// Compare the prefix and suffix with the subject, and check that the
+// characters in-between are valid.
 static int wildcard_match(const unsigned char *prefix, size_t prefix_len,
                           const unsigned char *suffix, size_t suffix_len,
                           const unsigned char *subject, size_t subject_len,
-                          unsigned int flags)
-{
-    const unsigned char *wildcard_start;
-    const unsigned char *wildcard_end;
-    const unsigned char *p;
-    int allow_multi = 0;
-    int allow_idna = 0;
+                          unsigned int flags) {
+  const unsigned char *wildcard_start;
+  const unsigned char *wildcard_end;
+  const unsigned char *p;
+  int allow_idna = 0;
 
-    if (subject_len < prefix_len + suffix_len)
-        return 0;
-    if (!equal_nocase(prefix, prefix_len, subject, prefix_len, flags))
-        return 0;
-    wildcard_start = subject + prefix_len;
-    wildcard_end = subject + (subject_len - suffix_len);
-    if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags))
-        return 0;
-    /*
-     * If the wildcard makes up the entire first label, it must match at
-     * least one character.
-     */
-    if (prefix_len == 0 && *suffix == '.') {
-        if (wildcard_start == wildcard_end)
-            return 0;
-        allow_idna = 1;
-        if (flags & X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS)
-            allow_multi = 1;
+  if (subject_len < prefix_len + suffix_len) {
+    return 0;
+  }
+  if (!equal_nocase(prefix, prefix_len, subject, prefix_len, flags)) {
+    return 0;
+  }
+  wildcard_start = subject + prefix_len;
+  wildcard_end = subject + (subject_len - suffix_len);
+  if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags)) {
+    return 0;
+  }
+  // If the wildcard makes up the entire first label, it must match at
+  // least one character.
+  if (prefix_len == 0 && *suffix == '.') {
+    if (wildcard_start == wildcard_end) {
+      return 0;
     }
-    /* IDNA labels cannot match partial wildcards */
-    if (!allow_idna &&
-        subject_len >= 4
-        && OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0)
-        return 0;
-    /* The wildcard may match a literal '*' */
-    if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*')
-        return 1;
-    /*
-     * Check that the part matched by the wildcard contains only
-     * permitted characters and only matches a single label unless
-     * allow_multi is set.
-     */
-    for (p = wildcard_start; p != wildcard_end; ++p)
-        if (!(('0' <= *p && *p <= '9') ||
-              ('A' <= *p && *p <= 'Z') ||
-              ('a' <= *p && *p <= 'z') ||
-              *p == '-' || (allow_multi && *p == '.')))
-            return 0;
+    allow_idna = 1;
+  }
+  // IDNA labels cannot match partial wildcards
+  if (!allow_idna && subject_len >= 4 &&
+      OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0) {
+    return 0;
+  }
+  // The wildcard may match a literal '*'
+  if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*') {
     return 1;
+  }
+  // Check that the part matched by the wildcard contains only
+  // permitted characters and only matches a single label.
+  for (p = wildcard_start; p != wildcard_end; ++p) {
+    if (!(('0' <= *p && *p <= '9') || ('A' <= *p && *p <= 'Z') ||
+          ('a' <= *p && *p <= 'z') || *p == '-')) {
+      return 0;
+    }
+  }
+  return 1;
 }
 
-#define LABEL_START     (1 << 0)
-#define LABEL_END       (1 << 1)
-#define LABEL_HYPHEN    (1 << 2)
-#define LABEL_IDNA      (1 << 3)
+#define LABEL_START (1 << 0)
+#define LABEL_END (1 << 1)
+#define LABEL_HYPHEN (1 << 2)
+#define LABEL_IDNA (1 << 3)
 
 static const unsigned char *valid_star(const unsigned char *p, size_t len,
-                                       unsigned int flags)
-{
-    const unsigned char *star = 0;
-    size_t i;
-    int state = LABEL_START;
-    int dots = 0;
-    for (i = 0; i < len; ++i) {
-        /*
-         * Locate first and only legal wildcard, either at the start
-         * or end of a non-IDNA first and not final label.
-         */
-        if (p[i] == '*') {
-            int atstart = (state & LABEL_START);
-            int atend = (i == len - 1 || p[i + 1] == '.');
-            /*
-             * At most one wildcard per pattern.
-             * No wildcards in IDNA labels.
-             * No wildcards after the first label.
-             */
-            if (star != NULL || (state & LABEL_IDNA) != 0 || dots)
-                return NULL;
-            /* Only full-label '*.example.com' wildcards? */
-            if ((flags & X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)
-                && (!atstart || !atend))
-                return NULL;
-            /* No 'foo*bar' wildcards */
-            if (!atstart && !atend)
-                return NULL;
-            star = &p[i];
-            state &= ~LABEL_START;
-        } else if (('a' <= p[i] && p[i] <= 'z')
-                   || ('A' <= p[i] && p[i] <= 'Z')
-                   || ('0' <= p[i] && p[i] <= '9')) {
-            if ((state & LABEL_START) != 0
-                && len - i >= 4
-                && OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0)
-                state |= LABEL_IDNA;
-            state &= ~(LABEL_HYPHEN | LABEL_START);
-        } else if (p[i] == '.') {
-            if ((state & (LABEL_HYPHEN | LABEL_START)) != 0)
-                return NULL;
-            state = LABEL_START;
-            ++dots;
-        } else if (p[i] == '-') {
-            /* no domain/subdomain starts with '-' */
-            if ((state & LABEL_START) != 0)
-                return NULL;
-            state |= LABEL_HYPHEN;
-        } else
-            return NULL;
-    }
-
-    /*
-     * The final label must not end in a hyphen or ".", and
-     * there must be at least two dots after the star.
-     */
-    if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2)
+                                       unsigned int flags) {
+  const unsigned char *star = 0;
+  size_t i;
+  int state = LABEL_START;
+  int dots = 0;
+  for (i = 0; i < len; ++i) {
+    // Locate first and only legal wildcard, either at the start
+    // or end of a non-IDNA first and not final label.
+    if (p[i] == '*') {
+      int atstart = (state & LABEL_START);
+      int atend = (i == len - 1 || p[i + 1] == '.');
+      // At most one wildcard per pattern.
+      // No wildcards in IDNA labels.
+      // No wildcards after the first label.
+      if (star != NULL || (state & LABEL_IDNA) != 0 || dots) {
         return NULL;
-    return star;
+      }
+      // Only full-label '*.example.com' wildcards.
+      if (!atstart || !atend) {
+        return NULL;
+      }
+      star = &p[i];
+      state &= ~LABEL_START;
+    } else if (('a' <= p[i] && p[i] <= 'z') || ('A' <= p[i] && p[i] <= 'Z') ||
+               ('0' <= p[i] && p[i] <= '9')) {
+      if ((state & LABEL_START) != 0 && len - i >= 4 &&
+          OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0) {
+        state |= LABEL_IDNA;
+      }
+      state &= ~(LABEL_HYPHEN | LABEL_START);
+    } else if (p[i] == '.') {
+      if ((state & (LABEL_HYPHEN | LABEL_START)) != 0) {
+        return NULL;
+      }
+      state = LABEL_START;
+      ++dots;
+    } else if (p[i] == '-') {
+      // no domain/subdomain starts with '-'
+      if ((state & LABEL_START) != 0) {
+        return NULL;
+      }
+      state |= LABEL_HYPHEN;
+    } else {
+      return NULL;
+    }
+  }
+
+  // The final label must not end in a hyphen or ".", and
+  // there must be at least two dots after the star.
+  if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2) {
+    return NULL;
+  }
+  return star;
 }
 
-/* Compare using wildcards. */
+// Compare using wildcards.
 static int equal_wildcard(const unsigned char *pattern, size_t pattern_len,
                           const unsigned char *subject, size_t subject_len,
-                          unsigned int flags)
-{
-    const unsigned char *star = NULL;
+                          unsigned int flags) {
+  const unsigned char *star = NULL;
 
-    /*
-     * Subject names starting with '.' can only match a wildcard pattern
-     * via a subject sub-domain pattern suffix match.
-     */
-    if (!(subject_len > 1 && subject[0] == '.'))
-        star = valid_star(pattern, pattern_len, flags);
-    if (star == NULL)
-        return equal_nocase(pattern, pattern_len,
-                            subject, subject_len, flags);
-    return wildcard_match(pattern, star - pattern,
-                          star + 1, (pattern + pattern_len) - star - 1,
-                          subject, subject_len, flags);
+  // Subject names starting with '.' can only match a wildcard pattern
+  // via a subject sub-domain pattern suffix match.
+  if (!(subject_len > 1 && subject[0] == '.')) {
+    star = valid_star(pattern, pattern_len, flags);
+  }
+  if (star == NULL) {
+    return equal_nocase(pattern, pattern_len, subject, subject_len, flags);
+  }
+  return wildcard_match(pattern, star - pattern, star + 1,
+                        (pattern + pattern_len) - star - 1, subject,
+                        subject_len, flags);
 }
 
 int x509v3_looks_like_dns_name(const unsigned char *in, size_t len) {
-    /* This function is used as a heuristic for whether a common name is a
-     * hostname to be matched, or merely a decorative name to describe the
-     * subject. This heuristic must be applied to both name constraints and the
-     * common name fallback, so it must be loose enough to accept hostname
-     * common names, and tight enough to reject decorative common names. */
+  // This function is used as a heuristic for whether a common name is a
+  // hostname to be matched, or merely a decorative name to describe the
+  // subject. This heuristic must be applied to both name constraints and the
+  // common name fallback, so it must be loose enough to accept hostname
+  // common names, and tight enough to reject decorative common names.
 
-    if (len > 0 && in[len - 1] == '.') {
-        len--;
+  if (len > 0 && in[len - 1] == '.') {
+    len--;
+  }
+
+  // Wildcards are allowed in front.
+  if (len >= 2 && in[0] == '*' && in[1] == '.') {
+    in += 2;
+    len -= 2;
+  }
+
+  if (len == 0) {
+    return 0;
+  }
+
+  size_t label_start = 0;
+  for (size_t i = 0; i < len; i++) {
+    unsigned char c = in[i];
+    if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
+        (c >= 'A' && c <= 'Z') || (c == '-' && i > label_start) ||
+        // These are not valid characters in hostnames, but commonly found
+        // in deployments outside the Web PKI.
+        c == '_' || c == ':') {
+      continue;
     }
 
-    /* Wildcards are allowed in front. */
-    if (len >= 2 && in[0] == '*' && in[1] == '.') {
-        in += 2;
-        len -= 2;
+    // Labels must not be empty.
+    if (c == '.' && i > label_start && i < len - 1) {
+      label_start = i + 1;
+      continue;
     }
 
-    if (len == 0) {
-        return 0;
-    }
+    return 0;
+  }
 
-    size_t label_start = 0;
-    for (size_t i = 0; i < len; i++) {
-        unsigned char c = in[i];
-        if ((c >= 'a' && c <= 'z') ||
-            (c >= '0' && c <= '9') ||
-            (c >= 'A' && c <= 'Z') ||
-            (c == '-' && i > label_start) ||
-            /* These are not valid characters in hostnames, but commonly found
-             * in deployments outside the Web PKI. */
-            c == '_' ||
-            c == ':') {
-            continue;
-        }
-
-        /* Labels must not be empty. */
-        if (c == '.' && i > label_start && i < len - 1) {
-            label_start = i + 1;
-            continue;
-        }
-
-        return 0;
-    }
-
-    return 1;
+  return 1;
 }
 
-/*
- * Compare an ASN1_STRING to a supplied string. If they match return 1. If
- * cmp_type > 0 only compare if string matches the type, otherwise convert it
- * to UTF8.
- */
+// Compare an ASN1_STRING to a supplied string. If they match return 1. If
+// cmp_type > 0 only compare if string matches the type, otherwise convert it
+// to UTF8.
 
-static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal,
+static int do_check_string(const ASN1_STRING *a, int cmp_type, equal_fn equal,
                            unsigned int flags, int check_type, const char *b,
-                           size_t blen, char **peername)
-{
-    int rv = 0;
+                           size_t blen, char **peername) {
+  int rv = 0;
 
-    if (!a->data || !a->length)
-        return 0;
-    if (cmp_type > 0) {
-        if (cmp_type != a->type)
-            return 0;
-        if (cmp_type == V_ASN1_IA5STRING)
-            rv = equal(a->data, a->length, (unsigned char *)b, blen, flags);
-        else if (a->length == (int)blen && !OPENSSL_memcmp(a->data, b, blen))
-            rv = 1;
-        if (rv > 0 && peername)
-            *peername = OPENSSL_strndup((char *)a->data, a->length);
-    } else {
-        int astrlen;
-        unsigned char *astr;
-        astrlen = ASN1_STRING_to_UTF8(&astr, a);
-        if (astrlen < 0)
-            return -1;
-        /*
-         * We check the common name against DNS name constraints if it passes
-         * |x509v3_looks_like_dns_name|. Thus we must not consider common names
-         * for DNS fallbacks if they fail this check.
-         */
-        if (check_type == GEN_DNS &&
-            !x509v3_looks_like_dns_name(astr, astrlen)) {
-            rv = 0;
-        } else {
-            rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
-        }
-        if (rv > 0 && peername)
-            *peername = OPENSSL_strndup((char *)astr, astrlen);
-        OPENSSL_free(astr);
+  if (!a->data || !a->length) {
+    return 0;
+  }
+  if (cmp_type > 0) {
+    if (cmp_type != a->type) {
+      return 0;
     }
-    return rv;
+    if (cmp_type == V_ASN1_IA5STRING) {
+      rv = equal(a->data, a->length, (unsigned char *)b, blen, flags);
+    } else if (a->length == (int)blen && !OPENSSL_memcmp(a->data, b, blen)) {
+      rv = 1;
+    }
+    if (rv > 0 && peername) {
+      *peername = OPENSSL_strndup((char *)a->data, a->length);
+    }
+  } else {
+    int astrlen;
+    unsigned char *astr;
+    astrlen = ASN1_STRING_to_UTF8(&astr, a);
+    if (astrlen < 0) {
+      return -1;
+    }
+    // We check the common name against DNS name constraints if it passes
+    // |x509v3_looks_like_dns_name|. Thus we must not consider common names
+    // for DNS fallbacks if they fail this check.
+    if (check_type == GEN_DNS && !x509v3_looks_like_dns_name(astr, astrlen)) {
+      rv = 0;
+    } else {
+      rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
+    }
+    if (rv > 0 && peername) {
+      *peername = OPENSSL_strndup((char *)astr, astrlen);
+    }
+    OPENSSL_free(astr);
+  }
+  return rv;
 }
 
 static int do_x509_check(X509 *x, const char *chk, size_t chklen,
-                         unsigned int flags, int check_type, char **peername)
-{
-    GENERAL_NAMES *gens = NULL;
-    X509_NAME *name = NULL;
-    size_t i;
-    int j;
-    int cnid = NID_undef;
-    int alt_type;
-    int rv = 0;
-    equal_fn equal;
-
-    /* See below, this flag is internal-only */
-    flags &= ~_X509_CHECK_FLAG_DOT_SUBDOMAINS;
-    if (check_type == GEN_EMAIL) {
-        cnid = NID_pkcs9_emailAddress;
-        alt_type = V_ASN1_IA5STRING;
-        equal = equal_email;
-    } else if (check_type == GEN_DNS) {
-        cnid = NID_commonName;
-        /* Implicit client-side DNS sub-domain pattern */
-        if (chklen > 1 && chk[0] == '.')
-            flags |= _X509_CHECK_FLAG_DOT_SUBDOMAINS;
-        alt_type = V_ASN1_IA5STRING;
-        if (flags & X509_CHECK_FLAG_NO_WILDCARDS)
-            equal = equal_nocase;
-        else
-            equal = equal_wildcard;
+                         unsigned int flags, int check_type, char **peername) {
+  int cnid = NID_undef;
+  int alt_type;
+  int rv = 0;
+  equal_fn equal;
+  if (check_type == GEN_EMAIL) {
+    cnid = NID_pkcs9_emailAddress;
+    alt_type = V_ASN1_IA5STRING;
+    equal = equal_email;
+  } else if (check_type == GEN_DNS) {
+    cnid = NID_commonName;
+    alt_type = V_ASN1_IA5STRING;
+    if (flags & X509_CHECK_FLAG_NO_WILDCARDS) {
+      equal = equal_nocase;
     } else {
-        alt_type = V_ASN1_OCTET_STRING;
-        equal = equal_case;
+      equal = equal_wildcard;
     }
+  } else {
+    alt_type = V_ASN1_OCTET_STRING;
+    equal = equal_case;
+  }
 
-    gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
-    if (gens) {
-        for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
-            GENERAL_NAME *gen;
-            ASN1_STRING *cstr;
-            gen = sk_GENERAL_NAME_value(gens, i);
-            if (gen->type != check_type)
-                continue;
-            if (check_type == GEN_EMAIL)
-                cstr = gen->d.rfc822Name;
-            else if (check_type == GEN_DNS)
-                cstr = gen->d.dNSName;
-            else
-                cstr = gen->d.iPAddress;
-            /* Positive on success, negative on error! */
-            if ((rv = do_check_string(cstr, alt_type, equal, flags, check_type,
-                                      chk, chklen, peername)) != 0)
-                break;
-        }
-        GENERAL_NAMES_free(gens);
-        return rv;
+  GENERAL_NAMES *gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
+  if (gens) {
+    for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
+      const GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i);
+      if (gen->type != check_type) {
+        continue;
+      }
+      const ASN1_STRING *cstr;
+      if (check_type == GEN_EMAIL) {
+        cstr = gen->d.rfc822Name;
+      } else if (check_type == GEN_DNS) {
+        cstr = gen->d.dNSName;
+      } else {
+        cstr = gen->d.iPAddress;
+      }
+      // Positive on success, negative on error!
+      if ((rv = do_check_string(cstr, alt_type, equal, flags, check_type, chk,
+                                chklen, peername)) != 0) {
+        break;
+      }
     }
+    GENERAL_NAMES_free(gens);
+    return rv;
+  }
 
-    /* We're done if CN-ID is not pertinent */
-    if (cnid == NID_undef || (flags & X509_CHECK_FLAG_NEVER_CHECK_SUBJECT))
-        return 0;
-
-    j = -1;
-    name = X509_get_subject_name(x);
-    while ((j = X509_NAME_get_index_by_NID(name, cnid, j)) >= 0) {
-        X509_NAME_ENTRY *ne;
-        ASN1_STRING *str;
-        ne = X509_NAME_get_entry(name, j);
-        str = X509_NAME_ENTRY_get_data(ne);
-        /* Positive on success, negative on error! */
-        if ((rv = do_check_string(str, -1, equal, flags, check_type,
-                                  chk, chklen, peername)) != 0)
-            return rv;
-    }
+  // We're done if CN-ID is not pertinent
+  if (cnid == NID_undef || (flags & X509_CHECK_FLAG_NEVER_CHECK_SUBJECT)) {
     return 0;
+  }
+
+  int j = -1;
+  const X509_NAME *name = X509_get_subject_name(x);
+  while ((j = X509_NAME_get_index_by_NID(name, cnid, j)) >= 0) {
+    const X509_NAME_ENTRY *ne = X509_NAME_get_entry(name, j);
+    const ASN1_STRING *str = X509_NAME_ENTRY_get_data(ne);
+    // Positive on success, negative on error!
+    if ((rv = do_check_string(str, -1, equal, flags, check_type, chk, chklen,
+                              peername)) != 0) {
+      return rv;
+    }
+  }
+  return 0;
 }
 
-int X509_check_host(X509 *x, const char *chk, size_t chklen,
-                    unsigned int flags, char **peername)
-{
-    if (chk == NULL)
-        return -2;
-    if (OPENSSL_memchr(chk, '\0', chklen))
-        return -2;
-    return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername);
+int X509_check_host(X509 *x, const char *chk, size_t chklen, unsigned int flags,
+                    char **peername) {
+  if (chk == NULL) {
+    return -2;
+  }
+  if (OPENSSL_memchr(chk, '\0', chklen)) {
+    return -2;
+  }
+  return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername);
 }
 
 int X509_check_email(X509 *x, const char *chk, size_t chklen,
-                     unsigned int flags)
-{
-    if (chk == NULL)
-        return -2;
-    if (OPENSSL_memchr(chk, '\0', chklen))
-        return -2;
-    return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL);
+                     unsigned int flags) {
+  if (chk == NULL) {
+    return -2;
+  }
+  if (OPENSSL_memchr(chk, '\0', chklen)) {
+    return -2;
+  }
+  return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL);
 }
 
 int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen,
-                  unsigned int flags)
-{
-    if (chk == NULL)
-        return -2;
-    return do_x509_check(x, (char *)chk, chklen, flags, GEN_IPADD, NULL);
+                  unsigned int flags) {
+  if (chk == NULL) {
+    return -2;
+  }
+  return do_x509_check(x, (char *)chk, chklen, flags, GEN_IPADD, NULL);
 }
 
-int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags)
-{
-    unsigned char ipout[16];
-    size_t iplen;
+int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags) {
+  unsigned char ipout[16];
+  size_t iplen;
 
-    if (ipasc == NULL)
-        return -2;
-    iplen = (size_t)x509v3_a2i_ipadd(ipout, ipasc);
-    if (iplen == 0)
-        return -2;
-    return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
+  if (ipasc == NULL) {
+    return -2;
+  }
+  iplen = (size_t)x509v3_a2i_ipadd(ipout, ipasc);
+  if (iplen == 0) {
+    return -2;
+  }
+  return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
 }
 
-/*
- * Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
- * with RFC 3280.
- */
+// Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
+// with RFC 3280.
 
-ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)
-{
-    unsigned char ipout[16];
-    ASN1_OCTET_STRING *ret;
-    int iplen;
+ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc) {
+  unsigned char ipout[16];
+  ASN1_OCTET_STRING *ret;
+  int iplen;
 
-    iplen = x509v3_a2i_ipadd(ipout, ipasc);
-    if (!iplen)
-        return NULL;
-
-    ret = ASN1_OCTET_STRING_new();
-    if (!ret)
-        return NULL;
-    if (!ASN1_OCTET_STRING_set(ret, ipout, iplen)) {
-        ASN1_OCTET_STRING_free(ret);
-        return NULL;
-    }
-    return ret;
-}
-
-ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
-{
-    ASN1_OCTET_STRING *ret = NULL;
-    unsigned char ipout[32];
-    char *iptmp = NULL, *p;
-    int iplen1, iplen2;
-    p = strchr(ipasc, '/');
-    if (!p)
-        return NULL;
-    iptmp = OPENSSL_strdup(ipasc);
-    if (!iptmp)
-        return NULL;
-    p = iptmp + (p - ipasc);
-    *p++ = 0;
-
-    iplen1 = x509v3_a2i_ipadd(ipout, iptmp);
-
-    if (!iplen1)
-        goto err;
-
-    iplen2 = x509v3_a2i_ipadd(ipout + iplen1, p);
-
-    OPENSSL_free(iptmp);
-    iptmp = NULL;
-
-    if (!iplen2 || (iplen1 != iplen2))
-        goto err;
-
-    ret = ASN1_OCTET_STRING_new();
-    if (!ret)
-        goto err;
-    if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
-        goto err;
-
-    return ret;
-
- err:
-    if (iptmp)
-        OPENSSL_free(iptmp);
-    if (ret)
-        ASN1_OCTET_STRING_free(ret);
+  iplen = x509v3_a2i_ipadd(ipout, ipasc);
+  if (!iplen) {
     return NULL;
+  }
+
+  ret = ASN1_OCTET_STRING_new();
+  if (!ret) {
+    return NULL;
+  }
+  if (!ASN1_OCTET_STRING_set(ret, ipout, iplen)) {
+    ASN1_OCTET_STRING_free(ret);
+    return NULL;
+  }
+  return ret;
 }
 
-int x509v3_a2i_ipadd(unsigned char ipout[16], const char *ipasc)
-{
-    /* If string contains a ':' assume IPv6 */
+ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc) {
+  ASN1_OCTET_STRING *ret = NULL;
+  unsigned char ipout[32];
+  char *iptmp = NULL, *p;
+  int iplen1, iplen2;
+  p = strchr(ipasc, '/');
+  if (!p) {
+    return NULL;
+  }
+  iptmp = OPENSSL_strdup(ipasc);
+  if (!iptmp) {
+    return NULL;
+  }
+  p = iptmp + (p - ipasc);
+  *p++ = 0;
 
-    if (strchr(ipasc, ':')) {
-        if (!ipv6_from_asc(ipout, ipasc))
-            return 0;
-        return 16;
-    } else {
-        if (!ipv4_from_asc(ipout, ipasc))
-            return 0;
-        return 4;
+  iplen1 = x509v3_a2i_ipadd(ipout, iptmp);
+
+  if (!iplen1) {
+    goto err;
+  }
+
+  iplen2 = x509v3_a2i_ipadd(ipout + iplen1, p);
+
+  OPENSSL_free(iptmp);
+  iptmp = NULL;
+
+  if (!iplen2 || (iplen1 != iplen2)) {
+    goto err;
+  }
+
+  ret = ASN1_OCTET_STRING_new();
+  if (!ret) {
+    goto err;
+  }
+  if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2)) {
+    goto err;
+  }
+
+  return ret;
+
+err:
+  if (iptmp) {
+    OPENSSL_free(iptmp);
+  }
+  if (ret) {
+    ASN1_OCTET_STRING_free(ret);
+  }
+  return NULL;
+}
+
+int x509v3_a2i_ipadd(unsigned char ipout[16], const char *ipasc) {
+  // If string contains a ':' assume IPv6
+
+  if (strchr(ipasc, ':')) {
+    if (!ipv6_from_asc(ipout, ipasc)) {
+      return 0;
     }
+    return 16;
+  } else {
+    if (!ipv4_from_asc(ipout, ipasc)) {
+      return 0;
+    }
+    return 4;
+  }
 }
 
-static int ipv4_from_asc(unsigned char v4[4], const char *in)
-{
-    int a0, a1, a2, a3;
-    if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
-        return 0;
-    if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
-        || (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
-        return 0;
-    v4[0] = a0;
-    v4[1] = a1;
-    v4[2] = a2;
-    v4[3] = a3;
-    return 1;
+static int ipv4_from_asc(unsigned char v4[4], const char *in) {
+  int a0, a1, a2, a3;
+  if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4) {
+    return 0;
+  }
+  if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255) || (a2 < 0) ||
+      (a2 > 255) || (a3 < 0) || (a3 > 255)) {
+    return 0;
+  }
+  v4[0] = a0;
+  v4[1] = a1;
+  v4[2] = a2;
+  v4[3] = a3;
+  return 1;
 }
 
 typedef struct {
-    /* Temporary store for IPV6 output */
-    unsigned char tmp[16];
-    /* Total number of bytes in tmp */
-    int total;
-    /* The position of a zero (corresponding to '::') */
-    int zero_pos;
-    /* Number of zeroes */
-    int zero_cnt;
+  // Temporary store for IPV6 output
+  unsigned char tmp[16];
+  // Total number of bytes in tmp
+  int total;
+  // The position of a zero (corresponding to '::')
+  int zero_pos;
+  // Number of zeroes
+  int zero_cnt;
 } IPV6_STAT;
 
-static int ipv6_from_asc(unsigned char v6[16], const char *in)
-{
-    IPV6_STAT v6stat;
-    v6stat.total = 0;
-    v6stat.zero_pos = -1;
-    v6stat.zero_cnt = 0;
-    /*
-     * Treat the IPv6 representation as a list of values separated by ':'.
-     * The presence of a '::' will parse as one, two or three zero length
-     * elements.
-     */
-    if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
+static int ipv6_from_asc(unsigned char v6[16], const char *in) {
+  IPV6_STAT v6stat;
+  v6stat.total = 0;
+  v6stat.zero_pos = -1;
+  v6stat.zero_cnt = 0;
+  // Treat the IPv6 representation as a list of values separated by ':'.
+  // The presence of a '::' will parse as one, two or three zero length
+  // elements.
+  if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat)) {
+    return 0;
+  }
+
+  if (v6stat.zero_pos == -1) {
+    // If no '::' must have exactly 16 bytes
+    if (v6stat.total != 16) {
+      return 0;
+    }
+  } else {
+    // If '::' must have less than 16 bytes
+    if (v6stat.total >= 16) {
+      return 0;
+    }
+    if (v6stat.zero_cnt > 3) {
+      // More than three zeroes is an error
+      return 0;
+    } else if (v6stat.zero_cnt == 3) {
+      // Can only have three zeroes if nothing else present
+      if (v6stat.total > 0) {
         return 0;
-
-    /* Now for some sanity checks */
-
-    if (v6stat.zero_pos == -1) {
-        /* If no '::' must have exactly 16 bytes */
-        if (v6stat.total != 16)
-            return 0;
+      }
+    } else if (v6stat.zero_cnt == 2) {
+      // Can only have two zeroes if at start or end
+      if (v6stat.zero_pos != 0 && v6stat.zero_pos != v6stat.total) {
+        return 0;
+      }
     } else {
-        /* If '::' must have less than 16 bytes */
-        if (v6stat.total == 16)
-            return 0;
-        /* More than three zeroes is an error */
-        if (v6stat.zero_cnt > 3)
-            return 0;
-        /* Can only have three zeroes if nothing else present */
-        else if (v6stat.zero_cnt == 3) {
-            if (v6stat.total > 0)
-                return 0;
-        }
-        /* Can only have two zeroes if at start or end */
-        else if (v6stat.zero_cnt == 2) {
-            if ((v6stat.zero_pos != 0)
-                && (v6stat.zero_pos != v6stat.total))
-                return 0;
-        } else
-            /* Can only have one zero if *not* start or end */
-        {
-            if ((v6stat.zero_pos == 0)
-                || (v6stat.zero_pos == v6stat.total))
-                return 0;
-        }
+      // Can only have one zero if *not* start or end
+      if (v6stat.zero_pos == 0 || v6stat.zero_pos == v6stat.total) {
+        return 0;
+      }
     }
+  }
 
-    /* Format result */
+  // Format the result.
+  if (v6stat.zero_pos >= 0) {
+    // Copy initial part
+    OPENSSL_memcpy(v6, v6stat.tmp, v6stat.zero_pos);
+    // Zero middle
+    OPENSSL_memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
+    // Copy final part
+    if (v6stat.total != v6stat.zero_pos) {
+      OPENSSL_memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
+                     v6stat.tmp + v6stat.zero_pos,
+                     v6stat.total - v6stat.zero_pos);
+    }
+  } else {
+    OPENSSL_memcpy(v6, v6stat.tmp, 16);
+  }
 
-    if (v6stat.zero_pos >= 0) {
-        /* Copy initial part */
-        OPENSSL_memcpy(v6, v6stat.tmp, v6stat.zero_pos);
-        /* Zero middle */
-        OPENSSL_memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
-        /* Copy final part */
-        if (v6stat.total != v6stat.zero_pos)
-            OPENSSL_memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
-                           v6stat.tmp + v6stat.zero_pos,
-                           v6stat.total - v6stat.zero_pos);
-    } else
-        OPENSSL_memcpy(v6, v6stat.tmp, 16);
-
-    return 1;
+  return 1;
 }
 
-static int ipv6_cb(const char *elem, int len, void *usr)
-{
-    IPV6_STAT *s = usr;
-    /* Error if 16 bytes written */
-    if (s->total == 16)
+static int ipv6_cb(const char *elem, size_t len, void *usr) {
+  IPV6_STAT *s = usr;
+  // Error if 16 bytes written
+  if (s->total == 16) {
+    return 0;
+  }
+  if (len == 0) {
+    // Zero length element, corresponds to '::'
+    if (s->zero_pos == -1) {
+      s->zero_pos = s->total;
+    } else if (s->zero_pos != s->total) {
+      // If we've already got a :: its an error
+      return 0;
+    }
+    if (s->zero_cnt >= 3) {
+      // More than three zeros is an error.
+      return 0;
+    }
+    s->zero_cnt++;
+  } else {
+    // If more than 4 characters could be final a.b.c.d form
+    if (len > 4) {
+      // Need at least 4 bytes left
+      if (s->total > 12) {
         return 0;
-    if (len == 0) {
-        /* Zero length element, corresponds to '::' */
-        if (s->zero_pos == -1)
-            s->zero_pos = s->total;
-        /* If we've already got a :: its an error */
-        else if (s->zero_pos != s->total)
-            return 0;
-        s->zero_cnt++;
+      }
+      // Must be end of string
+      if (elem[len]) {
+        return 0;
+      }
+      if (!ipv4_from_asc(s->tmp + s->total, elem)) {
+        return 0;
+      }
+      s->total += 4;
     } else {
-        /* If more than 4 characters could be final a.b.c.d form */
-        if (len > 4) {
-            /* Need at least 4 bytes left */
-            if (s->total > 12)
-                return 0;
-            /* Must be end of string */
-            if (elem[len])
-                return 0;
-            if (!ipv4_from_asc(s->tmp + s->total, elem))
-                return 0;
-            s->total += 4;
-        } else {
-            if (!ipv6_hex(s->tmp + s->total, elem, len))
-                return 0;
-            s->total += 2;
+      if (!ipv6_hex(s->tmp + s->total, elem, len)) {
+        return 0;
+      }
+      s->total += 2;
+    }
+  }
+  return 1;
+}
+
+// Convert a string of up to 4 hex digits into the corresponding IPv6 form.
+
+static int ipv6_hex(unsigned char *out, const char *in, size_t inlen) {
+  if (inlen > 4) {
+    return 0;
+  }
+  uint16_t num = 0;
+  while (inlen--) {
+    unsigned char c = *in++;
+    num <<= 4;
+    if ((c >= '0') && (c <= '9')) {
+      num |= c - '0';
+    } else if ((c >= 'A') && (c <= 'F')) {
+      num |= c - 'A' + 10;
+    } else if ((c >= 'a') && (c <= 'f')) {
+      num |= c - 'a' + 10;
+    } else {
+      return 0;
+    }
+  }
+  out[0] = num >> 8;
+  out[1] = num & 0xff;
+  return 1;
+}
+
+int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk,
+                             unsigned long chtype) {
+  CONF_VALUE *v;
+  int mval;
+  size_t i;
+  char *p, *type;
+  if (!nm) {
+    return 0;
+  }
+
+  for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) {
+    v = sk_CONF_VALUE_value(dn_sk, i);
+    type = v->name;
+    // Skip past any leading X. X: X, etc to allow for multiple instances
+    for (p = type; *p; p++) {
+      if ((*p == ':') || (*p == ',') || (*p == '.')) {
+        p++;
+        if (*p) {
+          type = p;
         }
+        break;
+      }
     }
-    return 1;
-}
-
-/*
- * Convert a string of up to 4 hex digits into the corresponding IPv6 form.
- */
-
-static int ipv6_hex(unsigned char *out, const char *in, int inlen)
-{
-    unsigned char c;
-    unsigned int num = 0;
-    if (inlen > 4)
-        return 0;
-    while (inlen--) {
-        c = *in++;
-        num <<= 4;
-        if ((c >= '0') && (c <= '9'))
-            num |= c - '0';
-        else if ((c >= 'A') && (c <= 'F'))
-            num |= c - 'A' + 10;
-        else if ((c >= 'a') && (c <= 'f'))
-            num |= c - 'a' + 10;
-        else
-            return 0;
+    if (*type == '+') {
+      mval = -1;
+      type++;
+    } else {
+      mval = 0;
     }
-    out[0] = num >> 8;
-    out[1] = num & 0xff;
-    return 1;
-}
-
-int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF (CONF_VALUE) * dn_sk,
-                             unsigned long chtype)
-{
-    CONF_VALUE *v;
-    int mval;
-    size_t i;
-    char *p, *type;
-    if (!nm)
-        return 0;
-
-    for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) {
-        v = sk_CONF_VALUE_value(dn_sk, i);
-        type = v->name;
-        /*
-         * Skip past any leading X. X: X, etc to allow for multiple instances
-         */
-        for (p = type; *p; p++)
-            if ((*p == ':') || (*p == ',') || (*p == '.')) {
-                p++;
-                if (*p)
-                    type = p;
-                break;
-            }
-        if (*type == '+') {
-            mval = -1;
-            type++;
-        } else
-            mval = 0;
-        if (!X509_NAME_add_entry_by_txt(nm, type, chtype,
-                                        (unsigned char *)v->value, -1, -1,
-                                        mval))
-            return 0;
-
+    if (!X509_NAME_add_entry_by_txt(nm, type, chtype, (unsigned char *)v->value,
+                                    -1, -1, mval)) {
+      return 0;
     }
-    return 1;
+  }
+  return 1;
 }
diff --git a/src/crypto/x509v3/v3name_test.cc b/src/crypto/x509v3/v3name_test.cc
deleted file mode 100644
index a501115..0000000
--- a/src/crypto/x509v3/v3name_test.cc
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
- * 1999.
- */
-/* ====================================================================
- * Copyright (c) 1999-2004 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com). */
-
-#include <stdarg.h>
-#include <string.h>
-
-#include <gtest/gtest.h>
-
-#include <openssl/crypto.h>
-#include <openssl/mem.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-
-#include "../internal.h"
-#include "internal.h"
-
-
-static const char *const names[] = {
-    "a", "b", ".", "*", "@",
-    ".a", "a.", ".b", "b.", ".*", "*.", "*@", "@*", "a@", "@a", "b@", "..",
-    "-example.com", "example-.com",
-    "@@", "**", "*.com", "*com", "*.*.com", "*com", "com*", "*example.com",
-    "*@example.com", "test@*.example.com", "example.com", "www.example.com",
-    "test.www.example.com", "*.example.com", "*.www.example.com",
-    "test.*.example.com", "www.*.com",
-    ".www.example.com", "*www.example.com",
-    "example.net", "xn--rger-koa.example.com",
-    "*.xn--rger-koa.example.com", "www.xn--rger-koa.example.com",
-    "*.good--example.com", "www.good--example.com",
-    "*.xn--bar.com", "xn--foo.xn--bar.com",
-    "a.example.com", "b.example.com",
-    "postmaster@example.com", "Postmaster@example.com",
-    "postmaster@EXAMPLE.COM",
-    NULL
-};
-
-static const char *const exceptions[] = {
-    "set CN: host: [*.example.com] matches [a.example.com]",
-    "set CN: host: [*.example.com] matches [b.example.com]",
-    "set CN: host: [*.example.com] matches [www.example.com]",
-    "set CN: host: [*.example.com] matches [xn--rger-koa.example.com]",
-    "set CN: host: [*.www.example.com] matches [test.www.example.com]",
-    "set CN: host: [*.www.example.com] matches [.www.example.com]",
-    "set CN: host: [*www.example.com] matches [www.example.com]",
-    "set CN: host: [test.www.example.com] matches [.www.example.com]",
-    "set CN: host: [*.xn--rger-koa.example.com] matches [www.xn--rger-koa.example.com]",
-    "set CN: host: [*.xn--bar.com] matches [xn--foo.xn--bar.com]",
-    "set CN: host: [*.good--example.com] matches [www.good--example.com]",
-    "set CN: host-no-wildcards: [*.www.example.com] matches [.www.example.com]",
-    "set CN: host-no-wildcards: [test.www.example.com] matches [.www.example.com]",
-    "set emailAddress: email: [postmaster@example.com] does not match [Postmaster@example.com]",
-    "set emailAddress: email: [postmaster@EXAMPLE.COM] does not match [Postmaster@example.com]",
-    "set emailAddress: email: [Postmaster@example.com] does not match [postmaster@example.com]",
-    "set emailAddress: email: [Postmaster@example.com] does not match [postmaster@EXAMPLE.COM]",
-    "set dnsName: host: [*.example.com] matches [www.example.com]",
-    "set dnsName: host: [*.example.com] matches [a.example.com]",
-    "set dnsName: host: [*.example.com] matches [b.example.com]",
-    "set dnsName: host: [*.example.com] matches [xn--rger-koa.example.com]",
-    "set dnsName: host: [*.www.example.com] matches [test.www.example.com]",
-    "set dnsName: host-no-wildcards: [*.www.example.com] matches [.www.example.com]",
-    "set dnsName: host-no-wildcards: [test.www.example.com] matches [.www.example.com]",
-    "set dnsName: host: [*.www.example.com] matches [.www.example.com]",
-    "set dnsName: host: [*www.example.com] matches [www.example.com]",
-    "set dnsName: host: [test.www.example.com] matches [.www.example.com]",
-    "set dnsName: host: [*.xn--rger-koa.example.com] matches [www.xn--rger-koa.example.com]",
-    "set dnsName: host: [*.xn--bar.com] matches [xn--foo.xn--bar.com]",
-    "set dnsName: host: [*.good--example.com] matches [www.good--example.com]",
-    "set rfc822Name: email: [postmaster@example.com] does not match [Postmaster@example.com]",
-    "set rfc822Name: email: [Postmaster@example.com] does not match [postmaster@example.com]",
-    "set rfc822Name: email: [Postmaster@example.com] does not match [postmaster@EXAMPLE.COM]",
-    "set rfc822Name: email: [postmaster@EXAMPLE.COM] does not match [Postmaster@example.com]",
-    NULL
-};
-
-static int is_exception(const char *msg)
-{
-    const char *const *p;
-    for (p = exceptions; *p; ++p)
-        if (strcmp(msg, *p) == 0)
-            return 1;
-    return 0;
-}
-
-static int set_cn(X509 *crt, ...)
-{
-    int ret = 0;
-    X509_NAME *n = NULL;
-    va_list ap;
-    va_start(ap, crt);
-    n = X509_NAME_new();
-    if (n == NULL)
-        goto out;
-    while (1) {
-        int nid;
-        const char *name;
-        nid = va_arg(ap, int);
-        if (nid == 0)
-            break;
-        name = va_arg(ap, const char *);
-        if (!X509_NAME_add_entry_by_NID(n, nid, MBSTRING_ASC,
-                                        (unsigned char *)name, -1, -1, 1))
-            goto out;
-    }
-    if (!X509_set_subject_name(crt, n))
-        goto out;
-    ret = 1;
- out:
-    X509_NAME_free(n);
-    va_end(ap);
-    return ret;
-}
-
-/*
- * int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); X509_EXTENSION
- * *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid, int crit,
- * ASN1_OCTET_STRING *data); int X509_add_ext(X509 *x, X509_EXTENSION *ex,
- * int loc);
- */
-
-static int set_altname(X509 *crt, ...)
-{
-    int ret = 0;
-    GENERAL_NAMES *gens = NULL;
-    GENERAL_NAME *gen = NULL;
-    ASN1_IA5STRING *ia5 = NULL;
-    va_list ap;
-    va_start(ap, crt);
-    gens = sk_GENERAL_NAME_new_null();
-    if (gens == NULL)
-        goto out;
-    while (1) {
-        int type;
-        const char *name;
-        type = va_arg(ap, int);
-        if (type == 0)
-            break;
-        name = va_arg(ap, const char *);
-
-        gen = GENERAL_NAME_new();
-        if (gen == NULL)
-            goto out;
-        ia5 = ASN1_IA5STRING_new();
-        if (ia5 == NULL)
-            goto out;
-        if (!ASN1_STRING_set(ia5, name, -1))
-            goto out;
-        switch (type) {
-        case GEN_EMAIL:
-        case GEN_DNS:
-            GENERAL_NAME_set0_value(gen, type, ia5);
-            ia5 = NULL;
-            break;
-        default:
-            abort();
-        }
-        sk_GENERAL_NAME_push(gens, gen);
-        gen = NULL;
-    }
-    if (!X509_add1_ext_i2d(crt, NID_subject_alt_name, gens, 0, 0))
-        goto out;
-    ret = 1;
- out:
-    ASN1_IA5STRING_free(ia5);
-    GENERAL_NAME_free(gen);
-    GENERAL_NAMES_free(gens);
-    va_end(ap);
-    return ret;
-}
-
-static int set_cn1(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_commonName, name, 0);
-}
-
-static int set_cn_and_email(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_commonName, name,
-                  NID_pkcs9_emailAddress, "dummy@example.com", 0);
-}
-
-static int set_cn2(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_commonName, "dummy value",
-                  NID_commonName, name, 0);
-}
-
-static int set_cn3(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_commonName, name,
-                  NID_commonName, "dummy value", 0);
-}
-
-static int set_email1(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_pkcs9_emailAddress, name, 0);
-}
-
-static int set_email2(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_pkcs9_emailAddress, "dummy@example.com",
-                  NID_pkcs9_emailAddress, name, 0);
-}
-
-static int set_email3(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_pkcs9_emailAddress, name,
-                  NID_pkcs9_emailAddress, "dummy@example.com", 0);
-}
-
-static int set_email_and_cn(X509 *crt, const char *name)
-{
-    return set_cn(crt, NID_pkcs9_emailAddress, name,
-                  NID_commonName, "www.example.org", 0);
-}
-
-static int set_altname_dns(X509 *crt, const char *name)
-{
-    return set_altname(crt, GEN_DNS, name, 0);
-}
-
-static int set_altname_email(X509 *crt, const char *name)
-{
-    return set_altname(crt, GEN_EMAIL, name, 0);
-}
-
-struct set_name_fn {
-    int (*fn) (X509 *, const char *);
-    const char *name;
-    int host;
-    int email;
-};
-
-static const struct set_name_fn name_fns[] = {
-    {set_cn1, "set CN", 1, 0},
-    {set_cn2, "set CN", 1, 0},
-    {set_cn3, "set CN", 1, 0},
-    {set_cn_and_email, "set CN", 1, 0},
-    {set_email1, "set emailAddress", 0, 1},
-    {set_email2, "set emailAddress", 0, 1},
-    {set_email3, "set emailAddress", 0, 1},
-    {set_email_and_cn, "set emailAddress", 0, 1},
-    {set_altname_dns, "set dnsName", 1, 0},
-    {set_altname_email, "set rfc822Name", 0, 1},
-    {NULL, NULL, 0, 0},
-};
-
-static X509 *make_cert(void)
-{
-    X509 *ret = NULL;
-    X509 *crt = NULL;
-    X509_NAME *issuer = NULL;
-    crt = X509_new();
-    if (crt == NULL)
-        goto out;
-    if (!X509_set_version(crt, X509_VERSION_3))
-        goto out;
-    ret = crt;
-    crt = NULL;
- out:
-    X509_NAME_free(issuer);
-    return ret;
-}
-
-static int errors;
-
-static void check_message(const struct set_name_fn *fn, const char *op,
-                          const char *nameincert, int match, const char *name)
-{
-    char msg[1024];
-    if (match < 0)
-        return;
-    BIO_snprintf(msg, sizeof(msg), "%s: %s: [%s] %s [%s]",
-                 fn->name, op, nameincert,
-                 match ? "matches" : "does not match", name);
-    if (is_exception(msg))
-        return;
-    puts(msg);
-    ++errors;
-}
-
-static void run_cert(X509 *crt, const char *nameincert,
-                     const struct set_name_fn *fn)
-{
-    const char *const *pname = names;
-    while (*pname) {
-        int samename = OPENSSL_strcasecmp(nameincert, *pname) == 0;
-        size_t namelen = strlen(*pname);
-        char *name = (char *)malloc(namelen);
-        int match, ret;
-        OPENSSL_memcpy(name, *pname, namelen);
-
-        ret = X509_check_host(crt, name, namelen, 0, NULL);
-        match = -1;
-        if (ret < 0) {
-            fprintf(stderr, "internal error in X509_check_host\n");
-            ++errors;
-        } else if (fn->host) {
-            if (ret == 1 && !samename)
-                match = 1;
-            if (ret == 0 && samename)
-                match = 0;
-        } else if (ret == 1)
-            match = 1;
-        check_message(fn, "host", nameincert, match, *pname);
-
-        ret = X509_check_host(crt, name, namelen,
-                              X509_CHECK_FLAG_NO_WILDCARDS, NULL);
-        match = -1;
-        if (ret < 0) {
-            fprintf(stderr, "internal error in X509_check_host\n");
-            ++errors;
-        } else if (fn->host) {
-            if (ret == 1 && !samename)
-                match = 1;
-            if (ret == 0 && samename)
-                match = 0;
-        } else if (ret == 1)
-            match = 1;
-        check_message(fn, "host-no-wildcards", nameincert, match, *pname);
-
-        ret = X509_check_email(crt, name, namelen, 0);
-        match = -1;
-        if (fn->email) {
-            if (ret && !samename)
-                match = 1;
-            if (!ret && samename && strchr(nameincert, '@') != NULL)
-                match = 0;
-        } else if (ret)
-            match = 1;
-        check_message(fn, "email", nameincert, match, *pname);
-        ++pname;
-        free(name);
-    }
-}
-
-// TODO(davidben): Convert this test to GTest more thoroughly.
-TEST(X509V3Test, NameTest) {
-    const struct set_name_fn *pfn = name_fns;
-    while (pfn->name) {
-        const char *const *pname = names;
-        while (*pname) {
-            // The common name fallback requires the name look sufficiently
-            // DNS-like.
-            if (strcmp(pfn->name, "set CN") == 0 &&
-                !x509v3_looks_like_dns_name(
-                    reinterpret_cast<const unsigned char*>(*pname),
-                    strlen(*pname))) {
-                ++pname;
-                continue;
-            }
-            bssl::UniquePtr<X509> crt(make_cert());
-            ASSERT_TRUE(crt);
-            ASSERT_TRUE(pfn->fn(crt.get(), *pname));
-            run_cert(crt.get(), *pname, pfn);
-            ++pname;
-        }
-        ++pfn;
-    }
-    EXPECT_EQ(0, errors);
-}
diff --git a/src/decrepit/blowfish/blowfish.c b/src/decrepit/blowfish/blowfish.c
index aa872bc..7c209da 100644
--- a/src/decrepit/blowfish/blowfish.c
+++ b/src/decrepit/blowfish/blowfish.c
@@ -61,6 +61,7 @@
 #include <assert.h>
 #include <string.h>
 
+#include "../../crypto/fipsmodule/cipher/internal.h"
 #include "../../crypto/internal.h"
 #include "../macros.h"
 
diff --git a/src/decrepit/cast/cast.c b/src/decrepit/cast/cast.c
index dffee5c..314e3da 100644
--- a/src/decrepit/cast/cast.c
+++ b/src/decrepit/cast/cast.c
@@ -64,6 +64,7 @@
 OPENSSL_MSVC_PRAGMA(warning(pop))
 #endif
 
+#include "../../crypto/fipsmodule/cipher/internal.h"
 #include "../../crypto/internal.h"
 #include "internal.h"
 #include "../macros.h"
diff --git a/src/decrepit/cfb/cfb.c b/src/decrepit/cfb/cfb.c
index fa1cfd4..d231153 100644
--- a/src/decrepit/cfb/cfb.c
+++ b/src/decrepit/cfb/cfb.c
@@ -19,6 +19,7 @@
 #include <openssl/aes.h>
 #include <openssl/obj.h>
 
+#include "../../crypto/fipsmodule/cipher/internal.h"
 #include "../../crypto/internal.h"
 
 typedef struct {
diff --git a/src/decrepit/des/cfb64ede.c b/src/decrepit/des/cfb64ede.c
index 6c39923..820c52e 100644
--- a/src/decrepit/des/cfb64ede.c
+++ b/src/decrepit/des/cfb64ede.c
@@ -58,7 +58,7 @@
 
 #include <openssl/des.h>
 
-#include "../../crypto/fipsmodule/des/internal.h"
+#include "../../crypto/des/internal.h"
 #include "../../crypto/internal.h"
 
 
diff --git a/src/decrepit/xts/xts.c b/src/decrepit/xts/xts.c
index a433c3b..8a66f0f 100644
--- a/src/decrepit/xts/xts.c
+++ b/src/decrepit/xts/xts.c
@@ -53,7 +53,8 @@
 #include <openssl/aes.h>
 #include <openssl/cipher.h>
 
-#include "../crypto/fipsmodule/modes/internal.h"
+#include "../../crypto/fipsmodule/cipher/internal.h"
+#include "../../crypto/fipsmodule/modes/internal.h"
 
 
 typedef struct xts128_context {
diff --git a/src/fuzz/CMakeLists.txt b/src/fuzz/CMakeLists.txt
index 62652cb..51da4a8 100644
--- a/src/fuzz/CMakeLists.txt
+++ b/src/fuzz/CMakeLists.txt
@@ -30,3 +30,4 @@
 fuzzer(ssl_ctx_api ssl)
 fuzzer(session ssl)
 fuzzer(decode_client_hello_inner ssl)
+fuzzer(der_roundtrip)
diff --git a/src/fuzz/arm_cpuinfo.cc b/src/fuzz/arm_cpuinfo.cc
index 5d70046..ea40725 100644
--- a/src/fuzz/arm_cpuinfo.cc
+++ b/src/fuzz/arm_cpuinfo.cc
@@ -12,7 +12,7 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#include "../crypto/cpu-arm-linux.h"
+#include "../crypto/cpu_arm_linux.h"
 
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
diff --git a/src/fuzz/der_roundtrip.cc b/src/fuzz/der_roundtrip.cc
new file mode 100644
index 0000000..b88a7d6
--- /dev/null
+++ b/src/fuzz/der_roundtrip.cc
@@ -0,0 +1,57 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <openssl/bytestring.h>
+#include <openssl/ecdsa.h>
+#include <openssl/mem.h>
+
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
+  CBS cbs, body;
+  unsigned tag;
+  CBS_init(&cbs, buf, len);
+  if (CBS_get_any_asn1(&cbs, &body, &tag)) {
+    // DER has a unique encoding, so any parsed input should round-trip
+    // correctly.
+    size_t consumed = len - CBS_len(&cbs);
+    bssl::ScopedCBB cbb;
+    CBB body_cbb;
+    if (!CBB_init(cbb.get(), consumed) ||
+        !CBB_add_asn1(cbb.get(), &body_cbb, tag) ||
+        !CBB_add_bytes(&body_cbb, CBS_data(&body), CBS_len(&body)) ||
+        !CBB_flush(cbb.get()) ||
+        CBB_len(cbb.get()) != consumed ||
+        memcmp(CBB_data(cbb.get()), buf, consumed) != 0) {
+      abort();
+    }
+  }
+
+  ECDSA_SIG *sig = ECDSA_SIG_from_bytes(buf, len);
+  if (sig != NULL) {
+    uint8_t *enc;
+    size_t enc_len;
+    if (!ECDSA_SIG_to_bytes(&enc, &enc_len, sig) ||
+        enc_len != len ||
+        memcmp(buf, enc, len) != 0) {
+      abort();
+    }
+    OPENSSL_free(enc);
+    ECDSA_SIG_free(sig);
+  }
+
+  return 0;
+}
diff --git a/src/fuzz/der_roundtrip_corpus/0461791e54b4840c109637952eab43d9b938cab8 b/src/fuzz/der_roundtrip_corpus/0461791e54b4840c109637952eab43d9b938cab8
new file mode 100644
index 0000000..0286405
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/0461791e54b4840c109637952eab43d9b938cab8
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/06e57a7b98a403a00822739739924b97ae6c74e9 b/src/fuzz/der_roundtrip_corpus/06e57a7b98a403a00822739739924b97ae6c74e9
new file mode 100644
index 0000000..411154e
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/06e57a7b98a403a00822739739924b97ae6c74e9
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/078c3c1199930781466871c8dda69bec379286a4 b/src/fuzz/der_roundtrip_corpus/078c3c1199930781466871c8dda69bec379286a4
new file mode 100644
index 0000000..949b115
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/078c3c1199930781466871c8dda69bec379286a4
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/082a991742f652549e4b207100ee521f474e0a99 b/src/fuzz/der_roundtrip_corpus/082a991742f652549e4b207100ee521f474e0a99
new file mode 100644
index 0000000..d00640d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/082a991742f652549e4b207100ee521f474e0a99
@@ -0,0 +1 @@
+0ÿ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/091e3389548686c5038d04e3d76b9c4d30502074 b/src/fuzz/der_roundtrip_corpus/091e3389548686c5038d04e3d76b9c4d30502074
new file mode 100644
index 0000000..c4ecbaf
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/091e3389548686c5038d04e3d76b9c4d30502074
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/13e484c406efe97dc9d91f8b80a27b0e597c34da b/src/fuzz/der_roundtrip_corpus/13e484c406efe97dc9d91f8b80a27b0e597c34da
new file mode 100644
index 0000000..651afec
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/13e484c406efe97dc9d91f8b80a27b0e597c34da
@@ -0,0 +1 @@
+ÿÿ3
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/153d254254345b61e20e7b37637dd6f6fd71ba01 b/src/fuzz/der_roundtrip_corpus/153d254254345b61e20e7b37637dd6f6fd71ba01
new file mode 100644
index 0000000..698a07f
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/153d254254345b61e20e7b37637dd6f6fd71ba01
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/163605136e22f5b5302fe60d1f17837bee6b6b2b b/src/fuzz/der_roundtrip_corpus/163605136e22f5b5302fe60d1f17837bee6b6b2b
new file mode 100644
index 0000000..e6bb472
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/163605136e22f5b5302fe60d1f17837bee6b6b2b
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/1a96ec99b487b93052cd860c447e6d126dcc36d4 b/src/fuzz/der_roundtrip_corpus/1a96ec99b487b93052cd860c447e6d126dcc36d4
new file mode 100644
index 0000000..81dca9e
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/1a96ec99b487b93052cd860c447e6d126dcc36d4
@@ -0,0 +1 @@
+ƒö
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/1cc9ad96fcee279e8589b7071c7a0ccd111098f2 b/src/fuzz/der_roundtrip_corpus/1cc9ad96fcee279e8589b7071c7a0ccd111098f2
new file mode 100644
index 0000000..0410d09
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/1cc9ad96fcee279e8589b7071c7a0ccd111098f2
@@ -0,0 +1 @@
+0]
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/229b8e1825512868e0e11a199ed71231dd41bb4f b/src/fuzz/der_roundtrip_corpus/229b8e1825512868e0e11a199ed71231dd41bb4f
new file mode 100644
index 0000000..3fa53ac
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/229b8e1825512868e0e11a199ed71231dd41bb4f
@@ -0,0 +1 @@
+0;-:ºº‚
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/236d820eadf7f84d70de7bb8be5f1c57a4005de2 b/src/fuzz/der_roundtrip_corpus/236d820eadf7f84d70de7bb8be5f1c57a4005de2
new file mode 100644
index 0000000..e9691e8
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/236d820eadf7f84d70de7bb8be5f1c57a4005de2
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/24fd9742dbdee3167509db4af245ad6f8c4c1e99 b/src/fuzz/der_roundtrip_corpus/24fd9742dbdee3167509db4af245ad6f8c4c1e99
new file mode 100644
index 0000000..d6c9167
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/24fd9742dbdee3167509db4af245ad6f8c4c1e99
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/2896f8deb3c4e8bdfeab743b22c64c92316880f7 b/src/fuzz/der_roundtrip_corpus/2896f8deb3c4e8bdfeab743b22c64c92316880f7
new file mode 100644
index 0000000..06db46d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/2896f8deb3c4e8bdfeab743b22c64c92316880f7
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/29b6252fe9c4d1186394b1664c421cca795b61a5 b/src/fuzz/der_roundtrip_corpus/29b6252fe9c4d1186394b1664c421cca795b61a5
new file mode 100644
index 0000000..bc90b84
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/29b6252fe9c4d1186394b1664c421cca795b61a5
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/2b4955132275314d1d377f37f93d8c1879a3519a b/src/fuzz/der_roundtrip_corpus/2b4955132275314d1d377f37f93d8c1879a3519a
new file mode 100644
index 0000000..09a878b
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/2b4955132275314d1d377f37f93d8c1879a3519a
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/2e7112ac524a7a663632397cbb41f7dfd22e92c6 b/src/fuzz/der_roundtrip_corpus/2e7112ac524a7a663632397cbb41f7dfd22e92c6
new file mode 100644
index 0000000..9576939
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/2e7112ac524a7a663632397cbb41f7dfd22e92c6
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/396d197005432accf99bf0f483286e459eb24063 b/src/fuzz/der_roundtrip_corpus/396d197005432accf99bf0f483286e459eb24063
new file mode 100644
index 0000000..8558b15
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/396d197005432accf99bf0f483286e459eb24063
@@ -0,0 +1 @@
+ÿû܅ÔÔÔ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/3c75fe79266cf639f2180722a3f03f8fc3e25685 b/src/fuzz/der_roundtrip_corpus/3c75fe79266cf639f2180722a3f03f8fc3e25685
new file mode 100644
index 0000000..05cf797
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/3c75fe79266cf639f2180722a3f03f8fc3e25685
@@ -0,0 +1 @@
+0+H[™
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/3fbb104fb0eb6cae4af34d8a516998336b3a6778 b/src/fuzz/der_roundtrip_corpus/3fbb104fb0eb6cae4af34d8a516998336b3a6778
new file mode 100644
index 0000000..b5098e7
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/3fbb104fb0eb6cae4af34d8a516998336b3a6778
@@ -0,0 +1 @@
+ÿÿÿ3
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/422fa995b3fdfed572b68b292062c330d6d05272 b/src/fuzz/der_roundtrip_corpus/422fa995b3fdfed572b68b292062c330d6d05272
new file mode 100644
index 0000000..74d7497
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/422fa995b3fdfed572b68b292062c330d6d05272
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/428b48fc494cee828f0c27f77aef477cb2e1fd80 b/src/fuzz/der_roundtrip_corpus/428b48fc494cee828f0c27f77aef477cb2e1fd80
new file mode 100644
index 0000000..4957638
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/428b48fc494cee828f0c27f77aef477cb2e1fd80
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/4bd69e424b6fa38f9e63e58b8d0e95ac2d38d598 b/src/fuzz/der_roundtrip_corpus/4bd69e424b6fa38f9e63e58b8d0e95ac2d38d598
new file mode 100644
index 0000000..203b369
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/4bd69e424b6fa38f9e63e58b8d0e95ac2d38d598
@@ -0,0 +1 @@
+00
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/4be7e1f134e1c55aeadeead515200f6f1e6254ba b/src/fuzz/der_roundtrip_corpus/4be7e1f134e1c55aeadeead515200f6f1e6254ba
new file mode 100644
index 0000000..61ac12c
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/4be7e1f134e1c55aeadeead515200f6f1e6254ba
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/4de268400e174db2dc306f45c833cf968a6c6546 b/src/fuzz/der_roundtrip_corpus/4de268400e174db2dc306f45c833cf968a6c6546
new file mode 100644
index 0000000..26574d6
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/4de268400e174db2dc306f45c833cf968a6c6546
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/52d2c7efcd7da0eb7463829e05a598e36729bfae b/src/fuzz/der_roundtrip_corpus/52d2c7efcd7da0eb7463829e05a598e36729bfae
new file mode 100644
index 0000000..f0f212d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/52d2c7efcd7da0eb7463829e05a598e36729bfae
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/53cf415eb9de49fb5a0cb46e745e413a99aa0779 b/src/fuzz/der_roundtrip_corpus/53cf415eb9de49fb5a0cb46e745e413a99aa0779
new file mode 100644
index 0000000..8be5d01
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/53cf415eb9de49fb5a0cb46e745e413a99aa0779
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/53ea84c48a5792281a46eb5a9c896d54ea3f1838 b/src/fuzz/der_roundtrip_corpus/53ea84c48a5792281a46eb5a9c896d54ea3f1838
new file mode 100644
index 0000000..2758bf2
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/53ea84c48a5792281a46eb5a9c896d54ea3f1838
@@ -0,0 +1 @@
+n€
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f b/src/fuzz/der_roundtrip_corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f
new file mode 100644
index 0000000..f76dd23
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/5bab61eb53176449e25c2c82f172b82cb13ffb9d b/src/fuzz/der_roundtrip_corpus/5bab61eb53176449e25c2c82f172b82cb13ffb9d
new file mode 100644
index 0000000..0d758c9
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/5bab61eb53176449e25c2c82f172b82cb13ffb9d
@@ -0,0 +1 @@
+?
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/5e5361730362736fe3e2804d8566e3c91454509b b/src/fuzz/der_roundtrip_corpus/5e5361730362736fe3e2804d8566e3c91454509b
new file mode 100644
index 0000000..74292d1
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/5e5361730362736fe3e2804d8566e3c91454509b
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/6654fedb1fc4b07095695b062b5af4c2f12d59ae b/src/fuzz/der_roundtrip_corpus/6654fedb1fc4b07095695b062b5af4c2f12d59ae
new file mode 100644
index 0000000..1c2cf8b
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/6654fedb1fc4b07095695b062b5af4c2f12d59ae
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/6cad8b2a41194372ec897bece6512fe8331e274d b/src/fuzz/der_roundtrip_corpus/6cad8b2a41194372ec897bece6512fe8331e274d
new file mode 100644
index 0000000..48c8f0d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/6cad8b2a41194372ec897bece6512fe8331e274d
@@ -0,0 +1 @@
+;„
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/6f40330ec07e8e22f113f982b297ff7f86b8e485 b/src/fuzz/der_roundtrip_corpus/6f40330ec07e8e22f113f982b297ff7f86b8e485
new file mode 100644
index 0000000..af06c4c
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/6f40330ec07e8e22f113f982b297ff7f86b8e485
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/738f291e53e97c08dae378c71ef70a60e31ae900 b/src/fuzz/der_roundtrip_corpus/738f291e53e97c08dae378c71ef70a60e31ae900
new file mode 100644
index 0000000..edbcd11
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/738f291e53e97c08dae378c71ef70a60e31ae900
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/7396791821e64fc9340249a4bcbd2198e9f237db b/src/fuzz/der_roundtrip_corpus/7396791821e64fc9340249a4bcbd2198e9f237db
new file mode 100644
index 0000000..aaf8ff7
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/7396791821e64fc9340249a4bcbd2198e9f237db
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/7653595e28f23e62ea6707c99ca08c780a69335f b/src/fuzz/der_roundtrip_corpus/7653595e28f23e62ea6707c99ca08c780a69335f
new file mode 100644
index 0000000..fe0e133
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/7653595e28f23e62ea6707c99ca08c780a69335f
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/77de68daecd823babbb58edb1c8e14d7106e83bb b/src/fuzz/der_roundtrip_corpus/77de68daecd823babbb58edb1c8e14d7106e83bb
new file mode 100644
index 0000000..e440e5c
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/77de68daecd823babbb58edb1c8e14d7106e83bb
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/7cb5c71603a787032973d6ddc9c2c34638005784 b/src/fuzz/der_roundtrip_corpus/7cb5c71603a787032973d6ddc9c2c34638005784
new file mode 100644
index 0000000..4fb1c3f
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/7cb5c71603a787032973d6ddc9c2c34638005784
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/80a1e1ae75c1e5ef7bbde5f5877e3e5b26b3cf58 b/src/fuzz/der_roundtrip_corpus/80a1e1ae75c1e5ef7bbde5f5877e3e5b26b3cf58
new file mode 100644
index 0000000..58098b2
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/80a1e1ae75c1e5ef7bbde5f5877e3e5b26b3cf58
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/872ba8af52a8c1380c388bab0e20bec2e729db80 b/src/fuzz/der_roundtrip_corpus/872ba8af52a8c1380c388bab0e20bec2e729db80
new file mode 100644
index 0000000..ed03f7f
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/872ba8af52a8c1380c388bab0e20bec2e729db80
@@ -0,0 +1 @@
+ý÷
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/8855f2d904cf1bbaffc54e68d98890fdc9ec14cc b/src/fuzz/der_roundtrip_corpus/8855f2d904cf1bbaffc54e68d98890fdc9ec14cc
new file mode 100644
index 0000000..6e3a719
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/8855f2d904cf1bbaffc54e68d98890fdc9ec14cc
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/8a22f56ee86cc2d67e9610a6b0ed59f21008a341 b/src/fuzz/der_roundtrip_corpus/8a22f56ee86cc2d67e9610a6b0ed59f21008a341
new file mode 100644
index 0000000..a2dc708
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/8a22f56ee86cc2d67e9610a6b0ed59f21008a341
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/935a69e9f3bfa1dd3bf058fa3e1b953e82195de6 b/src/fuzz/der_roundtrip_corpus/935a69e9f3bfa1dd3bf058fa3e1b953e82195de6
new file mode 100644
index 0000000..a08062d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/935a69e9f3bfa1dd3bf058fa3e1b953e82195de6
@@ -0,0 +1 @@
+0ÿ¿ÿ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/951ccb49640c8f9e81fb4e0d82730321f4e15bb3 b/src/fuzz/der_roundtrip_corpus/951ccb49640c8f9e81fb4e0d82730321f4e15bb3
new file mode 100644
index 0000000..d48bf8b
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/951ccb49640c8f9e81fb4e0d82730321f4e15bb3
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/9af1f3ed10c7a54f6b57c344015141cc082db23b b/src/fuzz/der_roundtrip_corpus/9af1f3ed10c7a54f6b57c344015141cc082db23b
new file mode 100644
index 0000000..17c5b11
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/9af1f3ed10c7a54f6b57c344015141cc082db23b
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/a0b7dd1684089c63a4aac2e4a832544df4d639d6 b/src/fuzz/der_roundtrip_corpus/a0b7dd1684089c63a4aac2e4a832544df4d639d6
new file mode 100644
index 0000000..3c36017
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a0b7dd1684089c63a4aac2e4a832544df4d639d6
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/a22d0d3565a509a4bfedce078090d8c6a908d950 b/src/fuzz/der_roundtrip_corpus/a22d0d3565a509a4bfedce078090d8c6a908d950
new file mode 100644
index 0000000..a88d0df
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a22d0d3565a509a4bfedce078090d8c6a908d950
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/a22f1185582f66227118c8e9002a5c29728f0650 b/src/fuzz/der_roundtrip_corpus/a22f1185582f66227118c8e9002a5c29728f0650
new file mode 100644
index 0000000..d3ee364
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a22f1185582f66227118c8e9002a5c29728f0650
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/a457945cb86ec812235f407ed70fe72fbaf694a1 b/src/fuzz/der_roundtrip_corpus/a457945cb86ec812235f407ed70fe72fbaf694a1
new file mode 100644
index 0000000..1087345
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a457945cb86ec812235f407ed70fe72fbaf694a1
@@ -0,0 +1 @@
+ÿë܅ÔÔÔÔÔ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/a4ee44c4e8728d4924642ef8765063262e8c4601 b/src/fuzz/der_roundtrip_corpus/a4ee44c4e8728d4924642ef8765063262e8c4601
new file mode 100644
index 0000000..9dac112
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a4ee44c4e8728d4924642ef8765063262e8c4601
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/a4fc609a6546fc0061f499f0faed9054fd388c9a b/src/fuzz/der_roundtrip_corpus/a4fc609a6546fc0061f499f0faed9054fd388c9a
new file mode 100644
index 0000000..77ac914
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a4fc609a6546fc0061f499f0faed9054fd388c9a
@@ -0,0 +1 @@
+00E 
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/a7c13e6fe60eee08b9aac00a095a9301ea1a9824 b/src/fuzz/der_roundtrip_corpus/a7c13e6fe60eee08b9aac00a095a9301ea1a9824
new file mode 100644
index 0000000..fffa12f
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a7c13e6fe60eee08b9aac00a095a9301ea1a9824
@@ -0,0 +1 @@
+@@
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/a98e22a5a8c2f5dda365d55e76536931010e1560 b/src/fuzz/der_roundtrip_corpus/a98e22a5a8c2f5dda365d55e76536931010e1560
new file mode 100644
index 0000000..e26fb83
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/a98e22a5a8c2f5dda365d55e76536931010e1560
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/aca6ed86348b1176bfbe4ebf32b2d48a0aa42f9f b/src/fuzz/der_roundtrip_corpus/aca6ed86348b1176bfbe4ebf32b2d48a0aa42f9f
new file mode 100644
index 0000000..2318072
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/aca6ed86348b1176bfbe4ebf32b2d48a0aa42f9f
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/aeefb82d7f5cc69168aade3b196a84d0f5c14bf2 b/src/fuzz/der_roundtrip_corpus/aeefb82d7f5cc69168aade3b196a84d0f5c14bf2
new file mode 100644
index 0000000..3c07663
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/aeefb82d7f5cc69168aade3b196a84d0f5c14bf2
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/b37e0f6fa42840c773747c4cb608c278ab65021d b/src/fuzz/der_roundtrip_corpus/b37e0f6fa42840c773747c4cb608c278ab65021d
new file mode 100644
index 0000000..4d411bc
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/b37e0f6fa42840c773747c4cb608c278ab65021d
@@ -0,0 +1 @@
+w‚ͳ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/b5d4e67f0ec5b1a90100d8ad424d77aea8e16353 b/src/fuzz/der_roundtrip_corpus/b5d4e67f0ec5b1a90100d8ad424d77aea8e16353
new file mode 100644
index 0000000..4f8cfda
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/b5d4e67f0ec5b1a90100d8ad424d77aea8e16353
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/b65ea16ba4dae8599ebbad7c4cb9fcd505edf485 b/src/fuzz/der_roundtrip_corpus/b65ea16ba4dae8599ebbad7c4cb9fcd505edf485
new file mode 100644
index 0000000..8889587
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/b65ea16ba4dae8599ebbad7c4cb9fcd505edf485
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/b95311782071c4d9182c0effe32487fc5cdbd33d b/src/fuzz/der_roundtrip_corpus/b95311782071c4d9182c0effe32487fc5cdbd33d
new file mode 100644
index 0000000..c77cced
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/b95311782071c4d9182c0effe32487fc5cdbd33d
@@ -0,0 +1 @@
+0<ÿ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/bbcaf4d15f92bfc6d624eee967fade1a74329f30 b/src/fuzz/der_roundtrip_corpus/bbcaf4d15f92bfc6d624eee967fade1a74329f30
new file mode 100644
index 0000000..2653f41
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/bbcaf4d15f92bfc6d624eee967fade1a74329f30
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/bc26b8c794ac0adf948cbca02e88b3901824ef17 b/src/fuzz/der_roundtrip_corpus/bc26b8c794ac0adf948cbca02e88b3901824ef17
new file mode 100644
index 0000000..ca5d10d
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/bc26b8c794ac0adf948cbca02e88b3901824ef17
@@ -0,0 +1 @@
+0‚
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/bc7b23c2c68e4ad33ecea493ff6e60d423371cd0 b/src/fuzz/der_roundtrip_corpus/bc7b23c2c68e4ad33ecea493ff6e60d423371cd0
new file mode 100644
index 0000000..cb468b7
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/bc7b23c2c68e4ad33ecea493ff6e60d423371cd0
@@ -0,0 +1 @@
+ÿë܅ÔÐÔÔԎ
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/bd8daf3e78d8ba3a25838053b6993edc7a21c30e b/src/fuzz/der_roundtrip_corpus/bd8daf3e78d8ba3a25838053b6993edc7a21c30e
new file mode 100644
index 0000000..fb1660c
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/bd8daf3e78d8ba3a25838053b6993edc7a21c30e
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/c4d94647e646f02da1736b3179804ad6083acde9 b/src/fuzz/der_roundtrip_corpus/c4d94647e646f02da1736b3179804ad6083acde9
new file mode 100644
index 0000000..cac91dc
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/c4d94647e646f02da1736b3179804ad6083acde9
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/c869b259f9f81bec8ed24a9bc2cef35a513fb9fc b/src/fuzz/der_roundtrip_corpus/c869b259f9f81bec8ed24a9bc2cef35a513fb9fc
new file mode 100644
index 0000000..e277d1e
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/c869b259f9f81bec8ed24a9bc2cef35a513fb9fc
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/ceee46f04a09ef5d3342ef25d9f483e861727575 b/src/fuzz/der_roundtrip_corpus/ceee46f04a09ef5d3342ef25d9f483e861727575
new file mode 100644
index 0000000..0f62d09
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/ceee46f04a09ef5d3342ef25d9f483e861727575
@@ -0,0 +1 @@
+0€€
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/d05c069216b54f35bc7e3ee08371baee243c089a b/src/fuzz/der_roundtrip_corpus/d05c069216b54f35bc7e3ee08371baee243c089a
new file mode 100644
index 0000000..afa7104
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/d05c069216b54f35bc7e3ee08371baee243c089a
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/d18c30ba21e0d085dd983ad528f2c9001285d3d2 b/src/fuzz/der_roundtrip_corpus/d18c30ba21e0d085dd983ad528f2c9001285d3d2
new file mode 100644
index 0000000..19032aa
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/d18c30ba21e0d085dd983ad528f2c9001285d3d2
@@ -0,0 +1 @@
+0e
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/d2c00146b2f2bcb4c6cecb731d2062273523d8c8 b/src/fuzz/der_roundtrip_corpus/d2c00146b2f2bcb4c6cecb731d2062273523d8c8
new file mode 100644
index 0000000..4f0ec48
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/d2c00146b2f2bcb4c6cecb731d2062273523d8c8
@@ -0,0 +1 @@
+0ÿ€
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/d9bc7157a485958a5fce35ce777f551fe3f7d94c b/src/fuzz/der_roundtrip_corpus/d9bc7157a485958a5fce35ce777f551fe3f7d94c
new file mode 100644
index 0000000..c5b4943
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/d9bc7157a485958a5fce35ce777f551fe3f7d94c
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/defce76f0d3c3e057bb623986bacee7bbd07d1a1 b/src/fuzz/der_roundtrip_corpus/defce76f0d3c3e057bb623986bacee7bbd07d1a1
new file mode 100644
index 0000000..ae7ebe5
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/defce76f0d3c3e057bb623986bacee7bbd07d1a1
@@ -0,0 +1 @@
+?€
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/df9b696736847e43672b7a99ca05655af8a81135 b/src/fuzz/der_roundtrip_corpus/df9b696736847e43672b7a99ca05655af8a81135
new file mode 100644
index 0000000..b591619
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/df9b696736847e43672b7a99ca05655af8a81135
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/e5b420f71cf412bd9fdebdd46245fabd1f3462e5 b/src/fuzz/der_roundtrip_corpus/e5b420f71cf412bd9fdebdd46245fabd1f3462e5
new file mode 100644
index 0000000..a1ced38
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/e5b420f71cf412bd9fdebdd46245fabd1f3462e5
@@ -0,0 +1 @@
+0ÿÿÿÿÿ_
\ No newline at end of file
diff --git a/src/fuzz/der_roundtrip_corpus/e7979b0e6e3e9cd64ceab99778c55205d6f92a73 b/src/fuzz/der_roundtrip_corpus/e7979b0e6e3e9cd64ceab99778c55205d6f92a73
new file mode 100644
index 0000000..de60cf5
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/e7979b0e6e3e9cd64ceab99778c55205d6f92a73
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/ee629f1935abc05fdc32ba314ec1f80f4bff2a17 b/src/fuzz/der_roundtrip_corpus/ee629f1935abc05fdc32ba314ec1f80f4bff2a17
new file mode 100644
index 0000000..8e69b75
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/ee629f1935abc05fdc32ba314ec1f80f4bff2a17
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/f944dcd635f9801f7ac90a407fbc479964dec024 b/src/fuzz/der_roundtrip_corpus/f944dcd635f9801f7ac90a407fbc479964dec024
new file mode 100644
index 0000000..def7fcb
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/f944dcd635f9801f7ac90a407fbc479964dec024
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/fadcde7d914246ca04bd56e68fd4045b1cf1c5ef b/src/fuzz/der_roundtrip_corpus/fadcde7d914246ca04bd56e68fd4045b1cf1c5ef
new file mode 100644
index 0000000..0013251
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/fadcde7d914246ca04bd56e68fd4045b1cf1c5ef
Binary files differ
diff --git a/src/fuzz/der_roundtrip_corpus/fd8be6506a9995f626eef831b9c981a80b0e3640 b/src/fuzz/der_roundtrip_corpus/fd8be6506a9995f626eef831b9c981a80b0e3640
new file mode 100644
index 0000000..a304314
--- /dev/null
+++ b/src/fuzz/der_roundtrip_corpus/fd8be6506a9995f626eef831b9c981a80b0e3640
Binary files differ
diff --git a/src/include/openssl/aead.h b/src/include/openssl/aead.h
index 38eb076..131cfec 100644
--- a/src/include/openssl/aead.h
+++ b/src/include/openssl/aead.h
@@ -180,6 +180,10 @@
 // v1.0.
 OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_bluetooth_8(void);
 
+// EVP_aead_aes_128_ccm_matter is AES-128-CCM with M=16 and L=2 (16-byte tags
+// and 13-byte nonces), as used in the Matter specification.
+OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_ccm_matter(void);
+
 // EVP_has_aes_hardware returns one if we enable hardware support for fast and
 // constant-time AES-GCM.
 OPENSSL_EXPORT int EVP_has_aes_hardware(void);
@@ -212,15 +216,15 @@
   uint64_t alignment;
 };
 
-// An EVP_AEAD_CTX represents an AEAD algorithm configured with a specific key
-// and message-independent IV.
-typedef struct evp_aead_ctx_st {
+// An evp_aead_ctx_st (typedefed as |EVP_AEAD_CTX| in base.h) represents an AEAD
+// algorithm configured with a specific key and message-independent IV.
+struct evp_aead_ctx_st {
   const EVP_AEAD *aead;
   union evp_aead_ctx_st_state state;
   // tag_len may contain the actual length of the authentication tag if it is
   // known at initialization time.
   uint8_t tag_len;
-} EVP_AEAD_CTX;
+};
 
 // EVP_AEAD_MAX_KEY_LENGTH contains the maximum key length used by
 // any AEAD defined in this header.
diff --git a/src/include/openssl/arm_arch.h b/src/include/openssl/arm_arch.h
index 81dc796..7215f62 100644
--- a/src/include/openssl/arm_arch.h
+++ b/src/include/openssl/arm_arch.h
@@ -53,54 +53,12 @@
 #ifndef OPENSSL_HEADER_ARM_ARCH_H
 #define OPENSSL_HEADER_ARM_ARCH_H
 
-#if !defined(__ARM_ARCH__)
-# if defined(__CC_ARM)
-#  define __ARM_ARCH__ __TARGET_ARCH_ARM
-#  if defined(__BIG_ENDIAN)
-#   define __ARMEB__
-#  else
-#   define __ARMEL__
-#  endif
-# elif defined(__GNUC__)
-#  if defined(__aarch64__)
-#    define __ARM_ARCH__ 8
-#    if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#      define __ARMEB__
-#    else
-#      define __ARMEL__
-#    endif
-  // Why doesn't gcc define __ARM_ARCH__? Instead it defines
-  // bunch of below macros. See all_architectires[] table in
-  // gcc/config/arm/arm.c. On a side note it defines
-  // __ARMEL__/__ARMEB__ for little-/big-endian.
-#  elif	defined(__ARM_ARCH)
-#    define __ARM_ARCH__ __ARM_ARCH
-#  elif	defined(__ARM_ARCH_8A__)
-#    define __ARM_ARCH__ 8
-#  elif	defined(__ARM_ARCH_7__)	|| defined(__ARM_ARCH_7A__)	|| \
-	defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__)	|| \
-	defined(__ARM_ARCH_7EM__)
-#   define __ARM_ARCH__ 7
-#  elif	defined(__ARM_ARCH_6__)	|| defined(__ARM_ARCH_6J__)	|| \
-	defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__)	|| \
-	defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__)	|| \
-	defined(__ARM_ARCH_6T2__)
-#   define __ARM_ARCH__ 6
-#  elif	defined(__ARM_ARCH_5__)	|| defined(__ARM_ARCH_5T__)	|| \
-	defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__)	|| \
-	defined(__ARM_ARCH_5TEJ__)
-#   define __ARM_ARCH__ 5
-#  elif	defined(__ARM_ARCH_4__)	|| defined(__ARM_ARCH_4T__)
-#   define __ARM_ARCH__ 4
-#  else
-#   error "unsupported ARM architecture"
-#  endif
-# endif
-#endif
+// arm_arch.h contains symbols used by ARM assembly, and the C code that calls
+// it. It is included as a public header to simplify the build, but is not
+// intended for external use.
 
-// Even when building for 32-bit ARM, support for aarch64 crypto instructions
-// will be included.
-#define __ARM_MAX_ARCH__ 8
+#if defined(__ARMEL__) || defined(_M_ARM) || defined(__AARCH64EL__) || \
+    defined(_M_ARM64)
 
 // ARMV7_NEON is true when a NEON unit is present in the current CPU.
 #define ARMV7_NEON (1 << 0)
@@ -117,8 +75,28 @@
 // ARMV8_PMULL indicates support for carryless multiplication.
 #define ARMV8_PMULL (1 << 5)
 
+// ARMV8_SHA512 indicates support for hardware SHA-512 instructions.
+#define ARMV8_SHA512 (1 << 6)
+
 #if defined(__ASSEMBLER__)
 
+// We require the ARM assembler provide |__ARM_ARCH| from Arm C Language
+// Extensions (ACLE). This is supported in GCC 4.8+ and Clang 3.2+. MSVC does
+// not implement ACLE, but we require Clang's assembler on Windows.
+#if !defined(__ARM_ARCH)
+#error "ARM assembler must define __ARM_ARCH"
+#endif
+
+// __ARM_ARCH__ is used by OpenSSL assembly to determine the minimum target ARM
+// version.
+//
+// TODO(davidben): Switch the assembly to use |__ARM_ARCH| directly.
+#define __ARM_ARCH__ __ARM_ARCH
+
+// Even when building for 32-bit ARM, support for aarch64 crypto instructions
+// will be included.
+#define __ARM_MAX_ARCH__ 8
+
 // Support macros for
 //   - Armv8.3-A Pointer Authentication and
 //   - Armv8.5-A Branch Target Identification
@@ -235,6 +213,8 @@
 .popsection;
 #endif
 
-#endif  /* defined __ASSEMBLER__ */
+#endif  // __ASSEMBLER__
+
+#endif  // __ARMEL__ || _M_ARM || __AARCH64EL__ || _M_ARM64
 
 #endif  // OPENSSL_HEADER_ARM_ARCH_H
diff --git a/src/include/openssl/asn1.h b/src/include/openssl/asn1.h
index d8a371c..693b38e 100644
--- a/src/include/openssl/asn1.h
+++ b/src/include/openssl/asn1.h
@@ -605,7 +605,9 @@
 OPENSSL_EXPORT int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b);
 
 // ASN1_STRING_set sets the contents of |str| to a copy of |len| bytes from
-// |data|. It returns one on success and zero on error.
+// |data|. It returns one on success and zero on error. If |data| is NULL, it
+// updates the length and allocates the buffer as needed, but does not
+// initialize the contents.
 OPENSSL_EXPORT int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len);
 
 // ASN1_STRING_set0 sets the contents of |str| to |len| bytes from |data|. It
@@ -1014,6 +1016,12 @@
 // |V_ASN1_INTEGER| or |V_ASN1_ENUMERATED|, while negative values have a type of
 // |V_ASN1_NEG_INTEGER| or |V_ASN1_NEG_ENUMERATED|. Note this differs from DER's
 // two's complement representation.
+//
+// The data in the |ASN1_STRING| may not have leading zeros. Note this means
+// zero is represented as the empty string. Parsing functions will never return
+// invalid representations. If an invalid input is constructed, the marshaling
+// functions will skip leading zeros, however other functions, such as
+// |ASN1_INTEGER_cmp| or |ASN1_INTEGER_get|, may not return the correct result.
 
 DEFINE_STACK_OF(ASN1_INTEGER)
 
@@ -1068,17 +1076,24 @@
 // |ASN1_INTEGER*|.
 DECLARE_ASN1_ITEM(ASN1_INTEGER)
 
-// ASN1_INTEGER_set sets |a| to an INTEGER with value |v|. It returns one on
-// success and zero on error.
-OPENSSL_EXPORT int ASN1_INTEGER_set(ASN1_INTEGER *a, long v);
-
 // ASN1_INTEGER_set_uint64 sets |a| to an INTEGER with value |v|. It returns one
 // on success and zero on error.
 OPENSSL_EXPORT int ASN1_INTEGER_set_uint64(ASN1_INTEGER *out, uint64_t v);
 
-// ASN1_INTEGER_get returns the value of |a| as a |long|, or -1 if |a| is out of
-// range or the wrong type.
-OPENSSL_EXPORT long ASN1_INTEGER_get(const ASN1_INTEGER *a);
+// ASN1_INTEGER_set_int64 sets |a| to an INTEGER with value |v|. It returns one
+// on success and zero on error.
+OPENSSL_EXPORT int ASN1_INTEGER_set_int64(ASN1_INTEGER *out, int64_t v);
+
+// ASN1_INTEGER_get_uint64 converts |a| to a |uint64_t|. On success, it returns
+// one and sets |*out| to the result. If |a| did not fit or has the wrong type,
+// it returns zero.
+OPENSSL_EXPORT int ASN1_INTEGER_get_uint64(uint64_t *out,
+                                           const ASN1_INTEGER *a);
+
+// ASN1_INTEGER_get_int64 converts |a| to a |int64_t|. On success, it returns
+// one and sets |*out| to the result. If |a| did not fit or has the wrong type,
+// it returns zero.
+OPENSSL_EXPORT int ASN1_INTEGER_get_int64(int64_t *out, const ASN1_INTEGER *a);
 
 // BN_to_ASN1_INTEGER sets |ai| to an INTEGER with value |bn| and returns |ai|
 // on success or NULL or error. If |ai| is NULL, it returns a newly-allocated
@@ -1123,18 +1138,30 @@
 // |ASN1_ENUMERATED*|.
 DECLARE_ASN1_ITEM(ASN1_ENUMERATED)
 
-// ASN1_ENUMERATED_set sets |a| to an ENUMERATED with value |v|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v);
+// ASN1_ENUMERATED_set_uint64 sets |a| to an ENUMERATED with value |v|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int ASN1_ENUMERATED_set_uint64(ASN1_ENUMERATED *out, uint64_t v);
 
-// ASN1_ENUMERATED_get returns the value of |a| as a |long|, or -1 if |a| is out
-// of range or the wrong type.
-OPENSSL_EXPORT long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a);
+// ASN1_ENUMERATED_set_int64 sets |a| to an ENUMERATED with value |v|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *out, int64_t v);
+
+// ASN1_ENUMERATED_get_uint64 converts |a| to a |uint64_t|. On success, it
+// returns one and sets |*out| to the result. If |a| did not fit or has the
+// wrong type, it returns zero.
+OPENSSL_EXPORT int ASN1_ENUMERATED_get_uint64(uint64_t *out,
+                                              const ASN1_ENUMERATED *a);
+
+// ASN1_ENUMERATED_get_int64 converts |a| to a |int64_t|. On success, it
+// returns one and sets |*out| to the result. If |a| did not fit or has the
+// wrong type, it returns zero.
+OPENSSL_EXPORT int ASN1_ENUMERATED_get_int64(int64_t *out,
+                                             const ASN1_ENUMERATED *a);
 
 // BN_to_ASN1_ENUMERATED sets |ai| to an ENUMERATED with value |bn| and returns
 // |ai| on success or NULL or error. If |ai| is NULL, it returns a
-// newly-allocated |ASN1_INTEGER| on success instead, which the caller must
-// release with |ASN1_INTEGER_free|.
+// newly-allocated |ASN1_ENUMERATED| on success instead, which the caller must
+// release with |ASN1_ENUMERATED_free|.
 OPENSSL_EXPORT ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn,
                                                       ASN1_ENUMERATED *ai);
 
@@ -1349,6 +1376,15 @@
 // GeneralizedTime. If |str| is neither, it returns zero.
 OPENSSL_EXPORT int ASN1_TIME_set_string(ASN1_TIME *s, const char *str);
 
+// ASN1_TIME_to_time_t converts |t| to a time_t value in |out|. On
+// success, one is returned. On failure zero is returned. This function
+// will fail if the time can not be represented in a time_t.
+OPENSSL_EXPORT int ASN1_TIME_to_time_t(const ASN1_TIME *t, time_t *out);
+
+// ASN1_TIME_to_posix converts |t| to a POSIX time value in |out|. On
+// success, one is returned. On failure zero is returned.
+OPENSSL_EXPORT int ASN1_TIME_to_posix(const ASN1_TIME *t, int64_t *out);
+
 // TODO(davidben): Expand and document function prototypes generated in macros.
 
 
@@ -1620,6 +1656,8 @@
 // replaced with '.'.
 OPENSSL_EXPORT int ASN1_STRING_print(BIO *out, const ASN1_STRING *str);
 
+// The following flags must not collide with |XN_FLAG_*|.
+
 // ASN1_STRFLGS_ESC_2253 causes characters to be escaped as in RFC 2253, section
 // 2.4.
 #define ASN1_STRFLGS_ESC_2253 1
@@ -1922,6 +1960,32 @@
 // printable characters. See https://crbug.com/boringssl/412.
 DECLARE_ASN1_ITEM(ASN1_PRINTABLE)
 
+// ASN1_INTEGER_set sets |a| to an INTEGER with value |v|. It returns one on
+// success and zero on error.
+//
+// Use |ASN1_INTEGER_set_uint64| and |ASN1_INTEGER_set_int64| instead.
+OPENSSL_EXPORT int ASN1_INTEGER_set(ASN1_INTEGER *a, long v);
+
+// ASN1_ENUMERATED_set sets |a| to an ENUMERATED with value |v|. It returns one
+// on success and zero on error.
+//
+// Use |ASN1_ENUMERATED_set_uint64| and |ASN1_ENUMERATED_set_int64| instead.
+OPENSSL_EXPORT int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v);
+
+// ASN1_INTEGER_get returns the value of |a| as a |long|, or -1 if |a| is out of
+// range or the wrong type.
+//
+// WARNING: This function's return value cannot distinguish errors from -1.
+// Use |ASN1_INTEGER_get_uint64| and |ASN1_INTEGER_get_int64| instead.
+OPENSSL_EXPORT long ASN1_INTEGER_get(const ASN1_INTEGER *a);
+
+// ASN1_ENUMERATED_get returns the value of |a| as a |long|, or -1 if |a| is out
+// of range or the wrong type.
+//
+// WARNING: This function's return value cannot distinguish errors from -1.
+// Use |ASN1_ENUMERATED_get_uint64| and |ASN1_ENUMERATED_get_int64| instead.
+OPENSSL_EXPORT long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a);
+
 
 #if defined(__cplusplus)
 }  // extern C
@@ -2035,5 +2099,7 @@
 #define ASN1_R_NESTED_TOO_DEEP 192
 #define ASN1_R_BAD_TEMPLATE 193
 #define ASN1_R_INVALID_BIT_STRING_PADDING 194
+#define ASN1_R_WRONG_INTEGER_TYPE 195
+#define ASN1_R_INVALID_INTEGER 196
 
 #endif
diff --git a/src/include/openssl/asn1t.h b/src/include/openssl/asn1t.h
index dccbd1a..105cee8 100644
--- a/src/include/openssl/asn1t.h
+++ b/src/include/openssl/asn1t.h
@@ -260,7 +260,6 @@
 /* Any defined by macros: the field used is in the table itself */
 
 #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
-#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
 /* Plain simple type */
 #define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
 
@@ -377,7 +376,7 @@
 };
 
 struct ASN1_ADB_TABLE_st {
-	long value;		/* NID for an object or value for an int */
+	int value;		/* NID for an object */
 	const ASN1_TEMPLATE tt;		/* item for this value */
 };
 
@@ -442,8 +441,6 @@
 
 #define ASN1_TFLG_ADB_OID	(0x1<<8)
 
-#define ASN1_TFLG_ADB_INT	(0x1<<9)
-
 /* This flag means a parent structure is passed
  * instead of the field: this is useful is a
  * SEQUENCE is being combined with a CHOICE for
@@ -512,19 +509,8 @@
 
 #define ASN1_ITYPE_MSTRING		0x5
 
-/* Cache for ASN1 tag and length, so we
- * don't keep re-reading it for things
- * like CHOICE
- */
-
-struct ASN1_TLC_st{
-	char valid;	/* Values below are valid */
-	int ret;	/* return value */
-	long plen;	/* length */
-	int ptag;	/* class value */
-	int pclass;	/* class value */
-	int hdrlen;	/* header length */
-};
+/* Deprecated tag and length cache */
+struct ASN1_TLC_st;
 
 /* Typedefs for ASN1 function pointers */
 
@@ -691,13 +677,17 @@
 	int i2d_##fname(const stname *a, unsigned char **out) \
 	{ \
 		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
-	} 
+	}
 
-#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
-	stname * stname##_dup(stname *x) \
-        { \
-        return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
-        }
+#define IMPLEMENT_ASN1_DUP_FUNCTION(stname)          \
+  stname *stname##_dup(stname *x) {                  \
+    return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
+  }
+
+#define IMPLEMENT_ASN1_DUP_FUNCTION_const(stname)            \
+  stname *stname##_dup(const stname *x) {                    \
+    return ASN1_item_dup(ASN1_ITEM_rptr(stname), (void *)x); \
+  }
 
 #define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
 		IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
diff --git a/src/include/openssl/base.h b/src/include/openssl/base.h
index 983eadc..7afcc4f 100644
--- a/src/include/openssl/base.h
+++ b/src/include/openssl/base.h
@@ -107,6 +107,7 @@
 #define OPENSSL_MIPS64
 #elif defined(__riscv) && __SIZEOF_POINTER__ == 8
 #define OPENSSL_64_BIT
+#define OPENSSL_RISCV64
 #elif defined(__riscv) && __SIZEOF_POINTER__ == 4
 #define OPENSSL_32_BIT
 #elif defined(__pnacl__)
@@ -195,7 +196,7 @@
 // A consumer may use this symbol in the preprocessor to temporarily build
 // against multiple revisions of BoringSSL at the same time. It is not
 // recommended to do so for longer than is necessary.
-#define BORINGSSL_API_VERSION 16
+#define BORINGSSL_API_VERSION 18
 
 #if defined(BORINGSSL_SHARED_LIBRARY)
 
@@ -362,10 +363,6 @@
 typedef struct Netscape_spkac_st NETSCAPE_SPKAC;
 typedef struct Netscape_spki_st NETSCAPE_SPKI;
 typedef struct RIPEMD160state_st RIPEMD160_CTX;
-typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE;
-typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
-typedef struct X509_POLICY_NODE_st X509_POLICY_NODE;
-typedef struct X509_POLICY_TREE_st X509_POLICY_TREE;
 typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM;
 typedef struct X509_algor_st X509_ALGOR;
 typedef struct X509_crl_st X509_CRL;
@@ -391,6 +388,7 @@
 typedef struct conf_value_st CONF_VALUE;
 typedef struct crypto_buffer_pool_st CRYPTO_BUFFER_POOL;
 typedef struct crypto_buffer_st CRYPTO_BUFFER;
+typedef struct ctr_drbg_state_st CTR_DRBG_STATE;
 typedef struct dh_st DH;
 typedef struct dsa_st DSA;
 typedef struct ec_group_st EC_GROUP;
@@ -402,6 +400,7 @@
 typedef struct env_md_ctx_st EVP_MD_CTX;
 typedef struct env_md_st EVP_MD;
 typedef struct evp_aead_st EVP_AEAD;
+typedef struct evp_aead_ctx_st EVP_AEAD_CTX;
 typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
 typedef struct evp_cipher_st EVP_CIPHER;
 typedef struct evp_encode_ctx_st EVP_ENCODE_CTX;
@@ -448,8 +447,6 @@
 typedef struct trust_token_method_st TRUST_TOKEN_METHOD;
 typedef struct v3_ext_ctx X509V3_CTX;
 typedef struct x509_attributes_st X509_ATTRIBUTE;
-typedef struct x509_cert_aux_st X509_CERT_AUX;
-typedef struct x509_crl_method_st X509_CRL_METHOD;
 typedef struct x509_lookup_st X509_LOOKUP;
 typedef struct x509_lookup_method_st X509_LOOKUP_METHOD;
 typedef struct x509_object_st X509_OBJECT;
diff --git a/src/include/openssl/bio.h b/src/include/openssl/bio.h
index 18bc893..1658ff2 100644
--- a/src/include/openssl/bio.h
+++ b/src/include/openssl/bio.h
@@ -508,6 +508,25 @@
 // |FILE| will be closed when |bio| is freed.
 OPENSSL_EXPORT int BIO_rw_filename(BIO *bio, const char *filename);
 
+// BIO_tell returns the file offset of |bio|, or a negative number on error or
+// if |bio| does not support the operation.
+//
+// TODO(https://crbug.com/boringssl/465): On platforms where |long| is 32-bit,
+// this function cannot report 64-bit offsets.
+OPENSSL_EXPORT long BIO_tell(BIO *bio);
+
+// BIO_seek sets the file offset of |bio| to |offset|. It returns a non-negative
+// number on success and a negative number on error. If |bio| is a file
+// descriptor |BIO|, it returns the resulting file offset on success. If |bio|
+// is a file |BIO|, it returns zero on success.
+//
+// WARNING: This function's return value conventions differs from most functions
+// in this library.
+//
+// TODO(https://crbug.com/boringssl/465): On platforms where |long| is 32-bit,
+// this function cannot handle 64-bit offsets.
+OPENSSL_EXPORT long BIO_seek(BIO *bio, long offset);
+
 
 // Socket BIOs.
 //
diff --git a/src/include/openssl/bn.h b/src/include/openssl/bn.h
index 5ca8b85..0f381af 100644
--- a/src/include/openssl/bn.h
+++ b/src/include/openssl/bn.h
@@ -148,14 +148,14 @@
 // Projects which use |BN_*_FMT*| with outdated C headers may need to define it
 // externally.
 #if defined(OPENSSL_64_BIT)
-#define BN_ULONG uint64_t
+typedef uint64_t BN_ULONG;
 #define BN_BITS2 64
 #define BN_DEC_FMT1 "%" PRIu64
 #define BN_DEC_FMT2 "%019" PRIu64
 #define BN_HEX_FMT1 "%" PRIx64
 #define BN_HEX_FMT2 "%016" PRIx64
 #elif defined(OPENSSL_32_BIT)
-#define BN_ULONG uint32_t
+typedef uint32_t BN_ULONG;
 #define BN_BITS2 32
 #define BN_DEC_FMT1 "%" PRIu32
 #define BN_DEC_FMT2 "%09" PRIu32
@@ -205,6 +205,10 @@
 
 // BN_num_bytes returns the minimum number of bytes needed to represent the
 // absolute value of |bn|.
+//
+// While |size_t| is the preferred type for byte counts, callers can assume that
+// |BIGNUM|s are bounded such that this value, and its corresponding bit count,
+// will always fit in |int|.
 OPENSSL_EXPORT unsigned BN_num_bytes(const BIGNUM *bn);
 
 // BN_zero sets |bn| to zero.
@@ -584,9 +588,14 @@
                                         const BIGNUM *m);
 
 // BN_mod_sqrt returns a newly-allocated |BIGNUM|, r, such that
-// r^2 == a (mod p). |p| must be a prime. It returns NULL on error or if |a| is
-// not a square mod |p|. In the latter case, it will add |BN_R_NOT_A_SQUARE| to
-// the error queue.
+// r^2 == a (mod p). It returns NULL on error or if |a| is not a square mod |p|.
+// In the latter case, it will add |BN_R_NOT_A_SQUARE| to the error queue.
+// If |a| is a square and |p| > 2, there are two possible square roots. This
+// function may return either and may even select one non-deterministically.
+//
+// This function only works if |p| is a prime. If |p| is composite, it may fail
+// or return an arbitrary value. Callers should not pass attacker-controlled
+// values of |p|.
 OPENSSL_EXPORT BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p,
                                    BN_CTX *ctx);
 
@@ -658,6 +667,14 @@
   int (*callback)(int event, int n, struct bn_gencb_st *);
 };
 
+// BN_GENCB_new returns a newly-allocated |BN_GENCB| object, or NULL on
+// allocation failure. The result must be released with |BN_GENCB_free| when
+// done.
+OPENSSL_EXPORT BN_GENCB *BN_GENCB_new(void);
+
+// BN_GENCB_free releases memory associated with |callback|.
+OPENSSL_EXPORT void BN_GENCB_free(BN_GENCB *callback);
+
 // BN_GENCB_set configures |callback| to call |f| and sets |callout->arg| to
 // |arg|.
 OPENSSL_EXPORT void BN_GENCB_set(BN_GENCB *callback,
@@ -668,6 +685,9 @@
 // the callback, or 1 if |callback| is NULL.
 OPENSSL_EXPORT int BN_GENCB_call(BN_GENCB *callback, int event, int n);
 
+// BN_GENCB_get_arg returns |callback->arg|.
+OPENSSL_EXPORT void *BN_GENCB_get_arg(const BN_GENCB *callback);
+
 // BN_generate_prime_ex sets |ret| to a prime number of |bits| length. If safe
 // is non-zero then the prime will be such that (ret-1)/2 is also a prime.
 // (This is needed for Diffie-Hellman groups to ensure that the only subgroups
@@ -951,6 +971,9 @@
 // conservative.)
 #define BN_prime_checks BN_prime_checks_for_validation
 
+// BN_secure_new calls |BN_new|.
+OPENSSL_EXPORT BIGNUM *BN_secure_new(void);
+
 
 // Private functions
 
diff --git a/src/include/openssl/bytestring.h b/src/include/openssl/bytestring.h
index 5ef3742..33a417c 100644
--- a/src/include/openssl/bytestring.h
+++ b/src/include/openssl/bytestring.h
@@ -18,6 +18,7 @@
 #include <openssl/base.h>
 
 #include <openssl/span.h>
+#include <time.h>
 
 #if defined(__cplusplus)
 extern "C" {
@@ -259,15 +260,21 @@
 
 // CBS_get_any_ber_asn1_element acts the same as |CBS_get_any_asn1_element| but
 // also allows indefinite-length elements to be returned and does not enforce
-// that lengths are minimal. For indefinite-lengths, |*out_header_len| and
+// that lengths are minimal. It sets |*out_indefinite| to one if the length was
+// indefinite and zero otherwise. If indefinite, |*out_header_len| and
 // |CBS_len(out)| will be equal as only the header is returned (although this is
-// also true for empty elements so the length must be checked too). If
+// also true for empty elements so |*out_indefinite| should be checked). If
 // |out_ber_found| is not NULL then it is set to one if any case of invalid DER
 // but valid BER is found, and to zero otherwise.
+//
+// This function will not successfully parse an end-of-contents (EOC) as an
+// element. Callers parsing indefinite-length encoding must check for EOC
+// separately.
 OPENSSL_EXPORT int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out,
                                                 unsigned *out_tag,
                                                 size_t *out_header_len,
-                                                int *out_ber_found);
+                                                int *out_ber_found,
+                                                int *out_indefinite);
 
 // CBS_get_asn1_uint64 gets an ASN.1 INTEGER from |cbs| using |CBS_get_asn1|
 // and sets |*out| to its value. It returns one on success and zero on error,
@@ -347,6 +354,26 @@
 OPENSSL_EXPORT char *CBS_asn1_oid_to_text(const CBS *cbs);
 
 
+// CBS_parse_generalized_time returns one if |cbs| is a valid DER-encoded, ASN.1
+// GeneralizedTime body within the limitations imposed by RFC 5280, or zero
+// otherwise. If |allow_timezone_offset| is non-zero, four-digit timezone
+// offsets, which would not be allowed by DER, are permitted. On success, if
+// |out_tm| is non-NULL, |*out_tm| will be zeroed, and then set to the
+// corresponding time in UTC. This function does not compute |out_tm->tm_wday|
+// or |out_tm->tm_yday|.
+OPENSSL_EXPORT int CBS_parse_generalized_time(const CBS *cbs, struct tm *out_tm,
+                                              int allow_timezone_offset);
+
+// CBS_parse_utc_time returns one if |cbs| is a valid DER-encoded, ASN.1
+// UTCTime body within the limitations imposed by RFC 5280, or zero otherwise.
+// If |allow_timezone_offset| is non-zero, four-digit timezone offsets, which
+// would not be allowed by DER, are permitted. On success, if |out_tm| is
+// non-NULL, |*out_tm| will be zeroed, and then set to the corresponding time
+// in UTC. This function does not compute |out_tm->tm_wday| or
+// |out_tm->tm_yday|.
+OPENSSL_EXPORT int CBS_parse_utc_time(const CBS *cbs, struct tm *out_tm,
+                                      int allow_timezone_offset);
+
 // CRYPTO ByteBuilder.
 //
 // |CBB| objects allow one to build length-prefixed serialisations. A |CBB|
@@ -530,11 +557,23 @@
 // error.
 OPENSSL_EXPORT int CBB_add_asn1_uint64(CBB *cbb, uint64_t value);
 
+// CBB_add_asn1_uint64_with_tag behaves like |CBB_add_asn1_uint64| but uses
+// |tag| as the tag instead of INTEGER. This is useful if the INTEGER type uses
+// implicit tagging.
+OPENSSL_EXPORT int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value,
+                                                unsigned tag);
+
 // CBB_add_asn1_int64 writes an ASN.1 INTEGER into |cbb| using |CBB_add_asn1|
 // and writes |value| in its contents. It returns one on success and zero on
 // error.
 OPENSSL_EXPORT int CBB_add_asn1_int64(CBB *cbb, int64_t value);
 
+// CBB_add_asn1_int64_with_tag behaves like |CBB_add_asn1_int64| but uses |tag|
+// as the tag instead of INTEGER. This is useful if the INTEGER type uses
+// implicit tagging.
+OPENSSL_EXPORT int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value,
+                                               unsigned tag);
+
 // CBB_add_asn1_octet_string writes an ASN.1 OCTET STRING into |cbb| with the
 // given contents. It returns one on success and zero on error.
 OPENSSL_EXPORT int CBB_add_asn1_octet_string(CBB *cbb, const uint8_t *data,
diff --git a/src/include/openssl/cipher.h b/src/include/openssl/cipher.h
index 2458847..ba4b698 100644
--- a/src/include/openssl/cipher.h
+++ b/src/include/openssl/cipher.h
@@ -174,6 +174,11 @@
 // of output bytes may be up to |in_len| plus the block length minus one and
 // |out| must have sufficient space. The number of bytes actually output is
 // written to |*out_len|. It returns one on success and zero otherwise.
+//
+// If |ctx| is an AEAD cipher, e.g. |EVP_aes_128_gcm|, and |out| is NULL, this
+// function instead adds |in_len| bytes from |in| to the AAD and sets |*out_len|
+// to |in_len|. The AAD must be fully specified in this way before this function
+// is used to encrypt plaintext.
 OPENSSL_EXPORT int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out,
                                      int *out_len, const uint8_t *in,
                                      int in_len);
@@ -191,6 +196,11 @@
 // output bytes may be up to |in_len| plus the block length minus one and |out|
 // must have sufficient space. The number of bytes actually output is written
 // to |*out_len|. It returns one on success and zero otherwise.
+//
+// If |ctx| is an AEAD cipher, e.g. |EVP_aes_128_gcm|, and |out| is NULL, this
+// function instead adds |in_len| bytes from |in| to the AAD and sets |*out_len|
+// to |in_len|. The AAD must be fully specified in this way before this function
+// is used to decrypt ciphertext.
 OPENSSL_EXPORT int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out,
                                      int *out_len, const uint8_t *in,
                                      int in_len);
@@ -204,16 +214,18 @@
 OPENSSL_EXPORT int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out,
                                        int *out_len);
 
-// EVP_Cipher performs a one-shot encryption/decryption operation. No partial
-// blocks are maintained between calls. However, any internal cipher state is
-// still updated. For CBC-mode ciphers, the IV is updated to the final
-// ciphertext block. For stream ciphers, the stream is advanced past the bytes
-// used. It returns one on success and zero otherwise, unless |EVP_CIPHER_flags|
-// has |EVP_CIPH_FLAG_CUSTOM_CIPHER| set. Then it returns the number of bytes
-// written or -1 on error.
+// EVP_Cipher performs a one-shot encryption/decryption operation for non-AEAD
+// ciphers. No partial blocks are maintained between calls. However, any
+// internal cipher state is still updated. For CBC-mode ciphers, the IV is
+// updated to the final ciphertext block. For stream ciphers, the stream is
+// advanced past the bytes used. It returns one on success and zero otherwise.
 //
-// WARNING: this differs from the usual return value convention when using
-// |EVP_CIPH_FLAG_CUSTOM_CIPHER|.
+// WARNING: This function behaves completely differently on AEAD ciphers, such
+// as |EVP_aes_128_gcm|. Rather than being a one-shot operation, it behaves like
+// |EVP_CipherUpdate| or |EVP_CipherFinal_ex|, depending on whether |in| is
+// NULL. It also instead returns the number of bytes written or -1 on error.
+// This behavior is deprecated. Use |EVP_CipherUpdate| or |EVP_CipherFinal_ex|
+// instead.
 //
 // TODO(davidben): The normal ciphers currently never fail, even if, e.g.,
 // |in_len| is not a multiple of the block size for CBC-mode decryption. The
@@ -575,6 +587,9 @@
   int final_used;
 
   uint8_t final[EVP_MAX_BLOCK_LENGTH];  // possible final block
+
+  // Has this structure been rendered unusable by a failure.
+  int poisoned;
 } /* EVP_CIPHER_CTX */;
 
 typedef struct evp_cipher_info_st {
@@ -582,45 +597,6 @@
   unsigned char iv[EVP_MAX_IV_LENGTH];
 } EVP_CIPHER_INFO;
 
-struct evp_cipher_st {
-  // type contains a NID identifing the cipher. (e.g. NID_aes_128_gcm.)
-  int nid;
-
-  // block_size contains the block size, in bytes, of the cipher, or 1 for a
-  // stream cipher.
-  unsigned block_size;
-
-  // key_len contains the key size, in bytes, for the cipher. If the cipher
-  // takes a variable key size then this contains the default size.
-  unsigned key_len;
-
-  // iv_len contains the IV size, in bytes, or zero if inapplicable.
-  unsigned iv_len;
-
-  // ctx_size contains the size, in bytes, of the per-key context for this
-  // cipher.
-  unsigned ctx_size;
-
-  // flags contains the OR of a number of flags. See |EVP_CIPH_*|.
-  uint32_t flags;
-
-  // app_data is a pointer to opaque, user data.
-  void *app_data;
-
-  int (*init)(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv,
-              int enc);
-
-  int (*cipher)(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in,
-                size_t inl);
-
-  // cleanup, if non-NULL, releases memory associated with the context. It is
-  // called if |EVP_CTRL_INIT| succeeds. Note that |init| may not have been
-  // called at this point.
-  void (*cleanup)(EVP_CIPHER_CTX *);
-
-  int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr);
-};
-
 
 #if defined(__cplusplus)
 }  // extern C
diff --git a/src/include/openssl/conf.h b/src/include/openssl/conf.h
index 6890c7d..0872e13 100644
--- a/src/include/openssl/conf.h
+++ b/src/include/openssl/conf.h
@@ -121,19 +121,6 @@
                                             const char *name);
 
 
-// Utility functions
-
-// CONF_parse_list takes a list separated by 'sep' and calls |list_cb| giving
-// the start and length of each member, optionally stripping leading and
-// trailing whitespace. This can be used to parse comma separated lists for
-// example. If |list_cb| returns <= 0, then the iteration is halted and that
-// value is returned immediately. Otherwise it returns one. Note that |list_cb|
-// may be called on an empty member.
-int CONF_parse_list(const char *list, char sep, int remove_whitespace,
-                    int (*list_cb)(const char *elem, int len, void *usr),
-                    void *arg);
-
-
 // Deprecated functions
 
 // These defines do nothing but are provided to make old code easier to
diff --git a/src/include/openssl/cpu.h b/src/include/openssl/cpu.h
index 91cf95e..d865020 100644
--- a/src/include/openssl/cpu.h
+++ b/src/include/openssl/cpu.h
@@ -1,202 +1,18 @@
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
+/* Copyright (c) 2014, Google Inc.
  *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
  *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com). */
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
-#ifndef OPENSSL_HEADER_CPU_H
-#define OPENSSL_HEADER_CPU_H
+// This header is provided for compatibility with older revisions of BoringSSL.
+// TODO(davidben): Remove this header.
 
-#include <openssl/base.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-
-// Runtime CPU feature support
-
-
-#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
-// OPENSSL_ia32cap_P contains the Intel CPUID bits when running on an x86 or
-// x86-64 system.
-//
-//   Index 0:
-//     EDX for CPUID where EAX = 1
-//     Bit 20 is always zero
-//     Bit 28 is adjusted to reflect whether the data cache is shared between
-//       multiple logical cores
-//     Bit 30 is used to indicate an Intel CPU
-//   Index 1:
-//     ECX for CPUID where EAX = 1
-//     Bit 11 is used to indicate AMD XOP support, not SDBG
-//   Index 2:
-//     EBX for CPUID where EAX = 7
-//   Index 3:
-//     ECX for CPUID where EAX = 7
-//
-// Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM
-// bits in XCR0, so it is not necessary to check those.
-extern uint32_t OPENSSL_ia32cap_P[4];
-
-#if defined(BORINGSSL_FIPS) && !defined(BORINGSSL_SHARED_LIBRARY)
-const uint32_t *OPENSSL_ia32cap_get(void);
-#else
-OPENSSL_INLINE const uint32_t *OPENSSL_ia32cap_get(void) {
-  return OPENSSL_ia32cap_P;
-}
-#endif
-
-#endif
-
-#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
-
-#if defined(OPENSSL_APPLE)
-// iOS builds use the static ARM configuration.
-#define OPENSSL_STATIC_ARMCAP
-#endif
-
-#if !defined(OPENSSL_STATIC_ARMCAP)
-// CRYPTO_is_NEON_capable_at_runtime returns true if the current CPU has a NEON
-// unit. Note that |OPENSSL_armcap_P| also exists and contains the same
-// information in a form that's easier for assembly to use.
-OPENSSL_EXPORT int CRYPTO_is_NEON_capable_at_runtime(void);
-
-// CRYPTO_is_ARMv8_AES_capable_at_runtime returns true if the current CPU
-// supports the ARMv8 AES instruction.
-int CRYPTO_is_ARMv8_AES_capable_at_runtime(void);
-
-// CRYPTO_is_ARMv8_PMULL_capable_at_runtime returns true if the current CPU
-// supports the ARMv8 PMULL instruction.
-int CRYPTO_is_ARMv8_PMULL_capable_at_runtime(void);
-
-#if defined(OPENSSL_ARM)
-// CRYPTO_has_broken_NEON returns one if the current CPU is known to have a
-// broken NEON unit. See https://crbug.com/341598.
-OPENSSL_EXPORT int CRYPTO_has_broken_NEON(void);
-
-// CRYPTO_needs_hwcap2_workaround returns one if the ARMv8 AArch32 AT_HWCAP2
-// workaround was needed. See https://crbug.com/boringssl/46.
-OPENSSL_EXPORT int CRYPTO_needs_hwcap2_workaround(void);
-#endif
-#endif  // !OPENSSL_STATIC_ARMCAP
-
-// CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If
-// this is known statically, it is a constant inline function.
-OPENSSL_INLINE int CRYPTO_is_NEON_capable(void) {
-#if defined(__ARM_NEON__) || defined(__ARM_NEON) || \
-    defined(OPENSSL_STATIC_ARMCAP_NEON)
-  return 1;
-#elif defined(OPENSSL_STATIC_ARMCAP)
-  return 0;
-#else
-  return CRYPTO_is_NEON_capable_at_runtime();
-#endif
-}
-
-OPENSSL_INLINE int CRYPTO_is_ARMv8_AES_capable(void) {
-#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_CRYPTO)
-  return 1;
-#elif defined(OPENSSL_STATIC_ARMCAP)
-  return 0;
-#else
-  return CRYPTO_is_ARMv8_AES_capable_at_runtime();
-#endif
-}
-
-OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) {
-#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO)
-  return 1;
-#elif defined(OPENSSL_STATIC_ARMCAP)
-  return 0;
-#else
-  return CRYPTO_is_ARMv8_PMULL_capable_at_runtime();
-#endif
-}
-
-#endif  // OPENSSL_ARM || OPENSSL_AARCH64
-
-#if defined(OPENSSL_PPC64LE)
-
-// CRYPTO_is_PPC64LE_vcrypto_capable returns true iff the current CPU supports
-// the Vector.AES category of instructions.
-int CRYPTO_is_PPC64LE_vcrypto_capable(void);
-
-extern unsigned long OPENSSL_ppc64le_hwcap2;
-
-#endif  // OPENSSL_PPC64LE
-
-#if defined(BORINGSSL_DISPATCH_TEST)
-// Runtime CPU dispatch testing support
-
-// BORINGSSL_function_hit is an array of flags. The following functions will
-// set these flags if BORINGSSL_DISPATCH_TEST is defined.
-//   0: aes_hw_ctr32_encrypt_blocks
-//   1: aes_hw_encrypt
-//   2: aesni_gcm_encrypt
-//   3: aes_hw_set_encrypt_key
-//   4: vpaes_encrypt
-//   5: vpaes_set_encrypt_key
-extern uint8_t BORINGSSL_function_hit[7];
-#endif  // BORINGSSL_DISPATCH_TEST
-
-
-#if defined(__cplusplus)
-}  // extern C
-#endif
-
-#endif  // OPENSSL_HEADER_CPU_H
+#include "crypto.h"
diff --git a/src/include/openssl/crypto.h b/src/include/openssl/crypto.h
index 93b1a9b..b1f696f 100644
--- a/src/include/openssl/crypto.h
+++ b/src/include/openssl/crypto.h
@@ -59,6 +59,12 @@
 // success and zero on error.
 OPENSSL_EXPORT int BORINGSSL_self_test(void);
 
+// BORINGSSL_integrity_test triggers the module's integrity test where the code
+// and data of the module is matched against a hash injected at build time. It
+// returns one on success or zero if there's a mismatch. This function only
+// exists if the module was built in FIPS mode without ASAN.
+OPENSSL_EXPORT int BORINGSSL_integrity_test(void);
+
 // CRYPTO_pre_sandbox_init initializes the crypto library, pre-acquiring some
 // unusual resources to aid running in sandboxed environments. It is safe to
 // call this function multiple times and concurrently from multiple threads.
@@ -67,6 +73,17 @@
 // SANDBOXING.md in the source tree.
 OPENSSL_EXPORT void CRYPTO_pre_sandbox_init(void);
 
+#if defined(OPENSSL_ARM) && defined(OPENSSL_LINUX) && \
+    !defined(OPENSSL_STATIC_ARMCAP)
+// CRYPTO_has_broken_NEON returns one if the current CPU is known to have a
+// broken NEON unit. See https://crbug.com/341598.
+OPENSSL_EXPORT int CRYPTO_has_broken_NEON(void);
+
+// CRYPTO_needs_hwcap2_workaround returns one if the ARMv8 AArch32 AT_HWCAP2
+// workaround was needed. See https://crbug.com/boringssl/46.
+OPENSSL_EXPORT int CRYPTO_needs_hwcap2_workaround(void);
+#endif  // OPENSSL_ARM && OPENSSL_LINUX && !OPENSSL_STATIC_ARMCAP
+
 
 // FIPS monitoring
 
@@ -161,6 +178,21 @@
 // |BORINGSSL_FIPS| and zero otherwise.
 OPENSSL_EXPORT int FIPS_mode_set(int on);
 
+// FIPS_module_name returns the name of the FIPS module.
+OPENSSL_EXPORT const char *FIPS_module_name(void);
+
+// FIPS_version returns the version of the FIPS module, or zero if the build
+// isn't exactly at a verified version. The version, expressed in base 10, will
+// be a date in the form yyyymmddXX where XX is often "00", but can be
+// incremented if multiple versions are defined on a single day.
+//
+// (This format exceeds a |uint32_t| in the year 4294.)
+OPENSSL_EXPORT uint32_t FIPS_version(void);
+
+// FIPS_query_algorithm_status returns one if |algorithm| is FIPS validated in
+// the current BoringSSL and zero otherwise.
+OPENSSL_EXPORT int FIPS_query_algorithm_status(const char *algorithm);
+
 
 #if defined(__cplusplus)
 }  // extern C
diff --git a/src/include/openssl/ctrdrbg.h b/src/include/openssl/ctrdrbg.h
new file mode 100644
index 0000000..62afe0c
--- /dev/null
+++ b/src/include/openssl/ctrdrbg.h
@@ -0,0 +1,76 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_CTRDRBG_H
+#define OPENSSL_HEADER_CTRDRBG_H
+
+#include <openssl/base.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+// FIPS pseudo-random number generator.
+
+
+// CTR-DRBG state objects.
+//
+// CTR_DRBG_STATE contains the state of a FIPS AES-CTR-based pseudo-random
+// number generator. If BoringSSL was built in FIPS mode then this is a FIPS
+// Approved algorithm.
+
+// CTR_DRBG_ENTROPY_LEN is the number of bytes of input entropy. See SP
+// 800-90Ar1, table 3.
+#define CTR_DRBG_ENTROPY_LEN 48
+
+// CTR_DRBG_MAX_GENERATE_LENGTH is the maximum number of bytes that can be
+// generated in a single call to |CTR_DRBG_generate|.
+#define CTR_DRBG_MAX_GENERATE_LENGTH 65536
+
+// CTR_DRBG_new returns an initialized |CTR_DRBG_STATE|, or NULL if either
+// allocation failed or if |personalization_len| is invalid.
+OPENSSL_EXPORT CTR_DRBG_STATE *CTR_DRBG_new(
+    const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *personalization,
+    size_t personalization_len);
+
+// CTR_DRBG_free frees |state| if non-NULL, or else does nothing.
+OPENSSL_EXPORT void CTR_DRBG_free(CTR_DRBG_STATE* state);
+
+// CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy
+// in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of
+// additional data. It returns one on success or zero on error.
+OPENSSL_EXPORT int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg,
+                                   const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                                   const uint8_t *additional_data,
+                                   size_t additional_data_len);
+
+// CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional
+// data (if any) and then writes |out_len| random bytes to |out|, where
+// |out_len| <= |CTR_DRBG_MAX_GENERATE_LENGTH|. It returns one on success or
+// zero on error.
+OPENSSL_EXPORT int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out,
+                                     size_t out_len,
+                                     const uint8_t *additional_data,
+                                     size_t additional_data_len);
+
+// CTR_DRBG_clear zeroises the state of |drbg|.
+OPENSSL_EXPORT void CTR_DRBG_clear(CTR_DRBG_STATE *drbg);
+
+
+#if defined(__cplusplus)
+}  // extern C
+#endif
+
+#endif  // OPENSSL_HEADER_CTRDRBG_H
diff --git a/src/include/openssl/dh.h b/src/include/openssl/dh.h
index 21c9623..660627d 100644
--- a/src/include/openssl/dh.h
+++ b/src/include/openssl/dh.h
@@ -89,6 +89,9 @@
 
 // Properties.
 
+// DH_bits returns the size of |dh|'s group modulus, in bits.
+OPENSSL_EXPORT unsigned DH_bits(const DH *dh);
+
 // DH_get0_pub_key returns |dh|'s public key.
 OPENSSL_EXPORT const BIGNUM *DH_get0_pub_key(const DH *dh);
 
@@ -134,15 +137,40 @@
 
 // Standard parameters.
 
+// DH_get_rfc7919_2048 returns the group `ffdhe2048` from
+// https://tools.ietf.org/html/rfc7919#appendix-A.1. It returns NULL if out
+// of memory.
+OPENSSL_EXPORT DH *DH_get_rfc7919_2048(void);
+
 // BN_get_rfc3526_prime_1536 sets |*ret| to the 1536-bit MODP group from RFC
 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
 // and returned. It returns NULL on allocation failure.
 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret);
 
-// DH_get_rfc7919_2048 returns the group `ffdhe2048` from
-// https://tools.ietf.org/html/rfc7919#appendix-A.1. It returns NULL if out
-// of memory.
-OPENSSL_EXPORT DH *DH_get_rfc7919_2048(void);
+// BN_get_rfc3526_prime_2048 sets |*ret| to the 2048-bit MODP group from RFC
+// 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
+// and returned. It returns NULL on allocation failure.
+OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret);
+
+// BN_get_rfc3526_prime_3072 sets |*ret| to the 3072-bit MODP group from RFC
+// 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
+// and returned. It returns NULL on allocation failure.
+OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret);
+
+// BN_get_rfc3526_prime_4096 sets |*ret| to the 4096-bit MODP group from RFC
+// 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
+// and returned. It returns NULL on allocation failure.
+OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret);
+
+// BN_get_rfc3526_prime_6144 sets |*ret| to the 6144-bit MODP group from RFC
+// 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
+// and returned. It returns NULL on allocation failure.
+OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret);
+
+// BN_get_rfc3526_prime_8192 sets |*ret| to the 8192-bit MODP group from RFC
+// 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated
+// and returned. It returns NULL on allocation failure.
+OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret);
 
 
 // Parameter generation.
@@ -216,7 +244,6 @@
 #define DH_CHECK_NOT_SUITABLE_GENERATOR 0x08
 #define DH_CHECK_Q_NOT_PRIME 0x10
 #define DH_CHECK_INVALID_Q_VALUE 0x20
-#define DH_CHECK_INVALID_J_VALUE 0x40
 
 // These are compatibility defines.
 #define DH_NOT_SUITABLE_GENERATOR DH_CHECK_NOT_SUITABLE_GENERATOR
@@ -302,31 +329,6 @@
                                   DH *dh);
 
 
-struct dh_st {
-  BIGNUM *p;
-  BIGNUM *g;
-  BIGNUM *pub_key;   // g^x mod p
-  BIGNUM *priv_key;  // x
-
-  // priv_length contains the length, in bits, of the private value. If zero,
-  // the private value will be the same length as |p|.
-  unsigned priv_length;
-
-  CRYPTO_MUTEX method_mont_p_lock;
-  BN_MONT_CTX *method_mont_p;
-
-  // Place holders if we want to do X9.42 DH
-  BIGNUM *q;
-  BIGNUM *j;
-  unsigned char *seed;
-  int seedlen;
-  BIGNUM *counter;
-
-  int flags;
-  CRYPTO_refcount_t references;
-};
-
-
 #if defined(__cplusplus)
 }  // extern C
 
diff --git a/src/include/openssl/digest.h b/src/include/openssl/digest.h
index fa76168..6e88999 100644
--- a/src/include/openssl/digest.h
+++ b/src/include/openssl/digest.h
@@ -117,6 +117,13 @@
 // freshly initialised state. It does not free |ctx| itself. It returns one.
 OPENSSL_EXPORT int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
 
+// EVP_MD_CTX_cleanse zeros the digest state in |ctx| and then performs the
+// actions of |EVP_MD_CTX_cleanup|. Note that some |EVP_MD_CTX| objects contain
+// more than just a digest (e.g. those resulting from |EVP_DigestSignInit|) but
+// this function does not zero out more than just the digest state even in that
+// case.
+OPENSSL_EXPORT void EVP_MD_CTX_cleanse(EVP_MD_CTX *ctx);
+
 // EVP_MD_CTX_free calls |EVP_MD_CTX_cleanup| and then frees |ctx| itself.
 OPENSSL_EXPORT void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
 
diff --git a/src/include/openssl/dsa.h b/src/include/openssl/dsa.h
index e6ddce6..7f10e54 100644
--- a/src/include/openssl/dsa.h
+++ b/src/include/openssl/dsa.h
@@ -94,6 +94,9 @@
 
 // Properties.
 
+// DSA_bits returns the size of |dsa|'s group modulus, in bits.
+OPENSSL_EXPORT unsigned DSA_bits(const DSA *dsa);
+
 // DSA_get0_pub_key returns |dsa|'s public key.
 OPENSSL_EXPORT const BIGNUM *DSA_get0_pub_key(const DSA *dsa);
 
diff --git a/src/include/openssl/ec.h b/src/include/openssl/ec.h
index cc8138d..8339bfb 100644
--- a/src/include/openssl/ec.h
+++ b/src/include/openssl/ec.h
@@ -323,7 +323,15 @@
 // |EC_GROUP_cmp| (even to themselves). |EC_GROUP_get_curve_name| will always
 // return |NID_undef|.
 //
-// Avoid using arbitrary curves and use |EC_GROUP_new_by_curve_name| instead.
+// This function is provided for compatibility with some legacy applications
+// only. Avoid using arbitrary curves and use |EC_GROUP_new_by_curve_name|
+// instead. This ensures the result meets preconditions necessary for
+// elliptic curve algorithms to function correctly and securely.
+//
+// Given invalid parameters, this function may fail or it may return an
+// |EC_GROUP| which breaks these preconditions. Subsequent operations may then
+// return arbitrary, incorrect values. Callers should not pass
+// attacker-controlled values to this function.
 OPENSSL_EXPORT EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p,
                                                 const BIGNUM *a,
                                                 const BIGNUM *b, BN_CTX *ctx);
diff --git a/src/include/openssl/ec_key.h b/src/include/openssl/ec_key.h
index 3a40856..502bfc2 100644
--- a/src/include/openssl/ec_key.h
+++ b/src/include/openssl/ec_key.h
@@ -167,8 +167,9 @@
 // about the problem can be found on the error stack.
 OPENSSL_EXPORT int EC_KEY_check_key(const EC_KEY *key);
 
-// EC_KEY_check_fips performs a signing pairwise consistency test (FIPS 140-2
-// 4.9.2). It returns one if it passes and zero otherwise.
+// EC_KEY_check_fips performs both a signing pairwise consistency test
+// (FIPS 140-2 4.9.2) and the consistency test from SP 800-56Ar3 section
+// 5.6.2.1.4. It returns one if it passes and zero otherwise.
 OPENSSL_EXPORT int EC_KEY_check_fips(const EC_KEY *key);
 
 // EC_KEY_set_public_key_affine_coordinates sets the public key in |key| to
@@ -194,7 +195,9 @@
 OPENSSL_EXPORT int EC_KEY_generate_key(EC_KEY *key);
 
 // EC_KEY_generate_key_fips behaves like |EC_KEY_generate_key| but performs
-// additional checks for FIPS compliance.
+// additional checks for FIPS compliance. This function is applicable when
+// generating keys for either signing/verification or key agreement because
+// both types of consistency check (PCT) are performed.
 OPENSSL_EXPORT int EC_KEY_generate_key_fips(EC_KEY *key);
 
 // EC_KEY_derive_from_secret deterministically derives a private key for |group|
diff --git a/src/include/openssl/err.h b/src/include/openssl/err.h
index 572340c..28ba250 100644
--- a/src/include/openssl/err.h
+++ b/src/include/openssl/err.h
@@ -183,6 +183,11 @@
 // can be printed. This is always set if |data| is non-NULL.
 #define ERR_FLAG_STRING 1
 
+// ERR_FLAG_MALLOCED is passed into |ERR_set_error_data| to indicate that |data|
+// was allocated with |OPENSSL_malloc|. It is never returned from
+// |ERR_get_error_line_data|.
+#define ERR_FLAG_MALLOCED 2
+
 // ERR_get_error_line_data acts like |ERR_get_error_line|, but also returns the
 // error-specific data pointer and flags. The flags are a bitwise-OR of
 // |ERR_FLAG_*| values. The error-specific data is owned by the error queue
@@ -408,9 +413,10 @@
 // ERR_GET_FUNC returns zero. BoringSSL errors do not report a function code.
 #define ERR_GET_FUNC(packed_error) 0
 
-// ERR_TXT_STRING is provided for compatibility with code that assumes that
-// it's using OpenSSL.
+// ERR_TXT_* are provided for compatibility with code that assumes that it's
+// using OpenSSL.
 #define ERR_TXT_STRING ERR_FLAG_STRING
+#define ERR_TXT_MALLOCED ERR_FLAG_MALLOCED
 
 
 // Private functions.
@@ -444,6 +450,17 @@
 OPENSSL_EXPORT void ERR_add_error_dataf(const char *format, ...)
     OPENSSL_PRINTF_FORMAT_FUNC(1, 2);
 
+// ERR_set_error_data sets the data on the most recent error to |data|, which
+// must be a NUL-terminated string. |flags| must contain |ERR_FLAG_STRING|. If
+// |flags| contains |ERR_FLAG_MALLOCED|, this function takes ownership of
+// |data|, which must have been allocated with |OPENSSL_malloc|. Otherwise, it
+// saves a copy of |data|.
+//
+// Note this differs from OpenSSL which, when |ERR_FLAG_MALLOCED| is unset,
+// saves the pointer as-is and requires it remain valid for the lifetime of the
+// address space.
+OPENSSL_EXPORT void ERR_set_error_data(char *data, int flags);
+
 // ERR_NUM_ERRORS is one more than the limit of the number of errors in the
 // queue.
 #define ERR_NUM_ERRORS 16
diff --git a/src/include/openssl/evp.h b/src/include/openssl/evp.h
index e195907..37daa9a 100644
--- a/src/include/openssl/evp.h
+++ b/src/include/openssl/evp.h
@@ -178,6 +178,7 @@
 #define EVP_PKEY_EC NID_X9_62_id_ecPublicKey
 #define EVP_PKEY_ED25519 NID_ED25519
 #define EVP_PKEY_X25519 NID_X25519
+#define EVP_PKEY_HKDF NID_hkdf
 
 // EVP_PKEY_assign sets the underlying key of |pkey| to |key|, which must be of
 // the given type. It returns one if successful or zero if the |type| argument
@@ -665,11 +666,11 @@
 // success and zero on error.
 OPENSSL_EXPORT int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer);
 
-// EVP_PKEY_derive derives a shared key between the two keys configured in
-// |ctx|. If |key| is non-NULL then, on entry, |out_key_len| must contain the
-// amount of space at |key|. If sufficient then the shared key will be written
-// to |key| and |*out_key_len| will be set to the length. If |key| is NULL then
-// |out_key_len| will be set to the maximum length.
+// EVP_PKEY_derive derives a shared key from |ctx|. If |key| is non-NULL then,
+// on entry, |out_key_len| must contain the amount of space at |key|. If
+// sufficient then the shared key will be written to |key| and |*out_key_len|
+// will be set to the length. If |key| is NULL then |out_key_len| will be set to
+// the maximum length.
 //
 // WARNING: Setting |out| to NULL only gives the maximum size of the key. The
 // actual key may be smaller.
@@ -1017,6 +1018,14 @@
 OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY(EC_KEY **out, const uint8_t **inp,
                                      long len);
 
+// EVP_PKEY_CTX_set_dsa_paramgen_bits returns zero.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx,
+                                                      int nbits);
+
+// EVP_PKEY_CTX_set_dsa_paramgen_q_bits returns zero.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set_dsa_paramgen_q_bits(EVP_PKEY_CTX *ctx,
+                                                        int qbits);
+
 
 // Preprocessor compatibility section (hidden).
 //
diff --git a/src/include/openssl/hmac.h b/src/include/openssl/hmac.h
index b5d1e42..7a4737f 100644
--- a/src/include/openssl/hmac.h
+++ b/src/include/openssl/hmac.h
@@ -98,6 +98,10 @@
 // HMAC_CTX_cleanup frees data owned by |ctx|. It does not free |ctx| itself.
 OPENSSL_EXPORT void HMAC_CTX_cleanup(HMAC_CTX *ctx);
 
+// HMAC_CTX_cleanse zeros the digest state from |ctx| and then performs the
+// actions of |HMAC_CTX_cleanup|.
+OPENSSL_EXPORT void HMAC_CTX_cleanse(HMAC_CTX *ctx);
+
 // HMAC_CTX_free calls |HMAC_CTX_cleanup| and then frees |ctx| itself.
 OPENSSL_EXPORT void HMAC_CTX_free(HMAC_CTX *ctx);
 
@@ -133,6 +137,9 @@
 // |ctx|. On entry, |ctx| must have been setup with |HMAC_Init_ex|.
 OPENSSL_EXPORT size_t HMAC_size(const HMAC_CTX *ctx);
 
+// HMAC_CTX_get_md returns |ctx|'s hash function.
+OPENSSL_EXPORT const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx);
+
 // HMAC_CTX_copy_ex sets |dest| equal to |src|. On entry, |dest| must have been
 // initialised by calling |HMAC_CTX_init|. It returns one on success and zero
 // on error.
diff --git a/src/include/openssl/hpke.h b/src/include/openssl/hpke.h
index 56251b7..3ce6946 100644
--- a/src/include/openssl/hpke.h
+++ b/src/include/openssl/hpke.h
@@ -30,7 +30,7 @@
 // Hybrid Public Key Encryption (HPKE) enables a sender to encrypt messages to a
 // receiver with a public key.
 //
-// See https://tools.ietf.org/html/draft-irtf-cfrg-hpke-12.
+// See RFC 9180.
 
 
 // Parameters.
@@ -51,6 +51,30 @@
 // will be one of the |EVP_HPKE_KEM_*| constants.
 OPENSSL_EXPORT uint16_t EVP_HPKE_KEM_id(const EVP_HPKE_KEM *kem);
 
+// EVP_HPKE_MAX_PUBLIC_KEY_LENGTH is the maximum length of an encoded public key
+// for all KEMs currently supported by this library.
+#define EVP_HPKE_MAX_PUBLIC_KEY_LENGTH 32
+
+// EVP_HPKE_KEM_public_key_len returns the length of a public key for |kem|.
+// This value will be at most |EVP_HPKE_MAX_PUBLIC_KEY_LENGTH|.
+OPENSSL_EXPORT size_t EVP_HPKE_KEM_public_key_len(const EVP_HPKE_KEM *kem);
+
+// EVP_HPKE_MAX_PRIVATE_KEY_LENGTH is the maximum length of an encoded private
+// key for all KEMs currently supported by this library.
+#define EVP_HPKE_MAX_PRIVATE_KEY_LENGTH 32
+
+// EVP_HPKE_KEM_private_key_len returns the length of a private key for |kem|.
+// This value will be at most |EVP_HPKE_MAX_PRIVATE_KEY_LENGTH|.
+OPENSSL_EXPORT size_t EVP_HPKE_KEM_private_key_len(const EVP_HPKE_KEM *kem);
+
+// EVP_HPKE_MAX_ENC_LENGTH is the maximum length of "enc", the encapsulated
+// shared secret, for all KEMs currently supported by this library.
+#define EVP_HPKE_MAX_ENC_LENGTH 32
+
+// EVP_HPKE_KEM_enc_len returns the length of the "enc", the encapsulated shared
+// secret, for |kem|. This value will be at most |EVP_HPKE_MAX_ENC_LENGTH|.
+OPENSSL_EXPORT size_t EVP_HPKE_KEM_enc_len(const EVP_HPKE_KEM *kem);
+
 // The following constants are KDF identifiers.
 #define EVP_HPKE_HKDF_SHA256 0x0001
 
@@ -60,6 +84,11 @@
 // EVP_HPKE_KDF_id returns the HPKE KDF identifier for |kdf|.
 OPENSSL_EXPORT uint16_t EVP_HPKE_KDF_id(const EVP_HPKE_KDF *kdf);
 
+// EVP_HPKE_KDF_hkdf_md returns the HKDF hash function corresponding to |kdf|,
+// or NULL if |kdf| is not an HKDF-based KDF. All currently supported KDFs are
+// HKDF-based.
+OPENSSL_EXPORT const EVP_MD *EVP_HPKE_KDF_hkdf_md(const EVP_HPKE_KDF *kdf);
+
 // The following constants are AEAD identifiers.
 #define EVP_HPKE_AES_128_GCM 0x0001
 #define EVP_HPKE_AES_256_GCM 0x0002
@@ -127,28 +156,22 @@
 // EVP_HPKE_KEY_kem returns the HPKE KEM used by |key|.
 OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_HPKE_KEY_kem(const EVP_HPKE_KEY *key);
 
-// EVP_HPKE_MAX_PUBLIC_KEY_LENGTH is the maximum length of a public key for all
-// KEMs supported by this library.
-#define EVP_HPKE_MAX_PUBLIC_KEY_LENGTH 32
-
 // EVP_HPKE_KEY_public_key writes |key|'s public key to |out| and sets
 // |*out_len| to the number of bytes written. On success, it returns one and
 // writes at most |max_out| bytes. If |max_out| is too small, it returns zero.
 // Setting |max_out| to |EVP_HPKE_MAX_PUBLIC_KEY_LENGTH| will ensure the public
-// key fits.
+// key fits. An exact size can also be determined by
+// |EVP_HPKE_KEM_public_key_len|.
 OPENSSL_EXPORT int EVP_HPKE_KEY_public_key(const EVP_HPKE_KEY *key,
                                            uint8_t *out, size_t *out_len,
                                            size_t max_out);
 
-// EVP_HPKE_MAX_PRIVATE_KEY_LENGTH is the maximum length of a private key for
-// all KEMs supported by this library.
-#define EVP_HPKE_MAX_PRIVATE_KEY_LENGTH 32
-
 // EVP_HPKE_KEY_private_key writes |key|'s private key to |out| and sets
 // |*out_len| to the number of bytes written. On success, it returns one and
 // writes at most |max_out| bytes. If |max_out| is too small, it returns zero.
 // Setting |max_out| to |EVP_HPKE_MAX_PRIVATE_KEY_LENGTH| will ensure the
-// private key fits.
+// private key fits. An exact size can also be determined by
+// |EVP_HPKE_KEM_private_key_len|.
 OPENSSL_EXPORT int EVP_HPKE_KEY_private_key(const EVP_HPKE_KEY *key,
                                             uint8_t *out, size_t *out_len,
                                             size_t max_out);
@@ -182,16 +205,13 @@
 // created with |EVP_HPKE_CTX_new|.
 OPENSSL_EXPORT void EVP_HPKE_CTX_free(EVP_HPKE_CTX *ctx);
 
-// EVP_HPKE_MAX_ENC_LENGTH is the maximum length of "enc", the encapsulated
-// shared secret, for all supported KEMs in this library.
-#define EVP_HPKE_MAX_ENC_LENGTH 32
-
 // EVP_HPKE_CTX_setup_sender implements the SetupBaseS HPKE operation. It
 // encapsulates a shared secret for |peer_public_key| and sets up |ctx| as a
 // sender context. It writes the encapsulated shared secret to |out_enc| and
 // sets |*out_enc_len| to the number of bytes written. It writes at most
 // |max_enc| bytes and fails if the buffer is too small. Setting |max_enc| to at
-// least |EVP_HPKE_MAX_ENC_LENGTH| will ensure the buffer is large enough.
+// least |EVP_HPKE_MAX_ENC_LENGTH| will ensure the buffer is large enough. An
+// exact size may also be determined by |EVP_PKEY_KEM_enc_len|.
 //
 // This function returns one on success and zero on error. Note that
 // |peer_public_key| may be invalid, in which case this function will return an
@@ -292,6 +312,10 @@
 // up as a sender.
 OPENSSL_EXPORT size_t EVP_HPKE_CTX_max_overhead(const EVP_HPKE_CTX *ctx);
 
+// EVP_HPKE_CTX_kem returns |ctx|'s configured KEM, or NULL if the context has
+// not been set up.
+OPENSSL_EXPORT const EVP_HPKE_KEM *EVP_HPKE_CTX_kem(const EVP_HPKE_CTX *ctx);
+
 // EVP_HPKE_CTX_aead returns |ctx|'s configured AEAD, or NULL if the context has
 // not been set up.
 OPENSSL_EXPORT const EVP_HPKE_AEAD *EVP_HPKE_CTX_aead(const EVP_HPKE_CTX *ctx);
@@ -307,6 +331,7 @@
 // but accessing or modifying their fields is forbidden.
 
 struct evp_hpke_ctx_st {
+  const EVP_HPKE_KEM *kem;
   const EVP_HPKE_AEAD *aead;
   const EVP_HPKE_KDF *kdf;
   EVP_AEAD_CTX aead_ctx;
diff --git a/src/include/openssl/kdf.h b/src/include/openssl/kdf.h
new file mode 100644
index 0000000..7adad38
--- /dev/null
+++ b/src/include/openssl/kdf.h
@@ -0,0 +1,91 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_KDF_H
+#define OPENSSL_HEADER_KDF_H
+
+#include <openssl/base.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+// KDF support for EVP.
+
+
+// HKDF-specific functions.
+//
+// The following functions are provided for OpenSSL compatibility. Prefer the
+// HKDF functions in <openssl/hkdf.h>. In each, |ctx| must be created with
+// |EVP_PKEY_CTX_new_id| with |EVP_PKEY_HKDF| and then initialized with
+// |EVP_PKEY_derive_init|.
+
+// EVP_PKEY_HKDEF_MODE_* define "modes" for use with |EVP_PKEY_CTX_hkdf_mode|.
+// The mispelling of "HKDF" as "HKDEF" is intentional for OpenSSL compatibility.
+#define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND 0
+#define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 1
+#define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY 2
+
+// EVP_PKEY_CTX_hkdf_mode configures which HKDF operation to run. It returns one
+// on success and zero on error. |mode| must be one of |EVP_PKEY_HKDEF_MODE_*|.
+// By default, the mode is |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND|.
+//
+// If |mode| is |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND| or
+// |EVP_PKEY_HKDEF_MODE_EXPAND_ONLY|, the output is variable-length.
+// |EVP_PKEY_derive| uses the size of the output buffer as the output length for
+// HKDF-Expand.
+//
+// WARNING: Although this API calls it a "mode", HKDF-Extract and HKDF-Expand
+// are distinct operations with distinct inputs and distinct kinds of keys.
+// Callers should not pass input secrets for one operation into the other.
+OPENSSL_EXPORT int EVP_PKEY_CTX_hkdf_mode(EVP_PKEY_CTX *ctx, int mode);
+
+// EVP_PKEY_CTX_set_hkdf_md sets |md| as the digest to use with HKDF. It returns
+// one on success and zero on error.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX *ctx,
+                                            const EVP_MD *md);
+
+// EVP_PKEY_CTX_set1_hkdf_key configures HKDF to use |key_len| bytes from |key|
+// as the "key", described below. It returns one on success and zero on error.
+//
+// Which input is the key depends on the "mode" (see |EVP_PKEY_CTX_hkdf_mode|).
+// If |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND| or
+// |EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY|, this function specifies the input keying
+// material (IKM) for HKDF-Extract. If |EVP_PKEY_HKDEF_MODE_EXPAND_ONLY|, it
+// instead specifies the pseudorandom key (PRK) for HKDF-Expand.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set1_hkdf_key(EVP_PKEY_CTX *ctx,
+                                              const uint8_t *key,
+                                              size_t key_len);
+
+// EVP_PKEY_CTX_set1_hkdf_salt configures HKDF to use |salt_len| bytes from
+// |salt| as the salt parameter to HKDF-Extract. It returns one on success and
+// zero on error. If performing HKDF-Expand only, this parameter is ignored.
+OPENSSL_EXPORT int EVP_PKEY_CTX_set1_hkdf_salt(EVP_PKEY_CTX *ctx,
+                                               const uint8_t *salt,
+                                               size_t salt_len);
+
+// EVP_PKEY_CTX_add1_hkdf_info appends |info_len| bytes from |info| to the info
+// parameter used with HKDF-Expand. It returns one on success and zero on error.
+// If performing HKDF-Extract only, this parameter is ignored.
+OPENSSL_EXPORT int EVP_PKEY_CTX_add1_hkdf_info(EVP_PKEY_CTX *ctx,
+                                               const uint8_t *info,
+                                               size_t info_len);
+
+
+#if defined(__cplusplus)
+}  // extern C
+#endif
+
+#endif  // OPENSSL_HEADER_KDF_H
diff --git a/src/include/openssl/mem.h b/src/include/openssl/mem.h
index 476299a..f07698d 100644
--- a/src/include/openssl/mem.h
+++ b/src/include/openssl/mem.h
@@ -164,6 +164,21 @@
 // allocations on free, but we define |OPENSSL_clear_free| for compatibility.
 OPENSSL_EXPORT void OPENSSL_clear_free(void *ptr, size_t len);
 
+// CRYPTO_secure_malloc_init returns zero.
+OPENSSL_EXPORT int CRYPTO_secure_malloc_init(size_t size, size_t min_size);
+
+// CRYPTO_secure_malloc_initialized returns zero.
+OPENSSL_EXPORT int CRYPTO_secure_malloc_initialized(void);
+
+// CRYPTO_secure_used returns zero.
+OPENSSL_EXPORT size_t CRYPTO_secure_used(void);
+
+// OPENSSL_secure_malloc calls |OPENSSL_malloc|.
+OPENSSL_EXPORT void *OPENSSL_secure_malloc(size_t size);
+
+// OPENSSL_secure_clear_free calls |OPENSSL_clear_free|.
+OPENSSL_EXPORT void OPENSSL_secure_clear_free(void *ptr, size_t len);
+
 
 #if defined(__cplusplus)
 }  // extern C
diff --git a/src/include/openssl/nid.h b/src/include/openssl/nid.h
index bf7f3da..54ecc5e 100644
--- a/src/include/openssl/nid.h
+++ b/src/include/openssl/nid.h
@@ -4251,6 +4251,10 @@
 #define NID_sha512_256 962
 #define OBJ_sha512_256 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 6L
 
+#define SN_hkdf "HKDF"
+#define LN_hkdf "hkdf"
+#define NID_hkdf 963
+
 
 #if defined(__cplusplus)
 } /* extern C */
diff --git a/src/include/openssl/opensslconf.h b/src/include/openssl/opensslconf.h
index 3f1faf3..5165703 100644
--- a/src/include/openssl/opensslconf.h
+++ b/src/include/openssl/opensslconf.h
@@ -59,6 +59,7 @@
 #define OPENSSL_NO_SM3
 #define OPENSSL_NO_SM4
 #define OPENSSL_NO_SRP
+#define OPENSSL_NO_SSL_TRACE
 #define OPENSSL_NO_SSL2
 #define OPENSSL_NO_SSL3
 #define OPENSSL_NO_SSL3_METHOD
diff --git a/src/include/openssl/pem.h b/src/include/openssl/pem.h
index a94f276..56075ae 100644
--- a/src/include/openssl/pem.h
+++ b/src/include/openssl/pem.h
@@ -349,10 +349,6 @@
 
 OPENSSL_EXPORT STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(
     BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u);
-OPENSSL_EXPORT int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi,
-                                           EVP_CIPHER *enc, unsigned char *kstr,
-                                           int klen, pem_password_cb *cd,
-                                           void *u);
 
 OPENSSL_EXPORT int PEM_read(FILE *fp, char **name, char **header,
                             unsigned char **data, long *len);
diff --git a/src/include/openssl/pkcs8.h b/src/include/openssl/pkcs8.h
index 968640b..8774681 100644
--- a/src/include/openssl/pkcs8.h
+++ b/src/include/openssl/pkcs8.h
@@ -122,6 +122,8 @@
 // and decrypts it using |password|, sets |*out_key| to the included private
 // key and appends the included certificates to |out_certs|. It returns one on
 // success and zero on error. The caller takes ownership of the outputs.
+// Any friendlyName attributes (RFC 2985) in the PKCS#12 structure will be
+// returned on the |X509| objects as aliases. See also |X509_alias_get0|.
 OPENSSL_EXPORT int PKCS12_get_key_and_certs(EVP_PKEY **out_key,
                                             STACK_OF(X509) *out_certs,
                                             CBS *in, const char *password);
@@ -219,6 +221,11 @@
 // implemented for compatibility with external packages. Note the output still
 // requires a password for the MAC. Unencrypted keys in PKCS#12 are also not
 // widely supported and may not open in other implementations.
+//
+// If |cert| or |chain| have associated aliases (see |X509_alias_set1|), they
+// will be included in the output as friendlyName attributes (RFC 2985). It is
+// an error to specify both an alias on |cert| and a non-NULL |name|
+// parameter.
 OPENSSL_EXPORT PKCS12 *PKCS12_create(const char *password, const char *name,
                                      const EVP_PKEY *pkey, X509 *cert,
                                      const STACK_OF(X509) *chain, int key_nid,
@@ -278,5 +285,6 @@
 #define PKCS8_R_UNSUPPORTED_PRF 130
 #define PKCS8_R_INVALID_CHARACTERS 131
 #define PKCS8_R_UNSUPPORTED_OPTIONS 132
+#define PKCS8_R_AMBIGUOUS_FRIENDLY_NAME 133
 
 #endif  // OPENSSL_HEADER_PKCS8_H
diff --git a/src/include/openssl/rand.h b/src/include/openssl/rand.h
index bd41f9e..586274d 100644
--- a/src/include/openssl/rand.h
+++ b/src/include/openssl/rand.h
@@ -25,9 +25,20 @@
 // Random number generation.
 
 
-// RAND_bytes writes |len| bytes of random data to |buf| and returns one.
+// RAND_bytes writes |len| bytes of random data to |buf| and returns one. In the
+// event that sufficient random data can not be obtained, |abort| is called.
 OPENSSL_EXPORT int RAND_bytes(uint8_t *buf, size_t len);
 
+// RAND_get_system_entropy_for_custom_prng writes |len| bytes of random data
+// from a system entropy source to |buf|. The maximum length of entropy which
+// may be requested is 256 bytes. If more than 256 bytes of data is requested,
+// or if sufficient random data can not be obtained, |abort| is called.
+// |RAND_bytes| should normally be used instead of this function. This function
+// should only be used for seed values or where |malloc| should not be called
+// from BoringSSL. This function is not FIPS compliant.
+OPENSSL_EXPORT void RAND_get_system_entropy_for_custom_prng(uint8_t *buf,
+                                                            size_t len);
+
 // RAND_cleanup frees any resources used by the RNG. This is not safe if other
 // threads might still be calling |RAND_bytes|.
 OPENSSL_EXPORT void RAND_cleanup(void);
diff --git a/src/include/openssl/rsa.h b/src/include/openssl/rsa.h
index b1336dd..57a2cb2 100644
--- a/src/include/openssl/rsa.h
+++ b/src/include/openssl/rsa.h
@@ -615,6 +615,9 @@
 // constants.
 OPENSSL_EXPORT int RSA_flags(const RSA *rsa);
 
+// RSA_test_flags returns the subset of flags in |flags| which are set in |rsa|.
+OPENSSL_EXPORT int RSA_test_flags(const RSA *rsa, int flags);
+
 // RSA_blinding_on returns one.
 OPENSSL_EXPORT int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);
 
diff --git a/src/include/openssl/service_indicator.h b/src/include/openssl/service_indicator.h
new file mode 100644
index 0000000..33b38b2
--- /dev/null
+++ b/src/include/openssl/service_indicator.h
@@ -0,0 +1,96 @@
+/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_SERVICE_INDICATOR_H
+#define OPENSSL_HEADER_SERVICE_INDICATOR_H
+
+#include <openssl/base.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// FIPS_service_indicator_before_call and |FIPS_service_indicator_after_call|
+// both currently return the same local thread counter which is slowly
+// incremented whenever approved services are called. The
+// |CALL_SERVICE_AND_CHECK_APPROVED| macro is strongly recommended over calling
+// these functions directly.
+//
+// |FIPS_service_indicator_before_call| is intended to be called immediately
+// before an approved service, while |FIPS_service_indicator_after_call| should
+// be called immediately after. If the values returned from these two functions
+// are not equal, this means that the service called inbetween is deemed to be
+// approved. If the values are still the same, this means the counter has not
+// been incremented, and the service called is not approved for FIPS.
+//
+// In non-FIPS builds, |FIPS_service_indicator_before_call| always returns zero
+// and |FIPS_service_indicator_after_call| always returns one. Thus calls always
+// appear to be approved. This is intended to simplify testing.
+OPENSSL_EXPORT uint64_t FIPS_service_indicator_before_call(void);
+OPENSSL_EXPORT uint64_t FIPS_service_indicator_after_call(void);
+
+#if defined(__cplusplus)
+}
+
+#if !defined(BORINGSSL_NO_CXX)
+
+extern "C++" {
+
+// CALL_SERVICE_AND_CHECK_APPROVED runs |func| and sets |approved| to one of the
+// |FIPSStatus*| values, above, depending on whether |func| invoked an
+// approved service. The result of |func| becomes the result of this macro.
+#define CALL_SERVICE_AND_CHECK_APPROVED(approved, func)         \
+  [&] {                                                       \
+    bssl::FIPSIndicatorHelper fips_indicator_helper(&approved); \
+    return func;                                                \
+  }()
+
+namespace bssl {
+
+enum class FIPSStatus {
+  NOT_APPROVED = 0,
+  APPROVED = 1,
+};
+
+// FIPSIndicatorHelper records whether the service indicator counter advanced
+// during its lifetime.
+class FIPSIndicatorHelper {
+ public:
+  FIPSIndicatorHelper(FIPSStatus *result)
+      : result_(result), before_(FIPS_service_indicator_before_call()) {
+    *result_ = FIPSStatus::NOT_APPROVED;
+  }
+
+  ~FIPSIndicatorHelper() {
+    uint64_t after = FIPS_service_indicator_after_call();
+    if (after != before_) {
+      *result_ = FIPSStatus::APPROVED;
+    }
+  }
+
+  FIPSIndicatorHelper(const FIPSIndicatorHelper&) = delete;
+  FIPSIndicatorHelper &operator=(const FIPSIndicatorHelper &) = delete;
+
+ private:
+  FIPSStatus *const result_;
+  const uint64_t before_;
+};
+
+}  // namespace bssl
+}  // extern "C++"
+
+#endif  // !BORINGSSL_NO_CXX
+#endif  // __cplusplus
+
+#endif  // OPENSSL_HEADER_SERVICE_INDICATOR_H
diff --git a/src/include/openssl/span.h b/src/include/openssl/span.h
index 79f1d41..67a1a5c 100644
--- a/src/include/openssl/span.h
+++ b/src/include/openssl/span.h
@@ -96,6 +96,15 @@
  private:
   static const size_t npos = static_cast<size_t>(-1);
 
+  // Heuristically test whether C is a container type that can be converted into
+  // a Span by checking for data() and size() member functions.
+  //
+  // TODO(davidben): Require C++17 support for std::is_convertible_v, etc.
+  template <typename C>
+  using EnableIfContainer = std::enable_if_t<
+      std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
+      std::is_integral<decltype(std::declval<C>().size())>::value>;
+
  public:
   constexpr Span() : Span(nullptr, 0) {}
   constexpr Span(T *ptr, size_t len) : data_(ptr), size_(len) {}
@@ -103,29 +112,12 @@
   template <size_t N>
   constexpr Span(T (&array)[N]) : Span(array, N) {}
 
-  template <
-      typename C,
-      // TODO(davidben): Switch everything to std::enable_if_t when we remove
-      // support for MSVC 2015. Although we could write our own enable_if_t and
-      // MSVC 2015 has std::enable_if_t anyway, MSVC 2015's SFINAE
-      // implementation is problematic and does not work below unless we write
-      // the ::type at use.
-      //
-      // TODO(davidben): Move this and the identical copy below into an
-      // EnableIfContainer alias when we drop MSVC 2015 support. MSVC 2015's
-      // SFINAE support cannot handle type aliases.
-      typename = typename std::enable_if<
-          std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
-          std::is_integral<decltype(std::declval<C>().size())>::value>::type,
-      typename = typename std::enable_if<std::is_const<T>::value, C>::type>
+  template <typename C, typename = EnableIfContainer<C>,
+            typename = std::enable_if_t<std::is_const<T>::value, C>>
   Span(const C &container) : data_(container.data()), size_(container.size()) {}
 
-  template <
-      typename C,
-      typename = typename std::enable_if<
-          std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
-          std::is_integral<decltype(std::declval<C>().size())>::value>::type,
-      typename = typename std::enable_if<!std::is_const<T>::value, C>::type>
+  template <typename C, typename = EnableIfContainer<C>,
+            typename = std::enable_if_t<!std::is_const<T>::value, C>>
   explicit Span(C &container)
       : data_(container.data()), size_(container.size()) {}
 
diff --git a/src/include/openssl/ssl.h b/src/include/openssl/ssl.h
index ca7ae14..81934c5 100644
--- a/src/include/openssl/ssl.h
+++ b/src/include/openssl/ssl.h
@@ -2281,6 +2281,17 @@
 OPENSSL_EXPORT SSL_SESSION *SSL_process_tls13_new_session_ticket(
     SSL *ssl, const uint8_t *buf, size_t buf_len);
 
+// SSL_CTX_set_num_tickets configures |ctx| to send |num_tickets| immediately
+// after a successful TLS 1.3 handshake as a server. It returns one. Large
+// values of |num_tickets| will be capped within the library.
+//
+// By default, BoringSSL sends two tickets.
+OPENSSL_EXPORT int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets);
+
+// SSL_CTX_get_num_tickets returns the number of tickets |ctx| will send
+// immediately after a successful TLS 1.3 handshake as a server.
+OPENSSL_EXPORT size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx);
+
 
 // Elliptic curve Diffie-Hellman.
 //
@@ -2341,6 +2352,20 @@
 // the given TLS curve id, or NULL if the curve is unknown.
 OPENSSL_EXPORT const char *SSL_get_curve_name(uint16_t curve_id);
 
+// SSL_CTX_set1_groups calls |SSL_CTX_set1_curves|.
+OPENSSL_EXPORT int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups,
+                                       size_t groups_len);
+
+// SSL_set1_groups calls |SSL_set1_curves|.
+OPENSSL_EXPORT int SSL_set1_groups(SSL *ssl, const int *groups,
+                                   size_t groups_len);
+
+// SSL_CTX_set1_groups_list calls |SSL_CTX_set1_curves_list|.
+OPENSSL_EXPORT int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups);
+
+// SSL_set1_groups_list calls |SSL_set1_curves_list|.
+OPENSSL_EXPORT int SSL_set1_groups_list(SSL *ssl, const char *groups);
+
 
 // Certificate verification.
 //
@@ -2459,6 +2484,15 @@
 OPENSSL_EXPORT int (*SSL_get_verify_callback(const SSL *ssl))(
     int ok, X509_STORE_CTX *store_ctx);
 
+// SSL_set1_host sets a DNS name that will be required to be present in the
+// verified leaf certificate. It returns one on success and zero on error.
+//
+// Note: unless _some_ name checking is performed, certificate validation is
+// ineffective. Simply checking that a host has some certificate from a CA is
+// rarely meaningful—you have to check that the CA believed that the host was
+// who you expect to be talking to.
+OPENSSL_EXPORT int SSL_set1_host(SSL *ssl, const char *hostname);
+
 // SSL_CTX_set_verify_depth sets the maximum depth of a certificate chain
 // accepted in verification. This number does not include the leaf, so a depth
 // of 1 allows the leaf and one CA certificate.
@@ -2632,6 +2666,11 @@
                                                   const uint16_t *prefs,
                                                   size_t num_prefs);
 
+// SSL_set_hostflags calls |X509_VERIFY_PARAM_set_hostflags| on the
+// |X509_VERIFY_PARAM| associated with this |SSL*|. The |flags| argument
+// should be one of the |X509_CHECK_*| constants.
+OPENSSL_EXPORT void SSL_set_hostflags(SSL *ssl, unsigned flags);
+
 
 // Client certificate CA list.
 //
@@ -2697,7 +2736,7 @@
 
 // SSL_load_client_CA_file opens |file| and reads PEM-encoded certificates from
 // it. It returns a newly-allocated stack of the certificate subjects or NULL
-// on error.
+// on error. Duplicates in |file| are ignored.
 OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
 
 // SSL_dup_CA_list makes a deep copy of |list|. It returns the new list on
@@ -2710,6 +2749,11 @@
 OPENSSL_EXPORT int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
                                                        const char *file);
 
+// SSL_add_bio_cert_subjects_to_stack behaves like
+// |SSL_add_file_cert_subjects_to_stack| but reads from |bio|.
+OPENSSL_EXPORT int SSL_add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
+                                                      BIO *bio);
+
 
 // Server name indication.
 //
@@ -3947,8 +3991,9 @@
 // those cases, BoringSSL will not predict a signature as there is no benefit.
 // Callers must allow for handshakes to complete without a predicted signature.
 //
-// For now, only TLS 1.3 is hinted. TLS 1.2 will work, but the hints will be
-// empty.
+// Handshake hints are supported for TLS 1.3 and partially supported for
+// TLS 1.2. TLS 1.2 resumption handshakes are not yet fully hinted. They will
+// still work, but may not be as efficient.
 
 // SSL_serialize_capabilities writes an opaque byte string to |out| describing
 // some of |ssl|'s capabilities. It returns one on success and zero on error.
@@ -4025,10 +4070,16 @@
 // |len| bytes from |buf| contain the handshake message, one-byte
 // ChangeCipherSpec body, and two-byte alert, respectively.
 //
+// In connections that enable ECH, |cb| is additionally called with
+// |content_type| = |SSL3_RT_CLIENT_HELLO_INNER| for each ClientHelloInner that
+// is encrypted or decrypted. The |len| bytes from |buf| contain the
+// ClientHelloInner, including the reconstructed outer extensions and handshake
+// header.
+//
 // For a V2ClientHello, |version| is |SSL2_VERSION|, |content_type| is zero, and
 // the |len| bytes from |buf| contain the V2ClientHello structure.
 OPENSSL_EXPORT void SSL_CTX_set_msg_callback(
-    SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type,
+    SSL_CTX *ctx, void (*cb)(int is_write, int version, int content_type,
                              const void *buf, size_t len, SSL *ssl, void *arg));
 
 // SSL_CTX_set_msg_callback_arg sets the |arg| parameter of the message
@@ -4098,6 +4149,13 @@
 // renegotiation attempts by a server. If |ssl| is a server, peer-initiated
 // renegotiations are *always* rejected and this function does nothing.
 //
+// WARNING: Renegotiation is error-prone, complicates TLS's security properties,
+// and increases its attack surface. When enabled, many common assumptions about
+// BoringSSL's behavior no longer hold, and the calling application must handle
+// more cases. Renegotiation is also incompatible with many application
+// protocols, e.g. section 9.2.1 of RFC 7540. Many functions behave in ambiguous
+// or undefined ways during a renegotiation.
+//
 // The renegotiation mode defaults to |ssl_renegotiate_never|, but may be set
 // at any point in a connection's lifetime. Set it to |ssl_renegotiate_once| to
 // allow one renegotiation, |ssl_renegotiate_freely| to allow all
@@ -4119,6 +4177,20 @@
 // e.g., ALPN must enable renegotiation before the handshake and conditionally
 // disable it afterwards.
 //
+// When enabled, renegotiation can cause properties of |ssl|, such as the cipher
+// suite, to change during the lifetime of the connection. More over, during a
+// renegotiation, not all properties of the new handshake are available or fully
+// established. In BoringSSL, most functions, such as |SSL_get_current_cipher|,
+// report information from the most recently completed handshake, not the
+// pending one. However, renegotiation may rerun handshake callbacks, such as
+// |SSL_CTX_set_cert_cb|. Such callbacks must ensure they are acting on the
+// desired versions of each property.
+//
+// BoringSSL does not reverify peer certificates on renegotiation and instead
+// requires they match between handshakes, so certificate verification callbacks
+// (see |SSL_CTX_set_custom_verify|) may assume |ssl| is in the initial
+// handshake and use |SSL_get0_peer_certificates|, etc.
+//
 // There is no support in BoringSSL for initiating renegotiations as a client
 // or server.
 OPENSSL_EXPORT void SSL_set_renegotiate_mode(SSL *ssl,
@@ -5077,6 +5149,44 @@
 OPENSSL_EXPORT uint16_t SSL_CIPHER_get_value(const SSL_CIPHER *cipher);
 
 
+// Compliance policy configurations
+//
+// A TLS connection has a large number of different parameters. Some are well
+// known, like cipher suites, but many are obscure and configuration functions
+// for them may not exist. These policy controls allow broad configuration
+// goals to be specified so that they can flow down to all the different
+// parameters of a TLS connection.
+
+enum ssl_compliance_policy_t BORINGSSL_ENUM_INT {
+  // ssl_policy_fips_202205 configures a TLS connection to use:
+  //   * TLS 1.2 or 1.3
+  //   * For TLS 1.2, only ECDHE_[RSA|ECDSA]_WITH_AES_*_GCM_SHA*.
+  //   * For TLS 1.3, only AES-GCM
+  //   * P-256 or P-384 for key agreement.
+  //   * For server signatures, only PKCS#1/PSS with SHA256/384/512, or ECDSA
+  //     with P-256 or P-384.
+  //
+  // Note: this policy can be configured even if BoringSSL has not been built in
+  // FIPS mode. Call |FIPS_mode| to check that.
+  //
+  // Note: this setting aids with compliance with NIST requirements but does not
+  // guarantee it. Careful reading of SP 800-52r2 is recommended.
+  ssl_compliance_policy_fips_202205,
+};
+
+// SSL_CTX_set_compliance_policy configures various aspects of |ctx| based on
+// the given policy requirements. Subsequently calling other functions that
+// configure |ctx| may override |policy|, or may not. This should be the final
+// configuration function called in order to have defined behaviour.
+OPENSSL_EXPORT int SSL_CTX_set_compliance_policy(
+    SSL_CTX *ctx, enum ssl_compliance_policy_t policy);
+
+// SSL_set_compliance_policy acts the same as |SSL_CTX_set_compliance_policy|,
+// but only configures a single |SSL*|.
+OPENSSL_EXPORT int SSL_set_compliance_policy(
+    SSL *ssl, enum ssl_compliance_policy_t policy);
+
+
 // Nodejs compatibility section (hidden).
 //
 // These defines exist for node.js, with the hope that we can eliminate the
@@ -5243,62 +5353,6 @@
 BORINGSSL_MAKE_DELETER(SSL_SESSION, SSL_SESSION_free)
 BORINGSSL_MAKE_UP_REF(SSL_SESSION, SSL_SESSION_up_ref)
 
-enum class OpenRecordResult {
-  kOK,
-  kDiscard,
-  kIncompleteRecord,
-  kAlertCloseNotify,
-  kError,
-};
-
-//  *** EXPERIMENTAL -- DO NOT USE ***
-//
-// OpenRecord decrypts the first complete SSL record from |in| in-place, sets
-// |out| to the decrypted application data, and |out_record_len| to the length
-// of the encrypted record. Returns:
-// - kOK if an application-data record was successfully decrypted and verified.
-// - kDiscard if a record was sucessfully processed, but should be discarded.
-// - kIncompleteRecord if |in| did not contain a complete record.
-// - kAlertCloseNotify if a record was successfully processed but is a
-//   close_notify alert.
-// - kError if an error occurred or the record is invalid. |*out_alert| will be
-//   set to an alert to emit, or zero if no alert should be emitted.
-OPENSSL_EXPORT OpenRecordResult OpenRecord(SSL *ssl, Span<uint8_t> *out,
-                                           size_t *out_record_len,
-                                           uint8_t *out_alert,
-                                           Span<uint8_t> in);
-
-OPENSSL_EXPORT size_t SealRecordPrefixLen(const SSL *ssl, size_t plaintext_len);
-
-// SealRecordSuffixLen returns the length of the suffix written by |SealRecord|.
-//
-// |plaintext_len| must be equal to the size of the plaintext passed to
-// |SealRecord|.
-//
-// |plaintext_len| must not exceed |SSL3_RT_MAX_PLAINTEXT_LENGTH|. The returned
-// suffix length will not exceed |SSL3_RT_MAX_ENCRYPTED_OVERHEAD|.
-OPENSSL_EXPORT size_t SealRecordSuffixLen(const SSL *ssl, size_t plaintext_len);
-
-//  *** EXPERIMENTAL -- DO NOT USE ***
-//
-// SealRecord encrypts the cleartext of |in| and scatters the resulting TLS
-// application data record between |out_prefix|, |out|, and |out_suffix|. It
-// returns true on success or false if an error occurred.
-//
-// The length of |out_prefix| must equal |SealRecordPrefixLen|. The length of
-// |out| must equal the length of |in|, which must not exceed
-// |SSL3_RT_MAX_PLAINTEXT_LENGTH|. The length of |out_suffix| must equal
-// |SealRecordSuffixLen|.
-//
-// If enabled, |SealRecord| may perform TLS 1.0 CBC 1/n-1 record splitting.
-// |SealRecordPrefixLen| accounts for the required overhead if that is the case.
-//
-// |out| may equal |in| to encrypt in-place but may not otherwise alias.
-// |out_prefix| and |out_suffix| may not alias anything.
-OPENSSL_EXPORT bool SealRecord(SSL *ssl, Span<uint8_t> out_prefix,
-                               Span<uint8_t> out, Span<uint8_t> out_suffix,
-                               Span<const uint8_t> in);
-
 
 // *** EXPERIMENTAL — DO NOT USE WITHOUT CHECKING ***
 //
@@ -5584,7 +5638,7 @@
 #define SSL_R_INVALID_ECH_PUBLIC_NAME 317
 #define SSL_R_INVALID_ECH_CONFIG_LIST 318
 #define SSL_R_ECH_REJECTED 319
-#define SSL_R_OUTER_EXTENSION_NOT_FOUND 320
+#define SSL_R_INVALID_OUTER_EXTENSION 320
 #define SSL_R_INCONSISTENT_ECH_NEGOTIATION 321
 #define SSL_R_SSLV3_ALERT_CLOSE_NOTIFY 1000
 #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010
diff --git a/src/include/openssl/ssl3.h b/src/include/openssl/ssl3.h
index e3910f0..190bca4 100644
--- a/src/include/openssl/ssl3.h
+++ b/src/include/openssl/ssl3.h
@@ -118,7 +118,6 @@
 #define OPENSSL_HEADER_SSL3_H
 
 #include <openssl/aead.h>
-#include <openssl/type_check.h>
 
 #ifdef  __cplusplus
 extern "C" {
@@ -251,10 +250,6 @@
 #define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \
     (EVP_AEAD_MAX_OVERHEAD + EVP_AEAD_MAX_NONCE_LENGTH)
 
-OPENSSL_STATIC_ASSERT(SSL3_RT_MAX_ENCRYPTED_OVERHEAD >=
-                          SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD,
-                      "max overheads are inconsistent");
-
 // SSL3_RT_MAX_COMPRESSED_LENGTH is an alias for
 // |SSL3_RT_MAX_PLAIN_LENGTH|. Compression is gone, so don't include the
 // compression overhead.
@@ -275,6 +270,7 @@
 
 // Pseudo content type for SSL/TLS header info
 #define SSL3_RT_HEADER 0x100
+#define SSL3_RT_CLIENT_HELLO_INNER 0x101
 
 #define SSL3_AL_WARNING 1
 #define SSL3_AL_FATAL 2
diff --git a/src/include/openssl/stack.h b/src/include/openssl/stack.h
index 04e942c..11761dc 100644
--- a/src/include/openssl/stack.h
+++ b/src/include/openssl/stack.h
@@ -59,8 +59,6 @@
 
 #include <openssl/base.h>
 
-#include <openssl/type_check.h>
-
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -69,41 +67,206 @@
 // A stack, in OpenSSL, is an array of pointers. They are the most commonly
 // used collection object.
 //
-// This file defines macros for type safe use of the stack functions. A stack
-// of a specific type of object has type |STACK_OF(type)|. This can be defined
-// (once) with |DEFINE_STACK_OF(type)| and declared where needed with
-// |DECLARE_STACK_OF(type)|. For example:
+// This file defines macros for type-safe use of the stack functions. A stack
+// type is named like |STACK_OF(FOO)| and is accessed with functions named
+// like |sk_FOO_*|. Note the stack will typically contain /pointers/ to |FOO|.
 //
-//   typedef struct foo_st {
-//     int bar;
-//   } FOO;
-//
-//   DEFINE_STACK_OF(FOO)
-//
-// Although note that the stack will contain /pointers/ to |FOO|.
-//
-// A macro will be defined for each of the sk_* functions below. For
-// STACK_OF(FOO), the macros would be sk_FOO_new, sk_FOO_pop etc.
+// The |DECLARE_STACK_OF| macro makes |STACK_OF(FOO)| available, and
+// |DEFINE_STACK_OF| makes the corresponding functions available.
 
 
-// stack_free_func is a function that frees an element in a stack. Note its
+// Defining stacks.
+
+// STACK_OF expands to the stack type for |type|.
+#define STACK_OF(type) struct stack_st_##type
+
+// DECLARE_STACK_OF declares the |STACK_OF(type)| type. It does not make the
+// corresponding |sk_type_*| functions available. This macro should be used in
+// files which only need the type.
+#define DECLARE_STACK_OF(type) STACK_OF(type);
+
+// DEFINE_NAMED_STACK_OF defines |STACK_OF(name)| to be a stack whose elements
+// are |type| *. This macro makes the |sk_name_*| functions available.
+//
+// It is not necessary to use |DECLARE_STACK_OF| in files which use this macro.
+#define DEFINE_NAMED_STACK_OF(name, type)                    \
+  BORINGSSL_DEFINE_STACK_OF_IMPL(name, type *, const type *) \
+  BORINGSSL_DEFINE_STACK_TRAITS(name, type, false)
+
+// DEFINE_STACK_OF defines |STACK_OF(type)| to be a stack whose elements are
+// |type| *. This macro makes the |sk_type_*| functions available.
+//
+// It is not necessary to use |DECLARE_STACK_OF| in files which use this macro.
+#define DEFINE_STACK_OF(type) DEFINE_NAMED_STACK_OF(type, type)
+
+// DEFINE_CONST_STACK_OF defines |STACK_OF(type)| to be a stack whose elements
+// are const |type| *. This macro makes the |sk_type_*| functions available.
+//
+// It is not necessary to use |DECLARE_STACK_OF| in files which use this macro.
+#define DEFINE_CONST_STACK_OF(type)                                \
+  BORINGSSL_DEFINE_STACK_OF_IMPL(type, const type *, const type *) \
+  BORINGSSL_DEFINE_STACK_TRAITS(type, const type, true)
+
+
+// Using stacks.
+//
+// After the |DEFINE_STACK_OF| macro is used, the following functions are
+// available.
+
+#if 0  // Sample
+
+// sk_SAMPLE_free_func is a callback to free an element in a stack.
+typedef void (*sk_SAMPLE_free_func)(SAMPLE *);
+
+// sk_SAMPLE_copy_func is a callback to copy an element in a stack. It should
+// return the copy or NULL on error.
+typedef SAMPLE *(*sk_SAMPLE_copy_func)(SAMPLE *);
+
+// sk_SAMPLE_cmp_func is a callback to compare |*a| to |*b|. It should return a
+// value < 0, 0, or > 0 if |*a| is less than, equal to, or greater than |*b|,
+// respectively.  Note the extra indirection - the function is given a pointer
+// to a pointer to the element. This is the |qsort|/|bsearch| comparison
+// function applied to an array of |SAMPLE*|.
+//
+// TODO(https://crbug.com/boringssl/498): The parameters should be
+// |const SAMPLE *const *|.
+typedef int (*sk_SAMPLE_cmp_func)(const SAMPLE **a, const SAMPLE **b);
+
+// sk_SAMPLE_new creates a new, empty stack with the given comparison function,
+// which may be NULL. It returns the new stack or NULL on allocation failure.
+STACK_OF(SAMPLE) *sk_SAMPLE_new(sk_SAMPLE_cmp_func comp);
+
+// sk_SAMPLE_new_null creates a new, empty stack. It returns the new stack or
+// NULL on allocation failure.
+STACK_OF(SAMPLE) *sk_SAMPLE_new_null(void);
+
+// sk_SAMPLE_num returns the number of elements in |sk|.
+size_t sk_SAMPLE_num(const STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_zero resets |sk| to the empty state but does nothing to free the
+// individual elements themselves.
+void sk_SAMPLE_zero(STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_value returns the |i|th pointer in |sk|, or NULL if |i| is out of
+// range.
+SAMPLE *sk_SAMPLE_value(const STACK_OF(SAMPLE) *sk, size_t i);
+
+// sk_SAMPLE_set sets the |i|th pointer in |sk| to |p| and returns |p|. If |i|
+// is out of range, it returns NULL.
+SAMPLE *sk_SAMPLE_set(STACK_OF(SAMPLE) *sk, size_t i, SAMPLE *p);
+
+// sk_SAMPLE_free frees |sk|, but does nothing to free the individual elements.
+// Use |sk_SAMPLE_pop_free| to also free the elements.
+void sk_SAMPLE_free(STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_pop_free calls |free_func| on each element in |sk| and then
+// frees the stack itself.
+void sk_SAMPLE_pop_free(STACK_OF(SAMPLE) *sk, sk_SAMPLE_free_func free_func);
+
+// sk_SAMPLE_insert inserts |p| into the stack at index |where|, moving existing
+// elements if needed. It returns the length of the new stack, or zero on
+// error.
+size_t sk_SAMPLE_insert(STACK_OF(SAMPLE) *sk, SAMPLE *p, size_t where);
+
+// sk_SAMPLE_delete removes the pointer at index |where|, moving other elements
+// down if needed. It returns the removed pointer, or NULL if |where| is out of
+// range.
+SAMPLE *sk_SAMPLE_delete(STACK_OF(SAMPLE) *sk, size_t where);
+
+// sk_SAMPLE_delete_ptr removes, at most, one instance of |p| from |sk| based on
+// pointer equality. If an instance of |p| is found then |p| is returned,
+// otherwise it returns NULL.
+SAMPLE *sk_SAMPLE_delete_ptr(STACK_OF(SAMPLE) *sk, const SAMPLE *p);
+
+// sk_SAMPLE_find find the first value in |sk| equal to |p|. |sk|'s comparison
+// function determines equality, or pointer equality if |sk| has no comparison
+// function.
+//
+// If the stack is sorted (see |sk_SAMPLE_sort|), this function uses a binary
+// search. Otherwise it performs a linear search. If it finds a matching
+// element, it writes the index to |*out_index| (if |out_index| is not NULL) and
+// returns one. Otherwise, it returns zero.
+//
+// Note this differs from OpenSSL. The type signature is slightly different, and
+// OpenSSL's version will implicitly sort |sk| if it has a comparison function
+// defined.
+int sk_SAMPLE_find(const STACK_OF(SAMPLE) *sk, size_t *out_index,
+                   const SAMPLE *p);
+
+// sk_SAMPLE_shift removes and returns the first element in |sk|, or NULL if
+// |sk| is empty.
+SAMPLE *sk_SAMPLE_shift(STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_push appends |p| to |sk| and returns the length of the new stack,
+// or 0 on allocation failure.
+size_t sk_SAMPLE_push(STACK_OF(SAMPLE) *sk, SAMPLE *p);
+
+// sk_SAMPLE_pop removes and returns the last element of |sk|, or NULL if |sk|
+// is empty.
+SAMPLE *sk_SAMPLE_pop(STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_dup performs a shallow copy of a stack and returns the new stack,
+// or NULL on error. Use |sk_SAMPLE_deep_copy| to also copy the elements.
+STACK_OF(SAMPLE) *sk_SAMPLE_dup(const STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_sort sorts the elements of |sk| into ascending order based on the
+// comparison function. The stack maintains a "sorted" flag and sorting an
+// already sorted stack is a no-op.
+void sk_SAMPLE_sort(STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_is_sorted returns one if |sk| is known to be sorted and zero
+// otherwise.
+int sk_SAMPLE_is_sorted(const STACK_OF(SAMPLE) *sk);
+
+// sk_SAMPLE_set_cmp_func sets the comparison function to be used by |sk| and
+// returns the previous one.
+sk_SAMPLE_cmp_func sk_SAMPLE_set_cmp_func(STACK_OF(SAMPLE) *sk,
+                                          sk_SAMPLE_cmp_func comp);
+
+// sk_SAMPLE_deep_copy performs a copy of |sk| and of each of the non-NULL
+// elements in |sk| by using |copy_func|. If an error occurs, it calls
+// |free_func| to free any copies already made and returns NULL.
+STACK_OF(SAMPLE) *sk_SAMPLE_deep_copy(const STACK_OF(SAMPLE) *sk,
+                                      sk_SAMPLE_copy_func copy_func,
+                                      sk_SAMPLE_free_func free_func);
+
+#endif  // Sample
+
+
+// Private functions.
+//
+// TODO(https://crbug.com/boringssl/499): Rename to |OPENSSL_sk_foo|, after
+// external code that calls them is fixed.
+
+// OPENSSL_sk_free_func is a function that frees an element in a stack. Note its
 // actual type is void (*)(T *) for some T. Low-level |sk_*| functions will be
 // passed a type-specific wrapper to call it correctly.
-typedef void (*stack_free_func)(void *ptr);
+typedef void (*OPENSSL_sk_free_func)(void *ptr);
 
-// stack_copy_func is a function that copies an element in a stack. Note its
-// actual type is T *(*)(T *) for some T. Low-level |sk_*| functions will be
+// OPENSSL_sk_copy_func is a function that copies an element in a stack. Note
+// its actual type is T *(*)(T *) for some T. Low-level |sk_*| functions will be
 // passed a type-specific wrapper to call it correctly.
-typedef void *(*stack_copy_func)(void *ptr);
+typedef void *(*OPENSSL_sk_copy_func)(void *ptr);
 
-// stack_cmp_func is a comparison function that returns a value < 0, 0 or > 0
-// if |*a| is less than, equal to or greater than |*b|, respectively.  Note the
-// extra indirection - the function is given a pointer to a pointer to the
+// OPENSSL_sk_cmp_func is a comparison function that returns a value < 0, 0 or >
+// 0 if |*a| is less than, equal to or greater than |*b|, respectively.  Note
+// the extra indirection - the function is given a pointer to a pointer to the
 // element. This differs from the usual qsort/bsearch comparison function.
 //
-// Note its actual type is int (*)(const T **, const T **). Low-level |sk_*|
+// Note its actual type is |int (*)(const T **a, const T **b)|. Low-level |sk_*|
 // functions will be passed a type-specific wrapper to call it correctly.
-typedef int (*stack_cmp_func)(const void **a, const void **b);
+//
+// TODO(davidben): This type should be |const T *const *|. It is already fixed
+// in OpenSSL 1.1.1, so hopefully we can fix this compatibly.
+typedef int (*OPENSSL_sk_cmp_func)(const void **a, const void **b);
+
+// The following function types call the above type-erased signatures with the
+// true types.
+typedef void (*OPENSSL_sk_call_free_func)(OPENSSL_sk_free_func, void *);
+typedef void *(*OPENSSL_sk_call_copy_func)(OPENSSL_sk_copy_func, void *);
+typedef int (*OPENSSL_sk_call_cmp_func)(OPENSSL_sk_cmp_func,
+                                        const void *const *,
+                                        const void *const *);
 
 // stack_st contains an array of pointers. It is not designed to be used
 // directly, rather the wrapper macros should be used.
@@ -118,135 +281,47 @@
   // to by |data|, which may be larger than |num|.
   size_t num_alloc;
   // comp is an optional comparison function.
-  stack_cmp_func comp;
+  OPENSSL_sk_cmp_func comp;
 } _STACK;
 
-
-#define STACK_OF(type) struct stack_st_##type
-
-#define DECLARE_STACK_OF(type) STACK_OF(type);
-
-// These are the raw stack functions, you shouldn't be using them. Rather you
-// should be using the type stack macros implemented above.
-
-// sk_new creates a new, empty stack with the given comparison function, which
-// may be zero. It returns the new stack or NULL on allocation failure.
-OPENSSL_EXPORT _STACK *sk_new(stack_cmp_func comp);
-
-// sk_new_null creates a new, empty stack. It returns the new stack or NULL on
-// allocation failure.
+// The following are raw stack functions. They implement the corresponding typed
+// |sk_SAMPLE_*| functions generated by |DEFINE_STACK_OF|. Callers shouldn't be
+// using them. Rather, callers should use the typed functions.
+OPENSSL_EXPORT _STACK *sk_new(OPENSSL_sk_cmp_func comp);
 OPENSSL_EXPORT _STACK *sk_new_null(void);
-
-// sk_num returns the number of elements in |s|.
 OPENSSL_EXPORT size_t sk_num(const _STACK *sk);
-
-// sk_zero resets |sk| to the empty state but does nothing to free the
-// individual elements themselves.
 OPENSSL_EXPORT void sk_zero(_STACK *sk);
-
-// sk_value returns the |i|th pointer in |sk|, or NULL if |i| is out of
-// range.
 OPENSSL_EXPORT void *sk_value(const _STACK *sk, size_t i);
-
-// sk_set sets the |i|th pointer in |sk| to |p| and returns |p|. If |i| is out
-// of range, it returns NULL.
 OPENSSL_EXPORT void *sk_set(_STACK *sk, size_t i, void *p);
-
-// sk_free frees the given stack and array of pointers, but does nothing to
-// free the individual elements. Also see |sk_pop_free_ex|.
 OPENSSL_EXPORT void sk_free(_STACK *sk);
-
-// sk_pop_free_ex calls |free_func| on each element in the stack and then frees
-// the stack itself. Note this corresponds to |sk_FOO_pop_free|. It is named
-// |sk_pop_free_ex| as a workaround for existing code calling an older version
-// of |sk_pop_free|.
 OPENSSL_EXPORT void sk_pop_free_ex(_STACK *sk,
-                                   void (*call_free_func)(stack_free_func,
-                                                          void *),
-                                   stack_free_func free_func);
-
-// sk_insert inserts |p| into the stack at index |where|, moving existing
-// elements if needed. It returns the length of the new stack, or zero on
-// error.
+                                   OPENSSL_sk_call_free_func call_free_func,
+                                   OPENSSL_sk_free_func free_func);
 OPENSSL_EXPORT size_t sk_insert(_STACK *sk, void *p, size_t where);
-
-// sk_delete removes the pointer at index |where|, moving other elements down
-// if needed. It returns the removed pointer, or NULL if |where| is out of
-// range.
 OPENSSL_EXPORT void *sk_delete(_STACK *sk, size_t where);
-
-// sk_delete_ptr removes, at most, one instance of |p| from the stack based on
-// pointer equality. If an instance of |p| is found then |p| is returned,
-// otherwise it returns NULL.
 OPENSSL_EXPORT void *sk_delete_ptr(_STACK *sk, const void *p);
-
-// sk_find returns the first value in the stack equal to |p|. If a comparison
-// function has been set on the stack, equality is defined by it, otherwise
-// pointer equality is used. If the stack is sorted, then a binary search is
-// used, otherwise a linear search is performed. If a matching element is found,
-// its index is written to
-// |*out_index| (if |out_index| is not NULL) and one is returned. Otherwise zero
-// is returned.
-//
-// Note this differs from OpenSSL. The type signature is slightly different, and
-// OpenSSL's sk_find will implicitly sort |sk| if it has a comparison function
-// defined.
 OPENSSL_EXPORT int sk_find(const _STACK *sk, size_t *out_index, const void *p,
-                           int (*call_cmp_func)(stack_cmp_func, const void **,
-                                                const void **));
-
-// sk_shift removes and returns the first element in the stack, or returns NULL
-// if the stack is empty.
+                           OPENSSL_sk_call_cmp_func call_cmp_func);
 OPENSSL_EXPORT void *sk_shift(_STACK *sk);
-
-// sk_push appends |p| to the stack and returns the length of the new stack, or
-// 0 on allocation failure.
 OPENSSL_EXPORT size_t sk_push(_STACK *sk, void *p);
-
-// sk_pop returns and removes the last element on the stack, or NULL if the
-// stack is empty.
 OPENSSL_EXPORT void *sk_pop(_STACK *sk);
-
-// sk_dup performs a shallow copy of a stack and returns the new stack, or NULL
-// on error.
 OPENSSL_EXPORT _STACK *sk_dup(const _STACK *sk);
-
-// sk_sort sorts the elements of |sk| into ascending order based on the
-// comparison function. The stack maintains a |sorted| flag and sorting an
-// already sorted stack is a no-op.
-OPENSSL_EXPORT void sk_sort(_STACK *sk);
-
-// sk_is_sorted returns one if |sk| is known to be sorted and zero
-// otherwise.
+OPENSSL_EXPORT void sk_sort(_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func);
 OPENSSL_EXPORT int sk_is_sorted(const _STACK *sk);
-
-// sk_set_cmp_func sets the comparison function to be used by |sk| and returns
-// the previous one.
-OPENSSL_EXPORT stack_cmp_func sk_set_cmp_func(_STACK *sk, stack_cmp_func comp);
-
-// sk_deep_copy performs a copy of |sk| and of each of the non-NULL elements in
-// |sk| by using |copy_func|. If an error occurs, |free_func| is used to free
-// any copies already made and NULL is returned.
-OPENSSL_EXPORT _STACK *sk_deep_copy(
-    const _STACK *sk, void *(*call_copy_func)(stack_copy_func, void *),
-    stack_copy_func copy_func, void (*call_free_func)(stack_free_func, void *),
-    stack_free_func free_func);
-
-
-// Deprecated functions.
+OPENSSL_EXPORT OPENSSL_sk_cmp_func sk_set_cmp_func(_STACK *sk,
+                                                   OPENSSL_sk_cmp_func comp);
+OPENSSL_EXPORT _STACK *sk_deep_copy(const _STACK *sk,
+                                    OPENSSL_sk_call_copy_func call_copy_func,
+                                    OPENSSL_sk_copy_func copy_func,
+                                    OPENSSL_sk_call_free_func call_free_func,
+                                    OPENSSL_sk_free_func free_func);
 
 // sk_pop_free behaves like |sk_pop_free_ex| but performs an invalid function
 // pointer cast. It exists because some existing callers called |sk_pop_free|
 // directly.
 //
 // TODO(davidben): Migrate callers to bssl::UniquePtr and remove this.
-OPENSSL_EXPORT void sk_pop_free(_STACK *sk, stack_free_func free_func);
-
-
-// Defining stack types.
-//
-// This set of macros is used to emit the typed functions that act on a
-// |STACK_OF(T)|.
+OPENSSL_EXPORT void sk_pop_free(_STACK *sk, OPENSSL_sk_free_func free_func);
 
 #if !defined(BORINGSSL_NO_CXX)
 extern "C++" {
@@ -276,156 +351,149 @@
 #define BORINGSSL_DEFINE_STACK_TRAITS(name, type, is_const)
 #endif
 
-#define BORINGSSL_DEFINE_STACK_OF_IMPL(name, ptrtype, constptrtype)            \
-  DECLARE_STACK_OF(name)                                                       \
-                                                                               \
-  typedef void (*stack_##name##_free_func)(ptrtype);                           \
-  typedef ptrtype (*stack_##name##_copy_func)(ptrtype);                        \
-  typedef int (*stack_##name##_cmp_func)(constptrtype *a, constptrtype *b);    \
-                                                                               \
-  OPENSSL_INLINE void sk_##name##_call_free_func(stack_free_func free_func,    \
-                                                 void *ptr) {                  \
-    ((stack_##name##_free_func)free_func)((ptrtype)ptr);                       \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE void *sk_##name##_call_copy_func(stack_copy_func copy_func,   \
-                                                  void *ptr) {                 \
-    return (void *)((stack_##name##_copy_func)copy_func)((ptrtype)ptr);        \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE int sk_##name##_call_cmp_func(                                \
-      stack_cmp_func cmp_func, const void **a, const void **b) {               \
-    constptrtype a_ptr = (constptrtype)*a;                                     \
-    constptrtype b_ptr = (constptrtype)*b;                                     \
-    return ((stack_##name##_cmp_func)cmp_func)(&a_ptr, &b_ptr);                \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE STACK_OF(name) *                                              \
-      sk_##name##_new(stack_##name##_cmp_func comp) {                          \
-    return (STACK_OF(name) *)sk_new((stack_cmp_func)comp);                     \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE STACK_OF(name) *sk_##name##_new_null(void) {                  \
-    return (STACK_OF(name) *)sk_new_null();                                    \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE size_t sk_##name##_num(const STACK_OF(name) *sk) {            \
-    return sk_num((const _STACK *)sk);                                         \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE void sk_##name##_zero(STACK_OF(name) *sk) {                   \
-    sk_zero((_STACK *)sk);                                                     \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_value(const STACK_OF(name) *sk,           \
-                                           size_t i) {                         \
-    return (ptrtype)sk_value((const _STACK *)sk, i);                           \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_set(STACK_OF(name) *sk, size_t i,         \
-                                         ptrtype p) {                          \
-    return (ptrtype)sk_set((_STACK *)sk, i, (void *)p);                        \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE void sk_##name##_free(STACK_OF(name) * sk) {                  \
-    sk_free((_STACK *)sk);                                                     \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE void sk_##name##_pop_free(                                    \
-      STACK_OF(name) * sk, stack_##name##_free_func free_func) {               \
-    sk_pop_free_ex((_STACK *)sk, sk_##name##_call_free_func,                   \
-                   (stack_free_func)free_func);                                \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE size_t sk_##name##_insert(STACK_OF(name) *sk, ptrtype p,      \
-                                           size_t where) {                     \
-    return sk_insert((_STACK *)sk, (void *)p, where);                          \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_delete(STACK_OF(name) *sk,                \
-                                            size_t where) {                    \
-    return (ptrtype)sk_delete((_STACK *)sk, where);                            \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_delete_ptr(STACK_OF(name) *sk,            \
-                                                constptrtype p) {              \
-    return (ptrtype)sk_delete_ptr((_STACK *)sk, (const void *)p);              \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE int sk_##name##_find(const STACK_OF(name) *sk,                \
-                                      size_t * out_index, constptrtype p) {    \
-    return sk_find((const _STACK *)sk, out_index, (const void *)p,             \
-                   sk_##name##_call_cmp_func);                                 \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_shift(STACK_OF(name) *sk) {               \
-    return (ptrtype)sk_shift((_STACK *)sk);                                    \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE size_t sk_##name##_push(STACK_OF(name) *sk, ptrtype p) {      \
-    return sk_push((_STACK *)sk, (void *)p);                                   \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE ptrtype sk_##name##_pop(STACK_OF(name) *sk) {                 \
-    return (ptrtype)sk_pop((_STACK *)sk);                                      \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE STACK_OF(name) * sk_##name##_dup(const STACK_OF(name) *sk) {  \
-    return (STACK_OF(name) *)sk_dup((const _STACK *)sk);                       \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE void sk_##name##_sort(STACK_OF(name) *sk) {                   \
-    sk_sort((_STACK *)sk);                                                     \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE int sk_##name##_is_sorted(const STACK_OF(name) *sk) {         \
-    return sk_is_sorted((const _STACK *)sk);                                   \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE stack_##name##_cmp_func sk_##name##_set_cmp_func(             \
-      STACK_OF(name) *sk, stack_##name##_cmp_func comp) {                      \
-    return (stack_##name##_cmp_func)sk_set_cmp_func((_STACK *)sk,              \
-                                                    (stack_cmp_func)comp);     \
-  }                                                                            \
-                                                                               \
-  OPENSSL_INLINE STACK_OF(name) *                                              \
-      sk_##name##_deep_copy(const STACK_OF(name) *sk,                          \
-                            ptrtype(*copy_func)(ptrtype),                      \
-                            void (*free_func)(ptrtype)) {                      \
-    return (STACK_OF(name) *)sk_deep_copy(                                     \
-        (const _STACK *)sk, sk_##name##_call_copy_func,                        \
-        (stack_copy_func)copy_func, sk_##name##_call_free_func,                \
-        (stack_free_func)free_func);                                           \
-  }
+#define BORINGSSL_DEFINE_STACK_OF_IMPL(name, ptrtype, constptrtype)           \
+  /* We disable MSVC C4191 in this macro, which warns when pointers are cast  \
+   * to the wrong type. While the cast itself is valid, it is often a bug     \
+   * because calling it through the cast is UB. However, we never actually    \
+   * call functions as |OPENSSL_sk_cmp_func|. The type is just a type-erased  \
+   * function pointer. (C does not guarantee function pointers fit in         \
+   * |void*|, and GCC will warn on this.) Thus we just disable the false      \
+   * positive warning. */                                                     \
+  OPENSSL_MSVC_PRAGMA(warning(push))                                          \
+  OPENSSL_MSVC_PRAGMA(warning(disable : 4191))                                \
+                                                                              \
+  DECLARE_STACK_OF(name)                                                      \
+                                                                              \
+  typedef void (*sk_##name##_free_func)(ptrtype);                             \
+  typedef ptrtype (*sk_##name##_copy_func)(ptrtype);                          \
+  typedef int (*sk_##name##_cmp_func)(constptrtype *a, constptrtype *b);      \
+                                                                              \
+  OPENSSL_INLINE void sk_##name##_call_free_func(                             \
+      OPENSSL_sk_free_func free_func, void *ptr) {                            \
+    ((sk_##name##_free_func)free_func)((ptrtype)ptr);                         \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE void *sk_##name##_call_copy_func(                            \
+      OPENSSL_sk_copy_func copy_func, void *ptr) {                            \
+    return (void *)((sk_##name##_copy_func)copy_func)((ptrtype)ptr);          \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE int sk_##name##_call_cmp_func(OPENSSL_sk_cmp_func cmp_func,  \
+                                               const void *const *a,          \
+                                               const void *const *b) {        \
+    /* The data is actually stored as |void*| pointers, so read the pointer   \
+     * as |void*| and then pass the corrected type into the caller-supplied   \
+     * function, which expects |constptrtype*|. */                            \
+    constptrtype a_ptr = (constptrtype)*a;                                    \
+    constptrtype b_ptr = (constptrtype)*b;                                    \
+    return ((sk_##name##_cmp_func)cmp_func)(&a_ptr, &b_ptr);                  \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE STACK_OF(name) *sk_##name##_new(sk_##name##_cmp_func comp) { \
+    return (STACK_OF(name) *)sk_new((OPENSSL_sk_cmp_func)comp);               \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE STACK_OF(name) *sk_##name##_new_null(void) {                 \
+    return (STACK_OF(name) *)sk_new_null();                                   \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE size_t sk_##name##_num(const STACK_OF(name) *sk) {           \
+    return sk_num((const _STACK *)sk);                                        \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE void sk_##name##_zero(STACK_OF(name) *sk) {                  \
+    sk_zero((_STACK *)sk);                                                    \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_value(const STACK_OF(name) *sk,          \
+                                           size_t i) {                        \
+    return (ptrtype)sk_value((const _STACK *)sk, i);                          \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_set(STACK_OF(name) *sk, size_t i,        \
+                                         ptrtype p) {                         \
+    return (ptrtype)sk_set((_STACK *)sk, i, (void *)p);                       \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE void sk_##name##_free(STACK_OF(name) *sk) {                  \
+    sk_free((_STACK *)sk);                                                    \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE void sk_##name##_pop_free(STACK_OF(name) *sk,                \
+                                           sk_##name##_free_func free_func) { \
+    sk_pop_free_ex((_STACK *)sk, sk_##name##_call_free_func,                  \
+                   (OPENSSL_sk_free_func)free_func);                          \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE size_t sk_##name##_insert(STACK_OF(name) *sk, ptrtype p,     \
+                                           size_t where) {                    \
+    return sk_insert((_STACK *)sk, (void *)p, where);                         \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_delete(STACK_OF(name) *sk,               \
+                                            size_t where) {                   \
+    return (ptrtype)sk_delete((_STACK *)sk, where);                           \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_delete_ptr(STACK_OF(name) *sk,           \
+                                                constptrtype p) {             \
+    return (ptrtype)sk_delete_ptr((_STACK *)sk, (const void *)p);             \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE int sk_##name##_find(const STACK_OF(name) *sk,               \
+                                      size_t *out_index, constptrtype p) {    \
+    return sk_find((const _STACK *)sk, out_index, (const void *)p,            \
+                   sk_##name##_call_cmp_func);                                \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_shift(STACK_OF(name) *sk) {              \
+    return (ptrtype)sk_shift((_STACK *)sk);                                   \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE size_t sk_##name##_push(STACK_OF(name) *sk, ptrtype p) {     \
+    return sk_push((_STACK *)sk, (void *)p);                                  \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE ptrtype sk_##name##_pop(STACK_OF(name) *sk) {                \
+    return (ptrtype)sk_pop((_STACK *)sk);                                     \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE STACK_OF(name) *sk_##name##_dup(const STACK_OF(name) *sk) {  \
+    return (STACK_OF(name) *)sk_dup((const _STACK *)sk);                      \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE void sk_##name##_sort(STACK_OF(name) *sk) {                  \
+    sk_sort((_STACK *)sk, sk_##name##_call_cmp_func);                         \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE int sk_##name##_is_sorted(const STACK_OF(name) *sk) {        \
+    return sk_is_sorted((const _STACK *)sk);                                  \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE sk_##name##_cmp_func sk_##name##_set_cmp_func(               \
+      STACK_OF(name) *sk, sk_##name##_cmp_func comp) {                        \
+    return (sk_##name##_cmp_func)sk_set_cmp_func((_STACK *)sk,                \
+                                                 (OPENSSL_sk_cmp_func)comp);  \
+  }                                                                           \
+                                                                              \
+  OPENSSL_INLINE STACK_OF(name) *sk_##name##_deep_copy(                       \
+      const STACK_OF(name) *sk, sk_##name##_copy_func copy_func,              \
+      sk_##name##_free_func free_func) {                                      \
+    return (STACK_OF(name) *)sk_deep_copy(                                    \
+        (const _STACK *)sk, sk_##name##_call_copy_func,                       \
+        (OPENSSL_sk_copy_func)copy_func, sk_##name##_call_free_func,          \
+        (OPENSSL_sk_free_func)free_func);                                     \
+  }                                                                           \
+                                                                              \
+  OPENSSL_MSVC_PRAGMA(warning(pop))
 
-// DEFINE_NAMED_STACK_OF defines |STACK_OF(name)| to be a stack whose elements
-// are |type| *.
-#define DEFINE_NAMED_STACK_OF(name, type)                    \
-  BORINGSSL_DEFINE_STACK_OF_IMPL(name, type *, const type *) \
-  BORINGSSL_DEFINE_STACK_TRAITS(name, type, false)
 
-// DEFINE_STACK_OF defines |STACK_OF(type)| to be a stack whose elements are
-// |type| *.
-#define DEFINE_STACK_OF(type) DEFINE_NAMED_STACK_OF(type, type)
-
-// DEFINE_CONST_STACK_OF defines |STACK_OF(type)| to be a stack whose elements
-// are const |type| *.
-#define DEFINE_CONST_STACK_OF(type)                                \
-  BORINGSSL_DEFINE_STACK_OF_IMPL(type, const type *, const type *) \
-  BORINGSSL_DEFINE_STACK_TRAITS(type, const type, true)
-
-// DEFINE_SPECIAL_STACK_OF defines |STACK_OF(type)| to be a stack whose elements
-// are |type|, where |type| must be a typedef for a pointer.
-#define DEFINE_SPECIAL_STACK_OF(type)                   \
-  OPENSSL_STATIC_ASSERT(sizeof(type) == sizeof(void *), \
-                        #type " is not a pointer");     \
-  BORINGSSL_DEFINE_STACK_OF_IMPL(type, type, const type)
-
+// Built-in stacks.
 
 typedef char *OPENSSL_STRING;
 
 DEFINE_STACK_OF(void)
-DEFINE_SPECIAL_STACK_OF(OPENSSL_STRING)
+DEFINE_NAMED_STACK_OF(OPENSSL_STRING, char)
 
 
 #if defined(__cplusplus)
@@ -443,22 +511,20 @@
 
 // Stacks defined with |DEFINE_CONST_STACK_OF| are freed with |sk_free|.
 template <typename Stack>
-struct DeleterImpl<
-    Stack, typename std::enable_if<StackTraits<Stack>::kIsConst>::type> {
+struct DeleterImpl<Stack, std::enable_if_t<StackTraits<Stack>::kIsConst>> {
   static void Free(Stack *sk) { sk_free(reinterpret_cast<_STACK *>(sk)); }
 };
 
 // Stacks defined with |DEFINE_STACK_OF| are freed with |sk_pop_free| and the
 // corresponding type's deleter.
 template <typename Stack>
-struct DeleterImpl<
-    Stack, typename std::enable_if<!StackTraits<Stack>::kIsConst>::type> {
+struct DeleterImpl<Stack, std::enable_if_t<!StackTraits<Stack>::kIsConst>> {
   static void Free(Stack *sk) {
     // sk_FOO_pop_free is defined by macros and bound by name, so we cannot
     // access it from C++ here.
     using Type = typename StackTraits<Stack>::Type;
     sk_pop_free_ex(reinterpret_cast<_STACK *>(sk),
-                   [](stack_free_func /* unused */, void *ptr) {
+                   [](OPENSSL_sk_free_func /* unused */, void *ptr) {
                      DeleterImpl<Type>::Free(reinterpret_cast<Type *>(ptr));
                    },
                    nullptr);
@@ -502,18 +568,17 @@
 };
 
 template <typename Stack>
-using StackIterator = typename std::enable_if<StackTraits<Stack>::kIsStack,
-                                              StackIteratorImpl<Stack>>::type;
+using StackIterator =
+    std::enable_if_t<StackTraits<Stack>::kIsStack, StackIteratorImpl<Stack>>;
 
 }  // namespace internal
 
 // PushToStack pushes |elem| to |sk|. It returns true on success and false on
 // allocation failure.
 template <typename Stack>
-inline
-    typename std::enable_if<!internal::StackTraits<Stack>::kIsConst, bool>::type
-    PushToStack(Stack *sk,
-                UniquePtr<typename internal::StackTraits<Stack>::Type> elem) {
+inline std::enable_if_t<!internal::StackTraits<Stack>::kIsConst, bool>
+PushToStack(Stack *sk,
+            UniquePtr<typename internal::StackTraits<Stack>::Type> elem) {
   if (!sk_push(reinterpret_cast<_STACK *>(sk), elem.get())) {
     return false;
   }
diff --git a/src/include/openssl/thread.h b/src/include/openssl/thread.h
index 91706fe..c6e357e 100644
--- a/src/include/openssl/thread.h
+++ b/src/include/openssl/thread.h
@@ -77,14 +77,13 @@
 typedef union crypto_mutex_st {
   void *handle;
 } CRYPTO_MUTEX;
-#elif defined(__MACH__) && defined(__APPLE__)
+#elif !defined(__GLIBC__)
 typedef pthread_rwlock_t CRYPTO_MUTEX;
 #else
-// It is reasonable to include pthread.h on non-Windows systems, however the
-// |pthread_rwlock_t| that we need is hidden under feature flags, and we can't
-// ensure that we'll be able to get it. It's statically asserted that this
-// structure is large enough to contain a |pthread_rwlock_t| by
-// thread_pthread.c.
+// On glibc, |pthread_rwlock_t| is hidden under feature flags, and we can't
+// ensure that we'll be able to get it from a public header. It's statically
+// asserted that this structure is large enough to contain a |pthread_rwlock_t|
+// by thread_pthread.c.
 typedef union crypto_mutex_st {
   double alignment;
   uint8_t padding[3*sizeof(int) + 5*sizeof(unsigned) + 16 + 8];
diff --git a/src/include/openssl/tls1.h b/src/include/openssl/tls1.h
index a3136c0..724d580 100644
--- a/src/include/openssl/tls1.h
+++ b/src/include/openssl/tls1.h
@@ -452,9 +452,15 @@
 #define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0x0300CCAC
 
 // TLS 1.3 ciphersuites from RFC 8446.
-#define TLS1_CK_AES_128_GCM_SHA256 0x03001301
-#define TLS1_CK_AES_256_GCM_SHA384 0x03001302
-#define TLS1_CK_CHACHA20_POLY1305_SHA256 0x03001303
+#define TLS1_3_CK_AES_128_GCM_SHA256 0x03001301
+#define TLS1_3_CK_AES_256_GCM_SHA384 0x03001302
+#define TLS1_3_CK_CHACHA20_POLY1305_SHA256 0x03001303
+
+// The following constants are legacy aliases of |TLS1_3_CK_*|.
+// TODO(davidben): Migrate callers to the new name and remove these.
+#define TLS1_CK_AES_128_GCM_SHA256 TLS1_3_CK_AES_128_GCM_SHA256
+#define TLS1_CK_AES_256_GCM_SHA384 TLS1_3_CK_AES_256_GCM_SHA384
+#define TLS1_CK_CHACHA20_POLY1305_SHA256 TLS1_3_CK_CHACHA20_POLY1305_SHA256
 
 // XXX
 // Inconsistency alert:
@@ -624,10 +630,15 @@
   "ECDHE-PSK-CHACHA20-POLY1305"
 
 // TLS 1.3 ciphersuites from RFC 8446.
-#define TLS1_TXT_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256"
-#define TLS1_TXT_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384"
-#define TLS1_TXT_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256"
+#define TLS1_3_RFC_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256"
+#define TLS1_3_RFC_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384"
+#define TLS1_3_RFC_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256"
 
+// The following constants are legacy aliases of |TLS1_3_CK_*|.
+// TODO(bbe): Migrate callers to the new name and remove these.
+#define TLS1_TXT_AES_128_GCM_SHA256 TLS1_3_RFC_AES_128_GCM_SHA256
+#define TLS1_TXT_AES_256_GCM_SHA384 TLS1_3_RFC_AES_256_GCM_SHA384
+#define TLS1_TXT_CHACHA20_POLY1305_SHA256 TLS1_3_RFC_CHACHA20_POLY1305_SHA256
 
 #define TLS_CT_RSA_SIGN 1
 #define TLS_CT_DSS_SIGN 2
diff --git a/src/include/openssl/trust_token.h b/src/include/openssl/trust_token.h
index d9247f7..745a860 100644
--- a/src/include/openssl/trust_token.h
+++ b/src/include/openssl/trust_token.h
@@ -78,15 +78,30 @@
 // to ensure success, these should be at least
 // |TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE| and |TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE|.
 //
-// WARNING: This API is unstable and the serializations of these keys are
-// subject to change. Keys generated with this function may not be persisted.
-//
 // This function returns one on success or zero on error.
 OPENSSL_EXPORT int TRUST_TOKEN_generate_key(
     const TRUST_TOKEN_METHOD *method, uint8_t *out_priv_key,
     size_t *out_priv_key_len, size_t max_priv_key_len, uint8_t *out_pub_key,
     size_t *out_pub_key_len, size_t max_pub_key_len, uint32_t id);
 
+// TRUST_TOKEN_derive_key_from_secret deterministically derives a new Trust
+// Token keypair labeled with |id| from an input |secret| and serializes the
+// private and public keys, writing the private key to |out_priv_key| and
+// setting |*out_priv_key_len| to the number of bytes written, and writing the
+// public key to |out_pub_key| and setting |*out_pub_key_len| to the number of
+// bytes written.
+//
+// At most |max_priv_key_len| and |max_pub_key_len| bytes are written. In order
+// to ensure success, these should be at least
+// |TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE| and |TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE|.
+//
+// This function returns one on success or zero on error.
+OPENSSL_EXPORT int TRUST_TOKEN_derive_key_from_secret(
+    const TRUST_TOKEN_METHOD *method, uint8_t *out_priv_key,
+    size_t *out_priv_key_len, size_t max_priv_key_len, uint8_t *out_pub_key,
+    size_t *out_pub_key_len, size_t max_pub_key_len, uint32_t id,
+    const uint8_t *secret, size_t secret_len);
+
 
 // Trust Token client implementation.
 //
diff --git a/src/include/openssl/type_check.h b/src/include/openssl/type_check.h
index c267938..6460ab1 100644
--- a/src/include/openssl/type_check.h
+++ b/src/include/openssl/type_check.h
@@ -64,17 +64,6 @@
 #endif
 
 
-#if defined(__cplusplus) || (defined(_MSC_VER) && !defined(__clang__))
-// In C++ and non-clang MSVC, |static_assert| is a keyword.
-#define OPENSSL_STATIC_ASSERT(cond, msg) static_assert(cond, msg)
-#else
-// C11 defines the |_Static_assert| keyword and the |static_assert| macro in
-// assert.h. While the former is available at all versions in Clang and GCC, the
-// later depends on libc and, in glibc, depends on being built in C11 mode. We
-// do not require this, for now, so use |_Static_assert| directly.
-#define OPENSSL_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
-#endif
-
 // CHECKED_CAST casts |p| from type |from| to type |to|.
 //
 // TODO(davidben): Although this macro is not public API and is unused in
diff --git a/src/include/openssl/x509.h b/src/include/openssl/x509.h
index 0f117e2..e3369d9 100644
--- a/src/include/openssl/x509.h
+++ b/src/include/openssl/x509.h
@@ -90,11 +90,1478 @@
 // Legacy X.509 library.
 //
 // This header is part of OpenSSL's X.509 implementation. It is retained for
-// compatibility but otherwise underdocumented and not actively maintained. In
-// the future, a replacement library will be available. Meanwhile, minimize
+// compatibility but should not be used by new code. The functions are difficult
+// to use correctly, and have buggy or non-standard behaviors. They are thus
+// particularly prone to behavior changes and API removals, as BoringSSL
+// iterates on these issues.
+//
+// In the future, a replacement library will be available. Meanwhile, minimize
 // dependencies on this header where possible.
+//
+// TODO(https://crbug.com/boringssl/426): Documentation for this library is
+// still in progress. Some functions have not yet been documented, and some
+// functions have not yet been grouped into sections.
 
 
+// Certificates.
+//
+// An |X509| object represents an X.509 certificate, defined in RFC 5280.
+//
+// Although an |X509| is a mutable object, mutating an |X509| can give incorrect
+// results. Callers typically obtain |X509|s by parsing some input with
+// |d2i_X509|, etc. Such objects carry information such as the serialized
+// TBSCertificate and decoded extensions, which will become inconsistent when
+// mutated.
+//
+// Instead, mutation functions should only be used when issuing new
+// certificates, as described in a later section.
+
+DEFINE_STACK_OF(X509)
+
+// X509 is an |ASN1_ITEM| whose ASN.1 type is X.509 Certificate (RFC 5280) and C
+// type is |X509*|.
+DECLARE_ASN1_ITEM(X509)
+
+// X509_up_ref adds one to the reference count of |x509| and returns one.
+OPENSSL_EXPORT int X509_up_ref(X509 *x509);
+
+// X509_chain_up_ref returns a newly-allocated |STACK_OF(X509)| containing a
+// shallow copy of |chain|, or NULL on error. That is, the return value has the
+// same contents as |chain|, and each |X509|'s reference count is incremented by
+// one.
+OPENSSL_EXPORT STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain);
+
+// X509_dup returns a newly-allocated copy of |x509|, or NULL on error. This
+// function works by serializing the structure, so auxiliary properties (see
+// |i2d_X509_AUX|) are not preserved. Additionally, if |x509| is incomplete,
+// this function may fail.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |crl| was
+// mutated.
+OPENSSL_EXPORT X509 *X509_dup(X509 *x509);
+
+// X509_free decrements |x509|'s reference count and, if zero, releases memory
+// associated with |x509|.
+OPENSSL_EXPORT void X509_free(X509 *x509);
+
+// d2i_X509 parses up to |len| bytes from |*inp| as a DER-encoded X.509
+// Certificate (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509 *d2i_X509(X509 **out, const uint8_t **inp, long len);
+
+// X509_parse_from_buffer parses an X.509 structure from |buf| and returns a
+// fresh X509 or NULL on error. There must not be any trailing data in |buf|.
+// The returned structure (if any) holds a reference to |buf| rather than
+// copying parts of it as a normal |d2i_X509| call would do.
+OPENSSL_EXPORT X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf);
+
+// i2d_X509 marshals |x509| as a DER-encoded X.509 Certificate (RFC 5280), as
+// described in |i2d_SAMPLE|.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |x509| was
+// mutated.
+OPENSSL_EXPORT int i2d_X509(X509 *x509, uint8_t **outp);
+
+// X509_VERSION_* are X.509 version numbers. Note the numerical values of all
+// defined X.509 versions are one less than the named version.
+#define X509_VERSION_1 0
+#define X509_VERSION_2 1
+#define X509_VERSION_3 2
+
+// X509_get_version returns the numerical value of |x509|'s version, which will
+// be one of the |X509_VERSION_*| constants.
+OPENSSL_EXPORT long X509_get_version(const X509 *x509);
+
+// X509_get0_serialNumber returns |x509|'s serial number.
+OPENSSL_EXPORT const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509);
+
+// X509_get0_notBefore returns |x509|'s notBefore time.
+OPENSSL_EXPORT const ASN1_TIME *X509_get0_notBefore(const X509 *x509);
+
+// X509_get0_notAfter returns |x509|'s notAfter time.
+OPENSSL_EXPORT const ASN1_TIME *X509_get0_notAfter(const X509 *x509);
+
+// X509_get_issuer_name returns |x509|'s issuer.
+OPENSSL_EXPORT X509_NAME *X509_get_issuer_name(const X509 *x509);
+
+// X509_get_subject_name returns |x509|'s subject.
+OPENSSL_EXPORT X509_NAME *X509_get_subject_name(const X509 *x509);
+
+// X509_get_X509_PUBKEY returns the public key of |x509|. Note this function is
+// not const-correct for legacy reasons. Callers should not modify the returned
+// object.
+OPENSSL_EXPORT X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509);
+
+// X509_get_pubkey returns |x509|'s public key as an |EVP_PKEY|, or NULL if the
+// public key was unsupported or could not be decoded. This function returns a
+// reference to the |EVP_PKEY|. The caller must release the result with
+// |EVP_PKEY_free| when done.
+OPENSSL_EXPORT EVP_PKEY *X509_get_pubkey(X509 *x509);
+
+// X509_get0_pubkey_bitstr returns the BIT STRING portion of |x509|'s public
+// key. Note this does not contain the AlgorithmIdentifier portion.
+//
+// WARNING: This function returns a non-const pointer for OpenSSL compatibility,
+// but the caller must not modify the resulting object. Doing so will break
+// internal invariants in |x509|.
+OPENSSL_EXPORT ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x509);
+
+// X509_get0_uids sets |*out_issuer_uid| to a non-owning pointer to the
+// issuerUID field of |x509|, or NULL if |x509| has no issuerUID. It similarly
+// outputs |x509|'s subjectUID field to |*out_subject_uid|.
+//
+// Callers may pass NULL to either |out_issuer_uid| or |out_subject_uid| to
+// ignore the corresponding field.
+OPENSSL_EXPORT void X509_get0_uids(const X509 *x509,
+                                   const ASN1_BIT_STRING **out_issuer_uid,
+                                   const ASN1_BIT_STRING **out_subject_uid);
+
+// X509_get0_extensions returns |x509|'s extension list, or NULL if |x509| omits
+// it.
+OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_get0_extensions(
+    const X509 *x509);
+
+// X509_get_ext_count returns the number of extensions in |x|.
+OPENSSL_EXPORT int X509_get_ext_count(const X509 *x);
+
+// X509_get_ext_by_NID behaves like |X509v3_get_ext_by_NID| but searches for
+// extensions in |x|.
+OPENSSL_EXPORT int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos);
+
+// X509_get_ext_by_OBJ behaves like |X509v3_get_ext_by_OBJ| but searches for
+// extensions in |x|.
+OPENSSL_EXPORT int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj,
+                                       int lastpos);
+
+// X509_get_ext_by_critical behaves like |X509v3_get_ext_by_critical| but
+// searches for extensions in |x|.
+OPENSSL_EXPORT int X509_get_ext_by_critical(const X509 *x, int crit,
+                                            int lastpos);
+
+// X509_get_ext returns the extension in |x| at index |loc|, or NULL if |loc| is
+// out of bounds. This function returns a non-const pointer for OpenSSL
+// compatibility, but callers should not mutate the result.
+OPENSSL_EXPORT X509_EXTENSION *X509_get_ext(const X509 *x, int loc);
+
+// X509_get0_tbs_sigalg returns the signature algorithm in |x509|'s
+// TBSCertificate. For the outer signature algorithm, see |X509_get0_signature|.
+//
+// Certificates with mismatched signature algorithms will successfully parse,
+// but they will be rejected when verifying.
+OPENSSL_EXPORT const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x509);
+
+// X509_get0_signature sets |*out_sig| and |*out_alg| to the signature and
+// signature algorithm of |x509|, respectively. Either output pointer may be
+// NULL to ignore the value.
+//
+// This function outputs the outer signature algorithm. For the one in the
+// TBSCertificate, see |X509_get0_tbs_sigalg|. Certificates with mismatched
+// signature algorithms will successfully parse, but they will be rejected when
+// verifying.
+OPENSSL_EXPORT void X509_get0_signature(const ASN1_BIT_STRING **out_sig,
+                                        const X509_ALGOR **out_alg,
+                                        const X509 *x509);
+
+// X509_get_signature_nid returns the NID corresponding to |x509|'s signature
+// algorithm, or |NID_undef| if the signature algorithm does not correspond to
+// a known NID.
+OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509);
+
+// i2d_X509_tbs serializes the TBSCertificate portion of |x509|, as described in
+// |i2d_SAMPLE|.
+//
+// This function preserves the original encoding of the TBSCertificate and may
+// not reflect modifications made to |x509|. It may be used to manually verify
+// the signature of an existing certificate. To generate certificates, use
+// |i2d_re_X509_tbs| instead.
+OPENSSL_EXPORT int i2d_X509_tbs(X509 *x509, unsigned char **outp);
+
+
+// Issuing certificates.
+//
+// An |X509| object may also represent an incomplete certificate. Callers may
+// construct empty |X509| objects, fill in fields individually, and finally sign
+// the result. The following functions may be used for this purpose.
+
+// X509_new returns a newly-allocated, empty |X509| object, or NULL on error.
+// This produces an incomplete certificate which may be filled in to issue a new
+// certificate.
+OPENSSL_EXPORT X509 *X509_new(void);
+
+// X509_set_version sets |x509|'s version to |version|, which should be one of
+// the |X509V_VERSION_*| constants. It returns one on success and zero on error.
+//
+// If unsure, use |X509_VERSION_3|.
+OPENSSL_EXPORT int X509_set_version(X509 *x509, long version);
+
+// X509_set_serialNumber sets |x509|'s serial number to |serial|. It returns one
+// on success and zero on error.
+OPENSSL_EXPORT int X509_set_serialNumber(X509 *x509,
+                                         const ASN1_INTEGER *serial);
+
+// X509_set1_notBefore sets |x509|'s notBefore time to |tm|. It returns one on
+// success and zero on error.
+OPENSSL_EXPORT int X509_set1_notBefore(X509 *x509, const ASN1_TIME *tm);
+
+// X509_set1_notAfter sets |x509|'s notAfter time to |tm|. it returns one on
+// success and zero on error.
+OPENSSL_EXPORT int X509_set1_notAfter(X509 *x509, const ASN1_TIME *tm);
+
+// X509_getm_notBefore returns a mutable pointer to |x509|'s notBefore time.
+OPENSSL_EXPORT ASN1_TIME *X509_getm_notBefore(X509 *x509);
+
+// X509_getm_notAfter returns a mutable pointer to |x509|'s notAfter time.
+OPENSSL_EXPORT ASN1_TIME *X509_getm_notAfter(X509 *x);
+
+// X509_set_issuer_name sets |x509|'s issuer to a copy of |name|. It returns one
+// on success and zero on error.
+OPENSSL_EXPORT int X509_set_issuer_name(X509 *x509, X509_NAME *name);
+
+// X509_set_subject_name sets |x509|'s subject to a copy of |name|. It returns
+// one on success and zero on error.
+OPENSSL_EXPORT int X509_set_subject_name(X509 *x509, X509_NAME *name);
+
+// X509_set_pubkey sets |x509|'s public key to |pkey|. It returns one on success
+// and zero on error. This function does not take ownership of |pkey| and
+// internally copies and updates reference counts as needed.
+OPENSSL_EXPORT int X509_set_pubkey(X509 *x509, EVP_PKEY *pkey);
+
+// X509_delete_ext removes the extension in |x| at index |loc| and returns the
+// removed extension, or NULL if |loc| was out of bounds. If non-NULL, the
+// caller must release the result with |X509_EXTENSION_free|.
+OPENSSL_EXPORT X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
+
+// X509_add_ext adds a copy of |ex| to |x|. It returns one on success and zero
+// on failure. The caller retains ownership of |ex| and can release it
+// independently of |x|.
+//
+// The new extension is inserted at index |loc|, shifting extensions to the
+// right. If |loc| is -1 or out of bounds, the new extension is appended to the
+// list.
+OPENSSL_EXPORT int X509_add_ext(X509 *x, const X509_EXTENSION *ex, int loc);
+
+// X509_sign signs |x509| with |pkey| and replaces the signature algorithm and
+// signature fields. It returns one on success and zero on error. This function
+// uses digest algorithm |md|, or |pkey|'s default if NULL. Other signing
+// parameters use |pkey|'s defaults. To customize them, use |X509_sign_ctx|.
+OPENSSL_EXPORT int X509_sign(X509 *x509, EVP_PKEY *pkey, const EVP_MD *md);
+
+// X509_sign_ctx signs |x509| with |ctx| and replaces the signature algorithm
+// and signature fields. It returns one on success and zero on error. The
+// signature algorithm and parameters come from |ctx|, which must have been
+// initialized with |EVP_DigestSignInit|. The caller should configure the
+// corresponding |EVP_PKEY_CTX| before calling this function.
+OPENSSL_EXPORT int X509_sign_ctx(X509 *x509, EVP_MD_CTX *ctx);
+
+// i2d_re_X509_tbs serializes the TBSCertificate portion of |x509|, as described
+// in |i2d_SAMPLE|.
+//
+// This function re-encodes the TBSCertificate and may not reflect |x509|'s
+// original encoding. It may be used to manually generate a signature for a new
+// certificate. To verify certificates, use |i2d_X509_tbs| instead.
+OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, unsigned char **outp);
+
+// X509_set1_signature_algo sets |x509|'s signature algorithm to |algo| and
+// returns one on success or zero on error. It updates both the signature field
+// of the TBSCertificate structure, and the signatureAlgorithm field of the
+// Certificate.
+OPENSSL_EXPORT int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo);
+
+// X509_set1_signature_value sets |x509|'s signature to a copy of the |sig_len|
+// bytes pointed by |sig|. It returns one on success and zero on error.
+//
+// Due to a specification error, X.509 certificates store signatures in ASN.1
+// BIT STRINGs, but signature algorithms return byte strings rather than bit
+// strings. This function creates a BIT STRING containing a whole number of
+// bytes, with the bit order matching the DER encoding. This matches the
+// encoding used by all X.509 signature algorithms.
+OPENSSL_EXPORT int X509_set1_signature_value(X509 *x509, const uint8_t *sig,
+                                             size_t sig_len);
+
+
+// Auxiliary certificate properties.
+//
+// |X509| objects optionally maintain auxiliary properties. These are not part
+// of the certificates themselves, and thus are not covered by signatures or
+// preserved by the standard serialization. They are used as inputs or outputs
+// to other functions in this library.
+
+// i2d_X509_AUX marshals |x509| as a DER-encoded X.509 Certificate (RFC 5280),
+// followed optionally by a separate, OpenSSL-specific structure with auxiliary
+// properties. It behaves as described in |i2d_SAMPLE|.
+//
+// Unlike similarly-named functions, this function does not output a single
+// ASN.1 element. Directly embedding the output in a larger ASN.1 structure will
+// not behave correctly.
+OPENSSL_EXPORT int i2d_X509_AUX(X509 *x509, unsigned char **outp);
+
+// d2i_X509_AUX parses up to |length| bytes from |*inp| as a DER-encoded X.509
+// Certificate (RFC 5280), followed optionally by a separate, OpenSSL-specific
+// structure with auxiliary properties. It behaves as described in
+// |d2i_SAMPLE_with_reuse|.
+//
+// Some auxiliary properties affect trust decisions, so this function should not
+// be used with untrusted input.
+//
+// Unlike similarly-named functions, this function does not parse a single
+// ASN.1 element. Trying to parse data directly embedded in a larger ASN.1
+// structure will not behave correctly.
+OPENSSL_EXPORT X509 *d2i_X509_AUX(X509 **x509, const unsigned char **inp,
+                                  long length);
+
+// X509_alias_set1 sets |x509|'s alias to |len| bytes from |name|. If |name| is
+// NULL, the alias is cleared instead. Aliases are not part of the certificate
+// itself and will not be serialized by |i2d_X509|.
+OPENSSL_EXPORT int X509_alias_set1(X509 *x509, const unsigned char *name,
+                                   int len);
+
+// X509_keyid_set1 sets |x509|'s key ID to |len| bytes from |id|. If |id| is
+// NULL, the key ID is cleared instead. Key IDs are not part of the certificate
+// itself and will not be serialized by |i2d_X509|.
+OPENSSL_EXPORT int X509_keyid_set1(X509 *x509, const unsigned char *id,
+                                   int len);
+
+// X509_alias_get0 looks up |x509|'s alias. If found, it sets |*out_len| to the
+// alias's length and returns a pointer to a buffer containing the contents. If
+// not found, it outputs the empty string by returning NULL and setting
+// |*out_len| to zero.
+//
+// If |x509| was parsed from a PKCS#12 structure (see
+// |PKCS12_get_key_and_certs|), the alias will reflect the friendlyName
+// attribute (RFC 2985).
+//
+// WARNING: In OpenSSL, this function did not set |*out_len| when the alias was
+// missing. Callers that target both OpenSSL and BoringSSL should set the value
+// to zero before calling this function.
+OPENSSL_EXPORT unsigned char *X509_alias_get0(X509 *x509, int *out_len);
+
+// X509_keyid_get0 looks up |x509|'s key ID. If found, it sets |*out_len| to the
+// key ID's length and returns a pointer to a buffer containing the contents. If
+// not found, it outputs the empty string by returning NULL and setting
+// |*out_len| to zero.
+//
+// WARNING: In OpenSSL, this function did not set |*out_len| when the alias was
+// missing. Callers that target both OpenSSL and BoringSSL should set the value
+// to zero before calling this function.
+OPENSSL_EXPORT unsigned char *X509_keyid_get0(X509 *x509, int *out_len);
+
+
+// Certificate revocation lists.
+//
+// An |X509_CRL| object represents an X.509 certificate revocation list (CRL),
+// defined in RFC 5280. A CRL is a signed list of certificates which are no
+// longer considered valid.
+//
+// Although an |X509_CRL| is a mutable object, mutating an |X509_CRL| can give
+// incorrect results. Callers typically obtain |X509_CRL|s by parsing some input
+// with |d2i_X509_CRL|, etc. Such objects carry information such as the
+// serialized TBSCertList and decoded extensions, which will become inconsistent
+// when mutated.
+//
+// Instead, mutation functions should only be used when issuing new CRLs, as
+// described in a later section.
+
+DEFINE_STACK_OF(X509_CRL)
+
+// X509_CRL is an |ASN1_ITEM| whose ASN.1 type is X.509 CertificateList (RFC
+// 5280) and C type is |X509_CRL*|.
+DECLARE_ASN1_ITEM(X509_CRL)
+
+// X509_CRL_up_ref adds one to the reference count of |crl| and returns one.
+OPENSSL_EXPORT int X509_CRL_up_ref(X509_CRL *crl);
+
+// X509_CRL_dup returns a newly-allocated copy of |crl|, or NULL on error. This
+// function works by serializing the structure, so if |crl| is incomplete, it
+// may fail.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |crl| was
+// mutated.
+OPENSSL_EXPORT X509_CRL *X509_CRL_dup(X509_CRL *crl);
+
+// X509_CRL_free decrements |crl|'s reference count and, if zero, releases
+// memory associated with |crl|.
+OPENSSL_EXPORT void X509_CRL_free(X509_CRL *crl);
+
+// d2i_X509_CRL parses up to |len| bytes from |*inp| as a DER-encoded X.509
+// CertificateList (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_CRL *d2i_X509_CRL(X509_CRL **out, const uint8_t **inp,
+                                      long len);
+
+// i2d_X509_CRL marshals |crl| as a X.509 CertificateList (RFC 5280), as
+// described in |i2d_SAMPLE|.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |crl| was
+// mutated.
+OPENSSL_EXPORT int i2d_X509_CRL(X509_CRL *crl, uint8_t **outp);
+
+#define X509_CRL_VERSION_1 0
+#define X509_CRL_VERSION_2 1
+
+// X509_CRL_get_version returns the numerical value of |crl|'s version, which
+// will be one of the |X509_CRL_VERSION_*| constants.
+OPENSSL_EXPORT long X509_CRL_get_version(const X509_CRL *crl);
+
+// X509_CRL_get0_lastUpdate returns |crl|'s thisUpdate time. The OpenSSL API
+// refers to this field as lastUpdate.
+OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl);
+
+// X509_CRL_get0_nextUpdate returns |crl|'s nextUpdate time, or NULL if |crl|
+// has none.
+OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl);
+
+// X509_CRL_get_issuer returns |crl|'s issuer name. Note this function is not
+// const-correct for legacy reasons.
+OPENSSL_EXPORT X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl);
+
+// X509_CRL_get_REVOKED returns the list of revoked certificates in |crl|, or
+// NULL if |crl| omits it.
+//
+// TOOD(davidben): This function was originally a macro, without clear const
+// semantics. It should take a const input and give const output, but the latter
+// would break existing callers. For now, we match upstream.
+OPENSSL_EXPORT STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl);
+
+// X509_CRL_get0_extensions returns |crl|'s extension list, or NULL if |crl|
+// omits it.
+OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(
+    const X509_CRL *crl);
+
+// X509_CRL_get_ext_count returns the number of extensions in |x|.
+OPENSSL_EXPORT int X509_CRL_get_ext_count(const X509_CRL *x);
+
+// X509_CRL_get_ext_by_NID behaves like |X509v3_get_ext_by_NID| but searches for
+// extensions in |x|.
+OPENSSL_EXPORT int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid,
+                                           int lastpos);
+
+// X509_CRL_get_ext_by_OBJ behaves like |X509v3_get_ext_by_OBJ| but searches for
+// extensions in |x|.
+OPENSSL_EXPORT int X509_CRL_get_ext_by_OBJ(const X509_CRL *x,
+                                           const ASN1_OBJECT *obj, int lastpos);
+
+// X509_CRL_get_ext_by_critical behaves like |X509v3_get_ext_by_critical| but
+// searches for extensions in |x|.
+OPENSSL_EXPORT int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit,
+                                                int lastpos);
+
+// X509_CRL_get_ext returns the extension in |x| at index |loc|, or NULL if
+// |loc| is out of bounds. This function returns a non-const pointer for OpenSSL
+// compatibility, but callers should not mutate the result.
+OPENSSL_EXPORT X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc);
+
+// X509_CRL_get0_signature sets |*out_sig| and |*out_alg| to the signature and
+// signature algorithm of |crl|, respectively. Either output pointer may be NULL
+// to ignore the value.
+//
+// This function outputs the outer signature algorithm, not the one in the
+// TBSCertList. CRLs with mismatched signature algorithms will successfully
+// parse, but they will be rejected when verifying.
+OPENSSL_EXPORT void X509_CRL_get0_signature(const X509_CRL *crl,
+                                            const ASN1_BIT_STRING **out_sig,
+                                            const X509_ALGOR **out_alg);
+
+// X509_CRL_get_signature_nid returns the NID corresponding to |crl|'s signature
+// algorithm, or |NID_undef| if the signature algorithm does not correspond to
+// a known NID.
+OPENSSL_EXPORT int X509_CRL_get_signature_nid(const X509_CRL *crl);
+
+// i2d_X509_CRL_tbs serializes the TBSCertList portion of |crl|, as described in
+// |i2d_SAMPLE|.
+//
+// This function preserves the original encoding of the TBSCertList and may not
+// reflect modifications made to |crl|. It may be used to manually verify the
+// signature of an existing CRL. To generate CRLs, use |i2d_re_X509_CRL_tbs|
+// instead.
+OPENSSL_EXPORT int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp);
+
+
+// Issuing certificate revocation lists.
+//
+// An |X509_CRL| object may also represent an incomplete CRL. Callers may
+// construct empty |X509_CRL| objects, fill in fields individually, and finally
+// sign the result. The following functions may be used for this purpose.
+
+// X509_CRL_new returns a newly-allocated, empty |X509_CRL| object, or NULL on
+// error. This object may be filled in and then signed to construct a CRL.
+OPENSSL_EXPORT X509_CRL *X509_CRL_new(void);
+
+// X509_CRL_set_version sets |crl|'s version to |version|, which should be one
+// of the |X509_CRL_VERSION_*| constants. It returns one on success and zero on
+// error.
+//
+// If unsure, use |X509_CRL_VERSION_2|. Note that, unlike certificates, CRL
+// versions are only defined up to v2. Callers should not use |X509_VERSION_3|.
+OPENSSL_EXPORT int X509_CRL_set_version(X509_CRL *crl, long version);
+
+// X509_CRL_set_issuer_name sets |crl|'s issuer to a copy of |name|. It returns
+// one on success and zero on error.
+OPENSSL_EXPORT int X509_CRL_set_issuer_name(X509_CRL *crl, X509_NAME *name);
+
+// X509_CRL_set1_lastUpdate sets |crl|'s thisUpdate time to |tm|. It returns one
+// on success and zero on error. The OpenSSL API refers to this field as
+// lastUpdate.
+OPENSSL_EXPORT int X509_CRL_set1_lastUpdate(X509_CRL *crl, const ASN1_TIME *tm);
+
+// X509_CRL_set1_nextUpdate sets |crl|'s nextUpdate time to |tm|. It returns one
+// on success and zero on error.
+OPENSSL_EXPORT int X509_CRL_set1_nextUpdate(X509_CRL *crl, const ASN1_TIME *tm);
+
+// X509_CRL_delete_ext removes the extension in |x| at index |loc| and returns
+// the removed extension, or NULL if |loc| was out of bounds. If non-NULL, the
+// caller must release the result with |X509_EXTENSION_free|.
+OPENSSL_EXPORT X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
+
+// X509_CRL_add_ext adds a copy of |ex| to |x|. It returns one on success and
+// zero on failure. The caller retains ownership of |ex| and can release it
+// independently of |x|.
+//
+// The new extension is inserted at index |loc|, shifting extensions to the
+// right. If |loc| is -1 or out of bounds, the new extension is appended to the
+// list.
+OPENSSL_EXPORT int X509_CRL_add_ext(X509_CRL *x, const X509_EXTENSION *ex,
+                                    int loc);
+
+// X509_CRL_sign signs |crl| with |pkey| and replaces the signature algorithm
+// and signature fields. It returns one on success and zero on error. This
+// function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
+// signing parameters use |pkey|'s defaults. To customize them, use
+// |X509_CRL_sign_ctx|.
+OPENSSL_EXPORT int X509_CRL_sign(X509_CRL *crl, EVP_PKEY *pkey,
+                                 const EVP_MD *md);
+
+// X509_CRL_sign_ctx signs |crl| with |ctx| and replaces the signature algorithm
+// and signature fields. It returns one on success and zero on error. The
+// signature algorithm and parameters come from |ctx|, which must have been
+// initialized with |EVP_DigestSignInit|. The caller should configure the
+// corresponding |EVP_PKEY_CTX| before calling this function.
+OPENSSL_EXPORT int X509_CRL_sign_ctx(X509_CRL *crl, EVP_MD_CTX *ctx);
+
+// i2d_re_X509_CRL_tbs serializes the TBSCertList portion of |crl|, as described
+// in |i2d_SAMPLE|.
+//
+// This function re-encodes the TBSCertList and may not reflect |crl|'s original
+// encoding. It may be used to manually generate a signature for a new CRL. To
+// verify CRLs, use |i2d_X509_CRL_tbs| instead.
+OPENSSL_EXPORT int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp);
+
+// X509_CRL_set1_signature_algo sets |crl|'s signature algorithm to |algo| and
+// returns one on success or zero on error. It updates both the signature field
+// of the TBSCertList structure, and the signatureAlgorithm field of the CRL.
+OPENSSL_EXPORT int X509_CRL_set1_signature_algo(X509_CRL *crl,
+                                                const X509_ALGOR *algo);
+
+// X509_CRL_set1_signature_value sets |crl|'s signature to a copy of the
+// |sig_len| bytes pointed by |sig|. It returns one on success and zero on
+// error.
+//
+// Due to a specification error, X.509 CRLs store signatures in ASN.1 BIT
+// STRINGs, but signature algorithms return byte strings rather than bit
+// strings. This function creates a BIT STRING containing a whole number of
+// bytes, with the bit order matching the DER encoding. This matches the
+// encoding used by all X.509 signature algorithms.
+OPENSSL_EXPORT int X509_CRL_set1_signature_value(X509_CRL *crl,
+                                                 const uint8_t *sig,
+                                                 size_t sig_len);
+
+
+// Certificate requests.
+//
+// An |X509_REQ| represents a PKCS #10 certificate request (RFC 2986). These are
+// also referred to as certificate signing requests or CSRs. CSRs are a common
+// format used to request a certificate from a CA.
+//
+// Although an |X509_REQ| is a mutable object, mutating an |X509_REQ| can give
+// incorrect results. Callers typically obtain |X509_REQ|s by parsing some input
+// with |d2i_X509_REQ|, etc. Such objects carry information such as the
+// serialized CertificationRequestInfo, which will become inconsistent when
+// mutated.
+//
+// Instead, mutation functions should only be used when issuing new CRLs, as
+// described in a later section.
+
+// X509_REQ is an |ASN1_ITEM| whose ASN.1 type is CertificateRequest (RFC 2986)
+// and C type is |X509_REQ*|.
+DECLARE_ASN1_ITEM(X509_REQ)
+
+// X509_REQ_dup returns a newly-allocated copy of |req|, or NULL on error. This
+// function works by serializing the structure, so if |req| is incomplete, it
+// may fail.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |req| was
+// mutated.
+OPENSSL_EXPORT X509_REQ *X509_REQ_dup(X509_REQ *req);
+
+// X509_REQ_free releases memory associated with |req|.
+OPENSSL_EXPORT void X509_REQ_free(X509_REQ *req);
+
+// d2i_X509_REQ parses up to |len| bytes from |*inp| as a DER-encoded
+// CertificateRequest (RFC 2986), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp,
+                                      long len);
+
+// i2d_X509_REQ marshals |req| as a CertificateRequest (RFC 2986), as described
+// in |i2d_SAMPLE|.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |req| was
+// mutated.
+OPENSSL_EXPORT int i2d_X509_REQ(X509_REQ *req, uint8_t **outp);
+
+
+// X509_REQ_VERSION_1 is the version constant for |X509_REQ| objects. No other
+// versions are defined.
+#define X509_REQ_VERSION_1 0
+
+// X509_REQ_get_version returns the numerical value of |req|'s version. This
+// will always be |X509_REQ_VERSION_1| for valid CSRs. For compatibility,
+// |d2i_X509_REQ| also accepts some invalid version numbers, in which case this
+// function may return other values.
+OPENSSL_EXPORT long X509_REQ_get_version(const X509_REQ *req);
+
+// X509_REQ_get_subject_name returns |req|'s subject name. Note this function is
+// not const-correct for legacy reasons.
+OPENSSL_EXPORT X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req);
+
+// X509_REQ_get_pubkey returns |req|'s public key as an |EVP_PKEY|, or NULL if
+// the public key was unsupported or could not be decoded. This function returns
+// a reference to the |EVP_PKEY|. The caller must release the result with
+// |EVP_PKEY_free| when done.
+OPENSSL_EXPORT EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req);
+
+// X509_REQ_get0_signature sets |*out_sig| and |*out_alg| to the signature and
+// signature algorithm of |req|, respectively. Either output pointer may be NULL
+// to ignore the value.
+OPENSSL_EXPORT void X509_REQ_get0_signature(const X509_REQ *req,
+                                            const ASN1_BIT_STRING **out_sig,
+                                            const X509_ALGOR **out_alg);
+
+// X509_REQ_get_signature_nid returns the NID corresponding to |req|'s signature
+// algorithm, or |NID_undef| if the signature algorithm does not correspond to
+// a known NID.
+OPENSSL_EXPORT int X509_REQ_get_signature_nid(const X509_REQ *req);
+
+
+// Issuing certificate requests.
+//
+// An |X509_REQ| object may also represent an incomplete CSR. Callers may
+// construct empty |X509_REQ| objects, fill in fields individually, and finally
+// sign the result. The following functions may be used for this purpose.
+
+// X509_REQ_new returns a newly-allocated, empty |X509_REQ| object, or NULL on
+// error. This object may be filled in and then signed to construct a CSR.
+OPENSSL_EXPORT X509_REQ *X509_REQ_new(void);
+
+// X509_REQ_set_version sets |req|'s version to |version|, which should be
+// |X509_REQ_VERSION_1|. It returns one on success and zero on error.
+//
+// The only defined CSR version is |X509_REQ_VERSION_1|, so there is no need to
+// call this function.
+OPENSSL_EXPORT int X509_REQ_set_version(X509_REQ *req, long version);
+
+// X509_REQ_set_subject_name sets |req|'s subject to a copy of |name|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name);
+
+// X509_REQ_set_pubkey sets |req|'s public key to |pkey|. It returns one on
+// success and zero on error. This function does not take ownership of |pkey|
+// and internally copies and updates reference counts as needed.
+OPENSSL_EXPORT int X509_REQ_set_pubkey(X509_REQ *req, EVP_PKEY *pkey);
+
+// X509_REQ_sign signs |req| with |pkey| and replaces the signature algorithm
+// and signature fields. It returns one on success and zero on error. This
+// function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
+// signing parameters use |pkey|'s defaults. To customize them, use
+// |X509_REQ_sign_ctx|.
+OPENSSL_EXPORT int X509_REQ_sign(X509_REQ *req, EVP_PKEY *pkey,
+                                 const EVP_MD *md);
+
+// X509_REQ_sign_ctx signs |req| with |ctx| and replaces the signature algorithm
+// and signature fields. It returns one on success and zero on error. The
+// signature algorithm and parameters come from |ctx|, which must have been
+// initialized with |EVP_DigestSignInit|. The caller should configure the
+// corresponding |EVP_PKEY_CTX| before calling this function.
+OPENSSL_EXPORT int X509_REQ_sign_ctx(X509_REQ *req, EVP_MD_CTX *ctx);
+
+// i2d_re_X509_REQ_tbs serializes the CertificationRequestInfo (see RFC 2986)
+// portion of |req|, as described in |i2d_SAMPLE|.
+//
+// This function re-encodes the CertificationRequestInfo and may not reflect
+// |req|'s original encoding. It may be used to manually generate a signature
+// for a new certificate request.
+OPENSSL_EXPORT int i2d_re_X509_REQ_tbs(X509_REQ *req, uint8_t **outp);
+
+// X509_REQ_set1_signature_algo sets |req|'s signature algorithm to |algo| and
+// returns one on success or zero on error.
+OPENSSL_EXPORT int X509_REQ_set1_signature_algo(X509_REQ *req,
+                                                const X509_ALGOR *algo);
+
+// X509_REQ_set1_signature_value sets |req|'s signature to a copy of the
+// |sig_len| bytes pointed by |sig|. It returns one on success and zero on
+// error.
+//
+// Due to a specification error, PKCS#10 certificate requests store signatures
+// in ASN.1 BIT STRINGs, but signature algorithms return byte strings rather
+// than bit strings. This function creates a BIT STRING containing a whole
+// number of bytes, with the bit order matching the DER encoding. This matches
+// the encoding used by all X.509 signature algorithms.
+OPENSSL_EXPORT int X509_REQ_set1_signature_value(X509_REQ *req,
+                                                 const uint8_t *sig,
+                                                 size_t sig_len);
+
+
+// Names.
+//
+// An |X509_NAME| represents an X.509 Name structure (RFC 5280). X.509 names are
+// a complex, hierarchical structure over a collection of attributes. Each name
+// is sequence of relative distinguished names (RDNs), decreasing in
+// specificity. For example, the first RDN may specify the country, while the
+// next RDN may specify a locality. Each RDN is, itself, a set of attributes.
+// Having more than one attribute in an RDN is uncommon, but possible. Within an
+// RDN, attributes have the same level in specificity. Attribute types are
+// OBJECT IDENTIFIERs. This determines the ASN.1 type of the value, which is
+// commonly a string but may be other types.
+//
+// The |X509_NAME| representation flattens this two-level structure into a
+// single list of attributes. Each attribute is stored in an |X509_NAME_ENTRY|,
+// with also maintains the index of the RDN it is part of, accessible via
+// |X509_NAME_ENTRY_set|. This can be used to recover the two-level structure.
+//
+// X.509 names are largely vestigial. Historically, DNS names were parsed out of
+// the subject's common name attribute, but this is deprecated and has since
+// moved to the subject alternative name extension. In modern usage, X.509 names
+// are primarily opaque identifiers to link a certificate with its issuer.
+
+DEFINE_STACK_OF(X509_NAME_ENTRY)
+DEFINE_STACK_OF(X509_NAME)
+
+// X509_NAME is an |ASN1_ITEM| whose ASN.1 type is X.509 Name (RFC 5280) and C
+// type is |X509_NAME*|.
+DECLARE_ASN1_ITEM(X509_NAME)
+
+// X509_NAME_new returns a new, empty |X509_NAME_new|, or NULL on
+// error.
+OPENSSL_EXPORT X509_NAME *X509_NAME_new(void);
+
+// X509_NAME_free releases memory associated with |name|.
+OPENSSL_EXPORT void X509_NAME_free(X509_NAME *name);
+
+// d2i_X509_NAME parses up to |len| bytes from |*inp| as a DER-encoded X.509
+// Name (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_NAME *d2i_X509_NAME(X509_NAME **out, const uint8_t **inp,
+                                        long len);
+
+// i2d_X509_NAME marshals |in| as a DER-encoded X.509 Name (RFC 5280), as
+// described in |i2d_SAMPLE|.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |in| was
+// mutated.
+OPENSSL_EXPORT int i2d_X509_NAME(X509_NAME *in, uint8_t **outp);
+
+// X509_NAME_dup returns a newly-allocated copy of |name|, or NULL on error.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |name| was
+// mutated.
+OPENSSL_EXPORT X509_NAME *X509_NAME_dup(X509_NAME *name);
+
+// X509_NAME_get0_der sets |*out_der| and |*out_der_len|
+//
+// Avoid this function and prefer |i2d_X509_NAME|. It is one of the reasons
+// these functions are not consistently thread-safe or const-correct. Depending
+// on the resolution of https://crbug.com/boringssl/407, this function may be
+// removed or cause poor performance.
+OPENSSL_EXPORT int X509_NAME_get0_der(X509_NAME *name, const uint8_t **out_der,
+                                      size_t *out_der_len);
+
+// X509_NAME_set makes a copy of |name|. On success, it frees |*xn|, sets |*xn|
+// to the copy, and returns one. Otherwise, it returns zero.
+//
+// TODO(https://crbug.com/boringssl/407): This function should be const and
+// thread-safe but is currently neither in some cases, notably if |name| was
+// mutated.
+OPENSSL_EXPORT int X509_NAME_set(X509_NAME **xn, X509_NAME *name);
+
+// X509_NAME_entry_count returns the number of entries in |name|.
+OPENSSL_EXPORT int X509_NAME_entry_count(const X509_NAME *name);
+
+// X509_NAME_get_index_by_NID returns the zero-based index of the first
+// attribute in |name| with type |nid|, or -1 if there is none. |nid| should be
+// one of the |NID_*| constants. If |lastpos| is non-negative, it begins
+// searching at |lastpos+1|. To search all attributes, pass in -1, not zero.
+//
+// Indices from this function refer to |X509_NAME|'s flattened representation.
+OPENSSL_EXPORT int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid,
+                                              int lastpos);
+
+// X509_NAME_get_index_by_OBJ behaves like |X509_NAME_get_index_by_NID| but
+// looks for attributes with type |obj|.
+OPENSSL_EXPORT int X509_NAME_get_index_by_OBJ(const X509_NAME *name,
+                                              const ASN1_OBJECT *obj,
+                                              int lastpos);
+
+// X509_NAME_get_entry returns the attribute in |name| at index |loc|, or NULL
+// if |loc| is out of range. |loc| is interpreted using |X509_NAME|'s flattened
+// representation. This function returns a non-const pointer for OpenSSL
+// compatibility, but callers should not mutate the result. Doing so will break
+// internal invariants in the library.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name,
+                                                    int loc);
+
+// X509_NAME_delete_entry removes and returns the attribute in |name| at index
+// |loc|, or NULL if |loc| is out of range. |loc| is interpreted using
+// |X509_NAME|'s flattened representation. If the attribute is found, the caller
+// is responsible for releasing the result with |X509_NAME_ENTRY_free|.
+//
+// This function will internally update RDN indices (see |X509_NAME_ENTRY_set|)
+// so they continue to be consecutive.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name,
+                                                       int loc);
+
+// X509_NAME_add_entry adds a copy of |entry| to |name| and returns one on
+// success or zero on error. If |loc| is -1, the entry is appended to |name|.
+// Otherwise, it is inserted at index |loc|. If |set| is -1, the entry is added
+// to the previous entry's RDN. If it is 0, the entry becomes a singleton RDN.
+// If 1, it is added to next entry's RDN.
+//
+// This function will internally update RDN indices (see |X509_NAME_ENTRY_set|)
+// so they continue to be consecutive.
+OPENSSL_EXPORT int X509_NAME_add_entry(X509_NAME *name,
+                                       const X509_NAME_ENTRY *entry, int loc,
+                                       int set);
+
+// X509_NAME_add_entry_by_OBJ adds a new entry to |name| and returns one on
+// success or zero on error. The entry's attribute type is |obj|. The entry's
+// attribute value is determined by |type|, |bytes|, and |len|, as in
+// |X509_NAME_ENTRY_set_data|. The entry's position is determined by |loc| and
+// |set| as in |X509_NAME_entry|.
+OPENSSL_EXPORT int X509_NAME_add_entry_by_OBJ(X509_NAME *name,
+                                              const ASN1_OBJECT *obj, int type,
+                                              const uint8_t *bytes, int len,
+                                              int loc, int set);
+
+// X509_NAME_add_entry_by_NID behaves like |X509_NAME_add_entry_by_OBJ| but sets
+// the entry's attribute type to |nid|, which should be one of the |NID_*|
+// constants.
+OPENSSL_EXPORT int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid,
+                                              int type, const uint8_t *bytes,
+                                              int len, int loc, int set);
+
+// X509_NAME_add_entry_by_txt behaves like |X509_NAME_add_entry_by_OBJ| but sets
+// the entry's attribute type to |field|, which is passed to |OBJ_txt2obj|.
+OPENSSL_EXPORT int X509_NAME_add_entry_by_txt(X509_NAME *name,
+                                              const char *field, int type,
+                                              const uint8_t *bytes, int len,
+                                              int loc, int set);
+
+// X509_NAME_ENTRY is an |ASN1_ITEM| whose ASN.1 type is AttributeTypeAndValue
+// (RFC 5280) and C type is |X509_NAME_ENTRY*|.
+DECLARE_ASN1_ITEM(X509_NAME_ENTRY)
+
+// X509_NAME_ENTRY_new returns a new, empty |X509_NAME_ENTRY_new|, or NULL on
+// error.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_new(void);
+
+// X509_NAME_ENTRY_free releases memory associated with |entry|.
+OPENSSL_EXPORT void X509_NAME_ENTRY_free(X509_NAME_ENTRY *entry);
+
+// d2i_X509_NAME_ENTRY parses up to |len| bytes from |*inp| as a DER-encoded
+// AttributeTypeAndValue (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_NAME_ENTRY *d2i_X509_NAME_ENTRY(X509_NAME_ENTRY **out,
+                                                    const uint8_t **inp,
+                                                    long len);
+
+// i2d_X509_NAME_ENTRY marshals |in| as a DER-encoded AttributeTypeAndValue (RFC
+// 5280), as described in |i2d_SAMPLE|.
+OPENSSL_EXPORT int i2d_X509_NAME_ENTRY(const X509_NAME_ENTRY *in,
+                                       uint8_t **outp);
+
+// X509_NAME_ENTRY_dup returns a newly-allocated copy of |entry|, or NULL on
+// error.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_dup(
+    const X509_NAME_ENTRY *entry);
+
+// X509_NAME_ENTRY_get_object returns |entry|'s attribute type. This function
+// returns a non-const pointer for OpenSSL compatibility, but callers should not
+// mutate the result. Doing so will break internal invariants in the library.
+OPENSSL_EXPORT ASN1_OBJECT *X509_NAME_ENTRY_get_object(
+    const X509_NAME_ENTRY *entry);
+
+// X509_NAME_ENTRY_set_object sets |entry|'s attribute type to |obj|. It returns
+// one on success and zero on error.
+OPENSSL_EXPORT int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *entry,
+                                              const ASN1_OBJECT *obj);
+
+// X509_NAME_ENTRY_get_data returns |entry|'s attribute value, represented as an
+// |ASN1_STRING|. This value may have any ASN.1 type, so callers must check the
+// type before interpreting the contents. This function returns a non-const
+// pointer for OpenSSL compatibility, but callers should not mutate the result.
+// Doing so will break internal invariants in the library.
+//
+// TODO(https://crbug.com/boringssl/412): Although the spec says any ASN.1 type
+// is allowed, we currently only allow an ad-hoc set of types. Additionally, it
+// is unclear if some types can even be represented by this function.
+OPENSSL_EXPORT ASN1_STRING *X509_NAME_ENTRY_get_data(
+    const X509_NAME_ENTRY *entry);
+
+// X509_NAME_ENTRY_set_data sets |entry|'s value to |len| bytes from |bytes|. It
+// returns one on success and zero on error. If |len| is -1, |bytes| must be a
+// NUL-terminated C string and the length is determined by |strlen|. |bytes| is
+// converted to an ASN.1 type as follows:
+//
+// If |type| is a |MBSTRING_*| constant, the value is an ASN.1 string. The
+// string is determined by decoding |bytes| in the encoding specified by |type|,
+// and then re-encoding it in a form appropriate for |entry|'s attribute type.
+// See |ASN1_STRING_set_by_NID| for details.
+//
+// Otherwise, the value is an |ASN1_STRING| with type |type| and value |bytes|.
+// See |ASN1_STRING| for how to format ASN.1 types as an |ASN1_STRING|. If
+// |type| is |V_ASN1_UNDEF| the previous |ASN1_STRING| type is reused.
+OPENSSL_EXPORT int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *entry, int type,
+                                            const uint8_t *bytes, int len);
+
+// X509_NAME_ENTRY_set returns the zero-based index of the RDN which contains
+// |entry|. Consecutive entries with the same index are part of the same RDN.
+OPENSSL_EXPORT int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *entry);
+
+// X509_NAME_ENTRY_create_by_OBJ creates a new |X509_NAME_ENTRY| with attribute
+// type |obj|. The attribute value is determined from |type|, |bytes|, and |len|
+// as in |X509_NAME_ENTRY_set_data|. It returns the |X509_NAME_ENTRY| on success
+// and NULL on error.
+//
+// If |out| is non-NULL and |*out| is NULL, it additionally sets |*out| to the
+// result on success. If both |out| and |*out| are non-NULL, it updates the
+// object at |*out| instead of allocating a new one.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(
+    X509_NAME_ENTRY **out, const ASN1_OBJECT *obj, int type,
+    const uint8_t *bytes, int len);
+
+// X509_NAME_ENTRY_create_by_NID behaves like |X509_NAME_ENTRY_create_by_OBJ|
+// except the attribute type is |nid|, which should be one of the |NID_*|
+// constants.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(
+    X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes, int len);
+
+// X509_NAME_ENTRY_create_by_txt behaves like |X509_NAME_ENTRY_create_by_OBJ|
+// except the attribute type is |field|, which is passed to |OBJ_txt2obj|.
+OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(
+    X509_NAME_ENTRY **out, const char *field, int type, const uint8_t *bytes,
+    int len);
+
+
+// Extensions.
+//
+// X.509 certificates and CRLs may contain a list of extensions (RFC 5280).
+// Extensions have a type, specified by an object identifier (|ASN1_OBJECT|) and
+// a byte string value, which should a DER-encoded structure whose type is
+// determined by the extension type. This library represents extensions with the
+// |X509_EXTENSION| type.
+
+// X509_EXTENSION is an |ASN1_ITEM| whose ASN.1 type is X.509 Extension (RFC
+// 5280) and C type is |X509_EXTENSION*|.
+DECLARE_ASN1_ITEM(X509_EXTENSION)
+
+// X509_EXTENSION_new returns a newly-allocated, empty |X509_EXTENSION| object
+// or NULL on error.
+OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_new(void);
+
+// X509_EXTENSION_free releases memory associated with |ex|.
+OPENSSL_EXPORT void X509_EXTENSION_free(X509_EXTENSION *ex);
+
+// d2i_X509_EXTENSION parses up to |len| bytes from |*inp| as a DER-encoded
+// X.509 Extension (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **out,
+                                                  const uint8_t **inp,
+                                                  long len);
+
+// i2d_X509_EXTENSION marshals |alg| as a DER-encoded X.509 Extension (RFC
+// 5280), as described in |i2d_SAMPLE|.
+OPENSSL_EXPORT int i2d_X509_EXTENSION(const X509_EXTENSION *alg,
+                                      uint8_t **outp);
+
+// X509_EXTENSION_dup returns a newly-allocated copy of |ex|, or NULL on error.
+// This function works by serializing the structure, so if |ex| is incomplete,
+// it may fail.
+OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_dup(const X509_EXTENSION *ex);
+
+// X509_EXTENSION_create_by_NID creates a new |X509_EXTENSION| with type |nid|,
+// value |data|, and critical bit |crit|. It returns an |X509_EXTENSION| on
+// success, and NULL on error. |nid| should be a |NID_*| constant.
+//
+// If |ex| and |*ex| are both non-NULL, |*ex| is used to hold the result,
+// otherwise a new object is allocated. If |ex| is non-NULL and |*ex| is NULL,
+// the function sets |*ex| to point to the newly allocated result, in addition
+// to returning the result.
+OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_NID(
+    X509_EXTENSION **ex, int nid, int crit, const ASN1_OCTET_STRING *data);
+
+// X509_EXTENSION_create_by_OBJ behaves like |X509_EXTENSION_create_by_NID|, but
+// the extension type is determined by an |ASN1_OBJECT|.
+OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_OBJ(
+    X509_EXTENSION **ex, const ASN1_OBJECT *obj, int crit,
+    const ASN1_OCTET_STRING *data);
+
+// X509_EXTENSION_get_object returns |ex|'s extension type. This function
+// returns a non-const pointer for OpenSSL compatibility, but callers should not
+// mutate the result.
+OPENSSL_EXPORT ASN1_OBJECT *X509_EXTENSION_get_object(const X509_EXTENSION *ex);
+
+// X509_EXTENSION_get_data returns |ne|'s extension value. This function returns
+// a non-const pointer for OpenSSL compatibility, but callers should not mutate
+// the result.
+OPENSSL_EXPORT ASN1_OCTET_STRING *X509_EXTENSION_get_data(
+    const X509_EXTENSION *ne);
+
+// X509_EXTENSION_get_critical returns one if |ex| is critical and zero
+// otherwise.
+OPENSSL_EXPORT int X509_EXTENSION_get_critical(const X509_EXTENSION *ex);
+
+// X509_EXTENSION_set_object sets |ex|'s extension type to |obj|. It returns one
+// on success and zero on error.
+OPENSSL_EXPORT int X509_EXTENSION_set_object(X509_EXTENSION *ex,
+                                             const ASN1_OBJECT *obj);
+
+// X509_EXTENSION_set_critical sets |ex| to critical if |crit| is non-zero and
+// to non-critical if |crit| is zero.
+OPENSSL_EXPORT int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
+
+// X509_EXTENSION_set_data set's |ex|'s extension value to a copy of |data|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int X509_EXTENSION_set_data(X509_EXTENSION *ex,
+                                           const ASN1_OCTET_STRING *data);
+
+
+// Extension lists.
+//
+// The following functions manipulate lists of extensions. Most of them have
+// corresponding functions on the containing |X509|, |X509_CRL|, or
+// |X509_REVOKED|.
+
+DEFINE_STACK_OF(X509_EXTENSION)
+typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;
+
+// X509_EXTENSIONS is an |ASN1_ITEM| whose ASN.1 type is SEQUENCE of Extension
+// (RFC 5280) and C type is |STACK_OF(X509_EXTENSION)*|.
+DECLARE_ASN1_ITEM(X509_EXTENSIONS)
+
+// d2i_X509_EXTENSIONS parses up to |len| bytes from |*inp| as a DER-encoded
+// SEQUENCE OF Extension (RFC 5280), as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_EXTENSIONS *d2i_X509_EXTENSIONS(X509_EXTENSIONS **out,
+                                                    const uint8_t **inp,
+                                                    long len);
+
+// i2d_X509_EXTENSIONS marshals |alg| as a DER-encoded SEQUENCE OF Extension
+// (RFC 5280), as described in |i2d_SAMPLE|.
+OPENSSL_EXPORT int i2d_X509_EXTENSIONS(const X509_EXTENSIONS *alg,
+                                       uint8_t **outp);
+
+// X509v3_get_ext_count returns the number of extensions in |x|.
+OPENSSL_EXPORT int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
+
+// X509v3_get_ext_by_NID returns the index of the first extension in |x| with
+// type |nid|, or a negative number if not found. If found, callers can use
+// |X509v3_get_ext| to look up the extension by index.
+//
+// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
+// can thus loop over all matching extensions by first passing -1 and then
+// passing the previously-returned value until no match is returned.
+OPENSSL_EXPORT int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
+                                         int nid, int lastpos);
+
+// X509v3_get_ext_by_OBJ behaves like |X509v3_get_ext_by_NID| but looks for
+// extensions matching |obj|.
+OPENSSL_EXPORT int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
+                                         const ASN1_OBJECT *obj, int lastpos);
+
+// X509v3_get_ext_by_critical returns the index of the first extension in |x|
+// whose critical bit matches |crit|, or a negative number if no such extension
+// was found.
+//
+// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
+// can thus loop over all matching extensions by first passing -1 and then
+// passing the previously-returned value until no match is returned.
+OPENSSL_EXPORT int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
+                                              int crit, int lastpos);
+
+// X509v3_get_ext returns the extension in |x| at index |loc|, or NULL if |loc|
+// is out of bounds. This function returns a non-const pointer for OpenSSL
+// compatibility, but callers should not mutate the result.
+OPENSSL_EXPORT X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x,
+                                              int loc);
+
+// X509v3_delete_ext removes the extension in |x| at index |loc| and returns the
+// removed extension, or NULL if |loc| was out of bounds. If an extension was
+// returned, the caller must release it with |X509_EXTENSION_free|.
+OPENSSL_EXPORT X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x,
+                                                 int loc);
+
+// X509v3_add_ext adds a copy of |ex| to the extension list in |*x|. If |*x| is
+// NULL, it allocates a new |STACK_OF(X509_EXTENSION)| to hold the copy and sets
+// |*x| to the new list. It returns |*x| on success and NULL on error. The
+// caller retains ownership of |ex| and can release it independently of |*x|.
+//
+// The new extension is inserted at index |loc|, shifting extensions to the
+// right. If |loc| is -1 or out of bounds, the new extension is appended to the
+// list.
+OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509v3_add_ext(
+    STACK_OF(X509_EXTENSION) **x, const X509_EXTENSION *ex, int loc);
+
+
+// Algorithm identifiers.
+//
+// An |X509_ALGOR| represents an AlgorithmIdentifier structure, used in X.509
+// to represent signature algorithms and public key algorithms.
+
+DEFINE_STACK_OF(X509_ALGOR)
+
+// X509_ALGOR is an |ASN1_ITEM| whose ASN.1 type is AlgorithmIdentifier and C
+// type is |X509_ALGOR*|.
+DECLARE_ASN1_ITEM(X509_ALGOR)
+
+// X509_ALGOR_new returns a newly-allocated, empty |X509_ALGOR| object, or NULL
+// on error.
+OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_new(void);
+
+// X509_ALGOR_dup returns a newly-allocated copy of |alg|, or NULL on error.
+// This function works by serializing the structure, so if |alg| is incomplete,
+// it may fail.
+OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_dup(const X509_ALGOR *alg);
+
+// X509_ALGOR_free releases memory associated with |alg|.
+OPENSSL_EXPORT void X509_ALGOR_free(X509_ALGOR *alg);
+
+// d2i_X509_ALGOR parses up to |len| bytes from |*inp| as a DER-encoded
+// AlgorithmIdentifier, as described in |d2i_SAMPLE_with_reuse|.
+OPENSSL_EXPORT X509_ALGOR *d2i_X509_ALGOR(X509_ALGOR **out, const uint8_t **inp,
+                                          long len);
+
+// i2d_X509_ALGOR marshals |alg| as a DER-encoded AlgorithmIdentifier, as
+// described in |i2d_SAMPLE|.
+OPENSSL_EXPORT int i2d_X509_ALGOR(const X509_ALGOR *alg, uint8_t **outp);
+
+// X509_ALGOR_set0 sets |alg| to an AlgorithmIdentifier with algorithm |obj| and
+// parameter determined by |param_type| and |param_value|. It returns one on
+// success and zero on error. This function takes ownership of |obj| and
+// |param_value| on success.
+//
+// If |param_type| is |V_ASN1_UNDEF|, the parameter is omitted. If |param_type|
+// is zero, the parameter is left unchanged. Otherwise, |param_type| and
+// |param_value| are interpreted as in |ASN1_TYPE_set|.
+//
+// Note omitting the parameter (|V_ASN1_UNDEF|) and encoding an explicit NULL
+// value (|V_ASN1_NULL|) are different. Some algorithms require one and some the
+// other. Consult the relevant specification before calling this function. The
+// correct parameter for an RSASSA-PKCS1-v1_5 signature is |V_ASN1_NULL|. The
+// correct one for an ECDSA or Ed25519 signature is |V_ASN1_UNDEF|.
+OPENSSL_EXPORT int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *obj,
+                                   int param_type, void *param_value);
+
+// X509_ALGOR_get0 sets |*out_obj| to the |alg|'s algorithm. If |alg|'s
+// parameter is omitted, it sets |*out_param_type| and |*out_param_value| to
+// |V_ASN1_UNDEF| and NULL. Otherwise, it sets |*out_param_type| and
+// |*out_param_value| to the parameter, using the same representation as
+// |ASN1_TYPE_set0|. See |ASN1_TYPE_set0| and |ASN1_TYPE| for details.
+//
+// Callers that require the parameter in serialized form should, after checking
+// for |V_ASN1_UNDEF|, use |ASN1_TYPE_set1| and |d2i_ASN1_TYPE|, rather than
+// inspecting |*out_param_value|.
+//
+// Each of |out_obj|, |out_param_type|, and |out_param_value| may be NULL to
+// ignore the output. If |out_param_type| is NULL, |out_param_value| is ignored.
+//
+// WARNING: If |*out_param_type| is set to |V_ASN1_UNDEF|, OpenSSL and older
+// revisions of BoringSSL leave |*out_param_value| unset rather than setting it
+// to NULL. Callers that support both OpenSSL and BoringSSL should not assume
+// |*out_param_value| is uniformly initialized.
+OPENSSL_EXPORT void X509_ALGOR_get0(const ASN1_OBJECT **out_obj,
+                                    int *out_param_type,
+                                    const void **out_param_value,
+                                    const X509_ALGOR *alg);
+
+// X509_ALGOR_set_md sets |alg| to the hash function |md|. Note this
+// AlgorithmIdentifier represents the hash function itself, not a signature
+// algorithm that uses |md|.
+OPENSSL_EXPORT void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
+
+// X509_ALGOR_cmp returns zero if |a| and |b| are equal, and some non-zero value
+// otherwise. Note this function can only be used for equality checks, not an
+// ordering.
+OPENSSL_EXPORT int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
+
+
+// Printing functions.
+//
+// The following functions output human-readable representations of
+// X.509-related structures. They should only be used for debugging or logging
+// and not parsed programmatically.
+
+// X509_signature_dump writes a human-readable representation of |sig| to |bio|,
+// indented with |indent| spaces. It returns one on success and zero on error.
+OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig,
+                                       int indent);
+
+// X509_signature_print writes a human-readable representation of |alg| and
+// |sig| to |bio|. It returns one on success and zero on error.
+OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg,
+                                        const ASN1_STRING *sig);
+
+
+// Convenience functions.
+
+// X509_pubkey_digest hashes the contents of the BIT STRING in |x509|'s
+// subjectPublicKeyInfo field with |md| and writes the result to |out|.
+// |EVP_MD_CTX_size| bytes are written, which is at most |EVP_MAX_MD_SIZE|. If
+// |out_len| is not NULL, |*out_len| is set to the number of bytes written. This
+// function returns one on success and zero on error.
+//
+// This hash omits the BIT STRING tag, length, and number of unused bits. It
+// also omits the AlgorithmIdentifier which describes the key type. It
+// corresponds to the OCSP KeyHash definition and is not suitable for other
+// purposes.
+OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md,
+                                      uint8_t *out, unsigned *out_len);
+
+// X509_digest hashes |x509|'s DER encoding with |md| and writes the result to
+// |out|. |EVP_MD_CTX_size| bytes are written, which is at most
+// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
+// of bytes written. This function returns one on success and zero on error.
+// Note this digest covers the entire certificate, not just the signed portion.
+OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out,
+                               unsigned *out_len);
+
+// X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result
+// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
+// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
+// of bytes written. This function returns one on success and zero on error.
+// Note this digest covers the entire CRL, not just the signed portion.
+OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md,
+                                   uint8_t *out, unsigned *out_len);
+
+// X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result
+// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
+// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
+// of bytes written. This function returns one on success and zero on error.
+// Note this digest covers the entire certificate request, not just the signed
+// portion.
+OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md,
+                                   uint8_t *out, unsigned *out_len);
+
+// X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result
+// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
+// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
+// of bytes written. This function returns one on success and zero on error.
+OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md,
+                                    uint8_t *out, unsigned *out_len);
+
+// The following functions behave like the corresponding unsuffixed |d2i_*|
+// functions, but read the result from |bp| instead. Callers using these
+// functions with memory |BIO|s to parse structures already in memory should use
+// |d2i_*| instead.
+OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509);
+OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl);
+OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req);
+OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa);
+OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa);
+OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa);
+OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
+OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
+OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
+OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
+OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8);
+OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(
+    BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf);
+OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
+OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh);
+
+// d2i_PrivateKey_bio behaves like |d2i_AutoPrivateKey|, but reads from |bp|
+// instead.
+OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
+
+// The following functions behave like the corresponding unsuffixed |i2d_*|
+// functions, but write the result to |bp|. They return one on success and zero
+// on error. Callers using them with memory |BIO|s to encode structures to
+// memory should use |i2d_*| directly instead.
+OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509);
+OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl);
+OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req);
+OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa);
+OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa);
+OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa);
+OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
+OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
+OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
+OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
+OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8);
+OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
+                                               PKCS8_PRIV_KEY_INFO *p8inf);
+OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
+OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
+OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh);
+
+// i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo
+// structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It
+// returns one on success and zero on error.
+OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
+
+// The following functions behave like the corresponding |d2i_*_bio| functions,
+// but read from |fp| instead.
+OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509);
+OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl);
+OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req);
+OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa);
+OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa);
+OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa);
+OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
+OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
+OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
+OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
+OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8);
+OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(
+    FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf);
+OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
+OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
+
+// The following functions behave like the corresponding |i2d_*_bio| functions,
+// but write to |fp| instead.
+OPENSSL_EXPORT int i2d_X509_fp(FILE *fp, X509 *x509);
+OPENSSL_EXPORT int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl);
+OPENSSL_EXPORT int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req);
+OPENSSL_EXPORT int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa);
+OPENSSL_EXPORT int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa);
+OPENSSL_EXPORT int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa);
+OPENSSL_EXPORT int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa);
+OPENSSL_EXPORT int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa);
+OPENSSL_EXPORT int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey);
+OPENSSL_EXPORT int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey);
+OPENSSL_EXPORT int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8);
+OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
+                                              PKCS8_PRIV_KEY_INFO *p8inf);
+OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key);
+OPENSSL_EXPORT int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey);
+OPENSSL_EXPORT int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey);
+
+// X509_find_by_issuer_and_serial returns the first |X509| in |sk| whose issuer
+// and serial are |name| and |serial|, respectively. If no match is found, it
+// returns NULL.
+OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk,
+                                                    X509_NAME *name,
+                                                    const ASN1_INTEGER *serial);
+
+// X509_find_by_subject returns the first |X509| in |sk| whose subject is
+// |name|. If no match is found, it returns NULL.
+OPENSSL_EXPORT X509 *X509_find_by_subject(const STACK_OF(X509) *sk,
+                                          X509_NAME *name);
+
+
+// ex_data functions.
+//
+// See |ex_data.h| for details.
+
+OPENSSL_EXPORT int X509_get_ex_new_index(long argl, void *argp,
+                                         CRYPTO_EX_unused *unused,
+                                         CRYPTO_EX_dup *dup_unused,
+                                         CRYPTO_EX_free *free_func);
+OPENSSL_EXPORT int X509_set_ex_data(X509 *r, int idx, void *arg);
+OPENSSL_EXPORT void *X509_get_ex_data(X509 *r, int idx);
+
+OPENSSL_EXPORT int X509_STORE_CTX_get_ex_new_index(long argl, void *argp,
+                                                   CRYPTO_EX_unused *unused,
+                                                   CRYPTO_EX_dup *dup_unused,
+                                                   CRYPTO_EX_free *free_func);
+OPENSSL_EXPORT int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx,
+                                              void *data);
+OPENSSL_EXPORT void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx);
+
+
+// Deprecated functions.
+
+// X509_get_notBefore returns |x509|'s notBefore time. Note this function is not
+// const-correct for legacy reasons. Use |X509_get0_notBefore| or
+// |X509_getm_notBefore| instead.
+OPENSSL_EXPORT ASN1_TIME *X509_get_notBefore(const X509 *x509);
+
+// X509_get_notAfter returns |x509|'s notAfter time. Note this function is not
+// const-correct for legacy reasons. Use |X509_get0_notAfter| or
+// |X509_getm_notAfter| instead.
+OPENSSL_EXPORT ASN1_TIME *X509_get_notAfter(const X509 *x509);
+
+// X509_set_notBefore calls |X509_set1_notBefore|. Use |X509_set1_notBefore|
+// instead.
+OPENSSL_EXPORT int X509_set_notBefore(X509 *x509, const ASN1_TIME *tm);
+
+// X509_set_notAfter calls |X509_set1_notAfter|. Use |X509_set1_notAfter|
+// instead.
+OPENSSL_EXPORT int X509_set_notAfter(X509 *x509, const ASN1_TIME *tm);
+
+// X509_CRL_get_lastUpdate returns a mutable pointer to |crl|'s thisUpdate time.
+// The OpenSSL API refers to this field as lastUpdate.
+//
+// Use |X509_CRL_get0_lastUpdate| or |X509_CRL_set1_lastUpdate| instead.
+OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl);
+
+// X509_CRL_get_nextUpdate returns a mutable pointer to |crl|'s nextUpdate time,
+// or NULL if |crl| has none. Use |X509_CRL_get0_nextUpdate| or
+// |X509_CRL_set1_nextUpdate| instead.
+OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl);
+
+// X509_extract_key is a legacy alias to |X509_get_pubkey|. Use
+// |X509_get_pubkey| instead.
+#define X509_extract_key(x) X509_get_pubkey(x)
+
+// X509_REQ_extract_key is a legacy alias for |X509_REQ_get_pubkey|.
+#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a)
+
+// X509_name_cmp is a legacy alias for |X509_NAME_cmp|.
+#define X509_name_cmp(a, b) X509_NAME_cmp((a), (b))
+
+// The following symbols are deprecated aliases to |X509_CRL_set1_*|.
+#define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate
+#define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate
+
+// X509_get_serialNumber returns a mutable pointer to |x509|'s serial number.
+// Prefer |X509_get0_serialNumber|.
+OPENSSL_EXPORT ASN1_INTEGER *X509_get_serialNumber(X509 *x509);
+
+// X509_NAME_get_text_by_OBJ finds the first attribute with type |obj| in
+// |name|. If found, it ignores the value's ASN.1 type, writes the raw
+// |ASN1_STRING| representation to |buf|, followed by a NUL byte, and
+// returns the number of bytes in output, excluding the NUL byte.
+//
+// This function writes at most |len| bytes, including the NUL byte. If |len| is
+// not large enough, it silently truncates the output to fit. If |buf| is NULL,
+// it instead writes enough and returns the number of bytes in the output,
+// excluding the NUL byte.
+//
+// WARNING: Do not use this function. It does not return enough information for
+// the caller to correctly interpret its output. The attribute value may be of
+// any type, including one of several ASN.1 string encodings, but this function
+// only outputs the raw |ASN1_STRING| representation. See
+// https://crbug.com/boringssl/436.
+OPENSSL_EXPORT int X509_NAME_get_text_by_OBJ(const X509_NAME *name,
+                                             const ASN1_OBJECT *obj, char *buf,
+                                             int len);
+
+// X509_NAME_get_text_by_NID behaves like |X509_NAME_get_text_by_OBJ| except it
+// finds an attribute of type |nid|, which should be one of the |NID_*|
+// constants.
+OPENSSL_EXPORT int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid,
+                                             char *buf, int len);
+
+
+// Private structures.
+
+struct X509_algor_st {
+  ASN1_OBJECT *algorithm;
+  ASN1_TYPE *parameter;
+} /* X509_ALGOR */;
+
+
+// Functions below this point have not yet been organized into sections.
+
 #define X509_FILETYPE_PEM 1
 #define X509_FILETYPE_ASN1 2
 #define X509_FILETYPE_DEFAULT 3
@@ -110,25 +1577,6 @@
 #define X509v3_KU_DECIPHER_ONLY 0x8000
 #define X509v3_KU_UNDEF 0xffff
 
-struct X509_algor_st {
-  ASN1_OBJECT *algorithm;
-  ASN1_TYPE *parameter;
-} /* X509_ALGOR */;
-
-DECLARE_ASN1_FUNCTIONS(X509_ALGOR)
-
-DEFINE_STACK_OF(X509_ALGOR)
-
-typedef STACK_OF(X509_ALGOR) X509_ALGORS;
-
-DEFINE_STACK_OF(X509_NAME_ENTRY)
-
-DEFINE_STACK_OF(X509_NAME)
-
-typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;
-
-DEFINE_STACK_OF(X509_EXTENSION)
-
 DEFINE_STACK_OF(X509_ATTRIBUTE)
 
 // This stuff is certificate "auxiliary info"
@@ -139,8 +1587,6 @@
 DECLARE_STACK_OF(DIST_POINT)
 DECLARE_STACK_OF(GENERAL_NAME)
 
-DEFINE_STACK_OF(X509)
-
 // This is used for a table of trust checking functions
 
 struct x509_trust_st {
@@ -199,7 +1645,8 @@
 #define X509_FLAG_NO_ATTRIBUTES (1L << 11)
 #define X509_FLAG_NO_IDS (1L << 12)
 
-// Flags specific to X509_NAME_print_ex()
+// Flags specific to X509_NAME_print_ex(). These flags must not collide with
+// |ASN1_STRFLGS_*|.
 
 // The field separator information
 
@@ -249,23 +1696,10 @@
   (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | XN_FLAG_SEP_MULTILINE | \
    XN_FLAG_SPC_EQ | XN_FLAG_FN_LN | XN_FLAG_FN_ALIGN)
 
-struct x509_revoked_st {
-  ASN1_INTEGER *serialNumber;
-  ASN1_TIME *revocationDate;
-  STACK_OF(X509_EXTENSION) /* optional */ *extensions;
-  // Set up if indirect CRL
-  STACK_OF(GENERAL_NAME) *issuer;
-  // Revocation reason
-  int reason;
-  int sequence;  // load sequence
-};
-
 DEFINE_STACK_OF(X509_REVOKED)
 
 DECLARE_STACK_OF(GENERAL_NAMES)
 
-DEFINE_STACK_OF(X509_CRL)
-
 struct private_key_st {
   int version;
   // The PKCS#8 data types
@@ -311,90 +1745,6 @@
   ASN1_BIT_STRING *signature;
 } /* NETSCAPE_SPKI */;
 
-// TODO(davidben): Document remaining functions, reorganize them, and define
-// supported patterns for using |X509| objects in general. In particular, when
-// it is safe to call mutating functions is a little tricky due to various
-// internal caches.
-
-// X509_VERSION_* are X.509 version numbers. Note the numerical values of all
-// defined X.509 versions are one less than the named version.
-#define X509_VERSION_1 0
-#define X509_VERSION_2 1
-#define X509_VERSION_3 2
-
-// X509_get_version returns the numerical value of |x509|'s version. Callers may
-// compare the result to the |X509_VERSION_*| constants. Unknown versions are
-// rejected by the parser, but a manually-created |X509| object may encode
-// invalid versions. In that case, the function will return the invalid version,
-// or -1 on overflow.
-OPENSSL_EXPORT long X509_get_version(const X509 *x509);
-
-// X509_set_version sets |x509|'s version to |version|, which should be one of
-// the |X509V_VERSION_*| constants. It returns one on success and zero on error.
-//
-// If unsure, use |X509_VERSION_3|.
-OPENSSL_EXPORT int X509_set_version(X509 *x509, long version);
-
-// X509_get0_serialNumber returns |x509|'s serial number.
-OPENSSL_EXPORT const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509);
-
-// X509_set_serialNumber sets |x509|'s serial number to |serial|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_set_serialNumber(X509 *x509,
-                                         const ASN1_INTEGER *serial);
-
-// X509_get0_notBefore returns |x509|'s notBefore time.
-OPENSSL_EXPORT const ASN1_TIME *X509_get0_notBefore(const X509 *x509);
-
-// X509_get0_notAfter returns |x509|'s notAfter time.
-OPENSSL_EXPORT const ASN1_TIME *X509_get0_notAfter(const X509 *x509);
-
-// X509_set1_notBefore sets |x509|'s notBefore time to |tm|. It returns one on
-// success and zero on error.
-OPENSSL_EXPORT int X509_set1_notBefore(X509 *x509, const ASN1_TIME *tm);
-
-// X509_set1_notAfter sets |x509|'s notAfter time to |tm|. it returns one on
-// success and zero on error.
-OPENSSL_EXPORT int X509_set1_notAfter(X509 *x509, const ASN1_TIME *tm);
-
-// X509_getm_notBefore returns a mutable pointer to |x509|'s notBefore time.
-OPENSSL_EXPORT ASN1_TIME *X509_getm_notBefore(X509 *x509);
-
-// X509_getm_notAfter returns a mutable pointer to |x509|'s notAfter time.
-OPENSSL_EXPORT ASN1_TIME *X509_getm_notAfter(X509 *x);
-
-// X509_get_notBefore returns |x509|'s notBefore time. Note this function is not
-// const-correct for legacy reasons. Use |X509_get0_notBefore| or
-// |X509_getm_notBefore| instead.
-OPENSSL_EXPORT ASN1_TIME *X509_get_notBefore(const X509 *x509);
-
-// X509_get_notAfter returns |x509|'s notAfter time. Note this function is not
-// const-correct for legacy reasons. Use |X509_get0_notAfter| or
-// |X509_getm_notAfter| instead.
-OPENSSL_EXPORT ASN1_TIME *X509_get_notAfter(const X509 *x509);
-
-// X509_set_notBefore calls |X509_set1_notBefore|. Use |X509_set1_notBefore|
-// instead.
-OPENSSL_EXPORT int X509_set_notBefore(X509 *x509, const ASN1_TIME *tm);
-
-// X509_set_notAfter calls |X509_set1_notAfter|. Use |X509_set1_notAfter|
-// instead.
-OPENSSL_EXPORT int X509_set_notAfter(X509 *x509, const ASN1_TIME *tm);
-
-// X509_get0_uids sets |*out_issuer_uid| to a non-owning pointer to the
-// issuerUID field of |x509|, or NULL if |x509| has no issuerUID. It similarly
-// outputs |x509|'s subjectUID field to |*out_subject_uid|.
-//
-// Callers may pass NULL to either |out_issuer_uid| or |out_subject_uid| to
-// ignore the corresponding field.
-OPENSSL_EXPORT void X509_get0_uids(const X509 *x509,
-                                   const ASN1_BIT_STRING **out_issuer_uid,
-                                   const ASN1_BIT_STRING **out_subject_uid);
-
-// X509_extract_key is a legacy alias to |X509_get_pubkey|. Use
-// |X509_get_pubkey| instead.
-#define X509_extract_key(x) X509_get_pubkey(x)
-
 // X509_get_pathlen returns path length constraint from the basic constraints
 // extension in |x509|. (See RFC 5280, section 4.2.1.9.) It returns -1 if the
 // constraint is not present, or if some extension in |x509| was invalid.
@@ -404,82 +1754,6 @@
 // |EXFLAG_INVALID| bit.
 OPENSSL_EXPORT long X509_get_pathlen(X509 *x509);
 
-// X509_REQ_VERSION_1 is the version constant for |X509_REQ| objects. Note no
-// other versions are defined.
-#define X509_REQ_VERSION_1 0
-
-// X509_REQ_get_version returns the numerical value of |req|'s version. This
-// will be |X509_REQ_VERSION_1| for valid certificate requests. If |req| is
-// invalid, it may return another value, or -1 on overflow.
-//
-// TODO(davidben): Enforce the version number in the parser.
-OPENSSL_EXPORT long X509_REQ_get_version(const X509_REQ *req);
-
-// X509_REQ_get_subject_name returns |req|'s subject name. Note this function is
-// not const-correct for legacy reasons.
-OPENSSL_EXPORT X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req);
-
-// X509_REQ_extract_key is a legacy alias for |X509_REQ_get_pubkey|.
-#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a)
-
-// X509_name_cmp is a legacy alias for |X509_NAME_cmp|.
-#define X509_name_cmp(a, b) X509_NAME_cmp((a), (b))
-
-#define X509_CRL_VERSION_1 0
-#define X509_CRL_VERSION_2 1
-
-// X509_CRL_get_version returns the numerical value of |crl|'s version. Callers
-// may compare the result to |X509_CRL_VERSION_*| constants. If |crl| is
-// invalid, it may return another value, or -1 on overflow.
-//
-// TODO(davidben): Enforce the version number in the parser.
-OPENSSL_EXPORT long X509_CRL_get_version(const X509_CRL *crl);
-
-// X509_CRL_get0_lastUpdate returns |crl|'s lastUpdate time.
-OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl);
-
-// X509_CRL_get0_nextUpdate returns |crl|'s nextUpdate time, or NULL if |crl|
-// has none.
-OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl);
-
-// X509_CRL_set1_lastUpdate sets |crl|'s lastUpdate time to |tm|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_CRL_set1_lastUpdate(X509_CRL *crl, const ASN1_TIME *tm);
-
-// X509_CRL_set1_nextUpdate sets |crl|'s nextUpdate time to |tm|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_CRL_set1_nextUpdate(X509_CRL *crl, const ASN1_TIME *tm);
-
-// The following symbols are deprecated aliases to |X509_CRL_set1_*|.
-#define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate
-#define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate
-
-// X509_CRL_get_lastUpdate returns a mutable pointer to |crl|'s lastUpdate time.
-// Use |X509_CRL_get0_lastUpdate| or |X509_CRL_set1_lastUpdate| instead.
-OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl);
-
-// X509_CRL_get_nextUpdate returns a mutable pointer to |crl|'s nextUpdate time,
-// or NULL if |crl| has none. Use |X509_CRL_get0_nextUpdate| or
-// |X509_CRL_set1_nextUpdate| instead.
-OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl);
-
-// X509_CRL_get_issuer returns |crl|'s issuer name. Note this function is not
-// const-correct for legacy reasons.
-OPENSSL_EXPORT X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl);
-
-// X509_CRL_get_REVOKED returns the list of revoked certificates in |crl|, or
-// NULL if |crl| omits it.
-//
-// TOOD(davidben): This function was originally a macro, without clear const
-// semantics. It should take a const input and give const output, but the latter
-// would break existing callers. For now, we match upstream.
-OPENSSL_EXPORT STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl);
-
-// X509_CRL_get0_extensions returns |crl|'s extension list, or NULL if |crl|
-// omits it.
-OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(
-    const X509_CRL *crl);
-
 // X509_SIG_get0 sets |*out_alg| and |*out_digest| to non-owning pointers to
 // |sig|'s algorithm and digest fields, respectively. Either |out_alg| and
 // |out_digest| may be NULL to skip those fields.
@@ -491,22 +1765,6 @@
 OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg,
                                   ASN1_OCTET_STRING **out_digest);
 
-OPENSSL_EXPORT void X509_CRL_set_default_method(const X509_CRL_METHOD *meth);
-OPENSSL_EXPORT X509_CRL_METHOD *X509_CRL_METHOD_new(
-    int (*crl_init)(X509_CRL *crl), int (*crl_free)(X509_CRL *crl),
-    int (*crl_lookup)(X509_CRL *crl, X509_REVOKED **ret, ASN1_INTEGER *ser,
-                      X509_NAME *issuer),
-    int (*crl_verify)(X509_CRL *crl, EVP_PKEY *pk));
-OPENSSL_EXPORT void X509_CRL_METHOD_free(X509_CRL_METHOD *m);
-
-OPENSSL_EXPORT void X509_CRL_set_meth_data(X509_CRL *crl, void *dat);
-OPENSSL_EXPORT void *X509_CRL_get_meth_data(X509_CRL *crl);
-
-// X509_get_X509_PUBKEY returns the public key of |x509|. Note this function is
-// not const-correct for legacy reasons. Callers should not modify the returned
-// object.
-OPENSSL_EXPORT X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509);
-
 // X509_verify_cert_error_string returns |err| as a human-readable string, where
 // |err| should be one of the |X509_V_*| values. If |err| is unknown, it returns
 // a default description.
@@ -555,59 +1813,6 @@
 OPENSSL_EXPORT int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *spki,
                                             EVP_PKEY *pkey);
 
-// X509_signature_dump writes a human-readable representation of |sig| to |bio|,
-// indented with |indent| spaces. It returns one on success and zero on error.
-OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig,
-                                       int indent);
-
-// X509_signature_print writes a human-readable representation of |alg| and
-// |sig| to |bio|. It returns one on success and zero on error.
-OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg,
-                                        const ASN1_STRING *sig);
-
-// X509_sign signs |x509| with |pkey| and replaces the signature algorithm and
-// signature fields. It returns one on success and zero on error. This function
-// uses digest algorithm |md|, or |pkey|'s default if NULL. Other signing
-// parameters use |pkey|'s defaults. To customize them, use |X509_sign_ctx|.
-OPENSSL_EXPORT int X509_sign(X509 *x509, EVP_PKEY *pkey, const EVP_MD *md);
-
-// X509_sign_ctx signs |x509| with |ctx| and replaces the signature algorithm
-// and signature fields. It returns one on success and zero on error. The
-// signature algorithm and parameters come from |ctx|, which must have been
-// initialized with |EVP_DigestSignInit|. The caller should configure the
-// corresponding |EVP_PKEY_CTX| before calling this function.
-OPENSSL_EXPORT int X509_sign_ctx(X509 *x509, EVP_MD_CTX *ctx);
-
-// X509_REQ_sign signs |req| with |pkey| and replaces the signature algorithm
-// and signature fields. It returns one on success and zero on error. This
-// function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
-// signing parameters use |pkey|'s defaults. To customize them, use
-// |X509_REQ_sign_ctx|.
-OPENSSL_EXPORT int X509_REQ_sign(X509_REQ *req, EVP_PKEY *pkey,
-                                 const EVP_MD *md);
-
-// X509_REQ_sign_ctx signs |req| with |ctx| and replaces the signature algorithm
-// and signature fields. It returns one on success and zero on error. The
-// signature algorithm and parameters come from |ctx|, which must have been
-// initialized with |EVP_DigestSignInit|. The caller should configure the
-// corresponding |EVP_PKEY_CTX| before calling this function.
-OPENSSL_EXPORT int X509_REQ_sign_ctx(X509_REQ *req, EVP_MD_CTX *ctx);
-
-// X509_CRL_sign signs |crl| with |pkey| and replaces the signature algorithm
-// and signature fields. It returns one on success and zero on error. This
-// function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
-// signing parameters use |pkey|'s defaults. To customize them, use
-// |X509_CRL_sign_ctx|.
-OPENSSL_EXPORT int X509_CRL_sign(X509_CRL *crl, EVP_PKEY *pkey,
-                                 const EVP_MD *md);
-
-// X509_CRL_sign_ctx signs |crl| with |ctx| and replaces the signature algorithm
-// and signature fields. It returns one on success and zero on error. The
-// signature algorithm and parameters come from |ctx|, which must have been
-// initialized with |EVP_DigestSignInit|. The caller should configure the
-// corresponding |EVP_PKEY_CTX| before calling this function.
-OPENSSL_EXPORT int X509_CRL_sign_ctx(X509_CRL *crl, EVP_MD_CTX *ctx);
-
 // NETSCAPE_SPKI_sign signs |spki| with |pkey| and replaces the signature
 // algorithm and signature fields. It returns one on success and zero on error.
 // This function uses digest algorithm |md|, or |pkey|'s default if NULL. Other
@@ -615,185 +1820,15 @@
 OPENSSL_EXPORT int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *spki, EVP_PKEY *pkey,
                                       const EVP_MD *md);
 
-// X509_pubkey_digest hashes the DER encoding of |x509|'s subjectPublicKeyInfo
-// field with |md| and writes the result to |out|. |EVP_MD_CTX_size| bytes are
-// written, which is at most |EVP_MAX_MD_SIZE|. If |out_len| is not NULL,
-// |*out_len| is set to the number of bytes written. This function returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md,
-                                      uint8_t *out, unsigned *out_len);
+// X509_ATTRIBUTE_dup returns a newly-allocated copy of |xa|, or NULL on error.
+// This function works by serializing the structure, so if |xa| is incomplete,
+// it may fail.
+OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *xa);
 
-// X509_digest hashes |x509|'s DER encoding with |md| and writes the result to
-// |out|. |EVP_MD_CTX_size| bytes are written, which is at most
-// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
-// of bytes written. This function returns one on success and zero on error.
-// Note this digest covers the entire certificate, not just the signed portion.
-OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out,
-                               unsigned *out_len);
-
-// X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result
-// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
-// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
-// of bytes written. This function returns one on success and zero on error.
-// Note this digest covers the entire CRL, not just the signed portion.
-OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md,
-                                   uint8_t *out, unsigned *out_len);
-
-// X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result
-// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
-// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
-// of bytes written. This function returns one on success and zero on error.
-// Note this digest covers the entire certificate request, not just the signed
-// portion.
-OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md,
-                                   uint8_t *out, unsigned *out_len);
-
-// X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result
-// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most
-// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number
-// of bytes written. This function returns one on success and zero on error.
-OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md,
-                                    uint8_t *out, unsigned *out_len);
-
-// X509_parse_from_buffer parses an X.509 structure from |buf| and returns a
-// fresh X509 or NULL on error. There must not be any trailing data in |buf|.
-// The returned structure (if any) holds a reference to |buf| rather than
-// copying parts of it as a normal |d2i_X509| call would do.
-OPENSSL_EXPORT X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf);
-
-OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509);
-OPENSSL_EXPORT int i2d_X509_fp(FILE *fp, X509 *x509);
-OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl);
-OPENSSL_EXPORT int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl);
-OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req);
-OPENSSL_EXPORT int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req);
-OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa);
-OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa);
-OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa);
-#ifndef OPENSSL_NO_DSA
-OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
-OPENSSL_EXPORT int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa);
-OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
-OPENSSL_EXPORT int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa);
-#endif
-OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
-OPENSSL_EXPORT int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey);
-OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
-OPENSSL_EXPORT int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey);
-OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8);
-OPENSSL_EXPORT int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8);
-OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(
-    FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf);
-OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
-                                              PKCS8_PRIV_KEY_INFO *p8inf);
-OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key);
-OPENSSL_EXPORT int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey);
-OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
-OPENSSL_EXPORT int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey);
-OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
-
-OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509);
-OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509);
-OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl);
-OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl);
-OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req);
-OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req);
-OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa);
-OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa);
-OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa);
-OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa);
-#ifndef OPENSSL_NO_DSA
-OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
-OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
-OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
-OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
-#endif
-OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
-OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
-OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
-OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
-OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8);
-OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8);
-OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(
-    BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf);
-OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
-                                               PKCS8_PRIV_KEY_INFO *p8inf);
-OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
-OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
-OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
-OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
-OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
-OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh);
-OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh);
-
-OPENSSL_EXPORT X509 *X509_dup(X509 *x509);
-OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa);
-OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex);
-OPENSSL_EXPORT X509_CRL *X509_CRL_dup(X509_CRL *crl);
-OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev);
-OPENSSL_EXPORT X509_REQ *X509_REQ_dup(X509_REQ *req);
-OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
-
-// X509_ALGOR_set0 sets |alg| to an AlgorithmIdentifier with algorithm |obj| and
-// parameter determined by |param_type| and |param_value|. It returns one on
-// success and zero on error. This function takes ownership of |obj| and
-// |param_value| on success.
-//
-// If |param_type| is |V_ASN1_UNDEF|, the parameter is omitted. If |param_type|
-// is zero, the parameter is left unchanged. Otherwise, |param_type| and
-// |param_value| are interpreted as in |ASN1_TYPE_set|.
-//
-// Note omitting the parameter (|V_ASN1_UNDEF|) and encoding an explicit NULL
-// value (|V_ASN1_NULL|) are different. Some algorithms require one and some the
-// other. Consult the relevant specification before calling this function. The
-// correct parameter for an RSASSA-PKCS1-v1_5 signature is |V_ASN1_NULL|. The
-// correct one for an ECDSA or Ed25519 signature is |V_ASN1_UNDEF|.
-OPENSSL_EXPORT int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *obj,
-                                   int param_type, void *param_value);
-
-// X509_ALGOR_get0 sets |*out_obj| to the |alg|'s algorithm. If |alg|'s
-// parameter is omitted, it sets |*out_param_type| and |*out_param_value| to
-// |V_ASN1_UNDEF| and NULL. Otherwise, it sets |*out_param_type| and
-// |*out_param_value| to the parameter, using the same representation as
-// |ASN1_TYPE_set0|. See |ASN1_TYPE_set0| and |ASN1_TYPE| for details.
-//
-// Callers that require the parameter in serialized form should, after checking
-// for |V_ASN1_UNDEF|, use |ASN1_TYPE_set1| and |d2i_ASN1_TYPE|, rather than
-// inspecting |*out_param_value|.
-//
-// Each of |out_obj|, |out_param_type|, and |out_param_value| may be NULL to
-// ignore the output. If |out_param_type| is NULL, |out_param_value| is ignored.
-//
-// WARNING: If |*out_param_type| is set to |V_ASN1_UNDEF|, OpenSSL and older
-// revisions of BoringSSL leave |*out_param_value| unset rather than setting it
-// to NULL. Callers that support both OpenSSL and BoringSSL should not assume
-// |*out_param_value| is uniformly initialized.
-OPENSSL_EXPORT void X509_ALGOR_get0(const ASN1_OBJECT **out_obj,
-                                    int *out_param_type,
-                                    const void **out_param_value,
-                                    const X509_ALGOR *alg);
-
-// X509_ALGOR_set_md sets |alg| to the hash function |md|. Note this
-// AlgorithmIdentifier represents the hash function itself, not a signature
-// algorithm that uses |md|.
-OPENSSL_EXPORT void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
-
-// X509_ALGOR_cmp returns zero if |a| and |b| are equal, and some non-zero value
-// otherwise. Note this function can only be used for equality checks, not an
-// ordering.
-OPENSSL_EXPORT int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
-
-OPENSSL_EXPORT X509_NAME *X509_NAME_dup(X509_NAME *xn);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);
-OPENSSL_EXPORT int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne);
-
-OPENSSL_EXPORT int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder,
-                                      size_t *pderlen);
+// X509_REVOKED_dup returns a newly-allocated copy of |rev|, or NULL on error.
+// This function works by serializing the structure, so if |rev| is incomplete,
+// it may fail.
+OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev);
 
 // X509_cmp_time compares |s| against |*t|. On success, it returns a negative
 // number if |s| <= |*t| and a positive number if |s| > |*t|. On error, it
@@ -827,12 +1862,7 @@
 OPENSSL_EXPORT const char *X509_get_default_cert_file_env(void);
 OPENSSL_EXPORT const char *X509_get_default_private_dir(void);
 
-OPENSSL_EXPORT X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey,
-                                          const EVP_MD *md);
-
-DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS)
-
-DECLARE_ASN1_FUNCTIONS(X509_PUBKEY)
+DECLARE_ASN1_FUNCTIONS_const(X509_PUBKEY)
 
 // X509_PUBKEY_set serializes |pkey| into a newly-allocated |X509_PUBKEY|
 // structure. On success, it frees |*x|, sets |*x| to the new object, and
@@ -845,10 +1875,9 @@
 // not mutate the result.
 OPENSSL_EXPORT EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key);
 
-DECLARE_ASN1_FUNCTIONS(X509_SIG)
-DECLARE_ASN1_FUNCTIONS(X509_REQ)
+DECLARE_ASN1_FUNCTIONS_const(X509_SIG)
 
-DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE)
+DECLARE_ASN1_FUNCTIONS_const(X509_ATTRIBUTE)
 
 // X509_ATTRIBUTE_create returns a newly-allocated |X509_ATTRIBUTE|, or NULL on
 // error. The attribute has type |nid| and contains a single value determined by
@@ -857,99 +1886,15 @@
 OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype,
                                                      void *value);
 
-DECLARE_ASN1_FUNCTIONS(X509_EXTENSION)
-DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)
-
-DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY)
-
-DECLARE_ASN1_FUNCTIONS(X509_NAME)
-
-// X509_NAME_set makes a copy of |name|. On success, it frees |*xn|, sets |*xn|
-// to the copy, and returns one. Otherwise, it returns zero.
-OPENSSL_EXPORT int X509_NAME_set(X509_NAME **xn, X509_NAME *name);
-
-DECLARE_ASN1_FUNCTIONS(X509)
-DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX)
-
-// X509_up_ref adds one to the reference count of |x509| and returns one.
-OPENSSL_EXPORT int X509_up_ref(X509 *x509);
-
-OPENSSL_EXPORT int X509_get_ex_new_index(long argl, void *argp,
-                                         CRYPTO_EX_unused *unused,
-                                         CRYPTO_EX_dup *dup_unused,
-                                         CRYPTO_EX_free *free_func);
-OPENSSL_EXPORT int X509_set_ex_data(X509 *r, int idx, void *arg);
-OPENSSL_EXPORT void *X509_get_ex_data(X509 *r, int idx);
-OPENSSL_EXPORT int i2d_X509_AUX(X509 *a, unsigned char **pp);
-OPENSSL_EXPORT X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp,
-                                  long length);
-
-// i2d_re_X509_tbs serializes the TBSCertificate portion of |x509|, as described
-// in |i2d_SAMPLE|.
-//
-// This function re-encodes the TBSCertificate and may not reflect |x509|'s
-// original encoding. It may be used to manually generate a signature for a new
-// certificate. To verify certificates, use |i2d_X509_tbs| instead.
-OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, unsigned char **outp);
-
-// i2d_X509_tbs serializes the TBSCertificate portion of |x509|, as described in
-// |i2d_SAMPLE|.
-//
-// This function preserves the original encoding of the TBSCertificate and may
-// not reflect modifications made to |x509|. It may be used to manually verify
-// the signature of an existing certificate. To generate certificates, use
-// |i2d_re_X509_tbs| instead.
-OPENSSL_EXPORT int i2d_X509_tbs(X509 *x509, unsigned char **outp);
-
-// X509_set1_signature_algo sets |x509|'s signature algorithm to |algo| and
-// returns one on success or zero on error. It updates both the signature field
-// of the TBSCertificate structure, and the signatureAlgorithm field of the
-// Certificate.
-OPENSSL_EXPORT int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo);
-
-// X509_set1_signature_value sets |x509|'s signature to a copy of the |sig_len|
-// bytes pointed by |sig|. It returns one on success and zero on error.
-//
-// Due to a specification error, X.509 certificates store signatures in ASN.1
-// BIT STRINGs, but signature algorithms return byte strings rather than bit
-// strings. This function creates a BIT STRING containing a whole number of
-// bytes, with the bit order matching the DER encoding. This matches the
-// encoding used by all X.509 signature algorithms.
-OPENSSL_EXPORT int X509_set1_signature_value(X509 *x509, const uint8_t *sig,
-                                             size_t sig_len);
-
-// X509_get0_signature sets |*out_sig| and |*out_alg| to the signature and
-// signature algorithm of |x509|, respectively. Either output pointer may be
-// NULL to ignore the value.
-//
-// This function outputs the outer signature algorithm. For the one in the
-// TBSCertificate, see |X509_get0_tbs_sigalg|. Certificates with mismatched
-// signature algorithms will successfully parse, but they will be rejected when
-// verifying.
-OPENSSL_EXPORT void X509_get0_signature(const ASN1_BIT_STRING **out_sig,
-                                        const X509_ALGOR **out_alg,
-                                        const X509 *x509);
-
-// X509_get_signature_nid returns the NID corresponding to |x509|'s signature
-// algorithm, or |NID_undef| if the signature algorithm does not correspond to
-// a known NID.
-OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509);
-
-OPENSSL_EXPORT int X509_alias_set1(X509 *x, const unsigned char *name, int len);
-OPENSSL_EXPORT int X509_keyid_set1(X509 *x, const unsigned char *id, int len);
-OPENSSL_EXPORT unsigned char *X509_alias_get0(X509 *x, int *len);
-OPENSSL_EXPORT unsigned char *X509_keyid_get0(X509 *x, int *len);
-OPENSSL_EXPORT int (*X509_TRUST_set_default(int (*trust)(int, X509 *,
-                                                         int)))(int, X509 *,
-                                                                int);
-OPENSSL_EXPORT int X509_TRUST_set(int *t, int trust);
 OPENSSL_EXPORT int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj);
 OPENSSL_EXPORT int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj);
 OPENSSL_EXPORT void X509_trust_clear(X509 *x);
 OPENSSL_EXPORT void X509_reject_clear(X509 *x);
 
-DECLARE_ASN1_FUNCTIONS(X509_REVOKED)
-DECLARE_ASN1_FUNCTIONS(X509_CRL)
+
+OPENSSL_EXPORT int X509_TRUST_set(int *t, int trust);
+
+DECLARE_ASN1_FUNCTIONS_const(X509_REVOKED)
 
 OPENSSL_EXPORT int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
 OPENSSL_EXPORT int X509_CRL_get0_by_serial(X509_CRL *crl, X509_REVOKED **ret,
@@ -960,8 +1905,8 @@
 OPENSSL_EXPORT X509_PKEY *X509_PKEY_new(void);
 OPENSSL_EXPORT void X509_PKEY_free(X509_PKEY *a);
 
-DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI)
-DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
+DECLARE_ASN1_FUNCTIONS_const(NETSCAPE_SPKI)
+DECLARE_ASN1_FUNCTIONS_const(NETSCAPE_SPKAC)
 
 OPENSSL_EXPORT X509_INFO *X509_INFO_new(void);
 OPENSSL_EXPORT void X509_INFO_free(X509_INFO *a);
@@ -988,96 +1933,6 @@
                                       ASN1_BIT_STRING *signature, void *asn,
                                       EVP_MD_CTX *ctx);
 
-// X509_get_serialNumber returns a mutable pointer to |x509|'s serial number.
-// Prefer |X509_get0_serialNumber|.
-OPENSSL_EXPORT ASN1_INTEGER *X509_get_serialNumber(X509 *x509);
-
-// X509_set_issuer_name sets |x509|'s issuer to a copy of |name|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_set_issuer_name(X509 *x509, X509_NAME *name);
-
-// X509_get_issuer_name returns |x509|'s issuer.
-OPENSSL_EXPORT X509_NAME *X509_get_issuer_name(const X509 *x509);
-
-// X509_set_subject_name sets |x509|'s subject to a copy of |name|. It returns
-// one on success and zero on error.
-OPENSSL_EXPORT int X509_set_subject_name(X509 *x509, X509_NAME *name);
-
-// X509_get_issuer_name returns |x509|'s subject.
-OPENSSL_EXPORT X509_NAME *X509_get_subject_name(const X509 *x509);
-
-// X509_set_pubkey sets |x509|'s public key to |pkey|. It returns one on success
-// and zero on error. This function does not take ownership of |pkey| and
-// internally copies and updates reference counts as needed.
-OPENSSL_EXPORT int X509_set_pubkey(X509 *x509, EVP_PKEY *pkey);
-
-// X509_get_pubkey returns |x509|'s public key as an |EVP_PKEY|, or NULL if the
-// public key was unsupported or could not be decoded. This function returns a
-// reference to the |EVP_PKEY|. The caller must release the result with
-// |EVP_PKEY_free| when done.
-OPENSSL_EXPORT EVP_PKEY *X509_get_pubkey(X509 *x509);
-
-// X509_get0_pubkey_bitstr returns the BIT STRING portion of |x509|'s public
-// key. Note this does not contain the AlgorithmIdentifier portion.
-//
-// WARNING: This function returns a non-const pointer for OpenSSL compatibility,
-// but the caller must not modify the resulting object. Doing so will break
-// internal invariants in |x509|.
-OPENSSL_EXPORT ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x509);
-
-// X509_get0_extensions returns |x509|'s extension list, or NULL if |x509| omits
-// it.
-OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_get0_extensions(
-    const X509 *x509);
-
-// X509_get0_tbs_sigalg returns the signature algorithm in |x509|'s
-// TBSCertificate. For the outer signature algorithm, see |X509_get0_signature|.
-//
-// Certificates with mismatched signature algorithms will successfully parse,
-// but they will be rejected when verifying.
-OPENSSL_EXPORT const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x509);
-
-// X509_REQ_set_version sets |req|'s version to |version|, which should be
-// |X509_REQ_VERSION_1|. It returns one on success and zero on error.
-//
-// Note no versions other than |X509_REQ_VERSION_1| are defined for CSRs.
-OPENSSL_EXPORT int X509_REQ_set_version(X509_REQ *req, long version);
-
-// X509_REQ_set_subject_name sets |req|'s subject to a copy of |name|. It
-// returns one on success and zero on error.
-OPENSSL_EXPORT int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name);
-
-// X509_REQ_get0_signature sets |*out_sig| and |*out_alg| to the signature and
-// signature algorithm of |req|, respectively. Either output pointer may be NULL
-// to ignore the value.
-OPENSSL_EXPORT void X509_REQ_get0_signature(const X509_REQ *req,
-                                            const ASN1_BIT_STRING **out_sig,
-                                            const X509_ALGOR **out_alg);
-
-// X509_REQ_get_signature_nid returns the NID corresponding to |req|'s signature
-// algorithm, or |NID_undef| if the signature algorithm does not correspond to
-// a known NID.
-OPENSSL_EXPORT int X509_REQ_get_signature_nid(const X509_REQ *req);
-
-// i2d_re_X509_REQ_tbs serializes the CertificationRequestInfo (see RFC 2986)
-// portion of |req|, as described in |i2d_SAMPLE|.
-//
-// This function re-encodes the CertificationRequestInfo and may not reflect
-// |req|'s original encoding. It may be used to manually generate a signature
-// for a new certificate request.
-OPENSSL_EXPORT int i2d_re_X509_REQ_tbs(X509_REQ *req, uint8_t **outp);
-
-// X509_REQ_set_pubkey sets |req|'s public key to |pkey|. It returns one on
-// success and zero on error. This function does not take ownership of |pkey|
-// and internally copies and updates reference counts as needed.
-OPENSSL_EXPORT int X509_REQ_set_pubkey(X509_REQ *req, EVP_PKEY *pkey);
-
-// X509_REQ_get_pubkey returns |req|'s public key as an |EVP_PKEY|, or NULL if
-// the public key was unsupported or could not be decoded. This function returns
-// a reference to the |EVP_PKEY|. The caller must release the result with
-// |EVP_PKEY_free| when done.
-OPENSSL_EXPORT EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req);
-
 // X509_REQ_extension_nid returns one if |nid| is a supported CSR attribute type
 // for carrying extensions and zero otherwise. The supported types are
 // |NID_ext_req| (pkcs-9-at-extensionRequest from RFC 2985) and |NID_ms_ext_req|
@@ -1165,75 +2020,8 @@
                                              const unsigned char *data,
                                              int len);
 
-// X509_CRL_set_version sets |crl|'s version to |version|, which should be one
-// of the |X509_CRL_VERSION_*| constants. It returns one on success and zero on
-// error.
-//
-// If unsure, use |X509_CRL_VERSION_2|. Note that, unlike certificates, CRL
-// versions are only defined up to v2. Callers should not use |X509_VERSION_3|.
-OPENSSL_EXPORT int X509_CRL_set_version(X509_CRL *crl, long version);
-
-// X509_CRL_set_issuer_name sets |crl|'s issuer to a copy of |name|. It returns
-// one on success and zero on error.
-OPENSSL_EXPORT int X509_CRL_set_issuer_name(X509_CRL *crl, X509_NAME *name);
-
 OPENSSL_EXPORT int X509_CRL_sort(X509_CRL *crl);
 
-// X509_CRL_up_ref adds one to the reference count of |crl| and returns one.
-OPENSSL_EXPORT int X509_CRL_up_ref(X509_CRL *crl);
-
-// X509_CRL_get0_signature sets |*out_sig| and |*out_alg| to the signature and
-// signature algorithm of |crl|, respectively. Either output pointer may be NULL
-// to ignore the value.
-//
-// This function outputs the outer signature algorithm, not the one in the
-// TBSCertList. CRLs with mismatched signature algorithms will successfully
-// parse, but they will be rejected when verifying.
-OPENSSL_EXPORT void X509_CRL_get0_signature(const X509_CRL *crl,
-                                            const ASN1_BIT_STRING **out_sig,
-                                            const X509_ALGOR **out_alg);
-
-// X509_CRL_get_signature_nid returns the NID corresponding to |crl|'s signature
-// algorithm, or |NID_undef| if the signature algorithm does not correspond to
-// a known NID.
-OPENSSL_EXPORT int X509_CRL_get_signature_nid(const X509_CRL *crl);
-
-// i2d_re_X509_CRL_tbs serializes the TBSCertList portion of |crl|, as described
-// in |i2d_SAMPLE|.
-//
-// This function re-encodes the TBSCertList and may not reflect |crl|'s original
-// encoding. It may be used to manually generate a signature for a new CRL. To
-// verify CRLs, use |i2d_X509_CRL_tbs| instead.
-OPENSSL_EXPORT int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp);
-
-// i2d_X509_CRL_tbs serializes the TBSCertList portion of |crl|, as described in
-// |i2d_SAMPLE|.
-//
-// This function preserves the original encoding of the TBSCertList and may not
-// reflect modifications made to |crl|. It may be used to manually verify the
-// signature of an existing CRL. To generate CRLs, use |i2d_re_X509_CRL_tbs|
-// instead.
-OPENSSL_EXPORT int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp);
-
-// X509_CRL_set1_signature_algo sets |crl|'s signature algorithm to |algo| and
-// returns one on success or zero on error. It updates both the signature field
-// of the TBSCertList structure, and the signatureAlgorithm field of the CRL.
-OPENSSL_EXPORT int X509_CRL_set1_signature_algo(X509_CRL *crl,
-                                                const X509_ALGOR *algo);
-
-// X509_CRL_set1_signature_value sets |crl|'s signature to a copy of the
-// |sig_len| bytes pointed by |sig|. It returns one on success and zero on
-// error.
-//
-// Due to a specification error, X.509 CRLs store signatures in ASN.1 BIT
-// STRINGs, but signature algorithms return byte strings rather than bit
-// strings. This function creates a BIT STRING containing a whole number of
-// bytes, with the bit order matching the DER encoding. This matches the
-// encoding used by all X.509 signature algorithms.
-OPENSSL_EXPORT int X509_CRL_set1_signature_value(X509_CRL *crl,
-                                                 const uint8_t *sig,
-                                                 size_t sig_len);
-
 // X509_REVOKED_get0_serialNumber returns the serial number of the certificate
 // revoked by |revoked|.
 OPENSSL_EXPORT const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(
@@ -1266,19 +2054,6 @@
 OPENSSL_EXPORT int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey);
 
 OPENSSL_EXPORT int X509_check_private_key(X509 *x509, const EVP_PKEY *pkey);
-OPENSSL_EXPORT int X509_chain_check_suiteb(int *perror_depth, X509 *x,
-                                           STACK_OF(X509) *chain,
-                                           unsigned long flags);
-OPENSSL_EXPORT int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk,
-                                         unsigned long flags);
-
-// X509_chain_up_ref returns a newly-allocated |STACK_OF(X509)| containing a
-// shallow copy of |chain|, or NULL on error. That is, the return value has the
-// same contents as |chain|, and each |X509|'s reference count is incremented by
-// one.
-OPENSSL_EXPORT STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain);
-
-OPENSSL_EXPORT int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b);
 
 OPENSSL_EXPORT int X509_issuer_name_cmp(const X509 *a, const X509 *b);
 OPENSSL_EXPORT unsigned long X509_issuer_name_hash(X509 *a);
@@ -1310,149 +2085,11 @@
 OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag,
                                  unsigned long cflag);
 OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x);
-OPENSSL_EXPORT int X509_ocspid_print(BIO *bp, X509 *x);
-OPENSSL_EXPORT int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent);
 OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x);
 OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag,
                                      unsigned long cflag);
 OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req);
 
-OPENSSL_EXPORT int X509_NAME_entry_count(const X509_NAME *name);
-OPENSSL_EXPORT int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid,
-                                             char *buf, int len);
-OPENSSL_EXPORT int X509_NAME_get_text_by_OBJ(const X509_NAME *name,
-                                             const ASN1_OBJECT *obj, char *buf,
-                                             int len);
-
-// NOTE: you should be passsing -1, not 0 as lastpos.  The functions that use
-// lastpos, search after that position on.
-OPENSSL_EXPORT int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid,
-                                              int lastpos);
-OPENSSL_EXPORT int X509_NAME_get_index_by_OBJ(const X509_NAME *name,
-                                              const ASN1_OBJECT *obj,
-                                              int lastpos);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name,
-                                                    int loc);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name,
-                                                       int loc);
-OPENSSL_EXPORT int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne,
-                                       int loc, int set);
-OPENSSL_EXPORT int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj,
-                                              int type,
-                                              const unsigned char *bytes,
-                                              int len, int loc, int set);
-OPENSSL_EXPORT int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid,
-                                              int type,
-                                              const unsigned char *bytes,
-                                              int len, int loc, int set);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(
-    X509_NAME_ENTRY **ne, const char *field, int type,
-    const unsigned char *bytes, int len);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(
-    X509_NAME_ENTRY **ne, int nid, int type, const unsigned char *bytes,
-    int len);
-OPENSSL_EXPORT int X509_NAME_add_entry_by_txt(X509_NAME *name,
-                                              const char *field, int type,
-                                              const unsigned char *bytes,
-                                              int len, int loc, int set);
-OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(
-    X509_NAME_ENTRY **ne, const ASN1_OBJECT *obj, int type,
-    const unsigned char *bytes, int len);
-OPENSSL_EXPORT int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne,
-                                              const ASN1_OBJECT *obj);
-OPENSSL_EXPORT int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
-                                            const unsigned char *bytes,
-                                            int len);
-OPENSSL_EXPORT ASN1_OBJECT *X509_NAME_ENTRY_get_object(
-    const X509_NAME_ENTRY *ne);
-OPENSSL_EXPORT ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne);
-
-// X509v3_get_ext_count returns the number of extensions in |x|.
-OPENSSL_EXPORT int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
-
-// X509v3_get_ext_by_NID returns the index of the first extension in |x| with
-// type |nid|, or a negative number if not found. If found, callers can use
-// |X509v3_get_ext| to look up the extension by index.
-//
-// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
-// can thus loop over all matching extensions by first passing -1 and then
-// passing the previously-returned value until no match is returned.
-OPENSSL_EXPORT int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
-                                         int nid, int lastpos);
-
-// X509v3_get_ext_by_OBJ behaves like |X509v3_get_ext_by_NID| but looks for
-// extensions matching |obj|.
-OPENSSL_EXPORT int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
-                                         const ASN1_OBJECT *obj, int lastpos);
-
-// X509v3_get_ext_by_critical returns the index of the first extension in |x|
-// whose critical bit matches |crit|, or a negative number if no such extension
-// was found.
-//
-// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers
-// can thus loop over all matching extensions by first passing -1 and then
-// passing the previously-returned value until no match is returned.
-OPENSSL_EXPORT int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
-                                              int crit, int lastpos);
-
-// X509v3_get_ext returns the extension in |x| at index |loc|, or NULL if |loc|
-// is out of bounds.
-OPENSSL_EXPORT X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x,
-                                              int loc);
-
-// X509v3_delete_ext removes the extension in |x| at index |loc| and returns the
-// removed extension, or NULL if |loc| was out of bounds. If an extension was
-// returned, the caller must release it with |X509_EXTENSION_free|.
-OPENSSL_EXPORT X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x,
-                                                 int loc);
-
-// X509v3_add_ext adds a copy of |ex| to the extension list in |*x|. If |*x| is
-// NULL, it allocates a new |STACK_OF(X509_EXTENSION)| to hold the copy and sets
-// |*x| to the new list. It returns |*x| on success and NULL on error. The
-// caller retains ownership of |ex| and can release it independently of |*x|.
-//
-// The new extension is inserted at index |loc|, shifting extensions to the
-// right. If |loc| is -1 or out of bounds, the new extension is appended to the
-// list.
-OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509v3_add_ext(
-    STACK_OF(X509_EXTENSION) **x, X509_EXTENSION *ex, int loc);
-
-// X509_get_ext_count returns the number of extensions in |x|.
-OPENSSL_EXPORT int X509_get_ext_count(const X509 *x);
-
-// X509_get_ext_by_NID behaves like |X509v3_get_ext_by_NID| but searches for
-// extensions in |x|.
-OPENSSL_EXPORT int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos);
-
-// X509_get_ext_by_OBJ behaves like |X509v3_get_ext_by_OBJ| but searches for
-// extensions in |x|.
-OPENSSL_EXPORT int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj,
-                                       int lastpos);
-
-// X509_get_ext_by_critical behaves like |X509v3_get_ext_by_critical| but
-// searches for extensions in |x|.
-OPENSSL_EXPORT int X509_get_ext_by_critical(const X509 *x, int crit,
-                                            int lastpos);
-
-// X509_get_ext returns the extension in |x| at index |loc|, or NULL if |loc| is
-// out of bounds.
-OPENSSL_EXPORT X509_EXTENSION *X509_get_ext(const X509 *x, int loc);
-
-// X509_delete_ext removes the extension in |x| at index |loc| and returns the
-// removed extension, or NULL if |loc| was out of bounds. If non-NULL, the
-// caller must release the result with |X509_EXTENSION_free|. It is also safe,
-// but not necessary, to call |X509_EXTENSION_free| if the result is NULL.
-OPENSSL_EXPORT X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
-
-// X509_add_ext adds a copy of |ex| to |x|. It returns one on success and zero
-// on failure. The caller retains ownership of |ex| and can release it
-// independently of |x|.
-//
-// The new extension is inserted at index |loc|, shifting extensions to the
-// right. If |loc| is -1 or out of bounds, the new extension is appended to the
-// list.
-OPENSSL_EXPORT int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
-
 // X509_get_ext_d2i behaves like |X509V3_get_d2i| but looks for the extension in
 // |x509|'s extension list.
 //
@@ -1470,43 +2107,6 @@
 OPENSSL_EXPORT int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
                                      unsigned long flags);
 
-// X509_CRL_get_ext_count returns the number of extensions in |x|.
-OPENSSL_EXPORT int X509_CRL_get_ext_count(const X509_CRL *x);
-
-// X509_CRL_get_ext_by_NID behaves like |X509v3_get_ext_by_NID| but searches for
-// extensions in |x|.
-OPENSSL_EXPORT int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid,
-                                           int lastpos);
-
-// X509_CRL_get_ext_by_OBJ behaves like |X509v3_get_ext_by_OBJ| but searches for
-// extensions in |x|.
-OPENSSL_EXPORT int X509_CRL_get_ext_by_OBJ(const X509_CRL *x,
-                                           const ASN1_OBJECT *obj, int lastpos);
-
-// X509_CRL_get_ext_by_critical behaves like |X509v3_get_ext_by_critical| but
-// searches for extensions in |x|.
-OPENSSL_EXPORT int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit,
-                                                int lastpos);
-
-// X509_CRL_get_ext returns the extension in |x| at index |loc|, or NULL if
-// |loc| is out of bounds.
-OPENSSL_EXPORT X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc);
-
-// X509_CRL_delete_ext removes the extension in |x| at index |loc| and returns
-// the removed extension, or NULL if |loc| was out of bounds. If non-NULL, the
-// caller must release the result with |X509_EXTENSION_free|. It is also safe,
-// but not necessary, to call |X509_EXTENSION_free| if the result is NULL.
-OPENSSL_EXPORT X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
-
-// X509_CRL_add_ext adds a copy of |ex| to |x|. It returns one on success and
-// zero on failure. The caller retains ownership of |ex| and can release it
-// independently of |x|.
-//
-// The new extension is inserted at index |loc|, shifting extensions to the
-// right. If |loc| is -1 or out of bounds, the new extension is appended to the
-// list.
-OPENSSL_EXPORT int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc);
-
 // X509_CRL_get_ext_d2i behaves like |X509V3_get_d2i| but looks for the
 // extension in |crl|'s extension list.
 //
@@ -1544,15 +2144,14 @@
                                                     int crit, int lastpos);
 
 // X509_REVOKED_get_ext returns the extension in |x| at index |loc|, or NULL if
-// |loc| is out of bounds.
+// |loc| is out of bounds. This function returns a non-const pointer for OpenSSL
+// compatibility, but callers should not mutate the result.
 OPENSSL_EXPORT X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x,
                                                     int loc);
 
 // X509_REVOKED_delete_ext removes the extension in |x| at index |loc| and
 // returns the removed extension, or NULL if |loc| was out of bounds. If
-// non-NULL, the caller must release the result with |X509_EXTENSION_free|. It
-// is also safe, but not necessary, to call |X509_EXTENSION_free| if the result
-// is NULL.
+// non-NULL, the caller must release the result with |X509_EXTENSION_free|.
 OPENSSL_EXPORT X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x,
                                                        int loc);
 
@@ -1563,8 +2162,8 @@
 // The new extension is inserted at index |loc|, shifting extensions to the
 // right. If |loc| is -1 or out of bounds, the new extension is appended to the
 // list.
-OPENSSL_EXPORT int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex,
-                                        int loc);
+OPENSSL_EXPORT int X509_REVOKED_add_ext(X509_REVOKED *x,
+                                        const X509_EXTENSION *ex, int loc);
 
 // X509_REVOKED_get_ext_d2i behaves like |X509V3_get_d2i| but looks for the
 // extension in |revoked|'s extension list.
@@ -1585,47 +2184,6 @@
                                              void *value, int crit,
                                              unsigned long flags);
 
-// X509_EXTENSION_create_by_NID creates a new |X509_EXTENSION| with type |nid|,
-// value |data|, and critical bit |crit|. It returns the newly-allocated
-// |X509_EXTENSION| on success, and false on error. |nid| should be a |NID_*|
-// constant.
-//
-// If |ex| and |*ex| are both non-NULL, it modifies and returns |*ex| instead of
-// creating a new object. If |ex| is non-NULL, but |*ex| is NULL, it sets |*ex|
-// to the new |X509_EXTENSION|, in addition to returning the result.
-OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_NID(
-    X509_EXTENSION **ex, int nid, int crit, const ASN1_OCTET_STRING *data);
-
-// X509_EXTENSION_create_by_OBJ behaves like |X509_EXTENSION_create_by_NID|, but
-// the extension type is determined by an |ASN1_OBJECT|.
-OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_OBJ(
-    X509_EXTENSION **ex, const ASN1_OBJECT *obj, int crit,
-    const ASN1_OCTET_STRING *data);
-
-// X509_EXTENSION_set_object sets |ex|'s extension type to |obj|. It returns one
-// on success and zero on error.
-OPENSSL_EXPORT int X509_EXTENSION_set_object(X509_EXTENSION *ex,
-                                             const ASN1_OBJECT *obj);
-
-// X509_EXTENSION_set_critical sets |ex| to critical if |crit| is non-zero and
-// to non-critical if |crit| is zero.
-OPENSSL_EXPORT int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
-
-// X509_EXTENSION_set_data set's |ex|'s extension value to a copy of |data|. It
-// returns one on success and zero on error.
-OPENSSL_EXPORT int X509_EXTENSION_set_data(X509_EXTENSION *ex,
-                                           const ASN1_OCTET_STRING *data);
-
-// X509_EXTENSION_get_object returns |ex|'s extension type.
-OPENSSL_EXPORT ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex);
-
-// X509_EXTENSION_get_data returns |ne|'s extension value.
-OPENSSL_EXPORT ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
-
-// X509_EXTENSION_get_critical returns one if |ex| is critical and zero
-// otherwise.
-OPENSSL_EXPORT int X509_EXTENSION_get_critical(const X509_EXTENSION *ex);
-
 // X509at_get_attr_count returns the number of attributes in |x|.
 OPENSSL_EXPORT int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
 
@@ -1727,8 +2285,6 @@
 // |attr|'s type. If |len| is -1, |strlen(data)| is used instead. See
 // |ASN1_STRING_set_by_NID| for details.
 //
-// TODO(davidben): Document |ASN1_STRING_set_by_NID| so the reference is useful.
-//
 // Otherwise, if |len| is not -1, the value is an ASN.1 string. |attrtype| is an
 // |ASN1_STRING| type value and the |len| bytes from |data| are copied as the
 // type-specific representation of |ASN1_STRING|. See |ASN1_STRING| for details.
@@ -1777,25 +2333,23 @@
 
 OPENSSL_EXPORT int X509_verify_cert(X509_STORE_CTX *ctx);
 
-// lookup a cert from a X509 STACK
-OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,
-                                                    X509_NAME *name,
-                                                    ASN1_INTEGER *serial);
-OPENSSL_EXPORT X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name);
-
 // PKCS#8 utilities
 
-DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)
+DECLARE_ASN1_FUNCTIONS_const(PKCS8_PRIV_KEY_INFO)
 
-OPENSSL_EXPORT EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8);
-OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
+// EVP_PKCS82PKEY returns |p8| as a newly-allocated |EVP_PKEY|, or NULL if the
+// key was unsupported or could not be decoded. If non-NULL, the caller must
+// release the result with |EVP_PKEY_free| when done.
+//
+// Use |EVP_parse_private_key| instead.
+OPENSSL_EXPORT EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8);
 
-OPENSSL_EXPORT int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj,
-                                   int version, int ptype, void *pval,
-                                   unsigned char *penc, int penclen);
-OPENSSL_EXPORT int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg,
-                                   const unsigned char **pk, int *ppklen,
-                                   X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8);
+// EVP_PKEY2PKCS8 encodes |pkey| as a PKCS#8 PrivateKeyInfo (RFC 5208),
+// represented as a newly-allocated |PKCS8_PRIV_KEY_INFO|, or NULL on error. The
+// caller must release the result with |PKCS8_PRIV_KEY_INFO_free| when done.
+//
+// Use |EVP_marshal_private_key| instead.
+OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey);
 
 // X509_PUBKEY_set0_param sets |pub| to a key with AlgorithmIdentifier
 // determined by |obj|, |param_type|, and |param_value|, and an encoded
@@ -1852,7 +2406,7 @@
   X509_ALGOR *maskHash;
 } /* RSA_PSS_PARAMS */;
 
-DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS)
+DECLARE_ASN1_FUNCTIONS_const(RSA_PSS_PARAMS)
 
 /*
 SSL_CTX -> X509_STORE
@@ -1977,14 +2531,6 @@
 #define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53
 #define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54
 
-// Suite B mode algorithm violation
-#define X509_V_ERR_SUITE_B_INVALID_VERSION 56
-#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57
-#define X509_V_ERR_SUITE_B_INVALID_CURVE 58
-#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59
-#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60
-#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61
-
 // Host, email and IP check errors
 #define X509_V_ERR_HOSTNAME_MISMATCH 62
 #define X509_V_ERR_EMAIL_MISMATCH 63
@@ -2031,12 +2577,6 @@
 #define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000
 // Use trusted store first
 #define X509_V_FLAG_TRUSTED_FIRST 0x8000
-// Suite B 128 bit only mode: not normally used
-#define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000
-// Suite B 192 bit only mode
-#define X509_V_FLAG_SUITEB_192_LOS 0x20000
-// Suite B 128 bit mode allowing 192 bit algorithms
-#define X509_V_FLAG_SUITEB_128_LOS 0x30000
 
 // Allow partial chains if at least one certificate is in trusted store
 #define X509_V_FLAG_PARTIAL_CHAIN 0x80000
@@ -2046,6 +2586,10 @@
 // will force the behaviour to match that of previous versions.
 #define X509_V_FLAG_NO_ALT_CHAINS 0x100000
 
+// X509_V_FLAG_NO_CHECK_TIME disables all time checks in certificate
+// verification.
+#define X509_V_FLAG_NO_CHECK_TIME 0x200000
+
 #define X509_VP_FLAG_DEFAULT 0x1
 #define X509_VP_FLAG_OVERWRITE 0x2
 #define X509_VP_FLAG_RESET_FLAGS 0x4
@@ -2144,8 +2688,21 @@
 OPENSSL_EXPORT void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
 OPENSSL_EXPORT int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
                                        X509 *x509, STACK_OF(X509) *chain);
+
+// X509_STORE_CTX_set0_trusted_stack configures |ctx| to trust the certificates
+// in |sk|. |sk| must remain valid for the duration of |ctx|.
+//
+// WARNING: This function differs from most |set0| functions in that it does not
+// take ownership of its input. The caller is required to ensure the lifetimes
+// are consistent.
+OPENSSL_EXPORT void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx,
+                                                      STACK_OF(X509) *sk);
+
+// X509_STORE_CTX_trusted_stack is a deprecated alias for
+// |X509_STORE_CTX_set0_trusted_stack|.
 OPENSSL_EXPORT void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx,
                                                  STACK_OF(X509) *sk);
+
 OPENSSL_EXPORT void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx);
 
 OPENSSL_EXPORT X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx);
@@ -2180,15 +2737,6 @@
 OPENSSL_EXPORT int X509_LOOKUP_init(X509_LOOKUP *ctx);
 OPENSSL_EXPORT int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type,
                                           X509_NAME *name, X509_OBJECT *ret);
-OPENSSL_EXPORT int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type,
-                                                X509_NAME *name,
-                                                ASN1_INTEGER *serial,
-                                                X509_OBJECT *ret);
-OPENSSL_EXPORT int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
-                                              unsigned char *bytes, int len,
-                                              X509_OBJECT *ret);
-OPENSSL_EXPORT int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str,
-                                        int len, X509_OBJECT *ret);
 OPENSSL_EXPORT int X509_LOOKUP_shutdown(X509_LOOKUP *ctx);
 
 #ifndef OPENSSL_NO_STDIO
@@ -2196,14 +2744,6 @@
                                              const char *dir);
 OPENSSL_EXPORT int X509_STORE_set_default_paths(X509_STORE *ctx);
 #endif
-
-OPENSSL_EXPORT int X509_STORE_CTX_get_ex_new_index(long argl, void *argp,
-                                                   CRYPTO_EX_unused *unused,
-                                                   CRYPTO_EX_dup *dup_unused,
-                                                   CRYPTO_EX_free *free_func);
-OPENSSL_EXPORT int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx,
-                                              void *data);
-OPENSSL_EXPORT void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx);
 OPENSSL_EXPORT int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
 OPENSSL_EXPORT void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s);
 OPENSSL_EXPORT int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
@@ -2234,10 +2774,6 @@
 OPENSSL_EXPORT void X509_STORE_CTX_set_verify_cb(
     X509_STORE_CTX *ctx, int (*verify_cb)(int, X509_STORE_CTX *));
 
-OPENSSL_EXPORT X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(
-    X509_STORE_CTX *ctx);
-OPENSSL_EXPORT int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx);
-
 OPENSSL_EXPORT X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(
     X509_STORE_CTX *ctx);
 OPENSSL_EXPORT void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx,
@@ -2303,37 +2839,6 @@
     const char *name);
 OPENSSL_EXPORT void X509_VERIFY_PARAM_table_cleanup(void);
 
-OPENSSL_EXPORT int X509_policy_check(X509_POLICY_TREE **ptree,
-                                     int *pexplicit_policy,
-                                     STACK_OF(X509) *certs,
-                                     STACK_OF(ASN1_OBJECT) *policy_oids,
-                                     unsigned int flags);
-
-OPENSSL_EXPORT void X509_policy_tree_free(X509_POLICY_TREE *tree);
-
-OPENSSL_EXPORT int X509_policy_tree_level_count(const X509_POLICY_TREE *tree);
-OPENSSL_EXPORT X509_POLICY_LEVEL *X509_policy_tree_get0_level(
-    const X509_POLICY_TREE *tree, int i);
-
-OPENSSL_EXPORT STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(
-    const X509_POLICY_TREE *tree);
-
-OPENSSL_EXPORT STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(
-    const X509_POLICY_TREE *tree);
-
-OPENSSL_EXPORT int X509_policy_level_node_count(X509_POLICY_LEVEL *level);
-
-OPENSSL_EXPORT X509_POLICY_NODE *X509_policy_level_get0_node(
-    X509_POLICY_LEVEL *level, int i);
-
-OPENSSL_EXPORT const ASN1_OBJECT *X509_policy_node_get0_policy(
-    const X509_POLICY_NODE *node);
-
-OPENSSL_EXPORT STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(
-    const X509_POLICY_NODE *node);
-OPENSSL_EXPORT const X509_POLICY_NODE *X509_policy_node_get0_parent(
-    const X509_POLICY_NODE *node);
-
 
 #if defined(__cplusplus)
 }  // extern C
@@ -2352,14 +2857,12 @@
 BORINGSSL_MAKE_DELETER(X509_ATTRIBUTE, X509_ATTRIBUTE_free)
 BORINGSSL_MAKE_DELETER(X509_CRL, X509_CRL_free)
 BORINGSSL_MAKE_UP_REF(X509_CRL, X509_CRL_up_ref)
-BORINGSSL_MAKE_DELETER(X509_CRL_METHOD, X509_CRL_METHOD_free)
 BORINGSSL_MAKE_DELETER(X509_EXTENSION, X509_EXTENSION_free)
 BORINGSSL_MAKE_DELETER(X509_INFO, X509_INFO_free)
 BORINGSSL_MAKE_DELETER(X509_LOOKUP, X509_LOOKUP_free)
 BORINGSSL_MAKE_DELETER(X509_NAME, X509_NAME_free)
 BORINGSSL_MAKE_DELETER(X509_NAME_ENTRY, X509_NAME_ENTRY_free)
 BORINGSSL_MAKE_DELETER(X509_PKEY, X509_PKEY_free)
-BORINGSSL_MAKE_DELETER(X509_POLICY_TREE, X509_policy_tree_free)
 BORINGSSL_MAKE_DELETER(X509_PUBKEY, X509_PUBKEY_free)
 BORINGSSL_MAKE_DELETER(X509_REQ, X509_REQ_free)
 BORINGSSL_MAKE_DELETER(X509_REVOKED, X509_REVOKED_free)
@@ -2415,5 +2918,8 @@
 #define X509_R_DELTA_CRL_WITHOUT_CRL_NUMBER 138
 #define X509_R_INVALID_FIELD_FOR_VERSION 139
 #define X509_R_INVALID_VERSION 140
+#define X509_R_NO_CERTIFICATE_FOUND 141
+#define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 142
+#define X509_R_NO_CRL_FOUND 143
 
 #endif
diff --git a/src/include/openssl/x509v3.h b/src/include/openssl/x509v3.h
index acff637..9db57e6 100644
--- a/src/include/openssl/x509v3.h
+++ b/src/include/openssl/x509v3.h
@@ -79,23 +79,24 @@
 
 // Useful typedefs
 
+typedef struct v3_ext_method X509V3_EXT_METHOD;
+
 typedef void *(*X509V3_EXT_NEW)(void);
 typedef void (*X509V3_EXT_FREE)(void *);
 typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long);
 typedef int (*X509V3_EXT_I2D)(void *, unsigned char **);
-typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(
-    const struct v3_ext_method *method, void *ext,
-    STACK_OF(CONF_VALUE) *extlist);
-typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method,
-                                struct v3_ext_ctx *ctx,
-                                STACK_OF(CONF_VALUE) *values);
-typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, void *ext);
-typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method,
-                                struct v3_ext_ctx *ctx, const char *str);
-typedef int (*X509V3_EXT_I2R)(const struct v3_ext_method *method, void *ext,
+typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(const X509V3_EXT_METHOD *method,
+                                                void *ext,
+                                                STACK_OF(CONF_VALUE) *extlist);
+typedef void *(*X509V3_EXT_V2I)(const X509V3_EXT_METHOD *method,
+                                X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values);
+typedef char *(*X509V3_EXT_I2S)(const X509V3_EXT_METHOD *method, void *ext);
+typedef void *(*X509V3_EXT_S2I)(const X509V3_EXT_METHOD *method,
+                                X509V3_CTX *ctx, const char *str);
+typedef int (*X509V3_EXT_I2R)(const X509V3_EXT_METHOD *method, void *ext,
                               BIO *out, int indent);
-typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method,
-                                struct v3_ext_ctx *ctx, const char *str);
+typedef void *(*X509V3_EXT_R2I)(const X509V3_EXT_METHOD *method,
+                                X509V3_CTX *ctx, const char *str);
 
 // V3 extension structure
 
@@ -145,8 +146,6 @@
   // Maybe more here
 };
 
-typedef struct v3_ext_method X509V3_EXT_METHOD;
-
 DEFINE_STACK_OF(X509V3_EXT_METHOD)
 
 // ext_flags values
@@ -329,8 +328,8 @@
   PROXY_POLICY *proxyPolicy;
 } PROXY_CERT_INFO_EXTENSION;
 
-DECLARE_ASN1_FUNCTIONS(PROXY_POLICY)
-DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION)
+DECLARE_ASN1_FUNCTIONS_const(PROXY_POLICY)
+DECLARE_ASN1_FUNCTIONS_const(PROXY_CERT_INFO_EXTENSION)
 
 struct ISSUING_DIST_POINT_st {
   DIST_POINT_NAME *distpoint;
@@ -365,23 +364,6 @@
   X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST)
 #define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL;
 
-#define EXT_BITSTRING(nid, table)                                        \
-  {                                                                      \
-    nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), 0, 0, 0, 0, 0, 0,            \
-        (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING,                             \
-        (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, NULL, NULL, (void *)(table) \
-  }
-
-#define EXT_IA5STRING(nid)                                   \
-  {                                                          \
-    nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), 0, 0, 0, 0,       \
-        (X509V3_EXT_I2S)i2s_ASN1_IA5STRING,                  \
-        (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, 0, 0, 0, 0, NULL \
-  }
-
-#define EXT_END \
-  { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
-
 
 // X509_PURPOSE stuff
 
@@ -461,10 +443,14 @@
 
 DEFINE_STACK_OF(X509_PURPOSE)
 
-DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS)
+DECLARE_ASN1_FUNCTIONS_const(BASIC_CONSTRAINTS)
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID)
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(GENERAL_NAME)
 OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a);
 
@@ -474,15 +460,6 @@
 OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a,
                                     const GENERAL_NAME *b);
 
-
-
-OPENSSL_EXPORT ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
-                                                    X509V3_CTX *ctx,
-                                                    STACK_OF(CONF_VALUE) *nval);
-OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(
-    X509V3_EXT_METHOD *method, ASN1_BIT_STRING *bits,
-    STACK_OF(CONF_VALUE) *extlist);
-
 // i2v_GENERAL_NAME serializes |gen| as a |CONF_VALUE|. If |ret| is non-NULL, it
 // appends the value to |ret| and returns |ret| on success or NULL on error. If
 // it returns NULL, the caller is still responsible for freeing |ret|. If |ret|
@@ -493,9 +470,12 @@
 // human-readable print functions. If extracting a SAN list from a certificate,
 // look at |gen| directly.
 OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(
-    X509V3_EXT_METHOD *method, GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret);
+    const X509V3_EXT_METHOD *method, GENERAL_NAME *gen,
+    STACK_OF(CONF_VALUE) *ret);
 OPENSSL_EXPORT int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen);
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES)
 
 // i2v_GENERAL_NAMES serializes |gen| as a list of |CONF_VALUE|s. If |ret| is
@@ -508,14 +488,14 @@
 // human-readable print functions. If extracting a SAN list from a certificate,
 // look at |gen| directly.
 OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(
-    X509V3_EXT_METHOD *method, GENERAL_NAMES *gen,
+    const X509V3_EXT_METHOD *method, GENERAL_NAMES *gen,
     STACK_OF(CONF_VALUE) *extlist);
 OPENSSL_EXPORT GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
                                                 X509V3_CTX *ctx,
                                                 STACK_OF(CONF_VALUE) *nval);
 
-DECLARE_ASN1_FUNCTIONS(OTHERNAME)
-DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME)
+DECLARE_ASN1_FUNCTIONS_const(OTHERNAME)
+DECLARE_ASN1_FUNCTIONS_const(EDIPARTYNAME)
 OPENSSL_EXPORT int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b);
 OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type,
                                             void *value);
@@ -527,23 +507,31 @@
                                                ASN1_OBJECT **poid,
                                                ASN1_TYPE **pvalue);
 
-OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
+OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method,
                                            const ASN1_OCTET_STRING *ia5);
 OPENSSL_EXPORT ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(
-    X509V3_EXT_METHOD *method, X509V3_CTX *ctx, const char *str);
+    const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, const char *str);
 
-DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
+DECLARE_ASN1_FUNCTIONS_const(EXTENDED_KEY_USAGE)
 OPENSSL_EXPORT int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a);
 
-DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)
-DECLARE_ASN1_FUNCTIONS(POLICYINFO)
-DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO)
-DECLARE_ASN1_FUNCTIONS(USERNOTICE)
-DECLARE_ASN1_FUNCTIONS(NOTICEREF)
+DECLARE_ASN1_FUNCTIONS_const(CERTIFICATEPOLICIES)
+DECLARE_ASN1_FUNCTIONS_const(POLICYINFO)
+DECLARE_ASN1_FUNCTIONS_const(POLICYQUALINFO)
+DECLARE_ASN1_FUNCTIONS_const(USERNOTICE)
+DECLARE_ASN1_FUNCTIONS_const(NOTICEREF)
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS)
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(DIST_POINT)
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME)
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT)
 
 OPENSSL_EXPORT int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn,
@@ -551,7 +539,11 @@
 
 OPENSSL_EXPORT int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc);
 
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION)
+// TODO(https://crbug.com/boringssl/407): This is not const because it contains
+// an |X509_NAME|.
 DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS)
 
 DECLARE_ASN1_ITEM(POLICY_MAPPING)
@@ -649,14 +641,12 @@
                                         const ASN1_INTEGER *aint,
                                         STACK_OF(CONF_VALUE) **extlist);
 
-OPENSSL_EXPORT char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth,
+OPENSSL_EXPORT char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *meth,
                                       const ASN1_INTEGER *aint);
-OPENSSL_EXPORT ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth,
+OPENSSL_EXPORT ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *meth,
                                               const char *value);
-OPENSSL_EXPORT char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth,
+OPENSSL_EXPORT char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *meth,
                                          const ASN1_ENUMERATED *aint);
-OPENSSL_EXPORT char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth,
-                                               const ASN1_ENUMERATED *aint);
 OPENSSL_EXPORT int X509V3_EXT_add(X509V3_EXT_METHOD *ext);
 OPENSSL_EXPORT int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist);
 OPENSSL_EXPORT int X509V3_EXT_add_alias(int nid_to, int nid_from);
@@ -797,12 +787,13 @@
 // hexdump.
 #define X509V3_EXT_DUMP_UNKNOWN (3L << 16)
 
-OPENSSL_EXPORT void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val,
+OPENSSL_EXPORT void X509V3_EXT_val_prn(BIO *out,
+                                       const STACK_OF(CONF_VALUE) *val,
                                        int indent, int ml);
-OPENSSL_EXPORT int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext,
+OPENSSL_EXPORT int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext,
                                     unsigned long flag, int indent);
-OPENSSL_EXPORT int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag,
-                                       int indent);
+OPENSSL_EXPORT int X509V3_EXT_print_fp(FILE *out, const X509_EXTENSION *ext,
+                                       int flag, int indent);
 
 // X509V3_extensions_print prints |title|, followed by a human-readable
 // representation of |exts| to |out|. It returns one on success and zero on
@@ -815,7 +806,7 @@
 
 OPENSSL_EXPORT int X509_check_ca(X509 *x);
 OPENSSL_EXPORT int X509_check_purpose(X509 *x, int id, int ca);
-OPENSSL_EXPORT int X509_supported_extension(X509_EXTENSION *ex);
+OPENSSL_EXPORT int X509_supported_extension(const X509_EXTENSION *ex);
 OPENSSL_EXPORT int X509_PURPOSE_set(int *p, int purpose);
 OPENSSL_EXPORT int X509_check_issued(X509 *issuer, X509 *subject);
 OPENSSL_EXPORT int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid);
@@ -890,19 +881,16 @@
 #define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0
 // Disable wildcard matching for dnsName fields and common name.
 #define X509_CHECK_FLAG_NO_WILDCARDS 0x2
-// Wildcards must not match a partial label.
-#define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4
-// Allow (non-partial) wildcards to match multiple labels.
-#define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8
-// Constraint verifier subdomain patterns to match a single labels.
-#define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10
+// X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS does nothing, but is necessary in
+// OpenSSL to enable standard wildcard matching. In BoringSSL, this behavior is
+// always enabled.
+#define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0
+// Deprecated: this flag does nothing
+#define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0
+// Deprecated: this flag does nothing
+#define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0
 // Skip the subject common name fallback if subjectAltNames is missing.
 #define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20
-//
-// Match reference identifiers starting with "." to any sub-domain.
-// This is a non-public flag, turned on implicitly when the subject
-// reference identity is a DNS name.
-#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000
 
 OPENSSL_EXPORT int X509_check_host(X509 *x, const char *chk, size_t chklen,
                                    unsigned int flags, char **peername);
@@ -919,10 +907,6 @@
                                             STACK_OF(CONF_VALUE) *dn_sk,
                                             unsigned long chtype);
 
-OPENSSL_EXPORT void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node,
-                                           int indent);
-DEFINE_STACK_OF(X509_POLICY_NODE)
-
 // BEGIN ERROR CODES
 // The following lines are auto generated by the script mkerr.pl. Any changes
 // made after this point may be overwritten when the script is next run.
diff --git a/src/rust/CMakeLists.txt b/src/rust/CMakeLists.txt
new file mode 100644
index 0000000..f60ad47
--- /dev/null
+++ b/src/rust/CMakeLists.txt
@@ -0,0 +1,57 @@
+# additional interop for things like macros and inlined functions
+add_library(
+  rust_wrapper
+  STATIC
+  rust_wrapper.c
+)
+
+# generate architecture specific wrappers
+set(WRAPPER_TARGET ${CMAKE_BINARY_DIR}/rust/src/wrapper_${RUST_BINDINGS}.rs)
+set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h"
+            -o ${WRAPPER_TARGET}
+            --no-derive-default
+            --enable-function-attribute-detection
+            --use-core
+            --size_t-is-usize
+            --default-macro-constant-type="signed"
+            --rustified-enum="point_conversion_form_t"
+            # These are not BoringSSL symbols, they are from glibc
+            # and are not relevant to the build besides throwing warnings
+            # about their 'long double' (aka u128) not being FFI safe.
+            # We block those functions so that the build doesn't
+            # spam warnings.
+            #
+            # https://github.com/rust-lang/rust-bindgen/issues/1549 describes the current problem
+            # and other folks' solutions.
+            #
+            # We will explore migrating to https://github.com/rust-lang/rust-bindgen/pull/2122
+            # when it lands
+            --blocklist-function="strtold"
+            --blocklist-function="qecvt"
+            --blocklist-function="qecvt_r"
+            --blocklist-function="qgcvt"
+            --blocklist-function="qfcvt"
+            --blocklist-function="qfcvt_r"
+            -- # these are LLVM arg passthroughs
+            -I../include
+            # https://doc.rust-lang.org/nightly/rustc/platform-support.html
+            --target=${RUST_BINDINGS})
+
+set(INCLUDES "include!(\"wrapper_${RUST_BINDINGS}.rs\");\n")
+
+add_custom_target(
+  bindgen_rust_${RUST_BINDINGS}
+  ALL
+  ${COMMAND}
+  BYPRODUCTS ${WRAPPER_TARGET}
+  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+# move files into build directory
+configure_file("src/lib.rs" "src/lib.rs")
+
+if(NOT BUILD_SHARED_LIBS)
+  configure_file("build.rs" "build.rs" COPYONLY)
+endif()
+
+configure_file("Cargo.toml" "Cargo.toml" COPYONLY)
diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml
new file mode 100644
index 0000000..6a2bb40
--- /dev/null
+++ b/src/rust/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "bssl-sys"
+version = "0.1.0"
+authors = ["Benjamin Brittain <bwb@google.com>"]
+edition = "2018"
+
+[dependencies]
+libc = "0.2"
diff --git a/src/rust/README.md b/src/rust/README.md
new file mode 100644
index 0000000..fb5230a
--- /dev/null
+++ b/src/rust/README.md
@@ -0,0 +1,13 @@
+bssl-sys
+============
+
+A low-level binding crate for Rust that moves in lockstop with BoringSSL. BoringSSL explicitly does not have a stable ABI, `bssl-sys` is the solution for preventing subtle-memory corruption bugs due to version skew.
+
+### How it works
+`bssl-sys` uses `bindgen` as part of the cmake build process to generate Rust compatibility shims for the targeted platform. It is important to generate it for the correct platform because `bindgen` uses LLVM information for alignment which varies depending on architecture. These files are then packaged into a Rust crate.
+
+### To Use
+Build `boringssl` with `-DRUST_BINDINGS=<rust-triple>` and ensure that you have `bindgen` installed.
+
+The `rust-triple` option should be one of the supported targets at https://doc.rust-lang.org/nightly/rustc/platform-support.html.
+
diff --git a/src/rust/build.rs b/src/rust/build.rs
new file mode 100644
index 0000000..b029223
--- /dev/null
+++ b/src/rust/build.rs
@@ -0,0 +1,39 @@
+/* Copyright (c) 2021, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+use std::env;
+use std::path::Path;
+
+fn main() {
+    let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
+    let crate_path = Path::new(&dir);
+    let parent_path = crate_path.parent().unwrap();
+
+    // Statically link libraries.
+    println!(
+        "cargo:rustc-link-search=native={}",
+        parent_path.join("crypto").display()
+    );
+    println!("cargo:rustc-link-lib=static=crypto");
+
+    println!(
+        "cargo:rustc-link-search=native={}",
+        parent_path.join("ssl").display()
+    );
+    println!("cargo:rustc-link-lib=static=ssl");
+
+    println!("cargo:rustc-link-search=native={}", crate_path.display());
+    println!("cargo:rustc-link-lib=static=rust_wrapper");
+}
diff --git a/src/rust/rust_wrapper.c b/src/rust/rust_wrapper.c
new file mode 100644
index 0000000..d5419a9
--- /dev/null
+++ b/src/rust/rust_wrapper.c
@@ -0,0 +1,28 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include "rust_wrapper.h"
+
+
+int ERR_GET_LIB_RUST(uint32_t packed_error) {
+  return ERR_GET_LIB(packed_error);
+}
+
+int ERR_GET_REASON_RUST(uint32_t packed_error) {
+  return ERR_GET_REASON(packed_error);
+}
+
+int ERR_GET_FUNC_RUST(uint32_t packed_error) {
+  return ERR_GET_FUNC(packed_error);
+}
diff --git a/src/rust/rust_wrapper.h b/src/rust/rust_wrapper.h
new file mode 100644
index 0000000..632622a
--- /dev/null
+++ b/src/rust/rust_wrapper.h
@@ -0,0 +1,37 @@
+/* Copyright (c) 2022, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_RUST_WRAPPER_H
+#define OPENSSL_HEADER_RUST_WRAPPER_H
+
+#include <openssl/err.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+// The following functions are wrappers over inline functions and macros in
+// BoringSSL, which bindgen cannot currently correctly bind. These wrappers
+// ensure changes to the functions remain in lockstep with the Rust versions.
+int ERR_GET_LIB_RUST(uint32_t packed_error);
+int ERR_GET_REASON_RUST(uint32_t packed_error);
+int ERR_GET_FUNC_RUST(uint32_t packed_error);
+
+
+#if defined(__cplusplus)
+}  // extern C
+#endif
+
+#endif  // OPENSSL_HEADER_RUST_WRAPPER_H
diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs
new file mode 100644
index 0000000..d8c2c00
--- /dev/null
+++ b/src/rust/src/lib.rs
@@ -0,0 +1,22 @@
+#![allow(non_upper_case_globals)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+
+// populated by cmake
+${INCLUDES}
+
+pub fn ERR_GET_LIB(packed_error: u32) -> i32 {
+    unsafe { ERR_GET_LIB_RUST(packed_error) }
+}
+
+pub fn ERR_GET_REASON(packed_error: u32) -> i32 {
+    unsafe { ERR_GET_REASON_RUST(packed_error) }
+}
+
+pub fn ERR_GET_FUNC(packed_error: u32) -> i32 {
+    unsafe { ERR_GET_FUNC_RUST(packed_error) }
+}
+
+pub fn init() {
+    unsafe { CRYPTO_library_init(); }
+}
diff --git a/src/rust/wrapper.h b/src/rust/wrapper.h
new file mode 100644
index 0000000..ff63244
--- /dev/null
+++ b/src/rust/wrapper.h
@@ -0,0 +1,77 @@
+#include "../include/openssl/aes.h"
+#include "../include/openssl/asn1.h"
+#include "../include/openssl/asn1_mac.h"
+#include "../include/openssl/asn1t.h"
+#include "../include/openssl/base.h"
+#include "../include/openssl/base64.h"
+#include "../include/openssl/bio.h"
+#include "../include/openssl/blake2.h"
+#include "../include/openssl/blowfish.h"
+#include "../include/openssl/bn.h"
+#include "../include/openssl/buf.h"
+#include "../include/openssl/buffer.h"
+#include "../include/openssl/bytestring.h"
+#include "../include/openssl/cast.h"
+#include "../include/openssl/chacha.h"
+#include "../include/openssl/cipher.h"
+#include "../include/openssl/cmac.h"
+#include "../include/openssl/conf.h"
+#include "../include/openssl/cpu.h"
+#include "../include/openssl/crypto.h"
+#include "../include/openssl/curve25519.h"
+#include "../include/openssl/des.h"
+#include "../include/openssl/dh.h"
+#include "../include/openssl/digest.h"
+#include "../include/openssl/dsa.h"
+#include "../include/openssl/dtls1.h"
+#include "../include/openssl/e_os2.h"
+#include "../include/openssl/ec.h"
+#include "../include/openssl/ec_key.h"
+#include "../include/openssl/ecdh.h"
+#include "../include/openssl/ecdsa.h"
+#include "../include/openssl/engine.h"
+#include "../include/openssl/err.h"
+#include "../include/openssl/evp.h"
+#include "../include/openssl/evp_errors.h"
+#include "../include/openssl/ex_data.h"
+#include "../include/openssl/hkdf.h"
+#include "../include/openssl/hmac.h"
+#include "../include/openssl/hpke.h"
+#include "../include/openssl/hrss.h"
+#include "../include/openssl/is_boringssl.h"
+#include "../include/openssl/lhash.h"
+#include "../include/openssl/md4.h"
+#include "../include/openssl/md5.h"
+#include "../include/openssl/mem.h"
+#include "../include/openssl/obj.h"
+#include "../include/openssl/obj_mac.h"
+#include "../include/openssl/objects.h"
+#include "../include/openssl/opensslconf.h"
+#include "../include/openssl/opensslv.h"
+#include "../include/openssl/ossl_typ.h"
+#include "../include/openssl/pem.h"
+#include "../include/openssl/pkcs12.h"
+#include "../include/openssl/pkcs7.h"
+#include "../include/openssl/pkcs8.h"
+#include "../include/openssl/poly1305.h"
+#include "../include/openssl/pool.h"
+#include "../include/openssl/rand.h"
+#include "../include/openssl/rc4.h"
+#include "../include/openssl/ripemd.h"
+#include "../include/openssl/rsa.h"
+#include "../include/openssl/safestack.h"
+#include "../include/openssl/sha.h"
+#include "../include/openssl/siphash.h"
+#include "../include/openssl/span.h"
+#include "../include/openssl/srtp.h"
+#include "../include/openssl/ssl.h"
+#include "../include/openssl/ssl3.h"
+#include "../include/openssl/stack.h"
+#include "../include/openssl/thread.h"
+#include "../include/openssl/tls1.h"
+#include "../include/openssl/trust_token.h"
+#include "../include/openssl/x509.h"
+#include "../include/openssl/x509_vfy.h"
+#include "../include/openssl/x509v3.h"
+
+#include "rust_wrapper.h"
diff --git a/src/sources.cmake b/src/sources.cmake
index 3d3465f..aaca5a4 100644
--- a/src/sources.cmake
+++ b/src/sources.cmake
@@ -11,6 +11,7 @@
   crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt
   crypto/cipher_extra/test/aes_128_ccm_bluetooth_tests.txt
   crypto/cipher_extra/test/aes_128_ccm_bluetooth_8_tests.txt
+  crypto/cipher_extra/test/aes_128_ccm_matter_tests.txt
   crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt
   crypto/cipher_extra/test/aes_128_gcm_randnonce_tests.txt
   crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt
@@ -38,18 +39,18 @@
   crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt
   crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt
   crypto/curve25519/ed25519_tests.txt
-  crypto/cmac/cavp_3des_cmac_tests.txt
-  crypto/cmac/cavp_aes128_cmac_tests.txt
-  crypto/cmac/cavp_aes192_cmac_tests.txt
-  crypto/cmac/cavp_aes256_cmac_tests.txt
   crypto/ecdh_extra/ecdh_tests.txt
   crypto/evp/evp_tests.txt
   crypto/evp/scrypt_tests.txt
   crypto/fipsmodule/aes/aes_tests.txt
   crypto/fipsmodule/bn/bn_tests.txt
   crypto/fipsmodule/bn/miller_rabin_tests.txt
+  crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt
+  crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt
+  crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt
+  crypto/fipsmodule/cmac/cavp_aes256_cmac_tests.txt
   crypto/fipsmodule/ec/ec_scalar_base_mult_tests.txt
-  crypto/fipsmodule/ec/p256-x86_64_tests.txt
+  crypto/fipsmodule/ec/p256-nistz_tests.txt
   crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt
   crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt
   crypto/fipsmodule/modes/gcm_tests.txt
@@ -101,6 +102,21 @@
   crypto/x509/test/many_names1.pem
   crypto/x509/test/many_names2.pem
   crypto/x509/test/many_names3.pem
+  crypto/x509/test/pss_sha1_explicit.pem
+  crypto/x509/test/pss_sha1_mgf1_syntax_error.pem
+  crypto/x509/test/pss_sha1.pem
+  crypto/x509/test/pss_sha224.pem
+  crypto/x509/test/pss_sha256_explicit_trailer.pem
+  crypto/x509/test/pss_sha256_mgf1_sha384.pem
+  crypto/x509/test/pss_sha256_mgf1_syntax_error.pem
+  crypto/x509/test/pss_sha256_omit_nulls.pem
+  crypto/x509/test/pss_sha256_salt_overflow.pem
+  crypto/x509/test/pss_sha256_salt31.pem
+  crypto/x509/test/pss_sha256_unknown_mgf.pem
+  crypto/x509/test/pss_sha256_wrong_trailer.pem
+  crypto/x509/test/pss_sha256.pem
+  crypto/x509/test/pss_sha384.pem
+  crypto/x509/test/pss_sha512.pem
   crypto/x509/test/some_names1.pem
   crypto/x509/test/some_names2.pem
   crypto/x509/test/some_names3.pem
diff --git a/src/ssl/CMakeLists.txt b/src/ssl/CMakeLists.txt
index 4f4abf8..b4b1032 100644
--- a/src/ssl/CMakeLists.txt
+++ b/src/ssl/CMakeLists.txt
@@ -41,6 +41,16 @@
   tls13_enc.cc
   tls13_server.cc
 )
+target_include_directories(ssl INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
+  $<INSTALL_INTERFACE:include>
+)
+install(TARGETS ssl EXPORT OpenSSLTargets
+  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+set_property(TARGET ssl PROPERTY EXPORT_NAME SSL)
 
 add_dependencies(ssl global_target)
 
diff --git a/src/ssl/d1_both.cc b/src/ssl/d1_both.cc
index f8c04b7..3424f6e 100644
--- a/src/ssl/d1_both.cc
+++ b/src/ssl/d1_both.cc
@@ -487,10 +487,7 @@
 
 // Sending handshake messages.
 
-void DTLS_OUTGOING_MESSAGE::Clear() {
-  OPENSSL_free(data);
-  data = nullptr;
-}
+void DTLS_OUTGOING_MESSAGE::Clear() { data.Reset(); }
 
 void dtls_clear_outgoing_messages(SSL *ssl) {
   for (size_t i = 0; i < ssl->d1->outgoing_messages_len; i++) {
@@ -578,9 +575,7 @@
 
   DTLS_OUTGOING_MESSAGE *msg =
       &ssl->d1->outgoing_messages[ssl->d1->outgoing_messages_len];
-  size_t len;
-  data.Release(&msg->data, &len);
-  msg->len = len;
+  msg->data = std::move(data);
   msg->epoch = ssl->d1->w_epoch;
   msg->is_ccs = is_ccs;
 
@@ -665,7 +660,7 @@
   // DTLS messages are serialized as a single fragment in |msg|.
   CBS cbs, body;
   struct hm_header_st hdr;
-  CBS_init(&cbs, msg->data, msg->len);
+  CBS_init(&cbs, msg->data.data(), msg->data.size());
   if (!dtls1_parse_fragment(&cbs, &hdr, &body) ||
       hdr.frag_off != 0 ||
       hdr.frag_len != CBS_len(&body) ||
diff --git a/src/ssl/d1_pkt.cc b/src/ssl/d1_pkt.cc
index b9b0ef9..b866156 100644
--- a/src/ssl/d1_pkt.cc
+++ b/src/ssl/d1_pkt.cc
@@ -186,8 +186,8 @@
   return ssl_open_record_success;
 }
 
-int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake, const uint8_t *in,
-                         int len) {
+int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
+                         size_t *out_bytes_written, Span<const uint8_t> in) {
   assert(!SSL_in_init(ssl));
   *out_needs_handshake = false;
 
@@ -196,47 +196,46 @@
     return -1;
   }
 
-  if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
+  // DTLS does not split the input across records.
+  if (in.size() > SSL3_RT_MAX_PLAIN_LENGTH) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_DTLS_MESSAGE_TOO_BIG);
     return -1;
   }
 
-  if (len < 0) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
-    return -1;
+  if (in.empty()) {
+    *out_bytes_written = 0;
+    return 1;
   }
 
-  if (len == 0) {
-    return 0;
-  }
-
-  int ret = dtls1_write_record(ssl, SSL3_RT_APPLICATION_DATA, in, (size_t)len,
+  int ret = dtls1_write_record(ssl, SSL3_RT_APPLICATION_DATA, in,
                                dtls1_use_current_epoch);
   if (ret <= 0) {
     return ret;
   }
-  return len;
+  *out_bytes_written = in.size();
+  return 1;
 }
 
-int dtls1_write_record(SSL *ssl, int type, const uint8_t *in, size_t len,
+int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
                        enum dtls1_use_epoch_t use_epoch) {
   SSLBuffer *buf = &ssl->s3->write_buffer;
-  assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
+  assert(in.size() <= SSL3_RT_MAX_PLAIN_LENGTH);
   // There should never be a pending write buffer in DTLS. One can't write half
   // a datagram, so the write buffer is always dropped in
   // |ssl_write_buffer_flush|.
   assert(buf->empty());
 
-  if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
+  if (in.size() > SSL3_RT_MAX_PLAIN_LENGTH) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
     return -1;
   }
 
   size_t ciphertext_len;
   if (!buf->EnsureCap(ssl_seal_align_prefix_len(ssl),
-                      len + SSL_max_seal_overhead(ssl)) ||
+                      in.size() + SSL_max_seal_overhead(ssl)) ||
       !dtls_seal_record(ssl, buf->remaining().data(), &ciphertext_len,
-                        buf->remaining().size(), type, in, len, use_epoch)) {
+                        buf->remaining().size(), type, in.data(), in.size(),
+                        use_epoch)) {
     buf->Clear();
     return -1;
   }
@@ -250,7 +249,7 @@
 }
 
 int dtls1_dispatch_alert(SSL *ssl) {
-  int ret = dtls1_write_record(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2,
+  int ret = dtls1_write_record(ssl, SSL3_RT_ALERT, ssl->s3->send_alert,
                                dtls1_use_current_epoch);
   if (ret <= 0) {
     return ret;
diff --git a/src/ssl/dtls_method.cc b/src/ssl/dtls_method.cc
index d179bae..677418b 100644
--- a/src/ssl/dtls_method.cc
+++ b/src/ssl/dtls_method.cc
@@ -90,11 +90,11 @@
 
   ssl->d1->r_epoch++;
   OPENSSL_memset(&ssl->d1->bitmap, 0, sizeof(ssl->d1->bitmap));
-  OPENSSL_memset(ssl->s3->read_sequence, 0, sizeof(ssl->s3->read_sequence));
+  ssl->s3->read_sequence = 0;
 
   ssl->s3->aead_read_ctx = std::move(aead_ctx);
   ssl->s3->read_level = level;
-  ssl->d1->has_change_cipher_spec = 0;
+  ssl->d1->has_change_cipher_spec = false;
   return true;
 }
 
@@ -103,9 +103,8 @@
                                   Span<const uint8_t> secret_for_quic) {
   assert(secret_for_quic.empty());  // QUIC does not use DTLS.
   ssl->d1->w_epoch++;
-  OPENSSL_memcpy(ssl->d1->last_write_sequence, ssl->s3->write_sequence,
-                 sizeof(ssl->s3->write_sequence));
-  OPENSSL_memset(ssl->s3->write_sequence, 0, sizeof(ssl->s3->write_sequence));
+  ssl->d1->last_write_sequence = ssl->s3->write_sequence;
+  ssl->s3->write_sequence = 0;
 
   ssl->d1->last_aead_write_ctx = std::move(ssl->s3->aead_write_ctx);
   ssl->s3->aead_write_ctx = std::move(aead_ctx);
diff --git a/src/ssl/dtls_record.cc b/src/ssl/dtls_record.cc
index 992fb52..eb3df69 100644
--- a/src/ssl/dtls_record.cc
+++ b/src/ssl/dtls_record.cc
@@ -123,52 +123,37 @@
 
 BSSL_NAMESPACE_BEGIN
 
-// to_u64_be treats |in| as a 8-byte big-endian integer and returns the value as
-// a |uint64_t|.
-static uint64_t to_u64_be(const uint8_t in[8]) {
-  uint64_t ret = 0;
-  unsigned i;
-  for (i = 0; i < 8; i++) {
-    ret <<= 8;
-    ret |= in[i];
-  }
-  return ret;
-}
-
 // dtls1_bitmap_should_discard returns one if |seq_num| has been seen in
 // |bitmap| or is stale. Otherwise it returns zero.
 static bool dtls1_bitmap_should_discard(DTLS1_BITMAP *bitmap,
-                                        const uint8_t seq_num[8]) {
+                                        uint64_t seq_num) {
   const unsigned kWindowSize = sizeof(bitmap->map) * 8;
 
-  uint64_t seq_num_u = to_u64_be(seq_num);
-  if (seq_num_u > bitmap->max_seq_num) {
+  if (seq_num > bitmap->max_seq_num) {
     return false;
   }
-  uint64_t idx = bitmap->max_seq_num - seq_num_u;
+  uint64_t idx = bitmap->max_seq_num - seq_num;
   return idx >= kWindowSize || (bitmap->map & (((uint64_t)1) << idx));
 }
 
 // dtls1_bitmap_record updates |bitmap| to record receipt of sequence number
 // |seq_num|. It slides the window forward if needed. It is an error to call
 // this function on a stale sequence number.
-static void dtls1_bitmap_record(DTLS1_BITMAP *bitmap,
-                                const uint8_t seq_num[8]) {
+static void dtls1_bitmap_record(DTLS1_BITMAP *bitmap, uint64_t seq_num) {
   const unsigned kWindowSize = sizeof(bitmap->map) * 8;
 
-  uint64_t seq_num_u = to_u64_be(seq_num);
   // Shift the window if necessary.
-  if (seq_num_u > bitmap->max_seq_num) {
-    uint64_t shift = seq_num_u - bitmap->max_seq_num;
+  if (seq_num > bitmap->max_seq_num) {
+    uint64_t shift = seq_num - bitmap->max_seq_num;
     if (shift >= kWindowSize) {
       bitmap->map = 0;
     } else {
       bitmap->map <<= shift;
     }
-    bitmap->max_seq_num = seq_num_u;
+    bitmap->max_seq_num = seq_num;
   }
 
-  uint64_t idx = bitmap->max_seq_num - seq_num_u;
+  uint64_t idx = bitmap->max_seq_num - seq_num;
   if (idx < kWindowSize) {
     bitmap->map |= ((uint64_t)1) << idx;
   }
@@ -192,11 +177,11 @@
   // Decode the record.
   uint8_t type;
   uint16_t version;
-  uint8_t sequence[8];
+  uint8_t sequence_bytes[8];
   CBS body;
   if (!CBS_get_u8(&cbs, &type) ||
       !CBS_get_u16(&cbs, &version) ||
-      !CBS_copy_bytes(&cbs, sequence, 8) ||
+      !CBS_copy_bytes(&cbs, sequence_bytes, sizeof(sequence_bytes)) ||
       !CBS_get_u16_length_prefixed(&cbs, &body) ||
       CBS_len(&body) > SSL3_RT_MAX_ENCRYPTED_LENGTH) {
     // The record header was incomplete or malformed. Drop the entire packet.
@@ -222,7 +207,8 @@
   Span<const uint8_t> header = in.subspan(0, DTLS1_RT_HEADER_LENGTH);
   ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HEADER, header);
 
-  uint16_t epoch = (((uint16_t)sequence[0]) << 8) | sequence[1];
+  uint64_t sequence = CRYPTO_load_u64_be(sequence_bytes);
+  uint16_t epoch = static_cast<uint16_t>(sequence >> 48);
   if (epoch != ssl->d1->r_epoch ||
       dtls1_bitmap_should_discard(&ssl->d1->bitmap, sequence)) {
     // Drop this record. It's from the wrong epoch or is a replay. Note that if
@@ -304,12 +290,12 @@
   // Determine the parameters for the current epoch.
   uint16_t epoch = ssl->d1->w_epoch;
   SSLAEADContext *aead = ssl->s3->aead_write_ctx.get();
-  uint8_t *seq = ssl->s3->write_sequence;
+  uint64_t *seq = &ssl->s3->write_sequence;
   if (use_epoch == dtls1_use_previous_epoch) {
     assert(ssl->d1->w_epoch >= 1);
     epoch = ssl->d1->w_epoch - 1;
     aead = ssl->d1->last_aead_write_ctx.get();
-    seq = ssl->d1->last_write_sequence;
+    seq = &ssl->d1->last_write_sequence;
   }
 
   if (max_out < DTLS1_RT_HEADER_LENGTH) {
@@ -323,9 +309,15 @@
   out[1] = record_version >> 8;
   out[2] = record_version & 0xff;
 
-  out[3] = epoch >> 8;
-  out[4] = epoch & 0xff;
-  OPENSSL_memcpy(&out[5], &seq[2], 6);
+  // Ensure the sequence number update does not overflow.
+  const uint64_t kMaxSequenceNumber = (uint64_t{1} << 48) - 1;
+  if (*seq + 1 > kMaxSequenceNumber) {
+    OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
+    return false;
+  }
+
+  uint64_t seq_with_epoch = (uint64_t{epoch} << 48) | *seq;
+  CRYPTO_store_u64_be(&out[3], seq_with_epoch);
 
   size_t ciphertext_len;
   if (!aead->CiphertextLen(&ciphertext_len, in_len, 0)) {
@@ -339,12 +331,12 @@
   size_t len_copy;
   if (!aead->Seal(out + DTLS1_RT_HEADER_LENGTH, &len_copy,
                   max_out - DTLS1_RT_HEADER_LENGTH, type, record_version,
-                  &out[3] /* seq */, header, in, in_len) ||
-      !ssl_record_sequence_update(&seq[2], 6)) {
+                  seq_with_epoch, header, in, in_len)) {
     return false;
   }
   assert(ciphertext_len == len_copy);
 
+  (*seq)++;
   *out_len = DTLS1_RT_HEADER_LENGTH + ciphertext_len;
   ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HEADER, header);
   return true;
diff --git a/src/ssl/encrypted_client_hello.cc b/src/ssl/encrypted_client_hello.cc
index 64fee3d..9e9adfe 100644
--- a/src/ssl/encrypted_client_hello.cc
+++ b/src/ssl/encrypted_client_hello.cc
@@ -203,6 +203,12 @@
         OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
         return false;
       }
+      // The ECH extension itself is not in the AAD and may not be referenced.
+      if (want == TLSEXT_TYPE_encrypted_client_hello) {
+        *out_alert = SSL_AD_ILLEGAL_PARAMETER;
+        OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_OUTER_EXTENSION);
+        return false;
+      }
       // Seek to |want| in |outer_extensions|. |ext_list| is required to match
       // ClientHelloOuter in order.
       uint16_t found;
@@ -210,7 +216,7 @@
       do {
         if (CBS_len(&outer_extensions) == 0) {
           *out_alert = SSL_AD_ILLEGAL_PARAMETER;
-          OPENSSL_PUT_ERROR(SSL, SSL_R_OUTER_EXTENSION_NOT_FOUND);
+          OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_OUTER_EXTENSION);
           return false;
         }
         if (!CBS_get_u16(&outer_extensions, &found) ||
@@ -252,8 +258,8 @@
   return true;
 }
 
-bool ssl_client_hello_decrypt(EVP_HPKE_CTX *hpke_ctx, Array<uint8_t> *out,
-                              bool *out_is_decrypt_error,
+bool ssl_client_hello_decrypt(SSL_HANDSHAKE *hs, uint8_t *out_alert,
+                              bool *out_is_decrypt_error, Array<uint8_t> *out,
                               const SSL_CLIENT_HELLO *client_hello_outer,
                               Span<const uint8_t> payload) {
   *out_is_decrypt_error = false;
@@ -264,6 +270,7 @@
   Array<uint8_t> aad;
   if (!aad.CopyFrom(MakeConstSpan(client_hello_outer->client_hello,
                                   client_hello_outer->client_hello_len))) {
+    *out_alert = SSL_AD_INTERNAL_ERROR;
     return false;
   }
 
@@ -278,35 +285,47 @@
       payload.data() - client_hello_outer->client_hello, payload.size());
   OPENSSL_memset(payload_aad.data(), 0, payload_aad.size());
 
+  // Decrypt the EncodedClientHelloInner.
+  Array<uint8_t> encoded;
 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
   // In fuzzer mode, disable encryption to improve coverage. We reserve a short
   // input to signal decryption failure, so the fuzzer can explore fallback to
   // ClientHelloOuter.
   const uint8_t kBadPayload[] = {0xff};
   if (payload == kBadPayload) {
+    *out_alert = SSL_AD_DECRYPT_ERROR;
     *out_is_decrypt_error = true;
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
     return false;
   }
-  if (!out->CopyFrom(payload)) {
+  if (!encoded.CopyFrom(payload)) {
+    *out_alert = SSL_AD_INTERNAL_ERROR;
     return false;
   }
 #else
-  // Attempt to decrypt into |out|.
-  if (!out->Init(payload.size())) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
+  if (!encoded.Init(payload.size())) {
+    *out_alert = SSL_AD_INTERNAL_ERROR;
     return false;
   }
   size_t len;
-  if (!EVP_HPKE_CTX_open(hpke_ctx, out->data(), &len, out->size(),
-                         payload.data(), payload.size(), aad.data(),
-                         aad.size())) {
+  if (!EVP_HPKE_CTX_open(hs->ech_hpke_ctx.get(), encoded.data(), &len,
+                         encoded.size(), payload.data(), payload.size(),
+                         aad.data(), aad.size())) {
+    *out_alert = SSL_AD_DECRYPT_ERROR;
     *out_is_decrypt_error = true;
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
     return false;
   }
-  out->Shrink(len);
+  encoded.Shrink(len);
 #endif
+
+  if (!ssl_decode_client_hello_inner(hs->ssl, out_alert, out, encoded,
+                                     client_hello_outer)) {
+    return false;
+  }
+
+  ssl_do_msg_callback(hs->ssl, /*is_write=*/0, SSL3_RT_CLIENT_HELLO_INNER,
+                      *out);
   return true;
 }
 
@@ -789,6 +808,8 @@
                    binder_len);
   }
 
+  ssl_do_msg_callback(ssl, /*is_write=*/1, SSL3_RT_CLIENT_HELLO_INNER,
+                      hello_inner);
   if (!hs->inner_transcript.Update(hello_inner)) {
     return false;
   }
diff --git a/src/ssl/extensions.cc b/src/ssl/extensions.cc
index 3baef6d..53a3e3c 100644
--- a/src/ssl/extensions.cc
+++ b/src/ssl/extensions.cc
@@ -240,8 +240,7 @@
   // Skip past DTLS cookie
   if (SSL_is_dtls(out->ssl)) {
     CBS cookie;
-    if (!CBS_get_u8_length_prefixed(cbs, &cookie) ||
-        CBS_len(&cookie) > DTLS1_COOKIE_LENGTH) {
+    if (!CBS_get_u8_length_prefixed(cbs, &cookie)) {
       return false;
     }
   }
@@ -2581,7 +2580,7 @@
 
   assert(CBS_len(&copy) == 0);
   *out = std::move(ret);
-  return 1;
+  return true;
 }
 
 static bool ext_supported_groups_parse_clienthello(SSL_HANDSHAKE *hs,
@@ -3976,6 +3975,16 @@
                                                       : ssl_ticket_aead_error;
   } else if (is_psk && hints && !hs->hints_requested && hints->ignore_psk) {
     result = ssl_ticket_aead_ignore_ticket;
+  } else if (!is_psk && hints && !hs->hints_requested &&
+             !hints->decrypted_ticket.empty()) {
+    if (plaintext.CopyFrom(hints->decrypted_ticket)) {
+      result = ssl_ticket_aead_success;
+      *out_renew_ticket = hints->renew_ticket;
+    } else {
+      result = ssl_ticket_aead_error;
+    }
+  } else if (!is_psk && hints && !hs->hints_requested && hints->ignore_ticket) {
+    result = ssl_ticket_aead_ignore_ticket;
   } else if (ssl->session_ctx->ticket_aead_method != NULL) {
     result = ssl_decrypt_ticket_with_method(hs, &plaintext, out_renew_ticket,
                                             ticket);
@@ -3994,12 +4003,24 @@
     }
   }
 
-  if (is_psk && hints && hs->hints_requested) {
+  if (hints && hs->hints_requested) {
     if (result == ssl_ticket_aead_ignore_ticket) {
-      hints->ignore_psk = true;
-    } else if (result == ssl_ticket_aead_success &&
-               !hints->decrypted_psk.CopyFrom(plaintext)) {
-      return ssl_ticket_aead_error;
+      if (is_psk) {
+        hints->ignore_psk = true;
+      } else {
+        hints->ignore_ticket = true;
+      }
+    } else if (result == ssl_ticket_aead_success) {
+      if (is_psk) {
+        if (!hints->decrypted_psk.CopyFrom(plaintext)) {
+          return ssl_ticket_aead_error;
+        }
+      } else {
+        if (!hints->decrypted_ticket.CopyFrom(plaintext)) {
+          return ssl_ticket_aead_error;
+        }
+        hints->renew_ticket = *out_renew_ticket;
+      }
     }
   }
 
diff --git a/src/ssl/handoff.cc b/src/ssl/handoff.cc
index 883f832..dd24811 100644
--- a/src/ssl/handoff.cc
+++ b/src/ssl/handoff.cc
@@ -17,6 +17,7 @@
 #include <openssl/bytestring.h>
 #include <openssl/err.h>
 
+#include "../crypto/internal.h"
 #include "internal.h"
 
 
@@ -338,14 +339,16 @@
   } else {
     session = s3->session_reused ? ssl->session.get() : hs->new_session.get();
   }
+  uint8_t read_sequence[8], write_sequence[8];
+  CRYPTO_store_u64_be(read_sequence, s3->read_sequence);
+  CRYPTO_store_u64_be(write_sequence, s3->write_sequence);
   static const uint8_t kUnusedChannelID[64] = {0};
   if (!CBB_add_asn1(out, &seq, CBS_ASN1_SEQUENCE) ||
       !CBB_add_asn1_uint64(&seq, kHandbackVersion) ||
       !CBB_add_asn1_uint64(&seq, type) ||
-      !CBB_add_asn1_octet_string(&seq, s3->read_sequence,
-                                 sizeof(s3->read_sequence)) ||
-      !CBB_add_asn1_octet_string(&seq, s3->write_sequence,
-                                 sizeof(s3->write_sequence)) ||
+      !CBB_add_asn1_octet_string(&seq, read_sequence, sizeof(read_sequence)) ||
+      !CBB_add_asn1_octet_string(&seq, write_sequence,
+                                 sizeof(write_sequence)) ||
       !CBB_add_asn1_octet_string(&seq, s3->server_random,
                                  sizeof(s3->server_random)) ||
       !CBB_add_asn1_octet_string(&seq, s3->client_random,
@@ -366,7 +369,7 @@
                                  sizeof(kUnusedChannelID)) ||
       // These two fields were historically |token_binding_negotiated| and
       // |negotiated_token_binding_param|.
-      !CBB_add_asn1_bool(&seq, 0) ||
+      !CBB_add_asn1_bool(&seq, 0) ||  //
       !CBB_add_asn1_uint64(&seq, 0) ||
       !CBB_add_asn1_bool(&seq, s3->hs->next_proto_neg_seen) ||
       !CBB_add_asn1_bool(&seq, s3->hs->cert_request) ||
@@ -694,11 +697,13 @@
       }
       break;
   }
-  if (!CopyExact({s3->read_sequence, sizeof(s3->read_sequence)}, &read_seq) ||
-      !CopyExact({s3->write_sequence, sizeof(s3->write_sequence)},
-                 &write_seq)) {
+  uint8_t read_sequence[8], write_sequence[8];
+  if (!CopyExact(read_sequence, &read_seq) ||
+      !CopyExact(write_sequence, &write_seq)) {
     return false;
   }
+  s3->read_sequence = CRYPTO_load_u64_be(read_sequence);
+  s3->write_sequence = CRYPTO_load_u64_be(write_sequence);
   if (type == handback_after_ecdhe &&
       (hs->key_shares[0] = SSLKeyShare::Create(&key_share)) == nullptr) {
     return false;
@@ -769,16 +774,27 @@
 // implicit tagging to make it a little more compact.
 //
 // HandshakeHints ::= SEQUENCE {
-//     serverRandom            [0] IMPLICIT OCTET STRING OPTIONAL,
+//     serverRandomTLS13       [0] IMPLICIT OCTET STRING OPTIONAL,
 //     keyShareHint            [1] IMPLICIT KeyShareHint OPTIONAL,
 //     signatureHint           [2] IMPLICIT SignatureHint OPTIONAL,
 //     -- At most one of decryptedPSKHint or ignorePSKHint may be present. It
 //     -- corresponds to the first entry in pre_shared_keys. TLS 1.2 session
-//     -- tickets will use a separate hint, to ensure the caller does not mix
-//     -- them up.
+//     -- tickets use a separate hint, to ensure the caller does not apply the
+//     -- hint to the wrong field.
 //     decryptedPSKHint        [3] IMPLICIT OCTET STRING OPTIONAL,
 //     ignorePSKHint           [4] IMPLICIT NULL OPTIONAL,
 //     compressCertificateHint [5] IMPLICIT CompressCertificateHint OPTIONAL,
+//     -- TLS 1.2 and 1.3 use different server random hints because one contains
+//     -- a timestamp while the other doesn't. If the hint was generated
+//     -- assuming TLS 1.3 but we actually negotiate TLS 1.2, mixing the two
+//     -- will break this.
+//     serverRandomTLS12       [6] IMPLICIT OCTET STRING OPTIONAL,
+//     ecdheHint               [7] IMPLICIT ECDHEHint OPTIONAL
+//     -- At most one of decryptedTicketHint or ignoreTicketHint may be present.
+//     -- renewTicketHint requires decryptedTicketHint.
+//     decryptedTicketHint     [8] IMPLICIT OCTET STRING OPTIONAL,
+//     renewTicketHint         [9] IMPLICIT NULL OPTIONAL,
+//     ignoreTicketHint       [10] IMPLICIT NULL OPTIONAL,
 // }
 //
 // KeyShareHint ::= SEQUENCE {
@@ -799,9 +815,15 @@
 //     input                   OCTET STRING,
 //     compressed              OCTET STRING,
 // }
+//
+// ECDHEHint ::= SEQUENCE {
+//     groupId                 INTEGER,
+//     publicKey               OCTET STRING,
+//     privateKey              OCTET STRING,
+// }
 
 // HandshakeHints tags.
-static const unsigned kServerRandomTag = CBS_ASN1_CONTEXT_SPECIFIC | 0;
+static const unsigned kServerRandomTLS13Tag = CBS_ASN1_CONTEXT_SPECIFIC | 0;
 static const unsigned kKeyShareHintTag =
     CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1;
 static const unsigned kSignatureHintTag =
@@ -809,6 +831,11 @@
 static const unsigned kDecryptedPSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 3;
 static const unsigned kIgnorePSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 4;
 static const unsigned kCompressCertificateTag = CBS_ASN1_CONTEXT_SPECIFIC | 5;
+static const unsigned kServerRandomTLS12Tag = CBS_ASN1_CONTEXT_SPECIFIC | 6;
+static const unsigned kECDHEHintTag = CBS_ASN1_CONSTRUCTED | 7;
+static const unsigned kDecryptedTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 8;
+static const unsigned kRenewTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 9;
+static const unsigned kIgnoreTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 10;
 
 int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out) {
   const SSL_HANDSHAKE *hs = ssl->s3->hs.get();
@@ -823,10 +850,10 @@
     return 0;
   }
 
-  if (!hints->server_random.empty()) {
-    if (!CBB_add_asn1(&seq, &child, kServerRandomTag) ||
-        !CBB_add_bytes(&child, hints->server_random.data(),
-                       hints->server_random.size())) {
+  if (!hints->server_random_tls13.empty()) {
+    if (!CBB_add_asn1(&seq, &child, kServerRandomTLS13Tag) ||
+        !CBB_add_bytes(&child, hints->server_random_tls13.data(),
+                       hints->server_random_tls13.size())) {
       return 0;
     }
   }
@@ -884,9 +911,60 @@
     }
   }
 
+  if (!hints->server_random_tls12.empty()) {
+    if (!CBB_add_asn1(&seq, &child, kServerRandomTLS12Tag) ||
+        !CBB_add_bytes(&child, hints->server_random_tls12.data(),
+                       hints->server_random_tls12.size())) {
+      return 0;
+    }
+  }
+
+  if (hints->ecdhe_group_id != 0 && !hints->ecdhe_public_key.empty() &&
+      !hints->ecdhe_private_key.empty()) {
+    if (!CBB_add_asn1(&seq, &child, kECDHEHintTag) ||
+        !CBB_add_asn1_uint64(&child, hints->ecdhe_group_id) ||
+        !CBB_add_asn1_octet_string(&child, hints->ecdhe_public_key.data(),
+                                   hints->ecdhe_public_key.size()) ||
+        !CBB_add_asn1_octet_string(&child, hints->ecdhe_private_key.data(),
+                                   hints->ecdhe_private_key.size())) {
+      return 0;
+    }
+  }
+
+
+  if (!hints->decrypted_ticket.empty()) {
+    if (!CBB_add_asn1(&seq, &child, kDecryptedTicketTag) ||
+        !CBB_add_bytes(&child, hints->decrypted_ticket.data(),
+                       hints->decrypted_ticket.size())) {
+      return 0;
+    }
+  }
+
+  if (hints->renew_ticket &&  //
+      !CBB_add_asn1(&seq, &child, kRenewTicketTag)) {
+    return 0;
+  }
+
+  if (hints->ignore_ticket &&  //
+      !CBB_add_asn1(&seq, &child, kIgnoreTicketTag)) {
+    return 0;
+  }
+
   return CBB_flush(out);
 }
 
+static bool get_optional_implicit_null(CBS *cbs, bool *out_present,
+                                       unsigned tag) {
+  CBS value;
+  int present;
+  if (!CBS_get_optional_asn1(cbs, &value, &present, tag) ||
+      (present && CBS_len(&value) != 0)) {
+    return false;
+  }
+  *out_present = present;
+  return true;
+}
+
 int SSL_set_handshake_hints(SSL *ssl, const uint8_t *hints, size_t hints_len) {
   if (SSL_is_dtls(ssl)) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
@@ -898,28 +976,37 @@
     return 0;
   }
 
-  CBS cbs, seq, server_random, key_share, signature_hint, ticket, ignore_psk,
-      cert_compression;
-  int has_server_random, has_key_share, has_signature_hint, has_ticket,
-      has_ignore_psk, has_cert_compression;
+  CBS cbs, seq, server_random_tls13, key_share, signature_hint, psk,
+      cert_compression, server_random_tls12, ecdhe, ticket;
+  int has_server_random_tls13, has_key_share, has_signature_hint, has_psk,
+      has_cert_compression, has_server_random_tls12, has_ecdhe, has_ticket;
   CBS_init(&cbs, hints, hints_len);
   if (!CBS_get_asn1(&cbs, &seq, CBS_ASN1_SEQUENCE) ||
-      !CBS_get_optional_asn1(&seq, &server_random, &has_server_random,
-                             kServerRandomTag) ||
+      !CBS_get_optional_asn1(&seq, &server_random_tls13,
+                             &has_server_random_tls13, kServerRandomTLS13Tag) ||
       !CBS_get_optional_asn1(&seq, &key_share, &has_key_share,
                              kKeyShareHintTag) ||
       !CBS_get_optional_asn1(&seq, &signature_hint, &has_signature_hint,
                              kSignatureHintTag) ||
-      !CBS_get_optional_asn1(&seq, &ticket, &has_ticket, kDecryptedPSKTag) ||
-      !CBS_get_optional_asn1(&seq, &ignore_psk, &has_ignore_psk,
-                             kIgnorePSKTag) ||
+      !CBS_get_optional_asn1(&seq, &psk, &has_psk, kDecryptedPSKTag) ||
+      !get_optional_implicit_null(&seq, &hints_obj->ignore_psk,
+                                  kIgnorePSKTag) ||
       !CBS_get_optional_asn1(&seq, &cert_compression, &has_cert_compression,
-                             kCompressCertificateTag)) {
+                             kCompressCertificateTag) ||
+      !CBS_get_optional_asn1(&seq, &server_random_tls12,
+                             &has_server_random_tls12, kServerRandomTLS12Tag) ||
+      !CBS_get_optional_asn1(&seq, &ecdhe, &has_ecdhe, kECDHEHintTag) ||
+      !CBS_get_optional_asn1(&seq, &ticket, &has_ticket, kDecryptedTicketTag) ||
+      !get_optional_implicit_null(&seq, &hints_obj->renew_ticket,
+                                  kRenewTicketTag) ||
+      !get_optional_implicit_null(&seq, &hints_obj->ignore_ticket,
+                                  kIgnoreTicketTag)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
     return 0;
   }
 
-  if (has_server_random && !hints_obj->server_random.CopyFrom(server_random)) {
+  if (has_server_random_tls13 &&
+      !hints_obj->server_random_tls13.CopyFrom(server_random_tls13)) {
     return 0;
   }
 
@@ -955,15 +1042,12 @@
     hints_obj->signature_algorithm = static_cast<uint16_t>(sig_alg);
   }
 
-  if (has_ticket && !hints_obj->decrypted_psk.CopyFrom(ticket)) {
+  if (has_psk && !hints_obj->decrypted_psk.CopyFrom(psk)) {
     return 0;
   }
-
-  if (has_ignore_psk) {
-    if (CBS_len(&ignore_psk) != 0) {
-      return 0;
-    }
-    hints_obj->ignore_psk = true;
+  if (has_psk && hints_obj->ignore_psk) {
+    OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
+    return 0;
   }
 
   if (has_cert_compression) {
@@ -981,6 +1065,38 @@
     hints_obj->cert_compression_alg_id = static_cast<uint16_t>(alg);
   }
 
+  if (has_server_random_tls12 &&
+      !hints_obj->server_random_tls12.CopyFrom(server_random_tls12)) {
+    return 0;
+  }
+
+  if (has_ecdhe) {
+    uint64_t group_id;
+    CBS public_key, private_key;
+    if (!CBS_get_asn1_uint64(&ecdhe, &group_id) ||  //
+        group_id == 0 || group_id > 0xffff ||
+        !CBS_get_asn1(&ecdhe, &public_key, CBS_ASN1_OCTETSTRING) ||
+        !hints_obj->ecdhe_public_key.CopyFrom(public_key) ||
+        !CBS_get_asn1(&ecdhe, &private_key, CBS_ASN1_OCTETSTRING) ||
+        !hints_obj->ecdhe_private_key.CopyFrom(private_key)) {
+      OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
+      return 0;
+    }
+    hints_obj->ecdhe_group_id = static_cast<uint16_t>(group_id);
+  }
+
+  if (has_ticket && !hints_obj->decrypted_ticket.CopyFrom(ticket)) {
+    return 0;
+  }
+  if (has_ticket && hints_obj->ignore_ticket) {
+    OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
+    return 0;
+  }
+  if (!has_ticket && hints_obj->renew_ticket) {
+    OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS);
+    return 0;
+  }
+
   ssl->s3->hs->hints = std::move(hints_obj);
   return 1;
 }
diff --git a/src/ssl/handshake.cc b/src/ssl/handshake.cc
index fc85e21..8d5a238 100644
--- a/src/ssl/handshake.cc
+++ b/src/ssl/handshake.cc
@@ -528,20 +528,20 @@
   size_t finished_len;
   if (!hs->transcript.GetFinishedMAC(finished, &finished_len, session,
                                      ssl->server)) {
-    return 0;
+    return false;
   }
 
   // Log the master secret, if logging is enabled.
   if (!ssl_log_secret(ssl, "CLIENT_RANDOM",
                       MakeConstSpan(session->secret, session->secret_length))) {
-    return 0;
+    return false;
   }
 
   // Copy the Finished so we can use it for renegotiation checks.
   if (finished_len > sizeof(ssl->s3->previous_client_finished) ||
       finished_len > sizeof(ssl->s3->previous_server_finished)) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return 0;
+    return false;
   }
 
   if (ssl->server) {
@@ -558,10 +558,10 @@
       !CBB_add_bytes(&body, finished, finished_len) ||
       !ssl_add_message_cbb(ssl, cbb.get())) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return 0;
+    return false;
   }
 
-  return 1;
+  return true;
 }
 
 bool ssl_output_cert_chain(SSL_HANDSHAKE *hs) {
diff --git a/src/ssl/handshake_client.cc b/src/ssl/handshake_client.cc
index 17b41e0..0a41ffe 100644
--- a/src/ssl/handshake_client.cc
+++ b/src/ssl/handshake_client.cc
@@ -235,16 +235,22 @@
   // Add TLS 1.3 ciphers. Order ChaCha20-Poly1305 relative to AES-GCM based on
   // hardware support.
   if (hs->max_version >= TLS1_3_VERSION) {
-    if (!EVP_has_aes_hardware() &&
-        !CBB_add_u16(&child, TLS1_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
+    const bool include_chacha20 = ssl_tls13_cipher_meets_policy(
+        TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff,
+        ssl->config->only_fips_cipher_suites_in_tls13);
+
+    if (!EVP_has_aes_hardware() &&  //
+        include_chacha20 &&         //
+        !CBB_add_u16(&child, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
       return false;
     }
-    if (!CBB_add_u16(&child, TLS1_CK_AES_128_GCM_SHA256 & 0xffff) ||
-        !CBB_add_u16(&child, TLS1_CK_AES_256_GCM_SHA384 & 0xffff)) {
+    if (!CBB_add_u16(&child, TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff) ||
+        !CBB_add_u16(&child, TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff)) {
       return false;
     }
-    if (EVP_has_aes_hardware() &&
-        !CBB_add_u16(&child, TLS1_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
+    if (EVP_has_aes_hardware() &&  //
+        include_chacha20 &&        //
+        !CBB_add_u16(&child, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
       return false;
     }
   }
@@ -307,7 +313,8 @@
 
   if (SSL_is_dtls(ssl)) {
     if (!CBB_add_u8_length_prefixed(cbb, &child) ||
-        !CBB_add_bytes(&child, ssl->d1->cookie, ssl->d1->cookie_len)) {
+        !CBB_add_bytes(&child, hs->dtls_cookie.data(),
+                       hs->dtls_cookie.size())) {
       return false;
     }
   }
@@ -331,7 +338,7 @@
   Array<uint8_t> msg;
   if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_CLIENT_HELLO) ||
       !ssl_write_client_hello_without_extensions(hs, &body, type,
-                                                 /*empty_session_id*/ false) ||
+                                                 /*empty_session_id=*/false) ||
       !ssl_add_clienthello_tlsext(hs, &body, /*out_encoded=*/nullptr,
                                   &needs_psk_binder, type, CBB_len(&body)) ||
       !ssl->method->finish_message(ssl, cbb.get(), &msg)) {
@@ -620,15 +627,16 @@
   uint16_t server_version;
   if (!CBS_get_u16(&hello_verify_request, &server_version) ||
       !CBS_get_u8_length_prefixed(&hello_verify_request, &cookie) ||
-      CBS_len(&cookie) > sizeof(ssl->d1->cookie) ||
       CBS_len(&hello_verify_request) != 0) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
     return ssl_hs_error;
   }
 
-  OPENSSL_memcpy(ssl->d1->cookie, CBS_data(&cookie), CBS_len(&cookie));
-  ssl->d1->cookie_len = CBS_len(&cookie);
+  if (!hs->dtls_cookie.CopyFrom(cookie)) {
+    ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
+    return ssl_hs_error;
+  }
 
   ssl->method->next_message(ssl);
 
diff --git a/src/ssl/handshake_server.cc b/src/ssl/handshake_server.cc
index fdf9511..fa6e9d6 100644
--- a/src/ssl/handshake_server.cc
+++ b/src/ssl/handshake_server.cc
@@ -411,14 +411,14 @@
   // JDK 11 does not support ChaCha20-Poly1305. This is unusual: many modern
   // clients implement ChaCha20-Poly1305.
   if (ssl_client_cipher_list_contains_cipher(
-          client_hello, TLS1_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
+          client_hello, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) {
     return false;
   }
 
   // JDK 11 always sends extensions in a particular order.
   constexpr uint16_t kMaxFragmentLength = 0x0001;
   constexpr uint16_t kStatusRequestV2 = 0x0011;
-  static CONSTEXPR_ARRAY struct {
+  static constexpr struct {
     uint16_t id;
     bool required;
   } kJavaExtensions[] = {
@@ -554,29 +554,22 @@
       ERR_clear_error();
       continue;
     }
-    Array<uint8_t> encoded_client_hello_inner;
     bool is_decrypt_error;
-    if (!ssl_client_hello_decrypt(hs->ech_hpke_ctx.get(),
-                                  &encoded_client_hello_inner,
-                                  &is_decrypt_error, client_hello, payload)) {
+    if (!ssl_client_hello_decrypt(hs, out_alert, &is_decrypt_error,
+                                  &hs->ech_client_hello_buf, client_hello,
+                                  payload)) {
       if (is_decrypt_error) {
         // Ignore the error and try another ECHConfig.
         ERR_clear_error();
+        // The |out_alert| calling convention currently relies on a default of
+        // |SSL_AD_DECODE_ERROR|. https://crbug.com/boringssl/373 tracks
+        // switching to sum types, which avoids this.
+        *out_alert = SSL_AD_DECODE_ERROR;
         continue;
       }
       OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
       return false;
     }
-
-    // Recover the ClientHelloInner from the EncodedClientHelloInner.
-    bssl::Array<uint8_t> client_hello_inner;
-    if (!ssl_decode_client_hello_inner(ssl, out_alert, &client_hello_inner,
-                                       encoded_client_hello_inner,
-                                       client_hello)) {
-      OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
-      return false;
-    }
-    hs->ech_client_hello_buf = std::move(client_hello_inner);
     hs->ech_config_id = config_id;
     ssl->s3->ech_status = ssl_ech_accepted;
     return true;
@@ -808,12 +801,6 @@
   // or below.
   assert(ssl->s3->ech_status != ssl_ech_accepted);
 
-  // TODO(davidben): Also compute hints for TLS 1.2. When doing so, update the
-  // check in bssl_shim.cc to test this.
-  if (hs->hints_requested) {
-    return ssl_hs_hints_ready;
-  }
-
   ssl->s3->early_data_reason = ssl_early_data_protocol_version;
 
   SSLMessage msg_unused;
@@ -995,14 +982,23 @@
     hs->channel_id_negotiated = false;
   }
 
-  struct OPENSSL_timeval now;
-  ssl_get_current_time(ssl, &now);
-  ssl->s3->server_random[0] = now.tv_sec >> 24;
-  ssl->s3->server_random[1] = now.tv_sec >> 16;
-  ssl->s3->server_random[2] = now.tv_sec >> 8;
-  ssl->s3->server_random[3] = now.tv_sec;
-  if (!RAND_bytes(ssl->s3->server_random + 4, SSL3_RANDOM_SIZE - 4)) {
-    return ssl_hs_error;
+  SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
+  if (hints && !hs->hints_requested &&
+      hints->server_random_tls12.size() == SSL3_RANDOM_SIZE) {
+    OPENSSL_memcpy(ssl->s3->server_random, hints->server_random_tls12.data(),
+                   SSL3_RANDOM_SIZE);
+  } else {
+    struct OPENSSL_timeval now;
+    ssl_get_current_time(ssl, &now);
+    CRYPTO_store_u32_be(ssl->s3->server_random,
+                        static_cast<uint32_t>(now.tv_sec));
+    if (!RAND_bytes(ssl->s3->server_random + 4, SSL3_RANDOM_SIZE - 4)) {
+      return ssl_hs_error;
+    }
+    if (hints && hs->hints_requested &&
+        !hints->server_random_tls12.CopyFrom(ssl->s3->server_random)) {
+      return ssl_hs_error;
+    }
   }
 
   // Implement the TLS 1.3 anti-downgrade feature.
@@ -1047,7 +1043,11 @@
     return ssl_hs_error;
   }
 
-  if (ssl->session != NULL) {
+  if (ssl->session != nullptr) {
+    // No additional hints to generate in resumption.
+    if (hs->hints_requested) {
+      return ssl_hs_hints_ready;
+    }
     hs->state = state12_send_server_finished;
   } else {
     hs->state = state12_send_server_certificate;
@@ -1120,18 +1120,51 @@
         OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
         ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
         return ssl_hs_error;
-       }
+      }
       hs->new_session->group_id = group_id;
 
-      // Set up ECDH, generate a key, and emit the public half.
       hs->key_shares[0] = SSLKeyShare::Create(group_id);
       if (!hs->key_shares[0] ||
           !CBB_add_u8(cbb.get(), NAMED_CURVE_TYPE) ||
           !CBB_add_u16(cbb.get(), group_id) ||
-          !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
-          !hs->key_shares[0]->Offer(&child)) {
+          !CBB_add_u8_length_prefixed(cbb.get(), &child)) {
         return ssl_hs_error;
       }
+
+      SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
+      bool hint_ok = false;
+      if (hints && !hs->hints_requested &&
+          hints->ecdhe_group_id == group_id &&
+          !hints->ecdhe_public_key.empty() &&
+          !hints->ecdhe_private_key.empty()) {
+        CBS cbs = MakeConstSpan(hints->ecdhe_private_key);
+        hint_ok = hs->key_shares[0]->DeserializePrivateKey(&cbs);
+      }
+      if (hint_ok) {
+        // Reuse the ECDH key from handshake hints.
+        if (!CBB_add_bytes(&child, hints->ecdhe_public_key.data(),
+                           hints->ecdhe_public_key.size())) {
+          return ssl_hs_error;
+        }
+      } else {
+        // Generate a key, and emit the public half.
+        if (!hs->key_shares[0]->Offer(&child)) {
+          return ssl_hs_error;
+        }
+        // If generating hints, save the ECDHE key.
+        if (hints && hs->hints_requested) {
+          bssl::ScopedCBB private_key_cbb;
+          if (!hints->ecdhe_public_key.CopyFrom(
+                  MakeConstSpan(CBB_data(&child), CBB_len(&child))) ||
+              !CBB_init(private_key_cbb.get(), 32) ||
+              !hs->key_shares[0]->SerializePrivateKey(private_key_cbb.get()) ||
+              !CBBFinishArray(private_key_cbb.get(),
+                              &hints->ecdhe_private_key)) {
+            return ssl_hs_error;
+          }
+          hints->ecdhe_group_id = group_id;
+        }
+      }
     } else {
       assert(alg_k & SSL_kPSK);
     }
@@ -1221,6 +1254,9 @@
 
 static enum ssl_hs_wait_t do_send_server_hello_done(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
+  if (hs->hints_requested) {
+    return ssl_hs_hints_ready;
+  }
 
   ScopedCBB cbb;
   CBB body;
@@ -1311,7 +1347,7 @@
     hs->new_session->verify_result = X509_V_OK;
   } else if (hs->config->retain_only_sha256_of_client_certs) {
     // The hash will have been filled in.
-    hs->new_session->peer_sha256_valid = 1;
+    hs->new_session->peer_sha256_valid = true;
   }
 
   ssl->method->next_message(ssl);
diff --git a/src/ssl/internal.h b/src/ssl/internal.h
index 5196f17..8ef1509 100644
--- a/src/ssl/internal.h
+++ b/src/ssl/internal.h
@@ -216,7 +216,7 @@
 // may be C structs which require a |BORINGSSL_MAKE_DELETER| registration.
 namespace internal {
 template <typename T>
-struct DeleterImpl<T, typename std::enable_if<T::kAllowUniquePtr>::type> {
+struct DeleterImpl<T, std::enable_if_t<T::kAllowUniquePtr>> {
   static void Free(T *t) { Delete(t); }
 };
 }  // namespace internal
@@ -245,14 +245,6 @@
   { abort(); }
 #endif
 
-// CONSTEXPR_ARRAY works around a VS 2015 bug where ranged for loops don't work
-// on constexpr arrays.
-#if defined(_MSC_VER) && !defined(__clang__) && _MSC_VER < 1910
-#define CONSTEXPR_ARRAY const
-#else
-#define CONSTEXPR_ARRAY constexpr
-#endif
-
 // Array<T> is an owning array of elements of |T|.
 template <typename T>
 class Array {
@@ -668,10 +660,15 @@
 size_t ssl_cipher_get_record_split_len(const SSL_CIPHER *cipher);
 
 // ssl_choose_tls13_cipher returns an |SSL_CIPHER| corresponding with the best
-// available from |cipher_suites| compatible with |version| and |group_id|. It
-// returns NULL if there isn't a compatible cipher.
+// available from |cipher_suites| compatible with |version|, |group_id|, and
+// |only_fips|. It returns NULL if there isn't a compatible cipher.
 const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, uint16_t version,
-                                          uint16_t group_id);
+                                          uint16_t group_id, bool only_fips);
+
+// ssl_tls13_cipher_meets_policy returns true if |cipher_id| is acceptable given
+// |only_fips|. (For now there's only a single policy and so the policy argument
+// is just a bool.)
+bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, bool only_fips);
 
 
 // Transcript layer.
@@ -832,15 +829,14 @@
   // to the plaintext in |in| and returns true.  Otherwise, it returns
   // false. The output will always be |ExplicitNonceLen| bytes ahead of |in|.
   bool Open(Span<uint8_t> *out, uint8_t type, uint16_t record_version,
-            const uint8_t seqnum[8], Span<const uint8_t> header,
-            Span<uint8_t> in);
+            uint64_t seqnum, Span<const uint8_t> header, Span<uint8_t> in);
 
   // Seal encrypts and authenticates |in_len| bytes from |in| and writes the
   // result to |out|. It returns true on success and false on error.
   //
   // If |in| and |out| alias then |out| + |ExplicitNonceLen| must be == |in|.
   bool Seal(uint8_t *out, size_t *out_len, size_t max_out, uint8_t type,
-            uint16_t record_version, const uint8_t seqnum[8],
+            uint16_t record_version, uint64_t seqnum,
             Span<const uint8_t> header, const uint8_t *in, size_t in_len);
 
   // SealScatter encrypts and authenticates |in_len| bytes from |in| and splits
@@ -859,10 +855,9 @@
   // If |in| and |out| alias then |out| must be == |in|. Other arguments may not
   // alias anything.
   bool SealScatter(uint8_t *out_prefix, uint8_t *out, uint8_t *out_suffix,
-                   uint8_t type, uint16_t record_version,
-                   const uint8_t seqnum[8], Span<const uint8_t> header,
-                   const uint8_t *in, size_t in_len, const uint8_t *extra_in,
-                   size_t extra_in_len);
+                   uint8_t type, uint16_t record_version, uint64_t seqnum,
+                   Span<const uint8_t> header, const uint8_t *in, size_t in_len,
+                   const uint8_t *extra_in, size_t extra_in_len);
 
   bool GetIV(const uint8_t **out_iv, size_t *out_iv_len) const;
 
@@ -871,8 +866,7 @@
   // necessary.
   Span<const uint8_t> GetAdditionalData(uint8_t storage[13], uint8_t type,
                                         uint16_t record_version,
-                                        const uint8_t seqnum[8],
-                                        size_t plaintext_len,
+                                        uint64_t seqnum, size_t plaintext_len,
                                         Span<const uint8_t> header);
 
   const SSL_CIPHER *cipher_;
@@ -919,10 +913,6 @@
 
 // Record layer.
 
-// ssl_record_sequence_update increments the sequence number in |seq|. It
-// returns true on success and false on wraparound.
-bool ssl_record_sequence_update(uint8_t *seq, size_t seq_len);
-
 // ssl_record_prefix_len returns the length of the prefix before the ciphertext
 // of a record for |ssl|.
 //
@@ -1184,12 +1174,10 @@
   DTLS_OUTGOING_MESSAGE() {}
   DTLS_OUTGOING_MESSAGE(const DTLS_OUTGOING_MESSAGE &) = delete;
   DTLS_OUTGOING_MESSAGE &operator=(const DTLS_OUTGOING_MESSAGE &) = delete;
-  ~DTLS_OUTGOING_MESSAGE() { Clear(); }
 
   void Clear();
 
-  uint8_t *data = nullptr;
-  uint32_t len = 0;
+  Array<uint8_t> data;
   uint16_t epoch = 0;
   bool is_ccs = false;
 };
@@ -1498,17 +1486,19 @@
 // ClientHelloOuter |client_hello_outer|. If successful, it writes the recovered
 // ClientHelloInner to |out_client_hello_inner|. It returns true on success and
 // false on failure.
+//
+// This function is exported for fuzzing.
 OPENSSL_EXPORT bool ssl_decode_client_hello_inner(
     SSL *ssl, uint8_t *out_alert, Array<uint8_t> *out_client_hello_inner,
     Span<const uint8_t> encoded_client_hello_inner,
     const SSL_CLIENT_HELLO *client_hello_outer);
 
-// ssl_client_hello_decrypt attempts to decrypt the |payload| and writes the
-// result to |*out|. |payload| must point into |client_hello_outer|. It returns
-// true on success and false on error. On error, it sets |*out_is_decrypt_error|
-// to whether the failure was due to a bad ciphertext.
-bool ssl_client_hello_decrypt(EVP_HPKE_CTX *hpke_ctx, Array<uint8_t> *out,
-                              bool *out_is_decrypt_error,
+// ssl_client_hello_decrypt attempts to decrypt and decode the |payload|. It
+// writes the result to |*out|. |payload| must point into |client_hello_outer|.
+// It returns true on success and false on error. On error, it sets
+// |*out_is_decrypt_error| to whether the failure was due to a bad ciphertext.
+bool ssl_client_hello_decrypt(SSL_HANDSHAKE *hs, uint8_t *out_alert,
+                              bool *out_is_decrypt_error, Array<uint8_t> *out,
                               const SSL_CLIENT_HELLO *client_hello_outer,
                               Span<const uint8_t> payload);
 
@@ -1698,7 +1688,8 @@
 struct SSL_HANDSHAKE_HINTS {
   static constexpr bool kAllowUniquePtr = true;
 
-  Array<uint8_t> server_random;
+  Array<uint8_t> server_random_tls12;
+  Array<uint8_t> server_random_tls13;
 
   uint16_t key_share_group_id = 0;
   Array<uint8_t> key_share_public_key;
@@ -1715,6 +1706,14 @@
   uint16_t cert_compression_alg_id = 0;
   Array<uint8_t> cert_compression_input;
   Array<uint8_t> cert_compression_output;
+
+  uint16_t ecdhe_group_id = 0;
+  Array<uint8_t> ecdhe_public_key;
+  Array<uint8_t> ecdhe_private_key;
+
+  Array<uint8_t> decrypted_ticket;
+  bool renew_ticket = false;
+  bool ignore_ticket = false;
 };
 
 struct SSL_HANDSHAKE {
@@ -1829,9 +1828,15 @@
   // ClientHelloInner.
   uint8_t inner_client_random[SSL3_RANDOM_SIZE] = {0};
 
-  // cookie is the value of the cookie received from the server, if any.
+  // cookie is the value of the cookie in HelloRetryRequest, or empty if none
+  // was received.
   Array<uint8_t> cookie;
 
+  // dtls_cookie is the value of the cookie in DTLS HelloVerifyRequest. If
+  // empty, either none was received or HelloVerifyRequest contained an empty
+  // cookie.
+  Array<uint8_t> dtls_cookie;
+
   // ech_client_outer contains the outer ECH extension to send in the
   // ClientHello, excluding the header and type byte.
   Array<uint8_t> ech_client_outer;
@@ -2062,6 +2067,11 @@
   uint8_t grease_seed[ssl_grease_last_index + 1] = {0};
 };
 
+// kMaxTickets is the maximum number of tickets to send immediately after the
+// handshake. We use a one-byte ticket nonce, and there is no point in sending
+// so many tickets.
+constexpr size_t kMaxTickets = 16;
+
 UniquePtr<SSL_HANDSHAKE> ssl_handshake_new(SSL *ssl);
 
 // ssl_check_message_type checks if |msg| has type |type|. If so it returns
@@ -2447,8 +2457,13 @@
   ssl_open_record_t (*open_app_data)(SSL *ssl, Span<uint8_t> *out,
                                      size_t *out_consumed, uint8_t *out_alert,
                                      Span<uint8_t> in);
-  int (*write_app_data)(SSL *ssl, bool *out_needs_handshake, const uint8_t *buf,
-                        int len);
+  // write_app_data encrypts and writes |in| as application data. On success, it
+  // returns one and sets |*out_bytes_written| to the number of bytes of |in|
+  // written. Otherwise, it returns <= 0 and sets |*out_needs_handshake| to
+  // whether the operation failed because the caller needs to drive the
+  // handshake.
+  int (*write_app_data)(SSL *ssl, bool *out_needs_handshake,
+                        size_t *out_bytes_written, Span<const uint8_t> in);
   int (*dispatch_alert)(SSL *ssl);
   // init_message begins a new handshake message of type |type|. |cbb| is the
   // root CBB to be passed into |finish_message|. |*body| is set to a child CBB
@@ -2622,8 +2637,8 @@
   SSL3_STATE();
   ~SSL3_STATE();
 
-  uint8_t read_sequence[8] = {0};
-  uint8_t write_sequence[8] = {0};
+  uint64_t read_sequence = 0;
+  uint64_t write_sequence = 0;
 
   uint8_t server_random[SSL3_RANDOM_SIZE] = {0};
   uint8_t client_random[SSL3_RANDOM_SIZE] = {0};
@@ -2637,12 +2652,23 @@
   // |read_buffer|.
   Span<uint8_t> pending_app_data;
 
-  // partial write - check the numbers match
-  unsigned int wnum = 0;  // number of bytes sent so far
-  int wpend_tot = 0;      // number bytes written
-  int wpend_type = 0;
-  int wpend_ret = 0;  // number of bytes submitted
-  const uint8_t *wpend_buf = nullptr;
+  // unreported_bytes_written is the number of bytes successfully written to the
+  // transport, but not yet reported to the caller. The next |SSL_write| will
+  // skip this many bytes from the input. This is used if
+  // |SSL_MODE_ENABLE_PARTIAL_WRITE| is disabled, in which case |SSL_write| only
+  // reports bytes written when the full caller input is written.
+  size_t unreported_bytes_written = 0;
+
+  // pending_write, if |has_pending_write| is true, is the caller-supplied data
+  // corresponding to the current pending write. This is used to check the
+  // caller retried with a compatible buffer.
+  Span<const uint8_t> pending_write;
+
+  // pending_write_type, if |has_pending_write| is true, is the record type
+  // for the current pending write.
+  //
+  // TODO(davidben): Remove this when alerts are moved out of this write path.
+  uint8_t pending_write_type = 0;
 
   // read_shutdown is the shutdown state for the read half of the connection.
   enum ssl_shutdown_t read_shutdown = ssl_shutdown_none;
@@ -2722,9 +2748,6 @@
   // outstanding.
   bool key_update_pending : 1;
 
-  // wpend_pending is true if we have a pending write outstanding.
-  bool wpend_pending : 1;
-
   // early_data_accepted is true if early data was accepted by the server.
   bool early_data_accepted : 1;
 
@@ -2828,8 +2851,6 @@
 };
 
 // lengths of messages
-#define DTLS1_COOKIE_LENGTH 256
-
 #define DTLS1_RT_HEADER_LENGTH 13
 
 #define DTLS1_HM_HEADER_LENGTH 12
@@ -2895,9 +2916,6 @@
   // peer sent the final flight.
   bool flight_has_reply : 1;
 
-  uint8_t cookie[DTLS1_COOKIE_LENGTH] = {0};
-  size_t cookie_len = 0;
-
   // The current data and handshake epoch.  This is initially undefined, and
   // starts at zero once the initial handshake is completed.
   uint16_t r_epoch = 0;
@@ -2910,7 +2928,7 @@
   uint16_t handshake_read_seq = 0;
 
   // save last sequence number for retransmissions
-  uint8_t last_write_sequence[8] = {0};
+  uint64_t last_write_sequence = 0;
   UniquePtr<SSLAEADContext> last_aead_write_ctx;
 
   // incoming_messages is a ring buffer of incoming handshake messages that have
@@ -3088,6 +3106,10 @@
 
   // permute_extensions is whether to permute extensions when sending messages.
   bool permute_extensions : 1;
+
+  // only_fips_cipher_suites_in_tls13 constrains the selection of cipher suites
+  // in TLS 1.3 such that only FIPS approved ones will be selected.
+  bool only_fips_cipher_suites_in_tls13 : 1;
 };
 
 // From RFC 8446, used in determining PSK modes.
@@ -3205,8 +3227,8 @@
 ssl_open_record_t tls_open_change_cipher_spec(SSL *ssl, size_t *out_consumed,
                                               uint8_t *out_alert,
                                               Span<uint8_t> in);
-int tls_write_app_data(SSL *ssl, bool *out_needs_handshake, const uint8_t *buf,
-                       int len);
+int tls_write_app_data(SSL *ssl, bool *out_needs_handshake,
+                       size_t *out_bytes_written, Span<const uint8_t> in);
 
 bool tls_new(SSL *ssl);
 void tls_free(SSL *ssl);
@@ -3239,11 +3261,11 @@
                                                 Span<uint8_t> in);
 
 int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
-                         const uint8_t *buf, int len);
+                         size_t *out_bytes_written, Span<const uint8_t> in);
 
 // dtls1_write_record sends a record. It returns one on success and <= 0 on
 // error.
-int dtls1_write_record(SSL *ssl, int type, const uint8_t *buf, size_t len,
+int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
                        enum dtls1_use_epoch_t use_epoch);
 
 int dtls1_retransmit_outgoing_messages(SSL *ssl);
@@ -3422,6 +3444,11 @@
   // and is further constrainted by |SSL_OP_NO_*|.
   uint16_t conf_min_version = 0;
 
+  // num_tickets is the number of tickets to send immediately after the TLS 1.3
+  // handshake. TLS 1.3 recommends single-use tickets so, by default, issue two
+  /// in case the client makes several connections before getting a renewal.
+  uint8_t num_tickets = 2;
+
   // quic_method is the method table corresponding to the QUIC hooks.
   const SSL_QUIC_METHOD *quic_method = nullptr;
 
@@ -3511,7 +3538,7 @@
   bssl::UniquePtr<bssl::CERT> cert;
 
   // callback that allows applications to peek at protocol messages
-  void (*msg_callback)(int write_p, int version, int content_type,
+  void (*msg_callback)(int is_write, int version, int content_type,
                        const void *buf, size_t len, SSL *ssl,
                        void *arg) = nullptr;
   void *msg_callback_arg = nullptr;
@@ -3690,6 +3717,10 @@
   // If enable_early_data is true, early data can be sent and accepted.
   bool enable_early_data : 1;
 
+  // only_fips_cipher_suites_in_tls13 constrains the selection of cipher suites
+  // in TLS 1.3 such that only FIPS approved ones will be selected.
+  bool only_fips_cipher_suites_in_tls13 : 1;
+
  private:
   ~ssl_ctx_st();
   friend OPENSSL_EXPORT void SSL_CTX_free(SSL_CTX *);
diff --git a/src/ssl/s3_both.cc b/src/ssl/s3_both.cc
index cddeb3f..cb831f2 100644
--- a/src/ssl/s3_both.cc
+++ b/src/ssl/s3_both.cc
@@ -691,8 +691,25 @@
   const bool security_128_is_fine_;
 };
 
+bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, bool only_fips) {
+  if (!only_fips) {
+    return true;
+  }
+
+  switch (cipher_id) {
+    case TLS1_3_CK_AES_128_GCM_SHA256 & 0xffff:
+    case TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff:
+      return true;
+    case TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff:
+      return false;
+    default:
+      assert(false);
+      return false;
+  }
+}
+
 const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, uint16_t version,
-                                          uint16_t group_id) {
+                                          uint16_t group_id, bool only_fips) {
   if (CBS_len(&cipher_suites) % 2 != 0) {
     return nullptr;
   }
@@ -715,6 +732,11 @@
       continue;
     }
 
+    if (!ssl_tls13_cipher_meets_policy(SSL_CIPHER_get_protocol_id(candidate),
+                                       only_fips)) {
+      continue;
+    }
+
     const CipherScorer::Score candidate_score = scorer.Evaluate(candidate);
     // |candidate_score| must be larger to displace the current choice. That way
     // the client's order controls between ciphers with an equal score.
diff --git a/src/ssl/s3_lib.cc b/src/ssl/s3_lib.cc
index fa73d34..2adf386 100644
--- a/src/ssl/s3_lib.cc
+++ b/src/ssl/s3_lib.cc
@@ -175,7 +175,6 @@
       send_connection_binding(false),
       channel_id_valid(false),
       key_update_pending(false),
-      wpend_pending(false),
       early_data_accepted(false),
       alert_dispatch(false),
       renegotiate_pending(false),
diff --git a/src/ssl/s3_pkt.cc b/src/ssl/s3_pkt.cc
index 450f7dc..bc0d13d 100644
--- a/src/ssl/s3_pkt.cc
+++ b/src/ssl/s3_pkt.cc
@@ -126,10 +126,11 @@
 
 BSSL_NAMESPACE_BEGIN
 
-static int do_tls_write(SSL *ssl, int type, const uint8_t *in, unsigned len);
+static int do_tls_write(SSL *ssl, size_t *out_bytes_written, uint8_t type,
+                        Span<const uint8_t> in);
 
-int tls_write_app_data(SSL *ssl, bool *out_needs_handshake, const uint8_t *in,
-                       int len) {
+int tls_write_app_data(SSL *ssl, bool *out_needs_handshake,
+                       size_t *out_bytes_written, Span<const uint8_t> in) {
   assert(ssl_can_write(ssl));
   assert(!ssl->s3->aead_write_ctx->is_null_cipher());
 
@@ -140,33 +141,28 @@
     return -1;
   }
 
-  // TODO(davidben): Switch this logic to |size_t| and |bssl::Span|.
-  assert(ssl->s3->wnum <= INT_MAX);
-  unsigned tot = ssl->s3->wnum;
-  ssl->s3->wnum = 0;
-
-  // Ensure that if we end up with a smaller value of data to write out than
-  // the the original len from a write which didn't complete for non-blocking
-  // I/O and also somehow ended up avoiding the check for this in
-  // tls_write_pending/SSL_R_BAD_WRITE_RETRY as it must never be possible to
-  // end up with (len-tot) as a large number that will then promptly send
-  // beyond the end of the users buffer ... so we trap and report the error in
-  // a way the user will notice.
-  if (len < 0 || (size_t)len < tot) {
+  size_t total_bytes_written = ssl->s3->unreported_bytes_written;
+  if (in.size() < total_bytes_written) {
+    // This can happen if the caller disables |SSL_MODE_ENABLE_PARTIAL_WRITE|,
+    // asks us to write some input of length N, we successfully encrypt M bytes
+    // and write it, but fail to write the rest. We will report
+    // |SSL_ERROR_WANT_WRITE|. If the caller then retries with fewer than M
+    // bytes, we cannot satisfy that request. The caller is required to always
+    // retry with at least as many bytes as the previous attempt.
     OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
     return -1;
   }
 
-  const int is_early_data_write =
-      !ssl->server && SSL_in_early_data(ssl) && ssl->s3->hs->can_early_write;
+  in = in.subspan(total_bytes_written);
 
-  unsigned n = len - tot;
+  const bool is_early_data_write =
+      !ssl->server && SSL_in_early_data(ssl) && ssl->s3->hs->can_early_write;
   for (;;) {
     size_t max_send_fragment = ssl->max_send_fragment;
     if (is_early_data_write) {
       SSL_HANDSHAKE *hs = ssl->s3->hs.get();
       if (hs->early_data_written >= hs->early_session->ticket_max_early_data) {
-        ssl->s3->wnum = tot;
+        ssl->s3->unreported_bytes_written = total_bytes_written;
         hs->can_early_write = false;
         *out_needs_handshake = true;
         return -1;
@@ -176,53 +172,63 @@
                                     hs->early_data_written});
     }
 
-    const size_t nw = std::min(max_send_fragment, size_t{n});
-    int ret = do_tls_write(ssl, SSL3_RT_APPLICATION_DATA, &in[tot], nw);
+    const size_t to_write = std::min(max_send_fragment, in.size());
+    size_t bytes_written;
+    int ret = do_tls_write(ssl, &bytes_written, SSL3_RT_APPLICATION_DATA,
+                           in.subspan(0, to_write));
     if (ret <= 0) {
-      ssl->s3->wnum = tot;
+      ssl->s3->unreported_bytes_written = total_bytes_written;
       return ret;
     }
 
+    // Note |bytes_written| may be less than |to_write| if there was a pending
+    // record from a smaller write attempt.
+    assert(bytes_written <= to_write);
+    total_bytes_written += bytes_written;
+    in = in.subspan(bytes_written);
     if (is_early_data_write) {
-      ssl->s3->hs->early_data_written += ret;
+      ssl->s3->hs->early_data_written += bytes_written;
     }
 
-    if (ret == (int)n || (ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) {
-      return tot + ret;
+    if (in.empty() || (ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) {
+      ssl->s3->unreported_bytes_written = 0;
+      *out_bytes_written = total_bytes_written;
+      return 1;
     }
-
-    n -= ret;
-    tot += ret;
   }
 }
 
-static int tls_write_pending(SSL *ssl, int type, const uint8_t *in,
-                             unsigned int len) {
-  if (ssl->s3->wpend_tot > (int)len ||
-      (!(ssl->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER) &&
-       ssl->s3->wpend_buf != in) ||
-      ssl->s3->wpend_type != type) {
+// do_tls_write writes an SSL record of the given type. On success, it sets
+// |*out_bytes_written| to number of bytes successfully written and returns one.
+// On error, it returns a value <= 0 from the underlying |BIO|.
+static int do_tls_write(SSL *ssl, size_t *out_bytes_written, uint8_t type,
+                        Span<const uint8_t> in) {
+  // If there is a pending write, the retry must be consistent.
+  if (!ssl->s3->pending_write.empty() &&
+      (ssl->s3->pending_write.size() > in.size() ||
+       (!(ssl->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER) &&
+        ssl->s3->pending_write.data() != in.data()) ||
+       ssl->s3->pending_write_type != type)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_WRITE_RETRY);
     return -1;
   }
 
+  // Flush any unwritten data to the transport. There may be data to flush even
+  // if |wpend_tot| is zero.
   int ret = ssl_write_buffer_flush(ssl);
   if (ret <= 0) {
     return ret;
   }
-  ssl->s3->wpend_pending = false;
-  return ssl->s3->wpend_ret;
-}
 
-// do_tls_write writes an SSL record of the given type.
-static int do_tls_write(SSL *ssl, int type, const uint8_t *in, unsigned len) {
-  // If there is still data from the previous record, flush it.
-  if (ssl->s3->wpend_pending) {
-    return tls_write_pending(ssl, type, in, len);
+  // If there is a pending write, we just completed it. Report it to the caller.
+  if (!ssl->s3->pending_write.empty()) {
+    *out_bytes_written = ssl->s3->pending_write.size();
+    ssl->s3->pending_write = {};
+    return 1;
   }
 
   SSLBuffer *buf = &ssl->s3->write_buffer;
-  if (len > SSL3_RT_MAX_PLAIN_LENGTH || buf->size() > 0) {
+  if (in.size() > SSL3_RT_MAX_PLAIN_LENGTH || buf->size() > 0) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
     return -1;
   }
@@ -231,16 +237,22 @@
     return -1;
   }
 
-  size_t flight_len = 0;
+  // We may have unflushed handshake data that must be written before |in|. This
+  // may be a KeyUpdate acknowledgment, 0-RTT key change messages, or a
+  // NewSessionTicket.
+  Span<const uint8_t> pending_flight;
   if (ssl->s3->pending_flight != nullptr) {
-    flight_len =
-        ssl->s3->pending_flight->length - ssl->s3->pending_flight_offset;
+    pending_flight = MakeConstSpan(
+        reinterpret_cast<const uint8_t *>(ssl->s3->pending_flight->data),
+        ssl->s3->pending_flight->length);
+    pending_flight = pending_flight.subspan(ssl->s3->pending_flight_offset);
   }
 
-  size_t max_out = flight_len;
-  if (len > 0) {
-    const size_t max_ciphertext_len = len + SSL_max_seal_overhead(ssl);
-    if (max_ciphertext_len < len || max_out + max_ciphertext_len < max_out) {
+  size_t max_out = pending_flight.size();
+  if (!in.empty()) {
+    const size_t max_ciphertext_len = in.size() + SSL_max_seal_overhead(ssl);
+    if (max_ciphertext_len < in.size() ||
+        max_out + max_ciphertext_len < max_out) {
       OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
       return -1;
     }
@@ -248,31 +260,29 @@
   }
 
   if (max_out == 0) {
-    return 0;
+    // Nothing to write.
+    *out_bytes_written = 0;
+    return 1;
   }
 
-  if (!buf->EnsureCap(flight_len + ssl_seal_align_prefix_len(ssl), max_out)) {
+  if (!buf->EnsureCap(pending_flight.size() + ssl_seal_align_prefix_len(ssl),
+                      max_out)) {
     return -1;
   }
 
-  // Add any unflushed handshake data as a prefix. This may be a KeyUpdate
-  // acknowledgment or 0-RTT key change messages. |pending_flight| must be clear
-  // when data is added to |write_buffer| or it will be written in the wrong
-  // order.
-  if (ssl->s3->pending_flight != nullptr) {
-    OPENSSL_memcpy(
-        buf->remaining().data(),
-        ssl->s3->pending_flight->data + ssl->s3->pending_flight_offset,
-        flight_len);
+  // Copy |pending_flight| to the output.
+  if (!pending_flight.empty()) {
+    OPENSSL_memcpy(buf->remaining().data(), pending_flight.data(),
+                   pending_flight.size());
     ssl->s3->pending_flight.reset();
     ssl->s3->pending_flight_offset = 0;
-    buf->DidWrite(flight_len);
+    buf->DidWrite(pending_flight.size());
   }
 
-  if (len > 0) {
+  if (!in.empty()) {
     size_t ciphertext_len;
     if (!tls_seal_record(ssl, buf->remaining().data(), &ciphertext_len,
-                         buf->remaining().size(), type, in, len)) {
+                         buf->remaining().size(), type, in.data(), in.size())) {
       return -1;
     }
     buf->DidWrite(ciphertext_len);
@@ -282,16 +292,19 @@
   // acknowledgments.
   ssl->s3->key_update_pending = false;
 
-  // Memorize arguments so that tls_write_pending can detect bad write retries
-  // later.
-  ssl->s3->wpend_tot = len;
-  ssl->s3->wpend_buf = in;
-  ssl->s3->wpend_type = type;
-  ssl->s3->wpend_ret = len;
-  ssl->s3->wpend_pending = true;
+  // Flush the write buffer.
+  ret = ssl_write_buffer_flush(ssl);
+  if (ret <= 0) {
+    // Track the unfinished write.
+    if (!in.empty()) {
+      ssl->s3->pending_write = in;
+      ssl->s3->pending_write_type = type;
+    }
+    return ret;
+  }
 
-  // We now just need to write the buffer.
-  return tls_write_pending(ssl, type, in, len);
+  *out_bytes_written = in.size();
+  return 1;
 }
 
 ssl_open_record_t tls_open_app_data(SSL *ssl, Span<uint8_t> *out,
@@ -429,10 +442,13 @@
       return 0;
     }
   } else {
-    int ret = do_tls_write(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2);
+    size_t bytes_written;
+    int ret =
+        do_tls_write(ssl, &bytes_written, SSL3_RT_ALERT, ssl->s3->send_alert);
     if (ret <= 0) {
       return ret;
     }
+    assert(bytes_written == 2);
   }
 
   ssl->s3->alert_dispatch = false;
diff --git a/src/ssl/ssl_aead_ctx.cc b/src/ssl/ssl_aead_ctx.cc
index 0bad266..27f0084 100644
--- a/src/ssl/ssl_aead_ctx.cc
+++ b/src/ssl/ssl_aead_ctx.cc
@@ -220,13 +220,13 @@
 }
 
 Span<const uint8_t> SSLAEADContext::GetAdditionalData(
-    uint8_t storage[13], uint8_t type, uint16_t record_version,
-    const uint8_t seqnum[8], size_t plaintext_len, Span<const uint8_t> header) {
+    uint8_t storage[13], uint8_t type, uint16_t record_version, uint64_t seqnum,
+    size_t plaintext_len, Span<const uint8_t> header) {
   if (ad_is_header_) {
     return header;
   }
 
-  OPENSSL_memcpy(storage, seqnum, 8);
+  CRYPTO_store_u64_be(storage, seqnum);
   size_t len = 8;
   storage[len++] = type;
   storage[len++] = static_cast<uint8_t>((record_version >> 8));
@@ -239,7 +239,7 @@
 }
 
 bool SSLAEADContext::Open(Span<uint8_t> *out, uint8_t type,
-                          uint16_t record_version, const uint8_t seqnum[8],
+                          uint16_t record_version, uint64_t seqnum,
                           Span<const uint8_t> header, Span<uint8_t> in) {
   if (is_null_cipher() || FUZZER_MODE) {
     // Handle the initial NULL cipher.
@@ -288,7 +288,7 @@
     in = in.subspan(variable_nonce_len_);
   } else {
     assert(variable_nonce_len_ == 8);
-    OPENSSL_memcpy(nonce + nonce_len, seqnum, variable_nonce_len_);
+    CRYPTO_store_u64_be(nonce + nonce_len, seqnum);
   }
   nonce_len += variable_nonce_len_;
 
@@ -313,8 +313,7 @@
 
 bool SSLAEADContext::SealScatter(uint8_t *out_prefix, uint8_t *out,
                                  uint8_t *out_suffix, uint8_t type,
-                                 uint16_t record_version,
-                                 const uint8_t seqnum[8],
+                                 uint16_t record_version, uint64_t seqnum,
                                  Span<const uint8_t> header, const uint8_t *in,
                                  size_t in_len, const uint8_t *extra_in,
                                  size_t extra_in_len) {
@@ -365,7 +364,7 @@
     // When sending we use the sequence number as the variable part of the
     // nonce.
     assert(variable_nonce_len_ == 8);
-    OPENSSL_memcpy(nonce + nonce_len, seqnum, variable_nonce_len_);
+    CRYPTO_store_u64_be(nonce + nonce_len, seqnum);
   }
   nonce_len += variable_nonce_len_;
 
@@ -398,7 +397,7 @@
 
 bool SSLAEADContext::Seal(uint8_t *out, size_t *out_len, size_t max_out_len,
                           uint8_t type, uint16_t record_version,
-                          const uint8_t seqnum[8], Span<const uint8_t> header,
+                          uint64_t seqnum, Span<const uint8_t> header,
                           const uint8_t *in, size_t in_len) {
   const size_t prefix_len = ExplicitNonceLen();
   size_t suffix_len;
diff --git a/src/ssl/ssl_asn1.cc b/src/ssl/ssl_asn1.cc
index 27bc310..0426437 100644
--- a/src/ssl/ssl_asn1.cc
+++ b/src/ssl/ssl_asn1.cc
@@ -662,9 +662,9 @@
     }
     OPENSSL_memcpy(ret->peer_sha256, CBS_data(&peer_sha256),
                    sizeof(ret->peer_sha256));
-    ret->peer_sha256_valid = 1;
+    ret->peer_sha256_valid = true;
   } else {
-    ret->peer_sha256_valid = 0;
+    ret->peer_sha256_valid = false;
   }
 
   if (!SSL_SESSION_parse_bounded_octet_string(
diff --git a/src/ssl/ssl_buffer.cc b/src/ssl/ssl_buffer.cc
index d73055f..2ca14ef 100644
--- a/src/ssl/ssl_buffer.cc
+++ b/src/ssl/ssl_buffer.cc
@@ -232,6 +232,7 @@
       return 1;
 
     case ssl_open_record_close_notify:
+      ssl->s3->rwstate = SSL_ERROR_ZERO_RETURN;
       return 0;
 
     case ssl_open_record_error:
diff --git a/src/ssl/ssl_cipher.cc b/src/ssl/ssl_cipher.cc
index 60b3e2c..7c4c034 100644
--- a/src/ssl/ssl_cipher.cc
+++ b/src/ssl/ssl_cipher.cc
@@ -264,9 +264,9 @@
 
     // Cipher 1301
     {
-      TLS1_TXT_AES_128_GCM_SHA256,
+      TLS1_3_RFC_AES_128_GCM_SHA256,
       "TLS_AES_128_GCM_SHA256",
-      TLS1_CK_AES_128_GCM_SHA256,
+      TLS1_3_CK_AES_128_GCM_SHA256,
       SSL_kGENERIC,
       SSL_aGENERIC,
       SSL_AES128GCM,
@@ -276,9 +276,9 @@
 
     // Cipher 1302
     {
-      TLS1_TXT_AES_256_GCM_SHA384,
+      TLS1_3_RFC_AES_256_GCM_SHA384,
       "TLS_AES_256_GCM_SHA384",
-      TLS1_CK_AES_256_GCM_SHA384,
+      TLS1_3_CK_AES_256_GCM_SHA384,
       SSL_kGENERIC,
       SSL_aGENERIC,
       SSL_AES256GCM,
@@ -288,9 +288,9 @@
 
     // Cipher 1303
     {
-      TLS1_TXT_CHACHA20_POLY1305_SHA256,
+      TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
       "TLS_CHACHA20_POLY1305_SHA256",
-      TLS1_CK_CHACHA20_POLY1305_SHA256,
+      TLS1_3_CK_CHACHA20_POLY1305_SHA256,
       SSL_kGENERIC,
       SSL_aGENERIC,
       SSL_CHACHA20POLY1305,
@@ -1327,34 +1327,33 @@
 
 using namespace bssl;
 
-static constexpr int ssl_cipher_id_cmp_inner(const SSL_CIPHER *a,
-                                             const SSL_CIPHER *b) {
-  // C++11's constexpr functions must have a body consisting of just a
-  // return-statement.
-  return (a->id > b->id) ? 1 : ((a->id < b->id) ? -1 : 0);
+static constexpr int ssl_cipher_id_cmp(const SSL_CIPHER *a,
+                                       const SSL_CIPHER *b) {
+  if (a->id > b->id) {
+    return 1;
+  }
+  if (a->id < b->id) {
+    return -1;
+  }
+  return 0;
 }
 
-static int ssl_cipher_id_cmp(const void *in_a, const void *in_b) {
-  return ssl_cipher_id_cmp_inner(reinterpret_cast<const SSL_CIPHER *>(in_a),
-                                 reinterpret_cast<const SSL_CIPHER *>(in_b));
+static int ssl_cipher_id_cmp_void(const void *in_a, const void *in_b) {
+  return ssl_cipher_id_cmp(reinterpret_cast<const SSL_CIPHER *>(in_a),
+                           reinterpret_cast<const SSL_CIPHER *>(in_b));
 }
 
-template <typename T, size_t N>
-static constexpr size_t countof(T const (&)[N]) {
-  return N;
+template <size_t N>
+static constexpr bool ssl_ciphers_sorted(const SSL_CIPHER (&ciphers)[N]) {
+  for (size_t i = 1; i < N; i++) {
+    if (ssl_cipher_id_cmp(&ciphers[i - 1], &ciphers[i]) >= 0) {
+      return false;
+    }
+  }
+  return true;
 }
 
-template <typename T, size_t I>
-static constexpr int check_order(const T (&arr)[I], size_t N) {
-  // C++11's constexpr functions must have a body consisting of just a
-  // return-statement.
-  return N > 1 ? ((ssl_cipher_id_cmp_inner(&arr[N - 2], &arr[N - 1]) < 0)
-                      ? check_order(arr, N - 1)
-                      : 0)
-               : 1;
-}
-
-static_assert(check_order(kCiphers, countof(kCiphers)) == 1,
+static_assert(ssl_ciphers_sorted(kCiphers),
               "Ciphers are not sorted, bsearch won't work");
 
 const SSL_CIPHER *SSL_get_cipher_by_value(uint16_t value) {
@@ -1363,7 +1362,7 @@
   c.id = 0x03000000L | value;
   return reinterpret_cast<const SSL_CIPHER *>(bsearch(
       &c, kCiphers, OPENSSL_ARRAY_SIZE(kCiphers), sizeof(SSL_CIPHER),
-      ssl_cipher_id_cmp));
+      ssl_cipher_id_cmp_void));
 }
 
 uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher) { return cipher->id; }
diff --git a/src/ssl/ssl_file.cc b/src/ssl/ssl_file.cc
index ca4b0be..d867cf1 100644
--- a/src/ssl/ssl_file.cc
+++ b/src/ssl/ssl_file.cc
@@ -128,125 +128,102 @@
   return X509_NAME_cmp(*a, *b);
 }
 
-// TODO(davidben): Is there any reason this doesn't call
-// |SSL_add_file_cert_subjects_to_stack|?
-STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file) {
-  BIO *in;
-  X509 *x = NULL;
-  X509_NAME *xn = NULL;
-  STACK_OF(X509_NAME) *ret = NULL, *sk;
-
-  sk = sk_X509_NAME_new(xname_cmp);
-  in = BIO_new(BIO_s_file());
-
-  if (sk == NULL || in == NULL) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
-    goto err;
+static int add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, BIO *bio,
+                                          bool allow_empty) {
+  // This function historically sorted |out| after every addition and skipped
+  // duplicates. This implementation preserves that behavior, but only sorts at
+  // the end, to avoid a quadratic running time. Existing duplicates in |out|
+  // are preserved, but do not introduce new duplicates.
+  bssl::UniquePtr<STACK_OF(X509_NAME)> to_append(sk_X509_NAME_new(xname_cmp));
+  if (to_append == nullptr) {
+    return 0;
   }
 
-  if (!BIO_read_filename(in, file)) {
-    goto err;
-  }
+  // Temporarily switch the comparison function for |out|.
+  struct RestoreCmpFunc {
+    ~RestoreCmpFunc() { sk_X509_NAME_set_cmp_func(stack, old_cmp); }
+    STACK_OF(X509_NAME) *stack;
+    int (*old_cmp)(const X509_NAME **, const X509_NAME **);
+  };
+  RestoreCmpFunc restore = {out, sk_X509_NAME_set_cmp_func(out, xname_cmp)};
 
+  sk_X509_NAME_sort(out);
+  bool first = true;
   for (;;) {
-    if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL) {
+    bssl::UniquePtr<X509> x509(
+        PEM_read_bio_X509(bio, nullptr, nullptr, nullptr));
+    if (x509 == nullptr) {
+      if (first && !allow_empty) {
+        return 0;
+      }
+      // TODO(davidben): This ignores PEM syntax errors. It should only succeed
+      // on |PEM_R_NO_START_LINE|.
+      ERR_clear_error();
       break;
     }
-    if (ret == NULL) {
-      ret = sk_X509_NAME_new_null();
-      if (ret == NULL) {
-        OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
-        goto err;
-      }
-    }
-    xn = X509_get_subject_name(x);
-    if (xn == NULL) {
-      goto err;
-    }
+    first = false;
 
-    // Check for duplicates.
-    sk_X509_NAME_sort(sk);
-    if (sk_X509_NAME_find(sk, NULL, xn)) {
+    X509_NAME *subject = X509_get_subject_name(x509.get());
+    // Skip if already present in |out|. Duplicates in |to_append| will be
+    // handled separately.
+    if (sk_X509_NAME_find(out, /*out_index=*/NULL, subject)) {
       continue;
     }
 
-    xn = X509_NAME_dup(xn);
-    if (xn == NULL ||
-        !sk_X509_NAME_push(sk /* non-owning */, xn) ||
-        !sk_X509_NAME_push(ret /* owning */, xn)) {
-      X509_NAME_free(xn);
-      goto err;
+    bssl::UniquePtr<X509_NAME> copy(X509_NAME_dup(subject));
+    if (copy == nullptr ||
+        !bssl::PushToStack(to_append.get(), std::move(copy))) {
+      return 0;
     }
   }
 
-  if (0) {
-  err:
-    sk_X509_NAME_pop_free(ret, X509_NAME_free);
-    ret = NULL;
+  // Append |to_append| to |stack|, skipping any duplicates.
+  sk_X509_NAME_sort(to_append.get());
+  size_t num = sk_X509_NAME_num(to_append.get());
+  for (size_t i = 0; i < num; i++) {
+    bssl::UniquePtr<X509_NAME> name(sk_X509_NAME_value(to_append.get(), i));
+    sk_X509_NAME_set(to_append.get(), i, nullptr);
+    if (i + 1 < num &&
+        X509_NAME_cmp(name.get(), sk_X509_NAME_value(to_append.get(), i + 1)) ==
+            0) {
+      continue;
+    }
+    if (!bssl::PushToStack(out, std::move(name))) {
+      return 0;
+    }
   }
 
-  sk_X509_NAME_free(sk);
-  BIO_free(in);
-  X509_free(x);
-  if (ret != NULL) {
-    ERR_clear_error();
-  }
-  return ret;
+  // Sort |out| one last time, to preserve the historical behavior of
+  // maintaining the sorted list.
+  sk_X509_NAME_sort(out);
+  return 1;
 }
 
-int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
+STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file) {
+  bssl::UniquePtr<BIO> in(BIO_new_file(file, "r"));
+  if (in == nullptr) {
+    return nullptr;
+  }
+  bssl::UniquePtr<STACK_OF(X509_NAME)> ret(sk_X509_NAME_new_null());
+  if (ret == nullptr ||  //
+      !add_bio_cert_subjects_to_stack(ret.get(), in.get(),
+                                      /*allow_empty=*/false)) {
+    return nullptr;
+  }
+  return ret.release();
+}
+
+int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
                                         const char *file) {
-  BIO *in;
-  X509 *x = NULL;
-  X509_NAME *xn = NULL;
-  int ret = 0;
-  int (*oldcmp)(const X509_NAME **a, const X509_NAME **b);
-
-  oldcmp = sk_X509_NAME_set_cmp_func(stack, xname_cmp);
-  in = BIO_new(BIO_s_file());
-
-  if (in == NULL) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
-    goto err;
+  bssl::UniquePtr<BIO> in(BIO_new_file(file, "r"));
+  if (in == nullptr) {
+    return 0;
   }
+  return SSL_add_bio_cert_subjects_to_stack(out, in.get());
+}
 
-  if (!BIO_read_filename(in, file)) {
-    goto err;
-  }
-
-  for (;;) {
-    if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL) {
-      break;
-    }
-    xn = X509_get_subject_name(x);
-    if (xn == NULL) {
-      goto err;
-    }
-
-    // Check for duplicates.
-    sk_X509_NAME_sort(stack);
-    if (sk_X509_NAME_find(stack, NULL, xn)) {
-      continue;
-    }
-
-    xn = X509_NAME_dup(xn);
-    if (xn == NULL ||
-        !sk_X509_NAME_push(stack, xn)) {
-      X509_NAME_free(xn);
-      goto err;
-    }
-  }
-
-  ERR_clear_error();
-  ret = 1;
-
-err:
-  BIO_free(in);
-  X509_free(x);
-
-  (void) sk_X509_NAME_set_cmp_func(stack, oldcmp);
-
-  return ret;
+int SSL_add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, BIO *bio) {
+  return add_bio_cert_subjects_to_stack(out, bio, /*allow_empty=*/true);
 }
 
 int SSL_use_certificate_file(SSL *ssl, const char *file, int type) {
diff --git a/src/ssl/ssl_key_share.cc b/src/ssl/ssl_key_share.cc
index c847a0a..920f25e 100644
--- a/src/ssl/ssl_key_share.cc
+++ b/src/ssl/ssl_key_share.cc
@@ -290,7 +290,7 @@
   HRSS_private_key hrss_private_key_;
 };
 
-CONSTEXPR_ARRAY NamedGroup kNamedGroups[] = {
+constexpr NamedGroup kNamedGroups[] = {
     {NID_secp224r1, SSL_CURVE_SECP224R1, "P-224", "secp224r1"},
     {NID_X9_62_prime256v1, SSL_CURVE_SECP256R1, "P-256", "prime256v1"},
     {NID_secp384r1, SSL_CURVE_SECP384R1, "P-384", "secp384r1"},
diff --git a/src/ssl/ssl_lib.cc b/src/ssl/ssl_lib.cc
index e2e2436..a6ca0ab 100644
--- a/src/ssl/ssl_lib.cc
+++ b/src/ssl/ssl_lib.cc
@@ -140,6 +140,8 @@
 
 #include <openssl/ssl.h>
 
+#include <algorithm>
+
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
@@ -164,6 +166,10 @@
 
 BSSL_NAMESPACE_BEGIN
 
+static_assert(SSL3_RT_MAX_ENCRYPTED_OVERHEAD >=
+                  SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD,
+              "max overheads are inconsistent");
+
 // |SSL_R_UNKNOWN_PROTOCOL| is no longer emitted, but continue to define it
 // to avoid downstream churn.
 OPENSSL_DECLARE_ERROR_REASON(SSL, UNKNOWN_PROTOCOL)
@@ -517,7 +523,8 @@
       allow_unknown_alpn_protos(false),
       false_start_allowed_without_alpn(false),
       handoff(false),
-      enable_early_data(false) {
+      enable_early_data(false),
+      only_fips_cipher_suites_in_tls13(false) {
   CRYPTO_MUTEX_init(&lock);
   CRYPTO_new_ex_data(&ex_data);
 }
@@ -637,6 +644,8 @@
   ssl->config->retain_only_sha256_of_client_certs =
       ctx->retain_only_sha256_of_client_certs;
   ssl->config->permute_extensions = ctx->permute_extensions;
+  ssl->config->only_fips_cipher_suites_in_tls13 =
+      ctx->only_fips_cipher_suites_in_tls13;
 
   if (!ssl->config->supported_group_list.CopyFrom(ctx->supported_group_list) ||
       !ssl->config->alpn_client_proto_list.CopyFrom(
@@ -678,7 +687,7 @@
       signed_cert_timestamps_enabled(false),
       ocsp_stapling_enabled(false),
       channel_id_enabled(false),
-      enforce_rsa_key_usage(false),
+      enforce_rsa_key_usage(true),
       retain_only_sha256_of_client_certs(false),
       handoff(false),
       shed_handshake_config(false),
@@ -1053,6 +1062,7 @@
   }
 
   int ret = 0;
+  size_t bytes_written = 0;
   bool needs_handshake = false;
   do {
     // If necessary, complete the handshake implicitly.
@@ -1067,10 +1077,16 @@
       }
     }
 
-    ret = ssl->method->write_app_data(ssl, &needs_handshake,
-                                      (const uint8_t *)buf, num);
+    if (num < 0) {
+      OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
+      return -1;
+    }
+    ret = ssl->method->write_app_data(
+        ssl, &needs_handshake, &bytes_written,
+        MakeConstSpan(static_cast<const uint8_t *>(buf),
+                      static_cast<size_t>(num)));
   } while (needs_handshake);
-  return ret;
+  return ret <= 0 ? ret : static_cast<int>(bytes_written);
 }
 
 int SSL_key_update(SSL *ssl, int request_type) {
@@ -1234,7 +1250,7 @@
   // Discard any unfinished writes from the perspective of |SSL_write|'s
   // retry. The handshake will transparently flush out the pending record
   // (discarded by the server) to keep the framing correct.
-  ssl->s3->wpend_pending = false;
+  ssl->s3->pending_write = {};
 }
 
 enum ssl_early_data_reason_t SSL_get_early_data_reason(const SSL *ssl) {
@@ -1303,7 +1319,7 @@
   }
 
   if (ret_code == 0) {
-    if (ssl->s3->read_shutdown == ssl_shutdown_close_notify) {
+    if (ssl->s3->rwstate == SSL_ERROR_ZERO_RETURN) {
       return SSL_ERROR_ZERO_RETURN;
     }
     // An EOF was observed which violates the protocol, and the underlying
@@ -1933,9 +1949,23 @@
   return tls1_set_curves_list(&ssl->config->supported_group_list, curves);
 }
 
+int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len) {
+  return SSL_CTX_set1_curves(ctx, groups, groups_len);
+}
+
+int SSL_set1_groups(SSL *ssl, const int *groups, size_t groups_len) {
+  return SSL_set1_curves(ssl, groups, groups_len);
+}
+
+int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups) {
+  return SSL_CTX_set1_curves_list(ctx, groups);
+}
+
+int SSL_set1_groups_list(SSL *ssl, const char *groups) {
+  return SSL_set1_curves_list(ssl, groups);
+}
+
 uint16_t SSL_get_curve_id(const SSL *ssl) {
-  // TODO(davidben): This checks the wrong session if there is a renegotiation
-  // in progress.
   SSL_SESSION *session = SSL_get_session(ssl);
   if (session == NULL) {
     return 0;
@@ -2562,7 +2592,13 @@
   return CRYPTO_get_ex_data(&ctx->ex_data, idx);
 }
 
-int SSL_want(const SSL *ssl) { return ssl->s3->rwstate; }
+int SSL_want(const SSL *ssl) {
+  // Historically, OpenSSL did not track |SSL_ERROR_ZERO_RETURN| as an |rwstate|
+  // value. We do, but map it back to |SSL_ERROR_NONE| to preserve the original
+  // behavior.
+  return ssl->s3->rwstate == SSL_ERROR_ZERO_RETURN ? SSL_ERROR_NONE
+                                                   : ssl->s3->rwstate;
+}
 
 void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,
                                   RSA *(*cb)(SSL *ssl, int is_export,
@@ -2786,35 +2822,25 @@
   return 1;
 }
 
-static uint64_t be_to_u64(const uint8_t in[8]) {
-  return (((uint64_t)in[0]) << 56) | (((uint64_t)in[1]) << 48) |
-         (((uint64_t)in[2]) << 40) | (((uint64_t)in[3]) << 32) |
-         (((uint64_t)in[4]) << 24) | (((uint64_t)in[5]) << 16) |
-         (((uint64_t)in[6]) << 8) | ((uint64_t)in[7]);
-}
-
 uint64_t SSL_get_read_sequence(const SSL *ssl) {
-  // TODO(davidben): Internally represent sequence numbers as uint64_t.
   if (SSL_is_dtls(ssl)) {
     // max_seq_num already includes the epoch.
     assert(ssl->d1->r_epoch == (ssl->d1->bitmap.max_seq_num >> 48));
     return ssl->d1->bitmap.max_seq_num;
   }
-  return be_to_u64(ssl->s3->read_sequence);
+  return ssl->s3->read_sequence;
 }
 
 uint64_t SSL_get_write_sequence(const SSL *ssl) {
-  uint64_t ret = be_to_u64(ssl->s3->write_sequence);
+  uint64_t ret = ssl->s3->write_sequence;
   if (SSL_is_dtls(ssl)) {
     assert((ret >> 48) == 0);
-    ret |= ((uint64_t)ssl->d1->w_epoch) << 48;
+    ret |= uint64_t{ssl->d1->w_epoch} << 48;
   }
   return ret;
 }
 
 uint16_t SSL_get_peer_signature_algorithm(const SSL *ssl) {
-  // TODO(davidben): This checks the wrong session if there is a renegotiation
-  // in progress.
   SSL_SESSION *session = SSL_get_session(ssl);
   if (session == NULL) {
     return 0;
@@ -3025,6 +3051,15 @@
   return session.release();
 }
 
+int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets) {
+  num_tickets = std::min(num_tickets, kMaxTickets);
+  static_assert(kMaxTickets <= 0xff, "Too many tickets.");
+  ctx->num_tickets = static_cast<uint8_t>(num_tickets);
+  return 1;
+}
+
+size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx) { return ctx->num_tickets; }
+
 int SSL_set_tlsext_status_type(SSL *ssl, int type) {
   if (!ssl->config) {
     return 0;
@@ -3070,3 +3105,93 @@
   ctx->legacy_ocsp_callback_arg = arg;
   return 1;
 }
+
+namespace fips202205 {
+
+// (References are to SP 800-52r2):
+
+// Section 3.4.2.2
+// "at least one of the NIST-approved curves, P-256 (secp256r1) and P384
+// (secp384r1), shall be supported as described in RFC 8422."
+//
+// Section 3.3.1
+// "The server shall be configured to only use cipher suites that are
+// composed entirely of NIST approved algorithms"
+static const int kCurves[] = {NID_X9_62_prime256v1, NID_secp384r1};
+
+static const uint16_t kSigAlgs[] = {
+    SSL_SIGN_RSA_PKCS1_SHA256,
+    SSL_SIGN_RSA_PKCS1_SHA384,
+    SSL_SIGN_RSA_PKCS1_SHA512,
+    // Table 4.1:
+    // "The curve should be P-256 or P-384"
+    SSL_SIGN_ECDSA_SECP256R1_SHA256,
+    SSL_SIGN_ECDSA_SECP384R1_SHA384,
+    SSL_SIGN_RSA_PSS_RSAE_SHA256,
+    SSL_SIGN_RSA_PSS_RSAE_SHA384,
+    SSL_SIGN_RSA_PSS_RSAE_SHA512,
+};
+
+static const char kTLS12Ciphers[] =
+    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:"
+    "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:"
+    "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:"
+    "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
+
+static int Configure(SSL_CTX *ctx) {
+  ctx->only_fips_cipher_suites_in_tls13 = true;
+
+  return
+      // Section 3.1:
+      // "Servers that support government-only applications shall be
+      // configured to use TLS 1.2 and should be configured to use TLS 1.3
+      // as well. These servers should not be configured to use TLS 1.1 and
+      // shall not use TLS 1.0, SSL 3.0, or SSL 2.0.
+      SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION) &&
+      SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION) &&
+      // Sections 3.3.1.1.1 and 3.3.1.1.2 are ambiguous about whether
+      // HMAC-SHA-1 cipher suites are permitted with TLS 1.2. However, later the
+      // Encrypt-then-MAC extension is required for all CBC cipher suites and so
+      // it's easier to drop them.
+      SSL_CTX_set_strict_cipher_list(ctx, kTLS12Ciphers) &&
+      SSL_CTX_set1_curves(ctx, kCurves, OPENSSL_ARRAY_SIZE(kCurves)) &&
+      SSL_CTX_set_signing_algorithm_prefs(ctx, kSigAlgs,
+                                          OPENSSL_ARRAY_SIZE(kSigAlgs)) &&
+      SSL_CTX_set_verify_algorithm_prefs(ctx, kSigAlgs,
+                                         OPENSSL_ARRAY_SIZE(kSigAlgs));
+}
+
+static int Configure(SSL *ssl) {
+  ssl->config->only_fips_cipher_suites_in_tls13 = true;
+
+  // See |Configure(SSL_CTX)|, above, for reasoning.
+  return SSL_set_min_proto_version(ssl, TLS1_2_VERSION) &&
+         SSL_set_max_proto_version(ssl, TLS1_3_VERSION) &&
+         SSL_set_strict_cipher_list(ssl, kTLS12Ciphers) &&
+         SSL_set1_curves(ssl, kCurves, OPENSSL_ARRAY_SIZE(kCurves)) &&
+         SSL_set_signing_algorithm_prefs(ssl, kSigAlgs,
+                                         OPENSSL_ARRAY_SIZE(kSigAlgs)) &&
+         SSL_set_verify_algorithm_prefs(ssl, kSigAlgs,
+                                        OPENSSL_ARRAY_SIZE(kSigAlgs));
+}
+
+}  // namespace fips202205
+
+int SSL_CTX_set_compliance_policy(SSL_CTX *ctx,
+                                  enum ssl_compliance_policy_t policy) {
+  switch (policy) {
+    case ssl_compliance_policy_fips_202205:
+      return fips202205::Configure(ctx);
+    default:
+      return 0;
+  }
+}
+
+int SSL_set_compliance_policy(SSL *ssl, enum ssl_compliance_policy_t policy) {
+  switch (policy) {
+    case ssl_compliance_policy_fips_202205:
+      return fips202205::Configure(ssl);
+    default:
+      return 0;
+  }
+}
diff --git a/src/ssl/ssl_privkey.cc b/src/ssl/ssl_privkey.cc
index 8462ebf..0843e0b 100644
--- a/src/ssl/ssl_privkey.cc
+++ b/src/ssl/ssl_privkey.cc
@@ -201,6 +201,31 @@
     SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, size_t max_out,
     uint16_t sigalg, Span<const uint8_t> in) {
   SSL *const ssl = hs->ssl;
+  SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
+  Array<uint8_t> spki;
+  if (hints) {
+    ScopedCBB spki_cbb;
+    if (!CBB_init(spki_cbb.get(), 64) ||
+        !EVP_marshal_public_key(spki_cbb.get(), hs->local_pubkey.get()) ||
+        !CBBFinishArray(spki_cbb.get(), &spki)) {
+      ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
+      return ssl_private_key_failure;
+    }
+  }
+
+  // Replay the signature from handshake hints if available.
+  if (hints && !hs->hints_requested &&         //
+      sigalg == hints->signature_algorithm &&  //
+      in == hints->signature_input &&
+      MakeConstSpan(spki) == hints->signature_spki &&
+      !hints->signature.empty() &&  //
+      hints->signature.size() <= max_out) {
+    // Signature algorithm and input both match. Reuse the signature from hints.
+    *out_len = hints->signature.size();
+    OPENSSL_memcpy(out, hints->signature.data(), hints->signature.size());
+    return ssl_private_key_success;
+  }
+
   const SSL_PRIVATE_KEY_METHOD *key_method = hs->config->cert->key_method;
   EVP_PKEY *privatekey = hs->config->cert->privatekey.get();
   assert(!hs->can_release_private_key);
@@ -214,21 +239,33 @@
     if (hs->pending_private_key_op) {
       ret = key_method->complete(ssl, out, out_len, max_out);
     } else {
-      ret = key_method->sign(ssl, out, out_len, max_out,
-                             sigalg, in.data(), in.size());
+      ret = key_method->sign(ssl, out, out_len, max_out, sigalg, in.data(),
+                             in.size());
     }
     if (ret == ssl_private_key_failure) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_PRIVATE_KEY_OPERATION_FAILED);
     }
     hs->pending_private_key_op = ret == ssl_private_key_retry;
-    return ret;
+    if (ret != ssl_private_key_success) {
+      return ret;
+    }
+  } else {
+    *out_len = max_out;
+    ScopedEVP_MD_CTX ctx;
+    if (!setup_ctx(ssl, ctx.get(), privatekey, sigalg, false /* sign */) ||
+        !EVP_DigestSign(ctx.get(), out, out_len, in.data(), in.size())) {
+      return ssl_private_key_failure;
+    }
   }
 
-  *out_len = max_out;
-  ScopedEVP_MD_CTX ctx;
-  if (!setup_ctx(ssl, ctx.get(), privatekey, sigalg, false /* sign */) ||
-      !EVP_DigestSign(ctx.get(), out, out_len, in.data(), in.size())) {
-    return ssl_private_key_failure;
+  // Save the hint if applicable.
+  if (hints && hs->hints_requested) {
+    hints->signature_algorithm = sigalg;
+    hints->signature_spki = std::move(spki);
+    if (!hints->signature_input.CopyFrom(in) ||
+        !hints->signature.CopyFrom(MakeConstSpan(out, *out_len))) {
+      return ssl_private_key_failure;
+    }
   }
   return ssl_private_key_success;
 }
@@ -663,7 +700,7 @@
 
   // Note that the loop runs to len+1, i.e. it'll process the terminating NUL.
   for (size_t offset = 0; offset < len+1; offset++) {
-    const char c = str[offset];
+    const unsigned char c = str[offset];
 
     switch (c) {
       case '+':
diff --git a/src/ssl/ssl_session.cc b/src/ssl/ssl_session.cc
index 76e6dc4..05bcf6f 100644
--- a/src/ssl/ssl_session.cc
+++ b/src/ssl/ssl_session.cc
@@ -1169,20 +1169,31 @@
 }
 
 SSL_SESSION *SSL_get_session(const SSL *ssl) {
-  // Once the handshake completes we return the established session. Otherwise
-  // we return the intermediate session, either |session| (for resumption) or
-  // |new_session| if doing a full handshake.
-  if (!SSL_in_init(ssl)) {
+  // Once the initially handshake completes, we return the most recently
+  // established session. In particular, if there is a pending renegotiation, we
+  // do not return information about it until it completes.
+  //
+  // Code in the handshake must either use |hs->new_session| (if updating a
+  // partial session) or |ssl_handshake_session| (if trying to query properties
+  // consistently across TLS 1.2 resumption and other handshakes).
+  if (ssl->s3->established_session != nullptr) {
     return ssl->s3->established_session.get();
   }
+
+  // Otherwise, we must be in the initial handshake.
   SSL_HANDSHAKE *hs = ssl->s3->hs.get();
+  assert(hs != nullptr);
+  assert(!ssl->s3->initial_handshake_complete);
+
+  // Return the 0-RTT session, if in the 0-RTT state. While the handshake has
+  // not actually completed, the public accessors all report properties as if
+  // it has.
   if (hs->early_session) {
     return hs->early_session.get();
   }
-  if (hs->new_session) {
-    return hs->new_session.get();
-  }
-  return ssl->session.get();
+
+  // Otherwise, return the partial session.
+  return (SSL_SESSION *)ssl_handshake_session(hs);
 }
 
 SSL_SESSION *SSL_get1_session(SSL *ssl) {
diff --git a/src/ssl/ssl_test.cc b/src/ssl/ssl_test.cc
index 4169671..3515f60 100644
--- a/src/ssl/ssl_test.cc
+++ b/src/ssl/ssl_test.cc
@@ -39,6 +39,7 @@
 #include <openssl/ssl.h>
 #include <openssl/rand.h>
 #include <openssl/x509.h>
+#include <openssl/x509v3.h>
 
 #include "internal.h"
 #include "../crypto/internal.h"
@@ -1001,7 +1002,7 @@
           NID_sha256,
       },
       {
-          TLS1_CK_AES_256_GCM_SHA384,
+          TLS1_3_CK_AES_256_GCM_SHA384,
           "TLS_AES_256_GCM_SHA384",
           NID_aes_256_gcm,
           NID_undef,
@@ -1010,7 +1011,7 @@
           NID_sha384,
       },
       {
-          TLS1_CK_AES_128_GCM_SHA256,
+          TLS1_3_CK_AES_128_GCM_SHA256,
           "TLS_AES_128_GCM_SHA256",
           NID_aes_128_gcm,
           NID_undef,
@@ -1019,7 +1020,7 @@
           NID_sha256,
       },
       {
-          TLS1_CK_CHACHA20_POLY1305_SHA256,
+          TLS1_3_CK_CHACHA20_POLY1305_SHA256,
           "TLS_CHACHA20_POLY1305_SHA256",
           NID_chacha20_poly1305,
           NID_undef,
@@ -1498,6 +1499,8 @@
 struct ClientConfig {
   SSL_SESSION *session = nullptr;
   std::string servername;
+  std::string verify_hostname;
+  unsigned hostflags = 0;
   bool early_data = false;
 };
 
@@ -1520,6 +1523,12 @@
       !SSL_set_tlsext_host_name(client.get(), config.servername.c_str())) {
     return false;
   }
+  if (!config.verify_hostname.empty()) {
+    if (!SSL_set1_host(client.get(), config.verify_hostname.c_str())) {
+      return false;
+    }
+    SSL_set_hostflags(client.get(), config.hostflags);
+  }
 
   SSL_set_shed_handshake_config(client.get(), shed_handshake_config);
   SSL_set_shed_handshake_config(server.get(), shed_handshake_config);
@@ -3895,18 +3904,18 @@
                           {cert_.get(), cert_.get()}));
 }
 
-static bool ExpectBadWriteRetry() {
+static bool ExpectSingleError(int lib, int reason) {
+  const char *expected = ERR_reason_error_string(ERR_PACK(lib, reason));
   int err = ERR_get_error();
-  if (ERR_GET_LIB(err) != ERR_LIB_SSL ||
-      ERR_GET_REASON(err) != SSL_R_BAD_WRITE_RETRY) {
+  if (ERR_GET_LIB(err) != lib || ERR_GET_REASON(err) != reason) {
     char buf[ERR_ERROR_STRING_BUF_LEN];
     ERR_error_string_n(err, buf, sizeof(buf));
-    fprintf(stderr, "Wanted SSL_R_BAD_WRITE_RETRY, got: %s.\n", buf);
+    fprintf(stderr, "Wanted %s, got: %s.\n", expected, buf);
     return false;
   }
 
   if (ERR_peek_error() != 0) {
-    fprintf(stderr, "Unexpected error following SSL_R_BAD_WRITE_RETRY.\n");
+    fprintf(stderr, "Unexpected error following %s.\n", expected);
     return false;
   }
 
@@ -3922,8 +3931,6 @@
     SCOPED_TRACE(enable_partial_write);
 
     // Connect a client and server.
-    ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
-
     ASSERT_TRUE(Connect());
 
     if (enable_partial_write) {
@@ -3942,9 +3949,7 @@
         ASSERT_EQ(SSL_get_error(client_.get(), ret), SSL_ERROR_WANT_WRITE);
         break;
       }
-
       ASSERT_EQ(ret, 5);
-
       count++;
     }
 
@@ -3957,14 +3962,14 @@
     ASSERT_EQ(SSL_get_error(client_.get(),
                             SSL_write(client_.get(), data, kChunkLen - 1)),
               SSL_ERROR_SSL);
-    ASSERT_TRUE(ExpectBadWriteRetry());
+    ASSERT_TRUE(ExpectSingleError(ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY));
 
     // Retrying with a different buffer pointer is not legal.
     char data2[] = "hello";
     ASSERT_EQ(SSL_get_error(client_.get(),
                             SSL_write(client_.get(), data2, kChunkLen)),
               SSL_ERROR_SSL);
-    ASSERT_TRUE(ExpectBadWriteRetry());
+    ASSERT_TRUE(ExpectSingleError(ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY));
 
     // With |SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|, the buffer may move.
     SSL_set_mode(client_.get(), SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
@@ -3976,7 +3981,7 @@
     ASSERT_EQ(SSL_get_error(client_.get(),
                             SSL_write(client_.get(), data2, kChunkLen - 1)),
               SSL_ERROR_SSL);
-    ASSERT_TRUE(ExpectBadWriteRetry());
+    ASSERT_TRUE(ExpectSingleError(ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY));
 
     // Retrying with a larger buffer is legal.
     ASSERT_EQ(SSL_get_error(client_.get(),
@@ -3994,20 +3999,94 @@
     // pending record, skip over that many bytes of input (on assumption they
     // are the same), and write the remainder. If SSL_MODE_ENABLE_PARTIAL_WRITE
     // is set, this will complete in two steps.
-    char data3[] = "_____!";
+    char data_longer[] = "_____!!!!!";
     if (enable_partial_write) {
-      ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen);
-      ASSERT_EQ(SSL_write(client_.get(), data3 + kChunkLen, 1), 1);
+      ASSERT_EQ(SSL_write(client_.get(), data_longer, 2 * kChunkLen),
+                kChunkLen);
+      ASSERT_EQ(SSL_write(client_.get(), data_longer + kChunkLen, kChunkLen),
+                kChunkLen);
     } else {
-      ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen + 1);
+      ASSERT_EQ(SSL_write(client_.get(), data_longer, 2 * kChunkLen),
+                2 * kChunkLen);
     }
 
     // Check the last write was correct. The data will be spread over two
     // records, so SSL_read returns twice.
     ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
     ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
-    ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), 1);
-    ASSERT_EQ(buf[0], '!');
+    ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+    ASSERT_EQ(OPENSSL_memcmp(buf, "!!!!!", kChunkLen), 0);
+
+    // Fill the transport buffer again. This time only leave room for one
+    // record.
+    count = 0;
+    for (;;) {
+      int ret = SSL_write(client_.get(), data, kChunkLen);
+      if (ret <= 0) {
+        ASSERT_EQ(SSL_get_error(client_.get(), ret), SSL_ERROR_WANT_WRITE);
+        break;
+      }
+      ASSERT_EQ(ret, 5);
+      count++;
+    }
+    ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+    ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
+    count--;
+
+    // Retry the last write, with a longer input. The first half is the most
+    // recently failed write, from filling the buffer. |SSL_write| should write
+    // that to the transport, and then attempt to write the second half.
+    int ret = SSL_write(client_.get(), data_longer, 2 * kChunkLen);
+    if (enable_partial_write) {
+      // If partial writes are allowed, the write will succeed partially.
+      ASSERT_EQ(ret, kChunkLen);
+
+      // Check the first half and make room for another record.
+      ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+      ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
+      count--;
+
+      // Finish writing the input.
+      ASSERT_EQ(SSL_write(client_.get(), data_longer + kChunkLen, kChunkLen),
+                kChunkLen);
+    } else {
+      // Otherwise, although the first half made it to the transport, the second
+      // half is blocked.
+      ASSERT_EQ(ret, -1);
+      ASSERT_EQ(SSL_get_error(client_.get(), -1), SSL_ERROR_WANT_WRITE);
+
+      // Check the first half and make room for another record.
+      ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+      ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
+      count--;
+
+      // Retrying with fewer bytes than previously attempted is an error. If the
+      // input length is less than the number of bytes successfully written, the
+      // check happens at a different point, with a different error.
+      //
+      // TODO(davidben): Should these cases use the same error?
+      ASSERT_EQ(
+          SSL_get_error(client_.get(),
+                        SSL_write(client_.get(), data_longer, kChunkLen - 1)),
+          SSL_ERROR_SSL);
+      ASSERT_TRUE(ExpectSingleError(ERR_LIB_SSL, SSL_R_BAD_LENGTH));
+
+      // Complete the write with the correct retry.
+      ASSERT_EQ(SSL_write(client_.get(), data_longer, 2 * kChunkLen),
+                2 * kChunkLen);
+    }
+
+    // Drain the input and ensure everything was written correctly.
+    for (unsigned i = 0; i < count; i++) {
+      ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+      ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
+    }
+
+    // The final write is spread over two records.
+    ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+    ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
+    ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
+    ASSERT_EQ(OPENSSL_memcmp(buf, "!!!!!", kChunkLen), 0);
   }
 }
 
@@ -4685,7 +4764,7 @@
     }
   }
   char retry_count[256];
-  snprintf(retry_count, sizeof(retry_count), "%d", std::get<1>(params.param));
+  snprintf(retry_count, sizeof(retry_count), "%u", std::get<1>(params.param));
   ret += "_";
   ret += retry_count;
   ret += "Retries_";
@@ -4759,157 +4838,6 @@
   EXPECT_EQ(Bytes("x"), Bytes(result, result_len));
 }
 
-TEST(SSLTest, SealRecord) {
-  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
-      server_ctx(CreateContextWithTestCertificate(TLSv1_2_method()));
-  ASSERT_TRUE(client_ctx);
-  ASSERT_TRUE(server_ctx);
-
-  bssl::UniquePtr<SSL> client, server;
-  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
-                                     server_ctx.get()));
-
-  const std::vector<uint8_t> record = {1, 2, 3, 4, 5};
-  std::vector<uint8_t> prefix(
-      bssl::SealRecordPrefixLen(client.get(), record.size())),
-      body(record.size()),
-      suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
-  ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
-                               bssl::MakeSpan(body), bssl::MakeSpan(suffix),
-                               record));
-
-  std::vector<uint8_t> sealed;
-  sealed.insert(sealed.end(), prefix.begin(), prefix.end());
-  sealed.insert(sealed.end(), body.begin(), body.end());
-  sealed.insert(sealed.end(), suffix.begin(), suffix.end());
-  std::vector<uint8_t> sealed_copy = sealed;
-
-  bssl::Span<uint8_t> plaintext;
-  size_t record_len;
-  uint8_t alert = 255;
-  EXPECT_EQ(bssl::OpenRecord(server.get(), &plaintext, &record_len, &alert,
-                             bssl::MakeSpan(sealed)),
-            bssl::OpenRecordResult::kOK);
-  EXPECT_EQ(record_len, sealed.size());
-  EXPECT_EQ(plaintext, record);
-  EXPECT_EQ(255, alert);
-}
-
-TEST(SSLTest, SealRecordInPlace) {
-  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
-      server_ctx(CreateContextWithTestCertificate(TLSv1_2_method()));
-  ASSERT_TRUE(client_ctx);
-  ASSERT_TRUE(server_ctx);
-
-  bssl::UniquePtr<SSL> client, server;
-  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
-                                     server_ctx.get()));
-
-  const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
-  std::vector<uint8_t> record = plaintext;
-  std::vector<uint8_t> prefix(
-      bssl::SealRecordPrefixLen(client.get(), record.size())),
-      suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
-  ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
-                               bssl::MakeSpan(record), bssl::MakeSpan(suffix),
-                               record));
-  record.insert(record.begin(), prefix.begin(), prefix.end());
-  record.insert(record.end(), suffix.begin(), suffix.end());
-
-  bssl::Span<uint8_t> result;
-  size_t record_len;
-  uint8_t alert;
-  EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
-                             bssl::MakeSpan(record)),
-            bssl::OpenRecordResult::kOK);
-  EXPECT_EQ(record_len, record.size());
-  EXPECT_EQ(plaintext, result);
-}
-
-TEST(SSLTest, SealRecordTrailingData) {
-  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
-      server_ctx(CreateContextWithTestCertificate(TLSv1_2_method()));
-  ASSERT_TRUE(client_ctx);
-  ASSERT_TRUE(server_ctx);
-
-  bssl::UniquePtr<SSL> client, server;
-  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
-                                     server_ctx.get()));
-
-  const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
-  std::vector<uint8_t> record = plaintext;
-  std::vector<uint8_t> prefix(
-      bssl::SealRecordPrefixLen(client.get(), record.size())),
-      suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
-  ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
-                               bssl::MakeSpan(record), bssl::MakeSpan(suffix),
-                               record));
-  record.insert(record.begin(), prefix.begin(), prefix.end());
-  record.insert(record.end(), suffix.begin(), suffix.end());
-  record.insert(record.end(), {5, 4, 3, 2, 1});
-
-  bssl::Span<uint8_t> result;
-  size_t record_len;
-  uint8_t alert;
-  EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
-                             bssl::MakeSpan(record)),
-            bssl::OpenRecordResult::kOK);
-  EXPECT_EQ(record_len, record.size() - 5);
-  EXPECT_EQ(plaintext, result);
-}
-
-TEST(SSLTest, SealRecordInvalidSpanSize) {
-  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
-      server_ctx(CreateContextWithTestCertificate(TLSv1_2_method()));
-  ASSERT_TRUE(client_ctx);
-  ASSERT_TRUE(server_ctx);
-
-  bssl::UniquePtr<SSL> client, server;
-  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
-                                     server_ctx.get()));
-
-  std::vector<uint8_t> record = {1, 2, 3, 4, 5};
-  std::vector<uint8_t> prefix(
-      bssl::SealRecordPrefixLen(client.get(), record.size())),
-      body(record.size()),
-      suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
-
-  auto expect_err = []() {
-    int err = ERR_get_error();
-    EXPECT_EQ(ERR_GET_LIB(err), ERR_LIB_SSL);
-    EXPECT_EQ(ERR_GET_REASON(err), SSL_R_BUFFER_TOO_SMALL);
-    ERR_clear_error();
-  };
-  EXPECT_FALSE(bssl::SealRecord(
-      client.get(), bssl::MakeSpan(prefix.data(), prefix.size() - 1),
-      bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
-  expect_err();
-  EXPECT_FALSE(bssl::SealRecord(
-      client.get(), bssl::MakeSpan(prefix.data(), prefix.size() + 1),
-      bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
-  expect_err();
-
-  EXPECT_FALSE(
-      bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
-                       bssl::MakeSpan(record.data(), record.size() - 1),
-                       bssl::MakeSpan(suffix), record));
-  expect_err();
-  EXPECT_FALSE(
-      bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
-                       bssl::MakeSpan(record.data(), record.size() + 1),
-                       bssl::MakeSpan(suffix), record));
-  expect_err();
-
-  EXPECT_FALSE(bssl::SealRecord(
-      client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
-      bssl::MakeSpan(suffix.data(), suffix.size() - 1), record));
-  expect_err();
-  EXPECT_FALSE(bssl::SealRecord(
-      client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
-      bssl::MakeSpan(suffix.data(), suffix.size() + 1), record));
-  expect_err();
-}
-
 // The client should gracefully handle no suitable ciphers being enabled.
 TEST(SSLTest, NoCiphersAvailable) {
   bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
@@ -5137,7 +5065,7 @@
 
   SSL_CTX_set_session_cache_mode(client_ctx.get(), SSL_SESS_CACHE_CLIENT);
   SSL_CTX_sess_set_new_cb(client_ctx.get(), SaveLastSession);
-  SSL_CTX_set_handoff_mode(server_ctx.get(), 1);
+  SSL_CTX_set_handoff_mode(server_ctx.get(), true);
   uint8_t keys[48];
   SSL_CTX_get_tlsext_ticket_keys(server_ctx.get(), &keys, sizeof(keys));
   SSL_CTX_set_tlsext_ticket_keys(handshaker_ctx.get(), &keys, sizeof(keys));
@@ -5242,7 +5170,7 @@
   ASSERT_TRUE(client_ctx);
   ASSERT_TRUE(server_ctx);
 
-  SSL_CTX_set_handoff_mode(server_ctx.get(), 1);
+  SSL_CTX_set_handoff_mode(server_ctx.get(), true);
   ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_2_VERSION));
 
   bssl::UniquePtr<SSL> client, server;
@@ -7389,33 +7317,11 @@
   EXPECT_EQ(Bytes(SessionIDOf(client.get())), Bytes(SessionIDOf(server.get())));
 }
 
-TEST(SSLTest, WriteWhileExplicitRenegotiate) {
-  bssl::UniquePtr<SSL_CTX> ctx(CreateContextWithTestCertificate(TLS_method()));
-  ASSERT_TRUE(ctx);
-
-  ASSERT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_2_VERSION));
-  ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_2_VERSION));
-  ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(
-      ctx.get(), "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"));
-
-  bssl::UniquePtr<SSL> client, server;
-  ASSERT_TRUE(CreateClientAndServer(&client, &server, ctx.get(), ctx.get()));
-  SSL_set_renegotiate_mode(client.get(), ssl_renegotiate_explicit);
-  ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
-
-  static const uint8_t kInput[] = {'h', 'e', 'l', 'l', 'o'};
-
-  // Write "hello" until the buffer is full, so |client| has a pending write.
-  size_t num_writes = 0;
-  for (;;) {
-    int ret = SSL_write(client.get(), kInput, sizeof(kInput));
-    if (ret != int(sizeof(kInput))) {
-      ASSERT_EQ(-1, ret);
-      ASSERT_EQ(SSL_ERROR_WANT_WRITE, SSL_get_error(client.get(), ret));
-      break;
-    }
-    num_writes++;
-  }
+static void WriteHelloRequest(SSL *server) {
+  // This function assumes TLS 1.2 with ChaCha20-Poly1305.
+  ASSERT_EQ(SSL_version(server), TLS1_2_VERSION);
+  ASSERT_EQ(SSL_CIPHER_get_cipher_nid(SSL_get_current_cipher(server)),
+            NID_chacha20_poly1305);
 
   // Encrypt a HelloRequest.
   uint8_t in[] = {SSL3_MT_HELLO_REQUEST, 0, 0, 0};
@@ -7432,16 +7338,15 @@
   // Extract key material from |server|.
   static const size_t kKeyLen = 32;
   static const size_t kNonceLen = 12;
-  ASSERT_EQ(2u * (kKeyLen + kNonceLen), SSL_get_key_block_len(server.get()));
+  ASSERT_EQ(2u * (kKeyLen + kNonceLen), SSL_get_key_block_len(server));
   uint8_t key_block[2u * (kKeyLen + kNonceLen)];
-  ASSERT_TRUE(
-      SSL_generate_key_block(server.get(), key_block, sizeof(key_block)));
+  ASSERT_TRUE(SSL_generate_key_block(server, key_block, sizeof(key_block)));
   Span<uint8_t> key = MakeSpan(key_block + kKeyLen, kKeyLen);
   Span<uint8_t> nonce =
       MakeSpan(key_block + kKeyLen + kKeyLen + kNonceLen, kNonceLen);
 
   uint8_t ad[13];
-  uint64_t seq = SSL_get_write_sequence(server.get());
+  uint64_t seq = SSL_get_write_sequence(server);
   for (size_t i = 0; i < 8; i++) {
     // The nonce is XORed with the sequence number.
     nonce[11 - i] ^= uint8_t(seq);
@@ -7474,7 +7379,38 @@
 #endif  // BORINGSSL_UNSAFE_FUZZER_MODE
 
   ASSERT_EQ(int(sizeof(record)),
-            BIO_write(SSL_get_wbio(server.get()), record, sizeof(record)));
+            BIO_write(SSL_get_wbio(server), record, sizeof(record)));
+}
+
+TEST(SSLTest, WriteWhileExplicitRenegotiate) {
+  bssl::UniquePtr<SSL_CTX> ctx(CreateContextWithTestCertificate(TLS_method()));
+  ASSERT_TRUE(ctx);
+
+  ASSERT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_2_VERSION));
+  ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_2_VERSION));
+  ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(
+      ctx.get(), "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"));
+
+  bssl::UniquePtr<SSL> client, server;
+  ASSERT_TRUE(CreateClientAndServer(&client, &server, ctx.get(), ctx.get()));
+  SSL_set_renegotiate_mode(client.get(), ssl_renegotiate_explicit);
+  ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
+
+  static const uint8_t kInput[] = {'h', 'e', 'l', 'l', 'o'};
+
+  // Write "hello" until the buffer is full, so |client| has a pending write.
+  size_t num_writes = 0;
+  for (;;) {
+    int ret = SSL_write(client.get(), kInput, sizeof(kInput));
+    if (ret != int(sizeof(kInput))) {
+      ASSERT_EQ(-1, ret);
+      ASSERT_EQ(SSL_ERROR_WANT_WRITE, SSL_get_error(client.get(), ret));
+      break;
+    }
+    num_writes++;
+  }
+
+  ASSERT_NO_FATAL_FAILURE(WriteHelloRequest(server.get()));
 
   // |SSL_read| should pick up the HelloRequest.
   uint8_t byte;
@@ -7516,6 +7452,57 @@
   EXPECT_EQ(SSL_R_NO_RENEGOTIATION, ERR_GET_REASON(err));
 }
 
+TEST(SSLTest, ConnectionPropertiesDuringRenegotiate) {
+  // Configure known connection properties, so we can check against them.
+  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
+  ASSERT_TRUE(ctx);
+  bssl::UniquePtr<X509> cert = GetTestCertificate();
+  ASSERT_TRUE(cert);
+  bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
+  ASSERT_TRUE(key);
+  ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
+  ASSERT_TRUE(SSL_CTX_use_PrivateKey(ctx.get(), key.get()));
+  ASSERT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_2_VERSION));
+  ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_2_VERSION));
+  ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(
+      ctx.get(), "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"));
+  ASSERT_TRUE(SSL_CTX_set1_curves_list(ctx.get(), "X25519"));
+  ASSERT_TRUE(SSL_CTX_set1_sigalgs_list(ctx.get(), "rsa_pkcs1_sha256"));
+
+  // Connect a client and server that accept renegotiation.
+  bssl::UniquePtr<SSL> client, server;
+  ASSERT_TRUE(CreateClientAndServer(&client, &server, ctx.get(), ctx.get()));
+  SSL_set_renegotiate_mode(client.get(), ssl_renegotiate_freely);
+  ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
+
+  auto check_properties = [&] {
+    EXPECT_EQ(SSL_version(client.get()), TLS1_2_VERSION);
+    const SSL_CIPHER *cipher = SSL_get_current_cipher(client.get());
+    ASSERT_TRUE(cipher);
+    EXPECT_EQ(SSL_CIPHER_get_id(cipher),
+              uint32_t{TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256});
+    EXPECT_EQ(SSL_get_curve_id(client.get()), SSL_CURVE_X25519);
+    EXPECT_EQ(SSL_get_peer_signature_algorithm(client.get()),
+              SSL_SIGN_RSA_PKCS1_SHA256);
+    bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(client.get()));
+    ASSERT_TRUE(peer);
+    EXPECT_EQ(X509_cmp(cert.get(), peer.get()), 0);
+  };
+  check_properties();
+
+  // The server sends a HelloRequest.
+  ASSERT_NO_FATAL_FAILURE(WriteHelloRequest(server.get()));
+
+  // Reading from the client will consume the HelloRequest, start a
+  // renegotiation, and then block on a ServerHello from the server.
+  uint8_t byte;
+  ASSERT_EQ(-1, SSL_read(client.get(), &byte, 1));
+  ASSERT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(client.get(), -1));
+
+  // Connection properties should continue to report values from the original
+  // handshake.
+  check_properties();
+}
 
 TEST(SSLTest, CopyWithoutEarlyData) {
   bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
@@ -8002,5 +7989,441 @@
   }
 }
 
+TEST(SSLTest, HostMatching) {
+  static const char kCertPEM[] = R"(
+-----BEGIN CERTIFICATE-----
+MIIB9jCCAZ2gAwIBAgIQeudG9R61BOxUvWkeVhU5DTAKBggqhkjOPQQDAjApMRAw
+DgYDVQQKEwdBY21lIENvMRUwEwYDVQQDEwxleGFtcGxlMy5jb20wHhcNMjExMjA2
+MjA1NjU2WhcNMjIxMjA2MjA1NjU2WjApMRAwDgYDVQQKEwdBY21lIENvMRUwEwYD
+VQQDEwxleGFtcGxlMy5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7l2VO
+Bl2TjVm9WfGk24+hMbVFUNB+RVHWbCvFvNZAoWiIJ2z34RLGInyZvCZ8xLAvsuaW
+ULDDaoeDl1M0t4Hmo4GmMIGjMA4GA1UdDwEB/wQEAwIChDATBgNVHSUEDDAKBggr
+BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTTJWurcc1t+VPQBko3
+Gsw6cbcWSTBMBgNVHREERTBDggxleGFtcGxlMS5jb22CDGV4YW1wbGUyLmNvbYIP
+YSouZXhhbXBsZTQuY29tgg4qLmV4YW1wbGU1LmNvbYcEAQIDBDAKBggqhkjOPQQD
+AgNHADBEAiAAv0ljHJGrgyzZDkG6XvNZ5ewxRfnXcZuD0Y7E4giCZgIgNK1qjilu
+5DyVbfKeeJhOCtGxqE1dWLXyJBnoRomSYBY=
+-----END CERTIFICATE-----
+)";
+  bssl::UniquePtr<X509> cert(CertFromPEM(kCertPEM));
+  ASSERT_TRUE(cert);
+  static const char kCertNoSANsPEM[] = R"(
+-----BEGIN CERTIFICATE-----
+MIIBqzCCAVGgAwIBAgIQeudG9R61BOxUvWkeVhU5DTAKBggqhkjOPQQDAjArMRIw
+EAYDVQQKEwlBY21lIENvIDIxFTATBgNVBAMTDGV4YW1wbGUzLmNvbTAeFw0yMTEy
+MDYyMDU2NTZaFw0yMjEyMDYyMDU2NTZaMCsxEjAQBgNVBAoTCUFjbWUgQ28gMjEV
+MBMGA1UEAxMMZXhhbXBsZTMuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+u5dlTgZdk41ZvVnxpNuPoTG1RVDQfkVR1mwrxbzWQKFoiCds9+ESxiJ8mbwmfMSw
+L7LmllCww2qHg5dTNLeB5qNXMFUwDgYDVR0PAQH/BAQDAgKEMBMGA1UdJQQMMAoG
+CCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNMla6txzW35U9AG
+SjcazDpxtxZJMAoGCCqGSM49BAMCA0gAMEUCIG3YWGWtpVhbcGV7wFKQwTfmvwHW
+pw4qCFZlool4hCwsAiEA+2fc6NfSbNpFEtQkDOMJW2ANiScAVEmImNqPfb2klz4=
+-----END CERTIFICATE-----
+)";
+  bssl::UniquePtr<X509> cert_no_sans(CertFromPEM(kCertNoSANsPEM));
+  ASSERT_TRUE(cert_no_sans);
+
+  static const char kKeyPEM[] = R"(
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghsaSZhUzZAcQlLyJ
+MDuy7WPdyqNsAX9rmEP650LF/q2hRANCAAS7l2VOBl2TjVm9WfGk24+hMbVFUNB+
+RVHWbCvFvNZAoWiIJ2z34RLGInyZvCZ8xLAvsuaWULDDaoeDl1M0t4Hm
+-----END PRIVATE KEY-----
+)";
+  bssl::UniquePtr<EVP_PKEY> key(KeyFromPEM(kKeyPEM));
+  ASSERT_TRUE(key);
+
+  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
+  ASSERT_TRUE(client_ctx);
+  ASSERT_TRUE(X509_STORE_add_cert(SSL_CTX_get_cert_store(client_ctx.get()),
+                                  cert.get()));
+  ASSERT_TRUE(X509_STORE_add_cert(SSL_CTX_get_cert_store(client_ctx.get()),
+                                  cert_no_sans.get()));
+  SSL_CTX_set_verify(client_ctx.get(),
+                     SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
+                     nullptr);
+  X509_VERIFY_PARAM_set_flags(SSL_CTX_get0_param(client_ctx.get()),
+                              X509_V_FLAG_NO_CHECK_TIME);
+
+  struct TestCase {
+    X509 *cert;
+    std::string hostname;
+    unsigned flags;
+    bool should_match;
+  };
+  std::vector<TestCase> kTests = {
+      // These two names are present as SANs in the certificate.
+      {cert.get(), "example1.com", 0, true},
+      {cert.get(), "example2.com", 0, true},
+      // This is the CN of the certificate, but that shouldn't matter if a SAN
+      // extension is present.
+      {cert.get(), "example3.com", 0, false},
+      // If the SAN is not present, we, for now, look for DNS names in the CN.
+      {cert_no_sans.get(), "example3.com", 0, true},
+      // ... but this can be turned off.
+      {cert_no_sans.get(), "example3.com", X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
+       false},
+      // a*.example4.com is a SAN, but is invalid.
+      {cert.get(), "abc.example4.com", 0, false},
+      // *.example5.com is a SAN in the certificate, which is a normal and valid
+      // wildcard.
+      {cert.get(), "abc.example5.com", 0, true},
+      // This name is not present.
+      {cert.get(), "notexample1.com", 0, false},
+      // The IPv4 address 1.2.3.4 is a SAN, but that shouldn't match against a
+      // hostname that happens to be its textual representation.
+      {cert.get(), "1.2.3.4", 0, false},
+  };
+
+  for (const TestCase &test : kTests) {
+    SCOPED_TRACE(test.hostname);
+
+    bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
+    ASSERT_TRUE(server_ctx);
+    ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), test.cert));
+    ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
+
+    ClientConfig config;
+    bssl::UniquePtr<SSL> client, server;
+    config.verify_hostname = test.hostname;
+    config.hostflags = test.flags;
+    EXPECT_EQ(test.should_match,
+              ConnectClientAndServer(&client, &server, client_ctx.get(),
+                                     server_ctx.get(), config));
+  }
+}
+
+TEST(SSLTest, NumTickets) {
+  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
+  ASSERT_TRUE(server_ctx);
+  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
+  ASSERT_TRUE(client_ctx);
+  bssl::UniquePtr<X509> cert = GetTestCertificate();
+  ASSERT_TRUE(cert);
+  bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
+  ASSERT_TRUE(key);
+  ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
+  ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
+  SSL_CTX_set_session_cache_mode(server_ctx.get(), SSL_SESS_CACHE_BOTH);
+
+  SSL_CTX_set_session_cache_mode(client_ctx.get(), SSL_SESS_CACHE_BOTH);
+  static size_t ticket_count;
+  SSL_CTX_sess_set_new_cb(client_ctx.get(), [](SSL *, SSL_SESSION *) -> int {
+    ticket_count++;
+    return 0;
+  });
+
+  auto count_tickets = [&]() -> size_t {
+    ticket_count = 0;
+    bssl::UniquePtr<SSL> client, server;
+    if (!ConnectClientAndServer(&client, &server, client_ctx.get(),
+                                server_ctx.get()) ||
+        !FlushNewSessionTickets(client.get(), server.get())) {
+      ADD_FAILURE() << "Could not run handshake";
+      return 0;
+    }
+    return ticket_count;
+  };
+
+  // By default, we should send two tickets.
+  EXPECT_EQ(count_tickets(), 2u);
+
+  for (size_t num_tickets : {0, 1, 2, 3, 4, 5}) {
+    SCOPED_TRACE(num_tickets);
+    ASSERT_TRUE(SSL_CTX_set_num_tickets(server_ctx.get(), num_tickets));
+    EXPECT_EQ(SSL_CTX_get_num_tickets(server_ctx.get()), num_tickets);
+    EXPECT_EQ(count_tickets(), num_tickets);
+  }
+
+  // Configuring too many tickets causes us to stop at some point.
+  ASSERT_TRUE(SSL_CTX_set_num_tickets(server_ctx.get(), 100000));
+  EXPECT_EQ(SSL_CTX_get_num_tickets(server_ctx.get()), 16u);
+  EXPECT_EQ(count_tickets(), 16u);
+}
+
+TEST(SSLTest, CertSubjectsToStack) {
+  const std::string kCert1 = R"(
+-----BEGIN CERTIFICATE-----
+MIIBzzCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
+QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
+dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
+BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
+dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
+v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
+HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw
+HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ
+BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E
+BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ=
+-----END CERTIFICATE-----
+)";
+  const std::vector<uint8_t> kName1 = {
+      0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+      0x02, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
+      0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
+      0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x49,
+      0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
+      0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64};
+  const std::string kCert2 = R"(
+-----BEGIN CERTIFICATE-----
+MIICXjCCAcegAwIBAgIIWjO48ufpunYwDQYJKoZIhvcNAQELBQAwNjEaMBgGA1UE
+ChMRQm9yaW5nU1NMIFRFU1RJTkcxGDAWBgNVBAMTD0ludGVybWVkaWF0ZSBDQTAg
+Fw0xNTAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowMjEaMBgGA1UEChMRQm9y
+aW5nU1NMIFRFU1RJTkcxFDASBgNVBAMTC2V4YW1wbGUuY29tMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQDD0U0ZYgqShJ7oOjsyNKyVXEHqeafmk/bAoPqY/h1c
+oPw2E8KmeqiUSoTPjG5IXSblOxcqpbAXgnjPzo8DI3GNMhAf8SYNYsoH7gc7Uy7j
+5x8bUrisGnuTHqkqH6d4/e7ETJ7i3CpR8bvK16DggEvQTudLipz8FBHtYhFakfdh
+TwIDAQABo3cwdTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
+CCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwGQYDVR0OBBIEEKN5pvbur7mlXjeMEYA0
+4nUwGwYDVR0jBBQwEoAQjBpoqLV2211Xex+NFLIGozANBgkqhkiG9w0BAQsFAAOB
+gQBj/p+JChp//LnXWC1k121LM/ii7hFzQzMrt70bny406SGz9jAjaPOX4S3gt38y
+rhjpPukBlSzgQXFg66y6q5qp1nQTD1Cw6NkKBe9WuBlY3iYfmsf7WT8nhlT1CttU
+xNCwyMX9mtdXdQicOfNjIGUCD5OLV5PgHFPRKiHHioBAhg==
+-----END CERTIFICATE-----
+)";
+  const std::vector<uint8_t> kName2 = {
+      0x30, 0x32, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a,
+      0x13, 0x11, 0x42, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x53, 0x4c,
+      0x20, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x31, 0x14, 0x30,
+      0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x65, 0x78, 0x61,
+      0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d};
+
+  const struct {
+    std::vector<std::vector<uint8_t>> existing;
+    std::string pem;
+    std::vector<std::vector<uint8_t>> expected;
+  } kTests[] = {
+      // Do nothing.
+      {{}, "", {}},
+      // Append to an empty list, skipping duplicates.
+      {{}, kCert1 + kCert2 + kCert1, {kName1, kName2}},
+      // One of the names was already present.
+      {{kName1}, kCert1 + kCert2, {kName1, kName2}},
+      // Both names were already present.
+      {{kName1, kName2}, kCert1 + kCert2, {kName1, kName2}},
+      // Preserve existing duplicates.
+      {{kName1, kName2, kName2}, kCert1 + kCert2, {kName1, kName2, kName2}},
+  };
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTests); i++) {
+    SCOPED_TRACE(i);
+    const auto &t = kTests[i];
+
+    bssl::UniquePtr<STACK_OF(X509_NAME)> stack(sk_X509_NAME_new_null());
+    ASSERT_TRUE(stack);
+    for (const auto& name : t.existing) {
+      const uint8_t *inp = name.data();
+      bssl::UniquePtr<X509_NAME> name_obj(
+          d2i_X509_NAME(nullptr, &inp, name.size()));
+      ASSERT_TRUE(name_obj);
+      EXPECT_EQ(inp, name.data() + name.size());
+      ASSERT_TRUE(bssl::PushToStack(stack.get(), std::move(name_obj)));
+    }
+
+    bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(t.pem.data(), t.pem.size()));
+    ASSERT_TRUE(bio);
+    ASSERT_TRUE(SSL_add_bio_cert_subjects_to_stack(stack.get(), bio.get()));
+
+    // The function should have left |stack|'s comparison function alone.
+    EXPECT_EQ(nullptr, sk_X509_NAME_set_cmp_func(stack.get(), nullptr));
+
+    std::vector<std::vector<uint8_t>> expected = t.expected, result;
+    for (X509_NAME *name : stack.get()) {
+      uint8_t *der = nullptr;
+      int der_len = i2d_X509_NAME(name, &der);
+      ASSERT_GE(der_len, 0);
+      result.push_back(std::vector<uint8_t>(der, der + der_len));
+      OPENSSL_free(der);
+    }
+
+    // |SSL_add_bio_cert_subjects_to_stack| does not return the output in a
+    // well-defined order.
+    std::sort(expected.begin(), expected.end());
+    std::sort(result.begin(), result.end());
+    EXPECT_EQ(result, expected);
+  }
+}
+
+#if defined(OPENSSL_LINUX) || defined(OPENSSL_APPLE)
+TEST(SSLTest, EmptyClientCAList) {
+  // Use /dev/null on POSIX systems as an empty file.
+  bssl::UniquePtr<STACK_OF(X509_NAME)> names(
+      SSL_load_client_CA_file("/dev/null"));
+  EXPECT_FALSE(names);
+}
+#endif  // OPENSSL_LINUX || OPENSSL_APPLE
+
+TEST(SSLTest, EmptyWriteBlockedOnHandshakeData) {
+  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
+  bssl::UniquePtr<SSL_CTX> server_ctx =
+      CreateContextWithTestCertificate(TLS_method());
+  ASSERT_TRUE(client_ctx);
+  ASSERT_TRUE(server_ctx);
+  // Configure only TLS 1.3. This test requires post-handshake NewSessionTicket.
+  ASSERT_TRUE(SSL_CTX_set_min_proto_version(client_ctx.get(), TLS1_3_VERSION));
+  ASSERT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION));
+
+  // Connect a client and server with tiny buffer between the two.
+  bssl::UniquePtr<SSL> client(SSL_new(client_ctx.get())),
+      server(SSL_new(server_ctx.get()));
+  ASSERT_TRUE(client);
+  ASSERT_TRUE(server);
+  SSL_set_connect_state(client.get());
+  SSL_set_accept_state(server.get());
+  BIO *bio1, *bio2;
+  ASSERT_TRUE(BIO_new_bio_pair(&bio1, 1, &bio2, 1));
+  SSL_set_bio(client.get(), bio1, bio1);
+  SSL_set_bio(server.get(), bio2, bio2);
+  ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
+
+  // We defer NewSessionTicket to the first write, so the server has a pending
+  // NewSessionTicket. See https://boringssl-review.googlesource.com/34948. This
+  // means an empty write will flush the ticket. However, the transport only
+  // allows one byte through, so this will fail with |SSL_ERROR_WANT_WRITE|.
+  int ret = SSL_write(server.get(), nullptr, 0);
+  ASSERT_EQ(ret, -1);
+  ASSERT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_WANT_WRITE);
+
+  // Attempting to write non-zero data should not trip |SSL_R_BAD_WRITE_RETRY|.
+  const uint8_t kData[] = {'h', 'e', 'l', 'l', 'o'};
+  ret = SSL_write(server.get(), kData, sizeof(kData));
+  ASSERT_EQ(ret, -1);
+  ASSERT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_WANT_WRITE);
+
+  // Byte by byte, the data should eventually get through.
+  uint8_t buf[sizeof(kData)];
+  for (;;) {
+    ret = SSL_read(client.get(), buf, sizeof(buf));
+    ASSERT_EQ(ret, -1);
+    ASSERT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_WANT_READ);
+
+    ret = SSL_write(server.get(), kData, sizeof(kData));
+    if (ret > 0) {
+      ASSERT_EQ(ret, 5);
+      break;
+    }
+    ASSERT_EQ(ret, -1);
+    ASSERT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_WANT_WRITE);
+  }
+
+  ret = SSL_read(client.get(), buf, sizeof(buf));
+  ASSERT_EQ(ret, static_cast<int>(sizeof(kData)));
+  ASSERT_EQ(Bytes(buf, ret), Bytes(kData));
+}
+
+// Test that |SSL_ERROR_SYSCALL| continues to work after a close_notify.
+TEST(SSLTest, ErrorSyscallAfterCloseNotify) {
+  // Make a custom |BIO| where writes fail, but without pushing to the error
+  // queue.
+  bssl::UniquePtr<BIO_METHOD> method(BIO_meth_new(0, nullptr));
+  ASSERT_TRUE(method);
+  BIO_meth_set_create(method.get(), [](BIO *b) -> int {
+    BIO_set_init(b, 1);
+    return 1;
+  });
+  static bool write_failed = false;
+  BIO_meth_set_write(method.get(), [](BIO *, const char *, int) -> int {
+    // Fail the operation and don't add to the error queue.
+    write_failed = true;
+    return -1;
+  });
+  bssl::UniquePtr<BIO> wbio_silent_error(BIO_new(method.get()));
+  ASSERT_TRUE(wbio_silent_error);
+
+  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
+  bssl::UniquePtr<SSL_CTX> server_ctx =
+      CreateContextWithTestCertificate(TLS_method());
+  ASSERT_TRUE(client_ctx);
+  ASSERT_TRUE(server_ctx);
+  bssl::UniquePtr<SSL> client, server;
+  EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
+                                     server_ctx.get()));
+
+  // Replace the write |BIO| with |wbio_silent_error|.
+  SSL_set0_wbio(client.get(), wbio_silent_error.release());
+
+  // Writes should fail. There is nothing in the error queue, so
+  // |SSL_ERROR_SYSCALL| indicates the caller needs to check out-of-band.
+  const uint8_t data[1] = {0};
+  int ret = SSL_write(client.get(), data, sizeof(data));
+  EXPECT_EQ(ret, -1);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
+  EXPECT_TRUE(write_failed);
+  write_failed = false;
+
+  // Send a close_notify from the server. It should return 0 because
+  // close_notify was sent, but not received. Confusingly, this is a success
+  // output for |SSL_shutdown|'s API.
+  EXPECT_EQ(SSL_shutdown(server.get()), 0);
+
+  // Read the close_notify on the client.
+  uint8_t buf[1];
+  ret = SSL_read(client.get(), buf, sizeof(buf));
+  EXPECT_EQ(ret, 0);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_ZERO_RETURN);
+
+  // Further calls to |SSL_read| continue to report |SSL_ERROR_ZERO_RETURN|.
+  ret = SSL_read(client.get(), buf, sizeof(buf));
+  EXPECT_EQ(ret, 0);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_ZERO_RETURN);
+
+  // Although the client has seen close_notify, it should continue to report
+  // |SSL_ERROR_SYSCALL| when its writes fail.
+  ret = SSL_write(client.get(), data, sizeof(data));
+  EXPECT_EQ(ret, -1);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
+  EXPECT_TRUE(write_failed);
+  write_failed = false;
+
+  // Cause |BIO_write| to fail with a return value of zero instead.
+  // |SSL_get_error| should not misinterpret this as a close_notify.
+  //
+  // This is not actually a correct implementation of |BIO_write|, but the rest
+  // of the code treats zero from |BIO_write| as an error, so ensure it does so
+  // correctly. Fixing https://crbug.com/boringssl/503 will make this case moot.
+  BIO_meth_set_write(method.get(), [](BIO *, const char *, int) -> int {
+    write_failed = true;
+    return 0;
+  });
+  ret = SSL_write(client.get(), data, sizeof(data));
+  EXPECT_EQ(ret, 0);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
+  EXPECT_TRUE(write_failed);
+  write_failed = false;
+}
+
+// Test that |SSL_shutdown|, when quiet shutdown is enabled, simulates receiving
+// a close_notify, down to |SSL_read| reporting |SSL_ERROR_ZERO_RETURN|.
+TEST(SSLTest, QuietShutdown) {
+  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
+  bssl::UniquePtr<SSL_CTX> server_ctx =
+      CreateContextWithTestCertificate(TLS_method());
+  ASSERT_TRUE(client_ctx);
+  ASSERT_TRUE(server_ctx);
+  SSL_CTX_set_quiet_shutdown(server_ctx.get(), 1);
+  bssl::UniquePtr<SSL> client, server;
+  EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
+                                     server_ctx.get()));
+
+  // Quiet shutdown is enabled, so |SSL_shutdown| on the server should
+  // immediately return that bidirectional shutdown "completed".
+  EXPECT_EQ(SSL_shutdown(server.get()), 1);
+
+  // Shut down writes so the client gets an EOF.
+  EXPECT_TRUE(BIO_shutdown_wr(SSL_get_wbio(server.get())));
+
+  // Confirm no close notify was actually sent. Client reads should report a
+  // transport EOF, not a close_notify. (Both have zero return, but
+  // |SSL_get_error| is different.)
+  char buf[1];
+  int ret = SSL_read(client.get(), buf, sizeof(buf));
+  EXPECT_EQ(ret, 0);
+  EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
+
+  // The server believes bidirectional shutdown completed, so reads should
+  // replay the (simulated) close_notify.
+  ret = SSL_read(server.get(), buf, sizeof(buf));
+  EXPECT_EQ(ret, 0);
+  EXPECT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_ZERO_RETURN);
+}
+
 }  // namespace
 BSSL_NAMESPACE_END
diff --git a/src/ssl/ssl_x509.cc b/src/ssl/ssl_x509.cc
index 26eb90a..5533c7f 100644
--- a/src/ssl/ssl_x509.cc
+++ b/src/ssl/ssl_x509.cc
@@ -1304,6 +1304,23 @@
   return set_cert_store(&ssl->config->cert->verify_store, store, 1);
 }
 
+int SSL_set1_host(SSL *ssl, const char *hostname) {
+  check_ssl_x509_method(ssl);
+  if (!ssl->config) {
+    return 0;
+  }
+  return X509_VERIFY_PARAM_set1_host(ssl->config->param, hostname,
+                                     strlen(hostname));
+}
+
+void SSL_set_hostflags(SSL *ssl, unsigned flags) {
+  check_ssl_x509_method(ssl);
+  if (!ssl->config) {
+    return;
+  }
+  X509_VERIFY_PARAM_set_hostflags(ssl->config->param, flags);
+}
+
 int SSL_alert_from_verify_result(long result) {
   switch (result) {
     case X509_V_ERR_CERT_CHAIN_TOO_LONG:
diff --git a/src/ssl/test/CMakeLists.txt b/src/ssl/test/CMakeLists.txt
index bb9bd81..f02d6e2 100644
--- a/src/ssl/test/CMakeLists.txt
+++ b/src/ssl/test/CMakeLists.txt
@@ -17,7 +17,7 @@
 
 target_link_libraries(bssl_shim test_support_lib ssl crypto)
 
-if(UNIX AND NOT APPLE AND NOT ANDROID)
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
   add_executable(
     handshaker
 
diff --git a/src/ssl/test/bssl_shim.cc b/src/ssl/test/bssl_shim.cc
index f4e7fff..3e12a0f 100644
--- a/src/ssl/test/bssl_shim.cc
+++ b/src/ssl/test/bssl_shim.cc
@@ -407,9 +407,9 @@
   }
 
   if (config->expect_version != 0 &&
-      SSL_version(ssl) != config->expect_version) {
+      SSL_version(ssl) != int{config->expect_version}) {
     fprintf(stderr, "want version %04x, got %04x\n", config->expect_version,
-            SSL_version(ssl));
+            static_cast<uint16_t>(SSL_version(ssl)));
     return false;
   }
 
@@ -575,9 +575,9 @@
 
   if (config->expect_curve_id != 0) {
     uint16_t curve_id = SSL_get_curve_id(ssl);
-    if (static_cast<uint16_t>(config->expect_curve_id) != curve_id) {
+    if (config->expect_curve_id != curve_id) {
       fprintf(stderr, "curve_id was %04x, wanted %04x\n", curve_id,
-              static_cast<uint16_t>(config->expect_curve_id));
+              config->expect_curve_id);
       return false;
     }
   }
@@ -585,24 +585,24 @@
   uint16_t cipher_id = SSL_CIPHER_get_protocol_id(SSL_get_current_cipher(ssl));
   if (config->expect_cipher_aes != 0 &&
       EVP_has_aes_hardware() &&
-      static_cast<uint16_t>(config->expect_cipher_aes) != cipher_id) {
+      config->expect_cipher_aes != cipher_id) {
     fprintf(stderr, "Cipher ID was %04x, wanted %04x (has AES hardware)\n",
-            cipher_id, static_cast<uint16_t>(config->expect_cipher_aes));
+            cipher_id, config->expect_cipher_aes);
     return false;
   }
 
   if (config->expect_cipher_no_aes != 0 &&
       !EVP_has_aes_hardware() &&
-      static_cast<uint16_t>(config->expect_cipher_no_aes) != cipher_id) {
+      config->expect_cipher_no_aes != cipher_id) {
     fprintf(stderr, "Cipher ID was %04x, wanted %04x (no AES hardware)\n",
-            cipher_id, static_cast<uint16_t>(config->expect_cipher_no_aes));
+            cipher_id, config->expect_cipher_no_aes);
     return false;
   }
 
   if (config->expect_cipher != 0 &&
-      static_cast<uint16_t>(config->expect_cipher) != cipher_id) {
+      config->expect_cipher != cipher_id) {
     fprintf(stderr, "Cipher ID was %04x, wanted %04x\n", cipher_id,
-            static_cast<uint16_t>(config->expect_cipher));
+            config->expect_cipher);
     return false;
   }
 
@@ -667,13 +667,19 @@
   }
 
   // Test that handshake hints correctly skipped the expected operations.
-  //
-  // TODO(davidben): Add support for TLS 1.2 hints and remove the version check.
-  // Also add a check for the session cache lookup.
-  if (config->handshake_hints && !config->allow_hint_mismatch &&
-      SSL_version(ssl) == TLS1_3_VERSION) {
+  if (config->handshake_hints && !config->allow_hint_mismatch) {
     const TestState *state = GetTestState(ssl);
-    if (!SSL_used_hello_retry_request(ssl) && state->used_private_key) {
+    // If the private key operation is performed in the first roundtrip, a hint
+    // match should have skipped it. This is ECDHE-based cipher suites in TLS
+    // 1.2 and non-HRR handshakes in TLS 1.3.
+    bool private_key_allowed;
+    if (SSL_version(ssl) == TLS1_3_VERSION) {
+      private_key_allowed = SSL_used_hello_retry_request(ssl);
+    } else {
+      private_key_allowed =
+          SSL_CIPHER_get_kx_nid(SSL_get_current_cipher(ssl)) == NID_kx_rsa;
+    }
+    if (!private_key_allowed && state->used_private_key) {
       fprintf(
           stderr,
           "Performed private key operation, but hint should have skipped it\n");
@@ -685,6 +691,9 @@
               "Performed ticket decryption, but hint should have skipped it\n");
       return false;
     }
+
+    // TODO(davidben): Decide what we want to do with TLS 1.2 stateful
+    // resumption.
   }
   return true;
 }
diff --git a/src/ssl/test/handshake_util.cc b/src/ssl/test/handshake_util.cc
index b999831..6516547 100644
--- a/src/ssl/test/handshake_util.cc
+++ b/src/ssl/test/handshake_util.cc
@@ -255,7 +255,7 @@
           return false;
         }
         if (bytes_written != bytes_read) {
-          fprintf(stderr, "short write (%zu of %d bytes)\n", bytes_written,
+          fprintf(stderr, "short write (%zd of %d bytes)\n", bytes_written,
                   bytes_read);
           return false;
         }
diff --git a/src/ssl/test/runner/common.go b/src/ssl/test/runner/common.go
index bf6a3d1..07562df 100644
--- a/src/ssl/test/runner/common.go
+++ b/src/ssl/test/runner/common.go
@@ -639,6 +639,14 @@
 	// HelloVerifyRequest message.
 	SkipHelloVerifyRequest bool
 
+	// HelloVerifyRequestCookieLength, if non-zero, is the length of the cookie
+	// to request in HelloVerifyRequest.
+	HelloVerifyRequestCookieLength int
+
+	// EmptyHelloVerifyRequestCookie, if true, causes a DTLS server to request
+	// an empty cookie in HelloVerifyRequest.
+	EmptyHelloVerifyRequestCookie bool
+
 	// SkipCertificateStatus, if true, causes the server to skip the
 	// CertificateStatus message. This is legal because CertificateStatus is
 	// optional, even with a status_request in ServerHello.
diff --git a/src/ssl/test/runner/handshake_messages.go b/src/ssl/test/runner/handshake_messages.go
index f2ef2fc..fbfbdd9 100644
--- a/src/ssl/test/runner/handshake_messages.go
+++ b/src/ssl/test/runner/handshake_messages.go
@@ -872,11 +872,8 @@
 		len(m.sessionID) > 32 {
 		return false
 	}
-	if m.isDTLS {
-		if !reader.readU8LengthPrefixedBytes(&m.cookie) ||
-			len(m.cookie) > 32 {
-			return false
-		}
+	if m.isDTLS && !reader.readU8LengthPrefixedBytes(&m.cookie) {
+		return false
 	}
 	var cipherSuites byteReader
 	if !reader.readU16LengthPrefixed(&cipherSuites) ||
diff --git a/src/ssl/test/runner/handshake_server.go b/src/ssl/test/runner/handshake_server.go
index 4f41184..5ae7d93 100644
--- a/src/ssl/test/runner/handshake_server.go
+++ b/src/ssl/test/runner/handshake_server.go
@@ -235,9 +235,16 @@
 	if c.isDTLS && !config.Bugs.SkipHelloVerifyRequest {
 		// Per RFC 6347, the version field in HelloVerifyRequest SHOULD
 		// be always DTLS 1.0
+		cookieLen := c.config.Bugs.HelloVerifyRequestCookieLength
+		if cookieLen == 0 {
+			cookieLen = 32
+		}
+		if c.config.Bugs.EmptyHelloVerifyRequestCookie {
+			cookieLen = 0
+		}
 		helloVerifyRequest := &helloVerifyRequestMsg{
 			vers:   VersionDTLS10,
-			cookie: make([]byte, 32),
+			cookie: make([]byte, cookieLen),
 		}
 		if _, err := io.ReadFull(c.config.rand(), helloVerifyRequest.cookie); err != nil {
 			c.sendAlert(alertInternalError)
diff --git a/src/ssl/test/runner/hpke/hpke.go b/src/ssl/test/runner/hpke/hpke.go
index e6fc7be..b65dcf3 100644
--- a/src/ssl/test/runner/hpke/hpke.go
+++ b/src/ssl/test/runner/hpke/hpke.go
@@ -14,7 +14,7 @@
 
 // Package hpke implements Hybrid Public Key Encryption (HPKE).
 //
-// See https://tools.ietf.org/html/draft-irtf-cfrg-hpke-12.
+// See RFC 9180.
 package hpke
 
 import (
diff --git a/src/ssl/test/runner/runner.go b/src/ssl/test/runner/runner.go
index cfff714..655226c 100644
--- a/src/ssl/test/runner/runner.go
+++ b/src/ssl/test/runner/runner.go
@@ -3546,6 +3546,31 @@
 			},
 			flags: []string{"-async"},
 		},
+		{
+			// DTLS 1.2 allows up to a 255-byte HelloVerifyRequest cookie, which
+			// is the largest encodable value.
+			protocol: dtls,
+			name:     "DTLS-HelloVerifyRequest-255",
+			config: Config{
+				MaxVersion: VersionTLS12,
+				Bugs: ProtocolBugs{
+					HelloVerifyRequestCookieLength: 255,
+				},
+			},
+		},
+		{
+			// DTLS 1.2 allows up to a 0-byte HelloVerifyRequest cookie, which
+			// was probably a mistake in the spec but test that it works
+			// nonetheless.
+			protocol: dtls,
+			name:     "DTLS-HelloVerifyRequest-0",
+			config: Config{
+				MaxVersion: VersionTLS12,
+				Bugs: ProtocolBugs{
+					EmptyHelloVerifyRequestCookie: true,
+				},
+			},
+		},
 	}
 	testCases = append(testCases, basicTests...)
 
@@ -15588,9 +15613,6 @@
 			},
 			shouldFail:    true,
 			expectedError: ":KEY_USAGE_BIT_INCORRECT:",
-			flags: []string{
-				"-enforce-rsa-key-usage",
-			},
 		})
 
 		testCases = append(testCases, testCase{
@@ -15602,9 +15624,6 @@
 				Certificates: []Certificate{dsCert},
 				CipherSuites: dsSuites,
 			},
-			flags: []string{
-				"-enforce-rsa-key-usage",
-			},
 		})
 
 		// TLS 1.3 removes the encipherment suites.
@@ -15618,9 +15637,6 @@
 					Certificates: []Certificate{encCert},
 					CipherSuites: encSuites,
 				},
-				flags: []string{
-					"-enforce-rsa-key-usage",
-				},
 			})
 
 			testCases = append(testCases, testCase{
@@ -15634,9 +15650,6 @@
 				},
 				shouldFail:    true,
 				expectedError: ":KEY_USAGE_BIT_INCORRECT:",
-				flags: []string{
-					"-enforce-rsa-key-usage",
-				},
 			})
 
 			// In 1.2 and below, we should not enforce without the enforce-rsa-key-usage flag.
@@ -15649,6 +15662,7 @@
 					Certificates: []Certificate{dsCert},
 					CipherSuites: encSuites,
 				},
+				flags: []string{"-no-enforce-rsa-key-usage"},
 			})
 
 			testCases = append(testCases, testCase{
@@ -15660,20 +15674,22 @@
 					Certificates: []Certificate{encCert},
 					CipherSuites: dsSuites,
 				},
+				flags: []string{"-no-enforce-rsa-key-usage"},
 			})
 		}
 
 		if ver.version >= VersionTLS13 {
-			// In 1.3 and above, we enforce keyUsage even without the flag.
+			// In 1.3 and above, we enforce keyUsage even when disabled.
 			testCases = append(testCases, testCase{
 				testType: clientTest,
-				name:     "RSAKeyUsage-Client-WantSignature-GotEncipherment-Enforced" + ver.name,
+				name:     "RSAKeyUsage-Client-WantSignature-GotEncipherment-AlwaysEnforced" + ver.name,
 				config: Config{
 					MinVersion:   ver.version,
 					MaxVersion:   ver.version,
 					Certificates: []Certificate{encCert},
 					CipherSuites: dsSuites,
 				},
+				flags:         []string{"-no-enforce-rsa-key-usage"},
 				shouldFail:    true,
 				expectedError: ":KEY_USAGE_BIT_INCORRECT:",
 			})
@@ -16776,9 +16792,7 @@
 				},
 				shouldFail:         true,
 				expectedLocalError: "remote error: illegal parameter",
-				// The decoding algorithm relies on the ordering requirement, so
-				// the wrong order appears as a missing extension.
-				expectedError: ":OUTER_EXTENSION_NOT_FOUND:",
+				expectedError:      ":INVALID_OUTER_EXTENSION:",
 			})
 
 			// Test that the server rejects duplicated values in ech_outer_extensions.
@@ -16812,9 +16826,7 @@
 				},
 				shouldFail:         true,
 				expectedLocalError: "remote error: illegal parameter",
-				// The decoding algorithm relies on the ordering requirement, so
-				// duplicates appear as missing extensions.
-				expectedError: ":OUTER_EXTENSION_NOT_FOUND:",
+				expectedError:      ":INVALID_OUTER_EXTENSION:",
 			})
 
 			// Test that the server rejects references to missing extensions in
@@ -16843,7 +16855,7 @@
 				},
 				shouldFail:         true,
 				expectedLocalError: "remote error: illegal parameter",
-				expectedError:      ":DECODE_ERROR:",
+				expectedError:      ":INVALID_OUTER_EXTENSION:",
 			})
 
 			// Test that the server rejects a references to the ECH extension in
@@ -16871,7 +16883,46 @@
 				},
 				shouldFail:         true,
 				expectedLocalError: "remote error: illegal parameter",
-				expectedError:      ":DECODE_ERROR:",
+				expectedError:      ":INVALID_OUTER_EXTENSION:",
+			})
+
+			// Test the message callback is correctly reported with ECH.
+			clientAndServerHello := "read hs 1\nread clienthelloinner\nwrite hs 2\n"
+			expectMsgCallback := clientAndServerHello + "write ccs\n"
+			if hrr {
+				expectMsgCallback += clientAndServerHello
+			}
+			// EncryptedExtensions onwards.
+			expectMsgCallback += `write hs 8
+write hs 11
+write hs 15
+write hs 20
+read hs 20
+write hs 4
+write hs 4
+`
+			testCases = append(testCases, testCase{
+				testType: serverTest,
+				protocol: protocol,
+				name:     prefix + "ECH-Server-MessageCallback" + suffix,
+				config: Config{
+					ServerName:      "secret.example",
+					ClientECHConfig: echConfig.ECHConfig,
+					DefaultCurves:   defaultCurves,
+					Bugs: ProtocolBugs{
+						NoCloseNotify: true, // Align QUIC and TCP traces.
+					},
+				},
+				flags: []string{
+					"-ech-server-config", base64FlagValue(echConfig.ECHConfig.Raw),
+					"-ech-server-key", base64FlagValue(echConfig.Key),
+					"-ech-is-retry-config", "1",
+					"-expect-ech-accept",
+					"-expect-msg-callback", expectMsgCallback,
+				},
+				expectations: connectionExpectations{
+					echAccepted: true,
+				},
 			})
 		}
 
@@ -18622,6 +18673,60 @@
 			shouldFail:    true,
 			expectedError: ":INCONSISTENT_ECH_NEGOTIATION:",
 		})
+
+		// Test the message callback is correctly reported, with and without
+		// HelloRetryRequest.
+		clientAndServerHello := "write clienthelloinner\nwrite hs 1\nread hs 2\n"
+		// EncryptedExtensions onwards.
+		finishHandshake := `read hs 8
+read hs 11
+read hs 15
+read hs 20
+write hs 20
+read hs 4
+read hs 4
+`
+		testCases = append(testCases, testCase{
+			testType: clientTest,
+			protocol: protocol,
+			name:     prefix + "ECH-Client-MessageCallback",
+			config: Config{
+				MinVersion:       VersionTLS13,
+				MaxVersion:       VersionTLS13,
+				ServerECHConfigs: []ServerECHConfig{echConfig},
+				Bugs: ProtocolBugs{
+					NoCloseNotify: true, // Align QUIC and TCP traces.
+				},
+			},
+			flags: []string{
+				"-ech-config-list", base64FlagValue(CreateECHConfigList(echConfig.ECHConfig.Raw)),
+				"-expect-ech-accept",
+				"-expect-msg-callback", clientAndServerHello + "write ccs\n" + finishHandshake,
+			},
+			expectations: connectionExpectations{echAccepted: true},
+		})
+		testCases = append(testCases, testCase{
+			testType: clientTest,
+			protocol: protocol,
+			name:     prefix + "ECH-Client-MessageCallback-HelloRetryRequest",
+			config: Config{
+				MinVersion:       VersionTLS13,
+				MaxVersion:       VersionTLS13,
+				CurvePreferences: []CurveID{CurveP384},
+				ServerECHConfigs: []ServerECHConfig{echConfig},
+				Bugs: ProtocolBugs{
+					ExpectMissingKeyShare: true, // Check we triggered HRR.
+					NoCloseNotify:         true, // Align QUIC and TCP traces.
+				},
+			},
+			flags: []string{
+				"-ech-config-list", base64FlagValue(CreateECHConfigList(echConfig.ECHConfig.Raw)),
+				"-expect-ech-accept",
+				"-expect-hrr", // Check we triggered HRR.
+				"-expect-msg-callback", clientAndServerHello + "write ccs\n" + clientAndServerHello + finishHandshake,
+			},
+			expectations: connectionExpectations{echAccepted: true},
+		})
 	}
 }
 
@@ -18681,6 +18786,27 @@
 				curveID: CurveX25519,
 			},
 		})
+		if protocol != quic {
+			testCases = append(testCases, testCase{
+				name:               protocol.String() + "-HintMismatch-ECDHE-Group",
+				testType:           serverTest,
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion:    VersionTLS12,
+					MaxVersion:    VersionTLS12,
+					DefaultCurves: []CurveID{CurveX25519, CurveP256},
+				},
+				flags: []string{
+					"-allow-hint-mismatch",
+					"-on-shim-curves", strconv.Itoa(int(CurveX25519)),
+					"-on-handshaker-curves", strconv.Itoa(int(CurveP256)),
+				},
+				expectations: connectionExpectations{
+					curveID: CurveX25519,
+				},
+			})
+		}
 
 		// If the handshaker does HelloRetryRequest, it will omit most hints.
 		// The shim should still work.
@@ -18729,7 +18855,7 @@
 		// The shim and handshaker may have different signature algorithm
 		// preferences.
 		testCases = append(testCases, testCase{
-			name:               protocol.String() + "-HintMismatch-SignatureAlgorithm",
+			name:               protocol.String() + "-HintMismatch-SignatureAlgorithm-TLS13",
 			testType:           serverTest,
 			protocol:           protocol,
 			skipSplitHandshake: true,
@@ -18752,12 +18878,38 @@
 				peerSignatureAlgorithm: signatureRSAPSSWithSHA256,
 			},
 		})
+		if protocol != quic {
+			testCases = append(testCases, testCase{
+				name:               protocol.String() + "-HintMismatch-SignatureAlgorithm-TLS12",
+				testType:           serverTest,
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion: VersionTLS12,
+					MaxVersion: VersionTLS12,
+					VerifySignatureAlgorithms: []signatureAlgorithm{
+						signatureRSAPSSWithSHA256,
+						signatureRSAPSSWithSHA384,
+					},
+				},
+				flags: []string{
+					"-allow-hint-mismatch",
+					"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
+					"-key-file", path.Join(*resourceDir, rsaKeyFile),
+					"-on-shim-signing-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA256)),
+					"-on-handshaker-signing-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA384)),
+				},
+				expectations: connectionExpectations{
+					peerSignatureAlgorithm: signatureRSAPSSWithSHA256,
+				},
+			})
+		}
 
 		// The shim and handshaker may disagree on whether resumption is allowed.
 		// We run the first connection with tickets enabled, so the client is
 		// issued a ticket, then disable tickets on the second connection.
 		testCases = append(testCases, testCase{
-			name:               protocol.String() + "-HintMismatch-NoTickets1",
+			name:               protocol.String() + "-HintMismatch-NoTickets1-TLS13",
 			testType:           serverTest,
 			protocol:           protocol,
 			skipSplitHandshake: true,
@@ -18773,7 +18925,7 @@
 			expectResumeRejected: true,
 		})
 		testCases = append(testCases, testCase{
-			name:               protocol.String() + "-HintMismatch-NoTickets2",
+			name:               protocol.String() + "-HintMismatch-NoTickets2-TLS13",
 			testType:           serverTest,
 			protocol:           protocol,
 			skipSplitHandshake: true,
@@ -18787,6 +18939,39 @@
 			},
 			resumeSession: true,
 		})
+		if protocol != quic {
+			testCases = append(testCases, testCase{
+				name:               protocol.String() + "-HintMismatch-NoTickets1-TLS12",
+				testType:           serverTest,
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion: VersionTLS12,
+					MaxVersion: VersionTLS12,
+				},
+				flags: []string{
+					"-on-resume-allow-hint-mismatch",
+					"-on-shim-on-resume-no-ticket",
+				},
+				resumeSession:        true,
+				expectResumeRejected: true,
+			})
+			testCases = append(testCases, testCase{
+				name:               protocol.String() + "-HintMismatch-NoTickets2-TLS12",
+				testType:           serverTest,
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion: VersionTLS12,
+					MaxVersion: VersionTLS12,
+				},
+				flags: []string{
+					"-on-resume-allow-hint-mismatch",
+					"-on-handshaker-on-resume-no-ticket",
+				},
+				resumeSession: true,
+			})
+		}
 
 		// The shim and handshaker may disagree on whether to request a client
 		// certificate.
@@ -18940,6 +19125,242 @@
 				ocspResponse: testOCSPResponse,
 			},
 		})
+
+		// The shim and handshaker may disagree on cipher suite, to the point
+		// that one selects RSA key exchange (no applicable hint) and the other
+		// selects ECDHE_RSA (hints are useful).
+		if protocol != quic {
+			testCases = append(testCases, testCase{
+				testType:           serverTest,
+				name:               protocol.String() + "-HintMismatch-CipherMismatch1",
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion: VersionTLS12,
+					MaxVersion: VersionTLS12,
+				},
+				flags: []string{
+					"-allow-hint-mismatch",
+					"-on-shim-cipher", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+					"-on-handshaker-cipher", "TLS_RSA_WITH_AES_128_GCM_SHA256",
+				},
+				expectations: connectionExpectations{
+					cipher: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+				},
+			})
+			testCases = append(testCases, testCase{
+				testType:           serverTest,
+				name:               protocol.String() + "-HintMismatch-CipherMismatch2",
+				protocol:           protocol,
+				skipSplitHandshake: true,
+				config: Config{
+					MinVersion: VersionTLS12,
+					MaxVersion: VersionTLS12,
+				},
+				flags: []string{
+					// There is no need to pass -allow-hint-mismatch. The
+					// handshaker will unnecessarily generate a signature hints.
+					// This is not reported as a mismatch because hints would
+					// not have helped the shim anyway.
+					"-on-shim-cipher", "TLS_RSA_WITH_AES_128_GCM_SHA256",
+					"-on-handshaker-cipher", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+				},
+				expectations: connectionExpectations{
+					cipher: TLS_RSA_WITH_AES_128_GCM_SHA256,
+				},
+			})
+		}
+	}
+}
+
+func addCompliancePolicyTests() {
+	for _, protocol := range []protocol{tls, quic} {
+		for _, suite := range testCipherSuites {
+			var isFIPSCipherSuite bool
+			switch suite.id {
+			case TLS_AES_128_GCM_SHA256,
+				TLS_AES_256_GCM_SHA384,
+				TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+				TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+				TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+				TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
+				isFIPSCipherSuite = true
+			}
+
+			var certFile string
+			var keyFile string
+			var certs []Certificate
+			if hasComponent(suite.name, "ECDSA") {
+				certFile = ecdsaP256CertificateFile
+				keyFile = ecdsaP256KeyFile
+				certs = []Certificate{ecdsaP256Certificate}
+			} else {
+				certFile = rsaCertificateFile
+				keyFile = rsaKeyFile
+				certs = []Certificate{rsaCertificate}
+			}
+
+			maxVersion := uint16(VersionTLS13)
+			if !isTLS13Suite(suite.name) {
+				if protocol == quic {
+					continue
+				}
+				maxVersion = VersionTLS12
+			}
+
+			testCases = append(testCases, testCase{
+				testType: serverTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Server-" + suite.name,
+				config: Config{
+					MinVersion:   VersionTLS12,
+					MaxVersion:   maxVersion,
+					CipherSuites: []uint16{suite.id},
+				},
+				certFile: certFile,
+				keyFile:  keyFile,
+				flags: []string{
+					"-fips-202205",
+				},
+				shouldFail: !isFIPSCipherSuite,
+			})
+
+			testCases = append(testCases, testCase{
+				testType: clientTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Client-" + suite.name,
+				config: Config{
+					MinVersion:   VersionTLS12,
+					MaxVersion:   maxVersion,
+					CipherSuites: []uint16{suite.id},
+					Certificates: certs,
+				},
+				flags: []string{
+					"-fips-202205",
+				},
+				shouldFail: !isFIPSCipherSuite,
+			})
+		}
+
+		// Check that a TLS 1.3 client won't accept ChaCha20 even if the server
+		// picks it without it being in the client's cipher list.
+		testCases = append(testCases, testCase{
+			testType: clientTest,
+			protocol: protocol,
+			name:     "Compliance-fips202205-" + protocol.String() + "-Client-ReallyWontAcceptChaCha",
+			config: Config{
+				MinVersion: VersionTLS12,
+				MaxVersion: maxVersion,
+				Bugs: ProtocolBugs{
+					SendCipherSuite: TLS_CHACHA20_POLY1305_SHA256,
+				},
+			},
+			flags: []string{
+				"-fips-202205",
+			},
+			shouldFail:    true,
+			expectedError: ":WRONG_CIPHER_RETURNED:",
+		})
+
+		for _, curve := range testCurves {
+			var isFIPSCurve bool
+			switch curve.id {
+			case CurveP256, CurveP384:
+				isFIPSCurve = true
+			}
+
+			testCases = append(testCases, testCase{
+				testType: serverTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Server-" + curve.name,
+				config: Config{
+					MinVersion:       VersionTLS12,
+					MaxVersion:       VersionTLS13,
+					CurvePreferences: []CurveID{curve.id},
+				},
+				flags: []string{
+					"-fips-202205",
+				},
+				shouldFail: !isFIPSCurve,
+			})
+
+			testCases = append(testCases, testCase{
+				testType: clientTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Client-" + curve.name,
+				config: Config{
+					MinVersion:       VersionTLS12,
+					MaxVersion:       VersionTLS13,
+					CurvePreferences: []CurveID{curve.id},
+				},
+				flags: []string{
+					"-fips-202205",
+				},
+				shouldFail: !isFIPSCurve,
+			})
+		}
+
+		for _, sigalg := range testSignatureAlgorithms {
+			var isFIPSSigAlg bool
+			switch sigalg.id {
+			case signatureRSAPKCS1WithSHA256,
+				signatureRSAPKCS1WithSHA384,
+				signatureRSAPKCS1WithSHA512,
+				signatureECDSAWithP256AndSHA256,
+				signatureECDSAWithP384AndSHA384,
+				signatureRSAPSSWithSHA256,
+				signatureRSAPSSWithSHA384,
+				signatureRSAPSSWithSHA512:
+				isFIPSSigAlg = true
+			}
+
+			if sigalg.cert == testCertECDSAP224 {
+				// This can work in TLS 1.2, but not with TLS 1.3.
+				// For consistency it's not permitted in FIPS mode.
+				isFIPSSigAlg = false
+			}
+
+			maxVersion := uint16(VersionTLS13)
+			if hasComponent(sigalg.name, "PKCS1") {
+				if protocol == quic {
+					continue
+				}
+				maxVersion = VersionTLS12
+			}
+
+			testCases = append(testCases, testCase{
+				testType: serverTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Server-" + sigalg.name,
+				config: Config{
+					MinVersion:                VersionTLS12,
+					MaxVersion:                maxVersion,
+					VerifySignatureAlgorithms: []signatureAlgorithm{sigalg.id},
+				},
+				flags: []string{
+					"-fips-202205",
+					"-cert-file", path.Join(*resourceDir, getShimCertificate(sigalg.cert)),
+					"-key-file", path.Join(*resourceDir, getShimKey(sigalg.cert)),
+				},
+				shouldFail: !isFIPSSigAlg,
+			})
+
+			testCases = append(testCases, testCase{
+				testType: clientTest,
+				protocol: protocol,
+				name:     "Compliance-fips202205-" + protocol.String() + "-Client-" + sigalg.name,
+				config: Config{
+					MinVersion:              VersionTLS12,
+					MaxVersion:              maxVersion,
+					SignSignatureAlgorithms: []signatureAlgorithm{sigalg.id},
+					Certificates:            []Certificate{getRunnerCertificate(sigalg.cert)},
+				},
+				flags: []string{
+					"-fips-202205",
+				},
+				shouldFail: !isFIPSSigAlg,
+			})
+		}
 	}
 }
 
@@ -19185,6 +19606,7 @@
 	addDelegatedCredentialTests()
 	addEncryptedClientHelloTests()
 	addHintMismatchTests()
+	addCompliancePolicyTests()
 
 	toAppend, err := convertToSplitHandshakeTests(testCases)
 	if err != nil {
@@ -19220,8 +19642,22 @@
 		noneOfPattern = strings.Split(*skipTest, ";")
 	}
 
+	shardIndex, shardTotal, err := getSharding()
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+
+	if shardTotal > 0 {
+		fmt.Printf("This is shard %d of 0..%d (inclusive)\n", shardIndex, shardTotal-1)
+	}
+
 	var foundTest bool
 	for i := range testCases {
+		if shardTotal > 0 && i%shardTotal != shardIndex {
+			continue
+		}
+
 		matched, err := match(oneOfPatternIfAny, noneOfPattern, testCases[i].name)
 		if err != nil {
 			fmt.Fprintf(os.Stderr, "Error matching pattern: %s\n", err)
@@ -19259,7 +19695,7 @@
 		}
 	}
 
-	if !foundTest {
+	if !foundTest && shardTotal == 0 {
 		fmt.Fprintf(os.Stderr, "No tests run\n")
 		os.Exit(1)
 	}
diff --git a/src/ssl/test/runner/sharding.go b/src/ssl/test/runner/sharding.go
new file mode 100644
index 0000000..5061a6f
--- /dev/null
+++ b/src/ssl/test/runner/sharding.go
@@ -0,0 +1,77 @@
+// Copyright (c) 2022, Google Inc.
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+package runner
+
+import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"strconv"
+)
+
+const (
+	shardStatusFileEnv = "TEST_SHARD_STATUS_FILE"
+	shardTotalEnv      = "TEST_TOTAL_SHARDS"
+	shardIndexEnv      = "TEST_SHARD_INDEX"
+	shardPrefix        = "RUNNER_"
+)
+
+func init() {
+	// When run under `go test`, init() functions may be run twice if the
+	// test binary ends up forking and execing itself. Therefore we move
+	// the environment variables to names that don't interfere with Go's
+	// own support for sharding. If we recorded and erased them, then they
+	// wouldn't exist the second time the binary runs.
+	for _, key := range []string{shardStatusFileEnv, shardTotalEnv, shardIndexEnv} {
+		value := os.Getenv(key)
+		if len(value) > 0 {
+			os.Setenv(shardPrefix+key, value)
+			os.Setenv(key, "")
+		}
+	}
+}
+
+// getSharding returns the shard index and count, or zeros if sharding is not
+// enabled.
+func getSharding() (index, total int, err error) {
+	statusFile := os.Getenv(shardPrefix + shardStatusFileEnv)
+	totalNumStr := os.Getenv(shardPrefix + shardTotalEnv)
+	indexStr := os.Getenv(shardPrefix + shardIndexEnv)
+	if len(totalNumStr) == 0 || len(indexStr) == 0 {
+		return 0, 0, nil
+	}
+
+	totalNum, err := strconv.Atoi(totalNumStr)
+	if err != nil {
+		return 0, 0, fmt.Errorf("$%s is %q, but expected a number\n", shardTotalEnv, totalNumStr)
+	}
+
+	index, err = strconv.Atoi(indexStr)
+	if err != nil {
+		return 0, 0, fmt.Errorf("$%s is %q, but expected a number\n", shardIndexEnv, indexStr)
+	}
+
+	if index < 0 || index >= totalNum {
+		return 0, 0, fmt.Errorf("shard index/total of %d/%d is invalid\n", index, totalNum)
+	}
+
+	if len(statusFile) > 0 {
+		if err := ioutil.WriteFile(statusFile, nil, 0664); err != nil {
+			return 0, 0, err
+		}
+	}
+
+	return index, totalNum, nil
+}
diff --git a/src/ssl/test/test_config.cc b/src/ssl/test/test_config.cc
index 7d1cefa..0230bdb 100644
--- a/src/ssl/test/test_config.cc
+++ b/src/ssl/test/test_config.cc
@@ -15,15 +15,22 @@
 #include "test_config.h"
 
 #include <assert.h>
+#include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include <algorithm>
+#include <functional>
+#include <limits>
 #include <memory>
+#include <type_traits>
 
 #include <openssl/base64.h>
 #include <openssl/hpke.h>
 #include <openssl/rand.h>
+#include <openssl/span.h>
 #include <openssl/ssl.h>
 
 #include "../../crypto/internal.h"
@@ -34,235 +41,88 @@
 
 namespace {
 
-template <typename T>
 struct Flag {
-  const char *flag;
-  T TestConfig::*member;
+  const char *name;
+  bool has_param;
+  // If |has_param| is false, |param| will be nullptr.
+  std::function<bool(TestConfig *config, const char *param)> set_param;
 };
 
-// FindField looks for the flag in |flags| that matches |flag|. If one is found,
-// it returns a pointer to the corresponding field in |config|. Otherwise, it
-// returns NULL.
-template<typename T, size_t N>
-T *FindField(TestConfig *config, const Flag<T> (&flags)[N], const char *flag) {
-  for (size_t i = 0; i < N; i++) {
-    if (strcmp(flag, flags[i].flag) == 0) {
-      return &(config->*(flags[i].member));
-    }
-  }
-  return NULL;
+Flag BoolFlag(const char *name, bool TestConfig::*field) {
+  return Flag{name, false, [=](TestConfig *config, const char *) -> bool {
+                config->*field = true;
+                return true;
+              }};
 }
 
-const Flag<bool> kBoolFlags[] = {
-    {"-server", &TestConfig::is_server},
-    {"-dtls", &TestConfig::is_dtls},
-    {"-quic", &TestConfig::is_quic},
-    {"-fallback-scsv", &TestConfig::fallback_scsv},
-    {"-enable-ech-grease", &TestConfig::enable_ech_grease},
-    {"-expect-ech-accept", &TestConfig::expect_ech_accept},
-    {"-expect-no-ech-name-override", &TestConfig::expect_no_ech_name_override},
-    {"-expect-no-ech-retry-configs", &TestConfig::expect_no_ech_retry_configs},
-    {"-require-any-client-certificate",
-     &TestConfig::require_any_client_certificate},
-    {"-false-start", &TestConfig::false_start},
-    {"-async", &TestConfig::async},
-    {"-write-different-record-sizes",
-     &TestConfig::write_different_record_sizes},
-    {"-cbc-record-splitting", &TestConfig::cbc_record_splitting},
-    {"-partial-write", &TestConfig::partial_write},
-    {"-no-tls13", &TestConfig::no_tls13},
-    {"-no-tls12", &TestConfig::no_tls12},
-    {"-no-tls11", &TestConfig::no_tls11},
-    {"-no-tls1", &TestConfig::no_tls1},
-    {"-no-ticket", &TestConfig::no_ticket},
-    {"-enable-channel-id", &TestConfig::enable_channel_id},
-    {"-shim-writes-first", &TestConfig::shim_writes_first},
-    {"-expect-session-miss", &TestConfig::expect_session_miss},
-    {"-decline-alpn", &TestConfig::decline_alpn},
-    {"-reject-alpn", &TestConfig::reject_alpn},
-    {"-select-empty-alpn", &TestConfig::select_empty_alpn},
-    {"-defer-alps", &TestConfig::defer_alps},
-    {"-expect-extended-master-secret",
-     &TestConfig::expect_extended_master_secret},
-    {"-enable-ocsp-stapling", &TestConfig::enable_ocsp_stapling},
-    {"-enable-signed-cert-timestamps",
-     &TestConfig::enable_signed_cert_timestamps},
-    {"-implicit-handshake", &TestConfig::implicit_handshake},
-    {"-use-early-callback", &TestConfig::use_early_callback},
-    {"-fail-early-callback", &TestConfig::fail_early_callback},
-    {"-install-ddos-callback", &TestConfig::install_ddos_callback},
-    {"-fail-ddos-callback", &TestConfig::fail_ddos_callback},
-    {"-fail-cert-callback", &TestConfig::fail_cert_callback},
-    {"-handshake-never-done", &TestConfig::handshake_never_done},
-    {"-use-export-context", &TestConfig::use_export_context},
-    {"-tls-unique", &TestConfig::tls_unique},
-    {"-expect-ticket-renewal", &TestConfig::expect_ticket_renewal},
-    {"-expect-no-session", &TestConfig::expect_no_session},
-    {"-expect-ticket-supports-early-data",
-     &TestConfig::expect_ticket_supports_early_data},
-    {"-use-ticket-callback", &TestConfig::use_ticket_callback},
-    {"-renew-ticket", &TestConfig::renew_ticket},
-    {"-enable-early-data", &TestConfig::enable_early_data},
-    {"-check-close-notify", &TestConfig::check_close_notify},
-    {"-shim-shuts-down", &TestConfig::shim_shuts_down},
-    {"-verify-fail", &TestConfig::verify_fail},
-    {"-verify-peer", &TestConfig::verify_peer},
-    {"-verify-peer-if-no-obc", &TestConfig::verify_peer_if_no_obc},
-    {"-expect-verify-result", &TestConfig::expect_verify_result},
-    {"-renegotiate-once", &TestConfig::renegotiate_once},
-    {"-renegotiate-freely", &TestConfig::renegotiate_freely},
-    {"-renegotiate-ignore", &TestConfig::renegotiate_ignore},
-    {"-renegotiate-explicit", &TestConfig::renegotiate_explicit},
-    {"-forbid-renegotiation-after-handshake",
-     &TestConfig::forbid_renegotiation_after_handshake},
-    {"-use-old-client-cert-callback",
-     &TestConfig::use_old_client_cert_callback},
-    {"-send-alert", &TestConfig::send_alert},
-    {"-peek-then-read", &TestConfig::peek_then_read},
-    {"-enable-grease", &TestConfig::enable_grease},
-    {"-permute-extensions", &TestConfig::permute_extensions},
-    {"-use-exporter-between-reads", &TestConfig::use_exporter_between_reads},
-    {"-retain-only-sha256-client-cert",
-     &TestConfig::retain_only_sha256_client_cert},
-    {"-expect-sha256-client-cert", &TestConfig::expect_sha256_client_cert},
-    {"-read-with-unfinished-write", &TestConfig::read_with_unfinished_write},
-    {"-expect-secure-renegotiation", &TestConfig::expect_secure_renegotiation},
-    {"-expect-no-secure-renegotiation",
-     &TestConfig::expect_no_secure_renegotiation},
-    {"-expect-session-id", &TestConfig::expect_session_id},
-    {"-expect-no-session-id", &TestConfig::expect_no_session_id},
-    {"-expect-accept-early-data", &TestConfig::expect_accept_early_data},
-    {"-expect-reject-early-data", &TestConfig::expect_reject_early_data},
-    {"-expect-no-offer-early-data", &TestConfig::expect_no_offer_early_data},
-    {"-no-op-extra-handshake", &TestConfig::no_op_extra_handshake},
-    {"-handshake-twice", &TestConfig::handshake_twice},
-    {"-allow-unknown-alpn-protos", &TestConfig::allow_unknown_alpn_protos},
-    {"-use-custom-verify-callback", &TestConfig::use_custom_verify_callback},
-    {"-allow-false-start-without-alpn",
-     &TestConfig::allow_false_start_without_alpn},
-    {"-handoff", &TestConfig::handoff},
-    {"-handshake-hints", &TestConfig::handshake_hints},
-    {"-allow-hint-mismatch", &TestConfig::allow_hint_mismatch},
-    {"-use-ocsp-callback", &TestConfig::use_ocsp_callback},
-    {"-set-ocsp-in-callback", &TestConfig::set_ocsp_in_callback},
-    {"-decline-ocsp-callback", &TestConfig::decline_ocsp_callback},
-    {"-fail-ocsp-callback", &TestConfig::fail_ocsp_callback},
-    {"-install-cert-compression-algs",
-     &TestConfig::install_cert_compression_algs},
-    {"-is-handshaker-supported", &TestConfig::is_handshaker_supported},
-    {"-handshaker-resume", &TestConfig::handshaker_resume},
-    {"-reverify-on-resume", &TestConfig::reverify_on_resume},
-    {"-enforce-rsa-key-usage", &TestConfig::enforce_rsa_key_usage},
-    {"-jdk11-workaround", &TestConfig::jdk11_workaround},
-    {"-server-preference", &TestConfig::server_preference},
-    {"-export-traffic-secrets", &TestConfig::export_traffic_secrets},
-    {"-key-update", &TestConfig::key_update},
-    {"-expect-delegated-credential-used",
-     &TestConfig::expect_delegated_credential_used},
-    {"-expect-hrr", &TestConfig::expect_hrr},
-    {"-expect-no-hrr", &TestConfig::expect_no_hrr},
-    {"-wait-for-debugger", &TestConfig::wait_for_debugger},
-};
+template <typename T>
+bool StringToInt(T *out, const char *str) {
+  static_assert(std::is_integral<T>::value, "not an integral type");
+  static_assert(sizeof(T) <= sizeof(long long), "type too large for long long");
 
-const Flag<std::string> kStringFlags[] = {
-    {"-write-settings", &TestConfig::write_settings},
-    {"-key-file", &TestConfig::key_file},
-    {"-cert-file", &TestConfig::cert_file},
-    {"-expect-server-name", &TestConfig::expect_server_name},
-    {"-expect-ech-name-override", &TestConfig::expect_ech_name_override},
-    {"-advertise-npn", &TestConfig::advertise_npn},
-    {"-expect-next-proto", &TestConfig::expect_next_proto},
-    {"-select-next-proto", &TestConfig::select_next_proto},
-    {"-send-channel-id", &TestConfig::send_channel_id},
-    {"-host-name", &TestConfig::host_name},
-    {"-advertise-alpn", &TestConfig::advertise_alpn},
-    {"-expect-alpn", &TestConfig::expect_alpn},
-    {"-expect-late-alpn", &TestConfig::expect_late_alpn},
-    {"-expect-advertised-alpn", &TestConfig::expect_advertised_alpn},
-    {"-select-alpn", &TestConfig::select_alpn},
-    {"-psk", &TestConfig::psk},
-    {"-psk-identity", &TestConfig::psk_identity},
-    {"-srtp-profiles", &TestConfig::srtp_profiles},
-    {"-cipher", &TestConfig::cipher},
-    {"-export-label", &TestConfig::export_label},
-    {"-export-context", &TestConfig::export_context},
-    {"-expect-peer-cert-file", &TestConfig::expect_peer_cert_file},
-    {"-use-client-ca-list", &TestConfig::use_client_ca_list},
-    {"-expect-client-ca-list", &TestConfig::expect_client_ca_list},
-    {"-expect-msg-callback", &TestConfig::expect_msg_callback},
-    {"-handshaker-path", &TestConfig::handshaker_path},
-    {"-delegated-credential", &TestConfig::delegated_credential},
-    {"-expect-early-data-reason", &TestConfig::expect_early_data_reason},
-    {"-quic-early-data-context", &TestConfig::quic_early_data_context},
-};
+  // |strtoull| allows leading '-' with wraparound. Additionally, both
+  // functions accept empty strings and leading whitespace.
+  if (!isdigit(static_cast<unsigned char>(*str)) &&
+      (!std::is_signed<T>::value || *str != '-')) {
+    return false;
+  }
+
+  errno = 0;
+  char *end;
+  if (std::is_signed<T>::value) {
+    long long value = strtoll(str, &end, 10);
+    if (value < std::numeric_limits<T>::min() ||
+        value > std::numeric_limits<T>::max()) {
+      return false;
+    }
+    *out = static_cast<T>(value);
+  } else {
+    unsigned long long value = strtoull(str, &end, 10);
+    if (value > std::numeric_limits<T>::max()) {
+      return false;
+    }
+    *out = static_cast<T>(value);
+  }
+
+  // Check for overflow and that the whole input was consumed.
+  return errno != ERANGE && *end == '\0';
+}
+
+template <typename T>
+Flag IntFlag(const char *name, T TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                return StringToInt(&(config->*field), param);
+              }};
+}
+
+template <typename T>
+Flag IntVectorFlag(const char *name, std::vector<T> TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                T value;
+                if (!StringToInt(&value, param)) {
+                  return false;
+                }
+                (config->*field).push_back(value);
+                return true;
+              }};
+}
+
+Flag StringFlag(const char *name, std::string TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                config->*field = param;
+                return true;
+              }};
+}
 
 // TODO(davidben): When we can depend on C++17 or Abseil, switch this to
 // std::optional or absl::optional.
-const Flag<std::unique_ptr<std::string>> kOptionalStringFlags[] = {
-    {"-expect-peer-application-settings",
-     &TestConfig::expect_peer_application_settings},
-};
-
-const Flag<std::string> kBase64Flags[] = {
-    {"-expect-ech-retry-configs", &TestConfig::expect_ech_retry_configs},
-    {"-ech-config-list", &TestConfig::ech_config_list},
-    {"-expect-certificate-types", &TestConfig::expect_certificate_types},
-    {"-expect-channel-id", &TestConfig::expect_channel_id},
-    {"-expect-ocsp-response", &TestConfig::expect_ocsp_response},
-    {"-expect-signed-cert-timestamps",
-     &TestConfig::expect_signed_cert_timestamps},
-    {"-ocsp-response", &TestConfig::ocsp_response},
-    {"-signed-cert-timestamps", &TestConfig::signed_cert_timestamps},
-    {"-ticket-key", &TestConfig::ticket_key},
-    {"-quic-transport-params", &TestConfig::quic_transport_params},
-    {"-expect-quic-transport-params",
-     &TestConfig::expect_quic_transport_params},
-};
-
-const Flag<int> kIntFlags[] = {
-    {"-port", &TestConfig::port},
-    {"-resume-count", &TestConfig::resume_count},
-    {"-min-version", &TestConfig::min_version},
-    {"-max-version", &TestConfig::max_version},
-    {"-expect-version", &TestConfig::expect_version},
-    {"-mtu", &TestConfig::mtu},
-    {"-export-keying-material", &TestConfig::export_keying_material},
-    {"-expect-total-renegotiations", &TestConfig::expect_total_renegotiations},
-    {"-expect-peer-signature-algorithm",
-     &TestConfig::expect_peer_signature_algorithm},
-    {"-expect-curve-id", &TestConfig::expect_curve_id},
-    {"-initial-timeout-duration-ms", &TestConfig::initial_timeout_duration_ms},
-    {"-max-cert-list", &TestConfig::max_cert_list},
-    {"-expect-cipher-aes", &TestConfig::expect_cipher_aes},
-    {"-expect-cipher-no-aes", &TestConfig::expect_cipher_no_aes},
-    {"-expect-cipher", &TestConfig::expect_cipher},
-    {"-resumption-delay", &TestConfig::resumption_delay},
-    {"-max-send-fragment", &TestConfig::max_send_fragment},
-    {"-read-size", &TestConfig::read_size},
-    {"-expect-ticket-age-skew", &TestConfig::expect_ticket_age_skew},
-    {"-quic-use-legacy-codepoint", &TestConfig::quic_use_legacy_codepoint},
-    {"-install-one-cert-compression-alg",
-     &TestConfig::install_one_cert_compression_alg},
-    {"-early-write-after-message", &TestConfig::early_write_after_message},
-};
-
-const Flag<std::vector<int>> kIntVectorFlags[] = {
-    {"-signing-prefs", &TestConfig::signing_prefs},
-    {"-verify-prefs", &TestConfig::verify_prefs},
-    {"-expect-peer-verify-pref", &TestConfig::expect_peer_verify_prefs},
-    {"-curves", &TestConfig::curves},
-    {"-ech-is-retry-config", &TestConfig::ech_is_retry_config},
-};
-
-const Flag<std::vector<std::string>> kBase64VectorFlags[] = {
-    {"-ech-server-config", &TestConfig::ech_server_configs},
-    {"-ech-server-key", &TestConfig::ech_server_keys},
-};
-
-const Flag<std::vector<std::pair<std::string, std::string>>>
-    kStringPairVectorFlags[] = {
-        {"-application-settings", &TestConfig::application_settings},
-};
+Flag OptionalStringFlag(const char *name,
+                        std::unique_ptr<std::string> TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                (config->*field).reset(new std::string(param));
+                return true;
+              }};
+}
 
 bool DecodeBase64(std::string *out, const std::string &in) {
   size_t len;
@@ -281,134 +141,269 @@
   return true;
 }
 
-bool ParseFlag(const char *flag, int argc, char **argv, int *i,
-               bool skip, TestConfig *out_config) {
-  bool *bool_field = FindField(out_config, kBoolFlags, flag);
-  if (bool_field != NULL) {
-    if (!skip) {
-      *bool_field = true;
-    }
-    return true;
+Flag Base64Flag(const char *name, std::string TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                return DecodeBase64(&(config->*field), param);
+              }};
+}
+
+Flag Base64VectorFlag(const char *name,
+                      std::vector<std::string> TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                std::string value;
+                if (!DecodeBase64(&value, param)) {
+                  return false;
+                }
+                (config->*field).push_back(std::move(value));
+                return true;
+              }};
+}
+
+Flag StringPairVectorFlag(
+    const char *name,
+    std::vector<std::pair<std::string, std::string>> TestConfig::*field) {
+  return Flag{name, true, [=](TestConfig *config, const char *param) -> bool {
+                const char *comma = strchr(param, ',');
+                if (!comma) {
+                  return false;
+                }
+                (config->*field)
+                    .push_back(std::make_pair(std::string(param, comma - param),
+                                              std::string(comma + 1)));
+                return true;
+              }};
+}
+
+std::vector<Flag> SortedFlags() {
+  std::vector<Flag> flags = {
+      IntFlag("-port", &TestConfig::port),
+      BoolFlag("-server", &TestConfig::is_server),
+      BoolFlag("-dtls", &TestConfig::is_dtls),
+      BoolFlag("-quic", &TestConfig::is_quic),
+      IntFlag("-resume-count", &TestConfig::resume_count),
+      StringFlag("-write-settings", &TestConfig::write_settings),
+      BoolFlag("-fallback-scsv", &TestConfig::fallback_scsv),
+      IntVectorFlag("-signing-prefs", &TestConfig::signing_prefs),
+      IntVectorFlag("-verify-prefs", &TestConfig::verify_prefs),
+      IntVectorFlag("-expect-peer-verify-pref",
+                    &TestConfig::expect_peer_verify_prefs),
+      IntVectorFlag("-curves", &TestConfig::curves),
+      StringFlag("-key-file", &TestConfig::key_file),
+      StringFlag("-cert-file", &TestConfig::cert_file),
+      StringFlag("-expect-server-name", &TestConfig::expect_server_name),
+      BoolFlag("-enable-ech-grease", &TestConfig::enable_ech_grease),
+      Base64VectorFlag("-ech-server-config", &TestConfig::ech_server_configs),
+      Base64VectorFlag("-ech-server-key", &TestConfig::ech_server_keys),
+      IntVectorFlag("-ech-is-retry-config", &TestConfig::ech_is_retry_config),
+      BoolFlag("-expect-ech-accept", &TestConfig::expect_ech_accept),
+      StringFlag("-expect-ech-name-override",
+                 &TestConfig::expect_ech_name_override),
+      BoolFlag("-expect-no-ech-name-override",
+               &TestConfig::expect_no_ech_name_override),
+      Base64Flag("-expect-ech-retry-configs",
+                 &TestConfig::expect_ech_retry_configs),
+      BoolFlag("-expect-no-ech-retry-configs",
+               &TestConfig::expect_no_ech_retry_configs),
+      Base64Flag("-ech-config-list", &TestConfig::ech_config_list),
+      Base64Flag("-expect-certificate-types",
+                 &TestConfig::expect_certificate_types),
+      BoolFlag("-require-any-client-certificate",
+               &TestConfig::require_any_client_certificate),
+      StringFlag("-advertise-npn", &TestConfig::advertise_npn),
+      StringFlag("-expect-next-proto", &TestConfig::expect_next_proto),
+      BoolFlag("-false-start", &TestConfig::false_start),
+      StringFlag("-select-next-proto", &TestConfig::select_next_proto),
+      BoolFlag("-async", &TestConfig::async),
+      BoolFlag("-write-different-record-sizes",
+               &TestConfig::write_different_record_sizes),
+      BoolFlag("-cbc-record-splitting", &TestConfig::cbc_record_splitting),
+      BoolFlag("-partial-write", &TestConfig::partial_write),
+      BoolFlag("-no-tls13", &TestConfig::no_tls13),
+      BoolFlag("-no-tls12", &TestConfig::no_tls12),
+      BoolFlag("-no-tls11", &TestConfig::no_tls11),
+      BoolFlag("-no-tls1", &TestConfig::no_tls1),
+      BoolFlag("-no-ticket", &TestConfig::no_ticket),
+      Base64Flag("-expect-channel-id", &TestConfig::expect_channel_id),
+      BoolFlag("-enable-channel-id", &TestConfig::enable_channel_id),
+      StringFlag("-send-channel-id", &TestConfig::send_channel_id),
+      BoolFlag("-shim-writes-first", &TestConfig::shim_writes_first),
+      StringFlag("-host-name", &TestConfig::host_name),
+      StringFlag("-advertise-alpn", &TestConfig::advertise_alpn),
+      StringFlag("-expect-alpn", &TestConfig::expect_alpn),
+      StringFlag("-expect-late-alpn", &TestConfig::expect_late_alpn),
+      StringFlag("-expect-advertised-alpn",
+                 &TestConfig::expect_advertised_alpn),
+      StringFlag("-select-alpn", &TestConfig::select_alpn),
+      BoolFlag("-decline-alpn", &TestConfig::decline_alpn),
+      BoolFlag("-reject-alpn", &TestConfig::reject_alpn),
+      BoolFlag("-select-empty-alpn", &TestConfig::select_empty_alpn),
+      BoolFlag("-defer-alps", &TestConfig::defer_alps),
+      StringPairVectorFlag("-application-settings",
+                           &TestConfig::application_settings),
+      OptionalStringFlag("-expect-peer-application-settings",
+                         &TestConfig::expect_peer_application_settings),
+      Base64Flag("-quic-transport-params", &TestConfig::quic_transport_params),
+      Base64Flag("-expect-quic-transport-params",
+                 &TestConfig::expect_quic_transport_params),
+      IntFlag("-quic-use-legacy-codepoint",
+              &TestConfig::quic_use_legacy_codepoint),
+      BoolFlag("-expect-session-miss", &TestConfig::expect_session_miss),
+      BoolFlag("-expect-extended-master-secret",
+               &TestConfig::expect_extended_master_secret),
+      StringFlag("-psk", &TestConfig::psk),
+      StringFlag("-psk-identity", &TestConfig::psk_identity),
+      StringFlag("-srtp-profiles", &TestConfig::srtp_profiles),
+      BoolFlag("-enable-ocsp-stapling", &TestConfig::enable_ocsp_stapling),
+      BoolFlag("-enable-signed-cert-timestamps",
+               &TestConfig::enable_signed_cert_timestamps),
+      Base64Flag("-expect-signed-cert-timestamps",
+                 &TestConfig::expect_signed_cert_timestamps),
+      IntFlag("-min-version", &TestConfig::min_version),
+      IntFlag("-max-version", &TestConfig::max_version),
+      IntFlag("-expect-version", &TestConfig::expect_version),
+      IntFlag("-mtu", &TestConfig::mtu),
+      BoolFlag("-implicit-handshake", &TestConfig::implicit_handshake),
+      BoolFlag("-use-early-callback", &TestConfig::use_early_callback),
+      BoolFlag("-fail-early-callback", &TestConfig::fail_early_callback),
+      BoolFlag("-install-ddos-callback", &TestConfig::install_ddos_callback),
+      BoolFlag("-fail-ddos-callback", &TestConfig::fail_ddos_callback),
+      BoolFlag("-fail-cert-callback", &TestConfig::fail_cert_callback),
+      StringFlag("-cipher", &TestConfig::cipher),
+      BoolFlag("-handshake-never-done", &TestConfig::handshake_never_done),
+      IntFlag("-export-keying-material", &TestConfig::export_keying_material),
+      StringFlag("-export-label", &TestConfig::export_label),
+      StringFlag("-export-context", &TestConfig::export_context),
+      BoolFlag("-use-export-context", &TestConfig::use_export_context),
+      BoolFlag("-tls-unique", &TestConfig::tls_unique),
+      BoolFlag("-expect-ticket-renewal", &TestConfig::expect_ticket_renewal),
+      BoolFlag("-expect-no-session", &TestConfig::expect_no_session),
+      BoolFlag("-expect-ticket-supports-early-data",
+               &TestConfig::expect_ticket_supports_early_data),
+      BoolFlag("-expect-accept-early-data",
+               &TestConfig::expect_accept_early_data),
+      BoolFlag("-expect-reject-early-data",
+               &TestConfig::expect_reject_early_data),
+      BoolFlag("-expect-no-offer-early-data",
+               &TestConfig::expect_no_offer_early_data),
+      BoolFlag("-use-ticket-callback", &TestConfig::use_ticket_callback),
+      BoolFlag("-renew-ticket", &TestConfig::renew_ticket),
+      BoolFlag("-enable-early-data", &TestConfig::enable_early_data),
+      Base64Flag("-ocsp-response", &TestConfig::ocsp_response),
+      Base64Flag("-expect-ocsp-response", &TestConfig::expect_ocsp_response),
+      BoolFlag("-check-close-notify", &TestConfig::check_close_notify),
+      BoolFlag("-shim-shuts-down", &TestConfig::shim_shuts_down),
+      BoolFlag("-verify-fail", &TestConfig::verify_fail),
+      BoolFlag("-verify-peer", &TestConfig::verify_peer),
+      BoolFlag("-verify-peer-if-no-obc", &TestConfig::verify_peer_if_no_obc),
+      BoolFlag("-expect-verify-result", &TestConfig::expect_verify_result),
+      Base64Flag("-signed-cert-timestamps",
+                 &TestConfig::signed_cert_timestamps),
+      IntFlag("-expect-total-renegotiations",
+              &TestConfig::expect_total_renegotiations),
+      BoolFlag("-renegotiate-once", &TestConfig::renegotiate_once),
+      BoolFlag("-renegotiate-freely", &TestConfig::renegotiate_freely),
+      BoolFlag("-renegotiate-ignore", &TestConfig::renegotiate_ignore),
+      BoolFlag("-renegotiate-explicit", &TestConfig::renegotiate_explicit),
+      BoolFlag("-forbid-renegotiation-after-handshake",
+               &TestConfig::forbid_renegotiation_after_handshake),
+      IntFlag("-expect-peer-signature-algorithm",
+              &TestConfig::expect_peer_signature_algorithm),
+      IntFlag("-expect-curve-id", &TestConfig::expect_curve_id),
+      BoolFlag("-use-old-client-cert-callback",
+               &TestConfig::use_old_client_cert_callback),
+      IntFlag("-initial-timeout-duration-ms",
+              &TestConfig::initial_timeout_duration_ms),
+      StringFlag("-use-client-ca-list", &TestConfig::use_client_ca_list),
+      StringFlag("-expect-client-ca-list", &TestConfig::expect_client_ca_list),
+      BoolFlag("-send-alert", &TestConfig::send_alert),
+      BoolFlag("-peek-then-read", &TestConfig::peek_then_read),
+      BoolFlag("-enable-grease", &TestConfig::enable_grease),
+      BoolFlag("-permute-extensions", &TestConfig::permute_extensions),
+      IntFlag("-max-cert-list", &TestConfig::max_cert_list),
+      Base64Flag("-ticket-key", &TestConfig::ticket_key),
+      BoolFlag("-use-exporter-between-reads",
+               &TestConfig::use_exporter_between_reads),
+      IntFlag("-expect-cipher-aes", &TestConfig::expect_cipher_aes),
+      IntFlag("-expect-cipher-no-aes", &TestConfig::expect_cipher_no_aes),
+      IntFlag("-expect-cipher", &TestConfig::expect_cipher),
+      StringFlag("-expect-peer-cert-file", &TestConfig::expect_peer_cert_file),
+      IntFlag("-resumption-delay", &TestConfig::resumption_delay),
+      BoolFlag("-retain-only-sha256-client-cert",
+               &TestConfig::retain_only_sha256_client_cert),
+      BoolFlag("-expect-sha256-client-cert",
+               &TestConfig::expect_sha256_client_cert),
+      BoolFlag("-read-with-unfinished-write",
+               &TestConfig::read_with_unfinished_write),
+      BoolFlag("-expect-secure-renegotiation",
+               &TestConfig::expect_secure_renegotiation),
+      BoolFlag("-expect-no-secure-renegotiation",
+               &TestConfig::expect_no_secure_renegotiation),
+      IntFlag("-max-send-fragment", &TestConfig::max_send_fragment),
+      IntFlag("-read-size", &TestConfig::read_size),
+      BoolFlag("-expect-session-id", &TestConfig::expect_session_id),
+      BoolFlag("-expect-no-session-id", &TestConfig::expect_no_session_id),
+      IntFlag("-expect-ticket-age-skew", &TestConfig::expect_ticket_age_skew),
+      BoolFlag("-no-op-extra-handshake", &TestConfig::no_op_extra_handshake),
+      BoolFlag("-handshake-twice", &TestConfig::handshake_twice),
+      BoolFlag("-allow-unknown-alpn-protos",
+               &TestConfig::allow_unknown_alpn_protos),
+      BoolFlag("-use-custom-verify-callback",
+               &TestConfig::use_custom_verify_callback),
+      StringFlag("-expect-msg-callback", &TestConfig::expect_msg_callback),
+      BoolFlag("-allow-false-start-without-alpn",
+               &TestConfig::allow_false_start_without_alpn),
+      BoolFlag("-handoff", &TestConfig::handoff),
+      BoolFlag("-handshake-hints", &TestConfig::handshake_hints),
+      BoolFlag("-allow-hint-mismatch", &TestConfig::allow_hint_mismatch),
+      BoolFlag("-use-ocsp-callback", &TestConfig::use_ocsp_callback),
+      BoolFlag("-set-ocsp-in-callback", &TestConfig::set_ocsp_in_callback),
+      BoolFlag("-decline-ocsp-callback", &TestConfig::decline_ocsp_callback),
+      BoolFlag("-fail-ocsp-callback", &TestConfig::fail_ocsp_callback),
+      BoolFlag("-install-cert-compression-algs",
+               &TestConfig::install_cert_compression_algs),
+      IntFlag("-install-one-cert-compression-alg",
+              &TestConfig::install_one_cert_compression_alg),
+      BoolFlag("-reverify-on-resume", &TestConfig::reverify_on_resume),
+      BoolFlag("-no-enforce-rsa-key-usage",
+               &TestConfig::no_enforce_rsa_key_usage),
+      BoolFlag("-is-handshaker-supported",
+               &TestConfig::is_handshaker_supported),
+      BoolFlag("-handshaker-resume", &TestConfig::handshaker_resume),
+      StringFlag("-handshaker-path", &TestConfig::handshaker_path),
+      BoolFlag("-jdk11-workaround", &TestConfig::jdk11_workaround),
+      BoolFlag("-server-preference", &TestConfig::server_preference),
+      BoolFlag("-export-traffic-secrets", &TestConfig::export_traffic_secrets),
+      BoolFlag("-key-update", &TestConfig::key_update),
+      BoolFlag("-expect-delegated-credential-used",
+               &TestConfig::expect_delegated_credential_used),
+      StringFlag("-delegated-credential", &TestConfig::delegated_credential),
+      StringFlag("-expect-early-data-reason",
+                 &TestConfig::expect_early_data_reason),
+      BoolFlag("-expect-hrr", &TestConfig::expect_hrr),
+      BoolFlag("-expect-no-hrr", &TestConfig::expect_no_hrr),
+      BoolFlag("-wait-for-debugger", &TestConfig::wait_for_debugger),
+      StringFlag("-quic-early-data-context",
+                 &TestConfig::quic_early_data_context),
+      IntFlag("-early-write-after-message",
+              &TestConfig::early_write_after_message),
+      BoolFlag("-fips-202205", &TestConfig::fips_202205),
+  };
+  std::sort(flags.begin(), flags.end(), [](const Flag &a, const Flag &b) {
+    return strcmp(a.name, b.name) < 0;
+  });
+  return flags;
+}
+
+const Flag *FindFlag(const char *name) {
+  static const std::vector<Flag> kSortedFlags = SortedFlags();
+  auto iter = std::lower_bound(kSortedFlags.begin(), kSortedFlags.end(), name,
+                               [](const Flag &flag, const char *key) {
+                                 return strcmp(flag.name, key) < 0;
+                               });
+  if (iter == kSortedFlags.end() || strcmp(iter->name, name) != 0) {
+    return nullptr;
   }
-
-  std::string *string_field = FindField(out_config, kStringFlags, flag);
-  if (string_field != NULL) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    if (!skip) {
-      string_field->assign(argv[*i]);
-    }
-    return true;
-  }
-
-  std::unique_ptr<std::string> *optional_string_field =
-      FindField(out_config, kOptionalStringFlags, flag);
-  if (optional_string_field != NULL) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    if (!skip) {
-      optional_string_field->reset(new std::string(argv[*i]));
-    }
-    return true;
-  }
-
-  std::string *base64_field = FindField(out_config, kBase64Flags, flag);
-  if (base64_field != NULL) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    std::string value;
-    if (!DecodeBase64(&value, argv[*i])) {
-      return false;
-    }
-    if (!skip) {
-      *base64_field = std::move(value);
-    }
-    return true;
-  }
-
-  int *int_field = FindField(out_config, kIntFlags, flag);
-  if (int_field) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    if (!skip) {
-      *int_field = atoi(argv[*i]);
-    }
-    return true;
-  }
-
-  std::vector<int> *int_vector_field =
-      FindField(out_config, kIntVectorFlags, flag);
-  if (int_vector_field) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-
-    // Each instance of the flag adds to the list.
-    if (!skip) {
-      int_vector_field->push_back(atoi(argv[*i]));
-    }
-    return true;
-  }
-
-  std::vector<std::string> *base64_vector_field =
-      FindField(out_config, kBase64VectorFlags, flag);
-  if (base64_vector_field) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    std::string value;
-    if (!DecodeBase64(&value, argv[*i])) {
-      return false;
-    }
-    // Each instance of the flag adds to the list.
-    if (!skip) {
-      base64_vector_field->push_back(std::move(value));
-    }
-    return true;
-  }
-
-  std::vector<std::pair<std::string, std::string>> *string_pair_vector_field =
-      FindField(out_config, kStringPairVectorFlags, flag);
-  if (string_pair_vector_field) {
-    *i = *i + 1;
-    if (*i >= argc) {
-      fprintf(stderr, "Missing parameter.\n");
-      return false;
-    }
-    const char *comma = strchr(argv[*i], ',');
-    if (!comma) {
-      fprintf(
-          stderr,
-          "Parameter should be a comma-separated triple composed of two base64 "
-          "strings followed by \"true\" or \"false\".\n");
-      return false;
-    }
-    // Each instance of the flag adds to the list.
-    if (!skip) {
-      string_pair_vector_field->push_back(std::make_pair(
-          std::string(argv[*i], comma - argv[*i]), std::string(comma + 1)));
-    }
-    return true;
-  }
-
-  fprintf(stderr, "Unknown argument: %s.\n", flag);
-  return false;
+  return &*iter;
 }
 
 // RemovePrefix checks if |*str| begins with |prefix| + "-". If so, it advances
@@ -433,15 +428,15 @@
   out_initial->argv = out_resume->argv = out_retry->argv = argv;
   for (int i = 0; i < argc; i++) {
     bool skip = false;
-    const char *flag = argv[i];
+    const char *name = argv[i];
 
     // -on-shim and -on-handshaker prefixes enable flags only on the shim or
     // handshaker.
-    if (RemovePrefix(&flag, "-on-shim")) {
+    if (RemovePrefix(&name, "-on-shim")) {
       if (!is_shim) {
         skip = true;
       }
-    } else if (RemovePrefix(&flag, "-on-handshaker")) {
+    } else if (RemovePrefix(&name, "-on-handshaker")) {
       if (is_shim) {
         skip = true;
       }
@@ -449,26 +444,45 @@
 
     // The following prefixes allow different configurations for each of the
     // initial, resumption, and 0-RTT retry handshakes.
-    if (RemovePrefix(&flag, "-on-initial")) {
-      if (!ParseFlag(flag, argc, argv, &i, skip, out_initial)) {
+    TestConfig *out = nullptr;
+    if (RemovePrefix(&name, "-on-initial")) {
+      out = out_initial;
+    } else if (RemovePrefix(&name, "-on-resume")) {
+      out = out_resume;
+    } else if (RemovePrefix(&name, "-on-retry")) {
+      out = out_retry;
+    }
+
+    const Flag *flag = FindFlag(name);
+    if (flag == nullptr) {
+      fprintf(stderr, "Unrecognized flag: %s\n", name);
+      return false;
+    }
+
+    const char *param = nullptr;
+    if (flag->has_param) {
+      if (i >= argc) {
+        fprintf(stderr, "Missing parameter for %s\n", name);
         return false;
       }
-    } else if (RemovePrefix(&flag, "-on-resume")) {
-      if (!ParseFlag(flag, argc, argv, &i, skip, out_resume)) {
-        return false;
-      }
-    } else if (RemovePrefix(&flag, "-on-retry")) {
-      if (!ParseFlag(flag, argc, argv, &i, skip, out_retry)) {
-        return false;
-      }
-    } else {
-      // Unprefixed flags apply to all three.
-      int i_init = i;
-      int i_resume = i;
-      if (!ParseFlag(flag, argc, argv, &i_init, skip, out_initial) ||
-          !ParseFlag(flag, argc, argv, &i_resume, skip, out_resume) ||
-          !ParseFlag(flag, argc, argv, &i, skip, out_retry)) {
-        return false;
+      i++;
+      param = argv[i];
+    }
+
+    if (!skip) {
+      if (out != nullptr) {
+        if (!flag->set_param(out, param)) {
+          fprintf(stderr, "Invalid parameter for %s: %s\n", name, param);
+          return false;
+        }
+      } else {
+        // Unprefixed flags apply to all three.
+        if (!flag->set_param(out_initial, param) ||
+            !flag->set_param(out_resume, param) ||
+            !flag->set_param(out_retry, param)) {
+          fprintf(stderr, "Invalid parameter for %s: %s\n", name, param);
+          return false;
+        }
       }
     }
   }
@@ -582,13 +596,15 @@
   switch (content_type) {
     case 0:
       if (version != SSL2_VERSION) {
-        fprintf(stderr, "Incorrect version for V2ClientHello: %x.\n", version);
+        fprintf(stderr, "Incorrect version for V2ClientHello: %x.\n",
+                static_cast<unsigned>(version));
         state->msg_callback_ok = false;
         return;
       }
       state->msg_callback_text += "v2clienthello\n";
       return;
 
+    case SSL3_RT_CLIENT_HELLO_INNER:
     case SSL3_RT_HANDSHAKE: {
       CBS cbs;
       CBS_init(&cbs, buf_u8, len);
@@ -606,10 +622,19 @@
         return;
       }
       char text[16];
-      snprintf(text, sizeof(text), "hs %d\n", type);
-      state->msg_callback_text += text;
-      if (!is_write) {
-        state->last_message_received = type;
+      if (content_type == SSL3_RT_CLIENT_HELLO_INNER) {
+        if (type != SSL3_MT_CLIENT_HELLO) {
+          fprintf(stderr, "Invalid header for ClientHelloInner.\n");
+          state->msg_callback_ok = false;
+          return;
+        }
+        state->msg_callback_text += "clienthelloinner\n";
+      } else {
+        snprintf(text, sizeof(text), "hs %d\n", type);
+        state->msg_callback_text += text;
+        if (!is_write) {
+          state->last_message_received = type;
+        }
       }
       return;
     }
@@ -873,9 +898,8 @@
   const TestConfig *config = GetTestConfig(ssl);
 
   if (!config->signing_prefs.empty()) {
-    std::vector<uint16_t> u16s(config->signing_prefs.begin(),
-                               config->signing_prefs.end());
-    if (!SSL_set_signing_algorithm_prefs(ssl, u16s.data(), u16s.size())) {
+    if (!SSL_set_signing_algorithm_prefs(ssl, config->signing_prefs.data(),
+                                         config->signing_prefs.size())) {
       return false;
     }
   }
@@ -1006,8 +1030,7 @@
       return false;
     }
     for (size_t i = 0; i < num_peer_sigalgs; i++) {
-      if (static_cast<int>(peer_sigalgs[i]) !=
-          config->expect_peer_verify_prefs[i]) {
+      if (peer_sigalgs[i] != config->expect_peer_verify_prefs[i]) {
         fprintf(stderr,
                 "peer verify preference %zu mismatch (got %04x, wanted %04x\n",
                 i, peer_sigalgs[i], config->expect_peer_verify_prefs[i]);
@@ -1047,17 +1070,16 @@
     const size_t num_received = sk_X509_NAME_num(received);
 
     if (num_received != num_expected) {
-      fprintf(stderr, "expected %u names in CertificateRequest but got %u.\n",
-              static_cast<unsigned>(num_expected),
-              static_cast<unsigned>(num_received));
+      fprintf(stderr, "expected %zu names in CertificateRequest but got %zu.\n",
+              num_expected, num_received);
       return false;
     }
 
     for (size_t i = 0; i < num_received; i++) {
       if (X509_NAME_cmp(sk_X509_NAME_value(received, i),
                         sk_X509_NAME_value(expected.get(), i)) != 0) {
-        fprintf(stderr, "names in CertificateRequest differ at index #%d.\n",
-                static_cast<unsigned>(i));
+        fprintf(stderr, "names in CertificateRequest differ at index #%zu.\n",
+                i);
         return false;
       }
     }
@@ -1464,9 +1486,8 @@
   }
 
   if (!verify_prefs.empty()) {
-    std::vector<uint16_t> u16s(verify_prefs.begin(), verify_prefs.end());
-    if (!SSL_CTX_set_verify_algorithm_prefs(ssl_ctx.get(), u16s.data(),
-                                            u16s.size())) {
+    if (!SSL_CTX_set_verify_algorithm_prefs(ssl_ctx.get(), verify_prefs.data(),
+                                            verify_prefs.size())) {
       return nullptr;
     }
   }
@@ -1722,8 +1743,8 @@
   if (reverify_on_resume) {
     SSL_CTX_set_reverify_on_resume(ssl_ctx, 1);
   }
-  if (enforce_rsa_key_usage) {
-    SSL_set_enforce_rsa_key_usage(ssl.get(), 1);
+  if (no_enforce_rsa_key_usage) {
+    SSL_set_enforce_rsa_key_usage(ssl.get(), 0);
   }
   if (no_tls13) {
     SSL_set_options(ssl.get(), SSL_OP_NO_TLSv1_3);
@@ -1746,6 +1767,11 @@
   if (enable_ech_grease) {
     SSL_set_enable_ech_grease(ssl.get(), 1);
   }
+  if (fips_202205 && !SSL_set_compliance_policy(
+                         ssl.get(), ssl_compliance_policy_fips_202205)) {
+    fprintf(stderr, "SSL_set_compliance_policy failed\n");
+    return nullptr;
+  }
   if (!ech_config_list.empty() &&
       !SSL_set1_ech_config_list(
           ssl.get(), reinterpret_cast<const uint8_t *>(ech_config_list.data()),
@@ -1830,11 +1856,11 @@
     SSL_enable_signed_cert_timestamps(ssl.get());
   }
   if (min_version != 0 &&
-      !SSL_set_min_proto_version(ssl.get(), (uint16_t)min_version)) {
+      !SSL_set_min_proto_version(ssl.get(), min_version)) {
     return nullptr;
   }
   if (max_version != 0 &&
-      !SSL_set_max_proto_version(ssl.get(), (uint16_t)max_version)) {
+      !SSL_set_max_proto_version(ssl.get(), max_version)) {
     return nullptr;
   }
   if (mtu != 0) {
diff --git a/src/ssl/test/test_config.h b/src/ssl/test/test_config.h
index c9f2a25..6b15891 100644
--- a/src/ssl/test/test_config.h
+++ b/src/ssl/test/test_config.h
@@ -32,9 +32,9 @@
   int resume_count = 0;
   std::string write_settings;
   bool fallback_scsv = false;
-  std::vector<int> signing_prefs;
-  std::vector<int> verify_prefs;
-  std::vector<int> expect_peer_verify_prefs;
+  std::vector<uint16_t> signing_prefs;
+  std::vector<uint16_t> verify_prefs;
+  std::vector<uint16_t> expect_peer_verify_prefs;
   std::vector<int> curves;
   std::string key_file;
   std::string cert_file;
@@ -93,9 +93,9 @@
   std::string expect_ocsp_response;
   bool enable_signed_cert_timestamps = false;
   std::string expect_signed_cert_timestamps;
-  int min_version = 0;
-  int max_version = 0;
-  int expect_version = 0;
+  uint16_t min_version = 0;
+  uint16_t max_version = 0;
+  uint16_t expect_version = 0;
   int mtu = 0;
   bool implicit_handshake = false;
   bool use_early_callback = false;
@@ -119,10 +119,6 @@
   bool use_ticket_callback = false;
   bool renew_ticket = false;
   bool enable_early_data = false;
-  bool enable_client_custom_extension = false;
-  bool enable_server_custom_extension = false;
-  bool custom_extension_skip = false;
-  bool custom_extension_fail_add = false;
   std::string ocsp_response;
   bool check_close_notify = false;
   bool shim_shuts_down = false;
@@ -137,8 +133,8 @@
   bool renegotiate_ignore = false;
   bool renegotiate_explicit = false;
   bool forbid_renegotiation_after_handshake = false;
-  int expect_peer_signature_algorithm = 0;
-  int expect_curve_id = 0;
+  uint16_t expect_peer_signature_algorithm = 0;
+  uint16_t expect_curve_id = 0;
   bool use_old_client_cert_callback = false;
   int initial_timeout_duration_ms = 0;
   std::string use_client_ca_list;
@@ -150,9 +146,9 @@
   int max_cert_list = 0;
   std::string ticket_key;
   bool use_exporter_between_reads = false;
-  int expect_cipher_aes = 0;
-  int expect_cipher_no_aes = 0;
-  int expect_cipher = 0;
+  uint16_t expect_cipher_aes = 0;
+  uint16_t expect_cipher_no_aes = 0;
+  uint16_t expect_cipher = 0;
   std::string expect_peer_cert_file;
   int resumption_delay = 0;
   bool retain_only_sha256_client_cert = false;
@@ -181,7 +177,7 @@
   bool install_cert_compression_algs = false;
   int install_one_cert_compression_alg = 0;
   bool reverify_on_resume = false;
-  bool enforce_rsa_key_usage = false;
+  bool no_enforce_rsa_key_usage = false;
   bool is_handshaker_supported = false;
   bool handshaker_resume = false;
   std::string handshaker_path;
@@ -197,6 +193,7 @@
   bool wait_for_debugger = false;
   std::string quic_early_data_context;
   int early_write_after_message = 0;
+  bool fips_202205 = false;
 
   int argc;
   char **argv;
diff --git a/src/ssl/tls13_both.cc b/src/ssl/tls13_both.cc
index 226c67b..d7997c7 100644
--- a/src/ssl/tls13_both.cc
+++ b/src/ssl/tls13_both.cc
@@ -475,7 +475,7 @@
                        CRYPTO_BUFFER_len(raw)) ||
         !CBB_flush(&extensions)) {
       OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-      return 0;
+      return false;
     }
     ssl->s3->delegated_credential_used = true;
   }
@@ -576,7 +576,6 @@
     return ssl_private_key_failure;
   }
 
-  // Sign the digest.
   CBB child;
   const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey.get());
   uint8_t *sig;
@@ -595,40 +594,10 @@
     return ssl_private_key_failure;
   }
 
-  SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
-  Array<uint8_t> spki;
-  if (hints) {
-    ScopedCBB spki_cbb;
-    if (!CBB_init(spki_cbb.get(), 64) ||
-        !EVP_marshal_public_key(spki_cbb.get(), hs->local_pubkey.get()) ||
-        !CBBFinishArray(spki_cbb.get(), &spki)) {
-      ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
-      return ssl_private_key_failure;
-    }
-  }
-
-  if (hints && !hs->hints_requested &&
-      signature_algorithm == hints->signature_algorithm &&
-      MakeConstSpan(msg) == hints->signature_input &&
-      MakeConstSpan(spki) == hints->signature_spki &&
-      !hints->signature.empty() && hints->signature.size() <= max_sig_len) {
-    // Signature algorithm and input both match. Reuse the signature from hints.
-    sig_len = hints->signature.size();
-    OPENSSL_memcpy(sig, hints->signature.data(), sig_len);
-  } else {
-    enum ssl_private_key_result_t sign_result = ssl_private_key_sign(
-        hs, sig, &sig_len, max_sig_len, signature_algorithm, msg);
-    if (sign_result != ssl_private_key_success) {
-      return sign_result;
-    }
-    if (hints && hs->hints_requested) {
-      hints->signature_algorithm = signature_algorithm;
-      hints->signature_input = std::move(msg);
-      hints->signature_spki = std::move(spki);
-      if (!hints->signature.CopyFrom(MakeSpan(sig, sig_len))) {
-        return ssl_private_key_failure;
-      }
-    }
+  enum ssl_private_key_result_t sign_result = ssl_private_key_sign(
+      hs, sig, &sig_len, max_sig_len, signature_algorithm, msg);
+  if (sign_result != ssl_private_key_success) {
+    return sign_result;
   }
 
   if (!CBB_did_write(&child, sig_len) ||
diff --git a/src/ssl/tls13_client.cc b/src/ssl/tls13_client.cc
index af2120c..bd0f820 100644
--- a/src/ssl/tls13_client.cc
+++ b/src/ssl/tls13_client.cc
@@ -192,11 +192,15 @@
   }
 
   // The cipher suite must be one we offered. We currently offer all supported
-  // TLS 1.3 ciphers, so check the version.
+  // TLS 1.3 ciphers unless policy controls limited it. So we check the version
+  // and that it's ok per policy.
   const SSL_CIPHER *cipher = SSL_get_cipher_by_value(server_hello.cipher_suite);
   if (cipher == nullptr ||
       SSL_CIPHER_get_min_version(cipher) > ssl_protocol_version(ssl) ||
-      SSL_CIPHER_get_max_version(cipher) < ssl_protocol_version(ssl)) {
+      SSL_CIPHER_get_max_version(cipher) < ssl_protocol_version(ssl) ||
+      !ssl_tls13_cipher_meets_policy(
+          SSL_CIPHER_get_value(cipher),
+          ssl->config->only_fips_cipher_suites_in_tls13)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
     return ssl_hs_error;
@@ -372,7 +376,7 @@
   }
 
   // Check the cipher suite, in case this is after HelloRetryRequest.
-  if (SSL_CIPHER_get_value(hs->new_cipher) != server_hello.cipher_suite) {
+  if (SSL_CIPHER_get_protocol_id(hs->new_cipher) != server_hello.cipher_suite) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
     return ssl_hs_error;
diff --git a/src/ssl/tls13_enc.cc b/src/ssl/tls13_enc.cc
index c7b75a6..ad023ef 100644
--- a/src/ssl/tls13_enc.cc
+++ b/src/ssl/tls13_enc.cc
@@ -364,9 +364,9 @@
       !tls13_verify_data(out, out_len, hs->transcript.Digest(),
                          hs->ssl->version, traffic_secret,
                          MakeConstSpan(context_hash, context_hash_len))) {
-    return 0;
+    return false;
   }
-  return 1;
+  return true;
 }
 
 static const char kTLS13LabelResumptionPSK[] = "resumption";
diff --git a/src/ssl/tls13_server.cc b/src/ssl/tls13_server.cc
index 2f000e5..ca43624 100644
--- a/src/ssl/tls13_server.cc
+++ b/src/ssl/tls13_server.cc
@@ -116,7 +116,8 @@
 
   const uint16_t version = ssl_protocol_version(ssl);
 
-  return ssl_choose_tls13_cipher(cipher_suites, version, group_id);
+  return ssl_choose_tls13_cipher(cipher_suites, version, group_id,
+                                 ssl->config->only_fips_cipher_suites_in_tls13);
 }
 
 static bool add_new_session_tickets(SSL_HANDSHAKE *hs, bool *out_sent_tickets) {
@@ -131,15 +132,12 @@
     return true;
   }
 
-  // TLS 1.3 recommends single-use tickets, so issue multiple tickets in case
-  // the client makes several connections before getting a renewal.
-  static const int kNumTickets = 2;
-
   // Rebase the session timestamp so that it is measured from ticket
   // issuance.
   ssl_session_rebase_time(ssl, hs->new_session.get());
 
-  for (int i = 0; i < kNumTickets; i++) {
+  assert(ssl->session_ctx->num_tickets <= kMaxTickets);
+  for (size_t i = 0; i < ssl->session_ctx->num_tickets; i++) {
     UniquePtr<SSL_SESSION> session(
         SSL_SESSION_dup(hs->new_session.get(), SSL_SESSION_INCLUDE_NONAUTH));
     if (!session) {
@@ -160,7 +158,8 @@
           ssl->quic_method != nullptr ? 0xffffffff : kMaxEarlyDataAccepted;
     }
 
-    static_assert(kNumTickets < 256, "Too many tickets");
+    static_assert(kMaxTickets < 256, "Too many tickets");
+    assert(i < 256);
     uint8_t nonce[] = {static_cast<uint8_t>(i)};
 
     ScopedCBB cbb;
@@ -658,28 +657,16 @@
     }
 
     // Decrypt the payload with the HPKE context from the first ClientHello.
-    Array<uint8_t> encoded_client_hello_inner;
+    uint8_t alert = SSL_AD_DECODE_ERROR;
     bool unused;
-    if (!ssl_client_hello_decrypt(hs->ech_hpke_ctx.get(),
-                                  &encoded_client_hello_inner, &unused,
-                                  &client_hello, payload)) {
+    if (!ssl_client_hello_decrypt(hs, &alert, &unused,
+                                  &hs->ech_client_hello_buf, &client_hello,
+                                  payload)) {
       // Decryption failure is fatal in the second ClientHello.
       OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
-      ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
-      return ssl_hs_error;
-    }
-
-    // Recover the ClientHelloInner from the EncodedClientHelloInner.
-    uint8_t alert = SSL_AD_DECODE_ERROR;
-    bssl::Array<uint8_t> client_hello_inner;
-    if (!ssl_decode_client_hello_inner(ssl, &alert, &client_hello_inner,
-                                       encoded_client_hello_inner,
-                                       &client_hello)) {
-      OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
       ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
       return ssl_hs_error;
     }
-    hs->ech_client_hello_buf = std::move(client_hello_inner);
 
     // Reparse |client_hello| from the buffer owned by |hs|.
     if (!hs->GetClientHello(&msg, &client_hello)) {
@@ -751,12 +738,13 @@
 
   SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
   if (hints && !hs->hints_requested &&
-      hints->server_random.size() == random.size()) {
-    OPENSSL_memcpy(random.data(), hints->server_random.data(), random.size());
+      hints->server_random_tls13.size() == random.size()) {
+    OPENSSL_memcpy(random.data(), hints->server_random_tls13.data(),
+                   random.size());
   } else {
     RAND_bytes(random.data(), random.size());
     if (hints && hs->hints_requested &&
-        !hints->server_random.CopyFrom(random)) {
+        !hints->server_random_tls13.CopyFrom(random)) {
       return ssl_hs_error;
     }
   }
diff --git a/src/ssl/tls_method.cc b/src/ssl/tls_method.cc
index 326cbe7..5fcf684 100644
--- a/src/ssl/tls_method.cc
+++ b/src/ssl/tls_method.cc
@@ -108,7 +108,7 @@
     }
   }
 
-  OPENSSL_memset(ssl->s3->read_sequence, 0, sizeof(ssl->s3->read_sequence));
+  ssl->s3->read_sequence = 0;
   ssl->s3->aead_read_ctx = std::move(aead_ctx);
   ssl->s3->read_level = level;
   return true;
@@ -137,7 +137,7 @@
     }
   }
 
-  OPENSSL_memset(ssl->s3->write_sequence, 0, sizeof(ssl->s3->write_sequence));
+  ssl->s3->write_sequence = 0;
   ssl->s3->aead_write_ctx = std::move(aead_ctx);
   ssl->s3->write_level = level;
   return true;
diff --git a/src/ssl/tls_record.cc b/src/ssl/tls_record.cc
index acff1ad..395b9a4 100644
--- a/src/ssl/tls_record.cc
+++ b/src/ssl/tls_record.cc
@@ -151,17 +151,6 @@
 #endif
 }
 
-bool ssl_record_sequence_update(uint8_t *seq, size_t seq_len) {
-  for (size_t i = seq_len - 1; i < seq_len; i--) {
-    ++seq[i];
-    if (seq[i] != 0) {
-      return true;
-    }
-  }
-  OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
-  return false;
-}
-
 size_t ssl_record_prefix_len(const SSL *ssl) {
   size_t header_len;
   if (SSL_is_dtls(ssl)) {
@@ -286,6 +275,13 @@
     return skip_early_data(ssl, out_alert, *out_consumed);
   }
 
+  // Ensure the sequence number update does not overflow.
+  if (ssl->s3->read_sequence + 1 == 0) {
+    OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
+    *out_alert = SSL_AD_INTERNAL_ERROR;
+    return ssl_open_record_error;
+  }
+
   // Decrypt the body in-place.
   if (!ssl->s3->aead_read_ctx->Open(
           out, type, version, ssl->s3->read_sequence, header,
@@ -301,11 +297,7 @@
   }
 
   ssl->s3->skip_early_data = false;
-
-  if (!ssl_record_sequence_update(ssl->s3->read_sequence, 8)) {
-    *out_alert = SSL_AD_INTERNAL_ERROR;
-    return ssl_open_record_error;
-  }
+  ssl->s3->read_sequence++;
 
   // TLS 1.3 hides the record type inside the encrypted data.
   bool has_padding =
@@ -411,13 +403,19 @@
   out_prefix[4] = ciphertext_len & 0xff;
   Span<const uint8_t> header = MakeSpan(out_prefix, SSL3_RT_HEADER_LENGTH);
 
-  if (!aead->SealScatter(out_prefix + SSL3_RT_HEADER_LENGTH, out, out_suffix,
-                         out_prefix[0], record_version, ssl->s3->write_sequence,
-                         header, in, in_len, extra_in, extra_in_len) ||
-      !ssl_record_sequence_update(ssl->s3->write_sequence, 8)) {
+  // Ensure the sequence number update does not overflow.
+  if (ssl->s3->write_sequence + 1 == 0) {
+    OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
     return false;
   }
 
+  if (!aead->SealScatter(out_prefix + SSL3_RT_HEADER_LENGTH, out, out_suffix,
+                         out_prefix[0], record_version, ssl->s3->write_sequence,
+                         header, in, in_len, extra_in, extra_in_len)) {
+    return false;
+  }
+
+  ssl->s3->write_sequence++;
   ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HEADER, header);
   return true;
 }
@@ -602,86 +600,6 @@
   return ssl_open_record_error;
 }
 
-OpenRecordResult OpenRecord(SSL *ssl, Span<uint8_t> *out,
-                            size_t *out_record_len, uint8_t *out_alert,
-                            const Span<uint8_t> in) {
-  // This API is a work in progress and currently only works for TLS 1.2 servers
-  // and below.
-  if (SSL_in_init(ssl) ||
-      SSL_is_dtls(ssl) ||
-      ssl_protocol_version(ssl) > TLS1_2_VERSION) {
-    assert(false);
-    *out_alert = SSL_AD_INTERNAL_ERROR;
-    return OpenRecordResult::kError;
-  }
-
-  Span<uint8_t> plaintext;
-  uint8_t type = 0;
-  const ssl_open_record_t result = tls_open_record(
-      ssl, &type, &plaintext, out_record_len, out_alert, in);
-
-  switch (result) {
-    case ssl_open_record_success:
-      if (type != SSL3_RT_APPLICATION_DATA && type != SSL3_RT_ALERT) {
-        *out_alert = SSL_AD_UNEXPECTED_MESSAGE;
-        return OpenRecordResult::kError;
-      }
-      *out = plaintext;
-      return OpenRecordResult::kOK;
-    case ssl_open_record_discard:
-      return OpenRecordResult::kDiscard;
-    case ssl_open_record_partial:
-      return OpenRecordResult::kIncompleteRecord;
-    case ssl_open_record_close_notify:
-      return OpenRecordResult::kAlertCloseNotify;
-    case ssl_open_record_error:
-      return OpenRecordResult::kError;
-  }
-  assert(false);
-  return OpenRecordResult::kError;
-}
-
-size_t SealRecordPrefixLen(const SSL *ssl, const size_t record_len) {
-  return tls_seal_scatter_prefix_len(ssl, SSL3_RT_APPLICATION_DATA, record_len);
-}
-
-size_t SealRecordSuffixLen(const SSL *ssl, const size_t plaintext_len) {
-  assert(plaintext_len <= SSL3_RT_MAX_PLAIN_LENGTH);
-  size_t suffix_len;
-  if (!tls_seal_scatter_suffix_len(ssl, &suffix_len, SSL3_RT_APPLICATION_DATA,
-                                   plaintext_len)) {
-    assert(false);
-    OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return 0;
-  }
-  assert(suffix_len <= SSL3_RT_MAX_ENCRYPTED_OVERHEAD);
-  return suffix_len;
-}
-
-bool SealRecord(SSL *ssl, const Span<uint8_t> out_prefix,
-                const Span<uint8_t> out, Span<uint8_t> out_suffix,
-                const Span<const uint8_t> in) {
-  // This API is a work in progress and currently only works for TLS 1.2 servers
-  // and below.
-  if (SSL_in_init(ssl) ||
-      SSL_is_dtls(ssl) ||
-      ssl_protocol_version(ssl) > TLS1_2_VERSION) {
-    assert(false);
-    OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return false;
-  }
-
-  if (out_prefix.size() != SealRecordPrefixLen(ssl, in.size()) ||
-      out.size() != in.size() ||
-      out_suffix.size() != SealRecordSuffixLen(ssl, in.size())) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_BUFFER_TOO_SMALL);
-    return false;
-  }
-  return tls_seal_scatter_record(ssl, out_prefix.data(), out.data(),
-                                 out_suffix.data(), SSL3_RT_APPLICATION_DATA,
-                                 in.data(), in.size());
-}
-
 BSSL_NAMESPACE_END
 
 using namespace bssl;
diff --git a/src/third_party/fiat/LICENSE b/src/third_party/fiat/LICENSE
index bd46c61..70cae03 100644
--- a/src/third_party/fiat/LICENSE
+++ b/src/third_party/fiat/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2015-2016 the fiat-crypto authors (see
+Copyright (c) 2015-2020 the fiat-crypto authors (see
 https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS).
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/src/third_party/fiat/METADATA b/src/third_party/fiat/METADATA
index e527c14..339fe5f 100644
--- a/src/third_party/fiat/METADATA
+++ b/src/third_party/fiat/METADATA
@@ -6,8 +6,8 @@
     type: GIT
     value: "https://github.com/mit-plv/fiat-crypto"
   }
-  version: "0884b6d374a9d937c44bf024fe3a647ffae2c540"
-  last_upgrade_date { year: 2020 month: 4 day: 16 }
+  version: "6ccc6638716d4632304baf1adbb5c47c3a12ea6f"
+  last_upgrade_date { year: 2022 month: 3 day: 22 }
 
-  local_modifications: "Files renamed to .h for BoringSSL integration. Select functions patched with value barriers."
+  local_modifications: "Files renamed to .h for BoringSSL integration. LICENSE file is LICENSE-MIT from upstream."
 }
diff --git a/src/third_party/fiat/curve25519_32.h b/src/third_party/fiat/curve25519_32.h
index 7b78d00..cb83c60 100644
--- a/src/third_party/fiat/curve25519_32.h
+++ b/src/third_party/fiat/curve25519_32.h
@@ -1,24 +1,51 @@
-/* Autogenerated: src/ExtractionOCaml/unsaturated_solinas --static 25519 10 '2^255 - 19' 32 carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes carry_scmul121666 */
+/* Autogenerated: 'src/ExtractionOCaml/unsaturated_solinas' --inline --static --use-value-barrier 25519 32 '(auto)' '2^255 - 19' carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes relax carry_scmul121666 */
 /* curve description: 25519 */
-/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, carry_scmul121666 */
-/* n = 10 (from "10") */
-/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */
 /* machine_wordsize = 32 (from "32") */
-
+/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, relax, carry_scmul121666 */
+/* n = 10 (from "(auto)") */
+/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */
+/* tight_bounds_multiplier = 1 (from "") */
+/*  */
 /* Computed values: */
-/* carry_chain = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1] */
+/*   carry_chain = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1] */
+/*   eval z = z[0] + (z[1] << 26) + (z[2] << 51) + (z[3] << 77) + (z[4] << 102) + (z[5] << 128) + (z[6] << 153) + (z[7] << 179) + (z[8] << 204) + (z[9] << 230) */
+/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
+/*   balance = [0x7ffffda, 0x3fffffe, 0x7fffffe, 0x3fffffe, 0x7fffffe, 0x3fffffe, 0x7fffffe, 0x3fffffe, 0x7fffffe, 0x3fffffe] */
 
 #include <stdint.h>
 typedef unsigned char fiat_25519_uint1;
 typedef signed char fiat_25519_int1;
+#if defined(__GNUC__) || defined(__clang__)
+#  define FIAT_25519_FIAT_INLINE __inline__
+#else
+#  define FIAT_25519_FIAT_INLINE
+#endif
+
+/* The type fiat_25519_loose_field_element is a field element with loose bounds. */
+/* Bounds: [[0x0 ~> 0xc000000], [0x0 ~> 0x6000000], [0x0 ~> 0xc000000], [0x0 ~> 0x6000000], [0x0 ~> 0xc000000], [0x0 ~> 0x6000000], [0x0 ~> 0xc000000], [0x0 ~> 0x6000000], [0x0 ~> 0xc000000], [0x0 ~> 0x6000000]] */
+typedef uint32_t fiat_25519_loose_field_element[10];
+
+/* The type fiat_25519_tight_field_element is a field element with tight bounds. */
+/* Bounds: [[0x0 ~> 0x4000000], [0x0 ~> 0x2000000], [0x0 ~> 0x4000000], [0x0 ~> 0x2000000], [0x0 ~> 0x4000000], [0x0 ~> 0x2000000], [0x0 ~> 0x4000000], [0x0 ~> 0x2000000], [0x0 ~> 0x4000000], [0x0 ~> 0x2000000]] */
+typedef uint32_t fiat_25519_tight_field_element[10];
 
 #if (-1 & 3) != 3
 #error "This code only works on a two's complement system"
 #endif
 
+#if !defined(FIAT_25519_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
+static __inline__ uint32_t fiat_25519_value_barrier_u32(uint32_t a) {
+  __asm__("" : "+r"(a) : /* no inputs */);
+  return a;
+}
+#else
+#  define fiat_25519_value_barrier_u32(x) (x)
+#endif
+
 
 /*
  * The function fiat_25519_addcarryx_u26 is an addition with carry.
+ *
  * Postconditions:
  *   out1 = (arg1 + arg2 + arg3) mod 2^26
  *   out2 = ⌊(arg1 + arg2 + arg3) / 2^26⌋
@@ -31,16 +58,20 @@
  *   out1: [0x0 ~> 0x3ffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_addcarryx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  uint32_t x1 = ((arg1 + arg2) + arg3);
-  uint32_t x2 = (x1 & UINT32_C(0x3ffffff));
-  fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 26);
+static FIAT_25519_FIAT_INLINE void fiat_25519_addcarryx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  uint32_t x1;
+  uint32_t x2;
+  fiat_25519_uint1 x3;
+  x1 = ((arg1 + arg2) + arg3);
+  x2 = (x1 & UINT32_C(0x3ffffff));
+  x3 = (fiat_25519_uint1)(x1 >> 26);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_25519_subborrowx_u26 is a subtraction with borrow.
+ *
  * Postconditions:
  *   out1 = (-arg1 + arg2 + -arg3) mod 2^26
  *   out2 = -⌊(-arg1 + arg2 + -arg3) / 2^26⌋
@@ -53,16 +84,20 @@
  *   out1: [0x0 ~> 0x3ffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_subborrowx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3);
-  fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 26);
-  uint32_t x3 = (x1 & UINT32_C(0x3ffffff));
+static FIAT_25519_FIAT_INLINE void fiat_25519_subborrowx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  int32_t x1;
+  fiat_25519_int1 x2;
+  uint32_t x3;
+  x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3);
+  x2 = (fiat_25519_int1)(x1 >> 26);
+  x3 = (x1 & UINT32_C(0x3ffffff));
   *out1 = x3;
   *out2 = (fiat_25519_uint1)(0x0 - x2);
 }
 
 /*
  * The function fiat_25519_addcarryx_u25 is an addition with carry.
+ *
  * Postconditions:
  *   out1 = (arg1 + arg2 + arg3) mod 2^25
  *   out2 = ⌊(arg1 + arg2 + arg3) / 2^25⌋
@@ -75,16 +110,20 @@
  *   out1: [0x0 ~> 0x1ffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_addcarryx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  uint32_t x1 = ((arg1 + arg2) + arg3);
-  uint32_t x2 = (x1 & UINT32_C(0x1ffffff));
-  fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 25);
+static FIAT_25519_FIAT_INLINE void fiat_25519_addcarryx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  uint32_t x1;
+  uint32_t x2;
+  fiat_25519_uint1 x3;
+  x1 = ((arg1 + arg2) + arg3);
+  x2 = (x1 & UINT32_C(0x1ffffff));
+  x3 = (fiat_25519_uint1)(x1 >> 25);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_25519_subborrowx_u25 is a subtraction with borrow.
+ *
  * Postconditions:
  *   out1 = (-arg1 + arg2 + -arg3) mod 2^25
  *   out2 = -⌊(-arg1 + arg2 + -arg3) / 2^25⌋
@@ -97,16 +136,20 @@
  *   out1: [0x0 ~> 0x1ffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_subborrowx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3);
-  fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 25);
-  uint32_t x3 = (x1 & UINT32_C(0x1ffffff));
+static FIAT_25519_FIAT_INLINE void fiat_25519_subborrowx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  int32_t x1;
+  fiat_25519_int1 x2;
+  uint32_t x3;
+  x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3);
+  x2 = (fiat_25519_int1)(x1 >> 25);
+  x3 = (x1 & UINT32_C(0x1ffffff));
   *out1 = x3;
   *out2 = (fiat_25519_uint1)(0x0 - x2);
 }
 
 /*
  * The function fiat_25519_cmovznz_u32 is a single-word conditional move.
+ *
  * Postconditions:
  *   out1 = (if arg1 = 0 then arg2 else arg3)
  *
@@ -117,178 +160,318 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffff]
  */
-static void fiat_25519_cmovznz_u32(uint32_t* out1, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  fiat_25519_uint1 x1 = (!(!arg1));
-  uint32_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT32_C(0xffffffff));
-  // Note this line has been patched from the synthesized code to add value
-  // barriers.
-  //
-  // Clang recognizes this pattern as a select. While it usually transforms it
-  // to a cmov, it sometimes further transforms it into a branch, which we do
-  // not want.
-  uint32_t x3 = ((value_barrier_u32(x2) & arg3) | (value_barrier_u32(~x2) & arg2));
+static FIAT_25519_FIAT_INLINE void fiat_25519_cmovznz_u32(uint32_t* out1, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  fiat_25519_uint1 x1;
+  uint32_t x2;
+  uint32_t x3;
+  x1 = (!(!arg1));
+  x2 = ((fiat_25519_int1)(0x0 - x1) & UINT32_C(0xffffffff));
+  x3 = ((fiat_25519_value_barrier_u32(x2) & arg3) | (fiat_25519_value_barrier_u32((~x2)) & arg2));
   *out1 = x3;
 }
 
 /*
  * The function fiat_25519_carry_mul multiplies two field elements and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
- *   arg2: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  */
-static void fiat_25519_carry_mul(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) {
-  uint64_t x1 = ((uint64_t)(arg1[9]) * ((arg2[9]) * UINT8_C(0x26)));
-  uint64_t x2 = ((uint64_t)(arg1[9]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x3 = ((uint64_t)(arg1[9]) * ((arg2[7]) * UINT8_C(0x26)));
-  uint64_t x4 = ((uint64_t)(arg1[9]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x5 = ((uint64_t)(arg1[9]) * ((arg2[5]) * UINT8_C(0x26)));
-  uint64_t x6 = ((uint64_t)(arg1[9]) * ((arg2[4]) * UINT8_C(0x13)));
-  uint64_t x7 = ((uint64_t)(arg1[9]) * ((arg2[3]) * UINT8_C(0x26)));
-  uint64_t x8 = ((uint64_t)(arg1[9]) * ((arg2[2]) * UINT8_C(0x13)));
-  uint64_t x9 = ((uint64_t)(arg1[9]) * ((arg2[1]) * UINT8_C(0x26)));
-  uint64_t x10 = ((uint64_t)(arg1[8]) * ((arg2[9]) * UINT8_C(0x13)));
-  uint64_t x11 = ((uint64_t)(arg1[8]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x12 = ((uint64_t)(arg1[8]) * ((arg2[7]) * UINT8_C(0x13)));
-  uint64_t x13 = ((uint64_t)(arg1[8]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x14 = ((uint64_t)(arg1[8]) * ((arg2[5]) * UINT8_C(0x13)));
-  uint64_t x15 = ((uint64_t)(arg1[8]) * ((arg2[4]) * UINT8_C(0x13)));
-  uint64_t x16 = ((uint64_t)(arg1[8]) * ((arg2[3]) * UINT8_C(0x13)));
-  uint64_t x17 = ((uint64_t)(arg1[8]) * ((arg2[2]) * UINT8_C(0x13)));
-  uint64_t x18 = ((uint64_t)(arg1[7]) * ((arg2[9]) * UINT8_C(0x26)));
-  uint64_t x19 = ((uint64_t)(arg1[7]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x20 = ((uint64_t)(arg1[7]) * ((arg2[7]) * UINT8_C(0x26)));
-  uint64_t x21 = ((uint64_t)(arg1[7]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x22 = ((uint64_t)(arg1[7]) * ((arg2[5]) * UINT8_C(0x26)));
-  uint64_t x23 = ((uint64_t)(arg1[7]) * ((arg2[4]) * UINT8_C(0x13)));
-  uint64_t x24 = ((uint64_t)(arg1[7]) * ((arg2[3]) * UINT8_C(0x26)));
-  uint64_t x25 = ((uint64_t)(arg1[6]) * ((arg2[9]) * UINT8_C(0x13)));
-  uint64_t x26 = ((uint64_t)(arg1[6]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x27 = ((uint64_t)(arg1[6]) * ((arg2[7]) * UINT8_C(0x13)));
-  uint64_t x28 = ((uint64_t)(arg1[6]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x29 = ((uint64_t)(arg1[6]) * ((arg2[5]) * UINT8_C(0x13)));
-  uint64_t x30 = ((uint64_t)(arg1[6]) * ((arg2[4]) * UINT8_C(0x13)));
-  uint64_t x31 = ((uint64_t)(arg1[5]) * ((arg2[9]) * UINT8_C(0x26)));
-  uint64_t x32 = ((uint64_t)(arg1[5]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x33 = ((uint64_t)(arg1[5]) * ((arg2[7]) * UINT8_C(0x26)));
-  uint64_t x34 = ((uint64_t)(arg1[5]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x35 = ((uint64_t)(arg1[5]) * ((arg2[5]) * UINT8_C(0x26)));
-  uint64_t x36 = ((uint64_t)(arg1[4]) * ((arg2[9]) * UINT8_C(0x13)));
-  uint64_t x37 = ((uint64_t)(arg1[4]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x38 = ((uint64_t)(arg1[4]) * ((arg2[7]) * UINT8_C(0x13)));
-  uint64_t x39 = ((uint64_t)(arg1[4]) * ((arg2[6]) * UINT8_C(0x13)));
-  uint64_t x40 = ((uint64_t)(arg1[3]) * ((arg2[9]) * UINT8_C(0x26)));
-  uint64_t x41 = ((uint64_t)(arg1[3]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x42 = ((uint64_t)(arg1[3]) * ((arg2[7]) * UINT8_C(0x26)));
-  uint64_t x43 = ((uint64_t)(arg1[2]) * ((arg2[9]) * UINT8_C(0x13)));
-  uint64_t x44 = ((uint64_t)(arg1[2]) * ((arg2[8]) * UINT8_C(0x13)));
-  uint64_t x45 = ((uint64_t)(arg1[1]) * ((arg2[9]) * UINT8_C(0x26)));
-  uint64_t x46 = ((uint64_t)(arg1[9]) * (arg2[0]));
-  uint64_t x47 = ((uint64_t)(arg1[8]) * (arg2[1]));
-  uint64_t x48 = ((uint64_t)(arg1[8]) * (arg2[0]));
-  uint64_t x49 = ((uint64_t)(arg1[7]) * (arg2[2]));
-  uint64_t x50 = ((uint64_t)(arg1[7]) * ((arg2[1]) * 0x2));
-  uint64_t x51 = ((uint64_t)(arg1[7]) * (arg2[0]));
-  uint64_t x52 = ((uint64_t)(arg1[6]) * (arg2[3]));
-  uint64_t x53 = ((uint64_t)(arg1[6]) * (arg2[2]));
-  uint64_t x54 = ((uint64_t)(arg1[6]) * (arg2[1]));
-  uint64_t x55 = ((uint64_t)(arg1[6]) * (arg2[0]));
-  uint64_t x56 = ((uint64_t)(arg1[5]) * (arg2[4]));
-  uint64_t x57 = ((uint64_t)(arg1[5]) * ((arg2[3]) * 0x2));
-  uint64_t x58 = ((uint64_t)(arg1[5]) * (arg2[2]));
-  uint64_t x59 = ((uint64_t)(arg1[5]) * ((arg2[1]) * 0x2));
-  uint64_t x60 = ((uint64_t)(arg1[5]) * (arg2[0]));
-  uint64_t x61 = ((uint64_t)(arg1[4]) * (arg2[5]));
-  uint64_t x62 = ((uint64_t)(arg1[4]) * (arg2[4]));
-  uint64_t x63 = ((uint64_t)(arg1[4]) * (arg2[3]));
-  uint64_t x64 = ((uint64_t)(arg1[4]) * (arg2[2]));
-  uint64_t x65 = ((uint64_t)(arg1[4]) * (arg2[1]));
-  uint64_t x66 = ((uint64_t)(arg1[4]) * (arg2[0]));
-  uint64_t x67 = ((uint64_t)(arg1[3]) * (arg2[6]));
-  uint64_t x68 = ((uint64_t)(arg1[3]) * ((arg2[5]) * 0x2));
-  uint64_t x69 = ((uint64_t)(arg1[3]) * (arg2[4]));
-  uint64_t x70 = ((uint64_t)(arg1[3]) * ((arg2[3]) * 0x2));
-  uint64_t x71 = ((uint64_t)(arg1[3]) * (arg2[2]));
-  uint64_t x72 = ((uint64_t)(arg1[3]) * ((arg2[1]) * 0x2));
-  uint64_t x73 = ((uint64_t)(arg1[3]) * (arg2[0]));
-  uint64_t x74 = ((uint64_t)(arg1[2]) * (arg2[7]));
-  uint64_t x75 = ((uint64_t)(arg1[2]) * (arg2[6]));
-  uint64_t x76 = ((uint64_t)(arg1[2]) * (arg2[5]));
-  uint64_t x77 = ((uint64_t)(arg1[2]) * (arg2[4]));
-  uint64_t x78 = ((uint64_t)(arg1[2]) * (arg2[3]));
-  uint64_t x79 = ((uint64_t)(arg1[2]) * (arg2[2]));
-  uint64_t x80 = ((uint64_t)(arg1[2]) * (arg2[1]));
-  uint64_t x81 = ((uint64_t)(arg1[2]) * (arg2[0]));
-  uint64_t x82 = ((uint64_t)(arg1[1]) * (arg2[8]));
-  uint64_t x83 = ((uint64_t)(arg1[1]) * ((arg2[7]) * 0x2));
-  uint64_t x84 = ((uint64_t)(arg1[1]) * (arg2[6]));
-  uint64_t x85 = ((uint64_t)(arg1[1]) * ((arg2[5]) * 0x2));
-  uint64_t x86 = ((uint64_t)(arg1[1]) * (arg2[4]));
-  uint64_t x87 = ((uint64_t)(arg1[1]) * ((arg2[3]) * 0x2));
-  uint64_t x88 = ((uint64_t)(arg1[1]) * (arg2[2]));
-  uint64_t x89 = ((uint64_t)(arg1[1]) * ((arg2[1]) * 0x2));
-  uint64_t x90 = ((uint64_t)(arg1[1]) * (arg2[0]));
-  uint64_t x91 = ((uint64_t)(arg1[0]) * (arg2[9]));
-  uint64_t x92 = ((uint64_t)(arg1[0]) * (arg2[8]));
-  uint64_t x93 = ((uint64_t)(arg1[0]) * (arg2[7]));
-  uint64_t x94 = ((uint64_t)(arg1[0]) * (arg2[6]));
-  uint64_t x95 = ((uint64_t)(arg1[0]) * (arg2[5]));
-  uint64_t x96 = ((uint64_t)(arg1[0]) * (arg2[4]));
-  uint64_t x97 = ((uint64_t)(arg1[0]) * (arg2[3]));
-  uint64_t x98 = ((uint64_t)(arg1[0]) * (arg2[2]));
-  uint64_t x99 = ((uint64_t)(arg1[0]) * (arg2[1]));
-  uint64_t x100 = ((uint64_t)(arg1[0]) * (arg2[0]));
-  uint64_t x101 = (x100 + (x45 + (x44 + (x42 + (x39 + (x35 + (x30 + (x24 + (x17 + x9)))))))));
-  uint64_t x102 = (x101 >> 26);
-  uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff));
-  uint64_t x104 = (x91 + (x82 + (x74 + (x67 + (x61 + (x56 + (x52 + (x49 + (x47 + x46)))))))));
-  uint64_t x105 = (x92 + (x83 + (x75 + (x68 + (x62 + (x57 + (x53 + (x50 + (x48 + x1)))))))));
-  uint64_t x106 = (x93 + (x84 + (x76 + (x69 + (x63 + (x58 + (x54 + (x51 + (x10 + x2)))))))));
-  uint64_t x107 = (x94 + (x85 + (x77 + (x70 + (x64 + (x59 + (x55 + (x18 + (x11 + x3)))))))));
-  uint64_t x108 = (x95 + (x86 + (x78 + (x71 + (x65 + (x60 + (x25 + (x19 + (x12 + x4)))))))));
-  uint64_t x109 = (x96 + (x87 + (x79 + (x72 + (x66 + (x31 + (x26 + (x20 + (x13 + x5)))))))));
-  uint64_t x110 = (x97 + (x88 + (x80 + (x73 + (x36 + (x32 + (x27 + (x21 + (x14 + x6)))))))));
-  uint64_t x111 = (x98 + (x89 + (x81 + (x40 + (x37 + (x33 + (x28 + (x22 + (x15 + x7)))))))));
-  uint64_t x112 = (x99 + (x90 + (x43 + (x41 + (x38 + (x34 + (x29 + (x23 + (x16 + x8)))))))));
-  uint64_t x113 = (x102 + x112);
-  uint64_t x114 = (x113 >> 25);
-  uint32_t x115 = (uint32_t)(x113 & UINT32_C(0x1ffffff));
-  uint64_t x116 = (x114 + x111);
-  uint64_t x117 = (x116 >> 26);
-  uint32_t x118 = (uint32_t)(x116 & UINT32_C(0x3ffffff));
-  uint64_t x119 = (x117 + x110);
-  uint64_t x120 = (x119 >> 25);
-  uint32_t x121 = (uint32_t)(x119 & UINT32_C(0x1ffffff));
-  uint64_t x122 = (x120 + x109);
-  uint64_t x123 = (x122 >> 26);
-  uint32_t x124 = (uint32_t)(x122 & UINT32_C(0x3ffffff));
-  uint64_t x125 = (x123 + x108);
-  uint64_t x126 = (x125 >> 25);
-  uint32_t x127 = (uint32_t)(x125 & UINT32_C(0x1ffffff));
-  uint64_t x128 = (x126 + x107);
-  uint64_t x129 = (x128 >> 26);
-  uint32_t x130 = (uint32_t)(x128 & UINT32_C(0x3ffffff));
-  uint64_t x131 = (x129 + x106);
-  uint64_t x132 = (x131 >> 25);
-  uint32_t x133 = (uint32_t)(x131 & UINT32_C(0x1ffffff));
-  uint64_t x134 = (x132 + x105);
-  uint64_t x135 = (x134 >> 26);
-  uint32_t x136 = (uint32_t)(x134 & UINT32_C(0x3ffffff));
-  uint64_t x137 = (x135 + x104);
-  uint64_t x138 = (x137 >> 25);
-  uint32_t x139 = (uint32_t)(x137 & UINT32_C(0x1ffffff));
-  uint64_t x140 = (x138 * UINT8_C(0x13));
-  uint64_t x141 = (x103 + x140);
-  uint32_t x142 = (uint32_t)(x141 >> 26);
-  uint32_t x143 = (uint32_t)(x141 & UINT32_C(0x3ffffff));
-  uint32_t x144 = (x142 + x115);
-  fiat_25519_uint1 x145 = (fiat_25519_uint1)(x144 >> 25);
-  uint32_t x146 = (x144 & UINT32_C(0x1ffffff));
-  uint32_t x147 = (x145 + x118);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_mul(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1, const fiat_25519_loose_field_element arg2) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  uint64_t x13;
+  uint64_t x14;
+  uint64_t x15;
+  uint64_t x16;
+  uint64_t x17;
+  uint64_t x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  uint64_t x26;
+  uint64_t x27;
+  uint64_t x28;
+  uint64_t x29;
+  uint64_t x30;
+  uint64_t x31;
+  uint64_t x32;
+  uint64_t x33;
+  uint64_t x34;
+  uint64_t x35;
+  uint64_t x36;
+  uint64_t x37;
+  uint64_t x38;
+  uint64_t x39;
+  uint64_t x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  uint64_t x48;
+  uint64_t x49;
+  uint64_t x50;
+  uint64_t x51;
+  uint64_t x52;
+  uint64_t x53;
+  uint64_t x54;
+  uint64_t x55;
+  uint64_t x56;
+  uint64_t x57;
+  uint64_t x58;
+  uint64_t x59;
+  uint64_t x60;
+  uint64_t x61;
+  uint64_t x62;
+  uint64_t x63;
+  uint64_t x64;
+  uint64_t x65;
+  uint64_t x66;
+  uint64_t x67;
+  uint64_t x68;
+  uint64_t x69;
+  uint64_t x70;
+  uint64_t x71;
+  uint64_t x72;
+  uint64_t x73;
+  uint64_t x74;
+  uint64_t x75;
+  uint64_t x76;
+  uint64_t x77;
+  uint64_t x78;
+  uint64_t x79;
+  uint64_t x80;
+  uint64_t x81;
+  uint64_t x82;
+  uint64_t x83;
+  uint64_t x84;
+  uint64_t x85;
+  uint64_t x86;
+  uint64_t x87;
+  uint64_t x88;
+  uint64_t x89;
+  uint64_t x90;
+  uint64_t x91;
+  uint64_t x92;
+  uint64_t x93;
+  uint64_t x94;
+  uint64_t x95;
+  uint64_t x96;
+  uint64_t x97;
+  uint64_t x98;
+  uint64_t x99;
+  uint64_t x100;
+  uint64_t x101;
+  uint64_t x102;
+  uint32_t x103;
+  uint64_t x104;
+  uint64_t x105;
+  uint64_t x106;
+  uint64_t x107;
+  uint64_t x108;
+  uint64_t x109;
+  uint64_t x110;
+  uint64_t x111;
+  uint64_t x112;
+  uint64_t x113;
+  uint64_t x114;
+  uint32_t x115;
+  uint64_t x116;
+  uint64_t x117;
+  uint32_t x118;
+  uint64_t x119;
+  uint64_t x120;
+  uint32_t x121;
+  uint64_t x122;
+  uint64_t x123;
+  uint32_t x124;
+  uint64_t x125;
+  uint64_t x126;
+  uint32_t x127;
+  uint64_t x128;
+  uint64_t x129;
+  uint32_t x130;
+  uint64_t x131;
+  uint64_t x132;
+  uint32_t x133;
+  uint64_t x134;
+  uint64_t x135;
+  uint32_t x136;
+  uint64_t x137;
+  uint64_t x138;
+  uint32_t x139;
+  uint64_t x140;
+  uint64_t x141;
+  uint32_t x142;
+  uint32_t x143;
+  uint32_t x144;
+  fiat_25519_uint1 x145;
+  uint32_t x146;
+  uint32_t x147;
+  x1 = ((uint64_t)(arg1[9]) * ((arg2[9]) * UINT8_C(0x26)));
+  x2 = ((uint64_t)(arg1[9]) * ((arg2[8]) * UINT8_C(0x13)));
+  x3 = ((uint64_t)(arg1[9]) * ((arg2[7]) * UINT8_C(0x26)));
+  x4 = ((uint64_t)(arg1[9]) * ((arg2[6]) * UINT8_C(0x13)));
+  x5 = ((uint64_t)(arg1[9]) * ((arg2[5]) * UINT8_C(0x26)));
+  x6 = ((uint64_t)(arg1[9]) * ((arg2[4]) * UINT8_C(0x13)));
+  x7 = ((uint64_t)(arg1[9]) * ((arg2[3]) * UINT8_C(0x26)));
+  x8 = ((uint64_t)(arg1[9]) * ((arg2[2]) * UINT8_C(0x13)));
+  x9 = ((uint64_t)(arg1[9]) * ((arg2[1]) * UINT8_C(0x26)));
+  x10 = ((uint64_t)(arg1[8]) * ((arg2[9]) * UINT8_C(0x13)));
+  x11 = ((uint64_t)(arg1[8]) * ((arg2[8]) * UINT8_C(0x13)));
+  x12 = ((uint64_t)(arg1[8]) * ((arg2[7]) * UINT8_C(0x13)));
+  x13 = ((uint64_t)(arg1[8]) * ((arg2[6]) * UINT8_C(0x13)));
+  x14 = ((uint64_t)(arg1[8]) * ((arg2[5]) * UINT8_C(0x13)));
+  x15 = ((uint64_t)(arg1[8]) * ((arg2[4]) * UINT8_C(0x13)));
+  x16 = ((uint64_t)(arg1[8]) * ((arg2[3]) * UINT8_C(0x13)));
+  x17 = ((uint64_t)(arg1[8]) * ((arg2[2]) * UINT8_C(0x13)));
+  x18 = ((uint64_t)(arg1[7]) * ((arg2[9]) * UINT8_C(0x26)));
+  x19 = ((uint64_t)(arg1[7]) * ((arg2[8]) * UINT8_C(0x13)));
+  x20 = ((uint64_t)(arg1[7]) * ((arg2[7]) * UINT8_C(0x26)));
+  x21 = ((uint64_t)(arg1[7]) * ((arg2[6]) * UINT8_C(0x13)));
+  x22 = ((uint64_t)(arg1[7]) * ((arg2[5]) * UINT8_C(0x26)));
+  x23 = ((uint64_t)(arg1[7]) * ((arg2[4]) * UINT8_C(0x13)));
+  x24 = ((uint64_t)(arg1[7]) * ((arg2[3]) * UINT8_C(0x26)));
+  x25 = ((uint64_t)(arg1[6]) * ((arg2[9]) * UINT8_C(0x13)));
+  x26 = ((uint64_t)(arg1[6]) * ((arg2[8]) * UINT8_C(0x13)));
+  x27 = ((uint64_t)(arg1[6]) * ((arg2[7]) * UINT8_C(0x13)));
+  x28 = ((uint64_t)(arg1[6]) * ((arg2[6]) * UINT8_C(0x13)));
+  x29 = ((uint64_t)(arg1[6]) * ((arg2[5]) * UINT8_C(0x13)));
+  x30 = ((uint64_t)(arg1[6]) * ((arg2[4]) * UINT8_C(0x13)));
+  x31 = ((uint64_t)(arg1[5]) * ((arg2[9]) * UINT8_C(0x26)));
+  x32 = ((uint64_t)(arg1[5]) * ((arg2[8]) * UINT8_C(0x13)));
+  x33 = ((uint64_t)(arg1[5]) * ((arg2[7]) * UINT8_C(0x26)));
+  x34 = ((uint64_t)(arg1[5]) * ((arg2[6]) * UINT8_C(0x13)));
+  x35 = ((uint64_t)(arg1[5]) * ((arg2[5]) * UINT8_C(0x26)));
+  x36 = ((uint64_t)(arg1[4]) * ((arg2[9]) * UINT8_C(0x13)));
+  x37 = ((uint64_t)(arg1[4]) * ((arg2[8]) * UINT8_C(0x13)));
+  x38 = ((uint64_t)(arg1[4]) * ((arg2[7]) * UINT8_C(0x13)));
+  x39 = ((uint64_t)(arg1[4]) * ((arg2[6]) * UINT8_C(0x13)));
+  x40 = ((uint64_t)(arg1[3]) * ((arg2[9]) * UINT8_C(0x26)));
+  x41 = ((uint64_t)(arg1[3]) * ((arg2[8]) * UINT8_C(0x13)));
+  x42 = ((uint64_t)(arg1[3]) * ((arg2[7]) * UINT8_C(0x26)));
+  x43 = ((uint64_t)(arg1[2]) * ((arg2[9]) * UINT8_C(0x13)));
+  x44 = ((uint64_t)(arg1[2]) * ((arg2[8]) * UINT8_C(0x13)));
+  x45 = ((uint64_t)(arg1[1]) * ((arg2[9]) * UINT8_C(0x26)));
+  x46 = ((uint64_t)(arg1[9]) * (arg2[0]));
+  x47 = ((uint64_t)(arg1[8]) * (arg2[1]));
+  x48 = ((uint64_t)(arg1[8]) * (arg2[0]));
+  x49 = ((uint64_t)(arg1[7]) * (arg2[2]));
+  x50 = ((uint64_t)(arg1[7]) * ((arg2[1]) * 0x2));
+  x51 = ((uint64_t)(arg1[7]) * (arg2[0]));
+  x52 = ((uint64_t)(arg1[6]) * (arg2[3]));
+  x53 = ((uint64_t)(arg1[6]) * (arg2[2]));
+  x54 = ((uint64_t)(arg1[6]) * (arg2[1]));
+  x55 = ((uint64_t)(arg1[6]) * (arg2[0]));
+  x56 = ((uint64_t)(arg1[5]) * (arg2[4]));
+  x57 = ((uint64_t)(arg1[5]) * ((arg2[3]) * 0x2));
+  x58 = ((uint64_t)(arg1[5]) * (arg2[2]));
+  x59 = ((uint64_t)(arg1[5]) * ((arg2[1]) * 0x2));
+  x60 = ((uint64_t)(arg1[5]) * (arg2[0]));
+  x61 = ((uint64_t)(arg1[4]) * (arg2[5]));
+  x62 = ((uint64_t)(arg1[4]) * (arg2[4]));
+  x63 = ((uint64_t)(arg1[4]) * (arg2[3]));
+  x64 = ((uint64_t)(arg1[4]) * (arg2[2]));
+  x65 = ((uint64_t)(arg1[4]) * (arg2[1]));
+  x66 = ((uint64_t)(arg1[4]) * (arg2[0]));
+  x67 = ((uint64_t)(arg1[3]) * (arg2[6]));
+  x68 = ((uint64_t)(arg1[3]) * ((arg2[5]) * 0x2));
+  x69 = ((uint64_t)(arg1[3]) * (arg2[4]));
+  x70 = ((uint64_t)(arg1[3]) * ((arg2[3]) * 0x2));
+  x71 = ((uint64_t)(arg1[3]) * (arg2[2]));
+  x72 = ((uint64_t)(arg1[3]) * ((arg2[1]) * 0x2));
+  x73 = ((uint64_t)(arg1[3]) * (arg2[0]));
+  x74 = ((uint64_t)(arg1[2]) * (arg2[7]));
+  x75 = ((uint64_t)(arg1[2]) * (arg2[6]));
+  x76 = ((uint64_t)(arg1[2]) * (arg2[5]));
+  x77 = ((uint64_t)(arg1[2]) * (arg2[4]));
+  x78 = ((uint64_t)(arg1[2]) * (arg2[3]));
+  x79 = ((uint64_t)(arg1[2]) * (arg2[2]));
+  x80 = ((uint64_t)(arg1[2]) * (arg2[1]));
+  x81 = ((uint64_t)(arg1[2]) * (arg2[0]));
+  x82 = ((uint64_t)(arg1[1]) * (arg2[8]));
+  x83 = ((uint64_t)(arg1[1]) * ((arg2[7]) * 0x2));
+  x84 = ((uint64_t)(arg1[1]) * (arg2[6]));
+  x85 = ((uint64_t)(arg1[1]) * ((arg2[5]) * 0x2));
+  x86 = ((uint64_t)(arg1[1]) * (arg2[4]));
+  x87 = ((uint64_t)(arg1[1]) * ((arg2[3]) * 0x2));
+  x88 = ((uint64_t)(arg1[1]) * (arg2[2]));
+  x89 = ((uint64_t)(arg1[1]) * ((arg2[1]) * 0x2));
+  x90 = ((uint64_t)(arg1[1]) * (arg2[0]));
+  x91 = ((uint64_t)(arg1[0]) * (arg2[9]));
+  x92 = ((uint64_t)(arg1[0]) * (arg2[8]));
+  x93 = ((uint64_t)(arg1[0]) * (arg2[7]));
+  x94 = ((uint64_t)(arg1[0]) * (arg2[6]));
+  x95 = ((uint64_t)(arg1[0]) * (arg2[5]));
+  x96 = ((uint64_t)(arg1[0]) * (arg2[4]));
+  x97 = ((uint64_t)(arg1[0]) * (arg2[3]));
+  x98 = ((uint64_t)(arg1[0]) * (arg2[2]));
+  x99 = ((uint64_t)(arg1[0]) * (arg2[1]));
+  x100 = ((uint64_t)(arg1[0]) * (arg2[0]));
+  x101 = (x100 + (x45 + (x44 + (x42 + (x39 + (x35 + (x30 + (x24 + (x17 + x9)))))))));
+  x102 = (x101 >> 26);
+  x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff));
+  x104 = (x91 + (x82 + (x74 + (x67 + (x61 + (x56 + (x52 + (x49 + (x47 + x46)))))))));
+  x105 = (x92 + (x83 + (x75 + (x68 + (x62 + (x57 + (x53 + (x50 + (x48 + x1)))))))));
+  x106 = (x93 + (x84 + (x76 + (x69 + (x63 + (x58 + (x54 + (x51 + (x10 + x2)))))))));
+  x107 = (x94 + (x85 + (x77 + (x70 + (x64 + (x59 + (x55 + (x18 + (x11 + x3)))))))));
+  x108 = (x95 + (x86 + (x78 + (x71 + (x65 + (x60 + (x25 + (x19 + (x12 + x4)))))))));
+  x109 = (x96 + (x87 + (x79 + (x72 + (x66 + (x31 + (x26 + (x20 + (x13 + x5)))))))));
+  x110 = (x97 + (x88 + (x80 + (x73 + (x36 + (x32 + (x27 + (x21 + (x14 + x6)))))))));
+  x111 = (x98 + (x89 + (x81 + (x40 + (x37 + (x33 + (x28 + (x22 + (x15 + x7)))))))));
+  x112 = (x99 + (x90 + (x43 + (x41 + (x38 + (x34 + (x29 + (x23 + (x16 + x8)))))))));
+  x113 = (x102 + x112);
+  x114 = (x113 >> 25);
+  x115 = (uint32_t)(x113 & UINT32_C(0x1ffffff));
+  x116 = (x114 + x111);
+  x117 = (x116 >> 26);
+  x118 = (uint32_t)(x116 & UINT32_C(0x3ffffff));
+  x119 = (x117 + x110);
+  x120 = (x119 >> 25);
+  x121 = (uint32_t)(x119 & UINT32_C(0x1ffffff));
+  x122 = (x120 + x109);
+  x123 = (x122 >> 26);
+  x124 = (uint32_t)(x122 & UINT32_C(0x3ffffff));
+  x125 = (x123 + x108);
+  x126 = (x125 >> 25);
+  x127 = (uint32_t)(x125 & UINT32_C(0x1ffffff));
+  x128 = (x126 + x107);
+  x129 = (x128 >> 26);
+  x130 = (uint32_t)(x128 & UINT32_C(0x3ffffff));
+  x131 = (x129 + x106);
+  x132 = (x131 >> 25);
+  x133 = (uint32_t)(x131 & UINT32_C(0x1ffffff));
+  x134 = (x132 + x105);
+  x135 = (x134 >> 26);
+  x136 = (uint32_t)(x134 & UINT32_C(0x3ffffff));
+  x137 = (x135 + x104);
+  x138 = (x137 >> 25);
+  x139 = (uint32_t)(x137 & UINT32_C(0x1ffffff));
+  x140 = (x138 * UINT8_C(0x13));
+  x141 = (x103 + x140);
+  x142 = (uint32_t)(x141 >> 26);
+  x143 = (uint32_t)(x141 & UINT32_C(0x3ffffff));
+  x144 = (x142 + x115);
+  x145 = (fiat_25519_uint1)(x144 >> 25);
+  x146 = (x144 & UINT32_C(0x1ffffff));
+  x147 = (x145 + x118);
   out1[0] = x143;
   out1[1] = x146;
   out1[2] = x147;
@@ -303,135 +486,252 @@
 
 /*
  * The function fiat_25519_carry_square squares a field element and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * eval arg1) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  */
-static void fiat_25519_carry_square(uint32_t out1[10], const uint32_t arg1[10]) {
-  uint32_t x1 = ((arg1[9]) * UINT8_C(0x13));
-  uint32_t x2 = (x1 * 0x2);
-  uint32_t x3 = ((arg1[9]) * 0x2);
-  uint32_t x4 = ((arg1[8]) * UINT8_C(0x13));
-  uint64_t x5 = ((uint64_t)x4 * 0x2);
-  uint32_t x6 = ((arg1[8]) * 0x2);
-  uint32_t x7 = ((arg1[7]) * UINT8_C(0x13));
-  uint32_t x8 = (x7 * 0x2);
-  uint32_t x9 = ((arg1[7]) * 0x2);
-  uint32_t x10 = ((arg1[6]) * UINT8_C(0x13));
-  uint64_t x11 = ((uint64_t)x10 * 0x2);
-  uint32_t x12 = ((arg1[6]) * 0x2);
-  uint32_t x13 = ((arg1[5]) * UINT8_C(0x13));
-  uint32_t x14 = ((arg1[5]) * 0x2);
-  uint32_t x15 = ((arg1[4]) * 0x2);
-  uint32_t x16 = ((arg1[3]) * 0x2);
-  uint32_t x17 = ((arg1[2]) * 0x2);
-  uint32_t x18 = ((arg1[1]) * 0x2);
-  uint64_t x19 = ((uint64_t)(arg1[9]) * (x1 * 0x2));
-  uint64_t x20 = ((uint64_t)(arg1[8]) * x2);
-  uint64_t x21 = ((uint64_t)(arg1[8]) * x4);
-  uint64_t x22 = ((arg1[7]) * ((uint64_t)x2 * 0x2));
-  uint64_t x23 = ((arg1[7]) * x5);
-  uint64_t x24 = ((uint64_t)(arg1[7]) * (x7 * 0x2));
-  uint64_t x25 = ((uint64_t)(arg1[6]) * x2);
-  uint64_t x26 = ((arg1[6]) * x5);
-  uint64_t x27 = ((uint64_t)(arg1[6]) * x8);
-  uint64_t x28 = ((uint64_t)(arg1[6]) * x10);
-  uint64_t x29 = ((arg1[5]) * ((uint64_t)x2 * 0x2));
-  uint64_t x30 = ((arg1[5]) * x5);
-  uint64_t x31 = ((arg1[5]) * ((uint64_t)x8 * 0x2));
-  uint64_t x32 = ((arg1[5]) * x11);
-  uint64_t x33 = ((uint64_t)(arg1[5]) * (x13 * 0x2));
-  uint64_t x34 = ((uint64_t)(arg1[4]) * x2);
-  uint64_t x35 = ((arg1[4]) * x5);
-  uint64_t x36 = ((uint64_t)(arg1[4]) * x8);
-  uint64_t x37 = ((arg1[4]) * x11);
-  uint64_t x38 = ((uint64_t)(arg1[4]) * x14);
-  uint64_t x39 = ((uint64_t)(arg1[4]) * (arg1[4]));
-  uint64_t x40 = ((arg1[3]) * ((uint64_t)x2 * 0x2));
-  uint64_t x41 = ((arg1[3]) * x5);
-  uint64_t x42 = ((arg1[3]) * ((uint64_t)x8 * 0x2));
-  uint64_t x43 = ((uint64_t)(arg1[3]) * x12);
-  uint64_t x44 = ((uint64_t)(arg1[3]) * (x14 * 0x2));
-  uint64_t x45 = ((uint64_t)(arg1[3]) * x15);
-  uint64_t x46 = ((uint64_t)(arg1[3]) * ((arg1[3]) * 0x2));
-  uint64_t x47 = ((uint64_t)(arg1[2]) * x2);
-  uint64_t x48 = ((arg1[2]) * x5);
-  uint64_t x49 = ((uint64_t)(arg1[2]) * x9);
-  uint64_t x50 = ((uint64_t)(arg1[2]) * x12);
-  uint64_t x51 = ((uint64_t)(arg1[2]) * x14);
-  uint64_t x52 = ((uint64_t)(arg1[2]) * x15);
-  uint64_t x53 = ((uint64_t)(arg1[2]) * x16);
-  uint64_t x54 = ((uint64_t)(arg1[2]) * (arg1[2]));
-  uint64_t x55 = ((arg1[1]) * ((uint64_t)x2 * 0x2));
-  uint64_t x56 = ((uint64_t)(arg1[1]) * x6);
-  uint64_t x57 = ((uint64_t)(arg1[1]) * (x9 * 0x2));
-  uint64_t x58 = ((uint64_t)(arg1[1]) * x12);
-  uint64_t x59 = ((uint64_t)(arg1[1]) * (x14 * 0x2));
-  uint64_t x60 = ((uint64_t)(arg1[1]) * x15);
-  uint64_t x61 = ((uint64_t)(arg1[1]) * (x16 * 0x2));
-  uint64_t x62 = ((uint64_t)(arg1[1]) * x17);
-  uint64_t x63 = ((uint64_t)(arg1[1]) * ((arg1[1]) * 0x2));
-  uint64_t x64 = ((uint64_t)(arg1[0]) * x3);
-  uint64_t x65 = ((uint64_t)(arg1[0]) * x6);
-  uint64_t x66 = ((uint64_t)(arg1[0]) * x9);
-  uint64_t x67 = ((uint64_t)(arg1[0]) * x12);
-  uint64_t x68 = ((uint64_t)(arg1[0]) * x14);
-  uint64_t x69 = ((uint64_t)(arg1[0]) * x15);
-  uint64_t x70 = ((uint64_t)(arg1[0]) * x16);
-  uint64_t x71 = ((uint64_t)(arg1[0]) * x17);
-  uint64_t x72 = ((uint64_t)(arg1[0]) * x18);
-  uint64_t x73 = ((uint64_t)(arg1[0]) * (arg1[0]));
-  uint64_t x74 = (x73 + (x55 + (x48 + (x42 + (x37 + x33)))));
-  uint64_t x75 = (x74 >> 26);
-  uint32_t x76 = (uint32_t)(x74 & UINT32_C(0x3ffffff));
-  uint64_t x77 = (x64 + (x56 + (x49 + (x43 + x38))));
-  uint64_t x78 = (x65 + (x57 + (x50 + (x44 + (x39 + x19)))));
-  uint64_t x79 = (x66 + (x58 + (x51 + (x45 + x20))));
-  uint64_t x80 = (x67 + (x59 + (x52 + (x46 + (x22 + x21)))));
-  uint64_t x81 = (x68 + (x60 + (x53 + (x25 + x23))));
-  uint64_t x82 = (x69 + (x61 + (x54 + (x29 + (x26 + x24)))));
-  uint64_t x83 = (x70 + (x62 + (x34 + (x30 + x27))));
-  uint64_t x84 = (x71 + (x63 + (x40 + (x35 + (x31 + x28)))));
-  uint64_t x85 = (x72 + (x47 + (x41 + (x36 + x32))));
-  uint64_t x86 = (x75 + x85);
-  uint64_t x87 = (x86 >> 25);
-  uint32_t x88 = (uint32_t)(x86 & UINT32_C(0x1ffffff));
-  uint64_t x89 = (x87 + x84);
-  uint64_t x90 = (x89 >> 26);
-  uint32_t x91 = (uint32_t)(x89 & UINT32_C(0x3ffffff));
-  uint64_t x92 = (x90 + x83);
-  uint64_t x93 = (x92 >> 25);
-  uint32_t x94 = (uint32_t)(x92 & UINT32_C(0x1ffffff));
-  uint64_t x95 = (x93 + x82);
-  uint64_t x96 = (x95 >> 26);
-  uint32_t x97 = (uint32_t)(x95 & UINT32_C(0x3ffffff));
-  uint64_t x98 = (x96 + x81);
-  uint64_t x99 = (x98 >> 25);
-  uint32_t x100 = (uint32_t)(x98 & UINT32_C(0x1ffffff));
-  uint64_t x101 = (x99 + x80);
-  uint64_t x102 = (x101 >> 26);
-  uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff));
-  uint64_t x104 = (x102 + x79);
-  uint64_t x105 = (x104 >> 25);
-  uint32_t x106 = (uint32_t)(x104 & UINT32_C(0x1ffffff));
-  uint64_t x107 = (x105 + x78);
-  uint64_t x108 = (x107 >> 26);
-  uint32_t x109 = (uint32_t)(x107 & UINT32_C(0x3ffffff));
-  uint64_t x110 = (x108 + x77);
-  uint64_t x111 = (x110 >> 25);
-  uint32_t x112 = (uint32_t)(x110 & UINT32_C(0x1ffffff));
-  uint64_t x113 = (x111 * UINT8_C(0x13));
-  uint64_t x114 = (x76 + x113);
-  uint32_t x115 = (uint32_t)(x114 >> 26);
-  uint32_t x116 = (uint32_t)(x114 & UINT32_C(0x3ffffff));
-  uint32_t x117 = (x115 + x88);
-  fiat_25519_uint1 x118 = (fiat_25519_uint1)(x117 >> 25);
-  uint32_t x119 = (x117 & UINT32_C(0x1ffffff));
-  uint32_t x120 = (x118 + x91);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_square(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint64_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint64_t x11;
+  uint32_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint32_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  uint64_t x26;
+  uint64_t x27;
+  uint64_t x28;
+  uint64_t x29;
+  uint64_t x30;
+  uint64_t x31;
+  uint64_t x32;
+  uint64_t x33;
+  uint64_t x34;
+  uint64_t x35;
+  uint64_t x36;
+  uint64_t x37;
+  uint64_t x38;
+  uint64_t x39;
+  uint64_t x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  uint64_t x48;
+  uint64_t x49;
+  uint64_t x50;
+  uint64_t x51;
+  uint64_t x52;
+  uint64_t x53;
+  uint64_t x54;
+  uint64_t x55;
+  uint64_t x56;
+  uint64_t x57;
+  uint64_t x58;
+  uint64_t x59;
+  uint64_t x60;
+  uint64_t x61;
+  uint64_t x62;
+  uint64_t x63;
+  uint64_t x64;
+  uint64_t x65;
+  uint64_t x66;
+  uint64_t x67;
+  uint64_t x68;
+  uint64_t x69;
+  uint64_t x70;
+  uint64_t x71;
+  uint64_t x72;
+  uint64_t x73;
+  uint64_t x74;
+  uint64_t x75;
+  uint32_t x76;
+  uint64_t x77;
+  uint64_t x78;
+  uint64_t x79;
+  uint64_t x80;
+  uint64_t x81;
+  uint64_t x82;
+  uint64_t x83;
+  uint64_t x84;
+  uint64_t x85;
+  uint64_t x86;
+  uint64_t x87;
+  uint32_t x88;
+  uint64_t x89;
+  uint64_t x90;
+  uint32_t x91;
+  uint64_t x92;
+  uint64_t x93;
+  uint32_t x94;
+  uint64_t x95;
+  uint64_t x96;
+  uint32_t x97;
+  uint64_t x98;
+  uint64_t x99;
+  uint32_t x100;
+  uint64_t x101;
+  uint64_t x102;
+  uint32_t x103;
+  uint64_t x104;
+  uint64_t x105;
+  uint32_t x106;
+  uint64_t x107;
+  uint64_t x108;
+  uint32_t x109;
+  uint64_t x110;
+  uint64_t x111;
+  uint32_t x112;
+  uint64_t x113;
+  uint64_t x114;
+  uint32_t x115;
+  uint32_t x116;
+  uint32_t x117;
+  fiat_25519_uint1 x118;
+  uint32_t x119;
+  uint32_t x120;
+  x1 = ((arg1[9]) * UINT8_C(0x13));
+  x2 = (x1 * 0x2);
+  x3 = ((arg1[9]) * 0x2);
+  x4 = ((arg1[8]) * UINT8_C(0x13));
+  x5 = ((uint64_t)x4 * 0x2);
+  x6 = ((arg1[8]) * 0x2);
+  x7 = ((arg1[7]) * UINT8_C(0x13));
+  x8 = (x7 * 0x2);
+  x9 = ((arg1[7]) * 0x2);
+  x10 = ((arg1[6]) * UINT8_C(0x13));
+  x11 = ((uint64_t)x10 * 0x2);
+  x12 = ((arg1[6]) * 0x2);
+  x13 = ((arg1[5]) * UINT8_C(0x13));
+  x14 = ((arg1[5]) * 0x2);
+  x15 = ((arg1[4]) * 0x2);
+  x16 = ((arg1[3]) * 0x2);
+  x17 = ((arg1[2]) * 0x2);
+  x18 = ((arg1[1]) * 0x2);
+  x19 = ((uint64_t)(arg1[9]) * (x1 * 0x2));
+  x20 = ((uint64_t)(arg1[8]) * x2);
+  x21 = ((uint64_t)(arg1[8]) * x4);
+  x22 = ((arg1[7]) * ((uint64_t)x2 * 0x2));
+  x23 = ((arg1[7]) * x5);
+  x24 = ((uint64_t)(arg1[7]) * (x7 * 0x2));
+  x25 = ((uint64_t)(arg1[6]) * x2);
+  x26 = ((arg1[6]) * x5);
+  x27 = ((uint64_t)(arg1[6]) * x8);
+  x28 = ((uint64_t)(arg1[6]) * x10);
+  x29 = ((arg1[5]) * ((uint64_t)x2 * 0x2));
+  x30 = ((arg1[5]) * x5);
+  x31 = ((arg1[5]) * ((uint64_t)x8 * 0x2));
+  x32 = ((arg1[5]) * x11);
+  x33 = ((uint64_t)(arg1[5]) * (x13 * 0x2));
+  x34 = ((uint64_t)(arg1[4]) * x2);
+  x35 = ((arg1[4]) * x5);
+  x36 = ((uint64_t)(arg1[4]) * x8);
+  x37 = ((arg1[4]) * x11);
+  x38 = ((uint64_t)(arg1[4]) * x14);
+  x39 = ((uint64_t)(arg1[4]) * (arg1[4]));
+  x40 = ((arg1[3]) * ((uint64_t)x2 * 0x2));
+  x41 = ((arg1[3]) * x5);
+  x42 = ((arg1[3]) * ((uint64_t)x8 * 0x2));
+  x43 = ((uint64_t)(arg1[3]) * x12);
+  x44 = ((uint64_t)(arg1[3]) * (x14 * 0x2));
+  x45 = ((uint64_t)(arg1[3]) * x15);
+  x46 = ((uint64_t)(arg1[3]) * ((arg1[3]) * 0x2));
+  x47 = ((uint64_t)(arg1[2]) * x2);
+  x48 = ((arg1[2]) * x5);
+  x49 = ((uint64_t)(arg1[2]) * x9);
+  x50 = ((uint64_t)(arg1[2]) * x12);
+  x51 = ((uint64_t)(arg1[2]) * x14);
+  x52 = ((uint64_t)(arg1[2]) * x15);
+  x53 = ((uint64_t)(arg1[2]) * x16);
+  x54 = ((uint64_t)(arg1[2]) * (arg1[2]));
+  x55 = ((arg1[1]) * ((uint64_t)x2 * 0x2));
+  x56 = ((uint64_t)(arg1[1]) * x6);
+  x57 = ((uint64_t)(arg1[1]) * (x9 * 0x2));
+  x58 = ((uint64_t)(arg1[1]) * x12);
+  x59 = ((uint64_t)(arg1[1]) * (x14 * 0x2));
+  x60 = ((uint64_t)(arg1[1]) * x15);
+  x61 = ((uint64_t)(arg1[1]) * (x16 * 0x2));
+  x62 = ((uint64_t)(arg1[1]) * x17);
+  x63 = ((uint64_t)(arg1[1]) * ((arg1[1]) * 0x2));
+  x64 = ((uint64_t)(arg1[0]) * x3);
+  x65 = ((uint64_t)(arg1[0]) * x6);
+  x66 = ((uint64_t)(arg1[0]) * x9);
+  x67 = ((uint64_t)(arg1[0]) * x12);
+  x68 = ((uint64_t)(arg1[0]) * x14);
+  x69 = ((uint64_t)(arg1[0]) * x15);
+  x70 = ((uint64_t)(arg1[0]) * x16);
+  x71 = ((uint64_t)(arg1[0]) * x17);
+  x72 = ((uint64_t)(arg1[0]) * x18);
+  x73 = ((uint64_t)(arg1[0]) * (arg1[0]));
+  x74 = (x73 + (x55 + (x48 + (x42 + (x37 + x33)))));
+  x75 = (x74 >> 26);
+  x76 = (uint32_t)(x74 & UINT32_C(0x3ffffff));
+  x77 = (x64 + (x56 + (x49 + (x43 + x38))));
+  x78 = (x65 + (x57 + (x50 + (x44 + (x39 + x19)))));
+  x79 = (x66 + (x58 + (x51 + (x45 + x20))));
+  x80 = (x67 + (x59 + (x52 + (x46 + (x22 + x21)))));
+  x81 = (x68 + (x60 + (x53 + (x25 + x23))));
+  x82 = (x69 + (x61 + (x54 + (x29 + (x26 + x24)))));
+  x83 = (x70 + (x62 + (x34 + (x30 + x27))));
+  x84 = (x71 + (x63 + (x40 + (x35 + (x31 + x28)))));
+  x85 = (x72 + (x47 + (x41 + (x36 + x32))));
+  x86 = (x75 + x85);
+  x87 = (x86 >> 25);
+  x88 = (uint32_t)(x86 & UINT32_C(0x1ffffff));
+  x89 = (x87 + x84);
+  x90 = (x89 >> 26);
+  x91 = (uint32_t)(x89 & UINT32_C(0x3ffffff));
+  x92 = (x90 + x83);
+  x93 = (x92 >> 25);
+  x94 = (uint32_t)(x92 & UINT32_C(0x1ffffff));
+  x95 = (x93 + x82);
+  x96 = (x95 >> 26);
+  x97 = (uint32_t)(x95 & UINT32_C(0x3ffffff));
+  x98 = (x96 + x81);
+  x99 = (x98 >> 25);
+  x100 = (uint32_t)(x98 & UINT32_C(0x1ffffff));
+  x101 = (x99 + x80);
+  x102 = (x101 >> 26);
+  x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff));
+  x104 = (x102 + x79);
+  x105 = (x104 >> 25);
+  x106 = (uint32_t)(x104 & UINT32_C(0x1ffffff));
+  x107 = (x105 + x78);
+  x108 = (x107 >> 26);
+  x109 = (uint32_t)(x107 & UINT32_C(0x3ffffff));
+  x110 = (x108 + x77);
+  x111 = (x110 >> 25);
+  x112 = (uint32_t)(x110 & UINT32_C(0x1ffffff));
+  x113 = (x111 * UINT8_C(0x13));
+  x114 = (x76 + x113);
+  x115 = (uint32_t)(x114 >> 26);
+  x116 = (uint32_t)(x114 & UINT32_C(0x3ffffff));
+  x117 = (x115 + x88);
+  x118 = (fiat_25519_uint1)(x117 >> 25);
+  x119 = (x117 & UINT32_C(0x1ffffff));
+  x120 = (x118 + x91);
   out1[0] = x116;
   out1[1] = x119;
   out1[2] = x120;
@@ -446,37 +746,56 @@
 
 /*
  * The function fiat_25519_carry reduces a field element.
+ *
  * Postconditions:
  *   eval out1 mod m = eval arg1 mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  */
-static void fiat_25519_carry(uint32_t out1[10], const uint32_t arg1[10]) {
-  uint32_t x1 = (arg1[0]);
-  uint32_t x2 = ((x1 >> 26) + (arg1[1]));
-  uint32_t x3 = ((x2 >> 25) + (arg1[2]));
-  uint32_t x4 = ((x3 >> 26) + (arg1[3]));
-  uint32_t x5 = ((x4 >> 25) + (arg1[4]));
-  uint32_t x6 = ((x5 >> 26) + (arg1[5]));
-  uint32_t x7 = ((x6 >> 25) + (arg1[6]));
-  uint32_t x8 = ((x7 >> 26) + (arg1[7]));
-  uint32_t x9 = ((x8 >> 25) + (arg1[8]));
-  uint32_t x10 = ((x9 >> 26) + (arg1[9]));
-  uint32_t x11 = ((x1 & UINT32_C(0x3ffffff)) + ((x10 >> 25) * UINT8_C(0x13)));
-  uint32_t x12 = ((fiat_25519_uint1)(x11 >> 26) + (x2 & UINT32_C(0x1ffffff)));
-  uint32_t x13 = (x11 & UINT32_C(0x3ffffff));
-  uint32_t x14 = (x12 & UINT32_C(0x1ffffff));
-  uint32_t x15 = ((fiat_25519_uint1)(x12 >> 25) + (x3 & UINT32_C(0x3ffffff)));
-  uint32_t x16 = (x4 & UINT32_C(0x1ffffff));
-  uint32_t x17 = (x5 & UINT32_C(0x3ffffff));
-  uint32_t x18 = (x6 & UINT32_C(0x1ffffff));
-  uint32_t x19 = (x7 & UINT32_C(0x3ffffff));
-  uint32_t x20 = (x8 & UINT32_C(0x1ffffff));
-  uint32_t x21 = (x9 & UINT32_C(0x3ffffff));
-  uint32_t x22 = (x10 & UINT32_C(0x1ffffff));
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint32_t x11;
+  uint32_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint32_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint32_t x19;
+  uint32_t x20;
+  uint32_t x21;
+  uint32_t x22;
+  x1 = (arg1[0]);
+  x2 = ((x1 >> 26) + (arg1[1]));
+  x3 = ((x2 >> 25) + (arg1[2]));
+  x4 = ((x3 >> 26) + (arg1[3]));
+  x5 = ((x4 >> 25) + (arg1[4]));
+  x6 = ((x5 >> 26) + (arg1[5]));
+  x7 = ((x6 >> 25) + (arg1[6]));
+  x8 = ((x7 >> 26) + (arg1[7]));
+  x9 = ((x8 >> 25) + (arg1[8]));
+  x10 = ((x9 >> 26) + (arg1[9]));
+  x11 = ((x1 & UINT32_C(0x3ffffff)) + ((x10 >> 25) * UINT8_C(0x13)));
+  x12 = ((fiat_25519_uint1)(x11 >> 26) + (x2 & UINT32_C(0x1ffffff)));
+  x13 = (x11 & UINT32_C(0x3ffffff));
+  x14 = (x12 & UINT32_C(0x1ffffff));
+  x15 = ((fiat_25519_uint1)(x12 >> 25) + (x3 & UINT32_C(0x3ffffff)));
+  x16 = (x4 & UINT32_C(0x1ffffff));
+  x17 = (x5 & UINT32_C(0x3ffffff));
+  x18 = (x6 & UINT32_C(0x1ffffff));
+  x19 = (x7 & UINT32_C(0x3ffffff));
+  x20 = (x8 & UINT32_C(0x1ffffff));
+  x21 = (x9 & UINT32_C(0x3ffffff));
+  x22 = (x10 & UINT32_C(0x1ffffff));
   out1[0] = x13;
   out1[1] = x14;
   out1[2] = x15;
@@ -491,26 +810,32 @@
 
 /*
  * The function fiat_25519_add adds two field elements.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 + eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
- *   arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
  */
-static void fiat_25519_add(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) {
-  uint32_t x1 = ((arg1[0]) + (arg2[0]));
-  uint32_t x2 = ((arg1[1]) + (arg2[1]));
-  uint32_t x3 = ((arg1[2]) + (arg2[2]));
-  uint32_t x4 = ((arg1[3]) + (arg2[3]));
-  uint32_t x5 = ((arg1[4]) + (arg2[4]));
-  uint32_t x6 = ((arg1[5]) + (arg2[5]));
-  uint32_t x7 = ((arg1[6]) + (arg2[6]));
-  uint32_t x8 = ((arg1[7]) + (arg2[7]));
-  uint32_t x9 = ((arg1[8]) + (arg2[8]));
-  uint32_t x10 = ((arg1[9]) + (arg2[9]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_add(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  x1 = ((arg1[0]) + (arg2[0]));
+  x2 = ((arg1[1]) + (arg2[1]));
+  x3 = ((arg1[2]) + (arg2[2]));
+  x4 = ((arg1[3]) + (arg2[3]));
+  x5 = ((arg1[4]) + (arg2[4]));
+  x6 = ((arg1[5]) + (arg2[5]));
+  x7 = ((arg1[6]) + (arg2[6]));
+  x8 = ((arg1[7]) + (arg2[7]));
+  x9 = ((arg1[8]) + (arg2[8]));
+  x10 = ((arg1[9]) + (arg2[9]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -525,26 +850,32 @@
 
 /*
  * The function fiat_25519_sub subtracts two field elements.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 - eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
- *   arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
  */
-static void fiat_25519_sub(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) {
-  uint32_t x1 = ((UINT32_C(0x7ffffda) + (arg1[0])) - (arg2[0]));
-  uint32_t x2 = ((UINT32_C(0x3fffffe) + (arg1[1])) - (arg2[1]));
-  uint32_t x3 = ((UINT32_C(0x7fffffe) + (arg1[2])) - (arg2[2]));
-  uint32_t x4 = ((UINT32_C(0x3fffffe) + (arg1[3])) - (arg2[3]));
-  uint32_t x5 = ((UINT32_C(0x7fffffe) + (arg1[4])) - (arg2[4]));
-  uint32_t x6 = ((UINT32_C(0x3fffffe) + (arg1[5])) - (arg2[5]));
-  uint32_t x7 = ((UINT32_C(0x7fffffe) + (arg1[6])) - (arg2[6]));
-  uint32_t x8 = ((UINT32_C(0x3fffffe) + (arg1[7])) - (arg2[7]));
-  uint32_t x9 = ((UINT32_C(0x7fffffe) + (arg1[8])) - (arg2[8]));
-  uint32_t x10 = ((UINT32_C(0x3fffffe) + (arg1[9])) - (arg2[9]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_sub(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  x1 = ((UINT32_C(0x7ffffda) + (arg1[0])) - (arg2[0]));
+  x2 = ((UINT32_C(0x3fffffe) + (arg1[1])) - (arg2[1]));
+  x3 = ((UINT32_C(0x7fffffe) + (arg1[2])) - (arg2[2]));
+  x4 = ((UINT32_C(0x3fffffe) + (arg1[3])) - (arg2[3]));
+  x5 = ((UINT32_C(0x7fffffe) + (arg1[4])) - (arg2[4]));
+  x6 = ((UINT32_C(0x3fffffe) + (arg1[5])) - (arg2[5]));
+  x7 = ((UINT32_C(0x7fffffe) + (arg1[6])) - (arg2[6]));
+  x8 = ((UINT32_C(0x3fffffe) + (arg1[7])) - (arg2[7]));
+  x9 = ((UINT32_C(0x7fffffe) + (arg1[8])) - (arg2[8]));
+  x10 = ((UINT32_C(0x3fffffe) + (arg1[9])) - (arg2[9]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -559,25 +890,32 @@
 
 /*
  * The function fiat_25519_opp negates a field element.
+ *
  * Postconditions:
  *   eval out1 mod m = -eval arg1 mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
  */
-static void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10]) {
-  uint32_t x1 = (UINT32_C(0x7ffffda) - (arg1[0]));
-  uint32_t x2 = (UINT32_C(0x3fffffe) - (arg1[1]));
-  uint32_t x3 = (UINT32_C(0x7fffffe) - (arg1[2]));
-  uint32_t x4 = (UINT32_C(0x3fffffe) - (arg1[3]));
-  uint32_t x5 = (UINT32_C(0x7fffffe) - (arg1[4]));
-  uint32_t x6 = (UINT32_C(0x3fffffe) - (arg1[5]));
-  uint32_t x7 = (UINT32_C(0x7fffffe) - (arg1[6]));
-  uint32_t x8 = (UINT32_C(0x3fffffe) - (arg1[7]));
-  uint32_t x9 = (UINT32_C(0x7fffffe) - (arg1[8]));
-  uint32_t x10 = (UINT32_C(0x3fffffe) - (arg1[9]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_opp(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  x1 = (UINT32_C(0x7ffffda) - (arg1[0]));
+  x2 = (UINT32_C(0x3fffffe) - (arg1[1]));
+  x3 = (UINT32_C(0x7fffffe) - (arg1[2]));
+  x4 = (UINT32_C(0x3fffffe) - (arg1[3]));
+  x5 = (UINT32_C(0x7fffffe) - (arg1[4]));
+  x6 = (UINT32_C(0x3fffffe) - (arg1[5]));
+  x7 = (UINT32_C(0x7fffffe) - (arg1[6]));
+  x8 = (UINT32_C(0x3fffffe) - (arg1[7]));
+  x9 = (UINT32_C(0x7fffffe) - (arg1[8]));
+  x10 = (UINT32_C(0x3fffffe) - (arg1[9]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -592,6 +930,7 @@
 
 /*
  * The function fiat_25519_selectznz is a multi-limb conditional select.
+ *
  * Postconditions:
  *   eval out1 = (if arg1 = 0 then eval arg2 else eval arg3)
  *
@@ -602,26 +941,26 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_25519_selectznz(uint32_t out1[10], fiat_25519_uint1 arg1, const uint32_t arg2[10], const uint32_t arg3[10]) {
+static FIAT_25519_FIAT_INLINE void fiat_25519_selectznz(uint32_t out1[10], fiat_25519_uint1 arg1, const uint32_t arg2[10], const uint32_t arg3[10]) {
   uint32_t x1;
-  fiat_25519_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0]));
   uint32_t x2;
-  fiat_25519_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1]));
   uint32_t x3;
-  fiat_25519_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2]));
   uint32_t x4;
-  fiat_25519_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3]));
   uint32_t x5;
-  fiat_25519_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4]));
   uint32_t x6;
-  fiat_25519_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5]));
   uint32_t x7;
-  fiat_25519_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6]));
   uint32_t x8;
-  fiat_25519_cmovznz_u32(&x8, arg1, (arg2[7]), (arg3[7]));
   uint32_t x9;
-  fiat_25519_cmovznz_u32(&x9, arg1, (arg2[8]), (arg3[8]));
   uint32_t x10;
+  fiat_25519_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0]));
+  fiat_25519_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1]));
+  fiat_25519_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2]));
+  fiat_25519_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3]));
+  fiat_25519_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4]));
+  fiat_25519_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5]));
+  fiat_25519_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6]));
+  fiat_25519_cmovznz_u32(&x8, arg1, (arg2[7]), (arg3[7]));
+  fiat_25519_cmovznz_u32(&x9, arg1, (arg2[8]), (arg3[8]));
   fiat_25519_cmovznz_u32(&x10, arg1, (arg2[9]), (arg3[9]));
   out1[0] = x1;
   out1[1] = x2;
@@ -637,336 +976,582 @@
 
 /*
  * The function fiat_25519_to_bytes serializes a field element to bytes in little-endian order.
+ *
  * Postconditions:
  *   out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31]
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  * Output Bounds:
  *   out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]]
  */
-static void fiat_25519_to_bytes(uint8_t out1[32], const uint32_t arg1[10]) {
+static FIAT_25519_FIAT_INLINE void fiat_25519_to_bytes(uint8_t out1[32], const fiat_25519_tight_field_element arg1) {
   uint32_t x1;
   fiat_25519_uint1 x2;
-  fiat_25519_subborrowx_u26(&x1, &x2, 0x0, (arg1[0]), UINT32_C(0x3ffffed));
   uint32_t x3;
   fiat_25519_uint1 x4;
-  fiat_25519_subborrowx_u25(&x3, &x4, x2, (arg1[1]), UINT32_C(0x1ffffff));
   uint32_t x5;
   fiat_25519_uint1 x6;
-  fiat_25519_subborrowx_u26(&x5, &x6, x4, (arg1[2]), UINT32_C(0x3ffffff));
   uint32_t x7;
   fiat_25519_uint1 x8;
-  fiat_25519_subborrowx_u25(&x7, &x8, x6, (arg1[3]), UINT32_C(0x1ffffff));
   uint32_t x9;
   fiat_25519_uint1 x10;
-  fiat_25519_subborrowx_u26(&x9, &x10, x8, (arg1[4]), UINT32_C(0x3ffffff));
   uint32_t x11;
   fiat_25519_uint1 x12;
-  fiat_25519_subborrowx_u25(&x11, &x12, x10, (arg1[5]), UINT32_C(0x1ffffff));
   uint32_t x13;
   fiat_25519_uint1 x14;
-  fiat_25519_subborrowx_u26(&x13, &x14, x12, (arg1[6]), UINT32_C(0x3ffffff));
   uint32_t x15;
   fiat_25519_uint1 x16;
-  fiat_25519_subborrowx_u25(&x15, &x16, x14, (arg1[7]), UINT32_C(0x1ffffff));
   uint32_t x17;
   fiat_25519_uint1 x18;
-  fiat_25519_subborrowx_u26(&x17, &x18, x16, (arg1[8]), UINT32_C(0x3ffffff));
   uint32_t x19;
   fiat_25519_uint1 x20;
-  fiat_25519_subborrowx_u25(&x19, &x20, x18, (arg1[9]), UINT32_C(0x1ffffff));
   uint32_t x21;
-  fiat_25519_cmovznz_u32(&x21, x20, 0x0, UINT32_C(0xffffffff));
   uint32_t x22;
   fiat_25519_uint1 x23;
-  fiat_25519_addcarryx_u26(&x22, &x23, 0x0, x1, (x21 & UINT32_C(0x3ffffed)));
   uint32_t x24;
   fiat_25519_uint1 x25;
-  fiat_25519_addcarryx_u25(&x24, &x25, x23, x3, (x21 & UINT32_C(0x1ffffff)));
   uint32_t x26;
   fiat_25519_uint1 x27;
-  fiat_25519_addcarryx_u26(&x26, &x27, x25, x5, (x21 & UINT32_C(0x3ffffff)));
   uint32_t x28;
   fiat_25519_uint1 x29;
-  fiat_25519_addcarryx_u25(&x28, &x29, x27, x7, (x21 & UINT32_C(0x1ffffff)));
   uint32_t x30;
   fiat_25519_uint1 x31;
-  fiat_25519_addcarryx_u26(&x30, &x31, x29, x9, (x21 & UINT32_C(0x3ffffff)));
   uint32_t x32;
   fiat_25519_uint1 x33;
-  fiat_25519_addcarryx_u25(&x32, &x33, x31, x11, (x21 & UINT32_C(0x1ffffff)));
   uint32_t x34;
   fiat_25519_uint1 x35;
-  fiat_25519_addcarryx_u26(&x34, &x35, x33, x13, (x21 & UINT32_C(0x3ffffff)));
   uint32_t x36;
   fiat_25519_uint1 x37;
-  fiat_25519_addcarryx_u25(&x36, &x37, x35, x15, (x21 & UINT32_C(0x1ffffff)));
   uint32_t x38;
   fiat_25519_uint1 x39;
-  fiat_25519_addcarryx_u26(&x38, &x39, x37, x17, (x21 & UINT32_C(0x3ffffff)));
   uint32_t x40;
   fiat_25519_uint1 x41;
+  uint32_t x42;
+  uint32_t x43;
+  uint32_t x44;
+  uint32_t x45;
+  uint32_t x46;
+  uint32_t x47;
+  uint32_t x48;
+  uint32_t x49;
+  uint8_t x50;
+  uint32_t x51;
+  uint8_t x52;
+  uint32_t x53;
+  uint8_t x54;
+  uint8_t x55;
+  uint32_t x56;
+  uint8_t x57;
+  uint32_t x58;
+  uint8_t x59;
+  uint32_t x60;
+  uint8_t x61;
+  uint8_t x62;
+  uint32_t x63;
+  uint8_t x64;
+  uint32_t x65;
+  uint8_t x66;
+  uint32_t x67;
+  uint8_t x68;
+  uint8_t x69;
+  uint32_t x70;
+  uint8_t x71;
+  uint32_t x72;
+  uint8_t x73;
+  uint32_t x74;
+  uint8_t x75;
+  uint8_t x76;
+  uint32_t x77;
+  uint8_t x78;
+  uint32_t x79;
+  uint8_t x80;
+  uint32_t x81;
+  uint8_t x82;
+  uint8_t x83;
+  uint8_t x84;
+  uint32_t x85;
+  uint8_t x86;
+  uint32_t x87;
+  uint8_t x88;
+  fiat_25519_uint1 x89;
+  uint32_t x90;
+  uint8_t x91;
+  uint32_t x92;
+  uint8_t x93;
+  uint32_t x94;
+  uint8_t x95;
+  uint8_t x96;
+  uint32_t x97;
+  uint8_t x98;
+  uint32_t x99;
+  uint8_t x100;
+  uint32_t x101;
+  uint8_t x102;
+  uint8_t x103;
+  uint32_t x104;
+  uint8_t x105;
+  uint32_t x106;
+  uint8_t x107;
+  uint32_t x108;
+  uint8_t x109;
+  uint8_t x110;
+  uint32_t x111;
+  uint8_t x112;
+  uint32_t x113;
+  uint8_t x114;
+  uint32_t x115;
+  uint8_t x116;
+  uint8_t x117;
+  fiat_25519_subborrowx_u26(&x1, &x2, 0x0, (arg1[0]), UINT32_C(0x3ffffed));
+  fiat_25519_subborrowx_u25(&x3, &x4, x2, (arg1[1]), UINT32_C(0x1ffffff));
+  fiat_25519_subborrowx_u26(&x5, &x6, x4, (arg1[2]), UINT32_C(0x3ffffff));
+  fiat_25519_subborrowx_u25(&x7, &x8, x6, (arg1[3]), UINT32_C(0x1ffffff));
+  fiat_25519_subborrowx_u26(&x9, &x10, x8, (arg1[4]), UINT32_C(0x3ffffff));
+  fiat_25519_subborrowx_u25(&x11, &x12, x10, (arg1[5]), UINT32_C(0x1ffffff));
+  fiat_25519_subborrowx_u26(&x13, &x14, x12, (arg1[6]), UINT32_C(0x3ffffff));
+  fiat_25519_subborrowx_u25(&x15, &x16, x14, (arg1[7]), UINT32_C(0x1ffffff));
+  fiat_25519_subborrowx_u26(&x17, &x18, x16, (arg1[8]), UINT32_C(0x3ffffff));
+  fiat_25519_subborrowx_u25(&x19, &x20, x18, (arg1[9]), UINT32_C(0x1ffffff));
+  fiat_25519_cmovznz_u32(&x21, x20, 0x0, UINT32_C(0xffffffff));
+  fiat_25519_addcarryx_u26(&x22, &x23, 0x0, x1, (x21 & UINT32_C(0x3ffffed)));
+  fiat_25519_addcarryx_u25(&x24, &x25, x23, x3, (x21 & UINT32_C(0x1ffffff)));
+  fiat_25519_addcarryx_u26(&x26, &x27, x25, x5, (x21 & UINT32_C(0x3ffffff)));
+  fiat_25519_addcarryx_u25(&x28, &x29, x27, x7, (x21 & UINT32_C(0x1ffffff)));
+  fiat_25519_addcarryx_u26(&x30, &x31, x29, x9, (x21 & UINT32_C(0x3ffffff)));
+  fiat_25519_addcarryx_u25(&x32, &x33, x31, x11, (x21 & UINT32_C(0x1ffffff)));
+  fiat_25519_addcarryx_u26(&x34, &x35, x33, x13, (x21 & UINT32_C(0x3ffffff)));
+  fiat_25519_addcarryx_u25(&x36, &x37, x35, x15, (x21 & UINT32_C(0x1ffffff)));
+  fiat_25519_addcarryx_u26(&x38, &x39, x37, x17, (x21 & UINT32_C(0x3ffffff)));
   fiat_25519_addcarryx_u25(&x40, &x41, x39, x19, (x21 & UINT32_C(0x1ffffff)));
-  uint32_t x42 = (x40 << 6);
-  uint32_t x43 = (x38 << 4);
-  uint32_t x44 = (x36 << 3);
-  uint32_t x45 = (x34 * (uint32_t)0x2);
-  uint32_t x46 = (x30 << 6);
-  uint32_t x47 = (x28 << 5);
-  uint32_t x48 = (x26 << 3);
-  uint32_t x49 = (x24 << 2);
-  uint32_t x50 = (x22 >> 8);
-  uint8_t x51 = (uint8_t)(x22 & UINT8_C(0xff));
-  uint32_t x52 = (x50 >> 8);
-  uint8_t x53 = (uint8_t)(x50 & UINT8_C(0xff));
-  uint8_t x54 = (uint8_t)(x52 >> 8);
-  uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff));
-  uint32_t x56 = (x54 + x49);
-  uint32_t x57 = (x56 >> 8);
-  uint8_t x58 = (uint8_t)(x56 & UINT8_C(0xff));
-  uint32_t x59 = (x57 >> 8);
-  uint8_t x60 = (uint8_t)(x57 & UINT8_C(0xff));
-  uint8_t x61 = (uint8_t)(x59 >> 8);
-  uint8_t x62 = (uint8_t)(x59 & UINT8_C(0xff));
-  uint32_t x63 = (x61 + x48);
-  uint32_t x64 = (x63 >> 8);
-  uint8_t x65 = (uint8_t)(x63 & UINT8_C(0xff));
-  uint32_t x66 = (x64 >> 8);
-  uint8_t x67 = (uint8_t)(x64 & UINT8_C(0xff));
-  uint8_t x68 = (uint8_t)(x66 >> 8);
-  uint8_t x69 = (uint8_t)(x66 & UINT8_C(0xff));
-  uint32_t x70 = (x68 + x47);
-  uint32_t x71 = (x70 >> 8);
-  uint8_t x72 = (uint8_t)(x70 & UINT8_C(0xff));
-  uint32_t x73 = (x71 >> 8);
-  uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff));
-  uint8_t x75 = (uint8_t)(x73 >> 8);
-  uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff));
-  uint32_t x77 = (x75 + x46);
-  uint32_t x78 = (x77 >> 8);
-  uint8_t x79 = (uint8_t)(x77 & UINT8_C(0xff));
-  uint32_t x80 = (x78 >> 8);
-  uint8_t x81 = (uint8_t)(x78 & UINT8_C(0xff));
-  uint8_t x82 = (uint8_t)(x80 >> 8);
-  uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff));
-  uint8_t x84 = (uint8_t)(x82 & UINT8_C(0xff));
-  uint32_t x85 = (x32 >> 8);
-  uint8_t x86 = (uint8_t)(x32 & UINT8_C(0xff));
-  uint32_t x87 = (x85 >> 8);
-  uint8_t x88 = (uint8_t)(x85 & UINT8_C(0xff));
-  fiat_25519_uint1 x89 = (fiat_25519_uint1)(x87 >> 8);
-  uint8_t x90 = (uint8_t)(x87 & UINT8_C(0xff));
-  uint32_t x91 = (x89 + x45);
-  uint32_t x92 = (x91 >> 8);
-  uint8_t x93 = (uint8_t)(x91 & UINT8_C(0xff));
-  uint32_t x94 = (x92 >> 8);
-  uint8_t x95 = (uint8_t)(x92 & UINT8_C(0xff));
-  uint8_t x96 = (uint8_t)(x94 >> 8);
-  uint8_t x97 = (uint8_t)(x94 & UINT8_C(0xff));
-  uint32_t x98 = (x96 + x44);
-  uint32_t x99 = (x98 >> 8);
-  uint8_t x100 = (uint8_t)(x98 & UINT8_C(0xff));
-  uint32_t x101 = (x99 >> 8);
-  uint8_t x102 = (uint8_t)(x99 & UINT8_C(0xff));
-  uint8_t x103 = (uint8_t)(x101 >> 8);
-  uint8_t x104 = (uint8_t)(x101 & UINT8_C(0xff));
-  uint32_t x105 = (x103 + x43);
-  uint32_t x106 = (x105 >> 8);
-  uint8_t x107 = (uint8_t)(x105 & UINT8_C(0xff));
-  uint32_t x108 = (x106 >> 8);
-  uint8_t x109 = (uint8_t)(x106 & UINT8_C(0xff));
-  uint8_t x110 = (uint8_t)(x108 >> 8);
-  uint8_t x111 = (uint8_t)(x108 & UINT8_C(0xff));
-  uint32_t x112 = (x110 + x42);
-  uint32_t x113 = (x112 >> 8);
-  uint8_t x114 = (uint8_t)(x112 & UINT8_C(0xff));
-  uint32_t x115 = (x113 >> 8);
-  uint8_t x116 = (uint8_t)(x113 & UINT8_C(0xff));
-  uint8_t x117 = (uint8_t)(x115 >> 8);
-  uint8_t x118 = (uint8_t)(x115 & UINT8_C(0xff));
-  out1[0] = x51;
-  out1[1] = x53;
-  out1[2] = x55;
-  out1[3] = x58;
-  out1[4] = x60;
-  out1[5] = x62;
-  out1[6] = x65;
-  out1[7] = x67;
-  out1[8] = x69;
-  out1[9] = x72;
-  out1[10] = x74;
-  out1[11] = x76;
-  out1[12] = x79;
-  out1[13] = x81;
-  out1[14] = x83;
-  out1[15] = x84;
-  out1[16] = x86;
-  out1[17] = x88;
-  out1[18] = x90;
-  out1[19] = x93;
-  out1[20] = x95;
-  out1[21] = x97;
-  out1[22] = x100;
-  out1[23] = x102;
-  out1[24] = x104;
-  out1[25] = x107;
-  out1[26] = x109;
-  out1[27] = x111;
-  out1[28] = x114;
-  out1[29] = x116;
-  out1[30] = x118;
+  x42 = (x40 << 6);
+  x43 = (x38 << 4);
+  x44 = (x36 << 3);
+  x45 = (x34 * (uint32_t)0x2);
+  x46 = (x30 << 6);
+  x47 = (x28 << 5);
+  x48 = (x26 << 3);
+  x49 = (x24 << 2);
+  x50 = (uint8_t)(x22 & UINT8_C(0xff));
+  x51 = (x22 >> 8);
+  x52 = (uint8_t)(x51 & UINT8_C(0xff));
+  x53 = (x51 >> 8);
+  x54 = (uint8_t)(x53 & UINT8_C(0xff));
+  x55 = (uint8_t)(x53 >> 8);
+  x56 = (x49 + (uint32_t)x55);
+  x57 = (uint8_t)(x56 & UINT8_C(0xff));
+  x58 = (x56 >> 8);
+  x59 = (uint8_t)(x58 & UINT8_C(0xff));
+  x60 = (x58 >> 8);
+  x61 = (uint8_t)(x60 & UINT8_C(0xff));
+  x62 = (uint8_t)(x60 >> 8);
+  x63 = (x48 + (uint32_t)x62);
+  x64 = (uint8_t)(x63 & UINT8_C(0xff));
+  x65 = (x63 >> 8);
+  x66 = (uint8_t)(x65 & UINT8_C(0xff));
+  x67 = (x65 >> 8);
+  x68 = (uint8_t)(x67 & UINT8_C(0xff));
+  x69 = (uint8_t)(x67 >> 8);
+  x70 = (x47 + (uint32_t)x69);
+  x71 = (uint8_t)(x70 & UINT8_C(0xff));
+  x72 = (x70 >> 8);
+  x73 = (uint8_t)(x72 & UINT8_C(0xff));
+  x74 = (x72 >> 8);
+  x75 = (uint8_t)(x74 & UINT8_C(0xff));
+  x76 = (uint8_t)(x74 >> 8);
+  x77 = (x46 + (uint32_t)x76);
+  x78 = (uint8_t)(x77 & UINT8_C(0xff));
+  x79 = (x77 >> 8);
+  x80 = (uint8_t)(x79 & UINT8_C(0xff));
+  x81 = (x79 >> 8);
+  x82 = (uint8_t)(x81 & UINT8_C(0xff));
+  x83 = (uint8_t)(x81 >> 8);
+  x84 = (uint8_t)(x32 & UINT8_C(0xff));
+  x85 = (x32 >> 8);
+  x86 = (uint8_t)(x85 & UINT8_C(0xff));
+  x87 = (x85 >> 8);
+  x88 = (uint8_t)(x87 & UINT8_C(0xff));
+  x89 = (fiat_25519_uint1)(x87 >> 8);
+  x90 = (x45 + (uint32_t)x89);
+  x91 = (uint8_t)(x90 & UINT8_C(0xff));
+  x92 = (x90 >> 8);
+  x93 = (uint8_t)(x92 & UINT8_C(0xff));
+  x94 = (x92 >> 8);
+  x95 = (uint8_t)(x94 & UINT8_C(0xff));
+  x96 = (uint8_t)(x94 >> 8);
+  x97 = (x44 + (uint32_t)x96);
+  x98 = (uint8_t)(x97 & UINT8_C(0xff));
+  x99 = (x97 >> 8);
+  x100 = (uint8_t)(x99 & UINT8_C(0xff));
+  x101 = (x99 >> 8);
+  x102 = (uint8_t)(x101 & UINT8_C(0xff));
+  x103 = (uint8_t)(x101 >> 8);
+  x104 = (x43 + (uint32_t)x103);
+  x105 = (uint8_t)(x104 & UINT8_C(0xff));
+  x106 = (x104 >> 8);
+  x107 = (uint8_t)(x106 & UINT8_C(0xff));
+  x108 = (x106 >> 8);
+  x109 = (uint8_t)(x108 & UINT8_C(0xff));
+  x110 = (uint8_t)(x108 >> 8);
+  x111 = (x42 + (uint32_t)x110);
+  x112 = (uint8_t)(x111 & UINT8_C(0xff));
+  x113 = (x111 >> 8);
+  x114 = (uint8_t)(x113 & UINT8_C(0xff));
+  x115 = (x113 >> 8);
+  x116 = (uint8_t)(x115 & UINT8_C(0xff));
+  x117 = (uint8_t)(x115 >> 8);
+  out1[0] = x50;
+  out1[1] = x52;
+  out1[2] = x54;
+  out1[3] = x57;
+  out1[4] = x59;
+  out1[5] = x61;
+  out1[6] = x64;
+  out1[7] = x66;
+  out1[8] = x68;
+  out1[9] = x71;
+  out1[10] = x73;
+  out1[11] = x75;
+  out1[12] = x78;
+  out1[13] = x80;
+  out1[14] = x82;
+  out1[15] = x83;
+  out1[16] = x84;
+  out1[17] = x86;
+  out1[18] = x88;
+  out1[19] = x91;
+  out1[20] = x93;
+  out1[21] = x95;
+  out1[22] = x98;
+  out1[23] = x100;
+  out1[24] = x102;
+  out1[25] = x105;
+  out1[26] = x107;
+  out1[27] = x109;
+  out1[28] = x112;
+  out1[29] = x114;
+  out1[30] = x116;
   out1[31] = x117;
 }
 
 /*
  * The function fiat_25519_from_bytes deserializes a field element from bytes in little-endian order.
+ *
  * Postconditions:
  *   eval out1 mod m = bytes_eval arg1 mod m
  *
  * Input Bounds:
  *   arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  */
-static void fiat_25519_from_bytes(uint32_t out1[10], const uint8_t arg1[32]) {
-  uint32_t x1 = ((uint32_t)(arg1[31]) << 18);
-  uint32_t x2 = ((uint32_t)(arg1[30]) << 10);
-  uint32_t x3 = ((uint32_t)(arg1[29]) << 2);
-  uint32_t x4 = ((uint32_t)(arg1[28]) << 20);
-  uint32_t x5 = ((uint32_t)(arg1[27]) << 12);
-  uint32_t x6 = ((uint32_t)(arg1[26]) << 4);
-  uint32_t x7 = ((uint32_t)(arg1[25]) << 21);
-  uint32_t x8 = ((uint32_t)(arg1[24]) << 13);
-  uint32_t x9 = ((uint32_t)(arg1[23]) << 5);
-  uint32_t x10 = ((uint32_t)(arg1[22]) << 23);
-  uint32_t x11 = ((uint32_t)(arg1[21]) << 15);
-  uint32_t x12 = ((uint32_t)(arg1[20]) << 7);
-  uint32_t x13 = ((uint32_t)(arg1[19]) << 24);
-  uint32_t x14 = ((uint32_t)(arg1[18]) << 16);
-  uint32_t x15 = ((uint32_t)(arg1[17]) << 8);
-  uint8_t x16 = (arg1[16]);
-  uint32_t x17 = ((uint32_t)(arg1[15]) << 18);
-  uint32_t x18 = ((uint32_t)(arg1[14]) << 10);
-  uint32_t x19 = ((uint32_t)(arg1[13]) << 2);
-  uint32_t x20 = ((uint32_t)(arg1[12]) << 19);
-  uint32_t x21 = ((uint32_t)(arg1[11]) << 11);
-  uint32_t x22 = ((uint32_t)(arg1[10]) << 3);
-  uint32_t x23 = ((uint32_t)(arg1[9]) << 21);
-  uint32_t x24 = ((uint32_t)(arg1[8]) << 13);
-  uint32_t x25 = ((uint32_t)(arg1[7]) << 5);
-  uint32_t x26 = ((uint32_t)(arg1[6]) << 22);
-  uint32_t x27 = ((uint32_t)(arg1[5]) << 14);
-  uint32_t x28 = ((uint32_t)(arg1[4]) << 6);
-  uint32_t x29 = ((uint32_t)(arg1[3]) << 24);
-  uint32_t x30 = ((uint32_t)(arg1[2]) << 16);
-  uint32_t x31 = ((uint32_t)(arg1[1]) << 8);
-  uint8_t x32 = (arg1[0]);
-  uint32_t x33 = (x32 + (x31 + (x30 + x29)));
-  uint8_t x34 = (uint8_t)(x33 >> 26);
-  uint32_t x35 = (x33 & UINT32_C(0x3ffffff));
-  uint32_t x36 = (x3 + (x2 + x1));
-  uint32_t x37 = (x6 + (x5 + x4));
-  uint32_t x38 = (x9 + (x8 + x7));
-  uint32_t x39 = (x12 + (x11 + x10));
-  uint32_t x40 = (x16 + (x15 + (x14 + x13)));
-  uint32_t x41 = (x19 + (x18 + x17));
-  uint32_t x42 = (x22 + (x21 + x20));
-  uint32_t x43 = (x25 + (x24 + x23));
-  uint32_t x44 = (x28 + (x27 + x26));
-  uint32_t x45 = (x34 + x44);
-  uint8_t x46 = (uint8_t)(x45 >> 25);
-  uint32_t x47 = (x45 & UINT32_C(0x1ffffff));
-  uint32_t x48 = (x46 + x43);
-  uint8_t x49 = (uint8_t)(x48 >> 26);
-  uint32_t x50 = (x48 & UINT32_C(0x3ffffff));
-  uint32_t x51 = (x49 + x42);
-  uint8_t x52 = (uint8_t)(x51 >> 25);
-  uint32_t x53 = (x51 & UINT32_C(0x1ffffff));
-  uint32_t x54 = (x52 + x41);
-  uint32_t x55 = (x54 & UINT32_C(0x3ffffff));
-  uint8_t x56 = (uint8_t)(x40 >> 25);
-  uint32_t x57 = (x40 & UINT32_C(0x1ffffff));
-  uint32_t x58 = (x56 + x39);
-  uint8_t x59 = (uint8_t)(x58 >> 26);
-  uint32_t x60 = (x58 & UINT32_C(0x3ffffff));
-  uint32_t x61 = (x59 + x38);
-  uint8_t x62 = (uint8_t)(x61 >> 25);
-  uint32_t x63 = (x61 & UINT32_C(0x1ffffff));
-  uint32_t x64 = (x62 + x37);
-  uint8_t x65 = (uint8_t)(x64 >> 26);
-  uint32_t x66 = (x64 & UINT32_C(0x3ffffff));
-  uint32_t x67 = (x65 + x36);
-  out1[0] = x35;
-  out1[1] = x47;
-  out1[2] = x50;
-  out1[3] = x53;
+static FIAT_25519_FIAT_INLINE void fiat_25519_from_bytes(fiat_25519_tight_field_element out1, const uint8_t arg1[32]) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint32_t x11;
+  uint32_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint8_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint32_t x19;
+  uint32_t x20;
+  uint32_t x21;
+  uint32_t x22;
+  uint32_t x23;
+  uint32_t x24;
+  uint32_t x25;
+  uint32_t x26;
+  uint32_t x27;
+  uint32_t x28;
+  uint32_t x29;
+  uint32_t x30;
+  uint32_t x31;
+  uint8_t x32;
+  uint32_t x33;
+  uint32_t x34;
+  uint32_t x35;
+  uint32_t x36;
+  uint8_t x37;
+  uint32_t x38;
+  uint32_t x39;
+  uint32_t x40;
+  uint32_t x41;
+  uint8_t x42;
+  uint32_t x43;
+  uint32_t x44;
+  uint32_t x45;
+  uint32_t x46;
+  uint8_t x47;
+  uint32_t x48;
+  uint32_t x49;
+  uint32_t x50;
+  uint32_t x51;
+  uint8_t x52;
+  uint32_t x53;
+  uint32_t x54;
+  uint32_t x55;
+  uint32_t x56;
+  uint32_t x57;
+  uint32_t x58;
+  uint32_t x59;
+  uint8_t x60;
+  uint32_t x61;
+  uint32_t x62;
+  uint32_t x63;
+  uint32_t x64;
+  uint8_t x65;
+  uint32_t x66;
+  uint32_t x67;
+  uint32_t x68;
+  uint32_t x69;
+  uint8_t x70;
+  uint32_t x71;
+  uint32_t x72;
+  uint32_t x73;
+  uint32_t x74;
+  uint8_t x75;
+  uint32_t x76;
+  uint32_t x77;
+  uint32_t x78;
+  x1 = ((uint32_t)(arg1[31]) << 18);
+  x2 = ((uint32_t)(arg1[30]) << 10);
+  x3 = ((uint32_t)(arg1[29]) << 2);
+  x4 = ((uint32_t)(arg1[28]) << 20);
+  x5 = ((uint32_t)(arg1[27]) << 12);
+  x6 = ((uint32_t)(arg1[26]) << 4);
+  x7 = ((uint32_t)(arg1[25]) << 21);
+  x8 = ((uint32_t)(arg1[24]) << 13);
+  x9 = ((uint32_t)(arg1[23]) << 5);
+  x10 = ((uint32_t)(arg1[22]) << 23);
+  x11 = ((uint32_t)(arg1[21]) << 15);
+  x12 = ((uint32_t)(arg1[20]) << 7);
+  x13 = ((uint32_t)(arg1[19]) << 24);
+  x14 = ((uint32_t)(arg1[18]) << 16);
+  x15 = ((uint32_t)(arg1[17]) << 8);
+  x16 = (arg1[16]);
+  x17 = ((uint32_t)(arg1[15]) << 18);
+  x18 = ((uint32_t)(arg1[14]) << 10);
+  x19 = ((uint32_t)(arg1[13]) << 2);
+  x20 = ((uint32_t)(arg1[12]) << 19);
+  x21 = ((uint32_t)(arg1[11]) << 11);
+  x22 = ((uint32_t)(arg1[10]) << 3);
+  x23 = ((uint32_t)(arg1[9]) << 21);
+  x24 = ((uint32_t)(arg1[8]) << 13);
+  x25 = ((uint32_t)(arg1[7]) << 5);
+  x26 = ((uint32_t)(arg1[6]) << 22);
+  x27 = ((uint32_t)(arg1[5]) << 14);
+  x28 = ((uint32_t)(arg1[4]) << 6);
+  x29 = ((uint32_t)(arg1[3]) << 24);
+  x30 = ((uint32_t)(arg1[2]) << 16);
+  x31 = ((uint32_t)(arg1[1]) << 8);
+  x32 = (arg1[0]);
+  x33 = (x31 + (uint32_t)x32);
+  x34 = (x30 + x33);
+  x35 = (x29 + x34);
+  x36 = (x35 & UINT32_C(0x3ffffff));
+  x37 = (uint8_t)(x35 >> 26);
+  x38 = (x28 + (uint32_t)x37);
+  x39 = (x27 + x38);
+  x40 = (x26 + x39);
+  x41 = (x40 & UINT32_C(0x1ffffff));
+  x42 = (uint8_t)(x40 >> 25);
+  x43 = (x25 + (uint32_t)x42);
+  x44 = (x24 + x43);
+  x45 = (x23 + x44);
+  x46 = (x45 & UINT32_C(0x3ffffff));
+  x47 = (uint8_t)(x45 >> 26);
+  x48 = (x22 + (uint32_t)x47);
+  x49 = (x21 + x48);
+  x50 = (x20 + x49);
+  x51 = (x50 & UINT32_C(0x1ffffff));
+  x52 = (uint8_t)(x50 >> 25);
+  x53 = (x19 + (uint32_t)x52);
+  x54 = (x18 + x53);
+  x55 = (x17 + x54);
+  x56 = (x15 + (uint32_t)x16);
+  x57 = (x14 + x56);
+  x58 = (x13 + x57);
+  x59 = (x58 & UINT32_C(0x1ffffff));
+  x60 = (uint8_t)(x58 >> 25);
+  x61 = (x12 + (uint32_t)x60);
+  x62 = (x11 + x61);
+  x63 = (x10 + x62);
+  x64 = (x63 & UINT32_C(0x3ffffff));
+  x65 = (uint8_t)(x63 >> 26);
+  x66 = (x9 + (uint32_t)x65);
+  x67 = (x8 + x66);
+  x68 = (x7 + x67);
+  x69 = (x68 & UINT32_C(0x1ffffff));
+  x70 = (uint8_t)(x68 >> 25);
+  x71 = (x6 + (uint32_t)x70);
+  x72 = (x5 + x71);
+  x73 = (x4 + x72);
+  x74 = (x73 & UINT32_C(0x3ffffff));
+  x75 = (uint8_t)(x73 >> 26);
+  x76 = (x3 + (uint32_t)x75);
+  x77 = (x2 + x76);
+  x78 = (x1 + x77);
+  out1[0] = x36;
+  out1[1] = x41;
+  out1[2] = x46;
+  out1[3] = x51;
   out1[4] = x55;
-  out1[5] = x57;
-  out1[6] = x60;
-  out1[7] = x63;
-  out1[8] = x66;
-  out1[9] = x67;
+  out1[5] = x59;
+  out1[6] = x64;
+  out1[7] = x69;
+  out1[8] = x74;
+  out1[9] = x78;
+}
+
+/*
+ * The function fiat_25519_relax is the identity function converting from tight field elements to loose field elements.
+ *
+ * Postconditions:
+ *   out1 = arg1
+ *
+ */
+static FIAT_25519_FIAT_INLINE void fiat_25519_relax(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  x1 = (arg1[0]);
+  x2 = (arg1[1]);
+  x3 = (arg1[2]);
+  x4 = (arg1[3]);
+  x5 = (arg1[4]);
+  x6 = (arg1[5]);
+  x7 = (arg1[6]);
+  x8 = (arg1[7]);
+  x9 = (arg1[8]);
+  x10 = (arg1[9]);
+  out1[0] = x1;
+  out1[1] = x2;
+  out1[2] = x3;
+  out1[3] = x4;
+  out1[4] = x5;
+  out1[5] = x6;
+  out1[6] = x7;
+  out1[7] = x8;
+  out1[8] = x9;
+  out1[9] = x10;
 }
 
 /*
  * The function fiat_25519_carry_scmul_121666 multiplies a field element by 121666 and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (121666 * eval arg1) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]]
  */
-static void fiat_25519_carry_scmul_121666(uint32_t out1[10], const uint32_t arg1[10]) {
-  uint64_t x1 = ((uint64_t)UINT32_C(0x1db42) * (arg1[9]));
-  uint64_t x2 = ((uint64_t)UINT32_C(0x1db42) * (arg1[8]));
-  uint64_t x3 = ((uint64_t)UINT32_C(0x1db42) * (arg1[7]));
-  uint64_t x4 = ((uint64_t)UINT32_C(0x1db42) * (arg1[6]));
-  uint64_t x5 = ((uint64_t)UINT32_C(0x1db42) * (arg1[5]));
-  uint64_t x6 = ((uint64_t)UINT32_C(0x1db42) * (arg1[4]));
-  uint64_t x7 = ((uint64_t)UINT32_C(0x1db42) * (arg1[3]));
-  uint64_t x8 = ((uint64_t)UINT32_C(0x1db42) * (arg1[2]));
-  uint64_t x9 = ((uint64_t)UINT32_C(0x1db42) * (arg1[1]));
-  uint64_t x10 = ((uint64_t)UINT32_C(0x1db42) * (arg1[0]));
-  uint32_t x11 = (uint32_t)(x10 >> 26);
-  uint32_t x12 = (uint32_t)(x10 & UINT32_C(0x3ffffff));
-  uint64_t x13 = (x11 + x9);
-  uint32_t x14 = (uint32_t)(x13 >> 25);
-  uint32_t x15 = (uint32_t)(x13 & UINT32_C(0x1ffffff));
-  uint64_t x16 = (x14 + x8);
-  uint32_t x17 = (uint32_t)(x16 >> 26);
-  uint32_t x18 = (uint32_t)(x16 & UINT32_C(0x3ffffff));
-  uint64_t x19 = (x17 + x7);
-  uint32_t x20 = (uint32_t)(x19 >> 25);
-  uint32_t x21 = (uint32_t)(x19 & UINT32_C(0x1ffffff));
-  uint64_t x22 = (x20 + x6);
-  uint32_t x23 = (uint32_t)(x22 >> 26);
-  uint32_t x24 = (uint32_t)(x22 & UINT32_C(0x3ffffff));
-  uint64_t x25 = (x23 + x5);
-  uint32_t x26 = (uint32_t)(x25 >> 25);
-  uint32_t x27 = (uint32_t)(x25 & UINT32_C(0x1ffffff));
-  uint64_t x28 = (x26 + x4);
-  uint32_t x29 = (uint32_t)(x28 >> 26);
-  uint32_t x30 = (uint32_t)(x28 & UINT32_C(0x3ffffff));
-  uint64_t x31 = (x29 + x3);
-  uint32_t x32 = (uint32_t)(x31 >> 25);
-  uint32_t x33 = (uint32_t)(x31 & UINT32_C(0x1ffffff));
-  uint64_t x34 = (x32 + x2);
-  uint32_t x35 = (uint32_t)(x34 >> 26);
-  uint32_t x36 = (uint32_t)(x34 & UINT32_C(0x3ffffff));
-  uint64_t x37 = (x35 + x1);
-  uint32_t x38 = (uint32_t)(x37 >> 25);
-  uint32_t x39 = (uint32_t)(x37 & UINT32_C(0x1ffffff));
-  uint32_t x40 = (x38 * UINT8_C(0x13));
-  uint32_t x41 = (x12 + x40);
-  fiat_25519_uint1 x42 = (fiat_25519_uint1)(x41 >> 26);
-  uint32_t x43 = (x41 & UINT32_C(0x3ffffff));
-  uint32_t x44 = (x42 + x15);
-  fiat_25519_uint1 x45 = (fiat_25519_uint1)(x44 >> 25);
-  uint32_t x46 = (x44 & UINT32_C(0x1ffffff));
-  uint32_t x47 = (x45 + x18);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_scmul_121666(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint32_t x11;
+  uint32_t x12;
+  uint64_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint64_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint64_t x19;
+  uint32_t x20;
+  uint32_t x21;
+  uint64_t x22;
+  uint32_t x23;
+  uint32_t x24;
+  uint64_t x25;
+  uint32_t x26;
+  uint32_t x27;
+  uint64_t x28;
+  uint32_t x29;
+  uint32_t x30;
+  uint64_t x31;
+  uint32_t x32;
+  uint32_t x33;
+  uint64_t x34;
+  uint32_t x35;
+  uint32_t x36;
+  uint64_t x37;
+  uint32_t x38;
+  uint32_t x39;
+  uint32_t x40;
+  uint32_t x41;
+  fiat_25519_uint1 x42;
+  uint32_t x43;
+  uint32_t x44;
+  fiat_25519_uint1 x45;
+  uint32_t x46;
+  uint32_t x47;
+  x1 = ((uint64_t)UINT32_C(0x1db42) * (arg1[9]));
+  x2 = ((uint64_t)UINT32_C(0x1db42) * (arg1[8]));
+  x3 = ((uint64_t)UINT32_C(0x1db42) * (arg1[7]));
+  x4 = ((uint64_t)UINT32_C(0x1db42) * (arg1[6]));
+  x5 = ((uint64_t)UINT32_C(0x1db42) * (arg1[5]));
+  x6 = ((uint64_t)UINT32_C(0x1db42) * (arg1[4]));
+  x7 = ((uint64_t)UINT32_C(0x1db42) * (arg1[3]));
+  x8 = ((uint64_t)UINT32_C(0x1db42) * (arg1[2]));
+  x9 = ((uint64_t)UINT32_C(0x1db42) * (arg1[1]));
+  x10 = ((uint64_t)UINT32_C(0x1db42) * (arg1[0]));
+  x11 = (uint32_t)(x10 >> 26);
+  x12 = (uint32_t)(x10 & UINT32_C(0x3ffffff));
+  x13 = (x11 + x9);
+  x14 = (uint32_t)(x13 >> 25);
+  x15 = (uint32_t)(x13 & UINT32_C(0x1ffffff));
+  x16 = (x14 + x8);
+  x17 = (uint32_t)(x16 >> 26);
+  x18 = (uint32_t)(x16 & UINT32_C(0x3ffffff));
+  x19 = (x17 + x7);
+  x20 = (uint32_t)(x19 >> 25);
+  x21 = (uint32_t)(x19 & UINT32_C(0x1ffffff));
+  x22 = (x20 + x6);
+  x23 = (uint32_t)(x22 >> 26);
+  x24 = (uint32_t)(x22 & UINT32_C(0x3ffffff));
+  x25 = (x23 + x5);
+  x26 = (uint32_t)(x25 >> 25);
+  x27 = (uint32_t)(x25 & UINT32_C(0x1ffffff));
+  x28 = (x26 + x4);
+  x29 = (uint32_t)(x28 >> 26);
+  x30 = (uint32_t)(x28 & UINT32_C(0x3ffffff));
+  x31 = (x29 + x3);
+  x32 = (uint32_t)(x31 >> 25);
+  x33 = (uint32_t)(x31 & UINT32_C(0x1ffffff));
+  x34 = (x32 + x2);
+  x35 = (uint32_t)(x34 >> 26);
+  x36 = (uint32_t)(x34 & UINT32_C(0x3ffffff));
+  x37 = (x35 + x1);
+  x38 = (uint32_t)(x37 >> 25);
+  x39 = (uint32_t)(x37 & UINT32_C(0x1ffffff));
+  x40 = (x38 * UINT8_C(0x13));
+  x41 = (x12 + x40);
+  x42 = (fiat_25519_uint1)(x41 >> 26);
+  x43 = (x41 & UINT32_C(0x3ffffff));
+  x44 = (x42 + x15);
+  x45 = (fiat_25519_uint1)(x44 >> 25);
+  x46 = (x44 & UINT32_C(0x1ffffff));
+  x47 = (x45 + x18);
   out1[0] = x43;
   out1[1] = x46;
   out1[2] = x47;
@@ -978,4 +1563,3 @@
   out1[8] = x36;
   out1[9] = x39;
 }
-
diff --git a/src/third_party/fiat/curve25519_64.h b/src/third_party/fiat/curve25519_64.h
index 02679bb..faed049 100644
--- a/src/third_party/fiat/curve25519_64.h
+++ b/src/third_party/fiat/curve25519_64.h
@@ -1,26 +1,56 @@
-/* Autogenerated: src/ExtractionOCaml/unsaturated_solinas --static 25519 5 '2^255 - 19' 64 carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes carry_scmul121666 */
+/* Autogenerated: 'src/ExtractionOCaml/unsaturated_solinas' --inline --static --use-value-barrier 25519 64 '(auto)' '2^255 - 19' carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes relax carry_scmul121666 */
 /* curve description: 25519 */
-/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, carry_scmul121666 */
-/* n = 5 (from "5") */
-/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */
 /* machine_wordsize = 64 (from "64") */
-
+/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, relax, carry_scmul121666 */
+/* n = 5 (from "(auto)") */
+/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */
+/* tight_bounds_multiplier = 1 (from "") */
+/*  */
 /* Computed values: */
-/* carry_chain = [0, 1, 2, 3, 4, 0, 1] */
+/*   carry_chain = [0, 1, 2, 3, 4, 0, 1] */
+/*   eval z = z[0] + (z[1] << 51) + (z[2] << 102) + (z[3] << 153) + (z[4] << 204) */
+/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
+/*   balance = [0xfffffffffffda, 0xffffffffffffe, 0xffffffffffffe, 0xffffffffffffe, 0xffffffffffffe] */
 
 #include <stdint.h>
 typedef unsigned char fiat_25519_uint1;
 typedef signed char fiat_25519_int1;
-typedef signed __int128 fiat_25519_int128;
-typedef unsigned __int128 fiat_25519_uint128;
+#if defined(__GNUC__) || defined(__clang__)
+#  define FIAT_25519_FIAT_EXTENSION __extension__
+#  define FIAT_25519_FIAT_INLINE __inline__
+#else
+#  define FIAT_25519_FIAT_EXTENSION
+#  define FIAT_25519_FIAT_INLINE
+#endif
+
+FIAT_25519_FIAT_EXTENSION typedef signed __int128 fiat_25519_int128;
+FIAT_25519_FIAT_EXTENSION typedef unsigned __int128 fiat_25519_uint128;
+
+/* The type fiat_25519_loose_field_element is a field element with loose bounds. */
+/* Bounds: [[0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000]] */
+typedef uint64_t fiat_25519_loose_field_element[5];
+
+/* The type fiat_25519_tight_field_element is a field element with tight bounds. */
+/* Bounds: [[0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000]] */
+typedef uint64_t fiat_25519_tight_field_element[5];
 
 #if (-1 & 3) != 3
 #error "This code only works on a two's complement system"
 #endif
 
+#if !defined(FIAT_25519_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
+static __inline__ uint64_t fiat_25519_value_barrier_u64(uint64_t a) {
+  __asm__("" : "+r"(a) : /* no inputs */);
+  return a;
+}
+#else
+#  define fiat_25519_value_barrier_u64(x) (x)
+#endif
+
 
 /*
  * The function fiat_25519_addcarryx_u51 is an addition with carry.
+ *
  * Postconditions:
  *   out1 = (arg1 + arg2 + arg3) mod 2^51
  *   out2 = ⌊(arg1 + arg2 + arg3) / 2^51⌋
@@ -33,16 +63,20 @@
  *   out1: [0x0 ~> 0x7ffffffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_addcarryx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  uint64_t x1 = ((arg1 + arg2) + arg3);
-  uint64_t x2 = (x1 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 51);
+static FIAT_25519_FIAT_INLINE void fiat_25519_addcarryx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  uint64_t x1;
+  uint64_t x2;
+  fiat_25519_uint1 x3;
+  x1 = ((arg1 + arg2) + arg3);
+  x2 = (x1 & UINT64_C(0x7ffffffffffff));
+  x3 = (fiat_25519_uint1)(x1 >> 51);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_25519_subborrowx_u51 is a subtraction with borrow.
+ *
  * Postconditions:
  *   out1 = (-arg1 + arg2 + -arg3) mod 2^51
  *   out2 = -⌊(-arg1 + arg2 + -arg3) / 2^51⌋
@@ -55,16 +89,20 @@
  *   out1: [0x0 ~> 0x7ffffffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_25519_subborrowx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  int64_t x1 = ((int64_t)(arg2 - (int64_t)arg1) - (int64_t)arg3);
-  fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 51);
-  uint64_t x3 = (x1 & UINT64_C(0x7ffffffffffff));
+static FIAT_25519_FIAT_INLINE void fiat_25519_subborrowx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  int64_t x1;
+  fiat_25519_int1 x2;
+  uint64_t x3;
+  x1 = ((int64_t)(arg2 - (int64_t)arg1) - (int64_t)arg3);
+  x2 = (fiat_25519_int1)(x1 >> 51);
+  x3 = (x1 & UINT64_C(0x7ffffffffffff));
   *out1 = x3;
   *out2 = (fiat_25519_uint1)(0x0 - x2);
 }
 
 /*
  * The function fiat_25519_cmovznz_u64 is a single-word conditional move.
+ *
  * Postconditions:
  *   out1 = (if arg1 = 0 then arg2 else arg3)
  *
@@ -75,83 +113,128 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffffffffffff]
  */
-static void fiat_25519_cmovznz_u64(uint64_t* out1, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  fiat_25519_uint1 x1 = (!(!arg1));
-  uint64_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff));
-  // Note this line has been patched from the synthesized code to add value
-  // barriers.
-  //
-  // Clang recognizes this pattern as a select. While it usually transforms it
-  // to a cmov, it sometimes further transforms it into a branch, which we do
-  // not want.
-  uint64_t x3 = ((value_barrier_u64(x2) & arg3) | (value_barrier_u64(~x2) & arg2));
+static FIAT_25519_FIAT_INLINE void fiat_25519_cmovznz_u64(uint64_t* out1, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  fiat_25519_uint1 x1;
+  uint64_t x2;
+  uint64_t x3;
+  x1 = (!(!arg1));
+  x2 = ((fiat_25519_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff));
+  x3 = ((fiat_25519_value_barrier_u64(x2) & arg3) | (fiat_25519_value_barrier_u64((~x2)) & arg2));
   *out1 = x3;
 }
 
 /*
  * The function fiat_25519_carry_mul multiplies two field elements and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
- *   arg2: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  */
-static void fiat_25519_carry_mul(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) {
-  fiat_25519_uint128 x1 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[4]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x2 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[3]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x3 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[2]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x4 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[1]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x5 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[4]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x6 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[3]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x7 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[2]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x8 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[4]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[3]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[1]) * ((arg2[4]) * UINT8_C(0x13)));
-  fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[4]) * (arg2[0]));
-  fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[3]) * (arg2[1]));
-  fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[3]) * (arg2[0]));
-  fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg2[2]));
-  fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[2]) * (arg2[1]));
-  fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[2]) * (arg2[0]));
-  fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * (arg2[3]));
-  fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg2[2]));
-  fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[1]) * (arg2[1]));
-  fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[1]) * (arg2[0]));
-  fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * (arg2[4]));
-  fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * (arg2[3]));
-  fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg2[2]));
-  fiat_25519_uint128 x24 = ((fiat_25519_uint128)(arg1[0]) * (arg2[1]));
-  fiat_25519_uint128 x25 = ((fiat_25519_uint128)(arg1[0]) * (arg2[0]));
-  fiat_25519_uint128 x26 = (x25 + (x10 + (x9 + (x7 + x4))));
-  uint64_t x27 = (uint64_t)(x26 >> 51);
-  uint64_t x28 = (uint64_t)(x26 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x29 = (x21 + (x17 + (x14 + (x12 + x11))));
-  fiat_25519_uint128 x30 = (x22 + (x18 + (x15 + (x13 + x1))));
-  fiat_25519_uint128 x31 = (x23 + (x19 + (x16 + (x5 + x2))));
-  fiat_25519_uint128 x32 = (x24 + (x20 + (x8 + (x6 + x3))));
-  fiat_25519_uint128 x33 = (x27 + x32);
-  uint64_t x34 = (uint64_t)(x33 >> 51);
-  uint64_t x35 = (uint64_t)(x33 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x36 = (x34 + x31);
-  uint64_t x37 = (uint64_t)(x36 >> 51);
-  uint64_t x38 = (uint64_t)(x36 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x39 = (x37 + x30);
-  uint64_t x40 = (uint64_t)(x39 >> 51);
-  uint64_t x41 = (uint64_t)(x39 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x42 = (x40 + x29);
-  uint64_t x43 = (uint64_t)(x42 >> 51);
-  uint64_t x44 = (uint64_t)(x42 & UINT64_C(0x7ffffffffffff));
-  uint64_t x45 = (x43 * UINT8_C(0x13));
-  uint64_t x46 = (x28 + x45);
-  uint64_t x47 = (x46 >> 51);
-  uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff));
-  uint64_t x49 = (x47 + x35);
-  fiat_25519_uint1 x50 = (fiat_25519_uint1)(x49 >> 51);
-  uint64_t x51 = (x49 & UINT64_C(0x7ffffffffffff));
-  uint64_t x52 = (x50 + x38);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_mul(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1, const fiat_25519_loose_field_element arg2) {
+  fiat_25519_uint128 x1;
+  fiat_25519_uint128 x2;
+  fiat_25519_uint128 x3;
+  fiat_25519_uint128 x4;
+  fiat_25519_uint128 x5;
+  fiat_25519_uint128 x6;
+  fiat_25519_uint128 x7;
+  fiat_25519_uint128 x8;
+  fiat_25519_uint128 x9;
+  fiat_25519_uint128 x10;
+  fiat_25519_uint128 x11;
+  fiat_25519_uint128 x12;
+  fiat_25519_uint128 x13;
+  fiat_25519_uint128 x14;
+  fiat_25519_uint128 x15;
+  fiat_25519_uint128 x16;
+  fiat_25519_uint128 x17;
+  fiat_25519_uint128 x18;
+  fiat_25519_uint128 x19;
+  fiat_25519_uint128 x20;
+  fiat_25519_uint128 x21;
+  fiat_25519_uint128 x22;
+  fiat_25519_uint128 x23;
+  fiat_25519_uint128 x24;
+  fiat_25519_uint128 x25;
+  fiat_25519_uint128 x26;
+  uint64_t x27;
+  uint64_t x28;
+  fiat_25519_uint128 x29;
+  fiat_25519_uint128 x30;
+  fiat_25519_uint128 x31;
+  fiat_25519_uint128 x32;
+  fiat_25519_uint128 x33;
+  uint64_t x34;
+  uint64_t x35;
+  fiat_25519_uint128 x36;
+  uint64_t x37;
+  uint64_t x38;
+  fiat_25519_uint128 x39;
+  uint64_t x40;
+  uint64_t x41;
+  fiat_25519_uint128 x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  uint64_t x48;
+  uint64_t x49;
+  fiat_25519_uint1 x50;
+  uint64_t x51;
+  uint64_t x52;
+  x1 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[4]) * UINT8_C(0x13)));
+  x2 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[3]) * UINT8_C(0x13)));
+  x3 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[2]) * UINT8_C(0x13)));
+  x4 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[1]) * UINT8_C(0x13)));
+  x5 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[4]) * UINT8_C(0x13)));
+  x6 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[3]) * UINT8_C(0x13)));
+  x7 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[2]) * UINT8_C(0x13)));
+  x8 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[4]) * UINT8_C(0x13)));
+  x9 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[3]) * UINT8_C(0x13)));
+  x10 = ((fiat_25519_uint128)(arg1[1]) * ((arg2[4]) * UINT8_C(0x13)));
+  x11 = ((fiat_25519_uint128)(arg1[4]) * (arg2[0]));
+  x12 = ((fiat_25519_uint128)(arg1[3]) * (arg2[1]));
+  x13 = ((fiat_25519_uint128)(arg1[3]) * (arg2[0]));
+  x14 = ((fiat_25519_uint128)(arg1[2]) * (arg2[2]));
+  x15 = ((fiat_25519_uint128)(arg1[2]) * (arg2[1]));
+  x16 = ((fiat_25519_uint128)(arg1[2]) * (arg2[0]));
+  x17 = ((fiat_25519_uint128)(arg1[1]) * (arg2[3]));
+  x18 = ((fiat_25519_uint128)(arg1[1]) * (arg2[2]));
+  x19 = ((fiat_25519_uint128)(arg1[1]) * (arg2[1]));
+  x20 = ((fiat_25519_uint128)(arg1[1]) * (arg2[0]));
+  x21 = ((fiat_25519_uint128)(arg1[0]) * (arg2[4]));
+  x22 = ((fiat_25519_uint128)(arg1[0]) * (arg2[3]));
+  x23 = ((fiat_25519_uint128)(arg1[0]) * (arg2[2]));
+  x24 = ((fiat_25519_uint128)(arg1[0]) * (arg2[1]));
+  x25 = ((fiat_25519_uint128)(arg1[0]) * (arg2[0]));
+  x26 = (x25 + (x10 + (x9 + (x7 + x4))));
+  x27 = (uint64_t)(x26 >> 51);
+  x28 = (uint64_t)(x26 & UINT64_C(0x7ffffffffffff));
+  x29 = (x21 + (x17 + (x14 + (x12 + x11))));
+  x30 = (x22 + (x18 + (x15 + (x13 + x1))));
+  x31 = (x23 + (x19 + (x16 + (x5 + x2))));
+  x32 = (x24 + (x20 + (x8 + (x6 + x3))));
+  x33 = (x27 + x32);
+  x34 = (uint64_t)(x33 >> 51);
+  x35 = (uint64_t)(x33 & UINT64_C(0x7ffffffffffff));
+  x36 = (x34 + x31);
+  x37 = (uint64_t)(x36 >> 51);
+  x38 = (uint64_t)(x36 & UINT64_C(0x7ffffffffffff));
+  x39 = (x37 + x30);
+  x40 = (uint64_t)(x39 >> 51);
+  x41 = (uint64_t)(x39 & UINT64_C(0x7ffffffffffff));
+  x42 = (x40 + x29);
+  x43 = (uint64_t)(x42 >> 51);
+  x44 = (uint64_t)(x42 & UINT64_C(0x7ffffffffffff));
+  x45 = (x43 * UINT8_C(0x13));
+  x46 = (x28 + x45);
+  x47 = (x46 >> 51);
+  x48 = (x46 & UINT64_C(0x7ffffffffffff));
+  x49 = (x47 + x35);
+  x50 = (fiat_25519_uint1)(x49 >> 51);
+  x51 = (x49 & UINT64_C(0x7ffffffffffff));
+  x52 = (x50 + x38);
   out1[0] = x48;
   out1[1] = x51;
   out1[2] = x52;
@@ -161,65 +244,112 @@
 
 /*
  * The function fiat_25519_carry_square squares a field element and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * eval arg1) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  */
-static void fiat_25519_carry_square(uint64_t out1[5], const uint64_t arg1[5]) {
-  uint64_t x1 = ((arg1[4]) * UINT8_C(0x13));
-  uint64_t x2 = (x1 * 0x2);
-  uint64_t x3 = ((arg1[4]) * 0x2);
-  uint64_t x4 = ((arg1[3]) * UINT8_C(0x13));
-  uint64_t x5 = (x4 * 0x2);
-  uint64_t x6 = ((arg1[3]) * 0x2);
-  uint64_t x7 = ((arg1[2]) * 0x2);
-  uint64_t x8 = ((arg1[1]) * 0x2);
-  fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[4]) * x1);
-  fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[3]) * x2);
-  fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[3]) * x4);
-  fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[2]) * x2);
-  fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[2]) * x5);
-  fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg1[2]));
-  fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[1]) * x2);
-  fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[1]) * x6);
-  fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * x7);
-  fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg1[1]));
-  fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[0]) * x3);
-  fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[0]) * x6);
-  fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * x7);
-  fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * x8);
-  fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg1[0]));
-  fiat_25519_uint128 x24 = (x23 + (x15 + x13));
-  uint64_t x25 = (uint64_t)(x24 >> 51);
-  uint64_t x26 = (uint64_t)(x24 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x27 = (x19 + (x16 + x14));
-  fiat_25519_uint128 x28 = (x20 + (x17 + x9));
-  fiat_25519_uint128 x29 = (x21 + (x18 + x10));
-  fiat_25519_uint128 x30 = (x22 + (x12 + x11));
-  fiat_25519_uint128 x31 = (x25 + x30);
-  uint64_t x32 = (uint64_t)(x31 >> 51);
-  uint64_t x33 = (uint64_t)(x31 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x34 = (x32 + x29);
-  uint64_t x35 = (uint64_t)(x34 >> 51);
-  uint64_t x36 = (uint64_t)(x34 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x37 = (x35 + x28);
-  uint64_t x38 = (uint64_t)(x37 >> 51);
-  uint64_t x39 = (uint64_t)(x37 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x40 = (x38 + x27);
-  uint64_t x41 = (uint64_t)(x40 >> 51);
-  uint64_t x42 = (uint64_t)(x40 & UINT64_C(0x7ffffffffffff));
-  uint64_t x43 = (x41 * UINT8_C(0x13));
-  uint64_t x44 = (x26 + x43);
-  uint64_t x45 = (x44 >> 51);
-  uint64_t x46 = (x44 & UINT64_C(0x7ffffffffffff));
-  uint64_t x47 = (x45 + x33);
-  fiat_25519_uint1 x48 = (fiat_25519_uint1)(x47 >> 51);
-  uint64_t x49 = (x47 & UINT64_C(0x7ffffffffffff));
-  uint64_t x50 = (x48 + x36);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_square(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  fiat_25519_uint128 x9;
+  fiat_25519_uint128 x10;
+  fiat_25519_uint128 x11;
+  fiat_25519_uint128 x12;
+  fiat_25519_uint128 x13;
+  fiat_25519_uint128 x14;
+  fiat_25519_uint128 x15;
+  fiat_25519_uint128 x16;
+  fiat_25519_uint128 x17;
+  fiat_25519_uint128 x18;
+  fiat_25519_uint128 x19;
+  fiat_25519_uint128 x20;
+  fiat_25519_uint128 x21;
+  fiat_25519_uint128 x22;
+  fiat_25519_uint128 x23;
+  fiat_25519_uint128 x24;
+  uint64_t x25;
+  uint64_t x26;
+  fiat_25519_uint128 x27;
+  fiat_25519_uint128 x28;
+  fiat_25519_uint128 x29;
+  fiat_25519_uint128 x30;
+  fiat_25519_uint128 x31;
+  uint64_t x32;
+  uint64_t x33;
+  fiat_25519_uint128 x34;
+  uint64_t x35;
+  uint64_t x36;
+  fiat_25519_uint128 x37;
+  uint64_t x38;
+  uint64_t x39;
+  fiat_25519_uint128 x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  fiat_25519_uint1 x48;
+  uint64_t x49;
+  uint64_t x50;
+  x1 = ((arg1[4]) * UINT8_C(0x13));
+  x2 = (x1 * 0x2);
+  x3 = ((arg1[4]) * 0x2);
+  x4 = ((arg1[3]) * UINT8_C(0x13));
+  x5 = (x4 * 0x2);
+  x6 = ((arg1[3]) * 0x2);
+  x7 = ((arg1[2]) * 0x2);
+  x8 = ((arg1[1]) * 0x2);
+  x9 = ((fiat_25519_uint128)(arg1[4]) * x1);
+  x10 = ((fiat_25519_uint128)(arg1[3]) * x2);
+  x11 = ((fiat_25519_uint128)(arg1[3]) * x4);
+  x12 = ((fiat_25519_uint128)(arg1[2]) * x2);
+  x13 = ((fiat_25519_uint128)(arg1[2]) * x5);
+  x14 = ((fiat_25519_uint128)(arg1[2]) * (arg1[2]));
+  x15 = ((fiat_25519_uint128)(arg1[1]) * x2);
+  x16 = ((fiat_25519_uint128)(arg1[1]) * x6);
+  x17 = ((fiat_25519_uint128)(arg1[1]) * x7);
+  x18 = ((fiat_25519_uint128)(arg1[1]) * (arg1[1]));
+  x19 = ((fiat_25519_uint128)(arg1[0]) * x3);
+  x20 = ((fiat_25519_uint128)(arg1[0]) * x6);
+  x21 = ((fiat_25519_uint128)(arg1[0]) * x7);
+  x22 = ((fiat_25519_uint128)(arg1[0]) * x8);
+  x23 = ((fiat_25519_uint128)(arg1[0]) * (arg1[0]));
+  x24 = (x23 + (x15 + x13));
+  x25 = (uint64_t)(x24 >> 51);
+  x26 = (uint64_t)(x24 & UINT64_C(0x7ffffffffffff));
+  x27 = (x19 + (x16 + x14));
+  x28 = (x20 + (x17 + x9));
+  x29 = (x21 + (x18 + x10));
+  x30 = (x22 + (x12 + x11));
+  x31 = (x25 + x30);
+  x32 = (uint64_t)(x31 >> 51);
+  x33 = (uint64_t)(x31 & UINT64_C(0x7ffffffffffff));
+  x34 = (x32 + x29);
+  x35 = (uint64_t)(x34 >> 51);
+  x36 = (uint64_t)(x34 & UINT64_C(0x7ffffffffffff));
+  x37 = (x35 + x28);
+  x38 = (uint64_t)(x37 >> 51);
+  x39 = (uint64_t)(x37 & UINT64_C(0x7ffffffffffff));
+  x40 = (x38 + x27);
+  x41 = (uint64_t)(x40 >> 51);
+  x42 = (uint64_t)(x40 & UINT64_C(0x7ffffffffffff));
+  x43 = (x41 * UINT8_C(0x13));
+  x44 = (x26 + x43);
+  x45 = (x44 >> 51);
+  x46 = (x44 & UINT64_C(0x7ffffffffffff));
+  x47 = (x45 + x33);
+  x48 = (fiat_25519_uint1)(x47 >> 51);
+  x49 = (x47 & UINT64_C(0x7ffffffffffff));
+  x50 = (x48 + x36);
   out1[0] = x46;
   out1[1] = x49;
   out1[2] = x50;
@@ -229,27 +359,36 @@
 
 /*
  * The function fiat_25519_carry reduces a field element.
+ *
  * Postconditions:
  *   eval out1 mod m = eval arg1 mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  */
-static void fiat_25519_carry(uint64_t out1[5], const uint64_t arg1[5]) {
-  uint64_t x1 = (arg1[0]);
-  uint64_t x2 = ((x1 >> 51) + (arg1[1]));
-  uint64_t x3 = ((x2 >> 51) + (arg1[2]));
-  uint64_t x4 = ((x3 >> 51) + (arg1[3]));
-  uint64_t x5 = ((x4 >> 51) + (arg1[4]));
-  uint64_t x6 = ((x1 & UINT64_C(0x7ffffffffffff)) + ((x5 >> 51) * UINT8_C(0x13)));
-  uint64_t x7 = ((fiat_25519_uint1)(x6 >> 51) + (x2 & UINT64_C(0x7ffffffffffff)));
-  uint64_t x8 = (x6 & UINT64_C(0x7ffffffffffff));
-  uint64_t x9 = (x7 & UINT64_C(0x7ffffffffffff));
-  uint64_t x10 = ((fiat_25519_uint1)(x7 >> 51) + (x3 & UINT64_C(0x7ffffffffffff)));
-  uint64_t x11 = (x4 & UINT64_C(0x7ffffffffffff));
-  uint64_t x12 = (x5 & UINT64_C(0x7ffffffffffff));
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  x1 = (arg1[0]);
+  x2 = ((x1 >> 51) + (arg1[1]));
+  x3 = ((x2 >> 51) + (arg1[2]));
+  x4 = ((x3 >> 51) + (arg1[3]));
+  x5 = ((x4 >> 51) + (arg1[4]));
+  x6 = ((x1 & UINT64_C(0x7ffffffffffff)) + ((x5 >> 51) * UINT8_C(0x13)));
+  x7 = ((fiat_25519_uint1)(x6 >> 51) + (x2 & UINT64_C(0x7ffffffffffff)));
+  x8 = (x6 & UINT64_C(0x7ffffffffffff));
+  x9 = (x7 & UINT64_C(0x7ffffffffffff));
+  x10 = ((fiat_25519_uint1)(x7 >> 51) + (x3 & UINT64_C(0x7ffffffffffff)));
+  x11 = (x4 & UINT64_C(0x7ffffffffffff));
+  x12 = (x5 & UINT64_C(0x7ffffffffffff));
   out1[0] = x8;
   out1[1] = x9;
   out1[2] = x10;
@@ -259,21 +398,22 @@
 
 /*
  * The function fiat_25519_add adds two field elements.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 + eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
- *   arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
  */
-static void fiat_25519_add(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) {
-  uint64_t x1 = ((arg1[0]) + (arg2[0]));
-  uint64_t x2 = ((arg1[1]) + (arg2[1]));
-  uint64_t x3 = ((arg1[2]) + (arg2[2]));
-  uint64_t x4 = ((arg1[3]) + (arg2[3]));
-  uint64_t x5 = ((arg1[4]) + (arg2[4]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_add(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  x1 = ((arg1[0]) + (arg2[0]));
+  x2 = ((arg1[1]) + (arg2[1]));
+  x3 = ((arg1[2]) + (arg2[2]));
+  x4 = ((arg1[3]) + (arg2[3]));
+  x5 = ((arg1[4]) + (arg2[4]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -283,21 +423,22 @@
 
 /*
  * The function fiat_25519_sub subtracts two field elements.
+ *
  * Postconditions:
  *   eval out1 mod m = (eval arg1 - eval arg2) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
- *   arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
  */
-static void fiat_25519_sub(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) {
-  uint64_t x1 = ((UINT64_C(0xfffffffffffda) + (arg1[0])) - (arg2[0]));
-  uint64_t x2 = ((UINT64_C(0xffffffffffffe) + (arg1[1])) - (arg2[1]));
-  uint64_t x3 = ((UINT64_C(0xffffffffffffe) + (arg1[2])) - (arg2[2]));
-  uint64_t x4 = ((UINT64_C(0xffffffffffffe) + (arg1[3])) - (arg2[3]));
-  uint64_t x5 = ((UINT64_C(0xffffffffffffe) + (arg1[4])) - (arg2[4]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_sub(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  x1 = ((UINT64_C(0xfffffffffffda) + (arg1[0])) - (arg2[0]));
+  x2 = ((UINT64_C(0xffffffffffffe) + (arg1[1])) - (arg2[1]));
+  x3 = ((UINT64_C(0xffffffffffffe) + (arg1[2])) - (arg2[2]));
+  x4 = ((UINT64_C(0xffffffffffffe) + (arg1[3])) - (arg2[3]));
+  x5 = ((UINT64_C(0xffffffffffffe) + (arg1[4])) - (arg2[4]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -307,20 +448,22 @@
 
 /*
  * The function fiat_25519_opp negates a field element.
+ *
  * Postconditions:
  *   eval out1 mod m = -eval arg1 mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
  */
-static void fiat_25519_opp(uint64_t out1[5], const uint64_t arg1[5]) {
-  uint64_t x1 = (UINT64_C(0xfffffffffffda) - (arg1[0]));
-  uint64_t x2 = (UINT64_C(0xffffffffffffe) - (arg1[1]));
-  uint64_t x3 = (UINT64_C(0xffffffffffffe) - (arg1[2]));
-  uint64_t x4 = (UINT64_C(0xffffffffffffe) - (arg1[3]));
-  uint64_t x5 = (UINT64_C(0xffffffffffffe) - (arg1[4]));
+static FIAT_25519_FIAT_INLINE void fiat_25519_opp(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  x1 = (UINT64_C(0xfffffffffffda) - (arg1[0]));
+  x2 = (UINT64_C(0xffffffffffffe) - (arg1[1]));
+  x3 = (UINT64_C(0xffffffffffffe) - (arg1[2]));
+  x4 = (UINT64_C(0xffffffffffffe) - (arg1[3]));
+  x5 = (UINT64_C(0xffffffffffffe) - (arg1[4]));
   out1[0] = x1;
   out1[1] = x2;
   out1[2] = x3;
@@ -330,6 +473,7 @@
 
 /*
  * The function fiat_25519_selectznz is a multi-limb conditional select.
+ *
  * Postconditions:
  *   eval out1 = (if arg1 = 0 then eval arg2 else eval arg3)
  *
@@ -340,16 +484,16 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_25519_selectznz(uint64_t out1[5], fiat_25519_uint1 arg1, const uint64_t arg2[5], const uint64_t arg3[5]) {
+static FIAT_25519_FIAT_INLINE void fiat_25519_selectznz(uint64_t out1[5], fiat_25519_uint1 arg1, const uint64_t arg2[5], const uint64_t arg3[5]) {
   uint64_t x1;
-  fiat_25519_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0]));
   uint64_t x2;
-  fiat_25519_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1]));
   uint64_t x3;
-  fiat_25519_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2]));
   uint64_t x4;
-  fiat_25519_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3]));
   uint64_t x5;
+  fiat_25519_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0]));
+  fiat_25519_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1]));
+  fiat_25519_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2]));
+  fiat_25519_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3]));
   fiat_25519_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4]));
   out1[0] = x1;
   out1[1] = x2;
@@ -360,260 +504,469 @@
 
 /*
  * The function fiat_25519_to_bytes serializes a field element to bytes in little-endian order.
+ *
  * Postconditions:
  *   out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31]
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  * Output Bounds:
  *   out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]]
  */
-static void fiat_25519_to_bytes(uint8_t out1[32], const uint64_t arg1[5]) {
+static FIAT_25519_FIAT_INLINE void fiat_25519_to_bytes(uint8_t out1[32], const fiat_25519_tight_field_element arg1) {
   uint64_t x1;
   fiat_25519_uint1 x2;
-  fiat_25519_subborrowx_u51(&x1, &x2, 0x0, (arg1[0]), UINT64_C(0x7ffffffffffed));
   uint64_t x3;
   fiat_25519_uint1 x4;
-  fiat_25519_subborrowx_u51(&x3, &x4, x2, (arg1[1]), UINT64_C(0x7ffffffffffff));
   uint64_t x5;
   fiat_25519_uint1 x6;
-  fiat_25519_subborrowx_u51(&x5, &x6, x4, (arg1[2]), UINT64_C(0x7ffffffffffff));
   uint64_t x7;
   fiat_25519_uint1 x8;
-  fiat_25519_subborrowx_u51(&x7, &x8, x6, (arg1[3]), UINT64_C(0x7ffffffffffff));
   uint64_t x9;
   fiat_25519_uint1 x10;
-  fiat_25519_subborrowx_u51(&x9, &x10, x8, (arg1[4]), UINT64_C(0x7ffffffffffff));
   uint64_t x11;
-  fiat_25519_cmovznz_u64(&x11, x10, 0x0, UINT64_C(0xffffffffffffffff));
   uint64_t x12;
   fiat_25519_uint1 x13;
-  fiat_25519_addcarryx_u51(&x12, &x13, 0x0, x1, (x11 & UINT64_C(0x7ffffffffffed)));
   uint64_t x14;
   fiat_25519_uint1 x15;
-  fiat_25519_addcarryx_u51(&x14, &x15, x13, x3, (x11 & UINT64_C(0x7ffffffffffff)));
   uint64_t x16;
   fiat_25519_uint1 x17;
-  fiat_25519_addcarryx_u51(&x16, &x17, x15, x5, (x11 & UINT64_C(0x7ffffffffffff)));
   uint64_t x18;
   fiat_25519_uint1 x19;
-  fiat_25519_addcarryx_u51(&x18, &x19, x17, x7, (x11 & UINT64_C(0x7ffffffffffff)));
   uint64_t x20;
   fiat_25519_uint1 x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  uint8_t x26;
+  uint64_t x27;
+  uint8_t x28;
+  uint64_t x29;
+  uint8_t x30;
+  uint64_t x31;
+  uint8_t x32;
+  uint64_t x33;
+  uint8_t x34;
+  uint64_t x35;
+  uint8_t x36;
+  uint8_t x37;
+  uint64_t x38;
+  uint8_t x39;
+  uint64_t x40;
+  uint8_t x41;
+  uint64_t x42;
+  uint8_t x43;
+  uint64_t x44;
+  uint8_t x45;
+  uint64_t x46;
+  uint8_t x47;
+  uint64_t x48;
+  uint8_t x49;
+  uint8_t x50;
+  uint64_t x51;
+  uint8_t x52;
+  uint64_t x53;
+  uint8_t x54;
+  uint64_t x55;
+  uint8_t x56;
+  uint64_t x57;
+  uint8_t x58;
+  uint64_t x59;
+  uint8_t x60;
+  uint64_t x61;
+  uint8_t x62;
+  uint64_t x63;
+  uint8_t x64;
+  fiat_25519_uint1 x65;
+  uint64_t x66;
+  uint8_t x67;
+  uint64_t x68;
+  uint8_t x69;
+  uint64_t x70;
+  uint8_t x71;
+  uint64_t x72;
+  uint8_t x73;
+  uint64_t x74;
+  uint8_t x75;
+  uint64_t x76;
+  uint8_t x77;
+  uint8_t x78;
+  uint64_t x79;
+  uint8_t x80;
+  uint64_t x81;
+  uint8_t x82;
+  uint64_t x83;
+  uint8_t x84;
+  uint64_t x85;
+  uint8_t x86;
+  uint64_t x87;
+  uint8_t x88;
+  uint64_t x89;
+  uint8_t x90;
+  uint8_t x91;
+  fiat_25519_subborrowx_u51(&x1, &x2, 0x0, (arg1[0]), UINT64_C(0x7ffffffffffed));
+  fiat_25519_subborrowx_u51(&x3, &x4, x2, (arg1[1]), UINT64_C(0x7ffffffffffff));
+  fiat_25519_subborrowx_u51(&x5, &x6, x4, (arg1[2]), UINT64_C(0x7ffffffffffff));
+  fiat_25519_subborrowx_u51(&x7, &x8, x6, (arg1[3]), UINT64_C(0x7ffffffffffff));
+  fiat_25519_subborrowx_u51(&x9, &x10, x8, (arg1[4]), UINT64_C(0x7ffffffffffff));
+  fiat_25519_cmovznz_u64(&x11, x10, 0x0, UINT64_C(0xffffffffffffffff));
+  fiat_25519_addcarryx_u51(&x12, &x13, 0x0, x1, (x11 & UINT64_C(0x7ffffffffffed)));
+  fiat_25519_addcarryx_u51(&x14, &x15, x13, x3, (x11 & UINT64_C(0x7ffffffffffff)));
+  fiat_25519_addcarryx_u51(&x16, &x17, x15, x5, (x11 & UINT64_C(0x7ffffffffffff)));
+  fiat_25519_addcarryx_u51(&x18, &x19, x17, x7, (x11 & UINT64_C(0x7ffffffffffff)));
   fiat_25519_addcarryx_u51(&x20, &x21, x19, x9, (x11 & UINT64_C(0x7ffffffffffff)));
-  uint64_t x22 = (x20 << 4);
-  uint64_t x23 = (x18 * (uint64_t)0x2);
-  uint64_t x24 = (x16 << 6);
-  uint64_t x25 = (x14 << 3);
-  uint64_t x26 = (x12 >> 8);
-  uint8_t x27 = (uint8_t)(x12 & UINT8_C(0xff));
-  uint64_t x28 = (x26 >> 8);
-  uint8_t x29 = (uint8_t)(x26 & UINT8_C(0xff));
-  uint64_t x30 = (x28 >> 8);
-  uint8_t x31 = (uint8_t)(x28 & UINT8_C(0xff));
-  uint64_t x32 = (x30 >> 8);
-  uint8_t x33 = (uint8_t)(x30 & UINT8_C(0xff));
-  uint64_t x34 = (x32 >> 8);
-  uint8_t x35 = (uint8_t)(x32 & UINT8_C(0xff));
-  uint8_t x36 = (uint8_t)(x34 >> 8);
-  uint8_t x37 = (uint8_t)(x34 & UINT8_C(0xff));
-  uint64_t x38 = (x36 + x25);
-  uint64_t x39 = (x38 >> 8);
-  uint8_t x40 = (uint8_t)(x38 & UINT8_C(0xff));
-  uint64_t x41 = (x39 >> 8);
-  uint8_t x42 = (uint8_t)(x39 & UINT8_C(0xff));
-  uint64_t x43 = (x41 >> 8);
-  uint8_t x44 = (uint8_t)(x41 & UINT8_C(0xff));
-  uint64_t x45 = (x43 >> 8);
-  uint8_t x46 = (uint8_t)(x43 & UINT8_C(0xff));
-  uint64_t x47 = (x45 >> 8);
-  uint8_t x48 = (uint8_t)(x45 & UINT8_C(0xff));
-  uint8_t x49 = (uint8_t)(x47 >> 8);
-  uint8_t x50 = (uint8_t)(x47 & UINT8_C(0xff));
-  uint64_t x51 = (x49 + x24);
-  uint64_t x52 = (x51 >> 8);
-  uint8_t x53 = (uint8_t)(x51 & UINT8_C(0xff));
-  uint64_t x54 = (x52 >> 8);
-  uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff));
-  uint64_t x56 = (x54 >> 8);
-  uint8_t x57 = (uint8_t)(x54 & UINT8_C(0xff));
-  uint64_t x58 = (x56 >> 8);
-  uint8_t x59 = (uint8_t)(x56 & UINT8_C(0xff));
-  uint64_t x60 = (x58 >> 8);
-  uint8_t x61 = (uint8_t)(x58 & UINT8_C(0xff));
-  uint64_t x62 = (x60 >> 8);
-  uint8_t x63 = (uint8_t)(x60 & UINT8_C(0xff));
-  fiat_25519_uint1 x64 = (fiat_25519_uint1)(x62 >> 8);
-  uint8_t x65 = (uint8_t)(x62 & UINT8_C(0xff));
-  uint64_t x66 = (x64 + x23);
-  uint64_t x67 = (x66 >> 8);
-  uint8_t x68 = (uint8_t)(x66 & UINT8_C(0xff));
-  uint64_t x69 = (x67 >> 8);
-  uint8_t x70 = (uint8_t)(x67 & UINT8_C(0xff));
-  uint64_t x71 = (x69 >> 8);
-  uint8_t x72 = (uint8_t)(x69 & UINT8_C(0xff));
-  uint64_t x73 = (x71 >> 8);
-  uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff));
-  uint64_t x75 = (x73 >> 8);
-  uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff));
-  uint8_t x77 = (uint8_t)(x75 >> 8);
-  uint8_t x78 = (uint8_t)(x75 & UINT8_C(0xff));
-  uint64_t x79 = (x77 + x22);
-  uint64_t x80 = (x79 >> 8);
-  uint8_t x81 = (uint8_t)(x79 & UINT8_C(0xff));
-  uint64_t x82 = (x80 >> 8);
-  uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff));
-  uint64_t x84 = (x82 >> 8);
-  uint8_t x85 = (uint8_t)(x82 & UINT8_C(0xff));
-  uint64_t x86 = (x84 >> 8);
-  uint8_t x87 = (uint8_t)(x84 & UINT8_C(0xff));
-  uint64_t x88 = (x86 >> 8);
-  uint8_t x89 = (uint8_t)(x86 & UINT8_C(0xff));
-  uint8_t x90 = (uint8_t)(x88 >> 8);
-  uint8_t x91 = (uint8_t)(x88 & UINT8_C(0xff));
-  out1[0] = x27;
-  out1[1] = x29;
-  out1[2] = x31;
-  out1[3] = x33;
-  out1[4] = x35;
-  out1[5] = x37;
-  out1[6] = x40;
-  out1[7] = x42;
-  out1[8] = x44;
-  out1[9] = x46;
-  out1[10] = x48;
-  out1[11] = x50;
-  out1[12] = x53;
-  out1[13] = x55;
-  out1[14] = x57;
-  out1[15] = x59;
-  out1[16] = x61;
-  out1[17] = x63;
-  out1[18] = x65;
-  out1[19] = x68;
-  out1[20] = x70;
-  out1[21] = x72;
-  out1[22] = x74;
-  out1[23] = x76;
-  out1[24] = x78;
-  out1[25] = x81;
-  out1[26] = x83;
-  out1[27] = x85;
-  out1[28] = x87;
-  out1[29] = x89;
-  out1[30] = x91;
-  out1[31] = x90;
+  x22 = (x20 << 4);
+  x23 = (x18 * (uint64_t)0x2);
+  x24 = (x16 << 6);
+  x25 = (x14 << 3);
+  x26 = (uint8_t)(x12 & UINT8_C(0xff));
+  x27 = (x12 >> 8);
+  x28 = (uint8_t)(x27 & UINT8_C(0xff));
+  x29 = (x27 >> 8);
+  x30 = (uint8_t)(x29 & UINT8_C(0xff));
+  x31 = (x29 >> 8);
+  x32 = (uint8_t)(x31 & UINT8_C(0xff));
+  x33 = (x31 >> 8);
+  x34 = (uint8_t)(x33 & UINT8_C(0xff));
+  x35 = (x33 >> 8);
+  x36 = (uint8_t)(x35 & UINT8_C(0xff));
+  x37 = (uint8_t)(x35 >> 8);
+  x38 = (x25 + (uint64_t)x37);
+  x39 = (uint8_t)(x38 & UINT8_C(0xff));
+  x40 = (x38 >> 8);
+  x41 = (uint8_t)(x40 & UINT8_C(0xff));
+  x42 = (x40 >> 8);
+  x43 = (uint8_t)(x42 & UINT8_C(0xff));
+  x44 = (x42 >> 8);
+  x45 = (uint8_t)(x44 & UINT8_C(0xff));
+  x46 = (x44 >> 8);
+  x47 = (uint8_t)(x46 & UINT8_C(0xff));
+  x48 = (x46 >> 8);
+  x49 = (uint8_t)(x48 & UINT8_C(0xff));
+  x50 = (uint8_t)(x48 >> 8);
+  x51 = (x24 + (uint64_t)x50);
+  x52 = (uint8_t)(x51 & UINT8_C(0xff));
+  x53 = (x51 >> 8);
+  x54 = (uint8_t)(x53 & UINT8_C(0xff));
+  x55 = (x53 >> 8);
+  x56 = (uint8_t)(x55 & UINT8_C(0xff));
+  x57 = (x55 >> 8);
+  x58 = (uint8_t)(x57 & UINT8_C(0xff));
+  x59 = (x57 >> 8);
+  x60 = (uint8_t)(x59 & UINT8_C(0xff));
+  x61 = (x59 >> 8);
+  x62 = (uint8_t)(x61 & UINT8_C(0xff));
+  x63 = (x61 >> 8);
+  x64 = (uint8_t)(x63 & UINT8_C(0xff));
+  x65 = (fiat_25519_uint1)(x63 >> 8);
+  x66 = (x23 + (uint64_t)x65);
+  x67 = (uint8_t)(x66 & UINT8_C(0xff));
+  x68 = (x66 >> 8);
+  x69 = (uint8_t)(x68 & UINT8_C(0xff));
+  x70 = (x68 >> 8);
+  x71 = (uint8_t)(x70 & UINT8_C(0xff));
+  x72 = (x70 >> 8);
+  x73 = (uint8_t)(x72 & UINT8_C(0xff));
+  x74 = (x72 >> 8);
+  x75 = (uint8_t)(x74 & UINT8_C(0xff));
+  x76 = (x74 >> 8);
+  x77 = (uint8_t)(x76 & UINT8_C(0xff));
+  x78 = (uint8_t)(x76 >> 8);
+  x79 = (x22 + (uint64_t)x78);
+  x80 = (uint8_t)(x79 & UINT8_C(0xff));
+  x81 = (x79 >> 8);
+  x82 = (uint8_t)(x81 & UINT8_C(0xff));
+  x83 = (x81 >> 8);
+  x84 = (uint8_t)(x83 & UINT8_C(0xff));
+  x85 = (x83 >> 8);
+  x86 = (uint8_t)(x85 & UINT8_C(0xff));
+  x87 = (x85 >> 8);
+  x88 = (uint8_t)(x87 & UINT8_C(0xff));
+  x89 = (x87 >> 8);
+  x90 = (uint8_t)(x89 & UINT8_C(0xff));
+  x91 = (uint8_t)(x89 >> 8);
+  out1[0] = x26;
+  out1[1] = x28;
+  out1[2] = x30;
+  out1[3] = x32;
+  out1[4] = x34;
+  out1[5] = x36;
+  out1[6] = x39;
+  out1[7] = x41;
+  out1[8] = x43;
+  out1[9] = x45;
+  out1[10] = x47;
+  out1[11] = x49;
+  out1[12] = x52;
+  out1[13] = x54;
+  out1[14] = x56;
+  out1[15] = x58;
+  out1[16] = x60;
+  out1[17] = x62;
+  out1[18] = x64;
+  out1[19] = x67;
+  out1[20] = x69;
+  out1[21] = x71;
+  out1[22] = x73;
+  out1[23] = x75;
+  out1[24] = x77;
+  out1[25] = x80;
+  out1[26] = x82;
+  out1[27] = x84;
+  out1[28] = x86;
+  out1[29] = x88;
+  out1[30] = x90;
+  out1[31] = x91;
 }
 
 /*
  * The function fiat_25519_from_bytes deserializes a field element from bytes in little-endian order.
+ *
  * Postconditions:
  *   eval out1 mod m = bytes_eval arg1 mod m
  *
  * Input Bounds:
  *   arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  */
-static void fiat_25519_from_bytes(uint64_t out1[5], const uint8_t arg1[32]) {
-  uint64_t x1 = ((uint64_t)(arg1[31]) << 44);
-  uint64_t x2 = ((uint64_t)(arg1[30]) << 36);
-  uint64_t x3 = ((uint64_t)(arg1[29]) << 28);
-  uint64_t x4 = ((uint64_t)(arg1[28]) << 20);
-  uint64_t x5 = ((uint64_t)(arg1[27]) << 12);
-  uint64_t x6 = ((uint64_t)(arg1[26]) << 4);
-  uint64_t x7 = ((uint64_t)(arg1[25]) << 47);
-  uint64_t x8 = ((uint64_t)(arg1[24]) << 39);
-  uint64_t x9 = ((uint64_t)(arg1[23]) << 31);
-  uint64_t x10 = ((uint64_t)(arg1[22]) << 23);
-  uint64_t x11 = ((uint64_t)(arg1[21]) << 15);
-  uint64_t x12 = ((uint64_t)(arg1[20]) << 7);
-  uint64_t x13 = ((uint64_t)(arg1[19]) << 50);
-  uint64_t x14 = ((uint64_t)(arg1[18]) << 42);
-  uint64_t x15 = ((uint64_t)(arg1[17]) << 34);
-  uint64_t x16 = ((uint64_t)(arg1[16]) << 26);
-  uint64_t x17 = ((uint64_t)(arg1[15]) << 18);
-  uint64_t x18 = ((uint64_t)(arg1[14]) << 10);
-  uint64_t x19 = ((uint64_t)(arg1[13]) << 2);
-  uint64_t x20 = ((uint64_t)(arg1[12]) << 45);
-  uint64_t x21 = ((uint64_t)(arg1[11]) << 37);
-  uint64_t x22 = ((uint64_t)(arg1[10]) << 29);
-  uint64_t x23 = ((uint64_t)(arg1[9]) << 21);
-  uint64_t x24 = ((uint64_t)(arg1[8]) << 13);
-  uint64_t x25 = ((uint64_t)(arg1[7]) << 5);
-  uint64_t x26 = ((uint64_t)(arg1[6]) << 48);
-  uint64_t x27 = ((uint64_t)(arg1[5]) << 40);
-  uint64_t x28 = ((uint64_t)(arg1[4]) << 32);
-  uint64_t x29 = ((uint64_t)(arg1[3]) << 24);
-  uint64_t x30 = ((uint64_t)(arg1[2]) << 16);
-  uint64_t x31 = ((uint64_t)(arg1[1]) << 8);
-  uint8_t x32 = (arg1[0]);
-  uint64_t x33 = (x32 + (x31 + (x30 + (x29 + (x28 + (x27 + x26))))));
-  uint8_t x34 = (uint8_t)(x33 >> 51);
-  uint64_t x35 = (x33 & UINT64_C(0x7ffffffffffff));
-  uint64_t x36 = (x6 + (x5 + (x4 + (x3 + (x2 + x1)))));
-  uint64_t x37 = (x12 + (x11 + (x10 + (x9 + (x8 + x7)))));
-  uint64_t x38 = (x19 + (x18 + (x17 + (x16 + (x15 + (x14 + x13))))));
-  uint64_t x39 = (x25 + (x24 + (x23 + (x22 + (x21 + x20)))));
-  uint64_t x40 = (x34 + x39);
-  uint8_t x41 = (uint8_t)(x40 >> 51);
-  uint64_t x42 = (x40 & UINT64_C(0x7ffffffffffff));
-  uint64_t x43 = (x41 + x38);
-  uint8_t x44 = (uint8_t)(x43 >> 51);
-  uint64_t x45 = (x43 & UINT64_C(0x7ffffffffffff));
-  uint64_t x46 = (x44 + x37);
-  uint8_t x47 = (uint8_t)(x46 >> 51);
-  uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff));
-  uint64_t x49 = (x47 + x36);
-  out1[0] = x35;
-  out1[1] = x42;
-  out1[2] = x45;
-  out1[3] = x48;
-  out1[4] = x49;
+static FIAT_25519_FIAT_INLINE void fiat_25519_from_bytes(fiat_25519_tight_field_element out1, const uint8_t arg1[32]) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  uint64_t x13;
+  uint64_t x14;
+  uint64_t x15;
+  uint64_t x16;
+  uint64_t x17;
+  uint64_t x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  uint64_t x26;
+  uint64_t x27;
+  uint64_t x28;
+  uint64_t x29;
+  uint64_t x30;
+  uint64_t x31;
+  uint8_t x32;
+  uint64_t x33;
+  uint64_t x34;
+  uint64_t x35;
+  uint64_t x36;
+  uint64_t x37;
+  uint64_t x38;
+  uint64_t x39;
+  uint8_t x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  uint8_t x48;
+  uint64_t x49;
+  uint64_t x50;
+  uint64_t x51;
+  uint64_t x52;
+  uint64_t x53;
+  uint64_t x54;
+  uint64_t x55;
+  uint64_t x56;
+  uint8_t x57;
+  uint64_t x58;
+  uint64_t x59;
+  uint64_t x60;
+  uint64_t x61;
+  uint64_t x62;
+  uint64_t x63;
+  uint64_t x64;
+  uint8_t x65;
+  uint64_t x66;
+  uint64_t x67;
+  uint64_t x68;
+  uint64_t x69;
+  uint64_t x70;
+  uint64_t x71;
+  x1 = ((uint64_t)(arg1[31]) << 44);
+  x2 = ((uint64_t)(arg1[30]) << 36);
+  x3 = ((uint64_t)(arg1[29]) << 28);
+  x4 = ((uint64_t)(arg1[28]) << 20);
+  x5 = ((uint64_t)(arg1[27]) << 12);
+  x6 = ((uint64_t)(arg1[26]) << 4);
+  x7 = ((uint64_t)(arg1[25]) << 47);
+  x8 = ((uint64_t)(arg1[24]) << 39);
+  x9 = ((uint64_t)(arg1[23]) << 31);
+  x10 = ((uint64_t)(arg1[22]) << 23);
+  x11 = ((uint64_t)(arg1[21]) << 15);
+  x12 = ((uint64_t)(arg1[20]) << 7);
+  x13 = ((uint64_t)(arg1[19]) << 50);
+  x14 = ((uint64_t)(arg1[18]) << 42);
+  x15 = ((uint64_t)(arg1[17]) << 34);
+  x16 = ((uint64_t)(arg1[16]) << 26);
+  x17 = ((uint64_t)(arg1[15]) << 18);
+  x18 = ((uint64_t)(arg1[14]) << 10);
+  x19 = ((uint64_t)(arg1[13]) << 2);
+  x20 = ((uint64_t)(arg1[12]) << 45);
+  x21 = ((uint64_t)(arg1[11]) << 37);
+  x22 = ((uint64_t)(arg1[10]) << 29);
+  x23 = ((uint64_t)(arg1[9]) << 21);
+  x24 = ((uint64_t)(arg1[8]) << 13);
+  x25 = ((uint64_t)(arg1[7]) << 5);
+  x26 = ((uint64_t)(arg1[6]) << 48);
+  x27 = ((uint64_t)(arg1[5]) << 40);
+  x28 = ((uint64_t)(arg1[4]) << 32);
+  x29 = ((uint64_t)(arg1[3]) << 24);
+  x30 = ((uint64_t)(arg1[2]) << 16);
+  x31 = ((uint64_t)(arg1[1]) << 8);
+  x32 = (arg1[0]);
+  x33 = (x31 + (uint64_t)x32);
+  x34 = (x30 + x33);
+  x35 = (x29 + x34);
+  x36 = (x28 + x35);
+  x37 = (x27 + x36);
+  x38 = (x26 + x37);
+  x39 = (x38 & UINT64_C(0x7ffffffffffff));
+  x40 = (uint8_t)(x38 >> 51);
+  x41 = (x25 + (uint64_t)x40);
+  x42 = (x24 + x41);
+  x43 = (x23 + x42);
+  x44 = (x22 + x43);
+  x45 = (x21 + x44);
+  x46 = (x20 + x45);
+  x47 = (x46 & UINT64_C(0x7ffffffffffff));
+  x48 = (uint8_t)(x46 >> 51);
+  x49 = (x19 + (uint64_t)x48);
+  x50 = (x18 + x49);
+  x51 = (x17 + x50);
+  x52 = (x16 + x51);
+  x53 = (x15 + x52);
+  x54 = (x14 + x53);
+  x55 = (x13 + x54);
+  x56 = (x55 & UINT64_C(0x7ffffffffffff));
+  x57 = (uint8_t)(x55 >> 51);
+  x58 = (x12 + (uint64_t)x57);
+  x59 = (x11 + x58);
+  x60 = (x10 + x59);
+  x61 = (x9 + x60);
+  x62 = (x8 + x61);
+  x63 = (x7 + x62);
+  x64 = (x63 & UINT64_C(0x7ffffffffffff));
+  x65 = (uint8_t)(x63 >> 51);
+  x66 = (x6 + (uint64_t)x65);
+  x67 = (x5 + x66);
+  x68 = (x4 + x67);
+  x69 = (x3 + x68);
+  x70 = (x2 + x69);
+  x71 = (x1 + x70);
+  out1[0] = x39;
+  out1[1] = x47;
+  out1[2] = x56;
+  out1[3] = x64;
+  out1[4] = x71;
+}
+
+/*
+ * The function fiat_25519_relax is the identity function converting from tight field elements to loose field elements.
+ *
+ * Postconditions:
+ *   out1 = arg1
+ *
+ */
+static FIAT_25519_FIAT_INLINE void fiat_25519_relax(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  x1 = (arg1[0]);
+  x2 = (arg1[1]);
+  x3 = (arg1[2]);
+  x4 = (arg1[3]);
+  x5 = (arg1[4]);
+  out1[0] = x1;
+  out1[1] = x2;
+  out1[2] = x3;
+  out1[3] = x4;
+  out1[4] = x5;
 }
 
 /*
  * The function fiat_25519_carry_scmul_121666 multiplies a field element by 121666 and reduces the result.
+ *
  * Postconditions:
  *   eval out1 mod m = (121666 * eval arg1) mod m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]]
  */
-static void fiat_25519_carry_scmul_121666(uint64_t out1[5], const uint64_t arg1[5]) {
-  fiat_25519_uint128 x1 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[4]));
-  fiat_25519_uint128 x2 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[3]));
-  fiat_25519_uint128 x3 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[2]));
-  fiat_25519_uint128 x4 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[1]));
-  fiat_25519_uint128 x5 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[0]));
-  uint64_t x6 = (uint64_t)(x5 >> 51);
-  uint64_t x7 = (uint64_t)(x5 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x8 = (x6 + x4);
-  uint64_t x9 = (uint64_t)(x8 >> 51);
-  uint64_t x10 = (uint64_t)(x8 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x11 = (x9 + x3);
-  uint64_t x12 = (uint64_t)(x11 >> 51);
-  uint64_t x13 = (uint64_t)(x11 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x14 = (x12 + x2);
-  uint64_t x15 = (uint64_t)(x14 >> 51);
-  uint64_t x16 = (uint64_t)(x14 & UINT64_C(0x7ffffffffffff));
-  fiat_25519_uint128 x17 = (x15 + x1);
-  uint64_t x18 = (uint64_t)(x17 >> 51);
-  uint64_t x19 = (uint64_t)(x17 & UINT64_C(0x7ffffffffffff));
-  uint64_t x20 = (x18 * UINT8_C(0x13));
-  uint64_t x21 = (x7 + x20);
-  fiat_25519_uint1 x22 = (fiat_25519_uint1)(x21 >> 51);
-  uint64_t x23 = (x21 & UINT64_C(0x7ffffffffffff));
-  uint64_t x24 = (x22 + x10);
-  fiat_25519_uint1 x25 = (fiat_25519_uint1)(x24 >> 51);
-  uint64_t x26 = (x24 & UINT64_C(0x7ffffffffffff));
-  uint64_t x27 = (x25 + x13);
+static FIAT_25519_FIAT_INLINE void fiat_25519_carry_scmul_121666(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) {
+  fiat_25519_uint128 x1;
+  fiat_25519_uint128 x2;
+  fiat_25519_uint128 x3;
+  fiat_25519_uint128 x4;
+  fiat_25519_uint128 x5;
+  uint64_t x6;
+  uint64_t x7;
+  fiat_25519_uint128 x8;
+  uint64_t x9;
+  uint64_t x10;
+  fiat_25519_uint128 x11;
+  uint64_t x12;
+  uint64_t x13;
+  fiat_25519_uint128 x14;
+  uint64_t x15;
+  uint64_t x16;
+  fiat_25519_uint128 x17;
+  uint64_t x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  fiat_25519_uint1 x22;
+  uint64_t x23;
+  uint64_t x24;
+  fiat_25519_uint1 x25;
+  uint64_t x26;
+  uint64_t x27;
+  x1 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[4]));
+  x2 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[3]));
+  x3 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[2]));
+  x4 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[1]));
+  x5 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[0]));
+  x6 = (uint64_t)(x5 >> 51);
+  x7 = (uint64_t)(x5 & UINT64_C(0x7ffffffffffff));
+  x8 = (x6 + x4);
+  x9 = (uint64_t)(x8 >> 51);
+  x10 = (uint64_t)(x8 & UINT64_C(0x7ffffffffffff));
+  x11 = (x9 + x3);
+  x12 = (uint64_t)(x11 >> 51);
+  x13 = (uint64_t)(x11 & UINT64_C(0x7ffffffffffff));
+  x14 = (x12 + x2);
+  x15 = (uint64_t)(x14 >> 51);
+  x16 = (uint64_t)(x14 & UINT64_C(0x7ffffffffffff));
+  x17 = (x15 + x1);
+  x18 = (uint64_t)(x17 >> 51);
+  x19 = (uint64_t)(x17 & UINT64_C(0x7ffffffffffff));
+  x20 = (x18 * UINT8_C(0x13));
+  x21 = (x7 + x20);
+  x22 = (fiat_25519_uint1)(x21 >> 51);
+  x23 = (x21 & UINT64_C(0x7ffffffffffff));
+  x24 = (x22 + x10);
+  x25 = (fiat_25519_uint1)(x24 >> 51);
+  x26 = (x24 & UINT64_C(0x7ffffffffffff));
+  x27 = (x25 + x13);
   out1[0] = x23;
   out1[1] = x26;
   out1[2] = x27;
   out1[3] = x16;
   out1[4] = x19;
 }
-
diff --git a/src/third_party/fiat/p256_32.h b/src/third_party/fiat/p256_32.h
index 504da42..3812d8c 100644
--- a/src/third_party/fiat/p256_32.h
+++ b/src/third_party/fiat/p256_32.h
@@ -1,8 +1,8 @@
-/* Autogenerated: src/ExtractionOCaml/word_by_word_montgomery --static p256 '2^256 - 2^224 + 2^192 + 2^96 - 1' 32 mul square add sub opp from_montgomery nonzero selectznz to_bytes from_bytes */
+/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --inline --static --use-value-barrier p256 32 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp */
 /* curve description: p256 */
-/* requested operations: mul, square, add, sub, opp, from_montgomery, nonzero, selectznz, to_bytes, from_bytes */
-/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
 /* machine_wordsize = 32 (from "32") */
+/* requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp */
+/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
 /*                                                                    */
 /* NOTE: In addition to the bounds specified above each function, all */
 /*   functions synthesized for this Montgomery arithmetic require the */
@@ -10,18 +10,47 @@
 /*   require the input to be in the unique saturated representation.  */
 /*   All functions also ensure that these two properties are true of  */
 /*   return values.                                                   */
+/*  */
+/* Computed values: */
+/*   eval z = z[0] + (z[1] << 32) + (z[2] << 64) + (z[3] << 96) + (z[4] << 128) + (z[5] << 160) + (z[6] << 192) + (z[7] << 224) */
+/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
+/*   twos_complement_eval z = let x1 := z[0] + (z[1] << 32) + (z[2] << 64) + (z[3] << 96) + (z[4] << 128) + (z[5] << 160) + (z[6] << 192) + (z[7] << 224) in */
+/*                            if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */
 
 #include <stdint.h>
 typedef unsigned char fiat_p256_uint1;
 typedef signed char fiat_p256_int1;
+#if defined(__GNUC__) || defined(__clang__)
+#  define FIAT_P256_FIAT_INLINE __inline__
+#else
+#  define FIAT_P256_FIAT_INLINE
+#endif
+
+/* The type fiat_p256_montgomery_domain_field_element is a field element in the Montgomery domain. */
+/* Bounds: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] */
+typedef uint32_t fiat_p256_montgomery_domain_field_element[8];
+
+/* The type fiat_p256_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */
+/* Bounds: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] */
+typedef uint32_t fiat_p256_non_montgomery_domain_field_element[8];
 
 #if (-1 & 3) != 3
 #error "This code only works on a two's complement system"
 #endif
 
+#if !defined(FIAT_P256_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
+static __inline__ uint32_t fiat_p256_value_barrier_u32(uint32_t a) {
+  __asm__("" : "+r"(a) : /* no inputs */);
+  return a;
+}
+#else
+#  define fiat_p256_value_barrier_u32(x) (x)
+#endif
+
 
 /*
  * The function fiat_p256_addcarryx_u32 is an addition with carry.
+ *
  * Postconditions:
  *   out1 = (arg1 + arg2 + arg3) mod 2^32
  *   out2 = ⌊(arg1 + arg2 + arg3) / 2^32⌋
@@ -34,16 +63,20 @@
  *   out1: [0x0 ~> 0xffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_p256_addcarryx_u32(uint32_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  uint64_t x1 = ((arg1 + (uint64_t)arg2) + arg3);
-  uint32_t x2 = (uint32_t)(x1 & UINT32_C(0xffffffff));
-  fiat_p256_uint1 x3 = (fiat_p256_uint1)(x1 >> 32);
+static FIAT_P256_FIAT_INLINE void fiat_p256_addcarryx_u32(uint32_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  uint64_t x1;
+  uint32_t x2;
+  fiat_p256_uint1 x3;
+  x1 = ((arg1 + (uint64_t)arg2) + arg3);
+  x2 = (uint32_t)(x1 & UINT32_C(0xffffffff));
+  x3 = (fiat_p256_uint1)(x1 >> 32);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_p256_subborrowx_u32 is a subtraction with borrow.
+ *
  * Postconditions:
  *   out1 = (-arg1 + arg2 + -arg3) mod 2^32
  *   out2 = -⌊(-arg1 + arg2 + -arg3) / 2^32⌋
@@ -56,16 +89,20 @@
  *   out1: [0x0 ~> 0xffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_p256_subborrowx_u32(uint32_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  int64_t x1 = ((arg2 - (int64_t)arg1) - arg3);
-  fiat_p256_int1 x2 = (fiat_p256_int1)(x1 >> 32);
-  uint32_t x3 = (uint32_t)(x1 & UINT32_C(0xffffffff));
+static FIAT_P256_FIAT_INLINE void fiat_p256_subborrowx_u32(uint32_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  int64_t x1;
+  fiat_p256_int1 x2;
+  uint32_t x3;
+  x1 = ((arg2 - (int64_t)arg1) - arg3);
+  x2 = (fiat_p256_int1)(x1 >> 32);
+  x3 = (uint32_t)(x1 & UINT32_C(0xffffffff));
   *out1 = x3;
   *out2 = (fiat_p256_uint1)(0x0 - x2);
 }
 
 /*
  * The function fiat_p256_mulx_u32 is a multiplication, returning the full double-width result.
+ *
  * Postconditions:
  *   out1 = (arg1 * arg2) mod 2^32
  *   out2 = ⌊arg1 * arg2 / 2^32⌋
@@ -77,16 +114,20 @@
  *   out1: [0x0 ~> 0xffffffff]
  *   out2: [0x0 ~> 0xffffffff]
  */
-static void fiat_p256_mulx_u32(uint32_t* out1, uint32_t* out2, uint32_t arg1, uint32_t arg2) {
-  uint64_t x1 = ((uint64_t)arg1 * arg2);
-  uint32_t x2 = (uint32_t)(x1 & UINT32_C(0xffffffff));
-  uint32_t x3 = (uint32_t)(x1 >> 32);
+static FIAT_P256_FIAT_INLINE void fiat_p256_mulx_u32(uint32_t* out1, uint32_t* out2, uint32_t arg1, uint32_t arg2) {
+  uint64_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  x1 = ((uint64_t)arg1 * arg2);
+  x2 = (uint32_t)(x1 & UINT32_C(0xffffffff));
+  x3 = (uint32_t)(x1 >> 32);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_p256_cmovznz_u32 is a single-word conditional move.
+ *
  * Postconditions:
  *   out1 = (if arg1 = 0 then arg2 else arg3)
  *
@@ -97,21 +138,19 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffff]
  */
-static void fiat_p256_cmovznz_u32(uint32_t* out1, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
-  fiat_p256_uint1 x1 = (!(!arg1));
-  uint32_t x2 = ((fiat_p256_int1)(0x0 - x1) & UINT32_C(0xffffffff));
-  // Note this line has been patched from the synthesized code to add value
-  // barriers.
-  //
-  // Clang recognizes this pattern as a select. While it usually transforms it
-  // to a cmov, it sometimes further transforms it into a branch, which we do
-  // not want.
-  uint32_t x3 = ((value_barrier_u32(x2) & arg3) | (value_barrier_u32(~x2) & arg2));
+static FIAT_P256_FIAT_INLINE void fiat_p256_cmovznz_u32(uint32_t* out1, fiat_p256_uint1 arg1, uint32_t arg2, uint32_t arg3) {
+  fiat_p256_uint1 x1;
+  uint32_t x2;
+  uint32_t x3;
+  x1 = (!(!arg1));
+  x2 = ((fiat_p256_int1)(0x0 - x1) & UINT32_C(0xffffffff));
+  x3 = ((fiat_p256_value_barrier_u32(x2) & arg3) | (fiat_p256_value_barrier_u32((~x2)) & arg2));
   *out1 = x3;
 }
 
 /*
  * The function fiat_p256_mul multiplies two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -119,995 +158,1021 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- *   arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_mul(uint32_t out1[8], const uint32_t arg1[8], const uint32_t arg2[8]) {
-  uint32_t x1 = (arg1[1]);
-  uint32_t x2 = (arg1[2]);
-  uint32_t x3 = (arg1[3]);
-  uint32_t x4 = (arg1[4]);
-  uint32_t x5 = (arg1[5]);
-  uint32_t x6 = (arg1[6]);
-  uint32_t x7 = (arg1[7]);
-  uint32_t x8 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_mul(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
   uint32_t x9;
   uint32_t x10;
-  fiat_p256_mulx_u32(&x9, &x10, x8, (arg2[7]));
   uint32_t x11;
   uint32_t x12;
-  fiat_p256_mulx_u32(&x11, &x12, x8, (arg2[6]));
   uint32_t x13;
   uint32_t x14;
-  fiat_p256_mulx_u32(&x13, &x14, x8, (arg2[5]));
   uint32_t x15;
   uint32_t x16;
-  fiat_p256_mulx_u32(&x15, &x16, x8, (arg2[4]));
   uint32_t x17;
   uint32_t x18;
-  fiat_p256_mulx_u32(&x17, &x18, x8, (arg2[3]));
   uint32_t x19;
   uint32_t x20;
-  fiat_p256_mulx_u32(&x19, &x20, x8, (arg2[2]));
   uint32_t x21;
   uint32_t x22;
-  fiat_p256_mulx_u32(&x21, &x22, x8, (arg2[1]));
   uint32_t x23;
   uint32_t x24;
-  fiat_p256_mulx_u32(&x23, &x24, x8, (arg2[0]));
   uint32_t x25;
   fiat_p256_uint1 x26;
-  fiat_p256_addcarryx_u32(&x25, &x26, 0x0, x24, x21);
   uint32_t x27;
   fiat_p256_uint1 x28;
-  fiat_p256_addcarryx_u32(&x27, &x28, x26, x22, x19);
   uint32_t x29;
   fiat_p256_uint1 x30;
-  fiat_p256_addcarryx_u32(&x29, &x30, x28, x20, x17);
   uint32_t x31;
   fiat_p256_uint1 x32;
-  fiat_p256_addcarryx_u32(&x31, &x32, x30, x18, x15);
   uint32_t x33;
   fiat_p256_uint1 x34;
-  fiat_p256_addcarryx_u32(&x33, &x34, x32, x16, x13);
   uint32_t x35;
   fiat_p256_uint1 x36;
-  fiat_p256_addcarryx_u32(&x35, &x36, x34, x14, x11);
   uint32_t x37;
   fiat_p256_uint1 x38;
-  fiat_p256_addcarryx_u32(&x37, &x38, x36, x12, x9);
-  uint32_t x39 = (x38 + x10);
+  uint32_t x39;
   uint32_t x40;
   uint32_t x41;
-  fiat_p256_mulx_u32(&x40, &x41, x23, UINT32_C(0xffffffff));
   uint32_t x42;
   uint32_t x43;
-  fiat_p256_mulx_u32(&x42, &x43, x23, UINT32_C(0xffffffff));
   uint32_t x44;
   uint32_t x45;
-  fiat_p256_mulx_u32(&x44, &x45, x23, UINT32_C(0xffffffff));
   uint32_t x46;
   uint32_t x47;
-  fiat_p256_mulx_u32(&x46, &x47, x23, UINT32_C(0xffffffff));
   uint32_t x48;
   fiat_p256_uint1 x49;
-  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x47, x44);
   uint32_t x50;
   fiat_p256_uint1 x51;
-  fiat_p256_addcarryx_u32(&x50, &x51, x49, x45, x42);
-  uint32_t x52 = (x51 + x43);
+  uint32_t x52;
   uint32_t x53;
   fiat_p256_uint1 x54;
-  fiat_p256_addcarryx_u32(&x53, &x54, 0x0, x23, x46);
   uint32_t x55;
   fiat_p256_uint1 x56;
-  fiat_p256_addcarryx_u32(&x55, &x56, x54, x25, x48);
   uint32_t x57;
   fiat_p256_uint1 x58;
-  fiat_p256_addcarryx_u32(&x57, &x58, x56, x27, x50);
   uint32_t x59;
   fiat_p256_uint1 x60;
-  fiat_p256_addcarryx_u32(&x59, &x60, x58, x29, x52);
   uint32_t x61;
   fiat_p256_uint1 x62;
-  fiat_p256_addcarryx_u32(&x61, &x62, x60, x31, 0x0);
   uint32_t x63;
   fiat_p256_uint1 x64;
-  fiat_p256_addcarryx_u32(&x63, &x64, x62, x33, 0x0);
   uint32_t x65;
   fiat_p256_uint1 x66;
-  fiat_p256_addcarryx_u32(&x65, &x66, x64, x35, x23);
   uint32_t x67;
   fiat_p256_uint1 x68;
-  fiat_p256_addcarryx_u32(&x67, &x68, x66, x37, x40);
   uint32_t x69;
   fiat_p256_uint1 x70;
-  fiat_p256_addcarryx_u32(&x69, &x70, x68, x39, x41);
   uint32_t x71;
   uint32_t x72;
-  fiat_p256_mulx_u32(&x71, &x72, x1, (arg2[7]));
   uint32_t x73;
   uint32_t x74;
-  fiat_p256_mulx_u32(&x73, &x74, x1, (arg2[6]));
   uint32_t x75;
   uint32_t x76;
-  fiat_p256_mulx_u32(&x75, &x76, x1, (arg2[5]));
   uint32_t x77;
   uint32_t x78;
-  fiat_p256_mulx_u32(&x77, &x78, x1, (arg2[4]));
   uint32_t x79;
   uint32_t x80;
-  fiat_p256_mulx_u32(&x79, &x80, x1, (arg2[3]));
   uint32_t x81;
   uint32_t x82;
-  fiat_p256_mulx_u32(&x81, &x82, x1, (arg2[2]));
   uint32_t x83;
   uint32_t x84;
-  fiat_p256_mulx_u32(&x83, &x84, x1, (arg2[1]));
   uint32_t x85;
   uint32_t x86;
-  fiat_p256_mulx_u32(&x85, &x86, x1, (arg2[0]));
   uint32_t x87;
   fiat_p256_uint1 x88;
-  fiat_p256_addcarryx_u32(&x87, &x88, 0x0, x86, x83);
   uint32_t x89;
   fiat_p256_uint1 x90;
-  fiat_p256_addcarryx_u32(&x89, &x90, x88, x84, x81);
   uint32_t x91;
   fiat_p256_uint1 x92;
-  fiat_p256_addcarryx_u32(&x91, &x92, x90, x82, x79);
   uint32_t x93;
   fiat_p256_uint1 x94;
-  fiat_p256_addcarryx_u32(&x93, &x94, x92, x80, x77);
   uint32_t x95;
   fiat_p256_uint1 x96;
-  fiat_p256_addcarryx_u32(&x95, &x96, x94, x78, x75);
   uint32_t x97;
   fiat_p256_uint1 x98;
-  fiat_p256_addcarryx_u32(&x97, &x98, x96, x76, x73);
   uint32_t x99;
   fiat_p256_uint1 x100;
-  fiat_p256_addcarryx_u32(&x99, &x100, x98, x74, x71);
-  uint32_t x101 = (x100 + x72);
+  uint32_t x101;
   uint32_t x102;
   fiat_p256_uint1 x103;
-  fiat_p256_addcarryx_u32(&x102, &x103, 0x0, x55, x85);
   uint32_t x104;
   fiat_p256_uint1 x105;
-  fiat_p256_addcarryx_u32(&x104, &x105, x103, x57, x87);
   uint32_t x106;
   fiat_p256_uint1 x107;
-  fiat_p256_addcarryx_u32(&x106, &x107, x105, x59, x89);
   uint32_t x108;
   fiat_p256_uint1 x109;
-  fiat_p256_addcarryx_u32(&x108, &x109, x107, x61, x91);
   uint32_t x110;
   fiat_p256_uint1 x111;
-  fiat_p256_addcarryx_u32(&x110, &x111, x109, x63, x93);
   uint32_t x112;
   fiat_p256_uint1 x113;
-  fiat_p256_addcarryx_u32(&x112, &x113, x111, x65, x95);
   uint32_t x114;
   fiat_p256_uint1 x115;
-  fiat_p256_addcarryx_u32(&x114, &x115, x113, x67, x97);
   uint32_t x116;
   fiat_p256_uint1 x117;
-  fiat_p256_addcarryx_u32(&x116, &x117, x115, x69, x99);
   uint32_t x118;
   fiat_p256_uint1 x119;
-  fiat_p256_addcarryx_u32(&x118, &x119, x117, x70, x101);
   uint32_t x120;
   uint32_t x121;
-  fiat_p256_mulx_u32(&x120, &x121, x102, UINT32_C(0xffffffff));
   uint32_t x122;
   uint32_t x123;
-  fiat_p256_mulx_u32(&x122, &x123, x102, UINT32_C(0xffffffff));
   uint32_t x124;
   uint32_t x125;
-  fiat_p256_mulx_u32(&x124, &x125, x102, UINT32_C(0xffffffff));
   uint32_t x126;
   uint32_t x127;
-  fiat_p256_mulx_u32(&x126, &x127, x102, UINT32_C(0xffffffff));
   uint32_t x128;
   fiat_p256_uint1 x129;
-  fiat_p256_addcarryx_u32(&x128, &x129, 0x0, x127, x124);
   uint32_t x130;
   fiat_p256_uint1 x131;
-  fiat_p256_addcarryx_u32(&x130, &x131, x129, x125, x122);
-  uint32_t x132 = (x131 + x123);
+  uint32_t x132;
   uint32_t x133;
   fiat_p256_uint1 x134;
-  fiat_p256_addcarryx_u32(&x133, &x134, 0x0, x102, x126);
   uint32_t x135;
   fiat_p256_uint1 x136;
-  fiat_p256_addcarryx_u32(&x135, &x136, x134, x104, x128);
   uint32_t x137;
   fiat_p256_uint1 x138;
-  fiat_p256_addcarryx_u32(&x137, &x138, x136, x106, x130);
   uint32_t x139;
   fiat_p256_uint1 x140;
-  fiat_p256_addcarryx_u32(&x139, &x140, x138, x108, x132);
   uint32_t x141;
   fiat_p256_uint1 x142;
-  fiat_p256_addcarryx_u32(&x141, &x142, x140, x110, 0x0);
   uint32_t x143;
   fiat_p256_uint1 x144;
-  fiat_p256_addcarryx_u32(&x143, &x144, x142, x112, 0x0);
   uint32_t x145;
   fiat_p256_uint1 x146;
-  fiat_p256_addcarryx_u32(&x145, &x146, x144, x114, x102);
   uint32_t x147;
   fiat_p256_uint1 x148;
-  fiat_p256_addcarryx_u32(&x147, &x148, x146, x116, x120);
   uint32_t x149;
   fiat_p256_uint1 x150;
-  fiat_p256_addcarryx_u32(&x149, &x150, x148, x118, x121);
-  uint32_t x151 = ((uint32_t)x150 + x119);
+  uint32_t x151;
   uint32_t x152;
   uint32_t x153;
-  fiat_p256_mulx_u32(&x152, &x153, x2, (arg2[7]));
   uint32_t x154;
   uint32_t x155;
-  fiat_p256_mulx_u32(&x154, &x155, x2, (arg2[6]));
   uint32_t x156;
   uint32_t x157;
-  fiat_p256_mulx_u32(&x156, &x157, x2, (arg2[5]));
   uint32_t x158;
   uint32_t x159;
-  fiat_p256_mulx_u32(&x158, &x159, x2, (arg2[4]));
   uint32_t x160;
   uint32_t x161;
-  fiat_p256_mulx_u32(&x160, &x161, x2, (arg2[3]));
   uint32_t x162;
   uint32_t x163;
-  fiat_p256_mulx_u32(&x162, &x163, x2, (arg2[2]));
   uint32_t x164;
   uint32_t x165;
-  fiat_p256_mulx_u32(&x164, &x165, x2, (arg2[1]));
   uint32_t x166;
   uint32_t x167;
-  fiat_p256_mulx_u32(&x166, &x167, x2, (arg2[0]));
   uint32_t x168;
   fiat_p256_uint1 x169;
-  fiat_p256_addcarryx_u32(&x168, &x169, 0x0, x167, x164);
   uint32_t x170;
   fiat_p256_uint1 x171;
-  fiat_p256_addcarryx_u32(&x170, &x171, x169, x165, x162);
   uint32_t x172;
   fiat_p256_uint1 x173;
-  fiat_p256_addcarryx_u32(&x172, &x173, x171, x163, x160);
   uint32_t x174;
   fiat_p256_uint1 x175;
-  fiat_p256_addcarryx_u32(&x174, &x175, x173, x161, x158);
   uint32_t x176;
   fiat_p256_uint1 x177;
-  fiat_p256_addcarryx_u32(&x176, &x177, x175, x159, x156);
   uint32_t x178;
   fiat_p256_uint1 x179;
-  fiat_p256_addcarryx_u32(&x178, &x179, x177, x157, x154);
   uint32_t x180;
   fiat_p256_uint1 x181;
-  fiat_p256_addcarryx_u32(&x180, &x181, x179, x155, x152);
-  uint32_t x182 = (x181 + x153);
+  uint32_t x182;
   uint32_t x183;
   fiat_p256_uint1 x184;
-  fiat_p256_addcarryx_u32(&x183, &x184, 0x0, x135, x166);
   uint32_t x185;
   fiat_p256_uint1 x186;
-  fiat_p256_addcarryx_u32(&x185, &x186, x184, x137, x168);
   uint32_t x187;
   fiat_p256_uint1 x188;
-  fiat_p256_addcarryx_u32(&x187, &x188, x186, x139, x170);
   uint32_t x189;
   fiat_p256_uint1 x190;
-  fiat_p256_addcarryx_u32(&x189, &x190, x188, x141, x172);
   uint32_t x191;
   fiat_p256_uint1 x192;
-  fiat_p256_addcarryx_u32(&x191, &x192, x190, x143, x174);
   uint32_t x193;
   fiat_p256_uint1 x194;
-  fiat_p256_addcarryx_u32(&x193, &x194, x192, x145, x176);
   uint32_t x195;
   fiat_p256_uint1 x196;
-  fiat_p256_addcarryx_u32(&x195, &x196, x194, x147, x178);
   uint32_t x197;
   fiat_p256_uint1 x198;
-  fiat_p256_addcarryx_u32(&x197, &x198, x196, x149, x180);
   uint32_t x199;
   fiat_p256_uint1 x200;
-  fiat_p256_addcarryx_u32(&x199, &x200, x198, x151, x182);
   uint32_t x201;
   uint32_t x202;
-  fiat_p256_mulx_u32(&x201, &x202, x183, UINT32_C(0xffffffff));
   uint32_t x203;
   uint32_t x204;
-  fiat_p256_mulx_u32(&x203, &x204, x183, UINT32_C(0xffffffff));
   uint32_t x205;
   uint32_t x206;
-  fiat_p256_mulx_u32(&x205, &x206, x183, UINT32_C(0xffffffff));
   uint32_t x207;
   uint32_t x208;
-  fiat_p256_mulx_u32(&x207, &x208, x183, UINT32_C(0xffffffff));
   uint32_t x209;
   fiat_p256_uint1 x210;
-  fiat_p256_addcarryx_u32(&x209, &x210, 0x0, x208, x205);
   uint32_t x211;
   fiat_p256_uint1 x212;
-  fiat_p256_addcarryx_u32(&x211, &x212, x210, x206, x203);
-  uint32_t x213 = (x212 + x204);
+  uint32_t x213;
   uint32_t x214;
   fiat_p256_uint1 x215;
-  fiat_p256_addcarryx_u32(&x214, &x215, 0x0, x183, x207);
   uint32_t x216;
   fiat_p256_uint1 x217;
-  fiat_p256_addcarryx_u32(&x216, &x217, x215, x185, x209);
   uint32_t x218;
   fiat_p256_uint1 x219;
-  fiat_p256_addcarryx_u32(&x218, &x219, x217, x187, x211);
   uint32_t x220;
   fiat_p256_uint1 x221;
-  fiat_p256_addcarryx_u32(&x220, &x221, x219, x189, x213);
   uint32_t x222;
   fiat_p256_uint1 x223;
-  fiat_p256_addcarryx_u32(&x222, &x223, x221, x191, 0x0);
   uint32_t x224;
   fiat_p256_uint1 x225;
-  fiat_p256_addcarryx_u32(&x224, &x225, x223, x193, 0x0);
   uint32_t x226;
   fiat_p256_uint1 x227;
-  fiat_p256_addcarryx_u32(&x226, &x227, x225, x195, x183);
   uint32_t x228;
   fiat_p256_uint1 x229;
-  fiat_p256_addcarryx_u32(&x228, &x229, x227, x197, x201);
   uint32_t x230;
   fiat_p256_uint1 x231;
-  fiat_p256_addcarryx_u32(&x230, &x231, x229, x199, x202);
-  uint32_t x232 = ((uint32_t)x231 + x200);
+  uint32_t x232;
   uint32_t x233;
   uint32_t x234;
-  fiat_p256_mulx_u32(&x233, &x234, x3, (arg2[7]));
   uint32_t x235;
   uint32_t x236;
-  fiat_p256_mulx_u32(&x235, &x236, x3, (arg2[6]));
   uint32_t x237;
   uint32_t x238;
-  fiat_p256_mulx_u32(&x237, &x238, x3, (arg2[5]));
   uint32_t x239;
   uint32_t x240;
-  fiat_p256_mulx_u32(&x239, &x240, x3, (arg2[4]));
   uint32_t x241;
   uint32_t x242;
-  fiat_p256_mulx_u32(&x241, &x242, x3, (arg2[3]));
   uint32_t x243;
   uint32_t x244;
-  fiat_p256_mulx_u32(&x243, &x244, x3, (arg2[2]));
   uint32_t x245;
   uint32_t x246;
-  fiat_p256_mulx_u32(&x245, &x246, x3, (arg2[1]));
   uint32_t x247;
   uint32_t x248;
-  fiat_p256_mulx_u32(&x247, &x248, x3, (arg2[0]));
   uint32_t x249;
   fiat_p256_uint1 x250;
-  fiat_p256_addcarryx_u32(&x249, &x250, 0x0, x248, x245);
   uint32_t x251;
   fiat_p256_uint1 x252;
-  fiat_p256_addcarryx_u32(&x251, &x252, x250, x246, x243);
   uint32_t x253;
   fiat_p256_uint1 x254;
-  fiat_p256_addcarryx_u32(&x253, &x254, x252, x244, x241);
   uint32_t x255;
   fiat_p256_uint1 x256;
-  fiat_p256_addcarryx_u32(&x255, &x256, x254, x242, x239);
   uint32_t x257;
   fiat_p256_uint1 x258;
-  fiat_p256_addcarryx_u32(&x257, &x258, x256, x240, x237);
   uint32_t x259;
   fiat_p256_uint1 x260;
-  fiat_p256_addcarryx_u32(&x259, &x260, x258, x238, x235);
   uint32_t x261;
   fiat_p256_uint1 x262;
-  fiat_p256_addcarryx_u32(&x261, &x262, x260, x236, x233);
-  uint32_t x263 = (x262 + x234);
+  uint32_t x263;
   uint32_t x264;
   fiat_p256_uint1 x265;
-  fiat_p256_addcarryx_u32(&x264, &x265, 0x0, x216, x247);
   uint32_t x266;
   fiat_p256_uint1 x267;
-  fiat_p256_addcarryx_u32(&x266, &x267, x265, x218, x249);
   uint32_t x268;
   fiat_p256_uint1 x269;
-  fiat_p256_addcarryx_u32(&x268, &x269, x267, x220, x251);
   uint32_t x270;
   fiat_p256_uint1 x271;
-  fiat_p256_addcarryx_u32(&x270, &x271, x269, x222, x253);
   uint32_t x272;
   fiat_p256_uint1 x273;
-  fiat_p256_addcarryx_u32(&x272, &x273, x271, x224, x255);
   uint32_t x274;
   fiat_p256_uint1 x275;
-  fiat_p256_addcarryx_u32(&x274, &x275, x273, x226, x257);
   uint32_t x276;
   fiat_p256_uint1 x277;
-  fiat_p256_addcarryx_u32(&x276, &x277, x275, x228, x259);
   uint32_t x278;
   fiat_p256_uint1 x279;
-  fiat_p256_addcarryx_u32(&x278, &x279, x277, x230, x261);
   uint32_t x280;
   fiat_p256_uint1 x281;
-  fiat_p256_addcarryx_u32(&x280, &x281, x279, x232, x263);
   uint32_t x282;
   uint32_t x283;
-  fiat_p256_mulx_u32(&x282, &x283, x264, UINT32_C(0xffffffff));
   uint32_t x284;
   uint32_t x285;
-  fiat_p256_mulx_u32(&x284, &x285, x264, UINT32_C(0xffffffff));
   uint32_t x286;
   uint32_t x287;
-  fiat_p256_mulx_u32(&x286, &x287, x264, UINT32_C(0xffffffff));
   uint32_t x288;
   uint32_t x289;
-  fiat_p256_mulx_u32(&x288, &x289, x264, UINT32_C(0xffffffff));
   uint32_t x290;
   fiat_p256_uint1 x291;
-  fiat_p256_addcarryx_u32(&x290, &x291, 0x0, x289, x286);
   uint32_t x292;
   fiat_p256_uint1 x293;
-  fiat_p256_addcarryx_u32(&x292, &x293, x291, x287, x284);
-  uint32_t x294 = (x293 + x285);
+  uint32_t x294;
   uint32_t x295;
   fiat_p256_uint1 x296;
-  fiat_p256_addcarryx_u32(&x295, &x296, 0x0, x264, x288);
   uint32_t x297;
   fiat_p256_uint1 x298;
-  fiat_p256_addcarryx_u32(&x297, &x298, x296, x266, x290);
   uint32_t x299;
   fiat_p256_uint1 x300;
-  fiat_p256_addcarryx_u32(&x299, &x300, x298, x268, x292);
   uint32_t x301;
   fiat_p256_uint1 x302;
-  fiat_p256_addcarryx_u32(&x301, &x302, x300, x270, x294);
   uint32_t x303;
   fiat_p256_uint1 x304;
-  fiat_p256_addcarryx_u32(&x303, &x304, x302, x272, 0x0);
   uint32_t x305;
   fiat_p256_uint1 x306;
-  fiat_p256_addcarryx_u32(&x305, &x306, x304, x274, 0x0);
   uint32_t x307;
   fiat_p256_uint1 x308;
-  fiat_p256_addcarryx_u32(&x307, &x308, x306, x276, x264);
   uint32_t x309;
   fiat_p256_uint1 x310;
-  fiat_p256_addcarryx_u32(&x309, &x310, x308, x278, x282);
   uint32_t x311;
   fiat_p256_uint1 x312;
-  fiat_p256_addcarryx_u32(&x311, &x312, x310, x280, x283);
-  uint32_t x313 = ((uint32_t)x312 + x281);
+  uint32_t x313;
   uint32_t x314;
   uint32_t x315;
-  fiat_p256_mulx_u32(&x314, &x315, x4, (arg2[7]));
   uint32_t x316;
   uint32_t x317;
-  fiat_p256_mulx_u32(&x316, &x317, x4, (arg2[6]));
   uint32_t x318;
   uint32_t x319;
-  fiat_p256_mulx_u32(&x318, &x319, x4, (arg2[5]));
   uint32_t x320;
   uint32_t x321;
-  fiat_p256_mulx_u32(&x320, &x321, x4, (arg2[4]));
   uint32_t x322;
   uint32_t x323;
-  fiat_p256_mulx_u32(&x322, &x323, x4, (arg2[3]));
   uint32_t x324;
   uint32_t x325;
-  fiat_p256_mulx_u32(&x324, &x325, x4, (arg2[2]));
   uint32_t x326;
   uint32_t x327;
-  fiat_p256_mulx_u32(&x326, &x327, x4, (arg2[1]));
   uint32_t x328;
   uint32_t x329;
-  fiat_p256_mulx_u32(&x328, &x329, x4, (arg2[0]));
   uint32_t x330;
   fiat_p256_uint1 x331;
-  fiat_p256_addcarryx_u32(&x330, &x331, 0x0, x329, x326);
   uint32_t x332;
   fiat_p256_uint1 x333;
-  fiat_p256_addcarryx_u32(&x332, &x333, x331, x327, x324);
   uint32_t x334;
   fiat_p256_uint1 x335;
-  fiat_p256_addcarryx_u32(&x334, &x335, x333, x325, x322);
   uint32_t x336;
   fiat_p256_uint1 x337;
-  fiat_p256_addcarryx_u32(&x336, &x337, x335, x323, x320);
   uint32_t x338;
   fiat_p256_uint1 x339;
-  fiat_p256_addcarryx_u32(&x338, &x339, x337, x321, x318);
   uint32_t x340;
   fiat_p256_uint1 x341;
-  fiat_p256_addcarryx_u32(&x340, &x341, x339, x319, x316);
   uint32_t x342;
   fiat_p256_uint1 x343;
-  fiat_p256_addcarryx_u32(&x342, &x343, x341, x317, x314);
-  uint32_t x344 = (x343 + x315);
+  uint32_t x344;
   uint32_t x345;
   fiat_p256_uint1 x346;
-  fiat_p256_addcarryx_u32(&x345, &x346, 0x0, x297, x328);
   uint32_t x347;
   fiat_p256_uint1 x348;
-  fiat_p256_addcarryx_u32(&x347, &x348, x346, x299, x330);
   uint32_t x349;
   fiat_p256_uint1 x350;
-  fiat_p256_addcarryx_u32(&x349, &x350, x348, x301, x332);
   uint32_t x351;
   fiat_p256_uint1 x352;
-  fiat_p256_addcarryx_u32(&x351, &x352, x350, x303, x334);
   uint32_t x353;
   fiat_p256_uint1 x354;
-  fiat_p256_addcarryx_u32(&x353, &x354, x352, x305, x336);
   uint32_t x355;
   fiat_p256_uint1 x356;
-  fiat_p256_addcarryx_u32(&x355, &x356, x354, x307, x338);
   uint32_t x357;
   fiat_p256_uint1 x358;
-  fiat_p256_addcarryx_u32(&x357, &x358, x356, x309, x340);
   uint32_t x359;
   fiat_p256_uint1 x360;
-  fiat_p256_addcarryx_u32(&x359, &x360, x358, x311, x342);
   uint32_t x361;
   fiat_p256_uint1 x362;
-  fiat_p256_addcarryx_u32(&x361, &x362, x360, x313, x344);
   uint32_t x363;
   uint32_t x364;
-  fiat_p256_mulx_u32(&x363, &x364, x345, UINT32_C(0xffffffff));
   uint32_t x365;
   uint32_t x366;
-  fiat_p256_mulx_u32(&x365, &x366, x345, UINT32_C(0xffffffff));
   uint32_t x367;
   uint32_t x368;
-  fiat_p256_mulx_u32(&x367, &x368, x345, UINT32_C(0xffffffff));
   uint32_t x369;
   uint32_t x370;
-  fiat_p256_mulx_u32(&x369, &x370, x345, UINT32_C(0xffffffff));
   uint32_t x371;
   fiat_p256_uint1 x372;
-  fiat_p256_addcarryx_u32(&x371, &x372, 0x0, x370, x367);
   uint32_t x373;
   fiat_p256_uint1 x374;
-  fiat_p256_addcarryx_u32(&x373, &x374, x372, x368, x365);
-  uint32_t x375 = (x374 + x366);
+  uint32_t x375;
   uint32_t x376;
   fiat_p256_uint1 x377;
-  fiat_p256_addcarryx_u32(&x376, &x377, 0x0, x345, x369);
   uint32_t x378;
   fiat_p256_uint1 x379;
-  fiat_p256_addcarryx_u32(&x378, &x379, x377, x347, x371);
   uint32_t x380;
   fiat_p256_uint1 x381;
-  fiat_p256_addcarryx_u32(&x380, &x381, x379, x349, x373);
   uint32_t x382;
   fiat_p256_uint1 x383;
-  fiat_p256_addcarryx_u32(&x382, &x383, x381, x351, x375);
   uint32_t x384;
   fiat_p256_uint1 x385;
-  fiat_p256_addcarryx_u32(&x384, &x385, x383, x353, 0x0);
   uint32_t x386;
   fiat_p256_uint1 x387;
-  fiat_p256_addcarryx_u32(&x386, &x387, x385, x355, 0x0);
   uint32_t x388;
   fiat_p256_uint1 x389;
-  fiat_p256_addcarryx_u32(&x388, &x389, x387, x357, x345);
   uint32_t x390;
   fiat_p256_uint1 x391;
-  fiat_p256_addcarryx_u32(&x390, &x391, x389, x359, x363);
   uint32_t x392;
   fiat_p256_uint1 x393;
-  fiat_p256_addcarryx_u32(&x392, &x393, x391, x361, x364);
-  uint32_t x394 = ((uint32_t)x393 + x362);
+  uint32_t x394;
   uint32_t x395;
   uint32_t x396;
-  fiat_p256_mulx_u32(&x395, &x396, x5, (arg2[7]));
   uint32_t x397;
   uint32_t x398;
-  fiat_p256_mulx_u32(&x397, &x398, x5, (arg2[6]));
   uint32_t x399;
   uint32_t x400;
-  fiat_p256_mulx_u32(&x399, &x400, x5, (arg2[5]));
   uint32_t x401;
   uint32_t x402;
-  fiat_p256_mulx_u32(&x401, &x402, x5, (arg2[4]));
   uint32_t x403;
   uint32_t x404;
-  fiat_p256_mulx_u32(&x403, &x404, x5, (arg2[3]));
   uint32_t x405;
   uint32_t x406;
-  fiat_p256_mulx_u32(&x405, &x406, x5, (arg2[2]));
   uint32_t x407;
   uint32_t x408;
-  fiat_p256_mulx_u32(&x407, &x408, x5, (arg2[1]));
   uint32_t x409;
   uint32_t x410;
-  fiat_p256_mulx_u32(&x409, &x410, x5, (arg2[0]));
   uint32_t x411;
   fiat_p256_uint1 x412;
-  fiat_p256_addcarryx_u32(&x411, &x412, 0x0, x410, x407);
   uint32_t x413;
   fiat_p256_uint1 x414;
-  fiat_p256_addcarryx_u32(&x413, &x414, x412, x408, x405);
   uint32_t x415;
   fiat_p256_uint1 x416;
-  fiat_p256_addcarryx_u32(&x415, &x416, x414, x406, x403);
   uint32_t x417;
   fiat_p256_uint1 x418;
-  fiat_p256_addcarryx_u32(&x417, &x418, x416, x404, x401);
   uint32_t x419;
   fiat_p256_uint1 x420;
-  fiat_p256_addcarryx_u32(&x419, &x420, x418, x402, x399);
   uint32_t x421;
   fiat_p256_uint1 x422;
-  fiat_p256_addcarryx_u32(&x421, &x422, x420, x400, x397);
   uint32_t x423;
   fiat_p256_uint1 x424;
-  fiat_p256_addcarryx_u32(&x423, &x424, x422, x398, x395);
-  uint32_t x425 = (x424 + x396);
+  uint32_t x425;
   uint32_t x426;
   fiat_p256_uint1 x427;
-  fiat_p256_addcarryx_u32(&x426, &x427, 0x0, x378, x409);
   uint32_t x428;
   fiat_p256_uint1 x429;
-  fiat_p256_addcarryx_u32(&x428, &x429, x427, x380, x411);
   uint32_t x430;
   fiat_p256_uint1 x431;
-  fiat_p256_addcarryx_u32(&x430, &x431, x429, x382, x413);
   uint32_t x432;
   fiat_p256_uint1 x433;
-  fiat_p256_addcarryx_u32(&x432, &x433, x431, x384, x415);
   uint32_t x434;
   fiat_p256_uint1 x435;
-  fiat_p256_addcarryx_u32(&x434, &x435, x433, x386, x417);
   uint32_t x436;
   fiat_p256_uint1 x437;
-  fiat_p256_addcarryx_u32(&x436, &x437, x435, x388, x419);
   uint32_t x438;
   fiat_p256_uint1 x439;
-  fiat_p256_addcarryx_u32(&x438, &x439, x437, x390, x421);
   uint32_t x440;
   fiat_p256_uint1 x441;
-  fiat_p256_addcarryx_u32(&x440, &x441, x439, x392, x423);
   uint32_t x442;
   fiat_p256_uint1 x443;
-  fiat_p256_addcarryx_u32(&x442, &x443, x441, x394, x425);
   uint32_t x444;
   uint32_t x445;
-  fiat_p256_mulx_u32(&x444, &x445, x426, UINT32_C(0xffffffff));
   uint32_t x446;
   uint32_t x447;
-  fiat_p256_mulx_u32(&x446, &x447, x426, UINT32_C(0xffffffff));
   uint32_t x448;
   uint32_t x449;
-  fiat_p256_mulx_u32(&x448, &x449, x426, UINT32_C(0xffffffff));
   uint32_t x450;
   uint32_t x451;
-  fiat_p256_mulx_u32(&x450, &x451, x426, UINT32_C(0xffffffff));
   uint32_t x452;
   fiat_p256_uint1 x453;
-  fiat_p256_addcarryx_u32(&x452, &x453, 0x0, x451, x448);
   uint32_t x454;
   fiat_p256_uint1 x455;
-  fiat_p256_addcarryx_u32(&x454, &x455, x453, x449, x446);
-  uint32_t x456 = (x455 + x447);
+  uint32_t x456;
   uint32_t x457;
   fiat_p256_uint1 x458;
-  fiat_p256_addcarryx_u32(&x457, &x458, 0x0, x426, x450);
   uint32_t x459;
   fiat_p256_uint1 x460;
-  fiat_p256_addcarryx_u32(&x459, &x460, x458, x428, x452);
   uint32_t x461;
   fiat_p256_uint1 x462;
-  fiat_p256_addcarryx_u32(&x461, &x462, x460, x430, x454);
   uint32_t x463;
   fiat_p256_uint1 x464;
-  fiat_p256_addcarryx_u32(&x463, &x464, x462, x432, x456);
   uint32_t x465;
   fiat_p256_uint1 x466;
-  fiat_p256_addcarryx_u32(&x465, &x466, x464, x434, 0x0);
   uint32_t x467;
   fiat_p256_uint1 x468;
-  fiat_p256_addcarryx_u32(&x467, &x468, x466, x436, 0x0);
   uint32_t x469;
   fiat_p256_uint1 x470;
-  fiat_p256_addcarryx_u32(&x469, &x470, x468, x438, x426);
   uint32_t x471;
   fiat_p256_uint1 x472;
-  fiat_p256_addcarryx_u32(&x471, &x472, x470, x440, x444);
   uint32_t x473;
   fiat_p256_uint1 x474;
-  fiat_p256_addcarryx_u32(&x473, &x474, x472, x442, x445);
-  uint32_t x475 = ((uint32_t)x474 + x443);
+  uint32_t x475;
   uint32_t x476;
   uint32_t x477;
-  fiat_p256_mulx_u32(&x476, &x477, x6, (arg2[7]));
   uint32_t x478;
   uint32_t x479;
-  fiat_p256_mulx_u32(&x478, &x479, x6, (arg2[6]));
   uint32_t x480;
   uint32_t x481;
-  fiat_p256_mulx_u32(&x480, &x481, x6, (arg2[5]));
   uint32_t x482;
   uint32_t x483;
-  fiat_p256_mulx_u32(&x482, &x483, x6, (arg2[4]));
   uint32_t x484;
   uint32_t x485;
-  fiat_p256_mulx_u32(&x484, &x485, x6, (arg2[3]));
   uint32_t x486;
   uint32_t x487;
-  fiat_p256_mulx_u32(&x486, &x487, x6, (arg2[2]));
   uint32_t x488;
   uint32_t x489;
-  fiat_p256_mulx_u32(&x488, &x489, x6, (arg2[1]));
   uint32_t x490;
   uint32_t x491;
-  fiat_p256_mulx_u32(&x490, &x491, x6, (arg2[0]));
   uint32_t x492;
   fiat_p256_uint1 x493;
-  fiat_p256_addcarryx_u32(&x492, &x493, 0x0, x491, x488);
   uint32_t x494;
   fiat_p256_uint1 x495;
-  fiat_p256_addcarryx_u32(&x494, &x495, x493, x489, x486);
   uint32_t x496;
   fiat_p256_uint1 x497;
-  fiat_p256_addcarryx_u32(&x496, &x497, x495, x487, x484);
   uint32_t x498;
   fiat_p256_uint1 x499;
-  fiat_p256_addcarryx_u32(&x498, &x499, x497, x485, x482);
   uint32_t x500;
   fiat_p256_uint1 x501;
-  fiat_p256_addcarryx_u32(&x500, &x501, x499, x483, x480);
   uint32_t x502;
   fiat_p256_uint1 x503;
-  fiat_p256_addcarryx_u32(&x502, &x503, x501, x481, x478);
   uint32_t x504;
   fiat_p256_uint1 x505;
-  fiat_p256_addcarryx_u32(&x504, &x505, x503, x479, x476);
-  uint32_t x506 = (x505 + x477);
+  uint32_t x506;
   uint32_t x507;
   fiat_p256_uint1 x508;
-  fiat_p256_addcarryx_u32(&x507, &x508, 0x0, x459, x490);
   uint32_t x509;
   fiat_p256_uint1 x510;
-  fiat_p256_addcarryx_u32(&x509, &x510, x508, x461, x492);
   uint32_t x511;
   fiat_p256_uint1 x512;
-  fiat_p256_addcarryx_u32(&x511, &x512, x510, x463, x494);
   uint32_t x513;
   fiat_p256_uint1 x514;
-  fiat_p256_addcarryx_u32(&x513, &x514, x512, x465, x496);
   uint32_t x515;
   fiat_p256_uint1 x516;
-  fiat_p256_addcarryx_u32(&x515, &x516, x514, x467, x498);
   uint32_t x517;
   fiat_p256_uint1 x518;
-  fiat_p256_addcarryx_u32(&x517, &x518, x516, x469, x500);
   uint32_t x519;
   fiat_p256_uint1 x520;
-  fiat_p256_addcarryx_u32(&x519, &x520, x518, x471, x502);
   uint32_t x521;
   fiat_p256_uint1 x522;
-  fiat_p256_addcarryx_u32(&x521, &x522, x520, x473, x504);
   uint32_t x523;
   fiat_p256_uint1 x524;
-  fiat_p256_addcarryx_u32(&x523, &x524, x522, x475, x506);
   uint32_t x525;
   uint32_t x526;
-  fiat_p256_mulx_u32(&x525, &x526, x507, UINT32_C(0xffffffff));
   uint32_t x527;
   uint32_t x528;
-  fiat_p256_mulx_u32(&x527, &x528, x507, UINT32_C(0xffffffff));
   uint32_t x529;
   uint32_t x530;
-  fiat_p256_mulx_u32(&x529, &x530, x507, UINT32_C(0xffffffff));
   uint32_t x531;
   uint32_t x532;
-  fiat_p256_mulx_u32(&x531, &x532, x507, UINT32_C(0xffffffff));
   uint32_t x533;
   fiat_p256_uint1 x534;
-  fiat_p256_addcarryx_u32(&x533, &x534, 0x0, x532, x529);
   uint32_t x535;
   fiat_p256_uint1 x536;
-  fiat_p256_addcarryx_u32(&x535, &x536, x534, x530, x527);
-  uint32_t x537 = (x536 + x528);
+  uint32_t x537;
   uint32_t x538;
   fiat_p256_uint1 x539;
-  fiat_p256_addcarryx_u32(&x538, &x539, 0x0, x507, x531);
   uint32_t x540;
   fiat_p256_uint1 x541;
-  fiat_p256_addcarryx_u32(&x540, &x541, x539, x509, x533);
   uint32_t x542;
   fiat_p256_uint1 x543;
-  fiat_p256_addcarryx_u32(&x542, &x543, x541, x511, x535);
   uint32_t x544;
   fiat_p256_uint1 x545;
-  fiat_p256_addcarryx_u32(&x544, &x545, x543, x513, x537);
   uint32_t x546;
   fiat_p256_uint1 x547;
-  fiat_p256_addcarryx_u32(&x546, &x547, x545, x515, 0x0);
   uint32_t x548;
   fiat_p256_uint1 x549;
-  fiat_p256_addcarryx_u32(&x548, &x549, x547, x517, 0x0);
   uint32_t x550;
   fiat_p256_uint1 x551;
-  fiat_p256_addcarryx_u32(&x550, &x551, x549, x519, x507);
   uint32_t x552;
   fiat_p256_uint1 x553;
-  fiat_p256_addcarryx_u32(&x552, &x553, x551, x521, x525);
   uint32_t x554;
   fiat_p256_uint1 x555;
-  fiat_p256_addcarryx_u32(&x554, &x555, x553, x523, x526);
-  uint32_t x556 = ((uint32_t)x555 + x524);
+  uint32_t x556;
   uint32_t x557;
   uint32_t x558;
-  fiat_p256_mulx_u32(&x557, &x558, x7, (arg2[7]));
   uint32_t x559;
   uint32_t x560;
-  fiat_p256_mulx_u32(&x559, &x560, x7, (arg2[6]));
   uint32_t x561;
   uint32_t x562;
-  fiat_p256_mulx_u32(&x561, &x562, x7, (arg2[5]));
   uint32_t x563;
   uint32_t x564;
-  fiat_p256_mulx_u32(&x563, &x564, x7, (arg2[4]));
   uint32_t x565;
   uint32_t x566;
-  fiat_p256_mulx_u32(&x565, &x566, x7, (arg2[3]));
   uint32_t x567;
   uint32_t x568;
-  fiat_p256_mulx_u32(&x567, &x568, x7, (arg2[2]));
   uint32_t x569;
   uint32_t x570;
-  fiat_p256_mulx_u32(&x569, &x570, x7, (arg2[1]));
   uint32_t x571;
   uint32_t x572;
-  fiat_p256_mulx_u32(&x571, &x572, x7, (arg2[0]));
   uint32_t x573;
   fiat_p256_uint1 x574;
-  fiat_p256_addcarryx_u32(&x573, &x574, 0x0, x572, x569);
   uint32_t x575;
   fiat_p256_uint1 x576;
-  fiat_p256_addcarryx_u32(&x575, &x576, x574, x570, x567);
   uint32_t x577;
   fiat_p256_uint1 x578;
-  fiat_p256_addcarryx_u32(&x577, &x578, x576, x568, x565);
   uint32_t x579;
   fiat_p256_uint1 x580;
-  fiat_p256_addcarryx_u32(&x579, &x580, x578, x566, x563);
   uint32_t x581;
   fiat_p256_uint1 x582;
-  fiat_p256_addcarryx_u32(&x581, &x582, x580, x564, x561);
   uint32_t x583;
   fiat_p256_uint1 x584;
-  fiat_p256_addcarryx_u32(&x583, &x584, x582, x562, x559);
   uint32_t x585;
   fiat_p256_uint1 x586;
-  fiat_p256_addcarryx_u32(&x585, &x586, x584, x560, x557);
-  uint32_t x587 = (x586 + x558);
+  uint32_t x587;
   uint32_t x588;
   fiat_p256_uint1 x589;
-  fiat_p256_addcarryx_u32(&x588, &x589, 0x0, x540, x571);
   uint32_t x590;
   fiat_p256_uint1 x591;
-  fiat_p256_addcarryx_u32(&x590, &x591, x589, x542, x573);
   uint32_t x592;
   fiat_p256_uint1 x593;
-  fiat_p256_addcarryx_u32(&x592, &x593, x591, x544, x575);
   uint32_t x594;
   fiat_p256_uint1 x595;
-  fiat_p256_addcarryx_u32(&x594, &x595, x593, x546, x577);
   uint32_t x596;
   fiat_p256_uint1 x597;
-  fiat_p256_addcarryx_u32(&x596, &x597, x595, x548, x579);
   uint32_t x598;
   fiat_p256_uint1 x599;
-  fiat_p256_addcarryx_u32(&x598, &x599, x597, x550, x581);
   uint32_t x600;
   fiat_p256_uint1 x601;
-  fiat_p256_addcarryx_u32(&x600, &x601, x599, x552, x583);
   uint32_t x602;
   fiat_p256_uint1 x603;
-  fiat_p256_addcarryx_u32(&x602, &x603, x601, x554, x585);
   uint32_t x604;
   fiat_p256_uint1 x605;
-  fiat_p256_addcarryx_u32(&x604, &x605, x603, x556, x587);
   uint32_t x606;
   uint32_t x607;
-  fiat_p256_mulx_u32(&x606, &x607, x588, UINT32_C(0xffffffff));
   uint32_t x608;
   uint32_t x609;
-  fiat_p256_mulx_u32(&x608, &x609, x588, UINT32_C(0xffffffff));
   uint32_t x610;
   uint32_t x611;
-  fiat_p256_mulx_u32(&x610, &x611, x588, UINT32_C(0xffffffff));
   uint32_t x612;
   uint32_t x613;
-  fiat_p256_mulx_u32(&x612, &x613, x588, UINT32_C(0xffffffff));
   uint32_t x614;
   fiat_p256_uint1 x615;
-  fiat_p256_addcarryx_u32(&x614, &x615, 0x0, x613, x610);
   uint32_t x616;
   fiat_p256_uint1 x617;
-  fiat_p256_addcarryx_u32(&x616, &x617, x615, x611, x608);
-  uint32_t x618 = (x617 + x609);
+  uint32_t x618;
   uint32_t x619;
   fiat_p256_uint1 x620;
-  fiat_p256_addcarryx_u32(&x619, &x620, 0x0, x588, x612);
   uint32_t x621;
   fiat_p256_uint1 x622;
-  fiat_p256_addcarryx_u32(&x621, &x622, x620, x590, x614);
   uint32_t x623;
   fiat_p256_uint1 x624;
-  fiat_p256_addcarryx_u32(&x623, &x624, x622, x592, x616);
   uint32_t x625;
   fiat_p256_uint1 x626;
-  fiat_p256_addcarryx_u32(&x625, &x626, x624, x594, x618);
   uint32_t x627;
   fiat_p256_uint1 x628;
-  fiat_p256_addcarryx_u32(&x627, &x628, x626, x596, 0x0);
   uint32_t x629;
   fiat_p256_uint1 x630;
-  fiat_p256_addcarryx_u32(&x629, &x630, x628, x598, 0x0);
   uint32_t x631;
   fiat_p256_uint1 x632;
-  fiat_p256_addcarryx_u32(&x631, &x632, x630, x600, x588);
   uint32_t x633;
   fiat_p256_uint1 x634;
-  fiat_p256_addcarryx_u32(&x633, &x634, x632, x602, x606);
   uint32_t x635;
   fiat_p256_uint1 x636;
-  fiat_p256_addcarryx_u32(&x635, &x636, x634, x604, x607);
-  uint32_t x637 = ((uint32_t)x636 + x605);
+  uint32_t x637;
   uint32_t x638;
   fiat_p256_uint1 x639;
-  fiat_p256_subborrowx_u32(&x638, &x639, 0x0, x621, UINT32_C(0xffffffff));
   uint32_t x640;
   fiat_p256_uint1 x641;
-  fiat_p256_subborrowx_u32(&x640, &x641, x639, x623, UINT32_C(0xffffffff));
   uint32_t x642;
   fiat_p256_uint1 x643;
-  fiat_p256_subborrowx_u32(&x642, &x643, x641, x625, UINT32_C(0xffffffff));
   uint32_t x644;
   fiat_p256_uint1 x645;
-  fiat_p256_subborrowx_u32(&x644, &x645, x643, x627, 0x0);
   uint32_t x646;
   fiat_p256_uint1 x647;
-  fiat_p256_subborrowx_u32(&x646, &x647, x645, x629, 0x0);
   uint32_t x648;
   fiat_p256_uint1 x649;
-  fiat_p256_subborrowx_u32(&x648, &x649, x647, x631, 0x0);
   uint32_t x650;
   fiat_p256_uint1 x651;
-  fiat_p256_subborrowx_u32(&x650, &x651, x649, x633, 0x1);
   uint32_t x652;
   fiat_p256_uint1 x653;
-  fiat_p256_subborrowx_u32(&x652, &x653, x651, x635, UINT32_C(0xffffffff));
   uint32_t x654;
   fiat_p256_uint1 x655;
-  fiat_p256_subborrowx_u32(&x654, &x655, x653, x637, 0x0);
   uint32_t x656;
-  fiat_p256_cmovznz_u32(&x656, x655, x638, x621);
   uint32_t x657;
-  fiat_p256_cmovznz_u32(&x657, x655, x640, x623);
   uint32_t x658;
-  fiat_p256_cmovznz_u32(&x658, x655, x642, x625);
   uint32_t x659;
-  fiat_p256_cmovznz_u32(&x659, x655, x644, x627);
   uint32_t x660;
-  fiat_p256_cmovznz_u32(&x660, x655, x646, x629);
   uint32_t x661;
-  fiat_p256_cmovznz_u32(&x661, x655, x648, x631);
   uint32_t x662;
-  fiat_p256_cmovznz_u32(&x662, x655, x650, x633);
   uint32_t x663;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[4]);
+  x5 = (arg1[5]);
+  x6 = (arg1[6]);
+  x7 = (arg1[7]);
+  x8 = (arg1[0]);
+  fiat_p256_mulx_u32(&x9, &x10, x8, (arg2[7]));
+  fiat_p256_mulx_u32(&x11, &x12, x8, (arg2[6]));
+  fiat_p256_mulx_u32(&x13, &x14, x8, (arg2[5]));
+  fiat_p256_mulx_u32(&x15, &x16, x8, (arg2[4]));
+  fiat_p256_mulx_u32(&x17, &x18, x8, (arg2[3]));
+  fiat_p256_mulx_u32(&x19, &x20, x8, (arg2[2]));
+  fiat_p256_mulx_u32(&x21, &x22, x8, (arg2[1]));
+  fiat_p256_mulx_u32(&x23, &x24, x8, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x25, &x26, 0x0, x24, x21);
+  fiat_p256_addcarryx_u32(&x27, &x28, x26, x22, x19);
+  fiat_p256_addcarryx_u32(&x29, &x30, x28, x20, x17);
+  fiat_p256_addcarryx_u32(&x31, &x32, x30, x18, x15);
+  fiat_p256_addcarryx_u32(&x33, &x34, x32, x16, x13);
+  fiat_p256_addcarryx_u32(&x35, &x36, x34, x14, x11);
+  fiat_p256_addcarryx_u32(&x37, &x38, x36, x12, x9);
+  x39 = (x38 + x10);
+  fiat_p256_mulx_u32(&x40, &x41, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x42, &x43, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x44, &x45, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x46, &x47, x23, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x47, x44);
+  fiat_p256_addcarryx_u32(&x50, &x51, x49, x45, x42);
+  x52 = (x51 + x43);
+  fiat_p256_addcarryx_u32(&x53, &x54, 0x0, x23, x46);
+  fiat_p256_addcarryx_u32(&x55, &x56, x54, x25, x48);
+  fiat_p256_addcarryx_u32(&x57, &x58, x56, x27, x50);
+  fiat_p256_addcarryx_u32(&x59, &x60, x58, x29, x52);
+  fiat_p256_addcarryx_u32(&x61, &x62, x60, x31, 0x0);
+  fiat_p256_addcarryx_u32(&x63, &x64, x62, x33, 0x0);
+  fiat_p256_addcarryx_u32(&x65, &x66, x64, x35, x23);
+  fiat_p256_addcarryx_u32(&x67, &x68, x66, x37, x40);
+  fiat_p256_addcarryx_u32(&x69, &x70, x68, x39, x41);
+  fiat_p256_mulx_u32(&x71, &x72, x1, (arg2[7]));
+  fiat_p256_mulx_u32(&x73, &x74, x1, (arg2[6]));
+  fiat_p256_mulx_u32(&x75, &x76, x1, (arg2[5]));
+  fiat_p256_mulx_u32(&x77, &x78, x1, (arg2[4]));
+  fiat_p256_mulx_u32(&x79, &x80, x1, (arg2[3]));
+  fiat_p256_mulx_u32(&x81, &x82, x1, (arg2[2]));
+  fiat_p256_mulx_u32(&x83, &x84, x1, (arg2[1]));
+  fiat_p256_mulx_u32(&x85, &x86, x1, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x87, &x88, 0x0, x86, x83);
+  fiat_p256_addcarryx_u32(&x89, &x90, x88, x84, x81);
+  fiat_p256_addcarryx_u32(&x91, &x92, x90, x82, x79);
+  fiat_p256_addcarryx_u32(&x93, &x94, x92, x80, x77);
+  fiat_p256_addcarryx_u32(&x95, &x96, x94, x78, x75);
+  fiat_p256_addcarryx_u32(&x97, &x98, x96, x76, x73);
+  fiat_p256_addcarryx_u32(&x99, &x100, x98, x74, x71);
+  x101 = (x100 + x72);
+  fiat_p256_addcarryx_u32(&x102, &x103, 0x0, x55, x85);
+  fiat_p256_addcarryx_u32(&x104, &x105, x103, x57, x87);
+  fiat_p256_addcarryx_u32(&x106, &x107, x105, x59, x89);
+  fiat_p256_addcarryx_u32(&x108, &x109, x107, x61, x91);
+  fiat_p256_addcarryx_u32(&x110, &x111, x109, x63, x93);
+  fiat_p256_addcarryx_u32(&x112, &x113, x111, x65, x95);
+  fiat_p256_addcarryx_u32(&x114, &x115, x113, x67, x97);
+  fiat_p256_addcarryx_u32(&x116, &x117, x115, x69, x99);
+  fiat_p256_addcarryx_u32(&x118, &x119, x117, x70, x101);
+  fiat_p256_mulx_u32(&x120, &x121, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x122, &x123, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x124, &x125, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x126, &x127, x102, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x128, &x129, 0x0, x127, x124);
+  fiat_p256_addcarryx_u32(&x130, &x131, x129, x125, x122);
+  x132 = (x131 + x123);
+  fiat_p256_addcarryx_u32(&x133, &x134, 0x0, x102, x126);
+  fiat_p256_addcarryx_u32(&x135, &x136, x134, x104, x128);
+  fiat_p256_addcarryx_u32(&x137, &x138, x136, x106, x130);
+  fiat_p256_addcarryx_u32(&x139, &x140, x138, x108, x132);
+  fiat_p256_addcarryx_u32(&x141, &x142, x140, x110, 0x0);
+  fiat_p256_addcarryx_u32(&x143, &x144, x142, x112, 0x0);
+  fiat_p256_addcarryx_u32(&x145, &x146, x144, x114, x102);
+  fiat_p256_addcarryx_u32(&x147, &x148, x146, x116, x120);
+  fiat_p256_addcarryx_u32(&x149, &x150, x148, x118, x121);
+  x151 = ((uint32_t)x150 + x119);
+  fiat_p256_mulx_u32(&x152, &x153, x2, (arg2[7]));
+  fiat_p256_mulx_u32(&x154, &x155, x2, (arg2[6]));
+  fiat_p256_mulx_u32(&x156, &x157, x2, (arg2[5]));
+  fiat_p256_mulx_u32(&x158, &x159, x2, (arg2[4]));
+  fiat_p256_mulx_u32(&x160, &x161, x2, (arg2[3]));
+  fiat_p256_mulx_u32(&x162, &x163, x2, (arg2[2]));
+  fiat_p256_mulx_u32(&x164, &x165, x2, (arg2[1]));
+  fiat_p256_mulx_u32(&x166, &x167, x2, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x168, &x169, 0x0, x167, x164);
+  fiat_p256_addcarryx_u32(&x170, &x171, x169, x165, x162);
+  fiat_p256_addcarryx_u32(&x172, &x173, x171, x163, x160);
+  fiat_p256_addcarryx_u32(&x174, &x175, x173, x161, x158);
+  fiat_p256_addcarryx_u32(&x176, &x177, x175, x159, x156);
+  fiat_p256_addcarryx_u32(&x178, &x179, x177, x157, x154);
+  fiat_p256_addcarryx_u32(&x180, &x181, x179, x155, x152);
+  x182 = (x181 + x153);
+  fiat_p256_addcarryx_u32(&x183, &x184, 0x0, x135, x166);
+  fiat_p256_addcarryx_u32(&x185, &x186, x184, x137, x168);
+  fiat_p256_addcarryx_u32(&x187, &x188, x186, x139, x170);
+  fiat_p256_addcarryx_u32(&x189, &x190, x188, x141, x172);
+  fiat_p256_addcarryx_u32(&x191, &x192, x190, x143, x174);
+  fiat_p256_addcarryx_u32(&x193, &x194, x192, x145, x176);
+  fiat_p256_addcarryx_u32(&x195, &x196, x194, x147, x178);
+  fiat_p256_addcarryx_u32(&x197, &x198, x196, x149, x180);
+  fiat_p256_addcarryx_u32(&x199, &x200, x198, x151, x182);
+  fiat_p256_mulx_u32(&x201, &x202, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x203, &x204, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x205, &x206, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x207, &x208, x183, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x209, &x210, 0x0, x208, x205);
+  fiat_p256_addcarryx_u32(&x211, &x212, x210, x206, x203);
+  x213 = (x212 + x204);
+  fiat_p256_addcarryx_u32(&x214, &x215, 0x0, x183, x207);
+  fiat_p256_addcarryx_u32(&x216, &x217, x215, x185, x209);
+  fiat_p256_addcarryx_u32(&x218, &x219, x217, x187, x211);
+  fiat_p256_addcarryx_u32(&x220, &x221, x219, x189, x213);
+  fiat_p256_addcarryx_u32(&x222, &x223, x221, x191, 0x0);
+  fiat_p256_addcarryx_u32(&x224, &x225, x223, x193, 0x0);
+  fiat_p256_addcarryx_u32(&x226, &x227, x225, x195, x183);
+  fiat_p256_addcarryx_u32(&x228, &x229, x227, x197, x201);
+  fiat_p256_addcarryx_u32(&x230, &x231, x229, x199, x202);
+  x232 = ((uint32_t)x231 + x200);
+  fiat_p256_mulx_u32(&x233, &x234, x3, (arg2[7]));
+  fiat_p256_mulx_u32(&x235, &x236, x3, (arg2[6]));
+  fiat_p256_mulx_u32(&x237, &x238, x3, (arg2[5]));
+  fiat_p256_mulx_u32(&x239, &x240, x3, (arg2[4]));
+  fiat_p256_mulx_u32(&x241, &x242, x3, (arg2[3]));
+  fiat_p256_mulx_u32(&x243, &x244, x3, (arg2[2]));
+  fiat_p256_mulx_u32(&x245, &x246, x3, (arg2[1]));
+  fiat_p256_mulx_u32(&x247, &x248, x3, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x249, &x250, 0x0, x248, x245);
+  fiat_p256_addcarryx_u32(&x251, &x252, x250, x246, x243);
+  fiat_p256_addcarryx_u32(&x253, &x254, x252, x244, x241);
+  fiat_p256_addcarryx_u32(&x255, &x256, x254, x242, x239);
+  fiat_p256_addcarryx_u32(&x257, &x258, x256, x240, x237);
+  fiat_p256_addcarryx_u32(&x259, &x260, x258, x238, x235);
+  fiat_p256_addcarryx_u32(&x261, &x262, x260, x236, x233);
+  x263 = (x262 + x234);
+  fiat_p256_addcarryx_u32(&x264, &x265, 0x0, x216, x247);
+  fiat_p256_addcarryx_u32(&x266, &x267, x265, x218, x249);
+  fiat_p256_addcarryx_u32(&x268, &x269, x267, x220, x251);
+  fiat_p256_addcarryx_u32(&x270, &x271, x269, x222, x253);
+  fiat_p256_addcarryx_u32(&x272, &x273, x271, x224, x255);
+  fiat_p256_addcarryx_u32(&x274, &x275, x273, x226, x257);
+  fiat_p256_addcarryx_u32(&x276, &x277, x275, x228, x259);
+  fiat_p256_addcarryx_u32(&x278, &x279, x277, x230, x261);
+  fiat_p256_addcarryx_u32(&x280, &x281, x279, x232, x263);
+  fiat_p256_mulx_u32(&x282, &x283, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x284, &x285, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x286, &x287, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x288, &x289, x264, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x290, &x291, 0x0, x289, x286);
+  fiat_p256_addcarryx_u32(&x292, &x293, x291, x287, x284);
+  x294 = (x293 + x285);
+  fiat_p256_addcarryx_u32(&x295, &x296, 0x0, x264, x288);
+  fiat_p256_addcarryx_u32(&x297, &x298, x296, x266, x290);
+  fiat_p256_addcarryx_u32(&x299, &x300, x298, x268, x292);
+  fiat_p256_addcarryx_u32(&x301, &x302, x300, x270, x294);
+  fiat_p256_addcarryx_u32(&x303, &x304, x302, x272, 0x0);
+  fiat_p256_addcarryx_u32(&x305, &x306, x304, x274, 0x0);
+  fiat_p256_addcarryx_u32(&x307, &x308, x306, x276, x264);
+  fiat_p256_addcarryx_u32(&x309, &x310, x308, x278, x282);
+  fiat_p256_addcarryx_u32(&x311, &x312, x310, x280, x283);
+  x313 = ((uint32_t)x312 + x281);
+  fiat_p256_mulx_u32(&x314, &x315, x4, (arg2[7]));
+  fiat_p256_mulx_u32(&x316, &x317, x4, (arg2[6]));
+  fiat_p256_mulx_u32(&x318, &x319, x4, (arg2[5]));
+  fiat_p256_mulx_u32(&x320, &x321, x4, (arg2[4]));
+  fiat_p256_mulx_u32(&x322, &x323, x4, (arg2[3]));
+  fiat_p256_mulx_u32(&x324, &x325, x4, (arg2[2]));
+  fiat_p256_mulx_u32(&x326, &x327, x4, (arg2[1]));
+  fiat_p256_mulx_u32(&x328, &x329, x4, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x330, &x331, 0x0, x329, x326);
+  fiat_p256_addcarryx_u32(&x332, &x333, x331, x327, x324);
+  fiat_p256_addcarryx_u32(&x334, &x335, x333, x325, x322);
+  fiat_p256_addcarryx_u32(&x336, &x337, x335, x323, x320);
+  fiat_p256_addcarryx_u32(&x338, &x339, x337, x321, x318);
+  fiat_p256_addcarryx_u32(&x340, &x341, x339, x319, x316);
+  fiat_p256_addcarryx_u32(&x342, &x343, x341, x317, x314);
+  x344 = (x343 + x315);
+  fiat_p256_addcarryx_u32(&x345, &x346, 0x0, x297, x328);
+  fiat_p256_addcarryx_u32(&x347, &x348, x346, x299, x330);
+  fiat_p256_addcarryx_u32(&x349, &x350, x348, x301, x332);
+  fiat_p256_addcarryx_u32(&x351, &x352, x350, x303, x334);
+  fiat_p256_addcarryx_u32(&x353, &x354, x352, x305, x336);
+  fiat_p256_addcarryx_u32(&x355, &x356, x354, x307, x338);
+  fiat_p256_addcarryx_u32(&x357, &x358, x356, x309, x340);
+  fiat_p256_addcarryx_u32(&x359, &x360, x358, x311, x342);
+  fiat_p256_addcarryx_u32(&x361, &x362, x360, x313, x344);
+  fiat_p256_mulx_u32(&x363, &x364, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x365, &x366, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x367, &x368, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x369, &x370, x345, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x371, &x372, 0x0, x370, x367);
+  fiat_p256_addcarryx_u32(&x373, &x374, x372, x368, x365);
+  x375 = (x374 + x366);
+  fiat_p256_addcarryx_u32(&x376, &x377, 0x0, x345, x369);
+  fiat_p256_addcarryx_u32(&x378, &x379, x377, x347, x371);
+  fiat_p256_addcarryx_u32(&x380, &x381, x379, x349, x373);
+  fiat_p256_addcarryx_u32(&x382, &x383, x381, x351, x375);
+  fiat_p256_addcarryx_u32(&x384, &x385, x383, x353, 0x0);
+  fiat_p256_addcarryx_u32(&x386, &x387, x385, x355, 0x0);
+  fiat_p256_addcarryx_u32(&x388, &x389, x387, x357, x345);
+  fiat_p256_addcarryx_u32(&x390, &x391, x389, x359, x363);
+  fiat_p256_addcarryx_u32(&x392, &x393, x391, x361, x364);
+  x394 = ((uint32_t)x393 + x362);
+  fiat_p256_mulx_u32(&x395, &x396, x5, (arg2[7]));
+  fiat_p256_mulx_u32(&x397, &x398, x5, (arg2[6]));
+  fiat_p256_mulx_u32(&x399, &x400, x5, (arg2[5]));
+  fiat_p256_mulx_u32(&x401, &x402, x5, (arg2[4]));
+  fiat_p256_mulx_u32(&x403, &x404, x5, (arg2[3]));
+  fiat_p256_mulx_u32(&x405, &x406, x5, (arg2[2]));
+  fiat_p256_mulx_u32(&x407, &x408, x5, (arg2[1]));
+  fiat_p256_mulx_u32(&x409, &x410, x5, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x411, &x412, 0x0, x410, x407);
+  fiat_p256_addcarryx_u32(&x413, &x414, x412, x408, x405);
+  fiat_p256_addcarryx_u32(&x415, &x416, x414, x406, x403);
+  fiat_p256_addcarryx_u32(&x417, &x418, x416, x404, x401);
+  fiat_p256_addcarryx_u32(&x419, &x420, x418, x402, x399);
+  fiat_p256_addcarryx_u32(&x421, &x422, x420, x400, x397);
+  fiat_p256_addcarryx_u32(&x423, &x424, x422, x398, x395);
+  x425 = (x424 + x396);
+  fiat_p256_addcarryx_u32(&x426, &x427, 0x0, x378, x409);
+  fiat_p256_addcarryx_u32(&x428, &x429, x427, x380, x411);
+  fiat_p256_addcarryx_u32(&x430, &x431, x429, x382, x413);
+  fiat_p256_addcarryx_u32(&x432, &x433, x431, x384, x415);
+  fiat_p256_addcarryx_u32(&x434, &x435, x433, x386, x417);
+  fiat_p256_addcarryx_u32(&x436, &x437, x435, x388, x419);
+  fiat_p256_addcarryx_u32(&x438, &x439, x437, x390, x421);
+  fiat_p256_addcarryx_u32(&x440, &x441, x439, x392, x423);
+  fiat_p256_addcarryx_u32(&x442, &x443, x441, x394, x425);
+  fiat_p256_mulx_u32(&x444, &x445, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x446, &x447, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x448, &x449, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x450, &x451, x426, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x452, &x453, 0x0, x451, x448);
+  fiat_p256_addcarryx_u32(&x454, &x455, x453, x449, x446);
+  x456 = (x455 + x447);
+  fiat_p256_addcarryx_u32(&x457, &x458, 0x0, x426, x450);
+  fiat_p256_addcarryx_u32(&x459, &x460, x458, x428, x452);
+  fiat_p256_addcarryx_u32(&x461, &x462, x460, x430, x454);
+  fiat_p256_addcarryx_u32(&x463, &x464, x462, x432, x456);
+  fiat_p256_addcarryx_u32(&x465, &x466, x464, x434, 0x0);
+  fiat_p256_addcarryx_u32(&x467, &x468, x466, x436, 0x0);
+  fiat_p256_addcarryx_u32(&x469, &x470, x468, x438, x426);
+  fiat_p256_addcarryx_u32(&x471, &x472, x470, x440, x444);
+  fiat_p256_addcarryx_u32(&x473, &x474, x472, x442, x445);
+  x475 = ((uint32_t)x474 + x443);
+  fiat_p256_mulx_u32(&x476, &x477, x6, (arg2[7]));
+  fiat_p256_mulx_u32(&x478, &x479, x6, (arg2[6]));
+  fiat_p256_mulx_u32(&x480, &x481, x6, (arg2[5]));
+  fiat_p256_mulx_u32(&x482, &x483, x6, (arg2[4]));
+  fiat_p256_mulx_u32(&x484, &x485, x6, (arg2[3]));
+  fiat_p256_mulx_u32(&x486, &x487, x6, (arg2[2]));
+  fiat_p256_mulx_u32(&x488, &x489, x6, (arg2[1]));
+  fiat_p256_mulx_u32(&x490, &x491, x6, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x492, &x493, 0x0, x491, x488);
+  fiat_p256_addcarryx_u32(&x494, &x495, x493, x489, x486);
+  fiat_p256_addcarryx_u32(&x496, &x497, x495, x487, x484);
+  fiat_p256_addcarryx_u32(&x498, &x499, x497, x485, x482);
+  fiat_p256_addcarryx_u32(&x500, &x501, x499, x483, x480);
+  fiat_p256_addcarryx_u32(&x502, &x503, x501, x481, x478);
+  fiat_p256_addcarryx_u32(&x504, &x505, x503, x479, x476);
+  x506 = (x505 + x477);
+  fiat_p256_addcarryx_u32(&x507, &x508, 0x0, x459, x490);
+  fiat_p256_addcarryx_u32(&x509, &x510, x508, x461, x492);
+  fiat_p256_addcarryx_u32(&x511, &x512, x510, x463, x494);
+  fiat_p256_addcarryx_u32(&x513, &x514, x512, x465, x496);
+  fiat_p256_addcarryx_u32(&x515, &x516, x514, x467, x498);
+  fiat_p256_addcarryx_u32(&x517, &x518, x516, x469, x500);
+  fiat_p256_addcarryx_u32(&x519, &x520, x518, x471, x502);
+  fiat_p256_addcarryx_u32(&x521, &x522, x520, x473, x504);
+  fiat_p256_addcarryx_u32(&x523, &x524, x522, x475, x506);
+  fiat_p256_mulx_u32(&x525, &x526, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x527, &x528, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x529, &x530, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x531, &x532, x507, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x533, &x534, 0x0, x532, x529);
+  fiat_p256_addcarryx_u32(&x535, &x536, x534, x530, x527);
+  x537 = (x536 + x528);
+  fiat_p256_addcarryx_u32(&x538, &x539, 0x0, x507, x531);
+  fiat_p256_addcarryx_u32(&x540, &x541, x539, x509, x533);
+  fiat_p256_addcarryx_u32(&x542, &x543, x541, x511, x535);
+  fiat_p256_addcarryx_u32(&x544, &x545, x543, x513, x537);
+  fiat_p256_addcarryx_u32(&x546, &x547, x545, x515, 0x0);
+  fiat_p256_addcarryx_u32(&x548, &x549, x547, x517, 0x0);
+  fiat_p256_addcarryx_u32(&x550, &x551, x549, x519, x507);
+  fiat_p256_addcarryx_u32(&x552, &x553, x551, x521, x525);
+  fiat_p256_addcarryx_u32(&x554, &x555, x553, x523, x526);
+  x556 = ((uint32_t)x555 + x524);
+  fiat_p256_mulx_u32(&x557, &x558, x7, (arg2[7]));
+  fiat_p256_mulx_u32(&x559, &x560, x7, (arg2[6]));
+  fiat_p256_mulx_u32(&x561, &x562, x7, (arg2[5]));
+  fiat_p256_mulx_u32(&x563, &x564, x7, (arg2[4]));
+  fiat_p256_mulx_u32(&x565, &x566, x7, (arg2[3]));
+  fiat_p256_mulx_u32(&x567, &x568, x7, (arg2[2]));
+  fiat_p256_mulx_u32(&x569, &x570, x7, (arg2[1]));
+  fiat_p256_mulx_u32(&x571, &x572, x7, (arg2[0]));
+  fiat_p256_addcarryx_u32(&x573, &x574, 0x0, x572, x569);
+  fiat_p256_addcarryx_u32(&x575, &x576, x574, x570, x567);
+  fiat_p256_addcarryx_u32(&x577, &x578, x576, x568, x565);
+  fiat_p256_addcarryx_u32(&x579, &x580, x578, x566, x563);
+  fiat_p256_addcarryx_u32(&x581, &x582, x580, x564, x561);
+  fiat_p256_addcarryx_u32(&x583, &x584, x582, x562, x559);
+  fiat_p256_addcarryx_u32(&x585, &x586, x584, x560, x557);
+  x587 = (x586 + x558);
+  fiat_p256_addcarryx_u32(&x588, &x589, 0x0, x540, x571);
+  fiat_p256_addcarryx_u32(&x590, &x591, x589, x542, x573);
+  fiat_p256_addcarryx_u32(&x592, &x593, x591, x544, x575);
+  fiat_p256_addcarryx_u32(&x594, &x595, x593, x546, x577);
+  fiat_p256_addcarryx_u32(&x596, &x597, x595, x548, x579);
+  fiat_p256_addcarryx_u32(&x598, &x599, x597, x550, x581);
+  fiat_p256_addcarryx_u32(&x600, &x601, x599, x552, x583);
+  fiat_p256_addcarryx_u32(&x602, &x603, x601, x554, x585);
+  fiat_p256_addcarryx_u32(&x604, &x605, x603, x556, x587);
+  fiat_p256_mulx_u32(&x606, &x607, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x608, &x609, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x610, &x611, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x612, &x613, x588, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x614, &x615, 0x0, x613, x610);
+  fiat_p256_addcarryx_u32(&x616, &x617, x615, x611, x608);
+  x618 = (x617 + x609);
+  fiat_p256_addcarryx_u32(&x619, &x620, 0x0, x588, x612);
+  fiat_p256_addcarryx_u32(&x621, &x622, x620, x590, x614);
+  fiat_p256_addcarryx_u32(&x623, &x624, x622, x592, x616);
+  fiat_p256_addcarryx_u32(&x625, &x626, x624, x594, x618);
+  fiat_p256_addcarryx_u32(&x627, &x628, x626, x596, 0x0);
+  fiat_p256_addcarryx_u32(&x629, &x630, x628, x598, 0x0);
+  fiat_p256_addcarryx_u32(&x631, &x632, x630, x600, x588);
+  fiat_p256_addcarryx_u32(&x633, &x634, x632, x602, x606);
+  fiat_p256_addcarryx_u32(&x635, &x636, x634, x604, x607);
+  x637 = ((uint32_t)x636 + x605);
+  fiat_p256_subborrowx_u32(&x638, &x639, 0x0, x621, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x640, &x641, x639, x623, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x642, &x643, x641, x625, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x644, &x645, x643, x627, 0x0);
+  fiat_p256_subborrowx_u32(&x646, &x647, x645, x629, 0x0);
+  fiat_p256_subborrowx_u32(&x648, &x649, x647, x631, 0x0);
+  fiat_p256_subborrowx_u32(&x650, &x651, x649, x633, 0x1);
+  fiat_p256_subborrowx_u32(&x652, &x653, x651, x635, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x654, &x655, x653, x637, 0x0);
+  fiat_p256_cmovznz_u32(&x656, x655, x638, x621);
+  fiat_p256_cmovznz_u32(&x657, x655, x640, x623);
+  fiat_p256_cmovznz_u32(&x658, x655, x642, x625);
+  fiat_p256_cmovznz_u32(&x659, x655, x644, x627);
+  fiat_p256_cmovznz_u32(&x660, x655, x646, x629);
+  fiat_p256_cmovznz_u32(&x661, x655, x648, x631);
+  fiat_p256_cmovznz_u32(&x662, x655, x650, x633);
   fiat_p256_cmovznz_u32(&x663, x655, x652, x635);
   out1[0] = x656;
   out1[1] = x657;
@@ -1121,1000 +1186,1028 @@
 
 /*
  * The function fiat_p256_square squares a field element in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_square(uint32_t out1[8], const uint32_t arg1[8]) {
-  uint32_t x1 = (arg1[1]);
-  uint32_t x2 = (arg1[2]);
-  uint32_t x3 = (arg1[3]);
-  uint32_t x4 = (arg1[4]);
-  uint32_t x5 = (arg1[5]);
-  uint32_t x6 = (arg1[6]);
-  uint32_t x7 = (arg1[7]);
-  uint32_t x8 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_square(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
   uint32_t x9;
   uint32_t x10;
-  fiat_p256_mulx_u32(&x9, &x10, x8, (arg1[7]));
   uint32_t x11;
   uint32_t x12;
-  fiat_p256_mulx_u32(&x11, &x12, x8, (arg1[6]));
   uint32_t x13;
   uint32_t x14;
-  fiat_p256_mulx_u32(&x13, &x14, x8, (arg1[5]));
   uint32_t x15;
   uint32_t x16;
-  fiat_p256_mulx_u32(&x15, &x16, x8, (arg1[4]));
   uint32_t x17;
   uint32_t x18;
-  fiat_p256_mulx_u32(&x17, &x18, x8, (arg1[3]));
   uint32_t x19;
   uint32_t x20;
-  fiat_p256_mulx_u32(&x19, &x20, x8, (arg1[2]));
   uint32_t x21;
   uint32_t x22;
-  fiat_p256_mulx_u32(&x21, &x22, x8, (arg1[1]));
   uint32_t x23;
   uint32_t x24;
-  fiat_p256_mulx_u32(&x23, &x24, x8, (arg1[0]));
   uint32_t x25;
   fiat_p256_uint1 x26;
-  fiat_p256_addcarryx_u32(&x25, &x26, 0x0, x24, x21);
   uint32_t x27;
   fiat_p256_uint1 x28;
-  fiat_p256_addcarryx_u32(&x27, &x28, x26, x22, x19);
   uint32_t x29;
   fiat_p256_uint1 x30;
-  fiat_p256_addcarryx_u32(&x29, &x30, x28, x20, x17);
   uint32_t x31;
   fiat_p256_uint1 x32;
-  fiat_p256_addcarryx_u32(&x31, &x32, x30, x18, x15);
   uint32_t x33;
   fiat_p256_uint1 x34;
-  fiat_p256_addcarryx_u32(&x33, &x34, x32, x16, x13);
   uint32_t x35;
   fiat_p256_uint1 x36;
-  fiat_p256_addcarryx_u32(&x35, &x36, x34, x14, x11);
   uint32_t x37;
   fiat_p256_uint1 x38;
-  fiat_p256_addcarryx_u32(&x37, &x38, x36, x12, x9);
-  uint32_t x39 = (x38 + x10);
+  uint32_t x39;
   uint32_t x40;
   uint32_t x41;
-  fiat_p256_mulx_u32(&x40, &x41, x23, UINT32_C(0xffffffff));
   uint32_t x42;
   uint32_t x43;
-  fiat_p256_mulx_u32(&x42, &x43, x23, UINT32_C(0xffffffff));
   uint32_t x44;
   uint32_t x45;
-  fiat_p256_mulx_u32(&x44, &x45, x23, UINT32_C(0xffffffff));
   uint32_t x46;
   uint32_t x47;
-  fiat_p256_mulx_u32(&x46, &x47, x23, UINT32_C(0xffffffff));
   uint32_t x48;
   fiat_p256_uint1 x49;
-  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x47, x44);
   uint32_t x50;
   fiat_p256_uint1 x51;
-  fiat_p256_addcarryx_u32(&x50, &x51, x49, x45, x42);
-  uint32_t x52 = (x51 + x43);
+  uint32_t x52;
   uint32_t x53;
   fiat_p256_uint1 x54;
-  fiat_p256_addcarryx_u32(&x53, &x54, 0x0, x23, x46);
   uint32_t x55;
   fiat_p256_uint1 x56;
-  fiat_p256_addcarryx_u32(&x55, &x56, x54, x25, x48);
   uint32_t x57;
   fiat_p256_uint1 x58;
-  fiat_p256_addcarryx_u32(&x57, &x58, x56, x27, x50);
   uint32_t x59;
   fiat_p256_uint1 x60;
-  fiat_p256_addcarryx_u32(&x59, &x60, x58, x29, x52);
   uint32_t x61;
   fiat_p256_uint1 x62;
-  fiat_p256_addcarryx_u32(&x61, &x62, x60, x31, 0x0);
   uint32_t x63;
   fiat_p256_uint1 x64;
-  fiat_p256_addcarryx_u32(&x63, &x64, x62, x33, 0x0);
   uint32_t x65;
   fiat_p256_uint1 x66;
-  fiat_p256_addcarryx_u32(&x65, &x66, x64, x35, x23);
   uint32_t x67;
   fiat_p256_uint1 x68;
-  fiat_p256_addcarryx_u32(&x67, &x68, x66, x37, x40);
   uint32_t x69;
   fiat_p256_uint1 x70;
-  fiat_p256_addcarryx_u32(&x69, &x70, x68, x39, x41);
   uint32_t x71;
   uint32_t x72;
-  fiat_p256_mulx_u32(&x71, &x72, x1, (arg1[7]));
   uint32_t x73;
   uint32_t x74;
-  fiat_p256_mulx_u32(&x73, &x74, x1, (arg1[6]));
   uint32_t x75;
   uint32_t x76;
-  fiat_p256_mulx_u32(&x75, &x76, x1, (arg1[5]));
   uint32_t x77;
   uint32_t x78;
-  fiat_p256_mulx_u32(&x77, &x78, x1, (arg1[4]));
   uint32_t x79;
   uint32_t x80;
-  fiat_p256_mulx_u32(&x79, &x80, x1, (arg1[3]));
   uint32_t x81;
   uint32_t x82;
-  fiat_p256_mulx_u32(&x81, &x82, x1, (arg1[2]));
   uint32_t x83;
   uint32_t x84;
-  fiat_p256_mulx_u32(&x83, &x84, x1, (arg1[1]));
   uint32_t x85;
   uint32_t x86;
-  fiat_p256_mulx_u32(&x85, &x86, x1, (arg1[0]));
   uint32_t x87;
   fiat_p256_uint1 x88;
-  fiat_p256_addcarryx_u32(&x87, &x88, 0x0, x86, x83);
   uint32_t x89;
   fiat_p256_uint1 x90;
-  fiat_p256_addcarryx_u32(&x89, &x90, x88, x84, x81);
   uint32_t x91;
   fiat_p256_uint1 x92;
-  fiat_p256_addcarryx_u32(&x91, &x92, x90, x82, x79);
   uint32_t x93;
   fiat_p256_uint1 x94;
-  fiat_p256_addcarryx_u32(&x93, &x94, x92, x80, x77);
   uint32_t x95;
   fiat_p256_uint1 x96;
-  fiat_p256_addcarryx_u32(&x95, &x96, x94, x78, x75);
   uint32_t x97;
   fiat_p256_uint1 x98;
-  fiat_p256_addcarryx_u32(&x97, &x98, x96, x76, x73);
   uint32_t x99;
   fiat_p256_uint1 x100;
-  fiat_p256_addcarryx_u32(&x99, &x100, x98, x74, x71);
-  uint32_t x101 = (x100 + x72);
+  uint32_t x101;
   uint32_t x102;
   fiat_p256_uint1 x103;
-  fiat_p256_addcarryx_u32(&x102, &x103, 0x0, x55, x85);
   uint32_t x104;
   fiat_p256_uint1 x105;
-  fiat_p256_addcarryx_u32(&x104, &x105, x103, x57, x87);
   uint32_t x106;
   fiat_p256_uint1 x107;
-  fiat_p256_addcarryx_u32(&x106, &x107, x105, x59, x89);
   uint32_t x108;
   fiat_p256_uint1 x109;
-  fiat_p256_addcarryx_u32(&x108, &x109, x107, x61, x91);
   uint32_t x110;
   fiat_p256_uint1 x111;
-  fiat_p256_addcarryx_u32(&x110, &x111, x109, x63, x93);
   uint32_t x112;
   fiat_p256_uint1 x113;
-  fiat_p256_addcarryx_u32(&x112, &x113, x111, x65, x95);
   uint32_t x114;
   fiat_p256_uint1 x115;
-  fiat_p256_addcarryx_u32(&x114, &x115, x113, x67, x97);
   uint32_t x116;
   fiat_p256_uint1 x117;
-  fiat_p256_addcarryx_u32(&x116, &x117, x115, x69, x99);
   uint32_t x118;
   fiat_p256_uint1 x119;
-  fiat_p256_addcarryx_u32(&x118, &x119, x117, x70, x101);
   uint32_t x120;
   uint32_t x121;
-  fiat_p256_mulx_u32(&x120, &x121, x102, UINT32_C(0xffffffff));
   uint32_t x122;
   uint32_t x123;
-  fiat_p256_mulx_u32(&x122, &x123, x102, UINT32_C(0xffffffff));
   uint32_t x124;
   uint32_t x125;
-  fiat_p256_mulx_u32(&x124, &x125, x102, UINT32_C(0xffffffff));
   uint32_t x126;
   uint32_t x127;
-  fiat_p256_mulx_u32(&x126, &x127, x102, UINT32_C(0xffffffff));
   uint32_t x128;
   fiat_p256_uint1 x129;
-  fiat_p256_addcarryx_u32(&x128, &x129, 0x0, x127, x124);
   uint32_t x130;
   fiat_p256_uint1 x131;
-  fiat_p256_addcarryx_u32(&x130, &x131, x129, x125, x122);
-  uint32_t x132 = (x131 + x123);
+  uint32_t x132;
   uint32_t x133;
   fiat_p256_uint1 x134;
-  fiat_p256_addcarryx_u32(&x133, &x134, 0x0, x102, x126);
   uint32_t x135;
   fiat_p256_uint1 x136;
-  fiat_p256_addcarryx_u32(&x135, &x136, x134, x104, x128);
   uint32_t x137;
   fiat_p256_uint1 x138;
-  fiat_p256_addcarryx_u32(&x137, &x138, x136, x106, x130);
   uint32_t x139;
   fiat_p256_uint1 x140;
-  fiat_p256_addcarryx_u32(&x139, &x140, x138, x108, x132);
   uint32_t x141;
   fiat_p256_uint1 x142;
-  fiat_p256_addcarryx_u32(&x141, &x142, x140, x110, 0x0);
   uint32_t x143;
   fiat_p256_uint1 x144;
-  fiat_p256_addcarryx_u32(&x143, &x144, x142, x112, 0x0);
   uint32_t x145;
   fiat_p256_uint1 x146;
-  fiat_p256_addcarryx_u32(&x145, &x146, x144, x114, x102);
   uint32_t x147;
   fiat_p256_uint1 x148;
-  fiat_p256_addcarryx_u32(&x147, &x148, x146, x116, x120);
   uint32_t x149;
   fiat_p256_uint1 x150;
-  fiat_p256_addcarryx_u32(&x149, &x150, x148, x118, x121);
-  uint32_t x151 = ((uint32_t)x150 + x119);
+  uint32_t x151;
   uint32_t x152;
   uint32_t x153;
-  fiat_p256_mulx_u32(&x152, &x153, x2, (arg1[7]));
   uint32_t x154;
   uint32_t x155;
-  fiat_p256_mulx_u32(&x154, &x155, x2, (arg1[6]));
   uint32_t x156;
   uint32_t x157;
-  fiat_p256_mulx_u32(&x156, &x157, x2, (arg1[5]));
   uint32_t x158;
   uint32_t x159;
-  fiat_p256_mulx_u32(&x158, &x159, x2, (arg1[4]));
   uint32_t x160;
   uint32_t x161;
-  fiat_p256_mulx_u32(&x160, &x161, x2, (arg1[3]));
   uint32_t x162;
   uint32_t x163;
-  fiat_p256_mulx_u32(&x162, &x163, x2, (arg1[2]));
   uint32_t x164;
   uint32_t x165;
-  fiat_p256_mulx_u32(&x164, &x165, x2, (arg1[1]));
   uint32_t x166;
   uint32_t x167;
-  fiat_p256_mulx_u32(&x166, &x167, x2, (arg1[0]));
   uint32_t x168;
   fiat_p256_uint1 x169;
-  fiat_p256_addcarryx_u32(&x168, &x169, 0x0, x167, x164);
   uint32_t x170;
   fiat_p256_uint1 x171;
-  fiat_p256_addcarryx_u32(&x170, &x171, x169, x165, x162);
   uint32_t x172;
   fiat_p256_uint1 x173;
-  fiat_p256_addcarryx_u32(&x172, &x173, x171, x163, x160);
   uint32_t x174;
   fiat_p256_uint1 x175;
-  fiat_p256_addcarryx_u32(&x174, &x175, x173, x161, x158);
   uint32_t x176;
   fiat_p256_uint1 x177;
-  fiat_p256_addcarryx_u32(&x176, &x177, x175, x159, x156);
   uint32_t x178;
   fiat_p256_uint1 x179;
-  fiat_p256_addcarryx_u32(&x178, &x179, x177, x157, x154);
   uint32_t x180;
   fiat_p256_uint1 x181;
-  fiat_p256_addcarryx_u32(&x180, &x181, x179, x155, x152);
-  uint32_t x182 = (x181 + x153);
+  uint32_t x182;
   uint32_t x183;
   fiat_p256_uint1 x184;
-  fiat_p256_addcarryx_u32(&x183, &x184, 0x0, x135, x166);
   uint32_t x185;
   fiat_p256_uint1 x186;
-  fiat_p256_addcarryx_u32(&x185, &x186, x184, x137, x168);
   uint32_t x187;
   fiat_p256_uint1 x188;
-  fiat_p256_addcarryx_u32(&x187, &x188, x186, x139, x170);
   uint32_t x189;
   fiat_p256_uint1 x190;
-  fiat_p256_addcarryx_u32(&x189, &x190, x188, x141, x172);
   uint32_t x191;
   fiat_p256_uint1 x192;
-  fiat_p256_addcarryx_u32(&x191, &x192, x190, x143, x174);
   uint32_t x193;
   fiat_p256_uint1 x194;
-  fiat_p256_addcarryx_u32(&x193, &x194, x192, x145, x176);
   uint32_t x195;
   fiat_p256_uint1 x196;
-  fiat_p256_addcarryx_u32(&x195, &x196, x194, x147, x178);
   uint32_t x197;
   fiat_p256_uint1 x198;
-  fiat_p256_addcarryx_u32(&x197, &x198, x196, x149, x180);
   uint32_t x199;
   fiat_p256_uint1 x200;
-  fiat_p256_addcarryx_u32(&x199, &x200, x198, x151, x182);
   uint32_t x201;
   uint32_t x202;
-  fiat_p256_mulx_u32(&x201, &x202, x183, UINT32_C(0xffffffff));
   uint32_t x203;
   uint32_t x204;
-  fiat_p256_mulx_u32(&x203, &x204, x183, UINT32_C(0xffffffff));
   uint32_t x205;
   uint32_t x206;
-  fiat_p256_mulx_u32(&x205, &x206, x183, UINT32_C(0xffffffff));
   uint32_t x207;
   uint32_t x208;
-  fiat_p256_mulx_u32(&x207, &x208, x183, UINT32_C(0xffffffff));
   uint32_t x209;
   fiat_p256_uint1 x210;
-  fiat_p256_addcarryx_u32(&x209, &x210, 0x0, x208, x205);
   uint32_t x211;
   fiat_p256_uint1 x212;
-  fiat_p256_addcarryx_u32(&x211, &x212, x210, x206, x203);
-  uint32_t x213 = (x212 + x204);
+  uint32_t x213;
   uint32_t x214;
   fiat_p256_uint1 x215;
-  fiat_p256_addcarryx_u32(&x214, &x215, 0x0, x183, x207);
   uint32_t x216;
   fiat_p256_uint1 x217;
-  fiat_p256_addcarryx_u32(&x216, &x217, x215, x185, x209);
   uint32_t x218;
   fiat_p256_uint1 x219;
-  fiat_p256_addcarryx_u32(&x218, &x219, x217, x187, x211);
   uint32_t x220;
   fiat_p256_uint1 x221;
-  fiat_p256_addcarryx_u32(&x220, &x221, x219, x189, x213);
   uint32_t x222;
   fiat_p256_uint1 x223;
-  fiat_p256_addcarryx_u32(&x222, &x223, x221, x191, 0x0);
   uint32_t x224;
   fiat_p256_uint1 x225;
-  fiat_p256_addcarryx_u32(&x224, &x225, x223, x193, 0x0);
   uint32_t x226;
   fiat_p256_uint1 x227;
-  fiat_p256_addcarryx_u32(&x226, &x227, x225, x195, x183);
   uint32_t x228;
   fiat_p256_uint1 x229;
-  fiat_p256_addcarryx_u32(&x228, &x229, x227, x197, x201);
   uint32_t x230;
   fiat_p256_uint1 x231;
-  fiat_p256_addcarryx_u32(&x230, &x231, x229, x199, x202);
-  uint32_t x232 = ((uint32_t)x231 + x200);
+  uint32_t x232;
   uint32_t x233;
   uint32_t x234;
-  fiat_p256_mulx_u32(&x233, &x234, x3, (arg1[7]));
   uint32_t x235;
   uint32_t x236;
-  fiat_p256_mulx_u32(&x235, &x236, x3, (arg1[6]));
   uint32_t x237;
   uint32_t x238;
-  fiat_p256_mulx_u32(&x237, &x238, x3, (arg1[5]));
   uint32_t x239;
   uint32_t x240;
-  fiat_p256_mulx_u32(&x239, &x240, x3, (arg1[4]));
   uint32_t x241;
   uint32_t x242;
-  fiat_p256_mulx_u32(&x241, &x242, x3, (arg1[3]));
   uint32_t x243;
   uint32_t x244;
-  fiat_p256_mulx_u32(&x243, &x244, x3, (arg1[2]));
   uint32_t x245;
   uint32_t x246;
-  fiat_p256_mulx_u32(&x245, &x246, x3, (arg1[1]));
   uint32_t x247;
   uint32_t x248;
-  fiat_p256_mulx_u32(&x247, &x248, x3, (arg1[0]));
   uint32_t x249;
   fiat_p256_uint1 x250;
-  fiat_p256_addcarryx_u32(&x249, &x250, 0x0, x248, x245);
   uint32_t x251;
   fiat_p256_uint1 x252;
-  fiat_p256_addcarryx_u32(&x251, &x252, x250, x246, x243);
   uint32_t x253;
   fiat_p256_uint1 x254;
-  fiat_p256_addcarryx_u32(&x253, &x254, x252, x244, x241);
   uint32_t x255;
   fiat_p256_uint1 x256;
-  fiat_p256_addcarryx_u32(&x255, &x256, x254, x242, x239);
   uint32_t x257;
   fiat_p256_uint1 x258;
-  fiat_p256_addcarryx_u32(&x257, &x258, x256, x240, x237);
   uint32_t x259;
   fiat_p256_uint1 x260;
-  fiat_p256_addcarryx_u32(&x259, &x260, x258, x238, x235);
   uint32_t x261;
   fiat_p256_uint1 x262;
-  fiat_p256_addcarryx_u32(&x261, &x262, x260, x236, x233);
-  uint32_t x263 = (x262 + x234);
+  uint32_t x263;
   uint32_t x264;
   fiat_p256_uint1 x265;
-  fiat_p256_addcarryx_u32(&x264, &x265, 0x0, x216, x247);
   uint32_t x266;
   fiat_p256_uint1 x267;
-  fiat_p256_addcarryx_u32(&x266, &x267, x265, x218, x249);
   uint32_t x268;
   fiat_p256_uint1 x269;
-  fiat_p256_addcarryx_u32(&x268, &x269, x267, x220, x251);
   uint32_t x270;
   fiat_p256_uint1 x271;
-  fiat_p256_addcarryx_u32(&x270, &x271, x269, x222, x253);
   uint32_t x272;
   fiat_p256_uint1 x273;
-  fiat_p256_addcarryx_u32(&x272, &x273, x271, x224, x255);
   uint32_t x274;
   fiat_p256_uint1 x275;
-  fiat_p256_addcarryx_u32(&x274, &x275, x273, x226, x257);
   uint32_t x276;
   fiat_p256_uint1 x277;
-  fiat_p256_addcarryx_u32(&x276, &x277, x275, x228, x259);
   uint32_t x278;
   fiat_p256_uint1 x279;
-  fiat_p256_addcarryx_u32(&x278, &x279, x277, x230, x261);
   uint32_t x280;
   fiat_p256_uint1 x281;
-  fiat_p256_addcarryx_u32(&x280, &x281, x279, x232, x263);
   uint32_t x282;
   uint32_t x283;
-  fiat_p256_mulx_u32(&x282, &x283, x264, UINT32_C(0xffffffff));
   uint32_t x284;
   uint32_t x285;
-  fiat_p256_mulx_u32(&x284, &x285, x264, UINT32_C(0xffffffff));
   uint32_t x286;
   uint32_t x287;
-  fiat_p256_mulx_u32(&x286, &x287, x264, UINT32_C(0xffffffff));
   uint32_t x288;
   uint32_t x289;
-  fiat_p256_mulx_u32(&x288, &x289, x264, UINT32_C(0xffffffff));
   uint32_t x290;
   fiat_p256_uint1 x291;
-  fiat_p256_addcarryx_u32(&x290, &x291, 0x0, x289, x286);
   uint32_t x292;
   fiat_p256_uint1 x293;
-  fiat_p256_addcarryx_u32(&x292, &x293, x291, x287, x284);
-  uint32_t x294 = (x293 + x285);
+  uint32_t x294;
   uint32_t x295;
   fiat_p256_uint1 x296;
-  fiat_p256_addcarryx_u32(&x295, &x296, 0x0, x264, x288);
   uint32_t x297;
   fiat_p256_uint1 x298;
-  fiat_p256_addcarryx_u32(&x297, &x298, x296, x266, x290);
   uint32_t x299;
   fiat_p256_uint1 x300;
-  fiat_p256_addcarryx_u32(&x299, &x300, x298, x268, x292);
   uint32_t x301;
   fiat_p256_uint1 x302;
-  fiat_p256_addcarryx_u32(&x301, &x302, x300, x270, x294);
   uint32_t x303;
   fiat_p256_uint1 x304;
-  fiat_p256_addcarryx_u32(&x303, &x304, x302, x272, 0x0);
   uint32_t x305;
   fiat_p256_uint1 x306;
-  fiat_p256_addcarryx_u32(&x305, &x306, x304, x274, 0x0);
   uint32_t x307;
   fiat_p256_uint1 x308;
-  fiat_p256_addcarryx_u32(&x307, &x308, x306, x276, x264);
   uint32_t x309;
   fiat_p256_uint1 x310;
-  fiat_p256_addcarryx_u32(&x309, &x310, x308, x278, x282);
   uint32_t x311;
   fiat_p256_uint1 x312;
-  fiat_p256_addcarryx_u32(&x311, &x312, x310, x280, x283);
-  uint32_t x313 = ((uint32_t)x312 + x281);
+  uint32_t x313;
   uint32_t x314;
   uint32_t x315;
-  fiat_p256_mulx_u32(&x314, &x315, x4, (arg1[7]));
   uint32_t x316;
   uint32_t x317;
-  fiat_p256_mulx_u32(&x316, &x317, x4, (arg1[6]));
   uint32_t x318;
   uint32_t x319;
-  fiat_p256_mulx_u32(&x318, &x319, x4, (arg1[5]));
   uint32_t x320;
   uint32_t x321;
-  fiat_p256_mulx_u32(&x320, &x321, x4, (arg1[4]));
   uint32_t x322;
   uint32_t x323;
-  fiat_p256_mulx_u32(&x322, &x323, x4, (arg1[3]));
   uint32_t x324;
   uint32_t x325;
-  fiat_p256_mulx_u32(&x324, &x325, x4, (arg1[2]));
   uint32_t x326;
   uint32_t x327;
-  fiat_p256_mulx_u32(&x326, &x327, x4, (arg1[1]));
   uint32_t x328;
   uint32_t x329;
-  fiat_p256_mulx_u32(&x328, &x329, x4, (arg1[0]));
   uint32_t x330;
   fiat_p256_uint1 x331;
-  fiat_p256_addcarryx_u32(&x330, &x331, 0x0, x329, x326);
   uint32_t x332;
   fiat_p256_uint1 x333;
-  fiat_p256_addcarryx_u32(&x332, &x333, x331, x327, x324);
   uint32_t x334;
   fiat_p256_uint1 x335;
-  fiat_p256_addcarryx_u32(&x334, &x335, x333, x325, x322);
   uint32_t x336;
   fiat_p256_uint1 x337;
-  fiat_p256_addcarryx_u32(&x336, &x337, x335, x323, x320);
   uint32_t x338;
   fiat_p256_uint1 x339;
-  fiat_p256_addcarryx_u32(&x338, &x339, x337, x321, x318);
   uint32_t x340;
   fiat_p256_uint1 x341;
-  fiat_p256_addcarryx_u32(&x340, &x341, x339, x319, x316);
   uint32_t x342;
   fiat_p256_uint1 x343;
-  fiat_p256_addcarryx_u32(&x342, &x343, x341, x317, x314);
-  uint32_t x344 = (x343 + x315);
+  uint32_t x344;
   uint32_t x345;
   fiat_p256_uint1 x346;
-  fiat_p256_addcarryx_u32(&x345, &x346, 0x0, x297, x328);
   uint32_t x347;
   fiat_p256_uint1 x348;
-  fiat_p256_addcarryx_u32(&x347, &x348, x346, x299, x330);
   uint32_t x349;
   fiat_p256_uint1 x350;
-  fiat_p256_addcarryx_u32(&x349, &x350, x348, x301, x332);
   uint32_t x351;
   fiat_p256_uint1 x352;
-  fiat_p256_addcarryx_u32(&x351, &x352, x350, x303, x334);
   uint32_t x353;
   fiat_p256_uint1 x354;
-  fiat_p256_addcarryx_u32(&x353, &x354, x352, x305, x336);
   uint32_t x355;
   fiat_p256_uint1 x356;
-  fiat_p256_addcarryx_u32(&x355, &x356, x354, x307, x338);
   uint32_t x357;
   fiat_p256_uint1 x358;
-  fiat_p256_addcarryx_u32(&x357, &x358, x356, x309, x340);
   uint32_t x359;
   fiat_p256_uint1 x360;
-  fiat_p256_addcarryx_u32(&x359, &x360, x358, x311, x342);
   uint32_t x361;
   fiat_p256_uint1 x362;
-  fiat_p256_addcarryx_u32(&x361, &x362, x360, x313, x344);
   uint32_t x363;
   uint32_t x364;
-  fiat_p256_mulx_u32(&x363, &x364, x345, UINT32_C(0xffffffff));
   uint32_t x365;
   uint32_t x366;
-  fiat_p256_mulx_u32(&x365, &x366, x345, UINT32_C(0xffffffff));
   uint32_t x367;
   uint32_t x368;
-  fiat_p256_mulx_u32(&x367, &x368, x345, UINT32_C(0xffffffff));
   uint32_t x369;
   uint32_t x370;
-  fiat_p256_mulx_u32(&x369, &x370, x345, UINT32_C(0xffffffff));
   uint32_t x371;
   fiat_p256_uint1 x372;
-  fiat_p256_addcarryx_u32(&x371, &x372, 0x0, x370, x367);
   uint32_t x373;
   fiat_p256_uint1 x374;
-  fiat_p256_addcarryx_u32(&x373, &x374, x372, x368, x365);
-  uint32_t x375 = (x374 + x366);
+  uint32_t x375;
   uint32_t x376;
   fiat_p256_uint1 x377;
-  fiat_p256_addcarryx_u32(&x376, &x377, 0x0, x345, x369);
   uint32_t x378;
   fiat_p256_uint1 x379;
-  fiat_p256_addcarryx_u32(&x378, &x379, x377, x347, x371);
   uint32_t x380;
   fiat_p256_uint1 x381;
-  fiat_p256_addcarryx_u32(&x380, &x381, x379, x349, x373);
   uint32_t x382;
   fiat_p256_uint1 x383;
-  fiat_p256_addcarryx_u32(&x382, &x383, x381, x351, x375);
   uint32_t x384;
   fiat_p256_uint1 x385;
-  fiat_p256_addcarryx_u32(&x384, &x385, x383, x353, 0x0);
   uint32_t x386;
   fiat_p256_uint1 x387;
-  fiat_p256_addcarryx_u32(&x386, &x387, x385, x355, 0x0);
   uint32_t x388;
   fiat_p256_uint1 x389;
-  fiat_p256_addcarryx_u32(&x388, &x389, x387, x357, x345);
   uint32_t x390;
   fiat_p256_uint1 x391;
-  fiat_p256_addcarryx_u32(&x390, &x391, x389, x359, x363);
   uint32_t x392;
   fiat_p256_uint1 x393;
-  fiat_p256_addcarryx_u32(&x392, &x393, x391, x361, x364);
-  uint32_t x394 = ((uint32_t)x393 + x362);
+  uint32_t x394;
   uint32_t x395;
   uint32_t x396;
-  fiat_p256_mulx_u32(&x395, &x396, x5, (arg1[7]));
   uint32_t x397;
   uint32_t x398;
-  fiat_p256_mulx_u32(&x397, &x398, x5, (arg1[6]));
   uint32_t x399;
   uint32_t x400;
-  fiat_p256_mulx_u32(&x399, &x400, x5, (arg1[5]));
   uint32_t x401;
   uint32_t x402;
-  fiat_p256_mulx_u32(&x401, &x402, x5, (arg1[4]));
   uint32_t x403;
   uint32_t x404;
-  fiat_p256_mulx_u32(&x403, &x404, x5, (arg1[3]));
   uint32_t x405;
   uint32_t x406;
-  fiat_p256_mulx_u32(&x405, &x406, x5, (arg1[2]));
   uint32_t x407;
   uint32_t x408;
-  fiat_p256_mulx_u32(&x407, &x408, x5, (arg1[1]));
   uint32_t x409;
   uint32_t x410;
-  fiat_p256_mulx_u32(&x409, &x410, x5, (arg1[0]));
   uint32_t x411;
   fiat_p256_uint1 x412;
-  fiat_p256_addcarryx_u32(&x411, &x412, 0x0, x410, x407);
   uint32_t x413;
   fiat_p256_uint1 x414;
-  fiat_p256_addcarryx_u32(&x413, &x414, x412, x408, x405);
   uint32_t x415;
   fiat_p256_uint1 x416;
-  fiat_p256_addcarryx_u32(&x415, &x416, x414, x406, x403);
   uint32_t x417;
   fiat_p256_uint1 x418;
-  fiat_p256_addcarryx_u32(&x417, &x418, x416, x404, x401);
   uint32_t x419;
   fiat_p256_uint1 x420;
-  fiat_p256_addcarryx_u32(&x419, &x420, x418, x402, x399);
   uint32_t x421;
   fiat_p256_uint1 x422;
-  fiat_p256_addcarryx_u32(&x421, &x422, x420, x400, x397);
   uint32_t x423;
   fiat_p256_uint1 x424;
-  fiat_p256_addcarryx_u32(&x423, &x424, x422, x398, x395);
-  uint32_t x425 = (x424 + x396);
+  uint32_t x425;
   uint32_t x426;
   fiat_p256_uint1 x427;
-  fiat_p256_addcarryx_u32(&x426, &x427, 0x0, x378, x409);
   uint32_t x428;
   fiat_p256_uint1 x429;
-  fiat_p256_addcarryx_u32(&x428, &x429, x427, x380, x411);
   uint32_t x430;
   fiat_p256_uint1 x431;
-  fiat_p256_addcarryx_u32(&x430, &x431, x429, x382, x413);
   uint32_t x432;
   fiat_p256_uint1 x433;
-  fiat_p256_addcarryx_u32(&x432, &x433, x431, x384, x415);
   uint32_t x434;
   fiat_p256_uint1 x435;
-  fiat_p256_addcarryx_u32(&x434, &x435, x433, x386, x417);
   uint32_t x436;
   fiat_p256_uint1 x437;
-  fiat_p256_addcarryx_u32(&x436, &x437, x435, x388, x419);
   uint32_t x438;
   fiat_p256_uint1 x439;
-  fiat_p256_addcarryx_u32(&x438, &x439, x437, x390, x421);
   uint32_t x440;
   fiat_p256_uint1 x441;
-  fiat_p256_addcarryx_u32(&x440, &x441, x439, x392, x423);
   uint32_t x442;
   fiat_p256_uint1 x443;
-  fiat_p256_addcarryx_u32(&x442, &x443, x441, x394, x425);
   uint32_t x444;
   uint32_t x445;
-  fiat_p256_mulx_u32(&x444, &x445, x426, UINT32_C(0xffffffff));
   uint32_t x446;
   uint32_t x447;
-  fiat_p256_mulx_u32(&x446, &x447, x426, UINT32_C(0xffffffff));
   uint32_t x448;
   uint32_t x449;
-  fiat_p256_mulx_u32(&x448, &x449, x426, UINT32_C(0xffffffff));
   uint32_t x450;
   uint32_t x451;
-  fiat_p256_mulx_u32(&x450, &x451, x426, UINT32_C(0xffffffff));
   uint32_t x452;
   fiat_p256_uint1 x453;
-  fiat_p256_addcarryx_u32(&x452, &x453, 0x0, x451, x448);
   uint32_t x454;
   fiat_p256_uint1 x455;
-  fiat_p256_addcarryx_u32(&x454, &x455, x453, x449, x446);
-  uint32_t x456 = (x455 + x447);
+  uint32_t x456;
   uint32_t x457;
   fiat_p256_uint1 x458;
-  fiat_p256_addcarryx_u32(&x457, &x458, 0x0, x426, x450);
   uint32_t x459;
   fiat_p256_uint1 x460;
-  fiat_p256_addcarryx_u32(&x459, &x460, x458, x428, x452);
   uint32_t x461;
   fiat_p256_uint1 x462;
-  fiat_p256_addcarryx_u32(&x461, &x462, x460, x430, x454);
   uint32_t x463;
   fiat_p256_uint1 x464;
-  fiat_p256_addcarryx_u32(&x463, &x464, x462, x432, x456);
   uint32_t x465;
   fiat_p256_uint1 x466;
-  fiat_p256_addcarryx_u32(&x465, &x466, x464, x434, 0x0);
   uint32_t x467;
   fiat_p256_uint1 x468;
-  fiat_p256_addcarryx_u32(&x467, &x468, x466, x436, 0x0);
   uint32_t x469;
   fiat_p256_uint1 x470;
-  fiat_p256_addcarryx_u32(&x469, &x470, x468, x438, x426);
   uint32_t x471;
   fiat_p256_uint1 x472;
-  fiat_p256_addcarryx_u32(&x471, &x472, x470, x440, x444);
   uint32_t x473;
   fiat_p256_uint1 x474;
-  fiat_p256_addcarryx_u32(&x473, &x474, x472, x442, x445);
-  uint32_t x475 = ((uint32_t)x474 + x443);
+  uint32_t x475;
   uint32_t x476;
   uint32_t x477;
-  fiat_p256_mulx_u32(&x476, &x477, x6, (arg1[7]));
   uint32_t x478;
   uint32_t x479;
-  fiat_p256_mulx_u32(&x478, &x479, x6, (arg1[6]));
   uint32_t x480;
   uint32_t x481;
-  fiat_p256_mulx_u32(&x480, &x481, x6, (arg1[5]));
   uint32_t x482;
   uint32_t x483;
-  fiat_p256_mulx_u32(&x482, &x483, x6, (arg1[4]));
   uint32_t x484;
   uint32_t x485;
-  fiat_p256_mulx_u32(&x484, &x485, x6, (arg1[3]));
   uint32_t x486;
   uint32_t x487;
-  fiat_p256_mulx_u32(&x486, &x487, x6, (arg1[2]));
   uint32_t x488;
   uint32_t x489;
-  fiat_p256_mulx_u32(&x488, &x489, x6, (arg1[1]));
   uint32_t x490;
   uint32_t x491;
-  fiat_p256_mulx_u32(&x490, &x491, x6, (arg1[0]));
   uint32_t x492;
   fiat_p256_uint1 x493;
-  fiat_p256_addcarryx_u32(&x492, &x493, 0x0, x491, x488);
   uint32_t x494;
   fiat_p256_uint1 x495;
-  fiat_p256_addcarryx_u32(&x494, &x495, x493, x489, x486);
   uint32_t x496;
   fiat_p256_uint1 x497;
-  fiat_p256_addcarryx_u32(&x496, &x497, x495, x487, x484);
   uint32_t x498;
   fiat_p256_uint1 x499;
-  fiat_p256_addcarryx_u32(&x498, &x499, x497, x485, x482);
   uint32_t x500;
   fiat_p256_uint1 x501;
-  fiat_p256_addcarryx_u32(&x500, &x501, x499, x483, x480);
   uint32_t x502;
   fiat_p256_uint1 x503;
-  fiat_p256_addcarryx_u32(&x502, &x503, x501, x481, x478);
   uint32_t x504;
   fiat_p256_uint1 x505;
-  fiat_p256_addcarryx_u32(&x504, &x505, x503, x479, x476);
-  uint32_t x506 = (x505 + x477);
+  uint32_t x506;
   uint32_t x507;
   fiat_p256_uint1 x508;
-  fiat_p256_addcarryx_u32(&x507, &x508, 0x0, x459, x490);
   uint32_t x509;
   fiat_p256_uint1 x510;
-  fiat_p256_addcarryx_u32(&x509, &x510, x508, x461, x492);
   uint32_t x511;
   fiat_p256_uint1 x512;
-  fiat_p256_addcarryx_u32(&x511, &x512, x510, x463, x494);
   uint32_t x513;
   fiat_p256_uint1 x514;
-  fiat_p256_addcarryx_u32(&x513, &x514, x512, x465, x496);
   uint32_t x515;
   fiat_p256_uint1 x516;
-  fiat_p256_addcarryx_u32(&x515, &x516, x514, x467, x498);
   uint32_t x517;
   fiat_p256_uint1 x518;
-  fiat_p256_addcarryx_u32(&x517, &x518, x516, x469, x500);
   uint32_t x519;
   fiat_p256_uint1 x520;
-  fiat_p256_addcarryx_u32(&x519, &x520, x518, x471, x502);
   uint32_t x521;
   fiat_p256_uint1 x522;
-  fiat_p256_addcarryx_u32(&x521, &x522, x520, x473, x504);
   uint32_t x523;
   fiat_p256_uint1 x524;
-  fiat_p256_addcarryx_u32(&x523, &x524, x522, x475, x506);
   uint32_t x525;
   uint32_t x526;
-  fiat_p256_mulx_u32(&x525, &x526, x507, UINT32_C(0xffffffff));
   uint32_t x527;
   uint32_t x528;
-  fiat_p256_mulx_u32(&x527, &x528, x507, UINT32_C(0xffffffff));
   uint32_t x529;
   uint32_t x530;
-  fiat_p256_mulx_u32(&x529, &x530, x507, UINT32_C(0xffffffff));
   uint32_t x531;
   uint32_t x532;
-  fiat_p256_mulx_u32(&x531, &x532, x507, UINT32_C(0xffffffff));
   uint32_t x533;
   fiat_p256_uint1 x534;
-  fiat_p256_addcarryx_u32(&x533, &x534, 0x0, x532, x529);
   uint32_t x535;
   fiat_p256_uint1 x536;
-  fiat_p256_addcarryx_u32(&x535, &x536, x534, x530, x527);
-  uint32_t x537 = (x536 + x528);
+  uint32_t x537;
   uint32_t x538;
   fiat_p256_uint1 x539;
-  fiat_p256_addcarryx_u32(&x538, &x539, 0x0, x507, x531);
   uint32_t x540;
   fiat_p256_uint1 x541;
-  fiat_p256_addcarryx_u32(&x540, &x541, x539, x509, x533);
   uint32_t x542;
   fiat_p256_uint1 x543;
-  fiat_p256_addcarryx_u32(&x542, &x543, x541, x511, x535);
   uint32_t x544;
   fiat_p256_uint1 x545;
-  fiat_p256_addcarryx_u32(&x544, &x545, x543, x513, x537);
   uint32_t x546;
   fiat_p256_uint1 x547;
-  fiat_p256_addcarryx_u32(&x546, &x547, x545, x515, 0x0);
   uint32_t x548;
   fiat_p256_uint1 x549;
-  fiat_p256_addcarryx_u32(&x548, &x549, x547, x517, 0x0);
   uint32_t x550;
   fiat_p256_uint1 x551;
-  fiat_p256_addcarryx_u32(&x550, &x551, x549, x519, x507);
   uint32_t x552;
   fiat_p256_uint1 x553;
-  fiat_p256_addcarryx_u32(&x552, &x553, x551, x521, x525);
   uint32_t x554;
   fiat_p256_uint1 x555;
-  fiat_p256_addcarryx_u32(&x554, &x555, x553, x523, x526);
-  uint32_t x556 = ((uint32_t)x555 + x524);
+  uint32_t x556;
   uint32_t x557;
   uint32_t x558;
-  fiat_p256_mulx_u32(&x557, &x558, x7, (arg1[7]));
   uint32_t x559;
   uint32_t x560;
-  fiat_p256_mulx_u32(&x559, &x560, x7, (arg1[6]));
   uint32_t x561;
   uint32_t x562;
-  fiat_p256_mulx_u32(&x561, &x562, x7, (arg1[5]));
   uint32_t x563;
   uint32_t x564;
-  fiat_p256_mulx_u32(&x563, &x564, x7, (arg1[4]));
   uint32_t x565;
   uint32_t x566;
-  fiat_p256_mulx_u32(&x565, &x566, x7, (arg1[3]));
   uint32_t x567;
   uint32_t x568;
-  fiat_p256_mulx_u32(&x567, &x568, x7, (arg1[2]));
   uint32_t x569;
   uint32_t x570;
-  fiat_p256_mulx_u32(&x569, &x570, x7, (arg1[1]));
   uint32_t x571;
   uint32_t x572;
-  fiat_p256_mulx_u32(&x571, &x572, x7, (arg1[0]));
   uint32_t x573;
   fiat_p256_uint1 x574;
-  fiat_p256_addcarryx_u32(&x573, &x574, 0x0, x572, x569);
   uint32_t x575;
   fiat_p256_uint1 x576;
-  fiat_p256_addcarryx_u32(&x575, &x576, x574, x570, x567);
   uint32_t x577;
   fiat_p256_uint1 x578;
-  fiat_p256_addcarryx_u32(&x577, &x578, x576, x568, x565);
   uint32_t x579;
   fiat_p256_uint1 x580;
-  fiat_p256_addcarryx_u32(&x579, &x580, x578, x566, x563);
   uint32_t x581;
   fiat_p256_uint1 x582;
-  fiat_p256_addcarryx_u32(&x581, &x582, x580, x564, x561);
   uint32_t x583;
   fiat_p256_uint1 x584;
-  fiat_p256_addcarryx_u32(&x583, &x584, x582, x562, x559);
   uint32_t x585;
   fiat_p256_uint1 x586;
-  fiat_p256_addcarryx_u32(&x585, &x586, x584, x560, x557);
-  uint32_t x587 = (x586 + x558);
+  uint32_t x587;
   uint32_t x588;
   fiat_p256_uint1 x589;
-  fiat_p256_addcarryx_u32(&x588, &x589, 0x0, x540, x571);
   uint32_t x590;
   fiat_p256_uint1 x591;
-  fiat_p256_addcarryx_u32(&x590, &x591, x589, x542, x573);
   uint32_t x592;
   fiat_p256_uint1 x593;
-  fiat_p256_addcarryx_u32(&x592, &x593, x591, x544, x575);
   uint32_t x594;
   fiat_p256_uint1 x595;
-  fiat_p256_addcarryx_u32(&x594, &x595, x593, x546, x577);
   uint32_t x596;
   fiat_p256_uint1 x597;
-  fiat_p256_addcarryx_u32(&x596, &x597, x595, x548, x579);
   uint32_t x598;
   fiat_p256_uint1 x599;
-  fiat_p256_addcarryx_u32(&x598, &x599, x597, x550, x581);
   uint32_t x600;
   fiat_p256_uint1 x601;
-  fiat_p256_addcarryx_u32(&x600, &x601, x599, x552, x583);
   uint32_t x602;
   fiat_p256_uint1 x603;
-  fiat_p256_addcarryx_u32(&x602, &x603, x601, x554, x585);
   uint32_t x604;
   fiat_p256_uint1 x605;
-  fiat_p256_addcarryx_u32(&x604, &x605, x603, x556, x587);
   uint32_t x606;
   uint32_t x607;
-  fiat_p256_mulx_u32(&x606, &x607, x588, UINT32_C(0xffffffff));
   uint32_t x608;
   uint32_t x609;
-  fiat_p256_mulx_u32(&x608, &x609, x588, UINT32_C(0xffffffff));
   uint32_t x610;
   uint32_t x611;
-  fiat_p256_mulx_u32(&x610, &x611, x588, UINT32_C(0xffffffff));
   uint32_t x612;
   uint32_t x613;
-  fiat_p256_mulx_u32(&x612, &x613, x588, UINT32_C(0xffffffff));
   uint32_t x614;
   fiat_p256_uint1 x615;
-  fiat_p256_addcarryx_u32(&x614, &x615, 0x0, x613, x610);
   uint32_t x616;
   fiat_p256_uint1 x617;
-  fiat_p256_addcarryx_u32(&x616, &x617, x615, x611, x608);
-  uint32_t x618 = (x617 + x609);
+  uint32_t x618;
   uint32_t x619;
   fiat_p256_uint1 x620;
-  fiat_p256_addcarryx_u32(&x619, &x620, 0x0, x588, x612);
   uint32_t x621;
   fiat_p256_uint1 x622;
-  fiat_p256_addcarryx_u32(&x621, &x622, x620, x590, x614);
   uint32_t x623;
   fiat_p256_uint1 x624;
-  fiat_p256_addcarryx_u32(&x623, &x624, x622, x592, x616);
   uint32_t x625;
   fiat_p256_uint1 x626;
-  fiat_p256_addcarryx_u32(&x625, &x626, x624, x594, x618);
   uint32_t x627;
   fiat_p256_uint1 x628;
-  fiat_p256_addcarryx_u32(&x627, &x628, x626, x596, 0x0);
   uint32_t x629;
   fiat_p256_uint1 x630;
-  fiat_p256_addcarryx_u32(&x629, &x630, x628, x598, 0x0);
   uint32_t x631;
   fiat_p256_uint1 x632;
-  fiat_p256_addcarryx_u32(&x631, &x632, x630, x600, x588);
   uint32_t x633;
   fiat_p256_uint1 x634;
-  fiat_p256_addcarryx_u32(&x633, &x634, x632, x602, x606);
   uint32_t x635;
   fiat_p256_uint1 x636;
-  fiat_p256_addcarryx_u32(&x635, &x636, x634, x604, x607);
-  uint32_t x637 = ((uint32_t)x636 + x605);
+  uint32_t x637;
   uint32_t x638;
   fiat_p256_uint1 x639;
-  fiat_p256_subborrowx_u32(&x638, &x639, 0x0, x621, UINT32_C(0xffffffff));
   uint32_t x640;
   fiat_p256_uint1 x641;
-  fiat_p256_subborrowx_u32(&x640, &x641, x639, x623, UINT32_C(0xffffffff));
   uint32_t x642;
   fiat_p256_uint1 x643;
-  fiat_p256_subborrowx_u32(&x642, &x643, x641, x625, UINT32_C(0xffffffff));
   uint32_t x644;
   fiat_p256_uint1 x645;
-  fiat_p256_subborrowx_u32(&x644, &x645, x643, x627, 0x0);
   uint32_t x646;
   fiat_p256_uint1 x647;
-  fiat_p256_subborrowx_u32(&x646, &x647, x645, x629, 0x0);
   uint32_t x648;
   fiat_p256_uint1 x649;
-  fiat_p256_subborrowx_u32(&x648, &x649, x647, x631, 0x0);
   uint32_t x650;
   fiat_p256_uint1 x651;
-  fiat_p256_subborrowx_u32(&x650, &x651, x649, x633, 0x1);
   uint32_t x652;
   fiat_p256_uint1 x653;
-  fiat_p256_subborrowx_u32(&x652, &x653, x651, x635, UINT32_C(0xffffffff));
   uint32_t x654;
   fiat_p256_uint1 x655;
-  fiat_p256_subborrowx_u32(&x654, &x655, x653, x637, 0x0);
   uint32_t x656;
-  fiat_p256_cmovznz_u32(&x656, x655, x638, x621);
   uint32_t x657;
-  fiat_p256_cmovznz_u32(&x657, x655, x640, x623);
   uint32_t x658;
-  fiat_p256_cmovznz_u32(&x658, x655, x642, x625);
   uint32_t x659;
-  fiat_p256_cmovznz_u32(&x659, x655, x644, x627);
   uint32_t x660;
-  fiat_p256_cmovznz_u32(&x660, x655, x646, x629);
   uint32_t x661;
-  fiat_p256_cmovznz_u32(&x661, x655, x648, x631);
   uint32_t x662;
-  fiat_p256_cmovznz_u32(&x662, x655, x650, x633);
   uint32_t x663;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[4]);
+  x5 = (arg1[5]);
+  x6 = (arg1[6]);
+  x7 = (arg1[7]);
+  x8 = (arg1[0]);
+  fiat_p256_mulx_u32(&x9, &x10, x8, (arg1[7]));
+  fiat_p256_mulx_u32(&x11, &x12, x8, (arg1[6]));
+  fiat_p256_mulx_u32(&x13, &x14, x8, (arg1[5]));
+  fiat_p256_mulx_u32(&x15, &x16, x8, (arg1[4]));
+  fiat_p256_mulx_u32(&x17, &x18, x8, (arg1[3]));
+  fiat_p256_mulx_u32(&x19, &x20, x8, (arg1[2]));
+  fiat_p256_mulx_u32(&x21, &x22, x8, (arg1[1]));
+  fiat_p256_mulx_u32(&x23, &x24, x8, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x25, &x26, 0x0, x24, x21);
+  fiat_p256_addcarryx_u32(&x27, &x28, x26, x22, x19);
+  fiat_p256_addcarryx_u32(&x29, &x30, x28, x20, x17);
+  fiat_p256_addcarryx_u32(&x31, &x32, x30, x18, x15);
+  fiat_p256_addcarryx_u32(&x33, &x34, x32, x16, x13);
+  fiat_p256_addcarryx_u32(&x35, &x36, x34, x14, x11);
+  fiat_p256_addcarryx_u32(&x37, &x38, x36, x12, x9);
+  x39 = (x38 + x10);
+  fiat_p256_mulx_u32(&x40, &x41, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x42, &x43, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x44, &x45, x23, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x46, &x47, x23, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x47, x44);
+  fiat_p256_addcarryx_u32(&x50, &x51, x49, x45, x42);
+  x52 = (x51 + x43);
+  fiat_p256_addcarryx_u32(&x53, &x54, 0x0, x23, x46);
+  fiat_p256_addcarryx_u32(&x55, &x56, x54, x25, x48);
+  fiat_p256_addcarryx_u32(&x57, &x58, x56, x27, x50);
+  fiat_p256_addcarryx_u32(&x59, &x60, x58, x29, x52);
+  fiat_p256_addcarryx_u32(&x61, &x62, x60, x31, 0x0);
+  fiat_p256_addcarryx_u32(&x63, &x64, x62, x33, 0x0);
+  fiat_p256_addcarryx_u32(&x65, &x66, x64, x35, x23);
+  fiat_p256_addcarryx_u32(&x67, &x68, x66, x37, x40);
+  fiat_p256_addcarryx_u32(&x69, &x70, x68, x39, x41);
+  fiat_p256_mulx_u32(&x71, &x72, x1, (arg1[7]));
+  fiat_p256_mulx_u32(&x73, &x74, x1, (arg1[6]));
+  fiat_p256_mulx_u32(&x75, &x76, x1, (arg1[5]));
+  fiat_p256_mulx_u32(&x77, &x78, x1, (arg1[4]));
+  fiat_p256_mulx_u32(&x79, &x80, x1, (arg1[3]));
+  fiat_p256_mulx_u32(&x81, &x82, x1, (arg1[2]));
+  fiat_p256_mulx_u32(&x83, &x84, x1, (arg1[1]));
+  fiat_p256_mulx_u32(&x85, &x86, x1, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x87, &x88, 0x0, x86, x83);
+  fiat_p256_addcarryx_u32(&x89, &x90, x88, x84, x81);
+  fiat_p256_addcarryx_u32(&x91, &x92, x90, x82, x79);
+  fiat_p256_addcarryx_u32(&x93, &x94, x92, x80, x77);
+  fiat_p256_addcarryx_u32(&x95, &x96, x94, x78, x75);
+  fiat_p256_addcarryx_u32(&x97, &x98, x96, x76, x73);
+  fiat_p256_addcarryx_u32(&x99, &x100, x98, x74, x71);
+  x101 = (x100 + x72);
+  fiat_p256_addcarryx_u32(&x102, &x103, 0x0, x55, x85);
+  fiat_p256_addcarryx_u32(&x104, &x105, x103, x57, x87);
+  fiat_p256_addcarryx_u32(&x106, &x107, x105, x59, x89);
+  fiat_p256_addcarryx_u32(&x108, &x109, x107, x61, x91);
+  fiat_p256_addcarryx_u32(&x110, &x111, x109, x63, x93);
+  fiat_p256_addcarryx_u32(&x112, &x113, x111, x65, x95);
+  fiat_p256_addcarryx_u32(&x114, &x115, x113, x67, x97);
+  fiat_p256_addcarryx_u32(&x116, &x117, x115, x69, x99);
+  fiat_p256_addcarryx_u32(&x118, &x119, x117, x70, x101);
+  fiat_p256_mulx_u32(&x120, &x121, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x122, &x123, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x124, &x125, x102, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x126, &x127, x102, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x128, &x129, 0x0, x127, x124);
+  fiat_p256_addcarryx_u32(&x130, &x131, x129, x125, x122);
+  x132 = (x131 + x123);
+  fiat_p256_addcarryx_u32(&x133, &x134, 0x0, x102, x126);
+  fiat_p256_addcarryx_u32(&x135, &x136, x134, x104, x128);
+  fiat_p256_addcarryx_u32(&x137, &x138, x136, x106, x130);
+  fiat_p256_addcarryx_u32(&x139, &x140, x138, x108, x132);
+  fiat_p256_addcarryx_u32(&x141, &x142, x140, x110, 0x0);
+  fiat_p256_addcarryx_u32(&x143, &x144, x142, x112, 0x0);
+  fiat_p256_addcarryx_u32(&x145, &x146, x144, x114, x102);
+  fiat_p256_addcarryx_u32(&x147, &x148, x146, x116, x120);
+  fiat_p256_addcarryx_u32(&x149, &x150, x148, x118, x121);
+  x151 = ((uint32_t)x150 + x119);
+  fiat_p256_mulx_u32(&x152, &x153, x2, (arg1[7]));
+  fiat_p256_mulx_u32(&x154, &x155, x2, (arg1[6]));
+  fiat_p256_mulx_u32(&x156, &x157, x2, (arg1[5]));
+  fiat_p256_mulx_u32(&x158, &x159, x2, (arg1[4]));
+  fiat_p256_mulx_u32(&x160, &x161, x2, (arg1[3]));
+  fiat_p256_mulx_u32(&x162, &x163, x2, (arg1[2]));
+  fiat_p256_mulx_u32(&x164, &x165, x2, (arg1[1]));
+  fiat_p256_mulx_u32(&x166, &x167, x2, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x168, &x169, 0x0, x167, x164);
+  fiat_p256_addcarryx_u32(&x170, &x171, x169, x165, x162);
+  fiat_p256_addcarryx_u32(&x172, &x173, x171, x163, x160);
+  fiat_p256_addcarryx_u32(&x174, &x175, x173, x161, x158);
+  fiat_p256_addcarryx_u32(&x176, &x177, x175, x159, x156);
+  fiat_p256_addcarryx_u32(&x178, &x179, x177, x157, x154);
+  fiat_p256_addcarryx_u32(&x180, &x181, x179, x155, x152);
+  x182 = (x181 + x153);
+  fiat_p256_addcarryx_u32(&x183, &x184, 0x0, x135, x166);
+  fiat_p256_addcarryx_u32(&x185, &x186, x184, x137, x168);
+  fiat_p256_addcarryx_u32(&x187, &x188, x186, x139, x170);
+  fiat_p256_addcarryx_u32(&x189, &x190, x188, x141, x172);
+  fiat_p256_addcarryx_u32(&x191, &x192, x190, x143, x174);
+  fiat_p256_addcarryx_u32(&x193, &x194, x192, x145, x176);
+  fiat_p256_addcarryx_u32(&x195, &x196, x194, x147, x178);
+  fiat_p256_addcarryx_u32(&x197, &x198, x196, x149, x180);
+  fiat_p256_addcarryx_u32(&x199, &x200, x198, x151, x182);
+  fiat_p256_mulx_u32(&x201, &x202, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x203, &x204, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x205, &x206, x183, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x207, &x208, x183, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x209, &x210, 0x0, x208, x205);
+  fiat_p256_addcarryx_u32(&x211, &x212, x210, x206, x203);
+  x213 = (x212 + x204);
+  fiat_p256_addcarryx_u32(&x214, &x215, 0x0, x183, x207);
+  fiat_p256_addcarryx_u32(&x216, &x217, x215, x185, x209);
+  fiat_p256_addcarryx_u32(&x218, &x219, x217, x187, x211);
+  fiat_p256_addcarryx_u32(&x220, &x221, x219, x189, x213);
+  fiat_p256_addcarryx_u32(&x222, &x223, x221, x191, 0x0);
+  fiat_p256_addcarryx_u32(&x224, &x225, x223, x193, 0x0);
+  fiat_p256_addcarryx_u32(&x226, &x227, x225, x195, x183);
+  fiat_p256_addcarryx_u32(&x228, &x229, x227, x197, x201);
+  fiat_p256_addcarryx_u32(&x230, &x231, x229, x199, x202);
+  x232 = ((uint32_t)x231 + x200);
+  fiat_p256_mulx_u32(&x233, &x234, x3, (arg1[7]));
+  fiat_p256_mulx_u32(&x235, &x236, x3, (arg1[6]));
+  fiat_p256_mulx_u32(&x237, &x238, x3, (arg1[5]));
+  fiat_p256_mulx_u32(&x239, &x240, x3, (arg1[4]));
+  fiat_p256_mulx_u32(&x241, &x242, x3, (arg1[3]));
+  fiat_p256_mulx_u32(&x243, &x244, x3, (arg1[2]));
+  fiat_p256_mulx_u32(&x245, &x246, x3, (arg1[1]));
+  fiat_p256_mulx_u32(&x247, &x248, x3, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x249, &x250, 0x0, x248, x245);
+  fiat_p256_addcarryx_u32(&x251, &x252, x250, x246, x243);
+  fiat_p256_addcarryx_u32(&x253, &x254, x252, x244, x241);
+  fiat_p256_addcarryx_u32(&x255, &x256, x254, x242, x239);
+  fiat_p256_addcarryx_u32(&x257, &x258, x256, x240, x237);
+  fiat_p256_addcarryx_u32(&x259, &x260, x258, x238, x235);
+  fiat_p256_addcarryx_u32(&x261, &x262, x260, x236, x233);
+  x263 = (x262 + x234);
+  fiat_p256_addcarryx_u32(&x264, &x265, 0x0, x216, x247);
+  fiat_p256_addcarryx_u32(&x266, &x267, x265, x218, x249);
+  fiat_p256_addcarryx_u32(&x268, &x269, x267, x220, x251);
+  fiat_p256_addcarryx_u32(&x270, &x271, x269, x222, x253);
+  fiat_p256_addcarryx_u32(&x272, &x273, x271, x224, x255);
+  fiat_p256_addcarryx_u32(&x274, &x275, x273, x226, x257);
+  fiat_p256_addcarryx_u32(&x276, &x277, x275, x228, x259);
+  fiat_p256_addcarryx_u32(&x278, &x279, x277, x230, x261);
+  fiat_p256_addcarryx_u32(&x280, &x281, x279, x232, x263);
+  fiat_p256_mulx_u32(&x282, &x283, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x284, &x285, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x286, &x287, x264, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x288, &x289, x264, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x290, &x291, 0x0, x289, x286);
+  fiat_p256_addcarryx_u32(&x292, &x293, x291, x287, x284);
+  x294 = (x293 + x285);
+  fiat_p256_addcarryx_u32(&x295, &x296, 0x0, x264, x288);
+  fiat_p256_addcarryx_u32(&x297, &x298, x296, x266, x290);
+  fiat_p256_addcarryx_u32(&x299, &x300, x298, x268, x292);
+  fiat_p256_addcarryx_u32(&x301, &x302, x300, x270, x294);
+  fiat_p256_addcarryx_u32(&x303, &x304, x302, x272, 0x0);
+  fiat_p256_addcarryx_u32(&x305, &x306, x304, x274, 0x0);
+  fiat_p256_addcarryx_u32(&x307, &x308, x306, x276, x264);
+  fiat_p256_addcarryx_u32(&x309, &x310, x308, x278, x282);
+  fiat_p256_addcarryx_u32(&x311, &x312, x310, x280, x283);
+  x313 = ((uint32_t)x312 + x281);
+  fiat_p256_mulx_u32(&x314, &x315, x4, (arg1[7]));
+  fiat_p256_mulx_u32(&x316, &x317, x4, (arg1[6]));
+  fiat_p256_mulx_u32(&x318, &x319, x4, (arg1[5]));
+  fiat_p256_mulx_u32(&x320, &x321, x4, (arg1[4]));
+  fiat_p256_mulx_u32(&x322, &x323, x4, (arg1[3]));
+  fiat_p256_mulx_u32(&x324, &x325, x4, (arg1[2]));
+  fiat_p256_mulx_u32(&x326, &x327, x4, (arg1[1]));
+  fiat_p256_mulx_u32(&x328, &x329, x4, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x330, &x331, 0x0, x329, x326);
+  fiat_p256_addcarryx_u32(&x332, &x333, x331, x327, x324);
+  fiat_p256_addcarryx_u32(&x334, &x335, x333, x325, x322);
+  fiat_p256_addcarryx_u32(&x336, &x337, x335, x323, x320);
+  fiat_p256_addcarryx_u32(&x338, &x339, x337, x321, x318);
+  fiat_p256_addcarryx_u32(&x340, &x341, x339, x319, x316);
+  fiat_p256_addcarryx_u32(&x342, &x343, x341, x317, x314);
+  x344 = (x343 + x315);
+  fiat_p256_addcarryx_u32(&x345, &x346, 0x0, x297, x328);
+  fiat_p256_addcarryx_u32(&x347, &x348, x346, x299, x330);
+  fiat_p256_addcarryx_u32(&x349, &x350, x348, x301, x332);
+  fiat_p256_addcarryx_u32(&x351, &x352, x350, x303, x334);
+  fiat_p256_addcarryx_u32(&x353, &x354, x352, x305, x336);
+  fiat_p256_addcarryx_u32(&x355, &x356, x354, x307, x338);
+  fiat_p256_addcarryx_u32(&x357, &x358, x356, x309, x340);
+  fiat_p256_addcarryx_u32(&x359, &x360, x358, x311, x342);
+  fiat_p256_addcarryx_u32(&x361, &x362, x360, x313, x344);
+  fiat_p256_mulx_u32(&x363, &x364, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x365, &x366, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x367, &x368, x345, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x369, &x370, x345, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x371, &x372, 0x0, x370, x367);
+  fiat_p256_addcarryx_u32(&x373, &x374, x372, x368, x365);
+  x375 = (x374 + x366);
+  fiat_p256_addcarryx_u32(&x376, &x377, 0x0, x345, x369);
+  fiat_p256_addcarryx_u32(&x378, &x379, x377, x347, x371);
+  fiat_p256_addcarryx_u32(&x380, &x381, x379, x349, x373);
+  fiat_p256_addcarryx_u32(&x382, &x383, x381, x351, x375);
+  fiat_p256_addcarryx_u32(&x384, &x385, x383, x353, 0x0);
+  fiat_p256_addcarryx_u32(&x386, &x387, x385, x355, 0x0);
+  fiat_p256_addcarryx_u32(&x388, &x389, x387, x357, x345);
+  fiat_p256_addcarryx_u32(&x390, &x391, x389, x359, x363);
+  fiat_p256_addcarryx_u32(&x392, &x393, x391, x361, x364);
+  x394 = ((uint32_t)x393 + x362);
+  fiat_p256_mulx_u32(&x395, &x396, x5, (arg1[7]));
+  fiat_p256_mulx_u32(&x397, &x398, x5, (arg1[6]));
+  fiat_p256_mulx_u32(&x399, &x400, x5, (arg1[5]));
+  fiat_p256_mulx_u32(&x401, &x402, x5, (arg1[4]));
+  fiat_p256_mulx_u32(&x403, &x404, x5, (arg1[3]));
+  fiat_p256_mulx_u32(&x405, &x406, x5, (arg1[2]));
+  fiat_p256_mulx_u32(&x407, &x408, x5, (arg1[1]));
+  fiat_p256_mulx_u32(&x409, &x410, x5, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x411, &x412, 0x0, x410, x407);
+  fiat_p256_addcarryx_u32(&x413, &x414, x412, x408, x405);
+  fiat_p256_addcarryx_u32(&x415, &x416, x414, x406, x403);
+  fiat_p256_addcarryx_u32(&x417, &x418, x416, x404, x401);
+  fiat_p256_addcarryx_u32(&x419, &x420, x418, x402, x399);
+  fiat_p256_addcarryx_u32(&x421, &x422, x420, x400, x397);
+  fiat_p256_addcarryx_u32(&x423, &x424, x422, x398, x395);
+  x425 = (x424 + x396);
+  fiat_p256_addcarryx_u32(&x426, &x427, 0x0, x378, x409);
+  fiat_p256_addcarryx_u32(&x428, &x429, x427, x380, x411);
+  fiat_p256_addcarryx_u32(&x430, &x431, x429, x382, x413);
+  fiat_p256_addcarryx_u32(&x432, &x433, x431, x384, x415);
+  fiat_p256_addcarryx_u32(&x434, &x435, x433, x386, x417);
+  fiat_p256_addcarryx_u32(&x436, &x437, x435, x388, x419);
+  fiat_p256_addcarryx_u32(&x438, &x439, x437, x390, x421);
+  fiat_p256_addcarryx_u32(&x440, &x441, x439, x392, x423);
+  fiat_p256_addcarryx_u32(&x442, &x443, x441, x394, x425);
+  fiat_p256_mulx_u32(&x444, &x445, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x446, &x447, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x448, &x449, x426, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x450, &x451, x426, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x452, &x453, 0x0, x451, x448);
+  fiat_p256_addcarryx_u32(&x454, &x455, x453, x449, x446);
+  x456 = (x455 + x447);
+  fiat_p256_addcarryx_u32(&x457, &x458, 0x0, x426, x450);
+  fiat_p256_addcarryx_u32(&x459, &x460, x458, x428, x452);
+  fiat_p256_addcarryx_u32(&x461, &x462, x460, x430, x454);
+  fiat_p256_addcarryx_u32(&x463, &x464, x462, x432, x456);
+  fiat_p256_addcarryx_u32(&x465, &x466, x464, x434, 0x0);
+  fiat_p256_addcarryx_u32(&x467, &x468, x466, x436, 0x0);
+  fiat_p256_addcarryx_u32(&x469, &x470, x468, x438, x426);
+  fiat_p256_addcarryx_u32(&x471, &x472, x470, x440, x444);
+  fiat_p256_addcarryx_u32(&x473, &x474, x472, x442, x445);
+  x475 = ((uint32_t)x474 + x443);
+  fiat_p256_mulx_u32(&x476, &x477, x6, (arg1[7]));
+  fiat_p256_mulx_u32(&x478, &x479, x6, (arg1[6]));
+  fiat_p256_mulx_u32(&x480, &x481, x6, (arg1[5]));
+  fiat_p256_mulx_u32(&x482, &x483, x6, (arg1[4]));
+  fiat_p256_mulx_u32(&x484, &x485, x6, (arg1[3]));
+  fiat_p256_mulx_u32(&x486, &x487, x6, (arg1[2]));
+  fiat_p256_mulx_u32(&x488, &x489, x6, (arg1[1]));
+  fiat_p256_mulx_u32(&x490, &x491, x6, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x492, &x493, 0x0, x491, x488);
+  fiat_p256_addcarryx_u32(&x494, &x495, x493, x489, x486);
+  fiat_p256_addcarryx_u32(&x496, &x497, x495, x487, x484);
+  fiat_p256_addcarryx_u32(&x498, &x499, x497, x485, x482);
+  fiat_p256_addcarryx_u32(&x500, &x501, x499, x483, x480);
+  fiat_p256_addcarryx_u32(&x502, &x503, x501, x481, x478);
+  fiat_p256_addcarryx_u32(&x504, &x505, x503, x479, x476);
+  x506 = (x505 + x477);
+  fiat_p256_addcarryx_u32(&x507, &x508, 0x0, x459, x490);
+  fiat_p256_addcarryx_u32(&x509, &x510, x508, x461, x492);
+  fiat_p256_addcarryx_u32(&x511, &x512, x510, x463, x494);
+  fiat_p256_addcarryx_u32(&x513, &x514, x512, x465, x496);
+  fiat_p256_addcarryx_u32(&x515, &x516, x514, x467, x498);
+  fiat_p256_addcarryx_u32(&x517, &x518, x516, x469, x500);
+  fiat_p256_addcarryx_u32(&x519, &x520, x518, x471, x502);
+  fiat_p256_addcarryx_u32(&x521, &x522, x520, x473, x504);
+  fiat_p256_addcarryx_u32(&x523, &x524, x522, x475, x506);
+  fiat_p256_mulx_u32(&x525, &x526, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x527, &x528, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x529, &x530, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x531, &x532, x507, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x533, &x534, 0x0, x532, x529);
+  fiat_p256_addcarryx_u32(&x535, &x536, x534, x530, x527);
+  x537 = (x536 + x528);
+  fiat_p256_addcarryx_u32(&x538, &x539, 0x0, x507, x531);
+  fiat_p256_addcarryx_u32(&x540, &x541, x539, x509, x533);
+  fiat_p256_addcarryx_u32(&x542, &x543, x541, x511, x535);
+  fiat_p256_addcarryx_u32(&x544, &x545, x543, x513, x537);
+  fiat_p256_addcarryx_u32(&x546, &x547, x545, x515, 0x0);
+  fiat_p256_addcarryx_u32(&x548, &x549, x547, x517, 0x0);
+  fiat_p256_addcarryx_u32(&x550, &x551, x549, x519, x507);
+  fiat_p256_addcarryx_u32(&x552, &x553, x551, x521, x525);
+  fiat_p256_addcarryx_u32(&x554, &x555, x553, x523, x526);
+  x556 = ((uint32_t)x555 + x524);
+  fiat_p256_mulx_u32(&x557, &x558, x7, (arg1[7]));
+  fiat_p256_mulx_u32(&x559, &x560, x7, (arg1[6]));
+  fiat_p256_mulx_u32(&x561, &x562, x7, (arg1[5]));
+  fiat_p256_mulx_u32(&x563, &x564, x7, (arg1[4]));
+  fiat_p256_mulx_u32(&x565, &x566, x7, (arg1[3]));
+  fiat_p256_mulx_u32(&x567, &x568, x7, (arg1[2]));
+  fiat_p256_mulx_u32(&x569, &x570, x7, (arg1[1]));
+  fiat_p256_mulx_u32(&x571, &x572, x7, (arg1[0]));
+  fiat_p256_addcarryx_u32(&x573, &x574, 0x0, x572, x569);
+  fiat_p256_addcarryx_u32(&x575, &x576, x574, x570, x567);
+  fiat_p256_addcarryx_u32(&x577, &x578, x576, x568, x565);
+  fiat_p256_addcarryx_u32(&x579, &x580, x578, x566, x563);
+  fiat_p256_addcarryx_u32(&x581, &x582, x580, x564, x561);
+  fiat_p256_addcarryx_u32(&x583, &x584, x582, x562, x559);
+  fiat_p256_addcarryx_u32(&x585, &x586, x584, x560, x557);
+  x587 = (x586 + x558);
+  fiat_p256_addcarryx_u32(&x588, &x589, 0x0, x540, x571);
+  fiat_p256_addcarryx_u32(&x590, &x591, x589, x542, x573);
+  fiat_p256_addcarryx_u32(&x592, &x593, x591, x544, x575);
+  fiat_p256_addcarryx_u32(&x594, &x595, x593, x546, x577);
+  fiat_p256_addcarryx_u32(&x596, &x597, x595, x548, x579);
+  fiat_p256_addcarryx_u32(&x598, &x599, x597, x550, x581);
+  fiat_p256_addcarryx_u32(&x600, &x601, x599, x552, x583);
+  fiat_p256_addcarryx_u32(&x602, &x603, x601, x554, x585);
+  fiat_p256_addcarryx_u32(&x604, &x605, x603, x556, x587);
+  fiat_p256_mulx_u32(&x606, &x607, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x608, &x609, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x610, &x611, x588, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x612, &x613, x588, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x614, &x615, 0x0, x613, x610);
+  fiat_p256_addcarryx_u32(&x616, &x617, x615, x611, x608);
+  x618 = (x617 + x609);
+  fiat_p256_addcarryx_u32(&x619, &x620, 0x0, x588, x612);
+  fiat_p256_addcarryx_u32(&x621, &x622, x620, x590, x614);
+  fiat_p256_addcarryx_u32(&x623, &x624, x622, x592, x616);
+  fiat_p256_addcarryx_u32(&x625, &x626, x624, x594, x618);
+  fiat_p256_addcarryx_u32(&x627, &x628, x626, x596, 0x0);
+  fiat_p256_addcarryx_u32(&x629, &x630, x628, x598, 0x0);
+  fiat_p256_addcarryx_u32(&x631, &x632, x630, x600, x588);
+  fiat_p256_addcarryx_u32(&x633, &x634, x632, x602, x606);
+  fiat_p256_addcarryx_u32(&x635, &x636, x634, x604, x607);
+  x637 = ((uint32_t)x636 + x605);
+  fiat_p256_subborrowx_u32(&x638, &x639, 0x0, x621, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x640, &x641, x639, x623, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x642, &x643, x641, x625, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x644, &x645, x643, x627, 0x0);
+  fiat_p256_subborrowx_u32(&x646, &x647, x645, x629, 0x0);
+  fiat_p256_subborrowx_u32(&x648, &x649, x647, x631, 0x0);
+  fiat_p256_subborrowx_u32(&x650, &x651, x649, x633, 0x1);
+  fiat_p256_subborrowx_u32(&x652, &x653, x651, x635, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x654, &x655, x653, x637, 0x0);
+  fiat_p256_cmovznz_u32(&x656, x655, x638, x621);
+  fiat_p256_cmovznz_u32(&x657, x655, x640, x623);
+  fiat_p256_cmovznz_u32(&x658, x655, x642, x625);
+  fiat_p256_cmovznz_u32(&x659, x655, x644, x627);
+  fiat_p256_cmovznz_u32(&x660, x655, x646, x629);
+  fiat_p256_cmovznz_u32(&x661, x655, x648, x631);
+  fiat_p256_cmovznz_u32(&x662, x655, x650, x633);
   fiat_p256_cmovznz_u32(&x663, x655, x652, x635);
   out1[0] = x656;
   out1[1] = x657;
@@ -2128,6 +2221,7 @@
 
 /*
  * The function fiat_p256_add adds two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -2135,79 +2229,74 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- *   arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_add(uint32_t out1[8], const uint32_t arg1[8], const uint32_t arg2[8]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_add(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
   uint32_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_addcarryx_u32(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
   uint32_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_addcarryx_u32(&x3, &x4, x2, (arg1[1]), (arg2[1]));
   uint32_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_addcarryx_u32(&x5, &x6, x4, (arg1[2]), (arg2[2]));
   uint32_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_addcarryx_u32(&x7, &x8, x6, (arg1[3]), (arg2[3]));
   uint32_t x9;
   fiat_p256_uint1 x10;
-  fiat_p256_addcarryx_u32(&x9, &x10, x8, (arg1[4]), (arg2[4]));
   uint32_t x11;
   fiat_p256_uint1 x12;
-  fiat_p256_addcarryx_u32(&x11, &x12, x10, (arg1[5]), (arg2[5]));
   uint32_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_addcarryx_u32(&x13, &x14, x12, (arg1[6]), (arg2[6]));
   uint32_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_addcarryx_u32(&x15, &x16, x14, (arg1[7]), (arg2[7]));
   uint32_t x17;
   fiat_p256_uint1 x18;
-  fiat_p256_subborrowx_u32(&x17, &x18, 0x0, x1, UINT32_C(0xffffffff));
   uint32_t x19;
   fiat_p256_uint1 x20;
-  fiat_p256_subborrowx_u32(&x19, &x20, x18, x3, UINT32_C(0xffffffff));
   uint32_t x21;
   fiat_p256_uint1 x22;
-  fiat_p256_subborrowx_u32(&x21, &x22, x20, x5, UINT32_C(0xffffffff));
   uint32_t x23;
   fiat_p256_uint1 x24;
-  fiat_p256_subborrowx_u32(&x23, &x24, x22, x7, 0x0);
   uint32_t x25;
   fiat_p256_uint1 x26;
-  fiat_p256_subborrowx_u32(&x25, &x26, x24, x9, 0x0);
   uint32_t x27;
   fiat_p256_uint1 x28;
-  fiat_p256_subborrowx_u32(&x27, &x28, x26, x11, 0x0);
   uint32_t x29;
   fiat_p256_uint1 x30;
-  fiat_p256_subborrowx_u32(&x29, &x30, x28, x13, 0x1);
   uint32_t x31;
   fiat_p256_uint1 x32;
-  fiat_p256_subborrowx_u32(&x31, &x32, x30, x15, UINT32_C(0xffffffff));
   uint32_t x33;
   fiat_p256_uint1 x34;
-  fiat_p256_subborrowx_u32(&x33, &x34, x32, x16, 0x0);
   uint32_t x35;
-  fiat_p256_cmovznz_u32(&x35, x34, x17, x1);
   uint32_t x36;
-  fiat_p256_cmovznz_u32(&x36, x34, x19, x3);
   uint32_t x37;
-  fiat_p256_cmovznz_u32(&x37, x34, x21, x5);
   uint32_t x38;
-  fiat_p256_cmovznz_u32(&x38, x34, x23, x7);
   uint32_t x39;
-  fiat_p256_cmovznz_u32(&x39, x34, x25, x9);
   uint32_t x40;
-  fiat_p256_cmovznz_u32(&x40, x34, x27, x11);
   uint32_t x41;
-  fiat_p256_cmovznz_u32(&x41, x34, x29, x13);
   uint32_t x42;
+  fiat_p256_addcarryx_u32(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
+  fiat_p256_addcarryx_u32(&x3, &x4, x2, (arg1[1]), (arg2[1]));
+  fiat_p256_addcarryx_u32(&x5, &x6, x4, (arg1[2]), (arg2[2]));
+  fiat_p256_addcarryx_u32(&x7, &x8, x6, (arg1[3]), (arg2[3]));
+  fiat_p256_addcarryx_u32(&x9, &x10, x8, (arg1[4]), (arg2[4]));
+  fiat_p256_addcarryx_u32(&x11, &x12, x10, (arg1[5]), (arg2[5]));
+  fiat_p256_addcarryx_u32(&x13, &x14, x12, (arg1[6]), (arg2[6]));
+  fiat_p256_addcarryx_u32(&x15, &x16, x14, (arg1[7]), (arg2[7]));
+  fiat_p256_subborrowx_u32(&x17, &x18, 0x0, x1, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x19, &x20, x18, x3, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x21, &x22, x20, x5, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x23, &x24, x22, x7, 0x0);
+  fiat_p256_subborrowx_u32(&x25, &x26, x24, x9, 0x0);
+  fiat_p256_subborrowx_u32(&x27, &x28, x26, x11, 0x0);
+  fiat_p256_subborrowx_u32(&x29, &x30, x28, x13, 0x1);
+  fiat_p256_subborrowx_u32(&x31, &x32, x30, x15, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x33, &x34, x32, x16, 0x0);
+  fiat_p256_cmovznz_u32(&x35, x34, x17, x1);
+  fiat_p256_cmovznz_u32(&x36, x34, x19, x3);
+  fiat_p256_cmovznz_u32(&x37, x34, x21, x5);
+  fiat_p256_cmovznz_u32(&x38, x34, x23, x7);
+  fiat_p256_cmovznz_u32(&x39, x34, x25, x9);
+  fiat_p256_cmovznz_u32(&x40, x34, x27, x11);
+  fiat_p256_cmovznz_u32(&x41, x34, x29, x13);
   fiat_p256_cmovznz_u32(&x42, x34, x31, x15);
   out1[0] = x35;
   out1[1] = x36;
@@ -2221,6 +2310,7 @@
 
 /*
  * The function fiat_p256_sub subtracts two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -2228,63 +2318,58 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- *   arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_sub(uint32_t out1[8], const uint32_t arg1[8], const uint32_t arg2[8]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_sub(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
   uint32_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_subborrowx_u32(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
   uint32_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_subborrowx_u32(&x3, &x4, x2, (arg1[1]), (arg2[1]));
   uint32_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_subborrowx_u32(&x5, &x6, x4, (arg1[2]), (arg2[2]));
   uint32_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_subborrowx_u32(&x7, &x8, x6, (arg1[3]), (arg2[3]));
   uint32_t x9;
   fiat_p256_uint1 x10;
-  fiat_p256_subborrowx_u32(&x9, &x10, x8, (arg1[4]), (arg2[4]));
   uint32_t x11;
   fiat_p256_uint1 x12;
-  fiat_p256_subborrowx_u32(&x11, &x12, x10, (arg1[5]), (arg2[5]));
   uint32_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_subborrowx_u32(&x13, &x14, x12, (arg1[6]), (arg2[6]));
   uint32_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_subborrowx_u32(&x15, &x16, x14, (arg1[7]), (arg2[7]));
   uint32_t x17;
-  fiat_p256_cmovznz_u32(&x17, x16, 0x0, UINT32_C(0xffffffff));
   uint32_t x18;
   fiat_p256_uint1 x19;
-  fiat_p256_addcarryx_u32(&x18, &x19, 0x0, x1, (x17 & UINT32_C(0xffffffff)));
   uint32_t x20;
   fiat_p256_uint1 x21;
-  fiat_p256_addcarryx_u32(&x20, &x21, x19, x3, (x17 & UINT32_C(0xffffffff)));
   uint32_t x22;
   fiat_p256_uint1 x23;
-  fiat_p256_addcarryx_u32(&x22, &x23, x21, x5, (x17 & UINT32_C(0xffffffff)));
   uint32_t x24;
   fiat_p256_uint1 x25;
-  fiat_p256_addcarryx_u32(&x24, &x25, x23, x7, 0x0);
   uint32_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u32(&x26, &x27, x25, x9, 0x0);
   uint32_t x28;
   fiat_p256_uint1 x29;
-  fiat_p256_addcarryx_u32(&x28, &x29, x27, x11, 0x0);
   uint32_t x30;
   fiat_p256_uint1 x31;
-  fiat_p256_addcarryx_u32(&x30, &x31, x29, x13, (fiat_p256_uint1)(x17 & 0x1));
   uint32_t x32;
   fiat_p256_uint1 x33;
-  fiat_p256_addcarryx_u32(&x32, &x33, x31, x15, (x17 & UINT32_C(0xffffffff)));
+  fiat_p256_subborrowx_u32(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
+  fiat_p256_subborrowx_u32(&x3, &x4, x2, (arg1[1]), (arg2[1]));
+  fiat_p256_subborrowx_u32(&x5, &x6, x4, (arg1[2]), (arg2[2]));
+  fiat_p256_subborrowx_u32(&x7, &x8, x6, (arg1[3]), (arg2[3]));
+  fiat_p256_subborrowx_u32(&x9, &x10, x8, (arg1[4]), (arg2[4]));
+  fiat_p256_subborrowx_u32(&x11, &x12, x10, (arg1[5]), (arg2[5]));
+  fiat_p256_subborrowx_u32(&x13, &x14, x12, (arg1[6]), (arg2[6]));
+  fiat_p256_subborrowx_u32(&x15, &x16, x14, (arg1[7]), (arg2[7]));
+  fiat_p256_cmovznz_u32(&x17, x16, 0x0, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x18, &x19, 0x0, x1, x17);
+  fiat_p256_addcarryx_u32(&x20, &x21, x19, x3, x17);
+  fiat_p256_addcarryx_u32(&x22, &x23, x21, x5, x17);
+  fiat_p256_addcarryx_u32(&x24, &x25, x23, x7, 0x0);
+  fiat_p256_addcarryx_u32(&x26, &x27, x25, x9, 0x0);
+  fiat_p256_addcarryx_u32(&x28, &x29, x27, x11, 0x0);
+  fiat_p256_addcarryx_u32(&x30, &x31, x29, x13, (fiat_p256_uint1)(x17 & 0x1));
+  fiat_p256_addcarryx_u32(&x32, &x33, x31, x15, x17);
   out1[0] = x18;
   out1[1] = x20;
   out1[2] = x22;
@@ -2297,68 +2382,65 @@
 
 /*
  * The function fiat_p256_opp negates a field element in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_opp(uint32_t out1[8], const uint32_t arg1[8]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_opp(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
   uint32_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_subborrowx_u32(&x1, &x2, 0x0, 0x0, (arg1[0]));
   uint32_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_subborrowx_u32(&x3, &x4, x2, 0x0, (arg1[1]));
   uint32_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_subborrowx_u32(&x5, &x6, x4, 0x0, (arg1[2]));
   uint32_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_subborrowx_u32(&x7, &x8, x6, 0x0, (arg1[3]));
   uint32_t x9;
   fiat_p256_uint1 x10;
-  fiat_p256_subborrowx_u32(&x9, &x10, x8, 0x0, (arg1[4]));
   uint32_t x11;
   fiat_p256_uint1 x12;
-  fiat_p256_subborrowx_u32(&x11, &x12, x10, 0x0, (arg1[5]));
   uint32_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_subborrowx_u32(&x13, &x14, x12, 0x0, (arg1[6]));
   uint32_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_subborrowx_u32(&x15, &x16, x14, 0x0, (arg1[7]));
   uint32_t x17;
-  fiat_p256_cmovznz_u32(&x17, x16, 0x0, UINT32_C(0xffffffff));
   uint32_t x18;
   fiat_p256_uint1 x19;
-  fiat_p256_addcarryx_u32(&x18, &x19, 0x0, x1, (x17 & UINT32_C(0xffffffff)));
   uint32_t x20;
   fiat_p256_uint1 x21;
-  fiat_p256_addcarryx_u32(&x20, &x21, x19, x3, (x17 & UINT32_C(0xffffffff)));
   uint32_t x22;
   fiat_p256_uint1 x23;
-  fiat_p256_addcarryx_u32(&x22, &x23, x21, x5, (x17 & UINT32_C(0xffffffff)));
   uint32_t x24;
   fiat_p256_uint1 x25;
-  fiat_p256_addcarryx_u32(&x24, &x25, x23, x7, 0x0);
   uint32_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u32(&x26, &x27, x25, x9, 0x0);
   uint32_t x28;
   fiat_p256_uint1 x29;
-  fiat_p256_addcarryx_u32(&x28, &x29, x27, x11, 0x0);
   uint32_t x30;
   fiat_p256_uint1 x31;
-  fiat_p256_addcarryx_u32(&x30, &x31, x29, x13, (fiat_p256_uint1)(x17 & 0x1));
   uint32_t x32;
   fiat_p256_uint1 x33;
-  fiat_p256_addcarryx_u32(&x32, &x33, x31, x15, (x17 & UINT32_C(0xffffffff)));
+  fiat_p256_subborrowx_u32(&x1, &x2, 0x0, 0x0, (arg1[0]));
+  fiat_p256_subborrowx_u32(&x3, &x4, x2, 0x0, (arg1[1]));
+  fiat_p256_subborrowx_u32(&x5, &x6, x4, 0x0, (arg1[2]));
+  fiat_p256_subborrowx_u32(&x7, &x8, x6, 0x0, (arg1[3]));
+  fiat_p256_subborrowx_u32(&x9, &x10, x8, 0x0, (arg1[4]));
+  fiat_p256_subborrowx_u32(&x11, &x12, x10, 0x0, (arg1[5]));
+  fiat_p256_subborrowx_u32(&x13, &x14, x12, 0x0, (arg1[6]));
+  fiat_p256_subborrowx_u32(&x15, &x16, x14, 0x0, (arg1[7]));
+  fiat_p256_cmovznz_u32(&x17, x16, 0x0, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x18, &x19, 0x0, x1, x17);
+  fiat_p256_addcarryx_u32(&x20, &x21, x19, x3, x17);
+  fiat_p256_addcarryx_u32(&x22, &x23, x21, x5, x17);
+  fiat_p256_addcarryx_u32(&x24, &x25, x23, x7, 0x0);
+  fiat_p256_addcarryx_u32(&x26, &x27, x25, x9, 0x0);
+  fiat_p256_addcarryx_u32(&x28, &x29, x27, x11, 0x0);
+  fiat_p256_addcarryx_u32(&x30, &x31, x29, x13, (fiat_p256_uint1)(x17 & 0x1));
+  fiat_p256_addcarryx_u32(&x32, &x33, x31, x15, x17);
   out1[0] = x18;
   out1[1] = x20;
   out1[2] = x22;
@@ -2371,532 +2453,530 @@
 
 /*
  * The function fiat_p256_from_montgomery translates a field element out of the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * ((2^32)⁻¹ mod m)^8) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_from_montgomery(uint32_t out1[8], const uint32_t arg1[8]) {
-  uint32_t x1 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_from_montgomery(fiat_p256_non_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
+  uint32_t x1;
   uint32_t x2;
   uint32_t x3;
-  fiat_p256_mulx_u32(&x2, &x3, x1, UINT32_C(0xffffffff));
   uint32_t x4;
   uint32_t x5;
-  fiat_p256_mulx_u32(&x4, &x5, x1, UINT32_C(0xffffffff));
   uint32_t x6;
   uint32_t x7;
-  fiat_p256_mulx_u32(&x6, &x7, x1, UINT32_C(0xffffffff));
   uint32_t x8;
   uint32_t x9;
-  fiat_p256_mulx_u32(&x8, &x9, x1, UINT32_C(0xffffffff));
   uint32_t x10;
   fiat_p256_uint1 x11;
-  fiat_p256_addcarryx_u32(&x10, &x11, 0x0, x9, x6);
   uint32_t x12;
   fiat_p256_uint1 x13;
-  fiat_p256_addcarryx_u32(&x12, &x13, x11, x7, x4);
   uint32_t x14;
   fiat_p256_uint1 x15;
-  fiat_p256_addcarryx_u32(&x14, &x15, 0x0, x1, x8);
   uint32_t x16;
   fiat_p256_uint1 x17;
-  fiat_p256_addcarryx_u32(&x16, &x17, x15, 0x0, x10);
   uint32_t x18;
   fiat_p256_uint1 x19;
-  fiat_p256_addcarryx_u32(&x18, &x19, x17, 0x0, x12);
   uint32_t x20;
   fiat_p256_uint1 x21;
-  fiat_p256_addcarryx_u32(&x20, &x21, x19, 0x0, (x13 + x5));
   uint32_t x22;
   fiat_p256_uint1 x23;
-  fiat_p256_addcarryx_u32(&x22, &x23, 0x0, x16, (arg1[1]));
   uint32_t x24;
   fiat_p256_uint1 x25;
-  fiat_p256_addcarryx_u32(&x24, &x25, x23, x18, 0x0);
   uint32_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u32(&x26, &x27, x25, x20, 0x0);
   uint32_t x28;
   uint32_t x29;
-  fiat_p256_mulx_u32(&x28, &x29, x22, UINT32_C(0xffffffff));
   uint32_t x30;
   uint32_t x31;
-  fiat_p256_mulx_u32(&x30, &x31, x22, UINT32_C(0xffffffff));
   uint32_t x32;
   uint32_t x33;
-  fiat_p256_mulx_u32(&x32, &x33, x22, UINT32_C(0xffffffff));
   uint32_t x34;
   uint32_t x35;
-  fiat_p256_mulx_u32(&x34, &x35, x22, UINT32_C(0xffffffff));
   uint32_t x36;
   fiat_p256_uint1 x37;
-  fiat_p256_addcarryx_u32(&x36, &x37, 0x0, x35, x32);
   uint32_t x38;
   fiat_p256_uint1 x39;
-  fiat_p256_addcarryx_u32(&x38, &x39, x37, x33, x30);
   uint32_t x40;
   fiat_p256_uint1 x41;
-  fiat_p256_addcarryx_u32(&x40, &x41, 0x0, x22, x34);
   uint32_t x42;
   fiat_p256_uint1 x43;
-  fiat_p256_addcarryx_u32(&x42, &x43, x41, x24, x36);
   uint32_t x44;
   fiat_p256_uint1 x45;
-  fiat_p256_addcarryx_u32(&x44, &x45, x43, x26, x38);
   uint32_t x46;
   fiat_p256_uint1 x47;
-  fiat_p256_addcarryx_u32(&x46, &x47, x45, ((uint32_t)x27 + x21), (x39 + x31));
   uint32_t x48;
   fiat_p256_uint1 x49;
-  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x2, x22);
   uint32_t x50;
   fiat_p256_uint1 x51;
-  fiat_p256_addcarryx_u32(&x50, &x51, x49, x3, x28);
   uint32_t x52;
   fiat_p256_uint1 x53;
-  fiat_p256_addcarryx_u32(&x52, &x53, 0x0, x42, (arg1[2]));
   uint32_t x54;
   fiat_p256_uint1 x55;
-  fiat_p256_addcarryx_u32(&x54, &x55, x53, x44, 0x0);
   uint32_t x56;
   fiat_p256_uint1 x57;
-  fiat_p256_addcarryx_u32(&x56, &x57, x55, x46, 0x0);
   uint32_t x58;
   uint32_t x59;
-  fiat_p256_mulx_u32(&x58, &x59, x52, UINT32_C(0xffffffff));
   uint32_t x60;
   uint32_t x61;
-  fiat_p256_mulx_u32(&x60, &x61, x52, UINT32_C(0xffffffff));
   uint32_t x62;
   uint32_t x63;
-  fiat_p256_mulx_u32(&x62, &x63, x52, UINT32_C(0xffffffff));
   uint32_t x64;
   uint32_t x65;
-  fiat_p256_mulx_u32(&x64, &x65, x52, UINT32_C(0xffffffff));
   uint32_t x66;
   fiat_p256_uint1 x67;
-  fiat_p256_addcarryx_u32(&x66, &x67, 0x0, x65, x62);
   uint32_t x68;
   fiat_p256_uint1 x69;
-  fiat_p256_addcarryx_u32(&x68, &x69, x67, x63, x60);
   uint32_t x70;
   fiat_p256_uint1 x71;
-  fiat_p256_addcarryx_u32(&x70, &x71, 0x0, x52, x64);
   uint32_t x72;
   fiat_p256_uint1 x73;
-  fiat_p256_addcarryx_u32(&x72, &x73, x71, x54, x66);
   uint32_t x74;
   fiat_p256_uint1 x75;
-  fiat_p256_addcarryx_u32(&x74, &x75, x73, x56, x68);
   uint32_t x76;
   fiat_p256_uint1 x77;
-  fiat_p256_addcarryx_u32(&x76, &x77, x75, ((uint32_t)x57 + x47), (x69 + x61));
   uint32_t x78;
   fiat_p256_uint1 x79;
-  fiat_p256_addcarryx_u32(&x78, &x79, x77, x1, 0x0);
   uint32_t x80;
   fiat_p256_uint1 x81;
-  fiat_p256_addcarryx_u32(&x80, &x81, x79, x48, 0x0);
   uint32_t x82;
   fiat_p256_uint1 x83;
-  fiat_p256_addcarryx_u32(&x82, &x83, x81, x50, x52);
   uint32_t x84;
   fiat_p256_uint1 x85;
-  fiat_p256_addcarryx_u32(&x84, &x85, x83, (x51 + x29), x58);
   uint32_t x86;
   fiat_p256_uint1 x87;
-  fiat_p256_addcarryx_u32(&x86, &x87, 0x0, x72, (arg1[3]));
   uint32_t x88;
   fiat_p256_uint1 x89;
-  fiat_p256_addcarryx_u32(&x88, &x89, x87, x74, 0x0);
   uint32_t x90;
   fiat_p256_uint1 x91;
-  fiat_p256_addcarryx_u32(&x90, &x91, x89, x76, 0x0);
   uint32_t x92;
   fiat_p256_uint1 x93;
-  fiat_p256_addcarryx_u32(&x92, &x93, x91, x78, 0x0);
   uint32_t x94;
   fiat_p256_uint1 x95;
-  fiat_p256_addcarryx_u32(&x94, &x95, x93, x80, 0x0);
   uint32_t x96;
   fiat_p256_uint1 x97;
-  fiat_p256_addcarryx_u32(&x96, &x97, x95, x82, 0x0);
   uint32_t x98;
   fiat_p256_uint1 x99;
-  fiat_p256_addcarryx_u32(&x98, &x99, x97, x84, 0x0);
   uint32_t x100;
   fiat_p256_uint1 x101;
-  fiat_p256_addcarryx_u32(&x100, &x101, x99, (x85 + x59), 0x0);
   uint32_t x102;
   uint32_t x103;
-  fiat_p256_mulx_u32(&x102, &x103, x86, UINT32_C(0xffffffff));
   uint32_t x104;
   uint32_t x105;
-  fiat_p256_mulx_u32(&x104, &x105, x86, UINT32_C(0xffffffff));
   uint32_t x106;
   uint32_t x107;
-  fiat_p256_mulx_u32(&x106, &x107, x86, UINT32_C(0xffffffff));
   uint32_t x108;
   uint32_t x109;
-  fiat_p256_mulx_u32(&x108, &x109, x86, UINT32_C(0xffffffff));
   uint32_t x110;
   fiat_p256_uint1 x111;
-  fiat_p256_addcarryx_u32(&x110, &x111, 0x0, x109, x106);
   uint32_t x112;
   fiat_p256_uint1 x113;
-  fiat_p256_addcarryx_u32(&x112, &x113, x111, x107, x104);
   uint32_t x114;
   fiat_p256_uint1 x115;
-  fiat_p256_addcarryx_u32(&x114, &x115, 0x0, x86, x108);
   uint32_t x116;
   fiat_p256_uint1 x117;
-  fiat_p256_addcarryx_u32(&x116, &x117, x115, x88, x110);
   uint32_t x118;
   fiat_p256_uint1 x119;
-  fiat_p256_addcarryx_u32(&x118, &x119, x117, x90, x112);
   uint32_t x120;
   fiat_p256_uint1 x121;
-  fiat_p256_addcarryx_u32(&x120, &x121, x119, x92, (x113 + x105));
   uint32_t x122;
   fiat_p256_uint1 x123;
-  fiat_p256_addcarryx_u32(&x122, &x123, x121, x94, 0x0);
   uint32_t x124;
   fiat_p256_uint1 x125;
-  fiat_p256_addcarryx_u32(&x124, &x125, x123, x96, 0x0);
   uint32_t x126;
   fiat_p256_uint1 x127;
-  fiat_p256_addcarryx_u32(&x126, &x127, x125, x98, x86);
   uint32_t x128;
   fiat_p256_uint1 x129;
-  fiat_p256_addcarryx_u32(&x128, &x129, x127, x100, x102);
   uint32_t x130;
   fiat_p256_uint1 x131;
-  fiat_p256_addcarryx_u32(&x130, &x131, x129, x101, x103);
   uint32_t x132;
   fiat_p256_uint1 x133;
-  fiat_p256_addcarryx_u32(&x132, &x133, 0x0, x116, (arg1[4]));
   uint32_t x134;
   fiat_p256_uint1 x135;
-  fiat_p256_addcarryx_u32(&x134, &x135, x133, x118, 0x0);
   uint32_t x136;
   fiat_p256_uint1 x137;
-  fiat_p256_addcarryx_u32(&x136, &x137, x135, x120, 0x0);
   uint32_t x138;
   fiat_p256_uint1 x139;
-  fiat_p256_addcarryx_u32(&x138, &x139, x137, x122, 0x0);
   uint32_t x140;
   fiat_p256_uint1 x141;
-  fiat_p256_addcarryx_u32(&x140, &x141, x139, x124, 0x0);
   uint32_t x142;
   fiat_p256_uint1 x143;
-  fiat_p256_addcarryx_u32(&x142, &x143, x141, x126, 0x0);
   uint32_t x144;
   fiat_p256_uint1 x145;
-  fiat_p256_addcarryx_u32(&x144, &x145, x143, x128, 0x0);
   uint32_t x146;
   fiat_p256_uint1 x147;
-  fiat_p256_addcarryx_u32(&x146, &x147, x145, x130, 0x0);
   uint32_t x148;
   uint32_t x149;
-  fiat_p256_mulx_u32(&x148, &x149, x132, UINT32_C(0xffffffff));
   uint32_t x150;
   uint32_t x151;
-  fiat_p256_mulx_u32(&x150, &x151, x132, UINT32_C(0xffffffff));
   uint32_t x152;
   uint32_t x153;
-  fiat_p256_mulx_u32(&x152, &x153, x132, UINT32_C(0xffffffff));
   uint32_t x154;
   uint32_t x155;
-  fiat_p256_mulx_u32(&x154, &x155, x132, UINT32_C(0xffffffff));
   uint32_t x156;
   fiat_p256_uint1 x157;
-  fiat_p256_addcarryx_u32(&x156, &x157, 0x0, x155, x152);
   uint32_t x158;
   fiat_p256_uint1 x159;
-  fiat_p256_addcarryx_u32(&x158, &x159, x157, x153, x150);
   uint32_t x160;
   fiat_p256_uint1 x161;
-  fiat_p256_addcarryx_u32(&x160, &x161, 0x0, x132, x154);
   uint32_t x162;
   fiat_p256_uint1 x163;
-  fiat_p256_addcarryx_u32(&x162, &x163, x161, x134, x156);
   uint32_t x164;
   fiat_p256_uint1 x165;
-  fiat_p256_addcarryx_u32(&x164, &x165, x163, x136, x158);
   uint32_t x166;
   fiat_p256_uint1 x167;
-  fiat_p256_addcarryx_u32(&x166, &x167, x165, x138, (x159 + x151));
   uint32_t x168;
   fiat_p256_uint1 x169;
-  fiat_p256_addcarryx_u32(&x168, &x169, x167, x140, 0x0);
   uint32_t x170;
   fiat_p256_uint1 x171;
-  fiat_p256_addcarryx_u32(&x170, &x171, x169, x142, 0x0);
   uint32_t x172;
   fiat_p256_uint1 x173;
-  fiat_p256_addcarryx_u32(&x172, &x173, x171, x144, x132);
   uint32_t x174;
   fiat_p256_uint1 x175;
-  fiat_p256_addcarryx_u32(&x174, &x175, x173, x146, x148);
   uint32_t x176;
   fiat_p256_uint1 x177;
-  fiat_p256_addcarryx_u32(&x176, &x177, x175, ((uint32_t)x147 + x131), x149);
   uint32_t x178;
   fiat_p256_uint1 x179;
-  fiat_p256_addcarryx_u32(&x178, &x179, 0x0, x162, (arg1[5]));
   uint32_t x180;
   fiat_p256_uint1 x181;
-  fiat_p256_addcarryx_u32(&x180, &x181, x179, x164, 0x0);
   uint32_t x182;
   fiat_p256_uint1 x183;
-  fiat_p256_addcarryx_u32(&x182, &x183, x181, x166, 0x0);
   uint32_t x184;
   fiat_p256_uint1 x185;
-  fiat_p256_addcarryx_u32(&x184, &x185, x183, x168, 0x0);
   uint32_t x186;
   fiat_p256_uint1 x187;
-  fiat_p256_addcarryx_u32(&x186, &x187, x185, x170, 0x0);
   uint32_t x188;
   fiat_p256_uint1 x189;
-  fiat_p256_addcarryx_u32(&x188, &x189, x187, x172, 0x0);
   uint32_t x190;
   fiat_p256_uint1 x191;
-  fiat_p256_addcarryx_u32(&x190, &x191, x189, x174, 0x0);
   uint32_t x192;
   fiat_p256_uint1 x193;
-  fiat_p256_addcarryx_u32(&x192, &x193, x191, x176, 0x0);
   uint32_t x194;
   uint32_t x195;
-  fiat_p256_mulx_u32(&x194, &x195, x178, UINT32_C(0xffffffff));
   uint32_t x196;
   uint32_t x197;
-  fiat_p256_mulx_u32(&x196, &x197, x178, UINT32_C(0xffffffff));
   uint32_t x198;
   uint32_t x199;
-  fiat_p256_mulx_u32(&x198, &x199, x178, UINT32_C(0xffffffff));
   uint32_t x200;
   uint32_t x201;
-  fiat_p256_mulx_u32(&x200, &x201, x178, UINT32_C(0xffffffff));
   uint32_t x202;
   fiat_p256_uint1 x203;
-  fiat_p256_addcarryx_u32(&x202, &x203, 0x0, x201, x198);
   uint32_t x204;
   fiat_p256_uint1 x205;
-  fiat_p256_addcarryx_u32(&x204, &x205, x203, x199, x196);
   uint32_t x206;
   fiat_p256_uint1 x207;
-  fiat_p256_addcarryx_u32(&x206, &x207, 0x0, x178, x200);
   uint32_t x208;
   fiat_p256_uint1 x209;
-  fiat_p256_addcarryx_u32(&x208, &x209, x207, x180, x202);
   uint32_t x210;
   fiat_p256_uint1 x211;
-  fiat_p256_addcarryx_u32(&x210, &x211, x209, x182, x204);
   uint32_t x212;
   fiat_p256_uint1 x213;
-  fiat_p256_addcarryx_u32(&x212, &x213, x211, x184, (x205 + x197));
   uint32_t x214;
   fiat_p256_uint1 x215;
-  fiat_p256_addcarryx_u32(&x214, &x215, x213, x186, 0x0);
   uint32_t x216;
   fiat_p256_uint1 x217;
-  fiat_p256_addcarryx_u32(&x216, &x217, x215, x188, 0x0);
   uint32_t x218;
   fiat_p256_uint1 x219;
-  fiat_p256_addcarryx_u32(&x218, &x219, x217, x190, x178);
   uint32_t x220;
   fiat_p256_uint1 x221;
-  fiat_p256_addcarryx_u32(&x220, &x221, x219, x192, x194);
   uint32_t x222;
   fiat_p256_uint1 x223;
-  fiat_p256_addcarryx_u32(&x222, &x223, x221, ((uint32_t)x193 + x177), x195);
   uint32_t x224;
   fiat_p256_uint1 x225;
-  fiat_p256_addcarryx_u32(&x224, &x225, 0x0, x208, (arg1[6]));
   uint32_t x226;
   fiat_p256_uint1 x227;
-  fiat_p256_addcarryx_u32(&x226, &x227, x225, x210, 0x0);
   uint32_t x228;
   fiat_p256_uint1 x229;
-  fiat_p256_addcarryx_u32(&x228, &x229, x227, x212, 0x0);
   uint32_t x230;
   fiat_p256_uint1 x231;
-  fiat_p256_addcarryx_u32(&x230, &x231, x229, x214, 0x0);
   uint32_t x232;
   fiat_p256_uint1 x233;
-  fiat_p256_addcarryx_u32(&x232, &x233, x231, x216, 0x0);
   uint32_t x234;
   fiat_p256_uint1 x235;
-  fiat_p256_addcarryx_u32(&x234, &x235, x233, x218, 0x0);
   uint32_t x236;
   fiat_p256_uint1 x237;
-  fiat_p256_addcarryx_u32(&x236, &x237, x235, x220, 0x0);
   uint32_t x238;
   fiat_p256_uint1 x239;
-  fiat_p256_addcarryx_u32(&x238, &x239, x237, x222, 0x0);
   uint32_t x240;
   uint32_t x241;
-  fiat_p256_mulx_u32(&x240, &x241, x224, UINT32_C(0xffffffff));
   uint32_t x242;
   uint32_t x243;
-  fiat_p256_mulx_u32(&x242, &x243, x224, UINT32_C(0xffffffff));
   uint32_t x244;
   uint32_t x245;
-  fiat_p256_mulx_u32(&x244, &x245, x224, UINT32_C(0xffffffff));
   uint32_t x246;
   uint32_t x247;
-  fiat_p256_mulx_u32(&x246, &x247, x224, UINT32_C(0xffffffff));
   uint32_t x248;
   fiat_p256_uint1 x249;
-  fiat_p256_addcarryx_u32(&x248, &x249, 0x0, x247, x244);
   uint32_t x250;
   fiat_p256_uint1 x251;
-  fiat_p256_addcarryx_u32(&x250, &x251, x249, x245, x242);
   uint32_t x252;
   fiat_p256_uint1 x253;
-  fiat_p256_addcarryx_u32(&x252, &x253, 0x0, x224, x246);
   uint32_t x254;
   fiat_p256_uint1 x255;
-  fiat_p256_addcarryx_u32(&x254, &x255, x253, x226, x248);
   uint32_t x256;
   fiat_p256_uint1 x257;
-  fiat_p256_addcarryx_u32(&x256, &x257, x255, x228, x250);
   uint32_t x258;
   fiat_p256_uint1 x259;
-  fiat_p256_addcarryx_u32(&x258, &x259, x257, x230, (x251 + x243));
   uint32_t x260;
   fiat_p256_uint1 x261;
-  fiat_p256_addcarryx_u32(&x260, &x261, x259, x232, 0x0);
   uint32_t x262;
   fiat_p256_uint1 x263;
-  fiat_p256_addcarryx_u32(&x262, &x263, x261, x234, 0x0);
   uint32_t x264;
   fiat_p256_uint1 x265;
-  fiat_p256_addcarryx_u32(&x264, &x265, x263, x236, x224);
   uint32_t x266;
   fiat_p256_uint1 x267;
-  fiat_p256_addcarryx_u32(&x266, &x267, x265, x238, x240);
   uint32_t x268;
   fiat_p256_uint1 x269;
-  fiat_p256_addcarryx_u32(&x268, &x269, x267, ((uint32_t)x239 + x223), x241);
   uint32_t x270;
   fiat_p256_uint1 x271;
-  fiat_p256_addcarryx_u32(&x270, &x271, 0x0, x254, (arg1[7]));
   uint32_t x272;
   fiat_p256_uint1 x273;
-  fiat_p256_addcarryx_u32(&x272, &x273, x271, x256, 0x0);
   uint32_t x274;
   fiat_p256_uint1 x275;
-  fiat_p256_addcarryx_u32(&x274, &x275, x273, x258, 0x0);
   uint32_t x276;
   fiat_p256_uint1 x277;
-  fiat_p256_addcarryx_u32(&x276, &x277, x275, x260, 0x0);
   uint32_t x278;
   fiat_p256_uint1 x279;
-  fiat_p256_addcarryx_u32(&x278, &x279, x277, x262, 0x0);
   uint32_t x280;
   fiat_p256_uint1 x281;
-  fiat_p256_addcarryx_u32(&x280, &x281, x279, x264, 0x0);
   uint32_t x282;
   fiat_p256_uint1 x283;
-  fiat_p256_addcarryx_u32(&x282, &x283, x281, x266, 0x0);
   uint32_t x284;
   fiat_p256_uint1 x285;
-  fiat_p256_addcarryx_u32(&x284, &x285, x283, x268, 0x0);
   uint32_t x286;
   uint32_t x287;
-  fiat_p256_mulx_u32(&x286, &x287, x270, UINT32_C(0xffffffff));
   uint32_t x288;
   uint32_t x289;
-  fiat_p256_mulx_u32(&x288, &x289, x270, UINT32_C(0xffffffff));
   uint32_t x290;
   uint32_t x291;
-  fiat_p256_mulx_u32(&x290, &x291, x270, UINT32_C(0xffffffff));
   uint32_t x292;
   uint32_t x293;
-  fiat_p256_mulx_u32(&x292, &x293, x270, UINT32_C(0xffffffff));
   uint32_t x294;
   fiat_p256_uint1 x295;
-  fiat_p256_addcarryx_u32(&x294, &x295, 0x0, x293, x290);
   uint32_t x296;
   fiat_p256_uint1 x297;
-  fiat_p256_addcarryx_u32(&x296, &x297, x295, x291, x288);
   uint32_t x298;
   fiat_p256_uint1 x299;
-  fiat_p256_addcarryx_u32(&x298, &x299, 0x0, x270, x292);
   uint32_t x300;
   fiat_p256_uint1 x301;
-  fiat_p256_addcarryx_u32(&x300, &x301, x299, x272, x294);
   uint32_t x302;
   fiat_p256_uint1 x303;
-  fiat_p256_addcarryx_u32(&x302, &x303, x301, x274, x296);
   uint32_t x304;
   fiat_p256_uint1 x305;
-  fiat_p256_addcarryx_u32(&x304, &x305, x303, x276, (x297 + x289));
   uint32_t x306;
   fiat_p256_uint1 x307;
-  fiat_p256_addcarryx_u32(&x306, &x307, x305, x278, 0x0);
   uint32_t x308;
   fiat_p256_uint1 x309;
-  fiat_p256_addcarryx_u32(&x308, &x309, x307, x280, 0x0);
   uint32_t x310;
   fiat_p256_uint1 x311;
-  fiat_p256_addcarryx_u32(&x310, &x311, x309, x282, x270);
   uint32_t x312;
   fiat_p256_uint1 x313;
-  fiat_p256_addcarryx_u32(&x312, &x313, x311, x284, x286);
   uint32_t x314;
   fiat_p256_uint1 x315;
-  fiat_p256_addcarryx_u32(&x314, &x315, x313, ((uint32_t)x285 + x269), x287);
   uint32_t x316;
   fiat_p256_uint1 x317;
-  fiat_p256_subborrowx_u32(&x316, &x317, 0x0, x300, UINT32_C(0xffffffff));
   uint32_t x318;
   fiat_p256_uint1 x319;
-  fiat_p256_subborrowx_u32(&x318, &x319, x317, x302, UINT32_C(0xffffffff));
   uint32_t x320;
   fiat_p256_uint1 x321;
-  fiat_p256_subborrowx_u32(&x320, &x321, x319, x304, UINT32_C(0xffffffff));
   uint32_t x322;
   fiat_p256_uint1 x323;
-  fiat_p256_subborrowx_u32(&x322, &x323, x321, x306, 0x0);
   uint32_t x324;
   fiat_p256_uint1 x325;
-  fiat_p256_subborrowx_u32(&x324, &x325, x323, x308, 0x0);
   uint32_t x326;
   fiat_p256_uint1 x327;
-  fiat_p256_subborrowx_u32(&x326, &x327, x325, x310, 0x0);
   uint32_t x328;
   fiat_p256_uint1 x329;
-  fiat_p256_subborrowx_u32(&x328, &x329, x327, x312, 0x1);
   uint32_t x330;
   fiat_p256_uint1 x331;
-  fiat_p256_subborrowx_u32(&x330, &x331, x329, x314, UINT32_C(0xffffffff));
   uint32_t x332;
   fiat_p256_uint1 x333;
-  fiat_p256_subborrowx_u32(&x332, &x333, x331, x315, 0x0);
   uint32_t x334;
-  fiat_p256_cmovznz_u32(&x334, x333, x316, x300);
   uint32_t x335;
-  fiat_p256_cmovznz_u32(&x335, x333, x318, x302);
   uint32_t x336;
-  fiat_p256_cmovznz_u32(&x336, x333, x320, x304);
   uint32_t x337;
-  fiat_p256_cmovznz_u32(&x337, x333, x322, x306);
   uint32_t x338;
-  fiat_p256_cmovznz_u32(&x338, x333, x324, x308);
   uint32_t x339;
-  fiat_p256_cmovznz_u32(&x339, x333, x326, x310);
   uint32_t x340;
-  fiat_p256_cmovznz_u32(&x340, x333, x328, x312);
   uint32_t x341;
+  x1 = (arg1[0]);
+  fiat_p256_mulx_u32(&x2, &x3, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x4, &x5, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x6, &x7, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x8, &x9, x1, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x10, &x11, 0x0, x9, x6);
+  fiat_p256_addcarryx_u32(&x12, &x13, x11, x7, x4);
+  fiat_p256_addcarryx_u32(&x14, &x15, 0x0, x1, x8);
+  fiat_p256_addcarryx_u32(&x16, &x17, x15, 0x0, x10);
+  fiat_p256_addcarryx_u32(&x18, &x19, x17, 0x0, x12);
+  fiat_p256_addcarryx_u32(&x20, &x21, x19, 0x0, (x13 + x5));
+  fiat_p256_addcarryx_u32(&x22, &x23, 0x0, x16, (arg1[1]));
+  fiat_p256_addcarryx_u32(&x24, &x25, x23, x18, 0x0);
+  fiat_p256_addcarryx_u32(&x26, &x27, x25, x20, 0x0);
+  fiat_p256_mulx_u32(&x28, &x29, x22, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x30, &x31, x22, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x32, &x33, x22, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x34, &x35, x22, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x36, &x37, 0x0, x35, x32);
+  fiat_p256_addcarryx_u32(&x38, &x39, x37, x33, x30);
+  fiat_p256_addcarryx_u32(&x40, &x41, 0x0, x22, x34);
+  fiat_p256_addcarryx_u32(&x42, &x43, x41, x24, x36);
+  fiat_p256_addcarryx_u32(&x44, &x45, x43, x26, x38);
+  fiat_p256_addcarryx_u32(&x46, &x47, x45, ((uint32_t)x27 + x21), (x39 + x31));
+  fiat_p256_addcarryx_u32(&x48, &x49, 0x0, x2, x22);
+  fiat_p256_addcarryx_u32(&x50, &x51, x49, x3, x28);
+  fiat_p256_addcarryx_u32(&x52, &x53, 0x0, x42, (arg1[2]));
+  fiat_p256_addcarryx_u32(&x54, &x55, x53, x44, 0x0);
+  fiat_p256_addcarryx_u32(&x56, &x57, x55, x46, 0x0);
+  fiat_p256_mulx_u32(&x58, &x59, x52, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x60, &x61, x52, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x62, &x63, x52, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x64, &x65, x52, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x66, &x67, 0x0, x65, x62);
+  fiat_p256_addcarryx_u32(&x68, &x69, x67, x63, x60);
+  fiat_p256_addcarryx_u32(&x70, &x71, 0x0, x52, x64);
+  fiat_p256_addcarryx_u32(&x72, &x73, x71, x54, x66);
+  fiat_p256_addcarryx_u32(&x74, &x75, x73, x56, x68);
+  fiat_p256_addcarryx_u32(&x76, &x77, x75, ((uint32_t)x57 + x47), (x69 + x61));
+  fiat_p256_addcarryx_u32(&x78, &x79, x77, x1, 0x0);
+  fiat_p256_addcarryx_u32(&x80, &x81, x79, x48, 0x0);
+  fiat_p256_addcarryx_u32(&x82, &x83, x81, x50, x52);
+  fiat_p256_addcarryx_u32(&x84, &x85, x83, (x51 + x29), x58);
+  fiat_p256_addcarryx_u32(&x86, &x87, 0x0, x72, (arg1[3]));
+  fiat_p256_addcarryx_u32(&x88, &x89, x87, x74, 0x0);
+  fiat_p256_addcarryx_u32(&x90, &x91, x89, x76, 0x0);
+  fiat_p256_addcarryx_u32(&x92, &x93, x91, x78, 0x0);
+  fiat_p256_addcarryx_u32(&x94, &x95, x93, x80, 0x0);
+  fiat_p256_addcarryx_u32(&x96, &x97, x95, x82, 0x0);
+  fiat_p256_addcarryx_u32(&x98, &x99, x97, x84, 0x0);
+  fiat_p256_addcarryx_u32(&x100, &x101, x99, (x85 + x59), 0x0);
+  fiat_p256_mulx_u32(&x102, &x103, x86, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x104, &x105, x86, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x106, &x107, x86, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x108, &x109, x86, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x110, &x111, 0x0, x109, x106);
+  fiat_p256_addcarryx_u32(&x112, &x113, x111, x107, x104);
+  fiat_p256_addcarryx_u32(&x114, &x115, 0x0, x86, x108);
+  fiat_p256_addcarryx_u32(&x116, &x117, x115, x88, x110);
+  fiat_p256_addcarryx_u32(&x118, &x119, x117, x90, x112);
+  fiat_p256_addcarryx_u32(&x120, &x121, x119, x92, (x113 + x105));
+  fiat_p256_addcarryx_u32(&x122, &x123, x121, x94, 0x0);
+  fiat_p256_addcarryx_u32(&x124, &x125, x123, x96, 0x0);
+  fiat_p256_addcarryx_u32(&x126, &x127, x125, x98, x86);
+  fiat_p256_addcarryx_u32(&x128, &x129, x127, x100, x102);
+  fiat_p256_addcarryx_u32(&x130, &x131, x129, x101, x103);
+  fiat_p256_addcarryx_u32(&x132, &x133, 0x0, x116, (arg1[4]));
+  fiat_p256_addcarryx_u32(&x134, &x135, x133, x118, 0x0);
+  fiat_p256_addcarryx_u32(&x136, &x137, x135, x120, 0x0);
+  fiat_p256_addcarryx_u32(&x138, &x139, x137, x122, 0x0);
+  fiat_p256_addcarryx_u32(&x140, &x141, x139, x124, 0x0);
+  fiat_p256_addcarryx_u32(&x142, &x143, x141, x126, 0x0);
+  fiat_p256_addcarryx_u32(&x144, &x145, x143, x128, 0x0);
+  fiat_p256_addcarryx_u32(&x146, &x147, x145, x130, 0x0);
+  fiat_p256_mulx_u32(&x148, &x149, x132, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x150, &x151, x132, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x152, &x153, x132, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x154, &x155, x132, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x156, &x157, 0x0, x155, x152);
+  fiat_p256_addcarryx_u32(&x158, &x159, x157, x153, x150);
+  fiat_p256_addcarryx_u32(&x160, &x161, 0x0, x132, x154);
+  fiat_p256_addcarryx_u32(&x162, &x163, x161, x134, x156);
+  fiat_p256_addcarryx_u32(&x164, &x165, x163, x136, x158);
+  fiat_p256_addcarryx_u32(&x166, &x167, x165, x138, (x159 + x151));
+  fiat_p256_addcarryx_u32(&x168, &x169, x167, x140, 0x0);
+  fiat_p256_addcarryx_u32(&x170, &x171, x169, x142, 0x0);
+  fiat_p256_addcarryx_u32(&x172, &x173, x171, x144, x132);
+  fiat_p256_addcarryx_u32(&x174, &x175, x173, x146, x148);
+  fiat_p256_addcarryx_u32(&x176, &x177, x175, ((uint32_t)x147 + x131), x149);
+  fiat_p256_addcarryx_u32(&x178, &x179, 0x0, x162, (arg1[5]));
+  fiat_p256_addcarryx_u32(&x180, &x181, x179, x164, 0x0);
+  fiat_p256_addcarryx_u32(&x182, &x183, x181, x166, 0x0);
+  fiat_p256_addcarryx_u32(&x184, &x185, x183, x168, 0x0);
+  fiat_p256_addcarryx_u32(&x186, &x187, x185, x170, 0x0);
+  fiat_p256_addcarryx_u32(&x188, &x189, x187, x172, 0x0);
+  fiat_p256_addcarryx_u32(&x190, &x191, x189, x174, 0x0);
+  fiat_p256_addcarryx_u32(&x192, &x193, x191, x176, 0x0);
+  fiat_p256_mulx_u32(&x194, &x195, x178, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x196, &x197, x178, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x198, &x199, x178, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x200, &x201, x178, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x202, &x203, 0x0, x201, x198);
+  fiat_p256_addcarryx_u32(&x204, &x205, x203, x199, x196);
+  fiat_p256_addcarryx_u32(&x206, &x207, 0x0, x178, x200);
+  fiat_p256_addcarryx_u32(&x208, &x209, x207, x180, x202);
+  fiat_p256_addcarryx_u32(&x210, &x211, x209, x182, x204);
+  fiat_p256_addcarryx_u32(&x212, &x213, x211, x184, (x205 + x197));
+  fiat_p256_addcarryx_u32(&x214, &x215, x213, x186, 0x0);
+  fiat_p256_addcarryx_u32(&x216, &x217, x215, x188, 0x0);
+  fiat_p256_addcarryx_u32(&x218, &x219, x217, x190, x178);
+  fiat_p256_addcarryx_u32(&x220, &x221, x219, x192, x194);
+  fiat_p256_addcarryx_u32(&x222, &x223, x221, ((uint32_t)x193 + x177), x195);
+  fiat_p256_addcarryx_u32(&x224, &x225, 0x0, x208, (arg1[6]));
+  fiat_p256_addcarryx_u32(&x226, &x227, x225, x210, 0x0);
+  fiat_p256_addcarryx_u32(&x228, &x229, x227, x212, 0x0);
+  fiat_p256_addcarryx_u32(&x230, &x231, x229, x214, 0x0);
+  fiat_p256_addcarryx_u32(&x232, &x233, x231, x216, 0x0);
+  fiat_p256_addcarryx_u32(&x234, &x235, x233, x218, 0x0);
+  fiat_p256_addcarryx_u32(&x236, &x237, x235, x220, 0x0);
+  fiat_p256_addcarryx_u32(&x238, &x239, x237, x222, 0x0);
+  fiat_p256_mulx_u32(&x240, &x241, x224, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x242, &x243, x224, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x244, &x245, x224, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x246, &x247, x224, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x248, &x249, 0x0, x247, x244);
+  fiat_p256_addcarryx_u32(&x250, &x251, x249, x245, x242);
+  fiat_p256_addcarryx_u32(&x252, &x253, 0x0, x224, x246);
+  fiat_p256_addcarryx_u32(&x254, &x255, x253, x226, x248);
+  fiat_p256_addcarryx_u32(&x256, &x257, x255, x228, x250);
+  fiat_p256_addcarryx_u32(&x258, &x259, x257, x230, (x251 + x243));
+  fiat_p256_addcarryx_u32(&x260, &x261, x259, x232, 0x0);
+  fiat_p256_addcarryx_u32(&x262, &x263, x261, x234, 0x0);
+  fiat_p256_addcarryx_u32(&x264, &x265, x263, x236, x224);
+  fiat_p256_addcarryx_u32(&x266, &x267, x265, x238, x240);
+  fiat_p256_addcarryx_u32(&x268, &x269, x267, ((uint32_t)x239 + x223), x241);
+  fiat_p256_addcarryx_u32(&x270, &x271, 0x0, x254, (arg1[7]));
+  fiat_p256_addcarryx_u32(&x272, &x273, x271, x256, 0x0);
+  fiat_p256_addcarryx_u32(&x274, &x275, x273, x258, 0x0);
+  fiat_p256_addcarryx_u32(&x276, &x277, x275, x260, 0x0);
+  fiat_p256_addcarryx_u32(&x278, &x279, x277, x262, 0x0);
+  fiat_p256_addcarryx_u32(&x280, &x281, x279, x264, 0x0);
+  fiat_p256_addcarryx_u32(&x282, &x283, x281, x266, 0x0);
+  fiat_p256_addcarryx_u32(&x284, &x285, x283, x268, 0x0);
+  fiat_p256_mulx_u32(&x286, &x287, x270, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x288, &x289, x270, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x290, &x291, x270, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x292, &x293, x270, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x294, &x295, 0x0, x293, x290);
+  fiat_p256_addcarryx_u32(&x296, &x297, x295, x291, x288);
+  fiat_p256_addcarryx_u32(&x298, &x299, 0x0, x270, x292);
+  fiat_p256_addcarryx_u32(&x300, &x301, x299, x272, x294);
+  fiat_p256_addcarryx_u32(&x302, &x303, x301, x274, x296);
+  fiat_p256_addcarryx_u32(&x304, &x305, x303, x276, (x297 + x289));
+  fiat_p256_addcarryx_u32(&x306, &x307, x305, x278, 0x0);
+  fiat_p256_addcarryx_u32(&x308, &x309, x307, x280, 0x0);
+  fiat_p256_addcarryx_u32(&x310, &x311, x309, x282, x270);
+  fiat_p256_addcarryx_u32(&x312, &x313, x311, x284, x286);
+  fiat_p256_addcarryx_u32(&x314, &x315, x313, ((uint32_t)x285 + x269), x287);
+  fiat_p256_subborrowx_u32(&x316, &x317, 0x0, x300, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x318, &x319, x317, x302, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x320, &x321, x319, x304, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x322, &x323, x321, x306, 0x0);
+  fiat_p256_subborrowx_u32(&x324, &x325, x323, x308, 0x0);
+  fiat_p256_subborrowx_u32(&x326, &x327, x325, x310, 0x0);
+  fiat_p256_subborrowx_u32(&x328, &x329, x327, x312, 0x1);
+  fiat_p256_subborrowx_u32(&x330, &x331, x329, x314, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x332, &x333, x331, x315, 0x0);
+  fiat_p256_cmovznz_u32(&x334, x333, x316, x300);
+  fiat_p256_cmovznz_u32(&x335, x333, x318, x302);
+  fiat_p256_cmovznz_u32(&x336, x333, x320, x304);
+  fiat_p256_cmovznz_u32(&x337, x333, x322, x306);
+  fiat_p256_cmovznz_u32(&x338, x333, x324, x308);
+  fiat_p256_cmovznz_u32(&x339, x333, x326, x310);
+  fiat_p256_cmovznz_u32(&x340, x333, x328, x312);
   fiat_p256_cmovznz_u32(&x341, x333, x330, x314);
   out1[0] = x334;
   out1[1] = x335;
@@ -2909,7 +2989,904 @@
 }
 
 /*
+ * The function fiat_p256_to_montgomery translates a field element into the Montgomery domain.
+ *
+ * Preconditions:
+ *   0 ≤ eval arg1 < m
+ * Postconditions:
+ *   eval (from_montgomery out1) mod m = eval arg1 mod m
+ *   0 ≤ eval out1 < m
+ *
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_to_montgomery(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_non_montgomery_domain_field_element arg1) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint32_t x11;
+  uint32_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint32_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint32_t x19;
+  uint32_t x20;
+  uint32_t x21;
+  uint32_t x22;
+  uint32_t x23;
+  fiat_p256_uint1 x24;
+  uint32_t x25;
+  fiat_p256_uint1 x26;
+  uint32_t x27;
+  fiat_p256_uint1 x28;
+  uint32_t x29;
+  fiat_p256_uint1 x30;
+  uint32_t x31;
+  fiat_p256_uint1 x32;
+  uint32_t x33;
+  uint32_t x34;
+  uint32_t x35;
+  uint32_t x36;
+  uint32_t x37;
+  uint32_t x38;
+  uint32_t x39;
+  uint32_t x40;
+  uint32_t x41;
+  fiat_p256_uint1 x42;
+  uint32_t x43;
+  fiat_p256_uint1 x44;
+  uint32_t x45;
+  fiat_p256_uint1 x46;
+  uint32_t x47;
+  fiat_p256_uint1 x48;
+  uint32_t x49;
+  fiat_p256_uint1 x50;
+  uint32_t x51;
+  fiat_p256_uint1 x52;
+  uint32_t x53;
+  fiat_p256_uint1 x54;
+  uint32_t x55;
+  fiat_p256_uint1 x56;
+  uint32_t x57;
+  fiat_p256_uint1 x58;
+  uint32_t x59;
+  fiat_p256_uint1 x60;
+  uint32_t x61;
+  fiat_p256_uint1 x62;
+  uint32_t x63;
+  uint32_t x64;
+  uint32_t x65;
+  uint32_t x66;
+  uint32_t x67;
+  uint32_t x68;
+  uint32_t x69;
+  uint32_t x70;
+  uint32_t x71;
+  uint32_t x72;
+  uint32_t x73;
+  uint32_t x74;
+  uint32_t x75;
+  uint32_t x76;
+  uint32_t x77;
+  fiat_p256_uint1 x78;
+  uint32_t x79;
+  fiat_p256_uint1 x80;
+  uint32_t x81;
+  fiat_p256_uint1 x82;
+  uint32_t x83;
+  fiat_p256_uint1 x84;
+  uint32_t x85;
+  fiat_p256_uint1 x86;
+  uint32_t x87;
+  fiat_p256_uint1 x88;
+  uint32_t x89;
+  fiat_p256_uint1 x90;
+  uint32_t x91;
+  fiat_p256_uint1 x92;
+  uint32_t x93;
+  fiat_p256_uint1 x94;
+  uint32_t x95;
+  fiat_p256_uint1 x96;
+  uint32_t x97;
+  fiat_p256_uint1 x98;
+  uint32_t x99;
+  fiat_p256_uint1 x100;
+  uint32_t x101;
+  fiat_p256_uint1 x102;
+  uint32_t x103;
+  uint32_t x104;
+  uint32_t x105;
+  uint32_t x106;
+  uint32_t x107;
+  uint32_t x108;
+  uint32_t x109;
+  uint32_t x110;
+  uint32_t x111;
+  fiat_p256_uint1 x112;
+  uint32_t x113;
+  fiat_p256_uint1 x114;
+  uint32_t x115;
+  fiat_p256_uint1 x116;
+  uint32_t x117;
+  fiat_p256_uint1 x118;
+  uint32_t x119;
+  fiat_p256_uint1 x120;
+  uint32_t x121;
+  fiat_p256_uint1 x122;
+  uint32_t x123;
+  fiat_p256_uint1 x124;
+  uint32_t x125;
+  fiat_p256_uint1 x126;
+  uint32_t x127;
+  fiat_p256_uint1 x128;
+  uint32_t x129;
+  fiat_p256_uint1 x130;
+  uint32_t x131;
+  fiat_p256_uint1 x132;
+  uint32_t x133;
+  uint32_t x134;
+  uint32_t x135;
+  uint32_t x136;
+  uint32_t x137;
+  uint32_t x138;
+  uint32_t x139;
+  uint32_t x140;
+  uint32_t x141;
+  uint32_t x142;
+  uint32_t x143;
+  uint32_t x144;
+  uint32_t x145;
+  uint32_t x146;
+  uint32_t x147;
+  fiat_p256_uint1 x148;
+  uint32_t x149;
+  fiat_p256_uint1 x150;
+  uint32_t x151;
+  fiat_p256_uint1 x152;
+  uint32_t x153;
+  fiat_p256_uint1 x154;
+  uint32_t x155;
+  fiat_p256_uint1 x156;
+  uint32_t x157;
+  fiat_p256_uint1 x158;
+  uint32_t x159;
+  fiat_p256_uint1 x160;
+  uint32_t x161;
+  fiat_p256_uint1 x162;
+  uint32_t x163;
+  fiat_p256_uint1 x164;
+  uint32_t x165;
+  fiat_p256_uint1 x166;
+  uint32_t x167;
+  fiat_p256_uint1 x168;
+  uint32_t x169;
+  fiat_p256_uint1 x170;
+  uint32_t x171;
+  fiat_p256_uint1 x172;
+  uint32_t x173;
+  uint32_t x174;
+  uint32_t x175;
+  uint32_t x176;
+  uint32_t x177;
+  uint32_t x178;
+  uint32_t x179;
+  uint32_t x180;
+  uint32_t x181;
+  fiat_p256_uint1 x182;
+  uint32_t x183;
+  fiat_p256_uint1 x184;
+  uint32_t x185;
+  fiat_p256_uint1 x186;
+  uint32_t x187;
+  fiat_p256_uint1 x188;
+  uint32_t x189;
+  fiat_p256_uint1 x190;
+  uint32_t x191;
+  fiat_p256_uint1 x192;
+  uint32_t x193;
+  fiat_p256_uint1 x194;
+  uint32_t x195;
+  fiat_p256_uint1 x196;
+  uint32_t x197;
+  fiat_p256_uint1 x198;
+  uint32_t x199;
+  fiat_p256_uint1 x200;
+  uint32_t x201;
+  fiat_p256_uint1 x202;
+  uint32_t x203;
+  uint32_t x204;
+  uint32_t x205;
+  uint32_t x206;
+  uint32_t x207;
+  uint32_t x208;
+  uint32_t x209;
+  uint32_t x210;
+  uint32_t x211;
+  uint32_t x212;
+  uint32_t x213;
+  uint32_t x214;
+  uint32_t x215;
+  uint32_t x216;
+  uint32_t x217;
+  fiat_p256_uint1 x218;
+  uint32_t x219;
+  fiat_p256_uint1 x220;
+  uint32_t x221;
+  fiat_p256_uint1 x222;
+  uint32_t x223;
+  fiat_p256_uint1 x224;
+  uint32_t x225;
+  fiat_p256_uint1 x226;
+  uint32_t x227;
+  fiat_p256_uint1 x228;
+  uint32_t x229;
+  fiat_p256_uint1 x230;
+  uint32_t x231;
+  fiat_p256_uint1 x232;
+  uint32_t x233;
+  fiat_p256_uint1 x234;
+  uint32_t x235;
+  fiat_p256_uint1 x236;
+  uint32_t x237;
+  fiat_p256_uint1 x238;
+  uint32_t x239;
+  fiat_p256_uint1 x240;
+  uint32_t x241;
+  fiat_p256_uint1 x242;
+  uint32_t x243;
+  uint32_t x244;
+  uint32_t x245;
+  uint32_t x246;
+  uint32_t x247;
+  uint32_t x248;
+  uint32_t x249;
+  uint32_t x250;
+  uint32_t x251;
+  fiat_p256_uint1 x252;
+  uint32_t x253;
+  fiat_p256_uint1 x254;
+  uint32_t x255;
+  fiat_p256_uint1 x256;
+  uint32_t x257;
+  fiat_p256_uint1 x258;
+  uint32_t x259;
+  fiat_p256_uint1 x260;
+  uint32_t x261;
+  fiat_p256_uint1 x262;
+  uint32_t x263;
+  fiat_p256_uint1 x264;
+  uint32_t x265;
+  fiat_p256_uint1 x266;
+  uint32_t x267;
+  fiat_p256_uint1 x268;
+  uint32_t x269;
+  fiat_p256_uint1 x270;
+  uint32_t x271;
+  fiat_p256_uint1 x272;
+  uint32_t x273;
+  uint32_t x274;
+  uint32_t x275;
+  uint32_t x276;
+  uint32_t x277;
+  uint32_t x278;
+  uint32_t x279;
+  uint32_t x280;
+  uint32_t x281;
+  uint32_t x282;
+  uint32_t x283;
+  uint32_t x284;
+  uint32_t x285;
+  uint32_t x286;
+  uint32_t x287;
+  fiat_p256_uint1 x288;
+  uint32_t x289;
+  fiat_p256_uint1 x290;
+  uint32_t x291;
+  fiat_p256_uint1 x292;
+  uint32_t x293;
+  fiat_p256_uint1 x294;
+  uint32_t x295;
+  fiat_p256_uint1 x296;
+  uint32_t x297;
+  fiat_p256_uint1 x298;
+  uint32_t x299;
+  fiat_p256_uint1 x300;
+  uint32_t x301;
+  fiat_p256_uint1 x302;
+  uint32_t x303;
+  fiat_p256_uint1 x304;
+  uint32_t x305;
+  fiat_p256_uint1 x306;
+  uint32_t x307;
+  fiat_p256_uint1 x308;
+  uint32_t x309;
+  fiat_p256_uint1 x310;
+  uint32_t x311;
+  fiat_p256_uint1 x312;
+  uint32_t x313;
+  uint32_t x314;
+  uint32_t x315;
+  uint32_t x316;
+  uint32_t x317;
+  uint32_t x318;
+  uint32_t x319;
+  uint32_t x320;
+  uint32_t x321;
+  fiat_p256_uint1 x322;
+  uint32_t x323;
+  fiat_p256_uint1 x324;
+  uint32_t x325;
+  fiat_p256_uint1 x326;
+  uint32_t x327;
+  fiat_p256_uint1 x328;
+  uint32_t x329;
+  fiat_p256_uint1 x330;
+  uint32_t x331;
+  fiat_p256_uint1 x332;
+  uint32_t x333;
+  fiat_p256_uint1 x334;
+  uint32_t x335;
+  fiat_p256_uint1 x336;
+  uint32_t x337;
+  fiat_p256_uint1 x338;
+  uint32_t x339;
+  fiat_p256_uint1 x340;
+  uint32_t x341;
+  fiat_p256_uint1 x342;
+  uint32_t x343;
+  uint32_t x344;
+  uint32_t x345;
+  uint32_t x346;
+  uint32_t x347;
+  uint32_t x348;
+  uint32_t x349;
+  uint32_t x350;
+  uint32_t x351;
+  uint32_t x352;
+  uint32_t x353;
+  uint32_t x354;
+  uint32_t x355;
+  uint32_t x356;
+  uint32_t x357;
+  fiat_p256_uint1 x358;
+  uint32_t x359;
+  fiat_p256_uint1 x360;
+  uint32_t x361;
+  fiat_p256_uint1 x362;
+  uint32_t x363;
+  fiat_p256_uint1 x364;
+  uint32_t x365;
+  fiat_p256_uint1 x366;
+  uint32_t x367;
+  fiat_p256_uint1 x368;
+  uint32_t x369;
+  fiat_p256_uint1 x370;
+  uint32_t x371;
+  fiat_p256_uint1 x372;
+  uint32_t x373;
+  fiat_p256_uint1 x374;
+  uint32_t x375;
+  fiat_p256_uint1 x376;
+  uint32_t x377;
+  fiat_p256_uint1 x378;
+  uint32_t x379;
+  fiat_p256_uint1 x380;
+  uint32_t x381;
+  fiat_p256_uint1 x382;
+  uint32_t x383;
+  uint32_t x384;
+  uint32_t x385;
+  uint32_t x386;
+  uint32_t x387;
+  uint32_t x388;
+  uint32_t x389;
+  uint32_t x390;
+  uint32_t x391;
+  fiat_p256_uint1 x392;
+  uint32_t x393;
+  fiat_p256_uint1 x394;
+  uint32_t x395;
+  fiat_p256_uint1 x396;
+  uint32_t x397;
+  fiat_p256_uint1 x398;
+  uint32_t x399;
+  fiat_p256_uint1 x400;
+  uint32_t x401;
+  fiat_p256_uint1 x402;
+  uint32_t x403;
+  fiat_p256_uint1 x404;
+  uint32_t x405;
+  fiat_p256_uint1 x406;
+  uint32_t x407;
+  fiat_p256_uint1 x408;
+  uint32_t x409;
+  fiat_p256_uint1 x410;
+  uint32_t x411;
+  fiat_p256_uint1 x412;
+  uint32_t x413;
+  uint32_t x414;
+  uint32_t x415;
+  uint32_t x416;
+  uint32_t x417;
+  uint32_t x418;
+  uint32_t x419;
+  uint32_t x420;
+  uint32_t x421;
+  uint32_t x422;
+  uint32_t x423;
+  uint32_t x424;
+  uint32_t x425;
+  uint32_t x426;
+  uint32_t x427;
+  fiat_p256_uint1 x428;
+  uint32_t x429;
+  fiat_p256_uint1 x430;
+  uint32_t x431;
+  fiat_p256_uint1 x432;
+  uint32_t x433;
+  fiat_p256_uint1 x434;
+  uint32_t x435;
+  fiat_p256_uint1 x436;
+  uint32_t x437;
+  fiat_p256_uint1 x438;
+  uint32_t x439;
+  fiat_p256_uint1 x440;
+  uint32_t x441;
+  fiat_p256_uint1 x442;
+  uint32_t x443;
+  fiat_p256_uint1 x444;
+  uint32_t x445;
+  fiat_p256_uint1 x446;
+  uint32_t x447;
+  fiat_p256_uint1 x448;
+  uint32_t x449;
+  fiat_p256_uint1 x450;
+  uint32_t x451;
+  fiat_p256_uint1 x452;
+  uint32_t x453;
+  uint32_t x454;
+  uint32_t x455;
+  uint32_t x456;
+  uint32_t x457;
+  uint32_t x458;
+  uint32_t x459;
+  uint32_t x460;
+  uint32_t x461;
+  fiat_p256_uint1 x462;
+  uint32_t x463;
+  fiat_p256_uint1 x464;
+  uint32_t x465;
+  fiat_p256_uint1 x466;
+  uint32_t x467;
+  fiat_p256_uint1 x468;
+  uint32_t x469;
+  fiat_p256_uint1 x470;
+  uint32_t x471;
+  fiat_p256_uint1 x472;
+  uint32_t x473;
+  fiat_p256_uint1 x474;
+  uint32_t x475;
+  fiat_p256_uint1 x476;
+  uint32_t x477;
+  fiat_p256_uint1 x478;
+  uint32_t x479;
+  fiat_p256_uint1 x480;
+  uint32_t x481;
+  fiat_p256_uint1 x482;
+  uint32_t x483;
+  uint32_t x484;
+  uint32_t x485;
+  uint32_t x486;
+  uint32_t x487;
+  uint32_t x488;
+  uint32_t x489;
+  uint32_t x490;
+  uint32_t x491;
+  uint32_t x492;
+  uint32_t x493;
+  uint32_t x494;
+  uint32_t x495;
+  uint32_t x496;
+  uint32_t x497;
+  fiat_p256_uint1 x498;
+  uint32_t x499;
+  fiat_p256_uint1 x500;
+  uint32_t x501;
+  fiat_p256_uint1 x502;
+  uint32_t x503;
+  fiat_p256_uint1 x504;
+  uint32_t x505;
+  fiat_p256_uint1 x506;
+  uint32_t x507;
+  fiat_p256_uint1 x508;
+  uint32_t x509;
+  fiat_p256_uint1 x510;
+  uint32_t x511;
+  fiat_p256_uint1 x512;
+  uint32_t x513;
+  fiat_p256_uint1 x514;
+  uint32_t x515;
+  fiat_p256_uint1 x516;
+  uint32_t x517;
+  fiat_p256_uint1 x518;
+  uint32_t x519;
+  fiat_p256_uint1 x520;
+  uint32_t x521;
+  fiat_p256_uint1 x522;
+  uint32_t x523;
+  uint32_t x524;
+  uint32_t x525;
+  uint32_t x526;
+  uint32_t x527;
+  uint32_t x528;
+  uint32_t x529;
+  uint32_t x530;
+  uint32_t x531;
+  fiat_p256_uint1 x532;
+  uint32_t x533;
+  fiat_p256_uint1 x534;
+  uint32_t x535;
+  fiat_p256_uint1 x536;
+  uint32_t x537;
+  fiat_p256_uint1 x538;
+  uint32_t x539;
+  fiat_p256_uint1 x540;
+  uint32_t x541;
+  fiat_p256_uint1 x542;
+  uint32_t x543;
+  fiat_p256_uint1 x544;
+  uint32_t x545;
+  fiat_p256_uint1 x546;
+  uint32_t x547;
+  fiat_p256_uint1 x548;
+  uint32_t x549;
+  fiat_p256_uint1 x550;
+  uint32_t x551;
+  fiat_p256_uint1 x552;
+  uint32_t x553;
+  fiat_p256_uint1 x554;
+  uint32_t x555;
+  fiat_p256_uint1 x556;
+  uint32_t x557;
+  fiat_p256_uint1 x558;
+  uint32_t x559;
+  fiat_p256_uint1 x560;
+  uint32_t x561;
+  fiat_p256_uint1 x562;
+  uint32_t x563;
+  fiat_p256_uint1 x564;
+  uint32_t x565;
+  fiat_p256_uint1 x566;
+  uint32_t x567;
+  fiat_p256_uint1 x568;
+  uint32_t x569;
+  fiat_p256_uint1 x570;
+  uint32_t x571;
+  uint32_t x572;
+  uint32_t x573;
+  uint32_t x574;
+  uint32_t x575;
+  uint32_t x576;
+  uint32_t x577;
+  uint32_t x578;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[4]);
+  x5 = (arg1[5]);
+  x6 = (arg1[6]);
+  x7 = (arg1[7]);
+  x8 = (arg1[0]);
+  fiat_p256_mulx_u32(&x9, &x10, x8, 0x4);
+  fiat_p256_mulx_u32(&x11, &x12, x8, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x13, &x14, x8, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x15, &x16, x8, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x17, &x18, x8, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x19, &x20, x8, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x21, &x22, x8, 0x3);
+  fiat_p256_addcarryx_u32(&x23, &x24, 0x0, x20, x17);
+  fiat_p256_addcarryx_u32(&x25, &x26, x24, x18, x15);
+  fiat_p256_addcarryx_u32(&x27, &x28, x26, x16, x13);
+  fiat_p256_addcarryx_u32(&x29, &x30, x28, x14, x11);
+  fiat_p256_addcarryx_u32(&x31, &x32, x30, x12, x9);
+  fiat_p256_mulx_u32(&x33, &x34, x21, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x35, &x36, x21, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x37, &x38, x21, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x39, &x40, x21, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x41, &x42, 0x0, x40, x37);
+  fiat_p256_addcarryx_u32(&x43, &x44, x42, x38, x35);
+  fiat_p256_addcarryx_u32(&x45, &x46, 0x0, x21, x39);
+  fiat_p256_addcarryx_u32(&x47, &x48, x46, x22, x41);
+  fiat_p256_addcarryx_u32(&x49, &x50, x48, x19, x43);
+  fiat_p256_addcarryx_u32(&x51, &x52, x50, x23, (x44 + x36));
+  fiat_p256_addcarryx_u32(&x53, &x54, x52, x25, 0x0);
+  fiat_p256_addcarryx_u32(&x55, &x56, x54, x27, 0x0);
+  fiat_p256_addcarryx_u32(&x57, &x58, x56, x29, x21);
+  fiat_p256_addcarryx_u32(&x59, &x60, x58, x31, x33);
+  fiat_p256_addcarryx_u32(&x61, &x62, x60, (x32 + x10), x34);
+  fiat_p256_mulx_u32(&x63, &x64, x1, 0x4);
+  fiat_p256_mulx_u32(&x65, &x66, x1, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x67, &x68, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x69, &x70, x1, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x71, &x72, x1, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x73, &x74, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x75, &x76, x1, 0x3);
+  fiat_p256_addcarryx_u32(&x77, &x78, 0x0, x74, x71);
+  fiat_p256_addcarryx_u32(&x79, &x80, x78, x72, x69);
+  fiat_p256_addcarryx_u32(&x81, &x82, x80, x70, x67);
+  fiat_p256_addcarryx_u32(&x83, &x84, x82, x68, x65);
+  fiat_p256_addcarryx_u32(&x85, &x86, x84, x66, x63);
+  fiat_p256_addcarryx_u32(&x87, &x88, 0x0, x47, x75);
+  fiat_p256_addcarryx_u32(&x89, &x90, x88, x49, x76);
+  fiat_p256_addcarryx_u32(&x91, &x92, x90, x51, x73);
+  fiat_p256_addcarryx_u32(&x93, &x94, x92, x53, x77);
+  fiat_p256_addcarryx_u32(&x95, &x96, x94, x55, x79);
+  fiat_p256_addcarryx_u32(&x97, &x98, x96, x57, x81);
+  fiat_p256_addcarryx_u32(&x99, &x100, x98, x59, x83);
+  fiat_p256_addcarryx_u32(&x101, &x102, x100, x61, x85);
+  fiat_p256_mulx_u32(&x103, &x104, x87, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x105, &x106, x87, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x107, &x108, x87, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x109, &x110, x87, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x111, &x112, 0x0, x110, x107);
+  fiat_p256_addcarryx_u32(&x113, &x114, x112, x108, x105);
+  fiat_p256_addcarryx_u32(&x115, &x116, 0x0, x87, x109);
+  fiat_p256_addcarryx_u32(&x117, &x118, x116, x89, x111);
+  fiat_p256_addcarryx_u32(&x119, &x120, x118, x91, x113);
+  fiat_p256_addcarryx_u32(&x121, &x122, x120, x93, (x114 + x106));
+  fiat_p256_addcarryx_u32(&x123, &x124, x122, x95, 0x0);
+  fiat_p256_addcarryx_u32(&x125, &x126, x124, x97, 0x0);
+  fiat_p256_addcarryx_u32(&x127, &x128, x126, x99, x87);
+  fiat_p256_addcarryx_u32(&x129, &x130, x128, x101, x103);
+  fiat_p256_addcarryx_u32(&x131, &x132, x130, (((uint32_t)x102 + x62) + (x86 + x64)), x104);
+  fiat_p256_mulx_u32(&x133, &x134, x2, 0x4);
+  fiat_p256_mulx_u32(&x135, &x136, x2, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x137, &x138, x2, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x139, &x140, x2, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x141, &x142, x2, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x143, &x144, x2, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x145, &x146, x2, 0x3);
+  fiat_p256_addcarryx_u32(&x147, &x148, 0x0, x144, x141);
+  fiat_p256_addcarryx_u32(&x149, &x150, x148, x142, x139);
+  fiat_p256_addcarryx_u32(&x151, &x152, x150, x140, x137);
+  fiat_p256_addcarryx_u32(&x153, &x154, x152, x138, x135);
+  fiat_p256_addcarryx_u32(&x155, &x156, x154, x136, x133);
+  fiat_p256_addcarryx_u32(&x157, &x158, 0x0, x117, x145);
+  fiat_p256_addcarryx_u32(&x159, &x160, x158, x119, x146);
+  fiat_p256_addcarryx_u32(&x161, &x162, x160, x121, x143);
+  fiat_p256_addcarryx_u32(&x163, &x164, x162, x123, x147);
+  fiat_p256_addcarryx_u32(&x165, &x166, x164, x125, x149);
+  fiat_p256_addcarryx_u32(&x167, &x168, x166, x127, x151);
+  fiat_p256_addcarryx_u32(&x169, &x170, x168, x129, x153);
+  fiat_p256_addcarryx_u32(&x171, &x172, x170, x131, x155);
+  fiat_p256_mulx_u32(&x173, &x174, x157, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x175, &x176, x157, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x177, &x178, x157, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x179, &x180, x157, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x181, &x182, 0x0, x180, x177);
+  fiat_p256_addcarryx_u32(&x183, &x184, x182, x178, x175);
+  fiat_p256_addcarryx_u32(&x185, &x186, 0x0, x157, x179);
+  fiat_p256_addcarryx_u32(&x187, &x188, x186, x159, x181);
+  fiat_p256_addcarryx_u32(&x189, &x190, x188, x161, x183);
+  fiat_p256_addcarryx_u32(&x191, &x192, x190, x163, (x184 + x176));
+  fiat_p256_addcarryx_u32(&x193, &x194, x192, x165, 0x0);
+  fiat_p256_addcarryx_u32(&x195, &x196, x194, x167, 0x0);
+  fiat_p256_addcarryx_u32(&x197, &x198, x196, x169, x157);
+  fiat_p256_addcarryx_u32(&x199, &x200, x198, x171, x173);
+  fiat_p256_addcarryx_u32(&x201, &x202, x200, (((uint32_t)x172 + x132) + (x156 + x134)), x174);
+  fiat_p256_mulx_u32(&x203, &x204, x3, 0x4);
+  fiat_p256_mulx_u32(&x205, &x206, x3, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x207, &x208, x3, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x209, &x210, x3, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x211, &x212, x3, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x213, &x214, x3, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x215, &x216, x3, 0x3);
+  fiat_p256_addcarryx_u32(&x217, &x218, 0x0, x214, x211);
+  fiat_p256_addcarryx_u32(&x219, &x220, x218, x212, x209);
+  fiat_p256_addcarryx_u32(&x221, &x222, x220, x210, x207);
+  fiat_p256_addcarryx_u32(&x223, &x224, x222, x208, x205);
+  fiat_p256_addcarryx_u32(&x225, &x226, x224, x206, x203);
+  fiat_p256_addcarryx_u32(&x227, &x228, 0x0, x187, x215);
+  fiat_p256_addcarryx_u32(&x229, &x230, x228, x189, x216);
+  fiat_p256_addcarryx_u32(&x231, &x232, x230, x191, x213);
+  fiat_p256_addcarryx_u32(&x233, &x234, x232, x193, x217);
+  fiat_p256_addcarryx_u32(&x235, &x236, x234, x195, x219);
+  fiat_p256_addcarryx_u32(&x237, &x238, x236, x197, x221);
+  fiat_p256_addcarryx_u32(&x239, &x240, x238, x199, x223);
+  fiat_p256_addcarryx_u32(&x241, &x242, x240, x201, x225);
+  fiat_p256_mulx_u32(&x243, &x244, x227, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x245, &x246, x227, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x247, &x248, x227, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x249, &x250, x227, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x251, &x252, 0x0, x250, x247);
+  fiat_p256_addcarryx_u32(&x253, &x254, x252, x248, x245);
+  fiat_p256_addcarryx_u32(&x255, &x256, 0x0, x227, x249);
+  fiat_p256_addcarryx_u32(&x257, &x258, x256, x229, x251);
+  fiat_p256_addcarryx_u32(&x259, &x260, x258, x231, x253);
+  fiat_p256_addcarryx_u32(&x261, &x262, x260, x233, (x254 + x246));
+  fiat_p256_addcarryx_u32(&x263, &x264, x262, x235, 0x0);
+  fiat_p256_addcarryx_u32(&x265, &x266, x264, x237, 0x0);
+  fiat_p256_addcarryx_u32(&x267, &x268, x266, x239, x227);
+  fiat_p256_addcarryx_u32(&x269, &x270, x268, x241, x243);
+  fiat_p256_addcarryx_u32(&x271, &x272, x270, (((uint32_t)x242 + x202) + (x226 + x204)), x244);
+  fiat_p256_mulx_u32(&x273, &x274, x4, 0x4);
+  fiat_p256_mulx_u32(&x275, &x276, x4, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x277, &x278, x4, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x279, &x280, x4, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x281, &x282, x4, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x283, &x284, x4, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x285, &x286, x4, 0x3);
+  fiat_p256_addcarryx_u32(&x287, &x288, 0x0, x284, x281);
+  fiat_p256_addcarryx_u32(&x289, &x290, x288, x282, x279);
+  fiat_p256_addcarryx_u32(&x291, &x292, x290, x280, x277);
+  fiat_p256_addcarryx_u32(&x293, &x294, x292, x278, x275);
+  fiat_p256_addcarryx_u32(&x295, &x296, x294, x276, x273);
+  fiat_p256_addcarryx_u32(&x297, &x298, 0x0, x257, x285);
+  fiat_p256_addcarryx_u32(&x299, &x300, x298, x259, x286);
+  fiat_p256_addcarryx_u32(&x301, &x302, x300, x261, x283);
+  fiat_p256_addcarryx_u32(&x303, &x304, x302, x263, x287);
+  fiat_p256_addcarryx_u32(&x305, &x306, x304, x265, x289);
+  fiat_p256_addcarryx_u32(&x307, &x308, x306, x267, x291);
+  fiat_p256_addcarryx_u32(&x309, &x310, x308, x269, x293);
+  fiat_p256_addcarryx_u32(&x311, &x312, x310, x271, x295);
+  fiat_p256_mulx_u32(&x313, &x314, x297, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x315, &x316, x297, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x317, &x318, x297, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x319, &x320, x297, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x321, &x322, 0x0, x320, x317);
+  fiat_p256_addcarryx_u32(&x323, &x324, x322, x318, x315);
+  fiat_p256_addcarryx_u32(&x325, &x326, 0x0, x297, x319);
+  fiat_p256_addcarryx_u32(&x327, &x328, x326, x299, x321);
+  fiat_p256_addcarryx_u32(&x329, &x330, x328, x301, x323);
+  fiat_p256_addcarryx_u32(&x331, &x332, x330, x303, (x324 + x316));
+  fiat_p256_addcarryx_u32(&x333, &x334, x332, x305, 0x0);
+  fiat_p256_addcarryx_u32(&x335, &x336, x334, x307, 0x0);
+  fiat_p256_addcarryx_u32(&x337, &x338, x336, x309, x297);
+  fiat_p256_addcarryx_u32(&x339, &x340, x338, x311, x313);
+  fiat_p256_addcarryx_u32(&x341, &x342, x340, (((uint32_t)x312 + x272) + (x296 + x274)), x314);
+  fiat_p256_mulx_u32(&x343, &x344, x5, 0x4);
+  fiat_p256_mulx_u32(&x345, &x346, x5, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x347, &x348, x5, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x349, &x350, x5, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x351, &x352, x5, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x353, &x354, x5, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x355, &x356, x5, 0x3);
+  fiat_p256_addcarryx_u32(&x357, &x358, 0x0, x354, x351);
+  fiat_p256_addcarryx_u32(&x359, &x360, x358, x352, x349);
+  fiat_p256_addcarryx_u32(&x361, &x362, x360, x350, x347);
+  fiat_p256_addcarryx_u32(&x363, &x364, x362, x348, x345);
+  fiat_p256_addcarryx_u32(&x365, &x366, x364, x346, x343);
+  fiat_p256_addcarryx_u32(&x367, &x368, 0x0, x327, x355);
+  fiat_p256_addcarryx_u32(&x369, &x370, x368, x329, x356);
+  fiat_p256_addcarryx_u32(&x371, &x372, x370, x331, x353);
+  fiat_p256_addcarryx_u32(&x373, &x374, x372, x333, x357);
+  fiat_p256_addcarryx_u32(&x375, &x376, x374, x335, x359);
+  fiat_p256_addcarryx_u32(&x377, &x378, x376, x337, x361);
+  fiat_p256_addcarryx_u32(&x379, &x380, x378, x339, x363);
+  fiat_p256_addcarryx_u32(&x381, &x382, x380, x341, x365);
+  fiat_p256_mulx_u32(&x383, &x384, x367, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x385, &x386, x367, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x387, &x388, x367, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x389, &x390, x367, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x391, &x392, 0x0, x390, x387);
+  fiat_p256_addcarryx_u32(&x393, &x394, x392, x388, x385);
+  fiat_p256_addcarryx_u32(&x395, &x396, 0x0, x367, x389);
+  fiat_p256_addcarryx_u32(&x397, &x398, x396, x369, x391);
+  fiat_p256_addcarryx_u32(&x399, &x400, x398, x371, x393);
+  fiat_p256_addcarryx_u32(&x401, &x402, x400, x373, (x394 + x386));
+  fiat_p256_addcarryx_u32(&x403, &x404, x402, x375, 0x0);
+  fiat_p256_addcarryx_u32(&x405, &x406, x404, x377, 0x0);
+  fiat_p256_addcarryx_u32(&x407, &x408, x406, x379, x367);
+  fiat_p256_addcarryx_u32(&x409, &x410, x408, x381, x383);
+  fiat_p256_addcarryx_u32(&x411, &x412, x410, (((uint32_t)x382 + x342) + (x366 + x344)), x384);
+  fiat_p256_mulx_u32(&x413, &x414, x6, 0x4);
+  fiat_p256_mulx_u32(&x415, &x416, x6, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x417, &x418, x6, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x419, &x420, x6, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x421, &x422, x6, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x423, &x424, x6, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x425, &x426, x6, 0x3);
+  fiat_p256_addcarryx_u32(&x427, &x428, 0x0, x424, x421);
+  fiat_p256_addcarryx_u32(&x429, &x430, x428, x422, x419);
+  fiat_p256_addcarryx_u32(&x431, &x432, x430, x420, x417);
+  fiat_p256_addcarryx_u32(&x433, &x434, x432, x418, x415);
+  fiat_p256_addcarryx_u32(&x435, &x436, x434, x416, x413);
+  fiat_p256_addcarryx_u32(&x437, &x438, 0x0, x397, x425);
+  fiat_p256_addcarryx_u32(&x439, &x440, x438, x399, x426);
+  fiat_p256_addcarryx_u32(&x441, &x442, x440, x401, x423);
+  fiat_p256_addcarryx_u32(&x443, &x444, x442, x403, x427);
+  fiat_p256_addcarryx_u32(&x445, &x446, x444, x405, x429);
+  fiat_p256_addcarryx_u32(&x447, &x448, x446, x407, x431);
+  fiat_p256_addcarryx_u32(&x449, &x450, x448, x409, x433);
+  fiat_p256_addcarryx_u32(&x451, &x452, x450, x411, x435);
+  fiat_p256_mulx_u32(&x453, &x454, x437, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x455, &x456, x437, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x457, &x458, x437, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x459, &x460, x437, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x461, &x462, 0x0, x460, x457);
+  fiat_p256_addcarryx_u32(&x463, &x464, x462, x458, x455);
+  fiat_p256_addcarryx_u32(&x465, &x466, 0x0, x437, x459);
+  fiat_p256_addcarryx_u32(&x467, &x468, x466, x439, x461);
+  fiat_p256_addcarryx_u32(&x469, &x470, x468, x441, x463);
+  fiat_p256_addcarryx_u32(&x471, &x472, x470, x443, (x464 + x456));
+  fiat_p256_addcarryx_u32(&x473, &x474, x472, x445, 0x0);
+  fiat_p256_addcarryx_u32(&x475, &x476, x474, x447, 0x0);
+  fiat_p256_addcarryx_u32(&x477, &x478, x476, x449, x437);
+  fiat_p256_addcarryx_u32(&x479, &x480, x478, x451, x453);
+  fiat_p256_addcarryx_u32(&x481, &x482, x480, (((uint32_t)x452 + x412) + (x436 + x414)), x454);
+  fiat_p256_mulx_u32(&x483, &x484, x7, 0x4);
+  fiat_p256_mulx_u32(&x485, &x486, x7, UINT32_C(0xfffffffd));
+  fiat_p256_mulx_u32(&x487, &x488, x7, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x489, &x490, x7, UINT32_C(0xfffffffe));
+  fiat_p256_mulx_u32(&x491, &x492, x7, UINT32_C(0xfffffffb));
+  fiat_p256_mulx_u32(&x493, &x494, x7, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x495, &x496, x7, 0x3);
+  fiat_p256_addcarryx_u32(&x497, &x498, 0x0, x494, x491);
+  fiat_p256_addcarryx_u32(&x499, &x500, x498, x492, x489);
+  fiat_p256_addcarryx_u32(&x501, &x502, x500, x490, x487);
+  fiat_p256_addcarryx_u32(&x503, &x504, x502, x488, x485);
+  fiat_p256_addcarryx_u32(&x505, &x506, x504, x486, x483);
+  fiat_p256_addcarryx_u32(&x507, &x508, 0x0, x467, x495);
+  fiat_p256_addcarryx_u32(&x509, &x510, x508, x469, x496);
+  fiat_p256_addcarryx_u32(&x511, &x512, x510, x471, x493);
+  fiat_p256_addcarryx_u32(&x513, &x514, x512, x473, x497);
+  fiat_p256_addcarryx_u32(&x515, &x516, x514, x475, x499);
+  fiat_p256_addcarryx_u32(&x517, &x518, x516, x477, x501);
+  fiat_p256_addcarryx_u32(&x519, &x520, x518, x479, x503);
+  fiat_p256_addcarryx_u32(&x521, &x522, x520, x481, x505);
+  fiat_p256_mulx_u32(&x523, &x524, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x525, &x526, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x527, &x528, x507, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u32(&x529, &x530, x507, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x531, &x532, 0x0, x530, x527);
+  fiat_p256_addcarryx_u32(&x533, &x534, x532, x528, x525);
+  fiat_p256_addcarryx_u32(&x535, &x536, 0x0, x507, x529);
+  fiat_p256_addcarryx_u32(&x537, &x538, x536, x509, x531);
+  fiat_p256_addcarryx_u32(&x539, &x540, x538, x511, x533);
+  fiat_p256_addcarryx_u32(&x541, &x542, x540, x513, (x534 + x526));
+  fiat_p256_addcarryx_u32(&x543, &x544, x542, x515, 0x0);
+  fiat_p256_addcarryx_u32(&x545, &x546, x544, x517, 0x0);
+  fiat_p256_addcarryx_u32(&x547, &x548, x546, x519, x507);
+  fiat_p256_addcarryx_u32(&x549, &x550, x548, x521, x523);
+  fiat_p256_addcarryx_u32(&x551, &x552, x550, (((uint32_t)x522 + x482) + (x506 + x484)), x524);
+  fiat_p256_subborrowx_u32(&x553, &x554, 0x0, x537, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x555, &x556, x554, x539, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x557, &x558, x556, x541, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x559, &x560, x558, x543, 0x0);
+  fiat_p256_subborrowx_u32(&x561, &x562, x560, x545, 0x0);
+  fiat_p256_subborrowx_u32(&x563, &x564, x562, x547, 0x0);
+  fiat_p256_subborrowx_u32(&x565, &x566, x564, x549, 0x1);
+  fiat_p256_subborrowx_u32(&x567, &x568, x566, x551, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x569, &x570, x568, x552, 0x0);
+  fiat_p256_cmovznz_u32(&x571, x570, x553, x537);
+  fiat_p256_cmovznz_u32(&x572, x570, x555, x539);
+  fiat_p256_cmovznz_u32(&x573, x570, x557, x541);
+  fiat_p256_cmovznz_u32(&x574, x570, x559, x543);
+  fiat_p256_cmovznz_u32(&x575, x570, x561, x545);
+  fiat_p256_cmovznz_u32(&x576, x570, x563, x547);
+  fiat_p256_cmovznz_u32(&x577, x570, x565, x549);
+  fiat_p256_cmovznz_u32(&x578, x570, x567, x551);
+  out1[0] = x571;
+  out1[1] = x572;
+  out1[2] = x573;
+  out1[3] = x574;
+  out1[4] = x575;
+  out1[5] = x576;
+  out1[6] = x577;
+  out1[7] = x578;
+}
+
+/*
  * The function fiat_p256_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
@@ -2920,13 +3897,15 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffff]
  */
-static void fiat_p256_nonzero(uint32_t* out1, const uint32_t arg1[8]) {
-  uint32_t x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | ((arg1[5]) | ((arg1[6]) | ((arg1[7]) | (uint32_t)0x0))))))));
+static FIAT_P256_FIAT_INLINE void fiat_p256_nonzero(uint32_t* out1, const uint32_t arg1[8]) {
+  uint32_t x1;
+  x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | ((arg1[5]) | ((arg1[6]) | (arg1[7]))))))));
   *out1 = x1;
 }
 
 /*
  * The function fiat_p256_selectznz is a multi-limb conditional select.
+ *
  * Postconditions:
  *   eval out1 = (if arg1 = 0 then eval arg2 else eval arg3)
  *
@@ -2937,22 +3916,22 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_selectznz(uint32_t out1[8], fiat_p256_uint1 arg1, const uint32_t arg2[8], const uint32_t arg3[8]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_selectznz(uint32_t out1[8], fiat_p256_uint1 arg1, const uint32_t arg2[8], const uint32_t arg3[8]) {
   uint32_t x1;
-  fiat_p256_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0]));
   uint32_t x2;
-  fiat_p256_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1]));
   uint32_t x3;
-  fiat_p256_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2]));
   uint32_t x4;
-  fiat_p256_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3]));
   uint32_t x5;
-  fiat_p256_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4]));
   uint32_t x6;
-  fiat_p256_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5]));
   uint32_t x7;
-  fiat_p256_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6]));
   uint32_t x8;
+  fiat_p256_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0]));
+  fiat_p256_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1]));
+  fiat_p256_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2]));
+  fiat_p256_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3]));
+  fiat_p256_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4]));
+  fiat_p256_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5]));
+  fiat_p256_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6]));
   fiat_p256_cmovznz_u32(&x8, arg1, (arg2[7]), (arg3[7]));
   out1[0] = x1;
   out1[1] = x2;
@@ -2965,7 +3944,8 @@
 }
 
 /*
- * The function fiat_p256_to_bytes serializes a field element in the Montgomery domain to bytes in little-endian order.
+ * The function fiat_p256_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
@@ -2976,106 +3956,156 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]]
  */
-static void fiat_p256_to_bytes(uint8_t out1[32], const uint32_t arg1[8]) {
-  uint32_t x1 = (arg1[7]);
-  uint32_t x2 = (arg1[6]);
-  uint32_t x3 = (arg1[5]);
-  uint32_t x4 = (arg1[4]);
-  uint32_t x5 = (arg1[3]);
-  uint32_t x6 = (arg1[2]);
-  uint32_t x7 = (arg1[1]);
-  uint32_t x8 = (arg1[0]);
-  uint32_t x9 = (x8 >> 8);
-  uint8_t x10 = (uint8_t)(x8 & UINT8_C(0xff));
-  uint32_t x11 = (x9 >> 8);
-  uint8_t x12 = (uint8_t)(x9 & UINT8_C(0xff));
-  uint8_t x13 = (uint8_t)(x11 >> 8);
-  uint8_t x14 = (uint8_t)(x11 & UINT8_C(0xff));
-  uint8_t x15 = (uint8_t)(x13 & UINT8_C(0xff));
-  uint32_t x16 = (x7 >> 8);
-  uint8_t x17 = (uint8_t)(x7 & UINT8_C(0xff));
-  uint32_t x18 = (x16 >> 8);
-  uint8_t x19 = (uint8_t)(x16 & UINT8_C(0xff));
-  uint8_t x20 = (uint8_t)(x18 >> 8);
-  uint8_t x21 = (uint8_t)(x18 & UINT8_C(0xff));
-  uint8_t x22 = (uint8_t)(x20 & UINT8_C(0xff));
-  uint32_t x23 = (x6 >> 8);
-  uint8_t x24 = (uint8_t)(x6 & UINT8_C(0xff));
-  uint32_t x25 = (x23 >> 8);
-  uint8_t x26 = (uint8_t)(x23 & UINT8_C(0xff));
-  uint8_t x27 = (uint8_t)(x25 >> 8);
-  uint8_t x28 = (uint8_t)(x25 & UINT8_C(0xff));
-  uint8_t x29 = (uint8_t)(x27 & UINT8_C(0xff));
-  uint32_t x30 = (x5 >> 8);
-  uint8_t x31 = (uint8_t)(x5 & UINT8_C(0xff));
-  uint32_t x32 = (x30 >> 8);
-  uint8_t x33 = (uint8_t)(x30 & UINT8_C(0xff));
-  uint8_t x34 = (uint8_t)(x32 >> 8);
-  uint8_t x35 = (uint8_t)(x32 & UINT8_C(0xff));
-  uint8_t x36 = (uint8_t)(x34 & UINT8_C(0xff));
-  uint32_t x37 = (x4 >> 8);
-  uint8_t x38 = (uint8_t)(x4 & UINT8_C(0xff));
-  uint32_t x39 = (x37 >> 8);
-  uint8_t x40 = (uint8_t)(x37 & UINT8_C(0xff));
-  uint8_t x41 = (uint8_t)(x39 >> 8);
-  uint8_t x42 = (uint8_t)(x39 & UINT8_C(0xff));
-  uint8_t x43 = (uint8_t)(x41 & UINT8_C(0xff));
-  uint32_t x44 = (x3 >> 8);
-  uint8_t x45 = (uint8_t)(x3 & UINT8_C(0xff));
-  uint32_t x46 = (x44 >> 8);
-  uint8_t x47 = (uint8_t)(x44 & UINT8_C(0xff));
-  uint8_t x48 = (uint8_t)(x46 >> 8);
-  uint8_t x49 = (uint8_t)(x46 & UINT8_C(0xff));
-  uint8_t x50 = (uint8_t)(x48 & UINT8_C(0xff));
-  uint32_t x51 = (x2 >> 8);
-  uint8_t x52 = (uint8_t)(x2 & UINT8_C(0xff));
-  uint32_t x53 = (x51 >> 8);
-  uint8_t x54 = (uint8_t)(x51 & UINT8_C(0xff));
-  uint8_t x55 = (uint8_t)(x53 >> 8);
-  uint8_t x56 = (uint8_t)(x53 & UINT8_C(0xff));
-  uint8_t x57 = (uint8_t)(x55 & UINT8_C(0xff));
-  uint32_t x58 = (x1 >> 8);
-  uint8_t x59 = (uint8_t)(x1 & UINT8_C(0xff));
-  uint32_t x60 = (x58 >> 8);
-  uint8_t x61 = (uint8_t)(x58 & UINT8_C(0xff));
-  uint8_t x62 = (uint8_t)(x60 >> 8);
-  uint8_t x63 = (uint8_t)(x60 & UINT8_C(0xff));
-  out1[0] = x10;
-  out1[1] = x12;
-  out1[2] = x14;
-  out1[3] = x15;
-  out1[4] = x17;
-  out1[5] = x19;
-  out1[6] = x21;
-  out1[7] = x22;
-  out1[8] = x24;
-  out1[9] = x26;
-  out1[10] = x28;
-  out1[11] = x29;
-  out1[12] = x31;
-  out1[13] = x33;
-  out1[14] = x35;
-  out1[15] = x36;
-  out1[16] = x38;
-  out1[17] = x40;
-  out1[18] = x42;
-  out1[19] = x43;
-  out1[20] = x45;
-  out1[21] = x47;
-  out1[22] = x49;
-  out1[23] = x50;
-  out1[24] = x52;
-  out1[25] = x54;
-  out1[26] = x56;
-  out1[27] = x57;
-  out1[28] = x59;
-  out1[29] = x61;
-  out1[30] = x63;
-  out1[31] = x62;
+static FIAT_P256_FIAT_INLINE void fiat_p256_to_bytes(uint8_t out1[32], const uint32_t arg1[8]) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint32_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint8_t x9;
+  uint32_t x10;
+  uint8_t x11;
+  uint32_t x12;
+  uint8_t x13;
+  uint8_t x14;
+  uint8_t x15;
+  uint32_t x16;
+  uint8_t x17;
+  uint32_t x18;
+  uint8_t x19;
+  uint8_t x20;
+  uint8_t x21;
+  uint32_t x22;
+  uint8_t x23;
+  uint32_t x24;
+  uint8_t x25;
+  uint8_t x26;
+  uint8_t x27;
+  uint32_t x28;
+  uint8_t x29;
+  uint32_t x30;
+  uint8_t x31;
+  uint8_t x32;
+  uint8_t x33;
+  uint32_t x34;
+  uint8_t x35;
+  uint32_t x36;
+  uint8_t x37;
+  uint8_t x38;
+  uint8_t x39;
+  uint32_t x40;
+  uint8_t x41;
+  uint32_t x42;
+  uint8_t x43;
+  uint8_t x44;
+  uint8_t x45;
+  uint32_t x46;
+  uint8_t x47;
+  uint32_t x48;
+  uint8_t x49;
+  uint8_t x50;
+  uint8_t x51;
+  uint32_t x52;
+  uint8_t x53;
+  uint32_t x54;
+  uint8_t x55;
+  uint8_t x56;
+  x1 = (arg1[7]);
+  x2 = (arg1[6]);
+  x3 = (arg1[5]);
+  x4 = (arg1[4]);
+  x5 = (arg1[3]);
+  x6 = (arg1[2]);
+  x7 = (arg1[1]);
+  x8 = (arg1[0]);
+  x9 = (uint8_t)(x8 & UINT8_C(0xff));
+  x10 = (x8 >> 8);
+  x11 = (uint8_t)(x10 & UINT8_C(0xff));
+  x12 = (x10 >> 8);
+  x13 = (uint8_t)(x12 & UINT8_C(0xff));
+  x14 = (uint8_t)(x12 >> 8);
+  x15 = (uint8_t)(x7 & UINT8_C(0xff));
+  x16 = (x7 >> 8);
+  x17 = (uint8_t)(x16 & UINT8_C(0xff));
+  x18 = (x16 >> 8);
+  x19 = (uint8_t)(x18 & UINT8_C(0xff));
+  x20 = (uint8_t)(x18 >> 8);
+  x21 = (uint8_t)(x6 & UINT8_C(0xff));
+  x22 = (x6 >> 8);
+  x23 = (uint8_t)(x22 & UINT8_C(0xff));
+  x24 = (x22 >> 8);
+  x25 = (uint8_t)(x24 & UINT8_C(0xff));
+  x26 = (uint8_t)(x24 >> 8);
+  x27 = (uint8_t)(x5 & UINT8_C(0xff));
+  x28 = (x5 >> 8);
+  x29 = (uint8_t)(x28 & UINT8_C(0xff));
+  x30 = (x28 >> 8);
+  x31 = (uint8_t)(x30 & UINT8_C(0xff));
+  x32 = (uint8_t)(x30 >> 8);
+  x33 = (uint8_t)(x4 & UINT8_C(0xff));
+  x34 = (x4 >> 8);
+  x35 = (uint8_t)(x34 & UINT8_C(0xff));
+  x36 = (x34 >> 8);
+  x37 = (uint8_t)(x36 & UINT8_C(0xff));
+  x38 = (uint8_t)(x36 >> 8);
+  x39 = (uint8_t)(x3 & UINT8_C(0xff));
+  x40 = (x3 >> 8);
+  x41 = (uint8_t)(x40 & UINT8_C(0xff));
+  x42 = (x40 >> 8);
+  x43 = (uint8_t)(x42 & UINT8_C(0xff));
+  x44 = (uint8_t)(x42 >> 8);
+  x45 = (uint8_t)(x2 & UINT8_C(0xff));
+  x46 = (x2 >> 8);
+  x47 = (uint8_t)(x46 & UINT8_C(0xff));
+  x48 = (x46 >> 8);
+  x49 = (uint8_t)(x48 & UINT8_C(0xff));
+  x50 = (uint8_t)(x48 >> 8);
+  x51 = (uint8_t)(x1 & UINT8_C(0xff));
+  x52 = (x1 >> 8);
+  x53 = (uint8_t)(x52 & UINT8_C(0xff));
+  x54 = (x52 >> 8);
+  x55 = (uint8_t)(x54 & UINT8_C(0xff));
+  x56 = (uint8_t)(x54 >> 8);
+  out1[0] = x9;
+  out1[1] = x11;
+  out1[2] = x13;
+  out1[3] = x14;
+  out1[4] = x15;
+  out1[5] = x17;
+  out1[6] = x19;
+  out1[7] = x20;
+  out1[8] = x21;
+  out1[9] = x23;
+  out1[10] = x25;
+  out1[11] = x26;
+  out1[12] = x27;
+  out1[13] = x29;
+  out1[14] = x31;
+  out1[15] = x32;
+  out1[16] = x33;
+  out1[17] = x35;
+  out1[18] = x37;
+  out1[19] = x38;
+  out1[20] = x39;
+  out1[21] = x41;
+  out1[22] = x43;
+  out1[23] = x44;
+  out1[24] = x45;
+  out1[25] = x47;
+  out1[26] = x49;
+  out1[27] = x50;
+  out1[28] = x51;
+  out1[29] = x53;
+  out1[30] = x55;
+  out1[31] = x56;
 }
 
 /*
- * The function fiat_p256_from_bytes deserializes a field element in the Montgomery domain from bytes in little-endian order.
+ * The function fiat_p256_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order.
+ *
  * Preconditions:
  *   0 ≤ bytes_eval arg1 < m
  * Postconditions:
@@ -3087,61 +4117,644 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
  */
-static void fiat_p256_from_bytes(uint32_t out1[8], const uint8_t arg1[32]) {
-  uint32_t x1 = ((uint32_t)(arg1[31]) << 24);
-  uint32_t x2 = ((uint32_t)(arg1[30]) << 16);
-  uint32_t x3 = ((uint32_t)(arg1[29]) << 8);
-  uint8_t x4 = (arg1[28]);
-  uint32_t x5 = ((uint32_t)(arg1[27]) << 24);
-  uint32_t x6 = ((uint32_t)(arg1[26]) << 16);
-  uint32_t x7 = ((uint32_t)(arg1[25]) << 8);
-  uint8_t x8 = (arg1[24]);
-  uint32_t x9 = ((uint32_t)(arg1[23]) << 24);
-  uint32_t x10 = ((uint32_t)(arg1[22]) << 16);
-  uint32_t x11 = ((uint32_t)(arg1[21]) << 8);
-  uint8_t x12 = (arg1[20]);
-  uint32_t x13 = ((uint32_t)(arg1[19]) << 24);
-  uint32_t x14 = ((uint32_t)(arg1[18]) << 16);
-  uint32_t x15 = ((uint32_t)(arg1[17]) << 8);
-  uint8_t x16 = (arg1[16]);
-  uint32_t x17 = ((uint32_t)(arg1[15]) << 24);
-  uint32_t x18 = ((uint32_t)(arg1[14]) << 16);
-  uint32_t x19 = ((uint32_t)(arg1[13]) << 8);
-  uint8_t x20 = (arg1[12]);
-  uint32_t x21 = ((uint32_t)(arg1[11]) << 24);
-  uint32_t x22 = ((uint32_t)(arg1[10]) << 16);
-  uint32_t x23 = ((uint32_t)(arg1[9]) << 8);
-  uint8_t x24 = (arg1[8]);
-  uint32_t x25 = ((uint32_t)(arg1[7]) << 24);
-  uint32_t x26 = ((uint32_t)(arg1[6]) << 16);
-  uint32_t x27 = ((uint32_t)(arg1[5]) << 8);
-  uint8_t x28 = (arg1[4]);
-  uint32_t x29 = ((uint32_t)(arg1[3]) << 24);
-  uint32_t x30 = ((uint32_t)(arg1[2]) << 16);
-  uint32_t x31 = ((uint32_t)(arg1[1]) << 8);
-  uint8_t x32 = (arg1[0]);
-  uint32_t x33 = (x32 + (x31 + (x30 + x29)));
-  uint32_t x34 = (x33 & UINT32_C(0xffffffff));
-  uint32_t x35 = (x4 + (x3 + (x2 + x1)));
-  uint32_t x36 = (x8 + (x7 + (x6 + x5)));
-  uint32_t x37 = (x12 + (x11 + (x10 + x9)));
-  uint32_t x38 = (x16 + (x15 + (x14 + x13)));
-  uint32_t x39 = (x20 + (x19 + (x18 + x17)));
-  uint32_t x40 = (x24 + (x23 + (x22 + x21)));
-  uint32_t x41 = (x28 + (x27 + (x26 + x25)));
-  uint32_t x42 = (x41 & UINT32_C(0xffffffff));
-  uint32_t x43 = (x40 & UINT32_C(0xffffffff));
-  uint32_t x44 = (x39 & UINT32_C(0xffffffff));
-  uint32_t x45 = (x38 & UINT32_C(0xffffffff));
-  uint32_t x46 = (x37 & UINT32_C(0xffffffff));
-  uint32_t x47 = (x36 & UINT32_C(0xffffffff));
-  out1[0] = x34;
-  out1[1] = x42;
-  out1[2] = x43;
+static FIAT_P256_FIAT_INLINE void fiat_p256_from_bytes(uint32_t out1[8], const uint8_t arg1[32]) {
+  uint32_t x1;
+  uint32_t x2;
+  uint32_t x3;
+  uint8_t x4;
+  uint32_t x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint8_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint32_t x11;
+  uint8_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint8_t x16;
+  uint32_t x17;
+  uint32_t x18;
+  uint32_t x19;
+  uint8_t x20;
+  uint32_t x21;
+  uint32_t x22;
+  uint32_t x23;
+  uint8_t x24;
+  uint32_t x25;
+  uint32_t x26;
+  uint32_t x27;
+  uint8_t x28;
+  uint32_t x29;
+  uint32_t x30;
+  uint32_t x31;
+  uint8_t x32;
+  uint32_t x33;
+  uint32_t x34;
+  uint32_t x35;
+  uint32_t x36;
+  uint32_t x37;
+  uint32_t x38;
+  uint32_t x39;
+  uint32_t x40;
+  uint32_t x41;
+  uint32_t x42;
+  uint32_t x43;
+  uint32_t x44;
+  uint32_t x45;
+  uint32_t x46;
+  uint32_t x47;
+  uint32_t x48;
+  uint32_t x49;
+  uint32_t x50;
+  uint32_t x51;
+  uint32_t x52;
+  uint32_t x53;
+  uint32_t x54;
+  uint32_t x55;
+  uint32_t x56;
+  x1 = ((uint32_t)(arg1[31]) << 24);
+  x2 = ((uint32_t)(arg1[30]) << 16);
+  x3 = ((uint32_t)(arg1[29]) << 8);
+  x4 = (arg1[28]);
+  x5 = ((uint32_t)(arg1[27]) << 24);
+  x6 = ((uint32_t)(arg1[26]) << 16);
+  x7 = ((uint32_t)(arg1[25]) << 8);
+  x8 = (arg1[24]);
+  x9 = ((uint32_t)(arg1[23]) << 24);
+  x10 = ((uint32_t)(arg1[22]) << 16);
+  x11 = ((uint32_t)(arg1[21]) << 8);
+  x12 = (arg1[20]);
+  x13 = ((uint32_t)(arg1[19]) << 24);
+  x14 = ((uint32_t)(arg1[18]) << 16);
+  x15 = ((uint32_t)(arg1[17]) << 8);
+  x16 = (arg1[16]);
+  x17 = ((uint32_t)(arg1[15]) << 24);
+  x18 = ((uint32_t)(arg1[14]) << 16);
+  x19 = ((uint32_t)(arg1[13]) << 8);
+  x20 = (arg1[12]);
+  x21 = ((uint32_t)(arg1[11]) << 24);
+  x22 = ((uint32_t)(arg1[10]) << 16);
+  x23 = ((uint32_t)(arg1[9]) << 8);
+  x24 = (arg1[8]);
+  x25 = ((uint32_t)(arg1[7]) << 24);
+  x26 = ((uint32_t)(arg1[6]) << 16);
+  x27 = ((uint32_t)(arg1[5]) << 8);
+  x28 = (arg1[4]);
+  x29 = ((uint32_t)(arg1[3]) << 24);
+  x30 = ((uint32_t)(arg1[2]) << 16);
+  x31 = ((uint32_t)(arg1[1]) << 8);
+  x32 = (arg1[0]);
+  x33 = (x31 + (uint32_t)x32);
+  x34 = (x30 + x33);
+  x35 = (x29 + x34);
+  x36 = (x27 + (uint32_t)x28);
+  x37 = (x26 + x36);
+  x38 = (x25 + x37);
+  x39 = (x23 + (uint32_t)x24);
+  x40 = (x22 + x39);
+  x41 = (x21 + x40);
+  x42 = (x19 + (uint32_t)x20);
+  x43 = (x18 + x42);
+  x44 = (x17 + x43);
+  x45 = (x15 + (uint32_t)x16);
+  x46 = (x14 + x45);
+  x47 = (x13 + x46);
+  x48 = (x11 + (uint32_t)x12);
+  x49 = (x10 + x48);
+  x50 = (x9 + x49);
+  x51 = (x7 + (uint32_t)x8);
+  x52 = (x6 + x51);
+  x53 = (x5 + x52);
+  x54 = (x3 + (uint32_t)x4);
+  x55 = (x2 + x54);
+  x56 = (x1 + x55);
+  out1[0] = x35;
+  out1[1] = x38;
+  out1[2] = x41;
   out1[3] = x44;
-  out1[4] = x45;
-  out1[5] = x46;
-  out1[6] = x47;
-  out1[7] = x35;
+  out1[4] = x47;
+  out1[5] = x50;
+  out1[6] = x53;
+  out1[7] = x56;
 }
 
+/*
+ * The function fiat_p256_set_one returns the field element one in the Montgomery domain.
+ *
+ * Postconditions:
+ *   eval (from_montgomery out1) mod m = 1 mod m
+ *   0 ≤ eval out1 < m
+ *
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_set_one(fiat_p256_montgomery_domain_field_element out1) {
+  out1[0] = 0x1;
+  out1[1] = 0x0;
+  out1[2] = 0x0;
+  out1[3] = UINT32_C(0xffffffff);
+  out1[4] = UINT32_C(0xffffffff);
+  out1[5] = UINT32_C(0xffffffff);
+  out1[6] = UINT32_C(0xfffffffe);
+  out1[7] = 0x0;
+}
+
+/*
+ * The function fiat_p256_msat returns the saturated representation of the prime modulus.
+ *
+ * Postconditions:
+ *   twos_complement_eval out1 = m
+ *   0 ≤ eval out1 < m
+ *
+ * Output Bounds:
+ *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_msat(uint32_t out1[9]) {
+  out1[0] = UINT32_C(0xffffffff);
+  out1[1] = UINT32_C(0xffffffff);
+  out1[2] = UINT32_C(0xffffffff);
+  out1[3] = 0x0;
+  out1[4] = 0x0;
+  out1[5] = 0x0;
+  out1[6] = 0x1;
+  out1[7] = UINT32_C(0xffffffff);
+  out1[8] = 0x0;
+}
+
+/*
+ * The function fiat_p256_divstep computes a divstep.
+ *
+ * Preconditions:
+ *   0 ≤ eval arg4 < m
+ *   0 ≤ eval arg5 < m
+ * Postconditions:
+ *   out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1)
+ *   twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2)
+ *   twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋)
+ *   eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m)
+ *   eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m)
+ *   0 ≤ eval out5 < m
+ *   0 ≤ eval out5 < m
+ *   0 ≤ eval out2 < m
+ *   0 ≤ eval out3 < m
+ *
+ * Input Bounds:
+ *   arg1: [0x0 ~> 0xffffffff]
+ *   arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   arg3: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   arg4: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   arg5: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ * Output Bounds:
+ *   out1: [0x0 ~> 0xffffffff]
+ *   out2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   out3: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   out4: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ *   out5: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_divstep(uint32_t* out1, uint32_t out2[9], uint32_t out3[9], uint32_t out4[8], uint32_t out5[8], uint32_t arg1, const uint32_t arg2[9], const uint32_t arg3[9], const uint32_t arg4[8], const uint32_t arg5[8]) {
+  uint32_t x1;
+  fiat_p256_uint1 x2;
+  fiat_p256_uint1 x3;
+  uint32_t x4;
+  fiat_p256_uint1 x5;
+  uint32_t x6;
+  uint32_t x7;
+  uint32_t x8;
+  uint32_t x9;
+  uint32_t x10;
+  uint32_t x11;
+  uint32_t x12;
+  uint32_t x13;
+  uint32_t x14;
+  uint32_t x15;
+  uint32_t x16;
+  fiat_p256_uint1 x17;
+  uint32_t x18;
+  fiat_p256_uint1 x19;
+  uint32_t x20;
+  fiat_p256_uint1 x21;
+  uint32_t x22;
+  fiat_p256_uint1 x23;
+  uint32_t x24;
+  fiat_p256_uint1 x25;
+  uint32_t x26;
+  fiat_p256_uint1 x27;
+  uint32_t x28;
+  fiat_p256_uint1 x29;
+  uint32_t x30;
+  fiat_p256_uint1 x31;
+  uint32_t x32;
+  fiat_p256_uint1 x33;
+  uint32_t x34;
+  uint32_t x35;
+  uint32_t x36;
+  uint32_t x37;
+  uint32_t x38;
+  uint32_t x39;
+  uint32_t x40;
+  uint32_t x41;
+  uint32_t x42;
+  uint32_t x43;
+  uint32_t x44;
+  uint32_t x45;
+  uint32_t x46;
+  uint32_t x47;
+  uint32_t x48;
+  uint32_t x49;
+  uint32_t x50;
+  uint32_t x51;
+  fiat_p256_uint1 x52;
+  uint32_t x53;
+  fiat_p256_uint1 x54;
+  uint32_t x55;
+  fiat_p256_uint1 x56;
+  uint32_t x57;
+  fiat_p256_uint1 x58;
+  uint32_t x59;
+  fiat_p256_uint1 x60;
+  uint32_t x61;
+  fiat_p256_uint1 x62;
+  uint32_t x63;
+  fiat_p256_uint1 x64;
+  uint32_t x65;
+  fiat_p256_uint1 x66;
+  uint32_t x67;
+  fiat_p256_uint1 x68;
+  uint32_t x69;
+  fiat_p256_uint1 x70;
+  uint32_t x71;
+  fiat_p256_uint1 x72;
+  uint32_t x73;
+  fiat_p256_uint1 x74;
+  uint32_t x75;
+  fiat_p256_uint1 x76;
+  uint32_t x77;
+  fiat_p256_uint1 x78;
+  uint32_t x79;
+  fiat_p256_uint1 x80;
+  uint32_t x81;
+  fiat_p256_uint1 x82;
+  uint32_t x83;
+  fiat_p256_uint1 x84;
+  uint32_t x85;
+  uint32_t x86;
+  uint32_t x87;
+  uint32_t x88;
+  uint32_t x89;
+  uint32_t x90;
+  uint32_t x91;
+  uint32_t x92;
+  uint32_t x93;
+  fiat_p256_uint1 x94;
+  uint32_t x95;
+  fiat_p256_uint1 x96;
+  uint32_t x97;
+  fiat_p256_uint1 x98;
+  uint32_t x99;
+  fiat_p256_uint1 x100;
+  uint32_t x101;
+  fiat_p256_uint1 x102;
+  uint32_t x103;
+  fiat_p256_uint1 x104;
+  uint32_t x105;
+  fiat_p256_uint1 x106;
+  uint32_t x107;
+  fiat_p256_uint1 x108;
+  uint32_t x109;
+  uint32_t x110;
+  fiat_p256_uint1 x111;
+  uint32_t x112;
+  fiat_p256_uint1 x113;
+  uint32_t x114;
+  fiat_p256_uint1 x115;
+  uint32_t x116;
+  fiat_p256_uint1 x117;
+  uint32_t x118;
+  fiat_p256_uint1 x119;
+  uint32_t x120;
+  fiat_p256_uint1 x121;
+  uint32_t x122;
+  fiat_p256_uint1 x123;
+  uint32_t x124;
+  fiat_p256_uint1 x125;
+  uint32_t x126;
+  uint32_t x127;
+  uint32_t x128;
+  uint32_t x129;
+  uint32_t x130;
+  uint32_t x131;
+  uint32_t x132;
+  uint32_t x133;
+  fiat_p256_uint1 x134;
+  uint32_t x135;
+  uint32_t x136;
+  uint32_t x137;
+  uint32_t x138;
+  uint32_t x139;
+  uint32_t x140;
+  uint32_t x141;
+  uint32_t x142;
+  uint32_t x143;
+  uint32_t x144;
+  fiat_p256_uint1 x145;
+  uint32_t x146;
+  fiat_p256_uint1 x147;
+  uint32_t x148;
+  fiat_p256_uint1 x149;
+  uint32_t x150;
+  fiat_p256_uint1 x151;
+  uint32_t x152;
+  fiat_p256_uint1 x153;
+  uint32_t x154;
+  fiat_p256_uint1 x155;
+  uint32_t x156;
+  fiat_p256_uint1 x157;
+  uint32_t x158;
+  fiat_p256_uint1 x159;
+  uint32_t x160;
+  fiat_p256_uint1 x161;
+  uint32_t x162;
+  uint32_t x163;
+  uint32_t x164;
+  uint32_t x165;
+  uint32_t x166;
+  uint32_t x167;
+  uint32_t x168;
+  uint32_t x169;
+  uint32_t x170;
+  fiat_p256_uint1 x171;
+  uint32_t x172;
+  fiat_p256_uint1 x173;
+  uint32_t x174;
+  fiat_p256_uint1 x175;
+  uint32_t x176;
+  fiat_p256_uint1 x177;
+  uint32_t x178;
+  fiat_p256_uint1 x179;
+  uint32_t x180;
+  fiat_p256_uint1 x181;
+  uint32_t x182;
+  fiat_p256_uint1 x183;
+  uint32_t x184;
+  fiat_p256_uint1 x185;
+  uint32_t x186;
+  fiat_p256_uint1 x187;
+  uint32_t x188;
+  fiat_p256_uint1 x189;
+  uint32_t x190;
+  fiat_p256_uint1 x191;
+  uint32_t x192;
+  fiat_p256_uint1 x193;
+  uint32_t x194;
+  fiat_p256_uint1 x195;
+  uint32_t x196;
+  fiat_p256_uint1 x197;
+  uint32_t x198;
+  fiat_p256_uint1 x199;
+  uint32_t x200;
+  fiat_p256_uint1 x201;
+  uint32_t x202;
+  fiat_p256_uint1 x203;
+  uint32_t x204;
+  fiat_p256_uint1 x205;
+  uint32_t x206;
+  uint32_t x207;
+  uint32_t x208;
+  uint32_t x209;
+  uint32_t x210;
+  uint32_t x211;
+  uint32_t x212;
+  uint32_t x213;
+  uint32_t x214;
+  uint32_t x215;
+  uint32_t x216;
+  uint32_t x217;
+  uint32_t x218;
+  uint32_t x219;
+  uint32_t x220;
+  uint32_t x221;
+  uint32_t x222;
+  uint32_t x223;
+  uint32_t x224;
+  uint32_t x225;
+  uint32_t x226;
+  uint32_t x227;
+  uint32_t x228;
+  uint32_t x229;
+  uint32_t x230;
+  fiat_p256_addcarryx_u32(&x1, &x2, 0x0, (~arg1), 0x1);
+  x3 = (fiat_p256_uint1)((fiat_p256_uint1)(x1 >> 31) & (fiat_p256_uint1)((arg3[0]) & 0x1));
+  fiat_p256_addcarryx_u32(&x4, &x5, 0x0, (~arg1), 0x1);
+  fiat_p256_cmovznz_u32(&x6, x3, arg1, x4);
+  fiat_p256_cmovznz_u32(&x7, x3, (arg2[0]), (arg3[0]));
+  fiat_p256_cmovznz_u32(&x8, x3, (arg2[1]), (arg3[1]));
+  fiat_p256_cmovznz_u32(&x9, x3, (arg2[2]), (arg3[2]));
+  fiat_p256_cmovznz_u32(&x10, x3, (arg2[3]), (arg3[3]));
+  fiat_p256_cmovznz_u32(&x11, x3, (arg2[4]), (arg3[4]));
+  fiat_p256_cmovznz_u32(&x12, x3, (arg2[5]), (arg3[5]));
+  fiat_p256_cmovznz_u32(&x13, x3, (arg2[6]), (arg3[6]));
+  fiat_p256_cmovznz_u32(&x14, x3, (arg2[7]), (arg3[7]));
+  fiat_p256_cmovznz_u32(&x15, x3, (arg2[8]), (arg3[8]));
+  fiat_p256_addcarryx_u32(&x16, &x17, 0x0, 0x1, (~(arg2[0])));
+  fiat_p256_addcarryx_u32(&x18, &x19, x17, 0x0, (~(arg2[1])));
+  fiat_p256_addcarryx_u32(&x20, &x21, x19, 0x0, (~(arg2[2])));
+  fiat_p256_addcarryx_u32(&x22, &x23, x21, 0x0, (~(arg2[3])));
+  fiat_p256_addcarryx_u32(&x24, &x25, x23, 0x0, (~(arg2[4])));
+  fiat_p256_addcarryx_u32(&x26, &x27, x25, 0x0, (~(arg2[5])));
+  fiat_p256_addcarryx_u32(&x28, &x29, x27, 0x0, (~(arg2[6])));
+  fiat_p256_addcarryx_u32(&x30, &x31, x29, 0x0, (~(arg2[7])));
+  fiat_p256_addcarryx_u32(&x32, &x33, x31, 0x0, (~(arg2[8])));
+  fiat_p256_cmovznz_u32(&x34, x3, (arg3[0]), x16);
+  fiat_p256_cmovznz_u32(&x35, x3, (arg3[1]), x18);
+  fiat_p256_cmovznz_u32(&x36, x3, (arg3[2]), x20);
+  fiat_p256_cmovznz_u32(&x37, x3, (arg3[3]), x22);
+  fiat_p256_cmovznz_u32(&x38, x3, (arg3[4]), x24);
+  fiat_p256_cmovznz_u32(&x39, x3, (arg3[5]), x26);
+  fiat_p256_cmovznz_u32(&x40, x3, (arg3[6]), x28);
+  fiat_p256_cmovznz_u32(&x41, x3, (arg3[7]), x30);
+  fiat_p256_cmovznz_u32(&x42, x3, (arg3[8]), x32);
+  fiat_p256_cmovznz_u32(&x43, x3, (arg4[0]), (arg5[0]));
+  fiat_p256_cmovznz_u32(&x44, x3, (arg4[1]), (arg5[1]));
+  fiat_p256_cmovznz_u32(&x45, x3, (arg4[2]), (arg5[2]));
+  fiat_p256_cmovznz_u32(&x46, x3, (arg4[3]), (arg5[3]));
+  fiat_p256_cmovznz_u32(&x47, x3, (arg4[4]), (arg5[4]));
+  fiat_p256_cmovznz_u32(&x48, x3, (arg4[5]), (arg5[5]));
+  fiat_p256_cmovznz_u32(&x49, x3, (arg4[6]), (arg5[6]));
+  fiat_p256_cmovznz_u32(&x50, x3, (arg4[7]), (arg5[7]));
+  fiat_p256_addcarryx_u32(&x51, &x52, 0x0, x43, x43);
+  fiat_p256_addcarryx_u32(&x53, &x54, x52, x44, x44);
+  fiat_p256_addcarryx_u32(&x55, &x56, x54, x45, x45);
+  fiat_p256_addcarryx_u32(&x57, &x58, x56, x46, x46);
+  fiat_p256_addcarryx_u32(&x59, &x60, x58, x47, x47);
+  fiat_p256_addcarryx_u32(&x61, &x62, x60, x48, x48);
+  fiat_p256_addcarryx_u32(&x63, &x64, x62, x49, x49);
+  fiat_p256_addcarryx_u32(&x65, &x66, x64, x50, x50);
+  fiat_p256_subborrowx_u32(&x67, &x68, 0x0, x51, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x69, &x70, x68, x53, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x71, &x72, x70, x55, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x73, &x74, x72, x57, 0x0);
+  fiat_p256_subborrowx_u32(&x75, &x76, x74, x59, 0x0);
+  fiat_p256_subborrowx_u32(&x77, &x78, x76, x61, 0x0);
+  fiat_p256_subborrowx_u32(&x79, &x80, x78, x63, 0x1);
+  fiat_p256_subborrowx_u32(&x81, &x82, x80, x65, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x83, &x84, x82, x66, 0x0);
+  x85 = (arg4[7]);
+  x86 = (arg4[6]);
+  x87 = (arg4[5]);
+  x88 = (arg4[4]);
+  x89 = (arg4[3]);
+  x90 = (arg4[2]);
+  x91 = (arg4[1]);
+  x92 = (arg4[0]);
+  fiat_p256_subborrowx_u32(&x93, &x94, 0x0, 0x0, x92);
+  fiat_p256_subborrowx_u32(&x95, &x96, x94, 0x0, x91);
+  fiat_p256_subborrowx_u32(&x97, &x98, x96, 0x0, x90);
+  fiat_p256_subborrowx_u32(&x99, &x100, x98, 0x0, x89);
+  fiat_p256_subborrowx_u32(&x101, &x102, x100, 0x0, x88);
+  fiat_p256_subborrowx_u32(&x103, &x104, x102, 0x0, x87);
+  fiat_p256_subborrowx_u32(&x105, &x106, x104, 0x0, x86);
+  fiat_p256_subborrowx_u32(&x107, &x108, x106, 0x0, x85);
+  fiat_p256_cmovznz_u32(&x109, x108, 0x0, UINT32_C(0xffffffff));
+  fiat_p256_addcarryx_u32(&x110, &x111, 0x0, x93, x109);
+  fiat_p256_addcarryx_u32(&x112, &x113, x111, x95, x109);
+  fiat_p256_addcarryx_u32(&x114, &x115, x113, x97, x109);
+  fiat_p256_addcarryx_u32(&x116, &x117, x115, x99, 0x0);
+  fiat_p256_addcarryx_u32(&x118, &x119, x117, x101, 0x0);
+  fiat_p256_addcarryx_u32(&x120, &x121, x119, x103, 0x0);
+  fiat_p256_addcarryx_u32(&x122, &x123, x121, x105, (fiat_p256_uint1)(x109 & 0x1));
+  fiat_p256_addcarryx_u32(&x124, &x125, x123, x107, x109);
+  fiat_p256_cmovznz_u32(&x126, x3, (arg5[0]), x110);
+  fiat_p256_cmovznz_u32(&x127, x3, (arg5[1]), x112);
+  fiat_p256_cmovznz_u32(&x128, x3, (arg5[2]), x114);
+  fiat_p256_cmovznz_u32(&x129, x3, (arg5[3]), x116);
+  fiat_p256_cmovznz_u32(&x130, x3, (arg5[4]), x118);
+  fiat_p256_cmovznz_u32(&x131, x3, (arg5[5]), x120);
+  fiat_p256_cmovznz_u32(&x132, x3, (arg5[6]), x122);
+  fiat_p256_cmovznz_u32(&x133, x3, (arg5[7]), x124);
+  x134 = (fiat_p256_uint1)(x34 & 0x1);
+  fiat_p256_cmovznz_u32(&x135, x134, 0x0, x7);
+  fiat_p256_cmovznz_u32(&x136, x134, 0x0, x8);
+  fiat_p256_cmovznz_u32(&x137, x134, 0x0, x9);
+  fiat_p256_cmovznz_u32(&x138, x134, 0x0, x10);
+  fiat_p256_cmovznz_u32(&x139, x134, 0x0, x11);
+  fiat_p256_cmovznz_u32(&x140, x134, 0x0, x12);
+  fiat_p256_cmovznz_u32(&x141, x134, 0x0, x13);
+  fiat_p256_cmovznz_u32(&x142, x134, 0x0, x14);
+  fiat_p256_cmovznz_u32(&x143, x134, 0x0, x15);
+  fiat_p256_addcarryx_u32(&x144, &x145, 0x0, x34, x135);
+  fiat_p256_addcarryx_u32(&x146, &x147, x145, x35, x136);
+  fiat_p256_addcarryx_u32(&x148, &x149, x147, x36, x137);
+  fiat_p256_addcarryx_u32(&x150, &x151, x149, x37, x138);
+  fiat_p256_addcarryx_u32(&x152, &x153, x151, x38, x139);
+  fiat_p256_addcarryx_u32(&x154, &x155, x153, x39, x140);
+  fiat_p256_addcarryx_u32(&x156, &x157, x155, x40, x141);
+  fiat_p256_addcarryx_u32(&x158, &x159, x157, x41, x142);
+  fiat_p256_addcarryx_u32(&x160, &x161, x159, x42, x143);
+  fiat_p256_cmovznz_u32(&x162, x134, 0x0, x43);
+  fiat_p256_cmovznz_u32(&x163, x134, 0x0, x44);
+  fiat_p256_cmovznz_u32(&x164, x134, 0x0, x45);
+  fiat_p256_cmovznz_u32(&x165, x134, 0x0, x46);
+  fiat_p256_cmovznz_u32(&x166, x134, 0x0, x47);
+  fiat_p256_cmovznz_u32(&x167, x134, 0x0, x48);
+  fiat_p256_cmovznz_u32(&x168, x134, 0x0, x49);
+  fiat_p256_cmovznz_u32(&x169, x134, 0x0, x50);
+  fiat_p256_addcarryx_u32(&x170, &x171, 0x0, x126, x162);
+  fiat_p256_addcarryx_u32(&x172, &x173, x171, x127, x163);
+  fiat_p256_addcarryx_u32(&x174, &x175, x173, x128, x164);
+  fiat_p256_addcarryx_u32(&x176, &x177, x175, x129, x165);
+  fiat_p256_addcarryx_u32(&x178, &x179, x177, x130, x166);
+  fiat_p256_addcarryx_u32(&x180, &x181, x179, x131, x167);
+  fiat_p256_addcarryx_u32(&x182, &x183, x181, x132, x168);
+  fiat_p256_addcarryx_u32(&x184, &x185, x183, x133, x169);
+  fiat_p256_subborrowx_u32(&x186, &x187, 0x0, x170, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x188, &x189, x187, x172, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x190, &x191, x189, x174, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x192, &x193, x191, x176, 0x0);
+  fiat_p256_subborrowx_u32(&x194, &x195, x193, x178, 0x0);
+  fiat_p256_subborrowx_u32(&x196, &x197, x195, x180, 0x0);
+  fiat_p256_subborrowx_u32(&x198, &x199, x197, x182, 0x1);
+  fiat_p256_subborrowx_u32(&x200, &x201, x199, x184, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u32(&x202, &x203, x201, x185, 0x0);
+  fiat_p256_addcarryx_u32(&x204, &x205, 0x0, x6, 0x1);
+  x206 = ((x144 >> 1) | ((x146 << 31) & UINT32_C(0xffffffff)));
+  x207 = ((x146 >> 1) | ((x148 << 31) & UINT32_C(0xffffffff)));
+  x208 = ((x148 >> 1) | ((x150 << 31) & UINT32_C(0xffffffff)));
+  x209 = ((x150 >> 1) | ((x152 << 31) & UINT32_C(0xffffffff)));
+  x210 = ((x152 >> 1) | ((x154 << 31) & UINT32_C(0xffffffff)));
+  x211 = ((x154 >> 1) | ((x156 << 31) & UINT32_C(0xffffffff)));
+  x212 = ((x156 >> 1) | ((x158 << 31) & UINT32_C(0xffffffff)));
+  x213 = ((x158 >> 1) | ((x160 << 31) & UINT32_C(0xffffffff)));
+  x214 = ((x160 & UINT32_C(0x80000000)) | (x160 >> 1));
+  fiat_p256_cmovznz_u32(&x215, x84, x67, x51);
+  fiat_p256_cmovznz_u32(&x216, x84, x69, x53);
+  fiat_p256_cmovznz_u32(&x217, x84, x71, x55);
+  fiat_p256_cmovznz_u32(&x218, x84, x73, x57);
+  fiat_p256_cmovznz_u32(&x219, x84, x75, x59);
+  fiat_p256_cmovznz_u32(&x220, x84, x77, x61);
+  fiat_p256_cmovznz_u32(&x221, x84, x79, x63);
+  fiat_p256_cmovznz_u32(&x222, x84, x81, x65);
+  fiat_p256_cmovznz_u32(&x223, x203, x186, x170);
+  fiat_p256_cmovznz_u32(&x224, x203, x188, x172);
+  fiat_p256_cmovznz_u32(&x225, x203, x190, x174);
+  fiat_p256_cmovznz_u32(&x226, x203, x192, x176);
+  fiat_p256_cmovznz_u32(&x227, x203, x194, x178);
+  fiat_p256_cmovznz_u32(&x228, x203, x196, x180);
+  fiat_p256_cmovznz_u32(&x229, x203, x198, x182);
+  fiat_p256_cmovznz_u32(&x230, x203, x200, x184);
+  *out1 = x204;
+  out2[0] = x7;
+  out2[1] = x8;
+  out2[2] = x9;
+  out2[3] = x10;
+  out2[4] = x11;
+  out2[5] = x12;
+  out2[6] = x13;
+  out2[7] = x14;
+  out2[8] = x15;
+  out3[0] = x206;
+  out3[1] = x207;
+  out3[2] = x208;
+  out3[3] = x209;
+  out3[4] = x210;
+  out3[5] = x211;
+  out3[6] = x212;
+  out3[7] = x213;
+  out3[8] = x214;
+  out4[0] = x215;
+  out4[1] = x216;
+  out4[2] = x217;
+  out4[3] = x218;
+  out4[4] = x219;
+  out4[5] = x220;
+  out4[6] = x221;
+  out4[7] = x222;
+  out5[0] = x223;
+  out5[1] = x224;
+  out5[2] = x225;
+  out5[3] = x226;
+  out5[4] = x227;
+  out5[5] = x228;
+  out5[6] = x229;
+  out5[7] = x230;
+}
+
+/*
+ * The function fiat_p256_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form).
+ *
+ * Postconditions:
+ *   eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋)
+ *   0 ≤ eval out1 < m
+ *
+ * Output Bounds:
+ *   out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_divstep_precomp(uint32_t out1[8]) {
+  out1[0] = UINT32_C(0xb8000000);
+  out1[1] = UINT32_C(0x67ffffff);
+  out1[2] = UINT32_C(0x38000000);
+  out1[3] = UINT32_C(0xc0000000);
+  out1[4] = UINT32_C(0x7fffffff);
+  out1[5] = UINT32_C(0xd8000000);
+  out1[6] = UINT32_C(0xffffffff);
+  out1[7] = UINT32_C(0x2fffffff);
+}
diff --git a/src/third_party/fiat/p256_64.h b/src/third_party/fiat/p256_64.h
index 773266a..c772638 100644
--- a/src/third_party/fiat/p256_64.h
+++ b/src/third_party/fiat/p256_64.h
@@ -1,8 +1,8 @@
-/* Autogenerated: src/ExtractionOCaml/word_by_word_montgomery --static p256 '2^256 - 2^224 + 2^192 + 2^96 - 1' 64 mul square add sub opp from_montgomery nonzero selectznz to_bytes from_bytes */
+/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --inline --static --use-value-barrier p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp */
 /* curve description: p256 */
-/* requested operations: mul, square, add, sub, opp, from_montgomery, nonzero, selectznz, to_bytes, from_bytes */
-/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
 /* machine_wordsize = 64 (from "64") */
+/* requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp */
+/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
 /*                                                                    */
 /* NOTE: In addition to the bounds specified above each function, all */
 /*   functions synthesized for this Montgomery arithmetic require the */
@@ -10,20 +10,52 @@
 /*   require the input to be in the unique saturated representation.  */
 /*   All functions also ensure that these two properties are true of  */
 /*   return values.                                                   */
+/*  */
+/* Computed values: */
+/*   eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */
+/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
+/*   twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */
+/*                            if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */
 
 #include <stdint.h>
 typedef unsigned char fiat_p256_uint1;
 typedef signed char fiat_p256_int1;
-typedef signed __int128 fiat_p256_int128;
-typedef unsigned __int128 fiat_p256_uint128;
+#if defined(__GNUC__) || defined(__clang__)
+#  define FIAT_P256_FIAT_EXTENSION __extension__
+#  define FIAT_P256_FIAT_INLINE __inline__
+#else
+#  define FIAT_P256_FIAT_EXTENSION
+#  define FIAT_P256_FIAT_INLINE
+#endif
+
+FIAT_P256_FIAT_EXTENSION typedef signed __int128 fiat_p256_int128;
+FIAT_P256_FIAT_EXTENSION typedef unsigned __int128 fiat_p256_uint128;
+
+/* The type fiat_p256_montgomery_domain_field_element is a field element in the Montgomery domain. */
+/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */
+typedef uint64_t fiat_p256_montgomery_domain_field_element[4];
+
+/* The type fiat_p256_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */
+/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */
+typedef uint64_t fiat_p256_non_montgomery_domain_field_element[4];
 
 #if (-1 & 3) != 3
 #error "This code only works on a two's complement system"
 #endif
 
+#if !defined(FIAT_P256_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
+static __inline__ uint64_t fiat_p256_value_barrier_u64(uint64_t a) {
+  __asm__("" : "+r"(a) : /* no inputs */);
+  return a;
+}
+#else
+#  define fiat_p256_value_barrier_u64(x) (x)
+#endif
+
 
 /*
  * The function fiat_p256_addcarryx_u64 is an addition with carry.
+ *
  * Postconditions:
  *   out1 = (arg1 + arg2 + arg3) mod 2^64
  *   out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋
@@ -36,16 +68,20 @@
  *   out1: [0x0 ~> 0xffffffffffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_p256_addcarryx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  fiat_p256_uint128 x1 = ((arg1 + (fiat_p256_uint128)arg2) + arg3);
-  uint64_t x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
-  fiat_p256_uint1 x3 = (fiat_p256_uint1)(x1 >> 64);
+static FIAT_P256_FIAT_INLINE void fiat_p256_addcarryx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  fiat_p256_uint128 x1;
+  uint64_t x2;
+  fiat_p256_uint1 x3;
+  x1 = ((arg1 + (fiat_p256_uint128)arg2) + arg3);
+  x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
+  x3 = (fiat_p256_uint1)(x1 >> 64);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_p256_subborrowx_u64 is a subtraction with borrow.
+ *
  * Postconditions:
  *   out1 = (-arg1 + arg2 + -arg3) mod 2^64
  *   out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋
@@ -58,16 +94,20 @@
  *   out1: [0x0 ~> 0xffffffffffffffff]
  *   out2: [0x0 ~> 0x1]
  */
-static void fiat_p256_subborrowx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  fiat_p256_int128 x1 = ((arg2 - (fiat_p256_int128)arg1) - arg3);
-  fiat_p256_int1 x2 = (fiat_p256_int1)(x1 >> 64);
-  uint64_t x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
+static FIAT_P256_FIAT_INLINE void fiat_p256_subborrowx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  fiat_p256_int128 x1;
+  fiat_p256_int1 x2;
+  uint64_t x3;
+  x1 = ((arg2 - (fiat_p256_int128)arg1) - arg3);
+  x2 = (fiat_p256_int1)(x1 >> 64);
+  x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
   *out1 = x3;
   *out2 = (fiat_p256_uint1)(0x0 - x2);
 }
 
 /*
  * The function fiat_p256_mulx_u64 is a multiplication, returning the full double-width result.
+ *
  * Postconditions:
  *   out1 = (arg1 * arg2) mod 2^64
  *   out2 = ⌊arg1 * arg2 / 2^64⌋
@@ -79,16 +119,20 @@
  *   out1: [0x0 ~> 0xffffffffffffffff]
  *   out2: [0x0 ~> 0xffffffffffffffff]
  */
-static void fiat_p256_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) {
-  fiat_p256_uint128 x1 = ((fiat_p256_uint128)arg1 * arg2);
-  uint64_t x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
-  uint64_t x3 = (uint64_t)(x1 >> 64);
+static FIAT_P256_FIAT_INLINE void fiat_p256_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) {
+  fiat_p256_uint128 x1;
+  uint64_t x2;
+  uint64_t x3;
+  x1 = ((fiat_p256_uint128)arg1 * arg2);
+  x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
+  x3 = (uint64_t)(x1 >> 64);
   *out1 = x2;
   *out2 = x3;
 }
 
 /*
  * The function fiat_p256_cmovznz_u64 is a single-word conditional move.
+ *
  * Postconditions:
  *   out1 = (if arg1 = 0 then arg2 else arg3)
  *
@@ -99,21 +143,19 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffffffffffff]
  */
-static void fiat_p256_cmovznz_u64(uint64_t* out1, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
-  fiat_p256_uint1 x1 = (!(!arg1));
-  uint64_t x2 = ((fiat_p256_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff));
-  // Note this line has been patched from the synthesized code to add value
-  // barriers.
-  //
-  // Clang recognizes this pattern as a select. While it usually transforms it
-  // to a cmov, it sometimes further transforms it into a branch, which we do
-  // not want.
-  uint64_t x3 = ((value_barrier_u64(x2) & arg3) | (value_barrier_u64(~x2) & arg2));
+static FIAT_P256_FIAT_INLINE void fiat_p256_cmovznz_u64(uint64_t* out1, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
+  fiat_p256_uint1 x1;
+  uint64_t x2;
+  uint64_t x3;
+  x1 = (!(!arg1));
+  x2 = ((fiat_p256_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff));
+  x3 = ((fiat_p256_value_barrier_u64(x2) & arg3) | (fiat_p256_value_barrier_u64((~x2)) & arg2));
   *out1 = x3;
 }
 
 /*
  * The function fiat_p256_mul multiplies two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -121,287 +163,297 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- *   arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_mul(uint64_t out1[4], const uint64_t arg1[4], const uint64_t arg2[4]) {
-  uint64_t x1 = (arg1[1]);
-  uint64_t x2 = (arg1[2]);
-  uint64_t x3 = (arg1[3]);
-  uint64_t x4 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_mul(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
   uint64_t x5;
   uint64_t x6;
-  fiat_p256_mulx_u64(&x5, &x6, x4, (arg2[3]));
   uint64_t x7;
   uint64_t x8;
-  fiat_p256_mulx_u64(&x7, &x8, x4, (arg2[2]));
   uint64_t x9;
   uint64_t x10;
-  fiat_p256_mulx_u64(&x9, &x10, x4, (arg2[1]));
   uint64_t x11;
   uint64_t x12;
-  fiat_p256_mulx_u64(&x11, &x12, x4, (arg2[0]));
   uint64_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
   uint64_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
   uint64_t x17;
   fiat_p256_uint1 x18;
-  fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
-  uint64_t x19 = (x18 + x6);
+  uint64_t x19;
   uint64_t x20;
   uint64_t x21;
-  fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
   uint64_t x22;
   uint64_t x23;
-  fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
   uint64_t x24;
   uint64_t x25;
-  fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
   uint64_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
-  uint64_t x28 = (x27 + x23);
+  uint64_t x28;
   uint64_t x29;
   fiat_p256_uint1 x30;
-  fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
   uint64_t x31;
   fiat_p256_uint1 x32;
-  fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
   uint64_t x33;
   fiat_p256_uint1 x34;
-  fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
   uint64_t x35;
   fiat_p256_uint1 x36;
-  fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
   uint64_t x37;
   fiat_p256_uint1 x38;
-  fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
   uint64_t x39;
   uint64_t x40;
-  fiat_p256_mulx_u64(&x39, &x40, x1, (arg2[3]));
   uint64_t x41;
   uint64_t x42;
-  fiat_p256_mulx_u64(&x41, &x42, x1, (arg2[2]));
   uint64_t x43;
   uint64_t x44;
-  fiat_p256_mulx_u64(&x43, &x44, x1, (arg2[1]));
   uint64_t x45;
   uint64_t x46;
-  fiat_p256_mulx_u64(&x45, &x46, x1, (arg2[0]));
   uint64_t x47;
   fiat_p256_uint1 x48;
-  fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
   uint64_t x49;
   fiat_p256_uint1 x50;
-  fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
   uint64_t x51;
   fiat_p256_uint1 x52;
-  fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
-  uint64_t x53 = (x52 + x40);
+  uint64_t x53;
   uint64_t x54;
   fiat_p256_uint1 x55;
-  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
   uint64_t x56;
   fiat_p256_uint1 x57;
-  fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
   uint64_t x58;
   fiat_p256_uint1 x59;
-  fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
   uint64_t x60;
   fiat_p256_uint1 x61;
-  fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
   uint64_t x62;
   fiat_p256_uint1 x63;
-  fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
   uint64_t x64;
   uint64_t x65;
-  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
   uint64_t x66;
   uint64_t x67;
-  fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
   uint64_t x68;
   uint64_t x69;
-  fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
   uint64_t x70;
   fiat_p256_uint1 x71;
-  fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
-  uint64_t x72 = (x71 + x67);
+  uint64_t x72;
   uint64_t x73;
   fiat_p256_uint1 x74;
-  fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
   uint64_t x75;
   fiat_p256_uint1 x76;
-  fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
   uint64_t x77;
   fiat_p256_uint1 x78;
-  fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
   uint64_t x79;
   fiat_p256_uint1 x80;
-  fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
   uint64_t x81;
   fiat_p256_uint1 x82;
-  fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
-  uint64_t x83 = ((uint64_t)x82 + x63);
+  uint64_t x83;
   uint64_t x84;
   uint64_t x85;
-  fiat_p256_mulx_u64(&x84, &x85, x2, (arg2[3]));
   uint64_t x86;
   uint64_t x87;
-  fiat_p256_mulx_u64(&x86, &x87, x2, (arg2[2]));
   uint64_t x88;
   uint64_t x89;
-  fiat_p256_mulx_u64(&x88, &x89, x2, (arg2[1]));
   uint64_t x90;
   uint64_t x91;
-  fiat_p256_mulx_u64(&x90, &x91, x2, (arg2[0]));
   uint64_t x92;
   fiat_p256_uint1 x93;
-  fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
   uint64_t x94;
   fiat_p256_uint1 x95;
-  fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
   uint64_t x96;
   fiat_p256_uint1 x97;
-  fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
-  uint64_t x98 = (x97 + x85);
+  uint64_t x98;
   uint64_t x99;
   fiat_p256_uint1 x100;
-  fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
   uint64_t x101;
   fiat_p256_uint1 x102;
-  fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
   uint64_t x103;
   fiat_p256_uint1 x104;
-  fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
   uint64_t x105;
   fiat_p256_uint1 x106;
-  fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
   uint64_t x107;
   fiat_p256_uint1 x108;
-  fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
   uint64_t x109;
   uint64_t x110;
-  fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
   uint64_t x111;
   uint64_t x112;
-  fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
   uint64_t x113;
   uint64_t x114;
-  fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
   uint64_t x115;
   fiat_p256_uint1 x116;
-  fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
-  uint64_t x117 = (x116 + x112);
+  uint64_t x117;
   uint64_t x118;
   fiat_p256_uint1 x119;
-  fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
   uint64_t x120;
   fiat_p256_uint1 x121;
-  fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
   uint64_t x122;
   fiat_p256_uint1 x123;
-  fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
   uint64_t x124;
   fiat_p256_uint1 x125;
-  fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
   uint64_t x126;
   fiat_p256_uint1 x127;
-  fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
-  uint64_t x128 = ((uint64_t)x127 + x108);
+  uint64_t x128;
   uint64_t x129;
   uint64_t x130;
-  fiat_p256_mulx_u64(&x129, &x130, x3, (arg2[3]));
   uint64_t x131;
   uint64_t x132;
-  fiat_p256_mulx_u64(&x131, &x132, x3, (arg2[2]));
   uint64_t x133;
   uint64_t x134;
-  fiat_p256_mulx_u64(&x133, &x134, x3, (arg2[1]));
   uint64_t x135;
   uint64_t x136;
-  fiat_p256_mulx_u64(&x135, &x136, x3, (arg2[0]));
   uint64_t x137;
   fiat_p256_uint1 x138;
-  fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
   uint64_t x139;
   fiat_p256_uint1 x140;
-  fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
   uint64_t x141;
   fiat_p256_uint1 x142;
-  fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
-  uint64_t x143 = (x142 + x130);
+  uint64_t x143;
   uint64_t x144;
   fiat_p256_uint1 x145;
-  fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
   uint64_t x146;
   fiat_p256_uint1 x147;
-  fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
   uint64_t x148;
   fiat_p256_uint1 x149;
-  fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
   uint64_t x150;
   fiat_p256_uint1 x151;
-  fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
   uint64_t x152;
   fiat_p256_uint1 x153;
-  fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
   uint64_t x154;
   uint64_t x155;
-  fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
   uint64_t x156;
   uint64_t x157;
-  fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
   uint64_t x158;
   uint64_t x159;
-  fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
   uint64_t x160;
   fiat_p256_uint1 x161;
-  fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
-  uint64_t x162 = (x161 + x157);
+  uint64_t x162;
   uint64_t x163;
   fiat_p256_uint1 x164;
-  fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
   uint64_t x165;
   fiat_p256_uint1 x166;
-  fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
   uint64_t x167;
   fiat_p256_uint1 x168;
-  fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
   uint64_t x169;
   fiat_p256_uint1 x170;
-  fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
   uint64_t x171;
   fiat_p256_uint1 x172;
-  fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
-  uint64_t x173 = ((uint64_t)x172 + x153);
+  uint64_t x173;
   uint64_t x174;
   fiat_p256_uint1 x175;
-  fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
   uint64_t x176;
   fiat_p256_uint1 x177;
-  fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
   uint64_t x178;
   fiat_p256_uint1 x179;
-  fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
   uint64_t x180;
   fiat_p256_uint1 x181;
-  fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
   uint64_t x182;
   fiat_p256_uint1 x183;
-  fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
   uint64_t x184;
-  fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
   uint64_t x185;
-  fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
   uint64_t x186;
-  fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
   uint64_t x187;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[0]);
+  fiat_p256_mulx_u64(&x5, &x6, x4, (arg2[3]));
+  fiat_p256_mulx_u64(&x7, &x8, x4, (arg2[2]));
+  fiat_p256_mulx_u64(&x9, &x10, x4, (arg2[1]));
+  fiat_p256_mulx_u64(&x11, &x12, x4, (arg2[0]));
+  fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
+  fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
+  fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
+  x19 = (x18 + x6);
+  fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
+  x28 = (x27 + x23);
+  fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
+  fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
+  fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
+  fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
+  fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
+  fiat_p256_mulx_u64(&x39, &x40, x1, (arg2[3]));
+  fiat_p256_mulx_u64(&x41, &x42, x1, (arg2[2]));
+  fiat_p256_mulx_u64(&x43, &x44, x1, (arg2[1]));
+  fiat_p256_mulx_u64(&x45, &x46, x1, (arg2[0]));
+  fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
+  fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
+  fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
+  x53 = (x52 + x40);
+  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
+  fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
+  fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
+  fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
+  fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
+  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
+  x72 = (x71 + x67);
+  fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
+  fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
+  fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
+  fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
+  fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
+  x83 = ((uint64_t)x82 + x63);
+  fiat_p256_mulx_u64(&x84, &x85, x2, (arg2[3]));
+  fiat_p256_mulx_u64(&x86, &x87, x2, (arg2[2]));
+  fiat_p256_mulx_u64(&x88, &x89, x2, (arg2[1]));
+  fiat_p256_mulx_u64(&x90, &x91, x2, (arg2[0]));
+  fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
+  fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
+  fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
+  x98 = (x97 + x85);
+  fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
+  fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
+  fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
+  fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
+  fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
+  fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
+  x117 = (x116 + x112);
+  fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
+  fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
+  fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
+  fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
+  fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
+  x128 = ((uint64_t)x127 + x108);
+  fiat_p256_mulx_u64(&x129, &x130, x3, (arg2[3]));
+  fiat_p256_mulx_u64(&x131, &x132, x3, (arg2[2]));
+  fiat_p256_mulx_u64(&x133, &x134, x3, (arg2[1]));
+  fiat_p256_mulx_u64(&x135, &x136, x3, (arg2[0]));
+  fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
+  fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
+  fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
+  x143 = (x142 + x130);
+  fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
+  fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
+  fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
+  fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
+  fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
+  fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
+  x162 = (x161 + x157);
+  fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
+  fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
+  fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
+  fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
+  fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
+  x173 = ((uint64_t)x172 + x153);
+  fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
+  fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
+  fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
+  fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
+  fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
   fiat_p256_cmovznz_u64(&x187, x183, x180, x171);
   out1[0] = x184;
   out1[1] = x185;
@@ -411,292 +463,304 @@
 
 /*
  * The function fiat_p256_square squares a field element in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_square(uint64_t out1[4], const uint64_t arg1[4]) {
-  uint64_t x1 = (arg1[1]);
-  uint64_t x2 = (arg1[2]);
-  uint64_t x3 = (arg1[3]);
-  uint64_t x4 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_square(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
   uint64_t x5;
   uint64_t x6;
-  fiat_p256_mulx_u64(&x5, &x6, x4, (arg1[3]));
   uint64_t x7;
   uint64_t x8;
-  fiat_p256_mulx_u64(&x7, &x8, x4, (arg1[2]));
   uint64_t x9;
   uint64_t x10;
-  fiat_p256_mulx_u64(&x9, &x10, x4, (arg1[1]));
   uint64_t x11;
   uint64_t x12;
-  fiat_p256_mulx_u64(&x11, &x12, x4, (arg1[0]));
   uint64_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
   uint64_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
   uint64_t x17;
   fiat_p256_uint1 x18;
-  fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
-  uint64_t x19 = (x18 + x6);
+  uint64_t x19;
   uint64_t x20;
   uint64_t x21;
-  fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
   uint64_t x22;
   uint64_t x23;
-  fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
   uint64_t x24;
   uint64_t x25;
-  fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
   uint64_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
-  uint64_t x28 = (x27 + x23);
+  uint64_t x28;
   uint64_t x29;
   fiat_p256_uint1 x30;
-  fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
   uint64_t x31;
   fiat_p256_uint1 x32;
-  fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
   uint64_t x33;
   fiat_p256_uint1 x34;
-  fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
   uint64_t x35;
   fiat_p256_uint1 x36;
-  fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
   uint64_t x37;
   fiat_p256_uint1 x38;
-  fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
   uint64_t x39;
   uint64_t x40;
-  fiat_p256_mulx_u64(&x39, &x40, x1, (arg1[3]));
   uint64_t x41;
   uint64_t x42;
-  fiat_p256_mulx_u64(&x41, &x42, x1, (arg1[2]));
   uint64_t x43;
   uint64_t x44;
-  fiat_p256_mulx_u64(&x43, &x44, x1, (arg1[1]));
   uint64_t x45;
   uint64_t x46;
-  fiat_p256_mulx_u64(&x45, &x46, x1, (arg1[0]));
   uint64_t x47;
   fiat_p256_uint1 x48;
-  fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
   uint64_t x49;
   fiat_p256_uint1 x50;
-  fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
   uint64_t x51;
   fiat_p256_uint1 x52;
-  fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
-  uint64_t x53 = (x52 + x40);
+  uint64_t x53;
   uint64_t x54;
   fiat_p256_uint1 x55;
-  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
   uint64_t x56;
   fiat_p256_uint1 x57;
-  fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
   uint64_t x58;
   fiat_p256_uint1 x59;
-  fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
   uint64_t x60;
   fiat_p256_uint1 x61;
-  fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
   uint64_t x62;
   fiat_p256_uint1 x63;
-  fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
   uint64_t x64;
   uint64_t x65;
-  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
   uint64_t x66;
   uint64_t x67;
-  fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
   uint64_t x68;
   uint64_t x69;
-  fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
   uint64_t x70;
   fiat_p256_uint1 x71;
-  fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
-  uint64_t x72 = (x71 + x67);
+  uint64_t x72;
   uint64_t x73;
   fiat_p256_uint1 x74;
-  fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
   uint64_t x75;
   fiat_p256_uint1 x76;
-  fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
   uint64_t x77;
   fiat_p256_uint1 x78;
-  fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
   uint64_t x79;
   fiat_p256_uint1 x80;
-  fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
   uint64_t x81;
   fiat_p256_uint1 x82;
-  fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
-  uint64_t x83 = ((uint64_t)x82 + x63);
+  uint64_t x83;
   uint64_t x84;
   uint64_t x85;
-  fiat_p256_mulx_u64(&x84, &x85, x2, (arg1[3]));
   uint64_t x86;
   uint64_t x87;
-  fiat_p256_mulx_u64(&x86, &x87, x2, (arg1[2]));
   uint64_t x88;
   uint64_t x89;
-  fiat_p256_mulx_u64(&x88, &x89, x2, (arg1[1]));
   uint64_t x90;
   uint64_t x91;
-  fiat_p256_mulx_u64(&x90, &x91, x2, (arg1[0]));
   uint64_t x92;
   fiat_p256_uint1 x93;
-  fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
   uint64_t x94;
   fiat_p256_uint1 x95;
-  fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
   uint64_t x96;
   fiat_p256_uint1 x97;
-  fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
-  uint64_t x98 = (x97 + x85);
+  uint64_t x98;
   uint64_t x99;
   fiat_p256_uint1 x100;
-  fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
   uint64_t x101;
   fiat_p256_uint1 x102;
-  fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
   uint64_t x103;
   fiat_p256_uint1 x104;
-  fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
   uint64_t x105;
   fiat_p256_uint1 x106;
-  fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
   uint64_t x107;
   fiat_p256_uint1 x108;
-  fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
   uint64_t x109;
   uint64_t x110;
-  fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
   uint64_t x111;
   uint64_t x112;
-  fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
   uint64_t x113;
   uint64_t x114;
-  fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
   uint64_t x115;
   fiat_p256_uint1 x116;
-  fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
-  uint64_t x117 = (x116 + x112);
+  uint64_t x117;
   uint64_t x118;
   fiat_p256_uint1 x119;
-  fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
   uint64_t x120;
   fiat_p256_uint1 x121;
-  fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
   uint64_t x122;
   fiat_p256_uint1 x123;
-  fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
   uint64_t x124;
   fiat_p256_uint1 x125;
-  fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
   uint64_t x126;
   fiat_p256_uint1 x127;
-  fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
-  uint64_t x128 = ((uint64_t)x127 + x108);
+  uint64_t x128;
   uint64_t x129;
   uint64_t x130;
-  fiat_p256_mulx_u64(&x129, &x130, x3, (arg1[3]));
   uint64_t x131;
   uint64_t x132;
-  fiat_p256_mulx_u64(&x131, &x132, x3, (arg1[2]));
   uint64_t x133;
   uint64_t x134;
-  fiat_p256_mulx_u64(&x133, &x134, x3, (arg1[1]));
   uint64_t x135;
   uint64_t x136;
-  fiat_p256_mulx_u64(&x135, &x136, x3, (arg1[0]));
   uint64_t x137;
   fiat_p256_uint1 x138;
-  fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
   uint64_t x139;
   fiat_p256_uint1 x140;
-  fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
   uint64_t x141;
   fiat_p256_uint1 x142;
-  fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
-  uint64_t x143 = (x142 + x130);
+  uint64_t x143;
   uint64_t x144;
   fiat_p256_uint1 x145;
-  fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
   uint64_t x146;
   fiat_p256_uint1 x147;
-  fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
   uint64_t x148;
   fiat_p256_uint1 x149;
-  fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
   uint64_t x150;
   fiat_p256_uint1 x151;
-  fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
   uint64_t x152;
   fiat_p256_uint1 x153;
-  fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
   uint64_t x154;
   uint64_t x155;
-  fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
   uint64_t x156;
   uint64_t x157;
-  fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
   uint64_t x158;
   uint64_t x159;
-  fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
   uint64_t x160;
   fiat_p256_uint1 x161;
-  fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
-  uint64_t x162 = (x161 + x157);
+  uint64_t x162;
   uint64_t x163;
   fiat_p256_uint1 x164;
-  fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
   uint64_t x165;
   fiat_p256_uint1 x166;
-  fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
   uint64_t x167;
   fiat_p256_uint1 x168;
-  fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
   uint64_t x169;
   fiat_p256_uint1 x170;
-  fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
   uint64_t x171;
   fiat_p256_uint1 x172;
-  fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
-  uint64_t x173 = ((uint64_t)x172 + x153);
+  uint64_t x173;
   uint64_t x174;
   fiat_p256_uint1 x175;
-  fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
   uint64_t x176;
   fiat_p256_uint1 x177;
-  fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
   uint64_t x178;
   fiat_p256_uint1 x179;
-  fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
   uint64_t x180;
   fiat_p256_uint1 x181;
-  fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
   uint64_t x182;
   fiat_p256_uint1 x183;
-  fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
   uint64_t x184;
-  fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
   uint64_t x185;
-  fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
   uint64_t x186;
-  fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
   uint64_t x187;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[0]);
+  fiat_p256_mulx_u64(&x5, &x6, x4, (arg1[3]));
+  fiat_p256_mulx_u64(&x7, &x8, x4, (arg1[2]));
+  fiat_p256_mulx_u64(&x9, &x10, x4, (arg1[1]));
+  fiat_p256_mulx_u64(&x11, &x12, x4, (arg1[0]));
+  fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
+  fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
+  fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
+  x19 = (x18 + x6);
+  fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
+  x28 = (x27 + x23);
+  fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
+  fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
+  fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
+  fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
+  fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
+  fiat_p256_mulx_u64(&x39, &x40, x1, (arg1[3]));
+  fiat_p256_mulx_u64(&x41, &x42, x1, (arg1[2]));
+  fiat_p256_mulx_u64(&x43, &x44, x1, (arg1[1]));
+  fiat_p256_mulx_u64(&x45, &x46, x1, (arg1[0]));
+  fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
+  fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
+  fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
+  x53 = (x52 + x40);
+  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
+  fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
+  fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
+  fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
+  fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
+  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
+  x72 = (x71 + x67);
+  fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
+  fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
+  fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
+  fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
+  fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
+  x83 = ((uint64_t)x82 + x63);
+  fiat_p256_mulx_u64(&x84, &x85, x2, (arg1[3]));
+  fiat_p256_mulx_u64(&x86, &x87, x2, (arg1[2]));
+  fiat_p256_mulx_u64(&x88, &x89, x2, (arg1[1]));
+  fiat_p256_mulx_u64(&x90, &x91, x2, (arg1[0]));
+  fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
+  fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
+  fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
+  x98 = (x97 + x85);
+  fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
+  fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
+  fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
+  fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
+  fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
+  fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
+  x117 = (x116 + x112);
+  fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
+  fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
+  fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
+  fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
+  fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
+  x128 = ((uint64_t)x127 + x108);
+  fiat_p256_mulx_u64(&x129, &x130, x3, (arg1[3]));
+  fiat_p256_mulx_u64(&x131, &x132, x3, (arg1[2]));
+  fiat_p256_mulx_u64(&x133, &x134, x3, (arg1[1]));
+  fiat_p256_mulx_u64(&x135, &x136, x3, (arg1[0]));
+  fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
+  fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
+  fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
+  x143 = (x142 + x130);
+  fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
+  fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
+  fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
+  fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
+  fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
+  fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
+  x162 = (x161 + x157);
+  fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
+  fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
+  fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
+  fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
+  fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
+  x173 = ((uint64_t)x172 + x153);
+  fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
+  fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
+  fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
+  fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
+  fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
   fiat_p256_cmovznz_u64(&x187, x183, x180, x171);
   out1[0] = x184;
   out1[1] = x185;
@@ -706,6 +770,7 @@
 
 /*
  * The function fiat_p256_add adds two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -713,47 +778,42 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- *   arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_add(uint64_t out1[4], const uint64_t arg1[4], const uint64_t arg2[4]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_add(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
   uint64_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
   uint64_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
   uint64_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
   uint64_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
   uint64_t x9;
   fiat_p256_uint1 x10;
-  fiat_p256_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff));
   uint64_t x11;
   fiat_p256_uint1 x12;
-  fiat_p256_subborrowx_u64(&x11, &x12, x10, x3, UINT32_C(0xffffffff));
   uint64_t x13;
   fiat_p256_uint1 x14;
-  fiat_p256_subborrowx_u64(&x13, &x14, x12, x5, 0x0);
   uint64_t x15;
   fiat_p256_uint1 x16;
-  fiat_p256_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0xffffffff00000001));
   uint64_t x17;
   fiat_p256_uint1 x18;
-  fiat_p256_subborrowx_u64(&x17, &x18, x16, x8, 0x0);
   uint64_t x19;
-  fiat_p256_cmovznz_u64(&x19, x18, x9, x1);
   uint64_t x20;
-  fiat_p256_cmovznz_u64(&x20, x18, x11, x3);
   uint64_t x21;
-  fiat_p256_cmovznz_u64(&x21, x18, x13, x5);
   uint64_t x22;
+  fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
+  fiat_p256_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
+  fiat_p256_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
+  fiat_p256_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
+  fiat_p256_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x11, &x12, x10, x3, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x13, &x14, x12, x5, 0x0);
+  fiat_p256_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x17, &x18, x16, x8, 0x0);
+  fiat_p256_cmovznz_u64(&x19, x18, x9, x1);
+  fiat_p256_cmovznz_u64(&x20, x18, x11, x3);
+  fiat_p256_cmovznz_u64(&x21, x18, x13, x5);
   fiat_p256_cmovznz_u64(&x22, x18, x15, x7);
   out1[0] = x19;
   out1[1] = x20;
@@ -763,6 +823,7 @@
 
 /*
  * The function fiat_p256_sub subtracts two field elements in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  *   0 ≤ eval arg2 < m
@@ -770,38 +831,33 @@
  *   eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- *   arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_sub(uint64_t out1[4], const uint64_t arg1[4], const uint64_t arg2[4]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_sub(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
   uint64_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
   uint64_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
   uint64_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
   uint64_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
   uint64_t x9;
-  fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
   uint64_t x10;
   fiat_p256_uint1 x11;
-  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, (x9 & UINT64_C(0xffffffffffffffff)));
   uint64_t x12;
   fiat_p256_uint1 x13;
-  fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
   uint64_t x14;
   fiat_p256_uint1 x15;
-  fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
   uint64_t x16;
   fiat_p256_uint1 x17;
+  fiat_p256_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
+  fiat_p256_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
+  fiat_p256_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
+  fiat_p256_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
+  fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9);
+  fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
+  fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
   fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001)));
   out1[0] = x10;
   out1[1] = x12;
@@ -811,43 +867,40 @@
 
 /*
  * The function fiat_p256_opp negates a field element in the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_opp(uint64_t out1[4], const uint64_t arg1[4]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_opp(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
   uint64_t x1;
   fiat_p256_uint1 x2;
-  fiat_p256_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0]));
   uint64_t x3;
   fiat_p256_uint1 x4;
-  fiat_p256_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1]));
   uint64_t x5;
   fiat_p256_uint1 x6;
-  fiat_p256_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2]));
   uint64_t x7;
   fiat_p256_uint1 x8;
-  fiat_p256_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3]));
   uint64_t x9;
-  fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
   uint64_t x10;
   fiat_p256_uint1 x11;
-  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, (x9 & UINT64_C(0xffffffffffffffff)));
   uint64_t x12;
   fiat_p256_uint1 x13;
-  fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
   uint64_t x14;
   fiat_p256_uint1 x15;
-  fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
   uint64_t x16;
   fiat_p256_uint1 x17;
+  fiat_p256_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0]));
+  fiat_p256_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1]));
+  fiat_p256_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2]));
+  fiat_p256_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3]));
+  fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9);
+  fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
+  fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
   fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001)));
   out1[0] = x10;
   out1[1] = x12;
@@ -857,153 +910,152 @@
 
 /*
  * The function fiat_p256_from_montgomery translates a field element out of the Montgomery domain.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
  *   eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m
  *   0 ≤ eval out1 < m
  *
- * Input Bounds:
- *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
- * Output Bounds:
- *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_from_montgomery(uint64_t out1[4], const uint64_t arg1[4]) {
-  uint64_t x1 = (arg1[0]);
+static FIAT_P256_FIAT_INLINE void fiat_p256_from_montgomery(fiat_p256_non_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
+  uint64_t x1;
   uint64_t x2;
   uint64_t x3;
-  fiat_p256_mulx_u64(&x2, &x3, x1, UINT64_C(0xffffffff00000001));
   uint64_t x4;
   uint64_t x5;
-  fiat_p256_mulx_u64(&x4, &x5, x1, UINT32_C(0xffffffff));
   uint64_t x6;
   uint64_t x7;
-  fiat_p256_mulx_u64(&x6, &x7, x1, UINT64_C(0xffffffffffffffff));
   uint64_t x8;
   fiat_p256_uint1 x9;
-  fiat_p256_addcarryx_u64(&x8, &x9, 0x0, x7, x4);
   uint64_t x10;
   fiat_p256_uint1 x11;
-  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x6);
   uint64_t x12;
   fiat_p256_uint1 x13;
-  fiat_p256_addcarryx_u64(&x12, &x13, x11, 0x0, x8);
   uint64_t x14;
   fiat_p256_uint1 x15;
-  fiat_p256_addcarryx_u64(&x14, &x15, 0x0, x12, (arg1[1]));
   uint64_t x16;
   uint64_t x17;
-  fiat_p256_mulx_u64(&x16, &x17, x14, UINT64_C(0xffffffff00000001));
   uint64_t x18;
   uint64_t x19;
-  fiat_p256_mulx_u64(&x18, &x19, x14, UINT32_C(0xffffffff));
   uint64_t x20;
   uint64_t x21;
-  fiat_p256_mulx_u64(&x20, &x21, x14, UINT64_C(0xffffffffffffffff));
   uint64_t x22;
   fiat_p256_uint1 x23;
-  fiat_p256_addcarryx_u64(&x22, &x23, 0x0, x21, x18);
   uint64_t x24;
   fiat_p256_uint1 x25;
-  fiat_p256_addcarryx_u64(&x24, &x25, 0x0, x14, x20);
   uint64_t x26;
   fiat_p256_uint1 x27;
-  fiat_p256_addcarryx_u64(&x26, &x27, x25, (x15 + (x13 + (x9 + x5))), x22);
   uint64_t x28;
   fiat_p256_uint1 x29;
-  fiat_p256_addcarryx_u64(&x28, &x29, x27, x2, (x23 + x19));
   uint64_t x30;
   fiat_p256_uint1 x31;
-  fiat_p256_addcarryx_u64(&x30, &x31, x29, x3, x16);
   uint64_t x32;
   fiat_p256_uint1 x33;
-  fiat_p256_addcarryx_u64(&x32, &x33, 0x0, x26, (arg1[2]));
   uint64_t x34;
   fiat_p256_uint1 x35;
-  fiat_p256_addcarryx_u64(&x34, &x35, x33, x28, 0x0);
   uint64_t x36;
   fiat_p256_uint1 x37;
-  fiat_p256_addcarryx_u64(&x36, &x37, x35, x30, 0x0);
   uint64_t x38;
   uint64_t x39;
-  fiat_p256_mulx_u64(&x38, &x39, x32, UINT64_C(0xffffffff00000001));
   uint64_t x40;
   uint64_t x41;
-  fiat_p256_mulx_u64(&x40, &x41, x32, UINT32_C(0xffffffff));
   uint64_t x42;
   uint64_t x43;
-  fiat_p256_mulx_u64(&x42, &x43, x32, UINT64_C(0xffffffffffffffff));
   uint64_t x44;
   fiat_p256_uint1 x45;
-  fiat_p256_addcarryx_u64(&x44, &x45, 0x0, x43, x40);
   uint64_t x46;
   fiat_p256_uint1 x47;
-  fiat_p256_addcarryx_u64(&x46, &x47, 0x0, x32, x42);
   uint64_t x48;
   fiat_p256_uint1 x49;
-  fiat_p256_addcarryx_u64(&x48, &x49, x47, x34, x44);
   uint64_t x50;
   fiat_p256_uint1 x51;
-  fiat_p256_addcarryx_u64(&x50, &x51, x49, x36, (x45 + x41));
   uint64_t x52;
   fiat_p256_uint1 x53;
-  fiat_p256_addcarryx_u64(&x52, &x53, x51, (x37 + (x31 + x17)), x38);
   uint64_t x54;
   fiat_p256_uint1 x55;
-  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x48, (arg1[3]));
   uint64_t x56;
   fiat_p256_uint1 x57;
-  fiat_p256_addcarryx_u64(&x56, &x57, x55, x50, 0x0);
   uint64_t x58;
   fiat_p256_uint1 x59;
-  fiat_p256_addcarryx_u64(&x58, &x59, x57, x52, 0x0);
   uint64_t x60;
   uint64_t x61;
-  fiat_p256_mulx_u64(&x60, &x61, x54, UINT64_C(0xffffffff00000001));
   uint64_t x62;
   uint64_t x63;
-  fiat_p256_mulx_u64(&x62, &x63, x54, UINT32_C(0xffffffff));
   uint64_t x64;
   uint64_t x65;
-  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffffffffffff));
   uint64_t x66;
   fiat_p256_uint1 x67;
-  fiat_p256_addcarryx_u64(&x66, &x67, 0x0, x65, x62);
   uint64_t x68;
   fiat_p256_uint1 x69;
-  fiat_p256_addcarryx_u64(&x68, &x69, 0x0, x54, x64);
   uint64_t x70;
   fiat_p256_uint1 x71;
-  fiat_p256_addcarryx_u64(&x70, &x71, x69, x56, x66);
   uint64_t x72;
   fiat_p256_uint1 x73;
-  fiat_p256_addcarryx_u64(&x72, &x73, x71, x58, (x67 + x63));
   uint64_t x74;
   fiat_p256_uint1 x75;
-  fiat_p256_addcarryx_u64(&x74, &x75, x73, (x59 + (x53 + x39)), x60);
-  uint64_t x76 = (x75 + x61);
+  uint64_t x76;
   uint64_t x77;
   fiat_p256_uint1 x78;
-  fiat_p256_subborrowx_u64(&x77, &x78, 0x0, x70, UINT64_C(0xffffffffffffffff));
   uint64_t x79;
   fiat_p256_uint1 x80;
-  fiat_p256_subborrowx_u64(&x79, &x80, x78, x72, UINT32_C(0xffffffff));
   uint64_t x81;
   fiat_p256_uint1 x82;
-  fiat_p256_subborrowx_u64(&x81, &x82, x80, x74, 0x0);
   uint64_t x83;
   fiat_p256_uint1 x84;
-  fiat_p256_subborrowx_u64(&x83, &x84, x82, x76, UINT64_C(0xffffffff00000001));
   uint64_t x85;
   fiat_p256_uint1 x86;
-  fiat_p256_subborrowx_u64(&x85, &x86, x84, 0x0, 0x0);
   uint64_t x87;
-  fiat_p256_cmovznz_u64(&x87, x86, x77, x70);
   uint64_t x88;
-  fiat_p256_cmovznz_u64(&x88, x86, x79, x72);
   uint64_t x89;
-  fiat_p256_cmovznz_u64(&x89, x86, x81, x74);
   uint64_t x90;
+  x1 = (arg1[0]);
+  fiat_p256_mulx_u64(&x2, &x3, x1, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x4, &x5, x1, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x6, &x7, x1, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x8, &x9, 0x0, x7, x4);
+  fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x6);
+  fiat_p256_addcarryx_u64(&x12, &x13, x11, 0x0, x8);
+  fiat_p256_addcarryx_u64(&x14, &x15, 0x0, x12, (arg1[1]));
+  fiat_p256_mulx_u64(&x16, &x17, x14, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x18, &x19, x14, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x20, &x21, x14, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x22, &x23, 0x0, x21, x18);
+  fiat_p256_addcarryx_u64(&x24, &x25, 0x0, x14, x20);
+  fiat_p256_addcarryx_u64(&x26, &x27, x25, (x15 + (x13 + (x9 + x5))), x22);
+  fiat_p256_addcarryx_u64(&x28, &x29, x27, x2, (x23 + x19));
+  fiat_p256_addcarryx_u64(&x30, &x31, x29, x3, x16);
+  fiat_p256_addcarryx_u64(&x32, &x33, 0x0, x26, (arg1[2]));
+  fiat_p256_addcarryx_u64(&x34, &x35, x33, x28, 0x0);
+  fiat_p256_addcarryx_u64(&x36, &x37, x35, x30, 0x0);
+  fiat_p256_mulx_u64(&x38, &x39, x32, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x40, &x41, x32, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x42, &x43, x32, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x44, &x45, 0x0, x43, x40);
+  fiat_p256_addcarryx_u64(&x46, &x47, 0x0, x32, x42);
+  fiat_p256_addcarryx_u64(&x48, &x49, x47, x34, x44);
+  fiat_p256_addcarryx_u64(&x50, &x51, x49, x36, (x45 + x41));
+  fiat_p256_addcarryx_u64(&x52, &x53, x51, (x37 + (x31 + x17)), x38);
+  fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x48, (arg1[3]));
+  fiat_p256_addcarryx_u64(&x56, &x57, x55, x50, 0x0);
+  fiat_p256_addcarryx_u64(&x58, &x59, x57, x52, 0x0);
+  fiat_p256_mulx_u64(&x60, &x61, x54, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x62, &x63, x54, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x66, &x67, 0x0, x65, x62);
+  fiat_p256_addcarryx_u64(&x68, &x69, 0x0, x54, x64);
+  fiat_p256_addcarryx_u64(&x70, &x71, x69, x56, x66);
+  fiat_p256_addcarryx_u64(&x72, &x73, x71, x58, (x67 + x63));
+  fiat_p256_addcarryx_u64(&x74, &x75, x73, (x59 + (x53 + x39)), x60);
+  x76 = (x75 + x61);
+  fiat_p256_subborrowx_u64(&x77, &x78, 0x0, x70, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x79, &x80, x78, x72, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x81, &x82, x80, x74, 0x0);
+  fiat_p256_subborrowx_u64(&x83, &x84, x82, x76, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x85, &x86, x84, 0x0, 0x0);
+  fiat_p256_cmovznz_u64(&x87, x86, x77, x70);
+  fiat_p256_cmovznz_u64(&x88, x86, x79, x72);
+  fiat_p256_cmovznz_u64(&x89, x86, x81, x74);
   fiat_p256_cmovznz_u64(&x90, x86, x83, x76);
   out1[0] = x87;
   out1[1] = x88;
@@ -1012,7 +1064,284 @@
 }
 
 /*
+ * The function fiat_p256_to_montgomery translates a field element into the Montgomery domain.
+ *
+ * Preconditions:
+ *   0 ≤ eval arg1 < m
+ * Postconditions:
+ *   eval (from_montgomery out1) mod m = eval arg1 mod m
+ *   0 ≤ eval out1 < m
+ *
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_to_montgomery(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_non_montgomery_domain_field_element arg1) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  uint64_t x13;
+  fiat_p256_uint1 x14;
+  uint64_t x15;
+  fiat_p256_uint1 x16;
+  uint64_t x17;
+  fiat_p256_uint1 x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  fiat_p256_uint1 x26;
+  uint64_t x27;
+  fiat_p256_uint1 x28;
+  uint64_t x29;
+  fiat_p256_uint1 x30;
+  uint64_t x31;
+  fiat_p256_uint1 x32;
+  uint64_t x33;
+  fiat_p256_uint1 x34;
+  uint64_t x35;
+  fiat_p256_uint1 x36;
+  uint64_t x37;
+  uint64_t x38;
+  uint64_t x39;
+  uint64_t x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  fiat_p256_uint1 x46;
+  uint64_t x47;
+  fiat_p256_uint1 x48;
+  uint64_t x49;
+  fiat_p256_uint1 x50;
+  uint64_t x51;
+  fiat_p256_uint1 x52;
+  uint64_t x53;
+  fiat_p256_uint1 x54;
+  uint64_t x55;
+  fiat_p256_uint1 x56;
+  uint64_t x57;
+  fiat_p256_uint1 x58;
+  uint64_t x59;
+  uint64_t x60;
+  uint64_t x61;
+  uint64_t x62;
+  uint64_t x63;
+  uint64_t x64;
+  uint64_t x65;
+  fiat_p256_uint1 x66;
+  uint64_t x67;
+  fiat_p256_uint1 x68;
+  uint64_t x69;
+  fiat_p256_uint1 x70;
+  uint64_t x71;
+  fiat_p256_uint1 x72;
+  uint64_t x73;
+  fiat_p256_uint1 x74;
+  uint64_t x75;
+  fiat_p256_uint1 x76;
+  uint64_t x77;
+  uint64_t x78;
+  uint64_t x79;
+  uint64_t x80;
+  uint64_t x81;
+  uint64_t x82;
+  uint64_t x83;
+  uint64_t x84;
+  uint64_t x85;
+  fiat_p256_uint1 x86;
+  uint64_t x87;
+  fiat_p256_uint1 x88;
+  uint64_t x89;
+  fiat_p256_uint1 x90;
+  uint64_t x91;
+  fiat_p256_uint1 x92;
+  uint64_t x93;
+  fiat_p256_uint1 x94;
+  uint64_t x95;
+  fiat_p256_uint1 x96;
+  uint64_t x97;
+  fiat_p256_uint1 x98;
+  uint64_t x99;
+  uint64_t x100;
+  uint64_t x101;
+  uint64_t x102;
+  uint64_t x103;
+  uint64_t x104;
+  uint64_t x105;
+  fiat_p256_uint1 x106;
+  uint64_t x107;
+  fiat_p256_uint1 x108;
+  uint64_t x109;
+  fiat_p256_uint1 x110;
+  uint64_t x111;
+  fiat_p256_uint1 x112;
+  uint64_t x113;
+  fiat_p256_uint1 x114;
+  uint64_t x115;
+  fiat_p256_uint1 x116;
+  uint64_t x117;
+  uint64_t x118;
+  uint64_t x119;
+  uint64_t x120;
+  uint64_t x121;
+  uint64_t x122;
+  uint64_t x123;
+  uint64_t x124;
+  uint64_t x125;
+  fiat_p256_uint1 x126;
+  uint64_t x127;
+  fiat_p256_uint1 x128;
+  uint64_t x129;
+  fiat_p256_uint1 x130;
+  uint64_t x131;
+  fiat_p256_uint1 x132;
+  uint64_t x133;
+  fiat_p256_uint1 x134;
+  uint64_t x135;
+  fiat_p256_uint1 x136;
+  uint64_t x137;
+  fiat_p256_uint1 x138;
+  uint64_t x139;
+  uint64_t x140;
+  uint64_t x141;
+  uint64_t x142;
+  uint64_t x143;
+  uint64_t x144;
+  uint64_t x145;
+  fiat_p256_uint1 x146;
+  uint64_t x147;
+  fiat_p256_uint1 x148;
+  uint64_t x149;
+  fiat_p256_uint1 x150;
+  uint64_t x151;
+  fiat_p256_uint1 x152;
+  uint64_t x153;
+  fiat_p256_uint1 x154;
+  uint64_t x155;
+  fiat_p256_uint1 x156;
+  uint64_t x157;
+  fiat_p256_uint1 x158;
+  uint64_t x159;
+  fiat_p256_uint1 x160;
+  uint64_t x161;
+  fiat_p256_uint1 x162;
+  uint64_t x163;
+  fiat_p256_uint1 x164;
+  uint64_t x165;
+  fiat_p256_uint1 x166;
+  uint64_t x167;
+  uint64_t x168;
+  uint64_t x169;
+  uint64_t x170;
+  x1 = (arg1[1]);
+  x2 = (arg1[2]);
+  x3 = (arg1[3]);
+  x4 = (arg1[0]);
+  fiat_p256_mulx_u64(&x5, &x6, x4, UINT64_C(0x4fffffffd));
+  fiat_p256_mulx_u64(&x7, &x8, x4, UINT64_C(0xfffffffffffffffe));
+  fiat_p256_mulx_u64(&x9, &x10, x4, UINT64_C(0xfffffffbffffffff));
+  fiat_p256_mulx_u64(&x11, &x12, x4, 0x3);
+  fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
+  fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
+  fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
+  fiat_p256_mulx_u64(&x19, &x20, x11, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x21, &x22, x11, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x23, &x24, x11, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x25, &x26, 0x0, x24, x21);
+  fiat_p256_addcarryx_u64(&x27, &x28, 0x0, x11, x23);
+  fiat_p256_addcarryx_u64(&x29, &x30, x28, x13, x25);
+  fiat_p256_addcarryx_u64(&x31, &x32, x30, x15, (x26 + x22));
+  fiat_p256_addcarryx_u64(&x33, &x34, x32, x17, x19);
+  fiat_p256_addcarryx_u64(&x35, &x36, x34, (x18 + x6), x20);
+  fiat_p256_mulx_u64(&x37, &x38, x1, UINT64_C(0x4fffffffd));
+  fiat_p256_mulx_u64(&x39, &x40, x1, UINT64_C(0xfffffffffffffffe));
+  fiat_p256_mulx_u64(&x41, &x42, x1, UINT64_C(0xfffffffbffffffff));
+  fiat_p256_mulx_u64(&x43, &x44, x1, 0x3);
+  fiat_p256_addcarryx_u64(&x45, &x46, 0x0, x44, x41);
+  fiat_p256_addcarryx_u64(&x47, &x48, x46, x42, x39);
+  fiat_p256_addcarryx_u64(&x49, &x50, x48, x40, x37);
+  fiat_p256_addcarryx_u64(&x51, &x52, 0x0, x29, x43);
+  fiat_p256_addcarryx_u64(&x53, &x54, x52, x31, x45);
+  fiat_p256_addcarryx_u64(&x55, &x56, x54, x33, x47);
+  fiat_p256_addcarryx_u64(&x57, &x58, x56, x35, x49);
+  fiat_p256_mulx_u64(&x59, &x60, x51, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x61, &x62, x51, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x63, &x64, x51, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x65, &x66, 0x0, x64, x61);
+  fiat_p256_addcarryx_u64(&x67, &x68, 0x0, x51, x63);
+  fiat_p256_addcarryx_u64(&x69, &x70, x68, x53, x65);
+  fiat_p256_addcarryx_u64(&x71, &x72, x70, x55, (x66 + x62));
+  fiat_p256_addcarryx_u64(&x73, &x74, x72, x57, x59);
+  fiat_p256_addcarryx_u64(&x75, &x76, x74, (((uint64_t)x58 + x36) + (x50 + x38)), x60);
+  fiat_p256_mulx_u64(&x77, &x78, x2, UINT64_C(0x4fffffffd));
+  fiat_p256_mulx_u64(&x79, &x80, x2, UINT64_C(0xfffffffffffffffe));
+  fiat_p256_mulx_u64(&x81, &x82, x2, UINT64_C(0xfffffffbffffffff));
+  fiat_p256_mulx_u64(&x83, &x84, x2, 0x3);
+  fiat_p256_addcarryx_u64(&x85, &x86, 0x0, x84, x81);
+  fiat_p256_addcarryx_u64(&x87, &x88, x86, x82, x79);
+  fiat_p256_addcarryx_u64(&x89, &x90, x88, x80, x77);
+  fiat_p256_addcarryx_u64(&x91, &x92, 0x0, x69, x83);
+  fiat_p256_addcarryx_u64(&x93, &x94, x92, x71, x85);
+  fiat_p256_addcarryx_u64(&x95, &x96, x94, x73, x87);
+  fiat_p256_addcarryx_u64(&x97, &x98, x96, x75, x89);
+  fiat_p256_mulx_u64(&x99, &x100, x91, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x101, &x102, x91, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x103, &x104, x91, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x105, &x106, 0x0, x104, x101);
+  fiat_p256_addcarryx_u64(&x107, &x108, 0x0, x91, x103);
+  fiat_p256_addcarryx_u64(&x109, &x110, x108, x93, x105);
+  fiat_p256_addcarryx_u64(&x111, &x112, x110, x95, (x106 + x102));
+  fiat_p256_addcarryx_u64(&x113, &x114, x112, x97, x99);
+  fiat_p256_addcarryx_u64(&x115, &x116, x114, (((uint64_t)x98 + x76) + (x90 + x78)), x100);
+  fiat_p256_mulx_u64(&x117, &x118, x3, UINT64_C(0x4fffffffd));
+  fiat_p256_mulx_u64(&x119, &x120, x3, UINT64_C(0xfffffffffffffffe));
+  fiat_p256_mulx_u64(&x121, &x122, x3, UINT64_C(0xfffffffbffffffff));
+  fiat_p256_mulx_u64(&x123, &x124, x3, 0x3);
+  fiat_p256_addcarryx_u64(&x125, &x126, 0x0, x124, x121);
+  fiat_p256_addcarryx_u64(&x127, &x128, x126, x122, x119);
+  fiat_p256_addcarryx_u64(&x129, &x130, x128, x120, x117);
+  fiat_p256_addcarryx_u64(&x131, &x132, 0x0, x109, x123);
+  fiat_p256_addcarryx_u64(&x133, &x134, x132, x111, x125);
+  fiat_p256_addcarryx_u64(&x135, &x136, x134, x113, x127);
+  fiat_p256_addcarryx_u64(&x137, &x138, x136, x115, x129);
+  fiat_p256_mulx_u64(&x139, &x140, x131, UINT64_C(0xffffffff00000001));
+  fiat_p256_mulx_u64(&x141, &x142, x131, UINT32_C(0xffffffff));
+  fiat_p256_mulx_u64(&x143, &x144, x131, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x145, &x146, 0x0, x144, x141);
+  fiat_p256_addcarryx_u64(&x147, &x148, 0x0, x131, x143);
+  fiat_p256_addcarryx_u64(&x149, &x150, x148, x133, x145);
+  fiat_p256_addcarryx_u64(&x151, &x152, x150, x135, (x146 + x142));
+  fiat_p256_addcarryx_u64(&x153, &x154, x152, x137, x139);
+  fiat_p256_addcarryx_u64(&x155, &x156, x154, (((uint64_t)x138 + x116) + (x130 + x118)), x140);
+  fiat_p256_subborrowx_u64(&x157, &x158, 0x0, x149, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x159, &x160, x158, x151, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x161, &x162, x160, x153, 0x0);
+  fiat_p256_subborrowx_u64(&x163, &x164, x162, x155, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x165, &x166, x164, x156, 0x0);
+  fiat_p256_cmovznz_u64(&x167, x166, x157, x149);
+  fiat_p256_cmovznz_u64(&x168, x166, x159, x151);
+  fiat_p256_cmovznz_u64(&x169, x166, x161, x153);
+  fiat_p256_cmovznz_u64(&x170, x166, x163, x155);
+  out1[0] = x167;
+  out1[1] = x168;
+  out1[2] = x169;
+  out1[3] = x170;
+}
+
+/*
  * The function fiat_p256_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
@@ -1023,13 +1352,15 @@
  * Output Bounds:
  *   out1: [0x0 ~> 0xffffffffffffffff]
  */
-static void fiat_p256_nonzero(uint64_t* out1, const uint64_t arg1[4]) {
-  uint64_t x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | (uint64_t)0x0))));
+static FIAT_P256_FIAT_INLINE void fiat_p256_nonzero(uint64_t* out1, const uint64_t arg1[4]) {
+  uint64_t x1;
+  x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | (arg1[3]))));
   *out1 = x1;
 }
 
 /*
  * The function fiat_p256_selectznz is a multi-limb conditional select.
+ *
  * Postconditions:
  *   eval out1 = (if arg1 = 0 then eval arg2 else eval arg3)
  *
@@ -1040,14 +1371,14 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_selectznz(uint64_t out1[4], fiat_p256_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) {
+static FIAT_P256_FIAT_INLINE void fiat_p256_selectznz(uint64_t out1[4], fiat_p256_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) {
   uint64_t x1;
-  fiat_p256_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0]));
   uint64_t x2;
-  fiat_p256_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1]));
   uint64_t x3;
-  fiat_p256_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2]));
   uint64_t x4;
+  fiat_p256_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0]));
+  fiat_p256_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1]));
+  fiat_p256_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2]));
   fiat_p256_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3]));
   out1[0] = x1;
   out1[1] = x2;
@@ -1056,7 +1387,8 @@
 }
 
 /*
- * The function fiat_p256_to_bytes serializes a field element in the Montgomery domain to bytes in little-endian order.
+ * The function fiat_p256_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order.
+ *
  * Preconditions:
  *   0 ≤ eval arg1 < m
  * Postconditions:
@@ -1067,106 +1399,164 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]]
  */
-static void fiat_p256_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) {
-  uint64_t x1 = (arg1[3]);
-  uint64_t x2 = (arg1[2]);
-  uint64_t x3 = (arg1[1]);
-  uint64_t x4 = (arg1[0]);
-  uint64_t x5 = (x4 >> 8);
-  uint8_t x6 = (uint8_t)(x4 & UINT8_C(0xff));
-  uint64_t x7 = (x5 >> 8);
-  uint8_t x8 = (uint8_t)(x5 & UINT8_C(0xff));
-  uint64_t x9 = (x7 >> 8);
-  uint8_t x10 = (uint8_t)(x7 & UINT8_C(0xff));
-  uint64_t x11 = (x9 >> 8);
-  uint8_t x12 = (uint8_t)(x9 & UINT8_C(0xff));
-  uint64_t x13 = (x11 >> 8);
-  uint8_t x14 = (uint8_t)(x11 & UINT8_C(0xff));
-  uint64_t x15 = (x13 >> 8);
-  uint8_t x16 = (uint8_t)(x13 & UINT8_C(0xff));
-  uint8_t x17 = (uint8_t)(x15 >> 8);
-  uint8_t x18 = (uint8_t)(x15 & UINT8_C(0xff));
-  uint8_t x19 = (uint8_t)(x17 & UINT8_C(0xff));
-  uint64_t x20 = (x3 >> 8);
-  uint8_t x21 = (uint8_t)(x3 & UINT8_C(0xff));
-  uint64_t x22 = (x20 >> 8);
-  uint8_t x23 = (uint8_t)(x20 & UINT8_C(0xff));
-  uint64_t x24 = (x22 >> 8);
-  uint8_t x25 = (uint8_t)(x22 & UINT8_C(0xff));
-  uint64_t x26 = (x24 >> 8);
-  uint8_t x27 = (uint8_t)(x24 & UINT8_C(0xff));
-  uint64_t x28 = (x26 >> 8);
-  uint8_t x29 = (uint8_t)(x26 & UINT8_C(0xff));
-  uint64_t x30 = (x28 >> 8);
-  uint8_t x31 = (uint8_t)(x28 & UINT8_C(0xff));
-  uint8_t x32 = (uint8_t)(x30 >> 8);
-  uint8_t x33 = (uint8_t)(x30 & UINT8_C(0xff));
-  uint8_t x34 = (uint8_t)(x32 & UINT8_C(0xff));
-  uint64_t x35 = (x2 >> 8);
-  uint8_t x36 = (uint8_t)(x2 & UINT8_C(0xff));
-  uint64_t x37 = (x35 >> 8);
-  uint8_t x38 = (uint8_t)(x35 & UINT8_C(0xff));
-  uint64_t x39 = (x37 >> 8);
-  uint8_t x40 = (uint8_t)(x37 & UINT8_C(0xff));
-  uint64_t x41 = (x39 >> 8);
-  uint8_t x42 = (uint8_t)(x39 & UINT8_C(0xff));
-  uint64_t x43 = (x41 >> 8);
-  uint8_t x44 = (uint8_t)(x41 & UINT8_C(0xff));
-  uint64_t x45 = (x43 >> 8);
-  uint8_t x46 = (uint8_t)(x43 & UINT8_C(0xff));
-  uint8_t x47 = (uint8_t)(x45 >> 8);
-  uint8_t x48 = (uint8_t)(x45 & UINT8_C(0xff));
-  uint8_t x49 = (uint8_t)(x47 & UINT8_C(0xff));
-  uint64_t x50 = (x1 >> 8);
-  uint8_t x51 = (uint8_t)(x1 & UINT8_C(0xff));
-  uint64_t x52 = (x50 >> 8);
-  uint8_t x53 = (uint8_t)(x50 & UINT8_C(0xff));
-  uint64_t x54 = (x52 >> 8);
-  uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff));
-  uint64_t x56 = (x54 >> 8);
-  uint8_t x57 = (uint8_t)(x54 & UINT8_C(0xff));
-  uint64_t x58 = (x56 >> 8);
-  uint8_t x59 = (uint8_t)(x56 & UINT8_C(0xff));
-  uint64_t x60 = (x58 >> 8);
-  uint8_t x61 = (uint8_t)(x58 & UINT8_C(0xff));
-  uint8_t x62 = (uint8_t)(x60 >> 8);
-  uint8_t x63 = (uint8_t)(x60 & UINT8_C(0xff));
-  out1[0] = x6;
-  out1[1] = x8;
-  out1[2] = x10;
-  out1[3] = x12;
-  out1[4] = x14;
-  out1[5] = x16;
-  out1[6] = x18;
-  out1[7] = x19;
-  out1[8] = x21;
-  out1[9] = x23;
-  out1[10] = x25;
-  out1[11] = x27;
-  out1[12] = x29;
-  out1[13] = x31;
-  out1[14] = x33;
-  out1[15] = x34;
-  out1[16] = x36;
-  out1[17] = x38;
-  out1[18] = x40;
-  out1[19] = x42;
-  out1[20] = x44;
-  out1[21] = x46;
-  out1[22] = x48;
-  out1[23] = x49;
-  out1[24] = x51;
-  out1[25] = x53;
-  out1[26] = x55;
-  out1[27] = x57;
-  out1[28] = x59;
-  out1[29] = x61;
-  out1[30] = x63;
-  out1[31] = x62;
+static FIAT_P256_FIAT_INLINE void fiat_p256_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint8_t x5;
+  uint64_t x6;
+  uint8_t x7;
+  uint64_t x8;
+  uint8_t x9;
+  uint64_t x10;
+  uint8_t x11;
+  uint64_t x12;
+  uint8_t x13;
+  uint64_t x14;
+  uint8_t x15;
+  uint64_t x16;
+  uint8_t x17;
+  uint8_t x18;
+  uint8_t x19;
+  uint64_t x20;
+  uint8_t x21;
+  uint64_t x22;
+  uint8_t x23;
+  uint64_t x24;
+  uint8_t x25;
+  uint64_t x26;
+  uint8_t x27;
+  uint64_t x28;
+  uint8_t x29;
+  uint64_t x30;
+  uint8_t x31;
+  uint8_t x32;
+  uint8_t x33;
+  uint64_t x34;
+  uint8_t x35;
+  uint64_t x36;
+  uint8_t x37;
+  uint64_t x38;
+  uint8_t x39;
+  uint64_t x40;
+  uint8_t x41;
+  uint64_t x42;
+  uint8_t x43;
+  uint64_t x44;
+  uint8_t x45;
+  uint8_t x46;
+  uint8_t x47;
+  uint64_t x48;
+  uint8_t x49;
+  uint64_t x50;
+  uint8_t x51;
+  uint64_t x52;
+  uint8_t x53;
+  uint64_t x54;
+  uint8_t x55;
+  uint64_t x56;
+  uint8_t x57;
+  uint64_t x58;
+  uint8_t x59;
+  uint8_t x60;
+  x1 = (arg1[3]);
+  x2 = (arg1[2]);
+  x3 = (arg1[1]);
+  x4 = (arg1[0]);
+  x5 = (uint8_t)(x4 & UINT8_C(0xff));
+  x6 = (x4 >> 8);
+  x7 = (uint8_t)(x6 & UINT8_C(0xff));
+  x8 = (x6 >> 8);
+  x9 = (uint8_t)(x8 & UINT8_C(0xff));
+  x10 = (x8 >> 8);
+  x11 = (uint8_t)(x10 & UINT8_C(0xff));
+  x12 = (x10 >> 8);
+  x13 = (uint8_t)(x12 & UINT8_C(0xff));
+  x14 = (x12 >> 8);
+  x15 = (uint8_t)(x14 & UINT8_C(0xff));
+  x16 = (x14 >> 8);
+  x17 = (uint8_t)(x16 & UINT8_C(0xff));
+  x18 = (uint8_t)(x16 >> 8);
+  x19 = (uint8_t)(x3 & UINT8_C(0xff));
+  x20 = (x3 >> 8);
+  x21 = (uint8_t)(x20 & UINT8_C(0xff));
+  x22 = (x20 >> 8);
+  x23 = (uint8_t)(x22 & UINT8_C(0xff));
+  x24 = (x22 >> 8);
+  x25 = (uint8_t)(x24 & UINT8_C(0xff));
+  x26 = (x24 >> 8);
+  x27 = (uint8_t)(x26 & UINT8_C(0xff));
+  x28 = (x26 >> 8);
+  x29 = (uint8_t)(x28 & UINT8_C(0xff));
+  x30 = (x28 >> 8);
+  x31 = (uint8_t)(x30 & UINT8_C(0xff));
+  x32 = (uint8_t)(x30 >> 8);
+  x33 = (uint8_t)(x2 & UINT8_C(0xff));
+  x34 = (x2 >> 8);
+  x35 = (uint8_t)(x34 & UINT8_C(0xff));
+  x36 = (x34 >> 8);
+  x37 = (uint8_t)(x36 & UINT8_C(0xff));
+  x38 = (x36 >> 8);
+  x39 = (uint8_t)(x38 & UINT8_C(0xff));
+  x40 = (x38 >> 8);
+  x41 = (uint8_t)(x40 & UINT8_C(0xff));
+  x42 = (x40 >> 8);
+  x43 = (uint8_t)(x42 & UINT8_C(0xff));
+  x44 = (x42 >> 8);
+  x45 = (uint8_t)(x44 & UINT8_C(0xff));
+  x46 = (uint8_t)(x44 >> 8);
+  x47 = (uint8_t)(x1 & UINT8_C(0xff));
+  x48 = (x1 >> 8);
+  x49 = (uint8_t)(x48 & UINT8_C(0xff));
+  x50 = (x48 >> 8);
+  x51 = (uint8_t)(x50 & UINT8_C(0xff));
+  x52 = (x50 >> 8);
+  x53 = (uint8_t)(x52 & UINT8_C(0xff));
+  x54 = (x52 >> 8);
+  x55 = (uint8_t)(x54 & UINT8_C(0xff));
+  x56 = (x54 >> 8);
+  x57 = (uint8_t)(x56 & UINT8_C(0xff));
+  x58 = (x56 >> 8);
+  x59 = (uint8_t)(x58 & UINT8_C(0xff));
+  x60 = (uint8_t)(x58 >> 8);
+  out1[0] = x5;
+  out1[1] = x7;
+  out1[2] = x9;
+  out1[3] = x11;
+  out1[4] = x13;
+  out1[5] = x15;
+  out1[6] = x17;
+  out1[7] = x18;
+  out1[8] = x19;
+  out1[9] = x21;
+  out1[10] = x23;
+  out1[11] = x25;
+  out1[12] = x27;
+  out1[13] = x29;
+  out1[14] = x31;
+  out1[15] = x32;
+  out1[16] = x33;
+  out1[17] = x35;
+  out1[18] = x37;
+  out1[19] = x39;
+  out1[20] = x41;
+  out1[21] = x43;
+  out1[22] = x45;
+  out1[23] = x46;
+  out1[24] = x47;
+  out1[25] = x49;
+  out1[26] = x51;
+  out1[27] = x53;
+  out1[28] = x55;
+  out1[29] = x57;
+  out1[30] = x59;
+  out1[31] = x60;
 }
 
 /*
- * The function fiat_p256_from_bytes deserializes a field element in the Montgomery domain from bytes in little-endian order.
+ * The function fiat_p256_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order.
+ *
  * Preconditions:
  *   0 ≤ bytes_eval arg1 < m
  * Postconditions:
@@ -1178,49 +1568,444 @@
  * Output Bounds:
  *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
  */
-static void fiat_p256_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) {
-  uint64_t x1 = ((uint64_t)(arg1[31]) << 56);
-  uint64_t x2 = ((uint64_t)(arg1[30]) << 48);
-  uint64_t x3 = ((uint64_t)(arg1[29]) << 40);
-  uint64_t x4 = ((uint64_t)(arg1[28]) << 32);
-  uint64_t x5 = ((uint64_t)(arg1[27]) << 24);
-  uint64_t x6 = ((uint64_t)(arg1[26]) << 16);
-  uint64_t x7 = ((uint64_t)(arg1[25]) << 8);
-  uint8_t x8 = (arg1[24]);
-  uint64_t x9 = ((uint64_t)(arg1[23]) << 56);
-  uint64_t x10 = ((uint64_t)(arg1[22]) << 48);
-  uint64_t x11 = ((uint64_t)(arg1[21]) << 40);
-  uint64_t x12 = ((uint64_t)(arg1[20]) << 32);
-  uint64_t x13 = ((uint64_t)(arg1[19]) << 24);
-  uint64_t x14 = ((uint64_t)(arg1[18]) << 16);
-  uint64_t x15 = ((uint64_t)(arg1[17]) << 8);
-  uint8_t x16 = (arg1[16]);
-  uint64_t x17 = ((uint64_t)(arg1[15]) << 56);
-  uint64_t x18 = ((uint64_t)(arg1[14]) << 48);
-  uint64_t x19 = ((uint64_t)(arg1[13]) << 40);
-  uint64_t x20 = ((uint64_t)(arg1[12]) << 32);
-  uint64_t x21 = ((uint64_t)(arg1[11]) << 24);
-  uint64_t x22 = ((uint64_t)(arg1[10]) << 16);
-  uint64_t x23 = ((uint64_t)(arg1[9]) << 8);
-  uint8_t x24 = (arg1[8]);
-  uint64_t x25 = ((uint64_t)(arg1[7]) << 56);
-  uint64_t x26 = ((uint64_t)(arg1[6]) << 48);
-  uint64_t x27 = ((uint64_t)(arg1[5]) << 40);
-  uint64_t x28 = ((uint64_t)(arg1[4]) << 32);
-  uint64_t x29 = ((uint64_t)(arg1[3]) << 24);
-  uint64_t x30 = ((uint64_t)(arg1[2]) << 16);
-  uint64_t x31 = ((uint64_t)(arg1[1]) << 8);
-  uint8_t x32 = (arg1[0]);
-  uint64_t x33 = (x32 + (x31 + (x30 + (x29 + (x28 + (x27 + (x26 + x25)))))));
-  uint64_t x34 = (x33 & UINT64_C(0xffffffffffffffff));
-  uint64_t x35 = (x8 + (x7 + (x6 + (x5 + (x4 + (x3 + (x2 + x1)))))));
-  uint64_t x36 = (x16 + (x15 + (x14 + (x13 + (x12 + (x11 + (x10 + x9)))))));
-  uint64_t x37 = (x24 + (x23 + (x22 + (x21 + (x20 + (x19 + (x18 + x17)))))));
-  uint64_t x38 = (x37 & UINT64_C(0xffffffffffffffff));
-  uint64_t x39 = (x36 & UINT64_C(0xffffffffffffffff));
-  out1[0] = x34;
-  out1[1] = x38;
-  out1[2] = x39;
-  out1[3] = x35;
+static FIAT_P256_FIAT_INLINE void fiat_p256_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) {
+  uint64_t x1;
+  uint64_t x2;
+  uint64_t x3;
+  uint64_t x4;
+  uint64_t x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint8_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  uint64_t x13;
+  uint64_t x14;
+  uint64_t x15;
+  uint8_t x16;
+  uint64_t x17;
+  uint64_t x18;
+  uint64_t x19;
+  uint64_t x20;
+  uint64_t x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint8_t x24;
+  uint64_t x25;
+  uint64_t x26;
+  uint64_t x27;
+  uint64_t x28;
+  uint64_t x29;
+  uint64_t x30;
+  uint64_t x31;
+  uint8_t x32;
+  uint64_t x33;
+  uint64_t x34;
+  uint64_t x35;
+  uint64_t x36;
+  uint64_t x37;
+  uint64_t x38;
+  uint64_t x39;
+  uint64_t x40;
+  uint64_t x41;
+  uint64_t x42;
+  uint64_t x43;
+  uint64_t x44;
+  uint64_t x45;
+  uint64_t x46;
+  uint64_t x47;
+  uint64_t x48;
+  uint64_t x49;
+  uint64_t x50;
+  uint64_t x51;
+  uint64_t x52;
+  uint64_t x53;
+  uint64_t x54;
+  uint64_t x55;
+  uint64_t x56;
+  uint64_t x57;
+  uint64_t x58;
+  uint64_t x59;
+  uint64_t x60;
+  x1 = ((uint64_t)(arg1[31]) << 56);
+  x2 = ((uint64_t)(arg1[30]) << 48);
+  x3 = ((uint64_t)(arg1[29]) << 40);
+  x4 = ((uint64_t)(arg1[28]) << 32);
+  x5 = ((uint64_t)(arg1[27]) << 24);
+  x6 = ((uint64_t)(arg1[26]) << 16);
+  x7 = ((uint64_t)(arg1[25]) << 8);
+  x8 = (arg1[24]);
+  x9 = ((uint64_t)(arg1[23]) << 56);
+  x10 = ((uint64_t)(arg1[22]) << 48);
+  x11 = ((uint64_t)(arg1[21]) << 40);
+  x12 = ((uint64_t)(arg1[20]) << 32);
+  x13 = ((uint64_t)(arg1[19]) << 24);
+  x14 = ((uint64_t)(arg1[18]) << 16);
+  x15 = ((uint64_t)(arg1[17]) << 8);
+  x16 = (arg1[16]);
+  x17 = ((uint64_t)(arg1[15]) << 56);
+  x18 = ((uint64_t)(arg1[14]) << 48);
+  x19 = ((uint64_t)(arg1[13]) << 40);
+  x20 = ((uint64_t)(arg1[12]) << 32);
+  x21 = ((uint64_t)(arg1[11]) << 24);
+  x22 = ((uint64_t)(arg1[10]) << 16);
+  x23 = ((uint64_t)(arg1[9]) << 8);
+  x24 = (arg1[8]);
+  x25 = ((uint64_t)(arg1[7]) << 56);
+  x26 = ((uint64_t)(arg1[6]) << 48);
+  x27 = ((uint64_t)(arg1[5]) << 40);
+  x28 = ((uint64_t)(arg1[4]) << 32);
+  x29 = ((uint64_t)(arg1[3]) << 24);
+  x30 = ((uint64_t)(arg1[2]) << 16);
+  x31 = ((uint64_t)(arg1[1]) << 8);
+  x32 = (arg1[0]);
+  x33 = (x31 + (uint64_t)x32);
+  x34 = (x30 + x33);
+  x35 = (x29 + x34);
+  x36 = (x28 + x35);
+  x37 = (x27 + x36);
+  x38 = (x26 + x37);
+  x39 = (x25 + x38);
+  x40 = (x23 + (uint64_t)x24);
+  x41 = (x22 + x40);
+  x42 = (x21 + x41);
+  x43 = (x20 + x42);
+  x44 = (x19 + x43);
+  x45 = (x18 + x44);
+  x46 = (x17 + x45);
+  x47 = (x15 + (uint64_t)x16);
+  x48 = (x14 + x47);
+  x49 = (x13 + x48);
+  x50 = (x12 + x49);
+  x51 = (x11 + x50);
+  x52 = (x10 + x51);
+  x53 = (x9 + x52);
+  x54 = (x7 + (uint64_t)x8);
+  x55 = (x6 + x54);
+  x56 = (x5 + x55);
+  x57 = (x4 + x56);
+  x58 = (x3 + x57);
+  x59 = (x2 + x58);
+  x60 = (x1 + x59);
+  out1[0] = x39;
+  out1[1] = x46;
+  out1[2] = x53;
+  out1[3] = x60;
 }
 
+/*
+ * The function fiat_p256_set_one returns the field element one in the Montgomery domain.
+ *
+ * Postconditions:
+ *   eval (from_montgomery out1) mod m = 1 mod m
+ *   0 ≤ eval out1 < m
+ *
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_set_one(fiat_p256_montgomery_domain_field_element out1) {
+  out1[0] = 0x1;
+  out1[1] = UINT64_C(0xffffffff00000000);
+  out1[2] = UINT64_C(0xffffffffffffffff);
+  out1[3] = UINT32_C(0xfffffffe);
+}
+
+/*
+ * The function fiat_p256_msat returns the saturated representation of the prime modulus.
+ *
+ * Postconditions:
+ *   twos_complement_eval out1 = m
+ *   0 ≤ eval out1 < m
+ *
+ * Output Bounds:
+ *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_msat(uint64_t out1[5]) {
+  out1[0] = UINT64_C(0xffffffffffffffff);
+  out1[1] = UINT32_C(0xffffffff);
+  out1[2] = 0x0;
+  out1[3] = UINT64_C(0xffffffff00000001);
+  out1[4] = 0x0;
+}
+
+/*
+ * The function fiat_p256_divstep computes a divstep.
+ *
+ * Preconditions:
+ *   0 ≤ eval arg4 < m
+ *   0 ≤ eval arg5 < m
+ * Postconditions:
+ *   out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1)
+ *   twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2)
+ *   twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋)
+ *   eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m)
+ *   eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m)
+ *   0 ≤ eval out5 < m
+ *   0 ≤ eval out5 < m
+ *   0 ≤ eval out2 < m
+ *   0 ≤ eval out3 < m
+ *
+ * Input Bounds:
+ *   arg1: [0x0 ~> 0xffffffffffffffff]
+ *   arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ * Output Bounds:
+ *   out1: [0x0 ~> 0xffffffffffffffff]
+ *   out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ *   out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_divstep(uint64_t* out1, uint64_t out2[5], uint64_t out3[5], uint64_t out4[4], uint64_t out5[4], uint64_t arg1, const uint64_t arg2[5], const uint64_t arg3[5], const uint64_t arg4[4], const uint64_t arg5[4]) {
+  uint64_t x1;
+  fiat_p256_uint1 x2;
+  fiat_p256_uint1 x3;
+  uint64_t x4;
+  fiat_p256_uint1 x5;
+  uint64_t x6;
+  uint64_t x7;
+  uint64_t x8;
+  uint64_t x9;
+  uint64_t x10;
+  uint64_t x11;
+  uint64_t x12;
+  fiat_p256_uint1 x13;
+  uint64_t x14;
+  fiat_p256_uint1 x15;
+  uint64_t x16;
+  fiat_p256_uint1 x17;
+  uint64_t x18;
+  fiat_p256_uint1 x19;
+  uint64_t x20;
+  fiat_p256_uint1 x21;
+  uint64_t x22;
+  uint64_t x23;
+  uint64_t x24;
+  uint64_t x25;
+  uint64_t x26;
+  uint64_t x27;
+  uint64_t x28;
+  uint64_t x29;
+  uint64_t x30;
+  uint64_t x31;
+  fiat_p256_uint1 x32;
+  uint64_t x33;
+  fiat_p256_uint1 x34;
+  uint64_t x35;
+  fiat_p256_uint1 x36;
+  uint64_t x37;
+  fiat_p256_uint1 x38;
+  uint64_t x39;
+  fiat_p256_uint1 x40;
+  uint64_t x41;
+  fiat_p256_uint1 x42;
+  uint64_t x43;
+  fiat_p256_uint1 x44;
+  uint64_t x45;
+  fiat_p256_uint1 x46;
+  uint64_t x47;
+  fiat_p256_uint1 x48;
+  uint64_t x49;
+  uint64_t x50;
+  uint64_t x51;
+  uint64_t x52;
+  uint64_t x53;
+  fiat_p256_uint1 x54;
+  uint64_t x55;
+  fiat_p256_uint1 x56;
+  uint64_t x57;
+  fiat_p256_uint1 x58;
+  uint64_t x59;
+  fiat_p256_uint1 x60;
+  uint64_t x61;
+  uint64_t x62;
+  fiat_p256_uint1 x63;
+  uint64_t x64;
+  fiat_p256_uint1 x65;
+  uint64_t x66;
+  fiat_p256_uint1 x67;
+  uint64_t x68;
+  fiat_p256_uint1 x69;
+  uint64_t x70;
+  uint64_t x71;
+  uint64_t x72;
+  uint64_t x73;
+  fiat_p256_uint1 x74;
+  uint64_t x75;
+  uint64_t x76;
+  uint64_t x77;
+  uint64_t x78;
+  uint64_t x79;
+  uint64_t x80;
+  fiat_p256_uint1 x81;
+  uint64_t x82;
+  fiat_p256_uint1 x83;
+  uint64_t x84;
+  fiat_p256_uint1 x85;
+  uint64_t x86;
+  fiat_p256_uint1 x87;
+  uint64_t x88;
+  fiat_p256_uint1 x89;
+  uint64_t x90;
+  uint64_t x91;
+  uint64_t x92;
+  uint64_t x93;
+  uint64_t x94;
+  fiat_p256_uint1 x95;
+  uint64_t x96;
+  fiat_p256_uint1 x97;
+  uint64_t x98;
+  fiat_p256_uint1 x99;
+  uint64_t x100;
+  fiat_p256_uint1 x101;
+  uint64_t x102;
+  fiat_p256_uint1 x103;
+  uint64_t x104;
+  fiat_p256_uint1 x105;
+  uint64_t x106;
+  fiat_p256_uint1 x107;
+  uint64_t x108;
+  fiat_p256_uint1 x109;
+  uint64_t x110;
+  fiat_p256_uint1 x111;
+  uint64_t x112;
+  fiat_p256_uint1 x113;
+  uint64_t x114;
+  uint64_t x115;
+  uint64_t x116;
+  uint64_t x117;
+  uint64_t x118;
+  uint64_t x119;
+  uint64_t x120;
+  uint64_t x121;
+  uint64_t x122;
+  uint64_t x123;
+  uint64_t x124;
+  uint64_t x125;
+  uint64_t x126;
+  fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (~arg1), 0x1);
+  x3 = (fiat_p256_uint1)((fiat_p256_uint1)(x1 >> 63) & (fiat_p256_uint1)((arg3[0]) & 0x1));
+  fiat_p256_addcarryx_u64(&x4, &x5, 0x0, (~arg1), 0x1);
+  fiat_p256_cmovznz_u64(&x6, x3, arg1, x4);
+  fiat_p256_cmovznz_u64(&x7, x3, (arg2[0]), (arg3[0]));
+  fiat_p256_cmovznz_u64(&x8, x3, (arg2[1]), (arg3[1]));
+  fiat_p256_cmovznz_u64(&x9, x3, (arg2[2]), (arg3[2]));
+  fiat_p256_cmovznz_u64(&x10, x3, (arg2[3]), (arg3[3]));
+  fiat_p256_cmovznz_u64(&x11, x3, (arg2[4]), (arg3[4]));
+  fiat_p256_addcarryx_u64(&x12, &x13, 0x0, 0x1, (~(arg2[0])));
+  fiat_p256_addcarryx_u64(&x14, &x15, x13, 0x0, (~(arg2[1])));
+  fiat_p256_addcarryx_u64(&x16, &x17, x15, 0x0, (~(arg2[2])));
+  fiat_p256_addcarryx_u64(&x18, &x19, x17, 0x0, (~(arg2[3])));
+  fiat_p256_addcarryx_u64(&x20, &x21, x19, 0x0, (~(arg2[4])));
+  fiat_p256_cmovznz_u64(&x22, x3, (arg3[0]), x12);
+  fiat_p256_cmovznz_u64(&x23, x3, (arg3[1]), x14);
+  fiat_p256_cmovznz_u64(&x24, x3, (arg3[2]), x16);
+  fiat_p256_cmovznz_u64(&x25, x3, (arg3[3]), x18);
+  fiat_p256_cmovznz_u64(&x26, x3, (arg3[4]), x20);
+  fiat_p256_cmovznz_u64(&x27, x3, (arg4[0]), (arg5[0]));
+  fiat_p256_cmovznz_u64(&x28, x3, (arg4[1]), (arg5[1]));
+  fiat_p256_cmovznz_u64(&x29, x3, (arg4[2]), (arg5[2]));
+  fiat_p256_cmovznz_u64(&x30, x3, (arg4[3]), (arg5[3]));
+  fiat_p256_addcarryx_u64(&x31, &x32, 0x0, x27, x27);
+  fiat_p256_addcarryx_u64(&x33, &x34, x32, x28, x28);
+  fiat_p256_addcarryx_u64(&x35, &x36, x34, x29, x29);
+  fiat_p256_addcarryx_u64(&x37, &x38, x36, x30, x30);
+  fiat_p256_subborrowx_u64(&x39, &x40, 0x0, x31, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x41, &x42, x40, x33, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x43, &x44, x42, x35, 0x0);
+  fiat_p256_subborrowx_u64(&x45, &x46, x44, x37, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x47, &x48, x46, x38, 0x0);
+  x49 = (arg4[3]);
+  x50 = (arg4[2]);
+  x51 = (arg4[1]);
+  x52 = (arg4[0]);
+  fiat_p256_subborrowx_u64(&x53, &x54, 0x0, 0x0, x52);
+  fiat_p256_subborrowx_u64(&x55, &x56, x54, 0x0, x51);
+  fiat_p256_subborrowx_u64(&x57, &x58, x56, 0x0, x50);
+  fiat_p256_subborrowx_u64(&x59, &x60, x58, 0x0, x49);
+  fiat_p256_cmovznz_u64(&x61, x60, 0x0, UINT64_C(0xffffffffffffffff));
+  fiat_p256_addcarryx_u64(&x62, &x63, 0x0, x53, x61);
+  fiat_p256_addcarryx_u64(&x64, &x65, x63, x55, (x61 & UINT32_C(0xffffffff)));
+  fiat_p256_addcarryx_u64(&x66, &x67, x65, x57, 0x0);
+  fiat_p256_addcarryx_u64(&x68, &x69, x67, x59, (x61 & UINT64_C(0xffffffff00000001)));
+  fiat_p256_cmovznz_u64(&x70, x3, (arg5[0]), x62);
+  fiat_p256_cmovznz_u64(&x71, x3, (arg5[1]), x64);
+  fiat_p256_cmovznz_u64(&x72, x3, (arg5[2]), x66);
+  fiat_p256_cmovznz_u64(&x73, x3, (arg5[3]), x68);
+  x74 = (fiat_p256_uint1)(x22 & 0x1);
+  fiat_p256_cmovznz_u64(&x75, x74, 0x0, x7);
+  fiat_p256_cmovznz_u64(&x76, x74, 0x0, x8);
+  fiat_p256_cmovznz_u64(&x77, x74, 0x0, x9);
+  fiat_p256_cmovznz_u64(&x78, x74, 0x0, x10);
+  fiat_p256_cmovznz_u64(&x79, x74, 0x0, x11);
+  fiat_p256_addcarryx_u64(&x80, &x81, 0x0, x22, x75);
+  fiat_p256_addcarryx_u64(&x82, &x83, x81, x23, x76);
+  fiat_p256_addcarryx_u64(&x84, &x85, x83, x24, x77);
+  fiat_p256_addcarryx_u64(&x86, &x87, x85, x25, x78);
+  fiat_p256_addcarryx_u64(&x88, &x89, x87, x26, x79);
+  fiat_p256_cmovznz_u64(&x90, x74, 0x0, x27);
+  fiat_p256_cmovznz_u64(&x91, x74, 0x0, x28);
+  fiat_p256_cmovznz_u64(&x92, x74, 0x0, x29);
+  fiat_p256_cmovznz_u64(&x93, x74, 0x0, x30);
+  fiat_p256_addcarryx_u64(&x94, &x95, 0x0, x70, x90);
+  fiat_p256_addcarryx_u64(&x96, &x97, x95, x71, x91);
+  fiat_p256_addcarryx_u64(&x98, &x99, x97, x72, x92);
+  fiat_p256_addcarryx_u64(&x100, &x101, x99, x73, x93);
+  fiat_p256_subborrowx_u64(&x102, &x103, 0x0, x94, UINT64_C(0xffffffffffffffff));
+  fiat_p256_subborrowx_u64(&x104, &x105, x103, x96, UINT32_C(0xffffffff));
+  fiat_p256_subborrowx_u64(&x106, &x107, x105, x98, 0x0);
+  fiat_p256_subborrowx_u64(&x108, &x109, x107, x100, UINT64_C(0xffffffff00000001));
+  fiat_p256_subborrowx_u64(&x110, &x111, x109, x101, 0x0);
+  fiat_p256_addcarryx_u64(&x112, &x113, 0x0, x6, 0x1);
+  x114 = ((x80 >> 1) | ((x82 << 63) & UINT64_C(0xffffffffffffffff)));
+  x115 = ((x82 >> 1) | ((x84 << 63) & UINT64_C(0xffffffffffffffff)));
+  x116 = ((x84 >> 1) | ((x86 << 63) & UINT64_C(0xffffffffffffffff)));
+  x117 = ((x86 >> 1) | ((x88 << 63) & UINT64_C(0xffffffffffffffff)));
+  x118 = ((x88 & UINT64_C(0x8000000000000000)) | (x88 >> 1));
+  fiat_p256_cmovznz_u64(&x119, x48, x39, x31);
+  fiat_p256_cmovznz_u64(&x120, x48, x41, x33);
+  fiat_p256_cmovznz_u64(&x121, x48, x43, x35);
+  fiat_p256_cmovznz_u64(&x122, x48, x45, x37);
+  fiat_p256_cmovznz_u64(&x123, x111, x102, x94);
+  fiat_p256_cmovznz_u64(&x124, x111, x104, x96);
+  fiat_p256_cmovznz_u64(&x125, x111, x106, x98);
+  fiat_p256_cmovznz_u64(&x126, x111, x108, x100);
+  *out1 = x112;
+  out2[0] = x7;
+  out2[1] = x8;
+  out2[2] = x9;
+  out2[3] = x10;
+  out2[4] = x11;
+  out3[0] = x114;
+  out3[1] = x115;
+  out3[2] = x116;
+  out3[3] = x117;
+  out3[4] = x118;
+  out4[0] = x119;
+  out4[1] = x120;
+  out4[2] = x121;
+  out4[3] = x122;
+  out5[0] = x123;
+  out5[1] = x124;
+  out5[2] = x125;
+  out5[3] = x126;
+}
+
+/*
+ * The function fiat_p256_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form).
+ *
+ * Postconditions:
+ *   eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋)
+ *   0 ≤ eval out1 < m
+ *
+ * Output Bounds:
+ *   out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
+ */
+static FIAT_P256_FIAT_INLINE void fiat_p256_divstep_precomp(uint64_t out1[4]) {
+  out1[0] = UINT64_C(0x67ffffffb8000000);
+  out1[1] = UINT64_C(0xc000000038000000);
+  out1[2] = UINT64_C(0xd80000007fffffff);
+  out1[3] = UINT64_C(0x2fffffffffffffff);
+}
diff --git a/src/tool/CMakeLists.txt b/src/tool/CMakeLists.txt
index a591b7d..f98e96e 100644
--- a/src/tool/CMakeLists.txt
+++ b/src/tool/CMakeLists.txt
@@ -21,6 +21,7 @@
   tool.cc
   transport_common.cc
 )
+install(TARGETS bssl DESTINATION ${CMAKE_INSTALL_BINDIR})
 
 add_dependencies(bssl global_target)
 
diff --git a/src/tool/digest.cc b/src/tool/digest.cc
index 3c8fd5a..d810928 100644
--- a/src/tool/digest.cc
+++ b/src/tool/digest.cc
@@ -226,7 +226,6 @@
   unsigned bad_lines = 0;
   unsigned parsed_lines = 0;
   unsigned error_lines = 0;
-  unsigned bad_hash_lines = 0;
   unsigned line_no = 0;
   bool ok = true;
   bool draining_overlong_line = false;
@@ -297,7 +296,6 @@
     }
 
     if (calculated_hex_digest != std::string(line, hex_size)) {
-      bad_hash_lines++;
       if (!args.status) {
         printf("%s: FAILED\n", target_filename.c_str());
       }
diff --git a/src/tool/server.cc b/src/tool/server.cc
index 18b692d..ebecee0 100644
--- a/src/tool/server.cc
+++ b/src/tool/server.cc
@@ -132,21 +132,37 @@
 
 static bssl::UniquePtr<X509> MakeSelfSignedCert(EVP_PKEY *evp_pkey,
                                                 const int valid_days) {
+  uint64_t serial;
   bssl::UniquePtr<X509> x509(X509_new());
-  uint32_t serial;
-  RAND_bytes(reinterpret_cast<uint8_t*>(&serial), sizeof(serial));
-  ASN1_INTEGER_set(X509_get_serialNumber(x509.get()), serial >> 1);
-  X509_gmtime_adj(X509_get_notBefore(x509.get()), 0);
-  X509_gmtime_adj(X509_get_notAfter(x509.get()), 60 * 60 * 24 * valid_days);
+  if (!x509 ||  //
+      !X509_set_version(x509.get(), X509_VERSION_3) ||
+      !RAND_bytes(reinterpret_cast<uint8_t *>(&serial), sizeof(serial)) ||
+      !ASN1_INTEGER_set_uint64(X509_get_serialNumber(x509.get()), serial) ||
+      !X509_gmtime_adj(X509_get_notBefore(x509.get()), 0) ||
+      !X509_gmtime_adj(X509_get_notAfter(x509.get()),
+                       60 * 60 * 24 * valid_days)) {
+    return nullptr;
+  }
 
-  X509_NAME* subject = X509_get_subject_name(x509.get());
-  X509_NAME_add_entry_by_txt(subject, "C", MBSTRING_ASC,
-                             reinterpret_cast<const uint8_t *>("US"), -1, -1,
-                             0);
-  X509_NAME_add_entry_by_txt(subject, "O", MBSTRING_ASC,
-                             reinterpret_cast<const uint8_t *>("BoringSSL"), -1,
-                             -1, 0);
-  X509_set_issuer_name(x509.get(), subject);
+  X509_NAME *subject = X509_get_subject_name(x509.get());
+  if (!X509_NAME_add_entry_by_txt(subject, "C", MBSTRING_ASC,
+                                  reinterpret_cast<const uint8_t *>("US"), -1,
+                                  -1, 0) ||
+      !X509_NAME_add_entry_by_txt(
+          subject, "O", MBSTRING_ASC,
+          reinterpret_cast<const uint8_t *>("BoringSSL"), -1, -1, 0) ||
+      !X509_set_issuer_name(x509.get(), subject)) {
+    return nullptr;
+  }
+
+  // macOS requires an explicit EKU extension.
+  bssl::UniquePtr<STACK_OF(ASN1_OBJECT)> ekus(sk_ASN1_OBJECT_new_null());
+  if (!ekus ||
+      !sk_ASN1_OBJECT_push(ekus.get(), OBJ_nid2obj(NID_server_auth)) ||
+      !X509_add1_ext_i2d(x509.get(), NID_ext_key_usage, ekus.get(), /*crit=*/1,
+                         /*flags=*/0)) {
+    return nullptr;
+  }
 
   if (!X509_set_pubkey(x509.get(), evp_pkey)) {
     fprintf(stderr, "Failed to set public key.\n");
diff --git a/src/tool/speed.cc b/src/tool/speed.cc
index b91a4ce..c12ebb2 100644
--- a/src/tool/speed.cc
+++ b/src/tool/speed.cc
@@ -41,6 +41,7 @@
 #include <openssl/nid.h>
 #include <openssl/rand.h>
 #include <openssl/rsa.h>
+#include <openssl/siphash.h>
 #include <openssl/trust_token.h>
 
 #if defined(OPENSSL_WINDOWS)
@@ -561,20 +562,20 @@
 static bool SpeedHashChunk(const EVP_MD *md, std::string name,
                            size_t chunk_len) {
   bssl::ScopedEVP_MD_CTX ctx;
-  uint8_t scratch[16384];
+  uint8_t input[16384] = {0};
 
-  if (chunk_len > sizeof(scratch)) {
+  if (chunk_len > sizeof(input)) {
     return false;
   }
 
   name += ChunkLenSuffix(chunk_len);
   TimeResults results;
-  if (!TimeFunction(&results, [&ctx, md, chunk_len, &scratch]() -> bool {
+  if (!TimeFunction(&results, [&ctx, md, chunk_len, &input]() -> bool {
         uint8_t digest[EVP_MAX_MD_SIZE];
         unsigned int md_len;
 
         return EVP_DigestInit_ex(ctx.get(), md, NULL /* ENGINE */) &&
-               EVP_DigestUpdate(ctx.get(), scratch, chunk_len) &&
+               EVP_DigestUpdate(ctx.get(), input, chunk_len) &&
                EVP_DigestFinal_ex(ctx.get(), digest, &md_len);
       })) {
     fprintf(stderr, "EVP_DigestInit_ex failed.\n");
@@ -1035,6 +1036,29 @@
   return true;
 }
 
+static bool SpeedSipHash(const std::string &selected) {
+  if (!selected.empty() && selected.find("siphash") == std::string::npos) {
+    return true;
+  }
+
+  uint64_t key[2] = {0};
+  for (size_t len : g_chunk_lengths) {
+    std::vector<uint8_t> input(len);
+    TimeResults results;
+    if (!TimeFunction(&results, [&]() -> bool {
+          SIPHASH_24(key, input.data(), input.size());
+          return true;
+        })) {
+      fprintf(stderr, "SIPHASH_24 failed.\n");
+      ERR_print_errors_fp(stderr);
+      return false;
+    }
+    results.PrintWithBytes("SipHash-2-4" + ChunkLenSuffix(len), len);
+  }
+
+  return true;
+}
+
 static TRUST_TOKEN_PRETOKEN *trust_token_pretoken_dup(
     TRUST_TOKEN_PRETOKEN *in) {
   TRUST_TOKEN_PRETOKEN *out =
@@ -1434,7 +1458,8 @@
                        TRUST_TOKEN_experiment_v2_pmb(), 1, selected) ||
       !SpeedTrustToken("TrustToken-Exp2PMB-Batch10",
                        TRUST_TOKEN_experiment_v2_pmb(), 10, selected) ||
-      !SpeedBase64(selected)) {
+      !SpeedBase64(selected) ||
+      !SpeedSipHash(selected)) {
     return false;
   }
 #if defined(BORINGSSL_FIPS)
diff --git a/src/tool/transport_common.cc b/src/tool/transport_common.cc
index cba3c7b..991c808 100644
--- a/src/tool/transport_common.cc
+++ b/src/tool/transport_common.cc
@@ -306,13 +306,13 @@
   const uint8_t *next_proto;
   unsigned next_proto_len;
   SSL_get0_next_proto_negotiated(ssl, &next_proto, &next_proto_len);
-  BIO_printf(bio, "  Next protocol negotiated: %.*s\n", next_proto_len,
-             next_proto);
+  BIO_printf(bio, "  Next protocol negotiated: %.*s\n",
+             static_cast<int>(next_proto_len), next_proto);
 
   const uint8_t *alpn;
   unsigned alpn_len;
   SSL_get0_alpn_selected(ssl, &alpn, &alpn_len);
-  BIO_printf(bio, "  ALPN protocol: %.*s\n", alpn_len, alpn);
+  BIO_printf(bio, "  ALPN protocol: %.*s\n", static_cast<int>(alpn_len), alpn);
 
   const char *host_name = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
   if (host_name != nullptr && SSL_is_server(ssl)) {
diff --git a/src/util/BUILD.toplevel b/src/util/BUILD.toplevel
index 65e0cdc..1ec2bdf 100644
--- a/src/util/BUILD.toplevel
+++ b/src/util/BUILD.toplevel
@@ -18,10 +18,11 @@
     "crypto_headers",
     "crypto_internal_headers",
     "crypto_sources",
+    "crypto_sources_apple_aarch64",
+    "crypto_sources_apple_x86_64",
     "crypto_sources_linux_aarch64",
     "crypto_sources_linux_ppc64le",
     "crypto_sources_linux_x86_64",
-    "crypto_sources_mac_x86_64",
     "fips_fragments",
     "ssl_headers",
     "ssl_internal_headers",
@@ -36,52 +37,42 @@
 
 config_setting(
     name = "linux_aarch64",
-    values = {"cpu": "aarch64"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:aarch64",
+    ],
 )
 
 config_setting(
     name = "linux_x86_64",
-    values = {"cpu": "k8"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:x86_64",
+    ],
 )
 
 config_setting(
     name = "linux_ppc64le",
-    values = {"cpu": "ppc"},
+    constraint_values = [
+        "@platforms//os:linux",
+        "@platforms//cpu:ppc",
+    ],
 )
 
 config_setting(
-    name = "mac_x86_64",
-    values = {"cpu": "darwin"},
+    name = "macos_aarch64",
+    constraint_values = [
+        "@platforms//os:macos",
+        "@platforms//cpu:aarch64",
+    ],
 )
 
 config_setting(
-    name = "windows_x86_64",
-    values = {"cpu": "x64_windows"},
-)
-
-config_setting(
-    name = "android_legacy",
-    values = {"crosstool_top": "//external:android/crosstool"},
-)
-
-config_setting(
-    name = "android_stlport",
-    values = {"crosstool_top": "@androidndk//:toolchain-stlport"},
-)
-
-config_setting(
-    name = "android_libcpp",
-    values = {"crosstool_top": "@androidndk//:toolchain-libcpp"},
-)
-
-config_setting(
-    name = "android_gnu_libstdcpp",
-    values = {"crosstool_top": "@androidndk//:toolchain-gnu-libstdcpp"},
-)
-
-config_setting(
-    name = "android_default",
-    values = {"crosstool_top": "@androidndk//:default_crosstool"},
+    name = "macos_x86_64",
+    constraint_values = [
+        "@platforms//os:macos",
+        "@platforms//cpu:x86_64",
+    ],
 )
 
 posix_copts = [
@@ -89,9 +80,6 @@
     # ensure that binaries can be built with non-executable stack.
     "-Wa,--noexecstack",
 
-    # This is needed on Linux systems (at least) to get rwlock in pthread.
-    "-D_XOPEN_SOURCE=700",
-
     # This list of warnings should match those in the top-level CMakeLists.txt.
     "-Wall",
     "-Werror",
@@ -101,32 +89,39 @@
     "-Wwrite-strings",
     "-Wshadow",
     "-fno-common",
+]
 
-    # Modern build environments should be able to set this to use atomic
-    # operations for reference counting rather than locks. However, it's
-    # known not to work on some Android builds.
-    # "-DOPENSSL_C11_ATOMIC",
+linux_copts = posix_copts + [
+    # This is needed on Linux systems (at least) to get rwlock in pthread, but
+    # it should not be set on Apple platforms, where it instead disables APIs
+    # we use. See compat(5) and sys/cdefs.h.
+    "-D_XOPEN_SOURCE=700",
 ]
 
 boringssl_copts = select({
-    ":linux_aarch64": posix_copts,
-    ":linux_ppc64le": posix_copts,
-    ":linux_x86_64": posix_copts,
-    ":mac_x86_64": posix_copts,
-    ":windows_x86_64": [
-        "-DWIN32_LEAN_AND_MEAN",
-        "-DOPENSSL_NO_ASM",
-    ],
-    "//conditions:default": ["-DOPENSSL_NO_ASM"],
+    "@platforms//os:linux": linux_copts,
+    "@platforms//os:macos": posix_copts,
+    "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"],
+    "//conditions:default": [],
 })
 
+# These selects must be kept in sync.
 crypto_sources_asm = select({
     ":linux_aarch64": crypto_sources_linux_aarch64,
     ":linux_ppc64le": crypto_sources_linux_ppc64le,
     ":linux_x86_64": crypto_sources_linux_x86_64,
-    ":mac_x86_64": crypto_sources_mac_x86_64,
+    ":macos_aarch64": crypto_sources_apple_aarch64,
+    ":macos_x86_64": crypto_sources_apple_x86_64,
     "//conditions:default": [],
 })
+boringssl_copts += select({
+    ":linux_aarch64": [],
+    ":linux_ppc64le": [],
+    ":linux_x86_64": [],
+    ":macos_aarch64": [],
+    ":macos_x86_64": [],
+    "//conditions:default": ["-DOPENSSL_NO_ASM"],
+})
 
 # For C targets only (not C++), compile with C11 support.
 posix_copts_c11 = [
@@ -137,24 +132,20 @@
 ]
 
 boringssl_copts_c11 = boringssl_copts + select({
-    ":linux_aarch64": posix_copts_c11,
-    ":linux_ppc64le": posix_copts_c11,
-    ":linux_x86_64": posix_copts_c11,
-    ":mac_x86_64": posix_copts_c11,
+    "@platforms//os:linux": posix_copts_c11,
+    "@platforms//os:macos": posix_copts_c11,
     "//conditions:default": [],
 })
 
-# For C++ targets only (not C), compile with C++11 support.
+# For C++ targets only (not C), compile with C++14 support.
 posix_copts_cxx = [
-    "-std=c++11",
+    "-std=c++14",
     "-Wmissing-declarations",
 ]
 
 boringssl_copts_cxx = boringssl_copts + select({
-    ":linux_aarch64": posix_copts_cxx,
-    ":linux_ppc64le": posix_copts_cxx,
-    ":linux_x86_64": posix_copts_cxx,
-    ":mac_x86_64": posix_copts_cxx,
+    "@platforms//os:linux": posix_copts_cxx,
+    "@platforms//os:macos": posix_copts_cxx,
     "//conditions:default": [],
 })
 
@@ -167,13 +158,9 @@
     linkopts = select({
         # Android supports pthreads, but does not provide a libpthread
         # to link against.
-        ":android_legacy": [],
-        ":android_stlport": [],
-        ":android_libcpp": [],
-        ":android_gnu_libstdcpp": [],
-        ":android_default": [],
-        ":mac_x86_64": [],
-        ":windows_x86_64": ["-defaultlib:advapi32.lib"],
+        "@platforms//os:android": [],
+        "@platforms//os:macos": [],
+        "@platforms//os:windows": ["-defaultlib:advapi32.lib"],
         "//conditions:default": ["-lpthread"],
     }),
     visibility = ["//visibility:public"],
diff --git a/src/util/all_tests.go b/src/util/all_tests.go
index 884da26..4f484f3 100644
--- a/src/util/all_tests.go
+++ b/src/util/all_tests.go
@@ -15,12 +15,10 @@
 package main
 
 import (
-	"bufio"
 	"bytes"
 	"errors"
 	"flag"
 	"fmt"
-	"math/rand"
 	"os"
 	"os/exec"
 	"path"
@@ -175,11 +173,17 @@
 	} else {
 		cmd = exec.Command(prog, args...)
 	}
-	if test.Env != nil {
+	if test.Env != nil || test.numShards != 0 {
 		cmd.Env = make([]string, len(os.Environ()))
 		copy(cmd.Env, os.Environ())
+	}
+	if test.Env != nil {
 		cmd.Env = append(cmd.Env, test.Env...)
 	}
+	if test.numShards != 0 {
+		cmd.Env = append(cmd.Env, fmt.Sprintf("GTEST_SHARD_INDEX=%d", test.shard))
+		cmd.Env = append(cmd.Env, fmt.Sprintf("GTEST_TOTAL_SHARDS=%d", test.numShards))
+	}
 	var outBuf bytes.Buffer
 	cmd.Stdout = &outBuf
 	cmd.Stderr = &outBuf
@@ -265,7 +269,7 @@
 }
 
 func (t test) shortName() string {
-	return t.Cmd[0] + t.shardMsg() + t.cpuMsg() + t.envMsg()
+	return strings.Join(t.Cmd, " ") + t.shardMsg() + t.cpuMsg() + t.envMsg()
 }
 
 func SpaceIf(returnSpace bool) string {
@@ -276,7 +280,7 @@
 }
 
 func (t test) longName() string {
-	return strings.Join(t.Env, " ") + SpaceIf(len(t.Env) != 0) + strings.Join(t.Cmd, " ") + t.cpuMsg()
+	return strings.Join(t.Env, " ") + SpaceIf(len(t.Env) != 0) + strings.Join(t.Cmd, " ") + t.shardMsg() + t.cpuMsg()
 }
 
 func (t test) shardMsg() string {
@@ -313,70 +317,11 @@
 		return []test{t}, nil
 	}
 
-	prog := path.Join(*buildDir, t.Cmd[0])
-	cmd := exec.Command(prog, "--gtest_list_tests")
-	var stdout bytes.Buffer
-	cmd.Stdout = &stdout
-	if err := cmd.Start(); err != nil {
-		return nil, err
-	}
-	if err := cmd.Wait(); err != nil {
-		return nil, err
-	}
-
-	var group string
-	var tests []string
-	scanner := bufio.NewScanner(&stdout)
-	for scanner.Scan() {
-		line := scanner.Text()
-
-		// Remove the parameter comment and trailing space.
-		if idx := strings.Index(line, "#"); idx >= 0 {
-			line = line[:idx]
-		}
-		line = strings.TrimSpace(line)
-		if len(line) == 0 {
-			continue
-		}
-
-		if line[len(line)-1] == '.' {
-			group = line
-			continue
-		}
-
-		if len(group) == 0 {
-			return nil, fmt.Errorf("found test case %q without group", line)
-		}
-		tests = append(tests, group+line)
-	}
-
-	const testsPerShard = 20
-	if len(tests) <= testsPerShard {
-		return []test{t}, nil
-	}
-
-	// Slow tests which process large test vector files tend to be grouped
-	// together, so shuffle the order.
-	shuffled := make([]string, len(tests))
-	perm := rand.Perm(len(tests))
-	for i, j := range perm {
-		shuffled[i] = tests[j]
-	}
-
-	var shards []test
-	for i := 0; i < len(shuffled); i += testsPerShard {
-		n := len(shuffled) - i
-		if n > testsPerShard {
-			n = testsPerShard
-		}
-		shard := t
-		shard.Cmd = []string{shard.Cmd[0], "--gtest_filter=" + strings.Join(shuffled[i:i+n], ":")}
-		shard.shard = len(shards)
-		shards = append(shards, shard)
-	}
-
+	shards := make([]test, *numWorkers)
 	for i := range shards {
-		shards[i].numShards = len(shards)
+		shards[i] = t
+		shards[i].shard = i
+		shards[i].numShards = *numWorkers
 	}
 
 	return shards, nil
@@ -477,14 +422,14 @@
 	if len(skipped) > 0 {
 		fmt.Printf("\n%d of %d tests were skipped:\n", len(skipped), len(testCases))
 		for _, test := range skipped {
-			fmt.Printf("\t%s%s\n", strings.Join(test.Cmd, " "), test.cpuMsg())
+			fmt.Printf("\t%s\n", test.shortName())
 		}
 	}
 
 	if len(failed) > 0 {
 		fmt.Printf("\n%d of %d tests failed:\n", len(failed), len(testCases))
 		for _, test := range failed {
-			fmt.Printf("\t%s%s\n", strings.Join(test.Cmd, " "), test.cpuMsg())
+			fmt.Printf("\t%s\n", test.shortName())
 		}
 		os.Exit(1)
 	}
diff --git a/src/util/bot/DEPS b/src/util/bot/DEPS
index ee6f920..1efc55a 100644
--- a/src/util/bot/DEPS
+++ b/src/util/bot/DEPS
@@ -19,20 +19,20 @@
   'checkout_sde': False,
   'checkout_nasm': False,
   'checkout_libcxx': False,
-  'vs_version': '2015',
+  'vs_version': '2017',
 
   # Run the following command to see the latest builds in CIPD:
   #  cipd describe PACKAGE_NAME -version latest
 
   # infra/3pp/tools/cmake/linux-amd64
-  'cmake_version': 'version:2@3.21.3',
+  'cmake_version': 'version:2@3.23.1',
   # infra/3pp/tools/go/linux-amd64
-  'go_version': 'version:2@1.17.2',
+  'go_version': 'version:2@1.18.2',
 
   # Update the following from
-  # https://chromium.googlesource.com/chromium/src/+/master/DEPS
+  # https://chromium.googlesource.com/chromium/src/+/main/DEPS
   'android_sdk_platform-tools_version': 'g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C',
-  'android_ndk_revision': '401019bf85744311b26c88ced255cd53401af8b7',
+  'android_ndk_revision': '8388a2be5421311dc75c5f937aae13d821a27f3d',
   'libfuzzer_revision': 'debe7d2d1982e540fbd6bd78604bf001753f9e74',
   'libcxx_revision': '79a2e924d96e2fc1e4b937c42efd08898fa472d7',
   'libcxxabi_revision': '9b8228b4a9be26e0881f36089d9a8d62df851acc',
@@ -53,9 +53,13 @@
     'dep_type': 'cipd',
   },
 
+  # TODO(davidben): Merge the three CMake directories. Now that we use CIPD,
+  # which supports a ${{platform}} marker, there is nothing platform-specific
+  # about this anymore. However, the recipe still expects CMake to be found at
+  # these directories, so this needs to be coordinated with a change there.
   'boringssl/util/bot/cmake-linux64': {
     'packages': [{
-      'package': 'infra/3pp/tools/cmake/linux-amd64',
+      'package': 'infra/3pp/tools/cmake/${{platform}}',
       'version': Var('cmake_version'),
     }],
     'condition': 'host_os == "linux"',
@@ -64,13 +68,22 @@
 
   'boringssl/util/bot/cmake-mac': {
     'packages': [{
-      'package': 'infra/3pp/tools/cmake/mac-amd64',
+      'package': 'infra/3pp/tools/cmake/${{platform}}',
       'version': Var('cmake_version'),
     }],
     'condition': 'host_os == "mac"',
     'dep_type': 'cipd',
   },
 
+  'boringssl/util/bot/cmake-win32': {
+    'packages': [{
+      'package': 'infra/3pp/tools/cmake/${{platform}}',
+      'version': Var('cmake_version'),
+    }],
+    'condition': 'host_os == "win"',
+    'dep_type': 'cipd',
+  },
+
   'boringssl/util/bot/golang': {
     'packages': [{
       'package': 'infra/3pp/tools/go/${{platform}}',
@@ -102,28 +115,6 @@
 hooks = [
   # TODO(https://crbug.com/1180257): Use CIPD for CMake on Windows.
   {
-    'name': 'cmake_win32',
-    'pattern': '.',
-    'condition': 'host_os == "win"',
-    'action': [ 'download_from_google_storage',
-                '--no_resume',
-                '--platform=win32',
-                '--no_auth',
-                '--bucket', 'chromium-tools',
-                '-s', 'boringssl/util/bot/cmake-win32.zip.sha1',
-    ],
-  },
-  {
-    'name': 'cmake_win32_extract',
-    'pattern': '.',
-    'condition': 'host_os == "win"',
-    'action': [ 'python3',
-                'boringssl/util/bot/extract.py',
-                'boringssl/util/bot/cmake-win32.zip',
-                'boringssl/util/bot/cmake-win32/',
-    ],
-  },
-  {
     'name': 'perl_win32',
     'pattern': '.',
     'condition': 'host_os == "win"',
@@ -183,7 +174,7 @@
     'action': [ 'download_from_google_storage',
                 '--no_resume',
                 '--bucket', 'chrome-boringssl-sde',
-                '-s', 'boringssl/util/bot/sde-linux64.tar.bz2.sha1'
+                '-s', 'boringssl/util/bot/sde-linux64.tar.xz.sha1'
     ],
   },
   {
@@ -192,7 +183,7 @@
     'condition': 'checkout_sde and host_os == "linux"',
     'action': [ 'python3',
                 'boringssl/util/bot/extract.py',
-                'boringssl/util/bot/sde-linux64.tar.bz2',
+                'boringssl/util/bot/sde-linux64.tar.xz',
                 'boringssl/util/bot/sde-linux64/',
     ],
   },
@@ -203,7 +194,7 @@
     'action': [ 'download_from_google_storage',
                 '--no_resume',
                 '--bucket', 'chrome-boringssl-sde',
-                '-s', 'boringssl/util/bot/sde-win32.tar.bz2.sha1'
+                '-s', 'boringssl/util/bot/sde-win32.tar.xz.sha1'
     ],
   },
   {
@@ -212,7 +203,7 @@
     'condition': 'checkout_sde and host_os == "win"',
     'action': [ 'python3',
                 'boringssl/util/bot/extract.py',
-                'boringssl/util/bot/sde-win32.tar.bz2',
+                'boringssl/util/bot/sde-win32.tar.xz',
                 'boringssl/util/bot/sde-win32/',
     ],
   },
diff --git a/src/util/bot/UPDATING b/src/util/bot/UPDATING
index 2e6b914..1543ed6 100644
--- a/src/util/bot/UPDATING
+++ b/src/util/bot/UPDATING
@@ -12,10 +12,10 @@
 
 update_clang.py: Set CLANG_REVISION and CLANG_SUB_REVISION to the values used in
     Chromium, found at
-    https://chromium.googlesource.com/chromium/src/+/master/tools/clang/scripts/update.py
+    https://chromium.googlesource.com/chromium/src/+/main/tools/clang/scripts/update.py
 
 vs_toolchain.py: Update _GetDesiredVsToolchainHashes from Chromium, found at
-    https://chromium.googlesource.com/chromium/src/+/master/build/vs_toolchain.py
+    https://chromium.googlesource.com/chromium/src/+/main/build/vs_toolchain.py
     This may require taking other updates to that file. (Don't remove MSVC
     versions if BoringSSL still needs to support them.)
 
@@ -24,15 +24,9 @@
 
     upload_to_google_storage.py -b chromium-tools FILE
 
-cmake-win32.zip: Update to the latest prebuilt release of CMake, found at
-    https://cmake.org/download/. Use the file labeled "Windows win64-x64
-    ZIP". The download will be named cmake-VERSION-win64-x64.zip.
-
-    The current revision is cmake-3.19.5-win64-x64.zip
-
 nasm-win32.exe: Update to the appropriate release of NASM, found at
     https://www.nasm.us/. Use the same version as Chromium, found at
-    https://chromium.googlesource.com/chromium/src/+/master/third_party/nasm/README.chromium
+    https://chromium.googlesource.com/chromium/src/+/main/third_party/nasm/README.chromium
     Extract nasm.exe from the download named nasm-VERSION-win64.zip.
 
     The current revision is nasm-2.13.03-win64.zip.
@@ -46,13 +40,13 @@
 
     The current revision is strawberry-perl-5.26.2.1-64bit-portable.zip.
 
-Finally, update sde-linux64.tar.bz2 and sde-win32.tar.bz2 by downloading the
+Finally, update sde-linux64.tar.xz and sde-win32.tar.xz by downloading the
 latet release from Intel at
 https://software.intel.com/en-us/articles/intel-software-development-emulator,
 but upload it with the following command. (Note the bucket is different.)
 
-    upload_to_google_storage.py -b chrome-boringssl-sde sde-linux64.tar.bz2 sde-win32.tar.bz2
+    upload_to_google_storage.py -b chrome-boringssl-sde sde-linux64.tar.xz sde-win32.tar.xz
 
-The current revision is sde-external-8.50.0-2020-03-26-*.tar.bz2.
+The current revision is sde-external-9.0.0-2021-11-07-*.tar.xz.
 
 When adding new files, remember to update .gitignore.
diff --git a/src/util/bot/cmake-win32.zip.sha1 b/src/util/bot/cmake-win32.zip.sha1
deleted file mode 100644
index d641c17..0000000
--- a/src/util/bot/cmake-win32.zip.sha1
+++ /dev/null
@@ -1 +0,0 @@
-b106d66bcdc8a71ea2cdf5446091327bfdb1bcd7
\ No newline at end of file
diff --git a/src/util/bot/extract.py b/src/util/bot/extract.py
index 9b1b88a..4ef5f65 100644
--- a/src/util/bot/extract.py
+++ b/src/util/bot/extract.py
@@ -118,6 +118,8 @@
     entries = IterateTar(archive, 'gz')
   elif archive.endswith('.tar.bz2'):
     entries = IterateTar(archive, 'bz2')
+  elif archive.endswith('.tar.xz'):
+    entries = IterateTar(archive, 'xz')
   else:
     raise ValueError(archive)
 
diff --git a/src/util/bot/sde-linux64.tar.bz2.sha1 b/src/util/bot/sde-linux64.tar.bz2.sha1
deleted file mode 100644
index c450f63..0000000
--- a/src/util/bot/sde-linux64.tar.bz2.sha1
+++ /dev/null
@@ -1 +0,0 @@
-baacb5a29755e299d3384c41c6dd55f65235ef1f
\ No newline at end of file
diff --git a/src/util/bot/sde-linux64.tar.xz.sha1 b/src/util/bot/sde-linux64.tar.xz.sha1
new file mode 100644
index 0000000..f9ee198
--- /dev/null
+++ b/src/util/bot/sde-linux64.tar.xz.sha1
@@ -0,0 +1 @@
+8bba6e01a47b2cfd9e7429f77256db540031ff43
\ No newline at end of file
diff --git a/src/util/bot/sde-win32.tar.bz2.sha1 b/src/util/bot/sde-win32.tar.bz2.sha1
deleted file mode 100644
index b960747..0000000
--- a/src/util/bot/sde-win32.tar.bz2.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cc2d77ff4a221165a8bb13f43ccfbff6550b90c8
\ No newline at end of file
diff --git a/src/util/bot/sde-win32.tar.xz.sha1 b/src/util/bot/sde-win32.tar.xz.sha1
new file mode 100644
index 0000000..dbaf87f
--- /dev/null
+++ b/src/util/bot/sde-win32.tar.xz.sha1
@@ -0,0 +1 @@
+59ef225031e14e5ac257ada61d416f6ea0c9c080
\ No newline at end of file
diff --git a/src/util/bot/update_clang.py b/src/util/bot/update_clang.py
index 6d9f68b..59b0cad 100644
--- a/src/util/bot/update_clang.py
+++ b/src/util/bot/update_clang.py
@@ -28,7 +28,7 @@
 # CLANG_REVISION and CLANG_SUB_REVISION determine the build of clang
 # to use. These should be synced with tools/clang/scripts/update.py in
 # Chromium.
-CLANG_REVISION = 'llvmorg-14-init-6722-g0fbd3aad'
+CLANG_REVISION = 'llvmorg-15-init-10168-gc2a7904a'
 CLANG_SUB_REVISION = 2
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
diff --git a/src/util/bot/vs_toolchain.py b/src/util/bot/vs_toolchain.py
index 051d78b..df4637f 100644
--- a/src/util/bot/vs_toolchain.py
+++ b/src/util/bot/vs_toolchain.py
@@ -62,14 +62,15 @@
 def _GetDesiredVsToolchainHashes(version):
   """Load a list of SHA1s corresponding to the toolchains that we want installed
   to build with."""
-  if version == '2015':
-    # Update 3 final with 10.0.15063.468 SDK and no vctip.exe.
-    return ['f53e4598951162bad6330f7a167486c7ae5db1e5']
   if version == '2017':
     # VS 2017 Update 9 (15.9.12) with 10.0.18362 SDK, 10.0.17763 version of
     # Debuggers, and 10.0.17134 version of d3dcompiler_47.dll, with ARM64
     # libraries.
     return ['418b3076791776573a815eb298c8aa590307af63']
+  if version == '2019':
+    # VS 2019 16.61 with 10.0.20348.0 SDK, 10.0.19041 version of Debuggers
+    # with ARM64 libraries and UWP support.
+    return ['1023ce2e82']
   raise Exception('Unsupported VS version %s' % version)
 
 
diff --git a/src/util/convert_comments.go b/src/util/convert_comments.go
index c03eeb8..afd070f 100644
--- a/src/util/convert_comments.go
+++ b/src/util/convert_comments.go
@@ -232,6 +232,29 @@
 			}
 
 			for i, line := range group.lines {
+				// The OpenSSL style writes multiline block comments with a
+				// blank line at the top and bottom, like so:
+				//
+				//   /*
+				//    * Some multi-line
+				//    * comment
+				//    */
+				//
+				// The trailing lines are already removed above, when buffering.
+				// Remove the leading lines here. (The leading lines cannot be
+				// removed when buffering because we may discover the comment is
+				// not convertible in later lines.)
+				//
+				// Note the leading line cannot be easily removed if there is
+				// code before it, such as the following. Skip those cases.
+				//
+				//   foo(); /*
+				//           * Some multi-line
+				//           * comment
+				//           */
+				if i == 0 && allSpaces(line[:group.column]) && len(line) == group.column+2 {
+					continue
+				}
 				newLine := fmt.Sprintf("%s%s//%s", line[:group.column], adjust, strings.TrimRight(line[group.column+2:], " "))
 				if len(newLine) > 80 {
 					fmt.Fprintf(os.Stderr, "%s:%d: Line is now longer than 80 characters\n", path, lineNo+i+1)
diff --git a/src/util/doc.config b/src/util/doc.config
index 12fdefc..8de5f1d 100644
--- a/src/util/doc.config
+++ b/src/util/doc.config
@@ -8,7 +8,6 @@
       "include/openssl/buf.h",
       "include/openssl/bytestring.h",
       "include/openssl/err.h",
-      "include/openssl/cpu.h",
       "include/openssl/crypto.h",
       "include/openssl/ex_data.h",
       "include/openssl/lhash.h",
@@ -49,7 +48,8 @@
       "include/openssl/cipher.h",
       "include/openssl/aead.h",
       "include/openssl/evp.h",
-      "include/openssl/hpke.h"
+      "include/openssl/hpke.h",
+      "include/openssl/kdf.h"
     ]
   },{
     "Name": "Legacy ASN.1 and X.509 implementation (documentation in progress)",
diff --git a/src/util/doc.go b/src/util/doc.go
index a38e078..651998e 100644
--- a/src/util/doc.go
+++ b/src/util/doc.go
@@ -503,7 +503,7 @@
 
 // markupPipeWords converts |s| into an HTML string, safe to be included outside
 // a tag, while also marking up words surrounded by |.
-func markupPipeWords(allDecls map[string]string, s string) template.HTML {
+func markupPipeWords(allDecls map[string]string, s string, linkDecls bool) template.HTML {
 	// It is safe to look for '|' in the HTML-escaped version of |s|
 	// below. The escaped version cannot include '|' instead tags because
 	// there are no tags by construction.
@@ -524,12 +524,10 @@
 		if i > 0 && (j == -1 || j > i) {
 			ret += "<tt>"
 			anchor, isLink := allDecls[s[:i]]
-			if isLink {
-				ret += fmt.Sprintf("<a href=\"%s\">", template.HTMLEscapeString(anchor))
-			}
-			ret += s[:i]
-			if isLink {
-				ret += "</a>"
+			if linkDecls && isLink {
+				ret += fmt.Sprintf("<a href=\"%s\">%s</a>", template.HTMLEscapeString(anchor), s[:i])
+			} else {
+				ret += s[:i]
 			}
 			ret += "</tt>"
 			s = s[i+1:]
@@ -602,11 +600,12 @@
 
 	headerTmpl := template.New("headerTmpl")
 	headerTmpl.Funcs(template.FuncMap{
-		"firstSentence":   firstSentence,
-		"markupPipeWords": func(s string) template.HTML { return markupPipeWords(allDecls, s) },
-		"markupFirstWord": markupFirstWord,
-		"markupRFC":       markupRFC,
-		"newlinesToBR":    newlinesToBR,
+		"firstSentence":         firstSentence,
+		"markupPipeWords":       func(s string) template.HTML { return markupPipeWords(allDecls, s, true /* linkDecls */) },
+		"markupPipeWordsNoLink": func(s string) template.HTML { return markupPipeWords(allDecls, s, false /* linkDecls */) },
+		"markupFirstWord":       markupFirstWord,
+		"markupRFC":             markupRFC,
+		"newlinesToBR":          newlinesToBR,
 	})
 	headerTmpl, err := headerTmpl.Parse(`<!DOCTYPE html>
 <html>
@@ -623,12 +622,12 @@
       <a href="headers.html">All headers</a>
     </div>
 
-    {{range .Preamble}}<p>{{. | markupPipeWords}}</p>{{end}}
+    {{range .Preamble}}<p>{{. | markupPipeWords | markupRFC}}</p>{{end}}
 
     <ol>
       {{range .Sections}}
         {{if not .IsPrivate}}
-          {{if .Anchor}}<li class="header"><a href="#{{.Anchor}}">{{.Preamble | firstSentence | markupPipeWords}}</a></li>{{end}}
+          {{if .Anchor}}<li class="header"><a href="#{{.Anchor}}">{{.Preamble | firstSentence | markupPipeWordsNoLink}}</a></li>{{end}}
           {{range .Decls}}
             {{if .Anchor}}<li><a href="#{{.Anchor}}"><tt>{{.Name}}</tt></a></li>{{end}}
           {{end}}
@@ -641,7 +640,7 @@
         <div class="section" {{if .Anchor}}id="{{.Anchor}}"{{end}}>
         {{if .Preamble}}
           <div class="sectionpreamble">
-          {{range .Preamble}}<p>{{. | markupPipeWords}}</p>{{end}}
+          {{range .Preamble}}<p>{{. | markupPipeWords | markupRFC}}</p>{{end}}
           </div>
         {{end}}
 
diff --git a/src/util/fipstools/CMakeLists.txt b/src/util/fipstools/CMakeLists.txt
new file mode 100644
index 0000000..6359383
--- /dev/null
+++ b/src/util/fipstools/CMakeLists.txt
@@ -0,0 +1,12 @@
+include_directories(../../include)
+
+if(FIPS)
+  add_executable(
+    test_fips
+
+    test_fips.c
+  )
+
+  add_dependencies(test_fips global_target)
+  target_link_libraries(test_fips crypto)
+endif()
diff --git a/src/util/fipstools/acvp/acvptool/acvp.go b/src/util/fipstools/acvp/acvptool/acvp.go
index f477d65..4c7e07c 100644
--- a/src/util/fipstools/acvp/acvptool/acvp.go
+++ b/src/util/fipstools/acvp/acvptool/acvp.go
@@ -185,7 +185,7 @@
 // it's a header.
 func looksLikeHeaderElement(element json.RawMessage) bool {
 	var headerFields struct {
-		URL string `json:"url"`
+		URL       string `json:"url"`
 		Algorithm string `json:"algorithm"`
 	}
 	if err := json.Unmarshal(element, &headerFields); err != nil {
diff --git a/src/util/fipstools/acvp/acvptool/acvp/acvp.go b/src/util/fipstools/acvp/acvptool/acvp/acvp.go
index 04f0932..d70f98c 100644
--- a/src/util/fipstools/acvp/acvptool/acvp/acvp.go
+++ b/src/util/fipstools/acvp/acvptool/acvp/acvp.go
@@ -33,6 +33,8 @@
 	"time"
 )
 
+const loginEndpoint = "acvp/v1/login"
+
 // Server represents an ACVP server.
 type Server struct {
 	// PrefixTokens are access tokens that apply to URLs under a certain prefix.
@@ -89,7 +91,7 @@
 				return conn, err
 			},
 		},
-		Timeout: 30 * time.Second,
+		Timeout: 120 * time.Second,
 	}
 
 	return &Server{client: client, prefix: prefix, totpFunc: totp, PrefixTokens: make(map[string]string)}
@@ -239,7 +241,7 @@
 	if json.Unmarshal(jsonBytes, &token) != nil {
 		return false
 	}
-	return token.Expiry > 0 && token.Expiry < uint64(time.Now().Unix())
+	return token.Expiry > 0 && token.Expiry < uint64(time.Now().Add(-10*time.Second).Unix())
 }
 
 func (server *Server) getToken(endPoint string) (string, error) {
@@ -255,7 +257,7 @@
 		var reply struct {
 			AccessToken string `json:"accessToken"`
 		}
-		if err := server.postMessage(&reply, "acvp/v1/login", map[string]string{
+		if err := server.postMessage(&reply, loginEndpoint, map[string]string{
 			"password":    server.totpFunc(),
 			"accessToken": token,
 		}); err != nil {
@@ -278,7 +280,7 @@
 		SizeLimit             int64  `json:"sizeConstraint"`
 	}
 
-	if err := server.postMessage(&reply, "acvp/v1/login", map[string]string{"password": server.totpFunc()}); err != nil {
+	if err := server.postMessage(&reply, loginEndpoint, map[string]string{"password": server.totpFunc()}); err != nil {
 		return err
 	}
 
@@ -372,7 +374,7 @@
 	if err != nil {
 		return nil, err
 	}
-	if len(token) != 0 {
+	if len(token) != 0 && endpoint != loginEndpoint {
 		req.Header.Add("Authorization", "Bearer "+token)
 	}
 	return req, nil
diff --git a/src/util/fipstools/acvp/acvptool/interactive.go b/src/util/fipstools/acvp/acvptool/interactive.go
index b13a549..ee992f1 100644
--- a/src/util/fipstools/acvp/acvptool/interactive.go
+++ b/src/util/fipstools/acvp/acvptool/interactive.go
@@ -12,6 +12,7 @@
 // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+//go:build interactive
 // +build interactive
 
 package main
diff --git a/src/util/fipstools/acvp/acvptool/nointeractive.go b/src/util/fipstools/acvp/acvptool/nointeractive.go
index 06c8890..8aa0839 100644
--- a/src/util/fipstools/acvp/acvptool/nointeractive.go
+++ b/src/util/fipstools/acvp/acvptool/nointeractive.go
@@ -12,6 +12,7 @@
 // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+//go:build !interactive
 // +build !interactive
 
 package main
diff --git a/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go b/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go
index 844c9c4..158bae3 100644
--- a/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go
+++ b/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go
@@ -71,38 +71,47 @@
 	}
 
 	m.primitives = map[string]primitive{
-		"SHA-1":            &hashPrimitive{"SHA-1", 20},
-		"SHA2-224":         &hashPrimitive{"SHA2-224", 28},
-		"SHA2-256":         &hashPrimitive{"SHA2-256", 32},
-		"SHA2-384":         &hashPrimitive{"SHA2-384", 48},
-		"SHA2-512":         &hashPrimitive{"SHA2-512", 64},
-		"SHA2-512/256":     &hashPrimitive{"SHA2-512/256", 32},
-		"ACVP-AES-ECB":     &blockCipher{"AES", 16, 2, true, false, iterateAES},
-		"ACVP-AES-CBC":     &blockCipher{"AES-CBC", 16, 2, true, true, iterateAESCBC},
-		"ACVP-AES-CBC-CS3": &blockCipher{"AES-CBC-CS3", 16, 1, false, true, iterateAESCBC},
-		"ACVP-AES-CTR":     &blockCipher{"AES-CTR", 16, 1, false, true, nil},
-		"ACVP-AES-XTS":     &xts{},
-		"ACVP-TDES-ECB":    &blockCipher{"3DES-ECB", 8, 3, true, false, iterate3DES},
-		"ACVP-TDES-CBC":    &blockCipher{"3DES-CBC", 8, 3, true, true, iterate3DESCBC},
-		"ACVP-AES-GCM":     &aead{"AES-GCM", false},
-		"ACVP-AES-GMAC":    &aead{"AES-GCM", false},
-		"ACVP-AES-CCM":     &aead{"AES-CCM", true},
-		"ACVP-AES-KW":      &aead{"AES-KW", false},
-		"ACVP-AES-KWP":     &aead{"AES-KWP", false},
-		"HMAC-SHA-1":       &hmacPrimitive{"HMAC-SHA-1", 20},
-		"HMAC-SHA2-224":    &hmacPrimitive{"HMAC-SHA2-224", 28},
-		"HMAC-SHA2-256":    &hmacPrimitive{"HMAC-SHA2-256", 32},
-		"HMAC-SHA2-384":    &hmacPrimitive{"HMAC-SHA2-384", 48},
-		"HMAC-SHA2-512":    &hmacPrimitive{"HMAC-SHA2-512", 64},
-		"ctrDRBG":          &drbg{"ctrDRBG", map[string]bool{"AES-128": true, "AES-192": true, "AES-256": true}},
-		"hmacDRBG":         &drbg{"hmacDRBG", map[string]bool{"SHA-1": true, "SHA2-224": true, "SHA2-256": true, "SHA2-384": true, "SHA2-512": true}},
-		"KDF":              &kdfPrimitive{},
-		"KAS-KDF":          &hkdf{},
-		"CMAC-AES":         &keyedMACPrimitive{"CMAC-AES"},
-		"RSA":              &rsa{},
-		"kdf-components":   &tlsKDF{},
-		"KAS-ECC-SSC":      &kas{},
-		"KAS-FFC-SSC":      &kasDH{},
+		"SHA-1":             &hashPrimitive{"SHA-1", 20},
+		"SHA2-224":          &hashPrimitive{"SHA2-224", 28},
+		"SHA2-256":          &hashPrimitive{"SHA2-256", 32},
+		"SHA2-384":          &hashPrimitive{"SHA2-384", 48},
+		"SHA2-512":          &hashPrimitive{"SHA2-512", 64},
+		"SHA2-512/256":      &hashPrimitive{"SHA2-512/256", 32},
+		"SHA3-224":          &hashPrimitive{"SHA3-224", 28},
+		"SHA3-256":          &hashPrimitive{"SHA3-256", 32},
+		"SHA3-384":          &hashPrimitive{"SHA3-384", 48},
+		"SHA3-512":          &hashPrimitive{"SHA3-512", 64},
+		"ACVP-AES-ECB":      &blockCipher{"AES", 16, 2, true, false, iterateAES},
+		"ACVP-AES-CBC":      &blockCipher{"AES-CBC", 16, 2, true, true, iterateAESCBC},
+		"ACVP-AES-CBC-CS3":  &blockCipher{"AES-CBC-CS3", 16, 1, false, true, iterateAESCBC},
+		"ACVP-AES-CTR":      &blockCipher{"AES-CTR", 16, 1, false, true, nil},
+		"ACVP-TDES-ECB":     &blockCipher{"3DES-ECB", 8, 3, true, false, iterate3DES},
+		"ACVP-TDES-CBC":     &blockCipher{"3DES-CBC", 8, 3, true, true, iterate3DESCBC},
+		"ACVP-AES-XTS":      &xts{},
+		"ACVP-AES-GCM":      &aead{"AES-GCM", false},
+		"ACVP-AES-GMAC":     &aead{"AES-GCM", false},
+		"ACVP-AES-CCM":      &aead{"AES-CCM", true},
+		"ACVP-AES-KW":       &aead{"AES-KW", false},
+		"ACVP-AES-KWP":      &aead{"AES-KWP", false},
+		"HMAC-SHA-1":        &hmacPrimitive{"HMAC-SHA-1", 20},
+		"HMAC-SHA2-224":     &hmacPrimitive{"HMAC-SHA2-224", 28},
+		"HMAC-SHA2-256":     &hmacPrimitive{"HMAC-SHA2-256", 32},
+		"HMAC-SHA2-384":     &hmacPrimitive{"HMAC-SHA2-384", 48},
+		"HMAC-SHA2-512":     &hmacPrimitive{"HMAC-SHA2-512", 64},
+		"HMAC-SHA2-512/256": &hmacPrimitive{"HMAC-SHA2-512/256", 32},
+		"HMAC-SHA3-224":     &hmacPrimitive{"HMAC-SHA3-224", 28},
+		"HMAC-SHA3-256":     &hmacPrimitive{"HMAC-SHA3-256", 32},
+		"HMAC-SHA3-384":     &hmacPrimitive{"HMAC-SHA3-384", 48},
+		"HMAC-SHA3-512":     &hmacPrimitive{"HMAC-SHA3-512", 64},
+		"ctrDRBG":           &drbg{"ctrDRBG", map[string]bool{"AES-128": true, "AES-192": true, "AES-256": true}},
+		"hmacDRBG":          &drbg{"hmacDRBG", map[string]bool{"SHA-1": true, "SHA2-224": true, "SHA2-256": true, "SHA2-384": true, "SHA2-512": true}},
+		"KDF":               &kdfPrimitive{},
+		"KAS-KDF":           &hkdf{},
+		"CMAC-AES":          &keyedMACPrimitive{"CMAC-AES"},
+		"RSA":               &rsa{},
+		"kdf-components":    &tlsKDF{},
+		"KAS-ECC-SSC":       &kas{},
+		"KAS-FFC-SSC":       &kasDH{},
 	}
 	m.primitives["ECDSA"] = &ecdsa{"ECDSA", map[string]bool{"P-224": true, "P-256": true, "P-384": true, "P-521": true}, m.primitives}
 
diff --git a/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2 b/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2
new file mode 100644
index 0000000..6984115
--- /dev/null
+++ b/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2
Binary files differ
diff --git a/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 b/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2
index 9f6e487..c3bd2a1 100644
--- a/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2
+++ b/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2
Binary files differ
diff --git a/src/util/fipstools/acvp/acvptool/test/tests.json b/src/util/fipstools/acvp/acvptool/test/tests.json
index f613917..5765de1 100644
--- a/src/util/fipstools/acvp/acvptool/test/tests.json
+++ b/src/util/fipstools/acvp/acvptool/test/tests.json
@@ -9,8 +9,6 @@
 {"Wrapper": "modulewrapper", "In": "vectors/ACVP-AES-KW.bz2", "Out": "expected/ACVP-AES-KW.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/ACVP-AES-KWP.bz2", "Out": "expected/ACVP-AES-KWP.bz2"},
 {"Wrapper": "testmodulewrapper", "In": "vectors/ACVP-AES-XTS.bz2", "Out": "expected/ACVP-AES-XTS.bz2"},
-{"Wrapper": "modulewrapper", "In": "vectors/ACVP-TDES-CBC.bz2", "Out": "expected/ACVP-TDES-CBC.bz2"},
-{"Wrapper": "modulewrapper", "In": "vectors/ACVP-TDES-ECB.bz2", "Out": "expected/ACVP-TDES-ECB.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/CMAC-AES.bz2", "Out": "expected/CMAC-AES.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/ctrDRBG.bz2", "Out": "expected/ctrDRBG.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/ECDSA.bz2", "Out": "expected/ECDSA.bz2"},
@@ -19,6 +17,7 @@
 {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-256.bz2", "Out": "expected/HMAC-SHA2-256.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-384.bz2", "Out": "expected/HMAC-SHA2-384.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-512.bz2", "Out": "expected/HMAC-SHA2-512.bz2"},
+{"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-512-256.bz2", "Out": "expected/HMAC-SHA2-512-256.bz2"},
 {"Wrapper": "testmodulewrapper", "In": "vectors/hmacDRBG.bz2", "Out": "expected/hmacDRBG.bz2"},
 {"Wrapper": "testmodulewrapper", "In": "vectors/KAS-KDF.bz2", "Out": "expected/KAS-KDF.bz2"},
 {"Wrapper": "modulewrapper", "In": "vectors/KAS-ECC-SSC.bz2"},
diff --git a/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-CBC.bz2 b/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-CBC.bz2
deleted file mode 100644
index 33fdbf3..0000000
--- a/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-CBC.bz2
+++ /dev/null
Binary files differ
diff --git a/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-ECB.bz2 b/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-ECB.bz2
deleted file mode 100644
index c8853ed..0000000
--- a/src/util/fipstools/acvp/acvptool/test/vectors/ACVP-TDES-ECB.bz2
+++ /dev/null
Binary files differ
diff --git a/src/util/fipstools/acvp/acvptool/test/vectors/HMAC-SHA2-512-256.bz2 b/src/util/fipstools/acvp/acvptool/test/vectors/HMAC-SHA2-512-256.bz2
new file mode 100644
index 0000000..d981300
--- /dev/null
+++ b/src/util/fipstools/acvp/acvptool/test/vectors/HMAC-SHA2-512-256.bz2
Binary files differ
diff --git a/src/util/fipstools/acvp/acvptool/test/vectors/ctrDRBG.bz2 b/src/util/fipstools/acvp/acvptool/test/vectors/ctrDRBG.bz2
index 16f447f..1231272 100644
--- a/src/util/fipstools/acvp/acvptool/test/vectors/ctrDRBG.bz2
+++ b/src/util/fipstools/acvp/acvptool/test/vectors/ctrDRBG.bz2
Binary files differ
diff --git a/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt b/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt
index 267f82c..f13f6df 100644
--- a/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt
+++ b/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt
@@ -7,6 +7,7 @@
     main.cc
     modulewrapper.cc
   )
+  install(TARGETS modulewrapper)
 
   add_dependencies(modulewrapper global_target)
 
diff --git a/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc b/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc
index 7188029..f65492c 100644
--- a/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc
+++ b/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc
@@ -29,6 +29,7 @@
 #include <openssl/bn.h>
 #include <openssl/cipher.h>
 #include <openssl/cmac.h>
+#include <openssl/ctrdrbg.h>
 #include <openssl/dh.h>
 #include <openssl/digest.h>
 #include <openssl/ec.h>
@@ -297,10 +298,10 @@
         "direction": ["encrypt", "decrypt"],
         "keyLen": [128, 192, 256],
         "payloadLen": [{
-          "min": 0, "max": 256, "increment": 8
+          "min": 0, "max": 65536, "increment": 8
         }],
         "aadLen": [{
-          "min": 0, "max": 320, "increment": 8
+          "min": 0, "max": 65536, "increment": 8
         }],
         "tagLen": [32, 64, 96, 104, 112, 120, 128],
         "ivLen": [96],
@@ -312,10 +313,10 @@
         "direction": ["encrypt", "decrypt"],
         "keyLen": [128, 192, 256],
         "payloadLen": [{
-          "min": 0, "max": 256, "increment": 8
+          "min": 0, "max": 65536, "increment": 8
         }],
         "aadLen": [{
-          "min": 0, "max": 320, "increment": 8
+          "min": 0, "max": 65536, "increment": 8
         }],
         "tagLen": [32, 64, 96, 104, 112, 120, 128],
         "ivLen": [96],
@@ -334,7 +335,7 @@
         "keyLen": [
             128, 192, 256
         ],
-        "payloadLen": [{"min": 128, "max": 1024, "increment": 64}]
+        "payloadLen": [{"min": 128, "max": 4096, "increment": 64}]
       },
       {
         "algorithm": "ACVP-AES-KWP",
@@ -363,28 +364,14 @@
         ],
         "payloadLen": [{"min": 0, "max": 256, "increment": 8}],
         "ivLen": [104],
-        "tagLen": [32],
-        "aadLen": [{"min": 0, "max": 1024, "increment": 8}]
-      },
-      {
-        "algorithm": "ACVP-TDES-ECB",
-        "revision": "1.0",
-        "direction": ["encrypt", "decrypt"],
-        "keyLen": [192],
-        "keyingOption": [1]
-      },
-      {
-        "algorithm": "ACVP-TDES-CBC",
-        "revision": "1.0",
-        "direction": ["encrypt", "decrypt"],
-        "keyLen": [192],
-        "keyingOption": [1]
+        "tagLen": [32, 64],
+        "aadLen": [{"min": 0, "max": 524288, "increment": 8}]
       },
       {
         "algorithm": "HMAC-SHA-1",
         "revision": "1.0",
         "keyLen": [{
-          "min": 8, "max": 2048, "increment": 8
+          "min": 8, "max": 524288, "increment": 8
         }],
         "macLen": [{
           "min": 32, "max": 160, "increment": 8
@@ -394,7 +381,7 @@
         "algorithm": "HMAC-SHA2-224",
         "revision": "1.0",
         "keyLen": [{
-          "min": 8, "max": 2048, "increment": 8
+          "min": 8, "max": 524288, "increment": 8
         }],
         "macLen": [{
           "min": 32, "max": 224, "increment": 8
@@ -404,7 +391,7 @@
         "algorithm": "HMAC-SHA2-256",
         "revision": "1.0",
         "keyLen": [{
-          "min": 8, "max": 2048, "increment": 8
+          "min": 8, "max": 524288, "increment": 8
         }],
         "macLen": [{
           "min": 32, "max": 256, "increment": 8
@@ -414,7 +401,7 @@
         "algorithm": "HMAC-SHA2-384",
         "revision": "1.0",
         "keyLen": [{
-          "min": 8, "max": 2048, "increment": 8
+          "min": 8, "max": 524288, "increment": 8
         }],
         "macLen": [{
           "min": 32, "max": 384, "increment": 8
@@ -424,17 +411,27 @@
         "algorithm": "HMAC-SHA2-512",
         "revision": "1.0",
         "keyLen": [{
-          "min": 8, "max": 2048, "increment": 8
+          "min": 8, "max": 524288, "increment": 8
         }],
         "macLen": [{
           "min": 32, "max": 512, "increment": 8
         }]
       },
       {
+        "algorithm": "HMAC-SHA2-512/256",
+        "revision": "1.0",
+        "keyLen": [{
+          "min": 8, "max": 524288, "increment": 8
+        }],
+        "macLen": [{
+          "min": 32, "max": 256, "increment": 8
+        }]
+      },
+      {
         "algorithm": "ctrDRBG",
         "revision": "1.0",
         "predResistanceEnabled": [false],
-        "reseedImplemented": false,
+        "reseedImplemented": true,
         "capabilities": [{
           "mode": "AES-256",
           "derFuncEnabled": false,
@@ -487,7 +484,8 @@
             "SHA2-224",
             "SHA2-256",
             "SHA2-384",
-            "SHA2-512"
+            "SHA2-512",
+            "SHA2-512/256"
           ]
         }]
       },
@@ -507,7 +505,8 @@
             "SHA2-224",
             "SHA2-256",
             "SHA2-384",
-            "SHA2-512"
+            "SHA2-512",
+            "SHA2-512/256"
           ]
         }]
       },
@@ -601,6 +600,9 @@
             }, {
               "hashAlg": "SHA2-512",
               "saltLen": 64
+            }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
             }]
           }]
         },{
@@ -619,6 +621,9 @@
             }, {
               "hashAlg": "SHA2-512",
               "saltLen": 64
+            }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
             }]
           }]
         },{
@@ -637,6 +642,9 @@
             }, {
               "hashAlg": "SHA2-512",
               "saltLen": 64
+            }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
             }]
           }]
         }]
@@ -714,6 +722,27 @@
         },{
           "sigType": "pss",
           "properties": [{
+            "modulo": 1024,
+            "hashPair": [{
+              "hashAlg": "SHA2-224",
+              "saltLen": 28
+            }, {
+              "hashAlg": "SHA2-256",
+              "saltLen": 32
+            }, {
+              "hashAlg": "SHA2-384",
+              "saltLen": 48
+            }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
+            }, {
+              "hashAlg": "SHA-1",
+              "saltLen": 20
+            }]
+          }]
+        },{
+          "sigType": "pss",
+          "properties": [{
             "modulo": 2048,
             "hashPair": [{
               "hashAlg": "SHA2-224",
@@ -728,6 +757,9 @@
               "hashAlg": "SHA2-512",
               "saltLen": 64
             }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
+            }, {
               "hashAlg": "SHA-1",
               "saltLen": 20
             }]
@@ -749,6 +781,9 @@
               "hashAlg": "SHA2-512",
               "saltLen": 64
             }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
+            }, {
               "hashAlg": "SHA-1",
               "saltLen": 20
             }]
@@ -770,6 +805,9 @@
               "hashAlg": "SHA2-512",
               "saltLen": 64
             }, {
+              "hashAlg": "SHA2-512/256",
+              "saltLen": 32
+            }, {
               "hashAlg": "SHA-1",
               "saltLen": 20
             }]
@@ -784,12 +822,12 @@
           "direction": ["gen", "ver"],
           "msgLen": [{
             "min": 0,
-            "max": 65536,
+            "max": 524288,
             "increment": 8
           }],
           "keyLen": [128, 256],
           "macLen": [{
-            "min": 32,
+            "min": 8,
             "max": 128,
             "increment": 8
           }]
@@ -1059,10 +1097,21 @@
     return false;
   }
   memcpy(&tag_len_32, tag_len_span.data(), sizeof(tag_len_32));
-  if (tag_len_32 != 4) {
-    LOG_ERROR("AES-CCM only supports 4-byte tags, but %u was requested\n",
-              static_cast<unsigned>(tag_len_32));
-    return false;
+  const EVP_AEAD *aead;
+  switch (tag_len_32) {
+    case 4:
+      aead = EVP_aead_aes_128_ccm_bluetooth();
+      break;
+
+    case 8:
+      aead = EVP_aead_aes_128_ccm_bluetooth_8();
+      break;
+
+    default:
+      LOG_ERROR(
+          "AES-CCM only supports 4- and 8-byte tags, but %u was requested\n",
+          static_cast<unsigned>(tag_len_32));
+      return false;
   }
 
   if (key.size() != 16) {
@@ -1071,8 +1120,8 @@
     return false;
   }
 
-  if (!EVP_AEAD_CTX_init(ctx, EVP_aead_aes_128_ccm_bluetooth(), key.data(),
-                         key.size(), tag_len_32, nullptr)) {
+  if (!EVP_AEAD_CTX_init(ctx, aead, key.data(), key.size(), tag_len_32,
+                         nullptr)) {
     LOG_ERROR("Failed to setup AES-CCM with tag length %u\n",
               static_cast<unsigned>(tag_len_32));
     return false;
@@ -1382,17 +1431,31 @@
   return write_reply({Span<const uint8_t>(digest, digest_len)});
 }
 
+template <bool WithReseed>
 static bool DRBG(const Span<const uint8_t> args[], ReplyCallback write_reply) {
   const auto out_len_bytes = args[0];
   const auto entropy = args[1];
   const auto personalisation = args[2];
-  const auto additional_data1 = args[3];
-  const auto additional_data2 = args[4];
-  const auto nonce = args[5];
+
+  Span<const uint8_t> reseed_additional_data, reseed_entropy, additional_data1,
+      additional_data2, nonce;
+  if (!WithReseed) {
+    additional_data1 = args[3];
+    additional_data2 = args[4];
+    nonce = args[5];
+  } else {
+    reseed_additional_data = args[3];
+    reseed_entropy = args[4];
+    additional_data1 = args[5];
+    additional_data2 = args[6];
+    nonce = args[7];
+  }
 
   uint32_t out_len;
   if (out_len_bytes.size() != sizeof(out_len) ||
       entropy.size() != CTR_DRBG_ENTROPY_LEN ||
+      (!reseed_entropy.empty() &&
+       reseed_entropy.size() != CTR_DRBG_ENTROPY_LEN) ||
       // nonces are not supported
       nonce.size() != 0) {
     return false;
@@ -1406,6 +1469,10 @@
   CTR_DRBG_STATE drbg;
   if (!CTR_DRBG_init(&drbg, entropy.data(), personalisation.data(),
                      personalisation.size()) ||
+      (!reseed_entropy.empty() &&
+       !CTR_DRBG_reseed(&drbg, reseed_entropy.data(),
+                        reseed_additional_data.data(),
+                        reseed_additional_data.size())) ||
       !CTR_DRBG_generate(&drbg, out.data(), out_len, additional_data1.data(),
                          additional_data1.size()) ||
       !CTR_DRBG_generate(&drbg, out.data(), out_len, additional_data2.data(),
@@ -1517,6 +1584,8 @@
     return EVP_sha384();
   } else if (StringEq(name, "SHA2-512")) {
     return EVP_sha512();
+  } else if (StringEq(name, "SHA2-512/256")) {
+    return EVP_sha512_256();
   } else {
     return nullptr;
   }
@@ -1915,7 +1984,9 @@
     {"HMAC-SHA2-256", 2, HMAC<EVP_sha256>},
     {"HMAC-SHA2-384", 2, HMAC<EVP_sha384>},
     {"HMAC-SHA2-512", 2, HMAC<EVP_sha512>},
-    {"ctrDRBG/AES-256", 6, DRBG},
+    {"HMAC-SHA2-512/256", 2, HMAC<EVP_sha512_256>},
+    {"ctrDRBG/AES-256", 6, DRBG<false>},
+    {"ctrDRBG-reseed/AES-256", 8, DRBG<true>},
     {"ECDSA/keyGen", 1, ECDSAKeyGen},
     {"ECDSA/keyVer", 3, ECDSAKeyVer},
     {"ECDSA/sigGen", 4, ECDSASigGen},
@@ -1932,6 +2003,7 @@
     {"RSA/sigGen/SHA2-256/pss", 2, RSASigGen<EVP_sha256, true>},
     {"RSA/sigGen/SHA2-384/pss", 2, RSASigGen<EVP_sha384, true>},
     {"RSA/sigGen/SHA2-512/pss", 2, RSASigGen<EVP_sha512, true>},
+    {"RSA/sigGen/SHA2-512/256/pss", 2, RSASigGen<EVP_sha512_256, true>},
     {"RSA/sigGen/SHA-1/pss", 2, RSASigGen<EVP_sha1, true>},
     {"RSA/sigVer/SHA2-224/pkcs1v1.5", 4, RSASigVer<EVP_sha224, false>},
     {"RSA/sigVer/SHA2-256/pkcs1v1.5", 4, RSASigVer<EVP_sha256, false>},
@@ -1942,6 +2014,7 @@
     {"RSA/sigVer/SHA2-256/pss", 4, RSASigVer<EVP_sha256, true>},
     {"RSA/sigVer/SHA2-384/pss", 4, RSASigVer<EVP_sha384, true>},
     {"RSA/sigVer/SHA2-512/pss", 4, RSASigVer<EVP_sha512, true>},
+    {"RSA/sigVer/SHA2-512/256/pss", 4, RSASigVer<EVP_sha512_256, true>},
     {"RSA/sigVer/SHA-1/pss", 4, RSASigVer<EVP_sha1, true>},
     {"TLSKDF/1.0/SHA-1", 5, TLSKDF<EVP_md5_sha1>},
     {"TLSKDF/1.2/SHA2-256", 5, TLSKDF<EVP_sha256>},
diff --git a/src/util/fipstools/acvp/modulewrapper/modulewrapper.h b/src/util/fipstools/acvp/modulewrapper/modulewrapper.h
index 0472800..cb8f9f3 100644
--- a/src/util/fipstools/acvp/modulewrapper/modulewrapper.h
+++ b/src/util/fipstools/acvp/modulewrapper/modulewrapper.h
@@ -26,7 +26,7 @@
 
 // kMaxArgs is the maximum number of arguments (including the function name)
 // that an ACVP request can contain.
-constexpr size_t kMaxArgs = 8;
+constexpr size_t kMaxArgs = 9;
 // kMaxNameLength is the maximum length of a function name in an ACVP request.
 constexpr size_t kMaxNameLength = 30;
 
diff --git a/src/util/fipstools/break-kat.go b/src/util/fipstools/break-kat.go
new file mode 100644
index 0000000..b500545
--- /dev/null
+++ b/src/util/fipstools/break-kat.go
@@ -0,0 +1,89 @@
+// break-kat corrupts a known-answer-test input in a binary and writes the
+// corrupted binary to stdout. This is used to demonstrate that the KATs in the
+// binary notice the error.
+package main
+
+import (
+	"bytes"
+	"encoding/hex"
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"sort"
+)
+
+var (
+	kats = map[string]string{
+		"HMAC-SHA-256":    "dad91293dfcf2a7c8ecd13fe353fa75b",
+		"AES-CBC-encrypt": "078609a6c5ac2544699adf682fa377f9be8ab6aef563e8c56a36b84f557fadd3",
+		"AES-CBC-decrypt": "347aa5a024b28257b36510be583d4f47adb7bbeedc6005bbbd0d0a9f06bb7b10",
+		"AES-GCM-encrypt": "8fcc4099808e75caaff582898848a88d808b55ab4e9370797d940be8cc1d7884",
+		"AES-GCM-decrypt": "35f3058f875760ff09d3120f70c4bc9ed7a86872e13452202176f7371ae04faae1dd391920f5d13953d896785994823c",
+		"DRBG":            "c4da0740d505f1ee280b95e58c4931ac6de846a0152fbb4a3f174cf4787a4f1a40c2b50babe14aae530be5886d910a27",
+		"DRBG-reseed":     "c7161ca36c2309b716e9859bb96c6d49bdc8352103a18cd24ef42ec97ef46bf446eb1a4576c186e9351803763a7912fe",
+		"SHA-1":           "132fd9bad5c1826263bafbb699f707a5",
+		"SHA-256":         "ff3b857da7236a2baa0f396b51522217",
+		"SHA-512":         "212512f8d2ad8322781c6c4d69a9daa1",
+		"TLS-KDF":         "abc3657b094c7628a0b282996fe75a75f4984fd94d4ecc2fcf53a2c469a3f731",
+		"RSA-sign":        "d2b56e53306f720d7929d8708bf46f1c22300305582b115bedcac722d8aa5ab2",
+		"RSA-verify":      "abe2cbc13d6bd39d48db5334ddbf8d070a93bdcb104e2cc5d0ee486ee295f6b31bda126c41890b98b73e70e6b65d82f95c663121755a90744c8d1c21148a1960be0eca446e9ff497f1345c537ef8119b9a4398e95c5c6de2b1c955905c5299d8ce7a3b6ab76380d9babdd15f610237e1f3f2aa1c1f1e770b62fbb596381b2ebdd77ecef9c90d4c92f7b6b05fed2936285fa94826e62055322a33b6f04c74ce69e5d8d737fb838b79d2d48e3daf71387531882531a95ac964d02ea413bf85952982bbc089527daff5b845c9a0f4d14ef1956d9c3acae882d12da66da0f35794f5ee32232333517db9315232a183b991654dbea41615345c885325926744a53915",
+		"ECDSA-sign":      "1e35930be860d0942ca7bbd6f6ded87f157e4de24f81ed4b875c0e018e89a81f",
+		"ECDSA-verify":    "6780c5fc70275e2c7061a0e7877bb174deadeb9887027f3fa83654158ba7f50c2d36e5799790bfbe2183d33e96f3c51f6a232f2a24488c8e5f64c37ea2cf0529",
+		"Z-computation":   "e7604491269afb5b102d6ea52cb59feb70aede6ce3bfb3e0105485abd861d77b",
+		"FFDH":            "a14f8ad36be37b18b8f35864392f150ab7ee22c47e1870052a3f17918274af18aaeaf4cf6aacfde96c9d586eb7ebaff6b03fe3b79a8e2ff9dd6df34caaf2ac70fd3771d026b41a561ee90e4337d0575f8a0bd160c868e7e3cef88aa1d88448b1e4742ba11480a9f8a8b737347c408d74a7d57598c48875629df0c85327a124ddec1ad50cd597a985588434ce19c6f044a1696b5f244b899b7e77d4f6f20213ae8eb15d37eb8e67e6c8bdbc4fd6e17426283da96f23a897b210058c7c70fb126a5bf606dbeb1a6d5cca04184c4e95c2e8a70f50f5c1eabd066bd79c180456316ac02d366eb3b0e7ba82fb70dcbd737ca55734579dd250fffa8e0584be99d32b35",
+	}
+
+	listTests = flag.Bool("list-tests", false, "List known test values and exit")
+)
+
+func main() {
+	flag.Parse()
+
+	if *listTests {
+		for _, kat := range sortedKATs() {
+			fmt.Println(kat)
+		}
+		os.Exit(0)
+	}
+
+	if flag.NArg() != 2 || kats[flag.Arg(1)] == "" {
+		fmt.Fprintln(os.Stderr, "Usage: break-kat <binary path> <test to break> > output")
+		fmt.Fprintln(os.Stderr, "Possible values for <test to break>:")
+		for _, kat := range sortedKATs() {
+			fmt.Fprintln(os.Stderr, " ", kat)
+		}
+		os.Exit(1)
+	}
+
+	inPath := flag.Arg(0)
+	test := flag.Arg(1)
+	testInputValue, err := hex.DecodeString(kats[test])
+	if err != nil {
+		panic("invalid kat data: " + err.Error())
+	}
+
+	binaryContents, err := ioutil.ReadFile(inPath)
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(2)
+	}
+
+	i := bytes.Index(binaryContents, testInputValue)
+	if i < 0 {
+		fmt.Fprintln(os.Stderr, "Expected test input value was not found in binary.")
+		os.Exit(3)
+	}
+
+	binaryContents[i] ^= 1
+	os.Stdout.Write(binaryContents)
+}
+
+func sortedKATs() []string {
+	var ret []string
+	for kat := range kats {
+		ret = append(ret, kat)
+	}
+	sort.Strings(ret)
+	return ret
+}
diff --git a/src/util/fipstools/break-tests-android.sh b/src/util/fipstools/break-tests-android.sh
deleted file mode 100644
index efb166e..0000000
--- a/src/util/fipstools/break-tests-android.sh
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright (c) 2019, Google Inc.
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-# This script exists to exercise breaking each of the FIPS tests on an Android
-# device. Since, on Android, BoringCrypto exists in both 32- and 64-bit
-# versions, the first argument must be either "32" or "64" to select which is
-# being tested. The Android source tree must have been setup (with "lunch") for
-# a matching build configuration before using this script to build the
-# binaries. (Although it'll fail non-silently if there's a mismatch.)
-#
-# Since each test needs the FIPS module to be compiled differently, and that
-# can take a long time, this script is run twice: once with "build" as the
-# second argument to run the builds, and then with "run" as the second argument
-# to run each test.
-#
-# Run it with /bin/bash, not /bin/sh, otherwise "read" may fail.
-#
-# In order to reconfigure the build for each test, it needs to set a define. It
-# does so by rewriting a template in external/boringssl/Android.bp and you must
-# add the template value before doing the builds. To do so, insert
-# -DBORINGSSL_FIPS_BREAK_XXX=1 in the cflags list for the module, probably by
-# putting it in the "boringssl_flags" stanza.
-
-set -x
-set -e
-
-if [ ! -f external/boringssl/Android.bp ]; then
-  echo "Must be run from the top-level of an Android source tree."
-  exit 1
-fi
-
-. build/envsetup.sh
-
-TESTS="NONE ECDSA_PWCT CRNG RSA_PWCT AES_CBC AES_GCM DES SHA_1 SHA_256 SHA_512 RSA_SIG DRBG ECDSA_SIG Z_COMPUTATION TLS_KDF FFC_DH"
-
-if [ "x$1" = "x32" ]; then
-  lib="lib"
-  bits="32"
-elif [ "x$1" = "x64" ] ; then
-  lib="lib64"
-  bits="64"
-else
-  echo "First argument must be 32 or 64"
-  exit 1
-fi
-
-if [ "x$2" = "xbuild" ]; then
-  if ! grep -q DBORINGSSL_FIPS_BREAK_XXX=1 external/boringssl/Android.bp; then
-    echo "Missing DBORINGSSL_FIPS_BREAK_XXX in external/boringssl/Android.bp. Edit the file and insert -DBORINGSSL_FIPS_BREAK_XXX=1 in the cflags for the FIPS module"
-    exit 1
-  fi
-
-  printf "\\x1b[1mBuilding modules\\x1b[0m\n"
-  for test in $TESTS; do
-    printf "\\x1b[1mBuilding for ${test}\\x1b[0m\n"
-    cp external/boringssl/Android.bp external/boringssl/Android.bp.orig
-    sed -i -e "s/DBORINGSSL_FIPS_BREAK_XXX/DBORINGSSL_FIPS_BREAK_${test}/" external/boringssl/Android.bp
-    m test_fips
-    dir=test-${bits}-${test}
-    rm -Rf $dir
-    mkdir $dir
-    cp ${ANDROID_PRODUCT_OUT}/system/${lib}/libcrypto.so $dir
-    cp ${ANDROID_PRODUCT_OUT}/system/bin/test_fips $dir
-    if [ $bits = "32" ] ; then
-      if ! file ${dir}/test_fips | grep -q "32-bit" ; then
-        echo "32-bit build requested but binaries don't appear to be 32-bit:"
-        file ${dir}/test_fips
-        exit 1
-      fi
-    else
-      if ! file ${dir}/test_fips | grep -q "64-bit" ; then
-        echo "64-bit build requested but binaries don't appear to be 64-bit:"
-        file ${dir}/test_fips
-        exit 1
-      fi
-    fi
-    cp external/boringssl/Android.bp.orig external/boringssl/Android.bp
-  done
-elif [ "x$2" = "xrun" ]; then
-  printf "\\x1b[1mTesting\\x1b[0m\n"
-  for test in $TESTS; do
-    dir=test-${bits}-${test}
-    if [ ! '(' -d ${dir} -a -f ${dir}/test_fips -a -f ${dir}/libcrypto.so ')' ] ; then
-      echo "Build directory ${dir} is missing or is missing files"
-      exit 1
-    fi
-    adb push ${dir}/* /data/local/tmp
-    printf "\\x1b[1mTesting ${test}\\x1b[0m\n"
-    adb shell -n -t -x LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test_fips
-    read
-  done
-
-  printf "\\x1b[1mTesting integrity}\\x1b[0m\n"
-  src=test-${bits}-NONE
-  dir=test-${bits}-INT
-  rm -Rf $dir
-  mkdir $dir
-  go run external/boringssl/src/util/fipstools/break-hash.go ${src}/libcrypto.so ${dir}/libcrypto.so
-  cp ${src}/test_fips $dir
-  adb push ${dir}/* /data/local/tmp
-  adb shell -n -t -x LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test_fips
-  read
-else
-  echo "Second argument must be build or run"
-  exit 1
-fi
diff --git a/src/util/fipstools/break-tests.sh b/src/util/fipstools/break-tests.sh
index 84c24ee..f9ae2e8 100644
--- a/src/util/fipstools/break-tests.sh
+++ b/src/util/fipstools/break-tests.sh
@@ -1,4 +1,4 @@
-# Copyright (c) 2018, Google Inc.
+# Copyright (c) 2022, Google Inc.
 #
 # Permission to use, copy, modify, and/or distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
@@ -10,44 +10,164 @@
 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-# This script exists to exercise breaking each of the FIPS tests. It builds
-# BoringSSL differently for each test and that can take a long time. Thus it's
-# run twice: once, from a BoringSSL source tree, with "build" as the sole
-# argument to run the builds, and then (from the same location) with no
-# arguments to run each script.
+# This script runs test_fips repeatedly with different FIPS tests broken. It is
+# intended to be observed to demonstrate that the various tests are working and
+# thus pauses for a keystroke between tests.
 #
-# Run it with /bin/bash, not /bin/sh, otherwise "read" may fail.
+# Runs in either device mode (on an attached Android device) or in a locally built
+# BoringSSL checkout.
+#
+# On Android static binaries are not built using FIPS mode, so in device mode each
+# test makes changes to libcrypto.so rather than the test binary, test_fips.
 
-set -x
+set -e
 
-TESTS="NONE ECDSA_PWCT CRNG RSA_PWCT AES_CBC AES_GCM DES SHA_1 SHA_256 SHA_512 RSA_SIG DRBG ECDSA_SIG Z_COMPUTATION TLS_KDF FFC_DH"
+die () {
+    echo "ERROR: $@"
+    exit 1
+}
 
-if [ "x$1" = "xbuild" ]; then
-	for test in $TESTS; do
-		rm -Rf build-$test
-		mkdir build-$test
-		pushd build-$test
-		cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=${HOME}/toolchain -DFIPS=1 -DFIPS_BREAK_TEST=${test} -DCMAKE_BUILD_TYPE=Release ..
-		ninja test_fips
-		popd
-	done
+usage() {
+    echo "USAGE: $0 [local|device]"
+    exit 1
+}
 
-	exit 0
+inferred_mode() {
+    # Try and infer local or device mode based on makefiles and artifacts.
+    if [ -f Android.bp -o -f external/boringssl/Android.bp ]
+    then
+       echo device
+    elif [ -f CMakeLists.txt -a -d build/crypto -a -d build/ssl ]
+    then
+	echo local
+    else
+	echo "Unable to infer mode, please specify on the command line."
+	usage
+    fi
+}
+
+# Prefer mode from command line if present.
+case "$1" in
+    local|device)
+	MODE=$1
+	;;
+
+    "")
+	MODE=`inferred_mode`
+	;;
+
+    *)
+	usage
+	;;
+esac
+
+check_directory() {
+    test -d $1 || die "Directory $1 not found."
+}
+
+check_file() {
+    test -f $1 || die "File $1 not found."
+}
+
+run_test_locally() {
+    eval "$1" || true
+}
+
+run_test_on_device() {
+    EXECFILE="$1"
+    LIBRARY="$2"
+    adb shell rm -rf $DEVICE_TMP
+    adb shell mkdir -p $DEVICE_TMP
+    adb push $EXECFILE $DEVICE_TMP > /dev/null
+    EXECPATH=$(basename $EXECFILE)
+    adb push $LIBRARY $DEVICE_TMP > /dev/null
+    adb shell "LD_LIBRARY_PATH=$DEVICE_TMP $DEVICE_TMP/$EXECPATH" || true
+}
+
+device_integrity_break_test() {
+    go run $BORINGSSL/util/fipstools/break-hash.go $LIBCRYPTO_BIN ./libcrypto.so
+    $RUN $TEST_FIPS_BIN ./libcrypto.so
+    rm ./libcrypto.so
+}
+
+local_integrity_break_test() {
+    go run $BORINGSSL/util/fipstools/break-hash.go $TEST_FIPS_BIN ./break-bin
+    chmod u+x ./break-bin
+    $RUN ./break-bin
+    rm ./break-bin
+}
+
+# TODO(prb): make break-hash and break-kat take similar arguments to save having
+# separate functions for each.
+device_kat_break_test() {
+    KAT="$1"
+    go run $BORINGSSL/util/fipstools/break-kat.go $LIBCRYPTO_BIN $KAT > ./libcrypto.so
+    $RUN $TEST_FIPS_BIN ./libcrypto.so
+    rm ./libcrypto.so
+}
+
+local_kat_break_test() {
+    KAT="$1"
+    go run $BORINGSSL/util/fipstools/break-kat.go $TEST_FIPS_BIN $KAT > ./break-bin
+    chmod u+x ./break-bin
+    $RUN ./break-bin
+    rm ./break-bin
+}
+
+pause () {
+    echo -n "Press <Enter> "
+    read
+}
+
+if [ "$MODE" = "local" ]
+then
+    TEST_FIPS_BIN="build/util/fipstools/test_fips"
+    BORINGSSL=.
+    RUN=run_test_locally
+    BREAK_TEST=local_break_test
+    INTEGRITY_BREAK_TEST=local_integrity_break_test
+    KAT_BREAK_TEST=local_kat_break_test
+    if [ ! -f $TEST_FIPS_BIN ]; then
+	echo "$TEST_FIPS_BIN is missing. Run this script from the top level of a"
+	echo "BoringSSL checkout and ensure that BoringSSL has been built in"
+	echo "build/ with -DFIPS_BREAK_TEST=TESTS passed to CMake."
+	exit 1
+    fi
+else # Device mode
+    test "$ANDROID_BUILD_TOP" || die "'lunch aosp_arm64-eng' first"
+    check_directory "$ANDROID_PRODUCT_OUT"
+
+    TEST_FIPS_BIN="$ANDROID_PRODUCT_OUT/system/bin/test_fips"
+    check_file "$TEST_FIPS_BIN"
+    LIBCRYPTO_BIN="$ANDROID_PRODUCT_OUT/system/lib64/libcrypto.so"
+    check_file "$LIBCRYPTO_BIN"
+
+    test "$ANDROID_SERIAL" || die "ANDROID_SERIAL not set"
+    DEVICE_TMP=/data/local/tmp
+
+    BORINGSSL="$ANDROID_BUILD_TOP/external/boringssl/src"
+    RUN=run_test_on_device
+    INTEGRITY_BREAK_TEST=device_integrity_break_test
+    KAT_BREAK_TEST=device_kat_break_test
 fi
 
-for test in $TESTS; do
-	pushd build-$test
-	printf "\n\n\\x1b[1m$test\\x1b[0m\n"
-	./util/fipstools/cavp/test_fips
-	echo "Waiting for keypress..."
-	read
-	popd
-done
 
-pushd build-NONE
-printf "\\x1b[1mIntegrity\\x1b[0m\n"
-go run ../util/fipstools/break-hash.go ./util/fipstools/cavp/test_fips ./util/fipstools/cavp/test_fips_broken
-./util/fipstools/cavp/test_fips_broken
-popd
+KATS=$(go run $BORINGSSL/util/fipstools/break-kat.go --list-tests)
+
+echo -e '\033[1mNormal output\033[0m'
+$RUN $TEST_FIPS_BIN $LIBCRYPTO_BIN
+pause
+
+echo
+echo -e '\033[1mIntegrity test failure\033[0m'
+$INTEGRITY_BREAK_TEST
+pause
+
+for kat in $KATS; do
+  echo
+  echo -e "\033[1mKAT failure ${kat}\033[0m"
+  $KAT_BREAK_TEST $kat
+  pause
+done
diff --git a/src/util/fipstools/cavp/CMakeLists.txt b/src/util/fipstools/cavp/CMakeLists.txt
deleted file mode 100644
index a50c9ab..0000000
--- a/src/util/fipstools/cavp/CMakeLists.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-include_directories(../../../include)
-
-if(FIPS)
-  add_executable(
-    cavp
-
-    cavp_main.cc
-
-    cavp_aes_gcm_test.cc
-    cavp_aes_test.cc
-    cavp_ctr_drbg_test.cc
-    cavp_ecdsa2_keypair_test.cc
-    cavp_ecdsa2_pkv_test.cc
-    cavp_ecdsa2_siggen_test.cc
-    cavp_ecdsa2_sigver_test.cc
-    cavp_hmac_test.cc
-    cavp_kas_test.cc
-    cavp_keywrap_test.cc
-    cavp_rsa2_keygen_test.cc
-    cavp_rsa2_siggen_test.cc
-    cavp_rsa2_sigver_test.cc
-    cavp_sha_monte_test.cc
-    cavp_sha_test.cc
-    cavp_tdes_test.cc
-    cavp_tlskdf_test.cc
-
-    cavp_test_util.cc
-  )
-
-  add_dependencies(cavp global_target)
-
-  add_executable(
-    test_fips
-
-    test_fips.c
-  )
-
-  add_dependencies(test_fips global_target)
-
-  target_link_libraries(cavp test_support_lib crypto)
-  target_link_libraries(test_fips test_support_lib crypto)
-endif()
diff --git a/src/util/fipstools/cavp/cavp_aes_gcm_test.cc b/src/util/fipstools/cavp/cavp_aes_gcm_test.cc
deleted file mode 100644
index 6ee991d..0000000
--- a/src/util/fipstools/cavp/cavp_aes_gcm_test.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_aes_gcm_test processes a NIST CAVP AES GCM test vector request file and
-// emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/aead.h>
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_AEAD *aead;
-};
-
-}
-
-static const EVP_AEAD *GetAEAD(const std::string &name, const bool enc) {
-  if (name == "aes-128-gcm") {
-    return EVP_aead_aes_128_gcm();
-  } else if (name == "aes-192-gcm") {
-    return EVP_aead_aes_192_gcm();
-  } else if (name == "aes-256-gcm") {
-    return EVP_aead_aes_256_gcm();
-  }
-  return nullptr;
-}
-
-static bool TestAEADEncrypt(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string key_len_str, iv_len_str, pt_len_str, aad_len_str, tag_len_str;
-  if (!t->GetInstruction(&key_len_str, "Keylen") ||
-      !t->GetInstruction(&iv_len_str, "IVlen") ||
-      !t->GetInstruction(&pt_len_str, "PTlen") ||
-      !t->GetInstruction(&aad_len_str, "AADlen") ||
-      !t->GetInstruction(&tag_len_str, "Taglen")) {
-    return false;
-  }
-
-  std::string count;
-  std::vector<uint8_t> key, iv, pt, aad, tag, ct;
-  if (!t->GetAttribute(&count, "Count") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&iv, "IV") ||
-      !t->GetBytes(&pt, "PT") ||
-      !t->GetBytes(&aad, "AAD") ||
-      key.size() * 8 != strtoul(key_len_str.c_str(), nullptr, 0) ||
-      iv.size() * 8 != strtoul(iv_len_str.c_str(), nullptr, 0) ||
-      pt.size() * 8 != strtoul(pt_len_str.c_str(), nullptr, 0) ||
-      aad.size() * 8 != strtoul(aad_len_str.c_str(), nullptr, 0) ||
-      iv.size() != 12) {
-    return false;
-  }
-
-  const size_t tag_len = strtoul(tag_len_str.c_str(), nullptr, 0) / 8;
-  if (!AEADEncrypt(ctx->aead, &ct, &tag, tag_len, key, pt, aad, iv)) {
-    return false;
-  }
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("CT = %s\r\n", EncodeHex(ct).c_str());
-  printf("Tag = %s\r\n\r\n", EncodeHex(tag).c_str());
-
-  return true;
-}
-
-static bool TestAEADDecrypt(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string key_len, iv_len, pt_len_str, aad_len_str, tag_len;
-  if (!t->GetInstruction(&key_len, "Keylen") ||
-      !t->GetInstruction(&iv_len, "IVlen") ||
-      !t->GetInstruction(&pt_len_str, "PTlen") ||
-      !t->GetInstruction(&aad_len_str, "AADlen") ||
-      !t->GetInstruction(&tag_len, "Taglen")) {
-    t->PrintLine("Invalid instruction block.");
-    return false;
-  }
-  size_t aad_len = strtoul(aad_len_str.c_str(), nullptr, 0) / 8;
-  size_t pt_len = strtoul(pt_len_str.c_str(), nullptr, 0) / 8;
-
-  std::string count;
-  std::vector<uint8_t> key, iv, ct, aad, tag, pt;
-  if (!t->GetAttribute(&count, "Count") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&aad, "AAD") ||
-      !t->GetBytes(&tag, "Tag") ||
-      !t->GetBytes(&iv, "IV") ||
-      !t->GetBytes(&ct, "CT") ||
-      key.size() * 8 != strtoul(key_len.c_str(), nullptr, 0) ||
-      iv.size() * 8 != strtoul(iv_len.c_str(), nullptr, 0) ||
-      ct.size() != pt_len ||
-      aad.size() != aad_len ||
-      tag.size() * 8 != strtoul(tag_len.c_str(), nullptr, 0)) {
-    t->PrintLine("Invalid test case");
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  bool aead_result =
-      AEADDecrypt(ctx->aead, &pt, pt_len, key, aad, ct, tag, iv);
-  if (aead_result) {
-    printf("PT = %s\r\n\r\n", EncodeHex(pt).c_str());
-  } else {
-    printf("FAIL\r\n\r\n");
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (enc|dec) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_aes_gcm_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string mode(argv[1]);
-  bool (*test_fn)(FileTest * t, void *arg);
-  if (mode == "enc") {
-    test_fn = &TestAEADEncrypt;
-  } else if (mode == "dec") {
-    test_fn = &TestAEADDecrypt;
-  } else {
-    return usage(argv[0]);
-  }
-
-  const EVP_AEAD *aead = GetAEAD(argv[2], mode == "enc");
-  if (aead == nullptr) {
-    fprintf(stderr, "invalid aead: %s\n", argv[2]);
-    return 1;
-  }
-
-  TestCtx ctx = {aead};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = test_fn;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_aes_test.cc b/src/util/fipstools/cavp/cavp_aes_test.cc
deleted file mode 100644
index d1f49b4..0000000
--- a/src/util/fipstools/cavp/cavp_aes_test.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_aes_test processes a NIST CAVP AES test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_CIPHER *cipher;
-  bool has_iv;
-  enum Mode {
-    kKAT,  // Known Answer Test
-    kMCT,  // Monte Carlo Test
-  };
-  Mode mode;
-};
-
-}
-
-static bool MonteCarlo(const TestCtx *ctx, FileTest *t,
-                       const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
-                       bool encrypt, std::vector<uint8_t> key,
-                       std::vector<uint8_t> iv, std::vector<uint8_t> in) {
-  const std::string in_label = encrypt ? "PLAINTEXT" : "CIPHERTEXT",
-                    result_label = encrypt ? "CIPHERTEXT" : "PLAINTEXT";
-  std::vector<uint8_t> prev_result, result, prev_in;
-  for (int i = 0; i < 100; i++) {
-    printf("COUNT = %d\r\nKEY = %s\r\n", i, EncodeHex(key).c_str());
-    if (ctx->has_iv) {
-      printf("IV = %s\r\n", EncodeHex(iv).c_str());
-    }
-    printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-
-    if (!ctx->has_iv) {  // ECB mode
-      for (int j = 0; j < 1000; j++) {
-        prev_result = result;
-        if (!CipherOperation(cipher, &result, encrypt, key, iv, in)) {
-          return false;
-        }
-        in = result;
-      }
-    } else {
-      for (int j = 0; j < 1000; j++) {
-        prev_result = result;
-        if (j > 0) {
-          if (encrypt) {
-            iv = result;
-          } else {
-            iv = prev_in;
-          }
-        }
-
-        if (!CipherOperation(cipher, &result, encrypt, key, iv, in)) {
-          return false;
-        }
-
-        prev_in = in;
-
-        if (j == 0) {
-          in = iv;
-        } else {
-          in = prev_result;
-        }
-      }
-    }
-
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-    const size_t key_len = key.size() * 8;
-    if (key_len == 128) {
-      for (size_t k = 0; k < key.size(); k++) {
-        key[k] ^= result[k];
-      }
-    } else if (key_len == 192) {
-      for (size_t k = 0; k < key.size(); k++) {
-        // Key[i+1] = Key[i] xor (last 64-bits of CT[j-1] || CT[j])
-        if (k < 8) {
-          key[k] ^= prev_result[prev_result.size() - 8 + k];
-        } else {
-          key[k] ^= result[k - 8];
-        }
-      }
-    } else {  // key_len == 256
-      for (size_t k = 0; k < key.size(); k++) {
-        // Key[i+1] = Key[i] xor (CT[j-1] || CT[j])
-        if (k < 16) {
-          key[k] ^= prev_result[k];
-        } else {
-          key[k] ^= result[k - 16];
-        }
-      }
-    }
-
-    if (ctx->has_iv) {
-      iv = result;
-      in = prev_result;
-    } else {
-      in = result;
-    }
-  }
-
-  return true;
-}
-
-static bool TestCipher(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  std::string count;
-  std::vector<uint8_t> key, iv, in, result;
-  if (!t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&key, "KEY") ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV"))) {
-    return false;
-  }
-
-  const EVP_CIPHER *cipher = ctx->cipher;
-  if (operation == kEncrypt) {
-    if (!t->GetBytes(&in, "PLAINTEXT")) {
-      return false;
-    }
-  } else {  // operation == kDecrypt
-    if (!t->GetBytes(&in, "CIPHERTEXT")) {
-      return false;
-    }
-  }
-
-  if (ctx->mode == TestCtx::kKAT) {
-    if (!CipherOperation(cipher, &result, operation == kEncrypt, key, iv, in)) {
-      return false;
-    }
-    const std::string label =
-        operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-    printf("%s%s = %s\r\n\r\n", t->CurrentTestToString().c_str(), label.c_str(),
-           EncodeHex(result).c_str());
-  } else {  // ctx->mode == kMCT
-    const std::string op_label =
-        operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n\r\n", op_label.c_str());
-    if (!MonteCarlo(ctx, t, cipher, &result, operation == kEncrypt, key, iv,
-                    in)) {
-      return false;
-    }
-    if (operation == kEncrypt) {
-      // MCT tests contain a stray blank line after the ENCRYPT section.
-      printf("\r\n");
-    }
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (kat|mct) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_aes_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string tm(argv[1]);
-  enum TestCtx::Mode test_mode;
-  if (tm == "kat") {
-    test_mode = TestCtx::kKAT;
-  } else if (tm == "mct") {
-    test_mode = TestCtx::kMCT;
-  } else {
-    fprintf(stderr, "invalid test_mode: %s\n", tm.c_str());
-    return usage(argv[0]);
-  }
-
-  const std::string cipher_name(argv[2]);
-  const EVP_CIPHER *cipher = GetCipher(argv[2]);
-  if (cipher == nullptr) {
-    fprintf(stderr, "invalid cipher: %s\n", argv[2]);
-    return 1;
-  }
-  const bool has_iv =
-      (cipher_name != "aes-128-ecb" &&
-       cipher_name != "aes-192-ecb" &&
-       cipher_name != "aes-256-ecb");
-
-  TestCtx ctx = {cipher, has_iv, test_mode};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = TestCipher;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_ctr_drbg_test.cc b/src/util/fipstools/cavp/cavp_ctr_drbg_test.cc
deleted file mode 100644
index a27736e..0000000
--- a/src/util/fipstools/cavp/cavp_ctr_drbg_test.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_ctr_drbg_test processes a NIST CAVP DRBG800-90A test vector request
-// file and emits the corresponding response.
-
-#include <openssl/crypto.h>
-
-#include <stdlib.h>
-
-#include "cavp_test_util.h"
-#include "../crypto/fipsmodule/rand/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-
-
-static bool TestCTRDRBG(FileTest *t, void *arg) {
-  std::string test_type, prediction_resistance, entropy_input_len, nonce_len,
-      personalization_str_len, additional_input_len, returned_bits_len;
-  if (!t->GetInstruction(&test_type, "AES-256 no df") ||
-      !t->GetInstruction(&prediction_resistance, "PredictionResistance") ||
-      !t->GetInstruction(&entropy_input_len, "EntropyInputLen") ||
-      !t->GetInstruction(&nonce_len, "NonceLen") ||
-      !t->GetInstruction(&personalization_str_len,
-                         "PersonalizationStringLen") ||
-      !t->GetInstruction(&additional_input_len, "AdditionalInputLen") ||
-      !t->GetInstruction(&returned_bits_len, "ReturnedBitsLen") ||
-      !test_type.empty() ||
-      prediction_resistance != "False" ||
-      strtoul(entropy_input_len.c_str(), nullptr, 0) !=
-          CTR_DRBG_ENTROPY_LEN * 8 ||
-      nonce_len != "0") {
-    return false;
-  }
-
-  std::string count;
-  std::vector<uint8_t> entropy, nonce, personalization_str, ai1, ai2;
-  if (!t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&entropy, "EntropyInput") ||
-      !t->GetBytes(&nonce, "Nonce") ||
-      !t->GetBytes(&personalization_str, "PersonalizationString") ||
-      !t->GetBytes(&ai1, "AdditionalInput") ||
-      !t->GetBytes(&ai2, "AdditionalInput/2") ||
-      entropy.size() * 8 != strtoul(entropy_input_len.c_str(), nullptr, 0) ||
-      nonce.size() != 0 ||
-      personalization_str.size() * 8 !=
-          strtoul(personalization_str_len.c_str(), nullptr, 0) ||
-      ai1.size() != ai2.size() ||
-      ai1.size() * 8 != strtoul(additional_input_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  CTR_DRBG_STATE drbg;
-  CTR_DRBG_init(&drbg, entropy.data(),
-                personalization_str.size() > 0 ? personalization_str.data()
-                                               : nullptr,
-                personalization_str.size());
-
-  uint64_t out_len = strtoul(returned_bits_len.c_str(), nullptr, 0);
-  if (out_len == 0 || (out_len & 7) != 0) {
-    return false;
-  }
-  out_len /= 8;
-
-  std::vector<uint8_t> out;
-  out.resize(out_len);
-
-  CTR_DRBG_generate(&drbg, out.data(), out.size(),
-                    ai1.size() > 0 ? ai1.data() : nullptr, ai1.size());
-  CTR_DRBG_generate(&drbg, out.data(), out.size(),
-                    ai2.size() > 0 ? ai2.data() : nullptr, ai2.size());
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("ReturnedBits = %s\r\n\r\n", EncodeHex(out).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <test file>\n", arg);
-  return 1;
-}
-
-int cavp_ctr_drbg_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    return usage(argv[0]);
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestCTRDRBG;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc b/src/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc
deleted file mode 100644
index f8c4a01..0000000
--- a/src/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_ecdsa2_keypair_test processes a NIST CAVP ECDSA2 KeyPair test vector
-// request file and emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2KeyPair(FileTest *t, void *arg) {
-  std::string n_str;
-  const char *group_str;
-  int nid = GetECGroupNIDFromInstruction(t, &group_str);
-  if (nid == NID_undef ||
-      !t->GetAttribute(&n_str, "N")) {
-    return false;
-  }
-
-  // Don't use CurrentTestToString to avoid printing the N.
-  printf(
-      "[%s]\r\n\r\n[B.4.2 Key Pair Generation by Testing Candidates]\r\n\r\n",
-      group_str);
-
-  unsigned long n = strtoul(n_str.c_str(), nullptr, 10);
-  for (unsigned long i = 0; i < n; i++) {
-    bssl::UniquePtr<BIGNUM> qx(BN_new()), qy(BN_new());
-    bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-    if (!key ||
-        !EC_KEY_generate_key_fips(key.get()) ||
-        !EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(key.get()),
-                                             EC_KEY_get0_public_key(key.get()),
-                                             qx.get(), qy.get(), nullptr)) {
-      return false;
-    }
-
-    size_t degree_len =
-        (EC_GROUP_get_degree(EC_KEY_get0_group(key.get())) + 7) / 8;
-    size_t order_len =
-        BN_num_bytes(EC_GROUP_get0_order(EC_KEY_get0_group(key.get())));
-    std::vector<uint8_t> qx_bytes(degree_len), qy_bytes(degree_len);
-    std::vector<uint8_t> d_bytes(order_len);
-    if (!BN_bn2bin_padded(qx_bytes.data(), qx_bytes.size(), qx.get()) ||
-        !BN_bn2bin_padded(qy_bytes.data(), qy_bytes.size(), qy.get()) ||
-        !BN_bn2bin_padded(d_bytes.data(), d_bytes.size(),
-                          EC_KEY_get0_private_key(key.get()))) {
-      return false;
-    }
-
-    printf("d = %s\r\nQx = %s\r\nQy = %s\r\n\r\n", EncodeHex(d_bytes).c_str(),
-           EncodeHex(qx_bytes).c_str(), EncodeHex(qy_bytes).c_str());
-  }
-
-  return true;
-}
-
-int cavp_ecdsa2_keypair_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2KeyPair;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc b/src/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc
deleted file mode 100644
index d823e7a..0000000
--- a/src/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_ecdsa2_pkv_test processes a NIST CAVP ECDSA2 PKV test vector request file
-// and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2PKV(FileTest *t, void *arg) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  if (nid == NID_undef) {
-    return false;
-  }
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BIGNUM> qx = GetBIGNUM(t, "Qx");
-  bssl::UniquePtr<BIGNUM> qy = GetBIGNUM(t, "Qy");
-  if (!key || !qx || !qy) {
-    return false;
-  }
-
-  if (EC_KEY_set_public_key_affine_coordinates(key.get(), qx.get(), qy.get())) {
-    printf("%sResult = P\r\n\r\n", t->CurrentTestToString().c_str());
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("%sResult = F (%s)\r\n\r\n", t->CurrentTestToString().c_str(), buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_ecdsa2_pkv_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2PKV;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc b/src/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc
deleted file mode 100644
index 1282eaa..0000000
--- a/src/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_ecdsa2_siggen_test processes NIST CAVP ECDSA2 SigGen and
-// SigGenComponent test vector request files and emits the corresponding
-// response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ec_key.h>
-#include <openssl/ecdsa.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2SigGenImpl(FileTest *t, bool is_component) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  const EVP_MD *md = GetDigestFromInstruction(t);
-  if (nid == NID_undef || md == nullptr) {
-    return false;
-  }
-  bssl::UniquePtr<BIGNUM> qx(BN_new()), qy(BN_new());
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  std::vector<uint8_t> msg;
-  if (!qx || !qy || !key ||
-      !EC_KEY_generate_key_fips(key.get()) ||
-      !EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(key.get()),
-                                           EC_KEY_get0_public_key(key.get()),
-                                           qx.get(), qy.get(), nullptr) ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (is_component) {
-    if (msg.size() != EVP_MD_size(md)) {
-      t->PrintLine("Bad input length.");
-      return false;
-    }
-    digest_len = EVP_MD_size(md);
-    OPENSSL_memcpy(digest, msg.data(), msg.size());
-  } else if (!EVP_Digest(msg.data(), msg.size(), digest, &digest_len, md,
-                         nullptr)) {
-    return false;
-  }
-
-  bssl::UniquePtr<ECDSA_SIG> sig(ECDSA_do_sign(digest, digest_len, key.get()));
-  if (!sig) {
-    return false;
-  }
-
-  size_t degree_len =
-      (EC_GROUP_get_degree(EC_KEY_get0_group(key.get())) + 7) / 8;
-  size_t order_len =
-      BN_num_bytes(EC_GROUP_get0_order(EC_KEY_get0_group(key.get())));
-  std::vector<uint8_t> qx_bytes(degree_len), qy_bytes(degree_len);
-  std::vector<uint8_t> r_bytes(order_len), s_bytes(order_len);
-  if (!BN_bn2bin_padded(qx_bytes.data(), qx_bytes.size(), qx.get()) ||
-      !BN_bn2bin_padded(qy_bytes.data(), qy_bytes.size(), qy.get()) ||
-      !BN_bn2bin_padded(r_bytes.data(), r_bytes.size(), sig->r) ||
-      !BN_bn2bin_padded(s_bytes.data(), s_bytes.size(), sig->s)) {
-    return false;
-  }
-
-  printf("%sQx = %s\r\nQy = %s\r\nR = %s\r\nS = %s\r\n\r\n",
-         t->CurrentTestToString().c_str(), EncodeHex(qx_bytes).c_str(),
-         EncodeHex(qy_bytes).c_str(), EncodeHex(r_bytes).c_str(),
-         EncodeHex(s_bytes).c_str());
-  return true;
-}
-
-static bool TestECDSA2SigGen(FileTest *t, void *arg) {
-  return TestECDSA2SigGenImpl(t, false);
-}
-
-static bool TestECDSA2SigGenComponent(FileTest *t, void *arg) {
-  return TestECDSA2SigGenImpl(t, true);
-}
-
-int cavp_ecdsa2_siggen_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (SigGen|SigGenComponent) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  static bool (*test_func)(FileTest *, void *);
-  if (strcmp(argv[1], "SigGen") == 0) {
-    test_func = TestECDSA2SigGen;
-  } else if (strcmp(argv[1], "SigGenComponent") == 0) {
-    test_func = TestECDSA2SigGenComponent;
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = test_func;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc b/src/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc
deleted file mode 100644
index f3fd4b1..0000000
--- a/src/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_ecdsa2_sigver_test processes a NIST CAVP ECDSA2 SigVer test vector
-// request file and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ec_key.h>
-#include <openssl/ecdsa.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2SigVer(FileTest *t, void *arg) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  const EVP_MD *md = GetDigestFromInstruction(t);
-  if (nid == NID_undef || md == nullptr) {
-    return false;
-  }
-  bssl::UniquePtr<ECDSA_SIG> sig(ECDSA_SIG_new());
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BIGNUM> qx = GetBIGNUM(t, "Qx");
-  bssl::UniquePtr<BIGNUM> qy = GetBIGNUM(t, "Qy");
-  bssl::UniquePtr<BIGNUM> r = GetBIGNUM(t, "R");
-  bssl::UniquePtr<BIGNUM> s = GetBIGNUM(t, "S");
-  std::vector<uint8_t> msg;
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (!sig || !key || !qx || !qy || !r || !s ||
-      !EC_KEY_set_public_key_affine_coordinates(key.get(), qx.get(),
-                                                qy.get()) ||
-      !t->GetBytes(&msg, "Msg") ||
-      !EVP_Digest(msg.data(), msg.size(), digest, &digest_len, md, nullptr)) {
-    return false;
-  }
-
-  BN_free(sig->r);
-  sig->r = r.release();
-  BN_free(sig->s);
-  sig->s = s.release();
-
-  if (ECDSA_do_verify(digest, digest_len, sig.get(), key.get())) {
-    printf("%sResult = P\r\n\r\n", t->CurrentTestToString().c_str());
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("%sResult = F (%s)\r\n\r\n", t->CurrentTestToString().c_str(), buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_ecdsa2_sigver_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2SigVer;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_hmac_test.cc b/src/util/fipstools/cavp/cavp_hmac_test.cc
deleted file mode 100644
index c88226a..0000000
--- a/src/util/fipstools/cavp/cavp_hmac_test.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_hmac_test processes a NIST CAVP HMAC test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/hmac.h>
-#include <openssl/span.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestHMAC(FileTest *t, void *arg) {
-  std::string md_len_str;
-  if (!t->GetInstruction(&md_len_str, "L")) {
-    return false;
-  }
-  const size_t md_len = strtoul(md_len_str.c_str(), nullptr, 0);
-
-  const EVP_MD *md;
-  switch (md_len) {
-    case 20:
-      md = EVP_sha1();
-      break;
-    case 28:
-      md = EVP_sha224();
-      break;
-    case 32:
-      md = EVP_sha256();
-      break;
-    case 48:
-      md = EVP_sha384();
-      break;
-    case 64:
-      md = EVP_sha512();
-      break;
-    default:
-      return false;
-  }
-
-  std::string count_str, k_len_str, t_len_str;
-  std::vector<uint8_t> key, msg;
-  if (!t->GetAttribute(&count_str, "Count") ||
-      !t->GetAttribute(&k_len_str, "Klen") ||
-      !t->GetAttribute(&t_len_str, "Tlen") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  size_t k_len = strtoul(k_len_str.c_str(), nullptr, 0);
-  size_t t_len = strtoul(t_len_str.c_str(), nullptr, 0);
-  if (key.size() < k_len) {
-    return false;
-  }
-  unsigned out_len;
-  uint8_t out[EVP_MAX_MD_SIZE];
-  if (HMAC(md, key.data(), k_len, msg.data(), msg.size(), out, &out_len) ==
-      NULL) {
-    return false;
-  }
-
-  if (out_len < t_len) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("Mac = %s\r\n\r\n",
-         EncodeHex(bssl::MakeConstSpan(out, t_len)).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <test file>\n", arg);
-  return 1;
-}
-
-int cavp_hmac_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    return usage(argv[0]);
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestHMAC;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_kas_test.cc b/src/util/fipstools/cavp/cavp_kas_test.cc
deleted file mode 100644
index 9a74f1d..0000000
--- a/src/util/fipstools/cavp/cavp_kas_test.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Copyright (c) 2018, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_kas_test processes NIST CAVP ECC KAS test vector request files and
-// emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ecdh.h>
-#include <openssl/ecdsa.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-#include <openssl/sha.h>
-#include <openssl/span.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestKAS(FileTest *t, void *arg) {
-  const bool validate = *reinterpret_cast<bool *>(arg);
-
-  int nid = NID_undef;
-  size_t digest_len = 0;
-
-  if (t->HasInstruction("EB - SHA224")) {
-    nid = NID_secp224r1;
-    digest_len = SHA224_DIGEST_LENGTH;
-  } else if (t->HasInstruction("EC - SHA256")) {
-    nid = NID_X9_62_prime256v1;
-    digest_len = SHA256_DIGEST_LENGTH;
-  } else if (t->HasInstruction("ED - SHA384")) {
-    nid = NID_secp384r1;
-    digest_len = SHA384_DIGEST_LENGTH;
-  } else if (t->HasInstruction("EE - SHA512")) {
-    nid = NID_secp521r1;
-    digest_len = SHA512_DIGEST_LENGTH;
-  } else {
-    return false;
-  }
-
-  if (!t->HasAttribute("COUNT")) {
-    return false;
-  }
-
-  bssl::UniquePtr<BIGNUM> their_x(GetBIGNUM(t, "QeCAVSx"));
-  bssl::UniquePtr<BIGNUM> their_y(GetBIGNUM(t, "QeCAVSy"));
-  bssl::UniquePtr<EC_KEY> ec_key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BN_CTX> ctx(BN_CTX_new());
-  if (!their_x || !their_y || !ec_key || !ctx) {
-    return false;
-  }
-
-  const EC_GROUP *const group = EC_KEY_get0_group(ec_key.get());
-  bssl::UniquePtr<EC_POINT> their_point(EC_POINT_new(group));
-  if (!their_point ||
-      !EC_POINT_set_affine_coordinates_GFp(
-          group, their_point.get(), their_x.get(), their_y.get(), ctx.get())) {
-    return false;
-  }
-
-  if (validate) {
-    bssl::UniquePtr<BIGNUM> our_k(GetBIGNUM(t, "deIUT"));
-    if (!our_k ||
-        !EC_KEY_set_private_key(ec_key.get(), our_k.get()) ||
-        // These attributes are ignored.
-        !t->HasAttribute("QeIUTx") ||
-        !t->HasAttribute("QeIUTy")) {
-      return false;
-    }
-  } else if (!EC_KEY_generate_key(ec_key.get())) {
-    return false;
-  }
-
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  if (!ECDH_compute_key_fips(digest, digest_len, their_point.get(),
-                             ec_key.get())) {
-    return false;
-  }
-
-  if (validate) {
-    std::vector<uint8_t> expected_shared_bytes;
-    if (!t->GetBytes(&expected_shared_bytes, "CAVSHashZZ")) {
-      return false;
-    }
-    const bool ok =
-        digest_len == expected_shared_bytes.size() &&
-        OPENSSL_memcmp(digest, expected_shared_bytes.data(), digest_len) == 0;
-
-    printf("%sIUTHashZZ = %s\r\nResult = %c\r\n\r\n\r\n",
-           t->CurrentTestToString().c_str(),
-           EncodeHex(bssl::MakeConstSpan(digest, digest_len)).c_str(),
-           ok ? 'P' : 'F');
-  } else {
-    const EC_POINT *pub = EC_KEY_get0_public_key(ec_key.get());
-    bssl::UniquePtr<BIGNUM> x(BN_new());
-    bssl::UniquePtr<BIGNUM> y(BN_new());
-    if (!x || !y ||
-        !EC_POINT_get_affine_coordinates_GFp(group, pub, x.get(), y.get(),
-                                             ctx.get())) {
-      return false;
-    }
-    bssl::UniquePtr<char> x_hex(BN_bn2hex(x.get()));
-    bssl::UniquePtr<char> y_hex(BN_bn2hex(y.get()));
-
-    printf("%sQeIUTx = %s\r\nQeIUTy = %s\r\nHashZZ = %s\r\n",
-           t->CurrentTestToString().c_str(), x_hex.get(), y_hex.get(),
-           EncodeHex(bssl::MakeConstSpan(digest, digest_len)).c_str());
-  }
-
-  return true;
-}
-
-int cavp_kas_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (validity|function) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  bool validity;
-  if (strcmp(argv[1], "validity") == 0) {
-    validity = true;
-  } else if (strcmp(argv[1], "function") == 0) {
-    validity = false;
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.arg = &validity;
-  opts.callback = TestKAS;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  opts.is_kas_test = true;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_keywrap_test.cc b/src/util/fipstools/cavp/cavp_keywrap_test.cc
deleted file mode 100644
index 67397ec..0000000
--- a/src/util/fipstools/cavp/cavp_keywrap_test.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_keywrap_test processes a NIST CAVP AES test vector request file and
-// emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/aes.h>
-#include <openssl/crypto.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  bool encrypt;
-  bool padding;
-};
-
-}  // namespace
-
-static bool AESKeyWrap(std::vector<uint8_t> *out, bool encrypt,
-                       const std::vector<uint8_t> &key,
-                       const std::vector<uint8_t> &in) {
-  size_t key_bits = key.size() * 8;
-  if (key_bits != 128 && key_bits != 192 && key_bits != 256) {
-    return false;
-  }
-  AES_KEY aes_key;
-
-  if (encrypt) {
-    out->resize(in.size() + 8);
-    if (AES_set_encrypt_key(key.data(), key_bits, &aes_key) ||
-        AES_wrap_key(&aes_key, nullptr, out->data(), in.data(), in.size()) ==
-            -1) {
-      return false;
-    }
-  } else {
-    out->resize(in.size() - 8);
-    if (AES_set_decrypt_key(key.data(), key_bits, &aes_key) ||
-        AES_unwrap_key(&aes_key, nullptr, out->data(), in.data(), in.size()) ==
-            -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-static bool AESKeyWrapWithPadding(std::vector<uint8_t> *out, bool encrypt,
-                                  const std::vector<uint8_t> &key,
-                                  const std::vector<uint8_t> &in) {
-  const size_t key_bits = key.size() * 8;
-  if (key_bits != 128 && key_bits != 192 && key_bits != 256) {
-    return false;
-  }
-  AES_KEY aes_key;
-
-  size_t out_len;
-  if (encrypt) {
-    out->resize(in.size() + 15);
-    if (AES_set_encrypt_key(key.data(), key_bits, &aes_key) ||
-        !AES_wrap_key_padded(&aes_key, out->data(), &out_len, out->size(),
-                             in.data(), in.size())) {
-      return false;
-    }
-  } else {
-    out->resize(in.size());
-    if (AES_set_decrypt_key(key.data(), key_bits, &aes_key) ||
-        !AES_unwrap_key_padded(&aes_key, out->data(), &out_len, out->size(),
-                               in.data(), in.size())) {
-      return false;
-    }
-  }
-
-  out->resize(out_len);
-  return true;
-}
-
-static bool TestCipher(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string count, unused, in_label = ctx->encrypt ? "P" : "C",
-                             result_label = ctx->encrypt ? "C" : "P";
-  std::vector<uint8_t> key, in, result;
-  // clang-format off
-  if (!t->GetInstruction(&unused, "PLAINTEXT LENGTH") ||
-      !t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&key, "K") ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-
-  auto wrap_function = AESKeyWrap;
-  if (ctx->padding) {
-    wrap_function = AESKeyWrapWithPadding;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  if (!wrap_function(&result, ctx->encrypt, key, in)) {
-    if (ctx->encrypt) {
-      return false;
-    } else {
-      printf("FAIL\r\n\r\n");
-    }
-  } else {
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(
-      stderr,
-      "usage: %s (enc|dec|enc-pad|dec-pad) (128|192|256) <test file>\n",
-      arg);
-  return 1;
-}
-
-int cavp_keywrap_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string op(argv[1]);
-  bool encrypt = false;
-  bool padding = false;
-  if (op == "enc") {
-    encrypt = true;
-  } else if (op == "dec") {
-  } else if (op == "enc-pad") {
-    encrypt = true;
-    padding = true;
-  } else if (op == "dec-pad") {
-    padding = true;
-  } else {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {encrypt, padding};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = TestCipher;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_main.cc b/src/util/fipstools/cavp/cavp_main.cc
deleted file mode 100644
index 64dbd69..0000000
--- a/src/util/fipstools/cavp/cavp_main.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_main is a wrapper that invokes the main entry function of one of the
-// CAVP validation suite binaries.
-
-#include <stdlib.h>
-#include <cstdio>
-#include <string>
-
-#include <openssl/crypto.h>
-
-#include "cavp_test_util.h"
-
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <validation suite> <args ...>\n", arg);
-  return 1;
-}
-
-struct TestSuite {
-  std::string name;
-  int (*main_func)(int argc, char **argv);
-};
-
-static TestSuite all_test_suites[] = {
-    {"aes", &cavp_aes_test_main},
-    {"aes_gcm", &cavp_aes_gcm_test_main},
-    {"ctr_drbg", &cavp_ctr_drbg_test_main},
-    {"ecdsa2_keypair", &cavp_ecdsa2_keypair_test_main},
-    {"ecdsa2_pkv", &cavp_ecdsa2_pkv_test_main},
-    {"ecdsa2_siggen", &cavp_ecdsa2_siggen_test_main},
-    {"ecdsa2_sigver", &cavp_ecdsa2_sigver_test_main},
-    {"hmac", &cavp_hmac_test_main},
-    {"kas", &cavp_kas_test_main},
-    {"keywrap", &cavp_keywrap_test_main},
-    {"rsa2_keygen", &cavp_rsa2_keygen_test_main},
-    {"rsa2_siggen", &cavp_rsa2_siggen_test_main},
-    {"rsa2_sigver", &cavp_rsa2_sigver_test_main},
-    {"tlskdf", &cavp_tlskdf_test_main},
-    {"sha", &cavp_sha_test_main},
-    {"sha_monte", &cavp_sha_monte_test_main},
-    {"tdes", &cavp_tdes_test_main}
-};
-
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
-  if (argc < 3) {
-    return usage(argv[0]);
-  }
-
-  const std::string suite(argv[1]);
-  for (const TestSuite &s : all_test_suites) {
-    if (s.name == suite) {
-      return s.main_func(argc - 1, &argv[1]);
-    }
-  }
-
-  fprintf(stderr, "invalid test suite: %s\n\n", argv[1]);
-  return usage(argv[0]);
-}
diff --git a/src/util/fipstools/cavp/cavp_rsa2_keygen_test.cc b/src/util/fipstools/cavp/cavp_rsa2_keygen_test.cc
deleted file mode 100644
index e7088c7..0000000
--- a/src/util/fipstools/cavp/cavp_rsa2_keygen_test.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_rsa2_keygen_test processes NIST CAVP RSA2 KeyGen test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestRSA2KeyGen(FileTest *t, void *arg) {
-  std::string mod_str, table, count_str;
-  if (!t->GetInstruction(&mod_str, "mod") ||
-      !t->GetInstruction(&table, "Table for M-R Test") ||
-      table != "C.2" ||
-      !t->GetAttribute(&count_str, "N")) {
-    return false;
-  }
-
-  printf("[mod = %s]\r\n", mod_str.c_str());
-  printf("[Table for M-R Test = %s]\r\n\r\n", table.c_str());
-
-  size_t bits = strtoul(mod_str.c_str(), nullptr, 0);
-  size_t count = strtoul(count_str.c_str(), nullptr, 0);
-  for (size_t i = 0; i < count; i++) {
-    bssl::UniquePtr<RSA> key(RSA_new());
-    if (key == nullptr ||
-        bits == 0 ||
-        !RSA_generate_key_fips(key.get(), bits, nullptr)) {
-      return 0;
-    }
-
-    const BIGNUM *n, *e, *d, *p, *q;
-    RSA_get0_key(key.get(), &n, &e, &d);
-    RSA_get0_factors(key.get(), &p, &q);
-    std::vector<uint8_t> n_bytes(BN_num_bytes(n)), e_bytes(BN_num_bytes(e)),
-        d_bytes((bits + 7) / 8), p_bytes(BN_num_bytes(p)),
-        q_bytes(BN_num_bytes(q));
-    if (n == NULL ||
-        BN_bn2bin(n, n_bytes.data()) != n_bytes.size() ||
-        e == NULL ||
-        BN_bn2bin(e, e_bytes.data()) != e_bytes.size() ||
-        d == NULL ||
-        !BN_bn2bin_padded(d_bytes.data(), d_bytes.size(), d) ||
-        p == NULL ||
-        BN_bn2bin(p, p_bytes.data()) != p_bytes.size() ||
-        q == NULL ||
-        BN_bn2bin(q, q_bytes.data()) != q_bytes.size()) {
-      return false;
-    }
-
-    printf("e = %s\r\np = %s\r\nq = %s\r\nn = %s\r\nd = %s\r\n\r\n",
-           EncodeHex(e_bytes).c_str(), EncodeHex(p_bytes).c_str(),
-           EncodeHex(q_bytes).c_str(), EncodeHex(n_bytes).c_str(),
-           EncodeHex(d_bytes).c_str());
-  }
-
-  return true;
-}
-
-int cavp_rsa2_keygen_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestRSA2KeyGen;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_rsa2_siggen_test.cc b/src/util/fipstools/cavp/cavp_rsa2_siggen_test.cc
deleted file mode 100644
index 636a73a..0000000
--- a/src/util/fipstools/cavp/cavp_rsa2_siggen_test.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_rsa2_siggen_test processes NIST CAVP RSA2 SigGen test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-namespace {
-
-struct TestCtx {
-  bssl::UniquePtr<RSA> key;
-  bool is_pss;
-};
-
-}
-
-static bool TestRSA2SigGen(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string mod_str, hash;
-  std::vector<uint8_t> msg;
-  if (!t->GetInstruction(&mod_str, "mod") ||
-      !t->GetAttribute(&hash, "SHAAlg") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  std::string test = t->CurrentTestToString();
-  if (t->IsAtNewInstructionBlock()) {
-    int mod_bits = strtoul(mod_str.c_str(), nullptr, 0);
-    ctx->key = bssl::UniquePtr<RSA>(RSA_new());
-    if (ctx->key == nullptr ||
-        mod_bits == 0 ||
-        !RSA_generate_key_fips(ctx->key.get(), mod_bits, nullptr)) {
-      return false;
-    }
-
-    const BIGNUM *n, *e;
-    RSA_get0_key(ctx->key.get(), &n, &e, nullptr);
-
-    std::vector<uint8_t> n_bytes(BN_num_bytes(n));
-    std::vector<uint8_t> e_bytes(BN_num_bytes(e));
-    if (!BN_bn2bin_padded(n_bytes.data(), n_bytes.size(), n) ||
-        !BN_bn2bin_padded(e_bytes.data(), e_bytes.size(), e)) {
-      return false;
-    }
-
-    printf("[mod = %s]\r\n\r\nn = %s\r\n\r\ne = %s", mod_str.c_str(),
-           EncodeHex(n_bytes).c_str(), EncodeHex(e_bytes).c_str());
-    test = test.substr(test.find("]") + 3);
-  }
-
-  const EVP_MD *md = EVP_get_digestbyname(hash.c_str());
-  uint8_t digest_buf[EVP_MAX_MD_SIZE];
-  std::vector<uint8_t> sig(RSA_size(ctx->key.get()));
-  unsigned digest_len;
-  size_t sig_len;
-  if (md == NULL ||
-      !EVP_Digest(msg.data(), msg.size(), digest_buf, &digest_len, md, NULL)) {
-    return false;
-  }
-
-  if (ctx->is_pss) {
-    if (!RSA_sign_pss_mgf1(ctx->key.get(), &sig_len, sig.data(), sig.size(),
-                           digest_buf, digest_len, md, md, -1)) {
-      return false;
-    }
-  } else {
-    unsigned sig_len_u;
-    if (!RSA_sign(EVP_MD_type(md), digest_buf, digest_len, sig.data(),
-                  &sig_len_u, ctx->key.get())) {
-      return false;
-    }
-    sig_len = sig_len_u;
-  }
-
-  sig.resize(sig_len);
-  printf("%sS = %s\r\n\r\n", test.c_str(), EncodeHex(sig).c_str());
-  return true;
-}
-
-int cavp_rsa2_siggen_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  TestCtx ctx;
-  if (strcmp(argv[1], "pkcs15") == 0) {
-    ctx = {nullptr, false};
-  } else if (strcmp(argv[1], "pss") == 0) {
-    ctx = {nullptr, true};
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestRSA2SigGen;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_rsa2_sigver_test.cc b/src/util/fipstools/cavp/cavp_rsa2_sigver_test.cc
deleted file mode 100644
index cbcfc1f..0000000
--- a/src/util/fipstools/cavp/cavp_rsa2_sigver_test.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_rsa2_sigver_test processes NIST CAVP RSA2 SigVer test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/err.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  std::vector<uint8_t> N;
-  bool is_pss;
-};
-
-}
-
-static bool TestRSA2SigVer(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string mod_str;
-  if (!t->GetInstruction(&mod_str, "mod")) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-
-  if (t->HasAttribute("n")) {
-    printf("\r\n");
-    return t->GetBytes(&ctx->N, "n");
-  }
-
-  std::string hash;
-  std::vector<uint8_t> e_bytes, msg, sig;
-  if (!t->GetAttribute(&hash, "SHAAlg") ||
-      !t->GetBytes(&e_bytes, "e") ||
-      !t->GetBytes(&msg, "Msg") ||
-      !t->GetBytes(&sig, "S")) {
-    return false;
-  }
-
-  bssl::UniquePtr<RSA> key(RSA_new());
-  key->n = BN_new();
-  key->e = BN_new();
-  if (key == nullptr ||
-      !BN_bin2bn(ctx->N.data(), ctx->N.size(), key->n) ||
-      !BN_bin2bn(e_bytes.data(), e_bytes.size(), key->e)) {
-    return false;
-  }
-
-  const EVP_MD *md = EVP_get_digestbyname(hash.c_str());
-  uint8_t digest_buf[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (md == NULL ||
-      !EVP_Digest(msg.data(), msg.size(), digest_buf, &digest_len, md, NULL)) {
-    return false;
-  }
-
-  int ok;
-  if (ctx->is_pss) {
-    ok = RSA_verify_pss_mgf1(key.get(), digest_buf, digest_len, md, md, -1,
-                             sig.data(), sig.size());
-  } else {
-    ok = RSA_verify(EVP_MD_type(md), digest_buf, digest_len, sig.data(),
-                    sig.size(), key.get());
-  }
-
-  if (ok) {
-    printf("Result = P\r\n\r\n");
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("Result = F (%s)\r\n\r\n", buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_rsa2_sigver_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  TestCtx ctx;
-  if (strcmp(argv[1], "pkcs15") == 0) {
-    ctx = {std::vector<uint8_t>(), false};
-  } else if (strcmp(argv[1], "pss") == 0) {
-    ctx = {std::vector<uint8_t>(), true};
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestRSA2SigVer;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_sha_monte_test.cc b/src/util/fipstools/cavp/cavp_sha_monte_test.cc
deleted file mode 100644
index f5bcdd1..0000000
--- a/src/util/fipstools/cavp/cavp_sha_monte_test.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_sha_monte_test processes a NIST CAVP SHA-Monte test vector request file
-// and emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  std::string hash;
-};
-
-}
-
-static bool TestSHAMonte(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  const EVP_MD *md = EVP_get_digestbyname(ctx->hash.c_str());
-  if (md == nullptr) {
-    return false;
-  }
-  const size_t md_len = EVP_MD_size(md);
-
-  std::string out_len;
-  if (!t->GetInstruction(&out_len, "L") ||
-      md_len != strtoul(out_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  std::vector<uint8_t> seed;
-  if (!t->GetBytes(&seed, "Seed") ||
-      seed.size() != md_len) {
-    return false;
-  }
-
-  std::vector<uint8_t> out = seed;
-
-  printf("%s\r\n", t->CurrentTestToString().c_str());
-
-  for (int count = 0; count < 100; count++) {
-    std::vector<uint8_t> msg;
-    msg.insert(msg.end(), out.begin(), out.end());
-    msg.insert(msg.end(), out.begin(), out.end());
-    msg.insert(msg.end(), out.begin(), out.end());
-    for (int i = 0; i < 1000; i++) {
-      unsigned digest_len;
-      if (!EVP_Digest(msg.data(), msg.size(), out.data(), &digest_len, md,
-                      nullptr) ||
-          digest_len != out.size()) {
-        return false;
-      }
-
-      msg.erase(msg.begin(), msg.begin() + out.size());
-      msg.insert(msg.end(), out.begin(), out.end());
-    }
-    printf("COUNT = %d\r\n", count);
-    printf("MD = %s\r\n\r\n", EncodeHex(out).c_str());
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <hash> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_sha_monte_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {std::string(argv[1])};
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestSHAMonte;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_sha_test.cc b/src/util/fipstools/cavp/cavp_sha_test.cc
deleted file mode 100644
index c046451..0000000
--- a/src/util/fipstools/cavp/cavp_sha_test.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_sha_test processes a NIST CAVP SHA test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-namespace {
-
-struct TestCtx {
-  std::string hash;
-};
-
-}
-
-static bool TestSHA(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  const EVP_MD *md = EVP_get_digestbyname(ctx->hash.c_str());
-  if (md == nullptr) {
-    return false;
-  }
-  const size_t md_len = EVP_MD_size(md);
-
-  std::string out_len;
-  if (!t->GetInstruction(&out_len, "L") ||
-      md_len != strtoul(out_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  std::string msg_len_str;
-  std::vector<uint8_t> msg;
-  if (!t->GetAttribute(&msg_len_str, "Len") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  size_t msg_len = strtoul(msg_len_str.c_str(), nullptr, 0);
-  if (msg_len % 8 != 0 ||
-      msg_len / 8 > msg.size()) {
-    return false;
-  }
-  msg_len /= 8;
-
-  std::vector<uint8_t> out;
-  out.resize(md_len);
-  unsigned digest_len;
-  if (!EVP_Digest(msg.data(), msg_len, out.data(), &digest_len, md, nullptr) ||
-      digest_len != out.size()) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("MD = %s\r\n\r\n", EncodeHex(out).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <hash> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_sha_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {std::string(argv[1])};
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestSHA;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_tdes_test.cc b/src/util/fipstools/cavp/cavp_tdes_test.cc
deleted file mode 100644
index 7b8839d..0000000
--- a/src/util/fipstools/cavp/cavp_tdes_test.cc
+++ /dev/null
@@ -1,336 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_tdes_test processes a NIST TMOVS test vector request file and emits the
-// corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_CIPHER *cipher;
-  enum Mode {
-    kKAT,  // Known Answer Test
-    kMCT,  // Monte Carlo Test
-  };
-  bool has_iv;
-  Mode mode;
-};
-
-}
-
-static bool TestKAT(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  if (t->HasAttribute("NumKeys")) {
-    // Another file format quirk: NumKeys is a single attribute line immediately
-    // following an instruction and should probably have been an instruction
-    // instead. If it is present, the file has separate attributes "KEY{1,2,3}".
-    // If it is not, the keys are concatenated in a single attribute "KEYs".
-    std::string num_keys;
-    t->GetAttribute(&num_keys, "NumKeys");
-    t->InjectInstruction("NumKeys", num_keys);
-
-    std::string header = operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n\r\n", header.c_str());
-
-    return true;
-  }
-
-  enum {
-    kNotPresent,
-    kTwo,
-    kThree,
-  } num_keys = kNotPresent;
-  if (t->HasInstruction("NumKeys")) {
-    std::string num_keys_str;
-    t->GetInstruction(&num_keys_str, "NumKeys");
-    const int n = strtoul(num_keys_str.c_str(), nullptr, 0);
-    if (n == 2) {
-      num_keys = kTwo;
-    } else if (n == 3) {
-      num_keys = kThree;
-    } else {
-      t->PrintLine("invalid NumKeys value");
-      return false;
-    }
-  }
-
-  std::string count;
-  std::vector<uint8_t> keys, key1, key2, key3, iv, in, result;
-  const std::string in_label =
-      operation == kEncrypt ? "PLAINTEXT" : "CIPHERTEXT";
-  // clang-format off
-  if (!t->GetAttribute(&count, "COUNT") ||
-      (num_keys == 0 && !t->GetBytes(&keys, "KEYs")) ||
-      (num_keys > 0 &&
-       (!t->GetBytes(&key1, "KEY1") ||
-        !t->GetBytes(&key2, "KEY2") ||
-        !t->GetBytes(&key3, "KEY3"))) ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV")) ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-  std::vector<uint8_t> key;
-  if (num_keys != kNotPresent) {
-    key.insert(key.end(), key1.begin(), key1.end());
-    key.insert(key.end(), key2.begin(), key2.end());
-    if (num_keys == kThree) {
-      key.insert(key.end(), key3.begin(), key3.end());
-    }
-  } else {
-    key.insert(key.end(), keys.begin(), keys.end());
-    key.insert(key.end(), keys.begin(), keys.end());
-    key.insert(key.end(), keys.begin(), keys.end());
-  }
-
-  if (!CipherOperation(ctx->cipher, &result, operation == kEncrypt, key, iv,
-                       in)) {
-    return false;
-  }
-
-  // TDES fax files output format differs from file to file, and the input
-  // format is inconsistent with the output, so we construct the output manually
-  // rather than printing CurrentTestToString().
-  if (t->IsAtNewInstructionBlock() && num_keys == kNotPresent) {
-    // If NumKeys is present, header is printed when parsing NumKeys.
-    std::string header = operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n", header.c_str());
-  }
-  const std::string result_label =
-      operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-  printf("COUNT = %s\r\n", count.c_str());
-  if (num_keys == kNotPresent) {
-    printf("KEYs = %s\r\n", EncodeHex(keys).c_str());
-  } else {
-    printf("KEY1 = %s\r\nKEY2 = %s\r\nKEY3 = %s\r\n", EncodeHex(key1).c_str(),
-           EncodeHex(key2).c_str(), EncodeHex(key3).c_str());
-  }
-  if (ctx->has_iv) {
-    printf("IV = %s\r\n", EncodeHex(iv).c_str());
-  }
-  printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-  printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-  return true;
-}
-
-// XORKeyWithOddParityLSB sets |*key| to |key| XOR |value| and then writes
-// the LSB of each byte to establish odd parity for that byte. This parity-based
-// embedded of a DES key into 64 bits is an old tradition and something that
-// NIST's tests require.
-static void XORKeyWithOddParityLSB(std::vector<uint8_t> *key,
-                                        const std::vector<uint8_t> &value) {
-  for (size_t i = 0; i < key->size(); i++) {
-    uint8_t v = (*key)[i] ^ value[i];
-
-    // Use LSB to establish odd parity.
-    v |= 0x01;
-    for (uint8_t j = 1; j < 8; j++) {
-      v ^= ((v >> j) & 0x01);
-    }
-    (*key)[i] = v;
-  }
-}
-
-static bool TestMCT(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  if (t->HasAttribute("NumKeys")) {
-    // Another file format quirk: NumKeys is a single attribute line immediately
-    // following an instruction and should probably have been an instruction
-    // instead.
-    std::string num_keys;
-    t->GetAttribute(&num_keys, "NumKeys");
-    t->InjectInstruction("NumKeys", num_keys);
-    return true;
-  }
-
-  enum {
-    kTwo,
-    kThree,
-  } num_keys;
-  std::string num_keys_str;
-  if (!t->GetInstruction(&num_keys_str, "NumKeys")) {
-    return false;
-  } else {
-    const int n = strtoul(num_keys_str.c_str(), nullptr, 0);
-    if (n == 2) {
-      num_keys = kTwo;
-    } else if (n == 3) {
-      num_keys = kThree;
-    } else {
-      t->PrintLine("invalid NumKeys value");
-      return false;
-    }
-  }
-
-  std::string count;
-  std::vector<uint8_t> key1, key2, key3, iv, in, result;
-  const std::string in_label =
-      operation == kEncrypt ? "PLAINTEXT" : "CIPHERTEXT";
-  // clang-format off
-  if (!t->GetBytes(&key1, "KEY1") ||
-      !t->GetBytes(&key2, "KEY2") ||
-      !t->GetBytes(&key3, "KEY3") ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV")) ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-
-  for (int i = 0; i < 400; i++) {
-    std::vector<uint8_t> current_iv = iv, current_in = in, prev_result,
-                         prev_prev_result;
-
-    std::vector<uint8_t> key(key1);
-    key.insert(key.end(), key2.begin(), key2.end());
-    key.insert(key.end(), key3.begin(), key3.end());
-
-    for (int j = 0; j < 10000; j++) {
-      prev_prev_result = prev_result;
-      prev_result = result;
-      const EVP_CIPHER *cipher = ctx->cipher;
-      if (!CipherOperation(cipher, &result, operation == kEncrypt, key,
-                           current_iv, current_in)) {
-        t->PrintLine("CipherOperation failed");
-        return false;
-      }
-      if (ctx->has_iv) {
-        if (operation == kEncrypt) {
-          if (j == 0) {
-            current_in = current_iv;
-          } else {
-            current_in = prev_result;
-          }
-          current_iv = result;
-        } else {  // operation == kDecrypt
-          current_iv = current_in;
-          current_in = result;
-        }
-      } else {
-        current_in = result;
-      }
-    }
-
-    // Output result for COUNT = i.
-    const std::string result_label =
-        operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-    if (i == 0) {
-      const std::string op_label =
-          operation == kEncrypt ? "ENCRYPT" : "DECRYPT";
-      printf("[%s]\n\n", op_label.c_str());
-    }
-    printf("COUNT = %d\r\nKEY1 = %s\r\nKEY2 = %s\r\nKEY3 = %s\r\n", i,
-           EncodeHex(key1).c_str(), EncodeHex(key2).c_str(),
-           EncodeHex(key3).c_str());
-    if (ctx->has_iv) {
-      printf("IV = %s\r\n", EncodeHex(iv).c_str());
-    }
-    printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-
-    XORKeyWithOddParityLSB(&key1, result);
-    XORKeyWithOddParityLSB(&key2, prev_result);
-    if (num_keys == kThree) {
-      XORKeyWithOddParityLSB(&key3, prev_prev_result);
-    } else {
-      XORKeyWithOddParityLSB(&key3, result);
-    }
-
-    if (ctx->has_iv) {
-      if (operation == kEncrypt) {
-        in = prev_result;
-        iv = result;
-      } else {
-        iv = current_iv;
-        in = current_in;
-      }
-    } else {
-      in = result;
-    }
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (kat|mct) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_tdes_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string tm(argv[1]);
-  enum TestCtx::Mode test_mode;
-  if (tm == "kat") {
-    test_mode = TestCtx::kKAT;
-  } else if (tm == "mct") {
-    test_mode = TestCtx::kMCT;
-  } else {
-    fprintf(stderr, "invalid test_mode: %s\n", tm.c_str());
-    return usage(argv[0]);
-  }
-
-  const std::string cipher_name(argv[2]);
-  const EVP_CIPHER *cipher = GetCipher(argv[2]);
-  if (cipher == nullptr) {
-    fprintf(stderr, "invalid cipher: %s\n", argv[2]);
-    return 1;
-  }
-  bool has_iv = cipher_name != "des-ede" && cipher_name != "des-ede3";
-  TestCtx ctx = {cipher, has_iv, test_mode};
-
-  FileTestFunc test_fn = test_mode == TestCtx::kKAT ? &TestKAT : &TestMCT;
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = test_fn;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/cavp_test_util.cc b/src/util/fipstools/cavp/cavp_test_util.cc
deleted file mode 100644
index 1b4e3a1..0000000
--- a/src/util/fipstools/cavp/cavp_test_util.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#include "cavp_test_util.h"
-
-#include <openssl/bn.h>
-#include <openssl/digest.h>
-#include <openssl/ec.h>
-#include <openssl/nid.h>
-
-
-const EVP_CIPHER *GetCipher(const std::string &name) {
-  if (name == "des-cbc") {
-    return EVP_des_cbc();
-  } else if (name == "des-ecb") {
-    return EVP_des_ecb();
-  } else if (name == "des-ede") {
-    return EVP_des_ede();
-  } else if (name == "des-ede3") {
-    return EVP_des_ede3();
-  } else if (name == "des-ede-cbc") {
-    return EVP_des_ede_cbc();
-  } else if (name == "des-ede3-cbc") {
-    return EVP_des_ede3_cbc();
-  } else if (name == "rc4") {
-    return EVP_rc4();
-  } else if (name == "aes-128-ecb") {
-    return EVP_aes_128_ecb();
-  } else if (name == "aes-256-ecb") {
-    return EVP_aes_256_ecb();
-  } else if (name == "aes-128-cbc") {
-    return EVP_aes_128_cbc();
-  } else if (name == "aes-128-gcm") {
-    return EVP_aes_128_gcm();
-  } else if (name == "aes-128-ofb") {
-    return EVP_aes_128_ofb();
-  } else if (name == "aes-192-cbc") {
-    return EVP_aes_192_cbc();
-  } else if (name == "aes-192-ctr") {
-    return EVP_aes_192_ctr();
-  } else if (name == "aes-192-ecb") {
-    return EVP_aes_192_ecb();
-  } else if (name == "aes-256-cbc") {
-    return EVP_aes_256_cbc();
-  } else if (name == "aes-128-ctr") {
-    return EVP_aes_128_ctr();
-  } else if (name == "aes-256-ctr") {
-    return EVP_aes_256_ctr();
-  } else if (name == "aes-256-gcm") {
-    return EVP_aes_256_gcm();
-  } else if (name == "aes-256-ofb") {
-    return EVP_aes_256_ofb();
-  }
-  return nullptr;
-}
-
-bool CipherOperation(const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
-                     bool encrypt, const std::vector<uint8_t> &key,
-                     const std::vector<uint8_t> &iv,
-                     const std::vector<uint8_t> &in) {
-  bssl::ScopedEVP_CIPHER_CTX ctx;
-  if (!EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr,
-                         encrypt ? 1 : 0)) {
-    return false;
-  }
-  if (!iv.empty() && iv.size() != EVP_CIPHER_CTX_iv_length(ctx.get())) {
-    return false;
-  }
-
-  int result_len1 = 0, result_len2;
-  *out = std::vector<uint8_t>(in.size());
-  if (!EVP_CIPHER_CTX_set_key_length(ctx.get(), key.size()) ||
-      !EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key.data(), iv.data(),
-                         -1) ||
-      !EVP_CIPHER_CTX_set_padding(ctx.get(), 0) ||
-      !EVP_CipherUpdate(ctx.get(), out->data(), &result_len1, in.data(),
-                        in.size()) ||
-      !EVP_CipherFinal_ex(ctx.get(), out->data() + result_len1, &result_len2)) {
-    return false;
-  }
-  out->resize(result_len1 + result_len2);
-
-  return true;
-}
-
-bool AEADEncrypt(const EVP_AEAD *aead, std::vector<uint8_t> *ct,
-                 std::vector<uint8_t> *tag, size_t tag_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &pt,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &iv) {
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init(ctx.get(), aead, key.data(), key.size(), tag_len,
-                         nullptr)) {
-    return false;
-  }
-
-  std::vector<uint8_t> out;
-  out.resize(pt.size() + EVP_AEAD_max_overhead(aead));
-  size_t out_len;
-  if (!EVP_AEAD_CTX_seal(ctx.get(), out.data(), &out_len, out.size(), iv.data(),
-                         iv.size(), pt.data(), pt.size(), aad.data(),
-                         aad.size())) {
-    return false;
-  }
-  out.resize(out_len);
-
-  ct->assign(out.begin(), out.end() - tag_len);
-  tag->assign(out.end() - tag_len, out.end());
-
-  return true;
-}
-
-bool AEADDecrypt(const EVP_AEAD *aead, std::vector<uint8_t> *pt, size_t pt_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &ct,
-                 const std::vector<uint8_t> &tag,
-                 const std::vector<uint8_t> &iv) {
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init_with_direction(ctx.get(), aead, key.data(), key.size(),
-                                        tag.size(), evp_aead_open)) {
-    return false;
-  }
-  std::vector<uint8_t> in = ct;
-  in.reserve(ct.size() + tag.size());
-  in.insert(in.end(), tag.begin(), tag.end());
-
-  pt->resize(pt_len);
-  size_t out_pt_len;
-  if (!EVP_AEAD_CTX_open(ctx.get(), pt->data(), &out_pt_len, pt->size(),
-                         iv.data(), iv.size(), in.data(), in.size(), aad.data(),
-                         aad.size()) ||
-      out_pt_len != pt_len) {
-    return false;
-  }
-  return true;
-}
-
-static int HexToBIGNUM(bssl::UniquePtr<BIGNUM> *out, const char *in) {
-  BIGNUM *raw = NULL;
-  int ret = BN_hex2bn(&raw, in);
-  out->reset(raw);
-  return ret;
-}
-
-bssl::UniquePtr<BIGNUM> GetBIGNUM(FileTest *t, const char *attribute) {
-  std::string hex;
-  if (!t->GetAttribute(&hex, attribute)) {
-    return nullptr;
-  }
-
-  bssl::UniquePtr<BIGNUM> ret;
-  if (HexToBIGNUM(&ret, hex.c_str()) != static_cast<int>(hex.size())) {
-    t->PrintLine("Could not decode '%s'.", hex.c_str());
-    return nullptr;
-  }
-  return ret;
-}
-
-int GetECGroupNIDFromInstruction(FileTest *t, const char **out_str) {
-  const char *dummy;
-  if (out_str == nullptr) {
-    out_str = &dummy;
-  }
-
-  if (t->HasInstruction("P-224")) {
-    *out_str = "P-224";
-    return NID_secp224r1;
-  }
-  if (t->HasInstruction("P-256")) {
-    *out_str = "P-256";
-    return NID_X9_62_prime256v1;
-  }
-  if (t->HasInstruction("P-384")) {
-    *out_str = "P-384";
-    return NID_secp384r1;
-  }
-  if (t->HasInstruction("P-521")) {
-    *out_str = "P-521";
-    return NID_secp521r1;
-  }
-  t->PrintLine("No supported group specified.");
-  return NID_undef;
-}
-
-const EVP_MD *GetDigestFromInstruction(FileTest *t) {
-  if (t->HasInstruction("SHA-1")) {
-    return EVP_sha1();
-  }
-  if (t->HasInstruction("SHA-224")) {
-    return EVP_sha224();
-  }
-  if (t->HasInstruction("SHA-256")) {
-    return EVP_sha256();
-  }
-  if (t->HasInstruction("SHA-384")) {
-    return EVP_sha384();
-  }
-  if (t->HasInstruction("SHA-512")) {
-    return EVP_sha512();
-  }
-  t->PrintLine("No supported digest function specified.");
-  return nullptr;
-}
-
-void EchoComment(const std::string& comment) {
-  fwrite(comment.c_str(), comment.size(), 1, stdout);
-}
diff --git a/src/util/fipstools/cavp/cavp_test_util.h b/src/util/fipstools/cavp/cavp_test_util.h
deleted file mode 100644
index d51dfe6..0000000
--- a/src/util/fipstools/cavp/cavp_test_util.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#ifndef OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
-#define OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
-
-#include <stdlib.h>
-#include <string>
-#include <vector>
-
-#include <openssl/aead.h>
-#include <openssl/cipher.h>
-
-#include "../crypto/test/file_test.h"
-
-
-const EVP_CIPHER *GetCipher(const std::string &name);
-
-bool CipherOperation(const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
-                     bool encrypt, const std::vector<uint8_t> &key,
-                     const std::vector<uint8_t> &iv,
-                     const std::vector<uint8_t> &in);
-
-bool AEADEncrypt(const EVP_AEAD *aead, std::vector<uint8_t> *ct,
-                 std::vector<uint8_t> *tag, size_t tag_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &pt,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &iv);
-
-bool AEADDecrypt(const EVP_AEAD *aead, std::vector<uint8_t> *pt, size_t pt_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &ct,
-                 const std::vector<uint8_t> &tag,
-                 const std::vector<uint8_t> &iv);
-
-bssl::UniquePtr<BIGNUM> GetBIGNUM(FileTest *t, const char *attribute);
-
-int GetECGroupNIDFromInstruction(FileTest *t, const char **out_str = nullptr);
-
-const EVP_MD *GetDigestFromInstruction(FileTest *t);
-
-void EchoComment(const std::string& comment);
-
-int cavp_aes_gcm_test_main(int argc, char **argv);
-int cavp_aes_test_main(int argc, char **argv);
-int cavp_ctr_drbg_test_main(int argc, char **argv);
-int cavp_ecdsa2_keypair_test_main(int argc, char **argv);
-int cavp_ecdsa2_pkv_test_main(int argc, char **argv);
-int cavp_ecdsa2_siggen_test_main(int argc, char **argv);
-int cavp_ecdsa2_sigver_test_main(int argc, char **argv);
-int cavp_hmac_test_main(int argc, char **argv);
-int cavp_kas_test_main(int argc, char **argv);
-int cavp_keywrap_test_main(int argc, char **argv);
-int cavp_rsa2_keygen_test_main(int argc, char **argv);
-int cavp_rsa2_siggen_test_main(int argc, char **argv);
-int cavp_rsa2_sigver_test_main(int argc, char **argv);
-int cavp_sha_monte_test_main(int argc, char **argv);
-int cavp_sha_test_main(int argc, char **argv);
-int cavp_tdes_test_main(int argc, char **argv);
-int cavp_tlskdf_test_main(int argc, char **argv);
-
-
-#endif  // OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
diff --git a/src/util/fipstools/cavp/cavp_tlskdf_test.cc b/src/util/fipstools/cavp/cavp_tlskdf_test.cc
deleted file mode 100644
index 0243439..0000000
--- a/src/util/fipstools/cavp/cavp_tlskdf_test.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Copyright (c) 2018, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-// cavp_tlskdf_test processes NIST TLS KDF test vectors and emits the
-// corresponding response.
-// See https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/components/askdfvs.pdf, section 6.4.
-
-#include <vector>
-
-#include <errno.h>
-
-#include <openssl/digest.h>
-
-#include "cavp_test_util.h"
-#include "../crypto/fipsmodule/tls/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-
-
-static bool TestTLSKDF(FileTest *t, void *arg) {
-  const EVP_MD *md = nullptr;
-
-  if (t->HasInstruction("TLS 1.0/1.1")) {
-    md = EVP_md5_sha1();
-  } else if (t->HasInstruction("TLS 1.2")) {
-    if (t->HasInstruction("SHA-256")) {
-      md = EVP_sha256();
-    } else if (t->HasInstruction("SHA-384")) {
-      md = EVP_sha384();
-    } else if (t->HasInstruction("SHA-512")) {
-      md = EVP_sha512();
-    }
-  }
-
-  if (md == nullptr) {
-    return false;
-  }
-
-  std::string key_block_len_str;
-  std::vector<uint8_t> premaster, server_random, client_random,
-      key_block_server_random, key_block_client_random;
-  if (!t->GetBytes(&premaster, "pre_master_secret") ||
-      !t->GetBytes(&server_random, "serverHello_random") ||
-      !t->GetBytes(&client_random, "clientHello_random") ||
-      // The NIST tests specify different client and server randoms for the
-      // expansion step from the master-secret step. This is impossible in TLS.
-      !t->GetBytes(&key_block_server_random, "server_random") ||
-      !t->GetBytes(&key_block_client_random, "client_random") ||
-      !t->GetInstruction(&key_block_len_str, "key block length") ||
-      // These are ignored.
-      !t->HasAttribute("COUNT") ||
-      !t->HasInstruction("pre-master secret length")) {
-    return false;
-  }
-
-  uint8_t master_secret[48];
-  static const char kMasterSecretLabel[] = "master secret";
-  if (!CRYPTO_tls1_prf(md, master_secret, sizeof(master_secret),
-                       premaster.data(), premaster.size(), kMasterSecretLabel,
-                       sizeof(kMasterSecretLabel) - 1, client_random.data(),
-                       client_random.size(), server_random.data(),
-                       server_random.size())) {
-    return false;
-  }
-
-  errno = 0;
-  const long int key_block_bits =
-      strtol(key_block_len_str.c_str(), nullptr, 10);
-  if (errno != 0 || key_block_bits <= 0 || (key_block_bits & 7) != 0) {
-    return false;
-  }
-  const size_t key_block_len = key_block_bits / 8;
-  std::vector<uint8_t> key_block(key_block_len);
-  static const char kLabel[] = "key expansion";
-  if (!CRYPTO_tls1_prf(
-          md, key_block.data(), key_block.size(), master_secret,
-          sizeof(master_secret), kLabel, sizeof(kLabel) - 1,
-          key_block_server_random.data(), key_block_server_random.size(),
-          key_block_client_random.data(), key_block_client_random.size())) {
-    return false;
-  }
-
-  printf("%smaster_secret = %s\r\nkey_block = %s\r\n\r\n",
-         t->CurrentTestToString().c_str(), EncodeHex(master_secret).c_str(),
-         EncodeHex(key_block).c_str());
-
-  return true;
-}
-
-int cavp_tlskdf_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n", argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestTLSKDF;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/src/util/fipstools/cavp/run_cavp.go b/src/util/fipstools/cavp/run_cavp.go
deleted file mode 100644
index 51a4100..0000000
--- a/src/util/fipstools/cavp/run_cavp.go
+++ /dev/null
@@ -1,592 +0,0 @@
-// run_cavp.go processes CAVP input files and generates suitable response
-// files, optionally comparing the results against the provided FAX files.
-package main
-
-import (
-	"bufio"
-	"errors"
-	"flag"
-	"fmt"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"sync"
-	"time"
-)
-
-var (
-	oraclePath = flag.String("oracle-bin", "", "Path to the oracle binary")
-	suiteDir   = flag.String("suite-dir", "", "Base directory containing the CAVP test suite")
-	noFAX      = flag.Bool("no-fax", false, "Skip comparing against FAX files")
-	android    = flag.Bool("android", false, "Run tests via ADB")
-)
-
-const (
-	androidTmpPath       = "/data/local/tmp/"
-	androidCAVPPath      = androidTmpPath + "cavp"
-	androidLibCryptoPath = androidTmpPath + "libcrypto.so"
-)
-
-// test describes a single request file.
-type test struct {
-	// inFile is the base of the filename without an extension, i.e.
-	// “ECBMCT128”.
-	inFile string
-	// args are the arguments (not including the input filename) to the
-	// oracle binary.
-	args []string
-	// noFAX, if true, indicates that the output cannot be compared against
-	// the FAX file. (E.g. because the primitive is non-deterministic.)
-	noFAX bool
-}
-
-// nextLineState can be used by FAX next-line function to store state.
-type nextLineState struct {
-	// State used by the KAS test.
-	nextIsIUTHash bool
-}
-
-// testSuite describes a series of tests that are handled by a single oracle
-// binary.
-type testSuite struct {
-	// directory is the name of the directory in the CAVP input, i.e. “AES”.
-	directory string
-	// suite names the test suite to pass as the first command-line argument.
-	suite string
-	// nextLineFunc, if not nil, is the function used to read the next line
-	// from the FAX file. This can be used to skip lines and/or mutate them
-	// as needed. The second argument can be used by the scanner to store
-	// state, if needed. If isWildcard is true on return then line is not
-	// meaningful and any line from the response file should be accepted.
-	nextLineFunc func(*bufio.Scanner, *nextLineState) (line string, isWildcard, ok bool)
-	tests        []test
-}
-
-func (t *testSuite) getDirectory() string {
-	return filepath.Join(*suiteDir, t.directory)
-}
-
-var aesGCMTests = testSuite{
-	"AES_GCM",
-	"aes_gcm",
-	nil,
-	[]test{
-		{"gcmDecrypt128", []string{"dec", "aes-128-gcm"}, false},
-		{"gcmDecrypt192", []string{"dec", "aes-192-gcm"}, false},
-		{"gcmDecrypt256", []string{"dec", "aes-256-gcm"}, false},
-		{"gcmEncryptExtIV128", []string{"enc", "aes-128-gcm"}, false},
-		{"gcmEncryptExtIV192", []string{"enc", "aes-192-gcm"}, false},
-		{"gcmEncryptExtIV256", []string{"enc", "aes-256-gcm"}, false},
-	},
-}
-
-var aesTests = testSuite{
-	"AES",
-	"aes",
-	nil,
-	[]test{
-		{"CBCGFSbox128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCGFSbox192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCGFSbox256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCKeySbox128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCKeySbox192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCKeySbox256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCMMT128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCMMT192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCMMT256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCVarKey128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCVarKey192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCVarKey256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCVarTxt128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCVarTxt192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCVarTxt256", []string{"kat", "aes-256-cbc"}, false},
-		{"ECBGFSbox128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBGFSbox192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBGFSbox256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBKeySbox128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBKeySbox192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBKeySbox256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBMMT128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBMMT192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBMMT256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBVarKey128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBVarKey192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBVarKey256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBVarTxt128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBVarTxt192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBVarTxt256", []string{"kat", "aes-256-ecb"}, false},
-		// AES Monte-Carlo tests
-		{"ECBMCT128", []string{"mct", "aes-128-ecb"}, false},
-		{"ECBMCT192", []string{"mct", "aes-192-ecb"}, false},
-		{"ECBMCT256", []string{"mct", "aes-256-ecb"}, false},
-		{"CBCMCT128", []string{"mct", "aes-128-cbc"}, false},
-		{"CBCMCT192", []string{"mct", "aes-192-cbc"}, false},
-		{"CBCMCT256", []string{"mct", "aes-256-cbc"}, false},
-	},
-}
-
-var ecdsa2KeyPairTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_keypair",
-	nil,
-	[]test{{"KeyPair", nil, true}},
-}
-
-var ecdsa2PKVTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_pkv",
-	nil,
-	[]test{{"PKV", nil, false}},
-}
-
-var ecdsa2SigGenTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_siggen",
-	nil,
-	[]test{
-		{"SigGen", []string{"SigGen"}, true},
-		{"SigGenComponent", []string{"SigGenComponent"}, true},
-	},
-}
-
-var ecdsa2SigVerTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_sigver",
-	nil,
-	[]test{{"SigVer", nil, false}},
-}
-
-var rsa2KeyGenTests = testSuite{
-	"RSA2",
-	"rsa2_keygen",
-	nil,
-	[]test{
-		{"KeyGen_RandomProbablyPrime3_3", nil, true},
-	},
-}
-
-var rsa2SigGenTests = testSuite{
-	"RSA2",
-	"rsa2_siggen",
-	nil,
-	[]test{
-		{"SigGen15_186-3", []string{"pkcs15"}, true},
-		{"SigGenPSS_186-3", []string{"pss"}, true},
-	},
-}
-
-var rsa2SigVerTests = testSuite{
-	"RSA2",
-	"rsa2_sigver",
-	func(s *bufio.Scanner, state *nextLineState) (string, bool, bool) {
-		for {
-			if !s.Scan() {
-				return "", false, false
-			}
-
-			line := s.Text()
-			if strings.HasPrefix(line, "p = ") || strings.HasPrefix(line, "d = ") || strings.HasPrefix(line, "SaltVal = ") || strings.HasPrefix(line, "EM with ") {
-				continue
-			}
-			if strings.HasPrefix(line, "q = ") {
-				// Skip the "q = " line and an additional blank line.
-				if !s.Scan() ||
-					len(strings.TrimSpace(s.Text())) > 0 {
-					return "", false, false
-				}
-				continue
-			}
-			return line, false, true
-		}
-	},
-	[]test{
-		{"SigVer15_186-3", []string{"pkcs15"}, false},
-		{"SigVerPSS_186-3", []string{"pss"}, false},
-	},
-}
-
-var hmacTests = testSuite{
-	"HMAC",
-	"hmac",
-	nil,
-	[]test{{"HMAC", nil, false}},
-}
-
-var shaTests = testSuite{
-	"SHA",
-	"sha",
-	nil,
-	[]test{
-		{"SHA1LongMsg", []string{"SHA1"}, false},
-		{"SHA1ShortMsg", []string{"SHA1"}, false},
-		{"SHA224LongMsg", []string{"SHA224"}, false},
-		{"SHA224ShortMsg", []string{"SHA224"}, false},
-		{"SHA256LongMsg", []string{"SHA256"}, false},
-		{"SHA256ShortMsg", []string{"SHA256"}, false},
-		{"SHA384LongMsg", []string{"SHA384"}, false},
-		{"SHA384ShortMsg", []string{"SHA384"}, false},
-		{"SHA512LongMsg", []string{"SHA512"}, false},
-		{"SHA512ShortMsg", []string{"SHA512"}, false},
-	},
-}
-
-var shaMonteTests = testSuite{
-	"SHA",
-	"sha_monte",
-	nil,
-	[]test{
-		{"SHA1Monte", []string{"SHA1"}, false},
-		{"SHA224Monte", []string{"SHA224"}, false},
-		{"SHA256Monte", []string{"SHA256"}, false},
-		{"SHA384Monte", []string{"SHA384"}, false},
-		{"SHA512Monte", []string{"SHA512"}, false},
-	},
-}
-
-var ctrDRBGTests = testSuite{
-	"DRBG800-90A",
-	"ctr_drbg",
-	nil,
-	[]test{{"CTR_DRBG", nil, false}},
-}
-
-var tdesTests = testSuite{
-	"TDES",
-	"tdes",
-	nil,
-	[]test{
-		{"TCBCMMT2", []string{"kat", "des-ede-cbc"}, false},
-		{"TCBCMMT3", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCMonte2", []string{"mct", "des-ede3-cbc"}, false},
-		{"TCBCMonte3", []string{"mct", "des-ede3-cbc"}, false},
-		{"TCBCinvperm", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCpermop", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCsubtab", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCvarkey", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCvartext", []string{"kat", "des-ede3-cbc"}, false},
-		{"TECBMMT2", []string{"kat", "des-ede"}, false},
-		{"TECBMMT3", []string{"kat", "des-ede3"}, false},
-		{"TECBMonte2", []string{"mct", "des-ede3"}, false},
-		{"TECBMonte3", []string{"mct", "des-ede3"}, false},
-		{"TECBinvperm", []string{"kat", "des-ede3"}, false},
-		{"TECBpermop", []string{"kat", "des-ede3"}, false},
-		{"TECBsubtab", []string{"kat", "des-ede3"}, false},
-		{"TECBvarkey", []string{"kat", "des-ede3"}, false},
-		{"TECBvartext", []string{"kat", "des-ede3"}, false},
-	},
-}
-
-var keyWrapTests = testSuite{
-	"KeyWrap38F",
-	"keywrap",
-	nil,
-	[]test{
-		{"KW_AD_128", []string{"dec", "128"}, false},
-		{"KW_AD_192", []string{"dec", "192"}, false},
-		{"KW_AD_256", []string{"dec", "256"}, false},
-		{"KW_AE_128", []string{"enc", "128"}, false},
-		{"KW_AE_192", []string{"enc", "192"}, false},
-		{"KW_AE_256", []string{"enc", "256"}, false},
-		{"KWP_AD_128", []string{"dec-pad", "128"}, false},
-		{"KWP_AD_192", []string{"dec-pad", "192"}, false},
-		{"KWP_AD_256", []string{"dec-pad", "256"}, false},
-		{"KWP_AE_128", []string{"enc-pad", "128"}, false},
-		{"KWP_AE_192", []string{"enc-pad", "192"}, false},
-		{"KWP_AE_256", []string{"enc-pad", "256"}, false},
-	},
-}
-
-var kasTests = testSuite{
-	"KAS",
-	"kas",
-	func(s *bufio.Scanner, state *nextLineState) (line string, isWildcard, ok bool) {
-		for {
-			// If the response file will include the IUT hash next,
-			// return a wildcard signal because this cannot be
-			// matched against the FAX file.
-			if state.nextIsIUTHash {
-				state.nextIsIUTHash = false
-				return "", true, true
-			}
-
-			if !s.Scan() {
-				return "", false, false
-			}
-
-			line := s.Text()
-			if strings.HasPrefix(line, "deCAVS = ") || strings.HasPrefix(line, "Z = ") {
-				continue
-			}
-			if strings.HasPrefix(line, "CAVSHashZZ = ") {
-				state.nextIsIUTHash = true
-			}
-			return line, false, true
-		}
-	},
-	[]test{
-		{"KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_init", []string{"function"}, true},
-		{"KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_resp", []string{"function"}, true},
-		{"KASValidityTest_ECCEphemeralUnified_NOKC_ZZOnly_init", []string{"validity"}, false},
-		{"KASValidityTest_ECCEphemeralUnified_NOKC_ZZOnly_resp", []string{"validity"}, false},
-	},
-}
-
-var tlsKDFTests = testSuite{
-	"KDF135",
-	"tlskdf",
-	nil,
-	[]test{
-		{"tls", nil, false},
-	},
-}
-
-var testSuites = []*testSuite{
-	&aesGCMTests,
-	&aesTests,
-	&ctrDRBGTests,
-	&ecdsa2KeyPairTests,
-	&ecdsa2PKVTests,
-	&ecdsa2SigGenTests,
-	&ecdsa2SigVerTests,
-	&hmacTests,
-	&keyWrapTests,
-	&rsa2KeyGenTests,
-	&rsa2SigGenTests,
-	&rsa2SigVerTests,
-	&shaTests,
-	&shaMonteTests,
-	&tdesTests,
-	&kasTests,
-	&tlsKDFTests,
-}
-
-// testInstance represents a specific test in a testSuite.
-type testInstance struct {
-	suite     *testSuite
-	testIndex int
-}
-
-func worker(wg *sync.WaitGroup, work <-chan testInstance) {
-	defer wg.Done()
-
-	for ti := range work {
-		test := ti.suite.tests[ti.testIndex]
-
-		if err := doTest(ti.suite, test); err != nil {
-			fmt.Fprintf(os.Stderr, "%s\n", err)
-			os.Exit(2)
-		}
-
-		if !*noFAX && !test.noFAX {
-			if err := compareFAX(ti.suite, test); err != nil {
-				fmt.Fprintf(os.Stderr, "%s\n", err)
-				os.Exit(3)
-			}
-		}
-	}
-}
-
-func checkAndroidPrereqs() error {
-	// The cavp binary, and a matching libcrypto.so, are required to be placed
-	// in /data/local/tmp before running this script.
-	if err := exec.Command("adb", "shell", "ls", androidCAVPPath).Run(); err != nil {
-		return errors.New("failed to list cavp binary; ensure that adb works and cavp binary is in place: " + err.Error())
-	}
-	if err := exec.Command("adb", "shell", "ls", androidLibCryptoPath).Run(); err != nil {
-		return errors.New("failed to list libcrypto.so; ensure that library is in place: " + err.Error())
-	}
-	return nil
-}
-
-func main() {
-	flag.Parse()
-
-	if *android {
-		if err := checkAndroidPrereqs(); err != nil {
-			fmt.Fprintf(os.Stderr, "%s\n", err)
-			os.Exit(1)
-		}
-	} else if len(*oraclePath) == 0 {
-		fmt.Fprintf(os.Stderr, "Must give -oracle-bin\n")
-		os.Exit(1)
-	}
-
-	work := make(chan testInstance)
-	var wg sync.WaitGroup
-
-	numWorkers := runtime.NumCPU()
-	if *android {
-		numWorkers = 1
-	}
-
-	for i := 0; i < numWorkers; i++ {
-		wg.Add(1)
-		go worker(&wg, work)
-	}
-
-	for _, suite := range testSuites {
-		for i := range suite.tests {
-			work <- testInstance{suite, i}
-		}
-	}
-
-	close(work)
-	wg.Wait()
-}
-
-func doTest(suite *testSuite, test test) error {
-	bin := *oraclePath
-	var args []string
-
-	if *android {
-		bin = "adb"
-		args = []string{"shell", "LD_LIBRARY_PATH=" + androidTmpPath, androidCAVPPath}
-	}
-
-	args = append(args, suite.suite)
-	args = append(args, test.args...)
-	reqPath := filepath.Join(suite.getDirectory(), "req", test.inFile+".req")
-	var reqPathOnDevice string
-
-	if *android {
-		reqPathOnDevice = path.Join(androidTmpPath, test.inFile+".req")
-		if err := exec.Command("adb", "push", reqPath, reqPathOnDevice).Run(); err != nil {
-			return errors.New("failed to push request file: " + err.Error())
-		}
-		args = append(args, reqPathOnDevice)
-	} else {
-		args = append(args, reqPath)
-	}
-
-	respDir := filepath.Join(suite.getDirectory(), "resp")
-	if err := os.Mkdir(respDir, 0755); err != nil && !os.IsExist(err) {
-		return fmt.Errorf("cannot create resp directory: %s", err)
-	}
-	outPath := filepath.Join(respDir, test.inFile+".rsp")
-	outFile, err := os.OpenFile(outPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
-	if err != nil {
-		return fmt.Errorf("cannot open output file for %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer outFile.Close()
-
-	cmd := exec.Command(bin, args...)
-	cmd.Stdout = outFile
-	cmd.Stderr = os.Stderr
-
-	cmdLine := strings.Join(append([]string{bin}, args...), " ")
-	startTime := time.Now()
-	if err := cmd.Run(); err != nil {
-		return fmt.Errorf("cannot run command for %q %q (%s): %s", suite.getDirectory(), test.inFile, cmdLine, err)
-	}
-
-	fmt.Printf("%s (%ds)\n", cmdLine, int(time.Since(startTime).Seconds()))
-
-	if *android {
-		exec.Command("adb", "shell", "rm", reqPathOnDevice).Run()
-	}
-
-	return nil
-}
-
-func canonicalizeLine(in string) string {
-	if strings.HasPrefix(in, "Result = P (") {
-		return "Result = P"
-	}
-	if strings.HasPrefix(in, "Result = F (") {
-		return "Result = F"
-	}
-	return in
-}
-
-func compareFAX(suite *testSuite, test test) error {
-	nextLineFunc := suite.nextLineFunc
-	if nextLineFunc == nil {
-		nextLineFunc = func(s *bufio.Scanner, state *nextLineState) (string, bool, bool) {
-			if !s.Scan() {
-				return "", false, false
-			}
-			return s.Text(), false, true
-		}
-	}
-
-	respPath := filepath.Join(suite.getDirectory(), "resp", test.inFile+".rsp")
-	respFile, err := os.Open(respPath)
-	if err != nil {
-		return fmt.Errorf("cannot read output of %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer respFile.Close()
-
-	faxPath := filepath.Join(suite.getDirectory(), "fax", test.inFile+".fax")
-	faxFile, err := os.Open(faxPath)
-	if err != nil {
-		return fmt.Errorf("cannot open fax file for %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer faxFile.Close()
-
-	respScanner := bufio.NewScanner(respFile)
-	faxScanner := bufio.NewScanner(faxFile)
-	var nextLineState nextLineState
-
-	lineNo := 0
-	inHeader := true
-
-	for respScanner.Scan() {
-		lineNo++
-		respLine := respScanner.Text()
-		var faxLine string
-		var isWildcard, ok bool
-
-		if inHeader && (len(respLine) == 0 || respLine[0] == '#') {
-			continue
-		}
-
-		for {
-			haveFaxLine := false
-
-			if inHeader {
-				for {
-					if faxLine, isWildcard, ok = nextLineFunc(faxScanner, &nextLineState); !ok {
-						break
-					}
-					if len(faxLine) != 0 && faxLine[0] != '#' {
-						haveFaxLine = true
-						break
-					}
-				}
-
-				inHeader = false
-			} else {
-				faxLine, isWildcard, haveFaxLine = nextLineFunc(faxScanner, &nextLineState)
-			}
-
-			if !haveFaxLine {
-				// Ignore blank lines at the end of the generated file.
-				if len(respLine) == 0 {
-					break
-				}
-				return fmt.Errorf("resp file is longer than fax for %q %q", suite.getDirectory(), test.inFile)
-			}
-
-			if strings.HasPrefix(faxLine, " (Reason: ") {
-				continue
-			}
-
-			break
-		}
-
-		if isWildcard || canonicalizeLine(faxLine) == canonicalizeLine(respLine) {
-			continue
-		}
-
-		return fmt.Errorf("resp and fax differ at line %d for %q %q: %q vs %q", lineNo, suite.getDirectory(), test.inFile, respLine, faxLine)
-	}
-
-	if _, _, ok := nextLineFunc(faxScanner, &nextLineState); ok {
-		return fmt.Errorf("fax file is longer than resp for %q %q", suite.getDirectory(), test.inFile)
-	}
-
-	return nil
-}
diff --git a/src/util/fipstools/delocate/delocate.go b/src/util/fipstools/delocate/delocate.go
index 2d92520..84508aa 100644
--- a/src/util/fipstools/delocate/delocate.go
+++ b/src/util/fipstools/delocate/delocate.go
@@ -439,7 +439,7 @@
 	argNodes := instructionArgs(instruction.next)
 
 	switch instructionName {
-	case "cset", "csel", "csetm", "cneg", "csinv", "cinc", "csinc", "csneg":
+	case "ccmn", "ccmp", "cinc", "cinv", "cneg", "csel", "cset", "csetm", "csinc", "csinv", "csneg":
 		// These functions are special because they take a condition-code name as
 		// an argument and that looks like a symbol reference.
 		d.writeNode(statement)
@@ -509,7 +509,7 @@
 				// This is a branch. Either the target needs to be written to a local
 				// version of the symbol to ensure that no relocations are emitted, or
 				// it needs to jump to a redirector function.
-				symbol, _, _, didChange, symbolIsLocal, _ := d.parseMemRef(arg.up)
+				symbol, offset, _, didChange, symbolIsLocal, _ := d.parseMemRef(arg.up)
 				changed = didChange
 
 				if _, knownSymbol := d.symbols[symbol]; knownSymbol {
@@ -520,6 +520,13 @@
 					d.redirectors[symbol] = redirector
 					symbol = redirector
 					changed = true
+				} else if didChange && symbolIsLocal && len(offset) > 0 {
+					// didChange is set when the inputFile index is not 0; which is the index of the
+					// first file copied to the output, which is the generated assembly of bcm.c.
+					// In subsequently copied assembly files, local symbols are changed by appending (BCM_ + index)
+					// in order to ensure they don't collide. `index` gets incremented per file.
+					// If there is offset after the symbol, append the `offset`.
+					symbol = symbol + offset
 				}
 
 				args = append(args, symbol)
@@ -1940,7 +1947,7 @@
 	}
 
 	w.WriteString(".type BORINGSSL_bcm_text_hash, @object\n")
-	w.WriteString(".size BORINGSSL_bcm_text_hash, 64\n")
+	w.WriteString(".size BORINGSSL_bcm_text_hash, 32\n")
 	w.WriteString("BORINGSSL_bcm_text_hash:\n")
 	for _, b := range fipscommon.UninitHashValue {
 		w.WriteString(".byte 0x" + strconv.FormatUint(uint64(b), 16) + "\n")
diff --git a/src/util/fipstools/delocate/delocate.peg b/src/util/fipstools/delocate/delocate.peg
index f79ed76..8267065 100644
--- a/src/util/fipstools/delocate/delocate.peg
+++ b/src/util/fipstools/delocate/delocate.peg
@@ -44,7 +44,7 @@
 SymbolArg <- (OpenParen WS?)? (
                Offset /
                SymbolType /
-               (Offset / LocalSymbol / SymbolName / Dot) WS? Operator WS? (Offset / LocalSymbol / SymbolName) /
+               (Offset / LocalSymbol / SymbolName / Dot) (WS? Operator WS? (Offset / LocalSymbol / SymbolName))* /
                LocalSymbol TCMarker? /
                SymbolName Offset /
                SymbolName TCMarker?)
@@ -94,7 +94,7 @@
               BaseIndexScale)
 SymbolRef <- (Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?
 Low12BitsSymbolRef <- ":lo12:" (LocalSymbol / SymbolName) Offset?
-ARMBaseIndexScale <- '[' ARMRegister (',' WS? (('#' Offset ('*' [0-9]+)? ) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?
+ARMBaseIndexScale <- '[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / (('+' [0-9]+)*))? ) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?
 ARMGOTLow12 <- ":got_lo12:" SymbolName
 ARMPostincrement <- '!'
 BaseIndexScale <- '(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)? )? ')'
diff --git a/src/util/fipstools/delocate/delocate.peg.go b/src/util/fipstools/delocate/delocate.peg.go
index 56c4a20..6f5c654 100644
--- a/src/util/fipstools/delocate/delocate.peg.go
+++ b/src/util/fipstools/delocate/delocate.peg.go
@@ -1,10 +1,14 @@
 package main
 
+// Code generated by ./peg/peg delocate.peg DO NOT EDIT.
+
 import (
 	"fmt"
-	"math"
+	"io"
+	"os"
 	"sort"
 	"strconv"
+	"strings"
 )
 
 const endSymbol rune = 1114112
@@ -142,19 +146,19 @@
 	up, next *node32
 }
 
-func (node *node32) print(pretty bool, buffer string) {
+func (node *node32) print(w io.Writer, pretty bool, buffer string) {
 	var print func(node *node32, depth int)
 	print = func(node *node32, depth int) {
 		for node != nil {
 			for c := 0; c < depth; c++ {
-				fmt.Printf(" ")
+				fmt.Fprintf(w, " ")
 			}
 			rule := rul3s[node.pegRule]
 			quote := strconv.Quote(string(([]rune(buffer)[node.begin:node.end])))
 			if !pretty {
-				fmt.Printf("%v %v\n", rule, quote)
+				fmt.Fprintf(w, "%v %v\n", rule, quote)
 			} else {
-				fmt.Printf("\x1B[34m%v\x1B[m %v\n", rule, quote)
+				fmt.Fprintf(w, "\x1B[36m%v\x1B[m %v\n", rule, quote)
 			}
 			if node.up != nil {
 				print(node.up, depth+1)
@@ -165,12 +169,12 @@
 	print(node, 0)
 }
 
-func (node *node32) Print(buffer string) {
-	node.print(false, buffer)
+func (node *node32) Print(w io.Writer, buffer string) {
+	node.print(w, false, buffer)
 }
 
-func (node *node32) PrettyPrint(buffer string) {
-	node.print(true, buffer)
+func (node *node32) PrettyPrint(w io.Writer, buffer string) {
+	node.print(w, true, buffer)
 }
 
 type tokens32 struct {
@@ -213,24 +217,24 @@
 }
 
 func (t *tokens32) PrintSyntaxTree(buffer string) {
-	t.AST().Print(buffer)
+	t.AST().Print(os.Stdout, buffer)
+}
+
+func (t *tokens32) WriteSyntaxTree(w io.Writer, buffer string) {
+	t.AST().Print(w, buffer)
 }
 
 func (t *tokens32) PrettyPrintSyntaxTree(buffer string) {
-	t.AST().PrettyPrint(buffer)
+	t.AST().PrettyPrint(os.Stdout, buffer)
 }
 
 func (t *tokens32) Add(rule pegRule, begin, end, index uint32) {
-	if tree := t.tree; int(index) >= len(tree) {
-		expanded := make([]token32, 2*len(tree))
-		copy(expanded, tree)
-		t.tree = expanded
+	tree, i := t.tree, int(index)
+	if i >= len(tree) {
+		t.tree = append(tree, token32{pegRule: rule, begin: begin, end: end})
+		return
 	}
-	t.tree[index] = token32{
-		pegRule: rule,
-		begin:   begin,
-		end:     end,
-	}
+	tree[i] = token32{pegRule: rule, begin: begin, end: end}
 }
 
 func (t *tokens32) Tokens() []token32 {
@@ -292,7 +296,7 @@
 }
 
 func (e *parseError) Error() string {
-	tokens, error := []token32{e.max}, "\n"
+	tokens, err := []token32{e.max}, "\n"
 	positions, p := make([]int, 2*len(tokens)), 0
 	for _, token := range tokens {
 		positions[p], p = int(token.begin), p+1
@@ -305,14 +309,14 @@
 	}
 	for _, token := range tokens {
 		begin, end := int(token.begin), int(token.end)
-		error += fmt.Sprintf(format,
+		err += fmt.Sprintf(format,
 			rul3s[token.pegRule],
 			translations[begin].line, translations[begin].symbol,
 			translations[end].line, translations[end].symbol,
 			strconv.Quote(string(e.p.buffer[begin:end])))
 	}
 
-	return error
+	return err
 }
 
 func (p *Asm) PrintSyntaxTree() {
@@ -323,12 +327,41 @@
 	}
 }
 
-func (p *Asm) Init() {
+func (p *Asm) WriteSyntaxTree(w io.Writer) {
+	p.tokens32.WriteSyntaxTree(w, p.Buffer)
+}
+
+func (p *Asm) SprintSyntaxTree() string {
+	var bldr strings.Builder
+	p.WriteSyntaxTree(&bldr)
+	return bldr.String()
+}
+
+func Pretty(pretty bool) func(*Asm) error {
+	return func(p *Asm) error {
+		p.Pretty = pretty
+		return nil
+	}
+}
+
+func Size(size int) func(*Asm) error {
+	return func(p *Asm) error {
+		p.tokens32 = tokens32{tree: make([]token32, 0, size)}
+		return nil
+	}
+}
+func (p *Asm) Init(options ...func(*Asm) error) error {
 	var (
 		max                  token32
 		position, tokenIndex uint32
 		buffer               []rune
 	)
+	for _, option := range options {
+		err := option(p)
+		if err != nil {
+			return err
+		}
+	}
 	p.reset = func() {
 		max = token32{}
 		position, tokenIndex = 0, 0
@@ -342,7 +375,7 @@
 	p.reset()
 
 	_rules := p.rules
-	tree := tokens32{tree: make([]token32, math.MaxInt16)}
+	tree := p.tokens32
 	p.parse = func(rule ...int) error {
 		r := 1
 		if len(rule) > 0 {
@@ -2540,7 +2573,7 @@
 			position, tokenIndex = position291, tokenIndex291
 			return false
 		},
-		/* 16 SymbolArg <- <((OpenParen WS?)? (Offset / SymbolType / ((Offset / LocalSymbol / SymbolName / Dot) WS? Operator WS? (Offset / LocalSymbol / SymbolName)) / (LocalSymbol TCMarker?) / (SymbolName Offset) / (SymbolName TCMarker?)) (WS? CloseParen)? (WS? SymbolShift)?)> */
+		/* 16 SymbolArg <- <((OpenParen WS?)? (Offset / SymbolType / ((Offset / LocalSymbol / SymbolName / Dot) (WS? Operator WS? (Offset / LocalSymbol / SymbolName))*) / (LocalSymbol TCMarker?) / (SymbolName Offset) / (SymbolName TCMarker?)) (WS? CloseParen)? (WS? SymbolShift)?)> */
 		func() bool {
 			position299, tokenIndex299 := position, tokenIndex
 			{
@@ -2604,131 +2637,138 @@
 						}
 					}
 				l309:
+				l313:
 					{
-						position313, tokenIndex313 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l313
+						position314, tokenIndex314 := position, tokenIndex
+						{
+							position315, tokenIndex315 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l315
+							}
+							goto l316
+						l315:
+							position, tokenIndex = position315, tokenIndex315
 						}
-						goto l314
-					l313:
-						position, tokenIndex = position313, tokenIndex313
-					}
-				l314:
-					if !_rules[ruleOperator]() {
-						goto l308
-					}
-					{
-						position315, tokenIndex315 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l315
+					l316:
+						if !_rules[ruleOperator]() {
+							goto l314
 						}
-						goto l316
-					l315:
-						position, tokenIndex = position315, tokenIndex315
-					}
-				l316:
-					{
-						position317, tokenIndex317 := position, tokenIndex
-						if !_rules[ruleOffset]() {
+						{
+							position317, tokenIndex317 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l317
+							}
 							goto l318
+						l317:
+							position, tokenIndex = position317, tokenIndex317
 						}
-						goto l317
 					l318:
-						position, tokenIndex = position317, tokenIndex317
-						if !_rules[ruleLocalSymbol]() {
+						{
+							position319, tokenIndex319 := position, tokenIndex
+							if !_rules[ruleOffset]() {
+								goto l320
+							}
 							goto l319
+						l320:
+							position, tokenIndex = position319, tokenIndex319
+							if !_rules[ruleLocalSymbol]() {
+								goto l321
+							}
+							goto l319
+						l321:
+							position, tokenIndex = position319, tokenIndex319
+							if !_rules[ruleSymbolName]() {
+								goto l314
+							}
 						}
-						goto l317
 					l319:
-						position, tokenIndex = position317, tokenIndex317
-						if !_rules[ruleSymbolName]() {
-							goto l308
-						}
+						goto l313
+					l314:
+						position, tokenIndex = position314, tokenIndex314
 					}
-				l317:
 					goto l305
 				l308:
 					position, tokenIndex = position305, tokenIndex305
 					if !_rules[ruleLocalSymbol]() {
-						goto l320
+						goto l322
 					}
 					{
-						position321, tokenIndex321 := position, tokenIndex
+						position323, tokenIndex323 := position, tokenIndex
 						if !_rules[ruleTCMarker]() {
-							goto l321
+							goto l323
 						}
-						goto l322
-					l321:
-						position, tokenIndex = position321, tokenIndex321
+						goto l324
+					l323:
+						position, tokenIndex = position323, tokenIndex323
 					}
-				l322:
+				l324:
 					goto l305
-				l320:
+				l322:
 					position, tokenIndex = position305, tokenIndex305
 					if !_rules[ruleSymbolName]() {
-						goto l323
+						goto l325
 					}
 					if !_rules[ruleOffset]() {
-						goto l323
+						goto l325
 					}
 					goto l305
-				l323:
+				l325:
 					position, tokenIndex = position305, tokenIndex305
 					if !_rules[ruleSymbolName]() {
 						goto l299
 					}
 					{
-						position324, tokenIndex324 := position, tokenIndex
+						position326, tokenIndex326 := position, tokenIndex
 						if !_rules[ruleTCMarker]() {
-							goto l324
+							goto l326
 						}
-						goto l325
-					l324:
-						position, tokenIndex = position324, tokenIndex324
+						goto l327
+					l326:
+						position, tokenIndex = position326, tokenIndex326
 					}
-				l325:
+				l327:
 				}
 			l305:
 				{
-					position326, tokenIndex326 := position, tokenIndex
+					position328, tokenIndex328 := position, tokenIndex
 					{
-						position328, tokenIndex328 := position, tokenIndex
+						position330, tokenIndex330 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l328
+							goto l330
 						}
-						goto l329
-					l328:
-						position, tokenIndex = position328, tokenIndex328
+						goto l331
+					l330:
+						position, tokenIndex = position330, tokenIndex330
 					}
-				l329:
+				l331:
 					if !_rules[ruleCloseParen]() {
-						goto l326
+						goto l328
 					}
-					goto l327
-				l326:
-					position, tokenIndex = position326, tokenIndex326
+					goto l329
+				l328:
+					position, tokenIndex = position328, tokenIndex328
 				}
-			l327:
+			l329:
 				{
-					position330, tokenIndex330 := position, tokenIndex
+					position332, tokenIndex332 := position, tokenIndex
 					{
-						position332, tokenIndex332 := position, tokenIndex
+						position334, tokenIndex334 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l332
+							goto l334
 						}
-						goto l333
-					l332:
-						position, tokenIndex = position332, tokenIndex332
+						goto l335
+					l334:
+						position, tokenIndex = position334, tokenIndex334
 					}
-				l333:
+				l335:
 					if !_rules[ruleSymbolShift]() {
-						goto l330
+						goto l332
 					}
-					goto l331
-				l330:
-					position, tokenIndex = position330, tokenIndex330
+					goto l333
+				l332:
+					position, tokenIndex = position332, tokenIndex332
 				}
-			l331:
+			l333:
 				add(ruleSymbolArg, position300)
 			}
 			return true
@@ -2738,721 +2778,707 @@
 		},
 		/* 17 OpenParen <- <'('> */
 		func() bool {
-			position334, tokenIndex334 := position, tokenIndex
-			{
-				position335 := position
-				if buffer[position] != rune('(') {
-					goto l334
-				}
-				position++
-				add(ruleOpenParen, position335)
-			}
-			return true
-		l334:
-			position, tokenIndex = position334, tokenIndex334
-			return false
-		},
-		/* 18 CloseParen <- <')'> */
-		func() bool {
 			position336, tokenIndex336 := position, tokenIndex
 			{
 				position337 := position
-				if buffer[position] != rune(')') {
+				if buffer[position] != rune('(') {
 					goto l336
 				}
 				position++
-				add(ruleCloseParen, position337)
+				add(ruleOpenParen, position337)
 			}
 			return true
 		l336:
 			position, tokenIndex = position336, tokenIndex336
 			return false
 		},
-		/* 19 SymbolType <- <(('@' / '%') (('f' 'u' 'n' 'c' 't' 'i' 'o' 'n') / ('o' 'b' 'j' 'e' 'c' 't')))> */
+		/* 18 CloseParen <- <')'> */
 		func() bool {
 			position338, tokenIndex338 := position, tokenIndex
 			{
 				position339 := position
-				{
-					position340, tokenIndex340 := position, tokenIndex
-					if buffer[position] != rune('@') {
-						goto l341
-					}
-					position++
-					goto l340
-				l341:
-					position, tokenIndex = position340, tokenIndex340
-					if buffer[position] != rune('%') {
-						goto l338
-					}
-					position++
+				if buffer[position] != rune(')') {
+					goto l338
 				}
-			l340:
-				{
-					position342, tokenIndex342 := position, tokenIndex
-					if buffer[position] != rune('f') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('u') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('n') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('c') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('t') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('i') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('o') {
-						goto l343
-					}
-					position++
-					if buffer[position] != rune('n') {
-						goto l343
-					}
-					position++
-					goto l342
-				l343:
-					position, tokenIndex = position342, tokenIndex342
-					if buffer[position] != rune('o') {
-						goto l338
-					}
-					position++
-					if buffer[position] != rune('b') {
-						goto l338
-					}
-					position++
-					if buffer[position] != rune('j') {
-						goto l338
-					}
-					position++
-					if buffer[position] != rune('e') {
-						goto l338
-					}
-					position++
-					if buffer[position] != rune('c') {
-						goto l338
-					}
-					position++
-					if buffer[position] != rune('t') {
-						goto l338
-					}
-					position++
-				}
-			l342:
-				add(ruleSymbolType, position339)
+				position++
+				add(ruleCloseParen, position339)
 			}
 			return true
 		l338:
 			position, tokenIndex = position338, tokenIndex338
 			return false
 		},
-		/* 20 Dot <- <'.'> */
+		/* 19 SymbolType <- <(('@' / '%') (('f' 'u' 'n' 'c' 't' 'i' 'o' 'n') / ('o' 'b' 'j' 'e' 'c' 't')))> */
 		func() bool {
-			position344, tokenIndex344 := position, tokenIndex
+			position340, tokenIndex340 := position, tokenIndex
 			{
-				position345 := position
-				if buffer[position] != rune('.') {
-					goto l344
+				position341 := position
+				{
+					position342, tokenIndex342 := position, tokenIndex
+					if buffer[position] != rune('@') {
+						goto l343
+					}
+					position++
+					goto l342
+				l343:
+					position, tokenIndex = position342, tokenIndex342
+					if buffer[position] != rune('%') {
+						goto l340
+					}
+					position++
 				}
-				position++
-				add(ruleDot, position345)
+			l342:
+				{
+					position344, tokenIndex344 := position, tokenIndex
+					if buffer[position] != rune('f') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('u') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('n') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('c') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('t') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('i') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('o') {
+						goto l345
+					}
+					position++
+					if buffer[position] != rune('n') {
+						goto l345
+					}
+					position++
+					goto l344
+				l345:
+					position, tokenIndex = position344, tokenIndex344
+					if buffer[position] != rune('o') {
+						goto l340
+					}
+					position++
+					if buffer[position] != rune('b') {
+						goto l340
+					}
+					position++
+					if buffer[position] != rune('j') {
+						goto l340
+					}
+					position++
+					if buffer[position] != rune('e') {
+						goto l340
+					}
+					position++
+					if buffer[position] != rune('c') {
+						goto l340
+					}
+					position++
+					if buffer[position] != rune('t') {
+						goto l340
+					}
+					position++
+				}
+			l344:
+				add(ruleSymbolType, position341)
 			}
 			return true
-		l344:
-			position, tokenIndex = position344, tokenIndex344
+		l340:
+			position, tokenIndex = position340, tokenIndex340
 			return false
 		},
-		/* 21 TCMarker <- <('[' 'T' 'C' ']')> */
+		/* 20 Dot <- <'.'> */
 		func() bool {
 			position346, tokenIndex346 := position, tokenIndex
 			{
 				position347 := position
-				if buffer[position] != rune('[') {
+				if buffer[position] != rune('.') {
 					goto l346
 				}
 				position++
-				if buffer[position] != rune('T') {
-					goto l346
-				}
-				position++
-				if buffer[position] != rune('C') {
-					goto l346
-				}
-				position++
-				if buffer[position] != rune(']') {
-					goto l346
-				}
-				position++
-				add(ruleTCMarker, position347)
+				add(ruleDot, position347)
 			}
 			return true
 		l346:
 			position, tokenIndex = position346, tokenIndex346
 			return false
 		},
-		/* 22 EscapedChar <- <('\\' .)> */
+		/* 21 TCMarker <- <('[' 'T' 'C' ']')> */
 		func() bool {
 			position348, tokenIndex348 := position, tokenIndex
 			{
 				position349 := position
-				if buffer[position] != rune('\\') {
+				if buffer[position] != rune('[') {
 					goto l348
 				}
 				position++
-				if !matchDot() {
+				if buffer[position] != rune('T') {
 					goto l348
 				}
-				add(ruleEscapedChar, position349)
+				position++
+				if buffer[position] != rune('C') {
+					goto l348
+				}
+				position++
+				if buffer[position] != rune(']') {
+					goto l348
+				}
+				position++
+				add(ruleTCMarker, position349)
 			}
 			return true
 		l348:
 			position, tokenIndex = position348, tokenIndex348
 			return false
 		},
-		/* 23 WS <- <(' ' / '\t')+> */
+		/* 22 EscapedChar <- <('\\' .)> */
 		func() bool {
 			position350, tokenIndex350 := position, tokenIndex
 			{
 				position351 := position
-				{
-					position354, tokenIndex354 := position, tokenIndex
-					if buffer[position] != rune(' ') {
-						goto l355
-					}
-					position++
-					goto l354
-				l355:
-					position, tokenIndex = position354, tokenIndex354
-					if buffer[position] != rune('\t') {
-						goto l350
-					}
-					position++
+				if buffer[position] != rune('\\') {
+					goto l350
 				}
-			l354:
-			l352:
-				{
-					position353, tokenIndex353 := position, tokenIndex
-					{
-						position356, tokenIndex356 := position, tokenIndex
-						if buffer[position] != rune(' ') {
-							goto l357
-						}
-						position++
-						goto l356
-					l357:
-						position, tokenIndex = position356, tokenIndex356
-						if buffer[position] != rune('\t') {
-							goto l353
-						}
-						position++
-					}
-				l356:
-					goto l352
-				l353:
-					position, tokenIndex = position353, tokenIndex353
+				position++
+				if !matchDot() {
+					goto l350
 				}
-				add(ruleWS, position351)
+				add(ruleEscapedChar, position351)
 			}
 			return true
 		l350:
 			position, tokenIndex = position350, tokenIndex350
 			return false
 		},
-		/* 24 Comment <- <((('/' '/') / '#') (!'\n' .)*)> */
+		/* 23 WS <- <(' ' / '\t')+> */
 		func() bool {
-			position358, tokenIndex358 := position, tokenIndex
+			position352, tokenIndex352 := position, tokenIndex
 			{
-				position359 := position
+				position353 := position
 				{
-					position360, tokenIndex360 := position, tokenIndex
-					if buffer[position] != rune('/') {
-						goto l361
+					position356, tokenIndex356 := position, tokenIndex
+					if buffer[position] != rune(' ') {
+						goto l357
 					}
 					position++
-					if buffer[position] != rune('/') {
-						goto l361
-					}
-					position++
-					goto l360
-				l361:
-					position, tokenIndex = position360, tokenIndex360
-					if buffer[position] != rune('#') {
-						goto l358
+					goto l356
+				l357:
+					position, tokenIndex = position356, tokenIndex356
+					if buffer[position] != rune('\t') {
+						goto l352
 					}
 					position++
 				}
-			l360:
-			l362:
+			l356:
+			l354:
 				{
-					position363, tokenIndex363 := position, tokenIndex
+					position355, tokenIndex355 := position, tokenIndex
 					{
-						position364, tokenIndex364 := position, tokenIndex
-						if buffer[position] != rune('\n') {
-							goto l364
+						position358, tokenIndex358 := position, tokenIndex
+						if buffer[position] != rune(' ') {
+							goto l359
 						}
 						position++
-						goto l363
-					l364:
-						position, tokenIndex = position364, tokenIndex364
+						goto l358
+					l359:
+						position, tokenIndex = position358, tokenIndex358
+						if buffer[position] != rune('\t') {
+							goto l355
+						}
+						position++
 					}
-					if !matchDot() {
-						goto l363
-					}
-					goto l362
-				l363:
-					position, tokenIndex = position363, tokenIndex363
+				l358:
+					goto l354
+				l355:
+					position, tokenIndex = position355, tokenIndex355
 				}
-				add(ruleComment, position359)
+				add(ruleWS, position353)
 			}
 			return true
-		l358:
-			position, tokenIndex = position358, tokenIndex358
+		l352:
+			position, tokenIndex = position352, tokenIndex352
+			return false
+		},
+		/* 24 Comment <- <((('/' '/') / '#') (!'\n' .)*)> */
+		func() bool {
+			position360, tokenIndex360 := position, tokenIndex
+			{
+				position361 := position
+				{
+					position362, tokenIndex362 := position, tokenIndex
+					if buffer[position] != rune('/') {
+						goto l363
+					}
+					position++
+					if buffer[position] != rune('/') {
+						goto l363
+					}
+					position++
+					goto l362
+				l363:
+					position, tokenIndex = position362, tokenIndex362
+					if buffer[position] != rune('#') {
+						goto l360
+					}
+					position++
+				}
+			l362:
+			l364:
+				{
+					position365, tokenIndex365 := position, tokenIndex
+					{
+						position366, tokenIndex366 := position, tokenIndex
+						if buffer[position] != rune('\n') {
+							goto l366
+						}
+						position++
+						goto l365
+					l366:
+						position, tokenIndex = position366, tokenIndex366
+					}
+					if !matchDot() {
+						goto l365
+					}
+					goto l364
+				l365:
+					position, tokenIndex = position365, tokenIndex365
+				}
+				add(ruleComment, position361)
+			}
+			return true
+		l360:
+			position, tokenIndex = position360, tokenIndex360
 			return false
 		},
 		/* 25 Label <- <((LocalSymbol / LocalLabel / SymbolName) ':')> */
 		func() bool {
-			position365, tokenIndex365 := position, tokenIndex
+			position367, tokenIndex367 := position, tokenIndex
 			{
-				position366 := position
+				position368 := position
 				{
-					position367, tokenIndex367 := position, tokenIndex
+					position369, tokenIndex369 := position, tokenIndex
 					if !_rules[ruleLocalSymbol]() {
-						goto l368
+						goto l370
 					}
-					goto l367
-				l368:
-					position, tokenIndex = position367, tokenIndex367
+					goto l369
+				l370:
+					position, tokenIndex = position369, tokenIndex369
 					if !_rules[ruleLocalLabel]() {
-						goto l369
+						goto l371
 					}
-					goto l367
-				l369:
-					position, tokenIndex = position367, tokenIndex367
+					goto l369
+				l371:
+					position, tokenIndex = position369, tokenIndex369
 					if !_rules[ruleSymbolName]() {
-						goto l365
+						goto l367
 					}
 				}
-			l367:
+			l369:
 				if buffer[position] != rune(':') {
-					goto l365
+					goto l367
 				}
 				position++
-				add(ruleLabel, position366)
+				add(ruleLabel, position368)
 			}
 			return true
-		l365:
-			position, tokenIndex = position365, tokenIndex365
+		l367:
+			position, tokenIndex = position367, tokenIndex367
 			return false
 		},
 		/* 26 SymbolName <- <(([a-z] / [A-Z] / '.' / '_') ([a-z] / [A-Z] / '.' / ([0-9] / [0-9]) / '$' / '_')*)> */
 		func() bool {
-			position370, tokenIndex370 := position, tokenIndex
+			position372, tokenIndex372 := position, tokenIndex
 			{
-				position371 := position
+				position373 := position
 				{
-					position372, tokenIndex372 := position, tokenIndex
+					position374, tokenIndex374 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l373
-					}
-					position++
-					goto l372
-				l373:
-					position, tokenIndex = position372, tokenIndex372
-					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l374
-					}
-					position++
-					goto l372
-				l374:
-					position, tokenIndex = position372, tokenIndex372
-					if buffer[position] != rune('.') {
 						goto l375
 					}
 					position++
-					goto l372
+					goto l374
 				l375:
-					position, tokenIndex = position372, tokenIndex372
+					position, tokenIndex = position374, tokenIndex374
+					if c := buffer[position]; c < rune('A') || c > rune('Z') {
+						goto l376
+					}
+					position++
+					goto l374
+				l376:
+					position, tokenIndex = position374, tokenIndex374
+					if buffer[position] != rune('.') {
+						goto l377
+					}
+					position++
+					goto l374
+				l377:
+					position, tokenIndex = position374, tokenIndex374
 					if buffer[position] != rune('_') {
-						goto l370
+						goto l372
 					}
 					position++
 				}
-			l372:
-			l376:
+			l374:
+			l378:
 				{
-					position377, tokenIndex377 := position, tokenIndex
+					position379, tokenIndex379 := position, tokenIndex
 					{
-						position378, tokenIndex378 := position, tokenIndex
+						position380, tokenIndex380 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l379
-						}
-						position++
-						goto l378
-					l379:
-						position, tokenIndex = position378, tokenIndex378
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l380
-						}
-						position++
-						goto l378
-					l380:
-						position, tokenIndex = position378, tokenIndex378
-						if buffer[position] != rune('.') {
 							goto l381
 						}
 						position++
-						goto l378
+						goto l380
 					l381:
-						position, tokenIndex = position378, tokenIndex378
+						position, tokenIndex = position380, tokenIndex380
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l382
+						}
+						position++
+						goto l380
+					l382:
+						position, tokenIndex = position380, tokenIndex380
+						if buffer[position] != rune('.') {
+							goto l383
+						}
+						position++
+						goto l380
+					l383:
+						position, tokenIndex = position380, tokenIndex380
 						{
-							position383, tokenIndex383 := position, tokenIndex
+							position385, tokenIndex385 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l386
+							}
+							position++
+							goto l385
+						l386:
+							position, tokenIndex = position385, tokenIndex385
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
 								goto l384
 							}
 							position++
-							goto l383
-						l384:
-							position, tokenIndex = position383, tokenIndex383
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l382
-							}
-							position++
 						}
-					l383:
-						goto l378
-					l382:
-						position, tokenIndex = position378, tokenIndex378
+					l385:
+						goto l380
+					l384:
+						position, tokenIndex = position380, tokenIndex380
 						if buffer[position] != rune('$') {
-							goto l385
+							goto l387
 						}
 						position++
-						goto l378
-					l385:
-						position, tokenIndex = position378, tokenIndex378
+						goto l380
+					l387:
+						position, tokenIndex = position380, tokenIndex380
 						if buffer[position] != rune('_') {
-							goto l377
+							goto l379
 						}
 						position++
 					}
-				l378:
-					goto l376
-				l377:
-					position, tokenIndex = position377, tokenIndex377
+				l380:
+					goto l378
+				l379:
+					position, tokenIndex = position379, tokenIndex379
 				}
-				add(ruleSymbolName, position371)
+				add(ruleSymbolName, position373)
 			}
 			return true
-		l370:
-			position, tokenIndex = position370, tokenIndex370
+		l372:
+			position, tokenIndex = position372, tokenIndex372
 			return false
 		},
 		/* 27 LocalSymbol <- <('.' 'L' ([a-z] / [A-Z] / ([a-z] / [A-Z]) / '.' / ([0-9] / [0-9]) / '$' / '_')+)> */
 		func() bool {
-			position386, tokenIndex386 := position, tokenIndex
+			position388, tokenIndex388 := position, tokenIndex
 			{
-				position387 := position
+				position389 := position
 				if buffer[position] != rune('.') {
-					goto l386
+					goto l388
 				}
 				position++
 				if buffer[position] != rune('L') {
-					goto l386
+					goto l388
 				}
 				position++
 				{
-					position390, tokenIndex390 := position, tokenIndex
+					position392, tokenIndex392 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l391
+						goto l393
 					}
 					position++
-					goto l390
-				l391:
-					position, tokenIndex = position390, tokenIndex390
+					goto l392
+				l393:
+					position, tokenIndex = position392, tokenIndex392
 					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l392
+						goto l394
 					}
 					position++
-					goto l390
-				l392:
-					position, tokenIndex = position390, tokenIndex390
+					goto l392
+				l394:
+					position, tokenIndex = position392, tokenIndex392
 					{
-						position394, tokenIndex394 := position, tokenIndex
+						position396, tokenIndex396 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l397
+						}
+						position++
+						goto l396
+					l397:
+						position, tokenIndex = position396, tokenIndex396
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
 							goto l395
 						}
 						position++
-						goto l394
-					l395:
-						position, tokenIndex = position394, tokenIndex394
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l393
-						}
-						position++
 					}
-				l394:
-					goto l390
-				l393:
-					position, tokenIndex = position390, tokenIndex390
+				l396:
+					goto l392
+				l395:
+					position, tokenIndex = position392, tokenIndex392
 					if buffer[position] != rune('.') {
-						goto l396
+						goto l398
 					}
 					position++
-					goto l390
-				l396:
-					position, tokenIndex = position390, tokenIndex390
+					goto l392
+				l398:
+					position, tokenIndex = position392, tokenIndex392
 					{
-						position398, tokenIndex398 := position, tokenIndex
+						position400, tokenIndex400 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l401
+						}
+						position++
+						goto l400
+					l401:
+						position, tokenIndex = position400, tokenIndex400
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l399
 						}
 						position++
-						goto l398
-					l399:
-						position, tokenIndex = position398, tokenIndex398
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l397
-						}
-						position++
 					}
-				l398:
-					goto l390
-				l397:
-					position, tokenIndex = position390, tokenIndex390
+				l400:
+					goto l392
+				l399:
+					position, tokenIndex = position392, tokenIndex392
 					if buffer[position] != rune('$') {
-						goto l400
+						goto l402
 					}
 					position++
-					goto l390
-				l400:
-					position, tokenIndex = position390, tokenIndex390
+					goto l392
+				l402:
+					position, tokenIndex = position392, tokenIndex392
 					if buffer[position] != rune('_') {
-						goto l386
+						goto l388
 					}
 					position++
 				}
+			l392:
 			l390:
-			l388:
 				{
-					position389, tokenIndex389 := position, tokenIndex
+					position391, tokenIndex391 := position, tokenIndex
 					{
-						position401, tokenIndex401 := position, tokenIndex
+						position403, tokenIndex403 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l402
+							goto l404
 						}
 						position++
-						goto l401
-					l402:
-						position, tokenIndex = position401, tokenIndex401
+						goto l403
+					l404:
+						position, tokenIndex = position403, tokenIndex403
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l403
+							goto l405
 						}
 						position++
-						goto l401
-					l403:
-						position, tokenIndex = position401, tokenIndex401
+						goto l403
+					l405:
+						position, tokenIndex = position403, tokenIndex403
 						{
-							position405, tokenIndex405 := position, tokenIndex
+							position407, tokenIndex407 := position, tokenIndex
 							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l408
+							}
+							position++
+							goto l407
+						l408:
+							position, tokenIndex = position407, tokenIndex407
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
 								goto l406
 							}
 							position++
-							goto l405
-						l406:
-							position, tokenIndex = position405, tokenIndex405
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l404
-							}
-							position++
 						}
-					l405:
-						goto l401
-					l404:
-						position, tokenIndex = position401, tokenIndex401
+					l407:
+						goto l403
+					l406:
+						position, tokenIndex = position403, tokenIndex403
 						if buffer[position] != rune('.') {
-							goto l407
+							goto l409
 						}
 						position++
-						goto l401
-					l407:
-						position, tokenIndex = position401, tokenIndex401
+						goto l403
+					l409:
+						position, tokenIndex = position403, tokenIndex403
 						{
-							position409, tokenIndex409 := position, tokenIndex
+							position411, tokenIndex411 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l412
+							}
+							position++
+							goto l411
+						l412:
+							position, tokenIndex = position411, tokenIndex411
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
 								goto l410
 							}
 							position++
-							goto l409
-						l410:
-							position, tokenIndex = position409, tokenIndex409
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l408
-							}
-							position++
 						}
-					l409:
-						goto l401
-					l408:
-						position, tokenIndex = position401, tokenIndex401
+					l411:
+						goto l403
+					l410:
+						position, tokenIndex = position403, tokenIndex403
 						if buffer[position] != rune('$') {
-							goto l411
+							goto l413
 						}
 						position++
-						goto l401
-					l411:
-						position, tokenIndex = position401, tokenIndex401
+						goto l403
+					l413:
+						position, tokenIndex = position403, tokenIndex403
 						if buffer[position] != rune('_') {
-							goto l389
+							goto l391
 						}
 						position++
 					}
-				l401:
-					goto l388
-				l389:
-					position, tokenIndex = position389, tokenIndex389
+				l403:
+					goto l390
+				l391:
+					position, tokenIndex = position391, tokenIndex391
 				}
-				add(ruleLocalSymbol, position387)
+				add(ruleLocalSymbol, position389)
 			}
 			return true
-		l386:
-			position, tokenIndex = position386, tokenIndex386
+		l388:
+			position, tokenIndex = position388, tokenIndex388
 			return false
 		},
 		/* 28 LocalLabel <- <([0-9] ([0-9] / '$')*)> */
 		func() bool {
-			position412, tokenIndex412 := position, tokenIndex
+			position414, tokenIndex414 := position, tokenIndex
 			{
-				position413 := position
+				position415 := position
 				if c := buffer[position]; c < rune('0') || c > rune('9') {
-					goto l412
+					goto l414
 				}
 				position++
-			l414:
+			l416:
 				{
-					position415, tokenIndex415 := position, tokenIndex
+					position417, tokenIndex417 := position, tokenIndex
 					{
-						position416, tokenIndex416 := position, tokenIndex
+						position418, tokenIndex418 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l419
+						}
+						position++
+						goto l418
+					l419:
+						position, tokenIndex = position418, tokenIndex418
+						if buffer[position] != rune('$') {
 							goto l417
 						}
 						position++
-						goto l416
-					l417:
-						position, tokenIndex = position416, tokenIndex416
-						if buffer[position] != rune('$') {
-							goto l415
-						}
-						position++
 					}
-				l416:
-					goto l414
-				l415:
-					position, tokenIndex = position415, tokenIndex415
+				l418:
+					goto l416
+				l417:
+					position, tokenIndex = position417, tokenIndex417
 				}
-				add(ruleLocalLabel, position413)
+				add(ruleLocalLabel, position415)
 			}
 			return true
-		l412:
-			position, tokenIndex = position412, tokenIndex412
+		l414:
+			position, tokenIndex = position414, tokenIndex414
 			return false
 		},
 		/* 29 LocalLabelRef <- <([0-9] ([0-9] / '$')* ('b' / 'f'))> */
 		func() bool {
-			position418, tokenIndex418 := position, tokenIndex
+			position420, tokenIndex420 := position, tokenIndex
 			{
-				position419 := position
+				position421 := position
 				if c := buffer[position]; c < rune('0') || c > rune('9') {
-					goto l418
+					goto l420
 				}
 				position++
-			l420:
+			l422:
 				{
-					position421, tokenIndex421 := position, tokenIndex
+					position423, tokenIndex423 := position, tokenIndex
 					{
-						position422, tokenIndex422 := position, tokenIndex
+						position424, tokenIndex424 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l425
+						}
+						position++
+						goto l424
+					l425:
+						position, tokenIndex = position424, tokenIndex424
+						if buffer[position] != rune('$') {
 							goto l423
 						}
 						position++
-						goto l422
-					l423:
-						position, tokenIndex = position422, tokenIndex422
-						if buffer[position] != rune('$') {
-							goto l421
-						}
-						position++
 					}
-				l422:
-					goto l420
-				l421:
-					position, tokenIndex = position421, tokenIndex421
+				l424:
+					goto l422
+				l423:
+					position, tokenIndex = position423, tokenIndex423
 				}
 				{
-					position424, tokenIndex424 := position, tokenIndex
+					position426, tokenIndex426 := position, tokenIndex
 					if buffer[position] != rune('b') {
-						goto l425
+						goto l427
 					}
 					position++
-					goto l424
-				l425:
-					position, tokenIndex = position424, tokenIndex424
+					goto l426
+				l427:
+					position, tokenIndex = position426, tokenIndex426
 					if buffer[position] != rune('f') {
-						goto l418
+						goto l420
 					}
 					position++
 				}
-			l424:
-				add(ruleLocalLabelRef, position419)
+			l426:
+				add(ruleLocalLabelRef, position421)
 			}
 			return true
-		l418:
-			position, tokenIndex = position418, tokenIndex418
+		l420:
+			position, tokenIndex = position420, tokenIndex420
 			return false
 		},
 		/* 30 Instruction <- <(InstructionName (WS InstructionArg (WS? ',' WS? InstructionArg)*)?)> */
 		func() bool {
-			position426, tokenIndex426 := position, tokenIndex
+			position428, tokenIndex428 := position, tokenIndex
 			{
-				position427 := position
+				position429 := position
 				if !_rules[ruleInstructionName]() {
-					goto l426
+					goto l428
 				}
 				{
-					position428, tokenIndex428 := position, tokenIndex
+					position430, tokenIndex430 := position, tokenIndex
 					if !_rules[ruleWS]() {
-						goto l428
+						goto l430
 					}
 					if !_rules[ruleInstructionArg]() {
-						goto l428
+						goto l430
 					}
-				l430:
+				l432:
 					{
-						position431, tokenIndex431 := position, tokenIndex
-						{
-							position432, tokenIndex432 := position, tokenIndex
-							if !_rules[ruleWS]() {
-								goto l432
-							}
-							goto l433
-						l432:
-							position, tokenIndex = position432, tokenIndex432
-						}
-					l433:
-						if buffer[position] != rune(',') {
-							goto l431
-						}
-						position++
+						position433, tokenIndex433 := position, tokenIndex
 						{
 							position434, tokenIndex434 := position, tokenIndex
 							if !_rules[ruleWS]() {
@@ -3463,1013 +3489,1009 @@
 							position, tokenIndex = position434, tokenIndex434
 						}
 					l435:
-						if !_rules[ruleInstructionArg]() {
-							goto l431
+						if buffer[position] != rune(',') {
+							goto l433
 						}
-						goto l430
-					l431:
-						position, tokenIndex = position431, tokenIndex431
+						position++
+						{
+							position436, tokenIndex436 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l436
+							}
+							goto l437
+						l436:
+							position, tokenIndex = position436, tokenIndex436
+						}
+					l437:
+						if !_rules[ruleInstructionArg]() {
+							goto l433
+						}
+						goto l432
+					l433:
+						position, tokenIndex = position433, tokenIndex433
 					}
-					goto l429
-				l428:
-					position, tokenIndex = position428, tokenIndex428
+					goto l431
+				l430:
+					position, tokenIndex = position430, tokenIndex430
 				}
-			l429:
-				add(ruleInstruction, position427)
+			l431:
+				add(ruleInstruction, position429)
 			}
 			return true
-		l426:
-			position, tokenIndex = position426, tokenIndex426
+		l428:
+			position, tokenIndex = position428, tokenIndex428
 			return false
 		},
 		/* 31 InstructionName <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / '.' / ([0-9] / [0-9]))* ('.' / '+' / '-')?)> */
 		func() bool {
-			position436, tokenIndex436 := position, tokenIndex
+			position438, tokenIndex438 := position, tokenIndex
 			{
-				position437 := position
+				position439 := position
 				{
-					position438, tokenIndex438 := position, tokenIndex
+					position440, tokenIndex440 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l439
+						goto l441
 					}
 					position++
-					goto l438
-				l439:
-					position, tokenIndex = position438, tokenIndex438
+					goto l440
+				l441:
+					position, tokenIndex = position440, tokenIndex440
 					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l436
+						goto l438
 					}
 					position++
 				}
-			l438:
 			l440:
+			l442:
 				{
-					position441, tokenIndex441 := position, tokenIndex
+					position443, tokenIndex443 := position, tokenIndex
 					{
-						position442, tokenIndex442 := position, tokenIndex
+						position444, tokenIndex444 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l443
-						}
-						position++
-						goto l442
-					l443:
-						position, tokenIndex = position442, tokenIndex442
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l444
-						}
-						position++
-						goto l442
-					l444:
-						position, tokenIndex = position442, tokenIndex442
-						if buffer[position] != rune('.') {
 							goto l445
 						}
 						position++
-						goto l442
+						goto l444
 					l445:
-						position, tokenIndex = position442, tokenIndex442
+						position, tokenIndex = position444, tokenIndex444
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l446
+						}
+						position++
+						goto l444
+					l446:
+						position, tokenIndex = position444, tokenIndex444
+						if buffer[position] != rune('.') {
+							goto l447
+						}
+						position++
+						goto l444
+					l447:
+						position, tokenIndex = position444, tokenIndex444
 						{
-							position446, tokenIndex446 := position, tokenIndex
+							position448, tokenIndex448 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l447
+								goto l449
 							}
 							position++
-							goto l446
-						l447:
-							position, tokenIndex = position446, tokenIndex446
+							goto l448
+						l449:
+							position, tokenIndex = position448, tokenIndex448
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l441
+								goto l443
 							}
 							position++
 						}
-					l446:
+					l448:
 					}
-				l442:
-					goto l440
-				l441:
-					position, tokenIndex = position441, tokenIndex441
+				l444:
+					goto l442
+				l443:
+					position, tokenIndex = position443, tokenIndex443
 				}
 				{
-					position448, tokenIndex448 := position, tokenIndex
+					position450, tokenIndex450 := position, tokenIndex
 					{
-						position450, tokenIndex450 := position, tokenIndex
+						position452, tokenIndex452 := position, tokenIndex
 						if buffer[position] != rune('.') {
-							goto l451
+							goto l453
 						}
 						position++
-						goto l450
-					l451:
-						position, tokenIndex = position450, tokenIndex450
+						goto l452
+					l453:
+						position, tokenIndex = position452, tokenIndex452
 						if buffer[position] != rune('+') {
-							goto l452
+							goto l454
 						}
 						position++
-						goto l450
-					l452:
-						position, tokenIndex = position450, tokenIndex450
+						goto l452
+					l454:
+						position, tokenIndex = position452, tokenIndex452
 						if buffer[position] != rune('-') {
-							goto l448
+							goto l450
 						}
 						position++
 					}
+				l452:
+					goto l451
 				l450:
-					goto l449
-				l448:
-					position, tokenIndex = position448, tokenIndex448
+					position, tokenIndex = position450, tokenIndex450
 				}
-			l449:
-				add(ruleInstructionName, position437)
+			l451:
+				add(ruleInstructionName, position439)
 			}
 			return true
-		l436:
-			position, tokenIndex = position436, tokenIndex436
+		l438:
+			position, tokenIndex = position438, tokenIndex438
 			return false
 		},
 		/* 32 InstructionArg <- <(IndirectionIndicator? (ARMConstantTweak / RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / GOTLocation / GOTSymbolOffset / MemoryRef) AVX512Token*)> */
 		func() bool {
-			position453, tokenIndex453 := position, tokenIndex
+			position455, tokenIndex455 := position, tokenIndex
 			{
-				position454 := position
-				{
-					position455, tokenIndex455 := position, tokenIndex
-					if !_rules[ruleIndirectionIndicator]() {
-						goto l455
-					}
-					goto l456
-				l455:
-					position, tokenIndex = position455, tokenIndex455
-				}
-			l456:
+				position456 := position
 				{
 					position457, tokenIndex457 := position, tokenIndex
+					if !_rules[ruleIndirectionIndicator]() {
+						goto l457
+					}
+					goto l458
+				l457:
+					position, tokenIndex = position457, tokenIndex457
+				}
+			l458:
+				{
+					position459, tokenIndex459 := position, tokenIndex
 					if !_rules[ruleARMConstantTweak]() {
-						goto l458
-					}
-					goto l457
-				l458:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleRegisterOrConstant]() {
-						goto l459
-					}
-					goto l457
-				l459:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleLocalLabelRef]() {
 						goto l460
 					}
-					goto l457
+					goto l459
 				l460:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleTOCRefHigh]() {
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleRegisterOrConstant]() {
 						goto l461
 					}
-					goto l457
+					goto l459
 				l461:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleTOCRefLow]() {
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleLocalLabelRef]() {
 						goto l462
 					}
-					goto l457
+					goto l459
 				l462:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleGOTLocation]() {
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleTOCRefHigh]() {
 						goto l463
 					}
-					goto l457
+					goto l459
 				l463:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleGOTSymbolOffset]() {
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleTOCRefLow]() {
 						goto l464
 					}
-					goto l457
+					goto l459
 				l464:
-					position, tokenIndex = position457, tokenIndex457
-					if !_rules[ruleMemoryRef]() {
-						goto l453
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleGOTLocation]() {
+						goto l465
 					}
-				}
-			l457:
-			l465:
-				{
-					position466, tokenIndex466 := position, tokenIndex
-					if !_rules[ruleAVX512Token]() {
+					goto l459
+				l465:
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleGOTSymbolOffset]() {
 						goto l466
 					}
-					goto l465
+					goto l459
 				l466:
-					position, tokenIndex = position466, tokenIndex466
+					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleMemoryRef]() {
+						goto l455
+					}
 				}
-				add(ruleInstructionArg, position454)
+			l459:
+			l467:
+				{
+					position468, tokenIndex468 := position, tokenIndex
+					if !_rules[ruleAVX512Token]() {
+						goto l468
+					}
+					goto l467
+				l468:
+					position, tokenIndex = position468, tokenIndex468
+				}
+				add(ruleInstructionArg, position456)
 			}
 			return true
-		l453:
-			position, tokenIndex = position453, tokenIndex453
+		l455:
+			position, tokenIndex = position455, tokenIndex455
 			return false
 		},
 		/* 33 GOTLocation <- <('$' '_' 'G' 'L' 'O' 'B' 'A' 'L' '_' 'O' 'F' 'F' 'S' 'E' 'T' '_' 'T' 'A' 'B' 'L' 'E' '_' '-' LocalSymbol)> */
 		func() bool {
-			position467, tokenIndex467 := position, tokenIndex
-			{
-				position468 := position
-				if buffer[position] != rune('$') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('_') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('G') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('L') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('O') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('B') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('A') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('L') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('_') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('O') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('F') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('F') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('S') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('E') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('T') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('_') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('T') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('A') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('B') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('L') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('E') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('_') {
-					goto l467
-				}
-				position++
-				if buffer[position] != rune('-') {
-					goto l467
-				}
-				position++
-				if !_rules[ruleLocalSymbol]() {
-					goto l467
-				}
-				add(ruleGOTLocation, position468)
-			}
-			return true
-		l467:
-			position, tokenIndex = position467, tokenIndex467
-			return false
-		},
-		/* 34 GOTSymbolOffset <- <(('$' SymbolName ('@' 'G' 'O' 'T') ('O' 'F' 'F')?) / (':' ('g' / 'G') ('o' / 'O') ('t' / 'T') ':' SymbolName))> */
-		func() bool {
 			position469, tokenIndex469 := position, tokenIndex
 			{
 				position470 := position
-				{
-					position471, tokenIndex471 := position, tokenIndex
-					if buffer[position] != rune('$') {
-						goto l472
-					}
-					position++
-					if !_rules[ruleSymbolName]() {
-						goto l472
-					}
-					if buffer[position] != rune('@') {
-						goto l472
-					}
-					position++
-					if buffer[position] != rune('G') {
-						goto l472
-					}
-					position++
-					if buffer[position] != rune('O') {
-						goto l472
-					}
-					position++
-					if buffer[position] != rune('T') {
-						goto l472
-					}
-					position++
-					{
-						position473, tokenIndex473 := position, tokenIndex
-						if buffer[position] != rune('O') {
-							goto l473
-						}
-						position++
-						if buffer[position] != rune('F') {
-							goto l473
-						}
-						position++
-						if buffer[position] != rune('F') {
-							goto l473
-						}
-						position++
-						goto l474
-					l473:
-						position, tokenIndex = position473, tokenIndex473
-					}
-				l474:
-					goto l471
-				l472:
-					position, tokenIndex = position471, tokenIndex471
-					if buffer[position] != rune(':') {
-						goto l469
-					}
-					position++
-					{
-						position475, tokenIndex475 := position, tokenIndex
-						if buffer[position] != rune('g') {
-							goto l476
-						}
-						position++
-						goto l475
-					l476:
-						position, tokenIndex = position475, tokenIndex475
-						if buffer[position] != rune('G') {
-							goto l469
-						}
-						position++
-					}
-				l475:
-					{
-						position477, tokenIndex477 := position, tokenIndex
-						if buffer[position] != rune('o') {
-							goto l478
-						}
-						position++
-						goto l477
-					l478:
-						position, tokenIndex = position477, tokenIndex477
-						if buffer[position] != rune('O') {
-							goto l469
-						}
-						position++
-					}
-				l477:
-					{
-						position479, tokenIndex479 := position, tokenIndex
-						if buffer[position] != rune('t') {
-							goto l480
-						}
-						position++
-						goto l479
-					l480:
-						position, tokenIndex = position479, tokenIndex479
-						if buffer[position] != rune('T') {
-							goto l469
-						}
-						position++
-					}
-				l479:
-					if buffer[position] != rune(':') {
-						goto l469
-					}
-					position++
-					if !_rules[ruleSymbolName]() {
-						goto l469
-					}
+				if buffer[position] != rune('$') {
+					goto l469
 				}
-			l471:
-				add(ruleGOTSymbolOffset, position470)
+				position++
+				if buffer[position] != rune('_') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('G') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('L') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('O') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('B') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('A') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('L') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('_') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('O') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('F') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('F') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('S') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('E') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('_') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('A') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('B') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('L') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('E') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('_') {
+					goto l469
+				}
+				position++
+				if buffer[position] != rune('-') {
+					goto l469
+				}
+				position++
+				if !_rules[ruleLocalSymbol]() {
+					goto l469
+				}
+				add(ruleGOTLocation, position470)
 			}
 			return true
 		l469:
 			position, tokenIndex = position469, tokenIndex469
 			return false
 		},
-		/* 35 AVX512Token <- <(WS? '{' '%'? ([0-9] / [a-z])* '}')> */
+		/* 34 GOTSymbolOffset <- <(('$' SymbolName ('@' 'G' 'O' 'T') ('O' 'F' 'F')?) / (':' ('g' / 'G') ('o' / 'O') ('t' / 'T') ':' SymbolName))> */
 		func() bool {
-			position481, tokenIndex481 := position, tokenIndex
+			position471, tokenIndex471 := position, tokenIndex
 			{
-				position482 := position
+				position472 := position
 				{
-					position483, tokenIndex483 := position, tokenIndex
-					if !_rules[ruleWS]() {
-						goto l483
-					}
-					goto l484
-				l483:
-					position, tokenIndex = position483, tokenIndex483
-				}
-			l484:
-				if buffer[position] != rune('{') {
-					goto l481
-				}
-				position++
-				{
-					position485, tokenIndex485 := position, tokenIndex
-					if buffer[position] != rune('%') {
-						goto l485
+					position473, tokenIndex473 := position, tokenIndex
+					if buffer[position] != rune('$') {
+						goto l474
 					}
 					position++
+					if !_rules[ruleSymbolName]() {
+						goto l474
+					}
+					if buffer[position] != rune('@') {
+						goto l474
+					}
+					position++
+					if buffer[position] != rune('G') {
+						goto l474
+					}
+					position++
+					if buffer[position] != rune('O') {
+						goto l474
+					}
+					position++
+					if buffer[position] != rune('T') {
+						goto l474
+					}
+					position++
+					{
+						position475, tokenIndex475 := position, tokenIndex
+						if buffer[position] != rune('O') {
+							goto l475
+						}
+						position++
+						if buffer[position] != rune('F') {
+							goto l475
+						}
+						position++
+						if buffer[position] != rune('F') {
+							goto l475
+						}
+						position++
+						goto l476
+					l475:
+						position, tokenIndex = position475, tokenIndex475
+					}
+				l476:
+					goto l473
+				l474:
+					position, tokenIndex = position473, tokenIndex473
+					if buffer[position] != rune(':') {
+						goto l471
+					}
+					position++
+					{
+						position477, tokenIndex477 := position, tokenIndex
+						if buffer[position] != rune('g') {
+							goto l478
+						}
+						position++
+						goto l477
+					l478:
+						position, tokenIndex = position477, tokenIndex477
+						if buffer[position] != rune('G') {
+							goto l471
+						}
+						position++
+					}
+				l477:
+					{
+						position479, tokenIndex479 := position, tokenIndex
+						if buffer[position] != rune('o') {
+							goto l480
+						}
+						position++
+						goto l479
+					l480:
+						position, tokenIndex = position479, tokenIndex479
+						if buffer[position] != rune('O') {
+							goto l471
+						}
+						position++
+					}
+				l479:
+					{
+						position481, tokenIndex481 := position, tokenIndex
+						if buffer[position] != rune('t') {
+							goto l482
+						}
+						position++
+						goto l481
+					l482:
+						position, tokenIndex = position481, tokenIndex481
+						if buffer[position] != rune('T') {
+							goto l471
+						}
+						position++
+					}
+				l481:
+					if buffer[position] != rune(':') {
+						goto l471
+					}
+					position++
+					if !_rules[ruleSymbolName]() {
+						goto l471
+					}
+				}
+			l473:
+				add(ruleGOTSymbolOffset, position472)
+			}
+			return true
+		l471:
+			position, tokenIndex = position471, tokenIndex471
+			return false
+		},
+		/* 35 AVX512Token <- <(WS? '{' '%'? ([0-9] / [a-z])* '}')> */
+		func() bool {
+			position483, tokenIndex483 := position, tokenIndex
+			{
+				position484 := position
+				{
+					position485, tokenIndex485 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l485
+					}
 					goto l486
 				l485:
 					position, tokenIndex = position485, tokenIndex485
 				}
 			l486:
-			l487:
+				if buffer[position] != rune('{') {
+					goto l483
+				}
+				position++
 				{
-					position488, tokenIndex488 := position, tokenIndex
+					position487, tokenIndex487 := position, tokenIndex
+					if buffer[position] != rune('%') {
+						goto l487
+					}
+					position++
+					goto l488
+				l487:
+					position, tokenIndex = position487, tokenIndex487
+				}
+			l488:
+			l489:
+				{
+					position490, tokenIndex490 := position, tokenIndex
 					{
-						position489, tokenIndex489 := position, tokenIndex
+						position491, tokenIndex491 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l492
+						}
+						position++
+						goto l491
+					l492:
+						position, tokenIndex = position491, tokenIndex491
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
 							goto l490
 						}
 						position++
-						goto l489
-					l490:
-						position, tokenIndex = position489, tokenIndex489
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l488
-						}
-						position++
 					}
-				l489:
-					goto l487
-				l488:
-					position, tokenIndex = position488, tokenIndex488
+				l491:
+					goto l489
+				l490:
+					position, tokenIndex = position490, tokenIndex490
 				}
 				if buffer[position] != rune('}') {
-					goto l481
+					goto l483
 				}
 				position++
-				add(ruleAVX512Token, position482)
+				add(ruleAVX512Token, position484)
 			}
 			return true
-		l481:
-			position, tokenIndex = position481, tokenIndex481
+		l483:
+			position, tokenIndex = position483, tokenIndex483
 			return false
 		},
 		/* 36 TOCRefHigh <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('h' / 'H') ('a' / 'A')))> */
 		func() bool {
-			position491, tokenIndex491 := position, tokenIndex
+			position493, tokenIndex493 := position, tokenIndex
 			{
-				position492 := position
+				position494 := position
 				if buffer[position] != rune('.') {
-					goto l491
+					goto l493
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l491
+					goto l493
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l491
+					goto l493
 				}
 				position++
 				if buffer[position] != rune('C') {
-					goto l491
+					goto l493
 				}
 				position++
 				if buffer[position] != rune('.') {
-					goto l491
+					goto l493
 				}
 				position++
 				if buffer[position] != rune('-') {
-					goto l491
+					goto l493
 				}
 				position++
 				{
-					position493, tokenIndex493 := position, tokenIndex
+					position495, tokenIndex495 := position, tokenIndex
 					if buffer[position] != rune('0') {
-						goto l494
+						goto l496
 					}
 					position++
 					if buffer[position] != rune('b') {
-						goto l494
+						goto l496
 					}
 					position++
-					goto l493
-				l494:
-					position, tokenIndex = position493, tokenIndex493
+					goto l495
+				l496:
+					position, tokenIndex = position495, tokenIndex495
 					if buffer[position] != rune('.') {
-						goto l491
+						goto l493
 					}
 					position++
 					if buffer[position] != rune('L') {
-						goto l491
+						goto l493
 					}
 					position++
 					{
-						position497, tokenIndex497 := position, tokenIndex
+						position499, tokenIndex499 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l498
-						}
-						position++
-						goto l497
-					l498:
-						position, tokenIndex = position497, tokenIndex497
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l499
-						}
-						position++
-						goto l497
-					l499:
-						position, tokenIndex = position497, tokenIndex497
-						if buffer[position] != rune('_') {
 							goto l500
 						}
 						position++
-						goto l497
+						goto l499
 					l500:
-						position, tokenIndex = position497, tokenIndex497
+						position, tokenIndex = position499, tokenIndex499
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l501
+						}
+						position++
+						goto l499
+					l501:
+						position, tokenIndex = position499, tokenIndex499
+						if buffer[position] != rune('_') {
+							goto l502
+						}
+						position++
+						goto l499
+					l502:
+						position, tokenIndex = position499, tokenIndex499
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l491
+							goto l493
 						}
 						position++
 					}
+				l499:
 				l497:
-				l495:
 					{
-						position496, tokenIndex496 := position, tokenIndex
+						position498, tokenIndex498 := position, tokenIndex
 						{
-							position501, tokenIndex501 := position, tokenIndex
+							position503, tokenIndex503 := position, tokenIndex
 							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l502
-							}
-							position++
-							goto l501
-						l502:
-							position, tokenIndex = position501, tokenIndex501
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l503
-							}
-							position++
-							goto l501
-						l503:
-							position, tokenIndex = position501, tokenIndex501
-							if buffer[position] != rune('_') {
 								goto l504
 							}
 							position++
-							goto l501
+							goto l503
 						l504:
-							position, tokenIndex = position501, tokenIndex501
+							position, tokenIndex = position503, tokenIndex503
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l505
+							}
+							position++
+							goto l503
+						l505:
+							position, tokenIndex = position503, tokenIndex503
+							if buffer[position] != rune('_') {
+								goto l506
+							}
+							position++
+							goto l503
+						l506:
+							position, tokenIndex = position503, tokenIndex503
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l496
+								goto l498
 							}
 							position++
 						}
-					l501:
-						goto l495
-					l496:
-						position, tokenIndex = position496, tokenIndex496
+					l503:
+						goto l497
+					l498:
+						position, tokenIndex = position498, tokenIndex498
 					}
 				}
-			l493:
+			l495:
 				if buffer[position] != rune('@') {
-					goto l491
+					goto l493
 				}
 				position++
 				{
-					position505, tokenIndex505 := position, tokenIndex
-					if buffer[position] != rune('h') {
-						goto l506
-					}
-					position++
-					goto l505
-				l506:
-					position, tokenIndex = position505, tokenIndex505
-					if buffer[position] != rune('H') {
-						goto l491
-					}
-					position++
-				}
-			l505:
-				{
 					position507, tokenIndex507 := position, tokenIndex
-					if buffer[position] != rune('a') {
+					if buffer[position] != rune('h') {
 						goto l508
 					}
 					position++
 					goto l507
 				l508:
 					position, tokenIndex = position507, tokenIndex507
-					if buffer[position] != rune('A') {
-						goto l491
+					if buffer[position] != rune('H') {
+						goto l493
 					}
 					position++
 				}
 			l507:
-				add(ruleTOCRefHigh, position492)
+				{
+					position509, tokenIndex509 := position, tokenIndex
+					if buffer[position] != rune('a') {
+						goto l510
+					}
+					position++
+					goto l509
+				l510:
+					position, tokenIndex = position509, tokenIndex509
+					if buffer[position] != rune('A') {
+						goto l493
+					}
+					position++
+				}
+			l509:
+				add(ruleTOCRefHigh, position494)
 			}
 			return true
-		l491:
-			position, tokenIndex = position491, tokenIndex491
+		l493:
+			position, tokenIndex = position493, tokenIndex493
 			return false
 		},
 		/* 37 TOCRefLow <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('l' / 'L')))> */
 		func() bool {
-			position509, tokenIndex509 := position, tokenIndex
+			position511, tokenIndex511 := position, tokenIndex
 			{
-				position510 := position
+				position512 := position
 				if buffer[position] != rune('.') {
-					goto l509
+					goto l511
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l509
+					goto l511
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l509
+					goto l511
 				}
 				position++
 				if buffer[position] != rune('C') {
-					goto l509
+					goto l511
 				}
 				position++
 				if buffer[position] != rune('.') {
-					goto l509
+					goto l511
 				}
 				position++
 				if buffer[position] != rune('-') {
-					goto l509
+					goto l511
 				}
 				position++
 				{
-					position511, tokenIndex511 := position, tokenIndex
+					position513, tokenIndex513 := position, tokenIndex
 					if buffer[position] != rune('0') {
-						goto l512
+						goto l514
 					}
 					position++
 					if buffer[position] != rune('b') {
-						goto l512
+						goto l514
 					}
 					position++
-					goto l511
-				l512:
-					position, tokenIndex = position511, tokenIndex511
+					goto l513
+				l514:
+					position, tokenIndex = position513, tokenIndex513
 					if buffer[position] != rune('.') {
-						goto l509
+						goto l511
 					}
 					position++
 					if buffer[position] != rune('L') {
-						goto l509
+						goto l511
 					}
 					position++
 					{
-						position515, tokenIndex515 := position, tokenIndex
+						position517, tokenIndex517 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l516
-						}
-						position++
-						goto l515
-					l516:
-						position, tokenIndex = position515, tokenIndex515
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l517
-						}
-						position++
-						goto l515
-					l517:
-						position, tokenIndex = position515, tokenIndex515
-						if buffer[position] != rune('_') {
 							goto l518
 						}
 						position++
-						goto l515
+						goto l517
 					l518:
-						position, tokenIndex = position515, tokenIndex515
+						position, tokenIndex = position517, tokenIndex517
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l519
+						}
+						position++
+						goto l517
+					l519:
+						position, tokenIndex = position517, tokenIndex517
+						if buffer[position] != rune('_') {
+							goto l520
+						}
+						position++
+						goto l517
+					l520:
+						position, tokenIndex = position517, tokenIndex517
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l509
+							goto l511
 						}
 						position++
 					}
+				l517:
 				l515:
-				l513:
 					{
-						position514, tokenIndex514 := position, tokenIndex
+						position516, tokenIndex516 := position, tokenIndex
 						{
-							position519, tokenIndex519 := position, tokenIndex
+							position521, tokenIndex521 := position, tokenIndex
 							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l520
-							}
-							position++
-							goto l519
-						l520:
-							position, tokenIndex = position519, tokenIndex519
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l521
-							}
-							position++
-							goto l519
-						l521:
-							position, tokenIndex = position519, tokenIndex519
-							if buffer[position] != rune('_') {
 								goto l522
 							}
 							position++
-							goto l519
+							goto l521
 						l522:
-							position, tokenIndex = position519, tokenIndex519
+							position, tokenIndex = position521, tokenIndex521
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l523
+							}
+							position++
+							goto l521
+						l523:
+							position, tokenIndex = position521, tokenIndex521
+							if buffer[position] != rune('_') {
+								goto l524
+							}
+							position++
+							goto l521
+						l524:
+							position, tokenIndex = position521, tokenIndex521
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l514
+								goto l516
 							}
 							position++
 						}
-					l519:
-						goto l513
-					l514:
-						position, tokenIndex = position514, tokenIndex514
+					l521:
+						goto l515
+					l516:
+						position, tokenIndex = position516, tokenIndex516
 					}
 				}
-			l511:
+			l513:
 				if buffer[position] != rune('@') {
-					goto l509
+					goto l511
 				}
 				position++
 				{
-					position523, tokenIndex523 := position, tokenIndex
+					position525, tokenIndex525 := position, tokenIndex
 					if buffer[position] != rune('l') {
-						goto l524
+						goto l526
 					}
 					position++
-					goto l523
-				l524:
-					position, tokenIndex = position523, tokenIndex523
+					goto l525
+				l526:
+					position, tokenIndex = position525, tokenIndex525
 					if buffer[position] != rune('L') {
-						goto l509
+						goto l511
 					}
 					position++
 				}
-			l523:
-				add(ruleTOCRefLow, position510)
+			l525:
+				add(ruleTOCRefLow, position512)
 			}
 			return true
-		l509:
-			position, tokenIndex = position509, tokenIndex509
+		l511:
+			position, tokenIndex = position511, tokenIndex511
 			return false
 		},
 		/* 38 IndirectionIndicator <- <'*'> */
 		func() bool {
-			position525, tokenIndex525 := position, tokenIndex
+			position527, tokenIndex527 := position, tokenIndex
 			{
-				position526 := position
+				position528 := position
 				if buffer[position] != rune('*') {
-					goto l525
+					goto l527
 				}
 				position++
-				add(ruleIndirectionIndicator, position526)
+				add(ruleIndirectionIndicator, position528)
 			}
 			return true
-		l525:
-			position, tokenIndex = position525, tokenIndex525
+		l527:
+			position, tokenIndex = position527, tokenIndex527
 			return false
 		},
 		/* 39 RegisterOrConstant <- <((('%' ([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))*) / ('$'? ((Offset Offset) / Offset)) / ('#' Offset ('*' [0-9]+ ('-' [0-9] [0-9]*)?)?) / ('#' '~'? '(' [0-9] WS? ('<' '<') WS? [0-9] ')') / ARMRegister) !('f' / 'b' / ':' / '(' / '+' / '-'))> */
 		func() bool {
-			position527, tokenIndex527 := position, tokenIndex
+			position529, tokenIndex529 := position, tokenIndex
 			{
-				position528 := position
+				position530 := position
 				{
-					position529, tokenIndex529 := position, tokenIndex
+					position531, tokenIndex531 := position, tokenIndex
 					if buffer[position] != rune('%') {
-						goto l530
+						goto l532
 					}
 					position++
 					{
-						position531, tokenIndex531 := position, tokenIndex
+						position533, tokenIndex533 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l534
+						}
+						position++
+						goto l533
+					l534:
+						position, tokenIndex = position533, tokenIndex533
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
 							goto l532
 						}
 						position++
-						goto l531
-					l532:
-						position, tokenIndex = position531, tokenIndex531
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l530
-						}
-						position++
 					}
-				l531:
 				l533:
+				l535:
 					{
-						position534, tokenIndex534 := position, tokenIndex
+						position536, tokenIndex536 := position, tokenIndex
 						{
-							position535, tokenIndex535 := position, tokenIndex
+							position537, tokenIndex537 := position, tokenIndex
 							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l536
-							}
-							position++
-							goto l535
-						l536:
-							position, tokenIndex = position535, tokenIndex535
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l537
-							}
-							position++
-							goto l535
-						l537:
-							position, tokenIndex = position535, tokenIndex535
-							{
-								position538, tokenIndex538 := position, tokenIndex
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l539
-								}
-								position++
 								goto l538
-							l539:
-								position, tokenIndex = position538, tokenIndex538
+							}
+							position++
+							goto l537
+						l538:
+							position, tokenIndex = position537, tokenIndex537
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l539
+							}
+							position++
+							goto l537
+						l539:
+							position, tokenIndex = position537, tokenIndex537
+							{
+								position540, tokenIndex540 := position, tokenIndex
 								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l534
+									goto l541
+								}
+								position++
+								goto l540
+							l541:
+								position, tokenIndex = position540, tokenIndex540
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l536
 								}
 								position++
 							}
-						l538:
+						l540:
 						}
-					l535:
-						goto l533
-					l534:
-						position, tokenIndex = position534, tokenIndex534
+					l537:
+						goto l535
+					l536:
+						position, tokenIndex = position536, tokenIndex536
 					}
-					goto l529
-				l530:
-					position, tokenIndex = position529, tokenIndex529
-					{
-						position541, tokenIndex541 := position, tokenIndex
-						if buffer[position] != rune('$') {
-							goto l541
-						}
-						position++
-						goto l542
-					l541:
-						position, tokenIndex = position541, tokenIndex541
-					}
-				l542:
+					goto l531
+				l532:
+					position, tokenIndex = position531, tokenIndex531
 					{
 						position543, tokenIndex543 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l544
+						if buffer[position] != rune('$') {
+							goto l543
 						}
-						if !_rules[ruleOffset]() {
-							goto l544
-						}
-						goto l543
-					l544:
+						position++
+						goto l544
+					l543:
 						position, tokenIndex = position543, tokenIndex543
+					}
+				l544:
+					{
+						position545, tokenIndex545 := position, tokenIndex
 						if !_rules[ruleOffset]() {
-							goto l540
+							goto l546
+						}
+						if !_rules[ruleOffset]() {
+							goto l546
+						}
+						goto l545
+					l546:
+						position, tokenIndex = position545, tokenIndex545
+						if !_rules[ruleOffset]() {
+							goto l542
 						}
 					}
-				l543:
-					goto l529
-				l540:
-					position, tokenIndex = position529, tokenIndex529
+				l545:
+					goto l531
+				l542:
+					position, tokenIndex = position531, tokenIndex531
 					if buffer[position] != rune('#') {
-						goto l545
+						goto l547
 					}
 					position++
 					if !_rules[ruleOffset]() {
-						goto l545
+						goto l547
 					}
 					{
-						position546, tokenIndex546 := position, tokenIndex
+						position548, tokenIndex548 := position, tokenIndex
 						if buffer[position] != rune('*') {
-							goto l546
+							goto l548
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l546
+							goto l548
 						}
 						position++
-					l548:
+					l550:
 						{
-							position549, tokenIndex549 := position, tokenIndex
+							position551, tokenIndex551 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l549
+								goto l551
 							}
 							position++
-							goto l548
-						l549:
-							position, tokenIndex = position549, tokenIndex549
+							goto l550
+						l551:
+							position, tokenIndex = position551, tokenIndex551
 						}
 						{
-							position550, tokenIndex550 := position, tokenIndex
+							position552, tokenIndex552 := position, tokenIndex
 							if buffer[position] != rune('-') {
-								goto l550
+								goto l552
 							}
 							position++
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l550
+								goto l552
 							}
 							position++
-						l552:
+						l554:
 							{
-								position553, tokenIndex553 := position, tokenIndex
+								position555, tokenIndex555 := position, tokenIndex
 								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l553
+									goto l555
 								}
 								position++
-								goto l552
-							l553:
-								position, tokenIndex = position553, tokenIndex553
+								goto l554
+							l555:
+								position, tokenIndex = position555, tokenIndex555
 							}
-							goto l551
-						l550:
-							position, tokenIndex = position550, tokenIndex550
+							goto l553
+						l552:
+							position, tokenIndex = position552, tokenIndex552
 						}
-					l551:
-						goto l547
-					l546:
-						position, tokenIndex = position546, tokenIndex546
+					l553:
+						goto l549
+					l548:
+						position, tokenIndex = position548, tokenIndex548
 					}
+				l549:
+					goto l531
 				l547:
-					goto l529
-				l545:
-					position, tokenIndex = position529, tokenIndex529
+					position, tokenIndex = position531, tokenIndex531
 					if buffer[position] != rune('#') {
-						goto l554
-					}
-					position++
-					{
-						position555, tokenIndex555 := position, tokenIndex
-						if buffer[position] != rune('~') {
-							goto l555
-						}
-						position++
 						goto l556
-					l555:
-						position, tokenIndex = position555, tokenIndex555
-					}
-				l556:
-					if buffer[position] != rune('(') {
-						goto l554
-					}
-					position++
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l554
 					}
 					position++
 					{
 						position557, tokenIndex557 := position, tokenIndex
-						if !_rules[ruleWS]() {
+						if buffer[position] != rune('~') {
 							goto l557
 						}
+						position++
 						goto l558
 					l557:
 						position, tokenIndex = position557, tokenIndex557
 					}
 				l558:
-					if buffer[position] != rune('<') {
-						goto l554
+					if buffer[position] != rune('(') {
+						goto l556
 					}
 					position++
-					if buffer[position] != rune('<') {
-						goto l554
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l556
 					}
 					position++
 					{
@@ -4482,1920 +4504,2020 @@
 						position, tokenIndex = position559, tokenIndex559
 					}
 				l560:
+					if buffer[position] != rune('<') {
+						goto l556
+					}
+					position++
+					if buffer[position] != rune('<') {
+						goto l556
+					}
+					position++
+					{
+						position561, tokenIndex561 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l561
+						}
+						goto l562
+					l561:
+						position, tokenIndex = position561, tokenIndex561
+					}
+				l562:
 					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l554
+						goto l556
 					}
 					position++
 					if buffer[position] != rune(')') {
-						goto l554
+						goto l556
 					}
 					position++
-					goto l529
-				l554:
-					position, tokenIndex = position529, tokenIndex529
+					goto l531
+				l556:
+					position, tokenIndex = position531, tokenIndex531
 					if !_rules[ruleARMRegister]() {
-						goto l527
+						goto l529
 					}
 				}
-			l529:
+			l531:
 				{
-					position561, tokenIndex561 := position, tokenIndex
+					position563, tokenIndex563 := position, tokenIndex
 					{
-						position562, tokenIndex562 := position, tokenIndex
+						position564, tokenIndex564 := position, tokenIndex
 						if buffer[position] != rune('f') {
-							goto l563
-						}
-						position++
-						goto l562
-					l563:
-						position, tokenIndex = position562, tokenIndex562
-						if buffer[position] != rune('b') {
-							goto l564
-						}
-						position++
-						goto l562
-					l564:
-						position, tokenIndex = position562, tokenIndex562
-						if buffer[position] != rune(':') {
 							goto l565
 						}
 						position++
-						goto l562
+						goto l564
 					l565:
-						position, tokenIndex = position562, tokenIndex562
-						if buffer[position] != rune('(') {
+						position, tokenIndex = position564, tokenIndex564
+						if buffer[position] != rune('b') {
 							goto l566
 						}
 						position++
-						goto l562
+						goto l564
 					l566:
-						position, tokenIndex = position562, tokenIndex562
-						if buffer[position] != rune('+') {
+						position, tokenIndex = position564, tokenIndex564
+						if buffer[position] != rune(':') {
 							goto l567
 						}
 						position++
-						goto l562
+						goto l564
 					l567:
-						position, tokenIndex = position562, tokenIndex562
+						position, tokenIndex = position564, tokenIndex564
+						if buffer[position] != rune('(') {
+							goto l568
+						}
+						position++
+						goto l564
+					l568:
+						position, tokenIndex = position564, tokenIndex564
+						if buffer[position] != rune('+') {
+							goto l569
+						}
+						position++
+						goto l564
+					l569:
+						position, tokenIndex = position564, tokenIndex564
 						if buffer[position] != rune('-') {
-							goto l561
+							goto l563
 						}
 						position++
 					}
-				l562:
-					goto l527
-				l561:
-					position, tokenIndex = position561, tokenIndex561
+				l564:
+					goto l529
+				l563:
+					position, tokenIndex = position563, tokenIndex563
 				}
-				add(ruleRegisterOrConstant, position528)
+				add(ruleRegisterOrConstant, position530)
 			}
 			return true
-		l527:
-			position, tokenIndex = position527, tokenIndex527
+		l529:
+			position, tokenIndex = position529, tokenIndex529
 			return false
 		},
 		/* 40 ARMConstantTweak <- <(((('l' / 'L') ('s' / 'S') ('l' / 'L')) / (('s' / 'S') ('x' / 'X') ('t' / 'T') ('w' / 'W')) / (('s' / 'S') ('x' / 'X') ('t' / 'T') ('b' / 'B')) / (('u' / 'U') ('x' / 'X') ('t' / 'T') ('w' / 'W')) / (('u' / 'U') ('x' / 'X') ('t' / 'T') ('b' / 'B')) / (('l' / 'L') ('s' / 'S') ('r' / 'R')) / (('r' / 'R') ('o' / 'O') ('r' / 'R')) / (('a' / 'A') ('s' / 'S') ('r' / 'R'))) (WS '#' Offset)?)> */
 		func() bool {
-			position568, tokenIndex568 := position, tokenIndex
+			position570, tokenIndex570 := position, tokenIndex
 			{
-				position569 := position
+				position571 := position
 				{
-					position570, tokenIndex570 := position, tokenIndex
-					{
-						position572, tokenIndex572 := position, tokenIndex
-						if buffer[position] != rune('l') {
-							goto l573
-						}
-						position++
-						goto l572
-					l573:
-						position, tokenIndex = position572, tokenIndex572
-						if buffer[position] != rune('L') {
-							goto l571
-						}
-						position++
-					}
-				l572:
+					position572, tokenIndex572 := position, tokenIndex
 					{
 						position574, tokenIndex574 := position, tokenIndex
-						if buffer[position] != rune('s') {
+						if buffer[position] != rune('l') {
 							goto l575
 						}
 						position++
 						goto l574
 					l575:
 						position, tokenIndex = position574, tokenIndex574
-						if buffer[position] != rune('S') {
-							goto l571
+						if buffer[position] != rune('L') {
+							goto l573
 						}
 						position++
 					}
 				l574:
 					{
 						position576, tokenIndex576 := position, tokenIndex
-						if buffer[position] != rune('l') {
+						if buffer[position] != rune('s') {
 							goto l577
 						}
 						position++
 						goto l576
 					l577:
 						position, tokenIndex = position576, tokenIndex576
-						if buffer[position] != rune('L') {
-							goto l571
+						if buffer[position] != rune('S') {
+							goto l573
 						}
 						position++
 					}
 				l576:
-					goto l570
-				l571:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position579, tokenIndex579 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l580
+						position578, tokenIndex578 := position, tokenIndex
+						if buffer[position] != rune('l') {
+							goto l579
 						}
 						position++
-						goto l579
-					l580:
-						position, tokenIndex = position579, tokenIndex579
-						if buffer[position] != rune('S') {
-							goto l578
+						goto l578
+					l579:
+						position, tokenIndex = position578, tokenIndex578
+						if buffer[position] != rune('L') {
+							goto l573
 						}
 						position++
 					}
-				l579:
+				l578:
+					goto l572
+				l573:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position581, tokenIndex581 := position, tokenIndex
-						if buffer[position] != rune('x') {
+						if buffer[position] != rune('s') {
 							goto l582
 						}
 						position++
 						goto l581
 					l582:
 						position, tokenIndex = position581, tokenIndex581
-						if buffer[position] != rune('X') {
-							goto l578
+						if buffer[position] != rune('S') {
+							goto l580
 						}
 						position++
 					}
 				l581:
 					{
 						position583, tokenIndex583 := position, tokenIndex
-						if buffer[position] != rune('t') {
+						if buffer[position] != rune('x') {
 							goto l584
 						}
 						position++
 						goto l583
 					l584:
 						position, tokenIndex = position583, tokenIndex583
-						if buffer[position] != rune('T') {
-							goto l578
+						if buffer[position] != rune('X') {
+							goto l580
 						}
 						position++
 					}
 				l583:
 					{
 						position585, tokenIndex585 := position, tokenIndex
-						if buffer[position] != rune('w') {
+						if buffer[position] != rune('t') {
 							goto l586
 						}
 						position++
 						goto l585
 					l586:
 						position, tokenIndex = position585, tokenIndex585
-						if buffer[position] != rune('W') {
-							goto l578
+						if buffer[position] != rune('T') {
+							goto l580
 						}
 						position++
 					}
 				l585:
-					goto l570
-				l578:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position588, tokenIndex588 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l589
+						position587, tokenIndex587 := position, tokenIndex
+						if buffer[position] != rune('w') {
+							goto l588
 						}
 						position++
-						goto l588
-					l589:
-						position, tokenIndex = position588, tokenIndex588
-						if buffer[position] != rune('S') {
-							goto l587
+						goto l587
+					l588:
+						position, tokenIndex = position587, tokenIndex587
+						if buffer[position] != rune('W') {
+							goto l580
 						}
 						position++
 					}
-				l588:
+				l587:
+					goto l572
+				l580:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position590, tokenIndex590 := position, tokenIndex
-						if buffer[position] != rune('x') {
+						if buffer[position] != rune('s') {
 							goto l591
 						}
 						position++
 						goto l590
 					l591:
 						position, tokenIndex = position590, tokenIndex590
-						if buffer[position] != rune('X') {
-							goto l587
+						if buffer[position] != rune('S') {
+							goto l589
 						}
 						position++
 					}
 				l590:
 					{
 						position592, tokenIndex592 := position, tokenIndex
-						if buffer[position] != rune('t') {
+						if buffer[position] != rune('x') {
 							goto l593
 						}
 						position++
 						goto l592
 					l593:
 						position, tokenIndex = position592, tokenIndex592
-						if buffer[position] != rune('T') {
-							goto l587
+						if buffer[position] != rune('X') {
+							goto l589
 						}
 						position++
 					}
 				l592:
 					{
 						position594, tokenIndex594 := position, tokenIndex
-						if buffer[position] != rune('b') {
+						if buffer[position] != rune('t') {
 							goto l595
 						}
 						position++
 						goto l594
 					l595:
 						position, tokenIndex = position594, tokenIndex594
-						if buffer[position] != rune('B') {
-							goto l587
+						if buffer[position] != rune('T') {
+							goto l589
 						}
 						position++
 					}
 				l594:
-					goto l570
-				l587:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position597, tokenIndex597 := position, tokenIndex
-						if buffer[position] != rune('u') {
-							goto l598
+						position596, tokenIndex596 := position, tokenIndex
+						if buffer[position] != rune('b') {
+							goto l597
 						}
 						position++
-						goto l597
-					l598:
-						position, tokenIndex = position597, tokenIndex597
-						if buffer[position] != rune('U') {
-							goto l596
+						goto l596
+					l597:
+						position, tokenIndex = position596, tokenIndex596
+						if buffer[position] != rune('B') {
+							goto l589
 						}
 						position++
 					}
-				l597:
+				l596:
+					goto l572
+				l589:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position599, tokenIndex599 := position, tokenIndex
-						if buffer[position] != rune('x') {
+						if buffer[position] != rune('u') {
 							goto l600
 						}
 						position++
 						goto l599
 					l600:
 						position, tokenIndex = position599, tokenIndex599
-						if buffer[position] != rune('X') {
-							goto l596
+						if buffer[position] != rune('U') {
+							goto l598
 						}
 						position++
 					}
 				l599:
 					{
 						position601, tokenIndex601 := position, tokenIndex
-						if buffer[position] != rune('t') {
+						if buffer[position] != rune('x') {
 							goto l602
 						}
 						position++
 						goto l601
 					l602:
 						position, tokenIndex = position601, tokenIndex601
-						if buffer[position] != rune('T') {
-							goto l596
+						if buffer[position] != rune('X') {
+							goto l598
 						}
 						position++
 					}
 				l601:
 					{
 						position603, tokenIndex603 := position, tokenIndex
-						if buffer[position] != rune('w') {
+						if buffer[position] != rune('t') {
 							goto l604
 						}
 						position++
 						goto l603
 					l604:
 						position, tokenIndex = position603, tokenIndex603
-						if buffer[position] != rune('W') {
-							goto l596
+						if buffer[position] != rune('T') {
+							goto l598
 						}
 						position++
 					}
 				l603:
-					goto l570
-				l596:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position606, tokenIndex606 := position, tokenIndex
-						if buffer[position] != rune('u') {
-							goto l607
+						position605, tokenIndex605 := position, tokenIndex
+						if buffer[position] != rune('w') {
+							goto l606
 						}
 						position++
-						goto l606
-					l607:
-						position, tokenIndex = position606, tokenIndex606
-						if buffer[position] != rune('U') {
-							goto l605
+						goto l605
+					l606:
+						position, tokenIndex = position605, tokenIndex605
+						if buffer[position] != rune('W') {
+							goto l598
 						}
 						position++
 					}
-				l606:
+				l605:
+					goto l572
+				l598:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position608, tokenIndex608 := position, tokenIndex
-						if buffer[position] != rune('x') {
+						if buffer[position] != rune('u') {
 							goto l609
 						}
 						position++
 						goto l608
 					l609:
 						position, tokenIndex = position608, tokenIndex608
-						if buffer[position] != rune('X') {
-							goto l605
+						if buffer[position] != rune('U') {
+							goto l607
 						}
 						position++
 					}
 				l608:
 					{
 						position610, tokenIndex610 := position, tokenIndex
-						if buffer[position] != rune('t') {
+						if buffer[position] != rune('x') {
 							goto l611
 						}
 						position++
 						goto l610
 					l611:
 						position, tokenIndex = position610, tokenIndex610
-						if buffer[position] != rune('T') {
-							goto l605
+						if buffer[position] != rune('X') {
+							goto l607
 						}
 						position++
 					}
 				l610:
 					{
 						position612, tokenIndex612 := position, tokenIndex
-						if buffer[position] != rune('b') {
+						if buffer[position] != rune('t') {
 							goto l613
 						}
 						position++
 						goto l612
 					l613:
 						position, tokenIndex = position612, tokenIndex612
-						if buffer[position] != rune('B') {
-							goto l605
+						if buffer[position] != rune('T') {
+							goto l607
 						}
 						position++
 					}
 				l612:
-					goto l570
-				l605:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position615, tokenIndex615 := position, tokenIndex
-						if buffer[position] != rune('l') {
-							goto l616
+						position614, tokenIndex614 := position, tokenIndex
+						if buffer[position] != rune('b') {
+							goto l615
 						}
 						position++
-						goto l615
-					l616:
-						position, tokenIndex = position615, tokenIndex615
-						if buffer[position] != rune('L') {
-							goto l614
+						goto l614
+					l615:
+						position, tokenIndex = position614, tokenIndex614
+						if buffer[position] != rune('B') {
+							goto l607
 						}
 						position++
 					}
-				l615:
+				l614:
+					goto l572
+				l607:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position617, tokenIndex617 := position, tokenIndex
-						if buffer[position] != rune('s') {
+						if buffer[position] != rune('l') {
 							goto l618
 						}
 						position++
 						goto l617
 					l618:
 						position, tokenIndex = position617, tokenIndex617
-						if buffer[position] != rune('S') {
-							goto l614
+						if buffer[position] != rune('L') {
+							goto l616
 						}
 						position++
 					}
 				l617:
 					{
 						position619, tokenIndex619 := position, tokenIndex
-						if buffer[position] != rune('r') {
+						if buffer[position] != rune('s') {
 							goto l620
 						}
 						position++
 						goto l619
 					l620:
 						position, tokenIndex = position619, tokenIndex619
-						if buffer[position] != rune('R') {
-							goto l614
+						if buffer[position] != rune('S') {
+							goto l616
 						}
 						position++
 					}
 				l619:
-					goto l570
-				l614:
-					position, tokenIndex = position570, tokenIndex570
 					{
-						position622, tokenIndex622 := position, tokenIndex
+						position621, tokenIndex621 := position, tokenIndex
 						if buffer[position] != rune('r') {
-							goto l623
+							goto l622
 						}
 						position++
-						goto l622
-					l623:
-						position, tokenIndex = position622, tokenIndex622
+						goto l621
+					l622:
+						position, tokenIndex = position621, tokenIndex621
 						if buffer[position] != rune('R') {
-							goto l621
+							goto l616
 						}
 						position++
 					}
-				l622:
+				l621:
+					goto l572
+				l616:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position624, tokenIndex624 := position, tokenIndex
-						if buffer[position] != rune('o') {
+						if buffer[position] != rune('r') {
 							goto l625
 						}
 						position++
 						goto l624
 					l625:
 						position, tokenIndex = position624, tokenIndex624
-						if buffer[position] != rune('O') {
-							goto l621
+						if buffer[position] != rune('R') {
+							goto l623
 						}
 						position++
 					}
 				l624:
 					{
 						position626, tokenIndex626 := position, tokenIndex
-						if buffer[position] != rune('r') {
+						if buffer[position] != rune('o') {
 							goto l627
 						}
 						position++
 						goto l626
 					l627:
 						position, tokenIndex = position626, tokenIndex626
-						if buffer[position] != rune('R') {
-							goto l621
+						if buffer[position] != rune('O') {
+							goto l623
 						}
 						position++
 					}
 				l626:
-					goto l570
-				l621:
-					position, tokenIndex = position570, tokenIndex570
 					{
 						position628, tokenIndex628 := position, tokenIndex
-						if buffer[position] != rune('a') {
+						if buffer[position] != rune('r') {
 							goto l629
 						}
 						position++
 						goto l628
 					l629:
 						position, tokenIndex = position628, tokenIndex628
-						if buffer[position] != rune('A') {
-							goto l568
+						if buffer[position] != rune('R') {
+							goto l623
 						}
 						position++
 					}
 				l628:
+					goto l572
+				l623:
+					position, tokenIndex = position572, tokenIndex572
 					{
 						position630, tokenIndex630 := position, tokenIndex
-						if buffer[position] != rune('s') {
+						if buffer[position] != rune('a') {
 							goto l631
 						}
 						position++
 						goto l630
 					l631:
 						position, tokenIndex = position630, tokenIndex630
-						if buffer[position] != rune('S') {
-							goto l568
+						if buffer[position] != rune('A') {
+							goto l570
 						}
 						position++
 					}
 				l630:
 					{
 						position632, tokenIndex632 := position, tokenIndex
-						if buffer[position] != rune('r') {
+						if buffer[position] != rune('s') {
 							goto l633
 						}
 						position++
 						goto l632
 					l633:
 						position, tokenIndex = position632, tokenIndex632
-						if buffer[position] != rune('R') {
-							goto l568
+						if buffer[position] != rune('S') {
+							goto l570
 						}
 						position++
 					}
 				l632:
-				}
-			l570:
-				{
-					position634, tokenIndex634 := position, tokenIndex
-					if !_rules[ruleWS]() {
+					{
+						position634, tokenIndex634 := position, tokenIndex
+						if buffer[position] != rune('r') {
+							goto l635
+						}
+						position++
 						goto l634
+					l635:
+						position, tokenIndex = position634, tokenIndex634
+						if buffer[position] != rune('R') {
+							goto l570
+						}
+						position++
+					}
+				l634:
+				}
+			l572:
+				{
+					position636, tokenIndex636 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l636
 					}
 					if buffer[position] != rune('#') {
-						goto l634
+						goto l636
 					}
 					position++
 					if !_rules[ruleOffset]() {
-						goto l634
+						goto l636
 					}
-					goto l635
-				l634:
-					position, tokenIndex = position634, tokenIndex634
+					goto l637
+				l636:
+					position, tokenIndex = position636, tokenIndex636
 				}
-			l635:
-				add(ruleARMConstantTweak, position569)
+			l637:
+				add(ruleARMConstantTweak, position571)
 			}
 			return true
-		l568:
-			position, tokenIndex = position568, tokenIndex568
+		l570:
+			position, tokenIndex = position570, tokenIndex570
 			return false
 		},
 		/* 41 ARMRegister <- <((('s' / 'S') ('p' / 'P')) / (('x' / 'w' / 'd' / 'q' / 's') [0-9] [0-9]?) / (('x' / 'X') ('z' / 'Z') ('r' / 'R')) / (('w' / 'W') ('z' / 'Z') ('r' / 'R')) / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */
 		func() bool {
-			position636, tokenIndex636 := position, tokenIndex
+			position638, tokenIndex638 := position, tokenIndex
 			{
-				position637 := position
+				position639 := position
 				{
-					position638, tokenIndex638 := position, tokenIndex
-					{
-						position640, tokenIndex640 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l641
-						}
-						position++
-						goto l640
-					l641:
-						position, tokenIndex = position640, tokenIndex640
-						if buffer[position] != rune('S') {
-							goto l639
-						}
-						position++
-					}
-				l640:
+					position640, tokenIndex640 := position, tokenIndex
 					{
 						position642, tokenIndex642 := position, tokenIndex
-						if buffer[position] != rune('p') {
+						if buffer[position] != rune('s') {
 							goto l643
 						}
 						position++
 						goto l642
 					l643:
 						position, tokenIndex = position642, tokenIndex642
-						if buffer[position] != rune('P') {
-							goto l639
+						if buffer[position] != rune('S') {
+							goto l641
 						}
 						position++
 					}
 				l642:
-					goto l638
-				l639:
-					position, tokenIndex = position638, tokenIndex638
 					{
-						position645, tokenIndex645 := position, tokenIndex
+						position644, tokenIndex644 := position, tokenIndex
+						if buffer[position] != rune('p') {
+							goto l645
+						}
+						position++
+						goto l644
+					l645:
+						position, tokenIndex = position644, tokenIndex644
+						if buffer[position] != rune('P') {
+							goto l641
+						}
+						position++
+					}
+				l644:
+					goto l640
+				l641:
+					position, tokenIndex = position640, tokenIndex640
+					{
+						position647, tokenIndex647 := position, tokenIndex
 						if buffer[position] != rune('x') {
-							goto l646
-						}
-						position++
-						goto l645
-					l646:
-						position, tokenIndex = position645, tokenIndex645
-						if buffer[position] != rune('w') {
-							goto l647
-						}
-						position++
-						goto l645
-					l647:
-						position, tokenIndex = position645, tokenIndex645
-						if buffer[position] != rune('d') {
 							goto l648
 						}
 						position++
-						goto l645
+						goto l647
 					l648:
-						position, tokenIndex = position645, tokenIndex645
-						if buffer[position] != rune('q') {
+						position, tokenIndex = position647, tokenIndex647
+						if buffer[position] != rune('w') {
 							goto l649
 						}
 						position++
-						goto l645
+						goto l647
 					l649:
-						position, tokenIndex = position645, tokenIndex645
-						if buffer[position] != rune('s') {
-							goto l644
-						}
-						position++
-					}
-				l645:
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l644
-					}
-					position++
-					{
-						position650, tokenIndex650 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
+						position, tokenIndex = position647, tokenIndex647
+						if buffer[position] != rune('d') {
 							goto l650
 						}
 						position++
-						goto l651
+						goto l647
 					l650:
-						position, tokenIndex = position650, tokenIndex650
-					}
-				l651:
-					goto l638
-				l644:
-					position, tokenIndex = position638, tokenIndex638
-					{
-						position653, tokenIndex653 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l654
+						position, tokenIndex = position647, tokenIndex647
+						if buffer[position] != rune('q') {
+							goto l651
 						}
 						position++
-						goto l653
-					l654:
-						position, tokenIndex = position653, tokenIndex653
-						if buffer[position] != rune('X') {
+						goto l647
+					l651:
+						position, tokenIndex = position647, tokenIndex647
+						if buffer[position] != rune('s') {
+							goto l646
+						}
+						position++
+					}
+				l647:
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l646
+					}
+					position++
+					{
+						position652, tokenIndex652 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l652
 						}
 						position++
+						goto l653
+					l652:
+						position, tokenIndex = position652, tokenIndex652
 					}
 				l653:
+					goto l640
+				l646:
+					position, tokenIndex = position640, tokenIndex640
 					{
 						position655, tokenIndex655 := position, tokenIndex
-						if buffer[position] != rune('z') {
+						if buffer[position] != rune('x') {
 							goto l656
 						}
 						position++
 						goto l655
 					l656:
 						position, tokenIndex = position655, tokenIndex655
-						if buffer[position] != rune('Z') {
-							goto l652
+						if buffer[position] != rune('X') {
+							goto l654
 						}
 						position++
 					}
 				l655:
 					{
 						position657, tokenIndex657 := position, tokenIndex
-						if buffer[position] != rune('r') {
+						if buffer[position] != rune('z') {
 							goto l658
 						}
 						position++
 						goto l657
 					l658:
 						position, tokenIndex = position657, tokenIndex657
-						if buffer[position] != rune('R') {
-							goto l652
+						if buffer[position] != rune('Z') {
+							goto l654
 						}
 						position++
 					}
 				l657:
-					goto l638
-				l652:
-					position, tokenIndex = position638, tokenIndex638
 					{
-						position660, tokenIndex660 := position, tokenIndex
-						if buffer[position] != rune('w') {
-							goto l661
+						position659, tokenIndex659 := position, tokenIndex
+						if buffer[position] != rune('r') {
+							goto l660
 						}
 						position++
-						goto l660
-					l661:
-						position, tokenIndex = position660, tokenIndex660
-						if buffer[position] != rune('W') {
-							goto l659
+						goto l659
+					l660:
+						position, tokenIndex = position659, tokenIndex659
+						if buffer[position] != rune('R') {
+							goto l654
 						}
 						position++
 					}
-				l660:
+				l659:
+					goto l640
+				l654:
+					position, tokenIndex = position640, tokenIndex640
 					{
 						position662, tokenIndex662 := position, tokenIndex
-						if buffer[position] != rune('z') {
+						if buffer[position] != rune('w') {
 							goto l663
 						}
 						position++
 						goto l662
 					l663:
 						position, tokenIndex = position662, tokenIndex662
-						if buffer[position] != rune('Z') {
-							goto l659
+						if buffer[position] != rune('W') {
+							goto l661
 						}
 						position++
 					}
 				l662:
 					{
 						position664, tokenIndex664 := position, tokenIndex
-						if buffer[position] != rune('r') {
+						if buffer[position] != rune('z') {
 							goto l665
 						}
 						position++
 						goto l664
 					l665:
 						position, tokenIndex = position664, tokenIndex664
-						if buffer[position] != rune('R') {
-							goto l659
+						if buffer[position] != rune('Z') {
+							goto l661
 						}
 						position++
 					}
 				l664:
-					goto l638
-				l659:
-					position, tokenIndex = position638, tokenIndex638
-					if !_rules[ruleARMVectorRegister]() {
-						goto l666
-					}
-					goto l638
-				l666:
-					position, tokenIndex = position638, tokenIndex638
-					if buffer[position] != rune('{') {
-						goto l636
-					}
-					position++
 					{
-						position667, tokenIndex667 := position, tokenIndex
-						if !_rules[ruleWS]() {
+						position666, tokenIndex666 := position, tokenIndex
+						if buffer[position] != rune('r') {
 							goto l667
 						}
-						goto l668
+						position++
+						goto l666
 					l667:
-						position, tokenIndex = position667, tokenIndex667
-					}
-				l668:
-					if !_rules[ruleARMVectorRegister]() {
-						goto l636
-					}
-				l669:
-					{
-						position670, tokenIndex670 := position, tokenIndex
-						if buffer[position] != rune(',') {
-							goto l670
+						position, tokenIndex = position666, tokenIndex666
+						if buffer[position] != rune('R') {
+							goto l661
 						}
 						position++
-						{
-							position671, tokenIndex671 := position, tokenIndex
-							if !_rules[ruleWS]() {
-								goto l671
-							}
-							goto l672
-						l671:
-							position, tokenIndex = position671, tokenIndex671
-						}
-					l672:
-						if !_rules[ruleARMVectorRegister]() {
-							goto l670
-						}
-						goto l669
-					l670:
-						position, tokenIndex = position670, tokenIndex670
 					}
-					{
-						position673, tokenIndex673 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l673
-						}
-						goto l674
-					l673:
-						position, tokenIndex = position673, tokenIndex673
+				l666:
+					goto l640
+				l661:
+					position, tokenIndex = position640, tokenIndex640
+					if !_rules[ruleARMVectorRegister]() {
+						goto l668
 					}
-				l674:
-					if buffer[position] != rune('}') {
-						goto l636
+					goto l640
+				l668:
+					position, tokenIndex = position640, tokenIndex640
+					if buffer[position] != rune('{') {
+						goto l638
 					}
 					position++
 					{
-						position675, tokenIndex675 := position, tokenIndex
-						if buffer[position] != rune('[') {
-							goto l675
+						position669, tokenIndex669 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l669
 						}
-						position++
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l675
+						goto l670
+					l669:
+						position, tokenIndex = position669, tokenIndex669
+					}
+				l670:
+					if !_rules[ruleARMVectorRegister]() {
+						goto l638
+					}
+				l671:
+					{
+						position672, tokenIndex672 := position, tokenIndex
+						if buffer[position] != rune(',') {
+							goto l672
 						}
 						position++
 						{
-							position677, tokenIndex677 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l677
+							position673, tokenIndex673 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l673
 							}
-							position++
-							goto l678
-						l677:
-							position, tokenIndex = position677, tokenIndex677
+							goto l674
+						l673:
+							position, tokenIndex = position673, tokenIndex673
 						}
-					l678:
-						if buffer[position] != rune(']') {
+					l674:
+						if !_rules[ruleARMVectorRegister]() {
+							goto l672
+						}
+						goto l671
+					l672:
+						position, tokenIndex = position672, tokenIndex672
+					}
+					{
+						position675, tokenIndex675 := position, tokenIndex
+						if !_rules[ruleWS]() {
 							goto l675
 						}
-						position++
 						goto l676
 					l675:
 						position, tokenIndex = position675, tokenIndex675
 					}
 				l676:
+					if buffer[position] != rune('}') {
+						goto l638
+					}
+					position++
+					{
+						position677, tokenIndex677 := position, tokenIndex
+						if buffer[position] != rune('[') {
+							goto l677
+						}
+						position++
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l677
+						}
+						position++
+						{
+							position679, tokenIndex679 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l679
+							}
+							position++
+							goto l680
+						l679:
+							position, tokenIndex = position679, tokenIndex679
+						}
+					l680:
+						if buffer[position] != rune(']') {
+							goto l677
+						}
+						position++
+						goto l678
+					l677:
+						position, tokenIndex = position677, tokenIndex677
+					}
+				l678:
 				}
-			l638:
-				add(ruleARMRegister, position637)
+			l640:
+				add(ruleARMRegister, position639)
 			}
 			return true
-		l636:
-			position, tokenIndex = position636, tokenIndex636
+		l638:
+			position, tokenIndex = position638, tokenIndex638
 			return false
 		},
 		/* 42 ARMVectorRegister <- <(('v' / 'V') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */
 		func() bool {
-			position679, tokenIndex679 := position, tokenIndex
+			position681, tokenIndex681 := position, tokenIndex
 			{
-				position680 := position
+				position682 := position
 				{
-					position681, tokenIndex681 := position, tokenIndex
+					position683, tokenIndex683 := position, tokenIndex
 					if buffer[position] != rune('v') {
-						goto l682
+						goto l684
 					}
 					position++
-					goto l681
-				l682:
-					position, tokenIndex = position681, tokenIndex681
+					goto l683
+				l684:
+					position, tokenIndex = position683, tokenIndex683
 					if buffer[position] != rune('V') {
-						goto l679
+						goto l681
 					}
 					position++
 				}
-			l681:
+			l683:
 				if c := buffer[position]; c < rune('0') || c > rune('9') {
-					goto l679
+					goto l681
 				}
 				position++
 				{
-					position683, tokenIndex683 := position, tokenIndex
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l683
-					}
-					position++
-					goto l684
-				l683:
-					position, tokenIndex = position683, tokenIndex683
-				}
-			l684:
-				{
 					position685, tokenIndex685 := position, tokenIndex
-					if buffer[position] != rune('.') {
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
 						goto l685
 					}
 					position++
-				l687:
-					{
-						position688, tokenIndex688 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l688
-						}
-						position++
-						goto l687
-					l688:
-						position, tokenIndex = position688, tokenIndex688
-					}
-					{
-						position689, tokenIndex689 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l690
-						}
-						position++
-						goto l689
-					l690:
-						position, tokenIndex = position689, tokenIndex689
-						if buffer[position] != rune('s') {
-							goto l691
-						}
-						position++
-						goto l689
-					l691:
-						position, tokenIndex = position689, tokenIndex689
-						if buffer[position] != rune('d') {
-							goto l692
-						}
-						position++
-						goto l689
-					l692:
-						position, tokenIndex = position689, tokenIndex689
-						if buffer[position] != rune('h') {
-							goto l693
-						}
-						position++
-						goto l689
-					l693:
-						position, tokenIndex = position689, tokenIndex689
-						if buffer[position] != rune('q') {
-							goto l685
-						}
-						position++
-					}
-				l689:
-					{
-						position694, tokenIndex694 := position, tokenIndex
-						if buffer[position] != rune('[') {
-							goto l694
-						}
-						position++
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l694
-						}
-						position++
-						{
-							position696, tokenIndex696 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l696
-							}
-							position++
-							goto l697
-						l696:
-							position, tokenIndex = position696, tokenIndex696
-						}
-					l697:
-						if buffer[position] != rune(']') {
-							goto l694
-						}
-						position++
-						goto l695
-					l694:
-						position, tokenIndex = position694, tokenIndex694
-					}
-				l695:
 					goto l686
 				l685:
 					position, tokenIndex = position685, tokenIndex685
 				}
 			l686:
-				add(ruleARMVectorRegister, position680)
+				{
+					position687, tokenIndex687 := position, tokenIndex
+					if buffer[position] != rune('.') {
+						goto l687
+					}
+					position++
+				l689:
+					{
+						position690, tokenIndex690 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l690
+						}
+						position++
+						goto l689
+					l690:
+						position, tokenIndex = position690, tokenIndex690
+					}
+					{
+						position691, tokenIndex691 := position, tokenIndex
+						if buffer[position] != rune('b') {
+							goto l692
+						}
+						position++
+						goto l691
+					l692:
+						position, tokenIndex = position691, tokenIndex691
+						if buffer[position] != rune('s') {
+							goto l693
+						}
+						position++
+						goto l691
+					l693:
+						position, tokenIndex = position691, tokenIndex691
+						if buffer[position] != rune('d') {
+							goto l694
+						}
+						position++
+						goto l691
+					l694:
+						position, tokenIndex = position691, tokenIndex691
+						if buffer[position] != rune('h') {
+							goto l695
+						}
+						position++
+						goto l691
+					l695:
+						position, tokenIndex = position691, tokenIndex691
+						if buffer[position] != rune('q') {
+							goto l687
+						}
+						position++
+					}
+				l691:
+					{
+						position696, tokenIndex696 := position, tokenIndex
+						if buffer[position] != rune('[') {
+							goto l696
+						}
+						position++
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l696
+						}
+						position++
+						{
+							position698, tokenIndex698 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l698
+							}
+							position++
+							goto l699
+						l698:
+							position, tokenIndex = position698, tokenIndex698
+						}
+					l699:
+						if buffer[position] != rune(']') {
+							goto l696
+						}
+						position++
+						goto l697
+					l696:
+						position, tokenIndex = position696, tokenIndex696
+					}
+				l697:
+					goto l688
+				l687:
+					position, tokenIndex = position687, tokenIndex687
+				}
+			l688:
+				add(ruleARMVectorRegister, position682)
 			}
 			return true
-		l679:
-			position, tokenIndex = position679, tokenIndex679
+		l681:
+			position, tokenIndex = position681, tokenIndex681
 			return false
 		},
 		/* 43 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */
 		func() bool {
-			position698, tokenIndex698 := position, tokenIndex
+			position700, tokenIndex700 := position, tokenIndex
 			{
-				position699 := position
+				position701 := position
 				{
-					position700, tokenIndex700 := position, tokenIndex
+					position702, tokenIndex702 := position, tokenIndex
 					if !_rules[ruleSymbolRef]() {
-						goto l701
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l701
-					}
-					goto l700
-				l701:
-					position, tokenIndex = position700, tokenIndex700
-					if !_rules[ruleSymbolRef]() {
-						goto l702
-					}
-					goto l700
-				l702:
-					position, tokenIndex = position700, tokenIndex700
-					if !_rules[ruleLow12BitsSymbolRef]() {
 						goto l703
 					}
-					goto l700
-				l703:
-					position, tokenIndex = position700, tokenIndex700
-				l705:
-					{
-						position706, tokenIndex706 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l706
-						}
-						goto l705
-					l706:
-						position, tokenIndex = position706, tokenIndex706
-					}
 					if !_rules[ruleBaseIndexScale]() {
+						goto l703
+					}
+					goto l702
+				l703:
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleSymbolRef]() {
 						goto l704
 					}
-					goto l700
+					goto l702
 				l704:
-					position, tokenIndex = position700, tokenIndex700
-					if !_rules[ruleSegmentRegister]() {
-						goto l707
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleLow12BitsSymbolRef]() {
+						goto l705
 					}
-					if !_rules[ruleOffset]() {
-						goto l707
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l707
-					}
-					goto l700
+					goto l702
+				l705:
+					position, tokenIndex = position702, tokenIndex702
 				l707:
-					position, tokenIndex = position700, tokenIndex700
-					if !_rules[ruleSegmentRegister]() {
-						goto l708
+					{
+						position708, tokenIndex708 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l708
+						}
+						goto l707
+					l708:
+						position, tokenIndex = position708, tokenIndex708
 					}
 					if !_rules[ruleBaseIndexScale]() {
-						goto l708
+						goto l706
 					}
-					goto l700
-				l708:
-					position, tokenIndex = position700, tokenIndex700
+					goto l702
+				l706:
+					position, tokenIndex = position702, tokenIndex702
 					if !_rules[ruleSegmentRegister]() {
 						goto l709
 					}
 					if !_rules[ruleOffset]() {
 						goto l709
 					}
-					goto l700
+					if !_rules[ruleBaseIndexScale]() {
+						goto l709
+					}
+					goto l702
 				l709:
-					position, tokenIndex = position700, tokenIndex700
-					if !_rules[ruleARMBaseIndexScale]() {
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleSegmentRegister]() {
 						goto l710
 					}
-					goto l700
-				l710:
-					position, tokenIndex = position700, tokenIndex700
 					if !_rules[ruleBaseIndexScale]() {
-						goto l698
+						goto l710
+					}
+					goto l702
+				l710:
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleSegmentRegister]() {
+						goto l711
+					}
+					if !_rules[ruleOffset]() {
+						goto l711
+					}
+					goto l702
+				l711:
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleARMBaseIndexScale]() {
+						goto l712
+					}
+					goto l702
+				l712:
+					position, tokenIndex = position702, tokenIndex702
+					if !_rules[ruleBaseIndexScale]() {
+						goto l700
 					}
 				}
-			l700:
-				add(ruleMemoryRef, position699)
+			l702:
+				add(ruleMemoryRef, position701)
 			}
 			return true
-		l698:
-			position, tokenIndex = position698, tokenIndex698
+		l700:
+			position, tokenIndex = position700, tokenIndex700
 			return false
 		},
 		/* 44 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
 		func() bool {
-			position711, tokenIndex711 := position, tokenIndex
+			position713, tokenIndex713 := position, tokenIndex
 			{
-				position712 := position
+				position714 := position
 				{
-					position713, tokenIndex713 := position, tokenIndex
-				l715:
+					position715, tokenIndex715 := position, tokenIndex
+				l717:
 					{
-						position716, tokenIndex716 := position, tokenIndex
+						position718, tokenIndex718 := position, tokenIndex
 						if !_rules[ruleOffset]() {
-							goto l716
+							goto l718
 						}
-						goto l715
-					l716:
-						position, tokenIndex = position716, tokenIndex716
+						goto l717
+					l718:
+						position, tokenIndex = position718, tokenIndex718
 					}
 					if buffer[position] != rune('+') {
-						goto l713
+						goto l715
 					}
 					position++
-					goto l714
-				l713:
-					position, tokenIndex = position713, tokenIndex713
+					goto l716
+				l715:
+					position, tokenIndex = position715, tokenIndex715
 				}
-			l714:
+			l716:
 				{
-					position717, tokenIndex717 := position, tokenIndex
+					position719, tokenIndex719 := position, tokenIndex
 					if !_rules[ruleLocalSymbol]() {
-						goto l718
-					}
-					goto l717
-				l718:
-					position, tokenIndex = position717, tokenIndex717
-					if !_rules[ruleSymbolName]() {
-						goto l711
-					}
-				}
-			l717:
-			l719:
-				{
-					position720, tokenIndex720 := position, tokenIndex
-					if !_rules[ruleOffset]() {
 						goto l720
 					}
 					goto l719
 				l720:
-					position, tokenIndex = position720, tokenIndex720
+					position, tokenIndex = position719, tokenIndex719
+					if !_rules[ruleSymbolName]() {
+						goto l713
+					}
+				}
+			l719:
+			l721:
+				{
+					position722, tokenIndex722 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l722
+					}
+					goto l721
+				l722:
+					position, tokenIndex = position722, tokenIndex722
 				}
 				{
-					position721, tokenIndex721 := position, tokenIndex
+					position723, tokenIndex723 := position, tokenIndex
 					if buffer[position] != rune('@') {
-						goto l721
+						goto l723
 					}
 					position++
 					if !_rules[ruleSection]() {
-						goto l721
-					}
-				l723:
-					{
-						position724, tokenIndex724 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l724
-						}
 						goto l723
-					l724:
-						position, tokenIndex = position724, tokenIndex724
 					}
-					goto l722
-				l721:
-					position, tokenIndex = position721, tokenIndex721
+				l725:
+					{
+						position726, tokenIndex726 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l726
+						}
+						goto l725
+					l726:
+						position, tokenIndex = position726, tokenIndex726
+					}
+					goto l724
+				l723:
+					position, tokenIndex = position723, tokenIndex723
 				}
-			l722:
-				add(ruleSymbolRef, position712)
+			l724:
+				add(ruleSymbolRef, position714)
 			}
 			return true
-		l711:
-			position, tokenIndex = position711, tokenIndex711
+		l713:
+			position, tokenIndex = position713, tokenIndex713
 			return false
 		},
 		/* 45 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */
 		func() bool {
-			position725, tokenIndex725 := position, tokenIndex
+			position727, tokenIndex727 := position, tokenIndex
 			{
-				position726 := position
+				position728 := position
 				if buffer[position] != rune(':') {
-					goto l725
+					goto l727
 				}
 				position++
 				{
-					position727, tokenIndex727 := position, tokenIndex
-					if buffer[position] != rune('l') {
-						goto l728
-					}
-					position++
-					goto l727
-				l728:
-					position, tokenIndex = position727, tokenIndex727
-					if buffer[position] != rune('L') {
-						goto l725
-					}
-					position++
-				}
-			l727:
-				{
 					position729, tokenIndex729 := position, tokenIndex
-					if buffer[position] != rune('o') {
+					if buffer[position] != rune('l') {
 						goto l730
 					}
 					position++
 					goto l729
 				l730:
 					position, tokenIndex = position729, tokenIndex729
-					if buffer[position] != rune('O') {
-						goto l725
+					if buffer[position] != rune('L') {
+						goto l727
 					}
 					position++
 				}
 			l729:
-				if buffer[position] != rune('1') {
-					goto l725
-				}
-				position++
-				if buffer[position] != rune('2') {
-					goto l725
-				}
-				position++
-				if buffer[position] != rune(':') {
-					goto l725
-				}
-				position++
 				{
 					position731, tokenIndex731 := position, tokenIndex
-					if !_rules[ruleLocalSymbol]() {
+					if buffer[position] != rune('o') {
 						goto l732
 					}
+					position++
 					goto l731
 				l732:
 					position, tokenIndex = position731, tokenIndex731
-					if !_rules[ruleSymbolName]() {
-						goto l725
+					if buffer[position] != rune('O') {
+						goto l727
 					}
+					position++
 				}
 			l731:
+				if buffer[position] != rune('1') {
+					goto l727
+				}
+				position++
+				if buffer[position] != rune('2') {
+					goto l727
+				}
+				position++
+				if buffer[position] != rune(':') {
+					goto l727
+				}
+				position++
 				{
 					position733, tokenIndex733 := position, tokenIndex
-					if !_rules[ruleOffset]() {
-						goto l733
+					if !_rules[ruleLocalSymbol]() {
+						goto l734
 					}
-					goto l734
-				l733:
+					goto l733
+				l734:
 					position, tokenIndex = position733, tokenIndex733
+					if !_rules[ruleSymbolName]() {
+						goto l727
+					}
 				}
-			l734:
-				add(ruleLow12BitsSymbolRef, position726)
+			l733:
+				{
+					position735, tokenIndex735 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l735
+					}
+					goto l736
+				l735:
+					position, tokenIndex = position735, tokenIndex735
+				}
+			l736:
+				add(ruleLow12BitsSymbolRef, position728)
 			}
 			return true
-		l725:
-			position, tokenIndex = position725, tokenIndex725
+		l727:
+			position, tokenIndex = position727, tokenIndex727
 			return false
 		},
-		/* 46 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset ('*' [0-9]+)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
+		/* 46 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
 		func() bool {
-			position735, tokenIndex735 := position, tokenIndex
+			position737, tokenIndex737 := position, tokenIndex
 			{
-				position736 := position
+				position738 := position
 				if buffer[position] != rune('[') {
-					goto l735
+					goto l737
 				}
 				position++
 				if !_rules[ruleARMRegister]() {
-					goto l735
+					goto l737
 				}
 				{
-					position737, tokenIndex737 := position, tokenIndex
+					position739, tokenIndex739 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l737
+						goto l739
 					}
 					position++
 					{
-						position739, tokenIndex739 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l739
-						}
-						goto l740
-					l739:
-						position, tokenIndex = position739, tokenIndex739
-					}
-				l740:
-					{
 						position741, tokenIndex741 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l741
+						}
+						goto l742
+					l741:
+						position, tokenIndex = position741, tokenIndex741
+					}
+				l742:
+					{
+						position743, tokenIndex743 := position, tokenIndex
 						if buffer[position] != rune('#') {
-							goto l742
+							goto l744
 						}
 						position++
 						if !_rules[ruleOffset]() {
-							goto l742
+							goto l744
 						}
 						{
-							position743, tokenIndex743 := position, tokenIndex
-							if buffer[position] != rune('*') {
-								goto l743
-							}
-							position++
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l743
-							}
-							position++
-						l745:
+							position745, tokenIndex745 := position, tokenIndex
 							{
-								position746, tokenIndex746 := position, tokenIndex
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l746
+								position747, tokenIndex747 := position, tokenIndex
+								if buffer[position] != rune('*') {
+									goto l748
 								}
 								position++
-								goto l745
-							l746:
-								position, tokenIndex = position746, tokenIndex746
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l748
+								}
+								position++
+							l749:
+								{
+									position750, tokenIndex750 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l750
+									}
+									position++
+									goto l749
+								l750:
+									position, tokenIndex = position750, tokenIndex750
+								}
+								goto l747
+							l748:
+								position, tokenIndex = position747, tokenIndex747
+								if buffer[position] != rune('*') {
+									goto l751
+								}
+								position++
+								if buffer[position] != rune('(') {
+									goto l751
+								}
+								position++
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l751
+								}
+								position++
+							l752:
+								{
+									position753, tokenIndex753 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l753
+									}
+									position++
+									goto l752
+								l753:
+									position, tokenIndex = position753, tokenIndex753
+								}
+								if !_rules[ruleOperator]() {
+									goto l751
+								}
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l751
+								}
+								position++
+							l754:
+								{
+									position755, tokenIndex755 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l755
+									}
+									position++
+									goto l754
+								l755:
+									position, tokenIndex = position755, tokenIndex755
+								}
+								if buffer[position] != rune(')') {
+									goto l751
+								}
+								position++
+								goto l747
+							l751:
+								position, tokenIndex = position747, tokenIndex747
+							l756:
+								{
+									position757, tokenIndex757 := position, tokenIndex
+									if buffer[position] != rune('+') {
+										goto l757
+									}
+									position++
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l757
+									}
+									position++
+								l758:
+									{
+										position759, tokenIndex759 := position, tokenIndex
+										if c := buffer[position]; c < rune('0') || c > rune('9') {
+											goto l759
+										}
+										position++
+										goto l758
+									l759:
+										position, tokenIndex = position759, tokenIndex759
+									}
+									goto l756
+								l757:
+									position, tokenIndex = position757, tokenIndex757
+								}
 							}
-							goto l744
-						l743:
-							position, tokenIndex = position743, tokenIndex743
+						l747:
+							goto l746
+
+							position, tokenIndex = position745, tokenIndex745
 						}
+					l746:
+						goto l743
 					l744:
-						goto l741
-					l742:
-						position, tokenIndex = position741, tokenIndex741
+						position, tokenIndex = position743, tokenIndex743
 						if !_rules[ruleARMGOTLow12]() {
-							goto l747
+							goto l760
 						}
-						goto l741
-					l747:
-						position, tokenIndex = position741, tokenIndex741
+						goto l743
+					l760:
+						position, tokenIndex = position743, tokenIndex743
 						if !_rules[ruleLow12BitsSymbolRef]() {
-							goto l748
+							goto l761
 						}
-						goto l741
-					l748:
-						position, tokenIndex = position741, tokenIndex741
+						goto l743
+					l761:
+						position, tokenIndex = position743, tokenIndex743
 						if !_rules[ruleARMRegister]() {
-							goto l737
+							goto l739
 						}
 					}
-				l741:
+				l743:
 					{
-						position749, tokenIndex749 := position, tokenIndex
+						position762, tokenIndex762 := position, tokenIndex
 						if buffer[position] != rune(',') {
-							goto l749
+							goto l762
 						}
 						position++
 						{
-							position751, tokenIndex751 := position, tokenIndex
+							position764, tokenIndex764 := position, tokenIndex
 							if !_rules[ruleWS]() {
-								goto l751
+								goto l764
 							}
-							goto l752
-						l751:
-							position, tokenIndex = position751, tokenIndex751
+							goto l765
+						l764:
+							position, tokenIndex = position764, tokenIndex764
 						}
-					l752:
+					l765:
 						if !_rules[ruleARMConstantTweak]() {
-							goto l749
+							goto l762
 						}
-						goto l750
-					l749:
-						position, tokenIndex = position749, tokenIndex749
+						goto l763
+					l762:
+						position, tokenIndex = position762, tokenIndex762
 					}
-				l750:
-					goto l738
-				l737:
-					position, tokenIndex = position737, tokenIndex737
+				l763:
+					goto l740
+				l739:
+					position, tokenIndex = position739, tokenIndex739
 				}
-			l738:
+			l740:
 				if buffer[position] != rune(']') {
-					goto l735
+					goto l737
 				}
 				position++
 				{
-					position753, tokenIndex753 := position, tokenIndex
+					position766, tokenIndex766 := position, tokenIndex
 					if !_rules[ruleARMPostincrement]() {
-						goto l753
+						goto l766
 					}
-					goto l754
-				l753:
-					position, tokenIndex = position753, tokenIndex753
+					goto l767
+				l766:
+					position, tokenIndex = position766, tokenIndex766
 				}
-			l754:
-				add(ruleARMBaseIndexScale, position736)
+			l767:
+				add(ruleARMBaseIndexScale, position738)
 			}
 			return true
-		l735:
-			position, tokenIndex = position735, tokenIndex735
+		l737:
+			position, tokenIndex = position737, tokenIndex737
 			return false
 		},
 		/* 47 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */
 		func() bool {
-			position755, tokenIndex755 := position, tokenIndex
+			position768, tokenIndex768 := position, tokenIndex
 			{
-				position756 := position
+				position769 := position
 				if buffer[position] != rune(':') {
-					goto l755
+					goto l768
 				}
 				position++
 				{
-					position757, tokenIndex757 := position, tokenIndex
+					position770, tokenIndex770 := position, tokenIndex
 					if buffer[position] != rune('g') {
-						goto l758
+						goto l771
 					}
 					position++
-					goto l757
-				l758:
-					position, tokenIndex = position757, tokenIndex757
+					goto l770
+				l771:
+					position, tokenIndex = position770, tokenIndex770
 					if buffer[position] != rune('G') {
-						goto l755
+						goto l768
 					}
 					position++
 				}
-			l757:
+			l770:
 				{
-					position759, tokenIndex759 := position, tokenIndex
+					position772, tokenIndex772 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l760
+						goto l773
 					}
 					position++
-					goto l759
-				l760:
-					position, tokenIndex = position759, tokenIndex759
+					goto l772
+				l773:
+					position, tokenIndex = position772, tokenIndex772
 					if buffer[position] != rune('O') {
-						goto l755
+						goto l768
 					}
 					position++
 				}
-			l759:
+			l772:
 				{
-					position761, tokenIndex761 := position, tokenIndex
+					position774, tokenIndex774 := position, tokenIndex
 					if buffer[position] != rune('t') {
-						goto l762
+						goto l775
 					}
 					position++
-					goto l761
-				l762:
-					position, tokenIndex = position761, tokenIndex761
+					goto l774
+				l775:
+					position, tokenIndex = position774, tokenIndex774
 					if buffer[position] != rune('T') {
-						goto l755
+						goto l768
 					}
 					position++
 				}
-			l761:
+			l774:
 				if buffer[position] != rune('_') {
-					goto l755
+					goto l768
 				}
 				position++
 				{
-					position763, tokenIndex763 := position, tokenIndex
+					position776, tokenIndex776 := position, tokenIndex
 					if buffer[position] != rune('l') {
-						goto l764
+						goto l777
 					}
 					position++
-					goto l763
-				l764:
-					position, tokenIndex = position763, tokenIndex763
+					goto l776
+				l777:
+					position, tokenIndex = position776, tokenIndex776
 					if buffer[position] != rune('L') {
-						goto l755
+						goto l768
 					}
 					position++
 				}
-			l763:
+			l776:
 				{
-					position765, tokenIndex765 := position, tokenIndex
+					position778, tokenIndex778 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l766
+						goto l779
 					}
 					position++
-					goto l765
-				l766:
-					position, tokenIndex = position765, tokenIndex765
+					goto l778
+				l779:
+					position, tokenIndex = position778, tokenIndex778
 					if buffer[position] != rune('O') {
-						goto l755
+						goto l768
 					}
 					position++
 				}
-			l765:
+			l778:
 				if buffer[position] != rune('1') {
-					goto l755
+					goto l768
 				}
 				position++
 				if buffer[position] != rune('2') {
-					goto l755
+					goto l768
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l755
+					goto l768
 				}
 				position++
 				if !_rules[ruleSymbolName]() {
-					goto l755
+					goto l768
 				}
-				add(ruleARMGOTLow12, position756)
+				add(ruleARMGOTLow12, position769)
 			}
 			return true
-		l755:
-			position, tokenIndex = position755, tokenIndex755
+		l768:
+			position, tokenIndex = position768, tokenIndex768
 			return false
 		},
 		/* 48 ARMPostincrement <- <'!'> */
 		func() bool {
-			position767, tokenIndex767 := position, tokenIndex
+			position780, tokenIndex780 := position, tokenIndex
 			{
-				position768 := position
+				position781 := position
 				if buffer[position] != rune('!') {
-					goto l767
+					goto l780
 				}
 				position++
-				add(ruleARMPostincrement, position768)
+				add(ruleARMPostincrement, position781)
 			}
 			return true
-		l767:
-			position, tokenIndex = position767, tokenIndex767
+		l780:
+			position, tokenIndex = position780, tokenIndex780
 			return false
 		},
 		/* 49 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
 		func() bool {
-			position769, tokenIndex769 := position, tokenIndex
+			position782, tokenIndex782 := position, tokenIndex
 			{
-				position770 := position
+				position783 := position
 				if buffer[position] != rune('(') {
-					goto l769
+					goto l782
 				}
 				position++
 				{
-					position771, tokenIndex771 := position, tokenIndex
+					position784, tokenIndex784 := position, tokenIndex
 					if !_rules[ruleRegisterOrConstant]() {
-						goto l771
+						goto l784
 					}
-					goto l772
-				l771:
-					position, tokenIndex = position771, tokenIndex771
+					goto l785
+				l784:
+					position, tokenIndex = position784, tokenIndex784
 				}
-			l772:
+			l785:
 				{
-					position773, tokenIndex773 := position, tokenIndex
+					position786, tokenIndex786 := position, tokenIndex
 					if !_rules[ruleWS]() {
-						goto l773
+						goto l786
 					}
-					goto l774
-				l773:
-					position, tokenIndex = position773, tokenIndex773
+					goto l787
+				l786:
+					position, tokenIndex = position786, tokenIndex786
 				}
-			l774:
+			l787:
 				{
-					position775, tokenIndex775 := position, tokenIndex
+					position788, tokenIndex788 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l775
+						goto l788
 					}
 					position++
 					{
-						position777, tokenIndex777 := position, tokenIndex
+						position790, tokenIndex790 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l777
+							goto l790
 						}
-						goto l778
-					l777:
-						position, tokenIndex = position777, tokenIndex777
+						goto l791
+					l790:
+						position, tokenIndex = position790, tokenIndex790
 					}
-				l778:
+				l791:
 					if !_rules[ruleRegisterOrConstant]() {
-						goto l775
+						goto l788
 					}
 					{
-						position779, tokenIndex779 := position, tokenIndex
+						position792, tokenIndex792 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l779
+							goto l792
 						}
-						goto l780
-					l779:
-						position, tokenIndex = position779, tokenIndex779
+						goto l793
+					l792:
+						position, tokenIndex = position792, tokenIndex792
 					}
-				l780:
+				l793:
 					{
-						position781, tokenIndex781 := position, tokenIndex
+						position794, tokenIndex794 := position, tokenIndex
 						if buffer[position] != rune(',') {
-							goto l781
+							goto l794
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l781
+							goto l794
 						}
 						position++
-					l783:
+					l796:
 						{
-							position784, tokenIndex784 := position, tokenIndex
+							position797, tokenIndex797 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l784
+								goto l797
 							}
 							position++
-							goto l783
-						l784:
-							position, tokenIndex = position784, tokenIndex784
+							goto l796
+						l797:
+							position, tokenIndex = position797, tokenIndex797
 						}
-						goto l782
-					l781:
-						position, tokenIndex = position781, tokenIndex781
+						goto l795
+					l794:
+						position, tokenIndex = position794, tokenIndex794
 					}
-				l782:
-					goto l776
-				l775:
-					position, tokenIndex = position775, tokenIndex775
+				l795:
+					goto l789
+				l788:
+					position, tokenIndex = position788, tokenIndex788
 				}
-			l776:
+			l789:
 				if buffer[position] != rune(')') {
-					goto l769
+					goto l782
 				}
 				position++
-				add(ruleBaseIndexScale, position770)
+				add(ruleBaseIndexScale, position783)
 			}
 			return true
-		l769:
-			position, tokenIndex = position769, tokenIndex769
+		l782:
+			position, tokenIndex = position782, tokenIndex782
 			return false
 		},
 		/* 50 Operator <- <('+' / '-')> */
 		func() bool {
-			position785, tokenIndex785 := position, tokenIndex
+			position798, tokenIndex798 := position, tokenIndex
 			{
-				position786 := position
+				position799 := position
 				{
-					position787, tokenIndex787 := position, tokenIndex
+					position800, tokenIndex800 := position, tokenIndex
 					if buffer[position] != rune('+') {
-						goto l788
+						goto l801
 					}
 					position++
-					goto l787
-				l788:
-					position, tokenIndex = position787, tokenIndex787
+					goto l800
+				l801:
+					position, tokenIndex = position800, tokenIndex800
 					if buffer[position] != rune('-') {
-						goto l785
+						goto l798
 					}
 					position++
 				}
-			l787:
-				add(ruleOperator, position786)
+			l800:
+				add(ruleOperator, position799)
 			}
 			return true
-		l785:
-			position, tokenIndex = position785, tokenIndex785
+		l798:
+			position, tokenIndex = position798, tokenIndex798
 			return false
 		},
 		/* 51 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
 		func() bool {
-			position789, tokenIndex789 := position, tokenIndex
+			position802, tokenIndex802 := position, tokenIndex
 			{
-				position790 := position
+				position803 := position
 				{
-					position791, tokenIndex791 := position, tokenIndex
+					position804, tokenIndex804 := position, tokenIndex
 					if buffer[position] != rune('+') {
-						goto l791
+						goto l804
 					}
 					position++
-					goto l792
-				l791:
-					position, tokenIndex = position791, tokenIndex791
+					goto l805
+				l804:
+					position, tokenIndex = position804, tokenIndex804
 				}
-			l792:
+			l805:
 				{
-					position793, tokenIndex793 := position, tokenIndex
+					position806, tokenIndex806 := position, tokenIndex
 					if buffer[position] != rune('-') {
-						goto l793
-					}
-					position++
-					goto l794
-				l793:
-					position, tokenIndex = position793, tokenIndex793
-				}
-			l794:
-				{
-					position795, tokenIndex795 := position, tokenIndex
-					if buffer[position] != rune('0') {
-						goto l796
-					}
-					position++
-					{
-						position797, tokenIndex797 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l798
-						}
-						position++
-						goto l797
-					l798:
-						position, tokenIndex = position797, tokenIndex797
-						if buffer[position] != rune('B') {
-							goto l796
-						}
-						position++
-					}
-				l797:
-					{
-						position801, tokenIndex801 := position, tokenIndex
-						if buffer[position] != rune('0') {
-							goto l802
-						}
-						position++
-						goto l801
-					l802:
-						position, tokenIndex = position801, tokenIndex801
-						if buffer[position] != rune('1') {
-							goto l796
-						}
-						position++
-					}
-				l801:
-				l799:
-					{
-						position800, tokenIndex800 := position, tokenIndex
-						{
-							position803, tokenIndex803 := position, tokenIndex
-							if buffer[position] != rune('0') {
-								goto l804
-							}
-							position++
-							goto l803
-						l804:
-							position, tokenIndex = position803, tokenIndex803
-							if buffer[position] != rune('1') {
-								goto l800
-							}
-							position++
-						}
-					l803:
-						goto l799
-					l800:
-						position, tokenIndex = position800, tokenIndex800
-					}
-					goto l795
-				l796:
-					position, tokenIndex = position795, tokenIndex795
-					if buffer[position] != rune('0') {
-						goto l805
-					}
-					position++
-					{
-						position806, tokenIndex806 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l807
-						}
-						position++
 						goto l806
-					l807:
-						position, tokenIndex = position806, tokenIndex806
-						if buffer[position] != rune('X') {
-							goto l805
-						}
-						position++
 					}
+					position++
+					goto l807
 				l806:
+					position, tokenIndex = position806, tokenIndex806
+				}
+			l807:
+				{
+					position808, tokenIndex808 := position, tokenIndex
+					if buffer[position] != rune('0') {
+						goto l809
+					}
+					position++
 					{
 						position810, tokenIndex810 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
+						if buffer[position] != rune('b') {
 							goto l811
 						}
 						position++
 						goto l810
 					l811:
 						position, tokenIndex = position810, tokenIndex810
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l812
+						if buffer[position] != rune('B') {
+							goto l809
 						}
 						position++
-						goto l810
-					l812:
-						position, tokenIndex = position810, tokenIndex810
-						{
-							position813, tokenIndex813 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('f') {
-								goto l814
-							}
-							position++
-							goto l813
-						l814:
-							position, tokenIndex = position813, tokenIndex813
-							if c := buffer[position]; c < rune('A') || c > rune('F') {
-								goto l805
-							}
-							position++
-						}
-					l813:
 					}
 				l810:
-				l808:
 					{
-						position809, tokenIndex809 := position, tokenIndex
-						{
-							position815, tokenIndex815 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l816
-							}
-							position++
+						position814, tokenIndex814 := position, tokenIndex
+						if buffer[position] != rune('0') {
 							goto l815
-						l816:
-							position, tokenIndex = position815, tokenIndex815
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
+						}
+						position++
+						goto l814
+					l815:
+						position, tokenIndex = position814, tokenIndex814
+						if buffer[position] != rune('1') {
+							goto l809
+						}
+						position++
+					}
+				l814:
+				l812:
+					{
+						position813, tokenIndex813 := position, tokenIndex
+						{
+							position816, tokenIndex816 := position, tokenIndex
+							if buffer[position] != rune('0') {
 								goto l817
 							}
 							position++
-							goto l815
+							goto l816
 						l817:
-							position, tokenIndex = position815, tokenIndex815
+							position, tokenIndex = position816, tokenIndex816
+							if buffer[position] != rune('1') {
+								goto l813
+							}
+							position++
+						}
+					l816:
+						goto l812
+					l813:
+						position, tokenIndex = position813, tokenIndex813
+					}
+					goto l808
+				l809:
+					position, tokenIndex = position808, tokenIndex808
+					if buffer[position] != rune('0') {
+						goto l818
+					}
+					position++
+					{
+						position819, tokenIndex819 := position, tokenIndex
+						if buffer[position] != rune('x') {
+							goto l820
+						}
+						position++
+						goto l819
+					l820:
+						position, tokenIndex = position819, tokenIndex819
+						if buffer[position] != rune('X') {
+							goto l818
+						}
+						position++
+					}
+				l819:
+					{
+						position823, tokenIndex823 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l824
+						}
+						position++
+						goto l823
+					l824:
+						position, tokenIndex = position823, tokenIndex823
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l825
+						}
+						position++
+						goto l823
+					l825:
+						position, tokenIndex = position823, tokenIndex823
+						{
+							position826, tokenIndex826 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('f') {
+								goto l827
+							}
+							position++
+							goto l826
+						l827:
+							position, tokenIndex = position826, tokenIndex826
+							if c := buffer[position]; c < rune('A') || c > rune('F') {
+								goto l818
+							}
+							position++
+						}
+					l826:
+					}
+				l823:
+				l821:
+					{
+						position822, tokenIndex822 := position, tokenIndex
+						{
+							position828, tokenIndex828 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l829
+							}
+							position++
+							goto l828
+						l829:
+							position, tokenIndex = position828, tokenIndex828
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l830
+							}
+							position++
+							goto l828
+						l830:
+							position, tokenIndex = position828, tokenIndex828
 							{
-								position818, tokenIndex818 := position, tokenIndex
+								position831, tokenIndex831 := position, tokenIndex
 								if c := buffer[position]; c < rune('a') || c > rune('f') {
-									goto l819
+									goto l832
 								}
 								position++
-								goto l818
-							l819:
-								position, tokenIndex = position818, tokenIndex818
+								goto l831
+							l832:
+								position, tokenIndex = position831, tokenIndex831
 								if c := buffer[position]; c < rune('A') || c > rune('F') {
-									goto l809
+									goto l822
 								}
 								position++
 							}
-						l818:
+						l831:
 						}
-					l815:
-						goto l808
-					l809:
-						position, tokenIndex = position809, tokenIndex809
+					l828:
+						goto l821
+					l822:
+						position, tokenIndex = position822, tokenIndex822
 					}
-					goto l795
-				l805:
-					position, tokenIndex = position795, tokenIndex795
+					goto l808
+				l818:
+					position, tokenIndex = position808, tokenIndex808
 					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l789
+						goto l802
 					}
 					position++
-				l820:
+				l833:
 					{
-						position821, tokenIndex821 := position, tokenIndex
+						position834, tokenIndex834 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l821
+							goto l834
 						}
 						position++
-						goto l820
-					l821:
-						position, tokenIndex = position821, tokenIndex821
+						goto l833
+					l834:
+						position, tokenIndex = position834, tokenIndex834
 					}
 				}
-			l795:
-				add(ruleOffset, position790)
+			l808:
+				add(ruleOffset, position803)
 			}
 			return true
-		l789:
-			position, tokenIndex = position789, tokenIndex789
+		l802:
+			position, tokenIndex = position802, tokenIndex802
 			return false
 		},
 		/* 52 Section <- <([a-z] / [A-Z] / '@')+> */
 		func() bool {
-			position822, tokenIndex822 := position, tokenIndex
+			position835, tokenIndex835 := position, tokenIndex
 			{
-				position823 := position
+				position836 := position
 				{
-					position826, tokenIndex826 := position, tokenIndex
+					position839, tokenIndex839 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l827
+						goto l840
 					}
 					position++
-					goto l826
-				l827:
-					position, tokenIndex = position826, tokenIndex826
+					goto l839
+				l840:
+					position, tokenIndex = position839, tokenIndex839
 					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l828
+						goto l841
 					}
 					position++
-					goto l826
-				l828:
-					position, tokenIndex = position826, tokenIndex826
+					goto l839
+				l841:
+					position, tokenIndex = position839, tokenIndex839
 					if buffer[position] != rune('@') {
-						goto l822
+						goto l835
 					}
 					position++
 				}
-			l826:
-			l824:
+			l839:
+			l837:
 				{
-					position825, tokenIndex825 := position, tokenIndex
+					position838, tokenIndex838 := position, tokenIndex
 					{
-						position829, tokenIndex829 := position, tokenIndex
+						position842, tokenIndex842 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l830
+							goto l843
 						}
 						position++
-						goto l829
-					l830:
-						position, tokenIndex = position829, tokenIndex829
+						goto l842
+					l843:
+						position, tokenIndex = position842, tokenIndex842
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l831
+							goto l844
 						}
 						position++
-						goto l829
-					l831:
-						position, tokenIndex = position829, tokenIndex829
+						goto l842
+					l844:
+						position, tokenIndex = position842, tokenIndex842
 						if buffer[position] != rune('@') {
-							goto l825
+							goto l838
 						}
 						position++
 					}
-				l829:
-					goto l824
-				l825:
-					position, tokenIndex = position825, tokenIndex825
+				l842:
+					goto l837
+				l838:
+					position, tokenIndex = position838, tokenIndex838
 				}
-				add(ruleSection, position823)
+				add(ruleSection, position836)
 			}
 			return true
-		l822:
-			position, tokenIndex = position822, tokenIndex822
+		l835:
+			position, tokenIndex = position835, tokenIndex835
 			return false
 		},
 		/* 53 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
 		func() bool {
-			position832, tokenIndex832 := position, tokenIndex
+			position845, tokenIndex845 := position, tokenIndex
 			{
-				position833 := position
+				position846 := position
 				if buffer[position] != rune('%') {
-					goto l832
+					goto l845
 				}
 				position++
 				{
-					position834, tokenIndex834 := position, tokenIndex
+					position847, tokenIndex847 := position, tokenIndex
 					if c := buffer[position]; c < rune('c') || c > rune('g') {
-						goto l835
+						goto l848
 					}
 					position++
-					goto l834
-				l835:
-					position, tokenIndex = position834, tokenIndex834
+					goto l847
+				l848:
+					position, tokenIndex = position847, tokenIndex847
 					if buffer[position] != rune('s') {
-						goto l832
+						goto l845
 					}
 					position++
 				}
-			l834:
+			l847:
 				if buffer[position] != rune('s') {
-					goto l832
+					goto l845
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l832
+					goto l845
 				}
 				position++
-				add(ruleSegmentRegister, position833)
+				add(ruleSegmentRegister, position846)
 			}
 			return true
-		l832:
-			position, tokenIndex = position832, tokenIndex832
+		l845:
+			position, tokenIndex = position845, tokenIndex845
 			return false
 		},
 	}
 	p.rules = _rules
+	return nil
 }
diff --git a/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s b/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s
index 12b408d..96eb778 100644
--- a/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s
+++ b/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s
@@ -145,7 +145,7 @@
 .cfi_endproc
 .size .LOPENSSL_armcap_P_addr, .-.LOPENSSL_armcap_P_addr
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -179,35 +179,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/generic-FileDirectives/out.s b/src/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
index bb33e52..84b5134 100644
--- a/src/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
+++ b/src/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
@@ -23,7 +23,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -57,35 +57,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s b/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s
index 304f697..d75e2c7 100644
--- a/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s
+++ b/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s
@@ -26,7 +26,7 @@
 .LBORINGSSL_external_toc:
 .quad .TOC.-.LBORINGSSL_external_toc
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -60,35 +60,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s b/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s
index 5fdbeb8..dad7603 100644
--- a/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s
+++ b/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s
@@ -36,7 +36,7 @@
 .LBORINGSSL_external_toc:
 .quad .TOC.-.LBORINGSSL_external_toc
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -70,35 +70,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s b/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s
index e3d682e..798bcf5 100644
--- a/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s
+++ b/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s
@@ -516,7 +516,7 @@
 .LBORINGSSL_external_toc:
 .quad .TOC.-.LBORINGSSL_external_toc
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -550,35 +550,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s b/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s
index 54cbd6f..6439740 100644
--- a/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s
+++ b/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s
@@ -641,7 +641,7 @@
 .LBORINGSSL_external_toc:
 .quad .TOC.-.LBORINGSSL_external_toc
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -675,35 +675,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s b/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s
index 2fff0ef..fc55ef2 100644
--- a/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s
+++ b/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s
@@ -142,7 +142,7 @@
 .LBORINGSSL_external_toc:
 .quad .TOC.-.LBORINGSSL_external_toc
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -176,35 +176,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-BSS/out.s b/src/util/fipstools/delocate/testdata/x86_64-BSS/out.s
index e8cd56e..2bb54a8 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-BSS/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-BSS/out.s
@@ -77,7 +77,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -111,35 +111,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-Basic/in.s b/src/util/fipstools/delocate/testdata/x86_64-Basic/in.s
index c54756b..7e48e27 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-Basic/in.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-Basic/in.s
@@ -47,3 +47,4 @@
 .L4: .L5:	movq %rbx, %rax # This is also legal.
 .size	foo, .-foo
 .type	foo, @function
+.uleb128 .foo-1-.bar
diff --git a/src/util/fipstools/delocate/testdata/x86_64-Basic/out.s b/src/util/fipstools/delocate/testdata/x86_64-Basic/out.s
index 23e97c8..657d090 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-Basic/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-Basic/out.s
@@ -55,6 +55,7 @@
 	movq %rbx, %rax # This is also legal.
 .size	foo, .-foo
 .type	foo, @function
+.uleb128 .foo-1-.bar
 .text
 .loc 2 2 0
 BORINGSSL_bcm_text_end:
@@ -70,7 +71,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -104,35 +105,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s b/src/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
index 467db65..f118e4f 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
@@ -303,7 +303,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -337,35 +337,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s b/src/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
index feb9a43..6549db7 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
@@ -113,7 +113,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -147,35 +147,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s b/src/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
index d4534f8..091e8b7 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
@@ -59,7 +59,7 @@
 .Lboringssl_gotoff__Z1gv:
 	.quad _Z1gv@GOTOFF
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -93,35 +93,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-Sections/out.s b/src/util/fipstools/delocate/testdata/x86_64-Sections/out.s
index ab3e3d9..1112387 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-Sections/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-Sections/out.s
@@ -59,7 +59,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -93,35 +93,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s b/src/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
index 7ad8f76..7a57ed4 100644
--- a/src/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
+++ b/src/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
@@ -46,7 +46,7 @@
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
 .type BORINGSSL_bcm_text_hash, @object
-.size BORINGSSL_bcm_text_hash, 64
+.size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
 .byte 0xae
 .byte 0x2c
@@ -80,35 +80,3 @@
 .byte 0xff
 .byte 0x31
 .byte 0x80
-.byte 0xa2
-.byte 0xd4
-.byte 0xc3
-.byte 0x66
-.byte 0xf
-.byte 0xc2
-.byte 0x6a
-.byte 0x7b
-.byte 0xf4
-.byte 0xbe
-.byte 0x39
-.byte 0xa2
-.byte 0xd7
-.byte 0x25
-.byte 0xdb
-.byte 0x21
-.byte 0x98
-.byte 0xe9
-.byte 0xd5
-.byte 0x53
-.byte 0xbf
-.byte 0x5c
-.byte 0x32
-.byte 0x6
-.byte 0x83
-.byte 0x34
-.byte 0xc
-.byte 0x65
-.byte 0x89
-.byte 0x52
-.byte 0xbd
-.byte 0x1f
diff --git a/src/util/fipstools/fipscommon/const.go b/src/util/fipstools/fipscommon/const.go
index 5693414..f4c0b75 100644
--- a/src/util/fipstools/fipscommon/const.go
+++ b/src/util/fipstools/fipscommon/const.go
@@ -17,6 +17,6 @@
 // UninitHashValue is the default hash value that we inject into the module.
 // This value need only be distinct, i.e. so that we can safely
 // search-and-replace it in an object file.
-var UninitHashValue = [64]byte{
-	0xae, 0x2c, 0xea, 0x2a, 0xbd, 0xa6, 0xf3, 0xec, 0x97, 0x7f, 0x9b, 0xf6, 0x94, 0x9a, 0xfc, 0x83, 0x68, 0x27, 0xcb, 0xa0, 0xa0, 0x9f, 0x6b, 0x6f, 0xde, 0x52, 0xcd, 0xe2, 0xcd, 0xff, 0x31, 0x80, 0xa2, 0xd4, 0xc3, 0x66, 0x0f, 0xc2, 0x6a, 0x7b, 0xf4, 0xbe, 0x39, 0xa2, 0xd7, 0x25, 0xdb, 0x21, 0x98, 0xe9, 0xd5, 0x53, 0xbf, 0x5c, 0x32, 0x06, 0x83, 0x34, 0x0c, 0x65, 0x89, 0x52, 0xbd, 0x1f,
+var UninitHashValue = [32]byte{
+	0xae, 0x2c, 0xea, 0x2a, 0xbd, 0xa6, 0xf3, 0xec, 0x97, 0x7f, 0x9b, 0xf6, 0x94, 0x9a, 0xfc, 0x83, 0x68, 0x27, 0xcb, 0xa0, 0xa0, 0x9f, 0x6b, 0x6f, 0xde, 0x52, 0xcd, 0xe2, 0xcd, 0xff, 0x31, 0x80,
 }
diff --git a/src/util/fipstools/inject_hash/inject_hash.go b/src/util/fipstools/inject_hash/inject_hash.go
index dbd5fb7..6f14982 100644
--- a/src/util/fipstools/inject_hash/inject_hash.go
+++ b/src/util/fipstools/inject_hash/inject_hash.go
@@ -21,7 +21,6 @@
 	"bytes"
 	"crypto/hmac"
 	"crypto/sha256"
-	"crypto/sha512"
 	"debug/elf"
 	"encoding/binary"
 	"errors"
@@ -36,7 +35,7 @@
 	"boringssl.googlesource.com/boringssl/util/fipstools/fipscommon"
 )
 
-func do(outPath, oInput string, arInput string, useSHA256 bool) error {
+func do(outPath, oInput string, arInput string) error {
 	var objectBytes []byte
 	var isStatic bool
 	var perm os.FileMode
@@ -216,11 +215,7 @@
 	}
 
 	var zeroKey [64]byte
-	hashFunc := sha512.New
-	if useSHA256 {
-		hashFunc = sha256.New
-	}
-	mac := hmac.New(hashFunc, zeroKey[:])
+	mac := hmac.New(sha256.New, zeroKey[:])
 
 	if moduleROData != nil {
 		var lengthBytes [8]byte
@@ -257,11 +252,10 @@
 	arInput := flag.String("in-archive", "", "Path to a .a file")
 	oInput := flag.String("in-object", "", "Path to a .o file")
 	outPath := flag.String("o", "", "Path to output object")
-	sha256 := flag.Bool("sha256", false, "Whether to use SHA-256 over SHA-512. This must match what the compiled module expects.")
 
 	flag.Parse()
 
-	if err := do(*outPath, *oInput, *arInput, *sha256); err != nil {
+	if err := do(*outPath, *oInput, *arInput); err != nil {
 		fmt.Fprintf(os.Stderr, "%s\n", err)
 		os.Exit(1)
 	}
diff --git a/src/util/fipstools/test-break-kat.sh b/src/util/fipstools/test-break-kat.sh
new file mode 100644
index 0000000..141e73f
--- /dev/null
+++ b/src/util/fipstools/test-break-kat.sh
@@ -0,0 +1,41 @@
+# Copyright (c) 2022, Google Inc.
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+# This script attempts to break each of the known KATs and checks that doing so
+# seems to work and at least mentions the correct KAT in the output.
+
+set -x
+set -e
+
+TEST_FIPS_BIN="build/util/fipstools/test_fips"
+
+if [ ! -f $TEST_FIPS_BIN ]; then
+  echo "$TEST_FIPS_BIN is missing. Run this script from the top level of a"
+  echo "BoringSSL checkout and ensure that ./build-fips-break-test-binaries.sh"
+  echo "has been run first."
+  exit 1
+fi
+
+KATS=$(go run util/fipstools/break-kat.go --list-tests)
+
+for kat in $KATS; do
+  go run util/fipstools/break-kat.go $TEST_FIPS_BIN $kat > break-kat-bin
+  chmod u+x ./break-kat-bin
+  if ! (./break-kat-bin 2>&1 >/dev/null || true) | \
+       egrep -q "^$kat[^a-zA-Z0-9]"; then
+    echo "Failure for $kat did not mention that name in the output"
+    exit 1
+  fi
+  rm ./break-kat-bin
+done
diff --git a/src/util/fipstools/cavp/test_fips.c b/src/util/fipstools/test_fips.c
similarity index 96%
rename from src/util/fipstools/cavp/test_fips.c
rename to src/util/fipstools/test_fips.c
index dd82d65..42ed96b 100644
--- a/src/util/fipstools/cavp/test_fips.c
+++ b/src/util/fipstools/test_fips.c
@@ -21,6 +21,7 @@
 #include <openssl/aes.h>
 #include <openssl/bn.h>
 #include <openssl/crypto.h>
+#include <openssl/ctrdrbg.h>
 #include <openssl/des.h>
 #include <openssl/dh.h>
 #include <openssl/ecdsa.h>
@@ -30,9 +31,9 @@
 #include <openssl/rsa.h>
 #include <openssl/sha.h>
 
-#include "../crypto/fipsmodule/rand/internal.h"
-#include "../crypto/fipsmodule/tls/internal.h"
-#include "../crypto/internal.h"
+#include "../../crypto/fipsmodule/rand/internal.h"
+#include "../../crypto/fipsmodule/tls/internal.h"
+#include "../../crypto/internal.h"
 
 
 static void hexdump(const void *a, size_t len) {
@@ -47,6 +48,13 @@
 int main(int argc, char **argv) {
   CRYPTO_library_init();
 
+  const uint32_t module_version = FIPS_version();
+  if (module_version == 0) {
+    printf("No module version set\n");
+    goto err;
+  }
+  printf("Module version: %" PRIu32 "\n", module_version);
+
   static const uint8_t kAESKey[16] = "BoringCrypto Key";
   static const uint8_t kPlaintext[64] =
       "BoringCryptoModule FIPS KAT Encryption and Decryption Plaintext!";
diff --git a/src/util/generate_build_files.py b/src/util/generate_build_files.py
index 5cc2de4..186fb59 100644
--- a/src/util/generate_build_files.py
+++ b/src/util/generate_build_files.py
@@ -26,15 +26,15 @@
 # OS_ARCH_COMBOS maps from OS and platform to the OpenSSL assembly "style" for
 # that platform and the extension used by asm files.
 OS_ARCH_COMBOS = [
-    ('ios', 'arm', 'ios32', [], 'S'),
-    ('ios', 'aarch64', 'ios64', [], 'S'),
+    ('apple', 'arm', 'ios32', [], 'S'),
+    ('apple', 'aarch64', 'ios64', [], 'S'),
+    ('apple', 'x86', 'macosx', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'),
+    ('apple', 'x86_64', 'macosx', [], 'S'),
     ('linux', 'arm', 'linux32', [], 'S'),
     ('linux', 'aarch64', 'linux64', [], 'S'),
     ('linux', 'ppc64le', 'linux64le', [], 'S'),
     ('linux', 'x86', 'elf', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'),
     ('linux', 'x86_64', 'elf', [], 'S'),
-    ('mac', 'x86', 'macosx', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'),
-    ('mac', 'x86_64', 'macosx', [], 'S'),
     ('win', 'x86', 'win32n', ['-DOPENSSL_IA32_SSE2'], 'asm'),
     ('win', 'x86_64', 'nasm', [], 'asm'),
     ('win', 'aarch64', 'win64', [], 'S'),
@@ -437,7 +437,7 @@
 endif()
 
 if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
   if(APPLE)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
   endif()
@@ -586,12 +586,8 @@
             asm_files)
 
       cmake.write(
-R'''if(APPLE AND ARCH STREQUAL "aarch64")
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_aarch64_SOURCES})
-elseif(APPLE AND ARCH STREQUAL "arm")
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_arm_SOURCES})
-elseif(APPLE)
-  set(CRYPTO_ARCH_SOURCES ${CRYPTO_mac_${ARCH}_SOURCES})
+R'''if(APPLE)
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_${ARCH}_SOURCES})
 elseif(UNIX)
   set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES})
 elseif(WIN32)
diff --git a/src/util/whitespace.txt b/src/util/whitespace.txt
index c311da3..08ccc0a 100644
--- a/src/util/whitespace.txt
+++ b/src/util/whitespace.txt
@@ -1 +1 @@
-This file is ignored.  It exists to make no-op commits to trigger new builds.
+This file is ignored. It exists to make no-op commits to trigger new builds.
diff --git a/win-aarch64/crypto/chacha/chacha-armv8.S b/win-aarch64/crypto/chacha/chacha-armv8.S
index ef06f9b..1e4947a 100644
--- a/win-aarch64/crypto/chacha/chacha-armv8.S
+++ b/win-aarch64/crypto/chacha/chacha-armv8.S
@@ -68,7 +68,7 @@
 	ldp	x24,x25,[x3]		// load key
 	ldp	x26,x27,[x3,#16]
 	ldp	x28,x30,[x4]		// load counter
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x24,x24,#32
 	ror	x25,x25,#32
 	ror	x26,x26,#32
@@ -229,7 +229,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -286,7 +286,7 @@
 	add	x15,x15,x16,lsl#32
 	add	x17,x17,x19,lsl#32
 	add	x20,x20,x21,lsl#32
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -354,7 +354,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -652,7 +652,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -732,7 +732,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -852,7 +852,7 @@
 	ldp	x28,x30,[x4]		// load counter
 	ld1	{v27.4s},[x4]
 	ld1	{v31.4s},[x5]
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev64	v24.4s,v24.4s
 	ror	x24,x24,#32
 	ror	x25,x25,#32
@@ -1365,7 +1365,7 @@
 	add	x20,x20,x21,lsl#32
 	ldp	x19,x21,[x1,#48]
 	add	x1,x1,#64
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
@@ -1879,7 +1879,7 @@
 	add	x1,x1,#64
 	add	v21.4s,v21.4s,v25.4s
 
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	rev	x5,x5
 	rev	x7,x7
 	rev	x9,x9
diff --git a/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
new file mode 100644
index 0000000..9f30332
--- /dev/null
+++ b/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S
@@ -0,0 +1,3025 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include <openssl/arm_arch.h>
+.section	.rodata
+
+.align	7
+Lchacha20_consts:
+.byte	'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k'
+Linc:
+.long	1,2,3,4
+Lrol8:
+.byte	3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14
+Lclamp:
+.quad	0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC
+
+.text
+
+.def Lpoly_hash_ad_internal
+   .type 32
+.endef
+.align	6
+Lpoly_hash_ad_internal:
+.cfi_startproc
+	cbnz	x4, Lpoly_hash_intro
+	ret
+
+Lpoly_hash_intro:
+	cmp	x4, #16
+	b.lt	Lpoly_hash_ad_tail
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	Lpoly_hash_ad_internal
+
+Lpoly_hash_ad_tail:
+	cbz	x4, Lpoly_hash_ad_ret
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the AAD
+	sub	x4, x4, #1
+
+Lpoly_hash_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, x4]
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.ge	Lpoly_hash_tail_16_compose
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lpoly_hash_ad_ret:
+	ret
+.cfi_endproc
+
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_seal(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *seal_data);
+//
+.globl	chacha20_poly1305_seal
+
+.def chacha20_poly1305_seal
+   .type 32
+.endef
+.align	6
+chacha20_poly1305_seal:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, Lchacha20_consts
+	add	x11, x11, :lo12:Lchacha20_consts
+
+	ld1	{v24.16b - v27.16b}, [x11] // Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	ldr	x12, [x5, #56]   // The total cipher text length includes extra_in_len
+	add	x12, x12, x2
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x12
+
+	cmp	x2, #128
+	b.le	Lseal_128 // Optimization for smaller buffers
+
+    // Initially we prepare 5 ChaCha20 blocks. Four to encrypt up to 4 blocks (256 bytes) of plaintext,
+    // and one for the Poly1305 R and S keys. The first four blocks (A0-A3..D0-D3) are computed vertically,
+    // the fifth block (A4-D4) horizontally.
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	sub	x5, x5, #32
+
+	mov	x6, #10
+
+.align	5
+Lseal_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lseal_init_rounds
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #4
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	and	v4.16b, v4.16b, v27.16b
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	mov	x16, v4.d[0] // Move the R key to GPRs
+	mov	x17, v4.d[1]
+	mov	v27.16b, v9.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+	mov	x3, x0
+	cmp	x2, #256
+	b.le	Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #256
+
+	mov	x6, #4 // In the first run of the loop we need to hash 256 bytes, therefore we hash one block for the first 4 rounds
+	mov	x7, #6 // and two blocks for the remaining 6, for a total of (1 * 4 + 2 * 6) * 16 = 256
+
+Lseal_main_loop:
+	adrp	x11, Lchacha20_consts
+	add	x11, x11, :lo12:Lchacha20_consts
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	sub	x5, x5, #32
+.align	5
+Lseal_main_loop_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x6, x6, #1
+	b.ge	Lseal_main_loop_rounds
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	subs	x7, x7, #1
+	b.gt	Lseal_main_loop_rounds
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+	cmp	x2, #320
+	b.le	Lseal_tail
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #320
+
+	mov	x6, #0
+	mov	x7, #10 // For the remainder of the loop we always hash and encrypt 320 bytes per iteration
+
+	b	Lseal_main_loop
+
+Lseal_tail:
+    // This part of the function handles the storage and authentication of the last [0,320) bytes
+    // We assume A0-A4 ... D0-D4 hold at least inl (320 max) bytes of the stream data.
+	cmp	x2, #64
+	b.lt	Lseal_tail_64
+
+    // Store and authenticate 64B blocks per iteration
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+    // Shift the state left by 64 bytes for the next iteration of the loop
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+	mov	v1.16b, v2.16b
+	mov	v6.16b, v7.16b
+	mov	v11.16b, v12.16b
+	mov	v16.16b, v17.16b
+
+	mov	v2.16b, v3.16b
+	mov	v7.16b, v8.16b
+	mov	v12.16b, v13.16b
+	mov	v17.16b, v18.16b
+
+	mov	v3.16b, v4.16b
+	mov	v8.16b, v9.16b
+	mov	v13.16b, v14.16b
+	mov	v18.16b, v19.16b
+
+	b	Lseal_tail
+
+Lseal_tail_64:
+	ldp	x3, x4, [x5, #48] // extra_in_len and extra_in_ptr
+
+    // Here we handle the last [0,64) bytes of plaintext
+	cmp	x2, #16
+	b.lt	Lseal_tail_16
+    // Each iteration encrypt and authenticate a 16B block
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	st1	{v20.16b}, [x0], #16
+
+	sub	x2, x2, #16
+
+    // Shift the state left by 16 bytes for the next iteration of the loop
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+
+	b	Lseal_tail_64
+
+Lseal_tail_16:
+    // Here we handle the last [0,16) bytes of ciphertext that require a padded block
+	cbz	x2, Lseal_hash_extra
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the plaintext/extra in
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask that will only mask the ciphertext bytes
+	not	v22.16b, v20.16b
+
+	mov	x6, x2
+	add	x1, x1, x2
+
+	cbz	x4, Lseal_tail_16_compose // No extra data to pad with, zero padding
+
+	mov	x7, #16          // We need to load some extra_in first for padding
+	sub	x7, x7, x2
+	cmp	x4, x7
+	csel	x7, x4, x7, lt // Load the minimum of extra_in_len and the amount needed to fill the register
+	mov	x12, x7
+	add	x3, x3, x7
+	sub	x4, x4, x7
+
+Lseal_tail16_compose_extra_in:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x7, x7, #1
+	b.gt	Lseal_tail16_compose_extra_in
+
+	add	x3, x3, x12
+
+Lseal_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x1, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	Lseal_tail_16_compose
+
+	and	v0.16b, v0.16b, v21.16b
+	eor	v20.16b, v20.16b, v0.16b
+	mov	v21.16b, v20.16b
+
+Lseal_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	Lseal_tail_16_store
+
+    // Hash in the final ct block concatenated with extra_in
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lseal_hash_extra:
+	cbz	x4, Lseal_finalize
+
+Lseal_hash_extra_loop:
+	cmp	x4, #16
+	b.lt	Lseal_hash_extra_tail
+	ld1	{v20.16b}, [x3], #16
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #16
+	b	Lseal_hash_extra_loop
+
+Lseal_hash_extra_tail:
+	cbz	x4, Lseal_finalize
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the remaining extra ciphertext
+	add	x3, x3, x4
+
+Lseal_hash_extra_load:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x3, #-1]!
+	mov	v20.b[0], w11
+	subs	x4, x4, #1
+	b.gt	Lseal_hash_extra_load
+
+    // Hash in the final padded extra_in blcok
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+Lseal_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+Lseal_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+Lseal_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lseal_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+    // Only the first 32 bytes of the third block (counter = 0) are needed,
+    // so skip updating v12 and v17.
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+	b	Lseal_tail
+.cfi_endproc
+
+
+/////////////////////////////////
+//
+// void chacha20_poly1305_open(uint8_t *pt, uint8_t *ct, size_t len_in, uint8_t *ad, size_t len_ad, union open_data *aead_data);
+//
+.globl	chacha20_poly1305_open
+
+.def chacha20_poly1305_open
+   .type 32
+.endef
+.align	6
+chacha20_poly1305_open:
+	AARCH64_SIGN_LINK_REGISTER
+.cfi_startproc
+	stp	x29, x30, [sp, #-80]!
+.cfi_def_cfa_offset	80
+.cfi_offset	w30, -72
+.cfi_offset	w29, -80
+	mov	x29, sp
+    // We probably could do .cfi_def_cfa w29, 80 at this point, but since
+    // we don't actually use the frame pointer like that, it's probably not
+    // worth bothering.
+	stp	d8, d9, [sp, #16]
+	stp	d10, d11, [sp, #32]
+	stp	d12, d13, [sp, #48]
+	stp	d14, d15, [sp, #64]
+.cfi_offset	b15, -8
+.cfi_offset	b14, -16
+.cfi_offset	b13, -24
+.cfi_offset	b12, -32
+.cfi_offset	b11, -40
+.cfi_offset	b10, -48
+.cfi_offset	b9, -56
+.cfi_offset	b8, -64
+
+	adrp	x11, Lchacha20_consts
+	add	x11, x11, :lo12:Lchacha20_consts
+
+	ld1	{v24.16b - v27.16b}, [x11] // Load the CONSTS, INC, ROL8 and CLAMP values
+	ld1	{v28.16b - v30.16b}, [x5]
+
+	mov	x15, #1 // Prepare the Poly1305 state
+	mov	x8, #0
+	mov	x9, #0
+	mov	x10, #0
+
+	mov	v31.d[0], x4  // Store the input and aad lengths
+	mov	v31.d[1], x2
+
+	cmp	x2, #128
+	b.le	Lopen_128 // Optimization for smaller buffers
+
+    // Initially we prepare a single ChaCha20 block for the Poly1305 R and S keys
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+
+	mov	x6, #10
+
+.align	5
+Lopen_init_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lopen_init_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+
+	and	v0.16b, v0.16b, v27.16b
+	mov	x16, v0.d[0] // Move the R key to GPRs
+	mov	x17, v0.d[1]
+	mov	v27.16b, v5.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+Lopen_ad_done:
+	mov	x3, x1
+
+// Each iteration of the loop hash 320 bytes, and prepare stream for 320 bytes
+Lopen_main_loop:
+
+	cmp	x2, #192
+	b.lt	Lopen_tail
+
+	adrp	x11, Lchacha20_consts
+	add	x11, x11, :lo12:Lchacha20_consts
+
+	ld4r	{v0.4s,v1.4s,v2.4s,v3.4s}, [x11]
+	mov	v4.16b, v24.16b
+
+	ld4r	{v5.4s,v6.4s,v7.4s,v8.4s}, [x5], #16
+	mov	v9.16b, v28.16b
+
+	ld4r	{v10.4s,v11.4s,v12.4s,v13.4s}, [x5], #16
+	mov	v14.16b, v29.16b
+
+	ld4r	{v15.4s,v16.4s,v17.4s,v18.4s}, [x5]
+	sub	x5, x5, #32
+	add	v15.4s, v15.4s, v25.4s
+	mov	v19.16b, v30.16b
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash, will always be at least 12
+	sub	x4, x4, #10
+
+	mov	x7, #10
+	subs	x6, x7, x4
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 320 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are full
+
+	cbz	x7, Lopen_main_loop_rounds_short
+
+.align	5
+Lopen_main_loop_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+Lopen_main_loop_rounds_short:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v18.8h, v18.8h
+	rev32	v19.8h, v19.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	eor	v8.16b, v8.16b, v13.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v9.4s, #20
+	sli	v8.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	add	v3.4s, v3.4s, v7.4s
+	add	v4.4s, v4.4s, v8.4s
+
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	eor	v18.16b, v18.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	add	v13.4s, v13.4s, v18.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v14.16b
+
+	ushr	v9.4s, v8.4s, #25
+	sli	v9.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #4
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #12
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	add	v0.4s, v0.4s, v6.4s
+	add	v1.4s, v1.4s, v7.4s
+	add	v2.4s, v2.4s, v8.4s
+	add	v3.4s, v3.4s, v5.4s
+	add	v4.4s, v4.4s, v9.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	rev32	v18.8h, v18.8h
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+	rev32	v19.8h, v19.8h
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v6.16b, v6.16b, v12.16b
+	eor	v7.16b, v7.16b, v13.16b
+	eor	v8.16b, v8.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v9.16b, v9.16b, v14.16b
+
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+	ushr	v7.4s, v8.4s, #20
+	sli	v7.4s, v8.4s, #12
+	ushr	v8.4s, v5.4s, #20
+	sli	v8.4s, v5.4s, #12
+	ushr	v5.4s, v9.4s, #20
+	sli	v5.4s, v9.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	add	v3.4s, v3.4s, v8.4s
+	add	v4.4s, v4.4s, v5.4s
+
+	eor	v18.16b, v18.16b, v0.16b
+	eor	v15.16b, v15.16b, v1.16b
+	eor	v16.16b, v16.16b, v2.16b
+	eor	v17.16b, v17.16b, v3.16b
+	eor	v19.16b, v19.16b, v4.16b
+
+	tbl	v18.16b, {v18.16b}, v26.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+	tbl	v19.16b, {v19.16b}, v26.16b
+
+	add	v12.4s, v12.4s, v18.4s
+	add	v13.4s, v13.4s, v15.4s
+	add	v10.4s, v10.4s, v16.4s
+	add	v11.4s, v11.4s, v17.4s
+	add	v14.4s, v14.4s, v19.4s
+
+	eor	v20.16b, v20.16b, v12.16b
+	eor	v6.16b, v6.16b, v13.16b
+	eor	v7.16b, v7.16b, v10.16b
+	eor	v8.16b, v8.16b, v11.16b
+	eor	v5.16b, v5.16b, v14.16b
+
+	ushr	v9.4s, v5.4s, #25
+	sli	v9.4s, v5.4s, #7
+	ushr	v5.4s, v8.4s, #25
+	sli	v5.4s, v8.4s, #7
+	ushr	v8.4s, v7.4s, #25
+	sli	v8.4s, v7.4s, #7
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+
+	ext	v9.16b, v9.16b, v9.16b, #12
+	ext	v14.16b, v14.16b, v14.16b, #8
+	ext	v19.16b, v19.16b, v19.16b, #4
+	subs	x7, x7, #1
+	b.gt	Lopen_main_loop_rounds
+	subs	x6, x6, #1
+	b.ge	Lopen_main_loop_rounds_short
+
+	eor	v20.16b, v20.16b, v20.16b //zero
+	not	v21.16b, v20.16b // -1
+	sub	v21.4s, v25.4s, v21.4s // Add +1
+	ext	v20.16b, v21.16b, v20.16b, #12 // Get the last element (counter)
+	add	v19.4s, v19.4s, v20.4s
+
+	add	v15.4s, v15.4s, v25.4s
+	mov	x11, #5
+	dup	v20.4s, w11
+	add	v25.4s, v25.4s, v20.4s
+
+	zip1	v20.4s, v0.4s, v1.4s
+	zip2	v21.4s, v0.4s, v1.4s
+	zip1	v22.4s, v2.4s, v3.4s
+	zip2	v23.4s, v2.4s, v3.4s
+
+	zip1	v0.2d, v20.2d, v22.2d
+	zip2	v1.2d, v20.2d, v22.2d
+	zip1	v2.2d, v21.2d, v23.2d
+	zip2	v3.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v5.4s, v6.4s
+	zip2	v21.4s, v5.4s, v6.4s
+	zip1	v22.4s, v7.4s, v8.4s
+	zip2	v23.4s, v7.4s, v8.4s
+
+	zip1	v5.2d, v20.2d, v22.2d
+	zip2	v6.2d, v20.2d, v22.2d
+	zip1	v7.2d, v21.2d, v23.2d
+	zip2	v8.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v10.4s, v11.4s
+	zip2	v21.4s, v10.4s, v11.4s
+	zip1	v22.4s, v12.4s, v13.4s
+	zip2	v23.4s, v12.4s, v13.4s
+
+	zip1	v10.2d, v20.2d, v22.2d
+	zip2	v11.2d, v20.2d, v22.2d
+	zip1	v12.2d, v21.2d, v23.2d
+	zip2	v13.2d, v21.2d, v23.2d
+
+	zip1	v20.4s, v15.4s, v16.4s
+	zip2	v21.4s, v15.4s, v16.4s
+	zip1	v22.4s, v17.4s, v18.4s
+	zip2	v23.4s, v17.4s, v18.4s
+
+	zip1	v15.2d, v20.2d, v22.2d
+	zip2	v16.2d, v20.2d, v22.2d
+	zip1	v17.2d, v21.2d, v23.2d
+	zip2	v18.2d, v21.2d, v23.2d
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+
+	add	v1.4s, v1.4s, v24.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	add	v2.4s, v2.4s, v24.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v3.4s, v3.4s, v24.4s
+	add	v8.4s, v8.4s, v28.4s
+	add	v13.4s, v13.4s, v29.4s
+	add	v18.4s, v18.4s, v30.4s
+
+	add	v4.4s, v4.4s, v24.4s
+	add	v9.4s, v9.4s, v28.4s
+	add	v14.4s, v14.4s, v29.4s
+	add	v19.4s, v19.4s, v30.4s
+
+    // We can always safely store 192 bytes
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #192
+
+	mov	v0.16b, v3.16b
+	mov	v5.16b, v8.16b
+	mov	v10.16b, v13.16b
+	mov	v15.16b, v18.16b
+
+	cmp	x2, #64
+	b.lt	Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v3.16b
+	eor	v21.16b, v21.16b, v8.16b
+	eor	v22.16b, v22.16b, v13.16b
+	eor	v23.16b, v23.16b, v18.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v4.16b
+	mov	v5.16b, v9.16b
+	mov	v10.16b, v14.16b
+	mov	v15.16b, v19.16b
+
+	cmp	x2, #64
+	b.lt	Lopen_tail_64_store
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+	eor	v20.16b, v20.16b, v4.16b
+	eor	v21.16b, v21.16b, v9.16b
+	eor	v22.16b, v22.16b, v14.16b
+	eor	v23.16b, v23.16b, v19.16b
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+	b	Lopen_main_loop
+
+Lopen_tail:
+
+	cbz	x2, Lopen_finalize
+
+	lsr	x4, x2, #4 // How many whole blocks we have to hash
+
+	cmp	x2, #64
+	b.le	Lopen_tail_64
+	cmp	x2, #128
+	b.le	Lopen_tail_128
+
+Lopen_tail_192:
+     // We need three more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	mov	v17.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v21.16b, v21.16b, v21.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v21.d[0], x15
+
+	add	v22.4s, v23.4s, v21.4s
+	add	v21.4s, v22.4s, v21.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	mov	x7, #10
+	subs	x6, x7, x4 // itr1 can be negative if we have more than 160 bytes to hash
+	csel	x7, x7, x4, le // if itr1 is zero or less, itr2 should be 10 to indicate all 10 rounds are hashing
+	sub	x4, x4, x7
+
+	cbz	x7, Lopen_tail_192_rounds_no_hash
+
+Lopen_tail_192_rounds:
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+Lopen_tail_192_rounds_no_hash:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x7, x7, #1
+	b.gt	Lopen_tail_192_rounds
+	subs	x6, x6, #1
+	b.ge	Lopen_tail_192_rounds_no_hash
+
+    // We hashed 160 bytes at most, may still have 32 bytes left
+Lopen_tail_192_hash:
+	cbz	x4, Lopen_tail_192_hash_done
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	Lopen_tail_192_hash
+
+Lopen_tail_192_hash_done:
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v12.4s, v12.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v17.4s, v17.4s, v30.4s
+
+	add	v15.4s, v15.4s, v21.4s
+	add	v16.4s, v16.4s, v23.4s
+	add	v17.4s, v17.4s, v22.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v2.16b
+	eor	v21.16b, v21.16b, v7.16b
+	eor	v22.16b, v22.16b, v12.16b
+	eor	v23.16b, v23.16b, v17.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #128
+	b	Lopen_tail_64_store
+
+Lopen_tail_128:
+     // We need two more blocks
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v15.16b, v30.16b
+	mov	v16.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	eor	v22.16b, v22.16b, v22.16b
+	ins	v23.s[0], v25.s[0]
+	ins	v22.d[0], x15
+	add	v22.4s, v22.4s, v23.4s
+
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+Lopen_tail_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	add	v1.4s, v1.4s, v6.4s
+	eor	v16.16b, v16.16b, v1.16b
+	rev32	v16.8h, v16.8h
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v6.16b, v6.16b, v11.16b
+	ushr	v20.4s, v6.4s, #20
+	sli	v20.4s, v6.4s, #12
+	add	v1.4s, v1.4s, v20.4s
+	eor	v16.16b, v16.16b, v1.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+
+	add	v11.4s, v11.4s, v16.4s
+	eor	v20.16b, v20.16b, v11.16b
+	ushr	v6.4s, v20.4s, #25
+	sli	v6.4s, v20.4s, #7
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v16.16b, v16.16b, v16.16b, #4
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_128_rounds
+	cbz	x4, Lopen_tail_128_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	Lopen_tail_128_rounds
+
+Lopen_tail_128_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v16.4s, v16.4s, v30.4s
+	add	v15.4s, v15.4s, v22.4s
+	add	v16.4s, v16.4s, v23.4s
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	eor	v20.16b, v20.16b, v1.16b
+	eor	v21.16b, v21.16b, v6.16b
+	eor	v22.16b, v22.16b, v11.16b
+	eor	v23.16b, v23.16b, v16.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+	sub	x2, x2, #64
+
+	b	Lopen_tail_64_store
+
+Lopen_tail_64:
+    // We just need a single block
+	mov	v0.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v15.16b, v30.16b
+	eor	v23.16b, v23.16b, v23.16b
+	ins	v23.s[0], v25.s[0]
+	add	v15.4s, v15.4s, v23.4s
+
+	mov	x6, #10
+	sub	x6, x6, x4
+
+Lopen_tail_64_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	eor	v15.16b, v15.16b, v0.16b
+	rev32	v15.8h, v15.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v5.16b, v5.16b, v10.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	add	v0.4s, v0.4s, v20.4s
+	eor	v15.16b, v15.16b, v0.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	eor	v20.16b, v20.16b, v10.16b
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v15.16b, v15.16b, v15.16b, #4
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_64_rounds
+	cbz	x4, Lopen_tail_64_rounds_done
+	subs	x4, x4, #1
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	b	Lopen_tail_64_rounds
+
+Lopen_tail_64_rounds_done:
+	add	v0.4s, v0.4s, v24.4s
+	add	v5.4s, v5.4s, v28.4s
+	add	v10.4s, v10.4s, v29.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v15.4s, v15.4s, v23.4s
+
+Lopen_tail_64_store:
+	cmp	x2, #16
+	b.lt	Lopen_tail_16
+
+	ld1	{v20.16b}, [x1], #16
+	eor	v20.16b, v20.16b, v0.16b
+	st1	{v20.16b}, [x0], #16
+	mov	v0.16b, v5.16b
+	mov	v5.16b, v10.16b
+	mov	v10.16b, v15.16b
+	sub	x2, x2, #16
+	b	Lopen_tail_64_store
+
+Lopen_tail_16:
+    // Here we handle the last [0,16) bytes that require a padded block
+	cbz	x2, Lopen_finalize
+
+	eor	v20.16b, v20.16b, v20.16b // Use T0 to load the ciphertext
+	eor	v21.16b, v21.16b, v21.16b // Use T1 to generate an AND mask
+	not	v22.16b, v20.16b
+
+	add	x7, x1, x2
+	mov	x6, x2
+
+Lopen_tail_16_compose:
+	ext	v20.16b, v20.16b, v20.16b, #15
+	ldrb	w11, [x7, #-1]!
+	mov	v20.b[0], w11
+	ext	v21.16b, v22.16b, v21.16b, #15
+	subs	x2, x2, #1
+	b.gt	Lopen_tail_16_compose
+
+	and	v20.16b, v20.16b, v21.16b
+    // Hash in the final padded block
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	eor	v20.16b, v20.16b, v0.16b
+
+Lopen_tail_16_store:
+	umov	w11, v20.b[0]
+	strb	w11, [x0], #1
+	ext	v20.16b, v20.16b, v20.16b, #1
+	subs	x6, x6, #1
+	b.gt	Lopen_tail_16_store
+
+Lopen_finalize:
+	mov	x11, v31.d[0]
+	mov	x12, v31.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+    // Final reduction step
+	sub	x12, xzr, x15
+	orr	x13, xzr, #3
+	subs	x11, x8, #-5
+	sbcs	x12, x9, x12
+	sbcs	x13, x10, x13
+	csel	x8, x11, x8, cs
+	csel	x9, x12, x9, cs
+	csel	x10, x13, x10, cs
+	mov	x11, v27.d[0]
+	mov	x12, v27.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+
+	stp	x8, x9, [x5]
+
+	ldp	d8, d9, [sp, #16]
+	ldp	d10, d11, [sp, #32]
+	ldp	d12, d13, [sp, #48]
+	ldp	d14, d15, [sp, #64]
+.cfi_restore	b15
+.cfi_restore	b14
+.cfi_restore	b13
+.cfi_restore	b12
+.cfi_restore	b11
+.cfi_restore	b10
+.cfi_restore	b9
+.cfi_restore	b8
+	ldp	x29, x30, [sp], 80
+.cfi_restore	w29
+.cfi_restore	w30
+.cfi_def_cfa_offset	0
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+Lopen_128:
+    // On some architectures preparing 5 blocks for small buffers is wasteful
+	eor	v25.16b, v25.16b, v25.16b
+	mov	x11, #1
+	mov	v25.s[0], w11
+	mov	v0.16b, v24.16b
+	mov	v1.16b, v24.16b
+	mov	v2.16b, v24.16b
+	mov	v5.16b, v28.16b
+	mov	v6.16b, v28.16b
+	mov	v7.16b, v28.16b
+	mov	v10.16b, v29.16b
+	mov	v11.16b, v29.16b
+	mov	v12.16b, v29.16b
+	mov	v17.16b, v30.16b
+	add	v15.4s, v17.4s, v25.4s
+	add	v16.4s, v15.4s, v25.4s
+
+	mov	x6, #10
+
+Lopen_128_rounds:
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #4
+	ext	v6.16b, v6.16b, v6.16b, #4
+	ext	v7.16b, v7.16b, v7.16b, #4
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #12
+	ext	v16.16b, v16.16b, v16.16b, #12
+	ext	v17.16b, v17.16b, v17.16b, #12
+	add	v0.4s, v0.4s, v5.4s
+	add	v1.4s, v1.4s, v6.4s
+	add	v2.4s, v2.4s, v7.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	rev32	v15.8h, v15.8h
+	rev32	v16.8h, v16.8h
+	rev32	v17.8h, v17.8h
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v5.16b, v5.16b, v10.16b
+	eor	v6.16b, v6.16b, v11.16b
+	eor	v7.16b, v7.16b, v12.16b
+	ushr	v20.4s, v5.4s, #20
+	sli	v20.4s, v5.4s, #12
+	ushr	v5.4s, v6.4s, #20
+	sli	v5.4s, v6.4s, #12
+	ushr	v6.4s, v7.4s, #20
+	sli	v6.4s, v7.4s, #12
+
+	add	v0.4s, v0.4s, v20.4s
+	add	v1.4s, v1.4s, v5.4s
+	add	v2.4s, v2.4s, v6.4s
+	eor	v15.16b, v15.16b, v0.16b
+	eor	v16.16b, v16.16b, v1.16b
+	eor	v17.16b, v17.16b, v2.16b
+	tbl	v15.16b, {v15.16b}, v26.16b
+	tbl	v16.16b, {v16.16b}, v26.16b
+	tbl	v17.16b, {v17.16b}, v26.16b
+
+	add	v10.4s, v10.4s, v15.4s
+	add	v11.4s, v11.4s, v16.4s
+	add	v12.4s, v12.4s, v17.4s
+	eor	v20.16b, v20.16b, v10.16b
+	eor	v5.16b, v5.16b, v11.16b
+	eor	v6.16b, v6.16b, v12.16b
+	ushr	v7.4s, v6.4s, #25
+	sli	v7.4s, v6.4s, #7
+	ushr	v6.4s, v5.4s, #25
+	sli	v6.4s, v5.4s, #7
+	ushr	v5.4s, v20.4s, #25
+	sli	v5.4s, v20.4s, #7
+
+	ext	v5.16b, v5.16b, v5.16b, #12
+	ext	v6.16b, v6.16b, v6.16b, #12
+	ext	v7.16b, v7.16b, v7.16b, #12
+
+	ext	v10.16b, v10.16b, v10.16b, #8
+	ext	v11.16b, v11.16b, v11.16b, #8
+	ext	v12.16b, v12.16b, v12.16b, #8
+
+	ext	v15.16b, v15.16b, v15.16b, #4
+	ext	v16.16b, v16.16b, v16.16b, #4
+	ext	v17.16b, v17.16b, v17.16b, #4
+	subs	x6, x6, #1
+	b.hi	Lopen_128_rounds
+
+	add	v0.4s, v0.4s, v24.4s
+	add	v1.4s, v1.4s, v24.4s
+	add	v2.4s, v2.4s, v24.4s
+
+	add	v5.4s, v5.4s, v28.4s
+	add	v6.4s, v6.4s, v28.4s
+	add	v7.4s, v7.4s, v28.4s
+
+	add	v10.4s, v10.4s, v29.4s
+	add	v11.4s, v11.4s, v29.4s
+
+	add	v30.4s, v30.4s, v25.4s
+	add	v15.4s, v15.4s, v30.4s
+	add	v30.4s, v30.4s, v25.4s
+	add	v16.4s, v16.4s, v30.4s
+
+	and	v2.16b, v2.16b, v27.16b
+	mov	x16, v2.d[0] // Move the R key to GPRs
+	mov	x17, v2.d[1]
+	mov	v27.16b, v7.16b // Store the S key
+
+	bl	Lpoly_hash_ad_internal
+
+Lopen_128_store:
+	cmp	x2, #64
+	b.lt	Lopen_128_store_64
+
+	ld1	{v20.16b - v23.16b}, [x1], #64
+
+	mov	x11, v20.d[0]
+	mov	x12, v20.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v21.d[0]
+	mov	x12, v21.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v22.d[0]
+	mov	x12, v22.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	mov	x11, v23.d[0]
+	mov	x12, v23.d[1]
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+
+	eor	v20.16b, v20.16b, v0.16b
+	eor	v21.16b, v21.16b, v5.16b
+	eor	v22.16b, v22.16b, v10.16b
+	eor	v23.16b, v23.16b, v15.16b
+
+	st1	{v20.16b - v23.16b}, [x0], #64
+
+	sub	x2, x2, #64
+
+	mov	v0.16b, v1.16b
+	mov	v5.16b, v6.16b
+	mov	v10.16b, v11.16b
+	mov	v15.16b, v16.16b
+
+Lopen_128_store_64:
+
+	lsr	x4, x2, #4
+	mov	x3, x1
+
+Lopen_128_hash_64:
+	cbz	x4, Lopen_tail_64_store
+	ldp	x11, x12, [x3], 16
+	adds	x8, x8, x11
+	adcs	x9, x9, x12
+	adc	x10, x10, x15
+	mul	x11, x8, x16     // [t2:t1:t0] = [acc2:acc1:acc0] * r0
+	umulh	x12, x8, x16
+	mul	x13, x9, x16
+	umulh	x14, x9, x16
+	adds	x12, x12, x13
+	mul	x13, x10, x16
+	adc	x13, x13, x14
+	mul	x14, x8, x17       // [t3:t2:t1:t0] = [acc2:acc1:acc0] * [r1:r0]
+	umulh	x8, x8, x17
+	adds	x12, x12, x14
+	mul	x14, x9, x17
+	umulh	x9, x9, x17
+	adcs	x14, x14, x8
+	mul	x10, x10, x17
+	adc	x10, x10, x9
+	adds	x13, x13, x14
+	adc	x14, x10, xzr
+	and	x10, x13, #3         // At this point acc2 is 2 bits at most (value of 3)
+	and	x8, x13, #-4
+	extr	x13, x14, x13, #2
+	adds	x8, x8, x11
+	lsr	x11, x14, #2
+	adc	x9, x14, x11        // No carry out since t0 is 61 bits and t3 is 63 bits
+	adds	x8, x8, x13
+	adcs	x9, x9, x12
+	adc	x10, x10, xzr      // At this point acc2 has the value of 4 at most
+	sub	x4, x4, #1
+	b	Lopen_128_hash_64
+.cfi_endproc
+
+#endif
+#endif  // !OPENSSL_NO_ASM
diff --git a/win-aarch64/crypto/fipsmodule/aesv8-armx64.S b/win-aarch64/crypto/fipsmodule/aesv8-armx64.S
index 9a633fb..62993f9 100644
--- a/win-aarch64/crypto/fipsmodule/aesv8-armx64.S
+++ b/win-aarch64/crypto/fipsmodule/aesv8-armx64.S
@@ -647,7 +647,7 @@
 	//
 	// [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice
 	// [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev	w8, w8
 #endif
 	add	w10, w8, #1
diff --git a/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S
index 7cba4da..ccf3761 100644
--- a/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S
+++ b/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S
@@ -124,7 +124,7 @@
 	movi	v19.16b,#0xe1
 	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
 	shl	v19.2d,v19.2d,#57
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v3.16b,v17.16b,v17.16b,#8
@@ -149,7 +149,7 @@
 	eor	v18.16b,v18.16b,v2.16b
 	eor	v0.16b,v0.16b,v18.16b
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -190,14 +190,14 @@
 	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
 	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
 	b.lo	Lodd_tail_v8		//x3 was less than 32
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ext	v7.16b,v17.16b,v17.16b,#8
@@ -229,13 +229,13 @@
 	eor	v18.16b,v0.16b,v2.16b
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v16.16b,v16.16b
 #endif
 	eor	v1.16b,v1.16b,v18.16b
 	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v17.16b,v17.16b
 #endif
 	ins	v2.d[0],v1.d[1]
@@ -285,7 +285,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 
 Ldone_v8:
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	ext	v0.16b,v0.16b,v0.16b,#8
@@ -306,7 +306,7 @@
 	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
 
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
@@ -350,7 +350,7 @@
 	eor	v16.16b,v4.16b,v0.16b
 	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
 	ext	v3.16b,v16.16b,v16.16b,#8
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v7.16b,v7.16b
@@ -433,7 +433,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d,v6.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v6.16b,v6.16b
 	rev64	v4.16b,v4.16b
@@ -485,7 +485,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d,v5.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v5.16b,v5.16b
 	rev64	v4.16b,v4.16b
 #endif
@@ -528,7 +528,7 @@
 	eor	v1.16b,v1.16b,v17.16b
 	ld1	{v4.2d},[x2]
 	eor	v1.16b,v1.16b,v18.16b
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev64	v4.16b,v4.16b
 #endif
 
@@ -568,7 +568,7 @@
 	eor	v0.16b,v0.16b,v18.16b
 	ext	v0.16b,v0.16b,v0.16b,#8
 
-#ifndef __ARMEB__
+#ifndef __AARCH64EB__
 	rev64	v0.16b,v0.16b
 #endif
 	st1	{v0.2d},[x0]		//write out Xi
diff --git a/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S
new file mode 100644
index 0000000..cfffc0d
--- /dev/null
+++ b/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S
@@ -0,0 +1,1752 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.align	5
+Lpoly:
+.quad	0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001
+LRR:	//	2^512 mod P precomputed for NIST P256 polynomial
+.quad	0x0000000000000003,0xfffffffbffffffff,0xfffffffffffffffe,0x00000004fffffffd
+Lone_mont:
+.quad	0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe
+Lone:
+.quad	1,0,0,0
+Lord:
+.quad	0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000
+LordK:
+.quad	0xccd1c8aaee00bc4f
+.byte	69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+.align	2
+
+// void	ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4],
+//					     const BN_ULONG x2[4]);
+.globl	ecp_nistz256_mul_mont
+
+.def ecp_nistz256_mul_mont
+   .type 32
+.endef
+.align	4
+ecp_nistz256_mul_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_mul_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_sqr_mont
+
+.def ecp_nistz256_sqr_mont
+   .type 32
+.endef
+.align	4
+ecp_nistz256_sqr_mont:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-32]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sqr_mont
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x29,x30,[sp],#32
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_div_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_div_by_2
+
+.def ecp_nistz256_div_by_2
+   .type 32
+.endef
+.align	4
+ecp_nistz256_div_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_div_by_2
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_mul_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_2
+
+.def ecp_nistz256_mul_by_2
+   .type 32
+.endef
+.align	4
+ecp_nistz256_mul_by_2:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_mul_by_3(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_mul_by_3
+
+.def ecp_nistz256_mul_by_3
+   .type 32
+.endef
+.align	4
+ecp_nistz256_mul_by_3:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+
+	bl	__ecp_nistz256_add_to	// ret = a+a	// 2*a
+
+	mov	x8,x4
+	mov	x9,x5
+	mov	x10,x6
+	mov	x11,x7
+
+	bl	__ecp_nistz256_add_to	// ret += a	// 2*a+a=3*a
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_sub(BN_ULONG x0[4],const BN_ULONG x1[4],
+//				        const BN_ULONG x2[4]);
+.globl	ecp_nistz256_sub
+
+.def ecp_nistz256_sub
+   .type 32
+.endef
+.align	4
+ecp_nistz256_sub:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ldp	x14,x15,[x1]
+	ldp	x16,x17,[x1,#16]
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// void	ecp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]);
+.globl	ecp_nistz256_neg
+
+.def ecp_nistz256_neg
+   .type 32
+.endef
+.align	4
+ecp_nistz256_neg:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	mov	x2,x1
+	mov	x14,xzr		// a = 0
+	mov	x15,xzr
+	mov	x16,xzr
+	mov	x17,xzr
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	bl	__ecp_nistz256_sub_from
+
+	ldp	x29,x30,[sp],#16
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+
+// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded
+// to x4-x7 and b[0] - to x3
+.def __ecp_nistz256_mul_mont
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_mul_mont:
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x11,x7,x3
+	ldr	x3,[x2,#8]		// b[1]
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adc	x19,xzr,x11
+	mov	x20,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(1+1)]	// b[1+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	ldr	x3,[x2,#8*(2+1)]	// b[2+1]
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	mul	x8,x4,x3		// lo(a[0]*b[i])
+	adcs	x15,x16,x9
+	mul	x9,x5,x3		// lo(a[1]*b[i])
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	mul	x10,x6,x3		// lo(a[2]*b[i])
+	adcs	x17,x19,x11
+	mul	x11,x7,x3		// lo(a[3]*b[i])
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts of multiplication
+	umulh	x8,x4,x3		// hi(a[0]*b[i])
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3		// hi(a[1]*b[i])
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3		// hi(a[2]*b[i])
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3		// hi(a[3]*b[i])
+	adc	x19,x19,xzr
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	lsl	x8,x14,#32
+	adcs	x16,x16,x9
+	lsr	x9,x14,#32
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	// last reduction
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adcs	x17,x19,x11
+	adc	x19,x20,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded
+// to x4-x7
+.def __ecp_nistz256_sqr_mont
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_sqr_mont:
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x2,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	lsl	x8,x14,#32
+	adcs	x1,x1,x11
+	lsr	x9,x14,#32
+	adc	x2,x2,x7
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	lsl	x8,x14,#32
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	lsr	x9,x14,#32
+	adc	x17,x11,xzr		// can't overflow
+	subs	x10,x14,x8		// "*0xffff0001"
+	sbc	x11,x14,x9
+	adds	x14,x15,x8		// +=acc[0]<<96 and omit acc[0]
+	adcs	x15,x16,x9
+	adcs	x16,x17,x10		// +=acc[0]*0xffff0001
+	adc	x17,x11,xzr		// can't overflow
+
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x2
+	adc	x19,xzr,xzr
+
+	adds	x8,x14,#1		// subs	x8,x14,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x19,xzr		// did it borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+// Note that __ecp_nistz256_add_to expects both input vectors pre-loaded to
+// x4-x7 and x8-x11. This is done because it's used in multiple
+// contexts, e.g. in multiplication by 2 and 3...
+.def __ecp_nistz256_add_to
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_add_to:
+	adds	x14,x14,x8		// ret = a+b
+	adcs	x15,x15,x9
+	adcs	x16,x16,x10
+	adcs	x17,x17,x11
+	adc	x1,xzr,xzr		// zap x1
+
+	adds	x8,x14,#1		// subs	x8,x4,#-1 // tmp = ret-modulus
+	sbcs	x9,x15,x12
+	sbcs	x10,x16,xzr
+	sbcs	x11,x17,x13
+	sbcs	xzr,x1,xzr		// did subtraction borrow?
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+.def __ecp_nistz256_sub_from
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_sub_from:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x14,x8		// ret = a-b
+	sbcs	x15,x15,x9
+	sbcs	x16,x16,x10
+	sbcs	x17,x17,x11
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+.def __ecp_nistz256_sub_morf
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_sub_morf:
+	ldp	x8,x9,[x2]
+	ldp	x10,x11,[x2,#16]
+	subs	x14,x8,x14		// ret = b-a
+	sbcs	x15,x9,x15
+	sbcs	x16,x10,x16
+	sbcs	x17,x11,x17
+	sbc	x1,xzr,xzr		// zap x1
+
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = ret+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adc	x11,x17,x13
+	cmp	x1,xzr			// did subtraction borrow?
+
+	csel	x14,x14,x8,eq	// ret = borrow ? ret+modulus : ret
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,eq
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+
+.def __ecp_nistz256_div_by_2
+   .type 32
+.endef
+.align	4
+__ecp_nistz256_div_by_2:
+	subs	x8,x14,#1		// adds	x8,x4,#-1 // tmp = a+modulus
+	adcs	x9,x15,x12
+	adcs	x10,x16,xzr
+	adcs	x11,x17,x13
+	adc	x1,xzr,xzr		// zap x1
+	tst	x14,#1		// is a even?
+
+	csel	x14,x14,x8,eq	// ret = even ? a : a+modulus
+	csel	x15,x15,x9,eq
+	csel	x16,x16,x10,eq
+	csel	x17,x17,x11,eq
+	csel	x1,xzr,x1,eq
+
+	lsr	x14,x14,#1		// ret >>= 1
+	orr	x14,x14,x15,lsl#63
+	lsr	x15,x15,#1
+	orr	x15,x15,x16,lsl#63
+	lsr	x16,x16,#1
+	orr	x16,x16,x17,lsl#63
+	lsr	x17,x17,#1
+	stp	x14,x15,[x0]
+	orr	x17,x17,x1,lsl#63
+	stp	x16,x17,[x0,#16]
+
+	ret
+
+.globl	ecp_nistz256_point_double
+
+.def ecp_nistz256_point_double
+   .type 32
+.endef
+.align	5
+ecp_nistz256_point_double:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	sub	sp,sp,#32*4
+
+Ldouble_shortcut:
+	ldp	x14,x15,[x1,#32]
+	mov	x21,x0
+	ldp	x16,x17,[x1,#48]
+	mov	x22,x1
+	ldr	x12,Lpoly+8
+	mov	x8,x14
+	ldr	x13,Lpoly+24
+	mov	x9,x15
+	ldp	x4,x5,[x22,#64]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[x22,#64+16]
+	add	x0,sp,#0
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(S, in_y);
+
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Zsqr, in_z);
+
+	ldp	x8,x9,[x22]
+	ldp	x10,x11,[x22,#16]
+	mov	x4,x14		// put Zsqr aside for p256_sub
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to	// p256_add(M, Zsqr, in_x);
+
+	add	x2,x22,#0
+	mov	x14,x4		// restore Zsqr
+	mov	x15,x5
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x16,x6
+	mov	x17,x7
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,sp,#64
+	bl	__ecp_nistz256_sub_morf	// p256_sub(Zsqr, in_x, Zsqr);
+
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(S, S);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[x22,#64]
+	ldp	x6,x7,[x22,#64+16]
+	add	x2,x22,#32
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(tmp0, in_z, in_y);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#0]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#0+16]
+	add	x0,x21,#64
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(res_z, tmp0);
+
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(tmp0, S);
+
+	ldr	x3,[sp,#64]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,x21,#32
+	bl	__ecp_nistz256_div_by_2	// p256_div_by_2(res_y, tmp0);
+
+	add	x2,sp,#64
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(M, M, Zsqr);
+
+	mov	x8,x14		// duplicate M
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	mov	x4,x14		// put M aside
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x0,sp,#32
+	bl	__ecp_nistz256_add_to
+	mov	x8,x4			// restore M
+	mov	x9,x5
+	ldr	x3,[x22]		// forward load for p256_mul_mont
+	mov	x10,x6
+	ldp	x4,x5,[sp,#0]
+	mov	x11,x7
+	ldp	x6,x7,[sp,#0+16]
+	bl	__ecp_nistz256_add_to	// p256_mul_by_3(M, M);
+
+	add	x2,x22,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, in_x);
+
+	mov	x8,x14
+	mov	x9,x15
+	ldp	x4,x5,[sp,#32]	// forward load for p256_sqr_mont
+	mov	x10,x16
+	mov	x11,x17
+	ldp	x6,x7,[sp,#32+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(tmp0, S);
+
+	add	x0,x21,#0
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(res_x, M);
+
+	add	x2,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_x, res_x, tmp0);
+
+	add	x2,sp,#0
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(S, S, res_x);
+
+	ldr	x3,[sp,#32]
+	mov	x4,x14		// copy S
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	add	x2,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S, S, M);
+
+	add	x2,x21,#32
+	add	x0,x21,#32
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, S, res_y);
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.globl	ecp_nistz256_point_add
+
+.def ecp_nistz256_point_add
+   .type 32
+.endef
+.align	5
+ecp_nistz256_point_add:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-96]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	sub	sp,sp,#32*12
+
+	ldp	x4,x5,[x2,#64]	// in2_z
+	ldp	x6,x7,[x2,#64+16]
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x25,x8,x10
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z2sqr, in2_z);
+
+	ldp	x4,x5,[x22,#64]	// in1_z
+	ldp	x6,x7,[x22,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x2,x23,#64
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, Z2sqr, in2_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x22,#64
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#32]
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x2,x22,#32
+	add	x0,sp,#320
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S1, S1, in1_y);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#352]
+	ldp	x6,x7,[sp,#352+16]
+	add	x2,x23,#32
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,sp,#320
+	ldr	x3,[sp,#192]	// forward load for p256_mul_mont
+	ldp	x4,x5,[x22]
+	ldp	x6,x7,[x22,#16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, S1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x26,x14,x16	// ~is_equal(S1,S2)
+
+	add	x2,sp,#192
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U1, in1_x, Z2sqr);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[x23]
+	ldp	x6,x7,[x23,#16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in2_x, Z1sqr);
+
+	add	x2,sp,#256
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#96
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, U1);
+
+	orr	x14,x14,x15	// see if result is zero
+	orr	x16,x16,x17
+	orr	x14,x14,x16	// ~is_equal(U1,U2)
+
+	mvn	x27,x24	// -1/0 -> 0/-1
+	mvn	x28,x25	// -1/0 -> 0/-1
+	orr	x14,x14,x27
+	orr	x14,x14,x28
+	orr	x14,x14,x26
+	cbnz	x14,Ladd_proceed	// if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2))
+
+Ladd_double:
+	mov	x1,x22
+	mov	x0,x21
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	add	sp,sp,#256	// #256 is from #32*(12-4). difference in stack frames
+	b	Ldouble_shortcut
+
+.align	4
+Ladd_proceed:
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldp	x4,x5,[sp,#96]
+	ldp	x6,x7,[sp,#96+16]
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldr	x3,[x23,#64]
+	ldp	x4,x5,[sp,#64]
+	ldp	x6,x7,[sp,#64+16]
+	add	x2,x23,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, res_z, in2_z);
+
+	ldr	x3,[sp,#96]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,sp,#96
+	add	x0,sp,#224
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[sp,#128]
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x2,sp,#128
+	add	x0,sp,#288
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, U1, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#128
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#192
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#224
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#288
+	ldr	x3,[sp,#224]		// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#320]
+	ldp	x6,x7,[sp,#320+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,sp,#224
+	add	x0,sp,#352
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S1, Hcub);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#160
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#352
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+Ladd_done:
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x27,x28,[x29,#80]
+	ldp	x29,x30,[sp],#96
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+.globl	ecp_nistz256_point_add_affine
+
+.def ecp_nistz256_point_add_affine
+   .type 32
+.endef
+.align	5
+ecp_nistz256_point_add_affine:
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-80]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	sub	sp,sp,#32*10
+
+	mov	x21,x0
+	mov	x22,x1
+	mov	x23,x2
+	ldr	x12,Lpoly+8
+	ldr	x13,Lpoly+24
+
+	ldp	x4,x5,[x1,#64]	// in1_z
+	ldp	x6,x7,[x1,#64+16]
+	orr	x8,x4,x5
+	orr	x10,x6,x7
+	orr	x24,x8,x10
+	cmp	x24,#0
+	csetm	x24,ne		// ~in1infty
+
+	ldp	x14,x15,[x2]	// in2_x
+	ldp	x16,x17,[x2,#16]
+	ldp	x8,x9,[x2,#32]	// in2_y
+	ldp	x10,x11,[x2,#48]
+	orr	x14,x14,x15
+	orr	x16,x16,x17
+	orr	x8,x8,x9
+	orr	x10,x10,x11
+	orr	x14,x14,x16
+	orr	x8,x8,x10
+	orr	x25,x14,x8
+	cmp	x25,#0
+	csetm	x25,ne		// ~in2infty
+
+	add	x0,sp,#128
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Z1sqr, in1_z);
+
+	mov	x4,x14
+	mov	x5,x15
+	mov	x6,x16
+	mov	x7,x17
+	ldr	x3,[x23]
+	add	x2,x23,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, Z1sqr, in2_x);
+
+	add	x2,x22,#0
+	ldr	x3,[x22,#64]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x0,sp,#160
+	bl	__ecp_nistz256_sub_from	// p256_sub(H, U2, in1_x);
+
+	add	x2,x22,#64
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, Z1sqr, in1_z);
+
+	ldr	x3,[x22,#64]
+	ldp	x4,x5,[sp,#160]
+	ldp	x6,x7,[sp,#160+16]
+	add	x2,x22,#64
+	add	x0,sp,#64
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_z, H, in1_z);
+
+	ldr	x3,[x23,#32]
+	ldp	x4,x5,[sp,#128]
+	ldp	x6,x7,[sp,#128+16]
+	add	x2,x23,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, S2, in2_y);
+
+	add	x2,x22,#32
+	ldp	x4,x5,[sp,#160]	// forward load for p256_sqr_mont
+	ldp	x6,x7,[sp,#160+16]
+	add	x0,sp,#192
+	bl	__ecp_nistz256_sub_from	// p256_sub(R, S2, in1_y);
+
+	add	x0,sp,#224
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Hsqr, H);
+
+	ldp	x4,x5,[sp,#192]
+	ldp	x6,x7,[sp,#192+16]
+	add	x0,sp,#288
+	bl	__ecp_nistz256_sqr_mont	// p256_sqr_mont(Rsqr, R);
+
+	ldr	x3,[sp,#160]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,sp,#160
+	add	x0,sp,#256
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(Hcub, Hsqr, H);
+
+	ldr	x3,[x22]
+	ldp	x4,x5,[sp,#224]
+	ldp	x6,x7,[sp,#224+16]
+	add	x2,x22,#0
+	add	x0,sp,#96
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(U2, in1_x, Hsqr);
+
+	mov	x8,x14
+	mov	x9,x15
+	mov	x10,x16
+	mov	x11,x17
+	add	x0,sp,#224
+	bl	__ecp_nistz256_add_to	// p256_mul_by_2(Hsqr, U2);
+
+	add	x2,sp,#288
+	add	x0,sp,#0
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_x, Rsqr, Hsqr);
+
+	add	x2,sp,#256
+	bl	__ecp_nistz256_sub_from	//  p256_sub(res_x, res_x, Hcub);
+
+	add	x2,sp,#96
+	ldr	x3,[x22,#32]	// forward load for p256_mul_mont
+	ldp	x4,x5,[sp,#256]
+	ldp	x6,x7,[sp,#256+16]
+	add	x0,sp,#32
+	bl	__ecp_nistz256_sub_morf	// p256_sub(res_y, U2, res_x);
+
+	add	x2,x22,#32
+	add	x0,sp,#128
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(S2, in1_y, Hcub);
+
+	ldr	x3,[sp,#192]
+	ldp	x4,x5,[sp,#32]
+	ldp	x6,x7,[sp,#32+16]
+	add	x2,sp,#192
+	add	x0,sp,#32
+	bl	__ecp_nistz256_mul_mont	// p256_mul_mont(res_y, res_y, R);
+
+	add	x2,sp,#128
+	bl	__ecp_nistz256_sub_from	// p256_sub(res_y, res_y, S2);
+
+	ldp	x4,x5,[sp,#0]		// res
+	ldp	x6,x7,[sp,#0+16]
+	ldp	x8,x9,[x23]		// in2
+	ldp	x10,x11,[x23,#16]
+	ldp	x14,x15,[x22,#0]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#0+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+0+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+0+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#0+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#0+48]
+	stp	x14,x15,[x21,#0]
+	stp	x16,x17,[x21,#0+16]
+	adr	x23,Lone_mont-64
+	ldp	x14,x15,[x22,#32]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#32+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	ldp	x4,x5,[sp,#0+32+32]	// res
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	ldp	x6,x7,[sp,#0+32+48]
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	ldp	x8,x9,[x23,#32+32]	// in2
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	ldp	x10,x11,[x23,#32+48]
+	stp	x14,x15,[x21,#32]
+	stp	x16,x17,[x21,#32+16]
+	ldp	x14,x15,[x22,#64]	// in1
+	cmp	x24,#0			// ~, remember?
+	ldp	x16,x17,[x22,#64+16]
+	csel	x8,x4,x8,ne
+	csel	x9,x5,x9,ne
+	csel	x10,x6,x10,ne
+	csel	x11,x7,x11,ne
+	cmp	x25,#0			// ~, remember?
+	csel	x14,x8,x14,ne
+	csel	x15,x9,x15,ne
+	csel	x16,x10,x16,ne
+	csel	x17,x11,x17,ne
+	stp	x14,x15,[x21,#64]
+	stp	x16,x17,[x21,#64+16]
+
+	add	sp,x29,#0		// destroy frame
+	ldp	x19,x20,[x29,#16]
+	ldp	x21,x22,[x29,#32]
+	ldp	x23,x24,[x29,#48]
+	ldp	x25,x26,[x29,#64]
+	ldp	x29,x30,[sp],#80
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_mul_mont(uint64_t res[4], uint64_t a[4],
+//                                uint64_t b[4]);
+.globl	ecp_nistz256_ord_mul_mont
+
+.def ecp_nistz256_ord_mul_mont
+   .type 32
+.endef
+.align	4
+ecp_nistz256_ord_mul_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,Lord
+	ldr	x3,[x2]		// bp[0]
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+
+	mul	x14,x4,x3		// a[0]*b[0]
+	umulh	x8,x4,x3
+
+	mul	x15,x5,x3		// a[1]*b[0]
+	umulh	x9,x5,x3
+
+	mul	x16,x6,x3		// a[2]*b[0]
+	umulh	x10,x6,x3
+
+	mul	x17,x7,x3		// a[3]*b[0]
+	umulh	x19,x7,x3
+
+	mul	x24,x14,x23
+
+	adds	x15,x15,x8		// accumulate high parts of multiplication
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adc	x19,x19,xzr
+	mov	x20,xzr
+	ldr	x3,[x2,#8*1]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*2]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	ldr	x3,[x2,#8*3]		// b[i]
+
+	lsl	x8,x24,#32
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	mul	x8,x4,x3
+	adc	x11,x11,xzr
+	mul	x9,x5,x3
+
+	adds	x14,x15,x10
+	mul	x10,x6,x3
+	adcs	x15,x16,x11
+	mul	x11,x7,x3
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	adds	x14,x14,x8		// accumulate low parts
+	umulh	x8,x4,x3
+	adcs	x15,x15,x9
+	umulh	x9,x5,x3
+	adcs	x16,x16,x10
+	umulh	x10,x6,x3
+	adcs	x17,x17,x11
+	umulh	x11,x7,x3
+	adc	x19,x19,xzr
+	mul	x24,x14,x23
+	adds	x15,x15,x8		// accumulate high parts
+	adcs	x16,x16,x9
+	adcs	x17,x17,x10
+	adcs	x19,x19,x11
+	adc	x20,xzr,xzr
+	lsl	x8,x24,#32		// last reduction
+	subs	x16,x16,x24
+	lsr	x9,x24,#32
+	sbcs	x17,x17,x8
+	sbcs	x19,x19,x9
+	sbc	x20,x20,xzr
+
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adcs	x17,x19,x24
+	adc	x19,x20,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x14,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x15,x15,x9,lo
+	csel	x16,x16,x10,lo
+	stp	x14,x15,[x0]
+	csel	x17,x17,x11,lo
+	stp	x16,x17,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
+//                                int rep);
+.globl	ecp_nistz256_ord_sqr_mont
+
+.def ecp_nistz256_ord_sqr_mont
+   .type 32
+.endef
+.align	4
+ecp_nistz256_ord_sqr_mont:
+	AARCH64_VALID_CALL_TARGET
+	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
+	stp	x29,x30,[sp,#-64]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+
+	adr	x23,Lord
+	ldp	x4,x5,[x1]
+	ldp	x6,x7,[x1,#16]
+
+	ldp	x12,x13,[x23,#0]
+	ldp	x21,x22,[x23,#16]
+	ldr	x23,[x23,#32]
+	b	Loop_ord_sqr
+
+.align	4
+Loop_ord_sqr:
+	sub	x2,x2,#1
+	////////////////////////////////////////////////////////////////
+	//  |  |  |  |  |  |a1*a0|  |
+	//  |  |  |  |  |a2*a0|  |  |
+	//  |  |a3*a2|a3*a0|  |  |  |
+	//  |  |  |  |a2*a1|  |  |  |
+	//  |  |  |a3*a1|  |  |  |  |
+	// *|  |  |  |  |  |  |  | 2|
+	// +|a3*a3|a2*a2|a1*a1|a0*a0|
+	//  |--+--+--+--+--+--+--+--|
+	//  |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow 
+	//
+	//  "can't overflow" below mark carrying into high part of
+	//  multiplication result, which can't overflow, because it
+	//  can never be all ones.
+
+	mul	x15,x5,x4		// a[1]*a[0]
+	umulh	x9,x5,x4
+	mul	x16,x6,x4		// a[2]*a[0]
+	umulh	x10,x6,x4
+	mul	x17,x7,x4		// a[3]*a[0]
+	umulh	x19,x7,x4
+
+	adds	x16,x16,x9		// accumulate high parts of multiplication
+	mul	x8,x6,x5		// a[2]*a[1]
+	umulh	x9,x6,x5
+	adcs	x17,x17,x10
+	mul	x10,x7,x5		// a[3]*a[1]
+	umulh	x11,x7,x5
+	adc	x19,x19,xzr		// can't overflow
+
+	mul	x20,x7,x6		// a[3]*a[2]
+	umulh	x1,x7,x6
+
+	adds	x9,x9,x10		// accumulate high parts of multiplication
+	mul	x14,x4,x4		// a[0]*a[0]
+	adc	x10,x11,xzr		// can't overflow
+
+	adds	x17,x17,x8		// accumulate low parts of multiplication
+	umulh	x4,x4,x4
+	adcs	x19,x19,x9
+	mul	x9,x5,x5		// a[1]*a[1]
+	adcs	x20,x20,x10
+	umulh	x5,x5,x5
+	adc	x1,x1,xzr		// can't overflow
+
+	adds	x15,x15,x15	// acc[1-6]*=2
+	mul	x10,x6,x6		// a[2]*a[2]
+	adcs	x16,x16,x16
+	umulh	x6,x6,x6
+	adcs	x17,x17,x17
+	mul	x11,x7,x7		// a[3]*a[3]
+	adcs	x19,x19,x19
+	umulh	x7,x7,x7
+	adcs	x20,x20,x20
+	adcs	x1,x1,x1
+	adc	x3,xzr,xzr
+
+	adds	x15,x15,x4		// +a[i]*a[i]
+	mul	x24,x14,x23
+	adcs	x16,x16,x9
+	adcs	x17,x17,x5
+	adcs	x19,x19,x10
+	adcs	x20,x20,x6
+	adcs	x1,x1,x11
+	adc	x3,x3,x7
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	mul	x24,x14,x23
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x24
+	mul	x10,x13,x24
+	umulh	x11,x13,x24
+
+	adcs	x10,x10,x9
+	adc	x11,x11,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x11
+	adcs	x16,x17,x24
+	adc	x17,xzr,x24		// can't overflow
+	mul	x11,x14,x23
+	lsl	x8,x24,#32
+	subs	x15,x15,x24
+	lsr	x9,x24,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	subs	xzr,x14,#1
+	umulh	x9,x12,x11
+	mul	x10,x13,x11
+	umulh	x24,x13,x11
+
+	adcs	x10,x10,x9
+	adc	x24,x24,xzr
+
+	adds	x14,x15,x10
+	adcs	x15,x16,x24
+	adcs	x16,x17,x11
+	adc	x17,xzr,x11		// can't overflow
+	lsl	x8,x11,#32
+	subs	x15,x15,x11
+	lsr	x9,x11,#32
+	sbcs	x16,x16,x8
+	sbc	x17,x17,x9		// can't borrow
+	adds	x14,x14,x19	// accumulate upper half
+	adcs	x15,x15,x20
+	adcs	x16,x16,x1
+	adcs	x17,x17,x3
+	adc	x19,xzr,xzr
+
+	subs	x8,x14,x12		// ret -= modulus
+	sbcs	x9,x15,x13
+	sbcs	x10,x16,x21
+	sbcs	x11,x17,x22
+	sbcs	xzr,x19,xzr
+
+	csel	x4,x14,x8,lo	// ret = borrow ? ret : ret-modulus
+	csel	x5,x15,x9,lo
+	csel	x6,x16,x10,lo
+	csel	x7,x17,x11,lo
+
+	cbnz	x2,Loop_ord_sqr
+
+	stp	x4,x5,[x0]
+	stp	x6,x7,[x0,#16]
+
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldr	x29,[sp],#64
+	ret
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w5
+
+.def ecp_nistz256_select_w5
+   .type 32
+.endef
+.align	4
+ecp_nistz256_select_w5:
+	AARCH64_VALID_CALL_TARGET
+
+    // x10 := x0
+    // w9 := 0; loop counter and incremented internal index
+	mov	x10, x0
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+	movi	v20.16b, #0
+	movi	v21.16b, #0
+
+Lselect_w5_loop:
+    // Loop 16 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v27] := Load a (3*256-bit = 6*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // continue loading ...
+	ld1	{v26.2d, v27.2d}, [x1],#32
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+	bit	v20.16b, v26.16b, v3.16b
+	bit	v21.16b, v27.16b, v3.16b
+
+    // If bit #4 is not 0 (i.e. idx_ctr < 16) loop back
+	tbz	w9, #4, Lselect_w5_loop
+
+    // Write [v16-v21] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x10],#64
+	st1	{v20.2d, v21.2d}, [x10]
+
+	ret
+
+
+
+////////////////////////////////////////////////////////////////////////
+// void ecp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index);
+.globl	ecp_nistz256_select_w7
+
+.def ecp_nistz256_select_w7
+   .type 32
+.endef
+.align	4
+ecp_nistz256_select_w7:
+	AARCH64_VALID_CALL_TARGET
+
+    // w9 := 0; loop counter and incremented internal index
+	mov	w9, #0
+
+    // [v16-v21] := 0
+	movi	v16.16b, #0
+	movi	v17.16b, #0
+	movi	v18.16b, #0
+	movi	v19.16b, #0
+
+Lselect_w7_loop:
+    // Loop 64 times.
+
+    // Increment index (loop counter); tested at the end of the loop
+	add	w9, w9, #1
+
+    // [v22-v25] := Load a (2*256-bit = 4*128-bit) table entry starting at x1
+    //  and advance x1 to point to the next entry
+	ld1	{v22.2d, v23.2d, v24.2d, v25.2d}, [x1],#64
+
+    // x11 := (w9 == w2)? All 1s : All 0s
+	cmp	w9, w2
+	csetm	x11, eq
+
+    // duplicate mask_64 into Mask (all 0s or all 1s)
+	dup	v3.2d, x11
+
+    // [v16-v19] := (Mask == all 1s)? [v22-v25] : [v16-v19]
+    // i.e., values in output registers will remain the same if w9 != w2
+	bit	v16.16b, v22.16b, v3.16b
+	bit	v17.16b, v23.16b, v3.16b
+
+	bit	v18.16b, v24.16b, v3.16b
+	bit	v19.16b, v25.16b, v3.16b
+
+    // If bit #6 is not 0 (i.e. idx_ctr < 64) loop back
+	tbz	w9, #6, Lselect_w7_loop
+
+    // Write [v16-v19] to memory at the output pointer
+	st1	{v16.2d, v17.2d, v18.2d, v19.2d}, [x0]
+
+	ret
+
+#endif
+#endif  // !OPENSSL_NO_ASM
diff --git a/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
new file mode 100644
index 0000000..0a3121f
--- /dev/null
+++ b/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S
@@ -0,0 +1,319 @@
+// This file is generated from a similarly-named Perl script in the BoringSSL
+// source tree. Do not edit by hand.
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
+#define OPENSSL_NO_ASM
+#endif
+
+#if !defined(OPENSSL_NO_ASM)
+#if defined(__aarch64__)
+#if defined(BORINGSSL_PREFIX)
+#include <boringssl_prefix_symbols_asm.h>
+#endif
+#include "openssl/arm_arch.h"
+
+.text
+.globl	beeu_mod_inverse_vartime
+
+
+.align	4
+beeu_mod_inverse_vartime:
+    // Reserve enough space for 14 8-byte registers on the stack
+    // in the first stp call for x29, x30.
+    // Then store the remaining callee-saved registers.
+    //
+    //    | x29 | x30 | x19 | x20 | ... | x27 | x28 |  x0 |  x2 |
+    //    ^                                                     ^
+    //    sp  <------------------- 112 bytes ----------------> old sp
+    //   x29 (FP)
+    //
+	AARCH64_SIGN_LINK_REGISTER
+	stp	x29,x30,[sp,#-112]!
+	add	x29,sp,#0
+	stp	x19,x20,[sp,#16]
+	stp	x21,x22,[sp,#32]
+	stp	x23,x24,[sp,#48]
+	stp	x25,x26,[sp,#64]
+	stp	x27,x28,[sp,#80]
+	stp	x0,x2,[sp,#96]
+
+    // B = b3..b0 := a
+	ldp	x25,x26,[x1]
+	ldp	x27,x28,[x1,#16]
+
+    // n3..n0 := n
+    // Note: the value of input params are changed in the following.
+	ldp	x0,x1,[x2]
+	ldp	x2,x30,[x2,#16]
+
+    // A = a3..a0 := n
+	mov	x21, x0
+	mov	x22, x1
+	mov	x23, x2
+	mov	x24, x30
+
+    // X = x4..x0 := 1
+	mov	x3, #1
+	eor	x4, x4, x4
+	eor	x5, x5, x5
+	eor	x6, x6, x6
+	eor	x7, x7, x7
+
+    // Y = y4..y0 := 0
+	eor	x8, x8, x8
+	eor	x9, x9, x9
+	eor	x10, x10, x10
+	eor	x11, x11, x11
+	eor	x12, x12, x12
+
+Lbeeu_loop:
+    // if B == 0, jump to .Lbeeu_loop_end
+	orr	x14, x25, x26
+	orr	x14, x14, x27
+
+    // reverse the bit order of x25. This is needed for clz after this macro
+	rbit	x15, x25
+
+	orr	x14, x14, x28
+	cbz	x14,Lbeeu_loop_end
+
+
+    // 0 < B < |n|,
+    // 0 < A <= |n|,
+    // (1)      X*a  ==  B   (mod |n|),
+    // (2) (-1)*Y*a  ==  A   (mod |n|)
+
+    // Now divide B by the maximum possible power of two in the
+    // integers, and divide X by the same value mod |n|.
+    // When we're done, (1) still holds.
+
+    // shift := number of trailing 0s in x25
+    // (      = number of leading 0s in x15; see the "rbit" instruction in TEST_B_ZERO)
+	clz	x13, x15
+
+    // If there is no shift, goto shift_A_Y
+	cbz	x13, Lbeeu_shift_A_Y
+
+    // Shift B right by "x13" bits
+	neg	x14, x13
+	lsr	x25, x25, x13
+	lsl	x15, x26, x14
+
+	lsr	x26, x26, x13
+	lsl	x19, x27, x14
+
+	orr	x25, x25, x15
+
+	lsr	x27, x27, x13
+	lsl	x20, x28, x14
+
+	orr	x26, x26, x19
+
+	lsr	x28, x28, x13
+
+	orr	x27, x27, x20
+
+
+    // Shift X right by "x13" bits, adding n whenever X becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+Lbeeu_shift_loop_X:
+	tbz	x3, #0, Lshift1_0
+	adds	x3, x3, x0
+	adcs	x4, x4, x1
+	adcs	x5, x5, x2
+	adcs	x6, x6, x30
+	adc	x7, x7, x14
+Lshift1_0:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x3, x4, x3, #1
+	extr	x4, x5, x4, #1
+	extr	x5, x6, x5, #1
+	extr	x6, x7, x6, #1
+	lsr	x7, x7, #1
+
+	subs	x13, x13, #1
+	bne	Lbeeu_shift_loop_X
+
+    // Note: the steps above perform the same sequence as in p256_beeu-x86_64-asm.pl
+    // with the following differences:
+    // - "x13" is set directly to the number of trailing 0s in B
+    //   (using rbit and clz instructions)
+    // - The loop is only used to call SHIFT1(X)
+    //   and x13 is decreased while executing the X loop.
+    // - SHIFT256(B, x13) is performed before right-shifting X; they are independent
+
+Lbeeu_shift_A_Y:
+    // Same for A and Y.
+    // Afterwards, (2) still holds.
+    // Reverse the bit order of x21
+    // x13 := number of trailing 0s in x21 (= number of leading 0s in x15)
+	rbit	x15, x21
+	clz	x13, x15
+
+    // If there is no shift, goto |B-A|, X+Y update
+	cbz	x13, Lbeeu_update_B_X_or_A_Y
+
+    // Shift A right by "x13" bits
+	neg	x14, x13
+	lsr	x21, x21, x13
+	lsl	x15, x22, x14
+
+	lsr	x22, x22, x13
+	lsl	x19, x23, x14
+
+	orr	x21, x21, x15
+
+	lsr	x23, x23, x13
+	lsl	x20, x24, x14
+
+	orr	x22, x22, x19
+
+	lsr	x24, x24, x13
+
+	orr	x23, x23, x20
+
+
+    // Shift Y right by "x13" bits, adding n whenever Y becomes odd.
+    // x13--;
+    // x14 := 0; needed in the addition to the most significant word in SHIFT1
+	eor	x14, x14, x14
+Lbeeu_shift_loop_Y:
+	tbz	x8, #0, Lshift1_1
+	adds	x8, x8, x0
+	adcs	x9, x9, x1
+	adcs	x10, x10, x2
+	adcs	x11, x11, x30
+	adc	x12, x12, x14
+Lshift1_1:
+    // var0 := [var1|var0]<64..1>;
+    // i.e. concatenate var1 and var0,
+    //      extract bits <64..1> from the resulting 128-bit value
+    //      and put them in var0
+	extr	x8, x9, x8, #1
+	extr	x9, x10, x9, #1
+	extr	x10, x11, x10, #1
+	extr	x11, x12, x11, #1
+	lsr	x12, x12, #1
+
+	subs	x13, x13, #1
+	bne	Lbeeu_shift_loop_Y
+
+Lbeeu_update_B_X_or_A_Y:
+    // Try T := B - A; if cs, continue with B > A (cs: carry set = no borrow)
+    // Note: this is a case of unsigned arithmetic, where T fits in 4 64-bit words
+    //       without taking a sign bit if generated. The lack of a carry would
+    //       indicate a negative result. See, for example,
+    //       https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/condition-codes-1-condition-flags-and-codes
+	subs	x14, x25, x21
+	sbcs	x15, x26, x22
+	sbcs	x19, x27, x23
+	sbcs	x20, x28, x24
+	bcs	Lbeeu_B_greater_than_A
+
+    // Else A > B =>
+    // A := A - B; Y := Y + X; goto beginning of the loop
+	subs	x21, x21, x25
+	sbcs	x22, x22, x26
+	sbcs	x23, x23, x27
+	sbcs	x24, x24, x28
+
+	adds	x8, x8, x3
+	adcs	x9, x9, x4
+	adcs	x10, x10, x5
+	adcs	x11, x11, x6
+	adc	x12, x12, x7
+	b	Lbeeu_loop
+
+Lbeeu_B_greater_than_A:
+    // Continue with B > A =>
+    // B := B - A; X := X + Y; goto beginning of the loop
+	mov	x25, x14
+	mov	x26, x15
+	mov	x27, x19
+	mov	x28, x20
+
+	adds	x3, x3, x8
+	adcs	x4, x4, x9
+	adcs	x5, x5, x10
+	adcs	x6, x6, x11
+	adc	x7, x7, x12
+	b	Lbeeu_loop
+
+Lbeeu_loop_end:
+    // The Euclid's algorithm loop ends when A == gcd(a,n);
+    // this would be 1, when a and n are co-prime (i.e. do not have a common factor).
+    // Since (-1)*Y*a == A (mod |n|), Y>0
+    // then out = -Y mod n
+
+    // Verify that A = 1 ==> (-1)*Y*a = A = 1  (mod |n|)
+    // Is A-1 == 0?
+    // If not, fail.
+	sub	x14, x21, #1
+	orr	x14, x14, x22
+	orr	x14, x14, x23
+	orr	x14, x14, x24
+	cbnz	x14, Lbeeu_err
+
+    // If Y>n ==> Y:=Y-n
+Lbeeu_reduction_loop:
+    // x_i := y_i - n_i (X is no longer needed, use it as temp)
+    // (x14 = 0 from above)
+	subs	x3, x8, x0
+	sbcs	x4, x9, x1
+	sbcs	x5, x10, x2
+	sbcs	x6, x11, x30
+	sbcs	x7, x12, x14
+
+    // If result is non-negative (i.e., cs = carry set = no borrow),
+    // y_i := x_i; goto reduce again
+    // else
+    // y_i := y_i; continue
+	csel	x8, x3, x8, cs
+	csel	x9, x4, x9, cs
+	csel	x10, x5, x10, cs
+	csel	x11, x6, x11, cs
+	csel	x12, x7, x12, cs
+	bcs	Lbeeu_reduction_loop
+
+    // Now Y < n (Y cannot be equal to n, since the inverse cannot be 0)
+    // out = -Y = n-Y
+	subs	x8, x0, x8
+	sbcs	x9, x1, x9
+	sbcs	x10, x2, x10
+	sbcs	x11, x30, x11
+
+    // Save Y in output (out (x0) was saved on the stack)
+	ldr	x3, [sp,#96]
+	stp	x8, x9, [x3]
+	stp	x10, x11, [x3,#16]
+    // return 1 (success)
+	mov	x0, #1
+	b	Lbeeu_finish
+
+Lbeeu_err:
+    // return 0 (error)
+	eor	x0, x0, x0
+
+Lbeeu_finish:
+    // Restore callee-saved registers, except x0, x2
+	add	sp,x29,#0
+	ldp	x19,x20,[sp,#16]
+	ldp	x21,x22,[sp,#32]
+	ldp	x23,x24,[sp,#48]
+	ldp	x25,x26,[sp,#64]
+	ldp	x27,x28,[sp,#80]
+	ldp	x29,x30,[sp],#112
+
+	AARCH64_VALIDATE_LINK_REGISTER
+	ret
+
+#endif
+#endif  // !OPENSSL_NO_ASM
diff --git a/win-aarch64/crypto/fipsmodule/sha1-armv8.S b/win-aarch64/crypto/fipsmodule/sha1-armv8.S
index 2a6a9dc..3c9e4e4 100644
--- a/win-aarch64/crypto/fipsmodule/sha1-armv8.S
+++ b/win-aarch64/crypto/fipsmodule/sha1-armv8.S
@@ -54,7 +54,7 @@
 	movz	w28,#0x7999
 	sub	x2,x2,#1
 	movk	w28,#0x5a82,lsl#16
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x3,x3,#32
 #else
 	rev32	x3,x3
@@ -72,7 +72,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w4	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x5,x5,#32
 #else
 	rev32	x5,x5
@@ -97,7 +97,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w6	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x7,x7,#32
 #else
 	rev32	x7,x7
@@ -122,7 +122,7 @@
 	ror	w22,w22,#2
 	add	w24,w24,w8	// future e+=X[i]
 	add	w20,w20,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x9,x9,#32
 #else
 	rev32	x9,x9
@@ -147,7 +147,7 @@
 	ror	w20,w20,#2
 	add	w22,w22,w10	// future e+=X[i]
 	add	w23,w23,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x11,x11,#32
 #else
 	rev32	x11,x11
@@ -172,7 +172,7 @@
 	ror	w23,w23,#2
 	add	w20,w20,w12	// future e+=X[i]
 	add	w21,w21,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x13,x13,#32
 #else
 	rev32	x13,x13
@@ -197,7 +197,7 @@
 	ror	w21,w21,#2
 	add	w23,w23,w14	// future e+=X[i]
 	add	w24,w24,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x15,x15,#32
 #else
 	rev32	x15,x15
@@ -222,7 +222,7 @@
 	ror	w24,w24,#2
 	add	w21,w21,w16	// future e+=X[i]
 	add	w22,w22,w25		// e+=F(b,c,d)
-#ifdef	__ARMEB__
+#ifdef	__AARCH64EB__
 	ror	x17,x17,#32
 #else
 	rev32	x17,x17
diff --git a/win-aarch64/crypto/fipsmodule/sha256-armv8.S b/win-aarch64/crypto/fipsmodule/sha256-armv8.S
index 5f233f9..15970af 100644
--- a/win-aarch64/crypto/fipsmodule/sha256-armv8.S
+++ b/win-aarch64/crypto/fipsmodule/sha256-armv8.S
@@ -13,7 +13,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -41,6 +41,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -49,7 +50,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -103,7 +104,7 @@
 	ldr	w19,[x30],#4			// *K++
 	eor	w28,w21,w22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w3,w3			// 0
 #endif
 	ror	w16,w24,#6
@@ -126,7 +127,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w4,w4			// 1
 #endif
 	ldp	w5,w6,[x1],#2*4
@@ -151,7 +152,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w5,w5			// 2
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -175,7 +176,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w6,w6			// 3
 #endif
 	ldp	w7,w8,[x1],#2*4
@@ -200,7 +201,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w7,w7			// 4
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -224,7 +225,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w8,w8			// 5
 #endif
 	ldp	w9,w10,[x1],#2*4
@@ -249,7 +250,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w9,w9			// 6
 #endif
 	add	w22,w22,w17			// h+=Sigma0(a)
@@ -273,7 +274,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w10,w10			// 7
 #endif
 	ldp	w11,w12,[x1],#2*4
@@ -298,7 +299,7 @@
 	add	w20,w20,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w20,w20,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w11,w11			// 8
 #endif
 	add	w20,w20,w17			// h+=Sigma0(a)
@@ -322,7 +323,7 @@
 	add	w27,w27,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w27,w27,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w12,w12			// 9
 #endif
 	ldp	w13,w14,[x1],#2*4
@@ -347,7 +348,7 @@
 	add	w26,w26,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w26,w26,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w13,w13			// 10
 #endif
 	add	w26,w26,w17			// h+=Sigma0(a)
@@ -371,7 +372,7 @@
 	add	w25,w25,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w25,w25,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w14,w14			// 11
 #endif
 	ldp	w15,w0,[x1],#2*4
@@ -397,7 +398,7 @@
 	add	w24,w24,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w24,w24,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w15,w15			// 12
 #endif
 	add	w24,w24,w17			// h+=Sigma0(a)
@@ -422,7 +423,7 @@
 	add	w23,w23,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w23,w23,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w0,w0			// 13
 #endif
 	ldp	w1,w2,[x1]
@@ -448,7 +449,7 @@
 	add	w22,w22,w19			// h+=Maj(a,b,c)
 	ldr	w19,[x30],#4		// *K++, w28 in next round
 	//add	w22,w22,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w1,w1			// 14
 #endif
 	ldr	w6,[sp,#12]
@@ -474,7 +475,7 @@
 	add	w21,w21,w28			// h+=Maj(a,b,c)
 	ldr	w28,[x30],#4		// *K++, w19 in next round
 	//add	w21,w21,w17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	w2,w2			// 15
 #endif
 	ldr	w7,[sp,#0]
diff --git a/win-aarch64/crypto/fipsmodule/sha512-armv8.S b/win-aarch64/crypto/fipsmodule/sha512-armv8.S
index d01304f..b2b5a7e 100644
--- a/win-aarch64/crypto/fipsmodule/sha512-armv8.S
+++ b/win-aarch64/crypto/fipsmodule/sha512-armv8.S
@@ -13,7 +13,7 @@
 #if defined(BORINGSSL_PREFIX)
 #include <boringssl_prefix_symbols_asm.h>
 #endif
-// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
 //
 // Licensed under the OpenSSL license (the "License").  You may not use
 // this file except in compliance with the License.  You can obtain a copy
@@ -41,6 +41,7 @@
 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
+// Kryo		1.92		17.4 (+30%)	11.2 (+8%)
 //
 // (*)	Software SHA256 results are of lesser relevance, presented
 //	mostly for informational purposes.
@@ -49,7 +50,7 @@
 //	on Cortex-A53 (or by 4 cycles per round).
 // (***)	Super-impressive coefficients over gcc-generated code are
 //	indication of some compiler "pathology", most notably code
-//	generated with -mgeneral-regs-only is significanty faster
+//	generated with -mgeneral-regs-only is significantly faster
 //	and the gap is only 40-90%.
 
 #ifndef	__KERNEL__
@@ -67,6 +68,17 @@
 .endef
 .align	6
 sha512_block_data_order:
+	AARCH64_VALID_CALL_TARGET
+#ifndef	__KERNEL__
+#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
+	adrp	x16,:pg_hi21_nc:OPENSSL_armcap_P
+#else
+	adrp	x16,OPENSSL_armcap_P
+#endif
+	ldr	w16,[x16,:lo12:OPENSSL_armcap_P]
+	tst	w16,#ARMV8_SHA512
+	b.ne	Lv8_entry
+#endif
 	AARCH64_SIGN_LINK_REGISTER
 	stp	x29,x30,[sp,#-128]!
 	add	x29,sp,#0
@@ -92,7 +104,7 @@
 	ldr	x19,[x30],#8			// *K++
 	eor	x28,x21,x22				// magic seed
 	str	x1,[x29,#112]
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x3,x3			// 0
 #endif
 	ror	x16,x24,#14
@@ -115,7 +127,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x4,x4			// 1
 #endif
 	ldp	x5,x6,[x1],#2*8
@@ -140,7 +152,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x5,x5			// 2
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -164,7 +176,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x6,x6			// 3
 #endif
 	ldp	x7,x8,[x1],#2*8
@@ -189,7 +201,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x7,x7			// 4
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -213,7 +225,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x8,x8			// 5
 #endif
 	ldp	x9,x10,[x1],#2*8
@@ -238,7 +250,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x9,x9			// 6
 #endif
 	add	x22,x22,x17			// h+=Sigma0(a)
@@ -262,7 +274,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x10,x10			// 7
 #endif
 	ldp	x11,x12,[x1],#2*8
@@ -287,7 +299,7 @@
 	add	x20,x20,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x20,x20,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x11,x11			// 8
 #endif
 	add	x20,x20,x17			// h+=Sigma0(a)
@@ -311,7 +323,7 @@
 	add	x27,x27,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x27,x27,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x12,x12			// 9
 #endif
 	ldp	x13,x14,[x1],#2*8
@@ -336,7 +348,7 @@
 	add	x26,x26,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x26,x26,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x13,x13			// 10
 #endif
 	add	x26,x26,x17			// h+=Sigma0(a)
@@ -360,7 +372,7 @@
 	add	x25,x25,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x25,x25,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x14,x14			// 11
 #endif
 	ldp	x15,x0,[x1],#2*8
@@ -386,7 +398,7 @@
 	add	x24,x24,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x24,x24,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x15,x15			// 12
 #endif
 	add	x24,x24,x17			// h+=Sigma0(a)
@@ -411,7 +423,7 @@
 	add	x23,x23,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x23,x23,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x0,x0			// 13
 #endif
 	ldp	x1,x2,[x1]
@@ -437,7 +449,7 @@
 	add	x22,x22,x19			// h+=Maj(a,b,c)
 	ldr	x19,[x30],#8		// *K++, x28 in next round
 	//add	x22,x22,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x1,x1			// 14
 #endif
 	ldr	x6,[sp,#24]
@@ -463,7 +475,7 @@
 	add	x21,x21,x28			// h+=Maj(a,b,c)
 	ldr	x28,[x30],#8		// *K++, x19 in next round
 	//add	x21,x21,x17			// h+=Sigma0(a)
-#ifndef	__ARMEB__
+#ifndef	__AARCH64EB__
 	rev	x2,x2			// 15
 #endif
 	ldr	x7,[sp,#0]
@@ -1081,5 +1093,528 @@
 .byte	83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 .align	2
 .align	2
+.text
+#ifndef	__KERNEL__
+.def sha512_block_armv8
+   .type 32
+.endef
+.align	6
+sha512_block_armv8:
+Lv8_entry:
+	stp	x29,x30,[sp,#-16]!
+	add	x29,sp,#0
+
+	ld1	{v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64	// load input
+	ld1	{v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
+
+	ld1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// load context
+	adrp	x3,LK512
+	add	x3,x3,:lo12:LK512
+
+	rev64	v16.16b,v16.16b
+	rev64	v17.16b,v17.16b
+	rev64	v18.16b,v18.16b
+	rev64	v19.16b,v19.16b
+	rev64	v20.16b,v20.16b
+	rev64	v21.16b,v21.16b
+	rev64	v22.16b,v22.16b
+	rev64	v23.16b,v23.16b
+	b	Loop_hw
+
+.align	4
+Loop_hw:
+	ld1	{v24.2d},[x3],#16
+	subs	x2,x2,#1
+	sub	x4,x1,#128
+	orr	v26.16b,v0.16b,v0.16b			// offload
+	orr	v27.16b,v1.16b,v1.16b
+	orr	v28.16b,v2.16b,v2.16b
+	orr	v29.16b,v3.16b,v3.16b
+	csel	x1,x1,x4,ne			// conditional rewind
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08230	//sha512su0 v16.16b,v17.16b
+	ext	v7.16b,v20.16b,v21.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678af0	//sha512su1 v16.16b,v23.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08251	//sha512su0 v17.16b,v18.16b
+	ext	v7.16b,v21.16b,v22.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678a11	//sha512su1 v17.16b,v16.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec08272	//sha512su0 v18.16b,v19.16b
+	ext	v7.16b,v22.16b,v23.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678a32	//sha512su1 v18.16b,v17.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08293	//sha512su0 v19.16b,v20.16b
+	ext	v7.16b,v23.16b,v16.16b,#8
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+.long	0xce678a53	//sha512su1 v19.16b,v18.16b,v7.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082b4	//sha512su0 v20.16b,v21.16b
+	ext	v7.16b,v16.16b,v17.16b,#8
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+.long	0xce678a74	//sha512su1 v20.16b,v19.16b,v7.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec082d5	//sha512su0 v21.16b,v22.16b
+	ext	v7.16b,v17.16b,v18.16b,#8
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+.long	0xce678a95	//sha512su1 v21.16b,v20.16b,v7.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v25.2d},[x3],#16
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xcec082f6	//sha512su0 v22.16b,v23.16b
+	ext	v7.16b,v18.16b,v19.16b,#8
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+.long	0xce678ab6	//sha512su1 v22.16b,v21.16b,v7.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v24.2d},[x3],#16
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xcec08217	//sha512su0 v23.16b,v16.16b
+	ext	v7.16b,v19.16b,v20.16b,#8
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+.long	0xce678ad7	//sha512su1 v23.16b,v22.16b,v7.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v16.2d
+	ld1	{v16.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v16.16b,v16.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v17.2d
+	ld1	{v17.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v17.16b,v17.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v18.2d
+	ld1	{v18.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v18.16b,v18.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v19.2d
+	ld1	{v19.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v2.16b,v3.16b,#8
+	ext	v6.16b,v1.16b,v2.16b,#8
+	add	v3.2d,v3.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a3	//sha512h v3.16b,v5.16b,v6.16b
+	rev64	v19.16b,v19.16b
+	add	v4.2d,v1.2d,v3.2d		// "D + T1"
+.long	0xce608423	//sha512h2 v3.16b,v1.16b,v0.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v20.2d
+	ld1	{v20.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v4.16b,v2.16b,#8
+	ext	v6.16b,v0.16b,v4.16b,#8
+	add	v2.2d,v2.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a2	//sha512h v2.16b,v5.16b,v6.16b
+	rev64	v20.16b,v20.16b
+	add	v1.2d,v0.2d,v2.2d		// "D + T1"
+.long	0xce638402	//sha512h2 v2.16b,v0.16b,v3.16b
+	ld1	{v24.2d},[x3],#16
+	add	v25.2d,v25.2d,v21.2d
+	ld1	{v21.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v1.16b,v4.16b,#8
+	ext	v6.16b,v3.16b,v1.16b,#8
+	add	v4.2d,v4.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a4	//sha512h v4.16b,v5.16b,v6.16b
+	rev64	v21.16b,v21.16b
+	add	v0.2d,v3.2d,v4.2d		// "D + T1"
+.long	0xce628464	//sha512h2 v4.16b,v3.16b,v2.16b
+	ld1	{v25.2d},[x3],#16
+	add	v24.2d,v24.2d,v22.2d
+	ld1	{v22.16b},[x1],#16		// load next input
+	ext	v24.16b,v24.16b,v24.16b,#8
+	ext	v5.16b,v0.16b,v1.16b,#8
+	ext	v6.16b,v2.16b,v0.16b,#8
+	add	v1.2d,v1.2d,v24.2d			// "T1 + H + K512[i]"
+.long	0xce6680a1	//sha512h v1.16b,v5.16b,v6.16b
+	rev64	v22.16b,v22.16b
+	add	v3.2d,v2.2d,v1.2d		// "D + T1"
+.long	0xce648441	//sha512h2 v1.16b,v2.16b,v4.16b
+	sub	x3,x3,#80*8	// rewind
+	add	v25.2d,v25.2d,v23.2d
+	ld1	{v23.16b},[x1],#16		// load next input
+	ext	v25.16b,v25.16b,v25.16b,#8
+	ext	v5.16b,v3.16b,v0.16b,#8
+	ext	v6.16b,v4.16b,v3.16b,#8
+	add	v0.2d,v0.2d,v25.2d			// "T1 + H + K512[i]"
+.long	0xce6680a0	//sha512h v0.16b,v5.16b,v6.16b
+	rev64	v23.16b,v23.16b
+	add	v2.2d,v4.2d,v0.2d		// "D + T1"
+.long	0xce618480	//sha512h2 v0.16b,v4.16b,v1.16b
+	add	v0.2d,v0.2d,v26.2d			// accumulate
+	add	v1.2d,v1.2d,v27.2d
+	add	v2.2d,v2.2d,v28.2d
+	add	v3.2d,v3.2d,v29.2d
+
+	cbnz	x2,Loop_hw
+
+	st1	{v0.2d,v1.2d,v2.2d,v3.2d},[x0]		// store context
+
+	ldr	x29,[sp],#16
+	ret
+
+#endif
 #endif
 #endif  // !OPENSSL_NO_ASM
diff --git a/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm b/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
index 68c74cc..49be6f6 100644
--- a/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
@@ -31,6 +31,8 @@
 	mov	r9d,DWORD[r11]
 	mov	r10d,DWORD[4+r11]
 	mov	r11d,DWORD[8+r11]
+	test	r11d,536870912
+	jnz	NEAR $L$shaext_shortcut
 	and	r9d,1073741824
 	and	r10d,268435968
 	or	r10d,r9d
@@ -1795,6 +1797,240 @@
 DB	111,114,103,62,0
 
 ALIGN	64
+sha256_block_data_order_shaext:
+	mov	QWORD[8+rsp],rdi	;WIN64 prologue
+	mov	QWORD[16+rsp],rsi
+	mov	rax,rsp
+$L$SEH_begin_sha256_block_data_order_shaext:
+	mov	rdi,rcx
+	mov	rsi,rdx
+	mov	rdx,r8
+
+
+
+$L$shaext_shortcut:
+	lea	rsp,[((-88))+rsp]
+	movaps	XMMWORD[(-8-80)+rax],xmm6
+	movaps	XMMWORD[(-8-64)+rax],xmm7
+	movaps	XMMWORD[(-8-48)+rax],xmm8
+	movaps	XMMWORD[(-8-32)+rax],xmm9
+	movaps	XMMWORD[(-8-16)+rax],xmm10
+$L$prologue_shaext:
+	lea	rcx,[((K256+128))]
+	movdqu	xmm1,XMMWORD[rdi]
+	movdqu	xmm2,XMMWORD[16+rdi]
+	movdqa	xmm7,XMMWORD[((512-128))+rcx]
+
+	pshufd	xmm0,xmm1,0x1b
+	pshufd	xmm1,xmm1,0xb1
+	pshufd	xmm2,xmm2,0x1b
+	movdqa	xmm8,xmm7
+DB	102,15,58,15,202,8
+	punpcklqdq	xmm2,xmm0
+	jmp	NEAR $L$oop_shaext
+
+ALIGN	16
+$L$oop_shaext:
+	movdqu	xmm3,XMMWORD[rsi]
+	movdqu	xmm4,XMMWORD[16+rsi]
+	movdqu	xmm5,XMMWORD[32+rsi]
+DB	102,15,56,0,223
+	movdqu	xmm6,XMMWORD[48+rsi]
+
+	movdqa	xmm0,XMMWORD[((0-128))+rcx]
+	paddd	xmm0,xmm3
+DB	102,15,56,0,231
+	movdqa	xmm10,xmm2
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	nop
+	movdqa	xmm9,xmm1
+DB	15,56,203,202
+
+	movdqa	xmm0,XMMWORD[((32-128))+rcx]
+	paddd	xmm0,xmm4
+DB	102,15,56,0,239
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	lea	rsi,[64+rsi]
+DB	15,56,204,220
+DB	15,56,203,202
+
+	movdqa	xmm0,XMMWORD[((64-128))+rcx]
+	paddd	xmm0,xmm5
+DB	102,15,56,0,247
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm6
+DB	102,15,58,15,253,4
+	nop
+	paddd	xmm3,xmm7
+DB	15,56,204,229
+DB	15,56,203,202
+
+	movdqa	xmm0,XMMWORD[((96-128))+rcx]
+	paddd	xmm0,xmm6
+DB	15,56,205,222
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm3
+DB	102,15,58,15,254,4
+	nop
+	paddd	xmm4,xmm7
+DB	15,56,204,238
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((128-128))+rcx]
+	paddd	xmm0,xmm3
+DB	15,56,205,227
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm4
+DB	102,15,58,15,251,4
+	nop
+	paddd	xmm5,xmm7
+DB	15,56,204,243
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((160-128))+rcx]
+	paddd	xmm0,xmm4
+DB	15,56,205,236
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm5
+DB	102,15,58,15,252,4
+	nop
+	paddd	xmm6,xmm7
+DB	15,56,204,220
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((192-128))+rcx]
+	paddd	xmm0,xmm5
+DB	15,56,205,245
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm6
+DB	102,15,58,15,253,4
+	nop
+	paddd	xmm3,xmm7
+DB	15,56,204,229
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((224-128))+rcx]
+	paddd	xmm0,xmm6
+DB	15,56,205,222
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm3
+DB	102,15,58,15,254,4
+	nop
+	paddd	xmm4,xmm7
+DB	15,56,204,238
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((256-128))+rcx]
+	paddd	xmm0,xmm3
+DB	15,56,205,227
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm4
+DB	102,15,58,15,251,4
+	nop
+	paddd	xmm5,xmm7
+DB	15,56,204,243
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((288-128))+rcx]
+	paddd	xmm0,xmm4
+DB	15,56,205,236
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm5
+DB	102,15,58,15,252,4
+	nop
+	paddd	xmm6,xmm7
+DB	15,56,204,220
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((320-128))+rcx]
+	paddd	xmm0,xmm5
+DB	15,56,205,245
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm6
+DB	102,15,58,15,253,4
+	nop
+	paddd	xmm3,xmm7
+DB	15,56,204,229
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((352-128))+rcx]
+	paddd	xmm0,xmm6
+DB	15,56,205,222
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm3
+DB	102,15,58,15,254,4
+	nop
+	paddd	xmm4,xmm7
+DB	15,56,204,238
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((384-128))+rcx]
+	paddd	xmm0,xmm3
+DB	15,56,205,227
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm4
+DB	102,15,58,15,251,4
+	nop
+	paddd	xmm5,xmm7
+DB	15,56,204,243
+DB	15,56,203,202
+	movdqa	xmm0,XMMWORD[((416-128))+rcx]
+	paddd	xmm0,xmm4
+DB	15,56,205,236
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	movdqa	xmm7,xmm5
+DB	102,15,58,15,252,4
+DB	15,56,203,202
+	paddd	xmm6,xmm7
+
+	movdqa	xmm0,XMMWORD[((448-128))+rcx]
+	paddd	xmm0,xmm5
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+DB	15,56,205,245
+	movdqa	xmm7,xmm8
+DB	15,56,203,202
+
+	movdqa	xmm0,XMMWORD[((480-128))+rcx]
+	paddd	xmm0,xmm6
+	nop
+DB	15,56,203,209
+	pshufd	xmm0,xmm0,0x0e
+	dec	rdx
+	nop
+DB	15,56,203,202
+
+	paddd	xmm2,xmm10
+	paddd	xmm1,xmm9
+	jnz	NEAR $L$oop_shaext
+
+	pshufd	xmm2,xmm2,0xb1
+	pshufd	xmm7,xmm1,0x1b
+	pshufd	xmm1,xmm1,0xb1
+	punpckhqdq	xmm1,xmm2
+DB	102,15,58,15,215,8
+
+	movdqu	XMMWORD[rdi],xmm1
+	movdqu	XMMWORD[16+rdi],xmm2
+	movaps	xmm6,XMMWORD[((-8-80))+rax]
+	movaps	xmm7,XMMWORD[((-8-64))+rax]
+	movaps	xmm8,XMMWORD[((-8-48))+rax]
+	movaps	xmm9,XMMWORD[((-8-32))+rax]
+	movaps	xmm10,XMMWORD[((-8-16))+rax]
+	mov	rsp,rax
+$L$epilogue_shaext:
+	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
+	mov	rsi,QWORD[16+rsp]
+	DB	0F3h,0C3h		;repret
+
+$L$SEH_end_sha256_block_data_order_shaext:
+
+ALIGN	64
 sha256_block_data_order_ssse3:
 	mov	QWORD[8+rsp],rdi	;WIN64 prologue
 	mov	QWORD[16+rsp],rsi
@@ -4115,11 +4351,46 @@
 	pop	rsi
 	DB	0F3h,0C3h		;repret
 
+
+ALIGN	16
+shaext_handler:
+	push	rsi
+	push	rdi
+	push	rbx
+	push	rbp
+	push	r12
+	push	r13
+	push	r14
+	push	r15
+	pushfq
+	sub	rsp,64
+
+	mov	rax,QWORD[120+r8]
+	mov	rbx,QWORD[248+r8]
+
+	lea	r10,[$L$prologue_shaext]
+	cmp	rbx,r10
+	jb	NEAR $L$in_prologue
+
+	lea	r10,[$L$epilogue_shaext]
+	cmp	rbx,r10
+	jae	NEAR $L$in_prologue
+
+	lea	rsi,[((-8-80))+rax]
+	lea	rdi,[512+r8]
+	mov	ecx,10
+	DD	0xa548f3fc
+
+	jmp	NEAR $L$in_prologue
+
 section	.pdata rdata align=4
 ALIGN	4
 	DD	$L$SEH_begin_sha256_block_data_order wrt ..imagebase
 	DD	$L$SEH_end_sha256_block_data_order wrt ..imagebase
 	DD	$L$SEH_info_sha256_block_data_order wrt ..imagebase
+	DD	$L$SEH_begin_sha256_block_data_order_shaext wrt ..imagebase
+	DD	$L$SEH_end_sha256_block_data_order_shaext wrt ..imagebase
+	DD	$L$SEH_info_sha256_block_data_order_shaext wrt ..imagebase
 	DD	$L$SEH_begin_sha256_block_data_order_ssse3 wrt ..imagebase
 	DD	$L$SEH_end_sha256_block_data_order_ssse3 wrt ..imagebase
 	DD	$L$SEH_info_sha256_block_data_order_ssse3 wrt ..imagebase
@@ -4132,6 +4403,9 @@
 DB	9,0,0,0
 	DD	se_handler wrt ..imagebase
 	DD	$L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase
+$L$SEH_info_sha256_block_data_order_shaext:
+DB	9,0,0,0
+	DD	shaext_handler wrt ..imagebase
 $L$SEH_info_sha256_block_data_order_ssse3:
 DB	9,0,0,0
 	DD	se_handler wrt ..imagebase
diff --git a/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm b/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm
index 7a1d5db..b60f662 100644
--- a/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm
+++ b/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm
@@ -2104,200 +2104,6 @@
 	DB	0F3h,0C3h		;repret
 
 
-global	bn_from_montgomery
-
-ALIGN	32
-bn_from_montgomery:
-
-	test	DWORD[48+rsp],7
-	jz	NEAR bn_from_mont8x
-	xor	eax,eax
-	DB	0F3h,0C3h		;repret
-
-
-
-
-ALIGN	32
-bn_from_mont8x:
-	mov	QWORD[8+rsp],rdi	;WIN64 prologue
-	mov	QWORD[16+rsp],rsi
-	mov	rax,rsp
-$L$SEH_begin_bn_from_mont8x:
-	mov	rdi,rcx
-	mov	rsi,rdx
-	mov	rdx,r8
-	mov	rcx,r9
-	mov	r8,QWORD[40+rsp]
-	mov	r9,QWORD[48+rsp]
-
-
-
-DB	0x67
-	mov	rax,rsp
-
-	push	rbx
-
-	push	rbp
-
-	push	r12
-
-	push	r13
-
-	push	r14
-
-	push	r15
-
-$L$from_prologue:
-
-	shl	r9d,3
-	lea	r10,[r9*2+r9]
-	neg	r9
-	mov	r8,QWORD[r8]
-
-
-
-
-
-
-
-
-	lea	r11,[((-320))+r9*2+rsp]
-	mov	rbp,rsp
-	sub	r11,rdi
-	and	r11,4095
-	cmp	r10,r11
-	jb	NEAR $L$from_sp_alt
-	sub	rbp,r11
-	lea	rbp,[((-320))+r9*2+rbp]
-	jmp	NEAR $L$from_sp_done
-
-ALIGN	32
-$L$from_sp_alt:
-	lea	r10,[((4096-320))+r9*2]
-	lea	rbp,[((-320))+r9*2+rbp]
-	sub	r11,r10
-	mov	r10,0
-	cmovc	r11,r10
-	sub	rbp,r11
-$L$from_sp_done:
-	and	rbp,-64
-	mov	r11,rsp
-	sub	r11,rbp
-	and	r11,-4096
-	lea	rsp,[rbp*1+r11]
-	mov	r10,QWORD[rsp]
-	cmp	rsp,rbp
-	ja	NEAR $L$from_page_walk
-	jmp	NEAR $L$from_page_walk_done
-
-$L$from_page_walk:
-	lea	rsp,[((-4096))+rsp]
-	mov	r10,QWORD[rsp]
-	cmp	rsp,rbp
-	ja	NEAR $L$from_page_walk
-$L$from_page_walk_done:
-
-	mov	r10,r9
-	neg	r9
-
-
-
-
-
-
-
-
-
-
-	mov	QWORD[32+rsp],r8
-	mov	QWORD[40+rsp],rax
-
-$L$from_body:
-	mov	r11,r9
-	lea	rax,[48+rsp]
-	pxor	xmm0,xmm0
-	jmp	NEAR $L$mul_by_1
-
-ALIGN	32
-$L$mul_by_1:
-	movdqu	xmm1,XMMWORD[rsi]
-	movdqu	xmm2,XMMWORD[16+rsi]
-	movdqu	xmm3,XMMWORD[32+rsi]
-	movdqa	XMMWORD[r9*1+rax],xmm0
-	movdqu	xmm4,XMMWORD[48+rsi]
-	movdqa	XMMWORD[16+r9*1+rax],xmm0
-DB	0x48,0x8d,0xb6,0x40,0x00,0x00,0x00
-	movdqa	XMMWORD[rax],xmm1
-	movdqa	XMMWORD[32+r9*1+rax],xmm0
-	movdqa	XMMWORD[16+rax],xmm2
-	movdqa	XMMWORD[48+r9*1+rax],xmm0
-	movdqa	XMMWORD[32+rax],xmm3
-	movdqa	XMMWORD[48+rax],xmm4
-	lea	rax,[64+rax]
-	sub	r11,64
-	jnz	NEAR $L$mul_by_1
-
-DB	102,72,15,110,207
-DB	102,72,15,110,209
-DB	0x67
-	mov	rbp,rcx
-DB	102,73,15,110,218
-	lea	r11,[OPENSSL_ia32cap_P]
-	mov	r11d,DWORD[8+r11]
-	and	r11d,0x80108
-	cmp	r11d,0x80108
-	jne	NEAR $L$from_mont_nox
-
-	lea	rdi,[r9*1+rax]
-	call	__bn_sqrx8x_reduction
-	call	__bn_postx4x_internal
-
-	pxor	xmm0,xmm0
-	lea	rax,[48+rsp]
-	jmp	NEAR $L$from_mont_zero
-
-ALIGN	32
-$L$from_mont_nox:
-	call	__bn_sqr8x_reduction
-	call	__bn_post4x_internal
-
-	pxor	xmm0,xmm0
-	lea	rax,[48+rsp]
-	jmp	NEAR $L$from_mont_zero
-
-ALIGN	32
-$L$from_mont_zero:
-	mov	rsi,QWORD[40+rsp]
-
-	movdqa	XMMWORD[rax],xmm0
-	movdqa	XMMWORD[16+rax],xmm0
-	movdqa	XMMWORD[32+rax],xmm0
-	movdqa	XMMWORD[48+rax],xmm0
-	lea	rax,[64+rax]
-	sub	r9,32
-	jnz	NEAR $L$from_mont_zero
-
-	mov	rax,1
-	mov	r15,QWORD[((-48))+rsi]
-
-	mov	r14,QWORD[((-40))+rsi]
-
-	mov	r13,QWORD[((-32))+rsi]
-
-	mov	r12,QWORD[((-24))+rsi]
-
-	mov	rbp,QWORD[((-16))+rsi]
-
-	mov	rbx,QWORD[((-8))+rsi]
-
-	lea	rsp,[rsi]
-
-$L$from_epilogue:
-	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
-	mov	rsi,QWORD[16+rsp]
-	DB	0F3h,0C3h		;repret
-
-$L$SEH_end_bn_from_mont8x:
 
 ALIGN	32
 bn_mulx4x_mont_gather5:
@@ -3982,10 +3788,6 @@
 	DD	$L$SEH_begin_bn_power5 wrt ..imagebase
 	DD	$L$SEH_end_bn_power5 wrt ..imagebase
 	DD	$L$SEH_info_bn_power5 wrt ..imagebase
-
-	DD	$L$SEH_begin_bn_from_mont8x wrt ..imagebase
-	DD	$L$SEH_end_bn_from_mont8x wrt ..imagebase
-	DD	$L$SEH_info_bn_from_mont8x wrt ..imagebase
 	DD	$L$SEH_begin_bn_mulx4x_mont_gather5 wrt ..imagebase
 	DD	$L$SEH_end_bn_mulx4x_mont_gather5 wrt ..imagebase
 	DD	$L$SEH_info_bn_mulx4x_mont_gather5 wrt ..imagebase
@@ -4014,11 +3816,6 @@
 	DD	mul_handler wrt ..imagebase
 	DD	$L$power5_prologue wrt ..imagebase,$L$power5_body wrt ..imagebase,$L$power5_epilogue wrt ..imagebase
 ALIGN	8
-$L$SEH_info_bn_from_mont8x:
-DB	9,0,0,0
-	DD	mul_handler wrt ..imagebase
-	DD	$L$from_prologue wrt ..imagebase,$L$from_body wrt ..imagebase,$L$from_epilogue wrt ..imagebase
-ALIGN	8
 $L$SEH_info_bn_mulx4x_mont_gather5:
 DB	9,0,0,0
 	DD	mul_handler wrt ..imagebase